OmniAICreator/Qiita-1.07M huggingface dataset:
rubyで書いたプログラムをOS Xターミナルのコマンドに追加する

###概要
　rubyで書いたプログラムをターミナルからlsやvimのようにコマンドとして呼び出すための手順メモ。洗練されてないかもしれないのでより良い手順を知っている人がいれば教えて下さい。
###説明で使用している環境
　OSX, ruby 2.1.0p0
###コマンドをエイリアスとして定義する
　まず最初にrubyファイルを実行するコマンドを.bash_profile/bashrcなどの設定ファイルにエイリアスとして追加する。エイリアスはコマンドの別名を登録するコマンドの一種で、別名とコマンドのペアで登録する(一般にコマンドの省略を意図して使われる)。rubyのスクリプトを実行する場合なら以下のように書ける。

```:.bash_profile
alias neko='ruby /Users/owl/nekoneko/cat.rb'
```
　これでbash_profileの変更を反映させれば、ターミナルにnekoと入力するだけでcat.rbが実行される。
###コード上で変更を必要とするかもしれない点
　実際に実行してみるとrubyがパス関係のエラーを吐くことがある。例えば実行したrubyコード内で同じディレクトリ上にあるファイルを相対パスでrequireしていたりFile.openしていると『cannot load such file』となる。

　原因の１つが『rubyファイルがあるディレクトリのファイルのつもり』で require './neko.rb' のように指定しているケース。この書き方はrubyファイルのディレクトリではなく、呼び出したターミナルのカレントディレクトリを参照する。

　もしrubyファイルが置かれたディレクトリを参照してrequireやFileを使いたいなら、コード内で明示的にディレクトリを参照先やカレントディレクトリとして指定する必要がある。

```ruby
$LOAD_PATH.push File.dirname(__FILE__) #requireの参照先へ追加
Dir.chdir File.dirname(__FILE__) #カレントディレクトリの移動
```
**追記**
　コメントで教えて頂いた通り、require の代わりに相対パスを指定する require_relative を使うことでも解決できる。$LOAD_PATHに追加するよりもこちらの方が綺麗かも。
PostgresSQLでDBの全テーブルのレコード数一覧を確認

お客様から本番環境のDBのダンプデータ貰ってローカル環境構築していたんだけど、本番環境と同じレコード数入ってるのか確認するときに使ったよっ
MySQLとは違いますね。

以下SQL文

```postgres
SELECT T2.relname 
     , T2.reltuples  
FROM pg_stat_user_tables AS T1 
INNER JOIN pg_class AS T2 
  ON T1.relname = T2.relname 
ORDER BY T2.relname;
```

これで結果→各テーブル名、レコード数が出力できました。
Node.js から Ruby を外部コマンド実行し、標準出力を随時受け取る

**2016/2/2 追記 : コメントを参考に追記いたしました。**

## 概要
こんにちは。アレクスです。
今回はですね。 Node.jsからrbファイルを実行して、
標準出力を受け取ることについて解説します。

長いこと中途半端に取り組み見て見ぬふりしていました問題が、
以外にもサクッ:cookie:と解決してしまいなんだか :frowning: だったのですが、
落とし穴なポイントが有りましたので、公開いたします。

今回は超初期段階です、これから複雑な実装を行いますので、
また投稿したいと思います。

## 最終目的
Rubyで作ったプログラムをElectronから実行して、標準出力を受け取って、
画面に表示させたいですね。プログレスバーに反映できれば great!ですね。

**イメージ**
Rubyで進行状況のパーセンテージ計算 => 数値を` stdout `
Node.jsで受け取り => GUIのプログレスバーデザイン部分の` width `に随時反映


## 初期段階
まずは Node.js から外部コマンドで、簡単な Ruby コードを実行してみます。
エラーもどうなるか合わせてみてみます。

```ruby:hello.rb

# coding: utf-8
Encoding.default_external = 'UTF-8'

begin

  5.times {
    print "HELLO WORLD!"
    sleep(0.5)
  }

  raise "ERROR"

rescue => ex
  print ex.class
  print ex.message
  print ex.backtrace
end

```

 Node.js は以下のように` spawn `を使います。

