OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShellでIISのWebSite自動開始設定を変更する


PowerShellでIISの操作をしていたらサイトの自動開始設定がちょっとめんどくさかった。
環境は Windows 7, PowerShell 4.0 です。

## Web Administration モジュールだとうまくいかない......

Web Administration モジュールにあるコマンドレットを使えばIISの操作は何でもできるもんだと……そう思ってました。

とりあえずWebサイトのプロパティとメソッドを見てみると

```ps1
PS > Get-Website -Name "Default Web Site" | Get-Member

   TypeName: Microsoft.IIs.PowerShell.Framework.ConfigurationElement#site

Name                       MemberType            Definition
----                       ----------            ----------
Start                      CodeMethod            void Start()
Stop                       CodeMethod            void Stop()
 ...
GetAttributeValue          Method                System.Object GetAttributeValue(string attributeName)
 ...
SetAttributeValue          Method                void SetAttributeValue(string attributeName, System.Object value)
 ...
serverAutoStart            NoteProperty          System.Boolean serverAutoStart=False
 ...
```
なんだか "serverAutoStart" とかいうそれっぽいのがいるけど "NoteProperty" なので直接設定するのはダメそう。
でも "SetAttributeValue" があるじゃん！ と嬉しくなりやってみると怒られる。

```ps1
PS > (Get-Website -Name "Default Web Site").SetAttributeValue("serverAutoStart", $True)
"2" 個の引数を指定して "SetAttributeValue" を呼び出し中に例外が発生しました: "構成オブジェクトは、ServerManager.CommitChanges() の呼び出しによってコミットされたため、読み取り専用になっています。書き込みアクセスが必要な場合は、ServerManager を使用して新しい参照を取得してください。"
発生場所 行:1 文字:1
+ (Get-Website -Name "Default Web Site").SetAttributeValue("serverAutoStart", $True)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : InvalidOperationException
```
"ServerManager" を使えとのことだ。

## ServerManager で設定する

ServerManager はデフォルトでは使えないのでアセンブリをインポートする。

```ps1
PS > [System.Reflection.Assembly]::LoadFrom("$env:systemroot\system32\inetsrv\Microsoft.Web.Administration.dll")
PS > $sm = New-Object Microsoft.Web.Administration.ServerManager
PS > $sm.Sites["Default Web Site"].ServerAutoStart = $True
PS > $sm.CommitChanges()
```
このとき注意しなくてはいけないのは、
`[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Administration")` 
のように名前の部分一致でインポートすると IIS Express の ServerManager をインポートしてしまうことがあるので、上記のようにフルパスで指定してあげたほうが安全。
最後の`CommitChanges()`も忘れずに。

これでIISのサイトの自動開始設定をPowerShellで変更できました。
んー、なんかせっかく Web Administration モジュールあるのにコマンドレットでバシッと設定できないのだろうか……。
IntelliJ(or WebStorm)でElectron開発環境を準備する


あまり情報が無かったので整理

## 新規プロジェクト

electron用のプロジェクトは未だないので、`Node.JS and NPM`を指定して作りました。空プロジェクトからでもいけますが、使える部分は流用

## ライブラリ設定

ECMAScript6とかを認識させたい場合は、`Language & Frameworks > Javascript > Libraries`から追加をしていく

