OmniAICreator/Qiita-1.07M huggingface dataset:
モジュールやクラスの中から Rake の DSL 構文を使う

Rake タスクが複雑になりかけていたので、分割してモジュールに収めることにした。

環境
----

- Rake 10.5.0
- Ruby 2.2.3 

失敗例
----

とりあえず、タスク定義をそのまま特異メソッドの中に移してみる。

~~~ruby
module TaskHelper
  def self.add_default()
    task :default do
      puts "ok"
    end
  end
end

TaskHelper.add_default
~~~

しかしこれはエラー。

~~~bash
$ rake
rake aborted!
NoMethodError: undefined method `task' for TaskHelper:Module
~~~

なぜ
----

探してみると Rake の DSL 定義は [lib/rake/rake/dsl_definition.rb](https://github.com/ruby/rake/blob/master/lib/rake/dsl_definition.rb) の最下部にあった。

~~~ruby:lib/rake/dsl_definition.rb
module Rake
  module DSL

    ...

    def task(*args, &block)
      Rake::Task.define_task(*args, &block)
    end

    ...

  end
end

self.extend Rake::DSL
~~~

一番外側の self に extend している。先ほどのエラーは、モジュール内モジュールが、モジュール名を付けずに外側のメソッドを使えないのと同じ理由だろうか。

`task` 等の機能はグローバルな関数として定義されているものだと思い込んでいた。

~~~ruby
def task(*args, &block)
  Rake::Task.define_task(*args, &block)
end

module TaskHelper
  def self.add_default()
    task :default do
      puts "ok"
    end
  end
end

TaskHelper.add_default
~~~

これだと動く。

ただし、現実の定義は違う。

解決策
----

仕組みがわかれば簡単。

Rake の機能を使いたいモジュールやクラスに Rake::DSL を取り込めばいい。

~~~ruby
module TaskHelper
  extend Rake::DSL

  def self.add_default()
    task :default do
      puts "ok"
    end
  end
end

TaskHelper.add_default
~~~

~~~bash
$ rake
ok
~~~

特異メソッドではなくインスタンスのメソッドとして使う場合は include を使用する。
RubyVM::InstructionSequence

http://til.justincampbell.me/rubyvm-instructionsequence/

RubyVM::InstructionSequence can show you how the MRI VM interprets your code:

```rb
code = "3 * 4 + 5"
is = RubyVM::InstructionSequence.new(code)
= <RubyVM::InstructionSequence:<compiled>@<compiled>>

is.eval
= 17

puts is.disasm
== disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>==========
0000 trace            1                                               (   1)
0002 putobject        3
0004 putobject        4
0006 opt_mult         <ic:2>
0008 putobject        5
0010 opt_plus         <ic:3>
0012 leave
```

```rb
[12] pry(main)> RubyVM::InstructionSequence.instance_methods(false)
=> [:inspect, :disasm, :disassemble, :to_a, :eval]
```

https://tenderlovemaking.com/2015/12/23/inline-caching-in-mri.html

```rb
[1] pry(main)> RubyVM.stat
=> {:global_method_state=>153, :global_constant_state=>3560, :class_serial=>22620}
[2] pry(main)> class A
[2] pry(main)* end  
=> nil
[3] pry(main)> RubyVM.stat
=> {:global_method_state=>153, :global_constant_state=>3561, :class_serial=>22622}
[4] pry(main)> class B
[4] pry(main)* end  
=> nil
[5] pry(main)> RubyVM.stat
=> {:global_method_state=>153, :global_constant_state=>3562, :class_serial=>22624}
[6] pry(main)> RubyVM.stat.class
=> Hash
[7] pry(main)> module C
[7] pry(main)*   D = 12
[7] pry(main)* end  
=> 12
[8] pry(main)> RubyVM.stat
=> {:global_method_state=>153, :global_constant_state=>3564, :class_serial=>22625}
```

https://coderwall.com/p/tozyca/looking-at-ruby-internals
rails4 で paperclip を使ってみた。

## 前提条件

* rails4
* ruby 2.1
* imagemagickがインストール済み

## まずはプロジェクトの作成

```
$ rails new papercliptest
$ cd papercliptest
```

## Gemfileにpaperclipを追加する。

```rb:Gemfile
...
gem "paperclip", "~> 4.3"
```

## 画像登録用のモデルをscaffoldする。

```
$ rails g scaffold picture name:string
$ rails g paperclip picture photo
$ rake db:migrate
```

## modelの修正
```rb:app/model/picture.rb
class Picture < ActiveRecord::Base
  has_attached_file :photo,
                    :styles => { :medium => "300x300>", :thumb => "100x100>" },
                    :default_url => "/images/:style/missing.png"
  validates_attachment_content_type :photo, :content_type => /\Aimage\/.*\Z/
end
```

## viewsの修正
```erb:app/views/pictures/_form.html.erb
...
  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>
  <!-- photoの入力フォームを追加 -->
  <div class="field">
    <%= f.file_field :photo %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
...
```

```erb:app/views/pictures/show.html.erb
...
<p>
  <strong>Picture(original):</strong>
  <%= image_tag @picture.photo.url(:original) %>
</p>
<p>
  <strong>Picture(medium):</strong>
  <%= image_tag @picture.photo.url(:medium) %>
</p>
<p>
  <strong>Picture(thumb):</strong>
  <%= image_tag @picture.photo.url(:thumb) %>
</p>
...
```

## controllerの修正
```rb:app/controllers/pictures_controller.rb
def picture_params
  params.require(:picture).permit(:name, :photo)
end
```
CentOSのAMIをPackerで作ろうとしたときに公開鍵がないと言われて困ってるなう

解決できてないから助けてください記事です。助けてください(泣)。

# 症状
やむおえずCentOSを使っていて、packerでAMIを作ろうとしたら

~~~bash:こんなかんじで
packer build server.json
~~~

~~~bash:エラーがー
...
==> amazon-ebs: Error waiting for SSH: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain
...
~~~

鍵がないよって言われてます。

# AWS上のCentOSの鍵の設定は特殊
AWSで動いているCentOSは、`/etc/rc.local`に以下のような記述があります。

~~~bash:/etc/rc.local
# Get the root ssh key setup
ReTry=0
while [ ! -f /root/.ssh/authorized_keys ] && [ $ReTry -lt 10 ]; do
  sleep 2
  curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /root/.ssh/authorized_keys
  ReTry=$[Retry+1]
done
chmod 600 /root/.ssh/authorized_keys && restorecon /root/.ssh/authorized_keys
~~~

つまり、元から公開鍵を設定してない限り`/etc/rc.local`が実行されることで公開鍵が設定されます。

参考：http://dev.classmethod.jp/etc/centos-keypair/

# /etc/rc.localが実行されるのはsshが起動した後
サービスが起動するのには順番があり、確認してみると

~~~bash:/etc/rc2.d
... S55sshd ... S99local
~~~

となっていてsshdが先に起動してます。
つまり、sshが起動した後に、公開鍵が設定されています。

# つまりこうなってるんじゃない仮説
ここまで調べた結果、ここからは私の予想です。
**packerはsshが有効になったかどうかしか見ていないのでは？**

~~~
CentOS 「sshd起動！」
packer 「sshが使える！いけー！！！」
CentOS 「えっと鍵をですね...」
packer 「鍵ないじゃん none publickey」
CentOS 「」
~~~

ってなってるんじゃないかと。

# sshをし始めるまでの時間を設定したりしたい
該当するようなパラメータは現状見つけられず...
"sshが使える状態になるまでどれだけ待つか"を設定していると思われる`ssh_timeout`はある
https://www.packer.io/docs/templates/communicator.html#ssh_timeout

誰か助けてください(号泣)
Windowsショートカットキーよく使うやつ

# Windowsのショートカットキーでよく使ってるやつ

※コピペとか一般的な物は含まない

- タスクマネージャ起動
`Ctrl + Shift + ESC`
(アプリケーションタブからアプリを強制終了)

- アプリケーションを終了する
`Alt + F4`

- 開いているアプリを切り替える
`Alt + Tab`

- アクティブウィンドウのキャプチャ
`Alt + PrintScreen`

- ファイルのプロパティ
`Alt + Enter`

- ファイル名を変更
`F2`

- 全て全角カタカナ
`F7`

- 全て半角英数字
`F10`

- 画面をロック
`Win + L`

- デスクトップ表示
`Win + D`

- エクスプローラー
`Win + E`

- ショートカットからアプリ起動
`Win + 1-0`(Vista以降？)

- コントロールパネルとかメニューっぽいの表示
`Win + X`(Win8以降？)

- Spotlightっぽいやつ
`Win + S`(Win10以降は`Win + R`より使ってるかも)

- 仮想デスクトップ系の切り替え
`Win + Ctrl + D`
`Win + Ctrl + ←→`
`Win + Ctrl + F4`

- 画面の明るさ(SurfaceBook？)
`Fn + DEL`
`Fn + BS`

- 全画面キャプチャ+ピクチャに自動保存
`Win + PrintScreen`(Win10)

## ブラウザ
- 閉じたタブを復元
`Ctrl + shift + T`

- 別タブでGoogle検索して開く
`Alt + Enter`(アドレスバーに検索ワードを入力して)

- リンクを別タブで開く
`Ctrl + クリック` or `マウスホイールを押し込む`(リンクを選択時に)

- プライベートブラウジング
`Ctrl + shift + N`(Chrome or IE)
`Ctrl + shift + P`(Firefox)

## IME

- 顔文字登録ショートカット
`Ctrl + F10`(IME有効かつ登録したい文字を選択状態で)
複数のOGP・TwitterCardsを出し分ける


## htmlをパターンの数だけ作成

別々のogp、twitterカードを設定したhtmlを用意（4パターンなら4つ用意）。
このページ自体は表示するコンテンツがないので、`location.href='./';`でトップページへリダイレクトする。

```html:FfzFdPX6rO.html
<!-- ogp-->
<meta property="og:url" content="http://sample.com/FfzFdPX6rO.html">
<meta property="og:image" content="http://sample.com/img/ogp1.png">

