OmniAICreator/Qiita-1.07M huggingface dataset:
Punycodeのjavascript実装と変換テスト

# Punycodeのjavascript実装と変換テスト

## 概要

Punycode変換をjavascriptで実装した

* punycode.js https://github.com/wealandwoe/punicode.js

```js
var encoded = Punycode.encode("ぴゅにこーど");//=> "28j1be9azfq9a"
var decoded = Punycode.decode(encoded);
decoded=="ぴゅにこーど" //=> true
encoded = Punycode.encode("Punycode変換・逆変換");  //=> "Punycode-wg5gy946aba2534aca0149m"
```

以下を参考にした

* Punycode - Wikipedia http://ja.wikipedia.org/wiki/Punycode
* rfc3492日本語訳 http://www.jdna.jp/survey/rfc/rfc3492j.html
* 日本語JPドメイン名のPunycode変換・逆変換 http://punycode.jp/
* Adam M. Costello - Internationalized Domain Names (IDN) http://www.nicemice.net/idn/

最後、Punycodeの発案者のサイトに最新のpunycode.cのサンプルがあり大いに参考にした。 RFC3492日本語訳のcのコードには抜けがあるので注意。


##実験

Punycodeをjavascriptに移植してみて以下がわかった

* 国際化URLの為の仕様だとおもっていたがURLには使用できない文字でもエンコード可能
* とはいえ、ASCII(0x80以下)はスルーするので文字以外には向かないかもしれない
* ASCIIにエスケープしているがバイトサイズで比較しても元と同じかより小さくなることも
* 処理は複雑で割り算を多用していることもあり時間がかかる
* 国際化URLとして使うには使用禁止文字、大文字小文字の同一化、prefix(xn--)追加など工夫が必要

Punycode内部で利用しているBootstringというアルゴリズムを応用すれば 36字(A-Z0-9)以上の文字種でエンコードが可能になる

> Punycodeは、Bootstringと呼ばれる、より一般的なアルゴリズムの適用事例
> (instance)である。このアルゴリズムは、より大きな文字集合に属する
> コードポイントの並びを、小さな"基本(basic)"コードポイントの集合に
> 含まれるコードポイントの並びによって一意に表現可能にするものである。
> Punycodeは、Bootstringの特定のパラメーター値をIDNA向けに適切に設定した
> ものである。

試しにBase64([A-Za-z0-9+/])とBase85([0-9A-Za-z!#$%&()*+-;<=>?@^_`{|}~])で作成してみた

```js
var str = "Punycodeのjavascript実装と変換テスト";
Punycode.encode(str,Punycode.Params);        //=> "Punycodejavascript-ei4qnd68efitb5631q2rna9p4c6j0o"
Punycode.encode(str,Punycode.Base64Params);  //=> "Punycodejavascript-8s6A4Bu3AxEvA7/uVqKE/dU8izB"
Punycode.encode(str,Punycode.Base85Params);  //=> "Punycodejavascript.I2Xg1|lv3l0(%)D~a2g`Dd(j"

// ecl.js の JCT11280(JIS-UNICODE変換テーブル)でテスト
JCT11280.length;  //=> 11280 (chars)
Utils.ByteArray.fromText(JCT11280).length;  //=> 33718 (bytes)
Punycode.encode(JCT11280).length;  //=> 31455 (bytes) 93.3%
Punycode.encode(JCT11280,Punycode.Base64Params).length;  //=> 29584 (bytes) 87.7%
Punycode.encode(JCT11280,Punycode.Base85Params).length;  //=> 28565 (bytes) 84.7%
```

パラメータのせいもあるかもしれないが、文字種が増えても思った以上には縮小されなかった。 36種類→85種類で236%の増加だが、縮小率は93.3%→84.7%で10%程しか差がない。

## 考察

Bootstringの仕組みは面白く、変換後のサイズも小さいが処理が遅いのが気になる。
GroovyのMOP

##はじめに

Groovyのすべてのクラスは暗黙的にgroovy.lang.GroovyObjectインタフェースを実装していて、GroovyObjectインタフェースにはMOP用のメソッドが定義されてます。

実装も、とてもシンプルです。
invokeMothod
set/getProperty
set/getMetaClass
→groovy.lang.MetaClass imprements MetaObject

## かいてみる

```groovy:mop.groovy
package co.jp.e2info.groovy
 
String.metaClass.define {
	hello { return "hello " + delegate }
	bye { return "bye " + delegate }
}
 
println "world".hello()
println "world".bye()
 
String.metaClass.and = {return delegate + it}
 
println "xxx".and("yyy")
 
/*
hello world
bye world
xxxyyy
*/
 
// groovy.lang.GroovyObject#invokeMethod 
class InvokeMethodSample{
	def invokeMethod(String method, Object params) {
		println method
		if(params != null){
			params.each{ println it }
		}
	}
	def getProperty(String property){
		println property
	}
}
 
def im1 = new InvokeMethodSample();
im1.aiueo("a", "b");
 
/*
aiueo
a
b
 */
 
 
// groovy.lang.GroovyObject#getProperty
def im2 = new InvokeMethodSample();
im2.name
 
/*
name 
*/
```
Javaで電話番号フォーマット

なんだよーこいつもすげーらくじゃーん

https://code.google.com/p/libphonenumber/

```xml
<dependency>
	<groupId>com.googlecode.libphonenumber</groupId>
	<artifactId>libphonenumber</artifactId>
	<version>3.6</version>
</dependency>
```

```java
String tel = "0451234567";
Phonenumber.PhoneNumber phoneNumber = PHONE_NUMBER_UTIL.parse(tel, "JP");
tel = PHONE_NUMBER_UTIL.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.NATIONAL);
System.out.println(tel);
```

045-123-4567

になるぜ。

SpringのCustomEditor使ってこんな風にもねぇ。

```java
public class PhoneNumberEditor extends PropertyEditorSupport {

	private static final PhoneNumberUtil PHONE_NUMBER_UTIL = PhoneNumberUtil.getInstance();

	@Override
	public void setAsText(String text) {
		if (!StringUtils.hasText(text)) {
			setValue(null);
		}
		else {
			try {
				Phonenumber.PhoneNumber phoneNumber = PHONE_NUMBER_UTIL.parse(text, "JP");
				text = PHONE_NUMBER_UTIL.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.NATIONAL);
			}
			catch (NumberParseException e) {
				// Do Nothing
			}
			setValue(text);
		}
	}
}
```

```java
@Controller
@RequestMapping(value="/hoge")
public class HogeController {

	@InitBinder(FORM_MODEL_KEY)
	public void initBinder(WebDataBinder binder, HttpServletRequest request) {
		binder.registerCustomEditor(String.class, "tel", new PostalCodeEditor());
	}
	...
}
```
iPhoneで再生中の曲情報を取得する方法


MPMusicPlayerControllerを使ってiPhoneで再生中の曲情報を取得する方法です。

```objc:ヘッダ/プロパティ追加
#import <MediaPlayer/MediaPlayer.h>
// + MediaPlayer.frameworkをリンクライブラリに追加

@interface HogeVC ()

@property(nonatomic, strong) MPMusicPlayerController *player;

@end
```

iPodMusicPlayerはアプリ独自ではなくOS共通のプレイヤーを返します。なのでiPhone標準のMusicアプリで曲を再生した状態で、実装したアプリを起動するとMusicアプリの曲がそのまま取得できます。

```objc:前処理
-(void) viewDidLoad {
	[super viewDidLoad];

	self.player = [MPMusicPlayerController iPodMusicPlayer];
	[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onNowPlayingItemChanged:)
												 name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification
											   object:self.player];

	[self.player beginGeneratingPlaybackNotifications];
}
```

```objc:後処理
-(void) viewDidUnload {
	[super viewDidUnload];
	
	[[NSNotificationCenter defaultCenter] removeObserver:self];
	[self.player endGeneratingPlaybackNotifications];
}
```

MPMusicPlayerControllerNowPlayingItemDidChangeNotificationで曲が変わったことを検知できます。
最新の曲情報はMPMusicPlayerController.nowPlayingItemにアクセスして取得します。

```objc:曲変更時
-(void) onNowPlayingItemChanged:(NSNotification*)ntf {
	MPMediaItem *mediaItem = [self.player nowPlayingItem];
	NSInteger mediaType = [[mediaItem valueForProperty:MPMediaItemPropertyMediaType] integerValue];
	if (mediaType == MPMediaTypeMusic) {
		// 曲名
		_title = [mediaItem valueForProperty:MPMediaItemPropertyTitle];
		// アルバム名
		_albumTitle = [mediaItem valueForProperty:MPMediaItemPropertyAlbumTitle];
		// アーティスト名
		_artistName = [mediaItem valueForProperty:MPMediaItemPropertyArtist];
		
		// アートワーク（ジャケット写真）
		MPMediaItemArtwork *artwork = [mediaItem valueForProperty:MPMediaItemPropertyArtwork];
		_artworkImage = [artwork imageWithSize:CGSizeMake(80.0, 80.0)];
		
		// 再生時間		
		_duration = [[mediaItem valueForProperty:MPMediaItemPropertyPlaybackDuration] floatValue];
	}
}
```
AndroidStudioでSQLiteを暗号化するSQLCipherを使う

AndroidStudioでSQLiteを暗号化する、SQLCipherを取り込むのに苦労したので備忘録的に。

まずは、SQLCipherの下記ページからAndroid用のライブラリ一式をダウンロード。
http://sqlcipher.net/open-source/
https://s3.amazonaws.com/sqlcipher/SQLCipher+for+Android+v3.0.2.zip

ダウンロードしたライブラリを解凍すると、下記のような構成になっている。
SQLCipher
 |- assets/
 |- libs/
 |- READEME
 |- SQLCIPHER_LICENSE

次に、プロジェクト上のapp配下に、解凍したassetsとlibsをコピー
![スクリーンショット 2014-02-21 01.56.27.png](https://qiita-image-store.s3.amazonaws.com/0/27808/a5deb244-f3bf-ce59-5e52-d8208f97e206.png)

app/build.gradleを更新。

```groovy:build.gradle

