OmniAICreator/Qiita-1.07M huggingface dataset:
Lambdaで動くプログラムを作る

# EclipseからJavaのプロジェクトを作成する。

AWS Toolkitを導入しているので、ツールバーの四角いアイコンからAWSのサービスに特化したEclipseプロジェクトが作成できます。

![5-1.create project.png](https://qiita-image-store.s3.amazonaws.com/0/169729/f6a8c42a-a5b5-6e87-bb7c-baf75ea99ad2.png)

上から2番目の「New AWS Lambda Java Project」を選択するとLambdaのmavenプロジェクトを作成出来ます。（便利な世の中になりました）

プロジェクトを作成する際に「ハンドラー・タイプ」というものを決めます。
Lambdaの開発者ガイドに「イベントに応答してコードを実行できます」と書いてある通り、何かのイベント（S3へのアクセスやKinesisへのput）を受け取って動くものがハンドラーです。

今回はS3へのイベントをハンドリングしたいので、Request HandlerとS3 Eventを選択します。
![5-2.create project.png](https://qiita-image-store.s3.amazonaws.com/0/169729/fdfcca91-7b53-3a6b-8e3d-092360ed7c28.png)

で、Eclipseプロジェクトが出来たのは良いのですが、しょっぱなからコンパイルエラーが出ています。
なんで？

![5-3.create project.png](https://qiita-image-store.s3.amazonaws.com/0/169729/6b254528-603e-4127-d1aa-ceb7df6b8e12.png)

どうもOverrideアノテーションにエラーが出ているようですが、JDKは1.5なので大丈夫
ん？なんで1.5なの？

とりあえずJDKは1.8を導入しているので、いまさらコンパイラー準拠レベル1.5を使う事は無いと思い1.8に変更することでコンパイルエラーは出なく無くなりました。
※1.5でも大丈夫なはずなのですが、深追いしてもあまり意味が無いため放置します。

![5-4.create project.png](https://qiita-image-store.s3.amazonaws.com/0/169729/0b221840-5d1b-0e10-759b-5452f381ceaf.png)

めでたくコンパイルエラーも無くなったので、さっそくdeployして動作確認です。
ドロップダウンメニュー表示時の効果を実装する（スマートフォンサイトなど）

スマートフォンサイトでは限られたスペースを有効活用するために、画面上にハンバーガーボタンを設置して押下すると、メニューを表示するデザインを良く見ます。私もそのような効果を利用したかったんですが、OSSのライブラリやjQueryのプラグインでは不要な機能が付いていたり、デザインや利用箇所が制限されていたため自作しました。

```html
<script type="text/javascript">
  "use strict";
  function move() {
    const view_obj = document.getElementById('smapho_menubar');
    view_obj.style.display = 'block';
    const height_size = view_obj.clientHeight;
    view_obj.style.height = "0px";
    const anime_timer = setInterval(() => {
      if(view_obj.clientHeight < height_size) {
        view_obj.style.height = view_obj.clientHeight + 10 + "px";
      } else {
        clearInterval(anime_timer);
      }
    },10);
  }
</script>
```

[サンプルページ](http://kaikusakari.github.io/dropdown.html)
サンプルページでは画面サイズで表示をCSSのメディアクエリで制御、横幅が640px以下であればスマートフォン向けのメニューを展開するリンクを表示するようにしています。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/110457/c98627b0-2299-9927-7b2b-4f5de853cc0e.png)


事前にメニューを作成して非表示としておき、ボタンが押下されたらメニューを縦幅0pxで表示して、少しずつ縦幅を増やしてアニメーションのように見えるように実装しています。（上記例では10msごとに10px伸ばしています）
さくらVPS 2Gの東京・石狩 それぞれの通信速度を計測

#iperfで測定
測定するにはサーバーとクライアント両方にインストールしました
Ubuntu16.04にインストール
`$sudo apt install iperf`

サーバー側でまず最初に立ちあげて待ち受けます
`$iperf -s`
フラグの"-s"はServerの頭文字

次にクライアント側を立ちあげて測定開始します
`$iperf -c ip_address`
フラグの"-c"はClientの頭文字

#測定結果
自宅の大阪からそれぞれのサーバーと接続して10秒間、4回計測

東京は
`[  4]  0.0-10.1 sec  34.1 MBytes  28.2 Mbits/sec
[  5]  0.0-10.2 sec  34.2 MBytes  28.3 Mbits/sec
[  4]  0.0-10.1 sec  34.1 MBytes  28.3 Mbits/sec
[  5]  0.0-10.2 sec  34.2 MBytes  28.3 Mbits/sec
`
東京はだいたい10秒間で28Mbitsなので一秒間に28Mbits / 8bits = 3.5Mbytesの通信速度

石狩は
`[  4]  0.0-10.2 sec  31.5 MBytes  25.8 Mbits/sec
[  5]  0.0-10.2 sec  29.0 MBytes  23.9 Mbits/sec
[  4]  0.0-10.2 sec  33.8 MBytes  27.7 Mbits/sec
[  5]  0.0-10.2 sec  33.2 MBytes  27.4 Mbits/sec
`
石狩は大阪から東京に比べて離れているのでちょっと遅くなりました
CSS :notを使ってみる


### はじめに

今回は、引き続きRedmineのプラグインを作る段階で、ちょこちょこ使ってみたことのメモです。

### やりたいこと

- あるリンクをマウスオーバーすると、少しだけ大きく表示させたい
 - アニメーション的にちょっと大きくして、利用者さんの注意をちょっとだけ向けたい
- ただし、非活性化(disabled) になっている場合は、マウスオーバーでの上記の動作は無効化したい

とりあえず、最低限の結果のサンプルはこちらです。

- [JS Binを使ったサンプル](http://output.jsbin.com/diwudi/1) 
 - 実際に使ってみているところ: [Issue Template Plugin](https://github.com/akiko-pusu/redmine_issue_templates)
 
### どうやれば良い？

#### サーバサイド側（前提条件）

- 以下のようなhtml.erbを準備、初期状態は class="disabled" にしておく
- サンプルなのでjQueryとBootstrap (アインコン用）を取り込んでいますが、これはなくてもOK

```
<script src="https://code.jquery.com/jquery-1.11.3.js"></script>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" type="text/css" />

<a class="icon icon-reload disabled" href="#" 
   title="<%= l(:revert_before_applying_template) %>" 
   id="revert_template"
   onclick="revertAppliedTemplate();" >
  <%= l(:revert_before_applying_template) %>
</a>
```

#### フロント側

 - クラス指定にdisabled属性がある場合は少し透過させておく
 - disabledの状態は、他の処理のajax処理の結果を受けて、jQueryで解除する

```
  // ajaxの処理結果を受けて、上記のリンクのclass指定: disabledを解除したり付けたり
  $('#revert_template').toggleClass('disabled');
```

実際にリンクを少しだけ大きくしたり、透過の調整をするのはCSS。
(あまりCSS慣れていないのですが、CSSだけでもいろいろできるのを知って目がウロコです...）

- disabledで透過が入っている時はアニメーションを当てたくないので、否定の擬似クラス(:not) を利用

```source:css

#revert_template {
    display: inline-block;
    
    /* CSSのアニメーションの設定、0.3秒間で動作 */
    -webkit-transition: .3s ease-in-out; // Chrome、Safari向け
    transition: .3s ease-in-out;
    padding-top: 1px;
    padding-bottom: 1px;
}

/* disabledが付いているときは、要素を薄くしておく */
#revert_template.disabled {
    filter: alpha(opacity=20);
    -moz-opacity: 0.2;
    opacity: 0.2;
}

/* クラスに"disabled"が付いている場合を「除いて」、マウスオーバーした時 */
#revert_template:not(.disabled):hover {
    /* scale という名前でアニメーション効果そ設定、0.4秒かけて調整 */
    -webkit-animation: scale .4s ease-in-out;
    animation: scale .4s ease-in-out;
}

/* 実際の "scale" として定義した動作の定義 */
@-webkit-keyframes scale {
　　 /*　% はアニメーションの時間のうちどれくらいの割合でサイズを調整するか */
    0%   { transform: scale(1.0); }
    25%   { transform: scale(1.04); }
    50%   { transform: scale(1.1); }
    75%  { transform: scale(1.04); }
    100%  { transform: scale(1.00); }
}

@keyframes scale {
    0%   { transform: scale(1.0); }
    25%   { transform: scale(1.04); }
    50%   { transform: scale(1.1); }
    75%  { transform: scale(1.04); }
    100%  { transform: scale(1.00); }
}

```

もうすこし、ちょっとしたところでCSSを利用していきたいです...。
没入・離脱サイクルを高速に回すことで問題解決！

# PCの前にずっと座っているだけじゃ捗らない
タバコなり休憩室なりに意識的に行って、A←→B間の移動を意図的に起こす！
解決策が思い浮かぶのはこの移動中なのだ！
Python > function > Closure

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2694 / 12833)

Closure

> This is a function that is dynamically generated by another function and can both change and remember the values of variables that were created outside the function.

試してみた。

http://ideone.com/ehuo2k

```py
def define_closure(member):
	def Kagemusha():
		return "%s is my decoy" % member
	return Kagemusha
	
aKgms = define_closure("7of9")
bKgms = define_closure("Tuvok")
cKgms = define_closure("Janeway")

whoIsKagemusha = aKgms()
print(whoIsKagemusha)

whoIsKagemusha = bKgms()
print(whoIsKagemusha)

whoIsKagemusha = cKgms()
print(whoIsKagemusha)
```

```txt:結果
Success	time: 0 memory: 23304 signal:0
7of9 is my decoy
Tuvok is my decoy
Janeway is my decoy
```

Closureの使い方はそのうち身につける。

https://en.wikipedia.org/wiki/Political_decoy
ローカル通知を日本時間で毎日行う場合

#概要
日本時間でローカル通知を毎日行う場合。
過去のtipsにはduplicateの関数や、定数が多かったので忘れないようにメモ。

#ローカル通知とは
- Apple公式ドキュメント （https://developer.apple.com/jp/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/Introduction.html)


#前提
- 毎日6時にローカル通知を行う
- 毎週の決まった曜日や、何週目指定でも可能
- timeZoneをlocalTimeZoneに設定してやれば、設定はGMTと比較せずに素直に行えば良い

```
    //NSCalenderのインスタンス化(NSCalendarIdentifierGregorianで強制的に西暦で計算するようにする)
    NSCalendar *calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    //日付、時間の設定（作成）を行う
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    //西暦を指定
    [comps setYear:2017];
    //月を指定
    [comps setMonth:4];
    //日を指定
    [comps setDay:6];
    //曜日を指定する場合(0が日曜日、1が月曜日、6が土曜日)
    //[comps setWeekday:5];
    //その月の何週目かに通知させる場合(例は2週目)
    //[comps setWeekdayOrdinal:2];
    //時間を指定(例は端末の設定タイムゾーンの6時)
    [comps setHour:6];
    //分を指定(例は0時)
    [comps setMinute:0];
    //NSDateに上記で設定した時間を挿入する。
    NSDate *date = [calendar dateFromComponents:comps];
    
    NSLog(@"[ログ]日時=%@", date);

    //現在の時刻から指定した時刻の長さを取得する。（秒単位で取得出来る。）
    NSTimeInterval span = [date timeIntervalSinceDate:[NSDate date]];
    NSLog(@"[ログ]現在時間との時差は%f秒",span);
    
    //全てのローカル通知を削除する（削除しないと過去のローカル通知に上書きされてしまうため）
    [[UIApplication sharedApplication] cancelAllLocalNotifications];

    //ローカル通知をさせるためのインスタンスを作成。
    UILocalNotification *notification = [[UILocalNotification alloc]init];
    
    //ローカル通知させる時間を設定する。ここで設定した時間に繰り返しローカル通知されるようになる。
    notification.fireDate = [[NSDate date] dateByAddingTimeInterval:span];
    //毎週アラームを通知させる。
    notification.repeatInterval = NSCalendarUnitDay; //1日おきに起動
    //時間をその端末のあるロケーションに合わせる。
    notification.timeZone = [NSTimeZone localTimeZone];
    //通知されたときに、アイコンの右上に数字を表示させる。
    notification.applicationIconBadgeNumber = 1; //バッジを表示させない場合はコメントアウト
    //ローカル通知されたときの文字を設定
    notification.alertBody = [NSString stringWithFormat:@"通知タイトル"];
    //通知されるときの音を指定
    notification.soundName = UILocalNotificationDefaultSoundName;
    //画面を閉じてた時にアラームが鳴った場合、スライドに表示させる文字を設定
    notification.alertAction = @"通知タイトル";
    NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"アプリを開く" forKey:@"EventKey"];
    notification.userInfo = infoDict;
    
    //作成したローカル通知をアプリケーションに登録
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];
    
    //登録されているアラームを配列に格納
    NSArray *notifiyItems = [[UIApplication sharedApplication] scheduledLocalNotifications];
    //ローカル通知に登録されている件数を確認のため表示
    NSLog(@"登録件数は%d件",(int)[notifiyItems count]);
    for(UILocalNotification *notifiy in notifiyItems){
        //ローカル通知に登録されている、alertBodyの文字列を表示する。
        NSLog(@"[ログ]:%@",[notifiy alertBody]);
    }

```
Python > function > Inner function

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2677 / 12833)

Inner Functions

> An inner function can be useful when performing some complex task more than once within another function,

試してみた。

http://ideone.com/H9k6Dp

```py
import numpy as np


def check_zundoko():
	ints = np.random.randint(2, size=10)

	def zunOrDoko(aval):
		if aval == 0:
			print('zun,'),
		else:
			print('doko,'),

	print(ints)
	for elem in ints:
		zunOrDoko(elem)
	
check_zundoko()
```

```txt:結果
Success	time: 0.03 memory: 83072 signal:0
[1 1 1 1 0 0 1 1 0 0]
doko, doko, doko, doko, zun, zun, doko, doko, zun, zun,
```
bitcoindをyumでインストール


仮想通貨系はUbuntu使うことがいいですが、実運用を考えるとCentOSで環境を整えたい。
が、面倒なのはいやなので、yumで管理したい。

## 依存ツールインストール

```bash
sudo yum install yum-utils
```

## リポジトリの追加と有効化

```bash
sudo rpm -Uvh https://linux.ringingliberty.com/bitcoin/el7/x86_64/bitcoin-release-3-1.noarch.rpm
sudo yum-config-manager --enable rhel-7-server-optional-rpms
```

>利用しないときはdisableとする。
>yum-config-managerを利用しなくても/etc/yum.repos.d/***.repoのenabledを1にすればよい。

## インストール

```bash
sudo yum install bitcoin-server
sudo yum install bitcoin-utils
```

動作チェックして随時アップデートします。

## 動かす

bitcoin.confを定義しないといけないようです。

### テストネットにつなぐ

```bash
testnet=3
server=1

rpcuser=bituser
rpcpassword=P@ssw0rd!
#rpcallowip=192.168.0.*
rpcport=8332
```

### 起動

```bash
bitcoind -deamon
```

### 動作確認

```bash
bitcoin-cli getinfo
```

### 終了

```bash
bitcoin-cli stop
```

## 参考

* https://www.ringingliberty.com/bitcoin/
* http://bitcoin.clock-up.jp/contents/install/install-by-yum
技術英語 > Here's [repurposed] example from Chapter 1: / to give a new purpose 

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 3216 / 12833)

> Here's **repurposed** example from Chapter 1:

https://www.merriam-webster.com/dictionary/repurpose
> :  to give a new purpose or use to

新しい目的を与えることを
> to **give a new purpose**

と言うようだ。
mailコマンドでgmailを送る


## やりたいこと

* Linux(CentOS)のmailコマンドでgmailにメールを送りたい。

## 環境

* CentOS7.3(postfix稼働済）

## mailコマンドのインストールと送信テスト

### インストール

まず、CentOS7.3には標準でmailコマンドが入っていないので入れます。実際はmailx。postfixは稼働しているようです。

```bash
sudo yum install mailx
```

### 送信テスト

とりあえず、送信してみます。

```bash
echo "test mail!" | mail -s "test" xxxxx@gmail.com
```

残念ながらとどきません。postfixのログを見てみます。

```bash:/var/log/maillog
.
Apr  5 17:39:19 localhost postfix/smtp[26381]: connect to gmail-smtp-in.l.google.com[64.233.189.27]:25: Connection refused
.
```

どうやらgmailのsmtpに到達できていないようです。

## Gmailの設定

数年前にGmailのセキュリティーが強化され、普通のメアド（ID）＋パスワードではgmailクライアント以外からはメールの送信ができなくなっています。gmailクライアント以外から送信する場合は専用のパスワードを取得する必要があるので取得します。

### アプリパスワードの設定


[アカウント] -> [ログインとセキュリティ ] -> [アプリパスワード]にて、パスワードを発行します。

>私は2段階認証をONにしているので上記の手順なのかもしれません。2段階認証を設定してない場合は別の設定かもしれません。

## Postfixの設定

アプリパスワードが取得できたので、Postfixの設定を行います。

### 必要コンポーネントのインストール

まずSASL認証をするために必要なコンポーネントをインストールします。

```bash
sudo yum install cyrus-sasl-plain
```

### main.cfの編集

mail.cfを編集し必要な記述を行います。gmailのアカウントは外部ファイルで設定します。

```bash:/etc/postfix/main.cf
## add for gmail
relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_use_tls = yes
```

### パスワードファイルの準備

gmailのアカウントを下記のフォーマットで記述し、ハッシュ化します。

```bash:/etc/postfix/sasl_passwd
[smtp.gmail.com]:587 xxxxx@gmail.com:PASSWORD
```
>xxxxx@gmail.comおよびPASSWORDは各自の環境で。

ハッシュ化します。

```bash
sudo postmap /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd
```

>実際利用されるのはsasl_passwd.dbファイルのようなのでsasl_passwdファイルは削除してもいいようです。

### postfix再起動

設定を反映させるためにpostfixを再起動します。

```bash
sudo systemctl reload postfix.service
```

## 送信テスト

再度送信してみます。

```bash
echo "test" | mail -s "test1" xxxxx@gmail.com
```

いちおうmaillogを確認するとstatus=sentとなっています。

```bash
.
 relay=smtp.gmail.com[64.233.189.108]:587, delay=2.4, delays=0.02/0.01/1.2/1.2, dsn=2.0.0, status=sent (250 2.0.0 OK 1491422360 v9sm39011968pfg.133 - gsmtp)
.
```

うまくいったようです。
PythonでstepAIC

## 概要

えっPythonにstepAICないの．

…と思ってたらStackOverflowに[こんな記事](http://stackoverflow.com/questions/15433372/stepwise-regression-in-python)が．

回答者が紹介しているリンク ([Forward Selection with statsmodels](http://planspace.org/20150423-forward_selection_with_statsmodels/); しかし線形回帰のみに対応し，また指標はAICではなく決定係数) を参考にstepAICを書くことにしました．

## step\_aic

```python
def step_aic(model, exog, endog, **kwargs):
    """
    This select the best exogenous variables with AIC
    Both exog and endog values can be either str or list.
    (Endog list is for the Binomial family.)

    Note: This adopt only "forward" selection

    Args:
        model: model from statsmodels.formula.api
        exog (str or list): exogenous variables
        endog (str or list): endogenous variables
        kwargs: extra keyword argments for model (e.g., data, family)

    Returns:
        model: a model that seems to have the smallest AIC
    """

    # exog, endogは強制的にリスト形式に変換しておく
    exog = np.r_[[exog]].flatten()
    endog = np.r_[[endog]].flatten()
    remaining = set(exog)
    selected = []  # 採用が確定された要因

    # 定数項のみのAICを計算
    formula_head = ' + '.join(endog) + ' ~ '
    formula = formula_head + '1'
    aic = model(formula=formula, **kwargs).fit().aic
    print('AIC: {}, formula: {}'.format(round(aic, 3), formula))

    current_score, best_new_score = np.ones(2) * aic

    # 全要因を採択するか，どの要因を追加してもAICが上がらなければ終了
    while remaining and current_score == best_new_score:
        scores_with_candidates = []
        for candidate in remaining:

            # 残っている要因を1つずつ追加したときのAICを計算
            formula_tail = ' + '.join(selected + [candidate])
            formula = formula_head + formula_tail
            aic = model(formula=formula, **kwargs).fit().aic
            print('AIC: {}, formula: {}'.format(round(aic, 3), formula))

            scores_with_candidates.append((aic, candidate))

        # 最もAICが小さかった要因をbest_candidateとする
        scores_with_candidates.sort()
        scores_with_candidates.reverse()
        best_new_score, best_candidate = scores_with_candidates.pop()

        # 候補要因追加でAICが下がったならば，それを確定要因として追加する
        if best_new_score < current_score:
            remaining.remove(best_candidate)
            selected.append(best_candidate)
            current_score = best_new_score

    formula = formula_head + ' + '.join(selected)
    print('The best formula: {}'.format(formula))
    return model(formula, **kwargs).fit()
```

## 使い方

説明変数がxとfだった場合はこんな感じ．<br>
(['y']じゃなくて'y'でもいけます)

<img width="622" alt="20170225.png" src="https://qiita-image-store.s3.amazonaws.com/0/174322/66d1d181-e350-d334-a670-40e23a083b91.png">

## あとがき

合ってるか…合ってるよな…?

みどりぼん (データ解析のための統計モデリング入門) の二項分布やロジスティック回帰の章とは回答が完全一致しました．

でも間違ってたら教えてください．
copyとdeepcopyとnumpy.copyの挙動について

ハマったのでメモ．

## コピーなし・浅いコピー・深いコピー

pythonでlistを別の変数に代入すると，「参照渡し」になる．

```python
x = [1, 2, 3]
y = x
y[0] = 999
x  # yへの変更がxにも影響を及ぼした．

>>> [999, 2, 3]
```

これを回避 (= 値渡し) するためには，copyを使うと良い．

```python
from copy import copy
x = [1, 2, 3]
y = copy(x)  # x[:]でも良い (むしろこっちのほうがシンプル)
y[0] = 999
x  # yへの変更が影響しなかった

>>> [1, 2, 3]
```

ではcopyは完全に行われたのか，というと，そうではない．
例えば，入れ子にされたlistについては参照渡しになっている．

```python
from copy import copy
x = [[1, 2, 3], 4, 5]
y = copy(x)
y[0][0] = 999
x  # copyしたハズなのに！

>>> [[999, 2, 3], 4, 5]
```

そこで，入れ子等を含め何もかもを完全にcopyしたい場合はdeepcopyを使う．

```python
from copy import deepcopy
x = [[1, 2, 3], 4, 5]
y = deepcopy(x)
y[0][0] = 999
x

>>> [[1, 2, 3], 4, 5]
```

## NumPyはどうなのか．

試してみたところ，どうやら浅いコピーと深いコピーのどちらを実行するか自動で判断されるようである．
以下の2つは，x内の2番目のリストに6が含まれるかどうか**だけ**が異なる．

```python
import numpy as np
x = [[1, 2, 3], [4, 5]]
y = np.copy(x)
y[0][0] = 999
x

>>> [[999, 2, 3], [4, 5, 6]]
```

```python
import numpy as np
x = [[1, 2, 3], [4, 5, 6]]
y = np.copy(x)
y[0][0] = 999
x

>>> [[1, 2, 3], [4, 5, 6]]
```

どうも，n次元配列に直せそうなものに対しては深いコピーを実施するようである．
行列がlistの入れ子で表現される以上まっとうな考えかただと思う．
ちなみに3次元でも同様である．

```python
import numpy as np
x = [[[1, 0], [2, 0], [3]],
     [[4, 0], [5, 0], [6, 0]]]
y = np.copy(x)
y[0][0][0] = 999
x

>>> [[[999, 0], [2, 0], [3]], [[4, 0], [5, 0], [6, 0]]]
```

```python
import numpy as np
x = [[[1, 0], [2, 0], [3, 0]],
     [[4, 0], [5, 0], [6, 0]]]
y = np.copy(x)
y[0][0][0] = 999
x

>>> [[[1, 0], [2, 0], [3, 0]], [[4, 0], [5, 0], [6, 0]]]
```

## 感想

**deepcopy最強！！！！！**

(一応) 公式曰く，深いコピー操作には2つの問題が有るとのこと．

* 再起的なオブジェクトをコピーするときに無限ループしてしまう
* 共有すべき管理データを余分にコピーしてしまう

でも個人で扱うぶんには多少冗長なコピーがあっても痛くない．
再帰処理だってそう頻繁に必要とされるものじゃないし，とりあえずハマりそうなシチュエーションではdeepcopyしとくってのは良い選択かもしれないですね．
ループ対象のlistをremoveすると酷い目に遭う

## 発端

ある日pythonコードを書いてると，変なことが起こった…

```python
x = [1, 2, 3, 4, 5]
for i in x:
    x.remove(i)
    print(x)

>>>
[2, 3, 4, 5]  # わかる
[2, 4, 5]  # ???1抜いて2抜いたら[3, 4, 5]では!?!?
[2, 4]  # ???????
```

ちなみにrubyで試してみても同じだった．

```ruby
x = [1, 2, 3, 4, 5]
for i in x do
  x.delete(i)
  print(x)
end

>>>
[2, 3, 4, 5][2, 4, 5][2, 4] => [2, 4]
```

どうも，「for i in x」というのは，

* i = x[0]  # [1, 2, 3, 4, 5]の"1"
* i = x[1]  # [2, 3, 4, 5]の"3"
* i = x[2]  # [2, 4, 5]の"5"

のように，ループをの度にxの0, 1, 2, ..., n番目を参照しようとしているらしい．


## 対策

[:]やcopy()でリストをコピーしておくとよい

```python
x = [1, 2, 3, 4, 5]
for i in x[:]:
    x.remove(i)
    print(x)

>>>
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
```

```python
from copy import copy

x = [1, 2, 3, 4, 5]
for i in copy(x):
    x.remove(i)
    print(x)

>>>
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
```

## あとがき

30分ぐらい「うーん，うーん…」って悩んでました．
numpyでゴリ押ししてると標準リストの破壊的メソッドに惑わされますね…
Numpyでループごとに行を追加していくために空の配列を作る

多分三ヶ月後に忘れてると思うのでメモ．

numpyで，空の配列にnp.r\_しようとすると怒られます．

```Python
arr = np.array([])
additional = np.array([[1, 2, 3], [4, 5, 6]])
arr = np.r_[arr, additional]
print(arr)

>>>
ValueError: all the input arrays must have same number of dimensions
```

とはいえ，↓こんなやり方はPythonicじゃないと思います．

```Python
arr = np.zeros([1, 3])
additional = np.array([[1, 2, 3], [4, 5, 6]])
arr = np.r_[arr, additional][1:]
print(arr)

>>>
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])
```

これは，numpy.emptyで解決できます．

```Python
arr = np.empty([0, 3])
additional = np.array([[1, 2, 3], [4, 5, 6]])
arr = np.r_[arr, additional]
print(arr)

>>>
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])
```

forループで配列を少しずつ追加していくときもこの方法で．

```Python
arr = np.empty([0, 3])
for i in range(3):
  additional = np.ones([1, 3]) * i
  arr = np.r_[arr, additional]
print(arr)

>>>
[[ 0.  0.  0.]
 [ 1.  1.  1.]
 [ 2.  2.  2.]]
```
macOSのJupyter + IRkernelで日本語プロット

## 概要

macで，なるべく簡単に，日本語を含む図を作りたいと思った話です．
具体的には，_.pngみたいな名前でプロットを保存し呼び出す，という原始的な方法を取ります．

ちなみにRStudioであれば，

```
par(family = "HiraKakuProN-W3")
```

で問題なく日本語が使えるので，この記事のような対策をとる必要はありません．

**※2017/04/29追記: ggplotに対応させました．**

## まえがき
**Jupyter NotebookのRで日本語プロットするとフリーズするんだけど．**

...という怒りに身を任せて作りました．

[JupyterのR kernel使用時に日本語を含むグラフを描く](http://qiita.com/jnobuyuki/items/bc560134b7db64ef4949)という記事によれば，

<blockquote>
<pre><code>
#明示的にquartzデバイスを起動
#pngファイルに保存するようにtypeとfileを設定
quartz(type = "png", file = "test.png")
#font-familyをpar関数で指定
par(family = "HiraKakuProN-W3")
#plot関数で描画
plot(0,0, xlab = "日本語", ylab = "日本語")
#quartzデバイスを定位
dev.off()
</code></pre>

次のセルをマークダウン形式にして画像を呼び出し

<pre><code>
![testpng](test.png)
</code></pre>
</blockquote>

というコードで日本語プロットが可能とのこと．
これをベースに，日本語をプロットする関数を作っていきます．

## 完成したコード

P()でプロット関数を囲むと日本語を出力できる関数です．

```R
P <- function (plot.order, width = 5, height = 5, filename = '_.png', dpi = 128,
               font.size = 12, font.family = "HiraKakuProN-W3", gg = FALSE) {
    if (gg == TRUE) {
        # themeは必要に応じて書き換える
        p <- plot.order + ggplot2::theme_gray(base_size = font.size, base_family = font.family)
        ggplot2::ggsave(file = filename, plot = p, width = width, height = height, dpi = dpi)
    } else {
        quartz(type = 'png', width = width, height = height, dpi = dpi, file = filename)
        old.par <- par(family = font.family, ps = font.size)
        p <- plot.order
        par(old.par)
        dev.off()
    }

    options(repr.plot.width = width, repr.plot.height = height)  # Jupyterを使わない場合は外す
    img <- png::readPNG(filename)
    grid::grid.raster(img)
}

SamplePlotFunction <- function() {
    plot(1:3, 1:3, xlab = '日本語', ylab = '入力', type = 'n')
    text(1:3, 1:3, c('あ', 'い', 'う'))
}

P(SamplePlotFunction())
```

![20161207.png](https://qiita-image-store.s3.amazonaws.com/0/174322/9248b7c6-2c61-a0d0-051d-7d3da0154a56.png)

* ggplotを使う人はgg = Tで．この場合ggplotオブジェクトを直接突っ込んで大丈夫です．
* フォントはお好みのものに変えてください．自分の場合は`font = "Ricty"`や`font = "MyricaM"`です．

## あとがき
Rにデコレーターがなくて辛かったです．`@JapanesePlot`とかできたら綺麗なのにな．あと，

```
foo <- SamplePlotFunction()
P(foo)
```

だとうまくいかないです．fooを作った時点で作図されるので (ただしggplotは`P(gp, gg = T)`してもOK)
今回の方法はRが遅延評価の言語であることを利用しているので，plot.orderに直接SamplePlotFunction()を代入しなければうまくいかないと思います．
Python Error Handling

Pythonでのエラー処理について自分なりにメモを取っていたものを公開します。
詳しくは以下のリンクを参照してください。

https://docs.python.jp/3/tutorial/errors.html

## 環境
Python 3.x

## Errorとは?
> エラーには (少なくとも) 二つのはっきり異なる種類があります。それは 構文エラー (syntax error) と 例外 (exception) です。

構文エラーは、Pythonの文法として間違っているものを指します。コードの外面的なエラーということもできます。Pythonはコードブロックをインデントにより表現するので、可読性が高く構文エラーを引き起こしにくい言語である気がします。

その一方で、例外はコードの内面的なエラーということができると思います。
たとえば、以下のコードはPythonのコード的には正しいものですが、数学的におかしなものですよね。

```Python
test = 10 / 0 # <= 0で除算することはできません！
```

このように、コードを実行したタイミングで起こる不具合が、例外と言えます。

## Errorに立ち向かう
構文エラーは、インタープリターがプログラムを解釈する際に自動的に検出してくれるため、怒られた箇所を修正すれば良いです。

しかし、例外にはどのように対処すればよいのでしょうか？

Pythonでは、例外を処理するために`try`や`except`といった構文が用意されています。
具体例を見てみましょう。

```Python
try:
    answer = 10 / 0
except ZeroDivisionError:
    print("divided by zero!!!")
```

上記のコードには、ポイントが二つあります。

1. `try`節のブロック内で、例外が起こりうるコードを実行する
2. `except`節のブロック内で、try節で起こりうる例外の`型`を指定して、その場合の処理を実行する

この場合は、0による除算が行われたことを示す例外である`ZeroDivisionError`がtry節から発生し、それを`except ZeroDivisionError`以下で処理しています。

このように、例外を処理するためには`try ~ except`を利用しましょう。

## さまざまな利用ケース
### 関数の実行をサポートする

二つの数値を引数として受け取り、その商を返す`divide`関数を以下のように定義します。

```Python
def divide(x, y):
    answer = x / y
    return answer
```

一見良さそうです。しかし、いままでにみてきたように割り算には注意が必要です。
`divide(10, 0)`などが実行された暁には`ZeroDivisionError`が発生してしまいます。
第２引数として0がわたされる(文字通りの0ではなく計算の結果として0が渡されてしまう)ケースも考慮して、以下のように関数を改良してみましょう。

```Python
import math

def divide(x, y):
    try:
        answer = x / y
    except ZeroDivisionError:
        print("numbers cannot be divided by zero!")
        answer = math.nan
    return answer
```

これで0で割ってしまった場合も、一応はプログラムは動くようになりました！
ただし、引数として`文字列`や`タプル`など、想定しないものが渡された場合はどうすれば良いでしょうか...
ここではその答えは記述しませんが、以下のようなポイントを押さえて実装してみてください。

1. 演算を正しく行えない場合、どのような例外の型が送出されるのか
2. 例外に対する正しいフォロー(except節での処理)が必要になりそうか

あまり例外ばかりを気にしてしまうと、コードが膨れ上がって可読性を損なうこともあるので、ケースバイケースで考えましょう。

### 例外の発生の有無を問わない共通の処理をはさむ
例外が起こるにせよ、怒らないにせよ何らかの処理を共通して挟みたい場合があると思います。
具体例としては少し苦しいですが、以下のコードをみてみてください。

```Python
try:
    answer = 10 / 0
except ZeroDivisionError as e:
    answer = math.nan
finally:
    print(answer)
```

`finally`という新しいキーワードが出てきました。
このキーワードを利用することで、例外が起こった場合にも、起こらなかった場合にも`finally`節で指定した処理が行われることになります。

ちなみに、`except`節で`as e`としていますが、これは発生した例外オブジェクトを`e`という変数で保持して、その後のブロック内で参照できるようにしているものです。
そのため、以下のようにコードを変更した場合、例外の内容を出力してくれたりします。

```Python
# 省略
except ZeroDivisionError as e:
    print(type(e)) # => <class 'ZeroDivisionError'>
    print(e.args)  # => ('division by zero',)
    print(e)       # => division by zero
```

## 変数のスコープはどうなっているの？
Pythonでは、変数のスコープは基本的にコードのインデントにより決定されます。
それでは、以下のコードで定義されている`am_i_visible`という変数は、一番したの`print()`において参照できるでしょうか？

```Python
try:
    am_i_visible = "yes"
except:
    do_something()

print(am_i_visible) # => ???
```

正解は、参照できます。`yes`が出力されると思います。
あくまで、`try`節がどこまでかを明確にするためにインデントを利用しているので、この場合は参照ができます。

Pythonはスコープが少しややこしいときがありますね...
以下の`for`文では、変数`n`がグローバル変数になってしまいますし...

```Python
sum = 0
for n in range(1, 5):
    sum = sum + n

print(n) # => 4
```

## 最後に
簡単ではありますが、Pythonのエラー処理についてまとめてみました。
Pythonの例外処理には、まだまだ触れるべきことがありますが、一旦ここでおわります。

自分自身まだまだPython歴が浅いので、アドバイスなどありましたらぜひコメント欄に書き込んでください。
AWS LambdaでQiitaに投稿してみる

# Qiita API V2を使ってAWS Lambdaから投稿
春になってAWS Lambdaを使ってみたい気持ちが芽生えたので、Qiita API経由で投稿してみました。ランタイムは`Node.js 6.10`です。普段JSをがっつり書いてないのでcallbackや変数宣言がこれでいいのか不安。ACCESS TOKENは環境変数でKMSを使って暗号化しました。

```js
'use strict';

const https = require('https');
const AWS = require('aws-sdk');

const decrypt = (encrypted) => {
  const kms = new AWS.KMS();
  return kms.decrypt({
    CiphertextBlob: new Buffer(encrypted, 'base64')
  }).promise().then((data) => {
    return data.Plaintext.toString('ascii');
  });
};
const httpRequest = (params, postData) => {
  return new Promise((resolve, reject) => {
    const req = https.request(params, (res) => {
      let body = [];
      res.setEncoding('utf8');
      res.on('data', (chunk) => {
        body.push(chunk);
      });
      res.on('end', () => {
        const ret = {
          body: body.join(''),
          statusCode: res.statusCode,
          header: res.headers
        };
        resolve(ret);
      });
    });
    req.on('error', (e) => {
      console.error(e);
      reject(e);
    });
    req.end(postData);
  });
}

exports.handler = (event, context, callback) => {
  const getQiitaToken = decrypt(process.env.QIITA);
  // 複数の環境変数を復号化する用にPromise.all
  Promise.all([getQiitaToken]).then((value) => {
    const QIITA_TOKEN = value[0];
    const postData = JSON.stringify({
      'body': "# :sake::sake::sake::sake:\n:cherry_blossom::cherry_blossom::cherry_blossom::cherry_blossom::cherry_blossom::cherry_blossom:",
      'coediting': false,
      'gist': false,
      'private': true,
      'tags': [
        {
          'name': 'javascript'
        }
      ],
      'title': 'ohanami',
      'tweet': false
    });

    const options = {
      host: 'qiita.com',
      port: 443,
      path: '/api/v2/items',
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${QIITA_TOKEN}`
      },
    };
    return httpRequest(options, postData);
  }).then((data) => {
    callback(null, data);
  });
};
```
RailsのControllerで画像のprefix付きパスを取得する


Rails の Controller から `render json` で画像ファイルパスをJSONで返すアクションを作ろうとしました。
画像ファイルパスは下記の構成のテーブルの `filename` カラムに格納されています。

```migration.rb
create_table :images do |t|
  t.string :filename
  t.timestamps
end
```

そして下記の Controller を作り、画像パスを `image_path` で取得し render しようとしました。

```controller.rb
@images = Image.all
@images = @images.map do |image|
  image.filename = image_path(image.filename)
  image
end
render json: @images
```

しかし View と Controller とでは `image_path` の挙動が違うらしく、 Controller では画像ファイル名に prefix が付かないみたいです。

これについては下記のサイトで「完全にバグとしか言えない」と言われております。
[Rails image_pathの動作が違う](https://techracho.bpsinc.jp/baba/2010_06_05/1651)

上記サイトには解決方が載っておりますが、自分は上手く行きませんでした...。

ですが、下記のように `image_path` の代わりに `ActionView::Base.new.image_path` を使うことで、画像ファイル名に prefix が付いたパスを取得することが出来ました。

```rb

@images = Image.all
@images = @images.map do |image|
  view_context = ActionView::Base.new
  image.filename = view_context.image_path(image.filename)
  image
end
render json: @images
```

因みに view で正常に動作するなら jbuilder を使えば良いのでは？ということについては自分も考えて試しましたが、何故か Controller と同じ動作をしてしまい上手く行かなかったです。
Python/Matplotlibで両側95%信頼区間を図に加える

## 基本の作図

例えばこんな感じのデータフレームがあったとする．

```
    x         y
0   2  0.954025
1   3  0.146810
2   1  0.409961
3   1  0.164558
4   3  0.782152
5   2  0.905869
6   3  0.210528
7   1  0.437970
8   1  0.801206
9   3  0.089576
10  2  0.960357
11  2  0.670732
```

このデータフレームから標準誤差付きの図を描こうとすると，こんな感じ．

```python
import numpy as np
import matplotlib.pyplot as plt
 
m = df.pivot_table(index='x', values='y', aggfunc='mean')
e = df.pivot_table(index='x', values='y', aggfunc='sem')
m.plot(xlim=[0.8, 3.2], yerr=e)
```

![20161010_1.png](https://qiita-image-store.s3.amazonaws.com/0/174322/5910fc4a-dc59-a851-8cf9-bc440943b6c5.png)

このように，yerrに誤差の大きさを指定することで，誤差棒を作成することができる．

## 信頼区間を用いた作図

そこで，信頼区間の長さを求めるcilenを定義して利用することにする．

```python
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt


def cilen(arr, alpha=0.95):
    if len(arr) <= 1:
        return 0
    m, e, df = np.mean(arr), stats.sem(arr), len(arr) - 1
    interval = stats.t.interval(alpha, df, loc=m, scale=e)
    cilen = np.max(interval) - np.mean(interval)
    return cilen

m = df.pivot_table(index='x', values='y', aggfunc='mean')
e = df.pivot_table(index='x', values='y', aggfunc=cilen)
m.plot(xlim=[0.8, 3.2], yerr=e)
```

![20161010_2.png](https://qiita-image-store.s3.amazonaws.com/0/174322/a56623a4-38c2-96fc-17c2-f276ab395c01.png)

信頼区間付きの図を作成することができた．

## おまけ

信頼区間を計算する方法は「nかn-1か」問題のせいでごちゃごちゃしてます．<br>
「車輪の再発明は避けよ」に従って，とりあえず「信頼区間 Python」とかで検索した人は，

1. [Pythonで正規分布の平均値の信頼区間を計算する方法](http://www.sat.t.u-tokyo.ac.jp/~oku/20160217/memo.html)
2. [keiskS @technote – pythonで信頼区間](https://www44.atwiki.jp/keisks/pages/174.html)

あたりを見て，微妙に違うことに困惑しつつも両方試してみて，そして結果が違うことに辟易することになると思います (なりました)．<br>
Rと同じ答えになるのは1の方．違うのは2の方です．ちょっと試してみます．

```R
> x <- c(1, 1, 3, 3)
> t.test(x)

    One Sample t-test

data:  x
t = 3.4641, df = 3, p-value = 0.04052
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 0.1626138 3.8373862
sample estimates:
mean of x
        2
```

### 1の方法

```
import numpy as np
from scipy import stats

alpha     = 0.95
data = [1, 1, 3, 3]

mean_val = np.mean(data)
sem_val  = stats.sem(data)  # standared error of the mean
ci       = stats.t.interval(alpha, len(data)-1, loc=mean_val, scale=sem_val)

print(ci)

>> (0.16261376896260105, 3.837386231037399)
```

### 2の方法

```
import math
import numpy as np
from scipy import stats

alpha     = 0.95
data = [1, 1, 3, 3]

mean_val = np.mean(data)
std_val = np.std(data)
ci = stats.t.interval(alpha,len(data)-1,loc=mean_val,scale=std_val/math.sqrt(len(data)))
print(ci)

>> (0.40877684735786857, 3.5912231526421312)
```

今回は天下のRに従うことにしたので1を採用しています．<br>
なお，2は何が違うのかというと，ciを計算する箇所の最後の方

```
math.sqrt(len(data))
```

これです．nで割ってます．しかし推測統計を行うのであればn-1で割った方が良いです．t分布を仮定するからですね．実際，

```
math.sqrt(len(data) - 1)
```

とすると，方法2の答えもRと完全に一致します．
チートリスト＆便利なGem一覧(随時追加)

パーフェクトrailsを読んだり実際にWEBアプリを作ってみた時に便利だと思ったgemを備忘録として残しています。

# 環境
ruby:ruby 2.3.1
rails:Rails 4.2.6

#gem一覧

**pry-rails** :
`rails c`でコンソールを起動した時`irb`ではなく`pry`で実行されるため、表示が整形されて綺麗。
ソースコード中に`binding.pry`を記入することでブレークポイントを設定でき、オブジェクトの参照などを行える。

**pry-byebug** :
`pry`のコンソール画面でステップ実行を行えるようになる(`next`や`step`など)。

**better_errors** :
例外が発生した場合の画面が変更され、より詳細な情報が得られるようになる。
gemの`binding_of_caller`も合わせると例外が発生した際の変数の内容が出力される。

**kaminari** :
ページネーション機能を簡単に実装できるgem、有名
`kaminari-bootstrap`を使うとbootstrapを適用できて綺麗な見た目になります。

**ransack** :
検索機能を簡単に実装できるgem、有名

**carrierwave** :
画像アップロード機能を比較的簡単に実装できるgem、有名

**rspec~** :
RSpecはRailsアプリケーションの開発におけるテストフレームワークのデファクトスタンダードです。
`rspec-rails`,`rspec-core`,`rspec-expectations`,`rspec-mocks`,`rspec-support`をinstallします。
install後は`bundle rails g rspec:install`すると設定ファイルとかヘルパーが作成されます。
※参考：http://rspec.info/documentation/ ←各Gemの概要については左記URLの記載をGoogle翻訳先生に貼れば比較的わかりやすい内容を返してくれます。Google翻訳、優秀。

#チートリスト
**rails newでプロジェクトを作成する時** :
`rails new プロジェクト名` する時以下の引数を使うことが多いです。
※参考 : http://railsdoc.com/rails
-T, --skip-test-unit : test:unitを組み込まない、テストにRspecを使用する時に引数に追加。
-d, --database=DATABASE : データベースにデフォルトのsqllite3以外を使用する場合に引数に追加。
  ※使用例 : `rails new todo -d mysql`

**タイムゾーンの設定** :
デフォルトのままだとタイムゾーンの設定がUTCとして扱われるので、日本時間を扱いたい時には以下のように設定を変更する。

```config/application.rb
  class Application < Rails::Application
    (省略)
    config.time_zone = 'Tokyo' # 修正前は'Central Time (US & Canada)' 
    (省略)
  end
```
詳しくは以下の記事が参考になります。
- [Railsと周辺のTimeZone設定を整理する (active_record.default_timezoneの罠)](http://qiita.com/joker1007/items/2c277cca5bd50e4cce5e)
- [RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い](http://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c)

**i18nの設定** :
エラーメッセージを日本語にしたい時には以下のように設定を変更する(デフォルトは英語)。
コメントアウトを外し、:deを:jaに変更する。

```config/application.rb
  class Application < Rails::Application
    (省略)
    config.i18n.default_locale = :ja # 修正前は:de
    (省略)
  end
```
その後、`config/locales/ja.yml`などに日本語のエラー文を追加していく。

**formの二重送信を防ぐ** :
登録画面などのformで、データの二重送信を防止する場合、送信中はボタンを押せないようにし、"登録中・・・"などの文字を表示したい場合がある。以下のようにdiabled_withオプションをつけると、簡単にその機能を実装できる。

` <%= f.submit '登録', class: "btn btn-default", data: {disable_with: '登録中・・・' } %>`

**落ち穂拾い** :
以下のような記載を追加することにより、「ActiveRecord::RecordNotFound, ActionController::RoutingError」が発生した時はerror404、それ以外のエラーではerror500のメソッドが実行されるようになる。それぞれ合わせてviewのerror404.html.erb、error500.html.erbも作っておくこと。

```app/controllers/application_controller.rb
  rescue_from Exception, with: :error500
  rescue_from ActiveRecord::RecordNotFound, ActionController::RoutingError, with: :error404

    (省略)

  def error404
    render 'error404', status:404, format: [:html]
  end

  def error500
    logger.error [e, *e.backtrace].join("¥n") #エラーをログに表示
    render 'error500', status:404, format: [:html]
  end
end
```

以下の一文を追加

```config/routes.rb
  match '*path' => 'application#error404', via: :all
```

ただよくよく調べていくと上記の実装方法は良いプラクティスではないとのことなのでしっかり実装する際は下記リンクのコメント欄を要参照
 - [Railsの404,500エラーページをカスタマイズ
](http://qiita.com/mr-myself/items/c2f4fb2e5dcee6a336f3)
Rails で LoadError: cannot load such file -- coffee_script と出た時

時代はES2016、もやはCoffeeScriptは必要ありません。
しかしRailsではデフォルトでGemfileにCoffeeScriptが付いてきます。

なので自分はCoffeeScriptをGemfileから削除し `bundle update` をしたのですが、下記のエラーが出て動かなくなってしまいました。


```
LoadError: cannot load such file -- coffee_script
```


Google先生に相談してみたところ、一番上に[なんかのリポジトリ](https://github.com/activeadmin/activeadmin/issues/1544)のIssueが出てきて、そこにあった下記のコマンドを打ってサーバを再起動することで解決出来ました。


``` 
bin/rake tmp:cache:clear
``` 


早くCoffeeScriptがRails標準でなくなることを祈ります。
font-familyに指定する2017年春の決定版メモ


Webサイトで表示するフォントは閲覧するユーザーの環境に依存しています。
グラフィックデザインメインの方でWebサイトのデザインを行う場合などの
**Webサイト制作をしたことのない人**だと知らない方が多いので前置き書いてます。

例えば、『ヒラギノ』を指定していても、ユーザーの環境になければ別のフォントが表示されてしまいます。
同じく、明朝体はもっと悲惨でWindowsではキレイに表示できるのがわりと最近です。
（なので基本的に日本語のWebサイトってゴシック体が多いですよね。MS明朝は超汚いので過去に全てのテキストを明朝体でデザインされた時には投げたくなりました。）

# ゴシック体の指定はこれ！

```css
body {
    font-family:-apple-system, BlinkMacSystemFont, "Helvetica Neue", "Segoe UI","Noto Sans Japanese","ヒラギノ角ゴ ProN W3", Meiryo, sans-serif;
}
```

## -apple-systemとBlinkMacSystemFont

Appleの最新システムフォント「san francisco」を指定したいので記載。
macでChromeを使う場合を想定してBlinkMacSystemFontも入れてます。

## 英数フォントの指定

フォントweightが揃っているものを指定しています。
理由はboldなどを指定した時の綺麗さを考えるとWindowsのArialなどは適さないので、Segoe UIを指定しています。

## Webフォントの指定

Webフォントの日本語は有料サービスなどが多いですが、『Noto Sans Japanese』はAdobeとGoogleが共同開発したフォントで無料で使用できますし、私は『源ノ角ゴシック』というフォントでインストールして使用しています。
(見やすくてweightも多く便利！)

このフォントを指定する場合は別途HTMLに以下を記載した上で指定してくださいね。
[Google Fonts + 日本語早期アクセス](https://googlefonts.github.io/japanese/)で他にも日本語フォントがあります。

```html
<link href="https://fonts.googleapis.com/earlyaccess/notosansjapanese.css" rel="stylesheet" />
```

## macのデフォルトフォント→Windowsのデフォルトフォントの順で

macではデフォルトでヒラギノが使用できますよね！
元々キレイなフォントなので指定。
Windowsはメイリオを指定。

mac、Windows共に利用できる**游ゴシックは今回やめました。**
個人的に細すぎてメイリオよりキレイに見えなかったのです。

## 最後にサンセリフ体の指定を忘れずに

複数指定していてもどれにも当てはまらない環境があるかもしれないのでサンセリフ体（ゴシック体）の指定をしておきます。

font-familyにこれだけ指定していると環境でデフォルトに設定されているフォントが適応されます。
macならヒラギノやOsaka、Windowsならメイリオや游ゴシック、古いパソコンだとMSゴシックとかですね。

# まとめ

Webサイトに関わらず、印刷物でもフォントはアウトライン化しておくのが鉄則だったりしますよね。
理由は入稿するとき、印刷所の方でデータ内で使用しているフォントが無いとフォントが置き換わってしまい、違うデザインになってしまうから。

Webサイトではフォントをアウトライン化みたいな事をすると全部画像でいいんじゃないかとなってしまうので、このように複数のフォントを指定します。
どれかがヒットするはずですし。

できるだけキレイなフォントでWebサイトを見て欲しいので単に『sans-serif』だけを指定するのは止めましょう。
【Unity】音声認識エンジンについて調べてみた

# 多種多様な音声認識エンジン

## Web Speech API
**精度が高く、資料が豊富で導入し易い**
単語辞書も不要なので自由な会話に向いていますがレスポンスが少々遅いです。

下記の資料で丁寧に解説されています。
筆者はオレオレSSL証明書で少し躓いたので
知らない用語を補足しながら読み進めると良いと思います。
[Chrome の音声認識を Unity で利用してみた]
(http://tips.hecomi.com/entry/20131202/1386004185)
[OpenSSL]
(https://www.openssl.org/)
[Apache/SSL自己証明書の作成とmod sslの設定]
(http://www.maruko2.com/mw/Apache/SSL%E8%87%AA%E5%B7%B1%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8mod_ssl%E3%81%AE%E8%A8%AD%E5%AE%9A)

## Intel RealSense SDK
**精度が高く、資料が豊富で導入し易いが日本語で躓いた**
英語での音声認識は高い精度で出来ました。
日本語の音声認識モジュールは数十時間インストールしようと試みましたが
インストール出来なかったため未検証です。
[RealsenseSDKで音声認識した結果をUnityで使う](http://qiita.com/akihiro01051/items/2eb9800e34a59062f86e)

## UnityEngine.Windows.Speech
**精度が高く、ゲームとの相性が良い**
Unityの音声認識APIなので手軽に利用出来て精度も高いです。
[VRアプリで使える音声コマンドを簡単に実装してみる
（Oculus Rift CV1 + Windows10)]
(http://qiita.com/decchi/items/c9ae04b049ace49f91bc)

## Julius
**ゲームとの相性は良いが精度を上げるためには慣れが必要**
限られたキーワードを利用するだけならばあまり不便は無いと思います。
[Julius で音声認識させてみた](http://tips.hecomi.com/entry/20120111/1326296629)
[Unityで音声認識]
(https://www.slideshare.net/hamayanhamayan/unity-54349052)
[MMDAgent(Julius)の音声認識率を上げる方法]
(http://deg-nico.seesaa.net/article/304283044.html)
[Unity から音声認識ライブラリ JuliusLib を使うためにやったこと]
(http://qiita.com/chiepomme/items/b67631bb61447592e3bb)

## その他

- Cortana
- Wit.ai
- IBM Watson Speech to Text
- Speech-to-Text
- DragonSpeech

[Unity公式アセット「Speech-to-Text」の概要と基本的な使い方をまとめました]
(http://magicbullet.hatenablog.jp/entry/UnityAsset_Speech-to-Text)

# まとめ
下記のように目的に応じて使い分けると良いと思います。

- 自由な会話ならWeb Speech APIやIntel RealSense SDK
- 限られたキーワードを利用するだけならUnityEngine.Windows.SpeechやJulius

利用目的は先人様が何人もいらっしゃいますが

- VRゲームでの入力手段として
- ボイスロイドを利用して実況するため
- 雑談APIと会話をするため

などで利用していこうと考えております。
CocoaPodsで入れたライブラリのライセンス表記画面を作りたい

# 端末の設定画面に謝辞を入れる方法


よくこちらの方法で、謝辞を入れることが多かったのですが...
[[iOS] アプリの設定画面にバージョン表記と謝辞を自動で設定する / Developer.IO](http://dev.classmethod.jp/smartphone/iphone/settings-bundle-acknowledgements/)

# アプリの中でも表示させたい

TableView＆自作レイアウトのセルで、どうにか表示できないかとトライしてみた。


## イメージはこんな感じ
![sc500.png](https://qiita-image-store.s3.amazonaws.com/0/116677/bc2d051a-c986-aceb-3ac7-72917f30f823.png)


## 表示用のデータを取得する

`Setting.bundle`の中に`Acknowledgements.plist`がある前提。
（`Pods/Targets Support Files/{PROJECT_NAME}/Acknowledgements.plist`を直接見に行けるかどうかは試してない）

```Swift
var items: [Any] = []
```

```Swift
if let path = Bundle.url(forResource: "Acknowledgements", 
                         withExtension: "plist", 
                         subdirectory: nil, 
                         in: Bundle.main.url(forResource: "Settings", withExtension: "bundle")!) {

    let dic = NSDictionary(contentsOf: path)!
    self.items = dic["PreferenceSpecifiers"] as! [Any]

    // 最初と最後以外が必要な情報
    self.items.removeFirst()
    self.items.removeLast()
}
```

## セルをカスタマイズ
シンプルにこんな感じにしてみた。
<img width="428" alt="スクリーンショット 2017-04-06 00.51.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/116677/617a2bd3-9e61-e91b-7e91-235fd846d302.png">


## セルの高さを可変にする
これだけで可変にできるようになったのはありがたい。

```Swift
self.tableView.estimatedRowHeight = 100
self.tableView.rowHeight = UITableViewAutomaticDimension
```

## 表示させる部分
ライブラリを作る際に自動生成されるLICENSEファイルには、最後に改行が付いている。
（最後に改行コードが2つ付いているライブラリは、おそらくそのまま使用しているのだろう）

```Swift
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.items.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "licenseCell", for: indexPath) as! LicenseCell

    let item = self.items[indexPath.row] as! NSDictionary

    cell.titleLabel.text = item["Title"] as? String
    cell.licenseLabel.text = item["License"] as? String

    // 最後に付いてる改行を取り除きたかった
    cell.footertextLabel.text = (item["FooterText"] as! String).trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)

    return cell
}
```

# 最後に...

plistファイルからのデータ取得ができることを知ったのは、個人的に大きい。
active_decorator 0.9.0 は関連モデルオブジェクトを自動デコレート

昨日リリースされた [active_decorator](https://github.com/amatsuda/active_decorator) 0.9.0 で，関連モデルオブジェクトが自動的に
デコレートされるようになったようです。

Changelog や HISTORY の類が無いので，何が変わったのか，にわかには分からないのですが，[README.md](https://github.com/amatsuda/active_decorator/blob/master/README.md) の「Features」の四番目にこっそり

> fetching already decorated Active Record model object's association

が追加されてました。

今までは，あらわにデコレートするコードを書くか，関連モデルオブジェクト部分の
ビューを別のテンプレートに切り出すしかありませんでした。

すばらしい！

# なんのこっちゃ？

たとえば，一つの Publisher を表示する publishers#show のビューにおいて，
Publisher にぶら下がっている（belongs_to している）Book たちの一覧を
表示するとしますよね。

コントローラーで

```rb
@publisher = Publisher.find(params[:id])
```

すると，これがビューに渡されたときに自動的にデコレートされ，この `@publisher` に対し，`PublisherDecorator` のメソッドが呼べます。

しかし，バージョン 0.8.0 までの場合，`@publisher.books` の要素たちはデコレートされないので，そいつらに対し `BookDecorator` のメソッドを呼び出そうとしても `NoMethodError` になっていました。

バージョン 0.9.0 では `@publisher.books` たちも自動でデコレートされるので，何も考えずとも同じテンプレート内で `BookDecorator` のメソッドが呼べる，というわけです。
Swagger Codegen のPHP実装があまりにアレだったので、ライブラリ自作して公開してみた


** 2017/4/27 Photocreateさんの名前で再公開させていただきました。 **

## はじめに
[Swagger](http://swagger.io/)には、RESTful APIに関する仕様やツールセットがあり、ドキュメントとコードを一元管理する強力な仕組みがあります。
その他、Swaggerそのものについては、下記のリンクに詳しく書かれているので、参照してみてください。

- [RESTful APIの記述標準化を担うSwaggerとは？ | NTT Communications Developer Portal](https://developer.ntt.com/ja/blog/00f744c3-db45-42c3-86d5-983838ffbeb6)

最近、個人的に使っている`AWS`の`API Gateway`は、Swagger定義ファイルを使ったインポート、エクスポートに対応しています。

- [Amazon API Gateway Swagger ImporterでAPIを一発で定義する ｜ Developers.IO](http://dev.classmethod.jp/cloud/api-gateway-swagger-importer/)
- [Swagger 定義ファイルを使用して API Gateway API をインポートおよびエクスポートする - Amazon API Gateway](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/create-api-using-import-export-api.html)

## Swagger CodegenでAPIクライアント作成してみたところ
SwaggerでPHPのAPIクライアントを生成してみたのですが、うーんという感じです。
下記のリンクからコードを見てみてください。

https://github.com/swagger-api/swagger-codegen/tree/master/samples/client/petstore/php/SwaggerClient-php/lib

僕は下記のような印象を持ちました。

- ぱっと見、コードベースが大きい
- [ApiClientクラス](https://github.com/swagger-api/swagger-codegen/blob/master/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php)は実質、HTTPクライアントだが、[cURL](http://php.net/manual/ja/book.curl.php)で独自に実装するのではなく、[Guzzle](https://github.com/guzzle/guzzle)など実績のあるライブラリに依存したほうがいい
- [Generatorをカスタマイズ](https://github.com/swagger-api/swagger-codegen#customizing-the-generator)することもできるようだが、難しい上に満足できなさそうな気がする

## とにかく自作してみる
最初にいくつかの短いスクリプトを書いて実行しました。

ポイントは下記のとおり。

- Swagger定義ファイルを入力として受け取る
- Swagger定義ファイルをパースして、ViewModel的なオブジェクトにまとめる
- [Twig](http://twig.sensiolabs.org/)のテンプレートに、オブジェクトを渡して、renderする
- renderしたソースコードをファイルに出力する
- HTTPクライアントには、`Guzzle`を使用

`Twig`をPHPのコード生成に使うのは、いささかトリッキーかと思ったのですが、Googleの[apis-client-generator](https://github.com/google/apis-client-generator)なんかも、pythonの[Django Template](https://docs.djangoproject.com/ja/1.11/ref/templates/language/)を使って、様々な言語のソースコードを生成しているので、メタプログラミング的な用途でも使っていけそうです。

## どうせなら公開できるものにしよう
どうせなら、汎用的に使えるようなツールにしようということで、最初に書いたスクリプトをリファクタリングしてみました。
リファクタリングのポイントは下記のとおり。

- DIコンテナに、[Pimple](http://pimple.sensiolabs.org/)を採用
- コマンドは、[SymfonyのConsoleコンポーネント](http://symfony.com/doc/current/components/console.html)を使用
- 将来的にphp以外の言語も対応できるようにした（現在はphpのみサポートだが）
- Swaggerのサンプルプロジェクト（[swaggerapi/petstore](https://hub.docker.com/r/swaggerapi/petstore/)）をDocker Hubからインストールして、動作確認用に利用

ソースコードはパブリックなリポジトリにて公開していますので、ご確認ください。
https://github.com/Photocreate/api-client-generator

## 公開しました
`packagist`にも公開してありますので、`composer require`してみてください。

- https://packagist.org/packages/photocreate/api-client-generator

## おわりに
Swaggerの定義を網羅するには、まだまだ実装が足りないので、実際の現場で活用しながらアップデートしていきたいと思います。
使ってみてフィードバックいただけましたら、幸いです。
ではでは。
Bonjour で ラズパイに SSH する

LCD で IP アドレスを出そうと思っていたものの、半田が苦手で放っておいた Raspberry Pi2 を思い出し引っ張り出してみました。結果的に LCD を使わずに Bonjour でホスト名を指定して SSH できるようになったので無駄な出費と PIN の消費を防げました。

## 環境
* MacBook Air
  OS: 10.11.6 El Capitan

* Raspberry Pi2 + USB無線LAN子機
  OS: RASPBIAN JESSIE WITH PIXEL

Windows でも同様のことができるようです。

* Bonjour for Windows不要！Windows10マシンに".local"でアクセスしよう！
  http://moguno.hatenablog.jp/entry/2015/09/12/100231

* Bonjour Print Services for Windows
  https://support.apple.com/kb/DL999?viewlocale=ja_JP&locale=en_US

エンジニアの皆さんの積極的に情報共有する姿勢は見習いたいと思いました。
とてもありがたいです。

## ホスト名と avahi-daemon の確認

ラズパイのホスト名を確認してみます。

```
$ echo $HOSTNAME
raspberrypi
```
次に avahi-daemon が有効になっているか確認します。

```
$ service --status-all | grep avahi
[ + ]  avahi-daemon
```
[ + ] になっていました。もし、 avahi-daemon がみつからないようでしたらインストールしてください。

```
$ sudo apt-get update
$ sudo apt-get install -y avahi-daemon
```

##raspi-configから SSH を有効にする
avahi-daemon が利用可能な状態であれば次にコンフィグを開きます。

```
$ sudo raspi-config
```

![interface.png](https://qiita-image-store.s3.amazonaws.com/0/22330/5d96709c-ba17-410b-7faa-b5f557a60998.png)

5 Interfacing Options を選択して SSH の設定に進みます。

![ssh.png](https://qiita-image-store.s3.amazonaws.com/0/22330/7b00642d-267d-16d3-78ab-ac439a129881.png)

Would you like the SSH server to be enabled? と表示されるので Yes を選択して有効にします。

##ホスト名を変更する

![raspi-config.png](https://qiita-image-store.s3.amazonaws.com/0/22330/0c9ddd96-4188-db4b-be9d-401782bbe9a6.png)

2 Hostname を選択したらホスト名の入力画面に進みます。
a-z0-9 とハイフンが使えるので raspberrypi から短めに変えてみます。

![hostname.png](https://qiita-image-store.s3.amazonaws.com/0/22330/b44e5160-6ffe-a555-e128-26442265983f.png)

```
raspi-1.local
```

OK を選択して Finish したら再起動します。
これだけでした。

しばらくしたらPCからラズパイに SSH を試みます。

```
$ ssh pi@raspi-1.local
```
コンフィグ画面で設定したホスト名は以下のファイルで書き換わっているのが確認できました。一度の入力でどちらにも反映されていて楽チンです。

* /etc/hostname
* /etc/hosts

おしまい。
Rails5で作成したアプリをDockerに対応したcircle2.0でテストを実行してみた

circleciが2.0でDockerにしっかり対応したようなので試してたメモです
と言っても公式のドキュメントにほぼ書いてあるので最終的な設定ファイルを載せておきます

```yaml:circle.yml
version: 2
jobs:
  build:
    working_directory: /root/my-project

    # ここは1.0でもあった実行対象ブランチ設定
    branches:
      only:
        - master

    # Dockerのimage設定はここで 今回はruby2.4.1とdatabaseにはpostgresql9.6.2(公式image)を利用
    docker:
      - image: ruby:2.4.1
      - image: postgres:9.6.2
        environment:
          POSTGRES_USER: root

    # ここの下に処理を書いて行く模様
    steps:
      # hosts設定
      - run: echo 127.0.0.1 circlehost | tee -a /etc/hosts

      # 必要なものをapt-getでインストール
      - run:
          command: |
            apt-get update -qq
            apt-get install -y build-essential libpq-dev nodejs git --no-install-recommends
            rm -rf /var/lib/apt/lists/*

      # コードのチェックアウト
      - checkout

      # bundle installのキャシュがあればそれを取ってくる
      - restore_cache:
          keys:
            - dependency-cache-{{ checksum "Gemfile.lock" }}
      
      # bundle install実行　上記でキャッシュがロードされればキャッシュが利用されるはず
      - run: bundle install --path vendor/bundle

      # bundle installのデータをキャッシュする
      - save_cache:
          key: dependency-cache-{{ checksum "Gemfile.lock" }}
          paths:
            - vendor/bundle

      # お決まりのコマンドでDBを生成
      - run:
          name: create test DB
          environment:
            RAILS_ENV: test
            DATABASE_USER: root
            DATABASE_HOST: circlehost
          command: |
            mv config/database.ci.yml config/database.yml
            bin/rails db:create
            bin/rails db:migrate

      # テストの実行
      - run:
          name: run test
          command: bundle exec rspec
```

```yaml:config/database.yml
test:
  adapter: postgresql
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch('DATABASE_USER') { 'root' } %>
  host: <%= ENV.fetch('DATABASE_HOST') { 'localhost' } %>
  port: <%= ENV.fetch('DATABASE_PORT') { 5432 } %>
  database: myapp_test
```

最初の環境構築が大分速くなったような気がします