OmniAICreator/Qiita-1.07M huggingface dataset:
Skitch > 右クリックメニューを含めて画面キャプチャ

```txt:動作確認
Windows 8.1pro
```

Skitchで右クリックメニューを含めてキャプチャしたい。
Mac版であった（気がする）タイマー付きキャプチャがwindows版では見当たらない。

Skitchを操作していて以下の方法を見つけた。

1. Skitchを終了 (以前のキャプチャをクリアするため)
2. Skitchを起動
3. Explorerにおいて右クリック
4. Ctrl+Shift+5 (マウスカーソルが十字になる)
5. キャプチャ範囲を選択

(1,2の代わりに Ctrl+Shift+Bして「破棄」でもよさそう)

以上で右クリック付きの画像がキャプチャできた。

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d3d60bea-1ddd-9e1e-996e-15c4afb37d9e.png)

<hr>
(追記 2017/01/31)

上記でしていることは[PrtScn]ボタンを押して全画面をキャプチャしているのと同じことなのかもしれない。
Railsのポリモーフィック関連

あまり好みではないのだが、モデルAに対し、
モデルBとモデルCのどちらかが関連づけられる、という設計がある。
そんな時にはポリモーフィック関連を使う。

```rb:各マイグレーションファイル
class CreateCompanies < ActiveRecord::Migration
  def change
    create_table :companies do |t|
      t.string :name, null: false, default: ""

      t.timestamps
    end
  end
end

class CreatePeople < ActiveRecord::Migration
  def change
    create_table :people do |t|
      t.string :name, null: false, default: ""

      t.timestamps
    end
  end
end

class CreateContracts < ActiveRecord::Migration
  def change
    create_table :contracts do |t|
      t.integer  :partner_id,   null: false
      t.string   :partner_type, null: false, default: ""
      t.string   :name,         null: false, default: ""

      t.timestamps
    end
  end
end
```

```rb:各モデルファイル
class Company < ActiveRecord::Base
  has_many :contracts, as: :partners
end

class Person < ActiveRecord::Base
  has_many :contracts, as: :partners
end

class Contract < ActiveRecord::Base
  belongs_to :partner, polymorphic: true
end
```

この時、以下のように使う。

```rb:使い方
    company = Company.create(name: "会社A")
    person  = Person.create(name: "個人A")
    cont1 = Contract.create(partner: company, name: "契約A")
    cont2 = Contract.create(partner_id:   person.id,
                            partner_type: person.class.name,
                            name: "契約B")
```
Protractorのテストが早すぎて目が追いつかない...


### きっかけ

最近UIを担当してるのですが、我ながらひどいコードで、テストコードを書いて下さっている方に非常にご迷惑をおかけしている現状。貴重な皆さんの時間を奪うのは申し訳ない...。

さらに、画面上レイアウトを変えてしまうと、e2eのコードもまた変えないといけなくなります。

ということで、すくなくともテストを書いて下さる側に、『UI上のここが変わってこういう動作を期待してます』ということが伝わるように、コミットの際にできるだけ簡単なテストコードを書いてみようと思い立ちました。

### テストが早すぎて目がついていけない

