OmniAICreator/Qiita-1.07M huggingface dataset:
「‘XXX’ is not a valid installed package」のエラーが出た時の解決


## 背景
- 自作のRパッケージを作成し、RStudio Docker でそれをインストールしようと思い、あらかじめtar.gzに固めておいたものDocker build時にダウンロード、解凍、mvして指定のディレクトリ配下に設置した。
- そのパッケージを```library(XXX)```でロードしたら、タイトルのとおりエラーが出た。

## 原因
- stackoverflowにすでに同様の記事[is not a valid installed package in R](http://stackoverflow.com/questions/17028103/is-not-a-valid-installed-package-in-r)がありました。

## 解決策

- 原因は読んでもよくわからなかったが、コメントどおり実行したところ解決。無理やりパッケージのあるディレクトリにパッケージファイルを突っ込んだだけでは、だめってことは分かりました。

```
$ cd [パッケージがあるディレクトリ]
$ R CMD build XXX
* checking for file ‘XXX/DESCRIPTION’ ... OK
* preparing ‘XXX’:
* checking DESCRIPTION meta-information ... OK
* checking for LF line-endings in source and make files
* checking for empty or unneeded directories
* building ‘YYY.tar.gz’
$ R CMD INSTALL YYY.tar.gz
* installing to library ‘ZZZ’
* installing *source* package ‘XXX’ ...
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (XXX)
```
よく聞く呪文CNAME・Aレコード・リダイレクトについてまとめる

よくAレコード設定しておいて。これはCNAMEに追加すればいけるな・・・などエンジニア界隈の人間は呪文を唱えます。

でも、ぶっちゃけ何それ？と自分は思っていた時期がありました。そんな時にまとめたメモ。

## AレコードとCNAMEの違い
* Aレコード = グローバルIPアドレスとドメインを1:1で対応させる設定のこと
* CNAME = グローバルIPアドレスのドメイン名の別名のこと

以下のように設定することで、1つのグローバルIPで異なるドメイン名からアクセスすることが出来る。

```
furuya.jp IN A 170.12.12.123   → 170.12.12.123にfuruya.jpを対応付け
furuya.jp IN CNAME furuya.com  → furuya.jpに別名のfuruya.comを設定
furuya.jp IN CNAME furuya.vn   → furuya.jpに別名のfuruya.vnを設定
furuya.jp IN CNAME furuya.in   → furuya.jpに別名のfuruya.inを設定
```

上記のドメインを全てAレコードで対応付けしていると、IPアドレスが変わった時に全て変更する必要があるが、CNAMEにしておくと1つ目のAレコードを変更するだけですむ。

## リダイレクトについて
サーバーの移転などで今まで.jpでアクセスしていたサイトを.comへリダイレクトさせたい等の要望は多い。でも一言でリダイレクトといっても色々ある。

* 同一サーバーの場合は、サーバーの設定でリダイレクトが無難
* apacheの場合はmod_rewrite, .htaccess
* nginxの場合は以下の記述で301リダイレクトが可能
  * http://xn--vps-hz3g941m.nagoya/operation/nginx301
* 他にも色々あったけど、ど忘れしたので後で追記する

## 301リダイレクトと302リダイレクトの違い
* 301リダイレクトは旧URLは表示せず、新サイトをインデックス(永久的)。旧サイトの情報は引き継ぐ
* 302リダイレクトは新サイトをインデックスするが、URLは古いまま(一時的)
Emacs で M-x すらままならなくなった場合の対処

# :full_moon_with_face: でもできれば強制終了してくないですよね？
`M-x package-install` して
マイナーモードを on/off したり
ごちゃごちゃイジっていると
たまに抜き差しならない状況に陥ります :bomb: 


多分 advice が変な状態になって
ミニバッファで `Enter` 押せないとか。


でも、できれば `kill -9` とか、プロセスの強制終了はしたくないですよね？
`auto-save-buffers` とか使っている人は、
あんまり気にしないかもしれないですけど。

# :snowman: とりあえず無難に終了させたい!!
端末から

    $ emacsclient -e '(save-buffers-kill-emacs)'

とかやればいいかなと思います。

# :cop: やってみたけど、途中で `バッファ保存するか?` とか聞かれる
回答が全部 `yes` と分かっているなら

    $ emacsclient -e "(require 'cl)"
    $ emacsclient -e '(flet ((yes-or-no-p (x) t)
           (y-or-n-p (x) t))
      (save-buffers-kill-emacs))'

みたいな感じでいいかなと思います。

# :skull: インタプリタとかプロセスを殺したい!!
大体一緒ですがkill-buffer の引数の
バッファの名前は適当に変えて

    $ emacsclient -e '(flet ((yes-or-no-p (x) t)
           (y-or-n-p (x) t))
      (kill-buffer "*cider-repl localhost*"))'

みたいな感じでいいかなと思います。

# :moyai: ハイハイ分かったけど、端末から入力とかメンドい!!
ですよねっ
ですよねぇ
分かります


普段 `paredit` とか使っていると、
その反動はなおさらだと思います。
そんなときは

    $ emacsclient -e '(switch-to-buffer "*scratch*")'

です。


あとは `*scratch*` でなんでも出来るかなと思います。
ディレクトリ移動なら

    (dired "~/.emacs.d/")

とか書いて、`C-x C-e` とかすればいいかなと思います。


文字の入力が出来ない場合は、
`emacsclient` でがんばる :muscle: しかないですけど

# :rocket: まとめ
以上、自分の emacs 操作できなくなったら
メモが見られないので、ココに外部記憶してみました。

もっといい方法があればコメント頂けると幸いです :dancers:
TotalTerminalがおなくなりになられたのでiTerm2にPull Requestを送った話

TotalTerminalが使えなくなってしまって困った。なので、iTerm2でなんとかTotalTerminalにあった機能をつけるお話です。

