OmniAICreator/Qiita-1.07M huggingface dataset:
Master-Detail ApplicationでStoryboardを使い起動後の画面を独自のビューに変更する

 
何回かやっているのにそのたびに完全に忘れきっているのでメモとして残しておく必要を感じた

-----
## GUIでの作業

* ビューの追加
    1. ファイルツリーを右クリックしてNewFile、CocoaTouchからUIViewController subclassを追加、適切な名前をつける
    2. Storyboardのファイルを開き、Objects一覧からオレンジの球体のViewControllerをD&Dで追加する
    3. ViewControllerを選択し、Identity Inspectorで自分が作ったViewControllerの名前を指定する

* セグエの変更
    1. NavigationControllerからMasterViewControllerへと延びるRelationship segueを消す
    2. NavigationControllerから自分が作ったViewControllerにRelationship segueを接続する
    3. 自分が作ったViewControllerにボタン等を追加し、それをMasterViewControllerへ接続する

* セグエの接続は二本指ドラッグもしくはctrl+ドラッグし接続先でドロップすることで接続できる

-----
## コードの変更

* managedObjectContextの取得方法を変更
    1. AppDelegate.mのなかで初期化時にmanagedObjectContextをMasterViewControllerに渡すようなコードを書いてあるのを消す
   2. MasterViewControllerのmanagedObjectContextプロパティを@dynamicに変更し、AppDelegateインスタンスのmanagedObjectContextを取得するようなコードに変更する

```objective-c:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    //UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
    //MasterViewController *controller = (MasterViewController *)navigationController.topViewController;
    //controller.managedObjectContext = self.managedObjectContext;
    //MasterViewController *controller = (MasterViewController *)navigationController.topViewController;
    return YES;
}
```

```objective-c:MasterViewController.h
@property (nonatomic, readonly) NSManagedObjectContext * managedObjectContext;
@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
```

```objective-c:MasterViewController.m
#import "AppDelegate.h"
@implementation MasterViewController

@dynamic managedObjectContext;
@synthesize fetchedResultsController=__fetchedResultsController;
- (NSManagedObjectContext *)managedObjectContext {
    AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    return appDelegate.managedObjectContext;
}
```

* editボタンをなくす
    1. MasterViewControllerの初期化時に左側のボタンを戻るボタンからEditボタンに変更するようなコードが書いてあるのを消す

```objective-c:MasterViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // Set up the edit and add buttons.
    // self.navigationItem.leftBarButtonItem = self.editButtonItem;

    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject)];
    self.navigationItem.rightBarButtonItem = addButton;
}
```


