OmniAICreator/Qiita-1.07M huggingface dataset:
Excelで「 ' 」（アポストロフィー）がやっかい

Excel で「 ' 」がやっかいだったのでメモ。
「 ' 」は「アポストロフィー」と読む。Windows の場合 **Shift + 7** で出てくるやつ。
文字列で表示したいときに良く使うものです。
アポストロフィーを最初につけて数式や文字を書くと、その数式や文字がそのまま表示されます。

# 最初に「 ' 」をつけたものを、つけない状態にしたい

つまり、`'=5+3` を、`=5+3` にしたい、というような場合です。

そんなの置換で一発でしょ・・と思いきや・・置換ができない！
検索する文字列に「'」を入れても、データが見つかりませんと言われる！
これは困った。

[ググってみると](http://oshiete.goo.ne.jp/qa/893555.html)、どうも最初のアポストロフィーは置換では削除できないらしく、
他のセルに「形式を選択して貼り付け」をして、
「値と数式の書式」にチェックを入れればOKとのこと。

とりあえず、これで一安心・・・と、思いきや・・・

# そのあと、計算式が計算されない・・(T_T)

ウウッ・・・(T_T)

これはいろいろと対処法があります。
毎回対処法を忘れるのでついでにメモっておきます。

- 置換で「=」を「=」にするというように、全てのセルにある特定の文字列を、それと同じ文字列で置換する
- 範囲を選択して「データ」→「区切り位置」をクリックして「完了」をクリック
- セル上で「F2」を押して「Enter」を押す（対象セルが少ないときはこれが簡単）

おつかれさまでした。

# 参考
http://oshiete.goo.ne.jp/qa/893555.html
gdn apiで円の桁がすごいことになる件

googleのAdWords APIから広告レポートを取得して、整形してDB登録して・・・みたいなことをやっていると、取得した通貨の桁数がすごいことになっていることに気がつきました

10円が正しいんだけど、APIからの戻り値は、10000000(・_・;)

なんだこれは！？そんな売上あったらいいな～ｗとか思いながらサポートに質問してみると

APIからの戻り値はマイクロ円表示になるので、使いたいときは1000000で割って欲しいとのこと

なるほど～
Wordpressで、固定ページとカスタム投稿の名前が被って、アクセスできなくなったときのはなし


## 現象

Wordpressにおいて、例えば `bookmark` という名前の固定ページと、 `bookmark` という名前のカスタム投稿タイプは、同時に存在できません。
固定ページのパーマリンクと、カスタム投稿タイプのアーカイブが、どちらも `/bookmark` というURLをとりに行こうとするためです。

さてこれを、両方作成してしまうとどうなるか。 **後に作成した方にアクセスできなくなります**。
しかもこちら、衝突に気づいて先に作成した方を **リネームしたとしても、アクセスできなくなったまま**です。

どうやらWordpressは、ルーティングの情報（厳密に言えばmod_rewrite用の情報）を、dumpした形でDB内に保持しているようで、こちらが書き換わらないかぎりは、ルーティングが最新の状態になっているとは限らないようです。

## 対応

このDB内に保持しているルーティングの情報を、再度生成しなおすための、 `flush_rewrite_rules`という関数がありました。これを使いましょう。

衝突しない名前に変更した上で、以下のようなコードを `functions.php` 等々に埋め込みます。

```php
// ルーティング衝突をなおす
add_action('init', 'my_flush_rewrite_rules');
function my_flush_rewrite_rules () {
    flush_rewrite_rules( TRUE );
}
```

ただしこちら、けっこう重たい処理になっているようなので、 **一度実行できたらすぐ元に戻す** というような使い方がよさそうです。

なんらかのアクション(themeの切り替え時とか)にフックして実行するのもよいかもしれないですが、基本的にこれを実行するのはイレギュラーケースのときなので、必要なときだけスポットで実行するのがいい気がしております。

## 参考

- [Function Reference/flush rewrite rules « WordPress Codex](https://codex.wordpress.org/Function_Reference/flush_rewrite_rules)
- [関数リファレンス/flush rewrite rules - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/flush_rewrite_rules)
Xcode7.3のPlaygroundはついにインタラクションに対応！

Xcode7.3からPlaygroundがタッチイベント等に対応しました。

![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/24979/4abaa660-e6b9-94c5-65bb-d5ce2eaa407c.gif)

上記のサンプルは以下のコード

```swift

import UIKit
import XCPlayground

class ViewController: UITableViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .whiteColor()
    view.frame = CGRectMake(0, 0, 1136/2, 640/2)
  }
}

extension ViewController {
  override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 50
  }
  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = UITableViewCell()
    cell.textLabel?.text = "hello \(indexPath.row)"
    return cell
  }
}

XCPlaygroundPage.currentPage.liveView = ViewController()

```
Android タブバーにバッチを表示する



こんなやつ

![rps20160322_131022_828.jpg](https://qiita-image-store.s3.amazonaws.com/0/74328/61de3257-4d6f-8376-1ee8-6f79901c5d2a.jpeg)


iOSなら、というかSwiftなら最初からTabの実装にバッチが考慮されているので楽勝なのですが、Androidは一手間いります。


まずタブバーアイコンにはっつけるlayout.xml

## layout.xml


```notifications_tab.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="0dip"
android:layout_height="64dip"
android:layout_weight="1"
android:layout_marginLeft="-3dip"
android:layout_marginRight="-3dip"
android:orientation="vertical"
    >

<ImageView
    android:id="@+id/notifications_icon"
    android:layout_marginTop="8dp"
    android:layout_width="25dp"
    android:layout_height="25dp"
    android:src="@drawable/notifications"
    android:layout_centerHorizontal="true"/>

<TextView
    android:id="@+id/notifications_badge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/notifications_icon"
    android:layout_toRightOf="@+id/notifications_icon"
    android:layout_marginLeft="-3dp"
    android:layout_marginTop="0dp"
    android:paddingTop="2dp"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:paddingBottom="2dp"
    android:textSize="10sp"
    android:textStyle="bold"
    android:textColor="@android:color/white"
    android:background="@drawable/badge"
    android:visibility="gone"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="9dp"
    android:text="Notifications"
    android:textColor="@drawable/tab_indicator_text"
    android:paddingBottom="6dp"
    android:layout_centerHorizontal="true"
    android:layout_alignParentBottom="true"/>


</RelativeLayout>
```

続いてActivity

## ざっくりしたActivityの実装

```Activity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
.
.
.

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    Tab notifications = tabLayout.newTab();
    notifications.setText("Notifications");
    notifications.setIcon(R.drawable.notifications);
    tabLayout.addTab(notifications);

    View notificationsTab = inflater.inflate(R.layout.notifications_tab, null);
    notifications.setCustomView(notificationsTab);
    notificationsBadge = (TextView) findViewById(R.id.notifications_badge);

.
.
.

}

/**
 * バッチを更新する
 */
private void updateBadge(String badgeMessage){
    notificationsBadge.setVisibility(View.VISIBLE); 
    notificationsBadge.setText(badgeMessage);
}
```


タブの実装は省略しまくっていますが、行間を読みまくって頂ければと。
Xcode 7.3ではMacの感圧タッチトラックパッドでiPhoneの3D Touchをデバッグできる

Xcodeを使ってiPhone用アプリを開発する際、**iPhoneの3D TouchをMacの感圧タッチトラックパッドでシュミレートできる新機能が、Xcode 7.3で実装されました**。本エントリーではこのデバッグ方法を紹介します。

<img width="375" src="https://qiita-image-store.s3.amazonaws.com/0/67884/f1474672-b1b0-c028-e3ce-63dcf27dfcdb.png">

#Macの感圧タッチトラックパッドとiOSの3D Touch
2015年に発売されたAppleのMacbookシリーズのトラックパッドや「[Magic Trackpad 2](http://www.apple.com/jp/shop/product/MJ2R2J/A/magic-trackpad-2)」は、従来のトラックパッド操作に加えて「強めにクリック」することで操作する「[感圧タッチ(Force Touch)](https://support.apple.com/ja-jp/HT204352)」機能があります。
また、2015年発売のiPhone 6s、iPhone 6s Plusには「画面を押し込む」ことによって操作する「[3D Touch](http://www.apple.com/jp/iphone-6s/3d-touch/)」が実装されています。
この2つは似た機能であり、**iOS Simulatorで感圧タッチトラックパッドを使って3D Touchをデバッグすることはこれまで不可能でしたが、2016/03/22リリースのXcode 7.3で遂にデバッグ機能が実装されました**。

#Xcode 7.3で感圧タッチトラックパッドを使って3D Touchをデバッグするデモ
では感圧タッチトラックパッドで3D Touchをデバッグしてみましょう。
基本的なXcodeの使い方やアプリ開発の方法は記事「[10分で試せる！ Swiftを使った初めてのiOSアプリ開発入門 - ICS MEDIA](https://ics.media/entry/6439)」をご覧ください。

① あらかじめXcode 7.3をインストールしておきます。
② 任意のプロジェクトをXcodeで生成します。
③ iOS Simulatorのターゲットを「iPhone 6s」か「iPhone 6s Plus」にします。3D Touchに対応していない他のiPhoneではデバッグできません。

　　![image](https://qiita-image-store.s3.amazonaws.com/0/67884/ca800701-c533-e807-3951-0b76e56d7a34.png)

④ デバッグ実行ボタンを押します。
⑤ iOS Simulatorが起動したら、[Hardware]→[Use Trackpad Force for 3D touch]にチェックを入れます。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/f28b2bbf-62ec-72a4-aac8-2b0e4691fd4e.png)

⑥ [Hardware]→[Home]（または[shiftキー]+[commandキー]+[H]キー）を選択して、ホーム画面を表示します。

<img width="375" src="https://qiita-image-store.s3.amazonaws.com/0/67884/7205aa5d-a1cf-4678-fbc2-14bcf6d90a82.png">

⑥ Safariの場所で、感圧タッチトラックパッドを「強めにクリック」します。Safariは3D Touchに対応しているので、クイックアクション(アプリケーションのショートカットメニュー)が表示されます。

<img width="375" src="https://qiita-image-store.s3.amazonaws.com/0/67884/f1474672-b1b0-c028-e3ce-63dcf27dfcdb.png">

感圧タッチトラックパッドの搭載されたMacbookとMagic Trackpad 2で確認できました。

#やっと「強めにクリック」の出番が来た

iPhone 6sが発売された時、「あれ？ 感圧タッチトラックパッドで3D Touchはデバッグできないの？」ともどかしい思いをしていたので、この機能はずっと待ちわびていた機能でした。

感圧タッチトラックパッドの「強めにクリック」は対応しているアプリもまだ少なく、正直使いどころが少なく感じていましたが、このXcode 7.3のアップデートのおかげで活躍する機会が増えそうです。
Pythonのデフォルト引数の挙動には気をつけようと思った


*[元エントリ](http://massat.github.io/blog/2016/03/21/be-careful-of-default-args/)からの単なる転載*

pythonのデフォルト引数の挙動は勘違いしそうで怖いので気をつけたい。

```sh
➜  ~ python
Python 2.7.11 (default, Feb  2 2016, 21:44:54)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def func(arg={}):
...     return arg
...
>>> foo = func()
>>> foo['a'] = 'foo'
>>>
>>> bar = func()
>>> bar['b'] = 'bar'
>>> print(foo)
{'a': 'foo', 'b': 'bar'}
>>> print(bar)
{'a': 'foo', 'b': 'bar'}
```

デフォルト引数はモジュールロード時の1度だけしか評価されないために、呼び出しの間で共有されている。
なんでこんな仕様にしたんだろうな・・・。
PHPバージョン管理のphpenvをMacにインストールで複数ver使う PHP5.6/PHP7

現状Vagrant+CentOS+Dockerで複数バージョンPHP試していたのですが、PHPにもバージョン管理ってあったのですね。

PHPにもphpenvとかいうバージョン管理できると知ったので試してみました。
RubyのrbenvやPythonのpyenvみたいなやつです。
特に関係ないのですが私の環境は事前にrbenvとpyenv入れてありました。

#前提条件
・Mac OS X 10.11(El Capitan)
・homebrew


#インストール
##phpenvインストール
homebrewだとうまくインストール出来なかったので直接インストールしていきます。

```
git clone https://github.com/CHH/phpenv.git
phpenv/bin/phpenv-install.sh
```

これでユーザーディレクトリに
.phpenvが作成されましたのでパスを通します。

~の.bash_profileか.bashrcを編集して、

```
vi ~/.bash_profile
```

2行追加

```:bash_profile
export PATH="$HOME/.phpenv/bin:$PATH"
eval "$(phpenv init -)"
```

でパスを反映させる

```
source .bash_profile
```

インストール確認

```
phpenv --version
```

##php-buildインストールする
php-buildは複数のバージョンのPHP環境をインストールするためのツールです。
php-buildを.phpenv内にぶち込みます。

```
git clone git://github.com/CHH/php-build.git $HOME/.phpenv/plugins/php-build
```

これで~/.phpenv/plugins内にphp-buildが追加されました。

インストール可能なPHPのバージョンの確認

```
phpenv install --list
```
最新は7.0.4でした。
何か依存関係で足りない言われたらhomebrewで都度追加しましょう。

インストールし終わったら

```
phpenv rehash
```


#PHPのバージョン切り替え
globalとlocal使い分けで切り替えできます。pyenvとかと同じですね。

```
phpenv global 7.0.4  # システム全体のPHPのバージョン変更
phpenv local 7.0.4   # ディレクトリ単位のPHPのバージョン変更
```

切り替わったか確認

```
php --version
```
ビルド結果を GitHub Pages で公開するために別ブランチから `gh-pages` ブランチにコミットする

# 前提・背景

* [GitHub Pages](https://pages.github.com/) でプロジェクトサイトを公開する場合、プロジェクトの `gh-pages` ブランチに公開したいファイル群をコミットして GitHub のリポジトリに `push` する。
* TypeScript を使っている場合など、公開するファイル群のソースコードを `gh-pages` ブランチとは別に管理したい場合がある。
    * 例えば、`master` ブランチに `gh-pages` で公開するファイル群のソースコードを管理して、ビルドの成果物を `gh-pages` で公開したい、という状況。

上記のような状況では、`master` ブランチなどでビルドを行い、その成果物を `gh-pages` にコミットしたいということになります。 ブランチの切り替えをせず、ローカルリポジトリを複数用意したりもせずにこれを実現するためのいい方法が確立されてないようなので、ちょっと考えてみました。

# `gh-pages` 以外のブランチでビルドして成果物を `gh-pages` ブランチにコミットする方法

[Git の配管 (Plumbing) コマンド](https://git-scm.com/book/ja/v1/Git%E3%81%AE%E5%86%85%E5%81%B4-%E9%85%8D%E7%AE%A1%EF%BC%88Plumbing%EF%BC%89%E3%81%A8%E7%A3%81%E5%99%A8%EF%BC%88Porcelain%EF%BC%89)を使い、ツリーオブジェクトを作成し、コミットを作り、`gh-pages` の参照先コミットを変更する、ということを行います。

具体的には “[Committing a subfolder to the gh-pages branch from the other branch](https://gist.github.com/nobuoka/d0f088df57d50e4cda1a)” に書いたとおりで、以下のような感じです。 (Windows PowerShell での例。)

```
# Step 1. ツリーオブジェクトの作成
git add -f ./build/gh-pages # ビルドの成果物を index に追加
# prefix を指定してツリーオブジェクトを作成
$treeObjId = git write-tree --prefix=build/gh-pages
git reset -- ./build/gh-pages # index から削除

# Step 2. コミットの作成
# 上で作成したツリーオブジェクトを基に、`gh-pages` ブランチの参照先コミットを親とするコミットを作成
$commitId = git commit-tree -p gh-pages -m "YOUR COMMIT MESSAGE" $treeObjId

# Step 3. `gh-pages` ブランチの参照先を上で作成したコミットにする
git update-ref refs/heads/gh-pages $commitId
```

もっといい方法があるかも？ と思いつつ、特にいい方法が見つからなかったし思いつかなかったのでこんな感じでやることにしました。

# 他の方法 : `master` ブランチでビルドの成果物もバージョン管理

ビルドの成果物も `master` ブランチにコミットして良いのであれば、Git の subtree の仕組みを使うのが良さそうです。

* 参考 : [Deploying a subfolder to GitHub Pages](https://gist.github.com/cobyism/4730490)
* 参考 : [Github pages に 特定のディレクトリだけデプロイする](http://qiita.com/mizchi/items/17e2eb04c34b18aff921)

個人的にはビルドの成果物を `gh-pages` ブランチ以外にコミットするのはしたくないのでこの方法は採用しませんでした。
cocosプロジェクトをSourceTreeで管理するときの手順（mac環境で）

他の方法もあると思いますが、一例として紹介します。

（例）「/Users/Test/」というフォルダが存在している時

1: ターミナルでコマンドを入力しcocosプロジェクトを作成する
```cocos new TestProject -d /Users/Test/ -p jp.co.Test.TestProject -l cpp```

2: ターミナルで作成したプロジェクトフォルダに移動する
```cd /Users/Test/TestProject/```

3: ターミナルでローカルリポジトリ用のgit初期化コマンドを実行する
```git init```

4: ターミナルでリモートリポジトリ用のフォルダを作成する
```mkdir -p /Users/Test/repo/TestProject.git/```

5: ターミナルでリモートリポジトリ用のフォルダに移動する
```cd /Users/Test/repo/TestProject.git/```

6: ターミナルでリモートリポジトリ用のgit初期化コマンドを実行する
```git init –bare```

7: SourceTreeを起動する

8: 「+新規リポジトリ」で「ローカルリポジトリを作成」で以下のフォルダを開く
```/Users/Test/TestProject/```

9: SourceTreeのメニューの「リポジトリ」-「リポジトリの設定」-「追加」でリモートの名前とリモートリポジトリのパスを設定する

リモートの名前：origin
URL/パス：/Users/Test/repo/TestProject.git/

10: 作業ツリーのファイルをコミット

11: リモートリポジトリにプッシュ
時間になると笑ゥせぇるすまんがドーンしてる画像が出てくるApplescript


# 初版から改善したい点
- 経過時間が見たい
- 次の時間指定をすることができるようにしたい．
- 文字で記録を取っておきたい．
- 喪黒のセリフをスクリプト内部に書き込むとごちゃごちゃするので，テキストファイルに書き込む形にして分離し，それを読み込むようにする．

 

# 初版

初めてAppleScriptを書くので，一番使えそうなタスク管理用のスクリプトを作ってみました．
スクリプトを走らせると最初にアクション開始までの時間を聞かれるので，整数値xを入力するとx分後に喪黒福造の画像がフルスクリーンで表示されてその直後に彼の名言が出てきます．それだけです...

```AppleScript
display dialog "When do you wanna doon?" default answer {"type only integer"}
set DoonTime to text returned of result
set moguro to {"この世は老いも若きも男も女も心のさみしい人ばかりそんな皆さんのココロのスキマをお埋め致しますいいえ、お金は一銭もいただきませんお客様が満足されたら、それが何よりの報酬でございます", "私の名は喪黒福造人呼んで「笑ゥせぇるすまん」ただのセールスマンじゃございません私の取り扱う品物はココロ，人間のココロでございます
ホーッホッホッホァーッ！！", "多少のストレスは人生の調味料です", "自惚れ鏡というように、鏡は決して真実を映し出しません。 なぜなら人は自分の好きな角度でしか鏡を見ようとしないです", "完全無欠な人間などいません。どんなリッパな人でも、どこかに欠陥があるのが人間である証拠です", "ドーーーーーーーーーーーーン！！！", "ドーーーーーーーーーーーーン！！！ドーーーーーーーーーーーーン！！！ドーーーーーーーーーーーーン！！！ドーーーーーーーーーーーーン！！！ドーーーーーーーーーーーーン！！！ドーーーーーーーーーーーーン！！！ドーーーーーーーーーーーーン！！！ドーーーーーーーーーーーーン！！！ドーーーーーーーーーーーーン！！！ドーーーーーーーーーーーーン！！！ドーーーーーーーーーーーーン！！！ドーーーーーーーーーーーーン！！！ドーーーーーーーーーーーーン！！！"}
set num to random number ((length of moguro)) - 1
set var to num + 1
set min to DoonTime
set cur to current date
repeat while (current date) < cur + min * 60
	if (current date) = cur + min * 60 - 0.7 then
		tell application "Finder"
			open document file "moguro_pic.jpg" of folder "Pictures" of folder "singo" of folder "Users" of startup disk
		end tell
	end if
end repeat
tell application "Preview"
	delay 2
	tell application "System Events"
		keystroke "f" using {command down, shift down}
		delay 4
		delay 1
	end tell
end tell
tell application "Finder"
	activate
	display dialog item var of moguro
end tell
```
まだ，試作段階で直さなきゃいけないところは山ほどありますがとりあえず動いたのがなんか嬉しい．
serverspecでiptables のルールを検証する

## Serverspec

公式ドキュメントの[iptablesセクション](http://serverspec.org/resource_types.html#iptables) では、iptables があるルールを持っているか検証するために、have_rule マッチャーを使うべきと記載されています。

```rb
describe iptables do
  it { should have_rule('-P INPUT ACCEPT') }
end
```

## が、何故か fail する

例えば、iptables に 下記ルールを設定したとして

```
-A INPUT -m tcp -p tcp --dport 80 -j ACCEPT
```

serverspec では 下記のように書けば、pass するはず。

```rb
describe iptables do
  it { should have_rule('-A INPUT -m tcp -p tcp --dport 80 -j ACCEPT') }
end
```

が、なぜか fail します。


## serverspec / specinfra を読む

ドキュメントには詳しく書かれていないので、コードを読むことにします。
まずは serverspec。

```rb
RSpec::Matchers.define :have_rule do |rule|
  match do |subject|
    if subject.class.name == 'Serverspec::Type::Iptables' || subject.class.name == 'Serverspec::Type::Ip6tables'
      subject.has_rule?(rule, @table, @chain)
    else
      subject.has_rule?(rule)
    end
  end
```

https://github.com/mizzy/serverspec/blob/master/lib/serverspec/matcher/have_rule.rb


これだけではなぜfail しているのか不明なので、さらに specinfra を読みます。

```rb
class Specinfra::Command::Linux::Base::Iptables < Specinfra::Command::Base::Iptables
  class << self
    def check_has_rule(rule, table=nil, chain=nil)
      cmd = "iptables"
      cmd += " -t #{escape(table)}" if table
      cmd += " -S"
      cmd += " #{escape(chain)}" if chain
      cmd += " | grep -- #{escape(rule)}"
      cmd
    end
  end
end
```

https://github.com/mizzy/specinfra/blob/master/lib/specinfra/command/linux/base/iptables.rb

見つけました。 iptables -S の結果を grep しているようです。

実際に、iptables -S すると、

```bash
$ iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
...
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
```

という結果が得られます。


```rb
describe iptables do
  it { should have_rule('-A INPUT -m tcp -p tcp --dport 80 -j ACCEPT') }
end
```

iptables -S の結果に対して評価してることが分かれば、なぜ上のspecがfailするのかは明らかで、"-m tcp -p tcp" の順序が逆だからということになります。


## まとめ

serverspec の have_rule は "iptables -S" の結果を grep で評価してるよ、ということを覚えておくと役に立つかもしれません。
派手にズンドコきよし with Python

# 派手に！
「キ・ヨ・シ！」を派手にできないかと思っていたらちょうどいいのが
[peterbrittain/asciimatics: A cross platform package to do curses-like operations and create ASCII art animations](https://github.com/peterbrittain/asciimatics)

> A cross platform package to do curses-like operations and create ASCII art animations

## 実装
ズンドコ部分は以下から拝借
[Pythonでズンドコキヨシ(ジェネレータ) - Qiita](http://qiita.com/ques0942/items/b3762287d8962d489bbf)

### コード
```py
# -*- coding: utf-8 -*-
from asciimatics.effects import Cycle, Stars
from asciimatics.renderers import ColourImageFile
from asciimatics.scene import Scene
from asciimatics.screen import Screen
from collections import deque
import random
import time

z = u'ズン'
d = u'ドコ'

def kiyoshi(screen):
    effects = [
        Cycle(
            screen,
            ColourImageFile(screen,"kiyoshi.gif",15),
            (screen.height - 15)/ 2)
        ,Stars(screen, 200)
    ]
    screen.play([Scene(effects)], stop_on_resize=True)

def zndkkys2():
    state = 0
    while True:
        num = random.choice((0, 1, ))
        # ズンならカウントアップ
        if num:
            yield z
            state += 1
        else:
            yield d
            # ドコの前に4回以上ズンが連続していたらキ・ヨ・シ！
            if state >= 4:
                return
            # ドコの前のズンが3回以下ならカウントを初期化
            else:
                state = 0

if __name__ == '__main__':
    print ''.join(zndkkys2())
    time.sleep(1)
    Screen.wrapper(kiyoshi)
```

以下の画像を元にアスキーアートを生成
![kiyoshi.gif](https://qiita-image-store.s3.amazonaws.com/0/54591/62a3a3c0-e0cd-98d0-aa84-2da1f2add44f.gif)

![kiyoshi2.png](https://qiita-image-store.s3.amazonaws.com/0/54591/22593e39-b095-2f77-a647-e59b12c10ee8.png)
`q`で停止（プログラム側での止め方がわからない……）
Docker MachineでDドライブなどUsers以外を自動マウントする

一回忘れたのでメモ。

Docker Machineは`boot2docker.iso`から起動するので、`docker-machine ssh`して中のファイルを弄ろうとしてもMachineを再起動すると消えてしまう。
しかしホストの`disk.vmdk`が`/mnt/sda1`にマウントされており、その内部は保存される。
そして`/var/lib/boot2docker/`は`/mnt/sda1/var/lib/boot2docker/`へのシンボリックリンクで、[その中に`bootlocal.sh`を置くとDocker Machineの起動時、初期化の最後に実行してくれる](https://github.com/boot2docker/boot2docker/blob/50c2c4f5b663b4c403578982ed9d9ea249397575/doc/FAQ.md#local-customisation-with-persistent-partition)。


## つまりどうするの

VirtualBoxのdefaultマシンの共有フォルダ設定で`D:\Hoge`などを`d/Hoge`などとして追加した上で`docker-machine ssh`して`/var/lib/boot2docker/bootlocal.sh`に以下のように書く。

```bash:bootlocal.sh
mkdir -p /d/Hoge
mount -t vboxsf -o defaults,iocharset=utf8,uid=1000,gid=50 d/Hoge /d/Hoge
```

これでDocker Machineの起動時に`D:\Hoge`が自動マウントされ、そこ以下ならボリュームとしてコンテナにマウントできるようになる。

試してないから勘だけど、共有フォルダ名（`d/Hoge`）はたぶん何でも良いと思うけどマウント先（`/d/Hoge`）のディレクトリ名はマウント元（`D:\Hoge`）と合わせないといけない気がするので注意。

ちなみに、Usersをマウントする設定は`/etc/rc.d/vbox`に書かれている。
[Rails]Controllerに対応するカスタムHelperしか読み込まれなくなった問題とその対応

font-awesome-rails を入れたは良いけど読み込まれなくなって困ってしまったので原因を追いかけたメモ。include_all_helpers は true の状態なのに　false 状態のような感じになっていた。Railsは詳しくないのでちょっと苦労しました。

環境としては Ruby 2.2.4, Rails 4.1.6 です。

# 結論

入れていたgemが悪さをしていました。今回は `grape-rails-routes` というものでした。

# 原因

Helperは最初にApplicationControllerなどがロードされたタイミングで `ApplicationController.helper :all` が読み込まれます。

（この辺のコード参照）
https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/railties/helpers.rb


上記コードを見ればわかるように、 `helpers_path` というものがあるのですが、上記のGemが入っている状態だとここに値が入る前に `helper:all` が呼びだされてしまっていました。悪さをしていたGemでいうと下記のコードが原因と思われます。読み込まれる順序を無視してControllerをrequireしてしまっている。。

https://github.com/pmq20/grape-rails-routes/blob/master/lib/grape-rails-routes.rb#L7


# 対応

下記のどちらかで対応すれば良さそう。

### 1. 該当のGemを削除する

これができるなら一番良い気がします。今回のGemは特に必要なものではなかったので削除して対応完了しました

### 2. `helper :all`を明示的に呼び出すWorkaroundを入れる

`environment.rb` の Rails.application.initialize! の直後に 

```rb
ApplicationController.helper :all
```

を入れる。ソース見た限りでは副作用は特になさそうです（もちろん起動は少し遅くなりますが）
小ネタ gitbarを使って、mac osでGitHubへのコントリビューションステータスを表示する

毎日コーディングしてますか？
ということで、どれだけ毎日コーディングしているかをMacOSのナビゲーションバーに表示できるライブラリがあったので使ってみました。

* https://github.com/Shikkic/gitbar

## 1. 設定

### 1-1. bitbarをインストールする

* https://github.com/matryer/bitbar

上記のページを参考に、brewで入れちゃいます。

```
sudo brew cask install bitbar
```

### 1-2. gitbarをcloneして、.envファイルを作成する

```
git clone https://github.com/Shikkic/gitbar/
cd gitbar
npm install

vim .env
```

```.env
GITHUB_USERNAME="GitHubでのアカウント名"
CONTRIBUTION_GOAL_TRACKING=true
CONTRIBUTION_GOAL="1000"
COMPACT_UI=true
```

### 1-3. bitbarを起動して、pluginsフォルダを設定する

起動したら、

`/path/to/gitbar/gitbar_plugin`を設定します。

その後、ナビゲーションバーに、gitbarのアイコンが表示されたら完成です。

## 2. 見た目

### 2-1. 活動がない日

![スクリーンショット 2016-03-22 11.47.18.png](https://qiita-image-store.s3.amazonaws.com/0/49547/7f4d9350-e615-ea31-1b48-9555a116791b.png)

赤い文字で、「０ですよー！」と表示されます。

### 2-2. 活動のあった日

3commitsした後に、リフレッシュすると下記のようになります。

![スクリーンショット 2016-03-22 12.08.43.png](https://qiita-image-store.s3.amazonaws.com/0/49547/81611510-d689-c18e-a7a7-9f2bcc5cf8e3.png)

どうやら、マスターブランチへのコミット数を見ているようです。ブランチへのコミット数はカウントされないようでした。

## 3. 所感

* 　access_tokenとかも使えないのかしら。ソースを見てみよう。
* 　他の人のアカウントを設定しても使えちゃいますね＾＾；　レビューとか活動状況をパッと見ることのできるボードみたいに拡張できたら面白いかも。

---

本日は以上となります。
Github Pagesを使ったhttpsページの作り方

httpsのページを作るには証明書を置いたりしないといけないので
ちょっとめんどくさかったりします
Github pagesはSSLに対応しているので、簡単に作成することが可能です

Github Pagesではユーザー用とプロジェクト(リポジトリ)用の２種類が作れます

# ユーザー用

ユーザー用のページはアカウントにつき１つ作れます

## リポジトリ作成

`(username).github.io`というリポジトリを作成します  

![kanatapple.github.io.png](https://qiita-image-store.s3.amazonaws.com/0/54850/283cad9a-dbbd-db4c-b2b1-b700cbe291b7.png)

READMEファイルは必要ないので、「Initialize this repository with a README」には
チェックはいれません


## ファイル配置

次に、masterブランチに配置したいHTMLファイルをコミットします

↓こんな感じで
[https://github.com/kanatapple/kanatapple.github.io]


## アクセスしてみる

ユーザー用のページは`(username).github.io`というURLになるのでアクセスしてみます
[https://kanatapple.github.io/]

![kanatapple.github.ioページ.png](https://qiita-image-store.s3.amazonaws.com/0/54850/d3ee77d2-ee18-e9ca-3d27-69994909a4c3.png)

ちゃんとできてますね

# プロジェクト用

プロジェクト用はリポジトリごとに作れます

## リポジトリ作成

`github-pages-sample`というリポジトリを作ってみます

![github-pages-sample.png](https://qiita-image-store.s3.amazonaws.com/0/54850/db3c2aad-e7a8-44bb-44af-c3e9b7a21544.png)

READMEファイルについては「ユーザー用」と同様

## ファイル配置

プロジェクト用では「gh-pages」というブランチにファイルを配置します

↓こんな感じで
[https://github.com/kanatapple/github-pages-sample]

masterブランチは必要ないので、作ってしまった場合は消してもOKです

**2016/08/18からmasterブランチでもできるようになったようです**
[2016年新機能! GitHubのmasterブランチをWebページとして公開する手順](http://qiita.com/tonkotsuboy_com/items/f98667b89228b98bc096)

## アクセスしてみる

プロジェクト用のページは`(username).github.io/リポジトリ名`というURLになるのでアクセスしてみます
[https://kanatapple.github.io/github-pages-sample/]

![github-pages-sampleページ.png](https://qiita-image-store.s3.amazonaws.com/0/54850/ff165b4f-b6ee-fb6a-910f-e59e21e51ed1.png)

ちゃんとできてますね

# まとめ

 - ユーザー用サイトは`(username).github.io`というリポジトリのmasterブランチにファイルを配置する。URLは`https://(username).github.io`
 - プロジェクト用サイトは`(username).github.io/リポジトリ名`というリポジトリのgh-pagesブランチにファイルを配置する。URLは`https://(username).github.io/リポジトリ名`

Service Workerなどhttpsでの接続が必要なものも、Github Pagesを使えば簡単に検証できますね
Hello World WebAssembly

# 概要

emscriptenと関連ツールでHello worldするC++コードをWebAssembly向けにビルドする。

# 環境

* MacBook Pro OS X Yosemite
* Google Chrome Canary 51.0.2685.0 canary (64-bit)

# 準備

## emsdk

emscripten、clang等々はこいつで一括して入れるのが楽。

[Emscripten SDK (emsdk)](https://kripken.github.io/emscripten-site/docs/tools_reference/emsdk.html)から入手して、`sdk-incoming-64bit`を入れる。

```sh
cd path/to/emsdk_portable
./emsdk update
./emsdk install sdk-incoming-64bit # 時間かかるよ
./emsdk activate sdk-incoming-64bit
```

## binaryen

WebAssemblyに変換する各種ツール。emscriptenが内部でこれを使っている。

```sh
git clone https://github.com/WebAssembly/binaryen
cd binaryen
cmake . && make
```

~/.emscriptenに`BINARYEN_ROOT='path/to/binaryen'`を追記。


## sexpr-wasm

binaryenの各種ツールのなかの一つに`wasm-as`という構文木(S式)をWebAssemblyのバイナリに変換するものがあるんだけど現状動かないのでそれの代替として使う。

```sh
git clone https://github.com/WebAssembly/sexpr-wasm-prototype
cd sexpr-wasm-prototype
git submodule update --init
make
```

# ビルド

こんな感じのファイルを

```cpp:hello.cpp
#include <iostream>

int main() {
  std::cout << "Hello World\n";
  return 0;
}
```

ビルド。

```sh
emcc -O2 hello.cpp -o hello.html -s BINARYEN=1

# 現状emscriptenは構文木形式でしか吐き出してくれないのでここでバイナリに変換
path/to/sexpr-wasm-prototype/out/sexpr-wasm hello.wast -o hello.wasm

# hello.wasm.mappedGlobalsというのが必要なんだけどとりあえずコピーするだけ動く
cp hello.wast.mappedGlobals hello.wasm.mappedGlobals
```

`python -m SimpleHTTPServer`とかしてみてください。

# 雑感

物がバイナリなので基本フェッチしないといけないのがめんどい。どうしても1ファイルにしたければ配列でいれる感じ。`Wasm.instantiateModuleFromAsm`というのもあるのでそれを使うということ？(ちょっと試せてない)。

今回の方法でzlibも動いたので大体のものがいけそう。stableで動けば普通にプロダクトで使えると思う。

# 参考

* https://github.com/kripken/emscripten/wiki/WebAssembly
* https://github.com/WebAssembly/binaryen
* https://github.com/WebAssembly/sexpr-wasm-prototype
* https://github.com/kazuki/mediacodec.wasm
* http://webassembly.github.io/demo/
Cakephpにマイグレーションを使う


* マイグレーションとはDBの構成変更を管理するための仕組み
* CakePHPではマイグレーションファイルを通してDBの構成変更を行なうことで、複数メンバーのDB構成を統一できる
* 実行していないマイグレーションファイルを適応するやり方と`schema.php`からスキーマを再現する2つの方法がある

# 初期準備

* マイグレーション管理テーブルの作成
	* マイグレーションを管理するための`schema_migrations`テーブルを作成

```
Console/cake Migrations.migration run all -p 
```

* 初期マイグレーションの作成
	* `app/Config/Schema/schema.php`が既に存在する場合は内容の比較を行ってしまうので、一旦削除しておく
	* `-f`をつけるのはモデルの存在しないテーブルも含めたマイグレーションファイルを作成するため

```
Console/cake Migrations.migration generate -f
```

* 以下はまだ`schema.php`がないため、現在のデーターベースを丸々dumpするかを聞いているのでyを選択する

```
Do you want generate a dump from current database? (y/n)
```

* 以下はマイグレーションファイルにつける名前を入力する。DBへ加える変更の内容(今回は初期のテーブルをマイグレーションにするため`initialMigration`)などの名前にする
* `app/Config/Migration/`配下にマイグレーションファイルが作成される
* マイグレーションファイルにはタイムスタンプが先頭に自動で付与され、このタイムスタンプがマイグレーションの実行順序を決める

```
Please enter the descriptive name of the migration to generate: 
```

* また以下のコマンドで現在のデータベースの構成情報が記述されている`schema.php`を作成する。これによって`app/Config/Schema/schema.php`が作成され、以降マイグレーションファイルを自動生成する場合はこの`schema.php`とデータベースと比較して作成されるようになる

```
Console/cake schema generate –f 
```

* マスターデータを用意しておかないと、複数ユーザー間で同じ初期データにならないので必須

# 初期準備以降

* 初期のマイグレーションファイルとスキーマが用意出来たら、後は変更があった分のマイグレーションファイルをセットしていく

* 自動生成と自分でファイルを書く方法がある
型なき世界のためのflowtype入門


http://qiita.com/mizchi/items/3bbb3f466a3b5011b509 で紹介したモダンJSスタックの上に、flowtype を導入して型をボトムアップに追加していくアプローチを紹介します。

## なぜflowtypeか、そのゴールは

流行っているライブラリのみを組み合わせて使う場合や、バックエンドとの連携において型が十分に提供される環境なら、正直、flowtypeよりtypescriptでいいと思っています。flowtypeが力を発揮する環境は、既存のJSが大量に存在する環境や、railsなどの動的な型のフレームワーク環境で、静的な定義が抽出できない環境だと思います。

よほど品質が低いライブラリを使わないかぎり、バグはほとんど自分が記述したコードによって発生します。なので、まずは「自分が書いたコードのIFを明確にし、その静的なチェックを行なう」、というのを最初の目標に設定します。


## flowの導入と設定

では、実際にflowを導入する方法とその際のアプローチについて解説します。

まずbabelを使っていることを前提に、次のようにシンタックスを追加します。

```json:.babelrc
{
  "presets": ["es2015", "react"],
  "plugins": ["babel-plugin-transform-flow-strip-types"]
}
```

(`npm install -D babel-plugin-transform-flow-strip-types babel-preset-es2015 bable-preset-react` も必要)

次に、`flow init` で設定ファイルを生成し、次のように.flowconfig を設定します。

```text:.flowconfig
[ignore]
.*/node_modules/.*

[include]

[libs]
./src/decls

[options]
```

flowtypeはignoreで設定しないかぎり`node_modules`以下を探索しにいきます。が、大量のnpmモジュールを読み込んだ環境だと間違いなく失敗します。型を想定しない環境に向かって、勝手に型を推論しにいって勝手に失敗するので、自爆しているようなものです。

flowtypeを想定した環境で動かすために動くように修正した fbjs というものがありますが、facebookが使うものに限られてるので、これも無視しましょう。(余談ですが、このfbjsの仕組みは作って自分たちだけは満足してエコシステムを作ろうとしないfacebookの姿勢は、OSSにおいて最悪だと思っています)

じゃあどうするかというと、 libs で指定したディレクトリにそのライブラリで使うライブラリの型を書きます。上の定義だと `src/decls` がそれに相当します。

## libsでその環境の型を書く

自分は、最初はできるだけ握りつぶす方針で導入しました。具体的には次のように書きます。

```js:src/decls/externs.js
declare module "xtend" {
  declare var exports: any;
}
```

flowtype の libs ではmodule を定義することで import 時に解決するオブジェクトの型定義を指定できます。react や browserify 環境の型はデフォルトで読み込まれています。
exports への declare は default の挙動を定義するので、つまりは次のようなコードが動くようになります。

```js
/* @flow */
import xtend from "xtend";
let ab = xtend({a: 1}, {b: 2});
```

(正確にはxtendはES modules ではなくcommonjsで書かれbabelによってコンパイルされますが、babelのコンパイル前だとxtendモジュールがあるように見える)

あるいは、要求に応じてより厳密な型を定義してもよいでしょう。

```js:src/decls/externs.js
declare module "xtend" {
  declare function exports<A, B>(a: A, b: B): A & B;
}
```

グローバル変数として露出する変数の型を握りつぶす場合は、次のように書きます。

```js:src/decls/globals.js
declare var $:any; // jQueryの型チェックを握りつぶす例
```

(externs.jsとglobals.jsは個人的な分類なので、libsで指定した以下ならどこに書いてもいいです)

膨大なライブラリに型をつけても時間が足りないので、必要に応じて、自分が使う箇所で型の恩恵を受けたい箇所に足していくといいのではないでしょうか。


## flowの利点

flowtypeは、外部のモジュールを極力使わない、閉じた型の環境なら typescript と同程度か、それ以上に推論器の性能がいい、と個人的に感じています。

自分は「flowは単なる型アノテーションシンタックスの拡張とその静的なチェッカに過ぎない」という点が気に入っています。基本的にランタイムに介入しません。最悪、型定義はドキュメントとしてのみ使う、といった運用も可能なわけです。

最近のTypeScript は動作環境のロックインが多くなりつつあり、またコンパイル後のJSはedgeで動くからこれでいいんだ、というMSの姿勢が若干透けて見えて、ちょっと距離を置きたい気分です。

## flow の欠点

残念ながら、flow は typescript の様に型ファイルが多くは提供されていません。とはいえ、自分は試しに導入して気づいたのですが、導入したライブラリのうち、自分が使っているモジュール/インターフェースは本当に一部だったので、必要なものを書き足すだけで自分の「段階的に少しでも型を足す環境を作る」という目的には、十分な機能を提供してくれました。

## おまけ: モダンJSスタックのサンプルリポジトリ

https://github.com/mizchi/modern-js-stack-example-with-react

- babel
- browserify/watchify
- flowtype
- eslint
- mocha/power-assert
- circle ci 上でパスする設定
- react
- enzyme

というスタックです。
gormのCallbackの使い方

呼び出し元は以下。

https://github.com/jinzhu/gorm/blob/83002c4d5f060f4819bfd2115b76a0e1429a7f32/scope.go#L411-L442

``` scope.go

////////////////////////////////////////////////////////////////////////////////
// Private Methods For *gorm.Scope
////////////////////////////////////////////////////////////////////////////////

func (scope *Scope) callMethod(methodName string, reflectValue reflect.Value) {
	if reflectValue.CanAddr() {
		reflectValue = reflectValue.Addr()
	}

	if methodValue := reflectValue.MethodByName(methodName); methodValue.IsValid() {
		switch method := methodValue.Interface().(type) {
		case func():
			method()
		case func(*Scope):
			method(scope)
		case func(*DB):
			newDB := scope.NewDB()
			method(newDB)
			scope.Err(newDB.Error)
		case func() error:
			scope.Err(method())
		case func(*Scope) error:
			scope.Err(method(scope))
		case func(*DB) error:
			newDB := scope.NewDB()
			scope.Err(method(newDB))
			scope.Err(newDB.Error)
		default:
			scope.Err(fmt.Errorf("unsupported function %v", methodName))
		}
	}
}
```

いろんな引数を取れるらしい。

だいたいこれ見ればわかると思う。
最速でfindViewByIdを入力する(Android Studio)

#Live Templates

Butter Knifeナンチャラとは違う話で、Androidにありがちな、今までググってコピペしてきたコードを、ショートカットで生成してみる。

```java

  Button sendBtn = (Button) findViewById(R.id.send);
        sendBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // ボタンがクリックされた時に呼び出されます
                Toast.makeText(getApplicationContext(), "onClick()",
                        Toast.LENGTH_SHORT).show();
            }
        });

```
**Android studio → Preferences...**

![スクリーンショット_2016-03-22_11_04_42.png](https://qiita-image-store.s3.amazonaws.com/0/99731/b1d47b68-62aa-3b77-3f7b-b010b6dda6dd.png)

**Live Templates → Android → + → Live Template**

![スクリーンショット_2016-03-22_11_07_53.png](https://qiita-image-store.s3.amazonaws.com/0/99731/cb01bc7e-26ac-bca5-259b-456932bd568f.png)

- Abbreviation: ショートカットの名前
- Description: 説明
- Template text:展開テキスト


![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/99731/4fe4c1e2-b119-80dc-8cb6-604a2c29169e.png)

**Template text:**

```java

Button $btn$ = (Button) findViewById(R.id.$h$);
$btn$.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // ボタンがクリックされた時に呼び出されます
        Toast.makeText(getApplicationContext(), "onClick()",
                Toast.LENGTH_SHORT).show();
    }
});

```

**DefineをクリックしてJavaにチェックを付ける**

![スクリーンショット_2016-03-22_11_12_17.png](https://qiita-image-store.s3.amazonaws.com/0/99731/2114f78a-cf5a-3abb-05ba-7098dceaa7c3.png)

**Apply → OK**

**buttonを入力して、tabを押すと展開される。**

```java:MainActivity.java(展開前)

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button
    }
}

```

入力 → tabで、[1] → [2]

```java:MainActivity.java(展開後)

 Button [1]  = (Button) findViewById(R.id.[2]);
        [1].setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // ボタンがクリックされた時に呼び出されます
                Toast.makeText(getApplicationContext(), "onClick()",
                        Toast.LENGTH_SHORT).show();
            }
        });
```

#まとめ
ググッてコピペしていたコードはLive Templatesへ！
Emacs Lispでズンドコキヨシ

[ズンドコキヨシ with Emacs Lisp](http://qiita.com/TakesxiSximada/items/9d0b95060884b4f8ec17)に続くEmacs Lispバージョン第2弾。遅れをとった…

```
(defun zundoko-list ()
  (let ((zun-or-doko '("ズン" "ドコ"))
        (zzzzd '("ズン" "ズン" "ズン" "ズン" "ドコ"))
        (kiyoshi "キ・ヨ・シ！")
        zundoko len-zzzzd len-zundoko kiyoship)
    (setq len-zzzzd (length zzzzd))
    (while (not kiyoship)
      (setq zundoko (append zundoko (list (nth (random 2) zun-or-doko))))
      (when (<= len-zzzzd (setq len-zundoko (length zundoko)))
        (when (equal (nthcdr (- len-zundoko len-zzzzd) zundoko) zzzzd)
          (setq zundoko (append zundoko (list kiyoshi)))
          (setq kiyoship t))))
    zundoko))

(defun zundoko-insert ()
  (interactive)
  (let (zd)
    (setq zd (zundoko-list))
    (while zd
      (insert (car zd))
      (when (setq zd (cdr zd))
        (insert " ")))
    (insert "\n")))
```
\*scratch\*バッファで実行

```
(zundoko-insert)
ズン ズン ズン ズン ズン ズン ズン ズン ドコ キ・ヨ・シ！
nil
```

## 解説というか感想

ズンドコのリストを作るのがLispっつぽい処理かなと。

「ズン ズン ズン ズン ドコ」を判定するために、nthcdr関数で取得したzundokoリストの末尾部分をzzzzdリストを比較しています。リストの先頭部分だけを取り出すことも考えたのですが、方法が分かりませんでした（リストをreverse関数で逆にしてからnthcdrで取り出すことはできますが）。

```
(when (equal (nthcdr (- len-zundoko len-zzzzd) zundoko) zzzzd)
  (setq zundoko (append zundoko (list kiyoshi)))
  (setq kiyoship t))))
```

リストの末尾を取り出す必要があるため、zundokoリストの先頭ではなく末尾に新しい「ズン」または「ドコ」を追加しています。appendはリストの結合なので、追加する要素もリストにする必要があります。

```
(setq zundoko (append zundoko (list (nth (random 2) zun-or-doko))))
```

zundoko-insertは、zundoko-listの内容をそのまま挿入する関数。リストをそのままスペース区切りで出力する関数を見つけられなかったので作りました。
Dockerコンテナのリポジトリ管理　DockerHubへログイン、イメージの取得〜更新、コミットまで。

# はじめに
今回はDockerHubでのプライベートリポジトリ管理（手動）を想定しました。
まずはDockerHubへログインした上でリポジトリからコンテナをpullで取得し、その後コンテナ自身を更新します。その後commit→pushでDockerHubにあるリポジトリを更新します。
以上が「コンテナか管理」の際に行う基本的な流れになると思います。

# 1.DockerHubへのログイン
まずはリポジトリへアクセスできるようにするため、DockerHubへログインを行います。

```bash:DockerHubへログイン
$ docker login
Username: kohei
Password:
Email: kohei@hogehoge.jp
WARNING: login credentials saved in /Users/kohei/.docker/config.json
Login Succeeded
```

# 2.コンテナのpull
ローカルリポジトリに存在するdocker imageを確認します。

```bash:現状の確認
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
```
現在はローカルリポジトリにはimageが存在しないため何もリストされていません。
確認ができたら`$ docker pull リポジトリ:タグ`でDockerHubからimageを取得します。

```bash:コンテナの取得
$ docker pull kohei/httpd:ver1.0
ver1.0: Pulling from kohei/httpd
a2c33fe967de: Pull complete
d3bf674be7aa: Pull complete
13bab7291cec: Pull complete
e87afdecef01: Pull complete
4cf71c080937: Pull complete
Digest: sha256:5b940d5b742317185db6b1d25b06e6e68060b08f8fdd53f36a6bd6d471bd7043
Status: Downloaded newer image for kohei/httpd:ver1.0
```
再度`$ docker images`を実行すると、先ほどpullしたimageが取得できているのが確認できます。

```bash:取得後の確認
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
kohei/httpd         ver1.0              4cf71c080937        2 days ago          264.3 MB
```

# 3.コンテナの更新
imageが取得できたのでコンテナを更新します。

```bash:コンテナの起動
$ docker run -it kohei/httpd:ver1.0 /bin/bash
```
コンテナを起動してパッケージのインストールやconfの修正などを行います。
修正が完了したらexitでコンテナから抜けて停止させます。


# 4.イメージの作成
修正したコンテナの`CONTAIER ID`を確認します。

```bash:コンテナの確認
$ docker ps -a
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS                      PORTS               NAMES
b10edb89cd05        kohei/httpd:ver1.0   "/bin/bash"         43 seconds ago      Exited (0) 12 seconds ago                       gloomy_khorana
```
確認したら、`$ docker commit -m "コメント" <コンテナID> <リポジトリ:タグ>`でローカルリポジトリへコミットします。

```bash:コンテナのコミット
$ docker commit -m "edited container" b10edb89cd05 kohei/httpd:ver1.0
02607c25ed22c085a8e4964c91406baa911f194265db5d4ddfd44a2f96e799ec
```
完了したら再度`$ docker images`で`IMAGE ID`を確認します。

```bash:コンテナイメージの確認
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
kohei/httpd         ver1.0              02607c25ed22        5 seconds ago       264.3 MB
```
すぐに確認すれば`CREATED`が数秒前という記載になっています。また、コミットする前に確認した`IMAGE ID`は異なるIDになっています。


# 5.コンテナのpush
ローカルリポジトリへコミットが完了したらDockerHubへpushします。

```bash:DockerHubへpush
$ docker push kohei/httpd:ver1.0
The push refers to a repository [docker.io/kohei/httpd] (len: 1)
02607c25ed22: Pushed
4cf71c080937: Image already exists
e87afdecef01: Image already exists
13bab7291cec: Image already exists
d3bf674be7aa: Image already exists
ver1.0: digest: sha256:fb10c3626b1fc732c314efc132a29f7ee37c52176547a076c72553a97eaee949 size: 9116
```

以上で完了です。


# おわりに
コンテナ中身の更新方法はいろいろあるのでとりあえずrunで起動しての修正にしてます。
ただ、この一連の流れ(login〜pull〜commit〜push)はコンテナを管理する立場の人にはルーティン作業になると思ったのでメモとしてまとめました。
loginは一度ログインしてしまえば不要ですが、複数アカウントをまたぐ可能性がある場合はポイントになると思います。
sponge for Windows をさくっと

[moreutils](http://qiita.com/cuzic/items/1837cfe6572cbd3f09c2) の sponge はいいなぁ…ということで、Windows版をさくっと Go で書いてみました。

- https://github.com/zetamatta/sponge

sponge とは、標準入力を「全て」読み取り終えてから、その内容を引数のファイルに出力する moreutils の１コマンドで、一つのパイプラインの中でファイルの差し替えを行うことができるツールです。

具体的には「`cat -n foo.txt | sponge foo.txt`」などということができます。「cat -n foo.txt > foo.txt」だと、foo.txt が壊れてしまうところです。

実装上の迷いどころは以下のとおりでした。本家のソースは読んでないんですが、そちらの仕様はどうなんでしょうね？（← 読めよ）

- 複数のファイル名を指定した場合
     - 挙げられている全てのファイルに標準入力の内容を出す
- 標準入力のスプール先
     - 出力ファイル名＋「.sponge」という一時ファイルを作って、標準入力がクローズ次第、差し替えるという方式にした。（同一ディレクトリにしたのは、同一ディスクの方がファイル差し替えコストが低いことを見込んで）
     - メモリにスプールする方式もあったが、メモリ不足になる可能性もあるのと、どうせ最後に出力するのであれば、あまりパフォーマンス上のメリットもない
オフショア先がroot前提で開発しちゃう問題

GYAOの窓際エンジニア　玉利です。

ベトナムのオフショアはいわゆる「ラボ型」というものです。日本であるのは「請負型」（完全にお任せ）や「準委任型」になります。日本では直接指示をしてはいけなくて、対向のマネージャーにお願いする形になります。

ラボ型では、派遣さんや社員と同じように直接指示ができます。ここまでがベトナムでオフショアする際の基本的な知識です。そして、この裏にはやっかいな問題があります。

# ベトナム人と日本人は「OK」のレベルが全く違う。

ホーチミンのベトナム人は、南方のおだやかで朗らかな性格です。悪く言えば大雑把です。安易で楽な方向に流れます。

私は中国のチームも3年くらい面倒を見てきました。いまどき、日本人の買い物は中国ベトナムミャンマー製造がほとんどでしょう。労働集約型の仕事は海外生産にシフトしました。品質的には悪く無いレベルに達していますが、頑張ってるのは日本人の現地のオジサンたちで品質管理は「ものすごく」大変なんです。

彼らにとってOKは、日本では絶対ダメなレベルだったりします。

![スクリーンショット_2016_03_22_9_29.png](https://qiita-image-store.s3.amazonaws.com/0/113049/f85f9e46-8fb5-949e-c817-39fd7656f2b4.png)

ベトナムでは、歩道を普通にバイクが走ります。バイクだけじゃなくてタクシーも走ります。ちなみに警察に捕まったら賄賂で解決するのがお決まりだそうです。

「玉利さん、賄賂払ったことありますか？」
「日本では賄賂は厳密に禁止されてます」

という、冗談みたいな会話が真面目に発生します。中国でも同じなので驚かずに真面目に返してしまいました。

このように、ラボ型という形は、ベトナム人だと品質管理がいまのところ出来ないので成り立つ形なのです。だから安いと考えてください

# いま絶賛進行中、rootで動かさないで対策

ここ数日、ベトナム人のメンバーにお任せで作ったシステムの非root化を進めています。彼らは好奇心と向上心が非常に強く、「そろそろ任せてよ」と言ってきた矢先にこんな体たらくです。そして、rootで作ったということは彼らに言わせれば歩道をバイクで走るのと同じで、「前に動くから良いでしょ」という考えなのです。

そりゃベトナムではそうなんですけど、日本でそれをやったらアカウント禁止と強制削除くらっても仕方ないです。

# 教育は効き目があるか？

ベトナム人エンジニアは、大学でコンピューターサイエンスを学んできているはずなのですが、大学ではプログラミングを教えるだけでUNIXシステムについては教育ができてない感じです。

本来であれば、このあたりを一括で教えていかないといけないのですが、おそらく、彼らからすると「バイクで歩道を走るのはやめましょう、アプリをrootで動かすのは止めましょう」というのは理解できないと思います。

中国人が列に並べないのは直しようがないし、ベトナム人が歩道をバイクで走るのも禁止できません。


# 解決策は、HerokuなどのPaaS

結論として、ベトナムで作るものは旧来の仕組みで動かすとかえって高コストになると考えています。なんでも出来てしまうけど腕や工夫が必要、というものは発展途上国にはマッチしないですね。安易で変な方向に流れてしまいます。

というわけで、ベトナム案件では素直にPaaSを使いましょう。

なんで今回のPJでPaaS使わなかったかといえば、業務サイドがWindowsファイル共有する巨大なストレージをオンプレミスに置いてるせいで、PaaS経由からファイルアクセスできないんですよね。ここがS3だったら話が早かったんですが。

日本人は、もう少し手抜きをする方法を覚えるべきだと思うし、ベトナム人はもうすこし手抜きをしない方法を取るべきです。
Dockerのバージョン1.10で正式に導入されたUser Namespacesを試してみる

Docker 1.10のUser Namespacesを試してみたので、手順を書いておこうと思います。

この機能を有効にすると、共有マシンでも安心して一般ユーザーにDockerを使ってもらうことができるようです。

## 設定

**Step 0.** （手近にDocker 1.10以降のマシンがある方はこのステップをスキップしてください。）僕はboot2dockerでMac OS X上のVirtualBoxでテストしているので、まずはテスト用のDocker Machineを作って、そのマシンにログインします。（例：test1）:

```
docker-machine create --driver virtualbox test1
docker-machine ssh test1
```

**Step 1.** `dockremap`というユーザーを作ります(*パスワードは任意)。

```
sudo adduser dockremap
```

**Step 2.** subuidとsubgidを準備します。

```
sudo sh -c 'echo dockremap:500000:65536 > /etc/subuid'
sudo sh -c 'echo dockremap:500000:65536 > /etc/subgid'
```

**Step 3.** `/etc/init.d/docker`を開いて`/usr/local/bin/docker daemon`の隣に`--userns-remap=default`を付け足します。下記のような感じになります。

```
sudo vi /etc/init.d/docker
 :
 :
/usr/local/bin/docker daemon --userns-remap=default -D -g "$DOCKER_DIR" -H unix:// $DOCKER_HOST $EXTRA_ARGS >> "$DOCKER_LOGFILE" 2>&1 &
 :
 :
```

**Step 4.** Dockerをリスタートします。

```
sudo /etc/init.d/docker restart
```

設定がうまく行っていれば、ホスト上の`/etc`をコンテナにマウントしてもオーナーが`nobody nogroup`になっていてファイルを編集・削除することができません。

下記の参考例では、ホストの/etcをコンテナの/root/etcにマウントして試してみます。

## 参考例

**Step 1.** コンテナを作ります。

```
docker run --rm -v /etc:/root/etc -it ubuntu
```

**Step 2.** /root/etcのオーナーがnobody nogroupになっていることを確認します。

```
root@d5802c5e670a:/# ls -la /root/etc
total 180
drwxr-xr-x 11 nobody nogroup  1100 Mar 21 23:31 .
drwx------  3 root   root     4096 Mar 21 23:50 ..
lrwxrwxrwx  1 nobody nogroup    19 Mar 21 23:07 acpi -> /usr/local/etc/acpi
-rw-r--r--  1 nobody nogroup    48 Mar 10 22:09 boot2docker
drwxr-xr-x  2 nobody nogroup    60 Mar 21 23:07 default
 :
 :
```

**Step 3.** 試しにtestというファイルを作ってみます（が作れません）。

```
root@d5802c5e670a:/# touch /root/etc/test
touch: cannot touch '/root/etc/test': Permission denied
```

**Step 4.** 試しにhostnameというファイルを削除してみます（が削除できません）。

```
root@d5802c5e670a:/# rm /root/etc/hostname
rm: cannot remove '/root/etc/hostname': Permission denied
```

こんな感じです。この機能のマイナスな点は、つまりVolumeが使えなくなるという意味でもあります。一長一短ではありますが、セキュリティの向上という点では飛躍的な進歩ですね。

## 参考になったリンク

- [Docker and --userns-remap, how to manage volume permissions to share data between host and container?](http://stackoverflow.com/questions/35291520/docker-and-userns-remap-how-to-manage-volume-permissions-to-share-data-betwee)
[Mac]Finderタイトルをフォルダのフルパスにする


MacはWindowsと違って、ディレクトリのフルパスがわからなくて困ったことがありませんか？
以下のサイトが参考になりました。

[PC設定のカルマ](http://pc-karuma.net/mac-finder-fullpath/)

>ターミナルを起動
変更はターミナルでのコマンド操作で行います。まずはターミナルを起動しましょう。
MacのFinderから
→「アプリケーション」
→「ユーティリティ」
→「ターミナル」
を起動します。
Finderタイトルをフルパスに
起動したターミナルにFinderタイトルをフルパスにするコマンドを入力します（プロンプト → $ の後ろに入力）。
```
$ defaults write com.apple.finder _FXShowPosixPathInTitle -boolean true
```
Finderを再起動し、設定を反映します。
```
$ killall Finder
```
Finderタイトルをみてみましょう。
タイトルがフルパス表示のディレクトリ名（ここでは、`/Applications/MAMP`）が表示されていますね。
with以外の手段で{:ok, x}を何とかする方法

## パイプラインでok

`with`を置き換えるのが目的ではありませんが、パイプラインの恩恵を得ながら{:ok, x}をどうにかしたいです。withの書き方はfor寄りでパイプラインの流れの中には馴染みません。[awesome-elixir](https://github.com/h4cc/awesome-elixir)から幾つか抜粋すると

#### plumber_girl

[ruby2elixir/plumber_girl](https://github.com/ruby2elixir/plumber_girl)
`>>>`や`ok`で{:ok, x}を剥けます。

### happy

[vic/happy](https://github.com/vic/happy)
`case ~ do`で包んでくれるという物。ちょっと見慣れません…

```ex
happy_path do
  {:ok, b} = a
  c(b)
else
  x -> x
end

gets rewritten to:

case(a) do
  {:ok, b} ->
    case (b) do
      {:ok, d} -> c(d)
    end
end
```

### ok_jose

<I>名前がｗ</i>
[vic/ok_jose](https://github.com/vic/ok_jose)
目的に対して直球です。

```ex
def dup(x), do: {:ok, x * 2}
def nop(x), do: {:error, x}

{:ok, 12} |> dup |> dup |> ok # => {:ok, 48}
{:ok, 24} |> nop |> dup |> ok # => {:error, 24}
```

### tap

[mgwidmann/elixir-pattern_tap](https://github.com/mgwidmann/elixir-pattern_tap)
plumber_girl の物より汎用的。

```ex
defmodule Foo do
  def get_stuff(input) do
    input
      |> Enum.map(&(to_string(&1)))
      |> Foo.HardWorker.work
      |> tap({:ok, r1} ~> r1) # tap({:ok, r1}, r1) is also a supported format
      |> Enum.map(&(Foo.IntermediateResult.handle(&1)))
      |> tap({:ok, r2} ~> r2) # tap({:ok, r2}, r2) is also a supported format
  end
end
```

## モナドは…?

(\*´・ω) (ω・｀\*)ﾈｰ
[Rails4] Shoulda-matchersを導入する方法

Shoulda-machersを使うと素晴らしく簡潔かつ直感的にテストをかけるようになるので導入してみることに。しかしインストールして試してみたはいいものの、どうにもこうにも  ```NoMethodError: undefined method `validate_numericality_of'``` などとあらゆるメソッドが無いよ、とエラーが吐かれハマったのでメモ。パーフェクトRuby on Railsのサンプルコードでハマった方は特におすすめ。

# 環境
- Rails 4.2.6
- rspec-rails 3.4.2
- shoulda-matchers 3.1.1


# 導入方法
## 1. Gemfileにrspec-railsとshoulda-matchersを追加

``` Ruby
# /Gemfile
# development・test環境双方でrspec-railsが必要
group :development, :test do
  gem "rspec-rails"
end

group :test do
  gem "shoulda-matchers"
end
```

## 2. rails_helperにてshoulda-matchersを動かす設定をする
まずはshoulda-matchersを読み込んであげる。  

``` Ruby
# /spec/rails_helper.rb  
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'spec_helper'
require 'rspec/rails'
require 'shoulda/matchers' # こいつを追加してあげる
```

さらに同ファイルで設定を追加する

``` Ruby
# /spec/rails_helper.rb  
Shoulda::Matchers.configure do |config|
  config.integrate do |with|
    # 今回はRspecを使うのでこのように設定
    with.test_framework :rspec

    # shoulda-matchersを使いたいテストライブラリを指定
    with.library :active_record
    with.library :active_model
    with.library :action_controller
    # Or, choose the following (which implies all of the above):
    with.library :rails
  end
end
```

## 3. spec/models/hoge_spec.rbでrails_helperを読み込む

``` ruby
# /spec/models/hoge.rb
require 'rails_helper'
RSpec.describe Hoge, type: :model do
  （テストコードを書く）
end
```
これで、ひとまずShoulda-matchersを動かすための設定は完了しました。テストコードを書けば動いてくれます。ってことで、以下でサンプルとして実際のモデルテストを書いてみます。

## 4. テストコードを書いてRspecを走らせる

``` ruby
# /spec/models/hoge.rb
require 'rails_helper'
RSpec.describe Hoge, type: :model do
  describe '#name' do
    it { should validate_presence_of(:name) }
    it { should validate_length_of(:name).
      is_at_least(4).
      is_at_most(16).
      with_message("4文字以上16文字以下で入力してください")
    }
  end
end
```

期待に応えるようにモデルにバリデーションを追加してあげます。

``` Ruby
# /models/hoge.rb
class Hoge < ActiveRecord::Base

  validates :name, length: { in: 4..16, message: '4文字以上16文字以下で入力してください'}, presence: true

end
```
そんでもって実行してみると

``` ruby
# ターミナル
tacuma:sample tacuma$ rspec
.

Finished in 0.14455 seconds (files took 6.22 seconds to load)
1 examples, 0 failures
```

無事、テストが走り、モデルテストが行なえるようになりました。
Elixir1.3でwithスペシャルフォームに追加されそうな機能

# Elixir1.3でwithスペシャルフォームに追加されそうな機能

@hayabusa333 さんが[Elixir MeetUp #2 in Drecom にて発表されたスライド](http://www.slideshare.net/hayabusa333/elixir-v13-59807185)の中でwithの拡張が気になったので調べました。<sub>（Slideshareのコメント欄汚してすみません…あそこ書き方が分かんないです）</sub>

## withにelse句が追加されそう

https://github.com/elixir-lang/elixir/issues/4085
`case`っぽく`else`が書けます。

```ex
iex(76)> v=1; with  1 <- v, do: v, else: (2 -> 20; 3 -> 300; _ -> "?")
1
iex(77)> v=2; with  1 <- v, do: v, else: (2 -> 20; 3 -> 300; _ -> "?")
20
iex(78)> v=3; with  1 <- v, do: v, else: (2 -> 20; 3 -> 300; _ -> "?")
300
iex(79)> v=4; with  1 <- v, do: v, else: (2 -> 20; 3 -> 300; _ -> "?")
"?"
```

## withにガードが追加されそう

https://github.com/elixir-lang/elixir/issues/4015
`for`へのガード追加に伴い、一貫性の為にという感じの機能追加です。あまり意味はなさげ。

```ex
iex(75)> v = 1; with (x when is_integer(x) <- v), do: x, else: (_ -> :error)
1
iex(76)> v = "!"; with (x when is_integer(x) <- v), do: x, else: (_ -> :error)
:error
```

---
余談ですが、現時点で唯一のElixir和書と名高い[アランビックの錬金術士](http://hayabusa333.tumblr.com/)買いました。薄い(薄くない)本購入は初体験です。
Forigate 80D HA configuration

# Public Document
- http://docs.fortinet.com/uploaded/files/2765/fortigate-ha-54.pdf

# Setup 

## How to Login
 初期のログイン設定は admin/\<Enter> (パスワードなし）

# Upgrade firmware
 FortiGateのfirmwareをアップグレードする方法は二通り

- webUIで実施
 - Dashboad -> System -> Firmware (Upgrade)
- CLI + tftp
<pre>
  # execute restore image tftp <file name> <tftp server address>
   --- Reboot
  # get system status
</pre>

# HA Design

- 動作モードは Active-Passiveとする
 - マスター機器への自動切り戻しは行わない
 - 対象ポートは WAN/LAN双方のポートとする
 - 管理ポートを設け、いつでも双方の機器にログインできるようにする

## How to HA on FortiGate
- FortigateでHAを組む場合はFGCPを使うが以下の通り動作仕様が他の機器と異なる。
 - NSRP/HSRPと異なり、FGCPは標準で実機のアドレスが割り当てられない為、注意が必要。

| Protocol   | Vendor      | 動作仕様 |
|:-----------|------------:|:------------:|
| FGCP       |  Fortinet   | 機器の実IP一つを共有する。（仮想MACを持つ）|
| NSRP       |  Juniper    | 機器の実IPに加え、仮想IP,仮想MACを持つ　   |
| HSRP       |  Cisco      | 機器の実IPに加え、仮想IP,仮想MACを持つ     |

- 悔しいが管理用のポートを割り当てる以外、解決策は無さそう。
 - FGCP on VRRP等も調べてみたが推奨されている様子がない為、妥協した。

### How to configure

#### Active Node setting
<pre>
config system ha
set group-name "HA" 
set password "passwd"
set mode a-p
set hbdev "port4" 0
set override disable
set priority 200
set monitor "port1" "port2"
set ha-mgmt-status enable
set ha-mgmt-interface "port3" 
end
</pre>

#### Passive node setting
<pre>
config system ha
set group-name "HA" 
set password "passwd"
set mode a-p
set hbdev "port4" 0
set override disable
set priority 100
set monitor "port1" "port2"
set ha-mgmt-status enable
set ha-mgmt-interface "port3" 
end
</pre>

# Tips
- Fortigate 80C
    - http://labunix.hateblo.jp/entry/20150104/1420302280
- Juniper SSG-140 HA (NSRP)
    - http://kb.juniper.net/InfoCenter/index?page=content&id=KB7840&actp=search