OmniAICreator/Qiita-1.07M huggingface dataset:
PyPyの基礎知識まとめ その1

Pythonより速いという触れ込みのPyPy。
実際どういうものなのでしょうか？

Google先生のお力を持ってしても日本語で、「こういうものだ！」と
説明してくれるのはWikipedia先生くらいしか見つかりません。

英語のサイトならブログ等で記事も比較的多かったのでがんばって
ちょっとまとめてみました。

注. 色々なドキュメントからの抽出、まとめですが訳や解釈が
間違っている可能性があります。ご指摘頂ければ修正・加筆します。

各参考サイト等
https://ja.wikipedia.org/wiki/PyPy
http://pypy.org/index.html
http://shomah4a.net/pypy-tutorial/
http://stups.hhu.de/mediawiki/images/f/f5/Tracing_JITs11_tracing_the_meta_level.pdf



#Pythonの復習
PyPyの前に、まずPythonについて。
広く使われているいわゆるPythonとはC言語で実装されたCPythonを指します。
(他にもJavaVM上で動くJythonとか.Net上で動くIronPythonとかもあります)
そしてPyPyとはPythonで再実装された（セルフホスティング）Pythonです。
ではPyPyはCPythonで再実装されたPythonなのかというと、それでは70点です（適当な点数）。

## RPython
話は変わりましてCPythonにはRPythonというサブセットが存在します。

サブセットというのはあるシステムやプログラミング言語の一部を取り出して
使えるようにしたもので、身近な例としてはVBAがVisualBasic6のサブセットです。

さらにRPythonの"R"はRistricted(制限された)です。
つまりRPythonはCPythonに制限・制約を加えてCPythonで再実装された
Pythonのサブセットです（難しい・・・）。

そしてPyPyはこのRPythonで実装されています。
結論としてPyPyとは、
**C言語で実装されたCPythonのサブセットであるRPythonで実装されたPython**
ということになります。

なぜわざわざRPythonを作ったのかという話はもう少し後で。

## 速さの秘密
PyPyの売り文句の一つとして、「CPythonより実行速度が速い」が挙げられます。
元が同じPythonなのになぜ速くなるのか。それはJITによるものです。

### JITとは
"Just In Time Compiler"、実行時コンパイルです。
コンパイルにより関数単位、モジュール単位でマシン語に変換することにより
実行速度を上げます。（インタプリタは行単位の逐次実行）
※Wikipedia先生によるとPyPyは実行コードのコンパイルではなく処理系のコンパイルらしい
(JITそのものについては割愛します)

ちなみにRPythonは型推論が実装されており、
コンパイル時の最適化に寄与しているらしいです。

http://shomah4a.net/pypy-tutorial/
にはマシン語に変換するチュートリアルの解説がありますので興味があればぜひ。

(さらに補足)
チュートリアルに必要なPyPyは公式のBitBucketからMercurialでcloneします。
https://bitbucket.org/pypy/pypy
PyPy公式ダウンロードページにも説明がありますが、
上部にある実行環境用のバイナリとは別に、下の方にありますのでご注意ください。
また、RPythonだけなら普通にpipで落とせたりします。
この辺の導入方法は意外と情報が少ないです。

## PyPyとCPythonの違い
PyPyはCPythonのコードと互換性を持たせるためにRPythonからさらに実装されましたが、
それでも差異があります。以下はその一部です。

- C言語で書かれたPythonライブラリが使えない
- ガベージコレクト方式が違う

C言語ライブラリが使えないのはRPython由来ですね。
ただNumPyとかはPyPy版もあるのである程度フォローはされているようです。

ガベコレは「参照カウントベースではない」と言い切ってはいるものの、
じゃあ何使ってるの？というのははっきりしない・・・
たぶんマーク・アンド・スイープだと思うんですけど(推測)。
ソース見れば一発なんですけどね(読むのむずかしい)

## 今日はここまで
以上そもそもPyPyのことを知らないという事情から調べてみましたが、
あまりまとめられていません。引き続き調査していきますのでネタが
溜まり次第またまとめていきます。
Mac OS XでJMagickを使う

MacでJMagickを利用するJavaアプリケーションのローカル開発環境づくりで手間取ったのでメモしておく。

# 実施環境

- Mac OS X El Capitan
- Homebrew
- Oracle Java 8


# インストール手順

## ImageMagickをインストールする

### 1. HomebrewでImageMagickをインストールする

※以下で表示される情報は実施時点のものです。
    
```bash
$ brew info imagemagick
imagemagick: stable 6.9.3-0 (bottled), HEAD

$ brew install imagemagick
```

## JMagickをインストールする

### 1. ソースコードダウンロードする

http://www.jmagick.org/ からソースコードをダウンロードします。
実施時点では jmagick-6.4.0-src.tar.gz が最新でした。

### 2. ダウンロードしたソースコードを展開する

```bash
tar xzf jmagick-6.4.0-src.tar.gz
```

### 3. Make.rulesを書き換える

本来タブであるはずのインデントはスペースになっているせいで、ビルドが失敗します。
ソースは以下のstack overflowです。
http://stackoverflow.com/questions/14819033/jmagick-make-error

stack overflowのコメントどおり、175、176行目行頭のスペース4つをタブ1つに置き換えます。
以下が該当箇所（抜粋）です。

```bash
173:ifdef DARWIN
174:	# Mac OS X
175:	@-echo "Using install_name_tool..."
176:	@-/usr/bin/install_name_tool -id $(PROJ_BASE_DIR)lib/lib$(JNI_LIB_NAME)$(SHARED_LIB_EXT) $(PROJ_BASE_DIR)/lib/lib$(JNI_LIB_NAME)-$(MAJOR).$(MINOR).$(MICRO)$(SHARED_LIB_EXT)
177:endif
```

### 4. `./configure`を実行する

JavaHomeとImageMagickのパスを指定して`./configure`を実行します。

```bash
./configure –with-java-home=/System/Library/Frameworks/JavaVM.framework/Versions/Current --with-magick-home=/usr/local/opt/imagemagick
```

### 5. ビルドする
    
```bash
make all
```

### 6. （必要な人のみ）インストールする
 
```bash
make install
```

実行すると、以下のファイルがインストールされます。
`make uninstall` は存在しないので、アンインストールしたい場合は手動で削除してください。
    
- /usr/local/lib/jmagick-6.4.0.jar
- /usr/local/lib/libJMagick-6.4.0.so
- /usr/local/lib/libJMagick.so（シンボリックリンク）


## JMagickをJVMに認識させる

システムプロパティ「java.library.path」で指定されている場所に、libJMagick.soのパスを通します。
この時、拡張子をjnilibにしないと認識してくれませんでした。。。

java.library.pathの確認は以下のJavaコードを実行して確認できます。

```java
System.out.println(System.getProperty("java.library.path"));
```

なお、通常はjava.library.pathに以下が指定されている模様です。

- /Users/（ユーザ名）/Library/Java/Extensions
- /Library/Java/Extensions
- /Network/Library/Java/Extensions
- /System/Library/Java/Extensions
- /usr/lib/java
- カレントディレクトリ

ユーザ権限で設定する場合は、以下が良いかと思います。

```bash
# make installしていない場合
ln -s （展開ディレクトリ）/lib/libJMagick.so /Users/（ユーザ名）/Library/Java/Extensions/libJMagick.jnilib

# make installした場合
ln -s /usr/local/lib/libJMagick.so /Users/（ユーザ名）/Library/Java/Extensions/libJMagick.jnilib
```
【Unity】OSXネイティブからのコールバックを受け取る（ログをコンソールに表示）

UnityでOSXネイティブのプログラムを作成するときにコールバックの作り方で悩んだのでメモ。以下は、ネイティブからのログをUnityのコンソールに表示する場合。

- XCodeでBundleを作成するプロジェクトを作成（プロジェクト名：NativePlugin)
- 次のようなコードを作成

```objc:native.h
#ifndef native_h
#define native_h

typedef void (*logCallbackFunc)(const char *);
static logCallbackFunc logCallback;

#endif /* native_h */
```
```objc:native.m
void _initLogCallback(logCallbackFunc callback) {
    
    // some other init here
    
    logCallback = callback;
    if(logCallback != NULL)
        sendLog([@"Log callback is set" UTF8String]);
}

void sendLog(const char * l){
    logCallback(l);
}
```
- Bundleを作成してUnityの Assests/Plugins にコピー

- Unityで適当なC#スクリプトを作成してDLLをロード