android {
    compileSdkVersion 18
    buildToolsVersion "19.0.1"

    ....
    sourceSets {
        main {
            assets {
                srcDirs = ['assets']
            }
        }
    }
}

dependencies {
    ....
    compile files('libs/commons-codec.jar')
    compile files('libs/guava-r09.jar')
    compile files('libs/sqlcipher.jar')
    compile fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}

// for native modules
task copyNativeLibs(type: Copy) {
    from('libs') { include '**/*.so' }
    into new File(buildDir, 'native-libs')
}
tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn copyNativeLibs }
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
    pkgTask.jniFolders = new HashSet<File>()
    pkgTask.jniFolders.add(new File(buildDir, 'native-libs'))
}
clean.dependsOn 'cleanCopyNativeLibs'
```

ここまでできれば後は、「Run 'app'」するだけ。
AnsibleでProxyを一括設定する


[@garbagetown](https://twitter.com/garbagetown)さんの[あなたが Ansible を使うべき n 個の理由](http://garbagetown.hatenablog.com/entry/2014/02/20/022827)の記事中で
>Redmine のインストール手順はネット上に山ほど転がっているけど、プロキシ設定など環境依存の落とし穴にハマる人は自分を含め相当数いる

とあって、自分も昔ハマっていたことを思い出しました。

分かると簡単なんだけど、yumやらwgetやらサーバ毎に設定するのは面倒なので、Proxyを一括設定するAnsibleのPlaybookを作りました(と言ってもかなり昔でAnsibleも1.2だったり。。)

https://github.com/volanja/ansible-Proxy

[ここ](http://qiita.com/volanja/items/8362beb5a929a07afee4)で紹介しているAnsible-RedmineやAnsible-Gitlabの実行前に行うことでプロキシ環境下でもスムーズに進めることが出来ます。
以下、README.mdのコピペです。
# ansible-Proxy
ansibleを使って、CentOSにプロキシの設定をします。

## 対象環境
CentOS 6.4 64bit   (virtualbox + vagrantで構築)

## 実行環境

```bash
$ ansible --version  
ansible 1.2.2  
```

## proxyの設定箇所

```roles/proxy/vars/main.yml  
https_proxy: "https://proxy.example.com:8080/"  
http_proxy: "http://proxy.example.com:8080/"  
```

## proxyを設定するもの
+ bash
+ git
+ Ruby - gem
+ wget
+ curl
+ yum

## 実行手順(簡易版)
hosts内に対象サーバのIPアドレスを入力しておくこと。  

```
git clone https://github.com/volanja/ansible-Proxy.git
cd ansible-Proxy
ansible-playbook setup.yml -i hosts
```

以上です。
gitでバイナリパッチを作ってみよう（git diff --binary）

gitでバイナリファイルの差分を出力したいときは`git diff --binary`を使いましょうって話。

「コミットすればいいじゃん」ってゆうツッコミは置いといて。
他の人と一時的な差分を共有するとき、`git diff > hoge.diff`とかやってパッチを渡すことがある。

そんなとき、バイナリファイルに差分があったらどうするか。

「このパッチをあてて、このバイナリファイルをここに置いて、それからこうやってビルドしてください。」ってのはちょっと残念。

`git diff`はデフォルトでバイナリ差分を省略するので、`--binary`オプションの出番。
ちなみにテキストファイルの差分もちゃんと一緒に出力してくれる。このオプションは例えば`git show`などでも使える。

適用するときは特にオプションは不要で`git apply`でバイナリも変更してくれる。
ただ一点注意。もしパッチを渡す相手が昔ながらのpatchコマンドを使っていた場合、binary差分は完璧に無視する上にpatchコマンドは成功したことになる。
「git applyしてください」の一言とともにバイナリパッチを渡せば余計なトラブルを回避できる。

`git diff`

```diff
diff --git a/hoge.tgz b/hoge.tgz
index 02ba93c..d0ce544 100644
Binary files a/hoge.tgz and b/hoge.tgz differ
```

`git diff --binary`

```diff
diff --git a/hoge.tgz b/hoge.tgz
index 02ba93ce61277f57c93dc3c9edd7e8152fc75333..d0ce544c18d7c418929cf19fdf80b689c4d1d17b 100644
GIT binary patch
delta 13
UcmeBW>}6z?@8)2*GLf|d02mSj#sB~S

delta 13
UcmeBW>}6z?@8)1wIgzyk02gKhn*aa+

```
＃どうやってテキストに変換してるんだろう？base64じゃないみたいだけど、独自フォーマットかな？
SplFixedArrayで"純粋な配列"を作る

よく知られているように、PHPには"純粋な配列"がない。`array()`は連想配列である。
（ここで言う純粋云々は別にポインタとかの話ではなく、用語としてPHPで「配列」と言ってしまうとarray()のことを指すことから、区別のために「純粋な配列」と書いているだけである。）
添え字は整数でなくても文字列が指定できるし、整数であっても順番が保証されていない。

```php
<?php
$a1 = [10,20,30]; //配列っぽい配列
$a2 = [2=>10, 0=>20, 1=>30]; //添え字は整数だが順番が変な配列
$a3 = ['a'=>10, 20, 30]; //添え字に文字列が混じってる
```

参考：[PHP - 配列か連想配列か判定する - Qiita](http://qiita.com/Hiraku/items/721cc3a385cb2d7daebd)

まあ慣れれば特に気にならないという人もいるかも知れないけど、コードの欠陥を感染が広がる前になるべく見つけたいという静的検査欲求がある人は、何が入っているかよくわからないPHPの配列を嫌うかもしれない。

PHP5.3から導入されたSplFixedArrayは、自動伸長しない配列である。代わりに高速で省メモリであることを謳っている。
[PHP: SplFixedArray - Manual](http://php.net//manual/ja/class.splfixedarray.php)

よくよく見ると、SplFixedArrayは数値の添え字しか許さず、順番も守られることから、"純粋な配列"の条件を満たしている。
自動伸長してほしい場合は、offsetSetをオーバーライドすればいける。

```php
<?php
/**
 * 純粋な配列
 *
 */
class Collection extends SplFixedArray
{
  function offsetSet($offset, $value)
  {
    if ($offset === null) {
      $offset = count($this);
      $this->setSize($offset + 1);
    }

    //配列要素の型を固定にしたければ、ここで$valueの型をチェックすればよい

    return parent::offsetSet($offset, $value);
  }
}
```

```php
<?php
$a1 = new Collection;
$a1[] = 10;
$a1[] = 20;
$a1[] = 30;

//$a1['a'] = 'hoge'; //例外が発生して止まる
```

おそらくArrayAccessやCountable、IteratorAggregateなどを地道に実装すれば同様のクラスを再現することもできるだろうけれど、SplFixedArrayを使うのが最も高速で簡潔だと思う。
非同期のユニットテスト

非同期ユニットテストを書く時に便利なメソッド。
非同期呼び出し時に、startAsyncTest、完了時にendAsyncTestを呼ぶようにするだけで、各テストごとに終了待ちをするようになります。

```objc
#import <XCTest/XCTest.h>

@interface SampleTestCase : XCTestCase

@property int numOfRunningAsyncTest;

@end

@implementation SampleTestCase

- (void)setUp
{
    [super setUp];
    self.numOfRunningAsyncTest = 0;
}

- (void)tearDown
{
    //Wait until all the async test completes
    NSTimeInterval timeoutSec = 1;
    NSTimeInterval monitorInterval = 0.1;
    NSDate *startDate = [NSDate date];
    while(true) {
        @synchronized(self){
            if(self.numOfRunningAsyncTest == 0){
                break;
            }
        }
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
                                 beforeDate:[NSDate dateWithTimeIntervalSinceNow:monitorInterval]];
        if([[NSDate date] timeIntervalSinceDate:startDate] >= timeoutSec){
            XCTFail(@"Timed out, Didn't you forget to call endAsyncTest?");
            break;
        }
    }
    [super tearDown];
}

