OmniAICreator/Qiita-1.07M huggingface dataset:
Mac OS Xでオリジナルのキーレイアウト変更にショートカットを割り当てる

# 初めに
**この問題の最善の解決方法が最下部にあります。
備忘録として題意を達成するための経緯を記します**


Mac OS Xでインプットソースとして日本語入力(ja)とオリジナルキーレイアウト(orig)を使っていたんだけれど切り替えがうまく行かなくて困ってた。
この二つのインプットソースと標準のU.S.(us)で三つのインプットソースになっているため、コードのコメント文などでCommand+Spaceで切り替えを行う際に
ja -> orig -> ja -> orig
と調子よく行っているうちはいいんだけれど、Command+Spaceを間違って二回入力しちゃうと
ja -> orig -> ja -> us -> ja -> us -> ja
ってなってオリジナルキーレイアウトに戻らなくなっちゃう問題。

ちなみに「ことえり」だとショートカットがある模様。

# 超カスタマイズツールKarabiner
まずはKarabinerというツールでインプットソースを直接指定できるようにする。
https://pqrs.org/osx/karabiner/index.html.ja
従来はKeyRemap4MacBookっていう名前だったみたい。

こちらから「For Japanese」の
「Change Command_L Key
Command_L x2 to EISUU
Change Command_R Key
Command_L x2 to KANA
としておく。
これで左コマンドキーを二回入力でUSレイアウト、右コマンドキーを二回入力で日本語入力に切り替わる。
ちなみに僕はキーボード自体がUSレイアウトなのでカナキーとかが無い。


# でもこれだと
でもこれだとせっかくつくったオリジナルレイアウトに選択できない。ということで標準のAppleScriptと「FastScript」というソフトで切り替えれるようにする。

# AppleScript
OS標準の「Script Editor」を起動して下記のコードをコピペする。

```applescript
on changeKeyboardLayout(layoutName)
	tell application "System Events" to tell process "SystemUIServer"
		tell (1st menu bar item of menu bar 1 whose description is "text input") to {click, click (menu 1's menu item layoutName)}
	end tell
end changeKeyboardLayout

changeKeyboardLayout("origninal_layout")
```
http://apple.stackexchange.com/questions/61250/bind-each-keyboard-layout-to-keys-combination

最終行の `original_layout` は環境によって適宜変更。

スクリプト自体はCommand+Rで実行できるのでちゃんと動くことを確認しておく。
次に保存してファイルを`/Library/Scripts`移動する。
「Script Editor」での保存、移動がちょっと分かりにくいんだけれど、まずは保存してメニューの「File＞Move To」を選択すると良い。
移動先がroot権限なので一旦デスクトップなどに保存して、ターミナルで移動
すると良い(直接いけるかも？)

```
shell> mv ~/original_layout /Library/Scripts
```

# AppleScriptにショートカットを割り当て
「FastScripts」というソフトでAppleScriptにショートカットを割り当てる。
インストールが終わって起動したら、画面上部のナビゲーションバー？にあるアイコンから「FastScripts＞Preferences」を選択する。
「Script Shotrcuts」から先ほど移動したスクリプトをダブルクリック。
今回は先ほどのKarabinerに割り当てた「左コマンドキー二回」を入力する。
「修飾キーが無いとまずいかもしれないけど大丈夫？」と聞かれるけどそのままOK。

以上

# 切り替えられるようになったけれど…
これで「オリジナルのキーレイアウトをショートカットで選択」ができるようになった！

のだけれど…、遅延があるんですね。
AppleScriptの実行に0.5秒ぐらいの遅延があるため、頻繁に切り替えを行うタイプの自分では入力漏れが頻発…。これじゃぁ使い物にならない。残念。


# USレイアウトの削除
後になって調べるとどうやらU.S.レイアウトは消せる模様で、そもそもこれをすれば解決という事に…。
~~いままで何をしてたのか…~~やったね！

Macで入力ソースにいつの間にかU.S.が入ってきて消せない時の対処法
http://rcmdnk.github.io/blog/2014/05/23/computer-mac/

上記サイトの通り、ことえりの日本語をオンにするとUSレイアウトが削除できる。
よって

# ことえり日本語をオン
# USを削除
# Karabinerで英数とカナを割り振る

英数キーが自分のレイアウトに対応するか心配だったけどうまく変更できました。
これで英数とカナをすぐに切り替えられるようになりました。
고요でwabisabiのあるvimを演出する

