OmniAICreator/Qiita-1.07M huggingface dataset:
[GoogleCloudPlatform]GCE海外リージョンから東京リージョンへのサーバ移行方法

# 前書き
１週間ほど前からGoogleCloudPlatformに東京リージョンが実装されましたね。
既存の海外リージョンで使ってた方は、移行作業どうしようと頭を抱えているところだと思います。
自分も相当悩んでました。
正しい方法かはわかりませんが、参考にしていただけたら幸いです。

追記：
海外リージョンから東京リージョンへの移行を行う場合、「スナップショット復元用のネットワーク課金」
により、追加料金がかかるとのことなのでご注意ください。
詳しくは以下から。

https://cloud.google.com/compute/pricing#network_charges_for_snapshot_restoration


## 事前注意
スナップショットを取る時間〜インスタンスを作成する時間までブランクがあるので、
ECサイトや会員制サイトなど、DBが関わっているものはメンテナンスモードなどにしておくことをおすすめします。

## スナップショットの作成

GCPのコンソールにログインし、右上のボタンからComputeEngineを選択します。

<img width="255" alt="スクリーンショット 2016-11-01 13.16.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/146205/90ca32f1-bc02-e8ce-1806-c79a9c801072.png">


右メニューからスナップショットを選択
スナップショット作成ボタンを押して、ソースディスク欄に移行したいサーバを選択し、作成を行います。

<img width="506" alt="スクリーンショット 2016-11-01 13.18.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/146205/9ac2f18d-8c6e-6a68-8e94-93ab684de303.png">

・
・
・
スナップショットの作成が完了しました。
<img width="697" alt="スクリーンショット 2016-11-01 13.22.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/146205/5a21b8fb-a7ad-a02a-90e8-d2a2c0687aed.png">

できたスナップショットのリンク（赤枠内）をクリックします。

## 日本リージョンのインスタンスの作成

<img width="543" alt="スクリーンショット 2016-11-01 13.26.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/146205/8ea52ab8-c06f-46f6-c6d8-e37739c16c44.png">

このような画面が出るので、インスタンスを作成ボタンをクリックします。
そして、ディスクが下記のようになっているか確認します。

<img width="456" alt="スクリーンショット 2016-11-01 12.21.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/146205/d65fc31e-b2a8-87e1-7789-afbe956c7de4.png">

HTTPサーバをたてる場合は、
「ファイアウォール」設定の
・HTTP トラフィックを許可する
・HTTPS トラフィックを許可する
にチェックを忘れずにつけてあげてください。

そして、肝心のゾーン設定ですが、今回開設されたゾーン（東京のゾーン）は、
asia-northeast1-a
asia-northeast1-b
asia-northeast1-c
となります。

この中から一つを選択してください。
選択後、作成を押すと、東京リージョンのサイトが出来上がります。

あとは、VMインスタンスから外部IPにアクセスし、アクセスができたら成功です。
DNSの切り替えを行い、移行完了となります。


### おまけとつぶやき


#### おまけ（ローカルPCからpingしてみた）

環境は複製なのでほぼおなじです。

us-central1-b

```
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=0 ttl=51 time=251.153 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=51 time=275.435 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=51 time=299.109 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=3 ttl=51 time=203.519 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=4 ttl=51 time=201.302 ms
```

asia-northeast1-a

```
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=0 ttl=55 time=54.283 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=55 time=54.864 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=55 time=70.484 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=3 ttl=55 time=54.360 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=4 ttl=55 time=59.752 ms
```

は・・・はやっ。

#### つぶやき

VSphereで言うStorageVmotionみたいな機能があればいいのになと思いつつ。。。
すこしサーバーを止めないといけないのがなんか微妙な感じ。。。

#### つぶやき２
詳しく聞いたところ、無停止移行もできるらしいです。
レプリカを作成し、サーバ間で同期(rsync等)を行い、日本サーバの準備が完了できた時点でバチっと切り替えたらOKとのことです。
まあ、詳細は全然わからないので、今後（いつになるかわからないのですが）詳細を書きたいなと。。。
WordPress wp-admin ログイン失敗時のメッセージを変更する

wp-adminにログイン失敗時のメッセージを見ると、ユーザーが存在するかどうかがわかってしまうメッセージになってます。

- パスワードが間違っている場合
  `エラー:ユーザー名 hogehoge のパスワードが間違っています。`

- ユーザー名が存在しない場合
  `エラー:ユーザー名が無効です。`

これは、「安全なウェブサイトの作り方」にある*2.5 (3)入力後の応答メッセージが認証情報の推測のヒントとならない工夫をする*に沿っていません。そこで、メッセージを変更してみました。

```function.php
function change_login_error_message( $error_message ){

        $changed_message = "<strong>エラー</strong>: ログインできません";

        if ( preg_match("/ユーザー名が無効です。| のパスワードが間違っています/", $error_message ) ){
                $error_message =  $changed_message ;
        }

        return $error_message ;

}
add_filter('login_errors', 'change_login_error_message');
```

`login_errors`フィルタを使って変更しています。正規表現で該当のメッセージのみ変更し、それ以外はそのまま表示しています。

ただし、パスワードリマインダーでも、ユーザー名が存在しているかどうかわかってしまうので、こちらの処理も変更しないといけないようです。
Unity スクリプトで Android のテーマを動的に指定する


AndroidManifest.xml や、Android の native plugin でやっても良いが、Unity からも指定できるよというメモ。
以下、`android.support.v7.appcompat` やカスタムテーマを指定する前提。

```csharp
#if UNITY_ANDROID
  AndroidJavaObject activity = new AndroidJavaClass ("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
  AndroidJavaObject resource = activity.Call<AndroidJavaObject>("getResources");
  string packageName = activity.Call<string>("getPackageName");
  int themeid = resource.Call<int>("getIdentifier", "Theme.AppCompat.Light", "style", packageName);
  activity.Call("setTheme", themeid);
#endif
```

#### 補足

Unity からは、 `R.style.Theme_AppCompat_Light` をそのまま指定できないので、リソースID を取得して指定している。
Java だとこう。

```java
getResources().getIdentifier("Theme.AppCompat.Light", "style", getPackageName());
```

ref: http://qiita.com/t-kashima/items/9462af782fb5f1a2a7da
AWSのCodeDeployを使ったデプロイが突然タイムアウトするようになったら確認すること

# はじめに
AWSのCodeDeployを使うと、EC2インスタンスへのソースのデプロイが楽に実行できます。
参考：http://qiita.com/yukofeb/items/e077fc8755416c904032

そんなCodeDeployを悠々使っていたある日、突然デプロイがタイムアウトするようになった！なんてことありますよね（私は1ヶ月間に2回ありました）。
そんな場合は、ここに記載してある点を確認することで、またデプロイできるようになるかもしれません。
結論を先に言ってしまうと、**デプロイ先のEC2インスタンスでCodeDeploy用のエージェントが停止してしまった場合**にこのようなことが起こります。

# 環境
クライアント：何でも可
デプロイ先EC2インスタンス：Amazon Linux

# 具体的にはどのような症状が起こる？
AWS CLIでデプロイ用のコマンドを叩いている場合は、「コマンドが正常終了したのにインスタンス上のソースが更新されない」という動きが起こります。

# デプロイ失敗時（タイムアウト時）のイベントの確認
一般的なデプロイ失敗（appspec.ymlの記載がおかしい等）の場合は、AWS管理コンソールのCodeDeploy管理画面でイベントを確認することで、何が起きているかが分かります。
ですが、**上記の症状の場合、イベントの内容を見ようとしても見ることができません**。
デプロイ失敗のイベント情報が見られるかどうかは、以下の手順で確認することができます。
一般的なデプロイ失敗の場合、イベントの内容に応じて適宜対処しましょう。