- (void) startAsyncTest
{
    @synchronized(self){
        self.numOfRunningAsyncTest++;
    }
}

- (void) endAsyncTest
{
    @synchronized(self){
        self.numOfRunningAsyncTest--;
    }
}
@end
```
Macに入れたDockerでdocker versionやboot2docker sshがエラーになる時の対処法

export DOCKER_HOST=tcp://した後で以下のエラーが出ている人向けです。

docker version
Client version: 0.8.0
Go version (client): go1.2
Git commit (client): cc3a8c8d8ec57e15b7b7316797132d770408ab1a

2014/02/20 23:30:20 unexpected EOF

boot2docker ssh
ssh_exchange_identification: Connection closed by remote host

こちらからISOファイルをカレントディレクトリに落として、./boot2docker.vmdkと~/VirtualBox VMs/boot2docker-vmを削除してinitからやり直すとすんなりいけました。

https://github.com/boot2docker/boot2docker/releases

他の方はわざわざISOファイルダウンロードしていないのが気になりますね。
iTunesを使ったファイル共有方法


##iTunesからファイルを共有してアプリから利用する方法

###プロジェクトの設定
1. プロジェクトナビゲーターで「プロジェクト名-Info.plist」ファイルを選択
2. 行を追加して「Key」に「Application supports iTunes file sharing」と入力して「Value」を「YES」に設定する
![iTunesSharing1.png](https://qiita-image-store.s3.amazonaws.com/0/37947/442f7af1-5402-06b9-3ac3-f17029b0eaa5.png "iTunesSharing1.png")

###シミュレーターでのファイル追加方法
```/Users/{ユーザー名}/Library/Application support/iPhone Simulator/``` を開き
作成中のアプリケーションの ```Documents``` フォルダへファイルを作成またはコピーする。
![iTunesSharing2.png](https://qiita-image-store.s3.amazonaws.com/0/37947/d01b87ea-1c10-57f6-8565-103b5c4ea765.png "iTunesSharing2.png")

＊実機の場合はiTunesから

###アプリ側でのファイル読み込み

```Objective-C
// ドキュメントディレクトリ
NSArray *documentDirectries = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [documentDirectries lastObject];

// ドキュメントディレクトリにあるファイルリスト
NSError *error = nil;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *files = [fileManager contentsOfDirectoryAtPath:documentDirectory error:&error];
for (NSString *file in files) {
    NSLog(@"%@", file);
}
```
sublime textでインデントをspace2つに変更する方法


"translate_tabs_to_spaces": true
設定ファイルにこれ書くか

![70e45379398812a7197e9b06db2768cf.gif](https://qiita-image-store.s3.amazonaws.com/0/36504/99593608-0aec-d4cf-af4e-6f4b855b645e.gif)
これ

gyazoを使ってみたかったw
Subversionでテキストファイルがバイナリ扱いになった時のコマンド

Shift-JISのファイルをUTF-8(BOM)に変換してsvnでコミットした。いざdiffコマンドを打つとバイナリ扱いになっていたため、変換を行った。

環境
* Mac OS X 10.9.1
* Subversion 1.7.14

```shell-session
# ファイルタイプの確認
# unityだったのでここではcsファイルを検索している
$ find . -name "*.cs" -print0 | xargs -0 svn propget svn:mime-type
hoge.cs - application/octet-stream
...
```
ざっと確認して文字コード指定してみた。

```shell-session
$ find . -name "*.cs" -print0 | xargs -0 svn propset svn:mime-type "text/plain;charset=utf-8"
```

再度ファイルタイプを確認して、大丈夫ならコミット。
Xen Orchestraの導入


通りすがりに記事を見つけたので入れてみた。

Xen Orchestra
https://xen-orchestra.com/install-and-update-xo-from-git/

先にXenServer6.2をインストールしておく必要がある
http://xenserver.org/overview-xenserver-open-source-virtualization/download.html

>XenServer Installation ISO

CD焼くなり、nestedな環境を作るなりお好きにどうぞ

ということで、XenServerにsshログインして作業開始

```sh
wget http://dev1.vates.fr/xoa_3.1.xva
xe vm-import filename=xoa_3.1.xva
xe vm-start vm=XOA
xe console vm=XOA
```

root/rootでログイン可能

中身はDebian7.0
IP調べて、WEBプラウザで開くと管理画面が出る

admin@admin.net/adminでログイン可能


ログイン名の左にあるボタンから[setting]を選んで
XenServerの情報を入力する

これでXenServerの管理にWindowsでXenCenterがなくても行けそうだ
AltriaでCI環境構築


この下記の記事を見て、興味を持ったのでvagrant上に作成したみた

http://inokara.hateblo.jp/entry/2013/07/30/054814
http://inokara.hateblo.jp/entry/2013/12/22/101353

まず、ubuntu12.04

適当に開発環境を構築 gccとかmake とかlibopenssl-devとか
rubyとか使うので入れる
altriaがmysqlとredis-serverを使うのでインストールしておく。

```git
git clone https://github.com/r7kamura/altria.git

```

公式ページ[[https://github.com/r7kamura/altria.git]]には、usageで入れ方書いてあるけど、実際には以下でいける

```sh
./bin/altria setup
./bin/altria start
```

この際、redis-serverとか先に起動しているとエラーになる

http://localhost:3000
上記でアクセス

余談
vagrantとか使ってるなら、SSHトンネルでアクセス
```
ssh -N -L 8080:127.0.0.1:3000 vagrant@localhost -p 2222
```
enchant.jsでいうenterFrameをcocos2d-html5でやる

enchant.jsの場合、あるオブジェクトに何らかのアクションを毎フレーム実行させたい場合はこんなふうに書く。

```js:enchant.js
bear.onenterframe = function() {
    // 毎フレーム実行したい処理を書く
};
```

cocos2d-html5ではthis.scheduleUpdate()とupdate()の組み合わせで実現できる。

```js:cocos2d-html5
cc.Node.extend({
   ctor: function() {
      this._super();
      this.scheduleUpdate(); // 毎フレームごとにupdate()を実行してねって宣言する
   },

   /** @override */
   update: function() {
      // 毎フレーム実行したい処理を書く
   }
});
```

なお、このクラスがsceneなりspriteなりにaddChild()されていないとupdate()を呼んでくれないので注意。（これが言いたかっただけ）
Node.jsでクラスを別ファイルで作る


```js:Person.js
var Person = function(name) {                                                             
  this.name = name;                                                                      
                                                                                         
  this.toString = function() {                                                           
    return "[Person: " + this.name + "]";                                                 
  }                                                                                      
}                                                                                        
                                                                                         
module.exports = Person;
```

```js:使用する側
var Person = require("path/to/Person.js");
var person = new Person("shoma2da");
console.log(person.toString());//-> [Person: shoma2da]
```
mogeneratorをRunScriptに仕込む


アプリビルド時に自動的にmogeneratorのモデルクラス生成処理を行う。
target -> app -> BuildPhases -> Run Scriptに以下を追加。

```bash
/usr/local/bin/mogenerator \
    --template-var arc=true \
    --model ./project/Model/Model.xcdatamodeld \
    --machine-dir ./project/Model/Internal/ \
    --human-dir ./project/Model/ 
```
Emacsでタブのおよび行末の無駄なホワイトスペースをハイライトする


タブ、無駄なホワイトスペースを入力したくないときの設定

```cl:.emacs
(setq-default indent-tabs-mode nil)       ; インデントはタブではなくスペースを使用
(setq-default show-trailing-whitespace t) ; 行末の空白をハイライト
(add-hook 'font-lock-mode-hook            ; タブをハイライト
          (lambda ()
            (font-lock-add-keywords
             nil
             '(("\t" 0 'trailing-whitespace prepend)))))
```
NSString stringWithFormatにおける、position指定

## NSStringのformat指定
NSStringおよびNSLogのフォーマットには、IEEE準拠のposition指定を使うことができます。
クラスリファレンスをよく読んでみると、さらっと書いてあります。大事なことなのに。

[String Format Specifiers](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html)

```text
Note that you can also use the “n$” positional specifiers such as %1$@ %2$s. For more details, see the IEEE printf specification. 
```

今までもこの機能を多言語対応で使っていたのですが、今日新たな発見を二つしました。

1. 同じポジションを複数回使用できる
2. ポジション指定をしない引数があっても良い

もしかしたら常識なのかもしれませんが、僕的には大きな発見です。

プログラム

```objc
    NSLog(@"%d %d %d",1,2,3);
    NSLog(@"%3$d %1$d %2$d",1,2,3);
    NSLog(@"%1$d %2$d %1$d %2$d",1,2,3);