<!--（中略）-->

<!-- twitter card-->
<meta property="twitter:image" content="http://sample.com/img/ogp1.png">

<!--（中略）-->

<div id="fb-root"></div>
<script>(function(d, s, id) {var js, fjs = d.getElementsByTagName(s)[0];if (d.getElementById(id)) return;js = d.createElement(s); js.id = id;js.src = "//connect.facebook.net/ja_JP/sdk.js#xfbml=1&version=v2.6";fjs.parentNode.insertBefore(js, fjs);}(document, 'script', 'facebook-jssdk'));</script>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>

<script>
  location.href = './'; // リダイレクト
</script>
```
その他のmetaタグの設定も忘れず。


## twitter

urlの違うaタグを作成

```jade:index.jade
- var ogpAry = ['FfzFdPX6rO', 'Htga89sPna', 'Tr7ad4G6we', 'oPYrea82Mh'];
- var encode_siteurl1 = encodeURIComponent(site_url + ogpAry[0] + '.html');

//-（中略）
.btn-twitter.btn-social.
  <a href="http://twitter.com/intent/tweet?text=#{encode_description}&amp;url=#{encode_siteurl1}&amp;hashtags=#{encode_hashtag}&amp;via=#{encode_via}" target="_blank"></a>


```


## facebook

クリックされるボタンに応じてhrefを切り替える。

```javascript:facebook.js
window.fbAsyncInit = function() {
  FB.init({
    appId      : 'xxxxxxxxxx',
    xfbml      : true,
    version    : 'v2.6'
  });
};
var ogpAry = ['FfzFdPX6rO', 'Htga89sPna', 'Tr7ad4G6we', 'oPYrea82Mh'];
function shareFB(ogpID){
  var ogpHref = 'http://sample.com/' + ogpAry[ogpID - 1] + '.html';
  FB.ui({
      method: 'share',
      href: ogpHref,
    });
};
(function(d, s, id){
   var js, fjs = d.getElementsByTagName(s)[0];
   if (d.getElementById(id)) {return;}
   js = d.createElement(s); js.id = id;
   js.src = "//connect.facebook.net/ja_JP/sdk.js";
   fjs.parentNode.insertBefore(js, fjs);
 }(document, 'script', 'facebook-jssdk'));

$('.js-share_fb').on('click', function(){
  var $ogp_id = $(this).data('ogp-id');
  shareFB($ogp_id);
});
```
Mac 日本語入力 遅い 感じたら

Macで日本語入力がもっさもっさになった時に、やったら快適になったことを備忘録

## （１）セーフブートで起動（これだけで結構快適になるかも）
セーフブートを実行すると、Mac の起動時に所定のチェックを行い、以下の修復・最適化処理が実行される。
起動ディスクを検証。必要に応じてディレクトリの問題の修復を試みる。
フォントキャッシュ、カーネルキャッシュ、およびその他のシステムキャッシュファイルを削除する。


起動方法
１）Macをシャットダウンする。
２）普通に起動する。
３）「じゃーん」という起動音が聞こえたら、すぐに「shift」キーを押す。指は放さず、押し続ける。
４）画面に Apple ロゴが表示されたら、「shift」キーから指を離す。
５）右上に「セーフブート」という赤い文字が表示されたら成功。そのままログインします。


## （２）ファーストエイドする
セーフブートで起動している時点で、溜まりに溜まったキャッシュが削除されているため、この時点で快適に動く可能性が高い。
しかし、開発や、利便性向上のために、様々なアプリをインストールした場合、ファイル運用のために思わぬ権限の食い違いによる遅延が生じている可能性がある。
そこで、その権限などの食い違いを最適化する目的でファーストエイドする。

作業方法
１）Disk Utilityを起動（Applicationｓ->Utility->Disk Utility）する。
２）各種Internalを選択し、ファーストエイドする。

特に問題がなければ２分程度で完了する。（修復作業があると５分以上かかることも）

## （３）NVRAMをリセットする
NVRAM (不揮発性メモリ) と呼ばれる小容量のメモリには、所定の設定情報が記憶されていて、これが不用意に溜まっていると、動作がもっさりしてしまうことがある。
※結構うるさいので注意

作業方法
１）Mac をシステム終了する。
２）キーボードで「command (⌘)」「option」「P」「R」の各キーの場所を確認する。
３）Mac の電源を入れる。
４）起動音が聞こえたらすぐに、「command + option + P + R」キーを同時に押し、そのまま押し続ける。
５）コンピュータが再起動し、2 度目の起動音が聞こえるまで、キーを押したままにする。
６）キーを放す。


以上で、もっさりだったキーボード入力が超快適に
FuelPHPのソースををGitで管理する


* fuel/core、fuel/package他を、サブモジュールとして管理します。

## 既存のcore/package/コントロールファイルを削除
```
rm -rf .git .gitmodules *.md docs fuel/core fuel/packages
```

## Git初期化
```
git init
```

## add
```
git submodule add -f git://github.com/fuel/core.git fuel/core
git submodule add -f git://github.com/fuel/oil.git fuel/packages/oil
git submodule add -f git://github.com/fuel/auth.git fuel/packages/auth
git submodule add -f git://github.com/fuel/parser.git fuel/packages/parser
git submodule add -f git://github.com/fuel/orm.git fuel/packages/orm
git submodule add -f git://github.com/fuel/email.git fuel/packages/email
```

## checkout
```
git submodule foreach 'git checkout 1.8/master'
```

## commit
```
git add .
git commit -m "initial commit"
```

## push
```
git remote add origin [リポジトリURL]
git push -u origin master
```
ログが出力出来ない(全言語共通のログの基本とPerlでのログの実装)

# ログの基本
Unixにおいて基本的にすべてのログは
```
/dev/stderr
/dev/stdout
```
に出力される。
ここに各言語やbashで書き出す場合が以下
https://hydrocul.github.io/wiki/programming_languages_diff/io/puts.html

apacheやnginxなどではdefaultだとデーモンが起動中のstderrやaccessをlogに出してくれる。
そのため
```ruby
STDERR.print "xxx\n"
```
rubyではirbやdefaultのログで事足りることが多いうえ標準ライブラリのloggerが充実しているのでこのようなことはやらないが、、、

```pl
print STDERR "xxx\n"; 
```
などでもログを出せる。が、自分の用意したログ・ファイルに出力する場合には以下に注意する

# 躓くポイント
## ログのプラグインやライブラリのモジュールやクラスの設定が正しくない
## 実行者とログファイルの権限
## ログファイルのパス

# Perl(Amon2)でのログの実装
```apache
<Location / > 
    SetHandler perl-script
    PerlHandler Plack::Handler::Apache2
    PerlSetVar psgi_app /var/www/html/bbs/script/bbs-server
