OmniAICreator/Qiita-1.07M huggingface dataset:
メモ

# JSON
## JSONのそもそも
>The application/json Media Type for JavaScript Object Notation (JSON)

RFC4627
IETF (Internet Engineering Task Force) で公開中
http://www.ietf.org/rfc/rfc4627
> RFC:Request for Comments←ﾅﾆｺﾚ


リンク:http://qiita.com/k-taro/items/26dc55281d414babd495


# HTTP/2
Googleの考案したSPDYと言うプロトコルをベースにしており、一つのTCPコネクション上でHTTPリクエストやHTTPレスポンスをフレームというメッセージとして多重化して送受信します

・SPDY
> SPDY(スピーディと読みます)は、GoogleがWebの表示を高速化するために開発した、新しいプロトコルです。
http://www.iij.ad.jp/company/development/tech/activities/spdy/

2015年02月10日
>Googleが、HTTPをサポートする独自プロトコル「SPDY」のChromeでのサポートを2016年までに終了する。SPDYの多くの機能を統合した「HTTP/2」の策定が近いためとしている。

問題もあるようです。
> http://d.hatena.ne.jp/jovi0608/20140207/1391732796

### Notification API
https://developer.mozilla.org/ja/docs/Web/API/Notifications_API


### Service Worker
→service workerの仕様について細かく書かれている。
http://www.html5rocks.com/ja/tutorials/service-worker/introduction/


> Push API

http://qiita.com/k-taro/items/26dc55281d414babd495

### ・条件
①Service Worker は HTTPS で提供されるページのみに登録できるようになっています。
>Service Worker を使うと接続へのハイジャック、改ざん、フィルタリングができてしまいます。とても強力です。良いことに使えばそれでよいのですが、中間者（man-in-the-middle）はそうではないかもしれません。これを防ぐため、Service Worker は HTTPS で提供されるページのみに登録できるようになっています。こうすることでブラウザが受け取る Service Worker は、ネットワークの旅の途中で改ざんされていないことを保証できます。

### 対応状況
> https://jakearchibald.github.io/isserviceworkerready/
Nested functions使っていきましょう

Scalaではメソッドの中にネストしてメソッドが定義できますよね。
末尾再帰関数を書く時とかに使うことが多いと思いますが、一見「メソッドが呼ばれるたびに無名関数が生成されてコスト大きいのでは...」という感じもします。

その心配はないので、メソッドをネストさせないで引数を取り回すことで可読性が悪くなってる場合、ネストさせてすっきりさせていきましょう、という話です。

## 環境

- Scala 2.11.7

## 検証

以下のようなコードを用意します。

```scala:Foo.scala
package com.example

class Foo {
  def top(i: Int): Unit = {
    def nested(j: Int): Int = i + j
    println(nested(1))
  }
}
```

これをprintオプションつきでコンパイルすると

```bash:
$ scalac -print Foo.scala

[[syntax trees at end of                   cleanup]] // Foo.scala
package com.example {
  class Foo extends Object {
    def top(i: Int): Unit = scala.this.Predef.println(scala.Int.box(Foo.this.nested$1(1, i)));
    final private[this] def nested$1(j: Int, i$1: Int): Int = i$1.+(j);
    def <init>(): com.example.Foo = {
      Foo.super.<init>();
      ()
    }
  }
}
```

ネストしたメソッドはトップレベルに移動してることがわかります。

scalacには`lambdalift`というフェーズがあるので、そこで行われるようですね

```bash:
$ scalac -Xshow-phases

phase name  id  description
...
lambdalift  17  move nested functions to top level
...

$ scalac -Xprint:lambdalift Foo.scala

[[syntax trees at end of                lambdalift]] // Foo.scala
package com.example {
  class Foo extends Object {
    def <init>(): com.example.Foo = {
      Foo.super.<init>();
      ()
    };
    def top(i: Int): Unit = scala.this.Predef.println(scala.Int.box(Foo.this.nested$1(1, i)));
    final private[this] def nested$1(j: Int, i$1: Int): Int = i$1.+(j)
  }
}
```

## 参考

- http://stackoverflow.com/questions/2482326/the-cost-of-nested-methods
Chainer をソースコードを弄りながらあれこれ試す時の環境

ようやく時間が取れたので[chainer](http://chainer.org/)を弄っています。
僕はソースをいろいろ弄りながらじゃないと理解ができないのですが、環境汚染やソースに手を入れた後これをクリーンに戻すのが面倒だったりします。
これを楽にできる方法としての現時点での自分のベストプラクティスです。

## Dockerを使う
pythonも2系と3系が入り混じっててあれなので、基本的にはDockerを使います。
この時に手元のコードとchainerのコードをあれこれするので以下のようにVolumesを使って試しています(emacsが使いたいし)

```zsh
% cd ${MYPATH}
% git clone git@github.com:pfnet/chainer.git
% mkdir chainer-egg
% mkdir chainer-try
% docker pull python:3.5.1
% docker run -it \
  --entrypoint /bin/bash \
  --name chainer \
  -v ${MYPATH}/chainer-try:/tmp/chainer \
  -v ${MYPATH}/chainer:/usr/local/lib/python3.5/site-packages/chainer \
  -v ${MYPATH}/chainer-egg:/usr/local/lib/python3.5/site-packages/chainer-1.7.0-py3.5-linux-x86_64.egg \
  python:3.5.1
root@00b6a6aa3955:/ pushd /usr/local/lib/python3.5/site-packages/chainer
root@00b6a6aa3955:/usr/local/lib/python3.5/site-packages/chainer pip install numpy
root@00b6a6aa3955:/usr/local/lib/python3.5/site-packages/chainer python setup.py install
root@00b6a6aa3955:/usr/local/lib/python3.5/site-packages/chainer pushd /tmp/chainer
root@00b6a6aa3955:/tmp/chainer 
```

こうしておいてから、あとは

```
root@00b6a6aa3955:/tmp/chainer python -B sample.py
```

として適宜手元の方の `${MYPATH}/chainer-egg` のコードに`debug`なり`print`なりを打ち込んであれこれ試しながらやると、破棄も簡単だし、pythonのバージョンのあれこれを懸念したりしないでできるのでとてもよいです。

### おまけ
同様に tensorflow とか python、 ruby でもなんでもできます。

emacs 最高です
Sublime Text > Find Resultsを別ファイルに保存してもリンクは保持 > 保存ファイルを開きなおすとリンク情報は消える

```txt:動作確認
Sublime Text2 on Windows 7 pro 32bit
```

Sublime Text(以下SL)で検索した時に追加されるタブ「Find Results」。
その情報をもとにさらに検索した時、元の検索結果の参照性が悪くなる。

元の検索結果を一時ファイルとして保存すればいい(例: tmpFind.txt)。
一時ファイルとして保存してもリンク（クリックした時に別ソースに飛ぶ機能）は保持されるようだ。
<font color=blue>ただし、tmpFind.txtを開きなおしたときにはリンク情報は消えるので、タブを閉じないこと</font>

以下の２つの情報がアクセスしやすい状況にしたかったが、これでできそう。

1. TODOだけのリストを検索
2. TODOリストをもとに追加検索
Webプッシュ

# Web Pushについて
> 引用: http://d.hatena.ne.jp/jovi0608/20141204/1417697480

さっくり言うと、HTTP/2のサーバープッシュを用いて実現したもの。

# Push API
Service Workerを利用してバックグラウンとで動作するスクリプトをブラウザに常駐させ、Push APIを利用して通知を送る。

## ・受け取るための条件
①PCの場合はChrome（通知の許可を与えたブラウザ)が立ち上がっている時
②Android の場合は Chrome を立ち上げているかに関係なく、デバイスさえ起動していれば
>引用: https://hyper-text.org/archives/2016/01/web_push_notifications_by_pushnate.shtml

## ・Push APIを導入するための環境
・HTTPS プロトコルで接続可能なドメイン （要するにプッシュ通知を導入したい Web サイトが HTTPS でホストされていること）
・Push API、Service Worker に対応したブラウザ （Chrome 42 以降 / Firefox 44 以降）
・Google Cloud Messaging （GCM） のセットアップ （API キーの取得など / Chrome へのプッシュ通知に使用）
・ServiceWorker スクリプトなど、プッシュ通知の実装に必要な JavaScript ファイルの用意
・manifest.json の用意
取得したエンドポイントに対して通知を配信する仕組み
> 引用: https://hyper-text.org/archives/2016/01/web_push_notifications_by_pushnate.shtml


# 各ブラウザプッシュサービス
## ・One Signal
<img width="172" alt="スクリーンショット 2016-03-16 17.05.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/7186/538c825a-1cb2-24c7-97c6-01361d2f0a5c.png">
https://onesignal.com/

| 項目 | 概要 | 備考 |
|---|---|---|
| 機能 | 管理画面での新規通知 | | 
| | テンプレート|  | 
| | サイトがHTTPでも利用可能 | https://documentation.onesignal.com/docs/website-sdk-http-installation | 
| 価格 | エンタープライズはコンタクト | | 
 
