OmniAICreator/Qiita-1.07M huggingface dataset:
SourceTree で差分アーカイブを取得する（日本語ファイル対応）



大体この記事をベースに作成
http://liginc.co.jp/web/tool/169091

ついでに下記の機能を追加した shellscriptsを作成
・最終の出力先を ~/Desktop　へ
・gitのプロジェクト名ごとにディレクトリおよびファイルを追加

http://ndinc.d.pr/kfM9/1o8qMc18

```
#!/bin/sh
path=~/Desktop/
project=$(basename `pwd`)
date=$(date '+%y%m%d_%H%M')

if [ "$2" = "" ]; then
  git archive --format=zip --prefix=${project}/ HEAD `git diff --name-only HEAD $1` -o ${project}.zip
else
  git archive --format=zip --prefix=${project}/ $1 `git diff --name-only $1 $2` -o ${project}.zip
fi

export_path=${path}/zip_${project}/${project}_${date}.zip

if [ ! -d ~/Desktop/zip_${project} ] ; then
  mkdir ~/Desktop/zip_${project}
fi

mv ${project}.zip ${export_path}
echo "complete $export_zip"
```


日本語（マルチバイト）ファイルを含む場合にエラーになってしまうのは、下記の対応でクリア

http://qiita.com/kazunari-yamashiro/items/faa61a1759436311648d
$1,$2,$3...に値をセットする方法

これが出来て嬉しいケースってのがよく分からんがそういう機能があるようなのでメモ。

```console:
$ # $@が空なのを確認
$ echo "[$*]" "${#@}"
[] 0

$ # $1,$2,$3 に値をセット
$ set -- one two three
$ # $@の内容を確認
$ echo "[$1,$2,$3]" "${#@}"
[one,two,three] 3

$ # 既に $1,$2,$3に値が入ってる状態からより少ない数の値をセットすると…
$ set -- one two
$ # 元々あった余分な $3 は unset される
$ echo "[$1,$2,$3]" "${#@}"
[one,two,] 2
```

これだけ。
指定したディレクトリ中にあるディレクトリ内のファイルの総数を数える

## きっかけ
1. Dropboxに11GB以上のファイルを保存している
2. PCを再起動する度に、Dropboxがファイルのインデックスを作成する
3. 6万近い数のファイルのインデックスを作成するのはすごく時間がかかる :collision: 
4. 不要なファイルをDropboxの管理外に置きたいが、どのディレクトリにファイルが多いのかわからない

## コマンド
```sh
find . -maxdepth 1 -type directory | xargs -I%% sh -c 'echo "%%" ; find "%%" -type file | wc -l'
```

1. カレントディレクトリ内のディレクトリの一覧を作成
2. 各ディレクトリごとに、ファイルの一覧を作成
  * この時、どのディレクトリに対して行っているか分かるように`echo`する
3. ファイルの一覧を元に、行数カウントをして、ファイルの総数を出力する
  * どこにファイルが多いか知りたいだけなので、空白行などの誤差は無視している
Power Query のタブが表示されない場合の１解決方法