</Location>
```

http://d.hatena.ne.jp/tori243/20110704/1309779334
App Storeの審査が爆速になった、というのは本当だった件

App Storeのレビューが高速化されて最短1日になったらしい、というニュースが駆け巡りましたが、たまたまそのニュースが流れた当日に申請を控えていたので、その結果をご報告いたします。

![2016-05-16_133408.jpg](https://qiita-image-store.s3.amazonaws.com/0/85291/469c8ddf-7868-140e-365c-24d183832d0d.jpeg)

> 審査待ち : 2016年5月13日 22:47
> 審査中 : 2016年5月15日 22:07
> デベロッパによるリリース待ち 2016年5月15日 23:01

申請→審査スタートまで丸2日。
審査自体は約1時間で終了。

ありがたや。
PDCA回し放題です。
Sed でファイル名と内容を一括置換


2016aaahoge1~10.txt を 2016bbbhoge1~10.txt に
フォルダ内ファイル名を一括置換

```
find ./ -type f | sed 'p;s/aaa/bbb/' | xargs -n2 mv
```

フォルダ内ファイルの中身を一括置換
(192.168→210.11に）

```
find ./ -type f | xargs sed -i 's/192.168/210.11/g'
```
sinatraでrake taskの作成

# rake taskの作成
sinatraでrake taskを作成するメモ。

## 環境
- ruby 2.2.3p173
- sinatra-1.4.7


## Rakefileの作成

Rakefileに下記を記載すると、lib/tasks/の下にある、拡張子がrakeのファイルを全て読み込んでくれる。

```lang:Rakefile
Dir.glob('lib/tasks/*.rake').each { |r| load r}
```

## taskの作成

sample_task.rakeを作成する。

```lib/tasks/sample_task.rake
namespace :sample_task do
  desc "It is sample task!!"

  task :say_hello do
    puts 'Hello!! Rake!!'
  end
end
```

## taskが登録されているか確認

`rake -T`で下記のように表示されたらOK。

```
$ bundle exec rake -T
rake sample_task:say_hello  # It is sample task!!
```

## task実行

実行結果。

```
$ bundle exec rake sample_task:say_hello
Hello!! Rake!!
```


以上
プログラミングの知識ゼロでもわかる "オブジェクト指向"


こんにちは。
4月より新卒プログラマーになった島田文平と申します。  

表題にある “オブジェクト指向”という言葉は、プログラマーのみならず、
IT産業に関わりのある人でしたら
少なからぬ回数聞いたことがあるのではないでしょうか。  
この “オブジェクト指向” とは考え方の一つなのですが、
ただでさえプログラミングが難しそうと思われている中でも、
さらに抽象的でわかりづらい考え方と言われがちです。  

実はこの “オブジェクト指向” 、
元々プログラミングとは関係の無い考え方でした。  

この記事では “オブジェクト指向” という考え方が何を意味しているのかを、
専門用語を一切排して、
可能な限り簡単な例と言葉で説明することを目的としています。  

「ITに興味はあるけど、理解が難しい言葉が多くて大変！」  

とお困りの方への理解の一助となれば幸いです。

<br>
---
<br>

さて、まずは例え話から始めさせて下さい。
### 机 を頭に思い浮かべてください。  
<br>

今、どのような __机__ が頭のなかにイメージされているでしょうか。  

この質問に対し、全く同じような回答をする人は存在しないと思います。
ある人は茶色い机がぽつんとひとつある様子を思い浮かべ、
ある人は机と、そこで何か作業をしている人とセットで思い浮かべていたりするでしょう。  

“オブジェクト指向” には、 “オブジェクト” という言葉が含まれていますね。
これは “モノ” という言葉に非常によく似ています。
> 机はモノであり、富士山もモノであり、宇宙もモノと考えられ…  

と言えるように、  

> 机はオブジェクトであり、宇宙もオブジェクトであり…  

とそのまま言い換えても問題はありません。
それほどまでに両者の意味は似ているのです。  

### しかし、  
<br>

わざわざ “モノ” 、“オブジェクト” と言い方を分けるからには、
両者に明確な違いが存在します。  

机の例に戻ります。  

机という “モノ” をどこまで具体的にイメージするのかは人それぞれでしたね。  
一方で、
<br>
__机を “オブジェクト” としてみなすのであれば、__

- __机はどのような色や形をしているのか (机が持っている要素)__
- __机では一体何ができるのか__

__の両者がセットで、かつ明確に定義されていなければいけません。__  
<br>

机をオブジェクトと捉えるなら、以下のように言い表す事ができるでしょう。  

> 机とは、茶色で四角く、仕事をするときに活用することができるオブジェクトだ。  

<br>
---
<br>

さて、この “オブジェクト” の考え方は、
なぜプログラミングとセットで紹介されることが多いのでしょうか。  

そうなった原因は、数十年前にあるプログラマーが  

「 “オブジェクト” の考え方を導入したら、
もっといいプログラミングが出来るんじゃないだろうか」  

と考えたところに始まります。  

以前、プログラミングで何かを定義する際は、
それにどのような要素があるのかという事と、
それで一体何が出来るのかという事を
同時に設定することが出来ませんでした。  

例えば、  

> 机は茶色くて四角く、足が四本あって高さは 80cm で…  

といった様に、もしくは

> 机には本が置けるし、そこで仕事をすることもできて…  

といった様には定義できても、  

> __机は茶色くて、本を置くことができる__  

__とプログラムの中で定義することが出来なかったのです。__

プログラミングをする上で、これは不都合だと感じた当時の人が作ったのが、
Java のようなオブジェクト指向言語の原型でした。  

オブジェクトの考え方を中心に据え置くことを “オブジェクト指向” と言います。  

この “オブジェクト指向” の下に作られたプログラミング言語は、
当時のIT業界で行われていた多くの仕事にとって非常に都合がいいものでした。

現在でも非常に多くの場所で Java が使われていることからも推測できる通り、
「オブジェクト指向はプログラミングのための専門用語」といったような風にすら捉えられるのは、
この背景が原因になっています。

<br>
---
<br>

最後までお読み頂きありがとうございました。  

感想、フィードバックは下記のコメント欄までよろしくお願い致します。
EspressoでViewPager内のFragment間でView IDが被っているときの回避方法

AndroidアプリをJUnitでテストするときの話です。
ViewPagerは中に複数のFragmentを入れることができるため、
同じView IDがそれぞれのFragmentに含まれているとき、
次のように単純にwithIdでマッチングさせようとすると、
複数のViewがヒットしてエラーが発生します。

```java
onView(withId(R.id.recycler_view))
    .perform(actionOnItemAtPosition(1, click()));
