OmniAICreator/Qiita-1.07M huggingface dataset:
Gitのタグを一斉階層化するShellメモ

Gitのタグって階層構造に出来るのをさっき知ったので関わってるプロジェクトのタグを整理するためにShellで一気に階層化するShell書きました。

# 理想（Shell実行後）

実行後に`git tag` を使ったときの様子。

```
$ git tag
release/1.0/1.0.0
release/2.0/2.0.1
release/2.1/2.1.1
other/hikituide.simatta
```

# 現実(Shell実行前)

実行前に`git tag` を使ったときの様子。

```
$ git tag
1.0.0
2.0.1
2.1.1
hikituide.simatta
```

# やりたいこと

1. 自動で既に付いているタグを階層化してリモートに反映
2. 自動で既に付いているタグを削除してリモート(origin)に反映

# 僕の環境

* zsh(`zsh 5.1.1 (x86_64-apple-darwin15.0.0)`)
* git(`git version 2.7.4 (Apple Git-66)`)

# Shell

```original-replace.sh
#!/bin/zsh

for tag in `git tag`; do
   if [[ ${tag} =~ "^[0-9]+.*$" ]] ; then
       globalVersion=`echo ${tag} | cut -c 1-3`
       git tag -f release/${globalVersion}/${tag} ${tag}
       git tag -d ${tag};
       git push origin :${tag}
       git push origin release/${globalVersion}/${tag}
    else
       git tag -f other/${tag} ${tag}
       git tag -d ${tag}
       git push origin :${tag}
       git push origin other/${tag}
    fi
done

```

## 実行方法

gitで管理しているフォルダのルートフォルダで、以下を打つ

```
$ chmod +x ./arrange-tags.sh
$ ./arrange-tags.sh
```

# 説明

1. tagを取得してる。(`for tag`の行)
2. tagを正規表現でマッチングさせてる。(`if`の行)
3. もし数値から始まっていれば、先頭3文字を切り出してる。
4. 「1」で取ったタグのとこに、`release/「3」の切り出した文字列/「1」のタグ`のタグを付ける
5. 「1」で取ったタグを削除。
6. originに反映（追加したのと、削除したのを）。
7. 「1」で取ったタグが、数字から始まってなければ`other/「1」のタグ`のタグを付ける（その後、「5」「6」実行）


# 気をつけたい事

* `=~`(`イコールチルダ演算子`と言うらしい)は、バージョンによっては使え無い場合があるのでShell、Bash、zshのバージョンには気をつけてください。
* 誰かがリモートにタグをPushすると、再度古いタグが現れるので新しいタグを反映させるなら、↑のShell実行後、プロジェクトメンバに、①タグを全削除（`delete-all-tag.sh`実行）、②`git pull --tags`実行してもらう必要があると思ってます。

```delete-all-tag.sh
#!/bin/zsh

for tag in `git tag`; do
    git tag -d ${tag};
done
```

# 思ったこと

* global version なんて英単語は、無い気がする。
* Replaceが出来てないので、付けて削除ってやってる。そこ1行で出来る気がする。
* 同じこと書いてるところがあるので、綺麗にも書ける。
Qiitaでフォロー数が多いタグ一覧


Qiitaに投稿する時に、どのタグをつけるべきなのか迷った時にお使いください。
以下のページからの転記です。(2016年9月5日時点)

http://qiita.com/tags

