OmniAICreator/Qiita-1.07M huggingface dataset:
私が遭遇した Twitter API の OAuth 認証はまりどころ


# 概要

Java でライブラリを使わず OAuth 認証を実装に挑戦. しかし, ひたすら 401 ではじかれた（泣）. 私の場合 URL エンコードが主な原因だったのでその対策を記載.

## Java で URL エンコードする方法

URLEncoder クラスの encode メソッドでエンコードできます.

``` java

public static String urlEncode(String target){
    String encode = "";

    try{
        encode = URLEncoder.encode(target, StandardCharsets.UTF_8.toString());
    }catch(Exception e){
        e.printStackTrace();
    }

    return encode;
}


```

## 署名用文字列の確認方法

実際に Twitter API を通すことのできる署名用文字列のサンプルはツールから生成して確認することができます.

* [REST APIs](https://dev.twitter.com/rest/public)
* [Streaming APIs](https://dev.twitter.com/streaming/over)

上記ページが Twitter API の公式リファレンス.
使いたい API を選択してページの最下部に表示すると OAuth Signature Generator があります. ジェネレーターから署名用文字列を生成できます. 

※ ジェネレーターを使うには [Application Management](https://apps.twitter.com/) でアプリを作成する必要があります


## はまったポイント

1. クエリパラメーターを URL エンコードしていなかった
2. 署名用文字列に追加するクエリパラメーターは URL エンコードされたものをさらにエンコードすることになる
3. API の中には POST でも URL にクエリパラメーターを含めなくてはいけないものがある

#### 1.クエリパラメーターを URL エンコードしていなかった

<strong>1</strong>に関してはまさにそのままの理由でした. テストで英文字しか使っていない場合, 意外と気づけなかったので注意.

#### 2.署名用文字列に追加するクエリパラメーターは URL エンコードされたものをさらにエンコードすることになる

<strong>2</strong>は署名用文字列を生成する際の注意点. すでにクエリパラメーターの段階でエンコードされているからエンコードしないのではなく署名用文字列生成時には再度, 各クエリパラメーターに対して URL エンコード行う必要があるようです. 

例）
`艦これ → %25E8%2589%25A6%25E3%2581%2593%25E3%2582%258C`

上記例だと２度エンコードされた結果 `%` がさらにエンコードされ `%25` となっています. このことはジェネレーターで確認すると分かります.

#### 3.APIの中にはPOSTでもURLにクエリパラメーターを含めなくてはいけないものがある

<strong>3</strong>はかなり悩まされました, API の `statuses/update` を例に挙げたいと思います.左記のエントリポイントはツイートの投稿に使えるのですがドキュメントでは POST で送信することになっています. そう思ってHTTPボディにクエリパラメーターを付加して送信しても 401 で失敗します.

これに関してはドキュメントの Example Request を見ると POST なのに URL にクエリパラメーターが付加されていることが分かります. Example Request 通りに POST でも URL にクエリパラメーターを追加すると投稿できました. どうやらエントリポイントの中には POST であっても URL にクエリパラメーターを含めなくてはならないものがいくつかあるようです.

ちなみに Streaming API [^1] の `statuses/filter` のエントリポイントは POST 通信で URL にクエリを付加する必要がないなど色々バラバラでした. 

## 結論

ドキュメントをしっかりと読まなくてはならない（小並感）. この記事が何かの参考になれば幸いです. ご指摘などあればご遠慮なくお願いいたします. 

[^1]: どうやら Streaming API は廃止された模様です [参考](https://mobilelaby.com/blog-entry-twitter-user-streams-api-available-until-aug-16-2018.html)
FATAL: Cannot load configuration from /home/yourname/chef-solo/dna.json が出て困る


Mac OS X 10.11.4
chef (12.5.1)
knife-solo (0.5.1)
という環境での話。


# 困ったこと

レシピを育てていて、途中で実行するユーザが変わるとこんな感じでエラーになる時がある。

```
:

Uploading the kitchen...
Generating solo config...
Running Chef: sudo chef-solo -c ~/chef-solo/solo.rb -j ~/chef-solo/dna.json
[2016-03-23T12:35:25+09:00] WARN: *****************************************
[2016-03-23T12:35:25+09:00] WARN: Did not find config file: /home/yourname/chef-solo/solo.rb, using command line options.
[2016-03-23T12:35:25+09:00] WARN: *****************************************
[2016-03-23T12:35:25+09:00] FATAL: Cannot load configuration from /home/yourname/chef-solo/dna.json
ERROR: RuntimeError: chef-solo failed. See output above.
```


# 対処法
~/.chef/knife-solo-sockets あたりにソケット（ファイル）ができてるので、

```
ls -lF ~/.chef/knife-solo-sockets                                                                                                                                                                                                
total 0
srw-------  1 yourserver  staff  0  3 23 12:35 testserver=
```

それを削除すると解消する。ワイルドだからディレクトリごといく。

```
rm -rf ~/.chef/knife-solo-sockets
```

たぶん間違えてるけど、解決するから良し。

(2016/07/13追記)

knife.rb に次のように記述すると ```~/.chef/knife-solo-sockets``` 配下にファイルを生成しなくなるようです。

```knife.rb
knife[:ssh_control_master] = "no"
```
【意訳】たった今、npmのパッケージを解放しました。

このポストは以下の記事を意訳したものです。
[I’ve Just Liberated My Modules - Medium.com](https://medium.com/@azerbike/i-ve-just-liberated-my-modules-9045c06be67c#.dnuo805ic)

Twitterでフロント系のエンジニアの方がざわついていたので訳しました。間違いが有りましたら、ご指摘いただけると幸いです。

以下、意訳。

----

数週間前、特許弁護士が私にメールをよこしました。メールの内容によると、私の作成した"kik"パッケージをnpmから削除せよ、とのことでした。返答としては"No"でしたが、弁護士からは次のような返信が来ました。"悪いとは思いますが、kikは我々の登録済の名称ですので、あなたの家に弁護士がやってきてあなたのアカウントを取り下げてもらうことになるでしょう。"

私が"kik"のコードを書き始めたとき、同名の企業があるなんて知りませんでしたし、企業に名前を変えさせられるなんてゴメンです。要求を拒絶された彼らは、npmのサポートに対して弁護士としての圧力をかけました。その時のメールのCCには全て、私が含まれていました。そして、[@izs](https://twitter.com/izs)(npmのCEO)は私の許諾無しにkikの所有権を変更してしまったのです。

このような状況を受けて私は、npmとは、企業が個人よりも力を持つような私有地なのだと気づきました。そしてなぜ私がオープンソース活動を行うかと言えば、個人の力を信じているからです。

まとめ： もはやnpmは私がオープンソース活動の結果を公開する場所ではありません。だから、[作成したパッケージ](https://gist.githubusercontent.com/azer/db27417ee84b5f34a6ea/raw/50ab7ef26dbde2d4ea52318a3590af78b2a21162/gistfile1.txt)は全て非公開にしました。

これは脊髄反射ではありません。私はオープンソースが好きですし、オープンソースのコミュニティはいつかnpmとは違って真に自由な場所を作るでしょう。

もし、パッケージを非公開にした影響で、あなたの開発に悪影響が出てしまったとしたら謝ります。対策として依存関係を直接レポジトリに向かせることもできますし、もしお望みならば、Githubにある私のパッケージ所有権を喜んで移譲します。

それでは。
mysqlのfloatは使わないほうが幸せになれる

# float使って驚いたのでメモ

floatのカラムに
387463300を入力 → 結果: 387463000
387463500を入力 → 結果: 387463000
387463600を入力 → 結果: 387464000

私はこれでポルナレフ状態になりましたwww


どうやら6桁までしか保存できないらしく、
6桁を超えると整数でも容赦なく切り捨てられるか
切り上げられてしまうみたい。

warningも出ないし、大きい数字を扱っている場合は
floatは使わないほうが無難

decimalとか使ったほうがいいんじゃないかな(震え声)

-----------------
追記
redshiftのfloatはどうやらものが違うらしく、普通に保存される
c++ builder > 数値の精度にはまる > FLT_EPSILON > std::lround() / SimpleRoundTo()

自作のグラフソフトでバグが見つかった。

以下の計算において、majorTickIncrement = 0.5, minorTickIncrement = 0.1の時に以下の計算が結果minorTickCount が3になる（本来は4)。

```cpp
int minorTickCount = axisPtr->majorTickIncrement / axisPtr->minorTickIncrement - 1;
```

詳細を見ていくと minorTickIncrement (フォーム入力）の値は0.1と入力した値が 0.100000001490116 になっている。
この誤差と割り算の仕組みにより 3 になるようだ。

(ちなみに 5.000... / 1.0.... - 1)の計算は4になり上記と様相が異なる。

## 対応1 > FLT_EPSILON

FLT_EPSILON分の誤差がminorTickIncrement に含まれたのかと思い以下のようにしたらきちんと4になった。

ただし、このあたりは詳細に見ていかないといけないだろう。

```cpp
#include <float.h>
...
float fval1 = axisPtr->majorTickIncrement;
float fval2 = axisPtr->minorTickIncrement;
fval2 = fval2 - FLT_EPSILON;
int minorTickCount = fval1 / fval2 - 1;
```

上記のコードでFLT_EPSILONを引かさない計算では3になる。
floatは7桁の精度だったと思うが、なぜ3になるかは未消化。

## ideoneで確認

http://ideone.com/ftpjlB
で確認したところ 4 になる。

C++ Builderのコンパイラの問題なのだろうか。


## 対応2 > std::lround() / SimpleRoundTo()

@termoshtt さんに std::lround()があるという情報をいただいた。

XE4で`include <cmath>`を追加して`std::lround()`を使おうとしたが、エラーのため使用できなかった。

lround()をキーとして検索するとXE4では `SimpleRoundTo()`という関数が近い処理をしているようだ。
以下はきちんと4になった。

```
float fval1 = axisPtr->majorTickIncrement;
float fval2 = axisPtr->minorTickIncrement;
int cnt3 = SimpleRoundTo(fval1 / fval2 - 1.0);
int nop=1; // for breakpoint
```

こちらもでいいだろう。

```
int cnt3 = SimpleRoundTo(fval1 / fval2) - 1;
```
Docker用ディストリビューションCoreOSをズボラなcloud-configでインストールしてみる

# そもそもCoreOSとは？
CoreOSとはDockerを動かすためのミニマムなディストリビューションらしいです。
~~頭のわるい~~私は「コンテナ型とはいえホストがミニマムなのはオーバーヘッドが少なくていいですね！」くらいな意味合いだと思っていて、今までCentOSをミニマム要件でインストールしたものをDocker用に使ってました。

しかし***etcdとfleet***が入っているのがポイントだった！
クラスタ環境向けツールが標準でインストールされているようです。
そのぶん、yumとかのパッケージ管理は入っていないんだが（コンテナで動かすから別にいらない）

ということで今Dockerが動いている安PC(ASUS VIVO PC VM40B)にCoreOSをとりあえずインストールしてみたいと思います。

※本稿ではcloid-config.ymlの記述は最低限にしてますのであしからず

# ISOダウンロード～インストールディスク作成

ISOはここからダウンロードできます。 https://coreos.com/os/docs/latest/booting-with-iso.html
ISOをCDとかに焼いて早速ブート！といきたいところですが…
VivoPCにはCDドライブとかないのでUSBにISOを焼いていきます。
私はよくUSBWriterを使ってます。
USBWriter https://sourceforge.net/projects/usbwriter/files/

# USBから起動！　……あれれおかしいぞぉ？？

VivoPCには旧型のbiosではなくUEFIが入っています。これがやっかいで、CoreOSのインストールディスクは***EFIで起動しません***。
仕方ないのでセキュアブートを無効にする方法を考えます。

電源をいれてF2かDelを押してUEFIに入った後、
起動→CSM→起動デバイス制御を "UEFIのみ" から "レガシーOPROM" に切り替えます。

そして再起動

# インストール～SSH設定まで
起動はかなり早いです。
起動したらSSHはすでに使えるようになっているのですが、
autoLoginに設定されているユーザー名 core にはパスワードが設定されていないので
sshで入れない…　そこで…

```bash:
sudo passwd core
```
でパスワードを設定します。


んで、ここからはコピペが多くなるのでsshで入り直しましょう！

# cloud-configってめんどくさいよね(最小の項目でインストールするぞ)
どうせクラスタ環境にもしない ~~（お金ないし）~~ のでここら辺は適当にいこうと思います。

今回はユーザー名coreos で設定します。
パスワードもこの際に設定するのですが、平文で打つのはアカン。
ということでハッシュを作っておきます。

```bash:
mkpasswd -m sha-512 hogehoge > cloud-config.yml
```

hogehogeがパスワードです。ハッシュ化されたものがcloud-config.ymlに書き込まれます。

そして…

```bash:
vi cloud-config.yml
```

でひらいて次のような項目を入力します。

```bash:
#cloud-config

  hostname: "coreos"
  users:
    - name: "coreos"
      passwd: $6$biKaxs～～
      groups:
        - "sudo"
        - "docker"
```

name は ユーザー名
passwd の項目には先ほど生成されたハッシュ化されたパスワードを設定して下さい。
gloups を"sudo"と"docker"にしておけばここで難しい設定をしなくてもインタラクティブに設定できる（はず）

最低限これくらいでクラスタ使わないなら動作的にはなんとかなります。




一応文法が間違えていないか確認してみます。

```bash:
sudo coreos-cloudinit -validate=true -from-file=./cloud-config.yml
```

networkやNICの設定が必要みたいですが
無くても何とかなりました。（環境による？）

クラスタにするとかNICが複数ある場合なんかは必須だと思う

# HDDにインストール！（＋ハマったところ）

ここまで来たらあとはHDDにインストール！

……


といきたいのですが…
ちょっとだけハマりました。

```bash:
sudo coreos-install -d /dev/sda -C stable -c cloud-config.yml
```

これでインストールできるはずですが…

```bash:結果
(略)
blockdev: ioctl error on BLKRRPART: Device or resource busy
```

は？なんだよこれ。

どうやらHDDに別のOSがインストールされていたりすると
上手くいかないみたいですね。

ということでfdiskで消しちゃいましょう

```bash:
sudo fdisk -l
```

でインストール先を確認

```bash:結果
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
```

/dev/sda のようです。

```bash:
sudo fdisk /dev/sda
```

パーティション確認はp
パーティション削除はd
パーティション作成はnです

で整えたらwで書き込みします

これでHDDは整いました。

もう一度

```bash:
sudo coreos-install -d /dev/sda -C stable -c cloud-config.yml
```

でインストールできるはずです！（successとかでます）
お疲れ様でした。


# まとめ
ズボラなのは正義なのです！
Pepperを喋れなくする恐怖の呪文

PepperのALTextToSpeechを落としてしまう、恐怖の呪文があります。
これを食わせると、
・再起動するまでしゃべれない。
・再起動しようにも正常に終了さえしない。（要長押し終了）
・頭を３秒かくして寝かすことはできるけど、寝かせたら起きない。
という症状になります。
長押しで終了して、再起動してください。

方法はいたって簡単です。
ロボットページ（pepperの名前.local　大抵の場合はpepper.local）にアクセスして、
セリフのところに、
<>（半角の不等号）と入れてください。
再起動しないかぎり二度とpepperはしゃべりません。
HTMLのPerseとかする場合は気をつけないといけませんね。

コマンドラインとかでテストする場合は、
```
qicli call ALTextToSpeech.say "test"
```
だとちゃんとtestとしゃべりますが、
```
qicli call ALTextToSpeech.say "<>"
ERROR: basic_string::compare
```
とやると、もう２度と再起動までしゃべりません。

怖いですねー。みなさんは真似しないように！
git-bash.exeからherokuにログインできません

初めまして。私は、Node.jsについてつい三日前から勉強し始めた、Heroku初心者のNozです。
Node.jsのアプリを制作するために、Herokuにアカウント登録をして、Heroku Toolbeltをインストールしました。
まずgit-bashのコマンドでherokuへのログインを試みた($heroku login)のですが、
$ heroku login
Enter your Heroku credentials.
Email:(ここで登録したEメールアドレスを入力しました)
Password (typing will be hidden):
Login is currently incompatible with git bash/cygwin
In the meantime, login via cmd.exe
https://github.com/heroku/heroku-cli/issues/84
と表示され、ログインできません。Eメールアドレスは間違えていないはずです。
また、コマンド上ではパスワードとIDの入力は恐らく求められていないはずです…
昨日一日がかりで色々調べたり試してみたのですが、何も解決できませんでした…
解決方法が分かる方、どなたか教えていただけると幸いです…
WordpressサイトをHTMLとして書き出す

![Simply Static](https://qiita-image-store.s3.amazonaws.com/0/107857/d95e6c9a-309f-6e91-e172-30d951b15bd2.png)

WorspressでできたサイトをHTMLとして書き出すプラグインです（zipまたはそのまま）。
[Staticpress](http://ja.staticpress.net/)がwindowsに対応していないそうなので、代わりにこちらを使用します。
今回は、USBメモリ内にXAMPPとWordpressをインストールし、windows7で使用しました。

[Simply Static](http://codeofconduct.co/simply-static/)
[Simply Static - Wordpress Plug-in](https://ja.wordpress.org/plugins/simply-static/)

***

### デフォルトで書き出されるファイル

* 投稿（post）
* メディア
* コメント



## General Settings

#### Destination URL
書き出しファイル内のリンクパス

#### Delivery Method
「zipでダウンロード」or「ディレクトリを指定して圧縮せずに保存」

#### Local Directory
ファイルの保存先
（Delivery Methodが"Local Directory"の場合のみ設定します）



## Advanced Settings
#### Additional URLs
デフォルトで書き出されるポストタイプ以外を設定（固定ページやカスタム投稿タイプ）

#### Additional Files and Directories
Ajaxで取得したファイル等を追加するときに使用（ディレクトリごと設定します）



## その他
Windows7でStaticpressを使うと、ファイルのアクセス権を変更できないため（？）mkdirできずエラーが出ます。
パーマリンクの末尾を`/`にしておくと、自動的に`index.html`として書き出されます（`/%category%/%postname%/index.html`というあんばい） 。
Wordpressをインストールしたての状態では、書き出し時間は1〜2分ほど。サイトの規模によって書き出しにかかる時間は変わります。
Capistrano でデプロイした際のディレクトリ構成例



```
app_root
	current				-> app_root/releases/yyyymmddHHMMSS	# 現在のリリースバージョン
	releases
		yyyymmddHHMMSS	# リリースバージョン（タイムスタンプ）毎のディレクトリ
			log			-> app_root/shared/log
			tmp
				cache	-> app_root/shared/tmp/cache
				pids	-> app_root/shared/tmp/pids
			public
				assets	-> app_root/shared/public/assets
				system	-> app_root/shared/public/system
				
	shared
		bundle			# bundlerが管理するgemのインストール先
		log				# ログファイル
		public
			assets		# Asset Pipeline で生成されたjs/css
			system		# アップロードファイルなどの格納先
		tmp
			cache		# Railsのキャッシュ
			pids		# pidファイル

```

bundle install する際は --path オプション付けて

```
$ bundle install --path /path/to/app_root/shared/bundle 
```

のようにインストールする
サイトのデータ移行などでよく使うwgetのオプション指定を逆引きでメモしておく

完全に自分向けの備忘録です。

ウェブサイトのデータ移行や調査などを行う際、よくお世話になるのがwget。

オプションが豊富で、たいがいなんでもできてしまうのですが、「これをやりたいときにどうオプションを指定すればよいか」という、目的から逆引きで考えると、迷うことが多い。

忘れないように、メモしておきます。

## ウェブサイトのデータを丸ごと取得したい

```
wget -r http://example.com
```

よく使う

## ウェブサイトのデータを上位3階層に限定して取得したい


```
wget -r -l 3 http://example.com
```

-l はlevelの略。-l の後に数字を付与して階層を限定する

## wget実行中に取得状況を表示しない


```
wget -q -r http://example.com
```
-q はquietの略。


## 日本語ファイルを文字化けせずに取得したい

```
wget --restrict-file-names=nocontrol -r http://example.com
```
--restrict-file-names オプションは、エスケープ処理の方法を決めるオプション。nocontrolをつけると、何も手を加えずそのままwgetする。

"unix"を指定すると、"/(スラッシュ)" ほかコントロール文字列をエスケープ処理する。"windows"などの指定もできる。

詳しくはマニュアル参照。

https://www.gnu.org/software/wget/manual/wget.html


## ファイルに記述されたURLリストに従いwgetしたい。ただし階層構造はそのままで取得したい

```
wget -x -i list.txt
```

単純にリストに基づきファイル類をwgetするなら、-i ファイル名 でok。-x オプションをつけると、階層構造を保持するために、必要に応じてディレクトリを自動的に生成する。

-xオプションを付けない場合、wgetコマンドを実行したディレクトリ上にすべてのファイルを保存してしまう。


## .htaccess で画像引用を制限しているサイトのデータをすべて取得する

```
wget -r http://example.com --referer="http://example.com"
```

外部のウェブサイトに画像を引用されないように.htaccessで制限をかけている場合があります。例えば以下の様な設定。

```
SetEnvIf Referer "^http://example\.com" ref_ok
order deny,allow
deny from all
allow from env=ref_ok
```

この場合、リファラを指定して、同一ドメイン内からのアクセスしているように見せることでファイルの取得ができる。

## ユーザーエージェントを指定してデータをすべて取得する

```
wget -r http://example.com --user-agent="Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36"
```

--user-agent で指定する。例は Widnows + Chrome でwgetしている。
iOS や Android も指定可能

## あるサイト内の jpg,png,gif といった画像ファイルのみ取得したい

```
wget -A jpg,gif,png -r http://example.com
```

-A はaccept の略。ダウンロードしたいファイルの拡張子を、-A の後にカンマ区切りで指定する。マニュアルを見ると、ワイルドカードなども使えるらしい。

## あるサイト内のjpg,png,gif といった画像ファイルを除外してデータ取得したい

```
wget -R jpg,gif,png -r http://example.com
```

先ほどのパターンと逆。-Rはrejectの略。-Aオプション同様に、カンマ区切りで指定してダウンロードしたくない拡張子を記述する。

以後、随時追記予定


参考:
http://www.rationallyparanoid.com/articles/wget.html
https://www.gnu.org/software/wget/manual/wget.html
Rubyプロセスが今ソースのどの行を実行しているか表示させる（シグナルを利用）

Rubyスクリプトに予めシグナルハンドラを仕込んでおくことにより、シグナルを送ってその時点で実行していた行（を含むスタックトレース）を表示させる。

スクリプトに仕込むコード

```rb
Signal.trap('USR2') do
  pid = Process.pid 
  puts "[#{pid}] Received USR2 at #{Time.now}. Dumping threads:"
  Thread.list.each do |t| 
    trace = t.backtrace.join("\n[#{pid}] ")
    puts "[#{pid}] #{trace}"
    puts "[#{pid}] ---"
  end 
  puts "[#{pid}] -------------------"
end
```

サンプルスクリプト

```rb
Signal.trap('USR2') do
  pid = Process.pid 
  puts "[#{pid}] Received USR2 at #{Time.now}. Dumping threads:"
  Thread.list.each do |t|
    trace = t.backtrace.join("\n[#{pid}] ")
    puts "[#{pid}] #{trace}"
    puts "[#{pid}] ---"
  end
  puts "[#{pid}] -------------------"
end

puts "pid = #{Process.pid}"

@sum = 0

def add(num)
  @sum += num
end

def main
  @sum = 0
  while true
    add(1)
    add(2)
    add(3)
  end
end

main()
```

実行例

```shell-session
$ kill -USR2 20720
```

```shell-session
[22108] Received USR2 at 2016-03-23 11:50:10 +0900. Dumping threads:
[22108] hoge.rb:5:in `backtrace'
[22108] hoge.rb:5:in `block (2 levels) in <main>'
[22108] hoge.rb:4:in `each'
[22108] hoge.rb:4:in `block in <main>'
[22108] hoge.rb:17:in `call'　　　　　　　　　　　
[22108] hoge.rb:17:in `add'    ← callの下。ここが実行中だった部分
[22108] hoge.rb:25:in `main'
[22108] hoge.rb:29:in `<main>'
[22108] ---
[22108] -------------------
```

参考
http://varaneckas.com/blog/ruby-tracing-threads-unicorn/
[備忘録]laravel5のエラーメッセージの日本語化



1. /resources/langフォルダ下に、jaフォルダを作成


2. /resources/lang/en/validation.phpをjaフォルダにコピー


3. jaフォルダ下の、validation.php内のメッセージを日本語にする。


4. /config/app.phpの'locale'を'ja'に設定する。


5. フィールド名の日本語化は、
画面が少ない、フィールド名が被らないとかであれば、
validation.phpのattributesで定義。
でなければ、以下、コントローラーで定義


6.コントローラでの定義方法。。。
exp.

```
$rules = ['email' => 'required|email',
	     'password' => 'required|max:20',];

$attrs = ['email' => 'メール', 
	      'password' => 'パスワード'];

$v = \Validator::make($request->all(),$rules);
$v->setAttributeNames($attrs);

if ($v->fails())
{
	logger("@@@@ validation failed!!!!");

    // 値が復元されなかったのでコメントアウト({{old('hoge')}}ででなかった。。。)
    //return redirect()->back()->withErrors($v->errors());

	// 入力画面に戻る。。。
	$this->throwValidationException($request, $v);

}
```
Mac OS X LibreOffice Calc セル内で改行する方法



メモ


* ググると、Ctrl + Enter, Alt + Enter 書いてあるが、なぜか自分の環境では、command + Enter
* Windows用英語キーボードだと、どれも効かないっぽい(改行方法を探し切れない。キーマッピングの変更が必要?)


わかる方いたら教えて下さい。
JSPM_GITHUB_AUTH_TOKENをコマンドラインで生成する

```
echo -n "ユーザー名:アクセストークン" | base64
```

echoの`-n`が重要。もしくは`-e`を使って次のようにしてもOK

```
echo -e "ユーザー名:アクセストークン\c" | base64
```

`jspm registry config github`して`export`する方法だと対話型で一発で生成出来ないし、いちいち`~/.jspm/config`が書き換えられて面倒だった。
jsdoでズンドコ　その2

#概要
threeでやってみた。
#jsdo.it
http://jsdo.it/ohisama1/698d
#写真
![zun.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/af946139-746e-f83e-a1ee-ca170dbcb01d.png)
Twitterみたいに表示時刻を何時間前みたいに表示するやり方

参考サイト
http://inter-arteq.com/ruby-on-rails%E3%81%A7twitter%E3%81%BF%E3%81%9F%E3%81%84%E3%81%AB%E6%99%82%E5%88%BB%E3%82%92%E2%97%8B%E2%97%8B%E5%89%8D%E3%81%BF%E3%81%9F%E3%81%84%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/
その関数に直接関係ない部分を別の関数にする（無関係の下位問題を抽出する - リーダブルコードより）

## 基本思想

> 1. 関数やコードブロックを見て「**このコードの高レベルの目標は何か？**」と自問する。
> 2. コードの各行に対して「高レベルの目標に直接的に効果があるのか？　あるいは、無関係の下位問題を解決しているのか？」と自問する。
> 3. 無関係の下位問題を解決しているコードが相当量あれば、それらを**抽出して別の関数にする**。

重要なのは太字の部分で、要は「**その関数に直接関係ない部分を別の関数にする**」ということだと思います。


## 無関係の下位問題を抽出する例

`findClosestLocation`関数の高レベルの目標は、「与えられた地点から最も近い位置を見つける」ことです。


```js
// 与えられた緯度経度に最も近い'array'の要素を返す。
// 地球が完全な球体であることを前提としている。
var findClosestLocation = function (lat, lng, array) {
	var closest;
	var closest_dist = Number.MAX_VALUE;
	for (var i = 0; i < array.length; i += 1) {
		// 2つの地点をラジアンに変換する。
		var lat_rad = radians(lat);
		var lng_rad = radians(lng);
		var lat2_rad = radians(array[i].latitude);
		var lng2_rad = radians(array[i].longitude);

		// 「球面三角法の第二余弦定理」の公式を使う。
		var dist = Math.acos(Math.sin(lat_rad) * Math.sin(lat2_rad) +
		                     Math.cos(lat_rad) * Math.cos(lat2_rad) *
		                     Math.cos(lng2_rad - lng_rad));
		if (dist < closest_dist) {
			closest = array[i];
			closest_dist = dist;
		}
	}
	return closest;
};
```
このサンプルの場合、

- 2つの地点をラジアンに変換する
- 「球面三角法の第二余弦定理」の公式を使う

の部分が無関係の下位問題のため、抽出して`spherical_distance`関数とします。

```js
var spherical_distance = function (lat1, lng1, lat2, lng2) {
	var lat1_rad = radians(lat1);
	var lng1_rad = radians(lng1);
	var lat2_rad = radians(lat2);
	var lng2_rad = radians(lng2);
	// 「球面三角法の第二余弦定理」の公式を使う。
	return Math.acos(Math.sin(lat1_rad) * Math.sin(lat2_rad) +
	                 Math.cos(lat1_rad) * Math.cos(lat2_rad) *
	                 Math.cos(lng2_rad - lng1_rad));
};
```

結果的に`findClosestLocation`関数は高レベルの目標である「与えられた地点から最も近い位置を見つける」ことに集中できるようになりました。

```js
var findClosestLocation = function (lat, lng, array) {
	var closest;
	var closest_dist = Number.MAX_VALUE;
	for (var i = 0; i < array.length; i += 1) {
		var dist = spherical_distance(lat, lng, array[i].latitude, array[i].longitude);
		if (dist < closest_dist) {
			closest = array[i];
			closest_dist = dist;
		}
	}
	return closest;
};
```

## コードを分割するメリット

- 単純に可読性が向上する
- 部品に分けることでテストがしやすくなる
- 本質的な課題に集中できる

コードを分割することによって、単純にコードが読みやすくなるという利点があります。しかし、そのためにはある程度理解しやすい関数名をつける必要はあると思いますが。


また、部品ごとにテストがしやすくなるというメリットもあります。１つの関数が複雑で長いと、テストも複雑になってしまうでしょう。

一番重要なのは最後の**本質的な課題に集中できる**ことだと思います。先の例では、複雑な数学の計算式を別の関数とすることで、本質的な問題に集中できるようになっています。

## コードを分割するデメリット

- 分割を過度に行うと関数の処理を追うのが面倒になる

分割後の関数をさらに深い階層に分割していくのはやめておいたほうがいいと思います（縦に広げるイメージ）。

しかし、これを嫌って関数の分割をやめるのは本末転倒なので、普段関数を分けることを意識していない場合は「やりすぎかな？」などと考えすぎずに分割するのも良いかなと思います。

## 参考
> - [リーダブルコード――より良いコードを書くためのシンプルで実践的なテクニック](https://www.oreilly.co.jp/books/9784873115658/)
>     - 第III部　コードの再構成
>        - 10章　無関係の下位問題を抽出する
Vimでejsファイルを開いてもシンタックスハイライトされたい

DOCTYPE宣言しているファイルだとちゃんと色がつくのですが、
インクルードファイルだと色がつかないのです :finnadie: 

vimrcに以下の設定の記述します。

```
NeoBundle 'nikvdp/ejs-syntax'
```

```

autocmd BufNewFile,BufRead *.ejs set filetype=ejs
autocmd BufNewFile,BufRead *._ejs set filetype=ejs

function! s:DetectEjs()
    if getline(1) =~ '^#!.*\<ejs\>'
        set filetype=ejs
    endif
endfunction

autocmd BufNewFile,BufRead * call s:DetectEjs()
```



参考URL
http://stackoverflow.com/questions/4597721/syntax-highlight-for-ejs-files-in-vim
spring boot で 特定の url だけcsrf チェック除外する(修正済)

spring-boot で WebSecurity つかうと /hoge/... への POST でも csrf トークンのチェックが入るので、特定 url だけ除外してもらう。


```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    ...
	@Override
	protected void configure(HttpSecurity http) throws Exception {
        ...
		http.antMatcher("/hoge/**").csrf().disable(); // これ
        ...
	}
    ...
```

は間違ってた!!!!

```java
http.antMatcher("/hoge/**").csrf().disable();
```

じゃなくて

```java
http.csrf().ignoringAntMatchers("/hoge/**");
```

だった。

メソッドチェインの結果に関してよくわからんのでもっと調べます。

ちょっと調べました。

前者の http.antMatcher("/hoge/**").csrf(); みると、

```java
org.springframework.security.config.annotation.web.configurers.CsrfConfigurer@ac461fc[csrfTokenRepository=org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository@3a75ad21,
requireCsrfProtectionMatcher=org.springframework.security.web.csrf.CsrfFilter$DefaultRequiresCsrfMatcher@1f5ca70,
ignoredCsrfProtectionMatchers=[],
securityBuilder=org.springframework.security.config.annotation.web.builders.HttpSecurity@8c6f8a4,
objectPostProcessor=org.springframework.security.config.annotation.SecurityConfigurerAdapter$CompositeObjectPostProcessor@274f1586]
```

となってて、後者の http.csrf().ignoringAntMatchers("/hoge/**") は


```java
!!!org.springframework.security.config.annotation.web.configurers.CsrfConfigurer@ac461fc[csrfTokenRepository=org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository@3a75ad21,
requireCsrfProtectionMatcher=org.springframework.security.web.csrf.CsrfFilter$DefaultRequiresCsrfMatcher@1f5ca70,
ignoredCsrfProtectionMatchers=[Ant [pattern='/hoge/**']],
securityBuilder=org.springframework.security.config.annotation.web.builders.HttpSecurity@8c6f8a4,
objectPostProcessor=org.springframework.security.config.annotation.SecurityConfigurerAdapter$CompositeObjectPostProcessor@274f1586]
```

こうなってた。antMatcher さきにやっても csrf() はそれに対して適用されるわけじゃないんですね。

直感的に書いてもダメなもんはダメという例だったのかな。
José Valimさんのstackoverflowに学ぶ「Elixirによる簡易無限ループ」を実装して常駐プロセスとして動かしみよう！

## 1. やりたいこと

Elixirで無限ループってどうやって書くのかなー、と、GenServerを利用しているライブラリをGitHubで漁りながら眺めていたのですが、なかなかないなー、と。

そんな時に、José Valimさんがstackoverflowで、同じような質問をしている人に快く回答しているのを見かけました。

* http://stackoverflow.com/questions/30568806/which-otp-behavior-should-i-use-for-an-endless-repetition-of-tasks

## 2. 実装して動かしてみた

### 2-1. 自分でも写経ベースで試してみた

S3に保存したテストデータをランダムに加工しながら、kinesisに等間隔秒に流し込むモジュールを作りたかったので、下記のように実装してみました。

```ex
defmodule GenerateTestData4kinesis.Runner do
  @moduledoc"""
  S3からデータを取得してkinesisにテストデータを流し込みます
  """
  use GenServer
  require Logger

  @doc"""
  """
  def start_link do
    GenServer.start_link(__MODULE__, [], name: :generate_test_data4kinesis)
  end

  @doc"""
  """
  def init([]) do
    my_loop()
    {:ok, []}
  end

  @doc"""
  """
  def my_loop do
    Process.send_after(self(), :my_work, 1_000)
  end

  @doc"""
  """
  def handle_info(:my_work, state) do
    state = put_data(state)
    my_loop()
    {:noreply, state}
  end

  @doc"""
  kinesisにデータを流し込む処理です
  """
  def put_data(state) do
    GenerateTestData4kinesis.main([])
  end

end
```


1. `Genserver.start_link`が呼ばれる
2. `init([])`が呼ばれる
3. `my_loop`が呼ばれる
4. `my_work`が呼ばれる
5. `handle_info`で、`put_data`が呼ばれる
6. `handle_info`の中で、再度、`my_work`が呼ばれる

以下、4,5,6の繰り返し、となります。


### 2-2. メイン処理

上記をコールするメインは以下のようにしました。
実態の処理は割愛します。

```ex
defmodule GenerateTestData4kinesis do
  @moduledoc"""
  """

  require Logger
  use Application

  @doc"""
  """
  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
      worker(GenerateTestData4kinesis.Runner, [])
    ]

    opts = [strategy: :one_for_one, name: GenerateTestData4kinesis.Runner]
    Supervisor.start_link(children, opts)
  end

  @doc"""
  """
  def main(args) do
    #write your code
  end

end
```

### 2-3. 常駐プロセスとして動かしちゃう

MIX_ENVはお好みで、ということで、下記のようにキックすることで永遠と動き続けるプロセスを立ち上げることができました。

```ex
MIX_ENV=***** elixir --detached  -S mix run -e "GenerateTestData4kinesis.start(:fuga,:hoge)" --no-halt
```

`ps -ef | grep elixir`とかすると、動いているのが確認できます。
でもバックグラウンドでログを出すとかしてあげないと何やってるのかはわからなくなりますね。。

なお、`start`の引数は特に、今回評価していないので、意味なしなものを渡しています。


## 3. もうちょっとstackoverflowを見てみた


下記のような質問も上がってました。
Streamでも行けんじゃね？的な感じでしょうか。

```	
Why not a Task that does its stuff periodically in an infinite loop (possibly powered by Stream.interval or Stream.repeatedly)?
If this is just a periodical pull that forwards the pulled data further to the system, it doesn't really need to be a GenServer, right.
Task is still OTP compliant, and to me it seems more straightforward for the job. 
```

v1.3からだとできるようになるよー、とのことです。とはいえ、この質問が2015のものだから、2016現在はどんな状況なのかも、また別の機会に見てみようと思います。

```
The reason is that Task cannot receive system messages.
We want to make Stream and friends aware of those but it isn't in 1.0 and possibly will only be in 1.3. 
```

## 4. 所感

結構、簡単に書けちゃうんだなー、と思いました。
ウェブアプリケーションとかじゃなくて、日々の運用系スクリプトとか調査系のスクリプトもElixirの方が書きやすいのかな、といった印象です。

ただ、最新のやり方なのかどうかの確信はないので、もうちょっと公式doc等々見ながらキャッチアップしていこうと思います。Streamも面白そうですしね！＾＾

## 5. 参考

* [[翻訳] Elixirのストリーム](http://qiita.com/HirofumiTamori/items/abf9a9478bfc1161000c)


---

本日は以上となります。
Xperia AX SO-01E　による特徴？

Xperia AX SO-01E

対象機種　「Xperia AX SO-01E」　Android4.0 Android4.1  

ソースの中に```<img src="">```など一つでもあると(コメントアウトしていても)同じページを２回ロードしてしまう。
決済のあるwebサイトなどは、トランザクション処理でエラーが出て決済を行えなくなってしまうので、気をつけてください。
よく使うvimコマンド

グレップ検索：gr
入れ替え：ctl+w+r
インデント修正：
　Shift＋vキーを押下
　9行目まで移動
　＝キーを押下
元いた場所に戻る: <C-o>ｑ
元いた場所に進む: <C-i>
コメントアウト:ビジュアルモードでgc      gcc
set paste
:e  ファイルをリロード
di( かっこの中消す
ysiw( かっこで囲む
ds" ダブルクォート(")を削除
：レコーディング
qa でスタート qで終了 @aで繰り返し

ctrl + u	半画面分 上へ
ctrl + d	半画面分 下へ
ctrl + b	一画面分 上へ
ctrl + f	一画面分 下へ
iTerm2でoh-my-zhsを使う

## iTerm2のインストール
こちらからどうぞ。
http://iterm2.com/

## 自動的にzshが起動するように変更する。
まず、下記のコマンドを叩いてください。

```
cat /etc/shells
```

すると、以下が表示されますね。（人によっては少し表示が違うと思いますが…）

```
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
```

上記は、ログインした時に自動で起動できるシェルの一覧です。

/bin/zshがあることを確認したら、下記のコマンドでzshに変更します。

```
chsh -s /bin/zsh
```

コマンドを叩いた後は、ターミナルを再起動し、zshが自動で起動されることを確認してください。

## oh-my-zshを使ってターミナルを分かりやすくする。
下記を実行してインストールします。

```
curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
```

下記コマンドを叩いて設定ファイルをいじります。

```
vim ~/.zshrc
```

下記の記述の

```
# Set name of the theme to load.
# Look in ~/.oh-my-zsh/themes/
# Optionally, if you set this to "random", it'll load a random theme each
# time that oh-my-zsh is loaded.
ZSH_THEME="robbyrussell"
```

ZSH_THEME="robbyrussell"のrobbyrussellを好きなテーマ名に変更します。
テーマに関しては、以下のページを見て選んでみてください。（いっぱいありますね・・・！）
https://github.com/robbyrussell/oh-my-zsh/wiki/Themes

以上ですー。
naming > しばらく起こっていなかった状態から起こったイベント


イベント処理をしていて、以下をあらわすboolフラグ変数を使いたい。
その名前は何がいいか?

- しばらく起こっていなかった状態から起こったイベント

上記の対比としては「すぐ直前(10sec以内)にも起こっているイベント」。

## 変数に使えるかどうかなキーワード 

ハードウェアなどからの用語も拝借

- cold start event: ハードウェアでしばらく電源を切っていた状態からstartした時にcold startと言う. しかし本当のcold startのイベントと勘違いしそうだ

- first event: 例 > After the interval of 10 sec or more, でイベントが発生した時にfirst event = trueに設定する。本当の「first」ではないような気もする

- cold-on event: 造語.
DB設計をする時に見ておきたいページ

他にもおすすめあったら教えて下さい。

* [SQLアンチパターン 幻の第26章「とりあえず削除フラグ」](http://www.slideshare.net/t_wada/ronsakucasual)
* [DELETE_FLAG を付ける前に確認したいこと。](http://qiita.com/Jxck_/items/156d0a231c6968f2a474)
* [共通カラムについて考える](http://su-kun1899.hatenablog.com/entry/2015/10/14/230000)
* [イミュータブルデータモデル(入門編)](http://www.slideshare.net/kawasima/ss-40471672)
* [イミュータブルデータモデル(世代編)](http://www.slideshare.net/kawasima/ss-44958468)
* [RDBアンチパターン](https://speakerdeck.com/soudai/rdbantipatan)
macでBluetoothのマウスなどが認識しなくなったとき

ターミナルで以下を実行。
Yosemite 10.10.5 で確認。


```
sudo kextunload -b com.apple.iokit.BroadcomBluetoothHostControllerUSBTransport
sudo kextload -b com.apple.iokit.BroadcomBluetoothHostControllerUSBTransport
```
新人プログラマ応援 > 静かに淡々と仕事を進めている人を探す

プログラマというより仕事について。

- 静かに淡々と仕事を進めている人を探す

周囲に、物事をきちんと整理して、トラブル対応などを淡々と進めている人がいるかもしれない。
そういう人の仕事の仕方を学ぶことで、トラブル対応をスムーズにできる技能が身につくかもしれない。

トラブル発生時

- Aさん: 冷静な状態で情報を整理し、原因を突き止め、その対処をし、報告する
- Bさん: 冷静でない状態で大きな声でトラブルの対応をするが、原因をなかなか突き止められない。周囲を巻き込みながら色々トライした結果、対応が完了する。報告は時々する。

こういう事例が重なった場合、Bさんの方がAさんより仕事をしているように見えるかもしれないが、実はその裏でAさんがもっとたくさんのトラブル対処をしている、ということもある。

Aさんタイプの人が近くにいれば、その人から学ぶことは多い。

一方で、自分のトラブルで一人で考えても解決できそうにないことについては、周囲を巻き込むことも大切。その点ではBさんのやり方にも良い点はある（いつもそれがいいというわけではない）。
技術英語 > How does 72 hours sound? / Like 24 hours too long. > SGTM

@ Star Trek Voyager > PROTOTYPE

故障した船の修理を急ぐJaneway.
修理にどれくらいかかるかをキムに尋ねると、キムは

Kim > <font color=red>How does 72 hours sound?</font>
Janeway > Like 24 hours too long.

<hr>
関連して思い出したのは

SGTM
> Sounds Good to me.

http://netforbeginners.about.com/od/s/f/What-Is-SGTM.htm
メモ: MultiSystem

* proxmox4のホストには依存関係の問題でインストールできない。

## インストール

* [使い方](http://www.pendrivelinux.com/multiboot-create-a-multiboot-usb-from-linux/)
* [download](https://sourceforge.net/projects/multisystem/files/apt/dists/all/main/binary-amd64/m/)

```
dkpg -i multisystem_1.0243_all.deb
apt-get install -y
dkpg -i multisystem_1.0243_all.deb
```
ES2015(ES6)で書かれたReact.jsコードのビルド環境を作る(Grunt + browserify + babel + babelify)


爆速で作る。とりあえず今回はminifyとかconcatとかしない。

## パッケージインストール 

まずは必要なパッケージをnpmでインストール。

```zsh
$ npm install react react-dom grunt grunt-cli grunt-contrib-watch grunt-browserify grunt-babel babel-preset-react babel-preset-es2015 babelify
```

### babel
babelはES6仕様で書かれたjsをES5に変換してくれるツール。という認識だったんだけど、他にも色々とファイルの変換をやってくれるみたい。jsx→jsもやってくれる。
で、`grunt-babel`はgruntでbabelを使えるようにしたもの。

babelのバージョンが6.0以上の場合、babelの用途毎に分割されたモジュールを別でインストールする必要がある。
今回は`babel-preset-es2015`と`babel-preset-react`。
`babel-preset-es2015`はES6(ES2015)で書かれたコードをES5に変換してくれるもので、`babel-preset-react`はjsxのコードをjsに変換してくれる。

### Browserify
Browserifyは、node.jsで書かれたjsをブラウザでも動くように変換してくれるツール。CommonJS仕様で書かれたjsの`require()`とかブラウザじゃ動かないから、そこらへんをうまいことブラウザで動くように解決してくれる（たぶん）。

### Babelify
Babelifyは、Browzerifyに`transform`を生やすことで、Browzerifyの処理の中にBabelによる変換処理を挟めるようにするもの。

### grunt
省略。

## Gruntfile

Gruntfileにタスクを書く。

```js:Gruntfile.js
module.exports = function(grunt) {

  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    entry: './main.js',
    watch: {
      browserify: {
        files: ['src/scripts/**/*.js'],
        tasks: ['browserify']
      }
    },

    browserify: {
      dist: {
        options: {
           // 'es2015'はES2015→ES5への変換、'react'はjsxのコンパイル
           transform: [['babelify', {presets: ['es2015', 'react']}]]
        },
        src: ['src/scripts/app.js'],
        dest: 'dist/scripts/app.js',
      }
    }

  });

  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-browserify');

  grunt.registerTask('default', ['browserify']);

};

```

### Grunt watch
Gruntfileの

```js:Gruntfile.js
    watch: {
      browserify: {
        files: ['src/scripts/**/*.js'],
        tasks: ['browserify']
      }
    },
```
の部分で、watchの設定を行っている。
これでファイルの変更を監視して、変更があったら`tasks: ['browserify']`を実行させるようにする。

```zsh
$ grunt watch
```
で監視。
ファイルに変更があると

```zsh
>> File "src/scripts/react/main.js" changed.
Running "browserify:dist" (browserify) task
>> Bundle dist/scripts/app.js created.

Done, without errors.
```
このように自動でコンパイルしてくれるようになる。

## たぶん動く
`src`や`dest`の場所を適切に設定してやればこのコードでちゃんと動くと思う。たぶん。
あと実際の開発ではこれに加えて`uglify`とか`concat`とかした方がいいと思う。おしまい。
スマホでも使えるWYSIWYGエディタQuillの日本語入力

#スマホでも使えるWYSIWYGエディタQuillってことでつかってみのだが。。。

iphoneで「確定」する前の状態でバックスペースで削除した文字が、
次の動作（入力などのキーボード操作）をした瞬間に、削除前の文字列が復元されて入力される現象に遭遇。。。


とりあえず下記の用にソースを修正して回避した。

変更前

```js
Keyboard.prototype._initListeners = function() {
            return dom(this.quill.root).on('keydown', (function(_this) {
                return function(event) {
                    var prevent;
                    prevent = false;
                    _.each(_this.hotkeys[event.which], function(hotkey) {
                        var metaKey;

                            metaKey = dom.isMac() ? event.metaKey : event.metaKey || event.ctrlKey;
                            if (!!hotkey.metaKey !== !!metaKey) {
                                return;
                            }
                            if (!!hotkey.shiftKey !== !!event.shiftKey) {
                                return;
                            }
                            if (!!hotkey.altKey !== !!event.altKey) {
                                return;
                            }

                            prevent = hotkey.callback(_this.quill.getSelection(), hotkey, event) === false || prevent;
                        return true;
                    });
                    return !prevent;
                };
            })(this));
        };

```

変更後

```js

Keyboard.prototype._initListeners = function() {
            return dom(this.quill.root).on('keydown', (function(_this) {
                return function(event) {
                    var prevent;
                    prevent = false;
                    _.each(_this.hotkeys[event.which], function(hotkey) {
                        var metaKey;

                        if (dom.isIOS() !== true) {
                            metaKey = dom.isMac() ? event.metaKey : event.metaKey || event.ctrlKey;
                            if (!!hotkey.metaKey !== !!metaKey) {
                                return;
                            }
                            if (!!hotkey.shiftKey !== !!event.shiftKey) {
                                return;
                            }
                            if (!!hotkey.altKey !== !!event.altKey) {
                                return;
                            }

                            prevent = hotkey.callback(_this.quill.getSelection(), hotkey, event) === false || prevent;
                        }

                        return true;
                    });
                    return !prevent;
                };
            })(this));
        };


```
Androidアプリをエミュレータで動かした時にInvalid Pathエラーが出た時はAPIのバージョンを下げてみる

タイトルそのままですが、

apkでもらったアプリをエミュレータで動かした時に、そのアプリがデータをstorageに保存するものだった場合、

`java.lang.IllegalArgumentException Invalid Path /storage/emulated/0/...`

といったエラーが発生することがあります。

これは実機の内部ストレージをエミュレータで参照しようとしてエラーになっているようなのですが、API 23のエミュレータデバイスで起こります。
試しにAPI 22でデバイスを作って同じアプリで試した場合は起きませんでした。

以下に詳細が載っていますが、
http://techbooster.org/android/application/16004/

API（OS）バージョンによってストレージの参照の仕方が変わっているのが原因のようです。

エミュレータ上の問題で実機で動かす場合には問題なさそうですが、僕みたいにAndroidをあまり触ったことない人には気づきにくい部分かと思います。
Mac(EL Capitan)でApache+PHPの開発環境を作る手順書


WordPressやらをさくっと編集するときにいちいちVagrant立ち上げるのもめんどくさいのでMacでやってしまおうと企みました。

WordPressの場合、ドメイン情報をDBに保存していたりするので、同じドメインじゃないと動かなかったりします。
VirutalHostで本番と同じドメインで開発環境を作る手順書です。

# Apacheの設定
```
sudo vi /etc/apache2/httpd.conf

```


### メインの設定ファイル
```
LoadModule php5_module libexec/apache2/libphp5.so #コメントアウトを消す(PHP)
LoadModule rewrite_module libexec/apache2/mod_rewrite.so #コメントアウトを消す(rewrite有効)
Include /private/etc/apache2/extra/httpd-vhosts.conf #コメントアウトを消す(VirtualHost)

DocumentRoot "/Users/ユーザー名/適当なパス"

<Directory "/Users/ユーザー名/適当なパス">
AllowOverride all #←noneをallに変える
```

### VirtualHostの設定ファイル

```
sudo vi /etc/apache2/extra/httpd-vhosts.conf

```

```
<VirtualHost *:80>
    ServerName ドメイン
    DocumentRoot "/Users/ユーザー名/適当なパス"
    DirectoryIndex index.html index.php
    ErrorLog "/Users/ユーザー名/Desktop/error_log"
    CustomLog /Users/ユーザー名/Desktop/access_log combined env=!no_log #ログはデスクトップにしてみた
    <Directory /Users/ユーザー名/適当なパス>
      AllowOverride all
    </Directory>
</VirtualHost>
```

### Apache起動
```
sudo apachectl start
```



#Hostsの書き換え
Hostsというアプリが便利
http://permanentmarkers.nl/software.html 
をダウンロードして ドメインを叩いた時に自分を参照するようにする。


ipのところは127.0.0.1
hostnameのところはドメイン名にする


これでそのドメインを叩いた時は自分を参照するのでWordPressでもいける♪
s9icongen - iOSのアイコン生成を自動化するRubyスクリプト


アイコンと起動画面のデザインを更新するたびに、サイズはいくつで作ればいいのだっけ？どのファイル名が何のサイズなんだっけ？を思いだすのに発狂しそうになるので、自動化するスクリプトが転がってないか探した。

- [spren9er/s9icongen: App icon generator for iPhone & iPad (iOS 7 and above)](https://github.com/spren9er/s9icongen)
- [spren9er/s9splashgen: Splash screen generator for iPhone & iPad (iOS 7 and above)](https://github.com/spren9er/s9splashgen)

中身はRubyスクリプトなので改造もしやすい。

## 使い方
それぞれ解凍先に icon.png, launch.png を置く。リサイズしてくれるのでサイズは大体でOK。詳しくは[README](https://github.com/spren9er/s9icongen)。

```
$ cd ../s9icongen/
$ ruby s9icongen.rb icon.png

$ ls icons/
Icon-120.png	
Icon-29.png	
Icon-29@2x.png	
Icon-29@3x.png	
Icon-40@2x.png	
Icon-40@3x.png	
Icon-60@2x.png	
Icon-60@3x.png	
Icon-76.png
Icon-76@2x.png	
iTunesArtwork
iTunesArtwork@2x
```

なぜかIcon-40.pngが作られないので、これだけはIcon-40@2x.pngを手で縮小して作った。(後で自動化したい)

```
$ cd s9splashgen
$ ruby s9splashgen.rb launch.png universal

$ ls screens/
Default@2x~iphone.png
Default-568h@2x~iphone.png
Default-667h@2x~iphone.png
Default-736h@3x~iphone.png
Default-Landscape~ipad.png
Default-Portrait~ipad.png
Default-Landscape@2x~ipad.png
Default-Portrait@2x~ipad.png
```

## 新アイコンと新起動画面
アイコン

![pictruby-0323-02.png](https://qiita-image-store.s3.amazonaws.com/0/3885/22fa2934-0c54-347c-71ac-0ee063b6bf90.png "pictruby-0323-02.png")

起動画面

<img width="480" alt="pictruby-0323-01.png" src="https://qiita-image-store.s3.amazonaws.com/0/3885/a16957ae-d5c4-036e-94c2-7641d1bacee8.png">

前よりは良くなったんじゃないだろうか。
PHP の foreach でありがちなこと

#PHP の foreach でやりがちなこと


##恥ずかしい感じ
```lang:PHP
$langs = array('Java', 'PHP', 'Ruby');
foreach ($langs as $key => $lang) {
    if ($lang == 'PHP') {
        $lang[$key] = 'Scala';
    }
}
```

##参照の使いドコロを知っている感じ
```lang:PHP
$langs = array('Java', 'PHP', 'Ruby');
foreach ($langs as &$lang) {
    if ($lang == 'PHP') {
        $lang = 'Scala';
    }
}
```

##最後に
連想配列脳みそになっていると、割りとやりがちなのでは？
ちらほら見かけるため投稿しておきます。
Elixirチュートリアル 関数のキャプチャ

## 関数のキャプチャ

関数名/引数の数　で対象の関数を引っ張ってこれるらしい

```ex
iex> Math.zero?(0)
true
iex> fun = &Math.zero?/1
&Math.zero?/1
iex> is_function fun
true
iex> fun.(0)
true
iex> fun = &Math.zero?/2 # 関数がなくても引っ張ってこれることは来れる
iex> fun.(0,1) # でも呼び出すとめっちゃ怒られる。おこだよ！！！！
** (UndefinedFunctionError) undefined function Math.zero?/2
    Math.zero?(0, 1)
```

is_function/1のような，ローカルな関数やインポートされた関数はモジュールをつけなくてもキャプチャできる

```ex
iex> &is_function/1
&:erlang.is_function/1
iex> (&is_function/1).(fun)
true
```

Ruby辺りと一緒で &1 は関数に渡された最初の引数を示す `&(&1+1)`は `fn x -> x + 1 end` と同じ

```ex
iex> fun = &(&1 + 1)
#Function<6.71889879/1 in :erl_eval.expr/5>
iex> fun.(1)
2
```

## デフォルト引数 - Default arguments

`\\` でデフォの引数決められる

```ex
defmodule Concat do
  def join(a, b, sep \\ " ") do
    a <> sep <> b
  end
end

IO.puts Concat.join("Hello", "world")      #=> Hello world
IO.puts Concat.join("Hello", "world", "_") #=> Hello_world
```

デフォ値のみの関数を分けて設定しておくとわかりやすい

```ex
defmodule Concat do
  def join(a, b \\ nil, sep \\ " ")

  def join(a, b, _sep) when is_nil(b) do
    a
  end

  def join(a, b, sep) do
    a <> sep <> b
  end
end

IO.puts Concat.join("Hello", "world")      #=> Hello world
IO.puts Concat.join("Hello", "world", "_") #=> Hello_world
IO.puts Concat.join("Hello")               #=> Hello
```

↓こういう描き方すると上にしか入らないから気をつけろって怒られる

```ex
defmodule Concat do
  def join(a, b) do
    IO.puts "***First join"
    a <> b
  end

  def join(a, b, sep \\ " ") do
    IO.puts "***Second join"
    a <> sep <> b
  end
end
```
Linuxパーミッションの基礎知識


# ファイルやフォルダの詳細に表示される文字列の意味

- 所有者とグループという概念があることをまず理解する  
各ユーザはグループをもっている
- 誰がどこのグループに属するかは/etc/groupに設定がある  
[groups ユーザ名] で任意のユーザの所属するグループが表示できる

---

```
例）
drwxr-xr-x    5 yamada.taro  Domain Users   170  2 11 22:16 ruby
```
1. ファイル/フォルダの所有者/グループ
    2. yamada.taro：所有者
    - Domain Users：グループ
+ ファイルのパーミッション
    1. 先頭のdや-：ディレクトリかファイルかの違い
    - 左3文字のrwx：所有者が読み書き実行できるかどうか
    - 真ん中3文字のrwx：グループに属するユーザが読み書き実行できるかどうか
    - 右3文字のrwx：赤の他人が読み書き実行できるかどうか

# 実行権限や所有者の変更
## chmod

```
$ chmod a+x test     ←すべてのユーザーに実行権限を与える
```
1. 誰の？（who）
    1. u 所有者の権限
    - g グループの権限
    - o その他のユーザーの権限
    - a すべての権限
- どうする？
    2. + 後に記述した権限を付加する
    - - 後に記述した権限を削除する
    - = 後に記述した権限にする
- 何を？
    1. r 読み込み権限
    - w 書き込み権限
    - x 実行権限

## chown
```
# chown hoge-user file1 ←file1の所有者をhoge-userに変更する
# chown -R www public.shtml 
↑public.shtmlディレクトリ内の
すべてのファイルおよびディレクトリの所有者をwwwにする
```

# 参考
[シェルプログラミング実用テクニック](http://gihyo.jp/book/2015/978-4-7741-7344-3)
[【 chmod 】 ファイルやディレクトリのアクセス権を変更する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230728/?rt=nocnt)
[【 chown 】 ファイルやディレクトリの所有者を変更する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230729/)
TOPIX Core30, Large70, Mid400, Smallの構成銘柄かどうか調べたりするクラスを作った

# はじめに
この銘柄って大型？中型？小型？と気になるときに、指数の構成銘柄かどうかいう情報があると便利ですね。というわけで、任意の銘柄コードを与えるとTOPIXのサイズ別指数のどれに含まれるかのほか、浮動株比率や構成ウェイトを返すクラスを作りました。
なお元データをオンラインで取ってくるのが難しかったので更新は手動です。つらみ。

## 用意するもの
クラスと同じ場所に以下のPDFをtxt形式で保存しといてください。(Acrobat Readerでできます)

TOPIX（東証株価指数） | 日本取引所グループ
[構成銘柄別浮動株比率及び構成ウエイト一覧](http://www.jpx.co.jp/markets/indices/topix/tvdivq00000030ne-att/list-j.pdf)

## コード
なんのことはない、単にテキストを読んでパースしてるだけです。

```py3:TOPIX
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import re


class TOPIX:
    """
    使い方

    1. 準備
    http://www.jpx.co.jp/markets/indices/topix/tvdivq00000030ne-att/list-j.pdf
    をDLして、スクリプトと同じ場所にlist-j.txtとして保存。(Acrobat Readerのtxt保存)

    以上
    """
    def __init__(self):
        re_date = re.compile(r"\d{4}/\d{2}/\d{2}")

        self.result = dict()
        for line in open('list-j.txt', 'r'):
            matchOB = re_date.match(line)
            if matchOB:
                line = line.replace('Small ', 'Small').replace('○ ', '').replace('-', '- ').replace('\n', '')
                line = line.replace(matchOB.group(), matchOB.group()+' ')
                l = line.split(' ')
                self.result[l[2]] = dict(
                    newindex=l[3],
                    float_ratio=l[4],
                    weight=l[5]
                )

    def newindex(self, code):
        return self.result[code]['newindex']

    def float_ratio(self, code):
        return self.result[code]['float_ratio']

    def weight(self, code):
        return self.result[code]['weight']

    def includes(self, newindex):
        result = [code for code in self.result if self.result[code]['newindex'] == newindex]
        return result
```

## メソッド
newindex()で含まれるインデックス名、float_ratio()で浮動株比率、weight()で構成比率を返します。includes()にインデックス名を指定すると、インデックスの構成銘柄を返します。

テストコード

```py3:
myTOPIX = TOPIX()

s = '9984'
print(myTOPIX.newindex(s))
print(myTOPIX.float_ratio(s))
print(myTOPIX.weight(s))
print(myTOPIX.includes('Core30'))
```

結果

```
Core30
0.75000
1.6244%
['9432', '6752', '6981', '4502', '8031', '9437', '8058', '9433', '8802', '6501', '8766', '6902', '7267', '8306', '4503', '4063', '7203', '2914', '7751', '9022', '8604', '9020', '8801', '8411', '8316', '9984', '6954', '3382', '6758', '7201']
```
Springの<form:textarea>を使うと先頭の改行が消えていく・・・

Springの`<form:textarea>`タグ(JSPタグ)を使用すると、「ある操作」を行うと先頭の改行文字が消えていくことがあります。
「ある操作」とは、以下のようなごくごく一般的な操作です。

* 入力画面でテキストエリアに「(改行)テスト」と入力する。 ※「(改行)」は実際には改行コード(CRLF)です。
* 確認画面を表示する。
* 入力画面に戻る。

すると、入力画面のテキストエリアに表示される値が「テスト」になり、先頭の改行が消えてしまいます。
この事象は、**Spring Framework 4.2.6.RELEASE(2016/5/6リリース)**で解決されました。

詳しくは、https://jira.spring.io/browse/SPR-13503 を参照ください。

> **Note: FreeMarkerとVelocityのマクロ**
> 
> SpringはFreeMarkerとVelocity用のマクロも提供していますが、こちらも同様の問題があります。
> ↓
> FreeMarkerとVelocityもSPR-13503で一緒に対応されます。

# 改行コードが消えていく理由

Spring Framework 4.2.5.RELEASEまでは、以下のようなHTMLが出力されます。

```jsp:JSPの実装例
<form:textarea path="note" />
```

```html:HTMLの出力例
<textarea id="id" name="note">
テスト</textarea>
```

このHTMLをブラウザで表示すると、残念ながら先頭の改行コードはレンダリングされず、ブラウザ上から改行コードが消えてしまいます。

# 改行コードが消えないようにするには？

先頭の改行を残すためには、以下のようなHTMLを出力する必要があります。

```html
<textarea id="id" name="note">

テスト</textarea>
```

# Thymeleaf(Thymeleaf-Spring)での対応

Thymeleaf(Thymeleaf-Spring)を使う場合も、この事象に対する対策が必要になります。

単純に、

```html
<textarea id="note" th:filed="*{note}"></textarea>
```

とすると残念ながらアウトで、以下のように実装する必要があります。

```html
<textarea id="note" name="note">
<span th:text="*{note}" th:remove="tag"></span></textarea>
```

ポイントは、

* `<textarea>`の最後に明示的に改行を入れる
* `<textarea>`の中に`<span>`や`<p>`タグを設けて`th:text`属性を使って値を出力する
* `th:remove="tag"`を指定して`<span>`や`<p>`タグを消す（タグの中は残す）

なのですが、HTMLをブラウザでレンダリングするとテキストエリアの中に`<span>`や`<p>`タグが表示されちゃいます・・・。
たぶん、もっとよいやり方があるんだろうな・・・

この事象は、**Thymeleaf-Spring 3.0.0.BETA03, 2.1.5(2016/7/11)**で解決されました。
詳しくは、 https://github.com/thymeleaf/thymeleaf-spring/issues/103 を参照してください。 (2016/7/18)


# まとめ

Springの`<form:textarea>`を使っている場合は、Spring Framework 4.2.6.RELEASEにバージョンアップしましょう！！
この事象はSpringに特化した話ではないので、`<textarea>`を使っている場合は、同じ事象が発生しないか確認した方がいいと思います。

# 課題

Thymeleaf(Thymeleaf-Spring)での対応方法・・・
https://github.com/thymeleaf/thymeleaf-spring/issues/103 を発行してみた。
↓
対応されました。 (2016/4/18)

# 変更履歴

* 2016/3/23 01:59 Thymeleafの話題を追加
* 2016/3/23 02:12 FreeMarkerとVelocityの話題を追加
* 2016/3/23 03:10 ThymeleafのIssueリンクを追加
* 2016/3/23 20:30 FreeMarkerとVelocityのマクロも4.2.6で対応される旨を追記
* 2016/4/18 02:42 Thymeleaf-Spring 3.0.0.BETA03, 2.1.5で対応される旨を追記
* 2016/5/06 19:48 Spring Framework 4.2.6.RELEASEがリリースされたのでその旨を反映
* 2016/7/18 09:15 Thymeleaf-Spring 2.1.5.RELEASEがリリースされたのでその旨を反映
Tornado+Tornado-JSONでとりあえずGetできるようにする

##何がやりたかったか？

お付き合いのあるとある公共施設のブログというかWeb日記というかをスクレイピングしてきたものを、RESTでロボットから呼び出してお話させてみたく、とりあえずJSONでスクレイピングしてきた内容を返すだけの簡易サービスを作って置きたかった。

RSSやらAtomやらのフィードがあれば、それを使えばよいのだろうけど、いかんせんそれがなかったので、なんとかしようとしたというのが前提になっている。

##簡単にJSONを返すだけのサービスをTornadoで作る

ということで、Tornadoを使ってスクレイピング結果をGetで、かつ、JSONで返せるようにしようと考えた。作成に使った環境は以下の通り。

- OS：Ubuntu15.10
- Python：3.5.1
- Tornado：4.3
- Tornado-JSON：1.2.2

Tornadoを使った簡易なWeb API作成で、JSONを返すための方法はいくつかあると思うが、今回は[Tornado-JSON](http://tornado-json.readthedocs.org/en/latest/)を利用した。Tornado-JSONのsampleやtutorialを参考にすれば、そんなに迷わないはず。

###まずはTornadoでのWebアプリケーション作成と同様
以下のような感じで、WebアプリケーションとしてURLで呼び出せるようにするための部分を書く。

```py3:diary_talker.py
import tornado.ioloop
from tornado_json.routes import get_routes
from tornado_json.application import Application

def main():
    import diarytalker
    routes = get_routes(diarytalker)
    application = Application(routes=routes, settings={})
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == '__main__':
    main()
```

tornado_json.routesにより、この後記述するAPIのエンドポイント部分のパッケージ名、RequestHandlerから、自動でルートを特定してくれるので、自分でルートの記述を行う必要はない。インポートしているdiarytalkerがRequestHandlerが含まれるAPIの本体。

###RequestHandlerを含んだAPI本体のパッケージ
以下のようなディレクトリ構成で作っていく。

```text:ディレクトリ構成
ーdiary_talker.py
|
|
ーdiarytalker/
      |
      |ー__init__.py
      |ーapi.py
      |ーdiary.py
```
インポートされるdiarytalker下で、API本体の実装はapi.pyに記載している。diary.pyはスクレイピングの実装だた、今回の本題とは外れるので、割愛。とにかくWebアクセスしてBeautifulSoup4などを駆使して日記をスクレイピングし、日付、タイトル、本文をdictionary化して返すメソッドが定義されている。

```py3：diaryTalkder
from tornado_json.requesthandlers import APIHandler
from tornado_json import schema
import diary

class DiaryTalkerHandler(APIHandler):
    @schema.validate(
        output_schema={
            "type": "object",
            "properties": {
                "date": {"type": "string"},
                "title": {"type": "string"},
                "body": {"type": "string"}
            }
        }
    )
    def get(self):
        td = diary.Diary()
        diary = td.get_newest_diary()
        return {
            "date": "{}".format(diary["date"]),
            "title": "{}".format(diary["title"]),
            "body": "{}".format(diary["body"])
        }

```
api.pyのgetメソッドでは、スクレイピングを行っているDiaryのget_newest_diaryメソッドを呼び出し、結果の入ったdictionaryから、schemaにより定義したJSONを返す実装になっている。日記の本体（日付、タイトル、本文）はschema定義のPropertiesでそれぞれ型とともに指定している。

###実際に呼び出すときは
http://〜/api/diarytalkerで呼び出せる。結果は

```json:結果
{"data":{
  "date":"20160323",
  "title":"hoge",
  "body":"〜"
 },
 "status": "success"
}
```
のような感じに返ってくる。
Drupal の menu ID にハマったときの話

#Drupal の menu ID にハマったときの話
##前提
Drupalで作られたWebサイトについて複数環境あるとする。

##背景/事象
ローカル環境にて、素敵なレイアウトを作り、
いざ結合環境へリリースしたが、
一部うまことレイアウトが反映されない。

##原因
* 以下の"mid-1553"はメニューを作る度にDrupalによって発番されるIDの模様
* メニューを作成・削除を繰り返すとmidがインクリメントされる
* mid-1553をクラスセレクタとして使い、style.cssに記述する
* 他環境は個別にmidを発番するため、"mid-1553"は存在しない または 想定外の場所に存在する
* 結果、cssがうまいこと当たらず想定通りのレイアウトとならない

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/65994/647dc042-3a0b-c57c-fa01-41f79ede0097.png)

##対策
Menu attributes モジュールを使い、環境に依存しないIDやクラスを付与する。