1. AWS管理コンソールのCodeDeploy管理画面を開く。
2. 画面上部のプルダウンメニューから、「デプロイ」をクリックする。
![[80percent]1.png](https://qiita-image-store.s3.amazonaws.com/0/140394/d8930b2c-5410-95ac-095e-3dd7de51117b.png)
3. タイムアウトしたデプロイの「デプロイID」部分をクリックする。
![[80percent]2.png](https://qiita-image-store.s3.amazonaws.com/0/140394/63554d72-3c3f-5ca4-dbc8-ffb148f623a7.png)
4. 画面下部に表示される表の、「イベント」列を確認する。→何も表示されていない！
![[80percent]3.png](https://qiita-image-store.s3.amazonaws.com/0/140394/94bbe2dc-2c3f-dfaa-636c-6144e87aced8.png)


一般的なデプロイ失敗の場合は、下の図のように、「イベント」列に「イベントの表示」リンクが表示されます。
![[80percent]4_small.png](https://qiita-image-store.s3.amazonaws.com/0/140394/6faa0e99-2f6f-f6f2-cff4-bb75f997526c.png)

# デプロイ先インスタンスのCodeDeploy用エージェントの起動状況確認
以下の手順で確認できます。

1. デプロイ先のインスタンスにSSHでログインする。
2. CodeDeploy用エージェントの起動状況を確認する（コマンド：「ps aux | grep codedeploy-agent」）。

上記のコマンドを実行しても何も画面に出力されない場合、CodeDeploy用のサービスが停止しています。
以降の手順に沿ってサービスを再起動することで、再びデプロイすることができるようになります。

# CodeDeploy用エージェントの再起動

1. インスタンス上に残っているPIDファイルをリネームする（削除する場合は自己責任でお願いします）。
  　対象ファイル：
　　/opt/codedeploy-agent/state/.pid/codedeploy-agent.pid
　　/opt/codedeploy-agent/state/.pid/codedeploy-agent.pid.lock

2. CodeDeploy用エージェントを再起動する（コマンド：「sudo /etc/init.d/codedeploy-agent start」）。

以上の手順を実行後に再度デプロイし、ソースが無事配置されることを確認しましょう。
所有者を変更しつつ rsync する

大抵の場合は

```
rsync -avz user1@remote:/path/to/dir/ dir/
```

のようにしてざっくりコピーすることが多いんだけど、Web用ディレクトリなんかをもう少し真面目にコピーする。



```
rsync -avzn --exclude='wp-config.php' \
  --exclude='.htaccess' \
  --usermap=apache:www-data,user1:example.com \
  --groupmap=apache:www-data,user1:psacln \
  --rsh="ssh -p 2222" user1@old.example.com:~user1/htdocs/ \
  ~example.com/httpdocs/
```

CentOSのApacheからDebianのNginxへWordPressを丸ごとコピーする想定。apacheユーザーをwww-dataにマップして、FTPユーザーをバーチャルドメインユーザーにマップする。
`n`オプションは DRY RUN。重要。
この後に出力を見て`n`を外して実行する。
一度目は`exclude`無しで実行して、二度目以降は手動編集したファイルを上書きしないように`exclude`を付ける。
RailsアプリのAMP対応をSassで快適に

# AMPとは

 AMP(Accelerated Mobile Pages)はモバイルでのウェブページ表示を高速化する手法です。Googleが強く推奨しており、2016年10月よりGoogleのモバイル検索結果の表示にAMPが使用されるようになりました。
 高速化のため、AMPページで用いられるHTMLには独自のプロパティや制限があります。cssに関しても、外部ファイルを読み込めない等の制限があります。

# RailsでAMP対応する際の問題

AMPでは外部ファイルを読み込めないので、cssをheadタグ内のstyleタグに書かなければなりません。すなわち、ビュー内でcssをrenderする必要があります。しかし、アセットパイプラインにはそんな仕組みはありません。`File.read`でcssファイルを読み込んでビューに書き出すといった方法はすぐに考え付きますが、これではコンパイルが必要なSassは使えません。

# RailsのビューでSassをrenderする

ではどうやってRailsのビューでSassをrenderするか。答えは**Sassのgemを直接使う**です。なかなか使う機会はないと思いますが、Sassのgemはファイル読込・プリコンパイル・圧縮を一括で行ってくれるスグレモノです。しかも、ワンライナーで書けます！（以下のサンプルでは見やすくするために改行を入れてあります)
　以下にサンプルを示します。プリコンパイルと圧縮の処理はヘルパーにまとめ、それをビューで呼び出す形にしています。


```/app/helpers/application_helper.rb
def render_css(path)
  raw Sass::Engine.for_file("#{Rails.root}/app/assets/stylesheets/#{path}", {
    load_paths: ["#{Rails.root}/app/assets/stylesheets"],
    style: :compressed
  }).to_css
end

```

```/app/views/abc/amp.html.slim

style amp-custom=true
  = render_css('abc/amp.sass')

```

通常の`stylesheet_link_tag`と同様に使えるようにパス周りを工夫しています。拡張子は必須ですが、`Sass::Engine.for_file`が拡張子でフォーマットを判断してくれるので、scssやcssの場合も対応できます。

## 簡単な解説

### Sass::Engine.for_file
`Sass::Engine.for_file(filename, options)`は、第一引数にコンパイルしたいファイルのパス、第二引数にコンパイルのオプションをとります。このメソッドはファイルパスに対応した`Sass::Engine`のインスタンスを生成して返します。このインスタンスは`to_css`や`render`といったメソッドを持っており、これらを呼び出すことでコンパイル結果のcssを取得できます。

### Sass::Engine.for_fileのオプション
　load_pathsでSassの`@import`の基準パスを指定できます。上のサンプルでは`"#{Rails.root}/app/assets/stylesheets"`を指定して、通常のアセットパイプラインと同様に`@import`を使えるようにしています。また、styleにcompressedを指定することで圧縮が有効になります。

### render_cssの戻り値
前述の`to_css`の結果をそのまま返してしまうと、ビューでcssがhtmlエスケープされてしまいます。
それを防ぐために`raw`メソッドを用い、その戻り値を返すようにしています。

# まとめ
たった一行のヘルパーで、AMPページをSassで快適に実装できるようになります。これからAMPに関わる方々のお役に立てれば幸いです。

# 出典

https://www.ampproject.org/learn/about-amp/
https://japan.googleblog.com/2016/10/amp-1.html
http://sass-lang.com/documentation/Sass/Engine.html
3年弱片手間でNagiosを運用してきて学んだTips4点

[株式会社オズビジョン](http://www.oz-vision.co.jp/)の@terra_yuccoです。

[イマドキWebサービスの監視について考えてみる](http://qiita.com/terra_yucco/items/5e726dcbb1971f1b089d)のエントリで、メインプロダクトの監視を2016年下期に実施する、と書きました。
今期この仕事が私のメイン業務になったのには理由がありまして、2014年4月から片手間ではありますが、自己流でNagiosの監視をメインプロダクトに実装していっていたという実績があるためです。
このエントリでは、その3年弱のTipsを数点、共有したいと思います。
2016/11/01時点では4点です。

# メール通知は読まれない
- Slackに発火させるのが一番気づきやすい

全然技術的な話ではないですが、ほんとに一番大きい気付きです。
全社でコミュニケーションにHipChat/Slackを使うようになった現在、
メールの伝達力の低さには目を見張るものがあります。
(「メール送ったから見といて」ってChatで来るのが日常茶飯事です)

# AWSに特化した仕組み大事
AWSをはじめとしたクラウドの特徴として、以下2点を実感しました。

- サーバは使い捨てでいろいろなものが固定じゃない
- クラウドリソース特有の監視の方法がある

なので、以下のような仕組みを作りました。
(あれ、書いたら3行におさまった)

- 定期的に、runningのEC2一覧を取る
- EC2一覧を元に、Nagiosでの名前解決用にhostsファイルを作る
- EC2に付けられたTagをベースに、テンプレートからcfgを作成してnagiosをreload

この処理はNagios ServerでCronで動かしています。
ちょっと一般公開できない部分がありそうなのですが、ある程度の工夫はしているので、
できるだけ自社プロダクトに依存した部分を除去した上でいつかは公開したいなと…！
(ただ公開したころにはNagiosは化石かもしれません)

## メリット
- インスタンスID(可変)指定でないと取れない値を動的に監視できる
- EC2一覧取得時に、インスタンスIDとインスタンス名(Name Tag)を取得すれば紐づけられるため

## デメリット
- Nagiosの設定ファイルだけ追っているとわからない部分ができる
- 今困っていること
  - client側の監視設定(nrpe.cfg)の世代管理
  - 全てserver側のリポジトリ管理にしてデプロイの度にCIから配るのが現実的か？

# 監視項目の過不足を無くすの大事
※この項目についてはまだベストプラクティスは得られていません。

最初はNagiosになれる目的もあり、サンプルに書いてある項目を全部実装していたので、
サーバの死活監視でもPingが走り、個別定義のチェック側でもPingが飛んでいたりしました。
また、Webのフロントアクセスのチェックと、Httpdの死活監視が両方入っていたりしました。
当たり前ですがこの辺、1ヵ所何か起こるとアラートの数がものすごいことに。

# 独自のPluginを作成する方法
- 戻り値
  - 0: 正常(OK)
  - 1: 警告(WARNING)
  - 2: 障害(CRITICAL)
  - 3: 不明(UNKNOWN)
- 標準出力
  - 何かを1行出力すること
  - echo '`<TEXT OUTPUT>`|`<OPTIONAL PERFDATA>`'
![image](https://qiita-image-store.s3.amazonaws.com/0/95030/ad853642-643f-21db-48bc-188496d1b3f7.png)

- サンプルコード

```bash:sample.sh
### after validate and check
if [ ${val} -ge ${critical_threshold} ]; then
    echo 'CRITICAL - val=[${val}]|<detail...>'
    exit 2
fi
echo 'OK - val=[${val}]|<detail...>'
exit 0
```
- その他
  - 上記を満たすなら、実装言語は何でも良い
  - 現職では主にbashを利用

# 最後に
根強いZabbix、国産のエースMeckerel、AWS連携を詠ったNew Relicなど、
色々な対抗馬がある中、Nagiosも十分高機能ですし、まだまだその性能を全部は使えていません。
Error HandlerやFlapping Detectionなど、設定も徐々にブラッシュアップして、良き監視ライフを送りたいものです。

おしまい。
Ruby | Hash に対して .sample する

# こうだ。

```rb
[{a: 1, b: 2, c: 3}.to_a.sample].to_h # => => {:b=>2}
```

# ちなみに

これは動かない。

```rb
 {a: 1, b: 2, c: 3}.to_a.sample.to_h
# => TypeError: wrong element type Symbol at 0 (expected array)
```

# 環境

- ruby 2.3.1








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
リモートディスクトップの接続元ユーザー名を取得する方法

リモートディスクトップでマシンの奪い合いを防ぐため、ログイン・ログアウトをSlack通知するBotを作成しようとしたときに必要になったのでメモ。

#%CLIENTNAME%
環境変数「CLIENTNAME」を参照すればおっけー。


#確認

```txt:cmd
C:\Windows\system32>echo %CLIENTNAME%
daikingca2
```
enzymeでReactコンポーネントのイベントハンドラをテストしてみた

# はじめに

[前回enzymeの導入について](http://qiita.com/kozo002/items/4442b0d290dfa6760ca8)記事を書きました。

これまでは単純にrenderされるDOMのチェックしかしてなかったのですが、今回はonClickなどのハンドラをテストしてみました。
前回同様jestをベースにテストを行っています。

# コンポーネント内のメソッドでハンドルしている場合

```js
// 実装
export default class Hoge extends Component {
  render() {
    return (
      <div>
        <a href="#" onClick={this.onClickLink.bind(this)}>Click me</a>
      </div>
    );
  }

  onClickLink(e) {
    e.preventDefault();
    console.log("clicked!");
  }
}
```

この場合、クリックイベントに対して正しいハンドラが呼ばれているかをテストする必要があるかと思います。
ですので `Hoge.prototype.onClick()` をモックに差し替えます。

```js
// テスト
describe("Hoge", () => {
  describe("when click link", () => {
    it("call Hoge.prototype.onClick() method", () => {
      const wrapper = shallow(<Hoge />);
      const instance = wrapper.instance(); // これでHogeクラスのインスタンスが取得できる
      const fakeOnClickLink = jest.fn(); // モックを作成
      instance.onClickLink = fakeOnClickLink; // モックで上書き

      wrapper.find("a").simulate("click"); // これだけでclickイベントが発生する！！
      expect(fakeOnClickLink).toBeCalled(); // 呼ばれている
    });
  });
});
```

`SharrowWrapper.prototype.instance()` でマウントされたコンポーネントの実体を取得できるため、そのオブジェクトのハンドラをモックで上書きしてしまえばいいみたいです。

## input[type="text"]等でstateの変化をテストする場合

```js
// 実装
export default class Hoge extends Component {
  constructor(props) {
    super(props);
    this.state = {
      email: ""
    };
  }

  render() {
    const { email } = this.state;
    return (
      <div>
        Email: <input type="email" value={email} onChange={this.onChange.bind(this)}/>
      </div>
    );
  }

  onChangeEmail(e) {
    this.setState({ email: e.target.value });
  }
}
```

inputのvalueをstateで管理している場合ですね。
この場合はハンドラが呼ばれるだけでなく、stateの更新まで行えるところまでをテストしたいところです。
ですのでテストは以下のようにしました。

```js
// テスト
describe("Hoge", () => {
  describe("when input email", () => {
    it("change email state", () => {
      const wrapper = shallow(<Hoge />);
      const fakeEventObject = { target: { value: "sample@example.com" } };

      // simulateの2番目以降がハンドラの引数に渡されます
      wrapper.find("input").simulate("change", fakeEventObject);
      // stateメソッドで取得したいキー名を指定すると値が返る
      expect(wrapper.state("email")).toBe("sample@example.com");
    });
  });
});
```

今度はハンドラは元のままにしておいて、changeイベントが起きた時のイベントオブジェクトをfakeに差し替えました。
`ShallowWrapper.prototype.state` を使い、欲しいstateのキー名を指定することで値を取得できます。

## まとめ

いやーenzyme使えば使うほど馴染んできますね。とにかくなんでも簡潔に書けて素晴らしいです。
【AWS】CloudWatch logs をChatwork&Slack

忘れないように。

今回は、

 - LogGroupにログ名
 - LogStreamにインスタンスIDとIP

を指定しています。


```
from __future__ import print_function

import base64
import json
import zlib
import logging
import pycurl
import urllib

from base64 import b64decode
from urllib2 import Request, urlopen, URLError, HTTPError

logger = logging.getLogger()
logger.setLevel(logging.INFO)

api_token       = "token"
room_id         = "id"
room_message    = "https://api.chatwork.com/".format(room_id)

incoming_url    = "https://hooks.slack.com/incoming"

def lambda_handler(event, context):
    data = zlib.decompress(base64.b64decode(event['awslogs']['data']), 16+zlib.MAX_WBITS)
    data_json = json.loads(data)
    send_message = data_json['logGroup'] + '\n' + data_json['logStream']

    for logEvent in data_json['logEvents']:
        logEvent_json = json.loads(json.dumps(logEvent, ensure_ascii=False))
        send_message = send_message + '\n' + logEvent_json['message']
    
    logger.info("send message is " + send_message)
    option = {'body': send_message}
    cw_headers = { 'X-ChatWorkToken' : api_token }
    cw_req = Request(room_message, urllib.urlencode(option), cw_headers)
    try:
        cw_response = urlopen(cw_req)
        cw_response.read()
    except HTTPError as e:
        logger.error("Request failed: %d %s", e.code, e.reason)
    except URLError as e:
        logger.error("Server connection failed: %s", e.reason)

    slack_message = {
        'channel': 'notice_dms',
        'text': send_message
    }
    sl_req = Request(incoming_url, json.dumps(slack_message))
    try:
        sl_response = urlopen(sl_req)
        sl_response.read()
    except HTTPError as e:
        logger.error("Request failed: %d %s", e.code, e.reason)
    except URLError as e:
        logger.error("Server connection failed: %s", e.reason)
```
Selenium + Firefox 47+ の Can't load the profile. のエラーの対応

```python:python
from selenium.webdriver import Firefox
driver = Firefox()
driver.get('http://example.com')
```

した時に、

`Can't load the profile.` というエラーが出る対応。mac。

Firefox 47 から入ってるマリオネット marionette という環境構成システム(?) に、Selenium が対応できていない?

geckodriver を brew でインストールする。

```bash:command
$ brew install geckodriver
$ pip install -U selenium
```

```python:python
firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True

driver = webdriver.Firefox(capabilities=firefox_capabilities)
driver.get('http://example.com')
```

これでOK

参考: [Can't open browser with Selenium after Firefox update - Stack Overflow](http://stackoverflow.com/questions/37761668/cant-open-browser-with-selenium-after-firefox-update)

## 追記

その後、

```
selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH. 

Exception AttributeError: "'Service' object has no attribute 'process'" in <bound method Service.__del__ of <selenium.webdriver.firefox.service.Service object at 0x109a96690>> ignored
```
これが出たら

```python:python
import os
if "/usr/local/bin" not in os.environ['PATH']:
    os.environ['PATH'] += os.pathsep + "/usr/local/bin"
```
Ubuntu 16.04+Tensorflow 環境で起きるSegmentation faultを解決する

Ubuntu 16.04 でディープラーニング環境を整えて開発していて、「ソフトウェアの更新」をかけたらアップデート中の項目に「nvidia 367」とあってあやしげな雰囲気、、
と思っていたら再起動すると以下のようにcudnnが見つからずセグメンテーションフォールトが。。

```shell-session
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:102] Couldn't open CUDA library libcudnn.so. LD_LIBRARY_PATH: 
I tensorflow/stream_executor/cuda/cuda_dnn.cc:2259] Unable to load cuDNN DSO
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcurand.so locally
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:925] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_init.cc:102] Found device 0 with properties: 
name: GeForce GTX 1080
major: 6 minor: 1 memoryClockRate (GHz) 1.7335
pciBusID 0000:02:00.0
Total memory: 7.92GiB
Free memory: 7.81GiB
W tensorflow/stream_executor/cuda/cuda_driver.cc:572] creating context when one is currently active; existing: 0x34500e0
Segmentation fault (コアダンプ)
```
色々試してみた結果、
```
CUDA_VISIBLE_DEVICES=1
```
といった感じで指定しないといけなくなってしまったようです…いままでは特に指定せずとも動いていたのですが…
使用するGPUを.bashrcで指定してあげることで動きました。筆者の環境ではGT 610とGTX 1080を2枚挿ししていたこともあって必要になったというのもあるのでしょう。
Microsoft Edgeで電話番号がリンクにされる

# 概要

特定の形式の電話番号(xxx-xxxx-xxxx等)が、Microsoft Edgeではリンクにされてしまう。
※xx-xxxx-xxxxだとリンクにされない。
バグではなくEdgeの仕様（機能）ではあるものの、「意図せぬ動作」としてバグとして報告されてしまったので記録しておきます。

# 詳細
```html
<div class="wrapper">
  <p class="number">03-1234-5678</p>
  <p class="number">012-1234-5678</p>
</div>
```

こういったHTMLを用意して、Edgeで開いてみてください。上の番号はそのままテキストで表示されていますが、下の番号は押すと電話がかけられるリンクになってしまっている筈です。
jsFiddle辺りで確認するのが手軽かと思います。

日本の固定回線番号のフォーマットだと変換されないようですが、xx-xxxx-xxxxのような携帯番号だとアメリカの電話番号だと判断されて変換されてしまうのかな・・と予想しています。

# 回避策
自動フォーマットを無効にするmetaタグ指定を入れる。

```html
<meta name="format-detection" content="telephone=no">
```

# 参考リンク
https://msdn.microsoft.com/en-us/library/dn265018(v=vs.85).aspx

上のリンクを読めば、バグなどではないと分かりますが、初めて見た時は何が起こったのかと思ってびっくりしました。

# 独り言
- IE11でもなるって書いてあるけど、なってなかったのが気になっている。
- Safariでもなると知り合いから聞いたけど、まだ検証してない。
cshでスクリプト配置場所を取得

shell書いているとスクリプト配置場所を取得したい事があると思う
"shell カレントディレクトリ" 等で調べると以下の例が出てくる

```shell
echo $(cd $(dirname $0) && pwd)
```

実行すると

```bash
syntax error at line 2: `(' unexpected
```

となってしまった
これは cshell で動いていたのが原因で
cshellの場合は以下のように書けば動いた

```bash
echo `cd \`dirname $0\` && pwd`
```

動いているshellは以下で確認できる

```bash
$ echo $SHELL
/bin/csh
```
tar: lzop: Cannot exec: No such file or directory

プログラムを移植した環境の
`tar --lzop -cvf test.tar.lzo test`
で表題のエラー。
[tar (child): bzip2: Cannot exec: No such file or directory - Qiita](http://qiita.com/DQNEO/items/6e66675b4c124cb708d7)
から類推して
`yum install lzop`
で解決。
誤ってGitのブランチを消してしまった場合の戻し方

ローカルとリモート両方のブランチを消してしまった場合の戻し方です。
[SourceTree](https://ja.atlassian.com/software/sourcetree)を使用しています。

## コミット
状況を再現するためmasterブランチを作りコミットをします。
その後masterからdevelopブランチを作り2つコミットします。
![スクリーンショット 2016-10-31 20.23.33.png](https://qiita-image-store.s3.amazonaws.com/0/145420/eb67a684-4e28-7b1a-7777-bdb1f1934a18.png)

この状態からdevelopブランチを削除します。
![スクリーンショット 2016-10-31 20.23.52.png](https://qiita-image-store.s3.amazonaws.com/0/145420/be9a6516-f91e-b6dd-2934-46387ef7bee5.png)

## コミットの戻し方(新しいブランチ作成)
ローカルにもリモートにもブランチが無いため、Gitのコマンドにて戻してみます。
`git reflog` を行う事でコミットのログを見る事が出来ます。

```
$ git reflog
b2a9d16 HEAD@{0}: checkout: moving from develop to master
a5778af HEAD@{1}: checkout: moving from master to develop
b2a9d16 HEAD@{2}: checkout: moving from develop to master
a5778af HEAD@{3}: commit: test3
9281d3c HEAD@{4}: commit: test2
b2a9d16 HEAD@{5}: checkout: moving from master to develop
b2a9d16 HEAD@{6}: commit (initial): test1
```

この中から戻りたいコミットのIDと新しいブランチ名を指定する事で戻れます。
`git branch 新しいブランチ名 コミットID`

```
$ git branch develop a5778af
```
![スクリーンショット 2016-10-31 20.25.06.png](https://qiita-image-store.s3.amazonaws.com/0/145420/ba14606e-7360-974a-d5ae-bb099f4ecaae.png)

新しくdevelopブランチが作成されtest3のコミットに戻れました。

## コミットの戻し方(現在のブランチを使用)
同じように`git reflog`のコミットに`git reset コミットID`で現在のブランチで指定コミットに戻る事も出来ます。

```
$ git reflog
b2a9d16 HEAD@{0}: checkout: moving from develop to master
a5778af HEAD@{1}: checkout: moving from master to develop
b2a9d16 HEAD@{2}: checkout: moving from develop to master
a5778af HEAD@{3}: commit: test3
9281d3c HEAD@{4}: commit: test2
b2a9d16 HEAD@{5}: checkout: moving from master to develop
b2a9d16 HEAD@{6}: commit (initial): test1

$ git reset a5778af
```
![スクリーンショット 2016-10-31 20.26.41.png](https://qiita-image-store.s3.amazonaws.com/0/145420/ec051d7c-3770-722c-4363-e05fba240197.png)

現在のブランチ(今回はmaster)のまま、test3のコミットに戻れました。
Oracleのバージョンに隠された意味について

タイトルは少々煽り気味。
中身はOracleのバージョンに関して調べることがあってその時のメモで、
エクセルに個人メモとして残していたんだけどどうせなら、ということで投稿。

引用元サイト
http://www.sql-dbtips.com/architecture/opatch/ 
http://yskwkzhr.blogspot.jp/2011/02/some-of-oracle-patch-you-might-not-know.html 
 
## PSR (Patch Set Release) 
 安定したパッチセット。
 重要度の高いバグフィックス。
 PSUやCPUなどを適用する上での前提条件であることも多い。
 下記のSQLを実行したときに、4桁目のバージョン番号で識別できる。
 select * from v$version;
 
 たとえば、10.2.0.5.0ならPSRの5が適用済み、11.1.0.7.0ならPSRの7が
 適用済みであることがわかる。
 
 PSRを適用する場合は、Oracle Universal Installer(OUI)でソフトウェアを更新し、
 その後dbuaでアップデートする。
 
## PSU（Patch Set Update） 
 四半期ごとにリリースされる累積型の修正パッチ。
 PSRごとに提供されている。
 下記を参照したときに、バージョン番号の5桁目で識別できる。（未適用の場合は0)
 select * from v$version;
 
 たとえば、10.2.0.5.4ならPSR 10.2.0.5に対してのPSU 4が適用済み、
 11.1.0.7.5なら、PSR 11.1.0.7のPSUの5が適用済みであることがわかる。
 
 PSUを適用する場合は、Oracl Universal Installer(OUI)ではなく、
 Opatchというパッチ適用ユーティリティを使用する。
 対象のPSUによってはOpatchのバージョンについても前提条件があるので要確認。
 
## CPU（Critical Patch Update） 
 PSUと同様に四半期ごとにリリースされる、累積型のセキュリティ修正パッチ。
 
 CPUはPSUの中にバンドルされていることが多いので、PSUを適用した後に個別に
 CPUを適用する必要があるか確認が必要。
 PSRやPSUとは異なり、v$versionでは参照できない。(opatch lsinventoryなどで参照する)
 
 CPUを適用する場合は、Oracle Universal Installer(OUI)ではなく、
 Opatchというパッチ適用ユーティリティを使用する。
 対象のCPUによってはOpatchのバージョンについても前提条件があるので要確認。
 
## PSE (Patch Set Exception)  別名：個別パッチ 
 次期PSRやPSUなどがリリースされるまでの間（またはリリース予定のないバグ対処のため）、作成されるパッチの最小単位。
 
 基本的には回避策のないクリティカルな問題に対応するための手段であり、
 環境によっては競合が発生する可能性があるため、慎重に行うべきである。
 
 例えば、個別パッチ A を適用してある環境に、個別パッチ B を適用を試みたが、
 B で修正されるモジュールが A と同じだったため、個々のパッチの修正自体に
 問題は無いのにも関わらず、競合が発生するというケースもある。
 
 つまりバグ対処を行える反面、適用すればするほど、以後アップデート時の際に
 前提条件が増える可能性が高いということ。(Oracle に限ったことではない)
 
 将来的に、その個別パッチが PSR や PSU 等にバンドルされることもあるので、
 クリティカルな場合を除き、積極的に適用しないというスタンスでよいと思う。
 
## 診断パッチ (Diagnostic Patch)  
 不具合を修正するためではなく、問題を診断する目的のために作成されるパッチ。
 リリースタイミングは不定期。
 顧客に対してサポートより必要と判断されると提供される。
 OPatch で適用する。
 注意事項: ◾問題を修正するパッチではない。
 診断パッチを適用することにより、問題の原因が特定できた場合にのみ個別パッチが作成される。
 
## バンドルパッチ (Patch X)  
 Windows プラットフォーム用累積パッチ。CPU や PSU も含まれる。
 基本的に四半期ごと。
 My Oracle Support よりダウンロード可能。
 注意事項: ◾Windows プラットフォームではオブジェクト・ファイルごとの提供が不可能であるため、個別パッチのようにパッチを提供することが出来ない。（バイナリをリコンパイルする必要があるため）
 特定の不具合のパッチの申請が行われた場合、将来の Windows Bundle Patch X に累積して含める形で提供される。
 
## Oracle Database ソフトウェアのリリースの識別 
 11.2.0.1.0
 ドットで区切られた数値は、左から順番に次のような意味になります。
 バージョン番号
 メンテナンス・リリース番号
 アプリケーション・サーバのリリース番号
 コンポーネント固有のリリース番号
 プラットフォーム固有のリリース番号
NSExceptionをSwiftでtry-catchする

KVOでaddObserverしたものをremoveObserverするときなどに、addした以上にremoveを呼ぶとExceptionが発生します。
しかし、発生したExceptionはSwiftで直接catchすることはできません。

以下のようなObjective-Cのラッパーを使用することで、そのExceptionをcatchすることができるようになります。

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

@implementation ExceptionHandler

+ (BOOL)catchExceptionWithTryBlock:(__attribute__((noescape)) void(^ _Nonnull)())tryBlock error:(NSError * _Nullable __autoreleasing * _Nullable)error {
	@try {
		tryBlock();
		return YES;
	} @catch (NSException *exception) {
		*error = [NSError errorWithDomain:exception.name code:-9999 userInfo:exception.userInfo];
		return NO;
	}
}

@end
```

上記のように引数が`NSError **`で返り値が`BOOL`なメソッドは、Swift側で自動的にthrowableなメソッドとして変換されるようです。

```swift:ExceptionCatchable.swift
protocol ExceptionCatchable {}

extension ExceptionCatchable {
    func execute(_ tryBlock: () -> ()) throws {
        try ExceptionHandler.catchException(try: tryBlock)
    }
}
```

Protocolとして継承したクラスでのみ使いたかったので、デフォルト実装をしてもう一度throwします。

```swift:ViewController.swift
class DataSource: NSObject {
    dynamic var value: String = ""
}

class ViewController: UIViewController, ExceptionCatchable {

    let dataSource = DataSource()
    
    deinit {
        do {
            try execute {
                dataSource.removeObserver(self, forKeyPath: "value")
                dataSource.removeObserver(self, forKeyPath: "value")
            }
        } catch let e {
            print("\n", e, "\n")
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        dataSource.addObserver(self, forKeyPath: "value", options: .new, context: nil)
    }
}
```

上記のようにすることで、executeメソッドにExceptionが起こるであろう処理のClosureを渡して、try-catchできるようになります。

KVOのremoveの場合だけでなく、握りつぶしたいExceptionの場合にも使用可能です。
zshでrbenvを使うとき発生した問題点を解決したので整理した。


## rbenvで設置したRUBYバージョンが表示されない。

### 症状

* rbenv versionsで確認したとき、system以外に他のバージョンは表示されない。

```zsh
[devsoul@dev:~] % rbenv versions
* system (set by /usr/local/bin/rbenv/version)
```

### 原因

* RBENV_ROOTという環境変数が設定されてないか間違って設定されている場合に発生する。

### 対応

* RBENV_ROOTを確認する。

```zsh
% brew info rbenv
rbenv: stable 1.0.0 (bottled), HEAD

...snip...

Rbenv stores data under ~/.rbenv by default. If you absolutely need to
store everything under Homebrew's prefix, include this in your profile:
  export RBENV_ROOT=/usr/local/var/rbenv
```

* 使っているシェルの設定ファイルに追記する。

```zsh
% vim .zshenv
export RBENV_ROOT=/usr/local/var/rbenv
```

## rbenv: no such command `shell'

### 症状

* rbenv shellのコマンドが効かない。
* 確かに去年も同じ問題があった。[参考](http://qiita.com/park-jh/items/4b610cc0f6cc2b373bf2#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0)
* そのときは何となくうまく行けたので原因を調べていなかったが今度やってみた。

### 原因

* 環境変数PATHに/usr/local/var/rbenv/shimsがない。ていうのはrbenv init -がされてない。

```zsh
[devsoul@dev:~] % echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin
```

* zshはmacOS Sierraにデフォルトで設置されているものをそのまま使っている。

```zsh
% which zsh
/bin/zsh
% zsh --version
zsh 5.2 (x86_64-apple-darwin16.0)
```

* 使っているzshの設定ファイルは4つで、読み込み順序は~/.zshenv > /etc/zprofile > /etc/zshrc > ~/.zshrcだった。

```zsh
% ls -al /etc/z*
-r--r--r--  1 root  wheel  126 10  6 22:18 /etc/zprofile
-r--r--r--  1 root  wheel  140 10  6 22:19 /etc/zshrc

% ls -al .z*
-rw-r--r--  1 devsoul  staff    429 10  7 11:29 .zshenv
-rw-r--r--  1 devsoul  staff   4612 10  7 16:34 .zshrc
```

* rbenv init -は環境変数PATHに/usr/local/var/rbenv/shimsを入れてくれる。

```zsh
% rbenv init -
export PATH="/usr/local/var/rbenv/shims:${PATH}"
export RBENV_SHELL=zsh
source '/usr/local/Cellar/rbenv/1.0.0/libexec/../completions/rbenv.zsh'
command rbenv rehash 2>/dev/null
rbenv() {
  local command
  command="$1"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  rehash|shell)
    eval "$(rbenv "sh-$command" "$@")";;
  *)
    command rbenv "$command" "$@";;
  esac
}
```

* zshの環境変数を設定する~/.zshenvに追記したが、/etc/zprofileでPATHが上書きされていた。

```zsh
% cat /etc/zprofile
# system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
	eval `/usr/libexec/path_helper -s`
fi
```

* path_helperを実行してみるとPATHを設定していた。

```zsh
% /usr/libexec/path_helper -s
PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin"; export PATH;
```

### 対応

* rbenv init -を.zshenvから.zshrcへ移ることで解決した。

```zsh
% vim .zshrc
# rbenv
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi

% echo $PATH
/usr/local/var/rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin
```

* /etc/zprofileの以降読み込む設定ファイルであれば~/.zshrc以外に追記しても大丈夫。

* しかし、~/.zshrcはログインシェルとインタラクティブシェルのとき読み込まれるからこっちがいいかもね。

## 参考

* https://github.com/rbenv/rbenv
* http://qiita.com/muran001/items/7b104d33f5ea3f75353f
VirtualBoxにSSH接続しようとしてConnection refused。

# 概要

久しぶりにVM作ってSSH接続しようとしたら、
`ssh: connect to host ???.???.???.??? port 22: Connection refused`
でコケてしまった件について綴ります。

凡ミスだし、同じような記事も5万件ぐらいあるかも知れないですが、自分用に…。


# 解決策

たぶん、VirtualBox側でポートフォワーディングの設定をしてあげれば解決するよ！

![ss_123.png](https://qiita-image-store.s3.amazonaws.com/0/97611/671ef6f6-685c-eeab-05bd-49b0160eba20.png)

SSHはデフォルトでは22番ポートを使うので、SSH側の設定を特に変更していない場合は、
VirtualBoxのポートフォワーディングルールでホストとゲストのポートを両方とも22に設定してあげればOK!

とっても簡単ね！


# 関連

その他SSHのトラブルは↓もオススメ！

- [Linux(CentOS7)でSSHを利用する。](http://qiita.com/sango/items/816136188387221f05b3)
Cognos BI Graphics Serviceのチューニング

Cognos BIのレポートでグラフに大量のデータをレンダリングしていると、Graphics ServiceのJVMメモリーのOut Of Memoryエラーが発生して、レポートが実行できない事が良く発生します。

たとえば、折れ線グラフのX軸を最大個数表示、カテゴリも最大種類数表示、プロンプト等でパラメーターを保持しているのであれば、パラメーター文字数も最大になるようプロンプトを選択して、グラフの表示が問題なくできるか、テストで確認しておく必要があります。

エラーになる場合、以下を参考にして、チューニングを行ってください。

WindowsとLinuxでチューニング方法が異なりますが、こちらのTechnoteにまとまっています。

**Java Heap Space Error When Running Report with a Chart**
http://www-01.ibm.com/support/docview.wss?uid=swg21695636

**＜抜粋＞**
**For Windows 64-bit environment:**

1. Ensure you make a back up of <install>\webapps\p2pd\WEB-INF\services\cgsService.xml
2. Using a text editor edit cgsService.xml
3. Locate the first instance of <!-- JVM arguments -->
4. Change

\<child-proc-cmd>Xmx1g\</child-proc-cmd>
to

\<child-proc-cmd>Xmx4g\</child-proc-cmd>

5. Add the following after the above line:

\<child-proc-cmd>Xms4g\</child-proc-cmd>

\<child-proc-cmd>Xmn2g\</child-proc-cmd>

**On UNIX/Linux 64-bit**

1. Make a back up of cgsServer.sh located in both <install>/bin64 and <install>/bin

2. Modify cgsServer.sh in both places as such:

Replace:

\$JAVA_CMD \$JAVA_OPTS -Xmx1g \$USE_NON_ASYNC -classpath \$CLASS_PATH com.ibm.cgsBus.CGSServer

with

\$JAVA_CMD \$JAVA_OPTS -Xmx4g -Xms4g -Xmn2g -Xcompressedrefs \$USE_NON_ASYNC -classpath \$CLASS_PATH com.ibm.cgsBus.CGSServer
RealmデータをwatchOSとiOSとの間でやりとりする(1)

#はじめに
watchOSとiOSとの間でRealmのデータをやりとりする実装方法について述べます。
watchOS2+、iOS9+、Swift 3を前提に話を進めます。
動作するコードを[サンプルプロジェクト](https://github.com/hsylife/SampleRealmOnWatchOS3)としてGitHubに公開しました。実機でランすれば、速度感を体験できます。

#基本的な考え方
iOS-watchOS間でRealmファイルを共有したい場合、かつてwatchOS 1の時代では、iOS側が親、watchOS側が子となり、子は親のRealmファイルそれ自体を参照するという考え方をとっていました。(watchOS 1については、こちらの資料をご覧ください。[RealmとApp Extensionのガイダンス/Realm meetup vol.6](http://www.slideshare.net/YutaHoshino/realmapp-extensionrealm-meetup-vol6))

これに対して、watchOS 2以降では、iOS側とwatchOS側のRealmファイルはそれぞれ別個の実体となります。このため、何らかの方法でファイルを同期する必要が生じます。

今回は、iOS側のRealmファイルをfileTransfer()でwatchOS側にファイル転送する、という考え方をとります。実装をシンプルに済ませることができるからです。

同期の方法としては、差分をupdateApplicationContext()で送り、内容的一致をとる方法もありえます。確かに、転送データに無駄がないので、ファイルが大きい場合は転送スピードや省エネの面で有利になる可能性があります。しかし、ファイルサイズが極端に大きくない場合、実装しやすさの価値のほうが大きいと判断し、今回はfileTransfer()の方法を採用しました。

サンプルプロジェクトを通じて実装の勘所をメモしていきたいと思います。

#サンプルのゴール
サンプルとしてどんなものかを作るか。
iOS側でtextFieldを入力すると、Realmに保存され、その内容が逐次、watchOS側のLabelに反映されるものを作ることにします。

実装の方針
1. iOS側のtextFieldの変更毎にRealmにテキストを保存する。
2. 変更時に、iOS側のRealmファイルをWCSessionのfileTransfer()でwatchOS側にファイル転送する。
3. 届いたら、watchOS側のRealmファイルを刷新し、内容を取り出してwatchOS側のLabelに表示する。

#サンプルコードの実行
SampleRealmOnWatchOS3
https://github.com/hsylife/SampleRealmOnWatchOS3
このサンプルでは、転送速度の比較のために、sendMessageによって直接データを送信する方法も実装しています。
1. GitHub上のリポジトリをクローンします。
2. RealmSwiftをImportするために、ターミナルを起動し、CocoaPodsの`pod install`を実行します。
3. シミュレータで動作確認したい場合、スキームをwatchOSにしたまま、Runします。watchOSアプリを起動します。
4. iOSアプリを起動します。
5. アプリで表示されているステップの通りに、iOSアプリ側のtextFieldにテキストを入力すると、watchOS側に反映されます。

#関連リンク
[RealmデータをwatchOSとiOSとの間でやりとりする(2)](http://qiita.com/hsylife/items/03a84a0edca91976f938)
Chainer-goghでDeep Learning（深層学習）に触れてみた

最近良く聞く「ディープラーニング」がどんな物なのか、実際にChainerを利用したChainer-goghを動かして体感してみた話。
【前提】
・使用OS:CentOS 7
・Pythonが利用可能であること。

# Chainer
[Chainer](http://chainer.org/)は、見るからに難しそうなディープラーニング（深層学習）のために開発されたオープンソースのフレームワークで、Python（Version 2.7以上）上で動作します。
GPUもサポートしており、CUDAなどを利用した計算も可能。彼らいわく「ニューラルネットを誤差逆伝搬法で学習する」との事。
"聞いたことだけはある"単語がちらほらあって、ワクワクします。

# Chainer-gogh
GitHubに掲載されているサンプルによると、以下のような結果が得られるそうです。
https://github.com/mattya/chainer-gogh
![spl_image.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/3b9c9f64-82a5-19a1-cbbd-54954a6177a4.jpeg)

猫の画像にパターンを適用しています。
なんともそれっぽい。そして、何かかっこいい。

# 手順
何はともあれ、まずは一度動かしてみましょう。
今回はPythonが動作するよう設定されたCentOS7上で実行してみました。
使用する画像は、昼休みに会社の近くで撮影した画像と、ゴッホの"夜のカフェテラス"です。
あえて昼の写真に夜をモチーフとした絵画をぶつけてみましたが、どうなることやら。
![s_im1.png](https://qiita-image-store.s3.amazonaws.com/0/131348/bf4d6827-b63b-2107-bd60-730fd81dfa7e.png)
元画像

![s_style.png](https://qiita-image-store.s3.amazonaws.com/0/131348/9c1e0e5c-88aa-dea8-867f-e0c7064a4cc7.png)
"夜のカフェテラス"

上の２枚の画像を使って生成。
早速環境を整えていきます。

```
// Chainerをインストール
$ pip install chainer
```

```
// GitHubから任意のディレクトリへファイルをclone
$ git clone https://github.com/mattya/chainer-gogh.git
```

cloneしたchainer-goghディレクトリ内へ、以下URLからDLしたmodelファイルを配置します。
https://www.dropbox.com/s/0cidxafrb2wuwxw/nin_imagenet.caffemodel?dl=1

```
// 画像の処理に必要なPIL(Python Imaging Library)などをインストール
$ easy_install --find-links http://www.pythonware.com/products/pil/ Imaging
$ pip install image
```

スタイルを抽出したいファイルと、適用したいファイルをchainer-goghディレクトリへ配置する。
今回はそれぞれstyle.png、im1.pngとして配置しました。

```
// 実行（CPUモード）
// python chainer-gogh.py -m nin -i input.png -s style.png -o output_dir -g -1
$ python chainer-gogh.py -m nin -i im1.png -s style.png -o output -g -1
```
もちろん上記のままでも良いのですが、パラメータを指定してやることで自分好みに調整する事が出来ます。

```
// 例）元画像の重みを上げ、横幅460、イテレーション8000まで実行して作成する場合。
$ python chainer-gogh.py -m nin -i im1.png -s style.png -o output -g -1 --lam 0.8 --width 460 --iter 8000
```
それぞれのデフォルト値はソースコードに書かれています。
特に、iterとlamの値は出力に大きく影響するので、それぞれ適切な値を探してみてください。

# 生成結果
とくに何も考えず、感覚で実行した所このようになりました。
![im_04950.png](https://qiita-image-store.s3.amazonaws.com/0/131348/28c94835-8e26-42a6-9f16-ea6927a72da2.png)
まあ、初めてにしてはアリなのではないでしょうか。
GPUを利用して、他のモデルファイルを使ってやればさらに高品質な結果が得られるらしいのですが、あいにくこの記事を書いている環境ではGPUが使えないため、また試してみた後に追記なりしたいと思います。

# 高速変換について
今回は標準のモデルファイルを配置しましたが、学習済みのモデルファイルへと置き換える事で処理時間を劇的に短縮する事ができるようです。
が、今はそこまで試せていないのでURLの紹介のみに留めます。
https://github.com/yusuketomoto/chainer-fast-neuralstyle


１から機械学習や深層学習などといった物を実装するのは難易度が高いと思いますが、既存の物を動かして体験するだけであれば、ここまで簡単なんですね。
前回、[「白黒画像に着色してくれるSiggraph2016 Colorizationがすごい」](http://qiita.com/kouta_hara/items/c5042ffaa03c976781a0)として記事にした物もそうですが、難易度高めな課題に対して第一歩を踏み出すためのハードルは、低ければ低いほど興味を持ちやすいですよね。
また面白い物を見つけたら、いろいろ触りつつ徐々にでも掘り下げて行きたいと思います！
SwiftでRPGをほぼスクラッチから作成したが、こんご後悔しないための戒め

2016年10月28日にRGambitteというタイトルの
テキストRPGをリリースできました。

ほんとに長い開発期間がかかりました。
2013年9月ごろから開発し始めて、約３年。
ほんとに長い。

反省というか、戒めのためにメモを残しておきます。

> 主因 1　Objective-cからSwiftに開発言語を変更

>> 半年間、Obj-Cで開発していて使い慣れたフレームワーク、
開発ノウハウ（大したことなが、ほぼ考えないで実装できる部分）
が無駄になった。
さらに、新しい言語を覚えるためのコスト。
半年間書き溜めたコードの書き換えコスト。
（ブリッジするという選択肢は捨てていたため）

> 主因　２　RPGを作ったことがないということ

>> 作りたいRPGを作り始めたら、一生終わらないことを悟る。
その後、何度も仕様の変更を繰り返すことになった。


***
 
＜戒め＞

    1. ユニットテストは開発中盤まで書かない
       -> どうせテストはスグ壊れる

    2. できるだけフレームワークを使う
       -> できだけ他人の力を借りる

    3. ユニットテストの代わりにplaygroundでテストを書いておく
       -> playgroundのファイル名はクラス名にしておこう
       -> 書いたコードは削除せず、コメントアウトしておこう
       -> playgroundも大量のコードがあると動作がもたつくので注意
       -> 確認できたらコメントアウト
       -> コメント大事。積極的に書いおく

    4. xcodeがエラーを標示している状態で終わりにしよう。
    　　-> いつコーディングが再開できるかわからないぞ！

    5. 小さいプロジェクトで機能を試そう（特にUI）
       -> 想像してごらん（未来の俺、思い出せ）、エンディングのUIテスト　…orz
       -> CoreDataの実装
       -> アニメーションの調整

    6. リファクタリングする暇があったらもいちど全部書き直せ！
       -> ついつい新しい技術を使いたくなるからコードが不必要に読みにくいぞ！
       -> ゲームシステムの贅肉が削がれていく（強制的にシンプルに！）

    7. 意地でも完成させよう！
       -> 完成させなければただの人生の浪費
　　  

＜結論＞
　　もっとシンプルに、もっとゲーム性を上げることはできるのではないかと考えているが、それは今後のアップデートで対応するとして、**二度とRPGをスクラッチから作成したいと思わないこと！**
Rspec | subject にラムダを使う ( expect でブロックを使う場合の is_expected の書き方 )

expect を ブロックで囲わなければいけない検証の場合。

```rb
it { expect { some_action }.to change { some_status } }
```

普通に `subject` / `is_expected` を書こうとすると落ちる

```rb
subject { some_action }
it { is_expected.to change { some_status } }
```

ラムダを使えば解決。

```rb
subject { -> { some_action } }
it { is_expected.to change { some_status } }
```


# 環境

- rspec 3.4.0








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Cisco ネットワーク機器 サポートされるOSの調べ方

先日のエントリー[Cisco ネットワーク機器 コンフィグ見積もりの作り方](http://qiita.com/inoko/items/eb47fa6b7faca247ea4a)に関連して、選定した機器がサポートするOSの調べ方を書いておきます。

# その機器にインストール可能なOSは?
先日、機器選定の中で「WS-C3850-24XU-E」という機器が出てきたのですが、CiscoのSoftware Download サイトをよくよく見ると、この機器は3.6.xというOSが提供されていないことがわかります。

![image](https://qiita-image-store.s3.amazonaws.com/0/105131/b75c98a8-cf2e-69bf-a70d-1d7ee943a981.png)

CiscoのOSって、3.xとか15.xとか複数のラインがあるし、機器によってインストールできるOSが違って分かりにくいデスネ。

# OSから対応する機器を検索する
案件の中で導入予定のOSが決まっていて、対応している機器を選定したいという場合には、リリースノートを見るのが手っ取り早いと思います。

例
>先程の例で、「IOS XE Release 3.6.xE」というOSを導入することが決まっているのであれば、[Release Notes for Catalyst 3850 Series Switch, Cisco IOS XE Release 3.6.xE](http://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst3850/software/release/3e/release_notes/OL3262101.html#pgfId-918594)を見ます。
>
「Supported Hardware」という項目があります。「WS-C3850-24XU-E」はサポートされていないことが分かります。
>
-----------------------------------------------------------------------
![image](https://qiita-image-store.s3.amazonaws.com/0/105131/33b9b6e9-173f-e19f-7c2d-99d019d39b6b.png)
-----------------------------------------------------------------------



# リリースノートの辿り方

- まず、サポートページから[Product and Technology Support](http://www.cisco.com/cisco/web/psa/default.html?mode=prod&level0=268438038) へ。

例：Cat4500X の対応OSを調べてみる。
>Support Home>ProductsSwitchesCampus>LAN Switches - Core and Distribution とツリーを選択していきます。
>
---------------------------------------------------------------
![image](https://qiita-image-store.s3.amazonaws.com/0/105131/88f1de9f-dd48-f065-d9ab-665c03607644.png)
---------------------------------------------------------------
>
---------------------------------------------------------------
![image](https://qiita-image-store.s3.amazonaws.com/0/105131/3ea53fd3-6d35-9043-6ef4-1a9eb51f305d.png)
---------------------------------------------------------------
>
ここでは「Cisco Catalyst 4500X-24 SFP+ Switch」を選択。
ページ内に「Release Notes」へのリンクがあります。
>
---------------------------------------------------------------
![image](https://qiita-image-store.s3.amazonaws.com/0/105131/43fc07dd-09bb-bc8f-55ce-18c2320d3833.png)
---------------------------------------------------------------
>
>この中から今回はIOS XE 3.6xEを選択。
>
---------------------------------------------------------------
![image](https://qiita-image-store.s3.amazonaws.com/0/105131/f3e2f44f-d56e-44e1-d736-551103845103.png)
---------------------------------------------------------------
>
Cat4500X IOS XE 3.6xEでサポートされるハードウェアが分かりました。
>
---------------------------------------------------------------
![image](https://qiita-image-store.s3.amazonaws.com/0/105131/f8103b3c-9f91-ffa2-6520-169bf9274e75.png)
---------------------------------------------------------------

機器選定のときには気をつけましょう。

以上。
CentOS7 rlwrapのインストール

#rlwrapのインストール

oracleDBを動かすときに、macのターミナルのような方向キー上で履歴を呼び出したり、左右キーでカーソルを動かせるように **rlwrap** をインストールした時のメモです。
方法は簡単。

```
yum -y install rlwrap
```

で終了です...が

**rlwrap** をインストールするために、前提条件である **epel** をインストールしましょう。

下のリンクから **epel-release-6-8.noarch.rpm** を探し、ダウンロード。
wgetを使って直接取るもよし、クライアントでダウンロードしてftpで送るもよしです。

http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/i386/

CentOS7のディレクトリに持ってこれたら、以下のコマンドでインストールします。

```
rpm -ivh epel-release-6-8.noarch.rpm
```

すると、**epelリポジトリ** が使えるようになります。

**epel** を常時利用するかどうか設定したいときは、以下のファイルをいじりましょう。常時なら **1** 、一時的になら **0** に **enable** の値を変えてください。

```
vim /etc/yum.repos.d/epel.repo
```


```
[epel]
...
...
#常時使用
enabled=1

#一時利用
enabled=0
```


一時利用にした場合、yum インストールコマンドの最後に

```
sudo yum -y install <package-name> --enablerepo=epel
```

と書き足せば使えます。

あとは

```
sudo yum -y install rlwrap
```

でインストール終了

oracleユーザーにログインした後、

```
./u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh
rlwrap -pRed sqlplus /nolog
```

でログインすると **SQL >** の文字色が赤く変わっていれば成功です。
ターミナルみたいに方向キーが使える！便利！

##OracleDB環境
CentOS7 
Oracle-xe-11.2.0-1.0.x86_64 

今はoracleDBの勉強をしているので、無料で使える XE を使わせて頂いています。OracleXEはデフォルト設定で port8080 を使うので、Apacheはお休み中です。
ある程度慣れたらOracleDBとApacheを同時に動作させないといけないですね...
Cognos Analytics 11.0.4 新機能一覧

Cognos Analytics 11.0.4が2016年9月にリリースされました。
以下の新機能の概要が、リンク先のサイトにまとまっています。

ダッシュボード：Dashboard
レポート作成：Reporting
JavaScriptサポート：Javascript support
データモデル：Modeling
UIカスタマイズ：Customization
ストーリー：Storytelling
移行：Lifecycle Manager

#Cognos #Analytics 11.0.4 is now available!
https://www.ibm.com/communities/analytics/cognos-analytics-blog/cognos-analytics-11-0-4-is-now-available/

**Cognos Analytics 11.0.5もリリースされました。新機能は以下をご参照下さい。**
http://qiita.com/shinyama/items/a0f764020ce0a42eb555
ターミナルカラー設定メモ


とりあえず個人的にこれをベースにターミナルに合わせて微調整していく感じです

|色名or項目|通常|太字|
|:-:|:-:|:-:|
|黒|45,45,45|0,0,0|
|赤|231,126,126|231,126,126|
|黄色|231,225,154|255,255,128|
|青|128,128,255|70,70,255|
|水色|102,185,217|141,203,226|
|紫|222,116,146|	166,0,166|
|緑|131,224,135|	114,216,132|
|白|212,212,212|	255,255,255|
|文字|212,212,212|255,255,255|
|背景|45,45,45|63,63,63|
|カーソル上文字|0,0,0||
|カーソル色|162,223,169||

参考サイト
[色気のあるターミナルをつくろう](http://d.hatena.ne.jp/shibason/20100902/1283424768)
Keystone 4.0 Betaをinstallし、フロント周りをReact+React-Bootstrapに置き換えてみた[1]

# はじめに

Todoアプリ以外にReactの良い勉強材料はないかと考えいたところ、KeystoneJSがBootstrapだったことを思い出し、generatorで作成した直後のテンプレートをReact-Bootstrapに置き換えてみることにしました。

今回はTOPのみ、レイアウト部分も省きます。

# 環境

Mac
Node.js v7.0.0
npm 3.10.8
generator-keystone@0.4.2
mongod --version 3.0.6 #brewでinstallしてます

# 前提
generator-keystoneを使ってkeystoneをinstallし起動済みである状態からはじめます。
またwebpackを利用します。

# npm

```
npm install --save react react-dom react-tap-event-plugin react-bootstrap
npm install --save-dev babel-loader babel-preset-es2015 babel-preset-react bootstrap-sass css-loader file-loader node-sass sass-loader style-loader webpack
```

# ディレクトリ追加と構造

publicをコピーしたsrcディレクトリを作成し、ここで開発したjsやsassをビルドすることにしました。

my-site/
├ models
├ node_modules
├ public (srcからビルドしたものを展開する）
├ routes
├ templates
├ updates
├ src(publicをコピーして新規作成)
│
└ （他各種設定ファイル)

# webpack

```
module.exports = [{
  entry: {
    index: './src/js/index.js',
//    test: './src/js/test.js',
  },
  output: {
    path: 'public/js/',
    publicPath: '/js/',
    filename: '[name].js'
  },
  module: {
    loaders: [
      {
        test: /\.js$/,
        loader: 'babel-loader',
        query: {
          presets: ['es2015', 'react']
        }
      },
      {
         test: /\.woff2?$|\.ttf$|\.eot$|\.svg$/,
         loader: 'file'
       },
      {test: /\.scss$/i, loaders: ['style', 'css', 'sass']}
    ]
  },
}];
```

# templates編集

## templates/layouts/default.jade

以下はindex.js経由で読まれるのでコメントアウト
`link(href="/styles/site.css", rel="stylesheet")`
`script(src='/js/jquery/jquery-1.11.3.min.js')`
`script(src='/js/bootstrap/bootstrap-3.3.5.min.js')`

今回は若干サボってlayout部分はreact化せずに済ませてしまう。

## templates/views/index.jade
ごっそり削除して以下だけにしました。

```
extends ../layouts/default

block content
		#root
		script(src='/js/index.js')
```

## src/js/index.js

略の部分が一番大変なのですが、単純作業なので。。。

```
require('../styles/site.scss');
import React from 'react';
import { Button } from 'react-bootstrap';
import { render } from 'react-dom';

class App extends React.Component {
    render() {
        return <div>
          (略)
        </div>;
    }
}
render(<App />, document.querySelector('#root'));
```


# 課題・次回
次回はレイアウトやtop以外も作業してみようと思います。
フォントやsvgが　public/jsに出力されてしまうので、webpackの設定を見直したい。
JavaScriptをES6で書く環境を作る（Windows + WebStorm + Babel 編）

WebStormでES6仕様で記述したJavaScriptファイルを作成した際、
>
File watcher 'Babel' is available for this file. Description: 'Transpiles ECMAScript 6 code to ECMAScript 5'
![warning.png](https://qiita-image-store.s3.amazonaws.com/0/115750/c2d0367c-f69a-bbf1-a34b-58e043189c43.png)

などと表示された場合の、Windows環境での対応です。

Mac環境では[hkusu](http://qiita.com/hkusu)さんが
[ES6 で書く環境を作る（WebStorm + Babel 編）](http://qiita.com/hkusu/items/e6ae07277356d0bbe2d7)
で書かれてますのでそちらを。

Windowsでもほとんどかわりませんが一応メモとして残します。

#前提環境
>
OS：Windows7
Babel：6.5.2
WebStorm：2016.2.1
npm：3.10.3

#手順
Babel(cli)をグローバルインストール
`npm install babel-cli -g`

WebStormのメニューバーから[File]-[Settings...]を選択。

表示されたダイアログの左側部分で[Tools]-[File Watchers]を選択し、ダイアログ右上の「＋」ボタンを押して[Babel]を選択。
![file_watcher.png](https://qiita-image-store.s3.amazonaws.com/0/115750/ff57fd32-7d99-ba86-2778-9123fd3d8432.png)

さらに表示されたダイアログで、私の場合はそのままで[OK]ボタンを押して完了でした。
![new_file_watcher.png](https://qiita-image-store.s3.amazonaws.com/0/115750/2309ae32-8f10-e423-035d-90257d098c19.png)

[Program]の部分が指定されていなければ、
`C:\Users\[ユーザ名]\AppData\Roaming\npm\babel.cmd`
を指定すればよいと思います。
rubyの例外処理が遅かった？はなし

例外処理は好きかーーーーーー！？

gemなどのライブラリを作っているとユーザとの対話的な役割として例外を使ったりするので調べてたら例外は重いなどの情報が出てきたのでここに記るします。

四の五の言わずにコードで計測してみます。


## 計測結果

```ruby:if_pattern.rb
get_value = -> val { val.odd? ? val : nil}

def judge val
  if val.nil?
  else
  end
end

require 'benchmark'
result = Benchmark.realtime do |b|
  (1..100000).each do |i|
    judge get_value.(i)
  end
end

p "#{result}秒"
```

![スクリーンショット 2016-11-01 15.37.49.png](https://qiita-image-store.s3.amazonaws.com/0/35451/679f6a51-1e1b-cb20-fe33-2abaf7de73bf.png)

```ruby:excaption_pattern.rb
get_value = -> val { val.odd? ? val : nil}

def judge val
  if val.nil?
    raise StandardExcaption
  end
rescue
end

require 'benchmark'
result = Benchmark.realtime do |b|
  (1..100000).each do |i|
    judge get_value.(i)
  end
end

p "#{result}秒"
```

![スクリーンショット 2016-11-01 15.39.25.png](https://qiita-image-store.s3.amazonaws.com/0/35451/d5b1399e-dc53-1e1c-6a89-f4304f639888.png)

## 結論

単純なifに比べて20倍くらい実行にかかっている。
まあ例外クラス作ったりしてるから当然なんだろうけれど、これで条件分岐のために例外投げてごにょごにょしようとは思わなくなりました。
あと今回の例ではlambdaを使ってますが、これをクラス化してget_valueメソッドを定義して呼び出した場合は更に実行に時間がかかりました。
おそらく例外処理の中でスタックトレースを作成する処理があるので、クラス化する分その処理が増えて実行に時間がかかるのだと思われます。