![スクリーンショット 2015-11-16 0.35.24.png](https://qiita-image-store.s3.amazonaws.com/0/92474/1aa4d93b-a6db-84dd-20ac-9c1cb26c87f2.png)

# Demo

https://www.youtube.com/watch?v=zxDnFJiN7Z8

# 紹介するplugin

[Goyo](https://github.com/junegunn/goyo.vim)

[LimeLight](https://github.com/junegunn/limelight.vim)

[Seoul256](https://github.com/junegunn/seoul256.vim)

# これなに

## Goyo

"Distraction-free writing in Vim" だそうです.
window に余白ができます.

新しく Tab を開いて, window で余白を作っているみたい.
なので, Tab や window を使った作業とは相性が悪いです.

### Install

```.vimrc/conf.d/plugged/goyo.vim
" Plugin or NeoBundle or Plug
NeoBundle 'junegunn/goyo.vim'
```

### 使い方

Goyo を起動.

```
:Goyo
```

サイズを指定して, Goyo を起動.

```
:Goyo 40      # 高さのみ指定
:Goyo x40     # 幅のみ指定
:Goyo 40x40   # 両方指定
:Goyo 80%x80% # % で指定もできる
```

Goyo を終了.

```
:Goyo!
:Goyo  # 起動中の場合, 閉じてくれる
```

## LimeLight

"Hyperfocus-writing in Vim." だそうです.
カーソル付近のみハイライトしてくれます.

### Install

```.vimrc/conf.d/plugged/limelight.vim
" Plugin or NeoBundle or Plug
NeoBundle 'junegunn/limelight.vim'

" Require: LimeLight で暗い場所の文字色を指定
let g:limelight_conceal_ctermfg = 'DarkGray'
let g:limelight_conceal_guifg   = 'DarkGray' "gvim

" LimeLight の機能をフルで使うならこのカラースキーマが必要
NeoBundle 'junegunn/seoul256.vim'
...
colo seoul256 "Bundlerをendした後にね!
```

### 使い方


Limelight を起動.

```
:LimeLight
```

Limelight を明度を指定して起動, 変更.
colorsheme seoul256 のみ対応.
0.0 ほど暗く（周りの文字が明るい), 1.0 ほど明るい（周りの文字が暗い)

```
:LimeLight 0.9
```

Limelight を終了.

```
:Limelight!
```

# もっと雰囲気を盛り上げたいときは

[jazz を聞きます](https://github.com/supermomonga/jazzradio.vim)
c++ builder XE4, 10.2 Tokyo > debug > 時刻表示 > OutputDebugStringW(DateTimeToStr(Now()).c_str());

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

デバッグ時にメッセージにて処理の時刻を表示したい時。

```
OutputDebugStringW(Now().FormatString(L"hh:nn:ss").c_str());
```

もっと短い書き方はないのだろうか。

以下の書き方もあるようだ。年月日も入る。

```
OutputDebugStringW(DateTimeToStr (Now()).c_str());
```
rvmからrbenvへの切り替えでつまづいた話

# 伝えたいこと
gem environment での状況確認は大事

# rvm -> rbenv の切り替え作業として行ったこと
* portでrvmをuninstall
* ~/.rvm を削除
* ~/.bash_profile のrvm関連の記述を削除

# 抜けていたこと
* ターミナルの開き直し

# 何が起こったか？
gemで新しいライブラリをインストールしようとするとcommon.rbでsegmentation faultが起きた．

```
common.rb:67: [BUG] Segmentation fault
```
~env系はたまに環境に合わないバイナリをロードしてSegmentation faultに陥ることがあるので幾つかのバージョンを試してみるも改善せず．

# 原因
ターミナルがロードして環境変数にrvmでインストールしたgemへのパスが残っていたため，

```
gem environment
```
で出力された情報には.rvm以下の情報がパスとして残ってしまっていて，これが原因でrubyがコンフリクトした模様．
一旦ターミナルを開き直して再度environmentを出力すると，今度はrbenvへのパスのみになっていた．
この状態でエラーが発生したgemをインストールしようとすると，問題なくインストールできた．

# 参考資料
https://github.com/y-ken/fluent-plugin-geoip/issues/4
helm-migemoのインストールなしにmigemo検索を可能にする新機能helm-migemo-modeについて

最近helmの更新で，公式にmigemo検索が導入されたようだ。
https://github.com/emacs-helm/helm/wiki#use-migemo-in-helm
`M-x helm-migemo-mode`，もしくは設定ファイルに`(helm-migemo-mode 1)`を追記することで以下がmigemo検索の対象となる。

+ kill ring
+ occur, moccur
+ buffers
+ helm-find-files (One space after a current path is needed to get candidates via migemo.)
+ Files in current directory
+ file name history (C-c h in helm-find-files)
+ recentf
+ minibuffer history
+ bookmarks
+ filtered bookmarks

**helm-migemoをインストールせずともmigemo検索が使える**，この事実が重要である。
例えばhelm-occurの情報源（source）が定義されているhelm-regexp.elを見れば分かるとおり、情報源はある一定のフォーマットで記述する必要があるらしい。
syohex氏の以下のブログ記事は参考になるだろう：

+ [migemo対応の helm sourceを書く(helm-migemo不要)](http://syohex.hatenablog.com/entry/2015/10/10/171926)

##追記
現在helm-migemoの本体はemacs-jpに移されたようである。
https://github.com/emacs-jp/helm-migemo

##追記２
helm-swoopについても`helm-migemo-mode`への対応がなされたようである。
https://github.com/ShingoFukuyama/helm-swoop/commit/0ef60eba8304c98d787aa823e9303da31dd52f15
Ubuntu14.10にPostgreSQLをインストールする

# したいこと
Ubuntu14.10にPostgreSQLをインストールしデータベースを構築する

# 手順

### インストール

```
$ sudo apt-get install -y postgresql-9.4
```

### 起動

```
$ sudo /etc/init.d/postgresql start
 * Starting PostgreSQL 9.4 database server              [ OK ]
```

### 接続
データベースにUnixログインユーザ USER がロールとして存在しないので接続できない

```
$ psql
psql: FATAL:  role "USER" does not exist
```

### ロール作成
ユーザ postgres として接続

```
$ su - postgres
$ psql
psql (9.4.4)
Type "help" for help.

postgres=#
```

ロール確認

```
postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication | {}
```

ロール sample_role 作成

```
postgres=# CREATE ROLE sample_role WITH LOGIN CREATEDB PASSWORD 'sample_role';
```

ロール sample_role が作成されたのを確認

```
postgres=# \du
                              List of roles
  Role name  |                   Attributes                   | Member of 
-------------+------------------------------------------------+-----------
 postgres    | Superuser, Create role, Create DB, Replication | {}
 sample_role | Create DB                                      | {}
```

データベース sample 作成

```
postgres=# CREATE DATABASE sample OWNER sample_role;
CREATE DATABASE
```

データベース sample が作成されたのを確認

```
postgres=# \l
                                   List of databases
   Name    |    Owner    | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+-------------+----------+-------------+-------------+-----------------------
 postgres  | postgres    | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 sample    | sample_role | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 template0 | postgres    | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |             |          |             |             | postgres=CTc/postgres
 template1 | postgres    | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |             |          |             |             | postgres=CTc/postgres
(4 rows)
```

### クライアント認証の設定
現状ではpeer認証となっていて、ロールとUnixユーザ名が一致していないとログインできない状態となっているので[^1]

```
$ psql -U sample_role sample
psql: FATAL:  Peer authentication failed for user "sample_role"
```

```/etc/postgresql/9.4/main/pg_hba.conf
# "local" is for Unix domain socket connections only
local   all             all                                     peer
```

peer認証をmd5認証に変更し、

```/etc/postgresql/9.4/main/pg_hba.conf
# "local" is for Unix domain socket connections only
local   all             all                                     md5
```

再起動

```
$ sudo /etc/init.d/postgresql restart
 * Restarting PostgreSQL 9.4 database server              [ OK ]
```

sample_role でログインできることを確認

```
$ psql -U sample_role sample
Password for user sample_role: 
psql (9.4.4)
Type "help" for help.

sample=> 
```

[^1]: https://www.postgresql.jp/document/9.4/html/auth-pg-hba-conf.html
WebAPI からのバイナリーデータをローカルに保存して利用する（AITalk WebAPI 編）


Pepper から WebAPI にアクセス、バイナリーデータを受け取り、その結果を利用したいことありますよね。一つ試してみました。　AITalk WebAPI(http://www.ai-j.jp/webapi) がクラウドで合成した音声ファイルをローカルに保存、再生します。

Python ボックスを新規に作り、onStart 入力にこんな感じのコードを入れました。

```py

    def onInput_onStart(self, p):
        import requests

        url = self.getParameter("WebAPI URL")
        data = {
            'username':self.getParameter("username"),
            'password':self.getParameter("password"),
            'text':str(p),
            'speaker_id':'','speaker_name':'','volume':'1.0','speed':'1.0','pitch':'1.0','range':'1.0','ext':'ogg'}

        req = requests.post(url, params = data)

        appId = self.packageUid()
        dataPath = qi.path.userWritableDataPath(appId, "aitalk.ogg")
        f = open(dataPath, 'w')
        f.write(req.content)
        f.close()

        self.onStopped(dataPath)

```

Python ボックスは、入力と出力をそれぞれ文字列型に変更しています。入力には喋らせるテキストを与えます。出力には保存されたファイルのパスが出力されます。
AITalk WebAPI を利用するためには専用の URL、ユーザー IDとパスワードが必要です。これらは Python ボックスのパラメータで与えるようにしています。

ID、パスワードならびに URL については AITalk より入手します。
http://www.ai-j.jp/webapi

サンプルを次に展開しました。
https://github.com/tkawata1025/pepper_aitalk_cloud

サンプルは、わたし個人が試したテストコードとご理解ください。あらゆる環境の動作保障をしているわけではありません、、

AITalk に限らず Web API から返されるバイナリーデータの利用方法の一例として活用いただければ幸いです。
Mac > タイマー > sleep 60 && say hello > 1分後にhelloと言わせる

Mac OS X には sayというコマンドがある。

sayを使った1分後に「hello」としゃべらせるスクリプト。

```
$sleep 60 && say hello
```

音楽聞きながら作業している時、「*分後までxxxする」というような時に使えるかも。

15分後という場合は`$((計算式))`を使って

```
$ sleep $((15*60)) && say hello
```
Debian8 CUI で起動したい。

Linux専用ノートPCを購入しました。
オークションで!！
ただ、処理が少し遅いので、必要な時以外はGUIで起動はしないようにしようかと。。

# 環境
 IBM x40
 Debian8(32bit)
 メモリ 512MB

# 現在の設定を確認
 # systemctl get-default
 graphical.target

# CUIへ変更
 # systemctl set-default multi-user.target
 Created symlink from /etc/systemd/system/default.target to /lib/systemd/system/multi-user.target.

# 変更後の確認
 # systemctl get-default
 multi-user.target

# やっぱりGUIに戻す場合
 # systemctl set-default graphical.target
 Removed symlink /etc/systemd/system/default.target.
 Created symlink from /etc/systemd/system/default.target to /lib/systemd/system/graphical.target.
技術英語 > There is a little truth in what she says. / A lie is a lie is a lie.

引用: 冠詞マスター教本 by 石井隆之さん

a little関連

> (b) There is a little wine left in the bottle. 
(ボトルの中には少しワインが残っている)
(c) There is a little truth in what she says.
(彼女の言うことについてはわずかではあるが本当のところがある)

<hr>
a littleから何故か思い出したのは a lie 関連のちょっと変わったフレーズで、Steinbeck だったかの小説(怒りの葡萄?)の言葉だったと思う。

> A lie is a lie is a lie, no matter how white, how small, 
how incorporating of a smidgeon of truth there be in it.

上記の意訳としては、「どんな嘘でも嘘は嘘なんだ。それが、どんなに潔癖で、どんなにわずかなものでも、真実を含むとしても」。

A lie is a lie is a lie.はisが２つあるため、文法的にはおかしいらしい。

検索したら以下のページを見つけた。
http://oshiete.goo.ne.jp/qa/1609163.html

> The boy that that that that that is my brother.

まあ普通の場面ではこういうのはでてこそうにないので、頑張って覚えることでもないが、面白かったので、今でも覚えている。
IOS9,IOS10,IOS11 からは、 Lag(コマ飛び現象)発生　犯人はAVAudioPlayerでした。（in SpriteKit）

#現象
ios8.3 SpriteKitで、音を再生すると、画像のコマ飛びが発生する場合があって、怪しいなと思いつつ放っておいたのですが、IOS9で、画像のコマ飛びがビシッと安定して発生するので、深追いする事にしました。


発生条件
>1.音源の再生は、AVAudioPlayerです。
2.update()内で音源の再生する。
3.音源の再生が終了後に数秒待ってから音を再生する。


#確認プログラム
iOS Apprication>Game　
Game Technology:SpriteKit

update()内で周期的に音源を再生することで周期に対するplay処理時間計測

・INTERVAL(周期) を変更しTESTする
・sound.aiff：0.00325sの音源を使用

```
#import <AVFoundation/AVFoundation.h>
#import "GameScene.h"
#define INTERVAL 4
@implementation GameScene
AVAudioPlayer *audio;
-(void)didMoveToView:(SKView *)view {
    
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"sound" ofType:@"aiff"] ];
    audio      =[[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    
    audio.numberOfLoops  = 0;
    [audio  prepareToPlay];
    // 最初の音
    [audio play];
    sndTime=[NSDate date];
}
NSDate *sndTime;
-(void)update:(CFTimeInterval)currentTime
{
    if( (-[sndTime timeIntervalSinceNow])>INTERVAL)
    {
        NSDate *measure=[NSDate date];
        [audio play];
        sndTime=[NSDate date];
        NSLog(@"Measure=%f",-[measure timeIntervalSinceNow]);
    }
}
@end
```
#テストターゲット
>同じ機種でIOSが異なる物件がなくてこうなりました。
iPod touch 6th( A8 ios9.1 ): 注)Xcode7
iphone 5s( A7 ios8.3 )     : 注)Xcode7
ipad mini2( A7 ios7.1 )    : 注)Xcode7
iPod touch 6th(A8 ios10.0) : 注)Xcode8
iPod touch 6th(A8 ios11.0) : 注)Xcode9

