OmniAICreator/Qiita-1.07M huggingface dataset:
別プロセスで動いている生き死にするServiceで非同期処理をする事を考える

AndroidのServiceのお話。以下のようなServiceがある。


- Serviceを別プロセスで動かしている
- destroyが呼ばれた時は、`Process.killProcess(Process.myPid())`を呼んで自分自身のプロセスをkillする。
- 定期的に生き死にする

こういったSerivceで非同期処理をすると、ちゃんと非同期処理の終了を待つ処理をいれないと、
非同期処理してる間にサービスが死しに、プロセス自体が死ぬので非同期処理が完了する前に終わってしまう。。。

みたいな事があります。

なので、別プロセスのSerivceのライフサイクルに依存しない形で非同期処理をしたい。

IntentServiceを使ってアプリのプロセスで動かすようにすると、
管理しやすいのでないか？と思ったので実際にコードを書いて試してみます。また、Serviceの中で非同期処理して、見事に途中で終わってるよね。という事も確認したかったので、それも試してみています。


実験した内容は以下の２つ

1. 何も考えずにServiceの中で非同期処理をする
2. アプリのプロセスでIntentServiceを呼んで非同期処理する


## 実験するServiceの仕様

1. Serviceが起動する
2. 5秒たったらstopServiceを呼んで停止する
3. onDestroyが呼ばれた時に`Process.killProcess(Process.myPid())`を呼んで自分自身をkillする

以下のようなコードをSerivceのonCreateに入れて、５秒たったら停止するようにする

```Kotlin
        Handler(Looper.getMainLooper()).postDelayed({
            showMessage("stop service")
            this.stopService(Intent(this, SampleService::class.java))
        }, 5_000)
```


## 1. 何も考えずにServiceの中で非同期処理する

以下のような感じで1秒毎にメッセージを表示して、10秒たったら終了。みたいな処理をServiceのonCreateの中に書く。

```kotlin
        var counter = 0
        timer.schedule(object : TimerTask() {
            override fun run() {
                counter++
                showMessage("counter: " + counter)
                if (counter == 10) {
                    Handler(Looper.getMainLooper()).post {
                        showMessage("counter finished")
                        timer.cancel()
                    }
                }
            }

        }, 1_000, 1_000)

```


#### 結果

```
counter: 1
counter: 2
counter: 3
counter: 4
stop service
destroy service
```


Serviceは5秒で停止する。onDestoryが呼ばれた時に自分自身をkillしてるので、counterは１０秒までは回らない。
まぁ、プロセスが死ぬんだから、その通りだ。


## 2. アプリのプロセスでIntentServiceを呼んで非同期処理する

こんな感じでAndroidManifest上で以下のように書きます。Serviceを別プロセスで動かして、IntentServiceをアプリのプロセスで動かす。という書き方。

```xml
        <service android:name=".SampleService"
            android:process=":SampleService" />

        <service android:name=".SampleIntentService" />
```


https://developer.android.com/guide/topics/manifest/service-element.html

android:processの仕様はこの辺に書いてある。

processを書かない場合はアプリのプロセスで動くと書いてあって、ちゃんとアプリのプロセスで動くよね？呼び出し元のプロセスで動かないよね？という事も確認したかった。

#### 実験したIntentServiceの仕様

SampleIntentServiceというIntentServiceのクラスを作って、`onHandleIntent`の中で以下のように書きます。

```kotlin

        (1..15).map {
            Thread.sleep(1000)
            showMessage("SampleIntentService counter: " + it)
        }


```

こんな感じで、１秒毎にカウンターを表示している。

#### 結果
- IntentServiceの方は最後までカウンターが表示されていた。
- プロセスもちゃんとアプリのプロセスで動いてた。
- 別プロセスで動いているServiceの方は普通に起動して５秒後に死んでいた。


## 最後に
実験に使ったコードはこちらにアップしています。
https://github.com/mapyo/ProcessSample

IntentServiceを使うと、処理が終わったら勝手に終了してくれるし、連続で呼んでしまったとしても、逐次実行してくれるようになってるし、いろいろと便利です。
bashプログラミングで確認用（confirm）関数を作ってみる

# bashプログラミングで確認用（confirm）関数を作ってみる

```bash
# 確認
function confirm() {
  while true; do
    if [ "$1" != "" ]; then
      printf '%s ' "$1"
    fi
    printf "[y/n] >"
    read input
    if [ "$input" = "y" ]; then
      return 0;
    elif [ "$input" = "n" ]; then
      return 1;
    fi
  done
}
```
で、OK。
> 編集リクエストが来たので、採用しましたが、このコードは動作確認してません。

使い方の例

```bash
confirm "OKですか？" && echo "YES" || echo "NO"
```
こんな感じの例文がわかりやすいかと思います。

で、上記の`confirm関数`を`.bashrc`や`bash_profile`とかに書いておけば、どこでも使えるようになるので、bashプログラミングする人は便利だと思います。
dcpdumpまとめ

http://d.hatena.ne.jp/glorypulse/20150219/1424273896
http://inaz2.hatenablog.com/entry/2014/07/03/000900
http://qiita.com/HIkaruSato/items/1f66c1a189bf9c19f838
http://itpro.nikkeibp.co.jp/article/COLUMN/20121108/436124/?ST=smartphone&P=3
http://d.hatena.ne.jp/keyword/Wireshark
https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=mac+%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3+%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89
http://qiita.com/tossh/items/4cd33693965ef231bd2a
https://support.apple.com/ja-jp/HT202013
http://easyramble.com/mac-wireshark-packet-capture.html
http://blog.livedoor.jp/sonots/archives/18239717.html
http://net-newbie.com/tcpip/tcp/tcpdump.html
pandocでマークダウンをPDF化する(LaTexなし)


# 概要
最近pandosの便利さに気づいて勉強中です。
PDFに変換するオプションもあるようなのですが、LaTexが必要、かつ面倒というウワサを真に受けて放置していました。
しかし、よくマニュアルを読むとwkhtmltopdfでも可能ということなので、トライしてみました。

