OmniAICreator/Qiita-1.07M huggingface dataset:
Caffeで手書き数字(MNIST)の認識学習をする

## Caffeとは

最近話題のDeep Learningのオープンソースなフレームワークです。
公式ホームページは[こちら](http://caffe.berkeleyvision.org)、C++、PythonやMATLABで使えるので得意な方を選んで使えます。
[ここ](http://demo.caffe.berkeleyvision.org)から画像分類のデモが見られるので、気になる方は試してみてください。

Caffeの導入方法は[この記事](http://qiita.com/t-hiroyoshi/items/3bba01dd11b1241f1336)にまとめておいたのでもしよろしければ参考にしてください。

## MNIST(Mixed National Institute of Standards and Technology)とは

MNISTとは28x28pxの60000枚の学習サンプル、10000枚のテストサンプルからなる手書き数字画像データベースです。ニューラルネットワークのベンチマーク的な立場で機械学習分野やDeepLearning分野で広く使われています。

CaffeにはMNISTの学習を簡単に行えるスクリプトが用意されているので試してみました！

## CaffeでMNISTを学習する

まずはCaffeのルートディレクトリに移動してください。移動後にCaffeにあらかじめ用意されているスクリプトを実行しMNISTデータ一式をダウンロードします、なおこの実行にはwgetとgunzipが必要になるので入れてない人はhomebrewとかで入れておいてください。

```
cd /path/to/caffe
./data/mnist/get_mnist.sh
```

Caffeは画像学習を行う際LevelDBかLMDB形式で読み込ませる必要があるので前述でダウンロードしてきたデータを次のスクリプトでLMDBに変換します。

```
./examples/mnist/create_mnist.sh
```

そうすると`./example/mnist/mnist_train_lmdb`と`./example/mnist/mnist_test_lmdb`が作成されたと思います。trainは学習に使用され、testの方は学習の評価に使用されます。

学習を行う前にCaffeをCPU_ONLYで動かしてる人は、`./examples/mnist/lenet_solver.prototxt`内の`solver_mode: GPU`を`solver_mode: CPU`に書き換えてください。これをやらないとバグります。

いよいよ用意したデータを元に学習を行います、これもまたスクリプトが用意されているので実行するだけです。

```
./examples/mnist/train_lenet.sh
```

そうすると`lenet_train_test.prototxt`と`lent_solver.prototxt`が読み込まれレイヤーネットワークの構築、学習が開始されます。

学習中にlossとaccuracyというものが表示されていると思います。lossは予測と正解の一致が多くなると小さくなる値、accuracyは正解率をそれぞれ意味します。なのでこれらの値の推移を見ていると学習が進んでいる様子が分かると思います。

```
I0704 solver.cpp:343]     Test net output #0: accuracy = 0.0912
I0704 solver.cpp:343]     Test net output #1: loss = 2.44682 (* 1 = 2.44682 loss)
```

学習の最後にテストが走りネットワークの最終評価が表示され、学習済みモデルとして`.examples/mnist/lenet_iter_10000.caffemodel`が出力されます。この学習済みモデルを読み込むことでいつでもMNISTの認識学習を行った後の状態のネットワークを再現できるので実際のプロダクトなどに学習済みのネットワークを組み込むことができます。

MNISTの認識学習はここまでです。今回はもともと用意されたprototxtを読み込んで学習を行ったのでパラメータのチューニングをする意味はあまりないと思いますが、`lenet_solver.prototxt`の中身の値などを変えつつテスト繰り返し、それぞれのデータを見比べるのも楽しいので是非やってみてください。

学習で出力されたモデルの使用方法や学習経過をグラフで表示する方法などもじかんがあればまとめてみようと思います。

何か間違い、ご意見ありましたらご指摘お願いします。
gcp Cloud Storageにファイルをアップロードする、もちろんubuntuから。

# **Cloud Storageにファイルをアップロードする、それだけ**

クラウドストレージにファイルをアップロードするにどうすればいいか調べてみたので、まとめます。

1.Developers consoleで[Cloud Storage][ストレージブラウザ]を選択する
2.ブラウザで表示されたバケット一覧からアップロードしたいバケットを選択する
3.上の[ファイルをアップロードする]ボタンを押すとファイル選択ダイアログが出るのでローカルのファイルを選択するだけ。

![image](https://qiita-image-store.s3.amazonaws.com/0/84915/408aaf40-ba3f-deea-9f4e-f1cf2b9acd34.png)

結構あっさり出来る…。
ん、そうじゃない感がデカイ。

# **Cloud Storageにファイルをアップロードする。Termから。**

1.ubuntuのtermからファイルをアップロードするには、gsutilを使う。
2.gsutilでCloud Storageにアクセス可能にするにはconfigを行う

````
junk@junk-VirtualBox:~$ gsutil config
````

3.実行すると以下のメッセージが出るのでhttp://からのURLをブラウザに貼り付けて表示する。
4.ブラウザにCloud Storageの認証確認が出るので許可を選択すると認証コードが表示される
5.表示された認証コードをコピーして入力待ちになっているところにペイスト！

````
This command will create a boto config file at /home/junk/.boto
containing your credentials, based on your responses to the following
questions.
Please navigate your browser to the following URL:
https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdevstorage.full_control&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&client_id=000000000.apps.googleusercontent.com&access_type=offline
In your browser you should see a page that requests you to authorize access to Google Cloud Platform APIs and Services on your behalf. After you approve, an authorization code will be displayed.
Enter the authorization code: 
````

6.すると次にプロジェクトIDを聞いてくるので設定する。
````
What is your project-id? 
````

7.設定が正常に終わればgsutilコマンドでファイルコピーできるようになる。
Cloud Storageは gs://<バケット名>/<フォルダ名>

````
junk@junk-VirtualBox:~$ gsutil cp test.txt gs://junkstorage/
Copying file://test.txt [Content-Type=text/plain]...
Uploading   gs://junkstorage/test.txt:                           6 B/6 B  
````

やったね！
Xcodeのブレークポイントを例外発生箇所にはる

デフォルトの設定では、ログの内容を読んでもあまりデバッグには役にたたない。
この設定を行うことで、例外がレイズされる直前にブレークすることができる。つまり例外発生箇所が明確になる。

Breakpoint Navigatorを表示 左下の + ボタンを選択
→Add Exception Breakpoint を選択

これで全ての例外発生箇所でブレークすることができる。
FuelPHP を 1.7.2 から 1.7.3 にすると、Presenter から Missing argument 1 for Presenter_Welcome_Hello::{closure}(), called in ... というエラーが出る場合がある。

原因は、この時の対応のようです。
https://github.com/fuel/core/commit/30643ab08bc07d9f8ae75ca8a337166aec5f117b

マニュアルによると、以下のように引数があるクロージャーが、プレゼンターに登録できると書かれています。
http://fuelphp.com/docs/general/presenters.html#/functions

1.7.2 までは、このコードは動くのですが、1.7.3 になると、Missing argument 1 for Presenter_Welcome_Hello::{closure}(), called in ...　というエラーが出るようになります。引数がない場合は、問題なく動きます。

マニュアルと実装がズれているので、マニュアルだけを見て直せないので備忘として書いときます。
原因がなかなか分からず、解決にえらい時間がかかった。参った！
AtomパッケージのTips

# Twitter Client for Atom

すみません、最初に宣伝です。Atom向けTwitterクライアントをリリースしました。

[atom-twitter-client](https://atom.io/packages/atom-twitter-client)

![A screenshot of your package](https://raw.githubusercontent.com/p-baleine/atom-twitter-client/master/screenshot.png)

よかったら使ってみてください。
※ ただし、[atom/atom#1783](https://github.com/atom/atom/issues/1783)があるので日本語でのツイートに若干の難ありです。

Atomパッケージを作るのは初めてだったので、その所感とTipsをつらつらと書いてみます。

# ドキュメント

[本家ドキュメント](https://atom.io/docs)はそれなりにしっかりしているので最初に目を通すと良いかと思います。

ただ、ちょっと突っ込んだことしようとするとこれだけではこと足りなくなります。その場合、他の人のパッケージが参考になります、自分の実現したいUIや機能に近いパッケージを探してそのソースを読むのが近道です。参考になるパッケージの例としては:

* [markdown-preview](https://github.com/atom/markdown-preview): 本家のコアメンバーの[@kevinsawicki](https://twitter.com/kevinsawicki)氏が作っているのでとても参考になります

* [atom-gitter](https://github.com/Glavin001/atom-gitter): 機能豊富なので参考になります

多分他にもあるはず、ただこの他人のパッケージを参考にするという方法にも限界があります。まず、本家のAPIの変遷が早すぎて半年前のパッケージでも参考にできないことが多々あります。後、本家の[パッケージ検索](https://atom.io/packages)が若干使い辛くて、参考にしたいパッケージが見つかりにくいという難点もあります。

最後の手段として、やっぱり[本家](https://github.com/atom/atom)のソースを読むことになります。
正直、頑張ってググるより最初からソース見に行ったほうが解決は早いと思います(残念ながらAtomは非常に検索効率が悪いので…)。

あと、[Electron](http://electron.atom.io/)のドキュメントとソースも読んでおいたほうが効率が上がります。

# HTML5とかNode.jsとか

`atom-twitter-client`ではアカウント情報の記憶にIndexedDBを使っています。
なにせChromiumベースなのでHTML5等の最新の機能は使いたい放題です。

あと、普通にNode.jsのAPIも使えます。

普段レガシーなブラウザ相手にJavaScript書いている人にとっては、互換性考慮せずに好き勝手に最新機能をCoffeeScriptで実装できるのは結構ストレス発散になるのでお勧めです。

# Publish前後の違い

一番困ったのがこれです。

レジストリにPublishする前と後でパッケージの挙動に差分があり、初めてPublishした後、Tweetの検索機能が動かなくなってしまっていました。

初めてPublishしたとき、package.jsonのdependenciesの各モジュールについてバージョンを縛り忘れていた(`*`を指定していた)のですが、dependenciesのモジュールの中にAtomのcoreが内包しているものと同じモノがある場合、`*`をしているとAtom core側のモジュールが利用される仕組みになっているようでした。

自分の場合、[request](https://github.com/request/request)モジュールを利用しているが、Publishしたパッケージを利用した時のみ若干古い`request`モジュールで動作しようとして動かなくなってました。Publishする前とした後にインストーラから落としたソース自体には変な差分は見受けられなかったので、結構原因に行き着くのに時間がかかってしまいました。

基本ですが、package.jsonのdependenciesにはちゃんとバージョン番号を指定したほうが無難なようです。

# テスト

`spec`ディレクトリ配下にサフィックスが`-spec.coffee`になっているファイルを配置しておくと、メニューの[View] -> [Developer] -> [Run Package Specs]でテストが実行されます。自分で色々下準備する必要がないので楽ちんです。
テスティングフレームワークは現時点ではJasmineの1.3が使われています。なので[1.3のJasmineのドキュメント](http://jasmine.github.io/1.3/introduction.html)を参照してテストがかけます。

ただし、`setTimeout`や`setInterval`を多用するパッケージの場合注意が必要です。本家の[spec-helper](https://github.com/atom/atom/blob/master/spec/spec-helper.coffee)がココらへんの関数をモックして回っているので、Jasmineのドキュメントを読むだけでは理解できない挙動をします。自分の場合`jasmine.useRealClock()`メソッドを使ってココらへんのモックを解除して回避しました。

# 最後に

なんか文句多くなっちゃいましたが、Atomのパッケージ作るのは楽しいです。

「自分の作業環境は自分で良くしよう」みたいなemacs根性を端々に感じるし、若干ドキュメントが不足しているがそれゆえに他人のソース読んで理解できる部分も多いし、後、もともとかっこいいUIに合わせて自分のパッケージもかっこよくUI組めたら楽しいし、githubベースだから基本オープンでpublishしたら速攻でissue飛んでくるし…繰り返しになりますが、仕事効率化を名目に遊べるストレス発散措置としてはemacsなみに楽しいです。
Starscream 導入メモ (1日目)

OSX(Swift) と Web サーバとの間で WebSocket を繋ぎたい。

[Starscream](https://github.com/daltoniam/starscream) というフレームワークの導入メモ。
ちなみに Starscream は iOS / OSX どっちでも使える。

大概のフレームワークは Cocoapods で管理できる。うそかも。
まずは Cocoapods の入門情報をあさる。

>初めてのCocoaPods - Qiita
>http://qiita.com/shishimo@github/items/d7f508e2489bcc68050e

上記ページにインストールから使い方まで載ってる。
`Podfile` の内容は Starscream の GitHub に載ってる。

`pod install` が終わったら、
Xcode プロジェクトフォルダの `.xcworkspace` を開く。

`Pods` っていうプロジェクトが増えてる。
ビルドしてみる。

こける。
プラットフォームが違うとか言われる。

>CocoaPods を OS X アプリ開発で使う
>http://qiita.com/usamik26/items/3c73f66a464a62e7813f

上記ページによると Starscream の GitHub に載ってる `Podfile` は iOS 用らしい。
プラットフォームを OSX にする必要がある。

ビルドしてみる。
しかし今度は動作対象の OS バージョンが古すぎるとか言われる。

言われてるとおりに設定をかえる。
`Pods プロジェクト > TARGETS > Pods-Starscream > Build Settings` の、
`OS X Deployment Target` って設定値をかえる。

ビルドしてみる。
通った！

今日はおわり。
AppCompatCheckBox でハマったこと

※ 引用 : http://blog.384ta.com/appcompatcheckbox

Android Support Library 22.1 の登場と共に、 [AppCompatFooBar](http://android-developers.blogspot.jp/2015/04/android-support-library-221.html) シリーズが充実しました。 Android 4.4 以下でも Material Design ライクな UI ウィジェットが使えるようになって、デザインの統一感が向上させられると思います。

そんな AppCompat シリーズの 1 つである AppCompatCheckBox を使うときにハマったことがあるので、共有したいと思います。話としては CheckBox に限らない、 AppCompatFooBar 全般の話なのですが、 CheckBox を触る上で出会った事柄なので …… 。

## AppCompatCheckBox がレンダリングされない

CheckBox を使って UI を組んでいた場所を AppCompatCheckBox に置き換え、いざビルドしてみても CheckBox がレンダリングされないということが最初に躓いたところでした。

[![001.png](https://d23f6h5jpj26xu.cloudfront.net/snrcnwc5dgma3q_small.png)](http://img.svbtle.com/snrcnwc5dgma3q.png)

やりたいことは、

1. support-v7 の AlertDialog の上に ListView を乗せたい
2. ListView の各行で使う View の中では AppCompatCheckBox を乗せたい

というものです。上のスクリーンショットを見れば分かるのですが、 本来各行の右側にあるはずの AppCompatCheckBox が表示されていませんね。

また、この例では AppCompatTextView の文字色もかなり薄い色になっていますが、躓いた環境では XML 上で textColor を当てはめていて、これも問題の特定に時間がかかった原因でした。

※ AppCompatTextView / AppCompatCheckBox には `android:theme="@style/AppTheme"` を適用しています。

## 原因は LayoutInflater の使い方

Dialog の表示には support-v4 の DialogFragment を使っています。 DialogFragment の onCreateDialog の中で ListView を inflate させるために使っていた LayoutInflater ですが、

```java
Context context = getActivity().getApplicationContext();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
```

`Context#getSystemService` メソッド経由で取得していました。この LayoutInflater を、

```java
LayoutInflater inflater = LayoutInflater.from(getActivity());
```

に変え、さらに、 ListView にセットしていたカスタム Adapter のコンストラクタにこの inflater を渡すようにしてみました。

```java
// 抜粋
public static class MyAdapter extends ArrayAdapter<MyData> {
    private int mResource;
    private LayoutInflater mInflater;
    public MyAdapter(Context context, int resource, List<MyData> objects, LayoutInflater inflater) {
        super(context, resource, objects);
        mResource = resource;
        mInflater = inflater;
    }
```

結果、

[![002.png](https://d23f6h5jpj26xu.cloudfront.net/2m8nn1gbgkdoq_small.png)](http://img.svbtle.com/2m8nn1gbgkdoq.png)

テーマがキチンと適用されて、表示されました。これまで LayoutInflater は特に理由がなければ `Context#getSystemService` 経由で取得していたのですが、それが災いしてハマってしまいました。不勉強でした ('A`)

AppCompatFooBar シリーズを使っていて、同じような問題に出会った人の助けになれば幸いです。
Scalaでyrmcdsキー一覧取得

[yrmcds](https://github.com/cybozu/yrmcds)1.1.4で、キー一覧を返す `keys` コマンドが追加された！
ということで、早速試してみる。
インストール方法は[こちら](http://qiita.com/zaneli@github/items/e59ea6f2c1499b16b996)とほぼ同じで、バージョンを 1.1.1 → 1.1.4 に読み替える。

```
telnet 192.168.xxx.yyy 11211

set foo 0 0 3
bar
STORED

set hoge 0 0 4
fuga
STORED

keys
VALUE foo
VALUE hoge
END

keys f
VALUE foo
END
```

`keys`で全キーを、`keys <prefix>`で前方一致で取得できるようだ。
やったね！

それではScalaで同じ事を…と思ったのだが、既存のmemcachedライブラリでは任意のコマンドを発行する事が(多分)できないっぽい…。
仕方がないのでtelnetクライアントを自作してみよう。
netty4系で[こちらのサンプル](https://github.com/netty/netty/tree/master/example/src/main/java/io/netty/example/telnet)を参考にすればよさそうだ。

```scala:
import io.netty.bootstrap.Bootstrap
import io.netty.channel._
import io.netty.channel.nio.NioEventLoopGroup
import io.netty.channel.socket.SocketChannel
import io.netty.channel.socket.nio.NioSocketChannel
import io.netty.handler.codec.string.{StringEncoder, StringDecoder}
import io.netty.handler.codec.{Delimiters, DelimiterBasedFrameDecoder}

import scala.collection.mutable.ListBuffer
import scala.concurrent.{Future, Promise}

class YrmcdsClient(host: String, port: Int) {
  def keys(prefix: String = ""): Future[Seq[String]] = {
    TelnetClient.call(host, port) { c =>
      c.writeAndFlush(s"keys $prefix\r\n").sync()
        .channel().pipeline.get(classOf[TelnetClientHandler]).result
    }
  }
}

object TelnetClient {
  def call[A](host: String, port: Int)(f: Channel => A): A = {
    val g = new NioEventLoopGroup()
    try {
      val b = new Bootstrap().group(g).channel(classOf[NioSocketChannel])
      val cf = b.handler(new TelnetClientInitializer()).connect(host, port).sync()
      val c = cf.channel()
      val r = f(c)
      c.closeFuture().sync()
      r
    } finally {
      g.shutdownGracefully()
    }
  }
}

class TelnetClientInitializer extends ChannelInitializer[SocketChannel] {
  private[this] val decoder = new StringDecoder()
  private[this] val encoder = new StringEncoder()
  private[this] val handler = new TelnetClientHandler()

  override def initChannel(ch: SocketChannel): Unit = {
    val pipeline = ch.pipeline()
    pipeline.addLast(
      new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter(): _*),
      decoder,
      encoder,
      handler)
  }
}

class TelnetClientHandler extends SimpleChannelInboundHandler[String] {
  private[this] val keys: ListBuffer[String] = ListBuffer.empty[String]
  private[this] val p = Promise[Seq[String]]()

  def result: Future[Seq[String]] = p.future

  private[this] val prefix = "VALUE "
  private[this] val prefixSize = prefix.size

  override def channelRead0(ctx: ChannelHandlerContext, v: String): Unit = {
    if (v.startsWith(prefix)) {
      keys += v.drop(prefixSize)
    }
    if (v == "END") {
      p success keys.toSeq
      ctx.close().sync()
    }
  }
}
```

こんな感じでキーが取れた！
やったね！

```scala:
scala> val c = new YrmcdsClient("192.168.xxx.yyy", 11211)

scala> val r1 = c.keys()
scala> r1.onSuccess{ case keys => println(keys) }
List(foo, hoge)

scala> val r2 = c.keys("f")
scala> r2.onSuccess{ case keys => println(keys) }
List(foo)
```
0-99を空き番なしでランダムに出力する

```lang:Random100.java	
public static void main(String[] args) {
	Random random = new Random();
	List<Integer> list = new LinkedList<Integer>();
	for(int i = 0; i < 100; i++) list.add(new Integer(i));
	while(0 < list.size()) 
System.out.println(list.remove(random.nextInt(list.size())));

	}

```
初めてのmacを買ったテンションで設定とかを書き留める

今まで欲しいとは思いつづけていたけど価格が高いんでどうしても手が出なかったmac。そのmacをついに! 今日! 手に入れたんだ!

その勢いで備忘録も兼ねてインストールしたアプリとか設定とか書き留めておくね。

## まずインストールしたアプリ
### Google Chrome
これが無いとブックマークとか引き継げないんだよね。
自分的必須アプリ。

### Kobito
ぜんぜん必須じゃない（ゴメン）んだけど、設定をメモりながらいじりたかったから早めにインストール。
## ここでハタと気づいた
MacBook Airをポチったときに中二病全開で「やっぱりMacBook AirにはUSキーボードだよねー( ￣▽￣)」なんて言いながらUSキーボードを選択しちゃったんだけど、日本語入力をするにはどうすればいいのかわからないよ! 初期設定でもUSにしちゃったから日本語入力への変更方法わからないし…

**俺、バカ**

## ググって日本語設定してみた
ググってみたらこのページ http://kosu0621.blog88.fc2.com/blog-entry-1228.html がヒットしたので参考にさせていただく。
システム環境設定 -> キーボード -> 入力ソース -> 左下の「＋」をクリック
そのメニューで日本語を追加できるので追加する。
入力切り替えはショートカットは ⌘+[space]らしい。まあこうやって書けてるから良しとしよう。

おまけに高校の同級生にtwitterでそそのかされて キーボード -> 修飾キー で[caps lock]キーと[control]キーを入れ替える。

## そしてつづきのインストール
### Xcode
まあ、当然でしょう。そのために買ったんだし。

### LINE
なんだかんだ言ってLINEは使うよねえ。

### Wunderlist
GTDやりたい意志だけは示そうと思って早めにインストール。

## 中二の極めつけ
### 壁紙をかわいい女の子に!
おしゃれな壁紙にしたいなあと思ってエロ^H^H 画像を物色していたら[かわいい女の子](http://www.susancoffey.net/ "Susan Coffey")がツボったのでいい感じの[壁紙](http://www.wallpaperhi.com/People/Susan_Coffey/brunettes_women_susan_coffey_108233/download_1440x900)にしてみた。
ちょっとアプリの脇からのぞく瞳がほんとかわいいんだよ( ￣▽￣)

### 終わりに
まだまだ不完全なので明日に続く。

ちなみに、これでも44歳です( ￣▽￣)
Debian7のDockerfileのひな形

いちいちコピってくるのも面倒なのでここに貼っておく。

```Dockerfile
FROM debian:wheezy

# aptで日本のミラーを使う
RUN echo "deb http://ftp.jp.debian.org/debian wheezy main non-free contrib" > /etc/apt/sources.list && \
  echo "deb-src http://ftp.jp.debian.org/debian wheezy main non-free contrib" && \
  echo "deb http://security.debian.org/ wheezy/updates main contrib non-free" >> /etc/apt/sources.list && \
  echo "deb-src http://security.debian.org/ wheezy/updates main contrib non-free" >> /etc/apt/sources.list && \
  echo "deb http://ftp.jp.debian.org/debian wheezy-updates main contrib non-free" >> /etc/apt/sources.list && \
  echo "deb-src http://ftp.jp.debian.org/debian wheezy-updates main contrib non-free" >> /etc/apt/sources.list

# インストールに入力待ブロックをしなくなる
ENV DEBIAN_FRONTEND noninteractive

RUN echo "Asia/Tokyo" > /etc/timezone && \
  dpkg-reconfigure tzdata

RUN apt-get update && apt-get upgrade -y && \
  apt-get install -y sudo && \
  apt-get clean
```

これを使ってビルドしたい場合は以下の様な感じにする。

```bash
docker build -t tag_tmp --no-cache .

docker run \
  --name tmp_name \
  -v "/tmp/tmp:/usr/local/tmp" \
  tag_tmp \
  sh -c ""

docker rm tmp_name
```
centos6.6 + python2.6 + postgresql9.4 + django1.4 の組み合わせで、djangoのチュートリアルやってみた

# チュートリアルのコード

[djangoのチュートリアル](http://django-docs-ja.readthedocs.org/en/latest/intro/tutorial01.html)をやってみた
という記事はいろいろあるのですが・・・
(例えば、[こちら](http://yymm.bitbucket.org/blog/html/2013/09/12/django_v15_tutorial.html)が結構詳しいです。)

いざ自分で実装してみたら、コードを変えないと動かない箇所があったり
その全体像が分かりにくい点があったり
したので、一応までに私が作成した結果をgithubで公開してみることにしました。

どなたかの参考になれば幸いです。

https://github.com/mita-masahiro/django14_tutorial


# 環境構築

環境構築の手順は下記の通り。

python2.6だと
djangoは1.4までしか動作しない模様。


|Django    |Python versions      |
|:---------|--------------------:|
|1.4       |2.5, 2.6, 2.7        |
|1.7, 1.8  |2.7 and 3.2, 3.3, 3.4|
|1.9       |2.7, 3.4, 3.5        |


django1.4は、ロングタイムサポートとなっているらしい。

django1.4は[ここ](https://www.djangoproject.com/download/)からダウンロードできる。

ダウンロードすれば
解凍したディレクトリに入り

```bash:
python setup.py install
```

にてdjangoをインストールできる。

```bash:
cd /var/www/html/
django-admin.py startproject myapp
```

にて、プロジェクトが作成される。

```bash:
./manage.py runserver 0.0.0.0:8888
```

にて、開発用サーバが起動することを確認する。
（iptablesのポートを空けておくこと）

VM上のcentos6.6で開発を行うことを想定。
VMのIPアドレスは下記の通りとする。
192.168.56.10

この場合

```bash:
http://192.168.56.10:8888
```

にアクセスして、it worked!と表示されればOK。

postgresqlを使う場合は、下記をインストールする必要がある。
postgresql_psycopg2
この為、下記の作業を行う。

```bash:
yum install python-psycopg2
yum install postgresql-devel
cd /var/www/html/myapp
python manage.py syncdb
```

でいけた。
「ハッシュ」ってどんな意味？

「ハッシュ」と呼ばれるものがいくつかありますが、それらは密接に関連しています。ちょうどRubyにも、そのような事情を知れるメソッドがあります。

# hashの原義
hashを英和辞典で引くと、「細切れにする」というような意味があります。ハッシュドビーフやハッシュドポテトというような料理を考えてみれば、わかりやすいと思います。

# ハッシュ関数
「ハッシュ関数」と呼ばれる関数がありますが、これは、上に述べたようにデータを「細切れにして」何かしらの値を取り出す関数です。もちろん、でたらめに行うのではなく、同じ値を与えれば同じ値を返すような関数です。ハッシュ関数が返す値を「ハッシュ値」といいます。あるハッシュ関数については、どんな入力を与えても、一定のビット数でハッシュ値を返します。

## ハッシュ関数の用途
ハッシュ関数には、いくつかの用途があります。大雑把にまとめてしまえば、多種多様なデータを、「ハッシュ値」という統一したものでハンドリングできるようになる、ということです。

### 暗号化目的
たとえば、文書が改竄されていないかをチェックするに当たって、何メガバイトもある全文に対して処理するより、僅かなビット数のハッシュ値に対して操作するほうが容易ですし、また適切なハッシュ関数を選べば、ハッシュ値から元の値に関する情報を得られないようにすることもできます。

SSL証明書の電子署名も、証明書全体ではなく、ハッシュ値に対して行っています。少し前にSHA-1からSHA-2への切り替えというのが話題となりましたが、この2つもハッシュ関数の名称です。

### データ区分・検証用
たとえばGitでは、コミットのIDにSHA-1の結果を利用しています。また、ISOファイルなどの配信サイトで、本体ファイルとは別にSHA-1などのハッシュ値が置いてあって、壊れずにダウンロードできたかをチェックできるようになっていることがあります。

### ハッシュテーブル
連想配列の内部構造として、キーのハッシュ値を取って、それを基準に格納する方法があって、「ハッシュテーブル」と呼ばれます。

Perlではこのような実装から連想配列自体が「ハッシュ」と呼ばれるようになったほか、Rubyでも連想配列は`Hash`クラスです。

## ハッシュ関数の性質
ハッシュ関数が持つべき性質にはいろいろあります。まずは、全く別なデータでハッシュ値が一致すること（衝突）が少ないほうが好ましいです。ハッシュテーブルでも衝突が起きれば効率は落ちますし、暗号化系ではハッシュが衝突する別な文書を容易に見つけられるようだとデータの改竄ができてしまいます。また、エラー検出・暗号系に使うようなハッシュ関数では、元データが少し書き変わればハッシュ値が違うものになる、という必要があります（そうでないと役に立ちません）。

また、暗号用のハッシュ関数では、ハッシュ値がわかっても元のデータに関する情報が得られないなど、高度な要件が必要となります。

# Rubyでの`Object#hash`
Rubyには、ルートクラスの`Object`に[`hash`メソッド](http://docs.ruby-lang.org/ja/2.2.0/method/Object/i/hash.html)があって、連想配列（`Hash`）のキーとして使う場合に、ハッシュ値として利用されます。
AWS lab

#JAWS　参加してー#

こんなことを最近思っている名物おやじです。

僕が住んでいる広島はなかなかJAWSがなかなか開催されません。

FBなどを見ていても、大阪や東京ではAWS hubや　勉強会など
がたくさん開かれるのを見て、地方のむなしさを感じております。

来年の３月に東京に住み始めるのでそれまでに
JAWS　広島開催を切に願っております（笑）

ところで、今日は卒論を書いており、なかなか時間が。。。（言い訳）

しかし２つのいいサイト（皆様には当たり前かも。。）発見！！！

1,AWS blog　これは最新情報を伝えてくれるやつで、AWSの初心者の僕でも見ていてわかるように
書いてあります。個人的には日本語版よりも英語版のほうが好きです。

2,AWS のlab　　これはまずyoutubeのAWS動画ページで概要を勉強した後に
実際にハンズオンでできるサイトです。
こちらの　[slideshare] http://www.slideshare.net/ayumitada126/awsaws20150514-jaws-ugbeginnerayumitadaupload
でも紹介されています。　

最後にもう一つ。　今日、わが社の技術者ブログがあることを知った！！！（おそっ）
これはチェックするしかない！！！！！！！

また次からは写真やコードも載せてより見やすいようなものを書いていきます。
よろしくお願いします。
Protectedなメンバ変数を書き換えるどうでもよい方法

# 問題
Base、及びそれを継承しているDerivedがあります。

``` Base.java
public class Base {
	protected String message = "Base";

	public String inspect() {
		return "I'm " + message;
	}
}
```

``` Derived.java
public class Derived extends Base {
	public Derived() {
		super.message = "Derived";
	}
}
```

Derived#inspect()を呼び出した時、`I'm cracked`と表示させるにはどうすれば良いか？
- リフレクションは使わない
- Base, Derivedはもちろん変更しない
- 異なるパッケージにファイルを追加して対応する

``` Test.java
public class TestA {
	public static void main(String[] args) {
		Derived derived = new Derived();
		derived.message = "cracked";
		// ^これはmessageが見えないのでエラーになる
		System.out.println(derived.inspect());
	}
}
```



# 解答

こんな感じで、Baseを継承したCrackerクラスを用意。
その中のメソッドで置き換えます。

``` Cracker.java
public class Cracker extends Base {
	public void crackDerived(Derived derived) {
		derived.message = "hacked";
	}
}
```


``` Test.java
public class TestA {
	public static void main(String[] args) {
		Derived derived = new Derived();
		Cracker cracker = new Cracker();
		cracker.crackDerived(derived);
		System.out.println(derived.inspect());
	}
}
```


# 結論
- Javaのアクセス修飾子はインスタンス単位ではなくクラス単位。
- 継承関係が兄弟関係にあるクラスでもprotectedフィールドが見える。
- なんで？
Phoenix Frameworkを公式のガイドに沿って使ってみる その1


Phoenixが最近来ているようなので、僕も触ってみたいと思いました。
並列性、安全性、速度面、チャンネルがフレームワークの中に入っていて、無理矢理感が無い...などというメリットがあるようです。
APIサーバを立てるのには最良の選択肢であるとも聞きました。

それでは公式ページの内容に沿って初めていきます。
今回は新規ページを追加するところまでやろうと思います。
まずはもろもろのインストールから。

# インストール
公式ページでは[こちら](http://www.phoenixframework.org/v0.14.0/docs/installation)
僕は既にelixirが入っていました。
入っていない人は[こちら](http://elixir-lang.org/install.html)から。

次にHexをインストールします。以下のコマンドで。

```
$ mix local.hex
```

Phoenixをインストールします。以下のコマンドで。

```
$ mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v0.14.0/phoenix_new-0.14.0.ez
```

# Up And Running
公式ページでは[こちら](http://www.phoenixframework.org/v0.14.0/docs/up-and-running)

まず、アプリケーションを作成します。以下のコマンドで。
ディレクトリは適宜変更してください。

また、アプリケーションの名前は `hello_phoenix ` にします。

```
$ mix phoenix.new /Users/me/work/elixir-stuff/hello_phoenix
```

```
$ mix phoenix.new hello_phoenix
```

これで、先ほど指定したディレクトリに、アプリケーションのひな型ができたと思います。

ではサーバを動かしてみましょう。
```
$ cd hello_phoenix
$ mix phoenix.server
```

ブラウザで `http://localhost:4000/` にアクセスしてみると、公式ページのように表示されました！

# Adding Pages
公式ページでは[こちら](http://www.phoenixframework.org/v0.14.0/docs/adding-pages)

次に `/hello` にアクセスできるよう、ページを追加します。

## ルータの追加

`web/router.ex` を以下のように変更します。

```
get "/hello", HelloController, :index
```
を追加します。

```
defmodule HelloPhoenix.Router do
  use HelloPhoenix.Web, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
  end

  pipeline :api do
    plug :accepts, ["json"]
  end

  scope "/", HelloPhoenix do
    pipe_through :browser # Use the default browser stack

    get "/", PageController, :index
    get "/hello", HelloController, :index
  end

  # Other scopes may use custom stacks.
  # scope "/api", HelloPhoenix do
  #   pipe_through :api
  # end
end
```

## コントローラの追加
`web/controllers/hello_controller.ex` ファイルを作成してください。
内容は以下の通りです。

```
defmodule HelloPhoenix.HelloController do
  use HelloPhoenix.Web, :controller

  def index(conn, _params) do
    render conn, "index.html"
  end
end
```

## ビューの追加
`web/views/hello_view.ex` ファイルを作成してください。
内容は以下の通りです。

```
defmodule HelloPhoenix.HelloView do
  use HelloPhoenix.Web, :view
end
```

## テンプレートの追加
最後に、テンプレートを追加します。
`web/templates/hello/index.html.eex` ファイルを作成してください。
内容は以下の通りです。

```
<div class="jumbotron">
  <h2>Hello World, from Phoenix!</h2>
</div>
```

## 表示
`http://localhost:4000/hello` にアクセスしてみると、公式ページのように表示がされました！
エラーページに遷移する方は、一度サーバを再起動するといいかもしれません。あと、カンマを忘れていないか確認してみてください。
ElixirのGETTING STARTED（3.Basic operators）をやってみた

## URL
http://elixir-lang.org/getting-started/basic-operators.html

## 試した環境
* Ubuntu Server 14.04 LTS 
* Erlang/OTP 18
* Elixir 1.0.4

## Basic operators

### 文字列の連結:```<>```

```sh
iex> "foo" <> "bar"
"foobar"
```

### 短絡ブール演算子: ```and```, ```or```, ```not```
引数がtrueやfalseでないと失敗する

```sh
iex(2)> true and true
true
iex(3)> false or true
true    
iex> not true
false
iex> false or is_atom(:example)
true
iex> 1 and true
** (ArgumentError) argument error: 1
```

短絡演算子なので、演算子の第一引数を評価した段階で式全体の値が定まらない場合のみ第二引数を評価する。
unknown_function()は、定義していないが、下記の初めの２つの例では、評価されないので失敗しない。

```sh
iex> false and unknown_function()                
false
iex> true or unknown_function()                 
true
iex> true and unknown_function()
** (RuntimeError) undefined function: unknown_function/0
```

ちなみにandとorは、Erlangのandalsoとorelse演算子と同じ。

### 論理演算子: ```||```, ```&&```, ```!```

どんな型でも引数として受け入れる。falseとnil以外はtrueとして評価される。

```sh
iex> 1 || true
1
iex> false || 11
11
iex> nil && 13
nil
iex> true && 17
17
iex> !true
false
iex> !1
false
iex> !nil
true
iex> !11 
false
```

使い分けの目安としては、引数がbooleanの場合は、and, or, notを使い、引数のどれかがnon-booleanの場合は、&&, ||, !を使う。

### 比較演算子：```==```, ```!=```, ```===```, ```!==```, ```<=```, ```>=```, ```<```, ```>```

```sh
iex> 1 == 1
true
iex> 1 != 2
true
iex> 1 < 2
true
```

比較するものがfloatの場合は、```==```と```===```の違いに気をつける必要がある。```===```の方がより厳密に比較する。floatを扱っている場合は、注意が必要。

```sh
iex> 1 == 1.0
true
iex> 1 === 1.0
false
iex> 1 != 1.0
false
iex> 1 !== 1.0
true
```

ちなみにErlangだと```===```は```=:=```（同一である）, ```!=```は```/=```（等価ではない）, ```!==```は```=/=```（同一ではない）と対応する。
```==```と```===```の使い方としては、飛行機本に従うなら大抵の場合は、```===```を使った方が良い。

実用主義的な理由で異なる型の比較もできる。

```sh
iex> 1 < :atom
true
```

比較の順番は次のように定義されている。
ソートするために、異なるデータ型を心配する必要はない。

```sh
number < atom < reference < functions < port < pid < tuple < maps < list < bitstring
```

上記の定義は、例えば、どんな大きさの数でもどんなatomよりは小さいということを意味している。

```sh
iex> 312312335345 < :a
true
iex> :a < is_atom(:a)
true
iex> :a > is_atom(:a)
false
iex(47)> :abc < {:a,:b}
true
```
非同期通信（Ajax）をするときはタイムアウト処理を必ず入れてほしい（切実）

**非同期通信（Ajax）を行うとき、きちんとタイムアウト処理を入れていますか？** スマートフォンやタブレットでWebサイトを閲覧しているとき、地下に入ったりして通信ができなくなるというケースは頻繁に起こります。そんなとき、きちんとタイムアウト処理をしていないと、場合によってはいつまで経ってもローディングが終わらず、ユーザーが離脱してしまうということが起こります。**質の高いWebコンテンツ制作のために、必ずタイムアウト処理は入れましょう。**

#jQueryでの実装例
たとえばjQueryでAjaxを扱うajax()メソッドには、timeoutという便利なオプションがあります。timeoutに指定した時間（ms）が経過しても通信が完了しない場合、エラー処理が実行されます。手軽に実装できるので、ajax()メソッドを使うときは必ず設定しましょう。

```js:JavaScript
// 10秒経っても通信が成功しない場合は失敗処理を実行する例
$.ajax({
    type:"GET",
    url:hogeURL,
    cache: false,
    timeout: 10000
}).then(
  successHandler,
  errorHandler
);
```

##高い確率で失敗するAjaxのデモ
ajax()メソッドのtimeout指定時の挙動を確かめるため、jsdo.itにデモをアップしました。
[高い確率で失敗するAjax](http://jsdo.it/tonkotsuboy/1p8m)
「ロード開始」をクリックすると、テキストファイル http://jsrun.it/assets/g/4/B/4/g4B4z を取得開始します。1ms以上の時間がかかったら「通信失敗」のアラートが表示されます。多くの環境でエラー処理が実行されるでしょう。

#最後に
先日電車の中で某スマートフォンサイトを閲覧している時、地下に入りました。ちょうどWebサイトでは非同期通信が始まり、ローディング画面が表示されました。地下を抜けても、ずっとそのサイトはローディング画面のまま何も起こらず、私はWebサイトを離脱しました。**「ローディング」の表示だけだとユーザーは何が起こっているのかわかりません。時間がかかっていたり通信に失敗しているならばきちんとその旨を説明してあげるのが親切でしょう。**
Installing CentOS7 on Hyper-V@Windows8.1

基本的にはブートメディアにISOなり物理ドライブなり指定しつつ仮想マシン作って、OSインストールするだけ。
ただし、仮想マシンの世代に第1世代を指定しないと「Fast TSC calibration failed」とか何とか言われて、
インストールに失敗する

![image](https://qiita-image-store.s3.amazonaws.com/0/82696/6676c609-3650-5669-7c7b-94aea140b353.png)
↑ここで指定しとかないと後で泣く

詳しい手順っすか？ggrks

追記：
https://technet.microsoft.com/ja-jp/library/dn282285.aspx
＞第 2 世代仮想マシンではセキュア ブートが既定で有効になり、セキュア ブート オプションを無効にしないと Linux 仮想マシンは起動しません。
こっちの方法でもいけるっぽい？
Ubuntu 15.04(vivid)でMariaDBをインストールするときのメモ

MySQLがインストールされておらず、MariaDBをインストールした直後の状態から説明。

# まずはログイン #
mysqlと操作どころかコマンドも変わらないので以下コマンドを実行。
``` mysql -u root -p ```
パスワードを求められるので、*ubuntu*と入力するとroot権限でログインできる。
ログインしたら以下のコマンドでちゃんとパスワードを変更しておきましょう。
```use mysql;
update user set password=PASSWORD("任意のパスワード") where User='root';
flush privileges;
quit```

続いてMariaDBを再起動
``` sudo service mysql restart```

以上
P.S. もしかしたら追記するかもしれない。
JSON Table Schema から SQL の CREATE 文を生成する


JSON Schema とは違うものとして、Open Knowledge Foundation が [JSON Table Schema](http://dataprotocols.org/json-table-schema/) というデータプロトコルを定義しています。エクセルなどで使うような表形式のデータ構造を定義し、機械的に使いやすくしましょう、という試みです。
[Data Packaged Core Datasets](https://github.com/datasets) でデータの作成が進められています。GDP や金の価格、CO2 排出量などの社会的なデータはもちろんなのですが、通貨コード（ISO 4217）、言語コード（ISO 639-1、639-2）、国・地域コード（ISO 3166-2）、MIME-Type など、たまに必要になるけどどこにあるんだっけ、と思うデータもまとめられています。
CSV 形式でデータが公開されていますので、既存のデータベースに取り込めばすぐに他のデータと結合して利用できます。ただ、データベースに取り込むときに *CREATE* 文を書くのも煩雑なので変換プログラムを作成してみました。

- [skitazaki/jtsddl](https://github.com/skitazaki/jtsddl)　 - GitHub.com

## 使い方やサンプル

準備：

```bash
$ go get -d -v
$ go build -o jtsddl
$ ./jtsddl --help
```

ISO 3166-2 のデータセット（[datasets/country-list](https://github.com/datasets/country-list)）を試してみます。カラム情報を取得し、プラスαで管理用のフィールドも追加したテーブル定義を出力します。
※ データの構造を少し変更する必要がありますので、 `jq` を使っています。

```bash
$ curl -LO https://raw.githubusercontent.com/datasets/country-list/master/datapackage.json
$ jq '.resources[0]' datapackage.json > country_list.json
$ ./jtsddl -t country_list country_list.json
CREATE TABLE country_list (
    _id SERIAL,
    "Name" text,
    "Code" text,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL
);
```

当然ですが、スキーマ定義は自分で用意することも可能です。[統計局ホームページ/統計に用いる標準地域コード](http://www.stat.go.jp/index/seido/9-5.htm)からダウンロードできるCSVファイルに関するサンプルデータを上記レポジトリの example に置きました。制約条件を付加しておくことで、テーブル定義もそれらしくなっていると思います。

```bash
$ ./jtsddl example/address_code_jp.json
CREATE TABLE address_code_jp (
    _id SERIAL,
    "prefecture_code" varchar(2) NOT NULL,
    "municipality_code" varchar(3) NOT NULL,
    "address_code" varchar(5) NOT NULL UNIQUE,
    "prefecture_name" varchar(200) NOT NULL,
    "municipality_name_1" varchar(200),
    "municipality_name_2" varchar(200),
    "municipality_name_3" varchar(200),
    "yomigana" varchar(200),
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL
);
```

現在は PostgreSQL をメインターゲットにしていますのでデータ型が微妙ではありますが、外部データを取り込むときに手作業で *CREATE* 文を書くよりはマシかなと思います。

## バイナリの作成

Go言語だとクロスコンパイルが可能ですが、そのビルド環境の管理をどうしようかなと考えることがありました。イントラネットだと自前でなんとかする必要がある点が課題です。
Docker Hub の公式イメージには *cross* というタグがあり、これを使うと割と簡単にビルドできます。

- [golang Repository](https://registry.hub.docker.com/_/golang/) - Docker Hub Registry

たとえば、Windows, MacOSX, Linux の 32bit, 64bit 環境向けにバイナリを作成するには、コンテナ内で以下のようなシェルスクリプトを実行します。必要に応じて `go test` も実行すると良いでしょう。

```bash
#/bin/bash
set -eux

APP=jtsddl

go get -d -v
# go test -v 2>&1 | tee test.txt
for GOOS in darwin linux windows; do
    for GOARCH in 386 amd64; do
        env GOOS=\$GOOS GOARCH=\$GOARCH go build -v -o $APP-\$GOOS-\$GOARCH
    done
done
```

## その他

SQL 文を書き出すのではなく、GORM（Go言語製のO/Rマッパー; [jinzhu/gorm](https://github.com/jinzhu/gorm)） 用の構造体を書き出すのも一案かなと思いました。システムの規模感や、既存システムとの親和性に応じて出力方式を選択できると良さそうです。
console.log()を使うときのおすすめ記述方法

（2015/09/01追記）
TypeScript版を書きました。
[TypeScriptでconsole.log()を使うときの便利メソッド](http://qiita.com/tonkotsuboy_com/items/7443ffb6351e6bd2526b)
* * *
ブラウザの開発者ツールのコンソールに、デバッグ用の文字列を出力するconsole.log()という便利なメソッドがあります。しかし、使用時には2点気をつけなければならないことがあります。

# console.log()を使う上での2つの問題点
問題1 一部対応していないブラウザがある。
例えばIE6、7、8、9ではconsole.log()は実行されません。

問題2 デバッグ用の出力を消し忘れたまま本番公開してしまう。
デバッグ用の出力はあくまで開発段階で必要なものです。本番サイトにおいてもそれが出力されたままなのは運用上よろしくありません。公開前にすべて非表示にするべきです。とはいえたくさんの箇所にconsole.log()の記述をしていたら、それをすべて消すのは面倒です。

# 解決案
上記2点の問題を解決する手段として、私はconsole.log()をラップした新しいメソッド「trace()」を作成しています。具体的には以下のようなコードです。

```js:JavaScript
/** デバッグモードかどうか。本番公開時にはfalseにする */
var DEBUG_MODE = true;

/** デバッグモードでConsoleAPIが有効な場合にログを出力する */ 
function trace(s) {
    if (DEBUG_MODE && this.console && typeof console.log != "undefined") {
        console.log(s);
    }
}
```

開発中、ログの出力が必要な箇所でtrace()を実行します。IE6~9ではエラーは発生しません。（ただし、ログの出力もありません）。本番公開時にはDEBUG_MODEをfalseにするだけで、ログの出力はなくなります。trace()の実行箇所をすべて削除する必要はなく、ログ出力の消し忘れの危険性が減ります。

そもそもDEBUG_MODEをfalseにし忘れる可能性があるならば、例えば以下のようにDEBUG_MODEを本番URLに紐づけてしまうのもよいでしょう。

```js:JavaScript
/** デバッグモードかどうか。本番URLが含まれている場合は自動でfalse */
var DEBUG_MODE = true && window.location.href.indexOf("本番URL") >= 0;
```

また、GruntやGulpを使って本番公開時にtrace()メソッド自体を削除するという手もあります。しかし、trace()メソッドを残しておくと開発者ツールでDEBUG_MODEをtrueにして、本番サイトでの動作チェックもできるので、個人的には削除はしない派です。
64bit環境のPHPで32ビットシフトしたことにする

もんすごい小ネタ

タイトルの通り、32bitの左シフトをエミュレーションしたくて方法を探していたときに、下記のサイトを見つけました。
http://www.rizalalmashoor.com/blog/php-32-bit-left-shift-function

得られる結果は良いのですが、decbinで文字列化して処理してるのでとても遅い。
そもそもこれbit演算でできるじゃん、ってことで書き換えました。

```php
function leftshift32($number, $steps)
{
	$number = $number << $steps & 0xFFFFFFFF; // シフトした上で32bit範囲を超える上位ビットを破棄
	return ($number & 0x80000000) // 符号ビットが0でなかったらマイナス値
		? ($number | 0xFFFFFFFF00000000) // 64bitでのマイナス表現に
		: $number;
}
```

実行時間的には1/6ぐらい。
Scalaで"1時間以内に解けなければプログラマ失格となってしまう5つの問題"をやってみた


今更感ありますが、タイトルの通りです。元ネタは[こちら](https://blog.svpino.com/2015/05/07/five-programming-problems-every-software-engineer-should-be-able-to-solve-in-less-than-1-hour)。詳しくは[こちら](http://www.softantenna.com/wp/software/5-programming-problems/)をどうぞ。

# 問題１
説明の必要はないですよね。

```scala
object Problem1 {
  def sumByWhile(list:Int*) = {
    var sum = 0
    var index = 0
    while(index < list.length) {
      sum = sum + list(index)
      index = index + 1
    }
    sum
  }

  def sumByFor(list:Int*) = {
    var sum = 0
    for(i <- list) sum = sum + i
    sum
  }
  
  def sumByRec(list:Int*) = {
    def go(list:Seq[Int], ac:Int = 0):Int = {
      list match {
        case Nil => ac
        case head :: tail => go(tail, ac + head)
      }
    }
    go(list.toList)
  }
}
```

# 問題2
以下略。

```scala
object Problem2 {
  def mutuallyList(a:Any*)(b:Any*) = a.zip(b).flatMap{x => x._1::x._2::Nil}
}
```

# 問題3
以下略。

```scala
object Problem3 {
  def fibStream(a:BigInt, b:BigInt):Stream[BigInt] = a #:: fibStream(b, a+b)
  def fib(n:Int) = fibStream(0,1).take(n).toList
  def fib100 = fib(100)
}
```

# 問題4
`Seq.permutations`で、全ての順列(nPn)を取得できます。数値に変換し、その中の最大値を返しています。

```scala
object Problem4 {
  def max(list:Seq[Int]) = list.permutations.map(_.map(_.toString).mkString.toInt).max
}
```


# 問題5
数値を１つづつ読み込んだ時、その数値は前の数値に対して
* 足す
* 引く
* 連結して、１桁目になる

の３パターンが考えられます。

なので、各数値に対して3つのパターンを生成し、式の文字列のリストを作ります。
作った式を評価し、結果が100になるものを返します。

式の文字列の評価は、再帰下降法を使います。

```scala
object Problem5 {
  val numberReg = """([0-9]+)(.*)""".r
  val opReg = """([\+\-])([0-9]+)(.*)""".r
  
  def calc(expr:String) = {
    def recur(str:String, acc:Int = 0):Int = {
      str match {
        case "" => acc
        case numberReg(x, xs) => recur(xs, acc + x.toInt)
        case opReg("+", x, xs) => recur(xs, acc + x.toInt)
        case opReg("-", x, xs) => recur(xs, acc - x.toInt)
      }
    }
    recur(expr)
  }
  
  def find = {
    var comb = Seq("1")
    for(n <- 2 to 9) comb = comb.flatMap{c => Seq(c+n, s"$c+$n", s"$c-$n")}
    comb.filter(calc(_) == 100)
  }
}
```

GitHubは[こちら](https://github.com/modalsoul/Five-programming-problems)。
主人公キャラを入れ替える


#【前提】
__・Unreal Engine 4.8.1の使用を前提に記述しています__
__・うそを書くつもりはありませんが、私の使用経験に基づいて記述しているため、間違いが多分にある可能性があります__
__・私の環境がWindowsなのでWindows環境前提です__
__・ゲームの構造によって活用できない場合があります__
__・blueprintでの実装が前提です__

#【目的】
UE4で主人公キャラをリターゲットで入れ替える方法の説明です。

#【リターゲットセットアップ】
まずは、異なるボーン（または同じボーン）で主人公キャラを、他のキャラクタにアニメーションリターゲットできる状態にしておきます。

リターゲット用のセットアップ（準備）に関してはここでは説明しません。
詳細は、以下のドキュメントを参照してください

異なるボーンのリターゲット
https://docs.unrealengine.com/latest/JPN/Engine/Animation/RetargetingDifferentSkeletons/index.html
同じボーンのリターゲット
https://docs.unrealengine.com/latest/JPN/Engine/Animation/AnimationRetargeting/index.html


#【リターゲット】

リターゲットできる準備ができたら
主人公キャラのスケルトンを選択し、右クリックして写真をの__別のスケルトンにリターゲットする__を選択します。

![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/615f8d70-a3f3-6e79-f7fe-66ce397a287d.jpeg)

#【キャラ選択】

主人公に変更するキャラのボーンを選択します。
この場合は、__ue4san_skeleton__です。
![a2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/0c3f208a-b08d-b929-8a19-c9f44109c05e.jpeg)


#【アニメーション入れ替え】
アニメーションブループリント、アニメーションオフセット、アニメーションブレンドスペース、アニメーションシーケンスなどがすべて入れ替わります。

__注意）この処理を行うと、元の主人公キャラのアニメーション系のデータがすべて消えます。必ずバックアップ等を取得して実行してください（これは仕様？）__

![a3.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/f5c114fa-6b4e-5499-1267-ffefc7a83be9.jpeg)

上の写真の__赤枠__部分が入れ替わっているが分かるかと思います。

#【キャラクタークラスの変更】

アニメーション系がすべて入れ替わったので、主人公キャラに適用します。

characterクラス（主人公のブループリント）の__ビューポート__を開いて変更を行います。

赤枠部分を変更しキャラに変更します
__元の主人公キャラ__
![a99.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/54bc0ffa-a553-908b-99b3-3f19d9965d5d.jpeg)
↓
__新しい主人公キャラ__
![a4.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/4f994084-4fc3-3d6a-52ac-b217ed23332c.jpeg)

__注意点としてマテリアルに関しては、前のキャラのデータが残ってしまっているので状況によってマテルアルを変更します__


#【動作確認】
綺麗に入れ替わっていれば以下のように主人公が変更されます。

__元のゲーム__
![a98.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/94083871-e0e2-ffec-1db2-f82c0fee3078.jpeg)

__主人公入れ替え後のゲーム__
![a5.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/c1bba200-d87c-ba68-3fa5-c45857863b6f.jpeg)
↑赤枠の主人公が入れ替わっています。

__たったこれだけで主人公の入れ替えが行えるのでとても便利な機能です。__


#【最後に】
ゲームの作り方によってはまったく活用できない方法かもしれませんが
UE4のテンプレートから作っているようなゲームならだいたい適用できると思います。

ずっとブルーマン先生でプロトタイプを作っていたゲームを、オリジナルキャラに入れ替える時などに活用できるかと思います。

最後まで読んで頂いてありがとうございます。
React NativeでFirebaseが動かない


##**概要**
FirebaseがReact Nativeに対応したらしいが、Rest APIを使い、Chromeのデバッガーを開くとエラーが出て動かない。


##**解決策**
v2.2.7にあげれば動いた。

参考

* <a href="https://github.com/facebook/react-native/issues/619#issuecomment-88958960" target="_blank">WebSocket API Polyfill · Issue #619 · facebook/react-native</a>
* <a href="https://groups.google.com/forum/#!topic/firebase-talk/aoPNvQQsVUE" target="_blank">Heads up about React Native and Firebase - Google グループ</a>
Rubyで正規表現を中途半端に最適化する

`foobar|fooxar|foozap|fooza`のような正規表現は、パイプを減らして`foo(?:bar|xar|zap?)`とすることで高速に動作する。
とはいえ一発で後者のような正規表現はなかなか書きにくい。そこでそれを自動化するために書いたのが次のコード。

```ruby
require 'forwardable'

class Regexp
  class Trie
    def self.union(*patterns)
      trie = new
      patterns.each { |pattern| trie << pattern }
      trie.to_regexp
    end

    extend Forwardable
    def_delegators :@map, :include?, :[], :[]=

    def initialize
      @map = {}
    end

    def add(expr)
      ref = self
      expr.each_char do |char|
        ref[char] = Trie.new unless ref.include?(char)
        ref = ref[char]
      end
      ref[''] = nil
    end
    alias << add

    def to_regexp
      return if @map.include?("") && @map.length == 1
      q = false
      alt, cc = *@map.each_with_object([[], []]) do |(char, value), (alt, cc)|
        quoted_char = Regexp.quote(char)
        if self[char]
          if recurse = value.to_regexp
            alt << quoted_char + recurse
          else
            cc << quoted_char
          end
        else
          q = true
        end
      end
      cconly = alt.empty?
      alt << (cc.size == 1 ? cc[0] : "[#{cc.join}]") unless cc.empty?
      result = alt.size == 1 ? alt[0] : "(?:#{alt * '|'})"
      result = cconly ? "#{result}?" : "(?:#{result})?" if q
      result
    end
  end
end

```

これは次のように使うことができる。

```ruby
p Regexp::Trie.union("foobar", "fooxar", "foozap", "fooza") #=> "foo(?:bar|xar|zap?)"
p Regexp::Trie.union("a", "b", "c", "cca") #=> "(?:c(?:ca)?|[ab])"
```

# その他の言語の実装

実を言うとこのアプローチは、様々な言語で実装されている。

* [Regexp::Trie - search.cpan.org](http://search.cpan.org/~dankogai/Regexp-Trie-0.02/lib/Regexp/Trie.pm)
* [tokuhirom/regexp-trie](https://github.com/tokuhirom/regexp-trie)
* [alexeld/regex-trie](https://github.com/alexeld/regex-trie)

# 中途半端とは

**中途半端に**と書いたのは、メタ文字を考慮した最適化まではできていないから。
とはいえそこまでやってくれるoptimizerも他の言語には存在していて、次のようなものが挙げられる。

* [Regexp::Assemble - search.cpan.org](http://search.cpan.org/~dland/Regexp-Assemble-0.35/Assemble.pm)
* [Regexp::AssembleをJavaScriptに移植してみた](http://d.hatena.ne.jp/heiwaboke/20120320/1332213961)

Rubyにも移植したいよなぁと思いながらもなかなか手がつけられていない。

# おわりに

正規表現もプログラミング言語同様、どんなコードを書くかによってパフォーマンスは雲泥の差が生じる。
こういった最適化のアプローチを知識として知っておくと、よりよい正規表現が書けるのではなかろうか。
RailsでYAMLに正規表現をつっこむ

`!ruby/regexp`をいれるといいというのが書いてあったので、メモ。

```ruby:config/reg.yml
reg:
  a: !ruby/regexp /^[a-zA-Z|\s]+$/
  n: !ruby/regexp /^[0-9]+$/
  s: !ruby/regexp /^\W+$/
```

configに下記のように記入して、簡単に引っ張り出せるようにする。
_※編集：_ @scivolaさんにご指摘いただき下記コード一部修正致しました。@scivolaさんありがとうございます。


```ruby:config/initializers/load_yml.rb
path = "#{Rails.root}/config/reg.yml"
REG = YAML.load_file(path).symbolize_keys
```

下記みたいな感じで呼び出せる。

```rb
a = 'abc'
a.match(REG[:reg]['a'])
# => #<MatchData "abc">
b = '1bc'
b.match(REG[:reg]['a'])
# => nil
```
Strong Parameter いろいろな使い方（例一覧）

basic

```rb
params.permit(:name)
```

```
params.permit(:name => [])
```

```rb
params.require(:user).permit(:name)
```

```rb
params.require(:user).permit!
```

デフォルト値（指定の値がなかった場合の処理）

```rb
params.fetch(:user, {}).permit(:name)
```


ネストする場合

```rb
params.permit(:name, {:emails => []})
```

```rb
params.permit(:friends => [ :name, { :family => [ :name ], :hobbies => [] }])
```

```rb
params.permit(:name, {:emails => []}, :friends => [ :name, { :family => [ :_name ], :hobbies => [] }])
```

try

```rb
params.require(:product).permit(:name, data: params[:product][:data].try(:keys))
```

その他

```rb
params[:person].permitted? ? "untainted" : "tainted"
```

```rb
params[:person].permit(:name).permitted? ? "untainted" : "tainted"
```

他にもいろんな使いかたがあったら追記していきたいと思う。
Eclipse Mars(4.5) 私的Pluginリスト

# まえがき（というか、雑記）
素のEclipseを落としてきたときに入れるプラグイン一覧。
CLIでサクッと入れたいけど、その辺がまだまだ使いづらい。
入れ方は知ってるので、プラグインインストールくらいならansible（というかShellScript)で出来るにはできるけど、依存関係とか面倒くさすぎて、未だにアップデートサイトから…（環境の共有やら構築やらが面倒）

# 手順
[ここ](http://download.eclipse.org/eclipse/downloads/drops4/R-4.5-201506032000/#PlatformRuntime)から、Eclipse Platformを落としてきて、任意のところに入れたら、以下のプラグインを入れる

## プラグインリスト

| プラグイン | 更新サイト | コメント |
|:--------|:--------|:--------|
| JDT |  | これがないと始まらない |
| Eclipse plug-in for JMockit |  http://dl.bintray.com/ajermakovics/jmockit/ | オプショナル |
| TestNG | http://beust.com/eclipse | 好みの問題 |
| EclEmma | http://update.eclemma.org/ | Coberturaの方がいいんじゃないかとか、JMockit-coverageのほうが…とか思いつつも変えてない |
| YEdit | http://dadacoalition.org/yedit | オプショナルと言いたいけど、今のタイミングだと必須だよね HJSONとかが主流になったらわからないけど |
| Markdown Text Editor | http://www.nodeclipse.org/updates/markdown/ | 今は確実に必須だね。なくても書けるけど |
| StartExplorer | http://basti1302.github.com/startexplorer/update/ | オプショナル |
| egit |  | 必須だけど、書く必要があるのだろうか？ |
| m2e |  | GradleでもSBTでもお好きなものをどうぞ。でも、意外とEclipseでは便利 |
| MarketPlace Client |  | ここに挙げたものの大半はこのMarketplacesからインストール出来るという便利な世の中になりました |
| Scala IDE | http://download.scala-ide.org/sdk/lithium/e44/scala211/stable/site | オプショナル(というか、Scala使う人だけ) |
| buildship | http://download.eclipse.org/buildship/updates/e45/releases/1.0 | 今後に期待だけど、SpringSTSのアップデートサイト要らなくなる。公式だし |

```bookmark.xml
<?xml version="1.0" encoding="UTF-8"?>
<bookmarks>
   <site url="http://download.eclipse.org/buildship/updates/e45/releases/1.0" selected="true" name="Buildship"/>
   <site url="http://update.eclemma.org/" selected="true" name="EclEmma"/>
   <site url="http://dl.bintray.com/ajermakovics/jmockit/" selected="true" name="Eclipse plug-in for JMockit"/>
   <site url="http://www.nodeclipse.org/updates/markdown/" selected="true" name="Markdown Editor (site)"/>
   <site url="http://download.eclipse.org/releases/mars" selected="true" name="Mars"/>
   <site url="http://beust.com/eclipse" selected="true" name="TestNG"/>
   <site url="http://download.eclipse.org/eclipse/updates/4.5" selected="true" name="The Eclipse Project Updates"/>
   <site url="http://basti1302.github.com/startexplorer/update/" selected="true" name="Update Site"/>
   <site url="http://dadacoalition.org/yedit" selected="true" name="YEdit"/>
   <site url="http://download.scala-ide.org/sdk/lithium/e44/scala211/stable/site" selected="true" name=""/>
   <site url="http://download.scala-ide.org/update-current" selected="false" name=""/>
   <site url="http://download.scala-ide.org/update-current-35" selected="false" name=""/>
   <site url="http://example.org/update/site" selected="false" name=""/>
   <site url="http://scala-ide.dreamhosters.com/nightly-update-worksheet-scalaide21-210/site/" selected="false" name=""/>
</bookmarks>
```
NTPざっくりまとめ


NTPについて、資料を読みつつざっくりまとめた

## NTPとは
- NTP（Network Time Protocol）
- ネットワークを通じて正しい現在時刻を取得するためのプロトコル
- NTPを使って時刻同期を行うことで、出力するログの時間を正確に記録したり、サービスを正しく動作させることができる

## 時刻同期処理の流れ
- 基本的な流れはNTPクライアントがNTPサーバに対して問い合わせ、結果を取得する
- 時刻同期処理の流れ
	- 1. クライアントが問い合わせ
		- [NTP Client] ---> [NTP Server]
	- 2. サーバが応答
		- [NTP Client] <--- [NTP Server]
	- 3. クライアントが時刻同期
		- [NTP Client]

## NTPの階層構造
- NTPサーバは階層構造を形成しており、この階層構造をstratumと呼ぶ
- stratum1が最上位で、階層を下るごとに数字が増える
- 最上位のNTPサーバは原子時計やGPSを使って、自らの時刻を正確に調整できる特殊な構成になっている
- 下位のNTPサーバは上位のNTPサーバを参照して時刻同期を行う、という構造になっている。最下層はstratum15で、それ以下は存在しないらしい

## NTPサーバ提供元について
- NTPサーバを提供しているのはどんなとこだろうと思い少しだけ調べた
- 独立行政法人情報通信研究機構（NICT）
- 福岡大学
- JPNAP
- ...など。どういう背景があって提供しているのかはわからない。

## 通信遅延を考慮した時刻同期
- NTPはネットワークを介して時刻情報を取得して同期する仕組みになっているので、ネットワーク遅延が発生する
- そのため、取得した時刻をそのまま自身の時刻として同期するのではなく、遅延を計算して時刻同期を行う

## その他
- NTPは時刻を取得するクライアント機能と、提供するクライアント機能の2つの機能を持っている。ほとんどのサーバは取得する機能のみを使うことになる。
- NTPは123番ポートを使う（ウェルノウンポートの1つ）

## 参考リンク
- [TCP/IP - NTPとは](http://www.infraexpert.com/study/tcpip25.html)
- [NTPとは　：　インターネットマルチフィード時刻情報サービス for Public](http://www.jst.mfeed.ad.jp/about/01.html)
- [NTPとは｜Network Time Protocol｜ネットワークタイムプロトコル - 意味/解説/説明/定義 ： IT用語辞典](http://e-words.jp/w/NTP.html)
connectedAndroidTest の実行時に引数を指定する

Android の connectedAndroidTest の実行時に引数を指定する方法です。
実行するテストスイートを指定するときに使えます。

#### Gradle Plugin 1.3 を設定

まず、Gradle Plugin 1.3 以上を設定する。現時点ではまだベータ版です。
リポジトリは mavenCentral ではなく jcenter にする必要があります。

```lang:build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0-beta4'
    }
}
```

#### テストを実行

環境変数 INSTRUMENTATION_TEST_RUNNER_ARGS を指定して connectedAndroidTest を実行します。

```bash
INSTRUMENTATION_TEST_RUNNER_ARGS=size=medium,foo=bar ./gradlew connectedAndroidTest
```
-P 引数で指定することもできます。

```bash
./gradlew connectedAndroidTest -Pcom.android.tools.instrumentationTestRunnerArgs=size=medium,foo=bar
```

引数の詳細は [AndroidJUnitRunner](http://developer.android.com/reference/android/support/test/runner/AndroidJUnitRunner.html)を参照してください。
ここに記載してある "am instrument -e" のオプションが使用できます。
c++ builder XE4, 10.2 Tokyo > TeeChart > 右軸にデータをセットする > Chart1->Series[0]->VertAxis = aRightAxis;

```txt:動作環境
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/09)
    TeeChart v2016.17.160129 32bit VCL
```

右軸にデータセットを設定する。

フォームデザインでは
.Series > [データセット] > Generalタブ > Vertical Axis
にて「Right」を選択する。

コードでは、0番目のシリーズを右軸に設定するには以下のようにする。

    Chart1->Series[0]->VertAxis = aRightAxis;
Viewの明度をアニメーションする | BrightnessAnimation

## Viewのアニメーションの種類
* AlphaAnimation
* TranslateAnimation
* RotateAnimation
* ScaleAnimation

がありますが明度を変更するなどのアニメーションは基本用意されていませんでした。
なので、独自アニメーションクラスを作ってみました。

### 独自クラス

```lang:BrightnessAnimation.java
package com.example.hello;
import android.graphics.ColorMatrixColorFilter;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.ImageView;

public class BrightnessAnimation extends Animation {
	
    float[] values = new float[] {1, 0, 0, 0, 0,0, 1, 0, 0, 0,0, 0, 1, 0, 0,0, 0, 0, 1, 0};
    private float mFromBrightness;
    private float mToBrightness;
    private ImageView imageview;
    
    public BrightnessAnimation(ImageView _iv,float _from, float _to) {
    	imageview = _iv;
    	mFromBrightness = _from;
        mToBrightness = _to;
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        final float brightness = (mFromBrightness + (mToBrightness-mFromBrightness)*interpolatedTime)*255f;
        setBrightness(Math.round(brightness));
    }
    
    private void setBrightness(int brightness) {
        values[4] = values[9] = values[14] = brightness;
        imageview.setColorFilter(new ColorMatrixColorFilter(values));
    }
    
    @Override
    public void setAnimationListener(final AnimationListener listener) {
    	super.setAnimationListener(new AnimationListener() {
			@Override
			public void onAnimationStart(Animation animation) {
				listener.onAnimationStart(animation);
			}
			
			@Override
			public void onAnimationRepeat(Animation animation) {
				listener.onAnimationRepeat(animation);
			}
			
			@Override
			public void onAnimationEnd(Animation animation) {
				listener.onAnimationEnd(animation);
				imageview = null;
			}
		});
    }
}
```
で、使い方は

### 使い方

Brightnessは0.0-1.0で調整できるように設定しています。

```lang:ほにゃららActivity
BrightnessAnimation ba= new BrightnessAnimation((ImageView) findViewById(R.id.img),0.0f,0.9f);
ba.setDuration(1000);
((ImageView)findViewById(R.id.img)).startAnimation(ba);
```

これはAnimation.javaを継承してるので、
setAnimationListenerできるし、

点滅をさせるスクリプト（自分が以前書いた記事ですが。。）
http://andante.in/i/android%E3%82%A2%E3%83%97%E3%83%AAtips/%E7%82%B9%E6%BB%85%E3%82%92%E3%81%95%E3%81%9B%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/

に書いてあるような方法を用いて

### 応用

```lang:ほにゃららActivity
BrightnessAnimation ba= new BrightnessAnimation((ImageView) findViewById(R.id.img),0.0f,0.9f);
ba.setDuration(1000);
ba.setRepeatCount( Animation.INFINITE );
ba.setRepeatMode( Animation.REVERSE );
((ImageView)findViewById(R.id.img)).startAnimation(ba);
```

で、明るさでの点滅もすることができます。


で、ここまで作って、

### ブラッシュアップ

* ImageViewだけじゃなくて、Layoutに効かせられないかな
* コンストラクタで、imageviewを参照してるのが、ださいので、どうにか参照しないでできないかな

っていうのを知ってる人いたら、聞きたいなって思ったので、qiitaに投稿してみました。

まぁ、しなくても、取り急ぎの目的は、達成出来てるので、使えるクラスにはなってるかと思います。