```csharp:UnityでのC#スクリプト（DLLをロードする部分）

using UnityEngine;
using System.Collections;
using ObjC = ObjCMessage;
using System;
using System.Runtime.InteropServices;

public class NativePlugin : MonoBehaviour {

  void Start(){
	InitLogCallback(); //コールバックを初期化
  }

  public delegate void logCallback(string message);

  [AOT.MonoPInvokeCallback(typeof(logCallback))]
  public static void Log Received (string message) {
	Debug.Log("[Native]:"+message);
  }

  [DllImport("NativePlugin")]
  private static extern void _initLogCallback(logCallback callback);

  public static void InitLogCallback() {
	if (Application.platform == RuntimePlatform.OSXEditor) {
		_initLogCallback(LogReceived);
	}
  }
}
```

Unityの公式情報あってもいいのになーと思う。

##参考
http://answers.unity3d.com/questions/516863/os-x-native-plugin-callback-functions.html
Python で sudo を呼び出しパスワードを自動入力

システム設定はいじらずに Python で完結するやり方。
Python3.5(3.4)～

sudo で端末以外からパスワードを入力するには -S オプションをつけて標準入力から渡す必要がある。改行文字も必要。

subprocess.run() (Python3.4 なら subprocess.check_output) の引数 input に「パスワード + 改行文字」をバイト列で渡す (引数 input が追加されたのは Python3.4 から)。

複数の ISO ファイルを順次マウントしてごにょごにょしてアンマウントする例。

```py3
import os
import subprocess
import getpass
import tempfile


# 一時的なマウントポイントの作成
mp = tempfile.mkdtemp()

# パスワードの入力
passwd = (getpass.getpass() + '\n').encode()

while True:

    path = input('Input file path (".quit" to quit) : ')

    if path == '.quit':
        os.rmdir(mp)
        raise SystemExit

    subprocess.run(('sudo', '-S',
                    'mount', '-t', 'iso9660', '-o', 'loop', path, mp),
                   input=passwd, check=True)

    """ごにょごにょ"""

    subprocess.run(('sudo', '-S', 'umount', mp), input=passwd, check=True)
```

http://docs.python.jp/3/library/subprocess.html
ReactiveExtensionsで複数のsubscriptionをまとめて返す


CompositeSubscriptionを使う。

```kotlin
fun subscribe(): Subscription {
    return CompositeSubscription().apply {
        this.add(hogeObservable.subscribe())
        this.add(fugaObservable.subscribe())
    }
}
```

追記（2016/01/25）

これで良かった。

```kotlin
fun subscribe(): Subscription {
    return CompositeSubscription(
        hogeObservable.subscribe(),
        fugaObservable.subscribe()
    )
}
```
Spring + Tomcatでのdatasourceの設定

# きっかけ

Spring + Tomcatでの開発のときに、DBの接続エラーではまったので、そのときの設定メモ。
java6縛りでtomcatも古いバージョンの設定ですので、気を付けてください。

ポイントはvalidationQueryです。

# コネクションの有効性テスト