| タグ名      | 投稿数 | フォロワー数 |
|-------------|--------|--------------|
| [JavaScript](http://qiita.com/tags/JavaScript)  | 10710  | 27929        |
| [HTML](http://qiita.com/tags/HTML)        | 1817   | 22410        |
| [CSS](http://qiita.com/tags/CSS)         | 2248   | 18843        |
| [iPhone](http://qiita.com/tags/iPhone)      | 1402   | 18168        |
| [PHP](http://qiita.com/tags/PHP)         | 7196   | 17769        |
| [Android](http://qiita.com/tags/Android)     | 6033   | 17551        |
| [Java](http://qiita.com/tags/Java)        | 5195   | 16963        |
| [Qiita](http://qiita.com/tags/Qiita)       | 742    | 16457        |
| [Ruby](http://qiita.com/tags/Ruby)        | 11179  | 16401        |
| [HTML5](http://qiita.com/tags/HTML5)       | 1198   | 15721        |
| [Python](http://qiita.com/tags/Python)      | 7229   | 14116        |
| [Git](http://qiita.com/tags/Git)         | 3923   | 14057        |
| [GitHub](http://qiita.com/tags/GitHub)      | 1699   | 13969        |
| [jQuery](http://qiita.com/tags/jQuery)      | 1926   | 12938        |
| [Linux](http://qiita.com/tags/Linux)       | 4556   | 12798        |
| [Vim](http://qiita.com/tags/Vim)         | 1945   | 12311        |
| [iOS](http://qiita.com/tags/iOS)         | 7411   | 11779        |
| [Objective-C](http://qiita.com/tags/Objective-C) | 3404   | 11103        |
| [Mac](http://qiita.com/tags/Mac)         | 3576   | 10838        |
| [CSS3](http://qiita.com/tags/CSS3)        | 658    | 10631        |
Shaderファイルの管理方法



## GLSLのコードを外部ファイルにまとめてインポートする

[ShaderLoader.js](https://github.com/codecruzer/webgl-shader-loader-js)を使用

シェーダープログラムを読み込むscriptタグと、
ShaderLoader.min.jsを用意

```html:index.html
<script data-src="shader/vertex.js" charset="utf-8" data-name="myShader" type="x-shader/x-vertex"></script>
<script data-src="shader/fragment.js" charset="utf-8"  data-name="myShader" type="x-shader/x-fragment"></script>

<script src="./js/libs/ShaderLoader.min.js"></script>
```




```javascript:script.js（ES6クラス内部から一部抜粋）
preload() {
  SHADER_LOADER.load( (data) => {

    const vs = data.myShader.vertex; // `myShader`はdata-nameに合わせる
    const fs = data.myShader.fragment;

    this.initListener(vs, fs);
  })
}

initListener(vs, fs) {

  ・・・（中略）・・・

  const material = new THREE.ShaderMaterial( {
    vertexShader: vs,
    fragmentShader: fs,
    uniforms : this.uniforms
  });
  
}
```

以下のようにシェーダープログラムを細かく分けることができた

```javascript:shader/vertex.js
varying vec2 vUv;
void main(void){
 vUv = uv;
   gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
```

```javascript:shader/fragment.js
uniform float time;
varying vec2 vUv;
void main(void){
    vec2 position = -1.0 + 2.0 * vUv;
    float r = abs( sin( position.x * position.y + time / 3.0 ) );
    float g = abs( sin( position.x * position.y + time / 2.0 ) );
    float b = abs( sin( position.x * position.y + time / 1.0 ) );
        vec3 color = time == 0.0 ? vec3( 1.0, 0.0, 0.0 ) : vec3( r, g, b ) ;
        gl_FragColor = vec4( color, 1.0 );
}
```



> 参考
[GLSLを使ってワンランク上の表現を！ three.jsでのぷるぷるシェーダーの作り方](https://ics.media/entry/3228)
Railsでベーシック認証もどきを導入する

サーバーにnginxを導入していて、再起動したくないけど、deviseを使わずにベーシック認証のような物をしたいと思って作ったのでメモ。

#　要件
1.ユーザーとパスワードは1つ
2.特定のページにアクセスする時に認証ダイアログを出す。
3.できるだけセキュリティを厳しくする

#　参考ページ
[RailsでBasic認証する方法と注意事項](http://altarf.net/computer/rails/2477)
[MD5変換をします。(Convert MD5)](http://www.kiyori.co.jp/md5reverse/)

#　やったこと
1.controllerにbefore_actionで認証を先に行う。
2.特定のページ(dog)のみなのでbefore_actionの「only:」でページ指定する。
3.IDは「admin」、PASSは「secret」とする。

#コード
```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  before_action :authenticate, only: [:dog]
  require 'digest'

 def cat
  @form = Cat.new
 end

 def dog
  @form = Dog.new
 end

 private
  def authenticate
    authenticate_or_request_with_http_basic('Administration') do |username, password|
      md5_of_password = Digest::MD5.hexdigest(password)
      username == 'admin' && md5_of_password == '5ebe2294ecd0e0f08eab7690d2a6ee69'
    end
  end
end
```

#　雑感
とりあえずベーシック認証っぽい動きはする。
publicディレクトリ以下には使えない。
md5変換していると言ってもソースにID・PASSを記載するのはあまりよろしくないので、本来はサーバー環境変数を使う方がいい。
自分にはまだまだサーバー環境変数を使う程の知識がないので、現状ではこれで満足。
There was an error while trying to load the gem 'uglifier' と出て ruby のサーバーが起動できない件

`rescue in block (2 levels) in require': There was an error while trying to load the gem 'uglifier'. (Bundler::GemRequireError)
Gem Load Error is: Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes.

[こちらの記事で解決](http://qiita.com/pugiemonn/items/11a2bc8403e5947a8f13)

・・・なんですけど、Gemfile とかいうのがどこにあるのか・・・・。
探しまわったら、Rakefile とかいうのと同じディレクトリにあるんだそうな。
場所はプロジェクトのディレクトリにありました。

そして

bundle install すると、追加のパッケージが開いて、
rails s できた！！

が、どうも外部からブラウザでアクセスできない・・・。

今度は、ポート３０００番が開いてない？
すでに http や ssh は使ってるので、外部との接続やポート設定には問題はないはず。

と思ったら、こんどは[こちらの記事で解決](http://qiita.com/tmf16/items/bb789a45c0f456eac11f)

rails s -b 0.0.0.0

としないと、ローカルホスト以外からアクセスできないのね。apache の listen とかと似てるな。

アクセスしたら、Yay! とか出てきた（笑）

毎回プチハマりになるなぁ
target="_blank" で開くリンクには rel="noopener" をつける

[The performance benefits of rel=noopener - JakeArchibald.com](https://jakearchibald.com/2016/performance-benefits-of-rel-noopener/) より

target="_blank" でリンクを開く場合は、```rel="noopener"```をつけておくのが良い。

管理画面などでは ```rel="noopener noreferrer"```というかたちでnoreferrerをつけるとさらに良いかもしれない（参考：http://qiita.com/wakaba@github/items/707d72f97f2862cd8000 ）

```target="_blank"``` で開いたWindowは、 [window.opener](https://developer.mozilla.org/ja/docs/Web/API/window.opener) を使って親のWindowを操作することができる。つまり```target="_blank"```で開いたサイトで任意の操作ができてしまうことになるけど、[Same origin](https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy) の仕組みが働く。ので、Same originではない場合に取得できるのは[異なるオリジンへスクリプトからアクセスできる API
](https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy#Cross-origin_script_API_access)に載っているプロパティしかなく、大きな問題はない（古いブラウザなどは知らないけど）。

けれども、```window.opener.location = newURL```でopenerを他のURLに移動させることはできるので、やはり必要なければnoopenerをつけておく方がいい（[window.location](https://developer.mozilla.org/ja/docs/Web/API/Window/location)がsame originでなくても書き込み可能なのはなぜだろう）。

[The performance benefits of rel=noopener - JakeArchibald.com](https://jakearchibald.com/2016/performance-benefits-of-rel-noopener/)によると、さらにnoopenerをつけることでパフォーマンスにも良い影響があるとのこと。

> However, due to the synchronous cross-window access the DOM gives us via window.opener, windows launched via target="_blank" end up in the same process & thread. The same is true for iframes and windows opened via window.open.

> rel="noopener" prevents window.opener, so there's no cross-window access. Chromium browsers optimise for this and open the new page in its own process.

window.openerを使えるように同じprocess & threadを使うから、```target="_blank"```で開いたウィンドウで何か重い処理をされると、親のウィンドウの処理も一緒に遅延すると。

上記URLではデモも用意されているので、とても参考になる。おすすめです。
Markdown記法で忘れがちなこと


## ときどき忘れちゃうのでメモ
基本的にはQiitaさんの用意している[チートシート](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)で満足なんですが。

---
(修正 16/09/06 00:23)
さすがに書き方雑すぎたので直します。
書いてること自体は変わってないはず。


# リストの一文は改行できるっぽい
## 比較
### ただの改行
```
- リストの途中ですが//改行
改行しますね
```
- リストの途中ですが
改行しますね

### 改行の前に半角スペース2つ
```
- リストの途中ですが  //半角スペース2つ + 改行
改行しますね
```

- リストの途中ですが  
改行しますね

---
## なにができるようになったのか
議事録的なメモとかとってて階層が深くなりすぎるのを防止する手助け的なこと。

###よく失敗する

```
- タイトル1
  説明文〜〜〜
  - 小トピック1
    説明文
  - 小トピック2
```

- タイトル1
  説明文〜〜〜〜
  - 小トピック1
    説明文
  - 小トピック2

### こう書けばOK
```
- タイトル1  //ここに半角スペース2個
  説明文〜〜〜〜  
  複数行もOK  //頭のスペースは無視される
  - 小トピック1  //ここに半角スペース2個
説明文 //これでもよい(揃えたほうが好きだけど)
  - 小トピック2
```

- タイトル1  
  説明文〜〜〜〜  
  複数行もOK  
  - 小トピック1  
説明文 
  - 小トピック2


他にもあった気がするけど忘れちゃったなあ。
グローバル IP アドレスを確認するための URL を Nginx だけで作る

curl でグローバル IP アドレスを確認できるサービスはいくつかある[^curl_ip]が、URL が覚えられずに毎回ググッていて効率が悪いことこの上ない。

[^curl_ip]: http://qiita.com/kanpou_/items/734b947f5a95109e7bb9

自分の持っているドメインなら覚えているだろうし、自分の持っているドメインでグローバル IP アドレスを確認できるようになったら便利。

# Nginx でやる方法
ここでは `example.com` というドメインを保有しているとして、 `example.com` のサーバに Nginx を入れて以下のように設定する。

``` nginx.conf
server {
    listen 80;
    server_name example.com;

    location /ip {
        add_header Content-Type text/plain;
        return 200 "$remote_addr\n";
    }
}
```

使うときはこう。

```
$ curl example.com/ip
```

簡単。

# それ以外の方法
サーバレスでやりたいなら API Gateway を使えばいいけど、あれ HTTPS にしか対応していないので curl で叩くときに `-L` オプションを付けないといけないしそんなの覚えてられない。

サーバレスかつ HTTP でグローバル IP アドレスを返す方法があるなら教えてほしい。
flamingoで変換されたページの変換する・しないを切り替えるJavaScript


flamingoではユーザーエージェントによって表示されるテンプレートが切り替りますが，デバッグ等で意図的に変換させたくない場合があります。
意図的に変換させたくない場合は，ブラウザのコンソールより以下コードを実行することで変換する・しないを切り替えることが出来ます。

```
(function(){ var tar = document.cookie.indexOf('_fl_skipmobile') === -1 ? 'pc' : 'sp'; Flamingo.switchType(tar); })();
```

----

注：[flamingo](http://gomobile.jp/flamingo/)は，GOMOBILEサービス群のモバイルサイト最適化サービスです。
ホームディレクトリの絶対パスに空白が含まれるとmakeが落ちる

##状況
OS X 10.11 で、makeが転けるとき、絶対パスで処理しようとして、ドライブ名などに空白が含まれると、空白文字がデリミタと解釈され、そこでパスの解釈に誤りが生じる場合がある。たとえば、`/Volume/foo bar/Users/naito/github/ecell3` が、`/Volume/foo` と `bar/Users/naito/github/ecell3` に分割され、`make` 実行時に下のようなエラーになることがある。
`clang: error: no such file or directory: 'bar/Users/naito/github/ecell3'`

##対応
例えば、絶対パス `/Volume/foo bar/Users/naito/github/ecell3` が、`/Users/naito/github/ecell3` にリンクされているなら、
`$ cd /Users/naito/github/ecell3` などとして、`pwd` した際に、絶対パスではなく、リンク名の（空白文字を含まない）パスが出るようにすれば `make` は、そちらのパスで実行してくれる。

##原因
おそらく、`~/xxx` など相対パスを用いた際に、相対パスが絶対パスで置換されるためではないか。（未確認）
c++ builder XE4 > エラー > 長すぎたため切り捨てられた行があります。. > 3200文字はだめ > 文字列リテラル255文字制限

```txt:動作環境
C++ Builder XE4
```

テスト用のダミー文字列をString型で定義しようとした。

```
static const String kDummyText = L"DummyText";
```

上記のダミー文字列に3200文字の文字列を入れたところ、以下のエラーが表示された。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/dd470cf9-9542-4b9b-4afc-480b1b3b9a40.png)

どこで切り捨てられたか見ようとしたらIDEが固まった。

以下のincludeを使った方法は問題ないのだろうか?
http://qiita.com/7of9/items/cb2fdeba5ad0d232311e

includeを使った方法でも同じエラーが出た。

以下を見つけた。
http://stackoverflow.com/questions/8767899/how-can-delphi-string-literals-be-more-than-255
> answered Jan 7 '12 at 7:14
Mikael Eriksson
> So string is not limited to 255 characters but a string literal is. That means that you can build a string that is longer than 255 characters but you can not have a string value in code that is longer than 255 characters. You need to split them if you want that.

LoadFromFile()など使ってファイルから読込むときは制約はないが、文字列リテラルとしては255文字の制約があるようだ。

同じ人(Mikael Eriksson)の回答で255文字以内の文字列リテラルを複数くっつけることはできそうだが、3200文字を255文字ごとに区切るのと、LoadFromFile()を実装をするのとでは、後者の方が変化に対応できる。
jQueryでファイルアップロードの情報を取得する

# filesを使って配列で取得する
`$("#input-file").files`

こんな感じで配列が取れる
![スクリーンショット 2016-09-05 15.58.33.png](https://qiita-image-store.s3.amazonaws.com/0/136239/b9520734-d62a-28e9-7251-267037368cdb.png)
storyboard上で、UITableViewの区切り線と背景色を変更する


## TableViewのセパレータの線を消す

![image](https://qiita-image-store.s3.amazonaws.com/0/37406/e93d886a-a5d2-3a82-5729-375ce9df12e7.png)

Separatorを**None**に変更


## TableViewのデータがない部分の背景色を変更

対象のTableViewを選択し、下のViewの項目にBackgroundという項目があるので、
こちらで背景色を変更可能

![image](https://qiita-image-store.s3.amazonaws.com/0/37406/1cfd060f-311e-aa39-b3be-fc5500f3e1e3.png)
デバッグ版の未初期化メモリパターン

http://msdn.microsoft.com/en-us/library/aa260966(VS.60).aspx
から引用します。
Windowsアプリケーションのデバッグ版における未初期化変数は以下の値で埋められます。

#### Table 1. Potential patterns

|Pattern|Description
|-------|-----------
| 0xFDFDFDFD| No man's land (normally outside of a process)
| 0xDDDDDDDD| Freed memory
| 0xCDCDCDCD| Uninitialized (global)
| 0xCCCCCCCC| Uninitialized locals (on the stack)

## メモリダンプから原因を切り分ける

デバッガで変数をメモリダンプし、その値から問題を切り分けます。

* ポインタ先の変数のダンプが、0xFDFDFDFD ならば、ポインタ計算の誤りです。
* ポインタ先の変数のダンプが、0xDDDDDDDD ならば、メモリ開放して無効になった変数へのアクセスです。
* 変数のダンプが、0xCDCDCDCD または 0xCCCCCCCC ならば、変数の初期化忘れです。
Sublime Text > Win > ショートカット > グリッド間の移動 > Ctrl+1 / Ctrl+2 / Ctrl+3 / Ctrl+4

```txt:動作確認
Sublime Text2 on Windows 7 
```

Sublime TextにてLayoutをグリッドとして使用している。
http://qiita.com/7of9/items/6fb81985dae3eb5446ca

グリッド間の移動にはマウスを使っていたが、コーディング中にマウスを使うのは不便である。

探してみると、グリッド間は`Ctrl+数字`で移動できるようだ。

https://forum.sublimetext.com/t/switching-between-columns-layout/11450

>  I'm using Ctrl + 1 - 3 shortcut key. 

確認したところ以下のように移動できた。

- 左上のグリッド: Ctrl+1
- 右上のグリッド: Ctrl+2
- 左下のグリッド: Ctrl+3
- 右下のグリッド: Ctrl+4
Open AI Gymをインストールする

環境：
CPU:Corei7 6700K
GPU:GTX1070
SSD:240GB
HDD:1TB
マザーボード:ASUS H170-pro
OS:Ubuntu14.04 LTS
python:2.7.6
CUDA:8.0 RC
cuDNN:5.1
TensorFlow:0.10.0
など

過去４回で、Ubuntu14.04、CUDA、chainer、dqn、LIS、Tensorflowを順次インストールした。
http://qiita.com/masataka46/items/94417a5974dba810e7b8
http://qiita.com/masataka46/items/fddef236cb211ef3f145
http://qiita.com/masataka46/items/125c7900ec8ca83f6eb2
http://qiita.com/masataka46/items/12fb01f3417bd0791703
~~ただし、Unityがうまく立ち上がらないため、最後のLIS環境構築は完了していない。~~

今回はOpen AI Gymをインストールする。まずはここの指示
https://gym.openai.com/docs
に従って進める。
##Open AI Gymをインストール
まずGitHubからcloneする。

```
git clone https://github.com/openai/gym
cd gym
```
fullインストールする方法もあるが、とりあえずminimumでインストールする。

```
pip install -e .
```

##サンプルを走らせる
HPの指示に従って、簡単なサンプルを走らせる。

```
import gym
env = gym.make('CartPole-v0')
env.reset()
for _ in range(1000):
    env.render()
    env.step(env.action_space.sample()) # take a random action
```

というコードにtest01.pyなど適当な名前を付け、

```
python test01.py
```

で走らせる。すると以下のようなエラーが表示された。

```
[2016-09-05 18:09:35,235] Making new env: CartPole-v0
[2016-09-05 18:09:35,690] You are calling 'step()' even though this environment has already returned done = True. You should always call 'reset()' once you receive 'done = True' -- any further steps are undefined behavior.
Traceback (most recent call last):
  File "test01.py", line 5, in <module>
    env.render()
  File "/home/ohmasa/openAIGym/gym/gym/core.py", line 189, in render
    return self._render(mode=mode, close=close)
  File "/home/ohmasa/openAIGym/gym/gym/envs/classic_control/cartpole.py", line 149, in _render
    return self.viewer.render(return_rgb_array = mode=='rgb_array')
  File "/home/ohmasa/openAIGym/gym/gym/envs/classic_control/rendering.py", line 84, in render
    self.window.dispatch_events()
  File "/usr/local/lib/python2.7/dist-packages/pyglet/window/xlib/__init__.py", line 853, in dispatch_events
    0x1ffffff, byref(e)):
ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: wrong type
```

しかし、次のサンプル

```
import gym
env = gym.make('CartPole-v0')
for i_episode in range(20):
    observation = env.reset()
    for t in range(100):
        env.render()
        print(observation)
        action = env.action_space.sample()
        observation, reward, done, info = env.step(action)
        if done:
            print("Episode finished after {} timesteps".format(t+1))
            break
```

はepisodeを最後まで実行し終了した。場合によってはうまくいくのか？
stylus のハッシュをディープマージ

JavaScript の `hasOwnProperty` を使いたいので、 [use()](http://stylus-lang.com/docs/bifs.html#usepath) で使うために `has-own-property` を用意します。

```js:has-own-property.js
module.exports = () => (style) => {
  style.define('has-own-property', (obj, key) => {
    return JSON.parse(obj).hasOwnProperty(key.val);
  });
};
```

`has-own-property` が用意されたファイルを読み込んで、`get-deep-merge` mixins を定義します。

```stylus:mixin
use('plugins/has-own-property.js')

get-deep-merge(a, b)
  c = merge({}, a)
  for key in b
    if has-own-property(b, key)
      if has-own-property(a, key) && (typeof(a[key]) == 'object' && typeof(b[key]) == 'object')
        c[key] = get-deep-merge(a[key], b[key])
      else
        c[key] = b[key]
  return c
```

そんで実行。

```stylus:実行
obj-1 = { a: 'aaa', b: 'bbb', c: { c1: 'ccc1', c2: 'ccc2' } }
obj-2 = { b: 'bbbbb', c: { c2: 'ccc2ccc2' } }

merge-obj = get-deep-merge(obj-1, obj-2)

p(merge-obj)  // => {"a":"('aaa')","b":"('bbbbb')","c":"({\"c1\":\"('ccc1')\",\"c2\":\"('ccc2ccc2')\"})"}
```

## 参考
- [再帰的なオブジェクトのマージ](https://gist.github.com/ww24/2181560)
Psych::BadAliasなエラー

railsを触っているあるとき何気なく`rake db:migrate`をしようとしたら

![スクリーンショット 2016-09-05 15.27.59.png](https://qiita-image-store.s3.amazonaws.com/0/117824/c9c17921-ffe5-2689-9521-594f810f1932.png)

こんなエラーが出てきて少し焦りましたが
ただdatabase.ymlにdefaultの部分をうっかり消してしまっただけでした...

```rb
default: &default
  adapter: sqlite3
  pool: 5
  timeout: 5000
```

を記述したら直りました！！
JavaScript文法(6) 関数の応用2

# この記事の内容

* 関数の引数に関数を指定する方法
* コールバック関数について

# 目次

(1) [学習環境の構築と基本的な書き方](http://qiita.com/azk0305/items/a13d494178d83fc8f2bc)
(2) [変数とデータ型](http://qiita.com/azk0305/items/d78d744dff9656b22dd0)
(3) [演算子および配列](http://qiita.com/azk0305/items/748f4afadcfa5350a552)
(4) [制御構文と関数](http://qiita.com/azk0305/items/ed943040a8f7140d5a48)
(5) [関数の応用1](http://qiita.com/azk0305/items/f7e0653b20425fdb9f1b)
(6) 関数の応用2 **<-- この記事の内容**
(7) [オブジェクトの基礎](http://qiita.com/azk0305/items/0d2018a1c6e547b7f65a)
(8) [JavaScriptのオブジェクト指向プログラミング1 概要](http://qiita.com/azk0305/items/1e1bd10522927eaddd6a)
(9) [JavaScriptのオブジェクト指向プログラミング2 オブジェクトの作り方と継承](http://qiita.com/azk0305/items/386b3a2ac41caf3101e1)
(10) [JavaScriptのオブジェクト指向プログラミング3 多態性](http://qiita.com/azk0305/items/1c713562f6f842dcf1dc)
(11) [JavaScriptのオブジェクト指向プログラミング4 カプセル化](http://qiita.com/azk0305/items/914f6e447b41d4ced25e)
(12) [ES6の新機能について](http://qiita.com/azk0305/items/ebfb43c088101f7138f9)

# 関数の引数に関数を指定する

前回の続き。関数の引数に関数を指定して、関数の中で「引数として渡した関数」を実行してもらうことがJavaScriptでは可能である。

```js:bs06_01.js
// 引数funcに渡された関数を実行する
var sumFunc = function(a, b, func) {
  return func(a) + func(b);
};

// 13 が表示される（3 * 3 + 2 * 2の計算結果）
console.log(sumFunc(3, 2, function(x) {
  return x * x;
}));
```

sumFunc関数では、3番目の引数で関数を受け取り、その関数を実行する。引数として受け渡す関数の処理内容は、引数の数値を2乗する計算である。`func(a) + func(b)`とあるように、引数aと引数bに渡された数値で、その計算処理（2乗する計算）を行い、それぞれの計算結果を加算してreturnするのがsumFunc関数である。このように、関数の引数に関数を渡すことができる。

# コールバック関数

関数の引数に関数を指定できるJavaScriptの仕様の代表的な利用例として、**コールバック関数**がある。関数としてひとまとめにした処理の最後に実行したい関数を、引数として指定する記述方法である。

```js:bs06_02.js
// 面積を求めるcalcSquare関数
var calcSquare = function(a, b, callback) {
  console.log("処理開始");
  console.log("面積は " + (a * b));
  callback();            // コールバック関数を実行
};

// コールバック関数の内容は、処理終了 と表示するだけの処理
calcSquare(10, 5, function() {
  console.log("処理終了");
});
```

```text:bs07_02.jsの実行結果
処理開始
面積は 50
処理終了
```

このように記述することで、処理の最後に、引数で渡された処理を実行することができる。
コールバック関数の利点としては、1つに、calcSquare関数の**再利用が可能**である点が挙げられる。実際、JavaScript製のライブラリでは、コールバック関数が指定できるように実装されているものが多数ある。

# コールバック関数と非同期処理

もう1つ、コールバック関数は、**Ajax通信などの非同期処理**で非常に役に立つ。ここでは、非同期処理を実現する命令の中でも手軽な `setTimeout` 関数を利用して、話を進める。

まず、このような内容を記述して実行してみる。

```js:bs06_03.js
console.log("処理開始");

setTimeout(function() {
  console.log("処理実行");
}, 3000);

console.log("処理終了");
```

`setTimeout` 関数は、引数として指定した関数（ひとまとまりの処理）を、指定したミリ秒後に実行する。ここでは、

```js
setTimeout(function() {
  console.log("処理実行");
}, 3000);
```

このように記述しているので、「処理開始」と表示された3000ミリ秒（3秒後）に「処理実行」を表示することになる。しかし、実際の処理結果は、以下のようになる。

```text:b06_03.jsの実行結果
処理開始
処理終了
処理実行
```

`setTimeout` の下にある「処理終了」を表示する命令が先に実行されてしまうのである。これは、`setTimout` で指定した命令が非同期処理として実行されるため、`setTimeout` の実行完了を待たずして、`setTimeout` の下に続く命令が順次実行されていくことになる。

非同期処理が完了したタイミングで何らかの処理を実行させたい場合は、コールバック関数を利用して記述する。

```js:bs07_04.js
// 非同期処理の定義
var execTimeOutFunc = function(callback) {
  setTimeout(function() {
    console.log("非同期処理実行");
    callback();
  }, 3000);
};

// ここから処理開始
console.log("処理開始");

execTimeOutFunc(function() {
  console.log("非同期処理完了");
});

console.log("処理終了");
```

```text:b06_04.jsの実行結果
処理開始
処理終了
非同期処理実行
非同期処理完了
```

このように記述することで、「非同期処理完了」の表示は、確実に「非同期処理実行」の後で表示される。

# 次回予告

オブジェクトの基礎
JavaScript文法(5) 関数の応用1

# この記事の内容

* 無名関数とは何か
* 即時関数とは何か

# 目次
(1) [学習環境の構築と基本的な書き方](http://qiita.com/azk0305/items/a13d494178d83fc8f2bc)
(2) [変数とデータ型](http://qiita.com/azk0305/items/d78d744dff9656b22dd0)
(3) [演算子および配列](http://qiita.com/azk0305/items/748f4afadcfa5350a552)
(4) [制御構文と関数](http://qiita.com/azk0305/items/ed943040a8f7140d5a48)
(5) 関数の応用1 **<-- この記事の内容**
(6) [関数の応用2](http://qiita.com/azk0305/items/0fd54f9c66f726443dd6)
(7) [オブジェクトの基礎](http://qiita.com/azk0305/items/0d2018a1c6e547b7f65a)
(8) [JavaScriptのオブジェクト指向プログラミング1 概要](http://qiita.com/azk0305/items/1e1bd10522927eaddd6a)
(9) [JavaScriptのオブジェクト指向プログラミング2 オブジェクトの作り方と継承](http://qiita.com/azk0305/items/386b3a2ac41caf3101e1)
(10) [JavaScriptのオブジェクト指向プログラミング3 多態性](http://qiita.com/azk0305/items/1c713562f6f842dcf1dc)
(11) [JavaScriptのオブジェクト指向プログラミング4 カプセル化](http://qiita.com/azk0305/items/914f6e447b41d4ced25e)
(12) [ES6の新機能について](http://qiita.com/azk0305/items/ebfb43c088101f7138f9)

# 関数もオブジェクト

配列が `Array` 型のオブジェクト、連想配列が `Object` 型のオブジェクトだったように、JavaScriptの関数も、実は `Function` 型のオブジェクトになる。
関数がオブジェクトであることの利点のひとつに、**関数の定義を変数に格納できる**というものがある。

```js:bs05_01.js
function getOne() {
  return 1;
}

// 関数名の後ろに括弧は不要。
// 括弧をつけると実行結果の代入になる。
var f = getOne;

console.log(f());             // f() と書くことで getOne関数が実行され、1 と表示される
```

# 関数式と匿名関数（無名関数）

`bs05_01.js`は、つまり、`getOne`関数に `f` という別名をつけたことになる。こうするなら、わざわざ `getOne` という関数名をつける必要は無いわけで、このようにも記述できる。

```js:bs05_02.js
var f = function() {
  return 1;
};

console.log(f());    // 1 と表示される
```

上の例は引数なしの関数で示しているが、引数があっても同じである。

```js:bs05_03.js
var add = function(x, y) {
  return x + y;
};

console.log(add(3, 2));    // 5 と表示される
```

このように、関数の定義を変数に代入する記述方法を**関数式**と呼び、関数名をつけないで定義している関数のことを**匿名関数（無名関数）**と呼ぶ。まとまった複数の処理を定義したいが、再利用を考える必要がない（記述する場所でしか利用しない）場合は、匿名関数を利用すると、余計なことを考える必要がないので便利。

※注意：関数式で関数を定義する場合は、**その関数の呼び出しをする際、定義した箇所よりも下に記述する**。定義より前で呼び出すと「その関数は見つからない」という内容のエラーになる。

```js:bs05_04.js
console.log(subt(3, 2));     // ここでsubtを実行しようとすると「subtが見つからない」エラーになる

var subt = function(x, y) {
  return x - y;
};
```

# 即時関数

通常の関数の定義でも関数式による定義でも、必ず関数を呼び出さないと定義した内容が実行されない。ひとまとまりの処理を定義して、さらに定義と同時に実行するための記述方法を**即時関数**と呼ぶ。即時関数は、無名関数の利用例のひとつである。

```js:bs05_05.js
// この記述だけで こんにちは、田中さん！ と表示される
(function(name) {
  console.log("こんにちは、" + name + "さん！");
})("田中");
```

即時関数の書き方は、上記のように、関数の定義を括弧で囲み、更にその直後に括弧をつけ、その中に引数に与えたい値を指定する（引数がなければ空の括弧で良い）。
下の例のように、即時関数の実行結果を変数に格納するような記述方法も可能。

```js:bs05_06.js
var sum = (function(a, b) {
  return a + b;
})(3, 2);

console.log(sum);            // 5 と表示される
```

# 次回予告
関数の応用　その2
Rubyでプロキシ経由でWebAPIを使うときのメモ

RubyでWebAPIを使うにあたって

* プロキシ経由でどうやって接続するの？
* httpsは？
* POSTは？
* レスポンスヘッダやステータスコードもみたいんだけど・・・

みたいなことがよくわからなかったのでメモ。

``` .ruby
require 'net/https'
require 'uri'

## プロキシの設定
proxy_addr = 'hogehoge.com'
proxy_port = 8080
proxy_user = 'user_name'
proxy_pass = 'user_password'



## 接続先URLを指定してパース
URL = "http://hogehoge/fuga"
uri = URI.parse(URL)


## リクエストのヘッダーとボディを設定する。POSTメソッドを指定
req = Net::HTTP::Post.new(uri.path)

# リクエストヘッダの指定（指定しない場合は省略可）
req["Content-Type"] = "application/json"
req["Accept"] = "application/json"

# ボディとなるjsonファイルの読み込み（指定しない場合は省略可）
file = File.read("token_req.json")

# リクエストボディを挿入（指定しない場合は省略可）
req.body = file

# 今回はjson形式のテキストファイルを直接挿入しているけど、
# Rubyのハッシュをセットしたい場合には
# req.set_form_data({'name' => 'hoge', 'content' => 'hogehoge'})
# みたいな感じでも書けるらしい


## httpsプロトコル接続用のインスタンスを作成
https = Net::HTTP.new(uri.host, uri.port,proxy_addr, proxy_port, proxy_user, proxy_pass)
https.use_ssl = true     # HTTPSで接続（https使わないなら省略可）
https.verify_mode = OpenSSL::SSL::VERIFY_NONE     #証明書チェックを無効化（https使わないなら省略可）


## 接続を開始
res = https.start do
  https.request(req)
end

## レスポンスステータスを表示
puts res.code

## レスポンスヘッダを表示
res.each_header do |name, val|
  puts "#{name}: #{val}"
end

## レスポンスボディを表示
puts res.body
```
【地味に便利】GitHubでPull Requestの向き先を変更する方法

GitHubでPull Request（PR)の向き先を変更できるUIが追加されました。

https://help.github.com/articles/about-pull-requests/

### やり方

![1](http://drive.google.com/uc?export=view&id=1IqtCRoAHss4DzQxkmpvg3gaDmnhBZMCn)
![2](http://drive.google.com/uc?export=view&id=1bY_ydgqaFASMvHwskN9oK8D_piVgfDFU)
- 各PRの画面に行き右上のeditボタンをクリック（タイトルを変更するときに使っていたもの）
- ブランチのbase部分がセレクトボックスになるので、新しいブランチを選ぶ
- 保存すると確認アラートが出るのでOKする

社内で共有されて使っているのですが、かゆいところの手が届いた感じで地味に便利です
SSHを経由して自分のデータベースにMySQLで接続する方法

WordPressで使ってるデータベースにアクセスしてMySQLコマンドとか練習したり勉強したいなぁと思ったのでその時のメモ。

## SSH接続

`$ ssh ユーザー名@初期ドメイン`

ここでパスワードを求められるので入力。
入力すると`Welcome to FreeBSD!`と出てきてSSH成功です。

## MySQLでデータベース接続

`$ mysql -u ユーザー名 -h ホスト名 -p`

これをたたくとMySQLとデータベースの接続が完了。

## 補足

### ホスト名確認方法

`mysql> show variables like 'hostname';`

そもそもログイン後にたたくものなんで意味ないと思うけど念のため
機械学習論文読みメモ_1

[FractalNet: Ultra-Deep Neural Networks without Residuals](https://arxiv.org/pdf/1605.07648.pdf)
フラクタル構造に基づくNNモデルを提案。ResNetの構造を用いずとも、それに比する性能を出せる。
この構造は自然な形で従来のNN構造に取り入れられてきた、Deep Supervision、student-teacher learning、nested structureが現れてくる。

[Reducing the Model Order of Deep Neural Networks Using Information Theory](http://arxiv.org/pdf/1605.04859.pdf)
フィッシャー情報量に基づいてDLモデルを小さくする。
情報量自体は確率的最適化を行う際に２次の情報までを求める事で予測する。
この情報量に基づき、不要なパラメータを削除し、また高い情報量を持つパラメータに対してはより多くのビットをアサインする。

[Deep Reinforcement Learning with Double Q-learning](https://arxiv.org/pdf/1509.06461.pdf)
overestimationはDQNで起こるといわれている現象で、Q関数の評価時に行動と状態価値を同時に入力した累積利得評価に基づくために、行動に対する状態価値評価が、直接的に評価できない事から生じるずれに起因する。
今回Q関数を２つにする事で、行動に対する状態価値評価と、全体の累積利得価値評価を分けるDouble DQNを提案して、それらを回避する。

[Language Understanding for Text-based Games using Deep Reinforcement Learning](https://arxiv.org/pdf/1506.08941v2.pdf)
テキストゲームをRLにより学習する。
これらはすべてテキスト入力のみで成立し、それを元に正解行動を学習する。
これらはDQNのフレームワークで学習され、従来のBag-of－Words的な手法よりも高い性能を出せる。

[Contrastive Structured Anomaly Detection for Gaussian Graphical Models](https://arxiv.org/pdf/1605.00355.pdf)
gaussian graphical model(GGM)に基づく異常検知手法を提案する。
異常を含まないデータによる精度行列推定値と異常を含む恐れのあるテストデータの精度行列推定値の差を監視する事で、GGMの構造的な異常を検知する。
この時、L1誤差を罰則項としてGGMの学習を行う事で、ロバストに構造変化だけを注目できる。
canvas要素のテキストの文字間を広げる

![スクリーンショット 2016-09-05 13.44.19.png](https://qiita-image-store.s3.amazonaws.com/0/114495/0c64016f-0218-2815-1165-f529adc87900.png)
このテキストを広げてあげたい。

###CSSのletter-spacingを当ててあげる
canvas要素にletter-spacingを当ててあげると
canvasで描画されたテキストにも適応される

![スクリーンショット 2016-09-05 13.44.06.png](https://qiita-image-store.s3.amazonaws.com/0/114495/3ebf86ad-62e0-ebd9-76ac-693e25f0c22e.png)
こんな感じに広がってくれます。


###letter-spacingにアニメーションを当ててみる
CSS Animationでletter-spacingプロパティをいじってあげると動きます。
用途がかなり限られると思いますが…

![dot_bbj.gif](https://qiita-image-store.s3.amazonaws.com/0/114495/25f64634-6811-c1e4-16e0-0080543266a6.gif)

また、js側でfontを指定してあげるのとcanvasを都度更新してあげないとCSS Animationは適応されませんでした…

```js
function render(){
  stage.clear();
  c.textAlign = 'center';
  c.font = '24px "Fjalla One"'; // <= フォントの指定をしてあげないとCSS Animationが効きませんでした。
  c.fillStyle = '#59bb0c';
  c.fillText('HELLO Qiita',200,00);
  rendering = requestAnimationFrame(render);// あとcanvasの描画を更新も
}
```

正直使いどころがないと思いますが、ちょっと面白かったので記事を書いてみました。
kipmi0プロセスのCPU使用率を下げる方法

**kipmi** のプロセスのCPU使用率が100%に張り付くことがあります。
OSやプロセスの再起動を行わずに **kipmi** プロセスのCPU使用率を下げる方法を紹介します。
※元の記事は、[こちら](https://410gone.click/linux_tips/linux/kipmi0.html)

# 事前確認
現在のkipmi0プロセスのCPU使用率をtopコマンドで確認しておきます。
kipmi0プロセスのCPU使用率が100%になっています。

```
$ top -p <kipmi0のPID>

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  4023 root      39  19     0    0    0 R 100.0  0.0  16804:00 kipmi0
```

# 手順
**kipmid_max_busy_us** パラメータを調整することで、CPU使用率を下げることができます。
OSやプロセスの再起動は必要ありません。

```
# echo 100 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us
```

設定後にkipmi0プロセスのCPU使用率を確認すると、CPU使用率が下がっています。

```
$ top -p <kipmi0のPID>

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  4023 root      34  19     0    0    0 R  0.0  0.0  16804:29 kipmi0
```

# 参考

 ``kipmid_max_busy_us`` パラメータにはkipmidのスリープ間隔をマイクロ秒で設定します。
 パラメータの説明は、[The Linux IPMI Driver](https://www.kernel.org/doc/Documentation/IPMI.txt) のドキュメントに記載されています。

> the kipmid_max_busy_us sets the maximum amount of time, in  microseconds, that kipmid will spin before sleeping for a tick.  This value sets a balance between performance and CPU waste and needs to be tuned to your needs.  Maybe, someday, auto-tuning will be added, but that's not a simple thing and even the auto-tuning would need to be tuned to the user's desired performance.
キーチェーンから秘密メモを検索するツールを作った

# 背景

僕はパスワード等の保存、共有にあたって、
Mac OS X標準搭載のキーチェーンアクセスの秘密メモ機能を使っています。
キーチェーン自体には共有機能が無いので[^1]、
別の手段で`.keychain`ファイルを共有しています。
パスワード管理サービス等は流出事故などが怖いので使っていません。
最小限として、Appleのキーチェーンファイルの暗号化実装だけを信頼しています。

しかし、この構成だと不便な点があります。
検索機能が貧弱です。
キーチェーンアクセスの右上に検索ボックスがあるんですが、
これがタイトルしか検索してくれないため、
タイトルは思い出せないけど関連するメールアドレスとか関係者のユーザ名はわかるとか、
そういった場合に取っ掛かりがありません。
また、マウス操作も面倒です。
エントリをダブルクリックしてウィンドウを開いた後、
「メモを表示」のチェックボックスをクリックしないといけません。

そこで、キーチェーンの秘密メモのタイトルと本文から、
一括で検索するコマンドラインツールを作りました。

# 設計と実装

キーチェーン関係の操作は、Mac OS Xが`security`というコマンドを提供してくれていています。
このコマンドのサブコマンドでいろいろできるんですが、
そのまま今回の要求に応えるものは無かったので、
これらを下請けにしたスクリプトをRubyで実装しました。

ツールのパッケージングについてはgemを使いました。
自前コマンドラインツールを適当なとこにインストールしてくれて、実行ファイルのパスも通るので楽で助かります。

# 完成品

以下に完成品を公開しました。

https://github.com/omochi/keychain-search

# 使用例

使用例です。
コマンド名が`kcs`、第一引数がキーチェーン指定、第二引数が検索キーです。
第二引数は正規表現が書けます。

出力はいろいろ目隠ししました。

```
$ kcs pass dropbox
====
keychain: /Users/omochi/xxxx...xxxx/password.keychain
title: Dropbox
--
omochi.metaru@gmail.com
xxxxxxxxxx

二段階認証緊急コード
xxxx xxxx xxxx xxxx
```

---

[^1]: iCloud同期機能はありますが、専用の1つのキーチェーンしか共有できないし、他の人との共有にも向いていません。
CUIで動作する硬派なポモドーロタイマーを作った


Pythonの勉強を兼ねて作っていたポモドーロタイマーがいい感じになったので、公開してみる。
tmuxとかと組み合わせるといい感じになるんじゃないかと思います。


![po.gif](https://qiita-image-store.s3.amazonaws.com/0/97678/2f6bd67a-f3b5-207a-c026-c5713873b838.gif)


[pomodoro-python](https://github.com/tortuepin/pomodoro-python)


お好きなディレクトリにcloneなりダウンロードなりしてもらって、

## 使い方
```
cd pomodoro-python
./pomodoro
```

で起動

## 設定
細かい設定をする機能はまだつけてないので、pomodoro.pyを直接編集してください。


---
自分で作ったものをこうして公開するのは初めてなので、先輩のお兄さんお姉さんは何か問題などありましたら教えていただけると嬉しいです。
c++ builder > ファイル名の制約 > "-"をつけた場合の挙動

```txt:動作確認
C++ Builder XE4
```

.cppファイルと.hファイルの名前についてひっかかった。

### 問題ない名前付け

Unit1.hとUnit1.cppは問題ない名前づけ。

Unit1.h内にて`#ifndef Unit1H` (ファイル名のドットを抜いてhをHにしたもの)と#defineが定義されている。
この場合、Unit1.cppを開いた時にUnit1.hのタブが見える (下図参照)。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/291629cf-d3da-5743-8221-466215fd5b35.png)


### 問題ある名前付け

Unit-314.h, Unit-314.cppのように「ファイル名にマイナスがついている」場合にIDEでの挙動が異なる。

Unit-314.cppを開いた時に、Unit-314.hのタブが見えない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1c2243d2-0019-012f-4edb-6275c4e6cc39.png)

なお、Unit-314.hとUnit-314.cppはエディタで一から作成した。

IDEで新規追加ユニットの保存でファイル名にマイナスをつけて保存しようとするとIDEの制限にひっかかる (以下参照)。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/43aed173-6816-4f19-9176-4a6d9096c032.png)


### ファイル名の制約

上記により「ファイル名にマイナスをつけるとIDEでの操作が普段とは異なる」ことが分かる。

ファイル名にマイナスを入れるかどうかは上記の状況を勘案して行うことになる。

他のファイル名の制約についてはまだ気づいていない。
IDE上の保存処理でひっかかるファイル名かどうかをチェックすればいい。

### プロジェクト名にはマイナスは使える

.cbprojファイルにはXXX-YYY.cbprojというようにマイナスを使っても問題なさそう。

一貫性がない。

### 関連して思い出したもの

[WinAppDev > 不正なフォルダ名 > フォルダ名変更時に"/"入力すると(ファイル名に対する)不正文字を表示することができる](http://qiita.com/7of9/items/9aa82ce970c2898da5d0)
配列でなければ配列にする処理に[$value]は不要か？(array)キャストではダメなの？

書ききったあとに調べると上質な記事見つけちゃうよね。
[PHP array キャストのススメ - Qiita]
上記の記事の劣化説明になります。
ので、本文は読まなくていいです。

***

変なコーディングルールに対して正しいと思うコードがあるけど確証が無いよ無いなら作るよシリーズ

前回 : [PHPの配列の作成は初期化と代入のどちらが速いのか - Qiita]

# <i class="fa fa-graduation-cap" aria-hidden="true"></i> 結論

`[$value]`と`(array)$value`は完璧に一致ではない。

オブジェクトを考慮しなければ、`null`の場合の違いから
`(array)$value`
を支持したい。
オブジェクトも考慮し、おそらく実装者が一番実現したかったことを推測すると、

```php
$array = is_object($value) ? [$value] : (array) $value;
```

がベストだと思う。



# <i class="fa fa-cogs" aria-hidden="true"></i> 環境

[Docker PHP:7.0.8]

# <i class="fa fa-cubes" aria-hidden="true"></i> 経緯

「引数に配列で無いものも受け取るが、配列として処理する」場合、

```php
function hoge($value) {
    if (is_array($value)) {
        $array = $value;
    } else {
        $array = [$value];
    }

    foreach ($array as $value) {
    //...とか
}
```

というコードが量産されていた。
昔から`foreach`の`null`チェックや`array`チェック省略に、
`foreach( (array)`を信奉していた自分としてはどうも美しくない。
[PHPのforeach文でnullチェックなしでエラー回避｜リスティング広告の運用代行ならカルテットコミュニケーションズ]

ここらでいっちょコード書いて投稿して、誤っていたら知識を更新しようと思います。

# <i class="fa fa-code" aria-hidden="true"></i> コード

```php:配列化検証コード
<?php

function A($value) {
    if (is_array($value)) {
        $array = $value;
    } else {
        $array = [$value];
    }
    return $array;
}

function B($value) {
    return (array)$value;
}

$values = [
    0,
    1,
    '',
    'test',
    [],
    ['test'],
    ['test2' => 'test2'],
    true,
    false,
    new stdClass,
    fopen('php://stdin', 'r'),
];

foreach ($values as $value) {
    if (A($value) !== B($value)) {
        var_dump(A($value));
        var_dump(B($value));
    }
}

echo "end\n";
```

```text:出力
array(1) {
  [0]=>
  NULL
}
array(0) {
}
array(1) {
  [0]=>
  object(stdClass)#1 (0) {
  }
}
array(0) {
}
end
```

オブジェクトや`null`自体が`Array`に変換できる性質上、他のスカラー型などと異なり
**配列に入れられたオブジェクト or `null`**
と
**配列に変換されたオブジェクト or `null`**
の違いが生まれてしまいます。

後々`foreach`で処理すると考えれば、
`null`はキャストがありがたい。
オブジェクトはキャストが迷惑。
と言えるケースが多くなるんじゃないかと思います。

オブジェクトの配列を(`foreach`で)処理したいが、オブジェクト一つだけをそのまま渡されても処理したい。

という場合は注意が必要かと思いました。

***

…もともとのコードは5行にもなるのが不格好なので、三項演算子を使えば

```php
$array = is_array($value) ? $value : [$value];
```

でまあ中々いいんじゃないでしょうか？
さらに三項演算子ならスマートなままオブジェクト対応も出来そうです。

```php
$array = is_object($value) ? [$value] : (array) $value;
```



[PHPの配列の作成は初期化と代入のどちらが速いのか - Qiita]:http://qiita.com/khsk/items/fe80d7668ed6cd53eb73
[PHPのforeach文でnullチェックなしでエラー回避｜リスティング広告の運用代行ならカルテットコミュニケーションズ]:https://quartet-communications.com/info/topics/7094
[PHPオブジェクト指向入門（前半）#オブジェクトと参照 - Qiita]:http://qiita.com/mpyw/items/41230bec5c02142ae691#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A8%E5%8F%82%E7%85%A7
[PHP: オブジェクトの比較 - Manual]:http://php.net/manual/ja/language.oop5.object-comparison.php
[PHP array キャストのススメ - Qiita]:http://qiita.com/yhatt/items/012a53f4c21f040f3884


[Docker PHP:7.0.8]:https://hub.docker.com/_/php/
Bash on Ubuntu on Windowsの動作要件

# 概要

Bash on Ubuntu on Windowsの動作要件を[Installation Guide(MSDN)](https://msdn.microsoft.com/en-us/commandline/wsl/install_guide)から和訳引用します。

# 詳細

Windows 10 Anniversary UpdateでWindows上でBashが利用可能になりました。動作要件の解説をあまり見かけなかったので、[Installation Guide(MSDN)](https://msdn.microsoft.com/en-us/commandline/wsl/install_guide)から和訳引用しておきます。

## 動作要件

* Windows 10 Anniversary Update - build 14393（2016年8月2日より利用可能）
* x64プロセッサ
* PCのCPUがAMD/Intel x64互換であること
* (無料の)[Windows Insider Program](http://insider.windows.com/)メンバーであること（できればFast-Ring）
* PCが64ビット版の**Windows 10 Anniversary Update build 14316**以降で動作していること。

> PCのCPUアーキテクチャや、Windowsバージョンとビルドナンバーは、`Settings>System>About`で確認できます。`OS Build`と`System Type`フィールドを見てください。

# 参照

* [Bash on Ubuntu on Windows/Installation Guide(MSDN)](https://msdn.microsoft.com/en-us/commandline/wsl/install_guide)

# 備考

動作要件については、[吉田パクえ](http://www.cloudninja.asia/)さんから教えてもらいました。

私のPCではAnniversary Updateを実行したWindows 10でも、`プログラムと機能>Windowsの機能の有効化または無効化`内に`Windows Subsystem for Linux (Beta)`が表示されませんでした。アップデートの適用状況を疑うなど多少の時間を浪費しましたが、動作要件を教えていただいて、私のPC環境が32bit版Windowsだったからだと判明しました。

How To記事は執筆者に躓かなかった人が多いのか言及が少ないですが、「[Tech TIPS：Windows 10のLinux／Ubuntu互換環境でbashを使う - ＠IT](http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html)」や「[Bash on Ubuntu on Windowsとは？ そのインストールと使い方 - Build Insider](http://www.buildinsider.net/enterprise/bashonwindows/01)」のQ&A部分などで「64bit版のみ」の記述を見つけられました。
Atomで選択範囲を虹色に波立たせてくれるPackage

最近インストールしたお気に入りパッケージです。

[magical-selection](https://atom.io/packages/magical-selection)

※デフォルト設定がlightテーマ向けなので、darkテーマ使用の人は設定の変更が必要です。

![magical.jpg](https://qiita-image-store.s3.amazonaws.com/0/90155/5d24850f-7b39-32f9-8384-4d76288fc13b.jpeg)
Go 言語の http パッケージにある Handle とか Handler とか HandleFunc とか HandlerFunc とかよくわからないままとりあえずイディオムとして使ってたのでちゃんと理解したメモ

# はじめに
* Go 言語では以下のような簡単なコードでウェブサーバーを立ち上げることができますが、正確に意味を理解しておらずイディオムとして使っていたので整理するために一回ちゃんと調べてみました。

```go
package main

import (
  "fmt"
  "net/http"
)

func main() {
  http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello World")
  })

  log.Fatal(http.ListenAndServe(":8080", nil))
}
```

# [http.Handler](https://github.com/golang/go/blob/master/src/net/http/server.go#L82) とは
* `http.Handler` とは `ServeHTTP` 関数を持つだけのインターフェイスで HTTP リクエストを受けてレスポンスを返すことを責務とします。

```go
type Handler interface {
  ServeHTTP(ResponseWriter, *Request)
}
```

# [http.Handle](https://github.com/golang/go/blob/7662e6588c9433f1219e0a0c46bc563ba3f93f98/src/net/http/server.go#L2364) とは

```go
func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
```

* `http.Handle` とは表示する URL と、URL に対応する `http.Handler` を `DefaultServeMux` に登録する関数です。
* `DefaultServeMux` とはデフォルトで `http.ServeMux` 型の構造体で URL に対応した `http.Handler` を実行するいわゆるルーターです。
* また `DefaultServeMux` はルーターであると同時に `ServeHTTP` 関数を持つ `http.Handler` です。
* `http.ListenAndServe` の第二引数が nil の場合 `DefaultServeMux` が Handler として指定されます。自分が分かりづらかったのはここで `http.ListenAndServe` が Handler を受け取ったり `gorilla/mux` のようなルーターを受け取ったりしていたので混乱しました。全てが `http.Handler` なんだと理解できてからはすっきりしました。
* 以下の 1 と 2 と 3 はだいたい同じ意味の処理になります。

```go
type AnyHandler struct {}
func (a *AnyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {}
anyHandler := &AnyHandler{}

// 1
http.Handle("/any/", anyHandler)
http.ListenAndServe(":8080", nil)

// 2
mux := http.NewServeMux()
mux.Handle("/any/", anyHandler)
http.ListenAndServe(":8080", mux)

// 3
http.ListenAndServe(":8080", http.HandleFunc(func(w http.ResponseWriter, r *http.Request){
  if r.URL.Path == "/any/" {
    anyHandler.ServeHTTP(w, r)
  }
}))
```
# [http.HandlerFunc](https://github.com/golang/go/blob/7662e6588c9433f1219e0a0c46bc563ba3f93f98/src/net/http/server.go#L1944) とは
* `func(ResponseWriter, *Request)` の別名の型で `ServeHTTP` 関数を持つので、関数を定義して `http.HandlerFunc` にキャストするだけで構造体を宣言することなく `http.Handler` を用意することができます。

```go
type HandlerFunc func(ResponseWriter, *Request)
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
  f(w, r)
}
```

# [http.HandleFunc](https://github.com/golang/go/blob/7662e6588c9433f1219e0a0c46bc563ba3f93f98/src/net/http/server.go#L2369) とは

```go
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
	DefaultServeMux.HandleFunc(pattern, handler)
}
```

* URL と `func(ResponseWriter, *Request)` を渡して `DefaultServeMux` に登録する関数です。
* 内部で `func(ResponseWriter, *Request)` から `http.HandlerFunc` へのキャストが行われています。

# さいごに
* 全部ドキュメントに載っていて読めってはなしなのでドキュメント大切。
MacでPython 2.xを消す方法。

#始めに。。
こんにちは。Dreamwalkerです。
みんなPython使ってますか？

最近、沢山のプログラマーから愛されているランゲージですね。
私はPytion2.7バージョンを使っているんですが、3.xバージョンにアップグレードしたかったです。

**問題**は3.xバージョンをインストールしても、私の彼女**MAC**はまだ2.xバージョンを使ってるんです。悲しいですね。。

2.xバージョンをMACで消す方法を簡単に紹介したいと思います。 :metal: 

#インストール
Pythonホーム・ページからダウンロードできますが、
私はhomebrew使ってインストールしました。

###Homebrewインストール方法。
まず、Terminal開けます。

```ruby:git
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
[homebrew] http://brew.sh/

私はインストールしましたから、下のようになります。

![Screen Shot 2016-09-05 at 11.56.23 AM.png](https://qiita-image-store.s3.amazonaws.com/0/137182/98d44592-2d3a-7391-8270-5e8f1407f250.png)

###Pythonインストール方法。

terminal開けます。

```ruby:brew
brew search python
```
Phytion2.7.x インストール

```ruby:brew
brew install python
```

Phytion3.x インストール

```ruby:brew
brew install python3
```

doctor〜！

```ruby:brew
brew doctor
```

#Python3インストール

https://www.python.org/downloads/

#Python2.x アンインストール
python経路。

```ruby:
which python
```

framework　アンインストール。

```ruby:
sudo rm -rf /Library/Frameworks/Python.framework/Versions/2.7
```
Applicationからアンインストール。

```ruby:
sudo rm -rf "/Applications/Python 2.7"
```

#終わりに

Macの中で基本pythonがあります。
あんまりアンインストールお勧めしたくないですね。

Terminalでpython3を使って3.x バージョン使ったり
IDLE使ったりする方がいいと思います。

**読みいただきありがとうございました**。
次のPostで会いましょう！

**Dreamwalker。**
AnemoneでBasic認証のかかったサイトへクローリングする


Rubyでクローラを実装できるフレームワーク[Anemone](http://anemone.rubyforge.org/)ですが、
basic認証の設定されたサイトに対してクローリングする方法がわからなかったので調べてみました。
（Webサイトを見るに、2011/02/17の更新で対応済みらしい）



bundle openでanemoneのソースコードを開いて、"basic"とか"auth"とかのキーワードでgrepをかけてみたところそれらしきコードが。
lib/anemone/http.rbの124行目くらい。
urlにuserが設定されている場合にはbasic_auchに認証情報を渡してくれている。


```ruby
def get_response(url, referer = nil)

~ 省略 ~

  begin
    start = Time.now()
    # format request
    req = Net::HTTP::Get.new(full_path, opts)
    # HTTP Basic authentication
    req.basic_auth url.user, url.password if url.user
    response = connection(url).request(req)

~ 省略 ~
```


ということは、このurlオブジェクトに認証情報を渡せば良さそう。
get_responseの引数のurlはURL::HTTPクラス。
URL::HTTPへ認証情報の渡し方は↓を参考に。

[URI::HTTP](http://docs.ruby-lang.org/ja/2.2.0/class/URI=3a=3aHTTP.html#S_BUILD)
[URI::Generic](http://docs.ruby-lang.org/ja/latest/class/URI=3a=3aGeneric.html#I_USER--3D)


crawlに渡していたURLを文字列からURI::HTTPオブジェクトに変更。これでAnemoneのcrawl時にbasic認証を通すことができます。

```ruby
# before
Anemone.crawl("sample.com") 

# after
Anemone.crawl(URI::HTTP.build(host: "sample.com", userinfo: "username:password"))
```
RailsでController Specを書く際に知っておきたいTips

# 概要
RailsでController Specを書く際に、知っておくと便利なことをまとめました。

# 環境
- Ruby 2.3.1
- Ruby on Rails 5.0.0.1

# Tips
## ユーザーエージェントの切り替え
PCスマホで処理を切り替えるなど、ユーザーエージェントを参照して処理を行うactionをテストする場合には、次のようにユーザーエージェントを設定することでテストできます。

```hoge_controller_spec.rb
RSpec.describe HogeController, type: :controller do
  describe "GET #index" do
    context 'iPhoneの場合' do
      it "returns http success" do
        request.env["HTTP_USER_AGENT"] = 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53'
        get :index
        expect(response).to have_http_status(:success)
      end
    end
  end
end
```

ちなみにデフォルトでは「Rails Testing」というユーザーエージェントが設定されています。

## 明示的にクエリパラメータとして渡す
パラメータに対応する静的URLがあるが、あえて、クエリパラメータでアクセスしたい場合には次のようにします。

```route.rb
Rails.application.routes.draw do
  get '/hoge' => 'hoge#index'
  get '/hoge/page-:page' => 'hoge#index'
end
```

```hoge_controller_spec.rb
RSpec.describe HogeController, type: :controller do
  describe "GET /hoge/page-1" do
    context '/hoge/page-1でアクセス' do
      it "returns http success" do
        get :index, params: {page: '1'}
        expect(response).to have_http_status(:success)
      end
    end
  end

  describe "GET /hoge/?page=1" do
    context '/hoge/?page=1でアクセス' do
      it "returns http success" do
        request.env['PATH_INFO'] = '/hoge/?page=1'
        get :index, params: {page: '1'}
        expect(response).to have_http_status(:success)
      end
    end
  end
end
```

クエリパラメータを使っていたが、静的URLに移行したといった場合のリダイレクトなどのテストに必要になると思います。

## ドメイン情報を含んだリダイレクト先のテスト
リダイレクト先のテストをするためには、redirect_toメソッドが用意されています。
redirect_toの使い方については、[こちら](https://www.relishapp.com/rspec/rspec-rails/v/3-5/docs/matchers/redirect-to-matcher)のリンクに書かれています。
ここでは、上のリンクで説明されていない特殊なケースについて説明します。

同じRailsアプリケーション内で複数のドメインを使っている場合には、リダイレクト先にドメインを含んだパスを指定する必要がありますが、その際にredirect_toはドメインを自動的に補完してしまいます。
そういった場合には、次のようにドメインを明示的に指定すれば大丈夫です。

```route.rb
Rails.application.routes.draw do
  get '/hoge/redirect' => 'hoge#redirect'

  constraints(:host=> /fuga\.hoge\.com\.jp/) do
    get '/hoge' => 'hoge#fuga_index'
  end
end
```

```hoge_controller_spec.rb
RSpec.describe HogeController, type: :controller do
  describe "GET /hoge/redirect" do
    it "//fuga.hoge.com/hogeへのリダイレクト" do
      subject {get :redirect }
      expect(subject).to redirect_to('//fuga.hoge.com/hoge')
    end
  end
end
```

## render_views
render_viewsは、その名の通りController Specを実行する際にViewのレンダリングをすることを指定するためのメソッドです。
これを指定しないとView内のエラーを拾うことができないので、基本的には設定することをお薦めします。
例えば、次のような、View内で未定義の変数を参照するといった明らかなバグを含んでいる場合であってもrender_viewsを記述しない場合にはテストが通ってしまいます。

```hoge_controller_spec.rb
RSpec.describe HogeController, type: :controller do
  describe "GET /hoge" do
    render_views

    it "returns http success" do
      get :index
      expect(response).to have_http_status(:success)
    end
  end
end
```

```hoge/index.html.erb
<h1>Hoge#index</h1>
<p><%= hoge %>の一覧です。</p>
```
アカウント登録時に後からメールアドレス確認を行うために必要な処理

# アカウント登録時に後からメールアドレス確認を行うために必要な処理

## 想定する状況

* アカウント登録時にメールアドレスが必要なサービス
* 確認方法は、確認メールを送信してURL踏ませる一般的なやり方
* 利便性の観点から、これを「登録時に必ず行うのではなく、後からでもいいよ」ってしたい

このような状況で必要となる処理とは何かを考えた時のメモを残しておく。

## メールアドレス確認ができない状況とは

まず、アカウント登録時にメールアドレス確認が"できない"状況を考える。
「面倒くさい」以外の理由としては、

* 第3者のメールアドレス
* 誤ったメールアドレス
* もう利用できないメールアドレス

というあたり。
悪い人かミスったか、どっちかという感じ。

## 方針

上述した悪い人とミスった人をどう考えるかという方針が必要。

* 悪い人かどうかわからないうちは、大事な処理はさせない -> 利用制限
* 悪い人に狙われた本人には、そのアカウントを無効化できるようにする -> 心当たりなし対応
* ミスった人は... -> メアド確認前のメアド変更機能

## 必要になる処理 

###  利用制限

"メアド未確認ユーザーに利用を許容する機能" は
連番メアドで大量取得などされて利用される可能性がある。

* メアド未確認ユーザーに利用を許可する機能のリストアップ
 * 登録した環境ではここで許可されている機能のみ利用出来る
* 新規ログイン時にメアド未確認かどうかをチェック
 * 未確認ならエラーを出すか or 警告で済ます

### 心当たりなし対応

* メアド確認時に送信するメールに「心あたりがない場合は...」みたいなリンクをつける
* 問い合わせがあったアカウントを削除する

### どのようにメアド確認を要求すべきか

* 定期的に確認用メールを送信
* ログイン時に送信（画面表示とタイミングを合わせる）

### メアド確認前の変更機能

確認しようにもメールが来ない！的な状態から救う。

* ここではメアド確認を必須にする
* 確認が完了したらメアド付け替える

## いきなりまとめ

* 悪い人、ミスった人向けに機能制限、リカバリー機能の実装が必要

他に思うところがある方がいらっしゃいましたらコメントお願いします。
VagrantとVCCWでWordPressのローカル環境を構築する


VCCWを使って、WordPressのローカル環境を構築したので備忘録と残します。
※Macでのインストール方法です。

## VCCWとは
VagrantとChefによるWordPress開発環境ツール。

### VirtualBoxインストール
公式サイトからインストールする。

VirtualBoxインストール
https://www.virtualbox.org/

### Vagrantインストール
公式サイトからインストールする。
http://www.vagrantup.com/

### vagrant-hostsupdaterインストール
このプラグインを入れると、vagrant up時にhostsファイルを設定し、vagrant halt したら設定を破棄できるプラグイン。
下記コマンドを実行。

```
$ vagrant plugin install vagrant-hostsupdater
```

インストールされたか確認する。

```
$ vagrant plugin list
vagrant-hostsupdater (1.0.2)
```

### VCCWダウンロード
公式サイトからダウンロード。もしくは、githubからcloneする。

公式サイト
http://vccw.cc/

gitをインストールしている方はこちら。

```
$ git clone https://github.com/vccw-team/vccw
```

作業用ディレクトリを作成する。
（例）

```
$ mkdir hogehge.com
$ cd hogehoge.com
$ mkdir project
$ cd project
```

作業用ディレクトリ内でVCCWをcloneする。

```
$ git clone https://github.com/vccw-team/vccw
```

### VCCWのVagrantBoxダウンロード

以下のコマンドを実行する。

```
$ vagrant box add miya0001/vccw
```

```
$ vagrant box add miya0001/vccw
==> box: Loading metadata for box 'miya0001/vccw'
    box: URL: https://atlas.hashicorp.com/miya0001/vccw
==> box: Adding box 'miya0001/vccw' (v2.19.0) for provider: virtualbox
    box: Downloading: https://atlas.hashicorp.com/miya0001/boxes/vccw/versions/2.19.0/providers/virtualbox.box
==> box: Box download is resuming from prior download progress
==> box: Successfully added box 'miya0001/vccw' (v2.19.0) for 'virtualbox'!
```

※ 環境によっては、時間かかります。。一度追加すれば使いまわせるので、最初は我慢。。

インストールされたか確認する。

```
$ vagrant box list
miya0001/vccw (virtualbox, 2.19.0)
```

### カスタマイズ
provision/default.ymlをコピーして同階層にsite.ymlを作成する。

```
$ cd ~/hogehge.com/project
$ cp provision/default.yml site.yml
```

今回は、hostnameとipを変更。
※用途に応じて、設定を変更してください。

```
#
# Network Settings
#
hostname: vccw.dev
ip: 192.168.33.10

↓

#
# Network Settings
#
hostname: test-vccw.dev
ip: 192.168.33.20
```


### 仮想マシンを起動
ターミナルから仮想マシンを起動する。
※こちらも、時間かかるかと思います。。

```
$ cd ~/hogehge.com/project
$ vagrant up
```


```
...
...
...

==> test-vccw.dev: [vagrant-hostsupdater]   192.168.33.10  test-vccw.dev  # VAGRANT: 4b674a2bc78b8c54b293dcfcd7ec1039 (test-vccw.dev) / 08bf9292-977e-4926-857c-f09932564388
==> test-vccw.dev: [vagrant-hostsupdater] This operation requires administrative access. You may skip it by manually adding equivalent entries to the hosts file.
Password:

...
...
...

```

途中でパスワードを求められるので、PCのパスワードを入力する。

起動が完了したら、先ほど変更したhostかipにアクセスする。

[http://test-vccw.dev](http://test-vccw.dev)
[http://192.168.33.10/](http://192.168.33.10/)


WordPressの管理画面はこちら。

[http://test-vccw.dev/wp-login.php](http://test-vccw.dev/wp-login.php)

- **Username or Email**：admin
- **Password**：admin


表示されればこちらで一通り、構築が完了。

## Vagrantコマンド
よく使うコマンド一覧です。

| コマンド                       | 内容 |
|:--------------------------|:---------------------------|
| $ vagrant up             |【起動】（サーバーを立ち上げる）        |
| $ vagrant suspend        |【一時停止】（サーバーをスリープ状態にする） |
| $ vagrant halt           |【停止】（サーバーをシャットダウンする）        |
| $ vagrant reload         |【再読み込み】（サーバーをスリープから復帰、またはVagrantfileの修正を反映させるために再読み込みする場合）|
| $ vagrant destroy        |【削除】（サーバーおよびその設定を完全に削除する）|

詳しくは下記へ。
[Vagrant日本語ドキュメント](http://raqda.com/vagrant/cli/index.html)