OmniAICreator/Qiita-1.07M huggingface dataset:
【Key魔ap】Macの英語キーボードのcommandとoptionにreturn・delete・かな/英数を割り振る調教報告【混沌】


全国8人くらいの「mac英語キーボードの親指ポジションを魔改造したい派閥」のみなさん、こんばんわ。

#あらまし

「英語キーボードでも技術文書を、なるべく小指のお世話にならずに快適に打ちたい」という、実にニッチなニーズを満たしたい。
高速なタイピングリズムを維持するには、ホームポジションから遠く小指を酷使するreturn・delete・かな/英数は、なるべくホームポジションから手が離れない手元に置いておきたい。
(そもmac使いでかな/英数のお世話になる人は非常に少ないと思うけれど、1キーで切り替えできるのは魅力的)

そこでMacのキーボードマップ改造アプリ「karabiner」を弄って参りました。

##今回のキー割り振り

|割り振り前|割り振り後|
|---|---|
|option_L|command_L|
|command_L|option_L、単発で押すとdelete|
|command_R|option_R、単発で押すとreturn|
|option_R| command_R、単発で押すとKANA/EISUU(toggle)|


>ここで、command/optionを入れ替えている理由については、windowsの日本語キーボードの操作性に近づける為。
……というより、筆者が自宅作業では英語キーボードのmac、職場では日本語キーボードのwindows、出先で文章を書くときは日本語キーボードのpomeraというキメラ構成の為、ここまで設定が拗れている。
このような宗教問題を孕んだkeymapを総じて「key魔ap」と呼ばれているかどうかは定かではない。

#作業概要

「karabiner」を立ち上げ、「Misc & Uninstall」タブを開く。
「Open Private.xml」を押し、ファイルを開いて下記を追加。

```xml
<?xml version="1.0"?>
<root>
  <list>

    <item>
      <name>追加</name>

      <item>
        <name>☆ Option_L to Command_L</name>
        <identifier>remap.jis_optionL2commandL</identifier>
        <autogen>__KeyToKey__ KeyCode::OPTION_L, KeyCode::COMMAND_L</autogen>
      </item>
      
      <item>
        <name>☆ Command_L to Option_L</name>
        <appendix>(+ When you type Option_L only, send Delete)</appendix>
        <identifier>remap.jis_commandL2optionL_delete</identifier>
        <autogen>__KeyOverlaidModifier__ KeyCode::COMMAND_L, KeyCode::OPTION_L, KeyCode:: DELETE</autogen>
      </item>
      
      <item>
        <name>☆ Command_R to Option_R</name>
        <appendix>(+ When you type Option_R only, send Return)</appendix>
        <identifier>remap.jis_commandR2optionR_return</identifier>
        <autogen>__KeyOverlaidModifier__ KeyCode::COMMAND_R, KeyCode::OPTION_R, KeyCode::RETURN</autogen>
      </item>
      
      <item>
        <name>☆ Option_R to Command_R</name>
        <appendix>(+ When you type Command_R only, send KANA/EISUU)</appendix>
        <identifier>remap.jis_optionR2commandR_kana_eisuu</identifier>
        <autogen>__KeyOverlaidModifier__ KeyCode::OPTION_R, KeyCode::COMMAND_R, KeyCode::VK_JIS_TOGGLE_EISUU_KANA</autogen>
      </item>
      
    </item>

  </list>
</root>
```

保存したら「karabiner」の「Change Key」タブを開き、Reload XMLを押す。
検索ボックスで☆にヒットしたものをチェックして動作確認しよう。

>Option_L to Command_Lは、既にデフォルト設定に存在するのだが、管理上、☆で探せたほうが楽なので、こうして追加している。


#最後に
「karabiner」は単発押しと同時押しで処理を変更出来るため、実に使い勝手が良い。
デフォルト設定に存在しない改造も、ドキュメントが用意されているため、楽にできる。
https://pqrs.org/osx/karabiner/xml.html.ja

また、手っ取り早く記述例を見たい場合は、karabiner.app/Contents/Resources/include/checkbox/ 内に、実際の例が大漁にある。オススメはlanguages/japanese.xml が読みやすい。