＊注意
<img width="729" alt="スクリーンショット 2016-03-16 11.12.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/7186/8c9a15e6-e713-477a-df53-65b1ca73ce48.png">
様々なブラウザをサポートしているみたいだが、iOSはサポート外。
> Apple does not support web push notifications on iOS.

リンク

| 項目 | URL |
|---|---|
| Github | https://github.com/one-signal |
| Document | https://documentation.onesignal.com/docs/website-sdk-overview |
| SDK | https://github.com/one-signal/OneSignal-Website-SDK |

Q:これてブラウザ開いてる時しか通知しないのけ？

## プッシュさん
<img width="142" alt="スクリーンショット 2016-03-16 16.28.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/7186/1e0929e3-ffcc-18cc-5b56-8e5192f2b189.png">
https://pushsan.com/

| 項目 | 詳細|
|----|----|
| 機能 | 管理サイトから配信可能 |
| 価格 | 恐らく無料(エンタープライズの文字が見受けられない) |
| 対応端末 | (iOS対応してるのでしょうか？) |
| その他 | 通知許可設定ページというものを作らないといけなさそう(http://blog.pushsan.com/archives/cat_53215.html)| 


# プッシュ通知ーどうあるべきか？
> https://pushnate.com/labs/webpush/google-push-chrome-update

・マイクロモーメントとの関係
> https://www.thinkwithgoogle.com/micromoments/intro.html


# その他
## Safari
https://developer.apple.com/notifications/safari-push-notifications/
Mavericksから導入済み
スクリプトを利用したフォントのインストール

## 概要
通常、Windowsでフォントをインストールする時には下記２パターンがあると思います。
1. `%windir%\Fonts`へ直接フォントファイルをドラッグ＆ドロップ
2. フォントファイルをダブルクリックで開き、[インストール]ボタンをクリック(Windows7以降)

ただし、不特定多数のユーザへこの操作をやらせるのは難しい場合があります。
そこで、バッチファイルを叩かせてインストールしてやる方法がありますが、`copy`コマンドでフォントファイルをコピーするだけでは実は不十分だったりします。
  
ドラッグ＆ドロップだとWindowsがフォントを認識して勝手にインストールしてくれるんですが、バッチで処理する場合、「`copy`コマンドでのコピー」=「インストールされる」ではないようです。
これが原因で過去に一度トラブりました。

参考サイトより引用
> 実際、「必要なのはフォントを Fonts フォルダーにコピーすることだけで、そのフォントは自動的にインストールされるんだな」とお考えかもしれません。ええ、そのとおりです。(中略)しかし、その場合はオペレーティング システムによってフォントが自動的にインストールされません。(中略)私たちが知る限りでは、プログラムを使用して、Fonts フォルダーに新しいフォントが追加されたことを Windows が認識し、Windows がそのフォントをインストールするようにできる唯一の方法は、(中略)なのです！！

という訳で、以下にスクリプトを使ったインストール方法を示します。

## サンプルコード
とりあえずフォルダ構成はこんな感じで
(ユーザに配布する際は適宜工夫してね)
![fontsample.jpg](https://qiita-image-store.s3.amazonaws.com/0/110452/2cc70db6-2710-eee7-bb0a-8afc1fbec67b.jpeg)

  

```bat:FontInstall.bat
@echo off
rem フォントインストール用のスクリプト呼出
if not exist "%windir%\Fontfile.ttf" (cscript .\FontInstall.vbs Fontfile.ttf)
```

```vbscript:FontInstall.vbs
Const FONTS = &H14& 

fontfile = WScript.Arguments(0)	'第一引数:フォントファイル名

Set objShell = CreateObject("Shell.Application")
Set objWshShell = CreateObject("WScript.Shell")

Set objFolder = objShell.Namespace(FONTS)
'WScript.echo "現在の作業ディレクトリ= " & objWshShell.CurrentDirectory
objFolder.CopyHere objWshShell.CurrentDirectory & "\Fonts\" & fontfile
```


## 参考リンク
[Hey, Scripting Guy! スクリプトを使用してフォントをインストールする方法はありますか](https://gallery.technet.microsoft.com/scriptcenter/b5acfc13-3c7b-4168-b9c9-792e005304e6)
Mac OS X にJDK 1.8をインストール

# インストール対象マシン

Mac mini (Late2012)
OS X El Captitan バージョン 10.11.3

# 現状確認

~ $ date
2016年 3月16日 水曜日 11時04分10秒 JST
~ $ /usr/libexec/java_home -V
Unable to find any JVMs matching version "(null)".
Matching Java Virtual Machines (0):

Default Java Virtual Machines (0):

No Java runtime present, try --request to install.

# インストール

http://www.oracle.com/technetwork/java/javase/downloads/index.html

から、JDKの[DOWNLOAD]ボタンをクリック


Java SE Development Kit 8u74　の
 Accept License Agreement  
にチェック後、リスト中にある、
Mac OS X x64　用の
jdk-8u74-macosx-x64.dmg
をダウンロードし、インストール

# 確認
~ $ javac -version
javac 1.8.0_74
~ $ which javac
/usr/bin/javac
~ $ java -version
java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)
~ $ which java
/usr/bin/java
MovableType：ブログの記事をウェブサイトに表示、そのブログが更新されたら自動更新

ウェブサイト（トップページなど）にブログの最新記事を表示させるというよくある仕様。
ウェブサイトやブログを静的で生成している場合、更新の際には「再構築」が必要。
ブログを更新（再構築）しても、記事を引っ張ってきて表示しているだけのウェブサイトは自動では更新されない。
これを、ブログが更新されたら同時にウェブサイトも自動更新させる「再構築トリガー」の設定方法。

1. ブログ記事を表示させる「ウェブサイト」の「ツール」-「プラグイン」から、「MultiBlog」をクリック
2. 「設定」をクリックして「再構築トリガーを作成」をクリック
3. トリガーとするブログを選択
4. トリガーのアクションを選択して「OK」をクリック

トリガーは「記事とウェブページの保存時」だけでなく「記事とウェブページの公開時」の２つを設定しておくのがよい。
なぜなら、cronで公開日時を設定して行う公開は「保存」という作業にあたらないからだそうだ。
⇒　[再構築トリガーに「公開時」も設定](http://whizzo.jp/blog/2014/08/post-5.html)


ちなみにウェブページでブログ記事を読み込む場合の設定。
####mt:MultiBlog でブログを指定
include_blogs="all"　⇒　すべてのブログを対象とする
include_blogs="2,4"　⇒　特定のブログを指定
exclude_blogs="2"　　⇒　特定のブログを除外

```
<mt:MultiBlog include_blogs="all">
　<mt:Entries limit="5">
　  <mt:EntriesHeader>
　  <ul>
　  </mt:EntriesHeader>
　    <li><a href="<$MTAssetURL$>"><$mt:EntryTitle$></a></li>
 　 <mt:EntriesFooter>
 　 </ul>
 　 </mt:EntriesFooter>
　</mt:Entries>
</mt:MultiBlog>
```

####mt:Entries でブログIDを指定
```
<mt:Entries blog_ids="3" limit="5">
  <mt:EntriesHeader>
  <ul>
  </mt:EntriesHeader>
    <li><a href="<$MTAssetURL$>"><$mt:EntryTitle$></a></li>
  <mt:EntriesFooter>
  </ul>
  </mt:EntriesFooter>
</mt:Entries>
```



【参考】
- [再構築トリガーの設定](http://www.movabletype.jp/documentation/mt5/design/multiblog/#trigger)
- [再構築トリガーを設定して、ブログ記事が公開されたときにウェブサイトも再構築する](http://daisukebe.net/mt-multiblog-trigger/)
ズンドコで学ぶ要件定義(未完)

とある雑談が面白かったので書き出しました。

Y：ズンドコキヨシ辞典をひとつ
T：キヨシフェス
M：すごい演歌っぽい
S：キヨシの全部のコードをまとめるだけでも一冊の本になりそう
H：あの数だとたぶんなるww
Y：1個2Pで60個はあるので120Pはかたい
H：やってみて。Yさん
Y：すごくめんどくさいです
H：じゃあ氷川きよしへのあぽはとるからアポ取れたらズンドコで薄い本作って。
Y：プログラマが知るべき97のこと」とか大変だっただろうなぁ...氷川きよしw
C：日本人限定だが、Fizz Buzzより楽しい題材生まれたのいいことだ
C：「プログラマが知るべき97のズンドコ」まだ足りないな
Y：ズンドコ結構奥が深いんですよね
Y：ズンズンズンズンズンドコを許容するかどうか
H：仕様きまってないの
H：ズンドコv1.0みたいなの
C：実際に歌ってるのを見るとそれで合ってるんじゃないの？
Y：正確にはズンズンズンズンドコ
Y：なんですが
C：歌詞カードと数がずれてるみたいなんだけど
C：きよしのズンドコ節 / 氷川きよしきよしのズンドコ節 / 氷川きよし
C：https://www.youtube.com/watch?v=c0H_qGSJKzE
Y：最初の仕様はズン4つドコ1つが現れたら、なので
N：歌ってるのと歌詞テロップずれてるんよね
H：その前にいくつズンがあっても正解。
R：RFCが必要
H：ズンのまえにほかのがきてたらだめなの。空白出力をまつの
W：ズン♪ズンズン♪ズン♪ドコ！きよし！じゃないの
Y：自分の実装ではドコズンズンズンズンドコじゃないと認めないようにした
Y：最初のドコは捨てる。
H：ドコすてるのかー
Y：ズン♪,ズンズン♪, ドコ！の3つにするとどうなるだろう
S：要件定義の勉強に良いような気がしてきた
H：ズンドコで覚える要件定義
Y：境界値テスト
C：1. 設計ではズン4ドコ1でキヨシーだが、運用でズン5ドコ1でキヨシーとなっている。どちらを正とするべきか
C：2. ズン4ドコ1を正としたとき、ズン5ドコ1はキヨシー発動条件として認めるか
C：とか、そんな感じ？
H：シーケンス制御もあるよね。ズン6ドコ1の場合発動とみなすのか。
H：かぶった
H：たぶんそのあたり。ズンドコのゆらぎと命名しておこう。
Y：キ・ヨ・シ！を出力するさい先頭に空白をいれるべきか
H：溜めかな？
C：ドコからキ・ヨ・シ！はあまり間を置いてない印象
H：歌詞カードではどうなってるんです？
H：未定義？
C：歌詞カードではキ・ヨ・シ！は未定義やろw
H：ダッグタイピングか…
M：ドリフになってしまった場合のエラー制御も必要
C：3. ズンが多いとドリフに行くという仕様にすべきか
M：ドリフは6ズン1ドコだっけ。でもあれかけ声ないよな
C：ドリフは6ズン1ドコの2セットで先の歌詞に入る仕様ですね
M：発生難易度高い
C：氷川きよしもズン4ドコ1キ・ヨ・シ！の2セットで先の歌詞に入るから、同じようにすると結構難易度高い
C：条件合わせるなら2セットはなしで
Laravel5.2 laravel-elixirで圧縮時、ライセンス表示を保持したい時のメモ！

# 最初に
Laravel5.2の、laravel-elixirでjavascriptを圧縮した時、ライセンス表示削除されてしまうことが分かった。
もっとスマートで簡潔な方法があるとお思うが、力業で表示する方法をメモ代わりに書く。

# よし、改造だ
```javascript:gulpfile.js
var elixir = require('laravel-elixir');

/*
 |--------------------------------------------------------------------------
 | Elixir Asset Management
 |--------------------------------------------------------------------------
 |
 | Elixir provides a clean, fluent API for defining some basic Gulp tasks
 | for your Laravel application. By default, we are compiling the Sass
 | file for our application, as well as publishing vendor resources.
 |
 */

elixir(function(mix) {
    mix.sass('app.scss');
});

```
上記gulpfile.jsが初期の状態。

```javascript:gulpfile.js
var elixir = require('laravel-elixir');

elixir(function(mix) {
    mix.script([
        "jquery.js",
        "bootstrap.js",
    ]);
});
```

仮に、上記のように書いて、下記コマンドを実行すると、

```
gulp --production
```

綺麗に、ライセンスコメント部まで消されてしまう。

```javascript:gulpfile.js(改)
var elixir = require('laravel-elixir');
// ▼▼▼　追加開始
var gulp = require("gulp");
var $ = elixir.Plugins;
var config = elixir.config;


var gulpTaskEx = function(paths, babel) {
    this.log(paths.src, paths.output);

    return (
        gulp
            .src(paths.src.path)
            .pipe($.if(config.sourcemaps, $.sourcemaps.init()))
            .pipe($.concat(paths.output.name))
            .pipe($.if(babel, $.babel(babel)))
            .on('error', function(e) {
                new Elixir.Notification().error(e, 'Babel Compilation Failed!!');
                this.emit('end');
            })
            .pipe($.if(config.production, $.uglify({ preserveComments: 'some', compress: { drop_console: true }})))
            .pipe($.if(config.sourcemaps, $.sourcemaps.write('.')))
            .pipe(gulp.dest(paths.output.baseDir))
            .pipe(new elixir.Notification('Scripts Merged!!'))
    );
};
elixir.extend('scriptsEx', function(scripts, output, baseDir) {
    var paths =  new elixir.GulpPaths()
        .src(scripts, baseDir || config.get('assets.js.folder'))
        .output(output || config.get('public.js.outputFolder'), 'all.js');

    new elixir.Task('scriptsEx', function() {
        return gulpTaskEx.call(this, paths);
    })
    .watch(paths.src.path)
    .ignore(paths.output.path);
});
// ▲▲▲　追加終了

elixir(function(mix) {
    // mix.script から mix.scriptExへ変更
    mix.scriptEx([
        "jquery.js",
        "bootstrap.js",
    ]);
});
```

それで、力業で改造したのが、上記gulpfile.js(改)がそれにあたる。

laravel-elixir内にある、scripts.jsのscriptsの内容をそのままコピーしただけで、

```javascript:laravel-elixir/scripts.js
.pipe($.if(config.production, $.uglify({ compress: { drop_console: true }})))
```

を改造したのと、”script"から"scriptEx"メソッドに変えて追加したただけ。

```javascript:gulpfile.js(改)のgulpTaskEx内より
            .pipe($.if(config.production, $.uglify({ preserveComments: 'some', compress: { drop_console: true }})))
```

これにより、圧縮時、ライセンスの表示がされるようになる。


以上で終わり
Javaのソースコード中に日本語を使う

[ズンドコキヨシ with 日本語Java](http://qiita.com/shinido/items/f9d99f338e9cc0885801)でJavaで日本語を使ったのですが，そういやどこまで日本語でできるのかあんまり考えた事が無かったので調べてみました．

# 日本語が使える場所

```java:日本語.java
package jp.shinido.qiita.日本語;

public class 日本語クラス {
    private int 整数;
    private double 小数;

    enum 列挙型 {
        その１,
        その２,
        その３;
    }

    public @interface 日本語入り {
    }

    @日本語入り
    public 日本語クラス(){
        整数 = 1;
        小数 = 0.1;
    }

    public int 整数の取得(){
        return 整数;
    }

    public static void main(String[] args) {
        日本語クラス インプリ = new 日本語クラス();
        System.out.println(インプリ.整数の取得());
    }

}
```

<dl>
<dt>パッケージ名</dt>
<dd>パッケージ名に日本語が使えます．当然ですがディレクトリ名も日本語になります．</dd>
<dt>クラス名</dt>
<dd>クラス名に日本語が使えます．ファイル名も日本語になります．</dd>
<dt>変数名</dt>
<dd>変数名に日本語が使えます．</dd>
<dt>Enum</dt>
<dd>列挙型のEnumに日本語が使えます．enum名，値それぞれで日本語を使うことができます．</dd>
<dt>メソッド名</dt>
<dd>メソッド名に日本語が使えます．日本語クラス名の場合はコンストラクタも日本語にする必要があります．</dd>
<dt>アノテーション</dt>
<dd>アノテーション名に日本語が使えます．クラス名と同等なので当たり前ですが・・・．</dd>
</dl>


## 日本語を使うメリット
* 日本人にとっては凄く分かり易いソースコードになる
* 異なるメソッドを呼び出すようなバグを引き起こしにくい
* 日本語を格納する変数名をいちいち考えなくて良い

## 日本語を使うデメリット
* 使用できる文字列には制限がある（記号，空白文字列，特殊文字は使えない）
* 入力時にIMEへの切替が必要
* IDEの補完機能が使いにくい（補完・候補列挙等はしてくれる）
* ディレクトリ名・ファイル名に使用した場合，異なるOS間での管理が複雑になる（MacでのUTF-8問題など）
* 日本語の読み書きができないと編集できない

ということで，圧倒的にデメリットが多くてあまり使う意味がありません．
特に「記号・特殊文字が使えない」という制限を今回初めて知ったので，実はズンドコキヨシでも「キ・ヨ・シ！」をそのままenumにすることはそもそもできないようです．（・，！は使えない）

# エラーメッセージ・ログ等での使用
どうにか使えるような場所がないか1時間ほど考えたんですが，そもそも日本語が必要となる実装は入力・出力で日本語を使う場面しかありません．
特にエラーメッセージやログの出力で使用頻度が多そうなので，そういう場合に使ってみました．

```java:JMain.java
public class JMain {

    enum JLog {
        引数が指定されていません,
        整数値を指定してください;
    }

    public static final void error(JLog log){
        System.err.println(log.name().toString());
        System.exit(1);
    }

    public static void main(String[] args) {
        if(args.length < 1){
            error(JLog.引数が指定されていません);
        }

        int i = 0;
        try {
            i = Integer.parseInt(args[0]);
        } catch(NumberFormatException e){
            error(JLog.整数値を指定してください);
        }

        System.out.println(i);
    }
}
```

enumにログメッセージを直接入力し，出力時はその値を直接指定します．
ソースコード中で何が出力されるのか一目瞭然であるために，ログ出力メッセージを間違えるようなバグは起きにくくなります．
ログメッセージにはM001みたいなIDを付けることも多いので，enumの先頭に`M001_`のようなプレフィックスを付けるとIDEを使って入力するときに補完されるため便利かもしれません．

ということで**正直あんまり使えない**ことが分かったんですが，どこかで使えそうなら使ってあげてください・・・．
重複なし乱数

# Fisher-Yates法の改良
0～N-1の数列をシャッフルした数列を連続して生成する必要があったので軽く調査。

よく見かけるのは0～N-1の数列を生成してからFisher-Yates法で内部シャッフルするアルゴリズムだが、繰り返し生成するとなると1周する都度の初期化コスト(O(n))が馬鹿にならない。

O(n)のワークメモリが必要だが、1周ごとの初期化コストがO(1)になるように改良してみた。

ポイントは数値の取り出し方とメモの取り方。

```UniqRand.rb
#!ruby

##
## 重複なし乱数の生成(Fisher-Yates改)
##
#
# 長さNで(0 .. N-1)の重複しない乱数の繰り返し
#
# UniqRand.new(size) : 長さsizeで乱数を初期化
# UniqRand.getNext : 乱数を取り出す
#
class UniqRand
	private
	# メモから数値を取り出す
	def readMemo(i)
		# 指定されたインデックスの更新状況を確認
		if @flags[i] != @mark # 未更新なら
			# インデックス値でメモを更新
			@values[i] = i
			# 更新済みフラグをマーク
			@flags[i] = @mark
		end
		# 更新済みであればメモから返す
		@values[i]
	end

	public
	def initialize(size)
		@size = size	# 数列の長さ
		@index = 0		# 乱数の取り出し位置
		@mark = false	# 更新済みマーカー
		@flags = Array.new(@size, !@mark)	# 更新済みフラグ
		@values = Array.new(@size)			# 数列メモ
	end

	# 数値を取り出す
	def getNext
		# 1周終わったら数列を初期化
		if @index >= @size
			# マーカーを更新
			@mark = !@mark
			# 取り出し位置を巻き戻す
			@index = 0
		end
		# シャッフル先をランダムに決める
		ptr = rand(@index .. @size - 1)

		# 取り出し位置とシャッフル先について、メモから数値を取り出す
		# ※メモを更新するので先に両方共取り出しておくこと
		dst = readMemo(ptr)
		src = readMemo(@index)

		# 取り出した値を入れ替える
		@values[ptr] = src
		@values[@index] = dst

		# 取り出し位置を更新
		@index += 1

		# 取り出した値を返す
		return dst
	end
end
```

以下テスト

```rb
# 0..9の乱数発生器を生成
N = 10
urnd = UniqRand.new(N)

5.times {
	# 10個の乱数を取得
	lst = Array.new(N){urnd.getNext}
	p lst
	# 重複・範囲外がないことをチェック
	raise unless lst.uniq.size == N && lst.all?{|n| n.between?(0,N-1)}
}
```
ItemsControlのパネルコントロールをコードビハインドで操作

ItemsControlのパネルにGridを使用して、プログラムで行列数を変更したときの方法をメモします。
やり方としては単純で、Gridがロードされるタイミングで行列を修正します。

XAMLのItemsPanelTemplate部分(抜粋)

        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid Background="AliceBlue" Loaded="Grid_Loaded">
                </Grid>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>

コードビハインド

        private void Grid_Loaded(object sender, RoutedEventArgs e)
        {
            Grid grid = sender as Grid;
            int column = 3;
            int rows = 2;
            for (int i = 0; i < column; i++)
            {
                ColumnDefinition colDef = new ColumnDefinition();
                colDef.Width = new GridLength(1.0, GridUnitType.Star);
                grid.ColumnDefinitions.Add(colDef);
            }

            for(int i = 0; i < rows; i++)
            {
                RowDefinition rowDef = new RowDefinition();
                rowDef.Height = new GridLength(1.0, GridUnitType.Star);
                grid.RowDefinitions.Add(rowDef);
            }
        }

元ネタ
http://stackoverflow.com/questions/7319952/how-to-get-listbox-itemspanel-in-code-behind
VBAでズンドコ

作業が行き詰まってるので現実逃避にズンドコしてみた。
 # VBAのシンタックスハイライトなんてないのでvbnet指定しております

```vbnet

Option Explicit

Public Sub Zundoko()
    Dim buf As String
    Dim sWord As String
    
    Randomize
    
    Do While True
        If Len(buf) >= 10 Then
            buf = Right(buf, 8)
        End If
        If (Rnd() * 2) < 1 Then
            sWord = "ズン"
        Else
            sWord = "ドコ"
        End If
        Debug.Print sWord
        buf = buf & sWord
        If buf = "ズンズンズンズンドコ" Then
            Debug.Print "キ・ヨ・シ！"
            Exit Do
        End If
    Loop

End Sub

```

まあ何のひねりもありませんがorz
CentOS6系,7系へのyum経由のMySQLインストール

忘れがちなので自身の備忘録として

導入先OS
・CentOS6系
・CentOS7系

導入バージョン
・MySQL 5.6 (最新版)

CentOS6系レポジトリ
`yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm`

CentOS7系レポジトリ
`yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm`

CentOS(RHEL共通)版yum経由インストール
`yum -y install mysql-community-server mysql mysql-devel mysql-server mysql-utilities`
※但し必要に応じて付属パッケージを選択

CentOS6系の自動起動、サービス手動起動及び停止

```
chkconfig mysqld on
service mysqld start
service mysqld stop
```
CentOS7系の自動起動、サービス手動起動及び停止

```
systemctl enable mysqld.service
systemctl start mysqld.service
systemctl stop mysqld.service
```

レポジトリは通知無く変更する恐れがあるので、レポジトリを登録出来ない場合は

MySQL Community Downloads
http://dev.mysql.com/downloads/

を確認しましょう
XOOPS Cubeのログイン画面でログインフォームにフォーカスさせる


XOOPS Cubeでログイン画面を開いたらログインフォームにフォーカスさせるカスタムです。

XOOPS Cubeをベースにしたシステム開発中は管理画面にログインすることが非常におおくなるんですが、毎回ログインフォームにポインタ合わせるのが面倒になってきたので、ついカッとなってやってしまいました。

user_default.htmlに下記を追加。XCL2.2以上ならjQueryは標準読み込みなのでこれだけでOK。

```
<script>
    $(document).ready(function(){
        // ログインフォームにフォーカス合わせる
        $('#legacy_xoopsform_uname').focus();
    });
</script>
```

ちょっとしたことなんですが、開発時のイライラがかなり解消しましたよ！


user_default.htmlはhtml/modules/user/templates/にあるけど直接いじらないで、DBテンプレートセットを別途つくるとか、テーマ下テンプレートにコピーして編集がオススメです。
ExceptionのcatchでPromiseとtry-catchを比較する

`Exception`の`catch`で`Promise`を使った場合と`try-catch`を使った場合の比較を雑にしました。

### 検証コード
```js
% node
> console.time("promise"); i = 10000; while(i-- > 0){ new Promise((resolve, reject)=>{ throw new Error(); }).catch((err)=>{1}) } console.timeEnd("promise");
1: 139.171ms
undefined
> console.time("try"); i = 10000; while(i-- > 0){ try{ throw new Error(); }catch(err){ 1; } } console.timeEnd("try");
1: 56.821ms
undefined
> 
```

うん、使えるところなら `try-catch` 使おう。
Wordpressのget_post関数のpost_contentで段落タグが抜けないようにする方法（the_content関数と同じ結果で出力する方法）

# はじめに

Wordpressのget_post関数を使用すると、投稿や固定ページに関する値を取得することができますが、その
post_contentオブジェクトより出力される結果には、段落タグが含まれません。（ただし、Wordpressのエディタのテキストモードで`<p></p>`ように明示的に入力された場合を除きます）

このため、post_contentオブジェクトの値をそのままechoすると、レイアウトが崩れてしまう等、意図しない表示結果(the_content関数の出力とは異なる結果）となる場合があります。

# 原因

Wordpressのエディタで編集した内容では、段落は段落タグ（`<p></p>`）ではなくそのまま改行コードで保存されます。

the_content関数を使用する場合は、出力の際にthe_contentフィルターが適用されますので、改行が`<p></p>`に置き換えられます。しかし、get_post関数のpost_contentオブジェクトの出力結果にはthe_contentフィルターが適用されませんので、the_content関数のように改行が置き換えられずに（DBに記録された通りにそのまま)出力されます。

# 対応方法

post_contentオブジェクトの出力結果に対して、the_contentフィルターを適用することで、the_content関数と同様の出力結果となります。

```php:example.php
$post_id = 1;
$post = get_post($post_id);
echo apply_filters('the_content',$post->post_content);
```
Java SE7 Gold 取得を目指して (11)

Java SE7 Gold をとりたい…!
===

本日は第11回目です。
Java7で大きく変わったNIO.2の前編です。

## 今日のこぼれ話

本日からNIO.2を勉強しています。
新たに使えるようになったメソッドを見ると便利そうだなーと思うのですが、逆にこれまではどうしていたのでしょうか?
ちょっとしたことを実現するのにも割と面倒なプロセスを踏まざるを得ないような…。
(Javaだから便利なライブラリがあったのでしょうね、きっと)
自分の場合はどうしていたのだろうと考えてみましたが、C#で開発してました。(Windows開発が多いので)
しかしNIO2のおかげでOSの縛りもなくなり選択肢が増えますね!

## 本日知ったこと(9章 1/2)

* Path インタフェース
  * Pathオブジェクトの取得

     ```java
      // 簡易取得
      Path p1 = Paths.get("/temp/dir");

      // デフォルト以外のファイルシステムを使う場合はFileSystemクラスから取得
      FileSystem fs = FileSystems.getDefault();
      Path p2 = fs.getPath("/temp/dir2");
     ```
  * [Pathインタフェース](http://docs.oracle.com/javase/jp/7/api/java/nio/file/Path.html)便利そう
  * ルート以下のエントリを辿れる

    ```java
     Path path = Paths.get(".\\temp\\yyyymmdd\\aaa.txt");
     Iterator<Path> ite = path.iterator();
     while(ite.hasNext()) {
       System.out.println(it.next()); // ルートは返さない
     }
    ```
  * Path間の相対パスも取得できる

    ```java
     /*
      ディレクトリ構成
      Parent/
       |- Child1/
        `- Child2/
     */
     Path p1 = Paths.get("Child1");
     Path p2 = Paths.get("Child2");
     System.out.pring(p1.relativize(p2)); // ../Child2
    ```

* Files クラス
  * [負けじと](http://docs.oracle.com/javase/jp/7/api/java/nio/file/Files.html)便利そう
  * ファイルのメタデータ取得

    ```java
     Path p1 = Paths.get(".\\sample.txt");
     BasicFileAttributes attr = Files.readAttributes(p1, BasicFileAttributes.class);
     System.out.println(attr.creationTime());
     System.out.println(attr.lastModifiedTime());
     ....
    ```
  * DOSファイル属性を取得したい場合は DosFileAttributes で取得する
  
* ファイルへのランダムアクセス
  * SeekableByteChannelクラスを使用
  * チャネルI/Oはバッファリングするので、ストリームI/Oに比べアクセスが高速

    ```java
     // 5番目の文字から10文字読み込み
     Path p1 = Paths.get(".\\sample.txt");
     try(SeelableByteChannel ch = Files.newByteChannel(p1)) {
       ByteBuffer buffer = ByteBuffer.allocate(32);
       ch.position(5); // 位置指定
       ch.read(buffer); // 読み込み
       for (int i = 0; i < 10; i++) {
         System.out.print((char)buffer.get(i));
       }
       buffer.clear();
     } catch (IOException ex) {
       e.pringStackTrace();
     }
    ```

`Files.readAllLine()` とか、やっと来たか…!って感じですね。
ズンドコキヨシ using git with bash {for / seq / /dev/null / expr / awk / 部分文字列取得 / if文}

## 処理の流れ

1. dmy.txtを作成
2. git addでステージングに置く
3. git commitでコミットメッセージ追加
4. git log --onelineでコミットのハッシュ値を取得
5. ハッシュ値のLSBが0,1かでzun,doko判定
6. 以下略


## code v0.1

```bash:zundoko-exec
#!/usr/bin/env bash


git init >& /dev/null

zuncount=0
totalcount=0
for idx in $(seq 1 100);
do
	echo $idx >> dmy.txt
	git add dmy.txt >& /dev/null
	git commit -m "zundoko" >& /dev/null

	totalcount=`expr $totalcount + 1`

	hash=`git log --oneline | head -n 1 | awk '{print $1}'`
	zeroOrOne=`echo $((${hash:6:1} % 2))` # check last character
	if [ $zeroOrOne == 0 ];then
		echo "doko"
		if [ $zuncount == 4 ]; then
			echo "KIYOSHI!"
			echo "total:$totalcount"
			break;
		fi
		zuncount=0
	else
		echo "zun"
		zuncount=`expr $zuncount + 1`
	fi
done
```

以下を使用している

- for文
- seq文
- gitコマンド
- /dev/null出力
- awk
- expr文
- 部分文字列取得 ${hash:6:1}
- if文


## 実行方法

```txt:動作確認
CentOS 6.5 (32bit)
```

<font color=red>gitログを書き換えてしまうため、gitログがないフォルダにて実行してください。</font>

chmod +xで実行権限を付加して実行。

```
$ chmod+x zundoko-exec
$ ./zundoko-exec
```

またはchmodをしない場合は

```
$ bash zundoko-exec
```

## 結果

```
doko
doko
doko
zun
zun
zun
doko
zun
doko
zun
doko
doko
zun
doko
zun
doko
zun
zun
zun
zun
doko
KIYOSHI!
total:85
```
技術英語 > and it’s almost to the point / You hit the nail on the head. / Your point?

@ January 31, 2003

http://loe.org/shows/shows.html?programID=03-P13-00005
> But, the real big prize was elsewhere, and it’s almost <font color=red>to the point</font>--


http://eow.alc.co.jp/search?q=to+the+point&ref=sa
> 要領を得た【対】off the point

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

> You hit the nail on the head.

http://eow.alc.co.jp/search?q=hit+the+nail

> 1. くぎの頭を打つ、小さな的をうまく打つ

> 2.〔判断・意見などが〕的を射ている、うまく言い当てる、そのものずばりである、まさにその通りである、図星である、正鵠を得る、核心をつく、的中する、要点をつく、ずばり言う、要領を得ている

<hr>

関連して思い出したのは

> Your point?

Voyagerにて、話の要領を得ることができないドクターがクルーに聞いていた時に出ていた。
Oracleでエクスポートしたデータを別スキーマにインポートする

# 環境

+ CentOS6.4(64bit)
+ Oracle 11g
+ usr01というユーザー(スキーマ)を作成済み
+ MY_DATAという表領域(tablespace)を作成済み
+ MY_DATAにはempというテーブルが存在

# 現在の状況を確認

まずは現在の状態を確認します。

```bash
# Systemユーザー(DBA)でOracleにログイン
$sqlplus system/password@XE

# 表領域(テーブルスペース)のパスと名称の一覧を取得
SQL>select TABLESPACE_NAME,FILE_NAME from dba_data_files;
TABLESPACE_NAME
------------------------------
FILE_NAME
--------------------------------------------------------------------------------
USERS
/u01/app/oracle/oradata/XE/users.dbf

SYSAUX
/u01/app/oracle/oradata/XE/sysaux.dbf

UNDOTBS1
/u01/app/oracle/oradata/XE/undotbs1.dbf


TABLESPACE_NAME
------------------------------
FILE_NAME
--------------------------------------------------------------------------------
SYSTEM
/u01/app/oracle/oradata/XE/system.dbf

MY_DATA
/u01/data/MY_DATA.dbf


# スキーマ一(ユーザー)覧
SQL>select distinct username from all_users;
select distinct username from all_users;

USERNAME
------------------------------
XS$NULL
USR01
MDSYS
FLOWS_FILES
HR
CTXSYS
OUTLN
APEX_040000
SYSTEM
APEX_PUBLIC_USER
XDB

USERNAME
------------------------------
ANONYMOUS
SYS

13行が選択されました。


# テーブル一覧
SQL>select owner,table_name from dba_tables where OWNER = 'USR01';

OWNER			       TABLE_NAME
------------------------------ ------------------------------
USR01			       EMP
```

ユーザーからはMY_DATAという表領域の作成しかしていないですが、他にもシステムで使う表領域も自動で作成されているということが分かりました。ユーザーも同じで幾つかのユーザーが登録されているようですね。

# 別スキーマへのインポート

では早速別スキーマへのインポートをやってみます。
impdp/expdpを使わず、imp/expでやっています。（現在はimpdp/expdpでやるのが推奨らしいですが、実際に使うのがimp/expだったので今回はこちらで)

+ usr01ユーザーでエクスポート
+ ユーザーusr02を作成
+ ユーザーusr02が作成された時に作成されるusr02のスキーマにエクスポートしたデータをインポート

```bash
# usr01スキーマの情報をエクスポート.実施後、エラーがないかログを確認
$exp userid=usr01/12345@XE file=usr01.dmp log=usr01_dump.log

# ユーザー（スキーマ）作成
$sqlplus system/password@XE
SQL> create user usr02 identified by 12345;
SQL> grant CONNECT,RESOURCE to usr02;
SQL> quit

# インポート。別のスキーマ.fromuser,touserで別スキーマにインポートすることを指定
$imp system/password@XE fromuser=usr01 touser=usr02 file=usr01.dmp log=usr02_restore.log

# 確認
$sqlplus usr02/12345@XE
SQL>emp desc;
```

usr02を削除するときは以下でOK

```bash
# ユーザー削除
SQL>drop user usr02 cascade;
```

ちなみに表領域を指定してエクスポートすることもできますが、その場合、DBAユーザー権限(systemユーザー)が必要でした。
GPG でファイルをパスワードで暗号化(共通鍵暗号)するときの簡易コマンド一覧

# 概要 
Linux 上で、とりあえず簡単にパスワードを指定してファイルを暗号化したい場合、`gpg` コマンドを使ってファイルを暗号化することができます。

## gpg --symmetric | -c: パスワードと共通鍵暗号でファイルを暗号化する 
署名を付けずにパスワードでファイルを暗号化するときは`-c` オプションを使用してファイルを暗号化することができます。


```text:パスワードでファイルを暗号化する
$ gpg --symmetric hello.txt

$ gpg -c hello.txt
```



### --cipher-algo: 暗号方式を指定してファイルを暗号化 
上記コマンドで使用される暗号化方式を指定する場合は`~/.gnupg/gpg.conf` ファイルに`cipher-algo AES256` の1 行を追加するか、コマンド実行時に`--cipher-algo` オプションで指定します。


```text:暗号方式を指定してファイルを暗号化
$ gpg --cipher-algo AES256 --symmetric hello.txt
```



### --passphrase-fd 0: 暗号時にパスフレーズを標準入力から取得する 

```text:暗号時にパスフレーズを標準入力から取得する(--passphrase-fd0)
$ gpg --batch --passphrase-fd 0 --symmetric hello.txt <<< password

$ gpg --batch --passphrase-fd 0 --symmetric hello.txt < password.txt
```


### --compress-algo: 圧縮方式を指定して暗号化する 

```text:ファイルを圧縮方式を指定して暗号化する
$ gpg --compress-algo zlib --symmetric hello.txt
```


主に使用される暗号方式のオプションは次の通りです。

* gpg で主に使用される圧縮方式一覧
<table><tbody>
  <tr>
    <th> --compress-algo none</th>
    <td> 圧縮なし</td>
  </tr>
  <tr>
    <th> --compress-algo zip</th>
    <td> zip</td>
  </tr>
  <tr>
    <th> --compress-algo zlib</th>
    <td> zlib, gzip</td>
  </tr>
  <tr>
    <th> --compress-algo bzip2</th>
    <td> bzip2</td>
  </tr>
</tbody></table>


## ファイルの復号化する 
ファイルを復号化するコマンドは次のとおりです。


```text:ファイルを復号化する
$ gpg hello.txt.gpg

$ gpg -d hello.txt.gpg
```



### --passphrase-fd 0: 標準入力からパスワードを取り込んでファイルを復号化する 

```text:標準入力からパスワードを取り込んでファイルを復号化する
$ gpg --batch --passphrase-fd 0 hello.txt.gpg <<< password

$ gpg --batch --passphrase-fd 0 hello.txt.gpg < password.txt
```


## 暗号方式一覧 
gpg が対応している暗号方式を確認する場合は`gpg --version` コマンドを実行します。


```text:暗号方式一覧
$ gpg --version
...
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
```


## 対応している圧縮方式一覧 
gpg が対応している圧縮方式を確認する場合は`gpg --version` コマンドを実行します。


```text:暗号方式一覧
$ gpg --version
...
Compression: Uncompressed, ZIP, ZLIB, BZIP2
```



# 参考 
- Using GPG to Encrypt Your Data
    - http://www.nas.nasa.gov/hecc/support/kb/using-gpg-to-encrypt-your-data_242.html

- Creating a new GPG key
    - http://ekaia.org/blog/2009/05/10/creating-new-gpgkey/

- Quick'n easy gpg cheatsheet
    - http://irtfweb.ifa.hawaii.edu/~lockhart/gpg/

- Linux HowTo Encrypt And Decrypt Files With A Password
    - http://www.cyberciti.biz/tips/linux-how-to-encrypt-and-decrypt-files-with-a-password.html
ズンドコキヨシ物語 with Ruby

## ズンドコキヨシ物語

キヨシランドに自然と生まれてくるズン。

ズンだけで仲よく暮らすが、まれにキヨシランドの怒りによりドコにされてしまう。
ドコになったズンは夜になると周りのズンと戦い、生き延びたドコは新しいズンと関わることなく一人キヨシランドを生きていく...。

ドコになったズンが死ぬときキヨシランドの怒りが爆発する。

```rb
class KiyoshiLand
  def initialize
    @people = []
  end

  def <<(newcomer)
    @people.select(&:alive?).each {|person| person.hi(newcomer) and newcomer.hi(person) }
    @people << newcomer
  end

  def angry?
    rand(2).zero?
  end

  def each_person
    @people.each {|person| yield person }
  end

  def produce_zun
    Zun.new.tap {|zun| self << zun }
  end
end

class Zun
  def initialize
    @life = 1
    @neighbors = []
  end

  def <<(damage)
    @life -= damage
    dead unless @life > 0
  end

  def alive?
    true
  end

  def attack(person)
    person << damage
  end

  def bomb
    'キ・ヨ・シ！'
  end

  def damage
    1
  end

  def dead
    def self.alive?
      false
    end

    def self.spend_a_night
      :RIP
    end
  end

  def hi(other)
    @neighbors << other
  end

  def mutate_into_doko
    @life = 4

    def self.dead
      throw bomb
    end

    def self.name
      'ドコ'
    end

    def self.spend_a_night
      super

      @neighbors.each {|neighbor|
        attack(neighbor) and neighbor.attack(self) if neighbor.alive?
      }

      def self.hi(other)
        # |ω・`）チラ
      end
    end
  end

  def name
    'ズン'
  end

  def sleep
    <<-OFUTON
    (¦3[___]
    OFUTON
  end

  def spend_a_night
    # 初夜は( ﾟдﾟ )ｸﾜｯ!!
    puts name

    def self.spend_a_night
      sleep
    end
  end
end

KiyoshiLand.new.instance_eval do
  loop do
    new_zun = produce_zun
    new_zun.mutate_into_doko if angry?
    each_person(&:spend_a_night)
  end
end
```

## 実行例

```console
    _╰╰,   /ﾊﾞｼｮ % ~/tmp
  _/o ŏｧ  / ﾀｲﾁｮｰ% ﾔﾊﾞｲ
∈ミ;ﾉ,ﾉ   ＼ｺﾏﾝﾄﾞ% ruby hikiyoshi.rb
ズン
ドコ
ドコ
ズン
ズン
ドコ
ドコ
ドコ
ドコ
ズン
ズン
ドコ
ドコ
ズン
ズン
ドコ
ドコ
ドコ
ズン
ドコ
ズン
ドコ
ドコ
ドコ
ズン
ドコ
ドコ
ドコ
ドコ
ドコ
ズン
ドコ
ズン
ズン
ズン
ズン
ドコ
hikiyoshi.rb:69:in `throw': uncaught throw "キ・ヨ・シ！" (UncaughtThrowError)
	from hikiyoshi.rb:69:in `dead'
	from hikiyoshi.rb:32:in `<<'
	from hikiyoshi.rb:40:in `attack'
	from hikiyoshi.rb:80:in `block in spend_a_night'
	from hikiyoshi.rb:79:in `each'
	from hikiyoshi.rb:79:in `spend_a_night'
	from hikiyoshi.rb:16:in `block in each_person'
	from hikiyoshi.rb:16:in `each'
	from hikiyoshi.rb:16:in `each_person'
	from hikiyoshi.rb:113:in `block (2 levels) in <main>'
	from hikiyoshi.rb:110:in `loop'
	from hikiyoshi.rb:110:in `block in <main>'
	from hikiyoshi.rb:109:in `instance_eval'
	from hikiyoshi.rb:109:in `<main>'
```

## その他のキヨシ

- [ズンドコキヨシ Quine with Ruby](http://qiita.com/hanachin_/items/856ecb53fe486c6d4a12)
- [歌うズンドコキヨシ with Ruby](http://qiita.com/hanachin_/items/a4547d88e9008d390f58)
- [ズンドコキヨシオートマトン with Ruby](http://qiita.com/hanachin_/items/2242c7bd33af39cc6cab)
- [ズンドコキヨシマシーン with Ruby](http://qiita.com/hanachin_/items/b037b2e602c0bdee6a89)
- [ズンドコキヨシワンライナー with Ruby](http://qiita.com/hanachin_/items/bad105e11ab707fbaf4c)
なんかInsert出来ない

AmazonLinuxにmysqldのプロセス立てて、RailsからInsertしようとしたら

```
FATAL -- :
ActiveRecord::StatementInvalid
(Mysql2::Error: Incorrect string value:
'\xE3\x83\x86\xE3\x82\xB9...' 
for column 'title' at row 1:
INSERT INTO `tabale_names`
(`title`, `created_at`, `updated_at`)
VALUES ('テスト','2016-03-15 18:40:43', '2016-03-15 18:40:43')):

```

みたいに出たので解決してみた。

原因はamazonLinuxに入ってたmysqlの設定まわりの問題。
文字コードがutf-8になってないから 'テスト' のところで落ちていた模様。

(mysqlに入って直接Insert文流したら文字化けしてInsertされてた)

あとは
> [こちら](http://qiita.com/YusukeHigaki/items/2cab311d2a559a543e3a)を参考に設定を変更

でもう一度unicorn再起動して、問題ないことを確認できた。
Promiseで複数の非同期処理を書く(Node v4以降、ライブラリなし)

#目的
例えばファイル読み込み、SQL発行、HTTPリクエスト、とか順序だててやらないといけない時、複数の非同期処理をネストしたコールバックから置き換える

#環境
node v4~(v4.3.2 or v5.0.0で確認)


#コールバック(書き換え前)

```js:callback.js
var fs = require('fs');

console.log('readFile ---- start.');
fs.readFile('a.txt', function(err, data){
	console.log('readFile ---- a.txt data : '+data);
	fs.readFile('b.txt', function(err, data){
		console.log('readFile ---- b.txt data : '+data);
		fs.readFile('c.txt', function(err, data){
			console.log('readFile ---- c.txt data : '+data);
		});
	});
});
```

```shell-session
$ node callback.js
readFile ---- start.
readFile ---- a.txt data : a.txtの内容
readFile ---- b.txt data : b.txtの内容
readFile ---- c.txt data : c.txtの内容
```

#Promise(書き換え後)

```js:promise.js
'use strict'

const fs = require('fs');

new Promise((resolve, reject)=>{
	console.log('Promise ---- start.');
	fs.readFile('a.txt', (err, data)=>{
		!err ? resolve(data) : reject(err);
	});
}).then((result)=>{
	console.log('Promise ---- a.txt result : '+result);
	return new Promise((resolve, reject)=>{
		fs.readFile('b.txt', (err, data)=>{
			!err ? resolve(data) : reject(err);
		});
	})
}).then((result)=>{
	console.log('Promise ---- b.txt result : '+result);
	return new Promise((resolve, reject)=>{
		fs.readFile('c.txt', (err, data)=>{
			!err ? resolve(data) : reject(err);
		});
	})
}).then((result)=>{
	console.log('Promise ---- c.txt result : '+result);
},(err, hoge)=>{
	console.log('Promise ---- err : '+err+' hoge:'+hoge);
});

```

```shell-session
$ node promise.js
Promise ---- start.
Promise ---- a.txt result : a.txtの内容
Promise ---- b.txt result : b.txtの内容
Promise ---- c.txt result : c.txtの内容
```

層が深くなればなるほどPromiseのが見やすくなる
ライブラリに依存したくない場合はこんな感じで書くつもり
ズンドコキヨシ with ColdFusion(CFML＆CFSCRIPT)

Colfusionの練習ついでに。

[Coldfusion](http://www.adobe.com/jp/products/coldfusion-family.html)はAdobe製のプログラミング言語。マークアップ言語のCFML(ColdFusion Markup Language)と、JavaScript風のCFSCRIPTの２種類の書き方ができる。

CFMLの場合

```cfm

<cfset z = "ズン" >
<cfset d = "ドコ" >
<cfset a = ArrayNew(1) >

<!--- 条件付きループ(whileに相当) 配列を文字列結合した値の中に該当の文字があるかチェック --->
<cfloop condition = 'Find(z&z&z&z&d,ArrayToList(a,"")) eq 0'  >
　　<!--- １ or ２の値をランダム生成し、一括で該当の文字に置換、配列に追加 --->
    <cfset ArrayAppend(a,ReplaceList(RandRange(1,2),"1,2","#z#,#d#")) >    
</cfloop>

<cfoutput>
<!--- 配列を文字列結合して出力 --->
#ArrayToList(a,"")#キ・ヨ・シ！
</cfoutput>

```

CFSCRIPTの場合

```cfs

<cfscript>
z = "ズン";
d = "ドコ";
a = []; 

// 配列を文字列結合した値の中に該当の文字があるかチェック
while (Find(z&z&z&z&d,ArrayToList(a,"")) == 0 ) { 
    /* １ or ２の値をランダム生成し、一括で該当の文字に置換、配列に追加 */
    ArrayAppend(a,ReplaceList(RandRange(1,2),"1,2","#z#,#d#"));
}
// 配列を文字列結合して出力
WriteOutput(ArrayToList(a,"") & "キ・ヨ・シ！");
</cfscript>
```
ズンドコキヨシ with TypeScript

# 概要

「TypeScriptでテスト書く」の手習い中で、ちょーど「ズンドコキヨシのビッグウェーブ」が来たので、書いてみました。

# コード

https://github.com/kazuhito-m/zundoko-kiyoshi-ts/blob/master/src/main/ZundokoKiyoshi.ts

```ts:ZundokoKiyoshi.ts
/// <reference path="../typings/main.d.ts" />

export default class ZundokoKiyoshi {
    
    // "ズン"と"ドコ"の定数
    public static ZUN:boolean  = false;
    public static DOKO:boolean = true;
    
    // ズンドコ列を真偽値の配列で返す。
    public getZundokoPeriod():boolean[] {
        
        let zndkLog:boolean[] = []; // ズンドコの履歴
        let zunCount:number = 0;    // ズンカウンタ
        let zunOrDoko:boolean = ZundokoKiyoshi.DOKO;   // カレントの値

        // ズン４つに最後がドコになるまで。
        while (!(zunCount >= 4 && zunOrDoko == ZundokoKiyoshi.DOKO)) {
            // カレントが"ズン"ならカウントアップ、"ドコ"なら初期化         
            zunCount++;
            if (zunOrDoko == ZundokoKiyoshi.DOKO) zunCount = 0;
            // ズンドコ取得
            zunOrDoko = this.genZunDoko();
            // リストには絶えず足す。
            zndkLog.push(zunOrDoko);
        }
        
        return zndkLog;
    }
    
    // ズンorドコをランダムに返す。
    public genZunDoko():boolean {
        return (Math.random() * 2) < 1;
    }
    
    // ズンドコ配列を文字列に変換する。
    public convertZundokoString(zndkLog:boolean[]) {
        return zndkLog.map((e,i,a) => { return (e == ZundokoKiyoshi.ZUN ? "ズン" : "ドコ") }).join("");
    }

    // 文字列をコンソールに書く。
    public kiyoshi() {
        console.log(this.convertZundokoString(this.getZundokoPeriod()));
    }
    
}
```

割と長くなってしまったのですが…どちらかというと短さより「ズンドコ列生成部」と「表示部」を分けたかったのでこんな感じです。

「二値」ということで反射的に「boolean!」としましたが、別に0と1でも良かったなぁという反省です。

## 実行

冒頭の通り「テストのお試し」のために書いてたので、テストでズンドコします。

![zundoko2.png](https://qiita-image-store.s3.amazonaws.com/0/30271/549d790e-fa58-cfd1-e8ff-bdc03597d830.png)

割とズンドコしますね…時々「奇跡のような短さで終わる」ことがあるのですが…。

# おまけ

この `ZundokoKiyoshi` クラスに「Knockout.jsを使ったラッパー」をかぶせ「[ズンドコボタン](http://kazuhito-m.github.io/zundoko-kiyoshi-ts/)」という一枚もんのサイトを作りました。

![zundokobutton_MINI.png](https://qiita-image-store.s3.amazonaws.com/0/30271/4322824f-a8e4-cee5-ecb3-c331f807d9db.png)


+ やんごとなき理由で ズンドコキヨシ(kiyoshi関数)が書けなかった
+ 非PGで祭りにもう一つ乗れなかった
+ ええい、ズンドコ言いたいだけなのだ！

そういう方には、心置きなくなんどでも「ズンドコ」いただけます。

ぜひご利用ください。


# 参照させていただいた記事

+ [ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)
Android StudioにTwitter4jを追加


<h1>Android StudioのプロジェクトにTwitter4jを追加</h1>

<h2>Twitter4jライブラリのダウンロード</h1>
<h3>http://twitter4j.org/ja/index.html</h2>
<h4>最新安定バージョンを落としておく</h3>

<h2>jarファイルの配置</h2>
<h3>app/libsの直下にtwitter4j-core-4.0.4.jarを置く</h3>
<h3>配置したjarファイルを「Add As Library」から追加</h3>

<h2>build.gradleの確認</h2>
```build.gradle
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile files('libs/twitter4j-core-4.0.4.jar')
}
```
EP 21 Enforce Clarity with Keyword-Only Arguments

> - Keyword arguments make the intention of a function call more clear
- Use Keyword-only arguments to force callers to supply keyword arguments for potentially confusing functions, especially those that accept multiple Boolean
- Python 3 supports explicit syntax for keyword-only arguments in functions
- Python 2 can emulate keyword-only arguments for functions by using **kwargs and munually rasising TypeError


> Effective Python

Divide one number by another but be another but be very careful about special cases. Sometimes you want to ignore `ZeoroDivisionError` exceptions and return infinity instead. Other times, you want to ignore `OverflowError` exceptions and return zero instead.


```python
def safe_division(number, divisor, ignore_overflow, ignore_zero_division):
    try:
        return number / divisor
    except OverflowError:
        if ignore_overflow:
            return 0
        else:
            raise
    except ZeroDivisionError:
        if ignore_zero_division:
            return float('inf')
        else:
            raise
```

Using this function is strightforward.

```
safe_division(1, 0, True, False)
```

The problem is that it's easy to confuse the position of the two Boolean arguments that control the exception-ignoring behavior. This can easily cause bugs that are hard to track down. One way to improve this readability of this code is to use keyword arguments.


```python
def safe_division_b(number, divisor,
        ignore_overflow=False,
        ignore_zero_division=False):
    pass
```

```python
safe_division_b(1, 10**500, ignore_overflow=True)
safe_division_b(1, 0, ignore_zero_division=True)
````

However, since these keyword arguments are optional behavior, there's nothing forcing callers of your functions to use keyword arguments for clarity.

```python
safe_division_b(1, 0, True, False)
```

In Python3, you can demand clartiy by defining your functions with keyword-only arguments. These arguments can only be supplied by keyword, never by position. Here, I redefine the safe_division functions to accept keyword-only arguments. The `*` symbol in the argument list indicates the end of positional arguments and the beginning of keyword-only arguments.

```python
def safe_division_c(number, divisor, *,
        ignore_overflow=False,
        ignore_zero_division=False):
    pass

safe_division_c(1, 10**500, True, False)
```

```
   safe_division_c(1, 10 **500, True, False)
TypeError: safe_division_c() takes 2 positional arguments but 4 were given
```
bunnyを使ってRabbitMQのキューを操作する


## 使用するバージョン
* RabbitMQ 3.5.0
* bunny 2.3.0

## 条件
* vhostは`/production`
* ユーザは`user1`、パスワードは`pass`とする

## キューにメッセージを追加する（基本）

```rb:
# -*- coding: utf-8 -*-
require "bunny"

# RabbitMQに接続
conn = Bunny.new(:host => "localhost", :vhost => "/production", :user => "user1", :pass => "pass")
conn.start

# channelを作成
ch = conn.create_channel

# queue1というキューを作成
# キューが無い場合は作成（既にある場合もエラーにはならない）
q  = ch.queue("queue1")

# queue1にメッセージを追加
q.publish("Hello, world!")

# close
conn.stop
```
キューを確認すると登録されている

```
$ sudo /usr/sbin/rabbitmqctl list_queues -p /production

Listing queues ...
queue1  1
```

ただし、このやり方だとRabbitMQサーバーが再起動 or 落ちた場合、キュー＋メッセージは消えてしまう

## キューにメッセージを追加する（メッセージを永続）

RabbitMQサーバーが再起動 or 落ちてもキュー＋メッセージが残るようにするには、`durable`と`persistent`を指定する

``` rb
# -*- coding: utf-8 -*-
require "bunny"

# RabbitMQに接続
conn = Bunny.new(:host => "localhost", :vhost => "/production", :user => "user1", :pass => "pass")
conn.start

# channelを作成
ch = conn.create_channel

# queue1というキューを作成
# :durable => trueとすることで、再起動してもキューは残る
q  = ch.queue("queue1", :durable => true)

# queue1にメッセージを追加
# :persistent => trueとすることで、再起動してもメッセージは残る
q.publish("Hello, world!", :persistent => true)

# close
conn.stop
```

## キューからメッセージを取得（subscribe）

```rb
# -*- coding: utf-8 -*-
require "bunny"

# RabbitMQに接続
conn = Bunny.new(:host => "localhost", :vhost => "/production", :user => "user1", :pass => "pass")
conn.start

# channelを作成
ch = conn.create_channel

# queue1というキューを作成
q  = ch.queue("queue1", :durable => true)

# メッセージを取得
# 取得するとキューからメッセージは削除される
q.subscribe do |delivery_info, properties, msg|
  p "queue  = #{q.name}" #=> "queue  = queue1"
  p "message= #{msg}"    #=> "message= Hello, world!"
end

# close
conn.stop
```
ubuntuのnginxでPlex Media SeverとPlexConnectを動かし、ATV2からアクセス可能に

http://qiita.com/blueknight611jp/items/352f7427c358545a6ba9
でOSXでPMSとPlexConnectを動かしATV2のtrailers（予告編）からアクセスする記事を書いた。

Serverをubuntuにしてはまったので備忘録。

ubuntu 14.4（かな？）でepgrec+nginxを動かしているので、
こちらでPMSとPlexConnectも動かしたい。

PMSのinstallはapt-getでOK。
192.168.1.50でPMSが動いている。port 80は別途使用しているので8080を使う。

https://github.com/iBaa/PlexConnect/wiki/Install-Guide-Linux
に従い
PlexConnectをinstall
/usr/local/lib/PlexConnect
にした。

Generate the SSL Certificates
はOSXと同様に行う。
/usr/local/lib/PlexConnect/assets/certificates/
にtrailers.pemとtrailers.cer
をcpする。

/etc/nginx/sites-available/plexconnect
を作成

```
upstream plexconnect {
  server 192.168.1.50:8080;
}

server {
  listen 80;
  server_name trailers.apple.com;

  location / {
    proxy_set_header Host                   $host;
    proxy_set_header X-Real-IP              $remote_addr;
    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;

    proxy_pass  http://plexconnect;
  }
}

server {
  listen 443;
  server_name trailers.apple.com;

  ssl_certificate         /usr/local/lib/PlexConnect/assets/certificates/trailers.pem;
  ssl_certificate_key     /usr/local/lib/PlexConnect/assets/certificates/trailers.key;

  ssl on;

  location / {
    proxy_set_header Host                   $host;
    proxy_set_header X-Real-IP              $remote_addr;
    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;

    proxy_pass  http://plexconnect;
  }
}
```

sudo ln -s /etc/nginx/sites-available/plexconnect /etc/nginx/sites-enable/plexconnect
として
sudo service nginx restart

sudo vi /usr/local/lib/PlexConnect/Settings.cfg
として

```
enable_plexgdm = False 
ip_pms = 192.168.1.50
port_pms = 32400
enable_dnsserver = True
port_dnsserver = 53
ip_dnsmaster = 192.168.1.1 
prevent_atv_update = True
enable_plexconnect_autodetect = True
ip_plexconnect = 0.0.0.0 
hosttointercept = trailers.apple.com
port_webserver = 8080
enable_webserver_ssl = False 
port_ssl = 443
certfile = ./assets/certificates/trailers.pem
allow_gzip_atv = False
allow_gzip_pmslocal = False
allow_gzip_pmsremote = True
loglevel = Normal
logpath = .
```

sudo /usr/local/lib/PlexConnect/PlexConnect.py
で起動する。

daemon化するのは別の記事とする。
Android Nで気づいたことメモ

Android NをNexus9に導入したので、個人的に気になったことをツラツラとメモしていく記事

# Tegra Graphics Debuggerに接続できない

 * Rootedできるようになるのを待つしか無い
 * 多分Rootが取れれば追加のデバッガをインストールできるはず

# OkHttpの仕様変更でHttp Headerの内容に制限が入った

 * 言語を日本語にしている状態でKindleの書籍DLができない
 * Logcatを見ると、ヘッダに日本語（時刻のtoStringっぽい）を含めようとしている
 * URLConnectionの脆弱性対策が入った模様で、英数などの特定範囲の文字しか受け付けなくなったらしい
    * https://twitter.com/hydrakecat/status/709788601274507264
    * https://twitter.com/hydrakecat/status/709788757566824452

![2016-03-16.png](https://qiita-image-store.s3.amazonaws.com/0/15670/903a231c-b96c-4eee-ee3f-fae4103df749.png)

# 画面分割はフルスクリーンアプリには使えない

 * フルスクリーン属性で起動するアプリ（主にゲーム系）は画面分割を使用できない
 * 「ゲームをプレイしながら攻略Wikiを読む」という使い方は不可能