OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL5.7で何も知らずにWordPressのSQLデータをインポートすると死ぬ場合がある

WordPressのデータを移行するとき、みなさんどうしてますか！wordmoveですよね！おわり！


とはいかない状況だと、大体SQLデータをインポートするか、プラグインを使うかになると思います。

- 古いサーバー（coreserver）
    - MySQL5.1（…）

- 新しいサーバー（VPS）
    - MySQL5.7


上記の環境で起こったトラブルなのですが、プラグインを使ってもうんともすんとも言わない、SQLデータをMySQLに取り込んでもうんともすんとも言わないという意味不明な状況に陥ってしまい、にっちもさっちも行かなくなって途方に暮れてしまいました。

WPで使ったプラグインは以下

- All-in-One WP Migration
- duplicator

2大WP移行プラグインではないでしょうか。全部移行してくれるので非常に便利です。ただ、どっちも動きませんでした。

## エラーログを見る
エラーログを見ると、SQL文でエラーが起きていました。
エラーログは消えてしまいましたが、INSERTに失敗するのが確認できました。要するに投稿（wp_postテーブル）がインポートできない状況になります。


## 原因はSTRICTモード

```sｈ
mysql> SHOW VARIABLES LIKE 'sql_mode';
--------------
SHOW VARIABLES LIKE 'sql_mode'
--------------

+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                     |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
```

自分の環境では、sql_modeが上記のような設定になっていました。
デフォルトでSTRICTモードになっており、吐き出されたSQL文ではエラーが起きるようになっていたようです。

## 解決策はSTRICTモードの解除


```sh:/etc/my.cnf

sql_mode=''

```



```sh
mysql> SHOW VARIABLES LIKE 'sql_mode';
--------------
SHOW VARIABLES LIKE 'sql_mode'
--------------

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_mode      |       |
+---------------+-------+
1 row in set (0.01 sec)

```

my.cnfファイルに**sql_mode=''**を追加してあげることによりSQLが動き、インポートすることができました。
僕の場合はduplicatorを使用しました。
インポートが終わったらsql_mode=''は削除したほうが良いでしょう。


##おわりに

レンタルサーバーでは5.7を動かすところはまだないかなと思いますが、自分でサーバーを立てたりしてデータを移行する場合はもしかするとハマるかもしれません。
[MacOS] TerminalでFinderのカレントディレクトリにcdするワンライナー


TerminalとFinderで連携して作業したいことってよくありますよね。
Terminal → Finderの方は`open .`で開けますが、みなさん逆はどうやってますか？

現在Finderで最前面にあるウィンドウのカレントディレクトリにTerminal側でcdするワンライナーをAppleScriptを利用して書いてみました。

AppleScriptを利用するとシェルスクリプト側からMacOS固有のアプリケーションにアクセスできて便利ですね。


```
cd "`osascript -l JavaScript -e \"decodeURIComponent(Application('Finder').windows[0].target().url().replace('file://', '')).replace(/\\"/g, '\\\"');\"`" && pwd
```

これを適当にfcd.shなどのファイル名で保存して、~/.bash_profileに

```shell:.bash_profile
alias fcd='source /path/to/fcd.sh'
```

などとしておけば、`fcd`コマンド一発で実行することが出来ます。
(編集のあとは`source ~/.bash_profile`を実行して反映させるのを忘れずに！)

```
$ pwd
/Users/Yuhsak/Documents
$ fcd
/Users/Yuhsak/Documents/QiitaProjects/fcd
$ pwd
/Users/Yuhsak/Documents/QiitaProjects/fcd
Railsとvue.jsなどのJSフレームワークで、クロスドメイン通信（CORS）の設定をしたい！

production環境は同一サーバー、development環境だと別々で、フロントはJSのサーバー（ポート番号が違う）という環境は、昨今のSPAを開発するときにあるあるな環境だと思います。

JSONでやり取りをするときに、production環境だと普通にうまくいくのに、developmentだとポート番号が違うためクロスドメインになるという感じでエラー。
ここで一旦Railsであれこれやってドハマリ。解決してみれば超簡単だったのでメモしておきます。
現状僕の場合、フロントのファイルを更新したら即反映されるBrowserSyncやHot Reloadがない環境なしではやってられないぐらいなので、ここを解決することで非常にスムーズに開発することができました。

##クロスドメインだとPOSTがOPTIONSになる
クロスドメインでPOSTすると最近だとOPTIONSに変換されるということを知りました。
じゃあ最初にヘッダーにCORSを許容するドメインとかの設定をして、ルーティングでOPTIONSの設定をして…みたいなことをして時間をくってハマっていたのですが、そんなことをしなくてもすんなり解決する方法があったのでした…


## サーバー側の解決策

gemを追加し、反映させるだけでした。