#結果( LoggingのMeasure結果を10回平均した )

![a.png](https://qiita-image-store.s3.amazonaws.com/0/75082/7458c655-1d14-5990-98ee-9c49188a031d.png)


横軸(インターバル秒）　縦軸Play時間(s)


~~テストターゲットが異なるからこの結果がiosに依存していると断言はできませんが
このような現象が発生する可能性が高いと考えます。~~
ios10,ios11でも同じ結果が観測されました。io9以降で明らかに遅くなっていると推定します。


1. playが３〜４msで遅い事( playしなければMeasureが余裕で0.0001s以下だった)
2. ios9.1/ios10.0では、再生周期が２秒以上で 100ms Overになる事（びっくりした) 
3. ~~ios7基準ではios9は遅い事(多分ios8も遅いと思います）~~
4. ~~ios7/ios8の場合間隔(INTERVAL)が広くなると時間がかかるように感じる。~~

#結論
1.ios8.3でコマ飛びが発生するのは、そもそも　playの負荷で発生していた。
2.ios9.1/ios10.0でコマ飛びが発生するのは、結果1.に加え結果2.の影響で発生していた。

#対策

結論2. 対策
update()内に　[audio  prepareToPlay];　を追加しても改善効果がありませんでした。
容赦ないです。現状、２秒以内になにかをplayすれば、効果があるようです。
~~無音を再生して対応することにしました。(気に入らないですが・・・・)~~
最終的には、バックグラウンド再生することになりました。


結論1.対策
~~根本的な対策（マルチスレッド/CoreAudio等)が必要に思えます(対策が簡単でないし、内容が重すぎる・・・・無理・・・・・(^^; ）
しかし、無音再生して対応したら、明らかに改善した。~~
~~＝＞不思議だぁ　まだ、知らないなにかがいそうです。~~


考察
ios9以降　消費電力関連でどうも一定時の間に音源再生されなければ停止処理が実行されているように思えます。

ios11  　グラフではわからないのですが、ios10にくらべて一回一回のばらつきが大きくなっている。(100ms遅い場合もある。）
　　　　　まだ、たまに一瞬カクカク動作があるので調べる必要がありそうです。
3D Touch雑メモ

英語読めないけど何となく眺めると
[3D Touch APIs](https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/Adopting3DTouchOniPhone/3DTouchAPIs.html#//apple_ref/doc/uid/TP40016543-CH4-SW1)
大きく４つで
①Home Screen Quick Actions
![IMG_0196.png](https://qiita-image-store.s3.amazonaws.com/0/9256/ad094ba1-2614-899c-3c9f-e85a8b518505.png)
これ！
アイコンの長押しで出てくるやつ。
　これはアリだと思う！


②UIKit Peek and Pop
![IMG_0208.png](https://qiita-image-store.s3.amazonaws.com/0/9256/8f76a8f7-4c45-ef8f-d305-8ba1cb7f9e31.png)
たぶんこれだよね？長押しでポップアップ、ついでに上フリックで操作もできるよ（写真アプリ

③Web View Peek and Pop
![IMG_0200.png](https://qiita-image-store.s3.amazonaws.com/0/9256/f1f21586-dac6-e1ad-07b0-501885ee1690.png)
これ！　リンク長押しでポップアップとかCMしてるやつ

④Force Properties in UITouch Objects
UTTouchで圧力とれるよー？

で合ってるのかな？
とりあえず③は検証するもんでもないし、
①はどっかで見た、利便性上げるって意味だと確実に①がいい気がするけど、
②、③のサンプル気力湧いたら作ります。
PRML 第2章 確率分布 ノンパラメトリック手法

パターン認識と機械学習、第2章からは「2.5.2 ノンパラメトリック手法」を実装します。

取り出してきたデータの数を数え上げて、確率分布を把握する手法が紹介されてます。
この章はあんまり時間かけてもしょうが無いなと感じたので、さくっと実装。
カーネル密度法もスクラッチせず、scipyのパッケージ使ってズルしました。


##ヒストグラム・コード
```python
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
from scipy import stats
from scipy.stats.kde import gaussian_kde
import random

def mix_G(x):
    return (0.4 * G1 + 0.6 * G2)

def mix_G_distribution(n):
  ratio = 0.3
  if random.random() <ratio:
    return random.gauss(M1, S1)
  else:
    return random.gauss(M2, S2)

if __name__ == "__main__":
    x = np.linspace(0, 1, 100)

    # Set normal distribution1 
    M1 = 0.3
    S1 = 0.15
    G1 = stats.norm.pdf(x, M1, S1)

    # Set normal distribution1 
    M2 = 0.75
    S2 = 0.1
    G2 = stats.norm.pdf(x, M2, S2)

    N = 50
    Data = [mix_G_distribution(n) for n in range(N)]


    plt.subplot(3, 1, 1)
    plt.hist(Data, bins=1/0.04, normed=True)
    plt.plot(x, mix_G(x), "g-")
    plt.xlim(0, 1)
    plt.ylim(0, 3)
    title("Figure 2.24")

    plt.subplot(3, 1, 2)
    plt.hist(Data, bins=1/0.08, normed=True)
    plt.plot(x, mix_G(x), "g-")
    plt.xlim(0, 1)
    plt.ylim(0, 3)

    plt.subplot(3, 1, 3)
    plt.hist(Data, bins=1/0.25, normed=True)
    plt.plot(x, mix_G(x), "g-")
    plt.xlim(0, 1)
    plt.ylim(0, 3)
```
##結果
![Screen Shot 2015-09-18 at 10.17.14.png](https://qiita-image-store.s3.amazonaws.com/0/62779/ae6a93b2-b0fc-af5a-7a58-60917096a04d.png)




##カーネル密度法・コード
```python
if __name__ == "__main__":
    #Karnel density estimation
    from scipy.stats.kde import gaussian_kde

    plt.subplot(3, 1, 1)
    plt.plot(x, gaussian_kde(Data, 0.005)(x))
    plt.plot(x, mix_G(x), "g-")
    plt.xlim(0, 1)
    plt.ylim(0, 3)
    title("Figure 2.25")

    plt.subplot(3, 1, 2)
    plt.plot(x, gaussian_kde(Data, 0.07)(x))
    plt.plot(x, mix_G(x), "g-")
    plt.xlim(0, 1)
    plt.ylim(0, 3)

    plt.subplot(3, 1, 3)
    plt.plot(x, gaussian_kde(Data, 0.2)(x))
    plt.plot(x, mix_G(x), "g-")
    plt.xlim(0, 1)
    plt.ylim(0, 3)
```

##結果
![Screen Shot 2015-09-18 at 10.19.07.png](https://qiita-image-store.s3.amazonaws.com/0/62779/40355be2-fdb0-765c-367f-72761cf30b34.png)


##K近傍法・コード
```python
#k_Neighbourhood
def k_NN(test, train, k):
    train = np.array(train)
    train.sort()
    r = []
    for i in test:
        distance = abs(train - i)
        distance.sort()
        r.append(distance[(k-1)])
    r = np.array(r)
    return k / (2* r * N)



if __name__ == "__main__":
    title("Figure 2.26")
    plt.subplot(3, 1, 1)
    plt.plot(x, k_NN(x, Data, 1))
    plt.plot(x, mix_G(x), "g-")
    plt.xlim(0, 1)
    plt.ylim(0, 3)

    plt.subplot(3, 1, 2)
    plt.plot(x, k_NN(x, Data, 10))
    plt.plot(x, mix_G(x), "g-")
    plt.xlim(0, 1)
    plt.ylim(0, 3)

    plt.subplot(3, 1, 3)
    plt.plot(x, k_NN(x, Data, 30))
    plt.plot(x, mix_G(x), "g-")
    plt.xlim(0, 1)
    plt.ylim(0, 3)
```
##結果
![Screen Shot 2015-09-18 at 10.21.29.png](https://qiita-image-store.s3.amazonaws.com/0/62779/c30e45af-2c3c-ff40-a50e-ffc905d6d0c1.png)
supervisor管理下のデーモンに対して任意のシグナルを送信したい

タイトルまま。  
nginxなどもsupervisorで起動しているが、
ログローテーションするときにUSR1シグナル送りたい。
そんな時は以下のようなワンライナーでPIDを取得し、直接送信すれば良い。

```
sudo supervisorctl pid nginx | xargs sudo kill -USR1
```
意外と簡単なワイルドカード(?と*)でのマッチング

文字列の完全一致を見るのは簡単だけど、ワイルドカードも考えるとなると、一気に難しくなる……ような気がしていました。けれど、再帰を使ってみると、意外と簡単に実装できたので、嬉しくなって記事にしちゃいました。

アルゴリズム自体はシンプルだったので、今でも実用されている手続き型言語の中で最も文字列の扱いが面倒そうなCで書いてみましたが、1文字ずつ文字を見ていくなら、案外、Cで書いた方が下手に別の言語で書くよりシンプルかもしれないです。
また、再帰を使うのでせっかくだからSchemeでも書いてみました。

ここでいう、ワイルドカードでのマッチングは、以下の仕様とします。

* `wildcard_matching(wildcard, target)` において、wildcardとtargetの文字列がマッチしていれば1を、していなければ0を返す。
* wildcardとtargetが同じ文字列であれば、それらはマッチしている。その際、wildcard中の`?`は任意の1文字として扱われる。`*`は任意の0文字以上として扱われる。`?`や`*`にはエスケープシーケンスはない。
* wildcardがtargetの一部のみとマッチしている場合は、マッチしているとは扱わない。すなわち、`xxx`は`axxxa`とマッチしていない。`*xxx*`と`axxxa`はマッチしている。
* 空文字列`""`と空文字列`""`はマッチしている。
* マルチバイト文字は考慮していない。

実装はこちら。

**追記: 間違ってるんちゃうかとコメント欄で指摘いただいたのでC, Schemeとも修正**

```C:wildcard.c
int wildcard_match(const char *wildcard, const char *target)
{
	const char *pw = wildcard, *pt = target;

	while(1){
		if(*pt == 0){
			while(*pw == '*') pw++;
			return *pw == 0;
		}
		else if(*pw == 0) return 0;
		else if(*pw == '*'){
			return *(pw+1) == 0 || wildcard_match(pw, pt + 1)
			                    || wildcard_match(pw + 1, pt);
		}
		else if(*pw == '?' || (*pw == *pt)){
			pw++;
			pt++;
			continue;
		}
		else return 0;
	}
}
```

1文字ずつ見ているんですが、`*`が出ると、再帰で、wildcardのポインタを1文字進めたものとのマッチングと、targetのポインタを1文字進めたものとのマッチングを見ています。
また、wildcardの末尾に`*`が出た場合は、これ以降はすべてマッチしています。

Schemeではこんな感じ。

```scm:wildcard.scm
(define (wildcard_match wildcard target)
  (define (match wildcard target)
    (cond
      ((null? target) (or (null? wildcard) (and (char=? (car wildcard) #\*) (match (cdr wildcard) target))))
      ((null? wildcard) #f)
      ((or (char=? (car wildcard) #\?) (char=? (car wildcard) (car target)))
        (match (cdr wildcard) (cdr target)))
      ((char=? (car wildcard) #\*)
        (or (null? (cdr wildcard))
        (match wildcard (cdr target))
        (match (cdr wildcard) target)))
      (else #f)))
  (match (string->list wildcard) (string->list target)))
```
Git でブランチを切り替えると、それに応じてファイルが変更されます

常日頃Gitを使っている人には当たり前のことなのだろうけど・・・。
ブランチを切り替えると、それに応じてファイルが変更される仕組みになっているんです！

#実験

適当なディレクトリで、Gitを初期化します。

```bash
git init
```

適当なテキストファイルを作成します。ここでは端末からコマンドによりファイルの編集をしていますが、エディタを使っても同じことができます。

```bash
echo テストファイルです > test.txt
cat test.txt
#テストファイルです
```

この状態で一度コミットします。

```bash
git add .
git commit -m 'initial commit'
```

新しいブランチへ切り替えて、先のファイルを編集してコミットします。


```bash
git checkout -b newbr
echo 別のブランチで編集しています >> test.txt
cat test.txt
#テストファイルです
#別のブランチで編集しています
git add .
git commit -m 'edited on new branch'
```

次のようにすると、ブランチを切り替えると同時にそれぞれにおける最新状態に変更されていることが確認できます。

```bash
git checkout master
cat test.txt
#テストファイルです

git checkout newbr
cat test.txt
#テストファイルです
#別のブランチで編集しています
```
heroku上のPostogreをdumpしてローカルにrestoreするワンライナー

heroku上のpostgreをlocalのpostgreにrestoreするためのワンライナー
動作確認を行ったのはOSX上のpostgres (PostgreSQL) 9.4.1です

```
% curl `heroku pg:backups public-url --app <heroku app name>|cat` | pg_restore --verbose --clean --no-acl --no-owner -d <local pg db name> -U <local pg user name>
```
ansibleで踏み台を突破する



```
# 踏み台
Host step
  HostName xxx.xxx.xxx.xxx
  User xyz
  IdentityFile ~/.ssh/id_rsa
# 踏み台経由でslogin(ssh)するホスト
Host ip-10-0-0-100
  HostName 10.0.0.100
  ProxyCommand ssh -W %h:%p step
  User ubuntu
  IdentityFile ~/.ssh/aws.pem
```
~/.ssh/configで書くと上記の様な場合、ansibleを`ip-10-0-0-100`で実行するにはどうするか？

ansibleのinventoryを`hosts`と言う名前で用意しておいて

```bash
cat hosts
...
[host]
10.0.0.100
10.0.0.101
...
```

`ansible-playbook`を実行する例

```bash
export ANSIBLE_SSH_ARGS="-o ProxyCommand=\"ssh -W %h:%p step\" -o User=ubuntu -o StrictHostKeyChecking=no"
ansible-playbook -i hosts example.yml -l 10.0.0.100 --private-key=~/.ssh/aws.pem
```
XcodeでLuaのシンタックスハイライト

なんだかんだで未だに東京に滞在中なのだけれど、仕事先で使ってる Xcode のバージョンが便利だし自分の Mac に入ってる Xcode 3.2.6 もそろそろアップデートしたいと思い立ったので OS も Yosemite にアップデートして Xcode 7.0 に一週間近くかけてやっとアップデートが終わり、ふと気づくと Lua のシンタックスハイライトが無くなってる事に気がついた。。

このままじゃ超困るしっ！てわけで、改めてシンタックスハイライトをインストールしてみたのでそのメモ。

アップデート前は [breinhart/Lua-In-Xcode](https://github.com/breinhart/Lua-In-Xcode) をそのまま利用していたのだけれど、そのままインストールするとファイルを開いた後に `Editor -> Syntax Coloring -> Lua` とメニューから選択しないとカラーリングされなかったので、その点もどうにか出来ないかなとちょっとググってみた。

それっぽい stackoverflow のページ http://stackoverflow.com/questions/9050035/how-to-make-xcode-recognize-a-custom-file-extension-as-objective-c-for-syntax-hi が見つかったので読んでみると `UTI` で判断してるから、自分でアプリケーション書いてゴニョゴニョしなよなんて事が書いてあったけど、なんだか面倒だし、`UTI` に直接登録出来ないものかなと思って調べつつ、そもそも現状どんな情報が保存されているんだろって事でダンプしてみると、なんか、、既に登録されてるし。。`CotEditor` に入れた時に追加されたっぽいけど、記憶にない。。

```
$ /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Support/lsregister -dump

---snip---
	--------------------------------------------------------
	type	id:            49000
			uti:           org.lua.lua-source
			description:   Lua script
			flags:         imported  active  trusted  
			icon:          Contents/Resources/LuaIcon.icns
			conforms to:   public.source-code
			tags:          .lua
	--------------------------------------------------------
---snip---
```

ま、いいやって事で、元のソースがメンテされてなかったのでフォークして [mah0x211/Lua-In-Xcode](https://github.com/mah0x211/Lua-In-Xcode)、`do-end` ブロックルールを追加したり、plist のフィールドを修正してインストールしてみるとファイルを開いただけでシンタックスハイライトされるようになって一安心。

て、これだと根本的な解決ではないので `CotEditor` なんて入れるのめんどいよって人は元のリポジトリにプルリクが上がってるからそれを使うと解決すると思われます←やり終えた後に気づいたので試してはいないです。
Hugoのshortcodesでnicovideoの埋め込みを簡単にする

# はじめに

[ブログ](http://kounoike.github.io/posts/2015-09-26-hugo-shortcodes-nicovideo/)にも書いた記事の転載です。

Hugoには[shortcodes](https://gohugo.io/extras/shortcodes/)という仕組みで、カスタムタグみたいなことを実現できるみたいです。
そこで、ニコニコ動画の動画サムネイルやプレイヤーの埋め込みを行うshortcodesを書いてみました。

# 動画サムネイル

layouts/shortcodes/nicovideo.htmlとして、以下をおきます。

```html
<iframe width="312" height="200" src="http://ext.nicovideo.jp/thumb/{{ .Get 0 }}" scrolling="no" style="border:solid 1px #CCC;" frameborder="0">
</iframe>
```

記事のMarkdownでは以下のように書きます。

```markdown
{{<nicovideo sm9 >}}
```

# 動画プレイヤー

同じnicovideoにして、ifで分岐させようと思ったのですが、色々やってもうまくいかなかったので別の名前のshortcodesにしちゃいました。

```html
{{ $sm := .Get 0 }}
{{ $url := printf "http://api.ce.nicovideo.jp/nicoapi/v1/video.info?v=%s&__format=json" $sm }}
{{ $dataJ := getJSON $url }}
{{ $title := $dataJ.nicovideo_video_response.video.title }}
<script type="text/javascript" src="http://ext.nicovideo.jp/thumb_watch/{{ $sm }}?w=490&amp;h=307"></script>
<noscript><a href="http://www.nicovideo.jp/watch/{{ $sm }}">{{ $title }}</a></noscript>
```

使い方はこう。

```markdown
{{<nicovideoplayer sm9 >}}
```

# 変換結果

ブログの方を参照してください。
PhoenixでCRUD

# はじめに
本記事は、ElixirのWebフレームワークである「[Phoenix](http://www.phoenixframework.org/)」の導入手順を紹介するものです。
「動作環境の構築〜MySQLを使ったDBのCRUDを行う」といったことを解説しています。
Elixirとはどんな言語か？Elixirの構文は？といったことは解説していません。
また、Phoenixを少しでも使ったことがある方にとっては、すべてご存知かもしれません。

## 前提
- 動作するUbuntu環境が存在すること。<br>
なければ、vagrant+VirtualBoxなどで構築してください。
- MySQLがインストールされていること

# Elixirのインストール
Phoenixを動作させるには、Erlang VMとElixirが必要となります。
[オフィシャルサイト](http://elixir-lang.org/)にある[手順](http://elixir-lang.org/install.html#unix-and-unix-like)に従って、ElixirのPPAの追加とelixirのインストールを行います。

```
wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
sudo apt-get update
sudo apt-get install elixir
```

# Phoenixのインストール

Phoenixのバージョンだけは下記に置き換えて、以降は[こちらの記事](http://qiita.com/iyuuya/items/74e6ec2b840f938c70ce#phoenix)の手順を実施してください。
(先人さまさまです)
```
mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v1.0.2/phoenix_new-1.0.2.ez

```

実は、ほとんどが[Phoenix入門 #01](http://qiita.com/iyuuya/items/74e6ec2b840f938c70ce#phoenix)と[Phoenix入門 #02](http://qiita.com/iyuuya/items/6c0124acbed06d0f1f15)に書いてあるため割愛！

でも、これだけ簡単にCRUDを行うWebアプリが書けてしまうのは凄いものです。
deviseの確認メールの実装で困ったとき

## ここを見る
[Module: Devise::Models::Confirmable ](http://www.rubydoc.info/github/plataformatec/devise/Devise/Models/Confirmable)

## 例
```
User.find(1).confirm       # returns true unless it's already confirmed
User.find(1).confirmed?    # true/false
User.find(1).send_confirmation_instructions # manually send instructions
```
快適なC++生活のためにスクリプト言語を使おう

　開発ターゲットの言語がC++だからといって、それ以外の言語を使わない手はない。いまC++で書いているソースコードの健全性をチェックするために、スクリプト言語を使ってチェックすることができる。

　既存のコードを試行錯誤で改造していると、いつの間にか変なコードになっていることがある。ある一式のプログラムに、別のプログラムを切り貼りして機能を強化したようなときに、妙な状況に陥っている可能性がある。

・ヘッダファイルに定義されているのだが、目的のプログラムの範囲では使われていないマクロ定数、マクロ関数が放置されている。
・使われていないextern宣言
・同一名のマクロ定義の存在

　「まずは動かすことが先だ」で書いたコードを十分に見直さないままになっていると、このような変なコードになってしまっている。コードの行数が少なければ
grep '#define' *.h *.cpp 
とかでも何とかなるだろうけれども、
プログラムの全体の行数が増えて、しかもマクロが不幸にも多く含まれているという状況では、grep以上のツールがほしくなる。

マクロは
\#define DATA_SIZE 　(1000)
\#define square(x) ((x) * (x))

などのようにスペースやタブで区切られて記述されており、
最初のフィールドは"#define"であるという規則がある。
このことを利用して、次のようなツールを作ると上記の健全性のチェックツールを作ることができる。

・#defineが含まれている行で、スペース・タブ区切りテキストとしてフィールドに分割する。
・最初のフィールドが"#define"に一致しているときに、次のフィールドをキーワードとして辞書を作る。辞書の値としては、出現箇所のソースコードのファイル名のリストとする。
・そうして一連のソースコードを処理したあとに、辞書の値に複数のソースコードのファイル名が含まれていたら、それを表示する。

そんなツールが、スクリプト言語では簡単に書ける。
スクリプト言語を使って快適なC++生活をしよう。


####**おまけ：ヘッダファイルでのマクロの重複を見つけるスクリプト**
参考のスクリプトを書いてみました。

```py:doubledMacro.py
# -*- coding: utf-8 -*-
#pylint: disable=C0103
import os

u"""
ヘッダファイルでのマクロの重複を見つけるスクリプト
"""

def findDoubledMacro(wdir):
    d = {}
    for root, dirs, files in os.walk(wdir):
        files = [p for p in files if os.path.splitext(p)[1] in ('.h', '.hpp')]
        for p in files:
            fullname = os.path.join(root, p)
            for line in open(fullname, "rt"):
                oline=line.replace("(", " ")
                oline=oline.replace(")", " ")
                oline=oline.replace(",", " ")
                
                f = oline.strip().split()
                if len(f) >= 2 and f[0] == "#define":
                    if not d.has_key(f[1]):
                        d[f[1]] = []
                    d[f[1]].append(p)

    for k in d.keys():
        if len(d[k]) > 1:
            print k, d[k]
    
if __name__ == "__main__":
    wdir = "."
    findDoubledMacro(wdir)
```


実行結果の例

```txt:
max ['sourceA.h', 'sourceB.h']
_UNICODE ['sourceB.h', 'sourceC.h']
DATA_SIZE ['sourceA.h', 'sourceB.h']
```


実行結果に使用した入力データ

```cpp:sourceA.h
#ifndef SOURCEB_H
#define SOURCEB_H

#define DATA_SIZE (100)
#define _UNICODE
#define DEBUG_VIEW
#define max(x,y)  ((x) > (y) ? (x) : (y))
#endif
```


```cpp:sourceB.h
#ifndef SOURCEB_H
#define SOURCEB_H

#define DATA_SIZE (100)
#define _UNICODE
#define DEBUG_VIEW
#define max(x,y)  ((x) > (y) ? (x) : (y))
#endif
```

```cpp:subDir/sourceC.h
#ifndef SOURCEC_H
#define SOURCEC_H

#define DATA_SIZEC (100)
#define _UNICODE
#define DEBUG_VIEW2
#endif
```


追記：

[快適なC++生活のためにスクリプト言語を使おう２　C++のソースを自動生成させる]
(http://qiita.com/nonbiri15/items/3e5361613390a8ff516e)

[快適なC++生活のためにスクリプト言語を使おう3 ーグラフ作成はmatplotlibにまかせようー](http://qiita.com/nonbiri15/items/8468e04e1c9adb7526fa)

[快適なC++生活のためにスクリプト言語を使おう4 - C++の自作ライブラリをスクリプト言語から使おう -](http://qiita.com/nonbiri15/items/6038e0196bc7d6734121)

[快適なC++生活のためにスクリプト言語を使おう5 - 数値データの確認にはSpyder統合環境を使おう -](http://qiita.com/nonbiri15/items/cf68d74f83ef5e7a5a9a)
raspberryPiのセットアップメモ

![1Bj6EG0O5ntoJJ7fdBI2VdXjLT0arEsItrRwAeaCtcg.png](https://qiita-image-store.s3.amazonaws.com/0/14735/80c91621-137e-57a7-09f0-1f3ecb988fa9.png)

https://www.raspberrypi.org/

ラズベリーパイであんなことやこんなことをやってみたい！
と思っていても週末だったり空いた数時間をつかって少しづつ。
そんなある日、何かの拍子で動かなくなってしまいリセット。。。。
やり直そうと思ったらどうやって動かしたのやらということがありまして
自分用のメモとしてこちらに置いておきます。



## 配線

https://superpiboy.files.wordpress.com/2014/07/raspberry-pi-rev2-gpio-pinout.jpg

## 初期設定

### ipアドレスを調べる
http://qiita.com/key/items/699611bb199f63a230d1

### ssh 
https://tool-lab.com/2013/11/raspi-key-authentication-over-ssh/

### mDNS
http://www.myu.ac.jp/~xkozima/lab/raspTutorial1.html
hostname.local で繋がらない場合
sudo vi /etc/default/avahi-daemon

### DDNS
http://denshikousaku.net/raspberry-pi-domain-and-dynamic-dns
sudo apt-get install ddclient

### blueTooth
http://count0.org/2014/02/06/tethering-raspi-bluetooth-iphone.html

## 映像等
### webcam
http://www.hiramine.com/physicalcomputing/raspberrypi/webcamstreaming.html

### camera device
http://neuralassembly.blogspot.jp/2013/11/raspberry-pipi-noirandroid.html

### Ustream
http://blog.livedoor.jp/victory7com/archives/cat_905458.html
ffmpeg

### motion
sudo apt-get install motion
http://www.cloverfield.jp/2014/05/05/583


## ネットワーク
# S3
http://blog.cloudninja.asia/?p=755


## GPIO系
### WebIO

http://homebrew.jp/show?page=1482

http://video-36.hatenablog.com/entry/2014/07/24/163235

http://hsuetsugu.hatenablog.com/entry/2014/08/27/005149

※結局のところ、pythonの基本文法を覚えてしまった方が
早いという結論になりました。


# 最後に
macユーザーのみなさん、dashboardにWebクリップとして配線図を
置いておくと便利ですよ。すごく重宝してます。
![skitch.jpg](https://qiita-image-store.s3.amazonaws.com/0/14735/eed9259d-6c28-9e29-39cb-8ad52fc7a364.jpeg)
Webに『たんけんぼくのまち』みたいな地図を作る  基礎編

#くらさんじゃないよ、チョーさんだよ！

小さい頃はNHK教育を娯楽代わりにしてみていたために、いつの間にか教育されていたという少年時代を過ごしていたような気がします。

![b0285074_11371547.jpg](https://qiita-image-store.s3.amazonaws.com/0/14735/2d7ae9ca-b8ae-fee3-3d2d-87b8d7af1599.jpeg)
完成予想図

iOS9の地図とかものすごくて技術の進化のスピードにおどろく日々ですね。でも、世の中リアルではなくて、スーパーディフォルメなこんな地図も時代に関わらず面白いと思っている僕は、こんな地図が作りたい。作るためにはどうしたらイイんだろうと思ったところ、道路ネットワークなる用語を教えてもらいまして、それらをつかって、ゴールに至るまでの経緯です。


## とっつきやすいGUIから。

DBを扱う上でコマンドラインでガシガシやっちゃえる人がたくさんいますが、僕はすぐ操作方法を忘れてしまうのでGUIの方がありがたいなと思い調べてみたところ、QGISというPythonで書かれたそれっぽいツールがありました。
http://dataninja.jp/qgis-mac-install/
こちらを参考にして入れてみます。
＞動きましたー

![70ZnI_gwz89s9zORWNEzNoAFE1y22CF5zbWCIbJGOHc.png](https://qiita-image-store.s3.amazonaws.com/0/14735/bce4f302-917e-f17b-e04b-a3d8c7b2ab0f.png)
東京23区と全国の路線データをマッピングしたやつです。
僕の目には東京湾の中心にNEO-TOKYOが見えます。

下の参考サイトをなぞると同じことが出来ちゃいます。
書いていただいた方の足跡に沿って一歩一歩進んでみました。


## WEBの練習

最終的なアウトプットはWEB上で展開する予定のため、簡単な作業フローを試してみます。
http://qiita.com/halhide/items/0d4116a11d05c21e6edc
こちらを参考にして入れてみました。
＞動きましたー
![GZaVFOuoX8AFMI1FlGkl8CZdCBBafE4o3iiN8AZHfMo.png](https://qiita-image-store.s3.amazonaws.com/0/14735/f0f40975-3f89-9901-dde2-0ba08bbda37e.png)

http://ghost.obscure.tokyo/d3/
自分色に染めた地図を作りたいと思った時には、GoogleMapのパレット（色情報）を
カスタマイズする以外のプレイもあるんですね。これは楽しいかも！
QGISはこの辺でだいぶわかってきましたね。
もはやこいつらはSVGなので、いかようにもできるということです。


## ローカルDBにGISのデータを入れてみる。

今回、全国の道路ネットワークをゲットしようと思ってこの辺のセットアップを行いました。道路データ、1.2Gとかありまして、DBを挟まないとダメかなと思ったところ、PostGISという存在を知りました。

PostgreSQLは、カラムに緯度経度の箱を持っていたり、半径何キロという位置情報の処理をSQL文で直接作れるということで経験則ではありますが、位置情報のサービスをする上で結構なシェアを誇っています。

まずは、PostGISというPostgreSQLのやつを。
ということでPostgresから。
http://qiita.com/tstomoki/items/0f1a930bd42a8e1fdaac

そして、PostGISです。
http://qiita.com/Mitsunori_Tsukada/items/4b62562930f5865bdcf5

元データはどこにあるんだというところですが、OpenStreetMapの方からいただいて変換する方法で対応を行ってみます。
http://k-side.hatenablog.jp/entry/2015/04/24/150743
インポート出来たら、あとはローカルで好きなものを好きなだけGETできるはずです。道路幅とかでフィルタしたいんですが、国道、県道等のフラグはあったんですが調査中です。

普通に出来たところから、
どうやってモディファイしていくかという流れで書いていきます。
Objective-CでForce Touch (3D Touch)の値を参照する方法

至って単純なコードですが、情報少なめだったのでメモ。
サンプルコード内で使用しているUIDeviceのカテゴリクラスはこちら。
https://github.com/erichoracek/UIDevice-Hardware

```lang:objective-c

#import "UIDevice+Hardware.h"

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    // デバイス情報を取得
    NSString *platform = [UIDevice currentDevice].platform;
    NSLog(@"platform: %@", platform);
    
    // iPhone 6sかiPhone 6s Plusであれば実行
    if ([platform hasPrefix:@"iPhone8"] && self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
        UITouch *touch = touches.anyObject;
        NSLog(@"touch.force: %@ touch.maximumPossibleForce: %@", @(touch.force), @(touch.maximumPossibleForce));
        if (touch.force >= touch.maximumPossibleForce * 0.5) {
            // 50%の強さを超えたら処理を実行
            [self doSomething];
        }
    }
}

```
Railsでリンククリックした際に、Deleteの代わりにGetが送信されてしまう

## 発生した問題

本来Deleteメソッドで送信したいリクエストが、Getメソッドによって送信されてしまう。

具体的には、

* Scaffoldで生成したindex画面のDestroyリンクがshowへ遷移
* deviseで認証を導入したが、ログアウトを使用とするとルーティングエラーが発生

こんな感じのエラー。

    Started GET "/users/sign_out" for ::1 at 2015-09-25 20:41:26 +0900
    ActionController::RoutingError (No route matches [GET] "/users/sign_out")


### 該当部のコード

    = link_to 'ログアウト', destroy_user_session_path, method: :delete

ちゃんと`:method`も書いているのになんでだろう、、

## 原因

"layouts/application.html.erb"にてデフォルトのjavascriptタグを削除していたことが原因である模様。下記のタグを入れたところ問題は解決。気付かぬうちに削除しちゃってたみたいです。

    # views/layouts/application.html.erb
    = javascript_include_tag 'application'

なお、どうやらこの部分で必要なjavascriptを読み込んでいるようです。

    # app/assets/javascripts/application.js
    //= require jquery
    //= require jquery_ujs

## 参考

[Delete link sends “Get” instead of “Delete” in Rails 3 view](http://stackoverflow.com/questions/3774925/delete-link-sends-get-instead-of-delete-in-rails-3-view)
ModelState.IsValid()

ModelState.IsValid()を使って入力内容の検証を行う際、
どうしてもfalseが返ってきて処理が進まないことがあります。

エラー情報はModelStateのValues配列のErrorsプロパティに格納されているので、
VisualStudioの自動変数を使って１つずつ調べていけば、どこでエラーが発生しているのか発見できる。
![ModelState.png](https://qiita-image-store.s3.amazonaws.com/0/77473/2c03cda2-4aee-28ff-6c63-606f142f0842.png)

でも、入力項目が数十項目あったりすると、<b>いちいち探すのが面倒くさい！！！！！</b>

そんなときは、Linqをつかってエラーメッセージを取得しましょう。
下記1行で、簡単にエラー箇所が判明できます。
var errormsgs = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.ErrorMessage));
Socket.ioを使っていてコネクションを複数に分けて使いたい時

こんにちは。今日はSocket.ioを使っていて、コネクションを複数貼らなくてはいけないことが出てきてた際の対処法です。

非常にこれは単純です。
io.connectやioメソッドでクライアントからconnectionをすると思いますが、ここであるオプションを指定することで対応可能です。

```js
var socket = io('localhost:3000', {forceNew: true});
```

これだけです。
一応forceNewだけでなく、`'force new connection':true` でも問題ありません。

詳しいソースはsocket.io.jsのlookupメソッドを確認すると良いでしょう。

```js
一部抜粋
if (opts.forceNew || opts['force new connection'] || false === opts.multiplex) {
    debug('ignoring socket cache for %s', source);
    io = Manager(source, opts);
  } else {
    if (!cache[id]) {
      debug('new io instance for %s', source);
      cache[id] = Manager(source, opts);
    }
    io = cache[id];
  }
```

恐らく、multiplexをtrueにしても問題ないはず。検証してないです。

対象のオプションを指定していない場合はキャッシュに存在する場合はキャッシュのコネクションを利用するので複数コネクションが貼れないわけですね。

ではでは〜。
CocoaPods → Charthageでどん詰まりしたけどショートカット叩くだけだった



[この記事](http://fromatom.hatenablog.com/entry/2015/07/30/130850)のおかげで助かった。

CocoaPodsから移行する時に僕以外にもハマる人がいるかもしれないので書いておきます。

# 症状
 
どんだけ間違いなくやっても、以下のようなエラーでずっとアプリが起動できずに５時間くらい悩んだ。

> dyld: Library not loaded: @rpath/SwiftyJSON.framework/SwiftyJSON
  Referenced from: /private/var/mobile/Containers/Bundle/Application/CC8759F5-A501-400C-93A8-DCEE3BFE4770/XXX.app/XXX

> Reason: Incompatible library version: Foo requires version 2.0.0 or later, but SwiftyJSON provides version 1.0.0


# 原因
CocoaPodsで入れてたライブラリがシミュレーターに残ってて競合してた。(バージョンは同じはずなのに)

# 対策

`Clean Build Folder` で治った。
メニュー の Product で Optionキー 押すと出てくる。
ショートカットは `Command-Option-Shift-K`。
不要になったLaunch Configurationを削除するGemを作った


## 背景

AWSのAutoScalingは超絶便利なのですが、AutoScalingの元となるLaunch Configurationが編集不可能であるため、AMIの構成を変更したりして新しいAMIを作ると、Launch Configurationも新たに作る必要があります。（コピー機能ができたので以前よりはかなりマシになりましたが）

そういうわけで、Launch Configurationの数はオートスケーリングを運用していると必然的に数が増えていきます。数が増えていくと、Auto Scaling GroupからLaunch Configurationを選ぶときのUIがつらくなるので、定期的に削除する必要があります。

![スクリーンショット_2015-09-25_19_32_43.png](https://qiita-image-store.s3.amazonaws.com/0/5551/8f6c5fb0-74a1-08a0-0a70-a679d85dadb9.png "スクリーンショット_2015-09-25_19_32_43.png")

というわけでManagement Consoleから削除するのですが、なんとこのUI、複数選択だと削除することができません。

![スクリーンショット_2015-09-25_19_35_40.png](https://qiita-image-store.s3.amazonaws.com/0/5551/9e54214a-495d-c6a5-c24c-5ecc67b51d60.png "スクリーンショット_2015-09-25_19_35_40.png")


## 作ったもの

というわけで、溜まっていくとつらくなるのに個別削除しかできないというのに困ったので、一括で削除するツールを作りました。

https://github.com/ryonext/launch_configuration_cleaner

## インストールや使い方など

RubyのGemとして作ったので、`gem install launch_configuration_cleaner`でインストールしてください。

その後、環境変数で以下の値を設定してください。

```
export AWS_ACCESS_KEY_ID=AWSのアクセスキー
export AWS_SECRET_ACCESS_KEY=AWSのシークレットアクセスキー
export AWS_REGION=AWSのリージョン
```

ここまでできたら、コマンドラインから

```
$ clean_lc
```

を実行することで、自分のLaunch Configurationのリストが以下のように表示されます。

```
[
  YourLaunchConfiguration1,
  YourLaunchConfiguration2,
  YourLaunchConfiguration3,
  YourLaunchConfiguration4,
  YourLaunchConfiguration5,
]
```

個別に、削除するかどうかを聞かれるので y or n で選んでください。ちなみに削除はこの時点ではまだ実行されないので操作をミスっても大丈夫です。

```
Do you want to delete YourLaunchConfiguration1? (y/n)
```

全てのLaunch Configurationに対して選択したら、yを選んだもの全てを表示します。

```
These launch configurations will be deleted.
[
  YourLaunchConfiguration1,
  YourLaunchConfiguration3,
  YourLaunchConfiguration5,
]
Are you sure? (yes or no)
```

ここで"yes"とtypeすると削除が実行されます。
気が変わったり削除したくないのを選んでしまった場合は"no"とtypeするか強制終了してください。ちなみに"yes", "no"以外がtypeされても何も起きず、再度聞いてくれるのでミスタイプしても大丈夫です。

## 動作確認環境や使ったGem
* Ruby2.2
* aws-sdk ver2
* thor


## 参考にしたサイト

Ruby gemでのコマンドライン・ツールの作り方 - IT探検記 http://itexp.hateblo.jp/entry/2015/02/21/225234
「知識ゼロから学ぶソフトウェアテスト」を読んで [ホワイトボックステストから探索的テストまで]


## この記事について

高橋寿一さん著の[知識ゼロから学ぶソフトウェアテスト](http://www.amazon.co.jp/dp/4798130605)を読んであまりに感銘を受けたのでついまとめてしまった...
TDD、アジャイル開発隆盛のご時世、あらゆる開発者に読んでほしい良本.
上記本の1章から4章までを **ざっくりと** まとめた.

## 心得

* テストケースを書くのはプログラムを書くのよりも圧倒的に難しい
	* 例) ユーザが数値を連続して入力した時に、それらの値から作られる三角形が正三角形、二等辺三角形、不等辺三角形を判別するプログラムのテスト
* すべてのバグを見つけるのは無理
* ソフトウェアテストではどの部分にバグが出やすいのか、どのようなテスト手法を適用すれば十分な品質が得られるかを知ることが大事
* バグは遍在する
	* ある部分にエラーがまだ存在している確率は、すでにその部分で見つかったエラーの数に比例する

## ホワイトボックステスト

### 特徴

論理構造の正しさのみをテストする.
仕様の間違いはテストできない.
一時不要と思われていたがTDDの隆盛により再び脚光を浴びる

### 具体的なテスト手法 - 制御パステスト

制御構造がどのように実行されるか、どのような振る舞いをするかをテストする
カバレッジ率を取得するために必要

#### ステートメントカバレッジ

コード内の命令文を少なくとも1回はテストする.
if文の中などをテストする.下の例ではx > 0の時にxに1加算されていることを確認する.
x <= 0のときは確認しない.
弱いテスト手法.

```ruby

if x > 0
  x += 1
end

```

#### ブランチカバレッジ

分岐構造に対して条件がそれぞれTRUEのときとFALSEの時をテストする.

### カバレッジテストでカバーされないコード

* エラー処理
* 使われていないコード

### カバレッジテストで検出できないバグ

* プログラムのループ
* 要求仕様自体の誤りや機能が備わっていないバグ
* データに関するバグ
* マルチタスクや割り込みに関するバグ


※ ループテストの基準としては以下を行うと良い

* ループでテストすべき要件
	* ループがスキップされる場合のテスト
	* ループの回数が1回の場合
	* もっとも典型的なループの回数のテスト
	* 最大ループ回数より1少ない回数でのテスト
	* 最大ループ回数でのテスト
	* 最大ループ回数より1大きい回数でのテスト

## ブラックボックステスト

ソフトウェアテストでは4つのふるまいをテストすればOK(James Whittaker曰く)

1. 入力処理
2. 出力処理
3. データ保存
4. 計算

### 同値分割法と境界分析法

ブラックボックステストの中でも基本になる
入力処理と出力処理がテストできる

### 同値分割法 - どんな入力も正しく処理する
 
 入力領域を同値クラスという部分集合に分割し、その部分集合に入る入力値を等価とみなす作業
 
1. 正しい入力が行われる有効同値クラスのテストケースを作成
2. 誤った入力が行われる無効同値クラスのテストケースを作成

無効同値クラスは無数にあるので省略せざるを得ないが **省略した部分でエラーを出してはいけない**

### 境界値分析法 - バグの住む場所を探す

プログラムでは境界付近にバグが潜みやすい
有効と無効の境界の **もっとも近い異なる2点** をテストする

#### 100 ~ 999の入力を許可する場合

1. 100(有効な入力の下限)
2. 99(無効な入力の上限)
3. 599(有効な入力の真中)
4. 999(有効な入力の上限)
5. 1000(無効な入力の下限)
6. 0(0は特別な値なので必ずテストする)

### ディシジョンテーブル - 複雑な入出力のためのテスト

**境界値分析法を、多数の入力に対して多数の出力を確認するように拡張** した感じのもの

非常に小さいソフトウェアか大きいソフトウェアの一部分をテストするのに有効
入力の組み合わせを表にし、その入力に対する動作もしくは出力を明記する.
表には状態、ルール(状態の組み合わせ)、動作(アクション)がまとめられ、その表の通りにテストが行われる.

### 状態遷移テスト

以下の場合に状態遷移テストは有効

* GUIソフトウェア
* オブジェクト指向ソフトウェア
* 通信プロトコルテスト

有限状態マシンを用いるが、一般に状態数が多くなりモデリングが複雑になるのでサポートするツールを用いるとよい

### まとめ

* 入力ダイアログボックスがあったら境界値テストを行う
* 複数のダイアログボックスがあったらディシジョンテーブルを使う
* ダイアログボックスの遷移があれば状態遷移テストを行う

これらを行ってそれでもバグが出る時には以下の2点が考えられる.
1. ブラックボックステストのアプローチが間違っている
2. ホワイボトックステストでしか見つからないバグ

バグの60%くらいはブラックボックステストで見つかる.
すべてのバグをテストで見つけようとするのではなく、
楽に60%くらいのバグを見つけて、それ以外のバグはなぜ発生したのか、どう防止するのかに時間を費やす方が建設的.

## 探索的テスト

**ソフトウェアの理解とテスト設計とテスト実行を同時に行うテスト**

著者のスライド
http://jasst.jp/symposium/jasst14kyushu/pdf/S3.pdf

テストケースを書いてテストするんじゃなくて、アプリケーションの目的、機能を明確にして、怪しいところを叩くテスト.テスト実行結果は報告し、これらのプロセスを継続的に実行する.
コードの共有を受けた人、十分なトレーニングを受けた人が探索的テストを行うと最強というレポートがある.91%のカバレッジを出せたとも.

## to be continued...

* 非機能要求のテスト
* ソフトウェアテスト運用の基本
* ソフトウェア品質管理の基本
* テストの自動化
* それでもテストがうまくいかない人へ
[小ネタ]msys,msys2,cygwinでパスをクリップボードにコピーする


```bash:.bashrc|.zshrc
copypath()
{
    echo `cygpath -aw $1` | clip
}
```
としておくと

```shell-session
$ copypath /tmp/
```
とするとクリップボードに
```shell-session
C:\msys64\tmp
```
等が入ってくる。
windowsアプリとの連携の時便利。
atomをリモートサーバのエディタとして使う(nuclide-server)

facebookのnuclideにはリモートサーバのファイルを直接編集出来る機能があり、別にPHP開発に限らず便利に使うことができます（自分はC開発に使ってます）。

nuclideそのものは、多数のプラグインから構成されるため、全部入れるとさすがに重くなります。今回は、リモート機能に最低限必要なプラグインのみの導入方法を紹介します。

## 対象サーバでの準備

対象のサーバにログインし、

```
npm install -g nuclide-server
```

を実行してインストールしておきます。

## ローカルPCでの準備

以下の３つのプラグインをapm経由でインストールします。

* nuclide-file-tree
* nuclide-file-watcher
* nuclide-remote-projects

atomを再起動し、「Connect...」を選択

![スクリーンショット 2015-09-25 14.39.24.png](https://qiita-image-store.s3.amazonaws.com/0/32596/d65307c0-2e66-6c3e-3608-ae56d980d2f1.png)

接続先情報をよしなに入力する。

![スクリーンショット_2015-09-25_14_39_15.png](https://qiita-image-store.s3.amazonaws.com/0/32596/42a3149d-e8f1-3c44-4f9d-9c43c9ea6b72.png)

完了。

## 余談

FTP経由でリモートサーバのファイルを編集できるエディタは数多くありますが、
そういったものより高速な気がしますし、今のところ同期に問題は起きていません。

リモートサーバでファイルいじるだけなら別にVimでもいいと思いますが…。
Kinoma Create: Kinoma Studioでxmlを使わずにプログラムを書く方法

Kinoma Createのセールスポイントの１つは「JavaScript(KinomaJS)で動作を記述できる」ですが、サンプルプログラムのほとんどがXMLで記述されているため、

+ XMLを使わずにプログラムできるのか？
+ どのように記述すればよいのか？

という疑問が湧いてきます。KinomaJSのドキュメント

+ [KinomaJS Overview](http://kinoma.com/develop/documentation/overview/)
+ [KinomaJS Reference](http://kinoma.com/develop/documentation/javascript/)

を読んでも、それに関するはっきりした記述が見当たりません。他のドキュメントでこのことに関して説明している部分を見つけたのでここにまとめておきます。

# JavaScriptでプログラムを書く方法
[Kinoma CreateのWebページ](http://kinoma.com/create/)の[Technotesをクリックして行けるページ](http://kinoma.com/develop/documentation/technotes/)の中に[Mobile Apps in Kinoma Studio](http://kinoma.com/develop/documentation/technotes/mobile-apps-in-kinoma-studio.php)という記事があります。この記事はKinomaのAndy氏がUC Berkleyの授業で使ったチュートリアル資料とのことです（詳しくは[こちら](http://blog.kinoma.com/2015/02/valentines-day-love-kinoma-developers/)）。

[Mobile Apps in Kinoma Studio](http://kinoma.com/develop/documentation/technotes/mobile-apps-in-kinoma-studio.php)の冒頭部分にKinoma Studioでプロジェクトを作成する方法の説明があります。プロジェクト定義画面の「4. Templates」で「Default KinomaJS Application(Javascript)」を選択するとJavaScriptでプログラムを書く雛形が生成されます。

![スクリーンショット 2015-09-25 17.26.34.png](https://qiita-image-store.s3.amazonaws.com/0/92294/90a018ed-f479-df62-c150-6dead999858a.png)

「Default KinomaJS Application with BLL」を選択した場合も、JavaScript用の雛形が生成されます。

プロジェクトフォルダのsrcフォルダを展開すると**main.js**というファイルがあります。

![スクリーンショット 2015-09-25 18.08.08.png](https://qiita-image-store.s3.amazonaws.com/0/92294/2c28452d-06b6-0ff5-6fcb-b4d71ca8b318.png)


このファイルを開くと先頭に **//＠program** という行が埋め込まれており、これがJavaScriptプログラムであることを示す目印になっています。

![スクリーンショット 2015-09-25 18.04.01.png](https://qiita-image-store.s3.amazonaws.com/0/92294/5c59508b-c36e-65ce-9395-ae0d5b0878fc.png)

[Mobile Apps in Kinoma Studio](http://kinoma.com/develop/documentation/technotes/mobile-apps-in-kinoma-studio.php)では、GUI部品の基本的な使い方が丁寧に説明されているのでKinoma Create初心者には必読のドキュメントだと思います。この続編として、[Asynchronous Communication in KinomaJS](http://kinoma.com/develop/documentation/technotes/asynchronous-communication-in-kinomajs.php)というチュートリアル記事があります。こちらも必読です。

注：[Mobile Apps in Kinoma Studio](http://kinoma.com/develop/documentation/technotes/mobile-apps-in-kinoma-studio.php)の画面例では雛形の選択肢として２種類しかありませんが、最新版のKinoma Studioでは「Default KinomaJS Application with BLL」が追加されています。

![スクリーンショット 2015-09-25 18.15.32.png](https://qiita-image-store.s3.amazonaws.com/0/92294/16e15da6-671a-aaf0-8299-2858e908896d.png)


# XMLで書かれたプログラムのJavaScript版を見る方法
参考にしたプログラムがXMLで書かれていると「JavaScriptではどう書けばいいんだろう・・・」という気分になります。こういうときはKinoma StudioのエディタでXMLファイルを開いた状態で

![スクリーンショット 2015-09-25 18.21.24.png](https://qiita-image-store.s3.amazonaws.com/0/92294/57a9ad7c-722e-cdea-083b-941997fe6da7.png)

Sourceメニューの「View KinomaJS Conversion」を選択すると

![スクリーンショット 2015-09-25 18.22.55.png](https://qiita-image-store.s3.amazonaws.com/0/92294/d4a5b9c9-3f08-46b2-65d3-8df2cc789759.png)

JavaScriptに変換されたファイルが表示されます。

![スクリーンショット 2015-09-25 18.23.21.png](https://qiita-image-store.s3.amazonaws.com/0/92294/4aa14c4d-baf7-2789-7cf7-4ef72e22aa09.png)

同じ疑問を持つ人がいるようで、[forumにQ&A](http://forum.kinoma.com/discussion/324/how-to-convert-xml-to-js)があります。
SSHトンネリングでプロキシを越える


[NetBeans] のデバッガ等、プロキシ設定が無いツールで、越えられなくて困った時の対策です。

> sshはプロキシ経由して接続できている事が前提です。

# したいこと

Host= ``xxx.xxx.xxx.xxx``, Port= ``8080`` にアクセスしたい。
プロキシの設定はしない。 (できない)

# 方法

TerminalでSSHを使って、 

* Host= ``xxx.xxx.xxx.xxx``, Port= ``8080`` 

を...

* Host= ``localhost``, Port= ``7100`` 

にポートフォワードする。

```
$ ssh -L 7100:localhost:8080 username@xxx.xxx.xxx.xxx
```


# アクセスしてみる

Host= ``localhost``, Port= ``7100`` を指定してアクセスする。


[NetBeans]:https://ja.netbeans.org/downloads/
jettyにNetBeansのデバッガでアタッチする


[jetty] を起動する所から。
デバッグポート ``:8585`` で起動する。管理者権限じゃないとダメかも。

```
$ cd (your-jetty-directory)
$ java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8585,suspend=n -jar start.jar
```

[NetBeans] を起動し、メニューから...

* ``Debug`` → ``Attach Debugger...``

Attachダイアログが出るので、以下を選択します。

|項目|選択|
|:--|:--|
|Debugger|Java Debugger (JPDA)|
|Connector|Socket Attach|
|Transport|dt_socket|
|Host|localhost|
|Port|8585|

これでjettyにアタッチできます。


[jetty]:http://www.eclipse.org/jetty/
[NetBeans]:https://ja.netbeans.org/downloads/
「Multiple dex files define Lcom/google/android/gms・・・　」　＝ 「クリーンビルドせよ」


Android Studioで、言われるがままにSDKをアップデートし、
さて、いつもどおりアプリを実行・・・　としようとしたところ・・


```
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/appdatasearch/DocumentContents$zza;
	at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)
	at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
	at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
	at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
	at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
	at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
	at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)
	at com.android.dx.command.dexer.Main.run(Main.java:246)
	at com.android.dx.command.dexer.Main.main(Main.java:215)
	at com.android.dx.command.Main.main(Main.java:106)
```

こんなエラーでコケた。

理由はおそらく、GooglePlayServiceのjarファイルが2つあるから。

```
$ grep -r appdatasearch *
Binary file app/build/intermediates/exploded-aar/com.google.android.gms/play-services-appindexing/7.8.0/jars/classes.jar matches
Binary file app/build/intermediates/exploded-aar/com.google.android.gms/play-services-appindexing/8.1.0/jars/classes.jar matches
```

ん？なんで２つあるの？
とりあえず一旦全消し。

```
./gradlew clean assembleDebug
```

→ **解決**
React component ライフサイクル図

React component はライフサイクルしっかり頭にいれてないとダメな気がする。
[公式のページ](https://facebook.github.io/react/docs/component-specs.html)に文章で説明されているものを図にしてみた。個人的には理解が捗った。

![React component ライフサイクル](https://docs.google.com/drawings/d/1no5sqZH5mVLCDuaf-Yt25gXquHi-QNNgurdlTGKpHvg/pub?w=1469&h=1273)
Ruby の真偽値についてちゃんと理解できている?

Effective Rubyを読んで、Rubyの真偽値について勉強したので以下にメモしておきます。

## Rubyの真と偽の値をちゃんと理解できている?

**Rubyでは、falseとnilを除くすべての値が真です**

つまり、**0は、真です。**

そうだったのかー