OmniAICreator/Qiita-1.07M huggingface dataset:
Riak doc の Command Line Tools を意訳してみた


# Command Line Tools

大雑把な意訳、訳しにくい箇所は英文と一緒に転載します。
http://docs.basho.com/riak/1.3.2/references/Command-Line-Tools/

## Overview

これは Riak コマンドラインツールと、それらのサブコマンドに関して記載します。これらのコマンドは、ノードに組み込まれた bin ディレクトリと、パッケージによってインストールされたパスに置かれます。通常は /usr/sbin または /usr/local/bin ディレクトリです。

## Riak

riak は、Riak ノード・プロセスを制御する主要なスクリプトです。次のサブコマンドが利用可能です。

* start
* stop
* restart
* reboot
* ping
* console
* attach
* chkconfig

## riak-admin

riak-admin は、Riak ノードに関係しないオペレーションを行ないます。ノードのメンバーシップや、バックアップ、基本的なステータスをレポートする機能を含んでいます。Riak ノードは、これらのコマンドの多くのために処理を行ないます。次のサブコマンドが利用可能です。一部、取り消し線は非推奨になったサブコマンドです。

* cluster
  * cluster join
  * cluster leave
  * cluster force-remove
  * cluster replace
  * cluster force-replace
* 
join

* 
leave

* backup
* restore
* test
* status
* 
reip

* js-reload
* wait-for-service
* services
* ringready
* transfers
* 
force-remove

* down
* cluster-info
* member-status
* ring-status
* vnode-status

## search-cmd

search-cmd は、Riak に含まれている Search 機能を利用するために使用されます。次のサブコマンドが利用可能です。

* set-schema
* show-schema
* clear-schema-cache
* search
* search-doc
* explain
* index
* delete
* solr
* install
* uninstall
* test

## End

特に言うことなし
git-grepでPerlの正規表現を使えるようにする（Homebrew)


git-grep -PでPCRE(Perl Compatible Regular Expressions)を使おうと思ったら下記のようなエラーが発生。

```
fatal: cannot use Perl-compatible regexes when not compiled with USE_LIBPCRE
```

-with-pcreオプションををつけてgitを再インストールすればOK

```
brew unlink git
brew install git --with-pcre  
```
RubyGems だけで完結した感じでJSONを奇麗に表示する

## `JSON.pretty_generate`

```rb:kawaii_json.rb
require 'json'
source = {foo: "bar", hoge: [1, 2, 3], buz: {gogo: "hoho"}}
puts JSON.pretty_generate(source)
```

もはや標準添付になっている json.rb 使う。

## coderay

* http://coderay.rubychan.de/

JSON のシンタクスハイライトがあるのでこれを使う。Pygmentsとかは要らなかった。

```rb:kawaii_json.rb
require 'json'
require 'coderay'
source = {foo: "bar", hoge: [1, 2, 3], buz: {gogo: "hoho"}}
puts CodeRay.scan(JSON.pretty_generate(source)).terminal
```