# 環境
Windows10
pandoc 1.17.0.4
[wkhtmltopdf 0.12.4](https://wkhtmltopdf.org)

# wkhtmltopdfのインストール
[こちら](https://wkhtmltopdf.org/downloads.html)からダウンロードしてインストール。
完了後、環境変数のPATHにモジュールのフォルダを追加しておく。
自分の場合は、C:\Program Files\wkhtmltopdf\bin

# 実行
出力先の拡張をpdfに、フォーマットをhtml5にして変換します。
`pandoc test.md -f markdown -t html5 -s -c github.css -o test.pdf`

そのままではコードハイライトが弱かったので、github.css(を少しいじったもの)を通しています。
[参考](http://qiita.com/griffin_stewie/items/95026360fdfca1bd8e33)

これで終了です。簡単ですね。
結果は以下のような感じです。ちゃんとアウトラインも入ります。
<img src=https://qiita-image-store.s3.amazonaws.com/0/159980/f4154b11-1794-0ac9-eb06-44001e17a05d.png width=80%>

# 元にするマークダウンについての補足
通常Qiita(Kobito)で使用している記法と同じですが、いくつか注意点があります。

## 段落と改行について
通常、空行で挟まれた領域が段落とみなされます。
段落の中で改行されていても、マークダウン的にはその改行は無意味です。
段落内での明示的な改行は、文末に2つ以上の空白を入れることで可能です。
ただKobitoでそれを意識せずに書いてそのままアップロードしても、
Qiita上ではちゃんと反映されていますが、その理由はよくわかりません…

## 画像のサイズについて
画像はKobitoなどで意識せずに張り付けると、以下の形式になります。
`![image](https://qiita-image-store.s3.amazonaws.com/XXXXXXXXXXXXXXXXXXXXx.png)`
これだと変換時にサイズが調整されないため、必要に応じてimgタグの記法に変更します。
`<img src=https://qiita-image-store.s3.amazonaws.com/XXXXXXXXXXXXXXXX.png width=100px>`
また、リサイズはpxでもよいですが、%にしたほうが汎用的かと思います。  

# まとめ
wkhtmltopdfを使うことで、日本語を含むマークダウンをPDFに変換できる。
LaTeXは不要!(重要)
nginxのX-Forwarded設定

# 背景
nginx -> nginx -> railsのように多段のリバースプロキシーに対応した、nginxのX-Forwarded設定。

# nginxのX-Forwarded設定 (location抜粋)

```
location @proxy {
    proxy_set_header Host $http_host;
    
    # 伝播させていく
    set $ssl off;
	if ($scheme = https) {
        set $ssl on;
	}
	if ($http_x_forwarded_for) {
		set $ssl $http_x_forwarded_for;
	}
	
	set $proto $scheme;
	if ($http_x_forwarded_proto) {
		set $proto $http_x_forwarded_proto;
	}			 
    
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-SSL $ssl;
    proxy_set_header X-Forwarded-Proto $proto;
    
    proxy_set_header X-Sendfile-Type X-Accel-Redirect;
    proxy_pass http://127.0.0.1:3000; 
    proxy_redirect off;		    	       
	internal;
} 
```
Python3 と Selenium Webdriver に挑戦

# きっかけ
仕事の中で行うテスト作業が長くて手間がかかるので、Python3の勉強も兼ねてやってみた

# 使用環境
| システム名         | 対象バージョン・環境 |
|:-----------------|:------------------|
| OS               | macOS sierra 10.12.5 |
| ブラウザ           | Chrome 59.0.3071.115 |
| Python           | 3.6.1             |
| Selenium         | 3.4.3             |
| virtualenv       | 15.1.0            |
| ChromeDriver     | 2.30              |

# 手順
基本は[公式ドキュメント](http://selenium-python.readthedocs.io/installation.html#introduction)を参考にした

1. virtualenvで環境を作成する場所を用意

    ```shell-session
    $ cd Desktop  
    $ mkdir PythonEnv
    $ cd PythonEnv
    ```

2. 仮想環境を作成する

    ```shell-session
    $ virtualenv SeleniumPython
    $ cd SeleniumPython
    ````

3. pipでseleniumをインストール

    ```shell-session
    $ pip install selenium
    Collecting selenium
      Downloading selenium-3.4.3-py2.py3-none-any.whl (931kB)
        100% |████████████████████████████████| 942kB 622kB/s 
    Installing collected packages: selenium
    Successfully installed selenium-3.4.3
    ```
4. [ChromeDriver - WebDriver for Chrome](https://sites.google.com/a/chromium.org/chromedriver/downloads)からChromeDriverをダウンロードする

5. 解凍したファイルを`/usr/local/bin`フォルダ配下に配置する（パスが通っていればなんでも良さそう）

    ```shell-session
    $ sudo mv chromedriver /usr/local/bin
    ```
6. 作成した仮想環境に入る

    ```shell-session
    $ pwd
    /Users/<ユーザ名>/Desktop/SeleniumPython
    $ source bin/activate
    ```

7. 以下のPythonファイルを作成する

    ```python:python_org_search.py
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys

    driver = webdriver.Chrome()
    driver.get("http://www.python.org")
    assert "Python" in driver.title
    elem = driver.find_element_by_name("q")
    elem.clear()
    elem.send_keys("pycon")
    elem.send_keys(Keys.RETURN)
    assert "No results found." not in driver.page_source
    driver.close()
    ```

作成したPythonファイルを実行する

```shell-session
$ python python_org_search.py
```

そうすると、Chromeが自動的に起動してPythonの公式ページが立ち上がる

# 今後
とりあえずは[公式ドキュメントの2. Getting Started](http://selenium-python.readthedocs.io/getting-started.html)をやってみようと思う
Markdown で Local file link

#Markdown で Local file link
Markdown形式でメモやノートを取っていたときに、先日とったメモとリンクしたいと思い。Local file linkをしたときのメモ。

<pre>
#07012017
今日もつかれた。あすも頑張ろう

##昨日の日記
[06302016] [1]

##明日の日記
[06302016] [2]
[1]: file:///Users/hoge/diary/06302017.md 　　
[2]: file:///Users/hoge/diary/07022017.md   　　
</pre>

ローカルファイルを読み込めるように設定されたブラウザなら、これでリンクできるはず。
Rubyのインストールで「undefined symbol: SSLv2_method」エラー

rbenvコマンドを利用して、Rubyのインストール中に以下のエラーが発生した。

    # rbenv install 2.2.3
    ・・・
    /tmp/ruby-build.20170701222135.6274/ruby-
    2.2.3/lib/rubygems/core_ext/kernel_require.rb:54:in `require': /tmp/ruby-
    build.20170701222135.6274/ruby-2.2.3/.ext/x86_64-linux/openssl.so: undefined 
    symbol: SSLv2_method - /tmp/ruby-build.20170701222135.6274/ruby-2.2.3/.ext/x86_64-linux/openssl.so (LoadError)
        from /tmp/ruby-build.20170701222135.6274/ruby-2.2.3/lib/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /tmp/ruby-build.20170701222135.6274/ruby-2.2.3/.ext/common/openssl.rb:17:in `<top (required)>'
        from /tmp/ruby-build.20170701222135.6274/ruby-2.2.3/lib/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /tmp/ruby-build.20170701222135.6274/ruby-2.2.3/lib/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /tmp/ruby-build.20170701222135.6274/ruby-2.2.3/lib/rubygems/security.rb:11:in `<top (required)>

以下のサイトを参考にして、rvmコマンドをつかってインストールしてみる。         
https://www.reddit.com/r/ruby/comments/4adoic/openssl_error_in_ruby_200/ 

    # curl -sSL https://get.rvm.io | bash
    ・・・
    # source /home/bushidoyasu/.rvm/scripts/rvm
    # rvm pkg install openssl
    ・・・
    # rvm reinstall ruby-2.2.3 --with-openssl-dir=$HOME/.rvm/usr 
    ・・・
    # ruby -v
    ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]

無事インストールできた！
git submodule定義があるディレクトリのリネーム

Git Submodule設定されているディレクトリを持っているディレクトリをリネーム（移動）した時にちょっとハマった時のメモ。

```
+ sample.git
  + dirA
    + submod
```

みたいな構成でsubmodにsubmodule設定がされている場合。

# ダメな処理方法
`git mv dirA dirB` を実行する。
これ自体は問題なく実行できるが、`git status`を実行したらエラー出た。

>fatal: Could not chdir to '../../../../../sample.git/dirA/submod': No such file or directory
>fatal: 'git status --porcelain' failed in submodule sample.git/dirB/submod

ふーん。ダメなの。。。
一旦元に戻すか。

```bash
mv dirB dirA    #この時点でgit statusが復帰
git reset HEAD dirA dirB    #git上の変更を無しにする
```

#大丈夫な処理方法
submoduleを一旦削除してから対象ディレクトリをリネームして、再度submodule設定をすれば大丈夫だった。

```bash
git submodule deinit dirA/submod     #これだけではgit statusに変化無し
rm -rf dirA/submod    #この時点でgit statusに変更が認識された
git mv dirA dirB    #これでリネーム成功
git submodule add git@foobar.example.com:submod.git dirB/submod    #submoduleの再定義
git commit    #コミットして完了
```

submoduleはハマるって噂ではあったけど。
submodule設定しているリポジトリはあまり更新される事ないから余裕ぶって使ってた。
大きなハマりではないけど、未来の自分含む誰か他の人も同じ現象に遭遇するかもしれないのでメモ。
アンダースコア変数について

### `_`とは、宣言はするけれども後で使わない変数

というような理解でいいと思う。

- arrayの中身だけ表示したいがインデックスは表示しなくてもいい、みたいな場合を想定する。

```go
numbers := []int{20, 30, 40}
for _, n := range numbers {
  fmt.Println(n)
}
```

- このコードを実行すると`20, 30, 40`が得られる。
- このとき、インデックスは使わないから`_`を使う。
- では、このfor文から`_`を消して実行したらどうなるだろう？

```go
numbers := []int{20, 30, 40}
for n := range numbers {
  fmt.Println(n)
}
```

- `0 1 2`が出力される。
- nがインデックスになってしまった。
- じゃあ`_`を`i`などの普通の変数に変えたらどうなるか？

```go
numbers := []int{20, 30, 40}
for i, n := range numbers {
  fmt.Println(n)
}
```

- おそらく使っているエディタのシンタックスチェックがエラーを吐く。
- 無理やり実行すると`i declared and not used`などのエラーがでる。

#### GO言語では一度宣言した変数を使わなかったら怒られる。厳格ですね。
スマートコントラクトの基礎となる着金時のトリガープログラムを仮想通貨NEMで実装する。

スマートコントラクト、最近いろいろなところで聞くようになった話題ですが、その定義は人それぞれです。

それら共通に感じ取れることは、送金、着金の管理が煩わしく、お金を発生させる方がコストのかかってしまうような契約を技術的に解決してしまおうという動きです。
IoTなどがもう少し普及すれば、ロボット同士が労働の対価として仮想通貨をやりとりすることも出てくるでしょう。そういうと、もう少し先の話に聞こえるかもしれません。
でも、インターネット上を見渡せば、Web上ではすでにたくさんのロボットが活躍しています。

その実現のためにもどうしても必要な仕組みが、アカウントへの着金を確認したらサービスを開始するためのシステムです。

今回は仮想通貨NEMの場合に、どうやって着金を確認するかの方法を説明します。
といっても、今回も簡単です。

NEMにはとても優れたAPIが各ノードに標準実装されていて、WebSocket通信も可能です。
本来であれば、仮想通貨ネットワーク上にUnconfirm状態で乗ったトランザクションに対してポーリングで状態監視し、Confirmされたタイミングでサービスを開始する、そういった監視アルゴリズムが必要です。ところがWebSocekt通信を使えば、プロトコルの実装方法にもよりますが、Confirmされた時だけトリガーを発行する、といったプログラムが簡単に書けてしまいます。

以下にサンプルプログラムを提示しておきます。

```js:trigger
var nem = require("nem-sdk").default;

var NODES = Array(
"http://alice2.nem.ninja",
"http://alice3.nem.ninja",
"http://alice4.nem.ninja",
"http://alice5.nem.ninja",
"http://alice6.nem.ninja",
"http://alice7.nem.ninja"
);

var node_url;
function getEndpoint(){

        return NODES[Math.floor(Math.random() * NODES.length)];
}
node_url = getEndpoint();
var endpoint = nem.model.objects.create("endpoint")(node_url, nem.model.nodes.websocketPort);

// Address to subscribe
var address = "NBZNQL2JDWTGUAW237PXV4SSXSPORY43GUSWGSB7";
var connector = nem.com.websockets.connector.create(endpoint, address);
connect(connector);

function connect(connector){
  return connector.connect().then(function() {

      nem.com.websockets.subscribe.account.transactions.confirmed(connector, function(res) {
              console.log("confirmed");
              //以下は送金時にメッセージを入れていないとエラーになります。
              var message = JSON.parse(nem.utils.format.hexToUtf8(res.transaction.message.payload));
              console.log(message);
      }
  }
}
```

nodejsで書いています。ライブラリはNEM-sdkを利用しています。
とりあえず、指定アドレスに着金した時にメッセージ内容をコンソールに出力するだけのサンプルプログラムです。

```js
var message = JSON.parse(nem.utils.format.hexToUtf8(res.transaction.message.payload));
console.log(message);
```

この部分を書き換えれば、着金した時にツイッターで天気予報をつぶやいたり、金魚にエサをやったりするプログラムも簡単に作れそうですね。

どうですか？もうNEMでしか課金プログラム書く気しなくなってきませんか？
また思いついたらいろいろアップしていきます！

それでは！
ギャスケット


- 今回楽過ぎでは…？
- ただ、`x&y>0`より先に`x|y!=x+y`が出てきてしまったのがつらい。
    - ※ベン図を描くとわかりますが、`(x|y)==(x&y)|(x^y)`です。

## Ruby

```rb:tyama_henae15.rb
#!/usr/bin/env ruby
#http://nabetani.sakura.ne.jp/hena/orde15nohil/
#http://qiita.com/Nabetani/items/705fa83cfbf20377b92f

def num2place(n)
	x=y=0
	z=1
	while n>0
		if n%3==1
			x+=z
		elsif n%3==2
			y+=z
		end
		n/=3
		z*=2
	end
	[x,y]
end

def place2num(x,y)
	return nil if x<0 || y<0 || x&y>0 # x|y!=x+y
	n=0
	z=1
	while x>0||y>0
		if x%2>0
			n+=z
		elsif y%2>0
			n+=2*z
		end
		x/=2
		y/=2
		z*=3
	end
	n
end

while gets
	x,y=num2place($_.to_i)
	puts [[0,-1],[-1,0],[1,0],[0,1]].map{|dx,dy| # this order is important
		place2num(x+dx,y+dy)
	}.compact*','
	STDOUT.flush
end
```

## Python

```rb:tyama_henae15.py
#!/usr/bin/env python
#http://nabetani.sakura.ne.jp/hena/orde15nohil/
#http://qiita.com/Nabetani/items/705fa83cfbf20377b92f

import sys
if sys.version_info[0]>=3: raw_input=input

def num2place(n):
	x=y=0
	z=1
	while n>0:
		if n%3==1:
			x+=z
		elif n%3==2:
			y+=z
		n//=3
		z*=2
	return (x,y)

def place2num(x,y):
	if x<0 or y<0 or x&y>0: return None
	n=0
	z=1
	while x>0 or y>0:
		if x%2>0:
			n+=z
		elif y%2>0:
			n+=2*z
		x//=2
		y//=2
		z*=3
	return n

try:
	while True:
		x,y=num2place(int(raw_input()))
		a=[place2num(x+dx,y+dy) for (dx,dy) in [(0,-1),(-1,0),(1,0),(0,1)]]
		print(','.join(str(e) for e in a if e is not None))
		sys.stdout.flush()
except EOFError:
	pass
```

## C

- C99準拠のはず

```c:tyama_henae15.c
//http://qiita.com/Nabetani/items/705fa83cfbf20377b92f
//http://nabetani.sakura.ne.jp/hena/orde15nohil/

#include <stdio.h>
#include <stdbool.h>

typedef struct{
	int x;
	int y;
}dir;
const dir D[]={
	{0,-1},{-1,0},{1,0},{0,1} // this order is important
};

void num2place(long long n, long long *px, long long *py){
	long long x=0,y=0;
	long long z=1;
	for(;n>0;){
		if(n%3==1){
			x+=z;
		}else if(n%3==2){
			y+=z;
		}
		n/=3;
		z*=2;
	}
	*px=x;
	*py=y;
}
long long place2num(long long x,long long y){
	if(x<0 || y<0 || (x&y)>0)return -1;
	long long n=0;
	long long z=1;
	for(;x>0||y>0;){
		if(x%2>0){
			n+=z;
		}else if(y%2>0){
			n+=2*z;
		}
		x/=2;
		y/=2;
		z*=3;
	}
	return n;
}
int main(){
	long long n,x,y;
	for(;~scanf("%lld",&n);){
		num2place(n,&x,&y);
		bool first=true;
		for(int i=0;i<4;i++){
			long long m=place2num(x+D[i].x,y+D[i].y);
			if(m>=0){
				if(!first)printf(",");
				first=false;
				printf("%lld",m);
			}
		}
		puts("");
		fflush(stdout);
	}
}
```
オフラインリアルタイムどう書くE15の問題を鍋谷さんのアイディアで書き直してみた。

問題はこちら：

- http://nabetani.sakura.ne.jp/hena/orde15nohil/

オフラインリアルタイムで書いた私の実装はこちら：

- https://gist.github.com/mattsan/3ae74beca67ee844d8ae25e15ccb0a1a

鍋谷さんの実装がこちら：

- http://qiita.com/Nabetani/items/f516767d63dd7791672a


~~パクって~~ インスパイアされて書き直したものがこちら：

```ruby:orde15nohil-2.rb
# see http://nabetani.sakura.ne.jp/hena/orde15nohil/

def to_xy(i)
  s = i.to_s(3)
  [s.tr('2', '0').to_i(2), s.tr('12', '01').to_i(2)]
end

def to_num(x, y)
  return nil if ((x & y) != 0) || (x < 0) || (y < 0)
  (x.to_s(2).to_i + y.to_s(2).tr('1', '2').to_i).to_s.to_i(3)
end

def solve(input)
  x, y = to_xy(input.to_i)
  [to_num(x, y - 1), to_num(x - 1, y), to_num(x + 1, y), to_num(x, y + 1)].compact.join(',')
end

def test(n, input, expected)
  actual = solve(input)
  print "#{format('%2d', n)}: "
  if actual == expected
    puts "\x1b[32mpassed\x1b[0m"
  else
    puts "\x1b[31mfailed  input: #{input}, expected: #{expected}, actual: #{actual}\x1b[0m"
  end
end

DATA.read.split("\n").each do |line|
  n, input, expected = line.split
  test(n, input, expected)
end

__END__
0 21 19,22,23
1 0 1,2
2 1 0,3
3 2 0,6
```

（テストデータ省略）
Python3でファイルを扱う時の文字エンコーディング


## 概要
- Python3 では `open` などでファイルを扱う時のデフォルトの文字エンコーディングはOSに依存する
- Unix(Linux)系では、`locale(LC_CTYPE)` に依存する。
- 何も考えずにファイルの読み書きをすると、環境によっては`UnicodeDecodeError`などに遭遇する
 
## 確認
- 手元の macOS で動きを確認する
- 例えば、日本語が書かれた utf-8 のテキストファイルがあるとする。このファイルを開いて中身を取得する
​

```python
with open('utf-8.txt', mode='r') as fp:
    text = fp.read()
```
- 特にエラーもなく開いてファイルの中身を取得できる
- これは macOS が 文字エンコーディングがデフォルト UTF-8 だから 
- 実際に利用される文字エンコーディングは `locale.getpreferredencoding` で確認できる
​

```python
>> import locale
>> locale.getpreferredencoding() 
UTF-8
```

- getpreferredencoding が `UTF-8` なので、utf-8のテキストがエラーもなく読める。
- 実際に `LC_CTYPE` を変えてエラーになるのを確認する
- 一時的に `LC_CTYPE` を変える時は `setlocale` を使う
​

```python
import locale
​
locale.setlocale(locale.LC_CTYPE, ('C')) 
print(locale.getpreferredencoding(False)) # => US-ASCII になる
​
with open('hoge.txt') as fp:
    text = fp.read()
```
​結果​

```
US-ASCII
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    text = fp.read()
  File "/path/to/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)
```
- LC_CTYPE を C に設定したことで、文字エンコーディング US-ASCII になる
- その結果 uff-8 のテキストを read する時に `UnicodeDecodeError` となった​

```
メモ
- setloacaleを使わずに LC_CTYPE の環境変数を直接変更しても同じ挙動を確認できる
- getpreferredencoding(do_setloacal=False) にしないと、setlocaleで一時的に変更したエンコーディングが取得できなかった。
```

## 対応
- 基本的には、ファイルを扱う時には、文字エンコーディングを指定するのが良い
- Python3 では `open` が `encoding`引数を受け取れるようになったのでそれを利用すれば良い(=`LC_CTYPE`には関係なくファイルを扱える)​

```python
with open('utf-8.txt', encoding='utf-8') as fp:
    text = fp.read()
```
- python2, python3 の両方で動くようなライブラリを書くのであれば、binaryモードで開いてからutf-8にするか、codecsモジュールを使うのが良い。

```python
#! -*- coding:utf-8 -*-
import locale
import codecs
import six
​
locale.setlocale(locale.LC_CTYPE, ('C'))
​
with open('utf-8.txt', 'rb') as fp:
    text1 = fp.read()
    text1 = six.text_type(text1, 'utf-8')
​
with codecs.open('utf-8.txt', 'r', encoding='utf-8') as fp:
    text2 = fp.read()
​
assert text1 == text2
```

## まとめ

- Python3 は OS 及び `locale(LC_CTYPE)` に依存してファイルを扱う時のデフォルトの文字エンコーディング決定する
- 基本的に文字エンコーディングを指定した上でファイルを扱うのが良い。でないと意図せぬ不具合に遭遇する。
- 最近そういうやらかしをしまして, すいませんという話です
- https://github.com/zengin-code/zengin-py/pull/4

## 参考
- http://qiita.com/methane/items/6e294ef5a1fad4afa843 
- http://qiita.com/methane/items/dac75ef5019b311a0f10
- https://docs.python.jp/3/library/locale.html#locale.setlocale
- https://docs.python.jp/3/library/locale.html#locale.getpreferredencoding
pdbedit --help 日本語訳

``pdbedit --help`` で表示されるヘルプメッセージの日本語訳。

#使い方

```bash
pdbedit [オプション...]
```


##-v, --verbose

詳細を表示する。

##-w, --smbpasswd-style

smbpasswd 形式で出力する。

##-u=USER

ユーザ名を使用する。

##-U SID=文字列

ユーザの SID または RID を設定する。

##--user SID=文字列, --user=USER

ユーザの SID または RID を設定する。

ユーザ名を使用する。

##-N, --account-desc=文字列

アカウントの説明を設定する。

##-f, --fullname=文字列

フルネームを設定する。

##-h, --homedir=文字列

ホームディレクトリを設定する。

##-D, --drive=文字列

ホームドライブを設定する。

##-S, --script=文字列

ログオンスクリプトを設定する。

##-p, --profile=文字列

プロファイルパスを設定する。

##-I, --domain=文字列

ユーザのドメインを設定する。

##-M SID=文字列

マシンの SID または RID を設定する。

##-m

アカウントはマシンアカウント。

##--machine SID=文字列, --machine

マシンの SID または RID を設定する。

アカウントはマシンアカウント。

##-a, --create

ユーザを作成する。

##-r, --modify

ユーザを修正する。

##-x, --delete

ユーザを削除する。

##-b, --backend=文字列

異なる passdb を既定のバックエンドとして使用する。

##-i, --import=文字列

指定したバックエンドからユーザアカウントをインポートする。

##-e, --export=文字列

指定したバックエンドへユーザアカウントをエクスポートする。

##-g, --group

[-i](#-i---import文字列) と [-e](#-e---export文字列) をグループを対象に使用する。

##-y, --policies

[-i](#-i---import文字列) と [-e](#-e---export文字列) をバックエンド間でアカウントポリシーを移動する為に使用する。

##--policies-reset

既定のポリシーを復元する。

##-P, --account-policy=文字列

(maximum password age のような)アカウントポリシーの値

##-C, --value=LONG

指定した値をアカウントポリシーへ設定する。

##-c, --account-control=文字列

アカウントコントロールの値。

##--force-initialized-passwords

passdb バックエンドの壊れたパスワード文字列の初期化を強制する。

##-z, --bad-password-count-reset

不良パスワード数をリセットする。

##-Z, --logon-hours-reset

ログオン時間をリセットする。

##--time-format=文字列

時間パラメータの時間書式。

##-t, --password-from-stdin

標準入力からパスワードを取得する。

##-K, --kickoff-time=文字列

開始時間を設定する。


#ヘルプオプション:

##-?, --help

このヘルプメッセージを表示する。

##--usage

簡潔な使用法を表示する。


#Samba 共通オプション:

##-d, --debuglevel=DEBUGLEVEL

デバッグレベルを設定する。

##-s, --configfile=CONFIGFILE

異なる設定ファイルを使用する。

##-l, --log-basename=LOGFILEBASE

ログファイルのベースネーム。

##-V, --version

バージョンを表示する。

##--option=name=value

コマンドラインから [smb.conf](http://qiita.com/JhonnyBravo/items/6a68972cf5962a3c5afd) オプションを設定する。
Vagrantについてのメモ（コマンド）

## 概要
vagrantのコマンドをすぐ忘れて検索するので書き留めておく。

## コマンド （環境確認）
### バージョン確認
インストールされているVagrantのバージョンを確認する

```sh:コマンドプロンプト
$ vagrant --version
Vagrant 1.9.6

$ vagrant -v
Vagrant 1.9.6
```

### ヘルプ
コマンドなどのヘルプを見る

```sh:コマンドプロンプト
# コマンドの一覧と概要を見る
$ vagrant -h

# 個別にコマンド毎のヘルプを見る
$ vagrant {コマンド} -h
```

---

## コマンド（BOX操作）
### BOX一覧
登録済みのBOX一覧を表示する

```sh:コマンドプロンプト
$ vagrant box list
bento/centos-7.1  (virtualbox, 2.2.2)
bento/centos-7.2  (virtualbox, 2.3.0)
centos/7          (virtualbox, 1705.02)
```

### BOX追加
登録済みのBOXを追加する

```sh:コマンドプロンプト
# VagrantCloudで公開されているBOXを追加
$ vagrant box add {対象BOX}

# URLからBOXを追加
$ vagrant box add {登録BOX名} {URL}

# ローカルのpackage.boxから追加
$ vagrant box add {登録BOX名} {パス（package.box)}

# PHP5.6のLaravel/Homesteadを追加
$ vagrant box add laravel/homestead --box-version 0.3.3 --provider virtualbox
```

### BOX削除
登録済みのBOXを削除する

```sh:コマンドプロンプト
$ vagrant box remove {削除対象BOX}
$ vagrant box remove {削除対象BOX} --box-version 2.0.0 --provider virtualbox
```

### 初期化
指定のBOXでVagrantfileを自動作成されます

```sh:コマンドプロンプト
$ vagrant init {対象BOX}
```
### パッケージ化
現在の環境をBOXファイルとしてローカルに保存する
※「package.box」というファイル名で出力される

```sh:コマンドプロンプト
$ vagrant package
```

-----

## コマンド（VM操作）

### 仮想マシン起動
Vagrantfileにしたがって、仮想マシン(VirtualBoxなど)を起動する
※プロビジョニングを一緒に実行する場合は、「--provision」オプションを付ける

```sh:コマンドプロンプト
# 起動
$ vagrant up

# 起動＋プロビジョンを実行
$ vagrant up --provision
```

### プロビジョニングで実行する
```
$ vagrant provision
```

### 仮想マシン一時停止
```
$ vagrant suspend
```

### 仮想マシン停止
仮想マシンを停止する

```sh:コマンドプロンプト
$ vagrant halt
```

### 仮想マシン再起動
仮想マシンを再起動する
※プロビジョニングを一緒に実行する場合は、「--provision」オプションを付ける

```sh:コマンドプロンプト
# 再起動
$ vagrant reload

# 再起動＋プロビジョン実行
$ vagrant reload --provision
```

### 仮想マシン状態確認

```sh:コマンドプロンプト
# 仮想マシンの状態(コマンド実行フォルダの仮想マシン単体)
$ vagrant status

# 仮想マシンの状態（複数)
$ vagrant global-status
```

### 仮想マシン破棄
仮想マシンを破棄する

```sh:コマンドプロンプト
$ vagrant destroy
```

### 仮想マシンへ接続
起動中の仮想マシンへssh接続する

```sh:コマンドプロンプト
# SSH接続
$ vagrant ssh

# 接続情報を表示
$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/hoge/Vagrant/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

# SSH接続のショートカットを作成する
$ vagrant ssh-config >> ~/.ssh/config
$ ssh default
```
## 参考資料

- [開発環境の構築・共有を簡単にするVagrant入門](https://thinkit.co.jp/story/2015/03/19/5740)

---
SpringBoot構築メモ(Java版)


##開発環境
- STS(SpringToolSuite)
- IntelliJ

## パッケージ管理
- Maven
- Gradle

## 依存ライブラリ
- Lombok
- Web
- Thymeleaf: テンプレートエンジン
 - Webjar(Bootstrap): CSS
- JPA(Java PersistanceAPI): O/Rマッパー
 - JPQL: SQLをベンダー依存しないようにラップ
- H2(オンメモリDB): 開発時のDB,実際はMySQL
- Flyway: DBマイグレーション
 - /src/main/resources/db/migrationsに置いとくと実行される
- JUnit: ユニットテスト
- Spring Security: 認証系

## 実行環境
- 開発
 - 組み込みTomcat
 - PCF Dev

- 運用
 - Cloud Foundry

CloudFoundryは、パブリッククラウド（AWS/Azure/GCP）や、プライベート仮想環境（OpenStack/VMWare vSphere）上で利用できる
また、PaaSでも提供されている

## PaaS
- Pivotal Web Service(PWS)
 - PCF Dev: ローカル開発用仮想環境
 - cleardb: MySQLマネージドサービス
 - rediescloud: Redisマネージドサービス
- IBM Bluemix
- Swisscom Application

## 参照
- Pivotal Web Service
 - https://pivotal.io/jp/platform
 - https://network.pivotal.io/
NAT 時に kvm へ ssh する。


kvm のデフォルトネットワーク使用時、

手元 => HOST => GUEST の場合

```
#/bin/bash
parent=USER_HOST@HOST
child=USER_GUEST@$(ssh USER_HOST@HOST "cat /var/lib/libvirt/dnsmasq/default.leases | cut -d' ' -f 3")
ssh -t $parent "ssh $child"
```

まあ、コンソールの設定済ましてれば、

```
$ ssh -t root@HOST "virsh console CHILD"
```

なんかで済むけど。
Prometheusのrelabel config例

Prometheusの[relabel config](https://prometheus.io/docs/operating/configuration/#relabel_config)の挙動がドキュメントからだと良くわからなかったのと、すぐ忘れそうなので実際に試してみた結果をざっとメモっておく。

### 1. scrape結果に含まれるlabelは弄くれない模様
例えばnode_exporterが公開しているメトリクスにnode_cpuというメトリクスがあり、このメトリクスにはcpuというラベルがあるがこれをrelabel configで弄るのは不可能だった。

### 2. `action=replace`
`source_labels`で指定したラベルの値を`separator`でjoinした結果に対して`regex`の正規表現でマッチした結果を`replacement`で置き換えて、`target_label`にセットする。

設定例

```
relabel_configs:
  - source_labels: [__address__, __metrics_path__]
    separator: ;
    target_label: relabel
    regex: ([^:]+):(\d+);\/(.*)
    replacement: ${1}_${2}_${3}
```

`__address__`が`localhost:9100`、`__metrics__path__`が`/metrics`の場合、`relabel`の値として`localhost_9100_metrics`がセットされる。　　
また、`target_label`でregexのマッチ結果の後方参照値をラベル名にセットすることも出来る。

```
target_label: relabel_${2}
```

とセットするとラベル名が`relabel_9100`になる。

### 3. `action=keep`
`source_labels`で指定したラベルの値を`separator`でjoinした結果に対して`regex`の正規表現でマッチした結果のみを残し、マッチしないケースを除外する。

設定例

```
relabel_configs:
  - source_labels: [__address__, __metrics_path__]
    separator: ;
    regex: localhost:\d+;\/.*
    action: keep
```

上記の場合`__address__`に`localhost`とそれ以外の値が設定される場合は`localhost`以外は除外される。

### 4 `action=drop`
`action=keep`のケースと逆に`regex`にマッチする項目を除外して、マッチしない項目を残す。3の例で`action=drop`に変更すると`__address__`が`localhost`のもののみが除外される。

### 5 `action=hashmod`
`source_labels`を`separator`でjoinした結果のハッシュ値を`modulus`で指定された値でmodした結果を`tarbet_label`にセットする模様。

### 6 `action=labelmap`
`regex`の正規表現にマッチするラベル名を`replacement`で置き換える。

設定例

```
relabel_configs:
  - regex: __(address|metrics_path)__
    replacement: ${1}_relabel
    action: labelmap
```

上記の例だと`address_relabel`と`metrics_path_relabel`というラベルが追加される。値はそれぞれ`__address__`、`__metrics_path__`のそれ。

### 7. `action=labeldrop`
`regex`でマッチしたラベルを削除する。

設定例

```
relabel_configs:
  - regex: job
    action: labeldrop
```

上記の例では`job`ラベルを削除する。

### 8. `action=labelkeep`
`action=labeldrop`の逆で、`regex`でマッチしたラベルのみを残す。7の例で`action: labelkeep`にすると`job`ラベル以外を削除する。
（但し、実際にこれをやると`__scheme__`や`__metrics_path__`等のラベルが削除されてmetricsが表示されなくなった。)
testparm --help 日本語訳

``testparm --help`` で表示されるヘルプメッセージの日本語訳。

#使い方

```bash
testparm [OPTION...] <config-file> [host-name] [host-ip]
```


##-s, --suppress-prompt

enter プロンプトの表示を抑制する。

##-v, --verbose

既定のオプションと一緒に表示する。

##-l, --skip-logic-checks

全体の確認を省略する。

##--show-all-parameters

パラメータ、種類、取り得る値を表示する。

##--parameter-name=文字列

testparm の実行対象を指定したパラメータのみに制限する。

##--section-name=文字列

testparm の実行対象を指定したセクションのみに制限する。


#ヘルプオプション:

##-?, --help

このヘルプメッセージを表示する。

##--usage

簡潔な使用法を表示する。


#Samba 共通オプション:

##-V, --version

バージョンを表示する。


#Samba デバッグ共通:

##-d, --debuglevel=DEBUGLEVEL

デバッグレベルを設定する。


#Samba 共通コマンドライン設定:

##--option=name=value

[smb.conf](http://qiita.com/JhonnyBravo/items/6a68972cf5962a3c5afd) オプションをコマンドラインから設定する。
cron で、ディスクスペースアラートを。


cron の MAILTO では件名を弄れないから。

毎時 59 分にルートが 75% 以上だったらメールする。

```
59 * * * * df | perl -lane 'next if !m{(\d+)\%\s+/$}; next if $1 < 75 ; qx{echo ${1}\% | mail -s "disk space alart" bunzaemon\@example.com} '
```

キモは、`\%`。 

`%` は crontab 上では改行に展開するので、それをエスケープしている。他のエスケープは、perl文法上のもの。
matplotlib の色一覧を出すワンライナー



```shell-session:
python -c 'import matplotlib ; print matplotlib.colors.cnames' | perl -F, -lane 'print for @F' | head
{'indigo': '#4B0082'
 'gold': '#FFD700'
 'hotpink': '#FF69B4'
 'firebrick': '#B22222'
 'indianred': '#CD5C5C'
 'yellow': '#FFFF00'
 'mistyrose': '#FFE4E1'
 'darkolivegreen': '#556B2F'
 'olive': '#808000'
 'darkseagreen': '#8FBC8F'
```
スクリプト言語を bash スクリプトに埋め込むためのメモ2


断捨離

随分前に書いた、[コレ](http://qiita.com/bunzaemon/items/5864dc4054ee376065a2)に続いて。

あ、Windows での挙動には触れない。

# perlとruby

```shell-session:A
$ cat hoge.pl
#!/bin/bash
find . -type f | perl -x $0
exit 0

#!/usr/bin/env perl -ln
print ;

$ perl hoge.pl
./bar
./foo
./hoge
.
.
.
```

## 1. perl は、インタプリタを解釈してくれる。


>　#! 行に "perl" や "indir" という語が含まれていなければ、#! の後に 指定されたプログラムが Perl インタプリタの代わりに実行されます。 これは少し変わっていますが、#! が行なえないマシンを使っている方には 有効でしょう; プログラムに対して使っている SHELL が /usr/bin/perl だと 言っておけば、Perl が正しいインタプリタを起動してくれるからです
([perlrun](http://perldoc.jp/docs/perl/5.22.1/perlrun.pod)より引用)

つまり、

```shell-session:
$ cat hoge.rb
#!/usr/bin/env ruby
puts("ruby")
$ perl hoge.rb
ruby
$ cat hoge.sh
#!/bin/bash
echo bash
$ perl hoge.sh
bash
```

## 2. ruby は、インタプリタが複数書かれてたら、ruby まで読み飛す。

>コマンドラインに指定したスクリプトが `#!` で始まるファイルで、その行に `ruby` という文字列を含まない場合、その行を読み飛ばします。`#!` に続く 文字列が `ruby` という文字列を含む行を見つけたらその行以下を Ruby スク リプトとして実行します。
([rdoc](https://docs.ruby-lang.org/ja/latest/doc/spec=2frubycmd.html)より引用)

```shell-session:B
$ cat hoge2.sh
#!/bin/bash
echo bash
ruby -x $0
exit 0
#!/usr/bin/env ruby
puts("ruby")
```

の場合、

```shell-session:
$ ruby hoge2.sh
ruby
```

## 3. perl も ruby も -x によって、解析開始を遅らす事が出来る。

>-x スイッチを 指定した場合には、まず、最初に #! と "perl" という文字列を 含む行を探し、そこから解析を始めます。 これは、大きなテキストにプログラムを埋め込んで、実行するようなときに便利です。 (この場合、プログラムの終わりは、トークン __END__ を使って 示すとよいでしょう。)

([perlrun](http://perldoc.jp/docs/perl/5.22.1/perlrun.pod)より引用)

ruby の方も [rdoc](https://docs.ruby-lang.org/ja/latest/doc/spec=2frubycmd.html) に同様の事が明記してある。

てなわけで、A のコードが成立する。

ruby の B でも

```shell-session:Bをbashで実行する。
$ bash hoge2.sh
bash
ruby
```



なので、こう言うことも出来る。

```shell-session:
$ cat hoge3.sh
#!/bin/bash
echo bash
perl -x $0
ruby -x $0

exit 0

#!/usr/bin/env perl
print("perl\n") ;

__END__

#!/usr/bin/env ruby
puts("ruby")

__END__
```

```shell-session:bashで実行
$ bash hoge3.sh
bash
perl
ruby
```
```shell-session:perlで実行
$ perl hoge3.sh
bash
perl
ruby
```
```shell-session:rubyで実行
$ ruby hoge3.sh
ruby
```

## 追記

って書いたけど、


改めて読みなおしたら、 ruby の場合 -x の存在意義って無いなあ?
何の為だろう、、、windows の為だろうか、、、


```tsuiki.sh
#!/bin/bash
ruby -x $0
exit 0
#!/usr/bin/env ruby
puts("ruby")

^D            # コントロール + V、コントーロル + D で埋め込み(mac のターミナル)

puts("test")
```

```
$ bash tsuiki.sh
ruby
$ ruby tsuiki.sh
ruby
``` 



#pythonの場合

python の場合は、-x があるものの、かなりの制限を掛けて、「一行のみ飛ばすだけですよーーー」と明記してある。

>-x(原文)
Unix 以外の形式の #!cmd を使うために、ソースの最初の行をスキップします。これは、DOS専用のハックのみを目的としています。
([ドキュメント](https://docs.python.jp/3/using/cmdline.html)より引用)

とは言え、無理をすれば、

```
$ cat hoge4.sh
find . -type f | python -x  $0 ; exit 0
#!/usr/bin/env python
import sys
for line in sys.stdin:
   print(line.strip())
```

```shell-session:Aと同様の事
$ bash hoge4.sh
./bar
./foo
./hoge
.
.
.
```

みたいな事が出来なくもない。
[ruby]連番の配列を用意する

参考：[知って得する！５５のRubyのトリビアな記法](http://melborne.github.io/2013/03/04/ruby-trivias-you-should-know-4/)

こうすると、RangeクラスをArrayに入れてしまう。

```ruby
[1..10] # => [1..10]
```

こうすると連番のArrayを用意できる。

```ruby
[*1..10]
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[*'a'..'f']
# => ["a", "b", "c", "d", "e", "f"]
```
CocoaPodsで導入したライブラリの更新有無の確認方法

自作アプリでCocoaPodsでいくつかライブラリを導入しているのですが、いちいち各ライブラリの更新を確認するのめんどくさいなぁと思ってググってみました。

やはりありました。先人のおかげで助かりますです。
検索結果で最初に目に入ったのはQiitaの記事でした。

こちらの記事です。
[CocoaPodsで導入したライブラリがアップデートされているか調べる方法](http://qiita.com/tmnb/items/e3575c3f1895c3ff36d1)

これでめんどくさいことやらずに済んだ！と喜び勇んで記事に記載されていたにコマンドを実行しました。
少し待っていると...
ログをいっぱい吐き出して終了。
ログの内容を見たら、エラーメッセージっぽいのが目に留まったのでよく見てみると...

以下のようなメッセージが何回か出力されてました。
```LoadError - cannot load such file -- nanaimo```

どうやら「nanaimo」ってファイルが読み込めないようです。
またグーグル先生に問い合わせです。
検索は「pod outdated cannot load such file nanamio」でやってみました。

するとCocoaPodsのIssuesのページが最初にヒットしたので中を読んでみました。
まずは「nanaimo」をインストールしてみました。

以下のコマンドを実行
```sudo gem install nanaimo```

処理終了後にまた確認コマンドを実行しました。
が、またもや同じエラーが...

先ほどのCocoaPodsのIssuesの続きから最後まで読みました
結果、一番最後のコメントにあったコマンド全て実行ののち、確認コマンドを実行したらうまくいきました！
(お恥ずかしい最後まで読んでませんでした:(；ﾞﾟ'ωﾟ'):ダメですね)
[該当のコメント](https://github.com/CocoaPods/CocoaPods/issues/6214#issuecomment-308042103)

一応そのコマンド実行のログ置いときますね。

>
sudo gem uninstall nanaimo

>You have requested to uninstall the gem:
	nanaimo-0.2.3
>
xcodeproj-1.4.1 depends on nanaimo (~> 0.2.0)
If you remove this gem, these dependencies will not be met.
Continue with Uninstall? [yN]  y
Successfully uninstalled nanaimo-0.2.3
>
sudo gem install nanaimo
Fetching: nanaimo-0.2.3.gem (100%)
Successfully installed nanaimo-0.2.3
Parsing documentation for nanaimo-0.2.3
Installing ri documentation for nanaimo-0.2.3
1 gem installed
>
pod install -> enjoy
pod outdated

以上です。
RUST ironフレームワーク入門

Mozillaが中心となってオープンソースで開発されている言語「Rust」。
Mozillaが開発を主導しているためか、WebAssembly対応に非常に積極的です。
今回はRustをインストールし、ironフレームワークから「Hello World」を出すところまで。 Rustのビルドシステム兼パッケージマネージャのCargoを使用します。
#rust install 
cd ~/　に移動し以下を実行します。
`curl https://sh.rustup.rs -sSf | sh`

実行すると以下の文言がでてくるので、１を選択。

```
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
```

成功すると以下のように表示されるはずです
```Rust is installed now. Great!```

#cargo
RustのビルドシステムであるCargoを使います。
またパッケージマネージャでありCargoをRustプロジェクトの管理にも使用します。
公式インストーラーからrustを導入しているなら、rustに同梱されているはずです。
``` cargo --version ```
もし出ない場合はpathを通す必要があるので、~/.bashrcに追記します。

```
#Rust 
export PATH="$HOME/.cargo/bin:$PATH" 
```
追記後パスを反映させる ```source ~/.bashrc```を実行します。

#ironフレームワークにてプロジェクトを作成
任意のディレクトリにて以下を実行
```cargo new iron ```
ironプロジェクトを作成します。

実行すると```Cargo.toml```　ファイルと　```src```のディレクトリができていると思います。

Cargo.tomlに以下を追記します。

```
[dependencies.iron]
version = "*"
```

srcディレクトリに新しくmain.rsファイルを作成し以下を記述します。

```
extern crate iron;

use iron::prelude::*;
use iron::status;

fn main() {
    Iron::new(|_: &mut Request| {
        Ok(Response::with((status::Ok, "Hello world!")))
    }).http("localhost:3000").unwrap();
}　
```


```cargo build```を実行しビルドします。
最後に以下にてプログラムを実行できます。
```cargo run```

http://localhost:3000/
にて```Hello world!```が確認できれば成功です。
C# Chartライブラリ

C#でリアルタイムの時系列チャートを探したときの備忘録。

* Windows Formの場合

1. Lightning Chart
2. Measurement Studio

* WPF の場合

1. SciChart https://www.scichart.com/
2. Visiblox https://www.visiblox.com/
3. Lightning Chart https://www.arction.com/
4. PlotLab http://www.mitov.com/products/plotlab#overview
Picassoでオリジナルの画像をキャッシュする

- Picassoのキャッシュはリサイズ後の画像サイズとscaleTypeごとに個別にキャッシュされる

 ```java
// 一回目の読み込み
 Picasso.with(context).load(url).resize(100, 100).centerCrop().into(imageView)

// これはキャッシュが効く
 Picasso.with(context).load(url).resize(100, 100).centerCrop().into(imageView)

// これはサイズが違うので、キャッシュが効かない
 Picasso.with(context).load(url).resize(500, 500).centerCrop().into(imageView)
 ```
- でも、これだと都合が悪い時がある。一覧画面から詳細画面に遷移するようなときに、一覧画面では100x100で画像を表示するが詳細画面では500x500で表示したい場合、オリジナルの画像がキャッシュされてないと通信が発生してしまう。
- こんな場合は、Picassoのキャッシュではなく、その下層のOkHttpのキャッシュを有効にする

```java
int cacheSize = 10 * 1024 * 1024; // 10 MiB
Cache cache = new Cache(cacheDirectory, cacheSize);
client = new OkHttpClient.Builder()
    .cache(cache)
    .build();
```

- OkHttpのキャッシュが有効になるかどうかは、リクエストとレスポンスのヘッダーによる。
    - [OkHttpのwiki](https://github.com/square/okhttp/wiki/Recipes)には、`max-stale`と`max-age`だけ書いてあるが、他にも`date`や`age`なども影響しそう。詳しくは`CacheStrategy`のソースを読むしかない。
「退屈なことはPythonにやらせよう」演習 ~コマンドラインメーラー~

教習所の技能教習予約が24時間見張ってないと空きを見つけられず、システムを自動化すべくpythonを勉強中のよっしーです。

タイトルの書籍の演習11.10.1で出てきたコマンドライン電子メーラーを作ったので、整理してみました。

今回はExciteメールを利用したのですが、理由としてはGmailやyahooだと何らかの多段階認証になっていたので、idとパスワードだけで簡単にログインできるのがExciteメールだったからです。

#環境
 - python 3.6.0
 - PyCharm 2017.1
 - MacbookAir sierra 10.12.5
 - Safariは「リモートオートメーションを許可」をオン

#方針
 - コマンドラインから、メールアドレスとテキストを受け取る
 - seleniumでExciteメールにログインする
 - メールを新規作成し、引数として受け取ったメールアドレス宛にテキストを送る

#プログラムの方針
 - sysモジュールを使い、sys.argv[1]にメールアドレス sys.argv[2]にテキストを受け取る。
 - seleniumモジュールのwebdriverで、Exciteメールのログインページを開き、sendKeysでユーザー名とパスワードを送信し、submit()でログイン
 - 新規作成のリンクからメール送信画面を開き、引数で受け取ったメールアドレスとテキストを入力しsubmit()する

#実装

```py3:CommandlineMailer.py
#! python 3.6.0
# commnadlineMailer.py - コマンドラインで受け取ったメールアドレス宛に文章を送る
# Usage:
# commnadlinMailder.py <some@excite.co.jp> <sometext> - 第一引数でメールアドレス,　第二引数でテキストを受け取る

import sys
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

if len(sys.argv) > 2:
    email_adress = str(sys.argv[1])
    main_text = str(sys.argv[2])

    # Exciteメールを開いてログインする
    browser = webdriver.Safari()
    browser.get('https://ssl2.excite.co.jp/idc/login/?si=mail&ru=http%3A%2F%2Femail.excite.co.jp')
    # idタグがなかったのでnameタグを利用した
    email_elem = browser.find_element_by_name('loginid') 
    email_elem.send_keys('yourMailAdress@excite.co.jp')

    password_elem = browser.find_element_by_id('id-password')
    password_elem.send_keys('yourPassword')
    password_elem.submit()

    # ページの表示待ちをしてから、新規作成画面を開く
    link_elem = WebDriverWait(browser, 10).until(
        EC.element_to_be_clickable((By.LINK_TEXT, '新規作成'))
    )
    link_elem.click()

    # ページの表示待ちをしてから、メアドと本文を入力して送信
    to_elem = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.ID, 'to'))
    )
    to_elem.send_keys(email_adress)

    main_text_elem = browser.find_element_by_id('body')
    main_text_elem.send_keys(main_text)

    send_elem = browser.find_element_by_id('_sendmail')
    send_elem.submit()
else:
    print('引数が少ないです')

```

# 引っかかった点
最初、表示待ちをせずに実装をしていてエラーがバンバン出て「?」て感じでしたが、未表示の時点でアクセスをするとエラーが出ることに気がつきました。

WebDriverWaitを使って「特定の要素が現れるまで ≒　更新成功まで」の停止処理をするのがポイントでした。WebDriverWait(browser, 10)で指定した10秒以内に更新できなかったら、タイムアウトのエラーが帰ってきます。

# 手を抜いた点
演習でしか使わないので正規表現でメールアドレスかどうか確かめたり、引数が逆だった時の処理などは省きました。
DrupalでWatson(Speech to text)を使う

 DrupalのWatsonモジュールをみつけたので設定を書いておきます。
このモジュールはWatsonのコンテンツフィールドにWatsonフィールを追加することができるようになります。Watsonフィールドでは音声ファイルをアップロードします。そのコンテンツを閲覧するとテキストふになっているという動きです。
何か取材に行って音声ファイルなどがある場合に簡単に文字おこしができます。

手順は
1 BluemixポータルでWatson Speech to textを申し込む
2.DrupalにWatsonモジュールを追加、設定
3.コンテンツタイプにWatsonフィールドを追加、コンテンツを作成。

1 BluemixポータルでWatson Speech to textを申し込む
BluemixポータルでWatson speech to textを申し込んでください。
![bmx.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/0008a7da-417f-2f2f-3af2-9515c01b0648.jpeg)

申し込みの後ダッシュボードでSpeech to textを選択、サービス資格情報をクリックしてください。画面右側にある資格情報の表示をクリックするとアクセスポイントやユーザー名などが表示されます。後で使うのでメモをしておいてください。

![watson4.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/df8e4dff-fc35-7f1e-d723-c8f55231d85a.jpeg)

Bluemixでの作業はこちらで終了です。

2.DrupalにWatsonモジュールを追加、設定
 DrupalにWatsonモジュールをインストールしてDrupalの管理画面で有効にしてください。
![watson1.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/290e31d4-606b-228e-92f0-7fab69048640.jpeg)

次にメインメニューの環境設定でIBM Watson Field settingsをクリックしてください。
![watson2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/1a007fd2-3bf4-970f-50cd-d9310591a039.jpeg)

1の手順でメモしたアクセスポイント、ユーザー名などを入力してください。
![watson.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/9bfd6e85-8099-5e3b-5eb6-7fd66da1d828.jpeg)

3.コンテンツタイプにWatsonフィールドを追加、コンテンツを作成。
　今回は”記事”のコンテンツフィールドにWatsonを追加します。
![watson7.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/a11de36f-f9ed-a7f5-27f4-5022d5e9a932.jpeg)
そうすると新しい生地コンツンツを追加しようとするとWatsoinフィールを追加することができ音声ファイル(.wavファイル)
をアップロードすることができます。
![watson9.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/1103a59c-aa95-1c73-d9fa-ce615aa7af22.jpeg)
今回はCNN English Expressの音声ファイルを使ってみました。日本語もぜひ試してみてください。
![text.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/e0c884a9-f284-8818-71be-1a1898fcfee7.jpeg)
Rubyでバイナリ文字列をintに変換するやつの高速化

# 何をしたいか

バイナリを解析するときにもっとも高速に数値に変換したい。

ランダムバイナリ文字列の特定の場所にある数値を 32bit signed integer にリトルエンディアンで変換する場合の高速な手法を探す。

もっといえば、unpack は本当に速いか。

ここでは 100MB のランダムバイナリを作り、そこからなるべく速く数値を 1000 万回選び出す。

# 立候補者

## bytes さん

[bytes](https://docs.ruby-lang.org/ja/latest/class/String.html#I_BYTES) でデータ全体をバイト列に変換したあと、pack して、さらに unpack する。泡沫候補。

```rb
data.bytes[e, 4].pack('C*').unpack('l<')[0]
```

## byteslice さん

[byteslice](https://docs.ruby-lang.org/ja/latest/class/String.html#I_BYTESLICE) でデータからバイナリを切り出したあと、unpack する。最有力候補。

```rb
data.byteslice(e, 4).unpack('l<')[0]
```

## @ さん

[unpack](https://docs.ruby-lang.org/ja/latest/method/String/i/unpack.html) の @ を使って位置指定する。位置はテンプレート文字列で与える（to_s は遅い）。こちらも有力候補。

```rb
data.unpack("#@#{e}l<")[0]
```

## Fiddle さん

位置指定をポインタでやってみる。危険かつひねくれ者。ポインタの演算をするとそのタイミングでクラスを作るのが厄介。

```rb
require 'fiddle'
ptr = Fiddle::Pointer[data]
```

```rb
(ptr + e).to_str(4).unpack('l<')[0]
```

## bit-shift さん

bytes でバイト列にしたあとそのバイト列をビットシフトして値を作り直す。新勢力になるかもしれない。

```rb
a, b, c, d = data.byteslice(e, 4).bytes
r = a + (b << 8) + (c << 16) + (d << 24)
r = (r >= 2 ** 31 ? r - 2 ** 32 : r)
```

## bin_utils さん

[bin_utils](https://github.com/funny-falcon/bin_utils) という gem を使う。ネイティブなので速いかもしれない。

```rb
BinUtils.get_sint32_le(data, e)
```

## rubyinline さん

[rubyinline](http://www.zenspider.com/projects/rubyinline.html) という gem を使う。こちらもネイティブ関数を作れる。ビット長とエンディアンが環境依存なので注意する必要がある。

```rb
require 'inline'

class Object
    inline do |builder|
        builder.c "
        static int native_unpack(char *str, int pos) {
            return *(int*)(str + pos);
        }
        "
    end
end
```

```rb
native_unpack(data, e)
```

# 実験と考察

実験条件はいかのとおり。

```rb
require 'benchmark'

prng = Random.new(0)
data = prng.bytes(1024 * 1024 * 100)
smpl = (0...10000000).map{ prng.rand(1024 * 1024 * 25) * 4 }
```

bytes はあまりに遅い（10 個でも数秒かかる）ので省いた。

結果は以下の通り。上から byteslice、@、Fiddle、bit-shift、bin_utils、rubyinline の順。一番下は byteslice のみを行った場合。

```
       user     system      total        real
   4.310000   0.020000   4.330000 (  4.349936)
   6.680000   0.030000   6.710000 (  6.745377)
   7.190000   0.040000   7.230000 (  7.269277)
   7.980000   0.040000   8.020000 (  8.079712)
   1.620000   0.010000   1.630000 (  1.634057)
   1.540000   0.010000   1.550000 (  1.558589)
   2.210000   0.010000   2.220000 (  2.237148)
```

@ 指定は文字列に変換する処理の分遅くなっていると考えられる気がする。Fiddle もクラスベースじゃなければな。

ビットシフトはわりといけると思ったんだけどそんなことはなかった。というかこれがやりたかっただけ。

bin_utils 強すぎ。byteslice している暇すら与えられなかった。

rubyinline 最強。ネイティブは正義。

# 結論

環境依存があってもいいなら rubyinline、汎用性を求めるなら bin_utils を使いましょう。

# おまけ

bin_utils では浮動小数点が実装されていないので、byteslice を使うのがいいと思う。

```rb
# リトルエンディアン・単精度
data.byteslice(e, 4).unpack('e')[0]

# ビッグエンディアン・倍精度
data.byteslice(e, 8).unpack('G')[0]
```

任意長 Null 終端文字列の場合は byteslice できないので、@ で切るのがいいと思う。Fiddle でもできるが強くおすすめする理由はない。

```rb
# unpack
data.unpack("@#{e}Z*")

# Fiddle
ptr = Fiddle::Pointer[data]
(ptr + e).to_s
```
Laravel5.4 で　Vue環境の確認

Laravel5.4　インストール後の記事があまりないので、メモ
mac　と違って、Windows＋仮想環境はエラー出やすい。
一応、本家マニュアル通りに実行
https://readouble.com/laravel/5.4/ja/mix.html

基本は、以下がお勧め。
http://blog.asial.co.jp/1496?category_id=12

#前提
　Laravel5.4 インストール済み
　Windows7
　Vagrant環境
　Node、npmインストール済み

#Laravel-Mix　インストール＋動作確認

プロジェクトフォルダで、
　node -v でバージョン確認　（バージョン６はＮＧ）

　npm install --no-bin-links

　を実施。　nodeは、バージョン7以上じゃないとダメっぽい。v8.0.0で動作確認
　--no-bin-links　重要
　vagrantのメモリも2048以上にしたほうが無難

　※nodeのバージョンが違ったり、--no-bin-links忘れたり、メモリが足りなかったりすると、ここで結構エラーが出てハマる。一旦削除、キャッシュ削除などの対応で解決できなくはなかったが。※うまくいってもwarnigは出る。

で、インストールすると、
　npm run dev　をそのまま実行すると、cross-envが見つからないエラーで死亡。

あとは、表題のアシアルさんのブログで解決。
Google Play Developer Publishing APIで 「403 cannotUpdateApksOnTrackWithDraftRelease」となった場合の対応

エラーreasonの「cannotUpdateApksOnTrackWithDraftRelease」で検索しても1件もヒットしなかったので記載します。

## 状況
Google Play Developer Publishing APIを実行した際に下記エラーレスポンスで失敗した。

```JSON
  {
    "code" : 403,
    "errors" : [ {
      "domain" : "androidpublisher",
      "message" : "Cannot update the APK configuration of the track when the track has a draft release. Please use UI to rollout or discard the draft release.",
      "reason" : "cannotUpdateApksOnTrackWithDraftRelease"
    } ],
    "message" : "Cannot update the APK configuration of the track when the track has a draft release. Please use UI to rollout or discard the draft release."
  }
```

## 解決策
Google Play Consoleからアプリの下書きを削除すればOKです。

1. [Google Play Console](https://play.google.com/apps/publish)から対象のアプリを選択
2. メニューから「リリース管理」の「アプリのリリース」を選択
3. 下書きが残っている場合「リリースを編集」ボタンが表示されるので、編集画面から削除する
![スクリーンショット 2017-07-01 21.38.08.png](https://qiita-image-store.s3.amazonaws.com/0/107434/537bcd33-58bb-091f-4591-5c4d7f98fc85.png)


以上です:ok_hand:
KotlinでSlackにメッセージ送る方法

## SlackでWebhook URLを発行する

ここから（ https://slack.com/apps/A0F7XDUAZ-incoming-webhooks ）Webhook URLを発行します。

<img width="1078" alt="スクリーンショット 2017-07-01 19.50.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/7132/811ff8b2-9cb4-c128-20a8-afc8724088d3.png">

発行されると`Webhook URL`ってところに
`https://hooks.slack.com/services/xxxxxx/xxxxxx/xxxxxxxxxxxxxxxxxxxxxxxx`
こんな感じのURLが貰える


## AndroidManifestでインターネットの接続を許可する

`AndroidManifest.xml`に
`<uses-permission android:name="android.permission.INTERNET"/>`を追記します。

```xml:app/src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest>
    <uses-permission android:name="android.permission.INTERNET"/>
    
    <application>
      ...
    </application>
</manifest>
```


## GradleにFuelを追加

Kotlinの[Fuel](https://github.com/kittinunf/Fuel)というライブラリーを使用します。
dependenciesに追加

```text:app/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

android {
    compileSdkVersion 25
    ...
}

dependencies {
    ...
    compile 'com.github.kittinunf.fuel:fuel:1.8.0'
}
```


## Slackにメッセージを送る
実際にkotlinでリクエストを送る処理を書いていきます。

```kotlin:app/src/main/java/xxxx/xxxx/xxxx/MainActivity.kt
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.github.kittinunf.fuel.Fuel


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        sendMessage()
    }

    fun sendMessage() {
        val webhook: String = "https://hooks.slack.com/services/xxxxxx/xxxxxx/xxxxxxxxxxxxxxxxxxxxxxxx"
        val body: String = "{ \"text\" : \"test message\" }"
        Fuel.post(webhook).body(body).responseString { _, response, result ->
            result.fold({ _ ->
                Log.d("res", response.toString())
            }, { err ->
                Log.e("err", err.toString())
            })
        }
    }
}
```
とりあえず`MainActivity`の`onCreate`から呼ばれるようにしたのでアプリを立ち上がる度にSlackへメッセージが飛びます。


## 実行！
<img width="400" alt="スクリーンショット 2017-07-01 20.52.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/7132/78488329-c314-645b-d127-1c7f68608bd1.png">


## おわり
シンプル！簡単！
Laravel を　Netbeans　＋　Vagrant　環境で使う

世の中　PHPStormで溢れてますけどね。

Netbeans 使い慣れてるからね、CakePHP も含めて。
Vagrant　もね。Windows内で　仮想サーバーつくってたりするとね。
Windows　環境で、それ構築してるとまたいろいろネットの記事通りにいろいろやってハマるんですよ。

まあ、そんなこんなで、上記について、とりあえずはメモ。
#前提
　Windows7
　NetBeans8.2
　（プラグインとかよほどの事情がなければ8.2にすべき）
　Vagrant　環境でフォルダ同期している
　Vagrant内のサーバーは　Apache2.2（または2.4）
　上記の、xdebug　設定は　過去にやってある。

#Laravel インストール
　Vagrant内で、Laravel　をインストール。これもかなりハマりポイントあるけど。
　Laravel5.4で、　npm run dev が通るところまではやっといたほうが幸せ。
　もちろん、開発環境前提なので、Vagrantで、windowsとフォルダ同期すること。
　http://192.168.33.10/
　とかで、Laravel画面が表示される状況にしましょう。
　※ここまでたどり着かないとNetbeans云々の話ではない。

#Netbeans のプロジェクト設定
（１）メニューで新規プロジェクトを追加
既存のソースを使用するアプリケーションを選択して、Vagrantと同期したフォルダを指定→　プロジェクト名とかは勝手に入る。
（２）**実行方法　ローカルWEBサイトを選択**
プロジェクトURLは、サーバー設定に依存するけど、hosts設定してるなら、そのホスト名（例1）で、そうでないなら、直接アドレスで（例２）。　
例１　　http://www.yourhost.local/
例２　　http://192.168.33.10/
サブディレクトリ運用してるなら、後ろにプロジェクト名つける形
（３）開始ファイル　を　public/index.php にする
これ、ステップ実行のデバッグでプログラムの開始場所を知らせるのに必要っぽい。

で、このままNetbeansでデバッグ実行すると、たぶん
NotFoundHttpException
で死にます。
パスをみるとわかるんだけど、
http://（ドメイン）/public/index.php?XDEBUG_SESSION_START=netbeans-xdebug
の形になってる。
これ、public/index.phpを開始ファイルに指定するとこのような形になってしまうようなんです。

あまり美しくないけど、大きな害もないので、routerで、ルートにリダイレクトさせて回避する。

```[PROJECT_NAME]/routes/web.php
以下を先頭に追加
Route::get('/public/index.php', function () {
    return redirect('/');
});
```

あとは、public/index.php のどこかでブレークポイント張って、確認すればOK。