```

これを愚直に回避しようとすると次のようになります。

```java
onView(allOf(withId(R.id.recycler_view), ViewMatchers.isDescendantOfA(Matchers.equalTo(fragment.getView())))
    .perform(actionOnItemAtPosition(1, click()));
```

正直長くて読みづらいです。
短くするには次のようなカスタムMatcherを作ります。

```java
public class CustomMatcher {
    public static Matcher<View> withId(int id, Fragment fragment) {
        return allOf(ViewMatchers.withId(id), ViewMatchers.isDescendantOfA(Matchers.equalTo(fragment.getView())));
    }
}
```

こうすれば次のように短く書けます。

```java
onView(withId(R.id.recycler_view, fragment))
    .perform(actionOnItemAtPosition(1, click()));
```

テストコードは愚直に書くとグチャグチャになり可読性がカオスになることが多いので、
よく使うものは適度にカスタムMatcherを作っていくと良いでしょう。
Generic.xaml内に日本語のコメントを入力する

#現象#
カスタムコントロールを作るときにできる```Generic.xaml```
このファイル内で日本語のコメントを入れると```指定されたエンコードに無効な文字があります```というエラーが出てコンパイルできなくなった。
#解決#
```lang:xaml
<?xml version="1.0" encoding="Shift_JIS"?> ★これを追加
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <!--カスタムTextBox-->
</ResourceDictionary>
```
LVM管理

# 前置き
centosをデフォルトで入れると，
/dev/mapper/centos-root /
/dev/sda1               /boot
でマウントされ，残りの容量がどこにいったか謎になる．
/devを見ると，/dev/sda1と/dev/sda2があるのに，sda2はマウントできない．
この現象を探りました．
答えは，sda2上で論理ボリュームが切られており，centos-rootが可変なLVMであった，ということです．以下，LVMの管理について．

# LVM状況把握
```
/dev/sda
でパーティションが切られていることを確認．

pvdisplay :物理ボリューム表示
vgdisplay :ボリュームグループ表示，物理ボリュームをまとめて仮想的な空間を作成できる．
lvdisplay :論理ボリューム表示，ボリュームグループ上にある仮想的なパーテション
```

# LVM操作
```
lvextend -L 12G /dev/centos/root : 12GBにする．
lvextend -L +12G /dev/centos/root : 12GB足す．
lvextend -L +100%FREE /dev/centos/root : 空いてるの全部．
```
その後，ファイルシステムに変更を反映させる．
```
resize2fs /dev/centos/root
```
ELBなどのヘルスチェックのためにチェック用のファイルを用意しない（nginx）

## 前書き

ELBへのヘルスチェック先の準備をしていて、「ファイル管理するの面倒だなー」と思っていた際に試してみてうまくいったことのメモ。

## 本題

以前からnginxでのIP制限などで403を返させるための設定で`return 403;`を使えばいいという部分は知っていたのですが、「あれステータスコード何でも返せるんじゃね？」と思って書いてみたのが以下の設定


```nginx:対HealthCheck用
server {
  listen 80 default_server;
  server_name _;

  access_log  off;

  location / {
    return 200;
  }
}
```

要点としては、

* `listen`時にdefault_serverを指定しているので、ヘルスチェックにありがちなIPアドレス指定のリクエストの受け皿になる
* `access_log none;` を指定しているので、わりかしどうでもいいヘルスチェックのアクセスログを出さない
* `location`内で全てのリクエストは200を返すことで、サーバーが死んでいないことを伝えられる

document_rootを用意する必要もないのでとりあえず差し込んでおけば、ヘルスチェックは簡単にできそうです。


## 補足事項

あくまで「nginxが生きているか」以上のチェックはしてくれないので、外部からのサービスチェックなどはちゃんとしましょう。
Count 1 in bits



Problem:
Count 1 in 32 bits

00000000000000000000000000001110

answer is 3.


# Bruteforce approach

iterate from whole bit and count 1.
if input is n bits, the answer is O(n)


# Better approach
Utilizing bit operation.
x is the input.

x - 1 would find the first set bit from the end, and then set it to 0, and set all the bits following it.

```
Which means if x = 10101001010100
                              ^
                              |
                              |
                              |

                       First set bit from the end
```

Then x - 1 becomes 10101001010(011)

This approach is O(m). m is the number of 1 in the bits


```cpp
#include<iostream>
#include<bitset>

using namespace std;

int main(){
    // 11111 in bits
    unsigned int x = 15;

    int total = 0;

    while (x != 0){
        cout << x << endl;
        bitset<32> a1(x);
        cout << a1 << endl;
        bitset<32> a2(x - 1);
        cout << a2 << endl;

        x = x & (x - 1);
        total++;

        bitset<32> a3(x);
        cout << a3 << endl;

    }

    cout << total << endl;

}

```



```
15
// x
00000000000000000000000000001111
// x - 1
00000000000000000000000000001110
// x & (x - 1)
00000000000000000000000000001110
14
// x
00000000000000000000000000001110
// x - 1
00000000000000000000000000001101
// x & (x -1)
00000000000000000000000000001100
12
// x 
00000000000000000000000000001100
// x - 1
00000000000000000000000000001011
// x & (x - 1)
00000000000000000000000000001000
8
// x
00000000000000000000000000001000
// x - 1
00000000000000000000000000000111
// x & (x - 1)
00000000000000000000000000000000
4

```
CloudTrailのS3バケットポリシー リージョン対応表

http://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-supported-regions.html

ログを書き込むためのバケットポリシーに
```arn:aws:iam::035351147821:root``` 等の見たこと無いアカウントを指定するからこれなにかと思って調べました。

|リージョン名|リージョンコード|アカウントID|ARN|
|:---:|:---:|:---:|:---:|
|US East (N. Virginia)|us-east-1|086441151436 |arn:aws:iam::086441151436:root|
|US West (N. California)|us-west-1|388731089494 |arn:aws:iam::388731089494:root|
|US West (Oregon)|us-west-2|113285607260 |arn:aws:iam::113285607260:root|
|EU (Ireland)|eu-west-1|859597730677 |arn:aws:iam::859597730677:root|
|EU (Frankfurt)|eu-central-1|035351147821 |arn:aws:iam::035351147821:root|
|Asia Pacific (Tokyo)|ap-northeast-1|216624486486 |arn:aws:iam::216624486486:root|
|Asia Pacific (Seoul)|ap-northeast-2|492519147666 |arn:aws:iam::492519147666:root|
|Asia Pacific (Singapore)|ap-southeast-1|903692715234 |arn:aws:iam::903692715234:root|
|Asia Pacific (Sydney)|ap-southeast-2|284668455005 |arn:aws:iam::284668455005:root|
|South America (Sﾃ｣o Paulo)|sa-east-1|814480443879 |arn:aws:iam::814480443879:root|

バケットポリシーの書き方等はこの記事を参考に
http://qiita.com/tcsh/items/0ecbb828d3476449891c
Sassを使ったz-indexの管理

Sass(SCSS)を使ったz-indexの管理には、[Sassy Z-Index Management For Complex Layouts – Smashing Magazine](https://www.smashingmagazine.com/2014/06/sassy-z-index-management-for-complex-layouts/) を使っていた。

```scss
$z: header, nav, pulldown, child;
 
.header {
  z-index: index($z, header); // 1
}
.child {
  z-index: index($z, child); // 4
}
```

ただ変数にリストを突っ込んでいくと、数が多くなった時に可読性が悪く、つらい。

```scss
$z: header, nav, pulldown, child, hoge, hoge, hoge, hoge, ...;
```

## 可読性を上げて管理

カッコで囲むことで可読性が良くなり、z-indexの上下関係がわかりやすくなる。

```scss
$z-map: (
  header, 
  nav,
  pulldown, 
  child
);
```

下記のようなz関数のようなものを用意して使えば、z-indexの管理が楽になると思う。

```scss
$z-map: (
  header, 
  nav,
  pulldown, 
  child
);

// z-index
@function z($name) {
  @return index($z-map, $name);
}
// @debug z(header); // 1

.header {
  z-index: z(header); // 1
}
.child {
  z-index: z(child); // 4
}
```

## 追記 2016-05-18

この状態だとスタック文脈の問題もあるので、改良した。
第2階層まで対応。

```scss
$z-map: (
  header: true,
  nav: true,
  child: (
    foo,
    bar
  )
);

// z-index
@function z($name, $childname: 0) {
  $getkey: map-get($z-map, $name);
  @if $childname != 0 {
    @return index($getkey, $childname);
  }
  @return inspect(index($z-map, ($name $getkey) ));
}

.header {
  z-index: z(header); // 1
}

.child {
  z-index: z(child); // 3
}

.child-foo {
  z-index: z(child, bar); // 2
}
```

libsass対応

```scss
@function z($name, $childname: 0) {
  $getkey: map-get($z-map, $name);
  $counter: 1;
  $is-index: 0;
  @if $childname != 0 {
    @return index($getkey, $childname);
  }

  @each $map-key, $map-value in $z-map {
    @if $map-key == $name {
      $is-index: $counter;
    }
    $counter: $counter + 1;
  }

  @return $is-index;
}
```

## 追記: 2017-03-28

スタック文脈による第2階層以上に対応。
ついでに逆順指定もできるようにした。
[MixinsとFunctions集にまとめた](https://github.com/kojika17/fawn)ので、そのまま使っても、抜き出して使っても可。
そのまま使う場合は、coreディレクトリの中を、任意のSassディレクトリに移動して使う。

[kojika17/fawn](https://github.com/kojika17/fawn)

```scss
$z-map: (
  header: true,
  nav: true,
  child: (
    foo: true,
    bar: (
     hoge: true,
     fuga: true,
     hohoho: true
    )
  )
);

@import 'fawn'; // $z-mapの後に読み込む

.header {
  z-index: z(header); // 1
}
.child {
  z-index: z(child); // 3
}
.child-foo {
  z-index: z(child, bar, hohoho); // 3
}
```

逆順にしたいときは、$z-map-reverse変数の値をtrueにする。

```scss
$z-map: (
  header: true,
  nav: true,
  child: (
    foo: true,
    bar: (
     hoge: true,
     fuga: true,
     hohoho: true
    )
  )
);
$z-map-reverse: true;
@import 'fawn'; // $z-mapと$z-map-reverseの後に読み込む

.header {
  z-index: z(header); // 3
}
.child {
  z-index: z(child); // 1
}
.child-foo {
  z-index: z(child, bar, hohoho); // 1
}
```
Material-UI#v0.15.0

地味にいろいろ変わっていて、ただアップデートしただけでは動かなくなったので調べつつ直しました。
英語読めないのに英文ドキュメントしかまだ見当たらなかったので、違うところあったらバンバン指摘お願いします。

# テーマファイル

今まではテーマの変更は、~~公式ドキュメントを読むのを挫折するくらい~~面倒な手順が必要だったっぽいんですが、
`v0.15.0`になったことで、非常に簡単になりました。

その代わりデフォルトテーマでよくても最低限の手順が必要になったので、[Get StartedのUsage](http://www.material-ui.com/#/get-started/usage)にも記載がされました。

```js
import getMuiTheme from 'material-ui/styles/getMuiTheme';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import MyAwesomeReactComponent from './MyAwesomeReactComponent';

const App = () => (
  <MuiThemeProvider muiTheme={getMuiTheme()}>
    <MyAwesomeReactComponent />
  </MuiThemeProvider>
);
```

`MuiThemeProvider`というラッパーオブジェクトと、実際のテーマファイルを参照するための`getMuiTheme()`が必要です。
これらを使い、全体を囲ってテーマファイルを注入します。

テーマを拡張する際は、`getMuiTheme()`を使って任意のパラメータを組み上げたり、

```js
import {cyan500} from 'material-ui/styles/colors';

...

const muiTheme = getMuiTheme({
  palette: {
    textColor: cyan500,
  },
  appBar: {
    height: 50,
  },
});

...

<MuiThemeProvider muiTheme={muiTheme}>
```

既存のテーマファイルをimportして使用することもできます。

```js
import darkBaseTheme from 'material-ui/styles/baseThemes/darkBaseTheme';

...

const darkMuiTheme = getMuiTheme(darkBaseTheme);

...

<MuiThemeProvider muiTheme={darkMuiTheme}>
```

# コンポーネントパス

```js:v0.14.4
import RaisedButton from 'material-ui/lib/raised-button';
```
```js:v0.15.0
import RaisedButton from 'material-ui/RaisedButton';
```

ライブラリのディレクトリ構成が変わって、`lib`が不要になり、
読み込むコンポーネント名と同じくキャメルケース記述になりました。

```js:v0.14.4
import Table from 'material-ui/lib/table/table';
import TableHeaderColumn from 'material-ui/lib/table/table-header-column';
import TableRow from 'material-ui/lib/table/table-row';
import TableHeader from 'material-ui/lib/table/table-header';
import TableRowColumn from 'material-ui/lib/table/table-row-column';
import TableBody from 'material-ui/lib/table/table-body';
```
```js:v0.15.0
import {Table, TableBody, TableHeader, TableHeaderColumn, TableRow, TableRowColumn} from 'material-ui/Table';
```

さらに、コンポーネント直下のindex.jsでexportsが記載されているので、上記のようにまとめてimportが可能になりました。

## ふい〜。

拡張性向上のアップデートに見えますが、それに伴い一部記述を変更する必要があるのでやや面倒でした。

以上、現場から報告です！
AK-020 を Raspbian で使う(とりあえず版)


SORACOM Air SIM + Abit社製 の AK-020 を Raspberry Pi で使うのに必要な情報です。

Raspberry Pi 2 Model B + raspbian_lite-2016-03-18で確認しています。
(5-13版が出てるのに今気付くなど)

基本的に、付属マニュアルにある通り、eject して modprobe すれば、tty が見えます。
ただし、AT+CFUN=1 を実行しないと、モデムとして動作を開始しないことがポイントのようです。

# パッケージインストール
```bash
pi@raspberrypi:~ $ sudo apt-get install -y eject wvdial
```

# 設定ファイル
```:/etc/wvdial.conf
[Dialer Defaults]
Init1 = ATZ
Init2 = AT+CFUN=1
Init3 = AT+CGDCONT=1,"IP","soracom.io"
Dial Attempts = 3
Modem Type = Analog Modem
Dial Command = ATD
Stupid Mode = yes
Baud = 460800
New PPPD = yes
Modem = /dev/ttyUSB0
ISDN = 0
APN = soracom.io
Phone = *99***1#
Username = sora
Password = sora
Carrier Check = no
Auto DNS = 1
Check Def Route = 1
```

```:/etc/ppp/peers/wvdial
noauth
name wvdial
usepeerdns
replacedefaultroute
```

```:/etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

eject sr0
modprobe usbserial vendor=0x15eb product=0x7d0e

echo waiting for modem device
for i in {1..30}
do
  [ -e /dev/ttyUSB0 ] && break
  echo -n .
  sleep 1
done
[ $i = 30 ] && ( echo modem not found ; exit 1 )
wvdial &

exit 0
```

あとは再起動すれば自動的に接続しに行きます。
Sequel Pro(シークエル・プロ)というアプリケーションを使って、データベースを作成したいのですがこのようなエラーが出てしまいます。


Sequel Pro(シークエル・プロ)というアプリケーションを使って、データベースを作成したいのですがこのようなエラーが出てしまいます。。

Sequel Pro➡︎ 
『ソケット接続が失敗しました！ 
ソケット経由で接続できなかったか、リクエストがタイムアウトしました。 
ソケットのパスが正しく必要な権限のあること、あわせてサーバが起動していることを確認してください。』 
MySQL の応答: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

ターミナル➡︎ 
aberyuuryoku-no-MacBook-Air:butelr ryuki$ rake db:create

<Mysql2::Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)>

Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost", "database"=>"butelr_development"}, {:charset=>"utf8", :collation=>"utf8_unicode_ci"} 
(If you set the charset manually, make sure you have a matching collation)

<Mysql2::Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)>

Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost", "database"=>"butelr_test"}, {:charset=>"utf8", :collation=>"utf8_unicode_ci"} 
(If you set the charset manually, make sure you have a matching collation)

aberyuuryoku-no-MacBook-Air:butelr ryuki$ cd ~ 
aberyuuryoku-no-MacBook-Air:~ ryuki$ mysql.server start 
Starting MySQL 
................................................................................................... ERROR! The server quit without updating PID file (/usr/local/var/mysql/aberyuuryoku-no-MacBook-Air.local.pid). 
aberyuuryoku-no-MacBook-Air:~ ryuki$
初心者 Java オブジェクト指向をわかりやすく説明してみた

#簡単にまとめてみた
いまなんとなく把握しているイメージを共有してみる。小難しい話を聞くよりこっちのが全体像を理解するのにはいいんじゃないかと思う。（細かいところ違ってると思うので、細かいとこの理解はグーグルなどで）


まず、JavaにはOracleのすげー頭いい人が作った便利なクラスがいっぱいある

たとえば
````
Java-lang-Object
````
上はJavaの中のlangクラスのObjectクラスという意味

#他にも、Javaではめっちゃくちゃ沢山の「クラス」が用意されている

androidで使っている便利なものなども「クラス」で定義されている

````
java.lang.Object
   ↳	android.view.View
````
上記は下記の意味
andriodで初めに触るであろう「Viewクラス」（テキストビューなど）も、
Objectクラスを継承する形でGoogleの頭いい人が作った「クラス」である

また、「エラー」とよくいうが、エラーにもクラスが用意されている

````
java.lang.NullPointerException
````
langクラスの中でいわゆる「ぬるぽエラー」を定義している。
コード書く人がこういう書き方をしたらNullPointerExceptionとエラーを出せ！！
とOracleの人が定義しているのである。

他のエラーも同様にjava.lang.....で定義されている

ようするに、なんでもかんでもクラスで定義されている。

#そして便利なのはそのクラスを自分で作れること

上みたいに、便利っぽい動きや処理をまとめたクラスを作ることで、外部に公開すればみんながその「クラス」を使えるようになり、また自分も外部の便利な「クラス」を利用することができる。

そして、「クラス」とは「オブジェクト」である。
（オブジェクトとはもっと広い意味での「クラス」のようなもの。オブジェクトの中に「クラス」があるというイメージ）

で、**このように、いろんなクラスを利用したり、書いたり、クラス（オブジェクト）を相互に関係しあって利用できるプログラミング言語のことを「オブジェクト指向」という。**

なので、オブジェクト指向でないプログラミング言語もあるのだ！

C言語とかは全部自分で作らないといけないらしい。

終わり
Experience Design CC(Adobe XD)で画面を左右移動ができなくてつらいあなたへ

# Adobe XD使ってますか？
<img width="1327" alt="スクリーンショット 2016-05-16 15.10.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/41027/6118dfdc-6e89-0578-05ca-7fb5caa3df3a.png">

Adobe XDはSketchのように、アートボード単位でざざっと簡易なワイヤーやデザイン（作り込みにはツライ）が組める＆flintoのように画面遷移プレビューもローカル＆Webで対応できる便利ツールなのですが、まさかの**画面を左右に移動できなくてつらい**という罠にはまったのでご紹介します。

### 答え. トラックパッドでのスワイプ、あるいはスペースを押しながらドラッグで移動すればOK😇

macbookをクラムシェルモードで使っていたりするとトラックパッドの存在を忘れて困惑しますのでご注意ください。僕はこのせいでしばらくアートボードを縦に並べて使っていました（上下はマウスホイールで）。これから使われる方はご注意を。当たり前だけどSketchのショートカットとちょっと違うんですよね。Adobe製品だもの。

<img width="1540" alt="スクリーンショット 2016-05-16 15.14.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/41027/1a3d1a64-0e1e-e484-4519-e14be2fc2e4b.png">

Web上のプレビューはこんな感じ。不要になったらURLごと削除できます。もちろんタップして他の画面に移動したり、フルスクリーンでデモもOK。リストのパーツは自動コピーで量産できたり画像のマスクはドラッグ＆ドロップで使えたりするので、Sketchに比べたらまだまだ機能は足りないですが、プロトタイピングフェーズのツールとして個人的にはおすすめです！

# 参考リンク
UXデザインツール、Adobe XD (Preview) は毎月アップデート ー 気になる今後の追加機能は？
https://blogs.adobe.com/creativestation/web-adobe-xd-preview-roadmap
Seleniumの動作環境を考えてみた

# はじめに
Seleniumを使ってブラウザテストを行う環境について考えてみました。
（ここでいう環境とは使用するOS、シナリオ言語、ブラウザを指しています)
テスト環境を考えると、誰がテストするのか、どこで行うのか、どのレベルのテストをするのかといった、いろいろな状況があるので、「これが正解」というのはそれぞれであると思いますので、あくまで一考察と見てください。

## 前提条件
下記の条件で考えてみました。

- 実施者：テストエンジニア（開発者ではないということ）
- レベル：シナリオテスト以上

## 基本環境

###　OS
　テストエンジニアの場合、サービス利用者に近い環境でテストすることが望ましいことを考えると、やはりwindows環境になるのではないでしょうか。

- linx系はOSSが豊富にありCIなどの環境を作りやすいメリットがありますが、CUI環境ではブラウザのインストールに仮想ディスプレイが必要もしくはヘッドレスでのテストになります。もちろんIEのテストはできないですね。
- windows系はユーザーに近い環境でブラウザのインストールに手間がないですが、CI環境などを構築するには　自動アップデートによる再起動などの心配事があります


開発者がテストを行う環境を選ぶ場合、開発環境とテストのための環境が異なると管理も使い分けも面倒なため開発環境に近い組み合わせを選ぶと思います。

### ブラウザ

もちろん、どのブラウザを使用するかを考えると、ユーザーシェアで考えるか、サービスの対応ブラウザで選ぶか、テストしやすいブラウザを選ぶか　になると思います。

[WebブラウザシェアランキングTOP10（日本国内・世界）](https://webrage.jp/mobile/data/pc_browser_share.html)

- IEのテストコストは高くつくので対象とするかは悩ましいところですが・・・

## テストシナリオ言語について
Seleniumはいろいろな言語に対応しているので、選択に幅があります。もし、専用のライブラリが出ていなかったとしても、使用する言語に精通しているのであればシナリオを記述することは可能です。

[Seleniumの薄っすい話4:俺と非公式バインディング](http://qiita.com/hiroshitoda/items/5fa5292ceb1e3e8a9610)


（ここからは個人的な見解です）

- Java言語はSeleniumそのものがJavaで記述されているので、親和性もたかく、実行させるためにJDK などが必ずインストールされているので、改めて準備する必要はないのですが、テストスクリプトにコンパイル言語を使用するのはコストが高くつくのではないかと思っています。（ビルドからバージョン管理までの操作が確立しており、手慣れているのであればもちろん別の話です）

- Ruby,python,PHP,Perl　windows環境にインストールする場合、意外に壁がある気がしています。何度も環境作成を繰り返しているうちにいろいろ「こつ」みたいなものを知ることになる気がしますが。

- これらから　Java言語の Seleniumとの親和性・インストールの容易さ　＋　スクリプト言語であることを考慮すると　実は　Jruby,JPython,Rhino(Nashorn),Groovyといった　JavaVMベースのスクリプト言語がよい気がします。
AWS account id を取得 (PHP SDKから)


```php

    $client     = new Aws\Sts\StsClient(
        [
            'version' => 'latest',
            'region'  => 'us-east-1',
            'profile' => $profile_name,
        ]
    );
    $result     = $client->getCallerIdentity([]);
    $account_id = $result['Account'];

}
```
Mautic で Not Found. となる場合

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/39953/dc1b2764-e242-7ec1-3d28-2faeb6c64724.png)

Mautic のルートURL は初期設定で /s/dashboard が設定されていますが、
.htaccess が無効となっていると リダイレクトされないため、Not Found となるケースがあります。
Mautic に限らずとても基本的なことなのですが、私自身がちょくちょくつまずくので備忘録メモです。
Goフレームワーク vs PHPフレームワーク

前々からやってみたかったベンチマークをやってみます！
Goはやろうとしても全く手を付けなかった言語なので、本当に最速なのか疑問な言語でした。
そこで本当に速いのか試してみたいと思います。
そしてその相手はPHP!!
最近7.0にバージョンが上がったことで大幅に速くなったとのもっぱらの噂ですが、速いのは一体どちらなのか...!?

##環境とフレームワーク
計測環境と火花を散らすフレームワークの紹介です。
<dl>
<dt>計測環境</dt><dd>Windows 8.1 & XAMP</dd>
<dt>PHP</dt><dd>version 7.0.6</dd>
<dt>Go</dt><dd>version 1.6.2</dd>
</dl>

|Go|PHP|
|:--:|:--:|
|[Gin](https://github.com/gin-gonic/gin)|[Laravel](http://laravel.jp/)|
|[Revel](https://github.com/revel/revel)|[CakePHP](http://cakephp.jp/)|
|[Iris](https://kataras.github.io/iris/)||

選定理由は~~思いつきなんですが、~~PHPは業務で使用しているLaravelと有名なCakePHPを、
GoからはGoの中でも軽量らしいGin、そしてフルスタックのRevel、そして最近リリースされてわりと速いらしい（byホームページ）Irisを選定いたしました。

##判定基準
ab -c 100 -n 100 {URL}を使用します。(100人のユーザが同時に1リクエストを送った想定)
判定項目は下の二つです。
<dl>
<dt>Request Per Second</dt><dd>一秒当たりに処理できるリクエスト数</dd>
<dt>Failed Request</dt><dd>ロストしたリクエスト数</dd>
</dl>

##比較するコード

```go:bubblesort.go
const MAX_OF_RANGE int = 100000;
const N int = 10000;

