OmniAICreator/Qiita-1.07M huggingface dataset:
node.jsでテストのカバレッジを取る

サンプル
https://github.com/iwata-n/nodejs_coverage

node.js+expressで作ってるプロジェクトのテストでカバレッジを取りたかったので調べてみた結果をまとめておく。

# gulp
ビルドツールとしてgulpを使う。gruntも有るっぽいけどもgulpを使う。

# カバレッジ取得ツール
istanbulを使う。istanbulをgulpのプラグインとして用意してくれている人がいるので感謝

https://github.com/SBoudrias/gulp-istanbul

# 設定
gulp-istanbulのREADMEに従ってgulpfile.jsを用意する。
express-generatorが出してきたままなコードになっている。

``` js
var gulp = require('gulp');
var istanbul = require('gulp-istanbul');
var mocha = require('gulp-mocha');

gulp.task('pre-test', function () {
  return gulp.src(['routes/*.js'])
    // Covering files
    .pipe(istanbul())
    // Force `require` to return covered files
    .pipe(istanbul.hookRequire());
});

gulp.task('test', ['pre-test'], function () {
  return gulp.src(['test/*.js'])
    .pipe(mocha())
    // Creating the reports after tests ran
    .pipe(istanbul.writeReports())
    // Enforce a coverage of at least 90%
    .pipe(istanbul.enforceThresholds({ thresholds: { global: 90 } }));
});
```

# 実行
``` gulp test``` で実行される。
こんな感じでカバレッジの結果が表示される。

```
$ gulp test
[16:53:47] Using gulpfile ~/hoge/gulpfile.js
[16:53:47] Starting 'pre-test'...
[16:53:47] Finished 'pre-test' after 50 ms
[16:53:47] Starting 'test'...


  GET /users
GET /users 200 7.133 ms - 8
    ✓ no param (40ms)


  1 passing (45ms)

-----------|----------|----------|----------|----------|----------------|
File       |  % Stmts | % Branch |  % Funcs |  % Lines |Uncovered Lines |
-----------|----------|----------|----------|----------|----------------|
 routes/   |    76.92 |       50 |       50 |    76.92 |                |
  index.js |       80 |      100 |        0 |       80 |              6 |
  users.js |       75 |       50 |      100 |       75 |            7,8 |
-----------|----------|----------|----------|----------|----------------|
All files  |    76.92 |       50 |       50 |    76.92 |                |
-----------|----------|----------|----------|----------|----------------|


=============================== Coverage summary ===============================
Statements   : 76.92% ( 10/13 )
Branches     : 50% ( 1/2 )
Functions    : 50% ( 1/2 )
Lines        : 76.92% ( 10/13 )
================================================================================
[16:53:47] 'test' errored after 336 ms
[16:53:47] Error in plugin 'gulp-istanbul'
```
LINUXでの複数ファイルの一括リネーム : renameコマンド

# LINUXでの複数ファイルの一括リネーム : renameコマンド

mvだとforなどと、組み合わせないとできないが、renameなら一括でできる。

LINUXでの複数ファイルの一括リネーム : renameコマンド

```shell-session: 
rename 置換対象文字列 置換文字列 置換対象ファイル
```

以下、使用例。

```shell-session: 
# ls 
mbf.txt  sever.txt
```

```shell-session: 
rename txt dat *.txt
```

```shell-session: 
# ls
mbf.dat sever.dat
```

