OmniAICreator/Qiita-1.07M huggingface dataset:
psfragでepsファイルに数式を入力する

この記事ではdebian JessieにインストールしたTeXlive, gnuplotを使っています. tgifについては, debian Stretch からpinning して使っています. 

LaTeXで図を入力するにはepsファイルを作成するのがシンプルな方法である. gnuplotやtgifならepsファイルの出力をサポートしているしベクター画像だから, 拡大や縮小にも問題がほとんどおきない. 

ただ, epsファイルに数式を入力したいとなると, 少し面倒な作業が必要になる. 方針としては, 

1. epsファイルをTeXに取り込んで, 文字部分を数式に置き換える(psfragを使う). 
1. dvipsでepsファイルを作成する.
1. epsファイルから余分な情報を取り除く.
1. 必要に応じて, バウンディングボックスを修正する.

という感じ. 一つづつ説明する. なお, この方法でepsを作ると, プレビューで見たときに数式の部分などがジャギーになっていて綺麗に見えないかもしれないが, これはこれで正常である. texに取り込ませてみると, 綺麗に出力されているようなので問題はないようである. 

### epsファイルをTeXに取り込んで, 文字部分を数式に置き換える

epsファイルをTeXに取り込んで, 文字部分を数式に置き換える(psfragを使う). gnuplotの場合はtgif形式に出力できる. 

```gnuplot:gnuplot
set term tgif
set output "hogehoge.obj"
```

とすればよい. 

tgifで数式に変更したいところに, 適当な文字(例えばギリシャ文字のΩを入力したかったら, Omega とか)を入力しておく. そのあと, tgifからepsファイルに出力しておく. 

次に, texファイル(例えば mkeps.tex)で上で作ったepsファイルを取り込み, ソースのプリアンブルに

```latex:mkeps.tex
\usepackage[dvips]{psfrag}
```

を書きこみ, さらに本文中のepsファイルを取り込む前に

```latex:mkeps.tex
\psfrag{Omega}{$\Omega$}
```

と入力する(\mathversion{bold}とか\bfを入れるかは御自由に). これをlatexでコンパイルする. なお, 出てきたdviファイルやpdfファイルを見てもあまり意味がない. 

### dvipsでepsファイルを作成する

上で得られたdviファイルをdvipsでepsに変換する. 

```bash:bash
dvips -D 1200 -E mkeps.dvi -o mkeps.eps
```

この -D 1200 は解像度として1200dpiとすることを表す. 入れても入れなくても大差はないし, もっと大きな値にしてもよい. -E はepsを出力するオプション. 

### epsファイルから余分な情報を取り除く

今までは上記で

```bash:bash
dvips -D 1200 mkeps.dvi 
```

としたあとに

```bash:bash
ps2eps mkeps.ps mkeps.eps 
```

としていたのだが, これで作ったepsファイルはdvipsに対応していない場合がある. すると, arXivなどで投稿するときに, 画像ファイルの数式が出力されないといったおかしなことがおこることがある(学会のアブストラクトで, 不等式やら\Omegaやらが出力されていないものの理由はここに起因しているものと思われる). その問題は, 実はps2eps(i)にあったようで, このコマンドでepsを作ったときに, 一部のフォント情報が抜けてしまうらしい(詳しいことはよくわからない). そこで, 上のようにdvipsでepsファイルを作ってから, そのファイルのバウンディングボックスなどを設定することにした(ついでに不必要なプレビュー画像も削除することにした). ghostscriptを使って

```bash:bash
gs -q -sDEVICE=epswrite -sOutputFile=Final.eps -r1200 -dNOPAUSE -dBATCH -dEPSCrop mkeps.eps
```

とする. windowsの場合はgswin32とかかもしれない. 細かいオプションについて調べてはいないが, たぶん -q はメッセージを出さない(quiet), epswriteはepsを出力するということ, OutputFileは出力ファイル名, -r1200は解像度を1200dpiとすること, -dNOPAUSEはエラーでストップしない, -dBATCH はよくわからない, -dEPSCrop はバウンディングボックスをオートで設定するということだと思う.

### (必要に応じて)バウンディングボックスを修正する. 

今回, 自分がやったときはうまくいったが, バウンディングボックスがうまく設定されていないときは, epsファイルをノートパッドなどで開いて, バウンディングボックスの数値を変更する. これは「eps bounding box 修正」とgoogle検索すればあれこれ情報があるはず.
JavaでServerless Frameworkを使うときのリクエストとレスポンスには注意が必要