func	main()	{
	iris.Get("/",	func(c	*iris.Context)	{
			var a [N]int
			
			rand.Seed(time.Now().UnixNano())
			for i := 0; i < len(a); i++ {
				a[i] = rand.Intn(MAX_OF_RANGE)
			}
			
			for i := 0; i < len(a); i++ {
				for j := len(a) - 1; j > i ; j-- {
					if(a[j] < a[j-1]){
						var tmp = a[j]
						a[j] = a[j-1]
						a[j-1] = tmp
					}
				}
			}
   		})
}
```
はいそうです。<b>バブルソート</b>です。
0から100000の値をランダムに10000の配列要素へ代入し、
それらをバブルソートします。
このo(N^2)をどれくらいで捌けるのか楽しみです。

##ソースコード
それぞれ"/"へのGETリクエストを受けたときにバブルソートしています。

<b>Go</b>

```go
var a [N]int
rand.Seed(time.Now().UnixNano())
for i := 0; i < len(a); i++ {
  a[i] = rand.Intn(MAX_OF_RANGE)
}
			
//バブルソート
for i := 0; i < len(a); i++ {
  for j := len(a) - 1; j > i ; j-- {
    if(a[j] < a[j-1]){
      var tmp = a[j]
      a[j] = a[j-1]
      a[j-1] = tmp
    }
  }
}
```
<b>PHP</b>

```php
$a = array();
for($i=0; $i<self::N; $i++){
  $a[$i] = rand(0, self::MAX_OF_RANGE);
}