[https://github.com/cyu/rack-cors](https://github.com/cyu/rack-cors)

```ruby:Gemfile
group :development, :test do
  gem 'rack-cors', :require => 'rack/cors'
end
```

上記記述後、bundle install

```ruby:config/application.rb
# developmentモードの時だけCORSを有効にする
if Rails.env.development?
  config.middleware.insert_before ActionDispatch::Static, Rack::Cors do
    allow do
      origins '*'
      resource '*', :headers => :any, :methods => [:get, :post, :options, :patch, :delete]
    end
  end
end
```

上記設定だけでバックエンドにおけるCORSの設定は終わりです。

[APIファーストでバックエンドとフロントエンドを別々に開発する時にハマるクロスドメインアクセス](http://qiita.com/arakaji/items/f7d32e1c94d67b3e2606)

クロスドメインについては上記投稿が参考になります！


## フロント側の解決策

今回の場合、ログインした後にJSでAPIをGET・POSTしたかったため、Cookieを送ってあげる必要がありました。
Cookieを適切に送ってあげるような設定でない場合、サーバー側で適切に処理されていれば401(Unauthorized)エラーが発生し、で何が何でもAPIにアクセスすることができません。

### withCredentials

CORSで通信し、かつCookieなどの情報をやり取りする場合、withCredentialsをtrueにしてあげないと適切に処理が行えません。
今回はフロントにvue、Ajax通信に[vue-resource](https://github.com/vuejs/vue-resource)を使用したので下記のようなコードを書くことでポート番号がバラバラなサーバーでもクロスドメインで通信することができました。

```js
this.$http({
  params: params,
  url: URL,
  method: 'POST',
  credentials: true
})
.then(
  (response)=> {
    // success
    console.log(response);
  },
  (response)=> {
    // error
    console.log("error");
    console.log(response);
  }
);
```
※上記はdevelopmentの時に用いる設定になります。

## おわりに
Railsで開発する場合、だいたいGemが揃っているのでやはり強いなーという感じ。自分で書くと大変でしたが、ライブラリを用いるとbundle installの時間のほうが掛かりました。
やはり過去の資産があり、それが現在でもちゃんと使えるということは強みだなと認識しました。
ニューラルネットワークをFPGA実機で動かした

#概要
以前，[「FPGA上で動くニューラルネットワーク・ジェネレータを作った」](http://qiita.com/kotauchisunsun/items/f19e400f47bd06445361)で公開したニューラルネットワーク・ジェネレータで出力したソースコードをFPGA実機Atlas-SoC(DE0-Nano-SoC)で動かしてみました．

リポジトリはここ
https://github.com/kotauchisunsun/DE0_NN

#ライセンス
Affero GPL v3

#機能
![image](https://qiita-image-store.s3.amazonaws.com/0/139643/ea211683-c415-1c2a-a0a5-622c3ad3664c.png)

DE0-Nano-Socのスイッチを入力，LEDを出力としてニューラルネットワークの挙動をします．
スイッチをonにすると1が代入され，offにすると0が代入されるようになっています．

SW[0]を入力1
SW[1]を入力2
SW[2]を左上のニューラルネットワークの出力と右上のニューラルネットワークの重み係数
SW[3]を左下のニューラルネットワークの出力と右上のニューラルネットワークの重み係数

に割り当てています．また，

右上のニューラルネットワークが発火すると，LED[0]が点灯
右下のニューラルネットワークが発火すると，LED[1]が点灯

という風な機能になっています．


#準備
##ソースコードの生成
この作業は上記リポジトリからコピーする方は不要です．

[「FPGA上で動くニューラルネットワーク・ジェネレータを作った」](http://qiita.com/kotauchisunsun/items/f19e400f47bd06445361)で用いたニューラルネットワーク・ジェネレータを使います．

https://github.com/kotauchisunsun/NN_FPGA

をcloneしてきます．

```
$ cd NN_FPGA
$ python script/main.py 16 2 2 2
> NN_NL_016_0002_0002_NL_016_0002_0002
> saved to generate.v
> None
```

これでgenerate.vというファイルが生成され，メインのニューラルネットのモジュールのNN_NL_016_0002_0002_NL_016_0002_0002というモジュールが生成されました．



##ひな形のダウンロード

Atlas-SoCとDE0-Nano-SoCはハード的には同じで，ファームウェアが違うだけのものです．
そのため，SDカードでファームウェアを書き換えることで，DE0-Nano-SoCとAtlas-Socを変更することができます．
今回は，以下のリンクのDE0-Nano-SoCのSystemCDというデータを用います．

http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=205&No=941&PartNo=4#soc


##デモプロジェクトのコピー

先ほどダウンロードしたファイルを解凍し，

DE0-Nano_SoC_v.1.0.9_SystemCD\Demonstrations\SoC_FPGA\my_first_hps-fpga_base

my_first_hps-fpga_baseをコピーして用います．


##ソースコードの編集
先ほどのリポジトリ https://github.com/kotauchisunsun/DE0_NN or 生成したgenerate.v をプロジェクトに追加します．

追加の仕方は詳しくは解説しませんが，メニューバーの[Project] -> [Add Current File to Project]から追加できます．

そののち，プロジェクト内にあるghrd.vを編集します．
これは少し特殊で，ghrd.vの**271行目，endmoduleの前**にリポジトリのdiff_ghrd.vの内容をコピペしてください．

(回りくどい書き方をしているのはghrd.v自体のライセンスがよくわからないので，リポジトリにあげると問題が発生する可能性があるためです．)


##実機動作
あとはコンパイルして，ProgrammerでDE0-Nano-SoCに焼いてください．

![IMAG0815.jpg](https://qiita-image-store.s3.amazonaws.com/0/139643/196d5b7a-371c-47e1-7f6e-828f89c8b8b9.jpeg)
実際にDE0-Nano-SoCで動作している様子

#テストケース
実際に動かしてみないとわからないと思うので，テストケースを用意しました．
これらを試してみると，実際にニューラルネットが稼働している様子が確認できます．

| SW[0] | SW[1] | SW[2] | SW[3] | LED[0] | LED[1] |
|:-----:|:-----:|:-----:|:-----:|:------:|:------:|
|  off  |  off  |  off  |  off  |  off   |  off   |
|  on   |  off  |  off  |  off  |  off   |  on    |
|  off  |   on  |  off  |  off  |  off   |   on   |
|  on   |   on  |  off  |  off  |  off   |   on   |
|  on   |  off  |  off  |   on  |   on   |  on    |
| off   |  off  |  off  |   on  |  off   |  off   |
| off   |  off  |  on   |   on  |  off   |  off   |

(備考) SW[2]=on SW[3]=onのとき，LED[0],LED[1]はSW[0]とSW[1]のOR出力になっていることが分かります．


#まとめ
[「FPGA上で動くニューラルネットワーク・ジェネレータを作った」](http://qiita.com/kotauchisunsun/items/f19e400f47bd06445361)で作ったニューラルネットワーク・ジェネレータ（もしくはそれから生成されたコード）を用いて，DE0-Nano-SoC(Atlas-SoC)で動くニューラルネットワークを作成し，実際動作することが確認できました．
CodeDeployにおける再デプロイとロールバック


## 概要

CodeDeployで、既にファイルがあるところにデプロイをした際に
`File already exists at location`的なエラーで失敗し
結局どういう挙動をしているのかさっぱりだったので、関連する箇所を読みました。

以降はこちらの記事の英訳：[Redeployments and Deployment Rollbacks](http://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-steps.html#deployment-rollback)

## 再デプロイとデプロイのロールバック

CodeDeployは再デプロイを
「以前デプロイしたリビジョンの新しいデプロイ」として扱います。
リビジョンの再デプロイについては[Deploy a Revision](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-deploy-revision.html)をご覧ください。

CodeDeployはデプロイのロールバックを直接的にサポートしていません。
というのも、既にデプロイされたファイルを完全に消去する手段ではなく
過去のリビジョンをデプロイグループに再デプロイする方法を提供しています。

しかし、過去のリビジョンを新しくデプロイすることによって
ロールバックのようなかたちを再現することはできます。
詳細については[Deploy a Revision](http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-deploy-revision.html)をご覧ください。

たとえデプロイグループから何かを削除したいとしても
CodeDeployは既に配置されたものを消去するようなことはしません。

再デプロイやロールバック（のようなもの）を行う際に
まずCodeDeployは最後にデプロイが成功したときのファイルを削除します。
これはcleanupファイルをチェックすることにより行われます。

```file_for_Amazon_Linux,_Ubuntu_Server,_and_RHEL_instances)
/opt/codedeploy-agent/deployment-root/deployment-instructions/deployment-group-ID-cleanup
```

```file_for_Windows_Server_instances
C:\ProgramData\Amazon\CodeDeploy\deployment-instructions\deployment-group-ID-cleanup 
```

このファイルが存在する場合、CodeDeployは新しいデプロイを始める前に
ここに載っているすべてのファイルを削除します。

例えば、以下の最初の2つのテキストファイルとスクリプトファイルは
既にEC2上で動くWindowsサーバに既にデプロイされており
残りの2つのファイルはデプロイのライフサイクルイベントの間に作られたとします。

```
c:\temp\a.txt (previously deployed by AWS CodeDeploy)
c:\temp\b.txt (previously deployed by AWS CodeDeploy)
c:\temp\c.bat (previously deployed by AWS CodeDeploy)
c:\temp\d.bat (previously deployed by AWS CodeDeploy)
c:\temp\e.txt (previously created by c.bat)
c:\temp\f.txt (previously created by d.bat)
```

cleanupファイルには最初の4ファイルだけが載っています。

```
c:\temp\a.txt
c:\temp\b.txt 
c:\temp\c.bat 
c:\temp\d.bat 
```

新しいデプロイの前に、CodeDeployはこれらのファイルを削除しますが
残り2つのテキストファイルは放置されます。

```
c:\temp\a.txt will be removed
c:\temp\b.txt will be removed
c:\temp\c.bat will be removed
c:\temp\d.bat will be removed
c:\temp\e.txt will remain
c:\temp\f.txt will remain
```

再デプロイやロールバックのプロセスにおいて
CodeDeployは過去のデプロイにおけるスクリプトで行われたアクションを
元に戻したり帳尻を合わせたりということをしません。

例えば`c.bat`と`d.bat`が「`e.txt`と`f.txt`が既に存在する場合は再生成しない」
というロジックを含む場合、たとえ何度`c.bat`と`d.bat`が実行されても
`e.txt`と`f.txt`の古いバージョンは放置され続けます。

`c.bat`と`d.bat`には、新しいものを生成する前には毎回
`e.txt`と`f.txt`の古いバージョンをチェックして削除するロジックを加えるべきです。

## まとめ

訳している本人にも最後の方はなんのこっちゃでしたが、要点は以下かと思います。

* CodeDeployはリビジョンを完全に元に戻す機能を提供しない
* cleanupファイルに記載されたファイルは次のデプロイで一度削除される
* Deployでの直接生成以外の方法で配置されたファイルが害になる

トリッキーな仕様なので、ある程度はhooksのスクリプトで調整が必要そうです。

[こちら](https://forums.aws.amazon.com/thread.jspa?threadID=169277)の記事などでファイルの上書き（overwrite）関連の機能が望まれており
GitHubのIssueにもあがっていましたが、実現には至っていないようです。
1ヵ月で取得するAWSソリューションアーキテクト (2日目)

#概要
もう2日目も終わりですが…
1日目で書いてなかった大事なことを振り返っていこうと思います。

##AWSの全体像
AWSって個人的にはEC2とS3ってイメージが強いんですけど、
色々あるんですよね…

というわけで改めて役割別の代表的なサービスを並べていってみようと思います。
ボリュームが多いので2日に分けようと思います。

###◆コンピューティング
1.Amazon Elastic Compute Cloud（Amazon EC2）

まずは代表的なEC2ですね。いわゆる仮想サーバを提供してくれるサービスです。
ちなみに覚えておく用語としては以下の2点としておきます。

　・Amazonマシンイメージ(AMI) = 仮想サーバの起動元となるマシンイメージ
　・インスタンス = マシンイメージから起動された状態の仮想サーバ

![image](https://qiita-image-store.s3.amazonaws.com/0/138274/3ab5b055-ce05-1228-c3f7-42100605a7e5.png)

2.Amazon EC2 Container Service (ECS)

次にECSと呼ばれるサービスです。
これはDockerというコンテナ型の仮想化ソフトウェアを最初から搭載した形で
EC2クラスター上でインスタンスを提供してくれて、しかも管理まで自動で行ってくれるようです。

ユーザーはDockerの管理を行う必要はなく、インスタンスを追加するだけで良いみたいですが、
どこまで本当なんだか怪しいところですね…

ちなみにコンテナ型仮想化の説明はここ↓を参照。

【図解】コレ１枚で分かるコンテナ型仮想化とDocker
<http://blogs.itmedia.co.jp/itsolutionjuku/2015/05/docker.html>

![image](https://qiita-image-store.s3.amazonaws.com/0/138274/1dd41e44-08fb-c26d-3739-7b7e5354b19b.png)

3.Elastic Beanstalk

AWSのインスタンス上にアプリケーションを迅速にデプロイする機能とのこと。

 Java、.NET、PHP、Node.js、Python、Ruby、Go、Docker 

サポートしているのは上記で構成されているWebアプリケーションとのことですが、
言葉だけだとどうもイメージできないですね…

動きとしてはユーザーはアプリケーションをアップロードするだけで、
Elastic Beanstalk が自動的にスケーリングし、容量のプロビジョニング、
負荷分散、アプリケーションの状態をモニタリングしてくれるとのこと。

![image](https://qiita-image-store.s3.amazonaws.com/0/138274/d0ea8a60-5836-dea2-d399-56829f8c4b54.png)

4.Lambda

こちらはとりあえずAmazon様のお言葉をそのまま拝借したいと思います。

```
AWS Lambda は、コードを AWS Lambda にアップロードすると、
サービスがAWS インフラストラクチャを使用して
コードの実行を代行するコンピューティングサービスです。

```
自動でコードを実行してくれるサービス？
ジョブ管理のようなイメージでよろしいのでしょうか？

あんまりイメージがつかないため、もう少し掘り下げてみますと…

```
・Amazon S3 バケットまたは Amazon DynamoDB テーブルのデータ変更などの
　イベントに対応して AWS Lambda がコードを実行する
　イベント駆動型コンピューティングサービスとして。

・Amazon API Gateway を使用した HTTP リクエストまたは AWS SDK を使用した
　API 呼び出しに対応してコードを実行するコンピューティングサービスとして。

```

![image](https://qiita-image-store.s3.amazonaws.com/0/138274/6028f63f-a15e-1f50-0e9d-6cd29d7f5491.png)

どうやら、すごく便利な代物のようですね。

イベントドリブンなアプリケーション開発を行う際に考慮すべきスケーリングや
耐障害性も利用者は意識することなく利用できるようになっているとのこと。

スケーリングはイベントの発生レートを自動分析し、AWSの裁量で自動的に行うようです。
そして、利用可能な言語は以下の3つのようです。

Node.js – v0.10.36, v4.3.2 (推奨)
Java – Java 8
Python – Python 2.7

Lambda 実行環境と利用できるライブラリ
<https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html>

(2016/9/14日修正 okanikaniさん、ありがとうございました！)

処理はLambdaファンクション(Node.js)で定義し、カスタムのイベントは
JSON形式にすれば他のアプリケーションに任意のデータを渡すことが可能とのこと。

ただし、処理の終了時点でデータが破棄されてしまうため、
ステートレスな形式で実装するか永続的にデータを保存する場合は
S3やAmazon DynamoDBなどを利用するのが良いとのこと。

###◆総括
今日、触れるのはコンピューティングの部分までにしておきます。
AWSと一口に言いますけど、サービスの幅が広いですし、
あたりまえですが、本当に各サービス色々と考えて作られてますね。

それに最新鋭の技術を積極的に採用しているのもAWSのすごいところだと改めて感じました。
(勉強してんのか？ってツッコミは受け付けません)

それと実際のAWSインスタンスを使用した検証が始まるまでの
主にWebなどで調べた記事に関するご質問は受けませんので悪しからず。
(情報・私の認識違いに関するツッコミは↓のコメントまでお願いします)

それでは眠いので、また！
ElasticBeanstalkの ecs-agentがcpuを食う問題

# TL;DR
- ElasticBeanstalk w/ Multi-Container Docker の Base-Platformのlatest(2016/09/14現在) だと ecs-agent のcpuがどんどん積み上がっていく問題
- 対象のbase-platform ``` 64bit Amazon Linux 2016.03 v2.1.6 running Multi-container Docker 1.11.2 (Generic) ```
- 原因不明 (おそらく ecs-agentのバグ)

## 2016/10/11追記
- 2016/10/11時点のlatestの ``` 64bit Amazon Linux 2016.03 v2.1.7 running Multi-container Docker 1.11.2 (Generic) ``` で問題が起きないことを確認

# 動かしているContainer
- supervisord経由で起動しているruby (alpine:3.4)
- nginx (alpine:3.4)
- td-agent (ubuntu:16.04)
- mackerel-agent (alpine:3.4)
- ecs-agent

# グラフ
- mackerel-plugin-docker で計測している Docker CPUのグラフ
  - <img width="470" alt="ecs-agent_docker_cpu.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/3447/140de377-26d7-82ef-9fac-78bc5a1251b8.jpeg">

- mackerel-plugin-docker で計測している Docker Memoryのグラフ
  - <img width="490" alt="ecs-agent_docker_memory.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/3447/9ac14b21-405f-067a-68d0-424c40af3128.jpeg">

- mackerel-plugin-linux で計測している Linux Context Switchesのグラフ
  - <img width="470" alt="linux_context_switches.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/3447/efd059e9-c74b-7340-1031-24eb126c6492.jpeg">

- ElasticBeanstalkのMonitorのCPU Utilizationのグラフ
  - <img width="1382" alt="eb_cpu_utilization.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/3447/3fe27577-b2bb-75fd-e1fb-925ea07ab96d.jpeg">

# 原因
- 特定できていない

# 対処
- base-platformを ```64bit Amazon Linux 2016.03 v2.1.3 running Multi-container Docker 1.11.1 (Generic) ``` にしているときは、問題が起きていなかったので、base-platformの変更で回避
git rebaseでinitial commitをまとめる

gitコマンドのTIPSです。
2個だけコミットがあり、その２つをrebaseでまとめたい時、`git rabese -i HEAD^^`を実行してもinitial commmitが表示されません。
代わりに以下のコマンドを発行すると、ちゃんとinitial commitもrebaseできます。

```shell-session
$ git rebase -i --root
```

```
pick 8ffb8da first commit
pick bda2f1d test

# Rebase bda2f1d onto c38fdf9 (2 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
```
Bootstrapで縦線のメニュー

アイコンは http://fontawesome.io/ のアイコンを使う感じで。
bootstrapのGlyphiconsを使う場合は&lt;i class="fa fa-xxx"&gt;&lt;/i&gt;を&lt;span class="glyphicon glyphicon-xxx"&gt;&lt;/span&gt;に変更して使ってください。

```html
<ul class="nav nav-pipe">
	<li class="active"><a href="#"><i class="fa fa-xxx"></i> メニュー</a></li>
	<li><a href="#"><i class="fa fa-xxx"></i> メニュー</a></li>
	<li><a href="#"><i class="fa fa-xxx"></i> メニュー</a></li>
	<li><a href="#"><i class="fa fa-xxx"></i> メニュー</a></li>
</ul>		
```

```css
.nav-pipe {
	font-size:0;
}
.nav-pipe > li {
	font-size:14px;
	display:inline-block;
}
.nav-pipe > li+li {
  border-left: 1px solid #ccc;
}
.nav-pipe > li:first-child > a {
	padding-left:0;
}
.nav-pipe > li:last-child > a {
	padding-right:0;
}
.nav-pipe > li > a {
	padding:0 10px;
}
.nav-pipe > li > a:hover,
.nav-pipe > li > a:focus {
	background-color:transparent;
}
.nav-pipe > li.active > a,
.nav-pipe > li.active > a:hover,
.nav-pipe > li.active > a:focus {
	font-weight:700;
	background-color:transparent;
	color:inherit;
}
```
CSSの教科書を読んで自分なりにまとめてみたこと（第1章）

## はじめに
谷拓樹さんの[WEB制作者のためのCSS設計の教科書](https://www.amazon.co.jp/dp/B00M0ESXUI/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1 "WEB制作者のためのCSS設計の教科書")を読み、自分なりにまとめたものです。

自分のメモとして残しておきたいので、詳細を多少端折っていますので、気になる方は購入してみてください。

数回に分けて投稿する予定です。


※追記
第２章のリンクを下部に追加しました。
2016/09/22　コード部分を見やすく変更しました。

## css設計の重要性

運用期間が長く、規模が大きくなっていくwebサイト、アプリケーションのコードの管理をしていくのは大変。
コードを無駄に肥大化させず、思いもよらないバグを招かないようなコードを書くということは容易ではない。その為には、自分だけが理解し易いコードを書くのではなく、誰にでも理解しやすいコードを書くことが重要である。

# 開発に欠かせない設計

昨日まで単色の淡いベージュ色だった背景を、今日には青と白のストライプに変更すると言われれば、予め変更しやすいようにCSSを設計する必要がある。どのような変化に対しても全く手を付ける必要の無いCSSを書くことは不可能。だが、いかにしてメンテンス効率を下げずに、また、少ない工数で改修ができるようにするためにを考える必要がある。

# より良いCSSをのゴール

Googleのエンジニア フェリップ・ウォルトンによると、 以下ブログ↓
http://article.enja.io/articles/css-architecture.html

- 予測しやすい
期待通りに振る舞うかどうか。他のルールが影響して記述したルール通りの振る舞いや見栄えにならない、追加したルールが他のルールに影響を与えることがない。
<br>

- 再利用しやすい
コピペされて膨らみ続けるCSSにならないためにも、再利用しやすいルールをもつことは重要。
<br>

- 保守しやすい
新しいルールを追加・更新するときに、既存のルールのリファクタリングを必要としないことが重要。追加したルールによって既存のルールを壊してしまうことは避けるべき
<br>

- 拡張しやすい
自分と自分以外の開発者にとって、メンテナンス・管理がし易いものである必要がある。サイトが大きく、複雑になった際にも拡張しやすいものになっているかどうか。また他の開発者が関わるプロジェクトにおいてそのCSSの設計の学習コストも低くあるべき。
<br>

# 破綻しやすいCSS

##### htmlに依存している

```html:test.html
<article>
  <h1>ブログのタイトル</h1>
 <div>
   <p>ブログの本文</p>
 </div>
</article>
```

```css:test.css
article h1 {
  border-bottom: 2px;
  font-weight: bold;
  ….
}

```

```html:test.html
<article>
  <h2>ブログのタイトル</h2>
 <div>
   <p>ブログの本文</p>
 </div>
</article>
```

```css:test.css
article h2 {
  border-bottom: 2px;
  font-weight: bold;
  ….
}
```


htmlの構造が変化した際に、CSSまで変更しなくてはならない。
そこで、

```html:renew.html
<article>
  <h1 class=“entry-title">ブログのタイトル</h1>
 <div>
   <p>ブログの本文</p>
 </div>
</article>
```

```css:renew.css
entry-title {
  border-bottom: 2px;
  font-weight: bold;
  ….
}
```

とすれば、構造が変化した際にもCSSの変更は必要無くなる。
<br>

##### スタイルを取り消している

```css:test.css
.title {
border-bottom: 2px;
margin-bottom: 1em;
padding: 10em;
font-size: 24px;
font-weight: bold;
}
```

```css:test.css
.no-border{
padding-bottom: 0;
border-bottom: none;
}
```

下線が不必要なデザインの見出しが必要になり始めた場合。
取り消すCSSの記述が増える。

```css:test.css
.title {
margin-bottom: 0.5em;
font-size: 2em;
}
```
```css:test.css
.headline{
  padding-bottom: 10px;
  border-bottom: 2px solid #000;
}
```

コードを取り消すものと比べて、コード量が減っている。定義したルールを取り消すのではなく、追加していくことを考える。
<br>

##### 絶対値を多様している

```css:test.css
.intoduction {
  line-height: 27px;
  font-size: 18px;
}

.lead{
  line-height: 27px;
  font-size: 18px;
...
}
```

```css:test.css
.intoduction {
  line-height: 1.5;
  font-size: 18px;
}

.lead{
  line-height: 27px; #親の継承によって不必要
  font-size: 18px;
...
}
```
このリファクタリングのポイント

・line-heightを相対値にすることで、フォントサイズが変わっても同じ倍率を保つ
・子要素に継承するので、指定の必要がない
・単位の無い値にすることで、その要素のフォントサイズに対する倍率で行送りが計算される

## モダンなサイト構築ワークフロー
一気に機能を作ってから見直すウォーターフォール型のワークフローから、機能ごとに短いサイクルで検証を繰り返すアジャイル型のワークフローが主流に。

要件定義→設計→実装→検証



2章に続く。
http://qiita.com/poster-keisuke/items/5d4f1e74b7f9155cfdaf
Android N で permission の設定をする

Android M(SDK 23) から permissions の扱いが変わっていますが, N(SDK 24)では permissions の設定がまたさらに変わっているようです.

## sdcard からファイルを読みたい.

漢だったら, アプリ開発時には `/sdcard` からファイルを読み書きしたいですね!

しかし NDK で `fopen`, `ifstream` などで `/sdcard` にアクセスしようとするとファイルが見つからないというエラーが出るようになります(Java レイヤーでもそうですが).

そのため, `AndroidManifest.xml` で `READ_EXTERNAL_STRAGE`, `WRITE_EXTERNAL_STRAGE` の permission を設定する必要があります.

```
    <uses-permission-sdk-m android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission-sdk-m android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```

https://github.com/googlesamples/android-RuntimePermissions

を見ると, `uses-permission` ではなく `uses-permission-sdk-m` が推奨のようです.

## Android N

Android M では上記の設定で `/sdcard` からのファイルが読み書きができるようですが, Android N ではこれだけでは不十分で, さらに実行時にユーザに permission の許可を求める必要があります.

でも NDK で C++ でアプリ作っている時に, 上記サンプルのように Java で permission を求めるコード書くのはめんどくさすぎですね...

一旦 apk をインストール後, Android 実機で Settings -> Apps -> YOUR_APP -> Permission で設定できました. これで `/sdcard` を読み書きできるようになります.
(apk 上書きでアップデートの場合は permission は引き継がれるっぽい)


## TODO

* **優秀な Android N 若人を, 合法的なあらゆるどんな手段を使ってでも探し出し, 優秀な Android N 若人が自ら Android 開発の高みを極めてくれるスキームを確立したい**
9/13　今日の学習内容〜リンクの作成について学習〜

###今日の学習内容
***
今日は、リンクの作成について学習していきました。

[改定3版基礎RubyOnRails](https://www.amazon.co.jp/dp/4844338153)を読み進めていると、RailsのAction Viewには、リンクや画像のためのタグを簡単に生成するヘルパーメソッドが用意されているとあったのですね(￣▽￣)

リンク用のタグ（HTMLでいうaタグ）を作る時は、``link_to``メソッドを使うようです。

第一引数にリンクのテキストを書き、第二引数にリンク先のパスを指定します。

試しに、トップページへのリンクを作成してみましょう( ´ ▽ ` )ﾉ

まず、``lesson_controller.rb``に、空のアクション``practice9``を作成します。

![スクリーンショット 2016-09-13 23.25.19.png](https://qiita-image-store.s3.amazonaws.com/0/137880/d2a04fba-5423-c714-d4bf-69a4b341ddac.png)

作成したアクションと同じ名前のテンプレートのファイルを作成しましょう↓

![スクリーンショット 2016-09-13 23.26.07.png](https://qiita-image-store.s3.amazonaws.com/0/137880/7ba2fe70-94cb-55e7-98cf-89470f415d1b.png)

``root_path``はルートディレクトリ（つまり、ここではトップぺージ）を指すことになります。

``rails s -b $IP -p $PROT``でRailsサーバを起動し、ページを開いてください(￣▽￣)
この時に、ちゃんとアプリケーション名のディレクトリに移動しているか確認してくださいね。

私と同じように、これまでの学習を進めてこられた方は、以下のようなトップページが開かれます。↓

![スクリーンショット 2016-09-13 23.23.08.png](https://qiita-image-store.s3.amazonaws.com/0/137880/daf30d38-530e-cb44-dc2c-c9d1a7f434d0.png)

今回は、リンクを作る練習なので、先ほど作成した``practice9``を実行しましょう。
URL欄に``/lesson/practice9``を付け加えてリロードしてください。

![スクリーンショット 2016-09-13 23.22.51.png](https://qiita-image-store.s3.amazonaws.com/0/137880/e7a7144b-14ad-65bb-697a-5d144fb717ab.png)

↑先ほど指定したHOMEという名前のリンクが表示されましたね。

実際にリンクをクリックしてみてください。
以下のページに移動するはずです↓

![スクリーンショット 2016-09-13 23.23.08.png](https://qiita-image-store.s3.amazonaws.com/0/137880/5d06a4b8-1306-902a-e54a-e71a534bc3ab.png)

うまくトップページに移動したでしょうか(・ω・)ノ


###あとがき
***
今日はリンクの作成について簡単に書いていきました。
最近、あまり書けてないようなので、もう少し書く速度を上げてたいですね。
まずはタイピングからでしょうか？（笑）

ここまで読んでくださり、ありがとうございましたm(__)m

###参考にさせていただいたサイト・文献
***
- [改定3版基礎RubyOnRails](https://www.amazon.co.jp/dp/4844338153)
- [cloud9](https://ide.c9.io/)
[JavaScript] lodashのmemoizeで演算結果をキャッシュして高速化

最近Node.jsをやっているのでlodashの[ドキュメント](https://lodash.com/docs/4.15.0#memoize)を見ていると、あまり使ったことないFunctionを発見。

## _.memoize(func, [resolver])
> Creates a function that memoizes the result of func

と書いている。
Functionの処理結果をキャッシュしてくれるらしい。

## 使ってみる
こんな処理に時間がかかるFunctionがあった場合に

```js
function someCalculateFunc(someValue) {
  var result = {}
    ;
  
  // 数秒かかる長くて辛い処理
  
  return result;
}
```

こんな感じで呼び出すと時間かかる処理でもすごく早くなる

```js
var value = _.memoize(someCalculateFunc)
    ;

// 最初は時間かかるけど
value(someValue1);
// キャッシュされてるので2回目以降は計算結果を取り出すのみ
value(someValue1);
value(someValue1);
value(someValue1);
value(someValue1);
```

## 第二引数のresolver・・・なんだろう？
第二引数にはresolverというものが指定されていて、良くわからなかったのであれこで調べてみる。
どうもキャッシュのキーを指定するもののようで、いろいろ試してみると動きがよく分かった。

```js
// 結果をキャッシュしたい関数
function someCalculateFunc(value1, value2) {
  var result = 0
    ;

  // 適当な計算
  for (var i = 0 ; i < 10000 ; i++){
    result += value1 + value2
  }

  return result;
}

// キャッシュキー
function resolver(value1) {
  // 引数には、someCalculateFuncで渡した引数が入ってくる
  // console.log(arguments);

  // ここでは第一引数のものをキャッシュのキーとする
  return value1;
}


var value = _.memoize(someCalculateFunc, resolver)
  ;

for (var i = 0; i < 10; i++) {
  value(500 + i, 999 + i);
}

console.log(value.cache.get(501)); // ->value(501, 1000)のキャッシュが取得できる
```

valueのcacheの中身を覗いてみると、

```js
console.log(value.cache.__data__.hash);

// ↓このようにkey / valueで保存されている
Hash {
  __data__:
   { '500': 14990000,
     '501': 15010000,
     '502': 15030000,
     '503': 15050000,
     '504': 15070000,
     '505': 15090000,
     '506': 15110000,
     '507': 15130000,
     '508': 15150000,
     '509': 15170000 } }
```

使い所の判断が難しそうだけど、使いようによってはかなり高速化出来るかも。
複数の show variables (MySQL)


こんにちは。
MySQL で、```show variables``` を行うには、下記のように単純ですが、

```mysql
mysql> show variables like 'group_concat_max_len';
+----------------------+------------------+
| VARIABLE_NAME        |   VARIABLE_VALUE |
|----------------------+------------------|
| group_concat_max_len |           262144 |
+----------------------+------------------+
```

複数を一括表示するには下記のようにすれば良いようです。

```mysql
mysql> set @variables = 'group_concat_max_len sort_buffer_size';
mysql> select * from performance_schema.global_variables where @variables like concat('%', variable_name, '%');

+----------------------+------------------+
| VARIABLE_NAME        |   VARIABLE_VALUE |
|----------------------+------------------|
| group_concat_max_len |           262144 |
| sort_buffer_size     |           262144 |
+----------------------+------------------+
```
RailsのAWS環境構築で出たエラーまとめ

RailsのAWSの環境構築で苦しんだためエラーをまとめます。

#Permission denied (publickey).
コンソールからssh接続する際のエラーが出ました。
これはただ単にインスタンスをキーペアに紐付けていなかったために起こりました。インスタンスを作成する際の最後にキーペアを作成する場面があるのでそこでキーペア作成を忘れないように。

#Error: Need to pass a list of pkgs to install

コンソールより、yum installしようとした際に発生。
以下コマンドで解決。
コピペなので、なぜ解決したかわからず。。。

```
sudo yum update
sudo yum list updates
sudo rpm -qa
sudo yum install
```

#Bad owner or permissions
git cloneする際に発生。
configの権限を変更して解決。
その他にも.sshのファイル権限を700にしないと起こる可能性もあるらしいです。

```
[.ssh] chmod 600 config
//以下のコマンドでHiと帰ってきたら成功
ssh -T git@github.com
```

#rake aborted!cannot load such file -- bundler/setup
bundler入れてなかった。。。


```
gem install bundler
bundle install
```

#[emerg] unknown directive
nginxに起動時に出ました。
ただ単にいらないかっこが入っていました。

# 403 forbidden error
nginx起動　＝＞　ついにアクセスってとこで出ました。
railsのアプリケーションフォルダのパーミッションを755に変更すると解決。
その他、homeフォルダのパーミッションも気をつけないと変わっている可能性があるため、755になっているか確認。
WindowsのDockerで溜まったコンテナやイメージを削除する

コマンドプロンプトの`for`が妙にむずいのでメモ.

# 停止中のコンテナをすべて削除する
```:コマンドプロンプト
for /f "usebackq" %x in (`docker ps -aq`) do docker rm %x
```

# 起動中のものを含むすべてのコンテナを削除する
```:コマンドプロンプト
for /f "usebackq" %x in (`docker ps -aq`) do docker rm -f %x
```

# 参照されていないイメージをすべて削除する
```:コマンドプロンプト
for /f "usebackq" %x in (`docker images -q`) do docker rmi %x
```
Linux環境で画像ファイルの情報を確認する方法

Linuxのコマンドライン環境で作業をする際に、画像ファイルの情報を確認したい場合や簡単な加工をしたい場合があったので、その方法を備忘録として投稿します。

## 環境
* Ubuntu 14.04.5 LTS

## コマンド

### 画像ファイルの種類と画素数を確認

```
$ identify sample_01.jpg 
sample_01.jpg JPEG 3000x1993 3000x1993+0+0 8-bit DirectClass 2.886MB 0.120u 0:00.120
```

### 画像ファイルのより詳細な情報を確認

```
$ identify -verbose sample_01.jpg
Image: sample_01.jpg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Class: DirectClass
  Geometry: 3000x1993+0+0
  Resolution: 350x350
  Print size: 8.57143x5.69429
  ・
  ・
  ・
  Elapsed time: 0:01.179
  Version: ImageMagick 6.7.7-10 2016-06-01 Q16 http://www.imagemagick.org
```

### 画像の縦横の長さを720x390にリサイズ

```
$ convert -geometry 720x390 sample_01.jpg img_01_01.jpg
```

### 画像の大きさを60%に縮小

```
$ convert -geometry "60%" server.jpg server_60.jpg 
```

### (x,y)=(160, 0) を始点から (w,h)=(960,720)で切り出し

```
$ convert -crop 960x720+160+0  src.png  dest.jpg
```
platformio で最新の esp8266/Arduino を使う


PlatformIO で git HEAD な [esp8266/Arduino](https://github.com/esp8266/Arduino/) を使いたい。

オフィシャルドキュメントの[Using Arduino Framework with Staging version](http://docs.platformio.org/en/latest/platforms/espressif8266.html#using-arduino-framework-with-staging-version)に載ってるやり方通り。 ~/.platformio/ 以下のを置き換えてしまうという割と強引な方法でできる。

```
rm -rf ~/.platformio/packages/framework-arduinoespressif8266
git clone https://github.com/esp8266/Arduino ~/.platformio/packages/framework-arduinoespressif8266
cat << EOF > ~/.platformio/packages/framework-arduinoespressif8266/package.json
{
    "description":"Arduino Wiring-based Framework (ESP8266 Core)",
    "name":"framework-arduinoespressif8266",
    "system":"all",
    "url":"https://github.com/esp8266/Arduino",
    "version":"1.20300.0"
}
EOF
```
RustでWebassemblyの調査をしたけど惜しかった話

RustでWebassemblyが出来るとハッピーだなーと思い、[mir2wasm](https://github.com/brson/mir2wasm/) を使って、
**現時点**でのRust+Webassemblyを調査してみました。

## 環境

1. OSX Yosemite
2. Chrome バージョン53.0.2785.101

## 用意するもの

1. rustup（nightlyが必要）
2. Webassemblyを有効にしているChrome
3. mir2wasm（Rustからwastをつくるやつ）
4. sexpr-wasm（wastからwasmに変えるやつ）
5. HTTPサーバー（python2 -m SimpleHTTPServerなどなど）

## 開発準備

mir2wasm

```
git clone https://github.com/brson/mir2wasm.git
cd mir2wasm
rustup override set nightly-2016-06-04
cargo build
```

sexpr-wasm

```
git clone https://github.com/WebAssembly/sexpr-wasm-prototype
cd sexpr-wasm-prototype
git submodule update --init
make
```

適当にMakefile

```Makefile
WASM_DIR := $(CURDIR)/wasm
MIR2WASM_DIR := $(CURDIR)/mir2wasm
SEXPR_WASM_DIR := $(CURDIR)/sexpr-wasm-prototype/out

WAST := main.wast
WASM := main.wasm

# mir2wasmについているexampleを利用。
RS := $(MIR2WASM_DIR)/rust-examples/fibonacci.rs

$(WASM_DIR)/$(WASM): $(WASM_DIR) $(WASM_DIR)/$(WAST)
	$(SEXPR_WASM_DIR)/sexpr-wasm $(WASM_DIR)/$(WAST) -o $(@)

$(WASM_DIR)/$(WAST): $(WASM_DIR)
	cd $(MIR2WASM_DIR) && \
	cargo run -q -- $(RS) > $(@)

$(WASM_DIR):
	mkdir -p $(@)
```

構成はこんな感じ。
.
├── Makefile
├── mir2wasm
└── sexpr-wasm-prototype

## ブラウザで確認

makeするとRustのコードがwasmになるので、それをJSで読み込みましょう。
（ローカルファイルだと実行されないので、サーバーからアクセスできるにしましょう）

```html
<!doctype html>
<html>
  <head><title>WebAssembly</title></head>
  <body>
    <script>
fetch("/wasm/main.wasm")
.then(res => res.arrayBuffer())
.then(buffer => {
  let ffi = {
    spectest : {
      print: function(ptr) {
        console.log(ptr);
      },
    }
  };
  let module = Wasm.instantiateModule(new Uint8Array(buffer), ffi);
  console.log(module.exports.fibonacci_recursive(10))
});
    </script>
  </body>
</html>
```

で、ブラウザで確認すると、

> WasmModule::CompileFunctions(): Compiling WASM function #4:<?> failed:Result = arity mismatch in return @+42

みたいなエラーがでると思います。

## wastを修正して、wasmを再作成

でどうしたらいいかというと、mir2wasmで吐き出されているwast（S式みたいなやつ）を
直接修正して、もう一度wasmにしてあげましょう。

fibonacci.rsがwastだと、↓の関数の式の

- $_i32_as_AddAssign_::add_assign
- $wasm::print_i32
- $main

```
- (return
-   (get_local $<数値>)
- )
```

返り値がないのに、値を返しているっぽいところを削除する。(mir2wasmのバグ？）
再度sexpr-wasmでwastからwasmを作って、エラーが表示されない場合は大丈夫です。

# まとめ

頑張ればmir2wasmを利用してRustからWebassemblyのバイナリがつくれます。
まだ完全じゃないけど、なんとなく雰囲気は掴めたとおもいます。

将来、RustでWebassemblyが簡単にできるようになればいいですね。
Bluemix仮想サーバーのセキュリティーグループ管理

#はじめに
[「Bluemix上にテスト用のLinux環境(仮想サーバー)を作ってみた」](http://qiita.com/tomotagwork/items/0dfb5818c7dfd45ae044)の続きです。
仮想サーバーを作った後で、作成時に指定したセキュリティー設定の変更方法が分かりにくかったのでまとめておきます。


#仮想サーバー設定確認
計算 - 仮想サーバーと辿って仮想サーバーの詳細画面を見ると、設定内容は確認できるが、設定変更ができそうなリンクが全く無い。
仮想サーバーの画面でできそうな操作としては以下の項目くらいです。

* 仮想サーバーの始動/停止/削除
* スナップショットの作成
* パブリックIPアドレスの割り当て

セキュリティー・グループの設定変えたかったのですが、ここからではどうも変更できなさそうです。
(なので、最初変更そのものが出来ないのかと思ってしまった。)
![image01.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/b994a629-c86f-5a0f-c3e1-3e4cd280ae22.jpeg)

#セキュリティー・グループの管理
セキュリティー・グループの管理は別のメニューから行う必要があります。
ベータ版だからですかねぇ、すごーく分かりにくい。(もしくはこういう文化に慣れてない私が悪いのか？)
ネットワーク を選択して、 Network Security Groupsのサービスを選択します。作成されてなければ、右上の「+」を押して新規に作成して下さい。
![image02.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/67497da6-e2a5-e89c-6ad0-1fcf9efd2871.jpeg)

「Security Groups」のタブで、セキュリティー・グループの管理(セキュリティー・グループの作成、設定変更等)ができます。
![image03.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/60472d30-ae65-9cd2-6f11-e2f00c953d61.jpeg)

「Instances」のタブで、どのセキュリティー・グループをどの仮想サーバー・インスタンスに割り当てるかを指定できます。ここで設定の切り替えができるんですねー。
![image04.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/3382d528-13ba-0875-84d9-ead44a800f35.jpeg)

「Graphical Visualization」のタブでは、設定内容がグラフィカルに表示されます。
![image05.jpg](https://qiita-image-store.s3.amazonaws.com/0/132331/6c17707e-63ad-b568-2dd5-0d08778f4d50.jpeg)

ちなみに上の例はBluemix UIを使った例ですが、Bluemixの仮想サーバーはOpenStackベースなので、OpenStackClientを使った管理もできるようです。

#参考
Bluemix資料
[IBM 仮想サーバー](https://new-console.eu-gb.bluemix.net/docs/virtualmachines/vm_index.html)
[Network Security Groups](https://new-console.eu-gb.bluemix.net/docs/services/networksecuritygroups/index.html)
Hiveで型がarrayのカラムを展開して条件に使う方法

# はじめに
TDを業務でつかっているのですが、テーブルのカラムにarrayが入っている場合にwhereでどのように使うかわからなかったので調べた時のメモ

# 使用データ

例として下記のようなデータをつかいます

table_name: user_values

| user_id(Int) | values(Array) |
|---------|---------|
|1|["123","abc"]|
|2|["123", "bcd"]|
|3|["789", "cde"]|

このuser_valuesはそのままだとwhereで使えないので、arrayを展開する

```sql
select count(user_id) AS user_cnt from user_fruits
LATERAL VIEW explode(values) exploded_values AS data
 WHERE data = '123'
```

とすると

| user_id | data |
|---------|---------|
|1|123|
|1|abc|
|2|123|
|2|bcd|
|3|789|
|3|cde|

というように結合されるので

↑のクエリの結果は

| user_cnt |
|---------|
|2|

とかなるらしい

へー

## arrayが連想配列だった場合

| user_id(Int) | values(Array) |
|---------|---------|
|1|{"key1":"val1"}|
|2|{"key2":"val2"}|
|3|{"key3":"val3"}|

valuesの値が連想配列

```sql
select key, val from user_values
LATERAL VIEW explode(values) exploded_values AS key, val
```

ってやると

| key | val |
|---------|---------|
|key1|val1|
|key2|val2|
|key3|val3|

とかって返ってくるらしい
ふうん？

# まとめる
頭に描きづらくてなかなか覚えられなそう
とりあえず「ふうん？」くらいしかわからなかったのでメモしておく
Swagger でかんたんモックAPIをつくる


## swaggerとは
RESTfulなAPIを定義、表現する便利ツールです。
インタラクティブなドキュメント生成をサポートしてくれます。現在v2.0系。
REST APIを仕様化する、周辺ツールもあるよ。

| Tools | |
|---|---|
| Swagger UI | Swaggerの仕様をAPIのドキュメントとして表示できる|
| Swagger Editor | Swaggerの仕様書をYAMLを使って記述できるブラウザ上のエディタ |
| SDK GENERATORS | Swagger Codegenというツールを使って各SDKにSwaggerを組み込むことができる。NodeJS, Ruby, Python, PHP, JavaのほかScalaもあります |

## さっそくインストールしてみる

npmを使ってインストールするのですが、手始めにnpmを最新化しておきます。

```
$ npm update -g npm
```

`npm install`でswaggerをインストールします。

```
$ npm install -g swagger
```

CLIをつかってswaggerのプロジェクトを作ってみます。
仕事がほしいのでここでは`hello-work`プロジェクトを作成します。

```
$ swagger project create hello-work
```

なんか質問されます。フレームワークなに使ってます？
どれでもないよ…。せめて名前は知ってるので、expressにしておきました。

```
? Framework?
  connect
❯ express
  hapi
  restify
  sails
```

swaggerの組込みエディタがあるので立ち上げてみます。ローカルでサーバ立ち上げてくれます。ポートはランダムみたい。
APIの定義をするYAMLの確認と編集がさくっとできる。便利だなー。

```
$ swagger project edit
```

![Screen Shot 2016-09-13 at 21.24.17.png](https://qiita-image-store.s3.amazonaws.com/0/137527/8a7cb908-a885-7286-f3c8-7d4a9ad8456a.png "Screen Shot 2016-09-13 at 21.24.17.png")

swaggerでAPIドキュメントを書くにはYAMLが書けないとですね。


プロジェクトをサーバーで動かして、ローカルで動くモックとして利用できます。さっそく動かしてみます。

```
$ swagger project start
```

起動すると、`curl`でエンドポイントを叩いてみよと言われるので、素直に従ってみます。

```
try this:
curl http://127.0.0.1:10010/hello?name=Scott
```

よっこらしょっと。

```
$ curl http://127.0.0.1:10010/hello?name=NEET

"Hello, NEET!"
```

おー！返ってきました。
Windows環境＋node.js＋mocha＋istanbulでUTしてコードカバレッジを取る

# 前提環境

以下のようなフォルダ構成になっている環境を前提とする。
Windows 7環境で確認。

> ＋node_modules
> ＋src
> ｜ ＋―ソースファイル.js
> ＋test
> 　 ＋―テストコード.js


# Windows上でもmocha＋istanbulでコードカバレッジを取りたい。

自分向けのメモ書き。

Node.js ＋ Mocha のUT環境で、コードカバレッジを取りたい！で
検索すると、
`npm install mocha istanbul`
したうえで、
`istanbul  cover  _mocha`
で出来る、ってのがヒットするが、これはLinux環境の話。

Windows環境での実行方法は以下になる。
`npm install mocha istanbul`
は同様。この状態で、
`node  node_modules\istanbul\lib\cli.js  cover  node_modules\mocha\bin\_mocha`
すればOK。

もちろん、カバレッジのhtml表示ファイルまで作ってくれる(Linux同様)。
![coverage.png](https://qiita-image-store.s3.amazonaws.com/0/125588/ef1b139e-27d3-b9eb-9c74-c546c50f75c3.png)


ポイントは、
「Windows上の場合は、**node コマンド経由で実行**する。
　このとき、mocha の指定は `.bin\_mocha` **ではなく**、
　`mocha\bin\_mocha` を使う」
ところか。
`mocha` ではなく `_mocha` を指定する理由は以下の参考サイトを参照。


以上。

# 参考にしたページ
[mocha で coverage が動かなくなったので istanbul にした - あいつの日誌β.html]
http://okamuuu.hatenablog.com/entry/2015/12/04/113606

[node.jsのモジュールの、開発着手時の基本構成。 - daikiueda.hatenablog.com.html]
http://daikiueda.hatenablog.com/entry/2015/03/14/103607

[istanbul + mocha設定メモ - なっく日報.html]
http://yukidarake.hateblo.jp/entry/2015/06/29/202652
> mochaコマンドはそのまま渡せないので、_mochaを使う
C#:メルセンヌ素数を利用して完全数を求める


## 完全数とは

小説「博士の愛した数式」で一般の人にも有名になった「完全数」ですが、その完全数を求めるプログラムです。
完全数とは、その数自身を除く約数の和が、その数自身と等しい自然数のことです。

例えば、28 の約数は、1,2,4,7,14ですが、この合計は、1+2+4+7+14 = 28 となりますので、28は完全数ということになります。


## どうやって解くか
この問題を普通にプログラミングすると、約数を求め、その和がそれ自身の数と等しいかどうかを調べてゆくことになります。しかしこのやり方だと小さいほうから最初の４つまではすぐに求まりますが、５つ目、6つ目の完全数を求めようとすると、答えが出るまでかなりの時間待たされることになります。


そのためこのプログラムでは、

「完全数はメルセンヌ素数から導き出される」

という性質を利用することにしました。
2^n-1が素数(メルセンヌ素数)ならば、偶数の完全数は、2^(n-1)・(2^n-1) で求められることが証明されているそうです。

奇数の完全数はまだ発見されていません。奇数の完全数が存在しないことはまだ証明がされていないそうです。

## C#のコード

```csharp:PerfectNumber.cs
  public class PerfectNumber {
      public static IEnumerable<long> Take(int maxcount) {
          int count = 0;
          long n = 2;
          while (count < maxcount) {
              long mp = (long)Math.Pow(2, n) - 1;
              if (PrimeNumber.IsPrime(mp)) {
                  long pn = (long)(Math.Pow(2, n - 1) * mp);
                  count++;
                  yield return pn;
              }
              n++;
          }
      }
  }
```


PrimeNumber.IsPrime()は、[「ミラー・ラビン素数判定法」による素数判定メソッド](http://qiita.com/gushwell/items/ff9ed83ba55350aaa369)で示したメソッドをそのまま利用しています。

このクラスを使い、完全数を小さい順から８つ求めてみます。

```csharp
public static void Main(string[] args) {
    var q = PerfectNumber.Take(8);
    foreach (var n in q) {
        Console.WriteLine(n);
    }
}
```

## 実行結果

結果です。

<pre>
6
28
496
8128
33550336
8589869056
137438691328
2305843008139952128
</pre>

8番目までの完全数ならば、すぐに求まります。

しかし、9番目の完全数は、2658455991569831744654692615953842176 なので、long型では無理みたいです。

ところで、1の位が6か8なのは、単なる偶然なんでしょうか？
Webで調べたところ、見つかっている完全数の1の位はどれも、6か8みたいです。面白いですね。



-------------------------
この記事は、Gushwell's C# Programming Pageで公開したものを加筆・修正したものです。
Akka StreamsでステートフルなFlowを作る方法

`Flow[T].statefulMapConcat` を使う。状態を持ったActorをStreamで書き直したいときに良さそう。

```scala
import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{ Flow, Source }

implicit val system = ActorSystem()
implicit val executor = system.dispatcher
implicit val materializer = ActorMaterializer()

val flow1: Flow[Int, Int, NotUsed] = Flow[Int].map(_ * 10)
val flow2: Flow[Int, Int, NotUsed] = Flow[Int].filter(_ % 3 == 0)
val flow3: Flow[Int, Int, NotUsed] = Flow[Int].statefulMapConcat { () =>
  var sequence = 0
  i =>
    sequence = sequence + i
    List(sequence)
}

Source(1 to 10)
  .via(flow1)
  .via(flow2)
  .via(flow3)
  .runForeach(println)
```

```plain:結果
30
90
180
```
Jenkinsで上流ジョブのシェルで作成したパラメーターを下流のジョブに渡す

下記URLを参考にしました。
http://qiita.com/ogawatti/items/8dcc06430844a7c84665

■上流ジョブのシェルの実行にてファイル書き込み

KEY=VALUEの形で渡す必要があるとの事

```
nowVersion=1
echo "ResourceVersion="$nowVersion > version.txt
```

■上流ジョブのビルド後の処理に**Parameters from properties file**を追加し、
　**Use properties from file**に**version.txt**を入力


■下流ジョブ側の**ビルドのパラメータ化**で文字列(テキストでも可でした)を追加し、
　名前に上流ジョブで**KEY**として書き込んだ**ResourceVersion**を追加


■下流ジョブ側のシェルの実行で受け取れていることを確認

```
echo "Resource"=$ResourceVersion
```
GoのアプリをCircleCIからAppEngineへデプロイする


GAE/GoのアプリをCircleCIからデプロイできるようにしたいと思います。AWSにデプロイするのとは違う感じなので、ドキュメントを読みました。以下はAppEngine Flexible Environment へのデプロイになります。StandardEnvでも参考にはなると思いますが、違う部分もあるので注意してください。
また、flexible envはまだbetaなので、この辺りすぐに変わる可能性があります。


## 公式のドキュメント

このあたりを読めば書いてあります。

- [Authentication with Google Cloud Platform \- CircleCI](https://circleci.com/docs/google-auth/)
- [Continuous Deployment to Google App Engine \- CircleCI](https://circleci.com/docs/deploy-google-app-engine/)

以下では書いてあることを順にやっていきます。

## GCPサービスアカウントの作成

まずは [GCPのコンソール](https://console.developers.google.com/)で 「IAMと管理」のメニューから「サービスアカウント」を作成します。サービスアカウント名を入力して、"新しい秘密鍵の提供"にチェックを入れ、キーのタイプはJSONを選びます。

次にダウンロードしたJSONファイルをbase64エンコードして、その結果をコピーします。

```
base64 <your-service-account.json>
```

CircleCIのプロジェクトの設定からEnvironmental Variableに新たに環境変数を追加します。keyを`GCLOUD_SERVICE_KEY` にして、Valueにさっきコピーした文字列を貼り付けます。

また、同じくCircleCIの環境変数で Keyを`GCLOUD_PROJECT` にして Valueにプロジェクト名を入れておきます。

また、上記ページに書いてないけど必要なこととして、

- GCP Consoleの「APIManager」から、AppEngine Admin APIを有効にする
- GCPConsoleの「IAMと管理」で、上で作成したサービスアカウントを追加して、「プロジェクトの編集者」の権限を付与する

をやる必要がありました。

## circle.ymlを設定する

circle.ymlは以下のように書けます。

`dependencies`の上の4行は、先ほど作成したGCPサービスアカウントを利用してGCPへデプロイするための設定を行っています。
`dependencies`の次の2行は、デプロイする際に必要となるpermissionを設定します。
`dependencies`の下の2行は、プロジェクトに依存するファイルと、デプロイに必要な`aedeploy`を`go get`しています。

`deployment`	では、自分の場合 `app.yaml`が　`app`ディレクトリに置いているので `aedeploy`を実行する前に`cd`しています。

```yaml:circle.yml
machine:
  timezone:
    Asia/Tokyo
dependencies:
  pre:
    - echo $GCLOUD_SERVICE_KEY | base64 --decode > ${HOME}/gcloud-service-key.json
    - sudo /opt/google-cloud-sdk/bin/gcloud --quiet components update
    - sudo /opt/google-cloud-sdk/bin/gcloud auth activate-service-account --key-file ${HOME}/gcloud-service-key.json
    - sudo /opt/google-cloud-sdk/bin/gcloud config set project $GCLOUD_PROJECT
    - sudo chmod -R 757 /home/ubuntu/.config/gcloud/logs
    - sudo chmod -R 757 /home/ubuntu/.config/gcloud/credentials
    - go get -t -d -v ./...
    - go get google.golang.org/appengine/cmd/aedeploy

deployment:
	dev:
		branch: master
	       - cd app && /home/ubuntu/.go_workspace/bin/aedeploy /opt/google-cloud-sdk/bin/gcloud -q app deploy ./app.yaml --promote 

```

## ハマリどころ

- `gcloud app deploy`の実行で permission エラーが結構出ました。サービスアカウントに「AppEngineへのデプロイ」の権限だけ付与してもダメで、結局プロジェクトの編集者の権限を付与しています。

- CircleCIのドキュメントの通りに `gcloud app deploy`を実行しても、Goの場合GOPATH周りがおかしくなり必要なpackageがないとエラーが出てしまうので、 `aedeploy`を使います。


## StandardEnvの場合

[Continuous Deployment to Google App Engine \- CircleCI](https://circleci.com/docs/deploy-google-app-engine/)にあるように、AppEngineSDKを取ってくる必要があります。

```
    - curl -o $HOME/go_appengine_1.9.38.zip https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.38.zip
    - unzip -q -d $HOME $HOME/go_appengine_1.9.38.zip
```

これで`goapp`コマンドを使ったテストができます。
GCMのAPIキー取得でハマったのでメモ

# はじめに
Webプッシュ実装中に、新規にAPIキー取得しようとしてハマったのでメモ

# ことのはじまり
Webプッシュ実装中に、新たに [**Google Developers Console**](https://console.developers.google.com) からAPIキーを取得してプッシュをしてみたら

```html
<HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>
```
※curlを叩いてpushを実行

なんかエラー返ってきたので、curlの構文を変えてみたり色々試行錯誤した末、数日前に作ったAPIキーでプッシュを実行してみた

```json
{"multicast_id":7315148804687651052,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}
```
※無効なregistration_idsで叩いるので、このエラーが出ます

これはちゃんとjsonでエラーが返ってきます
おかしい

ということで
APIキー周りに限定してググってみた

# GCMのAPIキーまわりについてググる

『GCM APIキー　仕様変更』
とかでググると
**FCM (Firebase Cloud Messaging)**
とかいう単語がでてくる
もしかしてこれが関係あるのかなー
と思ってFCMにも関連付けて調べていると

[Amazon SNS: “Platform credentials are invalid” when re-entering a GCM API key that previously worked](http://stackoverflow.com/questions/39417797/amazon-sns-platform-credentials-are-invalid-when-re-entering-a-gcm-api-key-th)
[Androidの新プッシュ通知FCMへの移行](http://blog.kotemaru.org/2016/05/28/android-fcm-sample.html)

この辺に行き着きまして

**『プロジェクト管理が Developer console から Firebase console に変更になります。』**

ほう？

# 結果
[Firebase console](https://console.firebase.google.com)で作ったAPIキーで送れました。

たしかに、Developer consoleからAPIキー作ろうとした時に数日前までキーの種類選ばされてたのに、今は選ばずに作られます。
仕様変更入ったところにもっと早く気付けばよかった。

# まとめ
GCM用にとるAPIキーはこれから[Firebase console](https://console.firebase.google.com)からつくります
アクセシビリティに配慮してアイコンフォントを使う

###アイコンフォントis便利
[Fontawesome](http://fontawesome.io/)や[IcoMoon](https://icomoon.io/)といったアイコンフォントは、ベクターデータをフォントとして扱えるためとても便利です。

![fa.png](https://qiita-image-store.s3.amazonaws.com/0/119598/3130a599-9087-2f93-a0f2-32e6fde8c4a8.png)

### アクセシビリティ問題
しかし、アイコンフォントをそのまま使ってしまうとアクセシビリティ的にはよろしくない。
具体的にはスクリーンリーダーでサイトを読み上げながら閲覧しているユーザーにとっては、アイコンが登場する度に意味不明な情報を聞かされることになってしまいます。
もしアイコンがいくつも並ぶようなページでそのようなことになったら、ユーザーにとっては苦痛でしかないですよね。

### コーディングによるソリューション
ではどうするか。例えば上記画像の「Download」ボタンのアイコンをFontawesomeを使用し実装するとき、以下のようにHTMLコードに一手間加えることで問題を解決出来ます。

```html:index.html
<i class="fa fa-download"></i>
```

…このようにシンプルに書いてもきちんとアイコンが表示されますが、

```html:index.html
<i class="fa fa-download" aria-hidden="true" role="presentation"></i>
```

…のようにaria属性、role属性を追記すればアクセシビリティに配慮した書き方になります。
<ins datetime="2021-03-12T22:40:00+09:00">
role属性はその要素のセマンティクス・意味を再定義したり明確にするためのもの。この例では本来は他と区別したいテキストを表す意味を持つの`i`要素にアイコンという別の意味を持たせているため`role="presentation"`でセマンティクスの再定義を行なっています。
対してaria-hidden属性はスクリーンリーダーにその要素が無視できることを教えるもので、役割が微妙に異なります。
</ins>

aria属性、role属性はどちらか片方でもほぼ問題ないのですが、
両方書いた方が安全というテスト結果が[あるようです](http://john.foliot.ca/aria-hidden/)。
セマンティクスの再定義が必要ない場合role属性は不要。例えば`<nav role="navigation">`などとする必要はない。なので、常にrole属性をつけるべきというわけではない点には注意ですね。

####あえて読ませる場合　
 <ins datetime="2016-09-14T00:00Z">

スクリーンリーダー・ユーザーにもアイコンが示すコンテンツを説明したい場合もあるかもしれません。
そのような時は以下のように`aria-label`を記載します。

```html:index.html
<i class="fa fa-download" aria-label="ダウンロード" role="presentation"></i>
```
しかし通常のテキスト情報が記載してある時に

```html:index.html
<span><i class="fa fa-download" aria-label="ダウンロード" role="presentation"></i>ダウンロード</span>
```
などと書くのは蛇足ですね。
</ins>
### 所感
[![This is for everyone](http://img.youtube.com/vi/KW6ivwDcOY4/0.jpg)](https://www.youtube.com/watch?v=KW6ivwDcOY4)
実案件でアクセシビリティが要件に入ることはそれほど多くはありませんが、いちWeb制作者としてティム・バーナーズ・リーが提唱するThis is for everyone"というWebそのものの理念に少しでも近づけられればと考えています。精進！
海外で働くための英語勉強法

以前の記事では[海外でソフトウェアエンジニアとして働く利点と欠点](http://qiita.com/yoh_okuno/items/ab4a1242a184715a6ed8)について解説し、自分に合っているかどうか知るためにも一度経験してみるといいと書きました。しかしどうすればそれを実現できるのかについてあえて触れなかったため、日本に住んでいる人にとっては縁の遠い話に聞こえてしまったかもしれません。この記事では、海外で働くためにするべきことの中でも特に英語の勉強方法について私自身の体験を振り返りながら考えてみたいと思います。

英語圏で働くには、スピーキング、リスニング、ライティング、リーディングの4つのスキルをバランスよく身につける必要があります。スピーキングとリスニングは英語面接で直接的に必要になりますし、ライティングやリーディングも英文履歴書の作成や英語圏の情報収集に必要となるからです。

# TOEICを目安にリスニングとリーディングを独学する
4つのスキルのうちリスニングとリーディングについては受験勉強とある程度共通していますし、TOEICなどの試験で習熟度を測ることができるので独学に適しています。TOEICのスコアが英語力のすべてではありませんが、費用も安いし勉強した分だけスコアが上がるので、モチベーション維持には適していると思います。

私の場合、勉強を始めた時点でTOEICの点数は540点だったのが、3年後のイギリス移住時には900点を取ることができました。大学受験のときに勉強した英文法はほぼ覚えていたため、TOEICの出題形式に慣れて時間切れを防ぐために公式問題集を、語彙力を補強するために単語帳を、そしてリスニングのためにCDを買って勉強しました。

- <a  href="http://www.amazon.co.jp/gp/product/4906033482/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4906033482&linkCode=as2&tag=nokunojp-22">TOEICテスト公式問題集 新形式問題対応編</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=nokunojp-22&l=as2&o=9&a=4906033482" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
- <a  href="http://www.amazon.co.jp/gp/product/4023310654/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4023310654&linkCode=as2&tag=nokunojp-22">新TOEIC TEST 出る単特急 金のフレーズ</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=nokunojp-22&l=as2&o=9&a=4023310654" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
- <a  href="http://www.amazon.co.jp/gp/product/4048688634/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4048688634&linkCode=as2&tag=nokunojp-22">英語耳[改訂・新CD版] 発音ができるとリスニングができる</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=nokunojp-22&l=as2&o=9&a=4048688634" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

# オンライン英会話やフィリピン留学を活用してスピーキングとライティングを鍛える
スピーキングやライティングは独学が難しいため、Skypeを使ったオンライン英会話やフィリピン留学を利用して比較的お金をかけずに練習しました。オンライン英会話は[レアジョブ](https://www.rarejob.com/)が有名ですが最近はいろいろな会社が進出しているようです。どれも英会話教室に通うよりも安く済み、自宅で自由な時間にレッスンを受けることができるのが魅力です。

フィリピン留学も安く英語の勉強をすることができます。日本語で調べると日本人学生の多い学校が出てきてしまうので、日本人の友達はできるかもしれませんが（ちなみに最初に行った学校でQiitaのCTOである@yuku_tさんと知り合ったりしました）、授業中以外は日本人と日本語を使って話してしまうことになりがちです。英語に慣れてきたら、日本人学生のいない学校に行ってみると英語漬けの生活を体験できるのでおすすめです。学校については[英語版のGoogleで検索] (https://www.google.co.uk/search?q=philippines+english)するといろいろ出てきますが、私の場合はマニラのような都市部を避けてボラカイ島という小さな島にある[Paradise English](http://paradiseenglish.com/)という学校で1ヶ月間英語面接の練習を中心に勉強をしました。

# 最後に
ソフトウェアエンジニアは理数系の職業だと思われているからか、英語が苦手な人が多いように思います。かくいう私も英語の勉強が好きではなく、大学に入ってからはほとんど英語を勉強してきませんでした。しかしソフトウェアエンジニアの仕事は英語圏でこそ高く評価されているので、日本のソフトウェアエンジニアはもっと英語の勉強をするといいと思います。

英語の勉強はやるべきことは明確ですが、モチベーションを維持するのは容易ではありません。ここで紹介した勉強法以外にも今なら[Duolingo](https://www.duolingo.com/)のようなアプリもありますし、映画が好きなら洋画を見たり、アニメが好きならアニメの英語吹き替え版を見たりする手もあります。とにかく自分なりにモチベーションを保てる方法を見つけて続けることで、英語圏で働くための英語力が身につくのではないかと思います。
pushがうまくいかない時（devicetokenがうまく取れない時）の対処法


##エラーログを出力する
application:didFailToRegisterForRemoteNotificationsWithError
を設定してログを出す

以下のように記述
###Objective-C
```
- (void) application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"error: %@", error);
}
```
###Swift

```
func application( application: UIApplication!, didFailToRegisterForRemoteNotificationsWithError error: NSError! ) {
        println("error: \(error)")
}
```

##ログの内容
application:didFailToRegisterForRemoteNotificationsWithErrorを追加すると以下のようにログが出力される

```
Domain=NSCocoaErrorDomain Code=3000 "Appの有効な“aps-environment”エンタイトルメント文字列が見つかりません" UserInfo={NSLocalizedDescription=Appの有効な“aps-environment”エンタイトルメント文字列が見つかりません}
```

のように出る

##ログの内容から修正する
今回のエラーの場合、通知用の証明書が登録されているかどうかないなら登録をして、TargetのGeneralのpush NotificationがちゃんとONになっているかどうかを確認する。
![スクリーンショット 2016-09-07 21.20.02.png](https://qiita-image-store.s3.amazonaws.com/0/64331/7fe83635-d316-cf3f-7d0e-3013e14d75e5.png "スクリーンショット 2016-09-07 21.20.02.png")
これで無事devicetokenが取れる！