OmniAICreator/Qiita-1.07M huggingface dataset:
naming > Get_XXX()の代わりのlightweightでない関数名は何だろうか?

Readable CodeなどでGet_XXX()という関数名はすぐに値を返すlightweightな関数を表すものとする、のようなものがあった。

lightweightでない処理の場合(例：問い合わせをして、あるタイムアウト時間内で応答を待ち、その結果を返すような)関数名の動詞を何にするのがいいのだろうか?

List_XXX() : Listが動詞/名詞識別問題を持つ
Obtain_XXX() : getと変わらない気がする
Investigate_XXX() : lightweightでなさそうだけど、関数名が長い
Search_XXX() : lightweightでなさそう。
Find_XXX() : lightweightでなさそう。
Collect_XXX() : lightweightでなさそう。
各種ストレージサービス価格メモ書き

2TB分の大量のファイルを置きたいという時の話。

ドル円は、1米ドル＝114.863313円(2017/03/13 だいたい11時ぐらい)として計算しているけど、AWSやDropboxといった日本円表示しているところは、それを使用。

メモ書きなので、増えてく可能性有り。

## Dropbox

https://www.dropbox.com/upgrade

1TB が上限なので、有料アカウント2つぐらい必要。もしくはチーム。

個人アカウント時: ￥12,000/年間 * 2 = ￥24,000/年間
チームアカウント一人の時: ￥15,000/年

個人アカウントの時はアカウントの使い分けをするので、そこは難しいかも。1TB以上のファイルを保存する場合は、チームのほうが安い。

## Amazon S3/Glacier

http://aws.amazon.com/jp/s3/pricing/