![dc8917ce6cc66f3440d8c0692758649e.png](https://qiita-image-store.s3.amazonaws.com/0/569/de3a5518-5938-806a-b182-f3253cb62b43.png)
three.jsでテクスチャがうまくロードできないのですが、どう直せばいいでしょう？

キャッシュ関係であることはわかるのですが…

```html:hoge.html
<script src="/javascripts/three.min.js" type="text/javascript"></script>
<script src="/javascripts/three/EditorControls.js" type="text/javascript"></script>
<div id="canvas-frame"></div>
<script>
  var ModelRender = function(texture, scene) {
    this.scene = scene;
    this.texture = texture;
    this.boxes = [];
    this.addBox = function(boxSize, boxPos, texPos) {
      var box = new ModelBox(boxSize, boxPos, texPos, true, this);
      this.boxes.push(box);
      return box;
    };
    this.addLine = function(a,b,color) {
      var geometry = new THREE.Geometry();
          geometry.vertices.push(a);
          geometry.vertices.push(b);
      var material = new THREE.LineBasicMaterial({color: color});
      var line = new THREE.Line(geometry, material);
      this.scene.add(line);
    };
    this.addLine(new THREE.Vector3(0,0,0),new THREE.Vector3(200,0,0),0xff0000);
    this.addLine(new THREE.Vector3(0,0,0),new THREE.Vector3(0,200,0),0x00ff00);
    this.addLine(new THREE.Vector3(0,0,0),new THREE.Vector3(0,0,200),0x0000ff);
  };
  
  var ModelBox = function(boxSize, boxPos, texPos, transparent, render) {
    this.render = render;
    this.texture = this.render.texture.clone();
    this.texture.needsUpdate = true;
    this.material = new THREE.MeshPhongMaterial({ map:this.texture });
    this.material.transparent = transparent;
    this.geometry = new THREE.CubeGeometry(boxSize.x, boxSize.y, boxSize.z, 0, 0, 0);
    this.mesh = new THREE.Mesh(this.geometry, this.material);
    this.render.scene.add(this.mesh);
  };
  

  
  
  
  // (1)レンダラの初期化
  var renderer = new THREE.WebGLRenderer({ antialias:true });
  renderer.setSize(500, 500);
  renderer.setClearColor( new THREE.Color(0x000000) );
  document.getElementById('canvas-frame').appendChild(renderer.domElement);

  // (2)シーンの作成
  var scene = new THREE.Scene();

  // (3)カメラの作成
  var camera = new THREE.PerspectiveCamera(15, 500 / 500);
  camera.position = new THREE.Vector3(0, 0, 8);
  camera.lookAt(new THREE.Vector3(0, 0, 0));
  scene.add(camera);

  // (4)ライトの作成
  var ambient = new THREE.AmbientLight(0xffffff);
  scene.add(ambient);

  // (5)表示する物体の作成
  var texture = THREE.ImageUtils.loadTexture('/images/char.png')
    texture.magFilter = THREE.NearestFilter;
    texture.minFilter = THREE.NearestFilter;
  
  var modelRender = new ModelRender(texture, scene);
  modelRender.addBox({x:1, y:1, z:1}, 0, 0);
  
  var controls = new THREE.EditorControls(camera, renderer.domElement);
      controls.pan = function(){};

  // (6)レンダリング
  function animate() {
    requestAnimationFrame(animate);
    render();
  }
  
  function render() {
    renderer.render(scene, camera);
    console.log("render")
  };
  
  animate();
</script>

```

よろしくおねがいします
Androidによるネイティブアプリ作成（スプラッシュ編）

# Androidによるネイティブアプリ作成（スプラッシュ編）


## はじめに
PhoneGapでの記述で進めようと思いましたが、実装が2.0.0より上のバージョンから外部ドメインを直接読み込めないようになっていたので、ネイティブで書いたほうが早いんじゃね？
という理由でAndroidではPhoneGapを使用せず書くことにしました。コード量的にはこっちのほうがスッキリして管理できる範囲なのでこっちにしました。PhoneGapはバージョンごとにどこがどう変わったのかいちいち調べるのが面倒くさいです。用は楽してコード書きたいんです。人のオナニー他人に押し付けるなということです。
PhoneGap？ (ﾟ⊿ﾟ)ｼﾗﾈ...

## スプラッシュ表示
アプリで大概でてくるスプラッシュですが、実装は簡単です。
とはいってもXcodeみたく親切ではないです。

用意するものは端末サイズごとに３パターン用意します。
１パターンでもいいですがそうすると端末側で拡大縮小されるんで綺麗に見えません。
それぞれ、logo.pngとします。xhdpiはめんどいので...

・drawable-hdpi  480 x 800 px
・drawable-ldpi  240 x 400 px
・drawable-mdpi  320 x 480 px

## Activity
Activityとは、“Androidアプリの画面”に相当します。ボタンやリストが配置された画面、Webページが表示されている画面、3Dグラフィックスが表示されている画面などはそれぞれがActivityです。Androidは画面を持たないアプリも作成可能で、その場合はActivityを使用しないものもあります。スプラッシュはアクティビティを使用します。今回は、resのlayoutに新規追加でsplash.xmlを追加してください。


```xml:splash.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <ImageView
		android:layout_width="fill_parent"
		android:layout_height="fill_parent"
		android:scaleType="centerInside"
		android:src="@drawable/logo"
	/>
</LinearLayout>

```

ご覧のようにlogoを指定してフル表示指定しています。
次にクラスを書きます。今回は、srcにSplashActivity.javaとします。


```java:SplashActivity.java

package jp.co.hogehoge.piyopiyo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.Window;

public class SplashActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.splash);
		Handler hdl = new Handler();
		hdl.postDelayed(new splashHandler(), 500);

	}

	class splashHandler implements Runnable {
		public void run() {
			Intent i = new Intent(getApplication(),
					SimpleActivity.class);
			startActivity(i);
			SplashActivity.this.finish();
		}
	}
}

```

ご覧のようにonCreateされた時点でタイトル非表示とし、splash.xmlを呼び出します。
ハンドラをインスタンスし、500ミリセカンド経過したのち、次のアクティビティに遷移します。


```xml:AndroidManifest.xml

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >

	<activity
	    android:name=".SplashActivity"
	    android:screenOrientation="portrait"
	    android:label="@string/app_name"
	    android:theme="@android:style/Theme.NoTitleBar" >
	    <intent-filter>
	        <action android:name="android.intent.action.MAIN" />
	        <category android:name="android.intent.category.LAUNCHER" />
	    </intent-filter>
	</activity>

</application>

```

AndroidManifest.xmlのintent-filterを書き換えます。
action android:name="android.intent.action.MAIN"
category android:name="android.intent.category.LAUNCHER"
は初期起動時に表示するアクティビティを意味します。ひとつのアプリにこの表記はひとつだけです。
複数つけるとインストール時に同一アプリのアイコンが複数ウイルスのように表示されます...。
気をつけましょう。


## まとめ
XCodeのようにIBを使用するまでもないですが、コードの読みやすさはさすがにObject-Cよりわかりやすいです。
UIWebViewではURLSchemeでのアプリ起動ができない？

意外な動きだったので。URLSchemeを仕込んだ下記のようなページを用意した時に、Safariからゲームセンターを起動する事はできたが、UIWebViewからはできなかった。

```html:
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
	<a href="gamecenter:">ゲームセンター</a>
</body>
</html>
```

仕方ないので下記のようにしてみた。

```objc:
- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    //こうしないと起動できなかった。Safariでリンクを押した時は起動できるけどね。
    if([[[request URL] scheme] isEqual:@"gamecenter"]){
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO;
    }

  }
  return YES;
}
```
godocをOSX起動時に起動する (GoogleAppEngine対応版)

## ローカルでgodocを起動する利点

http://golang.org/pkg/ では標準のパッケージしか見られませんが、ローカルでgodocを起動させると go getでインストールしたパッケージも見られます。

## godocの環境変数設定

まずgodocに必要な環境設定を設定します。man launchdctl によると ~/.launchd.conf は現在非サポートとのことなので、システムワイドの設定ファイル /etc/launchd.conf を作成します。

```
$ sudo vi /etc/launchd.conf
```

```
setenv GOPATH /Users/hnakamur/mysrc/go
setenv PATH /usr/bin:/bin:/usr/sbin:/sbin:/Applications/google_appengine
```

GOPATHを設定すると go get で取得したパッケージも含まれるようになります。値は適宜調整してください。

PATHは ```launchctl getenv PATH``` で確認したデフォルト設定に Google App Engine SDKを展開したディレクトリを追加しています。これにより、トップレベルにappengine, appengine_internalパッケージが表示されるようになります。

## LaunchAgentの設定

次にLaunchAgentの設定ファイルを作成します。

```
$ vi ~/Library/LaunchAgents/local.godoc.plist
```

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>local.godoc</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/go/bin/godoc</string>
    <string>-http=127.0.0.1:6060</string>
  </array>
  <key>Sockets</key>
  <dict>
    <key>Listeners</key>
    <dict>
      <key>SockServiceName</key>
      <string>6060</string>
    </dict>
  </dict>
  <key>KeepAlive</key>
  <true/>
  <key>RunAtLoad</key>
  <false/>
  <key>OnDemand</key>
  <false/>
</dict>
```

ターミナルから手動での起動は ```godoc -http=:6060``` でいいのですが、launchctlからだとなぜかうまくいかないので、 ```godoc -http=127.0.0.1:6060``` としています。

## 起動設定と初回起動

```
$ launchctl load ~/Library/LaunchAgents/local.godoc.plist
```

## ブラウザでドキュメントを表示

ブラウザで下記のURLを開けばgoのドキュメントが表示されます。
http://127.0.0.1:6060/pkg/
Eclipse 4.3 Keplerを日本語化する方法

ブログに書いたよ。
<a href="http://d.hatena.ne.jp/replication/20130628/1372349579">Eclipse 4.3 Keplerを日本語化する方法 - 大人になったら肺呼吸</a> <a href="http://b.hatena.ne.jp/entry/d.hatena.ne.jp/replication/20130628/1372349579"><img src="http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/replication/20130628/1372349579" alt="はてなブックマーク - Eclipse 4.3 Keplerを日本語化する方法 - 大人になったら肺呼吸" border="0" /></a>
Vagrantfile のすぐに使えそうな項目(2系)


[Vagrant Documentation](http://docs.vagrantup.com/v2/vagrantfile/machine_settings.html "Vagrant Documentation") このページから、特に Vagrant を開発環境の構築に使う場合に必要そうなものをピックアップ。ぱっと見、公式には2系しか書いてないっぽいので、以下全部2系での書き方。

動作確認は Vagrant 1.2.2 で行った。（してない項目もある）

## 基本

|||
|:----------|:--------|
|`config.vm.box`|どの box を使うかの指定。`vagrant box add [name] [url/path]`した時の、`name` を指定する |
|`config.vm.box_url`| 指定した url から box を持ってくる。ネットワーク上に構築済みの VM を置いておいて、Vagrantfile を配布すれば環境構築が終わる、みたいな使い方ができそう|
|`config.vm.network`| ネットワーク周りの設定|
|`config.vm.provider`| バーチャルマシン(VirtualBox, VMware など)固有の設定|
|`config.vm.provision`| chef とか puppet の設定を書く。ここでは言及しない|

## `config.vm.network`

||説明|例|
|:----------|:--------|:----|
|`:forwarded_port`| ポートフォワードの設定|`config.vm.network :forwarded_port, guest: 80, host: 8080`|
|`:private_network`|プライベートIPの設定|`config.vm.network :private_network, ip: "192.168.50.4"`|

## `config.vm.provider`

VirtualBox に加えて VMWare もサポートするようになったから増えた項目なのかな？
僕は基本的に VirtualBox しか使わないので、以下は VirtualBox の場合。

### 基本

```rb
config.vm.provider "virtualbox" do |v|
  v.gui = true
  v.name = "name"
end
```

こんな形で、`config.vm.provider` に "virtualbox" を指定して、そのブロックの中で設定を書いていく。

|||
|:----------|:--------|
|`gui`| `true` で GUI で起動|
|`name`|GUI の VirtualBox のリスト画面に出る名前|
|`customize`|[Chapter 8. VBoxManage](http://www.virtualbox.org/manual/ch08.html "Chapter 8. VBoxManage") ←これを使えるぽい。|

### `customize`

とりあえず `modifyvm` を眺めて使えそうなセッティングを2つピックアップ。（むしろその他の設定はよく分からず…）

*  --memory <memorysize>: RAM を設定する。単位は MB。
* --cpuexecutioncap <1-100>: バーチャルマシンのCPU使用率を設定する。50で設定したら、50%まで使えるようになる。ホストマシンに迷惑をかけないようにする設定。

下のような設定でいけるはず。

```rb
config.vm.provider "virtualbox" do |v|
  v.customize ["modifyvm", :id, "--cpuexecutioncap", "50", "--memory", "1024"]
end
```

`:id` は特別な変数で、バーチャルマシンに割り当てられた id に置き換わる模様。

---

例

```rb:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu1204LTS"

  config.vm.network :forwarded_port, guest: 3000, host: 3100
  config.vm.network :private_network, ip: '192.168.50.50'

  config.vm.provider "virtualbox" do |v|
    v.name = "ubuntu 12.04 LTS"
    v.customize ["modifyvm", :id, "--cpuexecutioncap", "50", "--memory", "1024"]
  end
end
```
インタラクティブミュージック作曲家にFluidSynthをざっくり紹介します

#FluidSynthとは
- リアルタイムソフトウェアシンセサイザーです。
- クロスプラットフォーム（Windows / Mac / Linux）で動作します
- SoundFont2の音源を使用することができます
- CUIのツールとしても、C言語のライブラリとしても使うことができます

つまり、このライブラリを使ってインタラクティブミュージックを作れば、音源の互換性や種類の少なさに悩まされず、簡単に配布可能なアプリを作成できるのです。

[公式サイト](http://www.fluidsynth.org/ "www.fluidsynth.org")

#インストール
パッケージ管理ツールを使っているなら、それを使うのが早いです。
そうでなければ、[ソースコード](sourceforge.net/projects/fluidsynth/files)をダウンロードしてビルドする必要があります。
ビルドには、[CMake](http://www.cmake.org/)を使います。CMakeについては、GUIがちゃんとあってそんなに難しくないので、説明は省略します。

#試してみる
インストールが完了したら、コマンドラインでFluidSynthの対話型実行モードに入ります。
Macなら `fluidsynth -a coreaudio`
Windowsなら `fluidsynth -a dsound`
などとします。
-a はサウンドの出力先を指定するオプションです。これを指定してやらないと、うまく再生できないことがままあります。

音を鳴らす前に、サウンドフォントを読み込む必要があります。サウンドフォントはネット上にたくさん転がっているので、適当なものを探してダウンロードしてください。
今回はFluidR3_GM.sf2（GM音源ですね）を使ってみようと思います。

```shell-session:
load FluidR3_GM.sf2
prog 0 0
noteon 0 64 100
noteoff 0 64
```

progでプログラムチェンジ（音色をトラックに割り当て）して、noteonで音を再生、noteoffで停止します。基本的にはMIDIのコマンドと対応しています。
`help all`と入力するとコマンド一覧が確認できます。
他にも、色々な機能がありますが、基本的にはこんなものです。

#Cのライブラリとして使う
雰囲気の分かったところで、自分のプログラムにFluidSynthを組み込む方法を紹介します。

無事にインストールが成功していれば、自分のコンピュータの中のどこかに
・静的リンクライブラリ（libfluidsynth.a または libfluidsynth.lib）
・動的リンクライブラリ（libfluidsynth.so または libfluidsynth.dylib または libfluidsynth.dll）
の2つのファイルが生成されているはずです。

この2つのファイルをリンクするように設定します。
さらに、fluidsynth.hのあるフォルダを、ヘッダの検索パスに追加します。
これで準備は万端です。

先ほどコマンドラインで実行したのとまったく同じことを実現するには、以下のようなコードになります。

```c:

#include <unistd.h>
#include <fluidsynth.h>

void main(void) {
	// initialize
	fluid_settings_t* settings = new_fluid_settings();
	fluid_settings_setstr(settings, "audio.driver", "coreaudio");
	fluid_synth_t* synth = new_fluid_synth(settings);
	fluid_audio_driver_t* audio_driver = new_fluid_audio_driver(settings, synth);

	// load soundfont
	fluid_synth_sfload(synth, "FluidR3_GM.sf2", 1);

	// make note on
	fluid_synth_program_change(synth, 0, 0);
	fluid_synth_noteon(synth, 0, 64, 100);

	// wait
	usleep(1000000);
	fluid_synth_noteoff(synth, 0, 64);

	// finalize
	delete_fuild_audio_driver(audio_driver);
	delete_fluid_synth(synth);
	delete_fluid_settings(settings);
}

```

なお、このライブラリはLGPLなので、ライセンスに注意して使用してください。

#SoundFontを作る
今までは既存のサウンドフォントを利用してきましたが、独自の音源を作ることもできます。
SoundFontはサンプラー音源なので、基本となる波形を用意していくつかのパラメータを設定する形になります。

サウンドフォントを製作するためのフリーソフトは、[Vienna SoundFont Editor](http://connect.creativelabs.com/developer/SoundFont/Forms/AllItems.aspx)が有名です。

#まとめ
FluidSynthはインタラクティブミュージックを作って配布するのに超便利。
Javaクラスローダーを自作する

# Javaクラスローダーを自作する

クラスローダーを自作するメリットですが、あまり思いつきませんでした。

-   特殊な方法でアプリケーションを配布したい。
-   特殊な方法で試験をしたい。
-   ２年くらい前に自作したわー感を出す。


## クラスローダーとは

クラスローダーは、クラスのロードを担当するオブジェクトです。ClassLoaderクラスは abstract クラスです。クラスのバイナリ名を指定すると、クラスローダーはクラスの定義を構成するデータを見つけるか生成します。一般的な方法としては、名前をファイル名に変換して、システムからその名前の「クラスファイル」を読み込みます。

<http://docs.oracle.com/javase/jp/6/api/java/lang/ClassLoader.html>より


```java:
Class.forName("oracle.jdbc.driver.OracleDriver");
```

よく見かけるこの記述は、oracle.jdbc.driver.OracleDriverというクラスを、現在のクラスを定義するクラスローダーを使ってロードしています。


## 簡単なクラスローダーを作る

指定したディレクトリをクラスパスに追加するクラスローダーを作ります。

```java:
public static ClassLoader createClassLoader(String dirname) throws java.io.IOException {
    java.net.URL[] url = new java.net.URL[1];
    java.io.File file;
    if (dirname.endsWith("/")) {
        file = new java.io.File(dirname);
    }
    else {
        // ディレクトリは最後にスラッシュが必要
        file = new java.io.File(dirname + "/");
    }
    url[0]= file.toURI().toURL();

    ClassLoader parent = ClassLoader.getSystemClassLoader();
    java.net.URLClassLoader loader = new java.net.URLClassLoader(url, parent);

    return loader;
}


/*-
 * 使い方
 * classディレクトリ配下にある test.Main クラスの main メソッドを実行する。
 */
private void foo() throws Exception {
    ClassLoader loader = createClassLoader("./class/");
    Class<?> cls = Class.forName("test.Main", true, loader);
    java.lang.reflect.Method method = cls.getMethod("main", new Class[]{String[].class});

    method.invoke(null, new Object[]{null});
}
```

今回はディレクトリ版でしたが、jarファイルやzipファイルもURLClassLoaderを使うことで簡単にクラスを読み込むことができます。


これで何がうれしいでしょうか？


## 特殊な方法でアプリケーションを配布したい

例えば、あるアプリがプラグインで拡張できる形式だったとして、プラグインがネットから自動で落とせるようになっていたら、起動時にクラスパスにないクラスを実行時に追加することができます。

例えば、社員全員が使うようなアプリの場合、メインモジュールをこの形式で実行するようにしておき、起動時にサーバに問い合わせして更新があるかを確認するようにしておけば、そのアプリをバージョンアップする場合やバグフィックスする場合にいちいち全員にファイルを配らなくても良いようになります。


## 特殊な方法で試験をしたい

モック差し替えのようなことが実現できますが、今は優れたモックがいろいろとあるので、割愛します。


## ２年くらい前に自作したわー感を出す

&#x2026;


## もうちょっとちゃんとしたクラスローダー

バイト配列を元にクラスを生成するクラスローダーです。
手を抜くため、どこかからクラス名とclass のバイト配列を事前に登録しておき、必要に応じて読み込ませるという方式にしています。

```java:
public class MyOwnClassLoader extends ClassLoader {

    private java.util.Map<String, byte[]> classMap;

    public MyOwnClassLoader() {
        classMap = new java.util.HashMap<>();
    }

    public void addClass(String className, byte[] b) {
        classMap.put(className, b);
    }

    @Override
    protected Class findClass(String name) throws ClassNotFoundException {
        byte[] b = classMap.get(name);
        if (b == null) {
            throw new ClassNotFoundException(name);
        }
        return defineClass(name, b, 0, b.length);
    }
}
```


## 制限

Java標準クラスおよびCLASSPATHにあるクラスは起動時に読み込まれているので、この方法でこれらのクラスを置き換えることはできません。
PySideのスロットを定義する際の注意

### 注意

(2018/08/25)
Qt for Python 5.11.2ではこの事象は修正済とのコメントを頂きました。そのため、以下の内容は古くなっています。

---

自分用メモ. 後でもうちょっと詳細に書くかも.

PySide(というかおそらくQt)には,GUIイベントをハンドルするための仕組みとして,「シグナル」と「スロット」という概念を持つ.

以下は,'clicked'というシグナルに,自分で定義したbutton_clickedメソッドをスロットとして結びつけている.

```python:ex1
class Hoge(QWidget):
	def __init__(self):
		super(Hoge, self).__init__()

		self.button1 = QPushButton('Button1', self)
		self.button1.clicked.connect(self.button_clicked)

	def button_clicked(self):
		sender = self.sender()
		self.window().statusBar().showMessage(sender.text() + ' was clicked')
```

'clicked'というのは文字通り,クリックイベントと結びついている.
該当するオブジェクト(上記例ではボタン)がクリックされると,結びつけたスロット(button_clicked)がコールされるという寸法だ.


で,ここからが今日少しはまった事例.
スロットとして指定したメソッド内で,self.sender()をコールすることにより,イベントの発生元オブジェクトを指定できる.
その際,スロットとして指定するメソッドがネームマングリングされている場合,self.sender()がNoneを返してしまい,発生元オブジェクトが上手く取得できなかった.

```python:ex2
class Hoge(QWidget):
	def __init__(self):
		super(Hoge, self).__init__()

		self.button1 = QPushButton('Button1', self)
		self.button1.clicked.connect(self.button_clicked)
		
		self.button2 = QPushButton('Button1', self)
		self.button2.clicked.connect(self.__button_clicked)

	# ネームマングリングしない
	def button_clicked(self):
		sender = self.sender()
		print sender.text()

	# ネームマングリングする
	def __button_clicked(self):
		sender = self.sender()
		print sender.text()
```

以下がその時の出力.

```
Button1 (Button1は発生元が取得できている)
Traceback (most recent call last): (Button2は上手くできない)
  File "sandbox/myevent.py", line 77, in __button_clicked
    print sender.text()
AttributeError: 'NoneType' object has no attribute 'text'
```

いまいち原因が追いきれていないが,ひとまずスロットに指定する場合はネームマングリングしないようにしておこう...
dmdのリンクオプションの書き方がわかった

とあるD言語のライブラリをビルドすると,libhoge.aというファイルが生成された.
もちろんこのファイルの意味は知っている.共用じゃないライブラリだ.

はて,これをリンクさせるにはどうすればよいのだろう…
gccでは, libhoge.a があるディレクトリ/aを,
-L/a
して,
そのファイルを
-lhoge
みたいな,libと拡張子を除いた名前で指定してやれば良い…
要するに,main.cをコンパイルするときにリンクしたいなら

```zsh:
% pwd
/a
% ls
main.c libhoge.a
% gcc main.c -L/a -lhoge
```

まあ色々突っ込みどころはあるが,大体こんな感じで行けたはずだ.
C言語と似通ったD言語のコンパイラ,dmdのことだ,似たような方法に違いない.

早速 man dmd を見てみる.
英語だ.日本語版を探す.見つける.
http://www.kmonos.net/alang/d/dmd-linux.html

えっと,ライブラリファイルをそのままD言語ソースファイルと同じように指定する…
あれ,出来ないな.アンリファレンスだな…

もう一度DMDのマニュアルを見ると,どうやら,dmdはリンカとしてgccを利用しているらしい…
そして,-Lはあるけど,-lはない…どういうことだ…

色々サンプルを見てみると,
dmd -L-lhoge
みたいなオプションを指定すると,リンカ役のgccに-lhogeをそのまま渡すらしい.
つまり,main.dをコンパイルしたいときに,libhoge.aをリンクしたいなら.

```zsh:
% pwd
/a
% dmd main.d libhoge.a -L-L/a -L-lhoge
```

ライブラリファイル自体を渡さなければいけない理由とかよくわかんない.でもコンパイルできたから良いや.もう寝る.
before_filterを分離してテストする方法(Rspec)

Controllerのテストを書く場合、before_filterに惑わされることが多々ありました。
そこで、before_filter用のメソッドのテストとController上のactionのテストを分離する方法です。

## 環境
* ruby: 2.0.0-p0
* rails: 4.0.0.rc1
* rspec: 2.13.1

## 事前準備

Anonymous Controllerを有効にしておきましょう。

```ruby:spec/spec_helper.rb
config.infer_base_class_for_anonymous_controllers = true
```

## 実装とテスト

```ruby:app/controllers/users_controller.rb
class UsersController < ApplicationController
  before_action :load_user
  def index
    @name = @user.name
  end

  private
  def load_user
    @user = User.first || raise("User does not exist.")
  end
end
```

```ruby:spec/controllers/users_controller_spec.rb
require 'spec_helper'

describe UsersController do

  describe "GET 'index'" do
    before do
      controller.stub(:load_user).and_return(true)
      @user = User.create :name => "hoge"
      controller.instance_variable_set(:@user, @user)
    end

    it "リクエストに成功する" do
      get :index
      response.should be_success
    end

    it "必要なデータが帰ってくる" do
      get :index
      expect(assigns[:name]).to eq("hoge")
    end
  end

  describe :load_user do
    controller do
      def index
        render :text => "ok!"
      end
    end

    it "Userがない場合にerror" do
      User.delete_all
      expect{ get :index }.to raise_error
    end

    it "Userがある場合に'ok!'がレンダリングされる" do
      @user = User.create :name => "hoge"
      get :index
      assigns[:user].should eq(@user)
      response.body.should == "ok!"
    end
  end
end
```

## ポイント

[describe "GET 'index'"]にてindexアクションのテストをし、[describe :load_user]でbefore_filterのテストをしています。

### indexアクション

stubを使ってbefore_filterで呼び出される処理を上書きしています。

```ruby
controller.stub(:load_user).and_return(true)
```

before_filterで設定していた内容を手動で与えます。

```ruby
@user = User.create :name => "hoge"
controller.instance_variable_set(:@user, @user)
```
あとは、純粋にindexメソッドをテストします。

### before_filter

Anonimous Controllerでダミーのコントローラを作成します。

```ruby
controller do
  def index
    render :text => "ok!"
  end
end
```

あとは、before_filterに引っかかってエラーやリダイレクトが発生するかやインスタンス変数に値が格納されているか等をテストします。

## まとめ

この方法を使用すれば、複数の場所で使用されているbefore_filterのテストを一箇所にまとめることができるかなと思います。

## 修正1

skip_before_filterを呼ぶより、普通にstubを使ったほうがシンプルで安全なので修正しました。

```ruby:修正前
before do
  controller.class.skip_before_filter :load_user
end
after do
  controller.class.before_filter :load_user
end
```

```ruby:修正後
before do
  controller.stub(:load_user).and_return(true)
end
```

## 修正2

instance_evalよりもinstance_variable_setを使うほうがいいですね。
インスタンス変数に設定している@userをテスト中に使用できる等の利点があります。

```ruby:修正前
controller.instance_eval do
  @user = User.create :name => "hoge"
end
```

```ruby:修正後
@user = User.create :name => "hoge"
controller.instance_variable_set(:@user, @user)
```
CLI端末で使えるグラフィカルなパフォーマンス分析ツール

## 名前

nmon （えぬもん）

## 出身地

AIX

* [IBM nmon と nmon analyser - Japan](http://www-06.ibm.com/systems/jp/power/techinfo/aix/nmon/)

## 生息地

Linuxなど

* [nmon for Linux プロジェクト日本語トップページ - SourceForge.JP](http://sourceforge.jp/projects/sfnet_nmon/)
* [nmon for Linux | Main / HomePage](http://nmon.sourceforge.net/pmwiki.php)

## 起動

    % nmon

![nmon-20130627-1.png](https://qiita-image-store.s3.amazonaws.com/0/17743/2d582da2-d09e-0287-9865-9fb09813c44f.png)

## CPU使用率

    c  # しーを押す

![nmon-20130627-2.png](https://qiita-image-store.s3.amazonaws.com/0/17743/a62d05da-3deb-176c-80fa-8f4285d3f291.png)

## メモリー状態

    m  # えむ

![nmon-20130627-3.png](https://qiita-image-store.s3.amazonaws.com/0/17743/ab452ea5-eb68-6d23-8a99-6c5222e8b85e.png)

## ディスクI/O

    d  # でー

![nmon-20130627-4.png](https://qiita-image-store.s3.amazonaws.com/0/17743/26e426b8-d05f-b3af-edd0-9d416c9904b9.png)

## トップ・プロセス（CPU多い順）

    t  # てぃー

![nmon-20130627-5.png](https://qiita-image-store.s3.amazonaws.com/0/17743/37728a8d-b3e6-0d6c-72cf-976355286df7.png)

## メモリーが邪魔ね

    m  # えむをもう一回

![nmon-20130627-6.png](https://qiita-image-store.s3.amazonaws.com/0/17743/d6def1fa-f426-6ec1-7b03-3b9ad50296bd.png)

## topをメモリー順に並べたい

    4  # よん

## ヘルプを見たい

    h  # えいち

または

    ?  # クエスちょん

![Screenshot from 2018-04-20 14-40-47.png](https://qiita-image-store.s3.amazonaws.com/0/17743/dd5a356b-b740-1f0e-eaaa-40d89958129a.png)

## 終了

    q  # きゅー

おわり。
RubyMotion + ProMotion gemでのModal Viewの"正しい"使い方


# この手法は RubyMotion version 2.4 では解決されています!

>  * Fixed a long-standing set of memory-related bugs related to lambdas.
>    Dynamic variables (shared by lambdas and calling scope) are now allocated
>    as heap memory inside the Proc data structure. Local variables are properly
>    synchronized. Proc objects are properly reclaimed by the system once they
>    are no longer used. Changes have been added to both the compiler and the
>    runtime.

この対応によって、lambda などの中でローカル変数が参照されている場合、そのlambdaの外側のローカル変数は自動的に retain されるようになったそうです。

この対応によって *なにがうれしいか？* と言うと、インスタンス変数を使ってしまうと、そのインスタンスが消滅するまでメモリが消費されてしまうことや、任意のタイミングで値をセット/リセットしなければいけなくなりますが、ローカル変数だとRubyMotionのGCが適度なタイミングで解放してくれるようになります。
そのことから、長期的に見るとメモリの消費量などリソースと開発者にやさしくなるとのことです。(watson1978談)


***

ProMotion のドキュメントにも記述されていない上に、 ProMotion での記述方法では気付きにくいと思ったので、まとめてみました。
(すでに Objective-C などでの iOS の開発になれてる人なら、落ちる原因について想像が付くと思います)

ModalView を呼び出す側が HomeScreen 、呼び出される ModalView が ModalScreen クラスとして話を進めます。

最初にgithub上のProMotionのドキュメントにも書かれていますが、この方法だと(ModalViewを何度か開いたり閉じたりしてると)アプリが落ちたりします。

```rb:home_screen.rb
class HomeScreen < ProMotion::Screen

  def open_modal
    open ModalScreen.new, modal: true
  end

end
```

```rb:modal_screen.rb
class ModalScreen < ProMotion::Screen

  # close_modal はUIButtonなどのactionで呼ぶ
  def close_modal
    close 
  end

end
```

正しくは ↓

```ruby:home_screen.rb
class HomeScreen < ProMotion::Screen

  def  open_modal
    # 一度インスタンス変数に ModalScreen を入れる
    @modal_screen = ModalScreen.new
    open @modal_screen, modal: true
  end

  # ModalScreen から dismissViewControllerAnimated:completion 経由で値を受け取れる
  def on_return args
    puts args[:value] # => :ok
  end

end
```

```rb:modal_screen.rb
class ModalScreen < ProMotion::Screen

  # parent_screen を用意しておくことで自動的に呼び出し元の screen をセットしてくれる
  attr_accessor :parent_screen

  def close_modal
    # parent_screen がセットされていると
    # close メソッド内で正しく dismissViewControllerAnimated:completion が呼ばれる
    close value: :ok
  end

end
```

一度、インスタンス変数に格納してやることで Objective-C の strong な property になります。
modal_screen = ModalScreen.new のようにローカル変数ではダメでした。
この方法で意図しないタイミングで ModalScreen のインスタンスのメモリが解放されて落ちることがなくなります。

以下、余談
下記のように書けてもいいと思うのだけれど、<del>現状は UIWindow が返ってくるようです</del> この [PR](https://github.com/clearsightstudio/ProMotion/pull/180) がmergeされたので(他の機能とconflictなどすることがなければ) version 1.0 から使えそうです

```rb:home_screen.rb
class HomeScreen < ProMotion::Screen

  def open_modal
    @modal_screen = open ModalScreen.new, modal: true # => UIWindow
  end

end
```
【Kobito要望】印刷余白設定・blockquoteの色を濃く


1. 印刷するときのページ余白を設定できるようにしてほしい
1. blockquoteの文字色を濃くしたい

最近、報告書・提案書・マニュアルなどをKobitoで書くことがあります。

印刷して提出することがあります。

印刷してもとても見栄えがよく、業務でも十分に使えるので良くできたアプリだと感じています。

印刷に使って感じたのは、

1. 1ページに印字できる情報が物足りないという課題と、
1. blockquoteの灰色が薄くて印刷すると若干見えにくいという2つの課題です。

課題1は文字サイズを小さくすることで、多少よくなりますが、余白も狭められるようになるのが希望です。


----

追記

HTMLを吐き出せるようにしてもらえるだけでも助かるかも。
ブラウザで余白設定できるものもありますし。
Windows 7でVagantを使う時はVirtual Boxのバージョンに注意

先人によると最新版を導入すると下記のメッセージで起動時に落ちる。

<pre>
INFO interface: error: There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["import", "C:/Users/Ravi/.vagrant.d/boxes/precise32/virtualbox/box.ovf"]

Stderr: 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Interpreting C:\Users\Ravi\.vagrant.d\boxes\precise32\virtualbox\box.ovf...
OK.
0%...
Progress object failure: RPC_S_SERVER_UNAVAILABLE 0x800706BA
</pre>

Virtual Boxのバージョンを落とし下記の組み合わせでは動作したとのこと。

* Vagrant 1.2.2
* VirtualBox-4.2.8-83876-Win.exe

参考
http://comments.gmane.org/gmane.comp.tools.vagrant/216
Web Storage を用いたユーザーデータの操作 - Firefox OS アプリプログラミング


## 概要

アプリケーションを作成していく上で、ユーザーID や各種設定といった小さなデータを、永続的または非永続的に保持しておく必要がしばしば発生します。このような要件を、Firefox OS では、Web Storage を用いて実現することができます。

Web Storage は、

* sessionStorage
* localStorage

の二つのオブジェクトとして実装されています。前者は、アプリが終了するまで、後者はアプリが終了しても永続的にデータを保持することができます。Web Storage には同一生成元ポリシーが適用され、異なるアプリ間でデータを共有することはできません、たぶん（未確認）

sessionStorage と localStorage には、どちらも以下のほぼ同様なメソッドが用意されています。

1. getItem('key'); //  key キーの値を取得
2. setItem('key', value); // key キーに value 値をセット
3. removeItem('key') // キー・値の組を削除
4. clear(); // 全てのキー・値の組を削除

## 実装

ユーザーにユーザー名を入力してもらい、ユーザー名を保存しておくようなアプリを実装してみます。manifest.webapp は適当に作ります。Web Storage を使うための特別な権限設定は必要ありません。

このテストアプリでは、ユーザー名が設定されていなければ、ユーザー名の入力ダイアログを出力し、ユーザー名を入力してもらいます。ユーザー名が既に設定されていれば、そのユーザー名を出力し、ユーザー名の設定を削除します。普通こんなケースは無いでしょうが、まぁテストなので。

これを実装したのが、以下の HTML ファイルです。

```html:web_storage.html
<html>
<head>
    <meta charset="utf-8">
    <title>Web Storage Test Page</title>
</head>
<body>
<script>
    const USER_NAME_KEY = 'user_name_key';

    var userName = localStorage.getItem(USER_NAME_KEY);
    if (userName !== null) {
        alert(userName);
        // delete user name for localStorage test.
        localStorage.removeItem(USER_NAME_KEY);
    } else {
        var newUserName = prompt('Please Enter Username', '');
        // set use name to localStorage.
        localStorage.setItem(USER_NAME_KEY, newUserName);
    }
</script>
</body>
</html>
```

今回は localStorage を用いましたが、ここを sessionStorage に読み替えても同様に動きます。

スクリーンショット。

![inputeusername.png](https://qiita-image-store.s3.amazonaws.com/0/322/ff64ace2-b322-60fb-aa2c-c0a83eb1b83c.png "inputeusername.png")

![showusername.png](https://qiita-image-store.s3.amazonaws.com/0/322/a5cd886e-40c1-3493-0f4b-103ada66ace8.png "showusername.png")
D3.js を使ってcsvからテーブルを出力する


```js:
var table = d3.select('body').append('table'); //tableタグ追加
var thead = table.append('thead'); //theadタグ追加
var tbody = table.append('tbody'); //tbodyタグ追加

//csv読み込み
d3.csv('hoge.csv', function(csv){
    var headerKyes = d3.map(csv[0]).keys(); //ヘッダー用にkeyを取得
    
    thead.append('tr')    //trタグ追加
        .selectAll('th') 
        .data(headerKyes) 
        .enter()
        .append('th')    //thタグ追加
        .text(function(key){return key});
    
    tbody.selectAll('tr')
        .data(csv)
        .enter()
        .append('tr')    //trタグ追加
            .selectAll('td')
            .data(function (row) { 
                      return d3.entries(row); //rowオブジェクトを配列へ変換
            }) 
            .enter()
            .append('td')    //tdタグ追加   
            .text(function(d){ return d.value })
        
})
```

[example](http://jsdo.it/_shimizu/vKbO)
ちょっとしたことがGroovy「ある値まで一定間隔のRangeのリストを作りたい」

## ちょっとしたことがGroovy「ある値まで一定間隔のRangeのリストを作りたい」

```groovy:getRanges.groovy
def getSteps = {start=1,max,step=1000 ->
  if(max <= start + step) return [[start..max]]
  def rs = (start..max).step(step).inject([]) {a,c -> (c>start) && a << [ ((a!=[])?a.last().to[0]+1:start)..c-1];a}
  (rs.last().to[0] != max) && rs << [rs.last().to[0]+1..max];rs
}
println"""
getSteps(max=10020) = ${getSteps(max=10020)}
"""

println"""
getSteps(100,1000) = ${getSteps(100,1000)}
"""

println"""
getSteps(100,1015,10) = ${getSteps(100,1015,10)}
"""
```

巨大なテーブルの処理を小さなトランザクションに分けて実行したいときとか。

亜種でこんなの。

```groovy:
def getRangeMaps = {start=1,max,step=1000 ->
  if(max <= start + step) return [[start:start,end:max]]
  def rs = (start..max).step(step).inject([]) {a,c -> (c>start) && a << [ start:((a!=[])?a.last().end+1:start),end:c-1];a}
  (rs.last().end != max) && rs << [start:rs.last().end+1,end:max];rs
}
```
Ruby 2.0で必要なくなったmagic commentをまとめて消したい！

Ruby 2.0からデフォルトのエンコーディングが`US-ASCII`から`UTF-8`に変わりました(参照: http://bugs.ruby-lang.org/issues/6679)

ということで、必要のなくなったmagic commentをディレクトリ下の`.rb`ファイルから一括削除してみましょう。

```console
$ find . -type f -name '*.rb' -print0 | xargs -0 sed -i '' '/^#.*coding.*[uU][tT][fF]\-8/d'
```

ついでにファイルの先頭にある空行もまとめて削除。

```console
$ find . -type f -name '*.rb' -print0 | xargs -0 -n 1 sed -i '' '/./,$!d'
```

スッキリ！！
Padrino と Ruby 1.8 サポートとかその辺りのメモ

https://github.com/padrino/padrino-framework/issues/1323

* ActiveSupport 4.0 が出た（もちろん、ActiveRecordも :four: である）
* ActiveSupport 4 は Ruby 1.9 以降しかサポートしない
* アップグレードするとPadrinoもRuby 1.9しかサポートできなくなるよね

どうするの、については意見があるようで

* 1.0 前にはサポートを落としたいけど、Sinatraに追従すべきでは？（by nesquena）

と言っているんだけれど、流れとしてはもう次のバージョンからでよくね？ と。特に、

* 1.8.7のセキュリティFIXブランチをメンテするリソースが我々には無いよね（by skade）
* もう 1.9 スタイルのハッシュ書いてるよ！HAHA！（by サンフランシスコ在住のイタリア人）

でもまあ、次のバージョンが 0.12.0 なのか 0.11.3 なのかはよく分からない。

個人的に @wtnabe@github さんの意見

* https://twitter.com/wtnabe/status/350168349650591745

は一理あって一理ないというか、別に「1.8サポートは0.11.2まで」という情報が十分シェアされていればGemfileは書けるんじゃないかなあと思うので。マーケティング的には「0.12から落としますよ！」というのが分かりやすいかもしれないし、奇麗だと言われればそうだが、あまり強いモチベーションは見当たらない。

`<~ 0.11.0` が `<~ 0.11.0, <= 0.11.2` になる、と言われればそれだけかなあと。

何より、リソースが無いのに「0.11.3のセキュリティリリースマダー」ってなるのを避けたいんじゃないかと思われる。つまり、まあ、ブランチメンテナにどなたか手を挙げれば……。

あと個人的に、 kaminari はすでにAS/AR 4.0対応が済んでいる( https://github.com/amatsuda/kaminari/commit/96e2d751733bf7fe7e2297a8e9bbe811f83d0da9 )し、Padrinoの方でも対応をすると小さな変更で再び同じプロジェクトで使えるようになる（現状、Sinatra edgeとactionpack 3.0とで依存するrackのバージョンの問題があり、難しい）はずなので、何だろう、はい、パッチなどを書いたりできれば良いですね……

あと、 Sinatra はリリースポリシーかなりかちっとしている印象を受ける（rkhのワンマンで行けるのはその辺りで有利に働いていそうである）。こういう点見習えると本当は理想的なのだろうが。

* http://rkh.im/sinatra-1.4 # 最後の方
Debianのパッケージアップデート後にMoinMoinがブートしなくなったので直した

完全にチラシの裏になることをお許しください。自分用メモを書くWikiが壊れた時のメモを、そのWiki自体に書いといても次回参照出来ないのです！

さて、MoinMoin というのはPythonで書かれたWikiのことです。

先日、Debianをアップデートしたら wiki の当該ページで503が出るようになりました。そこそこ一般性のありそうな内容ではあるので、メモっときます。

Debian wheezy で debian_version は 7.1。2013-06-27時点での作業記録ですので、後々の人はこのドキュメントをそういう視点で見てください。

# エラー、1つ目。write パーミッションが剥がれる。

ログはこちら

    [Thu Jun 27 14:54:34 2013] [error] IOError: [Errno 13] Permission denied: '/usr/share/moin/data/event-log'

これは私のミスとも言えるのかも。/usr/share/moin 下にデータを全部置くよう設定を書いておいた状態で、おそらくはパッケージのアップデート中に当該ファイルのパーミッションが変わってしまったんでしょう。実際、所有者が (www-dataではなく) root:root になっていました。

＃ 真面目にやるなら、具体的に何のアップデートパスでそうなったのか知るべきですが、ちょっと置いておきます。言い訳として、パーミッションの弱い方向にではなく安全方向に倒れていたので、まぁこれは悪意のある何かではないと期待してます。確証はない。

MoinMoinは適切に設定するなら、 /opt 下などに(moinの) data/ ディレクトリ等を置いておくのが正しいと思われます。下記のサイトに記載されている感じで設定しなおすことにしました。data/, underlay/ の移動が重要。ちょっと古いので、色々中身を理解しながらですが……

http://codeghar.wordpress.com/2010/05/17/install-moinmoin-in-debian/

上記の設定では、cgi なファイルを介してMoinMoin を実行することを前提にしてますが、現在の設定では wsgi を使うのが普通ですので、cgi をコピるあたりの説明については無視します。wsgiって何。

なお、後述しますが、上記のサイトの説明の通りに /opt/wiki 下に wikiconfig.py 等を置くのもやめて /etc/moin に静的な設定ファイルを置いて設定ファイルをシステム全体で一本化しておくのがDebian流儀っぽいです。動的なファイルだけ /opt 下に置きましょう。

あと、パーミッションに関連する変更は忘れないように。/opt/wiki 配下のデータは概ね www-dataからは読めて書ける必要があります。

＃ 他のセキュリティ機構 (AppArmor, SELinux) が有効になってたら話はさらに面倒ですね

# エラー、2つ目

    [Thu Jun 27 15:27:27 2013] [error] [client 142.4.213.26]   File "\xe3\x83\x95\xe3\x83\xad\xe3\x83\xb3\xe3\x83\x88\xe3\x83\x9a\xe3\x83\xbc\xe3\x82\xb8", line 2, in <module>
    [Thu Jun 27 15:27:27 2013] [error] [client 142.4.213.26] TypeError: 'dict' object is not callable

怪しい文字列は UTF-8 で「フロントページ」のことです。なんで dict に対して exec しかけんだこの子。

これは、エラーメッセージの詳細はどうでもよく、どうやらPythonのバージョンアップ時に結果としてMoinMoin 側で発生する問題らしいです。

http://moinmo.in/MoinMoinBugs/ExceptionRaisedAtPageLoading

対策は moin コマンドで対象モジュールのキャッシュをクリアすることです。以下のサイトの通り。

http://moinmo.in/HowTo/BeginnersLinux

    moin --config-dir=/var/www/wiki --wiki-url=wiki.example.com/XXX maint cleancache

今回は /opt/wiki 下を config-dir の対象にすれば良いです。

なお、 moin コマンドは、暗黙にMoinMoinの各種 設定ファイル (wikiconfig.py, farmconfig.pyとか) が /etc/moin 下にあることを前提にしてます。

    > cat `which moin`
    #! /usr/bin/python
    import sys
    sys.path.insert(0, '/etc/moin')
    from MoinMoin.script.moin import run
    run()

/opt/wiki 下に wikiconfig.py とかを置いておいても /etc/moin 下の設定ファイルを読み込んでエラーを出しますので、静的な設定ファイルを /etc/moin/ 下に読み込み専用の設定ファイルを全部置くか、symlink等で対策を取るかしたほうが良い気がします。

もしかすると、パッケージアップデート時に /etc/moin 下の設定ファイルを元に色々やった結果として上のような問題が発生した可能性もありますなぁ。
Proxy利用時の新規プロジェクト作成エラーの回避方法（Mac）

Proxy利用時にTitaniumStudioで新規プロジェクトを作成しようとすると、
以下のようなエラーが出る。

[ERROR] Missing required option "--username"
[ERROR] Missing required option "--password"

どうも、titanium cliを使用してプロジェクトを作ろうとしているが
titanium cli自体にproxyの設定がされていない為に起こるらしい。

回避するにはtitanium cli自体にproxyの設定をしてあげるとよいみたいなので、
ターミナルで以下のコマンドを実行。

/usr/local/bin/titanium config cli.httpProxyServer http:/[プロキシサーバ]:[ポート]


これで、新規プロジェクトが作れるようになります。
ChromeのDevToolsで画像をbase64エンコードしちゃう方法

画像を文字列にしてリクエストを減らしたりするアレことbase64。

普段はコマンドラインのツールとかで変換してるんですがChromeのDevToolsでかなり手軽にできたのでメモ。

```html:
<img src="qiita.png">
<img src="kobito.png">
```

### htmlで画像を読み込む
ブラウザで開く
### DevToolsを開いてリロード
ResourcesパネルのImagesに画像があるのを確認

![スクリーン01.png](https://qiita-image-store.s3.amazonaws.com/0/17969/af4f4e6c-1cbb-cf5b-28a7-798afe02c394.png)

### 右側に表示されてる画像を新しいタブで開くようにドラッグ

![スクリーン02.png](https://qiita-image-store.s3.amazonaws.com/0/17969/9d41b65b-4be8-322f-f467-d36c16dde13c.png)

↓

![スクリーン03.png](https://qiita-image-store.s3.amazonaws.com/0/17969/8fb8d9f4-8b18-1580-06ad-268523a7a1f7.png)

ヽ(｀▽´)/

アドレスコピーして使える。

DevTools側の画像はbase64変換して表示してるのかーという豆知識もさりげなくゲット。

※ サイズがある程度を超えるとアドレスバーに表示できなくなるので注意

## いちいちタブで開くのめんどくさい人向け (サイズの問題も回避できる)

### 左下のボタンを押してDevToolsのウィンドウを切り離す
(※長押しして選択しないと切り離せない場合もある)

![スクリーン04.png](https://qiita-image-store.s3.amazonaws.com/0/17969/49b6ed46-737b-a9d1-83a7-67255f633020.png)

### DevToolsにフォーカスして cmd(ctrl)+option(shift)+i でDevToolsのDevToolsをひらく

DevToolsのDevToolsを開いてResourcesパネルで画像を見ると…

![スクリーン05.png](https://qiita-image-store.s3.amazonaws.com/0/17969/3b3982de-8c59-0087-e0a8-50fe857170a8.png)

URLのとこを右クリックしてリンクのコピーで使える。

ヽ(｀▽´)/

DevToolsすごい
Amazon SESを使った同報メールの送信

たとえば、[パーミッション](http://www.exbuzzwords.com/static/keyword_2170.html) を取得したメールアドレスのリストが1,000件あり、メールマガジンを一斉に送信したいが、配信時期が不定期だったり、用途限定のパーミッションだったりで、メールマガジンの配信スタンドを利用するには適さないケースもありますよね。(価格も意外とバカになりませんし。)

また、Gmailなどのメールサービスや、自社のメールサーバを使った配信も、配信上限の問題や、メールが迷惑メールボックスに入ってしまったりといった問題が生じてしまいます。

そこで、[Amazon SES (Amazon Simple Email Service)](http://aws.amazon.com/jp/ses/) を使って、大量のメール配信をWindowsのPCから簡単にできる方法をご紹介したいと思います。

----

Amazon SESのコンソールで、まずは「[送信者の検証](http://aws.amazon.com/jp/console/#ses)」を行って、送信元メールアドレスを登録します。

次に、SMTP経由でメールを送信できるよう[IAMユーザーを作成](http://dev.classmethod.jp/cloud/amazon-ses-smtp/)します。

これで、Amazon SESを使用する用意ができました。

----

次は配信のためのソフトウェアをインストールします。私は、[Mail Distributor](http://www.woodensoldier.info/soft/md.htm)を使っています。

同ソフトをインストールし、SMTP設定をします。

「SMTPサーバ」欄には、コンソールの"SMTP Settings"に記載されているServer Nameを記述します。 ( 例 : email-smtp.us-east-1.amazonaws.com )

「ポート」欄には、465を指定してください。なぜかほかのポートではうまくいきませんでした。

「SMTP over SSLを使用する」のチェックボックスにチェックをいれます。

「送信元のアドレス」欄には Verified Senders に登録済みのものを使用してください。

「SMTP AUTH認証を使用する」のチェックボックスにチェックをいれます。
「ユーザ名」と「パスワード」には先ほど作成したIAMユーザのusernameとpasswordを入力しましょう。

これで準備完了です。あとは、本文を作成し、アドレス帳にメールアドレスのリストをインポートして、送信しましょう。

----

[送信されるメールをDKIMで認証](http://frmmpgit.blog.fc2.com/blog-entry-135.html) してあげれば、送信されるメールの信頼性を向上させることもできます。

Amazon SESは、申し込み当初はSandboxモードになっており、送信先や送信回数が限定されている状態なので、実際の配信のまえに、[プロダクション環境への移動](http://aws.amazon.com/jp/ses/faqs/#10) が必要になります。

また、Amazon SESは[配信数に応じた従量課金](http://aws.amazon.com/jp/ses/#pricing)です。1,000通当たり$0.10程度なので、非常に低コストで配信することができます。
プロジェクト内にライブラリのディレクトリを作ってリポジトリとして使う設定

mavenのRepositoryに登録されていないライブラリをローカルに配置して使う方法。

1. プロジェクト内にライブラリを登録するディレクトリを作成する。
2. リポジトリ配下に、「 localreponame\\com\\vendor\\libname\\1.0.0 」というように通常のリポジトリと同じ構成でディレクトリを切る。
3. ディレクトリ内に*.pomや*.sha1などの必要なファイルを配置する。
4. pmm.xmlのリポジトリ定義に以下のように設定追加

***
	<repositories>
		<repository>
			<id>local</id>
			<url>file:${basedir}/m2repo</url>
		</repository>
	</repositories>

***
要は<url>で「file:${basedir}/リポジトリ名」を指定すればいいだけっす。
ちょっとしたことがGroovy 「リストの文字列表現で要素に任意の引用符つけたい」

## テキストのリストに任意の引用符つけたい。

```groovy:quateToString()
List.metaClass.toString = { squate,equate=null ->
  if(equate==null) equate = squate
  delegate.collect {"${squate}${it}${equate}"}
}
def l = ["a","b","c"];
println l.toString()
println l.toString("'")
```

常にこれでいいってわけではないけど。

追記：
シングルクオート以外にもこんなのとか行けます。

```
class cntP{
  def i=0;
  @Override
  String toString(){
    /<p class="num_${i++}">/
  }
}

println l.toString(new cntP(),"</p>")
```

出力こんなです。

```
[<p class="num_0">a</p>, <p class="num_1">b</p>, <p class="num_2">c</p>]
```
d3jsのグラフに対して縁取りを行いたい。


```javascript:
.style("stroke" ,"縁取りする色").style("stroke-width", "幅”);
```

[SVG Paths and D3.js | DashingD3js.com](http://www.dashingd3js.com/svg-paths-and-d3js)

でいける感じ。
Ruby on Rails 4への移行でハマったポイント

RoR4がリリースされたので、手持ちのプロジェクトを4.0.0にアップデートしてみた。
具体的な移行方法は、既にウェブ上に記事が沢山あるので実際にハマった点だけを記す。

## 簡単にまとめると
1. まず3.2系の最新版で動くようにする -> Ruby 2.0で動かす -> Rails 4へのアップデート という手順をしっかりやったほうがいい。
2. herokuで動かすにはいくつか設定が必要。ローカルでRubyとRailsのアップデートをしてから、最後にherokuにdeployしてあれ動かない、となると対応が面倒くさいので、ワンステップずつdeployして動作確認していったほうがいい。
3. 他は割と公式ガイド通りでスムーズ。

## まずは3.2系の最新版で動くようにする。
古いRailsでは、一見Ruby 2.0で動作しているように見えても部分的におかしな挙動をすることがある。これはアップデートの過程での動作確認を混乱させることになる。(そのせいで最初結構ハマった)

 **まず3.2系の最新版にアップデートを行っておく** 。(2013年6月現在`3.2.13`で確認)

また、必要に応じて他のgemも最新版にしておいたほうがよい。

## Ruby 2.0をインストール
開発マシンにRuby2.0をrvmでインストール。

一部マシンではopensslのバージョンが古かったため、途中でエラーがおきたが、**brewで1.0.1eをインストール** して解決。

**heroku上にRuby 2.0を使う場合にはGemfileに`ruby "2.0.0"`を追加すればOK。**

## Rails 4へアップデート
* いくつか古いgemがrails 4で動かなかったので、先にアップデートした。`delayed_job`、`lazy_high_charts`等。

## 実装の変更

一部実装をRoR 4用に変更する。
だいたい問題なかったが、下記の点で少しハマった。

### herokuでCSS / JSが動かない
Production環境でアセット(CSS / JS)の配信が行われなくなった。
`config.serve_static_assets = true`にして解決。

### ajaxが動かない
jQueryのバージョンアップにともない、`.live`が使えなくなっていた。
`.on`へ置き換える形で実装変更。

参考: http://myjquery.blog.fc2.com/blog-entry-14.html#removed-3

## 参考
* http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html
* http://myjquery.blog.fc2.com/blog-entry-14.html#removed-3
* https://devcenter.heroku.com/articles/rails4
Location

バグだらけの RFC 2616 がいつまで経っても改訂されないので勘違いする人があとをたたないけど、 Location: ヘッダーに素片識別子が入っていても何ら問題ない。相対 URL であってもよい。

http://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics#section-7.1.2
PHPでsession_nameが日本語だとセッションIDが保持されない時もある件

ハマったのでメモ。
ちょっと特殊なサーバでsession_start()してsession_idを確認してみると・・・
毎回変わっている。。他のサーバでは問題ないのに。
URLにセッションIDは流れていないので一応設定を確認してみると
session.use_trans_sidが1だった。
これのせいかと疑って、
ini_set("session.use_trans_sid", 0);
してみるも状況は一変せず。

何故だろう・・・cookieの情報を眺めてみる事に。
そこで気になったのがsession_name。
む・・・URLエンコードされている。

そうだ、日本語になってた。
しかしページ遷移後も変わってないんだから問題ないだろうなーと思いつつも一応アルファベットのみに書き換えてみる。
すると、おぉぉ直ったじゃねーか！！！サーバによって日本語では駄目なんだぁぁぁ！

更に追加でハマったのが.（ドット）も使ったら駄目だった。
hogehoge.comみたいなホスト名を使おうと思ったら保持されず。。普通に設定しましょう、普通に。

というお話。めでたし。

念のためsession部分のphpinfoを晒します
![phpinfo](https://qiita-image-store.s3.amazonaws.com/0/15518/44c2e592-4baf-d7f7-4722-2a01d2d3ced1.png)
GoogleChrome でheader情報を確認する方法

header 情報を見たくて、ブラウザでさくっと見れないかと思って調べたメモ。
やはりGoogle はすてきだ。chrome の機能であった。URLに以下の記述を入力。

> chrome://net-internals/

Events メニューで見れた。便利。
Map 初期化

```java:InitializeMapSample.java
import java.util.Map;
import java.util.HashMap;
class InitializeMapSample {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>() {
            {put("foo", "fooVal");}
            {put("bar", "barVal");}
        };
        System.out.println(map.get("foo"));  
        System.out.println(map.get("bar"));  
    }
}
```

このコードよくわからなかったのだけど、
http://www.coderanch.com/t/386333/java/java/HashMap-Construction-initial-values
で解説されていた。
匿名クラスと初期化ブロックを使っている。
つまり、HashMap を継承したクラスを作って、初期化ブロックを定義している。
もちろん初期化ブロックをひとつにまとめてもよい。

```java:
new HashMap<String, String>() {
    {
        put("foo", "fooVal");
        put("bar", "barVal");
    }
};
```
特定のポート番号をLISTENしているプロセスが知りたい

とあるポート番号(ここでは11211)がLISTENされているかどうかはnetstatで確認できる。

```zsh:
$ netstat -ant4 | grep 11211
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN
$
```

ただ、これだとこのポート番号を使用しているプロセスが何なのかはわからない。プロセスも特定するにはlsofを使う。

```zsh:
# lsof -i4TCP:11211
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
memcached 32583 root   27u  IPv4  71897      0t0  TCP *:11211 (LISTEN)
#
```

## 追記

netstatでも「-p」オプションを使えば可能(コメント参照)
Dell Vostro 3360 に Ubuntu12.04 を入れてみた

最近、Pythonの勉強を本当に必要に迫られてます。

そこで、Ubuntu 12.04でPythonを学ぼうと思い、
Dell Vosstro 3360でデュアルブートしているしている
Ubuntuを起動する頻度が高いです。

Ubuntu 12.04 English を入れてますが、12.04はドライバとかを自分でいれないといけない(?)

自分の覚え書きのために書きます。

# ネットワークインターフェースのドライバ

どのNICが入っているか調べる

` lspci -vv `

Vostro 3360 のNICは Atheros AR8161 みたいで新しいので12.04には標準でドライバが無いみたい

> The AR8161 is a very new combined Ethernet/Bluetooth controller and its driver alx is in the testing/QA process, so it's not in the kernel yet.


alxを入れる

``
sudo apt-get install build-essential linux-headers-generic linux-headers-`uname -r`
wget -O- http://linuxwireless.org/download/compat-wireless-2.6/compat-wireless-2012-07-03-pc.tar.bz2 | tar -xj
cd compat-wireless-2012-07-03-pc
./scripts/driver-select alx
make 
sudo make install
``

再起動後下記を実行
`sudo modprobe alx`

NICが有効になる

※参考サイト
_http://askubuntu.com/questions/165192/how-do-i-install-drivers-for-the-atheros-ar8161-ethernet-controller_

# サウンドカード(イヤホン)

作業するときはゾーンに入るために、イヤホン使います

スピーカーは有効なのにイヤホンは認識してないよ

ってことでこれも有効にします

ヘッドフォンジャックに反応するようにconfファイルを書き換える

` gksudo gedit /etc/modprobe.d/alsa-base.conf `


これを書き加える
__options snd-hda-intel model=auto position_fix=0__

音出た!

※参考サイト
_http://blog.goo.ne.jp/gleaning/e/559bf26c37661c9ad39bb6167d96d7c9_

# IME(Mozc)を入れる

これはすごく簡単

* 方法1 - Ubuntu Software center
 
Ubuntu Software centerで __Mozc__ と検索 __install__ を押すだけ


* 方法2 - apt-getを使う

` sudo apt-get install ibus-mozc `


うえの方法でmozcをインストールしたら、ibusの設定しないといけない



※参考サイト
_http://linux10.blog.fc2.com/blog-entry-11.html_

なんか日本医師会のサイトもあった(手順は同じ)
_http://www.orca.med.or.jp/receipt/download/precise/mozc.html_



# 最後に
やっぱりpythonに抵抗がある

型がないのはすごく戸惑う

クロシージャッ!!!!


_alxを入れる_ の下のところのインラインなんとかならんかなぁ
あなたは8つの同じサイズのボールを持っています(C)

http://d.hatena.ne.jp/torazuka/20130626/balls
http://qiita.com/Nabetani/items/62135c9b556f7cb9e07d

再帰を使ってシンプルに書けないかなと思ったのでやってみました。

```c:
#include <stdio.h>

int sum(int *x, int n)
{
    int s, i;

    s = 0;
    for (i = 0; i < n; i++)
        s += x[i];

    return s;
}

int solve(int *balls, int n)
{
    int d, m;

    if (n == 1)
        return 0;

    m = (n > 2) ? (n - 1) >> 1 : 1;
    d = sum(balls, m) - sum(balls + m, m);
    if (d > 0)
        return solve(balls, m);
    else if (d < 0)
        return solve(balls + m, m) + m;
    else
        return solve(balls + 2 * m, n - 2 * m) + 2 * m;
}

void test(int e, int n)
{
    int balls[n];
    int i, r;

    for (i = 0; i < n; i++)
        balls[i] = (i == e) ? 1 : 0;

    r = solve(balls, n);

    printf("n:%d e:%d r:%d ==> %s\n", n, e, r, r == e ? "ok" : "ng");
}

int main(void)
{
    int n, i;

    for (n = 1; n <= 20; n++)
        for (i = 0; i < n; i++)
            test(i, n);

    return 0;
}
```
PHPでメソッドが定義される順番についての検証

## 検証事項

* 親クラスと子クラスではどちらが先に定義されるか
* 親クラスで読み込んだトレイトと子クラスで読み込んだトレイトではどちらが先に定義されるか
* 同一クラス内で先に読み込んだトレイトとあとに読み込んだトレイトではどちらが先に定義されるか


## 検証コード

```php:
<?php

trait Ta { function a() {} }

trait Tb { function b() {} }

trait Tc { function c() {} }

class Foo 
{
    use Ta; 

    function hoge() {}
}

class Bar extends Foo 
{
    use Tc; 

    function fuga() {}

    use Tb; 

    function piyo() {}
}

$obj = new Bar();
var_dump(PHP_VERSION);
var_dump(get_class_methods($obj));
```

### 実行結果

```
% php test.php 
string(17) "5.4.15-1~dotdeb.2"
array(6) {
  [0] =>
  string(4) "fuga"
  [1] =>
  string(4) "piyo"
  [2] =>
  string(4) "hoge"
  [3] =>
  string(1) "a"
  [4] =>
  string(1) "c"
  [5] =>
  string(1) "b"
}
```

## 結論

(前提: 少なくとも PHP 5.4.15 では)

* 子クラスのメソッドの方が、親クラスのメソッドよりも先に定義される
* クラスに直接定義したメソッドの方が、トレイトで読み込んだメソッドよりも先に定義される
* 親クラスで読み込んだトレイトのメソッドの方が、子クラスで読み込んだトレイトのメソッドよりも先に定義される
* 上部に書いたメソッドの方が、下部に書いたメソッドよりも先に定義される

----

パターンに一致するメソッドをすべて実行するようにして、トレイトを読み込むだけで実行時の挙動を拡張できるような実装を考えたんだけど、読み込む順番どうなるんだろうと思って検証してみました。

結果的に、順番を考慮しなきゃならないならそういうことはやっちゃいけなさそうな感じがしました。
cssで一部だけを角丸にする。


４つとも角丸にするのではなくて、一部(右上のみ)に適応させたい。

[ほんっとにはじめてのHTML5 [18-1] CSS3で、ボックス要素を角丸にしよう（border-radius）](http://honttoni.blog74.fc2.com/blog-entry-70.html)

```css3:
-webkit-border-radius: 10px 20px 30px 40px / 10px 20px 30px 40px;
-moz-border-radius: 10px 20px 30px 40px / 10px 20px 30px 40px;
border-radius: 10px 20px 30px 40px / 10px 20px 30px 40px;
```
水平方向の 左上、右上、右下、左下 / 垂直方向の 左上、右上、右下、左下

の順で指定するらしい。

指定されたpxを半径とした円の円周を角丸の大きさとして考えてるみたい。