上記の通り、なんちゃってe2e用のコードを書いてみたのですが、protractor(というかブラウザ）のテスト実施のスピードが早すぎて、目が追いつきません...。

いや、ブラウザとコードが判定してくれるはずなので問題は無いかもしれませんが、モーダルがちゃんと出て期待したメッセージもちゃんと出てるかとか、目で確認したいのですが、とにかく早くて目が追いつきません...。

### ゆっくりさせる方法発見！

もうちょっとゆっくり進めてくれないかな...と切なく思っていたら、下記の投稿を見つけました。

- [Can protractor be made to run slowly?](http://stackoverflow.com/questions/24960290/can-protractor-be-made-to-run-slowly)

上記のコードを参考に、簡単にテスト用コードを書いてみると、おかげさまで多少人間に優しい自動実行になってくれました。

```source:JavaScript

/* AngularJSじゃないサイトでもprotractor使う場合のおまじない */
browser.ignoreSynchronization = true;

/* ここから */
origFn = browser.driver.controlFlow().execute;

browser.driver.controlFlow().execute = function() {
  var args = arguments;

  // 処理速度をゆっくりにする（exp. 100ms)
  origFn.call(browser.driver.controlFlow(), function() {
    return protractor.promise.delayed(100);
  });
  return origFn.apply(browser.driver.controlFlow(), args);
};
/* ここまで */

// 実際の処理
describe('これこれこういう画面にアクセス', function() {
   beforeEach(function() {
    targetUrl = '登録画面'
    browser.get(browser.baseUrl + targetUrl);
  });
  
  it('登録フォームのボタンが無効化されている', function() {
  	 // 現在のパス確認
    expect(browser.getCurrentUrl()).toContain('登録画面'); 
        
    // まだ何も埋めてないので、Submitボタンは無効化されている
    target = browser.element(By.id("btnSubmit"));
    expect(target.getAttribute('disabled')).toEqual('true');
  });

});
```

各処理で、browser.sleep(2000);　みたいなものを挟まなくても良くなっています。

AngularJSのようなSPAだと、もともと画面遷移が早いため、自動化すると本当にあっという間に流れてしまいますので、今回はこの方法で助かりました。

ほかにも良い方法があれば、まだまだ勉強中ですので、教えて頂けると幸いです。
sftpで書き込まれたファイルのログを残す

## 参考

* [Nearly Engineers (β) - CentOSのsftp-serverで転送ログをとってみる](http://admin.inthemaking.net/wordpress/2010/09/28/centos%E3%81%AEsftp-server%E3%81%AE%E8%BB%A2%E9%80%81%E3%83%AD%E3%82%B0%E3%82%92%E3%81%A8%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/)
* [Linux - SFTPのログ - Qiita](http://qiita.com/Teppei1224/items/b62e5f1af335a29217e0)

## 設定

```diff:/etc/ssh/sshd_config
- Subsystem sftp /usr/lib/openssh/sftp-server
+ Subsystem sftp /usr/lib/openssh/sftp-server -l INFO
```

```text:/var/log/auth.log(ubuntuの場合)
Oct 23 08:45:46 srv1 sftp-server[6335]: open "/home/user1/a.zip" flags WRITE,CREATE,TRUNCATE mode 0644
Oct 23 08:45:46 srv1 sftp-server[6335]: close "/home/user1/a.zip" bytes read 0 written 221086
```

* なお、scpはログに残らない。
* ubuntuの場合 /var/log/authlog に記録される。
* centosの場合 /var/log/messages に記録される。

## 日本語対応

* `にほんご.txt` が `\343\201\253\343\201\273\343\202\223\343\201\224.txt`と記録されるので残念なところ。
* syslog-ngに変えても改善せず。
アンカーリンクメモ書き

いつも忘れてググるのでメモ書きに。



```<a href="#hogehoge">ABCの位置へジャンプ</a>```


```<h3 id="hogehoge">ここがhogehogeの位置</h3>```


ジャンプしたい項目に配置するだけでＯＫの時も。このやり方は古いんかな。
```<a name="hogehoge1"></a>```
トランザクションがコミットされたタイミングで任意の処理を実行させる方法 (Spring)


TransactionSynchronizationManager を使うと、トランザクションがコミットされる(された)時に実行される処理を登録できます。
また、トランザクションに紐付けるリソースを保持させておくことも可能。

```java
if (TransactionSynchronizationManager.isSynchronizationActive()) {
    TransactionSynchronizationManager.registerSynchronization(
        new TransactionSynchronizationAdapter() {
            @Override
            public void afterCommit() {
                foo();                
            }
        }
    );
} else {
    foo();
}

```
トランザクション内かどうかを `isSynchronizationActive` で確認してから、トランザクション内だった場合は `registerSynchronization` を使用して処理を登録します。

DB は使わなくて、アプリケーションコンテナのトランザクション管理も無いけど、`@Transactional` で処理を区切って、TransactionSynchronizationManager を使用したいという人は、なにも管理しない TransactionManager をつくると良いです。以下みたいな感じです。

```java:NullTransactionManager.java
public class NullTransactionManager extends AbstractPlatformTransactionManager {
    @Override
    protected Object doGetTransaction() {
        Thread current = Thread.currentThread();
        return current.getName() + '-' + current.getId();
    }

    @Override
    protected void doBegin(Object transaction, TransactionDefinition definition) {
        // N/A
    }

    @Override
    protected void doCommit(DefaultTransactionStatus status) {
        // N/A
    }

    @Override
    protected void doRollback(DefaultTransactionStatus status) {
        // N/A
    }
}
```

```java:TransactionConfiguration.java
@Configuration
@EnableTransactionManagement
public class TransactionConfiguration {
    @Bean
    public PlatformTransactionManager platformTransactionManager() {
        return new NullTransactionManager();
    }
}
```
iOS8 Safariで-webkit-transform: rotateX/rorateYが効かない/要素が消える

##iOS8でrotateXが動かない？？？
iPhoneの実機のみで -webkit-transform : rotateX(180deg) した要素が消える問題発生。
Chrome(Android)、Safari(OS X)、Chrome(Windows)、Firefox(Windows)では再現しない。。。
rotateにすると動くけれど、求めてる動きと違う。
rotate3D(1,0,0,180deg)も動かない。

##”親要素に”CSS perspectiveを追加する
```css:
-webkit-perspective: 500px;
perspective: 500px;
```
奥行を設定してあげることで、想定通りに回転しました！！
回転する軸の位置がわからなくなっていたよう。
body直下をtranslateなどでいじり倒してるのでそれが原因っぽい。
[シンプルなソース](http://jsfiddle.net/tgenstake/k32aLoxh/)なら、iOS8実機でもrotateXがちゃんと動く。

##参考
\[Apple Support Communities\] [iOS8でCSS rotateY/rotateXの要素が見えなくなる。](https://discussions.apple.com/thread/6640868)
\[stackoverflow.com\] [Mobile SafariでCSS transform rotateXが動かない。rotateは動く。](http://stackoverflow.com/questions/26416505/mobile-safari-not-showing-css-transform-rotatex-and-rotatey-only-rotatez)
Elixir のコレクション型のまとめ

# 概要

他の言語でいう配列、リスト、マップ、ディクショナリーのようなコレクション型についてまとめました。

# 環境

* Elixir 1.1.1
* Erlang/OTP 18 [erts-7.1]

# tuple
データやサイズの取得が早いリスト。更新は linked list より遅い。

```ex
{"abc", :def, 3, true}
```

主な操作

* tuple_size/1
* elem/2
* put_elem/3
* [Tuple API](http://elixir-lang.org/docs/v1.1/elixir/Tuple.html)

# linked list
データの更新が早いリスト。データの取得やサイズの取得は tuple より遅い。

```ex
["abc", :def, 3, true]
```

主な操作

* hd/1
* tl/1
* length/1
* left ++ right
* left -- right
* [List API](http://elixir-lang.org/docs/v1.1/elixir/List.html)
* [Enum API](http://elixir-lang.org/docs/v1.1/elixir/Enum.html)

# map
key-value ストア。

```ex
%{ "abc" => :xyz, :def => "lmn", 2 => true} 
```

主な操作

* map_size/1
* ```%{map | key => value}``` : 更新
* [MAP API](http://elixir-lang.org/docs/v1.1/elixir/Map.html)
* [Dict API](http://elixir-lang.org/docs/v1.1/elixir/Dict.html) : KV系の構造全てに使えます。
* [Enum API](http://elixir-lang.org/docs/v1.1/elixir/Enum.html)

# Range
数字の範囲を表します。

```ex
1..10
```

主な操作

* [RANGE API](http://elixir-lang.org/docs/v1.1/elixir/Range.html)
* [Enum API](http://elixir-lang.org/docs/v1.1/elixir/Enum.html)

# keyword list
key-value ストア。key は atom のみ。
特殊な tuple の linked list なので linked list と同じ特徴を持っています。

```ex
[abc: "xyz", def: true, h: :lmn]
[{:abc, "xyz"}, {:def, true}, {:h, :lmn}]
```

主な操作

* hd/1
* tl/1
* length/1
* left ++ right
* left -- right
* [Keyword API](http://elixir-lang.org/docs/v1.1/elixir/Keyword.html)
* [List API](http://elixir-lang.org/docs/v1.1/elixir/List.html)
* [Dict API](http://elixir-lang.org/docs/v1.1/elixir/Dict.html) : KV系の構造全てに使えます。
* [Enum API](http://elixir-lang.org/docs/v1.1/elixir/Enum.html)

# ~~HashDict~~
[将来廃止予定](http://qiita.com/HirofumiTamori/items/cdb9d2d46b638a38ae5a)。 map に十分なパフォーマンスがあります（[erlang 18以降](https://twitter.com/josevalim/status/584842489649041408)）。
~~key-value ストア。 データ量が多いときに map や keyword list より効率的に動作します。~~

# MapSet

ユニークな値のリスト。

```ex
[:sunday, :monday, :tuesday] |> Enum.into(MapSet.new)
```

主な操作

* [MapSet](http://elixir-lang.org/docs/v1.1/elixir/MapSet.html)
* [Enum API](http://elixir-lang.org/docs/v1.1/elixir/Enum.html)


# ~~HashSet~~
[将来廃止予定](http://qiita.com/HirofumiTamori/items/cdb9d2d46b638a38ae5a)。[MapSet](http://elixir-lang.org/docs/v1.1/elixir/MapSet.html) を使ってください。

* [MapSet evaluation - elixir#3242](https://gist.github.com/lexmag/32977ce8fd7cb44ddefa)

# 参考

* [Kernel – Elixir v1.1.1](http://elixir-lang.org/docs/v1.1/elixir/Kernel.html)
* [Keywords, maps and dicts - Elixir](http://elixir-lang.org/getting-started/maps-and-dicts.html)
FYI: a possible AltJS like skin in ES6 era.

This is just a FYI about a proposal:[ Real ES6 JS with Coffeescript syntax](https://discuss.atom.io/t/proposal-real-es6-js-with-coffeescript-syntax/21396).

I like coffeescript and [livescript](http://livescript.net/) in ES5 world. But I also know the great power of ES6 now.
So, I'm interested in a possible AltJS in ES6 era.
I find mark-hahn's cool [jsw](https://github.com/mark-hahn/jsw) trial.

Mark-hahn says:
*"Unlike Coffeescript, JSW does not provide a new language with differing semantics. It is a thin skin over Javascript that only changes the syntax. ... JSW is a great way for Coffeescript users to migrate to real Javascript with ES6."*

So,
JSW will turn jsw code such as

```example.jsw
-> func1 arg1, arg2                 
  var hash1 = key1: val1            
              key2: val2            
              key3:                 
  block                             
    let x = y                       
    func2 x                         
    if q and z                      
      func1 "This is text spread    
             over two lines."    
```
into  Javascript code like that:

```example.js                                    
function func1 (arg1, arg2) {
  var hash1 = {
    key1: val1,
    key2: val2,
    key3: key3
  }
  {
    let x = y;
    func2(x);
    if (q && z) {
      func1("This is text spread " +
            "over two lines.");
    }
  }
}
```

A possible future ;)
任意のオブジェクトにAspectを適用させる方法


Bean として定義していないオブジェクトに対して Aspect を適用させたい場合には、以下のように AspectJProxyFactory を使用すると可能です。

AspectJProxyFactory は spring-aop の org.springframework.aop.aspectj.annotation パッケージにいます。

```java
AspectJProxyFactory proxyFactory = new AspectJProxyFactory(target);
proxyFactory.addAspect(aspect);
Target weaved = proxyFactory.getProxy();
```
csharp > DateTime > new TimeSpan(時間数, 分数, 秒数) / new TimeSpan(日数, 時間数, 分数, 秒数) / new TimeSpan(日数, 時間数, 分数, 秒数, ミリ秒)

参照: Visual C# 2013 逆引き大全

```
new TimeSpan(時間数, 分数, 秒数)
new TimeSpan(日数, 時間数, 分数, 秒数)
new TimeSpan(日数, 時間数, 分数, 秒数, ミリ秒)
```

引数の数によって異なるようだ。
同じ数の引数ではないので、その点は誤用が少ないだろうか。
csharp > DateTime > AddDays() / AddHours() > 一定期間や後の日付/時刻を求める

参照: Visual C# 2013 逆引き大全

AddDays(), AddHours() > 一定期間や後の日付/時刻を求める

```
DateTimeオブジェクト.AddDays(日数)
```

<hr>
C++ Builderの場合 IncDay()

```
dt = IncDay(Now(), -7);
```

http://qiita.com/7of9/items/7838bcfa4bd8c106469b

<hr>
csharp > is演算子 > if (myObj is Button) { > オブジェクトが指定した型にキャスト可能か調べる

参照: Visual C# 2013 逆引き大全

is演算子 > オブジェクトが指定した型にキャスト可能か調べる

```form1.cs
private void button1_click(object sender, EventArgs e)
{
  foreach (Control myObj in this.Controls)
  {
    if (myObj is Button)
    {
       ...
    }  
}
```

<hr>

C++ Builderでは以下
http://qiita.com/7of9/items/e601b8fb10a2a40423e3
Qiita > 記事をPDFにする / kobito > 印刷はできない? > Wordとの連携を使う > Qiita要望 / Kobito要望

Qiitaの記事をPDFで配布したい。
でもそのままブラウザでPDFにすると、ヘッダーやフッター、サイドメニューなどが付き、あまり好ましくない。
現状のQiitaのUIでは記事だけの印刷機能はない。

どうするか？

## Wordとの連携

1. Chromeで領域を選択する
2. Ctrl+C
3. Wordに貼る
4. PDF印刷

上記により、見た目は元記事に近い状態でPDF出力ができた。

配布用資料として以下の変更でスタイルを調整
- 画像サイズを70%にする
- フォントサイズを10か11にする

## Kobitoで試した > 印刷はできない

Kobitoで記事を印刷すればヘッダーやフッターなどがなくなるのでは、と期待した。
しかしながら、Kobitoには印刷そのものの機能が見つからなかった。

## 要望
### Qiita(web)の要望

ヘッダー、フッダー、サイドメニューなしの印刷機能が欲しい。

### Kobitoへの要望

印刷機能が欲しい。その時には、ヘッダー、フッダー、サイドメニューの印刷はオプションでOFFできるようにして欲しい。
技術英語 > the precarious nature of our journey / to boldly go where no man has gone before

@ Star Trek Voyager > LEARNING CURVE

艦長日誌における言葉

>the precarious nature of our journey

http://eow.alc.co.jp/search?q=precarious
> precarious
> 1. 不安定な、心許ない、おぼつかない

先行き不透明な journey についての艦長の気持ちが出ている。

<hr>
不透明から関連して思い出したのが、スタートレックのオープニングで出てくる言葉

https://en.wikipedia.org/wiki/Where_no_man_has_gone_before
> Space: the final frontier. These are the voyages of the starship Enterprise. Its five-year mission: to explore strange new worlds, to seek out new life and new civilizations, <font color=red>to boldly go where no man has gone before</font>.

日本語訳として最後のあたりは「人類未踏の宇宙に勇敢に航海した物語である」だったか。
linux mint 17 live session user password

こんばんは。
タイトルの通り、
linux mint 17 live session user
のパスワードが分からないので、教えていただきたいです。
デフォルトでどのようなパスワードになっているのでしょうか。

まだインストールはしたくないのでこのまま使い続けたいのですが、
数回シャットダウンすると user name と password が要求されます。
Proguard有効でビルドを行ったアプリを起動するとIllegalStateException: You need to use a Theme.AppCompat theme...

# TL;DR

- AppCompat v23.1.0でのバグです
- Proguardの設定にページの下にあるものを付け足してください

# 症状

Proguardを有効にしたアプリを起動時に

```text
ComponentInfo{com.example.test/com.example.test.activity.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
```

みたいなエラーが出て起動できなくなってしまいました。

# エラーメッセージを確認

`You need to use a Theme.AppCompat theme (or descendant) with this activity.` （このActivityにはTheme.AppCompatかそれを継承したものを使用してね）と書かれていたので、`AndroidManifest.xml`と`styles.xml`を確認しました。
`MainAcitivty`は`AppCompatActivity`を継承しています。

```xml
<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    >
    <activity
        android:name=".activity.MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.FullScreen"
        >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
...
</application>
```

```xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
</style>

<style name="AppTheme.FullScreen" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
</style>
```

きちんと`Theme.AppCompat`を継承したものを使用しています。
そもそも、前におこなったリリースビルドは問題なく起動していますし、このファイルには少なくとも前回リリースビルドを作成した時から手を加えていません。

# 原因

調べているとAOSPのIssueTrackerにある投稿を見つけました

Bug: appcompat-v7:23.1.0 has dynamic themes issues with proguard
https://code.google.com/p/android/issues/detail?id=190237&

そういえば、ちょうどAppCompatのライブラリを23.1.0にあげていました。

# 解決方法

上のTrackerにある通り、以下を`proguard-rules.pro`に追加してください

```proguard-rules.pro
-keep class com.google.android.gms.** { *; }
-keep public class com.google.android.gms.**
-dontwarn com.google.android.gms.**
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }
```
ScalaでPusherクライアント作りました

# Pusherとは

https://pusher.com/

WebSocketを使ってチャットアプリ等を実装するためのサービス。

Pusherを経由してWebhook, Rest APIを使うことでオンラインユーザへのメッセージの送信などが簡単にできます。

いろいろな言語でオフィシャルにクライアントライブラリが提供されていますが、Scalaはなかったので作ってみました。

https://github.com/dtaniwaki/akka-pusher

使い方は簡単、

`build.sbt`に以下を追加。

```scala:build.sbt
libraryDependencies += "com.github.dtaniwaki" %% "akka-pusher" % "x.y.z"
```

`application.conf`に以下を追加。

```scala:application.conf
pusher {
  appId=${?PUSHER_APP_ID}
  key=${?PUHSER_API_KEY}
  secret=${?PUSHER_API_SECRET}
}
```

importして実行。

```scala
import com.github.dtaniwaki.akka_pusher.PusherClient

val pusher = new PusherClient()
pusher.trigger("test_channel", "my_event", "hello world")
// Send the message to the connected users
pusher.shutdown()
```

試しに、Spray上にこのライブラリを使ったAPIサーバを実装してみました。

https://github.com/dtaniwaki/akka-pusher-test-app

お試しあれ。
gulp シリーズ4 〜ベンダープレフィクス自動付与〜

##autoprefixerとは
CSSのベンダープレフィクスを自動で付与してくれる優れもの。ブラウザ対応状況は[caniuse](http://caniuse.com/)に則っているらしい。

##autoprefixerのインストール

```
npm install gulp-autoprefixer --save-dev
```

##ベンダープレフィクス付与

現在のindex.scssの状態はこんな感じ。

```scss

h1{
	color: red;
	transition: color .2s ease-out;

	&:hover{
		color: blue;
		text-decoration: underline;
	}
}
```

gulpfile.jsはこんな感じ。

```js

var gulp = require('gulp'),
	sass = require('gulp-sass');
	//追記
	autoprefixer = require('gulp-autoprefixer');

gulp.task('sass', function(){
	gulp.src('develop/sass/**/*.scss')
		.pipe(sass({
			outputStyle: 'expanded'
		}))
		//追記
		.pipe(autoprefixer())
		.pipe(gulp.dest('httpdocs/css/'));
});

gulp.task('default', function(){
	gulp.watch('develop/sass/**/*.scss', ['sass']);
});
```

requireして、sassのコンパイル後にautoprefixer()をかますだけ！！

すると、

```css

h1 {
  color: red;
  -webkit-transition: color 0.2s ease-out;
          transition: color 0.2s ease-out;
}

h1:hover {
  color: blue;
  text-decoration: underline;
}

```

`-webkit-`のベンダープレフィクスが付いてる！楽チン！
着々と充実してきたな。。

今日はここまで。
多腕バンディット問題

## 要約

多腕バンディット問題を Thompson Sampling で解いてみたよ。

## 多腕バンディット問題とは
(ベルヌーイバンディット (Bernoulli Bandit) の場合)
複数のスロットマシンがあって、それらをプレイすると、当たりか外れが出る。
スロットごとに当たりが出る確率は異なっているが、その値はわからない。
このとき、決められた回数のゲームプレイで、多く当たりを引きたい。

これがベルヌーイバンディットと呼ばれるのは、
確率 p で 1、 p-1 で 0 をとる離散分布は[ベルヌーイ分布](https://ja.wikipedia.org/wiki/%E3%83%99%E3%83%AB%E3%83%8C%E3%83%BC%E3%82%A4%E5%88%86%E5%B8%83) だからである。

解くイメージとしては、
* 当たりがたくさん出るスロットをたくさんプレイしたい。
* でも他のスロットもプレイして当たりやすさを調べておきたい
みたいなことを同時に達成したい。


## Thompson Sampling とは
多腕バンディット問題をとくアルゴリズムの一つ。

* スロットマシンごとに当たり・外れの回数を数えておく。
* スロットマシンごとにベータ分布 Be(a+1, b+1) から乱数を引く。
  (a はそのスロットマシンの当たり回数、b は外れ回数)
* 引いた値が最大になるスロットマシンをプレイする。

ここでベータ分布なのは、このように確率分布がベルヌーイ分布の場合、
事前分布をベータ分布にすると、事後確率もベータ分布になる、
共役事前分布であるかららしい [2]


## こんな感じで実装してみた。
`self.results` はSat, Fat だけでいいけど、後で使うかもしれないので保持している。

```py
import scipy
import scipy.stats
import numpy.random
import collections
import pprint


# Banding machine simulator.
def getResult(prob):
    return scipy.stats.bernoulli.rvs(prob, size=1)[0]

# Multiarm Bandit Problem solver using Thompson Sampling.
class BernoulliBandit:
    def __init__ (self, numBandits):
        self.numBandits = numBandits
        self.results = dict([(i, []) for i in range(self.numBandits)])
        
    def getBandit(self):
        posteriors = []
        for b in range(self.numBandits):
            Sat = len([r for r in self.results[b] if r == 1])
            Fat = len([r for r in self.results[b] if r == 0])    
            posteriors.append(numpy.random.beta(Sat+1, Fat+1))
        return numpy.array(posteriors).argmax()
    
    def feed(self, selectedBandit, result):
        self.results[selectedBandit].append(result)
        
    def __str__(self):
        out = ""
        for b in range(self.numBandits):
            Sat = len([r for r in self.results[b] if r == 1])
            Fat = len([r for r in self.results[b] if r == 0])    
            out += "Bandit[%d]   Fails: %4d\t  Successes: %6d\n" % (b, Sat, Fat)
        return out

if __name__ == "__main__":
    # set parameters
    numBandits = 3
    numTrials = 5000
    rewards = [0.9, 0.9, 0.4]   # expected rewards (hidden)

    bandit = BernoulliBandit(numBandits)
    for t in range(numTrials):
        if t % 100 == 0:
            print t,
        b = bandit.getBandit()
        r = getResult(rewards[b])
        bandit.feed(b, r)
    print
    print bandit
    print "Rewards", rewards
```

実行結果はこの通り。なんか真のリワード期待値に会ってないんだが、
ナイーブな実装はこんなもんなんだろうか。あるいは実装をミスってるんだろうか。

```bash
0 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000 3100 3200 3300 3400 3500 3600 3700 3800 3900 4000 4100 4200 4300 4400 4500 4600 4700 4800 4900
Bandit[0]   Fails:  250	  Successes:     40
Bandit[1]   Fails: 4261	  Successes:    446
Bandit[2]   Fails:    0	  Successes:      3

Rewards [0.9, 0.9, 0.4]
```

[jupyter の gist](https://gist.github.com/mzmttks/ead0951367e39c4ffba6)

# 参考文献

1. http://ibisml.org/archive/ibis2014/ibis2014_bandit.pdf
2. http://jmlr.org/proceedings/papers/v23/agrawal12/agrawal12.pdf
nginx設定時に確認したくなるcentos6 コマンド　コアの確認等々


コア数だけ調べる場合
`# nproc`
>3

詳しくCPU情報を確認する
`# lscpu`

>Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                3
On-line CPU(s) list:   0-2
コアあたりのスレッド数:1
ソケットあたりのコア数:1
Socket(s):             3
NUMAノード:         1
ベンダーID:        GenuineIntel
CPUファミリー:    6
モデル:             45
ステッピング:    7
CPU MHz:               2499.998
BogoMIPS:              4999.99
ハイパーバイザーベンダー:KVM
仮想化タイプ:    完全仮想化
L1d キャッシュ:   32K
L1i キャッシュ:   32K
L2 キャッシュ:    4096K
NUMA node0 CPU(s):     0-2


サーバー起動時に自動起動設定されているか確認

nginxが自動起動設定になっているか確認
`chkconfig --list nginx`
> nginx          	0:off	1:off	2:on	3:on	4:on	5:on	6:off


mysqlの自動起動設定がされているか確認
`chkconfig --list mysqld`
> mysqld         	0:off	1:off	2:on	3:on	4:on	5:on	6:off

上記の様にリスト表示されていれば自動起動設定されている。
設計の確定しきらない部分をstd::unordered_map型に押し込もう

「std::unordered_map型を使って見通しのよい設計をしよう」を改題

　　プログラムは、設計がなかなか確定しきらないものです。場合分けにしても、当初想定していたものから増えたり減ったりするものです。それにともなってswicth文やif else if文はそれにともなって、分岐が増えたり減ったりします。enum型やマクロ定数や配列の個数も変化します。それらのことは、プログラムの中で確定しきらない部分が残ってしまうことを意味します。
　
　そこで、本記事が主張することは、設計の確定しきらない部分をstd::unordered_map型に押し込むことで、プログラムの実装を楽にしようとするものです。

####**マクロ定数によるカスタマイズからstd::unordered_map型の値によるカスタマイズへ**
　一方、std::unordered_mapのテンプレートを使ってコーディングしてswitch文やif else if文を用いなくした場合には、厄介な部分はstd::unordered_map型が面倒を見てくれる。ロジックの部分に対して変更を免れることができる。場合分けが当初想定していたものから変化しても、その部分はstd::unordered_map型のキーと値の組み合わせの追加・削除だけで済むようになる。そのため、場合分けの追加・削除への対応の際の不整合を生じにくくなります。\#define　マクロ定数による定義を追加する流儀では、switch文やif else if文では、ソースコード中の複数の箇所で変更を必要とすることも多いでしょうし、対処し忘れを生じやすくなります。

 プログラムの中で確定しきらない部分は、プログラムが最終的に確定しない限り残るものでしょう。プログラムの中で確定しきらない部分は、移植をする際にも、移植した元のコードが絶えず変化してしまって、コードのメンテナンスに課題を生じやすくなります。

####**プログラムの設定パラメータへの利用**
 プログラムの設定パラメータで、カスタマイズ可能なことを期待するパラメータも絶えず変化していきます。私がとっている手法は、アプリケーションの設定パラメータを、std::unordered_map<std::string, std::string> で管理することです(後述のC++プログラムを参照のこと)。しかも、設定パラメータを、ファイルから読み取ることで、設定パラメータの数が増えても、プログラムの枠組みを変更せずにすみます。設定パラメータを個々の変数として管理する場合だと、その変数を明示的に読み書きすることをソースコードに書かなくてはなりません。しかし、unordered_map型を使ってキーと値で管理すれば、キーと値のペアをファイルから読むようにすること、キーを元に値を参照することができる。設定パラメータをunordered_mapにして管理すれば、設定パラメータが、ソースコードの中で迷子になることもありません。設定ファイルを読み書きする部分は、設定パラメータの数が増えても、1行の変更をすることなく実装をcloseすることができます。
　このように、unordered_map型をプログラムの設計に利用すると、プログラムの見通しが大幅に改善します。unordered_map型を使って楽しいC++生活をしましょう。

　std::map型と書いていましたが、std::unordered_map型で十分であることの指摘をいただきました。そのとおりなので、修正いたしました。キーの並び替えをしない分処理が簡潔になるので、std::unordered_map型の方が今回の目的ではふさわしいと考えています。

####**参考：ファイルから、キーと値のペアを読み込むプログラム**
std::unordered_map型を使ったコード

```.cpp:readMap2.cpp
#include <fstream>
#include <iostream>
#include <string>
#include <iterator>
#include <unordered_map>
int main(){
	std::ifstream ifs("test.txt");
	std::string key;
	std::string val;
	std::unordered_map<std::string, std::string> maps;

	ifs >> key >> val;
	while (!ifs.eof()){ // ファイルの最後まで読み込んだら終了
		maps[key] = val;
		ifs >> key >> val; // 最後に読み込む
	}

	// 要素を出力する
	std::unordered_map<std::string, std::string>::iterator it = maps.begin();
	while (it != maps.end()){
		std::cout << it->first << ":" << it->second << std::endl;
		++it;
	}
	return 0;
```

```.txt:test.txt
H hydrogen
He helium
Li lithium
Be beryllium
B boron
C carbon
N nitrogen
O oxygen
F fluorum
N neon
```

実行結果

```.txt:
H:hydrogen
O:oxygen
Li:lithium
He:helium
Be:beryllium
B:boron
C:carbon
F:fluorum
N:nitrogen
```


####**std::map型を使ったコード**

```cpp:readMap.cpp
#include <fstream>
#include <iostream>
#include <string>
#include <iterator>
#include <map>
#include <vector>

int main(){
	std::ifstream ifs("test.txt");
	std::string key;
	std::string val;
	std::map<std::string, std::string> maps; 

	ifs >> key >> val;
	while (!ifs.eof()){ // ファイルの最後まで読み込んだら終了
		maps[key] = val;
		ifs >> key >> val; // 最後に読み込む
	}

	// 要素を出力する
	std::map<std::string, std::string>::iterator it = maps.begin();
	while (it != maps.end()){
		std::cout << it->first << ":" << it->second << std::endl;
		++it;
	}
	return 0;
}
```


実行結果

```.txt:
B:boron
Be:beryllium
C:carbon
F:fluorum
H:hydrogen
He:helium
Li:lithium
N:nitrogen
O:oxygen
```
El Capitanで日本語入力時のスペースを半角スペースにしたいなあ

#日本語入力時もスペースは半角が好きな方へ
El Capitan以前はシステムの設定を直接書き換えて半角スペースで入力できたけど、10.11からSIPが導入されたため設定を書き換えるのが大変になったらしい。
それKarabinerでできるかなあと思ってやってみた。
##通常
- [SPACE] 全角スペース
- [SHIFT]+[SPACE] 半角スペース

##望む結果
- [SPACE] 半角スペース
- [SHIFT]+[SPACE] 全角スペース

要するに反対になれば良いのですよね。

##どうする？
Karabinerの設定から[Misc&Uninstall] > Custome SettingのOpen private.xmlをクリックしてファイルをエディターで編集します。
![karabiner.tiff](https://qiita-image-store.s3.amazonaws.com/0/46168/60d0f27b-b5e4-7ce6-3cba-b11d5df6e6e2.tiff)


```private.xml
<?xml version="1.0"?>
<root>
  <inputsourcedef>
    <name>JA_IME</name>
    <inputmodeid_equal>com.apple.inputmethod.Japanese</inputmodeid_equal>
  </inputsourcedef>

  <item>
    <name>Switching Hankaku/Zenkaku Spaces</name>
    <identifier>private.ime_space_to_hankaku</identifier>
    <inputsource_only>JA_IME</inputsource_only>
    <autogen>
      __KeyToKey__
      KeyCode::SPACE, ModifierFlag::SHIFT_L | ModifierFlag::NONE,
      KeyCode::SPACE
    </autogen>
    <autogen>
      __KeyToKey__
      KeyCode::SPACE, ModifierFlag::SHIFT_R | ModifierFlag::NONE,
      KeyCode::SPACE
    </autogen>
    <autogen>
      __KeyToKey__
      KeyCode::SPACE,
      KeyCode::SPACE, ModifierFlag::SHIFT_L
    </autogen>
  </item>
</root>
```
ファイルの編集が終わったらセーブして、Karabinerの設定の[Change Key]からReload XMLをクリックすると一番先頭に追加した項目が表示されるのでチェックすればOKですね。

![karabiner2.tiff](https://qiita-image-store.s3.amazonaws.com/0/46168/faf5896c-4e40-f2b3-fb92-f35c59a16a90.tiff)

問題があったら教えてもらえると喜びます。

##追記
私はAlfredを愛用しているんですが、Alfred呼び出しのホットキーをCtrl＋Spaceに設定しています。
このKarabinerの設定だと日本語入力中にホットキーが効かないんです。（Ctrl＋Shift＋Spaceに変換されちゃうんですね）Spaceキー絡みのホットキーを使用している場合は<autogen>の先頭にでもこんな風にそのキーコンビネーションだけスルーする設定を入れるといいみたいです。

```private.xml
    ...
    <autogen>
      __KeyToKey__
      KeyCode::SPACE, ModifierFlag::CONTROL_L,
      KeyCode::SPACE, ModifierFlag::CONTROL_L,
    </autogen>
    ...
```

##問題点
- 日本語入力の変換候補選択中、スペースで上方向の候補へ、Shift+Spaceで下方向の候補選択。通常と逆になっちゃう。
- 日本語入力モード中はブラウザ等のスペースキーでスクロールするアプリでは、その他の入力モード時とは逆方向にスクロールしてしまう。

##解決するには
OS X側で対応してくれるといいなあ。スペースを半角にするオプションがIMEの設定に欲しい！できれば記号類も半角で入力したい！な〜
【AWS】 Macにawscliをインストール

Macにawscliをインストールしました。

# 事前準備
pythonをインストール

# 参考
http://docs.aws.amazon.com/cli/latest/userguide/installing.html
※ここ見れば万事解決なんですが．．．一応メモ。

# インストール
まずはpythonがインストールされていることを確認。

```
$ python --version
```

あとは

- インストーラーをダウンロード（zip）
- ダウンロードしたzipファイルを解凍
- インストーラー実行

の流れを以下コマンドで実現。

```
$ curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
$ unzip awscli-bundle.zip
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
```

完了したらインストールされているか確認。

```
$ aws help
```

# ついでに
毎回access key設定はめんどいので、以下コマンド実行

```
$ aws configure
```

そうすると、以下項目の入力を促されるので入力。

- access_key_id
- secret_access_key
- region (東京リージョンはap-northeast-1)
- format (jsonがおすすめ)

最後に、コンフィグレーションが正しいことを確認。

```
$ aws ec2 describe-instance-status --region ap-northeast-1
```

IAM等正しければjsonのレスポンスが帰ってきます。
[tvOS]戻るをハンドリングする

tvOSではMenuキーを押すことで一つ前に戻ることができます。
この動作は今までボタンやスワイプによって一つ前の画面に戻っていたiOSとは異なり、Androidのバックキーのような動作になります。

#UIAlertControllerにおけるMenuボタン
UIAlertControllerではMenuボタンを押すと、UIAlertActionStyleCancelが押されたことになります。
またUIAlertActionStyleCancelのボタンのタイトルをnilにすることで、画面に表示させずにMenuキーで戻れるようにすることもできます。
UIAlertActionStyleCancelのボタンがない場合、Menuボタンで前の画面に戻ることができません。

#Menuボタンが押されたことを検知する
- pressesBegan
- pressesChanged
- pressesCancelled
- pressesEnded

Remoteのボタンが押されると、上記のメソッドが呼ばれます。

```swift
    override func pressesEnded(presses: Set<UIPress>, withEvent event: UIPressesEvent?) {
        let press = presses.first
        if press?.type == .Menu {
            print("Menuボタンが押された！")
        }
    }
```

このようにUIPressを取得することで、Menuボタンが押されたことが検知できます。
ただし、Menuボタンによる自動的な画面遷移は行われる為注意が必要です。

ここでUIImagePickerControllerのようにdidCancelのような実装をする場合、Menuボタンによる自動的な画面遷移は無効化し、自前で行う必要があります。
ボタンを無効にするには、presses系のメソッドではなく`UITapGestureRecognizer`を利用します。

#UITapGestureRecognizer

```swift
        let tapMenu = UITapGestureRecognizer(target: self, action: "menuHandle:")
        tapMenu.allowedPressTypes = [NSNumber(integer: UIPressType.Menu.rawValue)]
        view.addGestureRecognizer(tapMenu)
```
UITapGestureRecognizerを利用した場合、自動的な遷移は無効化されてaction:が呼ばれます。


#ビューコントローラーが閉じられたことを検知する
iOSアプリ開発者には馴染み深いかもしれません

- viewWillDisappear
- viewDidDisappear

ビューコントローラのライフサイクルを利用して上記のメソッドをオーバーライドすることで「戻る」を検知します。
tvOSでMetalを使ったアプリを開発するには実機が必要らしい


Xcode7.1をダウンロードしたので、早速tvOS用アプリをビルドしてみた。
ちなみにMetalを使ったGameのプロジェクトを新規で作成して、サンプルのプロジェクトをそのままビルドしてみた。

だが、「No such module 'MetalKit'」というエラーが出てビルドできない。
Frameworkが足りないのかと思い、MetalKitのフレームワークを手動で追加してみても変わらない。

ネットで検索すると、Metalを使ったサンプルはtvOS Simulatorでは動かず、Apple TVの実機がないとビルドもできないようだ。残念。

## 参考

https://forums.developer.apple.com/thread/17895
eye を使って unicorn を監視、自動回復

# 背景
* Eye を Unicorn の自動回復（autohealing）のために利用
* `Eye` は `monit`、`Bluepill`、`God`、`supervisord` のようなプロセス監視ツール
* Eye は起動時とか、終了時とかの絵文字がかわいい！癒される。
* Eye は Ruby の DSL ！便利！
    * monit はちょっと独自すぎて抵抗が・・・
* `eye info` や `eye watch` などもなかなか便利。使える！
* Eye を使って unicorn を管理してみた

# Eyefile の例

```rb:Eyefile
# Eye 自身のログを保存
Eye.config do
  logger __dir__ + "/log/eye.log"
end

rails_root = File.expand_path(__dir__)
Eye.application "MyApplication" do
  working_dir rails_root
  process "unicorn" do
    load_env ".env"

    unicorn_pid = "#{rails_root}/tmp/pids/unicorn.pid"
    pid_file unicorn_pid

    start_command %(sh -c '
      ./bin/unicorn -c config/unicorn.rb -E production -D;
    ')
    # stop_signals [:QUIT, 10.seconds]
    stop_command "kill -QUIT {PID}"

    # graceful restart
    restart_command %(sh -c '
      kill -USR2 {PID}
      until [ -f "#{unicorn_pid}.oldbin" ]; do
        sleep 0.1
      done
      oldpid=$(cat #{unicorn_pid}.oldbin)
      kill -WINCH $oldpid;
      kill -QUIT $oldpid;
    ')

    stdall   "#{rails_root}/log/eye-unicorn.log"
  end
end
```

# 利用手順
## Eye の設定読み込み、Eye の設定に従って、起動
```
$ leye l
Eye started! ㋡
Config loaded!
```

㋡ は外国人からすると、顔文字に見えるらしい
`leye` は eye コマンドの派生版。カレントディレクトリの `Eyefile` を使い、
`eye` の pid ファイルをカレントディレクトリの `.eye/` に個別に管理する。
`eye` だと `$HOME/.eye/` に `eye` の pid ファイルを保持する。

## Eye の状況確認

```
$ leye i
MyApplication                     
  unicorn ......................... starting
```

```
$ leye i
MyApplication                     
  unicorn ......................... up  (12:43, 0%, 79Mb, <3583>)
```

## Eye の終了

```
$ leye q
Quit ಠ╭╮ಠ
```

クリッとした おめめ がかわいい


# 参考文献
* https://github.com/kostya/eye/
* http://nekogata.hatenablog.com/entry/2012/07/21/014714
* http://kray.jp/blog/troubleshooting-rails-unicorn/
* https://raw.githubusercontent.com/kostya/eye/master/examples/unicorn.eye
[python] class内での変数とself.変数の違い


# *instance*.name

クラス変数を呼び出すとき、*instance*.nameで呼び出すが、
その呼出先には2種類ある。

```python:name
class foo:
    name1 = 'test1'
    def __init__(self):
        self.name2 = 'test2'

bar = foo()
print(bar.name1)
# => test1
print(bar.name2)
# => test2
```

この2つは同じように値を変更することができる。

```python
bar.name1 = 'huga'
bar.name2 = 'hogehoge'
print(bar.name1)
# => huga
print(bar.name2)
# => hogehoeg
```

ところが、次のようにすると挙動が変わる。

```python
print(bar.__class__.name1)
# => test1
print(bar.__class__.name2)
# => AttributeError
```

この原因は何か。実はクラスが持つ変数には2種類存在する。
一つは普通のクラス変数。
もう一つはクラスの基本メンバーとして存在する__dict__の変数。

```python:name
class foo:
    name1 = 'test1'
    def __init__(self):
        self.name2 = 'test2'

bar = foo()
print(bar.__dict__)
# => {'name2':'test2'}
bar.name1 = 'hoge'
print(bar.__dict__)
# => {'name2':'test2','name1':'hoge'}
```

*instance*.nameといった呼び出し方は優先的に\_\_dict\_\_[name]を表示する。
\_\_dict\_\_[name]が存在しなかった場合のみ、\_\_class\_\_.nameを呼び出す。

もしクラス変数を初期値や非変更値として使いたいなら、name1のようにself.を使わずに書くべきだろう。
また、常にクラス内で規定した値で処理を行いたいのならばself.__class__.nameなどとして呼び出すべきだろう。
name1のように書くメリットとして、初期値に戻せるというのもある。

```python:name
class foo:
    name1 = 'test1'
    def __init__(self):
        self.name2 = 'test2'

bar = foo()
print(bar.name1)
# => test1
bar.name1 = 'newname'
print(bar.name1)
# => newname
del bar.name1
print(bar.name1)
# => test1
```

self.nameと宣言するのは、それが変更されることを前提としていたり、変更前の値を覚えておく必要が無い時だけかもしれない。
【Javascript】jQuery等のライブラリなしでクラスの追加と削除

```html

<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>【Javascript】jQuery等のライブラリなしでクラスの追加と削除</title>
<style type="text/css">

.nav ul {
    margin: 0;
    padding: 0;
    list-style: none;
}
.menu0 li {
    display: inline;
    padding: 0;
    margin: 0;
    float: left;
}
.menu0 li a {
    display: block;
    border: 1px solid gray;
    padding: 3px;
    text-decoration: none;
    width: 100px;
    margin: 1px;
    text-align: center;
    font-size: 14px;
}
.menu0 li a:hover {
    background-color: tomato;
}
.menu1 a {
    color: lime;
}
.menu2 a {
    color: blue;
}
.menu3 a {
    color: aqua;
}
.menu4 a {
    color: gold;
}
.menu5 {
    text-decoration: underline;
}

</style>
</head>
<body>

<h3>【Javascript】jQuery等のライブラリなしでクラスの追加と削除</h3>

<div class="nav">
    <ul class="menu0" id="menu">
        <li class="menu1"><a href="#">lime</a></li>
        <li class="menu2"><a href="#">blue</a></li>
        <li class="menu3"><a href="#">aqua</a></li>
        <li class="menu4"><a href="#">gold</a></li>
    </ul>
</div>

<script type="text/javascript">

var sample = (function() {

    var that = {},
        my = {};

    my.getElements = function(e, p) {
        return document.getElementById(p).getElementsByTagName(e);
    };

    my.add = function(h) {
        if (h.className.indexOf("menu5") === -1) {
            h.className += ' ' + "menu5";
        } else {
            h.className = h.className.replace(' menu5', '');
        }
    };

    that.init = function() {
        var s = my.getElements('li', "menu");
        for (var i = 0; i < s.length; i += 1) {
            s[i].onmouseover = my.add.bind(null, s[i]);
            s[i].onmouseout = my.add.bind(null, s[i]);
        }
    };

    return that;

})();

window.onload = function() {
    sample.init();
};

</script>
</body>
</html>

```

##解説
Javascriptにおいて、jQuery等のライブラリなしでクラスの追加と削除をやるには、classNameを使って要素のクラス属性の設定をする。

+ クラス名の追加:クラス属性にクラス名を追記する
+ クラス名の削除:クラス属性からreplaceメソッドでクラス名を空文字に置き換える

上記のコードはliタグをマウスオーバーするとliに設定されたクラス名の後ろにmenu5の追記を行い、マウスアウトするとliに設定したクラス名menu5を削除する。menu5が設定されると文字列に下線を付ける。

###画面イメージ
![名称未設定.jpg](https://qiita-image-store.s3.amazonaws.com/0/38271/f7fc4a4b-e42d-93d2-3c2d-54b76ec16121.jpeg)

###
WeakReference・WeakReference<T> の違いと、そこに潜む罠

# はじめに

WeakReference、使ってますか。私はあまり使っていません。その存在は知っていても、使う機会はあまりないという人は、私にかぎらず多くいるのではないでしょうか。

もちろん、WeakReference が何のためにあるかはご存知のことと思います。知らなかったという方は、岩永さんに感謝しながら、以下の記事を読んで勉強しておきましょう。

http://ufcpp.net/study/csharp/RmWeakReference.html

# `WeakReference` と `WeakReference<T>`

さて、ここからが本題です。

WeakReference には、`System.WeakRefenence` と、`System.WeakReference<T>` がありますが、この２つの違いは何でしょうか。

「非ジェネリックとジェネリックの違いでしょ」と思いがちですが、実はそれだけの違いではありません。`WeakReference` には `IsAlive` `Target` というプロパティがありますが、`WeakReference<T>` にはそれらはなく、代わりに `TryGetTarget` メソッドが追加されています。

つまり、`WeakReference` と `WeakReference<T>` は、ジェネリクスか否かだけの違いではなく、メンバも変更されています。

# WeakReference に潜む罠

とりあえず、`WeakReference<T>` のことは忘れて、`WeakReference` だけを考えます。

みなさんはどのようにして `WeakReference` からその参照先を取得していますか？ 

```cs
var ref = new WeakReference(new int[0]);

if (ref.IsAlive)
{
    DoSomething(ref.Target as int[]);
}
```

説明するまでもないと思いますが、このコードは参照先が存在する場合にのみ `DoSomething` を呼び出すというコードです。

しかし、このコードには罠があります。本当に、`DoSomething` を呼び出す時点で参照先は存在していると言えるでしょうか。`if` の条件式を評価したあと、`DoSomething` を呼び出す前に GC が実行された場合、参照先はもはや存在しません。

このことを考慮すると、以下のようにするのが正しいことがわかります。

```cs
var ref = new WeakReference(new int[0]);

var obj = ref.Target as int[];
if (obj != null)
{
    DoSomething(obj);
}
```

# `WeakReference<T>`

では、`WeakReference<T>` ではどうでしょうか。`WeakReference<T>` には　`IsAlive` も `Target` もなく、代わりに `TryGetTarget` があるだけですから、以下のように書くしかありません。

```
var ref = new WeakReference<int[]>(new int[0]);

int[] obj;
if (ref.TryGetTarget(out obj))
{
    DoSomething(obj);
}
```

`WeakReference` にあった罠は、`WeakReference<T>` にはありません。

先述のとおり、`WeakReference` と `WeakReferenc<T>` では、メソッドやプロパティが異なっていますが、それは `WeakReference` に存在する罠が原因でしょう。そもそも、`IsAlive` で状態を取得したところで、次の瞬間には GC が実行されている可能性があるため、意味がありません。

# まとめ

`WeakReference` ではなく `WeakReference<T>` をつかいましょう。ジェネリックでなく、罠が存在する `WeakReference` を使うメリットはありません。
aws cli の導入


## はじめに

大まかなインストール手順

http://docs.aws.amazon.com/cli/latest/userguide/installing.html

pipでインストールする方法や、Installerを用いる方法などがあるようです。

インストールできているかの確認は`aws help`で。`aws -v`はエラーっぽいです。

## 認証情報を食わせる

AWS CLI使用時には、使用するIAMの情報やリージョン、出力のフォーマットについて、幾つかの方法を用いて指定する事ができる。

### aws configure で登録する

`~/.aws/`の各種ファイルに認証情報などを保存する方法。

````
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: ENTER
````

結果は`~/.aws/config` `~/.aws/credentials`に出力されます。
デフォルトでは`default`プロファイルが登録されるので、マルチアカウント等の必要に応じて適宜変更してみてください。

### コマンドラインオプションでの指定

`--profile` : 利用するプロファイル名
`--region` : リージョン情報を指定する。
`--output` : 出力フォーマットを`json` `text` `table` の中から選択する。


### 環境変数を用いる

`AWS_ACCESS_KEY_ID`: アクセスID
`AWS_SECRET_ACCESS_KEY`: シークレットアクセスキー
`AWS_DEFAULT_PROFILE`: 利用するプロファイル名

`AWS_DEFAULT_REGION `: リージョン


## 参考


Configuring the AWS Command Line Interface
http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html

認証に関する情報
http://www.task-notes.com/entry/20141026/1414322858
Github hubコマンドを使ってみる

githubのhubコマンドが便利ということで使ったら便利だったのでまとめておきます。hubコマンドはここではhomebrewでインストールします。


# 1. homebrewのインストール
＊既に入っている方はとばしてOK。入っているか確認するには以下のコマンドでhomebrewのバージョンが表示できるか確認。

```
$ brew -v
```

## インストール

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

＊Command Line Toolsのインストールがまだの方は上記コマンドの前に、以下のようにインストールが必要です。

**appIDが必要になります**

```
$ xcode-select -install
```

または

[Command Line Toolsのインストール](https://developer.apple.com/downloads/)
からインストールする。
検索窓から「Command line tools」と検索し、自分のMac OSに適切なバージョンをインストールする。
＊Mac OS のバージョンはウィンドウ左上の「リンゴマーク」を押して「このMacについて」から確認出来る。


## 2. hubのインストール
```
$ brew install hub
```

# 3. 設定
## zshを使っている場合

```zsh:~/.zshrc
function git(){hub "$@"} # zsh
```

## bashを使っている場合

```bash:~/.bashrc
eval "$(hub alias -s)" # bash
```

# 4. 使い方

ひとまず使ったものを中心に。
hubにエイリアスをはったので(項目3にて)

```
$hub hoge
```
はすべて

```
$git hoge
```

として使えます。

## githubの該当レポジトリをブラウザで開く

```
$ hub browse
```

## 特定のプルリクのURLを用いて、そのプルリクに対応したbranchをつくる

```
$ hub checkout http://github.com/~
```

## レポジトリをforkする

```
$ hub fork
```

## プルリクエストを送る

```
$hub pull-request
```

## cloneする

(user名)/(レポジトリ名) でクローン出来る

```
$hub clone user/repo
```
クローン元が自分のレポジトリならユーザー名は省略化。

```
$hub clone repo 
```

他コマンドはhubのgithubに詳しく載っています。
[github/hub](https://github.com/github/hub)

# 参考

[GitHubユーザーのためのhubコマンド](http://qiita.com/yaotti/items/a4a7f3f9a38d7d3415e3)
autoscaling グループに含まれるインスタンスの IP アドレスをすべて取得

## 背景
* AutoScaling のグループすべてのホストに対して、デプロイしたい
* IPアドレスを取得するスクリプトを探したが見つけられなかった
* fabric を使っているので Python で開発
* `boto` は使わず AWS コマンドで実装（`aws` の `--query` を使いたいため）

## コード例

```py
import commands
import re

def ipv4_address(instance_id):
  query = "Reservations[].Instances[?InstanceId=='%(instance_id)s'].PublicIpAddress" % locals()
  cmdline = 'aws ec2 describe-instances --query "%(query)s" --output text' % locals()
  return commands.getoutput(cmdline)

def autoscaling_instance_ids(group):
  query = "AutoScalingInstances[?AutoScalingGroupName=='%(group)s'].InstanceId" % locals()
  result = commands.getoutput('aws autoscaling describe-auto-scaling-instances --query "%(query)s" --output text' % locals())
  regexp = re.compile(r'\s+')
  instance_ids = regexp.split(result)
  return instance_ids

def ip_of_the_group(group):
  ids = autoscaling_instance_ids(group)
  return [ ipv4_address(instance_id) for instance_id in ids ]
```

## 参考文献
* http://stackoverflow.com/questions/4450592/string-interpolation-in-python
* http://stackoverflow.com/questions/1410976/equivalent-of-backticks-in-python
* http://stackoverflow.com/questions/13209288/python-split-string-based-on-regex
* http://docs.aws.amazon.com/cli/latest/reference/autoscaling/describe-auto-scaling-instances.html
いろいろな共通化

# ゴール

"【Hello world】"と"【Wild Stars】"を出力する

# いろいろな共通化

## 1. 共通化しない

```java
public class Main {
    public static void main(String[] args) {
        HelloWorld hello = new HelloWorld();
        hello.greet();
        WildStars ws = new WildStars();
        ws.greet();
    }
}
```

```java

public class HelloWorld {
    public void greet() {
        System.out.println("【Hello world】");
    }
}
```

```java

public class WildStars {
    public void greet() {
        System.out.println("【Wild Stars】");
    }
}
```


## 2. 継承
```java
public class Main {
    public static void main(String[] args) {
        HelloWorld hello = new HelloWorld();
        hello.greet();
        WildStars ws = new WildStars();
        ws.greet();
    }
}
```

```java
public class BaseGreet {
	public String message;

	public void greet() {
		System.out.println("【" + message + "】");
	}
}
```

```java
public class HelloWorld extends BaseGreet {
	public HelloWorld() {
		this.message = "Hello world";
	}
}
```

```java
public class WildStars extends BaseGreet {
	public WildStars() {
		this.message = "Wild Stars";
	}
}
```


## 3. インタフェース
```java
public class Main {
    public static void main(String[] args) {
        IGreet hello = new HelloWorld();
        hello.greet();
        IGreet ws = new WildStars();
        ws.greet();
    }
}
```

```java
public interface IGreet {

	void greet();

}
```

```java
public class HelloWorld implements IGreet {
	@Override
	public void greet() {
		System.out.println("【Hello world】");
	}
}
```

```java
public class WildStars implements IGreet{
	@Override
	public void greet() {
		System.out.println("【Wild Stars】");
	}
}
```


## 4. ユーティリティー関数

```java
public class Main {
    public static void main(String[] args) {
        GreetUtility.greet("Hello world");
        GreetUtility.greet("Wild Stars");
    }
}
```

```java
public final class GreetUtility {
	public static void greet(String message) {
		System.out.println("【" + message + "】");
	}
}
```



## 5. 委譲
```java
public class Main {
    public static void main(String[] args) {
        HelloWorld hello = new HelloWorld();
        hello.greet();
        WildStars ws = new WildStars();
        ws.greet();
    }
}
```

```java
public final class GreetUtility {
	public static void greet(String message) {
		System.out.println("【" + message + "】");
	}
}
```

```java
public class HelloWorld {
    public void greet() {
        GreetUtility.greet("Hello world");
    }
}
```

```java
public class WildStars {
    public void greet() {
    	GreetUtility.greet("Wild stars");
    }
}
```


## 6. 関数生成
```java
import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
    	Consumer<String> greet = new Consumer<String>() {
			@Override
			public void accept(String message) {
				System.out.println("【" + message + "】");
			}
		};
    	greet.accept("Hello world");
    	greet.accept("Wild Stars");
    }
}
```
libiconvをインストールしてからVimをソースからコンパイルする

研究室のサーバーに入っているVimにはrubyとかlua等のオプションがついていなかったので、ソースからコンパイルすることにした。
ソースからコンパイルする方法は様々な所で紹介されていると思うが、意外なところで躓いたので備忘録として残しておくことにする。

# 前提
- インストールディレクトリは`$HOME/local`
- ユーザーは名は`hoge`
- ソースを展開するディレクトリは`$HOME/tools`

# Vimをインストール（失敗）

```
cd ~/tools
git clone https://github.com/vim/vim.git
cd vim
./configure \
  --with-features=huge \
  --enable-multibyte \
  --enable-rubyinterp \
  --enable-pythoninterp \
  --enable-perlinterp \
  --enable-luainterp \
  --enable-gui=gtk2 \
  --enable-cscope \
  --prefix /home/hoge/local
```
`configure`の途中で

```
configure: error: cannot compute sizeof (off_t)
```
というエラーが!!! 前にローカルのPCではこんなエラーが出なかったぞ！と思いぐぐってみるとlibiconvが必要なようで研究室のサーバーにはそれが入っていなかった...なのでlibiconvをインストールした。

# libiconvのインストール

```bash
cd ~/tools
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar -xvzf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure --prefix=/home/hoge/local
make -jX # Xは使用するコア数で置き換える
make install
```

# Vimのコンパイル(成功)
コンパイルする前にlibiconvのパスを通す必要がある。
zshを使っているなら.zshrcにbashを使っているなら.bashrcに

```bash
export LD_RUN_PATH=/home/hoge/local/lib
```
を追加して

```bash
source ~/.zshrc # bash使っているなら ~/.bashrc
```
を実行し、

```bash
./configure \
  --with-features=huge \
  --enable-multibyte \
  --enable-rubyinterp \
  --enable-pythoninterp \
  --enable-perlinterp \
  --enable-luainterp \
  --enable-gui=gtk2 \
  --enable-cscope \
  --prefix /home/hoge/local
make -jX
make install
```
でOK。もしくは、`./configure`の前に`LD_RUN_PATH=/home/hoge/local/lib` と書いてもOK。
configureのオプションは好みに応じて変えてください。

# 最後に
なんでlibiconv入ってないんだ...
iPhoneのテザリングを使って、RaspberryPiを無線接続する

iPhoneのテザリングを使って、RaspberryPiを無線接続する方法のメモ

# 準備したもの

1. Raspberry Pi 2 Model B(セットアップ済みのもの、OSはRaspbian)
2. 無線LAN子機（BUFFALO WLI-UC-G301N）
3. iPhone6 (iOS 8.4.1)

# iPhoneの準備

iPhoneの"インターネット共有"をONにする。
1. 設定
2. インターネット共有
3. インターネット共有をONにする

<img width="375" alt="image-6.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/97314/443fb6ca-876c-00d2-164e-aba2328c053a.jpeg">


（Raspberryで実施）
iwlistコマンドで、無線LANアクセスポイントにiPhoneが検出できるか確認する。


```sh:ターミナル
 $ sudo iwlist wlan0 scan | grep ESSID
                    ESSID:"iPhone6" # iPhoneの名前をiPhone6に設定している場合
```

# raspberry Piの接続先をiPhoneに設定

```sh:/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1


network={
        ssid="iPhone6" # iPhoneのインターネット共有の設定に書いてあったのも
        psk="Wi-Fiのパスワード" # iPhoneのインターネット共有の設定で設定したWi-Fiのパスワード
        key_mgmt=WPA-PSK
}
```
ネットワークの設定ファイルが以下のようになっていることを確認する

```sh:/etc/network/interfaces
auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

以上で、iPhoneのテザリングを利用して、Raspberry Piは無線接続できるようになった。
RePhone Kitであそぼーよ！

初めまして。
当初「Rephone皆で買いませんか？」というタイトルで考えていましたが怪しすぎたのでやめました。

今、あと七日間しかないのですがRephone KitというのがKickstarterでクラウドファウンディングの募集をしています。
https://www.kickstarter.com/projects/seeed/rephone-kit-worlds-first-open-source-and-modular-p

キックスターター自体、少し斜に構えて「金の持ち逃げ…間に合わない納期…」みたいな事考える方もいるかもしれませんが、募集元のSeeedというのは最近の電子工作やってる方なら名前くらい見たことあるのではないでしょうか。ちょっと変なガジェットを出してくれる面白いメーカです。
身元は確かなので、それに電子基板等の製作も既に行っているようなメーカなので私が思うにこれは一種のプロモーションとしてこういった策を取ったのかなと考えています。

そしてこの「Rephone」ですが、簡単に説明しますと
・Coreモジュールは「GSM＋BLE(Bluetoothの低電力消費の名前です。一週間で7日くらい電池が持つとか…)」と「3G回線」の二種類
・数分でプログラミングなしで自分だけの携帯電話を組み立てられるし、もし望むならLua、Javascript、Arduino（はほぼ生身のC言語です）でプログラムも出来る。
・差込口ベースのModuleで好きな機能を増やせる（ノーハンダで拡張できる）
・PebbleTimeやArduinoに親和性を高くするつもり。

という特徴をもっております。

ここからは電話に余り明るくない私が調べたことなのですが（物凄く初心者向けの内容でもあります）
・日本ではGSM回線というものは「ない」
->つまりBluetoothとして使うのでなければ3Gのものしか買えない。
・3G回線はHSPA/WCDMA: 850/1900/2100というバンドを使っていて、2100はDocomoのMVNOでも使われている帯域…のはず。
->つまり[SORACOM](https://soracom.jp/)を使えば物凄く格安でデバイスを作れるのでは？？

という感じです。でも、MVNOが全て2100をカバーしているかというとそうでもないかもしれないしよくわからなかったので、私自身はとても人柱覚悟ではありますが。

私がバックしたのは59ドル、日本への送料いれて64ドルのものです。

本当は私、ハッカソンパック（10個入り）を共同購入しませんか、という記事にしたかったくらいなのです。
ただ、ハッカソンパックはGSMしか用意されていないのと、3G版は出荷が来年3月（GSMは12月に早ければと書いてあります）なので、躊躇してしまいました。
実際にはコメント欄で交渉すれば3Gでハッカソンパックにしてやるよ！！！くらいいいそうなテンションの作り手の方たちなのですが……。
（実際したのFAQ欄に「GSMを3Gにするのは出荷時期や値段が違う…けど、差額出せばよきに計らってやるよ」って書いてる）

というわけで、そこからかなり目標を下げて、私も宣伝することにしたのです。
なんせたとえ使えたとしても私だけの手には余るでしょう。
ゾンビってのはね…噛んで仲間を増やすものなんですよ…。

さぁみんな、レッツバック！！！

（ちなみにキックスターターは初回が買えるだけでその後普通に通販もするみたいで、恐らく日本の電子部品屋さんも仕入れるとは思います…。）
Qiitaの 正規表現 関連タグ


[tags/正規表現 - Qiita](http://qiita.com/tags/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)
![正規表現.png](https://qiita-image-store.s3.amazonaws.com/0/76589/f9b88ca3-719f-3367-1ed8-37a73eb7c06c.png)


[tags/regexp - Qiita](http://qiita.com/tags/regexp)
![regexp.png](https://qiita-image-store.s3.amazonaws.com/0/76589/ddfff102-52b6-a46c-4a0e-00ac9273162f.png)


[tags/regex - Qiita](http://qiita.com/tags/regex)
![regex.png](https://qiita-image-store.s3.amazonaws.com/0/76589/16ffec1c-2f67-4a83-02fc-fe34bd465c9d.png)

# 結論

できれば正規表現関連の記事を書かれる際は、「正規表現」タグを使ってください。

なんでもしますから！