[rename](http://kazmax.zpp.jp/linux/linux_rename.html)
メモ: Mozilla Firefox の拡張機能やプラグインを削除する(Windows)

無効化は出来るが削除できないという話。

いつの間にか導入されてしまうより、管理した上で無効にした方がましという判断？

手動で削除する方法についてはここが参考になった。
http://www.howtogeek.com/140448/how-to-manually-uninstall-a-globally-installed-firefox-extension/
例として Logitech SetPoint の拡張機能を削除する方法を示している。

拡張機能 については以下のレジストリに記録されている。
32bit版
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mozilla\Firefox\Extensions
64bit版
HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Firefox\Extensions

{GUID} を {GUID}_ に書き換えるなどして認識されないようにすることで削除できる。(単に削除してもよい。)

プラグインについては以下のレジストリに記録されている。
32bit版
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MozillaPlugins
HKEY_CURRENT_USER\SOFTWARE\MozillaPlugins
64bit版
HKEY_LOCAL_MACHINE\SOFTWARE\MozillaPlugins
HKEY_CURRENT_USER\SOFTWARE\MozillaPlugins

不要なプラグインの項目を削除するなどする。

レジストリの変更を反映するには Firefox の再起動が必要。

Mozilla Firefox 43.0.4 で確認。

ドキュメントでは削除できる事になっているが、[削除]ボタンなんて無い。
https://support.mozilla.org/en-US/kb/disable-or-remove-add-ons#w_how-to-remove-extensions-and-themes
https://support.mozilla.org/ja/kb/disable-or-remove-add-ons#w_oakieaclaecickczacooocaoaoaeag
Facebookページプラグイン Page PluginをWordPressのウィジェットに入れました。

WordPressにFacebookページのいいね数を出すPluginをウィジェットから追加しました。

# Facebook Page Pluginのコードを取得
以下から取得できます。
https://developers.facebook.com/docs/plugins/page-plugin
**Get Code**というボタンからコードが取得できます。

1と2にコードが分かれていてちょっと気になりますが、WordPressの場合はウィジェットに両方コピペで大丈夫です。

# WordPressのウィジェットにコードを追加
WordPressの管理画面にいき、`外観`から`ウィジェット`を選択します。
<img width="166" alt="スクリーンショット 2016-01-17 16.10.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/b26949c0-4760-4b79-748b-a9aa7f749760.png">
ウィジェットから`テキスト`を選択し、Facebook Page Pluginのコードを１と２の両方ペーストします。
<img width="428" alt="facebookページプラグインをウィジェットへペースト" src="https://qiita-image-store.s3.amazonaws.com/0/1624/68e8dd8a-8066-8691-d7ae-f2f06eb44bf4.png">

# 確認
ちゃんとウィジェットが表示されました(๑•̀ㅂ•́)و✧
Mac terminalで辞書を開くコマンドを作ってみた

Macのターミナルからコマンドラインで辞書を開くコマンドをシェルスクリプトで作ってみました。

# 環境
* OSX El Capitan Version 10.11.2

# シェルスクリプトの内容
こんな感じにしてみました。

```bash:dictionary

#!/bin/bash

ERROR () {
	echo "usage: dictionary <word>"
	exit 1
}

[ $# -eq 0 ] && ERROR
[ $# -ge 2 ] && ERROR

open dict://$1
```

実行権限を与えます。

```
$ chmod +x dictionary
```

パスが通っているディレクトリにファイルが有るという前提です。

引数は調べたい文字列のみ指定可能としています。実に簡単な作りになっています。

manするとdictには多彩な機能があることが分かります。しかし僕にはこのコマンドの簡単な使い方しか分かりません。

# 使ってみる

```
$ dictionary overflow
```

![dict.png](https://qiita-image-store.s3.amazonaws.com/0/108851/727b89ce-c1e1-c354-5f09-beb02a0b081b.png)

無事辞書を開けました。

# 反省点
実のところコマンドラインで`$ open dict://<word>`とすれば辞書を開くことができます。今回コマンド作ったところで激的に作業が早くなった訳ではありませんでした。取り敢えず、コマンドの作成例の備忘録として残しておこうと思います。
「量子アニーリング法を用いたクラスタ分析」メモ

http://www.shutanaka.com/papers_files/ShuTanaka_DEXSMI_10.pdf


古典系に対するsimulated annealing
H_cは対角化されているハミルトニアン

```math
\mathcal{H_c} : \text{Hamitonian}
```

分配関数

```math
Z = \text{Tr} e^{- \beta \mathcal{H_c}}
 = \sum_{\{\sigma_i\}} e^{-\beta E(\sigma_{i})}
```
ここで、

```math
\sigma_i = \pm 1
```


# simulated annealing

```math
P(A|B) = \frac{P(A \cap B)}{P(B)}
```

なので

```math
P(\tilde \sigma_{i}|\{\sigma\} \smallsetminus \tilde \sigma_i)=\frac{e^{-\beta E(\{ \sigma \})}}{\sum_{\tilde \sigma_i = \pm 1} e^{-\beta E(\{\sigma\}) }}
```

1 spinづつ、フリップさせて平衡状態を保ちつつ、温度をさげていく。
beta無限大で基底状態、ハミルトニアンの意味で最適解が得られる。。。はず。。。


# quntum annealing

ハミルトニアン

```math
\mathcal{H} = \mathcal{H_c} + \mathcal{H_q}
```

H_cは対角化されている。 H_cとH_qは非可換。
まあ、横磁場付きIsing model, transverse Ising model.


```math
\mathcal{H} = \mathcal{H_c} + \mathcal{H_q} = \sum_{<ij>} J_{ij} \sigma^z_i\sigma^z_j + \Gamma \sum_i  \sigma^x_i 
```

```math
\sigma^z_i = 
\left (
\begin{matrix}
1 & 0 \\
0 & -1 \\
\end{matrix}
\right ),
\sigma^x_i = 
\left (
\begin{matrix}
0 & 1 \\
1 & 0 \\
\end{matrix}
\right )
```

後で式のフォローするが、結論的には

- 横磁場Ising modelの量子スピン系で、鈴木-トロッター変換で、次元＋１の古典Ising modelに変換される。
- 古典Ising modelにして普通のGibbs sampling,モンテカルロを使う
- m 並列 SAとの違いは、相関が2方向である。
 - 交換モンテカルロ的な
Dockerfileをローカル環境に適用するシェルスクリプト


Docker便利ですが，Dockerじゃない環境使うことも未だに極々稀にはあると思います．手っ取り早くサービスを動かす必要があるのに，環境がdockerじゃない，でもDockerfileは既に書いてあるという場合に少しだけ便利なシェルスクリプトです．

Dockerfile書いた後に，やっぱりVPS等に環境を作りたくなった場合などにも使ってます．

# dock2local.sh

```bash
#!/bin/sh
# Apply a Dockerfile to local environment.
# usage: sudo ./dock2local.sh [PATH_TO_Dockerfile]

DOCKERFILE=${1:-Dockerfile}
DOCKERFILE=`dirname $DOCKERFILE`/`basename $DOCKERFILE`
LOCALDIR=$(cd `dirname $DOCKERFILE` && pwd)

D_WORKDIR=`pwd`
D_USER=`whoami`
D_CMD=""

FROM() {
  echo "# FROM: $@"
  uname -a
}
MAINTAINER() {
  echo "# MAINTAINER: $@"
}
RUN() {
  # TODO: sudo - $D_USER
  cd $D_WORKDIR; $@ || exit
}
ADD() {
  cd $D_WORKDIR; mkdir -p `dirname $2`
 cd $D_WORKDIR; cp $LOCALDIR/$1 $2 || exit
}
COPY() {
  cd $D_WORKDIR; mkdir -p `dirname $2`
  cd $D_WORKDIR; cp $1 $2 || exit
}
CMD() {
  D_CMD=$@
}
WORKDIR() {
  mkdir -p $1 || exit
  D_WORKDIR=$1
}
USER() {
  D_USER=$1
}
ENV() {
  # Key=Value only...
  echo export $@ >> /etc/profile
}
VOLUME() {
  # single volume only...
  mkdir -p $1
}
EXPOSE() {
  echo "EXPOSE: not supported."
}

echo "$DOCKERFILE start..."
source $DOCKERFILE
#if [ $D_CMD ] ; then
#  crontab -l | { cat; echo "@reboot $D_CMD"; } | crontab -
#  $D_CMD
#fi
echo "finished."
```

# 使い方

```bash
./dock2local.sh Dockerfile
```

# 説明

- 必要なコマンドをシェル関数として定義した上で Dockerfle 自体を実行します
- よく使うコマンドしか実装してないので，Dockerfileに合わせて良しなに書き換えてください
- 途中で止まったら諦めて人間の手で温かみのある構築を
- csh系のシェルではおそらく修正しないと動きません

# License

Public Domain 扱いでOKです
c:\windows\system32\telnet.exeがそこにあるのに使えないのはWOW64のせい

# 現象

* Windows 7 x64
* コマンドプロンプトからtelnetが使えない
* コントロールパネルからWindowsの機能を有効にしても使えない
* でも稀に使えることがある
* エクスプローラで見ても`telnet.exe`はそこにある

数年前からこの微妙な問題に悩んでおり、git付属のmsysとかcygwinなど他の物を使ってお茶を濁していました。

# 原因

SuperUserに原因を書いている人がいました。[64bit版のwindowsで32bit版のcmdを使っているせい][so]なのだそうです。
[so]: https://superuser.com/questions/605335/telnet-wont-run-from-cmd-prompt-in-windows-7

64bit版のWindowsには[WOW64][wp]という仕組みがあります。32bitのDLLを64bitアプリから読み込めないことの対策として、32ビットアプリが`c:\windows\system32`以下のファイルにアクセスすると`c:\windows\SysWoW64`にリダイレクトするのだそうです。こちらには32bit版のDLLが用意されています。
[wp]:https://ja.wikipedia.org/wiki/WOW64

問題は、Telnetクライアントを有効にしても32bit版のtelnet.exeはインストールされない、ということです。

「64bit版でなく32bit版のコマンドプロンプトを使いたい」とわざわざ意識して起動する人はいないと思います。いつの間にか32bit版を使っている、という現象もWoW64のせいです。使っているランチャーが32bitだったりする場合、そのランチャーからは`c:\windows\system32\cmd.exe`を起動しようとすると`c:\windows\SysWoW64\cmd.exe`がすりかわって起動するのです。

# 対処法

32bit版のコマンドプロンプトから64bit版のtelnet.exeを起動できないというわけではありません。単にパスが通っていないだけなので、解決方法はこうなります。

* `c:\windows\system32\telnet.exe`をパスの通ったところに手でコピーする

もしくは


* `c:\windows\sysnative\telnet.exe`を直接起動する


そもそもMicrosoft Telnetがここまで手間を掛けて使うほどの物かというと微妙ですが、もやもやが晴れたのでメモしました。

# 参考リンク

* [Telnet won't run from cmd prompt in windows 7 - SuperUser][so]
* [WOW64 - Wikipedia][wp]
WordPressで子テーマを作りました。

WordPressには子テーマというのがあるそうです。恥ずかしながら知りませんでした(☝ ՞ਊ ՞)
テーマ作る人ってだいたいフリーのテーマをそのままカスタマイズして納品しますからね(☝ ՞ਊ ՞)

# 子テーマのディレクトリを作成する
WordPressのテーマが置いてあるディレクトリへ移動します。

```bash:テーマディレクトリへ移動
cd wp-content/themes/
```
上記は環境に合わせてください。

親テーマが `pugiemonn`という名前だとすると

```bash:
ll
drwxr-xr-x 4 apache apache 4096 11月 10 12:05 2015 pugiemonn
```
名前は何でも構いませんが、テーマ`pugiemonn`の子テーマなので`pugiemonn_child`という名前にします。

```bash:pugiemonn_childディレクトリを作成
mkdir pugiemonn_child
```
`pugiemonn_child`は子テーマを入れるためのディレクトリです。

# style.cssを作成する

```bash:pugiemonn_childディレクトリへ移動
cd pugiemonn_child
```
親テーマのstyle.cssをコピーします。

```bash:pugiemonn_childディレクトリへ移動
cp ../pugiemonn/style.css ./
```
子テーマの一番上に設定を書きます。

```bash:style.cssに設定を書く
/*
Template: pugiemonn
Theme Name: pugiemonn_child
Description: pugiemonn の子テーマです 
Author: @pugiemonn
Version: 1.0
*/
```
**`Template`**というのは親テーマの名前、**`Theme Name`**は子テーマの名前でそれぞれ**必須**のようです。
あと、親テーマの設定は消しておきました。

# 子テーマを有効化する
WordPressはテーマを選択するときに、有効化するという概念があります。
<img width="165" alt="スクリーンショット 2016-01-17 15.27.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/51e28b36-dbc9-02e0-3aa5-f3f6f33dbe57.png">
WordPressの管理画面から **`外観`**を選択して、該当の子テーマを有効化すると子テーマが使えるようになります。

# 子テーマに存在するファイルは、親テーマのファイルを上書きする
当記事では、子テーマのstyle.cssを親テーマのpugiemonnからコピーして作成しました。これは子テーマのファイルが親テーマのファイルを上書きするからです。

なので、

例えば`footer.php`を上書きしたいなら、親テーマから`footer.php`を持ってきて子テーマでカスタマイズするのが良いと思います。

# 参考
http://viral-community.com/wordpress/wp-child-theme-5818/
Apache HTTP Server のサポート期限

## 概要
**Apache HTTP Server** (以下Apache) はオープンソースのためサポート期限という概念はないが、開発コミュニティが最終リリースを宣言してサポートしていないバージョンがある。
Apache 2.2 以前については現在セキュリティメンテナンスリリースが行われていないので、Apache 2.4 以降を使用するのが望ましい。

* **Apache 2.2** は2017年7月11日に 2.2.34 をリリースし、2017年12月31日をもって2.2系の開発終了を宣言している。[^eol-apache2.2]

* **Apache 2.0** は2013年7月10日に 2.0.65 をリリースし、これをもって2.0系の開発終了を宣言している。[^apache20]
* **Apache 1.3** は2010年2月3日に 1.3.42 をリリースし、最後のセキュリティメンテナンスリリースとなっている。[^apache13]

[^apache20]: https://www.jpcert.or.jp/tips/2013/wr132901.html
[^apache13]: https://www.jpcert.or.jp/tips/2010/wr100501.html

## Apache のサポート期限
| バージョン | 最新   | 初回リリース    | 最新リリース   | EOL         |
|---------|--------|-------------|-------------|-------------|
| 2.4     | 2.4.58 | 2012/02/21  | 2023/10/19  |             |
| ~~2.2~~ | 2.2.34 | 2005/12/01  | 2017/07/11  | 2017/12/31 [^eol-apache2.2] |
| ~~2.0~~ | 2.0.65 | 2002/04/06  | 2013/07/10  |             |
| ~~1.3~~ | 1.3.42 | 1998/06/06  | 2010/02/03  |             |

[^eol-apache2.2]: <q cite="https://httpd.apache.org/security/vulnerabilities_22.html">Apache httpd 2.2 is End-of-Life since December 2017 and should not be used. </q> <cite>[Apache HTTP Server 2.2 vulnerabilities - The Apache HTTP Server Project](https://httpd.apache.org/security/vulnerabilities_22.html) - <i>httpd.apache.org</i></cite>

http://qiita.com/bezeklik/items/72d1ff8393f66673e2bc

http://qiita.com/bezeklik/items/1c4145652661cf5b2271

## Apache 関連記事
* [Apacheセキュリティ設定](http://qiita.com/bezeklik/items/1c4145652661cf5b2271)
* [Apache HTTP Server のサポート期限](http://qiita.com/bezeklik/items/7e2c02c3eabd2a416231)
* [Apache のログをコマンドラインで集計する](http://qiita.com/bezeklik/items/f5c292c4360cde140bef)
* [Apache の情報をコマンドラインで取得する](http://qiita.com/bezeklik/items/7bbfcbcfeb05c1d57fec)
* [IPアドレスから国や都市を判別する (GeoIP)](http://qiita.com/bezeklik/items/927e1c52c8c0aefb1f06)
* [Apache チューニング スクリプト](http://qiita.com/bezeklik/items/85f4001a2517be5fe4c0)
c++ builder > UpCase()の反対はない?

```txt:動作確認
C++ Builder XE4
```

http://qiita.com/7of9/items/cee6d3a518ec20d167c7
で調べたUpCase()という関数の対になる関数を調べていたら

http://www.delphigroups.info/2/6e/5070.html
> but I can't find a command that'll convert 
the character to lower case.

なさそうだ。

UnicodeString文字列すべてを変換するのはSystem.SysUtils.LowerCase()などを使えばよさそうだが、個々のchar型をLowerCaseに変換する関数はないのか。
Apache+WEBrickでとりあえずRailsアプリを動かすための設定

## はじめに
ローカル環境では、`rails s`でWEBrickサーバを立ち上げて`localhost:3000`にアクセスすれば良いのですが、VPSなどネットワーク先で開発している場合にはちょっと一手間かかります。

そこで、（おそらく最初から動いているであろう）ApacheとRails標準のアプリケーションサーバのWEBrickで、とりあえずRailsアプリが動くようにするための設定をまとめます。

## 環境情報

```OS
% inxi -SM
System:    Host: hakone.vps.sakura.ne.jp Kernel: 2.6.32-573.8.1.el6.x86_64 x86_64 (64 bit)
           Console: tty 5 Distro: CentOS release 6.7 (Final)
Machine:   System: Red Hat product: KVM v: RHEL 6.4.0 PC
           Mobo: N/A model: N/A Bios: Sea v: 0.5.1 date: 01/01/2007
```

```Rails
% rake about
About your application's environment
Rails version      4.2.5
Ruby version       2.2.1-p85 (x86_64-linux)
RubyGems version   2.5.1
Rack version       1.6.4
```

```WEBrick
% rails s --binding=127.0.0.1 --daemon
=> Booting WEBrick
=> Rails 4.2.5 application starting in development on http://127.0.0.1:3000
=> Run `rails server -h` for more startup options
```

```Apache
% yum info httpd
インストール済みパッケージ
名前                : httpd
アーキテクチャ      : x86_64
バージョン          : 2.2.15
リリース            : 47.el6.centos.1
容量                : 2.9 M
リポジトリー        : installed
提供元リポジトリー  : updates
要約                : Apache HTTP Server
URL                 : http://httpd.apache.org/
ライセンス          : ASL 2.0
説明                : The Apache HTTP Server is a powerful, efficient, and extensible
                    : web server.
```

なお、Railsアプリを開発しているサーバのIPアドレスへDNSでドメインが設定されている、またはHostsなどで疑似的にドメインが設定できることを前提にしています。

## Apache+WEBrickでRailsアプリを動かす設定

Apacheの`VirtualHost`と`Proxy`設定、WEBrickの起動オプションを設定することでアプリにアクセスできるようにします。

## Apacheのバーチャルホストとプロキシ設定
`YOUR_APP_DOMAIN`をあなたのアプリのドメイン名で置換し、Apacheの設定ファイルを作成します。

```/etc/httpd/conf.d/railsapp.conf
NameVirtualHost *:80

##
# YOUR_APP_DOMAIN
#
<VirtualHost *:80>
    ServerName YOUR_APP_DOMAIN

    CustomLog logs/YOUR_APP_DOMAIN-access_log combined env=!no_log

    SetEnv RACK_ENV development

    ProxyRequests Off
    <Proxy *>
          Order deny,allow
          Allow from all
    </Proxy>
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
</VirtualHost>
```

その後、Apacheを再起動します。

```
% sudo /etc/init.d/httpd restart
```

## WEBrickの起動オプション

Apacheの設定と再起動が完了したら、RailsアプリのディレクトリでWEBrickを起動します。

```
% rails s --binding=127.0.0.1 --daemon
```

`--binding`で待ち受けるIPアドレスを指定しています。また`--daemon`でWEBrickサーバをデーモンとして稼働させるよう指定しています。

ちなみに、デーモンとして起動したWEBrickを停止するには同様にRailsアプリのディレクトリで以下のコマンドを実行します。

```
% cat tmp/pids/server.pid | xargs kill
```

それでは、簡単に環境を設定して、楽しいRailsアプリ開発を！
c++ builder XE4, 10.2 Tokyo > 文字がUpperCaseかどうか > if (UpCase(code) == code) {

```txt:動作確認
C++ Builder XE4 on Windows 7 pro
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

char型の個々の文字がUpperCaseかどうかの確認にはUpCase()という関数があるようだ。

http://stackoverflow.com/questions/8394241/how-to-detect-if-a-character-from-a-string-is-upper-or-lower-case

> upper := a = UpCase(a); // True


C++ Builderでのヘルプでは
> UpCase 関数は Ch を大文字に変換します。

以下のように使えばよさそうだ

```
if (UpCase(code) == code) {
...
```
AndroidアプリでKii CloudとFacebook認証を連携させる方法

#はじめに
Kii Cloudで認証を実装しているAndroidアプリにFacebook認証を追加してみました。初心者の自分は[公式サイトの記述](http://docs.kii.com/ja/guides/android/managing-users/social-network-integration/facebook/)通りにやっただけではうまくいかなかったので、つまづいた手順をメモしています。

なお、Kii Cloud 連携を行うには https://developer.kii.com/ からユーザ登録のうえAndroidアプリを登録しSDKをダウンロードしておく必要があります。


#Facebook アプリケーションIDの発行
まずFacebook App ID を取得するため[facebook for Developer](https://developers.facebook.com/apps)にログインし、開発者として登録したことがなければ「Register Now」ボタンから登録を開始します。初回はSMSまたは電話での認証が必要のようです。次に「+Add A New App」ボタンからプラットフォームにAndroidを選択し、新規アプリを追加します。その後はウィザードに従って設定を完了するとApp IdとApp Secretが発行されます。


#Kii アプリケーションの設定
FacebookのApp IDが発行されたら、[Kii Cloud開発者ポータル](https://developer.kii.com/v2/apps)より Facebook App ID の登録を行います。アプリケーションコンソール上で対象アプリを選択し、右上の歯車アイコンから "Edit->Setting" の順にクリックしアプリ設定画面を開きます。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/59574/32a4b46a-3c90-53a6-b95b-3744c9d8a0ba.png)

次に"Social Network Connector" セクションに Facebook App ID と App Secret を設定します。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/59574/f319816c-1628-3c5d-8e68-3833ce24fb15.png)

#Android Studioで事前準備
AndroidManifest.xmlに下記2つのactivityを追記します。
`<activity
android:name="com.kii.cloud.storage.social.connector.KiiSocialNetworkConnectorLoginActivity"
    android:label="@string/app_name" />`
` <activity android:name="com.facebook.LoginActivity" />`

build.gradeにも下記を追記します。
`compile 'com.facebook.android:facebook-android-sdk:3.20.0'`

...とここまでは特に問題なく進みます。

#認証部分を実装
公式ドキュメントによると「コードに数行追加するだけで簡単に実現できます」とのことですが、ここに記載されている認証部分をサンプル通りに書いても動きません。そこでいろいろぐぐると[この](http://community-jp.kii.com/t/facebook/300)お知らせが見つかり、アクセストークンの取得が必要とのこと。[GitHub](https://github.com/satoshikumano/Kii-FB-Integration/commits/master)のサンプルを自分のApp Idに書き換えると問題なくFacebook認証できました。

#補足：既存の認証との共存
しかし、問題は既存のKii認証とどう共存させるかです。FacebookとKiiのアクセストークンの概念の違いがわからず混乱しましたが、自分なりに色々解釈したところ下記のように動作しているようです(間違ってたら指摘ください)。

1) Facebookでログイン
2) Kii上にユーザが作成され、アクセストークンもできる
3) これ以降はFacebookは意識する必要なし

しかし、これを信じてログアウトはKiiの認証だけ意識した実装にしていると、アプリからログインできないという問題が起こりました。

そこでログアウト処理に下記のfacebookログアウト処理を追加したら無事ログアウトできました。

```
            Session s = Session.getActiveSession();
            s.closeAndClearTokenInformation();
            KiiUser.logOut();
```

どうやらGitHubのサンプルではfacebookのセッションが残っていた場合に自動ログインするという親切な仕組みになっていたためのようです。
Instantiate 後に任意の型にキャストする

Unity でプレハブを Instantiate した後、そのオブジェクトに対して何かしらの操作を加えたい、ということはよくあるのではないでしょうか。
しかし、Instantiate で返されるオブジェクトは Object 型のためそのままでは操作できません。以下のようにキャストをかける必要があります。

```InstantiateTest.cs
using UnityEngine;

public class InstantiateTest : MonoBehaviour {

    [SerializeField]
    private GameObject pref;

    void Start () {
        var go = Instantiate(pref) as GameObject ;
    }  
}
```
インスタンス化するオブジェクトに Rigidbody をアタッチしていて Rigidbody を操作したい場合、以下のようなコードを書くかと思いますが、このままではコンパイルが通りません。

```InstantiateTest.cs
using UnityEngine;

public class InstantiateTest : MonoBehaviour {

    [SerializeField]
    private GameObject pref;

    void Start () {        
        var rb = Instantiate(pref) as Rigidbody; // ここでエラー.
    }	
}
```
これは、 `pref` が GameObject 型として割り当てられているためです。これを解決する方法は2つ考えられます。

1．GameObject にキャストした後にさらに任意の型を `GetComponent`

```InstantiateTest.cs
using UnityEngine;

public class InstantiateTest : MonoBehaviour {

    [SerializeField]
    private GameObject pref;

    void Start () {
        var rb = (Instantiate(pref) as GameObject).GetComponent<Rigidbody>();
    }	
}
```

2．`pref` の型を変換したいものにしておく

```InstantiateTest.cs
using UnityEngine;

public class InstantiateTest : MonoBehaviour {

    [SerializeField]
    private Rigidbody pref;

    void Start () {
        var rb = Instantiate(pref) as Rigidbody;
    }	
}
```
Go言語でstructをmapに変換する

# コード

http://play.golang.org/p/SagKHWrFn0

```go

package main

import (
	"fmt"
	"reflect"
	"encoding/json"
)

func StructToMap(data interface{}) map[string]interface{} {
  result := make(map[string]interface{})
  elem := reflect.ValueOf(data).Elem()
  size := elem.NumField()

  for i := 0; i < size; i++ {
    field := elem.Type().Field(i).Name
    value := elem.Field(i).Interface()
    result[field] = value
  }

  return result
}

func StructToJsonTagMap(data interface{}) map[string]interface{} {
  result := make(map[string]interface{})
  elem := reflect.ValueOf(data).Elem()
  size := elem.NumField()

  for i := 0; i < size; i++ {
    field := elem.Type().Field(i).Tag.Get("json")
    value := elem.Field(i).Interface()
    result[field] = value
  }

  return result
}

func StructToJsonTagMap2(data interface{}) map[string]interface{} {
  result := make(map[string]interface{})

  b, _ := json.Marshal(data)
  json.Unmarshal(b, &result)

  return result
}

type A struct {
	ID int `json:"id"`
	Name string `json:"name"`
}

func main() {
	a := A{1, "keitaj"}
	fmt.Println(a)
	
	b := StructToMap(&a)
	fmt.Println(b)
	
	c := StructToJsonTagMap(&a)
	fmt.Println(c)
	
	d := StructToJsonTagMap2(&a)
	fmt.Println(d)
}
```

# 実行結果
```go
{1 keitaj}
map[ID:1 Name:keitaj]
map[id:1 name:keitaj]
map[name:keitaj id:1]
```


# 備考
Tagをmapのkeyにしたい場合は、StructTag型のGetメソッドを使う


# 参考記事
http://hiyosi.tumblr.com/post/100922038678/go-%E3%81%A7-struct-%E3%81%AE%E3%82%BF%E3%82%B0%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B

http://qiita.com/hnaohiro/items/1f021fa5e703b5a530cf
naming > SetDefaultColor() > 振る舞いが曖昧


ある色を持つコンポーネントがあるとする。例として、丸いもの。

SetDefaultColor()を呼び出したときの振る舞いは何か?

自分には以下の２つの可能性があると思われる。

1. コンポーネントの色をdefaultColorにする
2. コンポーネントのDefaultColorをセットする (コンポーネントの色は変わらない)

1についてはSetToDefaultColor()などにした方がいいのだろうか。

他の関数の命名との兼ね合いを考えると１つだけ変えるわけにはいかない。

引数があるなしの文脈で区別はできるが、文脈での理解となるとソースリーディングにはやさしくない。
「Win7のすべてのプログラム＞アクセサリ＞コマンド プロンプト」と同じ機能のバッチファイル

cmd-exe.BAT
%windir%\system32\cmd.exe

「Win7のすべてのプログラム＞アクセサリ＞コマンド プロンプト」と同じ機能のバッチファイル
フォルダにコピーしてダブルクリックします。
kCFCoreFoundationVersionNumberリスト

kCFCoreFoundationVersionNumberについては[http://qiita.com/r_plus/items/241aa79fd39b0178e70e](http://qiita.com/r_plus/items/241aa79fd39b0178e70e)参照
たぶん全部揃ってるはずです。

```c:おそらくｺﾝﾌﾟ？
#define kCFCoreFoundationVersionNumber_iPhoneOS_2_0 478.23
#define kCFCoreFoundationVersionNumber_iPhoneOS_2_1 478.26
#define kCFCoreFoundationVersionNumber_iPhoneOS_2_2 478.29
#define kCFCoreFoundationVersionNumber_iPhoneOS_3_0 478.47
#define kCFCoreFoundationVersionNumber_iPhoneOS_3_1 478.52
#define kCFCoreFoundationVersionNumber_iPhoneOS_3_2 478.61
#define kCFCoreFoundationVersionNumber_iOS_4_0 550.32
#define kCFCoreFoundationVersionNumber_iOS_4_1 550.38
#define kCFCoreFoundationVersionNumber_iOS_4_2 550.52
#define kCFCoreFoundationVersionNumber_iOS_4_3 550.58
#define kCFCoreFoundationVersionNumber_iOS_5_0 675.00
#define kCFCoreFoundationVersionNumber_iOS_5_1 690.10
#define kCFCoreFoundationVersionNumber_iOS_6_0 793.00
#define kCFCoreFoundationVersionNumber_iOS_6_1 793.00
#define kCFCoreFoundationVersionNumber_iOS_7_0 847.20
#define kCFCoreFoundationVersionNumber_iOS_7_1 847.24
#define kCFCoreFoundationVersionNumber_iOS_8_0 1140.10
#define kCFCoreFoundationVersionNumber_iOS_8_1 1141.14
#define kCFCoreFoundationVersionNumber_iOS_8_2 1142.16
#define kCFCoreFoundationVersionNumber_iOS_8_3 1144.17
#define kCFCoreFoundationVersionNumber_iOS_8_4 1145.15
#define kCFCoreFoundationVersionNumber_iOS_9_0 1240.10
#define kCFCoreFoundationVersionNumber_iOS_9_1 1241.11
#define kCFCoreFoundationVersionNumber_iOS_9_2 1242.13
#define kCFCoreFoundationVersionNumber_iOS_9_3 1280.30
```
node-redでgoogle feed apiの様なもの

#概要
google feed apiで大騒ぎしたので、node-redでやってみました。
#写真
![proxy.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/81fb1400-6a1e-b87f-c53a-59bc5935ed8a.jpeg)
#func0
```
msg.url = msg.payload.url;
return msg;

```
#func1
```
msg.res.header('Access-Control-Allow-Origin', '*');
msg.res.send(msg.payload);
return msg;
```
#実行結果
![feed.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/d4670721-9071-f22b-939c-079aa28e7ead.jpeg)
#サンプルコード
```
function xmlLoad() {
    var rss_url = "http://rss.dailynews.yahoo.co.jp/fc/rss.xml"; 
    var proxy = "http:// node-red /proxy";
	$.ajax({
		url: proxy,
		type: 'get',
		dataType: 'xml',
        timeout: 5000,
        data: {
           url: rss_url
        },
		success: parse_xml
	});
}
function parse_xml(xml, status) {
	if (status != 'success') return;
	$(xml).find('item').each(disp);
}
function disp() {
    var $link = $(this).find('link').text();
	var $title = $(this).find('title').text();
    var $html = '<a href="' + $link + '"> ' + $title + '</a><br>';
    $('#result').append($html);
}
$(function() {
	xmlLoad();
});
```
shenzhenでiOSのipaをbuildしdeploygateで配布しました。

shenzhenというgemを入れるとDeploygateからの配布が楽らしいのでやってみました。

# 結論から
めっちゃ便利なので使ったほうがいいと思いました(☝ ՞ਊ ՞)

shenzhenはXcode経由でipaをArchiveできる環境がすでにある状態で利用できます。つまり、XcodeでArchiveできない状態だと、ipaコマンドでもArchiveできないよってことです。

# shenzhenをインストール
gemをインストールします。

```bash:shenzhenのインストール
gem install shenzhen
```

# ipaをbuild
Xcodeで開くプロジェクトが置いてあるディレクトリへ移動します。

```bash:
# iosアプリのディレクトリ移動
cd ~/hogehoge/pugiemonn-ios
```

ipaコマンドが使えるようになっています。

```bash:
# ipaをbuild
ipa build
```
`PugiemonnApp.ipa`のようにipaファイルがbuildされています。

## ipa build が失敗した場合
エラーログを出力できます。

```
ipa build --trace
```
`--trace`を付けてください。エラーログが表示されます。
このログはXcodeでArchiveした際に出力されるログと同じかな？？

# Deploygateで配布

```bash:配布方法
ipa distribute:deploygate -a API_TOKEN -u USER_NAME
```

```bash:配布例
ipa distribute:deploygate -a pugiemonnxxxxxpugiemonnxxxx -u pugiemonn -f PugiemonnApp.ipa -m "アプリ配布するよー"
```
こちらのコマンドでDeploygate経由でアプリが配布されます。

# 参考
https://github.com/nomad/shenzhen
http://qiita.com/k_kinukawa/items/7e554db79f51fc651e65
ActionMailerでOpenSSL::SSL::SSLErrorを解消

## 事象
RailsでActionMailer、Postfix経由でメールの送信をしようとしたところ、
以下の様なエラーが発生
FATAL -- :
OpenSSL::SSL::SSLError (hostname "localhost" does not match the server certificate):


その時のActionMailerの設定がこちら

```lang:config/environments/production.rb
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.default_url_options = { :host => 'xxxx.com' }
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :address => 'localhost'
  }
```

## 原因
デフォルトではSMTPサーバにTLSを使って接続しようとするようで、
hostname "localhost"がないと怒られている

## 解決策
enable_starttls_autoをfalseに設定する

```lang:config/environments/production.rb
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.default_url_options = { :host => 'xxxx.com' }
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :address => 'localhost',
    :enable_starttls_auto => false
  }
```


ちょっとハマりましたが、メールが送れるようになって良かったです。
easy_install lxml で Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed? がでました。

`easy_install lxml`したらエラーがでたようです。

# lxmlが入らない

```
easy_install lxml

*********************************************************************************
Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?
*********************************************************************************
```
ダメみたいです。

# python-lxmlを入れる
python-lxmlというのを入れると良いみたいです。

```
apt-get install libxml2-dev libxslt1-dev python-dev
apt-get install python-lxml
```

# 再度確認
今度はうまく行ったみたいです。


# 参考
http://stackoverflow.com/questions/6504810/how-to-install-lxml-on-ubuntu
全角カナを半角カナにする

自分で調べて扱っている記事が少なかったのでメモ

```
let 代入したい変数 = NSMutableString(string: 変換したい文字) as CFMutableString
CFStringTransform(代入したい変数, nil, kCFStringTransformFullwidthHalfwidth,false)
```

これでいけると思います
Android TV向けのFTPサーバアプリを作ってみた

# AndroidTVにデータを転送したい！
- 動画ファイルを入れれば、AndroidTVで再生できる！
- スマホで使っているアプリからapkを抽出すれば、TV用でないアプリもAndroidTVにインストールできる！
  - （使えるとは限らないけど……）

というわけで、AndroidTVにデータを送りたいわけですが、直接PCとUSB接続してファイルを転送するくらいしか方法がありません。
スマホなどからデータを転送する場合も不便です。

# AndroidTV用のFTPサーバアプリを開発しました
[FTP Server for Android TV](https://play.google.com/store/apps/details?id=com.oxsoft.ftpserver&hl=ja)

スマホ用FTPサーバはいっぱいありますが、インストールしてもUI的にAndroidTVではほとんど使えません……
このアプリを使えば、簡単にPCやスマホからデータを転送することができます。

# 開発過程
## ライブラリの導入
最初はポートで受け付けて、そのあとは規定されたプロトコルに従ってデータを送れば……とか考えてましたが、ライブラリがありました。

[Apache FtpServer](http://mina.apache.org/ftpserver-project/)

Gradleに次のような形で書けば使えます。

```groovy:build.gradle
android {
    // ...
    packagingOptions {
        pickFirst 'META-INF/NOTICE'
        pickFirst 'META-INF/LICENSE'
    }
}

dependencies {
    // ...
    compile 'org.apache.ftpserver:ftpserver-core:1.0.6'
    compile 'org.slf4j:slf4j-android:1.7.13'
}
```

FtpServerのログ出力に関する警告がうるさかったので、二つ目のライブラリも入れました。
そしたらMETA-INFが衝突したので、最初のを採用するようにしました。

## メソッド数問題
FtpServerにはたくさんのメソッドが詰め込まれているらしく、ビルドできなかったので、Multi-dex Supportを使いました。

Gradleに次のような形で書きます。

```groovy:build.gradle
android {
    // ...
    defaultConfig {
        // ...
        multiDexEnabled true
    }
}

dependencies {
    // ...
    compile 'com.android.support:multidex:1.0.1'
}
```

さらに、ManifestでApplicationの指定をします。

```xml:AndroidManifest.xml
<manifest ...>
    ...
    <application
        android:name="android.support.multidex.MultiDexApplication"
        ...>
        ...
    </application>
    ...
</manifest>
```

## 簡単にFTPサーバを立てられる
ここまで準備できればあとは簡単で、ユーザが入力した情報をもとにライブラリをたたくだけです。

```java:MainActivity.java
FtpServerFactory serverFactory = new FtpServerFactory();
ListenerFactory listenerFactory = new ListenerFactory();
listenerFactory.setPort(ポート);
serverFactory.addListener("default", listenerFactory.createListener());

ConnectionConfigFactory connectionConfigFactory = new ConnectionConfigFactory();
connectionConfigFactory.setAnonymousLoginEnabled(匿名ログインを許可するか);
serverFactory.setConnectionConfig(connectionConfigFactory.createConnectionConfig());

PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();
userManagerFactory.setPasswordEncryptor(new SaltedPasswordEncryptor());
UserManager userManager = userManagerFactory.createUserManager();

BaseUser user = new BaseUser();
user.setName(ユーザ名);
user.setPassword(パスワード);
user.setHomeDirectory("/");
if (書き込みを許可するか) {
    List<Authority> authorities = new ArrayList<>();
    Authority authority = new WritePermission();
    authorities.add(authority);
    user.setAuthorities(authorities);
}
try {
    userManager.save(user);
    serverFactory.setUserManager(userManager);
    server = serverFactory.createServer();
    server.start();
} catch (FtpServerConfigurationException | FtpException e) {
    e.printStackTrace();
}
```

# 問題点
- Service化するとうまく動かない
  - しょうがなくActivityで実装した
  - FTP立てっぱなしにするには、ホームボタンを押してアプリをキルしないようにする
- ホームディレクトリをいじるとうまく動かない
- USBメモリや外付けHDDにアクセスできない
  - ちょっと難しそう

ひとまず自分は満足してしまったので、この辺の問題はアプリのダウンロード数が伸びたら考えたいと思います。

他に何かいい方法（そもそもみんなどうやってAndroidTVにデータを転送しているんだろう？）があれば教えていただけると大変嬉しいです！
自分のアプリからアドレス帳に追加しようとABNewPersonViewControllerを呼びだそうとすると何やらワーニング


	Presenting view controllers on detached view controllers is discouraged

が出ていたので調べてみると、

	[self presentViewController:navigation animated:YES completion:NULL];

と呼び出しているのを
  
	[self.view.window.rootViewController presentViewController:navigation animated:YES completion:nil];

とすればいいらしい。
理由までは追いかけてないので、ひとまずメモ。
CentOSでパーミッション周りで不審な挙動があった時はSELinuxを疑う


# 困ったこと
他サーバーで動いていたphpアプリをCentOS6.6の新サーバーに移動したところ、
file_put_contentsでファイル書き込みができない問題が発生。

## 構成
* nginx + php-fpm
* ともに実行ユーザーはnginxユーザー
* 書き込みたいディレクトリはchown nginx chmod 777してある

=> permission周りは問題なし、nginxユーザーにsuしても普通に読み書きできる。おかしい

# 結論
結論から言うと、SELinuxによるアクセス管理に引っかかっていました。
このサーバーでは別にSELinuxは無効でいいので無効にします。

## SELinuxの設定確認
今のSELinuxの状態を確認する

```
$ getenforce

=> enforcing 有効になってる

```

## とりあえず一時的に無効する方法
以下のコマンドで一時的に無効にできる

```
$ setenforce 0
```

## 恒久的に無効にする方法
上記の方法だとOSを再起動するとまた元に戻ってしまう。
OSを再起動してもずっと無効のままにしておきたい時は以下を実行。

### sysconfigを修正
```
$ sudo vi /etc/sysconfig/selinux

SELINUX=enforcing
↓
SELINUX=disabled
```

### OS再起動
```
$ reboot
```
BaaSBox  ~まだ有料BaaSで消耗してるの？~


今回はBaaSboxという無料オープンソースのBaaSを紹介したいと思います。BaaSに触れたことがない方もParse.comなどの他のBaaSを使っている方も、これはBaaSboxを早急にやらねば！と思わせるのがこの記事の狙いです。

#BaaSって？
BaaSについてご存じない方もいると思うのでここで簡単に触れておきます。
BaaSというのはBackend as a Serviceの略でバックエンドの機能をAPI化してくれるものです。つまり、BaaSを使うことでフロントエンドやクライアント側のエンジニアがバックエンドを意識せずにデータの保存やプッシュ通知、ユーザーの機能などを開発することができるというものです。

#なんでBaaSbox?
BaaSのサービスはとてもたくさんあります。
FacebookのParse, IoT向けのPubNubなど。。。
しかし、どれにも総じて言えるのが「お値段が高い」
しかし、このBaaSboxはなんとオープンソース。
つまり、自身のサーバ環境さえあればサーバーの料金のみで済むということ。
ソースコードもgithubにあがっているのでカスタマイズがしたい方はForkして使うことだってできます。
特徴を見ていきましょう
##BaaSboxの特徴
- JAVA/Play Frameworkで開発されている
- サーバーへの導入がマジ簡単
- iOS,AndroidのSDKも提供されている
- Social Loginも可能
- 管理画面GUIも使いやすい

ってな感じです。
実際にサーバーに導入してみましょう
AWSをお使いの方はDocumentを見るとAWSへのインストール方法の解説も載っています。
今回は手軽にローカル環境での実装をしたいとおもいます。

#localでのBaaSサーバーの準備
##環境
- Vagrant(CentOS 6.4)

###1.VagrantなどでVMを動かしてください。
VMのインストールについてはここでは割愛いたします。
CentOSであれば`yum update`は忘れずに
###2.必要なもののインストール
```
yum install java-1.8.0-openjdk
yum install unzip
wget --content-disposition http://www.baasbox.com/download/baasbox-1.0.0-M2.zip
unzip baasbox-1.0.0-M2.zip
```

###3.baasboxのディレクトリに移動し、起動
先ほどダウンロードして解凍した`baasbox-1.0.0-M2/`
へ移動します。
`./start`のパーミッションを変更します。
`chmod +x ./start`
ここでBaaSboxは初期設定で9000番のポートを使用するため各自のマシンで9000番を開けておいてください。

```Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 9000, host: 9000
end
```
Vagrantならこんな感じ

#以上！！！
はい。サーバーへの導入が終わりました。簡単ですね、試しに
http://localhost:9000
にアクセスしてみましょう
![Kobito.kN8Nek.png](https://qiita-image-store.s3.amazonaws.com/0/55608/6a7a606c-dbc7-46a9-aaf5-5fbafc28f23b.png "Kobito.kN8Nek.png")
こんな画面になると思います。
Administrator Loginを押すと
![Kobito.Eyghw1.png](https://qiita-image-store.s3.amazonaws.com/0/55608/40559cb3-b739-70a8-bc70-e1e62501f186.png "Kobito.Eyghw1.png")
ここで横のiボタンを押してもらえば勝手にadminのパスワードなどが入ります。
Loginをすると
![Kobito.BLZZaS.png](https://qiita-image-store.s3.amazonaws.com/0/55608/be807475-4396-25d4-2234-320fbe39a73a.png "Kobito.BLZZaS.png")

こんな感じです。
Documentもここからローカルで見られます。

#終わりに
次回はBaaSboxを使ってswiftでSDKを使って見る記事を書きたいと思います。
至らない点もいくつもあると思いますので暖かい鉞を投げていただくと嬉しいです。
次回は
#参考
http://gihyo.jp/dev/feature/01/milkcocoa-baas/0001
SpringのDIとnewってなにがちがうんだっけ？


1年前。仕事しながら、
そもそも「DIとnewってなにがちがうんだっけ」とおもったので調べた。

てかSpring DIってなにやってくれてるの？

DIってnew省略してくれてるんでしょ？くらいにしかおもって
なかった（反省。）けど、もっと多くのことをやってくれていると知る。

## @Component と @Autowired のやっていること

- **@Component使う=bean定義を省略する ということ。**
- **@Autowired使う=コンテナからbeanを引っ張りだして注入する ということ。**

Springは起動時にbeanを読み込んでIoCコンテナに登録してるわけだから、
コンポーネントとして定義した部分はSpringコンテナの管理下におかれる。
、、で、依存性注入の際にコンテナ上から呼び出される。
つまり、 **DIはコンテナ経由じゃないとだめ**なのですね。
単純なnewとDIがちがうということはこれで理解できる。

## Spring DIはデフォルト、シングルトン

デフォルトだと一つのインスタンスを、依存性注入された各インスタンスが
共有して参照しあってている状態。
これが何を意味するか。
スレッドセーフじゃないことが起こりうるということらろう。
これは逆にいえば、@Componentを付与すべきクラスはステートレスであるべしということ。
具体的には、フィールド変数持っちゃうと意図しない動作になりうる。
どうしてもステートフルなものをコンポーネントで管理したいときは
@Scopeを使うみたいだ。一例、@Scope("prototype")だと、
Beanが呼び出されるたびにインスタンスが作られるので値を共有することはなくなる。
基本的にはデフォルト（シングルトン）にしないほうが安全みたいですね。
Git-2.7.0.windows.1 と CMake-3.4.1 で FindGit できない時の応急措置

# 再現しるる対象環境

- Windows
- Git for Windows: 2.7.0.windows.1
    - `env:path` (`%PATH%`) を通した状態
- CMake: 3.4.1

# 発生する問題

例として ExternalProject を使うなど CMake 内部で FindGit を間接的に、あるいは直接使う CMakeLists.txt に対して cmake した際に次のように Git のバージョンを取得できない事によりエラーが発生し中断する現象が発生する。

```sh
CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.4/Modules/ExternalProject.cmake:1743 (message):
  error: git version 1.6.5 or later required for 'git submodule update
  --recursive': GIT_VERSION_STRING=''
```

# 問題の原因

CMake に含まれる FindGit.cmake が find_program で Git の実行ファイルを探すが、この時に Git for Windows をパスを通した状態で導入していると cmake の実行パスに git コマンドがあるかのように誤認識を起こす。

例えば C:\hoge\build から `cmake ..` などとした場合、 FindGit.cmake 内部では GIT_EXECUTABLE 変数へ誤って `C:/hoge/build/git` なるパス文字列をセットしてしまう。当然このようなフルパスに git コマンドは通常存在しないため Git のバージョン取得を行う FindGit.cmake の内部的なコードの実行と結果の取得は正常に行われず、 FindGit を間接あるいは直接必要とする CMakeLists.txt への cmake は失敗する。

# この問題が起きた場合の応急措置

CMake を導入したパスがデフォールトであれば、"C:\Program Files (x86)\CMake\share\cmake-3.4\Modules\FindGit.cmake" を適当なテキストエディターを管理者権限で実行した状態で開き、 `find_program` の代わりにさしあたりこの環境の git.exe パスを直接定義する。

```cmake
set(GIT_EXECUTABLE "C:/Program Files/Git/bin/git.exe")
```

## 注意

この対応はあくまでもこの状態になった環境での応急措置として行った事を忘れない事。
プロセスとスレッドの違い


## プロセス
- 直列処理
- 1プログラム1プロセス
- リソースを共有しない。起動にはコピーがヒツヨウ。

## スレッド
- 並列処理
- リソースを共有する。地球に優しい

いまどきはライトウェイトプロセスなのでもっと効率よい
Hibernateのjoinでハマった


## @JoinColumnとmappedBy

- @JoinColumnは参照する側のentityに定義する
- mappedByは参照される側のentityに定義する

ここを間違っていた。が、ハマりどころは、間違っていてもエラーが出なかったこと。
誤ったカラムを取得してしまっていたのに気づくまでにまず時間かかった。
取得できないならありがたいのに、対象でないテーブルの異なるIDを取って来ていたm(_ _)m

乙。
openframeworks初心者に伝えたい2つのこと

# openframeworks初心者に伝えたい2つのこと

## Run (Cmd+R) してるのに何も動かない。

↓こうなってたらそれはopenframeworks自体のビルドなので

<img width="417" alt="build01.png" src="https://qiita-image-store.s3.amazonaws.com/0/4206/5b5a7f50-442d-1a01-cd50-1a2e20948541.png">!

↓こうやってアプリケーションのビルドをしましょう。

<img width="417" alt="build01.png" src="https://qiita-image-store.s3.amazonaws.com/0/4206/577dc028-c74f-57c1-c9b6-dc38bd437102.png">

## 赤い丸が出た

<img width="517" alt="error01.png" src="https://qiita-image-store.s3.amazonaws.com/0/4206/47b77874-5d6e-c911-0987-f9a14089c29f.png">

**取り敢えずエラー読め**, **ググれ**

<img width="287" alt="error02.png" src="https://qiita-image-store.s3.amazonaws.com/0/4206/80a4f7b5-4188-a8e6-cf7f-13b229618cb9.png">

<img width="687" alt="error03.png" src="https://qiita-image-store.s3.amazonaws.com/0/4206/2be94c54-ae4f-95ea-59d4-ea20031e4272.png">

## (番外編) 黄色い三角が出た

<img width="528" alt="ss 2016-01-17 12.06.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/4206/9c876317-ded5-ec62-ae0b-29ad64114a47.png">

取り敢えず気にしないで進めましょう。

そのうち気に出来るようになりましょう。
D言語の乱数生成

std.randomをインポートして使います. 乱数生成っていろいろあるんですね.

#普通にランダムを使う
実行環境における "デフォルトの", "好ましい", "お勧めの" 乱数生成器です. (1) なにかしら良い乱数生成器が必要で,しかも (2) 細かい実装方式は特に気にしない,という場合はこの型を使うと良いでしょう.([公式サイトより](http://www.kmonos.net/alang/d/phobos/std_random.html))

```d
import std.stdio, std.random;

void main()
{
 //upredictableSeedによって実行するごとに異なる乱数列を生成できる
 auto rnd = Random(unpredictableSeed);

 //0から99の整数値をうち一つを出力
 writeln(uniform(0, 100, rnd));

 //0から100の整数値をうち一つを出力
 writeln(uniform!"[]"(0, 100, rnd));

 //0から100のうち実数を一つ出力
 writeln(uniform(0.0L,100.0L,rnd));
}
```

#配列をシャッフルする

```d
import std.stdio, std.random;

void main()
{
 int[] i = [0,1,2,3,4,5,6,7,8,9];

 //upredictableSeedによって実行するごとに異なる乱数列を生成できる
 auto rnd = Random(unpredictableSeed);

 randomShuffle(i, rnd);
 writeln(i); //[9, 0, 8, 6, 4, 2, 5, 3, 1, 7] (一例)

 //二次元配列でも可能です
 int[][] j = [[0,1],[2,3],[4,5],[6,7],[8,9]];

 randomShuffle(j, rnd);
 writeln(j); //[[4, 5], [6, 7], [2, 3], [0, 1], [8, 9]] (一例)
}
```

#非等確率で乱数を生成
dice(a,b,c)で0をa割,1,をb割,2をc割の確率で出るようにします(引数の個数は自由)

```d
import std.stdio, std.random;

void main()
{
 foreach(int i; 0..10)
    writeln(dice(5,3,2));
}
```

#配列の要素を一個ずつ出力

```d
import std.stdio, std.random;

void main()
{
int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ];
auto rnd = Random(unpredictableSeed);
foreach (e; randomCover(a, rnd))
{
    writeln(e); //6 1 4 8 3 5 0 7の順で出力(一例)
}

writeln("");

//もう一回やるときは更新
rnd = Random(unpredictableSeed);

foreach (e; randomCover(a, rnd))
{
    writeln(e);
}

}
```

#配列からn個の要素を取り出す
randomSampleを使います

```d
import std.stdio, std.random;

void main()
{
int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ];

writeln(randomSample(a, 5)); //[1, 4, 5, 7 , 8] (一例)
}
```
シェルスクリプト　その２

シェルスクリプトのメモの続きです。ここではFOOをシェルの変数名の例として使います。

・\$FOOや\${FOO}として端末上でシェル変数とみなす。
　　Ex: "echo $FOO"で変数の値を表示する。

・"sed"コマンドはテキスト内の指定した文字列を別の指定した文字列に変換する。
　　LINK: http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230879/?rt=nocnt

・FOO=やFOO=""で値を代入すると未設定の変数となるが実際はNULLが代入されている。

・"echo ${FOO:=something}"はFOOが変数名として使用されていない時、もしくわ未設定の時のみ値が代入される。

・":"を省略することで未設定時に値を代入されなくなる。

・":-"に変えることで変数未使用・未設定時に値をそのまま表示するが代入されない。

・":?"に変えることで変数未使用・未設定時に値をそのまま表示するが代入されない。用途は変数が使用済みか確認するなど。

・":+"に変えることで変数が使用されている時のみ値をそのまま表示するが代入されない。

・書き込み禁止の変数一覧"\$0~\$9, \$#, \$*, \$@, \$?, \$$, \$!, \$-"

・"\$0"はシェルスクリプトの名前が入っている。

・"\$1~\$9"は１番目から９番目の引数が入っている。

・"\$?"はコマンド終了時のステータスを保持している。

・"\$$"は現在動作中のプロセスID(PID)がセットされている。"ps"コマンドで確認可

・"\$!"バックグラウンドで動作中のPID

・"\$-"はシェル起動時のフラグや、"set"コマンドを使って設定したフラグの一覧がセットされている(フラグがなになのか理解できていないが、後に"set"コマンドについての説明があるみたいなので、そこで理解できればメモします。)

参考資料：入門UNIXシェルプログラミング　改訂第２版　第２章（発行所：SBクリエーティブ株式会社）


[シェルスクリプト　その１](http://qiita.com/woolon/items/7bcfa18320f0abd74ca0)
[シェルスクリプト　その３](http://qiita.com/woolon/items/59c26dcb040adefae0f3)
[シェルスクリプト　その４](http://qiita.com/woolon/items/514db422f8ccea0ca94c)
[シェルスクリプト　その５](http://qiita.com/woolon/items/6366dd6dac12387d84b7)
[シェルスクリプト　その６](http://qiita.com/woolon/items/6e89c67220b9095a6414)
[シェルスクリプト　その７](http://qiita.com/woolon/items/4e3c986587f428742b79)
Xcodeのプロジェクトを大掃除する方法

# 最初に
この記事は、**Xcode**のプロジェクトを綺麗にする方法です。
ただ、あくまで僕が綺麗だと思うだけであって個人差はあると思いますm(_ _)m
他におすすめの方法とかあると、教えてもらえると嬉しいです！

記載時(2016/01/17)のバージョンは下記の通りです。

|対象  |バージョン  |
|---|---|
|XCode|7.2|
|Mac|10.11.2|

## <font color="red">要注意！</font>
今回の作業を行う前に、必ず **ソースコードのバックアップを取っておいてください！** 。
大掃除して動かなくなったとかだと笑えないので、注意してください。

# タブとスペースが混ざってしまっている
## 悩み
複数人で開発したり、
ソースコードを適当にコピーペーストすると・・
気付けば、**タブ**と**スペース**が混在してませんか？

Xcode上では違いがわからなくても、
GitHubなどにソースコードを見た時に・・

```swift
   let hoge = "A"
      let fuga = "B"
```
上記のような感じで、インデントがずれちゃうことがあると思います。
汚いです、気になりますよね...！

## 解決方法
**.swiftファイルのタブをスペースに一括置換する。**

### コマンド：
```sh
find ./* -name '*.swift' -exec vim -Nes -c 'set expandtab' -c 'set tabstop=4' -c 'set shiftwidth=4' -c 'retab' -c 'wq' {} \;
```
後は、Diffを確認する時に`?w=`を使うと、**空白のみの変更は表示しない**ので、
変更点を確認しやすいです！

例：
https://github.com/sixthsense/sixthsense/pull/16/files
https://github.com/sixthsense/sixthsense/pull/16/files?w=


# ディレクトリ構成をグループ構成どおりに移動
## 悩み
**ディレクトリ構成と実際の構成を合わせるのって面倒**ですよね。

ファイルを追加する時に、グループ構成をXcode側で指定(New Groupとか)し、ファイルを追加すると思います。
その際にいざ、ファイルと追加(New Fileとか)すると、またFinder側でディレクトリを作らないといけません。

でも、だからってカレントに全て置いちゃうとGitHubで見た時にめちゃくちゃ見づらい！

## 解決方法
**ディレクトリ構成をグループ構成を同期させるツール「Synx」**を利用する

利用方法は以下のページに記載してあります！
公式：[Synx(GitHub)](https://github.com/venmo/synx)
個人：[Xcodeでディレクトリ構成をグループ構成に合わせる](http://llcc.hatenablog.com/entry/2015/08/28/235533)

### 注意
> WARNING: Make sure that your project is backed up through source control before doing anything

公式ページに記載してある通り、**バックアップはしっかりと取っておきましょう！**


# コードの規約が守られていない
## 原因
複数言語を同時に開発して、ごっちゃになったり
人によってコーディングスタイルが異なったりする（きっと合わせた方がいいが...）ので、
そうゆう悩みは**静的解析ツールを導入**して、ストレスフリーな開発をしましょう！

## 解決方法
静的解析ツール(SwiftLint)を導入する
導入方法は次のページに記載してあります！
[SwiftLint導入](http://qiita.com/syamaoka/items/2edfe315940d91846bf0)

# ブランチを整理する
## 悩み
ローカル/リモートブランチは、マージした後に毎回削除する癖があるといいのですが、
放っておくとブランチがいっぱいになって見辛くなります...

## 解決方法
ブランチの削除方法は以下のページに記載してあります！
[Gitでリモートのマージ済みのブランチを一括削除する]
(http://qiita.com/fukayatsu/items/b1a5e1c0b98acaa6261d)
[Git でマージ済みのブランチを一括削除する]
(http://qiita.com/kyanny/items/10a57a4f1d2806e3a3b8)

# おわりに & 感想
コーディング規約はもちろん、
空白やタブの混在や、ディレクトリ構成も意識しておけば、
更に他者が混乱せずに済むと思います。

今後も何かいい方法を知りましたら、追記していきます。
皆さまも、「このツールを使うとプロジェクトがスッキリするよ！」みたいなTipsがありましたら、コメントにてご教授くださいm(_ _)m
CalendarでISO週番号を正しく表示

ビルドインの `calendar.el` にある `calendar-intermonth-text` をカスタマイズすると，カレンダーに週番号を表示させることが可能．ただ， `calendar.el` に記載されている例だと， `calendar-week-start-day` が `1` 以外の時に計算結果がおかしくなる．
次のように `calendar-absolute-from-gregorian` に渡す値を補正するとうまくいく．

```cl
(setq calendar-intermonth-text
        '(propertize
          (format "%02d"
                  (car
                   (calendar-iso-from-absolute
                    (calendar-absolute-from-gregorian
                     (list month (- day (1- calendar-week-start-day)) year)))))
          'font-lock-face 'calendar-iso-week-face))
```

see also
- http://www.emacswiki.org/emacs/CalendarWeekNumbers
- http://stackoverflow.com/questions/21364948/how-to-align-the-calendar-with-week-number-as-the-intermonth-text
- https://blogs.msdn.microsoft.com/shawnste/2006/01/24/iso-8601-week-of-year-format-in-microsoft-net/
- https://discussions.apple.com/thread/7179260?start=0&tstart=0
- http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips20.htm
pytest-djangoで使用するDB名に接頭辞を付けない方法

# 目的
pytest-django実行時に使用されるデータベース名には、接頭辞として「test_」が付くが、通常modelが使うデータベース名と同じにしたい。

残念ながら、その方法が[公式サイト](http://pytest-django.readthedocs.org/en/latest/index.html)に書かれていなかったので、ソースを読んで調べたメモ。

使用例としては、以下を想定。

1. あらかじめ作成しておいたデータを使ってテストを実行する。
1. django内のAPIを実行して、APIにより更新されたデータ値をtest内で確認する。

## 例

```py3:settings.py
DATABASES = {
    'default': {
        'NAME': 'app_data',
    }
```

上記設定で`py.test --create-db`を実行すると、`test_app_data`が作られて使用されるが、`app_data`を使用したい。

```mysql:mysqlにログインしてテーブルを確認
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| app_data           |
| test_app_data      |
+--------------------+
```

# どうすればいいか？
`settings.py`の`DATABASES`に、以下の記述をすればOK。

### django1.8以上の場合

`'NAME'`と同列に、`'TEST'`をキーとしてdictを追加。
そのdict内に`'NAME'`をキーとしてDB名を指定する。

```py3:settings.py
DATABASES = {
    'default': {
        'NAME': 'app_data',
        'TEST': {
            'NAME': 'app_data',
        }
    }
```

### django1.7以下の場合

`'NAME'`と同列に、`'TEST_NAME'`をキーとしてDB名を指定する。

```py3:settings.py
DATABASES = {
    'default': {
        'NAME': 'app_data',
        'TEST_NAME': 'app_data',
    }
```
2016-01-16 Qiita > 1ページ表示に2MB消費するときがある｜2019-03-12 コメントにてサイズの調査

モバイルルータでQiitaのページを見たとき、トップページ表示だけで2MB消費したときがあった。

モバイルルータのデータ量制限があるので何が消費が大きいか調べているが、よく使うQiitaで1ページ2MBは結構大きい。しかし、常に2MB消費というわけではない。キャッシュが利いているのか?

ブラウザにて画像表示をオフにしたら当然のことながら、消費が数十KBまで落ちた。しかし、画像表示オフでの使用は本来のQiitaの使い方ではないのだろう。

自分がやりたいことはQiitaにある知見を調べたいだけである。
Kobitoで検索した場合は画像オフができず、消費は減らないだろう。


### コメントにてサイズの調査

@KEINOS さんによる[コメント](https://qiita.com/7of9/items/97a748b4d5062b43bb65/#comment-3cc0e53a197c24490228)にて、何がどれほどダウンロードサイズに影響があるか記載いただきました。

情報感謝です。


### 補足 (2019-11-01)

広告表示がされる前の調査結果です。
helm-swoop と org-mode を仲良くする（* を検索補完させない）


`M-s` を当てて使ってしまうほど個人的に重宝している helm-swoop は，org-mode とちょっと相性が悪い．helm-swoop は起動時に，カーソル下の単語を自動的に検索語として扱ってくれるが，org-mode だと見出しのスターが対象になることがしばしば．すると毎度ミニバッファの（\\*）を消さなといけない．
この問題は`helm-swoop-pre-input-function`をカスタムすることで回避できる．

```el
(with-eval-after-load "helm-swoop"
  ;; カーソルの単語が org の見出し（*の集まり）のとき検索対象にしない．
  (setq helm-swoop-pre-input-function
        #'(lambda()
            (unless (thing-at-point-looking-at "^\\*+")
              (thing-at-point 'symbol)))))
```

GIST: https://gist.github.com/takaxp/70e56c692adb1078779d
RPi > [未解決] 消費電力 > 消費電力の記載がひっかかった > 0.36A / 515mA

http://qiita.com/aviscaerulea/items/f815adb9321e6054ffe9
のリンク先の
[Raspberry Pi 2 Model Bの消費電力調査: 学習ノート](http://blog.hahasoha.net/article/163051972.html)に記載されている消費電力では一番大きい値が0.36Aとなっている。

自分が過去に調べたリンクでは
http://qiita.com/7of9/items/c8006ea52b52c6b41eb7
http://raspberrypi.stackexchange.com/questions/341/whats-the-current-draw-and-supply-voltage-tolerance
> 475mA ~ 515mA - LXDE/X11 on!, composite video, ethernet, PS2 KB&Mouse together on one USB port, mouse in use + CPU stress, LXDE/X11 on.

この二者の違いは何なのだろうか。

１つ目のリンクでは「電力チェッカ」でチェックしている。ということは、最大値ではなく平均値なのだと思われる。
２つ目のリンクは「最大値」計測、「平均値」計測のどちらなのだろうか?

自分が過去にバッテリー駆動のものを作ったときは、SD書き込みなど1,2秒間消費電力が上がる時があり、それを考慮するため「最大値」計測で上限を出していた。色々な機能が入ったものであれば、この「最大値」計測(何によって最大値になっているかを知ること)は難しいかもしれない。
Qiita / UI > フォロー中のタグ > UIが少しおかしい > 考察 > 修正されました

http://qiita.com/7of9/following_tags
で閲覧できる「フォロー中のタグ」のページ。

右側に「フォロー中」という緑色表示のボタンがあり、マウスオーバーすると赤色で「解除」と表示される。

「解除」表示中にマウス左クリックすると「そのタグのページへ飛ぶ」。<font color=red>さらに解除されている。</font>

以下のいずれかが本来のUIなのだと思う。

1. 「解除」表示中に左クリックするとタグフォローを解除する
2. 「解除」を表示せず緑色の「フォロー中」表示だけにしてボタンイベントはそのまま。しかし、その場合「フォロー中」表示でタグページに飛ぶという振る舞いは他のページのUIと齟齬が生まれる

同じ表示のボタン（緑色のフォロー中)に対して異なる振る舞いが用意されたUIになると、そのコンポーネントの説明をする時に「xxxの場合は」という条件が追加され混乱の元となる。

自分が作った過去ソフトの失敗からそういうUIは避けるように最近気を付けている。

## 修正されました
(追記 2016/01/19)

<font color=red>先ほど確認したところ、上記1の動作(解除される)に修正されてました。</font>
早速の対応感謝です。
向きが変わった後に CollectionView のセルのサイズの変更を適用する

カスタムキーボードの中で UICollectionView を使用している場合に、デバイスの向きが変わった後にセルのサイズを変更することができず、 landscape モードでレイアウトが崩れていた。

カスタムキーボード特有の話なのかわからないが、デバイスの向きが変わった後に ``- collectionView:layout:sizeForItemAtIndexPath:`` は呼ばれなくなり、セルのサイズの計算が portrait モードから変わってないのが原因だった。

それが何故なのかは分からないが、向きが変わった後に下記のメソッドを呼び出すことで解決された。 
      
```swift   
collectionView.performBatchUpdates(nil, completion: nil)
```

挿入、削除、読み込みなどを行うときに呼ぶことで、複数のアニメーションを一括で実行できるらしい。それだけだと今回の問題に適用できるようには読めないが、リファレンスによると下記の通り ``use it to change the layout parameters associated with one or more cells.`` とあるので、この部分が該当するのかな。


>You can use this method in cases where you want to make multiple changes to the collection view in one single animated operation, as opposed to in several separate animations. You might use this method to insert, delete, reload, or move cells or use it to change the layout parameters associated with one or more cells. Use the blocked passed in the updates parameter to specify all of the operations you want to perform.
技術英語 > We [are under the impression that] they would be held against their will.

@ Star Trek movie > 叛乱

捕らえられた仲間を助けに行ったら、その仲間が歓迎を受けていて、ピカード艦長が

> We <font color=red>are under the impression that</font> they would be held against their will.

字幕 「拘束されていると聞いていたが...」
下書き削除はスマホ表示で削除すると早い

## 通常の削除方法

* 削除時、確認がある。

![sakujo.png](https://qiita-image-store.s3.amazonaws.com/0/25728/591292b6-2d81-254e-3ab7-6ba24c7ef2b9.png)

## 画面を縮めた場合

* 画面を縮めるとスマホ表示になる。
* 削除時、確認がないのでさくさく消せる。

![sakujo2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2dee92d8-b158-c2f4-6a6c-e58f37e70f66.png)