## さよならTotalTerminal。おかえりiTerm2
そろそろYosemiteからEl Capitanへアップグレードしようと思ったら、TotalTerminalが利用不可であることを知った。TotalTerminalはFPSゲームでありがちな上からスルっと降りてくるコンソール(Quake-Like)をOSX標準のTerminal.appで実現するアプリケーションなのだが、El Capitanから導入されたrootlessモード(System Integrity Protection)の餌食になってしまった。しばらくの間はのんきに「TotalTerminalの作者が対応するでしょ」と思ったら[開発中止](http://totalterminal.binaryage.com/#sip)とのこと。
できればシステム標準アプリケーションを利用したいという思いからずっと利用していたけど、目的の動作が出来ないとなれば乗り換えるしか無い。

とりあえずこれが本当ならば仕事に響いてしまうので、メインマシンのEl Capitanへのアップグレードを取りやめてサブマシンのMacをEl Capitanへ。そしてTotalTerminalをためしてみると・・・やはり利用不可であった。さよならTotalTarminal。君のことは忘れない・・・！！

## ウィンドウリサイズがキーボードショートカットで出来ない
悲しみにくれていると仕事がはかどらないので代替手段を探しまわったところ、iTerm2にもQuake-Likeなコンソールを実現する方法がある。これを利用すれば今まで通りのコンソールライフを過ごすことが出来るとおもいきや、キーボードショートカットを利用したウィンドウのリサイズが出来ない。正確にはウィンドウの高さを変更することができない。
TotalTerminalでよく利用していたものだったので、こいつぁ困った...。

これがやりたいんだ。これが。
![animation.gif](https://31.media.tumblr.com/5cbf2583b129dd0c20f390b131978612/tumblr_inline_o0euytbXDz1qbqvuf_540.gif)


## ショートカットキーでウィンドウを伸ばすには

iTerm2の設定を丁寧に探しまわったけれど、どこにもウィンドウのリサイズをキーボードショートカットで行うための設定がない。AppleScriptを用いてなんとかする方法もあるが、それは正当な答えじゃない。幸いなことにiTerm2はGPLでソースコードが開示されているので、手を入れることが出来る。OSX NativeなのでObj-Cで書かれているので、このソースになんとか
[パッチを当ててウィンドウで縦サイズを変更できるようにしてみた](https://github.com/salexkidd/iTerm2/commit/47041ced8a0bf95964c1b02e9717158103a7f024)。これで [Preferences->Keys] でショートカットを設定すればウィンドウを伸ばしたり縮めたりすることが出来るようになった。

というわけで、iTerm2の本家にこの機能を取り込んでもらうべくPull Requestを投げて取り込んでもらったんだけど、ちょっと紆余曲折があったので箇条書きでメモしておく。

- 最初のPull Requestの段階では縦方向にしか伸ばす必要が無いと思っていたので、横方向に伸ばすものもつけて欲しいとのリクエストがあった
- ExpandRowとShrinkRowではアレなので IncreaseHeightと　IncreaseWidthにしてねとのリクエストがあった。減らすのはDecreaseでとのこと。
- それを思いっきりすっ飛ばして「再度チェックよろ」して「Please Fix」と言われ自分のマヌケっぷりに落胆してた

というわけで、最終的に取り込まれたのが[#250](https://github.com/gnachman/iTerm2/pull/250)。これでTotalTerminalと同様なことがiTerm2で出来るようになった！

## ダウンロード
現状、NightlyBuildに含まれています。[https://iterm2.com/nightly/latest](https://iterm2.com/nightly/latest)からダウンロード可能になっています。しばらくしたらTestReleaseを経て、Stableビルドに入ってくれると思います。

## 伸ばし方
- メニューバーの[Window]にある[Increase Row]を選択すれば伸びる（縦1文字文)
- ただし、これじゃ使い物にならないのでショートカットキーを設定しましょう
  - メニューバーの[iTerm2]より[Preferences]を選択
  - Preferences中より[Keys]のタブを選択する
  - 画面中央下辺りにある [+]のボタンをクリックすると、キーボードショートカットを登録するシートがウィンドウに表示されます
  - "Action"から"Increase Height"を選びます
  - "Keyboard Shortcut:" に好きなキーの組み合わせを入れます (私はOpt+cmd+↑にしています)
  - 同様に、Decrease Heightも設定しましょう(私はOpt+cmd+↓にしています)

![スクリーンショット 2016-01-04 21.04.43.png](https://qiita-image-store.s3.amazonaws.com/0/7161/2dce7b64-2c55-ceda-fe63-63f24c067460.png)


## 終わりに
TotalTerminalを利用していて、かつウィンドウを伸ばしたり縮めたりしていた方はぜひご利用ください。また、iTerm2のオーガナイザである[gnachman](https://twitter.com/gnachman)さん、僕の拙い英語と理解力にお付き合いいただきありがとうございました。これからもウィンドウを伸ばしたり縮めたりしていきたいと思います。
[Sublime Text2]ファイルヘッダのスニペット(C++)

ファイルヘッダのスニペット

```FileName.sublime-snippet
<snippet>
	<content><![CDATA[
/*!
	\file	   $TM_FILENAME
	\author $TM_FULLNAME
*/
]]></content>
	<tabTrigger>filename</tabTrigger>
	<scope>source.cpp</scope>
	<description>file name and author</description>
</snippet>
```

TM_DATEは使用できないのでどうしたものか、、
Macで大量のmp4ファイルをmp3に変換する



そんなシチュエーションになったので手順メモ。

## 手順
http://d.hatena.ne.jp/kazukingband/20150515/1431680486


## 拡張子をm4aに変更

### 拡張子変更のアラートをOFFに
http://macfan.jp/guide/2012/04/19/post_845.html


### OS標準機能でまとめてリネーム
http://www.danshihack.com/2014/10/20/junp/os-x-yosemite-rename.html



## iTunesで拡張子変換

### ライブラリにインポート
ファイルを全部選択して、iTunesライブラリにインポートを実行。

### 環境設定を変更
デフォルトだと出力がmp3じゃないので、環境設定で変更しておく。

### 一括で変換
http://shonanbb.net/computer-soft-itunes/

### mp3ファイルの抽出
iTunesからコピーしてDesktopとかにペーストするだけでok。
Herokuでサービスを動かすときに設定することまとめ



Freeプランが制限厳しくなっても、やっぱりHerokuが好きです。
そんなHerokuを使うときにいつも設定することまとめ。


## 定期的にpingしてsleep防止
free dynoは30分以上アクセスがないとスリープしちゃいます。
NewRelicのaddonを入れて定期的にpingしてもらうのが簡単でおすすめです。

>[【2016年版】NewRelicを使って無料でHerokuのSleepを防ぐ](http://qiita.com/tomomichi/items/07c5ad7d8f69f8e45a90)


## Timezone変更



    heroku config:add TZ=Asia/Tokyo


## DBバックアップ

>[Heroku PGBackups](https://devcenter.heroku.com/articles/heroku-postgres-backups)


    heroku pg:backups schedule DATABASE_URL --at '08:00 Asia/Tokyo'


## Sleepスケジューラー
これが今後のきも。
Freeプランとつきあっていく以上、1日6時間のSleepは必須なので。

>[Heroku 上で動く Hubot をうまく休ませる](http://qiita.com/misopeso/items/8cde2ecbb82e7bfc01b4)

    heroku addons:create process-scheduler
    heroku addons:open process-scheduler


毎日6時間分を0、残りの時間を1に設定する。

どうしてもどこか6時間選ぶとしたら、
午前1:00~午前7:00がいいと思います。

↓こんな感じ

![Process Scheduler.png](https://qiita-image-store.s3.amazonaws.com/0/11704/b929feb0-ec2e-1201-5cad-6f858ab37502.png)


## カスタムエラーページを設定する
お休み設定はできたものの、このままだとスリープしてるときにApplicationErrorを返しちゃうので、
カスタムエラーページを用意してお休み時間を表示してあげると親切です。

>[Herokuの無料dynoがsleepしてる時間を表示するカスタムエラーページを設定する](http://qiita.com/tomomichi/items/fed08545ab4b02a7beec)



おしまい。
pre-commit gem を導入してコミットへの console.log とか binding.pry の混入を防止する


# インストール

```
$ gem install pre-commit
```

# 使い方

現在の設定を確認

```
$ pre-commit list
```

console_log, debugger, pry, rspec_focus のチェックを有効化

```
$ git config pre-commit.checks "[common, ruby, rails, rubocop, yaml]"

```

手動でチェックしてみる

```
$ pre-commit run git
```

特定のファイルをチェックから除外するには、.pre_commit.ignore という名前でファイルを用意して除外するファイルのパターンを書き込む

```例えば
vendor/*
```


# 使用例

以下のように、ソースコードに console.log, binding.pry が含まれていると git commit が中断される。 

```
$ git commit
pre-commit: Stopping commit because of errors.
console.log found:
app/assets/javascripts/hoge.coffee:24:    console.log("set eventlistener")
app/assets/javascripts/hoge.coffee:26:      console.log("clicked")
binding.pry found:
app/controllers/hoge.rb:82:      binding.pry
pre-commit: You can bypass this check using `git commit -n`

```

このチェックを無視してコミットするには、 `git commit -n` すれば良いらしい。


# 参考

[rubocopやjshintなどをgit-hookにまとめて設定できるpre-commit gemが便利そう（メモ） - Qiita](http://qiita.com/ryoff/items/9ab8958b2570bde3ab4d)
iOSアプリでRealmSwiftを使って実機インストールしたらstrip-frameworks.shが見つからないとビルドエラーになった

**環境**

- OS: v10.11.2
- XCode: v7.2
- Realm: v0.97

ずっと保留にしていたSwift2.0の対応のため、久しぶりにXCodeを起動して、Realmのバージョンを上げて、コード修正して、実機インストールしてテストしようとしたら

```
.../foo.app/Frameworks/Realm.framework/strip-frameworks.sh:No such file or directory
```

strip-frameworks.shが見つからないよというエラーになった。

自分の場合、CocoaPodsではなく、Dynamic Framework(直接frameworkを公式サイトからダウンロードしてプロジェクトに追加)の方法をとっているので、公式ドキュメントの手順通り、

> アプリケーションのターゲットの“Build Phases”タブで新しく“Run Script Phase”を追加し、以下のスクリプトをそのままコピー＆ペーストしてください。 
bash "\${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/Realm.framework/strip-frameworks.sh" 
この手順はアプリケーションを申請する際のiTunes Connectの不具合を回避するために必要です。

をしています。

パスは公式ドキュメント通り間違っていないし、エミュレータでは問題ないので、原因不明だったところ、こちらの[GithubのIssue](https://github.com/realm/realm-cocoa/issues/1865)にあるように、一度、Run Scriptを削除して、もう一度Run Scriptを追加するという手順で解決しました。

XCodeのバグなのでしょうか。。。
Facebookのシェアをしたときに初回のみ画像が表示されない

ゲームの結果みたいに動的にHTML生成してシェアさせようとしたときになぜか`og:image`を設定しているのにシェア画面に画像が表示されない。しかも表示されないのは初回のみで、2回目以降は表示される。
ブログ記事とかなら初回のみ自分でシェアをテストすれば問題ないんだけど、ゲームの結果みたいに動的に生成したページをシェアしたいときはユーザーが必ず初回シェアをすることになるので、これでは困る。

…と思って調べたら同じようなことで悩んでいる人がいた。
http://stackoverflow.com/questions/27913369/facebook-open-graph-no-image-first-time （英語）
結論からいうと、`og:image:width`と`og:image:height`を指定すれば良い。


```html
<meta property="og:image" content="http://example.com/image" />
```

これを

```html
<meta property="og:image" content="http://example.com/image" />
<meta property="og:image:secure_url" content="https://example.com/image" /> 
<meta property="og:image:width" content="640" /> 
<meta property="og:image:height" content="442" />
```

こうする。
幅と高さは実際の画像サイズに合わせてください。
C/C++で使える定数について

C/C++では定数を定義するためのいくつかの異なる方法がある。

| 方法           | コンパイル時定数? | アドレス取得可能? | その他 |
|:---------------|:-:|:-:|:--|
| `const`        | △ | Y ||
| `static const` | △ | Y ||
| `constexpr`    | Y   | Y |C++11から|
| `#define`      | △ | N |単純置換<br>型無し|
| `enum`         | Y  | N |整数定数のみ<br>内部型は実装依存(※)|

(※) `enum`はC++11から内部で使用する整数型を自分で決められるようになった。

#コンパイル時定数?
コンパイル時定数でないと、テンプレートパラメータや配列宣言時の要素数指定として使えない。
`const`、`static const`、`#define`はどのように初期化・宣言するかによってコンパイル時定数かどうかが異なる。

```cpp
// f() は定数表現でないものとする
const int        a = f(); // OK コンパイル時定数ではない
static const int b = f(); // OK コンパイル時定数ではない
constexpr int    c = f(); // NG 定数表現でしか初期化できない
#define d f()             // OK コンパイル時定数ではない
enum { e = f() };          // NG 整数定数表現でしか初期化できない
```

しかし、この3つもリテラルなどの定数表現で初期化・宣言すればコンパイル時定数として扱える。

**確実に**コンパイル時定数であることが保証されるのは`constexpr`と`enum`だけである。

#アドレス取得可能?
変数はアドレスを持っているものだが、`#define`と`enum`は変数ではないから、アドレスを持たない。
S3 IP制限



S3バケットを外部公開する際に、特定のIPのみにするメモ。

## ポリシー

```
{
	"Version": "2008-10-17",
	"Id": "Policy111111",
	"Statement": [
		{
			"Sid": "Stmt111111",
			"Effect": "Allow",
			"Principal": {
				"AWS": "*"
			},
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::[バケット名]/*",
			"Condition": {
				"IpAddress": {
					"aws:SourceIp": [
						"[IPアドレス]",
						"[IPアドレス]"
					]
				}
			}
		}
	]
}
```
Project Eulerをシェル芸で解いてみる(Problem 4)

# 概要
Project Euler[^pe]は、数学的な問題解決能力を要求する、プログラミング問題集である。
Project Eulerは、一般的なオンラインプログラミングジャッジとは異なり、解答するプログラミング言語は、特に限定されていない。
フォームに入力した値だけで正誤を判別するため、適切なアルゴリズムさえ考案できれば、手計算で解答することも可能である。
そのため、Web上では様々な手法による解答が公開されている。

しかし、シェル芸[^def]による解答は、私が探した限りでは、殆ど見つからなかった。
そこで、私自身の勉強も兼ねて、Project Eulerをシェル芸で解いてみることにした。
<br>

本記事では、Project EulerのProblem 4を、シェル芸で解いた際の過程を述べる。

# 実行環境
* Arch Linux (x86\_64, 4.3.3-2-ARCH)
* bash (4.3.42)
* GNU coreutils (8.24)
* gawk (4.1.3)

# 問題文
[原文 ([https://projecteuler.net/problem=4](https://projecteuler.net/problem=4))]

> A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
> Find the largest palindrome made from the product of two 3-digit numbers.

[日本語訳 ([http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%204](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%204))]

> 左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.
> では, 3桁の数の積で表される回文数の最大値を求めよ.


正答は注釈[^ans]に記載する。

# 解法
```sh:prob_004.sh
1	#!/bin/sh
2	
3	awk 'BEGIN {for(i=100; i<=999; i++){for(j=100; j<=999; j++){print i*j}}}' \
4	| # 3桁の2つの数値から構成される積の組合せの出力
5	sort -n \
6	| # 積のソート
7	uniq \
8	| # 積のうち、重複したものを除去
9	sed -e 's/./& /g' \
10	| # 数値を1字毎にスペース区切りで出力
11	awk '$1 == $NF && $2 == $(NF-1) && $3 == $(NF-2)' \
12	| # 回文数になっている行の出力
13	tail -n 1 \
14	| # 回文数のうち、最大値を出力
15	tr -d ' '
16	  # 区切りスペースの除去
```

## 解法の解説
まず、「3桁の数の積で表される回文数」を求める前準備として、3桁の2つの数値の積を出力する。
3行目のawkコマンドによって、それらの組み合わせを出力する。
具体的には、"100*100", "100*101", "100*102", ..., "100*999", "101*100", "101*101", "101*102", ..., "999*999"の、900^2通りである。

しかし、この900^2通りには、積が重複している組み合わせが存在する。
そのため、5行目のsortと7行目のuniqを組み合わせることによって、重複を除去している。

次に、「3桁の数の積で表される回文数」を求める。
これは、3~7行目の処理によって出力された積が、回文数であるかどうかを判定すればよい。
この処理は、sedとawkを用いておこなう。
9行目のsedで数値を1字毎にスペース区切りで出力した後、11行目のawkによって先頭・末尾フィールドから順に照合していく。
今回の問題では、扱う積は6桁の固定長である。
よって、11行目のawkで照合するフィールドは、処理を簡略化するために決め打ちとした。
上記の処理によって、「3桁の数の積で表される回文数」だけを抽出することができる。

そして、「3桁の数の積で表される回文数」のうち、最大値を求める。
5行目のsortによって、回文数は昇順にソートされている。
そのため、一番最後に出力された回文数が、最大値である。
13行目のtailによって、一番最後に出力される回文数のみを抽出する。

最後に、15行目のtrによって、回文判定に用いたスペース区切りを削除し、出力を整形する。
<br>

以上が、3桁の数の積で表される回文数の最大値を求める手順である。


# 雑記
* 「こんな別解があるよ」や、「こうすればもっと効率化できるぜ」、「こう書けばエレガントですわよ」等の意見がありましたら、気軽に教えていただけますと幸いです🐺
* 現在の進捗状況 -> [https://github.com/gin135/Project_Euler/tree/master/sh](https://github.com/gin135/Project_Euler/tree/master/sh)
<br>

* 回文の判定処理自体は、シェル芸だととても楽ちん。
    - sedで1文字毎のスペース区切りに加工し、awkで各フィールドを照合していくだけ。便利。
* でも、計算量がちょっと気になる...
    - 今回の場合、入力は高々900^2行なので、数秒で終わるけれど...
    - 桁数を4に増やすだけで、実行時間は凄まじく長くなってしまう。
    - もうちょっと効率の良い・汎用的な手法を思いつけるようになりたい。
* 計算量を考慮すると、初めに候補を大量に生成するのではなく、もうちょっと別のアプローチで解くのが良いのかもしれない。
    - ただ、初めにデータを大量生成し、それを各種コマンドでフィルタ＆加工していく方法は、処理内容を把握しやすい点が良い。
    - 可能なら、この方法で進めていきたい。
* 今回は、ちゃんと解説を書いたぞ...!!
    - やっぱりソースのまんまだけれど、気にしたら負け。

- - -

[^pe]: About - Project Euler ([https://projecteuler.net](https://projecteuler.net))
[^def]: シェル芸の定義 >> シェル芸 - 上田ブログ ([https://blog.ueda.asia/?page_id=1434](https://blog.ueda.asia/?page_id=1434))
[^ans]: 906609
Swiftで人狼アプリを作ってみた(コード公開）


https://github.com/hiro0202/Jinro-JapanVersion-

少し前ですが、Swiftで人狼が遊べるアプリをサクッと作ってみました
基本的なルールはワンナイト人狼を参考に、カードは和風にアレンジして
ルールも多少変更してます。

一気に書いたので全然整理できてないコードで、拡張性は低いですが好きに変更したりして使っていただいて構いません。
一緒にアップロードしているカード等の画像は再配布禁止です。
個人的に使う場合のみ好きに使ってください。

- カード一覧
- 
![jinro.png](https://qiita-image-store.s3.amazonaws.com/0/24452/196be5ad-29ca-e267-3ea7-41fd36b24bab.png)![people.png](https://qiita-image-store.s3.amazonaws.com/0/24452/372598dd-a865-f7f1-40a4-02f51caf362a.png)![theaf.png](https://qiita-image-store.s3.amazonaws.com/0/24452/a6617ecf-7936-1b8f-d7b0-26401ef3cf98.png)![uranai.png](https://qiita-image-store.s3.amazonaws.com/0/24452/0ed6d037-8e49-4c49-74d3-bc84cf6f0b5a.png)![teruteru.png](https://qiita-image-store.s3.amazonaws.com/0/24452/df432fee-1671-6816-c012-4bb7900e925c.png)

- 猛虎(人狼)
- 町娘(村人)
- 歌舞伎者(怪盗)
- 侍(占い師)
- 獏(てるてる）

 
ワンナイト人狼のルールはこちら
http://www.excite.co.jp/News/column_g/20130912/Nanapi_00005831.html
golang で AB x CD / E - F * G * H = 2016 になる全パターン洗い出し

Happy go year.

[2016年お年玉問題（AB x CD / E - F * G * H = 2016 を満たす全パターン洗い出し問題）](http://www.huffingtonpost.jp/satoshi-kagimoto/2016_3_b_8902010.html) 

を golang で解きました。PC 使うなってなってるけど、全然気になりません。

```go
package main

import (
	"fmt"
	"strconv"

	"github.com/fighterlyt/permutation"
)

// AB x CD / E - F * G * H = 2016
func main() {
	i := []int{2, 3, 4, 5, 6, 7, 8, 9}
	p, err := permutation.NewPerm(i, nil) //generate a Permutator
	if err != nil {
		fmt.Println(err)
		return
	}
	for i, err := p.Next(); err == nil; i, err = p.Next() {
		ar := i.([]int)
		// fmt.Printf("%3d permutation: %v left %d\n", p.Index()-1, ar, p.Left())
		ab, _ := strconv.Atoi(fmt.Sprintf("%d%d", ar[0], ar[1]))
		cd, _ := strconv.Atoi(fmt.Sprintf("%d%d", ar[2], ar[3]))
		e := ar[4]
		f := ar[5]
		g := ar[6]
		h := ar[7]
		if ab*cd/e-f*g*h == 2016 {
			fmt.Printf("%v\n", ar)
		}
	}
}
```

permutation を自分で書こうと思ったんですが、見つけてしまったので、使わせてもらいました。
Selenium WebDriver(wd.js)でD&Dがしたい

## Firefoxの場合

ちょこちょこ調べてたら[wd.jsの人が書いたコード](https://gist.github.com/sebv/6725034)があったのでそのままコピペ。
しかし動かず。

以下の通りしたところ動作。

```javascript:dnd.js
const wd = require('wd');
const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
chaiAsPromised.transferPromiseness = wd.transferPromiseness;

const browser = wd.promiseChainRemote();

browser
    .init({browserName: 'firefox'})
    .get('http://svg-whiz.com/svg/DragAndDrop.svg')
    .elementById('GreenRectangle').moveTo().buttonDown()
    .elementById('Folder').moveTo().buttonUp()
    .sleep(5000)
    .fin(() => {
        return browser.quit();
    })
    .done();
```

## Chromeの場合

「よっしゃ動いた、うっしっし」と思い、ChromeDriverで同じコードを動かそうとしたところException発生。
ググってみると[Issueが出ている](https://bugs.chromium.org/p/chromedriver/issues/detail?id=1154)。しかも[解決してない模様](https://bugs.chromium.org/p/chromedriver/issues/detail?id=427)。

わいはChromeで動かしたいんや！！どなたかお助け〜。
ipython-notebookでアニメーション

[airtoxin/ipython-animated-array](https://github.com/airtoxin/ipython-animated-array)
[![https://gyazo.com/5e0f68746ce124a0891749903b6c8a3c](https://i.gyazo.com/5e0f68746ce124a0891749903b6c8a3c.gif)](https://gyazo.com/5e0f68746ce124a0891749903b6c8a3c)

こんなやつです。Jupyterも可。

`$ pip install ipython-animated-array`でインストールできます。

`AnimateArray`クラスのコンストラクタに`numpy.array`の配列を渡し`show()`すると配列の中のそれぞれのnumpy.arrayがアニメーションの1フレームとなり、いい感じにアニメーションしてくれます。
`cmap`引数は色付けで、[ここ](http://matplotlib.org/examples/color/colormaps_reference.html)にあるやつがだいたい使えます。matplotlibのバージョンの関係で最近追加されたものは対応していません…。
show()に`reflesh`引数で数字を渡すとアニメーションの更新間隔が変更できます。デフォルトは1000(ms)です。

本当はgithubの.ipynbプレビューでもアニメーションするようにしたかったのですがjsが動かないのでダメでした…。

```py

from ipython_animated_array import AnimateArray
import numpy as np


initial = np.random.randint(2, size=(10,10))
AnimateArray([initial], cmap='winter').show()

def get_next(current):
    next_state = []
    for i in range(10):
        next_row = []
        for j in range(10):
            living = current[i-1][j-1] + current[i-1][j] + current[i-1][(j+1)%10] + \
                        current[i][j-1] + current[i][j] + current[i][(j+1)%10] + \
                        current[(i+1)%10][j-1] + current[(i+1)%10][j] + current[(i+1)%10][(j+1)%10]
            next_row.append(1 if living in (3,4) else 0)
        next_state.append(next_row)
    return next_state

states = [initial]
current = initial
for i in range(1000):
    current = get_next(current)
    states.append(np.array(current))

AnimateArray(states, cmap='winter').show(reflesh=400)
```

こんな感じのコードを実行するとライフゲームっぽいのもすぐに出せます。

[![https://gyazo.com/170088a47a42390bb62460d913d3d4b3](https://i.gyazo.com/170088a47a42390bb62460d913d3d4b3.gif)](https://gyazo.com/170088a47a42390bb62460d913d3d4b3)

以上、正月の進捗でした。
Rails4にて、一覧表示などに異なるモデルのものを表示するケース

ごく簡単なことだけど。

# やりたいこと

- １つのページに対し、０〜複数のタグが用意されている。
- ページに関する表示をしたときに、紐づけられたタグの一覧を表示したい。

# 実現方針

- コントローラにて、関連する項目を一覧取得する
- ビューにて、表示する

なんと単純なことよ

# 実装

## コントローラ側

とりあえずshow（個別表示のケース）
修正箇所だけ抜粋。

```ruby:page_controller.rb
  def show
    #この１行を追記する。
    @extags = Extag.where(page_id: params[:id] ).select("label")
  end
```

## ビュー側

こんなのを追記

```ruby:show.html.erb
<p>
  <strong>tags:</strong></br>
  <% @extags.each do |tg| %>
  	<%= tg['label'] %></br>
  <% end %>
</p>
```
【Linux】指定ファイルをfindコマンドで検索する

## 指定したファイル名のファイルを検索する
Linux系のシステムを使用しているとファイル検索は、ほぼ発生する。その際に覚えておきたいコマンドを備忘録に残しておく。

# findコマンド

以下は指定ディレクトリに対して検索を実行する。

```format.cmd
find [ディレクティブ] -name [ファイルシンボル]
```
```example.cmd
$ find / -name *.pdf
./aaa.pdf
```

# wcオプション
検索でヒットしたファイル数を表示するオプション

```format.cmd
find / -name *.pdf | wc
       1       1      10
```

# lsオプション
検索でヒットしたファイルの情報を確認したい場合

```
find / -name *.pdf -ls
35743018        8 -rw-r--r--    1 root   staff   4  1  4 12:35 ./aaa.pdf
```

# 備考
・ルートなディレクトリでは上記コマンドを実行する際に、sudoオプションをつけるか、スーパユーザになっておく必要がある
・検索のコストを下げるために、 [ * ] よりも [ *.pdf ] など拡張子を指定してあげると良い
XCodeでクラス拡張categoryを作る手順(Objcetive-C)

UIImage+Addition.m, UIImage+Addition.hというカテゴリーを作りたい場合

File -> New -> File -> Source -> Objective-C Fileで新規ファイル作成
![FileTypeSelect.png](https://qiita-image-store.s3.amazonaws.com/0/2885/70e73f4e-b8dd-005e-bafc-b55e7286c6a7.png)

File: Addition
FileType: Category
Class: UIImage
に設定する
![FileOptionSelect.png](https://qiita-image-store.s3.amazonaws.com/0/2885/a9ac0730-4e21-902c-5240-e95596962c01.png)

下記のようなソースが生成される

```objc:UIImage+Addition.h
#import <UIKit/UIKit.h>

@interface UIImage (Addition)

@end
```

```objc:UIImage+Addition.m
#import "UIImage+Addition.h"

@implementation UIImage (Addition)

@end
```
crontabで特定年月日に実行させようとして失敗

# 経緯
crontabで特定の日時に一回だけ実行したいと思うことはあると思う。普通なら
```
11 7 24 12 * /usr/local/bin/hoge
```
みたいに書く訳だけれども、毎年その日が変わる場合なんかだと、フェールセーフとして、曜日を入れたくなる[^1]。
[^1]: 普通は毎年同じ日でも曜日が変化するから、少しでも間違って実行される可能性を減らすという考えですね。
今回は、月～金の休日明けに何か[^2]処理を実行させたかった。
[^2]: 何かは企業秘密。

# crontabの設定
ということで、2015/12[^3]に以下のような設定を追加。
[^3]: まぁ年の瀬で来年は楽をしようとした訳で。

```
05 04 24 12 thu /usr/local/bin/hoge
05 04 04 01 mon /usr/local/bin/hoge
05 04 12 01 tue /usr/local/bin/hoge
05 04 12 02 fri /usr/local/bin/hoge
05 04 22 03 tue /usr/local/bin/hoge
05 04 02 05 mon /usr/local/bin/hoge
05 04 06 05 fri /usr/local/bin/hoge
05 04 19 07 tue /usr/local/bin/hoge
05 04 12 08 fri /usr/local/bin/hoge
05 04 20 09 tue /usr/local/bin/hoge
05 04 23 09 fri /usr/local/bin/hoge
05 04 11 10 tue /usr/local/bin/hoge
05 04 04 11 fri /usr/local/bin/hoge
05 04 24 11 thu /usr/local/bin/hoge
05 04 26 12 mon /usr/local/bin/hoge
05 04 24 12 thu /usr/local/bin/hoge
```

こんな感じ[^4]に設定して一安心だったのだが……。
[^4]: 過去、頭にゼロを付けて桁揃えしたら8進数になってという別の失敗談はさておき。

# 12/31の青天の霹靂
大晦日に会社もお休み[^5]の中、突然のトラブル発生。
[^5]: まぁ、大晦日くらいお休みさせてください。
何故か/usr/local/bin/hogeが実行されて平日稼働を始めるサーバ。
他の人[^6]が緊急に対応してくれて、事は収拾。
[^6]: 自分で対応できなくてゴメンナサイ。

# 原因
休み明けに手動で/usr/local/bin/hogeを動かした[^7]あと、調べたらcrontabにこっそり書いてあるのを見つけて愕然。
[^7]: そりゃ訳が判らない動きされたcrontabは停止してしまうよね。

> 注 意: コマンド実行の日は 2 つのフィールドで指定できる ― 月内日および曜日である。もし両方のフィールドが制限指定 (* 以外) であると、いずれかのフィールドが現在時刻と合った時にコマンドが実行される。例え ば
‘‘30 4 1,15 * 5’’
とすると、毎月 1 日と 15 日および毎週金曜日の午前 4:30 にコマンドが実行される。

すなわち、12/31は、木曜日(THU)なので、crontab 1行目にマッチしていたと。
各フィールドはAND条件とばかり思ってた…まさかOR条件な場合があるとは…

# 教訓

**知っているコマンドでもmanは隅々読んだほうがイイ！**
***
c++ builder > delphiから移植 > #10:LFのようだ / #13: CR

Delphiのコードをc++ Builderへ移植中にちょっとひっかかった。

`#10`というのが定義されている。

http://blog.livedoor.jp/boon_net/archives/50706935.html
によると #10 は LFに対応するのだろう。

同様に #13 は CRになるようだ。

アスキーコードで 0x0d, 0x0a を#付けで指定するようだ。
データビジュアライゼーション関係資料まとめ

個人的に良いと思った資料をまとめてみました。
他にも見つかったら都度追記していきます。

#プレゼン
[デビッド・マキャンドレス 「データビジュアライゼーションの美」](https://www.ted.com/talks/david_mccandless_the_beauty_of_data_visualization?language=ja)

#レッスン・チュートリアル
[D3.js入門 (全17回) - プログラミングならドットインストール](http://dotinstall.com/lessons/basic_d3js)
[D3 入門 | スコット・マレイ | alignedleft](http://ja.d3js.info/alignedleft/tutorials/d3/)
[D3.jsの使い方とグラフを作成するサンプル | Tips Note](http://www.tam-tam.co.jp/tipsnote/javascript/post4913.html)
[D3.js入門〜Perfumeシングル売上チャート作成〜](http://tech.aainc.co.jp/archives/8586)
[【JavaScript】D3.js ～ 入門編 ～ ( ソフトウェア ) - プログラム の個人的なメモ - Yahoo!ブログ](http://blogs.yahoo.co.jp/dk521123/35423681.html)
[D3.js例文辞典](http://www.openspc2.org/reibun/D3.js/)

#インフォグラフィックスとの違い
[データビジュアリゼーションとインフォグラフィックスの違い - hongo's blog](http://hongo35.hatenablog.com/entry/2012/11/09/165643)


#その他
[でーた可視化勉強会 - SlideShare](http://www.slideshare.net/muddydixon/ss-31811179)
[データマイニングとビジュアライゼーション](http://www.slideshare.net/hongo3_5/tokyowebmining-22)
[Data is fun. - データビジュアライゼーション総合サイト](http://dataisfun.org/)
sqlite3 : Online Backup を bash から実行する

# 概要
- sqlite3 データベースファイルを、システム稼動中に安全にオンラインバックアップする
- できるだけ簡単に実施したい

# 背景
データロガーアプリの DB に sqlite3 を使用している。
高頻度でバックアップを行いたい。

- 更新頻度： 1 秒
- DB ファイルサイズ： > 数 100 MB
- バックアップの頻度： 10 分

問題 : バックアップが書き込みとバッティングする。

- `cp` すると、数回に一回ファイルが破損
- `sqlite3 ".backup"` は、 `Error: database is locked` が発生

所要時間は下記の通り。

```shell-session
time cp db.sqlite3 db-backup.sqlite3
> real	0m0.666s
> user	0m0.000s
> sys	0m0.234s
```

```shell-session
time sqlite3 db.sqlite3 ".backup db-backup.sqlite3"
> real	0m1.878s
> user	0m0.290s
> sys	0m0.970s
```

# 方法

`.timeout` を設定する

```shell-session
sqlite3 db.sqlite3 <<EOF
.timeout 1000
.backup db-backup.sqlite3
EOF
```

# 参考
- http://stackoverflow.com/questions/23164445/bash-sqlite3-backup-command
テトリスをつくってみました　説明１１　データブレイク　tetris2.js

playerBlockに、TETRIS_BLOCK{ i ] （TETRIS_BLOCKのいずれかの要素）
を渡します。不具合が出ます。（最初のパターンがすでに回転された状態で出てくる）
TETRIS_BLOCK[ i ] は、変更しないようかいたつもりだったのですが。
どこかで変更してるに違いない。だけど、やったつもりもないので探しようもない。
一般のブレイクポイントでは対応できません。そこで。

ーデータブレイク
TETRIS_BLOCK[ i ]が変化したときに、ブレイク（ブレークポイントで止まるのと同じ、あの停止状態）
してくれるものです。

firefoxのデバッガはこれを備えていません。no worry
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/watch
Object.prototype.watch()　メソッド
    
```js

function dataBreak () {
	return null;
}

TETRIS_BLOCK.watch('0', dataBreak);
TETRIS_BLOCK[0].watch('blockShape', dataBreak);
TETRIS_BLOCK[0].blockShape.watch('2', dataBreak);

```

上記のように書いて、dataBreak関数にブレイクポイントを仕掛けておきます。
ブレイク（停止）したときに、コールスタックをみればいいわけです。

	 
```js
    
function blockGenerate () {
...
	var CopyOfTETRIS_BLOCK = deepCopy ( TETRIS_BLOCK [i ] );
...
	return CopyOfTETRIS_BLOCK;	// if it isn't copy but original, occurs bug.
																//start block got wrong shape
}
```   

私は結局コピーしたものを渡すことで回避してしまいました。:)（こっちのが楽だから）
Redshiftのnode毎のデータ量の偏りを調べる

# はじめに

Redshiftのデータはnode毎に分散されており、distkeyが不適切だとnode間でデータ量が偏ることがある。
データが偏るとディスクを圧迫するだけでなくパフォーマンスにも影響する。

# nodeとslice

- データはnode毎に分散して保存されている。
- さらにnode内で複数のsliceに分かれて保存されている。

# node情報取得

以下のテーブルを使ってrowsの偏りを求める事ができる。
ディスク使用量(byte)は取ることはできない。

- stv_tbl_perm
	- slice毎のテーブルのrows数を取得できる。
- stv_slices
	- nodeとsliceのマッピング情報を取得できる。

# 調査クエリ

node毎の使用量を取得

```
select node, sum(rows)
  from stv_slices m
  join stv_tbl_perm s on s.slice = m.slice
  group by node;
```

テーブルを指定してnode毎の使用量を取得

```
select node, max(name) as name, sum(rows) as rows
  from stv_slices m
  join stv_tbl_perm s on m.slice = s.slice
  where name = '$TABLE_NAME'
  group by node;
```

テーブル毎のrows数取得

```
select name, sum(rows) as rows
  from stv_tbl_perm
  group by name;
```

# 追記

svv_table_info というテーブルもある。
http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_SVV_TABLE_INFO.html

skew_rowsカラムが、「最も多くの行を含むスライスの行数と、最も少ない行を含むスライスの行数の比率。」を表しており、大きいほど偏りが大きいことを表している。
重み付きランダム抽出:Walker's Alias Method

#なにこの記事
重み付きランダム復元抽出アルゴリズムである、Walker's Alias Methodについて

#重み付きランダム復元抽出
要素ごとに抽選される確率が異なり、(重み付き)
選んだ要素を都度母集団に戻す抽出方法(復元抽出)
のこと。
素直に実装すると
[重みをつけてランダムに何か出したい](http://qiita.com/catatsuy/items/8bad8aff8ac2a1def118)や
[重み付きランダム](http://qiita.com/divideby_zero/items/a8e749e307013ab24a0b)
のようになります。
線形探索で実装すれば、計算量は抽選1回毎にO(n)
バイナリサーチなら準備にO(n)、抽選1回毎にO(log n)

#Walker's Alias Method
準備にO(n)で、抽選1回毎になんとO(1)というアルゴリズム。
同じ大きい集団に対して何度も抽選しないといけない用途向け。
(GAとか粒子フィルタとか。)
ググればわかりやすい説明が出てきます。

![text5007-3-1-28.png](https://qiita-image-store.s3.amazonaws.com/0/72075/ed8e0a5f-a22a-a23e-7b7d-fa9040559667.png)


図の上のような重みリストでは、
乱数が3~4の時にどの要素を抽出するかを最高で2回判定する必要があります。
これを下のようなリストに並べ替えたとする(閾値リストと別名リストを生成する)と、
乱数の整数部分と小数部分を使い、一回の比較だけで抽出できるようになります。
例えば下のリストで
1.1を引いた場合、整数部が1なので閾値リストの要素1:p[1]をみて、
小数部分0.1はp[1]を超えていないので、要素1を選択します。
2.5を引いた場合、整数部が2なので閾値リストの要素1:p[2]をみて、
小数部分0.5はこれを超えるので、別名リストa[2]の中身である、要素0を選択します。


#適当な実装(C#)

```csharp
public class WalkersAliasMethod
{
    private double[] probList;
    private int[] aliasList;
    private double[] weightList;
    private Random rnd;

    public WalkersAliasMethod()
    {
        rnd = new Random();
    }

    public WalkersAliasMethod(int seed)
    {
        rnd = new Random(seed);
    }

    //準備
    public void UpdateList(double[] weightList)
    {
        probList = new double[weightList.Length];
        aliasList = new int[weightList.Length];
        this.weightList = weightList;
        int size = weightList.Length;
        double[] norWeightList = new double[size];
        weightList.CopyTo(norWeightList, 0);
        double sum = weightList.Sum();
        double[] v = new double[size];//0~要素数で正規化された確率リスト
        for (int i = 0; i < size; i++)
        {
            norWeightList[i] /= sum;
            v[i] = norWeightList[i] * size;
        }

        List<int> small = new List<int>();
        List<int> large = new List<int>();

        for (int i = 0; i < size; i++)
        {

            if (v[i] < 1)
                small.Add(i);
            else
                large.Add(i);
        }

        int g, l;
        while (small.Count > 0 && large.Count > 0)
        {
            l = small[0];
            g = large[0];
            small.RemoveAt(0);
            large.RemoveAt(0);

            probList[l] = v[l];
            aliasList[l] = g;
            v[g] += -1.0 + v[l];
            if (v[g] < 1)
                small.Add(g);
            else
                large.Add(g);
        }
        while (large.Count > 0)
        {
            g = large[0];
            large.RemoveAt(0);
            probList[g] = 1;
        }
        while (small.Count > 0)
        {
            l = small[0];
            small.RemoveAt(0);
            probList[l] = 1;
        }
    }

    //重みを元にランダムに復元抽出してインデックスを返す
    public int Resampling()
    {
        double v = rnd.NextDouble() * (double)weightList.Length;
        int k = (int)v;
        double u = 1 + k - v;
        if (u < probList[k])
        {
            return k;
        }
        return aliasList[k];
    }
}


```
Maya Pythonスクリプトの実行方法

# 概要

MayaでPythonスクリプトを実行する方法。
（結構適当です）

MayaはスクリプトをD&Dしても実行してくれない。
エディタに直接書いて実行もできるが、
相対パスとか使いたいスクリプトではそれは使えない。
そういう時の解決方法を直ぐ忘れるのでメモ。

# コード

```
import pymel.core as pm
import sys

p = r"＜スクリプトが入っているフォルダのフルパス＞"
if not p in sys.path: sys.path.append(p)

import ＜スクリプト名＞
reload(＜スクリプト名＞)

test=  ＜スクリプト名.クラス名()＞
＜スクリプト名.メソッド名()＞
```

Windowを出したければ
それ用のメソッドを作成しておばそれを呼ぶだけで現れる。
フォームで投稿後のHTML内のanchorにとばす


いままでコントローラのrenderに書いていたのですが、formタグに書く方法もあったのでメモ。

```erb
<%= form_for @post, url: posts_path(anchor: 'post-anchor') do |f| %>
 .
 .
 .
<% end %>
```
coding > default parameterが嫌いな理由 > ソースリーディングしにくい

default parametertという機能がC++にはある。

## 使い方

使い方としては以下。

`1. ヘッダファイルにdefault値を書く

```somefile.h
void someFunc(bool isTop = true, bool isLeft= false);
```

`2. ソースファイルにパラメータを省略した呼び出しを書く。

```somefile.cpp
someFunc(); // default parameter使用
someFunc(false); // default parameter使用
someFunc(false, true); // default parameter不使用
```

## 使いたくない理由

自分がdefault parameterを嫌いな理由は「ソースリーディング中に、デフォルト値がわからない」点。別途、ヘッダファイルをいちいち読まないといけない。

小さいソフトであればそれぞれのデフォルトパラメータを記憶することもできるが、余計な記憶をしないといけない。
Readable Codeなどで紹介されているように、以下のような書き方にしておくことで、余計な記憶が不要で、コードリーディングに専念できる。

```
someFunc(/* isTop=*/false, /* isLeft=*/true);
```


## 関連 pros and cons

関連して default parametersのpros and cons(賛成と反対）のリンクを貼っておく。以下では賛成理由と、上記とは別の反対理由が記載されている。

http://geekswithblogs.net/BlackRabbitCoder/archive/2010/06/17/c-optional-parameters---pros-and-pitfalls.aspx

いい点もあり、悪い点もある。

場合によってはいい使い方もあるかもしれないが、自分はあまり使いたくない。
laravelでのマイグレーション作成手順


最近laravelを触る機会があったので、そこで学んだことを
メモしていきます。

今回はマイグレーション手順です。
こちらの記事は4.系のコマンドになります。

# マイグレーションのファイル作成

`php artisan migrate:make`
コマンドでマイグレーションファイルが
app/database/migrations
に作成されます。

例えば
`php artisan migrate:make create_users_table`
の様にすると
`Created Migration: 2016_01_04_103448_create_users_table`
`Generating optimized class loader`
というメッセージが出力され
2016_01_04_103448_create_users_table
が先ほどのフォルダに作成されているかと思います。


# テーブルの作成

作成されたマイグレーションファイルを見てみると

```php:2016_01_04_103448_create_users_table.php

class CreateUsersTable extends Migration {

	/**
	 * Run the migrations.
	 *
	 * @return void
	 */
	public function up()
	{
		//
	}

	/**
	 * Reverse the migrations.
	 *
	 * @return void
	 */
	public function down()
	{
		//
	}

}
```
の様になっているかと思います。

up()にマイグレーションを実行した際の処理を
down()にup()の処理を取り消す処理を実装します。

テーブルを作成するソースはこんな感じになります。

```php:2016_01_04_103448_create_users_table.php
class CreateUsersTable extends Migration {

	/**
	 * Run the migrations.
	 *
	 * @return void
	 */
	public function up()
	{
		Schema::connection('user_data')->create('users', function($table){
            $table->increments('id');
            
            $table->string('name', 32)->default("");
            
            $table->timestamps();
        });
	}

	/**
	 * Reverse the migrations.
	 *
	 * @return void
	 */
	public function down()
	{
		Schema::connection('user_data')->drop('users');
	}

}
```
簡単に解説すると、

`Schema::connection('user_data')->create('users', function($table)`
で、user_dataデータベースにusersというテーブルを作成しています。

`$table->increments('id');`
ではidというオートインクリメントされるカラムを作成しています。

`$table->string('name', 32)->default("");`
ではnameというstring型のカラムを作成しています。
32というのはstringのサイズで
default("")部分はデフォルトではカラムに空文字を入れる様に
指定しています。

`$table->timestamps();`
は、created_atとupdated_atというtimestamp型のカラムを作成します。
updated_atは更新された時間を
created_atは作成された時間を保持します。


down()内の
`Schema::connection('user_data')->drop('users');`
ではup()で作成したusersテーブルを削除しています

# テーブルの更新

マイグレーションではテーブルの作成だけでなく更新をするときもあるかと思います。
更新方法も簡単にまとめます。
基本的には作成と同じで
`php artisan migrate:make add_column_age_to_users_table`
で作成し、up()とdown()に処理を実装していきます。

今回はサンプルとして以下の様のコードを書きました。

```php:
	public function up()
	{
        Schema::connection('user_data')->table('users', function($table){
            $table->integer('age')->after('name')->default(0);
        });
    
	}

	/**
	 * Reverse the migrations.
	 *
	 * @return void
	 */
	public function down()
	{
		Schema::connection('user_data')->table('users', function($table){
            $table->dropColumns('age');
        });
	}
```

こちらも簡単に解説すると、

` Schema::connection('user_data')->table('users', function($table)`
で更新するテーブルを指定しています。
createと違い作成はしません。

`$table->integer('age')->after('name')->default(0);`
でageというint型のカラムを追加しています。
after('name')はnameというカラムの後ろに追加するという指定になります。


down()の
`$table->dropColumns('age');`
ではup()で追加したageというカラムを削除しています。


# マイグレーションの実行とロールバック

といっても実行は簡単で、
`php artisan migrate`
で実行できます。
またロールバックも
`php artisan migrate:rollback`
でできます。とても容易ですね。

今回は以上です。
サーバーサイドの方からすると当たり前のことなのかもしれませんが、
普段クライアントサイドメインの自分にとっては
色々と新鮮で面白いです。
python3.0でthreading

#経緯
[この辺](https://www.youtube.com/watch?v=WaXK8G1hb_Q&index=34&list=PL6gx4Cwl9DGAcbMi1sH6oAMk4JHw91mC_)を参考に解説されていることをやってみようかと思い。

##実践
```lang:thread.py
import threading

class MyMessenger(threading.Thread): #inherits the thread built-in function
	def run(self): #whenever you call this func. you need "def run"
		for _ in range(10): #when you dont really wanna use the counter var. python convention. just to loop
			print(threading.currentThread().getName())

x = MyMessenger(name='Send out messages')
y = MyMessenger(name='Receive messages')
x.start() #whenever you create thread, you wanna call start function
y.start() #goes to the class and looks for a func. called "run"
```

最初の何回かは`AttributeError: 'module' object has no attribute 'Thread'`と怒られたがそれはファイルの名前を`threading.py`にしていたからだと[発見](http://stackoverflow.com/questions/8062450/python-threading-module-import-failure)。

動かしてみると

```
Send out messages
Send out messages
Send out messages
Send out messages
Send out messages
Send out messages
Send out messages
Send out messages
Send out messages
Send out messages
Receive messages
Receive messages
Receive messages
Receive messages
Receive messages
Receive messages
Receive messages
Receive messages
Receive messages
Receive messages
```

もう一度！

```
Send out messages
Send out messages
Send out messages
Receive messages
Send out messages
Receive messages
Send out messages
Receive messages
Send out messages
Receive messages
Send out messages
Receive messages
Send out messages
Receive messages
Receive messages
Send out messages
Receive messages
Send out messages
Receive messages
Receive messages
```

##Threadとは

簡単に言うとThreadを使えば、

```
x = MyMessenger(name='Send out messages')
y = MyMessenger(name='Receive messages')
```
でオブジェクトを作った後、

```
x.start() 
y.start() 
```
の2つの操作を（順番はあるものの）前者の完了を待たずに同時に行える。
上から下という順番があるからこのスクリプトを起動すると90%の確率で`Send out messages`が最初に出る、んだと思う、多分。

つまり

```
for _ in range(10):
    print(threading.currentThread().getName())
```
を`x`と`y`がほぼ同時にループをしていることになる。そのため毎回起動する度に順番が異なる。`x.start()`によって`Send out messages`という名前の`thread`を作り`for loop`に入っていく。ただ`thread`は基本的には推奨されていないmethod。
openFrameworks 0.8.4/Visual Studioで「msimg32.libが見つからないよ」と言われた時の対処

#現象

openFrameworksはv0.9.0がリリースになり、WindowsではopenFrameworks v0.9.0とVisual Studio 2015で作業することが多くなっているかと思いますが、v0.8.4のアプリケーションをビルドしなければならないケースもあります。

 Windows 8.1にVisual Studio for Windows Desktop 2012をインストールした環境に、Visual Studio Community 2015をインストールすると、openFrameworks v0.8.4のビルドでエラーが起こるようになりました。

<img width="797" alt="スクリーンショット 2016-01-04 9.41.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/107848/c8ca17b5-97d9-96cb-7590-fa78efbf0bad.png">



msimg32.libが見つからない、と言っています。VS2012でも同じように言われます。

調べた結果、MSImg32.Libは

`c:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\x86\MSImg32.Lib`

に存在しているのですが、アプリケーションプロジェクト(emptyExampleなど)のライブラリディレクトリが参照しているパスに入っていません。

<img width="1181" alt="スクリーンショット 2016-01-04 9.55.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/107848/878693b2-62ee-9cea-8f70-a5caeb0ba519.png">


システムの環境変数?

`$(WindowsSDK_LibraryPath_x86)`

を展開したパスが

`c:\Program Files (x86)\Windows Kits\8.0\Lib\winv6.3\um\x86`

になっています。私の環境では、winv6.3ディレクトリは存在してません。

#解決策

プロジェクトのライブラリディレクトリにwin8を書き足すのは面倒ですし、$(WindowsSDK_LibraryPath_x86)を副作用なく書き換える方法がわからないので
win8ディレクトリをwinv6.3ディレクトリとしてコピーすればいいのでは、と考えました。

<img width="1024" alt="スクリーンショット 2016-01-04 10.17.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/107848/b46da77c-2f85-54c2-73c2-963cc8288b30.png">

これで動くようになりました。
ショートカット作成では解決しませんでした。

なお、Visual Studio 2015でopenFrameworks v0.8.4をビルドするにはアプリケーションプロジェクト(emptyExampleなど)とopenFrameworksLibプロジェクトの両方のプロパティで、プラットフォームツールセットを

 - Visual Studio 2012 (v110)

に設定すればビルドすることはできます。

<img width="1182" alt="スクリーンショット 2016-01-04 10.02.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/107848/57560849-27e2-7b76-8a8b-d1ff075b8f05.png">

ところで何故かVS2013までは、プロジェクトのデフォルトで「複数プロセッサによるコンパイルを有効にする」がオフになっててビルドに果てしない時間がかかってましたが、VS2015ではオンになっててすこし設定が楽になりましたね。

#参考: 
selflashさん [VisualStudio2013でopenFrameworksをビルドする](http://qiita.com/selflash/items/e8e354d7730b749b0252)
DockerでScala Sprayを起動する時のメモ


タイトル通りDockerコンテナ内でSprayを起動しようとしたら外部(Mac)からアクセス出来なくて詰まっていたのを解決したのでメモ

Boot.scala の interfaceが初期ではlocalhostや127.0.0.1だがコンテナ側で受け付けるIPは0.0.0.0なのでそこを変更

初期はこうだったのを

```Boot.scala:scala
Http.Bind(service, interface = "localhost", port = 8080)
```

こうする

```Boot.scala:scala
Http.Bind(service, interface = "0.0.0.0", port = 8080)
```


変更したらコンテナ立ち上げ


```
docker run --rm -it -p 9000:8080 -v ~/various/scala_spray/:/usr/src/ --name testspray takashioshikawa/scala-2.11.7
```

-p 9000:8080でMac側のportとコンテナ内のportを合わせる

<br>

コンテナ内でアプリディレクトリに移動して

`sbt`をキメる
※コンテナ内での初回sbt起動はかなーーーーーーーーーーり待たないといけない…
アプリを立ち上げたら指定したport番号でアクセス出来る
IPは`docker-machine ip VM名`で確認

![スクリーンショット 2016-01-04 9.56.55.png](https://qiita-image-store.s3.amazonaws.com/0/36871/464ff6d3-1640-5ad4-94bb-1c6669540391.png "スクリーンショット 2016-01-04 9.56.55.png")


少し詰まったのでメモ
以上です。
elasticsearch 2.1.1 環境構築

# 環境
```
# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```

# java
```
# yum -y install java-1.8.0-openjdk.x86_64
```

# elasticsearch

## install

```
# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
```
```
# vi /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
```
```
# yum -y install elasticsearch
```

## config

```
# vi /etc/elasticsearch/elasticsearch.yml
network.host: 192.168.33.10
```
## 起動

```
# systemctl enable elasticsearch.service
# systemctl start elasticsearch.service
```

# plugin

[install手順](https://www.elastic.co/guide/en/elasticsearch/plugins/master/installation.html#installation)

## [head](https://github.com/mobz/elasticsearch-head)

```
# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head
```

## [inquisitor](https://github.com/polyfractal/elasticsearch-inquisitor)

```
# /usr/share/elasticsearch/bin/plugin install polyfractal/elasticsearch-inquisitor
```

## [kuromoji](https://github.com/elastic/elasticsearch-analysis-kuromoji)

```
# /usr/share/elasticsearch/bin/plugin install analysis-kuromoji
```

# kibana

elasticsearchのpluginから入れる方法わからなかったので別途インストール

## install

```
# wget https://download.elastic.co/kibana/kibana/kibana-4.3.1-linux-x64.tar.gz
# tar zxvf kibana-4.3.1-linux-x64.tar.gz
```

## config
```
# vi config/kibana.yml
elasticsearch.url: "http://192.168.33.10:9200"
```

## plugin

### [sense](https://github.com/elastic/sense)
```
# ./bin/kibana plugin --install elastic/sense
```

## 起動

[起動スクリプト](http://orih.io/2015/03/kibana-4-init-script-for-amazon-linux/)


```
# chkconfig --add kibana4
# /etc/init.d/kibana4 start
```
npm公開練習用に、Node.jsのChatworkモジュール（API未使用）を作ってみた

# はじめに
これは、昔APIが公開される前に作ったChatwork用モジュールを、Node.js用モジュールを作ってnpmで公開してみる練習用に作り直したものです。
あまり実用的な実装ではありませんが、APIを使ったメッセージポーリングよりもリアルタイム性を重視したい場合には、お試しください。

# 公式APIとの違いは？
このモジュールは、APIを使わずにPhantomJSを使ってスクレイピングで情報の取得/送信を行っています。なので、ほとんどWebブラウザと同じ挙動をします。

メリットとしては、

* 呼び出し回数の制限がない（APIでは5分で100回）
* メッセージ・タスクの追加に対して、ほぼリアルタイムに検知できる
* APIキーの申請がいらない（あまりメリットではないか）

です。
一方、デメリットとして、

* APIで公開されている以下の機能の利用は不可
    * メッセージリストの取得
    * メッセージ/タスクの編集/削除
    * コンタクトの追加/削除
    * ルームの作成/削除/コンタクトからの招待
    * 各ルームの完了タスクの取得
* Facebook/Twitterアカウントでの利用は不可
* 一つのメソッドで複数のHTTPリクエストを使う場合が多いので、パフォーマンスが劣る（実装がしょぼい）

などがあります。
と、書いてみるとデメリットだらけですね。。。

# 使い方
こちらをご覧ください
→　https://gitlab.com/horihiro/nodejs-chatwork#README

各メソッドの実行で得られるオブジェクトの構造は、公式APIのものと（だいたい）揃えてあるので、そちらをご覧ください。
→　http://developer.chatwork.com/ja/endpoints.html

一例ですが、getContactsメソッドのoncompleteコールバックの引数には以下のオブジェクトが入ります。

```
[
  {
    "account_id": 123,
    "room_id": 322,
    "name": "John Smith",
    "chatwork_id": "tarochatworkid",
    "organization_id": 101,
    "organization_name": "Hello Company",
    "department": "Marketing",
    "avatar_image_url": "https://example.com/abc.png"
  }
]
```
これは、[公式APIの/contactsをGETした時に得られるオブジェクト](http://developer.chatwork.com/ja/endpoint_contacts.html
)と同じものです。

その他のメソッドも同様にAPIから得られるものと同じ構造のオブジェクトを返します。適当にメソッドを実行して、オブジェクトをダンプしてみてください。

# npmでの公開
[ここ](http://qiita.com/fnobi/items/f6b1574fb9f4518ed520)に書いてあったものをやったら全く問題なくできました。簡単ですね。

こうなりました。
→　https://www.npmjs.com/package/nodejs-chatwork
pegjs用にバックトレース出力を作ってみた

最近、トレースログを吐けるようになった [pegjs](http://pegjs.org) ですが、標準のトレースログ程度では、大規模な文法のデバッグを行うのはかなり辛いです。

ということで、構文解析の失敗時に、ツリー形式で比較的分かりやすくエラー原因を表示するモジュール [pegjs-backtrace](https://github.com/okaxaki/pegjs-backtrace) を作ってみました。

次のように、最も深い位置で発生したエラーから最初の構文規則までの解析経緯を、コンソールにビジュアルなツリーとして表示します。

<img width="320" src="https://github.com/okaxaki/pegjs-backtrace/raw/master/img/backtrace.png">

複雑なソースコードを相手にした場合も、こんな感じで表示できます。

<img width="427" alt="スクリーンショット 2016-01-04 8.30.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/43781/3698bf74-3711-1293-5b42-4208eb51cc89.png">

あまり高度なものではありませんが、とりあえず標準のエラーメッセージとログよりは、デバッグが容易になるかと思います。
ESP8266 > Link > ATコマンドにSSLクライアント機能を追加する

ESP8266へHTTPS接続できるのだろうか、とふと思って調べたところ出てきたリンク。
http://dsas.blog.klab.org/archives/52223926.html

ファーム書込み、メモリマップ、SDK v1.2, v1.3などいろいろ詳しい。
El Capitanで外付けHDDを開こうとすると「アクセス権がない」と言われた場合の対処


# rootlessを解除から
El Capitanになって、「rootless」というシステム領域を保護する状態が基本になりました。そのおかげでTotal Finderなどのアプリは使えなくっています。

# まずはリカバリモード（⌘+Rを押しながらOSを起動）

リカバリモードでターミナルを開いて下記を実行すると、rootlessが解除されるので、その後は再起動。これで色々とできるようなります。

```sh
csrutil disable
```

# ディスクユーティリティからFirst Aidを実行
外付けHDDに対してFirst Aidを実行することでアクセス権周りの修復が実行されます。

# 外付けHDDの所有権を無視

外付けHDDに対して⌘+Iでインスペクタを表示させます。ウインドウ下部に「このボリューム上の所有権を無視」というオプションがあるのでチェックを入れます。

そうすると「共有とアクセス権」セクションでeveryoneを変更できるようになります。「読み／書き」に変更することでアクセスできるようになります。

# chmod +w などしても無駄だった
上記手順を実施する前、/Volumesからchmodなどで権限をいじってもどうになりませんでした。
技術英語 > but animals [have been largely overlooked] because it’s been assumed that ... / overhear / by chance

@ LOE > September 14, 2012

http://loe.org/shows/shows.html?programID=12-P13-00037
>  but animals <font color=red>have been largely overlooked</font> because it’s been assumed that ...

http://ejje.weblio.jp/content/overlook

<hr>
関連して思い出したのは

http://ejje.weblio.jp/content/overhear

<hr>
関連して思い出したのは

http://ejje.weblio.jp/content/by+chance
> 偶然に
etcd概要

※書きかけなので、随時更新。

# etcd(etc distributed)とは
etcdはGo言語で記述された設定情報の共有とサービス検出のための分散KVS。
あるサーバーで設定した値を入れたら、他のサーバーでも値が更新されていた。
etcd(etc distributed)という名前は、/etcに置かれたファイルを分散するという意味から来ていると思われる。
CoreOS(Linuxディストリビューションの一種)の中で提供されている機能の一つでもある。

# 特徴
+ curl(HTTP、FTP、SCPなど多数のファイル転送プロトコルを使えるツール)でデータの出し入れができる
+ SSL認証可
+ 高速な書き込み速度(ベンチマークは 1000/s 程度)
+ Raft(コンセンサスアルゴリズム)を使用して分散

# コマンド

```shell-session

● クラスタの状態
etcdctl cluster-health

● リーダーの確認
curl http://localhost:2379/v2/stats/leader

● メンバの確認
etcdctl member list
curl http://localhost:2379/v2/members

● メンバの削除
etcdctl member remove id
curl http://localhost:2379/v2/members/id -XDELETE

メンバの追加
curl http://localhost:2379/v2/members -XPOST -H "Content-Type: application/json" -d '{"node":"value"}'
```

# 参考
+ [Raftとはなにか](http://blog.obfuscatism.net/blog/2014/12/01/raft/)
+ [CentOSで始めるetcd](http://blog.cloudpack.jp/2014/11/26/getting-start-etcd-with-centos/)
+ [CoreOS入門](http://qiita.com/mopemope/items/fa9424b094aae3eac580)
+ [CoreOSインストール](https://coreos.com/)
+ [etcd のクラスタ構成構築の手順とその基本動作の確認](http://jedipunkz.github.io/blog/2013/12/09/coreos-etcd-cluster/)
+ [etcd総選挙](http://qiita.com/ksato9700/items/9b44a95ce27ac23a94e1)
+ [etcdクラスタの状態確認](http://yebisupress.dac.co.jp/2015/10/08/googlecloudplatform_coreos_contener/)
+ [etcdコマンド](http://yebisupress.dac.co.jp/2015/10/08/googlecloudplatform_coreos_contener/)
+ [etcdバグ?](https://yakst.com/en/posts/2534)
iOS アプリで通信状態を取得するなら、Reachability より FBNetworkReachability の方がいいんじゃない？

##結論
表題のとおり

ありがたい配布元↓
>[iOS] ネットワーク接続状況取得ライブラリを公開
http://cocoadays.blogspot.jp/2011/05/ios_25.html

##理由
Reachability や StackOverflow で見つけた**インターネットの通信状態の取得**をしてくれる処理は、
**通信状態の変化がワンテンポ遅れる**ため、申し訳ないけどちょっと使えないって思ってた

例をあげると、自分の過去の記事で[課金について](http://qiita.com/90_jill/items/7c9fa51c26a0f252b7d2)取り上げたことがあるのだけど、そこで
>課金中に機内モードにして通信切断すると、直後に課金失敗の反応が返ってくるのに、その時 Reachability で通信状態を確認するとしばらくの間は通信が繋がっているという状態しか返ってこない。
すぐ状態を取得したいのに。どうしよう。

という問題が発生して結構困ったことがあった
（結局 `NSURLConnection` で自鯖を叩いて通信状態を確認する、というなんか危うい方法を取っていた）

ところがどっこい、`FBNetworkReachability` を使用すると現在の通信状態が即座に反映されてるんですね
(＾ω＾)使えるわ〜
NSURLConnection とか いらんかった！

***

以上の理由をもって FBNetworkReachability を使った方がよくね？
と思いましたとさ

ただ検索かけても「FBNetworkReachability は Rechability を使いやすくラップしたもの」
という情報くらいしかなくて
(´･ω･\`).｡oO（あれ？ 問題発生してるの俺だけ？）
って思ったけどまあいいか
使いやすくなってるっていうしな！　うん！
紹介するページが増えることに意義があるんじゃないかなー！(´･ω･\`)


##おまけ

配布元ページに `refresh` の表記がなかったけど、
今のところ `refresh` 呼ばないと最新の状態が反映されない

```objc:ConnectUtils.m
+ (BOOL)reachable
{
    FBNetworkReachability *r = [FBNetworkReachability sharedInstance];
    [r refresh];
    return FBNetworkReachableNon != r.connectionMode;
    // return r.reachable;  // ↑と同じ
}
```

Swift で使うなら Bridging Header つかいましょね

```swift:ConnctUtils.swift
public class final func reachable() -> Bool
{
    let r: FBNetworkReachability = FBNetworkReachability.sharedInstance()
    r.refresh()
    return FBNetworkReachabilityConnectionMode.ReachableNon != r.connectionMode
    // return r.reachable;  // ↑と同じ
}
```