```js:open3.js
const spawn = require('child_process').spawn;
const ls = spawn('ruby', ['hello.rb']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});
```
[参考:Child Process Node.js v5.5.0 Manual &amp; Documentation](https://nodejs.org/api/child_process.html)


でもはじめは実行してもうまく行かなかったんですよね :crying_cat_face: 


## 原因
原因は2つありました。

- Ruby側の` stdout `は` p `でないとダメ  
` puts `でも` print `でも実験したらダメでした。  
- ちゃんとターミナルでしてなかったのでダメ  
 Sublime Text3のビルドツールでやってました。

` p `以外でやった場合は、随時ではなく全て終わってから帰ってきますね。
SublimeText3のビルドツールでrunすると以下のエラーが出ました。

```js

events.js:154
      throw er; // Unhandled 'error' event
      ^

Error: spawn ruby ENOENT
    at exports._errnoException (util.js:856:11)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:178:32)
    at onErrorNT (internal/child_process.js:344:16)
    at nextTickCallbackWith2Args (node.js:474:9)
    at process._tickCallback (node.js:388:17)
    at Function.Module.runMain (module.js:449:11)
    at startup (node.js:139:18)
    at node.js:999:3

```

以上、簡単ではございましたがご紹介でした。

## 最後に
間違いやもっと良い方法があるよ! :smiley: 
という時などぜひにコメントお願い致します。


#### [Original Post](http://arri-ba.net/devlog/2016/01/31/electron-ruby-stdout-spawn-open3/)


## 追記
ruby側の出力バッファリングをやめることにより、`puts`や`print`でも、随時出力が可能となりました。
[pine613](http://qiita.com/pine613)様ありがとうございました。

```ruby:hello.rb

# coding: utf-8
Encoding.default_external = 'UTF-8'
##
# 追記部分
STDOUT.sync = true

begin

  5.times {
    print "HELLO WORLD!"
    sleep(0.5)
  }

  raise "ERROR"

rescue => ex
  print ex.class
  print ex.message
  print ex.backtrace
end

```
Cloud9上にChainerの実行環境を作る方法

ChainerやTensorflowを試してみたいと思った時に一番初めに問題になるのが実行環境をどうするかだと思います。
すでにLinux PCやMacを持っている場合は、それほど困ることは無いのですが、
Windowsの場合はサポートされていないのでどうしたものかと途方にくれてしまいます。

その場合には以下の方法が考えられます。
１． WindowsマシンをWindowsとLinuxのDualBootにする
２． WindowsにVirtualBoxなどの仮想化ソフトウェアを入れて仮想環境を構築する
３． Cloud上に仮想環境を構築する

今回は３の方法を試してみます。
今回は[Cloud９](http://c9.io)を使用します。

![20160130_01.png](https://qiita-image-store.s3.amazonaws.com/0/100523/be2e9065-5875-eace-a1c4-b333d01ef5ee.png)

まずは登録が必要なのでSIGN UPをクリックして、
Username
e-mail
password
を入力します。
GitHubのアカウントを持っていればGitHubアカウントで登録もできます。

![WS000521.JPG](https://qiita-image-store.s3.amazonaws.com/0/100523/641100af-2986-672d-f783-d3e294232f28.jpeg)


アカウントを作成して、SIGN INすると下記のような画面になります。

![20160130_02.png](https://qiita-image-store.s3.amazonaws.com/0/100523/dbdb17c9-9968-a765-ce7c-520626f50e4f.png)

次に仮想環境を作成します。
ここではWorkspace nameにｃhainerを入れ、Choose a templateでCustomを選んで、公開をPrivateに設定してCreate workspaceを押しました。

![20160130_03.png](https://qiita-image-store.s3.amazonaws.com/0/100523/4a2ea397-cff3-e88e-164e-8fcc41469500.png)

しばらく待つと下記のような画面になります。

![20160130_04.png](https://qiita-image-store.s3.amazonaws.com/0/100523/e3139c0a-979b-4a94-7996-319f31b93029.png)

確認するとUbuntu １４．０４.3 LTS 64bit環境のようです。
メモリは１GB,Diskは５GBです。

![20160130_05.png](https://qiita-image-store.s3.amazonaws.com/0/100523/cdc0de71-473a-09bb-7b7b-4dbe6fee1c74.png)

Chainerの環境構築
chainerのインストールは[install guide](http://docs.chainer.org/en/stable/install.html)に従うだけなので難しくないです。

```
sudo pip install -U setuptools
sudo pip install chainer
```
上記２つを実行すると下記のようにインストールが完了します。Install Guideには
```
apt-get install g++
```
と書いてありますが、すでに入っているのでやる必要は無いです。もちろんやってもすでにInstallされていますと出るだけですが。

![20160130_06.png](https://qiita-image-store.s3.amazonaws.com/0/100523/f4f1dc9c-1c0d-8fba-e2d1-c34411c9296f.png)

chainerをimportしてバージョンを確認してみます。
![20160130_07.png](https://qiita-image-store.s3.amazonaws.com/0/100523/a5961951-0ebc-1fdc-4f57-9dec408fa8bf.png)

インストールは終わりですが、せっかくなのでexampleを動かしてみます。
とりあえずgithubからchainerをとってきます。

```
git clone https://github.com/pfnet/chainer.git
```

実行・・・。遅い・・・。
![20160130_8.png](https://qiita-image-store.s3.amazonaws.com/0/100523/336e46db-321b-61c4-7a87-b6a2e4fa59be.png)

あまり計算負荷がかからないものなら使えるかもしれないです。
chainerは無謀だったのかも・・・。
開発環境を設定する

# サンプルコードを書く前には開発環境を整える
　プログラム開発する上で、最初にすることは何かと言われると

**開発環境を整える**

　普通はここから始める。
　いきなりソースコードを書ける訳ではなく、ソースコードを書いてプログラムを実行する環境がなければプログラム開発は出来ない。
　１度開発環境を整えれば、この工程はスキップすることが出来るが、最初からこの工程をスキップして予定が組まれていることもあり、開発環境を整えるためにダウンロード、インストールのための時間が１日以上かかることもあるので、一言「開発環境を整える時間をもらいます」と伝えることを忘れない方がいい。

## 開発環境を何にするか決定するポイント
　開発環境は大体この順番で決定されるのではないだろうか。

1. 目的　[何を実現したいのか(新規、改善)]
2. 期限　[いつまでに実現するのか]
3. 手段　[何を使って実現するのか(Web,OS上で動く、プログラミング言語)]
4. 場所　[何処で開発するのか(会社、移動しながら)]
5. 共有　[誰と作るのか(1人、複数（自社、他社））]

　ケースバイケースなので、順番が変わることはあるが、１、２がしっかりしてない場合は大抵問題が発生するので、まずは１，２を洗い出すところから始めるようにしてから問題を回避するようにしている。

# 今後のための開発環境設定

## ポイントを設定する
1. 目的　[定期的に普段使用しているツール,IT技術にまつわる記事や実験したことについて書く]
2. 期限　[1記事につき 2～3時間]
3. 手段　[Visual Studio C# + その他の言語、アプリケーション]
4. 場所　[移動(Macbook) or 事務所(Desktop)]
5. 共有　[作業 1人だがPCは複数台 ソースコードは公開]

## 必要となる開発環境
- Visual Studio
- windowsが動くPC
- github（ソースの共有）
- ＋アルファとなる言語・アプリケーション

大体このような設定にして開発環境を決めてみることにして記事を定期的に書いていくことにした
Gitbucketをバージョン3.10にしたらデータベースが壊れちゃった

# 3.10にしたらgitbucketが壊れた!

何も考えずにGitbucketを3.5から3.10にアップデートしたところ、データベースがぶっこわれてしまいました。

```
org.h2.jdbc.JdbcSQLException: Table "ACTIVITY" not found; SQL statement:
(うんたらかんたら)
```

* ログインできない
* エラーメッセージしか表示されない

どうやら3.10からH2 Databaseがバージョンアップしたことが原因とのこと。作者がデータベースのマイグレーションツールを提供してくれているのを発見した。

[GitBucket 3.10をリリースしました - たけぞう瀕死ブログ](http://takezoe.hatenablog.com/entry/2015/12/30/021849)

> データストアの信頼性向上のため、GitBucketが内部で使用しているH2データベースを最新版である1.4.190にバージョンアップしました。

> しかし、H2のバージョンアップはデータファイルの互換性に関する問題を引き起こす可能性があります。もし、H2のバージョンアップに起因する問題が発生した場合はマイグレーションツールを使用してデータファイルのマイグレーションを行うか、3.10の代わりに3.10_h2-1.4.180（これはH2のバージョンを除いて3.10と完全に同じものです）を使用してください。

[gitbucket/h2-migration - Shell](https://github.com/gitbucket/h2-migration)

> In GitBucket 3.10, we upgraded H2 to the recent version of H2 1.4.190. However it might cause a compatibility problem for data files. 

# 悲しいお知らせ

> Note: This tool migrate from old data files to new data files __but GitBucket 3.10 might break old data files in bootstrap.__ So you must backup data files (~/.gitbucket/data.*.db) __before upgrading to GitBucket 3.10 and restore from old data files before running this tool.__
(太字部筆者)

(超訳)「マイグレーションツールは用意したけど、3.10動かしたらデータベースぶっこわれてるっぽいから、古いデータに戻してからマイグレーションかけてね〜」

仕方がないので、壊れる直前のバックアップからデータを復旧してマイグレーションを実行。
ツールはREADMEの手順通り、自分の環境に合わせて環境変数を書き換えてから実行すればOK。

無事3.10で起動した。
(シェルスクリプト実行時に一部のファイルが存在しないと言われたが、特に問題はなかった。)

# 教訓

__ソフトのアップデート前には必ずバックアップを取ろう!__
Bundlerを少し学んだ

[hogelogが作ってくれたスクリプト](https://github.com/hogelog/tools_for_maki)を使うときにこんなコマンド使った
`bundle exec ruby bin/expand_twitter_attributes.rb`
bundleってなんだろう。と思って教えてもらったことのメモ。

## rubygems
ruby用のライブラリの管理システム。rubygemsで管理されてるライブラリのことをgemって呼んだりする。gemコマンドでは、rubygemsで管理しているライブラリをインストールしたりアンインストールしたりできる。

## Gemfile
利用するgemを記述するファイル。

## Bundler
rubygemsとともに使うパッケージ管理システム。
コマンドは
`bundle hoge`

## Gemfile.lock
Gemfileを作ったあとに
`bundle install`
したらできるファイル。Gemfileに書かれているgemの、コマンドを実行した時点でのバージョンが書かれている。Gemfile.lockがすでに存在するときにbundle installしても、上書きされたりはしないので安心しろ。

## bundle exec
ざっくり言うと、
Gemfile.lockに書かれているgemのバージョンの環境で、以下のコマンドを実行しなさい。
という意味。

## ざっくりした話
スクリプトを作った時と使う時では、gemのバージョンが違うことは多々ある。そうすると、作った時点ではちゃんと動いていたのに、いざ使おうとしたときには動かなくなってしまう。それを防いでくれるのがGemfileとBundlerと、それらによってできるGemfile.lock。
シェルスクリプトやmakefileでのバージョン番号 x.y.z の比較

## 動機

makefile（のシェルスクリプト部分）でGCCのバージョンの比較をしたくなった。
GCCのバージョン番号は `gcc -dumpversion` を実行することで、例えば `4.8.1` のように出力される。
このバージョン番号の大小を比較したいのだが、インターネットを検索してみたところStack Overflowの記事 http://stackoverflow.com/questions/5188267/checking-the-gcc-version-in-a-makefile くらいしか見つけることができず、その記事の回答に満足できなかったので、自分で考えた。

## コード

例としてGCC 4.8.1以上かどうかの比較を行う。

shell scriptでなら

```sh
GCC_VERSION=$(gcc -dumpversion | (IFS=. read -r major minor micro; printf "%2d%02d%02d" ${major:-0} ${minor:-0} ${micro:-0}))
if [ "$GCC_VERSION" -ge 40801 ]; then
  ...
fi
```

makefileでなら

```mf
GCC_VERSION=$(shell gcc -dumpversion | (IFS=. read -r major minor micro; printf "%2d%02d%02d" $${major:-0} $${minor:-0} $${micro:-0}))
GCC_GE40801=$(shell if [ $(GCC_VERSION) -ge 40801 ]; then echo yes; fi)

ifeq ($(GCC_GE40801),yes)
  ...
endif
```

もっと分かりやすくシンプルに出来るだろうか。

## 追記＠2017.1.17

gccに限らないでバージョン番号比較の方法を検索したところ、
awkを使うともっと短くできるのを見つけた。
http://bashscripts.org/forum/viewtopic.php?f=16&t=1248

```sh
GCC_VERSION=$(gcc -dumpversion | awk -F. '{printf "%2d%02d%02d", $1,$2,$3}')
if [ "$GCC_VERSION" -ge 40801 ]; then
  ...
fi
```

awkでは、フィールド数より大きいフィールドを指定した時のそのフィールドは空文字になり、それを数値として扱おうとした時は0に変換される、ということをうまく利用している。
（cf. http://gauc.no-ip.org/translation/gawk.html#SEC43
　`レコード中にフィールドが七個しかないときに $8のように最後の要素を越えて参照しようとしたときには、空の文字列が返ってくる (数値オペレーションで使用した場合にはゼロが得られる)。`）

なお、
http://stackoverflow.com/questions/16989598/bash-comparing-version-numbers
には `sort -V` を使う方法も紹介されており、面白い。
MKMapView: 多すぎる移動イベントを間引く


## マップの移動イベントが多すぎ

- MapView の RegionChange でイベントを拾う
- OnMapMovedでアノテーションとかルート描画するが、オブジェクトが多く動作が重い

~~~csharp
class MapDelegate : MKMapViewDelegate
{
  public override void RegionChanged (MKMapView mapView, bool animated)
  {
      OnMapMoved (mapView);
  }
}
~~~

## 簡易ジョブキューで処理を先送りさせる

- 1.5秒

~~~csharp
using System.Collections.Concurrent;
ConcurrentQueue<Point> MoveEventQueue = new ConcurrentQueue<Point> ();
~~~

~~~csharp
public void OnMapMoved(MKMapView map)
{
  MoveEventQueue.Enqueue (map.CenterCoordinate.ToPoint ());

  System.Threading.Tasks
    .Task.Delay (System.TimeSpan.FromSeconds (1.5))
    .ContinueWith (
    (task) => {
        // UI Thread
        InvokeOnMainThread (() => { MapMovedTo (map); });
    }
  );
}
~~~

##  キューが積まれているならば処理しない

- 最後のイベントだけ処理させる

~~~csharp
public void MapMovedTo(MKMapView map)
{
  Point pt;

  MoveEventQueue.TryDequeue (out pt);
  if (pt != null && MoveEventQueue.Count () > 0) {
    return;
  }
  RedrawAnnotaions(map);
}
~~~
【Spring Batch】JobRepositoryへの保存時にカラムのサイズを超えてしまう


Spring Batchをいじっている最中に遭遇した問題です。

# 環境
Spring Boot 1.3.2.RELEASE
spring-boot-starter-batch
SQL Server 2012

# エラー
発生のタイミングは、Job実行中に例外が発生してJobが中断されるときでした。

```
org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [UPDATE BATCH_STEP_EXECUTION set START_TIME = ?, END_TIME = ?, STATUS = ?, COMMIT_COUNT = ?, READ_COUNT = ?, FILTER_COUNT = ?, WRITE_COUNT = ?, EXIT_CODE = ?, EXIT_MESSAGE = ?, VERSION = ?, READ_SKIP_COUNT = ?, PROCESS_SKIP_COUNT = ?, WRITE_SKIP_COUNT = ?, ROLLBACK_COUNT = ?, LAST_UPDATED = ? where STEP_EXECUTION_ID = ? and VERSION = ?]; 文字列データまたはバイナリ データが切り捨てられます。; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 文字列データまたはバイナリ データが切り捨てられます。
	at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:102) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    ...
```

原因はBATCH_STEP_EXECUTION. EXIT_MESSAGEにカラムサイズを超える値をセットしようとしたことでした。
EXIT_MESSAGEのカラム定義は**varchar(2500)**です。
さて、SQL Server 2012の場合、文字列型のサイズの数え方は下記の通りとなります。

| 型      | 数え方 |
|:------|------|
| charおよびvarchar | バイト数 |
|ncharおよびnvarchar | 文字数 |

JobRepositoryへのINSERTおよびUPDATEでは、カラム定義を考慮してバッチ処理のなかで2500文字以上の文字は切り捨てられます。
上記のUPDATE文では、EXIT_MESSAGEにスタックトレースを入れようとしていたのですが、スタックトレースに日本語等のマルチバイト文字が含まれていました。
そうなると挿入文字数は2500文字以内に収まっているのに、バイト数に換算すると2500バイトを超えてしまうというわけでした。

# 回避方法

## カラムの型をnvarcharに変更する

JobRepositoryのテーブルが生成されるたびに変えなくてはいけないので面倒ですが。。。
更新するのは

+ BATCH_JOB_EXECUTION.EXIT_MESSAGE
+ BATCH_STEP_EXECUTION.EXIT_MESSAGE

の２つです。

## 文字数の上限を2500から減らす

こっちはコードで回避できます。

```java:BatchConfiguration.java
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

	@Bean
	public JobRepository jobRepository(DataSource dataSource, PlatformTransactionManager manager) throws Exception {
		JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
		factory.setMaxVarCharLength(2000);
		factory.setDataSource(dataSource);
		factory.setTransactionManager(manager);
		return factory.getObject();
	}
    
    ...
    (後略)
    ...
    
}
```

JobRepositoryFactoryBean#setMaxVarCharLength を使って、文字数の上限を2500から減らせば、バイト数でカウントしても収まるという計算です。
ですが、マルチバイト文字が多いとやっぱり駄目です。。。

## カラムのサイズを増やす

文字数の上限を変えるのと同じ発想です。varchar(2500)からvarchar(3000)くらいにすれば収まる気がします。

# 余談

ISSUEがあったのですが、「上手いやり方がないから手動でなんとかしてくれ」（超訳）とのことです。

# 参考

https://sites.google.com/site/soracane/home/springnitsuite/spring-batch/7-spring-batchno-tips#TOC-JobRepository-
https://jira.spring.io/browse/BATCH-1296
最小二乗法（数学）

こんにちは。
最小二乗法は $\left(\boldsymbol{y} - A \boldsymbol{x} \right)^\textrm{T} \left(\boldsymbol{y} - A \boldsymbol{x} \right)$ を最小とする $\boldsymbol{x}_{\min}$ を計算しますが、数学的根拠をごく短く説明してみます。
まず数学的モデル式は、$\boldsymbol{x}$ が未知数[^1]で、下記とします。

```math
\begin{align*}
\boldsymbol{y} &= A \boldsymbol{x} + \Delta \boldsymbol{y} \\
\Delta \boldsymbol{y} &= \left(\Delta y_1,\ \Delta y_2,\ \dots,\  \Delta y_n\right)^\textrm{T} \\
\end{align*}
```
この誤差に当たる $\Delta \boldsymbol{y}$ も未知数ですが、妥当な仮定として通常下記を採用します。

- 確率変数扱い
- ガウス分布
- 各成分 $\Delta y_i$ は独立
- その平均 $\mu_i = 0$
- その分散 $\sigma_i$ は $i$ に無依存（$=\sigma$）

したがって、この $\Delta \boldsymbol{y}$ の $n$-多変量分布は（以下では規格化定数は省略）、

```math
p (\Delta \boldsymbol{y}) \propto \exp \left(-\frac{1}{2 \sigma^2} \sum {\Delta y_i}^2\right) 
```
そして代入により $\boldsymbol{x}$ の条件付き確率（またこの場合、尤度／事後確率）が得られます。

```math
p (\boldsymbol{x}|\sigma) \propto \exp \left(-\frac{1}{2 \sigma^2} \left(\boldsymbol{y} - A \boldsymbol{x}\right)^\textrm{T} \left(\boldsymbol{y} - A \boldsymbol{x}\right)\right)
```

これは下記の期待値などを計算するための母関数のような役割を持ち、

```math
\begin{align*}
\boldsymbol{x}_\textrm{expect} &\triangleq \int \boldsymbol{x}\, p (\boldsymbol{x}|\sigma) \, d\boldsymbol{x} \\
&= \mathop{\arg\min}_{\boldsymbol{x}} \left(\boldsymbol{y} - A \boldsymbol{x}\right)^\textrm{T} \left(\boldsymbol{y} - A \boldsymbol{x}\right)
\end{align*}
```

以上が最小二乗法の根拠です（上記計算は $\sigma$ に無依存なことに注意）。


[^1]: 正確には、事前無情報を仮定した未知変数とも言うべき。
# Content Providerの基礎知識


## コンテントプロバイダ(ContentProvider)とは

### 各アプリケーションがアプリ内部にもつオブジェクト
* リレーショナルデータベースのように行・列(表)として表示される。
* 同一端末内のアプリ間でデータのやり取りが生じる際はこのオブジェクトを利用する。
* プロバイダへのアクセスはContentResolverというクライアントオブジェクトを利用する。(CRUD操作が行えるクライアントオブジェクト)
* プロセス間通信、安全なデータアクセスを処理するための実装が行われている。

## コンテントプロバイダ(ContentProvider)のデータ
* _IDがプライマリーキー

![Kobito.rasAT3.png](https://qiita-image-store.s3.amazonaws.com/0/43762/47d2a4bf-d81c-1d20-f443-dd5db2f03758.png "Kobito.rasAT3.png")

## プロバイダへのアクセス
* 通常AndroidManifestにパーミッションが必要


```具体例
mCursor = getContentResolver().query(
    UserDictionary.Words.CONTENT_URI,   //テーブルのuriの指定
    mProjection,                        // 各行で返すべきカラム
    mSelectionClause                    // 条件
    mSelectionArgs,                     // 条件
    mSortOrder　　　　　　　　　　　　　　　 // ソート条件
    );                        

```


* SQL SELECTとの比較

![Kobito.ou5VLg.png](https://qiita-image-store.s3.amazonaws.com/0/43762/54d6dae9-84f9-75a1-93cd-091039a8fd90.png "Kobito.ou5VLg.png")

## コンテンツURI
### プロバイダのデータ・リソースを特定するためのURI
* プロバイダは複数のデータをもつので、リソースの居場所を明示的にする必要がある。そのために利用されるのがURI。RestにおけるURIリソースのようなもの


|URI|スキーム|認証局|パス|
|:--|:------|:----|:--|
|content://user_dictionary/words|content|user_dictionary|words
|https://finc.co.jp/recruit|https|finc.co.jp|recruit| 


## 手順
### 1. プロバイダの読み取りアクセスを要求する
### 2. プロバイダにクエリを送信するコードを定義

## SQLインジェクション
SQLインジェクションを防ぐために
1. "?"の置き換えパラメータを利用する
2. 選択引数の配列を利用する。

## Cursor.queryの返り値はCursorオブジェクト

## クエリの結果を取得する。
```
int index = mCursor.getColumnIndex(UserDictionary.Words.WORD);

if (mCursor != null) {

	//データベースから各行をループで取得
    while (mCursor.moveToNext()) {
        newWord = mCursor.getString(index);
    }
    
}
```

## Intent経由のデータアクセス
* URIにパーミッションを含めて、アプリケーションにインテントを送信する。

```
読み取りパーミッション: FLAG_GRANT_READ_URI_PERMISSION
書き込みパーミッション: FLAG_GRANT_WRITE_URI_PERMISSION
※ アクセスはURI自身に限定されるので、ContentProvider全てに適用されるわけではない。
```

###
妻の誕生日にLINEでサプライズメッセージを送る


いつもQiitaにお世話になっているので、自分も恩返しで投稿を始めることにします！小さなことでもいいので、できるだけ毎日投稿を続けていこうと思う。

さて、初投稿は記念日的な投稿として、次のようなことをやってみたという記録をば。

- 妻の誕生日に合わせて、LINE でメッセージを送る
- 携帯を触ってないのに、俺からメッセージが送られるサプライズをしたい
- ディナーを食べ終わった 19:30 くらいに自動で送られるようにしたい

## 検討1: REST APIs

- まずは正攻法で、LINE の [REST APIs](https://developers.line.me/restful-api/overview) を使うことを検討
- 結論から言えば、これは個人向けに開放されていないので断念

### 断念理由

- 詳細を言うと、LINE REST APIs を使うには、Access Tokenの発行が不可欠なんですが、これには [Channel Registration](https://developers.line.me/web-login/channel-registration) (LINEへのいわゆるアプリ登録) が必要で、[LINE Partner Program](https://developers.line.me/requestform/input) へ登録していないと、 `CHANNEL_CREATOR` の権限が得られないみたいなんですよね。
- なお、どうせ LINE Partner Program へ登録するなら、LINE公式アカウントを取って、より高機能な [Business Connect](https://developers.line.me/businessconnect/overview) を用いたほうがよさそう
   - REST APIs では、[Link Message](https://developers.line.me/restful-api/link-messages) しか送れないが、Business Connect なら、[Microsoft りんな](http://rinna.jp/rinna/) とかみたいに ChatBot みたいなメッセージのやり取りが可能になるはず
   - 今作りたいものはそんな大掛かりなものじゃない・・・と思いつつ、LINEさん懐が狭いなと感じたり・・・

## 検討2: LINE@

- 次に、個人向けにも公開されている、ライト版LINE公式アカウントともいえる [LINE@](http://at.line.me/jp/) を使うことを検討
- [この記事](http://gaiax-socialmedialab.jp/line/379)でも紹介されている通り、無料で結構できるので、個人で使う分には何の問題もなさそう！
   - すません、LINEさん、やっぱ太っ腹でした！！
- スマホアプリのほか、Web の [LINE@ Manager](https://admin-official.line.me/) でも管理できて、送信メッセージの予約ができるので、今回の要件にもぴったし！

![line@_message.png](https://files.tearoom6.biz/89c87731-3029-4c50-9bc9-f0eeaed9dbc1.png)

### 断念理由

- だが、あくまで個人アカウントからではなく、LINE@アカウントから送ることになるので、それじゃまず妻に個人のLINE@アカウントのフレンドになってもらわないといけないじゃないか!?
- サプライズでこっそりやりたいのだよ、もっと事前にフレンドになってもらうならともかく、直前では怪しすぎる・・・
- でも、LINE@、これはこれで面白そうなので、今度機会があったら何かに使ってみよう

## 検討3: MacOSXのLINEアプリ

- 前置きが長くなったけど、かくなる上は、Mac に入っている LINE アプリを使うことに
- まず次のような AppleScript を書く
   - [goo.gl](https://goo.gl/) の短縮アドレスは、お手紙画像を Web 上に置いたアドレスを短縮したもの

```:send_line_message.scpt
#!/usr/bin/osascript
on run argv
   tell application "LINE"
      activate
      delay 1
      tell applications "System Events"
         keystroke "HappyBirthday!!!"
         keystroke return
         keystroke "http://goo.gl/xxxxxx"
         keystroke return
      end tell
   end tell
end run
```

- 次に [atコマンド](http://yamaqblog.tokyo/?p=16006) を使って、指定時間に上記スクリプトが実行されるようにする

```bash
# Mac で atコマンドを使うには、あらかじめ有効にしておく
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist

# 時刻を指定してコマンド実行を予約
echo "osascript send_line_message.scpt" | at -t 201601301930

# 確認
atq
```

- Mac がスリープ状態にならないよう、System Preference で以下の点を確認する
   - Screen Saver が開始しないようにする
   - Energy Saver で Sleep にならないように設定しておくことも忘れない
   - 地球環境のためにこれらは後で元に戻しておいてね
- ノートのフタを閉めても大丈夫なようにしたいなら、[InsomniaX](http://www.macupdate.com/app/mac/22211/insomniax) とかを入れておけばokなはず
- 電源はコンセントに接続して切れることのないように
- そして、あとは LINE アプリを起動し、妻とのトーク画面を開いた状態にしておくだけ・・・

### 結果は・・・？

- こうして、準備万端で妻と外出したわけだが、時が来ても妻のスマホが光らない・・・あれ？
- さすがにおかしいので、しれっーと手動で送ることに・・・妻は喜んでくれたが、エンジニアとしてはかなり無念・・・T T
- 家に帰って確かめてみたら、ネットとの接続が断たれていたのが原因だったorz
   - ということで、ネットとの接続も確認した上で外出を、というのも条件に加えておく、というオチ付きで
【VBS】StringBuilder

#前述
文字列を成形する時、Stirng型の変数に対して下記のような文字列結合式を使いたくない。

```vbnet:aaa
str = str & "追加する文字列"
```
そこで.NetのStringBuilderを使う。


#ソース
```vbnet:StringBuilderテスト
Option Explicit

Dim builder
Set builder = CreateObject("System.Text.StringBuilder")

builder.Append_3 "空にした酒瓶の向こうに見えた怪しげな人影。"
builder.Append_3 "虚ろな光を落とすガス灯の光。"
builder.Append_3 "すべてが快適に淀んだ夜であった。"

WScript.Echo builder.ToString
```

CreateObjectにより、StringBuilderのオブジェクトを作成する。
C#やVBにてStringBuilderで文字列を追加する際にはAppend()を使うが、ここではAppend_3とする。
少しだけ紹介すると、下記のように与えるパラメタごとにサフィックスが与えられている。
VBScript側でオーバーロードを解決できないからだそうだ。

```
Append(Char value, Int32 repeatCount)
Append_2(Char[] value, Int32 startIndex, Int32 charCount)
Append_3(String value)
Append_4(String value, Int32 startIndex, Int32 count)
Append_5(Boolean value)
Append_6(SByte value)

...etc
```

#ラッパークラス
個人的にはなるべくC#やVB、Javaで使いなれたStringBuilderの感覚で使いたい。
簡単ながらいくつかメソッドを追加したラッパークラスを作成。

```vbnet:StringBuilder
Class StringBuilder

    ' メンバ
    Dim builder
    
    ' コンストラクタ
    Private Sub Class_Initialize
        Set builder = CreateObject("System.Text.StringBuilder")
    End Sub
    
    ' デストラクタ
    Private Sub Class_Terminate
        Set builder = Nothing
    End Sub
    
    ' 文字列結合
    Public Sub Append(str)
        builder.Append_3 str
    End Sub
    
    ' 文字列結合（1行追加）
    Public Sub AppendLine(str)
        builder.Append_3 str & vbCrLf
    End Sub
    
    ' 結合結果削除
    Public Sub Clear()
        Set builder = Nothing
        Set builder = CreateObject("System.Text.StringBuilder")
    End Sub
    
    ' 結合結果
    Public Function ToString()
        ToString = builder.ToString
    End Function
    

End Class
```
追加したメソッドは下記の通り。

- サフィックスなしのAppend
- 追加する文字列に改行を加えて追加するAppendLine
- 結合していった文字列を削除するClear

これでいくらかは普段使うStringBuilderと近い感覚で使えるかな？
Xamarin.Forms（Android）で未処理の例外が発生した場合にアプリがクラッシュしないようにする

Xamarin.Formsを使ったAndroidアプリ開発をしています。

Androidで取り合えずアプリが落ちないようにするにはどうすればよいか調べました。

最初に調べて出てきたのは下記のUnhandledExceptionイベントハンドラを使うものです。
未処理の例外を捕まえることが出来ますが、未処理なのでアプリが終了してしまいます。
グローバルな例外のキャッチをしたいだけだったり、
例外のログを出力したりしたいだけならここで処理すると良いと思います。

```csharp
AppDomain.CurrentDomain.UnhandledException += (s, e) => { };
```

こちらが本命で、アプリが終了しないように出来ます。
未処理の例外が発生したときに、Handledをtrueにすることで強制的に補足済みの例外にしてしまいます。

```csharp
AndroidEnvironment.UnhandledExceptionRaiser += (s, e) => { e.Handled = true; };
```

いずれのコードもMainActivityのOnCreateの中に書きます。
「デスクトップ」等のディレクトリ名を英語にする

日本語版Ubuntuをインストールすると、Home下のディレクトリの名前は日本語になる。これだとコンソールで作業するには不便なので、英語名に変更するには。

# やりかた
``` 
$ LANG=C
$ xdg-user-dirs-gtk-update
```
とやれば、ダイアログが出て英語にリネームできる。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/95394/ced16598-c3e3-98b2-f704-dfbf2bb7f313.png)

# ダメなとき
"Don't ask me this again"をチェックしてこのダイアログを閉じると、xdg-user-dirs-gtk-updateを実行しても何も起こらなくなってしまう。その場合は、
`$ echo 1234 .config/user-dir.locale`としたあとxdg-user-dirs-gtk-updateすればよい。("1234"は適当な文字列でOK)

# どういうこと？
本来は、xdg-user-dirs-gtk-updateはログイン時に実行され、言語設定が変わっていなければ何も起きないのだが、` $ LANG=C`することで騙してダイアログを出すことができる。

"C"というのはデフォルトロケールを表しており、"en_US.UTF-8"等を指定しても同じことができる。
逆に、システムの言語が英語の時に"ja_JP.UTF-8"を指定すればディレクトリ名を日本語にリネームすることもできる。

xdg-user-dirs-gtk-updateが参照する言語設定は`.config/user-dirs.locale`に記録されており、以下のような動作になるようだ。
`.config/user-dirs.locale`が存在しない
　 → "Don't ask me this again"した状態。何も起こらない。
`.config/user-dirs.locale`の内容がLANG=XXXで指定したものと同じ
　 → 言語が変わっていないので何も起こらない。
`.config/user-dirs.locale`の内容がLANG=XXXで指定したものと異なる
　 → 無事ダイアログが表示。やったね。

ちなみに`.config/user-dirs.dirs`には設定結果のディレクトリ名が記録される。

# 参考元
http://manpages.ubuntu.com/manpages/trusty/man1/xdg-user-dirs-update.1.html
https://forums.ubuntulinux.jp/viewtopic.php?id=12701
http://qiita.com/taiko19xx/items/d1a001bfc25245b91354
UITextField の文字数カウント

# これは何

Twitterなどでよく見る文字数カウントを実現する方法です。


![image](https://qiita-image-store.s3.amazonaws.com/0/8292/87eb5bf9-0731-abd0-a111-5b486ed17c36.png)

UITextView の解説はよくありますが、UITextField のものは意外となかったのでメモしておきます。

# やり方


[UITextView の文字数カウント](http://qiita.com/haco99/items/160ca1eb603ca87b117e)

例えば上記の記事と同じように `shouldChangeTextInRange` でやろうとすると一見問題なさそうなのですが、「゛（だくてん）」等も一文字としてカウントしてしまうため、カウントがずれます。

1. `おはよう` で4文字
1. `おはようこ` で5文字
1. `おはようご` で6文字（おかしい）
1. `おはよう` で5文字（おかしい）

なので、`ShouldChange` （入力前）ではなく `DidChange` （入力後）のデリゲートでカウントする必要があります。しかし、残念ながら UITextField にはそれが存在しません。

## 対策

`UITextFieldTextDidChangeNotification` で、入力後の通知を受け取れるようにします。

```objc
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(textFieldDidChange:)
                                             name:UITextFieldTextDidChangeNotification
                                           object:_titleField];
```

```swift
NSNotificationCenter.defaultCenter().addObserver(self,
 selector:"textFieldDidChange:",
 name: UITextFieldTextDidChangeNotification,
 object: nil)
```

通知後に呼ばれるメソッドで文字数をカウントします。

```objc
- (void)textFieldDidChange:(NSNotification *)notification
{
    NSUInteger length = textField.text.length;
}
```

```swift
func textFieldDidChange(notification:NSNotification) {
    let length = textField.text.length
}
```

これで正しい文字数をカウントできるようになりました。

「入力した文字数」ではなく、入力できる「残り文字数」を表示したい場合は、最大文字数から引いてやれば良いですね。
Realmを使ったプロジェクトでユニットテストを実行した時に出たエラー

# エラー内容

```
*** Terminating app due to uncaught exception 'RLMException', 
reason: 'RLMObject subclasses with the same name cannot be included twice in the same target. 
Please make sure '<Realmオブジェクトクラス名>' is only linked once to your current target.'
```

![スクリーンショット 2016-01-25 9.19.50.png](https://qiita-image-store.s3.amazonaws.com/0/100736/4bd1da40-9bed-5b17-bff4-8a9db9bc7a8b.png)

# 状況

* Realmを使ったプロジェクトのユニットテスト実行時に発生
* Realmオブジェクトクラスがプロジェクトとテストの両方のターゲットに含まれていた
* ユニットテストの中では特別Realmを使うようなコードは書いていなかった
* 上記エラーは毎回必ず起きるわけではなく、数回に一回出るという具合

# 解決策

エラーメッセージ、下記stackoverflowに書かれている通りです。
Realmオブジェクトクラスは同じ名前で複数のターゲットで使おうとするとダメなようです。
なのでテストターゲットには入れないようにして、代わりにSwift2.0から導入された`@testable`を使ったらこのエラーは出なくなりました。

http://stackoverflow.com/questions/31002886/class-are-being-linked-more-than-once-in-target
【VBS】ArrayList

#前述
VBScript（WSH）で動的配列のArrayListを使いたい。
配列を使って要素が増える度にReDimするのは面倒くさいので、.NetのArrayListオブジェクトを作成して使う。
言語仕様的に使えないメソッドもあるようだが、SortやClearも使うことができる。

#ソース
```vbnet:ArrayList
Option Explicit

' ArrayList作成
Dim ary
Set ary = CreateObject("System.Collections.ArrayList")

' 要素追加
ary.add "AK-47"
ary.add "M4"
ary.add "G3"

' 要素数取得
Dim num
num = ary.Count

WScript.Echo "要素数: " & num

' For Each文によるループ処理
Dim item
For Each item In ary
    WScript.Echo item
Next

' 要素ソート
ary.Sort

For Each item In ary
    WScript.Echo item
Next

' 要素クリア
ary.Clear


' 破棄
Set ary = Nothing
```
日付の年や月の範囲で検索したい場合

ある年の年始から年末まで、月初から月末までで範囲検索したくなることがあると思うけど、
ActiveSupportのメソッドを利用すれば下記のように漏れなくスマートに書くことができる。

## コード例

``` ruby
# 仮の日付
search_date = '2016-1-25'

# 年での指定
Item.where(created_at: search_date.in_time_zone.all_year)

# 月での指定
Item.where(created_at: search_date.in_time_zone.all_month)

# 日での指定
Item.where(created_at: search_date.in_time_zone.all_day)
```

## 発行されるSQLクエリ

``` sql
-- 年での指定
SELECT "items".* 
FROM "items"  
WHERE ("items"."created_at" BETWEEN '2016-01-01 00:00:00' AND '2016-12-31 23:59:59')

-- 月での指定
SELECT "items".* 
FROM "items"  
WHERE ("items"."created_at" BETWEEN '2016-01-01 00:00:00' AND '2016-01-31 23:59:59')

-- 日での指定
SELECT "items".* 
FROM "items"  
WHERE ("items"."created_at" BETWEEN '2016-01-25 00:00:00' AND '2016-01-25 23:59:59')
```
例では日付の文字列をTimeクラスに変換しているけどもちろん`Time.current.all_year`などと書いて使うこともできる。

# 参考
* [in_time_zone](http://api.rubyonrails.org/classes/DateAndTime/Zones.html#method-i-in_time_zone)
* [all_year](http://api.rubyonrails.org/classes/DateAndTime/Calculations.html#method-i-all_year)
* [all_month](http://api.rubyonrails.org/classes/DateAndTime/Calculations.html#method-i-all_month)
* [all_day](http://api.rubyonrails.org/classes/DateAndTime/Calculations.html#method-i-all_day)
Aura For PHPのインストールとアクション追加まで CentOS


どうもこんにちは
ここ最近のPHPフレームワークといえばLaravelかPhalconという感じですが今回は少し気になっていたAuraというものを使ってみたいと思います

[Aura For PHP](http://auraphp.com/ "Aura For PHP")
正確にはフレームワークではなくライブラリ群なのですが、一応枠組みを揃えたのを生成できるのでフレームワークに見える(言ってもいいかも)
必要なライブラリを組み合わせていくスタイルが軽量そうでいいですね


ではやっていきましょう

#前提
PHP5.6とcomposerがインストールされている状態
PHPのタイムゾーンがAsia/Tokyoになっていること


#Aura For PHPのインストール

まず作業ディレクトリ

```
cd /usr/src/aura-php
```


composerでアプリケーション生成

```
composer create-project --stability=dev aura/framework-project aura-app
```

一番最後の`aura-app`がアプリケーション名です



生成されたアプリに入ります

```
cd aura-php
```

おもむろにアプリ実行

```
php -S localhost:8000 -t web/
```

ブラウザで上記のアドレスにアクセスして`Hello World!`と出力されていればOKです


#アクション追加

localhost:8000で実行したはいいけどアクション追加はどうすりゃええねんということで追加していきます

まずは公式の[フルスタックスタイル](http://auraphp.com/framework/2.x/ja/dispatcher/ "フルスタックスタイル")を参考に作っていきます


まずはアクションクラスの作成を行います

```
mkdir -p src/App/Actions
touch touch src/App/Actions/BlogRead.php/BlogRead.php
```

BlogRead.phpを編集していきます

```php
<?php
/**
 * {$PROJECT_PATH}/src/App/Actions/BlogRead.php
 */
namespace App\Actions;

use Aura\Web\Request;
use Aura\Web\Response;

class BlogRead
{
    public function __construct(Request $request, Response $response)
    {
        $this->request = $request;
        $this->response = $response;
    }

    public function __invoke($id)
    {
        $content = "Reading blog post $id";
        $this->response->content->set(htmlspecialchars(
            $content, ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8'
        ));
    }
}
```


次にDI Containerを通してプロジェクトにどうやって BlogReadを構築するか通知します。
config/Common.phpを編集します

function defineの中に追加

```php
    public function define(Container $di)
    {
        // ...

        // この3行を追加
        $di->params['App\Actions\BlogRead'] = array(
            'request' => $di->lazyGet('aura/web-kernel:request'),
            'response' => $di->lazyGet('aura/web-kernel:response'),
        );
    }
```


function modifyの中に追加

```php
public function modify(Container $di)
    {
        // ...
        
        // ここの3行と
        $dispatcher = $di->get('aura/web-kernel:dispatcher');
        $dispatcher->setObject(
            'blog.read',
            $di->lazyNew('App\Actions\BlogRead')
        );
        
        // ここの3行
        $router = $di->get('aura/web-kernel:router');
        $router
            ->add('blog.read', '/blog/read/{id}')
            ->addValues(array(
                'action' => 'blog.read',
            ));
    }
```


そして再びサーバー起動

```
php -S localhost:8000 -t web/
```


試しに
`localhost:8000/blog/read/4`
にアクセスしてみましょう

`Reading blog post 4`と表示できたら成功です

簡単な流れでした、以上です
辞書攻撃を試してみた。

概要
----
普段仕事で使っているパスワードがかなり辞書攻撃に弱そうなんだけど、そのパスワードってどれくらい効力があるんだろ？と疑問に思ったので、辞書攻撃するスクリプトを作ってみた。

辞書攻撃用コード
---

analyse_term()はuser_idやメールアドレスを解析して、辞書を作成する関数。例えば、cof@qiita.comからは、`'cof@qiita', 'qiita', 'com', 'qiita.com', 'cof'`というような辞書を作成する。
read_dictionaly()は所定の辞書を読見込む関数。ネットで調べたところざっと50万語くらいの辞書はあるようであったが、今回は後述する7語の辞書を使用した。
create_direct_word()は、作成した辞書に含まれるワードそのものを順次生成する関数。
create_indirect_word()は、辞書に含まれるワードに指定された文字数を足した文字列を生成する関数（例えば、辞書にboyが含まれ、2文字が指定されていた場合に、boy01とか、boyaaとかを生成する関数）
なお、パスワードが正しいかどうかを==で判定しているが、これは例えばzip等のファイル回答の解析結果に置き換えても構わない。

```py
import itertools
def analyse_term(term):
    ans = []
    if not term:
        return ans
    for symbol in '!"@#$%&\'()=~-^\\|`{}[]:*;+<>,./?\_':
        if symbol in term:
            for t in term.split(symbol):
                ans.append(t)
                ans += analyse_term(t)
    return ans

def read_dictionaly(dictionaly_file):
    f = open(dictionaly_file)
    words = set(map(lambda x: x.replace('\n','').replace('\r',''), f.readlines()))
    f.close()
    return words

def create_direct_word(dictionaly):
    for term in dictionaly:
        yield term

def create_indirect_word(dictionaly,string,additional_num):
    for term in dictionaly:
        for s in itertools.combinations_with_replacement(string,additional_num):
            s = ''.join(s)
            yield s+term
            yield term+s

def dictionaly_attack(user_id, string, dictionaly_file, max_additional_num, answer):
    dictionaly = set(analyse_term(user_id))
    print dictionaly
    dictionaly |= set(read_dictionaly(dictionaly_file))
    print dictionaly
    for term in create_direct_word(dictionaly):
        #print term
        if term == answer:
            return term
    for i in range(1,max_additional_num+1):
        for term in create_indirect_word(dictionaly,string,i):
            #print term
            if term == answer:
                return term
    return False
```

辞書ファイル
---
とりあえず思いついたまま作成してみた。

```
boy
girl
guy
man
woman
gentleman
lady
```

メインスクリプト
---
使用文字を小文字、スペース、数字に絞り、user_idをcof@qiita.com、パスワードをgirl012としてアタックしてみたところ、およそ0.03秒で発見できた。

```py
# coding: utf-8
# Here your code !
from attack import dictionaly_attack
import time

user_id = 'cof@qiita.com'
dictionaly_file = "dictionaly.txt"
password = 'gir012'
string = 'abcdefghijklmnopqrstuvwxyz 0123456789'
start = time.time()
ans = dictionaly_attack(user_id,  string, dictionaly_file, 3, password)
elapsed_time = time.time() - start
print ans,password
print ("elapsed_time:{0}".format(elapsed_time)) + "[sec]"
```

実行結果
---
辞書が小さいからなのかもしれないが、意外にあっさりとパスワードを発見することができた。普段仕事で使っているパスワードも、いいとこ1分もつかどうかくらいじゃなかろうか。

```
set(['cof@qiita.com', 'cof@qiita', 'qiita', 'cof', 'com', 'qiita.com'])
set(['boy', 'woman', 'cof@qiita.com', 'cof@qiita', 'lady', 'qiita', 'gentleman', 'cof', 'girl', 'com', 'guy', 'qiita.com', 'man'])
girl012 girl012
elapsed_time:0.0296669006348[sec]
```
bashの変数展開によるファイル名や拡張子の取得

沢山のファイルの名前を変更したり、拡張子を変更する際には、シェル上での操作が便利なことがあります。この場合、ファイル名や拡張子、ファイル名から拡張子を取り除いたものを取得できると便利です。

#basenameとdirnameの利用
MacOSやLinuxではbasenameコマンドやdirnameコマンドを利用すると、パス名からのファイル名の取り出しやパス名からのディレクトリ部分の取り出しが出来ます。この2つのコマンドの動作は

```
$ basename "/foo/bar/baz.txt"
baz.txt
$ dirname "/foo/bar/baz.txt"
/foo/bar

```

となっています。次のようなシェルスクリプトを実行すると、

```
#!/bin/sh

var="/foo/bar/baz.txt"
basename $var
dirname $var
```

次のような実行結果となります。

```
baz.txt
/foo/bar
```

#ファイル名からの拡張子の取り除きや拡張子の取得
## sedコマンドを利用した場合
sedコマンドを使うと、ファイル名からの拡張子の取り除きができます。例えば、「's/\.[^\.]*$//'」というパターンでsedコマンドを使えばファイル名からの拡張子の取り除きが出来ます。「.ではじまっていてい.以外の文字が最後まで続く」を空文字列に置き換えると言った意味になっています。

```
$ ls
a.bak	a.txt	b.c.txt	b.doc
$ for f in * ; do 
>　　echo $f | sed 's/\.[^\.]*$//'
> done
a
a
b.c
b
```

sedコマンドのパターンを「's/^.*\.\([^\.]*\)$/\1/'」に変えると拡張子だけを取り出すことができます。拡張子を持っていないファイル名のファイルに対しては、変更が行われないので、注意が必要です。

```
for f in * ; do
>  echo $f | sed 's/^.*\.\([^\.]*\)$/\1/'
> done
bak
txt
txt
doc
```

## シェルの変数展開を利用した場合
いちいちsedコマンドを利用するのは面倒な気がします。シェルの持っている変数展開の機能を利用するともう少し簡単にできるようになります。簡単に言うと、変数展開とは変数に保存されいる文字列を置き換えることです。下の表のようなことができます。他にもありますが、省いてあります。

|   変数展開の記述    |動作 　               　  |
|:-------------------|-------------------------------------------:|
| ${変数名#パターン}  | 前方一致での削除(最短マッチ)               |
| ${変数名##パターン} | 前方一致での削除(最長マッチ)               |
| ${変数名%パターン}  | 後方一致での削除(最短マッチ)    |
| ${変数名%%パターン} | 後方一致での削除(最長マッチ)    |
| ${変数名/置換前文字列/置換後文字列} |   文字列置換(最初に一致したもののみ)  |
| ${変数名//置換前文字列/置換後文字列} |  文字列置換(一致したものすべて)      |

注：最初の4つの#や%を使った変数展開は/bin/shでも利用することができます。

拡張子の取り除きは「後方一致のでの削除（最短マッチ）」を行えば、拡張子を取り除くことができます。つまり「${変数名%.*}」という変数展開を利用します。下に実行例を示します。

```
$ for f in * ; do
> echo ${f%.*}
> done
a
a
b.c
b
```
変数の値が"/foo/bar/bar.txt"となっている場合には、"/foo/bar/bar"となります。

例えば、あるフォルダ内にあるファイル名の拡張子「cvs」となっていものを拡張子「.txt」に変更するためには、

```
$ for f in *.cvs; do
>  mv $f ${f%.*}.txt
> done
```

とすれば可能です。これは、

```
$ for f in *.cvs; do
>  mv $f ${f/.cvs/.txt/}
>done
```

でも可能です。

「${変数名##*/}」という変数展開を利用すると、basenameコマンドのようにパス名からファイル名だけを取り出すことができます。例えば、次のようになります。

```
$ for f in ./junk/*;do 
>   echo $f
> done
./junk/a.bak
./junk/a.txt
./junk/b.c.txt
./junk/b.doc
$ for f in ./junk/*;do 
> echo ${f##*/}
>done
a.bak
a.txt
b.c.txt
b.doc
```

「${変数名##*.}」という変数展開を利用すると、拡張子だけを取り出すことができます。ただし、拡張子を持っていないファイル名のファイルに対しては、変更が行われないので、注意が必要です。

```
$ for f in ./junk/*; do 
>  echo $f
> done
./junk/a.bak
./junk/a.txt
./junk/b.c.txt
./junk/b.doc
./junk/c
$ for f in ./junk/*; do 
>  echo ${f##*.}
> done
bak
txt
txt
doc
/junk/c

```

一気にファイル名などを変更する際には便利な機能ですが、思ったように変数展開ができないと、面倒なことになります。自信がない場合には、echoなどを利用して変数展開の結果を確認してから、実行して下さい。

#まとめ
bashやshの変数展開を利用したパス名からのファイル名の取り出しなどは、以下のようにすれば可能です。

* ファイル名の取得：${変数名##*/}
* 拡張子の削除：${変数名%.*}
* 拡張子の取得：${変数名##*.}
Vagrantでmodern.IEのWindows8.1を日本語で使う方法まとめ


Vagrantでmodern.IEのWindows8.1の仮想マシンを作成して日本語化して使う方法を簡単にまとめました。

内容

- Vagrantで[modern.IE](https://blogs.windows.com/ie/2013/01/31/introducing-modern-ie-testing-sites-for-internet-explorer-made-easier/)のWindows8.1をインストール 
- Windows8.1の日本語化
- Windowsへのリモートデスクトップ接続
- スナップショットの作成 & 復元

## Vagrantインストール

1. VirtualBoxとVagrantをインストールします。(以下はホストがOSXの場合)

	```
	brew cask install virtualbox
	brew cask install vagrant
	```

	※Snapshot機能を使う場合はVagrantのバージョンを1.8以上にします。

## WindowsのVagrant Box追加

1. Windows 8.1とIE11のmodern.IEのVagrant Boxを追加します。

	```
	vagrant box add win81 http://aka.ms/vagrant-win81-ie11
	```

他のWindows boxたち(未検証):

- Microsoft 公式 
	- [Mac用](https://dev.windows.com/en-us/microsoft-edge/tools/vms/mac/)
	- [Windows用](https://dev.windows.com/en-us/microsoft-edge/tools/vms/windows/)
	- [Linux用: ](https://dev.windows.com/en-us/microsoft-edge/tools/vms/linux/)

- Windows8.1

	```
	vagrant init fundpuls/windows-81
	```

- Windows 10

	```
	vagrant init modernIE/w10-edge
	```

## Windows起動

1. Vagrantfileを作成します。

	```
	mkdir win81; cd win81
	vagrant init win81
	```

2. 作成したVagrantfileを開いて以下を追記します。

	```
	config.vm.provider "virtualbox" do |vb|
		vb.gui = true
	end
	
	config.vm.guest = :windows
	config.vm.communicator = "winrm"
	config.vm.network :forwarded_port, guest: 3389, host: 3389
	```

3. 仮想マシンを起動します。
	
	```
	vagrant up
	```

## Windowsの日本語化

0. Windowsキー > Apps > PC Settings > Time and language

	![VirtualBox_win8_default_1454239397927_30959_31_01_2016_21_00_21.png](https://qiita-image-store.s3.amazonaws.com/0/15414/186bd6ff-8a3c-00fd-1cc8-4717f59627cf.png "VirtualBox_win8_default_1454239397927_30959_31_01_2016_21_00_21.png")


1. Country or region
	- Japanを選択します。



2. Languages
	- 日本語を追加して、英語を削除します。
	- 日本語 > Options 
		- Language options > Install Language Pack	をクリックして完了するまで待機します。
		- Keyboards
			- Microsoft IMEを追加します。

	![VirtualBox_win8_default_1454239397927_30959_31_01_2016_21_02_18.png](https://qiita-image-store.s3.amazonaws.com/0/15414/395602d6-7b8a-5e67-812c-16b2050c515b.png "VirtualBox_win8_default_1454239397927_30959_31_01_2016_21_02_18.png")



3. サインアウトして、サインインすると表示言語が日本語になります。
	- 英語のままの場合は2の設定で日本語をメイン言語に変更します。

	![VirtualBox_win8_default_1454239397927_30959_31_01_2016_21_27_42.png](https://qiita-image-store.s3.amazonaws.com/0/15414/4256945a-3698-1265-5643-8c8155b24f9e.png "VirtualBox_win8_default_1454239397927_30959_31_01_2016_21_27_42.png")

## WindowsへのRemote Desktop接続

1. コントロールパネル > Windowsファイアウォール > Windowsファイアウォールを介したアプリまたは機能を許可
	- リモートデスクトップの「パブリック」をチェック

	![VirtualBox_win8_default_1454239397927_30959_31_01_2016_21_44_58.png](https://qiita-image-store.s3.amazonaws.com/0/15414/359a445c-20a5-16cc-fdab-99a0c2d98db5.png "VirtualBox_win8_default_1454239397927_30959_31_01_2016_21_44_58.png")



2. RDPクライアントで接続

※ サーバサイドにVagrantを稼働させる場合などで、RDP接続に限定する場合は`Vagrantfile`の`vb.gui`をコメントアウトします。


## 仮想マシンのスナップショット

Vagrant 1.8から[スナップショット機能](https://www.hashicorp.com/blog/vagrant-1-8.html)が追加されました。

1. スナップショット作成 

	```
	vagrant snapshot save win81-japanese
	```

2. 作成したスナップショットに戻す

	```
	vagrant snapshot restore win81-japanese
	```
Webを使った新人研修　～Linuxコマンド編 - pwd・ls・cdコマンド～

######[Webを使った新人研修　～Linuxコマンド編～](http://qiita.com/fujisystem/items/63b787ac71e9bdcaf3f6)

#pwdコマンド 「現在のディレクトリ（カレントディレクトリ）を確認」
manによると、「現在の作業ディレクトリの名前を出力する」
となっています。
では、「実践」してみましょう。

##実践する
LinuxマシンのエミュレートされているWebページを開きましょう。
・jor1k
http://s-macke.github.io/jor1k

早速「現在のディレクトリ（カレントディレクトリ）を確認」してみましょう。
左側の黒いウィンドウで「pwd」と入力して、エンターキーを押します。

```bash
pwd
```

![pwd.png](https://qiita-image-store.s3.amazonaws.com/0/110729/a344c056-c425-1068-fabf-7f460fbb3014.png)

上記のようにカレントディレクトリが表示されるはずです。
この場合、カレントディレクトリは「/home/user」です。

##解説
「カレントディレクトリ」についての説明から行います。
[カレントディレクトリ - wiki](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%88%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA)
ここで簡単に、Linuxのディレクトリ構成・ルートディレクトリなどの解説をしてもいいかもしれません。

Man page of PWD
https://linuxjm.osdn.jp/html/GNU_coreutils/man1/pwd.1.html


#lsコマンド 「ディレクトリの内容を表示」・cdコマンド 「ディレクトリを移動」
は、説明の都合上、一緒に行います。
では、「実践」してみましょう。

##実践する
「ディレクトリを移動」し、「ディレクトリの内容を表示」してみましょう。
左側の黒いウィンドウで以下のように入力し、各行では最後にエンターキーを押します。

```bash
cd /etc
ls
```

![ls.png](https://qiita-image-store.s3.amazonaws.com/0/110729/189d322b-de94-24c3-0c33-f0d5a0e5dc14.png)

上記のようにディレクトリ・ファイルの一覧が表示されるはずです。

##解説
```cd /etc```
で、etcディレクトリに移動しています。
（理由は、ホームディレクトリ上には初期状態ではファイルがない為、説明しづらいからです。）
「cd」はChange directoryの略です。
```ls```
で、ディレクトリは「青色」、ファイルは「水色」で表示されています。
lsに関してはオプションの```-l```（詳細表示）と```-R```サブディレクトリの再帰表示を押さえておけば良いと思います。

Man page of ls
https://linuxjm.osdn.jp/html/gnumaniak/man1/ls.1.html

cd man page - LinuxCommand.org
http://linuxcommand.org/lc3_man_pages/cdh.html

例題を示して記憶の定着を図ります。
##例題
ホームディレクトリ（この場合/home/user）に移動し、現在のディレクトリを確認し、確認用ファイルを作成し、そのファイルをlsコマンド(詳細表示）で確認する。

```
cd /home/user
pwd
echo 'test' > test.txt
ls -l
```

「test.txt」が詳細表示されれば、正解です。
```cd /home/user```は、```cd ~```と置き換えることが可能です。「~(チルダ)」はそのユーザのホームディレクトリを指します。
キーボードでは、Shiftキーを押しながら、「=」の右側のキーを押して入力します。
echoコマンドや、ファイル出力については、詳細に説明しないようにしたほうが良いと思います。

～本日はここまで
Git初心者のメモ

本や雑誌記事、WEB上の記事を読んで自分なりに理解したことのメモ。間違っている点もあるかも。

#用語
ワークツリー（作業ツリー）
: リポジトリの内容を展開したディレクトリ領域

チェックアウト(check out)
: リポジトリに記録されている内容をワークツリーに展開・反映すること

インデックス（ステージングエリア）
: 次のコミットで記録する状態を管理する領域。`git add` の登録先。「ステージングエリア」とも。
`git add` でインデックスに登録することを「ステージする」と表現することもある。

フェッチ(fetch)
: 他のリポジトリから変更を取得すること

プル(pull)
: フェッチとマージを行うこと

リビジョン
: 「リビジョン」と「コミット」の違いは [こちら](http://qiita.com/YumaInaura/items/dc9e582d7096f54e649b "[Git] リビジョンとは？ コミットとは何が違う？ - Qiita") の記事が参考になる。
「前のリビジョン」、「前のコミット」という使い方の場合、「リビジョン」と「コミット」は同じ意味と考えて良さそう。
「コミットする」と「リビジョン」では意味というかそもそも品詞が違う。

コミットハッシュ（コミット名）
: `git log` ので各リビジョンの最初の行の "commit" の次に表示されているもの。
参考書籍では「コミット名」としていたが、gitのコマンドのリファレンスでは "commit hash" とか "commit" って書いてあるような。

# Windows版Gitの設定ファイルの場所
- system（インストールしたgitに対する設定）
 - ＜gitのインストール先フォルダ＞\etc\gitconfig
 - ＜gitのインストール先フォルダ＞\etc\mingw64\gitconfig
- global（ユーザ単位の設定）
 - C:\Users\＜ユーザ名＞\.gitconfig
- local（リポジトリ単位の設定）
 - ＜リポジトリのフォルダ＞\.git\config


# 日本語ファイル名が化けないようにする
Windows で Git Bash を使っていて `git status` で日本語ファイル名が化けていたが、以下の設定で化けないようになった。

```git config --global core.quotepath false```


#たまに使うコマンド
- gitのバージョンを表示する。
 - git --version
- 設定を表示する。
 - git config --list
- system設定を表示する。
 - git config --system --list
- globalの設定を表示する。
 - git config --global --list
- localの設定を表示する。
 - git config --local --list

#参考ページ
##インストール
[[Sy] 「Git for Windows」でWindowsにGitをインストールする手順 | Syntax Error.](https://utano.jp/entry/2016/07/git-for-windows-install/)
[Gitを導入する | Harvestasya.com](https://harvestasya.com/blog/49)

##その他
[Git概念の整理を試みる | OpenGroove](https://open-groove.net/git/git-summary/)

[Git for Windows 2.xのシステムコンフィグファイルは2つある - Qiita](http://qiita.com/anqooqie/items/07367b2b5932f3acfc38)

[\[Windows\]gitの設定ファイルと最初の設定(ファイル名文字化け対策と個人識別情報) | Zero Configuration:](http://zero-config.com/windows/git-config.html)
[Gitの設定ファイル - なべ’s blog:](http://nave-kazu.hatenablog.com/entry/2015/06/03/000205)

[[Git] リビジョンとは？ コミットとは何が違う？ - Qiita](http://qiita.com/YumaInaura/items/dc9e582d7096f54e649b)

[[Windows]Git Bashの文字化けを解消する | Zero Configuration](http://zero-config.com/windows/gitbash-001.html)
Zybo > Chronicles blog05 > The Zynq SoC’s PL is programmed via [the Processor Configuration Access Port (PCAP)] | single-event functional interrupts (SEFI)

@ Adam Taylor blog

https://forums.xilinx.com/t5/Xcell-Daily-Blog/Figuring-out-the-MicroZed-Boot-Loader-Adam-Taylor-s-MicroZed/ba-p/376159

> The Zynq SoC’s PL is programmed via <font color=red>the Processor Configuration Access Port (PCAP)</font>, which allows both partial and full PL configuration. (If you’d like more detailed information about the Zynq SoC’s PCAP, see [“Partial Reconfiguration of a Hardware Accelerator on Zynq-7000 All Programmable SoC Devices”](http://www.xilinx.com/support/documentation/application_notes/xapp1159-partial-reconfig-hw-accelerator-zynq-7000.pdf))  

...

>The PS can also read back the PL configuration and check for errors, which can be very handy if you are using the Zynq SoC in an environment where it may be subject to <font color=red>single-event functional interrupts (SEFI)</font>.
Zybo > Chronicles blog05 > PS configure PL > 消費電力を減らす

@ Adam Taylor blog

https://forums.xilinx.com/t5/Xcell-Daily-Blog/Figuring-out-the-MicroZed-Boot-Loader-Adam-Taylor-s-MicroZed/ba-p/376159

> Within a Zynq SoC, the PS is the master and therefore configures the PL. The only exception to this is when the JTAG interface is being used to configure the PL. The advantage of this fixed sequence (PS configures PL) is that it allows the PS to power up and operate while the PL remains unpowered. You can use this feature to reduce system power consumption. Of course, if you want to use the Zynq PL, you will need to power it up at some point during the operation of your product.

PS が PL を制御することにより、PLを使う時だけ起動して消費電力を減らすようだ。
[RoR]Nokogiriでtwitter検索結果を解析して、oEmbedで出力する

#概要
Rubyでwebスクレイピングする際に使われるgem、Nokogiriを使ってtwitter検索結果をスクレイピングした後、oEmbedで出力した時のメモ

#環境
Ruby   2.2.2
Rails    4.2.3

#参考
[oEmbed APIの使い方まとめ！URLから埋め込みHTMLタグを作ろう！](https://syncer.jp/oembed-api-matome)

#Nokogiriを使ってスクレイピングしていく
##1.必要なgemのインストール
プロジェクトDir/Gemfileを開き、webスクレイピングに必要なNokogiri、twitter API接続に使うtwitterを追加

```lang:Gemfile
gem 'twitter'
gem 'nokogiri'
```

Gemfileを修正後、ターミナルで

```lang:cmd
bundle install
```
を実行

##2.controllerにopen-uriをrequire
```lang:controller
class XxxController < ApplicationController
  require 'open-uri'
```

##3.twitter検索結果を解析して、oEmbedで出力する
twitter gemでも検索結果を取得できるが、APIにはアクセス制限があるので、twitter検索結果はopen-uriで取得

twitterAPI に必要なアカウントを予めtwitter公式サイトから取得

```lang:controller
@twitter_client = Twitter::REST::Client.new do |config|
  config.consumer_key    = TWITTER_CONSUMER＿KEY
  config.consumer_secret = TWITTER_CONSUMER_SECRET
  config.access_token    = TWITTER_ACCESS_TOKEN
  config.access_token_secret = TWITTER_ACCESS_TOKEN_SECRET
end

#q=XXXに検索したい言葉を指定
search_url = URI.escape('https://twitter.com/search?q=XXX&src=typd')
doc = Nokogiri.HTML(open(search_url))    

@oembed_tweets = Array.new
doc.xpath('//li[@data-item-type="tweet"]').each_with_index do |li, index|
  tweet_id = li['data-item-id']
  
  if tweet_id
    @oembed_tweets.push(@twitter_client.oembed(tweet_id).html)
  end
end
```

そのままviewで出力するとエスケープされたままなので、html_safeで出力する

```lang:view
<div>
  <center>
  <% @oembed_tweets.each do |tweet| %>
    <%= tweet.html_safe %>
  <% end %>
  </center>
</div>
```

##4.その他
twitter APIにはアクセス制限があるので、取得結果をDBに格納して、1日1度くらいの取得にするのがベターか
関数名からコマンド、コマンドから関数名を取得

シンプルな標準関数が見つからなかったのでラップしました。

## 変換用の関数

```el
;;;; keybind -> function
(defun my-function-of-key ($key-string &optional $mode-map)
  (or $mode-map (setq $mode-map (current-global-map)))
  (if (vectorp $key-string)
      (lookup-key $mode-map $key-string)
    (lookup-key $mode-map (kbd $key-string))))

;;;; function -> keybind
(defun my-key-of-function ($function &optional $mode-map)
  (edmacro-format-keys (car (where-is-internal $function $mode-map))))

```


## サンプル

```el
;;;; keybind -> function
;; 文字列のキーバインド  keybind as string
(my-function-of-key "M-i")                 ; => helm-swoop
;; ベクターのキーバインド  keybind as vector
(my-function-of-key (kbd "C-x c M-s o"))   ; => helm-occur
;; モードマップを指定  keybind in a specific mode
(my-function-of-key (kbd "C-c C-r") swift-mode-map) ; => swift-mode-send-region


;;;; function -> keybind
(my-key-of-function 'helm-swoop)        ; => "M-i"
(my-key-of-function 'helm-occur)        ; => "C-x c M-s o"
;; モードマップを指定 function in a specific mode
(my-key-of-function 'swift-mode-send-region swift-mode-map) ; => "C-c C-r"
```