OmniAICreator/Qiita-1.07M huggingface dataset:
Lightningアプリケーションを作る価値はあるかどうか

# tl;dr

コンポーネントですべてやった方が良いです。
（しばらくLightningをいじった方は皆さんそういう結論だろうなとは思うのですが、そのような記事が見当たらなかったので書いておきます）

# はじめに

Lightningではコンポーネントとアプリケーションが作れます。コンポーネントも別のコンポーネントを入れ子にすることができますし、どちらも良く似ているように見えますが、微妙にできることが違います。

その中で最も重要なのは、[Salesforce1にLightningタブを追加する](http://qiita.com/a_kuratani/items/78777ad8d182307eb102)にある件で、Salesforce1タブに追加するにはLightningコンポーネントである必要があります。

# コンポーネントのラップ

コンポーネントをアプリケーションにするには、下記の様に1つラップすれば済むことです。
PCでのプレビュー用に、このようなアプリケーションは1つ作っておくと良いでしょう。

```xml:YourPreviewApp.app
<aura:application>
    <yournamespace:YourWorkingComponent />
    <!--
    <yournamespace:YourAnotherDemoComponent />
    <yournamespace:YourAnotherDemo2Component />
    -->
</aura:application>
```

```xml:YourWorkingComponent.cmp
<aura:component implements="force:appHostable">
    <!-- your code goes here -->  
</aura:component>
```

逆に、一度アプリケーションで作ったものを、やはりSalesforce1に入れたくなったり、別のアプリケーションの中に入れたくなった時、コンポーネントに入れ込む作業はかなり大変です。

# 願望

思うに、ユーザーはアプリケーションを作れる必要はなくて、開発者コンソールでappHostableのコンポーネントを開いた時にPreviewボタンが出ていて、システムが用意したPreview.appで当該コンポーネントを開くようになっていれば良いようにも思います。

ファイルを開く画面でも、appHostableかどうかの色分けがなされていたりするとわかりやすそうです。今のバージョンではアプリケーションとコンポーネントの違いもわからないので、今後のバージョンアップでそういう風になると良いなーと思います。
NAOqi Python 開発環境の確認


## はじめに

* [NAOqi C++ 開発環境のインストール(OS X 環境)](http://qiita.com/Suna/items/153a69bbc71e0d029490)
* [NAOqi C++ 開発環境の動作確認](http://qiita.com/Suna/items/e8c694253f8c01b817c0)

続きです。とりあえず、Pepper 実機へ接続する確認をまだしていなかったので試してみました。
今までは興味から C++ で試していましたが、今回は手軽な Python にしてみました。

## Pepper 実機で実行

### 実行4 (失敗)

自分の PC から API で Pepper に接続して実行します。

```hello.py
#!/usr/bin/python

from naoqi import ALProxy

tts = ALProxy("ALTextToSpeech", "192.168.3.58", 9559)
tts.say("Hello")
```

```bash
$ ./hello.py
[INFO ] Starting ALNetwork
[INFO ] NAOqi is listening on 127.0.0.1:54010
Traceback (most recent call last):
  File "./hello.py", line 5, in <module>
    tts = ALProxy("ALTextToSpeech", "192.168.3.58", 9559)
  File "/path/to/pynaoqi-python-2.7-naoqi-1.14-mac64/naoqi.py", line 282, in __init__
    inaoqi.proxy.__init__(self, args[0], args[1], args[2])
  File "/path/to/pynaoqi-python-2.7-naoqi-1.14-mac64/inaoqi.py", line 276, in __init__
    this = _inaoqi.new_proxy(*args)
RuntimeError:   ALNetwork::getModuleByName
        failed to get module ALTextToSpeech http://192.168.3.58:9559
```

エラーでした。

Pepper 側のログにはこんなのが出ていたようなので、接続はしたけど「failed to get module ALTextToSpeech」なのでしょう。

```bash
Pepper102 [0] /var/log/naoqi $ tail -f tail-naoqi.log
[W] 1419836877.127194 3839 qimessaging.transportsocket: Incorrect magic from 192.168.3.4, disconnecting (expected 1118690882, got 1414745936).
```

### 実行5 (成功)

自分の PC から SSH で Pepper に接続し、Pepper 内で API を実行します。

```bash
$ ssh nao@192.168.3.58
Password:

Pepper102 [0] ~ $ python
Python 2.7.3 (default, Jun 13 2014, 15:08:05)
[GCC 4.5.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import naoqi
>>> from naoqi import ALProxy
```

まずは localhost 指定で実行してみます。

```bash
>>> tts = ALProxy("ALTextToSpeech", "localhost", 9559)
[I] 7615 qi.eventloop: Creating event loop while no qi::Application() is running
[I] 7615 qimessaging.session: Session listener created on tcp://0.0.0.0:0
[I] 7615 qimessaging.transportserver: TransportServer will listen on: tcp://127.0.0.1:42881
[I] 7615 qimessaging.transportserver: TransportServer will listen on: tcp://198.18.0.1:42881
[I] 7615 qimessaging.transportserver: TransportServer will listen on: tcp://192.168.3.58:42881
>>> tts.say("Hello")
```

Pepper が「Hello」と言いました。

続けて IP アドレス指定で実行してみます。

```bash
>>> tts = ALProxy("ALTextToSpeech", "192.168.3.58", 9559)
[I] 7994 qimessaging.session: Session listener created on tcp://0.0.0.0:0
[I] 7994 qimessaging.transportserver: TransportServer will listen on: tcp://127.0.0.1:43065
[I] 7994 qimessaging.transportserver: TransportServer will listen on: tcp://198.18.0.1:43065
[I] 7994 qimessaging.transportserver: TransportServer will listen on: tcp://192.168.3.58:43065
>>> tts.say("Hello")
```

Pepper が「Hello」と言いました。

## 感想

* 実行4 の失敗の理由がわかる方、ぜひ教えてください。
OSXでも新しいSSHを使いたい


Yosemiteのデフォルトのsshのバージョンは `OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011` らしい。

別にそのままでもいいんだけど、なんか古いしECDSAな鍵が作れなかったりしてイラッとしたのでhomebrewで新しいのを入れることにしたのでそのメモ。

### 前提

homebrewがインストールされていること
ansibleがインストールされていること

### opensshのインストール

```yaml:install-openssh.yml
- hosts: localhost

  tasks:

  - name: add homebrew repositories
    homebrew_tap: tap={{ item }} state=present
    with_items:
    - homebrew/dupes

  - name: install openssh package
    homebrew: name=openssh state=latest
              install_options=with-brewed-openssl,with-keychain-support
```

```sh
ansible-playbook install-openssh.yml -i localhost, -c local
```

### opensshをリスタート
```yaml:restart-openssh.yml
- hosts: localhost
  sudo: yes

  tasks:

  - name: stop sshd daemon
    command: launchctl unload -w /System/Library/LaunchDaemons/ssh.plist

  - name: modify plist to use brewed sshd
    replace: dest=/System/Library/LaunchDaemons/ssh.plist
             regexp='(/usr/libexec/sshd-keygen-wrapper|/usr/sbin/sshd)'
             replace='/usr/local/sbin/sshd'
             backup=yes

  - name: start sshd daemon
    command: launchctl load -w /System/Library/LaunchDaemons/ssh.plist

  - name: stop ssh-agent
    command: launchctl unload -w /System/Library/LaunchAgents/org.openbsd.ssh-agent.plist

  - name: modify plist to use brewed ssh-agent
    replace: dest=/System/Library/LaunchAgents/org.openbsd.ssh-agent.plist
             regexp='/usr/bin/ssh-agent'
             replace='/usr/local/bin/ssh-agent'
             backup=yes

  - name: start ssh-agent
    command: launchctl load -w /System/Library/LaunchAgents/org.openbsd.ssh-agent.plist
```

```sh
ansible-playbook restart-openssh.yml -i localhost, -c local -K
```

こっちは`sudo`してやる必要あり。

### 確認

バージョンを見てみる

```sh
telnet localhost 22 # -> SSH-2.0-OpenSSH_6.6

ssh -V # -> OpenSSH_6.6p1, OpenSSL 1.0.1j 15 Oct 2014
```

ECDSA鍵作れるかな？

```sh
ssh-keygen -t ecdsa -b 521
```
WordPress関係のURLまとめ（自分用）

# Slack関連
- 日本(WordSlack) https://wpja.slack.com/ （[説明](http://wpdocs.sourceforge.jp/WordPress%E6%97%A5%E6%9C%AC%E8%AA%9E%22%E9%9D%9E%E5%85%AC%E5%BC%8F%22Slack%E3%81%AE%E5%8F%82%E5%8A%A0%E6%96%B9%E6%B3%95)）
- 本家 https://wordpress.slack.com/ （[説明](https://make.wordpress.org/chat/)）

#貢献ミーティング関連
- WordPress日本語やれることリスト
https://docs.google.com/spreadsheets/d/13TBnA5GdJHnqIiUbb_oX-wpzn3egYTSCGuUYSYu_B9U/edit#gid=0

# WordPress.tv関連
- 字幕まとめシート　https://docs.google.com/spreadsheets/d/1Q4o9pqVqU2souin2IMELTWkXn9iwwsbQigrjjWuW2ms/edit#gid=0
- ホーム　http://wordpress.tv/
- amara　http://amara.org/ja/profiles/videos/haya2_/

# 翻訳関連
- 訳語のガイドライン　https://translate.wordpress.org/projects/wp/dev/ja/default/glossary
- 揺らぎ対策本部（古い？）　http://wpdocs.sourceforge.jp/Codex:%E6%8F%BA%E3%82%89%E3%81%8E%E5%AF%BE%E7%AD%96%E6%9C%AC%E9%83%A8

# WordPress
- 日本　https://ja.wordpress.org/
- 英語　https://wordpress.org/

# GitHub
- 日本語作成チーム　https://github.com/jawordpressorg

# Google Group
- 日本語版作成チーム　https://groups.google.com/forum/#!forum/wp-ja-pkg
Android StudioでGradleの同期？に失敗する


**Android Studioのバージョンアップすると発生した**
>Gradle project sync failed. Basic functionality (e.g. editing, debugging) will not work properly.

エラーが出て気持ち悪いので頑張って対処してみる。

発生したAndroid Studioのバージョンは1.0.1で、
その後バージョンを1.0.2にアップデートしても変わりなし。



[ここ](http://stackoverflow.com/questions/21066598/android-studio-0-4-2-gradle-project-sync-failed-error)のサイトを参考した。

##Gradleのフォルダを消し飛ばしてみる

1. <strong>[File] > [Invalidate caches/Restart]</strong> で <strong>[invalidate]（無効にする）</strong>を選択する
2. Android Studioを終了する
3. Userのホームディレクトリにある.gradleフォルダを削除or名前の変更する
4. Android Studioを起動する

**まだエラーを吐く・・・。**
ユーザーのホームディレクトリに見に行くと、ちゃんと.gradleフォルダが作成されてる・・・。

##ん？よく見たら下にエラー文が
```compile sdk version android-21 requires compiling with jdk 7```
**-JDK 7が必要-**

あちゃー。
JDK 7を早速インストールしてAndroid起動。
<strong>[Configure] -> [Project Default] -> [Project Structure]</strong>を選択。
**JDK Location**のパスを変更する。
先ほどインストールした1.7.0を指定しようも、何故か違うところにインストールされている。

[いろいろ調べてみると](http://qiita.com/ryo0301/items/3c9a02e03b4e9a41f576)6まではAppleが提供してたらしく、7からはAppleは提供していないらしい。

7以降はこのパス( /Library/Java/JavaVirtualMachines/ )に保存されるはずなので
**JDK Location**のパスを```/Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home```を指定する。

##無事解決！
**3時間もなにやってるんだ俺・・・orz**
iTunes Connectで公開するStoreが設定できないことがある

#はじめに
いつ直るのかはっきりしないので備忘録的に残しておきます。

2015/01/22 直ったようです。12月の上旬に問い合わせた内容に回答がありました。
　この件はClose。
　SNSで報告後、すぐ対処方法を回答をくださった方には感謝しております。

#バグですよね
![スクリーンショット 2014-12-29 23.17.34.png](https://qiita-image-store.s3.amazonaws.com/0/12362/ed4eb561-1b3d-13e8-476b-eb98cd640f6c.png)

#対処

システム環境設定の`言語と地域`を選ぶ
![スクリーンショット 2014-12-29 23.26.58.png](https://qiita-image-store.s3.amazonaws.com/0/12362/f216cc73-4200-7ae9-9ae5-c3398d192771.png)

↓

優先する言語を英語にします

![スクリーンショット 2014-12-29 23.30.14.png](https://qiita-image-store.s3.amazonaws.com/0/12362/ab4b5ef9-7614-0c65-fd4f-9a774a0099c0.png)

Safariを一度終了し、立ち上げ直します。
`Macの再起動は不要`

iTunes Connectを表示

![スクリーンショット 2014-12-29 23.28.12.png](https://qiita-image-store.s3.amazonaws.com/0/12362/1114afea-59f7-6663-a88c-89b213a8ebbf.png)

↓

国が選択できる状態になっているので該当国を設定して、必要であればシステム環境設定の`言語と地域`から最優先の言語を日本語に戻す


![スクリーンショット 2014-12-29 23.36.18.png](https://qiita-image-store.s3.amazonaws.com/0/12362/d8f89f40-b153-6d5e-1cee-21eb32f58ac5.png)

#さいごに
SNSの開発者コミュニティをチェックしていると対処を書いてくださっているのを見つけることができると思います。
menuconfig で kernel config の設定項目を検索する

# 背景

Kernel config の設定項目探すの大変ですよね。

# 手順

menuconfig した後、 `/` を入力すると、

![Screenshot_from_2014-09-29 21:53:37.png](https://qiita-image-store.s3.amazonaws.com/0/35514/fbfd3683-14af-f3a8-752a-c9a44acbfa17.png)

こんな画面になる。
例えば wget を追加したいとして、 wget と入力し enter.

![Screenshot_from_2014-09-29 21:53:15.png](https://qiita-image-store.s3.amazonaws.com/0/35514/ee85f1d0-365a-2875-c162-6b0e65f87f4b.png)

設定項目までの PATH が表示される。
後は元に戻って表示された PATH 通りに辿り有効化すれば OK.

# 実は

頭にちゃんと `</> for Sarch` って書いてある。。Orz

![Screenshot_from_2014-06-29_21_30_58.png](https://qiita-image-store.s3.amazonaws.com/0/35514/d14041d5-aec9-08b1-b614-9895a81154e5.png)

# 参考

This file contains some assistance for using "make *config".
https://www.kernel.org/doc/Documentation/kbuild/kconfig.txt
javascriptで文字列を数値に変換する簡単な方法

文字列から数値への変換は
parseInt()等を使っても出来ますが
もっと簡単に出来ます。
その方法は値の前にプラスを付けるだけです。

```js
var numberValue = 3;
var strValue = '4';

var a = +numberValue; // a is number
var b = +strValue;    // b is number
```

ちょー楽ちん。
SpringでRSpecが実行できなくなった


`spring`経由で実行すると以下の様なエラーが出てしまった。

```bash:コマンド
$ spring rspec spec
/Users/uchiko/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/rspec-rails-3.1.0/lib/rspec/rails/matchers.rb:15:in `rescue in <top (required)>': Test is not a module (TypeError)
```

`spring stop`してみても直らない。
`spring`を経由しなければエラーは起こらない。

原因は、railsのTask機能を確認するために、
以下の内容のファイルを作っていたからだった。

```ruby:lib/tasks/test.rb
class Test
  def self.hoge
    puts 'hoge'
  end
end
```

springを実行した時、
Railsアプリ全体が読み込まれて`Test`クラスが定義されてしまった後、
`rspec-rails`で`Test`モジュールを定義しようとしてエラーが出ていた。

`lib/tasks/test.rb`を消したら直った。
javascriptで引数が無い場合のデフォルト値を設定する

javascriptの論理演算子が値そのものを返す特性を使います。

```js
function hoge(v) {
  v = v || 'default value';
  // ...
}
```
引数vに値が入っている場合はそのまま。
値が無い場合は'default value'がセットされます。

if文や三項演算子を使うより
スッキリ見やすく書けます。

----
いくつかコメントをうけての追記です。
||を使った方法はあくまでテクニックなので万能ではないです。
いただいたコメントをまとめると
このテクニックを使う条件はこんな感じ。

- 決まった型の引数を取り、それを初期化する
- 複数の引数をとる

例

```js
function hoge(v, w) {// v: string, w: number
  v = v || '';
  w = w || 0;
  // ...
}
```

上記の例で引数の方が何でもアリの場合
型が変わってしまうからダメ
例

```js
hoge(0, false); // v = '', w = 0
```

引数が1つの場合、argumentsで判定した方が良い

```js
function hoge(v) {
  if (arguments.length < 1) v = '';
  // ...
}
```
Nginx + ELB(Elastic Load Balancing)でサービスをソーリーページ(メンテナンスモード)に切り替える

# はじめに
Nginx、ELBに関して説明は端折りますが、概要を知りたい方は以下が参考になるかと思います。

- Nginx
  * [高速・軽量・高機能……Nginxの基礎知識 ](http://www.atmarkit.co.jp/ait/articles/1406/17/news013.html)
  * [Nginxのインストールと基本設定](http://www.atmarkit.co.jp/ait/articles/1407/24/news003.html)

- ELB
  * [[AWSマイスターシリーズ]Amazon Elastic Load Balancing (ELB)](http://www.slideshare.net/AmazonWebServicesJapan/20130612-aws-meisterregenerateelbpublic)

# 本記事の前提条件
* ELB + EC2(WEB/AP)の構成を組んでいること
* Nginxをインストール済のEC2インスタンス (ソーリーサーバ用)が用意してあること


# Nginxのコンフィグ設定
色々と試行錯誤して以下に落ち着きました

```serverディレクティブ抜粋
server {
  listen 80;
  root /var/www;

  location = /healthcheck {
    empty_gif;
    access_log off;
    break;
  }

  # ELBからのhealthcheckは通す
  set $sorry true;
  if ($request_uri = "/healthcheck") {
    set $sorry false;
  }

  error_page 503 @sorry;
  location @sorry {
    rewrite ^(.*)$ /sorry.html break;
  }

  if ($sorry = true) {
    return 503;
  }
}
```

※ ドキュメントルート、URIの部分は適宜読み替えてください

# 実施

### Nginxを起動(もしくはリロード)する
```bash
$ sudo service nginx start
OR
$ sudo service nginx reload
```

### ELBの付け替えをする
これを...
![sorryserver_before.png](https://qiita-image-store.s3.amazonaws.com/1805/13534/0b85f4f8-cfa4-f777-73f2-2d6e2c460853.png "sorryserver_before.png")

こうします
![sorryserver_after.png](https://qiita-image-store.s3.amazonaws.com/1805/13534/fbb5a343-4dcf-1f57-662b-7835e73879a9.png "sorryserver_after.png")

この時の注意点なのですが、ELBは切り替え後サービスインするまでに数分かかるので、以下の順序で実施するとよいでしょう。

1. SorryサーバをELBにぶら下げる
2. Sorryサーバのステータスが **Out of Service** -> **In Sercice** になることを確認する
3. WEB/APサーバをELBからはずす

これでどのURLを叩かれてもソーリーページが開き、HTTPのステータスコードも **503** で返るはずです。

付け替えの方法は、 **マネジメントコンソール** OR **CLI** OR **SDK**のいずれかになるかと思います。マネジメントコンソールからの操作は以下の動画が参考になるかと思います。

[Introduction to Elastic Load Balancing](https://www.youtube.com/watch?v=oEcEqN8PeeI)

マネジメントコンソールは便利なのですが、手続きが少し多いので、ヒューマンエラーを減らすためにもできるだけCLIやSDKを利用してコマンド一発で切り替えられるようにしておきたいですね。(ChatOpsを取り入れている会社であればBOTにお願いするのが今風かもですね:+1:)

# さいごに
### S3のWebホスティング利用して、Route53で切り替えじゃダメなの?
個人的にはステータスコードを`503`で返したいのでナシですが、ステータスコードが`200`で返っても問題ないのであればアリだと思います。その場合は以下のクラスメソッドさんの記事が参考になるかと思います。

[Amazon Route 53のDNSフェイルオーバー機能を利用したリージョンを跨いだバックアップサイトの構築（EC2 to S3編）]
(http://dev.classmethod.jp/cloud/route-53-dns-failover-s3/)
自己解凍式バイナリの作り方

# 自己解凍式のバイナリって？
身近な例で言うとオラクルがJAVAの配布使ってるような `foobar.bin`というような`.bin`サフィックスの付いているパッケージングされた実行ファイルのことです。伝統的な`./configure && make && make install`式のtarball形式のパッケージとは違って一つの実行ファイルの中にインストールスクリプトとインストールするデータを含めることができです。

## 利点
- ワンクリックで実行可能。
- いちいち`tar xf`で解凍とか`./configure`を実行しなくていい。
- 設定ファイル(`.vimrc`など)等のリソースファイルをそのまま実行ファイルの中に埋め込める。

# 仕組み
仕組みは至って単純で、リソースファイルをアーカイブしたものの先頭にインストールスクリプトは結合させて一つにまとめただけです。
![341ucvdas1daffdas.png](https://qiita-image-store.s3.amazonaws.com/0/41724/7290c6b8-cf13-aeea-00a3-6b0da029f442.png)

# 作り方
1. リソースファイルをtarコマンドでアーカイブする。
2. お好みの圧縮コマンドで圧縮(`gzip`等)
3. リソースファイルの名前は(仮に`resource.tgz`としておく)
4. 以下のスクリプトを用意する

~~~bash
#! /bin/bash -x
DESTINATION= ##{インストール場所}##
ENDLINE=$(grep --line-number --text "^##ENDLINE$" $0 | sed 's/:.*//') 
tail --lines=+$(($ENDLINE + 1)) $0 \
| gzip --decompress --to-stdout    \
| tar --extract --directory $DESTINATION

########## INSTALL_PROCESS ##########
## ln -sやcpでリソースファイルを設置する.
## リソースファイルは$DESTINATIONに格納されています。
#####################################

exit
##ENDLINE
~~~

5. これを`INSTALL.sh`として`cat`でリソースファイルと連結する。

```bash
cat INSTALL.sh resource.tgz > package.bin
```

6. 完成！！

# 活用例
- 友人にいちいちビルド手順を説明しなくても実行ファイルを渡して実行してもらえば自動的にインストールできる！！
- 自作ライブラリのポータブルなインストール方法としてクロスプラットフォームな手段になる？
- ちなみに自分は*nixをインストールしては壊して、またインストールしたりするのが趣味なので設定ファイル等の設置を効率化するために定期的にこの実行ファイルを作って保存しています。
Hackintoshな夢を見る方法

今回はOSX10.9を使いました。
使ったファイルをまとめておいておきます。
http://ux.getuploader.com/Hackintosh/

参考にしたのは
http://hacklifeinfo.com/hackintosh-yosemite-install/
http://www.atsuhiro-me.net/apple/hackintosh/dell13z


PCの構成は、
マザーボード ASRock B75M R2.0
CPU Celeron
メモリは 2G*2
HDDは適当

まずはApp StoreからMavericksをDL。
DL完了後、ウィンドウを閉じると、Applicationsフォルダに入ってます。

UnibeastをDLして、起動します。
この時、Unibeast最新版だと、システム言語を英語にしないと起動できません。注意しましょう。
（自分はMavericksを入れたかったので、3.0.1verを使いました。このverだと日本語で出来ます。欲しい人は個人的に連絡くれればあるかも。）

USBができたら、windowsPCにつなぎ、USBからブートできるようにBIOSで設定をし、起動します。
USBの名前を選択し、インストールを開始。画面にしたがってインストール。
インストールが終わったら、もう一度USBからブート起動し、今度は**インストールしたHDD**を選択します。
設定画面にしたがってインストールを終わらせるとデスクトップが現れます。
（このときAppleIDは入力しないこと）
左上の、リンゴマーク→システム環境設定→セキュリティとプライバシーの一般タブから、ダウンロードしたアプリケーションの実行許可で、全てのアプリケーションを許可します。
（先に左下の鍵マーク開けてね）

次にMultiBeastを起動します。
設定項目は以下の画像のとおりです。
![スクリーンショット 2014-12-29 21.29.34.png](https://qiita-image-store.s3.amazonaws.com/0/43598/badd3bd1-bca1-837b-1dc2-876e700dd383.png)

これをインストール後、再起動。
（ここまではusbからブートです）

ここまでうまくいったら、Time Machineでバックアップを取ることをおすすめします。

次に、hdd起動できるようにします。
PCをシャットダウン後、USBから最初に使ったインストーラーを起動します。
ディスクユーティリティで、HDDをマウント解除した後、
ターミナルを起動します。

`diskutil list`
でインストールしたHDDのdisk identifierを控えます。

次に
`cd /volumes/(ここはUSBの名前)/Chimera\ 4.0.1/chimeraV40/usr/standalone/i386`

`dd if=boot1h of=/dev/disk0s2`（ここは先の控えた物）
disk0s2は先ほど調べた自分の情報と差し替え


バックスラッシュの打ち方は、option＋¥
windowsキーボードを使っている場合、=は"＾"キー("="の隣)になります。

これで、HDDから起動することが出来ます。

このままだと音がでないので、kextをインストールします。
一番上のURLから、Kext Wizard.zipとkextファイル.zipをDLします。
解凍して、Kext Wizardを実行。
ターゲットを下から選び、installationタブの真ん中に、kextファイルの中にある、.kextとつくものを、ドラッグ＆ドロップします。

![スクリーンショット_2014-12-29_21_54_57.png](https://qiita-image-store.s3.amazonaws.com/0/43598/cc29a90a-11b6-0a00-1e86-4487e818381e.png)
PCを再起動すれば、音が出るようになるはずです。



今回ハマったところは、
Multibeastの設定項目と、hdd起動のところ。
Chimera 4.0.1だと、参考記事とフォルダ構成が違います。要注意。
Rubyのハッシュ記法は混ぜて書ける

Ruby 1.9 以降だと，キーがシンボルであるハッシュリテラルは

```rb
{foo: 3, bar: 4} #=> {:foo=>3, :bar=>4}
```

という書き方ができるよね。

## ラベルに数字とかスペースとかどーよ？

でも，この記法は，〈識別子に使えない形式〉のラベルを認めていない。

```
{foo: 3, bar: 4, 3D: 5} #=> syntax error
```

アンダースコア `_` 以外の記号や数字などで始まっていたり，スペースを含むようなラベルは使えないんだよね。

じゃあ上の例で，`3D` が入ってくることによって，全体を

```rb
{:foo=>3, :bar=>4, :"3D"=>5}
```

と書き替えなければならないかというと，そうでもなく，記法を混ぜることができるので，

```rb
{foo: 3, bar: 4, :"3D" => 5} #=> {:foo=>3, :bar=>4, :"3D"=>5}
```

のような書き方ができる。（気持ち悪いという人もいるだろうけどな）

## Ruby 2.2 では

Ruby 2.2 で，ハッシュリテラルの記法が少し拡張された。

こんなふうに書けるゾ！

```rb
{foo: 3, bar: 4, "3D": 5}
```

つまり，ダブルクオートで囲ってさえやれば，コロン記法でいけるってこと。

## 漢字とか？

ちなみに，変数名やメソッド名などと同じく，ハッシュリテラルのラベルにも漢字とか仮名とかが使える。

```rb
{朝: 3, 暮: 4} #=> {:朝=>3, :暮=>4}
```
DebianのOpenLDAPでSSLv3を無効にする

数カ月前にSSLv3のPOODLE脆弱性が話題になりましたが、その時にLDAPサーバのSSL設定について対処をした際の話です。ネットで検索すると、"TLSProtocolMin" を設定する方法が出てくるんですが、実はその方法は「SSLライブラリにOpenSSLを使っている場合」に使える方法で、「SSLライブラリにGnuTLSを使っている場合」には使えません。

ちなみにOpenSSLとGnuTLSの違いについてですが、OpenSSLのライセンスはGPL互換ではなく、GPLのソフトウェアにはOpenSSLを使えなかったために開発されたのがGnuTLS、ってことらしいです。

ともあれ、Debianの公式パッケージで提供されるOpenLDAP(slapd)はGnuTLSを使っており、"TLSProtocolMin" を設定する方法ではSSLv3を無効にできません。

GnuTLSの場合、設定すべき項目は "TLSCipherSuite" です。この項目に ":-VERS-SSL3.0" を付加すればよいです。slapd.confを変更後はslapdを再起動します。

設定例：

```text:/etc/openldap/slapd.conf
TLSCipherSuite: SECURE256:-VERS-SSL3.0
```

あるいは、on-line configuration (OLC)を使用している場合、下記内容のLDIFファイルをインポートします。

```text
dn: cn=config
changetype: modify
add: olcTLSCipherSuite
olcTLSCipherSuite: SECURE256:-VERS-SSL3.0
```

これでSSLv3が無効になります。

※参考1 → http://myatus.com/p/quick-note-disable-sslv3-openldap-gnutls/
※参考2 → http://www.gnutls.org/security.html
Git でバイナリファイルを扱うときの私的設定

Git でバイナリファイルをリポジトリに含めるときの設定。

# <i class="fa fa-check-square"></i> その 1: autocrlf

```shell-session
$ git config --global core.autocrlf false
```

Git の改行コード自動変換によりファイルを壊されないようにする。


#  <i class="fa fa-check-square"></i> その 2: diff とらない

`.gitattributes` ファイルで特定の拡張子をもつファイルについて、 `git diff` などで diff をとらないように設定する。

```
*.xls -diff
```

ここで、 `-text` オプションを合わせて設定すると、その 1 で紹介した autocrlf と同じ効果を発揮する。

```
*.xls -diff -text
```

#  <i class="fa fa-check-square"></i> その 3: binary マクロ

その 2 で紹介した `-diff -text` と同じ効果を発揮する `binary` マクロがあり、こちらのほうがバイナリファイルであることが分かりやすいので、こちらを使う。

```
*.accdb binary
```

# <i class="fa fa-pencil-square"></i> まとめ

+ `autocrlf` を `false` に
+ `.gitattributes` ファイルで `binary` を設定

# <i class="fa fa-info-circle"></i> 参考

+ https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
+ https://help.github.com/articles/dealing-with-line-endings/
brew cask alfred linkが失敗するときのAlfredの設定

## 問題
```
$ brew cask alfred link
```
を実行すると下記エラーが出た。

```
==> The domain/default pair of (/Users/~/Library/Preferences/com.runningwithcrayons.Alfred-Preferences, syncfolder) does not exist
Error: Alfred 2.4+ detected, but local preferences file not found. Try running Alfred first.
```

そこで、Alfredの設定を調整することでエラーを回避する。

## 解決方法
alfredの設定画面 > Features > Default Results > Search Scope > +ボタンをクリック > command+shift+G > /opt/homebrew-cask/Caskroom/ を追加

## 参考
[Alfred と brew cask が壊れた](http://qiita.com/DriftwoodJP/items/4d4c7784513173a55ee2)
clojure.core.matrixのお試しサンプル

project.cljに以下を追加して

```
[net.mikera/core.matrix "0.32.1"]
```

試してみる

```sample.clj
(ns matrix.sample
  (:require [clojure.core.matrix :as m]
            [clojure.core.matrix.operators :as o]))

(m/identity-matrix 3)

(o/+ [1 2] [3 4])
(o/* [1 2] 8)

(o/** [[2 3] [4 5]] [2 3])
```

```:結果
[[1.0 0.0 0.0] [0.0 1.0 0.0] [0.0 0.0 1.0]]
[4 6]
[8 16]
[[4.0 27.0] [16.0 125.0]]
```

Rみたいに要素同士での足し算掛け算できた。

```sample.clj
(def a [[1 2] [3 4]])
(def b [[1 0] [0 2]])
(o/* a b)
(m/mmul a b)
```

```:結果
[[1 0] [0 8]]
[[1 4] [3 8]]
```

`*`だと要素同士、`mmul`だと行列の掛け算になった。

```sample.clj
(def c [[:a "ABC" 2] [:b "XYZ" 4] [:c nil 7]])
(m/select c 1)
(m/select c 2 2)
(m/select c :all 1)
(m/select c :all [1 2])
```

```:結果
[:b "XYZ" 4]
7
["ABC" "XYZ" nil]
#<NDWrapper [["ABC" 2] ["XYZ" 4] [nil 7]]>
```

`select`で行や列をとってこれた。`:all`指定すると全行や全列になる。

```sample.clj
(def d (m/diagonal-matrix [1 2]))
(def e (m/broadcast [1 5 7] [3 3]))
d
e

(m/sqrt d)
(m/esum d)
(m/emax e)
(m/emap #(* 2 %) e)
```

```:結果
[[1 0.0] [0.0 2]]
[[1 5 7] [1 5 7] [1 5 7]]

[[1.0 0.0] [0.0 1.4142135623730951]]
3.0
7
[[2 10 14] [2 10 14] [2 10 14]]
```

`broadcast`で同じ行が複数ある行列が作れた。
あとは大体予想通りだけど、特定の行や特定の列だけに演算できるmapとか特定の行だけ取り出すfilterはないんだろうか？
clojure.core.matrix.select/selとか使ってもできなそうだし・・・
AWS EC2: t2.microの年間値段について(2015/1版)

AWSのFree Tierが終了するので調べてみた。

http://aws.amazon.com/jp/ec2/pricing/

(※ちなみにリージョンは東京リージョンとします)

---

* t2.micro: `$0.02/h` → `$14.88/month`(31days) → `$175.2/year` (365days)
* t2.small: その倍
* t2.medium: 更にその倍…

現在(2014/12/29)のドル相場(1ドル120円程度)で換算すると、

* t2.microの年額 `$175.2` は `21,024円`程度

になりますな。**高ぇ・・・** 

ちなみに**RI (Reserved Instance)**があります。これを使えば、

![スクリーンショット 2014-12-29 18.10.40.png](https://qiita-image-store.s3.amazonaws.com/0/13836/228ffc2b-05a0-6e59-95b4-80174907790f.png)

中度利用なら1年契約で ¥$0.016 (相当)、3年契約で ¥$0.011 (新しいインスタンスタイプが出て来たりするので、3年契約は避けたいなぁ・・・)

![スクリーンショット 2014-12-29 18.10.53.png](https://qiita-image-store.s3.amazonaws.com/0/13836/b30958ae-b441-8695-4da1-998ed0182934.png)

全額前金支払いならば、 ¥$0.014 (1年契約) / ¥$0.009 (3年契約)

(重度利用インスタンスはなくなったのかな・・？)

* 中度利用 1年契約: `$140.16` → `16,819.2円` (※1ドル120円として)
* 中度利用 3年契約: `$96.36` → `11,563.2円` (※1ドル120円として)
* 全額前金支払い 1年契約: `$122.64` → `14,716.8円` (※1ドル120円として)
* 全額前金支払い 3年契約: `$78.84` → `9,460.8円` (※1ドル120円として)

`t2.micro`の全額前金、3年契約でやっと1万円を切る価格。た、高い・・・
(また、これからドル上がるかも知れんし・・・)

---

まぁ、1年契約として、年額15000円なら払ってもいいかなー、という額かも。

まぁもしくは、他の(さくら等の)VPSを使うかー、ですね。

* http://vps.sakura.ad.jp/specification/

とは言え、さくらでも1GBタイプが、年額`10,692円`なので、そんなに大きく変わりはしませんけどね・・・

([DTIのserverman](http://dream.jp/vps/) は安いけど、[評判が悪い](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=DTI+serversman%40vps+%E3%83%A4%E3%83%90%E3%81%84) 時期があったようなので、あんまり使いたくないなぁ・・・)
AVRISPmkII からターゲットボードに 5V を供給できるようにする


ATMEL 純正のライター [AVRISPmkII](http://akizukidenshi.com/catalog/g/gM-02582/) の不便なところは、このライターから5Vを供給できる機能がないところです。毎回3〜5Vを別途用意するのが面倒な時がよくあります。

一方、私が常用している [ELM氏のAVRライター](http://elm-chan.org/works/avrx/report.html) は、電源が「ターゲットから供給(3～5V)」と「ターゲットに5V/3.3Vを供給(ターゲット側の条件によっては不可)」をスイッチによって選択できるようになっています。ライタから電源を供給できれば、ライタと基板だけでマイコン開発が可能となり、さくっと何かを作りたい時にとっても楽です。

というわけで今回は、AVRISPmkII に5V供給機能を付けるための改造方法をご紹介します。（動作保証はしませんので、ご自分の責任でトライしてくださいねっ！）

# どこから 5V を取ってくるか

AVRISPmkII は御存知の通り、USB接続のライタです。つまり、USB の 5V はライタには供給されているので、これを取ってくるようにしましょう。

# どのピンに供給するか

AVRISPmkII のターゲット側 ISP コネクタのピン配置(TopView)は以下です。

![avrisp_pin.png](https://qiita-image-store.s3.amazonaws.com/0/33935/1c39f38a-aa8e-5885-4bac-2de40e1be2c7.png "avrisp_pin.png")

このうち、2ピン目の Vcc に USB の 5V を供給できるようにします。

# 改造方法

AVRISPmkII の基板を取り出し、基板の裏側2箇所のはんだ付けを行います。ライタを PC に接続している場合は、PC から抜いておきましょう。

以下の画像のように、ISP コネクタ側の **左下のピン** (注: 上の画像のISPコネクタピン配置は TopView なので、 基板裏から見た下の画像だと左右逆です）と、 **TP1** とかかれたパッドをはんだ付けしてください。TP1 は USB の 5V が接続されています。

ハンダ付けが終わったら 6ピンの GND と 2ピン のVcc の電圧を測り、5V になっていれば成功です！

![写真 2014-12-29 17 52 37.jpg](https://qiita-image-store.s3.amazonaws.com/0/33935/e3eb4781-e989-7ba9-3331-daaee45d11a4.jpeg "写真 2014-12-29 17 52 37.jpg")

これで、ターゲットボードに電源を用意しなくても、ライタを繋ぐだけで開発ができるようになります〜！

# 注意点
ターゲットボード側で電源を確保している場合は、この改造を施したライタを使うのはお控えください。
fluentdのバッファファイルが突然全て無くなった

Fluentdを再起動するとバッファファイルが突然全てなくなって困ったのでどうしてそうなったのか調べてみた。

## Fluentdのバッファファイル

バッファファイルというのはBufferedOutputプラグインで`buffer_type file`を指定して`buffer_path`にできるファイルのこと。ここにプラグインで使うデータが保存されているので、Fluentdを止めても次回起動時に再送が行われる。

## 問題

例としてout_forwardを使うと以下の設定のように`buffer/foo.bar.baz`にバッファを保存するようにしていた。

```
<match test>
  type forward

  buffer_type file
  buffer_path buffer/foo.bar.baz
  ...
</match>
```

この設定で処理が追いつかずにキューが溜まっていくとバッファファイルが以下のように溜まっていく

```
$ ls -1 buffer/
foo.bar.baz.test.b50b56bd280da5547.log
foo.bar.baz.test.q50b56bb78fd8ea6c.log
foo.bar.baz.test.q50b56bb9d0c2643f.log
```

バッファが残った状態でFluentdを再起動してしばらく待つと、以下のようなエラーがでていた。

```
2014-12-29 17:35:09 +0900 [error]: fluent/output.rb:155:rescue in run: error on output thread error="No such file or directory @ sys_fail2 - (buffer/foo.bar.baz.test.b50b56bd280da5547.log, buffer/foo.bar.baz.test.q50b56bd280da5547.log)"
```

バッファファイルが無いというエラー。そんなわけがないと思いつつバッファファイルが保存されているディレクトリを見ると**全てなくなっていた**。


## 原因

実際に使っていた設定は以下のようになっていて、forwardの前に別のBufferedOutputプラグインを設定していた。

```
<match other>
  type exec
  command cat
  buffer_path buffer/foo.bar
  ...
</match>

<match test>
  type forward

  buffer_type file
  buffer_path buffer/foo.bar.baz
  ...
</match>
```

ここで問題なのは**buffer_pathが前方一致するようなパス**になっていること(実際にはもう少し細かい条件がありますが)。このような設定になっていると、`test`のバッファファイルが`other`の方のバッファファイルとしても扱われてしまうため、**other側の方で処理が終わるとバッファファイルが削除されてしまいます**。

処理の流れとしては以下のようになります。

1. Fluentdを再起動
2. `other`が`buffer/foo.bar.*.log` にマッチするファイルをバッファファイルとして登録
3. `test`が`buffer/foo.bar.baz.*.log` にマッチするファイルをバッファファイルとして登録
4. `other`のプラグインが先に実行され、バッファファイルを削除する
5. `test`を実行しようとするとバッファファイルが無いのでエラー

## 対応策

対応方法としてはいくつかあります。

- buffer_pathが前方一致しないように注意する(例: `foo.buffer`, `foo.bar.buffer`
 - パスの末尾を統一する
- buffer_pathに`.` (dot)を使わない(例: `foo_bar`, `foo_bar_baz`)

buffer_pathに`*`を使った場合は生成されるパスが異なるので上記の対応だけではうまくいきません。おそらく部分文字列にならないように注意しないといけない気がします(要確認)。

どちらにせよBufferedOutputでNo such file or directoryが出ているようならロストしている可能性が高いので注意して下さい。
Python2.6 + Selenium2.44.0でWebUIテスト - profile設定

Seleniumを使ったテストを書く際につまずいたprofile設定をメモします。
Python初心者なので、コードがおかしいかもしれませんがご了承を。

# 環境の構築
構築の手順は多くのサイトで書かれているため、割愛します。

以下のサイトを参考にしました。
http://treeapps.hatenablog.com/entry/2014/10/16/015439
https://pypi.python.org/pypi/selenium

Xvfb+FireFox+Selenium(2.44.0)の構成です。

# profile設定
User-Agentを判別してPC/スマホに最適化されたページを出し分けている場合、スマホのUA(mobile Safari等)を指定したテストが必要になってきます。
また、開発環境で試験を回す場合、オレオレ証明書だったりする事があると思います。
これらに対応するため、profileの初期設定が必要です。

```py:sp_webdriver.py
import os
from selenium import webdriver
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile

profile = FirefoxProfile()
# 証明書の警告を無視する
profile.set_preference("webdriver_assume_untrusted_issuer", False)
profile.set_preference("webdriver_accept_untrusted_certs", True)
profile.accept_untrusted_certs = True

# User-Agentの書き換え(例：iOS 8.0)
profile.set_preference("general.useragent.override", "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A365 Safari/600.1.4")

profile.update_preferences()

driver = webdriver.Firefox(profile)
```


# テストケースを書いてみる
テストケースを書いてみます。
実際に書くときは、基底クラスを作ってからテスト部分だけ実装するといいと思います。

```TestCase.py
# -*- coding: utf-8 -*-

import sys, os
import datetime
from selenium import webdriver
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
import unittest

class TestCase(unittest.TestCase):

    def setUp(self):
        profile = FirefoxProfile()
        profile.set_preference("webdriver_assume_untrusted_issuer", False)
        profile.set_preference("webdriver_accept_untrusted_certs", True)
        profile.accept_untrusted_certs = True
        profile.set_preference("general.useragent.override", "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A365 Safari/600.1.4")
        profile.update_preferences()
        self.driver = webdriver.Firefox(profile)

        self.base_url = "http://m.finance.yahoo.co.jp/"
        self.driver.implicitly_wait(30)
        self.accept_next_alert = True

    def ssAssertEquals(self, left, right):
        try:
            # assertionError時にスクリーンショットを取得する
            self.assertEqual(left, right)
        except AssertionError, e:
            now = datetime.datetime.now()
            self.driver.save_screenshot("/var/log" + self.__class__.__name__ + "_" + now.strftime("%Y%m%d%H%M%S") + ".png")
            raise e

    def test_sitetop(self):
        self.driver.get(self.base_url)
        self.ssAssertEquals(u"Y!ファイナンス", self.driver.title)

    def tearDown(self):
        self.driver.quit()

if __name__ == "__main__":
    unittest.main()
```
Fabricで service sshd restart はやってはいけない

背景
-----

Fabricを使って、`/etc/ssh/sshd_config` などを遠隔から編集し有効化する場合、編集後にサービスの再起動をしたくなるが、これはやってはいけない。たとえば次のようなコード。

```py
def restart_sshd():
    sudo("service sshd restart")
```

あるいは、リモートの `/tmp/restart_sshd.sh` に以下のコードを書いてから、それを呼び出す場合もしかり。

```bash
#!/bin/bash
service sshd restart
```
```py
def restart_sshd():
    sudo("/tmp/restart_sshd.sh")
```

上記いずれかのコードを実行してしまうと、sshd が停止した後復活してこない。そのため、SSH でアクセスすることが出来なくなる。たとえば、Amazon EC2 や Vagrant といったコンソール画面を標準で持たないサービス・ソリューションの場合、インスタンスの再起動を行わないとそのインスタンスの操作ができなくなってしまうのである。

しかし、このままでは `/etc/ssh/sshd_config` へ変更した設定が有効化されない。


対応策
----------

月並みだけど、`restart` を使わずに `reload` を使えばいい。

```py
def restart_sshd():
    sudo("service sshd reload")
```

これで設定は有効化されるはず。

sshd をどうしても再起動しなければならない場合には、Fabric でやらずに SSH でログインしてから `restart` した方がよい。

追記（2015-10-23）
--------

ここに書いてあった。

[Frequently Asked Questions (FAQ) — Fabric documentation](http://www.fabfile.org/faq.html#init-scripts-don-t-work)

理由は、完全に見落とし。頭になかったところ。

initスクリプト実行時に、子プロセスが上がりきる前に端末が終了し、そのまま子プロセスまで死んでしまうという理由。
今回は、sshdという、落ちたらすごくわかりやすいサービスで発生したためにすぐ把握できたが、他のinitスクリプトや似たような動作をするコマンドでも、成功しているように見えて失敗している場合もあると思うので、注意が必要。

回避する方法としては、上記公式のFAQにも有るとおり、`pty=False`を付ければいい。
CentOS 7 MongoDB (4.0) のインストール

CentOS 7 での MongoDB のインストール手順。
公式ドキュメント: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ にある手順を参照してインストールする。

## リポジトリの追加

```shell-session
$ sudo vim //etc/yum.repos.d/mongodb-org-4.0.repo
```

下記を記載する。

```sh
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
```

## インストール

```shell-session
$ sudo yum install mongodb-org
```

## 起動

```shell-session
$ sudo systemctl start mongod
```

デフォルトでは 27017 番ポートで起動する。
PBOX Client利用ガイド

# 概要

ここではファイル共有サービスであるpBoxのクライアントを利用する方法をご紹介します。

# 起動方法

MacOSXならpbox.appを、Windowsならpbox.exeをダブルクリックしましょう。

![Screen Shot 2014-12-15 at 19.28.36.png](https://qiita-image-store.s3.amazonaws.com/1666/58050/b5d3e8bb-1b07-7343-231b-3bf6c39108f3.png)

# アカウント設定

アプリケーションが起動すると、タスクトレイにpBoxのアイコンが追加されます。

![Screen Shot 2014-12-15 at 19.29.42.png](https://qiita-image-store.s3.amazonaws.com/1666/58050/3c5c6d65-9576-9d28-7003-52c1ce63498c.png)

このアイコンをクリックし、「**Preference**」を選択することでアカウントの設定をすることができます。

![Screen Shot 2014-12-15 at 19.33.13.png](https://qiita-image-store.s3.amazonaws.com/1666/58050/9b6da96f-aadc-9b09-1c37-4f2839f53312.png)

次のような設定画面が表示されるので、pBoxのホストネーム(URL)とユーザー名、パスワードを入力しましょう。

![Screen Shot 2014-12-15 at 19.35.33.png](https://qiita-image-store.s3.amazonaws.com/1666/58050/98c761bd-d69c-e1dd-8239-d2434ddf704e.png)

これによりホームディレクトリ直下にpboxディレクトリが作成され、中のファイル・ディレクトリの動機が開始されます。
iOSでdocumentにclickイベントを張っても正常に発火しない問題


jQueryのdelegateを使って、例えば

```js
$( document ).on( "click", ".hoge", function(){
	console.log( "hoge" );
} );
```

という風に書いても正常に発火しません。
iOSでは本来 **documentやbodyに対してクリックイベントを持たせることはできないためです。**

ただしこれを回避する方法はいくつかあって、その方法のひとつにイベントの伝搬を使う方法があります。


http://kimizuka.hatenablog.com/entry/2013/12/20/075448


また、cssを使って回避する方法もあります。
それは、クリックイベントを張る対象のDOMに対して、

```css
cursor: pointer;
```

を設定することです。これで正しくクリックイベントが発火するようになります。
pBoxの価格

pBoxのライセンス料金は1TBあたり月額5000円の容量課金となっております。

pBoxはSoftLayer上で動作するサービスであり、別途SoftLayerのインスタンス作成の費用が必要になります。

2014年12月現在、インスタンスの作成は月$27.60～となっております(1Core + 1GB RAM + 25GB Local Storageの場合)。pBoxのデータはインスタンスのデータ領域ではなく、オブジェクト・ストレージに保存されるため、インスタンスでは最低限のLocal Storageで利用することができます。

| 名前 | 料金 |
|------|------|
| pBoxライセンス料金 | 1TBあたり月額5,000円 |
| SoftLayerインスタンス利用料 | 月額$27.60〜(約3,300円〜) |
| 合計 | 月額約8,300円〜 |

# 参考資料

[SoftLayerクラウドご利用価格について](http://www.ibm.com/cloud-computing/jp/ja/softlayer_price.html)
このような方にPBOX導入のおすすめしています

PBOXはクラウド型ファイル共有アプリケーションです

# このような問題にお困りの方はPBOXの導入がおすすめです

* ファイルサーバの管理が大変だと感じている方
* ファイルサーバの保守費用が高いと感じている方
* バックアップ用のマシンの用意の多額の費用をかけている方
* 大量のファイルを保存するにはサーバのディスクが足りないと感じている方
* お客様への大きいファイルの送信が億劫だと感じている方

# PBOXを導入することで、問題を解決することができます

* 管理が簡単になります

* サーバ管理の人件費を削減できます

* データのバックアップのためマシンを用意する必要がなくなります
    * PBOXでは削除されたり、変更されたファイルに対して変更履歴が保存されます。間違ってファイルを削除しても履歴からファイルを復元することが可能です。

* ストレージの容量の上限がなくなります
    * PBOXではファイルを保存するためにSoftLayerのオブジェクト・ストレージを利用します。オブジェクト・ストレージは容量の制限がなく大量の大容量ファイルの保存に適したストレージサービスです。ストレージの容量の上限を気にする必要がなくなります。

* 大容量データを簡単に受け渡しできます
    * 顧客やベンダとのファイル共有を簡単に行うことができます。ファイルへの期限付きURLを作成することで簡単にファイルを送信できます。
コンテナの終了を通知するアプリ

# 概要
コンテナで単発の計算をさせていて、終了を通知してほしい。iPhone 用の Pushover アプリを使っているので、これを利用する。

# 通知コンテナ
イベントの取得は、[ここ](http://qiita.com/jkawamoto/items/09af69317086bfa31b7a) に書いた通り。後は die イベントを取得して Pushover API を叩く。

簡単な実装を [GitHub](https://github.com/jkawamoto/docker-notifier) と [DockerHub](https://registry.hub.docker.com/u/jkawamoto/docker-notifier/) にて公開中。

# 使い方
```shell-session
$ docker pull jkawamoto/docker-notifier
$ docker run -v /var/run/docker.sock:/var/run/docker.sock jkawamoto/docker-notifier <USER> <TOKEN> --filter sample.*
```

ここで <USER> と <TOKEN> は、Pushover から渡されるユーザ API キーとアプリケーションキー。`--filter` オプションに正規表現を渡すとマッチするコンテナ名を持つもののみ通知するようになる。
VPN接続時にmtuを変更する

VPN接続張ってもなんかデータこないってことがあって、よくよく調べていくとmtuの値を小さくしないとパケットが来ないということがよくありますよね。
VPN接続の度に手動でmtuの値を変更するのも面倒なので、VPN接続が張られたら連動してmtuを変更するスクリプトを書いてみました。

# 目的
VPN接続したら自動的にmtuを変更する

# 動作環境
 * Fedora 21で動作確認とってますが、最近のRedhat系OSなら同じ設定でいけると思います。

# 設定
/etc/NetworkManager/dispatcher.d/ に下記のようなファイルを置きます。

```/etc/NetworkManager/dispatcher.d/99-vpn-up
#!/bin/sh

set -e

if [ "$2" = "vpn-up" -a "$CONNECTION_ID" = "VPN NAME" ]
then
  /sbin/ip link set "$1" mtu 1346
#  /usr/sbin/ifconfig "$1" mtu 1346
fi

exit 0
```

解説とポイントは以下です。

 * 99-vpn-upのオーナーはrootにして実行パーミッションを付けておく
 * 99-vpn-upのファイル名はなんでもいいのですが、同じディレクトリ内のファイルを辞書順で実行するので、依存関係的に最後の方に実行される名前がよろしいかと
 * if文の$2との比較ですが、ここはVPN接続時なのでvpn-upを指定します
 * if文の2つ目の条件ですが、VPN接続設定が複数ある場合でmtuを変えたいとかありましたら、明示的にVPN設定名を入れてください。VPN設定は/etc/NetworkManager/system-connectionsに設定ファイルが転がっているので、その中のidで指定されている文字列をいれてください
 * ifconfigはオワコンなのでipコマンドでmtuの値を指定しましょう
 * VPN接続時に作成されるデバイス名を$1を受け取っているので、そのデバイスのmtuを変更します。

それでは！
Macの初期設定

## Macの初期設定
### 1. とりあえず整理
* Dockをきれいにする
* Apple IDを設定
* google chromeをインストール

### 2. Homebrew

```
# http://brew.sh/ にあるrubyコードを実行
$ brew update # formuls（手順書）の更新
$ brew upgrade # 更新があるパッケージを再ビルド
$ brew doctor # インストールの問題をチェック

$ brew install coreutils # MacコマンドをLinuxのGNU風に置換する
$ brew install findutils
$ brew install zsh

# /etc/shells の末尾に /usr/local/bin/zsh を追記する
$ chpass -s /usr/local/bin/zsh # ログインシェル変更

$ apps=(
  ack
  git
  wget
  tree
  tmux
  ag
  direnv
  yarn
  )

$ brew install ${apps[@]}
```


### 3. Homebrew cask

```
$ apps=(
iterm2
alfred
dropbox
google-japanese-ime
hipchat
sequel-pro
vagrant
virtualbox
sublime-text
atom
kobito
)

$ brew cask install --appdir="/Applications" ${apps[@]}
```


### 4. Ricty

```
$ brew tap sanemat/font # Rictyがインストールされていない場合tapでリポジトリを追加する
$ brew install ricty
$ cp -f /usr/local/Cellar/ricty/4.1.0_1/share/fonts/Ricty*.ttf ~/Library/Fonts/ # 展開ディレクトリは環境に合わせる
$ fc-cache -vf # フォントのキャッシュ削除
$ exec $SHELL -l # シェルの再起動

# iTerm2の Preferences > Profiles > Default > TextのFontを14pt Ricty Regularに設定する
```

### 5. Karabiner

#### Sierra用
* 環境設定 > キーボード > 修飾キー からCapsLockをアクションなしにする

[Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements/blob/master/usage/README.md)をダウンロードして記載のやり方に従ってインストールする。Karabiner-Elementsをアプリケーションから立ち上げて設定する。

* caps_lock: left_control
* fn: left_commnad
* left_command: 英数キー
* right_command: かなキー

#### Sierraより以前用

```
$ apps=(seil karabiner)
$ brew cask install --appdir="/Applications" ${apps[@]}
```

* 環境設定 > キーボード > 修飾キー からCapsLockをアクションなしにする
* seil
  * CapsLockをControlに変更
  * For Japaneseを全てオンにする
* Karabiner
  * For Japaneseで コマンドキーの動作を優先モード v1
  * Fn+letter を Command+letter にする

### 6. IME設定
* 環境設定→キーボード→入力ソース
* ひらがな(Google)を追加
* 再起動

### 7. dotfiles周り
https://github.com/kiyodori/dotfiles

### 8. anyenv

```
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ anyenv install rbenv
$ exec $SHELL -l
$ rbenv install --list
$ rbenv install 2.4.0
$ rbenv global 2.4.0
$ gem install bundler
```

### 9. vim

```
$ brew install lua
$ brew install vim --with-lua
$ exec $SHELL -l # シェルの再起動
```
AndroidのWebViewで「Uncaught TypeError」が出てページ表示ができないときは


突如こんなエラーが発生するようになってしまいました。

```
E/Web Console(1024): Uncaught TypeError: Cannot read property 'some-property' of null at https://example-site.com/example.js:1234
```

jsが悪いのかなーと疑ったりしたんですがクライアント側の設定を追加すると直りました。
ちなみにjs側ではlocalStorageを使い始めてました。

```java
WebView webView = //... どっかしらから取得
webView.getSettings().setDomStorageEnabled(true);
```

DOMストレージAPIを使用するために必要と[ドキュメント](http://developer.android.com/reference/android/webkit/WebSettings.html#setDomStorageEnabled(boolean))に記載もありました。
OS X(Mac)でJavaをアップデートするとアプレットでSocketPermissionエラーが出る時の対処

# 症状
OS X(Mac)環境でJavaをアップデートしたら、あるサイトで以前は正常に実行できていたはずのJavaアプレットが次のようなエラーで実行できなくなりました。

```text
Error: access denied ("Java.net.SocketPermission" "<Hostname>:<Port>" "connect,resolve")
```

※注：実際のエラーメッセージでは\<Host\>および\<Port\>には実際のホスト名とポート番号が入っていました。

別のブラウザを試してみても同じエラーが発生していました。

# 原因
Java7u51でセキュリティのデフォルト設定が変更されたようです。以前は、ポート番号1024以上のソケット接続は全て許可されていたのが、[エフェメラルポート](http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%95%E3%82%A7%E3%83%A1%E3%83%A9%E3%83%AB%E3%83%9D%E3%83%BC%E3%83%88)のみを許可するようになりました。エフェメラルポートの範囲はOSごとに異なり、例えばWindows Vista以降では49152から65535、Linuxでは32768から61000などです。この範囲ではないポートに接続する場合、セキュリティポリシーの設定が必要になります。
※参考1 → http://qiita.com/pekokun@github/items/7307fd8c138fe3d2ceb4
※参考2 → http://d.hatena.ne.jp/seraphy/20140214

# 対処
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/java.policy を編集し、下記の記述を追加します。

```java
grant codeBase "https://<Host>/*" {
        permission java.net.SocketPermission "<Host>:<Port>", "connect";
};
```

上記記述で、\<Host\>にはホスト名またはIPアドレス、\<Port\>にはポート番号あるいはポート番号の範囲（下限-上限）を指定します。（もちろん"https"はサイトに応じて"http"になると思います。）

ちなみに、エラーメッセージではアクションが"connect,resolve"になっていますが、設定側では"resolve"以外のいずれかのアクションを指定すると暗黙的に"resolve"も指定したことになるので、"connect"だけで大丈夫です。
※参考 → https://docs.oracle.com/javase/jp/6/api/java/net/SocketPermission.html

変更を保存したら、ブラウザを再起動します。これでJavaアプレットが実行できるようになります。
Cloud9 で golang プロトタイピング

小物の開発テストに Cloud9 を使ってみたところ、小規模開発や実験に有用だねと思ったのでご紹介。

# Cloud9 って？

https://c9.io/

ブラウザエディタを軸としたオンライン開発サービスです。

![ide.c9.io_2014-12-29_15-37-25.png](https://qiita-image-store.s3.amazonaws.com/0/50737/1c0eccd1-086d-da83-2a30-db8b4a02cee4.png)

WEBブラウザだけでちょっとしたサーバーサイドアプリケーションの開発ができてしまいます。
ChromeBook の上でプログラム開発を行うために、開発環境のクラウドサービスがないものかなあと探して出会ったものです。実際、インターネットアクセスができる ChromeBook があれば開発ができちゃいます。

最大の特徴は簡易ホスティングで、ソースコードエディタだけでなく VM ベースのホストマシンとプレビュー公開の http アクセスを提供してくれます。ホストマシンへのコンソールもWEBブラウザ上でアクセスできるので、ソースコードを書いてコンソールでビルドしたり実行したりといったプロトタイプ開発が行えます。

有料コースだとホストが VM になって、プライベートプロジェクトが 5つまで使える様です。
無料コースだとホストは Docker コンテナで、プライベートプロジェクトは 1つだけ、かな。

# go言語の開発はできるの？

ホストコンテナは ubuntu ベースで golang もインストールされています。

![無題の画像0.png](https://qiita-image-store.s3.amazonaws.com/0/50737/7b90d7ee-d336-94a8-ca95-d0f02b5716b0.png)

WEB開発がメインターゲットなのでスタートアップ時のテンプレートに go はいません。
元々 node.js の開発をターゲットに作られたみたいなので、cloud9 が真価を発揮するのは node.js プロジェクトでしょう。実際、WEB IDE によるソースコードデバッグは javascript のみとなっています。

テンプレートから 'Custom' を選ぶと何でもできるホストが用意されます。
gcc, g++, go, perl, ruby, python, node あたりは最初から入っていますし、clang が欲しいなら apt-get することで利用する事が可能です。

Custom の場合はプレーンなコンテナが一個用意されるだけなので必要なプロジェクトは自分で用意することになります。go言語の場合は IDE のエディタ機能を利用して、bash コンソールでビルド＆実行をすることになります。
残念ながらデバッガは使えませんが WEBブラウザプレビューが IDE の上で行えますので、それなりに快適な開発サイクルが実現できます。

# WEB版 Hello, World を作る

![ide.c9.io_2014-12-29_15-44-35.png](https://qiita-image-store.s3.amazonaws.com/0/50737/fc31811d-07d8-b92a-7647-aae41c0a435d.png)

Custom から Workspace を作ったばかりの時は真っ新な状態です。
GOPATH 環境変数を確認すると $home に設定されているようなので、ユーザーディレクトリ部分がまるっと GOPATH になっています。なので src/プロジェクト名/ というディレクトリを作成してその中で go言語開発を行うのが良さそうです。

![無題の画像.png](https://qiita-image-store.s3.amazonaws.com/0/50737/d8518451-a50c-3d83-3216-feab1d1d8402.png)

単純にポート 8080 を listen して "Hello, World!" を返す WEBサーバーを作成します。

```go:main.go
package main

import (
        "fmt"
        "net/http"
    )

func pageRequest(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World!")
}

func main() {
	http.HandleFunc("/", pageRequest)

	// do serve
	err := http.ListenAndServe(":8080", nil)

	// error abort
	if err != nil {
		fmt.Println(err)
	}
}
```

ビルド＆実行するにはコンソール上で行います。

![無題の画像２.png](https://qiita-image-store.s3.amazonaws.com/0/50737/2751ecd9-a7e5-e565-0cf5-0ee37b88367f.png)

エディタ上でメインパッケージである main.go を開いている状態で [RUN] ボタンを押すと、編集中の言語を認識して実行してくれます。go言語でも反応してくれるので、RUN ボタン一発で動作確認することが可能です。

WEBサーバーとして動作しているとき、それがポート 8080 であったらプレビュー機能が利用できます。

![無題の画像3.png](https://qiita-image-store.s3.amazonaws.com/0/50737/cf76d33f-dbbc-65f9-fd4b-9152ab3b6818.png)

IDE 上にプレビューが開いてサーバーの動作状況が確認できます。

![ide.c9.io_2014-12-29_16-03-53.png](https://qiita-image-store.s3.amazonaws.com/0/50737/e47aac8a-0581-0310-6236-e90b8c92455e.png)

go言語でWEBサーバープログラムを書いて、実行＆動作確認ができました。
これがWEBブラウザの上ですべてこなせます。

# その他情報

* DB はローカルコンテナにインストールされているものを使う様です。必要な物がなければ apt-get でインストールすることになるでしょう。

* git-hub や Bitbucket のアカウントでログインすることでリポジトリからのプロジェクトインポートができるようになります。ただし push はコンソールから行うことになるので、この連携はあまり使わないでコンソール上で clone, push  することになるんじゃないかと思います。


Cloud9 を使うとWEBブラウザ一つでどこでも開発ができる様になるだけでなく、手元に言語環境を揃えなくても開発ができるようになります。普段使わない言語のプロトタイプを手軽に行うという場面で威力を発揮するのではないでしょうか。
練習がてらRPGっぽいのを作ろうとしたら


```Ruby:game.c
/*ゲーム本体*/

#include <stdio.h>
#include <string.h>

#include "SysFunc.h"

struct Status /*ステータスの構造体を定義。*/
{
	char Name[50];
	int LV;
	int HP;
	int MP;
};

main()
{
	
	char Input[200], Warn[200]; /*入力用変数(Input)と警告文表示用の変数(Warn)を宣言。*/
	int Opt, OptMAX, OptMIN, Judge = 0, flag = 0; /*左から選択肢、選択肢の最大値、選択肢の最小値、成否判断、先に進むフラグ*/
	
	printf("\n------------------------------\nC言語で作るRPG\n------------------------------\n1.はじめる\n2.おわる\n\n\n入力："); /*スタートメニュー表示*/
	
	OptMIN = 1;
	OptMAX = 2;
	
	while (flag != 1) /*スタートするか否か*/
	{
		gets(Input);
		Opt = atoi(Input);
		
		OptJudge(&flag, Opt, OptMAX, OptMIN); /*参照：SysFunc.h OptJudge.c*/
	}
	
	switch(Opt)
	{
	case 1: /*ゲーム開始*/
		
		struct Status Player = {"", 1, 15, 10}; /*プレイヤーのステータスを宣言*/
		
		flag = 0;
		Judge = 0;
		
		printf("\n\n\nキャラクターを作成します。キャラクターネームを半角換算50文字以内で入力してください。\n\n入力：");
		
		while (flag != 1)
		{
			gets(Player.Name);
			printf("\n\nキャラクターネームは「%s」でよろしいですか？\n1.はい\n2.いいえ\n\n入力：",Player.Name);
			
			while (Judge != 1)
			{
				gets(Input);
				Opt = atoi(Input);
				
				OptJudge(&Judge, Opt, OptMAX, OptMIN);
			}
			
			if (Opt == 2)
			{
				printf("\n\n\nキャラクターネームを半角換算50文字以内で入力してください。\n\n入力：");
			}
			
		}
		
		printf("\n\n\nキャラクターを作成しました。\n\nようこそ、%s。ゲームを開始します。",Player.Name);
		
		break;
	case 2: /*ゲーム終了*/
		printf("\n\n\nゲームを終了します。\n");
		break;
	}
	
}


```

```Ruby:OptJudge.c
/*入力された値が有効かどうかを判断する関数。*/
#include <stdio.h>

void OptJudge (int *p, int Opt, int OptMAX, int OptMIN)
{
	if (OptMIN <= Opt && Opt <= OptMAX)
	{
		*p = 1;
	}
	else
	{
		*p = 0;
		printf("\n\n選択肢の中の値を入力してください。\n\n入力：");
	}
}

```

```Ruby:SysFunc.h
/*ゲーム機能のヘッダ。*/

int OptJudge (int *p, int Opt, int OptMAX, int OptMIN); /*参照：OptJudge.c*/

```

以上3つのファイルを、コマンドプロンプトで

```
gcc game.c OptJudge.c SysFunc.h -o game.exe
```

と打ち込んでコンパイルしようとすると、

![game.png](https://qiita-image-store.s3.amazonaws.com/0/46217/f12f027e-2126-c69c-0d3c-2568bf8cac7c.png)

コンパイルエラーが出るし、いざ実行しようとしてもできない。
ちゃんと構造体の定義もしているし、宣言もしているはずなのだが。

だ、誰かお知恵を……。
エンジニアが、写真をいい感じに加工してくれと言われて１時間でやったこと

会社からの依頼で、求人用写真を編集してほしいという依頼があったので、素人ながら対応した件をメモっとく。
フロントエンドだと画像いじったりするので今後の役に立てばと思い。

用件

* 写真素材を元に、求人用ページ用画像を作成する

* 引きのいい画像にすること（求人一覧に出た時に印象に残りやすいもの）

myスペック(デザイン関係の)

* 業務でスライス作業経験あり(Photoshop)

* 画像加工経験あり(Fireworks)

スケジュール

* 昼休み中に対応してやろうと思ったので一時間ちょいで対応するスケジュール

* 30分調べる

* 30分作業する

* 納品

調べた

* ご飯をモグモグしながら「写真 トリミング コツ」とか「写真 トーン 加工」とかでググる。

参考にしたサイト  
http://liginc.co.jp/web/camera/45014
http://shuffle.genkosha.com/software/photoshop_navi/color/8418.html

時間的に、トーン加工とトリミングでいっぱいいっぱいだなと感じた


* トーン加工
元の写真が薄暗い感じだったので、全体的に明るくしつつ、コントラストをちょい上げでメリハリのある写真に。
3点打ち＆S字。

* トリミング
無駄な部分を削ぐことを意識してトリミング
１人にフォーカスすることに意識を置いて、後ろに見切れてる人物をカットしたり、空の部分が大きすぎたので削ったり。

* 疑似フォーカス
投げ縄ツールとぼかしツールをつかって、見せたい部分にフォーカスがあたってる感じにする。
※やり過ぎると超絶ダサくなるので注意。

という感じで作業完了しました。
YeomanでAngularJSアプリ開発

# YeomanでAngularJSアプリ開発
YeomanとはYo(scaffolding)、Grunt(ビルド)、Bower(ライブラリ管理)の3つのツールによってアプリケーション開発のワークフローを提供するものです。詳細については[公式](http://yeoman.io/)を参照してください。このYeomanを使ってAngularJSアプリのひな形を作っていきます。
事前にNode.jsをインストールしておいてください。

# Yo、Grunt、Bowerのインストール
YoでAngularJSのひな形を作るためのジェネレータをインストールします。npmでインストールを行います。

```
# npm install -g yo grunt-cli bower
```

# ジェネレータをインストールする
AngularJSのひな形を作るYoの[ジェネレータ](https://github.com/yeoman/generator-angular)をインストールします。

```
# npm install -g generator-angular
```

# アプリのひな形を作る
Yoを使ってアプリのひな形を作ります。

```
# yo angular
```

コマンドを実行するとインストールするモジュールを質問されるので必要なモジュールを選択します。

# ライブラリをインストールする
ジェネレータが用意してくれたライブラリをインストールします。

```
# npm install
# bower install
```

# Gruntサーバを起動する
開発時にデバッグするための静的サーバを起動します。またファイルの変更を監視してくれるので編集のたびにサーバを再起動する必要はありません。

```
# grunt serve
```

# リリース用ファイルを作成する
リリースに必要なファイルのみをミニファイし、*dist*ディレクトリにまとめます。

```
# grunt build
```

# アプリに部品を追加する
ジェネレータを使ってコントローラ等の部品を追加します。
ここでは代表的なもののみを紹介します。

## Routeを追加する

```
# yo angular:route myroute
```

コマンドを実行すると*view/myroute.html*、*script/controller/myroute.js*の2ファイルと、*script/app.js*へルーティング設定が追加されます。

## Directiveを追加する

```
# yo angular:directive myDirective
```

コマンドを実行すると*script/directives/mydirective.js*が追加されます。

## Serviceを追加する

```
# yo angular:service myService
```

コマンドを実行すると*script/services/myservice.js*が追加されます。

# ライブラリを追加する
Bowerを使ってライブラリを追加します。
ここではAngularJSで*[Lo-Dash](https://lodash.com/)*を使えるようにする*[ng-lodash](https://github.com/rockabox/ng-lodash)*を追加する例を紹介します。

```
# bower install ng-lodash --save
```

*bower.json*に依存関係が追記されるので、他の開発者がコミットを取得した際には`bower install`コマンドでインストールする必要があります。
macでnokogiriインストール

nokogiri入らない問題。

## 環境
Mac OS 10.9.5
`brew install rbenv ruby-build rbenv-default-gems`
ruby 1.9.2 / 2.1.2 / 2.2.2 検証済

## 手順
今のところ、

1. ソフトウェアアップデート（yosemiteにはしてない）
1. `xcode-select --install`
1. installボタンぽちっ (入ってたら何かしらエラー出る)
1. `bundle config build.nokogiri --use-system-libraries`
1. Terminal再起動 (or `source ~/.bash_profile`)
1. `bundle install`

で、全勝。（今のところ）
GAE/Go (Google App Engine/Go) を試してみる



今更だが、GAE/Goを試してみたので一応そのときのメモを残す。

基本的には以下のURLをもとに試してみた。
https://console.developers.google.com/start/appengine?_ga=1.131631439.1763681731.1414457689

# 準備

Google Cloud SDKと、Go用のApp Engineパッケージのインストールを行う。

```
$ curl https://sdk.cloud.google.com/ | bash
$ gcloud auth login
$ gcloud components update gae-go
```

昔、Google App Engine/Pythonで開発していたときと大分変わっている。


# Goプログラムを書く

サンプルもあるが、せっかくなので書いている。(サンプルのまま)

hello.go

```
package hello

import (
    "fmt"
    "net/http"
)

func init() {
    http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello, world!")
}


```

app.yaml

```
application: helloworld
version: 1
runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app

```

# 起動してみる

```
$ goapp serve .
```

コンパイルエラーなどがなければ、以下のアドレスで見ることが出来る。

http://localhost:8080/


また管理画面も以下のアドレスから見ることが出来る。
http://localhost:8000/


# App EngineにDeployしてみる

以下のページから、プロジェクトを作成する
https://console.developers.google.com/project


プロジェクトが作成されたら、以下のコマンドでDeployすることができる。

```
$ goapp deploy -oauth -application [project id] .
```

Deployが終わったら、以下のようなアドレスでブラウザから確認できる。

http://[poject id].appspot.com/