OmniAICreator/Qiita-1.07M huggingface dataset:
10/6 本日の共有

本日の共有
要するにブックマーク( -.-)

# 仕事で使ってみてるもの

[GitHubへpull requestする際のベストプラクティス - hnwの日記](http://d.hatena.ne.jp/hnw/20110528)

[iOS - ReactiveCocoaについて - Qiita](http://qiita.com/somtd@github/items/8409ddd6d0927c04c1dd)

・デバッグ実行時に変数の値を変更できる。すごく便利。
[xcode デバッグ時に変数の値を変更する、とメソッドの実行 - Qiita](http://qiita.com/hmu29/items/573d1ba1cf8ebe67b1e5)

・これは良いまとめサイト。画面遷移に迷ったらここから近いのを探してこよう
[iOSアプリ UIデザインパターンまとめサイト - Qiita](http://qiita.com/knife0125/items/e90f7b463bd00ee30574)

・ツールバーに常駐してiOS Simulatorのディレクトリとかをすぐに開ける。便利。start at loginオプションもある
iOS - Xcode6のiPhone Simulatorのディレクトリが分かりにくかったけどいいアプリめっけた！ - Qiita - http://qiita.com/singo405/items/b84f81ee2daaef27d0a2

# これから試してみたい

### クールなUI

いつかやろうと放置してたらいつの間にか膨大な数に…
途中からフォーマット書くの面倒になった

[ArtFeel/AFViewShaker](https://github.com/ArtFeel/AFViewShaker)

[RSDayFlow for iOS - Cocoa Controls](https://www.cocoacontrols.com/controls/rsdayflow)

[MAOFlipViewController for iOS - Cocoa Controls](https://www.cocoacontrols.com/controls/maoflipviewcontroller)

[MRoundedButton for iOS - Cocoa Controls](https://www.cocoacontrols.com/controls/mroundedbutton)

[LazyFadeInView for iOS - Cocoa Controls](https://www.cocoacontrols.com/controls/lazyfadeinview)

[ASProgressPopUpView for iOS - Cocoa Controls](https://www.cocoacontrols.com/controls/asprogresspopupview)

MONActivityIndicatorView for iOS - Cocoa Controls - https://www.cocoacontrols.com/controls/monactivityindicatorview

AMSmoothAlert for iOS - Cocoa Controls - https://www.cocoacontrols.com/controls/amsmoothalert

UICollectionViewRightAlignedLayout for iOS - Cocoa Controls - https://www.cocoacontrols.com/controls/uicollectionviewrightalignedlayout

GBFlatButton for iOS - Cocoa Controls - https://www.cocoacontrols.com/controls/gbflatbutton

DIDatepicker for iOS - Cocoa Controls - https://www.cocoacontrols.com/controls/didatepicker

DACircularProgress for iOS - Cocoa Controls - https://www.cocoacontrols.com/controls/dacircularprogress

Custom Controls for iOS - Cocoa Controls - https://www.cocoacontrols.com/platforms/ios/controls?cocoapods=t&page=3

zipme/RQShineLabel - https://github.com/zipme/RQShineLabel

### ビュー

・レイアウトをViewControllerじゃなくてViewに書けるらしい：レイアウトが状態によって変わったりするとあれだけど、静的なものはこっちのほうが楽そう
[Swift - UIViewのビューとレイアウトを分離する「MOAViewLayout」 - Qiita](http://qiita.com/__moai/items/c7c229a37dd6a3ca7074)

### デバッグ

iOS - スクショを送られてきた時にデバッグを楽にするライブラリを作った - Qiita - http://qiita.com/dealforest/items/6e9f2e228cba71520cf0

iOS - ログ表示ライブラリYosakuの紹介 - Qiita - http://qiita.com/sgr@github/items/6a3310faadcd9f02a413

### データモデル

・uppercrust + Mantle
　CoreDataの使いにくいところ（パーサーとか）を便利にしたMantleと、そのモデルを生成するuppercruct
　ただMantleは永続ストアをやってくれないのでそのへんはNSKeyedArchiverとかで書かないといけないらしい
[JanGorman/uppercrust](https://github.com/JanGorman/uppercrust)
[Mantle/Mantle](https://github.com/Mantle/Mantle)

・たぶん取得したデータのバリデータ。Mantleとはいっしょに使わない感じかな
[questbeat/QBValidator](https://github.com/questbeat/QBValidator)

### その他

・Pythonのcron的なものらしい
[User guide — APScheduler 3.1.0.dev1 documentation](http://apscheduler.readthedocs.org/en/latest/userguide.html)
Atom Shell v0.17.2にしたらNodObjCでCocoa APIが再び叩けるようになった

# 背景

0.16以降、NAN対応されたffiを使ったNobObjCが動かなくなってしまった。

# 治った！

NodObjC配下のffi,ref,ffi配下のrefで以下を実行してモジュールを再ビルドしてたら動いた。

Atom Shellの公式だとarch=ia32となっているが、x64に変更しないと、バイナリの形式でエラーとなった。

また、targetの指定も以前は内部で使用しているnode.jsのバージョンを指定していた気がするが、
Atom Shellのバージョンを指定する模様。

```
HOME=~/.atom-shell-gyp node-gyp rebuild --target=0.17.2 --arch=x64 --dist-url=https://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/dist
```

# 関連記事

- [Atom ShellでCocoa APIが叩けるようになった: misc](http://kjunichi.cocolog-nifty.com/misc/2014/08/atom-shellcocoa.html)
AndroidでSocket通信

あるリンクのレスポンスが独自スキーマ(google play storeのmarket://など)である場合、ブラウザでそのコールバック内容を確認できません。確認したい場合は以下の手立てが考えられます。

* WebViewでWebViewClient#shouldOverride(url)でURLを表示する
* Socket通信でリクエストの返り値を表示する


このうちSocket通信はjavaのAPIとしてあり、容易に実装できます。ちょっと注意点もあるので、まとめてみました。

### 実装のポイント
#### 1.ネットワークリクエストはUIスレッドから投げない
何も考えずにソケットをつくろうとすると、NetworkOnMainThreadExceptionが発生してしまいます。  
UIスレッドでネットワーク通信が許可されてないからです。(Android 3.0以降)  
今回はリクエストを受け取ることも考えてAsyncTaskで実装します。

```

public void connect(){

        //第一引数：execute()で入れるパラメータ
        //第二引数：onProgressUpdate()にいれるパラメータ
        //第三引数：onPostExecute()に入れるパラメータ
        new AsyncTask<Void,Void,String>(){

            @Override
            protected String doInBackground(Void... voids) {
                Socket connection = null;
                BufferedReader reader = null;
                BufferedWriter writer = null;
                String message = "result:";
                String url = "http://" + mHost +":" + mPort + mPath;
                try {
                    //ソケット
                    connection = new Socket(mHost, mPort);
                    reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                    writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
                    // ~~ 中略 ~~

                return message;
            }

            //doInBackGroundの結果(message)を受け取る
            @Override
            protected void onPostExecute(String result){
                mTextView.setText(result);
            }
        }.execute();



    }

```

doInBackground()で通信処理を行い、その返り値を受け取るのがonPostExecute()となります。  
onPostExecuteでUIスレッドに値を返してあげます。

#### 2.ユーザーエージェントを指定する
何も考えずにリクエストを投げると、モバイルからの通信だと判定されません。場合によっては正しくないレスポンスが返ってくる可能性があります。
なので、リクエストヘッダーにUser-Agent情報を追加してあげます。例えばサーバー側にAndroid4.0として認識してもらいたい場合は、

```
private String mUserAgent = "Mozilla/5.0 (Linux; U; Android 4.0.4; ja-jp; SC-06D Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30";

//BufferdWriterで設定
writer.write("User-Agent: " + mUserAgent);

```

User-Agentについてはこちらを参考にしました。-> <http://www.openspc2.org/userAgent/>

### ソースコード
上記内容を実装したアプリはこちらにあります。Android Studioで作成しているのでプロジェクトimportして実行すれば動きます。  
<https://github.com/tomoima525/SimpleSocketApplication>  

![Imgur](http://i.imgur.com/GalQ7AL.png)

### 参考
* ソケット通信の実装  
<http://ash.jp/java/java_http.htm>  
<http://x68000.q-e-d.net/~68user/net/java-http-socket-1.html>
ブラウザキャッシュが残るのを回避する方法

jsやcssを編集すると、ブラウザキャッシュに残っていて変更が反映されない場合がある。

そのため過去のブラウザキャッシュを使わなくするための処理をhtmlに書く必要がある。



☆方法

```html
<link rel="stylesheet" href="hoge.css">
<script src="fuga.js">
```


```html
<link rel="stylesheet" href="hoge.css?_=20141006">
<script src="fuga.js?_=20141006">
```


上記のように、htmlで編集したjsやcssを読み込んでいる部分に今までと異なるクエリーパラメータを付けることによって過去のブラウザキャッシュを使わなくなくなり最新の情報を取得できる。
RubyGem「defoker」で、来年の資料格納用・日付ディレクトリを自動生成


### 「defoker」gemのインストール

```
$ gem install defoker
```

###  来年用の資料ディレクトリを作成

```
$ defoker months 201501 -c 12 -a 資料
```

* コマンドの説明

months：月毎
201501：初めの月 
-c 12：12ヶ月分
-a 資料：日付ディレクトリに「資料」を加える

### 出力結果

```
$ ls
201501_資料	201504_資料	201507_資料	201510_資料
201502_資料	201505_資料	201508_資料	201511_資料
201503_資料	201506_資料	201509_資料	201512_資料
```

### 参考リンク

他にもいろいろな機能があるようです。

Ruby | 日付フォルダ生成用 CLI ツール defoker gem に内部 DSL による定形出力ルール設定機能を追加 (ver 0.0.5) #ruby #defoker
http://qiita.com/tbpgr/items/f040429d1156fd100b64

GitHub:
https://github.com/tbpgr/defoker

RubyGems:
https://rubygems.org/gems/defoker
Ruby | 日付フォルダ生成用 CLI ツール defoker gem に内部 DSL による定形出力ルール設定機能を追加 (ver 0.0.5) #ruby #defoker

# Ruby | 日付フォルダ生成用 CLI ツール defoker gem に内部 DSL による定形出力ルール設定機能を追加 (ver 0.0.5) #ruby #defoker

## 概要
日付フォルダ生成用 CLI ツール defoker gem に内部 DSL による定形出力ルール設定機能を追加します

## defoker gem って何？という方は
まずはこちらを御覧ください。
[Ruby | 日付フォルダ生成用 CLI ツール defoker gem を作成した](http://qiita.com/tbpgr/items/64bbb45e08a94a721b98)

## 定形出力ルールとは？
例えば、特定のフォルダ以下では、

当日 + _固定文字列 + _可変文字列

のようなフォルダを日々作成したいケースをここでは
「定形出力ルール」と呼ぶことにします。

「定形出力ルール」がある場合に、

~~~bash
# 20141006 に実行
$ defoker today -a ruby_object
$ ls -F | grep /
20141006_ruby_object/
# 20141007 に実行
$ defoker today -a ruby_kernel
$ ls -F | grep /
20141007_ruby_kernel/
# 20141008 に実行
$ defoker today -a ruby_class
$ ls -F | grep /
20141008_ruby_class/
~~~

のように毎度毎度入力するのは面倒です。

そこで、このようなルールをDSLで設定し、 `defoker rule <可変文字列>`
を入力すれば済むようにします。

### つまり
* このフォルダには 当日日付（YYYYMMDD）\_プロジェクト名_作業内容 のフォルダを作成する
* このフォルダには 先月日付（YYYYMM）\_月_名前 のフォルダを作成する

など、一定のルールで繰り返し利用が考えられるような作業がある場合に
今回の追加仕様が役に立ちます。

## 追加仕様
### 「定形出力ルール」設定用DSLのひな形生成機能
* `defoker init` で「定形出力ルール」設定ファイル ( Defokerfile ) を生成する

~~~
$ defoker init
# cat Defokerfile
# type is required.
# you can choose type form...
# [:today | :tomorrow | :yesterday | :this_month | :next_month | :previous_month | :this_year | :previous_year | :next_month]
# example
# type :this_month
type :today
# base is optional.
# example
# base 'ruby'
base ''
~~~

### 「定形出力ルール」に基いて、フォルダを作成する
#### 当日\_ruby\_可変 フォーマットで出力する

* Defokerfile

~~~ruby
type :today
base 'ruby'
~~~

#### 実行

~~~
# 20141006 に実行
$ defoker rule -a object
$ ls -F | grep /
20141006_ruby_object/
# 20141007 に実行
$ defoker rule -a kernel
$ ls -F | grep /
20141007_ruby_kernel/
# 20141008 に実行
$ defoker rule -a class
$ ls -F | grep /
20141008_ruby_class/
~~~

#### 前月\_月報 フォーマットで出力する

* Defokerfile

~~~ruby
type :previous_month
base '月報'
~~~

#### 実行

~~~
# execute at 201411
$ defoker rule
$ ls -F | grep /
201410_月報/
# execute at 201412
$ defoker rule
$ ls -F | grep /
201411_月報/
# execute at 201501
$ defoker rule
$ ls -F | grep /
201412_月報/
~~~

## 参照
[Ruby | 日付フォルダ生成用 CLI ツール defoker gem を作成した](http://qiita.com/tbpgr/items/64bbb45e08a94a721b98)
[Defoker　GitHub](https://github.com/tbpgr/defoker)
[Defoker RubyGems](http://rubygems.org/gems/defoker)
Pythonでssh_configのProxyCommand使ってssh接続メモ


ssh_configに以下のような設定で、fumidai_host経由でapp_hostにssh接続する構成で、paramiko使ってssh接続する場合のメモ

``` bash
Host fumidai_host
    User user_name
    Hostname xx.xx.xx.xx (<= GIP)
    IdentityFile ~/.ssh/hoge.pem


Host app_host
    HostName 192.168.0.1 (<= private ip)
    User user_name
    IdentityFile ~/.ssh/hoge.pem
    ProxyCommand ssh -W %h:%p fumidai_host

```

こんな感じで接続できます。とりあえずsftpするsample

``` python

import os
import paramiko


# ssh config fileを lookup
config_file = os.path.join(os.getenv('HOME'), '.ssh/config')
ssh_config = paramiko.SSHConfig()
ssh_config.parse(open(config_file, 'r'))
lkup = ssh_config.lookup(hostname)

# ProxyCommandの設定使って接続
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.connect(
    lkup['hostname'],
    username=lkup['user'],
    key_filename=lkup['identityfile'],
    sock=paramiko.ProxyCommand(lkup['proxycommand'])
)


sftp = ssh.open_sftp()        
# あとは普通に
# sftp.put(src, dist)したり
# sftp.get(src, dist)したり

sftp.close()
ssh.close()

```
NVD3でQiitaのタグを月単位で集計したグラフを作ってみた

[このデータ](http://qiita.com/tag1216/items/3c3812942b8e2dd9ac4c)から投稿数が多い上位50のタグを月単位で集計した積み上げグラフを作成してみた。

http://bl.ocks.org/tag1216/be1347d0738344ec3304

表示するタグは右上の一覧から選択できる。(クリックで選択／解除、ダブルクリックで他を全解除)

初期表示
![qiita-tag-statistics.png](https://qiita-image-store.s3.amazonaws.com/0/35192/6820349d-d8c9-c528-af1c-6a3dbb8bce98.png)

主要言語のシェア比較
![qiita-tag-statistics2.png](https://qiita-image-store.s3.amazonaws.com/0/35192/f5187386-e6e0-77c1-6f7e-a6b8156d267d.png)
Equinix Cloud Exchangeを利用したハイブリッド・クラウドの実現

やあ。大好きな山は天保山の、登山大好きケンイち、だよ。

今年6月頃にエクイニクス・ジャパン株式会社が2014年秋にCloud Exchangeを日本でも提供するという発表を行いました。
この発表の中には東京のデータセンターで、Microsoft Azureとの接続も計画しているという記述もありました。
そこで、Equinix Cloud Exchangeを利用した（AWS/Azureの）ハイブリッド・クラウドの構成を簡単なストーリーを交えて考えてみたいと思います。

---
#### 台本的な何か
あなたはあるECサイトの運用管理をしています。
現状、オンプレ環境(Windows)下においてECサイトの運用管理が大変になり、ECサイトをクラウドに移行することとなりました。
さらにECサイトを利用しているユーザの動向をいち早くキャッチし、サイト運営に反映させていきたいという要望も同時にあがってきました。(BigDataって今流行ってるじゃん？by上層部)
あなたは上記の課題をスムーズに解決していくために、クラウドサービスについて調べていきました。
・現在の環境がWindowsのため、クラウドサービスとしてAzureのWebsiteというサービスが良さそうだ。
・BigDataはAWSのRedshiftが良さそうだ。
と、色々と調べるうちにAWS/Azureがもつ各々の良い点が見えてきました。
でも、オンプレとクラウドのハイブリッド構成なら対応できるが、運用管理が大変なため、違う方法を考えねばならないと、あなたは悩みます。
そこで、救世主が現れたのです。その名も「Equinix Cloud Exchange」！！
これにより、あなたはAWS/Azureが持つそれぞれのサービスだけで、課題を解決することが出来たのです！

-
#### アーキテクチャ的な何か
![元ネタ4 (1).png](https://qiita-image-store.s3.amazonaws.com/0/55533/d2329e49-2cde-d60c-a889-00b02063fe36.png)

(ストーリーも、図もいい加減で申し訳ないです、、、)

---
#### まとめ的な何か
Cloud Exchangeによって、インターネットを介さずにAWS/Azure間の連携が取れるところは、今後、クラウドサービスに携わる人たちにとって、選択肢が広がることにつながりますね。
実際にサービスが開始されているわけではないので、上記のような簡単な図にはならないと思いますが、従来のオンプレとクラウドでのハイブリッドから、クラウドでのハイブリッド構成が出来るというのは胸熱ですね。

#### 余談
上層部からはコストについて指摘されましたが、AWS/Azureそれぞれに専用線を引くことによりセキュリティ面と、帯域幅のスループットについても改善することが出来ることを盾に、黙らせることに成功しましたとさ。
※ 実際はそんなことないですよねー笑
Ansible入門


# gitをansibleで入れるだけの簡単なお仕事です

まずは[こちら](http://qiita.com/oret/items/62a504aae59d4fa546c7)を最後までやっていただくとansibleのテスト環境が出来上がります

## playbookを作成

```
cd ~/ansible
vi git-playbook.yml
```

## playbookの中身

```git-playbook.yml
- hosts: sandbox
  sudo: yes
  vars:
    homedir: /home/vagrant/
  tasks:
    - name: git is installed
      yum: name=git state=installed
```

## 実行

gmpを入れろという警告が出ますが今回は問題ないのでそのまま

```
$ ansible-playbook git-playbook.yml
 [WARNING]: The version of gmp you have installed has a known issue regarding
timing vulnerabilities when used with pycrypto. If possible, you should update
it (ie. yum update gmp).


PLAY [git] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.66.54]

TASK: [git is installed] ******************************************************
changed: [192.168.66.54]
```

## 冪等性の確認

ansibleは冪等性を保つように作られています。冪等性とはある操作を1回行っても複数回行っても結果が同じであることをいう概念です。

もう一度playbookを実行してみる

```
$ ansible-playbook git-playbook.yml
 [WARNING]: The version of gmp you have installed has a known issue regarding
timing vulnerabilities when used with pycrypto. If possible, you should update
it (ie. yum update gmp).


PLAY [git] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.66.54]

TASK: [git is installed] ******************************************************
ok: [192.168.66.54]
```

１回目のplaybook実行時には「changed」と表記されたところが２回目だと「ok」と出たのが確認できたと思います。これはもう既に入っているよという事でタスクは実行されていません。

### 冪等性が保てない例外

rawモジュールで指定できるtaskは生のコマンドを流すだけなので冪等性は保たれませんので別のモジュールで対応できるところはなるべく冪等性を保てるようにしましょう

## 参考
[日本語のドキュメント](http://yteraoka.github.io/ansible-tutorial/)があるので色々やってみたくなったらこちら
msgpack-cを使ってみる

# messagepack-cのビルド

[msgpack-c(messagepackのc実装)をVSでビルド](http://qiita.com/bamchoh/items/b4b04f48da3e9be5a7ff)

を参考にビルドしましょう。(今回はx86用のexeを作る予定ですので、CMakeの設定もそれ用に設定します)

# 実行ファイルのビルド

今回は静的ライブラリを使って実行ファイルを作成してみましょう。

`Debug` / `Release` フォルダ内の `msgpack.lib`と同じフォルダで [Serialization QuickStart for C - First Program](https://github.com/msgpack/msgpack-c/blob/master/QUICKSTART-C.md#first-program) に記載されているプログラムを作成し `test.c` として保存します。

`cl /I..\src /MD test.c msgpack.lib` を実行し、ビルドします

# 実行ファイルの実行

* 同フォルダに `test.exe`が作成されますので、実行します。`["Hello", "MessagePack"]` と表示されれば成功です。
iconv: error while loading shared libraries: libiconv.so.2 とかいわれる

iconv氏をCentOSに入れる必要があったのでインストール

~~~
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar zxvf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure
make
make install
~~~

バージョンを確認しようとしたら

~~~
iconv --version
iconv: error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory
~~~

wow

さがしてたら[ここ](http://fisherman23.blog112.fc2.com/blog-entry-140.html)の手順で解決しそうだったのでやってみる

~~~
echo '/usr/local/lib' >> /etc/ld.so.conf
ldconfig
~~~

でました

~~~
iconv --version
iconv (GNU libiconv 1.14)
~~~
Marionette.Application を start した際に実行されるイベントの順番

## 検証用コード

``` my_app.js.coffee
@MyApp = do (Backbone, Marionette) ->
  App = Marionette.Application.extend
    initialize: (options) ->
      console.log 'initialize'

  app = new App()

  app.on 'start', ->
    console.log 'start'
    Backbone.history.start
      pushState: true

  app.addInitializer ->
    console.log 'addInitializer in MyApp'

  app

  app.on 'before:start', ->
    console.log 'before:start'

$(document).on 'ready', ->
  console.log 'before start MyApp'  
  console.log '--------------------'  
  MyApp.start()  
  console.log '--------------------'  
  console.log 'after start MyApp'  

$(document).on 'page:load', ->
  Backbone.history.checkUrl()

@MyApp.module 'Module1', (Module1, App, Backbone, Marionette, $, _) ->
  App.addInitializer ->
    console.log 'addInitializer in Module1'

@MyApp.module 'Module2', (Module2, App, Backbone, Marionette, $, _) ->
  App.addInitializer ->
    console.log 'addInitializer in Module2'

@MyApp.module 'Module10', (Module10, App, Backbone, Marionette, $, _) ->
  App.addInitializer ->
    console.log 'addInitializer in Module10'

```

## 実行結果

```
before start MyApp
--------------------
before:start
addInitializer in MyApp
addInitializer in Module1
addInitializer in Module2
addInitializer in Module10 
start
--------------------
after start MyApp 
```

## 結論

* まず `before:start` イベントが発火する。
* 次に `addInitializer` 関数の内容が定義された順番で実行される。
* 最後に `start` イベントが発火する。
* ~~`initialize` メソッドなんてなかったんや。~~

## 参考

* [Marionette.Application (公式ドキュメント)](http://marionettejs.com/docs/v2.2.0/marionette.application.html)
ERROR:root:code for hash md5 was not found.



```
ERROR:root:code for hash md5 was not found.
Traceback (most recent call last):
  File "/usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hashlib.py", line 139, in <module>
    globals()[__func_name] = __get_hash(__func_name)
  File "/usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hashlib.py", line 91, in __get_builtin_constructor
    raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type md5
ERROR:root:code for hash sha1 was not found.
Traceback (most recent call last):
  File "/usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hashlib.py", line 139, in <module>
    globals()[__func_name] = __get_hash(__func_name)
  File "/usr/local/Cellar/python/2.7.8_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hashlib.py", line 91, in __get_builtin_constructor
    raise ValueError('unsupported hash type ' + name)
ValueError: unsupported hash type sha1
and more
```

brew upgrade python 後に上記のようなエラーが出た場合、以下にて解消した。

https://github.com/Homebrew/homebrew/issues/22816

>brew install openssl
>brew link openssl --force
>brew uninstall python
>brew install python --with-brewed-openssl
GitでリモートのURLをgit://~からhttps://~へ自動変換する

gitでリモートリポジトリからソースを取ってくる際、proxyの都合上http/httpsで取りたいときがあります。
CLIでコマンドを打つときは手で置き換えたらいいのですが、
パッケージ管理ツール等で定義ファイルに書かれている場合、いちいち書き換えるのが面倒な場合もあります（僕はbowerで難儀しました）。

そういう場合はgitの設定の方を書き換えましょう。

```bash
$ git config --global url."https://".insteadOf "git://"
```

URLの"git://"を"https://"に置き換えて実行してくれます。
NVD3でQiitaの投稿を月単位で集計したグラフを作ってみた

[ここ](http://qiita.com/tag1216/items/471ecc915604291a2e62)に書いた手順で取得したQiitaの「ほぼ」全投稿を、月単位で集計してNVD3を使って棒グラフで表示してみた。

![qiita-item-statistics.png](https://qiita-image-store.s3.amazonaws.com/0/35192/91a4f7b2-8fed-ad56-4ef2-fa9f39b681cc.png)

# 作ったもの

http://bl.ocks.org/tag1216/0109a7ce92364c0488c7

# NVD3とは

http://nvd3.org/

d3.jsを使ったチャートライブラリ。
様々なチャートのテンプレートが用意されており、インタラクティブな操作が可能で綺麗なグラフが作れる。

d3.jsではSVG等で自分でグラフを書く必要があるが、NVD3ではデータを渡していくつかの設定をするだけで良い。

ただドキュメントが見当たらないので、サンプルを見ないと使い方が全く分からない。

サンプルを見て、自分の作りたいグラフにぴったりマッチするものがあれば、採用を検討してみるといいと思う。

サンプル
http://nvd3.org/examples/index.html
ソース
https://github.com/novus/nvd3

# データ

データは[ここ](http://qiita.com/tag1216/items/471ecc915604291a2e62)に書いた手順で取得した2014年9月までの投稿。
※正確に全投稿を取得しているわけではない。

投稿のJSONをそのまま使うとサイズが大きすぎるので、作成日時とタグを抽出したTSVファイルを事前に用意した。

```tsv
2014-09-30 23:32:50 +0900	MySQL	Windows
2014-09-30 23:33:55 +0900	Go
2014-09-30 23:43:43 +0900	AWS	CloudFront
2014-09-30 23:50:42 +0900	C#
2014-09-30 23:57:42 +0900	Vim	RuboCop	Ruby	syntastic
```

QiitaAPIはv1を使用。
v2ではより多くのデータを取得できるので使用したかったが、現時点でまだ問題があるのでv1を使用した。
残念なコード

古いコードをメンテしてて発見した何だか残念な気分にひたれるコード


```php
$global_hoge = 1;
// .....
function hoge($foo, $bar)
{
    // $global_hoge = 7;
    $bazz = get_bazz_array($global_hoge);
    if ($bazz)foreach($bazz as $key => $val){
        $array[$key] = true;
    }
    // .....
}
```

直すのつらい。
シェルで超簡単に乱数字を取得する方法

## 特殊変数？

    echo $RANDOM


## 実行例

    [hoge]$ echo $RANDOM
    417
    [hoge]$ echo $RANDOM
    29408
    [hoge]$ echo $RANDOM
    27817
    [hoge]$ echo $RANDOM
    9530
    [hoge]$ echo $RANDOM
    7971
    [hoge]$ echo $RANDOM
    25034
Unity+VuforiaがiPhone6+でクラッシュするので、自動でInfo.plistを書き換えるようにしてみたメモ


## はじめに

前回書いた記事「[Unity+VuforiaがiPhone6+でクラッシュする](http://qiita.com/JunSuzukiJapan@github/items/4e230f4a448f2db486f6)」では、手動で対処していたInfo.plistの修正を自動にしてみました。

## コード

自動で書き換えるためには、以下のコードをAssets/Editorフォルダにおいてください。
Info.plistへのパスを決め打ちにしていますので、各自の環境にあわせて適当に書き換えてください。

なお、以下のコードは”エンジニア Blog”さんの「[Unity iOSビルド時にinfo.plistに設定を自動で登録する](http://wonderpla.net/blog/engineer/Unity_iOS_PostProcessBuild/)」という記事のコードに追加・修正する部分のみのせています。最初に該当する記事のコードを参照してください。



```csharp:PlistMod.cs（変更部分のみ）
using UnityEngine;
using UnityEditor;            // 追加
using UnityEditor.Callbacks;  // 追加
using System.IO;
using System.Xml;

public class PlistMod {
	//
	// （省略）
	//


	// 引数を若干変更しています。
	public static void UpdatePlist(string path, string key, string val) {
		//
		// （省略）
		//

		
		// 1. 設定値

		// 以下の６行を修正
		if(!HasKey (dict, key)) {
			AddChildElement (doc, dict, "key", key);
			AddChildElement (doc, dict, "string", val);
		} else {
			UpdateKeyValue (dict, key, "string", val);
		}
		
		//
		// （省略）
		//
	}


	// 関数OnPostprocessBuildを追加。
	// Assets/Editorフォルダに、このスクリプトをいれておくと自動でInfo.plistを書き換える。
	// UIInterfaceOrientationは次の４つの値をとりうる。
	//   UIInterfaceOrientationPortrait
	//   UIInterfaceOrientationPortraitUpsideDown
	//   UIInterfaceOrientationLandscapeLeft
	//   UIInterfaceOrientationLandscapeRight
	[PostProcessBuild]
	public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) {
		// "iOS"のところは、Info.plistがあるフォルダへのパス（Xcodeプロジェクトを保存したパス）を指定する。
		UpdatePlist("iOS", "UIInterfaceOrientation", "UIInterfaceOrientationPortrait");
	}
}
```

## 参考

[Unity iOSビルド時にinfo.plistに設定を自動で登録する](http://wonderpla.net/blog/engineer/Unity_iOS_PostProcessBuild/)
[Unityビルド後に処理を実行させる方法](http://egulog.hatenablog.jp/entry/2013/12/13/031235)
Eclipseのデバッガモードを使ったデバッグをする時に心がけること

（基本の基本）デバッグをしていて、忘れがちなことをメモしておく。


## コンソールを確認する。

値をみたりコードを見ていたりして、ついつい見落としがちになってしまっている・・・。
コンソールに出たエラー文をターミナルでgrepをかけることによって、どのエラーに引っかかっているかを知ることができる。


## 止まっているThreadを一度Suspendする。

処理しているはずなのに動いていないThreadを一度Suspendすれば、どこで停止しているのかを知ることができる。
どのThreadでどの処理をしているのかを知っている必要がある。

---

breakpointをどこに付けるかのコツとか。

## breakpointで頻繁に処理が止まるのがめんどくさい場合

止めたい状況でのユニークな値をif文で囲む。
そのif文の中にbreakpointをかけると楽。
[Swift]起動時、終了時、アクティブになったときなどにメソッドを呼ぶ方法

##NSNotificationCenterを使っていい感じのタイミングでメソッドを呼び出す


```swift:ViewController.swift
override func viewDidLoad() {
        super.viewDidLoad()

        let notificationCenter = NSNotificationCenter.defaultCenter()
        //アプリがアクティブになったとき
        notificationCenter.addObserver(
            self,
            selector: "functionName",
            name:UIApplicationDidBecomeActiveNotification,
            object: nil)

}

func functionName() {
//コードを書く
}

```

上の例はアプリがアクティブになったタイミングで呼ばれる。

notificationCenter.addObserverのnameによってタイミングが変わる。

##使えそうなタイミング

###アプリが終了する直前

```swift
        let notificationCenter = NSNotificationCenter.defaultCenter()
        notificationCenter.addObserver(
            self,
            selector: "functionName:",
            name:UIApplicationWillTerminateNotification,
            object: nil)
```

###アプリがバックグラウンドになるとき

```swift
        let notificationCenter = NSNotificationCenter.defaultCenter()
        notificationCenter.addObserver(
            self,
            selector: "functionName:",
            name:UIApplicationDidEnterBackgroundNotification,
            object: nil)
```
###アプリ起動直後

```swift
        let notificationCenter = NSNotificationCenter.defaultCenter()
        notificationCenter.addObserver(
            self,
            selector: "functionName:",
            name:UIApplicationDidFinishLaunchingNotification,
            object: nil)
```
###デバイスの向きが変わる直前

```swift
        let notificationCenter = NSNotificationCenter.defaultCenter()
        notificationCenter.addObserver(
            self,
            selector: "functionName:",
            name:UIApplicationWillChangeStatusBarOrientationNotification,
            object: nil)
```

 通知の仕組みを使ってメソッドを呼び出している。
いろいろな場面で使えそう。

##好きなタイミングで呼び出す

```swift
  notificationCenter.postNotificationName("name", object: self, 
                                                             userInfo: nil)
```

```swift
        let notificationCenter = NSNotificationCenter.defaultCenter()
        notificationCenter.addObserver(
            self,
            selector: "functionName",
            name:"name",
            object: nil)
```

なんども呼び出されることがあるのでfunctionNameのメソッドが終わったタイミングや画面終了のタイミングで

```swift
   notificationCenter.removeObserver(self)
```

をやって消す。
俺のKPT - チームメンバーのやらされてる感を無くしつつ、無理なく成長したいよね

タイトル長いねｗ

某社某チームでエンジニアのリーダーを1年半ほどしてきた経験から、
KPTをファシリテートする時に意識しているところをまとめてみたよ。

みなさんはどんなKPTをしていますか？　よかったら教えてね。


## 俺のKPTコンセプト
タイトルにも書いたけど、↓です。

**チームメンバーのやらされてる感を無くしつつ、無理なく安定して成長する**



## KPTのポイント
### for Members
- 個人攻撃NG、チームの問題と捉えて前向きに改善する意識を持ちましょう

### for Facilitator ( or Team Leader )
- 全員が意見を出しやすい仕掛けを用意し、意見を出しやすい雰囲気を作ろう
  - KPT,必ず1人1つ以上出してもらう
  - KPTのお題は可能な限り1〜数個に絞ろう
- 全員に当事者意識をもってもらう仕掛けを作ろう(やらされてる感はぶっつぶそう)
  - ファシリテーターやリーダー自身の意見は極力言わない(チームの熟練度による)
  - Problemはメンバー中心に出してもらう
  - ファシリテーターやリーダーは、メンバーが受け入れやすいTryを提案すると◎ 
  - ファシリテーターやリーダーの意見を押し付けはダメ。絶対。


## KPTの流れ
全体で30min - 60minかなー。

```
----
01. ICE break(笑えるネタや、チームに対する気付きを共有できるといい感じ)
02. Keepをみんなで書く(3-5min)
03. Problemをみんなで書く(3-5min)
04. ホワイトボードに貼る
05. (可能なら)Keep/Problemを1つずつ説明 by書いた人
----
06. Keep/Problemのグルーピング(5min)
07. Problemに対するTryをみんなで書き出す(3-5min)
08. ホワイトボードに貼る
09. Tryを1つずつ説明 by書いた人
----
10. チャレンジするTryを決める
　　ex. Tryへ投票する 1人3票もって投票とかね。
   選出されるTryは人数やスプリントの長さで変えてみよう
----
11. 10で選出されたTryはDailyの朝礼などで確認していきましょう。
----
```


## さいごに

**コンセプト:　チームメンバーのやらされてる感を無くしつつ、無理なく安定して成長する**

チームが成長するには、リーダーだけが頑張ってもダメ。メンバーみんなが頑張る必要があると思う。

理由は単純。リーダー1人ががんばるより、みんなで頑張ったほうがたくさん成長できそうだから。


もちろんリーダーがぐいぐい引っ張る時期があってもいいと思います。チームの熟練度が低い時期とかね。僕自身、そうすることもあります。

ずっとリーダーが引っ張る形でもいいけども、どーしても息切れしちゃうんだよね。僕だけでしょうか？

----


少し話がそれました。

ここ数年、

- １. チームメンバーのやらされてる感を無くして
- ２. チームメンバーが自分から成長する雰囲気を作って
- ３. 成長を無理なく安定させる仕掛けを作って
- ４. みんなが楽しく成長できる文化ができればいいよね

なんてことをどうやったら実現できるかを考えています。

そして良いKPTはその入口になると信じてます。
VirtualBoxにOSをインストールする

# はじめに
[Gitサーバーを立てる為の投稿は多数あった](http://qiita.com/tags/gitlab)が、Gitサーバーを立てるサーバーのインストールに関する投稿が無かったので、メモ代わりに記載する

# まとめ
* PCは、64bit OS、8GB以上のメモリを搭載したモノを買う
* Linuxのシステム更新は統一されているので、分かりやすい
    * ShellShock対応モジュールも、Ubuntuではアップデートマネージャーからのシステム更新で完了した
* いろいろ遊ぶ為にも、まずは入れてみる
    * ゲストOSのインストールは、大変簡単
        * ただし、も少し何とかしたい場合は、メモリや仮想ハードディスクのサイズを考えて設定する事
    * そして、いろいろ遊ぶ

# 準備
1. ホストOSとして、64bit OSをPCにインストールする
1. ホストOSのメモリを8GB以上に増設する
1. 以下のファイルをダウンロードする

    | 名前 | 2014/10/06現在の最新バージョン | ダウンロード先 | ファイルサイズ |
    |:-:|:-:|:-:|:-:|
    | Oracle VM VirtualBox | 4.3.16 | [Link](https://www.virtualbox.org/wiki/Downloads) | 61-109MB |
    | Ubuntu Desktop | 14.04(日本語Remix) | [Link](http://www.ubuntulinux.jp/download/ja-remix) | 1.1GB |
    | Ubuntu Desktop | 12.04.02(日本語Remix) | [Link](http://www.ubuntulinux.jp/download/ja-remix) | 800MB |

1. ホストOSにVirtualBoxをインストールする

# 環境
本投稿では、以下の環境を利用する
* PC : [VAIO type F VPCF22AJ](http://www.sony.jp/support/vaio/products/vpc/vpcf22aj.html)
* CPU : Intel Core i5-2410M
* メモリ: 12GB
* OS : Windows 8.1 Pro(Update 1 適用済み)

# 手順
1. VirtualBoxを起動し、[仮想マシン]-[新規]を選択する
1. [仮想マシンの作成]で以下の設定をおこない、[作成]を押す

    | パラメーター | 設定 |
    |:-:|:-:|
    | 名前 | OSの名前を含む名前を設定する(例. Ubuntu 14.04 64bit) |
    | タイプ | Linux |
    | バージョン | Linux (64 bit) |
    | メモリーサイズ | 4096MB |
    | ハードドライブ | 仮想ハードドライブを作成する |

1. [仮想ハードドライブの作成]で以下の設定をおこない、[作成]を押す

    | パラメーター | 設定 |
    |:-:|:-:|
    | ファイルサイズ | 20.00GB |
    | ハードドライブのファイルタイプ | VDI(VirtualBox Disk Image) |
    | 物理ハードドライブにあるストレージ | 可変サイズ |

1. [仮想マシン]-[設定]を選択し、以下の設定をおこない、[OK]を押す

    | タブ | タブ2 | パラメーター | 設定 |
    |:-:|:-:|:-:|:-:|
    | 一般 | 高度 | クリップボードの共有 | 双方向 |
    | 一般 | 高度 | ドラッグ&ドロップ | 双方向 |
    | システム | プロセッサー | CPU | 2 |
    | ディスプレイ | ビデオ | ビデオメモリー | 128 |
    | ネットワーク | アダプター1 | 割り当て | ブリッジアダプター |

1. 作成した仮想マシンを選択し、[起動]を選択する
1. [起動ハードディスクを選択]で、ダウンロードしたISOイメージを選択する。実行時に選択する項目は、以下の通り

    | 画面 | 設定 |
    |:-:|:-:|
    |ようこそ|Ubuntu をインストール|
    |Ubuntu のインストール準備|インストール中にアップデートをダウンロードする : 有効|
    |〃|サードパーティーのソフトウェアをインストールする : 有効|
    |インストールの種類|ディスクを削除して、Ubuntuをインストール|
    |ディスクを削除してUbuntuをインストール|ドライブの選択 : SCSI1|
    |どこに住んでいますか?|Tokyo|
    |キーボードレイアウト|日本語-日本語|

1. デスクトップが表示されたら、再起動する
1. VirtualBoxのメニューから、[デバイス]-[Guest Additions のCDイメージを挿入]を選択する。インストールが完了したら、再起動する
1. ゲストOSが起動したら、画面右上の設定アイコンをクリックし、[アップデートがあります]と表示されていたら、選択し、アップデートをインストールする。または、アップデート マネージャーからアップデートする。
1. 再起動する
1. シャットダウンする
1. スナップショットを作成する。
Vagrant で使う Hyper-V 用の Ubuntu には hv-kvp-daemon-init が必要

Hyper-V 用の Ubuntu の Box を作成したのですが、vagrant up で以下のようなエラーが発生しました。

```
==> default: Starting the machine...
==> default: Waiting for the machine to report its IP address...
    default: Timeout: 120 seconds
Hyper-V failed to determine your machine's IP address within the
configured timeout. Please verify the machine properly booted and
the network works. To do this, open the Hyper-V manager, find your
virtual machine, and connect to it.

The most common cause for this error is that the running virtual
machine doesn't have the latest Hyper-V integration drivers. Please
research for your operating system how to install these in order
for the VM to properly communicate its IP address to Hyper-V.
```

Ubuntu に hv-kvp-daemon-init をインストールして Box を作り直したらエラーが直りました。
本家では 12.04 では必要と言っていますが、14.04 でも必要のようです。

```
$ sudo apt-get update
$ sudo apt-get install hv-kvp-daemon-init
```

あと Box を zip で作ると bsdtar.exe のエラーが発生することがあるので、7-Zip で tar を作った後に tar.gz を作ると上手く行っています。Hyper-V は provider のコンフィギュレーションもいまいちだし、いろんなエラーで嵌るし、もう少し待った方がいいのかな。
ベイズ定理の概要

## 統計学の流派

統計学には主に次のような流派があります。

* F 派 … 統計学の父とも言えるフィッシャー
* NP 派 … 統計的品質管理で知られるネイマンと E. ピアソン
* B 派 … ベイズ統計

[前回](http://qiita.com/ynakayama/items/c56244ce4e16e771759d)の続きで、ベイズ統計について追っていきます。

### フィッシャー - ネイマン - ピアソン理論

理念的には F 派と NP 派は合致するものではありませんが、双方あわせて「正規分布」「検定」「推定」「分散分析」などの理論を構成します。
きちんと数えることのできる客観的なデータ (頻度) があるときに、それに基づく推論が可能となります。工学、医学、経済学など多くの分野で、機械的な厳密主義として応用されます。

### ベイズ統計学

意見や個人の主観、信念など今日のデータは人の世界のものとなっています。たとえばスパムメールの判定などは機械的に厳密に判断するのは難しいです。そのようなとき、データが作られている人の世界にあわせた人の考えるような統計解析が必要であり、それがすなわちベイズ統計学です。これは基本的に確率をもとに理論が展開されます。

## ベイズの定理

標本空間 Ω の任意の可測事象 E に実数 P(E) を対応させる。 P(・) を確率、事象列を E_1 E_2 …とする。いま任意の事象 F が与えられたとき次の定理を導きます。

```math
P(E_i|F) = \frac {P(E_i)・P(F|E_i)} {\sum_{j=1}^{\infty}P(E_j)・P(F|E_j)}
```

### ベイズ定理の説明

以下は教科書などにもよく掲載されている、きわめて一般的な例です。

```
いくつかのツボに赤色と白色の玉がまざって入っている。
このツボのどれかから 1 つの玉を抜き出す。
いま抜き出した玉の色から、どのツボから取り出したかという原因を推定したい。
```

このように、得られた結果からその原因を推定するということは、現実においても解決が必要とされる問題のひとつです。

ここで得られた結果 H_1 H_2 … H_k を原因とします。

```
わたしたちが知りたい確率 → P(H_i|A)
(A がおこったとき原因が H_i である確率)

わたちたちが得られた確率 → P(A|H_i)
(原因 H_i に対する結果の確率 P)
```

これを直接計算するために、ベイズの定理は結果に対する原因の確率 P(H_i|A) を計算する公式を与えます。

```math
P(H_i|A) = \frac {P(H_i)・P(A|H_i)} {{\sum}P(H_j)・P(A|H_j)}
```

このとき
P(H_i) は原因 H_i の **事前確率 (prior probability)**
P(H_i|A) は **事後確率 (posterior probability)**
と呼ばれます。

## ベイズ定理の例

```
2 つのツボがあり
ツボ 1 には赤玉が 1 個と白玉が 2 個
ツボ 1 には赤玉が 2 個と白玉が 1 個
入っている。

いまいずれかのツボから玉を 1 つ取り出したら白玉であった。
```

H_1 をツボ 1 から取り出す事象
H_2 をツボ 2 から取り出す事象
とすると、

いずれのツボを選ぶのも等しい確率なので

事前確率は

```math
P(H_1) = P(H_2) = \frac 1 2
```

事後確率は

```math
P(H_1|A) = \frac {{\frac 1 2} ・ {\frac 2 3}} {{\frac 1 2} ・ {\frac 2 3} + {\frac 1 2} ・ {\frac 1 3}} = \frac 2 3

\\

P(H_2|A) = \frac {{\frac 1 2} ・ {\frac 1 3}} {{\frac 1 2} ・ {\frac 2 3} + {\frac 1 2} ・ {\frac 1 3}} = \frac 1 3
```

となります。

ツボ H_1 H_2 が原因で、白い玉を取り出しということが結果となります。

原因に対する確率が事前と事後で 1/2, 1/2 だったのが 2/3, 1/3 に変化したことになります。

### ベイズ更新

前段階の事後分布が、次のフェーズすなわち現在においては事前分布の役割を果たすことを **ベイズ更新 (Bayesian updating)** と言います。

## まとめ

例では 2 つのツボから玉を 1 回取り出しただけという単純な例でしたが、現実の問題においては複数の原因から結果を取り出すたびにベイズ更新をして、経験を逐次算入するというプロセスを経ることになります。

今回はベイズ定理の概要と基本的な計算を紹介しました。

## 参考

入門ベイズ統計―意思決定の理論と発展
http://www.amazon.co.jp/dp/4489020368
Swift vs. C# : Nested Types


- struct, enum, class がネストできるということ
- C#: enumはネストできないとおもう。stuct, classはネストできる。


# Nested Types in Action

~~~
  1> struct BlackjackCard { 
  2.  
  3.     // nested Suit enumeration 
  4.     enum Suit: Character { 
  5.         case Spades = "♠", Hearts = "♡", Diamonds = "♢", Clubs = "♣" 
  6.     } 
  7.  
  8.     // nested Rank enumeration 
  9.     enum Rank: Int { 
 10.         case Two = 2, Three, Four, Five, Six, Seven, Eight, Nine, Ten 
 11.         case Jack, Queen, King, Ace 
 12.         struct Values { 
 13.             let first: Int, second: Int? 
 14.         } 
 15.         var values: Values { 
 16.             switch self { 
 17.             case .Ace: 
 18.                 return Values(first: 1, second: 11) 
 19.             case .Jack, .Queen, .King: 
 20.                 return Values(first: 10, second: nil) 
 21.             default: 
 22.                 return Values(first: self.toRaw(), second: nil) 
 23.             } 
 24.         } 
 25.     } 
 26.  
 27.     // BlackjackCard properties and methods 
 28.     let rank: Rank, suit: Suit 
 29.     var description: String { 
 30.          
 31.         var output = "suit is \(suit.toRaw())," 
 32.         output += " value is \(rank.values.first)" 
 33.         if let second = rank.values.second { 
 34.             output += " or \(second)" 
 35.         } 
 36.         return output 
 37.     } 
 38. }
~~~



# Referring to Nested Types

- ドットで参照

~~~
 39> var r = BlackjackCard.Rank.Jack 
r: BlackjackCard.Rank = Jack
~~~ 

- C#同じ
Open a directory in iTerm from a context menu

	on run {input, parameters}
		tell application "Finder"
			set dir_path to "\"" & (POSIX path of (input as string)) & "\""
				-- display dialog dir_path
		end tell
		CD_to(dir_path)
	end run

	on CD_to(theDir)
		tell application "iTerm"
			activate
			try
				set t to the last terminal
			on error
				set t to (make new terminal)
			end try
			tell t
				launch session "Default Session"
				tell the last session
					write text "cd " & theDir & ";clear;"
				end tell
			end tell
		end tell
	end CD_to
AndroidのWebViewでnendの広告からうまく遷移できない


意外とnendを使った記事が少なかったので書こうと思います。
多分Titaniumあるあるなのではないでしょうか。

nend(ネンド)は、日本最大級のiPhone・Android対応のスマートフォン向け運用型アドネットワークです

普通ならネイティブで開発するため、
ios,Androidそれぞれの拡張webviewがnendから用意されているため、
起こらない問題かもしれません。

## nend広告をクリックGoogle Play Storeが開かれない問題


AndroidのWebViewでWEBサイトのアプリ広告をクリックするとこうなります。

![Screenshot_2014-10-06-15-52-40.png](https://qiita-image-store.s3.amazonaws.com/0/19316/d3607722-d5c0-4bcc-827a-8a1ed9e32768.png "Screenshot_2014-10-06-15-52-40.png")


![スクリーンショット 2014-10-06 13.43.01.png](https://qiita-image-store.s3.amazonaws.com/0/19316/b27231e5-c621-21bd-6d10-8a517bdb082f.png "スクリーンショット 2014-10-06 13.43.01.png")

結構びっくりします。AndroidのChromeで表示すると普通にGoogle Play Storeが開かれるのにアプリのWebViewだとなぜ。。

## nendの資料を探してみる


nendメディアパートナー向け資料
> http://nend.net/dl/mediapartner/

![kobito.1412570914.316334.png](https://qiita-image-store.s3.amazonaws.com/0/19316/e9641c79-dbb5-d4cd-6fee-469bcd7d17b1.png "kobito.1412570914.316334.png")


一番下にWebView実装ガイドがあります。
そしてAndroid側に以下のような説明があります。

``` 
広告バナータップ時に新規ウィンドウで開くためにWebViewClientのメソッドをOverrideしたインスタンスを指定
注意: 下記は一例です。別途クラスを作成しても構いませんが、必ずリンク先をブラウザで開くための処理を記述してください。
対処しない場合、広告バナーと同じWebView内でリンク先のページが開く場合があります。
```

またエラーの現象を見ていると、
まず広告タグにはplay storeのURLが書いてません。そのため一度nendのサーバと通信してからURLを取得している。
そこが問題なのかな〜と思い。aタグがクリックされた時に、Titnaium側で処理するようにしようかと思いました。

## 対策

####１．WEBViewに表示されているWEBサイトの広告がクリックされる
####２．普通ならnendのJavaScriptライブラリが実行され、新しいWindowが開かれるが、TitaniumのWevViewのbeforeloadイベントで検知できるように画面遷移にする

どうやるかというと、広告のaタグがクリックされた時のイベントを仕込んでおく。
以下はWebサイトのコードです。

```  JavaScript
window.addEventListener('load', function() {
  console.log("pageload");
    var userAgent = window.navigator.userAgent.toLowerCase();
    if(userAgent.indexOf('Mac OS X') == -1){
      $(".nend a").bind("click",function(d){
        location.href = encodeURI(d.currentTarget.href);
        return false;
      });
    }
});
```

####３．Titanium側で広告クリックされ画面遷移が起きたことを検知し、ブラウザ(Chrome)に処理を丸投げする。そして元のWebViewでは画面を戻しておく

以下はTitaniumのコードです。

``` JavaScript 
// WebView内での戻るボタンを有効にします
if(OS_ANDROID){
  $.webview.addEventListener('beforeload',function(e){
     Ti.API.debug("読み込み開始: "+e.url);
     if(e.url.indexOf("market://") != -1){
        $.webview.url = Alloy.Globals.url;
        Ti.Platform.openURL(e.url);
     }
  });
}
```

## 動作
![Screenshot_2014-10-06-15-52-40.png](https://qiita-image-store.s3.amazonaws.com/0/19316/34980b72-311c-7460-b9ef-c5ce42d80c5c.png "Screenshot_2014-10-06-15-52-40.png")
![Screenshot_2014-10-06-15-52-45.png](https://qiita-image-store.s3.amazonaws.com/0/19316/461ee157-9c45-e823-5f60-2835f246140d.png "Screenshot_2014-10-06-15-52-45.png")



## 問題

連続で広告をクリックすると落ちる。。
もう少しやり方を考える必要があると思う。

## まとめ

WebサイトをWebViewでラップして広告を表示するという事はよくあることだと思うので、Titaniumでできないととても困る。
ただTitainumだけだとこれくらいの対応しか思いつかなかったので、ネイティブを触る方法も考えないとなと感じました。

今回のソースはこちらに保存しています。
https://github.com/ganezasan/nend-webview
sqliteで取得した値をListViewに表示する簡単な例

---
###Helper

```MyDbHelper.java
public class MyDbHelper extends SQLiteOpenHelper {

    public MyDbHelper(Context context){
        super(context,"test.db",null,1);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        //create
        sqLiteDatabase.execSQL("create table members(_id integer primary key autoincrement,name text,age integer)");

        //init
        sqLiteDatabase.execSQL("insert into members(name,age) values('hoge',23)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) {

        //delete
        sqLiteDatabase.execSQL("drop table if exist members");

        //create
        onCreate(sqLiteDatabase);

    }
}
```

###Activity

```MyActivity.java
public class MyActivity extends Activity {

    ListView myListView;


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

        //listview
        myListView = (ListView)findViewById(R.id.myListView);

        //db
        MyDbHelper mDbHelper = new MyDbHelper(this);
        SQLiteDatabase db = mDbHelper.getWritableDatabase();

        //select
        Cursor c = db.rawQuery("select * from members",null);

        //adapterの準備
		 //表示するカラム名
        String[] from = {"name","_id"};
		 //バインドするViewリソース
        int[] to = {android.R.id.text1,android.R.id.text2};

		 //adapter生成
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_2,c,from,to,0);

        //bindして表示
        myListView.setAdapter(adapter);
        //クリックしたとき各行のデータ（特に_id）を取得
        myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

                //各要素を取得
                String s1 = ((TextView)view.findViewById(android.R.id.text1)).getText().toString();
                String s2 = ((TextView)view.findViewById(android.R.id.text2)).getText().toString();

                Log.v("tama","position=" + s1);
                Log.v("tama","position=" + s2);
            }
        });

        //loop(いらない）
        while(c.moveToNext()){
            Log.v("tama", c.getString(c.getColumnIndex("name")));
        }
    }
}

```
JRuby環境下でguard-livereloadする方法

[Guard, guard-livereload, rack-livereloadの組み合わせ](http://cu39.hateblo.jp/entry/2013/07/02/183935)は開発においてかなり便利です

しかし、guard-livereloadはem-websocketを使っているため、JRuby(1.7.16)では動きませんでした

guard-livereloadのjruby向け実装として[guard-livereload-jruby](https://github.com/isaiah/guard-livereload-jruby)があったので使い方を紹介します

論よりコード
------------

[Guard, guard-livereload, rack-livereloadの組み合わせ](http://cu39.hateblo.jp/entry/2013/07/02/183935)に加えて、以下を実装します

```diff:Gemfile
diff --git a/Gemfile b/Gemfile
index 52e9a9a..3aa4a95 100644
--- a/Gemfile
+++ b/Gemfile
@@ -20,6 +20,11 @@ group :development do
   gem "guard", "~> 2.0", :require => false
   gem "guard-shotgun"
   gem "rack-livereload"
+  platform :mri do
     gem "guard-livereload", :require => false
   end
+  platform :jruby do
+    gem "guard-livereload-jruby", :require => false, :github => "isaiah/guard-livereload-jruby"
+  end
+end
```

```
$ install -b vendor/bundle/jruby/1.9/bundler/gems/guard-livereload-jruby-02d130f8b33a/vendor/assets/javascripts/livereload.js vendor/bundle/jruby/1.9/gems/rack-livereload-0.3.15/js/
```

解説
----

`livereload.js`は、rack-livereloadのモノと差し替える必要があります。ワイヤープロトコルが合わないためです。パス等は適当に合わせてください


あとがき
--------

rack-livereloadのlivereload.jsに合わせる、もしくはguard-livereload-jrubyにRack
middlewareを入れてlivereload.jsを配信する、等検討しましたが、力及ばず。
iOS8AppExtentionKeyboardで全ての文字を削除する

iOS8から搭載されたAppExtentionでキーボード拡張を開発するときのTIPSです。

キーボードがフォーカスしているテキストビューの文字をすべて削除する場合

```objc
    for (int i=0; i<self.textDocumentProxy.documentContextBeforeInput.length+1; i++) {
        [self.textDocumentProxy deleteBackward];
    }
```

で消すのは間違いです。
何故ならば`deleteBackward`の実行には若干の時間が必要だからです。
例えば１００文字の文字を上記コードで削除したあと、文字をinsertするコードを直後に書くと中途半端に削除された部分にinsertすることになります。
delayを設けても良いですが、self.textDocumentProxyにはhasTextというプロパティがあり、インプットに文字が存在するか確認することが出来ます。

```
    while ([self.textDocumentProxy hasText]) {
        [self.textDocumentProxy deleteBackward];
    }
```

これで全ての文字を削除出来ます。
TitaniumでiPhone 6を判定する

iPhone6, 6plusが出たことでiPhone向けでもViewを切り替えなければならないケースが出てきました。今のところplatformHeightで判断して切り替えるようにしています。

```alloy.js
var platformHeight = Ti.Platform.displayCaps.platformHeight;
Alloy.Globals.isIPhone6Plus = platformHeight === 736;
Alloy.Globals.isIPhone6 = platformHeight === 667;
Alloy.Globals.isIPhone5 = platformHeight <= 568;
```

```app.tss
"Label[if=Alloy.Globals.isIPhone6Plus]": {
    text: "iPhone 6 Plus"
}

"Label[if=Alloy.Globals.isIPhone6]": {
    text: "iPhone 6"
}

"Label[if=Alloy.Globals.isIPhone5]": {
    text: "iPhone 5 or earlier"
}
```

この方法でまずいケースがあれば是非教えてください！
【メモ】文字列結合の結果時間比較

```js
var i, count = 100000;

var foo = [];
console.time("Array Join");
for(i = 0; i < count; ++i){
  foo.push("あいうえお");
}
foo.join('');
console.timeEnd("Array Join");


var bar = "";
console.time("String Concat");
for(i = 0; i < count; ++i){
  bar += "あいうえお";
}
console.timeEnd("String Concat");
```

<table>
<caption>上記コードの実行結果</caption>
<tr>
<th></th>
<th>Google Chrome</th>
<th>Firefox</th>
</tr>
<tr>
<td>Array Join</td>
<td>125.000ms ～ 146.000ms</td>
<td>61.40ms ～ 82.99ms</td>
</tr>
<tr>
<td>String Concat</td>
<td>61.40ms ～ 82.99ms</td>
<td>60.85ms ～ 89.89ms</td>
</tr>
</table>

20回ほど実行してみて、その上下限の値を記載しています。
1年前ぐらいにやってみた時は配列を結合する方が早かった記憶がありますが…。

ともあれ、今は文字列結合が早いみたいですね。
ただ10回とかだと恐らくさほど変わらないと思うので、
普段は個人の好みか、プロジェクトのコーディング規則に従うかでしょうか。
Wheneverを使って簡単にバッチ処理をする。

Wheneverとは、crontab管理ライブラリです！
Wheneverを使用する事で、Railsでの定期的に実行する処理の管理や設定を非常に楽に行うことができました。

まず、gemをインストールします。
```gem 'whenever', :require => false```

次に、`wheneverize.`を実行します。
すると、config以下に`schedule.rb`が作成されます。

`schedule.rb`には、定期的に実行したい処理の設定を書きます。

```ruby:schedule.rb
set :output, 'log/crontab.log'#出力先
set :environment, :production

every :day, :at => '3:00 pm' do　#日時設定
  rake "shuzo:meigen" #rakeタスクを実行
end
```

ここでは、毎日15時に松岡修造の名言が、`log/crontab.log`に出力されるという処理を書きました。

wheneverでは、rakeタスク以外にも、

```
command: bashコマンド実行
runner: Rails内のメソッド実行
script: scriptの実行
```
もスケジューリングできます。
chefからバッチ操作し、Windowsサーバのタイムゾーンを変更する

chefからwindowsのバッチコマンドを実行し、タイムゾーンを変更する方法です。

###前提条件

* windows版chefクライアントが対象マシンにインストール済みであること
* WIndows Server 2012

レシピに下記にように記述します。
タイムゾーン変更とNTP参照先も同時にセットするレシピです。

```bash
service "W32Time" do
    action [ :enable, :start ]
end
 
batch "NTP Setting" do
    code <<-EOH
        tzutil /s "Tokyo Standard Time"
        w32tm /config /update /manualpeerlist:＜NTPサーバ名＞ /syncfromflags:manual
    EOH
end
```

あとはchef-soloなり、knif-solo等で、レシピを実行することで変更されます。
AWSのWindows ServerのタイムゾーンがUTCで起動してくるため、上記レシピで流し混んでJSTに切り替えるようにしました。

Chefって便利ですね！PowerShellやバッチもとっても便利です。
トレンドを無視した簡単SQL記述

---
非同期やらなんやらで日々複雑化するDB操作。最低限の操作をメモ。

###Helper

```helper.java
public class myDbHelper extends SQLiteOpenHelper {

    static final String DB_NAME = "test.db";
    static final int DB_VERSION = 2;

    //sql（staticじゃないとだめ？）
    static final String create_table = "CREATE table members (_id integer primary key autoincrement,name text,age integer)";
    static final String init_table = "insert into members(name,age) values('hoge',22)";
    static final String delete_table = "drop table if exists members";

    public myDbHelper(Context context){
        super(context,DB_NAME,null,DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        //create
        sqLiteDatabase.execSQL("CREATE table members (_id integer primary key autoincrement,name text,age integer)");

        //init
        sqLiteDatabase.execSQL(init_table);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) {

        //drop
        sqLiteDatabase.execSQL(delete_table);

        //create
        onCreate(sqLiteDatabase);

    }
}
```

###Activity

```activity.java
public class MyActivity extends Activity {

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

        //
        myDbHelper mHelper = new myDbHelper(getApplicationContext());
        SQLiteDatabase db = mHelper.getWritableDatabase();

        //insert
        db.execSQL("insert into members(name,age) values('foo',54)");

        //update
        db.execSQL("update members set name='taro' where _id=3");

        //delete
        db.execSQL("delete from members where _id=3");

        //select
        String sql = "select * from members where _id > 10";
        Cursor cursor = db.rawQuery(sql,null);

        //loop
        while (cursor.moveToNext()){

            String id = Integer.toString(cursor.getInt(cursor.getColumnIndex("_id")));
            String name = cursor.getString(cursor.getColumnIndex("name"));

            Log.v("tama",id + " " + name);
        }

        //取得数
        Log.v("tama","count=" + cursor.getCount());
    }
}
```

###sdb shellによる制御

・まず、DBは/data/data/{appl_name}/databases/に存在する。
adb shellで操作するには、下記のような感じで。

```shell.sh
#adb shell
#cd /data/data/{app_anme}/databases
#sqlite3 test.db
>.tables
>.schema mamebers
>select * from members;
>.exit
```
SwiftでAppDelegateを使った画面間のデータ受け渡し

画面間でデータを受け渡す方法はいくつかあると思いますが、一番シンプルな方法はきっとAppDelegateを使う方法なんじゃないかな。

今回は、受け渡したい側のViewControllerをsendViewController、受け取りたい側のViewControllerをrecieveViewControllerとします。

まずは、AppDelegateに受け渡す変数を用意しておく。なんでもいいけど、今回はString型にします。

```lang:AppDelegate
class AppDelegate: UIResponder, UIApplicationDelegate {
    var message:String?
.
.
.
(略)
```

次にsendViewControllerの適当なメソッド内で先ほどの変数に渡したい値を代入する

```lang:sendViewController
    var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate //AppDelegateのインスタンスを取得　
    appDelegate.message = "message" //appDelegateの変数を操作
```


最後にrecieveViewControllerでAppDelegateから変数の値を受け取る

```lang:recieveViewController
   var appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate //AppDelegateのインスタンスを取得　
   var message = appDelegate.message
```

これで、辞書型でもなんでも、データの受け渡しが可能になると思います。
TitaniumでGunosy風UIを実装する

ブログでも書きました。⇢ <a href="http://cheekit.com/2014/08/21/kota-titanium-ui-like-gunosy/">元記事</a>
ソースコード ⇢ <a href="https://github.com/team-cheekit/likeGunosy">team-cheekit/likeGunosy</a>(github)

## 背景
画面を横にスワイプすると、タブも動くUIを作りたかった.

## 実装方法
ここを見た。
<a href="https://developer.appcelerator.com/question/175688/scrollable-tabs--draggable-windows-example-titanium-alloy">Scrollable Tabs + Draggable Windows example (Titanium Alloy)</a>

基本的に上記参考リンク先のコードをコピペでいいですが、注意が１点。
もしNexus5などのdpiの高い端末で使うなら、


```javascript
Alloy.Globals.currentTabWidth = width;  
if (Ti.Android) {  
  switch(Ti.Platform.displayCaps.dpi) {  
    case 120: width /= 0.75;            break;  
    case 160: width =  width;           break;  
    case 240: width /= width * 1.5;     break;  
    case 320: width /= 2;               break;  
    case 480: width /= 3;               break;  // ここ追加！！  
  }  
  child.setWidth(width);  
}  
```
と、case文を追加すること。

最終的にこんなかんじになった。
<img src="http://cheekit.com/images/kota/20140821/likeGunosy.gif" />
msgpack-c(messagepackのc実装)をVSでビルド

# 前提条件
Microsoft Visual Studio 2013 がインストールされている Windows OS 上とする。

# msgpack-c の ダウンロード
* https://github.com/msgpack/msgpack-c の "Download ZIP" のボタンからzipファイルをダウンロード(GITでもよいが今回はこの手法で)
* 適当なフォルダに解凍

# cmake の ダウンロード
* msgpack-c を VS でビルドするには cmake が必要ですので、以下のURLからダウンロード
* http://www.cmake.org/
* 私がダウンロードしたときは3.0.1が最新でした

# ビルド
* cmake-gui.exeを起動し、`Where is the source code:`と`Where to build the binaries:`にmsgpack-cの解凍フォルダを指定
* 下部の`Configure`ボタンを押し、終わったらその横の`Generate`ボタンを押す。
* msgpack-c解凍フォルダにslnファイルが生成されているので起動し、ソリューションのリビルドを実行すれば、ビルドされる。