![スクリーンショット 2016-02-24 15.05.15.png](https://qiita-image-store.s3.amazonaws.com/0/31824/4756b26e-474b-c05e-7881-8bea7281dd28.png "スクリーンショット 2016-02-24 15.05.15.png")

## ESLint

ESLintを使う場合は、`Languages & Frameworks > Javascript > Code Quality Tools > ESLint`を設定する

* Node interpreter: $HOME/.anyenv/envs/ndenv/shims/node  
  私の場合はnodeはanyenv経由でインストールしているのでこの設定です
* ESLint package: /project_dir/node_modules/eslint  
  ESLint自体はプロジェクトのnode_modulesを利用(お好み)
* Search for .eslintrcにチェック  
  /project_dir/.eslintrcを見て、なければ$HOME/.eslintrcを見る設定に

![スクリーンショット 2016-02-24 15.03.39.png](https://qiita-image-store.s3.amazonaws.com/0/31824/941db3e9-02cf-4ef2-5447-00c42bf07b58.png "スクリーンショット 2016-02-24 15.03.39.png")

### .eslintrcの設定

ElectronをES6に則って作成する場合は色々と追加設定が必要です。
以下サンプルですが、`ecmaFeatures`や`env`の各種設定が無いとエラーでまくりです

```json
{
  "extends": "eslint:recommended",
  "parser": "babel-eslint",
  "react/jsx-uses-react": 1,
  "ecmaFeatures" : {
    "jsx": true,
    "objectLiteralShorthandMethods" : true
  },
  "plugins": [
    "react"
  ],
  "rules": {
    "strict": 0,
    "indent": [ 2, 2],
    "semi": [2, "always"],
    "no-console": 0
  },
  "env": {
    "es6": true,
    "node": true,
    "browser": true
  }
}
```

## Run/Debug Configurations

デバッグボタンによる実行は以下の通り設定する

* Node interpreter: /project_dir/node_modules/.bin/electron
* Node parameters: .
* Working directory: /project_dir

`electron`の内部で`/usr/bin/env node`やってるので、nodenvとかやってる人とかでもこの設定でいいはず

![スクリーンショット 2016-02-24 15.02.15.png](https://qiita-image-store.s3.amazonaws.com/0/31824/cab9a6d7-c180-214a-e161-0a563ac8a1c3.png "スクリーンショット 2016-02-24 15.02.15.png")

## 作ってみた

実際にこの設定をしたIntelliJを元にElectronを作ってみました

[Electron+ReactなサンプルアプリをES6で作成する](http://qiita.com/kegamin/items/e08923d46bb9df9cf283)
powershell > Link > コピペの仕方 / Qiita:コメント検索が難しい

以前、自分のpowershellの記事にいただいたコメントを探していた。

以下がようやく見つかった。
http://qiita.com/7of9/items/ab3cc31827ca4033dce9#comment-68c016aca9db07d56e71


コメントの検索を試みたが、検索に時間がかかってしまった。

- コメント一覧を１ページずつ確認 (50ページ目で挫折)
  - 挫折
- powershellタグで検索
  - 挫折
- powershellキーワードで検索して、コメントつきの記事を１つずつ確認
  - 挫折
- google検索(キーワードinurl:qiita.com powershell 編集, など)
  - 挫折

ほぼあきらめかけたときに「title:powershell」検索してコメントつきのものを一つずつ確認してようやく見つけた。

自分が欲しい情報を引き出す方法をもう少し吟味しないといけない。
Blade内でのuseメモ

#Blade内でuseの記述

####ちょっと大変  
```lang:blade.php
@if ( \PATH\PATH\MyClass::staticMethod() )
    :
    :
@endif
@if ( \PATH\PATH\MyClass::staticMethod() )
    :
    :
@endif
```

####useでちょっとシンプル  
```lang:blade.php
<?php use \PATH\PATH\MyClass; ?>
@if ( MyClass::staticMethod() )
    :
    :
@endif
@if ( MyClass::staticMethod() )
    :
    :
@endif
```
JMeter入門(2) 実行編

# 目的
今回はJMeterを使って負荷テストを実行してみます
負荷テストを行うサイトはPC内に構築したテストページを使用しています



# JMeter設定

## テスト計画
JMeterを起動した画面でテスト計画を設定することが出来ます
今回は**"jmeter_test"**としています

![テスト1.png](https://qiita-image-store.s3.amazonaws.com/0/110087/9778bb2c-b40a-4ea1-2a07-0fcb6dd57e64.png)

## スレッドグループ
スレッドグループではこのテストでどれくらい負荷を掛けるか設定が出来ます

左のメニューから作成したテスト計画名の部分を右クリックし
**[追加] > [Threads (users)] > [スレッドグループ]**
の順で選択します

![テスト2.png](https://qiita-image-store.s3.amazonaws.com/0/110087/843565f6-5d17-fe35-1499-d432952c7c39.png)

### 名前、コメント

今回は次のように記入

* **名前**：「index.htmlに対して1分間に10000アクセス」
* **コメント**：「同時接続数100」

### スレッドプロパティ

* **スレッド数**：100  
JMeterが生成するクライアント数（要するに仮想ユーザー数）
* **Ramp-Up期間(秒)**：20  
何秒間で全スレッドを生成するか指定する  
「スレッド数:100」「Ramp-Up期間(秒):10」にした場合、1秒で10個のスレッドが生成され実行される  
「Ramp-Up期間(秒):0」にした場合、全てのスレッドが同時に生成され実行される
* **ループ回数**：100  
各スレッドが実行シナリオをループする回数
有限回で修正したい場合は「無限ループ」のチェックを外し、回数を指定する

![テスト3.png](https://qiita-image-store.s3.amazonaws.com/0/110087/066509d8-3060-0826-316a-760ff19e5d17.png)

## テストシナリオ

各スレッドにどういったテストをさせたいか設定します

左のメニューのスレッドブループ名を右クリックし
**[追加] > [サンプラー] > [HTTP リクエスト]**
の順で選択します

![テスト4.png](https://qiita-image-store.s3.amazonaws.com/0/110087/ae9a45dc-3b15-2c1e-9d12-cabcb7d23c6c.png)

### HTTPリクエスト設定

* **名前**：index.html (とりあえずテスト対象のページ名)
* **Webサーバ**  
 * **サーバ名またはIP**：localhost  
 対象のページのIPまたはホスト名を入力する
 * **ポート番号**：80
* **HTTPリクエスト**
 * **プロトコル**：http
 * **メソッド**：GET
 * **パス**：/jmeter_test/index.html

![テスト5.png](https://qiita-image-store.s3.amazonaws.com/0/110087/07145849-325d-885e-1184-37602e07326b.png)

## テスト結果

テスト結果を得るための設定をします

左のメニューのスレッドブループ名を右クリックし
**[追加] > [リスナー] > [結果を表で表示]**
の順で選択します

![テスト6.png](https://qiita-image-store.s3.amazonaws.com/0/110087/6f1c63e6-e154-96be-fb40-66e14d6766e6.png)

もうひとつ設定をします

左のメニューのスレッドブループ名を右クリックし
**[追加] > [リスナー] > [統計レポート]**
の順で選択します

![テスト7.png](https://qiita-image-store.s3.amazonaws.com/0/110087/4f12b6a7-b6e6-a576-8fd2-8eb725f6b4b2.png)

これで一通りの設定は完了です

# テスト実行

テストを実行するにはGUIメニュー上にある、緑の三角を選択してください

![テスト8.png](https://qiita-image-store.s3.amazonaws.com/0/110087/dca3933e-311d-f515-1845-d4b6633827ac.png)

選択するとテストが実行されます
テストが実行されると、画面右上の数値が動きます。
この数値が(0/スレッド数)で停止したら完了です

![テスト9.png](https://qiita-image-store.s3.amazonaws.com/0/110087/0f01c867-5f9c-7764-767b-f017bfecc911.png)

# テスト結果

テスト結果はテスト実行中にリアルタイムで確認可能です

上で設定した、[結果を表で表示]と[統計レポート]を見ると以下のように表示されます

![テスト10.png](https://qiita-image-store.s3.amazonaws.com/0/110087/84402a16-effc-09b0-9749-86da049ea96c.png)

![テスト11.png](https://qiita-image-store.s3.amazonaws.com/0/110087/a4030639-a7ec-f3e7-11f1-3b069ef1fb30.png)
git mergeコマンドのオプションまとめ

備忘録。
## --ff

デフォルト設定。オプションに何も指定しない場合は、このオプションが適用される。
`ff`は`fast-foward`の略。

gitでいうところの「`fast-forward`な関係」とは、二つのブランチが同じ線上にある状態のこと。
つまり、ブランチAがブランチBの延長線上にあり二つが枝別れしていない状態のことを指す。

```zsh
$ git merge --ff {branch_name}
```
 
マージする二つのブランチが`fast-forward`な関係の場合、マージコミットは作られない。マージ元ブランチのheadがマージ先ブランチのheadに移動するだけ。

二つのブランチが`fast-forward`な関係でない場合は、マージコミットが作られる。
## --no-ff

```zsh
$ git merge --no-ff {branch_name}
```

マージする二つのブランチが`fast-forward`な関係であってもそうでなくても、必ずマージコミットが作られる。
## --squash

```zsh
$ git merge --squash {branch_name}
```
マージする二つのブランチが`fast-forward`な関係であってもそうでなくても、マージコミットは作られない。 
ワークツリーとインデックスのみ、マージ元ブランチの変更分がすべて取り込まれた状態になる。
トピックブランチのコミットを一つにまとめたい場合などに使う。
SPFリソースレコードタイプを書くのは情弱

#SPFレコードはTXTリソースレコードタイプで設定

こんにちは、情弱でした。

スパムメールと判定されないようにメール送信のサーバたてる場合はSPFレコードを設定します。
SPFについては、以下がよくまとまっております。

なりすましメール撲滅に向けたSPF（Sender Policy Framework）導入の手引き
https://www.ipa.go.jp/security/topics/20120523_spf.html

で、DNSの設定をする必要がありますが、[RFC7208 14.1.  The SPF DNS Record Type](http://tools.ietf.org/html/rfc7208#section-14.1) によると、SPFリソースレコードタイプは相互接続に問題があるため、使用は不適切との記載があります。

SPFのレコードはTXTリソースレコードタイプのみで記載します。

ということで、この部分誤って(併記する等)説明している記事もあるのでご注意ください。

# 参考リンク

[Amazon Route53のSPFの説明](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/ResourceRecordTypes.html#SPFFormat)

[RFC7208 14.1.  The SPF DNS Record Type](http://tools.ietf.org/html/rfc7208#section-14.1)

[SPFのシンタックス](http://www.openspf.org/SPF_Record_Syntax)
fastlane の action だけ実行する

READMEとかに書いてないけど、ソース見たらあった。
fastlaneコマンドのhelpにも書いてあった。

```
$ fastlane run [action] key1:value1 key2:value2
```

[この辺](https://github.com/fastlane/fastlane/blob/master/bin/fastlane#L100-L109)に書いてある。

action作るときとかに使えるね :smile:
rsync + sshによるリモート同期

# rsync + sshによるリモート同期する方法について

* パッケージの導入

```
yum -y install libxml2-devel lua-devel lua-static lsyncd xinetd rdiff-backup rsync openssl
```

* 同期するユーザを作る

```
useradd -u 666 syncuser
passwd syncuser
```

* すでにある場合はそのユーザでになってホームに移動

```
su - syncuser
cd
```

* 鍵を作る

```
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
cp ~/.ssh/id_rsa ~/.ssh/synckey.pem
```

* 鍵を互いにコピーする:[転送先]⇔[転送元]

```
[転送元] ※かぶらないように名前を変えて転送
scp ~/.ssh/authorized_keys syncuser@[転送先IP]:/home/syncuser/.ssh/authorized_keys2

[転送先]
cd ~/.ssh/
cat authorized_keys2 >> authorized_keys
rm authorized_keys2
```

* 鍵のパーミッションを変更する

```
[転送元]
chmod 400 ~/synckey.pem
```

* 実際に転送するコマンド

[転送元]⇒[転送先]

```
/usr/bin/rsync -auz -e "ssh -i ~/synckey.pem" /home/syncuser/ syncuser@[転送先IP]:/home/syncuser/
```

[転送先]⇒[転送元]

```
/usr/bin/rsync -auz -e "ssh -i ~/synckey.pem" syncuser@[転送元IP]:/home/syncuser/ /home/syncuser/
```

※セキュリティリスクが無く、Linuxのコマンドに慣れているなら同じauthorized_keysとid_rsaを複数の環境に適用してもいい。
powershell > ファイルの最終更新日付を変更する > Set-Item Property data.csv -Name LastWriteTime -Value "02/20/2014 12:30 AM"

ファイルの日付(LastWriteTimeなど)を変更するのはPowershellで可能。

以下に方法が記載されていた。
http://qiita.com/kmr_hryk/items/882b4851e23cec607e70

やってみた。

```
PS> Set-Item Property data.csv -Name LastWriteTime -Value "02/20/2014 12:30 AM"
```

data.csvのファイルが「2014年2月20日 12時30分」となった。
iPhone アプリを Universal 化するために最低限必要なこと


作っていた iPhone アプリをせっかくなので iPad にも対応(Universal化)させてみようと思って調べました。
＃本当は iPad と iPhone で UI を変えるのがベストですがとりあえず対応させるところまでやってみました。

# プロジェクトの設定を「Universal」にする

プロジェクトの General タブで Device の設定を Universal にします。

![Screenshot 2016-02-24 13.47.10.png](https://qiita-image-store.s3.amazonaws.com/0/27210/9367607e-d27c-afc3-d2c7-fd84322cdd14.png "Screenshot 2016-02-24 13.47.10.png")


# iPad用アイコンの追加

Universal に設定して「New iOS AppIcon」を追加すると iPad 用アイコンが設定できるようになります。

- iPhone 用の時の AppIcon
![Screenshot 2016-02-24 14.03.36.png](https://qiita-image-store.s3.amazonaws.com/0/27210/37ba6532-9831-1f80-fb06-6823d47b962a.png "Screenshot 2016-02-24 14.03.36.png")

- Universal 時の AppIcon 
![Screenshot 2016-02-24 14.04.15.png](https://qiita-image-store.s3.amazonaws.com/0/27210/4731355f-aeae-fb2f-6412-0d3045e26d12.png "Screenshot 2016-02-24 14.04.15.png")

追加で必要なアイコンサイズはこちら。

|Device|Icon size|
|:---|:---|
|iPad and iPad mini (@2x)|152 x 152|
|iPad 2 and iPad mini (@1x)|76 x 76|
|iPad Pro (@2x)|167 x 167|

# 対応する向きの追加

iPad に対応する場合、全方向の回転に対応する必要があります。そうしないと Validation が通りません(おそらく審査も)。

```
The iPad Human Interface Guidelines state that an iPad application should be able to run in all orientations. XXXX is only supporting one variant of the portrait orientation. While we understand there are certain applications that need to run in the portrait orientation, it would be appropriate to support both variants of this orientation in your application.
```

iPhone アプリの時点で全方向の回転に対応していればいいのですが iPhone 版で回転した状態で利用を想定していない、そもそも iPhone 版では回転させたくないケースもあると思います。その場合は iPhone と iPad でそれぞれ許可する回転方向を指定します。

```info.plist
...
<key>UISupportedInterfaceOrientations~iphone</key>
<array>
	<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
  <string>UIInterfaceOrientationLandscapeLeft</string>
  <string>UIInterfaceOrientationLandscapeRight</string>
  <string>UIInterfaceOrientationPortraitUpsideDown</string>
  <string>UIInterfaceOrientationPortrait</string>
</array>
...
```

これで審査に出すと無事通過しました。
php-buildで指定できる環境変数

環境変数を指定することでphp-buildの挙動を変更することができる。

## PHP_BUILD_CONFIGURE_OPTS

`configure`オプションを指定できる。もちろん、definitonファイルを書き換えても同じことができる。

```
PHP_BUILD_CONFIGURE_OPTS=--with-png-dir=/usr/local/
```

## PHP_BUILD_EXTRA_MAKE_ARGUMENTS

`make`につけるオプションを指定できる。

```
PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4
```

## PHP_BUILD_KEEP_OBJECT_FILES

`make clean`を行わず、オブジェクトファイルを保存するよう指定できる。作ったPHPバイナリに対してgdbでデバッグするような場合に便利。

```
PHP_BUILD_KEEP_OBJECT_FILES=on
```

## PHP_BUILD_ZTS_ENABLE

ZTSを有効にしたPHPを作ることができる。

```
PHP_BUILD_ZTS_ENABLE=on
```

# 実際の実行例

## gdb/lldbでトレースするとき用バイナリの生成

```
$ PHP_BUILD_KEEP_OBJECT_FILES=on PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 CFLAGS="-O0 -g" phpenv install 7.2.2
```
CarrierWaveでUploaderごとに保存するディレクトリを変える

調べてもうまく探せなかったので備忘録として。

CarrierWaveでUploaderごとにディレクトリを分けたいケースがあると思います。プロフィール画像は`public`においてもいいけど、ユーザの投稿画像は別のところに置きたいとか。

`config/initializers/carrierwave.rb`に、下記のように定義すれば、`public`以外のところにファイルの保存先を自由に定義できます。

```rb:config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  config.root = "#{Rails.root}/private"
end
```

https://github.com/carrierwaveuploader/carrierwave/wiki/How-To%3A-Secure-Upload)


ただ、この方法だと前述のようにUploaderごとに変えたい場合にはうまく行きません。なので、下記のようにUploaderの中で書いてあげればうまくいきました。

```rb:app/uploaders/hoge_uploader.rb
class HogeUploader < CarrierWave::Uploader::Base

  storage :file

  def root # ここでrootを書いてあげる
    "#{Rails.root}/private"
  end
end

```
tmuxinatorが起動しない: Could not find 'tmuxinator' (>= 0) among 11 total gem(s) (Gem::LoadError)


Homebrewで入れたRubyを2.3にアップグレードしたら、tmuxinatorが起動できなくなりました。

エラーメッセージ:

```
/usr/local/Cellar/ruby/2.3.0/lib/ruby/2.3.0/rubygems/dependency.rb:319:in `to_specs': Could not find 'tmuxinator' (>= 0) among 11 total gem(s) (Gem::LoadError)
Checked in 'GEM_PATH=/Users/suin/.gem/ruby/2.3.0:/usr/local/lib/ruby/gems/2.3.0:/usr/local/Cellar/ruby/2.3.0/lib/ruby/gems/2.3.0', execute `gem env` for more information
	from /usr/local/Cellar/ruby/2.3.0/lib/ruby/2.3.0/rubygems/dependency.rb:328:in `to_spec'
	from /usr/local/Cellar/ruby/2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_gem.rb:65:in `gem'
	from /usr/local/bin/mux:22:in `<main>'
```

解決策: tmuxinatorを入れ直す

```
gem install tmuxinator
```
Javascriptの等価演算子,  厳密等価演算子,  Object.is

javascriptの等価演算子の動作が複雑なことが良く知られていますが、どこがどう複雑なのか、まとめてみました。

# 等価演算子(==)

## 数値変換
String、Boolean、Numberのうち異なるものを比較するときは、すべてNumberに変換される。String->Numberの変換はparseIntの動作に準じ、Boolean->Numberは、trueが1、falseが0とみなされる。特に、StringとBooleanの比較は、以下のようにかなり直感に反した結果になるので注意。

```js
// 例
"123" == 123
"1" == true
"0" == false
"2" != true
"true" != true
```

## 文字列変換
オブジェクトをString, Number, Booleanと比較するときは、オブジェクトのtoString()またはvalueOf()の結果に基いて文字列に変換される。Number, Booleanと比較するときは、さらに上述の数値変換が適用される。特に配列が絡むと以下の例のようにトリッキーな比較になるので注意。

```js
// 例：
[1,2,3] == "1,2,3"
[1] == true
[0] == false
[123] == 123
[null] == ''
[] == ''
```

|         | String     | Boolean  | Number   | null  | undefined | Object     | NaN   |
|-----------|------------|----------|----------|-------|-----------|------------|-------|
| String    | 値         | 数値変換 | 数値変換 | FALSE | FALSE     | 文字列変換 | FALSE |
| Boolean   | 数値変換   | 値       | 数値変換 | FALSE | FALSE     | 文字列変換+数値変換   | FALSE |
| Number    | 数値変換   | 数値変換 | 値*1     | FALSE | FALSE     | 文字列変換+数値変換   | FALSE |
| null      | FALSE      | FALSE    | FALSE    | TRUE  | TRUE      | FALSE      | FALSE |
| undefined | FALSE      | FALSE    | FALSE    | TRUE  | TRUE      | FALSE      | FALSE |
| Object    | 文字列変換 | 文字列変換+数値変換 | 文字列変換+数値変換 | FALSE | FALSE     | 参照       | FALSE |
| NaN       | FALSE      | FALSE    | FALSE    | FALSE | FALSE     | FALSE      | FALSE |

*1 +0と-0は等しい

## 厳密等価演算子(===)

等価演算子との違いは、異なる種類の比較はすべてFALSEとなること。このため、上述のような暗黙の変換は行われない。

|       | String | Boolean | Number | null  | undefined | Object | NaN   |
|-----------|--------|---------|--------|-------|-----------|--------|-------|
| String    | 値     | FALSE   | FALSE  | FALSE | FALSE     | FALSE  | FALSE |
| Boolean   | FALSE  | 値      | FALSE  | FALSE | FALSE     | FALSE  | FALSE |
| Number    | FALSE  | FALSE   | 値*1   | FALSE | FALSE     | FALSE  | FALSE |
| null      | FALSE  | FALSE   | FALSE  | TRUE  | FALSE     | FALSE  | FALSE |
| undefined | FALSE  | FALSE   | FALSE  | FALSE | TRUE      | FALSE  | FALSE |
| Object    | FALSE  | FALSE   | FALSE  | FALSE | FALSE     | 参照   | FALSE |
| NaN       | FALSE  | FALSE   | FALSE  | FALSE | FALSE     | FALSE  | FALSE |

*1 +0と-0は等しい

## Object.is

厳密等価演算子との違いは、NaN !== NaNだが、Object.is(Nan, NaN) == trueとなることと、Object.is(+0, -0) == falseとなること

|       | String | Boolean | Number | null  | undefined | Object | NaN   |
|-----------|--------|---------|--------|-------|-----------|--------|-------|
| String    | 値     | FALSE   | FALSE  | FALSE | FALSE     | FALSE  | FALSE |
| Boolean   | FALSE  | 値      | FALSE  | FALSE | FALSE     | FALSE  | FALSE |
| Number    | FALSE  | FALSE   | 値*2   | FALSE | FALSE     | FALSE  | FALSE |
| null      | FALSE  | FALSE   | FALSE  | TRUE  | FALSE     | FALSE  | FALSE |
| undefined | FALSE  | FALSE   | FALSE  | FALSE | TRUE      | FALSE  | FALSE |
| Object    | FALSE  | FALSE   | FALSE  | FALSE | FALSE     | 参照   | FALSE |
| NaN       | FALSE  | FALSE   | FALSE  | FALSE | FALSE     | FALSE  | TRUE |

*2 +0と-0は等しくない
Linux系の主なバージョン確認方法のメモ

# OS
```bash:RHEL/CentOS
$ cat /etc/issue
$ cat /etc/redhat-release
```

```bash:Fedora
$ cat /etc/issue
$ cat /etc/fedora-release
```

```bash:Debian
$ cat /etc/issue
$ cat /etc/debian_version
```

```bash:OracleLinux
$ cat /etc/issue
$ cat /etc/oracle-release
$ cat /etc/redhat-release
```

```bash:Turbolinux
$ cat /etc/issue
$ cat /etc/turbolinux-release
```

```bash:SuSE
$ cat /etc/issue
$ cat /etc/SuSE-release
```

```bash:Mandriva
$ cat /etc/issue
$ cat /etc/mandriva-release
```

```bash:Vine
$ cat /etc/issue
$ cat /etc/vine-release
```

```bash:FreeBSD
$ uname -r
$ uname -a
```

# シェル系
# bash
```bash:RHEL/CentOS
$ bash -version
$ rpm -q bash
```

```bash:Ubuntu/Debian
$ bash -version
$ dpkg -l bash
```

```bash:ArchLinux
$ bash -version
$ pacman -Q bash
```

```bash:GentooLinux
$ bash -version
$ equery list bash
```

# サーバ系
## Webサーバ
```bash:Apache
$ httpd -v
$ apachectl -v
```

```bash:Nginx
$ nginx -V
```

## DBサーバ
```bash:MySQL
$ mysql --version
$ mysqladmin --version
$ mysqladmin -u username -p'password' version
```

```bash:PostgreSQL
$ psql --version
```

## メールサーバ
```bash:Sendmail
$ /usr/sbin/sendmail -d0.101
```

```bash:Postfix
$ postconf | grep mail_version
```

## DNSサーバ
```bash:BIND
$ /usr/sbin/named -v
```

# ネットワーク系
```bash:OpenSSL
$ openssl version
```

```bash:OpenSSH
$ /usr/bin/ssh -v
```

# 言語系
```bash:PHP
$ php -v
$ php composer.phar --version
```

```bash:Perl
$ perl -v
$ cpan -v
$ perldoc -v
```

```bash:Python
$ python -V
```

```bash:Ruby
$ ruby -v
$ gem -v
$ rails -v
```

# 開発系
```bash:git
$ git --version
```
```bash:Heroku
$ heroku --version
```
```bash:Docker
$ docker version
```

```bash:packer
$ packer -v
```

```bash:Vagrant/VirtualBox
$ vagrant -v
$ vagrant --version
$ veewee version
$ vboxmanage -v
```

```bash:Chef
$ chef-solo -v
$ chef-client -v
$ knife --version
$ knife -v
$ berks version
```

# フレームワーク系
```bash:CakePHP1
$ cat cake/VERSION.txt
```

```bash:CakePHP2
$ cat lib/Cake/VERSION.txt
```

```bash:CakePHP3
$ cat VERSION.txt
```

```bash:Symfony2
$ php app/console --version
```
c++ builder XE4, 10.2 Tokyo > fileIO > サブフォルダに含まれる全ファイル数取得の実装 > 日付期間でフィルタ

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/09)
```

http://qiita.com/7of9/items/2210b09d068fea5c5090
の機能追加版。

日付期間のフィルタを入れたい。


```Unit1.cpp
static int __fastcall s_getTotalFileNumbers_dateRange(String targetDir, TDateTime fromDt, TDateTime toDt)
{
    if (DirectoryExists(targetDir) == false) {
        return 0;
    }

    String filePattern = L"*.*";
    TStringDynArray fileList;
    TSearchOption option = TSearchOption::soAllDirectories; // all folders

    fileList = TDirectory::GetFiles(targetDir, filePattern, option);

    int filecnt = fileList.Length;
    TDateTime fildt;
    int skipcnt = 0;
    for(int idx = 0; idx < filecnt; idx++) {
    	fildt = TFile::GetLastWriteTime(fileList[idx]);
    	if (fildt < fromDt || fildt > toDt) {
    		skipcnt++;
    	}
    }
    return (filecnt - skipcnt);
}
```

日付の名前づけで to / from / tilなどの考慮した記事があり、それに自分もコメントしたのだが、その記事を検索でぱっと見つけられない。

delphiでの実装ではfunction()を使ってフィルタ処理を定義する例がある。ただし、DateStop, DateStartの定義の仕方がしっくりこない。
http://www.experts-exchange.com/questions/25103365/TDirectory-GetFiles-with-DateTime-filter.html
（tips的な何か）　eachとかした時にシンボルがどんな風に扱われるか

Ruby on Rails 上で　データを加工する時に、シンボルを扱う必要があって色々試したのでメモ。

# 環境
- Ruby 2.2.3

なお、pryを使って対話的に試しました。

# こんなハッシュを使います。


`[7] pry(main)> hash = { 1 => :hoge , 2 => :hige , 3 => :mage , 4 => :age , 5 => :sage } `

キーに整数値、値にシンボルとして扱う単語をセット。

## どんなシチュエーションだよ？！

スプレッドシートなどを読み込んで、Ruby上で何らかの処理を行いやすいように変換する時に・・・。
キー部分の整数がインプット側の何行目とか何列目を指す。
値の部分がアウトプット側のどの項目かに対応したりする。
（閑話休題）

# 色々試す。

上記ハッシュで、以下のような結果が出る処理を試みる。

1. "hige","mage"が検出された時には、検出対象の値が出たとメッセージを表示する。
2. "sage" が検出された時には、"2get"と表示する。


## 良くない例。

最初に作ったのがコレ。1. で期待した結果は得られていません。2.は満たすけど。

```rb:pryでハッシュの分解を試すが、あまり期待した結果が得られなかった
=> {1=>:hoge, 2=>:hige, 3=>:mage, 4=>:age, 5=>:sage}
[8] pry(main)> hash.each do |key,val|
[8] pry(main)*   puts " now key:#{key} val:#{val} "
[8] pry(main)*   case val
[8] pry(main)*   when /:hige|:mage/  
[8] pry(main)*     puts "hit #{val}"
[8] pry(main)*   when :sage  
[8] pry(main)*     puts "2get"
[8] pry(main)*   end  
[8] pry(main)* end  
 now key:1 val:hoge 
 now key:2 val:hige 
 now key:3 val:mage 
 now key:4 val:age 
 now key:5 val:sage 
2get
=> {1=>:hoge, 2=>:hige, 3=>:mage, 4=>:age, 5=>:sage}
```

ついでに言うと　`puts " now key:#{key} val:#{val} "`というコメントの表示方法も良くない。
val に相当するハッシュの値部分には、シンボルが入っているので・・・。

ここで表示された`val:hige`という記述を`:hige` などのシンボル的な何かと誤解する危険を伴う。
紛らわしい記述は極力避けなきゃ。

## ハッシュ内の値を表示しようとした時に、何が出てくるか

前項のようなコードを書いたのは「値にシンボルをセットしたハッシュの値部分を参照した時に、シンボルが出力される」という認識があったから。

実際に見てみると

```rb:ハッシュの中身を見てみる
[13] pry(main)> puts hash[2]
hige
=> nil
``` 

はい、値です。

## 再度実装

今度は、期待した結果を得ることができました。

```rb:ハッシュの値部分の内容に応じて分岐させる。
=> {1=>:hoge, 2=>:hige, 3=>:mage, 4=>:age, 5=>:sage}
[12] pry(main)> hash.each do |key,val|
[12] pry(main)*   puts " now key #{key} val #{val} "   
[12] pry(main)*   case val
[12] pry(main)*   when /hige|mage/   
[12] pry(main)*     puts "hit #{val}"
[12] pry(main)*   when :sage  
[12] pry(main)*     puts "2get"
[12] pry(main)*   end  
[12] pry(main)* end  
 now key 1 val hoge 
 now key 2 val hige 
hit hige
 now key 3 val mage 
hit mage
 now key 4 val age 
 now key 5 val sage 
2get
=> {1=>:hoge, 2=>:hige, 3=>:mage, 4=>:age, 5=>:sage}
```

ここでの注目点は

- 複数の値で同じ判定をさせたい時に、`/hige|mage/`のように、文字列として記述している。(3/20 追記　これでも間違っていないが、もともとのハッシュの値部分と記述がことなるので、あまりよくない。
- 一つのもので判定させたい時には、`:sage`のように、ハッシュで記述している。(3/20 追記：　正しくは、ハッシュの値部分に入っていたシンボル形式)

というところ。

# 修正：複数の値を指定する時も、ハッシュの値部分を直接指定する

 when 句の部分に複数のハッシュ値を指定することも可能です。
というか、そのほうが筋道としては正しい。

```terminal:ruby```
[1] pry(main)> hash = { 1 => :hoge , 2 => :hige , 3 => :mage , 4 => :age , 5 => :sage }

=> {1=>:hoge, 2=>:hige, 3=>:mage, 4=>:age, 5=>:sage}
[2] pry(main)> hash.each do |key,val|
[2] pry(main)*   puts " now key #{key} val #{val} "
[2] pry(main)*   case val 
[2] pry(main)*   when :hige, :mage  
[2] pry(main)*     puts "hit #{val}"
[2] pry(main)*   when :sage  
[2] pry(main)*     puts "2get"
[2] pry(main)*   end  
[2] pry(main)* end  
 now key 1 val hoge 
 now key 2 val hige 
hit hige
 now key 3 val mage 
hit mage
 now key 4 val age 
 now key 5 val sage 
2get
=> {1=>:hoge, 2=>:hige, 3=>:mage, 4=>:age, 5=>:sage}
```
aws cliでEC2 RDSの一覧を取得する

# AWS CLIでEC2/RDSの一覧をCSV or TSVで吐き出す

## やりたいこと
EC2/RDSの一覧及びインスタンスサイズ、プライベートIPとか、稼働状況とか一覧で欲しい。
（インスタンスサイズでの簡単な見積もりとかしたい時）

AWSのコンソールだとEC2やRDSのインスタンス一覧とか表示はできるが
CSVとかExcelには落とせないのでAWS CLIで一括で出力しました。


## 今回使用するAWS CLIコマンド

 EC２インスタンス情報取得
```aws ec2 describe-instances```
http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html

RDSインスタンス情報取得
```aws rds describe-db-instances```
http://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html

## 具体的なコマンド

JSONで結果が吐き出されるので整形のためjqを使いました。
本番環境だとjq入れられなかったりすると思うのでその場合はJSONをまるごと出力してローカルに持ってくるとかしましょう。


## EC2のインスタンス一覧出力
````aws ec2 describe-instances --region=ap-northeast-1 --filter "Name=instance-state-name,Values=running" | jq -r '.Reservations[].Instances[]|{PrivateIpAddress, InstanceType, Zone: .Placement.AvailabilityZone,  State: .State.Name, KeyName,  TagName: .Tags|map(select(.Key == "Name"))[0]|.Value}|@text "\(.PrivateIpAddress)\t\(.TagName)\t\(.InstanceType)\t\(.State)"'```

東京リージョンで稼働中のインスタンスの
プライベートIPアドレス、タグ名（インスタンス名）、インスタンスタイプ、稼働状況がタブ区切りで出力されます

````
10.10.10.111	xxxx-yyyy-1	t2.micro	running
10.10.10.122	xxxx-yyyy-2	r3.large	running
10.20.10.133	xxxx-yyyy-3	r3.large	running
10.20.10.144	xxxx-yyyy-4	c3.large	running
````
## RDSのインスタンス一覧出力

```aws rds describe-db-instances --region=ap-northeast-1 |jq -r '.DBInstances[] |{DBInstanceIdentifier,DBInstanceClass,MultiAZ,AllocatedStorage}|@text "\(.DBInstanceIdentifier)\t\(.DBInstanceClass)\t\(.MultiAZ)\t\(.AllocatedStorage)"'
```

インスタンス名、インスタンスタイプ、MultiAZ使用有無、ストレージサイズ(GB)　がタブ区切りで出力されます。

```
xxx-rds1-replica	db.t2.medium	false	20
xxx-rds1	db.m3.medium	true	20
xxx-rds2	db.t2.micro	true	5
```

上記以外のパラーメータが必要ならよしなにやってください
Chefのレシピでよく使うけど忘れがちなもの

Chefをファイル展開ツールにしか使ってないだめエンジニアがよく使うレシピ構文メモ。
いろいろな人がいろいろ書いてるけど、バリエーションあると楽しいよね。
スマートなのかとか、本来は〜とかは知りません。

## yumでパッケージをインストールする
単体の場合と複数指定する場合を書いておく。
単体でも複数の場合と同じように書くことが多いけど、バージョン指定しなきゃいけないときは単体の場合のやり方で。
ものぐさなのでactionはupgradeです。

```
package "zabbix-agent" do
        action :
        version "2.2.11-1.el6"
end
```

```
package "install package 1" do
        package_name [ "libusb-devel", "help2man", "curl-devel", "asciidoc" ]
        action :install
end
```

## Webサイトからrpmを取ってきてインストール
`wrpm1`と`wpath1`にそれぞれrpm名と取得先のPathを入れよう。
同じレシピ内で複数回使うなら数字を変える。

```
wrpm1=""
wpath1=""
remote_file "/usr/local/src/#{wrpm1}" do
  source "#{wpath1}/#{wrpm1}"
  only_if do !File.exists?("/usr/local/src/#{wrpm1}")end
end
package "#{wrpm1}" do
   action :upgrade
   source "/usr/local/src/#{wrpm1}"
end
```

## cookbook内のrpmをコピーしてインストール
`crpm1`にそれぞれrpm名を入れる。
同じレシピ内で複数回使うなら数字を変える。
上もそうだけどファイルが存在したらコピーはしないようにしてる。

```
crpm1=""
cookbook_file "/usr/local/src/#{crpm1}" do
  source "#{crpm1}"
  only_if do !File.exists?("/usr/local/src/#{crpm1}")end
end
package "#{crpm1}" do
   action :upgrade
   source "/usr/local/src/#{crpm1}"
end
```

##リンクを張る
hardリンクって滅多に使わないけど、指定もできるんだよってことで`link_type`も書いてる。

```
link "/usr/java/jdk" do
  to "/usr/java/jdk1.7.0_79"
  link_type Symbol
end
```

##設定ファイル内でサーバごとに固有の値を指定する
ミドルウェアの設定ファイルなどで、各サーバごとで違う値を指定することはよくあるけど、その場合の対処方法。
chef zeroで使っているので、node/＜サーバ名＞.jsonに以下のような記述を追加する。

```
  "heartbeat": {
    "vip": "192.168.0.10",
    "member-name": "test02",
    "member-ip1": "192.168.0.12",
    "member-ip2": "192.168.1.12"
    },

```

んで、使いたいテンプレートで以下のように書くとその値が呼び出せる。

```
<%=node['heartbeat']['vip']%>
```

記載が漏れていてもエラーにならず、空欄になるだけなので要注意。
c++ builder XE4, 10.2 Tokyo > datetime > ファイルの日時を取得する > FileAge()+FileDateToDateTime() / TFile::GetLastWriteTime()

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/09)
```

ファイルの日時を知りたい。

## FileAge()

ヘルプを探したらFileAge()というのがあった。

> extern DELPHI_PACKAGE int __fastcall FileAge _DEPRECATED_ATTRIBUTE0 (const System::UnicodeString FileName)/* overload */;

そのままではint型なのでTDateTime型に変換する。
FileDateToDateTime()というのがあった。

> extern DELPHI_PACKAGE System::TDateTime __fastcall FileDateToDateTime(int FileDate);


```
String filepath;
// filepathに実際のファイルまでのパスをセットする
int fileAge = FileAge(filepath);
TDateTime filedt = FileDateToDateTime(fileAge);
```

ファイル名から一発で取得する関数もあるかもしれない。


## TFile::GetLastWriteTime()

こちらの方が一発で取得できる。

```
#include <IOUtils.hpp>
...
String filepath;
// filepathに実際のファイルまでのパスをセットする
TDateTime filedt2 = TFile::GetLastWriteTime(filepath);
```

XE4ヘルプ (webリンクではない)
ms-help://embarcadero.rs_xe4/libraries/System.IOUtils.TFile.html

日付といってもいくつかあるので用途によって別の関数を上記ヘルプから参照して使うとよい。
CentOS 7.1にMySQL Community Edition 5.7をインストールする

インストール手順をまとめます。

## MariaDBのアンインストール

CentOS7.1はMariaDBがインストールされています。
MySQLとは競合するのでアンイスールしておきます。

```
shell> sudo yum remove -y mariadb-libs
```

## yumリポジトリ

MySQLが提供するパッケージを使用してyumリポジトリをインストールします。

```
shell> sudo yum -y localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
```

## MySQLのインストール

MySQLをインストールします。

```
shell> sudo yum install -y mysql-community-server
```

## 起動確認

MySQLを起動します。

```
shell> sudo service mysqld start
```

ステータスを確認します。"running"と出ていれば正常に起動できています。

```
shell> sudo service mysqld status
```

## パスワード確認

仮設定されたパスワードがインストール時にログファイルに出力されています。
以下のコマンドで確認します。

```
shell> sudo cat /var/log/mysqld.log | grep "temporary password"
```

## セキュリティ設定

以下のコマンドでセキュリティ関連の設定を開始します。

```
shell> mysql_secure_installation
```

### rootユーザのパスワード設定

```
Securing the MySQL server deployment.

Enter password for user root:

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password: 

The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n

 ... skipping.
```

初期パスワードを入力します。
有効期限が切れているため、新しいパスワードを求められます。
新しいパスワードを設定します。
設定後、パスワード強度が表示され、変更するか聞かれます。
問題なければ"n"を入力します。

### anonymousユーザの削除

```
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.
```

anonymousを削除するか聞かれます。
匿名ユーザのログインを防ぐために削除しましょう。
削除する場合は"y"を入力します。

### rootユーザによるリモートログイン

```
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.
```

rootユーザによるリモートログインを無効にするか聞かれます。
無効にする場合は"y"を入力します。

### testデータベースの削除

```
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.
 - Removing privileges on test database...
Success.
```

インストール時に作成されているtestデータベースを削除するか聞かれます。
削除する場合は"y"を入力します。

### 

### 権限テーブルのリロード

```
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done! 
```

ユーザ権限のテーブルをリロードするかを聞かれます。
"y"を入力します。

## 自動起動設定

chkconfigで自動起動設定を行います。

```
shell> sudo chkconfig mysqld on
```

## 接続確認

MySQLに接続してみます。

```
shell> mysql -u root -p
```

パスワード入力後、mysqlのプロンプトが表示されれば成功です。
Android で動かないJSメソッド(ES6)

iOS やその他PCブラウザでは動くのに、Android では動かないJSを使ったコンテンツがあった。

あれこれ調べていたが、最終的に Android では実装されていないメソッド（[Array.prototype.find()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find)）を使っていたことがわかった。

対応状況は以下のサイトで一覧できて便利。

[ECMAScript 6 compatibility table](http://kangax.github.io/compat-table/es6/)
【Vim】MatchTagAlwaysプラグインをPHPファイルでも使用する。

VimでHTML系タグの始めと終わりをハイライトしてくれるプラグイン、[MatchTagAlways](https://github.com/Valloric/MatchTagAlways)をPHPファイルでも動かしたいので、readmeを参考に設定してみました。

# MatchTagAlwaysとは

すごい人たち御用達のエディタVimで動くプラグインで、
編集中のHTMLのタグをこんなかんじでハイライトしてくれます。
Divの構造がややこしい時なんかは便利ですね。

![スクリーンショット（2016-02-24 13.03.43）.jpg](https://qiita-image-store.s3.amazonaws.com/0/4625/fb88d0af-5cf6-999b-51d2-8f3f06bbbec7.jpeg)

![スクリーンショット（2016-02-24 13.04.01）.jpg](https://qiita-image-store.s3.amazonaws.com/0/4625/d50fc2b2-156f-2916-5dba-612b3a05907b.jpeg)

![スクリーンショット（2016-02-24 13.04.30）.jpg](https://qiita-image-store.s3.amazonaws.com/0/4625/fb0557ae-91f4-6e58-0900-a86d2ab6c02f.jpeg)

# NeoBunldeでインストール

[MatchTagAlways](https://github.com/Valloric/MatchTagAlways)のプラグインのインストールは、
NeoBundleを使用している場合、
.vimrcに以下を記載すればOK。

```
NeoBundle 'valloric/matchtagalways'
```

# PHPでも使えるようにする

初期設定では html xhtml xml jinja ファイルに対してのみ
プラグインが動く設定になっている。
・・のでPHPでも使えるようにするには　.vimrc　を編集して
以下を追記しましょう。

```
"MatchTagAlwaysのオプション機能ONにする
let g:mta_use_matchparen_group = 1

"MatchTagAlwaysを使用するファイルタイプ
let g:mta_filetypes = {
    \ 'html' : 1,
    \ 'xhtml' : 1,
    \ 'xml' : 1,
    \ 'jinja' : 1,
    \ 'php' : 1,
    \}
```

以上。
`\ 'php' : 1,` 　というのがキモですね。


WordpressのテンプレートはPHP形式で作成するけど、中身はほぼhtmlなので、調べてみました。
x10を別のコンパイラでビルドする

# 背景

x10には各環境用のバイナリが配布されており、通常はそれらのバイナリを使えば問題なく利用できる。
しかしC++のnative関数を呼ぶ場合に、nativeの関数とx10の関数が別のコンパイラでビルドされていると不整合が起きる場合がある。
（例えば、nativeの関数が64bitのgccでビルドされている場合。）

その際にはx10自体をnativeの関数と同じコンパイラでビルドするのが良い。
ここではMacでclangを使わずにgccのコンパイラでx10をソースコードからビルドする方法をまとめる。

# 確認した環境

- MacOSX ElCapitan
- gcc4.9
    - homebrewを使っていれたもの
- x10 2.5.4

# 手順

x10のソースコードの取得し、最新リリースのタグをcheckoutする

```
git clone git@github.com:x10-lang/x10.git
git checkout -b SF_RELEASE_2_6_0 refs/tags/SF_RELEASE_2_6_0
```

デフォルトのコンパイラ（Macの場合はclang）でビルドする場合

```
cd x10/x10.dist
ant dist
```

でビルドでき、`x10.dist/bin`以下に x10, x10c, x10c++ などが生成される。

コンパイラの指定を変更するには `x10.runtime/Make.rules` を編集する。例えばg++-4.9コマンドを利用したい場合、

```diff:Make.rules
diff --git a/x10.runtime/Make.rules b/x10.runtime/Make.rules
index 88fb444..db3617c 100644
--- a/x10.runtime/Make.rules
+++ b/x10.runtime/Make.rules
@@ -259,10 +259,10 @@ ifndef ENABLE_CROSS_COMPILE_ANY
     endif
   endif
   ifdef USE_CLANG
-    override CXX = clang++
+    override CXX = g++-4.9
     override CC = gcc-4.9
     override MPICXX = mpicxx
-    override SHLINK = clang++
+    override SHLINK = g++-4.9
     ifdef OPTIMIZE
       override CXXFLAGS += -O3
     endif
```

と書き換えて、`ant dist`を実行する。

以下のようにビルド時に最適化オプションをつけると、最適化された標準ライブラリをビルドできる。

```
ant -Davailable.procs=4 -Doptimize=true -DNO_CHECKS=true dist
```

ちなみに、作成されたバイナリを削除したい場合は `ant squeakyclean`, `ant distclean` を実行する。
PiZero > directory and data file format > v0.1

This article is for my entry to Pi Zero contest 2016.
https://hackaday.io/project/9526-bring-your-own-pizero-byop

## directory and files

The directory and data files in the Raspberry PiZero are as follows.

- Directory: /home/pi/BYOP
- Files:
  - name.txt : including your nick name
  - send.txt : including messages to be sent
  - rcvd.txt : including received messages 
  
## format of the files

### name.txt

name.txt includes only your nick name in the format of `[nick name]`.

```name.txt
7of9
```

### send.txt

send.txt includes multiple messages to be sent in the format: `[reciever],[message],[isSecret]`.
Message including comment mark (`//`) will be ignored.

For example,

```send.txt
//    1234567812345678 : to check length
Vital,hello_Vital,0<LF>
Vital,39formsg,0<LF>
Vital,47,1<LF>
```
[about 47](http://memory-alpha.wikia.com/wiki/47)

### rcvd.txt

rcvd.txt includes multiple messages, which has been received through the message station.
The format of the rcvd.txt is `[sender],[date],[time],[message],[isSecret]`.
The datetime is the time when the sender store the message to the message station.

For example,

```rcvd.txt
7of9,20160223,0650,morning,0<LF>
7of9,20160223,1230,sleepy,0<LF>
7of9,20160223,1930,bye,0<LF>
7of9,20160224,0620,6022,1<LF>
```
Unity5.3のAndroidビルドが出来ない時の対処方法


## プッシュ通知を送るアプリを作っていたら・・・

諸般の事情で今までUnity4系を使って作業していたが、5.3になったのを機にそちらへ移行した。その第一回目のアプリとして[ニフティクラウド mobile backend](http://mb.cloud.nifty.com/)のPush実機テストアプリを作ってみたところ、ビルド周りが大分変わっており結構手間取ったのでそのメモを記載する。
本ブログで言及する問題点は以下の2つ

* Andorid moduleの読み込み
* ManifestへのPackageNameの書き込み

なお、ビルド方法は下記のブログを参考にさせていただいた
[[Unity] アプリをビルドしてandroid実機上でテストする](https://unity3d.sakura.ne.jp/unity/android-build.html)


## Andorid moduleの読み込みについて

Unity5.3ではインストール時にAndroid moduleを読み込まないとAndroidSDKのパス読み込みもできず、ビルドできない。していない場合は再度のインストールが必要になるらしい。

下記の方のブログを参考にして、再度インストールをしなおした。
[Unity5.3でAndroid SDKのパス設定項目が表示されない件についての対処](http://qiita.com/shunpeater/items/5043adb8075d0c7557a7)

## ManifestへのPackageNameの書き込み

module 読み込み後、[[Unity] アプリをビルドしてandroid実機上でテストする](https://unity3d.sakura.ne.jp/unity/android-build.html)のビルド方法を試したがうまくいかなかった、実はAndroidManifestの方にパッケージ名を追加しないといけないらしい。

[ニフティクラウド mobile backend](http://mb.cloud.nifty.com/)のUnity SDKをインポートした場合（[インポート方法参考](http://mb.cloud.nifty.com/doc/current/introduction/quickstart_unity.html)）UnityProject上のAssetsの中にPluginsが作成されている。その中の下記の図の場所にManifestがあるのでそれをエディタで編集する。
![スクリーンショット 2016-02-24 12.25.54.png](https://qiita-image-store.s3.amazonaws.com/0/55227/7b9b7748-72c5-3b36-5696-c80ea64bb843.png "スクリーンショット 2016-02-24 12.25.54.png")

Manifest内に4つほど（人によって違いますが・・・）"YOUR_PACKAGE_NAME"と書かれた箇所があるのでそれを自分の
Bundle IDと一致させる。

![スクリーンショット 2016-02-24 11.32.10.png](https://qiita-image-store.s3.amazonaws.com/0/55227/48c4baef-e37b-63fd-a33d-93a9e9d793b3.png "スクリーンショット 2016-02-24 11.32.10.png")



これでビルドができるようになった。
pod install で `to_ary` エラー

# エラー

`pod install`したらto_arrayでエラーが..

```
NoMethodError - undefined method `to_ary' for #<Pod::Specification name="Mapbox-iOS-SDK">
Did you mean?  to_query
/Users/mattak/.anyenv/envs/rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/cocoapods-0.39.0/lib/cocoapods/resolver/lazy_specification.rb:14:in `method_missing'
```

# 原因

普通にissue上がってた。

- https://github.com/CocoaPods/CocoaPods/issues/4891
- 1.0.0-betaからruby 2.3.0に対応とのこと

# 対応

まだ1.0.0がリリースされてないようなので、1.0.0-betaを利用することで対応

```shell-session
$ gem install cocoapods --pre
```
`go test -count n -timeout t`

`go test`の引数についてのメモ

 * `-count n`: テストを`n`(`int`)回実行する
 * `-timeout t`: 1回毎ではなく，n回全体についてのタイムアウトを`t`(`time.Duration`)に設定する．



`TestFooBar` 1回分が1秒以内に終わって欲しい場合，

* :o:  `go test -count 1 -timeout 1s -v TestFooBar`
* :o:  `go test -count 100 -timeout 100s -v TestFooBar`
* :x:  `go test -count 100 -timeout 1s -v TestFooBar`

となる．

## 例
```go
package main

import (
        "testing"
        "time"
)

func TestFooBar(t *testing.T) {
        t.Logf("enter %s", time.Now())
        epsilon := 100 * time.Millisecond
        <-time.After(1 * time.Second - epsilon)
        t.Logf("leave %s", time.Now())
}
```

```
$ go test -v -count 1 -timeout 1s -run TestFooBar
=== RUN   TestFooBar
--- PASS: TestFooBar (0.90s)
        main_test.go:9: enter 2016-02-24 12:06:40.528802812 +0900 JST
        main_test.go:12: leave 2016-02-24 12:06:41.429077271 +0900 JST
PASS
ok      _/home/suda/WORK/testfoobar     0.902s
```

```
$ go test -v -count 100 -timeout 1s -run TestFooBar
=== RUN   TestFooBar
--- PASS: TestFooBar (0.90s)
        main_test.go:9: enter 2016-02-24 12:07:14.381237659 +0900 JST
        main_test.go:12: leave 2016-02-24 12:07:15.281427292 +0900 JST
=== RUN   TestFooBar
panic: test timed out after 1s

goroutine 8 [running]:
panic(0x51b300, 0xc8200107b0)
        /home/suda/go/src/runtime/panic.go:464 +0x3e6
testing.startAlarm.func1()
        /home/suda/go/src/testing/testing.go:725 +0x14b
created by time.goFunc
        /home/suda/go/src/time/sleep.go:129 +0x3a

goroutine 1 [chan receive]:
testing.RunTests(0x5c2380, 0x645df0, 0x1, 0x1, 0x1)
        /home/suda/go/src/testing/testing.go:583 +0x8d2
testing.(*M).Run(0xc820041ef8, 0xc820010588)
        /home/suda/go/src/testing/testing.go:515 +0x81
main.main()
        _/home/suda/WORK/testfoobar/_test/_testmain.go:54 +0x117

goroutine 7 [chan receive]:
_/home/suda/WORK/testfoobar.TestFooBar(0xc8200aa090)
        /home/suda/WORK/testfoobar/main_test.go:11 +0x153
testing.tRunner(0xc8200aa090, 0x645df0)
        /home/suda/go/src/testing/testing.go:473 +0x98
created by testing.RunTests
        /home/suda/go/src/testing/testing.go:582 +0x892
exit status 2
FAIL    _/home/suda/WORK/testfoobar     1.004s
```
Nginxで認証付きのキャッシュを実装する

#実現したいこと
Nginxを使ってアプリケーションサーバーのレスポンスをキャッシュしたいケースは多いと思いますが、
厄介なのが認証が必要なケースです。単純にキャッシュしてしまうと認証が回避されてしまいます。
仕方ないので認証が必要なリクエストは毎回アプリケーションサーバに流すとなると、やはりパフォーマンスは下がってしまいます。
なんとか認証をアプリケーションサーバを介さずに実現し、高速な認証つきのキャッシュを実現できないか考えてみました。

#仕組み
例えば、リクエストヘッダーなどに認証トークンが付いており、これをMemcachedに問い合わせることで認証をチェックできるというシステムである場合、どうやらNginxの既存のモジュールだけで実現できることがわかりました。
使うのはproxy_cacheの他に下記の２つの標準モジュールです。

 - ngx_http_auth_request_module
 - ngx_http_memcached_module

ngx_http_auth_request_moduleに含まれるauth_requestというディレクティブを使うと、指定したURIのレスポンスが
正常系(2xx)である場合だけリクエストを処理させることができます。
ngx_http_memcached_moduleは、$memcached_key変数に指定したキーの内容をmemcached_passディレクティブで指定した
ホストから取得するといったことができるモジュールです。キーがあればステータス200ですが存在しない場合は404となります。

memcachedの内容を返すURIを用意しておき、auth_requestを使ってそれを認証URIにすれば、認証つきのキャッシュを実現できます。

#設定例
##前提となる構成と認証
アプリケーションサーバ: 127.0.0.1:8080
Memcachedサーバ： 127.0.0.1:11211
認証：リクエストヘッダX-TOKENに認証用のトークンが設定される。Memcachedサーバには有効な認証トークンだけがキーとして設定されている。

```text:nginx.conf
http {
    proxy_cache_path /var/cache/nginx/cache levels=1 keys_zone=zone:4m inactive=7d max_size=50m;
    
    upstream backend {
        server 127.0.0.1:8080;
    }
    
    server {
        location / {
            auth_request /auth;
            proxy_pass http://backend;
            proxy_cache zone;
            proxy_cache_key $scheme$proxy_host$uri$is_args$args;
            proxy_cache_valid  200 1d;
        }
        location /auth {
            set $memcached_key "$http_x_token";
            memcached_pass 127.0.0.1:11211;
        }
    }
}
```

Memcachedの部分は実際にはDBやRedisへの問い合わせが必要だったり、単なる認証だけでなく複雑なアクセス条件が必要だったり
様々なケースがあると思います。その場合、組み込みのLuaを使うか、認証やアクセス条件のチェックを高速に処理する専用のサーバを用意するというのも良い策な気がします。
underscoreコードリーディング（matcher）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##matcherとは


###[underscorejs.orgのmatcher](http://underscorejs.org/#matcher)

こんな説明。
>####_.matcher(attrs) Alias: matches 
>Returns a predicate function that will tell you if a passed in object contains all of the key/value properties present in attrs.

```javascript
var ready = _.matcher({selected: true, visible: true});
var readyToGoList = _.filter(list, ready);
```

------------- 
attrに指定したすべてのkey/valueが、objectに含まれているかのテストを通したい時に使えるような関数を返します。


###[underscore.matcher](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1305)
コード的にはこのあたり。

```javascript
  // Returns a predicate for checking whether an object has a given set of
  // `key:value` pairs.
  _.matcher = _.matches = function(attrs) {
    attrs = _.extendOwn({}, attrs);
    return function(obj) {
      return _.isMatch(obj, attrs);
    };
  };
```

_.matcherと_.matchesにエイリアスが張られている。
attrsに指定されたものを_.extendOwnを用いてコピーする。
objを引数に持ち、_.isMatchを用いてobjにattrsが含まれているかどうかの結果を返す関数を返す。
第11話 ど、どっち進む？

**ここだけの話、基本的に私は方向音痴です。**

今回は、移動するための入力デバイスの設定を実装します。まずは、分かりやすくキーボードの矢印キーで移動を試みます。
↑ が前進する、← が左方向を向く、→ が右方向を向く、とします。
create関数に記述します。それぞれのキーに対するオブジェクトを作成して、キャプチャーするように設定します。

```js:poge.js
var upKey;
var leftKey;
var rightKey;

function create() {
  upKey = game.input.keyboard.addKey(Phaser.Keyboard.UP);
  leftKey = game.input.keyboard.addKey(Phaser.Keyboard.LEFT);
  rightKey = game.input.keyboard.addKey(Phaser.Keyboard.RIGHT);
  game.input.keyboard.addKeyCapture([
    Phaser.Keyboard.UP, Phaser.Keyboard.LEFT, Phaser.Keyboard.RIGHT
  ]);
}
```
これで、キー入力を受け付けてくれますので、キーの状態をみて処理を記述します。これはupdate関数に記載します。

```js:poge.js
function update() {
  if (upKey.isDown) {
    // 前進する処理
    console.log('UP');
  }
  if (leftKey.isDown) {
    // 左向く処理
    console.log('LEFT');
  }
  if (rightKey.isDown) {
    // 右向く処理
    console.log('RIGHT');
  }
}
```

あとは、それぞれについて処理を記述すれば、移動できるわけです。が、しかし！スマホで矢印キーってｗ

ここはやはりJoyStickですよね。
Phaserにはプラグインとして [Virtual Joystick](http://phaser.io/shop/plugins/virtualjoystick) が用意されていますが、有償でした...orz

[デモ](http://tkymgr.o0o0.jp/demo/)

![final.png](https://qiita-image-store.s3.amazonaws.com/0/105644/f8614f1e-01f1-2a6b-ae60-23c7c737f37c.png)
しかし、[ここ](https://github.com/Gamegur-us/phaser-touch-control-plugin) にオープンソースなプラグインが公開されていましたので、これを利用させていただく感じで実装します。htmlにphaser-touch-controlスクリプトを追加します。

```html:index.html
<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>あれ</title>
</head>
<body>
  <div id="game">  </div>
  <script src="js/three.min.js"></script>
  <script src="js/phaser.min.js"></script>
  <script src="js/phaser-touch-control.js"></script>
  <script src="js/poge.js"></script>
</body>
</html>
```

まず、Joystick用の画像を読み込みます。これはpreload関数に記載します。

```js:poge.js
var joypadImage = {
  compass  : { text : 'compass',       file : "img/compass_rose.png" },
  touchSeg : { text : 'touch_segment', file : "img/touch_segment.png" },
  touch    : { text : "touch",         file : "img/touch.png" },
}

function preload() {
  // 最後に追記
  game.load.image(joypadImage.compass.text, joypadImage.compass.file);
  game.load.image(joypadImage.touchSeg .text, joypadImage.touchSeg .file);
  game.load.image(joypadImage.touch.text, joypadImage.touch.file);
}
```
画像のファイル名は何でもいいんですが、textの部分を変更するなら元のスクリプト修正してくださいｗ

次にプラグインを読み込んで初期化します。これはcreate関数に書きます。

```js:poge.js
function create() {
  // 最後に追記
  game.touchControl = game.plugins.add(Phaser.Plugin.TouchControl);
  game.touchControl.inputEnable();
}
```
最後にupdate関数の中で、Joystick読み取ればいいわけです。

```js:poge.js
function update() {
  if (upKey.isDown || game.touchControl.cursors.up) {
    // 前進する処理
    console.log('UP');
  }
  if (leftKey.isDown || game.touchControl.cursors.left) {
    // 左向く処理
    console.log('LEFT');
  }
  if (rightKey.isDown || game.touchControl.cursors.right) {
    // 右向く処理
    console.log('RIGHT');
  }
}
```

さあ、これで迷うことないよね！
Android開発　メモ　〜入門編①〜

#レイアウト
・LinearLayout
1.横と縦方向にに並べて配置することができる
2.android:orientationで"vertical"または"horizontal"でどちらに並べるかを指定する。
**android:layout_weightを使う際の注意**
【verticalの場合】
layout_heightを"0dp"にする
【horizontalの場合】
layout_widthを"0dp"にする

・TableLayout
表組みのように配置することができる
・RelativeLayout
1.Viewからの位置を相対的に指定することができる
2.orientation使わない

・FrameLayout
Viewを重ねて配置することができる

・android:layout_height
Viewの縦のサイズ
・android:layout_width
Viewの横のサイズ
・android:padding
内側の余白
・android:layout_margin
外側の余白
・android:layout_gravity
Viewの中のコンテンツを上下左右に寄せる
・android:match_parent
親要素の幅に合わせる
・wrap_content
中身の幅に合わせる
・android:layout_alignLeft="@+id自分が指定したID"
指定IDの左側に寄せる
pythonでマルチコア並列処理をする方法


以前、ちょっと大きなデータを分析する必要があり、処理にかなりの時間がかかっていました。
その際、処理高速化のために使った方法をまとめます。

以下は、multiprocessingモジュールを使ったものです。

#インポート

```py:multi.py
from multiprocessing import Pool
from multiprocessing import Process
```

#使い方
##基本
こんな感じです。

```py:multi.py
def function(hoge):
    #やりたいこと
    return x

def multi(n):
    p = Pool(10) #最大プロセス数:10
    result = p.map(function, range(n))
    return result

def main():
    data = multi(20)
    for i in data:
        print i

main()
```

この場合だと、「0,1,2・・・19と値を変化させてfunctionを20回実行する」という処理になります。
functionの返値はresultにリストで入っているので、受け取って標準出力しています。

また、私の環境では12コア（正確には6コア12スレッド）まで使えるので最大プロセス数は10としました。
最大まで使うとブラウザを開くのも一苦労になるのでやめておいた方が無難です。

##CPU使用率
並列処理中のCPU使用率も載せておきます。
![Screenshot .png](https://qiita-image-store.s3.amazonaws.com/0/114208/255f9646-1d30-ddde-7748-3e785d8237c1.png)
このようにきちんとマルチコアで並列処理ができていることが分かるかと思います。


##プロセスid取得
各処理を担当しているプロセスidを取得することもできます。

```py:multi.py
import os

def fuction(hoge):
    #やりたいこと
    print 'process id:' + str(os.getpid())
    return x

#以下省略

```
こうやって表示させておくとちゃんと異なるプロセスで実行されてるんだなあということがわかっておもしろいです。

#高速化はどれくらいできたか
35時間ほど掛かった処理が4時間ちょっとで終わりました。
処理時間、10分の1弱ということで十分な成果です。

もちろん１プロセスごとの速度が上がっているわけではないので、効率化するためには均等に割り振れる仕事である必要がありますが、分析系ではそういったものが多いので役に立つのではないかと思います。
Mac にHomebrew で入れたソフトの自動起動設定

### redis 自動起動設定

```bash
$ cp /usr/local/Cellar/redis/3.0.0/homebrew.mxcl.redis.plist ~/Library/LaunchAgents/
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
$ launchctl start homebrew.mxcl.redis
```

### postgresql 自動起動設定

```bash
$ cp /usr/local/Cellar/postgresql/9.4.5_2/homebrew.mxcl.postgresql.plist ~/Library/LaunchAgents/
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
$ launchctl start homebrew.mxcl.postgresql.plist
```

+ 以下、同じようにごちょごちょやればいいと思う

### 確認

```
$ launchctl list | grep homebrew
PID	Status	Label
45114	0	homebrew.mxcl.elasticsearch17
43802	1	homebrew.mxcl.postgresql
43711	0	homebrew.mxcl.redis
44097	1	homebrew.mxcl.mysql
```