OmniAICreator/Qiita-1.07M huggingface dataset:
機械学習論文読みメモ_58


[Structured Receptive Fields in CNNs](https://arxiv.org/pdf/1605.02971.pdf)
CNNで高性能な特徴量抽出を学習するためには多くの学習データが必要だが、その用意は難しい。
その対策としてpretrainがあるが、そのために対象データと似たドメインのデータに対してpretrainをしなければ効果が得にくい。
その他の対策としては事前知識をモデルに入れ込む事も考えられ、例えばwavelet transformに基づいたscatter networkがある。
本論ではこれらのアイデアをstructural receptive field networkへ組み合わせた手法を提案する。
structural receptive field networkは固定された基底関数を利用したモデルで、なおCNN由来の高い柔軟性を持っているモデルである。
これはCNNのreceptive fieldをそれらの固定された基底関数の重み付き和として示す。
この考え方はscatter networkと類似したものである。
ただフィルタそのものをモデル化するのではなく、基底関数の組み合わせとして表現し学習するため、任意のフィルタが表現可能で表現力が高い。

[Blockout: Dynamic Model Selection for Hierarchical Deep Networks](http://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Murdock_Blockout_Dynamic_Model_CVPR_2016_paper.pdf), CVPR2016
画像分類タスクのためのdeep learningモデルは、従来多数のカテゴリを扱うが、その特徴表現は共有している。
しかし、カテゴリ間の類似性に応じて、類似カテゴリでより特徴表現を共有するようにした方が良いと考えられる。
階層的deep learning構造は類似カテゴリ毎に別々の特徴表現を学習するが、従来手法はヒューリスティックなクラスタリング手法による固定されたシンプルな構造に限定される。
本論で提案するBlockoutでは、正則化とモデル選択を自動的に行いながら、学習を行う事を可能にする。
Dropoutの一般化として、Blockoutは階層的構造に関してパラメタライズを可能にし、その構造を誤差伝搬により学習可能にする。

[You Only Look Once: Unified, Real-Time Object Detection](https://pjreddie.com/media/files/papers/yolo.pdf)
新しい物体検出手法としてYOLOを提案する。
従来の物体検出手法はクラス分類モデルに根ざした手法であったが、YOLOはこれを回帰問題として捉える。
１つのモデルを用いてbounding boxの位置とそのクラスを画像入力に対して一度の出力する。
そして学習はendtoendで行う事が可能である。
YOLOは特に高速な処理を可能している。
機械学習論文読みメモ_57


[DeepStereo: Learning to Predict New Views from the World’s Imagery](https://www.cs.cornell.edu/~snavely/publications/papers/deepstereo_cvpr2016.pdf), CVPR2016
本論では、たくさんのposeから見た画像を学習する事で、endtoendの学習による新たなposeからの画像を生成するモデルを提案する。
このモデルでは、近いposeから得られた画像を入力に、別のposeから見た画像を生成する。
このモデルの利点は汎用性、多様なポーズからの画像セットを与える事で、新たなポーズからの画像を、任意のドメインに対して生成可能な事である。
さらに従来手法では難しかった条件でも精度の良い画像を生成できる。

[Semantic Instance Annotation of Street Scenes by 3D to 2D Label Transfer](http://www.cvlibs.net/publications/Xie2016CVPR.pdf), CVPR2016
CV分野で用いられるピクセルレベルのラベリングデータは集めるのが難しい。
それは特にstreet sceneにおいても言える事である。
本論では、特にステレオやレーザーによるデータを用いて３D空間でのラフなbounding boxベースのラベル情報を構築し、それを用いて２Dの画像に対するラベルへ写像、ラベル生成するモデルを提案する。
従来手法と比較して、３D情報を用いる事でより高性能なラベル生成を行う事を可能にした。

[Semantic Channels for Fast Pedestrian Detection](http://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Costea_Semantic_Channels_for_CVPR_2016_paper.pdf), CVPR2016
歩行者検出やsegmentationは重要なタスクであるが、高精度な結果を得るためには計算コストが高くなる。
本論ではこれらタスクに対し、高性能かつ低コストな手法を提案する。
提案手法では、複数解像度でフィルタリングを行ったLUVチャネルとHOG特徴チャネルを用いる。
この特徴量を元に歩行者検出及びsemantic labelingを行う。
Multi resolution（=異なったレンジ(画像サイズ)?)の画像特徴を利用する事で、従来手法よりも効率的に計算を行う事が可能になる。
またsegmentation結果を特徴として利用する事で歩行者検出の性能を向上させる事もできる。
mw wp form自作バリデーションの追加

自作バリデーション追加

プラグイン自体を触る良くないけど、
自作バリデーションの作り方なかなか見つからないので
メモとして残しとく。

プラグインフォルダに``/classes/validation-rules/*.php``中に追加すればよい

```class.myrule.php
<?php

class MW_WP_Form_Validation_Rule_MyRule extends MW_WP_Form_Abstract_Validation_Rule {
  /**
   * バリデーションルール名を指定
   * @var string
   */
  protected $name = 'myrule';
  /**
   * バリデーションチェック
   *
   * @param string $key name属性
   * @param array $option
   * @return string エラーメッセージ
   */
  public function rule( $key, array $options = array() ) {
    $value = $this->Data->get( $key ); // 入力の取得
    if ( !MWF_Functions::is_empty( $value ) ) {
        $defaults = array(
          'message' => __( 'Please enter with a half-width alphabetic character.', 'mw-wp-form' )
          );
        $options = array_merge( $defaults, $options ); // 重複の削除
        return $options['message']; // エラーメッセージの返す
    }
  }

  public function admin( $key, $value ) {
    return false;
  }

}
```
MySQLの定期バックアップ


開発環境とかステージングで簡易的なバックアップを取得する。

```bash
$ install -d -m 700 $HOME/backup
$ mysqldump --single-transaction -u root --password=root DBNAME | gzip -c > ~/backup/mysql.backup.sql.gz

```

crontab 

```
0 4 * * * mysqldump --single-transaction -u root --password=root DBNAME | gzip -c > ~/backup/mysql.backup.sql.gz
```

logorate

```bash
$ cat - > /etc/logrotate.d/mysql_backup.conf <<EOF
$HOME/backup/mysql.backup.sql.gz {
      daily
      rotate 7
      missingok
      sharedscripts
      postrotate
      endscript
}
EOF
```
numpyのargsortの挙動がパッとわからなかったのでまとめておく

# argsortの戻り値の説明

ndarrayに対してargsortを用いると、昇順に並べ替えた時のindexが返ってくる。

```pycon
>>> a=np.array([1,4,2,5,3])
>>> print(a)
[1 4 2 5 3]
>>> np.argsort(a)
array([0, 2, 4, 1, 3])
```

ndarray内の値の…
最小値は1なのでそのindexである0、
次に小さな値は2なのでそのindexである２
その次に小さな値は3なのでそのindexである4
…という風な結果が返ってくる。

３番目に小さい値のindexを知りたければ以下のようにすれば良い。

```pycon
>>> np.argsort(a)[2]
4
```

一応確認すると以下の通り

```pycon
>>> a[4]
3
```

# 余談
defaultだと昇順なので、降順にしたいときはスライスを使う

```pycon
>>> np.argsort(a)[::-1]
array([3, 1, 4, 2, 0])
```
centos7でfirewalldを使い、日本国内のhttpアクセスのみ許可する方法

centos7でfirewalldを使い、日本国内のhttpアクセスのみ許可する方法を紹介します。

# 環境
centos7

# コマンド
```
# wget https://ipv4.fetus.jp/jp.txt
# firewall-cmd --permanent --new-ipset=jp --type=hash:net
# firewall-cmd --permanent --ipset=jp --add-entries-from-file=jp.txt
# firewall-cmd --permanent --zone=external --add-source=ipset:jp
# firewall-cmd --permanent --zone=external --add-service=http
# firewall-cmd --reload
```
はじめに日本のIPリストを取得し、それをjpという変数に格納します。
ipset:jpに該当したアクセスをexternalの定義に飛ばし、
externalの中で、httpのみ許可する、という設定を行っています。
さらに、定期的にIPリストを更新できるとなお良いと思います。

# 参考
以下参考にさせて頂きました。
https://www.kunitaya.info/memo/firewalld%E3%81%A7ipset%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95/
https://seinolab.jp/firewalld-example-2/
PAY.JP の Checkout 用の React.js コンポーネントをつくってみた

[PAY.JP の Checkout](https://pay.jp/docs/checkout) は、script タグ1行で、 デザインされた決済フォーム、カード情報のバリデーション、カード情報のトークン化を行うフォームを生成するライブラリです。これを React.js で使うためのワークアラウンドをまとめた React コンポーネントを作成しました。代案は、[payjp.js](https://pay.jp/docs/payjs) です。この記事では、両者の優劣を論じません。判断の資料を提供するのが目的です。

## コード

- [PayjpCheckout@gist](https://gist.github.com/mori-dev/acc77f0d99db11e13f4adbf0e90c51f0)

## 工夫が必要だったところ

- React.js のコンポーネントでは script タグを render できないとのことなので、appendChild しました。window.document に appendChild すると、payjp の生成するボタンが SPA のあらゆる画面に表示されます。ref="payjpCheckoutRef" してその中に appendChild することで、回避できました。
- [`data-on-created` と `data-on-failed`](https://pay.jp/docs/checkout) で、コールバック関数の文字列を設定できます。しかしこれは window 直下にある関数にしか対応していません。そこで、componentWillMount で `window.reactPayjpCheckoutOnCreated = this.onCreated;` として、componentWillUnmount で `window.reactPayjpCheckoutOnCreated = null;` することにしました。それから、ここで呼び出す関数を prop で受け取る場合、実行時に this も意図したものにしておく必要があります。これも `window.reactPayjpCheckoutContext = this;` といったように退避させておき、いつもなら `this.props.onCreatedHandler();` と呼び出す処理を `window.reactPayjpCheckoutContext.props.onCreatedHandler();` で呼び出せるようにしました。
- payjp の checkout では、エラーメッセージ(「カードの有効期限がきれています」)の表示を window.alert で行うことを強制されます。このコンポーネントがマウントされている間は、 `window.alert = () => {};` とすることで、この表示を消しました。
- エラーメッセージは、`data-on-failed` で自分たちのアプリのモーダルダイアログを表示するアクションを呼び出すことで表示できます。[material-ui の Dialog](http://www.material-ui.com/#/components/dialog) であれば、z-index の値を大きくしておく必要があります。[テーマ](http://www.material-ui.com/#/customization/themes) で以下のように設定しました。

```
    zIndex: {
        dialog: 100000,
    },
```

![payjp-checkout-modal.gif](https://qiita-image-store.s3.amazonaws.com/0/898/3845eef9-a00f-b3c5-4763-79aa8c8ca230.gif)


- componentWillUnmount で `window.PayjpCheckout = null;` しているのは次の理由です。PAY.JP のボタンが表示されるには、script タグで読み込む `https://checkout.pay.jp/` の JS が iframe.html というのを呼び出し、その iframe.html が server.css と iframe.js を呼び出すことで実現しています。この過程で window.PayjpCheckout オブジェクトが作成されるのですが、これがある状態で `https://checkout.pay.jp/` の JS を実行しても、iframe.html が呼び出されません。画面遷移して、再びPAY.JP のボタンが表示されるべき画面に戻ってきたときに、ボタンを表示するために、window.PayjpCheckout を falsy にしておく必要がありました。
- shouldComponentUpdate でつねに false を返すようにしているのは、このコンポーネントは一度 render されれば十分だからです。
rsyncでデプロイする


- ローカルファイルを`ssh`を使ってリモートサーバに転送する
- 転送除外ファイルは`rsync_exclude.txt`で指定
- 上書きするファイルはリモートサーバの`~/rsync_backup`に日付ごとに保存

```
rsync -a --dry-run --list-only --exclude-from=rsync_exclude.txt --backup-dir=~/rsync_backup/$(LANG=C date +%Y%m%d%H%M%S) -e ssh ./* remote:/path/to/target
```

rsync_exclude.txt

```
*.swp
*.bak
*~

/.*
/GPATH
/GRTAGS
/GTAGS
/node_modules
/vendor
/readme.md
/README.md

# for Laravel
/storage

```

## スクリプト

- rsyncを使ったデプロイスクリプト
- `files`ディレクトリに転送対象のファイルを保存してスクリプトを実行する
- ファイルの一覧が表示されるので問題なければ`Y`で転送開始

```
#!/bin/bash
# releases/YYYYMMDD_release/files

server_name=remote-server
server_dir=/path/to/target

TIMESTAMP=$(LANG=C date +%Y%m%d%H%M%S)
#rsync_opt="--dry-run --list-only"
rsync_opt="$rsync_opt -a --no-o --no-p --no-t"
rsync_opt="$rsync_opt -b --backup-dir=~/rsync_backup/$TIMESTAMP"
rsync_opt="$rsync_opt -e ssh"

dir=files
if [ -d $dir ]
then
  echo "---------- Files ----------"
  find $dir -type f
  echo "---------- Files ----------"
  /bin/echo -n "Y/n: "
  read ans
  if [ $ans == "Y" ]
  then
    rsync $rsync_opt ./$dir/ $server_name:$server_path
  else
    echo "Stop"
  fi
fi

```
RailsでjQuery-uiのDatePickerを日本語表示する-jquery-ui-rails(6..)

## はじめに
jquery-ui-railsを利用してDatePickerを利用する際、jquery-ui-rails(4..)とjquery-ui-rails(6..)で多少設定のやり方が違っていたのでメモ

<img width="300" alt="スクリーンショット 2017-04-17 12.18.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/54809/6a02f924-9b68-7a4c-7624-5e62f6ae847c.png">


## DatePikcerの使い方

### Gemfile

Gemfileに以下のように追加しbundle install

```
gem 'jquery-rails'
gem 'jquery-ui-rails'
```

bundle list 

```
* jquery-rails (4.3.1)
* jquery-ui-rails (6.0.1)
```

### application.css (jquery-ui-rails 6..)

application.cssに以下のように設定

```css
 *= require jquery-ui/datepicker
 *= require_tree .
 *= require_self
```

### application.js(jquery-ui-rails 6..)

application.jsに以下のように設定

```js
//= require jquery
//= require jquery-ui/widgets/datepicker
//= require jquery-ui/i18n/datepicker-ja
//= require jquery_ujs
//= require turbolinks
//= require_tree .
```

//= require jquery-ui/i18n/datepicker-jaを追加することで日本語表示になります。


### date_picker.coffee

```coffeescript

ready = ->
  dateFormat = 'yy-mm-dd';
  $('.date-picker').datepicker(
    dateFormat: dateFormat,
    minDate: 0
  );
$(document).ready(ready)
$(document).on('turbolinks:load', ready)
```

### html

```html
<input class="date-picker" type="text" name="hogehogedate-picker">
```

## jquery-ui-rails(4..) - 参考までに

### gem
bundle install

```
jquery-rails (4.1.0)
jquery-ui-rails (4.2.0)
```

### application.css (jquery-ui-rails 4..)

```css
 *= require jquery.ui.datepicker
 *= require_tree .
 *= require_self
```

### application.js (jquery-ui-rails 4..)

```js
//= require jquery
//= require jquery.ui.datepicker
//= require jquery.ui.datepicker-ja
//= require jquery_ujs
//= require turbolinks
//= require_tree .
```

//= require jquery.ui.datepicker-jaを追加することで日本語表示になります。



以上jquery-ui-railsを利用してDatePickerを利用する際のjquery-ui-rails(4..)とjquery-ui-rails(6..)の違いのメモでした。
文系PGがAzure ML Studioで機械学習をやってみた(第3回)

　今回はデータを二つのうちいずれかに分類する予測を行います。前回までは、Azure ML Studioの使い方の説明を兼ねて書きましたが、今回からはそこらへんは少し省略します。

## 部屋の占有率の分類。占有されているか否かを調べる

　今回は、部屋が占有されているか否かを調べます。以下のURLからデータセットを取得しましょう。

　https://archive.ics.uci.edu/ml/datasets/Occupancy+Detection+

  今回はzipです。解凍すると、ファイルが3つあります。名前からして、一つはトレーニング用のようです。

　データは以下のようになっています。日付、温度、湿度、光、CO2、湿度、占有率とあります。先頭列はプライマリキーのようですね。占有率が「0:占有されてない」「1:占有されている」を、室内の温度や湿度、二酸化炭素濃度から判定するようです。室内にこれらを計測するセンサーでも配置されているのでしょう。

"date","Temperature","Humidity","Light","CO2","HumidityRatio","Occupancy"
"1",2015-02-11 14:48:00,21.76,31.1333333333333,437.333333333333,1029.66666666667,0.00502101089021385,1
"2",2015-02-11 14:49:00,21.79,31,437.333333333333,1000,0.00500858127480172,1
"3",2015-02-11 14:50:00,21.7675,31.1225,434,1003.75,0.0050215691326541,1
"4",2015-02-11 14:51:00,21.7675,31.1225,439,1009.5,0.0050215691326541,1
"5",2015-02-11 14:51:59,21.79,31.1333333333333,437.333333333333,1005.66666666667,0.00503029777867882,1

　今回は一番サイズの大きい「datatest2.txt」を使用します。ファイル名をわかりやすく「occupancy2.csv」に変更しました。

 カラム名と値がずれるのは良く無いので、先頭の列のカラム名に「id」を追加してml StudioにUPしました。


## データのクリーニングと調整

　機械学習の作業のほとんどは、データのクリーニング(NULLが入ってる行を削除したり、など)に費やされるそうです。
今回、欠損値は無いようですのでこのままで良いでしょう。

　次に、学習に使用するデータと使用しないデータを見極めます。今回、IDはPrimary keyなので不要です。また、「date」ですが、2015-02-11のデータだけのようです。時刻が関係する環境なのか不明ですが、とりあえずdateも使用しないことにします。

 不要な列を下に流さないようにするには、「Select Columns in DataSet」を使います。データをSplitしてから、以下のようにしてみました。

![スクリーンショット 2017-04-17 12.29.46.png](https://qiita-image-store.s3.amazonaws.com/0/176201/cd61dc7c-e422-04cd-a2f3-870e1579cb39.png)

## さっそく実験をやってみる。

　今回はふたつのうちのいずれかなので、アルゴリズムはTwo Class Boosted Decision Treeを使ってみます。以下のようになります。


![スクリーンショット 2017-04-17 12.33.13.png](https://qiita-image-store.s3.amazonaws.com/0/176201/fa79dd38-9034-a5ed-135d-40f6bf6c2ed4.png)

　さっそく結果を見て見ましょう。

![スクリーンショット 2017-04-17 12.34.52.png](https://qiita-image-store.s3.amazonaws.com/0/176201/eabfb0a2-4421-50e3-6df7-0f640cdf2672.png)


![スクリーンショット 2017-04-17 12.35.07.png](https://qiita-image-store.s3.amazonaws.com/0/176201/f7e951f7-44f3-6f91-f25f-cff7e244e380.png)

　この結果ですが、なんかの間違いではないのかというくらい正確に予測しています。
まず、上のグラフですが、ROC曲線といいます。このグラフは「y軸をまっすぐ登っていって、上のほうでxに向かう」形になるほど良いとのことですので、これは完璧ではないでしょうか?

 下の図の値ですが、解説は以下のURLが詳しいかと思います。
http://ibisforest.org/index.php?F値

　的中率が0.994、再現率が0.989、True Positive(今回の場合、1を正しく1と予測したものの数)が471、True Negative(同じく、0を正しく0と予測した)も1953個。False系は間違えた個数ですので、いかに正確かがわかります。

## 今回のまとめ

　このように、センサーから取得したデータなどで、ある程度因果関係が明らかなものにはめっぽう強いです。

　もちろん、それなら機械学習を使うまでも無い、かもしれませんが、今回の元のcsvの中身を見て、今回の結果を判定するプログラムを書け、と言われると困るかと思います。おそらく無理ではないかと。

　このように、データ量や判定する項目の数が人間の手に余る場合にも、機械学習は力を発揮します。何も画像認識とかだけではない、という事ですね。

　おそらく、企業内にはデータベースなどに莫大なデータが溜まっていると考えられます。それちを利用して機械学習で、何らかの予測を行えれば、面白いことになりそうです。
Elixir製のプロジェクトをTravisCIで運用するための.travis.yml

Elixir製のプロジェクトをTravisCIで運用するための `.travis.yml` を作った．以下のことができるようになっている

- コミットを push するたび
    - 静的解析ツールの [credo](https://github.com/rrrene/credo) が動き，何かメッセージがあればテスト失敗として通知してくれる
    - 静的型チェッカーの [dialyzer](https://github.com/jeremyjh/dialyxir) が動き，型の不整合があればテスト失敗として通知してくれる
    - 通常の mix test が動き，テスト失敗であれば通知してくれる
- タグを push するたび
    - 上記のコミットpushと同じ動作を行い，成功すればパッケージマネージャーの [hex.pm](https://hex.pm/) とそのドキュメント置き場の [hexdocs.pm](https://hexdocs.pm/) にデプロイしてくれる
    - そのときにTravisCIのログに秘匿しておきたい情報(`key`と`passphrase`)を残さない
- (ビルドの高速化)
    - `sudo: false` を宣言し[コンテナベースでの起動](https://docs.travis-ci.com/user/ci-environment/#Virtualization-environments)を行っている
    - 外部依存ライブラリを `cache` している

この `.travis.yml` を使うにはTravisCIの管理画面で

- HEX_ENCRYPTED_KEY
- HEX_PASSPHRASE

が登録されていることが前提となっている．

```yaml:.travis.yml
language: elixir
sudo: false
otp_release:
  - 19.3
elixir:
  - 1.4.2
env:
  global:
    - HEX_USERNAME=niku
    # Follow other language's environment
    # e.g.) `RACK_ENV=test` has been setted as Default Environment Variables
    # https://docs.travis-ci.com/user/environment-variables/#Default-Environment-Variables
    - MIX_ENV=test
cache:
  directories:
    - _build
    - deps
script:
  - mix credo --strict
  # https://github.com/jeremyjh/dialyxir#command-line-options
  # > exit immediately with same exit status as dialyzer. useful for CI
  - mix dialyzer --halt-exit-status
  - mix test
deploy:
   # https://docs.travis-ci.com/user/deployment/script/
   # must be a scalar pointing to an executable file or command.
   provider: script
   script: >-
     mix deps.get &&
     mix hex.config username "$HEX_USERNAME" &&
     (mix hex.config encrypted_key "$HEX_ENCRYPTED_KEY" > /dev/null 2>&1) &&
     (echo "$HEX_PASSPHRASE"\\nY | mix hex.publish) &&
     mix clean &&
     mix deps.clean --all
   on:
    tags: true
```


## バッドノウハウ

現状でうまく動作させるために，整理されると不要になりそうな処理たちや，仕様を間違っていて苦労したところ．

hex.pm はリリース後1時間以内しかデプロイ物を更新できない．同じバージョンをつけた状態の開発でプッシュのたびにデプロイするのには向かない．タグなどで，明示的にデプロイの意思を示すこと．

主要な言語では CI が test 環境として動くように[環境変数があらかじめ設定](https://docs.travis-ci.com/user/environment-variables/#Default-Environment-Variables)されている．(例: Rails) Elixir で同様に開発するためには自分達で `MIX_ENV=test` を宣言しなければいけない．

`deploy` の `script` は `-` を複数並べて逐次処理できないので `>-` で擬似的に複数の処理を記述している．ちなみに `>` だと最後の行に改行が含まれてしまい，最後のコマンドがうまく実行できないため，最後の行に改行を含まない `>-` でなければいけない．日本語だとるびまの[プログラマーのための YAML 入門 (初級編)](http://magazine.rubyist.net/?0009-YAML#l9)にこのあたりの動作の説明があった．

`mix hex.config encrypted_key "$HEX_ENCRYPTED_KEY"` は出力を抑制しないと，鍵情報が誰でもみられる TravisCI のログに吐かれてしまうので `/dev/null` へと出力している．

`mix hex.publish` では `Code of Conduct` を読んで `Y` を押さないと処理が進まないので `"$HEX_PASSPHRASE"\\nY` のような奇妙な標準入力を渡している．

`deploy` の `script` は実行後に `git stash` するため `mix clean && mix deps.clean --all` しておかないと `Could not restore untracked files from stash` といったエラーになる．この順番を逆にして `mix deps.clean --all && mix clean` とするとうまく動作しないので注意．(先に依存関係を消してしまうと，次の `mix clean` で，「まず依存関係のインストールをしてください」と言われる)

## この .travis.yml を実際に適用したリポジトリ

https://github.com/niku/hobot
PHP 問題

[問題1](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0000&lang=jp)

```php:
function kuku(){
	$total;
	for($i2 = 1;$i2 < 10;){
		for($i = 1; $i < 10;){
		$total = $i * $i2;
		echo $i2,'x',$i,'=', $total,"<br>";
		 $i++;
		}
		$i2 = $i2 + 1;
		$i = 1;
	}
}
kuku();
```
all possible versions conflict with previously selected versions エラーの対処方法

Rustで開発していて、依存関係を `Cargo.toml` に追加し、 `cargo build` や `cargo tree` などを実行して下記のようなエラーが出た場合の対処方法です。

```
all possible versions conflict with previously selected versions of `lazy_static`
  version 0.2.2 in use by lazy_static v0.2.2
  possible versions to select: 0.2.8, 0.2.7, 0.2.6
```

Cargoのキャッシュを更新してあげないと、昔のビルド時のモジュール・バージョンを使ってしまいます。 *(Cargo.lock に記録されています。)*

`cargo update` を実施して依存ツリーの再構築を行いましょう。

```
cargo update
    Updating registry `https://github.com/rust-lang/crates.io-index`
    Updating lazy_static v0.2.2 -> v0.2.8
    :
```

これで昔のモジュール・バージョンへの参照から新しいモジュール・バージョンへの参照に切り替わります。
本当にコンフリクトしていたらなおらないけどね。
sql2oでComposite(Nested)なPOJOとのマッピング方法

sql2o( http://www.sql2o.org )で以下のようなComposite（Nested）なPOJOをマッピングする方法について記載します.

まず, sql2oでは以下のPOJOのAccountに含まれるRoleクラスをマッピングしてはくれません.

```
public class Account implements Serializable {

	private long id;
	
	private String name;
	
	private Role role;

        // getter , setter
}
```

しかし, Accountクラスのroleフィールドをpulicスコープにすることでマッピングを行なってくれます.

```
public class Account implements Serializable {

	private long id;
	
	private String name;
	
	public Role role;

        // getter , setter
}
```

このroleにマッピングするためのsqlの書き方は以下です.

```
 String sql = 
  "SELECT A.id, A.name, B.role AS \"role.name\" " +
  "FROM account A, role B " +
  "WHERE A.id = B.accountid AND A.id = :accountId ";
```

実行自体は今まで通りです.

```
try(Connection con = sql2o.open()) {
    List<Account> AccountList = con.createQuery(sql) // 中身は一つ
        .addParameter("accountId", accountId)
        .executeAndFetch(Account.class);
}
```

publicフィールドにするのは見解が異なりそうなのですが, この方法でできます.

privateフィールドだと可視性に問題で参照できないエラーが出ていたけど、privateフィールドでできたということがあればぜひ教えていただきたい

参考Forum
https://groups.google.com/forum/m/#!topic/sql2o/eucKt1vVh9o
Docker — docker コンテナの中で vim が使えない場合


# How to 

OSの種類次第でインストール方法が変わる。

`root` ユーザーで *以下のどれか* を実行すれば、だいたいイケるはず。

Ubuntu系

```
apt-get update
apt-get install vim
```

Centos系

```
yum install vim
```

Alpine

```
apk update
apk add vim
```

Busybox

パッケージ管理ツールがそもそもない？


# Dockerfile

Dockerfile に記述しておく場合は、以下のような感じ。 (apt-getの場合)

```
FROM ubuntu

RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]
```

# 経緯

- 「vi さえ入ってない環境」ってのを初めて触ったので、一瞬どうすれば良いか戸惑った。

# 補足

- Centos だと vi コマンドで vim が使えたりすることが判明。
- alipine だと vi が使えたりすることが判明。( vim じゃないので辛い )

# 環境

- Docker version 17.03.0-ce, build 60ccb22









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
CheckedListBoxのSelectionModeをOneにしても複数チェックできるやん(｀Д´)

##やりたかったこと
CheckedListBoxでひとつの項目だけチェックできるようにしたかった。

##やってみたこと
CheckedListBoxのSelectionModeプロパティをOne（単一選択）にした。というかデフォルトがこれ。

##結果
ふつうに複数チェックができる。

##なんで？
###チェックと選択は違う
らしいです。選択はいわゆる項目の背景が青くなるやつ。
ちなみにSelectionModeはNone,Oneの他MultiExtended,MultiSimpleがありますが後者２つはListBox用でCheckedListBoxでは指定できません。
またNoneを指定すると選択もチェックもできない状態になる。

##対策
###ListBox使えよ
ListBoxは単一選択、複数選択は思いのままできます。
ただUI的に選択してる感が薄いというか・・・とくに古い時代のユーザにはわかりづらい。

###ItemCheckイベントでゴリ押し
諸事情でCheckedListBoxをどうしても使いたい場合は、[stackoverflow](http://stackoverflow.com/questions/18415611/c-sharp-window-application-checkboxlist-selection-mode-one-not-working/18415663#18415663)で同様の記事があったのでCheckedListBoxで単一チェックのみできるソースを転載します。

```csharp

   int lastCheckedIndex = -1;
    //ItemCheck event handler for your checkedListBox1
    private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        if (e.Index != lastCheckedIndex)
        {
            if(lastCheckedIndex != -1)
               checkedListBox1.SetItemCheckState(lastCheckedIndex, CheckState.Unchecked);
            lastCheckedIndex = e.Index;
        }
    }
    //To register event
    checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
```
Rails console からmysqlのレコードの内容を更新する方法


#rails cからレコード内容をupdateする（コールバック走る）

```
User.find(1).update_attributes(name: "James")
```

#rails cからレコード内容をupdateする（コールバック走らない）

```
User.find(1).update_column(:name, "James")
```
Apache + OpenSSLのApacheインストールオプション備忘録

Apache + OpenSSLで運用しているサーバに対し、OpenSSL-1.0.2の最新版にアップグレードを試みましたところ、全く反映されずにハマリましたので備忘録として残しておきます。

最近はロードバランサに組み込むケースが多いので、あまりやらないかもしれませんが。。

原因はこれ
> \# ./configure --prefix=/usr/local/httpd --enable-so **--enable-ssl=shared** (以下省略)


このオプションを付けると、mod_ssl.soを生成し、SSL/TLSのサポートを有効にするそうです。
(Apacheのマニュアルより)

OpenSSL更新毎にmod_ssl.soが更新されるわけは無く、、
OpenSSLを更新しても、Apache起動時に適用されるバージョンはApacheインストール時のバージョンとなります。。

ですので、OpenSSLの脆弱性に伴うアップデート実施の可能性が1ミリでもある場合は、このオプションは付けるべきではありません。
DNSの設定の仕方【Windows Server・MAC hostファイル】

#Windows Server　2012の場合
まず、アイコンを押すか、スタートから探すかして「サーバーマネージャー」を起動します。
![マネージャー.png](https://qiita-image-store.s3.amazonaws.com/0/141025/e5099df4-07fa-77be-1c9b-aa88606273ff.png)

右上の「ツール」から「DNS」を選択します。
![DNS.png](https://qiita-image-store.s3.amazonaws.com/0/141025/ab251db9-53ee-ba7c-1e97-2d33c3567c45.png)

DNSマネージャーが出てきますので、<DNSサーバー名>ー「前方参照ゾーン」ー<ドメイン名>を選択

ドメインに、ネットワークデバイスのIPアドレスとホスト名を登録するためのAリソースレコードを作成します。ドメイン名を右クリックし、「新しいホスト（AまたはAAAA）」を選択します。
![A.png](https://qiita-image-store.s3.amazonaws.com/0/141025/9aea3fc2-2ce0-96b6-ded0-e1d2fe6194ad.png)

「新しいホスト」ウィンドウが出てくるので必要な情報を入力します。

#MacBook Airの場合
ターミナルを開き、hostファイルを編集します。
```sudo vi /private/etc/hosts```

IPアドレスとドメイン名をホスト名を入力します。（間を1マス空けます）
esc+:+wqでInsertモードを抜け出し保存します。

#【参考】
DNSを使ってネットワークデバイスにホスト名で管理接続しよう
http://www.atmarkit.co.jp/ait/articles/1305/10/news001.html
Macでhostsファイルを変更・反映
http://qiita.com/junker919/items/cc15653a681e2dcd79ea
Javascript - テーブルの列の背景色をクリックで変えたい

備忘録


# 概要

[TODO_TIMER](http://life.boy.jp/TODO_TIMER/index.html)

jsの練習がてらtrelloみたいなプログラムを作っているのですが、tableの列の背景色をクリックで変えるロジックが思いつかなくて苦労しました。

テーブルの数が動的に変わのに対応できる状態にしておいて、選択した（選択した列が編集できる感覚）列だけ背景色を変え、なおかつ他の列をクリックしたら一個前にクリックした列の背景色をデフォルトに戻したかったです。

# 想定したロジック

0と1のフラグを反転させることで今の状態を判別して、背景色を変える（出来ない）

一個前の処理を取り消すことで背景色を付けたり消したりする（出来ない）

一度全てのテーブルクラスを背景色をデフォルトに戻してから、選択されている行の色を変える（出来た）





# 実装

```js

$('.todoTable').css("background-color","#dddddd")
$(this).css("background-color","#92efec")

```



# 参考

[テーブルの行の背景色をマウスオーバーとクリックで変える](http://lilia-study.com/web/jquery/sample/tr_background_color.html)


# 全ソース

[gitlab](https://gitlab.com/Ryosuke-Hujisawa/TODO_TIMER)

# 多重投稿

[Javascript – テーブルの列の背景色をクリックで変えたい](http://off.tokyo/blog/2017/04/17/javascript-table/)
laravel5 ログイン時処理の追加

 ログイン成功後等に処理を追加する方法。
基本的にcomposer側で実装されている処理はイベントが発生するので、イベントリスナーを登録して
そこに処理を記載。
$listen配列にイベント、リスナーの追加

```App/Providers/EventServiceProvider.php
    protected $listen = [
         'Illuminate\Auth\Events\Login' => [
             'App\Listeners\LogSuccessfulLogin',
         ],
    ];
```

```
php artisan event:generate
```
にて$listenに登録されたイベント、リスナーが自動生成される。
（イベントに関しては既存を利用するのだが、なぜかApp配下にIlluminate\Auth\Events\Loginが作られるので削除）

```app/Listeners/LogSuccessfulLogin.php
    public function handle(Login $event)
    {
        //ここに実装したい処理を記載
    }
```

api等でpassportを利用している場合は別イベントで
        'Laravel\Passport\Events\AccessTokenCreated' => [
            'App\Listeners\RevokeOldTokens',
        ],

        'Laravel\Passport\Events\RefreshTokenCreated' => [
            'App\Listeners\PruneOldTokens',
        ],
を利用。
Laravel homestead のサブディレクトリ運用

基本
http://qiita.com/yyano/items/a0d141a91ba8d867985e
こちらの記事のとおりですが、どうもハマったので記載しておきます。以下の内容を記載する。

    location ^~ /サブディレクトリ名 {
        alias "publicへのフルパス";

        try_files $uri $uri/ @subrewrite;
        location ~* \.php {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME publicへのフルパス/index.php;
        }
    }
    location @subrewrite {
        rewrite ^/サブディレクトリ名/(.*)$ /サブディレクトリ名/index.php/$1 last; # THIS IS THE IMPORTANT LINE
    }
link > RS-232C入門 / 入門後 の資料

RS-232Cを扱ったことがない人にどの資料で入門してもらうのがいいか。

いくつか検索したものでは、情報が多すぎて入門者向きではなかった。

以下のページは簡潔で入門向きに感じました。
http://0n0.fc2web.com/kiso/serial.html
@ ONOの電脳壁新聞さん

入門後は以下が参照用にいいように思う。

- なひたふ新聞さん
  - http://www.nahitech.com/nahitafu/mame/mame5/rs232c.html
- 通信用語の基礎知識
  - http://www.wdic.org/w/WDIC/RS-232C
Install Atom to Debian Wheezy


|Playing with Debian Wheezy|URL|
|:--|:--|
|Atom|http://qiita.com/cielavenir/items/7835e3d110d7ad79c407|
|VSCode OSS|http://qiita.com/cielavenir/items/8eb3f57373bac0f10d6f|
|Skype|http://qiita.com/cielavenir/items/1b1d733e4ede8593040f|
|Meshlab 2016|http://qiita.com/cielavenir/items/5e02ce18d162e17c8859|

Atom provides debian package by default, but it requires libc6 >=2.15, which is not the case of Debian Wheezy. So we have to compile Atom from the source code.

## Shorter way

- Go to https://www.dropbox.com/sh/g9ky5opxbiey60t/AADqD8v5Yc_quPvk9VRKtgVSa debian atom-amd64_1.17.2.deb

## 170627
- atom 1.18.0 requires keytar module, which depends on libsecret-1, which cannot be installed on Wheezy.
- I uploaded 1.17.2 binary. Stick with this.

## Prerequisites
- nodejs and clang-3.4
- https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions
- https://github.com/nodesource/distributions/blob/master/OLDER_DISTROS.md

```
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -/
echo "deb https://deb.nodesource.com/clang-3.4 wheezy main" | sudo dd of=/etc/apt/sources.list.d/clang.list
sudo apt-get update
sudo apt-get install nodejs clang-3.4
```

## Building

```
git clone https://github.com/atom/atom
cd atom
git tag
git checkout v1.16.0 # use the latest "release" from git tag
CC=clang CXX=clang++ script/build
CC=clang CXX=clang++ script/build --create-debian-package
sudo dpkg -i out/atom-amd64.deb
```

## Additional note

- https://axiacore.com/blog/atom-editor-debian/ provides a package, but this package requires libc6 from jessie. I don't recommend this if you are on true wheezy.
opensslコマンドでCSRを作成する


#はじめに
<font size=2>
以前からCSRの作成はやったことがありますが、opensslコマンドでの作成は初めて。
(今までは用意されていたシェルを利用していました。)
備忘録として一連の作業内容を記録したいと思います。

unix系のOSでは標準で利用できるようですが、windows上で利用する場合はアプリケーションのインストールが必要となるようです。
https://jp.globalsign.com/support/faq/177.html
</font>


##事前準備
---
　・サーバキーペア用パスフレーズ
　・DN情報

※今回bit数は2048bitを指定、アルゴリズムはsha-2で作成します。



#さっそく作成
---
まずopensslがちゃんと利用できるのかコマンドを入れてみました。
試しにダウンロードされているバージョンを確認。

```bash:
$ openssl version
OpenSSL 0.9.8zg 14 July 2015
```

<font size=2>　
今回、普段使っているMAC上で作成を行ったので、デスクトップにwww.xxx.jpというディレクトリを作り、そこで作業をしました。
</font>

まずキーペアの作成を行います。

※2048bitを指定

```bash:
$ openssl genrsa -des3 2048 > www.*****.jp.key

Generating RSA private key, 2048 bit long modulus
...............................................+++
......................+++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:
```

続いてCSRの作成です。
コマンド入力後、DN情報を入力します。

※アルゴリズムはsha-2としますので、-sha256と記述します

```bash:

$ openssl req -new -key www.proudit.jp.key -sha256 -out www.*****.jp.csr
Enter pass phrase for www.proudit.jp.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:*****-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:***** Inc.
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.*****.jp
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
```


CSRの内容を確認。


```bash:

$ openssl req -text -noout -in /Users/********:/Desktop/www.*****.jp/www.******.jp.csr

Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JP, ST=Tokyo, L=*****-ku, O=***** Inc., CN=www.*****.jp
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                   
　　　　　　　　　　　　　※略※     
      Signature Algorithm: sha256WithRSAEncryption 
　　　　　　　　　　　　　※略※       
```


DN情報、bit数、アルゴリズム、指定通りで作成されていることが確認できました！
pecoのkeymapをvimライクにする

pecoを使ってコマンド履歴を検索できるようにしているのですが、
表示したコマンド履歴をvimライクに ` j ` ` k ` などで上下に移動したくなりました。
（デフォルトは、 ` C-n ` ` C-p ` ）

# pecoの設定ファイルを作成する

設定ファイルを配置する場所の候補はいつかありそうです。

> peco by default consults a few locations for the config files.
https://github.com/peco/peco#configuration-file

今回は以下のディレクトリに ` config.json ` をおいてみます。

> $HOME/.config/peco/config.json

` $HOME/.config/peco/config.json ` に以下を追記します。

```
{
    "keymap": {
        "C-j": "peco.SelectDown",
        "C-k": "peco.SelectUp",
        "C-f": "peco.ScrollPageDown",
        "C-b": "peco.ScrollPageUp"
    }
}
```

https://github.com/tackeyy/dotfiles/blob/master/.config/peco/config.json

# vimライクにpecoを使えるか確認する

動的にpecoの設定ファイルを見にいってくれるようなので ` source ~/.config/peco/config.json ` は不要です。
そのままpecoを起動して ` C-j ` ` C-k ` するとvimライクに移動できることが確認できると思います。


この記事は以下のブログの焼き直しです。
http://tackeyy.com/blog/peco-with-vim-keyb-ind
serverlessでapikeysがうまく動かないとき

# 何があった？
[serverlessのサンプル](https://github.com/pmuens/serverless-secured-api)に習ってもapi key制約がうまく行かなくて、こまっていた。

```yaml:serverless.yml
provider:

  ...

  apiKeys:
    - hoge


functions:
  hello:
    handler: hello.read
    events:
      - http:
          path: hello
          method: get
          private: true
```

# どうなった？
[issues](https://github.com/serverless/serverless/issues/2450)があがってた。

# どうした？
使用プランを定義してapiとkeyを紐付けてあげるとちゃんとアクセス制限される
[![https://gyazo.com/5960f72a7fef7bfed674e36f279dc761](https://i.gyazo.com/5960f72a7fef7bfed674e36f279dc761.png)](https://gyazo.com/5960f72a7fef7bfed674e36f279dc761)

やったね！
Tmuxの備忘録

tmuxのコマンドメモ

# 用語
|screen|tmux|
|---|---|
|ウィンドウ|ペイン|
|レイアウト|ウィンドウ|


# prefix
```
prefixはC-bが初期
```

# セッション
```
C-b $ # セッション名変更
```

# ウィンドウ
```
C-b c # ウィンドウ作成
C-b & # ウィンドウ削除
C-b , # ウィンドウ名変更
C-b p # 前のウィンドウ
C-b n # 次のウィンドウ
C-b <ウィンドウ番号> # ウィンドウ番号のウィンドウに移動
C-b w # ウィンドウ切り替え（一覧）
```

# ペイン
```
C-b x # ペイン終了
C-b hjkl # フォーカスするペインの移動C-b hjkl # フォーカスするペインの移動
C-b HJKL # ペインのリサイズ
C-b t # 時間表示
C-b o # ペイン切り替え
C-b q # ペイン番号
C-b q <ペイン番号> # ペイン番号のペインに移動
```

## TPM
```
Prefix + I
```

# References
http://room6933.com/tmux/tmux-basic.html
http://qiita.com/vintersnow/items/be4b29652ff665c45198
https://github.com/mgoldchild/dotfiles
PyObjC で HelloWorld


始める前に http://qiita.com/tom-u/items/134e2b8d4e11feea8e12 の通りに環境を整える。

ごく普通の Python で HelloWorld はこう書く。

```python:HelloWorld.py
# -*- coding: utf-8 -*-
print('Hello Python')
```

実行はターミナルからこう。

```bash
$ python HelloWorld.py
```

![print.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/1486d419-b90b-98df-0fcf-2b9e24a894f6.jpeg "print.jpg")


PyObjC らしい出力は `NSLog` を使用する。実行方法は同様に。

```python:HelloWorld.py
# -*- coding: utf-8 -*-
print('Hello Python')

from Foundation import NSLog
NSLog('Hello Python')
```

![nslog.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/f978fff4-567a-e660-64bc-97e5a464b7a2.jpeg "nslog.jpg")

`NSLog` はタイムスタンプ付きで標準出力する。

さらに PyObjC らしく GUI ダイアログでメッセージ表示。`NSAlert` を使用する。

```python:HelloWorld.py
# -*- coding: utf-8 -*-
print('Hello Python')

from Foundation import NSLog
NSLog('Hello Python')

from AppKit import NSAlert
alert = NSAlert.alloc().init()
alert.setMessageText_('Hello Python')
alert.runModal()
```

![nsalert.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/cf81a7ee-2ed3-7361-5316-d3072c3c6843.jpeg "nsalert.jpg")


もっと PyObjC らしくウィンドウで、と行きたくなるが `イベント駆動型プログラミング（英: Event-driven programming）` を学ぶ事に繋がるので、しばらくはこのまま `手続き型プログラミング（英: Procedural programming）` で。

ターミナルからの実行だけでなくファインダーからの実行を可能にする為に `py2app` で Python コードを Mac アプリ化する。

```bash
$ py2applet --make-setup HelloWorld.py && python setup.py py2app --alias
```

上記を実行すると `./dist/HelloWorld.app` が作成されて、通常の Mac アプリ同様にファインダー上から実行が可能になる。

![hellopython.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/279c3ffa-ba94-363a-4b02-c7857c2271ba.jpeg "hellopython.jpg")


`python setup.py py2app --alias` の `--alias` は開発向きのオプションで、HelloWorld.py を変更後に再ビルドの必要なくコードが反映される。試しに以下の通りにコードを変更して HelloWorld.app をそのままに実行すると変更が確認できる。

```python:HelloWorld.py
# -*- coding: utf-8 -*-
print('Hello Python')

from Foundation import NSLog
NSLog('Hello Python')

from AppKit import NSAlert
alert = NSAlert.alloc().init()
alert.setMessageText_(u'こんにちは Python')
alert.runModal()
```

![konnichiha.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/6362e5a4-ab07-61f3-e4b5-c0b744bc9e46.jpeg "konnichiha.jpg")

ファインダーからの実行で `print` の出力は確認できないが、`NSLog` は`コンソール`アプリで出力の確認ができる。

![console.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/4f46dd5d-062a-e388-778a-55906d122e8c.jpeg "console.jpg")

＊2番目のエラーメッセージは無視して構わない。


Mac アプリビルド後、ターミナルから実行する場合は `$ python HelloWorld.py` と実行せずに、

```bash
$ ./dist/HelloWorld.app/Contents/MacOS/HelloWorld
```

と実行する。これは `$ python HelloWorld.py` と同義的で、コードに `pdb` を仕込んでデバッグも可能。

```python:HelloWorld.py
# -*- coding: utf-8 -*-
print('Hello Python')

from Foundation import NSLog
NSLog('Hello Python')

# pdb.set_trace() で停止する
import pdb
pdb.set_trace()

from AppKit import NSAlert
alert = NSAlert.alloc().init()
alert.setMessageText_(u'こんにちは Python')
alert.runModal()
```

![debug.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/2c31d48f-1478-a130-ce3b-339cc1724543.jpeg "debug.jpg")
Macの⌘英かなを自動再起動する。

## 何が起きているのか
MacbookのUSキーボードを使用。もともとJSキーボード出身なので、手になじんだ親指で「英数」「かな」の入力切り替えを再現すべくKarabinorのお世話になっていた。左右の⌘キー単発押しをそれぞれ「英数」「かな」にアサインするという平和な日々。
あの頃（El Capitan）は良かったな。

事態が急変したのは、新しいMacbook Proを購入してプリインストールされているSierraを使い始めてから。
SierraではKarabinorが使えないというではないか。
Karabinor Elementsという後継プロジェクトが起ち上がっているようだが、⌘キー単発押しには未対応。
代替として⌘英かなを使い始めた。これで再び平和が訪れる・・はずだった。

- あれ？入力モード変更できない → ツールバーから⌘英かな終了 → Dockに置いたショートカットから起動。
というのを繰り返すこと数回。
- どうやら ⌘英かな ver.2.2.1は不安定。いつの間にか死んでいることが多い。
- 日に2回以上再起動した時点で**めんどくさい**。
- AppleScriptで再起動させるスクリプトを書き、cronで自動実行させることにした。

## Apple Script
1) スクリプトエディタで以下のスクリプトを作成する。
再生ボタンでテスト実行。

```applescript:eikana_reboot.scpt
tell application "⌘英かな"
	quit
	delay 1
	run
end tell
```

ちなみに「⌘」という文字は、絵文字パレット（control + command + space）から選んで表示できる。
僕はそれをATOKに単語登録して使用。

2) ~/Documentsにscptフォルダを作成し、eikana_reboot.scpというファイル名で保存
もちろん任意の場所でOK。  

3) 試しに実行してみる。
スクリプトエディタの再生ボタンでも確認済みだが、コマンドラインからも実行可能か確認してみる。

```console:

$ osascript /Users/yutaka/Documents/scpt/eikana_reboot.scpt
```

コマンドラインからAppleScriptを実行するのは、osascriptだそうだ。

## cron
4) cronに登録  
あとはこのコマンドをcronに登録すれば完了。
crontab -e で直接編集するのはお勧めできないので、一旦homeにファイルを作ってそこで編集する。
```
$ crontab -l > ~/crontab
```
↑もしまだcrontabを実行したことが無いなら、vim ~/crontabで一時ファイルを作成する。


```shell-session:~/crontab

50 * * * * osascript /Users/hogehoge/Documents/scpt/eikana_reboot.scpt
```

※hogehogeの書類ディレクトリに保存したスクリプトを毎時50分にosascriptコマンドを実行する例
Apple Watchのスタンド促しが50分に来るので、その間に⌘英かなを再起動してもらうのだ笑

5) crontabに反映

```console
$ crontab < ~/crontab
```

6) 確認

```console
$ crontab -l
50 * * * * osascript /Users/hogehoge/Documents/scpt/eikana_reboot.scpt
```
さっき書いた内容が表示されればOK

---

以上で快適なUSキーライフが送れることと思う。
ま、こんなことやらずに済むのが一番なので、⌘英かなが安定することを望みます。

- 参考
http://www.openspc2.org/book/IllustratorCS/hard/018/
[初心者]cassandraについて個人的メモ

Cassandraについて個人的メモ
## はじめに
### Cassandraについて
Facebookが自社の大規模DBを管理する為に開発。今は、Apache Foundationが管理しているオープンソースのNoSQLデータベース。

### DiggがCassandraを選択した理由
>Each system has its own strengths and weaknesses, but Cassandra has a good blend of everything. It offers column-oriented data storage, so you have a bit more structure than plain key/value stores. It operates in a distributed, highly available, peer-to-peer cluster.
それぞれのシステムには強みと弱みがあるが、Cassandraはそれらを適切なバランスで備えていた。カラム指向型データストレージであり、キーバリュー型データストアよりもややデータ構造を備えている。分散構成による高い可用性を持つピア・ツー・ピア型のクラスタで運用できる。
■参考URL
http://www.publickey1.jp/blog/10/twitterdiggnosqlcassandra.html

## Cassandraの理解のために最も重要なこと
### クラスタ内のノードはリング構造（コンシステントハッシング法）となっており、トークンが割り当てられている。

## 入門資料
###「Introduction to Cassandra」(2010年6月17日にパロアルトで行われたSilicon Valley Cloud Computing Groupのイベントで使われた資料)
https://www.slideshare.net/gdusbabek/introduction-to-cassandra-june-2010
### 日本語で読めるCassandraの公式ドキュメント「Cassandra Wiki」公式ドキュメントの翻訳だけでなく、主要なリソースへのリンクもここに集積されています。
https://wiki.apache.org/cassandra/FrontPage_JP

## Cassandra関連用語
### 結果整合性を実現する為の仕組み
#### Gossip Protocol
ノード間の情報をやり取りすることによって最終的なノードの状態をクラスタ内の全てのノードが知ることが出来るようになるアルゴリズム。
データの鮮度を判断して、自分より新しい情報をどこに持っているかを近隣のノード経由で徐々に伝播していく。
#### Read Repair
読み出したデータが一致しない場合、データを修正する
#### Hinted HandOff
本来データを保持すべきノードが応答しないとき、データを預かる
#### Consistency Level
速度優先か、一貫性優先かをレベルに応じて選択できる
### Sharding
複数のデータベースにデータを分散して運用
### Seed
クラスタのやり取りを行うサーバを設定する
### ReplicaPlacementStrategyとReplicaPlacementFactor
･･･Strategyはその名の通り戦略。･･･Factorはレプリカの数を指定。
### コマンド
#### cassandra-cliコマンド
#### nodetoolコマンド
データ再配置、サーバ監視、バックアップ/リストア、
#### loadbalanceコマンド
データ展開、他ノードへのデータ移動

## 関連する一般的な知識(用語)
### NoSQL
#### 製品
例えば、MongoDB、AmazonのDynamoDB、GoogleのBigtable、Apache Hadoop、Yahoo!のHBase、 Facebook発のCassandra、 LinkedIn発のVoldemortなど
#### 特徴
RDBが搭載している機能を省き、利用目的や利用範囲を絞ることで、ノード数に素直に比例する性能、ノード数に比例しない運用コスト、伸縮自在、強い障害耐性を持つことを特徴としている。
### キーバリュー型（データモデル）
個々の組を識別する情報を「キー」（Key）と呼び、もう片方の情報を「バリュー」（Value、値）と呼びます。キーバリュー型データベースは、このような「キー」と「バリュー」の組を保存するためのデータベースです。
https://thinkit.co.jp/story/2010/10/08/1786
#### 行指向とカラム型（列指向）
最近話題の「カラム型データベース」とはどんな仕組みのデータベースか？
http://www.publickey1.jp/blog/11/post_175.html
統計学の勉強メモ

* 同じカテゴリに含まれるデータの個数を**度数**とよぶ
* 度数をまとめたものを**度数分布**とよぶ
* それを表にしたものを**度数分布表**とよぶ
* 度数がどれくらいあるかを棒グラフ（棒と棒のあいだをあけない）で表したものを**ヒストグラフ**とよぶ
* 分布の中心的位置を示すデータを**代表値**とよぶ
* Rでは平均値を取得するのに**mean()**関数が用意されている
* データを大きさの並び順に並べた真ん中に位置する値を**中心値**よぶ
    * Rでは**median()**関数が用意されている
    * データの個数が偶数の時は真ん中の二つの値の平均値が中心値となる
* 最も頻繁に観測される値を最頻値とよぶ
    * Rでは最頻値を取得する関数が用意されていない
    * 最頻値≠代表値である。
        * 最頻値はかならずしも分布の代表の値ではないため
    * 最頻値が２つあるような分布を双峰型分布とよぶ
        * この場合、最頻値を代表値と呼ぶのは好ましくない
* データにはずれがある場合などを考慮して中央値が用いられる場合があるが一般的には代表値としては平均を用いることが多い
    * 質的変数の代表値として用いられる
    * 質的変数には、平均・中央値が計算できない
* 散らばりのことを**散布度**とよぶ
* **分散**はデータから平均を引いたものの次条の合計をデータの個数で割ったもの
* 各データの値から平均を引いたものを平均からの**偏差**とよぶ
* 分散の平方根を**標準偏差**とよぶ
    * 標準偏差の値が大きいほどばらつきが大きい
Local DynamoDBのテーブルデータを削除したいときの実装（テーブル削除→作成）

Local DynamoDBのテーブルを残したまま中身を削除したくなったので、その時のメモ。Amazon DynamoDBを使っていれば、コンソールから消せますが、ローカルのDynamoDBを使っていると、なかなか面倒ですよね。

# 前提１：DynamoDBには複数データ削除用のメソッドはない
テーブルの削除（deleteTable）、データを1件削除（deleteItem）はありますが、テーブル定義を残しつつデータのみを削除するメソッドは用意されていません。（DynamoDBの特性を考えればわからんでもないですが）

# 前提2：Scanした結果のItemはdeleteItemメソッドでは使えない
ではとりあえずScanした結果を使ってItemを取り出して1個ずつ消そうかとこんなコードを組んでみますが

```
for (Map<String, AttributeValue> item : scanResult.getItems()) {
  DeleteItemRequest request = new DeleteItemRequest().withTableName(tableName).withKey(item);
  this.dynamoDB.deleteItem(request);
}
```

エラーが出力され、削除できません。deleteItemメソッドが受け付けるItemの内容は、getItemで取得したデータとマッチするようです。

```
com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: The number of conditions on the keys is invalid (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1586) ~[aws-java-sdk-core-1.11.75.jar:na]
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1254) ~[aws-java-sdk-core-1.11.75.jar:na]
	at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1035) ~[aws-java-sdk-core-1.11.75.jar:na]

```

# 一度テーブルを削除して同じ名前で複製。
結局はこの方法をとりました。Queryで1件1件取得しては削除して、、、とも考えたのですが、こちらの方が楽かな、、、と。

で、以下がコードになります。まだ削除後のテーブルを復旧しきれていないものもあるので、これから足りない分は補足します。

```java
DescribeTableRequest describeRequest = new DescribeTableRequest().withTableName(tableName);
DescribeTableResult describeResult = this.dynamoDB.describeTable(describeRequest);
CreateTableRequest createRequest = new CreateTableRequest().withTableName(tableName)
        .withAttributeDefinitions(describeResult.getTable().getAttributeDefinitions())
        .withKeySchema(describeResult.getTable().getKeySchema())
        .withProvisionedThroughput(new ProvisionedThroughput()
                .withReadCapacityUnits(describeResult.getTable().getProvisionedThroughput().getReadCapacityUnits())
                .withWriteCapacityUnits(describeResult.getTable().getProvisionedThroughput().getWriteCapacityUnits()));

DynamoDB db = new DynamoDB(this.dynamoDB);
Table table = db.getTable(tableName);
table.delete();
table.waitForDelete();

table = db.createTable(createRequest);
table.waitForActive();
```
ちなみにこれだとグローバルセカンダリインデクスやローカルセカンダリインデクスに対応していないなど、いくつも問題がありますが、一般的なテーブルの用途としてはなんとか使えるかな、とは思います。

![スクリーンショット 2017-04-17 8.45.17.png](https://qiita-image-store.s3.amazonaws.com/0/102769/f0ed718c-ac12-d112-ef9a-7b46198d5ddc.png)

#まとめ

何かいい方法があればぜひ教えてください。
macOSのデフォルトPythonでpipを使う


macOS にデフォルトでインストールされている Python2.7 で ```pip``` をセットアップする。

## 開発環境のインストール

パッケージの新規インストールやアップデートで開発ツールが必要となるので `Xcode` か `command line tools` をインストールする。インストール方法に特記すべきことはないので通常の手順通りでインストールするものとして、ここでは書かない。

## pipのインストール

https://pip.pypa.io/en/stable/installing/

上記 URL から `get-pip.py` をダウンロードしターミナルから実行する。

サイトでは

```bash
$ python get-pip.py
```

とあるが、カレントユーザーの権限で使用できるよう **--user** オプション付きでインストールする。

```bash
$ python get-pip.py --user
```

実行が完了すると `$HOME/Library/Python` にインストールされる。`pip` コマンドが利用できるようパスを通す。

```bash
$ export PATH="$HOME/Library/Python/2.7/bin:$PATH"
```

永続的にパスを通すよう `.bash_profile` に記述する。

```bash
$ echo 'export PATH="$HOME/Library/Python/2.7/bin:$PATH"' >> ~/.bash_profile
```

## 既存パッケージのアップデート

pip のインストール同様、--user オプションを付けてアップデートする。

```bash
$ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs pip install -U --user
```

新規のパッケージインストールも --user オプションを付けるものとする。

## HelloWorld.py

```python:HelloWorld.py
# -*- coding: utf-8 -*-
from AppKit import NSAlert
alert = NSAlert.alloc().init()
alert.setMessageText_('Hello Python')
alert.runModal()
```

pip でパッケージのアップデートが正常に完了すれば `py2app` が利用できる。py2app は Python コードを Mac アプリ化するためのモジュール。

`HelloWorld.py` を用意し `py2applet` コマンドで Mac アプリ化する。

```bash
$ py2applet --make-setup HelloWorld.py && python setup.py py2app --alias
```

エラーなくコマンドが完了し `./dist/HelloWorld.app` が作成されいるはずなので実行する。

![hellopython.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/279c3ffa-ba94-363a-4b02-c7857c2271ba.jpeg "hellopython.jpg")
Railsで大量の写真をZIPにまとめてダウンロードする


# はじめに

写真を大量にアップロードするWebサービスを作っていると、アップロードされた写真をまとめてダウンロードさせたくなることがあります。
そこで、zipline + carrierwave を使うと非常に簡単に写真をZIPにまとめてダウンロードすることができたのでご紹介します。

# 今回の環境

```
Ruby on Rails 5.0
carrierwave (1.0.0)
fog (1.38.0)
zipline (0.0.12)
```

今回利用したgemはこちら

fringd/zipline: A gem that lets you stream a zip file from rails
https://github.com/fringd/zipline

# 前提条件

写真のアップロードにはcarrierwaveを使っています。
またアップロードされた写真はfogを使ってS3に保存しています。
この形式はRailsではよく使われる方法なので実装方法は割愛します。

# ルーティング

本の画像をZIPで一括ダウンロードする様にしたいので、ルーティングは下記の様にします。

``` #config/routes.rb
Rails.application.routes.draw do
  resources :books, only: %i(index)
end
```

これで `/books` でアクセスすると本の一覧を表示して、 `/books.zip` でアクセスすると本の画像をZIPでダウンロードできるようにします。

# 実装方法

まずはgemを追加して `bundle install` します。

``` #Gemfile
gem 'carrierwave'
gem 'fog'
gem 'zipline'
```

本の一覧を表示するコードは今回の内容とは関係ないので省略しますが、ZIPで一括ダウンロードするリンクは下記の様にします。

``` #app/views/books/index.html.haml
= link_to 'ZIPでダウンロード', books_path(format: :zip)
```

Bookモデルにはimageという画像を保存するカラムを追加します。

``` #app/models/book.rb
class Book < ApplicationRecord
  mount_uploader :image, ImageUploader
end
```

後はコントローラーにZIPでダウンロードするコードを記載します。

``` #app/controllers/books_controller.rb
class BooksController < ApplicationController
  include ActionController::Streaming
  include Zipline

  def index
  	@books = Book.all
    respond_to do |format|
      format.html
      format.zip do
        files =  @books.where.not(image: nil).map{ |book| [book.image, "#{book.id}.jpg"] }
        zipline(files, 'books.zip')
      end
    end
  end
end
```

`files` 変数にZIPにまとめたい画像ファイルを配列で入れています。
入っている配列は下記の様になっています。
ziplineがcarrierwaveに対応しているのでcarrierwaveのカラムを直接渡してあげるだけでremote_urlが画像のパスとしてセットされます。

```rb:#files変数の中身
[
  ['https://example.s3-ap-northeast-1.amazonaws.com/uploads/book/image/1/image.jpg', '1.jpg']
  ['https://example.s3-ap-northeast-1.amazonaws.com/uploads/book/image/2/image.jpg', '2.jpg']
  ['https://example.s3-ap-northeast-1.amazonaws.com/uploads/book/image/3/image.jpg', '3.jpg']
]
```

# 注意点

コントローラーの中で `@books.where.not(image: nil)` としてimageが無いbookは渡さない様にしています。
imageが空のカラムを渡してもエラーにはならずZIPダウンロードまで行えますが、ダウンロードしたZIPを解凍しようとすると不正なファイルとして解凍できないので注意が必要です。

# まとめ

zipline + carrierwaveでとてもシンプルに一括ダウンロードが実装できました。
また、ziplineは `Streaming` でダウンロードしているので大きなファイルサイズのZIPであっても快適にダウンロードが行えるようになっています。
ADDA > runtime argument > -init_field read ...

```txt:Environment
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

Excerpt from `manual.pdf` (last revised: February 20, 2014) related to read the internal fields.

Related: [ADDA > runtime parameter > -store_int_field / -store_dip_pol > store internal fields and dipole polarizations](http://qiita.com/7of9/items/14bcb6c4c96ee640b089)

### -init_field read ... 

https://groups.google.com/forum/#!topic/adda-discuss/f3_Cm3HFtkA

> If you want to input the field to be used as a first guess by the iterative solver, you may try
-init_field read ...
This option was added specifically to facilitate external hacks for the iterative solver.

@ manual.pdf > 12.1 Iterative solver

> There are several options to choose the initial field, set by the command line option

`-init_field {auto|inc|read <filenameY> [<filenameX>]|wkb|zero}`

> where zero vector is a general approach and inc (derived from the incident field, more precisely – equal to the right-hand-side of the linear system) may be closer to the exact solution for small index-matching particles.

> wkb is derived from the incident field corrected for phase shift during propagation in the particle (Wentzel–Kramers–Brillouin approximation [73]). It can be considered as an extension of inc , but currently it works only for default incident beam – plane wave propagating along the z-axis in particle reference frame (§9) and
not in the surface mode (§7).

...

> It is important to note, that ...
> In particular, “ -beam read fY fX –init_field inc ” is not completely equivalent to “ -init_field read fY fX ” in terms of the starting vector.