何か値段変わってるっぽい。[AWS Simple Monthly Calculator](http://calculator.s3.amazonaws.com/index.html?lng=ja_JP#)で計算しています。

### Amazon S3

1. リージョンは、東京、オレゴンの２つ。
2. 2TBのデータを置く。転送量とかは計算していない。

#### 東京リージョン

| プラン | 換算 |
|:----------|-----------------:|
| スタンダード | 51.20$ = 5881.00161円(月) |
| IAストレージ | 38.92$ = 4470.48013(月) |
| Glacier ストレージ | 53.56$ = 6152.07903円(月) |


#### オレゴンリージョン

| プラン | 換算 |
|:----------|-----------------:|
| スタンダード | 46.99$ = 5397.42706円(月) |
| IAストレージ | 25.60$ = 2940.5008(月) |
| Glacier ストレージ | 48.75$ = 5599.58649円(月) |

## Microsoft Azure Storage

いくつか種類がある。

2017/10/18 13時の計算でメモ。

料金計算は https://azure.microsoft.com/ja-jp/pricing/calculator/ で円換算をした。

リージョンは東日本で計算。

ファイル、BLOBだけを計算。ディスクは計算するのに心折れた。他のキュー、テーブルは用途が別なのでパス。

### Blob Storage

https://azure.microsoft.com/ja-jp/pricing/details/storage/blobs/

冗長性は LRS で計算。

| アクセス層 | 換算 |
| :- | :- |
| ホット | 4,288円/月 => 51,456円/年 |
| クール | 3,485円/月 => 41,820円/年 |

### File Storage

https://azure.microsoft.com/ja-jp/services/storage/files/

レベルはスタンダード。冗長性は LRS で計算。

| アクセス層 | 換算 |
| :- | :- |
| ホット | 12,248円/月 => 51,456円/年 |
| クール | 3,485円/月 => 41,820円/年 |


### Disk Storage

https://azure.microsoft.com/ja-jp/services/storage/unmanaged-disks/

よくわからん。パス…

## Box.com

https://www.box.com/ja_JP/pricing/

2TBを置きたいという事なので、ユーザは一人だけどBuisinessプラン。ただし、一つのファイルサイズが5GBまで。

1800 * 5 = 9000円/月


## Sakura Cloud　- Object Storage

サクラクラウドのサーバに置くのは現実的じゃないので削除。

http://cloud.sakura.ad.jp/specification.php#section-object

計算は、20000GiB になり、1TiB超えた100GiB毎に486円。

1000GiB超過～10000GiB = 5,400円 + (1000/100 * 486) = 10260円/月


## Gooleストレージ

1TBの次が10TBなので、10TBプランを選ぶ感じ。もしくは、Googleアカウントを２つ。

https://www.google.com/intl/ja_ALL/drive/pricing/

10TB: 13000円/月 = 156000円/年
2TB: 2600円/月 = 32000円/年

## AsusWebStorage

https://store.asuswebstorage.com/personal/?vc=W110

1TBのプランが2TBプランになっているっぽい。

11000円/年


## Microsoft OneDrive

https://onedrive.live.com/about/ja-jp/plans/

1TB しかないので、2アカウント。


1TB: 12,744/1年 * 2 = 25,488円/年
OSXにVisual Studio Codeをインストール


## 前提

- [Homebrew Cask](http://caskroom.io)

## インストール

```
brew　update
brew cask install visual-studio-code
```

## 起動

![Screen Shot 2015-04-30 at 13.46.41.png](https://qiita-image-store.s3.amazonaws.com/0/15414/37bade5f-0ae6-b4f0-9e2e-f87fdaaef3b6.png "Screen Shot 2015-04-30 at 13.46.41.png")


![Screen Shot 2015-04-30 at 13.45.55.png](https://qiita-image-store.s3.amazonaws.com/0/15414/08dd8db1-3efb-5ebf-35e9-16220c58cc04.png "Screen Shot 2015-04-30 at 13.45.55.png")
Apple WatchKit もくもく勉強会 #5 に参加してきました

# はじめに
* AppleWatchの発売日である4月24日(金)に開催されたAppleWatch勉強会に参加してきました
    * イベント
        * https://coedo-dev.doorkeeper.jp/events/23200
    * 関連サイト（公開グループ AppleWatch WatchKit Developers Japan）
        * https://www.facebook.com/groups/944846408876597/

# やったこと
* AppleWatchでチェックイン
    * 今回のイベントをPassbookに登録していたら、そのままAppleWatch側で開けるようになっていました
        * https://www.facebook.com/groups/944846408876597/permalink/1043891102305460/
        * 飛行機の搭乗とか便利になりそうです
* 操作方法学習（と言う名の触りまくりｗ）
    * 当日、私を含めて3名の方がAppleWatchを持ってくることが出来たので、そちらの操作方法学習などがメインになりましたｗ
    * 実施したこと
        * AppleWatchのペアリング
            * AppleWatch本体上に表示される粒子球体？のようなものをiPhoneで読み込んでID識別しているようでした。近未来的！
        * ホームメニュー、グランス表示の確認
            * シミュレーターではどうしても出せなかった部分なので実際に見れて納得できました
                * グランスアイコンとタイトルの位置関係など
        * 通話
            * 通話ボタンを使って目の前の方同士で通話しました
                * スピーカーとマイクがAppleWatchに内蔵されているのでスピーカーモード通話が出来ます
                * 「よく使う相手」がAppleWatch上で簡単に選べるような工夫がされています
        * デジタルクラウン操作
            * ボタン押し込みでホーム画面表示やBack
            * ホイール回転で画面上の上下スクロールや拡大縮小（マップなど）ができます
        * デジタルタッチの実演
            * https://www.facebook.com/maruo2/videos/965324806834106/
                * （テンション上がってるのが私ですｗ）
            * 普通のチャットのAppleWatch版なのですが、同時に開いていればリアルタイムでタッチ操作が送れるのが確認できました。
            * AppleWatchがその場に2台ないと出来ない確認だったのでみんなで集まれてよかった！
* AppleStore上のAppleWatch対応アプリのインストール
    * 参加者の方が前日に作成したAppleWatchアプリ（波音アプリ）があったのでそちらをインストールしてみした。
        * https://itunes.apple.com/jp/app/id969903863
    * 実機検証できずにリリースしたアプリを当日確認できて満足してました。
* xcode上からのAppleWatch対応アプリのインストール（デバッグ）
    * 当日、今まで作成したサンプルコードがうまく入りませんでした（証明書関連でエラーが出ました）
        * ゼロから新規作成したアプリは何とか回避できたが、既存コードは無理
            * -> **xcode のバージョンを6.3から6.3.1(4/22update)に上げたところ入るようになりました。**

# まとめ
* iPhone本体を出さない使い方で時間確認以外にもまだまだ使い方があるのがわかってきました（passbookなど）。
* こちらの勉強会に継続して参加することで、いろいろな刺激をお互いに与えながらよいAppleWatchアプリが作れればよいと思います。
* **出たてデバイス時のxcodeバージョンチェック重要！**
c++ builder XE4 > TThread > スレッドエラー: ハンドルが無効です。(6)

[http://worktoolsmith.com/さん](http://worktoolsmith.com/2011/11/delphi-%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%E3%81%8C%E7%84%A1%E5%8A%B9%E3%81%A7%E3%81%99%E3%80%826%E3%80%80%E3%81%AE%E5%AF%BE%E5%87%A6/)

>DelphiでTThreadを使っていると、「スレッドエラー:ハンドルが無効です。(6)」というエラーが生成されることがあります。

>FreeOnTerminateが設定されているとなぜか起こる場合がよくあるので、もしFreeOnTerminate = Trueで使っている場合は、Falseに切り替え、外部からThreadにFreeをかけるようにすると直るときがあります。

C++ Builder XE4でも出た。
FreeOnTerminateはtrueで使わない方がいいのだろうか?

自分が見た感じでは、std::unique_ptr<>を使った時にこのエラーがでる。
std::unique_ptr<>を使うのをやめにして、new, deleteをいちいち行うと出なくなる感じ。

FreeOnTerminateとstd::unique_ptr<>どちらを使うのをやめるのがシンプルだろうか?
AWSに秘密鍵をSCPで送って使う方法

AWSで複数のサーバーを立ち上げて秘密鍵が複数箇所で必要になって困ったのでメモ

* ローカルの秘密鍵をAWSへSCPで送る

```nginx
scp -i ~/xxx.pem ~/.ssh/id_rsa ec2-user@xxx:/home/ec2-user
```

* パーミッションを念のため再度適切に変更

```nginx
sudo chmod 400 ~/id_rsa
```

* 個人用に使っていたパスワードを他の人も使えるように共通のパスワードに変更

```nginx
ssh-keygen -p
```

以上。
initスクリプトのシステム終了時の挙動について


## はじめに
ちょっとしたスクリプトを起動時・終了時に実行したいためにinitスクリプトを作成して仕込むということがありました。
今回は、AWS上で踏み台サーバを起動した時に、別のEC2インスタンスを起動し、踏み台サーバの停止時に起動時に開始したEC2インスタンスを停止するというスクリプトを踏み台サーバに仕込みました。

方法としては、一般的な方法をとっています。

* chkconfigで起動設定を行う

	```bash:init-script
	#!/bin/bash
	# 
	# chkconfig: 2345 99 10
	# description: init/shutdown script
	#
	:
	:
	```
	スクリプトの冒頭でこのような記述をしておく。 
* initスクリプトを作成
	
	```bash:init-script
	lock_file=/var/lock/subsys/$(basename $0)
	
	function start() {
  	  ...
  	  touch ${lock_file}
  	  ...
	}

	function stop() {
  	  ...
  	  rm -f ${lock_file}
  	  ...
	}
	
	case key in $1
	  "start")
	    # 起動処理
	    start
	    ;;
	  "stop")
	    # 停止処理
	    stop
	    ;;
	esac
	exit 0
	```
	みたいなスクリプトを作成します。サンプルです。
* chkconfig用の定義を記述
	
	```bash
	$ sudo chkconfig --add init-script
	$ sudo chkconfig init-script on
	```
	起動設定を行います。これで、対象のランレベルにリンクが作成されます。
	
##これで :+1: 
と思って、起動・停止を行ってみると期待したとおりには動いてくれませんでした。

* <b>期待した動き</b>
	* 起動時
		* init処理の最後に他のEC2インスタンスの起動
	* 停止時
		* init処理の最初に他のEC2インスタンスの停止

* <b>実際の動き</b>
	* 起動時
		* EC2起動
	* 停止時
		* EC2そのまま起動 orz

おかしいなぁと思いつつ、原因を探りました。
経験豊富な皆さんならすぐにお気づきになられるかと思いますが、意外と手こずりました。
ログを確認すると終了時に停止処理が呼ばれていないことに気づきました。

ここでしばらく脳内は？？？だったのですが、他のスクリプトを参照したりしてinitスクリプトにたどり着いたところ疑問が解消されました。

## だめじゃん :cry: 
これが、結局原因でした。。。

```bash:init-script
lock_file=/var/lock/subsys/$(basename $0)
function start() {
  ...
  touch ${lock_file}
  ...
}

function stop() {
  ...
  rm -f ${lock_file}
  ...
}
```
的な感じで、処理を入れていました。
まずかったのは、lock_fileに$(basename $0)などとしてしまったことでした。

chkconfig --add init-scriptなどとして自動起動の設定を行うと、指定したrun levelの下にリンクが作成されます。
リンク名がスクリプトの実行名となるため、起動時と終了時のスクリプト名が異なる自体となり、終了時に意図した通りに実行されないということが起こりました。

更にinitスクリプトをチェックしたところロックファイルが存在しない場合は、該当のスクリプトがスキップされてしまう動きになっていました。


##まとめ

* ロックファイルは固定文字列がよい(スクリプト名でいいんじゃないか)
* ログは出しましょう

ということでした。
デザイン作業のガイドライン

クライアントサイドのエンジニアはデザイナーからデザインファイルを受け取って実際に組み込み作業をするが、受け取ったデザインファイルの作業方法がデザイナー毎に異なっていたり、組み込みが難しいデザインになっていたりするので、デザインファイルをチェックするための作業ガイドラインが必要だと思ったのでメモとして残す。([Sketch.app](http://bohemiancoding.com/sketch/) 前提)

## デザインファイルを一つにする

`Photoshop` や `Illustrator‎` はファイルサイズが大きい傾向があり、画面ごとにファイルを分ける必要がある。
`Sketch.app` は比較的小さいサイズになるので、基本一つのファイルで作業する。
それでも、ファイルサイズが大きくなってきたら、`PC` と `モバイル`、`iOS` と `Android` 等の大きな単位から分割していく。

##### 参考:

現在僕のいるプロジェクトでは以下のように分割しています。

* android.sketch
* ios.sketch
* pc.sketch
* sp.sketch

## Page、Artboard、Shape、Text 等に命名する

`Sketch.app` で Page や Artboard 等を作成すると `Page 1` や `Artboard 1` 等のように連番で自動的に名前が付けられる。
これだと組み込み作業をするときに名前から推測して探すことが難しいので全てのものに名前をつける。
Artboard 内には様々な Shape や Text などが作成されるので、コンポーネント毎に命名したり、ツリー構造にしたり、必要であればシンボル化したりして、対象のものを探しやすくする。

##### 参考:

各 Page には複数の Artboard が作られるので、Page はグループ化されたページ郡の名前をつける(ログイン済みのユーザーに表示するページ、決済フロー関連のページ等)。また、Artboard にはページ名やURLのパス等を割り当てる。

## x、y、width、height、font-size 等の値は整数にする

対象物をドラッグで移動させたり、サイズ変更するとサイズや位置が小数点が含まれてしまい、組み込みするまえに確認作業が発生する。
整数になっているかチェックするのを習慣にしたり、最終的なサイズ調整や位置調整は直接値を入力すると整数になる。

## スペースも含めたデザインにする

アイコンのみのボタンをデザイン上で表現するときにアイコンだけ作成すると、アイコン周辺のスペースがわからないので、アイコンの後ろに透明の `Shape` を作成してタップエリアもわかるようにする。

##### 良い例:

![button_good_pattern.png](https://qiita-image-store.s3.amazonaws.com/0/1876/0f1bb082-cf61-8928-bacd-2e1afe2042c7.png)

##### 良くない例:

![button_bad_pattern.png](https://qiita-image-store.s3.amazonaws.com/0/1876/6f9591b0-e16e-c272-fb45-cdc7028e46b7.png)

## 版管理する (可能ならば)

Git管理して必要なくなった Shape や Text 等は削除する。バイナリファイルは差分見れないのでコミットメッセージは丁寧に記述する。(作業内容を全部記述しないと後で探すことが不可能)

##### コミットメッセージの書き方

デザイナーの方に説明用に渡したキャプチャーです。
デザインファイルは差分を見るのが難しいので、コミットメッセージを丁寧に記載してもらっています。

![git_commit_message.png](https://qiita-image-store.s3.amazonaws.com/0/1876/767a27e5-7477-d3c7-851c-953f141578ea.png)

## README.md を作成して作業内容を記述する

`Sketch Plugin` を使ったり、命名規則等、違うデザイナーに引き継ぐ際に必要な情報は README.md を作成して記述する。
unity x Dive(HMD) のiPhone版ビルド時の注意点

# はじめに
* unity x Dive(HMD) でiPhone版ビルドを実行するとエラーになってしまうケースの回避方法
    * ビルドが途中で引っかかってビルド先が空っぽのままになる

# 回避方法
* OpenDiveSensor.cs(L45-46) にある２つの変数をコメントアウトする (そのうち修正版が出ると思うけど)
    * AndroidjavaObject mConfig;
    * AndroidjavaObject mWindowManager;

# まとめ
* エラーを落ち着いてみればわかるのですが、ベンダー提供のパッケージコードなので抵抗があると思います。（私もそうでしたｗ）。意外と別ケース（今回は、Android用ビルドを意識してるがiPhone用にビルド）に対応していないこともあるんだな～と思いました。
FireFoxでFirebugを起動するとJavaScriptが停止するバグ

タイトルどおりなのだが、Firebugを起動すると、JSの実行が止まる。

うんともすんとも言わなくなり、ただただ停止するだけ。

検索した結果、[stackoverflow](http://stackoverflow.com/questions/26893042/opening-firebug-stops-javascript-from-running)に原因と解決策が出ていたので、参考になれば。

以下軽い翻訳

1. この現象は```firefox ver 33.1```と```firequery ver 1.41```の組み合わせで発生します 
2. 解決方法はFireQueryをdisableにしてFireFoxを再起動してね

とのことらしい。

自分の場合はドンピシャで当てはまっていたので、FireQueryを切ったら正常に動くようになりました。
Windowsで古いファイルを削除する

コマンドプロンプトのforfilesコマンドで、Linux等でよく使われる ```find /path/to/log -mtime +7 -exec rm {} \;``` と同様のことができます。

forfilesコマンドはWindows Server 2003、Windows Vista以降で利用できます。

```bat:cmd
7日以上前の*.txtを削除
> forfiles /P c:\path\to\log /D -7 /M "*.txt" /c "cmd /c del @file"

30日以上前の*.logを削除
> forfiles /P c:\path\to\log /D -30 /M "*.log" /c "cmd /c del @file"
```

デフォルトでは指定したフォルダのみが処理対象で、/S オプションを付けるとサブフォルダを再帰処理します。

バッチファイルを作ってタスクスケジューラに登録しておくと定期的に古いファイルを消すことができます。

## 参考サイト

[Windowsのforfilesコマンドで条件に合うファイルを取り出して処理する](http://www.atmarkit.co.jp/ait/articles/0902/27/news132.html)
AWSでS3バケットを移行（コピー）する（アカウント間も可能）

AWSでS3のファイルを別のバケットにコピーするスクリプトを見つけたけれど、2015/4時点では少し変更する必要があった。

- [S3バケット内の全オブジェクトを他のバケットにコピーする](http://t.y13i.com/post/85610897165/s3)

### [kntmrkm/bucket2bucket](https://github.com/kntmrkm/bucket2bucket)

スクリプトの実行は以下のように行う。

`ruby bucket2bucket.rb -i [アクセスキー] -k [シークレットキー] -s [コピー元のバケット名] -d [コピー先のバケット名] -v`

アクセスキー、シークレットキーはコピー先のアカウントのものを使用する。

### コピー元が異なるアカウントの場合

バケットのプロパティから、アクセス許可の設定に「バケットポリシーの追加」という項目があるので、そこにポリシーを追加する。

- [AWS Policy Generator](http://awspolicygen.s3.amazonaws.com/policygen.html)

ポリシー例

```
{
  "Id": "Policy*************",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt*************",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket1/*",
                   ※ バケット名をコピー元のものに変更
      "Principal": {
        "AWS": [
          "arn:aws:iam::111111111111:root"
          ※ アカウントのIDをコピー先のものに変更
        ]
      }
    }
  ]
}
```

### オリジナルのスクリプトと異なるところ

- AWS-SDKのバージョン違いがあったのでAWS-SDK-V1を使用するように修正
- ACLのコピーを行うコードの変更 ※ コピー後はpublic_readになるようになってます
 - ここらへんの権限コピーは試してません（色々エラーが出てたのでpublic_readを直接指定しているだけ）
Laravel validation/active-urlの使い方

# validationのactive-urlはドメインチェックだけをする
validationをかけるときに　
active-urlだからとなにも考えず
引数にURLをつかってしまうとvalid出来ずにハマる。

## リファレンスにもそう書いてあるし！！！
>active_url
>フィルドがPHPの機能である`checkdnsrr`を通して、有効なURLであるかをバリデートします。
http://readouble.com/laravel/4/2/0/ja/validation.html#rule-active-url

checkdnsrr…だ、と。

# 実際に使ってみた
## 検証用コード
```php:demo.php
        // validation設定
        $rule = ['url' => 'active_url'];
        $input = ['url' => $url];
        $validator = Validator::make($input, $rule);
        //生きたURLかチェック
        if ($validator->fails()) {
             echo '\inactive URL/';
        } else{
             echo '\active URL/';
        }
```

## 検証①　http://allabout.co.jp
結果：\active URL/

## 検証②　http://yahoo.co.jp
結果：\inactive URL/

## 検証③　http://allabout.co.jp/gm/gc/447800/

結果：\inactive URL/
実際はactiveなURLなんですけどね(・ω・｀)

# Laravel内の実装
## validationで使われる関数　validateActiveUrl
```php:/vendor/laravel/framework/src/Illuminate/Validation/Validator.php

	/**
	 * Validate that an attribute is an active URL.
	 *
	 * @param  string  $attribute
	 * @param  mixed   $value
	 * @return bool
	 */
	protected function validateActiveUrl($attribute, $value)
	{
		$url = str_replace(array('http://', 'https://', 'ftp://'), '', strtolower($value));

		return checkdnsrr($url);
	}
```


## Checkdnsrr　とは
>bool checkdnsrr ( string $host [, string $type = "MX" ] )
>host に対応する type 型のレコードを DNS から探します。
>http://php.net/manual/ja/function.checkdnsrr.php

つまり…


### 上手くいく
http://allabout.co.jp
→checkdnsrr('allabout.co.jp')
true!!!

### 意図した結果にならない
http://allabout.co.jp/gm/gc/447800
→checkdnsrr('allabout.co.jp/gm/gc/447800')
false!!


# 所感
+ リファレンスはちゃんと読もう
+ active-urlって書いてあるけどURLを素直に引き渡してはいけない
ansible plugin のオレオレひな形

だいたい _execute() をいじればなんとかなると思っている。

```lang:lib.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
DOCUMENTATION = '''
---
module: module_name
short_description: short desc
description:
  - desc
options:
  arg1:
    description:
      - arg1 desc
    default: None
    required: False
    type: str
rtype: str
'''

EXAMPLES = '''
- action: module_name arg1=arg1
'''


import json
import sys
import shlex
from ansible.module_utils.basic import *


ARGUMENT_SPEC = {
    'arg1': {
        'default': None,
        'required': False,
        'type': 'str',
    },
}
SEARCH_KEY = 'key'


def _execute(module):
    results = []
    _arg1 = module.params['arg1'].strip('[').strip(']').split(',')
    for _target in _arg1:
        _target = _target.strip(' ')
        if SEARCH_KEY in line:
            _result = line.split(':')[1].split('/')[-1]
            results.append(_result)
    return results



def main():
    module = AnsibleModule(
        ARGUMENT_SPEC,
        supports_check_mode=True,
    )

    result = _execute(module)
    module.exit_json(changed=True, value=result)


if __name__ == "__main__":
    main()

```
ド・モルガンの定理で論理式

|     元の式      |       変換後の式        |
|:----------------|:-----------------------|
| not A and not B | not( A or B )          |
| not A and B     | not( A or not B)       |
| A and not B     | not( not A or B )      |
| A and B         | not( not A or not B )  |
| not A or not B  | not( A and B )         |
| not A or B      | not( A and not B )     |
| A or not B      | not( not A and B )     |
| A or B          | not( not A and not B ) |



読みやすさは微妙ですが、場合によってはコードを短縮することができます。

例えば：

```
if (!a || !b) then ...
```

変換後↓

```
if !(a && b) then ...
```
javascriptクイズ 123の組み合わせ


最近jsでどこまでお遊びできるのかが面白くなってました
ちょっとした問題を作って、自分で解いてみるのも楽しいですね

# 問題

[1～3の数字で、重複しない3桁の組み合わせを作りたい。](http://qa.atmarkit.co.jp/q/9278)を見て。
結果を返す式を作成してください。

# 実行条件

  + 式をchrome等のコンソールで実行することで表示できる
  + `console.log`を使って出力するのではなく、式の結果で表示する
  + `var x = 1; x + 1`のように式が分断しない
  + `(function(){var x = 1; return x + 1;})()`のように全体を即時関数で囲まない
  + 例えば[アルファベットから4つランダム取り出す](http://qiita.com/cocottejs/items/7a4279af85d65943202f)のような感じです


# 結果

式は改行付きの文字列を返してします
chromeでは表示上、前後に追加される`"`は省いています

```
1、111
2、112
3、113
4、121
5、122
6、123
7、131
8、132
9、133
10、211
11、212
12、213
13、221
14、222
15、223
16、231
17、232
18、233
19、311
20、312
21、313
22、321
23、322
24、323
25、331
26、332
27、333
```


# 答え

挑戦した方は、コメントくれると嬉しいです
私の答えは、編集履歴の1を表示してください

# 最後に

せっかくのゴールデンウィークだけど、外は雨。遊びにいかずjsのお勉強ってのもいいものです。
コミットをまとめてブランチ切り直し

PRを出すときとかに、レビュワーが見やすいようにコミットを１つにする。
自分以外使う人がいない気がする。

# コマンド
 # masterに移動
git branch feature/backup1
git fetch
git checkout master
 # コミットを纏める
git merge --squash feature/something
git branch feature/backup2
 # 新たにブランチを作り直す
git branch -D feature/something
git push origin :feature/something
git branch feature/something
git checkout feature/something
git push origin feature/something
git branch -D master
git checkout master
 # backup削除
git branch -D  feature/backup1
git branch -D  feature/backup2
Wiresharkが立ち上がらない？


## "Where is X11?"って聞かれたら

XQuartz は以下に存在する。

`/Applications/Utilities/XQuartz.app/Contents/MacOS/X11` 


## それでも起動しない

一度 WireShark を落として。
XQuartz の xterm から 

```
$ /Applications/Wireshark.app/Contents/MacOS/Wireshark
```

で起動。

# 参考

http://www.itechlounge.net/2013/10/mac-wireshark-wont-start-and-ask-for-x11-with-osx-mavericks/
チェックボックスフィールドを画面上に展開する

メモがてら。
チェックボックスのような配列データを展開する場合はform_forで展開されるタグ名と
下記のように結びつけることでerb、haml上に展開できます。

```rb
  -if @model.check_vals
    - for val in @model.check_vals
      = hidden_field_tag 'sample_model[check_vals][]', val
```
ストロングパラメータでチェックボックスの値を許可する

記述に迷ったのでメモがてら。
Strong parameterでチェックボックスのような不特定多数の値を許可する時、
下記のcheck_valように配列で定義してやる必要があります。

```ruby:
      params.require(:test_form).permit(
        :val,
        check_val: []
      )
```

6/12 追記
画面側もf.checkbox :check_val みたいなヘルパー使用そのままでは展開されないので下記のように直接フィールド名を編集してやります。

```haml:
      = check_box_tag '[test_form]check_val[]', 1, false
```
Google Apps Scriptを書いて思ったことメモ

Google Apps Scriptでちょっと長めのスクリプトを書いてみて思ったことメモです。

##言語仕様みたいな解説がない

情報が豊富なリファレンスサイトがあるんだけど、スプレッドシート操作の内容が多い。

Google Apps Script入門
http://google-appsscript.blogspot.jp/

逆引きGoogle Apps Script
http://www.bmoo.net/archives/google-apps-script-refference

英語の公式ドキュメントもある。

公式ドキュメントのチュートリアル
https://developers.google.com/apps-script/articles

スプレッドシート操作以外の、基本的なスクリプト作成方法では、こちらのサイトが一番役に立った。
http://engineer-intern.jp/archives/category/column/start/googleappsscript
詳しく書かれてるわけじゃないんだけど、言語の雰囲気みたいなのがわかる。

##メモ

####undefined判定
>if (bl !== undefined)

####文字列の加算は+を使う
>str = str1 + str2

####文字列の空判定
>if (str != "")

####exit
exitさせたいときは例外を投げる
>throw new Error("メッセージ")

####行末
行末は「;」省略可
HexoでThemeを使うまで


##Hexoとは

サイトジェネレーターです。Node.jsを使っています。この辺は、Rubyで書かれているものが多い印象ですが、GitBookと同じように、HexoはNode.js製です。そのため、テーマにもGitBookに似た感じのものがあります。

https://hexo.io/

ここでは、GitBookに似たテーマを使ってみることにした。

##コマンド

```bash:
$ sudo npm install hexo-cli -g

$ hexo init hexo

$ cd hexo

$ sudo npm install

$ hexo server
```

ここまででデフォルトのテーマを使えます。

次に、インストールしたテーマを使う方法です。

```bash:
$ cd themes
./hexo
├── node_modules
│   ├── hexo
│   ├── hexo-generator-archive
│   ├── hexo-generator-category
│   ├── hexo-generator-index
│   ├── hexo-generator-tag
│   ├── hexo-renderer-ejs
│   ├── hexo-renderer-marked
│   ├── hexo-renderer-stylus
│   └── hexo-server
├── scaffolds
├── source
│   └── _posts
└── "themes" # 現在のディレクトリ
    ├── landscape
    └── "next" # 新しいテーマ

$ git clone https://github.com/iissnan/hexo-theme-next next

$ cd ../

$ vim _config.yml
```

そして、テーマを変更します。

```yaml:_config.yml
theme: next
```

あとは、プレビューしてみると、`/themes/next`が設定されていることがわかります。

```bash:
$ hexo server
```


Webサーバーへアップロードするファイルは、`public`です。以下のコマンドで作ります。

```bash:
$ hexo generate
```
Ruby on Rails 4 - coffee scriptで作った関数をhtml(view)側で呼び出す



```coffeescript:foo.js.coffee
foo = () ->
  alert('foo')
```
と書いてしまうと

```js:foo.js
(function() {
  foo = function() {
    alert('foo');
  };
}).call(this);
```

のようにラップされてしまうので、hamlやerb側で普通のjavascriptとして実行したいときに、見つからないと言われる。

```coffeescript:foo.js.coffee
@foo = () ->
  alert('foo')
```

関数名を@fooとすることで、

```js:foo.js
(function() {
  this.foo = function() {
    alert('foo');
  };
}).call(this);
```
のような変換になる。

このthisはwindowなので、これで普通のjavascriptの関数呼び出しで実行できる

```haml:foo.html.haml
%script
  $(document).ready(foo());
```
や、単純に

```haml:foo.html.haml
%script
  foo();
```
のような形で実行できる。


※参考URL
http://qiita.com/imk2o/items/9a854d19132bea621548
pdoでLIKE検索する際の注意点


# 前提

あくまでもMysqlだけでの話を前提としてお話します。
先日自分が書いたコードで指摘を受けたため、備忘録として残しておきます。

# 実際あったコード

ユーザが本のタイトルをLIKE検索したく、下記のようにPDOで実装を行っていました。

```php

$sql = 'select * from books where title like ?';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(sprintf('%%%s%%', $title)));

$result = $stmt->fetchAll();
```

ここで、`$title` には、ユーザが入力した検索したい本の名前が入っているものとします。
受けた指摘としては、`ユーザが[%]や[_]という文字列を検索したい場合に正しく動作するか？`というものでした。

Mysqlでは、LIKE検索に使われる特殊文字列下記のようなものがあります。

`%` -> 任意の0文字以上の文字列
`_` -> 任意の1文字

# これで問題が起きる場合

例えばユーザが「100%」という文字列を検索したとします。
ユーザとしては、「株式投資で100%成功する方法」とか「告白が100%成功する方法」とかを期待してると思います。

が、実際に実行されるSQLは

```sql
select * from books title like '%100%%';
```

となり、結果は下記のようになります。

* 1. 株式投資で100%成功する方法
* 2. 告白が100%成功する方法
* 3. 最後から100番目の恋
* 4. 100回目のプロポーズ

おや、最初の2つは期待どおりですが、最後の2つは期待ハズレのものが返って来てます。

これは、先ほどの、MysqlがLIKE検索で`%`が任意の0文字以上の文字列という意味を持っているため、
ユーザが調べようとした`100%`の`%`は本来の文字列としての`%`ではなくて、`任意の0文字以上`で判別されてしまって、
`100`という文字列を含むタイトルが検索されてしまったのです

# じゃあどうするか

↑で説明したとおり、MysqlのLIKE検索において、`%`と`_`は特殊な意味を持つため、この2つをエスケープして上げる必要があります。
具体的には下記のように。

```php

$sql = 'select * from books where title like ?';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(sprintf('%%%s%%', addcslashes($title, '\_%')));

$result = $stmt->fetchAll();
```

PHPの場合はこれで`%`や`_`がエスケープされるため、正しく検索が行えるようになります。

とても初歩的な事ですが、ハマってしまった自分が恥ずかしい。。
PowerShellからSlackに通知する方法

（16/07/29追記）
当記事のスクリプトでは「煩」など一部の文字が「BAD+7BAD+A9」のように化けて投稿されるので、当記事にリンクして頂いているこちらの記事のスクリプトの利用をお勧めします。
 [ログオン・ログオフ時にPowerShellを起動しSlackへ通知する【Windows7】](http://qiita.com/khsk/items/d04c059bb43328be1246)

----

追加のソフトインストール無しでWindowsからSlackに通知が送れます。
要になるPowerShellのInvoke-RestMethodはWindows8、Windows Server 2012以降（PowerShell 3.0以降）で利用できます。


## SlackのWebhook設定

Slackで投稿したいチャンネルのIncoming WebHooksを設定しておきます。
チャンネルのメニューから、Add a service integration > Incoming WebHooks を追加し、表示されたWebhook URLをメモしておきます。

## PowerShellの実行許可

標準ではPowerShellスクリプトの実行が禁止されているので
管理者権限でPowerShellを起動してローカルのスクリプトを実行可能に設定します。

```ps1:powershell
# 現在の設定を確認
PS > powershell Get-ExecutionPolicy
Restricted

# 設定を変更
PS > powershell Set-ExecutionPolicy RemoteSigned

# 設定を確認
PS > powershell Get-ExecutionPolicy
RemoteSigned
```

## 通知用PowerShellスクリプト

引数に渡された文字列をSlackに通知するスクリプトを用意します。UTF8に変換するので日本語もOKです。

$notificationPayloadのusernameとicon_urlは好みで設定してください。
Invoke-RestMethod -Uri にSlackで取得したWebhook URLを設定します。

```ps1:notify_to_slack.ps1
$enc = [System.Text.Encoding]::GetEncoding('ISO-8859-1')
$utf8Bytes = [System.Text.Encoding]::UTF8.GetBytes($args)

$notificationPayload = @{ 
    text = $enc.GetString($utf8Bytes);
    username = "PowerShell BOT"; 
    icon_url = "https://dl.dropboxusercontent.com/u/1518975/metro-powershell-logo.png"
}

Invoke-RestMethod -Uri "https://hooks.slack.com/services/xxxxxxxxx/xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxx" -Method Post -Body (ConvertTo-Json $notificationPayload)
```

## バッチファイルからPowerShellスクリプトを呼び出す

バッチファイルからPowerShellスクリプトを呼び出します。

```bat:notify.bat
powershell /c notify_to_slack.ps1 "Hello Slack! こんにちは！"
```


## 参考サイト
- [PowerShellのセキュリティポリシーを変更してスクリプトファイルを実行できるようにする](http://qiita.com/kmr_hryk/items/6d3a63d84fd7feca2826)
- [Bug? Invoke-RestMethod and UTF-8 data](https://social.technet.microsoft.com/Forums/windowsserver/en-US/d795e7d2-dcf1-4323-8e06-8f06ce31a897/bug-invokerestmethod-and-utf8-data?forum=winserverpowershell)
- [Powershell to slack](http://log.maneu.net/powershell-to-slack/)
Twitter検索で情報を溜め込み、形態素解析してマルコフ連鎖で文章を生成してツイート。

Twitterでの検索結果をテキスト形式で保存。
様々な検索結果をテキストへ保存し、テキストを読み込み形態素解析。
そこからマルコフ連鎖で文章を生成し、ツイートPOSTするまで。

```python:twmarkov.py

#!/user/bin/env python
# -*- coding: utf-8 -*-
from requests_oauthlib import OAuth1Session
import json
import sys
import MeCab
import random
import re

while True:
	search_words = raw_input(u"words: ")
	
	C_KEY = "*************************************"
	C_SECRET = "*************************************"
	A_KEY = "*************************************"
	A_SECRET = "*************************************"

	def Search_words():
		url = "https://api.twitter.com/1.1/search/tweets.json?"
		params = {
				"q": unicode(search_words, "utf-8"),
				"lang": "ja",
				"result_type": "recent",
				"count": "100"
				}
		tw = OAuth1Session(C_KEY,C_SECRET,A_KEY,A_SECRET)
		req = tw.get(url, params = params)
		tweets = json.loads(req.text)
		for tweet in tweets["statuses"]:
			f = open("tweet.txt" , "aw")
			lists = (tweet["text"].encode("utf-8"))
			if "http" in lists:
				lists = lists.split("http", 1)[0]
				lists = lists.split("@")[0]
				lists = lists.split("RT")[0]

				f.write(lists)
				f.flush()
				f.close()

		
	def Mecab_file():	
		f = open("tweet.txt","rb")
		data = f.read()
		f.close()

		mt = MeCab.Tagger("-Owakati")

		wordlist = mt.parse(data)
		wordlist = wordlist.rstrip(" \n").split(" ")
 
		markov = {}
		w = ""
	
		for x in wordlist:
			if w:
				if markov.has_key(w):#Python3では動かない箇所
					new_list = markov[w]
				else:
					new_list =[]
			
				new_list.append(x)
				markov[w] = new_list
			w = x
		
		choice_words = wordlist[0]
		sentence = ""
		count = 0
	
		while count < 90:
			sentence += choice_words
			choice_words = random.choice(markov[choice_words])
			count += 1

			sentence = sentence.split(" ", 1)[0]
			p = re.compile("[!-/:-@[-`{-~]")
			sus = p.sub("", sentence)
	
		words = re.sub(re.compile("[!-~]"),"",sus)
		twits = words + " 【tweet from twmarkov】"
		
		url = "https://api.twitter.com/1.1/statuses/update.json"
		params = {"status": twits,"lang": "ja"}
		tw = OAuth1Session(C_KEY,C_SECRET,A_KEY,A_SECRET)
		req = tw.post(url, params = params)
		if req.status_code == 200:
			print "Success! Your Tweet"
		else:
			print req.status_code
	
	
	if search_words:
		Search_words()
		Mecab_file()
	else:
		break
```

外部ファイルとして保存したtweet.txtにどんどん検索結果のツイートを格納。
テキスト量が増えすぎても、少なすぎてもツイート結果は面白くならないのが不満点。

cronで叩けば単純にbot化することも出来るんじゃないかと。
その場合は検索用APIではなく、hometimelineとかusertimelineとかを拾うほうがいいかもしれない。

WEBアプリケーションとして動かすとこんな感じになります。
（プログラムをサーバーから削除したので今はないです）

#Python3での注意点

```
if markov.has_key(w):
```

という処理は

```
if w in markov:
```

と置き換えます。
Dockerコンテナ上でsysctlでカーネルパラメータを変更する方法


##背景
Dockerコンテナで構築した開発環境で、guardを用いて開発していたところinotifyの不足によるエラーに遭遇した。
対策は[guardのgithubページにある通り](https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers)だが、`sysctl -p`を実行すると`error: "Read-only file system" setting key "vm.swappiness"`というようなエラーに遭遇する。

##対応
Dockerコンテナの起動時に、`--privileged`オプションをつける。

```zsh
% docker run --privileged --volumes-from dev -p 35729:35729 -p 2222:22 -p 80:3000 -itd osamunmun/centos6:1.1 /usr/sbin/sshd -D
```
johnny-fiveのスクリプトをcrontabで回した時にハマった話


# 構成
よくあるRaspberry PiとArduinoつないだやつ。

- Raspberry PiとArduino Unoに接続
- Arduinoはjohnny-fiveの手順どおりStandardFirmataをUpload 
- Raspbian側でcrontabを回して、johnny-fiveを利用したスクリプトを実行

# ハマった話
温度をとるためにこんなスクリプトを書いた


```js
var five = require("johnny-five")
var board = new five.Board()

module.exports = function(cb){
  board.once("ready", function() {
    
    var temperature = new five.Temperature({
      controller: "LM35",
      pin: "A0"
    })

    temperature.once("data", function(err, data){      
      if(err){
        console.warn(err)
      }
      cb(err, data.celsius)
    })
  })
}

```

で、crontabをこんな感じにした

```
$ sudo crontab -l
* * * * * /usr/local/bin/node /path/to/script.js
```

が、どうも思った通りにデータを送信してくれない。
ログを見たりしていると、cronが回っているが出力がうまくいってないらしい。

## ログを吐かせてみる
```
* * * * * /usr/local/bin/node /path/to/script.js > /home/pi/c1 2>/home/pi/c2
```

こんな調子でログを吐かせてみるとざっくりこんなエラーが出てた（timestampとかは削っている）

```
Device(s) /dev/ttyACM0
Connected /dev/ttyACM0
Repl Initialized
Board Closing.
```
クロージングってなんでだよ。

## 解決編
散々悩んだ挙句、デフォルトがreplになっていて、それが起動してしまうことでうまく回ってくれなかったらしいことがわかった。

ということでこんな感じにしてやっと動いた。

```js
var five = require("johnny-five")
var board = new five.Board({
  repl: false
})
```
UDP / TCP/IP 通信 > タイムアウト時間についての疑問

UDP通信やTCP/IP通信について、同一ネットワーク内で通信を行うアプリを作成する時、タイムアウト時間はどれくらいの設定が妥当なのだろうか?

検索したところ、UDPでは300msec程度とっている例もあれば、3000msec取らないといけないと書いているのもある。

また、TCP/IPの場合、輻輳制御が入ってくるので、タイムアウト時間を延ばす必要があるのだろうか？


<hr>
(以下、2015/5/1 追記)
http://www.karacrix.jp/files_iob30rta/vbnet.htm

UDPの通信について
> 受信タイムアウト時間(msec)です。同一LAN内の場合3000、無線LANが経路に入っている場合タイムアウト時間を短くすると問題起きる場合ありますので10000ぐらいが良いです。

http://router.ipq.jp/rv-230se/spi_15.html
> TCPタイムアウト (初期値：3600秒)
> UDPタイムアウト (初期値：180秒)

https://live.paloaltonetworks.com/docs/DOC-3785
> TCP default timeout: 3600 secs
> UDP default timeout: 30 secs

http://jscom.jp/support/maker/juniper/srx/knowledge/basis/s107/
> TCP: 30分
> UDP: 1分

思っていた以上に長いタイムアウト時間を設定している例がいくつもある。
#vscode Visual Studio Code のmarkdownでmathjaxを使えるようにするパッチ（仮）

http://3846masa.hatenablog.jp/entry/2015/04/30/083502 と同じ記事

----------------------------------------------------------------
なんだか Visual Studio Code が話題になっているようで．

markdownもプレビューできるのかー，でもtex書けないとなー．

そんなことで，適当に作ってみた．

![preview](http://i.gyazo.com/7f02e175e4caf863bc3995248762d3f6.png)

[#vscode Visual Studio Codeのmarkdownでmathjaxを使えるようにするパッチ（仮）](https://gist.github.com/3846masa/cde99a18a8d7ad225cf7/)

**15/04/30 18:24 追記** 括弧のエスケープがおかしかったから直した

**16/04/11 追記** 新しいパッチを作ってくれた人が！！
[> コメント欄参照](http://qiita.com/3846masa/items/3c63aef11682fb1957e2#comment-0306d73a4062eb3d48bc)

## 導入方法
- ``markdownWorker.js`` にパッチを当てる
	- Windowsでは``C:\Users\{USER}\AppData\Local\Code\app-0.1.0\resources\app\client\vs\languages\markdown``
	- **パッチを当てる前に，``js-beautify``で整形してください**

```bash
patch -u markdownWorker.js mathjax.patch
```

---------------------------
**追伸**

``markdownWorker.js``で

```bash
sed -e 's/"Segoe WPC",/"Meiryo", "Segoe WPC",/'
```

すると，日本語表示がよくなります．

--------------------------

作るのにかなり時間かかった．すべてmarked.jsのせい．
CreateJSの基本メモ2　円を描く

#準備
下記を参考にしてください。
[CreateJSの基本メモ1　線を描く]
http://qiita.com/PianoScoreJP/items/09b6d9cf4e17549704c6#%E6%BA%96%E5%82%99

#1.円を描く
drawCircle(x,y,r) 

     //ElementIDを指定して、ステージを作成する
     var mystage=new createjs.Stage("mycanvas");
    //Graphicsオブジェクトを作成する
         var g = new createjs.Graphics();
     //線の色を指定
         g.beginStroke("#000");
     //塗りつぶしの色を作成
         g.beginFill("#000");
     //円を描く(x:0,y:0を中心とした、半径50pxの円)
         g.drawCircle(0,0,50);
     //Displayオブジェクトを作成
         var shape=new createjs.Shape(g);
     //シェイプオブジェクトをステージに追加する
         mystage.addChild(shape);
     //ステージを更新して描画を完了
         mystage.update();

短縮したメソッド名でチェーンして記述すると以下のようになります。
    
     g.s("#000").f("#000").dc(0,0,50);


#2.楕円を描く
drawEllipse(x,y,w,h) 

     //ElementIDを指定して、ステージを作成する
     var mystage=new createjs.Stage("mycanvas");
    //Graphicsオブジェクトを作成する
         var g = new createjs.Graphics();
     //線の色を指定
         g.beginStroke("#000");
     //塗りつぶしの色を作成
         g.beginFill("#000");
     //楕円を描く(x:0,y:0を中心とした、横半径50px,縦の半径100pxの楕円)
         g.drawEllipse(0,0,50,100);
     //Displayオブジェクトを作成
         var shape=new createjs.Shape(g);
     //シェイプオブジェクトをステージに追加する
         mystage.addChild(shape);
     //ステージを更新して描画を完了
         mystage.update(); 

短縮したメソッド名でチェーンして記述すると以下のようになります。

     g.s("#000").f("#000").de(0,0,50,100);

#3.円弧を描く
arc ( x  y  radius  startAngle  endAngle  anticlockwise )

     //ElementIDを指定して、ステージを作成する
     var mystage=new createjs.Stage("mycanvas");
    //Graphicsオブジェクトを作成する
         var g = new createjs.Graphics();
     //線の色を指定
         g.beginStroke("#000");
     //円を描く(x:0,y:0を中心とした、半円）
         g.arc(0,0,50,0,Math.PI);
     //Displayオブジェクトを作成
         var shape=new createjs.Shape(g);
     //シェイプオブジェクトをステージに追加する
         mystage.addChild(shape);
     //ステージを更新して描画を完了
         mystage.update(); 

短縮したメソッド名でチェーンして記述すると以下のようになります。

     g.s("#000").a(0,0,50,0,Math.PI);

>本家のドキュメント
http://www.createjs.com/Docs/EaselJS/classes/Graphics.html
link_to_ifで条件に応じてリンクを変える

例えば条件に応じて「ログイン」「マイページ」とリンクを変える場合。

```lang:linlif.html.erb
<%= link_to_if @user.nil?, 'ログイン', controller: :login, action: :index do |name| 
link_to 'マイページ', controller: :login, action: :info 
end %>
```
>（『Ruby on Rails4アプリケーション・プログラミング』より引用）

判定で@userが空の場合は「ログイン」をそうではない場合は「マイページ」のリンクを出力。
nagiosのWebUIに指定IPからは認証無しで、それ以外は認証をさせる方法

## 参考

* @kmikmyさんの [Apacheのアクセス制御、mod_rewrite設定 (httpd.conf, .htaccess) - Qiita](http://qiita.com/kmikmy/items/105b6838b3db5c9358a2)
  * デフォルトが `Satisfy All`
  * 一つでも通ればOKは `Satisfy Any`
* [Nagios 3翻訳プロジェクト - CGI設定ファイルオプション](http://nagios.x-trans.jp/Nagios-doc/JAPANESE/configcgi.html)


## apache側

```apache:
<DirectoryMatch (/usr/share/nagios3/htdocs|/usr/lib/cgi-bin/nagios3|/etc/nagios3/stylesheets)>

  # IPアドレスでの許可
  Order Deny,Allow
  Allow from 1.2.3.4/32
  Deny from All

  # Digest認証での許可
  AuthType Digest
  AuthName "Input username and password!"
  AuthUserFile /etc/nagios3/htpasswd.users
  Require valid-user

  Satisfy Any

</Directory>
```

## nagios側

```diff:/etc/nagios3/cgi.cfg
-use_authentication=1
+use_authentication=0
```
Laravel5のhomesteadのDB設定

homesteadのmigrateでエラーが出たらDB_HOSTにポート番号をつける。

~~~
% php artisan migrate
                                           
  [PDOException]                             
  SQLSTATE[HY000] [2002] Connection refused  

~~~

~~~ lang:.env
DB_HOST=localhost:33060
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=pass
~~~

~~~ 
% php artisan migrate
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
~~~ 


※追記

MySQL: 33060 -> Forwards To 3306

してるんだからエラーでいい気がした。
当たり前だけど今度はブラウザからDB繋ぐとエラーになるし。

homestead ssh でサーバー入ってphp artisan migratesすればいいだけじゃないか。

やっぱ戻す。

~~~ lang:.env
DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=pass
~~~

http://stackoverflow.com/questions/16904470/laravel-4-migrationinstall-errorexception

↑でApp::runningInConsole()でコマンドからかブラウザからか切り分けて変なif分書いてるけどそんなんなるべく書きたくないよね。
secureCoding > C11附属書K > strnlen_s() > 文字列が最大値より長かった場合、指定された最大値を返す

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> この関数は、文字列が指定された最大値よりも長かった場合、文字列の実際の長さではなく指定された最大値を返す。

長大な文字列を渡されたとしても、指定の文字数しかスキャンしません、ということだと思う。
secureCoding > C11附属書K > memcpy_s() > 実行時制約違反が発生すると...コピー先の配列はゼロ充填される

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> 2.5.4 memcpy()とmemmove()
...
実行時制約違反が発生すると、問題の発生に気づくのを促すために、コピー先の配列はゼロ充填される。

「ゼロ充填」の意味が「コピーした領域も含めてゼロ充填される」ということだろうか?
secureCoding > strncpy()の代わり > strndup() > 標準だけど実装されていない

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> 動的メモリ割り当て関数 ISO/IEC TR 24731-2 [ISO/IEC TR 24731-2:2010]は、strncpy()の代替関数として使用可能な関数として、strndup()関数を定義している。

<hr>
[SO](http://stackoverflow.com/questions/6062822/whats-wrong-with-strndup)

string.hにstrdnup()が見つからないよ、という質問。理由は以下のようだ。

>  by Mat
strndup is "standard", but that standard is not implemented widely (yet). It's been present in GLIBC as an extension for quite a while. (But +1 anyway, malloc + strcpy is a good workaround.)
CreateJSの基本メモ1　線を描く

HTML5 Canvasを簡単に利用できる CreateJSの基本的な使い方メモです。

#準備
CDNからライブラリ読み込み

    <script src="https://code.createjs.com/easeljs-0.8.0.min.js"></script>
CANVASを作る。IDをつけておく

    <body>
    <canvas id=mycanvas width=1366 height=768></canvas>
    </body>
準備はこれだけ。
#1.線を描く。
     //ElementIDを指定して、ステージを作成する
     var mystage=new createjs.Stage("mycanvas");
    //Graphicsオブジェクトを作成する
         var g = new createjs.Graphics();
     //線の色を指定
         g.beginStroke("#000");
     //線の始点へ移動
         g.moveTo(0,10);
     //線の終点を指定して、線を描く
         g.lineTo(100,10);
     //線を書き終える　これはなくてもOK
         g.endStroke();
     //Displayオブジェクトを作成
         var shape=new createjs.Shape(g);
     //シェイプオブジェクトをステージに追加する
         mystage.addChild(shape);
     //ステージを更新して描画を完了
         mystage.update();

下記のようにチェーンして記述することも可能です
    
    shape.beginStroke("#000").moveTo(0,10).lineTo(100,10).endStroke();

また、短縮されたメソッド名も準備されていますので
    
    g.s("#000").mt(0,10).lt(100,10).es();

このように書くこともできます
>本家のドキュメント
http://www.createjs.com/Docs/EaselJS/classes/Graphics.html#method_lineTo
技術英語 > during the past 60 seconds > over this minuteより明確

Readable codeに書かれていた。

平均など取るときにReturn the count over this minute とした場合、以下のような可能性がある
1. 12時13分00秒から12時13分59秒
2. 12時13分01秒から12時14分00秒 
3. 12時13分25秒から12時14分24秒 (現在時刻が12時14分25秒の時)

during the past 60 secondsとすることで、regardless of clock-minute boundariesとなるので、上記の3の意味になる、ということ。

<hr>
ちなみに
- the past 60 seconds
- past 60 seconds
でも意味が変わってくる。

http://www.eigowithluke.com/2013/07/the-next/

theがつくことにより、現在の時刻を基準として、そこからnext/past 60secondsなりを数えるという感じ。
theがないと、区切り(13時00分、3日00時など)から区切りの期間に60secondsや12hoursなどが入るようになる。
swiftでhudをつくる step1


hudを作っていく中で、気づいたこと等のメモです

作っている途中ですが、
https://github.com/pixel-ink/PIhud
にソースがあります

# 背景に画像を並べたい
![pattern.png](https://qiita-image-store.s3.amazonaws.com/0/77174/ea92fee5-0b09-43e2-1ee2-5476139dc523.png "pattern.png")

のような画像を並べて

![スクリーンショット 2015-04-30 4.53.10.png](https://qiita-image-store.s3.amazonaws.com/0/77174/756fcac8-877d-8c7e-a754-922456766725.png "スクリーンショット 2015-04-30 4.53.10.png")

にしたい。

UIImageではなく、UIColorを使います。

```Swift:例
view.backgroundColor = UIColor(patternImage: UIImage(named: "pattern.png")! )
```

Groupe Table View Background Colorに模様がつくのが不思議だったのですが、こういう仕組みなんですね。

# CGRectを作るときに、書きにくい

ある画像を中心に置きたい場合は、UIViewContentMode.Centerを使うと思いますが、CoreGraphicsを使っている場合などには自力で計算する必要があります。

```Swift:Center
CGRectMake((container.frame.size.width - image.size.width) / 2, (container.frame.size.width.height - image.size.height) / 2, image.size.width, image.size.height)
```

少し長くて書きにくいと思ったので、縮めて書けるようにextentionを作ってみました

```Swift:extention
private extension UIView {
  var size: CGSize { return self.frame.size }
  var x: CGFloat { return self.frame.origin.x }
  var y: CGFloat { return self.frame.origin.y }
  var w: CGFloat { return self.frame.size.width }
  var h: CGFloat { return self.frame.size.height }
}

private extension CGRect {
  var x: CGFloat { return self.origin.x }
  var y: CGFloat { return self.origin.y }
  var w: CGFloat { return self.size.width }
  var h: CGFloat { return self.size.height }
}

private extension CGSize {
  var w: CGFloat { return self.width }
  var h: CGFloat { return self.height }
}
```

なんだか無理やりですが、これを使うと、短く書けます。

```Swift:Center
CGRectMake((container.w - image.w) / 2, (container.h - image.h) / 2, image.w, image.h)
```

aspectFitやascpectFillも使いたいので、関数にしておきます。

```Swift:ContentMode
class func center(aspect:CGSize, bound:CGSize) -> CGRect {
  let x = (bound.w - aspect.w) / 2
  let y = (bound.h - aspect.h) / 2
  return CGRectMake(x, y, aspect.w, aspect.h)
}

class func aspectFit(aspect:CGSize, bound:CGSize) -> CGRect {
  let scale = min(bound.w / aspect.w, bound.h / aspect.h)
  let size = CGSizeMake(aspect.w * scale, aspect.h * scale)
  return center(size, bound:bound)
}

class func aspectFill(aspect:CGSize, bound:CGSize) -> CGRect {
  let w = bound.w / aspect.w
  let h = bound.h / aspect.h
  var out = bound
  if( h > w ){
    out.width = bound.h / aspect.h * aspect.w
  }else if( w > h ){
    out.height = bound.w / aspect.w * aspect.h
  }
  return center(out, bound: bound)
}
```

# 設定値を使う人が変更できるようにしたい

例として、変数speedを変更する場合を考えます。

```Swift:var
class Hud {
  var speed = 1.0
}
```

何度もクラスを作る場合に、前回の設定値を覚えておくようにしたい場合は、
不揮発であればUserDefaultsに、揮発でよければSingletonClassに保存して置くと思います。
今回は後者を使いました。

```Swift:Singleton
class HudConfig {
  var speed = 1.0
  class var shared: HudConfig {
    struct Static {
      static let instance: HudConfig = HudConfig()
    }
    return Static.instance
  }  
}

//HudがHudConfig.shared.speedを読みにいく
```

# 進捗
- とりあえずHudがでるようになった
- まだまだ作りが雑である
- ToastやProgress(Spinner)を出せるようにしたい

![スクリーンショット 2015-04-30 5.30.37.png](https://qiita-image-store.s3.amazonaws.com/0/77174/09d666e9-bd52-b73e-5d9f-c1eb33e5e3eb.png "スクリーンショット 2015-04-30 5.30.37.png")
pacman -Syuでハマった点(2015/04/30) postfix3, GPG鍵

* [archLinux - pacman -Syu で ハマった点(2015/10/16) - Qiita](http://qiita.com/tukiyo3/items/148d76c41cfbcdd1f140)

# エラー: 処理を完了できませんでした (無効または破損したパッケージ (PGP 鍵)

## 参考

* [small issue with default [Y/n] option on key import / Pacman & Package Upgrade Issues / Arch Linux Forums](https://bbs.archlinux.org/viewtopic.php?id=181057)
* [エラー: 処理を完了できませんでした (無効または破損したパッケージ (PGP 鍵)) | Log](http://nade.wktk.so/?p=245)

## 鍵が期限切れ

```bash:
$ pacman-key --list-sigs | grep anatol
gpg: *注意*: 信用データベースが、書き込み不能です
uid       [期限切れ] Anatol Pomozov <anatol.pomozov@gmail.com>
sig 3        753E0F1F 2014-02-04  Anatol Pomozov <anatol.pomozov@gmail.com>
```

## 鍵更新

```bash:
$ sudo pacman-key --lsign-key 753E0F1F
  -> キーに署名 753E0F1F...
==> 信用データベースを更新...
gpg: 次回の信用データベース検査は、2016-01-22です
$ sudo pacman-key -r 753E0F1F
gpg: 鍵753E0F1Fをhkpからサーバpool.sks-keyservers.netに要求
gpg: 鍵753E0F1F: "Anatol Pomozov <anatol.pomozov@gmail.com>" 新しい署名を5個
gpg: 「まぁまぁの信用」3、「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   5  信用: 0-, 0q, 0n, 0m, 0f, 1u
gpg: 深さ: 1  有効性:   5  署名:  60  信用: 0-, 0q, 0n, 5m, 0f, 0u
gpg: 深さ: 2  有効性:  60  署名:   4  信用: 60-, 0q, 0n, 0m, 0f, 0u
gpg: 次回の信用データベース検査は、2016-01-22です
gpg:         処理数の合計: 1
gpg:           新しい署名: 5
==> 信用データベースを更新...
gpg: 次回の信用データベース検査は、2016-01-22です
```

# Import PGP key error

* [upgrade error](https://forum.manjaro.org/index.php?topic=19647.0)

> :: Import PGP key 4096R/, "Antonio Rojas <arojas@us.es>", created: 2014-10-21? [Y/n] y

```bash:
pacman -S archlinux-keyring
```

これでOK

# データベースのバージョンが間違っています: /var/lib/pacman/

```bash:
$ pacman -Ql
エラー: alpm ライブラリの初期化に失敗しました
(データベースのバージョンが間違っています: /var/lib/pacman/)
エラー:   pacman-db-upgrade を実行してください
$ sudo pacman-db-upgrade
```

# fatal: /usr/lib/postfix/postfix-script: No such file or directorypostfix

* 参考: [Archlinux: Upgrade breaks Postfix | erix.io](http://www.erix.io/?p=18)

postfixが3系に上がったが、サービスが起動失敗していることを確認。

```diff:/etc/postfix/main.cf
-daemon_directory = /usr/lib/postfix
+daemon_directory = /usr/lib/postfix/bin
```
ActiveRecord の scope で nil などを返した時の挙動

ActiveRecord の scope で、引数の値が有効の場合にのみ、その値で条件を指定する以下のようなスコープを考えます

```rb
class Hoge < ActiveRecord::Base

  # 引数 name に値があれば、その値と name が同一のものでフィルタする
  scope :fuga, -> name do
    if name.present?
      where(name: name)
    else
      all # Rails3 の場合は all でなく scoped
    end
  end
end
```

実は `scope` の結果として `nil` や `false` を返した時は `all` (Rails3 なら `scoped`) がそのまま適用されるようになっています。
ゆえに、上記コードのように明示的に `all` を返す必要はありません。
以下のように else は省略できます。

```rb
class Hoge < ActiveRecord::Base
  scope :fuga, -> name do
    if name.present?
      where(name: name)
    end
  end
end
```

なお、好みの問題ですがここまで短ければ自分の場合は１行で書く派。

```rb
class Hoge < ActiveRecord::Base
  scope :fuga, -> name { where(name: name) if name.present? }
end
```
WindowsにCompassをインストールする方法

# Rubyのインストール
Compassを動かすためにはRubyが必要。

## RubyInstallerでRubyをインストール（Windows用）

### インストーラーの入手

* [RubyInstaller](http://rubyinstaller.org/)

(Ruby公式サイトから > Installation > Windows > [RubyInstaller](http://rubyinstaller.org/)と移動)

### インストール
以下のチェックボックスを選択、有効にしてインストールすると楽ちん。

* PATHの設定
* .rb, .rbwファイルの関連付け

# Compassのインストール

次のコマンドを実行

```bat
gem install compass
```

Windowsを再起動しておく。

# テスト

適当なディレクトリを作成し、cdで移動して`compass init`を実行し、ファイルを生成する。

`compass watch`を実行しておけば自動でコンパイルされる。
GUIのボタンの右に▼を入れる

# GUIでポップアップを作りたかった #

1. GUIでポップアップを作ろうと思った(EditorWindowで遊んでた)
2. ポップアップメニューによくある右のやつ（![スクリーンショット 2015-04-30 02.14.30.png](https://qiita-image-store.s3.amazonaws.com/0/77177/7dbc5d57-14a7-653e-6735-b650277d6ec6.png)
）を表示したかった
3. GUIStyleとか調べたけどそんなもんはねえって言われた
4. GetCursorPixelPositionを使って長さ計測してちょうどいい感じにするやり方の話

その他やったこと
* 画像を使ってimagePositionでできないの？
　　右側なんてオプションはねえ
* GUIStyle.overflowでずらせば？
　　文字よりも画像のほうが先に描画された

## GetCursorPixelPosition の使い方 ##
public Vector2 GetCursorPixelPosition(Rect position, GUIContent content, int cursorStringIndex);

公式ドキュメントにすら「Get the pixel position of a given string index.」とかしか書いてないこのメソッドは試してみたところ

positionを起点としてこのスタイルでcontentの内容を描画した時cursorStringIndexの文字の**描画位置の左上**を返してくれる

ということがわかったのでこれを元にforで回して描画範囲を超えたらその一個前で止めるってことにしました。
(多分空白計算したほうが早いけど思考停止)

```lang
                var text = content.text;
                int i = 0;
                int border = (int)(rect.position.x + rect.size.x);
                for (; ; i++)
                {
                    content.text = text + new String(Enumerable.Repeat(' ', i).ToArray()) + "▼▼";//これがボーダー超えるまで回す
                    var s = style.GetCursorPixelPosition(rect, content, content.text.Length);
                    if (s.x > border)
                    {
                        break;
                    }
                }
                content.text = text + new String(Enumerable.Repeat(' ', i).ToArray()) + "▼";

                if (GUI.Button(rect, content, style))
                {
                    //やりたいこと
                }
```

これでとりあえずいいかんじになりました。
![スクリーンショット 2015-04-30 02.40.36.png](https://qiita-image-store.s3.amazonaws.com/0/77177/3cb1c602-b8c0-5d21-a155-1fdb6fd30149.png)

というわけで出来たはできたんだけどUnityちゃんの便利な機能でできませんかね！
EditorGUILayout使えってことですね！
JMeterの簡単な使い方まとめ

# これは何？
* JMeterを使って、RESTAPIの簡単な負荷テストができるまでの覚え書き

# 起動画面

![](http://i.gyazo.com/0a0018d225767cfbd6f605c8a15a67a1.png)

# テスト計画
1. 【テスト計画】を右クリック
2. 【追加】→【Threads(Users)】→【スレッドグループ】を選択
3. 【スレッドグループ】をツリーから選択
4. スレッド数、Ramp-Up期間（秒）、ループ回数を設定
5. 【スレッドグループ】右クリック
6. 【追加】→【サンプラー】→【HTTPリクエスト】をクリック
7. 【HTTPリクエスト】がツリーに表示されていることを確認（※　設定方法については後述）
7. 【スレッドグループ】右クリック
8. 【追加】→【リスナー】→【統計レポート】をクリック
9. 【統計レポート】がツリーに表示されていることを確認

完成イメージ（例）
![ツリー](http://i.gyazo.com/6f35b4282bc519f72bfc8711fb14a642.png)

# HTTPリクエストの設定

![](http://i.gyazo.com/c23011c315ba867c784262ae70832bb8.png)

* サーバ名またはIP、ポート番号を入力
* プロトコルは【HTTP】or【HTTPS】を入力（必要に応じて）
* メソッドも必要なものを選択
* パスはテストしたい対象のパスを入力。今回は ```http://localhost:9000/1/users/``` をテストしたいので、【/1/users/】 と入力

※　Parameters　などパラメータが必要なものにはこちらを入力したりする。

# スレッドのプロパティについて
![スレッドのプロパティ](http://i.gyazo.com/ea9ae5e2c553244f507912b67a1d2b48.png)

* テストの総回数 = 【スレッド数】×【ループ回数】
* 1秒あたりのテスト回数　= 【テストの総回数】÷【Ramp-Up期間(秒)】

参考：
http://www.techscore.com/tech/Java/ApacheJakarta/JMeter/answer/1-1/

# 統計レポートの見方

![統計レポート例](http://i.gyazo.com/c71034fa30d555a5606321a59ebabe93.png)

|ヘッダ|意味|
|:-----------:|:------------:|
|Label|サンプラーの名称|
|#Samples|サンプル数|
|Average|平均応答時間（ms）|
|Median|応答時間の中央時（ms） |
|90%Line|90％タイル（90％この値以下）|
|95%Line|95％タイル（95％この値以下） |
|Min|最小応答時間（ms）|
|Max|最大応答時間（ms）|
|Error%|エラーの割合（％）|
|Throughput|request/sec |
|KB/sec|1秒あたりの平均転送KB |

参考
http://sy5.sakura.ne.jp/jmeter/ref/listener/aggregatereport.html
http://ogsheltie.blogspot.jp/2011/08/jmeter_26.html
MS VisualStudio Code(preview)のダウンロード

まだ Previewバージョンですけど Microsoftのcross-platform editor発表されました、VisualStudio Code。
僕は `vim`と`atom`ユーザーだけど、 VSはかっこいいな。
ダウンロードはこちら
https://code.visualstudio.com/

built-inコードサポートは　ASP.NET 5 development with C#, Node.js（development with TypeScript and JavaScript）。

`Go`コード試したら、syntax-highlight対応してる、いいな。
Android端末でのUnityプロファイル


Unity5になると無料版でもProfilerが使えるということで、日頃重さに苦労しているAndroid端末の処理負荷を計測してみました。

ただ、UnityのProfiler平均値がとれないのと、計測結果のが安定しないのでだいたいの平均値になります（´・ω・`）


##検証環境
Unity5 5.0.1f1
AQUOS PHONE IS12SH
Android 2.3.3

##検証１ Rigidbody2D+Collider2D
RigidbodyがついていないColliderを動かすと処理負荷があがるらしいので、実際にどのくらいの変化があるのか検証

```検証スクリプト
	void Start () {
		gameObject.transform.position = new Vector3 (1.0f, 0.0f);
	}	
	void Update () {
		// 適当にうごかす
		gameObject.transform.position = -gameObject.transform.position;
	}
```

・Rigidbodyなし Collider2Dをつけたオブジェクト

| 関数 | 処理負荷 |
|:-----------|------------:|
|MoveTest.Update|0.12ms 〜 0.18ms|
|Physics.Processing|0.72ms 〜 0.76ms|
|Physics2D.FixedUpdate|0.06ms 〜 0.09ms|

・Rigidbodyあり COllider2Dをつけたオブジェクト

| 関数 | 処理負荷 |
|:-----------|------------:|
|MoveTest.Update|			0.03ms 〜 0.09ms|
|Physics.Processing|		0.42ms 〜 0.76ms|
|Physics2D.FixedUpdate|		0.12ms 〜 0.18ms|


###あまりかわらない・・？

１０個分のオブジェクトを作成してみた
・Rigidbodyなし Collider2Dをつけたオブジェクト

| 関数 | 処理負荷 |
|:-----------|------------:|
|MoveTest.Update			|0.67ms 〜 0.94ms|
|Physics.Processing		|0.30ms 〜 0.57ms|
|Physics2D.FixedUpdate		|0.12ms 〜 0.24ms|

・Rigidbodyあり COllider2Dをつけたオブジェクト

| 関数 | 処理負荷 |
|:-----------|------------:|
|MoveTest.Update|			0.24ms 〜 0.33ms|
|Physics.Processing|		0.30ms 〜 0.57ms|
|Physics2D.FixedUpdate|		0.42ms 〜 0.70ms|

##考察
Rigidbodyがない場合は MoveTest.Update 、ある場合は Physics2D.FixedUpdateが上がっている。

![スクリーンショット 2015-04-29 23.50.26.png](https://qiita-image-store.s3.amazonaws.com/0/46534/f28a9205-04ce-3d8b-646f-5b79576646ec.png "スクリーンショット 2015-04-29 23.50.26.png")
Rigidbodyがない場合は MoveTest.Updateのなかで CircleColiderの再作成を行っているので、こちらの処理をMoveTest.Updateで行うか、Physic2D.FixedUpdateで行うかの違いしかないのかもしれません。