```

実行結果

```
1 2 3
3 1 2
1 2 1 2
```

プログラム中では多めにパラメータを定義しておいて、フォーマット側で使う変数を決めるというテクニックは、多言語対応で大きな威力を発揮しそうです。

## カテゴリによるNSString拡張

僕の手元では下記のようなカテゴリを使うことにしました。

```objc
@interface NSString (BTKExtention)

+ (id) btkStringWithFormat:(NSString*)format
                      dict:(NSDictionary*)params;

@end
```

これを使うと、

```text
Here is variable %1$@!
```

のように書いていたフォーマットを

```text
Here is variable %argname$@!
```

のように書けます。超快適。

やっつけで書いてしまったので実装は非公開で。。。
もしこの記事のストックが100件になったら実装も整理して公開します:-p
【初心者による、初心者のためのRails】5分で作るWebアプリ

「アプリには夢がある」どうもインフラエンジニア千葉です。
今日は、Railsを使ってさくっとアプリを作ってみます。
作ったアプリを触ってみて、Railsへのハードルが少しでも下がったらなと思います。

## どんなの作れる？
こんな画面です。
![スクリーンショット 2014-02-20 21.04.48.png](https://qiita-image-store.s3.amazonaws.com/0/33834/fb7687d1-c33b-eb6e-d10d-ede3296988b6.png "スクリーンショット 2014-02-20 21.04.48.png")

ユーザと貯金額を登録・更新・削除できます。また一覧表示でできます。

## 環境
* Railsがインストールされている状態。

  ここは、環境に依存するところなのでググってくださいね。

## アプリケーションの作成
    $ rails new helloworld
    $ cd helloworld

アプリができたので、サーバを起動します。

    $ rails server

## Webアプリの確認
ブラウザでアクセス
　http://localhost:3000/

デフォルトの画面が表示されます。
作成されたアプリを確認できたのでサーバを落としましょう。
ターミナルでサーバを「Ctrl+c」で終了します。

## それでは一歩進んで、もう少しちゃんとした物を作る
 
rails scaffold という機能を使うと、魔法のようにWebアプリが作れます。
今はコマンドの意味は気にせず、進みましょう。
今回の目的は、さくっと作ってみて、Railsを体感してみるところにあります。

    $ rails generate scaffold User name:string savings:integer


このコマンドで、画面とDB初期化用のファイル作成されます。
次に、↑のコマンドで作成された、DB初期化ファイル（マイグレーションファイル）使ってテーブルを作成します。

    $ rake db:migrate


## 完成したので、アクセスして確認!!

サーバを起動します。

    $ rails server


ブラウザでアクセス
　http://localhost:3000/users

## オススメ書籍
入り口までこれました。
もっと、今後詳しくなりたい方へオススメの教材です。

* [ドットインストール](http://dotinstall.com/)
このサイトは、プログラミング入門向用の動画サイトです。
１動画３分です。rubyやRailsもあるので、入門の方に超絶オススメです。

* [Railsチュートリアル](http://railstutorial.jp/)
この教材を最後までやると、ツイッターみたいなWebアプリが作れるようになります。
私は、インフラエンジニアなのですが、開発の一通りも学べてとてもいい本だと思います。
学べるもの
	* Rails
	* bootstrap(CSSフレームワーク)
	* HTML
	* テスト駆動型開発
	* Git(バージョン管理)
	* GitHub(ソフトウェア開発プロジェクトのための共有ウェブサービス)
 	* Heroku(PaaS環境)


インフラエンジニアな私には、とても新鮮な情報が満載で、とてもオススメです。
なんといっても、開発の一通りの流れを学べるので、今後自分でアプリを作る時にとても参考になる内容になっていると思います。
Apacheのnoticeエラー … exit signal File size limit exceeded

開発環境サーバにて。

Apacheが起動しているけれど、ページが表示できない事象が発生。

・`ps auxf`...プロセスは生きている
・`tail -f access_log`...には出力なし
・`tail -f error_log`...に下記の出力あり

`[notice] child pid 11737 exit signal File size limit exceeded (25)`

noticeだから関係ないか… と思ったけど、不吉な感じがして確認。

大きくなりがちなのは、Apache関連。
どっこい、Apacheのrewrite_logがフルになっていました(´・ω・｀)

どのファイルがフルになったかわかるともっとありがたいんだけどな。
そして、noticeレベルだけどサービスとしては相当critical。

そしてそもそも、ローテートしとこうぜ、っていう。
開発環境だとつい後回しにしてしまいますが、こういう不具合に遭遇すると、
調査に要する時間はバカになりませんです。。

ローテートの設定を追加。
`/etc/loglotate.d` をいじっておく。
#TODO
Linuxで横書きのドキュメントをps原稿で縦印刷で出力したい

### 前提
今回試したのは「HTML -> PDF -> PS -> プリンタ出力」という流れ
* サイズは　A4
* 文字エンコードはshift-jis

### HTML→PDF変換
wkhtmltopdfを利用

```bash
wkhtmltopdf --page-size A4 --orientation Landscape --dpi 100 --encoding shift-jis [HTML ファイル] [PDFファイル]
```

※Landscpe指定が重要

### PDF -> PS変換
acroreadを利用(ver9以降)

```
acroread -toPostScript -rotateAndCenter [PDFファイル] [PSファイル]
```

※rotateAndCenter指定が重要　→　ver9以降でないと使えないので注意
ver8以前にはlandscpeオプションがあるが、横向き回転のみで出力時に縦で出力されず原稿が途切れてしまう
AdSenseの日時売上レポートをHipChatにレポートする方法

HipChatに日々の売上レポートを通知させたいですよね。
今回はGoogleAppScriptとHipchatのAPIを利用して実現してみます。

# HipChatのAdmin API tokenを取得する

[Admin API Key](https://www.hipchat.com/admin/api)

# GoogleAppsScriptでAdSenseの売上を集計する

```js
function addFigure(str) {
  var num = new String(str).replace(/,/g, "");
  while(num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
  return num;
}

/*
 * @example
 * generateReport('2014-01-01')
 */
function generateReport(date){
  var startDate = date;
  var endDate = date;

  var args = {
    'metric': ['AD_REQUESTS', 'AD_REQUESTS_CTR', 'COST_PER_CLICK', 'AD_REQUESTS_RPM', 'EARNINGS', 'CLICKS'],
    'dimension': ['DATE'],
    'useTimezoneReporting': true
  };
  var rows = AdSense.Reports.generate(startDate, endDate, args).getRows();
  var row = rows[0];

  var message = [
    row[0],
    '収益: ¥' + addFigure(row[5]),
    '広告リクエスト: ' +  addFigure(row[1]),
    '広告リクエストCTR: ' + parseFloat(row[2]) * 100 + '%',
    'CPC: ¥' + addFigure(row[3]),
    '広告リクエストRPM: ¥' + addFigure(row[4])
  ].join("<br>");

  sayMessage(message);
}
```

# 集計結果をHipChatAPIで通知する

[Rooms APIの仕様](https://www.hipchat.com/docs/api/method/rooms/message)

```js
var authToken = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

function getRequestURL(){
  var url = "http://api.hipchat.com/v1/rooms/message";
  return url + '?auth_token=' + authToken;
}

function sayMessage(message) {
  var options = {
    "contentType" : "application/x-www-form-urlencoded",
    "method": "post",
    "payload": {
      "room_id": XXXXXX, // Found in the hipchat.com MyAccount > Rooms > API ID
      "from": 'AdSense',
      "notify": 0,
      "message": message ? message : "",  
      "color": 'green',
      "message_format": 'html'
    },
    //"muteHttpExceptions": true
  };

  var responseString = UrlFetchApp.fetch(getRequestURL(), options).getContentText();
  Logger.log(responseString);
}
```

# 出来上がり
![スクリーンショット 2014-02-20 20.43.15.png](https://qiita-image-store.s3.amazonaws.com/0/19548/91dec90b-69a3-f7de-592f-41fcfecfc23d.png)
PureDataで値のプリセットを外部ファイルで管理する方法


Pd使っててたまに困るのが、プリセット機能が充実してない無いことです。たとえばライブでPdを使う場合、リハーサルでパッチをいろいろいじったあと、「この値のまま保存しておきたい！」ってときは絶対あると思います。

最も簡単な方法は、[message]を使う方法です。
![kobito.1392891629.615165.png](https://qiita-image-store.s3.amazonaws.com/0/29877/10288190-eba5-10e8-79bb-92f401e81bed.png "kobito.1392891629.615165.png")

右のvaluesにある３つの値（X, Y, Z）が保存したい値です。値を調整して、左にあるbangボタンを押せば[message]に値をセットできます。[message]に書き込んだ値はパッチと一緒に保存されるので、値を呼び出したいときは[message]を押すことで[r x][r y][r z]にそれぞれ値が飛んで復元します。

これは[message]にsetやaddなどでパッチから直接書き込めるのと、セミコロンを頭につけると[receive]に一括で値を送れるという機能を使った方法ですね。[美山さんの本](http://goo.gl/d67WA7)でも説明されていました。


しかし、この方法だとプリセットを複数用意したいときに不便です。例えば下の画像みたいに１個ずつ増やしていくという手もありますが、ちょっと面倒だし、前のプリセットを書き換えたいときも面倒です。

![kobito.1392892246.909485.png](https://qiita-image-store.s3.amazonaws.com/0/29877/dee8939e-014e-bf64-c18c-4bab8234312b.png "kobito.1392892246.909485.png")


#Tableを使ってプリセットを作成し外部ファイルに書き出す

そこで、[table]（アレイでも可）を使って外部ファイルに書き出す方法があります。

![kobito.1392892584.669902.png](https://qiita-image-store.s3.amazonaws.com/0/29877/dda3170a-40f5-47ca-2a42-76060fa9b51f.png "kobito.1392892584.669902.png")


（１）は先ほどと同じ保存したい値X, Y, Zです。
（２）のsave preset numberとかかればやつに数値を入れると、上の３つの値がテーブル[table $0-bank 1024]に書き込まれます。

また、このとき保存したい値の数分乗算してインデックスを指定する必要があります。その辺の処理が（２）の下の部分ですね（この辺もっとシンプルに改善したい…）

（３）はプリセットを読み込む処理です。load preset numberというところに読み込みたいプリセットのインデックス番号を指定します。ここでも保存した値の数分インデックスをインクリメントして読み込む必要があるのですが、ここでは適当に[tabread]を３つ用意して読み込んでます（もっといい方法があるはず笑）

要するに、[table]とかアレイは"write"メッセージを送ることでテキストファイルとして外部ファイルに保存する機能があります。そこで、保存したい値の数分テーブルのインデックス値をインクリメントしながらテーブルに値を書き込み、読み込むときはその最初の値から保存した数分のインデックスを読みこめばいいわけです。


実際に保存したファイルはこんな感じになります（赤文字は説明用）

![kobito.1392893521.765037.png](https://qiita-image-store.s3.amazonaws.com/0/29877/af452577-7c49-aaf2-299f-138f2c1a52c2.png "kobito.1392893521.765037.png")


今回のパッチは保存した値が３つだったので、１つのプリセット毎に３つずつ値が書き込まれています。これはこれでテキストファイルとして保存されるので、後からプリセットの値だけ書き換えることもできます（その場合は、何行目がどのプリセット番号のどの値なのかわかりにくいのでおすすめしませんが…）

また、テーブルのサイズは（保存したい値の数×保存したいプリセット数）で指定すればOKです。

そのうち時間があればオリジナルのPdオブジェクト作りたいです。プリセット用の。
chef-rails-dev-boxで初めにbundle installしたらエラーがでた


Vagrantで[chef-rails-dev-box](https://github.com/banyan/chef-rails-dev-box)を使ってみた。

chef-rails-dev-boxは[rails-dev-box](https://github.com/rails/rails-dev-box)のchefを使っているバージョン。

早速導入して、`bundle install`したところ、下記のエラーが

```Terminal
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /usr/local/rbenv/versions/2.0.0-p0/bin/ruby extconf.rb
checking for termios.h... yes
checking for cfmakeraw() in termios.h... yes
checking for sys/ioctl.h... yes
checking for rb_io_get_write_io() in ruby/io.h... yes
checking for dup3() in unistd.h... yes
creating Makefile

make
compiling console.c
linking shared-object io/console.so

make install
/usr/bin/install -c -m 0755 console.so /usr/local/rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/io-console-0.3/./io
installing default console libraries
/usr/bin/install: accessing `/usr/local/rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/io-console-0.3/./io/console': Not a directory
make: *** [/usr/local/rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/io-console-0.3/./io/console/size.rb] Error 1


Gem files will remain installed in /usr/local/rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/io-console-0.3 for inspection.
Results logged to /usr/local/rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/io-console-0.3/./gem_make.out
An error occurred while installing io-console (0.3), and Bundler cannot continue.
Make sure that `gem install io-console -v '0.3'` succeeds before bundling.
```

どうやら、元から入っているruby-2.0.0-p0ではうまくいかないとか・・・

そこで`rbenv`で違うバージョンのrubyをインストール(筆者はruby-2.0.0-p247)した後に`bundle install`をすれば、エラーは消えました。

`rails-dev-box`でも同じことが起こるんじゃないか？
わからないですが・・・
Scalaで列挙型(enum)を作る


[ScalaのEnumerationは使うな - Scalaで列挙型を定義するには | Scala Cookbook](http://xerial.org/scala-cookbook/recipes/2012/06/29/enumeration/)によると、Scalaで列挙型を定義するには `Enumeration` よりも case object を使ったほうが便利とのこと。

例: 出欠状況の列挙型の例

```scala
// 列挙型をcase objectと継承を使って定義
sealed abstract class AttendingStatus
case object Going extends AttendingStatus
case object NotGoing extends AttendingStatus
case object Maybe extends AttendingStatus

var attendingStatus: AttendingStatus = Going

// case object だとマッチャーが使えて便利
attendingStatus match {
	case Going => println("出席")
	case NotGoing => println("欠席")
	case Maybe => println("未定")
}
```

出欠状況の選択肢を `Going`、`NotGoing`、`Maybe` の3種類だけに限定するために、下記の工夫をする。
* `sealed` は同一ファイル内でのみ継承が可能にする。つまり、どこかで勝手に選択肢追加されることを防ぐ目的。
* `abstract` は `AttendingStatus` 自体が選択肢のひとつになることを防ぐ目的。
* `case class` ではなく `case object` にしているのは勝手な継承をさせないため。 (`sealed`だけではサブクラスの継承を防げない)


実際のコードでは、列挙型を使うクラスのコンパニオンオブジェクトの一部にしたほうが、整理されていていいと思う。

```scala
// Attenderエンティティ
case class Attender(name: String, status: Attender.Status = Attender.Status.Maybe) {
	def attend = copy(status = Attender.Status.Going)
	def absent = copy(status = Attender.Status.NotGoing)
}

object Attender {
	// 列挙型の定義はここ
	sealed abstract class Status
	object Status {
		case object Going extends Status
		case object NotGoing extends Status
		case object Maybe extends Status
	}
}

val attender = Attender("Hidehito Nozawa")

println(attender)
println(attender.attend)
println(attender.absent)
```

実行結果

```
Attender(Hidehito Nozawa,Maybe)
Attender(Hidehito Nozawa,Going)
Attender(Hidehito Nozawa,NotGoing)
```
バッファプールを拡張する

長く運用しているとなんか足りなくなるのがバッファプール IBM DB2でバッファプールの一覧を表示するには、以下のSQLを実行すればわかる、ちなみにバッファプールは、データをメモリにキャッシュする領域くらいに考えておけばいいかと・・かと思う。

## バッファプール一覧を確認する

こんな感じのSQLを投げれば、確認できる。

```
$ db2 "SELECT char(bpname,20) bpname ,pagesize,npages FROM SYSCAT.BUFFERPOOLS" 
```
* 以下のような結果になりました。

```
BPNAME               PAGESIZE    NPAGES     
-------------------- ----------- -----------
IBMDEFAULTBP                4096     1000000
```
4096バイトを、1000000ページ利用しているってことなので、つまり、うーんと・・・ 4GB 使っているってことか？

## バッファプール領域の拡張

たとえばSELECT文を発行している際に、"SQL3015N  処理中に、SQL エラー "-1218" が発生しました。" とかでる場合は、バッファプールが不足しているのが原因です。その場合は、領域の拡張が必要になります。

### 拡張する場合は、以下のようなコマンドを投げます

```
$ db2 “ALTER BUFFERPOOL IBMDEFAULTBP IMMEDIATE SIZE 1500000 AUTOMATIC”
```
IBMDEFAULTBP のページサイズを、1500000 に拡張し、且つ、オートマチックに切り替える（STMM）、そして即時反映という技です。

* 結果以下の通りになります

NPAGEに-2が表示されている場合は、オートマチックに切り替わったという意味です。

```
$ db2 "SELECT char(bpname,20) bpname ,pagesize,npages FROM SYSCAT.BUFFERPOOLS"

BPNAME               PAGESIZE    NPAGES     
-------------------- ----------- -----------
IBMDEFAULTBP                4096          -2
```
【5分でできる】MySQL/MariaDBをリバースエンジニアリングして、ER図を作成する

# この投稿は？
すでにあるMySQL/MariaDBから、ER図を作成するまでの説明です。
自分用メモでもあるので、文字ばかりです。
とても簡単なので、問題ないはず。
わからなければコメントください。

# 何を使うの？
MySQL Workbenchを使います。
http://www-jp.mysql.com/products/workbench/

ダウンロードしてインストールしちゃってください。

----

ダウンロードページに進むと、いつもどおり(？)「OracleのWeb Account作りなよ！」といわれますが、
スルーしたい場合は Login / Sign Up ボタンの下にある

　　No thanks, just start my download.

リンクを押下して、ファイルをダウンロードすることもできます。



# ER図を作ってみよう
MySQL Workbenchを起動し、上部メニューから下記を選択します。

```
Database -> Reverse Engineer
```

Reverse Engineer Databaseウインドウが表示されるので、
Databaseへの接続情報を入力しましょう。
特に凝ったことをしていなければ、Parametersタブに情報を入力するだけでOKです。

* Hostname 　: MySQL/MariaDBが稼動しているホスト名 or IPアドレス
* Port　　　　: MySQL/MariaDBが接続を待ち受けているポート番号(Defaultは3306になります)
* Username　　: MySQL/MariaDBに接続するユーザ名
* Password　　: Usernameに対応するパスワード

入力したら Next ボタンを押下します。

----

入力情報に間違いが無ければ、次の画面の Message Log に

```
Fetching schema list.
OK
```

と表示されます。
これでDBへの接続は完了です。
問題なければ Next ボタンを押下します。

----
次の画面では、リバースエンジニアリングしてER図を作成したいデータベースを選択します。
必要なデータベースにチェックを入れて、Next ボタンを押下します。

----
リバースエンジニアリングが始まります。
完了すると

```
Retrieval Completed Successfully
Finished.
```

と表示されます。
Next ボタンを押下します。

----
リバースエンジニアリングしたいObjectを選択します。

* TableやViewの数が多すぎる！

などの理由がなければ、全部選択しても問題ないでしょう。


必要なものを選択したら Execute ボタンを押下します。

----

これで作業は完了です。
あとは待っていればリバースエンジニアリングが完了し、

* EER Diagramタブ

にER図が作成されているはず。
お疲れ様でした。
Linuxで特定のNFSサーバを全てアンマウントする

様々なNFSサーバがマウントされているサーバで、ある特定のNFSサーバを全てアンマウントしたいとき

``# df -hP -t nfs | grep "^対象サーバの条件(IPアドレスとか)" | awk {'print $6;'} | xargs umount``

dfの結果をgrepで絞り込んで、awkでdfの出力結果の6番目を取り出し、xargsにリストとして渡してumount
grepでの絞り込みは、正規表現なりなんなりをご自由に。
umountコマンドも、オプション指定が必要であれば適切にセット頂くのがよろしいかと。

ちなみにmountコマンドだと、次の通り
``# mount -t nfs | grep "^対象サーバの条件(IPアドレスとか)" | awk {'print $3;'} | xargs umount``

もっとスマートやり方があるはず…。誰か教えてください…。

tukiyoさんより情報頂きました!

``# umount -a -t nfs -O addr=IPアドレス``

こっちの方が遙かにスマートですね!
Javaの全角半角変換

なんだ、便利じゃーん

```xml
<dependency>
	<groupId>com.ibm.icu</groupId>
	<artifactId>icu4j</artifactId>
	<version>52.1</version>
</dependency>
```

```java
Transliterator transliterator = Transliterator.getInstance("Fullwidth-Halfwidth");
System.out.println(transliterator.transliterate("アイウエオ"));
```

ｱｲｳｴｵになるぜ。
AS3/Flash パフォーマンス・チューニングリンク集とメモ

**リンク集**
・ActionScript3 最適化・高速化Tips 簡易まとめ [リンク先へ](http://actionscript.g.hatena.ne.jp/ConquestArrow/20070621/1182359767)
・Flashの描画速度をBitmapDataクラスを使って上げる方法 [リンク先へ](http://sipo.jp/blog/2009/12/flashbitmapdata.html)
・Flashで吹雪のごとき描画を実現するチューニング3策 [リンク先へ](http://www.atmarkit.co.jp/fwcr/design/tool/flash_tuning02/01.html)
・Flashで怒涛のごときイベント処理を捌きまくる3技 [リンク先へ](http://www.atmarkit.co.jp/fwcr/design/tool/flash_tuning02/01.html)

**Memo**
・型指定がされていない物，配列参照をしていないものは弱い参照
・要のない場合にはNumberは使用しない
・||（OR演算子）を用いて複数の条件処理を一つにまとめて行うのは余計な処理を増やす原因
・visibleは表示・非表示を簡単に切り替えたい場合に有効。alphaは描画されている
・透明ボタンには，hitAreaとvisibleを応用することで代替できるためalphaを使う必要はない
・removeChild()に関しては，該当のオブジェクトを当分あるいは永久に使わないときに有効
・Flash Player 10ではVectorを使用する
・キャストデータ型の変換は、as演算子を使う
Nexus7をファクトリーリセットする

Nexus7のOTAアップデートが失敗しまくるので、[こちらの方法](http://qiita.com/is0me/items/9d738d19ad1f61fb5349)で手動アップデートを試みたが、xxxx has unexpected contentsなるエラーで失敗するのでファクトリーリセットを試みた。

## ファクトリーイメージを入手

[こちら](https://developers.google.com/android/nexus/images)から。
やや分かりにくいが、

* Nexus7(2013) WiFi → razor
* Nexus7(2013) LTE  → razorg
* Nexus7(2012) WiFi → nakasi
* Nexus7(2012) LTE  → nakasig

をそれぞれ探す。どのバージョンを使うかは下記参照。
どれが必要になるか分からず、またファイルサイズが大きく時間がかかるため、寝ている間に全部落としておいた。

## USBデバッグを有効にする
1.設定→タブレット情報→でビルド番号を7回タップしてデベロッパモードへ。
2.設定に戻ると開発者向けオプションが有効になっているので、Macと繋いだ状態でUSBデバッグを有効にする。

## ブートローダーを起動

```Bash
adb reboot bootloader
```

## OEMアンロック

```Bash
fastboot oem unlock
```

**注:Nexus7のユーザ等全てのデータは削除される**

## ファクトリーイメージ書き込み

ダウンロードしたファクトリーイメージのzipを解凍し、

```Bash
cd razor-jss15r
./flash-all.sh
```

4.4.2（KOT49H）をいきなり当てようとしたら失敗したので、4.3（JSS15R）→4.4.2（KOT49H）の順に当てたところ成功した。
この時、当てた直後はUSBデバッグが無効に戻っているので、再度最初の手順で有効にする必要がある。
と言うことは初回起動のWiFiパスワードやらgoogleアカウントやらを入れ直さないといけないので、これが非常に面倒。スキップする方法はあるんだろうか？
あるいは4.3のファクトリーイメージを当てた時点でOTAアップデートが可能になっていたかも知れない。（未確認）

## OEMロック

終わったらロック状態に戻す。

```Bash
fastboot oem lock
```

アンロックと違ってデータは削除されない模様。

なぜOTAやadb sideloadがうまく行かなかったのかは分からないが、中古品なので前のオーナーが中途半端にroot化した状態で売ったのかも・・・
Xcode5でboostライブラリを使う


# はじめに

僕はObjective Cが苦手だ。文法が分からない・・。しかし、現実の要求は、エンジニアに言語を選択する自由を与えてくれない。これは、既存のObjective Cのコードにサーバ機能をつけなくてはいけなくなった奮闘の記録（リマインダ）である。

# 環境

XCodeのプログラムでboostを使う問題は、Stack Overflowでもいろいろ議論されており、バージョンが違うとインタフェースも変わってしまったり解決方法が適用できなくなったりするので、この記録が役に立つかは分からない。ただ、少なくとも動いた環境は明確にしておく。

* XCode Ver. 5.0.2
* boost_1_55_0
	* homebrewによってインストールされている
* 使用したパッケージ
	* boost::asio

既存のXCodeのプロジェクトにboost::asioを使ったサーバ機能を付加する目的で行った。また、実際に使ったプロジェクトのビルドに関するすべては膨大になるので、触れない。

# 前提

とりあえず、C++のソースを絡めてビルドするためのお約束は守る。

* ソースファイルが、\<filename>.mだったら、\<filename>.mmに変更する
* Project設定のBuild Settingsで、LinkingのOther Linker Flagsに以下のフラグを追加
	* -L/usr/local/lib
	* -lboost_thread-mt
	* -lboost_system-mt
	* -lboost_date_time-mt
	* -lc++

※なお、必要なboostのライブラリはそれぞれ異なるので、必要に応じて、設定しよう

ここで、注目なのが、-lc++をリンクしているところだ。makeするときのように-lstdc++としたら、コンパイルが失敗した。


# トライアル1: そのまま使う

まず第一に思いつくのが、boostのヘッダをObjective-C++のコードに直接インクルードして使う方法。しかし、この試みは水泡に帰した。具体的には、has_binary_operator.hppというソースの以下の部分でビルドエラーが出る。

```c++
template < typename Lhs, typename Rhs >
struct operator_exists {
   static ::boost::type_traits::yes_type check(has_operator); // this version is preferred when operator exists
   static ::boost::type_traits::no_type check(no_operator); // this version is used otherwise

   BOOST_STATIC_CONSTANT(bool, value = (sizeof(check(((make<Lhs>() BOOST_TT_TRAIT_OP make<Rhs>()),make<has_operator>())))==sizeof(::boost::type_traits::yes_type)));
};
```

いろいろなところでマクロ設定すれば良いよなどと指摘されているが、うまくいかずに断念。

```
#define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
```


# トライアル2: boost機能部分をラップするライブラリ経由で使う

ヘッダのコンパイルが通らなかったからといって、あきらめるのは早すぎる！ということで、boostの必要部分をラップするライブラリlibwrapper.aを作って、再チャレンジ。注意点としては、インクルードするラッパーライブラリのヘッダの中でboostのヘッダファイルを呼ばないように気をつけること。どうしても、boostのクラスインスタンスがクラスの変数で必要な場合は、ソースファイルの中でstatic宣言などして、回避した。

ヘッダファイルをソースにコピーし、mmファイルにインクルードし、Build Settingsを以下のように書き換える。

* Other Linker Flag
	* -Llib
	* -lwrapper
	* -L/usr/local/lib
	* -lboost_thread-mt
	* -lboost_system-mt
	* -lboost_date_time-mt
	* -lc++

このとき、xcodeprojと並列のディレクトリにlibディレクトリをおき、中にlibwrapper.aを配置した。

これでビルドがうまく行った。boostを直接、使うことは難題だが、少しラップしてあげるとうまくいくらしい。めでたしめでたし。

## libwrapper.aのビルド方法

上記のファイル名は仮の名前だが、ビルドをしたときのコンパイラなどの設定は以下の通り

* CMAKE_AR:FILEPATH=/usr/bin/ar
* CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++

ビルドは、cmakeを通して行い、そのときのコンパイラ・リンカは、上記のとおりである。
[PHP] PHP実行中にMySQLとの接続がすぐ切れる。

PHP 5.5 と MySQL 5.5 の組み合わせでは何も問題なかったのに
PHP 5.2 と MySQL 5.1 にしたらハマっちゃいました。

```php:php
$dbh = new mysqli($host, $user, $pass, $db);
```

と何の気なしに書いて、単体テストでも問題なく動作していたが
連結テストをすると、なぜかクエリが失敗する現象が発生。

原因は、時間のかかる処理をPHP内で行っていたことに寄与する、
PHPとMySQLの接続時間タイムアウトでした。

```php:php
$dbh = mysqli_init();
$dbh->real_connect($host, $user, $pass, $db, $port, $socket, MYSQLI_CLIENT_INTERACTIVE);
```

というふうに、real_connect()を利用し、MySQLのinteractive_timeoutを使う。

はじめ、

```php:php
$dbh = mysqli_init();
$dbh->options(MYSQLI_OPT_CONNECT_TIMEOUT,3600)
$dbh->real_connect($host, $user, $pass, $db, $port);
```

を指定したけど、変わらずでした。
まだ全然追求してません、ご了承ください。
omnibus-ruby が普通の人にとってはあんまり便利じゃない理由



`omnibus-ruby`とは、DSLを書くだけで様々なplatform用パッケージ(`deb`や`rpm`)を生成してくれるものですが、自社サービスのデプロイ用パッケージを手軽にビルドするのが目的だとしたら、あまり便利ではありません。

以下その理由

* 複数platformに対応することが前提なので、依存ライブラリ等もすべてソースからビルドすることになる
* その依存ライブラリもomnibusのsoftwareとして作成する必要がある (ただし主要なもののいくつかは https://github.com/opscode/omnibus-software/tree/master/config/software にある。)
* すべてを1つにまとめるのでパッケージサイズが大きくなる
* vagrant内でビルドするので時間がかかる。しかも初回はrubyのビルドから始まる


なお、ソフトウェアベンダーが自社製品を外部に配布するような目的で使うのであれば便利だと思います。
CentOSでMySQL5.5いれて準同期レプリケーション組むまで


## MySQL使ってますか？

近年はMariaDBとかMongoDBとかNoSQLとかがでてきていろいろにぎやかになっているDB業界ですが以下[前回](http://qiita.com/srockstyle/items/8bed9550be75bf2e5e14 "MySQLでマルチマスターレプリケーション")と同文。

さて、今回は準同期レプリケーションです。当初はMySQL6.0からとかいわれてましたが5.5から入りましたね。

## 設定
まずは普通にレプリケーション組んで、設定ファイルにプラグイン読み込むのを記述するだけです。

### マスター
マスターの設定は以下。
plugin-loadとrpl_semi〜〜〜の設定を忘れずに。

```/etc/my.cnf
server-id=1
sync_binlog=1
log-bin=mysql-bin
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10
```

MySQLを起動したら以下のコマンドでレプリケーション用のユーザを作っておきます。

```MySQL
GRANT REPLICATION SLAVE ON *.* TO 'slave-user'@'%' IDENTIFIED BY 'slave-password';
```

あとマスターのログのポジションとログファイル名を控えてください。

```MySQL
show master status;
```



### スレーブ
スレーブの設定は以下。
こちらも同様。プラグインの読み込みと、スレーブなのでread_onlyを忘れずに。

```/etc/my.cnf
server-id=2
sync_binlog=1
log-bin=mysql-bin
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
read_only
```

設定してMySQLを起動したら以下のコマンドでマスターに接続します。

```MySQL
CHANGE MASTER TO MASTER_HOST = '[IPADDRESS]', MASTER_USER = '[USER]', MASTER_PASSWORD = '[PASSWORD]',MASTER_PORT=3306;

start slave;

```

これでレプリケーションが完了です。
確認してみましょう。


## 確認

確認は以下のコマンドでやります。

```MySQL
mysql> SHOW GLOBAL VARIABLES LIKE "rpl%";
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_recovery_rank                  | 0     |
| rpl_semi_sync_master_enabled       | ON    |
| rpl_semi_sync_master_timeout       | 10    |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+
5 rows in set (0.01 sec)
```


```MySQL
mysql> SHOW GLOBAL VARIABLES LIKE "rpl%";
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_recovery_rank               | 0     |
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
3 rows in set (0.00 sec)

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.00 sec)

```

では楽しい準同期ライフを！
iOS Developer Program　企業の住所変更

※2014/1/24現在です。

##準備
・新しい住所が記載されている登記簿謄本（日本語でOK）
・英語表記の住所

##1.問い合わせ
Apple Developer Program サポートに
住所変更を行いたい旨、伝えます。
https://developer.apple.com/contact/submit.php
RegionはJapan
SubjectはAccount Updates and Renewals

##2.メール返信、アップロード
Appleからメールが届くので、
質問内容への返信と上記で準備したファイルをアップロードします。

###アップロード
登記簿謄本はこちらからアップします。
https://developer.apple.com/membercenter/uploadDocs.action

ブラウザは必ずSafariとの記述がありました。（他のブラウザで試していません）
アップロード制限があり、2MBを超えるとエラーになる可能性との記述がありました。（試していません）
アップローダーを利用する際は、必ずアカウントのApple IDの必要があります。

###メール返信
下記の確認事項を質問をされますので、
英語で回答。
１）御社の企業は新しい国へ移転されましたか？
２）御社の企業は新しい国の税務登録番号をお持ちですか？

国内での住所変更の場合、
移転していない、持っていない
で問題ないと思います。
Xcodeの補完を柔軟にするplugin "Fuzzy Autocomplete for Xcode"

**Xcode 5 が前提**

Xcode の補完は割と速くて優秀だが、 Objective-C はとにかくクラス名やメソッド名が長い。

そこで Fuzzy Autocomplete for Xcode を使って、より少ない入力で補完機能を使う。

## Fuzzy Autocomplete for Xcode

Github
https://github.com/chendo/FuzzyAutocompletePlugin

## 準備

Github からクローンしてきて、Xcodeでビルドするだけ。

```shell-session:
$ git clone https://github.com/chendo/FuzzyAutocompletePlugin.git
$ cd FuzzyAutocompletePlugin
$ open FuzzyAutocomplete.xcodeproj
```

ビルドが完了すると
`~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/FuzzyAutocomplete.xcplugin`
が作成される。

自動でpluginディレクトリに突っ込んでくれてるので、Xcode を再起動するだけ。

## 使い方

公式の例だと、 `disone` と入力するだけで補完候補の `dispatch_once` が、候補として選択されている状態になる。

他に、 `NSLocalizedString` であれば、 `nslst` と入力するだけで出てくるというように、入力順さえ一致していれば、途中は省いても構わないということがわかるはず。

上手く説明できないが、使ってみると、どれだけ便利かがすぐにわかるはず。

様々な環境において、このような補完に頼りまくりなので、この plugin は非常に有り難い。
【raspberry-pi】nginx + passenger + node.js 環境作成メモ (2)


[【raspberry-pi】nginx + passenger + node.js 環境作成メモ (1)](http://qiita.com/daisuke0604/items/3918b8b4ff227fb3d048)の続き

## node.js インストール

* [nodebrew](https://github.com/hokaccha/nodebrew)を使用
* [http://nodejs.org/dist/](http://nodejs.org/dist/)を確認して、linux-arm-pi のパッケージが置いてあるバージョンだと install-binary できて早い
* passengerから実行したときに node が見つからない、となったので /usr/local/bin にシンボリックリンクを作成した

```shell-session
$ cd /usr/local/bin
$ sudo ln -s ~/.nodebrew/current/bin/node .
```

## テストアプリ

```shell-session
$ mkdir passenger_node_test
$ mkdir passenger_node_test/public
$ mkdir passenger_node_test/tmp
$ cd passenger_node_test
$ vi app.js
```

```js:app.js
var http = require('http');
var server = http.createServer(function(req, res) {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end("hello world!\n");
});
server.listen(3000);
```

## nginx設定

```nginx:/opt/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  xxx.xxx.jp;

    location / {
        root   html;
        index  index.html index.htm;
    }

    location /test {
        root /home/pi/projects/passenger_node_test/public;
        passenger_enabled on;
    }
}
```

テストアプリは上記設定で動作することを確認した。
socket.ioを使用したアプリだと、サーバールートへ配置した場合は動作するが、サブディレクトリへの配置ではうまくいかない。
やり方はあるようだが面倒くさそう。

【追記】
別ポートで動かすのがとりあえず楽そう。

```nginx
server {
    listen 8000;
    root /home/pi/projects/socket-io-sample/public;
    passenger_enabled on;
}
```
Win+Rで何でもかんでも起動する

ファイル名を指定して実行できるのは `cmd` や `calc` だけではありません。
`C:\Windows` にアプリのショートカットを置いておけば簡単に起動することができます。

サンプルにvimを置いてみます。
![WS000048.png](https://qiita-image-store.s3.amazonaws.com/0/19374/9494f94f-1aab-26af-46c6-0f8b51ad5691.png)

ショートカットをコピーしました。
![WS000049.png](https://qiita-image-store.s3.amazonaws.com/0/19374/92e16e2c-9fc7-ebb5-8892-9ba6340bc7bd.png)

名前を変えましょう。ここの名前が「ファイル名を指定して～」で入力する名前になります。
![WS000050.png](https://qiita-image-store.s3.amazonaws.com/0/19374/9ebd0589-e26b-840a-530f-2b77ca9ae49c.png)

起動するか確認してみましょう。
![WS000051.png](https://qiita-image-store.s3.amazonaws.com/0/19374/a74f5e6e-54a1-befb-ec0d-2a565b2d5a29.png)

起動しました。
![WS000052.png](https://qiita-image-store.s3.amazonaws.com/0/19374/c844985b-7c82-f86c-563a-71fc47c0058c.png)
CentOSでMySQL5.5いれてマルチマスターレプリケーション組むまで


## MySQL使ってますか？
近年はMariaDBとかMongoDBとかNoSQLとかがでてきていろいろにぎやかになっているDB業界ですが、

**「わたしのことは嫌いになってもMySQLのことは嫌いにならないでください！」**

MySQLの5.5使ってマルチマスターレプリケーション組むとこまでを久々にやったので書いてみます。

## CentOS6.5にMySQL5.5を入れる
以下のコマンドでまずはリポジトリ追加しましょう。

```Bash
## EpelとRemiを入れる
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

そのあとyumでRemiリポジトリ指定でMySQL関連のソフトを一気にいれます。

```Bash
## MySQLの5.5をremiから
yum --enablerepo=remi install mysql-server mysql mysql-libs mysql-devel
```

これでインストールは終わりです。もっと何かしたかったですか？　ゴメンナサイ！　これだけです！

## レプリケーションの設定
じゃあさっそくレプリケーションを組んでいきましょう。
今回はマルチマスターを作りたかったので、マルチマスターレプリケーションを作ります。セミシンクロナイズ（準同期）レプリケーションについてはまた別記事で書きますね。

### マスター1側
マスター1側のmy.cnfは以下。

```my.cnf
[mysqld]
server-id = 101
log-bin = /var/lib/mysqllogs/bin-log
auto_increment_increment=5
auto_increment_offset=1
```

### マスター2側
次にマスター2のmy.cnfは以下

```my.cnf
[mysqld]
server-id = 102
log-bin = /var/lib/mysqllogs/bin-log
auto_increment_increment=5
auto_increment_offset=2

```

### マスターホストの指定方法

ちなみ普通CentOSでyumでMySQLいれると5.1系が入りますが、5.1系でレプリケーション組むことになれちゃっているひとは5.5、5.6にしたら注意です。
5.5以降から設定ファイルに

```my.cnf
master-host= [もう一台のサーバのIP]
master-port=3306
master-user=[スレーブ用のユーザ]
master-password=[パスワード]
```
を書けなくなりました。
MySQL起動後にchange master to〜〜〜を使います。

```MySQL
CHANGE MASTER TO
MASTER_HOST = '{MASTERHOSTNAME}', 
MASTER_USER = '{MASTERUSERNAME}', 
MASTER_PASSWORD = '{MASTERPASSWORD}'
MASTER_PORT={CONNECTPORT};
```

### 共通コマンド

以下を実行します。

```MySQL
## スレーブユーザの登録
GRANT REPLICATION SLAVE ON *.* TO 'slave-user'@'%' IDENTIFIED BY 'slave-password';

## マスターの指定
CHANGE MASTER TO MASTER_HOST = '[IPADDRESS]', MASTER_USER = '[USER]', MASTER_PASSWORD = '[PASSWORD]',MASTER_PORT=3306;

## スレーブの開始
start slave;
```

これでレプリケーションが開始されます。

## 確認方法
片方でテーブル作成、もう片方でinsertなどをやってみるとよいと思います。あとどうしてもpositionがずれるとかそういうトラブルがある場合は、一度データ移動して「reset slave」をかけるとうまく行きます。またその際はコピーされるDBの更新処理をとめるのも忘れずに。

では楽しいMySQLライフを！
使ったら便利だったconsole.countとconsole.dir

※ 画像はchromeでの結果

# console.count

出現回数を教えてくれる。

![odd.png](https://qiita-image-store.s3.amazonaws.com/0/14471/a4775d51-0516-570a-a747-c07d3a877b4a.png)

# console.dir

`console.log`とは異なりDOM表示してくれる。

![console.png](https://qiita-image-store.s3.amazonaws.com/0/14471/7f43d2ac-217b-46b8-c98a-12f23bc69770.png)


# その他

あまり使ってないが、`console.assert`、`console.profile`、`console.time`も便利。
EclipseでPlay2のソース参照ができない場合

いろんなところの説明だと

`eclipse with-source=true`

すれば勝手にやってくれるとあるが、なぜか自分の環境ではできなかった。
その場合は、
{$Playインストールパス}/framework/src
を自力で紐付けてみるとちゃんと表示される。

これで良いかはわからない。
Scala: コンストラクタのvalのありなし


| class | valありなし | |
|-------|--------|-------------|
| class | valなし | メンバにならない |
| class | valあり | メンバになる |
| case class | valなし | メンバになる |
| case class | valなし | メンバになる |


# valなし

```scala
class Book(title:String, authors: String) {
	def info = s""""${title}" is written by ${authors}"""
}

val book = new Book("Programming in Scala", "Martin Odersky, Lex Spoon and Bill Venners")
println(book.info) // "Programming in Scala" is written by Martin Odersky, Lex Spoon and Bill Venners
println(book.title) // error: value title is not a member of this.Book```

# valあり

```scala
class Book(val title:String, val authors: String) {
	def info = s""""${title}" is written by ${authors}"""
}

val book = new Book("Programming in Scala", "Martin Odersky, Lex Spoon and Bill Venners")
println(book.info) // "Programming in Scala" is written by Martin Odersky, Lex Spoon and Bill Venners
println(book.title) // Programming in Scala```

# case class + valなし

```
case class Book(title:String, authors: String) {
	def info = s""""${title}" is written by ${authors}"""
}

val book = new Book("Programming in Scala", "Martin Odersky, Lex Spoon and Bill Venners")
println(book.info) // "Programming in Scala" is written by Martin Odersky, Lex Spoon and Bill Venners
println(book.title) // Programming in Scala
```

# case class + valあり

```
case class Book(val title:String, val authors: String) {
	def info = s""""${title}" is written by ${authors}"""
}

val book = new Book("Programming in Scala", "Martin Odersky, Lex Spoon and Bill Venners")
println(book.info) // "Programming in Scala" is written by Martin Odersky, Lex Spoon and Bill Venners
println(book.title) // Programming in Scala
```