before
![before](http://gyazo.com/1163a8ac36fec99a31be9f7eeda21da3.png)

after
![after](http://gyazo.com/a0fc5fb40be5889ad04dcd3e1e99eefe.png)
PHPの嫌なところ

以下のような関数があっても、警告すらされないのはちょっと….
今日はこれではまった。

```PHP:test.php
<?php
function hoge($a){
        if($a) return true;
}
echo gettype(hoge(true)).chr(10);
echo gettype(hoge(false)).chr(10); 
?>
```

```:output
boolean
NULL
```
Eigen: (AA')^-(1/2) を計算

Eigenで正定値対象行列AA'のinverse sqrtを計算する方法。 (A'はAの転置)
Matlabなら`(A*A.t())^-(1/2)`で一発。 Eigenでも比較的簡単にできた。

```C++
MatrixXf A;
SelfAdjointEigenSolver<MatrixXf> es(A*A.transpose());
MatrixXf ans = es.operatorInverseSqrt();
assert((ans * ans).inverse() == A*A.transpose());
```

このコードだと、AA'がフルランクじゃない場合(A.rows() > A.cols())におかしなことになる。(たぶん中で固有値ゼロに対して1/sqrt(0)としてしまっている)
ということで、ゼロ固有値は無視するように。

```C++
 SelfAdjointEigenSolver<MatrixXf> es(A * A.transpose());
 MatriXfx dvec = es.eigenvalues();
 for(int i=0; i < dvec.rows(); ++i){
     if(abs(dvec(i)) > 1e-5) dvec(i) = 1.0 / sqrt(dvec(i)); // ignore eigen value = zero
 }
 MatrixXf ans = es.eigenvectors() * dvec.asDiagonal() * es.eigenvectors().inverse();
```
海外製のテーマに手っ取り早く日本語フォントを割り当てる時に使うCSS

```css:japanese.css
.japanese {
	font-family:Myriad,Helvetica,Arial,"Meiryo","メイリオ",sans-serif;
}
```

海外で配布されているテーマは、記事の表示部分とかに当たっているフォントは通常、英語フォントのみ。かといって、body全体とか広い範囲に日本語フォントを当てると表示が崩れる箇所とかあります。
日本語が表示される部分にだけ、このクラスを当てるようにすると、それなりに見栄えが良くなります（細かい調整は必要なのですが）。趣味でデザインいじる時は良く使ってます。
データセット名を変数で指定する方法

ある変数に格納された名前を持つデータセットをロードしたかったんですけど、

```R:R
dsname <- "iris"
data(dsname)
```
と打つと

>
 警告メッセージ： 
In data(dsname) :  データセット ‘dsname’ がありません

と出ました。
まあ、当然なんですけど、色々調べて

```R:R
dsname <- "iris"
data(list = dsname)
```
と打てばいいことが分かりました。
ほっともっとのお弁当を表示するスクリプト

MacOSのシェルスクリプトです。

```bash:homo
#!/usr/local/bin/homo
curl -s "http://www.hottomotto.com/menu/list/index.php?id=1" | grep 'class="name"' | cut -d'>' -f3 | cut -d'<' -f1 | sed -n "`expr $(expr $RANDOM % 47) + 1`p"
```

@cupnesにもらいました。改造して使ってください。
0.1秒でVimのバッファを一覧表示するショートカット

QuickBuf http://www.vim.org/scripts/script.php?script_id=1910 をインストール後、~/.vimrc にこんなショートカットを設定します。

    # ~/.vimrc
    let g:qb_hotkey = ";;"

セミコロンを2回押せばバッファ一覧がトグれます。
NERDCommenterで瞬時にコメントをトグるためのショートカット設定

Vimで快適にコメントアウトしてくれるNERDCommenter。
このショートカットを登録しておけばカンマを連打するだけでコメントアウトをトグれます。

    # ~/.vimrc
    let NERDSpaceDelims = 1
    nmap ,, <Plug>NERDCommenterToggle
    vmap ,, <Plug>NERDCommenterToggle
How to create a two-dimensional array

A simple example of creating a two dimensional array.

```ahk:two-dimensionalarray.ahk
oPeople := {Jacob: 		{gender: "male", age: 48, occupation: "Teacher"}
		,	Ethan: 		{gender: "male", age: 16, occupation: "Student"}
		,	Jayden: 	{gender: "male", age: 62, occupation: "Manager"}
		,	Isabella: 	{gender: "female", age: 30, occupation: "Truck driver"}
		,	Sophia: 	{gender: "female", age: 24, occupation: "Secretary"}
		,	Emma: 		{gender: "female", age: 70, occupation: ""}}

msgbox % oPeople.Jayden.gender "`n"
		. oPeople.Jayden.age "`n"
		. oPeople.Jayden.occupation
```
When Run doesn't work, try ShellExecute

Sometimes the Run command does not work. In that case, the ShellExecute API function is worth trying. 

```ahk:shellexecute.ahk
strFilePath := A_WinDir "\notepad.exe"
if (ErrorCode := ShellExecute(strFilePath)) <= 32
	msgbox % ErrorCode

ShellExecute(strFilePath, strArgs="", nShowCmd=1) {
	;http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153%28v=vs.85%29.aspx
	HINSTANCE := DllCall(A_IsUnicode ? "shell32\ShellExecuteW" : "shell32\ShellExecuteA"
	   , ptr ? ptr : "uint", 0
	   , "uint", 0
	   , "str", strFilePath
	   , "str", strArgs  ; arguments
	   , "uint", 0
	   , "int", nShowCmd	; specifies how an application is to be displayed when it is opened
	   , ptr ? ptr : "uint" )
	Return HINSTANCE
}
```
GUIDを生成する。

世界で重複することがない、ユニークな128bit（16byte）のランダムな数値であるGUID値を生成する。

```c#:guid.cs
using System;               // Guid,Console

class GuidSample {
    public static void Main(string[] args) {
        String id = Guid.NewGuid().ToString("N");
        Console.WriteLine(id);
    }
}
```
##実行結果
```
$ guid.exe
4b1d4ca7f22b49e284753a034e673629
```

##Guid.ToString()の整形方法

* "N" : 32桁 ⇒ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
* "D" : ハイフンで区切られた32桁 ⇒ xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
* "B" : 中かっこで囲まれ、ハイフンで区切られた32桁 ⇒ {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
* "P" : 丸かっこで囲まれ、ハイフンで区切られた32桁 ⇒ (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) 

--
##参考
* [GUID値を生成するには？［C#、VB］ − ＠IT](http://www.atmarkit.co.jp/fdotnet/dotnettips/675generateguid/generateguid.html)
* [グローバル一意識別子(GUID)を取得する: .NET Tips: C#, VB.NET](http://dobon.net/vb/dotnet/programing/guid.html)
* [Guid.ToString メソッド (String) (System)](http://msdn.microsoft.com/ja-jp/library/97af8hh4\(v=vs.80\).aspx)
星3つを表示するPHPスクリプト

指定した数だけ星を埋めて表示する。サンプルでは「★★☆」を表示。もっとシンプルに書けないかな。

```star.php
<?php

$level = 2;
$max   = 3;

$star1 = ($level > 0) ? array_fill(0, $level, "★") : array();
$stars = implode("", array_pad($star1, $max, "☆"));
var_dump($stars);
ベクトルの正規化ってこんな感じですか？

```actionscript
var dx:Number = particle.x - centerX;
var dy:Number = particle.y - cetnerY;
var distance:Number = 1/Math.sqrt(dx*dx + dy*dy);
var vx:Number = dx*distance;
var vy:Number = dy*distance;
trace(vx, vy);
```
Capistranoデプロイを行うとGitレポジトリからクローン出来なくなる現象

未解決問題メモ。
Capistranoによるデプロイを行おうとすると、レポジトリからappサーバにソースコードをcloneしてくる際に

```sh
 git pack-objects --revs --thin --stdout --progress --delta-base-offset
 git-upload-pack repositories/my_repo.git
```

レポジトリサーバで上記のgitプロセスが走り、処理が帰ってこなくなることがある。
一度手動でgitプロセスを殺したあと、再度試みると成功する。
phpでタイムゾーンの"日の出/日没"時間、"時間差"を取得

[DateTime](http://www.php.net/manual/ja/class.datetime.php)、[DateTimeZone](http://www.php.net/manual/ja/class.datetimezone.php) 関数が便利だし、ソースコードが少しエレガントになった気がしてくるから、これから積極的に使っていきたい！

TimeZone関連の２つの関数を作ってみた。１つは２つのタイムゾーンの時間差を返す関数。もう１つは特定のタイムゾーンの”日の出”と”日没"の時間を現地でデフォルトタイムゾーンの時間で返す関数です。

phpがサポートしているタイムゾーンの一覧はここで確認できる。
[http://www.php.net/manual/ja/timezones.php](http://www.php.net/manual/ja/timezones.php)

###２つのタイムゾーンの時間差を取得
    /**
     * 
     * @param string $timezoneName1
     * @param string $timezoneName2
     * @return array
     */
    function getTimezoneTimeDifference($timezoneName1, $timezoneName2 = null) {
        $timezone1 = new DateTimeZone($timezoneName1);
        $timezone2 = new DateTimeZone($timezoneName2);

        $date1 = new DateTime("now", $timezone1);
        $date2 = new DateTime("now", $timezone2);

        $offset = $timezone1->getOffset($date1) - $timezone2->getOffset($date2);
        $hour   = floor($offset / 3600);
        $minute = ($offset - ($hour * 3600)) / 60;

        return array(
            'time'   => $hour.':'.$minute,
            'offset' => $offset);
    }

    echo "TimeDifference: " . $diff['time'];
    $diff = getTimezoneTimeDifference('Asia/Tokyo', 'Europe/Stockholm');
    echo $diff['time'] . "<br />";

    // Output  
    // TimeDifference: 8:0;

*　*
###タイムソーンの”日の出”と”日没"の時間を現地でデフォルトタイムゾーンの時間で取得
    /**
     * 
     * @param string $timezoneName
     * @param string $localTime
     * @param string $format
     * @return array
     */
    function getSunTime($timezoneName, $localTime = false, $format = "H:i")
    {
        $timezone = new DateTimeZone($timezoneName);
        $location = $timezone->getLocation();

        $sunrise = date_sunrise(time(), SUNFUNCS_RET_TIMESTAMP, 
                                $location['latitude'], $location['longitude']);
        $sunset  = date_sunset(time(), SUNFUNCS_RET_TIMESTAMP, 
                               $location['latitude'], $location['longitude']);

        if ($localTime == true) {
            $diff = getTimezoneTimeDifference(date_default_timezone_get(), $timezoneName);
            $sunrise += $diff['offset'];
            $sunset  += $diff['offset'];
        }

        $date1 = new DateTime("now", $timezone);
        $sunrise = $date1->setTimestamp($sunrise)->format($format);
        $sunset  = $date1->setTimestamp($sunset)->format($format);

        return array(
            'sunrise' => $sunrise,
            'sunset'  => $sunset
        );
    }

    date_default_timezone_set('Asia/Tokyo');

    echo "Stockholm Time: ";
    echo print_r(getSunTime("Europe/Stockholm", false), true);

    echo "Tokyo Time: ";
    echo print_r(getSunTime("Europe/Stockholm", true), true);

    // Output  
    // Stockholm Time: Array ( [sunrise] => 07:37 [sunset] => 16:26 )   
    // Tokyo Time: Array ( [sunrise] => 15:37 [sunset] => 00:26 )
git-completion.sh と Incremental completion on zsh は相性が悪い

git に標準でついてくる git-completion.sh と zsh のインクリメンタル補完スクリプト [Incremental completion on zsh](http://mimosa-pudica.net/zsh-incremental.html "Incremental completion on zsh") は相性が悪いです。git-completion.sh が入ってると候補表示時にエラーを吐きます。使うのであれば Incremental completion on zsh 一本にした方が良さそうです。
PHPのSimpleTestを使う最小限の例

```php:test.php
require_once('simpletest/autorun.php’);
class Sample extends UnitTestCase{
  public function test_my_var(){
      $this->assertTrue( 1 == "1" );
  }
}

$t = new Sample();
```


これだけ覚えてればテストが書けるSimpleTestは偉い。

テストの実行は、WEBブラウザからでも、コンソールからでも何方でも可。
KeyboardEventで文字判別を簡単に書く方法

次のように書くと可読性も担保できていい感じ。

```
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);

function keyDownHandler(event:KeyboardEvent):void{
	switch(event.keyCode){
		case "A".charCodeAt(): trace("A"); break;
		case "B".charCodeAt(): trace("B"); break;
		case "C".charCodeAt(): trace("C"); break;
	}
}
```
正直あまり知らなくても損しないと思うけどMercurial紹介します

「知らないと損する」って言葉は自分が教えて君してる分には使っててもイヤな感じはしないですが、自分が何かを発表する立場で書くのは抵抗がありますね…
[バトン企画](http://qiita.com/items/2273)のたたき台として書いてみます。何か気づいた点があったら教えてください。


##一言説明
簡単な分散型バージョン管理ツール

##おすすめポイント
全体的にコマンドが単純で、コミットログに連番が振ってあるので、その点でgitよりも扱いやすい

##おすすめシーン
初めてバージョン管理を使う人に勧めるとき
ウェブのプライベートリポジトリを死ぬほど作りたい人におすすめ
bitbucketはプライベートリポジトリ無制限(だったはず)
windowsでも導入は簡単(python入れてmerucurial入れてiniファイルをいじって日本語かなんかをうまくやるだけ)

##おすすめしないシーン
外部にソースコードを積極的に公開したいとき(git-hubの方が見られやすい)
ハッカソンだと経験的にgit人口の方が多い(?)ので、そういうときはたぶんgitの方がいい

##導入方法
sudo port install mercurial

##基本的な使い方
hg init/リポジトリの作成
hg add/管理対象ファイルの追加
hg ci -m "foo bar"/コミット
hg up -C 0/アップデート(切り替え)
hg merge 1/マージ
hg pull http://hoge.com/プル
hg push http://bar.com/プッシュ
hg clone http://hage.com/クローン

##参考情報
mercurialの使い方
http://www.02.246.ne.jp/~torutk/mercurial/intro.html
bitbucket
https://bitbucket.org/

##この人の意見が聞きたい
hagino3000さん
takano32さん

gitについてあまり知らないので、実運用でありがちな対比の話を詳しく聞きたいです。
知らないと損する○○

すごい反響のあった「[これ知らないプログラマって損してんなって思う汎用的なツール](http://qiita.com/items/2047)」とその[まとめ](http://qiita.com/items/2183)ですが、ひとつひとつのツールについて断片的にしか触れられていないので、各ツールをプッシュしたい人が、バトン形式で自由にオススメポイントをいくつか紹介するってどうかな？

たとえば、「GitHubを使うべき7つの理由」というタイトルで、簡潔にGitHubのいいところを紹介するなど。

こんなルールで運用する：

* ひとつのツールにつきひとつの投稿にする
* Qiitaのタグ機能を使って各投稿をたどれるようにする(shirasonタグを使う)
* バトンと言っても次の人を指名するとかではなく、書きたい人が好きなときに書きたいことを書くかんじで。

他に何か提案があればコメントください
Objective-C blocks メモ

GCD とか blocks は便利ですが、関連する(ブロック本体も含む)変数の保存先などが通常のC言語とは違うことになるので注意が必要。

- メソッド内で block を property などに保存して他のメソッドで使おうと思っても block object は stack にあるので、明示的に copy して heap に載せないとダメ
- Objective-C のオブジェクトは block がコピーされるときに retain されるけど、 CFStringRef などは toll-free bridge とはいえ retain されないので注意 (iOS の場合 CoreFoundation 使うことはほとんど無いと思いますが)。

```objective-c
- (void)fooWithCFString:(CFStringRef)cfstr
{
    int autoVariable = 10; // naturally on stack
    __block int blockVariable = 0; // at this time on stack so far I suppose...
    NSString *nsstr = [[(NSString *)cfstr copy] autorelease]; // you need to copy CoreFoundation objects for blocks
    id aBlock = ^{ // myBlock also on stack
        assert(autoVariable == 10);
        NSLog(@"hello: %@", nsstr);
        return blockVariable = autoVariable;
    };
    autoVariable += 10;
    assert(autoVariable == 20);
    // self.block, copied from aBlock, in heap
    // blockVariable is copied in heap too
    self.block = [aBlock copy];
}

- (void)bar
{
    assert(self.block() == 10);
    assert(self.block() == 20);
    [self.block release]; // block in heap is released, and blockVariable is released too
}
```

コード中の日本語コメントが文字化けするので英語にしました。すみません。
実行してないので間違ってたらごめんなさい。

## 参考リンク

- [Session 144 - ￼Advanced Objective-C and Garbage Collection Techniques](https://developer.apple.com/videos/wwdc/2010/?id=144) (iOS Developer 登録が必要です。スミマセン)
- [CoreFoundation のオブジェクトは自動的に retain されないという指摘 - Stack Overflow](http://stackoverflow.com/questions/5999982/overrelease-issue-with-block-captured-objects-retain-count-jumps-straight-from#comment6949406_6001053)
mailtoをクリックしたらGmailを開くようにする

参考: [Getting Gmail to handle all mailto: links with registerProtocolHandler](http://updates.html5rocks.com/2012/02/Getting-Gmail-to-handle-all-mailto-links-with-registerProtocolHandler)

mailtoタグをクリックしたとき Outlook や Mail でなく Gmail を起動する方法。
firefox と chrome で動かせるらしい。

1 Gmail をタブで開く
2 Gmail のタブで JavaScript コンソールを開く(cmd-opt-j on Mac, ctrl-shift-j on Windows)
3 以下のコードをコンソールで実行

```js
navigator.registerProtocolHandler("mailto",
                                  "https://mail.google.com/mail/?extsrc=mailto&url=%s",
                                  "Gmail");
```

4 通知がでるので許可する
5 完了

参考ページ（というか元ネタページ）の 5 のところにサンプルの mailto リンクがあるから試しにクリックしてみると、Gmail が起動されるのが確認できるはず
C#でFizzBuzz

#Qiitaデビュー記念にC#でFizzBuzzをば

```fizzbuzz.cs
using System;
using System.Linq;

namespace HelloQiita
{
  class HelloQiita
  {
    static void Main(string[] args)
    {
      var fizzbuzz = Enumerable.Range(0, int.MaxValue)
                .Skip(1)
                .Take(100)
                .Select(x =>
                  x % 15 == 0 ? "Fizz Buzz" :
                  x % 3 == 0 ? "Fizz" :
                  x % 5 == 0 ? "Buzz" :
                  x.ToString()
                );
      foreach (var item in fizzbuzz)
      {
        Console.WriteLine(item);
      }
    }
  }
}
```

***

LIQNは便利ですね。まる。
intel VTune Amplifier XE 2011でsampling driverをビルド・インストール

kernelをアップデートしたりするとdriverの更新が必要なのでメモ。

```
$ cd /opt/intel/vtune_amplifier_xe/sepdk/src
$ sudo ./build-driver -ni --install-dir=../prebuilt
$ cd ../prebuilt/
$ sudo ./insmod-sep3 -r 
```
文字列からキーコードを取得

変数 text が入力された文字列。
※ 半角英数 + スペースのみ

```as3:hoge.as
text.split("").forEach(function(...t):*{trace(Keyboard[describeType(Keyboard).constant.(t[0].toUpperCase()==@name||"NUMBER_"+t[0]==@name||(t[0]==" "&&@name=="SPACE")).@name])});
```
uint型に入ったRGB値の乗算

RGBに掛ける値が同じ場合
RBとGに分解してビット演算で合成する

```actionscript
var src:uint = 0x70e080; // base color
var mul:uint = 0x60; // factor

var dst:uint = (src & 0xff00ff) * mul >>> 8 & 0xff00ff | (src & 0xff00) * mul >> 8 & 0xff00; // multipled color
```
Ubuntu のデスクトップ環境のフォルダ名を日本語から英語にする

「~/デスクトップ」を「~/Desktop」のように変更する．
普通は，

    $ LANG=C xdg-user-dirs-gtk-update

でok なはずだけど起動してくれないので別の方法を探した．
~/.config/user-dirs.dirs を以下のように編集する．

    XDG_DESKTOP_DIR="$HOME/Desktop"
    XDG_DOWNLOAD_DIR="$HOME/Downloads"
    XDG_TEMPLATES_DIR="$HOME/Templates"
    XDG_PUBLICSHARE_DIR="$HOME/Share"
    XDG_DOCUMENTS_DIR="$HOME/Documents"
    XDG_MUSIC_DIR="$HOME/Music"
    XDG_PICTURES_DIR="$HOME/Pictures"
    XDG_VIDEOS_DIR="$HOME/Videos"

実際のフォルダをリネームする．

    $ mv $HOME/デスクトップ $HOME/Desktop
    $ mv $HOME/ダウンロード $HOME/Downloads
    $ mv $HOME/テンプレート $HOME/Templates
    $ mv $HOME/公開 $HOME/Share
    $ mv $HOME/ドキュメント $HOME/Documents
    $ mv $HOME/音楽 $HOME/Music
    $ mv $HOME/画像 $HOME/Pictures
    $ mv $HOME/ビデオ $HOME/Videos

で，ログインしなおすとok．

フォルダ名は，http://freedesktop.org/wiki/Software/xdg-user-dirs の http://user-dirs.freedesktop.org/releases/xdg-user-dirs-0.14.tar.gz の ja.po を参考にした．
環境は，Ubuntu 11.10 amd64

追記)
KoedoLUG:40528 より

     $ LANG=C xdg-user-dirs-update --force

で行けるらしい．未確認．
BufferedImageのピクセルを直接得る

MemoryImageSourceを使わず直接BufferedImageのピクセルデータを得る方法

```java
import java.awt.image.*;

BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
int[] pixels = ((DataBufferInt) bi.getRaster().getDataBuffer()).getData();
```
FORMからPOSTを配列で送る方法【PHP】

HTMLのFORMで、POSTの配列をPHPに送る方法です。

```html
<form name="form" method="POST" action="./test.php">
<input type="checkbox" name="hoge[]" value="0" >No.0<br/>
<input type="checkbox" name="hoge[]" value="1" >No.1<br/>
<input type="checkbox" name="hoge[]" value="2" >No.2<br/>
<input type="checkbox" name="hoge[]" value="3" >No.3<br/>
<input type="checkbox" name="hoge[]" value="4" >No.4<br/>
<input type="reset"/>
<input type="submit"/>
```

こちらのページで確認できます　http://gachihomo.com/test.php
SQLをJavaの文字リテラルに変換するVimスクリプト

Qiitaが面白そうなので、投稿テスト。
JavaのコードにゴリゴリSQLを埋め込んでいく人向け機能。

```vim:sqltojava.vim
"SQLのJava文字リテラルへの整形
function! SQLToJava()
  %s/^\(.\+\)$/"\1 " \+/g
  normal $xxggVGy
  echo "Convert to Java String is finished and yanked."
endfunction
command! Sqltoj :call SQLToJava()

function! SQLFromJava()
  %s/^[ \t]*"\(.\+\) " *+*$/\1/g
  normal ggVGy
  echo "Convert from Java String is finished and yanked."
endfunction
command! Sqlfromj :call SQLFromJava()
```
RMagickで画像を読み込む、サムネイル画像を生成しそのままS3に格納、時間制限URLを取得


```ruby:thumbnail_on_s3.rb
require 'rmagick'
require 'aws/s3'

AWS::S3::Base.establish_connection!(:access_key_id=>'<YOUR_ID>', :secret_access_key=>'<YOUR_SECRET>')
AWS::S3::DEFAULT_HOST.replace 's3-ap-northeast-1.amazonaws.com' # if use Tokyo Region
img = Magick::ImageList.new('path/to/file.jpg')
AWS::S3::S3Object.store('filename_thumb_m.jpg', img.thumbnail(640,480).to_blob {self.quality=92}, '<bucket-name>')
AWS::S3::S3Object.store('filename_thumb_s.jpg', img.thumbnail(160,120).to_blob {self.quality=92}, '<bucket-name>')
# １時間したらアクセス出来ないURLをゲット
puts AWS::S3::S3Object.url_for('filename_thumb_m.jpg', '<bucket-name>', :expires_in=>3600)
puts AWS::S3::S3Object.url_for('filename_thumb_s.jpg', '<bucket-name>', :expires_in=>3600)
```
JavaScriptでPOSTを送るコード


```JavaScript:POSTの送信
function sendPost(text,to) {
    httpObj = new XMLHttpRequest();
    if (httpObj) {
        httpObj.open("POST","send.php",true);
        httpObj.setRequestHeader("content-type","application/x-www-form-urlencoded");
        httpObj.send("text="+text+"&to="+to);
    }
}
```
PHPのファイル関数をMacのCRに対応させるには auto_detect_line_endings = On

http://fdays.blogspot.com/2008/07/macphp.html
http://blog.livedoor.jp/haruchaco/archives/1278445.html


> php.iniで設定する場合
; auto_detect_line_endings = Off
// ↓書き換えてApache再読み込み
auto_detect_line_endings = On
httpd.confや.htaccessで設定する場合
php_value auto_detect_line_endings 1
プログラム内で設定変更する場合
ini_set('auto_detect_line_endings', 1);
WordPress: feedをサムネイル付き抜粋文にする【functions.php】 


```php:functions.php
/**
 * feedをサムネイル付き抜粋文にする
 */
add_filter('the_excerpt_rss', 'diw_post_thumbnail_feeds');
add_filter('the_content_feed', 'diw_post_thumbnail_feeds');

function diw_post_thumbnail_feeds($content){
    global $post;
    if(has_post_thumbnail($post->ID)){
        $content = '<div>'
        . get_the_post_thumbnail($post->ID,  'thumbnail') 
        . '</div>' . $content;
    }
    return $content;
}
```
WordPress: 不要なメタタグを削除する【functions.php】


```php:functions.php
/**
 * 不要なメタタグを削除
 */
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'index_rel_link');
remove_action('wp_head', 'start_post_rel_link');
remove_action('wp_head', 'parent_post_rel_link');
remove_action('wp_head', 'adjacent_posts_rel_link');
```
FacebookページのiFrameタブページでスクロールバーを表示しない関数

2011年12月31日以降setAutoResizeは使えなくなった。setAutoGrowをつかう。

```js:
window.fbAsyncInit = function() {
  FB.init({
    appId      : 'XXXXXX'
  });
  FB.Canvas.setAutoGrow();
}
```
[FB.Canvas.setAutoResize](https://developers.facebook.com/docs/reference/javascript/FB.Canvas.setAutoResize/)
[FB.Canvas.setAutoGrow](https://developers.facebook.com/docs/reference/javascript/FB.Canvas.setAutoGrow/)
PHP5 でオブジェクトを何でもキャスト

あまりオススメできない。

参考：http://stackoverflow.com/questions/2226103/how-to-cast-objects-in-php

```php:php_cast.php
<?php

$a = new A();
$b = cast($a, 'B');
$a->foo(); // A!
$b->foo(); // B!

function cast($obj, $toClass)
{
    if (!class_exists($toClass)) {
        return false;
    }
    $length = strlen($toClass);
    $objIn  = serialize($obj);
    $objOut = '';
    if (preg_match('/\AO:\d+:\".*?\":(.*?)\z/', $objIn, $matches)) {
        $objOut = sprintf('O:%d:"%s":%s', $length, $toClass, $matches[1]);
    }
    return unserialize($objOut);
}

class A
{
    public function foo()
    {
        print 'A!' . PHP_EOL;
    }
}

class B
{
    public function foo()
    {
        print 'B!' . PHP_EOL;
    }
}
```
CoffeeScriptでRubyのArray#rejectするには

Qiita良いさげ〜！ 使ってみるテスト

CoffeeScriptでRubyのArray#rejectするには

```ruby:array_reject.rb
a = [1,2,3,4,5]
a.reject {|v| v==3}
```

```coffeescript:array_reject.coffee
a = [1,2,3,4,5]
n for n in a when n!=3
```
HTML5 の step 属性を使いつつも強制はさせない

HTML5 のフォームの新機能、 type="number" の step 属性はなかなか便利ですが、入力補助のみで強制はさせたくないという場合もあります。

そんなときは、novalidate 属性をセットすればとりあえずごまかすことは可能です。他の入力値チェックもすべて無効になりますが…。

```
<form novalidate="novalidate">
  <input name="number" type="text" type="number" step="100" />
```
com.android.internal.R のリソースにアクセス

private なリソースでもアクセス出来ます。

例）QuickSearchBox の表示
参考：http://mpigulski.blogspot.com/2011/03/accessing-comandroidinternalr-resources.html

```java:resource_access_test.java
package com.wakuworks.test;

import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.LinearLayout;

public class SearchBarActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        int id = Resources.getSystem().getIdentifier("search_bar", "layout", "android");        

        LinearLayout linearLayout = new LinearLayout(this);
        LayoutInflater factory = LayoutInflater.from(this);
        factory.inflate(id, linearLayout);

        setContentView(linearLayout);
    }
}
```
NFSの共有ディレクトリの確認

showmount コマンドで確認できる。
NASのファームをアップデートしたら、公開ディレクトリが変わってクライアントからマウントできなかったのでメモ。

```
$ /sbin/showmount -e 192.168.81.4
Export list for 192.168.81.4:
/raid0/data/_NAS_NFS_Exports_     *
```
Rで最頻値を求める

Rにはなぜか最頻値を求める関数って無いですよね。。。

```R:statmode.R
statmode <- function(x) {
  names(which.max(table(x)))
}
```

```R:実行例
x <- c("a", "b", "b", "c", "c", "c", "d", "d", "e")
y <- c(1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5)
z <- c(1.1, 1.1, 2.2, 2.3, 2.4, 3.1, 3.2, 3.4, 3.5, 4.8, 4.8, 4.8, 5.6, 5.6)
(mode <- statmode(x))
(mode <- statmode(y))
(mode <- statmode(z))
```
```R:結果
[1] "c"
[1] "3"
[1] "4.8"
```
他にいいやりかたがあったら教えてください。
ページ内の画像への直リンクを全部開く

あとはわかるよな？

```javascript:open_all_images.js
var ss = document.evaluate("//a",document,null,7,null);
for(var i = 0; i<ss.snapshotLength; i++) {
  var url = ss.snapshotItem(i).getAttribute("href");
  if (url && url.search(/(jpg|jpeg|png)$/) != -1) window.open(url);
}
```
　
　
##すごくざっくりとした解説

###XPath による DOM エレメントの抽出

１行目の document.evaluate() は、XPath を使って DOM を抽出するメソッドです。
DOM 抽出は jQuery が使えるならそのほうが楽なんですが、FireFoxのグリースモンキーや、Chromeのユーザースクリプト、ブックマークレットのように jQuery が使えないときに、その代用として使えます。また、ネイティブ実装によって処理されるので、jQueryより検索が早くなる事が期待できます。

引数が５個ありますが、とりあえず使うのは、第１，４引数だけです。

-第１引数の "//a" は 「 a タグを、ルート要素からの子孫要素内について検索」のXPath 表記です。"//" は子孫要素内の検索を意味し、"a" は a タグを指定しています。そして、最初に何も書いてないのでルートからの検索になります。
-第４引数は9なら最初１個だけ抽出、7なら全部抽出、と覚えておけばよいです。
あとの引数は、とりあえず固定でかまいません。

詳しくは https://developer.mozilla.org/ja/Introduction_to_using_XPath_in_JavaScript ここら辺を参照してみてください。XPathの構文については、なんだかんだでwikipediaが分かりやすかったです。ググって調べてください。


###抽出結果の取得

さて、これで XPath の条件にあった DOM エレメントが抽出されました。次以降の for 文では、抽出した要素を抜き出しています。
evaluate メソッドの返値は snapshot と呼ばれるオブジェクトで、snapshotLengthというプロパティとsnapshotItem()というメソッドを持っています。抜き出し方は簡単で、snapshotLengthで抽出した要素数を取得して、そのインデックスをsnapshotItem()に渡せばDOMエレメントが返ってきます。３行目では、返ってきたDOMエレメントから直接 href の値を取得しています。

あとは、取得したリンク先の最後が、jpg、jpeg、png のどれかなら window.open() しておしまいです。
Perlよくわからん

うーーん、よくわからん

```sh:sample.sh

/Users/massat% perl -MData::Dumper -e 'my @array = [1,2,3]; foreach (@array) { warn Dumper $_ };' 
$VAR1 = [
          1,
          2,
          3
        ];

/Users/massat% perl -MData::Dumper -e 'my @array = (1,2,3); foreach (@array) { warn Dumper $_ };'
$VAR1 = 1;
$VAR1 = 2;
$VAR1 = 3;

```

何ができてるんだろ
現在表示されているタイトル一覧を取得するjQueryのコード


```JavaScript:タイトル一覧を取得するコード
$('.item-box-title a').each(function(i,e){
	if($(e).attr('title') == 'Open Item Page') console.log($(e).html());
});
```

ブラウザのコンソールで叩くと実行されます。
もっといい書き方があればコメントお願いします。
SCSS（Sass）のコンパイルエラー時に通知する

`Sass::Plugin.on_compilation_error` メソッドにブロックを渡すことで、コンパイルエラーが起きた時にブロック内を実行させることができます。
下はSassについてくるscssコマンドに、エラー処理を追記した物です。
ファイル名を scss-with-notification とでもして使うといいかな。

    #!/usr/bin/env ruby
    
    require 'sass'
    require 'sass/exec'
    
    require 'sass/plugin'
    Sass::Plugin.on_compilation_error do |error, template, css|
      # Do something such like sending email or alerting to IRC and so on
      $stderr.puts "SCSS compilation error #{File.realpath(error.sass_filename)} (Line #{error.sass_line}: #{error.message})"
    end
    
    opts = Sass::Exec::Scss.new(ARGV)
    opts.parse!
MySQLをSqliteに変換する。

```ruby:mysql2sqlite.rb
#!/usr/bin/env ruby
require 'rubygems'


if ARGV.size < 1 or not ARGV.all?{|e|  File.exist? e} then
   puts "usage: #{__FILE__} mysql_create_table.sql
          MySQL の show create table などで出力したファイルを引数に指定する"
           exit 2
end

open(ARGV[0],"r"){|f|
  f.each_line{|line|
    line = line.gsub /engine[^\s]+/, ""
    line = line.gsub /character\s+set\s+'utf8'/, ""
    line = line.gsub /drop\s+table\s+if\s+.+$/, ""
    line = line.gsub /use.+$/, ""
    line = line.gsub /lock.+$/, ""
    line = line.gsub /unlock.+$/, ""
    line = line.gsub /key\s+.+$/, ""
    line = line.gsub /auto_increment\s/, ""
    line = line.gsub /bigint\s/, "int "
    line = line.gsub /unsigned\s/, ""
    line = line.gsub /tinyint\s/, "boolean "       #tinyint は booleanへ
    line = line.gsub /default\s+.+,/, ","          #tinyint にdefault 1 が設定されてるとまずいので消す
    line = line.gsub /#.*$/, ""                   # コメントは消す
    puts line

  }


}
```

Mysqlのcreate tableをsqliteのcreate tableにざっくり変換する。
シングルトンパターン

典型的なシングルトンパターンだよ。

```actionscript:Singleton.as

package jp.ceroan {
	import flash.errors.*;
	
	/**
	 * Singleton
	 * @author OKI Yoshiya (ceroan)
	 */
	public class Singleton {
		private static var _instance:Singleton = new Singleton();
		
		private static var _uid:String;
		
		public function Singleton() {
			if (_instance) throw new IllegalOperationError("Singletonクラスはインスタンスを生成できません。");
		}
		
		/**
		 * Singletonクラスにアクセスするためのインスタンスを取得します。
		 * @return Singletonインスタンスを返します。
		 */
		public static function get instance():Singleton {
			return _instance;
		}
		
		public function get uid():String { return _uid; }
		public function set uid(value:String):void {
			_uid = value;
		}
		
	}

}
amazonMarketplaceWebServiceのcondition変換用関数

amazon の　MarketplaceWebServiceを使うときに混乱しやすい、conditionの値。
送信するときには英語名なのに、レポートで取得するときには数字で帰ってくるし、画面上には日本語で表示しないといけないし。
というわけで、変換するための関数です。
　※※ソースの中に日本語入れると文字化けするのはなぜ？？？

//ex.  $searchArray=array("jp"=>"中古品-可"),$keyName=number とすると
//日本語表記で「中古品-可」のステータスの番号を返す

	function getConditionValue($searchArray,$keyName){

		$array=array(
			"11"=>array(
				"number"=>"11",
				"jp"=>"新品",
				"en"=>"New",
			),
			"1"=>array(
				"number"=>"1",
				"jp"=>"中古品-ほぼ新品",
				"en"=>"UsedLikeNew",
			),
			"2"=>array(
				"number"=>"2",
				"jp"=>"中古品-非常に良い",
				"en"=>"UsedVeryGood",
			),
			"1"=>array(
				"number"=>"3",
				"jp"=>"中古品-良い",
				"en"=>"UsedGood",
			),
			"4"=>array(
				"number"=>"4",
				"jp"=>"中古品-可",
				"en"=>"CollectibleAcceptable",
			),
		);
		foreach($array as $key=>$val){
			foreach($searchArray as $searchKey=>$searchVal){
				if($val[$searchKey]==$searchVal){
					return $val[$keyName];
				}
			}
		}
		return false;
	}
詳細toString

Objectの中身も知りたい時に

```as3:string.as
static public function string(source:*):String{
	var name:String = getQualifiedClassName(source);
	var str:String, flag:Boolean;var s:String
	if( !source ){
		return "null";
	}if ( source is String ) {
		return '"' + source.toString() + '"';
	} else if ( name == "Object") {
		str = ""; flag = false;
		for ( s in source) {
			if( flag ){ str += "," }
			flag = true;
			str += " " + s + ":" + string( source[s] ) ;
		}
		return "{ " + str + " }";
	} else if ( source is Array ) {
		str = ""; flag = false;
		for ( s in source) {
			if( flag ){ str += "," }
			flag = true;
			str += " " + s + ":" + string( source[s] ) ;
		}
		return "[" + str + "]"
	
	} else if ( source is Vector.<*> ) {
		str = ""; flag = false;
		for each( var e:* in source ) {
			if( flag ){ str += "," }
			flag = true;
			str += string( e );
		}
		return "Vector([" + str + "])"
	}
	return source;
}
```
オブジェクトの複製

AS3だとめんどくさいディープコピーの作成。

完全なディープコピーは無理そうなので、以下の条件で妥協。

■プリミティブ型、clone関数をもつ型(Matrix,Pointなど)、ByteArray型、およびこれらによって形成されるArray,Vector,Dictionary型のオブジェクトの複製を返す。
■その他は浅いコピー

```as3:clone.as
static public function clone(source:*):*{
	var name:String = getQualifiedClassName(source);
	var o:*;
	var classDef:Class;
	var cloneFunction:Function;
	if( name == "Object" || name == "Array" || source is Vector.<*> || name == "flash.utils::Dictionary" ){
		classDef = getDefinitionByName(name) as Class;
		o = new classDef();
		
		var flag:Boolean = false; 
		for( var s:Object in source ){
			o[s] = clone( source[s] );
			flag = true;
		}
		return o;
	}else if( name == "flash.utils::ByteArray" ){
		classDef = getDefinitionByName(name) as Class;
		o = new classDef();
		var p:uint = source.position;
		source.position = 0;
		source.readBytes(o, 0, source.length);
		source.position = p;
		return o;
	}else if( source is Object && source.hasOwnProperty("clone") && (cloneFunction = source.clone) is Function && cloneFunction.length == 0 ){        
		return source.clone();
	}
	return source;
}
```
Rubyのlambdaリテラル

矢じるしと引数リストのカッコがくっついてないとエラーになるよ

``` ruby:sytanx-error.rb
-> (x) { x+1 }
```
``` irb:irb
SyntaxError: (irb):7: syntax error, unexpected tLPAREN_ARG, expecting keyword_do_LAMBDA or tLAMBEG
-> (x) { x+1 }
```

``` ruby:success.rb
->(x) { x+1 }
```

ちなみにカッコなしだと

``` ruby:success.rb
-> x { x+1 }
->x { x+1 }
```
どちらも関数をつくってくれます
dyld: Library not loaded

Macでappを配布するとき、このエラーが出てちょっと困ったのでメモ。
結論から言えば、動的リンクライブラリが絶対パスで指定されていたのが原因だった。

```sh
otool -L binfile
```

で依存関係を調べて

```sh
install_name_tool -change old_path new_path binfile
```

でそのパスを変更できる。

```sh:例
install_name_tool -change /System/Library/Frameworks/OpenAL.framework/Versions/A/OpenAL @executable_path/../Frameworks/OpenAL.framework/Versions/A/OpenAL Birth
```

Macの場合は`@executable_path`というキーワードが、実行ファイルの含まれるディレクトリに置換されるらしい。
IronPytonでのファイルの文字コードの扱い

sjis ファイルの読み書き。最終的な結果はごく普通ですが、、、

まず、ふつうにぐぐると codecs.getreader/writer を使った例が出てますが、

+ バイナリモードを強制されて行末処理をやってくれない
+ codec に shift-jis, cp932 がない。mbcs なら指定できますけど windows の言語切り替えなんかをされると不安

ので不可。結論としては string.encode(), decode() を使用します


読み込み：

```python
for line in open('file.txt', 'rt'):
    linedec = line.decode('cp932')
   ...
```


また、書き出しは

```python
str(a_unicode_string)
```

が UnicodeEncodeError になるという素敵な仕様orz のため型のはっきりしないオブジェクトを
扱う場合デフォルト動作に頼れず、自力文字列化が必要です。この部分の表記法はなぜか

```python
'%s' % obj
```

とやるとできてしまいます。（このコードの動作 str() と同じであってもいい気もするんですが）

あと、文字コード設定を何もしないで open したファイルに unicode 文字列を書き出そうとすると、 UnicodeEncodeError くらいます。しかも text モードで開いた場合、書き出したところでなく、flush 時におきるのでエラーリカバリができないというなかなか困った動作をします。
UTF16 のバイナリファイルとは扱ってくれていないようで。


というわけで書きだし：

```python
f=open('sjis.txt', 'wt')
lineenc = linestr.encode('cp932')
print >>f, lineenc
print >>f, ('%s' % some_object).encode('cp932')
```
CppUTestでコマンドラインオプションを指定して実行

CppUTestの`RunAllTests()`に渡すコマンドラインオプションでいろいろ指定できる。

```C++:RunAllTest.cpp
int main(void)
{
   const char *argv[] = { "", "-v", "-r3" };
   return CommandLineTestRunner::RunAllTests( 3, argv);
}
```

`-v`:実行したそれぞれのテストの名称を出力する。

`-r#`:指定した回数だけテストを実行する。メモリリークをテストするときなどに便利。

`-g`:文字列で指定したグループのテストのみを実行する。

``-gTargetTestGroup``

※テストグループはひとつしか選べない模様。複数指定した場合は最後の指定が実行される。

``-gNoRunningTestGroup -gRunningTestGroup``

`-n`:文字列で指定した名前のテストが実行される。異なるグループに同名のテストがあった場合、それら全てが実行される。

特定のテストグループ内の特定のテストを絞りこみで実行することもできる。

`-gHogeGroup -nFugaTest`

`-ojunit`JUnit antプラグインスタイルのXMLファイルで実行結果が出力される。
出力場所はソースと同じ場所？(VS2010)
はてなフォトライフにアップロードする。

```ruby:fotolife
#!/usr/bin/env ruby
require 'rubygems'
require 'net/http'
require 'wsse'
require 'base64'
$KCODE='u'
if ARGV.size < 1 or not ARGV.all?{|e|  File.exist? e} then
  puts "usage: #{__FILE__} 画像ファイル名
          ファイル名はタイトルになる。
          タイトル指定したいときはファイル名を使えば良い。"
          exit 2
end
ARGV.each{|e|
    f_name = e
    a = File.basename(f_name).split('.');a.pop
    title = a.join('.')
    content = Base64.encode64(open(f_name).read)
    xml = "<entry xmlns=http://purl.org/atom/ns >"+
            "<title>#{title}</title>"+
            "<content mode='base64'  type='image/jpeg'>#{content}</content>"+
            "</entry>"
    username, password = %w!takuya_1st xx***Xxx! ##ここにID/PWを入れる
    http = Net::HTTP.start("f.hatena.ne.jp", 80)
    response = http.get('/atom',{'X-WSSE' => WSSE::header(username, password )})
    response = http.post('/atom/post',xml, {'X-WSSE' => WSSE::header(username, password )})
    response.body =~ /<hatena:syntax>([^<]+)<\/hatena:syntax>/
    foto_id = $1
    puts "[#{foto_id}](#{title})"
}
```

フォトライフにファイルを纏めてアップロードする。

./fotolife *.png

と叩いて使う。

gem install wsse

が必要
3Dでしっぽがにょろにょろ

3Dでしっぽがにょろにょろするインタラクションを作りたいな、と思うことがある。そんなときどうするか。

# しっぽの関節を定義

まずは関節から作り始める。このとき、関節の親子関係は考えないほうが、あとの計算が楽になる。

```cpp
class Joint {
public:
	float3d position;	// 関節の位置
	Quaternion rotation;	// 関節の角度
	float interval;	// 前の関節との距離
};
```

ここでは物理的な正確さは本題ではないので、速度ベクトルや角速度は、持たなくてもわりと問題ない。

# 関節のリストを作る

続いて、関節の配列をつくって初期化する。
今回は、しっぽの付け根がjoints[0]、末端がjoints.back()と対応付けられるようにした。

```cpp
const int JOINTS_NUM = 21;	// 関節の数
const float INTERVAL = 0.18f;	// 関節同士の間隔

// 配列を確保
std::vector<Joint> joints;
joints.resize(JOINTS_NUM);

// 各関節の値を設定
for (int i = 0; i < JOINTS_NUM; ++i) {
	joints[i].interval = INTERVAL;
	joints[i].position = float3d(0.0f, 0.0f, INTERVAL * i);	// しっぽはZ軸正の方向へ伸びる
}
```

# しっぽの付け根を動かす

しっぽ全体を動かす前に、付け根だけを動かしてみる。
sin関数でY軸に対する回転量を変化させて、しっぽの付け根が周期的に揺れるようにする。

```cpp
const float ROT_WIDTH = 0.4f;	// 回転の変化の幅(ラジアン)
float theta = 0.0f;	// 今の位相を表すグローバル変数

void update(float delta_time) {
	theta += M_PI * 2.0f * delta_time;
	while (theta > M_PI) theta -= M_PI * 2.0f;

	// 軸と回転の大きさから、3次元的な角度を求める
	joints[0].rotation = Quaternion::fromAngleAxis(std::sin(theta) * ROT_WIDTH, float3d(0, 1, 0));
}
```

# 他の関節を動かす。

付け根の動きができたら、これをほかの関節にも伝播していくようにしよう。

```cpp
void updateSingleJoint(float delta_time, Joint& joint, const Joint& prev_joint) {
	// 回転を前の関節に近づける
	Quaternion rotation = Quaternion::slerp(joint.rotation, prev_joint.rotation, delta_time * 30.0f);	// 2つの3次元角度の中間を求める
	rotation.normalize();
	joint.rotation = rotation;

	// 位置を前の関節から推定される位置に近づける
	float3d target = prev_joint.position + joint.rotation.getRotated(float3d(0, 0, joint.interval));
	joint.position += (target - joint.position) * 50.0f * delta_time;
}
```

ここで30.0fと50.0fという謎定数が出てきたが、これは角度や位置の伝播しやすさを決める係数で、今適当に決めた。
delta_timeが1.0f/50.0fを超えると、位置の補間が予期せぬ値になってしまう可能性があるので、あらかじめうまく丸めてやる必要がある。

```cpp
void updateJoints(float delta_time) {
	// delta_timeが大きいときは、1/50秒未満の内部フレームに分割する
	float internal_frames_num = std::ceil(delta_time * 50.0f);
	float internal_dt = delta_time / internal_frames_num;

	for (float j = 0.0f; j < internal_frames_num; ++j) {
		for (int i = 1; i < JOINTS_NUM; ++i) {
			updateSingleJoint(internal_dt, joints[i], joints[i-1]);
		}
	}
}
```

これでしっぽの動きは完成した。
こうしてできた関節に、三角形メッシュをうまいこと結び付けてやれば、それっぽいアニメーションを得ることができるだろう。

# 本体としっぽを同時に動かす

実際にしっぽをにょろにょろさせる際には、本体としっぽとを同時に描画することになる。
このとき、本体の位置と回転をそのまま利用してしっぽを描画するとよくない。せっかく慣性が残るようにしたしっぽの挙動に、本体の回転が足されてよくわからなくなってしまうからだ。
これを防ぐには、しっぽを描画する際に本体の回転を考慮しないようにする。

OpenGLで書くと、以下のようになる。

```cpp
void draw() {
	glPushMatrix();
		glTranslatef(本体の位置);
		glPushMatrix();
			glRotatef(本体の回転);
			// 本体の描画
		glPopMatrix();
		glTranslatef(本体からしっぽの付け根へのベクトル);
		// しっぽの描画
	glPopMatrix();
}
```

本体の回転は、付け根の回転としてしっぽに与えてやればいい。
速度を考えなくても、回転だけ考えていれば意外とそれっぽくなるというのが、今回のポイントだ。
特定のファイルが含まれるパッケージを探す

* Q: 某所から持ってきた tarball 展開して ``make`` したら何か ``X11/Intrinsic.h`` が無いって怒られた……どのパッケージにあるかわかんないよーうわーん
* A1: [Ubuntu パッケージ検索](http://packages.ubuntu.com/ja/) の「パッケージの内容を検索」を使うんだ
 * [Ubuntu -- パッケージ内容検索結果 -- X11/Intrinsic.h](http://packages.ubuntu.com/search?searchon=contents&keywords=X11%2FIntrinsic.h&mode=exactfilename&suite=oneiric&arch=any)
 * やった、libxt-dev パッケージをインストールすればいいんだね!
- A2: apt-file をインストールしてみ、捗るぞ

```
$ sudo apt-get update
$ sudo apt-get install apt-file
$ sudo apt-file update
$ apt-file search X11/Intrinsic.h
libxt-dev: /usr/include/X11/Intrinsic.h
tendra: /usr/lib/TenDRA/lib/include/x5/t.api/X11/Intrinsic.h
```

参照：[Ubuntu Weekly Recipe：第16回　パッケージの使いこなし：必要なファイルの含まれるパッケージの探し方, Debianパッケージの流用｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0016)
参照：[特定のコマンドやファイルがどのパッケージに含まれているかを検索できる"apt-file" - RX-7乗りの適当な日々](http://d.hatena.ne.jp/rx7/20080830/p1)
いろんなシングルトンパターン

サンプルコード

どの書き方が好みですか？
せるさんにネーミングが変と言われて、最初は気にしなかったけどちょっと気になってきたのでなおしたｗ

```as3:Test.as
package  
{
	import flash.display.Sprite;
	import hoge.moja.NewSingleton;
	import hoge.moja.OldSingleton;
	import hoge.moja.OldSingleton2;
	
	public class Test extends Sprite 
	{
		public function Test() 
		{
			OldSingleton.getInstance().test();
			OldSingleton2.getInstance().test();
			NewSingleton.test();
		}
	}
}
```

### よく使われるシングルトンパターン。
問題としては getSingleton() を呼ぶ前は new できてしまう。

```as3:hoge.moja.OldSingleton.as
package hoge.moja 
{
	public class OldSingleton 
	{
		private static var _instance: OldSingleton;
		
		public function OldSingleton() 
		{
			if (_instance) 
				throw new Error("シングルトンインスタンスは new できません");
		}
		
		public function test(): void
		{
			trace("old singleton");
		}
		
		public static function getInstance(): OldSingleton
		{
			return _instance||= new OldSingleton();
		}
	}
}
```

### よく使われるシングルトンパターンを改良したもの。
OldSingletonImpl は他のクラスから参照できないので他のクラスが new できない。

```as3:hoge.moja.OldSingleton2.as
package hoge.moja 
{
	public class OldSingleton2 
	{
		private static var _instance: OldSingleton2;
		
		public function OldSingleton2(impl: OldSingletonImpl) { }
		
		public function test(): void
		{
			trace("old singleton 2");
		}
		
		public static function getInstance(): OldSingleton2
		{
			return _instance||= new OldSingleton2(new OldSingletonImpl());
		}
	}
}
class OldSingletonImpl
{
	function OldSingletonImpl() { };
}
```

### 新しいシングルトンパターン。
簡単に書ける。

```as3:hoge.moja.NewSingleton.as
package hoge.moja 
{
	public const NewSingleton: NewSingletonClass = new NewSingletonClass();
}
class NewSingletonClass
{
	function NewSingletonClass() { }
	
	public function test(): void
	{
		trace("new singleton");
	}
}
```
S3 にファイルアップロード

いろいろ定義:

```PHP:bootstrap.php
define('AWS_ACCESS_KEY', 'YOUR AWS ACCESS KEY');
define('AWS_ACCESS_SECRET', 'YOUR AWS ACCESS SECRET');
define('BUCKET_NAME', 'YOUR BUCKET NAME');
```

S3 にアップロードするクラス:

```PHP:Upload.php
private static function uploadToS3($filePath, $mimeType)
{
	$s3 = Services_Amazon_S3::getAccount(AWS_ACCESS_KEY, AWS_ACCESS_SECRET);
	$bucket = $s3->getBucket(BUCKET_NAME);
	
	$s3FilePath = date('Y/md/His') . basename($filePath);
	$object = $bucket->getObject($s3FilePath);
	$object->contentType = $mimeType;
	$object->acl = Services_Amazon_S3_AccessControlList::ACL_PUBLIC_READ;
	$object->data = file_get_contents($filePath);
	$object->save();
	
	$url = $object->getUrl();
	//$url = str_replace('%2F', '/', $url);
	return $url;
}
```

上のクラスを使うコントローラクラス:

```PHP:ExampleController.php
	Upload::uploadToS3('example.jpg', 'image/jpeg');
```
[test] スクロールイベントとマウスホイールを仕分け

test ということで以下すべて gist から転載。
IE(Windows?)がマウスホイールでスクロールした時動きがきもいので
マウスホイールとスクロールバーを事業仕分け
mousewheel → scroll の順にイベントが発生しているようなので
mousewheel 中にフラグを持たせとくだけの簡単なお仕事
制作案件中の Coffee の一部抜きだし単体でのテストはしてないお。
あくまで理屈だけ…ということでここはひとつ

```coffeescript:test.coffee
do(window)->
  win = window
  useMouseWheel = false

  ###
  スクロールイベントをりすん
  ###
  win.onscroll = (event)->
    scroll(event)

  ###
  マウスホイールイベントをリスン
  firefox対策
  ###
  if typeof(win.onmousewheel) isnt 'undefined'
    win.onmousewheel = (event)->
      wheel(event)
  else
    win.addEventListener(
      'DOMMouseScroll',
       (event)->
         wheel(event)
      , false )


  ###スクロールバーでのスクロールイベント###
  scroll = (event)->
    ###マウスホイールによって発生した場合処理をしない###
    if useMouseWheel is true
        console.log "do mouse Wheel"
        #フラグだけ戻して処理を終了
        useMouseWheel = false
        return

    console.log "scrollbaaaaaaaaaaaaaaa"
    return


  ###マウスホイールでのスクロールイベント###
  wheel = (event)->
    useMouseWheel = true

    ###do something mouseWheel Event###
    console.log "mouse wheeeeeeeeeeeeeel"
    ###
    あとは投げっぱなしジャーマン
    ###
    return
  return
```
現在のCPUの余力を教えてもらう

topとかで眺めるのはいいんだけど他の場所に送りつけてロギングしたいとか定期的に集めてグラフ化したいとかそういう場合にtopは使いにくいしvmstatは表示数多すぎて困るという場合に残存CPU力を送りつけるワンライナー
vmstat|grep -v o|perl -i -pe 's/\s+/ /g'|cut -d ' ' -f 16
これをRubyで` `で囲って送りつける感じ。
byobu でscreenと tmux の切り替え

Ubuntu でPPA のbyobu screen を使っていたらtmux が起動しようとして転けていた．

>$ byobu
>exec: 162: tmux: not found
>$ byobu -v
>byobu version 5.2
>Screen version 4.00.03jw4 (FAU) 2-May-06

screen/tmux 両対応になったらしい．
とりあえずscreen で起動するには，byobu-screen でok

>$ byobu-screen

環境変数を設定することで byobu コマンドで好きな方が呼べる．

>$ export BYOBU_BACKEND=screen
>$ export BYOBU_BACKEND=tmux
Vector型からArray型に変換する汎用関数

AS3のVector型で作ったけれどArray型しか突っ込めないときに使うユーティリティーメソッドです。
ほとんどの案件で利用していますｗ

```actionscript3:VectorUtil.as
/**
 * Convert Vector instance to Array instance
 * @param value Vector instance
 * @return Array Array Instance
 */
public static function toArray(value:*):Array
{
	var arr:Array = [];
	for (var i:int = 0; i < value.length; i++)
	{
		arr[i] = value[i];
	}
	return arr;
}
```
NLTKを使って情報利得を計算

最大エントロピー分類器などを訓練するときに，素性選択をおこなって特徴的な素性を用いたいときに情報利得を使います．
[この本](http://www.amazon.co.jp/%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80-%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%AB%98%E6%9D%91-%E5%A4%A7%E4%B9%9F/dp/4339027510/ref=sr_1_2?ie=UTF8&qid=1328698086&sr=8-2 "言語処理のための機械学習入門")がとてもわかりやすいです．


```python:informationgain.py
from math import log
from nltk.util import ngrams
from nltk.tokenize import word_tokenize
from nltk.probability import ConditionalFreqDist
from nltk.probability import FreqDist


def information_gain(labeled_documents):
    ig = {}
    labeldist = FreqDist()
    docnumdist = FreqDist()
    cldist = ConditionalFreqDist()

    n = 1
    for (label, doc) in labeled_documents:
        labeldist.inc(label)
        unigrams = set(ngrams(word_tokenize(doc), n))
        for unit in unigrams: 
            cldist[unit].inc(label)
            docnumdist.inc(unit)

    H_C = 0.0
    pr_label = {}
    for label in labeldist.samples(): 
        if not label in pr_label: pr_label[label] = 0.0
        pr_label[label] = labeldist[label] / float(labeldist.N())
    H_C = -sum([pr * log(pr, 2) for pr in pr_label.values()])
    print "H(C) = %.2f" % H_C


    H_C_given_X = {}
    for c in cldist.conditions():
        for label in cldist[c].samples():
            print "Pr(%s|X_{%s} = 1) = %.2f" % (label, c, cldist[c][label] / float(labeldist[label]))
            print "Pr(%s|X_{%s} = 0) = %.2f" % (label, c, 1.0 - cldist[c][label] / float(labeldist[label]))
            pr_label_given_x1 = cldist[c][label] / float(labeldist[label])
            pr_label_given_x0 = 1.0 - pr_label_given_x1

            if not "%s = 1" % c in H_C_given_X: H_C_given_X["%s = 1" % c] = 0.0
            H_C_given_X["%s = 1" % c] -= pr_label_given_x1 * log(pr_label_given_x1, 2)
            if not "%s = 0" % c in H_C_given_X: H_C_given_X["%s = 0" % c] = 0.0
            H_C_given_X["%s = 0" % c] -= pr_label_given_x0 * log(pr_label_given_x0, 2)
        print

    for c in cldist.conditions():
        pr_x1 = docnumdist[c] / float(docnumdist.N())
        pr_x0 = 1.0 - pr_x1
        if not c in ig:
            ig[c] = H_C - pr_x1 * H_C_given_X["%s = 1" % c] - pr_x0 * H_C_given_X["%s = 0" % c]

    for i, j in sorted(ig.items(), key=lambda x:x[1], reverse=True): print i, j


documents = [("pos", "good good good excellent"), ("pos", "good very excellent"),
             ("pos", "good fine good excellent"), ("pos", "bad very fine"),
             ("neg", "bad bad worse"), ("neg", "worse good worse excellent"),
             ("neg", "excellent very bad"), ("neg", "bad very worse")]

information_gain(documents)
```

どちらかの極性にしか現れない''fine''や''worse''が情報利得が高く，特徴的な単語であることがわかります．
また，どちらの極性にも現れる''very''は，特徴的でない単語なので，情報利得が低いことが確認できます．

```
('worse',) 0.52573480121
('fine',) 0.5
('good',) 0.188721875541
('bad',) 0.188721875541
('excellent',) 0.0428913353502
('very',) 0.0
```
[java][android] bitmap drawable resource の変換いろいろ

```java:convertImage.java
//Resource → Bitmap
BitmapFactory.decodeResource(getResources(), R.drawable.icon);



//Resource → Drawable
getResources().getDrawable(R.drawable.icon);



/**
 * Bitmap→Drawableに変換
 * @param bitmap
 * @return BitmapDrawable
 */
public static BitmapDrawable convert(Bitmap bitmap)
{
	return new BitmapDrawable(bitmap);
}

/**
 * Drawable→Bitmapに変換
 * @param drawable
 * @return Bitmap
 */
public static Bitmap convert(Drawable drawable)
{
	return ((BitmapDrawable) drawable).getBitmap();
}
DisplayObjectをBase64文字列(png)に変換

```actionscript3:convertBase64.as
/**
* DisplayObjectをBase64文字列(png)に変換.
* @param target  画像化したいDisplayObject
* @param w 幅
* @param h 高さ
*/
//import com.adobe.images.PNGEncoder;
//import mx.utils.Base64Encoder;

        private function convertBase64(target : DisplayObject, w : Number = NaN, h : Number = NaN) : String
        {
            w = (isNaN(w)) ? target.width : w;
            h = (isNaN(h)) ? target.height : h;
            
            var bmd : BitmapData = new BitmapData(w, h, true, 0x00ffffff);
            bmd.draw(target);
            var base64 : Base64Encoder = new Base64Encoder();
            base64.encodeBytes(PNGEncoder.encode(bmd));
            var str : String = base64.toString();
            bmd.dispose();
            var str3:String = "";
            var str2:String = str.toString();
            var len:uint = str2.length;
            for (var i:uint = 0; i < len; i++)
            {
                var sub:String = str2.substr(i, 1);
                if (sub == "\n")
                    continue;
                str3 += sub;
            }
            return str3;
        }