OmniAICreator/Qiita-1.07M huggingface dataset:
spreadsheet　メモ


Googleformの機能使ってspreadsheetに集計するとき
以下のような結果を別々のシートにバラして欲しいという要望があった。

![スクリーンショット 2016-07-22 12.10.02.png](https://qiita-image-store.s3.amazonaws.com/0/84002/d2154a77-248d-49a1-1b55-313fb23276c3.png)

アンケートで設問が２つありどっちも必須ではなかったので
片方が入力されていなかったなどの状況もあり得る。


いつ入力されたかがわかるよう各シートには必ずタイムスタンプを
Aの列に表示しB列に欲しい情報を表示させるというもの。



シート「意見」の関数

```
タイムスタンプ
=query(IMPORTRANGE("スプレッドシートのID","フォームの回答 2!A:B"), "select Col1 where Col2 != ''")

意見
=query(IMPORTRANGE("スプレッドシートのID","フォームの回答 2!B:B"), "select * where Col1 != '' ")
```
シート「不具合」の関数

```
タイムスタンプ

=query(IMPORTRANGE("スプレッドシートのID","フォームの回答 2!A:C"), "select Col1 where Col3 != ''")

不具合

=query(IMPORTRANGE("スプレッドシートのID","フォームの回答 2!C:C"), "select * where Col1 != '' ")
```

シート「入力数」の関数

```
意見数
= counta(importrange("スプレッドシートのID", "意見!B2:B"))

不具合数

= counta(importrange("スプレッドシートのID", "不具合!B2:B"))
```

結果
意見
![スクリーンショット 2016-07-22 12.56.33.png](https://qiita-image-store.s3.amazonaws.com/0/84002/c005f81f-c72c-452a-3fd3-94ac7734b79b.png)
不具合
![スクリーンショット 2016-07-22 12.56.50.png](https://qiita-image-store.s3.amazonaws.com/0/84002/78fd2c0c-dab6-7cc4-a024-fd8e98e5cc94.png)
入力数
![スクリーンショット 2016-07-22 12.57.11.png](https://qiita-image-store.s3.amazonaws.com/0/84002/68c4ef54-bb93-c1d9-e28a-3d263f9cd149.png)


queryとIMPORTRANGEを使うことにより様々な条件で絞ることができた。
覚えれば便利なもんだなぁ。
Appleに税金を払わずopenFrameworksのサンプルを実機で動かす

アップルに税金(Apple Developer Program)を払わずに、
サンプルの`advancedEventsExample`をためしてみる


![Screen Shot 2016-07-27 at 1.20.59.png](https://qiita-image-store.s3.amazonaws.com/0/56337/3357198e-cc83-0049-0e76-e6dffe80741f.png)

ビルドすると、何やらエラーが。
`Fix Issue`を押してみる。

---

![Screen Shot 2016-07-27 at 1.21.54.png](https://qiita-image-store.s3.amazonaws.com/0/56337/32985765-9a95-bcab-f79d-35adbdd33e32.png)

Identifierが`advancedEventsExample`のApp IDはつかえないとのこと。


---

![Screen Shot 2016-07-27 at 1.23.12.png](https://qiita-image-store.s3.amazonaws.com/0/56337/9dad46b5-e31c-58dd-b236-585279dc6b1b.png)

プロジェクトのIdentifierが`advancedEventsExample`となっているので、適当なのに変更する。
(`advancedEventsExampleHOGEHOGE`とか)


---

![Screen Shot 2016-07-27 at 1.25.58.png](https://qiita-image-store.s3.amazonaws.com/0/56337/cf067c46-3808-4c46-a1bb-c4a7af5731a8.png)

今度はProvisioning Profileが無いと怒られるけど、
`Fix Issue`押すと勝手に作ってくれる。

---

ビルド後の初回起動時に、端末側で認証を求められる

![Screen Shot 2016-07-27 at 1.14.32 copy.png](https://qiita-image-store.s3.amazonaws.com/0/56337/d5889f86-d3c7-905f-f4ea-c39bfb036bd0.png)

ダイアログ通りに端末の設定で
`General` -> `Device Management` -> `自分のアカウント`
の画面に遷移していき、
`Trust ~~~`
みたいなボタンを押すと、アプリがインストールされる。


---

やったね!!

<img width="320" alt="IMG_3242.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/56337/039efb4e-fb77-a513-2130-2007792b7ba0.png">


---

ちなみに、

```
PATH/TO/of_v0.9.3_ios_release/examples/ios/advancedEventsExample/bin/data/Icon@2x.png
Command /Applications/Xcode.app/Contents/Developer/usr/bin/copypng failed with exit code 1
```
みたいに怒られた場合、

```
PATH/TO/of_v0.9.3_ios_release/scripts/templates/ios/bin/data
```
以下のファイルをサンプルの`bin/data`にコピーすればok
Centos6.8にwineをインストールしてみた。

# Centos6.8でkindleを動かす

Centos6.8でwindowsソフトを動かす必要がでたので、備忘録のために導入手順をまとめました。
今回はCentosにwine(64bit)をインストールして、kindleが起動できるところまでやります。

# 導入方法 (epelから)
[wine公式](https://www.winehq.org/)
現在(2016/07/26)、wineのdevelop最新は1.9.15,stable最新は1.8.3でした。
最初1.9.15をソースからコンパイルしようとしましたが、libraryの依存関係解消が
たいへんそうなので、epelリポジトリからインストールします。

## epelの導入
epelの導入はこのサイトを参考にさせていただきました。
まず、epelリポジトリを追加。

```su:su
yum install yum-priorities
wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
```

次にepelの設定です。
明示的に指示しない限りepelを参照しないようにします。
必要な場合はproxyの設定もしてください。

``` repo:/etc/yum.repos.d/epel.repo
[epel]
....
....
enabled=0

proxy=http://your.proxy.server:8080
proxy_username=username
proxy_password=password
```
## wineのインストール

```yum info wine --enablerepo=epel```でwineのversion確認したところ、stable版最新の1.8.3でした。
epelからwineをインストールします。依存ライブラリを含めていろいろインスト－ルが始まります。

```su:su
yum install wine --enablerepo=epel
```

## フォントのインストール
文字化け対策用に**winetricks**を利用してフォントのインストールをしていきます。
[wine公式](https://wiki.winehq.org/Winetricks)にwintricksの導入方法が書いてあります。
wintricksはパスの通った場所(自分は/usr/local/bin)にダウンロードするか、ダウンロードした場所にパスを通してください。

```su:su
cd /usr/local/bin/
wget  https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
chmod +x winetricks
```
### winetricksでfontインストール
fontのインストールの前にwindowsパッケージの展開などに必要なライブラリのインストール

```su:su
yum install cabextract
```
最初にwinetricksを起動したときに、monoやgeckoのインストールを促されるのでインストールしてください。
guiを用いてインストール(コマンドベースでもインストールできます。)

* Select the default wineprefix
![スナップショット9.png](https://qiita-image-store.s3.amazonaws.com/0/135030/836514d0-0da5-6e31-3651-fc9f06099188.png)


* install a fontを選択
![スナップショット4.png](https://qiita-image-store.s3.amazonaws.com/0/135030/f9b6dbcb-1a4a-ab8d-0cf9-ed1ec4ea6e65.png)
* allfontsを選択
![スナップショット5.png](https://qiita-image-store.s3.amazonaws.com/0/135030/9834b46c-1270-bad5-6ba0-ac73b715356a.png)

OKを選択して、インストール開始します。
### winecfgでOSの設定
winecfgで基準となるwindowsOSを選択します。今回はwindows7を選択します。
windows10を選択したところメニューバーの一部に文字化けが発生しました。
![スナップショット11.png](https://qiita-image-store.s3.amazonaws.com/0/135030/a67d50cf-2b4a-619a-eb83-1bbcc52e0e90.png)


#　起動確認
kindleを起動してみました。```wine KindleForPC-installer-###.exe```
本も特に文字化けなくみることができました。

最初うまくwineが起動できませんでした。
wine実行ユーザーにreadや実行権限を与えてあげたら解決できました。

```
wine: cannot find L"Z:\\home\\kue\\KindleForPC-installer-1.16.44025.exe"
```

# あとがき
今回のフォントインストールの方法だとなにがしかのexeで文字化けが発生する場合があります。
おいおい見ていきたいです。
あとUbuntuでのwineインストールは[公式](https://wiki.winehq.org/Ubuntu)の方法に従えば比較的簡単にできたかと思います。

以上。
PokemonGo-SlackBot を CentOS7 と Docker で試してみた

* [ブログからの転載](http://1bed.allright.life/?p=2199)

ロードバランスすだちくんのブログ [ポケモンGOで自分の近くにポケモンが出現したらSlackに通知する](https://blog.animereview.jp/pokemon-go-to-slack/) をみてて試してみたくなったので、最初は Azure で CentoS 7 ベースで作っていたけど、もっと気軽にやりたくて半年ぶりぐらいに docker でやってみたメモ

※ちなみに住んでるところはポケモンが出ないので終了です... orz


# dockerfile

```bash:pokemon
FROM docker.io/centos:7
MAINTAINER miyamiya

# Packages
RUN yum install -y epel-release \
  && yum install -y which sudo git gcc \
  && yum install -y python-pip \
  && yum update  -y \
  && yum clean all \
  && pip install pip --upgrade \
  && ln -s /usr/lib64/libpython2.7.so.1.0 /usr/lib/libpython2.7.so \
  && useradd bot \
  && echo "%bot ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/bot \
  && mkdir -p /home/bot && cd /home/bot \
  && git clone https://github.com/rubenmak/PokemonGo-SlackBot.git \
  && cd PokemonGo-SlackBot \
  && pip install -r requirements.txt \
  && chown -R bot.bot /home/bot 

# Platform config
USER bot
WORKDIR /home/bot/PokemonGo-SlackBot
```


# イメージ作成

```bash
docker build -t pokemap -f pokemap .
```

# docker run

```bash
docker run -it -v /etc/localtime:/etc/localtime:ro -e "LANG=en_US.UTF-8" --name "pokemap" pokemap /bin/bash
```

# いでよポケモン！

## 例

* ポケモントレーナークラブのユーザー名/パスワード
  hoge/fuga

* 新宿御苑の緯度経度
  35.6851633 139.7074763

* Slack の Incoming Webhook の URL
  https://hooks.slack.com/services/xxx

```bash:example
/usr/bin/python ~/PokemonGo-SlackBot/pokeslack.py -u hoge -p fuga -l "35.6851633 139.7074763" -st 1 -r 150 -sw https://hooks.slack.com/services/xxx -L "ja"

```

# 参考

* [ポケモンGOで自分の近くにポケモンが出現したらSlackに通知する](https://blog.animereview.jp/pokemon-go-to-slack/)
Stylusで文字列連結して変数を生成する

「Stylusで、変数をloopで回して動的に変数を生成する」

イメージとしては

```stylus:stylus
// $color_1 = red
color '$color_' + 1  // color: red; と出力したい
```

こういう感じの変数展開がしたい。
しかし上記のコードだと

```css:css
color: '$color_1';
```

と展開されてしまうのでだめ。
ということに去年だったか悩んでたんですが、普通に関数が用意されてました…ということでメモ。

**DEMO:** https://codepen.io/tokimari7/pen/oLyjbv

Stylusの```lookup()``` というbuilt in functionを使えばできます。

> lookup(name)
Allows to lookup a variable with a given name, passed as a string. Returns null if the variable is undefined.
Useful when you need to get a value of a variable with dynamically generated name:

```jade:jade
ul
  each i in [1,2,3]
    li(class="item--#{i}").item color
```

```stylus:stylus
$color_1 = red
$color_2 = blue
$color_3 = green
.item
  for $idx in (1..3)
    &--{$idx}
      color lookup('$color_' + $idx)
```

output image:
![image](https://qiita-image-store.s3.amazonaws.com/0/45314/b4b1ae43-0662-f882-19e8-ce31b854db92.png)



**おまけ**

zeroPaddingも ```base-convert()``` で代用できる。

```stylus:stylus
$color_01 = red
$color_02 = blue
$color_03 = green
.item
  for $idx in (1..3)
    $key = base-convert($idx, 10, 2)  // 10進数、2桁のzeroPadding
    &--{$key}
      color: lookup('$color_' + $key)
```

連番のスタイル生成に便利。
systemd のサービスで OnFailure でメール通知

下記のほぼそのまんまですけど、systemd のサービスで OnFailure でメール通知してみました。

- https://wiki.archlinuxjp.org/index.php/Systemd/%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC#MAILTO

環境は下記の通り。

- `centos-release-7-2.1511.el7.centos.2.10.x86_64`
- `systemd-219-19.el7_2.11.x86_64`

メールを送るためのサービスを作ります。

**`/etc/systemd/system/failure-email@.service`**

```
[Unit]
Description = failure email for %I

[Service]
Type = oneshot
ExecStart = /bin/sh -c 'systemctl status --full "$1"|mail -S sendwait -s "[$HOSTNAME]systemd failure $1" root' -- %i
User = nobody
Group = systemd-journal
```

適当にそれっぽいサービスのスクリプトを作ります。

**`/usr/local/bin/oreservice`**

```sh
#!/bin/bash
while sleep 1; do
    echo "hello oreservice"
done
```

実行属性を付けます。

```sh
chmod +x /usr/local/bin/oreservice
```

ユニットファイルを作ります。OnFailure に `failure-email@%n.service` を指定します。

**`/etc/systemd/system/oreservice.service`**

```sh
[Unit]
Description = oreservice
OnFailure = failure-email@%n.service

[Service]
Type = simple
Restart = always
ExecStart = /usr/local/bin/oreservice

[Install]
WantedBy = multi-user.target
```

systemd をリロードしてユニットファイルを読み込みます。

```sh
systemctl daemon-reload
```

サービスを開始します。

```sh
systemctl start oreservice.service
systemctl status oreservice.service
```

おもむろに殺します。

```sh
systemctl kill oreservice.service -s SIGKILL
```

メールで通知されたら成功です。

----

```
OnFailure = failure-email@%n.service
```

これは、ユニットが failure になったら `failure-email@oreservice.service.service` ユニットを開始する、という意味です。

`failure-email@.service` はアットマークを含むのでテンプレートユニットです。これを `failure-email@oreservice.service.service` のように呼び出した場合、ユニットの `%i` には `oreservice.service` が渡ります。

なので、下記のように直接実行してメールの通知を確認することもできます。

```sh
systemctl start failure-email@oreservice.service.service
```
Chainer (Windows) のサンプル mnist がWinError 183 でエラー終了する場合の対応方法。

#概要#
今流行りの、深層学習を始めようとWindowsにPython+Chainerをインストールしてみて、意気揚々とサンプル mnist を実行してみたら、何故かエラー終了して、気勢を削がれがちな方へのカンフル剤です。
詳細な原因解明等はできていませんが、とりあえずエラーをなくして、mnistを実行することができます。

![mnistError.png](https://qiita-image-store.s3.amazonaws.com/0/110181/a5e98316-267d-7e6e-03ef-5ba6b2911e2f.png)

#環境#
* Windows 10 (64bit)
* Python 3.1.2 on Anaconda 4.1.1
* chainer 1.11.0

#症状#
mninst を実行すると epoch の終了後（100%になったタイミングで）必ずエラー発生。
以下のエラーメッセージが吐かれる。

```CMD
FileExistsError: [WinError 183] 既に存在するファイルを作成することはできません。: '<PATH_TO_CHAINER_INSTALL_DIRECTORY>\chainer\examples\mnist\result\logofw0i659' -> 'result\log'
```

#原因#
"log" という名前のファイルが存在しているにもかかわらず、別のファイルをリネームして "log" としようとしたため、エラーが起きた。

#対策#
上記リネームを行わない。
（本来は上書き保存してほしい‥のでしょうか？）

#方法#
その一行上のラインのエラーメッセージを参照。

```CMD
File "C:\Anaconda3\lib\site-packages\chainer\training\extensions\log_report.py", line 94, in __call__
    os.rename(path, os.path.join(trainer.out, log_name))
```

該当ファイル（log_report.py）の該当行数（line 94）をコメントアウトする。

```log_report.py
# 下記行をコメントアウト。
#os.rename(path, os.path.join(trainer.out, log_name))
```

![mnistDebug.png](https://qiita-image-store.s3.amazonaws.com/0/110181/bd610178-f8d3-72dc-9def-55a193870a19.png)


以上でエラー発生しなくなります。
代わりに、ログディレクトリにログファイルが大量に生成されるので、適宜掃除する必要があります。ご注意ください。

#余談#
mnist の gpu なしでのデフォルトパラメーターででの実行時間測定結果です。参考値として。

#環境#
* Surface Pro 3 256GB モデル
* Windows 10 (64bit)
* CPU: intel Core-i5-4300U
* Memory: 8 GB
* GPU: なし（Intel HD Graphics 4400）
* バッテリー駆動（省電力ON）

#結果#
実行時間：20分弱（18分）
（これ、特に実行時間が画面表示とかはされないのですね‥。）
CentOS 7でデフォルトのカーネルを変更・指定する

CentOS 7でカーネルをビルドする機会があったので、デフォルトのカーネルを変更する方法をメモしておきます。テキストエディタで`grub.cfg`を編集するものだとすっかり思い込んでたのでしばらく`grub.cfg`をじーーっと眺めてたのですが、調べてみたところ**準備されている`grub2-set-default`コマンドで変更**できます。

手順は下記の通りです。

> **注意:** カーネル周りの設定を変更する際は変更後の再起動に失敗する恐れもありますので、十分注意して下さい。

## 現在のデフォルトを調べる

```
[root@host ~]# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)
```

## カーネルのリストを表示する

```
[root@host ~]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (3.10.0-327.3.1.el7.x86_64.debug) 7 (Core)
1 : CentOS Linux (3.10.0-327.3.1.el7_lustre.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-6eb4b54119134fe79ebe5bf35fbf8018) 7 (Core)
```

## 利用したいカーネルをデフォルトに設定する

例えば`1 : CentOS Linux (3.10.0-327.3.1.el7_lustre.x86_64) 7 (Core)`に変更する場合は下記の通りです。

```
[root@host ~]# grub2-set-default 1
[root@host ~]# grub2-editenv list
saved_entry=1
```

> **NOTE:** カーネルのリストが0(ゼロ)から始まっている点に気をつけて下さい。

## 再起動して確認する

再起動してログインすると、下記のように指定したカーネルになっていることが確認できると思います。

```
[root@host ~]# uname -r
3.10.0-327.3.1.el7_lustre.x86_64
```

## 参考リンク

- [Setting Up grub2 on CentOS 7](https://wiki.centos.org/HowTos/Grub2)
SQL Server の SSISDB カタログの環境設定を吐き出すSQL

SQL Server でSSISDBの環境設定を吐き出すには、SQLで以下の問い合わせを実行する。


``` 
SELECT c.name, c.sensitive, c.description, c.value, c.type
    FROM [SSISDB].[catalog].[folders] a
        INNER JOIN [SSISDB].[catalog].[environments] b
            ON a.folder_id =  b.folder_id
        INNER JOIN [SSISDB].[catalog].[environment_variables] c
            ON b.environment_id = c.environment_id
    WHERE a.name = 'foldername'
        AND b.name = 'environmentname'
```

 SQL内の以下の場所を適宜書き換えて下さい。
* foldername:SSISDBのフォルダ名
* environmentname:SSISDBの環境名
Zepto.js v1.1.7, v1.2.0

たまたまZepto.jsのサイトを訪れてみたら、なんと約一年半ぶりのアップデートが来ていました！　1.1.7と1.2.0同時のようです。

[Zepto.js 公式](http://zeptojs.com/)
[変更履歴](https://github.com/madrobby/zepto/releases)
[1.1.6と1.1.7の差分](https://github.com/madrobby/zepto/compare/v1.1.6...v1.1.7#files_bucket)
[1.1.7と1.2.0の差分](https://github.com/madrobby/zepto/compare/v1.1.7...v1.2.0#files_bucket)


## 1.1.7

主な変更内容は細かい挙動の修正です。追加機能としては、ajaxでバイナリデータが扱えるようになったそうです。


## 1.2.0

主な変更内容は1.1.7のバグ修正とjQuery互換性の強化です。後方互換性が若干失われているそうです。新機能としては、

- `$.noop`
- `fn.removeProp()`
- `$.isNumeric()`
- Ajaxのオプション：`dataFilter`
- dataモジュール：`$.data()`と`$.hasData()`
- detectモジュール：Firefox OSの判定

があります。

## 参考

ファイルサイズの推移を、最近のjQueryも含めて比べてみました。値はどれもcdnjsで計測しています。結果は歴然ですね！

|                       |compressed|gzipped|
|:---------------------:|:--------:|:-----:|
|Zepto 1.1.6            |    24.5KB|  9.5KB|
|Zepto 1.1.7            |    25.3KB|  9.7KB|
|Zepto 1.2.0            |    25.8KB|  9.9KB|
|jQuery 3.1.0           |    84.3KB| 29.9KB|
|jQuery 3.1.0 slim build|    67.3KB| 23.6KB|


## 所感

Zepto.jsは割と好きなライブラリだったので、まだ開発が続けられていると知ってうれしいです。みなさんも、jQueryに重苦しさを感じたら使いましょう！
Xcodeプロジェクトの.gitignore

Xcodeプロジェクトから都度不要ファイルをどけるのがだるいので、メモ

```
*.xcuserstate
*.xcbkptlist
```


#### 2016/07/31:追記
コメントで指摘のあったgiboを使うとかなり簡単。

```
$ gibo xcode
### https://raw.github.com/github/gitignore/9f6724149b9a0a861b402683f6c50c5f085d130b/Global/xcode.gitignore

# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore

## Build generated
build/
DerivedData/

## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/

## Other
*.moved-aside
*.xccheckout
*.xcscmblueprint


$ gibo xcode >> .gitignore
```

参考
http://stackoverflow.com/questions/9028118/what-is-userinterfacestate-xcuserstate-file-in-xcode-project

https://moomindani.wordpress.com/2012/08/05/xcode%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E7%94%A8%E3%81%AE-gitignore%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B/

http://qiita.com/uasi/items/79aecac40f1b2a5f929b

http://blog.ishkawa.org/2012/10/27/xcode-git/
ロングトランザクションにおける楽観ロック(Spring+JPA)

JPAに楽観ロックがサポートされているのでそれを使おうとしたけれど、ロングトランザクションの場合、どうやるのか不明でここ3日ほど悩みました。
※ロングトランザクションという言葉もこの調査で初めて知りましたｗ

やりたかったのは以下のようなこと。

①ID入力→検索ボタン押下→DBからデータ取得→画面にデータ表示
②画面入力でデータを書き換える
③更新ボタン押下→DBのデータ更新

この①～③の処理をひとつのトランザクションでやるようなイメージで①～③の間に他の誰かがデータ更新していたら異常としたい。

というわけで、今回はロングトランザクション(複数リクエスト)時の楽観ロック方法
まずは楽観ロックするためのバージョニング用カラムを追加してEntityにも対応するプロパティと@Versionアノテーションを設定

``` NameT.java
package jp.test.spring.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Version;

@Entity
@Table(name = "NAMET")
public class NameT implements Serializable {

	@Id
	@Column(nullable = false)
	private int id;

	@Column
	private String name;

	@Version                // ←@Versionアノテーション追加
	private int version;    // ←バージョニング用のカラムを追加

	// getter/setter
}
```

@Transactionalアノテーションが設定されたDB更新処理関数でEntityManager.lock()を使って楽観or悲観ロックを取得。
※第2引数に渡すパラメータでロック種別が設定可能

``` TestServiceImpl.java
@Service("testService")
public class TestServiceImpl implements TestService {

	@Transactional
	@Override
	public void updateNameT(NameT nameT) {
		NameT updateNameT = entityManager.find(NameT.class, nameT.getId());
		entityManager.lock(updateNameT, LockModeType.OPTIMISTIC);
		updateNameT.setName(nameT.getName());

		entityManager.merge(updateNameT);
	}
}
```

けど、これだと一つのリクエスト内でしかトランザクション張れないので、ロングトランザクションの場合どうやるの？ってずっと悩んでました。。。


ロック取得前に手動でバージョン情報を確認するしかないのでは？と思っていろいろ調べたらTERASOLUNAさんのサイト(https://terasolunaorg.github.io/guideline/public_review/ArchitectureInDetail/ExclusionControl.html#id12 )にそのような記載がありました。
手動で確認してorg.springframework.orm.ObjectOptimisticLockingFailureExceptionをthrowすればいいみたいです。
この場合、関数にthrows ObjectOptimisticLockingFailureExceptionをつけなくてもOKでした。

というわけで、修正したソースが以下になります。
ObjectOptimisticLockingFailureExceptionコンストラクタの第1引数にEntityのClass<?>、第2引数にEntityのPrimaryKeyのObjectを設定するみたいです。

``` TestServiceImpl(修正後).java
@Service("testService")
public class TestServiceImpl implements TestService {

	@Transactional
	@Override
	public void update(NameT nameT) {
		NameT updateNameT = entityManager.find(NameT.class, nameT.getId());
		if (updateNameT.getVersion() != nameT.getVersion()) {
			throw new ObjectOptimisticLockingFailureException(NameT.class, nameT.getId());
		}

		entityManager.lock(updateNameT, LockModeType.OPTIMISTIC);
		updateNameT.setName(nameT.getName());

		entityManager.merge(updateNameT);
	}
}
```

update()に渡すNameTは検索ボタン押下でデータ取得したときのバージョン情報が格納されたものである必要あります。
更新時にバージョン情報が違うとObjectOptimisticLockingFailureExceptionが発生してデータ更新されません。しかもロールバックが実行されるぽい。

やり方がわかったので今回のプロジェクトは楽観ロックで実装できそうです。
めでたしめでたし
ドットインストールyaml入門を受講したときのメモ

# yaml入門

## #01 yamlを使ってみる。
* 環境はruby（cloud9で立ち上げ）を使用。(rubyのバージョンは2.3）
* yamlはデータ構造をシンプルな表記で記述する記法

## #03 スカラーを扱ってみる。
* yamlが扱える３種類のデータ構造の１つ
* スカラー：値
    * 文字列
    * 数値
    * 真偽値
    * null
    * 日付
入力例

```yaml:scaler.yml
- testdata
- 30
- 23.5
- true #true/false, yes/no, on/off
- null #~
- 2016-07-10
- "333" #文字列として解釈する
```

## #04シーケンスを扱ってみる。
* シーケンス：配列
 * ハイフンを付けてスカラーを記述すればOK
 * インラインスタイルで書いても認識してくれる。

```yaml:sequence1.yml
#ブロックスタイル
- a
- b
- c
#フロースタイル
[d,e,f]
```

### 入れ子構造 

```yaml:sequence2.yml
- a
-  #入れ子構造にしたい時は、ここにスカラーを入れない。
  - b-1
  - b-2
- c
```

## #05 マッピング：ハッシュ（key / value)
* キーと値を並べてあげればよい。
 
```yaml:mapping1.yml
name: test
score: 80
#フロースタイルでも書ける
{name: test, score: 70}
```

### 入れ子構造

```yaml:mapping2.yml
name: test
score:
  game-1: 40
  game-2: 60
```

## #06 複雑なデータを扱う
### 配列のハッシュ

```yaml:complex1.yml
names: 
  - test
  - taro
scores: 
  - 60
  - 90
# フロースタイルでもOK
names: [test, taro]
scores: [60, 90]
```

### ハッシュの配列

```yaml:complex2.yml
- name: test
  score: 60
- name: taro
  score: 90
  
# フロースタイル
- {name: test, socre: 60}
- {name: taro, socre: 90}
```

## #07 改行を含むデータを扱う
* 改行はスペースに変換されてしまう。
* 改行も含めたデータとして取り扱いたい場合は以下のとおり。

```yaml:data.yml
- |+   #最終行の改行を含めたい場合は"+"、除きたい場合は"-"
  this
  is
  a
  pen.

- >+   #途中の改行はスペース変換。最後の改行は有効
  this
  is
  a
  pen.
```

## #08 アンカーとエイリアスを使ってみる。
* 何かしらのスカラーを変数化したい時につかう。

```yaml:anker.yml
- &leader tanaka #アンカー
- *leader #エイリアス
- &staff sato 
- *staff
- *staff
- *staff
- *staff
```

### 複雑なデータのアンカーとエイリアス
　* ハッシュに対して友達関係を表現したい場合。

```yaml:anker2.yml
- &test
  name: test
  score: 90
- &taro
  name: taro
  score: 60
  friends:
    - *test
- &jiro
  name: jiro
  score: 45
  friends:
    - *taro
    - *test
```

## #09 ハッシュをマージする。
* 共通のハッシュなどをスッキリ書くときに使う。

```yaml:hash_merge.yml
common: &common #commonのアンカーを定義する。
  user: dbuser
  password: dbpassword

development:
  database: myapp_dev
  <<: *common #commonのエイリアスを挿入（マージ）する。
  
production:
  database: myapp_prod
  <<: *common

test:
  database: myapp_test
  <<: *common
```

## #10 複数のデータを解釈する。
* 通常は１つのスカラーやシーケンスは１つのデータとして処理される。
* データの始まり（---）と終了（...）を記述することで、複数のデータをまとめて解釈する。

```yaml:mydata.yml
---
- 1
- 2
- 3
... #...は省略可能
---
- a
- b
- c
...
```

```ruby:parse.rb
require "yaml"

File.open('mydata.yml') do |io|
   YAML.load_documents(io) do |d|
       p d
   end
end
```

### 出力

```
[1, 2, 3]
["a", "b", "c"]
```

## #11 Rubyのto_yamlを試してみる。
* yamlの記法を忘れてしまった時などに使える。
* rubyでは、to_yaml

```ruby:parse.rb
require "yaml"

users = [
    {'name' => 'test', 'score' => '90'},
    {'name' => 'taro', 'score' => '100'},
    
    ]
    
puts users.to_yaml
```

### 出力

```
---
- name: test
  score: '90'
- name: taro
  score: '100'
```

以上、yaml便利！
Pythonによるfitsファイルの読み込みと書き込み（メモ）

#はじめに
fitsファイルとは探査データや天文データに使われる画像ファイル形式で、ヘッダーと言われる時刻や姿勢様々な情報を含む部分と、画像サイズ（例えば1024x1024）の配列の部分からなる。
キューブ状のfitsファイルも存在していて、その場合にはn個のヘッダーと画像配列から構成される。
https://ja.wikipedia.org/wiki/FITS
Pythonのライブラリastropy.io.fitsを使ったfitsデータの読み込み、表示について。
fitsのビューアーとしてはDS9などがある。

#PDS
[Planetary Data System](https://pds.nasa.gov/)
NASAの探査データアーカイブ。誰でも無料で使うことができます。ここからデータをダウンロードすれば好きな惑星の画像を見ることができる！fitsファイル形式で画像が公開されています。

例えば、Hayabusaのデータは[こちら](https://pds.nasa.gov/ds-view/pds/viewDataset.jsp?dsid=HAY-A-AMICA-3-HAYAMICA-V1.0)。Hayabusaが撮ったすべての画像データが公開されています。

#astropyのインストール
anacondaでインストールする。

```
conda install astropy
```

#fitsファイルの読み込み
0番目のデータを読み込む。画像はヘッダー+画像配列からなる。

```py
import astropy.io.fits as fits
import matplotlib.pyplot as plt
hdulist=pyfits.open('file.fits')
hdu=hdulist[0]
data=hdu.data #data=fits.getdata('file.fits',0)でもできる。
header=hdu.header
plt.imshow(data)
plt.show()
```

ヘッダーの項目、例えばTI_0を取り出す場合には、

```
print header["TI_0"]
```

X、Y番目のピクセルの指定は

```
data[Y][X]
```

#fitsファイルの新規作成
```py
hdu = fits.PrimaryHDU(im)
hdulist = fits.HDUList([hdu])
hdulist.writeto('new.fits',overwrite=True)
```

fitsはヘッダーと画像配列で１セット（hdu）。``hdu = PrimaryHDU(data, header)``で構成される。多数のエクステンションを使用する場合には、``fits.ImageHDU``で二つ目以降のhduを複数作成し、``HDUList([hdu1,hdu2,hdu3])``とかいった感じで一つのファイルにする。つまり、複数の画像を一つのファイルに保存することが可能である。
overwrite=Trueとすることによって上書きできる。

#キーワードの追加
```
hdu.header['NEWKEYWORD']='something'
```
CakeResqueでWorkerがエラー起こした際のメモ

こいつ([CakeResque](http://cakeresque.kamisama.me/))を使っているときに調べたメモ。

## Workerでエラーが発生したとき
Workerでエラーが発生した際に、ジョブキューの中身はどうなるんだ？消えてしまうん？という調べ物が発生したので、少し調べた。

つまり、Workerでエラーが発生してジョブを完遂できなかった際に、ジョブキューの中身が残っていれば、エラー復旧後にそのままWorkerによろしくやってもらうことができるよね！と、いうことです。

## Workerがジョブキューの中身を取り出す動き
redisのCLIを起動して、monitorコマンドを使って、redis上で実行されるコマンドを観察してみたところ、、、

```
1469018495.522819 [0 127.0.0.1:49197] "LPOP" "resque:queue:cakeresque_001"
```

[LPOP](http://redis.shibu.jp/commandreference/lists.html#command-LPOP)でジョブキューの中身を取り出しているよぅぅぅなので、Workerがジョブキューの中身を取り出した時点で、削除されてしまっている。

例えば以下の様な、エラーを起こしてfalseをリターンしているという程のソースを用意して、CakeResqueをスタートさせておくと、Worker側はエラーで処理が終了しているのに、ジョブ自体は実行されてredisのキューから消えてしまい、エラー復旧後にキューがない、と、いうことになる。

```
<?php
App::uses('AppShell', 'Console/Command');

class TestjobShell extends AppShell {

        public function testAction() {
            return false;
        }
}
```

## とりあえずの解決策
エラー時の処理の中で、もう一度ジョブキューを登録する処理を入れることで、キューが失われなくなる。つまり、LPOPでキューの先頭から取り出した要素を、キューの最後尾に戻してあげる形になる。

多分もっとよい解決策があるんだろうけど、とりあえずはこんな感じでいけそう。

```
<?php
App::uses('AppShell', 'Console/Command');

class TestjobShell extends AppShell {

        public function testAction() {
            try {
                if ($hogehoge === true) {
                    return true;
                } else {
                    throw new Exception('ERROR!!!');
                }
            } catch (Exception $e) {
                // 失敗したジョブはキューとしてまた登録する
                CakeResque::enqueue('cakeresque_001', get_class($this), array(__FUNCTION__,$this->args[0], $this->args[1]));
                return false;
            }
        }
}
```
The Berkshelf Way


Berkshelfのissueで結構重要なことが書いている(気がした)ので、簡単にまとめておく(間違ってる箇所あったら編集リクエスト下さい)。元々The Berkshelf Wayはyoutube動画の方のスライドのタイトルだけど、ここに書いてある内容にも合ってる気がしたので、同じタイトル付けてみた。
[How to use Berkshelf to manage Organization repo like the Librarian-chef does? #535](https://github.com/berkshelf/berkshelf/issues/535)

# Cookbookのあるべき姿

Berkshelfのコアチームはcookbookの以下の様にあるべきだと思っている.

- 各cookbookは個別のGitリポジトリに格納され、全てのcookbookが個々のBerksfileを持つべき
- 各cookbookに対してCIサーバ上にビルドジョブを作成し、そのジョブの中でテストを行った上でChef Serverにアップロードすべき
- 各cookbookを１つのソフトウェアのプロジェクトと考えるべき
- 全てのcookbookをchef repoに突っ込むという考えは捨てるべき
  - 全てのcookbookを１つのリポジトリに入れるという事は単一責務を破壊する行為
  - commit historyが読みづらくなるし、全てのデベロッパーが全てのcookbookにアクセス出来るという前提を置いた考え方になっている(1つのリポジトリに全てのcookbookがあるということは)


https://github.com/berkshelf/berkshelf/issues/535#issuecomment-18246039
https://github.com/berkshelf/berkshelf/issues/535#issuecomment-18123272
https://github.com/berkshelf/berkshelf/issues/535#issuecomment-98868265

# CookbooksのないChef Repo

chef-repoに含めるべきものは以下

- environments
- data bags
- roles (berkshelfのメンバーはroleは使うなと言っているので、もしどうしても使うならくらいのもの)

ここにcookbooksディレクトリは **含まれない**

chef-repoをcookbookをchef-serverにアップロードする場所として使う為にBerksfileを置くのはあり。Berksfileに自分のインフラで使用するcookbookを記載して、berks uploadでchef serverにアップロードしたりberks packageでパッケージするのに使える。但し、chef-repoをcookbookを開発する場所として使うべきではない。

https://github.com/berkshelf/berkshelf/issues/535#issuecomment-18300649
https://github.com/berkshelf/berkshelf/issues/535#issuecomment-29508430
https://github.com/berkshelf/berkshelf/issues/535#issuecomment-29533429

# その他

## chef-repo使わない場合knife.rbはどこに置くの？

~/.chef/knife.rbに置きなされ
https://github.com/berkshelf/berkshelf/issues/535#issuecomment-18415517

## chef-serverを複数使う場合はそれじゃ無理なんだけど？

knife-blockを使ってみなよ
https://github.com/berkshelf/berkshelf/issues/535#issuecomment-18462031

## cookbook毎にリポジトリを作る構造の利点

- berkshelfがそれを想定した作りになっているので、berkshelfを使って作業しやすい
- 多くの人がこの方法をとるので、助けを得やすい
- cookbookとgit tagを一致させられる(それを助けるツールもある)
- 全てのcookbookが同じ構造なので汎用的なビルドジョブを作る事が可能

https://github.com/berkshelf/berkshelf/issues/535#issuecomment-98886945

## お前らのApplication CookbookとLibrary Cookbookは間違っている

### Application Cookbook
Application cookbookはアプリケーションをインストールし設定するcookbookのことを指す。例えばmy-webappというアプリケーションがあるとした時に、そのcookbookがNGINXのcookbookに依存していたとしてもNGINXのcookbookをLibrary Cookbookとは呼ばない。NGINXのcookbookもまたアプリケーションcookbook。

### Library Cookbook
LWRPや定義だけのCookbookのことをLibrary Cookbookと言う。通常Library cookbookはレシピを含まない。

https://github.com/berkshelf/berkshelf/issues/535#issuecomment-18315530


# リンク

[The Berkshelf Way - Youtube](http://www.youtube.com/watch?v=hYt0E84kYUI)
[The Berkshelf Way - Slideshare](http://www.slideshare.net/opscode/the-berkshelf-way-20882903)
[How to use Berkshelf to manage Organization repo like the Librarian-chef does? #535](https://github.com/berkshelf/berkshelf/issues/535)
シェルスクリプト　〜テキスト処理〜

　よく業務でテキストから処理したいことがあることと思います。そこで、今回は、シェルスクリプトでテキスト処理するための便利なコマンドを記載したいと思います。


```shellscript
cat list | while read line;do
（処理内容）
done
```
ClamAVをデーモン化する（CentOS7）

ClamAVをデーモン化する必要がでてきたのでwebで調べてみると「Clamdをインストールしろ」、「ClamdはRepoForgeからゲットできるぞ！」といった記事がたくさん出てくる。ということでさっそくインストールしてみる。

```
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm && yum -y install clamd
```

・・・？
インストールできない？？
repoforgeにアクセスできない？？？
サーバが落ちてるのか？？？？

～～次の日～～

まだ落ちてる・・・

～～さらに次の日～～

アクセスできない！！

ちょっと調べてみると以下のような衝撃な事実が。
***RPMForge/RepoForge - This is a dead project. Not maintained. DO NOT USE.***
https://wiki.centos.org/AdditionalResources/Repositories

まじかよ。どうしよう。

ということでClamAVをデーモン化する方法を調べたので手順を書き残しておきます。

##ここから本題

まずClamAVをインストールします。CentOS7ではClamAVはepel-releaseというリポジトリから入手できるので、こっちもインストールします。

```
yum -y install epel-release && yum -y install clamav
```
デーモン化するにはもう一つインストールします。

```
yum -y install clamav-scanner-systemd
```
インストールすると以下のコンフィグが作成されるのでコイツを編集します。

```
vi /etc/clamd.d/scan.conf
```
とりあえず冒頭のExampleをコメントアウトします（そのほかの設定は適宜）

```
# Comment or remove the line below.
#Example
```
サービスが自動起動するようにしておきます。

```
systemctl enable clamd@scan.service
```
サービスを起動します。

```
systemctl restart clamd@scan.service
```
なお、データべースの更新にはclamav-updateをインストールすればfreshclamが使えるようになります。
freshclamはcronで定期実行してもよいですが、freshclam -dとすればデーモンで起動することができます。
AWSのApacheにオレオレ証明書を設定する


EC2インスタンスに構築したアプリをHTTPSで利用したいので、オレオレ証明書を設定するメモ。

## 前提

- Apacheがインストール済

## mod_ssl,opensslのインストール

Apacheのバージョンとインストールできるパッケージを確認する。

```
$ sudo yum list installed | grep httpd
$ sudo yum list available | grep ssl
```

Apache24の場合は、以下の通り（opensslはインストールされていた）。

```
$ sudo yum install mod24_ssl.x86_64 openssl
```

mod_sslがインストールされていることを確認する。

```
$ ls -l /etc/httpd/modules/ | grep ssl
-rwxr-xr-x 1 root root 215448  7月 19 09:08 mod_ssl.so

$ cat /etc/httpd/conf.modules.d/00-ssl.conf
LoadModule ssl_module modules/mod_ssl.so
```

LoadModuleの設定はインストール時に作成されていた。


## 鍵の作成

下記コマンドで、各種鍵を作成する。

```
$ openssl genrsa -out ca.key 2048
$ openssl req -new -key ca.key -out ca.csr
$ openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt
```

秘密鍵の作成時の入力は以下を参照。
[Apache + OpenSSL CSR生成手順 (新規)](https://www.geotrust.co.jp/support/ssl/csr/apache_openssl_new.html)

作成された。鍵を配備する。

```
$ sudo cp -p ca.crt /etc/pki/tls/certs/
$ sudo cp -p ca.key /etc/pki/tls/private/
$ sudo cp -p ca.csr /etc/pki/tls/private/
```

restoreconを実行(よくわからないが。。とりあえず。。)

```
restorecon -RvF /etc/pki/
```

## sslの設定

sslの設定を行う。

```
$ sudo vi /etc/httpd/conf.d/ssl.conf
```

下記を設定する。

```
Listen 443
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/ca.crt
    SSLCertificateKeyFile /etc/pki/tls/private/ca.key
    <Directory /home/vagrant/www/public>
        AllowOverride All
    </Directory>
    DocumentRoot /var/www/html
    ServerName www.myserver.test
</VirtualHost>
```


## mod_rewriteの設定

一部は常にHTTPSにしたいので、mod_rewriteの設定を追加する。
今回はredmineとjenkinsを常にHTTPSでアクセスする。

```
$ sudo vi /etc/httpd/conf.modules.d/00-rewrite.conf
```

下記を設定する。

```
<IfModule mod_rewrite.c>
  RewriteEngine On

  RewriteCond %{HTTPS} off
  RewriteCond %{HTTP_HOST} www.myserver.test
  RewriteCond %{REQUEST_URI} ^/redmine/.*$ [OR]
  RewriteCond %{REQUEST_URI} ^/jenkins/.*$
  RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

</IfModule>
```

## httpdサービスを起動

設定内容を確認して、サービスを再起動する。

```
$ sudo service httpd configtest
$ sudo service httpd restart
```

ブラウザでhttpsでアクセスして、証明書が安全でないことを確認する(笑)

## 参考

- [Apache2.4でmod_sslの名前が違った件](http://l-light-note.hatenablog.com/entry/2015/07/14/015659)
- [Vagrant環境でオレオレSSL](http://qiita.com/juniskw/items/3948949d2f23b9010506)
- [mod_rewriteでディレクトリ別にSSLのON/OFFを切り替える]()
1端末内に同じアプリを共存させる方法(ios編)

# 概要

開発用、本番用など同じ端末に接続先の違うアプリを入れられると便利です。
1端末に同じ ```Bundle Identifier``` では入れられないので、環境によって ```Bundle Identifier``` を変えることで実現できます。

なおPush通知をするアプリの場合は ```Bundle Identifier``` 毎に証明書が必要になるので注意が必要です。
つまり、開発、ステージング、本番接続用のアプリを共存させたければ、それぞれのサーバー用の```Bundle Identifier```を作り、それぞれに別のPush証明書をサーバーに配置する必要があります。


# やり方

* まずは、Configurationsを追加します。
![add-configuration.png](https://qiita-image-store.s3.amazonaws.com/0/10494/9c26eb52-1c2a-818e-d9c2-6ded9118110e.png "add-configuration.png")


* その後、Objective-cなら ```Preprocessor Macros``` 、Swiftなら ```Other Swift Flags``` を設定します。(Swiftの場合は、 ```-D DEBUG``` のようにする)
 ![add-macro.png](https://qiita-image-store.s3.amazonaws.com/0/10494/b361e567-b9ed-9397-640c-da49307d262b.png "add-macro.png")

* Objective-Cの場合は、 ```Preprocessor Macros``` を見てプログラム上で以下のように分岐します。

 ```
 #ifdef DEBUG
    // ...
 #elif RELEASE
    // ...
 #else
    // ...
 #endif
 ```

* Swiftの場合は ```Other Swift Flags```を見てプログラム上で以下のように分岐します。

```
  #if DEBUG
    // ...
  #elseif RELEASE
    // ...
  #else
    // ...
  #endif
```
   
あとは、```Bundle Identifier``` を変更するだけです。

* プロジェクトのGeneralで指定するのは、debug用を入れておきます。
 例) ```ko2ic.sample.dev```
 ![default-identifierpng.png](https://qiita-image-store.s3.amazonaws.com/0/10494/e60328cf-4b5d-5a46-22ad-2eaa5faf44aa.png "default-identifierpng.png")


* Build Settings → Packaging → Product Bundle Identifier で、それぞれの環境ごとに変えます。
同様に Product Nameをそれぞれの環境ごとに変えます。
Product Module Nameはすべて同じ名前にするといいでしょう。Module名なのでアルファベットで書きます。

 ![change-identifier-filename.png](https://qiita-image-store.s3.amazonaws.com/0/10494/1ad2e9ed-5cbd-df58-29da-aa7775b31ed1.png "change-identifier-filename.png")

* Info.plist のBundle nameを ```$(PRODUCT_NAME)``` にする。

* テストターゲットで ```TEST_HOST``` を検索して、それぞれのProduct Nameに合わせて書き直します。これが違うとテストが動作しません。

* 最後にスキームごとにビルドすれば完成です。

Apnsを使ったりする場合は、Code Signing EntitlementsもConfigurationごとに作ります。そうしないとios10以降ではデバイストークンが受けられません

```開発.entitlements
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>aps-environment</key>
	<string>development</string>
</dict>
</plist>
```

```ステージング.entitlements
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>aps-environment</key>
	<string>ad-hoc</string>
</dict>
</plist>
```

```本番.entitlements
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>aps-environment</key>
	<string>production</string>
</dict>
</plist>
```
rails middleware

https://github.com/steveklabnik/request_store/blob/master/lib/request_store/middleware.rb

http://stackoverflow.com/questions/848591/how-do-i-access-the-rack-environment-from-within-rails

https://www.mobomo.com/2010/4/rack-middleware-and-applications-whats-the-difference/

https://github.com/rails/rails/blob/3-1-stable/actionpack/lib/action_dispatch/middleware/stack.rb

http://railscasts.com/episodes/151-rack-middleware?autoplay=true

```rb
app.middleware.insert(0, Rack::MiniProfiler)
```

```rb
   class FooMiddleware
        def initialize(app)
            puts "init foo"
            @app = app
        end

        def call(env)
            puts "foo"
            result = @app.call(env)
            puts "finish foo"
            return result
        end
    end

    class BarMiddleware
        def initialize(app)
            puts "init bar"
            @app = app
        end

        def call(env)
            puts "bar"
            result = @app.call(env)
            puts "finish bar"
            return result
        end
    end

    class BazMiddleware
        def initialize(app)
            puts "init baz"
            @app = app
        end

        def call(env)
            puts "baz"
            result = @app.call(env)
            puts "finish baz"
            return result
        end
    end

    config.middleware.use FooMiddleware

    config.middleware.use BarMiddleware

    config.middleware.use BazMiddleware
```


```bash
foo
bar
baz
finish baz
finish bar
finish foo
```
Telnet自動化参考サイト


http://qiita.com/gyoon/items/deb7ee62fbe4e9c1a907

http://www.koikikukan.com/archives/2015/02/12-013333.php

https://www.upken.jp/kb/MufpwKGwAWqKZSUeVJqCVxRNMrYUmw.html


```shell-session

#!/bin/sh
 
host="xxx.xxx.xxx.xxx"
user="foo"
pass="bar"
cmd="ls -l"
 
( echo open ${host}
sleep 1
echo ${user}
sleep 1
echo ${pass}
sleep 1
echo ${cmd}
sleep 1 ) | telnet

```
Photonについて大まかに理解するために見たページまとめ

Photonとは
--------------------------------------------

マルチプレイ実装の面倒な部分を吸収して
SDK(またはAPI)として提供してくれるマルチプレイヤープラットフォーム。

> 公式
> http://photonengine.jp/

Photonのすごさが分かる記事

> CEDEC 2014】わずか2ヶ月でリアルタイムバトルを実装可能に！
>『聖剣RoM』で見せたPhoton Serverの実力とは？
> http://app.famitsu.com/20140902_433308/


Photonの種類
--------------------------------------------

### Photon Realtime 

SaaS型(Software as a Service)のサービスで特別管理などをする必要がない。
ただしPhoton上にゲームロジックを組み込むことができない。
同時接続(CCU)20人までなら無料。

### Photon Server

サーバにインストールして使うサーバアプリケーション。
SDKとしてまるごと提供されるのでカスタマイズし放題。
ただしWindows Serverにしか対応していない。
同時接続100人までなら無料。

### Photon Chat

ゲームにチャット機能を簡単に組み込める。
様々なメンバーでのチャット(ギルドチャット、プライベートチャット)を実現可能。

> Photon Cloud、それともPhoton Server?
> https://doc.photonengine.com/ja-jp/realtime/current/getting-started/onpremise-or-saas

> スペック・料金表
> http://photonengine.jp/pricing/


Photonが使えるエンジン・フレームワーク一覧
--------------------------------------------

> 実装可能エンジン・フレームワーク一覧(SDKとAPI)
> https://doc.photonengine.com/ja/realtime/current/sdks-and-api/sdks-overview


５分で試せるチュートリアル
--------------------------------------------

> Photonを5分で開始
> http://doc.photonengine.com/ja-jp/onpremise/current/getting-started/photon-server-in-5min


PUN(Photon Unity Networking)
--------------------------------------------

PhotonのUnity用パッケージのこと。

> Photon Unity Networking イントロ
> https://doc.photonengine.com/ja-jp/pun/current/getting-started/pun-intro


Photonカウンター
--------------------------------------------

便利なパフォーマンスモニタ

> Photonカウンター
> https://doc.photonengine.com/ja-jp/onpremise/current/performance/photon-counters


前提となる知識など
--------------------------------------------

### CCU

同時接続数のこと


### Peer

サーバに接続中のユーザのこと。

### マスターサーバとゲームサーバについて

マスターサーバはロビーのこと。
ゲームサーバはプレイヤーが集まってクエストしたりするルームが作られるサーバのこと。
マスターサーバとゲームサーバに同時に同じプレイヤーが存在する状態は無い。

マスターサーバで認証の後、ゲームサーバに接続する場合は
マスターサーバとの接続を終了してから改めてゲームサーバに接続する。


### ロビーとルームについて

> LobbyとRoomとPlayerの概念
> http://ft-lab.ne.jp/cgi-bin-unity/wiki.cgi?page=unity_photon_cloud_lobby_room_player


### Reliable UDP(RUDP)

> [CEDEC 2010]ネットゲームの裏で何が起こっているのか。
> ネットワークエンジニアから見た，ゲームデザインの大原則
> http://www.4gamer.net/games/105/G010549/20100905002/


その他
--------------------------------------------

> Photon Server API リファレンス
> https://doc-api.photonengine.com/en/server/current/index.html

> Photon .NET Client API 
> https://doc-api.photonengine.com/en/dotnet/current/index.html

> 用語集 (**結構重要**)
> https://doc.photonengine.com/ja-jp/realtime/current/reference/glossary
ECCUBE3  開発者ドキュメントのチュートリアルを実際に動作させてみる②　データベース編　未解決

マイグレーションガイド

DBマイグレーション処理の構成

    migrationにはDoctrine-migrationモジュールを使用し、Silexから呼び出すためのServiceProvider(https://github.com/dbtlr/silex-doctrine-migrations)をラッパーとして使用します。


ラッパークラスという表現が出てきているが
調べたところ「ラッパークラスというものはあくまでも何かを継承し使いやすくカスタマイズされたクラス」と説明されている方がいたがこの認識で良いのだろうか。

「もともとのクラスや関数などが複雑な手続きをする必要がある物を、自分の目的に合わせて、もっと抽象度を上げて、簡単に扱えるようにしたものをラッパークラスと言う」
こんな解説も。

この先、正直かなり分かりにくい。
そもそもsymfony  が使えることが前提になっているのだろうか。

順番通りに説明されていればいいのだが
どうにも意味を解しない言葉が連発して出てくるので
流し読みになってしまう。
チュートリアルなので作業順になっててもらいたい。

ひとまず次の章へ

本チュートリアルのテーブル定義

マイグレーションファイルの準備

    トップページに記述されている「マイグレーションガイド」の「マイグレーション作成手順」の内容に基づき、新しいマイグレーションファイルを作成します。

ここでマイグレーションガイドに戻る
ターミナルからコマンドを入力

ECCUBEディレクトリに移動し
php app/console migrations:generate
を入力

dtb_page_layoutへの画面情報の登録
Version~.php の内容を確認すると
Downというメソッドが2回出てくるので一つ削除


上記が完了したら、「マイグレーションガイド」の「マイグレーション受け入れ手順」の章を参照しその内容を実行してください。


ということで、ここでまた「マイグレーションガイドに移動」



マイグレーションの受け入れ手順

    EC-CUBEのソースコードを更新します。

    作成されたマイグレーションをDBに反映します。

    $ php app/console migrations:migrate



結果

Fatal error: Class 'DoctrineMigrations\Version20160726215107' not found in /opt/lampp/htdocs/eccube/vendor/doctrine/migrations/lib/Doctrine/DBAL/Migrations/Version.php on line 113

？
ん？
そもそもこの段階でmigrateってのができるの？

まだ定義ファイルを作ってないような


ひとまず次の章へ行ってみる

Doctrineのためにデーターベース構造を設定しよう

データーベース構造定義ファイル

    前章で、本チュートリアルのテーブルを作成しました。

ええ？
やっぱりすでに作成済みになってなければいけないよう。
エラーが出てるんだけど。

そもそもテーブルの定義してないのにどうやってテーブルができるんだろう？
データーベース構造定義ファイルがそれに該当するなら
Doctrineのためにデーターベース構造を設定しよう
を終えたあとにmigrateするんじゃないだろうか。

ひとまず今日はここまで。
次回データベース構造定義ファイルを作成してから
もう一度試してみます。

チュートリアルを動作させるにはどうすればよいか
アドバイスがありましたらぜひともコメントください。
Python で [Bad operand type for unary +: 'str'] と出た場合の対処法

## コード
```python:foo.py
id = 001
hoge = "https://app.rakuten.co.jp/services/api/?format=json&itemCode="+sc+
"%3A"+ii+"&shopCode="+sc
print(hoge)
```
## 実行結果
```
Bad operand type for unary +: 'str'
```
## エラー原因
- hoge に改行が入っている。
- hoge が２行になっている。

## 対処法
```python:foo.py
id = 001
hoge = "https://app.rakuten.co.jp/services/api/?format=json&itemCode="+sc+"%3A"+ii+"&shopCode="+sc
print(hoge)
```
初めての Git は構造から



CVS や Subversion を単語としては知ってました。
VBA 書いてると、ファイルサイズの大きい Access でちょっとしたテストをするにもファイルコピーするのは結構負担でした。
修正箇所もクエリとVBAとマスタデータとか分散していると拾い漏れしたり。
バージョン管理、憧れてました。
　　
  
さて。では始めますね。
Rails Tutorial では、コマンドと結果、簡単なキーワードの紹介をしています。
でも、これだけでは初心者には何がなんだか…
チュートリアルでも「バージョン管理はそれだけで大きなテーマなので、すべてを説明しようとすると軽く一冊の本を超えてしまいます」と書かれていますし、奥が深いのはわかるのですが、もう少し…
後は使いながら調べよう！と思える基礎を欲しいなぁと思い、調べてみました。
　　
  
・[サルでもわかるGit入門～バージョン管理を使いこなそう～](http://www.backlog.jp/git-guide/)
・[git入門(全22回) @ドットインストール](http://dotinstall.com/lessons/basic_git)
で、Gitの基本的なイメージがつかめました。
　　
 ・[いつやるの？Git入門 v1.1.0](https://www.slideshare.net/matsukaz/git-28304397)
 のスライドがすごいです。
 なんとなくわかったつもりになっていたところが、この図を頭の中に置いとけばなんとなかなる、と思わせてくれました。
 スライドをめくっていく方がわかりやすいと思いますが、私の頭の中には1枚しか記憶できそうにないので、ごちゃっと詰め込んでみたいと思います。
　　
　　
## init から push まで
![git01.jpg](https://qiita-image-store.s3.amazonaws.com/0/75308/37336a4d-cb96-7fd3-abcb-9893e0d2cde4.jpeg "git01.jpg")
平面で見れる構造は init から push するまで…ですね。
コマンドのちゃんとした書き方は後でまとめるとして。
Git の特徴のブランチとかは時間軸いりますね。
  
![git02.jpg](https://qiita-image-store.s3.amazonaws.com/0/75308/b79621ca-effc-58c4-ed14-5e7dca8588bf.jpeg "git02.jpg")
ブランチのイメージはこんな感じでしょうか。
ブランチから反映させる方法は２つ、merge と rebase があるみたいです。
merge は、ブランチからマスターに反映させて、マスターに新しくコミットされる。(マスターを更新)
rebase は、ブランチした時点から現在のトピックブランチの差分を現在のマスターに反映させたものを新しいブランチ元とする。(トピックブランチを更新)
合ってるかな？

merge と rebase の使い分け方は、[こわくない Git](http://www.slideshare.net/kotas/git-15276118) がわかりやすかったです。
  
    
  このイメージを横に置いて、Rails Tutorial 『1.4 Gitによるバージョン管理』をもう一回読み直すと、ようやくわかったような気がします。
コマンドは、何をしたいかに合わせて都度調べることにします。
ひとまず チュートリアルを進めます。
jQueryを利用せずにAjaxを利用するサンプル

風の噂によれば、世の中には「DOM操作を多用するが、jQueryは禁止」という開発現場があるそうです(血涙)

まずはjsonをPOSTする例。

```js
// jsonの準備
var json = {};
json.name = "nekoTheShadow";
json.job = "SystemsEngneer";

// XMLHttpRequestオブジェクトの生成
var xhr = new XMLHttpRequest();

// methodとurlを指定
xhr.open("POST", "/post/json");

// イベントリスナを設定
xhr.addEventListener("progress", function(){}); // 通信中
xhr.addEventListener("load", function(){}); // 通信成功
xhr.addEventListener("error", function(){}); // 通信失敗
xhr.addEventListener("abort", function(){}); // 通信をキャンセル

// Content-Typeを設定
xhr.setRequestHeader("Content-Type", "application/json");

// 送信
xhr.send(JSON.stringify(json));
```

次は普通(?)にPOSTする例:

```js

// 送信するデータの準備
var data = "name=nekoTheShadow&job=SystemsEngneer";

// XMLHttpRequestオブジェクトの生成
var xhr = new XMLHttpRequest();

// methodとurlを指定
xhr.open("POST", "/post/json");

// イベントリスナを設定
xhr.addEventListener("progress", function(){}); // 通信中
xhr.addEventListener("load", function(){}); // 通信成功
xhr.addEventListener("error", function(){}); // 通信失敗
xhr.addEventListener("abort", function(){}); // 通信をキャンセル

// Content-Typeを設定
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

// 送信
xhr.send(data);
```

ご査収ください(´・ω・`)
エントロピーによる Stop Words 抽出とサイトコンテンツの品質指標

**Stop Words** とは多くの文書に含まれていてそれ自体が文書の特徴を表しづらい単語を表します。例えば英文における the や in, after といったような単語は典型的な Stop Words です。

このような単語は検索時にノイズの原因となるためあらかじめ検索対象から除外する必要があります。この記事は**[選択情報量](https://ja.wikipedia.org/wiki/%E6%83%85%E5%A0%B1%E9%87%8F)** (自己エントロピー) を使って検索時に除外すべき Stop Words を判断するための指標を求めます。

なおここで扱っている数式は [TF-IDF](https://ja.wikipedia.org/wiki/Tf-idf) でいうところの DF (Document Frequency) と本質的に同じです。情報量/エントロピーが「文書集合全体」に対する単語の特徴を示すのに対して、TF-IDF は「ある文書」に対する単語の特徴を示す (目的は文書要約や代表語の抽出) という点で異なります。

## 情報量とエントロピーの求め方

### 選択情報量

総文書数 $N$ の文書集合において単語 $W$ を含む文書数を $n_w$ とした場合、$W$ が文書に含まれる確率 $P_{(W)}$ は以下のように表される。

$P_{(W)} = \frac{n_w}{N}$

このとき、単語 $W$ に対する選択情報量 $I_{(W)}$ は以下のように表される。

$I_{(W)} = \log \frac{1}{P_{(W)}} = \log N - \log n_w$

どの文書にも含まれない単語 ($n_w=0$, すなはち $P_{(0)}=0$) の情報量は $I = \infty$ と発散するため対象外とします。$I_{(W)}$ について対数の底をどう取っても本質的な差はないことから、底を総文書数 $N$ とすると:

$I_{(W)} = \log_N N - \log_N n_w = 1 - \log_N n_w = 1 - \frac{\log n_w}{\log N}$

条件 $1 \le n_w \le N$ より $0 \le I_{(W)} \le 1$ の範囲となり実用的な指標として使いやすくなりますの本記事ではこの式を使用します。

以上より、例えば全ての文書に含まれる特徴の無い単語は $n_w = N$ より $I_{(W)}=0$ となるため、$I_{(W)}$ が $0$ に近い単語 $W$ は特徴の無い Stop Words と判断できます。

同様に、一つの文書にしか含まれない単語は $n_w = 1$ であることから $I_{(W)}=1$ に近い近い単語は文書集合全体で特徴的な単語と判断できます。ただしきわめて少数の文書にしか出現しない単語は実際には死語や造語の可能性が高いため排除対象として考慮する必要があります。

### 平均情報量

文書集合全体の **平均情報量** (エントロピー) は以下のように表されます。

$H_{(P)} = - \sum P \log P = - \sum \frac{n_w}{N} ( \log n_w - \log N)$

固定値とした $P$ に対して $H_{(P)}$ は以下のようなふるまいをとります (単調増加/単調減少ではないため自己情報量のように対数の底を $N$ とするのは止めておきましょう)。

![information-content.png](https://qiita-image-store.s3.amazonaws.com/0/2287/c4641f71-648d-381d-f67f-d4c08dde2d87.png)

エントロピーが低い文書集合は単語の分布に偏りや均一さなどの規則性が高いと言えます。もう少しかみ砕くと、文書ごとに特色やテーマがはっきりしていてカテゴリライズがうまく機能しているか、あるいは似たような内容の文書ばかりと解釈できます。これは文書集合全体の品質指標として使えるでしょう。
AWSのElasticSearchのkibanaにnginxでBasic認証をかける


# はじめに
AWSのElasticSearchは便利ですね。サーバを管理せずにkibanaまで使えちゃうとか、個人ユースなら無償利用枠で完璧ですね！
でも、基本的にIPアドレスベースの制御しかやりようがないので、どうしたものかなーと思っていたので、nginxでリバプロを立ててそこでBasic認証をかけられないかを検討するに至りました。
その記録です。

# やりたいこと/やったこと
一番はIAMとかでkibanaのGUI画面ログイン前にAWSのログイン画面が出てくれば完璧なんですが、それはできそうにないので、仕方なくリバプロを立ててそこでBasic認証をかけることを考えました。
まずは、こんなコンフィグを書きました。

/etc/nginx/conf.d/reverse.conf

```nginx
server {
    server_name XXXXXX.ap-northeast-1.compute.amazonaws.com;
    location / {
        proxy_pass http://XXXXXXX.ap-northeast-1.es.amazonaws.com/;
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}
```

それでアクセスするとこんな感じのエラーが出ます。

```json
{"message":"Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter. Authorization header requires 'SignedHeaders' parameter. Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header. Authorization=Basic XXXXXXXX"}
```

Basic認証のリクエストヘッダがそのままelastic search側に飛んで、IAMでの認証をしようとしてコケてるんですかね。

そのため、Authorizationヘッダを削除してやる必要があります。

/etc/nginx/conf.d/reverse.conf

```nginx
server {
    server_name XXXXXX.ap-northeast-1.compute.amazonaws.com;
    location / {
        proxy_pass http://XXXXXXX.ap-northeast-1.es.amazonaws.com/;
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_set_header Authorization  "";
    }
}
```

最後の1行ですね。
これを追加してやるとAuthorizationヘッダが消えて正しく動作します。

# おまけ

ElasticSearch　Serviceで提供されるkibanaのパスは正確には

http://XXXXXX.ap-northeast-1.compute.amazonaws.com/_plugin/kibana/

なんですが、僕は横着なので、下記のようにできないか試しましたが、出来ないのでご注意ください。

```nginx
server {
    server_name XXXXXX.ap-northeast-1.compute.amazonaws.com;
    location / {
        proxy_pass http://XXXXXXX.ap-northeast-1.es.amazonaws.com/_plugin/kibana/;
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_set_header Authorization  "";
    }
}
```
[小ネタ]Bundleに入れる時はキーにEnumを使う

小ネタです

Androidアプリを開発しているとBundleへ値を格納する機会が頻繁にありますが
その際にキーの管理でのヒューマンエラーを減らそうという作戦です。

```java:java
private static final String KEY_TITLE = "title";

private void hogehoge(String title){
    Bundle bundle = new Bundle();
    bundle.putString(KEY_TITLE, title);

    ...
}
```

上記のようにキーを定数で管理する人が多いと思いますが、キーを行のコピペで増やした時に中身を変え忘れて

```java:java
private static final String KEY_TITLE = "title";
private static final String KEY_CONTENT = "title";
```
みたいなことになってほああああ！！！となるヒューマンエラーに襲われたので

```java:java
private enum Key {
    TITLE,
    CONTENT,
}

private void hogehoge(String title, String content){
    Bundle bundle = new Bundle();
    bundle.putString(Key.TITLE.name(), title);
    bundle.putString(Key.CONTENT.name(), content);

    ...
}
```
のようにEnumを用いたほうが管理が楽でミスも減らすことが出来そうという小ネタでしたまる
Pythonによる探査画像データ解析環境の構築

#はじめに
探査データ主にfitsとspiceを使った解析を行うための最低限の環境設定について。
Miniconda+Jupyterによる環境とライブラリの説明。メモ程度です。
通算３０分くらいで立ち上げられます。すごい世の中です。

MacOS10.10

#Miniconda
##Minicondaダウンロードとインストール
http://conda.pydata.org/miniconda.html
ここからPython2.7verをダウンロードしてくる。
ダウンロードしてきたフォルダまで移動して、

```
bash Miniconda2-latest-MacOSX-x86_64.sh
```

##仮想環境の構築
astroという名の仮想環境を作る。（名前は好きに変えてください。）

```
conda create astro python=2.7 anaconda
```

##アクティベート

```
source activate astro
```

#Jupyterのインストール

```
conda install jupyter
```

#Pythonライブラリのインストール
##Matplotlib(プロットツール)

```
conda install matplotlib
```

##Pyfits（fits file周り）

```
pip install pyfits
```

簡単な使い方は以下に…
http://qiita.com/eritatsumi/items/c90d9738cfe1c1c83f3e

##Spiceypy（SPICE周り）
NAIFのSPICE TOOLKITをPythonで使えるようにしてくれました。感涙。

```
pip install spiceypy
```

簡単な使い方は以下に…
http://qiita.com/eritatsumi/items/5c638d43afa9c2c5b380

#画像データ収集
PDS
https://pds.nasa.gov/

OPUS
http://tools.pds-rings.seti.org/opus