OmniAICreator/Qiita-1.07M huggingface dataset:
sshのエスケープシーケンス

ssh中にEnterキー押して、`~`を押す
`~?`で一覧表示。
`~^Z`でバックグラウンドにできるのが便利そうだ

```bash:
~?
Supported escape sequences:
 ~.   - terminate connection (and any multiplexed sessions)
 ~B   - send a BREAK to the remote system
 ~C   - open a command line
 ~R   - request rekey
 ~V/v - decrease/increase verbosity (LogLevel)
 ~^Z  - suspend ssh
 ~#   - list forwarded connections
 ~&   - background ssh (when waiting for connections to terminate)
 ~?   - this message
 ~~   - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)
```

あとで[man](http://net-newbie.com/linux/misc/ssh.1.html)読む。
適切な背景色を自動で求める


ユーザが任意の画像をアップロードでき、その画像を固定サイズの領域に入れる場合、アスペクト比が一致しません。その場合、固定サイズの領域に画像に合う背景色を入れたいケースがあります。

(iTunesのアルバム一覧からアルバムを選択した時に表示されるアレと似たような話です。)

##テスト画像

<img width="400" src="http://www.city.hiratsuka.kanagawa.jp/common/100042897.jpg"/>

##白背景の領域に配置したケース
![test1.png](https://qiita-image-store.s3.amazonaws.com/0/3057/12fc62d0-6fe5-6a27-3e8e-eeb0d76c648a.png "test1.png")

正方形の領域に画像を設定すると、アスペクト比が合わないため、当然ながら上下に白い帯が出ます。

##画像に合わせた背景色の領域に配置したケース

![test2.png](https://qiita-image-store.s3.amazonaws.com/0/3057/7f796b72-68d7-9408-4646-a480703e95f6.png "test2.png")

画像によりますが、白背景よりも違和感が少ないです。

##求め方

以下のコマンドを実行します。input imageに対象のファイル名を指定します。

```
convert <input image> -resize 200x200! +dither -colors 16 png:- | convert - -alpha set -region 198x198+1+1 -alpha transparent +region png:- | convert - -format %c histogram:info:- | grep ",255)" | sort -r | head -n 1 | grep -E -o "#[0-9A-F]+"
```

結果は

```
#001B65
```

のように出力されます。

##何をやっているか

画像を16色に減色し、サイズを200x200にリサイズします。そして(1, 1)から(198, 198)までのピクセルを全て透明にします。4辺のピクセルだけが残るため、その4辺のピクセルのヒストグラムを取得して一番多く使われている色を抽出しています。

リサイズする際のサイズや、減色する際の色数を調整すると、もっと好みに合わせられるかもしれません。上記例ではリサイズ時にアスペクト比が変わっているため、縦のピクセルと横のピクセルで重みを変えないと公平な色の算出にはなっていません。
Macにインストールしているもの_201403


「家で使ってたあれ、会社でも使いたいけど名前なんだっけ、、、」と思う事がちょくちょくあります。なので、家で使っているMacのアプリを記録しておきます。

Cocoaアプリケーション
----
~/Applications は、homebrew のbrew-cask にてインストールしたアプリケーションが入ります。

```
macmini:~ tak$ ls ~/Applications/
Alfred 2.app		ClamXav.app		Gimp.app		Mou.app			Sublime Text 2.app
Alfred Preferences.app	Emacs.app		Kobito.app		Skitch.app
CheatSheet.app		Evernote.app		LICEcap.app		SourceTree.app
macmini:~ tak$ ls /Applications/
App Store.app		Dictionary.app		Launchpad.app		Reminders.app		Unity
Automator.app		Dropbox.app		Mail.app		Safari.app		Utilities
Calculator.app		FaceTime.app		Maps.app		ScanSnap		Xcode.app
Calendar.app		Font Book.app		Messages.app		Stickies.app		iBooks.app
Chess.app		FormatMatch.app		Mission Control.app	SugarSync.app		iTunes.app
Chocolat.app		Game Center.app		Notes.app		System Preferences.app
Contacts.app		Image Capture.app	Photo Booth.app		TextEdit.app
DVD Player.app		KeyRemap4MacBook.app	Preview.app		Time Machine.app
Dashboard.app		Keynote.app		QuickTime Player.app	TotalTerminal.app
macmini:~ tak$ 
```

Homebrew
----
```
macmini:~ tak$ brew cask list
alfred		    emacs		kobito		    skitch		totalterminal
cheatsheet	    evernote		licecap		    sourcetree
clamxav		    keyremap4macbook	mou		    sublime-text
macmini:~ tak$ brew list
brew-cask	pkg-config
macmini:~ tak$ 
```

gem
---

```
*** LOCAL GEMS ***

activesupport (3.2.15)
brewdler (0.5.0)
CFPropertyList (2.2.0)
claide (0.4.0, 0.3.2)
cocoapods (0.29.0, 0.27.1)
cocoapods-core (0.29.0, 0.27.1)
cocoapods-downloader (0.3.0, 0.2.0)
cocoapods-try-release-fix (0.1.1)
colored (1.2)
commander (4.1.5)
escape (0.0.4)
fuzzy_match (2.0.4)
highline (1.6.20)
i18n (0.6.5)
json_pure (1.8.1)
libxml-ruby (2.6.0)
multi_json (1.8.2)
nap (0.5.1)
nokogiri (1.5.6)
open4 (1.3.0)
rake (10.1.0)
sqlite3 (1.3.7)
xcodeproj (0.14.1)
macmini:~ tak$ 
```
Nitrous.ioでシステムのtimezoneを変更したい

【やりたいこと】クラウド開発環境Nitrous.ioでシステムのtimezoneを変更したい。
具体的にいうと、デフォルトのUTCをJSTに変更したい。

----
Nitrous.ioが提供する開発環境のOSはDebian wizzy/sid(2014/03/09現在)
開発環境で使用できるユーザ`action`には`/etc/timelocal`を変更する権限がない。とりあえずタイムゾーンを定義する環境変数TZを`export TZ=Asia/Tokyo`で設定する。環境変数はログアウトすれば無効になる（＝再ログイン時にはUTCに戻ってしまう）ので、とりあえずシェルのプロファイル（`.bash_profile`とか）に`export TZ=Asia/Tokyo`を書いておく。これで開発環境内のシステムのtimezoneはJSTをキープできると思う。

----
webアプリやDBMSの各自でtimezoneを設定して、システム日付を使わないようにすればいいんだけど、自作でないプラギンとかいれてるとどっかで怪しい動きをしそう…って懸念があるので
ssh-copy-idで簡単に公開鍵を登録する


```sh
$ cd ~/.ssh/

# 鍵を作る。作っている人はもちろん不要。
$ ssh-keygen -t rsa


$ vim ~/.ssh/config
# 以下を追加
Host hoge001
    HostName hoge001.jp
    User hogeuser

# 鍵を送る＆設定
$ ssh-copy-id hoge001
# ※もし別の鍵を指定したい場合は以下のようにする
$ ssh-copy-id -i ~/.ssh/hoge_id_rsa.pub hoge001

$ ssh hoge001
```

おわりー。




#### thanks
- http://d.hatena.ne.jp/ksaito11/20090227
- http://d.hatena.ne.jp/yosi_zou/20101205/1291481477
[Objective-C] NavigationBarにActivityIndicatorを表示する


NavigationBar部分に検索中などに使うインジケータを表示する方法のメモ。
まぁ標準的な機能だけでできるのだけど、意外と記事が見つからなかったのと、色々問題が出るケースがあるみたい。（それについては[こちらの記事を参照](http://akisute.com/2010/04/uibarbuttonitem.html)）

UIBarButtonItemの`initWithCustomView:`メソッドを使うだけ。

簡単なのでコードだけ。

```objc
UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[activity startAnimating];

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:activity];
```
JenkinsとGerritの連携で"Label:Verified"が 無くて困った話


Gerrit 2.8.1のVerifiedラベルについてのお話です。

Jenkinsの[Gerrit-Triggerプラグイン](https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger)で、Verifiedラベルのアクセス権設定が必要ですが、Gerrit 2.7以降をクリーンインストールするとVerifiedラベルが無い、ということで調査しました。

Verifiedラベルは、以下の操作で追加できます。
詳細は[Gerrit Code Review - Review Labels](https://gerrit-review.googlesource.com/Documentation/config-labels.html)というドキュメントに記載があります。

```shell
git clone $host:All-Project.git

cd All-Projects.git 
vi project.config 
git commit -a -m "Add verified label" 
git push origin HEAD:refs/meta/config 
```

上記のAll-Projects.git/project.configは以下のように追記。

```diff
--- a/project.config
+++ b/project.config
@@ -56,3 +54,8 @@
        value =  0 No score
        value = +1 Looks good to me, but someone else must approve
        value = +2 Looks good to me, approved
+[label "Verified"]
+       function = MaxWithBlock
+       value = -1 Fails
+       value =  0 No score
+       value = +1 Verified
```

ちなみに、Gerritの最新コードでは、こんな[commit](https://gerrit.googlesource.com/gerrit/+/31f2ba05e127e84ed2dc183decd3484d5b97917e%5E%21/)が入っています。(ソースコード詳細は追っていませんが、初期化時にVerifiedラベルを追加するかどうか選択できそうですね。)

おしまい。
rubymotionで動的にtabBarを表示する方法

Safariのブラウザのようにスクロールの状況に応じて、tabBarを隠したいと思い実装した際のメモ。

※初歩的なミスもありかなり手こずりました。。。
rubymotionで実装されたソースは無かったので、参考になれば m(_ _)m

とにかくまずはググってみるという事で、下記がヒット。

[Hide UITabBar of UITabBarController with animation]
(http://www.developers-life.com/hide-uitabbarcontrolleruitabbar-with-animation.html)

[UITabBarControllerのTabBarを非表示にする](http://ssdkfk.wordpress.com/2013/07/17/tabbar%E3%82%92%E9%9D%9E%E8%A1%A8%E7%A4%BA%E3%81%AB%E3%81%99%E3%82%8B/)

どうやら、問題になりそうなのは
self.tabBarController.tabBar.hidden = true と非表示にしたとしても、tabBarがあった場所に黒いブロックが残るらしい。

試しにやってみると、、、
![tabbar_pic.png](https://qiita-image-store.s3.amazonaws.com/0/5365/4c16f2e3-1422-d76e-511b-e316549c0e11.png)

画像のような感じで確かに黒い部分が残った。
なので上記を参考にしながら、rubymotion用に書いてみた。

※スクロールの上下の感知は下記を参考にしてください。
[[iOS SDK] UITableView で、上下のスクロール方向を感知する]
(http://rakuishi.com/archives/3596)

UITabBarControllerを継承したサブクラスに下記を実装。
(アニメーション使っていい感じに消えるようにしてます)

```hoge_controller.rb
class HogeController < UITabBarController

  def showTabBar(isShow)
    UIView.animateWithDuration(0.2,
      animations: lambda { change_subview_size(isShow) },
      completion: lambda { |finished| self.tabBar.hidden = !isShow }                                                   
    )   
  end   
  #self.tabBar.hidden = !isShow は無くても問題なし
  #メソッドを呼び出すかどうかの判定でself.tabBar.hidden?を使っているため実装している

  def change_subview_size(isShow)
    appHeight = UIScreen.mainScreen.bounds.size.height
    self.view.subviews.each do |view|
      viewRect = view.frame
      resetVal = isShow ? (appHeight - 49) : appHeight
      if view == self.tabBar
        viewRect.origin.y = resetVal
      else
        viewRect.size.height = resetVal
      end
      view.setFrame(viewRect)
    end
  end 
end
```

これでいけるかなーと思ったが、相変わらず黒いブロックが消えない。。。
replで値をみたり、ログを確認してみるも原因がつかめない。。。

原因は、TableViewControllerを継承したもので実装していたのが原因でした。
[TableView のサイズを変更する]
(http://landau-post-that.blogspot.jp/2012/02/tableview.html)

TableViewのフレームサイズを変える際は、ViewControllerの上にtableviewをaddSubviewさせないと変更できないらしい。。。

なんと(´д｀)(´д｀)(´д｀)

実際にUIViewControllerを継承させたものにtableviewをaddSubviewすると上手くいきました。

※やり方がが分からない方は下記が参考になるかと。
[UIViewにUITableViewを貼付ける]
(http://ameblo.jp/iichin0708/entry-11351848328.html)

何はともあれ、上手くいってよかった。
多対多テーブルでMySQLでLEFT JOINして中身確認の備忘録

ちょっと長いけどこんな感じです

videos基準
`select videos.id, videos.title, tags.id, tags.name from videos left join tags_videos on videos.id=tags_videos.video_id left join tags on tags_videos.tag_id=tags.id;`

tags基準
`select videos.id, videos.title, tags.id, tags.name from tags left join tags_videos on tags.id=tags_videos.tag_id left join videos on tags_videos.video_id=videos.id;`
NodObjCをnode-webkitで動かす

## node-webkit-v0.8.5編

v0.9系はnode-ffiがビルドがフツーのnode.jsのv0.11系でNGなので、ハードル高いそう。


### nw-gyp

```
npm install -g nw-gyp
```

### NodObjCをnpmでフツーに入れる

NodeObjCはカレントにnode_modulesディレクトリが無いと、
変な場所にインストールされることがあったので、予めnode_modulesディレクトリを
作っておく。

```
mkdir node_modules
npm install NodObjC
```

#### Postgres.appを入れてる場合

PATHに

/Applications/Postgres.app/Contents/MacOS/bin/

を加えている場合、Postgres.appのxml2-config
が使われると、ビルドに失敗するので、
/usr/bin/xml2-configが使われるようにする。

```
which xml2-config
```

### nw-gypでconfigureとbuild

#### libxmljsをnode-webkit向けにビルド

xml2-configを/usb/binのものを使えば問題なくnode-webkit向けにビルド出来た。

```
cd node_modules/NodObjC/node_modules/libxmljs
nw-gyp clean
nw-gyp configure --target=0.8.5 --arch=ia32
nw-gyp build
```

#### node-ffiをnode-webkit向けにビルド

##### libffi-config.shを編集して32ビット用のバイナリを生成させる

内部でlibffi.aを静的にリンクするのだが、これがgyp管理外の為、nw-gyp configの際の--arch=ia32の指定が効かないので、そのままだと64ビット用のバイナリが作られてしまう。
その為、個別に対応する必要がある。

```
cd deps/libffi
make clean distclean >node_ffi_configure.out 2>&1
export CFLAGS="-arch i386"
sh configure --with-pic --enable-static --disable-shared --disable-builddir >>node_ffi_configure.out 2>&1
cd ../..
```

```
cd ../node-ffi
nw-gyp clean
nw-gyp configure --target=0.8.5 --arch=ia32
nw-gyp build
```

```
SOLINK_MODULE(target) Release/ffi_bindings.node
ld: warning: could not create compact unwind for .LFB3: non-standard register 5 being saved in prolog
  SOLINK_MODULE(target) Release/ffi_bindings.node: Finished
```

i386用のlibffi.aができていない場合、以下のように表示される。

```
SOLINK_MODULE(target) Release/ffi_bindings.node
ld: warning: ignoring file /Users/nanashi/work/tmp/node_modules/NodObjC/node_modules/node-ffi/deps/libffi/.libs/libffi.a, file was built for archive which is not the architecture being linked (i386): /Users/nanashi/work/tmp/node_modules/NodObjC/node_modules/node-ffi/deps/libffi/.libs/libffi.a
  SOLINK_MODULE(target) Release/ffi_bindings.node: Finished
```


### 動かす

NSAutoreleasePool等は指定するとデバッガが起動できない。
node-webkit側でこの辺りを処理しているのだろうから余計なことはしないｗ。


```
cd ../../../../
~/Downloads/node-webkit-v0.8.5-osx-ia32/node-webkit.app/Contents/MacOS/node-webkit .
```

#### index.html

```
<!DOCTYPE html>
<html>
    <title>Hello,Cocoa</title>
    <h1>Hello NodObjC</h1>
    We are using node.js <script>document.write(process.version)</script>.
<div id="hello"></div>
    <script>
      var $ = require('NodObjC');
      $.framework('Foundation');
      $.framework('Cocoa');
      
      // NSString from a JS String when an Objective-C class method requires one.
      var string = $.NSString('stringWithUTF8String', 'Hello Objective-C World!');
      
      // Print out the contents (calling [string description])
      console.log(string.toString());
      console.log(string);
      //   → Prints "Hello Objective-C World!"
      document.getElementById("hello").innerHTML=string;
    </script>
</html>
```

package.json

```
{
  "name": "nw-demo",
  "main": "index.html"
}
```
fbxファイルからAnimationClipを取得する 

fbxファイルからAnimationClip取得する方法がググっても見付けきれなかったのですが
以下のように取得対象のfbxファイルのみをLoadした状態にして、FindObjectsOfTypeAllで取り出すという
力技で取得することができた。(もっとスマートな方法があるのかも...)

```csharp
public List<AnimationClip> GetAnimationClipInFbx(string iFbxFileName)
{
	// 現在のLoad中のAnimationClipをUnloadし、何もLoadしていない状態にする
	Resources.FindObjectsOfTypeAll<AnimationClip>().ToList().ForEach(x => Resources.UnloadAsset(x));

	// AnimationClipを取り出したいFbxファイルをLoadする
	string aFbxFilePath = Application.dataPath + "/Resources/Models/" + iFbxFileName;
	aFbxFilePath = aFbxFilePath.Replace(".fbx", "").Replace("\\", "/");
	Resources.LoadAll(aFbxFilePath);

	// 現在のLoad中のみのAnimationClipを返す
	var aAnimationClips = Resources.FindObjectsOfTypeAll<AnimationClip>();

	List<AnimationClip> aAnimationClipList = new List<AnimationClip>();
	foreach (var aAnimationClip in aAnimationClips)
	{
		if (Regex.IsMatch(aAnimationClip.name, @"^Take\d*"))
		{
			aAnimationClipList.Add(aAnimationClip);
		}
	}
	return aAnimationClipList;
}
```
Mac OS X Marvericks (10.9.2)にhomebrewでPyQt5をインストールする

# はじめに

[PyQt](http://www.riverbankcomputing.co.uk/software/pyqt/intro)とは，Digia社(かつてはNokiaでしたが，2012/8/9にDigiaに売却)の[Qtアプリケーションフレームワーク](http://qt-project.org/)のPythonバインディングです．[PyQt5](http://www.riverbankcomputing.co.uk/software/pyqt/download5)は，Qt v5のサポートになります．

本ページでは，2014年3月時点で最新版のMac OS X Marvericks (10.9.2)に対して，[homebrew](http://brew.sh/)を使ってPyQt5をインストールする手順を紹介します．

# インストール手順

```shell-session
# 1. PyQt5 の依存である sip をインストール
brew install sip

# 2. PyQt5 を python2.7 でビルド，インストール (python3 だとエラーになります)
brew install pyqt5 --with-python --without-python3

# 3. PYTHONPATH の追加
export PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH
```
コルーチンについて

シングルスレッド環境でマルチスレッドっぽく動作できる
コルーチンについての理解度が低かったので挙動を確認してみた

## コルーチンの特徴
コルーチンについては、通常の関数のとは異なり、
処理を途中で抜けて任意のタイミングで中断部分から処理を再開することが特徴です。
yield return が呼び出されると、その時点で関数は処理を中断して制御を返します。
<del>シングルスレッドの環境で擬似的にマルチスレッドを実現するための手段です。</del>

## 使いどころ
遅延評価をする場合に使用するので、ゲームでは状態シーケンス管理になどに使えそう。
バトルに入る前では、フィールドオブジェクト生成 → バトル初期値設定 → プレイヤー、敵オブジェクトを生成
→ バトルシーントランザクション → バトル開始 みたいな感じで
    
## UnityのStartCoroutineを使用しての動作確認

以下の実行結果より処理を途中で抜けて
任意のタイミングで中断部分から処理を再開していることがわかります

```csharp
void Start () {
    StartCoroutine("Coroutine1");
}

void Update () {
    Debug.Log ("Update.");
}

public IEnumerator Coroutine1()
{
    Debug.Log("Start-1");
    Debug.Log("--------");
    yield return StartCoroutine("Coroutine2");
    Debug.Log("--------");
    Debug.Log("Start-2");
    yield return null;
    Debug.Log("Start-3");
}

private IEnumerator Coroutine2()
{
    Debug.Log("Nest-1");
    yield return null;
 
    Debug.Log("Nest-2");
    yield return null;
 
    Debug.Log("Nest-3");
}

// 実行結果
//
//   Start-1
//   --------
//   Nest-1
//   Update.
//   Update.
//   Nest-2
//   Update.
//   Nest-3
//   --------
//   Start-2
//   Update.
//   Start-3
//   Update.
//   Update.
//   :
//   :
```
Windowsでのvagrant環境構築

Windowsでvagrant環境を作るためのメモ。

# インストール

## Oracle VM VirtualBox

[Download VirtualBox](https://www.virtualbox.org/wiki/Downloads)よりダウンロードしてインストールしてください。

## vagrant

Windowsの場合msi形式で配布されています。
[DOWNLOAD VAGRANT](http://www.vagrantup.com/downloads.html)よりダウンロードしてインストールしてください。
デフォルトだとvagrantのboxが`~/.vagrant.d`に作成されます。
別のディレクトリに変更したい場合は`$VAGRANT_HOME = /home/hoge/vagrant`にように`.bashrc`へ追記してください。

# boxの追加

インストール完了後は、boxがインストールされていないので追加する必要があります。
* [vagrantbox.es](http://www.vagrantbox.es/)
* [Vagrant Base Box Downloads](http://nrel.github.io/vagrant-boxes/)

にお好みのboxを見つけたら以下のコマンドでboxを追加してください。
容量が大きいので時間はちょっとかかります。

```
vagrant box add centos65 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.5-x86_64-v20140110.box

```

# boxの起動

`vagrant init`でVagrantfileを生成します。
Vagrantfileの`config.vm.box="base"`を`vagrant box list`で出てくるものに書き換えます。
その後`vagrant up`と叩けばboxが起動します。

# boxの利用

`vagrant ssh`コマンドでboxのシェルを叩くことができるようになります。
Windowsでmintty環境だと以下のメッセージが出て端末がうまく表示されません。
` Pseudo-terminal will not be allocated because stdin is not a terminal.`

その場合は
`vagrant ssh-config >> ~/.ssh/config`でsshの設定を行い
`ssh default`でboxに接続できます。
mysql_multi「を・・使わない」で同一サーバ内に複数インスタンスを立ち上げる方法

oracleの [mysqld_multi — 複数のMySQL サーバ管理](https://dev.mysql.com/doc/refman/5.1/ja/mysqld-multi.html "mysqld_multi — 複数のMySQL サーバ管理")の方法はスタンダードな複数起動の方法なのですが、これを運用でやると、むちゃくちゃ使いづらい。あくまでも個人レベルの使いづらいなので、大半の方は使いやすいのかもしれないが、個人的にはテスト環境と本番環境を可能な限り近い設定にしたい場合のmy.cnfの設定が本番と乖離しすぎていてしんどい。。なので、もっと簡単な方法で複数起動する運用にしている。まあ、結果としてはやっていることは同じなんですけどね。^^;

以下の３つの設定を行えば、ポート毎の複数起動ができます

### 1. ポート毎のデータディレクトリを作成する

ポートの名前でデータディレクトリを作成します。

```
# mkdir -p /var/lib/mysql/{3306,3307,3308} 
# chown -Rf mysql:mysql /var/lib/mysql/{3306,3307,3308} 
# su - mysql

$ mysql_install_db --datadir=/var/lib/mysql/3306
$ mysql_install_db --datadir=/var/lib/mysql/3307
$ mysql_install_db --datadir=/var/lib/mysql/3308
```

### 2. my.cnf をポート毎に設定する

私はこんな感じでmy.cnf + ポート番号のファイルを作成しております

```
# ll /etc/my.cnf.*                                                                                     
-rwxr-xr-x 1 root root 43073 Jan  6 04:54 /etc/my.cnf.3306
-rwxr-xr-x 1 root root 43047 Nov 29 11:04 /etc/my.cnf.3307
-rwxr-xr-x 1 root root 43047 Nov 29 11:04 /etc/my.cnf.3308
```

上記ファイルでポートとソケットの部分はユニークな値にします。私は、3306,3307,3308にしました。

```
# generic configuration options
port            = 3306
socket          = /var/lib/mysql/3306/mysql.sock
```

### 3. ポート毎にMySQLを起動します

起動は、以下のように3306,3307,3308それぞれ起動します。

```
# mysqld_safe --defaults-file=/etc/my.cnf.3306 --datadir=/var/lib/mysql/3306 --socket=/var/lib/mysql/3306/mysql.sock --port=3306 &

# mysqld_safe --defaults-file=/etc/my.cnf.3307 --datadir=/var/lib/mysql/3307 --socket=/var/lib/mysql/3307/mysql.sock --port=3307 &

# mysqld_safe --defaults-file=/etc/my.cnf.3308 --datadir=/var/lib/mysql/3308 --socket=/var/lib/mysql/3308/mysql.sock --port=3308 &
```

以上で、３ポートでそれぞれプロセスが起動したかと思います。尚、当該ポート毎のインスタンスに接続する際は、

* DBサーバローカルから接続する場合

```
mysql -u root -p -S /var/lib/mysql/3306/mysql.sock
```
みたいな感じで
* リモートから接続する場合

```
mysql -u root -p -h xxx.xxx.xxx.xxx -P 3306
```
みたいな感じで行います。

尚、ポート毎に、インスタンスを停止する場合は、

```
mysqladmin -u root -p -S /var/lib/mysql/3306/mysql.sock shutdown
```
にして実行しますと、指定したポートのインスタンスが停止します。

なれると簡単なのでぜひお試しアレ。
Socket.IO 1.0はロングポーリングで接続してからWebSocketに切り替えるアップグレード方式になるそうです

# はじめに
[Engine.IOのGoals](https://github.com/LearnBoost/engine.io#goals)にWebSocketとロングポーリングの切り替え方式をSocket.IO 0.9から変更するという話が書いてあって、興味深かったのでメモしておきます。

その前に前提知識のメモ。

* Engine.IOはSocket.IOと同じ作者が作っている。githubアカウントは https://github.com/LearnBoost
* 今後リリース予定のSocket.IO 1.0はEngine.IOを利用するようになる。
* Engine.IOは基本機能を提供して、Socket.IOはエラー時に再接続したり、multiplexingしたり実際にアプリケーションに必要な基本的な機能が含まれている。[Can I use engine without Socket.IO ?](https://github.com/LearnBoost/engine.io#can-i-use-engine-without-socketio-)参照。

# WebSocketとロングポーリングの切り替え方式がSocket.IO 1.0では変わる

* Socket.IO 0.9はダウングレード方式。まずWebSocketかFlash Socketを試して、だめならロングポーリングに切り替える。
* Engine.IOとSocket.IO 1.0はアップグレード方式。まずロングポーリングで接続して、その後WebSocketかFlash Socketが使えるなら切り替える。

現状では、多くの企業のファイアウォールでWebSocketがブロックされていたり、アンチウィルスソフトでブロックされたりとWebSocketが使えないケースが多々あるとのことです。ダウングレード方式だと最初にWebScoketを試して、使えないと判定するまでに10秒程度かかってしまうのでユーザ体験として良くないと。

それよりはまず確実に接続できるロングポーリングで一旦接続して、その後WebSocketが使えると判明したらアップグレードするほうが良いという判断だそうです。

# Node.JSのWebSocket実装の比較記事

あと、[Finding the right Node.JS WebSocket implementation   — Node.js & JavaScript — Medium](https://medium.com/node-js-javascript/b63bfca0539)の記事も非常に詳しくて有用でした。

# 他の言語のWebSocketライブラリもロングポーリングとの切り替えまで面倒見てくれるようになるといいなー

軽く検索した程度なので知らないだけかもしれませんが、rubyとかgoだとWebSocketのライブラリはあるみたいですけど、ロングポーリングとの切り替えまで面倒見てくれるのはまだなさそうです。

Socket.IO 1.0が出てアップグレード方式が良いねという認識が広まって、他の言語でもそういうライブラリが増えるといいなーと思いました。
R でパッケージインストール時に出た「ld: library not found for -lintl」エラーの回避方法

10.8の時は少なくとも使えていたと思うのだが、記憶が定かで無い。。。
R勉強会@福岡でパッケージのインストールをするという場面で、

```r
install.packages('ggplot2')
```

と実行すると

```
ld: library not found for -lintl
```

なんて言ってきて、インストールできないｗ
時間内には解決できず、ようやく見つけた[回避策](http://stackoverflow.com/questions/21370363/link-error-installing-rcpp-library-not-found-for-lintl)
### ~/.R/Makevars
に以下1行を追加(※バージョンは環境によって異なるので、注意)

```
PKG_LIBS=-L/usr/local/Cellar/gettext/0.18.3.2/lib
```

う〜ん長い道のりだったｗ
エラーとなる原因がはっきりとしていないので、ご存知の方いらっしゃれば教えて下さい。
node.jsで1つのvarで複数変数初期化してたら編集ミスで謎のエラーでハマった

[node.jsでローカルディレクトリ配下のHTMLファイルのリストをSJISのCSVで出力するサンプル - Qiita](http://qiita.com/hnakamur/items/8ac2c2dfb2ef82a8fdd5)のサンプルソースを改変してたら、突然[q](https://www.npmjs.org/package/q)のソース内でコールスタックのオーバーフローが発生しました。

```
/Users/hnakamur/mysrc/nodejs-html-filelist-csv-example/node_modules/q/q.js:126
                    throw e;
                          ^
RangeError: Maximum call stack size exceeded
```

正しいソースは

```js:https://github.com/hnakamur/nodejs-html-filelist-csv-example/blob/830944d343712c81b1d0554013dc9671bfbf24e1/index.js#L1-L14
var baseDir = process.argv[2],
    baseURL = process.argv[3],
    outFile = process.argv[4],
    _ = require('underscore'),
    fs = require('fs'),
    path = require('path'),
    Q = require('q'),
    jschardet = require('jschardet'),
    Iconv = require('iconv').Iconv,
    cheerio = require('cheerio'),
    csv = require('csv'),
    scandir = require('scandir').create(),
    officegen = require('officegen'),
    htmlFileExpr = /\.html?$/i;
```

なんですが、コピペ後の編集ミスで

```js
    scandir = require('scandir').create();
    officegen = require('officegen'),
```

とscandirの行の最後がカンマであるべきところがセミコロンになっていました。そのため、officegenとhtmlFileExprがグローバル変数になっていたわけです。それが、どうして```RangeError: Maximum call stack size exceeded```に繋がるのかはよくわかっていませんというか、ややこしそうなので考えていません。

で、原因箇所を特定するために、ソースコードのどこまで実行できたのかを調べようとして、あちこちconsole.log()でデバッグ出力を入れていたのですが、その時も1個のvarで編集の値を初期化していると編集が面倒でした。

```js
var foo = doSomething(),
    bar = doAnotherThing();
```

などとやってるとconsole.log()を入れるためにvarを分けてカンマをセミコロンに変えたりと面倒なわけです。

```js
console.log('before doSomething');
var foo = doSomething();
console.log('after doSomething');
var bar = doAnotherThing();
console.log('after doAnotherThing');
```

最初から

```js
var foo = doSomething();
var bar = doAnotherThing();
```

と書くか、varでは初期化せずに

```js
var foo, bar;

foo = doSomething();
bar = doAnotherThing();
```

と書いておけば、楽だなと思いました。

フロントエンド用にブラウザで動くJavaScriptを書く時はminifyしたときになるべくファイルサイズが小さくなるようにしたいので、1つのvarで複数の変数を初期化する書き方にしたいのは理解できます。

でもNode.jsでJavaScriptを書く時は編集しやすさを優先しても良い気がします。同じJavaScriptで書き方を分けるのはイマイチな気もしますが、どうせ使える関数とか書き方も違うわけですし、Node.js v0.12が出たらyieldが使えるようになってますます違う書き方になるでしょうから、割りきっていい気がします。

Node.jsのソースを見ても https://github.com/joyent/node/blob/22c68fdc1dae40f0ed9c71a02f66e5b2c6353691/lib/stream.js#L24-L25 とか https://github.com/joyent/node/blob/22c68fdc1dae40f0ed9c71a02f66e5b2c6353691/lib/util.js#L32-L35 とかでvarは変数ごとに書いてますね。
ファイルの先頭のrequireが並ぶところはこの書き方がよさそうです。

[JavaScript: The Good Parts](http://www.amazon.co.jp/dp/B0026OR2ZY)でも書かれていますが、JavaScriptの場合は関数の途中にvarを書いても、その変数のスコープは関数の最初からになるので、varは関数の最初に固めて定義するほうが良いというのに私も賛成です。だったら、関数の中では最後の書き方でいいんじゃないかなーと思いました。
Scaloidを使用するにあたっての初歩的なメモ

ちょっとAndroidアプリを作りたくなったけど、javaで書く気がせず

Scaloidを使用することに決めて、とりあえず動かしてみたかったんですが

 [hello-scaloid-sbt](https://github.com/pocorall/hello-scaloid-sbt "hello-scaloid-sbt")　の

`$ sbt android:package`

を実行する際にエラーが出たので、その解決のメモを残します。

#1. ANDROID_HOMEが設定されていない。
コマンドプロンプトにて
`set ANDROID_HOME=【android-sdkのパス】`
で解決。

#2. Platform android-8 unknown in XXXX
Android 2.2(API 8)が入っていないことで怒られているので
おとなしくAndroid 2.2(API 8)を入れて解決。

以上で、自分の環境では
`$ sbt android:package`
を実行できました。
【Unity3D】プラグインを作成せずにActivityのメソッドなどを呼び出す

UnityのAndroidJavaObject, AndroidJavaClassを利用すると、
Unityでサポートしていない操作を呼び出すことが出来ます。

```java
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); 

// 次の2つのメソッドを呼び出している
// File Activity.getFilesDir()
// string File.getCanonicalPath()
string path = UnityActivity.Get<AndroidJavaObject>("getFilesDir").Call<string>("getCanonicalPath");
```
LinuxでシェルスクリプトからOracleに接続する方法

シェルスクリプトからOracleに接続する方法をサンプルに纏めました。
Oracleとの接続にはsqlplusを利用します。
DB切断時にエラーが発生していないか確認する方法も纏めておきました。


```bash:connectsqlplus.sh
#!/bin/sh
. /home/batch_user/.bashrc

# 終了コード：エラー
RESULT_CD_ERR=255

# ログファイル
CURRENT=$(cd $(dirname $0) && pwd)
DB_SYNC_LOG=$CURRENT/log/connectsqlplus.log

# DB接続
CONNECT_DB="connect $ORACLE_USER/$ORACLE_PASS@$DB_HOST:$DB_PORT/$DB_NAME"

#  コミット文
COMMIT_CMD='commit;'

#  SQLファイル実行
EXEC_SQLFILE="@$SQLFILE"

# DB接続 SQLPLUS ここから
sqlplus -s /nolog <<EOF >> $DB_SYNC_LOG

--エラー時の例外処理
whenever oserror exit $RESULT_CD_ERR
whenever sqlerror exit $RESULT_CD_ERR

-- DB接続
$CONNECT_DB
$EXEC_SQLFILE
$COMMIT_CMD
quit
EOF
# DB切断 SQLPLUS ここまで

# DBエラーチェック
if test $? = $RESULT_CD_ERR
then
	echo "`date '+%Y/%m/%d %T %N'` FATAL DB接続時にエラー発生:$RESULT_CD_ERR]"
	echo "`date '+%Y/%m/%d %T %N'` FATAL DB接続時にエラー発生:$RESULT_CD_ERR]" >> $DB_SYNC_LOG
	echo '------------------------------------------------------------------' >> $DB_SYNC_LOG
	exit $RESULT_CD_ERR
fi

```
NSEdgeInsetsとNSValueの変換


UIEdgeInsetsとNSEdgeInsetsはまったく同じ構造体なのだけど、宣言が別々なので困ることがあります。
UIKitのNSValueにはvalueWithUIEdgeInsets, UIEdgeInsetsValueメソッドがあるが、NSEdgeInsetsにはありません。

ハイ、そこでこんなカテゴリを作りました。

```objectivec

+ (instancetype)se_valueWithNSEdgeInsets:(NSEdgeInsets)insets
{
    return [NSValue valueWithBytes:&insets objCType:@encode(NSEdgeInsets)];
}

- (NSEdgeInsests)se_edgeInsetsValue
{
    NSEdgeInsets is = NSEdgeInsetsMake(0, 0, 0, 0);
    [self getValue:&is];
    return is;
}
```

果てしなく使いどころが無いと思います。
POSIX シェルの組み込みコマンド一覧

# 特殊組み込みコマンド

特殊組み込みコマンドは、以下の特性を持つ

* 対応する外部コマンドがなくても必ず実行される
* 同名の関数で動作を上書きできない
* シェルが対話モードでないとき (≒ シェルスクリプトを実行中のとき)、以下のエラーが発生するとシェルは直ちに終了する
 * コマンドの構文誤り
 * リダイレクト失敗
 * 変数代入失敗
* 特殊組み込みコマンドに対して行った変数代入は特殊組み込みコマンド実行終了後も残る

```bash
$ foo=1 eval 'echo $foo' # 特殊組み込みコマンド
1
$ bar=2 cat /dev/null # 普通のコマンド
$ echo foo=$foo bar=$bar
foo=1 bar=
```

特殊組み込みコマンド:

* .
* :
* break
* continue
* eval
* exec
* exit
* export
* readonly
* return
* set
* shift
* times
* trap
* unset

# 準特殊組み込みコマンド

POSIX には「準特殊」なる用語は出てこないが、ここでは便宜上その様に呼んでおく。

準特殊組み込みコマンドは、対応する外部コマンドがなくても必ず実行される。(他の点は普通の組み込みコマンドと同じ)

準特殊組み込みコマンド:

* alias
* bg
* cd
* command
* false
* fc
* fg
* getopts
* hash
* jobs
* kill
* newgrp (注)
* pwd
* read
* true
* type
* ulimit
* umask
* unalias
* wait

(注) 実際に newgrp を組み込みコマンドとして有するシェルは少ない。

# 普通の組み込みコマンド

特殊組み込みコマンドでも準特殊組み込みコマンドでもない組み込みコマンドは、普通の組み込みコマンドである。

普通の組み込みコマンドは、POSIX では「外部コマンドを起動する代りにシェルが直接コマンドの機能を実行することによって高速化を図るもの」との位置付けなので、明確にどのコマンドが組み込みでどれが外部コマンドであるかの規定は無い。これは、厳密には「対応する外部コマンドが存在しなければ組み込みコマンドも存在しないと見做される」ことを意味するが、この点を厳格にチェックするシェルは少ない。

以下に、多くのシェルに共通の組み込みコマンドを挙げる。POSIX の欄のチェックは、POSIX にコマンドの定義があるものを指す。一部のシェルでは、以下のいくつかのコマンドは組み込みコマンドではなくエイリアスである。

|コマンド|POSIX|bash|dash|zsh|ksh|mksh|yash|
|----|-----|----|----|---|---|----|----|
|[      |✓|✓|✓|✓|✓|✓|✓|
|dirs   | |✓| |✓| | |✓|
|disown | |✓| |✓|✓| |✓|
|echo   |✓|✓|✓|✓|✓|✓|✓|
|history| |✓| |✓| | |✓|
|let    | |✓| |✓|✓|✓| |
|local  | |✓| |✓| | | |
|popd   | |✓| |✓| | |✓|
|print  | |✓| |✓|✓|✓| |
|printf |✓|✓|✓|✓|✓|✓|✓|
|pushd  | |✓| |✓| | |✓|
|test   |✓|✓|✓|✓|✓|✓|✓|
|typeset| |✓| |✓|✓|✓|✓|
4インチの端末なのに3.5インチで認識されるトラブル

iOS7では問題ないのに、iOS6の端末でテストすると
4インチの端末なのに3.5インチで認識されて
表示が小さくなる、というトラブルに見舞われました。

原因はlaunch imageの設定でした。

![スクリーンショット 2014-03-08 22.54.30.png](https://qiita-image-store.s3.amazonaws.com/0/32191/968ff1f2-f497-e170-864d-378eb7ee1205.png)

画像の上段iOS7のところにしかlaunch imageを設定していなかったのですが
このような場合、サイズ認識がおかしくなるようです。

launch imageと端末のサイズ認識が関係している事自体初めて知りました。。。

（参考）

 [[Obj-C]iPhone 5(4インチ)とiPhone 4S以下で表示画像を自動で判別させる方法](http://maccle.com/develop-ios-app/how-to-select-suitable-image-for-iphone5/ "[Obj-C]iPhone 5(4インチ)とiPhone 4S以下で表示画像を自動で判別させる方法")
不良セクタの隣

```rb:hena19_short.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/9810b301648099028bf0
#http://nabetani.sakura.ne.jp/hena/ord19nebasec/
$h=Hash.new{|h,k|h[k]=[]}
1.step(4){|m|
	(8*m).times{|i|
		edges=[]
		if m>1
			d,r=i.divmod(m)
			if r==0
				edges<<(m-1)*100+d*(m-1)
			else
				edges<<(m-1)*100+(d*(m-1)+r-1)%(8*(m-1))
				edges<<(m-1)*100+(d*(m-1)+r-0)%(8*(m-1))
			end
		end
		edges<<m*100+(i+1)%(8*m)
		edges.each{|e|
			$h[m*100+i]<< e
			$h[e]<< m*100+i
		}
	}
}

STDOUT.sync=true
while gets
	h=Hash.new(0)
	a=$_.split(',').map(&:to_i)
	a.each{|e|$h[e].each{|f|h[f]+=1}}
	r=h.select{|k,v|v>=2}.map(&:first).sort-a
	puts r.size>0 ? r*',' : 'none'
end
```
Skinny Frameworkでスマホ対応したい


スマホ対応というか、UserAgentごとにviewを切り替えたい。
ロジックはほぼ同じで、見た目が違う（CSS、HTML、JSが違う）という昔ながらのスマホ対応。

skinny-blank-appのアプリでは
src/main/scala/controller/ApplicationController.scala
がそのアプリの共通の親っぽいので、
<del>ここのbeforeフィルタでUA判定することにする。</del>
beforeActionでUA判定する。
あとはrenderをoverrideしてデバイスごとのviewを設定する。
これでcontrollerは共通でview、layoutを出し分けできる。

```scala
trait ApplicationController extends SkinnyController
  // with TxPerRequestFilter
  // with SkinnySessionFilter
  with ErrorPageFilter {

  val defaultDevice = "default"
  val smartDevice = "smartphone"

  private val extension = "ssp"
  private val mobileRegex = """.*(?i)(iphone|android|ipod).*""".r
  protected var device = defaultDevice

  def userAgent = request.getHeader("User-Agent")

  beforeAction() {
    device = userAgent match {
      case mobileRegex(m) => smartDevice
      case _ => defaultDevice
    }
  }

  override def render(path: String)(implicit format: Format = Format.HTML): String = {
    layout(device + "." + extension)
    super.render(path + "_" + device)(format)
  }
  // override def defaultLocale = Some(new java.util.Locale("ja"))

}
```

layoutはデバイス名.ssp、viewはindex_デバイス名.html.sspみたいな感じで作成。

```
src/main/webapp/WEB-INF/
                       layouts/
                              default.ssp
                              smartphone.ssp
                       views/
                             root/
                                  index_default.html.ssp
                                  index_smartphone.html.ssp
```

これでいいのか全くわからないが、とりあえずUAごとの異なる表示ができたっぽい。

https://github.com/ise/skinny-blank-app-multi/commit/471c41ee10f323b56a7d7084c4359178953e36a8
https://github.com/ise/skinny-blank-app-multi/commit/d232b7bc370e19b09ecffff24d7264e827669565

完
node.jsのofficegenで日本語入りのExcelファイルを出力するサンプル

[node.jsで日本語入りのExcelを出力できるモジュールを探したときのメモ - Qiita](http://qiita.com/hnakamur/items/392f66e3dbeec9ae9d00)で調査対象の第一候補に上げた[officegen](https://www.npmjs.org/package/officegen)を試してみました。

結論から言うと

* ファイル名
* セル内のテキスト
* シート名

のいずれも日本語OKでした。

しかも、特になんの工夫もいらなくて、[officegen/examples/make_xlsx.js at v0.2.8 · Ziv-Barber/officegen](https://github.com/Ziv-Barber/officegen/blob/v0.2.8/examples/make_xlsx.js)を書き換えて、ファイル名、セルのテキスト、シート名に日本語を書いただけです。素晴らしい！

```js:https://github.com/hnakamur/nodejs-officegen-japanese-example/blob/096d5332d881a1af599b8f23a07a6472eee2d789/index.js
var fs = require('fs');
var officegen = require('officegen');

var xlsx = officegen ('xlsx');

xlsx.on ('finalize', function(written) {
  console.log('Finish to create an Excel file.\nTotal bytes created: ' + written);
});

xlsx.on('error', function(err) {
  console.log(err);
});

sheet = xlsx.makeNewSheet();
sheet.name = '日本語のシート名';

// The direct option - two-dimensional array:
sheet.data[0] = [];
sheet.data[0][0] = 1;
sheet.data[1] = [];
sheet.data[1][3] = 'あいう';
sheet.data[1][4] = 'えお';
sheet.data[1][5] = 'Text';
sheet.data[1][6] = 'Here';
sheet.data[2] = [];
sheet.data[2][5] = 'abc';
sheet.data[2][6] = 900;
sheet.data[6] = [];
sheet.data[6][2] = 1972;

// Using setCell:
sheet.setCell('E7', 340);
sheet.setCell('I1', -3);
sheet.setCell('I2', 31.12);
sheet.setCell('G102', 'こんにちは World!');

var out = fs.createWriteStream('日本語のファイル名（だくてん入り）.xlsx');

out.on('error', function(err) {
	console.log(err);
});

xlsx.generate(out);
```

テスト環境ですが、MS OfficeをインストールしていないMacBook Pro (Mavericks)でサンプルを実行してxlsxファイル生成後、別のMacでMicrosoft Excel for Mac 2011で開きました。

![officegenで生成した日本語入りのExcelファイルを開いた所.png](https://qiita-image-store.s3.amazonaws.com/0/3227/4d5e473d-23e1-0155-efce-3dc0b8868b76.png)

「こんにちは World!」と設定したG102のセルはスクリーンショットでは見えていませんが、スクロールして確認したところ、こちらもOKでした。
JavaEE6でCDI管理しているオブジェクトにHttpServletRequestをインジェクションする方法

EE7 なら普通に `@Inject` でインジェクションできるけど、 EE6 だとできない。

調べたら、以下のようにして実現できるらしい。

```java:HttpServletRequestProducer.java
package sample.cdi;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;

@WebListener
public class HttpServletRequestProducer implements ServletRequestListener {
    
    private final static ThreadLocal<HttpServletRequest> REQUEST_HOLDER = new ThreadLocal<>();

    @Override
    public void requestInitialized(ServletRequestEvent event) {
        HttpServletRequest request = (HttpServletRequest)event.getServletRequest();
        REQUEST_HOLDER.set(request);
    }
    
    @Override
    public void requestDestroyed(ServletRequestEvent event) {
        REQUEST_HOLDER.remove();
    }

    @Produces @RequestScoped
    public HttpServletRequest getRequest() {
        return REQUEST_HOLDER.get();
    }
}
```

リスナーを作って、リクエストごとの `HttpServletRequest` をスレッドローカルに保存する。

そして、このリスナーに CDI のプロデューサーメソッドを定義して、スレッドローカルに保存している `HttpSerletRequest` を返すようにする。

```java:Hoge.java
package sample.cdi;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

public class Hoge {
    
    @Inject
    private HttpServletRequest request;
    
    public void method() {
        System.out.println("param = " + request.getParameter("param"));
    }
}
```

```java:HogeServlet.java
package sample.cdi;

import javax.inject.Inject;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hoge")
public class HogeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    @Inject
    private Hoge hoge;
    
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse res) {
        this.hoge.method();
    }
}
```

リクエストパラメータに `param=HOGEE` を渡して上記サーブレットにアクセスすると、以下のようにコンソールに出力される。

```text:コンソール出力
情報: param = HOGEE
```

#参考
- [java ee 6 - CDI injectionpoint @httpparam problem - Stack Overflow](http://stackoverflow.com/questions/3649355/cdi-injectionpoint-httpparam-problem)
CodeMirrorでブラウザ上で動作するコードエディタを作る

##はじめに
開発しているアプリの環境で画面のデザインや動作サンプルを作るのにjsFiddleみたいなエディタがあるといいなと思ったので簡単に調べた。
バックエンドは適当に実装するとして、フロントエンドにはjsFiddleでも使っている[CodeMirror](http://codemirror.net/ "CodeMirror")を使うのが良さそう。

CodeMirrorはJavaScriptライブラリで、シンタックスハイライトやオートインデント、行番号表示などコードエディタとして必要な機能を一通り揃えており、対応言語も多数ある模様。
また、アドオンを導入することで括弧の補完やハイライト、Ctrl+Spaceでコードの自動補完などの機能を持たせることもできる。
あと他ライブラリに非依存なので導入しやすい。

##導入
[http://codemirror.net/](http://codemirror.net/ "http://codemirror.net/")から「DOWNLOAD LATEST RELEASE」をクリックして最新版のzipファイルをダウンロード・解凍する。
言語毎の設定やアドオンはそれぞれ個別の.jsファイルとして存在しており、必要なものだけ読み込んで使う。
##基本

例としてJavaScriptエディタを作成する。
javascript.jsを読み込み、初期化時に`mode: 'javascript'`を指定する。
`lineNumbers: true`で行番号を表示、`indentUnit: 4`でインデント幅をスペース4個にしている(デフォルトは2)。


```html
<link rel="stylesheet" href="lib/codemirror.css">
<script src="lib/codemirror.js"></script>
<!-- 言語に応じたjsファイルを読み込む -->
<script src="mode/javascript/javascript.js"></script>
...
<textarea id="editor_js" rows="30" cols="50"></textarea>
```


```js
var jsEditor = CodeMirror.fromTextArea(document.getElementById('editor_js'), {
    mode: "javascript",
    lineNumbers: true,
    indentUnit: 4
});
```

http://jsfiddle.net/qmotas/59CpK/

これだけ。
エディタの入力内容をtextareaに同期させるには`save()`メソッドを呼び出す。

```js
jsEditor.save();
```

##エディタのスタイル
エディタで使用するフォント等のスタイルを指定したい場合は`.CodeMirror`のスタイルを上書きする。

```css
.CodeMirror {
	font-family: Monaco, 'Andale Mono', 'Lucida Console', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;
	font-size: 9pt;
	height: 100%;
}
```

http://jsfiddle.net/qmotas/DfQzE/

行番号表示や選択範囲等細かい設定も可能。[Customized Styling](http://codemirror.net/doc/manual.html#styling "Customized Styling")を参照。

##アドオンを導入する
`addon/`配下にある各アドオンのうち、導入したいアドオンの.jsファイルを読み込む。
例として括弧を自動補完するアドオンclosebrackets.jsを導入する。

```html
<script src="lib/codemirror.js"></script>
<script src="mode/javascript/javascript.js"></script>
<script src="addon/edit/closebrackets.js"></script>
```

closebrackets.jsは初期化時にオプションを指定する必要がある。

```js
var jsEditor = CodeMirror.fromTextArea(document.getElementById('editor_js'), {
    mode: "javascript",
    autoCloseBrackets: true
});
```

http://jsfiddle.net/qmotas/x98ye/

使用方法はアドオンによって異なる。[Addons](http://codemirror.net/doc/manual.html#addons "Addons")を参照。

##さいごに
ちょっとだけ触ってみた感じでは、少なくとも自分の目的においてはかなり優秀なライブラリという印象。
基本的にはここに書いたことだけで大体なんとかなっちゃう。
他にも任意のキーマッピングを追加するAPIとかある。暇なときに追記したい。
あと自動補完アドオンで特定の文脈に任意の候補を追加したいのだけど難しそう、というかできるかわからない。
これも調べてみていい感じにほにゃほにゃできたらまとめて書く。

##追記
ほにゃほにゃする前にエディタ作る話自体なくなってしまい、完全に放置していましたが
コード補完について、@mizchi氏がちょうどよい記事を書かれています。
[・CodeMirrorでAutoCompleteする](http://qiita.com/mizchi/items/15441d0e285f86125b0a)
UnityのAssetBundleダウンロード実装 

UnityのAssetBundleの実装をまとめました。
ハック用のコードもつけたいけど書くと長いので割愛。

# 最初に、AssetBundleとは？
Unityで作成したアプリにコンテンツの追加を行う機能です。

# 利用目的
iTunesStoreではWiFi以外からのダウンロードに50Mのサイズ制限があるのと、待ち時間のあるアプリ審査をせずにコンテンツの追加を行うのにAssetBundleを利用しています。

# 実装
1. 起動時にCaching.readyとCaching.enabledがONになるまで待つ
1. アプリ -> サーバーから最新のバージョン番号のみをJSONで取得
1. アプリ内のAssetBundleバージョンより新しいバージョンの場合、サーバーからAssetBundleのファイル名、version、CRC32をJSON+tsvで取得※1
1. 最新バージョンが有るAssetBundleをLoadFromCacheOrDownloadで取得
2. ダウンロード後使わないAssetBundleはLoadFromCacheOrDownloadのCRCに偽の情報をセットして削除※2
3. ~~まだ使うAssetBundleはCaching.MarkAsUsedで保存期間延長。~~
2. 処理が全て完了したら、最新のAsssetBundleバージョンを保存とtsvをplayerprefsに保存※3

※1 CRC32はUnity 4.2はログから回収が必要。v4.3では関数で返ってくる。v4.2用にPHPサンプルコード記載
※2 Unity4.2ではCachingの削除機能がないので、削除する為の裏技。
※3 tsvで受けたデータをplayerprefsに保存してます。playerprefsは起動時に全部読んでからでないと起動しないはずなので、保存方法は今後変更します。
※4 Caching.readyとCaching.enabledがONになるには、Cacheが多くなると遅い。

~~他にAssetBundleのchache保存期間が過ぎてから起動する場合も考慮して10日に一度cacheが存在するかチェックしてます。~~ これはやめた。無ければ都度ダウンロードする実装（リトライ機能あり）にした。また、Cacheが多くなると遅くなることもあり、最初に一括で落とさないで必要となるファイルのみダウンロードに変更した。

* CRC32

```php:crc.php
$path = "pathto/Library/Caches/Unity/DefaultCompany_xxx/xxx/CAB-xxx";
$str = file_get_contents($path);
$checksum = hash("crc32b", $str);
echo $checksum . "\n";
```

```csharp:crc.cs
string crc = "xxxx";
uint crcUint = Convert.ToUInt32(crc,16);
WWW www = WWW.LoadFromCacheOrDownload (pathto, 1 ,crcUint);
```

# これだけではない
ダウンロードの実装以外にアプリ内のリソースの管理や、例外処理も必要で何かとめんどくさい。
サーバー側の実装にビルド処理にシリアライズ問題と開発リソースに余裕がないと無理ゲー。
アプリの申請中はAssetBundleを別で管理したりと運用も考えるとほんと大変。
使わないですめば何よりです。

# CRCの取得はバグあったので書いておく
CRCの取得は一部のAssetBundleは問題ないけど、大半は違う値になりましたorz
正しい取得方法はシーンからAssetBundleをダウンロードするか、ビルド時にCRCを取得することになります。

## ダウンロードしてAssetBundleのCRCを取得
UnityEditorからiOSとAndroidの両方のAssetBundle CRCの取得が可能です。
WWW.LoadFromCacheOrDownloadの第三引数に異なるCRCを入れるとLogにエラーとして出力されたCRCを回収で対応となります。
node.jsで日本語入りのExcelを出力できるモジュールを探したときのメモ

# はじめに

[npmでexcelで検索した結果](https://www.npmjs.org/search?q=excel)は5ページもあるのですが、とりあえず気になるものだけ見ていくことにします。

条件は以下の5つです。

* OS XやLinuxで使えること
* MS Officeをインストールしていなくても使えること
* セルに日本語が入ったExcelファイルを作れること
* オープンソースであること
* 無料で使えること

# 調査メモ

## [excel](https://www.npmjs.org/package/excel)
xlsxのパーサのみとのことなのでパス。

## [excel-libxl](https://www.npmjs.org/package/excel-libxl)
[LibXL](http://www.libxl.com/)というC/C++/Delphi/.Net用のライブラリのnode.jsバインディングとのこと。LibXLが有償なのでパス。

## [excel-multi](https://www.npmjs.org/package/excel-multi)
readmeの使い方を見るとパーサのみなのでパス。

## [excel-export](https://www.npmjs.org/package/excel-export)
xlsx出力のみ。BSDライセンス。

## [excel-errors](https://www.npmjs.org/package/excel-errors)
xlsxパーサのみなのでパス。

## [node-xlsx](https://www.npmjs.org/package/node-xlsx)
xlsxの読み書き両方対応だが、不自由なライセンス。

## [excel-api](https://www.npmjs.org/package/excel-api)
[JExcelApi](http://jexcelapi.sourceforge.net/)というJavaで書かれたライブラリのラッパだそうです。```npm install excel-api```してfindコマンドでファイルリストを見てみるとjava.cppとかJavaのclassファイルとかjarファイルが含まれてました。
これはやめておこう。

## [msexcel-builder](https://www.npmjs.org/package/msexcel-builder)
excel 2007形式のxlsファイル出力のみ可能。MITライセンス

## [xlsx-template](https://www.npmjs.org/package/xlsx-template)
xlsx出力のみ。MITライセンス。実際にExcelで保存したファイルの一部をパラメータ化したテンプレートを元に作る方式。

## [xlsx-writer](https://www.npmjs.org/package/xlsx-writer)
xlsx出力のみ。MIT。ライセンス。

## [json2xls](https://www.npmjs.org/package/json2xls)
jsonをxlsxに変換（名前はjson2xlsだけど）。2項BSDライセンス。

## [pyspreadsheet](https://www.npmjs.org/package/pyspreadsheet)
xlsとxlsx両対応。読み書き両方可能。MITライセンス
[Python Excel](http://www.python-excel.org/)というPython製のライブラリ（BSDスタイルライセンス）を使っている（←どうやって？）。

## [node_spreadsheet](https://www.npmjs.org/package/node_spreadsheet)
csv, xls, xlsxの出力に対応。ライセンス記載なし。
[PHPExcel - Home](http://phpexcel.codeplex.com/)（LGPLライセンス）を使用。

## [xlsx-stream](https://www.npmjs.org/package/xlsx-stream)
xlsx出力のみ。MITライセンス。[Stream](http://nodejs.org/api/stream.html)インターフェイス対応。

## [officegen](https://www.npmjs.org/package/officegen)
pptx, docx, xlsxファイル出力が可能。MITライセンス。
OpenOffice.orgのファイル出力も将来追加予定。

## [officegen-2](https://www.npmjs.org/package/officegen-2)
[officegen](https://www.npmjs.org/package/officegen)とは別の作者がpie, bar, columnのチャート出力機能を追加したもの。コードがa bit hackyなので別モジュールとして出したとのこと。

# officegenで行けました！
とりあえず、[officegen](https://www.npmjs.org/package/officegen)を試してみます。readmeがしっかりしていて、バージョン1.0までのロードマップも書いてあり、現在のバージョンも0.2.8と他のモジュールよりは進んでいて（他のは0.0.xのがほとんど）、最終更新日も2日前と新しいです。

追記
[node.jsのofficegenで日本語入りのExcelファイルを出力するサンプル - Qiita](http://qiita.com/hnakamur/items/e340d2610ba5f9f9ddbf)に書きました。
cocos2d-iphoneでのスプライトシートのサイズについて

スプライトシートは正常に読み込まれていて、シミュレータでは表示されるのに
何故か実機で画像が表示されない！と数時間悩んでいました。

結論から言えば、テストしていた端末が古かった（iPodTouch第３世代？）ので
スプライトシートのサイズの上限をオーバーしているのが原因でした。

<a href="http://www.cocos2d-iphone.org/forums/topic/spritesheet-max-size/" target="_blank" title="http://www.cocos2d-iphone.org/forums/topic/spritesheet-max-size/">http://www.cocos2d-iphone.org/forums/topic/spritesheet-max-size/</a>

（英語が苦手な方はgoogle翻訳を使ってみることをオススメします）

上記サイトで知ったのですが
端末によって、スプライトシートのサイズの上限(max texture size)が
1024×1024だったり2048×2048だったりします。

開発する側には当然大きい方が便利ですが
古い端末で見た時に、画像が表示されないのは重大なバグなので
まだ当分は1024×1024で作るべきですね。

リリースするときにOSのバージョンで切り捨てるのはできますが
端末のバージョンではできないですからね。

ちなみにスプライトシートを作成するテクスチャパッカーというソフトでは
デフォルトで1024×1024になっているはずです。
お手軽にバッチ処理の二重起動を防ぐ方法

setlockコマンドが使える環境ならこんな感じにします。

```bash
setlock -nx demo.lock demo.sh
```

demo.lockというファイルが作られるが、存在チェックではなく、ロックできるかどうかを調べているので残っていても問題ないです。

参考

http://www.rootr.net/man/man/setlock/8
さらにF#でhistomorphism/futumorphism

[前回](http://qiita.com/minfuk/items/2508367fa1235f86902d)および[前々回](http://qiita.com/minfuk/items/b7d7b7d0f8c6f1796148)の投稿に引き続いて。
正直問題ないのかよく分かりませんな。具体例を当てはめてやらないとダメですね。

```fsharp
// 前回および前々回の定義を前提としています。

type ProdF<'c,'a,'x> =
    | ProdF of 'a * F<'x>
    interface F<'c> with
        member x.fmap f p =
            let rec fmap0 (f:'b -> 'd) (p : F<'b>) =
                match p :?> ProdF<'b,'a,'y> with
                | ProdF(a, fx) -> ProdF(a, fmap0 f fx) :> F<'d>
            fmap0 f p

let forkF f g x =
    ProdF(x |> fork f g)

let hdCV (xs : Nu<ProdF<'c,'a,'x>>) =
    match (out xs) :?> ProdF<Nu<ProdF<'c,'a,'x>>,'a,'x> with
    | ProdF(c, _) -> c

let tlCV (xs : Nu<ProdF<'c,'a,'x>>) =
    match (out xs) :?> ProdF<Nu<ProdF<'c,'a,'x>>,'a,'x> with
    | ProdF(_, fx) -> fx

let rec histo phi x =
    let y = unIn x
    y
    |> y.fmap (ana (fun z -> (forkF (histo phi) unIn z) :> F<Mu<'c>>))
    |> phi

type SumF<'c,'a,'x> =
    | SumF of Sum<'a, F<'x>>
    interface F<'c> with
        member x.fmap f p =
            let rec fmap0 (f:'b -> 'd) (p : F<'b>) =
                match p :?> SumF<'b,'a,'b> with
                | SumF(InL(a)) -> SumF(InL(a)) :> F<'d>
                | SumF(InR(x)) -> SumF(InR(fmap0 f x)) :> F<'d>
            fmap0 f p

let joinF f g s =
    match s with
    | SumF s0 -> join f g s0

let lastF (x : 'a) : Mu<SumF<'c,'a,'x>> = In (SumF (InL x))

let consF (x : F<Mu<SumF<'c,'a,'x>>>) : Mu<SumF<'c,'a,'x>> = In (SumF (InR x))

let rec futu (phi : 'a -> F<Mu<SumF<'c,'a,'x>>>) (x : 'a) = 
    let y = phi x
    y
    |> y.fmap (cata (fun z -> (joinF (futu phi) Wrap) (z :?> SumF<Nu<'a>,'a,Nu<'a>>)))
    |> Wrap
```
Javascriptでのiframe操作tips(iframeの中身を差し替える)

##追記(2016/05/05)


コメントでご指摘いただきました。
過去のソースにアクセス出来ない＆Javascriptの知識が浅いので経緯がわからない状態ですが、
iframe elementの取得方法と、iframe内のコンテンツの更新方法を下記のように置き換えないと動かないようです。ご注意ください。

```js
document.getElementById('iframe_id')[0].contentDocument.location.replace('target_url or target_path');

↓

document.getElementById('iframe_id').contentWindow.location.replace('target_url or target_path');
```


追記ここまで。
以下、2014年に投稿した記事です。

----

　　コンテンツの更新システムを作る場合などに、iframeを使ってプレビューを表示したい
　　カレンダーの日付クリックイベントを拾って、iframeの中身を差し替えたい(iframeのURLを差し替えたい)

なんて実装をする時にはまったのでメモ。



##iframeを更新(=リロード)する
location.reloadを使います。
reload(true)でスーパーリロードになります。
###jQuery
```js
$('#iframe_id')[0].contentDocument.location.reload(true);
```

###素のJavascript
```js
document.getElementById('iframe_id')[0].contentDocument.location.reload(true);
```
##iframeのコンテンツを差し替える(別のURLからコンテンツを取得する)
iframeの中身を差し替えたい場合は、location.srcを書き換えてlocation.reloadしてもダメ。
location.replaceしましょう。
###jQuery
```js
$('#iframe_id')[0].contentDocument.location.replace('target_url or target_path');
```
###素のJavascript
```js
document.getElementById('iframe_id')[0].contentDocument.location.replace('target_url or target_path');
```
###Sample
```js
$('#iframe_id')[0].contentDocument.location.replace('/preview/show/20140320');
```
↑2014/03/20時点のコンテンツプレビューが見たい = previewコントローラのshowアクションに年月日パラメータ(20140320)を引き渡した結果をiframe内に表示する。というイメージ。
Vimのコマンドラインモード(:)で、シェル同様のヒストリ展開(!$)を使う

`:e ~/path/to/filename`した時に以下のエラーになって、
`:e! ~/path/to/filename`でやり直すことになる場合が時々あります。

```
E37: No write since last change (add ! to override)
```

1. 再度`~/path/to/filename`を入力するのは面倒。
2. 上カーソルキーでヒストリを戻ってコマンドラインを編集
   (`:<Up><Home><Left>!`。もしくは`:cnoremap <C-A> <Home>`等を設定しておいて
   `:<C-P><C-A><C-F>!`)
3. `:e! !$` (bashやzshでの操作と同様)

2.の操作をしていたのですが、どうもまどろっこしい印象なので、
3.の操作でやりたい、と思ったので少し調べてみました。
(実は2.の方が打鍵数は少ないですが)
(その他有効な場面としては、`:'a,.w ~/path/to/newfile`した後、`:e !$`)

以下の記事が見つかりました。

[Is there a vim equivalent to bash's '!$'? - Stack Overflow](http://stackoverflow.com/questions/18494837/is-there-a-vim-equivalent-to-bashs)

```vim:.vimrc
cnoreabbr <expr> !$  getcmdtype() == ':' ? split(@:,'\s\+')[-1] : '!$'
cnoreabbr <expr> !*  getcmdtype() == ':' ? join(split(@:,'\s\+')[1:], ' ') : '!*'
cnoreabbr <expr> !!  getcmdtype() == ':' ? @: : '!!'
cnoreabbr <expr> !-2 getcmdtype() == ':' ? histget(':', -2) : '!-2'
```

stackoverflowの記事でも指摘されていますが、
スペースで分割しているだけなので、
""等でくくられていてもスペースが含まれていると分割されます。
(vimlparserを使ってきちんと解析することはできそうです。)

ちなみに、シェルのヒストリ展開で個人的によく使うのは以下なのですが、
シェルに合わせた操作をVimでできるようにするよりも、Vimに合わせて、
上カーソルキーでヒストリをたどって編集するか、
さらに複雑な変更をしたい場合は、`q:`でコマンドラインウィンドウを
使うことでいいかと思っています。

* `CTRL-R`によるヒストリ検索
* `!v`等で再実行
* `^str1^str2`による置換実行(たまに)

その他、Vimのコマンドラインモードでのファイル名補完が、
シェルの補完と違うとわずらわしいので、Vim側で以下の設定をしています。

```vim:.vimrc
set wildmode=longest:full
set wildmenu
```
iOSのDropBox SDKでupload時に403エラー


FileUpload時に以下のようなエラー。

```
[WARNING] DropboxSDK: error making request to /1/files_put/hogehoge - (403) Forbidden File upload failed with error - Error Domain=dropbox.com Code=403 "The operation couldn’t be completed. (dropbox.com error 403.)" 
```

下記の初期化で
`root: kDBRootDropbox`
となっていたのを
`root: kDBRootAppFolder`
に直して解決。

```cpp:AppDelegate.m
DBSession *dbSession = [[DBSession alloc]
      initWithAppKey:@"INSERT_APP_KEY"
      appSecret:@"INSERT_APP_SECRET"
      root: kDBRootAppFolder]; // either kDBRootAppFolder or kDBRootDropbox
```

デベロッパーサイトで登録するときに、アプリ固有のディレクトリを使うように設定したからかな？
play frameworkのプロジェクトをchefで作成

play frameworkのプロジェクトをchefで作成しようとすると、`play new`でアプリケーションの名前を入力するよう求められるために詰まりました。

対策として、`expect`を使用しました。

以下は、`autoexpect`を使って生成したファイルです。

```bash:install_play.exp
#!/usr/bin/expect -f

set force_conservative 0  ;# set to 1 to force conservative mode even if
			  ;# script wasn't run conservatively originally
if {$force_conservative} {
	set send_slow {1 .1}
	proc send {ignore arg} {
		sleep .1
		exp_send -s -- $arg
	}
}

set timeout -1
spawn play new application_path
match_max 100000
expect -exact "What is the application name?"
send -- "application_name\r"
expect eof
```

これをchefのtemplates化。

```ruby:install_play.exp.erb
#!/usr/bin/expect -f

set force_conservative 0  ;# set to 1 to force conservative mode even if
			  ;# script wasn't run conservatively originally
if {$force_conservative} {
	set send_slow {1 .1}
	proc send {ignore arg} {
		sleep .1
		exp_send -s -- $arg
	}
}

set timeout -1
spawn play new <%= @application_path %>
match_max 100000
expect -exact "What is the application name?"
send -- "<%= @application_name %>\r"
expect eof
```

実行するレシピはこんな感じ。

```ruby:playframework_app.rb
# アプリケーションディレクトリの作成
# expectを使用して、対話コマンドに対応
template "/tmp/install_play.exp" do
  source "install_play.exp.erb"
  mode "755"
  owner node['playframework']['user']
  group node['playframework']['group']
  variables({
     :application_path => node['playframework']['application']['path'],
     :application_name => node['playframework']['application']['name']
  })
end

bash "play new" do
  creates "#{node['playframework']['application']['path']}"
  user node['playframework']['user']
  code <<-BASH
    /tmp/install_play.exp
  BASH
end
```