OmniAICreator/Qiita-1.07M huggingface dataset:
Atomのscriptパッケージでbundle exec付きで実行する

Atomで現在開いているスクリプトを簡単に実行して結果を見るためのscriptパッケージで`bundle exec ruby`で実行しようとしたらちょっとハマったのでメモ。

# 問題
scriptは現在開いているスクリプトのファイルタイプに対応したコマンドでスクリプトを実行してくれます。例えばhoge.rbだったら`ruby hoge.rb`を実行した結果を表示してくれます。

しかしBundlerでGemを管理していたり、libディレクトリにあるクラスをrequireしたい場合などは`ruby`だけは依存パッケージを読み込めないので`bundle exec ruby -I ./lib`で実行させたい。

Atomのメニューからscript→Configure Scriptを開くとCommandという項目があるのでここに`bundle exec ruby`と書けば実行してくれそうなのですが、エラーになってしまいます。

# Configure Scriptのそれぞれの項目の意味
scriptパッケージの[Usage](https://atom.io/packages/script)にEnviroment Variablesについてだけは説明があるのですが、その他は具体例がないのでよく分からない感じです。
さすがにCurrent Working Directoryだけは実行するディレクトリの指定と想像が付くのですが、それ以外のオプションに何を入れるべきか分からなかったので調べてみました。

検索してみたところ、scriptパッケージのrunner.coffeeにあるRunnerクラスのrunメソッドの`@bufferedProcess`に引数をセットして子プロセスを走らせているっぽいので、このあたりにconsole.logを仕掛けて追っかけてみました。
https://github.com/rgbkrk/atom-script/blob/master/lib/runner.coffee#L23

以下のような使われ方のようです

|項目|用途|補足|
|:------|:-----|:----|
|Command|実行するコマンド。.rbだとデフォルト挙動はrubyが入る|スペース区切りで2つのコマンドを指定しようとしてもエラーになってしまう|
|Command Arguments|Commandへの引数||
|Program Arguments|実行するスクリプトに渡す引数|

つまり、hoge.rbに対してターミナルで`ruby -I ./lib hoge.rb hogehoge`として実行したい場合には以下のように指定すると意図通りに動いてくれます。

|項目|入力|
|:----|:----|
|Command|ruby|
|Command Arguments|-I ./lib|
|Program Arguments|hogehoge|

# 結論
ターミナルで実行するときのコマンドとConfigure Scriptの各オプションは以下のように対応しているようです。

`${Command} ${Command Arguments} ${実行されるスクリプト} ${Program Arguments}`

よって以下の設定をしてSave as profileで保存し、次回からはRun with profileで実行すればbundle exec付きで実行できます。

|項目|入力|
|:----|:----|
|Command|bundle|
|Command Arguments|exec ruby -I ./lib|

# 補足
scriptパッケージの[README](https://atom.io/packages/script)にも書いてありますが、Atom内でパスが通っていないためにコマンドが実行できないというのがありがちな問題としてあるそうです。
その場合はターミナルから
`atom .`
で起動することでシェルのPATHを引き継げるようです。
はじめてのNode-RED Getting Start編


基本的にはNode-REDのドキュメント(http://nodered.org/docs) を見ながら動かした内容を
備忘録的に公開していきます。

# インストール
今回はMacにインストールする所から始めてみます。

## Node.jsのインストール
Nodeの`0.10.x`以降が必要になります。

Nodeのバージョンは`nodebrew`などでバージョン管理出来るようにしていた方が良いかもしれません。
Raspberry Piなどの場合は頻繁にNodeをアップグレードする事もないかもしれないので、必要ないかな？

以下URLからインストーラーをダウンロードしてNode.jsをインストールしましょう。
https://nodejs.org/

次に以下コマンドでインストールを行います。
`sudo npm install -g --unsafe-perm node-red`

他にもインストール方法はあるので試したい人や上記方法で上手くインストールできなかった人は
ドキュメントの`Alternative install methods`を参考にして試してみてください。
http://nodered.org/docs/getting-started/installation

# 起動
`node-red`コマンドがインストールされているので実行するだけです。
起動したらブラウザで http://localhost:1880 にアクセスしてみてください。
起動できていればNode-REDの画面が表示されるはずです。

`node-red`コマンドをオプション無しで実行した場合、その後に作成したflowや設定(`setting.js`)のデータは`$HOME/.node-red`以下を参照します。

個人的には管理しやすくなるので作成するflow用に`node-red -u . -s ./setting.js`のように
明示的に指定しておいた方が良いと思います。
ちなみに`setting.js`が`-u`で指定しているディレクトリにある場合は`-s`を指定しなくても、
そのディレクトリにある`setting.js`が参照されるようでした。

# ノード追加
Node-REDではデフォルトで利用出来るノードの他、
用途に合わせてノードを追加する事ができます。
http://flows.nodered.org

自分でノードを作成し、公開する事もできます。
今回はまず動かす事を優先して飛ばします。

# flow作成(その1)
- ブラウザの画面左側のノード一覧からInputノードのInject Node(表記はinject)を追加します。
- ノード一覧のOutputノードからDebug Node(表記はdebug)を追加します。
- 2つのノードを繋ぎます。それぞれのノードにポートを示す□がついてるのでそれをマウスでドラッグして繋ぎます。
- Deployボタンを押してflowを実行してみましょう。(初めは「上手く動かないなー」と思ってたら単にデプロイされてないだけだったりする事がよくありました)
- ブラウザの画面右にinfoとdebugタブがあると思います、debugタグをクリックしてフォーカスさせます。
- Inject Nodeの左側にボタンがあるのでクリック
- debugに数字が表示された事を確認

![Kobito.re0Iqy.png](https://qiita-image-store.s3.amazonaws.com/0/11776/7f7f3093-3a1f-cf07-9798-c945e8d06d96.png "Kobito.re0Iqy.png")


上手く表示されたでしょうか？debugに表示されたのはtimestampの値です。
ノードにはざっくり言うとInput/Function/Outputのノードがあるとイメージすると良いでしょう。
イベントのトリガ、処理、通知先という感じですね。

InputとOutputのNodeしか作ってないのでFunctionノードも使ってみましょう。
先ほどのflowをそのまま修正する形で進めます。

- ノード一覧のFunctionからFunction Node(表記はfunction)を追加します。
- Function Nodeをダブルクリックして、ノード名(name)と機能(Function)を入力します。functionに書くのは当然jsです。以下の内容を書き込んでOKボタンをクリックしてください。

```
// Create a Date object from the payload
var date = new Date(msg.payload);
// Change the payload to be a formatted Date string
msg.payload = date.toString();
// Return the message so it can be sent on
return msg;
```

3. InjectノードとDebugノードの接続を切ります。二つをつなぐ線をクリックして選択状態にし、`delete`キーで削除です。ちなみにNodeも同じようにクリックで選択し、`delete`で削除したり、ドラッグによる矩形でまとめて選択できたりします。
4. 次に`Injection-Function-Debug`のような形にノードを繋ぎ直してください。あとはDeployして実行するだけです。

![Kobito.8hlxZQ.png](https://qiita-image-store.s3.amazonaws.com/0/11776/d337eac2-96cd-fbe2-d9e2-cf8832a9c087.png "Kobito.8hlxZQ.png")

debugの出力結果が日付のフォーマットに変わっていたら成功です。

# まとめ
とりあえずここまででNode-REDがどんなものかなんとなく掴めてきたのではないでしょうか？
長くなってきたので一旦ここまでにして続きはまた別の記事として書こうと思います。
Androidのadb backupがエラーも吐かないのに動作しないときの対処

#この記事に書かれていること
Androidのadb backupがうまくいかない時の対処法

#発生事態
先日、Android N Previewが降ってきたということでバックアップを取ろうと思い、adbコマンドをｯﾀｰﾝしました。が、いつもどおり Now unlock your device and confirm the backup operation.というコメントは出るものの、一瞬で終了してしまいました(当然バックアップは取れていない)。

#状況確認
adbのその他のコマンドは普通に使えるので、`adb shell logcat | grep backup`などのコマンドでログを確認。するとこんな記述が。

```
W bu      : Unknown backup flag -all:-apk:-system:-noshared:-obb
```

`-all`も`-apk`も`-system`も`-noshared`も`-obb`もすべて正しいオプションで間違いありませんが、「そんなコマンドは知りません」と跳ね返されてしまいます。

ここで僕の環境を書いておきます。

|||
|:---:|:---:|
|PC OS|Ubuntu 15.04|
|adb version|1.0.31|
|Android OS|Android 6.0.1|
|Android device|Nexus 6|

#結論
結論は超簡単。
オプションをすべてシングルクォーテーションで囲めばOK。

```
adb backup '-all -apk -system -noshared -obb'
```

また、以下のようにスペースをエスケープしてもOK。

```
adb backup -all\ -apk\ -system\ -noshared\ -obb
```

これで一応バックアップは取れます。

#残る問題
なぜかファイル名の指定ができないです。`-f filename.bac`などとオプションを指定しても、デフォルトのファイル名である backup.ab ファイルとして保存されてしまいます。
この問題が発生している方は、古いバックアップファイルが上書きされてしまう可能性があるので、新しくフォルダを作り、その中で作業するのが安全かと思います。

#その他調べたこと
調べたところによると、 adb version 1.0.32 はバックアップが取れないバグがあるようです。ブログなどでは 1.0.31 にバージョンを落とすよう指示されていることが多いと思いますが、僕の環境ではそれでも当記事のように対処しないと上手くいきませんでした。
TypeScript で export する関数の引数に分割代入を使うと .d.ts が壊れる

# 問題

- TypeScript v1.8.7

次のようなファイルで `tsc` は問題なく成功するが、破損した `*.d.ts` を生成し、利用時に Error によりコンパイルできない。

```ts:index.ts
const f = ({ k }: { k: any }) => k;
export { f };
```

```ts:index.d.ts
declare const f: ({ k }: {
    k: any;
}) => any;
export { f };
```

エラーメッセージ:

`')' expected.`

コンパイラオプション:

```
  "compilerOptions": {
    "declaration": true,
    "module": "commonjs",
    "moduleResolution": "node",
    "noImplicitAny": false,
    "noImplicitReturns": true,
    "outDir": ".tmp/",
    "rootDir": ".",
    "sourceMap": false,
    "target": "es5"
  }
```

## 解決策

`export` する関数の引数では分割代入 (destructuring assignment) を使わない。

```ts:index.ts
const f = (options: { k: any }) => {
  const { k } = options;
  return k;
};
export { f };
```

```ts:index.d.ts
declare const f: (options: {
    k: any;
}) => any;
export { f };
```

おそらく引数に適当な名前をつけることができないのだろう。
ズンドコキヨシ　〜1tweetプログラミング〜

最近話題になっているズンドコキヨシをRubyで作ってみました．単に作るだけではつまらないので，1tweetに収めることを目指して，できるだけ短くしてみました．と言いつつもっと短いプログラムが公開されているのでちょっと恥ずかしいのですが，思い切って公開してみます．

```ruby:zun.rb
z,d=a=%W|ズン ドコ|
b=[]
c=((z+" ")*4+d).split
e=->{b<<a.sample}
5.times{e[]}
print e[].shift until c==b
puts b.join+"キ・ヨ・シ！"
```

```bash:実行例
$ ruby zun.rb
ズンズンドコドコズンドコズンドコズンズンズンズンズンドコキ・ヨ・シ！
```

wcコマンドでプログラムサイズ（プログラムの文字数）を調べてみると122文字なので，十分1tweetに収まります．

```bash:プログラムサイズと確認環境
$ wc -m zun.rb
     122 zun.rb
$ ruby -v
ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14]
```

と言うわけで，1tweetプログラミングでした．要望があれば解説します．

あれ？Twitterの文字数制限撤廃の話って，結局どうなるのでしたっけ？
HubotにGoogle Cloud Vision APIで画像認識してもらう

## はじめに
AlphaGoで世の中が沸いている今、みなさんいかがお過ごしでしょうか。
この記事ではGoogleが提供している[Cloud Vision API](https://cloud.google.com/vision/?hl=ja)をHubot経由で使い、画像認識を行います。

## Cloud Vision APIについて
このAPIで現在提供されている機能は、OCR、顔・ロゴ・ランドマーク認識、セーフサーチ認識、物体検知です。
ここでは物体検知を用いて、Hubotくんに渡されたURLの画像に何が含まれているか当ててもらうことにします。

## 手順
### APIキーの準備
Google Cloud Platformで課金[^1]およびCloud Vision APIを有効にします。
その後、認証情報よりAPIキー（サーバーキー）を作成しましょう。このキーは後ほど使うのでメモしてください（キーが使えるようになるまで時間がかかる場合があるのでご注意）。

[^1]: 案外高いのでクラウド破産に注意しましょう。Quotaを設定するのがお薦めです。

### 実装
[Hubot](https://github.com/github/hubot)は2016/03/13時点の最新版である2.18.0を用います。以下が実装[^2]です。APIキーは前項で準備したものを使用してください。

APIの[チュートリアル](https://cloud.google.com/vision/docs/label-tutorial?hl=ja)と[リファレンス](https://cloud.google.com/vision/reference/rest/v1/images/annotate?hl=ja)が分かりやすかったのですんなりいきました。

[^2]: async.waterfallとかmsg -> resとかどうするのがベストなのか分からなかったのでそのままです… (; _ _)

```coffeescript:scripts/example.coffee
  robot.respond /detect (https?:.*)/i, (msg) ->
    API_KEY = 'APIキー'

    imageUrl = msg.match[1]
    robot.http(imageUrl).encoding('binary').get() (err, res, body) ->
      imageBase64 = new Buffer(body, 'binary').toString('base64')
      req = JSON.stringify
        requests: [
            image:
              content: imageBase64
            features: [
                type: 'LABEL_DETECTION'
                maxResults: 16
            ]
        ]
      robot.http('https://vision.googleapis.com/v1/images:annotate?key=' + API_KEY)
        .header('Content-Type', 'application/json')
        .post(req) (err2, res2, body2) ->
          data = JSON.parse body2
          labels = (ano.description for ano in data.responses[0].labelAnnotations)
          msg.send labels.join(', ')
```

### テスト
```bash
$ ./bin/hubot
myhubot> myhubot: detect https://pbs.twimg.com/profile_images/3204860916/c539ff0abea7adc9f455b0c68eb1002a.png
myhubot> art, font, emoticon, icon, technology, input device, mobile device
```
vagrant(ホストがwindows)のsynced_folder上でSymfonyをインストールできない時の対応方法

# vagrant(ホストがwindows)のsynced_folder上でSymfonyをインストールできない時の対応方法

Symfonyを下記コマンドでインストールしようとしたらRuntimeExceptionエラーとなった

```shell
[root@vagrant-centos65 vagrant]# composer create-project symfony/framework-standard-edition my_project_name "2.8.3"


[RuntimeException]
  Could not delete /vagrant/my_project_name/vendor/symfony/symfony/6601b6eabe2135f7d417614c11d56528: date_default_timezone_get(): It is not safe to rely on the syste
  m's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and y
  ou are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to sele
  ct your timezone.

```

## 原因
synced_folder上ではシンボリックリンクが使えないため
[Symfonyのissueに上がってた](https://github.com/symfony/symfony-installer/issues/235)

## 対応
Vgrantfileでsynced_folderを無効にする
sambaをインストールしてこの共有フォルダを使ってSymfonyをインストールする

## 参考リンク
[windows+vagrantでSymfony2プロジェクトの開発環境を作るノウハウ的なもの（Re:Vagrant で Symfony 開発）](http://php-sql-gdgd.jugem.jp/?eid=109)
[VagrantでSymfony2開発 Symfony勉強会#9でLTしてきた](http://www.karakaram.com/vagrant-symfony)
[vagrantでsambaのインストール方法](http://taropohci.blogspot.jp/2014/03/windowsvagrantsamba.html)
Cloud9でRedmineを導入する際に、Rubyのバージョンに気をつけたこと

Cloud9でRedmineを導入する際に、Rubyのバージョンで引っかかった為、記事にしました。

# Redmine導入でInternal errorが発生

Cloud9でRedmineを導入する際に、下記サイトを参考にさせて頂きました。

・Cloud9でRedmineを動かす(akiko-pusu)
http://qiita.com/akiko-pusu/items/7b37745d6341cc55d5eb

Redmineを立ち上げた後、管理者(admin)で管理者タブをクリックしたところInternal errorが発生してしまいました。

どうやら原因はrubyのバージョンのようです。
https://www.redmine.org/issues/18936

現在(2016/03/13)のCloud9のワークスペースではデフォルトで2.3.0がインストールされていましたが、2.1系でないと不具合が出ることがあるそうです。

<h2>Redmine導入手順</h2>
Redmineを導入する為に、次の３点を実行しましたので、
手順を記載しようと思います。

1. Rubyのバージョン変更
2. Redmineのインストール
3. 稼働確認

また、以下サイトを手順作成の参考にさせて頂きました。
・[rbenv+ruby-buildを利用してUbuntuにRubyをインストールする](http://qiita.com/itayan/items/e146289f430dffc71360)
・[Cloud9でRedmineを動かす]
(http://qiita.com/akiko-pusu/items/7b37745d6341cc55d5eb)

### 1. Rubyのバージョン変更
パッケージを取得する。

```
$ sudo apt-get update
```

build-essentialパッケージをインストールする。

```
$ sudo apt-get install -y build-essential
```

rbenvをクローンする。

```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

ruby-buildをクローンする。

```
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

.bashrcに追記する。

```
$ echo 'export PATH="~/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
```

シェルをリスタートする。

```
$ source ~/.bashrc
```

インストール可能バージョンを一覧表示する。

```
$ rbenv install -l
```

Rubyバージョン2.1.5をインストールする。

```
$ rbenv install 2.1.5
```

Rubyバージョン2.1.5に設定する。

```
$ rbenv global 2.1.5
```

Rubyのバージョンを確認する。

```
$ ruby -v
結果: ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
```

### 2. Redmineのインストール

Redmineをクローンする。

```
$ git clone -b 2.5-stable https://github.com/redmine/redmine.git
```

redmineに移動して、必要なGemをインストールする(bundler, sqlite3, rails)。

```
$ cd redmine
$ gem install bundler
$ gem install sqlite3
$ gem install rails
```

bundle installを行う。

```
$ bundle check || bundle install  --path vendor/bundle --without mysql postgreql rmagick
```

マイグレーション用にymlファイルを作成する。

```
$ cat << HERE >> config/database.yml
development:
  adapter: sqlite3
  database: db/development.sqlite3
HERE
```

DBのマイグレーションを行う。

```
$ bundle exec rake db:migrate
```

セッション暗号化の鍵を生成する。

```
$ bundle exec rake generate_secret_token
```

### Redmineの動作確認

Railsサーバを起動する。

```
$ rails s -b $IP -p $PORT
```

Cloud9のワークスペース右上の「Share」ボタンを押下すると、ApplicationにアクセスするURLが出てくるので、ブランザでアクセスする。

![スクリーンショット 2016-03-13 22.38.11.png](https://qiita-image-store.s3.amazonaws.com/0/96391/df34ec75-9f37-3ee2-0414-5440eeae2d6b.png)

adminでログイン後に、個人設定タブでエラーが出ないか確認
![スクリーンショット 2016-03-13 22.38.21.png](https://qiita-image-store.s3.amazonaws.com/0/96391/80527eff-9674-267d-238b-fb7a52ec2932.png)

# さいごに
無事にCloud9上でRedmineを導入することができました。
すぐにRedmineを触ってみたい！という方々の助けになれれば幸いです。
Unityでデータを暗号化・圧縮して保存する

データを保存するUnityパッケージを作ってみた。
オプションで暗号化と圧縮ができる。

[UnityDataSerializer](https://github.com/tkyaji/UnityDataSerializer)

# 使い方

```csharp
// set
DataSerializer.SetData ("key", 999);
// get
int data = DataSerializer.GetData<int> ("key");
// ファイルに保存
DataSerializer.Apply ();
```

という感じで使う。
`Apply`を呼ぶまではファイルに書き出されないので、適当なタイミングで`Apply`する。


Serializableのデータなら保存できるので、

```csharp
[Serializable]
private class Data {
	public int IntVal;
	public string StrVal;
	public Data(int i, string s) {
		IntVal = i;
		StrVal = s;
	}
}
```

という感じのクラスを作って、


```csharp
// set
DataSerializer.SetData ("data", new Data(100, "test"));
// get
Data data = DataSerializer.GetData<Data> ("data");
```

というのもOK。
ListやDictionaryもそのまま保存できる。


## 暗号化

```csharp
DataSerializer.EnableEncryption("keyxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "ivxxxxxxxxxxxxxx");
```

予め上記のメソッドで暗号化を有効化した後に`SetData`を呼べば、AES-CBCで暗号化されて保存される。

## 圧縮

```csharp
DataSerializer.EnableCompression ();
```

暗号化と同様、上記のメソッドで圧縮を有効化してから`SetData`すれば、gzipで圧縮される。
なお、Windows環境には圧縮は未対応。
ちなに圧縮処理は結構遅いので、特に理由が無ければ使わない方が良いかも。。。

## その他のメソッド

```csharp
// SetDataは第３引数をtrueにすると、このデータは即ファイルに書き込む
DataSerializer.SetData ("key", 999, true);

// GetDataは第２引数にデフォルト値を指定可能
int data = DataSerializer.GetData<int> ("key", 10);

// データ削除。第２引数はSetData同様、即ファイル書き込みするか（オプション）
DataSerializer.RemoveData("key", true);

// ファイルから事前ロード
DataSerializer.PreLoad("key1", "key2" /*, key3... */);
```

# やってること

BinaryFormatterでシリアライズして、キー毎にファイルを作って保存する。
保存先は `Application.persistentDataPath` 配下。
ファイルアクセスを減らすため、キャッシュを経由して読み書きする。
そのため一度読んだデータは次からはキャッシュから読み、
書き込みも`Apply`するまではキャッシュに書き込むだけ。


以上。
[*Apache*] さくらVPSでバーチャルホストの設定

# はじめに
1つのサーバーで複数のドメインを設定したいときの設定メモ。

# 環境
* サーバー: さくらVPS
* OS: CentOS7
* Apache: 2.4.6
* ドメイン: ムームードメイン

# 手順
## Apacheインストール・設定
```bash
$ yum install -y httpd
```

インストールできたら起動。

```bash
$ systemctl start httpd.service
```

ステータスをチェック。

```bash
$ systemctl status httpd
# activeになっていることを確認
```

自動起動の設定。

```bash
$ systemctl enable httpd.service
```

設定が効いてるか確認。

```bash
$ systemctl list-unit-files | grep httpd
# httpd.service     enabled
```

## ドメイン取得・設定
今回は[ムームードメイン](https://muumuu-domain.com/)で取得。
取得後、**ドメイン一覧** > **設定したいドメインを選択** > **ネームサーバ設定変更**で、**GMOペパボ以外 のネームサーバを使用する**を選択し、以下を設定。

|ネームサーバー|設定値|
|:--|:--|
|ネームサーバー1|ns1.dns.ne.jp|
|ネームサーバー2|ns2.dns.ne.jp|

## さくらVPS側の設定
**ネームサーバ登録**画面から、新しいネームサーバを登録する。
![スクリーンショット 2016-03-13 21.45.37.png](https://qiita-image-store.s3.amazonaws.com/0/48912/ec3a5752-06fd-6390-001a-0a5cef58b99c.png)

**ゾーン編集**をクリックする。
![スクリーンショット 2016-03-13 22.07.24.png](https://qiita-image-store.s3.amazonaws.com/0/48912/a1620fd1-75b9-faf8-570c-e36379d2c25a.png)

**変更**ボタンをクリックする。
![スクリーンショット 2016-03-13 22.08.14.png](https://qiita-image-store.s3.amazonaws.com/0/48912/8f94155e-3ea0-dd4a-27aa-b2c298b20d5c.png)

以下を新規登録。
![スクリーンショット 2016-03-13 22.09.18.png](https://qiita-image-store.s3.amazonaws.com/0/48912/abad1b82-3f4d-0582-a8fc-74379391ec14.png)

**データ送信**を忘れずにクリック。
![スクリーンショット 2016-03-13 22.11.10.png](https://qiita-image-store.s3.amazonaws.com/0/48912/b95c8c10-75d4-f7a9-45f2-11b4a2f207c1.png)

･･･この設定を使いたいドメインの数分やる。

## Apacheの設定
以下のファイルを作成。（ファイル名は拡張子さえあってれば何でも良い）

```bash
$ vim /etc/httpd/conf.d/vhost.conf
```

中身はドメインごとに複数用意。（以下は例として`example.com`と`example.jp`を使用）

```bash
<VirtualHost *:80>
DocumentRoot /var/www/html/example.com
ServerName www.example.com
ServerAlias example.com
CustomLog logs/example.com-access.log common
ErrorLog  logs/example.com-error.log
AddDefaultCharset UTF-8
<Directory "/var/www/html/example.com/">
AllowOverride All
</Directory>
</VirtualHost>


<VirtualHost *:80>
DocumentRoot /var/www/html/example.jp
ServerName www.example.jp
ServerAlias example.jp
CustomLog logs/example.jp-access.log common
ErrorLog  logs/example.jp-error.log
AddDefaultCharset UTF-8
<Directory "/var/www/html/example.jp/">
AllowOverride All
</Directory>
</VirtualHost>
```

再起動。（設定ファイルの再読み込みでもいけるらしい）

```bash
$ systemctl restart httpd
```

# 参考
* [バーチャルホストの設定](http://www.sakura-vps.net/virtual-hosts-settings-for-sakura-vps/)
ConnectionStringのプロバイダー名に「.1」が付く意味

#経緯
Windows Server 2003からWindows Server 2008R2にIIS上の既存Webアプリケーションの移行作業をしていたところ、500エラーとなりIISログに「プロバイダーが見つかりません。正しくインストールされていない可能性があります。」というエラーが出力されていた。
データベース(SQLServer)への接続が出来ないのがエラーの原因のようだ。

#接続文字列の確認
ConnectionString = "Provider=SQLNCLI.1 …"
プロバイダー名に「.1」が付いていたので、これが怪しいと思った。
そもそも「.1」の意味を理解出来ていない、検索してみたことろ下記サイトがヒット。
[「SQLOLEDB.1」と「SQLOLEDB」の違い](http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=42721&forum=26)
>簡単に言えばバージョンです。 .1 を指定すれば明示的にバージョンを指定していることになります。 特定のバージョンに拘らないのであれば必要ありません。 

バージョンということが分かったが、何のバージョン？ もう少し調べてみる。
[Connection String Syntax - MSDN](https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms722656(v=vs.85).aspx)
>If two versions of a provider are installed on the same system, use the ProgID to specify exactly which version to use. 
プロバイダの2つのバージョンが同じシステムにインストールされている場合、プログラムIDは正確に使用するバージョンを指定するために使用します。 

その場合にレジストリの「HKEY_CLASSES_ROOT」には、下記のように2種類登録(例)されている。
HKEY_CLASSES_ROOT\SQLOLEDB
HKEY_CLASSES_ROOT\SQLOLEDB.1

そもそも「.1」を意識して付けることは無い気がする。きっとツールを使ったか、どこかのサイトを参考にでもしたんだろう。

特定のバージョンに拘らないならば不要ということで、「.1」は消して動かしてみた。
しかし、結果は変わらず同じエラーになってしまった。

#調査ふりだし
32bitから64bitに変更したことが原因では無いかと思った。
以前OracleでClassic ASPにてデータベースを接続させた際には、32bit版のOracle Clientをインストールする必要があったためだ。また、IIS上の設定でも「32 ビットアプリケーションの有効化」を「True」にする必要がある。

SQLServerでも同様では無いかと思ったが、「x64 バージョンと Itanium バージョンの sqlncli.msi では、32 ビット バージョンの SQL Server Native Client もインストールされます。」との記述があり、32bit版ODBC データ ソース アドミニとレーター(%windir%\SysWOW64\odbcad32.exe)で確認してもドライバーは入っていることを確認した。

#解決
IISの問題なのかデータベース接続が問題なのか切り分けする為に、VBScriptにデータベース接続部分を転記してデスクトップ上から確認すると、64bit上でも同じエラーが表示された。
よって、接続文字列が怪しいとして再度、見直すことにした。
するとドライバーのバージョンによってプロバイダー名が違っていた。
SQLServerの接続ドライバーは最新版(SQLServer 2014 Express)を導入。
Microsoft SQL Server 2005 Native Client (SQLNCLI – sqlncli.dll) 
Microsoft SQL Server 2008 Native Client (SQLNCLI Ver.10 – sqlncli10.dll) 
Microsoft SQL Server 2012 Native Client (SQLNCLI Ver.11 – sqlncli11.dll) 
※SQLServer 2014は、SQL Server 2012 Native Clientを使用する。

プロバイダー名を「SQLNCLI11」に変更したところ正常に接続することが出来た。
ConnectionString = "Provider=SQLNCLI11 …"
cockroachdbでpgbenchを動かす

忘れそうなのでメモ。
あとpgbenchはPostgreSQLに入ってるpgbenchではないです。

- pgbenchをbuild

```bash:
$ cd $GOPATH/src/github.com/cockroachdb/cockroach/sql/pgbench/cmd/pgbenchsetup
$ go build -o pgbench main.go
```

- 初期データをロード

データベース(hogeデータベース)を新規に作成して、10000件をロード。

```bash:
$ ./pgbench -createdb -accounts 10000 postgresql://root@127.0.0.1:26257/hoge?sslmode=disable
Inserted 1 branch records
Inserted 10 teller records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 5000 account records
Inserted 10 history records
```
- 確認

```bash:
$ ./cockroachdb sql --insecure -d hoge
root@:26257> select count(*) from pgbench_accounts;
+----------+
| count(*) |
+----------+
|    10000 |
+----------+
```
読み取り専用で開いてしまったファイルを上書きする方法

#読み取り専用で開いてしまったファイルを上書きする方法

他の人が開いているExcelファイルを開いて、読み取り専用になったのについ変更してしまうってことありますよね。
保存しようとして、保存のダイアログが出てきて「やっちまったー」ってやつです。
他の人が開いていた場合、他の人が更新していなければ以下の方法で上書きが可能になります。

クイックアクセスツールバーにコマンドを登録します。ドロップダウンから「その他のコマンド」を選択
![readonly02.png](https://qiita-image-store.s3.amazonaws.com/0/69810/7512e25d-8449-2c81-f361-7810c2df5484.png)

「すべてのコマンド」→「読み取り専用の設定/解除」を選択
![readonly03.png](https://qiita-image-store.s3.amazonaws.com/0/69810/dd601e01-b56f-560d-509b-4ed2d778f047.png)

クイックアクセスツールバーにアイコンが登録される。ボタンを押すと
![readonly04.png](https://qiita-image-store.s3.amazonaws.com/0/69810/48e601da-3931-96fe-5323-9028e215d1ad.png)

読み取り専用が解除されますので上書きできるようになります。おためしあれ。
![readonly05.png](https://qiita-image-store.s3.amazonaws.com/0/69810/6967b86a-83ef-8ebe-273f-5ea2b8a4ce98.png)

ただし、他の人が更新していた場合、更新内容を破棄するか、強制的に上書きするか聞かれますので、ご判断はお任せします。(^-^;
このコマンドは開いた後に読み取り専用に変更も可能ですので読むだけならこのボタンを押しておけば他の人が更新できますので迷惑になりません。
Ruby のフリップフロップの闇感と Enumerable#flipflop

以前，「[Ruby のココがダメ](http://qiita.com/scivola/items/17470c52641d3ffa1650)」という記事で，「フリップフロップ　ワケわかめ」と書いた。

その後，@cuzic さんが「[Ruby のオススメの機能７選](http://qiita.com/cuzic/items/a265f140fdff289d5c07)」という記事で「Flip Flop 演算子」を知名度が低いオススメ機能として挙げられた。

最近，@Ping さんが「[Ruby でフリップフロップ](http://qiita.com/Ping/items/acb7fbb9aa141c2c46df)」という記事で，「`..`」と「`...`」の違いなども含め，やや詳しく説明された。

フリップフロップを知ってから十年くらい無視し続けて来たのに，ここ半年でミョーに意識することになったので，ちょっと考えたことを書いてみる。

Ruby のフリップフロップとは何か，ということは，リンク先の記事とかコメントとか公式リファレンスマニュアルの「[範囲式](http://docs.ruby-lang.org/ja/2.3.0/doc/spec=2foperator.html#range)」の「条件式としての範囲式」とか見てください。

# フリップフロップの闇感

フリップフロップは何か闇な感じがする。なぜなのか。

既に多くの人が書いているとおり，誰が状態を保持しているのか分からないところが闇。何らかのオブジェクトが状態を持っているとかじゃないと落ち着かない。Ruby ぽくない気がする。

それと，範囲式が**条件式の中で使われたときに限り**フリップフロップとして働く，というのが気持ち悪い。ふつう範囲式を評価すると，その値は Range オブジェクトなのだが，条件式の中では真偽値として評価される。

以下の，コード A と B は等価ではない。

```rb
strings = %w(a b begin c d end e)

# コード A
strings.each do |s|
  puts s if (s == "begin")..(s == "end")
end

# コード B
strings.each do |s|
  x = (s == "begin")..(s == "end")
  puts s if x
end
```

コード A は範囲式がフリップフロップとして働き，標準出力に順に「`begin`」「`c`」「`d`」「`end`」が出力される。

コード B では，`s` が `"a"`，`"b"` のときは，範囲式を評価することで `false..false` という Range オブジェクトが生成され，それが `x` に代入される。

`nil` と `false` 以外のすべてのオブジェクトは真と評価されるので，Range オブジェクトは当然，真だ。よって「`a`」「`b`」が出力される。

ところが，`s` が `"begin"` のときは `true..false` という Range オブジェクトを作ろうとして，例外が発生する。

# Enumerable#flipflop ってどうよ

そういうメソッドは無い。僕の前に `Enumerable#flipflop` は無い。

つくったらあーるよーだっ！

大雑把なコードで示すと，こういうメソッドがあってもいいんじゃないか？

```rb
module Enumerable
  def flipflop(start_criterion, end_criterion)
    each do |item|
      yield item if (start_criterion === item)..(end_criterion === item)
    end
  end
end
```

これなら Ruby 的に違和感が無いんじゃないか？

こんなふうに使う。

`"begin"` が来てから `"end"` が来るまでを出力するなら：

```rb
strings = %w(a b begin c d end e)

strings.flipflop("begin", "end") do |s|
  puts s
end
```

ゼロが来てから `nil` が来るまで：

```rb
[2, 9, 0, 4, 7, nil, 8].flipflop(:zero?.to_proc, :nil?.to_proc) do |x|
  # なんとか
end
```

`Object#===` を使うから，引数には数値，文字列，正規表現，範囲，Proc オブジェクトなどが渡せる。

もちろん実用的には，ブロック無しで `Enumerator` を返したり，`...` に相当する〈終端を含まない〉オプションを用意したり，といったことが必要だろう。〈始点を含まない〉も必要かもしれない。論理反転も要るような気がする。

# そして廃止へ（2018/12/11 追記）

下記の記事の「[フリップフロップ構文を使うと警告が出るようになった](https://qiita.com/jnchito/items/ce11cb7fccdf4b66af24#%E3%83%95%E3%83%AA%E3%83%83%E3%83%97%E3%83%95%E3%83%AD%E3%83%83%E3%83%97%E6%A7%8B%E6%96%87%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E8%AD%A6%E5%91%8A%E3%81%8C%E5%87%BA%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F)」によると，フリップフロップは Ruby 3 で廃止されることが決まったそうです（Ruby 2.6 では警告）。

[サンプルコードでわかる！Ruby 2.6の主な新機能と変更点 - Qiita](https://qiita.com/jnchito/items/ce11cb7fccdf4b66af24)

まあいいんじゃない？

そのかわりに `Enumerable#flipflop` を入れてくれてもよさそうな気が。

# やっぱ廃止やめ？（2019/12/20追記）

Ruby 2.6 でフリップフロップを使うと

> warning: flip-flop is deprecated

って警告が出てたんだけど，Ruby 2.6.4 から警告が出なくなった。
以下で経緯が判るはずなのだが，まだよく読んでいない。
https://bugs.ruby-lang.org/issues/5400

2019/7/11 にまつもとさんが

> OK, I give up. The warning should be removed.

と書いてあるのだけ読んだ。
Ruby 3 での廃止が撤回されたのかどうかは，今のところ私はわかってない。誰か教えて〜

# 結局生き残った（2022/03/24追記）

Ruby 3.1.1 でもフリップフロップは生き残っているので，結局廃止されないことになったのだろう。
Dockerでマウントする際は絶対パスで指定すること


タイトルの通り。相対パスで指定して躓いたのでメモ。

#### 前準備
$はホストでの操作。

```bash
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              c66docker0001       0881050dcb72        25 hours ago        202.6 MB

$ mkdir hostdir0001

$ echo "Hello Docker" > hostdir0001/testfile0001.txt
```

#### うまくいかない場合（相対パス）
```bash
$ docker run -v hostdir0001:/root/ctdir0001 -i -t centos:c66docker0001 /bin/bash
[root@bd1be231c0b0 /]#
```

#### うまくいく場合（絶対パス）
```bash
$ docker run -v /c/Users/hoshito/hostdir0001:/root/ctdir0001 -i -t centos:c66docker0001 /bin/bash
[root@ec0d30786546 /]# ls /root/ctdir0001/
testfile0001.txt
```

#### 追記
realpathコマンドを使えば、絶対パスをコピペしなくてもいけます。

```bash
$ docker run -v $(realpath ./hostdir0001):/root/ctdir0001 -i -t centos:c66docker0001 /bin/bash
[root@eaf053b8bb1b /]# ls /root/ctdir0001/
testfile0001.txt
```
webpackを使ってnode-sass環境にbourbon3兄弟を導入する



[Bourbon - A Lightweight Sass Tool Set](http://bourbon.io/)
[Bourbon Neat](http://neat.bourbon.io/)
[Bitters - Predefined Styles for Bourbon](http://bitters.bourbon.io/)

Ruby/Railsを使わないJavaScriptプロジェクトでもbourbonを導入したなと思って調べたら、公式でnpm packageも用意されていることがわかったので導入した際の備忘録です。


bourbonとneatを導入
-------------------

```bash
npm i -D bourbon bourbon-neat
```

sass-loaderを使ってnode-sassにpathを渡す

```js:webpack.config.js

const bourbonPath = require('bourbon').includePaths;
const neatPath = require('bourbon-neat').includePaths;

...
 module: {
    loaders: [
      {
        test: /\.scss$/,
        loader: ExtractTextPlugin.extract('style', 'css?minimize!postcss!sass'),
      },
    ],
  },

  // sass-loaderのオプションでbourbonとneatのpathを渡す
  sassLoader: {
    includePaths: bourbonPath.concat(neatPath),
  },
...
```


bittersを導入
--------------

```bash
gem install bitters
```

cssを管理するdirectoryのrootで`bitters install`するとファイルが生成される。

bittersを最新のものにupdateして導入したせいか、`_variables.scss`の6行目にある`$base-font-family: $font-stack-system;`の`$font-stack-system`という変数がどこにも定義されていないためコンパイルエラーが発生するので適当なfont-familyを指定してあげるかbittersのversionを下げてあげたほうがいいかもしれない。(ちゃんと調べてない)

```
$base-font-family: sans-serif;
```
ruby injectメソッド




```
sum = 0
[1,2,3,4,5].each do |i|
  p sum = sum + i
end

```




``` 結果
1
3
6
10
15
```
injectだと

```
p sum = [1,2,3,4,5].inject(:+)
```

```  結果
15

```

ブロックが最後に渡した値が返り値になります。

要素１が要素２に渡され、
要素２が要素３に渡されます。

1 が 2　に渡され　3になり、
3 が 3　に渡され　6になり、
6　が 4　に渡され　10 になり、
10　が　５に渡され　1５になり
15が帰るということです。

## 違った例 配列の数値を合計していく

```
num = [4,5,6,7,8,9]
puts num.inject(0) {|sum,n| sum + n}
```

``` 結果
39
```

これもsumに要素（nたち）を足していくって感じですかね。





##　参考


[inject (Enumerable)](http://ref.xaio.jp/ruby/classes/enumerable/inject)
GPUImageでフラグメントシェーダに配列を渡す方法

2016-11-14 NSArray用のも追加

たぶん当たり前すぎて誰も書いてないんでしょうけど、GPUImageではじめてシェーダ触る僕が苦労したのでまとめました。
なんかもっと良い方法あったら教えてください。

#GPUImageFilterを継承したクラス
```objc:GPUImageArrayTestFilter.h
#import <GPUImage/GPUImage.h>

@interface GPUImageArrayTestFilter : GPUImageFilter
{
  //配列のユニフォーム
  GLint testUniform;
  //長さのユニフォーム
  GLint sizeUniform;
}

//配列データを受け取るプロパティ
@property(readwrite, nonatomic) GLfloat *test;

//配列の長さも同時に指定するセッタ
-(void)setTest:(GLfloat *)test withSize:(GLsizei)size;

@end
```

```objc:GPUImageArrayTestFilter.m
#import "GPUImageArrayTestFilter.h"

//シェーダーをNSStringの文字列として用意する
NSString *const kGPUImageArrayTestShaderString = SHADER_STRING
(
 varying highp vec2 textureCoordinate;
 uniform sampler2D inputImageTexture;
 
//固定長しかダメ？
 uniform highp float test[256];
//実際に使う配列の長さ
 uniform highp int size;
 
 void main()
 {
  //基本は黒
   lowp vec3 color = vec3(0.0, 0.0, 0.0);

   //配列内で指定された矩形だけ赤くする
   for(int i = 0 ; i < size; i+=4){
     if(test[i] < textureCoordinate.x
        && textureCoordinate.x < test[i] + test[i + 2]
        && test[i+1] < textureCoordinate.y
        && textureCoordinate.y < test[i+1] + test[i+3]
        ){
       color = vec3(1.0, 0.0, 0.0);
       break;
     }
   }
   gl_FragColor = vec4(color, 1);
 }
 );

@implementation GPUImageArrayTestFilter

- (id)init{
  if (!(self = [super initWithFragmentShaderFromString:kGPUImageArrayTestShaderString]))
  {
    return nil;
  }
  //配列のuniformIndexを登録
  testUniform = [filterProgram uniformIndex:@"test"];
  //長さのuniformIndexを登録
  sizeUniform = [filterProgram uniformIndex:@"size"];
 
  return self;
}

//C言語の配列とその長さも同時に指定するセッタ
-(void)setTestCArr:(GLfloat *)test withSize:(GLsizei)size{
  _test = test;
  //配列のポインタをセット
  [self setFloatArray:_test length:size forUniform:testUniform program:filterProgram];
  //実際のデータのサイズをセット
  [self setInteger:size forUniform:_sizeUniform program:filterProgram];
}

//NSArrayを代入するセッタ
-(void)setTestNSArr:(NSArray*)test{
  float *cArr = (float*)malloc(sizeof(float*)*test.size);
  for(int i = 0 ; i < test.size ; i++){
   cArr[i] = [test[i] floatValue];
  }
  [self setTestCArr:cArr withSize:test.size];
  free(cArr);
}

//デフォルトのセッタは配列の長さを0としておく
-(void)setTest:(GLfloat *)test{
  [self setTest:test withSize:0];
}

@end
```

#使い方
```objc:test.m

  //矩形表示用のテストデータ
  float test[8] = {
    //x,y,width,heightの順で入れている
    0.2, 0.2, 0.1, 0.1
    ,0.6, 0.2, 0.1, 0.1
  };

  GPUImageArrayTestFilter *filter = [GPUImageArrayTestFilter new];
  
  [filter setTestCArr:test withSize:8];

//あとはGPUImageのフィルタとして実行
```

#実行結果
こんな画像が出来ます。
![IMG_0868.PNG](https://qiita-image-store.s3.amazonaws.com/0/105057/39a2d675-56e0-5ee9-0408-4e662dfab5fb.png)


#最後
これで検出した顔情報ごとに何か処理をやるみたいなこともできますね
PowerShell > Link > PSのバージョンを確認する > $PSVersionTable < Invoke-RestMethod と ConvertTo-Json が見つからないエラー

PowerShellのコードを実行しようとした時、バージョンの違いによってエラーとなった ( Invoke-RestMethod と ConvertTo-Json が見つからないとのエラー)。

バージョンは以下のリンクにあるように`$PSVersionTable`で確認できるようだ。

[PowerShell/PowerShellのバージョンを確認する方法・$PSVersionTable](http://win.just4fun.biz/PowerShell/PowerShell%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%83%BB$PSVersionTable.html)

Windows7 では PSのバージョンは2.0で、Invoke-RestMethod と ConvertTo-Json はバージョン3.0以降で使用可能のようだ。
ズンドコキヨシ with C拡張 by ESP8266 + Analog Discovery 2

## 方法

- 0-1Vの電圧をAD取込する
- AD取込値(10bit: 1024)のLSBが0か1かで{Doko, Zun}の判別
- Zunが4つ続いた後にDokoが来たらKIYOSHI!

## 道具

- Analog Discovery 2 (以下AD2)
  - Wavegenで0-1Vのノイズ電圧を発生させる > [Qiita記事](http://qiita.com/7of9/items/8b24c7634cfdadb67e1c)
- ESP8266 (WiFi搭載マイコン)
  - AD取込をする
  - 方法に記載の処理を行いKIYOSHI判定をする


## code v0.1

```c:esp8266_160313_zundoko.ino
// AD取り込みのためのおまじない
extern "C" {
#include "user_interface.h"
}

static const String msg[2] = {
  "Doko",
  "Zun",
};

static int s_zunCount = 0;
static bool s_stopCondition = false;
static int s_totalTime_sec = 0;

void setup() {
  Serial.begin(115200); // 結果出力用シリアルの設定
  Serial.println(""); // to separate line
}

void loop() {
  if (s_stopCondition) {
    return;
  }
  
  uint ADvalue;
  ADvalue = system_adc_read(); // 0..1024 のAD取込

  int rnd = (ADvalue % 2);
  Serial.println(msg[rnd]);

  if (rnd == 1) {
    s_zunCount++;
  } else {
    if (s_zunCount == 4) {
      Serial.println("KIYOSHI!");
      s_stopCondition = true;
      Serial.print("Total time(sec):");
      Serial.println(s_totalTime_sec);
      return;
    }
    s_zunCount = 0;
  }

  s_totalTime_sec++;
  delay(1000); // msec
}
```

## 結果

```txt:結果
(略)
Doko
Zun
Zun
Doko
Zun
Zun
Doko
Zun
Doko
Zun
Zun
Zun
Zun
Doko
KIYOSHI!
Total time(sec):46
```

## 写真

- 黄色: AD取込の電圧
- 黒: GND

![DSC_0147.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/2d919bc2-66d0-3a47-95ee-c95fc0815f7d.jpeg)
AD2 > ノイズ波形の出力 > Wavegen1でNoiseを指定する

```txt:動作確認
Analog Discovery 2 (以下AD2)
```

ESP8266の`0-1V`のAD取込に使えるランダムな波形を作りたい。

AD2 の Wavegen において以下のように設定すればできた。

- Type: Noise
- Amplitude: 500mV
- Offset: 500mV

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4980b7ae-38bf-1ec3-f665-2e9e4386b92e.png)
nyagos で peco を使ったヒストリのインクリメンタルサーチ

一応、ネイティブで `C-r` のインクリメンタルサーチが実装されているけれども、peco を使った分かりやすいインクリメンタルサーチの手法を hisomura さんが提示されていたので、紹介せずにはいられなかった。

https://github.com/zetamatta/nyagos/issues/117 より：

```
nyagos.bindkey("C_R",
    function(this)
        local path = nyagos.getenv("APPDATA") .. '\\NYAOS_ORG\\nyagos.history'
        local result = nyagos.eval('type ' .. path .. ' | peco')
        this:call("CLEAR_SCREEN")
        return result
    end)
```

これ、いろんなもんで応用できるんじゃね :smile::smile:
ズンドコキヨシオートマトン with Ruby

## ズンドコキヨシマシン

ズンズンズンズンドコ状態になると「キ・ヨ・シ♡」でクラッシュする

## 図

![zundoko.png](https://qiita-image-store.s3.amazonaws.com/0/2074/0dc774f4-d1a8-eca7-ae4d-42b2ef770dd3.png)

```rb
require 'gviz'

Graph do
  route :Silent       => [:Zun, :Doko]
  route :Zun          => [:ZunZun, :Doko]
  route :Doko         => [:Zun, :Doko]
  route :ZunZun       => [:ZunZunZun, :Doko]
  route :ZunZunZun    => [:ZunZunZunZun, :Doko]
  route :ZunZunZunZun => [:ZunZunZunZun, :ZunZunZunZunDoko]

  save(:zundoko, :png)
end
```

## 実装

```rb
class Silent
  def zun
    Zun.new
  end

  def doko
    Doko.new
  end
end

class Zun
  def zun
    ZunZun.new
  end

  def doko
    Doko.new
  end
end

class Doko
  def zun
    Zun.new
  end

  def doko
    Doko.new
  end
end

class ZunZun
  def zun
    ZunZunZun.new
  end

  def doko
    Doko.new
  end
end

class ZunZunZun
  def zun
    ZunZunZunZun.new
  end

  def doko
    Doko.new
  end
end

class ZunZunZunZun
  def zun
    ZunZunZunZun.new
  end

  def doko
    ZunZunZunZunDoko.new
  end
end

class ZunZunZunZunDoko
  def initialize
    raise 'キ・ヨ・シ♡'
  end
end

class ZunOp
  def call(state)
    puts 'ズン'
    state.send(:zun)
  end
end

class DokoOp
  def call(state)
    puts 'ドコ'
    state.send(:doko)
  end
end

class RandomZundokoProgram
  include Enumerable

  def each
    loop { yield [ZunOp, DokoOp].sample.new }
  end
end

class ZunDokoMachine
  def initialize
    @state = Silent.new
  end

  def run(program)
    program.each do |op|
      @state = op.call(@state)
    end
  end
end

machine = ZunDokoMachine.new
program = RandomZundokoProgram.new.lazy
machine.run(program)
```

## 実行例

```console
    _╰╰,   /ﾊﾞｼｮ % ~/tmp
  _/o ŏｧ  / ﾀｲﾁｮｰ% ﾔﾊﾞｲ
∈ミ;ﾉ,ﾉ   ＼ｺﾏﾝﾄﾞ% ruby zundoko.rb
ドコ
ズン
ドコ
ズン
ドコ
ドコ
ドコ
ドコ
ドコ
ドコ
ドコ
ズン
ズン
ドコ
ドコ
ズン
ズン
ズン
ドコ
ズン
ズン
ズン
ズン
ズン
ズン
ズン
ズン
ドコ
zundoko.rb:63:in `initialize': キ・ヨ・シ♡ (RuntimeError)
	from zundoko.rb:57:in `new'
	from zundoko.rb:57:in `doko'
	from zundoko.rb:77:in `call'
	from zundoko.rb:96:in `block in run'
	from zundoko.rb:85:in `block in each'
	from zundoko.rb:85:in `loop'
	from zundoko.rb:85:in `each'
	from zundoko.rb:95:in `each'
	from zundoko.rb:95:in `run'
	from zundoko.rb:103:in `<main>'
    _╰╰,   /ﾊﾞｼｮ % ~/tmp
  _/oஇ ｧ  / ﾀｲﾁｮｰ% ﾔﾊﾞｲ
∈ミ;ﾉ,ﾉ   ＼ｺﾏﾝﾄﾞ%
```

## その他のキヨシ

- [ズンドコキヨシ Quine with Ruby](http://qiita.com/hanachin_/items/856ecb53fe486c6d4a12)
- [歌うズンドコキヨシ with Ruby](http://qiita.com/hanachin_/items/a4547d88e9008d390f58)
- [ズンドコキヨシマシーン with Ruby](http://qiita.com/hanachin_/items/b037b2e602c0bdee6a89)
- [ズンドコキヨシワンライナー with Ruby](http://qiita.com/hanachin_/items/bad105e11ab707fbaf4c)
- [ズンドコキヨシ物語 with Ruby](http://qiita.com/hanachin_/items/055881be542afceca9d9)
Check! オンラインエディタ Visual Studio Online "Monaco" の機能ピックアップ

こんばんは、オークファンの @dz_ こと大平かづみです。

Prologue - はじめに
====
Visual Studio Online "Monaco" は見た目がシンプルなので、機能が少ないように見えますが、必要な機能をしっかり押さえています。

いいなと思った機能をピックアップしてみます。

Visual Studio Online "Monaco" 機能ピックアップ
====

- ドラッグ＆ドロップでファイルをアップロードできます
- zip ファイルをドラッグ＆ドロップでアップロードし、アップロードされた zip ファイルを右クリックで解凍できます
- **Git** をつかえます！（後述）
- ファイル検索ができます（後述）
- コンソールにアクセスできます（後述）
- Visual Studio  Team Service と連携できます（後述）

Git の利用
----
右のメニューから Git の画面を開き Git でバージョン管理することができます。

![20160313_azure_005.png](https://qiita-image-store.s3.amazonaws.com/0/3812/c4831dfb-00af-2d71-dae5-f06600f02575.png)

ファイル検索
----
ファイル名で検索できます。地味に重宝しますよね～。
![20160313_azure_009.png](https://qiita-image-store.s3.amazonaws.com/0/3812/031f500f-348c-ec9d-7271-ad53a31ef1e3.png)


コンソール
----
左のメニュー、または `Ctrl + Shift + C` でコンソールが開きます。
![20160313_azure_004.png](https://qiita-image-store.s3.amazonaws.com/0/3812/697c71e3-d074-c161-1e8e-dc9feebd6f67.png)

コンソールで使えるコマンドはこちらです。

```bash
\> help
Built in commands:
    cd              Directory navigation
    copy
    del
    dir
    exit            Closes the console
    git             Git source control commanding
    help            List of available commands
    mkdir
    move
    msbuild         MSBuild commanding
    node            Node.js commanding
    npm             Node package manager
    nuget           NuGet commanding
    open            Open file in editor
    ps              PowerShell commanding
    rd
    rename
    rmdir
    touch           Touch a file if it exists or create it otherwise
    unzip           Unzip archives

Native windows commands (append /? for help):
    copy            Copy files
    del             Delete a file
    move            Move files
    rename          Rename files
    dir             Directory browsing
    mkdir           Create a directory
    rmdir           Delete a directory

```

Visual Studio Online Team Service と連携
----
Git の画面の「Connect Visual Studio Online」のリンクや、画面上部のプロジェクト名のプルダウンから、Visual Studio Online Team Service と関連付けることができます。

![20160313_azure_008.png](https://qiita-image-store.s3.amazonaws.com/0/3812/680bf1fc-5c9e-5ca9-e741-424330d38eff.png)

テーマの切換え
----
エディタの見た目を変更できます。初期状態は白を基調としたテーマで、ダークバージョンや、ハイコントラストを選べます。ちなみに、この記事のキャプチャでは Dark Theme を使ってます。
![20160313_azure_007.png](https://qiita-image-store.s3.amazonaws.com/0/3812/c12da36e-aae6-d2eb-f30a-43763d2f8d95.png)


Epilogue - おわりに
====
Visual Studio Online "Monaco" に限らず、オンラインエディタは、手元のPC環境に左右されないので重宝しています。使いこなしていきたいですね！
HTMLを15年書いてる僕が語ってみる vol.2 | ガラケーからスマートフォンへ

前回ご好評いただいた記事の続編を書かせていただきました。
が、Qiitaにはアンマッチな内容&いっぱい読んでもらってもお小遣いとセルフブランディングにならないこと反省し、
ブログを開設しましたので、

http://thrbrd.hatenablog.jp/entry/2016/03/13/html-vol2
こちらをご覧ください。

以後Qiitaには技術的なことだけ書いていきます。
上記の記事も是非ご一読ください！
json.filed readmeの和訳

# json.filed
[json.filed](https://github.com/7k8m/json.filed)は、Node.jsにてJSONファイルを遅延処理するフレームワークです。
GitHubのREADMEに英語以外で書いた情報を置きづらいので、日本語訳をQiitaに投稿します。

## 使いみち
+ 何ができるか
    + JSONファイルの読み書き、その他処理
    + node間のJSONファイル共有
    + 複数JSONファイルの内容を集めて、一つのJSONファイルに集約する。
    + などなど...
+ どんな時に使うか
    + アプリで情報を記録する必要があるが、DBMSの利用も適当ではない時。
    + JSONファイルを処理するスクリプトを実装する時。
    + などなど...


# hello world
    var jf = require('json.filed');

    jf.filed('./data.json')
    .write( { msg: 'hello world.'} )
    .read( json => { console.log( json.msg ) } )
    .exec();
[使い方についてはGitHubの説明を参照してください。](https://github.com/7k8m/json.filed/blob/master/document/how2use.md)

# 遅延処理...?
はい、[遅延処理](https://github.com/7k8m/json.filed/blob/master/document/HowDeferred.md)します ! <br/>
ファイルの読み書き等が遅延的に行われるので、node.jsの特性を活かしたプログラミングが可能です。

# リファレンス
[GitHubのページを参照してください。](https://github.com/7k8m/json.filed/blob/master/document/reference.md)
Atomのスニペット(CSON)でバックスラッシュそのものを出す方法

# Atomのスニペットにバックスラッシュ`\`そのものを出させたいとき

例えば以下のように記述すると，`\n`が展開されて実際に改行されてしまう．

```coffeescript
'source.c':
    'printf':
    'prefix': 'pf'
    'body': """
        printf('\n');
    """
```

そこで以下のようにバックスラッシュを4つ羅列してやると，エスケープされそのまま`\n`と表示されるようになる．

```coffeescript
'source.c':
    'printf':
    'prefix': 'pf'
    'body': """
        printf('\\\\n');
    """
```

# なぜこうなるか
`printf('\\\\n');` は,まず CSONパーサー によって `printf('\\n');` と評価され,次に snippet bodyパーサー によって `printf('\n');` と評価される.

`\\\\` ──CSON Parser─→ `\\` ──BodyParser─→ `\`

cf. https://github.com/atom/snippets/issues/128#issuecomment-94171361
CarrierWaveでのファイル名には時間を設定しないほうがいい

# はじめに
Ruby on Railsで画像をアップロードする際に、
ファイル名を時間にすることがあるかと思います。
そのやり方でやったところ、うまくいかなかったため、共有します。

```
(7/8 追記)
@komiyakさんから、コメント頂きました。
そちらもご参照頂ければと思います。
```

# 問題点
## オリジナルとthumbとでファイル名がずれることがある
アップロード時にthumbを作成するようにしていたところ、
下記のように、作成時間がずれるとファイル名が変わってしまい、
viewで表示する際に手間が発生してしまいました。

`20160313184754.jpg
thumb_20160313184755.jpg`

## 画像以外の要素を更新時にimageセルも変更されてしまう。
画像をアップロードせずに他の要素を更新すると、
imageセルの記載が更新され、アップロードされている画像のファイル名は更新されないため、
読み込めなくなってしまいました。

参照：[CarrierWaveでアップロードした画像のファイル名を日時にすると困る](http://xoyip.hatenablog.com/entry/2014/07/18/203000)


# 公式ドキュメントをもとにユニークなファイル名にしました。

```photo_uploader.rb
class PhotoUploader < CarrierWave::Uploader::Base
  def filename
    "#{secure_token}.#{file.extension}" if original_filename.present?
  end

  protected
  def secure_token
    var = :"@#{mounted_as}_secure_token"
    model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
  end
end
```


参照：[How to: Create random and unique filenames for all versioned files](https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Create-random-and-unique-filenames-for-all-versioned-files)
sshした先に.bashrcや.vimrcを持って行きたい人のためのsshrc


いろんなサーバーにsshしてちょろっと設定を確認したりするときってあると思います。
ただその時に`ll`がつかえなかったり、vimのタブが空白4つがいいのに8文字分の広さのtab文字だったりして、ちょっとずつストレスが溜まっていきます。

やっぱりserverfaultでもおなじ苦労をしている人がいました。

> vim - How to bring .vimrc around when I SSH? - Server Fault
> http://serverfault.com/questions/33423/how-to-bring-vimrc-around-when-i-ssh

ただここにあるようにdotfilesとして保存して先でcloneするのもとても面倒くさい。第一各サーバーへ変更を入れないといけないし。SSHの秘密鍵みたいに携えていきたい。

そこで探していたらsshrcというツールを見つけてこれが結構便利だったので簡単に紹介します。

## sshrcとは？

まさにさっきの問題の解決策といえるもの。

> Russell91/sshrc: bring your .bashrc, .vimrc, etc. with you when you ssh
> https://github.com/Russell91/sshrc

Macならbrewで簡単に入ります。

```bash
$ brew install sshrc
```

`ssh`の代わりに`sshrc`コマンドを使うことで、`~/.sshrc`に記述したコマンドをssh直後に自動で実行させることができます。

```bash
$ echo "alias ll='ls -l'" >> ~/.sshrc
$ sshrc me@myserver
$ type ll
ll is aliased to `ls -a'
```

シンプルな動作でわかりやすいですね。

## vimrcをもっていく

では早速vimrcを持ち歩きましょう。`~/.sshrc.d`に.vimrcをいれて`~/.sshrc`でそれを読み込むということをします。

```bash
$ mkdir ~/.sshrc.d
$ cd ~/.sshrc.d && ln -s ../.vimrc .vimrc/
$ cat << 'EOF' >> ~/.sshrc
export VIMINIT="let \$MYVIMRC='$SSHHOME/.sshrc.d/.vimrc' | source \$MYVIMRC"
EOF
$ sshrc me@myserver
$ vim # .vimrcが読まれてる！！
```

このとき`.vimrc`にNeobundleで管理しているbundleを読み込んでいて、bundleはいつもdotfilesリポジトリ下でNeobundleをgit submoduleしているんで、`~/.vim/bundle/neobundle.vim/`がないときはそれらを読まないという変更をしました。
基本的にtabstopとか`set nu`とか基礎的なものだけでもできれば満足です。

```vim
if isdirectory(expand("~/.vim/bundle/neobundle.vim/"))
    NeoBundle 'scrooloose/nerdtree'
    NeoBundleCheck
    " ほかにもいろいろ...
endif
```


## 終わりに

いままで結構小さなストレスだったので、こいつを発見できてよかった。
ちょっと触った感じはかなり便利です。もう少し使ってみて問題なさそうだったら`alias ssh='sshrc'`してしまおうかと思います。

私の使っている例はdotfilesを見ればわかるので興味がある人は見てみてください。

> ikuwow/dotfiles: my dot files
> https://github.com/ikuwow/dotfiles

## 追記

Kyratという、sshrcと同様に.bashrc等をssh先に持っていくsshのラッパーがあり、こちらを少し前にしばらく使っていました。

> SSH wrapper script that brings your dotfiles always with you on Linux and OSX
> https://github.com/fsquillace/kyrat

sshrcを意識して作られている様子で、[Comparison with sshrc](https://github.com/fsquillace/kyrat#comparison-with-sshrc)なんていう比較表があったりします。細かい違いは中身を見てみてください。

sshrcは更新がもうあまりされていないので、最近の更新頻度が高くownerがちゃんと返事をしてくれるkyratに移行していました。ただかなりいろんなファイルをsshした先に持っていこうとしたときにkyratでは持っていけるファイルに制限があり、sshrcはカスタマイズ次第で何でも持っていけるので、結局sshrcに戻りました。
VMware Fusion8 DHCP MACホスト側の変更

検索して見つかるWindowsの場合で言う dhcpd.conf かな？
※ このファイル変更すんなって書いてあるけど
Macでこの設定がどこにあるかわからなくてハマっていたのですが見つけたのでメモ

公式ドキュメントです
1. VMware KB: Modifying the DHCP settings of vmnet1 and vmnet8 in Fusion https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1026510
2. ちょっと古いけど同じ内容の日本語訳版
VMware KB: Fusion で vmnet1 および vmnet8 の DHCP 設定を変更する https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2077073


上の内容を簡単に書くなら
VNET_8_HOSTONLY_SUBNET のIPアドレスを変更したい値に書き換えてネットワークを再起動すれば良いです


```bash:aaa
$ sudo nano /Library/Preferences/VMware\ Fusion/networking
VERSION=1,0
answer VNET_1_DHCP yes
answer VNET_1_DHCP_CFG_HASH DCA28DB09F06E388CB7EECECE5E0ED63E2728F1E
answer VNET_1_HOSTONLY_NETMASK 255.255.255.0
answer VNET_1_HOSTONLY_SUBNET 172.16.1.0
answer VNET_1_VIRTUAL_ADAPTER yes
answer VNET_8_DHCP yes
answer VNET_8_DHCP_CFG_HASH 36472EA17E7DF4F7815F4C0A15C2EC9121347D0C
answer VNET_8_HOSTONLY_NETMASK 255.255.255.0
answer VNET_8_HOSTONLY_SUBNET 192.168.70.0
answer VNET_8_NAT yes
answer VNET_8_VIRTUAL_ADAPTER yes
$ sudo ./Macintosh HD/Library/Application\ Support/boot.sh --restart
```
季節外れのズンドコ(C#)

某twitterに流れてきたズンドコをC#で書いてみました。
下記のコードは何の工夫もなく機能を満たすように書いたもの。
直近5つを保持するのにQueueを使ったのが唯一の工夫っぽい点。

```c#:zundoko.cs
using System;
using System.Collections.Generic;

namespace zundoko
{
    class Program
    {
        static void Main(string[] args)
        {
            var q = new Queue<string>();
            var r = new Random();
            const string z = "ズン";
            const string d = "ドコ";
            const string g = z + z + z + z + d;

            while (true)
            {
                q.Enqueue(r.Next(2) == 0 ? z : d);
                if (q.Count == 5)
                {
                    if (string.Join("", q) == g)
                    {
                        Console.WriteLine(g + "キ・ヨ・シ！");
                        break;
                    }
                    Console.Write(q.Dequeue());
                }
            }
        }
    }
}
```
EC2でマネージドじゃない最新のLAMPスタックの構築


## 環境
 * Amazon EC2
  * Amazon Linux 2015.09 
 * [MariaDB 10.1](https://mariadb.org/download/)
 * [PHP 7.0.4](https://secure.php.net/downloads.php)
 * [Apache 2.4.18](https://httpd.apache.org/download.cgi#apache24)

## Amazon Linux
 * Development Toolsのインストール

```
# yum groupinstall -y 'Development Tools'
# yum groupinstall -y "Development Libraries"
```


## MariaDB 10.1

```
$ sudo vi /etc/yum.repos.d/MariaDB.repo
```

```MariaDB.repo
# MariaDB 10.1 CentOS repository list - created 2016-03-13 07:22 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```
```
$ sudo yum install -y MariaDB-server MariaDB-client
$ sudo /etc/init.d/mysql start
```
```
$ mysql_secure_installation
```

## Apache 2.4
```
# yum install apr*
# yum install pcre-devel
```
```
# cd /usr/local/src/
# wget http://ftp.meisei-u.ac.jp/mirror/apache/dist//httpd/httpd-2.4.18.tar.bz2
# tar xfj httpd-2.4.18.tar.bz2
# cd httpd-2.4.18
# ./configure --enable-so --prefix=/usr/local/apache2
# make 
# make install
```
```
# cp build/rpm/httpd.init /etc/rc.d/init.d/httpd2
# vi /etc/init.d/httpd2
```
```/etc/init.d/httpd2
#httpd=${HTTPD-/usr/sbin/httpd}
#pidfile=${PIDFILE-/var/run/${prog}.pid}
httpd=${HTTPD-/usr/local/apache2/bin/httpd}
pidfile=${PIDFILE-/usr/local/apache2/logs/httpd.pid}

#CONFFILE=/etc/httpd/conf/httpd.conf
CONFFILE=/usr/local/apache2/conf/httpd.conf
```

```
# chkconfig --add httpd2
# chkconfig --level 35 httpd2 on
# chkconfig --list | grep httpd2
```
```
# vi /usr/local/apache2/conf/httpd.conf
```
```httpd.conf
LoadModule php7_module modules/libphp7.so
AddType application/x-httpd-php .php
```


## PHP 7.0
```
# yum install -y libicu-devel
```

```
# cd /usr/local/src/
# wget http://jp2.php.net/distributions/php-7.0.4.tar.bz2
# tar xvfj php-7.0.4.tar.bz2
# cd cd php-7.0.4
```
```
./configure \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-openssl \
--enable-mbstring \
--enable-opcache \
--enable-intl \
--with-zlib-dir
```
```
# make
# make install 
```
```
# php -v
PHP 7.0.4 (cli) (built: Mar 13 2016 08:50:50) ( ZTS )
```
```
# cp /usr/local/src/php-7.0.4/php.ini-production /etc/php.ini
```