#はじめに
Excelに機能を追加するため、Power QueryをインストールしたのにPower Query のタブが表示されない事象があった。
環境は、Windows Server 2012 のリモートデスクトップでExcelを使用している。
調査したところ、タブが表示されないのは、一般ユーザーの場合のみで、AdministratorでExcelを実行するとPower Queryのタブが表示され使用できた。
[Power Query のトラブルシューティング](https://support.office.com/ja-jp/article/Power-Query-%E3%81%AE%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0-2546eaa8-9893-4574-9ef9-afacb9b0b495?ui=ja-JP&rs=ja-JP&ad=JP)では、解決できなかったので掲載する。

#事象
一般ユーザーで、[Power Query のトラブルシューティング](https://support.office.com/ja-jp/article/Power-Query-%E3%81%AE%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0-2546eaa8-9893-4574-9ef9-afacb9b0b495?ui=ja-JP&rs=ja-JP&ad=JP)に掲載されているオプションのアドインを見ると「無効なアプリケーション アドイン」にPower Queryが表示されている。

#１解決方法
オプションのアドインで管理コンボボックスを「使用出来ないアイテム」に変更して「設定」ボタンを押し、Power Queryを選択し「有効にする」ボタンをクリックしてPower Queryを有効にする。
その後、[Power Query のトラブルシューティング](https://support.office.com/ja-jp/article/Power-Query-%E3%81%AE%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0-2546eaa8-9893-4574-9ef9-afacb9b0b495?ui=ja-JP&rs=ja-JP&ad=JP)通りに作業すると一般ユーザーでもPower Queryで表示でき利用できるようになった。
enum の rawValue のデフォルト値 2


（[こちらの件](http://qiita.com/gadd9/items/20c72a70e086331e3ef6)の続きです）

swift の enum で rawValue を String にした場合、

```
enum MyEnum : String {
    case Orange
    case Banana
}
```
と書くと Swift 1.2 ではエラーとなったが、2.0 以降はエラーとならず、

```
enum MyEnum : String {
    case Orange = "Orange"
    case Banana = "Banana"
}
```

と書いた場合と同様の結果となる。表示名をそのまま enum にしたいときに記述がシンプルになる。

部分的に指定しても問題ないことも確認。

```
enum MyEnum : String {
    case Orange
    case Banana = "ばなな"
}
print(MyEnum.Orange.rawValue)   // Orange
print(MyEnum.Banana.rawValue)   // ばなな
```
EclipseでEmacsキーバインドを使う

Eclipseを久々に使っているのですが、Emacsキーバインドで使いたくて試行錯誤したメモ。

#　環境
- OS : Ubuntu 15.04
- Eclipse : MARS.1 Release(4.5.1)

## プラグインがうまく使えなかった

まずハマったのが、Emacs+プラグインを使って入れようとして失敗していました。

具体的には、"Ctrl-H" を "一語削除" に割り当てたかったのですが、
Emacs+プラグインを入れてしまうと、Emacsの "Ctrl-H" がHelp機能が反応してしまい、
しかもそれをEclipseのKey設定でなぜか変えられない(変えられたかたいれば教えてください…)

ということで、元々デフォルトで入っている?Emacs設定を改造して使うことにしました。

## 設定

Eclipseのメニューから、
Windows -> Preferences -> General -> Keys と選び
Keys画面中のSchemeをDefaultからEmacsに変更します。

するとほとんどのキーバインドがEmacsになります。
あとはお好みでいくつか変えます。

### Ctrl-H を一語削除に
"Ctrl-H" は標準では "Open Serch Dialog" に割り当てられてます。
この割り当てを他のキーバインドにまずは割り当てます。
自分は”Ctrl+Alt+S"に割り当てました。
次に、"Delete Previous" を探し、"Ctrl+H"に割り当てます。

>ちなみに、Commandの検索は、Schemeの下の検索窓にタイプすると候補が見つかります。
>またBindingからCommandを検索したい場合は、Bindingの列の先頭をクリックすると、
>昇順と降順に並ぶので、例えば"Ctrl-H"に割り当てられているCommandを探すときには見つけられました。

### Ctrl-M を改行してインデントに
"Ctrl-M" は標準ではウインドウのサイズ変更?に割り当てられています。
自分はこのキーバインドを"Alt-M"に割り当てなおし、
"Ctrl-M" を "New Line Indend" に割り当てました。

### 検索と置換コマンド
自分は検索時にはC++Searchが使いたいので、"Open Search Dialog"を起動し、
置換時には"Find and Replace"が使いたかったので以下の設定も変更しました。
- "Open Search Dialog" : "Ctrl+Alt+F"
- "Find and Replace" : "Ctrl+Alt+R"

## 最後に

以上がキーバインドの変更についてでした。
これからもEclipseを使いやすくするために色々いじっていきたいと思います。

ちなみに見た目に関しては、
- [Eclipse Colorr Scheme](https://marketplace.eclipse.org/content/eclipse-color-theme) 
- [Eclipse Moonrise UI Theme](https://marketplace.eclipse.org/content/eclipse-moonrise-ui-theme)
を使うとなかなか良い感じになります。
具体的な導入方法に関しては、以下の記事が参考になるかと思います。
[Eclipse を黒くする](http://qiita.com/mdstoy/items/e3a3489758b5341b8e62#3-1)
App Transport Security に関するメモ

* iOS 9.0 または OS X 10.11 以上で有効な機能。ATS と略記される。
* HTTP の通信を HTTPS に置き換える機能。また TLS のバージョンや暗号スイート、証明書にも一定の条件が設けられていてそれらを満たしていないと通信ができない。
* さしあたっての問題は http しかないサイトへの接続ができないという点。
* Info.plist に設定を追加することで ATS を解除可能（非推奨）。またドメイン単位での部分的な解除も可。
* 全面解除をするには次の記述を追加する：

```
<key>NSAppTransportSecurity</key>
<dict>
	<key>NSAllowsArbitraryLoads</key>
	<true/>
</dict>
```

* 全解除以外の方法として、つぎの選択がある。
	1. 特定のドメインのみ ATS を解除
	2. 特定のドメインのみ ATS を有効にする
	3. 特定のドメインのみ ATS の条件（暗号スイート等）を緩める


* ドメイン指定での解除等の詳細な記述方法については下記に記載されている：
	* [[iOS 9] iOS 9 で追加された App Transport Security の概要](http://dev.classmethod.jp/smartphone/iphone/ios-9-intro-ats/)
	* [iOS9 ATS問題](http://qiita.com/yanayanalte/items/e6d83c12af77fa238a58)
「高階関数」とは、何に対して、どれくらい高いのか？


英語では “higher-order function” だそうですが、これ、何が高いという意味なのでしょうか？

* [高階関数 - Wikipedia](https://ja.wikipedia.org/wiki/%E9%AB%98%E9%9A%8E%E9%96%A2%E6%95%B0)

よく分かりません。そもそも日本語では、姓としての「高階さん」は居ても、独立して「高階」という語がありませんし。

* [Higher-order function - Wikipedia, the free encyclopedia](https://en.wikipedia.org/wiki/Higher-order_function)

お、言及がありますね。

> All other functions are _first-order functions_.

higher-order function 以外の、「関数を引数に取らず、返すこともない関数」は “first-order function” だそうです。“lower” ではなく、“first” ですか。

ここでの “order” は、どうやら「序列」「階級」の意味で、「高階」は、「階級がより高い」「より上等な」の意味の訳語のようです。だったら、「高級関数」「上等関数」の方がありがたみがありますね。“first-order” は、階級を低い順に数えた際に一番目であるというのと同時に、「最初にあった」関数として、おおもとの「関数（function）」がレトロニムとして “first-order function” と呼ばれるようになった模様。ググると、“first-order function” には「一階関数」という訳語を用いている例もありますね。私としては初耳ですが。

まとめると、「高階関数」とは、従来の関数（一階関数）に比べて、より抽象化・汎用化されたことで、高度な（階級の高い）関数として、「高階関数（higher-order function）」と呼ばれたと。汎用度がより高いので、振る舞いの面から「汎関数」とも呼ばれます。
Source Tree でコミットを選択しても、すべてのファイルが表示されない


上部パネルのコミット選択しても、下部右側にすべてのコミット表示されなかった。

✔ Select all files when selecting commit
http://ndinc.d.pr/XYZR/33mBg0PN

っていうのが設定が、普通に探したらあった。
PHP simplexml_load_fileでRSS1.0を取得する

# PHPでRSS取得してみた
「RSSやATOMフィードがあれば欲しいな～、なければ空文字でいいよ」ってことで作ることになった。

## 最初にやったこと
simplexml_load_file使えば楽勝じゃんと思ってこんなコードを書いた。

```php
    /**
     * RSSを取得する
     * @param string $rss RSS URL
     * @return SimpleXMLElement|string
     */
    public function getRss($rss)
    {
        $xml = '';
        // RSSのURLがありならRSS取得
        if ($rss) {
            $xml = simplexml_load_file($rss);
        }
        return $xml;
    }
```

`getRss`とかいってるけどATOMでも大丈夫だぜー！

## RSS1.0
「RSS1.0の`dc:date`が取れてないよ」ってことでちょっと追加した。

```php
    /**
     * RSSを取得する
     * @param string $rss RSS URL
     * @return SimpleXMLElement|string
     */
    public function getRss($rss)
    {
        $xml = '';
        // RSSのURLがありならRSS取得
        if ($rss) {
            $xml = simplexml_load_file($rss);
            if ($xml->item) {
                // RSS1.0
                foreach ($xml->item as $entry) {
                    $dc = $entry->children('http://purl.org/dc/elements/1.1/');
                    $date = $dc->date;
                    $entry['date'] = $date;
                }
            }
        }
        return $xml;
    }
```


こんな感じになった。

```
item: [
	{
		@attributes: {
			date: "2013-10-04T00:45:00+09:00"
		},
		link: "リンク",
		title: "タイトル",
		description: "デスクリプション"
	},
]
```

ひとまずOK。よっしゃよっしゃ。
xcodeでwebviweを使うときに参考にしたサイト一覧(Swift )

http://qiita.com/drobune/items/17295b2de6663b56785a

http://mae.chab.in/archives/2652

http://kzy52.com/entry/2015/02/20/000838

https://akira-watson.com/iphone/web-browser.html

http://swift-salaryman.com/uiwebview.php
Rails に新たな env を追加する方法

Railsはデフォルトで以下のenvがありますが、別のenvを追加したい時もありますよねー
**(Rails4.1検証)**

* test
* development
* production

## 例えば Staging というenvでサーバを立ち上げたい

以下のファイルを作成、修正し、RAILS_ENVの環境変数を指定して実行すればOK！！

### 1 **config/database.yml** に staging 設定を追記する。

適当に production の設定をコピーするなどして以下の様な設定を入れます。
(mysqlを使っているパターン)

```
...省略
staging:
  adapter:   mysql2
  encoding:  utf8
  charset:   utf8
  collation: utf8_general_ci
  database:  mydb_staging
  pool:      5
  username:  staging_user
  password:  password
  host:      localhost
```

### 2 **config/secrets.yml** に staging のキーを追加

```
staging:
  secret_key_base: abcafd..省略
```

ちなみに、以下のコマンドにて secret key は自動生成できました

```
$ bundle exec rake secret
```

### 3 **config/environments/staging.rb** を作成

こちらも適当に `config/environments/production.rb` などをコピーして必要な箇所を変更して作成します。

### 4 **migrate** の実行

staging用のDBが無いと思うので、DB作成とマイグレートを実行します。

```
$ RAILS_ENV=staging bundle exec rake db:create
$ RAILS_ENV=staging bundle exec rake db:migrate
```

### 5 必要に応じてその他gemでenv依存のある設定を `RAILS_ENV=staging` として環境変数を指定して実行します。
特にenvに依存する設定がなければとばしてください。

```例えばseed_fu
$ RAILS_ENV=staging bundle exec rake db:seed_fu
```

### 6 RAILSアプリサーバの起動

5項までの設定で `rails server` を `staging` の env で立ち上げることができると思います。

```
$ RAILS_ENV=staging bundle exec rails server
```

以上です。簡単ですが忘れがちなので備忘録のため。（バージョンが変わるとだめになるかもしれません）
c++ builder XE4, 10.2 Tokyo > 階層構造のTPanelからTFormを取得する > TComponent *owner = Panel1_1_1->Owner;

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

Form314:TFormに以下の階層でTPanelがあるとする。

Panel1
..Panel1_1
....Panel1_1_1
  
Panel1_1_1などからForm314のポインタを取得するには
(Unityでいうところの [.GetComponentInParent()](http://docs.unity3d.com/jp/current/ScriptReference/GameObject.GetComponentInParent.html) )


Ownerというのでよさそう。

```cpp
void __fastcall TForm314::Button1Click(TObject *Sender)
{
	TComponent *owner = Panel1->Owner;
	OutputDebugString(owner->Name.c_str());

	owner = Panel1_1->Owner;
	OutputDebugString(owner->Name.c_str());

	owner = Panel1_1_1->Owner;
	OutputDebugString(owner->Name.c_str());
}
```

```txt:結果
デバッグ出力: Form314プロセス Project1.exe
デバッグ出力: Form314プロセス Project1.exe
デバッグ出力: Form314プロセス Project1.exe
```
Mac OS X El Capitan で「写真」アプリに取り込んだファイルを Finder で開く方法

Mac 初心者が困ったシリーズ。

Apple の「写真」アプリでは、ファイルの実態にアクセスしたくてもパスの情報が表示されない！ファイルをコピーして云々したいのに困った！

## 手順

1. Finder で 自分のユーザーフォルダのピクチャを表示。
2. その中にある「写真ライブラリ」のコンテキストメニューを開いて、パッケージの内容を表示を選択します。<br><img width="351" alt="スクリーンショット 2015-10-29 9.18.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/25283/23c1035b-e594-e5d7-efc8-737dc0976cad.png">
3. 「Masters」フォルダの中に、ファイルを取り込んだ日時の「年/月/日/年月日-時分秒」フォルダが作成され、その中に配置されています。<sub>注1</sub><br><img width="1153" alt="スクリーンショット 2015-10-29 9.33.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/25283/9f1e4e86-13a1-c698-b027-f07692349591.png">

以上になります。

## 注釈

1. フォルダ名の日時は[グリニッジ標準時](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AA%E3%83%8B%E3%83%83%E3%82%B8%E6%A8%99%E6%BA%96%E6%99%82)に基づいているようで、日本時間と9時間ずれています（9時間前）。
基本的かもしれないけどエイリアス(alias)とは

基本的なことですが、エイリアス(alias)の使用方法について、
簡単にまとめてみました。

# エイリアス(alias)とは

Linuxなどでよく利用するシェル（bash）上では，長いコマンド名を短い名前に置き換えたり，
常に指定するオプションをあらかじめ設定したりできます。
→これを実現するのが，エイリアス（alias＝別名）です。

# どう使えるの？

下記のようなコマンドを実行することで、「別名」で「本来のコマンド」を実行することが出来ます。

    $ alias 別名='本来のコマンド'

## 実例

*catコマンド使用時に行番号を常に表示させるようにします。*

    ★alias 設定前
    $ cat test.txt
    test1
    test2
    test3
    test4
    test5
    test6
    test7
    test8
    test9
    
    ★alias 設定
    $ alias cat='cat -n'
    
    ★alias 設定後
    $ cat test.txt
         1  test1
         2  test2
         3  test3
         4  test4
         5  test5
         6  test6
         7  test7
         8  test8
         9  test9

*<font color="#ff0000">※上記の方法では、再ログイン後に元(alias設定前)に戻ってしまいますので注意</font>*

# 再ログイン後も元に戻らないようにするには

*~/.bashrc に記載しましょう。*
→ログインした時に実行される設定用のシェルスクリプトのこと

    ★~/.bashrc にalias を追記
    $ echo "alias cat='cat -n'" >> ~/.bashrc
    
    ★~/.bashrc に追記されたことを確認
    $ tail -n 4 .bashrc
        . /etc/bash_completion
      fi
    fi
    alias cat='cat -n'
    
    ★~/.bashrc を即時反映
    $ source ~/.bashrc

# 【参考】エイリアス(alias)の設定を無効化したいとき

・同名のコマンドとしてalias設定をしたが、設定を無効にして実行したいときは、 実行するコマンドの先頭に \ をつけます。

    $ \cat test.txt
    test1
    test2
    test3
    test4
    test5
    test6
    test7
    test8
    test9

・alias設定を無効にしてしまいたいときは、unalias を使用します。

    ★alias を無効化
    $ unalias cat
    
    ★cat を実行
    $ cat test.txt
    test1
    test2
    test3
    test4
    test5
    test6
    test7
    test8
    test9


以上です。
tmux v2.1からmouse関連の設定が変わった

El Capitanをクリーンインストールしたので、brew関連もセットアップし直してtmuxを起動したところ、
tmuxのmouse設定が置き換わってました、という話です。

## バージョン
```
$ tmux -V
tmux 2.1
```

## 事象
tmux起動するとこんなエラーが出るようになった。

```
.../.tmux.conf:23: unknown option: mouse-select-pane
.../.tmux.conf:24: unknown option: mouse-select-window
.../.tmux.conf:25: unknown option: mouse-resize-pane
.../.tmux.conf:26: unknown option: mode-mouse
```

どうもmouse関連の設定が無くなった？らしい。で、tmuxのサイトを調べてみた。

https://tmux.github.io/ の[changelog](https://raw.githubusercontent.com/tmux/tmux/master/CHANGES)から引用

> * Mouse-mode has been rewritten.  There's now no longer options for:
	- mouse-resize-pane
	- mouse-select-pane
	- mouse-select-window
	- mode-mouse
>
>  Instead there is just one option:  'mouse' which turns on mouse support
  entirely.

`mouse`だけでよくなったらしい。

## 対処

`mouse-xxx`とか`mode-mouse`は外して、`mouse on`に置き換え。

```vim:.tmux.conf
# history size
set-option -g history-limit 10000
#set-option -g mouse-select-pane on
#set-option -g mouse-select-window on
#set-option -g mouse-resize-pane on
#set-option -g mode-mouse on
set-option -g mouse on
```

後から気づいたんだけど、`mouse on`だけだとスクリーンがスクロールしないことが判明。
いろいろググった結果、さらに設定を追加しました。

https://github.com/tmux/tmux/issues/145

```vim:.tmux.conf
set-option -g mouse on
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"
```

issueにコメント載せている`@NHDaly`は、それらを集約してtmuxプラグインを作成した模様。
こういう展開はいいなー。

https://github.com/NHDaly/tmux-scroll-copy-mode

tmuxも結構長いこと使っているので、他にも気づかないうちに変わっている箇所があるのかも。
Qiita > ヘッダーの違い > Rubyつき / Javaなし

Qiitaのサイトを `site:qiita.com @param`などでgoogle検索した結果の一部が以下。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/213c5f2b-9090-4de2-841d-3fb0961acb65.png)

タイトルの先頭に主要タグの言語(PHP / Rubyなど)がつくのはQiitaのシステムによるのだが、３つめの「ちょっと特殊なJavaのアノテーション」には「Java - 」がついていない。

投稿は今年の7月なので、古いシステムバージョンで投稿したということでもなさそう。

一部の記事だけ別扱いなのだろうか?
dotNet > GUIと非同期処理 > SynchronizationContext > WPFとWindowsフォームのディスパッチャーの違いを吸収

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
2.2 GUIと非同期処理

> ...UIの更新はUIスレッド上で行う必要があります。そのため、UIスレッドに処理を渡すためのディスパッチャーというものを通す必要があります。ディスパッチャーは、WPFを使うか、Windowsフォームを使うかによって書き方が異なります。

- WPF : Dispatcherクラスを利用
- Windowsフォーム : ControlクラスのInvokeメソッド利用
とのこと

> また、この差を吸収するために、同期コンテキストという仕組みがあります。SynchronizationContextクラスのPostメソッドを使うことで、適切なディスパッチャーを経由した処理を行うことができます。

<hr>

[非同期処理とディスパッチャー](https://ufcpp.wordpress.com/2012/04/26/%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86%E3%81%A8%E3%83%87%E3%82%A3%E3%82%B9%E3%83%91%E3%83%83%E3%83%81%E3%83%A3%E3%83%BC/)
> 上記の通り、WPFやSilverlightではDispatcherを使いますが、例えばWindowsフォームの場合はControlクラスのInvokeメソッドを使います。
.
この差を吸収するためのものが同期コンテキストです。SynchronizationContextを使います。現在のコンテキストを、Current静的プロパティで取得して、それにPostすることで、所望のスレッドに制御を移します。
dotNet > GUIと非同期処理 > ディスパッチャー / BackgroundWorkerクラス ( .NET4: Taskクラス)

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
2.2 GUIと非同期処理

> ...以下のような仕組みを利用する場合が多くなります
- ディスパッチャー
...
- BackgroundWorkerクラス (*2)
...

> *2 ただし、非同期処理は、.NET Framework4で導入されたTaskクラスに置き換わりつつあります。

<hr>
[WPF の Dispatcher について勉強してみた](http://d.hatena.ne.jp/hilapon/20130225/1361779314)
> しかしアプリケーションの要件によっては非同期にオブジェクトにアクセスしたいシーンもある筈です。また重い処理を実行している間も UI を更新したいケースもあります。そこで WPF では、スレッド関連の操作を開発者に提供するため、Dispatcher クラスを用意しています。

[Dispatcher クラス @ MSDN](https://msdn.microsoft.com/ja-jp/library/system.windows.threading.dispatcher(v=vs.110).aspx)

<hr>
[Unity(ゲームエンジン)上で async/await](http://ufcpp.net/blog/2015/07/unityasyncbridge/)
> .NET 3.5相当(WPFとか除く)

Unity 5.1.3fなどではTaskクラスでなく、BackgroundWorkerクラスということらしい。
Androidビルド時に "Error type 3 Error: Activity class { 【Activity名】 } does not exist." と出る。

Androidでビルドしたらエラー出てできなかった。
エラーの内容は以下の通り。

```
Error type 3
Error: Activity class { 【Activity名】 } does not exist.
```

この時に、「Edit Configurations」を表示すると、画像の下部のような
「The module cannot be Android library」というエラーが出ていた。  
  
  
<img width="1071" alt="Screen Shot 2015-10-29 at 6.51.53 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/74312/e2122b18-27c2-5e11-5ec8-9467573c0e46.png">  


「 module...? 」ってことは、build.gradleかな？　ってことで、
build.gradleを確認すると、一行目に

```
apply plugin: 'com.android.library'
//apply plugin: 'com.android.application'
```

ごちゃごちゃしてて、applicationってことになっていなかった(?)ぽい。
これを下記のように修正

```
//apply plugin: 'com.android.library'
apply plugin: 'com.android.application'
```

で、ビルドしたらでけた！

やったね！
技術英語 > I doubt that's going to help.

@ Star Trek Voyager > LEARNING CURVE

言うことを聞かない部下への処分についてTuvokが案をあげたが、Janeway艦長が

> I doubt that's going to help.

I don't think that's going to help よりは否定の度合いが強いのだろうか？　未消化。

<hr>
関連して思い出したのはロビンウィリアムズさんの Mrs. Doubtfire に出てくる

> Doubtfire (または doubt fire)

ずいぶん前に映画を見た時は「不審火」なり「ぼや」なりの日本語訳がついていたように思うが、今"doubt fire"で検索しても訳が出てこない。
Intellijでレイアウトが崩壊した時の対処法

諸事情によりIntellijでフォントを色々変えていた所、
とあるフォントに設定して、、、

[Apply]ボタンをクリックすると・・・

***レイアウトが崩壊***

ぁゎゎ ヽ(ﾟ○ﾟ ;ヽ)三(ノ; ﾟ□ﾟ)ノ ぁゎゎ

ってなったので、
対処法をメモ。

# 対処法

使っているIntellijのバージョンが15の場合...

```basu
$ rm -rf ~/.IntelliJIdea15/
```
一応このディレクトリの位置はdebianの場合です。

で、もう一度起動すると...
一番最初に起動した時みたいに起動します！
あとは、みなさんの好きなように設定して下さい。

# ご指摘など
コメントなど大歓迎です。
ご指摘・加筆依頼などございましたら
コメント欄・編集リクエストにてお知らせください。
pandocでGitHub風CSSを内包したhtmlを生成する君用意した

## 参考

* [[Pandoc で github 風 CSS を使った standalone な html を生成 - Qiita]](http://qiita.com/griffin_stewie/items/95026360fdfca1bd8e33)

## Download

* [tukiyo/pandoc-md2github1html](https://github.com/tukiyo/pandoc-md2github1html)

## 使い方

```
./convert.sh README.md
firefox README.html
```

## thanks

* css/github.css
    * https://gist.github.com/andyferra/2554919
* css/para.png
    * https://raw.githubusercontent.com/gollum/gollum/master/lib/gollum/public/gollum/images/para.png
* css/dirty-shade.png
    * https://raw.githubusercontent.com/gollum/gollum/master/lib/gollum/public/gollum/images/dirty-shade.png
テストが通った時だけ`npm publish`する

`npm prepublish`は、`npm install`時に[実行してしまいます](https://docs.npmjs.com/misc/scripts)。
この記事では、それを回避する方法と、`TravisCI`で利用する方法を紹介します。

方法は、`.travis.yml`の`after_success`と、`package.json`の`scripts`をうまく連携させます。
まず、下記のnpm scriptsを書きます。

```json
{
  "scripts": {
    "prepublish": "node -e \"if(process.env.TRAVIS_PASSED){}else{process.exit(1)}\" && npm run compile || echo skip prepublish"
  }
}
```

これは以下のように動作します。

```bash
npm run prepublish
# skip prepublish

TRAVIS_PASSED=true npm run prepublish
# > npm run compile
```

`compile`スクリプトには、`publish`用のコンパイルスクリプトを書いて下さい（たとえば：`babel src --out-dir lib`）。

srcで完結しているモジュールであれば、`package.json`の`main`を`lib`に指定してやれば、gitで`lib`を管理せず済みます。

最後に、利用している`.travis.yml`に、下記を追記します。（事前に[npm Releasing - Travis CI](http://docs.travis-ci.com/user/deployment/npm/)を設定する必要があります）

```yaml
after_success:
  - export TRAVIS_PASSED=true
```

テストが通れば、`npm publish`の直前にだけ、`npm run compile`が[実行されます](https://travis-ci.org/59naga/carrack)。
ftp://user:pass@hostname にcliからアクセスする

## ftp://user:pass@hostname でアクセス

* xubuntuに最初から入っているftpコマンドだと以下方法では接続ができなかった。
    * ftp; open hostname; user; pass; で接続できるがコピペの回数を減らしたかった。

```bash:接続できない
ftp ftp://user:pass@hostname
```

lftpならできた。

```bash:接続できた
lftp ftp://user:pass@hostname
```

## Fatal error: Certificate verification: Not trusted

* lftp でこのエラーがでた。
* [lftp - 致命的エラー: Certificate verification: Not trusted - 憩いの場【Linux】](http://linux.ikoinoba.net/index.php?UID=1323876082)

```bash:SSLをoff
set ftp:ssl-allow off
```

これで転送できるようになった。

## 転送

```bash:
mputs *.zip
dir
```
VirtualBoxでGuestを固定IPにする方法のメモ

インターフェイスはNATとホストオンリーの２つを用意。
eth1の設定で `gateway` を**設定しない**こと。

`/etc/network/interfaces`

```bash
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet static
address <static ip address>
netmask 255.255.255.0
```
EventEmitterをPromiseに対応させる

`react-router@1.0.0-rc3`を使っていると、onEnterでStoreを更新して、終わってからRouteへ移動したい。Angularで言うui-routerのresolveが欲しいと思っていました。

`EventEmitter`を継承して`.emit`をオーバーライドすれば対応可能です。軽くテストを通した[ライブラリも公開しています](https://github.com/59naga/carrack)。[^1]

[^1]: `v0.4.0`から、`.emit`は`.emitParallel`にメソッド名を変更しました。

具体的には下記のように実装します。

```js:async-emitter.js
// Dependencies
import {EventEmitter} from 'events'

// Public
class AsyncEmitter extends EventEmitter{
  emit(event,...args){
    let promises= []

    this.listeners(event).forEach(listener=>{
      promises.push(listener(...args))
    })

    return Promise.all(promises)
  }
}

export default AsyncEmitter
```

最後に[Promise.all](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)で結果を梱包するので、配列の結果か、最初のエラーを補足します。

```js:async-emitter-test.js
import AsyncEmitter from './async-emitter'

let emitter= new AsyncEmitter

// Add event listeners
emitter.on('foo',(arg1)=>{
  return new Promise((resolve,reject)=>{
    if(arg1==null){
      resolve('bar')
    }
    else{
      reject(new Error('beep'))
    }
  })
})

// Dispatch the `foo` event
emitter.emit('foo')
.then(values=>{
  console.log(values[0] === 'bar') // true

  // expect to be rejected
  return emitter.emit('foo','kaboom')
})
.catch(reason=>{
  console.error(reason.message === 'beep') // true
})
```

```bash
babel-node async-emitter-test.js
true
true
```

`react-router@1.0.0-rc3`では、[onEnterの第三引数にcallbackを受けます](https://github.com/rackt/react-router/blob/v1.0.0-rc3/modules/TransitionUtils.js#L24-L33)ので、上手く活用出来ると思います。
PhpStormにWordPress-Coding-StandardsのCode Snifferを設定する。Mac編

WordPressのコーディングルールに準拠しているか、
Code SnifferをPhoStormに設定していると即座に確認できて便利です。
[WordPress-Coding-Standards](https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards)

## 環境
- Mac OS X 10.10.5
- IntelliJ IDEA 14.1.5 (PhpStormでも同様に設定できるはずです)

## インストール

### 事前にPHP_CodeSnifferをインストール
今回はpearで入れてみました。pearのインストールは割愛

```bash
sudo pear install PHP_CodeSniffer
```

### WordPress-Coding-Standardsをインストール

```bash
cd /usr/local/lib
git clone -b master https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards.git wpcs
cd wpcs
sudo phpcs --config-set installed_paths /usr/local/lib/wpcs
phpcs -i  // WordPress-Core等が入ったことを確認。
which phpcs // pathを確認 後で使います
```

## PhpStormでの設定
- PhpStormのLanguages & Frameworks→php→Code Snifferパネルを開く。  
- Configration:Local右の…ボタンをクリック。  
- PHP Code Sniffer(phpcs)path:の枠に先ほど`which phpcs`と打って出てきたpathを入力してValidateボタンを押す。
- Editor→InspectionsでPHP Code Sniffer validationにチェックを入れて有効化。
- 右のパネル下にあるCoding Standard横の更新アイコンを押してみるとWordPressなどが選べるようになります。

![WordPress-Coding-Standards.png](https://qiita-image-store.s3.amazonaws.com/0/42028/16e85e2e-9d56-4a35-0d5d-971249bb9af7.png)

## 次回以降の新規プロジェクトでの設定
- Editor→InspectionsでPHP Code Sniffer validationにチェックを入れて有効化。
今日がどこかを忘れたら叩くワンライナー

まあネタで。

```bash:今日はどこ?
$ python -c "from calendar import TextCalendar as c;from datetime import datetime as d;import re;print(re.compile(r'(\s+)({})(\s+)'.format(d.today().day)).sub(r'\1\033[92;4m\2\033[0m\3', c().formatmonth(*d.today().timetuple()[0:2])))"
```

卓上カレンダー?知らんな
ChromeコンソールでXPathのテスト


Chromeのコンソールやっぱ便利

ほしいなと思って調べてみるとあるもんですね

今回は、ある商品の入荷情報を取得する

<img src="https://qiita-image-store.s3.amazonaws.com/0/69007/ac1097fb-a9d2-67af-849e-cc629b73f336.png" width="600">

取得対象はこちら

<img src="https://qiita-image-store.s3.amazonaws.com/0/69007/90fd354d-57a8-2baf-e805-43d1a0bc57f0.png" width="600">

構造を見るとこうなので

```
$x('//div[@id="availability"]/span')
```

Chromeのコンソールでこのように入力してみる

<img src="https://qiita-image-store.s3.amazonaws.com/0/69007/a111e938-0afb-cb8b-db7c-44ae62698af9.png" width="600">

やったぜ！対象が取得できました。

## 参考

[Testing XPath in Google Chrome browser](http://www.jittuu.com/2012/2/14/Testing-XPath-In-Chrome/)

## XPath自体の参考

[XPath の例](https://msdn.microsoft.com/ja-jp/library/ms256086%28v=vs.120%29.aspx?f=255&MSPPError=-2147217396)
二次元配列

参考url
http://monge.tec.fukuoka-u.ac.jp/Ruby19x/prog_learn_Array_2D_01.html

「やり方を覚えて今度は自分でやってみよう」と思える人なら率先して教えようと思うのですが、「詳しいアイツに聞けば勝手にしてくれるだろう」と自己解決しようと言う気のない人に対しては、何かしてあげようと言う気にならないんですよ。
Password生成する1行JavaScript (ver.2)

http://qiita.com/amoO_O/items/3952e09f892ba1992e94
これの第2版

Chrome で window.open().document.innerText を書き換えると、呼び出し元も書き換わるようになってしまった。

調べるのも面倒なので alert を出すように変更。

```js
javascript:(function(n,w,r,i,x,c){for(x=w.map(c=function(s){return s.slice(r()*s.length)[0]}).join("");!x[n-1];)x+=c(w.join(""));for(;i<n;)w=x[i],x[i++]=x[c=Math.floor(r()*n)],x[c]=w;alert(x)})(16,["abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ","0123456789","+/"],Math.random,0)
```

小文字、大文字、数字、記号(+/) を最低1つずつ使い、長さ16の文字列を生成する。
Ruby Process基礎まとめ

# Processとは
プロセスを管理するためのモジュール
デーモンプロセスを生成したり、操作したりできる。
また、子プロセスを複数用意して、時間のかかる処理を複数のプロセスで処理することができる。

# 子プロセスの生成
子プロセスは親プロセスのコピーとして始まる。
スレッドとは違いメモリは共有されないため、親プロセスと子プロセスで値は共有されない。

```rb:ブロック有り(process_01.rb)
pid = Process.fork {
  puts 'From child process'
}
```

```rb:ブロック無し(process_02.rb)
pid = Process.fork

if pid 
  # 親プロセスの処理
  puts "forked: #{$$}"
else
  # 子プロセスの処理
  puts 'From child process'
end
```

```bash:Result(process_02.rb)
% ruby process_02.rb
forked: 12080
From child process
```

# 子プロセスの待ち合わせ
子プロセスの終了前に親プロセスが終わると孤児になる。
いくつかある待ち合わせメソッドを使いましょう。

```rb:waitpid
pid = Process.fork {
  #
  sleep 2
}

p Process.waitpid pid
```
* waitpid → 指定のpidの終了をまつ
* wait → 子プロセスのどれかが終了するのを待つ
* waitall → 全子プロセスが終了するのを待つ

# プログラムのデーモン化
> デーモンは，LinuxやUNIXにおいてメモリ上に常駐して様々なサービスを提供するプロセスを指します。 デーモンプロセスは処理要求を待ち続け，要求があると自分自身をコピーしたプロセスを作り，コピーしたプロセスに処理を実行させます。デーモンの意味は，悪魔の「demon」ではなく守護神の「daemon」です。
参考:[デーモンとは？](http://begi.net/read/base/13.html)


```rb:e.g.)現在時刻を返すサーバ
require 'socket'                                                                                                                                                                     

Process.daemon

TCPServer.open 'localhost', 4423 do |server|
  loop do
    client = server.accept

    client.puts Time.now

    client.clone
  end 
end
```

```bash:Result
% telnet localhost 4423
Trying ::1...
Connected to localhost.
Escape character is '^]'.
2015-10-29 01:14:54 +0900
```

# 参考
[パーフェクトRuby](http://www.amazon.co.jp/dp/4774158798)
RealmSwiftをCocoaPodsで導入する

CocoaPodsでのRealmSwiftの導入がびっくりするぐらい簡単だったのでメモ。
基本的には公式に書いてあることと一緒。
https://realm.io/jp/docs/swift/latest/

# バージョン
OS X El Capitan
Swift 2.1
Xcode 7.1

# CocoaPodsをインストール
```
$ sudo gem install cocoapods
$ pod setup
```

# XcodeProjectにRealmSwiftをインストール
プロジェクト名は Sample とします。

ターミナル上でXcodeProjectの.xcodeprojectがあるディレクトリに移動。
以下を実行。

```
$ pod install
```

上記コマンドを実行後、Podfileが作成される。
Podfileの内容を以下のように修正。

```Podfile:Podfile
\# Uncomment this line to define a global platform for your project
\# platform :ios, '8.0'
\# Uncomment this line if you're using Swift
use_frameworks!

target 'Sample' do
    pod 'RealmSwift'
end

target 'SampleTests' do
    pod 'RealmSwift'
end
```

Podfileのあるディレクトリで以下を実行。

```
$ pod install
```

CocoaPodsによって作られた.xcworkspaceファイルを開く。

# 動作確認
とりあえず、RealmSwiftをインポートしてみる。

```
import 'RealmSwift'
```

このままだとエラーが表示されるが、一度ビルドを行うとエラーが消えるはず。
AOSPにあがっているサンプルのRecyclerViewのアイテムクリックリスナ実装方法

こちらの方のRecyclerViewのアイテムクリックに関する記事があり、素直な感じで分かりやすく、良いなと思いました。
RecyclerViewのアイテムクリック
http://qiita.com/ushi3_jp/items/ba0df2df6b0b77278f14


今日紹介するのはAOSP(Android Open Source Project)に上がっているクリックリスナの付け方についてです。

一応AOSPにあがっているので少し安心できるのかなと思っています。
ActivityでRecyclerViewを利用するところでこんな感じで書きます。

```java
recyclerView.setAdapter(new MyAdapter(this, Cheeses.sCheeseStrings) {
    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        final MyAdapter.ViewHolder vh = super.onCreateViewHolder(parent, viewType);
        vh.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final int pos = vh.getAdapterPosition();
                // ここにクリックした時の処理を書く
            }
        });
        return vh;
    }
});
```

https://android.googlesource.com/platform/development/+/82905bae66f4e776fd3d675ed1869003d2b0c31f/samples/Support7Demos/src/com/example/android/supportv7/widget/RecyclerViewActivity.java#52

具体的にはRecyclerView.Adapterを継承して作ったアダプタークラスを更に無名クラスで継承して、onCreateViewHolderをオーバーライドして、そのメソッド内でsuper.onCreateViewHolder()を呼んで、帰ってきたViewHolderのitemViewにリスナーを付ける形です。
メリットとしては実装量が少ない、Adapterにリスナーの実装を書かなくて良いなどでしょうか。
この方式も利用することも検討してみると良いかもしれません。

最初に書いた記事を真似して、ActivityにOnClickListenerを実装させる形式であれば、OnClickListenerは一つで済みそうですね
[解決]ゲストOSが opscode Centos6.5 で vagrant mount ができない


OSX 10.9.5
Virtualbox 5.0.6 r103037
Virtualbox Guest Additions 5.0.6
vagrant 1.7.4
CentOS 6.5(ゲストOS)

上記の環境で
opscode の [CentOS6.5](http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box) で、`vagrant up` 途中で下記のような mount 失敗エラーがでる

```
    default: /vagrant => /projects/vagrant/guest_name
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

```
$ sudo /etc/init.d/vboxadd setup
```

~~~
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
The headers for the current running kernel were not found. If the following
module compilation fails then this could be the reason.
The missing package can be probably installed with
yum install kernel-devel-2.6.32-431.el6.x86_64

Building the main Guest Additions module                   [失敗]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
Doing non-kernel setup of the Guest Additions              [  OK  ]
~~~

kernel-devel-2.6.32-431.el6.x86_64 をインストールしろと言われるので、
外部サイトから rpm をインストール

```
$ sudo yum install -y http://vault.centos.org/6.4/cr/x86_64/Packages/kernel-devel-2.6.32-431.el6.x86_64.rpm
$ sudo /etc/init.d/vboxadd setup
```

`uname -a`のkernelバージョンをあわせないと、
最新版 [kernel-devel-2.6.32-504.el6.x86_64.rpm](http://vault.centos.org/6.5/cr/x86_64/Packages/kernel-devel-2.6.32-504.el6.x86_64.rpm) をインストールしても直らない

ゲストOSを再起動

```
vagrant halt
vagrant up
```

以上で、解決しました。
Pepperに測域センサを追加する

　皆さん，もう何となくお気づきでしょうが，Pepperは[URG](http://www.hokuyo-aut.co.jp/search/single.php?serial=17)に対応しています．
　Pepperのお兄さんであるNAOがURGに対応しているので，どうせソフトウェアは共通化されてるだろ，と試してみたら，ビンゴでした．

![Pepperと測域センサ](https://pbs.twimg.com/media/CSZrNjUVEAABFem.png)

**この記事ではPepperを分解し，追加のセンサを接続します．保証を受けられなくなる可能性が高いので，追試を行う場合は自己責任でお願いします．**

![余計なセンサをつけられてけだる気なPepper](https://pbs.twimg.com/media/CSTB6GTUEAAwKpX.jpg)

# 用意するもの
・Pepper
・USB接続タイプのURG（測域センサ）[URG-04LX-UG01](http://www.hokuyo-aut.co.jp/search/single.php?serial=17)
・USB2.0ミニBケーブル（URG接続用）
・USB2.0延長ケーブル（Pepper内部のUSB端子を引き出す用）
・4ピンPHコネクタ - ソケット＆ピン

# 工作
## ケーブル
　USB2.0延長ケーブルを途中で切断すると，中には4色の配線が通っています．これらをそれぞれPHコネクタの1番ピンから，黒・緑・白・赤の順で配置します．

![作成したケーブル](https://pbs.twimg.com/media/CSZvkq6UsAAjNmg.jpg)

裏から見た写真はこちら．
![Pepper内部USBコネクタのピン配置](https://pbs.twimg.com/media/CSZvkBpUkAAh8Uy.jpg)

## 3Dプリント
　[GitHubのプロジェクト](https://github.com/yoneken/naoqi_driver/tree/Add_URG_for_Pepper/doc/stl)に，3Dプリント用のSTLファイルを置いておいたので，こちらをプリントしてください．Pepper足裏のネジ穴に固定する板と，URGを搭載するタワーの2つのパーツに分かれています．実際に使用する際は，両方をM3のネジで締結してください．

![Pepper用URGマウント](https://pbs.twimg.com/media/CSVSUEPUAAABzqf.png)

＊タワーの前に出ている，薄いヤワそうな部分は，プリント時に部材がプリンターの床からはがれるのを防止する部分です．プリント後は，切り離して捨ててしまってください．

# 取り付け
## USB延長ケーブル
 まず，Pepperの背中のカバーを開けて，内部のUSB用コネクタを露出させます．
　肩の側からカバーを外していくのですが，首もとの緊急停止スイッチを覆っているゴムカバーを開けた後，背中と胸のカバーのつなぎ目の位置に鉛直下方向にまっすぐ力をかけると，両者を接続している爪がパチッと外れるので，そのまま背中カバーだけ後ろに引き抜きましょう．片側ずつ行いましょう．両方外れると，下側は磁石で張り付いているだけなので，容易に外れると思います．
　その中にさらに内カバーがついていますが，こちらも上側の爪でひかかっているので，それを見つけて外してやれば，容易に外れます．
　Pepperの背中に載っているプリント基板には，右下あたりの背中のファンを回す用のUSBのコネクタがささっている場所付近に，PH4ピンのハウジングが何もささっていないまま放置されているはずです．ここに，作成したUSBの延長ケーブルを取り付けましょう．Pepper腰周りの隙間を通すと，背中カバーを完全に取り付けたまま，USBの配線を引き出すことができます．

## URGマウント
　プリントした板とタワーのパーツを，ネジで締結してください．その後，タワーの先にURGをネジ止めしてください．このとき，URGの向きに注意．最後に，Pepperをひっくり返して，足裏のネジ穴に，マウントを固定してください．

　終わったら，延長ケーブルごしにURGと接続してください．

# 確認
## Choregraphe
　Pepperの電源を入れると，URG上方のパイロットランプが点灯します．また，Pepperが立ち上がった後なら，ChoregrapheのMonitorツールでlasetpluginを選択すると，URGの出力をそのまま可視化した図を見ることができます．

## rviz (ROS)
　[こちらのスライド](http://www.slideshare.net/k_yone/pepper-meets-ros-52177729)を参考に，Pepper on ROS環境を作成したら，naoqi_driverだけ[私のリポジトリ](https://github.com/yoneken/naoqi_driver/tree/Add_URG_for_Pepper)からダウンロードしてきてビルドしてください．そうしたら，いつも通り，

$ roslaunch pepper_bringup pepper_full.launch nao_ip:=*PepperのIPアドレス* network_interface:=wlan0

とし，rvizで可視化すると，以下の図のように/pepper_robot/laserのメッセージから，URGの出力を見ることができます．

![rvizによる可視化](https://pbs.twimg.com/media/CSZrNj6UsAA7qvF.png)
Android Advertising ID を取得する

Android広告IDを取得する最小なサンプルコードを作ってみた。
注意すべき点は

- `AdvertisingIdClient.getAdvertisingIdInfo()`はメインスレッドから呼ぶと`IllegalStateException`例外となるので、UIスレッドとは別のスレッドで取得する必要がある。
- `AdvertisingIdClient.Info.isLimitAdTrackingEnabled()`の設定に関わらず広告IDは取得できてしまうので、実際に広告IDを使うアプリケーションは`isLimitAdTrackingEnabled()`の値を考慮した実装とする必要がある。

```java:MainActivity.java
package jp.gr.java_conf.fofn.advertisingid;

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import com.google.android.gms.ads.identifier.AdvertisingIdClient;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesRepairableException;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "AdvertisingId";

    class AdIdTask extends AsyncTask<Void, Void, String> {
        private Activity mActivity;

        AdIdTask(Activity activity) {
            mActivity = activity;
        }

        @Override
        protected String doInBackground(Void... params) {
            String advertisingId = "";
            try {
                AdvertisingIdClient.Info info =
                        AdvertisingIdClient.getAdvertisingIdInfo(mActivity.getApplicationContext());
                advertisingId = info.getId();
            } catch (GooglePlayServicesNotAvailableException e) {
                Log.e(TAG, "GooglePlayServices not available.");
            } catch (GooglePlayServicesRepairableException e) {
                //
            } catch (IOException e) {
                //
            }
            return advertisingId;
        }

        @Override
        protected void onPostExecute(String id) {
            TextView view = (TextView)mActivity.findViewById(R.id.adid);
            view.append(id);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // AdvertisingIdClient cannot be called in the main thread.
        AsyncTask<Void, Void, String> task = new AdIdTask(this);
        task.execute();
    }
}
```
Cakephp3環境構築でつまずいたこと

・database disk image is malformed がでた
http://taichino.com/engineer-life/database/4123
→cakeのdebugkitを削除した

・こいつで解決した！
http://o-rly--ya-rly.blogspot.jp/2015/10/cake-php3-curlcomposerpearpecl.html?view=timeslide
ImageMagick 指定座標の画素値を取得する

ImageMagickにて、画像中の指定座標位置の画素値を取得する方法を記述する。
画像処理を行った結果を定量的に解析するときなどに利用できる。

使用バージョン

* ImageMagick 6.9.1-4 Q16

コマンド例
`convert sample-640x480.png -crop 1x1+320+0 -format "%[fx:r * 255]" info:`

# 概念
入力画像について、指定位置から1x1ピクセルの領域を切り出し、その内容を数値として整形して出力する。

# 指定位置からの切り出し
`-crop`オプションを使用する。
`-crop 1x1+X+Y`と指定することで、座標`(X, Y)`から1x1ピクセル領域を切り出す。

## 数値への整形
`-format`オプションを使用する。
`"%[fx:]"`を用いて画素値を取得する。`fx:`の後ろに取り出したいカラーチャネルを指定する。
本例では、Redチャネルを指定している。
`%[fx:]`で取り出すと、画素値が0.0から1.0の間に正規化されるため、必要に応じて255を乗ずるなどの演算を施す。

## 出力
`-format`で整形した情報を`info:`にて文字列として出力する。

# その他
## 別の方法
`%[fx:]`の代わりに`%[pixel:]`を用いることも可能。このときは正規化されないため、`%[fx:]`のときのような演算は不要。
この場合、出力には当該画素の情報も共に出力される。
実行例：
`convert sample-640x480.png -crop 1x1+320+0 -format "%[pixel:r]" info:`
`gray(127)`

## 複数の入力
入力画像のファイル名にはワイルドカードを指定できる。
複数のファイルにわたって同じ座標の画素値を取り出すということもできる。
`-format`内で`%f`を使うとファイル名を出力できるので、どのファイルの出力か対応づけられる。

```
>convert sample*.png -crop 1x1+0+0 -format "(%f) -> %[fx:r * 255]\n" info:
(sample00.png) -> 0
(sample01.png) -> 23
(sample02.png) -> 46
(sample03.png) -> 70
(sample04.png) -> 93
(sample05.png) -> 116
(sample06.png) -> 139
(sample07.png) -> 162
(sample08.png) -> 185
(sample09.png) -> 209
```

## 使用した画像

![sample-640x480.png](https://qiita-image-store.s3.amazonaws.com/0/52878/298ffbf2-6212-c55c-61a2-c1c522a24205.png)
SubversionからGitへ移行してみた

結構はまったし、後日別のリポジトリを移行することがありそうなのでメモを残しておきます。

## 前提・事前準備

- 一旦、ローカルのWindows上のGitに移行してからbareリポジトリ（今回はGitLabだったが手順的には何でもOK）にプッシュする流れ
- [Git for windows](https://git-scm.com/download/win)を事前にインストールしておく
- Subversionのサーバからリポジトリをディレクトリまるごと取得できること  
　`git svn clone` の最中 svnのパスワードを頻繁に聞かれる問題を色々やってみたが回避できなかったので、ローカルにSVNディレクトリまるごと持ってくる手順で行いました。  
　今回、一番ハマったのはここでした。
- 作業はGit Bashから行いました。

## 手順

- Subversionのサーバからリポジトリのディレクトリ丸ごと取得してローカルのWindows上の配置する。
  今回はC:¥temp¥にmyappリポジトリのディレクトリを作成
  
- Svnのコミット履歴から authorのリストを作成する。

```bash
svn log --xml file:///temp/myapp | grep "<auth" | sort -u | perl -pe 's/<author>(.*?)<\/author>/$1 = $1 <$1\@example.com>/' > svnauthors.txt
```
Gitへはメールアドレスを登録する必要がありますが、会社なのでドメインが固定できますし、SVNのユーザ名=会社のメールアドレスだったのですんなり作成できました。

こんなファイルが出力されます。

```txt:svnauthors.txt
taro = taro <taro@example.com>
hanako = hanako <hanako@example.com>
```

- ローカルのSVNからGitへデータ変換します。

```bash
git svn clone -A svnauthors.txt -s --prefix=svn/ file:///c/temp/myapp
```

5000コミット程度でtrunk/branches/tagsの素直な構成だったのでトラブルなく終わったが、ブランチが多かったので4時間ぐらい掛った。

※この手順だと、コミットログに`git-svn-id: file:///c/temp/myapp/trunk@1529 b2b6dba9-8bd8-43e8-adf2-ced20190beb5` のようなsvnとの紐付けが追記されます。私は気にせず残していますが、嫌な場合は `--no-metadata`オプションを付けるか、後からfilter-branchでまとめて削除すると良いかと思います  [^1]

- ここまで終わったら、.git/config のSVNの向き先をローカルからサーバに変更しておきます。

```bash
[svn-remote "svn"]
        #url = file:///c/temp/myapp
        url = svn+ssh://example.com/repos/myapp
```

- 移行期間中にSVNに入った変更を `git svn fetch` で取得します。

- ブランチとタグを作成

```bash
git branch branch1 svn/branch1
git tag tag1 svn/tags/tag1
```

ブランチとタグの数だけ繰り返す。数が多い場合はシェルで一気に行える [^2]

```bash
git branch -r | egrep --text --invert-match "tags|trunk" | xargs -iBRANCH_NAME git branch BRANCH_NAME BRANCH_NAME
git branch -r | egrep --text "tags/" | cut -d / -f3|xargs -iVAR git tag svn/VAR svn/tags/VAR
```
`--prefix=svn/` 付きで`git svn clone`したので、tagの方は参考サイトのコマンドを少し変更しています。
また、git上のブランチ/タグの名もprefixに`svn/`を付けて移行しましたが、そこら辺はお好みで変えて下さい。

- ブランチとタグをbareリポジトリへプッシュする

```bash
git remote add origin <url> # bareリポジトリを登録
git push -u origin  --all   # ブランチを全てプッシュ
git push origin --tags      # タグを全てプッシュ
```

## おわりに

移行元の構成によってはcloneでハマるようですが、
今回はかなりキレイに移行することが出来ました。

## 参考リンク
- [git-svnでSVN→Gitへの移行をやってみたログ](http://qiita.com/hidekuro/items/4727715fbda8f10b6b11)
- [git svn で毎回パスワードを聞かれないようにするには](http://qiita.com/hiro4455/items/3d2f38716e6634f5110e)
- [Windowマシンで行う git-svnでのSubversionからGitへの移行方法](http://qiita.com/mookjp/items/9ae307e15d17796c1295)

[^1]: [こちら](http://blog.chocolapod.net/momokan/entry/77)の記事を参照
[^2]: [こちら](http://qiita.com/mookjp/items/9ae307e15d17796c1295#git%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%82%BF%E3%82%B0%E3%82%92%E4%BD%9C%E6%88%90)の記事のワンライナーを参考にさせて貰いました
Ruby Fiberの基礎まとめ

# Fiberとは
* Ruby 1.9から登場 [class Fiber (Ruby 2.1.0 リファレンス)](http://docs.ruby-lang.org/ja/2.1.0/class/Fiber.html)
* 「ある処理を途中まで実行して、その後任意のタイミングで前回の続きから処理を行う」ことが可能になる
* スレッドはプリエンプティブ、Fiberはノンプリエンプティブ
	* プリエンプティブ: 各スレッドの実行はスケジューラによって自動的行われている
	* ノンプリエンプティブ: こちらで明示的に実行を指示

# 使い方
## 基本的な使い方

```rb:yieldとresume(fiber_1.rb)
#!/usr/bin/ruby
# vim:set fileencoding=utf-8

fiber = Fiber.new {
  puts 'Hello, Fiber'
 
  Fiber.yield # 何回でもはさめる

  puts 'Hello (again)'
}
 
fiber.resume # yeildの時点まで実行
fiber.resume # その次
fiber.resume # その次
```

```bash:Result(fiber_1.rb)
% ruby fiber_1.rb
Hello, Fiber
Hello (again)
fiber_1.rb:14:in `resume': dead fiber called (FiberError)
        from fiber_1.rb:14:in `<main>'
```

## 引数と戻り値の使い方

```rb:引数と戻り値(fiber_2.rb)
#!/usr/bin/ruby
# vim:set fileencoding=utf-8

fiber = Fiber.new {|first|
  puts first

  second = Fiber.yield('goodbye')

  puts second

  'goodbye (again)'
}

puts fiber.resume('hello')
puts fiber.resume('hello(again)')
```

```bash:Result(fiber_2.rb)
% ruby fiber_2.rb
hello
goodbye
hello(again)
goodbye (again)
```


# ジェネレータ
> ジェネレータは、プログラムにおいて、数列の各要素の値などを次々と生成（ジェネレート）し他の手続きに渡す、という機能を持っている手続きである。 参照:[wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0))

Fiberを使うと「膨大な計算結果の配列を一度に構築するのではなく、部分的な結果だけを計算して返し、自家また続きから計算」できるサブルーチンを作ることができます。
つまり一度に大きな配列を作成しない → メモリ効率良い!

## フィボナッチ数を返却するジェネレータの例

```rb:フィボナッチ数を返すジェネレータ(fiber_fibonach.rb)
fib = Fiber.new {
  a, b = 0, 1

  loop do
    a, b = b, a + b 
    Fiber.yield(a)
  end 
}

p 10.times.map{ fib.resume }
puts fib.resume
puts fib.resume
```

```bash:Result(fiber_fibonach.rb)
% ruby fiber_fibonach.rb
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
89
144
```

# スレッドと組み合わせた場合の制限
Fiberの切り替えはスレッドを超えては実行できない。
他のスレッドのファイバをresumeした際や、Fiberの中のスレッドからFiber.yieldした際はFiberErrorが発生する。

```rb:Fiber&Thread(1)
fiber = Fiber.new {
  puts 'OH MY GOD'
}

Thread.fork {
  fiber.resume
}.join
```
```bash:Result(1)
% ruby fiber_other_thread.rb
fiber_other_thread.rb:8:in `resume': fiber called across threads (FiberError)
        from fiber_other_thread.rb:8:in `block in <main>'
```

```rb:Fiber&Thread(2)
# Fiber.yield
fiber = Fiber.new {
  Thread.fork {
    Fiber.yield
  }.join
}

fiber.resume
```
```bash:Result(2)
% ruby fiber_other_thread.rb
fiber_other_thread.rb:5:in `yield': can't yield from root fiber (FiberError)
        from fiber_other_thread.rb:5:in `block (2 levels) in <main>'
```

# 参考
[パーフェクトRuby](http://www.amazon.co.jp/dp/4774158798)
MongoDBのシェルでダミーデータ作成

```js:InsertDummyData.js
/*
  MongoDBのシェルではJavaScriptが動きます。
  以下を必要に応じ変更してコピペすればダミーデータが作成できます。
  初期投入件数は１０件です。
*/

for (var i=0; i<10; i++) {
  db.test.insert(
    {
      "id" : "id" + i, 
      "name" : i + "郎", 
      "comment" : "私は" + i + "郎です。" ,
      "created" : new Date(), 
      "updated" : new Date(), 
    }
  );
}
```

MongoDBのシェルにコピペして実行。

```shell-session
> for (var i=0; i<10; i++) {
...   db.test.insert(
...     {
...       "id" : "id" + i,
...       "name" : i + "郎",
...       "comment" : "私は" + i + "郎です。" ,
...       "created" : new Date(),
...       "updated" : new Date(),
...     }
...   );
... }
```

findで結果を見ると以下のようになる。

```shell-session
> db.test.find()
{ "_id" : ObjectId("5630e5466ed4cd5f7dbace78"), "id" : "id0", "name" : "0郎", "comment" : "私は0郎です。", "created" : ISODate("2015-10-28T15:09:58.479Z"), "updated" : ISODate("2015-10-28T15:09:58.479Z") }
{ "_id" : ObjectId("5630e5466ed4cd5f7dbace79"), "id" : "id1", "name" : "1郎", "comment" : "私は1郎です。", "created" : ISODate("2015-10-28T15:09:58.485Z"), "updated" : ISODate("2015-10-28T15:09:58.485Z") }
{ "_id" : ObjectId("5630e5466ed4cd5f7dbace7a"), "id" : "id2", "name" : "2郎", "comment" : "私は2郎です。", "created" : ISODate("2015-10-28T15:09:58.490Z"), "updated" : ISODate("2015-10-28T15:09:58.490Z") }
{ "_id" : ObjectId("5630e5466ed4cd5f7dbace7b"), "id" : "id3", "name" : "3郎", "comment" : "私は3郎です。", "created" : ISODate("2015-10-28T15:09:58.491Z"), "updated" : ISODate("2015-10-28T15:09:58.491Z") }
{ "_id" : ObjectId("5630e5466ed4cd5f7dbace7c"), "id" : "id4", "name" : "4郎", "comment" : "私は4郎です。", "created" : ISODate("2015-10-28T15:09:58.492Z"), "updated" : ISODate("2015-10-28T15:09:58.492Z") }
{ "_id" : ObjectId("5630e5466ed4cd5f7dbace7d"), "id" : "id5", "name" : "5郎", "comment" : "私は5郎です。", "created" : ISODate("2015-10-28T15:09:58.492Z"), "updated" : ISODate("2015-10-28T15:09:58.492Z") }
{ "_id" : ObjectId("5630e5466ed4cd5f7dbace7e"), "id" : "id6", "name" : "6郎", "comment" : "私は6郎です。", "created" : ISODate("2015-10-28T15:09:58.493Z"), "updated" : ISODate("2015-10-28T15:09:58.493Z") }
{ "_id" : ObjectId("5630e5466ed4cd5f7dbace7f"), "id" : "id7", "name" : "7郎", "comment" : "私は7郎です。", "created" : ISODate("2015-10-28T15:09:58.493Z"), "updated" : ISODate("2015-10-28T15:09:58.493Z") }
{ "_id" : ObjectId("5630e5466ed4cd5f7dbace80"), "id" : "id8", "name" : "8郎", "comment" : "私は8郎です。", "created" : ISODate("2015-10-28T15:09:58.494Z"), "updated" : ISODate("2015-10-28T15:09:58.494Z") }
{ "_id" : ObjectId("5630e5466ed4cd5f7dbace81"), "id" : "id9", "name" : "9郎", "comment" : "私は9郎です。", "created" : ISODate("2015-10-28T15:09:58.495Z"), "updated" : ISODate("2015-10-28T15:09:58.495Z") }
```
{質問}会話モードでない時にも返事させたい

会話モードではない時（目が白い時）でも「pepper」と呼ぶと「はーい」と答えますよね。
それと同じことはできませんか？
「任意の言葉」を人間が言うと「任意の言葉」をpepperが返事する。です。
しかも目が白い時です。（会話モードではない時）
「pepper」〜「はーい」が実装されてるので
何かの方法でできると思うのですが。
無理なのでしょうか？
【Rails】Webサービスをリリースした話【Sqale】


:warning:Sqaleのサービスクローズに伴い、本サービスもクローズさせていただきました。
引き続き同様のことをされる場合、[retrobot](https://github.com/re-fort/retrobot)をHerokuでホスティングできるようカスマイズした版を作成していますので、そちらをご利用ください。

### 作ったもの
[Retro-ing](https://retro-ing.sqale.jp)
:Retro-ingは過去の発言をツイートするTwitter botを作成できるWebサービスです。
<br />![画像](http://cdn-ak.f.st-hatena.com/images/fotolife/r/re_fort/20151026/20151026222617.png "こんな感じ")

### はじめに
天地万物すべての源として[retrobot](https://github.com/mirakui/retrobot)を使用しています。

### Sqale
はじめてRails・Rubyをさわったので環境面で楽しようと思い、[Sqale](http://sqale.jp)を選びました。
結果的にかなり楽できました。

* デプロイ楽ちんで便利
* cron使える
　<br />→ wheneverでわいわいできる
* Memcached使える
　<br />→ dalliでわいわいできる
* Ruby 2.2.3に対応してる
* SSL無料(sqale.jpドメインなら)

### gem
使っているgemです。

* dalli
<br />セッション・キャッシュ
<br />
<br />
* omniauth,omniauth-twitter
<br />Twitterログイン
<br />
<br />
* slack-api
<br />info,errorをSlackに通知
<br />![画像](http://cdn-ak.f.st-hatena.com/images/fotolife/r/re_fort/20151028/20151028233425.png "こんな感じ")
<br /> SlackのAPIはBOTの発言でもアイコン画像を渡せるのがすごく好き。
<br />
<br />
* whenever
<br />DBのバックアップとかに
<br />
<br />
* nokogiri
<br />TwitterのUIDからユーザー名を取得
(登録ユーザにメンションを飛ばすときとか)
<br />下の方法でとれなくなる日がそのうち来るかも。

```ruby:get_user_name
require 'open-uri'

def get_user_name(uid)
    html = Nokogiri::HTML(open("https://twitter.com/intent/user?user_id=#{uid}"))
    nickname = html.css('.nickname').first.content
end
```

* rambulance
<br />エラー表示(404,503,etc...)
<br />エラー時にはログアウトさせたい〜などの処理もかけて便利。
<br />

### その他
* フォント
<br />Noto Sans CJK JPを使ってます。
<br />
そのままだとファイルサイズ的にヤバイけど、第一水準まででサブセット化すると、560KBくらいになるので、お試し。
MySQLのデータベースをまるっとお引越し。 (エクスポート/インポート)


# 概要
今回は、既存のデータベースをエクスポートして、そのあとインポートするお話を綴ります。

※平素よりMySQLをご利用の方には今更感溢れる内容となっております。 m(_ _)m

# 手順
## エクスポート編

この1行でできるよ！

`$ mysqldump -u testuser -p testdb > export.sql`

[testuser] には任意のデータベースユーザー名を、
[testdb] にはエクスポートしたいデータベース名を、
[export.sql] にはエクスポートするファイル名を指定してね！

`Enter password: `
パスワードを求められたら入力してね！

`export.sql` が出力されたかな？

## インポート編

インポートする前に、受け入れ先のデータベースを作っておく必要があるよ！

MySQLにログイン！
`$ mysql -u root -p`

パスワードを入力してね。
`Enter password:`

受け入れ用の新しいデータベースを作成…
`MariaDB [(none)]> create database newdb;`
[newdb] には任意のデータベース名を指定してね。

MySQLからログアウト。
`MariaDB [(none)]> \q`

<br>
次はインポートだよ！

このコマンドでインポートできるよ！
`$ mysql -u root -p newdb < export.sql`

データベースのrootパスワードを入力してね！
`Enter password: ` 

これで完了！

とっても簡単ね！

## その他
### 新しく作ったデータベース用にユーザーを追加する
ユーザーの作成方法は[以前にも書いた](http://qiita.com/sango/items/736d98d90203ab4634c6)けど、もう一度書いておくね！

`MariaDB [(none)]> grant all on newdb.* to testuser@localhost identified by 'password';`

[newdb] には任意のデータベース名、
[testuser] には任意のデータベースユーザー名、
[password] には任意のパスワード文字列を指定してね！

ちなみに。
`grant all` は「すべての権限を与える」という意味、
`newdb.*` の `*` は newdb以下のすべてのテーブルに適用という意味だよ。

ここら辺を細かく指定することで、ユーザーのデータベースに対するアクセス権を調節することができるよ！


# 参考

- [mysqldumpでバックアップ＆復元 - phpspot](http://phpspot.net/php/pgmysqldump%E3%81%A7%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%EF%BC%86%E5%BE%A9%E5%85%83.html)
- [MySQLのデータベースをmysqldumpでバックアップ/復元する方法 | WEB ARCH LABO](http://weblabo.oscasierra.net/mysql-mysqldump-01/)
- [権限の設定(GRANT文) - ユーザーの作成 - MySQLの使い方](http://www.dbonline.jp/mysql/user/index6.html)