for($i=0; $i<self::N -1; $i++){
  for($j=self::N -1; $j>$i; $j--){
    if($a[$j] < $a[$j-1]){
      $tmp = $a[$j];
      $a[$j] = $a[$j-1];
      $a[$j-1] = $tmp;
    }
  }
}
```

##結果
それぞれabコマンドを5回叩いた平均になります。

|順位|フレームワーク|Request per second[#/sec]|Failed Requests|
|:--:|:--:|:--:|:--:|
|1位|Revel| 24.274|0|
|2位|Iris| 26.866|0|
|3位|Gin| 26.924|0|
|4位|Laravel| 0.312|0|
|5位|CakePHP|0.222|0|
越えられない壁が見えましたね（汗）

##所感
処理の速さはGoが圧倒的勝利でした。
どちらもFailed Requestが0だというのはとても素晴らしいと思います。←偉そう
でもリリースしたばかりなので今後に期待です。
Goの軽量フレームワークはWebAPIに用いるくらいなら速さ的にも最適なのではないかと思いました。
まさかここまでGoが速いとは思わなかったので、正直驚いています。

フレームワークの選定やベンチマーク方法について、こうしたほうが良いよなどありましたら、教えていただけると嬉しいです。

##おまけ
ちょっとした備忘録を。

1. LaravelやCakeなどcomposerを使用するフレームワークの起動するとき発生したエラーはほとんどcomposer installかcomposer updateで解決しました。これについては理由を調査中です。
2. 私はGoをGoインストールフォルダの外で作業していましたが、これのせいで何度か泣きそうになったので、デフォルトフォルダ下での作業を推奨します。
modalの上下センタリング

Bootstrapなどで利用するモーダルの上下センタリングを行う。
クローンを作成してmodalの高さを計算し，marginで調整する。

```js
(function($) {
	$(function() {
		function centerModals($element) {
			var $modals;
			if ($element.length) {
				$modals = $element;
			} else {
				$modals = $(".modal" + ':visible');
			}
			$modals.each( function(i) {
				var $clone = $(this).clone().css('display', 'block').appendTo('body');
				var top = Math.round(($clone.height() - $clone.find('.modal-content').height()) / 2);
				top = top > 0 ? top : 0;
				$clone.remove();
				$(this).find('.modal-content').css("margin-top", top);
			});
		}

		// modal表示時
		$(".modal").on('show.bs.modal', function(e) {
			centerModals($(this));
		});
		// windowリサイズ時
		$(window).on('resize', centerModals);
	});
})(jQuery);
```
データベースの作成について

rake db:create をした際にこのようなエラーが出ます。このエラーはなんでしょうか？

aberyuuryoku-no-MacBook-Air:butelr ryuki$ rake db:create
#<Mysql2::Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)>
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost", "database"=>"butelr_development"}, {:charset=>"utf8", :collation=>"utf8_unicode_ci"}
(If you set the charset manually, make sure you have a matching collation)
#<Mysql2::Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)>
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost", "database"=>"butelr_test"}, {:charset=>"utf8", :collation=>"utf8_unicode_ci"}
(If you set the charset manually, make sure you have a matching collation)
jQuery UI multiselectの備忘録

#使用したもの
1. jQuery 
2. jQueryUI
3. jquery.multiselect.js
4. jquery.multiselect.css

#コード
```html:html
<select id="example" name="example" multiple="multiple">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
<option value="4">Option 4</option>
<option value="5">Option 5</option>
</select>
```

```js:script
$(document).ready(function(){
   $("#example").multiselect({
       header: true,
       height:,175
       minWidth:,225
       checkAllText:"すべて",
       uncheckAllText:"未選択",
       noneSelectedText:,
       selectedText:"# 個選択",
       selectedList: 3,
       show:,['bounce',500],
       hide:,['drop',500],
       autoopen:false,
       multiple:true,
       classes:'.multi__etc'
       
       position: {
            my:'center',
            at:'center'
        }
   });
});
```

#Option詳細
すべてのオプションを記入しなくてもいいが
その場合はデフォルト値のオプションが適用される

## header (default:true)
- true:


ドロップダウンヘッダーに"check all","uncheck all"×ボタンが表示される
別オプションのcheckAllTextやuncheckAllTextに任意の文字を入れると
それに従って表示する

- false:

ドロップダウンのヘッダーなし

- 文字列:

ドロップダウンのヘッダーに指定した文字列と×ボタンが表示される.

## height (default:175)
選択領域の高さを指定(px)

## minWidth (default:225)
全体の横幅の最小サイズを指定(px)
## checkAllText (default:Check All)
文字列を入力するとドロップダウンヘッダーの**Check All**ボタンに表示する文字を指定した文字列に変更する。
## uncheckAllText (default:Uncheck All)
文字列を入力するとドロップダウンヘッダーの**Uncheck All**ボタンに表示する文字を指定した文字列に変更する。
## noneSelectedText (default:Select Option)
文字列を入力するとチェックボックス未選択時に表示される**Select Option**を指定した文字列に変更する。
## selectedText (defalut:# selected)
チェックボックスを選択しているとき**#**に選択個数を表示する。
## selectedList (default: false)
数値を入力すると
ドロップダウンリストの選んだものを、指定された数値を上限にドロップダウンのバーに表示する。
上限を超えたときはselectedTextに指定してるものが表示される。

## show (defalut:empty string)
ドロップダウンを開くときに使用する効果と効果時間(ms)で設定する
詳しくは[jQueryUiエフェクト](http://www.buildinsider.net/web/jqueryuiref/0015)
## hide (defalut:empty string)
ドロップダウンを閉じるときに使用する効果と効果時間(ms)で設定する
詳しくは[jQueryUiエフェクト](http://www.buildinsider.net/web/jqueryuiref/0015)
## autoopen (default:false)
- true

スクリプトのロード時に自動でドロップダウンを開く

- false 

スクリプトのロード時に自動でドロップダウンを開かない

## multiple (default:true)
- true

チェックボックスを複数選択することが**できる**。

- false 

チェックボックスを複数選択することが**できない**。
## classes (defalut:empty object)
カスタマイズするために指定したクラスを
.ui-multiselect .ui-multiselect-menu
に追加する
## position (defalut:empty object)
ドロップダウンの表示位置を調整することができる。
Rustのlintライクなツールclippyを使う

## はじめに
RustのLintライクなツールに [rust-clippy](https://github.com/Manishearth/rust-clippy)があります。
なかなかよさげなので使ってみます。

## 前提条件

| 項目 | 説明 |
|------|------------------|
| 検証日 | 2016.05.16 |
| OS   | Mac OS X 10.11.4 |
| Rust | Stable 1.8.0 |
| clippy | 0.0.67 |


## 使い方

`Cargo.toml`に以下を追加

```Cargo.toml
[dependencies]
clippy = { version = "*", optional = true }
```

`src/lib.rs` か `src/main.rs` に以下を追加

```src/lib.rs
#![cfg_attr(feature="clippy", feature(plugin))]
#![cfg_attr(feature="clippy", plugin(clippy))]
```

nightlyでしか動かないので以下で実行

```
$ multirust run nightly cargo build --features=clippy
```

ごりっと色んな警告がでます。[ここに警告の一覧](https://github.com/Manishearth/rust-clippy/wiki#a-word-of-warning)があります。

```
		:
src/parser.rs:448:9: 453:10 help: try
src/parser.rs:            if (agent.contains("Hatena ")) && (agent.contains("Hatena Antenna") || agent.contains("Hatena Pagetitle Agent") ||
src/parser.rs:                   agent.contains("Hatena Diary RSS")) {
src/parser.rs:        return self.populate_dataset(result, "Hatena");
src/parser.rs:    }
src/parser.rs:448:9: 453:10 help: for further information visit https://github.com/Manishearth/rust-clippy/wiki#collapsible_if
src/parser.rs:460:9: 464:10 warning: this if statement can be collapsed, #[warn(collapsible_if)] on by default
src/parser.rs:460         if agent.contains("Indy Library") {
                          ^
src/parser.rs:460:9: 464:10 help: try
src/parser.rs:            if (agent.contains("Indy Library")) && (agent.contains("compatible; Indy Library")) {
src/parser.rs:        return self.populate_dataset(result, "IndyLibrary");
src/parser.rs:    }
src/parser.rs:460:9: 464:10 help: for further information visit https://github.com/Manishearth/rust-clippy/wiki#collapsible_if
```
データ抽出時のuniqコマンド一覧

# データ抽出時のuniqコマンド一覧
データ抽出の作業している時、uniqコマンドについてたまに分からなくなるけど、これを見れば大丈夫！
ついでに、uniqコマンドだけでなくcommコマンドも併記してみました。

## サンプルテキスト
以下の2つのファイルを例に説明します。

```zsh:A.txt
A
B
C
D
E
```

```zsh:B.txt
B
D
X
Y
Z 
```

## A ANDNOT B
![2c4f1cae48fa1999fe52.png](https://qiita-image-store.s3.amazonaws.com/0/32686/10767c4c-7704-ee20-c2eb-9c528d021eed.png)
「AというマスターのリストからBに含まれているものを除外する」というケース。

```zsh:uniq
% sort {A,B,B}.txt | uniq -u > C.txt
```

```zsh:実行例
% sort {A,B,B}.txt | uniq -u
A
C
E
```

```zsh:comm
% comm -23 <(sort -u A.txt) <(sort -u B.txt) > C.txt
```

```zsh:実行例
% comm -23 <(sort -u A.txt) <(sort -u B.txt)
A
C
E
```

## B ANDNOT A
![f0a3aa9eb708ffad0927.png](https://qiita-image-store.s3.amazonaws.com/0/32686/78139e64-5085-d978-9677-30fb5da3f1f9.png)
上記の「[A ANDNOT B](http://qiita.com/oosuka/items/d34beb592b96ad449507#a-andnot-b)」のケースで「BにあるデータはAにも絶対に含まれているはず」という前提の時、
念のため「XやYやZのような異分子が存在するかどうか」を確認するケース。

```zsh:uniq
% sort {A,A,B}.txt | uniq -u > C.txt
```

```zsh:実行例
% sort {A,A,B}.txt | uniq -u
X
Y
Z
```

```zsh:comm
% comm -13 <(sort -u A.txt) <(sort -u B.txt) > C.txt
```

```zsh:実行例
% comm -13 <(sort -u A.txt) <(sort -u B.txt)
X
Y
Z 
```

## A AND B
![c983408ff33c4d314b4d.png](https://qiita-image-store.s3.amazonaws.com/0/32686/86968584-806c-78f9-a65f-b2184b8f9e62.png)
「AとBどちらにも含まれているものを抽出する」というケース。

```zsh:uniq
% sort {A,B}.txt | uniq -d > C.txt
```

```zsh:実行例
% sort {A,B}.txt | uniq -d
B
D
```

```zsh:comm
% comm -12 <(sort -u A.txt) <(sort -u B.txt) > C.txt
```

```zsh:実行例
% comm -12 <(sort -u A.txt) <(sort -u B.txt)
B
D
```

## A OR B
![5ecfeeb4ba6e2e90ead8.png](https://qiita-image-store.s3.amazonaws.com/0/32686/e7f57cd1-0a1b-95ab-3fd3-f06fd53b2eae.png)
「AとBどちらかに含まれているものを全て抽出する」というケース。

```zsh:uniq
% sort {A,B}.txt | uniq > C.txt
```

```zsh:実行例
% sort {A,B}.txt | uniq
A
B
C
D
E
X
Y
Z
```

```zsh:comm
% comm <(sort -u A.txt) <(sort -u B.txt) | tr -d '\t' > C.txt
```

```zsh:実行例
% comm <(sort -u A.txt) <(sort -u B.txt) | tr -d '\t'
A
B
C
D
E
X
Y
Z
```

## A XOR B
![e6d185dbb50ee047dca7.png](https://qiita-image-store.s3.amazonaws.com/0/32686/b54c07c3-54a1-2bdd-e8d4-78c501cfc859.png)
排他的論理和。
「AとBどちらにも含まれているものだけ除外する」というケース。

```zsh:uniq
% sort {A,B}.txt | uniq -u > C.txt
```

```zsh:実行例
% sort {A,B}.txt | uniq -u
A
C
E
X
Y
Z
```

```zsh:comm
% comm -3 <(sort -u A.txt) <(sort -u B.txt) | tr -d '\t' > C.txt
```

```zsh:実行例
% comm -3 <(sort -u A.txt) <(sort -u B.txt) | tr -d '\t'
A
C
E
X
Y
Z 
```
Apache Benchの結果の見方

Apache Benchの結果を出したけれどこれどうやって見ればいいんだ...
なんとなく雰囲気で分かるっちゃ分かるけど、それぞれの数字が高いほうがいいのか、低い方がいいのかなど一通り確認しておいた方が良い項目とその内容についてまとめてみた。

# Time taken for tests
テストそのものに要した時間
数値が**低い方**が好ましい

# Failed requests
処理に失敗したリクエストの数
数値が**低い方**が好ましい

# Requests per second
1秒で処理できるリクエスト数
数値が**高い方**が好ましい

# Time per request
1リクエストにつき処理に要した時間
数値が**低い方**が好ましい

# Transfer rate
1秒間で受け取ったデータの大きさ
数値が**高い方**が好ましい

# Connection Times (ms)

Connection Timesは以下のように表になっている

|| min | mean | [+/-sd] | median | max |
|:--|:--|:--|:--|:--|:--|
| Connect | 3 | 5 | 0.6 | 5 | 6 |
| Processing | 12369 | 22262 | 4397.2 | 24363 | 25712 |
| Waiting | 12111 | 21773 | 4422.1 | 23817 | 25703 |
| Total | 12375 | 22266 | 4396.8 | 24367 | 25716 |

## 横軸
### min
最小値
### mean
平均値
### [+/-sd]
標準偏差

#### 標準偏差って??

データのばらつき具合を示す数字で、
平均値を基準として標準偏差の値を絶対値とした範囲内の数値が、全データの数値の70％の範囲になる。
例えば、上記の表の「Connect」の列を見た場合、平均値が5ms、標準偏差が0.6となるため
全リクエストのスコアの70%程度が4.4ms〜5.6msの範囲内に収まるということになる。
つまりこの数字があまりに大きい場合は平均値があまりアテにならない。

### median
中央値

### 中央値って??

データを数値順に並べた際に中央にくる値
例えば全データの中で極端に高かったり低かったりするような、平均値に著しく影響のある数値が発生した場合は中央値が参考となる。

### max
最大値

## 縦軸 
いずれも数値が**低い方**が好ましい。
### Connect
接続時間
### Processing
処理時間
### Waiting
待ち時間
### Total
合計時間

# Percentage of the requests served within a certain time (ms)

Percentage of the requests served within a certain time (ms)は以下のように表示される。

```
50%  24367
66%  25205
75%  25364
80%  25560
90%  25629
95%  25664
98%  25690
99%  25716
100%  25716 (longest request)
```

全リクエストの割合(%)に対して、処理が完了した時間(ms)を表す。
例えば「50%  24367」の場合、50%のリクエストを完了させるのに24367msかかっている。
何れも数値が**低い方**が好ましい。
廃止されたtoggle()の、クロージャーによる代替実装方法

いまさらだけど、
jQuery toggle() が1.9以降で廃止されている件について。
クリックされる度にループ的に一定の動作を繰り返すのに便利だっただけどなー、、、
ってことでそれを代替する方法。

もちろん、クリック回数を管理する変数をもって自前で実装すればよいだけなんだが、
そのためだけにローカル変数が増えるとか嫌。
・・・あ、クロージャー使えばよいじゃないか、という話のメモ。

```js:toggle.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type='text/javascript' src='https://code.jquery.com/jquery-1.12.3.min.js'></script>
<script>
  
  // 実行例
  $(document).ready(function(){

    // 廃止されたtoggle()的な動作を実装したい時は、
    // 即時関数を用いて click() へbindする関数に対して
    // クロージャー変数を用いることで、スコープを閉じた実装が可能。
    (function(){
      var counter = 0;
 
      $("#id_button").click(function(){
        var target = $(this);

        counter++;
        switch( counter ){
          case 1:
            target.val("トグル１＞＞２");
            break;

          case 2:
            target.val("トグル２＞＞３");
            break;

          default:
            counter = 0;

            target.val("トグル３＞＞０");
            break;
            break;
        }

      });
    }());

  });
  
</script>
</head>
<body>
<form>
  <input id="id_button" type="button" value="トグル動作"></input>
</form>
</body>
</html>
```
Node.jsでSHA1ハッシュを計算する

プログラム内でとある文字列のSHA1ハッシュを計算して、その16進数値を求めたかった。
Node.jsの標準モジュール[crypto](https://nodejs.org/dist/latest-v6.x/docs/api/crypto.html)を使うと簡単に実装できた。

```js
'use strict'

const crypto = require('crypto');
const shasum = crypto.createHash('sha1');
shasum.update('my data'); // ここの引数にハッシュを計算したい文字列を渡す
let hash = shasum.digest('hex');

console.log(hash); // -> fee95d29ae5926af3375e2eb3a688471de0a2c3e
```

ファイルの内容から計算する時は[fs](https://nodejs.org/dist/latest-v6.x/docs/api/fs.html)モジュールでデータを丸々読み込むのが簡単。

```js
'use strict'

const crypto = require('crypto');
const fs = require('fs');
const shasum = crypto.createHash('sha1');

fs.readFile('target/file/path', (err, data) => {
  shasum.update(data);
  console.log(shasum.digest('hex'));
});
```

一度に全てを読み込みきれない大きなファイルの場合は、[Stream]()を使って読み込む。

```js
'use strict'

const crypto = require('crypto');
const fs = require('fs');
const shasum = crypto.createHash('sha1');

let stream = fs.createReadStream('target/file/path');
stream.on('data', chunk => shasum.update(chunk));
stream.on('close', _ => console.log(shasum.digest('hex')));
```

ラムダ式がよくわからない方はこちら

```js
'use strict'

const crypto = require('crypto');
const fs = require('fs');
const shasum = crypto.createHash('sha1');

let stream = fs.createReadStream('target/file/path');

stream.on('data', function(chunk) {
  shasum.update(chunk);
});

stream.on('close', function() {
  console.log(shasum.digest('hex'));
});
```

関数にしてみた

```js
'use strict'

const crypto = require('crypto');
const fs = require('fs');

function calculateSHA1(filePath, resultFormat) {
  return new Promise((resolve, reject) => {

    const shasum = crypto.createHash('sha1');
    let stream = fs.createReadStream(filePath);
    stream.on('data', chunk => shasum.update(chunk));
    stream.on('close', _ => resolve(shasum.digest(resultFormat)));

  });
}

// 使い方
calculateSHA1('target/file/path', 'hex')
  .then(result => console.log(result));
```