一定時間たつとDBに接続できなくなったときは、プールしているコネクションがつかえなくなってる可能性が高いです。
[こちら](http://yyhayashi303.hatenablog.com/entry/20120911/1347322683) で同じ問題の解決策にでていました。

validationQueryの設定を追加で解消されます。Spring側でdatasourceを定義するなら、下記のようにします。
(RDBMSがMySQLの想定ですが、OracleDBでも同様です。)

## applicationContext.xml

```lang:applicationContext.xml

<bean id="dataSource"
          class="org.apache.tomcat.jdbc.pool.DataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/sample"/>
        <property name="username" value="root" />
        <property name="password" value="root" />
        <property name="validationQuery" value="SELECT 1 FROM DUAL" />
		<property name="testOnBorrow" value="true" />
		<property name="testWhileIdle" value="true" />
		<property name="timeBetweenEvictionRunsMillis" value="60000" />
    </bean>
```

## server.xml

Tomcat側で接続するDBを指定している場合は、server.xmlに上記の設定を追加します。

https://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html
http://ymotoba.blogspot.jp/2008/09/tomcat.html

```lang:server.xml
<Resource name="jdbc/sample"
      global="jdbc/sample"
      auth="Container"
      type="javax.sql.DataSource"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/sample"
      username="root"
      password="root"       
      maxActive="100"
      maxIdle="20"
      minIdle="5"
      maxWait="10000"
      validationQuery="SELECT 1 FROM DUAL"
      testOnBorrow="true"
　　　 testWhileIdle="true"
      timeBetweenEvictionRunsMillis="60000"　　　
 />
```

applicationContext.xmlにはJNDIの設定に書き直します。

```lang:applicationContext.xml

 <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/sample"/>
 </bean>
```

# 参考サイト

http://yyhayashi303.hatenablog.com/entry/20120911/1347322683

http://stackoverflow.com/questions/22684807/spring-boot-jpa-configuring-auto-reconnect

http://qiita.com/T0000N/items/7d3450623da5bc27e116

http://d.hatena.ne.jp/learn/20101016/p1
UnityのSpritePackerとAssetBundleを併用する。

# 概要
普段はTexturePackerを使っているのでSpritePackerについてはよく知らなかったのですが、
「SpritePackerでまとめたテクスチャって別ファイルとして生成されないけどAssetBundle化したい場合どうするの？」
という趣旨の疑問を投げ掛けられたので、いろいろ検証してみました。

今回はその結果から得られた結論とざっくりとした手順を綴ります。

※検証環境は Unity 5.3.1 です。

# 結論
### パックしたテクスチャを同じアセットバンドルに突っ込めばOK!
とっても簡単ね！

# 手順

## 1. Textureの設定
まとめたいテクスチャの設定は、

- ファイルは`Resources`外に
- 
`SpriteMode`を`Single`に

- `PackingTag`を同じ値に
- 圧縮設定も統一

する必要があるよ。

TexAとTexBを一つのアトラスにまとめたい場合は、
![tp_01.png](https://qiita-image-store.s3.amazonaws.com/0/97611/41780b1e-c12f-50b7-a3fc-cdde4cd0724d.png)
こんな感じ。

## 2. Packする
メニューから Window -> SpritePacker を選んでね。
![tp_02.png](https://qiita-image-store.s3.amazonaws.com/0/97611/03a8ae64-2620-2268-5d3b-17b0b91a14b6.png)

SpritePackerウィンドウが開いたら、左上の[Pack]ボタンを押してね！
![tp_03.png](https://qiita-image-store.s3.amazonaws.com/0/97611/2eaf4a7c-98f3-182b-d7fd-3eb392c49aea.png)

うまくいけば手順1で設定した通りのアトラスができあがるよ！

※上図はアトラス化が成功した後の図です。

## 3. AssetBundle化設定
次に、アトラスに含めた2つのテクスチャを同じAssetBundleに入れる設定をするよ。

Projectツリーで2つのテクスチャを選択し、Inspectorで任意のAssetBundle名をつけてね！
![tp_04.png](https://qiita-image-store.s3.amazonaws.com/0/97611/4e35092c-6cd3-0e4d-61da-6f19bf04f53b.png)

設定が終わったら、AssetBundleをビルドしてね！

※AssetBundleの作り方とかその辺は割愛します。

## 4. 読み込んで、取り出して、表示してみる

こんな感じのコードを書いたよ。

```csharp:BundleTest.cs
using System;
using UnityEngine;
using System.Collections; class BundleTest : MonoBehaviour
{
	public SpriteRenderer	spriteA		= null;	//!< 予めシーンに配置してあるSprite
	public SpriteRenderer	spriteB		= null;	//!< 予めシーンに配置してあるSprite

	IEnumerator Start()
	{
		// AssetBundleを取得(AssetBundleを置いたURLを指定してね！)
		using( WWW www = new WWW( "file://C:/unity/AssetBundles/mytexbundle" ) )
		{
			yield return www;
			if( www.error != null )
				throw new Exception( "エラーだよ : " + www.error );

			AssetBundle bundle = www.assetBundle;

			// シーンのSpriteにAssetBundle内のリソースを割り当てる
			{
				if( spriteA != null )
					// mytexbundleからTexAを取り出してSpriteAに割り当て
					spriteA.sprite = bundle.LoadAsset( "TexA" ) as Sprite;

				if( spriteB != null )
					// mytexbundleからTexBを取り出してSpriteBに割り当て
					spriteB.sprite = bundle.LoadAsset( "TexB" ) as Sprite;
			}
		
			bundle.Unload( false );
		}
	}
}
```

実行画面はこんな感じ。
![tp_05.png](https://qiita-image-store.s3.amazonaws.com/0/97611/9f97ed9b-3ace-cf7c-11a8-0357c596d3af.png)

2つのスプライト(元は2つのテクスチャ)の描画が1回になっていれば、SpritePackerとAssetBundleの併用実験は成功だよ！
ConoHaのUbuntu1404で、swift言語設置とHelloWorldまで

以下のコマンドでSwiftのHelloWorldまで。

```console

wget https://swift.org/builds/ubuntu1404/swift-2.2-SNAPSHOT-2015-12-18-a/swift-2.2-SNAPSHOT-2015-12-18-a-ubuntu14.04.tar.gz

tar -zxvf swift-2.2-SNAPSHOT-2015-12-18-a-ubuntu14.04.tar.gz

export PATH=~/swift-2.2-SNAPSHOT-2015-12-18-a-ubuntu14.04/usr/bin/:"${PATH}"

```

下記のイメージをClickするとyoutube動画に行きます。
レコードツールは、Windows10の「Winキー+G」でやった。
[![youtube video](http://img.youtube.com/vi/1YwqLY6sXFk/0.jpg)](http://www.youtube.com/watch?v=1YwqLY6sXFk)
[tmux] tmuxメモ

| Description | Command       |
|:-----------:|:-------------|
| Start a new Session|  tmux  |
| Resume a session| tmux a |
|Leave a session(Not exit)| <kbd>Ctrl</kbd> + <kbd>B</kbd> ;  <kbd>D</kbd>|
|Scroll| <kbd>Ctrl</kbd> + <kbd>B</kbd> ; <kbd>[</kbd>|
| Go to some line | <kbd>Ctrl</kbd> + <kbd>B</kbd> ; <kbd>:</kbd>| 
| Split pane vertically | <kbd>Ctrl</kbd> + <kbd>B</kbd> ; <kbd>%</kbd>| 
| Split pane horizontally | <kbd>Ctrl</kbd> + <kbd>B</kbd> ; <kbd>"</kbd>| 
| Move between the pane | <kbd>Ctrl</kbd> + <kbd>B</kbd> ; <kbd>o</kbd>|
| Move to the pane 3 | <kbd>Ctrl</kbd> + <kbd>B</kbd> ; <kbd>q</kbd> ; <kbd>3</kbd>|
[Javaの小枝] AutoCloseable な Tuple を作る

# 概要
[前回説明した Tuple](http://qiita.com/KIchiro/items/e63d91d5a61069c0278b) の AutoClosable 版を作成する

# 実装
以下に実装を示す。何故こんなものを作成するのか、今回は説明しない。次回、詳細を説明するので、それまで待っていて欲しい。クラス名は TupleAutoCloseable で TupleAC とした。TupleACは自身の close( ) が呼びだされた際、保持しているオブジェクトが AutoCloseable インターフェースを持っている時だけ保持しているオブジェクトの close を実行する。

このクラスの要点はいくつかあるが

 - closeの順序は後ろの引数から。 Tuple3AC\<A, B, C\>(A a, B b, C c) であれば c から先に行なう。
 - 妖しいコンストラクタが一つ追加されている。要注目。
 - get( ) メソッドは常に最後の要素が取得できる。Tuple3AC\<A, B, C\>(A a, B b, C c)であれば c が取得できる。

何故このようなクラスを定義するのか次回説明する。

```Java:TupleUtils.java
public class TupleUtils {

	private static class PairAC<A,B> extends Pair<A, B> implements AutoCloseable {
		public PairAC(A car_, B cdr_) {super(car_, cdr_);}

		@Override public void close() throws Exception {
			Exception thCdr = execAutoClose(cdr);
			Exception thCar = execAutoClose(car);
			
			if (thCdr != null) throw thCdr;
			if (thCar != null) throw thCar;
		}

		private static Exception execAutoClose(Object o) {
			try {
				if (o != null && o instanceof AutoCloseable) ((AutoCloseable) o).close();
				return null;
			} catch (Exception e) {return e;}
		}
	}
	
	public static class Tuple1AC<A> extends PairAC<A, Object> {
		public Tuple1AC(A a) {super(a, null);}
		public Tuple1AC(Supplier<A> a) {super(a.get(), null);}
		public A get() {return car;}
	}

	public static class Tuple2AC<A, B> extends PairAC<A, Tuple1AC<B>> {
		public Tuple2AC(A a, B b) {super(a, new Tuple1AC<>(b));}
		public Tuple2AC(A a, Function<A, B> b) {super(a, new Tuple1AC<>(b.apply(a)));}
		public B get() {return cdr.get();}
	}
	
	public static class Tuple3AC<A, B, C> extends PairAC<A, Tuple2AC<B, C>> {
		public Tuple3AC(A a, B b, C c) {super(a, new Tuple2AC<>(b, c));}
		public Tuple3AC(A a, Function<A, B> b, Function<B, C> c) {super(a, new Tuple2AC<>(b.apply(a), c));}
		public C get() {return cdr.get();}
	}

	public static class Tuple4AC<A, B, C, D> extends PairAC<A, Tuple3AC<B, C, D>> {
		public Tuple4AC(A a, B b, C c, D d) {super(a, new Tuple3AC<>(b, c, d));}
		public Tuple4AC(A a, Function<A, B> b, Function<B, C> c, Function<C, D> d) {super(a, new Tuple3AC<>(b.apply(a), c, d));}
		public D get() {return cdr.get();}
	}

	public static class Tuple5AC<A, B, C, D, E> extends PairAC<A, Tuple4AC<B, C, D, E>> {
		public Tuple5AC(A a, B b, C c, D d, E e) {super(a, new Tuple4AC<>(b, c, d, e));}
		public Tuple5AC(A a, Function<A, B> b, Function<B, C> c, Function<C, D> d, Function<D, E> e) {super(a, new Tuple4AC<>(b.apply(a), c, d, e));}
		public E get() {return cdr.get();}
	}
}
```
Windows PowerShellワンライナーでHTTP GET的なことをする

```bat:wget
C:\Users\YourName>powershell -Command "& {(new-object System.Net.WebClient).Downloadfile('http://example.com/sample.txt', 'sample.txt')}"
```

```ps1:PSCommand
(new-object System.Net.WebClient).DownloadFile("http://www.google.co.jp/intl/ja_jp/images/logo.gif","e:\logo.gif")
```

VBScriptで書くとこんな感じらしい。
http://qiita.com/tukiyo3/items/95286d259b0be6ef715d
Rustのドキュメントの翻訳プロジェクトを開始します。

κeenです。色々な人の目に止まって欲しいのでQiitaに。

2016-01-25 18:31 編集: レポジトリをrust-lang-jaオーガニゼーションに移管したのでリンクを修正しました。

タイトルの通り、Rustのドキュメントの翻訳プロジェクトを開始します。
モチベーションとしては野良で翻訳されているドキュメントが複数あるのですが散らばっている上にそれぞれ元になっているバージョン(底本)が違ったりしていて折角の翻訳ドキュメントの価値が半減してしまっているのでどうにかしてまとめたいなと思った次第です。

レポジトリと翻訳文書はこちらになります。まずはThe Rust Programming Languageの訳から始めようかと思います。

* [rust-lang-ja/the-rust-programming-language-ja](https://github.com/rust-lang-ja/the-rust-programming-language-ja)
* [プログラミング言語Rust](http://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/)

最初に一部私が訳した以外は他のどの翻訳も取り込んでないのでほとんど英語のままです。翻訳文書をお持ちの方、これから翻訳したい方のPR待ってます。

見ての通り、どうにか頑張って公式のドキュメントで使われているツールを使って公式ドキュメントの見た目を再現しました。

リソースが足りるようでしたら他のドキュメント(標準ライブラリのAPI、The Rust Reference、Nomiconなど)も訳したいところですがそれは人が集ったら考えます。

PRを送ろうという方はREADMEの他に[CONTRIBUTING.md](https://github.com/rust-lang-ja/the-rust-programming-language-ja/blob/master/CONTRIBUTING.md)なんかもお読み下さい。
サンプルのPRとして[こちら](https://github.com/rust-lang-ja/the-rust-programming-language-ja/pull/1)を上げています。

私もちまちま翻訳していく予定です。
# バージョンアップについて
URLを見れば分かる通り、現在は1.6のドキュメントをベースに翻訳していますが、将来のバージョンアップにも追従する予定です。レポジトリに日本語のドキュメントと原文両方を入れているのでRustの新しいバージョンがリリースされたら原文と新規のドキュメントとのdiffを見ながら訳していけば漏れなく訳せるかなと思っています。バージョンアップに追従出来た時に過去のバージョンのドキュメントをどうするかは未定です。公式が残してないのでこちらも残さない方が良いのかなとは思っています。

# 質の話
最近和訳というと何かと燃えることが多いので一応言及しておきます。

プロの翻訳家ではなくボランティアのエンジニアが訳しているので完璧は求めてないですが、誤訳は許容しない方針です。許容しないとはいっても誤訳を含んだPRが来た瞬間に怒鳴り散らしたりする訳ではなく、誤訳部分を指摘して修正されてからPRを取り込むという意味です。むしろ、多少の誤訳がある程度なら(中の人が一から翻訳し直すより翻訳を精査して直して貰う方が早い程度の誤り具合なら)翻訳リソース的には大変助かるので「英語の勉強がてら…」という方でも忌憚なくPR下さい。(あまり考えてませんが、あまりに酷い訳だったらリジェクトするかもしれません。)

さて、これまでは翻訳する側の人に求める質の話で、次は読む人向けの質の話です。
とはいっても大した話ではないです。翻訳文書を読んでると違和感を感じることが多々あると思います。「これ、誤訳じゃないか?」と。そういう時のためにソースの翻訳の直上に原文をコメントアウトして残してあります。そこを見て誤訳と判断したならそのまま修正してPR頂けたらなと。

どうにか頑張ると原文をフォールディング出来るようなドキュメンテーションツールもあるようですが今回使っている`rustbook`にはなさそうです。

# おわりに

先程から「中の人」という言葉を使っていましたが今のところ私一人です。翻訳もですが中の人やりたい方も募集しています。
κeen([@blackenedgold](https://twitter.com/blackenedgold))まで連絡下さい。
GoogleAnalyticsAPIのgem"Legato"でQuery結果をキャッシュして10倍速くする

# Google Analytics API はそこそこ遅い

Google Analytics APIを使ったことがある人なら「結果帰ってくるの遅いなあ…」とぼやいたことあると思います。

速くするためには期間で絞り込みする、ディメンション（指標）を複雑にしない、結果件数を絞り込む（１０件とか）、gzipの指定をする。の方法がありますが、これらを行っても遅いものは遅いのです。

# Legato 使っても当然そこそこ遅い

RubyからGoogeAnalyticsAPIを使うには"Legato"がとても便利です。

https://github.com/tpitale/legato

使い方の説明は同じQiita内の以下記事をご確認ください。

http://qiita.com/tkosuga@github/items/26f4295ae0a35b536344

Legato中でOAuth認証とGoogleAnalyticsAPIのエンドポイントへアクセスしているので、当たり前ですがそこそこ遅いです。

# クエリー結果をキャッシュする

どのレイヤーでキャッシュするのか？を考えた時にアプリケーションのビューやモデル内も考えられますが、もっとも広範囲で恩恵を得られるのはLegatoの中です。

そういう事でLegato内でクエリー結果をキャッシュする事で高速化を図りましょう。

# キャッシュするモンキーパッチ

Railsアプリ内から使うサンプルコードです。以下パスでLegatoに簡易パッチを当てます。

config/initializers/legato_ext.rb

```rb:legato_ext.rb
#
# patch on Ver 0.6.2
# https://github.com/tpitale/legato/blob/169d806f9486fed3aceb61a7e42dc04a1c405fcc/lib/legato/request.rb
#
module Legato
  class Request

    def cache_url
       query.base_url + query_string
    end
    
    def cache_key
      prefix = self.class.name.underscore
      [prefix, Digest::MD5.hexdigest(user.access_token.token + cache_url)].join("/_/")
    end
    
    def cache_log
      Rails.logger.info("Cache Legato::Request. key=" + cache_key + ", url=" +  cache_url + ", token=#{user.access_token.token}")
    end
    
    def get(*args)
      raw_response = Rails.cache.fetch(cache_key, expires_in: 8.hours){
        cache_log
        user.access_token.get(*args)
      }
    end    
    
  end
end

#
# patch on Ver 0.6.2
# https://github.com/tpitale/legato/blob/169d806f9486fed3aceb61a7e42dc04a1c405fcc/lib/legato/management/finder.rb
#
module Legato
  module Management
    module Finder
      
      def cache_key(user, uri)
        Digest::MD5.hexdigest(user.access_token.token + uri)
      end
      
      def cache_log(user, uri)
        Rails.logger.info("Cache Legato::Management::Finder. key=" + cache_key(user, uri) + ", uri=" + uri + ", token=#{user.access_token.token}")
      end
      
      def all(user, path=default_path)
        uri = base_uri + path
        json = Rails.cache.fetch(cache_key(user, uri), expires_in: 10.minutes){
          cache_log(user, uri)
          user.access_token.get(uri).body
        }
        items = MultiJson.decode(json).fetch('items', [])
        items.map {|item| new(item, user)}
      end

    end
  end
end
```

キャッシュを有効にしていない場合は以下のようにcache_storeを指定します。Gemfileにもキャッシュストアを指定します。

ここでは MemCached + Dalli にしています。

```rb:config/enviroments/development.rb
Rails.application.configure do
 #...省略
 config.cache_store = :mem_cache_store, "127.0.0.1:11211"
end
```

```rb:Gemfile
gem 'dalli'
```

# コードの説明

このコードでは以下の2つを行っています。

* クエリー結果（Core Reporting API）のレスポンスをキャッシュ
* メタ情報（Management API）のレスポンスをキャッシュ

キャッシュキーにアクセストークンとURLを組み合わせた文字列を使うことでセッション違いの同一クエリーと被らないようにしています。

あとLegatoのコードがリファクタリングされて読みやすくなっていました。これならパッチを当てるのもスムーズです。

# 参照情報

- Legato
 - https://github.com/tpitale/legato
- Google Analytics API リファレンス
 - https://developers.google.com/analytics/?hl=ja
- Dalli
 - https://github.com/petergoldstein/dalli
- Memcached
 - http://memcached.org/

# さいごに

質問などあればコメントにお願いします。直接メッセージをしたい方は[Twitter](https://twitter.com/tkosuga)宛にお願いします。
shellでjsonを扱う方法

やり方が分かるまでに時間がかかったので、備忘録を兼ねて共有します。

# 一回だけ値を使う場合
curlとjqをパイプラインで繋げます。

```deal_json_once.sh
curl $URL_TO_GET_JSON | jq "."
```

# jsonを使いまわしたい場合
curl, echo, jqを使って、jsonのechoをパイプランでjqに渡します。

```deal_json_multiple.sh
JSON_RESPONSE=$(curl $URL_TO_GET_JSON)
echo $JSON_RESPONSE | jq "."
echo $JSON_RESPONSE | jq ".id"
echo $JSON_RESPONSE | jq ".name"
```

# 値を変数に入れたい場合
変数に入れたい値のechoを`$()`で括ります。
文字列の`"`が要らないなら、-rオプションを渡して消します。

```
JSON_RESPONSE=$(curl $URL_TO_GET_JSON)
GOT_ID=$(echo $JSON_RESPONSE | jq ".id")
GOT_NAME=$(echo $JSON_RESPONSE | jq ".name" -r)
```

誰かの役に立てば嬉しいです。

# 参考
http://stackoverflow.com/questions/20488315/read-the-json-data-in-shell-script
https://stedolan.github.io/jq/manual/
https://github.com/stedolan/jq/issues/250
commons-configurationでUTF-8を使う場合のコード例

大したことじゃないけど、メモを残す意味で記述

## バージョン
 * commons-configuratin : 1.10

## コード

``` Config.java:java
PropertiesConfiguration config = new PropertiesConfiguration();
config.setEncoding("UTF-8");
config.setFile([プロパティファイル]);
config.load();
```

```PropertiesConfiguration```のコンストラクタで```new PropertiesConfiguration(File file)```があって、
これを使うと```new```しただけで```setFile(File file)```と```load()```をやってくれるが、
```setEncoding(String encoding)```で指定したエンコーディングが効かないので個別に指定する。

UTF-8に限らず、デフォルトのエンコーディング（ISO-8859-1）以外を指定する場合はこの対応が必要。
[Javaの小枝] Tuple を使う

# 概要
JavaでもTupleって使いたくね？

# Tupleの実装
Javaでコーディングする際にふと遭遇する下記のような出来事。

 - メソッドから一度に二つ以上のオブジェクトを返したい
 - Mapのキーに複数のオブジェクトの組を使いたい
 - ループカウンタに複数オブジェクトの組が使いたい

そんな場合、他の言語ではTupleを使う。Javaではどうするか… new Object[] とかやって、そこに全部つめこむ？？

そんな型安全を放棄する危ない方法を使わず、下記のようなコードを書いてTupleもどきを作ろう。型安全の防御ネットがコンパイル時にあるだけで、Objectの配列なんかを使うよりバグから君の身を守ってくれる。

下記で示したTuple は複数のオブジェクトを単に組にして要素として保持するだけの単純なクラスであり、要素へのアクセスは以下のように行なう。

 - 先頭(A)は tuple.car
 - 2番目(B)は tuple.cdr.car
 - 3番目(C)は tuple.cdr.cdr.car

上記はLispに慣れ親しんでいればリストへのアクセスと同一なのですぐに理解できるだろう。また全ての要素が同値性を持つときにだけ Tuple 同士が同値になるように設計されている。これはMapのキーにTupleを使う際に大事な性質だ。さらにここでは Immutable として設計されているが、これは多分に私の好みを反映していると言えるかもしれない。

長年に渡って個人的に使用している技なのだが、あまり回りに浸透していないようなので共有する。特に先に上げたMapのキーに複数オブジェクトを使うケース…キーとなる複数オブジェクトをtoString()してつなげて使用しているコードなど見かける気がするが、効率悪い上にあまりに危険なので今後はこうしよう。

```Java:TupleUtil.java
public class TupleUtil {

	public static class Pair<A, B> {
		public final A car;
		public final B cdr;
		public Pair(A car_, B cdr_) {car = car_; cdr = cdr_;}

		private static boolean eq(Object o1, Object o2) {return o1 == null ? o2 == null : o1.equals(o2);}
		private static int hc(Object o) {return o == null ? 0 : o.hashCode();}

		@Override public boolean equals(Object o) {
			if (! (o instanceof Pair)) return false;
			Pair<?, ?> rhs = (Pair<?, ?>) o;
			return eq(car, rhs.car) && eq(cdr, rhs.cdr);
		}
		@Override public int hashCode() {return hc(car) ^ hc(cdr);}
	}
	
	public static class Tuple1<A> extends Pair<A, Object> {
		public Tuple1(A a) {super(a, null);}
	}
	
	public static class Tuple2<A, B> extends Pair<A, Tuple1<B>> {
		public Tuple2(A a, B b) {super(a, new Tuple1<>(b));}
	}
	public static class Tuple3<A, B, C> extends Pair<A, Tuple2<B, C>> {
		public Tuple3(A a, B b, C c) {super(a, new Tuple2<>(b, c));}
	}
	
	public static class Tuple4<A, B, C, D> extends Pair<A, Tuple3<B, C, D>> {
		public Tuple4(A a, B b, C c, D d) {super(a, new Tuple3<>(b, c, d));}
	}

	public static class Tuple5<A, B, C, D, E> extends Pair<A, Tuple4<B, C, D, E>> {
		public Tuple5(A a, B b, C c, D d, E e) {super(a, new Tuple4<>(b, c, d, e));}
	}

    public static void main(String[] args) {
        Tuple4<Integer, String, Double, String> tpl4_1 = new Tuple4<>(42, "foo", 3.14, "baa");
        System.out.println(tpl4_1.car); // 42 と表示
        System.out.println(tpl4_1.cdr.car); // foo と表示
        System.out.println(tpl4_1.cdr.cdr.car); // 3.14 と表示
        System.out.println(tpl4_1.cdr.cdr.cdr.car); // baa と表示

        System.out.println();
        
        Tuple4<Integer, String, Double, String> tpl4_2 = new Tuple4<>(42, "foo", 3.14, "foo");
        Tuple4<Integer, String, String, String> tpl4_3 = new Tuple4<>(42, "foo", "hoge", "baa");
        Tuple4<Integer, String, Double, String> tpl4_4 = new Tuple4<>(42, "foo", 3.14, "baa");
        
        System.out.println(tpl4_1.equals(tpl4_2) + " " + tpl4_1.hashCode() + " " + tpl4_2.hashCode()); // false 二つのハッシュコードは異なる
        System.out.println(tpl4_1.equals(tpl4_3) + " " + tpl4_1.hashCode() + " " + tpl4_3.hashCode()); // false 二つのハッシュコードは異なる
        System.out.println(tpl4_1.equals(tpl4_4) + " " + tpl4_1.hashCode() + " " + tpl4_4.hashCode()); // true 二つのハッシュコードは等しい
    }

}
```
初心者のための「わかりやすいメソッド名をつける」ためのたった一つの重要なこと

わかりやすいメソッド名をつけることができるようなメソッドの切り方にする。以上。

これだけでは非道いので少し補足すると、

* コードの共通部分を機械的に切り出すというやり方でメソッドを作るべきではない。
* わかりやすければ多少重複が残ってもいい。メソッドを切り出すことは全ての重複を排除することではない。
* わかりやすいメソッドをつけることができないと感じた場合、英語の問題の可能性を排除するために、日本語でこのメソッドが何をしているのか、ごく簡潔に説明できるかどうか試す。できない場合、メソッドの切り方を考えなおす。
* わかりやすいメソッド名をつけることができない場合、それはわかりにくいメソッドであることが多い。
* メソッド名がわかりにくいと結局コードの中身を読むハメになる
* 無理やりわかりやすいメソッド名を付けても、それがメソッドの中身と乖離しているとよりタチが悪い

メソッドにはわかりやすい名前をつけよう、とよく言われるが、それは順番が逆なのだと思う。

ふんわりした内容でごめんなさい。
Elixir+PhoenixでPostgreSQLで作ってしまったプロジェクトのDBをMySQL（MariaDB）に変更する

ついつい--database mysql付け忘れてPostgreSQLになってしまったものの、プロジェクトごと作り直すのはなんか違う気がしたので、手で直してみたときの作業録です。

## mix.exsを直す

まずmix.exsを修正します。

```ex:mix.exs（修正前〜抜粋）
def application do
  [mod: {Tutorial, []},
  applications: [:phoenix, :phoenix_html, :cowboy, :logger, :gettext,
                 :phoenix_ecto, :postgrex]]
end

defp deps do
  [{:phoenix, "~> 1.1.3"},
   {:phoenix_ecto, "~> 2.0"},
   {:postgrex, ">= 0.0.0"},
   {:phoenix_html, "~> 2.3"},
   {:phoenix_live_reload, "~> 1.0", only: :dev},
   {:gettext, "~> 0.9"},
   {:cowboy, "~> 1.0"}]
end
```

上記のpostgrexとなっているところをmariaexに直します。

```ex:mix.exs（修正後〜抜粋）
def application do
  [mod: {Tutorial, []},
  applications: [:phoenix, :phoenix_html, :cowboy, :logger, :gettext,
                 :phoenix_ecto, :mariaex]]
end

defp deps do
  [{:phoenix, "~> 1.1.3"},
   {:phoenix_ecto, "~> 2.0"},
   {:mariaex, ">= 0.0.0"},
   {:phoenix_html, "~> 2.3"},
   {:phoenix_live_reload, "~> 1.0", only: :dev},
   {:gettext, "~> 0.9"},
   {:cowboy, "~> 1.0"}]
end
```

## configファイルの修正

次に、ドライバとか、アカウントとかが記述してあるconfigファイルを修正します。
dev.exsと、prod.secret.exsが対象ですが、どっちも同じ修正なので、dev.exsだけ。

```exs:dev.exs（修正前〜抜粋）
config :tutorial, Tutorial.Repo,
  adapter: Ecto.Adapters.Postgres,
  username: "postgres",
  password: "postgres",
  database: "tutorial_prod",
  pool_size: 20
```

アカウント周りは必要に応じて変更してください。

```exs:dev.exs(修正後〜抜粋） 
config :tutorial, Tutorial.Repo,
  adapter: Ecto.Adapters.MySQL,
  username: "root",
  password: "",
  database: "tutorial_prod",
  pool_size: 20
```

## 最後にmix deps.get

以下コマンドを実行してmariaexを追加します。

```bash
$ mix deps.get
Running dependency resolution
Dependency resolution completed
  mariaex: 0.5.0
* Getting mariaex (Hex package)
Checking package (https://s3.amazonaws.com/s3.hex.pm/tarballs/mariaex-0.5.0.tar)
Fetched package
```

これでMySQLへの切り替え完了です！
割と簡単に変えられました！
【Seasar2】Teedaフレームワーク環境構築


# 前提

* tomcatとEclipseの設定完了していること

# Teedaとは

Seasarプロジェクト発のJSF (JavaServer Faces) をベースとしたWebアプリケーションフレームワークです。
業務で化石を使う機会があったのでまとめました。

# 環境準備

Doltengというプラグインをeclipseに入れることでディレクトリ構成を自動で作成できる。
入れ方としては、Eclipseを開き、ヘルプ→新規ソフトウェアのインストール→作業対象に
http://eclipse.seasar.org/updates/3.2/
を入力するとDoltengがでてくるのでインストールしてきます。

# コントローラーからビューに出力

htmlがテンプレートの役割をしていて

```html
<span id="hoge"></span>
```

をhtmlファイルに設置して
コントローラから

```java
public String hoge = "すきすき";
```

のようにidと同名の変数を設定でと出力できる。
詳しくは
http://teeda.seasar.org/ja/extension/tutorial/index.html

# 画面遷移、値を投げるなど

動作済みサンプル（インポートで取り込んで動作確認）
http://teeda.seasar.org/download/2011-09-19/teeda-html-example-1.0.13-sp11.zip

# DB連携(S2Dao)

S2DaoのDB接続使い方参考
Daoとentityをsrc/main/javaに設置する
http://www.zealseeds.com/SysDevTech/seaser2/s2dao/helloworld/index.html
Kotlinのapplyが便利

色んな場面でapplyが便利だったのでメモ

# 例1: 中間変数の削除

クラス変数にsmartcastが効かず、中間変数がほしいとき.

```
class Sample {
    fun setup() { /* なんか設定する */ }
}

class SampleTest {
    var sample: Sample? = null

    fun 普通に書いた場合() {
        this.sample = Sample()
        this.sample?.setup()  // IDEで "Unnecessary safe call on non-null receiver" の警告
    }

    fun applyなし() {
        val sample = Sample() // nullableを避けるために中間変数が必要
        sample.setup()
        this.sample = sample
    }

    fun applyあり() {
        this.sample = Sample().apply { setup() }
    }
}
```

こんな感じでapplyを使えば、"Unnecessary safe call on non-null receiver"の警告なしにすっきり書くことができます。

# 例2: return時のproperty設定

```
fun 普通に書く(anim1: Animator, anim2: Animator): Animator {
    val animator = AnimatorSet()
    animator.play(anim1).before(anim2)
    animator.startDelay = 150L
    return animator
}

fun applyで書く(anim1: Animator, anim2: Animator): Animator {
    return AnimatorSet().apply {
        this.play(anim1).before(anim2)
        this.startDelay = 150L
    }
}
```

この場合も変数宣言が不要で、ちょっとだけタイプ数が減って便利.
java.util.Stream#allMatch() を使うときの注意

```java
public static void main(String[] args) {

  boolean isAllOfFruitsAreApple_1 =
      Arrays.stream(new String[] {"apple", "apple"}).allMatch(s -> s.equals("apple"));

  System.out.println(isAllOfFruitsAreApple_1);

  boolean isAllOfFruitsAreApple_2 =
      Arrays.stream(new String[] {"apple", "orange"}).allMatch(s -> s.equals("apple"));

  System.out.println(isAllOfFruitsAreApple_2);

  boolean isAllOfFruitsAreApple_3 = Stream.empty().allMatch(s -> s.equals("apple"));

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

上記コードを見てどういう出力が得られると思いますか？

true
false
**true**


だと即答できた方は以降は読まなくて大丈夫です。

>https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#allMatch-java.util.function.Predicate-
>>If the stream is empty then {@code true} is returned and the predicate is not evaluated.

とあるように、ストリームが空の場合は、Predicateは評価されずにtrueが返される仕様なので、ドキュメントあまり読まないマン（自分含む）の方は注意しないとハマるかもしれません。
Golang Sortの使い方 -snippetつき

#問題
[ここ](http://www.freecodecamp.com/challenges/return-largest-numbers-in-arrays)から拝借
2次元配列が渡されるので二次元配列内の配列から一番大きい数字を配列にまとめて返せ

#テストコード
```go
package largestNumber

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func Test(t *testing.T) {
	a1 := [][]int{
		[]int{13, 27, 18, 26},
		[]int{4, 5, 1, 3},
		[]int{32, 35, 37, 39},
		[]int{1000, 1001, 857, 1},
	}
	a2 := [][]int{
		[]int{4, 9, 1, 3},
		[]int{13, 35, 18, 26},
		[]int{32, 35, 97, 39},
		[]int{1000000, 1001, 857, 1},
	}
	assert.Equal(t, largestOfFour(a1), []int{27, 5, 39, 1001}, "1")
	assert.Equal(t, largestOfFour(a2), []int{9, 35, 97, 1000000}, "2")

}

```

#解法
なんてことはありません｡Sort関数を使うだけです｡
LenとSwapがそれぞれ何をしてるか､なんで必要なのかイマイチわかりませんでした｡(詳しい方､教えてくださると幸いです)

Len
-> 長さを返す｡たいていの例ではそのまま長さを返してるだけでした｡

Swap
-> どうも並び順を決めてるようです｡iとjを入れ替えると結果が変わります｡

Less
-> 並べ方を記述します｡ここの記述方法は他の言語でも良く見ます｡

```go
package largestNumber

import (
	"fmt"
	"sort"
)

func largestOfFour(ar [][]int) []int {
	resAr := []int{}
	for i := 0; i <= len(ar)-1; i++ {
		sort.Sort(retLargest(ar[i]))
		resAr = append(resAr, ar[i][0])
	}
	return resAr
}

type retLargest []int

func (el retLargest) Len() int {
	return len(el)
}

func (el retLargest) Swap(i, j int) {
	el[i], el[j] = el[j], el[i]
}

func (el retLargest) Less(i, j int) bool {
	return el[i] > el[j]
}

```

しかしGOのソート関数はRubyとかJSにくらべて入力項目が多くてめんどいですね｡スニペット作りましょう｡

#snippet(Sublime用)

```
<snippet>
  <content><![CDATA[
sort.Sort(${1:sortFuncName}(${9:element}))

type ${1:sortFuncName} ${2:[]int}

func (el ${1:sortFuncName}) Len() ${3:int} {
  ${4:return len(el)}
}

func (el ${1:sortFuncName}) Swap(i, j ${5:int}) {
  ${5:el[i], el[j] = el[j], el[i]}
}

func (el ${1:sortFuncName}) Less(i, j ${6:int}) ${7:bool} {
  ${8:return el[i] > el[j]}
}
]]></content>
  <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
  <tabTrigger>sort</tabTrigger>
  <description>sort by func</description>
  <!-- Optional: Set a scope to limit where the snippet will trigger -->
  <scope>source.go</scope>
</snippet>
```
AWS CloudFrontで自動gzip圧縮

いつの間にかCloudFrontにgzip圧縮機能が追加されていました。
特に、S3をoriginとするとaccept-encodingによる分岐ができないため、この機能の追加は非常にありがたいです。
AWS Consoleからチェックボックスで簡単に有効化できます。

2015/12/17にさりげなく発表されてました。見落としてた。。。
[New – Gzip Compression Support for Amazon CloudFront](https://aws.amazon.com/blogs/aws/new-gzip-compression-support-for-amazon-cloudfront/)

## コスト
追加のコストは発生せず、転送量が減る分むしろ安くなるようです。
>There is no extra charge for the compression; your CloudFront data transfer charges may actually go down (the specifics depend on the proportion of compressed to uncompressed requests, of course).



## 注意
既存のDistributionに対して圧縮う有効にした場合、キャッシュが消えないケースがあるようです。念のため一度invalidateしたほうがよさそうですね。

>Content already in edge locations when you configure CloudFront to compress files
CloudFront compresses files in each edge location when it gets the files from your origin. When you configure CloudFront to compress your content, it doesn't compress files that are already in edge locations. In addition, when a file expires in an edge location and CloudFront forwards another request for the file to your origin, CloudFront doesn't compress the file if your origin returns an HTTP status code 304, which means that the edge location already has the latest version of the file. If you want CloudFront to compress the files that are already in edge locations, you'll need to invalidate those files. For more information, see Invalidating Objects (Web Distributions Only).
godでtwitter gemのstreamingを常時監視するのに苦労した時のメモ

## Twitter監視するスクリプト作ったぞー
そんな時に神に降臨してほしい。
[godのスタートアップをやってみた - mosson | Qiita](http://qiita.com/mosson/items/f2ff019edd199f714052)

## うまく動いてくれない
なんだかgodの設定例に従うとうまく動いてくれるのに、いざ自分のrubyスクリプトを神様に監視していただこうと思ってもうまくいかない。

```ruby:streamtest.rb
require 'twitter'
#...
# 認証とか済ませてから
#...
stream = account.stream_api  # Twitter::Streaming::Clientオブジェクト
stream.user do |object|
  if obj == Twitter::Tweet
    p "ツイートを取得しました"
  end
end
```

```rb:streamtest.god
FILE_PATH = "#{Dir.pwd}/streamtest.rb" # あなたの常駐化させたいアプリ
God.watch do |w|
  w.name = "streamtest"
  w.start = "ruby #{Dir.pwd}.rb"
  w.keepalive
end
```
これで `god -c ./streamtest.god -D` しても

```shell-session:Shell
I [2016-01-25 04:11:58]  INFO: streamtest [trigger] process is not running (ProcessRunning)
I [2016-01-25 04:11:58]  INFO: streamtest move 'up' to 'start'
I [2016-01-25 04:11:58]  INFO: streamtest start: ruby /home/me/streamtest.rb
I [2016-01-25 04:11:58]  INFO: streamtest moved 'up' to 'up'
I [2016-01-25 04:12:03]  INFO: streamtest [trigger] process is not running (ProcessRunning)
I [2016-01-25 04:12:03]  INFO: streamtest move 'up' to 'start'
I [2016-01-25 04:12:03]  INFO: streamtest start: ruby /home/me/streamtest.rb
I [2016-01-25 04:12:03]  INFO: streamtest moved 'up' to 'up'
I [2016-01-25 04:12:08]  INFO: streamtest [trigger] process is not running (ProcessRunning)
I [2016-01-25 04:12:08]  INFO: streamtest move 'up' to 'start'
I [2016-01-25 04:12:08]  INFO: streamtest start: ruby /home/me/streamtest.rb
...
```

って感じで永遠に起動してくれない。
30分くらい触った結果、`loop do ... end` 以外のループ文(というかブロック文)とgodの相性が悪いのではないかと思った。
`File.open do ... end` とか `Twitter::Streaming::Client.user do ... end` があるとgodでは起動してくれない(のかすぐ終了してしまうかどちらか)っぽい。

## 改善策

- それ自体がループしてなさそうで
- `streamtest.rb`が死んだ時に終了してくれる  
そんなプログラムを間に挟めばいいのではないだろうか

=> `foreman`があるじゃないかー
[foreman で アプリケーションを動かす。- 7kaji | Qiita](http://qiita.com/7kaji/items/6a59977d2ad85604e7fd)

というわけで、

まず`Procfile`を`streamtest.rb`と同じフォルダに。

```text:Procfile
web: ruby ./streamtest.rb 
```
なににするか迷ったけどとりあえずwebに。

そして`streamtest.god`も書き換え。

```rb:streamtest.god(新)
God.watch do |w|
  w.name = "streamtest"
  w.start = "foreman start -d #{Dir.pwd}"
  w.keepalive
end
```

`-d`オプションでProcfileのロケーションを渡します。
`#{Dir.pwd}` としてるところはちゃんと絶対パスを指定したほうがいいです。本当は。これはまだ作りかけでファイルの位置がコロコロ変わるのでパスを取得するようにしています。

## 結果

動いた！　ばんざい！
５秒毎に `[trigger] process is not running (ProcessRunning)` と出ることがなくなりました。
PhpStormのSubversion設定

PhpStormでのサブバージョン設定（8.0.3）

①コマンドラインクライアントをダウンロード
http://www.visualsvn.com/downloads/
![image](https://qiita-image-store.s3.amazonaws.com/0/110634/ec784df4-8a7c-2ef5-954a-6791190d1a48.png)

②任意のフォルダに解凍
C:\Program Files\Apache-Subversion-1.8.13\bin\svn.exe

③PhpStorm設定
・VCS > Import into version control > Import into Subversion..
1.ソースのリポジトリを登録

・File > Settings > Version Control
2．右上の＋ボタンよりローカルのプロジェクト格納場所とSubversionを設定
![image](https://qiita-image-store.s3.amazonaws.com/0/110634/50a42f2b-e313-3c4d-db51-01bc3a646365.png)

・Version Control > Subversion
3．先程ダウンロードしたコマンドラインクライアントを指定します
![image](https://qiita-image-store.s3.amazonaws.com/0/110634/6feb484f-94a1-e3e6-24f1-425951f445de.png)

・VCS > Checkout from version control > Subversion
4．リポジトリを選択しチェックアウト押下後、ローカルのプロジェクト格納場所を選択し最新版を落とす


5.これでプロジェクト一覧のソースを右クリックした場合にSubversionメニューが出るようになります
![image](https://qiita-image-store.s3.amazonaws.com/0/110634/340857e9-4421-80b7-82c5-2131d9710815.png)
勉強会JS編＜3＞ フロントエンド開発環境構築


## 関連記事

* [勉強会JS編＜1＞ オブジェクト指向言語としてのJavaScriptを理解](http://qiita.com/park-jh/items/1887d87f33474cf7d733)
* [勉強会JS編＜2＞ クライアントサイドMVCフレームワーク](http://qiita.com/park-jh/items/8b0a21e09223e3a8d0bc)
* 勉強会JS編＜3＞ フロントエンド開発環境構築
* [勉強会JS編＜4＞ yeoman + backbone.model + grunt](http://qiita.com/park-jh/items/78bc01b93fe6d4167624)
* [勉強会JS編＜5＞ yeoman + backbone.collection + backbone.localStorage](http://qiita.com/park-jh/items/49fefe30cdf57de7b6f0)
* [勉強会JS編＜6＞ yeoman + backbone.view](http://qiita.com/park-jh/items/44fb4faac997c71201a0)
* [勉強会JS編＜7＞ yeoman + backbone.router](http://qiita.com/park-jh/items/8f7d4275279201d5796b)
* [勉強会JS編＜8＞ yeoman + backbone.js 実践 - その１](http://qiita.com/park-jh/items/bad19e1c6b502ef0d0fa) 
* [勉強会JS編＜9＞ yeoman + backbone.js 実践 - その２](http://qiita.com/park-jh/items/55d62bc58b94b12835c3)

## node

### node.jsとは

サーバーサイドJavaScriptの実行環境

### 設置

* homebrewが設置されていない場合、設置する。
  - homebrewはmacでパッケージを管理するためのツール
  - macでパッケージを設置したい場合はhomebrewを使って管理したほうがいい。

```sh
  ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

* nodeとnpmを分離して設置する。
  - homebrewでnodeを設置した場合npmが一緒に設置される。
  - npm update npm -gを実行するとエラーが発生するので、以下の手順で既存設置されたnodeをアンインストールし、nodeとnpmをそれぞれ設置する。

```sh
  rm -rf /usr/local/lib/node_modules
  brew uninstall node
  brew install node --without-npm
  echo prefix=~/.node >> ~/.npmrc
  curl -L https://www.npmjs.com/install.sh | sh
```

* ~/.nodeというディレクトリを確認する。

* ~/.node/binをPATHに追加する。

```sh
  export PATH="$HOME/.node/bin:$PATH"
```

* 設置途中でnpm関連エラーが発生する場合
  - 古いバージョンのnodeを見ている可能性がある。
  - brewで設置したnodeのバージョンとnode -vで確認したバージョンが一致しないとダメ。
  - 古いバージョンのnode及びnpmを削除してもう一度上の手順でやり直し。

## npm

### npmとは

* node.jsのモジュールを管理するためのツール

* 主要なモジュールを設置する。

```sh
  npm install -g phantomjs
  npm install -g backbone
  npm install -g bower
  npm install -g coffee-script
  npm install -g grunt-cli
  npm install -g yo
  npm install -g generator-backbone
  npm install -g generator-mocha
  npm install -g generator-backbone-mocha
```

* 設置結果

```sh
  [devnote@hooni:~] % npm ls -g --dept=0
  /Users/devnote/.node/lib
  ├── backbone@1.2.3
  ├── bower@1.7.2
  ├── coffee-script@1.10.0
  ├── generator-backbone@0.4.0
  ├── generator-backbone-mocha@0.1.1
  ├── generator-mocha@0.2.0
  ├── grunt-cli@0.1.13
  ├── npm@3.5.3
  ├── phantomjs@1.9.19
  └── yo@1.6.0
```

  - backbone.js：クライアントサイドフレームワーク

  - bower（バウワー）：フロントエンドライブラリの依存性管理ツール

  - coffee-script：javascriptをより簡単な文法で生成してくれるAltJS（JavaScript代替言語）

  - phantomjs：scriptable headless webkit（ブラウザが不要なjavascriptが実行できるwebkit）

  - yeoman（ヨーマン）：scaffolding tool

  - grunt：タスクを自動化するタスクランナー

## 参考書籍

* JavaScript徹底攻略
* JavaScriptエンジニア養成読本
Rails で Routing Error uninitialized constant ApplicationController と言われました。

deviseのログイン機能を作っていると思ったらエラーがでました。

# Routing Error
 
```
Routing Error
uninitialized constant ApplicationController
```

あれ
![寿司ゆき:what](https://d1zd1v0cxnbx2w.cloudfront.net/images/sets/sushiyuki/12.png) 

これは謎のエラーでオカシイですね。

# ApplicationControllerがなかった
gitでマージした時にapplication_controller.rbが消えてしまったようです。

application_controller.rbを削除していた該当commit を git revertして、application_controller.rbを復活させました。

# 再度 rails s
今度は表示されるようになりました。
config/locales配下のja.yamlを全部印刷する方法

## 前提
`config/localesディレクトリ`をカレントディレクトリとして作業しています。

## まず確認
`find . -type f -name '*ja*' -print`
で期待するファイル名が取れることを確認する

## execで印刷する
**（execやめてcatで一回連結したほうがよいかと... この記事の次の項目参照）**
`find . -type f -name '*ja*' -exec lp {} \;`

最後`{}\;`とスペースなしで連続して書いたら

> find: -exec: no terminating ";" or "+"

というエラーが出るので注意。
[Linux - find の -exec optionの末尾につく \; と + の違い。 - Qiita](http://qiita.com/ironsand/items/0aed2ffca295706cab69)

`\;`と`+`には上記のような違いがあるようだけど、今回のは繋げて書いたのが原因なので、違いはあんまり関係なかったが、違いがあることを知った。

## さすがに枚数が多すぎた！
さすがに枚数が多すぎたので
`cat **/ja.yml >> ja_all.txt`
で1ファイルにして印刷しよう。

### ファイル名も明記したい！！
```
for f in **/ja.yml; do
	echo ""
    echo "$f"
    cat "$f"
done > ja_all.txt
```

参考：http://superuser.com/a/532152/249264
Matlab => Python 移行メモ

# 序
 - MATLABユーザーがPythonを触るメモ
 - 順次改稿

## 環境
 - spyder 重い，見た目わるい気がする Rstudioとかに完成度で劣る気がする
 - Enthought canopy 覚えてない
 - visual studio 重い，windows
 - emacs + jedi.el + ipython で補完は充分だと思う
 - Atom, Subime + ipython 試していないけど外部モジュールも補完してくれるなら充分では

### startup
MATLABでstartup.mというのを MATLAB/ においてると起動時に実行してくれるので，そこでパスの設定をしていたんだけど ipython では "~/.ipython/profile_default/startup/00-hoge.py" とかに書けば良いらしい．以下READMEより．windowsは知らん．

```
This is the IPython startup directory
.py and .ipy files in this directory will be run *prior* to any code or files specified
via the exec_lines or exec_files configurables whenever you load this profile.

Files will be run in lexicographical order, so you can control the execution order of files
with a prefix, e.g.
    00-first.py
    50-middle.py
    99-last.ipy
    
```

とりあえずこれだけ書いといた

```
import matplotlib.pyplot as plt
import numpy as np

```


## 感想

 - 最近のMATLABでは改善してるけど名前空間がわかりやすくて良い
 - 文字コード，とくにエスケープがややこしい
 - ipythonが時々補完してくれなくてこまる
 - スクレイピングはまぁ楽
 - グラフはMATLABの方が色々融通が利いて良い気がする

# 文法
## インデックス
 - a(1:end) => a[0:]
 - a(1:end-1) => a[0:-1]
 - 

# 関数関連
標準的な処理ともかく統計や画像処理のパッケージの定番が最初よくわからなかった

## システム
 - mkdir => os.mkdir
 - tic => t = time.time()
 - toc => time.time()-t
 - disp => print "Hello"

## 行列
大体 numpyでなんとかなるぽい

 - A(:) => A.ravel()
 - num2str => "{0:04d}".format(A[i])


## 統計
簡単な関数はnumpyに入ってる．あとは大体scipy.statsで足りそう

 - median(A) => numpy.median(A)
 - mean(A) => numpy.mean(A)
 - std(A) => numpy.std(A)
 - corrcoef => numpy.corrcoef
 - signrank => scipy.stats.wilcoxon
 - zscore => scipy.stats.mstats.zscore


## 画像処理関連
[skimage](http://scikit-image.org)が一位番IPTに近い？

 - imadjust => skimage.transform.rescale_intensity
 - imresize => skimage.transform.resize
 - imread => skimage.io.imread
 - imwrite => skimage.io.imsave
{biOps} 画像補間法

{biOps}のインストールについては、[前記事参照](http://qiita.com/kilometer/items/772e355b19ac810f71a6)の事。

# サンプル画像の作成

背景は[0, 40]の一様乱数で、カクカク曲線と直線が交差しているようにする。
![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/92401/a2e459c2-8a87-cd7b-f1c7-7ad7d57a893c.png)
おお、それっぽい。

```r
# 乱数のシード
set.seed(11)
# 円のxy座標を整数値で吐き出す。
x <- round(20*cos(seq(0, 2*pi, by=0.05)) + 31)
y <- round(20*sin(seq(0, 2*pi, by=0.05)) + 31)
xy <- cbind(x,y)
# 乱数に縦線と横線。
a <- matrix(runif(61*61, 0, 40), 61)
a[31,] <- 150
a[,29:31] <- 100
# ゴリ押しで円の部分を白抜き
for(i in 1:nrow(xy)){
  a[xy[i,1], xy[i,2]] <- 255
}

# 画像を保存-その1
dat <- imagedata(a)
writeTiff("sample.tiff", dat)

# 画像を保存-その2
tiff("sample.tiff", width=61, height=61)
par(mar=c(0,0,0,0))
image(1:nrow(a), 1:ncol(a), a, col=grey(0:255/255))
dev.off()

```

# Let's 内挿

![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/92401/27225172-0a9b-2da8-23e4-a7148806f935.png)
全体像
![スライド2.png](https://qiita-image-store.s3.amazonaws.com/0/92401/3c835583-aeec-b717-adc6-e0f1e9b50d2a.png)
拡大像

```r
library("biOps")

dat0 <- readTiff("sample.tiff")
dat1 <- imgScale(dat0, 3, 3, interpolation = "bilinear")
dat2 <- imgScale(dat0, 3, 3, interpolation = "cubic")
dat3 <- imgScale(dat0, 3, 3, interpolation = "spline")

writeTiff("hoge.tiff", dat)
```


# で、何なのか。

これは、要するに、
![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/92401/1dafb4a0-1a01-066f-2070-6ea4e6aaa08d.png)
という事をして、隙間を自然に埋めよう、という事。なので、
![スライド2.png](https://qiita-image-store.s3.amazonaws.com/0/92401/2ee11c10-40c5-012e-20f0-076ed7bfcd28.png)
こんな事を考えて、赤い線の長さがわかれば良い。
![スライド3.png](https://qiita-image-store.s3.amazonaws.com/0/92401/8bd5807b-279e-ef39-cb4c-2d6a0b4953a0.png)
こうですね。

この補間関数に何を使うか、という話。

**biliner**では、近傍4点の重回帰。超シンプル。

**cubic**では、近傍16点で3次関数でフィッティング。
これは、4点あれば3次関数が1義に決まるから。
一般にはbicubic法と呼ばれる。

**spline**では、B-splineという関数でフィッティングする。
BはBasicのBらしい。詳しくはグーグル。

結果は見ての通り。
bicubicは結構クセがありますねぇ。
背景ノイズに強いのはB-splineでしょうか。
Fastlyについてのメモ


https://www.fastly.com/

## 概要

- 利用企業
 - Twitter, Pintarest, CNNとか
 - メディア系
- HTMLのトップページそのまま使えるかも
 - ログイン情報とかはCookieに入れてJSでリクエスト
- Fastly = Realtime CDN
 - キャッシュコントロール (瞬時)
 - アクセスログ (2,3秒)

リクエストの種類

- Static
 - JS/CSS, Image Video等
- Event Drevin Content (EDC)
 - 10秒後のレスポンスが同じAPIなど
- Dinamic

FastlyではEDCまでキャッシュ出来る


## 高スペックのエッジサーバー

- 768GB RAM + 10Gbpx * 4の接続スピード
- 100%SSD
- SSD用チューニングされたファイルシステム
- 2-4万rps

20msぐらい。AWSのCDNは50ms-100msぐらい

## パージ後にサーバーに負荷が行き過ぎないよう配慮

- オリジンシールド
 - Singapore -> Tokyo -> Server
- 同時リクエスト集約

## Cache使わないものもFastlyで早く出来る

- シンガポール-東京間のやり取りとかでRouting最適化する


## Varnishのロジックをエッジサーバーに置くことが出来る

- モバイルページとかUserAgentで変えているところとかもキャッシュできる。

## 場所

- Tokyo
- Osaka
- Hong Kong
- Singapore
- US主要都市
- ヨーロッパ数カ所
- インド

## キャッシュ管理

ページレベル、ドメインレベル、サロゲートキー（タグ）レベルでできる。

## MemcachedやRedisとの違い

- Fastly
 - HTTPオブジェクト単位でのキャッシュ
 - 高いレイヤでキャッシュできるのでヒットした時の効果が高い
 - APIのキャッシュも幾つか事例がある
- もっと細かい単位ではApplicationレベルでやったほうがいい
 - DBアクセスのキャッシュ、int程度の小さいオブジェクトのキャッシュ


## 事例

- [Hotel Tonight](https://www.hoteltonight.com/)のモバイル
- [AppMedia](http://appmedia.jp/)で99%のヒット率
IntelliJ(MaxOS X) vagrant で接続するとエラー


## 環境

MacOS X Yosemite (10.10.5)
vagrant 1.7.4
VirtualBox 5.0.10

## 問題

Remove Ruby SDKを設定するときなど、Vagrant経由で指定すると以下のエラーがおきた。

<pre>
Can't Get Vagrant Settings.
Vagrant could not detect VirtualBox!
</pre>

VirtualBoxが最近のバージョンだとおきるもよう。

## 解決法

バージョンを下げたくないので、
MacOSで VBoxManageのパスを変更した

```
sudo -ln /usr/local/bin/VBoxManage /usr/bin/VBoxManage
```


###参考
http://stackoverflow.com/questions/31838687/vboxmanage-is-not-found-with-intellij-php-remote-interpreter-vagrant