[Serverless Framework](https://serverless.com)／AWS／Javaで実装する際の注意点。

テンプレートが生成するコードそのままではAPI GatewayとLambdaが連動せず、動きません！！

例えば下記コマンドでプロジェクトを生成する。
```
sls create --template aws-java-maven --path serverless
```

すると以下のJavaファイルが作成される。

```Handler.java
package hello;

import java.io.IOException;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class Handler implements RequestHandler<Request, Response> {

	@Override
	public Response handleRequest(Request input, Context context) {
		return new Response("Go Serverless v1.0! Your function executed successfully!", input);
	}

}
```

しかしAPI Gatewayを通してこのメソッドが実行される場合、これでは動作しない。なぜなら次のようなJSONが渡されてくるから（一部改変）。

```json
{
  "httpMethod" : "POST",
  "requestContext" : {
    "httpMethod" : "POST",
    "accountId" : "*******",
    "apiId" : "*******",
    "resourceId" : "******",
    "identity" : {
      "userAgent" : "Apache-HttpClient\/4.5.x (Java\/1.8.0_112)",
      "userArn" : "arn:aws:iam::******:user\/****",
      "caller" : "***************",
      "cognitoAuthenticationProvider" : null,
      "cognitoIdentityId" : null,
      "accessKey" : "******************",
      "accountId" : "*****************",
      "sourceIp" : "test-invoke-source-ip",
      "apiKey" : "test-invoke-api-key",
      "cognitoAuthenticationType" : null,
      "cognitoIdentityPoolId" : null,
      "user" : "*******************"
    },
    "requestId" : "test-invoke-request",
    "stage" : "test-invoke-stage",
    "resourcePath" : "\/hello"
  },
  "resource" : "\/hello",
  "pathParameters" : null,
  "isBase64Encoded" : false,
  "headers" : null,
  "path" : "\/hello",
  "stageVariables" : null,
  "queryStringParameters" : null,
  "body" : "{\n    \"key1\": \"hoge\",\n    \"key2\": 120\n}"
}
```

本当に欲しいのは、最後の ``` body ``` プロパティの部分。

ここを抽出するようなプログラムを書く必要があるということ。

リクエストだけでなく、レスポンスもこのままでは動かない。
レスポンスとなるオブジェクトは ```statusCode```、```headers```、```body```の３つのプロパティが必要らしい。




~~この辺りに対処する一つの解をサンプルとして提供しておく。[aws-serverless-java-sample](https://github.com/jabaraster/aws-serverless-java-sample)~~

(2018.6.24修正)
AWS SDKに、これに対応する解があったので書き直します。

AWSから[aws-lambda-java-events](https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-events)というライブラリが提供されていて、Lambdaをいろんなサービスと接続した時のリクエストとレスポンスの型が定義されています。

API Gatewayと接続している際に渡されてくるリクエストとレスポンスの型は次の通りです。

 * [APIGatewayProxyRequestEvent](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayProxyRequestEvent.java)
 * [APIGatewayProxyResponseEvent](https://github.com/aws/aws-lambda-java-libs/blob/master/aws-lambda-java-events/src/main/java/com/amazonaws/services/lambda/runtime/events/APIGatewayProxyResponseEvent.java)

bodyはString型だったりするので、JSONのencode/decodeの手間は残りますが、それでも随分コーディングしやすくなるはずです。
Elm 0.18でJSON APIにアクセスする

YoutubeにElm0.18のセッション動画が上がっていたのでご紹介です。

[「Toward a Better Front End Architecture: Elm - Codemash 2017」](https://www.youtube.com/watch?v=EDp6UmaA9CM)

前半がElmの文法・型システム中心のセッション、
後半がJsonサーバーへアクセスするGUIを即興で作るセッションです。

後半で作るアプリの成果物はGithubで公開されています。
https://github.com/jfairbank/arch-elm/blob/master/app/src/Profile.elm


#APIサーバーへのアクセス

特に目を見張ったのがセッション後半の、JsonAPIサーバーへのアクセス部分です。v0.17までは非常にわかりにくかった部分が改善されています。

userDecoder関数では、Jsonの各要素を順次Userのメンバに割り当てて
いるのが見て取れます。([JSON.Decode.Pipeline](http://package.elm-lang.org/packages/NoRedInk/elm-decode-pipeline/latest))


```haskell:elm
userDecoder : Decoder User
userDecoder =
    decode User
        |> required "screen_name" string
        |> required "name" string
        |> required "description" string
        |> required "profile_image_url" string
```

また、fetchUser関数ではHttp.sendでJsonリクエストの結果を、Cmd msgに変換してupdate関数で受け取れるようにしています。([http](http://package.elm-lang.org/packages/elm-lang/http/latest/Http))


```haskell:elm
fetchUser : String -> Cmd Msg
fetchUser screenName =
    let
        url =
            "http://localhost:8081/user/" ++ screenName

        request =
            Http.get url userDecoder
    in
        Http.send LoadUser request
```


Http.getでリクエストを"作成"しHttp.sendでリクエストを"送信"します。
getとsendで2回リクエストを投げそうですが、見た目に反して(?)HTTPリクエストは1回しか行われません。トランスパイルされたjsを覗いてみると、getはオブジェクトを作成しているだけでした。

スタックオーバーフローでも同サンプルで言及されています。
http://stackoverflow.com/questions/42883491/elm-http-example-http-send-call

タイピング量としては最低限で済んでますね。


###補足
Elm Httpのドキュメントを検索すると、elm-httpパッケージが上位に上がってきますが旧ライブラリです。get関数の動作も異なってますので要注意です。

|パッケージ名|現バージョン||
|:--|:--|:--:|
|[elm-lang/http](http://package.elm-lang.org/packages/elm-lang/http/latest/Http)|1.0.0|正|
|[evancz/elm-http](package.elm-lang.org/packages/evancz/elm-http/3.0.1/Http)|3.0.1|非推奨|


##環境構築

https://github.com/jfairbank/arch-elm

せっかくなので、セッションでのプログラムの実行環境を作成しました。
APIサーバーもソースが付いているのですが、今回は別にモックサーバーを用意しました。
###JSON-SERVERの準備
適当なフォルダーで routes.jsonとuser.jsonを作ります。

```json:routes.json
{
  "/user/:id": "/:id"
}
```

```json:user.json
{
    "elm" : {
            "name": "Elm Friends",
            "url": "http:/qiita.com",
            "description": "Elm JSON Test",
            "screen_name": "elm",
            "lang": "jp",
            "time_zone": "Tokyo",
            "id": 123456,
            "id_str": "123456",
            "profile_image_url": "https://qiita-image-store.s3.amazonaws.com/0/66748/profile-images/1481384149"
     }
}
```

### JSON サーバーのインストールと起動

```
npm install -g json-server
json-server -w user.json -r routes.json -p8081
```

### サンプルプログラムの起動

別のシェルを開き、プログラムをインストールします。

```
git clone https://github.com/jfairbank/arch-elm.git
cd app
yarn install
npm run dev
```

起動したら以下をブラウザで開いてください。
http://localhost:8000/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66748/00009af8-8fcd-817f-1df6-86ada1a1b385.png)

「elm」を入力して、Loadボタンを押すとUser.jsonの内容が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66748/832bb13f-8614-c154-e2ba-4b56c4c64013.png)


##終わりに
Elmには一目惚れしたものの、Taskの理解で頓挫していた私にとって非常に元気の出る内容でした。

お疲れ様でした！

##参考
https://becoming-functional.com/http-access-in-elm-0-18-8a086f7334da
docker で Data Volume Container を用いていて fpm(alpine) から書き込みが出来ない時の対処方法のメモ

自分用のメモ。

Data Volume Container を用いていると、マウントされたディレクトリの Permission は 1000:50 となっている。

何も考えずに `FROM php:7.1-fpm-alpine` を用いて `www.conf` を設置すると、多分デフォルトの状態では以下になっているはず。

```www.conf
user = www-data
group = www-data
```

これを以下の内容とすることで、 fpm からもマウントした Data Volume Container に書き込みが可能となる。

```www.conf
user = 1000
group = 50
```

開発環境としてのみの用途を想定しているので、セキュリティー上望ましくないとかあるはず。

というメモ。
C#でグローバルホットキーを登録する

windows7あたりからショートカットキーを設定してアプリを起動するのがうまくいかなくなった。
オレンジの枠のやつ
![これ.png](https://qiita-image-store.s3.amazonaws.com/0/180328/7ed62315-149b-59ed-eac8-4eb51baa58f4.png)

これ(ショートカットキーでの起動)をちゃんと使いたかったのと、
それ以外にもショートカットキー(ホットキー？)でいろいろ試したいこともあったので
ホットキーとアプリを登録して、パッとアプリを起動できるやつを作ってみた

# やったこと
* [UIの作成](http://qiita.com/r_nabu/items/316d63053bdd140016eb#ui%E3%81%AE%E4%BD%9C%E6%88%90)
* [ホットキーの設定](http://qiita.com/r_nabu/items/316d63053bdd140016eb#%E3%83%9B%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A)

# UIの作成
タスクトレイに常駐させておくアプリなのでUIはあまり重要でもないが、

一覧
![regist.png](https://qiita-image-store.s3.amazonaws.com/0/180328/c65cf5d7-cbd8-c1fe-1341-0c9d194e4945.png)

登録、編集
![edit.png](https://qiita-image-store.s3.amazonaws.com/0/180328/ab8e9aa6-c876-413a-165b-f32dec047211.png)


# ホットキーの設定
* [C#|グローバルホットキーを登録する](http://anis774.net/codevault/hotkey.html)  
ここが参考になった、というよりほぼすべてここで完結してしまった…~~丸パクリ~~


登録した奴は↓で起動

```csharp
Process.Start(appPath);
```



# おしまい(早い)
UIの動作周りが難航して別に早くはなかった。
ListViewの扱いとか、ホットキー登録のUIをどうするかとか、そっちに8割以上時間を使ってた…
正直まだ納得いく形になってない、のでそのうち直すはず。
<br>
このくらいの動作をするアプリならフリーで山ほどあるけど、自作したかった理由は
起動時にアプリに引数(選択したテキスト、クリップボードとか)をつけて挙動を変えたかったから。
まだ引数をつけれるほどまでは行ってないけど、手始めに翻訳ツールでも作ってみたい。
MCP 70-533 受験体験記

MCP 70-533 Implementing Microsoft Azure Infrastructure Solutions を受験して、無事合格したので勉強方法等を書き溜めておきます。

Azureは変化の激しいパブリッククラウドだと思います。受験タイミングによって状況は変わるかと思いますが、これから受験される方の参考になればと思います。

MCP 70-532 の体験記は以下リンク
[MCP 70-532 を取得しました](https://qiita.com/skwhr/items/8b97be93eadb8ea51ed5)

MCP 70-534 の体験記は以下リンク
[MCP 70-534 を受験しました](http://qiita.com/skwhr/items/927f41125529dcff520b)

# 公式サイトの試験範囲を把握する

[Implementing Microsoft Azure Infrastructure Solutions](https://www.microsoft.com/ja-jp/learning/exam-70-533.aspx)

基本ですが、これかなり重要です。私は確認を怠り少し失敗しました。
本記事投稿時点では以下のように記載されています。

- Azure App Service アプリの設計と実装 (15 ～ 20%)
- Azure Resource Manager 仮想マシンの作成および管理 (20 ～ 25%)
- ストレージ戦略の設計と実装 (20 ～ 25%)
- Azure Active Directory の実装 (15-20%)
- 仮想ネットワークの実装 (10 ～ 15%)
- ARM テンプレートの設計とデプロイ (10 ～ 15%)


例えば、後述する公式動画やテキストでは、Cloud Servicesが範囲として含まれています。
私はクラシックポータルに馴染みがなく、Cloud Servicesは触れたことがなかった為必死に勉強しましたが、試験では出題されませんでした。

むむ？と思って試験終了後に公式サイトを見てみると、、なにー！範囲じゃない！？

定期的に確認したほうがよいです。

# 公式動画＆テキスト

受験対策の公式動画やテキストを確認することができます。

[mstep オンライン](https://partner.microsoft.com/ja-jp/training/mstep-online)

Microsoft Partner Networkに参加している必要がありますが、70-533の公式資料はこれしかないと思います。
とても分かりやすくポイントが纏まっている為、一通り目を通しておくべきです。

ただ、前述したように範囲が公式サイトの試験範囲より広い可能性がある為、公式サイトの試験範囲を確認した上で、該当箇所のみを学習するのがよいです。

# 公式セミナー

定期的に開催されているオンサイトのセミナーです。

[mstep クラスルーム](https://partner.microsoft.com/ja-jp/training/mstep-classroom)

丸一日みっちり解説頂けるので、集中して（強制的にｗ）学習することができます。
セミナーの動画はmstepオンラインに公開されます。

# とにかく実機に触れる

言うまでもなく一番重要です。

私は普段からそれなりにAzureに触れていたことが大きかったと思います。
公式サイトの試験範囲に書かれている内容は一通り手を動かすのがベストです。

PowerShellコマンドレットも出題されるので、ポータルからだけでなくPowerShellからVMを作ったりの経験もしておいたほうがよいかと思います。

例えばARMテンプレートでは、実際にテンプレートを書いてデプロイしたことがあったので解けた問題もありました。

# まとめ

公式試験範囲の内容を、出来る限り構築してみることが一番重要です。

オンプレADとAzureADの連携や、ExpressRouteの構築といった、実際に触るにはちょっと大変かなと思われるもの以外は一通り経験しておいたほうがよいです。

最後に、mstepオンラインで勉強してて、個人的にキツかったのは、クラシックの内容を今から覚えることでした。

Azureは、クラシックとARMでかなり異なります。
私が受けた範囲だと、クラシックに関する問題は出なかったように思います。（これはたまたまかもしれません）

最近Azureを触り始めた方にとって、今からクラシックの勉強をするのは気が重いのではないでしょうか。（正直私はそうでした・・・）
保証はできませんが、思い切ってARMだけに絞るのも有りなのかなと個人的には思います。

あ、試験時間は余裕でした！
Rantly(property based testing tool)でテストデータ生成 - sized

Rantly#sized で任意のサイズのデータを作ります

## <i class='fa fa-question-circle'></i> 関連記事
[tbpgr の rantly 関連記事](http://qiita.com/search?utf8=%E2%9C%93&q=user%3Atbpgr%20tag%3Arantly)

## <i class='fa fa-flask'></i> サンプル

```ruby
# --文字列のサイズ指定--
Rantly{sized(3){string}}
# => "Z%v"
Rantly{sized(3){string}}
# => "CM$"
Rantly{sized(5){string}}
# => ")j(XX"
Rantly{sized(5){string}}
# => "xBKz["
Rantly{sized(5){string(:lower)}}
# => "jhbqm"
Rantly{sized(5){string(:upper)}}
# => "NRMYH"

# --配列のサイズ指定--
Rantly{sized(5){array{integer}}}
# => [-607208170168480669, 1513740129111666149, 777624871410992252, -827454461475545697, -1224300361333572634]
Rantly{sized(5){array{integer}}}
# => [356982138096701511, 2053870948491535825, 2270526892161025899, -493553456250269850, 1297713486671714040]

# --ディクショナリのサイズ指定--
Rantly{sized(5){dict{[string, integer]}}}
# => {"wg&Fq"=>1597295876761123245, "noifc"=>-1756614871689738693, "HCluf"=>-2130175418351173249, ".yw-!"=>-1790551654779019569, "^=(C|"=>89346602558527588}
Rantly{sized(5){dict{[string, integer]}}}
# => {"qms.{"=>1612436610708564014, "hP?ln"=>2009765839527579985, "USMaQ"=>-998249809492853341, "5['zx"=>291326024621946150, "}uUUr"=>1613729193229470410}
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [abargnesi/rantly](https://github.com/abargnesi/rantly)
* [Rantly(property based testing tool)でテストデータ生成 - dict](http://qiita.com/tbpgr/items/c6a264556c046ed2c477)
emacs25.2をmakeしたら、漢字が表示できない話

#何が起こったか

```環境
OS    :　lubuntu 17.04
emacs :  25.2 whith-x-toolkit
```

最近el-getに見せられて、emacsに戻ろうと思い、最新版を自分でmakeすることにしました。

make自体はconfigureなので、足りないライブラリをちょこちょこ入れながら問題なくできたので、喜び勇んで起動し、el-getをいれたりしました。

いざ、日本語のファイル（作りかけのrailsアプリのconfig/locales/app.jp.ymlファイルですｗ）をエディットしようと思って開いたら、あらま！ 日本語が、表示されません…涙

#とにかく調べる

LxTerminalや、firefoxの日本語は問題なく表示されるので、emacsの問題っぽいのですが、全然理由がわかりません。

emacsのフォント設定や、.emacs.d　まわりを色々いじったのですが、全く回復の兆しもなし。
困りました。

うーん、やっぱりX11周りの設定だろうかと思い、とりあえずX11のフォント周りを調べるべく　xlsfontsしてみると…

```
$ xlsfonts
-misc-fixed-medium-r-semicondensed--0-0-75-75-c-0-iso8859-1
-misc-fixed-medium-r-semicondensed--13-100-100-100-c-60-iso8859-1
-misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso8859-1
6x13
cursor
fixed
```

むむむ！　漢字フォントがない？！

#何が起こっていたのか

emacs っていうか、X11最近ご無沙汰なので全然watchしてなかったのですが、描画用のライブラリは、昔じじいな私が使っていたライブラリではなく、もっと綺麗に描画できるxftっていうライブラリが使われているとな…

xftの存在を知ったじじいは、めでたくfc-listコマンドで、漢字フォント一覧を表示できましたとさ。　めでたしめでたし。

#あら？　emacsは？

そうそう、肝心なemacsですが、make中に懐かしのlibXaw(athenaウイジットと言うチョー古い化石なX11-coreの描画ライブラリ)をインストールした気がしてきた。

./configureのオプションを調べてみると、ありました。

```
 --with-x-toolkit=KIT    use an X toolkit (KIT one of: yes or gtk, gtk2,
                          gtk3, lucid or athena, motif, no)
```

おそらく、configureさんがx-toolkitなライブラリがまったくなかったので、libXawをデフォルトで使おうとしたけど、libXawもないので、エラーになっていた模様。

エラーを真に受けて、libXawを入れるアホな俺…

と言う構図になっていた模様。

結局libgtk-3-devをインストールして、一応`--whth-x-toolkit=gtk3`して、makeし直したら、無事に漢字も表示されるようになりました。

これで、本当に　めでたしめでたし…

ちなみに、libgtk-3-devは、

```
$ apt install libgtk-3-dev
```

こんな感じで入れられます。
WiringPiで「Unable to determine hardware version. I see: Hardware	: BCM2835」エラー


RaspberryPiに入門！ということでLチカなるものをやろうとしたんだけど最初からハマったのでメモ。
※学習用にただ動けばOKというレベルまでもってくだけで根本解決ではないっす。

## 現象

WiringPiを使ってLEDを１秒つけるだけのスクリプト実行したら下記のようなエラーになった。

```
$ sudo python3 led.py
Unable to determine hardware version. I see: Hardware	: BCM2835
,
 - expecting BCM2708 or BCM2709.
If this is a genuine Raspberry Pi then please report this
to projects@drogon.net. If this is not a Raspberry Pi then you
are on your own as wiringPi is designed to support the
Raspberry Pi ONLY.
```

ソースは下記

```led.py
import wiringpi as pi
import time

LED_PIN = 4

pi.wiringPiSetupGpio()
pi.pinMode(LED_PIN, pi.OUTPUT)

pi.digitalWrite(LED_PIN, pi.HIGH)
time.sleep(1)
pi.digitalWrite(LED_PIN, pi.LOW)
```

環境は以下のような感じ（細かいセットアップ何したか忘れた・・・）

```
Raspberry Pi 3 Model B(RS components)
NOOBS 2.4.0
WiringPi: 2.44
```

## 解決方法

タイトルのエラーをググってたら「Kernelをupgradeする前は動いてたんだ！」って書き込みがどっかにあったので4.9系の前の4.4系までダウングレードしてみたら動いた。

当初のKernelバージョンは4.9.24

```
$ uname -a
Linux rasp-jolly 4.9.24-v7+ #993 SMP Wed Apr 26 18:01:23 BST 2017 armv7l GNU/Linux
```

4.4系の[最新ぽいやつ](https://github.com/Hexxeh/rpi-firmware/commit/52241088c1da59a359110d39c1875cda56496764)のハッシュを指定してダウングレード

```
$ sudo rpi-update 52241088c1da59a359110d39c1875cda56496764
```

再起動

```
$ sudo reboot
```

再起動後のKernelバージョン

```
$ uname -a
Linux rasp-jolly 4.4.50-v7+ #970 SMP Mon Feb 20 19:18:29 GMT 2017 armv7l GNU/Linux
```

動いた！（Lチカに１時間以上かかったorz）
【Unity】スクリプトからGameObjectの色を変更する

#Unityのカラーネームを使う
以下の表の9色はカラーネームが用意されているのでカラーネームを使用することが可能。


|色| カラーネーム | 実際の色 |  
|:--:|:---------:|:----:|
|黒| black |![black.PNG](https://qiita-image-store.s3.amazonaws.com/0/180127/93161a75-1ec8-45d8-864c-3071015f2594.png)|
|青| blue |![blue.PNG](https://qiita-image-store.s3.amazonaws.com/0/180127/07b69c0e-8db7-7e4f-5fe4-023fd15d8f6f.png)|
|シアン| cyan |![cyan.PNG](https://qiita-image-store.s3.amazonaws.com/0/180127/163b9c22-38c6-5b73-db6d-f5f17f2f219a.png)|
|灰色|gray または grey| ![gray.PNG](https://qiita-image-store.s3.amazonaws.com/0/180127/edb615dd-a06d-501e-6d9c-bd959e39f589.png)|
|ソリッドグリーン| green |![green.PNG](https://qiita-image-store.s3.amazonaws.com/0/180127/efafa301-1d29-eee8-c4d1-adc6e5a1704c.png)|
|マゼンダ| magenta |![magenta.PNG](https://qiita-image-store.s3.amazonaws.com/0/180127/bf11812f-6fa9-2aa1-fe93-ecc5cccf7700.png)|
|赤| red |![red.PNG](https://qiita-image-store.s3.amazonaws.com/0/180127/e3c23aa5-dc76-0d18-f118-54c7692162e2.png)|
|白| white |![white.PNG](https://qiita-image-store.s3.amazonaws.com/0/180127/8c9cbc23-5ad9-4ca6-3816-921ae37d62c9.png)|
|黄| yellow |![yellow.PNG](https://qiita-image-store.s3.amazonaws.com/0/180127/890cf554-f47a-653d-d406-8263809bcd96.png)|





```ChangeColorName.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeColorName : MonoBehaviour {

	// Use this for initialization
	void Start () {
        //オブジェクトの色を赤に変更する
        GetComponent<Renderer>().material.color = Color.red;
    }
	
	// Update is called once per frame
	void Update () {
		
	}
}
```
上記のコードのように `GetComponent<Renderer>().material.color = Color.ColorName;` で好きな色に変更することができる。


#RGBAで指定する
RGBAを用いて指定する。
カラーネーム使用よりも色の幅が広がる。
RGBの各色成分は0~255の範囲で表す。

```ChangeColorRGBA.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeColorRGBA : MonoBehaviour {

	// Use this for initialization
	void Start () {
        //オブジェクトの色をRGBA値を用いて変更する
        GetComponent<Renderer>().material.color = new Color32(248, 168, 133, 1);
    }
	
	// Update is called once per frame
	void Update () {
		
	}
}
```
各成分を乱数にしてランダムな色を生成することもできる。

#Materialを使う
Unityで作成したMaterialに変更することもできる。
最初にMaterialを宣言し関連付けをする必要があるが他のスクリプトでも同じ色を使用したい場合やスクリプトをいじらずに色を変える場合などには楽。

```ChangeColorMaterial.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeColorMaterial : MonoBehaviour {
    public Material colorA;

    // Use this for initialization
    void Start () {
        //オブジェクトの色を用意したMaterialの色に変更する
        GetComponent<Renderer>().material.color = colorA.color;
    }
	
	// Update is called once per frame
	void Update () {
		
	}
}
```
Python3 Djangoで作るエンジニアのスキル評価アプリ（Part.1）

# 概要
* IPAが展開している「[i コンピテンシ ディクショナリ](https://icd.ipa.go.jp/icd/)」の簡易ビュアーを作ろうと悪戦苦闘した際の記録
    * 今年から勉強し始めたPythonで何か作ろうと思い立ち、情報量が多そうなWebフレームワークのDjangoを選択
    * どんなシステムが良いかと考えた結果、エンジニアのスキル把握/評価を行うことができるアプリを考案
        * 調べてみるとIPAがすでに出していた
        * さらに調査、直接問い合わせてみるとアプリ作っても良いよと言われたので作ることに決定

# i コンピテンシ ディクショナリとは
* その名の通り辞書
* 詳細は本家を見ればわかりやすく書いてあるのでここでは要約のみ
    * https://icd.ipa.go.jp/icd/

## 要約
* 企業は多様な業務を遂行するために適切な能力を持った人材を確保、育成しなければならない
* 「適切な能力」は適切に測定されなければならず、何らかの指標が必要
* 業務遂行能力をタスク、業務遂行に必要な技能をスキルと定義し可視化できるようにした
    * **この業務には全部で○個のスキルが必要で、それぞれ現在の習熟度はこのくらいだから業務遂行可能という具合**
* 項目は変更することができるので企業ごとの基準に合わせたカスタマイズも可能
* 見てるとシステム化したくなるような項目の多さと規則正しさ
    * 各項目の関連図（完全にER図）も公開されている
    * https://icd.ipa.go.jp/icd/icd/download
        * データセットよりダウンロード可能

# システムについて
## 構成
* 環境
    * Ubuntu14.04
    * postgresql
    * nginx
    * gunicorn
    * docker-compose
* 使用言語、フレームワーク
    * python3
    * django1.8
    * Materialize
* ソース管理
    * Git
    * bitbucket

## 開発
都合により以下のテーマで色々覚書含め別記事を書く予定です

* pythonをwebで使う(python3 + gunicorn + nginx)
* dockerとdocker-compose
* Django画面遷移の基本
* DjangoのMTV(Model Template View)について
* Djangoのフォーム生成機能（ModelとModelForm）
* bitbucketとgithub比較

### 開発中の画面
![職種選択 | 評価支援システム 2017-05-08 21-53-48.png](https://qiita-image-store.s3.amazonaws.com/0/177195/ab1842b4-d7ad-593b-77f8-709d4379f123.png)

* エンジニアの職種に対応したスキルの一覧を出したいためまずはユーザーになりたい職種を選択してもらうというところ

# その他
## なぜDjangoか
* Python使い始めたばかりの自分には情報が豊富そうで魅力的に感じたので
* 豊富な情報量が仇となり色々詰まったけれどそのぶん色々知れた
    * このあたりもまとめたいと思います

## 掲載について
* IPAのHPに配布OKらしき文言はあるものの、確定的ではなかったため事前にメールすると、大丈夫ですとの回答
* 目標があったほうが捗るためありがたく使わせていただきました。まだ未公開なのでPart.2では公開したい
Flask-AppBuilderを使用し、認証、ユーザ管理、多言語システムを簡単に作成する

# 試した環境
OSX, Python2.7.13, virtualenv

# Flask-AppBuilder (F.A.B or FAB)
https://github.com/dpgaspar/Flask-AppBuilder

# インストール詳細
http://flask-appbuilder.readthedocs.io/en/latest/installation.html

```詳細手順
% virtualenv env 

% source env/bin/activate

% pip install flask-appbuilder

% fabmanager create-app testapp

% fabmanager create-app
Your new app name: testapp
Your engine type, SQLAlchemy or MongoEngine [SQLAlchemy]: 
Downloaded the skeleton app, good coding!

% cd testapp

# adminユーザを作る
% fabmanager create-admin 
Username [admin]:
User first name [admin]:
User last name [user]:
Email [admin@fab.org]:
Password:
Repeat for confirmation:
...
Recognized Database Authentications.
2017-05-08 22:39:16,699:INFO:flask_appbuilder.security.sqla.manager:Added user admin
Admin User admin created.

# 日本語を有効にする
% vi config.py
#coding:utf8 # <-- ファイルの先頭に入れる

# 以下を探し、jaを追加または入れ替える
LANGUAGES = {
    'en': {'flag': 'gb', 'name': 'English'},
    'ja': {'flag': 'jp', 'name': u'日本語'},
}

% fabmanager run
...
2017-05-08 22:43:34,014:WARNING:werkzeug: * Debugger is active!
2017-05-08 22:43:34,030:INFO:werkzeug: * Debugger PIN: ....
```

ブラウザーでhttp://localhost:8080/にアクセス

1. トップページ
![a1.png](https://qiita-image-store.s3.amazonaws.com/0/109145/7d873d12-7c8c-8aaf-dcf0-8696758c54da.png)

2. ログイン画面
![a2.png](https://qiita-image-store.s3.amazonaws.com/0/109145/0fdb62ec-01f9-0700-1b3d-3e7e7b65f657.png)

3. ログイン後
![a3.png](https://qiita-image-store.s3.amazonaws.com/0/109145/c5b27c52-45cf-8023-0242-5c814856e8e9.png)

4. 日本語に変えてみる
![a4.png](https://qiita-image-store.s3.amazonaws.com/0/109145/c870257d-aff8-f3b8-8dc8-9631c008bdab.png)

5. ユーザの一覧ページ
![a5.png](https://qiita-image-store.s3.amazonaws.com/0/109145/7038cc91-02b6-90af-e5f9-ce733eab23bc.png)

6. ユーザ情報編集ページ
![a6.png](https://qiita-image-store.s3.amazonaws.com/0/109145/6d329a01-a207-0e5f-4620-31eb5ce2a350.png)

7. セキュリティ的なcsrfとかもデフォルトで対応
![a7.png](https://qiita-image-store.s3.amazonaws.com/0/109145/65128e79-d53e-ff1a-29ae-9db04d70b2d6.png)


airbnb製のsupersetはFlask-AppBuilderで作成されています。
https://github.com/airbnb/superset

ちなみにmasterのCIと管理画面の一部壊れていたのでPR投げました
https://github.com/dpgaspar/Flask-AppBuilder/commit/ad0c16e960d2923184cf15b5788338ad66289011
https://github.com/dpgaspar/Flask-AppBuilder/commit/d469462425a4756b4b9cf2a0b2313ee7f65769e5
Errbot 5.0.0における更新点についての自分用メモ

先月に、Errbotがメジャーバージョンアップしてました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Errbot 5.0 is out! As it is a major revision, pls checkout the breaking changes and update your plugins accordingly <a href="https://t.co/qvcaNT6vyw">https://t.co/qvcaNT6vyw</a></p>&mdash; gbin (@gbin) <a href="https://twitter.com/gbin/status/856693440586895365">2017年4月25日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

変更箇所については、[オリジナル](https://github.com/errbotio/errbot/blob/master/CHANGES.rst)を見てみるのが一番早いのですが、確認しやすそうな部分を適当にピックアップして動作確認してみました。


# サブコマンド実装方式の拡張

> Add support for cascaded subcommands (cmd_sub1_sub2_sub3) (thx Jeremiah Lowin)

```py3:example.py
from errbot import BotPlugin, botcmd


class Example(BotPlugin):
    @botcmd
    def git_pull(self, msg, args):
        # これを、`!git pull` で呼ぶことは、今までもできた
        pass

class Example2(BotPlugin):
    @botcmd
    def git_pull_all(self, msg, args):
        # これを、`!git pull all` で呼ぶことができるようになった
        pass
```


上記の`Example.git_pull`を呼ぶときは、`!git_pull_all`の他に`!git pull`とサブコマンドらしく呼ぶことができます。
今までのバージョンでは、`git_pull_all`を呼ぶときの形式は、`!git_pull_all`または`!git pull_all`のどちらかで、1個めのアンダースコアだけがコマンドとサブコマンドの区切りとして機能していました。

バージョン5.0.0からは、すべてのアンダースコアでサブコマンドとして区切りることができるのか、`!git pull all`でも呼べるようになっています。

ただし、`git_pull`,`git_pull_all`が両方あると、`!git pull all`に対して反応するのは`git_pull`の方みたいでした。
きちんと細かく処理を分けていくことで、より有効活用できる仕様のようです。


# プラグインのシンボリックリンクサポート

> You can now use symbolic links for your plugins

文字通りですが、プラグインの読み込み時にシンボリックリンクをサポートするようになりました。

```
+ bot_root/
  + plugins/
    + example/ <folder>
    + plugin_A <symlink:../../plugin_A>
+ plugin_A/
  + plugin_A.plug
  + plugin_A.py
```

このようなフォルダ構成だった場合に、シンボリックリンクが置かれているplugin_Aもver5.0.0では読み込むようになっています。
普段の自分の運用スタイルでは、submoduleにしてしまったりすることのほうが多いので、いまいち使い所を捉えられていません。Issueとか見ればわかるのでしょうか。

# Textバックエンドがreadlineをサポート

> Text backend: readline support (thx Robert Coup)

readlineをサポートするようになったことで、`errbot -T`によってターミナルでのCLIでの会話で、↑↓キーで直前のコマンドをかんたんに呼び直せるようになりました。
プラグインの開発をするときにはローカルでtextバックエンドを使うことが多いのですが、よく使うbotコマンドである`!plugin reload PluginName`などのplugin制御系を繰り返し命令するのが非常に楽になりました。
いろいろと、デバッグがはかどります。


# (締めの文章)

パッと見た感じだと、目を引く更新はこのあたりでした。
その他にもSlackバックエンドでリアクションをすることができるようなったりと行った機能追加や細かい不具合修正などがあるので、特にプラグインの互換性が平気そうならアップデートしてみてはどうでしょうか。
【ハッカソン/キャンプに】 Web で最小の時間でちょっと「おっ」ってさせる小ネタ


僕の知ってるちょっと「おっ」ってなるネタを集めてみました！

また見つけ次第随時更新します！　皆様の「こんなんあるよ！」コメントも記事に積極的に反映させていただきますのでどしどし下さい！

ちなみに「今北産業」とは、

> 「今来た(→今北)ばかりの私にこれまでの流れを三行(→産業)で説明してくれ」の略

です。（ニコニコ大百科より）
ここでは各ツールやライブラリを3行で説明していきます！

## <i class="fa fa-cube" aria-hidden="true"></i> [Font Awesome](http://fontawesome.io/)

### <i class="fa fa-truck" aria-hidden="true"></i> 今北産業

- Web サイトでいろいろなアイコンが使えるツールキット。
- 面倒な設定はいらずCSSのみで可能
- アイコンのサイズ調整や回転もできる

### <i class="fa fa-files-o" aria-hidden="true"></i> 手順

1. HTML の `<head>` 内で[CDN](https://www.bootstrapcdn.com/fontawesome/)のCSSのURLを`<link>`で読み込みます。
2. [公式サイトの例](http://fontawesome.io/examples/)のようにしてHTMLを貼り付けるとアイコンが表示されます！

## <i class="fa fa-cube" aria-hidden="true"></i> [Google Fonts](https://fonts.google.com/)

### <i class="fa fa-truck" aria-hidden="true"></i> 今北産業
- 色々なフォントを簡単にサイト内で使えるサービス。
- 使えるフォントは実に818種類！(2017年5月現在)
- CSS のみで設定可能

### <i class="fa fa-files-o" aria-hidden="true"></i> 手順
1. [公式サイト](https://fonts.google.com/)から好きなフォントを選んで![image.png](https://qiita-image-store.s3.amazonaws.com/0/104663/093a9772-9659-a511-19d5-682121b45f63.png)
をクリックします
2. 右下のポップアップをクリックして出てくる`<link>`タグをHTMLの`<head>`内に埋め込みます
3. 要素にCSSでフォント名を`font-family`で設定するとフォントが変わります！



## <i class="fa fa-cube" aria-hidden="true"></i> [Sweet Scroll](http://tsuyoshiwada.github.io/sweet-scroll/)
### <i class="fa fa-truck" aria-hidden="true"></i> 今北産業
- 簡単にアンカーリンクでスムーズスクロールを実装するJavaScriptライブラリ
- イージングの種類が豊富というレベルを超えてる（31種類……ほとんど意地ですね()）！
- JavaScript は一行で使える！

### <i class="fa fa-files-o" aria-hidden="true"></i> 手順
1. CDNはまだ公開されてないようなので[公式サイト](http://tsuyoshiwada.github.io/sweet-scroll/)からダウンロードして適当なフォルダに配置します。(npmなどが使えるならそっちの方がいいですね)
2. HTMLから`<script>`タグで`sweet-scroll.min.js`を読み込みます。
3. `<body>`タグ内の最後に以下のコードを入力

    ```html
    <script>
    new SweetScroll({
      trigger: "[data-scroll]",
      afterScroll(toScroll, trigger){
        location.hash = trigger.hash.slice(1)}
    });
    </script>
    ```

4. スムーズスクロールしたいアンカー要素に`data-scroll`属性を付加

    ```html:例
    <a href="#main" data-scroll>メイン</a>
    ```

## <i class="fa fa-cube" aria-hidden="true"></i> おまけ - [Wappalyzer](https://wappalyzer.com/)
### <i class="fa fa-truck" aria-hidden="true"></i> 今北産業
- どんなサイトでどんな（jQuery, Bootstrap, Rails...）技術が使われているかわかるツール
- ブラウザの右上にちょろっといるので普段からどのサイトでどの技術が使われているか見ると楽しい！
- Google Chrome 拡張機能、Firefox アドオン、ブックマークレットで利用可能！

### <i class="fa fa-files-o" aria-hidden="true"></i> 手順
1. [公式サイトのダウンロードページ](https://wappalyzer.com/download)から各プラットフォームに合わせた方法でダウンロード/インストール
DIなしに組み込み関数とかをテスト時にモックに入れ替える

```py3:open_repeatedly.py
import time

def open_repeatedly(path, retries=5, retry_interval=1.0):
    while True:
        try:
            return open(path)
        except OSError:
            if retries <= 0:
                raise
            if retry_interval > 0:
                time.sleep(retry_interval)
            retries -= 1
```

何に使うかよくわからないけどこういう関数があったとして、これの例外時の挙動をテストしたい。例えば ``retry_interval`` が0なら ``time.sleep()`` が呼ばれないことなどを一応入念にテストしておきたい。

ただ、``open()`` と ``time.sleep()`` をDIするのは面倒。インターフェース汚れるし。 ``**kwargs`` も避けたい。

で、Twitterで ``unittest.mock.patch`` を教えてもらった。

```py3:test.py
import os
from tempfile import mkstemp
import unittest
from unittest.mock import call, patch, MagicMock

import open_repeatedly

class TestOpenRepeatedly(unittest.TestCase):
    def test_1(self):
        with patch('open_repeatedly.open') as mock:
            expected_ret = MagicMock()
            mock.return_value = expected_ret
            path = '/path/to/test.txt'
            f = open_repeatedly.open_repeatedly(path)
            self.assertEqual(f, expected_ret)
            mock.assert_called_with(path)

    def test_2(self):
        path = '/path/to/test.txt'
        with patch('open_repeatedly.open') as o_mock:
            o_mock.side_effect = OSError('Test')
            with patch('open_repeatedly.time.sleep') as s_mock:
                calls = [call(1.0)] * 5
                with self.assertRaises(OSError):
                    open_repeatedly.open_repeatedly(path)
                self.assertEqual(5, s_mock.call_count)
                s_mock.assert_has_calls(calls)
            self.assertEqual(6, o_mock.call_count)
            o_mock.assert_called_with(path)

    def test_3(self):
        path = '/path/to/test.txt'
        with patch('open_repeatedly.open') as o_mock:
            o_mock.side_effect = OSError('Test')
            with patch('open_repeatedly.time.sleep') as s_mock:
                with self.assertRaises(OSError):
                    open_repeatedly.open_repeatedly(
                        path, retry_interval=0)
                self.assertEqual(0, s_mock.call_count)
            self.assertEqual(6, o_mock.call_count)
            o_mock.assert_called_with(path)

    @patch('open_repeatedly.time.sleep')
    @patch('open_repeatedly.open')
    def test_4(self, o_mock, s_mock):
        path = '/path/to/test.txt'
        o_mock.side_effect = OSError('Test')
        with self.assertRaises(OSError):
            open_repeatedly.open_repeatedly(
                path, retries=0)
        self.assertEqual(0, s_mock.call_count)
        self.assertEqual(1, o_mock.call_count)
        o_mock.assert_called_with(path)


if __name__ == '__main__':
    unittest.main()
```

デコレータのほうが楽だな。

```shell-session
$ python -m unittest
....
----------------------------------------------------------------------
Ran 4 tests in 0.005s

OK
```

実装してみた感じ期待通りの動作の様子。
使い方、合ってるだろうか。
gitのbranch運用


##練習の準備：空っぽのフォルダをコミットしてみる

```
git commit --allow-empty
```

`git commit --allow-empty -m hoge` `git commit --allow-empty -m piyo` `git commit --allow-empty -m fuga` としてみた。
（ `--allow-empty` をつけるとaddしなくてもとりあえずcommitできる）

#コミットを確認してみる

```
git log --oneline
```

![スクリーンショット 2017-05-08 20.16.09.png](https://qiita-image-store.s3.amazonaws.com/0/109241/f47b4667-e071-050f-a526-c027fe0cc2bb.png "スクリーンショット 2017-05-08 20.16.09.png")

コミットできている。
左側の7桁の英数字は各コミットのID的なもので、次から使っていく。

#バージョンを戻す

##特定の状態にファイルを戻す

コミットとともにファイルもバージョンに戻す場合。

```
git reset --hard asdfr87
```

一番後ろに英数字7桁のやつをつけて、戻したいコミットを指定する。

##特定の状態にコミット状態を戻す

ファイル状態はそのままでコミットだけを戻すときは `--soft` で。

```
git reset --soft asdfr87
```

#新しいブランチを作成＆切り替え

```
git checkout -b dev
```

存在しないブランチへの移動はエラーになるらしいが、`-b`オプションで新規作成することになりエラーにならない。

##作ったブランチを一覧でみる

```
git branch
```

↓今回は `dev` `fix` を新たに作成したのでこんな感じになる（*は今いるブランチを指す）

![スクリーンショット 2017-05-08 20.51.05.png](https://qiita-image-store.s3.amazonaws.com/0/109241/31cfa4ca-4ec1-73a4-26d8-41326a3bcd09.png "スクリーンショット 2017-05-08 20.51.05.png")

##ブランチの差分を見る

```
git show-branch
```

![スクリーンショット 2017-05-08 22.14.41.png](https://qiita-image-store.s3.amazonaws.com/0/109241/5d0166ae-30da-3c4a-bb04-0f1259129c53.png "スクリーンショット 2017-05-08 22.14.41.png")

###リモートも一覧に表示したいとき

`-a`オプションで。リモートのやつは `origin/master` のように表示されている。

```
git show-branch -a
```

![スクリーンショット 2017-05-08 22.16.27.png](https://qiita-image-store.s3.amazonaws.com/0/109241/346de2e8-ba0b-23d0-27cc-454598b1980e.png "スクリーンショット 2017-05-08 22.16.27.png")


#マージする

```
git merge <マージしたいブランチ名>
```

##コンフリクトしたとき

同じファイルで違う内容のものが書かれている場合はコンフリクトのメッセージが出る。

![スクリーンショット 2017-05-08 21.08.22.png](https://qiita-image-store.s3.amazonaws.com/0/109241/097425e9-cae4-be2d-372c-11fdc28eec4c.png "スクリーンショット 2017-05-08 21.08.22.png")

ちなみに

```
git status -s
```

とするとコンフリクトしているファイルは `UU` と表示される。

![スクリーンショット 2017-05-08 21.10.36.png](https://qiita-image-store.s3.amazonaws.com/0/109241/9a6742c8-ab36-6285-d29a-ed3bff5aec53.png "スクリーンショット 2017-05-08 21.10.36.png")

###コンフリクトしたファイルのソース

![スクリーンショット 2017-05-08 21.11.51.png](https://qiita-image-store.s3.amazonaws.com/0/109241/020e85c5-4469-32a6-e839-41a25527c651.png "スクリーンショット 2017-05-08 21.11.51.png")

こんな感じで差分が出るので、どっちかを消すなり、どっちも消すなりして修正する。
（PhpStormとかを使っていれば楽チン）

###コンフリクト解決したら

addしてcommitする。
この時点でMergeが完了、ということになる。

ちなみにMergeしたコミットをGithubで見ると↓みたいな感じで `2 parents` と出る。

![スクリーンショット 2017-05-08 21.26.35.png](https://qiita-image-store.s3.amazonaws.com/0/109241/c10f74f3-e6bb-d124-3f3c-bcf2cec665ff.png "スクリーンショット 2017-05-08 21.26.35.png")

#remoteにpushする

##remoteの登録

```
git remote add origin <リポジトリのURL>
```

登録したリポジトリは `git remote -v` でみれる。

##pushする

- fixブランチをmasterブランチ（リモートの）にpushしたいとき

```
git push origin fix:master
```

- masterの内容を他のブランチ（topic_apple）として切ってpushしたいとき

```
git push origin master:topic_apple
```

#プルリクを投げる

##Reverse merge

あまり使わないらしいから省略。

##Squash merge（スクワッシュマージ）

複数のコミットを１つにまとめるもの。
「機能単位ごとにまとめたほうがログが見やすい」ようなときとか
Macのターミナル終了時にコマンド履歴が記録されない場合の対処方法

# はじめに

新しいMacの環境設定をしていたら、ある時点からターミナルを使っていてコマンドの履歴が記録されていないことに気がつきました（汗）

同じセッション中では記録されているのですが、exitなどでセッションを閉じた後、再度開くと上矢印キーを押しても以前のコマンドが表示されない...ということで、解決策を探してもなかなか見つからなかったので、単純ではありますが解決できたコマンドを一つ書いておきます。

# 解決策を検索

「Mac ターミナル コマンド 履歴 保存されない」とかいうキーワードで検索してみたのですが、なかなか見つかりませんでした...(-_-;)

「Mac .bash_history history」で検索したら以下のURLが見つかりました(^-^)/

https://superuser.com/questions/950403/bash-history-not-preserved-between-terminal-sessions-on-mac

# コマンドを実行

以下のコマンドを実行します。

```sh:
$ echo 'shell_session_update' > $HOME/.bash_logout
```

ということで、解決して良かった、良かった(^-^)
Bluemix（旧SoftLayer）でアイテムがキャンセルになったことの確認

#内容
キャンセルしたけど、本当にキャンセルされたか不安。
次月から料金が発生しないか、不安で夜も眠れない。
という皆さまにご安心していただくために、いくつか確認ポイントをご紹介します。 :)

実際のキャンセル処理方法については、<a href="https://knowledgelayer.softlayer.com/jp/procedure/debaisunokiyanseru" >デバイスのキャンセル | SoftLayer</a>をご確認ください。

#時間課金サーバー（またはアイテム）の場合
「即時キャンセル」しか存在しないため、確認する間もなくキャンセルされてしまうかもしれませんが、以下が確認ポイントです。

##1. キャンセル申請後にチケットが発行されたか
<img width="1223" alt="スクリーンショット 2017-05-08 20.30.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/d8e72470-e7f2-85f2-64c8-e67220aeb222.png">
<img width="1207" alt="スクリーンショット 2017-05-08 20.29.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/b8694909-669b-3d4d-6831-b86f25481b75.png">

##2. キャンセル待ちの時計マークとなったか
![download3.png](https://qiita-image-store.s3.amazonaws.com/0/101361/4514d555-0788-c58d-df4e-419114178e07.png)

#月額課金サーバー（またはアイテム）の場合
キャンセルの種類は、2種類あります。
Immediateキャンセルを行う場合、時間課金サーバーと同じ挙動をします。
ABDキャンセルを行う場合、ABDの時刻をすぎた後にキャンセル待ちの時計マークになるまではサーバー（またはアイテム）は使用可能です。
以下の確認ポイントは、どちらのキャンセル方法についても共通です。
![download2.png](https://qiita-image-store.s3.amazonaws.com/0/101361/7184faad-333c-b8ca-d42d-aa5663531892.png)

##1. キャンセル申請後にチケットが発行されたか
<img width="1223" alt="スクリーンショット 2017-05-08 20.30.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/d8e72470-e7f2-85f2-64c8-e67220aeb222.png">
<img width="1216" alt="スクリーンショット 2017-05-08 20.44.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/f50ccd64-ad16-9134-7d0c-b6033822e5a4.png">

##2. ネクストバランスが減ったか
ログイン後のトップページから確認できます。
<img width="626" alt="スクリーンショット 2017-05-08 21.50.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/13123233-9e36-897b-a9e0-fadda77bcead.png">
<img width="629" alt="スクリーンショット 2017-05-08 21.48.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/c79cac2e-0ec4-28ef-767e-3a7d7bbe45f3.png">

##3. 次月のインボイスから対象のサーバー（またはアイテム）が消えているか
「Account」-->「Billing」-->「Invoices」-->「Next Recurring Invoice」
SoftLayer Customer Portal :: Billing: Next Recurring Invoice
https://control.softlayer.com/account/invoices/next
<img width="1223" alt="スクリーンショット 2017-05-08 20.49.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/dbdb963c-ca78-e0ba-9161-427e99787afc.png">
<img width="1224" alt="スクリーンショット 2017-05-08 20.50.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/31ec4d99-29ce-a2f7-3d0f-099010d34dbd.png">
Float.greatestFiniteMagnitudeについて

###Float.greatestFiniteMagnitudeがよくわからない

そういえば、前の記事で、Swiftにおいて、Intの型が範囲を超えた場合の挙動について記述した。
具体的には、以下のコードで実験して見た。

```
var maxInt:Int = Int.max
var minInt:Int = Int.min

//変数に最大値以上を代入するとどうなるか
var maxPlusOne = maxInt + 1 //エラー
var minPlusOne = minInt - 1  //エラー
```

では、FloatやDoubleにおいて、実験して見た。

```
var maxMagnitudeFloat:Float = Float.greatestFiniteMagnitude
var maxMagnitudeDouble:Double = Double.greatestFiniteMagnitude

//変数に最大値以上を代入するとどうなるか
var maxMagnitudeFloatPlusOne:Float = maxMagnitudeFloat + 100//なんか行けた
var maxMagnitudeDoublePlusOne:Double = maxMagnitudeDouble + 100 //なんか行けた
```
具体的にいうと、3.402823e+38と1.797693134862316e+308の値になった。
じゃあ、１００足したやつと、１００足してないやつを比較してみよう

```
var maxMagnitudeFloat:Float = Float.greatestFiniteMagnitude
var maxMagnitudeDouble:Double = Double.greatestFiniteMagnitude

var maxMagnitudeFloatPlusOne:Float = maxMagnitudeFloat + 100//なんか行けた
var maxMagnitudeDoublePlusOne:Double = maxMagnitudeDouble + 100 //なんか行けた

if maxMagnitudeFloatPlusOne == maxMagnitudeFloat {
    print("hoge")
}

if maxMagnitudeDoublePlusOne == maxMagnitudeDouble{
    print("hoge")
}
```

hoge
hoge

と出力されてしまった。
多分、数字自体が大きくなりすぎて、１００なんてものの数にもならなくなってしまったのかもしれない。
では、２倍してみようか

```
var maxMagnitudeFloat:Float = Float.greatestFiniteMagnitude
var maxMagnitudeDouble:Double = Double.greatestFiniteMagnitude
var maxMagnitudeFloatPlusOne:Float = maxMagnitudeFloat*2//ここだけ変えた
var maxMagnitudeDoublePlusOne:Double = maxMagnitudeDouble*2 //ここだけ変えた

if maxMagnitudeFloatPlusOne == maxMagnitudeFloat {
    print("hoge")
}

if maxMagnitudeDoublePlusOne == maxMagnitudeDouble{
    print("hoge")
}
```
今度は、infになって、同じではなくなった。（hoge hogeとは表示されない）エラーは返されない。
ということで、FloatとDoubleは最大値を超えた時の挙動が違うということである
【Swift】UIImageViewの画像に枠線、形を変える。他Textfieldデザイン

#画像に枠線を追加したり、形を変えたり。Textfieldデザイン変更

忘れそうなのでメモがてら
デザイン変えたい時はこれを適当にぶっこむ。

##💡画像デザイン編

###画像の角を丸くする
```swift

//画像の角を丸くする
        self.firstImage.layer.cornerRadius = 40
        self.firstImage.layer.masksToBounds = true


```
###画像の枠線の変更(色・太さ)

```swift
//画像の枠線の変更
        //青にする(色)
        self.firstImage.layer.borderColor = UIColor.blue.cgColor
        //線の太さ(太さ)
        self.firstImage.layer.borderWidth = 10

```
##💡Textfield編

```swift
//枠線を透明に設定
        myTitle.borderStyle = .none

```
ScrollViewのpagingEnabledプロパティのOS間挙動の違いについて

ReactNative: 0.44.0

## 前提
ScrollViewのpagingEnabledのドキュメントには'This can be used for horizontal pagination.'と記載があるので、vertical方向のページネーションは対応していない模様。

> When true, the scroll view stops on multiples of the scroll view's size when scrolling. This can be used for horizontal pagination. The default value is false.
https://facebook.github.io/react-native/docs/scrollview.html#pagingenabled

`pagingEnable={true}`とし、かつ`horizontal={true}`と**しない**場合の挙動を確認した。

## 結果
iOS: 縦方向でもページングの挙動となった
android: 縦方向はページングの挙動とならなかった。
![ios.gif](https://qiita-image-store.s3.amazonaws.com/0/25428/875c88c9-cc24-260e-0616-4f8a8edc06a1.gif)
![android.gif](https://qiita-image-store.s3.amazonaws.com/0/25428/5651ef68-dec8-a953-913b-0599ffab85b7.gif)


## コード
```jsx
import React from 'react'
import {
  Text,
  View,
  Dimensions,
  ScrollView,
} from 'react-native'
const { width, height } = Dimensions.get('window')

var styles = {
  slide: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: 'gray',
    width: width,
    height: height,
  },
  text: {
    color: '#fff',
    fontSize: 30,
    fontWeight: 'bold'
  }
}

export default () => (
  <ScrollView style={styles.wrapper} pagingEnabled={true}>
    <View style={styles.slide}>
      <Text style={styles.text}>Hello</Text>
    </View>
    <View style={styles.slide}>
      <Text style={styles.text}>World</Text>
    </View>
    <View style={styles.slide}>
      <Text style={styles.text}>!!</Text>
    </View>
  </ScrollView>
);
```
[Processing] 残像表現との共存

連休中、久しぶりに Processing を使用していて、残像表現をしながら手前で別のものを表示したいときに、手間取ったのでメモ程度に。

## PGraphics を使用する
オンスクリーンバッファを用意して更新・描画することで、残像を実現することは `loadPixels()` で可能なのですが、スクリーン全体が更新されてしまうため、 `PGraphics` を使用してみます。

[PGraphics \ Language (API) \ Processing 2+](https://processing.org/reference/PGraphics.html)

`PGraphics` は「別画面」に描画するもので、同じものを何度も使い回すことも可能です。

### PGraphics を生成

```java:sketch.pde
PGraphics pg;

void setup(){
  size(500, 500);
  pg = createGraphics(500,500);
}
```
`createGraphics()` を使って生成します。今回はレイヤー的に使用したいので、ウィンドウのサイズと同じ大きさにします。

### 手前に置きたいものは後で記述

奥に置きたいものほど先に記述し、 `beginDraw()` 〜 `endDraw()` の間に先ほど生成したインスタンスをくっつけて、記述します。

```java:sketch.pde
void draw() {

  pg.beginDraw();

  // 残像効果を出すために半透明で塗りつぶす
  pg.fill(0,10);
  pg.rect(0,0,width,height);

  // 動かすものを配置
  pg.fill(255);
  pg.ellipse(x1, y1, size, size);

  pg.endDraw();
　
　// 最後に image() で配置することで表示される
  image(pg, 0, 0);

  // 手前に置きたいものを書いていく
　ellipse(x2, y2, size, size);

}
```
こうすることで、手前のものと奥のものをレイヤー的に分けることができます。
もう少し込み入ったことをもやりたいところですが、それは次の機会に。

#### 参考リンク
- [CreateGraphics \ Examples \ Processing.org](https://processing.org/examples/creategraphics.html)
- [Processingで残像表現を実現する - kitao&#39;s blog](http://tkitao.hatenablog.com/entry/2014/03/04/231030)
- [Processing：PGraphicsを用いて複雑な描写をする。 : PROCESSING入門](http://processingnyumon.blog.jp/archives/2589630.html)
論文PDFへ線を引く時の三色使い分け

プログラミングは関係ありませんが、論文を読む際のちょっとした工夫をご紹介します。

齋藤孝氏の三色ボールペンによる国語勉強法というのがあります。ずっと昔にこれを読んだことがあるので、私のは、これを論文を読む際に応用しているだけかもしれません。

端的に言うと、論文PDFで重要箇所に線を引く時に、ルールを設けて色分けをします。

1. **黄色**は、重要だと思われる箇所
2. **ピンク色**は、更に加えて、常識、あるいは自分のこれまでの知識に反するような内容
3. **水色**は、新しい言葉です。論文の中で使われる略語やキーワードの定義の箇所に用いたり、単に自分の知らなかった単語にも水色を用いています。

このうち　1に関しては、特に言うことはないでしょう。2と3について少し解説を加えます。

# ピンク色は「おや？」と思う箇所に用いる 

常識、あるいは自分のこれまでの知識に反するような内容、つまり、**「おや？」と思う箇所**というのは、単にその論文の記載が間違っている場合もあるでしょうが、そうではなく、**その分野の定説や、自分の持っている仮説が誤っていることを示す、重要な情報を含んでいる可能性があります**。こういうものを一緒くたにしてピンク色で線を引くというのがアイデアです。

これを徹底していくと、**黄色は重要な内容だけど驚きのないもの、ピンク色は重要かつ驚きを含むもの**、というように区別されていきます。

何か新しい発見に関係あるようなものはこのピンク色のほうに多く見つかってくるのではないでしょうか。

# 水色は知らない言葉に用いる

これはプログラミングで言うと、**新しい変数を宣言する箇所に水色を用いるようなもの**だと言えば、直感的に理解頂けるのではないでしょうか。

論文を読むに当たって障害となるのは、**知らない言葉**です。

既に知っている概念であっても、著者が使っている略語が分からなければ読めません。ですので、これは目を引くようにしておく必要があります。水色さえ押さえておけば、後はだいたい流れていくというわけです。

またIntroductionや、Methods, Discussion などで、重要なコンセプトについてまとめてあるような文章も、辞書的な意味で重要なので水色で線を引いておく。

単に知らない英単語や表現にも水色を用いて語彙の増強に使えるでしょう。

# まとめ

やってみると、単にすべてをデフォルトの黄色で済ませてしまうのに対して、妙な快感、すっきり感があります。どうぞ、お試しあれ。
データが入力されるたびに合計範囲を自動に変更する方法

![合計範囲自動.png](https://qiita-image-store.s3.amazonaws.com/0/160563/af799d2c-22b7-dc0b-f1e4-8b52b92466e4.png)


#利用シチュエーション

* データの入力有無で、合計範囲を変更したい場合

##直面した問題
　×　数値を比較する際に、同じ期間だけの合計数値を比較したいが、SUM関数の範囲をいちいち変更しなければいけない。

#記述方法
```
=SUM(OFFSET(基準セル,行の移動距離,列の移動距離)：合計開始セル)

<記述例>
=SUM(OFFSET(B2,COUNT(B11:B15)-1,0):B2)
```

> **前提条件**
> A列に時系列に並んだ日付情報
> B〜D列に基礎データ
> ![data1.png](https://qiita-image-store.s3.amazonaws.com/0/160563/666cc40d-24bf-800b-ac70-22bb7313b3f9.png)



---

> **抽出結果**
> ![data2.png](https://qiita-image-store.s3.amazonaws.com/0/160563/4146cde7-56d9-ecf5-ce9c-cd179f6bf0fc.png)




---

> **解説**

> * OFFSET関数で合計範囲の終了地点を指定。
> * SUM関数で開始位置から終了地点(OFFSET関数で抽出した地点)までを合計

> ####個々の関数の説明####
> OFFSET関数は基準のセル又はセル範囲から指定した行数・列数分を移動させた位置にある高さと幅のセルやセル範囲のオフセット参照を返す

> ||書き方|利用例|
> |:---|:---|:---|
> |書式|OFFSET(基準,行数,列数)|OFFSET(B2,5,0)|
> |引数1|基準となるセルまたはセル範囲の参照を指定|B2|
> |引数2|基準からシフトさせる行数を数値で指定|5|
> |引数3|基準からシフトさせる列数を数値で指定|0|


#サンプル

* [Googleスプレッドシート](https://goo.gl/3R5T7E)
GWも明けたし、AWSのIAMについてちゃんと理解しとく


### IAMとは

AWSを使っていると避けられないのが`IAM`です。
聞き慣れませんが、`Identify and Access Management`の略で、AWSへのアクセス件をコントロールするものです。

知っておかないと、乗っ取られた時に勝手に大量にインスタンスを立ち上げられて請求されるなどの危険性があるのでしっかりと知っておく必要があります。

まず、AWSには2つのアカウントがあります。

* AWSアカウント
	* ルートアカウントで、最強のアカウント
	* 全てのサービスを操作(起動/削除/変更etc...)出来る
	* 取扱に注意すること！！
	* **普段からの利用は極力避けて、必ずMFAを有効化する事**
* IAMアカウント
	* マネジメントコンソール上で操作する時、APIで操作する時に使うアカウント
	* IMAアカウントは、それ毎に細かくどのサービスをどの程度設定出来るかを定義することが出来る
	* このアカウントでも、 **権限を強くしたり、請求処理が出来るようなものに関しては、AWSアカウント同様にMFAを有効にすること**

#### MFAとは

- 多要素認証(Multi-Factor Authentication)の事
- ログイン時にはID/PWでログインするが、さらにMFAを有効にすることで、

### IAMポリシーとは

IAMポリシーには、3つのルールにもとづいて各サービスを使う上で機能を設定します。

* Action - どのサービス
* Resource - どういう機能の範囲を(起動/削除/変更etc...)
* Effect - 許可 or 拒否

このポリシーも下記の2種類があります。

* AWS Managed Policies
	* AWSが最初から設定しているポリシー
* Customer Managed Policies
	* ユーザが独自に作成したポリシー

### IAMロール

一時的にAWSリソースへアクセス権限を付与する場合に利用

* AWSリソースへの権限付与
* クロスアカウントアクセス
* IDフェデレーション
* Wed ID フェデレーション

## MFAを有効化する

サービス一覧から、`IAM`を選択すると、下記のように「ルートアカウントのMFAを有効化」という部分が出てますので、こちらから`MFAの管理`をクリック

![スクリーンショット_2017-05-08_20_48_53.png](https://qiita-image-store.s3.amazonaws.com/0/23276/4aae5302-9f84-bdc6-de28-635c2685173a.png "スクリーンショット_2017-05-08_20_48_53.png")

実際にMFAを使えるアプリケーション(私はGoogle Authenticatorを使ってます)から、QRコードを読み取って、表示されるコードを入力すればMFAが有効になります。

## 実際にIAMを作ってみる

3stepで行きます。

1. Groupの作成
2. Role作成
3. User作成

### 1. Groupの作成

* サービス一覧から、IAMを選択
* 左メニューから「グループ」を選択
* 「新しいグループの作成」を選択
* 名前を入力( `admin` 等)
	* フィルターで「AWS管理ポリシー」を選択すれば、上記で説明した`AWS Managed Policies`のポリシー一覧が選択出来るようになります
	* 「ジョブ機能」には、請求やサポートユーザ等強めのポリシーが設定出来ます
* 確認画面で問題なければ「グループの作成」で作成完了です


### 2. Roleの作成

試しに、EC2に対して、`RDSの読み込み` / `S3の読み込み` が出来るロールを作って見ます。

* 左メニューから「ロール」を選択
* EC2を選択

![スクリーンショット 2017-05-08 21.01.06.png](https://qiita-image-store.s3.amazonaws.com/0/23276/024d84b4-42c8-d952-a8b5-cceac833acaf.png "スクリーンシ
ョット 2017-05-08 21.01.06.png")


* `AmazonRDSReadOnlyAccess`と`AmazonS3ReadOnlyAccess`を選択して作成

![スクリーンショット 2017-05-08 21.01.23.png](https://qiita-image-store.s3.amazonaws.com/0/23276/012a3242-6ceb-2bac-68e5-ea651772356b.png "スクリーンショット 2017-05-08 21.01.23.png")


![スクリーンショット 2017-05-08 21.01.34.png](https://qiita-image-store.s3.amazonaws.com/0/23276/5cfe5caf-0568-483a-e48a-5e61b90605fb.png "スクリーンショット 2017-05-08 21.01.34.png")

* 完成したポリシーを見てみるとこんな感じになっております

![スクリーンショット 2017-05-08 21.02.48.png](https://qiita-image-store.s3.amazonaws.com/0/23276/3c430001-2456-c7b5-9e6a-5e866183ee11.png "スクリーンショット 2017-05-08 21.02.48.png")

### 3. Userの作成

* 左メニューから「ユーザ」を選択
* 「ユーザを追加」を選択
* 今回はマネジメントコンソールからアクセスする用のアカウントを作ってみます
* また、グループには先程作ったグループに紐付けておきます

![スクリーンショット 2017-05-08 21.06.11.png](https://qiita-image-store.s3.amazonaws.com/0/23276/7ae352d9-3598-8a0a-3466-b8ab9243bed2.png "スクリーンショット 2017-05-08 21.06.11.png")

#### IAMユーザでのログイン方法

* 1. 作成が完了すると、一度だけパスワードが表示される画面が出るのでメモしておきます。
* 2. 作成後、ユーザ > 「認証情報」から`コンソールログインのリンク`が記載されてるので、コピーしておく
* 3. 初回ログイン時には、1の時にメモしたパスワードでログインする
* 4. ログインが成功すると、パスワードの変更を指示されるので変更しておく
* 5. もし強めのポリシーを割り当ててる場合は、必ずMAFを有効化しておきましょう
iosアプリに対して、サーバーからプッシュ通知を実装するための準備

ただのリンクを貼っていくだけですが、掲載元の記事が秀逸すぎて、その通りやれば基本的に証明書の作成には成功するかと思います。


なかなかまとまった情報がなくて、割と長い間はまっていた。というかいくらググっても公式ドキュメントに行き当たらなかったのがつらかった。てか、公式ドキュメントってあるの？笑　誰もリンク載せてないんですが。。


1. 実現したかったことと環境
1. 注意点
1. リンクたち

っていう順番で


### 1. 実現したかったことと環境

アプリ側で取得したトークンをサーバ(ruby/rails)ーで保存。そこからrpushっていうgemを使って、APNsにリクエスト。

```
rails 5.0.1
date 2017年５月
```
頻繁に仕様が変わるらしいので、日付が大事、笑


### 2. 注意点

これが多分大事。初心者ははまるじゃないの。

production と development用の証明書の取得ができる。僕が想像したのはこう。

```
想像

development =>  debugモードでビルドした際に活用可能
production => releaseモードでビルドした際に活用可能


現実

development => debug / release モード両方
production => app storeからダウンロード可能なもの
```

なるほど。。これに気づかず。割とはまった。かなり。


### 3. リンク


以下のリンクを順に辿っていけば実現可能。実際僕はできてます。

[firebase: 証明書取得方法](https://firebase.google.com/docs/cloud-messaging/ios/certs?hl=ja#create_an_app_id)



[取得した.p12ファイルを、pemファイルに変換](http://stackoverflow.com/questions/21250510/generate-pem-file-used-to-setup-apple-push-notification)

抜粋するとこのコード
```
openssl pkcs12 -in pushcert.p12 -out pushcert.pem -nodes -clcerts
```

[Apple Push Notification Serviceのエラー処理について](https://hagino3000.blogspot.jp/2014/05/apple-push-notification-service.html)

[push通知用gem ios/android対応](https://github.com/rpush/rpush)