レッツプレイ！キーボード魔改造生活！(桜玉吉風
Apache Thrift 速度比較

# 動機
* とある業務で使っている MessagePack-RPC に代わる RPC を探している
* `RPC framework` でグーグル先生に聞いたら gRPC と Thrift が上位に表示された
* gRPC は別の機会で別途比較する
  * そもそも gRPC で使われている Protocol Buffers の 3.0 が Beta 版なので色々環境構築が大変なのが本音
  * 業務で使うのに Beta ってのはちょっと抵抗があるのでモチベーション低下
  * とは言えど Go は比較的楽だったので[頑張った](http://qiita.com/y-okubo/items/e20f24962b935dc46c0b)
  * [Java も頑張ったが非常に大変だった](http://qiita.com/y-okubo/items/8e517aba293af43b2ce5)
  * Ruby は[この問題](https://github.com/grpc/grpc/issues/3626)があって Gem を入れられない

# 概要
* クライアントは Java で、サーバは以下の言語でそれぞれ開発
  * Java
  * Ruby
  * Go
* テストは巨大データ送信を10回繰り返した際の平均を取る
  * 巨大データは50000件のハッシュ

# 結果（単位は秒）
<img width="1005" alt="スクリーンショット 2016-02-02 19.58.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/14966/0b68cbe8-553a-8c7a-c1df-d4afa76f59d8.png">

# 考察
* Java が速いのは意外だった
* MessagePack-RPC との比較も行ってみたい
Go で gRPC

# 参考情報
* http://mattn.kaoriya.net/software/lang/go/20150227144125.htm
* http://tleyden.github.io/blog/2014/12/02/getting-started-with-go-and-protocol-buffers/

# 興味深い
* http://frsyuki.hatenablog.com/entry/20081116/p1

# ポイント
* Protocol Buffers は手動でダウンロードして配置
  * https://github.com/google/protobuf/releases
* Dial のエラー `grpc: no transport security set (use grpc.WithInsecure() explicitly or set credentials)` は以下で解決
    * http://matope.hatenablog.com/entry/2016/01/05/003234

# 成果物
* https://github.com/y-okubo/grpc-test
Vagrant コマンドラインインターフェース DESTROY

#DESTROY

##command: vagrant destroy

Vagrant管理下で実行中のマシンを止め、マシン作成の過程で作られた全てのリソースを破棄する。このコマンド実行後、PCは（あたかも最初からゲストマシンがなかったかのように）クリーンな状態となる。

Linuxベースのゲストでは、Vagrantはshutdownコマンドを使ってキチンとマシンを終了する。OSの差異により、shutdownコマンドがあるゲストの\${PATH}が異なる。ゲスト側でshutdownコマンドのあるディレクトリを${PATH}に明記する必要がある。

####オプション

<dl>
<dt>--f または --force </dt>
<dd>
確認なく破棄する
</dd>
</dl>

「destroy」コマンドは「[vagrant up](http://qiita.com/CsFactoryitter/items/364bfeb65700cf3db8a4)」時にインストールされた可能性のあるboxを削除しない。よって、「vagrant destroy」を実行してもインストールされたboxはハードディスクに残ったままとなる。「vagrant up」以前の状態に戻すには、「[vagrant box remove](http://qiita.com/CsFactoryitter/items/d4d16f6fcd328c97ebc8#4box-remove)」を実行する。
OpenStack Swiftで受け取れるHTTPステータスコード一覧をまとめてみた

# はじめに
サーバーからブラウザに返してくるコードのことをステータスコードと言う。これには以下の5種類あり、400番台と500番台がいわゆるエラーコードとなる。

* 1xx Informational 情報
* 2xx Success 成功
* 3xx Redirection リダイレクション
* 4xx Client Error クライアントエラー
* 5xx Server Error サーバエラー

# OpenStack Swiftで受け取れるHTTPステータスコード
| HTTPステータスコード | タイプ      | 詳細       |
|:-----|------------|------------|
| 200  | OK         | リクエスト成功     |
| 201  | Created    | 新たなリソースが作成された    |
| 202  | Accepted   | リクエストが受理された     |
| 204  | No Content | リクエストは受理されたが返すべきものが存在しない      |
| 206  | Partial Content | 部分的GETリクエストが受理された    |
| 400               | Bad Request | 不正なリクエストである    |
| 401               | Unauthorized | 認証に失敗した |
| 403               | Forbidden | リクエストを拒否された |
| 404               | Not Found | リソースが見つからなかった |
| 405               | Method Not Allowed | 許可されていないメソッド |
| 408               | Request Timeout | リクエストタイムアウト |
| 409               | Conflict | コンフリクトが発生して処理を完了できなかった |
| 411               | Length Required | Content-Length ヘッダが無いため拒否された |
| 412               | Precondition Failed | PUTリクエストに際して前提条件がおかしいため拒否された |
| 413               | Request Entity Too Large | リクエストエンティティが大きすぎるためリクエストを拒否された |
| 417               | Expectation Failed | Expectヘッダによる拡張が失敗した |
| 422               | Unprocessable Entity | 処理できないエンティティ |
| 429               | Too Many Requests | 与えられた時間内でのリクエスト過多により拒否された |
| 500               | Internal Server Error | サーバ内部エラー |
| 503               | Service Unavailable |  サーバ利用不可 |
Response headerの「Content-Type:text/html; charset=UTF-8」のUTF-8を削除する

単純なところで久々にハマったので残しておく。

##要望
Response HeaderのContent-Typeのcharset=UTF-8を削除したい。

<img width="296" alt="スクリーンショット 2016-01-29 18.49.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/29779/88320714-72ae-ef28-c1b6-c4af96a6becb.png">
↑charset=UTF=8を消したい

##環境
apache+PHP5.6.0以上



##原因と対策
（1）、（2）のどちらかが正なら現象は発生する

（1）httpd.confでAddDefaultCharsetにUTF-8が指定されている

````httpd.conf
AddDefaultCharset UTF-8
````

↓コメントアウトする

````httpd.conf
#AddDefaultCharset UTF-8
````


（2）php.iniのdefault_charsetにUTF-8が指定されている。もしくはdefault_charsetが指定されていない。


````php.ini
default_charset = "UTF-8" 
        or
;default_charset = "UTF-8" 
````

↓default_charsetのdefaultはUTF-8なので空文字指定する ***←ここ重要***

````php.ini
default_charset = "" 
````
注意）「default_charset = ""」は公式ページによると"おすすめしない"と書いてある。
http://php.net/manual/ja/ini.core.php#ini.default-charset


# さいごに
対応として、default_charsetは htmlentities()、html_entity_decode() 、htmlspecialchars()等のデフォルト値となり、空文字をしていすることは、二次的な問題が発生するリスクがあるのでやりたくない。そもそも.phpのみなら別にUTF-8縛りでも問題ない。問題なのはhtmlをphpとして処理している環境だったときである。この場合、SJISで書かれた静的なページが文字化けするので困る。今どき、UTF-8縛りで困ることはないのと、そもそもhtmlをphpとして処理すること自体が危険なのだが。。。

※htmlをphpとして処理している環境

````httpd.conf
AddType application/x-httpd-php .html
````

以上です。
XcodeからiOSのDeviceのログを見る方法

1. Xcodeを起動する。
2. Window -> Devicesを選択する。
3. Devicesから、ログを見たい端末を選択する。
4. ログを見る。

<img width="996" alt="Screenshot_1_29_16__19_46.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/109450/620ec2fb-a958-b6b3-3210-5cd73a281acf.jpeg">
さっきまで動いていた Amazon CloudWatch Monitoring Scripts for Linux が急にお亡くなりになった件

# 概要

* mon-put-instance-data.pl が急に `The Auto Scaling metrics will not be reported this time.` とか言い出した
* AMI 作り変えたときのキャッシュが原因で `/var/tmp/aws-mon` に[古いインスタンス ID が残ってた](https://forums.aws.amazon.com/message.jspa?messageID=473077)
* `/var/tmp/aws-mon/instance-id` 書き換えたら直った

# 背景

複数台のインスタンスを AutoScaling で上げたり下げたりするとき、メモリ使用率の全台数平均とかディスク容量とかを AutoScalingGroup 単位でまとめたいって思いますよね？
そんなときどうするかって言ったらやっぱり[Amazon CloudWatch Monitoring Scripts for Linux](http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/mon-scripts.html)ですよね。
~~Windows? 知らん~~

# 事象

ミドルウェア構成に変更があったから AutoScaling 用の AMI 更新しなきゃなー、といつものようにインスタンス立ち上げて色々設定して AMI を作成して LaunchConfig 更新して、新しいインスタンスも立ち上がって無事入れ替え完了わーよかったよかった

と思った10分後、大量の INSUFFICIENT_DATA アラートがががが。
![スクリーンショット 2016-01-29 19.15.24.png](https://qiita-image-store.s3.amazonaws.com/0/88428/d641144e-797c-41dd-e616-e0d3a15960f0.png)
※画像はイメージです

アラーム元をよく見てみると全部 AutoScaling のアラート。よもや更新した時に cron 設定消えるとかそんな馬鹿なことがと cron のログ確認してみるも動いている・・・。

こんな時は手動で走らせてみるに限るとコマンド実行してみると

```
# /usr/local/aws-scripts-mon/mon-put-instance-data.pl --mem-util --disk-space-util --disk-path=/ --auto-scaling=only

The Auto Scaling metrics will not be reported this time.

```

あれ？何故か取れていない。

試しに `--auto-scaling=only` 外して ASG から外してみると送信される。
IAM 変わってないから権限も問題ないはず（送信できてるし）。
`--verbose` オプションつけてみても HTTP レスポンスコードは 200 で何の問題もない。
しかしなぜか AutoScalingGroup としてのメトリクスが取れない。

原因が全く思い当たらないのでゆとりらしくエラーメッセージそのままで Google 先生にお問い合わせしたところいきなり[ジャストなトピックが。](https://forums.aws.amazon.com/message.jspa?messageID=473077)

IAM はちゃんとしてるんだよー `--verbose` つけてもわからないんだよーと思いながら下まで見に行ってみたら

> I came across this same issue. For me the reason was that my AMI was created from an instance that also ran this monitoring script previously. 

> When the monitoring script runs it caches the instance_id under /var/tmp/aws-mon. One of the filters it uses when getting the auto scaling group name is the instance id. The TTL on this is 6 hours, so if your AMI has this cache, the query will use the wrong instance id for up to 6 hours after the instance is created which results in it failing to retrieve the auto scaling group name.

> Hope that helps! Make sure your AMI doesn't have this cache in it.

> -Avi

**AMI 作る前にモニタリングスクリプト走らせてると `/var/tmp/aws-mon` に古いインスタンス ID キャッシュされてちゃんと動かなくなるよ。これ 6 時間生きてるから気をつけてね（笑）**~~（ゆとり意訳）~~

とのこと。
`/var/tmp/aws-mon/instance-id` 見てみたらまさに AMI 更新のために使ってたインスタンス ID が記載されてました。
一応このファイルバックアップとって現行のインスタンス ID に書き換えて実行したところ

```
$ /usr/local/aws-scripts-mon/mon-put-instance-data.pl --mem-util --disk-space-util --disk-path=/ --auto-scaling=only

Successfully reported metrics to CloudWatch. Reference Id: hogehoge
```

やったー！
Amazon Route 53で汎用JPドメインを申請してみた

今まで[VALUE-DOMAIN](https://www.value-domain.com/)を使ってきたのですが、EC2を使うケースが増えてきたので、ドメインも一括してRoute 53で申請してみました。他で取ってRoute 53で運用しようと思ったのですが、いつのまにか申請もできるようになったのですね。レジストラは[Gandi](http://www.gandi.net/)がやっているみたいです。

ちなみに、汎用JPドメインの料金は年額で90USDです。これはかなり高いです。NTTPCの[名づけてねっと](http://www.nadukete.net/)よりも高いです。

# １．Amazon Route 53のダッシュボードへ移動
https://console.aws.amazon.com/route53/home?region=ap-northeast-1#Dashboard:

# ２．ドメインを申請
左側メニューの「**Registered domains**」を開いて、「**Register Domain**」をクリックします。

#### **Registrant Contact**
必要情報を記入。
ただし、猛烈注意事項がありますので、別途後述します。

#### **My Registrant, Administrative and Technical Contacts are all the same**
「**Yes**」を選択します。

#### **Privacy Protection**
「**Hide**」を選択します。

全部記入したら画面を進めて、「**Complete Perchase**」をクリックします。
**Go To Domains**をクリックするとドメイン一覧画面に移動できます。

# WHOISに公開される情報
ここが猛烈注意事項です。日本のレジストラだと個人情報を非開示にできますが、Gandiで汎用JPはちょっと微妙な挙動を見せていました。常にこうなるとは限りませんので、参考程度に……
ちなみに、Privacy Protectionは「**Hide**」にしています。

18:50(JST)　Route 53経由で申請完了
　↓
JPRSのWHOISで確認

|項目 | 開示内容 |
|:---|:---:|
|名前|**個人情報が開示される**|
|Name|**個人情報が開示される**|
|Email|Gandiの情報|
|郵便番号|**個人情報が開示される**|
|住所|**個人情報が開示される**|
|電話番号|**個人情報が開示される**|
|最終更新|19:09:03 (JST)|

　↓
JPRSのWHOISで確認

|項目 | 開示内容 |
|:---|:---:|
|名前|**個人情報が開示される**|
|Name|**個人情報が開示される**|
|Email|**個人情報が開示される**|
|郵便番号|Gandiの情報|
|住所|Gandiの情報|
|電話番号|Gandiの情報|
|最終更新|20:06:48 (JST)|

ご覧のように、申請後、約20分で登録されていました。ただし、個人情報が大公開されています。そして、なぜかメールアドレスだけはGandiのアドレスになっていました。
さらに1時間後に、個人情報がGandiの情報に書き換わっていました。ですが今度はメールアドレスが開示されます。

これがシステム上の仕様なのか、単なる操作ミスなのかは不明ですが。どちらの場合であっても開示される可能性があるってことで、個人で申請される方は気にしながら登録した方が良さそうです。

また、名前とメアドはどちらにしても開示されるようなので、名前はどうしようもないですが、メアドは専用のアドレスを使った方が安全ですね。
弱小PHPerがRailsに浮気して困惑したことn選

## 弱小PHPer、RoRを触る
PHPをずっと触ってきた弱小プログラマですが、無謀にも今月からRoRで開発する会社に転職してしまいました。
そろそろ１ヶ月が経つのですが、最初から慣れないことだらけでつまずきや戸惑いの連続でした。
この記事ではそんな中での大小さまざまな困った点を晒していこうと思います。似たような境遇の方々の助けになれば幸いです。

## 出くわした問題たち
### あれ、returnは？
```rb
def set_data(id)
  @data = Data.find(id)
end
```
熟練のRubyistたちには当たり前のことなのだと思いますが、
上の例のようにメソッド内にreturnの記述が全然見当たらないことに最初はとても戸惑いました。
rubyでもreturnを書こうと思えば書けるみたいなんですが、自分が見ている範囲では今の所あまり見ないです。
どうもrubyは最後に評価された値が自動的に返却されるようで、こういう書き方ができるみたいですね。
最近は少しずつ慣れてきて、このメリットをようやく感じられるようになってきました。
確かに記述を簡素にできるのはいいですね！

### 見慣れないパーセント
```rb
keys = %w(a b c d)
```
入社から数日、こんなコードを発見した時には途方に暮れてしまいました。なんだこれは、と。
これは%記法というもので、上のwの例は要素が文字列の配列を生成する表現だそうなのですが、
クオート文字列やその他用途に合わせて色々なことができるようで、調べてみると色々な種類があることがわかります。
調べればなんてことはないんですが、最初は「ruby %w」とかで検索してもめぼしい情報には当たらず、なかなかの衝撃度でした。

### arel_table
複雑なSQLをコードで組む時に利用するRailsのAPIなのですが、
現在進行形で絶賛消耗中です。これが一番ややこしいかもしれません。

### Hashから値が取れない！
私が一番ハマったポイントです。このために記事を書こうと思ったと言ってもk（ry
リクエストパラメータから受け取ったkeyでハッシュの値を取得しようとする下記のようなコードがあったとします。

```rb
params[:p] # => "1"
​
key = 2
hash = { 1 => 'foo', 2 => 'bar' }
​
logger.debug('==============')
logger.debug(hash[params[:p]])
logger.debug(hash[2])
logger.debug('==============')
```

実行するとどうなるかと言うと、、、

```rb
==============

bar
==============
```

はい、パラメータから取得の方は見事に取れてません。
この問題（？）で何よりも困ったのはエラーも何も出ず、ただただ値が取れないだけ、という点になるのですが、
実際出くわした時のコードはもっと複雑で、どこで間違ったのが全然わからず３時間くらい浪費しました（泣

ではどうすればよかったのかと言うと

```rb
logger.debug(hash[params[:p].to_i])
```

そうです。パラメータから受け取った値は文字列になっているので数値に変換してあげればよかったわけです。

``` rb   
==============
foo
bar
==============
```

これでめでたく値が取れました^^
PHPではこんなことなかったので、型には気をつけなければいけないですね（汗

## 最後に
とりあえず覚えてる範囲で書き出してみましたが、他にもいっぱいあった気がします（汗
PHPとRubyは似てるだろうと思い込んで飛び込んでみましたが、実はそうでもないんじゃないかな、と思い始めてます。
言語仕様もさることながら、そもそも根底の考え方というか、
文化圏、経済圏、民族的出自みたいなものを異にするんじゃないかなぁ、というのが今の所の印象です。
（また経験を積んでいけば捉え方も変わるかもしれません）

とはいえ私のRuby&Rails歴はまだ１ヶ月に満たない状態で、まだまだこれからもいろんなポイントでハマっていくと思いますので
何かあれば引き続き更新していきたいと思います。

それでは皆さま良きエンジニアライフを！
Kotlin+Dagger2でkaptのバグ発生時の解決策

`kapt`の実装で100%KotlinでもDagger2を使えるようになったが、まだバグがあるようだ。

以下のバージョンでの話なので注意。

```groovy
kotlin_version = '1.0.0-beta-4589'
dagger_version = '2.1-SNAPSHOT'
```


実装したかったこと
---
`@Scope`を使って`Application`と`Activity`で提供するものを変える。
ただし、提供するオブジェクトの型は同じで、`Application`では都度生成、`Activity`内ではシングルトン扱い。

という感じのよくありそうなことをやろうとした。


実装
---
以下の様なモジュールを定義。

```kotlin
@Module class ApplicationModule {
    @Provides @ApplicationScope fun provideString() = "Application"
}

@Module class ActivityModule {
    @Provides @ActivityScope fun provideString() = "Activity"
}
```


バグの内容
---
通常はDagger-Compilerにより`@Provides`それぞれに`Provider`クラスが生成されるのだが、これをコンパイルしたら、`Provider`クラスがだけが生成されず、`javac`でエラーになってしまう。

[Dagger2 Issuesで報告してみた](https://github.com/google/dagger/issues/297)が、Kotlinのバグだと返されたので、KotlinのIssueTrackerへ。
探していると[全く同じ報告](https://youtrack.jetbrains.com/issue/KT-9804)がすでにあり、解決策も記述してあった。


解決策
---
メソッド名を変えるだけで良い。

```kotlin
@Module class ApplicationModule {
    @Provides @ApplicationScope fun provideString() = "Application"
}

@Module class ActivityModule {
    @Provides @ActivityScope fun provideString() = "Activity"
}
```


まとめ
---
1日潰した。
バグ報告の前にちゃんと確認しよう・・・


リンク
---
* [KT-9804 kapt doesn't generate dagger2 stub in case overriding a module](https://youtrack.jetbrains.com/issue/KT-9804)
* [`XxxModule_ProvideXxxFactory` classes are not generated in Kotlin](https://github.com/google/dagger/issues/297)
* [検証コード](https://github.com/kubode/KotlinDaggerIssue)
Ruby / Railsでマルチバイト文字の境界を意識しつつ指定のバイト数以下に切り捨てる

DBに文字列を格納する時にレコード長の制限があったりして、指定のバイト数以下に切り捨てたいことがあります。

例として8バイト以下に切り捨てたい場合で説明します。説明の便宜上、上限値をMAX_BYTESIZEで定義しておきます。

```rb
pry(main)> MAX_BYTESIZE=8
=> 8
```

ASCII文字だけならこんなかんじで簡単なんですが、

```rb
pry(main)> 'abcdefghijklmn'.byteslice(0...MAX_BYTESIZE)
=> "abcdefgh"
```

マルチバイト文字が入ってくると若干めんどくさいです。
マルチバイト文字の境界を何も考えずにぶった切ると、こんなかんじで末尾にゴミが入ってしまう可能性があります。

```rb
pry(main)> 'こんにちは'.byteslice(0...MAX_BYTESIZE)
=> "こん\xE3\x81"
```

こんなよくありがちな用途の汎用メソッドがRailsにないはずがないと思って調べたら、
`ActiveSupport::Multibyte::Chars#limit` でできることが分かりました。

```rb
pry(main)> 'こんにちは'.bytesize
=> 15
pry(main)> 'こん'.bytesize
=> 6
pry(main)> 'こんに'.bytesize
=> 9
pry(main)> 'こんにちは'.mb_chars.limit(MAX_BYTESIZE)
=> #<ActiveSupport::Multibyte::Chars:0x007fb59e37d420 @wrapped_string="こん">
pry(main)> 'こんにちは'.mb_chars.limit(MAX_BYTESIZE).to_s
=> "こん"
pry(main)> 'こんにちは'.mb_chars.limit(MAX_BYTESIZE).to_s.bytesize
=> 6
```

素のRubyで使いたい場合はActiveSupportだけ個別にインストールすればよいんじゃないかと。

---
(2017/04/18追記)
Ruby 2.1.0で追加されたString#scrubという不正なバイト列を除去するメソッドを使った方が素のRubyだけで実装できるしパフォーマンスも速かった。

```
[12] pry(main)> "寿司\u{1f363}"
=> "寿司🍣"
[13] pry(main)> "寿司\u{1f363}".size
=> 3
[14] pry(main)> "寿司\u{1f363}".bytesize
=> 10
[15] pry(main)> "寿司\u{1f363}".byteslice(0,10)
=> "寿司🍣"
[16] pry(main)> "寿司\u{1f363}".byteslice(0,10).scrub('')
=> "寿司🍣"
[17] pry(main)> "寿司\u{1f363}".byteslice(0,9)
=> "寿司\xF0\x9F\x8D"
[18] pry(main)> "寿司\u{1f363}".byteslice(0,9).scrub('')
=> "寿司"
```

手元のMacBook Pro (Retina, 13-inch、Early 2015)で軽くベンチーマークとってみた

```rb
require 'benchmark'
require 'active_support/multibyte'
MAX_LINE_SIZE = 10000
msg = "あ" * 3333 + "\u{1f363}"

Benchmark.bm 100 do |r|
  r.report "raw" do
    msg
  end
  r.report "byteslice" do
    msg.byteslice(0, MAX_LINE_SIZE)
  end
  r.report "scrub" do
    msg.byteslice(0, MAX_LINE_SIZE).scrub('')
  end
  r.report "mb_chars" do
    msg.mb_chars.limit(MAX_LINE_SIZE).to_s
  end
end
```

```
                user     system      total        real
raw           0.000000   0.000000   0.000000 (  0.000005)
byteslice     0.000000   0.000000   0.000000 (  0.000010)
scrub         0.000000   0.000000   0.000000 (  0.000137)
mb_chars      0.000000   0.000000   0.000000 (  0.001624)
```

String#scrub使うほうがActiveSupport::Multibyte::Chars#limitよりも一桁速いですね。
SoftEther VPNのアップデート方法

# 公式
* https://ja.softether.org/

# 概要
* SoftEther VPNのアップデートがリリースされたので自分の環境に適用したい

# 前提
* CentOS 6.x の環境でこれまでSoftEther VPN Serverを動かしている環境を最新版へアップデート
* /usr/local/src/ 下にアーカイブを管理している
* /usr/local/vpnserver/ にインストールされている

# 更新パッケージ取得
* 公式から最新版を取得
* http://www.softether-download.com/ja.aspx?product=softether
* SoftEther VPN(Freeware) → SoftEther VPN Server → Linux → Intel x64 で表示されるURLを取得

```
# cd /usr/local/src
# wget http://jp.softether-download.com/files/softether/v4.19-9599-beta-2015.10.19-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.19-9599-beta-2015.10.19-linux-x64-64bit.tar.gz
```

# アーカイブ展開
取得したパッケージを展開

```
# tar -zxvf softether-vpnserver-v4.21-9613-beta-2016.04.24-linux-x64-64bit.tar.gz
```

展開確認。vpnserver ディレクトリがある事を確認

```
# ls
softether-vpnserver-v4.21-9613-beta-2016.04.24-linux-x64-64bit.tar.gz vpnserver
```

make ( 確認事項はインストール時と同じように選択 )

```
# cd ./vpnserver
# make
```

既存ファイルを上書き

```
# \cp -rf ./* /usr/local/vpnserver/
```

バージョン確認

```
# /usr/local/vpnserver/vpncmd /help | grep Version
```

サービス再起動

```
# /etc/rc.d/vpnserver restart
```

クライアントで接続できるか動作テスト
接続クライアント側で表示されるサーバのバージョンを確認
Proguardメモ

様々なライブラリを使っているプロジェクトで設定したProguardのメモです。
利用したライブラリは以下の通りです。

* OkHttp 2.4.0
* Retrofit 1.9.0
* RxJava 1.0.12
* Dagger 2.0
* ButterKnife 7.0.1
* EventBus 2.4.0
* JsonPullParser 1.6.2

buildToolsVersionは23.0.1です。

プロジェクトのbuild.gradle

```groovy
buildTypes {
    release {
        minifyEnabled true
        proguardFiles 'proguard-android.txt'
        proguardFiles 'proguard-project.txt'
    }
}
```
proguard-android.txtはAndroidSDKのものをそのまま使い、proguard-project.txtとして以下の設定を使いました。重複している記述がいくつかありますが、相反する記述はないのでそのまま続けて書いています。

# OkHttp

https://github.com/krschultz/android-proguard-snippets/blob/master/libraries/proguard-square-okhttp.pro

```
# OkHttp
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**
```

# Retrofit

https://github.com/krschultz/android-proguard-snippets/blob/master/libraries/proguard-square-retrofit.pro

```
# Retrofit 
-keep class com.squareup.okhttp.** { *; }
-keep class retrofit.** { *; }
-keep interface com.squareup.okhttp.** { *; }

-dontwarn com.squareup.okhttp.**
-dontwarn okio.**
-dontwarn retrofit.**
-dontwarn rx.**

-keepclasseswithmembers class * {
    @retrofit.http.* <methods>;
}
```

# RxJava

https://gist.github.com/jonikarppinen/07de110fd0d9ed90b202

```
-dontwarn sun.misc.**

-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
   long producerIndex;
   long consumerIndex;
}

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode producerNode;
}

-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
```

# ButterKnife

http://jakewharton.github.io/butterknife/

```
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }

-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}

-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}
```

# Dagger2

不要でした。

# EventBus

https://github.com/greenrobot/EventBus/issues/6

```
# EventBus
 -keepclassmembers class ** {
     public void onEvent(**);
}
```

# JsonPullParser

不要でした。
Let's Encrypt!!

# Let's Encrypt
さぁ、暗号化を始めましょう！

・・・っていう勧誘ではなくて。

おそらくご存知の方が多いと思うのですが、Let's encryptという無料でSSL証明書生成しちゃおうぜプロジェクト(乱暴)というのがあります。
https://letsencrypt.org/

私自身で知ったわけではなく、こういうのあるから使ってみたら？って教えてもらったんですが。

いろいろと調べてみたところ、まぁ、普通に使えそうだな、と思ったので使ってみました。

# 仕組み？
Let's encryptを使う、というか、SSL証明書を発行してもらうには、**SSL証明書を作りたいサーバーで**Let'sEncryptクライアント(以下LEC)をインストールする必要があります。
何となくログを眺めてみてたところ、

1. LECがCSRをよしなに作る。
2. LECが DocumentRoot に適当なファイル(.well-known/ほげほげ)を生成する
3. LECがどこか(おそらくLet's Encryptサーバー)にCSR送信して申請する
4. 3.のときに合わせて2.で作ったほげほげのところを一緒にURLパラメータで送信する
5. LEサーバーが指定されたファイルにアクセスしてくる
6. LEサーバーが4.のレスポンスとしてアクセスした結果を返す
7. LECが証明書作る

てな感じだと思いました。
※だいぶ適当なので信用しきっちゃダメですよ。

いわゆるファイル認証ってやつですね。
これ、大手さん、例えばSymantec, GeoTrustなどの証明書発行手順とほぼ同じだと思います。
**クライアントがインストールしてあれば**1つのコマンドで完全に自動化出来るのが大きいと思います。

# 構築した環境について
CentOS6.5 + Apache2.2.15

# 必要なもの
- サーバー
- 自前のWebアプリケーションサーバー(私はApacheですがNginxでもOKとか)
- DNSレコード(AでもCNAMEでも可)編集権限  
LEサーバーはDNSレコードを引いてアクセスしてくるので、LECを実行したサーバーを向かせられないとダメです。
- 「あ、やべ！」と思った時に対処できる落ち着き。(←大切)

# 環境の構築
一番最初に引っかかったこと。

私はCentOS6でこの作業やったのですが、CentOS5とか6とかはデフォルトPythonが2.6以下なんですよね。
Let's encryptのインストールには**Python2.7以上**が必要そうです。

詳細な手順については・・・そのうち書きます。
メモがhistoryなもので分からない！！

# SSL証明書作ります！

```bash
./letsencrypt-auto certonly -w /var/www/html -d hoge.fuga.com -m hogehoge@mail.com --agree-tos --webroot
```

この1コマンドでおしまい！
ね、簡単でｓｈ(ry

後は /etc/letsencrypt/live/hoge.fuga.com/ の下に出来上がった

- cert.pem を SSLCertificateFile に
- privkey.pem を SSLCertificateKeyFile に
- chain.pem を SSLCertificateChainFile に

指定してあげて再起動でOKです。

Googleさんもhttpsを優先付けるとか、検索キーワードをSSLサイトにしか渡さないとかになってきましたので、
これらの対策にもいいのではないかと思いますー。

# おまけ(SANsについて)
市販のSSL証明書のサービスでは、SANsというものに対応しているものがあります。
これは、wwwありなし両方ともOKな証明書を生成するサービスです。
https://www.hoge.com でも https://hoge.com でも使えちゃうアレです。

サーバーのVirtualHostにServerAliasとして指定していたり、wwwなしをwwwありに転送かける設定をしてたりするサーバーは多いのではないでしょうか。
このSANsの設定がSSL証明書にないと、例えば、www.hoge.comで証明書作った場合、
1. https://hoge.com にアクセスする
2. 証明書はあるがFQDNが違うので証明書エラー画面が出る
3. 証明書のエラーを無視して進むと、晴れて https://www.hoge.com がエラーなしで表示される
となってしまい、1.の時にちょっとカッコ悪いです。

さて、今回のLet's encryptですが、ちゃんとこれに対応してます！

```bash
./letsencrypt-auto certonly -w /var/www/html -d www.hoge.com,hoge.com -m hogehoge@mail.com --agree-tos --webroot
```
って -dの後を , 区切りで追記するだけです！
これ別ドメインでも書けちゃうんじゃなかろうか。

ちょっとしたSSL証明書が欲しいというときには非常に便利なのでぜひ！

# おまけ(wordpress)
wordpressのサーバーの場合、-w が [wordpressのインストール先] になるのでご注意です。
私の場合は、/var/www/wordpress 以下にwordpressがセットアップされていたので、
-w /var/www/wordpress　でした。
まぁ、DocumentRoot を入力しましょうね、というおまけでした。
Xcode関連メモ

# SourceKitService crashedが出た場合の対処

* Xcodeを終了する
* ターミナルから以下のコマンドを実行し、キャッシュを削除する

```bash
$ rm -rf ~/Library/Developer/Xcode/DerivedData/*
```

# 急に重くなった場合の対処

メモリが4GBしかない古いMacBook Proで開発中に、
急に動作が重くなり、スクロールすらしなくなった・・・。
色々と試行錯誤した結果、以下の手順で解消した。

* Indexingを停止する

ターミナルから以下のコマンドでIndexing(コード補完用の索引？)を停止する。

```bash
$ defaults write com.apple.dt.Xcode IDEIndexDisable 1
```

* ログの退避

削除しても問題なさそうだったが、
念のため退避で。

```bash
$ cd ~/Library/Developer/Xcode/iOS\ Device\ Logs
$ mkdir temp
$ mv iOS* ./temp
```

* キャッシュ、スナップショットを削除

ターミナルから以下のコマンドを実行。

```bash
$ rm -rf ~/Library/Developer/Xcode/DerivedData/*
$ rm -rf ~/Library/Developer/Xcode/Snapshots/*
```

* Indexingを開始する

これをやっておかないとコード補完がおかしくなるのでやっておく。

```bash
$ defaults write com.apple.dt.Xcode IDEIndexDisable 0
```

これでダメならMac買い替えた方がよさそうｗ

# ソースコード全体を一括でコードフォーマットする

Command + a で全選択し、Ctrl + i でコードフォーマットが出来る。
ファイルの最後に1行追加したい?はい、カチャカチャッターン!

# honyahonyaをinfile.txtの最終行に追加する

## `echo 'honyahonya' >> infile.txt `
## ` sed -i 'a honyahonya' infile.txt `

`i`| (input の i 入力ファイルを編集上書き)
`a`| (add の a  ファイルの最後に1行追加してくれる)


どちらも心配なのが、最後に改行記号がないとき。
**改行コードでおわってなくても次の行になる**　*みたいよ*
AWS EC2を使って本番環境と同じテスト環境を用意する

どうもこんにちは

今回AWSを触ることが出来る機会を頂いたのでいくつか試したのでメモしておきます
やりたいことはタイトル通り、本番稼動中のEC2インスタンスと同じ条件データのインスタンスを動かしたいということです

#環境
インスタンスタイプ: m3.2xlarge
ボリューム: 200GB(180GB使用中)

このインスタンスは何をしているのかというと
EC2内でMySQLが起動しています

本来RDSでMySQLを稼動させるべきでしょうが、なぜかEC2を選択したようです


#概念
今までAWSもコンソール画面も触ったことが無かったのでサービスに関しての概念が不足していました
まず
マシーンイメージ、インスタンス、ボリューム、スナップショットがどういう風に繋がっているのか理解していませんでした

マシーンイメージ(AMI)は、インスタンス(EC2)を生成するためのもの
インスタンス(EC2)は処理を実行するためのCPUやメモリを持っていて
ボリューム(EBS)はインスタンスが使うハードディスク
スナップショット(S3)はボリュームのバックアップという認識


AMIからEC2とEBSを同時に作成することが出来ます

EC2は使うボリュームを選択することが出来、稼働中のEC2からAMIの作成も出来ます

ボリュームからはスナップショットを作成することが出来ます

スナップショットからボリュームとスナップショットのコピーを作成することが出来ます



では検証用テストインスタンスを作成するステップに移ります





#テスト環境を作成する

実際本番環境とほぼ同じ環境を作成するのはAWSを知ると簡単です
※ほぼ同じというのはLinuxなどの内部設定は同じなんですがIPは本番と違うものになります

手順は
1.稼動しているEC2インスタンスからイメージを作成
2.イメージからインスタンスを作成

の2ステップ


1.はAWSコンソールの画面左にある「インスタンス」を選択
そして本番環境のインスタンスのチェックボックスにチェックを入れる
右クリックして「イメージ」->「イメージの作成」
でAMIの作成が開始されます

注意点として
稼動中のEC2からイメージを作成するとAMIだけではなく、その時点のスナップショットが作成される
EC2稼働中にイメージを作成する時、インスタンスは停止しないと思っていたがEBSが170GBも使用しているせいかスナップショットを作り終えるまでインスタンスが停止した(5分くらい)

インスタンスが停止したのはかなり焦りました、本番が5分止まるんですからね…


2.はAWSコンソールの「AMI」を選択
1.で作成したインスタンスイメージのチェックボックスにチェックを入れる
右クリックして「作成」
「インスタンスタイプの選択」画面に遷移するので本番環境と同じインスタンスタイプを選択
「インスタンスの詳細設定」画面で、僕の場合特に設定せずに進みました
「ストレージの追加」画面では、本番と同じ容量を「サイズ(GiB)」に入力
「インスタンスのタグ付け」画面では特に設定せずに進みます
「セキュリティグループの設定」画面では「セキュリティグループの割り当て」項目の「既存のセキュリティグループを選択する」にチェックして、表示されたセキュリティグループ一覧の中から本番と同じものを選択しました
「インスタンス作成の確認」画面で設定を確認し、右下の「作成」ボタンを押します
すると「既存のキーペアを選択するか、新しいキーペアを作成します。」というのが出てくるので「既存のキーペアの選択」を選択し本番と同じキーペアを選択します　チェックも入れて「インスタンスの作成」を押してインスタンス作成開始



インスタンス作成の時に
インスタンスと1.で作成されたスナップショットからボリュームが作成されます
その作成されたボリュームをインスタンスで使って同じデータ、同じスペックの環境を構築しているということです
IPは本番と違うIPが設定されます


インスタンスを削除するとこのインスタンスに設定されているボリュームも自動で削除されるようです



#EC2インスタンスは変更せずにボリュームだけ変更する
テストデータを削除してもう一回同じ環境を整えたいけどインスタンス削除してからまた生成するのはたるいー
という時はボリュームだけを変えてあげます

必要なものとして
稼動しているEC2インスタンス
スナップショット
ルートデバイス
が必要になってきます


手順としては
1.戻したい時点のスナップショットからボリュームを作成
2.稼動中EC2インスタンスを停止
3.2.で停止したインスタンスを選択しボリュームをデタッチ
4.1.で作成したボリュームを2.で停止したインスタンスにアタッチ
5.EC2インスタンスを起動
です

気をつける点として
4.のボリュームアタッチの時に本番環境と同じルートデバイスを入力しないと接続が認識されません
ルートデバイス確認方法は、インスタンスにチェックを入れると下のほうに出てくる
「説明」「ステータスチェック」「モニタリング」「タグ」
の「説明」の左のほうに書いてあります

ルートデバイス  /dev/xvdb

みたいな ここの値は個々で変わると思います
この /dev/xvdb を一致されていないといけません


#まとめ
知っていれば簡単ですが初めてだったのでビビりながらの作業でした
もっと触ってAWSに慣れておきたいです
SoftLayer CLI使用開始までにつまづいたところ

エラー内容

```
pkg_resources.ContextualVersionConflict: (six 1.5.2 (/usr/lib/python2.7/dist-packages), Requirement.parse('six>=1.9.0'), set(['stevedore']))
```
解決策

```
sudo wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
sudo python get-pip.py
sudo pip install --upgrade six
```
参考リンク
http://discuss.flexget.com/t/solved-error-while-installing-flexget-ubuntu-server-trusty/1109/3

*****

エラー内容

```
ImportError: No module named importlib 
```
解決策

```
sudo pip install importlib
```
参考リンク
http://stackoverflow.com/questions/18819046/cant-import-importlib-even-though-its-on-path
【ネタ】動的でメンテナブルなサイト作り。現在の到達点。

※半分ネタです。

# Reactを使う
- HTMLはReactで生成（JSで書く）
- CSS設定もReact（JSで書く）
- 当然、JSでReactをめっちゃ書く。てか、JSしか書かない。

# 結果
- JSしか書かなくていい！
- HTMLとCSSなんて書く必要なかったんや！
- 煩雑なCSS管理からの開放。
- モジュール単位での管理

# 出来上がったもの
```html:これが最強のメンテナブル
<div style="margin:10px; padding: 10px;font-size:10px; background:#CCC;">
 <p style="padding-left: 10px;">メンテナブルなサイト</p>
</div>
```

- CSS設定がモジュール単位で完結しているため、余計な悪影響を与えない。
- 影響範囲をいちいち調べなくていい。
- Style指定が最強やったんや！

# これでいいのか
俺達が作りたかったものって……こういうものだったっけ……
CMSの登録処理（基本、入力、確認）を実装する簡単なサンプル

CMSでよくあるデータ登録処理をAngularJSを用いて作りました。
名前と電話番号を入力し、確認、完了へ遷移します。

## user.html
画面ベースとなるHTMLファイルです。
ここに入力画面、確認画面、完了画面のそれぞれの内容を記載します。
表示の出しわけはng-showタグを用いて、show_input、show_conf、show_compの各値がtureかfalseかで行います。

```lang:html（入力）
<div id="show" ng-show="show_input">
<span ng-repeat="error_message in error_messages" style="color:red">{{error_message}}<br></span>
<form name="myForm" novalidate>
  <label for="name">名前：</label>
  <input id="name" name="name" type="text" ng-model="name" /><br/><br/>
  <label for="tel">電話番号：</label>
  <input id="tel" name="tel" type="text" ng-model="tel" /><br/><br/>
  <button ng-click="conf()">確認</button>
</form>
</div>
```

```lang:html（確認）
<div id="show" ng-show="show_conf">
名前：{{name_conf}}<br>
電話番号：{{tel_conf}}<br>
  <button ng-click="comp()">登録</button>
</div>
```

```lang:html（完了）
<div id="show" ng-show="show_comp">
{{result}}<br>
</div>
```

## controller.js
controllerに、確認ボタン、登録ボタンをクリック時のservice呼び出しを記述します。

```lang:javascript
angular.module('myApp')
    .controller('MyController', ['$scope', 'UserRegisterService',
        function($scope, UserRegisterService) {
            $scope.show_input=true;
            $scope.conf = function() {
                UserRegisterService.conf($scope);
            }
            $scope.comp = function() {
                UserRegisterService.comp($scope);
                $scope.show_conf=false;
                $scope.show_comp=true;
            }
        }
    ]);
```

## service.js
serviceの処理を記述します。
今回は、確認ボタンクリック時に入力チェックを実施、
完了ボタンクリック時、サーバーと通信しデータを登録します。

```lang:javascript
angular.module('myApp', []);
angular.module('myApp')
    .service('UserRegisterService', ['$log', '$http',
        function($log, $http) {
            this.conf = function($scope){
                // 入力チェック
                var error = new Array();
                if ($scope.name === undefined) {
                    $scope.name = "";
                }
                if ($scope.tel === undefined) {
                    $scope.tel = "";
                }
                error = check_name($scope.name, error);
                error = check_tel($scope.tel, error);
                if(error.length == 0){
                    $scope.name_conf = $scope.name;
                    $scope.tel_conf = $scope.tel;
                    $scope.show_conf=true;
                    $scope.show_input=false;
                } else {
                    $scope.error_messages = error;
                }
            }

            this.comp = function($scope){
                $result = $http({
                    method: 'POST',
                    url: 'user.php',
                    data: { name: $scope.name, tel: $scope.tel }
                })
                .success(function(data, status, headers, config){
                    $scope.result = "登録完了";
                })
                .error(function(data, status, headers, config){
                    $scope.result = '!!通信に失敗しました!!';
                });
            }

        }
    ]);
```

全ソースファイルはここにあります。
[https://github.com/murapon/sample-angularjs-register](https://github.com/murapon/sample-angularjs-register)
Entity Framework を利用するため設計上の注意

Entity Framework で楽をするための注意点と自動生成されるクラスの扱いなど。
(データベースファーストの場合)

## テーブル

* 主キーが必須
* エンティティの関連を自動でマッピングするためには外部キーの設定が必須。
* 関連の自動マッピングを使わない場合、join 等のクエリーは自前で記述し、対応するEntity|DTOへのマッピングも自前で記述する。
* テーブル名、列名はPascalCase か lower_snake_case にする必要がある。 (名前変換機能はない)
    * CSコード上で UPPER_SNAME_CASE (SCREAM_CASEとも)が気にならないのであれば、この制限不要。
* DbContext に定義するDbSetにエンティティ名が必要(DbSet<Foo>など)なため、テーブル構造を継承したエンティティを作成しづらい。

## ストアドプロシージャ

* 自動で結果行クラスを作成する場合 動的クエリー、一時テーブルが利用できない。

## 生成されたDbContext

* データベースから自動生成するとDbSet<TTable> とストアドプロシージャとファンクションがすべてDbContextのメンバーとして定義される

## 追記

テーブル名をローマ字にすると自動生成した関連のプロパティが テーブル名 + "s" となってとっても間抜けな感じ。
Jugyouin -> Jugyouins とか。
さくらのレンタルサーバにTransmitでSFTP接続するまでの流れ

Macを使っているWebデザイナーが、黒い画面ではなくTransmitでSFTPを使うまでの流れをまとめました。
サーバはさくらのスタンダードです。

## 設定の流れ

1. 公開鍵と秘密鍵の作成
2. configファイルの設定
3. サーバに公開鍵を送信
4. Transmitで接続

## Step1: 公開鍵と秘密鍵の作成
ターミナルを起動し、次のコマンドを実行します。

```
$ ssh-keygen
```

（特にオプションをつけなければRSA方式の鍵ができるようです）

```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

保存先とファイル名の確認、パスフレーズの入力（2回）を求められるのでEnterを押して進めます。
パスフレーズは入力しなくても進めますが、12文字以上のパスフレーズを設定しておきます。 [→ 追記へ](#追記認証鍵のエラーについて)

特に変更なく進めると、「 **~/.ssh** 」ディレクトリに公開鍵「 **id_rsa.pub** 」と秘密鍵「 **id_rsa** 」が生成されたはず。
ターミナルで鍵ができているか確認してみます。

```
$ cd ~/.ssh
$ ls
```

id_rsa.pub と id_rsa が表示されればOK。

## Step2: configファイルの設定

「 **~/.ssh** 」ディレクトリに「 **config** 」ファイルを作成します。
（アナログなわたしは空のテキストファイルを拡張子なしのconfigという名前で保存しました笑）

configファイルの設定を記述していきます。

```
Host example.com
  HostName アカウント名.sakura.ne.jp
  User アカウント名
  Port 22
  IdentityFile ~/.ssh/id_rsa
  IdentitiesOnly yes
```

1行目 Host の後は任意の名前でOK。わたしはドメイン名を使います。
configファイルに複数記述しておけるので便利。

## Step3: サーバに公開鍵を送信

実はいちばん情報が解りづらいのがここでした。
（黒い画面が苦手なわたしはFTPクライアントでアップしました笑）

先に作成した公開鍵「 **id_rsa.pub** 」を「 **authorized_keys** 」という名前でサーバ上「 **/.ssh** 」にアップし、パーミッションを600に変更します。

## Step4: Transmitで接続

最後はTransmitの設定です。
サーバにconfigファイルと同じホスト名を設定するだけで、ユーザー名やパスワードの入力がなくてもSFTP接続できるようになりました。

![transmit.png](https://qiita-image-store.s3.amazonaws.com/0/111287/44cc6b5e-9f14-5b78-7f08-04b66cded8e5.png)

## 〈追記〉認証鍵のエラーについて

現段階では鍵生成時にパスフレーズを設定するとTransmitでパスワードエラーになります。
将来のバージョンで改善予定とのことですが、パスフレーズを設定しない方が簡単です。

参考）[なぜ私の認証鍵は未サポートの形式と警告されるのですか？ | PanicアプリでSSH鍵を使用する - Panic Library](https://library.panic.com/jp/general/ssh-keys/#なぜ私の認証鍵は未サポートの形式と警告されるのですか)

## 参考サイト

たくさんのサイトを参考にさせていただきました。いつもありがとうございます。

- [MacでSSH認証のための公開鍵と秘密鍵を生成する。 - CROSS HOPE](http://d.hatena.ne.jp/crosshope/20110509/ssh_keygen)
- [さくらレンタルサーバーにSSH＆公開鍵で接続してみよう！ | vdeep](http://vdeep.net/sakura-ssh)
- [頻出SSHメモ ~/.ssh/configと認証鍵まわりのこと ::ハブろぐ](https://havelog.ayumusato.com/develop/server/e258-ssh_config_memo.html)
- [SFTPのあれこれ](https://www.facebook.com/notes/komori-masaaki/sftpのあれこれ/10153206187662172)
- [ネットワーク管理の基本Tips：SSHでリモートホストに接続する前にやっておくと便利なことは？ ssh-keygenコマンド - ＠IT](http://www.atmarkit.co.jp/ait/articles/1503/20/news007.html)
- [SSH接続の設定変更方法｜さくらインターネット公式サポートサイト](https://help.sakura.ad.jp/app/answers/detail/a_id/2425)
- [PanicアプリでSSH鍵を使用する - Panic Library](https://library.panic.com/jp/general/ssh-keys/)
Git | ひとつ前の作業ブランチに切り替えるコマンド ( $ git checkout -  )

# 解決

表題の通り。

`$ git checkout -` 

チェックアウト先にハイフンを書く。


# 動作

ただし二つ以上前の状態には戻れない。

二回目に `$ git checkout -` すると、今度は「進む」動作になる。

つまりこれを繰り返すと。二つのブランチを交互に切り替えることになる。

```bash
$ git checkout master # => master

$ git checkout fix # => fix

$ git checkout - # => master

$ git checkout - # => fix
```

# 補足

表題には「ブランチ」と書いたが。
正確には「前のチェックアウトの状態」である。

前の作業状態がリビジョンに対してであれば、それに戻る。

```bash
$ git checkout 10ce8f3 # => 10ce8f3

$ git checkout master # => master

$ git checkout - # => 10ce8f3
```


# 環境

- git version 2.3.8 (Apple Git-58)
- Mac OSX Yosemite 10.10.4



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Retrofitでステータスコードがエラーの場合のレスポンスをパースする

# やりたいこと
Retrofitでは、ステータスコード200の場合はsuccessになりますが、404や422、500の場合はfailureになります。


```java
Api.getUser(id, new Callback<User>() {
    @Override
    public void success(User user, Response response) {
        // ステータスコード200の場合はここ
    }

    @Override
    public void failure(RetrofitError error) {
        // ステータスコード404、422、500などのエラーの場合はここ
    }
});
```

ただ、サーバー側でエラーの時に特定のエラーコードやエラーメッセージを返してそれをAndroid側で扱いたいことがあります。

例えば、GitHubの[API](https://developer.github.com/v3/#client-errors)で422を返す時、エラーの内容がjsonで返ってきます。これを扱いたい場合のやり方です。

```json
HTTP/1.1 422 Unprocessable Entity
Content-Length: 149

{
  "message": "Validation Failed",
  "errors": [
    {
      "resource": "Issue",
      "field": "title",
      "code": "missing_field"
    }
  ]
}
```

# getBodyAs()を使う

結論から言うと、 `retrofitError.getBodyAs()` を使います。

```java
Api.getUser(id, new Callback<User>() {
    @Override
    public void success(User user, Response response) {
        // 略
    }

    @Override
    public void failure(RetrofitError error) {
        // ErrorMessageモデルにパースする
        ErrorMessage errorMessage = (ErrorMessage) error.getBodyAs(ErrorMessage.class);
    }
});
```

RetrofitErrorクラスの中をみてみると、Converterを使ってリフレクションしています。これはRetrofitの通常のパースのやり方と同じですね。

```RetrofitError.java
public Object getBodyAs(Type type) {
  if (response == null) {
    return null;
  }
  TypedInput body = response.getBody();
  if (body == null) {
    return null;
  }
  try {
    return converter.fromBody(body, type);
  } catch (ConversionException e) {
    throw new RuntimeException(e);
  }
}
```

以上です。
SFTPのメモ


ローカルのMacから、あるサーバーのファイルを別のサーバーに送りたい時、
SSHFSでマウントするためのaliasを作るのもめんどくさくて、
SCPコマンドを実行するものめんどくさくて、
Filezillaかなんかのクライアントでやるのもめんどくさそうだと思って、
SFTPをterminalからやったら簡単便利だったのでメモ。

## 違い
SCP,SFTPの違いは以下を見ればわかる
http://qiita.com/cyberblack28/items/275c5df386a50b224765
SFTPとFTPSの違いは以下を見れば分かる
http://qiita.com/kasei-san/items/bf766e6c2ececa4c3905

SSHFSはローカルにリモートのFSをマウントする

## 穴兄弟の使い分け方
どれもssh config読みこんでくれて同じポートに安全に接続してくれて滅茶便利なのだが、
以下の用に使い分けるのが正しいのか？

|コマンド|使いみち|
|---|---|
|SSH|リモートシェル叩きたい|
|MOSH|接続が切れないでリモートのシェル叩きたい |
|SCP|リモートシェル叩かずにファイルの移動をしたい|
|SFTP|リモートとローカルのシェル叩いてに柔軟にファイルの操作をしたい|
|SSHFS|リモートのFSをローカルにマウントしてローカルから操作したい|

## SFTPのコマンド備忘録
※ lがlocalコマンドのプレフィックスになる  

|用途|コマンド|
|---|---|
|接続| $ sftp \<host\> # ssh/configのhost名 |
|リモートのパス| $ pwd |
|ローカルのパス| $ lpwd |
|リモートからローカルにDL| $ get \<remote filename\> # -rで再帰的な感じ |
|ローカルからリモートにアップロード| $ put \<local filename\> # -rで再帰的な感じ |

## FTPコマンドの備忘録
|用途|コマンド|
|---|---|
|接続| $ ftp \<host\> # IDとPWをその後入力する |
|リスト| $ ls |
|チェンジディレクトリ| $ cd |
|ファイルのアップロード| $ put |
|ファイルのダウンロード| $ get |
|正規表現を使ってファイルのアップロード| $ mput \<regexp\> |
|正規表現を使ってファイルのダウンロード| $ mget \<regexp\> |

##  一気にフォルダごとDLする方法
```:sh
$ wget -r --user="user@login" --password="Pa$$wo|^D" ftp://server.com/
```

その他のコマンドは以下にある
http://answers.stat.ucla.edu/groups/answers/wiki/7a848/Using_SSH_and_SFTP_in_Mac_OS_X.html

##参考文献
https://www.digitalocean.com/community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server
http://stackoverflow.com/questions/113886/how-do-you-recursively-ftp-a-folder-in-linux
Pi Stack Switch

## Install
1. Set prerequisites
	
	`$ sudo rpi-update`

	`$ sudo apt-get update`

2. Install Java JDK & Git
	
	`$ sudo add-apt-repository ppa:webupd8team/java`

	`$ sudo apt-get install oracle-java7-jdk`
	
	`$ sudo apt-get install git-core`

3. Install default package for CCNx
	
	`$ sudo apt-get install libssl-dev expat libexpat1-dev libcrypto++9 libcrypto++-doc libssl1.0.0 libssl1.0.0-dbg ant libpcap-dev libxml2-dev python-software-properties`

4. Download the CCNx source code
	
	`$ wget www.ccnx.org/releases/ccnx-0.8.2.tar.gz`

	`$ tar -zxvf ccnx-0.8.2.tar.gz`

5. Build the CCNx source code
	
	`$ cd ccnx-0.8.2/`

	`$ sudo ./configure`
	
	`$ sudo make`
	
	`$ sudo make install`
    
6. Clone icPhone App from GitHub

	`$ git clone https://github.com/MobileConvergenceLab/icPhone-phoneapp.git`
	
7. Run CCNTalk or CCNVoice application by JAR file
	
	`$ cd icPhone-phoneapp`

	`$ java -jar CCNTalk.jar` or `$ java -jar CCNVoice.jar`

&nbsp;&nbsp;
npmを高速化するツールpnpm



どの言語でもパッケージマネージャが遅い問題はあるもんだ

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

----
------------------- ↓ 余談はここから ↓-------------------
Node.jsはパッケージ依存の強い言語でもあるので、
パッケージマネージャーのお世話になる人は後を絶たない。
そしてデフォルトで存在するパッケージマネージャnpmはそれそれは遅い。

今回はそれを高速化する
------------------- ↑ 余談はここまで ↑ -------------------

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

----
------------------- ↓ 本題はここから ↓-------------------

インストールは簡単

```shell-session
$ npm install -g pnpm
```

コマンドはnpmの代わりにpnpmを使う

```shell-session
$ pnpm install hexo
```


------------------- ↑ 本題はここまで ↑ -------------------

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

----
------------------- ↓ 後書はここから ↓-------------------


------------------- ↑ 後書はここまで ↑ -------------------
iosエンジニアがRxSwift導入するために学んだことまとめ

今日からRxSwiftはじめる方へ。

#最初の導入
##概念理解
まずはstream(observable)の理解
[【翻訳】あなたが求めていたリアクティブプログラミング入門](
http://ninjinkun.hatenablog.com/entry/introrxja)




Cold,Hotについて
http://qiita.com/toRisouP/items/f6088963037bfda658d3




#コードを触る
RxSwift
https://github.com/ReactiveX/RxSwift


まずはplaygroundを触りながら理解。
playgroundの日本語訳がこちらにまとめられているのであわせて。
http://tiny-wing.hatenablog.com/entry/2016/01/02/161322


##オススメサンプル
./RxExampleの中にいい感じのサンプルが入ってるので探す。
###githubのapiとページング
GitHubSearchRepositories

RxSwift で UIKit を扱う基本 - Qiita
http://qiita.com/usamik26/items/2bbd0b8d304ab42b2279


#より詳細に
リファレンスに目を通すことは大事。
APIReference
http://cocoadocs.org/docsets/RxSwift/2.1.0/index.html


#最新の情報をキャッチする
slackチャンネル
http://slack.rxswift.org/

ツイッター
https://twitter.com/RxSwiftLang
再認識しておくPHPスコープ



どうもこんにちは
今回はPHPスコープの事について書きたいと思います

特別な事が書いているわけではないので上級PHPerの皆さんはスルーしましょう :bird: 

今回の参照はもちろん公式です
[変数のスコープ](http://php.net/manual/ja/language.variables.scope.php "変数のスコープ")


#スコープの種類

PHPのスコープの種類は3種類しかありません

 1. ローカルスコープ
 2. グローバルスコープ
 3. スーパーグローバル

###ローカルスコープ
これは関数内スコープのことです

```php
<?php

    function func1()
    {
        $val = 'ローカルスコープ';
        return $val;
    }

    echo $val;
    echo func1();

```

これは以下のように出力されます

```
>                　// echo $val;
>ローカルスコープ   // echo func1();
```

関数内で定義した変数`$val`が出力されないのでローカル変数として扱われていることが分かります
基本的にアプリケーションを作成していくときはローカルスコープを意識してプログラミングしていきましょう



###グローバルスコープ
これは関数内で定義されていない変数のスコープになります
ただグローバルと付いていますが、関数内で直接使用する事は出来ません

```php
<?php

    $val = 'グローバルスコープ';

    function func2()
    {
        return $val;
    }

    echo $val;
    echo func2();

```

これを実行すると
`echo $val;`は`グローバルスコープ`という文字が出力されますが
`echo func2();`は`Undefined Variable: val`と言われて$val変数を認識出来ません


これを認識できるようにする場合は

```php
    function func2()
    {
        global $val; // globalキーワードを使用
        return $val;
    }
```

globalキーワードを使う事によって関数外の値を使用します
ただこのように外部の値を関数内で使用したい場合は、globalキーワードを使用するのではなく引数に追加しましょう
globalはプログラムを追うことを難しくしテストも書きにくくなってしまいます



###スーパーグローバル
全てのスコープで使用できる組み込みの変数と書いてあります

これらがそうです

- `$GLOBALS`
- `$_SERVER`
- `$_GET`
- `$_POST`
- `$_FILES`
- `$_COOKIE`
- `$_SESSION`
- `$_REQUEST`
- `$_ENV`

よく使いますね
ただ、どこでも使いたい変数を$GLOBALSに無闇に突っ込むのはやめましょう
これもグローバル変数と同じく追いづらいコードの素になります
特にglobal変数の値をバンバン変更している場合かなり危険です




#関数以外の括弧でのスコープの検証

僕が長らくPHPを使っていながら気を遣っていなかったのがfor文を使う時に宣言する変数です


Scalaの場合

```scala
var num = 10

println(num)

for ( n <- (1 to 3) ) {
  var num = n*3
  println(num)
}

println(num)
```

出力結果

```
3
6
9
10
```

Scalaでvar使うんかいというのは置いておいて
for内で宣言した変数はその括弧内で完結します
最初に宣言した`var num = 10`は、括弧内で同じ変数名numを宣言していても最後のprintln(num)で10を出力します


これを基準だと思い込んでいると罠にはまります

```php
$i = 10;

println($i);

for ($i=1; $i<=3; $i++) 
{
    println($i);
}

println($i);
```

※printlnは自作の改行echo

出力結果

```
10
1
2
3
4
```

最後の出力で僕は10を期待していたのですが4が出力されてしまいました
for文は括弧内で完結するだろうと思っていたら上書きされてしまうので注意が必要です

if式でもただの括弧内でもScalaはスコープがありますが、PHPは関数内かそれ以外という分け方になっています
何となく書けてしまったままPHPをやっていたので普段はまらないようなところで期待した動作にならないことがありました
なんという事でしょう…変数名を被らせないようたゆまぬ努力が必要です



#所感
Scala最高
関数をしっかり作ってスコープを意識すれば悲劇は起きずに済むとは思います、基本ですね


以上です
itamaeでndenv使ってnodejsを入れる時に気をつけること

```ruby
execute "install node" do
  command "ndenv install v4.2.6 -s"
end
```

``-s``つけないと２度目以降の実行時に止まる。
なぜなら既にインストールされてるケースでは以下のように聞かれるから。

```bash
ndenv install v4.2.6
ndenv: /hogehoge/.ndenv/versions/v4.2.6 already exists
continue with installation? (y/N)
```

``not_if "test -d NODEJSDIR"``とかちゃんと書かないとアカンなー

みんなは「nodejsのインストールって時間かかるんだなー」とか言いながらアホ面で画面を小一時間見てた俺のようには決してならないでくれ。
Go 情報源


まだ整理されていません

# 参照
http://qiita.com/tenntenn/items/0e33a4959250d1a55045

# 本家
* https://golang.org
* http://blog.golang.org

# SNS
## Golang JP (Google+)
https://plus.google.com/communities/107075098212007233819

## Lingr
http://lingr.com

## お気楽
http://www.geocities.jp/m_hiroi/golang/index.html

# Podcast
http://rebuild.fm/42/

# 有名人
* http://blog.restartr.com
* http://mattn.kaoriya.net
* http://lestrrat.ldblog.jp

# 技術評論社
http://gihyo.jp/dev/feature/01/go_4beginners

# Wiki
https://github.com/golang/go/wiki

# Go Web プログラミング
https://astaxie.gitbooks.io/build-web-application-with-golang/content/ja/index.html

# 検索
https://gowalker.org

# Goz
http://goz.hexacosa.net

# HashiCorp
* https://github.com/hashicorp

# Golang Samples
https://github.com/golang-samples

# 採用事例
http://tech.innova-jp.com/how-to-use-golang/

# その他
* http://hakobe932.hatenablog.com/entry/2013/12/21/143305
PHPで関数のオートロードの代わり

ちょっとしたメソッドで$thisとかselfとか書くのがしんどいとき。


http://qiita.com/k-motoyan/items/7bbaadc45e20ad7d4b4c
関数のオートロードしたい。

以下のようにするとそこそこ使えるのではないかと試している。

```php
<?php
// My/App/FizzBuzz.php
namespace My\App;

class FizzBuzz {
    /*
     * 外部に公開する関数
     */
    public static function get(array $data) {
        return fmap(FizzBuzz\fizzbuzz(), $data);
    }

    public static function show(array $data) {
        return FizzBuzz\show($data);
    }
}

namespace My\App\FizzBuzz;
/*
 * 内部用の関数群
 */

// (integer d, Functor s, MonadPlus s) => d -> a -> d -> s a
function calc(...$args){
    return f(function($d, $s, $n){
        return fconst($s, guard($n % $d === 0));
    }, ...$args);
}

function fizzbuzz(){
    return fromMaybe()->ap(mappend(calc(3, "Fizz"), calc(5, "Buzz")));
}

function pr(...$args){
    return f(function($a){
        echo $a, "\n";
        return $a;
    }, ...$args);
}

function show(array $data){
    return fmap(pr()->compose(fizzbuzz()), $data);
}
```

一ファイルにこれを書く。

使い方。

```php
<?php

use My\App\FizzBuzz;

require 'vendor/autoload.php';

FizzBuzz::show(range(1, 100));
// $data = FizzBuzz::get(range(1, 100));
// var_dump($data);
```


FizzBuzzクラスをFizzBuzz名前空間の外部公開用エイリアスとして使う。クラス名に名前空間名をかぶせる。
My\App名前空間には関数が漏れないので、害になることはない…はず？
btsync

## download

* [BitTorrent Sync - Desktop Platforms](https://www.getsync.com/intl/ja/platforms/desktop#linux)

## 準備

```bash:
tar xzf BitTorrent-Sync_x64.tar.gz
```

```bash:help
./btsync --help

BitTorrent Sync 2.3 (239)
Usage:
	  btsync [ options ... ]
Options:
	--help                    Print this message
	--config <path>           Use a configuration file
	--storage <path>          Storage path for identity and license
	--identity <user name>    Creates user identity
	--license <path>          Apply owner license
	--nodaemon                Do not daemonize
	--dump-sample-config      Print a sample configuration file
	--log <file>              Set log file
	--webui.listen <IP>:<port> Set the webui listening interface
	--generate-secret         Generate a read/write key
	--get-ro-secret <r/w key> Get the read-only key associated to a read/write key
```


## 起動/終了

```bash:
./btsync
```

* http://localhost:8888

![img.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d554fe8a-3bc8-5a0c-9385-92f761103d54.png)


```bash:終了
killall btsync
```
RDSのインスタンス生成に失敗する一例

## なに

RDSのインスタンス作成時の最後で以下のエラー。

```
You must specify a MonitoringInterval value other than 0 
when you specify a MonitoringRoleARN value. 
(Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterCombination; Request ID: xxxxxxxxxxxxxx)
```

## 対策
もう一度1から操作をしたらエラーにならなかった

## 原因（予想）
最近追加された「拡張モニタリングを有効にする」を一度オンで選択しようとして、また「いいえ」に戻すような操作をすると、オン側のエラーチェックが走るのではなかろうかと思います（そういう操作をしたので）。

サービスをdisっている訳ではなく、いわゆるSingle Page Application的な場合の、エラーが起きたときの原因の可能性の1つとしての備忘録
テキストから簡単にANSIエスケープシーケンスを消す 

コマンドラインやシェルの実行結果が色付きのテキストだった場合、テキストファイル（リダイレクトなどで）保存すると、

![スクリーンショット 2016-01-29 16.35.39.png](https://qiita-image-store.s3.amazonaws.com/0/43781/75362c4a-f863-1ed7-b12d-b67759600a0a.png)

上のような感じで`[`と`m`だらけになっちゃって困りますよね。これを簡単に解決します。

やり方は、Sublime Text などのまともな正規表現が使えるエディタで

```(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]```

を空白に置換するだけ。

以下がデモです。

![unescape.gif](https://qiita-image-store.s3.amazonaws.com/0/43781/25c6cfb5-db89-c3f2-46d7-e6a86498b45a.gif)