OmniAICreator/Qiita-1.07M huggingface dataset:
elixir on Android


iexを使うとちょっとした動作確認がササッとできて便利ですよね。
このちょっとした動作確認をいつでもどこでもできるよう、elixirをAndroid端末で実行する方法を紹介します。

# SL4Aのインストール
[SL4A(Scripting Layer for Android)](https://code.google.com/p/android-scripting/)は、Android上で、スクリプトの編集と実行、対話式のインタプリタの実行ができるソフトウェアです。

SL4Aは、GooglePlay以外から入手するアプリなのでインストールするには、Android端末で、「設定->セキュリティ->提供元不明のアプリ」、をチェックしインストールを許可する必要があります。

現在の最新バージョンは、[Release 6](https://code.google.com/p/android-scripting/downloads/detail?name=sl4a_r6.apk&can=2&q=&sort=summary)です。このapkをAndroid端末にダウンロード＆インストールします。



# erlang4androidのインストール
erlang4androidは、SL4AにErlang/OTPをダウンロード&インストールする為のものです。

[R16B](https://code.google.com/p/erlang4android/downloads/detail?name=Erlang4AndroidR16B.apk&can=2&q=)のapkをAndroid端末にダウンロード&インストールします。R16B以外のバージョンもありますが、elixirはR16B以降が必須なので注意したください。

# elixir precompiled packageの入手
elixirのprecompiled packageをAndroid端末にダウンロードし、展開します。
現時点の最新バージョンは[v0.11.2](https://github.com/elixir-lang/elixir/releases/tag/v0.11.2)。なので、[v0.11.2のzipファイル](https://github.com/elixir-lang/elixir/releases/download/v0.11.2/v0.11.2.zip)をダウンロードします。

ダウンロードしたzipファイルを解凍して、「/mnt/sdcard/elixir」 に配置します。Androidのパスは端末依存があるので、環境に合わせて指定してください。

# erlang4Androidの設定
erlang4androidを起動して、InstallボタンをクリックしErlangをインストールします。インストール完了後、「メニュー->Settings」から、コマンドライン引数に

```
-pa /elixirルートパス/lib/elixir/ebin
```

のパスを設定します。

今回配置したelixirのprecompiled packageのパスに合わせると、

```
-pa /mnt/sdcard/elixir/lib/elixir/ebin 
```
になります。
 

# Erlangインタプリタの起動
SL4Aを起動し、「メニュー->View->Interpreters」を選択します。
Interpreter画面からErlangを選択すると、Erlangの対話コンソールが起動します。

# スクリプトの実行
コンソールから以下のコードを実行します。

```
elixir:eval("IO.puts to_string(20131202)",[]).
```

実行すると、

```
20131202
{ok,[],
    {elixir_scope,nil,nil,false,false,false,nil,nil,[],nil,[],
                  nil,nil,[],nil,[],[],[],<<"nofile">>,
                  ['Elixir.Integer','Elixir.Kernel','Elixir.Kernel.Typespec',
                   'Elixir.Record'],
                  [],
                  [{'Elixir.Kernel',[{...}|...]}],
                  [],
                  [{'Elixir.Kernel',...}]}}
```

# まとめ
なんとか実行はできましたが、iexと比べるとだいぶイマイチですね。。
もう少し取り回しし易い方法を調べたいと思います。


明日は[@yaotti](http://qiita.com/yaotti)さんです
Unity　途別2Dアセット

Unity4.3で2D機能が追加されましたが、
それをあまりからめず薄く広く2D用のアセットの用途別紹介です。
3Dが苦手な人も、使いたいツールを見つけてワクワクしようぜ！！
作る視点ですので、速さなどは触れておりません。

#2D toolkit
https://www.assetstore.unity3d.com/#/content/908

Unity4.3が出てから、Asset StoreのTop Paidランキングの上位にずっといるアセットですね。
Unity4.3との連動でいうと、追加された2D用の物理エンジンが使えるということみたいです。
http://www.unikronsoftware.com/2dtoolkit/docs/latest/unity_43_integration.html

##ポイント
このアセットでの2D制御での便利なポイントは以下の５つあたりかと思っています。
###スプライトシートの作成
これはまあ、普通にばらばらの画像用意したら、スプライトシート作れるよ。
という、比較的普通だけど無いと困るやつ。

###Gifアニメ作成に近い感覚でパラパラアニメ作成、制御
スプライトシートの素材からパラパラアニメを作成、制御する機能があります。
下の画像のように、一枚一枚の素材をどのくらいの秒数表示するなど設定でき、
ここで作ったアニメーション素材を簡単に呼び出すことができます。
![スクリーンショット 2013-12-01 22.56.50.png](https://qiita-image-store.s3.amazonaws.com/0/17238/64acbbdc-625a-1571-2e9b-ccd99f4469c2.png)

###素材ごとに自由な形でcolliderを追加
これはとてもありがたい！
下の画像のような感じで自由に線を引いてcolliderを追加できます。
これで、ものがぶつかった時に四角ではなくトゲトゲのオブジェクトとして認識されますね。
![スクリーンショット 2013-12-01 22.52.28.png](https://qiita-image-store.s3.amazonaws.com/0/17238/85cf89d9-3490-9151-78c6-18a4baa9df73.png)

###タイルマップでステージが作れる
シーンのウインドウで、用意したタイルマップ素材を使ってステージを描くことができます。
タイルごとにcolliderも設定できるため簡単にマップが作成、そしてすぐに試せます。
![スクリーンショット 2013-12-01 21.16.30.png](https://qiita-image-store.s3.amazonaws.com/0/17238/a4dd8d64-03e9-aa04-63b0-2aa4f6ce630a.png)

###UIも組める
ここはNGUIを私は使うため、作れるんです。くらいで。

##まとめ
気軽に使うにはとても便利！
ただ、パーツごと分解して、回転などでアニメーションとなると、
スプライト画像をUnityのアニメーションシステムで制御するようになります。

【unity】1.5日でゲーム作ってリリースしてみた
http://memo.scri.me/entry/2013/06/10/043745
ここで使いました。



#LWF for Unity
http://gree.github.io/lwf/

LWFというのは、
>LWFは独自ファイルフォーマットに基づくアニメーションエンジンであり FLASHコンテンツから変換したアニメーションデータにおいて、 UnityとHTML5の再生を可能にします。
とのことです。
http://www.slideshare.net/technicaldesign/greefsite?ref=http://labs.gree.jp/blog/category/lwf/

##ポイント
###Flashで作れる
何が便利かといいますと、Flashでアニメーションを作成してインポートできます！
正直Unityのアニメーションのデフォルトツールはしんどい。。
Flashなら慣れているんです！という方にとてもオススメ。
###資産活用
もともとFlashでの資産をもっている場合は、最適化は必要になりますが、
他のツールで作り直すよりは圧倒的に簡単にUnity上に持って来れます。

##まとめ
12/17のアドベントカレンダーもLWFなようなので、期待！
LWFのサイトからデモやサンプルをDLすることもできます。
https://github.com/gree/lwf/wiki/ForUnity



#Rageシリーズ
RageSpline
https://www.assetstore.unity3d.com/#/content/555
他に、RageToolsというSVG読み込みツールと、RageTools Proというテキストとアニメーションツールと、その３つが一緒になったRageSuiteというアセットがあります。
・・・RageSplineしか購入しておりません（セールの時に）。

##ポイント
###Unity上でパスが使える
パスで図が描けます。
そしてパスにあわせて、colliderも作れます。
パスやcolliderはどのくらいズムーズな形にするかなど設定できます。
![スクリーンショット 2013-12-02 0.04.03.png](https://qiita-image-store.s3.amazonaws.com/0/17238/713a2ab1-ee4b-2a5e-edf4-acb06cee7601.png)
###拡大に耐えられる
画像ではなくベクターなので、拡大しても綺麗です。
###アセットを揃えれば（試せてないです）
SVGをインポートできます。
アニメーションツールがあります。
全てセットで$150。

##まとめ
シンプルな図形でゲームを作るときは手軽でいいのかも？
このツールを使ったからこそ作れるゲームの種類もあるのではと思います。



#まとめ
色々なツールがありますね。
エンジニアではない方もちょっと使ってみると楽しいですよ。

4.3の2D機能についてはこちらに少しだけ書きました。
http://memo.scri.me/entry/2013/11/17/232104
ライブラリからみるJSXの特徴

JSX advent calendar #1 の記事です。

JSX製のライブラリ [mizuki](https://github.com/jsx/mizuki) を題材にして、[プログラミング言語JSX](http://jsx.github.io)の特徴を俯瞰してみたいと思います。JSXの概要については以下のスライドもあわせてごらんください。

- [JSX の現在と未来 - Oct 26 2013](http://www.slideshare.net/kazuho/jsx-oct-26-2013)

## mizuki

mizukiはブラウザに依存しないJSXのクラスライブラリで、base64 encode/decode, stable sort, md5, POSIX strftime(3)/strptime(3), メルセンヌ・ツイスタ乱数生成器などを含みます。

## 特徴1 静的型付きである

以下はdatetime.jsからの抜粋です。

https://github.com/jsx/mizuki/blob/master/lib/mizuki/datetime.jsx#L2-17

```jsx
/**
 * Set of DateTime formatting utilities
 */
class DateTime {
    /**
      * POSIX compatible <code>strftime()</code>.
      * e.g. <code>DateTime.strftime(new Date, "%Y-%m-%d %H:%M:%S.%3N")</code>
      * returns, for example, <code>2012-09-23 22:02:55.863</code>.
      *
      * @param date Date instance to be formatted
      * @param format formatting parameter
      * @see   strftime(3)
      */
    static function strftime(date : Date, format : string) : string {
        return _DateFormat.strftime(date, format, _Locale.get());
    }
```

JSXは静的型付き言語です。静的型付きの効果は以下の点があげられるでしょう。

* メソッドのシグネチャをみると引数に求められている事がわかる
  * strftime()の例だと、引数の順番は (Date, string) であってその逆ではありません
  * 間違った型の値を与えると実行時エラーではなくコンパイルエラーになります
* エディタによる補完ができる
  * 以下のスクリーンショットをごらんください。これは静的型情報をつかって静的コード解析を行い、その一つの結果として呼び出し可能なメソッドを得ることができるためです。またjsxdocが言語に統合されているため、メソッドに紐付けられたドキュメントも同時に見れるようになっています。

![jsx-vim.png](https://qiita-image-store.s3.amazonaws.com/0/207/6278ce70-6326-bc77-1b0e-e57f1005aeb5.png)

もちろんデメリットもあります。以下の点は静的型付き言語ゆえの制約といえます。

* JSONやDBからのデータとオブジェクトとの変換が煩雑
* ブラウザによるインターフェイスの違いを吸収するのが難しい

## 特徴2 ジェネリクスがある

```
class ArrayUtil.<T> {
    // ... 省略

    /**
     * Shuffles array in place.
     */
    static function shuffleInPlace(array : T[]) : void {
        ArrayUtil.<T>.shuffleInPlace(array, 0, array.length);
    }

    /**
     * Shuffles the range [begin, end) of array in place.
     */
    static function shuffleInPlace(array : T[], begin : int, end : int) : void {
        for (var i = begin; i < end; ++i) {
            var j = (Math.random() * i) as int;
            ArrayUtil.<T>.swap(array, i, j);
        }
    }
}
```

JSXはジェネリクス（またはテンプレート）があり、総称的プログラミングができます。これにより、ジェネリクスのある言語で開発された手法をある程度使えます。

一例として以下のブログをごらんください。

* [JSXでダックタイピング(型消去)が出来るようになった話](http://wasabiz.hatenablog.com/entry/2013/08/18/142749)

他にも特徴はありますが、ひとまずこのあたりで。mizukiは単純なユーティリティの詰め合わせなので、JSXの雰囲気を知るにはよいと思います。JSXプログラミングを始める際はぜひ参考にしてみてください。
.htaccess

apacheの設定ファイル。httpd.confとの違いはディレクトリ単位で設置&設定ができる点とサーバ管理者でなくともapacheの設定が行える点。設定できる項目として主なものは

- basic認証
- ipアドレスによるアクセス制限
- エラーメッセージのカスタマイズ

など。
Log::StringFormatter でログ文字列のフォーマット

ログが主食のかぜぶろです。ログがないと生きて行けません。

ログと言えば`Log::Miminal`ですが、Minimalと言いつつも様々な拡張がなされており、好みの使い方にたどり着くまでに少し時間がかかるようになってしまったなと作者自身うすうす感じております。そこで`Log::Minimal`がもつ機能を分解し、アプリケーションの開発者にとって使いやすいログモジュール／メソッドを開発者自身で作りやすくしようという狙いのもと作ったのが、`Log::StringFormatter`です

https://metacpan.org/pod/Log::StringFormatter

`Log::StringFormatter`は`Log::Minimal`の文字列の整形部分を切り出して単独のモジュールにしたものです。

使い方

    use Log::StringFormatter;
    use Scalar::Util qw/dualvar/;
     
    stringf('foo') -> 'foo'
    stringf('%s bar','foo') -> 'foo bar'
    stringf([qw/foo bar/]) -> ['foo','bar']
    stringf('uri %s',URI->new("http://example.com/")) -> 'uri http://example.com/'
    my $dualvar = dualvar 10, "Hello";
    stringf('%s , %d', $dualvar, $dualvar) -> 'Hello , 10'

`stringf` 、`stringf($message:Str)`もしくは`stringf($format:Str,@variables)`の形式で使います。`$message`、`@variables`に配列・ハッシュのリファレンス、オブジェクトが渡された場合は、適切にシリアライズし、文字列として返します。`$format`は`printf`のフォーマット文字列です

`Log::StringFormatter`を使ってログを出力するメソッドを書くと、

    sub log {
        my($level, @args) = @_;

        if (@args) {
            $message = stringf @args;
        }

        my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time);
        my $time    = sprintf(
            "%04d-%02d-%02dT%02d:%02d:%02d",
            $year + 1900,
            $mon + 1, $mday, $hour, $min, $sec
        );
        my(undef, $file, $line) = caller(0);
        warn "[$time] [$$] [$level] $message at $file line $line.\n";
    }

となります。カラーリングやログのレベルは自分好みで実装できますね！

自動でシリアライズ、`Data::Dumper`やJSONを毎回使わなくても良くなるし、一度使うともう元には戻れません。

どうぞご利用ください。ではでは
rake db:structure:dump でより詳しいDBスキーマ情報を取得する

`rake db:structure:dump (db/structure.sql)` は `rake db:schema:dump (db/schema.rb)`
より詳しい情報を出力する（PostgreSQLで確認）

主なユースケースとしては古いプロジェクトのテーブルをそのまま使った時など

調べたきっかけとしては、標準の `schema.rb` にはインデックスなどの情報は反映されているが、
以下のCONSTRAINTの情報が含まれていなかった

`ADD CONSTRAINT tbl_asdf PRIMARY KEY (hoge, fuga, hogera, hogehoge);`

DB変更時に `structure.sql` を更新するようにするには

```rb:config/application.rbまたはconfig/environment.rbなど
Rails::Initializer.run do |config|
  ...
  config.active_record.schema_format = :sql
end
```

[参考:定義したDBのconstraintがrakaのspecタスクで反映されなかった件](http://d.hatena.ne.jp/mothprog/20100603/1275536232)

気になった点はViewを定義したときは、改行がされないので見づらい
簡単なカスタムボタンの作り方


ボタンのクラスにはCCMenuItemSpriteなどがありますが、
個人的には若干癖があって使いづらいと思っていました。

そこでCCSpriteでタッチを検知できるようにして
ボタンのようにしてみようと思い作ってみました。
https://gist.github.com/t-kashima/7749894

ここではそのポイントを紹介します。


タッチを検知するため、CCTargetedTouchDelegateを継承してメソッドを追加します。

```C++:CustomButton.h
class CustomButton : public CCSprite, public CCTargetedTouchDelegate
{

private:
    virtual bool ccTouchBegan(CCTouch *touch, CCEvent *event);
    virtual void ccTouchMoved(CCTouch *touch, CCEvent *event);
    virtual void ccTouchEnded(CCTouch *touch, CCEvent *event);
```

 タッチが検知されるようにDispatcherに登録します。
これでタッチされた時に上記のメソッドに飛んできます。

```C++:CustomButton.cpp
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
```

最後に自分自身がタッチされたかどうかを判定して、
タッチされた時に画像を小さくしたりコールバックを呼び出すようにします。

```C++:CustomButton.cpp
bool CustomButton::ccTouchBegan(CCTouch *touch, CCEvent *event)
{
    CCPoint point = CCDirector::sharedDirector()->convertToGL(touch->getLocationInView());
    CCPoint convertedPoint = this->getParent()->convertToNodeSpace(point);

    bool isTouchInSide = this->boundingBox().containsPoint(convertedPoint);
    if (isTouchInSide) {
        CCLog("touchDown!!!");
    }
    return true;
}
```
これで最低限ではありますがボタンとして機能すると思います！
Capybara(selenium)でブラウザのサイズを変更する

Seleniumのテストでランダムに時々失敗するテストがあった

失敗する対象は jquery timepicker で良く起こった
（他にもドラッグアンドドロップ、ポップオーバー、折りたたみメニューなどもありそう）

環境によって失敗する要因としては次のようなものが考えられる

* マシンによってブラウザのサイズが変わる（MacBook Airだと失敗するとか）
* 平行しているプロセスの影響でマシンのパワーが圧迫を受けていてjsの動きが変わる

そこで、ブラウザのサイズを大きくすることでかなり改善した

```ruby:
  def ensure_browser_size(width = 1280, height = 720)
    Capybara.current_session.driver.browser.manage.window.resize_to(width, height)
  end
```

seleniumのときだけ有効にする
注意点は一度 `visit` を実行して、その後にサイズ変更する必要がある

```ruby:
  visit '/hoge'
  ...
  ensure_browser_size if Capybara.current_driver == :selenium
```

`Capybara.current_driver == :selenium` の条件をメソッドの中に入れても良いかも

[参考:How do I make sure the window size is always reset ...](http://stackoverflow.com/questions/19597038/how-do-i-make-sure-the-window-size-is-always-reset-after-a-resize-in-selenium)

Capybarawebkitの場合の参考
[Responsive layout tests with Capybara and RSpec](http://railsware.com/blog/2015/02/11/responsive-layout-tests-with-capybara-and-rspec/)

```rb
when :webkit
  handle = Capybara.current_session.driver.current_window_handle
  Capybara.current_session.driver.resize_window_to(handle, width, height)
```

Poltergeistの場合の参考
[Poltergeist resize](http://stackoverflow.com/questions/21690366/poltergeist-page-driver-resizewidth-height-and-page-driver-scroll-toleft-to)
issues/XXXXで始まるブランチにいたらコミットメッセージにrefs #XXXXをつけるgit hook


最近自分の関わっているプロジェクトではgitのブランチに issues/XXXX-description-of-branch という名前を付ける慣習になっている。

issues/XXXXの部分をコピーして貼り付ければredmineのURLに貼り付けて開けるため。

redmineと言えば、コミットメッセージに`refs #XXXX`と書けばチケットと紐付いたりしてくれるのだが、これを書くのを毎回忘れるので、issues/XXXXというブランチにいたら自動的にコミットメッセージに含めてくれるようにした。

[こちら](http://riskrisk.hatenablog.com/entry/2012/01/19/011406)のブログを参考にして改造した。

```sh
#!/bin/sh
# .git/hooks/prepare-commit-msg に置いて実行権限をつける

# git rev-parse --abbrev-ref HEAD は現在のブランチ名を出力するが、rebase中だとHEADになったりする
issue="`git rev-parse --abbrev-ref HEAD | grep "issues/[0-9]\+" | perl -pe 's%^issues/([0-9]+).*%$1%'`"

case "$2,$3" in
  merge,)
    /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1"
    ;;

  message,)
    if [ "$issue" != "" ]; then
      echo "refs #$issue" >> $1
    fi
    ;;

  ,)
    if [ "$issue" != "" ]; then
      mv $1 $1.tmp
      echo $'\n\n'"refs #$issue" >> $1
      cat $1.tmp >> $1
    fi
    ;;

  *)
    ;;
esac
```

.git/hooks/prepare-commit-msg の引数の$1はコミットメッセージの入ったファイル名が入る。$2は、git commit -m だと"message"になり、エディタが開かれる場合は空になる。rebase -iして自動でコミットを継ぎ足している間も空文字になるので、この場合は無視しないといけない。
FuelPHPで Warning: touch(): Utime failed: Permission denied in  〜  smarty_internal_template.php

FuelにSmartyを入れてプログラムを組んでいたのですが、表題のようなエラーが出ました。

Smartyは初回のアクセスの時にtemplates_cディレクトリに書き込みを行うということで、
その際に「権限がない」とエラーを吐いていたようです。

原因としては、
ディレクトリのパーミッション値が書き込めないような設定に
なっていたというパターンもあるようですが、
僕の場合は、Apacheの設定(httpd.conf)に書いてあるグループと
app/tmp/Smarty/templates_cディレクトリのグループが違っていたことでした。


・<a href="http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1084730120" title="【至急】サーバーの引っ越し時のsmartyの対応について - Yahoo!知恵袋">【至急】サーバーの引っ越し時のsmartyの対応について - Yahoo!知恵袋</a>（参考記事）


```php:httpd.conf
User www
Group www
```
上記のGroupの値とapp/tmp/Smarty/templates_cのディレクトリの権限のグループが違っていたので、
グループ名を合わせる事で、解決。
Laravel4 メモ

Laravel4で「こんにちは」を表示するまで
※概念の理解をザッと書く

最低限必要なのが
１：app/routes.php
２：app/controllers/◯◯
３：app/views/◯◯

URLの末尾によってアクセスする場所が変わる
その判断をしているのがapp/routes.php
で末尾が増えれば条件を増やしていく感じ

view controller routesでそれぞれファイル名や呼び出す名前を統一してやればファイル分けは出来る

うろ覚えなので、また時間が出来たら追記しますん
ゲーム制作計画8日目！

#ゲーム内容考案…
##すねーくげーむ
###NimbleQuest
企業の方に面白そうなゲームを紹介していただきました。（http://appsjp.com/?p=35243）
Nimble Questというゲームです。
これは、スネークゲーム×RPGというようなゲームみたいです。
残念ながら自分はガラケーなのでプレイはできないのですが…
説明を読む限りとてもおもしろそうなゲームだと思いました。
×RPGというのがとてもいい味をだしているなと思いました。
スネークゲームがとても単純なゲームなのでそういった他の要素が加えやすいというのもあると思います。
なにかオリジナルのようそが思いつけばいいのですが…

###×戦車？
スネークゲーム×戦車ゲームというのを少し想像してみました。
その辺に落ちているのが弾薬。
弾薬を拾うと戦車の後をついてきます。
弾薬を消費すると後ろについてくる数も減るとか。
スネークゲームらしからぬ惨状にならないように、
たくさん引き連れつつ撃破したほうが点数が高いなどの工夫があるといいと思います。
弾薬の種類を幾つか作って、拾った順（きゅー）でしか発射できないようにしたりもいいと思います。

と、ここまで書いておいてなんなのですが、
弾薬がついてくる！という要素を他のゲームで見たのを思い出してしまいました。
ここまでメインの要素をほかから持ってくるのはあまり良くないですね。

###2P要素
スネークゲームでやりたいことがひとつあって、
スネークゲームを作るのであれば
2P対戦機能を付けたいなと思います。
同じキーボードからでもいいので。
たぶん既存のものはあると思いますが、
なかなか盛り上がりそうな気がします。

###対戦特化？
2P要素を書きながら思いました。
対戦要素を加えるのではなくて、
はじめから対戦にまとを絞って作るのもよさそうだと。
その場合、若干のシューティングや陣取りの要素とかが入ったり、
するとおもしろいと思います。

###その他
その他自立できない案たちが浮かんでは消えていきます。
メインのアイデアを立ててから足す感じですね。
・最初長くてだんだん減ってくタイプはどうか
・右折限定！
・ます制じゃない。ぬるぬる曲がる。
・横スクロール←よく考えるとゲームが簡単になってしまうのでは…

#まとめ
今日のところは案に詰まりました。
NimbleQuestの構成要素が自分の好みを射抜きすぎてて
アイデアが引っ張られる…
tc2.0.4からtc2.3に2013年12月移行成功

# [2013 漢直 Advent Calendar](http://connpass.com/event/4074/) 2日目のエントリーです。

tc2.3.1 に移行できないと数ヶ月ぐらいもんもんとしていたのがタダのポカだと分かったのでここにさらします。

## 結論: INSTALL と tc.info 読んで素直に手順に従おう。

## 問題: 
いままで tc2.0.4 を使っていたが、 emacs24 にして tc2.3 の lisp とかテキトーにコピーして動かそうとしたら次のようになり困った。
反省して INSTALL 見て configure && make install して bushu.rev 自分のに置換しても同じようになった。

1. 部首合成で次のように出て合成できない。 Wrong type argument: sequencep, 21336
2. 3日77が晶にならず蠢になる。
3. 
 - 西道77が合成できない。
 - 西之77が合成できない。
 - 西え77は合成できる。
4. 右矢77が知になり→にならない。
5. 減火77が滅にならない。

ちょうどアドベントカレンダーにでも書いてtc2.0.4からtc2.3.1に移行がうまく行かなくて助けてと書こうとしたら、解決してしまいました。
アドベントカレンダー駆動問題取り組みはスゴイね。

## 解決手順: 1と2の場合

INSTALLを見て素直にインストールし直したら部首合成変換も動いた。

MacでEmacs for Mac OSX http://emacsformacosx.com/ を使っているので環境変数のEMACSを設定しておいて以下のよう実行した。

```
cd /var/tmp
git clone https://github.com/kanchoku/tc
cd tc
export EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs
export DESTINATION=~/tc
./configure --prefix=$DESTINATION --with-emacs=$EMACS && make install 
```

init.el に
load-path に `~/tc/share/emacs/site-lisp/tc/ `を加え

~/.tc に
`(setq tcode-data-directory "~/tc/share/tc/")`
を加えたらたら全部普通に合成できるし44,55も効く。

これから漢直始める人は素直にINSTALLファイル見てその通り始めましょう。

## 解決手順: 3の場合
「え之」をbushu.rev に加える。そのあとファイルをソートする。 C-x h M-x sort-line

「え之N」じゃないのね…。
「え之」を入れると気付くまでにソース読んだりbushu.revの合成部分の之を全てえにしたりして悩んでたらこれだけでよかった。

## 解決手順: 4の場合
右矢→ をbushu.revに加えてソートする。

こっちの symbol.rev 見てて気付いた…。 https://github.com/naota/tc/
これで「なわ77縄」とかも復活だ!

## 解決手順: 5の場合
というか、tc2.0.4で使っていたbushu.rev持ってきて置きかえてソートし直して動くよ…。今迄ダメだったのなんで?
減火で淡にならない!シ成に今から慣れるのもいいけど。

そんなわけで、いままで使えていた人には役に立たず、これからの人にもあんま薬にもならない記事でした。

## その他
あと困ってたのはここ数年Sumerin,Akkadian,Hittieとか学習していて
部首合成辞書に
šsv
īi-
とか入れて
šumma awīlum を入力するのに sv77umma awi-77lumとかとか入力するのができないんで移行に2の足を踏んでいたのが解決!
これらの文字を入れる時はutf-8にしてからsortしましょう。

けど中近東文化センター一般公開中止しちゃって古代語講座が…。
- - -
会社の方はWindowsなんだけど多分移行できるだろう。いま同じように3日77蠢になるんでtc2.0.4のままだけど。

以上tcの新しいものが出てから10年?ぐらい経ってから移行した記録でした。

## 追記
- え之 が bushu.revにないのは、そういう思想かも知れない。合成して出てくる漢字を見て思った。
- 3日77蠢 は正しい。 3日晶が欲しいなら、3日晶を symbol.rev に入れておくべきのようだ。
- 部首合成で思った通りにならなかったのの理由の一つは symbol.rev を bushu.rev と同じディレクトリに放り込んでなかったからみたい。

## 追記2
- 古いtcを使っている場合、特にtc2.0やそれ以前の場合は .tc を rename しておき、.emacs か init.el から tcode の lisp の path と関連表記をつぶしておいてから入れて、必要な記述を元に戻す。旧辞書の方を見ていたり lisp の path が入っている方を見ていたりしてハマッた。
- `tcode-mode`はtc2.3.1になくて `toggle-input-method`。
- もし bushu.index2 なくてエラーになったら bushu.index2 のダミーファイルを作っておく。 `touch bushu.index2`
HTTP::Message::PSGIでPSGIアプリのテストを書く

こんばんわ、こう見えてもPerl大好きなhirataraです。

PSGIのテストと言えば`Plack::Test`がデファクトスタンダードで、他に`Test::WWW::Mechanize::PSGI`や`LWP::Protocol::PSGI`を使う人もいると思います。
が、最近自分はテストを書くときに`Plack`付属の`HTTP::Message::PSGI`を直接使ってます。こいつはPSGIの入出力と`HTTP::(Request|Response)`を変換する極薄のラッパーです。

大体以下のような決まり文句で使ってます。

```pl
use strict;
use warnings;
use HTTP::Message::PSGI ();
use HTTP::Request::Common qw(GET);
use HTTP::Response;
use Test::More;

my $app = sub { [200, [], ["Hi\n"]] };

my $psgi_env = (GET "/")->to_psgi;
my $psgi_res = $app->($psgi_env);
my $res = HTTP::Response->from_psgi($psgi_res);

ok $res->is_success;

done_testing;
```

`req_to_psgi`と`res_from_psgi`いう2つのメソッドをexportしてくれるのですが、こいつよりも`HTTP::Request`と`HTTP::Response`に直接生やされたメソッドがお気に入りです。
メソッドを生やす部分の`HTTP::Message::PSGI`の該当部分はこんな感じで実装されてます。簡潔かつ豪快で好感度高いですね！

```pl
sub HTTP::Request::to_psgi {
    req_to_psgi(@_);
}

sub HTTP::Response::from_psgi {
    my $class = shift;
    res_from_psgi(@_);
}
```

後、さらにソースを読むと`$env`の`REMOTE_ADDR`や`REMOTE_PORT`がlocalhost決め打ちであることに気が付きます。この辺はHTTPサーバが知っている情報なので、`HTTP::Request`には知る由もないということです。偽装したければ戻ってきた`$env`を弄るといいでしょう。

薄いって以外の利点は特に思いつかないですが、薄さにこだわる紳士淑女の皆様は覚えておくと役に立つ日が来るかもしれません。
素の`$env`書くのとほぼ変わらない感じはありますが、`HTTP::Request::Common::POST`を使えばリクエストディを伴う`$env`でもさらっと書けます。

```perl
my $env = (POST "/", Content => '{"hoge" : 1}')->to_psgi;
```

本当はテストには生`$env`を書きたいくらいの気持ちだけど、JSONをPOSTしたいから`HTTP::Message::PSGI`を使ってるというのが真相だったりします。
picojsonを使ってoF環境設定ファイルを読み書き


ofxXmlSettingが使いにくかったので、picojson使ってみました。

https://github.com/kazuho/picojson

```json:config.json
{
	"LV":3,
	"HP":1,
	"MP":1,
	"sleepy":false,
	"hungry":true,
	"status":"カレー食べたい"
}
```

こんな感じのjsonファイルを用意して、

```cpp:testApp.cpp

//testapp.cpp

#include "ofUtils.h"
#include <fstream>
#include "picojson.h"

void setup() {
	// load from bin/data/config.json
	std::string path = ofToDataPath("config.json");
	std::ifstream file;
	file.open(path.c_str());

	if(file.fail()) {
		std::cout << "Failed to open file : " << path << std::endl;
		return;
	}

	// to std::string
	std::istreambuf_iterator<char> first(file);
	std::istreambuf_iterator<char> last;
	std::string json_str(first, last);

	// parse json
	picojson::value json;
	std::string err;
	picojson::parse(json, json_str.begin(), json_str.end(), &err);

	picojson::object &o = json.get<picojson::object>();

	int lv = (int) o["LV"].get<double>();
	bool hungry = o["hungry"].get<bool>();
	std::string status = o["status"].get<std::string>();
}


```

こんな感じ。落ち着いたらクラスにまとめたい。ofxPicojsonに。
HiveでApacheのcommon log formatの日付をparseする


Hiveにapacheなりnginxなりのログを生のまま突っ込んでクエリを投げたい時に、日付の部分をparseする方法

組み込みの`unix_timestamp`ではJavaのSimpleDateFormatのパターンを指定してparseする機能があるのでこれを利用する。

```sql
SELECT
	unix_timestamp(time, 'dd/MMM/yyyy:HH:mm:ss Z')
from
	apache_logs;
```
zshユーザーでEmacsのtramp-modeで不具合を起こしている方へ

Emacs の tramp-mode は ssh 先のファイルを手元で編集できるようにする elisp です

ssh 先のファイルをローカルのファイルと同じように編集できるのでとてもおすすめです

しかし，私の環境では ssh 接続が切れた後に Emacs が操作不能になるなどの不具合が頻発していました

ずっと原因が分からず悩んでいたのですが，普通に Emacs Wiki に解決策が書いてありました

[EmacsWiki: Tramp Mode](http://www.emacswiki.org/emacs/TrampMode#toc7)

.zshrc で `zle/prompt_cr/prompt_subst/precmd/preexec` などを使用していると不具合を起こすようです

私は既に複数箇所で使用していたために以下の設定を最後に呼ぶようにしました

```zsh:.zshrc_tramp
if [[ "$TERM" == "dumb" ]]; then
  unsetopt zle
  unsetopt prompt_cr
  unsetopt prompt_subst
  unfunction precmd
  unfunction preexec
  PS1='$ '
fi
```

`dumb` は tramp-mode の時の環境変数 `$TERM` の値です
tramp-mode の時は設定の一部を無効にすることで不具合が発生しなくなります

もしくはこれらを元々使わない，もしくは自分の環境の `$TERM` でしか有効にしないなどの対策が考えられますが，私は複数箇所に使用していたためにそれらの解決策は取りませんでした

これで快適な Emacs + tramp-mode + zsh ライフを送れそうです

Emacs 最高！！
unique_ptr のバリエーションふたつ


```cpp
#include <memory>
#include <cstdio>
#include <Windows.h>

// 使い終わると勝手にfcloseされるFILE* を
// std::default_delete の特殊化で実現する
template<> struct std::default_delete<std::FILE> {
    void operator()(std::FILE* fp) const { 
        std::fclose(fp); 
    }
};

// 使い終わると勝手にCloseHandleされるHANDLE を
// カスタム・デリータの実装で実現する
typedef std::unique_ptr<void, std::function<void(HANDLE)>> 
    unique_win_handle;

unique_win_handle make_win_thread(LPTHREAD_START_ROUTINE routine, 
                                  LPVOID arg, 
                                  LPDWORD thrID = nullptr) {
    return unique_win_handle(::CreateThread(nullptr, 0,routine, arg, 0, thrID), 
                             [](HANDLE h) { ::CloseHandle(h); });
}

DWORD __stdcall func(LPVOID arg) {
    unique_ptr<std::FILE> fp(fopen(static_cast<char*>(arg), "w"));
    if ( fp ) {
        std::fprintf(fp.get(), "Hello, world\n");
    }
    return 0;
    // ここでFILE*が fcloseされる
}

int main() {
    unique_win_handle h = make_win_thread(&func, "trial.txt");
    ::WaitForSingleObject(h.get(), INFINITE);
    // ここでHANDLEが　CloseHandleされる
}
```
Mojoliciousの様々な立ち上げ方

最近自炊に対する意識が異様に高いゆーすけべーです。さて、先日開催された [Plack/PSGI Conference (shibuya.pl)](http://atnd.org/events/45276) 略して「 **plackcon** 」でも話しましたがMojoliciousはPSGIをサポートしているのでそのため立ち上げ方などに応用が効きます。かくいう僕もMojoliciousアプリをいくつかつくったり今でも運用していますが、大抵はPSGI経由で開発時は `plackup` 本番環境では `Starlet` もしくは `Starman` で立ち上げています。ってことでMojoliciousアプリの様々な立ち上げ方を紹介しましょう。

===

### Mojolicious::Liteアプリの場合

SinatraライクなMojolicious::Liteアプリをつくるには `mojo generate` を以下のように実行します。

```
$ mojo generate lite_app app.pl
```

その後、デフォルトチックに立ち上げるには生成したファイルに実行権限が付いているのでもうこれだけ。

```
$ ./app.pl daemon
```

そのままだと「3000番」ポートで起動するので変更したい場合は

```
$ ./app.pl daemon -l "http://*:5000"
```

としましょう。その他オプションについては `./app.pl daemon --help` で閲覧出来ます。

#### Liteアプリをplackupする

ではMojolicious::Liteのアプリをplackupしてみます。といっても何も細工は入りません。

```
$ plackup app.pl
```

するだけです！！なんとカジュアル。しかしこのままだと旨味がありません。PSGI経由で立ち上げるならば Plack::Middleware::* を使いたいですよね。Mojolicious::LiteアプリでPlackのMiddlewareを使うには以下のように書きます。試しに Plack::Middleware::Auth::Basic を使ってベーシック認証をかけてみましょう。

```perl
use Mojolicious::Lite;
use Plack::Builder;get '/' => sub {    my $self = shift;
    $self->render('index');
};
builder {
    enable "Auth::Basic", authenticator => \&authen_cb; 
    app->start;
};

sub authen_cb {
    my($username, $password, $env) = @_;
    return $username eq 'mojo' && $password eq 'licious';
}
__DATA__

@@ index.html.ep
Hello!!
```

そして `plackup` して `http://localhost:5000/` などへアクセスしてみましょう。ベーシック認証のダイアログが出てくるはずです。わーい＼(^o^)／

===

### Mojoliciousアプリの場合

「Liteじゃない」普通のMojoliciousアプリをplackupする場合はもう `.psgi` ファイルをつくっちゃうのが早いです。

```perl
use strict;
use warnings;
use Mojo::Server::PSGI;
use Plack::Builder;
use MyApp::Web;

my $psgi = Mojo::Server::PSGI->new( app => MyApp::Web->new );
my $app = $psgi->to_psgi_app;

builder {
    …;
    $app;
};
```

こんな感じのファイルをテンプレートにしてください。

===

まとめるとLiteアプリもしくは通常のMojoliciousアプリに関して、morboやスクリプト経由で立ち上げる *Mojoliciousそのものがデフォルトで推奨するやり方* と `plackup` などPSGI経由で行う方法があることが分かりました。Plack::Middleware::* が使える点とStarlet/Starmanが扱いやすく性能も高い点で後者を僕は選択しています。さてあなたはど・ち・ら？
IntelliJ IDEAをチームで導入するために私が行ったこと

# 導入前(説得)編

私の所属するチームでは、IntelliJ IDEAを使い、下記の言語／開発環境を用いて開発しております。

1. Java
2. Node.js
3. Python
4. PHP

当初はチーム全員でEclipseを使って開発していたのですが、ある日を境に私がIntelliJ IDEAのPersonal Licenseを購入し、ステマ活動を進めていたところ、ボスからこんなことを言われました。

* 「そんなにいいって言うんだったらチームで導入したらえぇやん」
* 「ただ、人数分買うとなるとそれなりの額になるので、導入することによるメリットを出して欲しい」

これはチャンス…!!

## IntelliJ IDEAの価格と費用回収に必要な工数削減時間

というわけで、まずは下記表の資料を作りました。
要するにCommercial License1本あたりいくらで、開発者の時間あたりの単価がいくらだとすれば、IntelliJ IDEAによりこれだけの時間が削減できれば元が取れるよ、というものです。
自分の単価を考えれば、意外とすぐに費用は回収できそうだと分かります。

| 項目 | 金額・時間 | 備考 |
|:-----------|------------:|:------------|
| IntelliJ IDEAライセンス1本       |        51,345円 |為替レートにより変動 |
| 開発者の時間当たり単価(目安)     |      うん千(仮に5,000とする)円/時間 |(ここは記事用に適当に入れてます) |
| →費用回収に必要な工数削減時間       |        10.3時間|1ライセンスあたり10.3時間削減できれば費用回収できる|

## 1日当たりの作業内容および削減可能時間の試算

次に、Eclipseと比較して、どのくらい時間効率をあげることができ、ひいては作業時間を減らすことができるかの資料を作成しました。
ぶっちゃけここに書いている数字は感覚値です。
ですが、このようにメリットを列挙し、比較結果を数値化し、最終的に、時間(ひいては金額)で訴求することが重要です。

※念のため申し上げますが、本資料はEclipseを貶める目的のものではありません。

| 開発効率 | Eclipseでの作業時間 | IntelliJでの作業時間 |削減可能時間|備考|
|:-----------|------------:|------------:|-----------:|:------------|
| 既存コードの解析       |        2 |     1.5     | 0.5| 呼び出し元コード追跡が一瞬で表示可能|
| HTML/CSS/JavaScriptのコード記述     |      2 |    1.8    | 0.2 |Eclipseにはできないコード補完が多数あり、しかも高速 |
| Javaのコード記述       |        1 |     0.9     | 0.9 |Eclipseにはできないコード補完が多数あり、しかも高速 |
| RDB操作関連(SQL発行、結果取得等)         |          1 |      0.5      | 0.5 |SQL補完、RDB差分取得、ER図生成など |

他にも資料を作成しましたが、大体チェックを受けた部分は上記2資料です。
結果として、1日当たり1.8時間は削減可能であろうと試算し、約1ヶ月でIntelliJ IDEA購入の費用を回収できるとしました。

上記を経て、ボスの了解を経て、Commercial Licenseを2桁ライセンス分購入することができました。
購入に当たりまして、[サムライズム](http://samuraism.com/)様には色々とご協力をいただきました。
ありがとうございます。

※他にも実際の開発効率についての実演もやっていますが割愛。

# 導入編
無事にチームメンバー向けにIntelliJ IDEAのライセンスを購入することが出来ました。
しかしこの時点では、Eclipseしか使ったことがない人が大多数を占めていました。
このような状況で必要なアクションは、IntelliJ IDEAに移行するメリットを提示することと、移行に当たっての障壁をひたすら壊すことです。

IntelliJ IDEAのメリット、および移行手順については、チームの開発スタイルをざっと見なおして、Eclipseで行っていた内容を洗い出してはIntelliJ IDEAだとこうする、という話を資料としてまとめました。
また、その資料をもとに勉強会を開催し、メリット・移行手順・EclipseのコレをIntelliJ IDEAでどうすんの？を説明して実際に設定してもらいました。

特に移行の期限は設けませんでしたが、移行開始から1ヶ月くらいで全員移行完了していたと思います。
また、新規参入メンバーにも、上記で作成した資料を読んでいただくことで、すんなりIntelliJ IDEAが使えるようになりました。
今ではみんなIntelliJ IDEA大好きな模様です(知らんけどな！)

# 困っていること編

チーム向けに実際に導入して、困っている／いたことがそれなりにあります。
今では解決済みの話は以下のとおりです。

1. Eclipseとのソースフォーマットが違うんだけど？ → IntelliJ用に合わせる
2. 某レガシーフレームワークが提供していたHotDeployが使えない → クラスのみ再ロードまたは再デプロイでしのぐ
3. その他俺には分からん！ → Twitterでつぶやけば必ず助け舟が来る！

今時点でまだ困っている点は、下記です。

1. 設定を共通化したい → 設定ファイルをバージョン管理するのは茨の道。やめとけ。結局共通設定はコレ、というのを提示して各人に設定してもらった。
2. IntelliJ IDEA 13にバージョンアップするための説得材料が乏しい → まずは自腹でPersonal版購入して調査するしか！

# 最後に

IntelliJ IDEAは、費用対効果を考えれば、非常にお安い開発環境です。
皆が幸せに開発できるようになるために、まずは上司の説得から始めましょう！
Play Framework の 設定

# Play Framework の設定 #
application.conf に何を書けばいいのかいまいち分からなかったのでメモ

## Session ##
セッションの有効期限がブラウザ落とした時とか・・・と思ってたら発見
[GitHub playframework](https://github.com/playframework/playframework/blob/2.1.x/framework/src/play/src/main/scala/play/api/mvc/Http.scala)
ここのソースから逆算

```
# Cookie での名前 (String)
session.cookieName = "PLAY_SESSION"

# 有効期限 (Int 秒)
session.maxAge = 0

# セキュアか (Boolean)
session.secure = false

# HTTP Only (Boolean)
session.httpOnly = true

# ドメイン (String)
session.domain = ""
```
Cross Platform MIDI Tools Advent Calendar #2: MIDIライブラリについて

これは過去に書いたコードの使い回しになるが、MIDIプレイヤーを作るためには、MIDIまわりを操作するライブラリが必要になる（なまのバイトデータを直接送受信するのでもない限り）。MIDIプレイヤーというのは具体的には（少なくとも現状では）標準MIDIファイル (SMF; Standard MIDI File) のプレイヤーだから、SMFを解析してMIDIメッセージにしてデバイスに送信する仕組みが必要になる。

CライブラリとしてSMFを解析できるライブラリは既にいくつもあるので、P/Invokeしてしまえば必ずしも自前で作る必要はないが、明らかに無駄なパフォーマンスコストが発生するし、SMFを読むのは難しくないので、C#ネイティブで実装した。

SMF解析について難しいことはあまりないが、注意点はいくつかある。まず、SMFに含まれるMIDIメッセージには、(1)デルタタイムと(2)MIDIイベントが含まれている。(1)デルタタイムは、「可変長数値表現」を用いた、「8ビット目を用いない数値」の連続で表現する。7ビットの表現範囲を超える値については、デルタタイムは2バイト以上になる。14ビットの表現範囲を超えると（全休符が何小節も続くとこれが発生しうる）、3バイト目が必要になる。

また、通常の(2)MIDIイベントには、(2a)ステータスコードと呼ばれる「命令」と、(2b)MSB、(2c)LSBという各1バイト（ただしデータとしては各7ビット）の「データ」が含まれるが、通常の(2a)ステータスコードは必ず7ビット目が1になっている（16進数であれば0x80〜0xFFとなる）ところ、SMFでは、直前のMIDIイベントと同一のイベントが送信される場合、この部分は完全に省略することができる。これは特にエクスプレッションやモジュレーションなどを連続的に増大させる場合などに圧縮効果が大きい（とは言ってもほんの数バイトなので現代的な問題ではないが）。MIDIイベントの省略を検出するには、データの先頭ビットを見る。1（16進数なら0x80〜0xFF）であれば、それは省略されていないMIDIイベントだ。もしデータの先頭ビットが0なら、それはランニングステータスの省略を意味している。

解析されたSMFは、ヘッダ（デルタタイムの扱いを除いては意味のある情報はほとんど無い）とトラック群から成り、トラックにはMIDIメッセージのみが含まれる、単純な構成だ。

SMFの解析が終わったら、次はこれを時系列に沿って演奏することになるが、その前にひとつ処理しておくべきことがある。SMFフォーマット1のSMFは、複数のトラックで構成されているが、実際に演奏する前に、それらを1つのイベントの列にしておくことが望ましい。というのは、演奏命令はタイマーを使用して逐次送信するため、単一のタイマーを使用してイベントを送信するほうが効率的だし、何より同期のミスマッチにかかる不安がない（小さい）。

そのため、MIDIメッセージを時系列に沿ってマージすることが必要になるが、これは単純に「デルタタイムを変換して得られた絶対時間」をキーにして全トラックのメッセージを合わせてソートすれば良いというものではない。ひとつのトラックにおいて「前のノートをオフ、同じタイミングで同じノートをオン」といったイベントの流れがある場合、この順序は保持されなければならない（時間をおいて2つのノートオンが続いた後、1つのノートオフが送信された場合、2番目のノートは即座に消えてしまい、何も発音されないことになる）。単純なソートではこの「意味のある順序」が保持されない。というわけで、トラックのマージは「同じタイミングで送信されるイベント群」を並べ替える必要がある。

本当はこの後プレイヤーのAPIについても書くつもりだったのだけど、どうも長くなってきたみたいなので、今日はこの辺にして明日続きを書くことにする。
wordpressテーマをモバイルファーストで開発する際のtips

開発環境 OSX 10.8
PHP 5.5

最近、すごく久しぶりにwordpressでの開発を行っています。
できるだけ簡単に開発ができる環境を整えようと、調べたのでまとめておきます。
一応、モバイルファーストで、レスポンシブなテーマの案件なので、そういう人にも役に立てば。
もっと簡単な環境があれば教えてください！

# ビルトインサーバーを建てる
php5.4からの機能であるビルトインサーバーを使います。

```bash
cd ~/workspace/wordpress
php -S <your ip address>:8080 -t .
```

これで、ビルトインサーバーが立ち上がります。
Apacheもいらない！
<your ip address>の部分は、localhostでもいいですが、実機からの確認を簡単にするために、アクセス可能なIPアドレスにします。

# デバッグ用の設定
wp-config.phpに以下の一行を足します。

```php
define('WP_DEBUG', true);
```

## Deprecated エラーを黙らせる
今回は都合によりPHP5.5を使用したのですが、大量のDeprecatedエラーが発生してしまいます。
そこで、それを黙らせるために、wp-includes/load.phpのwp_debug_modeという関数を少しいじります。

```php
- error_reporting( E_ALL );
+ error_reporting( E_ALL ^ E_DEPRECATED );
```

これで静かになりました。

# 本番環境のデータを使えるようにする
ローカルにいちいち大量のデータを作成するのはめんどくさいので、本番環境のデータを丸ごとダンプして、それをローカルのデータベースに突っ込みます。(Sequel Proなんかでやれば簡単)
そのままでは、URLに問題が発生するので、wp-config.phpに以下を足します。

```php
define('WP_HOME','http://<your ip address>:8080');
define('WP_SITEURL','http://<your ip address>:8080');
```

この2つの定数を定義しておけば、データベースの設定を上書きくれます。

# とりあえず、これだけ
これだけで、けっこう楽チンになりました。
あとは、Adobe edge inspectなどを使って、実機での動きを見ながら開発しています。

ちなみに、モバイルファーストな案件のため、最近リリースされたFoundation5を使用しているので、その感想もご要望があれば、書きます。
Windows Azure仮想マシンのディスクをPowerShellでバックアップする 

Windows Azure仮想マシンのディスクをPowerShellでバックアップする 
http://www.sigmact.com/article/2013/azure-powershell-backup
この投稿はWindows Azure Advent Calendar 2013の2日目の記事です。 

1日目はこちら
http://shiba-yan.hatenablog.jp/entry/20131201/1385823617
asp:Repeater のネスト

以下のようなことをやりたくて色々調べていました。

1. asp:Repeater をネストさせたい。
1. 子階層から親階層のデータを参照したい

出たといえば出たのですが、うーん、特に 2 に関して、もっとすっきりした書き方はないのでしょうか…

<br>

```vbnet:データクラスの定義
' 親クラス
Public Class HogeInfo
    Public Property HogeId As String
    Public Property HogeName As String

    Public Property HogeSubInfoList As List(Of HogeSubInfo) = Nothing
End Class

' 子クラス
Public Class HogeSubInfo
    Public Property HogeSubId As String
    Public Property HogeSubName As String
End Class
```

```vbnet:テストデータ生成
Private Function CreaateHogeInfoList() As List(Of HogeInfo)
    Dim list As New List(Of HogeInfo)
    For i = 1 To 5
        Dim info As New HogeInfo With {
            .HogeId = String.Format("{0:D4}", i),
            .HogeName = "HOGE-" & i
        }

        If i = 1 then info.HogeSubInfoList = Me.CreateHogeSubInfoList(i, 2)
        If i = 4 then info.HogeSubInfoList = Me.CreateHogeSubInfoList(i, 1)

        list.Add(info)
    Next

    Return list
End Sub

Private Function CreateHogeSubInfoList(ByVal i As Integer, ByVal size As Integer) As List(Of HogeSubInfo)
    If size < 0 Then Return Nothing
    Dim list As New List(Of HogeSubInfo)
    If size = 0 Then Return list

    For j = 1 To size
        Dim subInfo As New HogeSubInfo With {
            .HogeSubId = String.Format("{0:D3}", i),
            .HogeSubName = "sub-" & i
        }
        list.Add(subInfo)
    Next
    Return list
End Function
```

<br>

```vbnet:リストの内容をRepeaterで表示(1階層)
<table>
  <asp:Repeater runat="server" ID="rptHogeInfoList" DataSource='<%# Me.HogeInfoList %>'>
  <ItemTemplate>
    <tr>
      <td><%#Container.ItemIndex + 1%></td>
      <td><%#DataBinder.Eval(Container.DataItem, "HogeId")%></td>
      <td><%#DataBinder.Eval(Container.DataItem, "HogeName")%></td>
    </tr>
  </ItemTemplate>
  </asp:Repeater>
</table>
```

```vbnet:リストの内容をRepeaterで表示(2階層)
<table>
  <asp:Repeater runat="server" ID="rptNestP" DataSource='<%# Me.HogeInfoList %>'>
  <ItemTemplate>
    <tr>
      <td><%#Container.ItemIndex + 1%></td>
      <td><%#DataBinder.Eval(Container.DataItem, "HogeId")%></td>
      <td><%#DataBinder.Eval(Container.DataItem, "HogeName")%></td>
      <td>

      <asp:Repeater runat="server" ID="rptNestC" DataSource='<%# Container.DataItem.HogeSubInfoList %>'>
        <ItemTemplate>
          <nobr>
          <%#DataBinder.Eval(CType(Container.Parent.Parent,RepeaterItem).DataItem, "HogeName")%>
          ( <%#DataBinder.Eval(Container.DataItem, "HogeSubName")%> )
          </nobr>
          <br />
        </ItemTemplate>
      </asp:Repeater>

      </td>
    </tr>
  </ItemTemplate>
  </asp:Repeater>
</table>
```

<br><br>

子 Repeat 内で

```
CType(Container.Parent.Parent,RepeaterItem).DataItem
```

とすれば親階層のデータは見れたのですが、
これは もし3 階層とかになったら Container.Parent.Parent.Parent.Parent とかになるんですかね。
Parentがいっぱいですよ。

Repeater の ID で指定したりとか
CType(Container.Parent.Parent,RepeaterItem).DataItem を変数的なものに入れたりとか
何かもっとすっきり書けるなら書きたいんですけど、ないんでしょうかね？
ちょっと見つかりませんでしたけど。
[PHP] 文字列をN-Gramで変換する

## N-Gram とはなんぞや
こちらを御覧ください。[N-Gram (wikipedia)](http://ja.wikipedia.org/wiki/%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2#N-Gram)

## アルゴリズム
自作です。いただいたコメントをもとに簡単化しました。

```php:StringConverter.class.php
<?php
class StringConverter
{
    /**
     * 初期設定
     *
     * @return object
     */
    final private static function _init()
    {
        if (! defined('SYSTEM_LANG')) {
            define('SYSTEM_LANG', 'UTF-8');
        }
    }


    /**
     * This is N-gram algorithm.
     * N-grapm is ...
     * ex) $str = 'ABCDE' ---> when N(2) = 'AB BC CD DE'
     * ex) $str = 'ABCDE' ---> when N(3) = 'ABC BCD CDE'
     *
     * addPlus flag is used by MySQL FULLTEXT INDEX SEARCH.
     *
     * @return object
     */
    final public static function ngramX(string $str='', int $num=0, bool $addPlus=false): string
    {
        $prefix = $addPlus ? "\x2B" : '';

        if ($num < 1) {
            return $str;
        }

        if ($num < 2) {
            $_chars = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
            return $prefix.implode($_chars, "\x20".$prefix);
        }

        self::_init();
        $_len = mb_strlen($str, SYSTEM_LANG);
        $_items = [];
        for ($i=0; $i<=$_len-$num; $i++) {
            $_items[] = $prefix.mb_substr($str, $i, $num, SYSTEM_LANG);
        }

        return implode($_items, "\x20");
    }
}
```

（注1）：[[PHP] 文字列を一文字ずつ配列に格納する](http://qiita.com/pb_tmz08/items/154464f2ffa93be29275)

実際のN-Gramでは、
'ABCDE' に対し、N(3) = 'ABC BCD CDE DE E'
となるところですが、このアルゴリズムでは
'ABCDE' に対し、N(3) = 'ABC BCD CDE'
となります。


```php:test
<?php
require_once 'StringConverter.class.php';

var_dump(StringConverter::ngramX('ABCDEF', 3, false)); // string(15) "ABC BCD CDE DEF"
var_dump(StringConverter::ngramX('ABCDEF', 3, true)); // string(19) "+ABC +BCD +CDE +DEF"
var_dump(StringConverter::ngramX('あいうえお', 3, false)); // string(29) "あいう いうえ うえお"
var_dump(StringConverter::ngramX('あいうえお', 3, true)); // string(32) "+あいう +いうえ +うえお"

var_dump(StringConverter::ngramX('ABCDEF', 2, false)); // string(14) "AB BC CD DE EF"
var_dump(StringConverter::ngramX('ABCDEF', 2, true)); // string(19) "+AB +BC +CD +DE +EF"
var_dump(StringConverter::ngramX('あいうえお', 2, false)); // string(27) "あい いう うえ えお"
var_dump(StringConverter::ngramX('あいうえお', 2, true)); // string(31) "+あい +いう +うえ +えお"

var_dump(StringConverter::ngramX('ABCDEF', 1, false)); // string(11) "A B C D E F"
var_dump(StringConverter::ngramX('ABCDEF', 1, true)); // string(17) "+A +B +C +D +E +F"
var_dump(StringConverter::ngramX('あいうえお', 1, false)); // string(19) "あ い う え お"
var_dump(StringConverter::ngramX('あいうえお', 1, true)); // string(24) "+あ +い +う +え +お"

var_dump(StringConverter::ngramX('ABCDEF', 0, false)); // string(6) "ABCDEF"
var_dump(StringConverter::ngramX('ABCDEF', 0, true)); // string(6) "ABCDEF"
var_dump(StringConverter::ngramX('あいうえお', 0, false)); // string(15) "あいうえお"
var_dump(StringConverter::ngramX('あいうえお', 0, true)); // string(15) "あいうえお"

```
BASIC認証がかかったページへのアクセス

`Casper.js`で、BASIC認証がかかったページにアクセスする際は、`settings`にユーザー名とパスワードを指定して、アクセスする。

```js
var page = require('webpage').create();
var url = 'http://xxxxx/';

page.settings = {
  userName : "user",
  password : "passxxxxx"
}

page.open(url, function(status) {
  // renderする内容を記載
  page.render('top_page.png');
  phantom.exit();
});
```
JenkinsでジョブごとRailsプロジェクトのデータベース名を変える

1つのRailsプロジェクトに対して複数パターンのジョブを作ると、同時に実行された場合にデータベースがロックされるなどの問題が起こることがある。
（例．通常のジョブ、新しいRubyのバージョン用のジョブ、`bundle update`したジョブ、プルリクエスト用ジョブなど）

ジョブごと違うデータベースを使うために、データベース名の末尾にプロジェクト名を付ける

```sh:シェルの実行
...
cp config/database.sample.yml config/database.yml

ruby -i -pe "gsub /(database: \w+_test)/, '\0'+'$JOB_NAME'" config/database.yml

bundle install --without development
...
```

[Building a software project 日本語](https://wiki.jenkins-ci.org/display/JA/Building+a+software+project)
[Building a software project - Jenkins Set Environment Variables](https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project#Buildingasoftwareproject-JenkinsSetEnvironmentVariables)

### 推奨プラグイン

[Template Project Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Template+Project+Plugin) - 他のプロジェクトのビルド設定を使用できる
→ [ビルド手順の追加]に[Use builders from another project]が追加される
Ceylon開発環境セットアップ！

Java大好きな人が作ったCeylon言語
[Ceylon言語ってどんなもの？](http://qiita.com/newta/items/2ca98051450c4751b4b1)

何はともあれ、早くコードは書きたいので
Ceylonがどんなものかというかの詳しい説明は次回以降に置いといて
開発環境をセットアップしよう！


#eclipse インストール

まずはeclipseをダウンロードしてインストールしてください！
[eclipse公式ページ http://www.eclipse.org](http://www.eclipse.org)

まあ、ここを見に来てる人はJava使ってる人だと思うので
大半の人はもう入ってることでしょう。
バージョンは4.2以上なら大丈夫なようです。
入ってる人はそのまま使ってもらっていいと思います。

自分はeclipse4.3でやりました。


#Ceylonのインストール

自分はMacなのでhomebrewを使ってインストールしました。
>brew update
>brew install ceylon

そうでない人はダウンロードページからzipファイルでダウンロードして
お好きなところへ解凍してください。
[Ceylonダウンロードページ](http://ceylon-lang.org/download/)


#Ceylonプラグインインストール

eclipseを起動してceylonをインストールしてください。

アップデートサイトのURL
>http://ceylon-lang.org/eclipse/updatesite/ 

#Ceylonプロジェクトの作成

インストール後再起動が終われば、
新規プロジェクトのダイアログを表示したときに
Ceylon Projectが追加されています。
![CeylonNewProject0.png](https://qiita-image-store.s3.amazonaws.com/0/17213/22822454-ec40-fd55-eac7-45a5a599a3de.png)

Project名を適当につけて
![CeylonNewProject.png](https://qiita-image-store.s3.amazonaws.com/0/17213/ae95c1ac-c083-ceb8-9e06-7fc0737f3f94.png)

finishボタンでOK！

###finishiが無反応な人は・・・
JDKは7以上が必要です。。
まだ入れてない人はJDK7も入れる必要があります。
[JDKダウンロードページ](http://www.oracle.com/technetwork/java/javase/downloads/index.html)

#Hello Ceylon World!!
プロジェクトが出来上がったらソースフォルダの下に
ceylonファイルを作ってみよう。

soruceフォルダを右クリックしてNew > Ceylon Source File
Compliation unit nameにファイル名を入れます。
ここでは適当に「HelloWorld」と入れておきます。

するとHelloWorld.ceylonファイルが作られます。

早速ハローワールドしてみましょう。

```ceylon:HelloWorld.ceylon
void hello() {
	print( "Hello World!" );
}

````
コードは以上です。
省略はしていません。
クラスは要らないの？？って思うかもしれませんが
要らないですー。

Run As Java Ceylon Applicationで実行してみましょう。
するとコンソールに
>Hello World!

と出るはずです！

これでCeylonコードを書く環境が整いました！！


> ※本来はceylonファイルを直接作ってRunするのではなく
> New > Ceylon Module を使って
> モジュール定義を作ってから作業しますが、
今回は本題ではないので省略しました。
How to install rails on Mavericks with rvm

- Xcode をインストールします。

![名称未設定 2.png](https://qiita-image-store.s3.amazonaws.com/0/28376/2f0af706-9d4c-59e5-021d-d8cf7a3f803c.png)

- Xcode の Command Line Tools をインストールします。

```shell-session
$ xcode-select --install
```

![名称未設定 2.png](https://qiita-image-store.s3.amazonaws.com/0/28376/d90d239a-e4e1-80d7-becc-54b0a77721e4.png)

- Homebrew をインストールし、新しいバージョンの `bash` をインストールします(`rvm` のインストールに必要です)。

```shell-session
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
$ brew doctor
$ brew install bash
```

- `/usr/local/bin` を `PATH` の先頭にします。

```shell-session
$ cat > .bash_profile
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

ターミナルを再起動します。必要なら `chsh` してください。

- ドキュメントを作成しないよう設定します。

```shell-session
$ cat > .gemrc
gem: --no-document
gem: --no-ri --no-rdoc
```

- `rvm` をインストールします。

```shell-session
% curl -L get.rvm.io | bash -s stable
```

``* WARNING: Above files contains `PATH=' with no `$PATH' inside, this can break RVM,`` という警告が出ますが、無視していいです。ターミナルを再起動してください。

- 対応する `ruby` 一覧を見るには次のコマンドを使います。

```shell-session
$ rvm list known
```

- `ruby` をインストールします。

```shell-session
$ rvm install 2.0.0-p353
```
- `gem` をアップデートし、`rails` をインストールします。

```shell-session
$ gem update --system
$ gem update
$ gem install rails -V
```

- テスト用にアプリを作ります。

```shell-session
$ rails new rtest
$ cd rtest
$ rails server
```
カスタマージャーニーマッピングについて

## カスタマージャーニーマッピングとは？

- **サービスが提供するユーザーエクスペリエンスを構造化して図解する技法**
- ユーザーの視点からユーザーエクスペリエンス全体を概観する
  - そこに影響を与える各種要因を図解する資料

> 「ジャーニー」を構造化する時は通常、ユーザーとサービスとのインタラクションが発生するタッチポイント（顧客接点）を基準にします。

### ジャーニー？

- ユーザーエクスペリエンスに基づいて形作られる魅力的なストーリー
  - インタラクションの細部やそれによって味わう顧客の感情を表現する

## 手順

- タッチポイントを特定
- それをもとに図解

### タッチポイントの種類

- 人と人が直接対面するタイプ
- ユーザーとWebサイトとの間で仮想のインタラクションが展開するタイプ
- ユーザーが建物内を物理的に移動するタイプ

などの形態がある。

### タッチポイントの定義

ユーザーの所見に基づいて定義する。

- インタビュー
- ダイアリー調査（ブログ、ビデオなど）

ユーザー自身の言葉で語ってもらえるとさまざまな洞察を得られる。
こうした情報はマップの作成に役立つ。

### 視覚的に図解する

単に魅力的に視覚化するだけでなく、細かい情報も十分に盛り込むこと。
でないと、個々のジャーニーに対する真の洞察を提供できない。

> 多くのカスタマー・ジャーニーは多彩な感情の積み重ねなので、顧客に共感し、感情の動きをすくい上げる姿勢が、マップ作りには欠かせません。

## 用途

- 正式なタッチポイントと、略式または変則的なタッチポイント双方の様子が分かる
- より顧客に近い視点からカスタマー・ジャーニーを再現できる
- 問題のある領域と、さらなる発展が見込める領域を発見できる
- 特定のタッチポイントに注目すれば、サービスエクスペリエンスを個々の段階ごとに分析できる
- 共通のビジュアル言語で視覚化しておけば、類似サービスや競合との比較に役立つ

## マップ作成のヒント

### ユーザーは多様な接点を持つ

> 一般的なカスタマー・ジャーニーはマルチ・チャンネル型（多様な接点があること）であり、時間軸に沿って展開します。顧客は様々な情報源を持っており、中には友人や家族など、サービス提供会社の守備範囲を超えたところで情報が受け渡されることもあります。

### なぜ？のストーリーも添える

> タッチポイントで発生した出来事を通して視覚化するだけでなく、なぜそうした出来事が起きたのかを説明するストーリーを添えることが重要です。

- 状況
- モチベーション
- 経験

これらによってどのようにジャーニーが形作られたのか。

---------------------------------------

- 出典
  - [SERVICE-DESIGN-THINKING-Basics-領域横断的アプローチによるビジネスモデルの設計](http://www.amazon.co.jp/dp/4861008522)
- 参考URL
  - [2時間で作るカスタマージャーニーマップ――実例とともに考える新しい「おもてなし」のカタチ](http://web-tan.forum.impressrd.jp/e/2013/11/27/16409)
  - [エクスペリエンスジャーニーマップ／カスタマージャーニーマップ](http://www.coprosystem.co.jp/marketingblog/2012/01/26.html)
VolleyのNetworkImageViewでsetImageResourceしても画像が表示されなかった

# VolleyのNetworkImageViewでsetImageResourceしても画像が表示されなかった

## 現象

通常は画像をNetworkImageView#setImageUrlでネットワーク越しに読み込んでいたが，とある条件でローカルのリソースから読み込ませたかった．
その際，単純に

```java
if(expression) {
    networkImageView.setImageUrl(url, imageLoader);
} else {
    networkImageView.setImageResource(R.drawble.image);
}
```

としていたが，表示させてみるとsetImageUrlの方は画像が表示されるのにsetImageResourceでは表示されなかった．
同様にsetImageBitmapやsetImageDrawableもダメ．

## URLをセットしないと，再レイアウト時にイメージが破棄される

当該部分はここ

```java:NetworkImageView.java
private void loadImageIfNecessary(final boolean isInLayoutPass) {
    // 略

	// if the URL to be loaded in this view is empty, cancel any old
	// requests and clear the
	// currently loaded image.
	if (TextUtils.isEmpty(mUrl)) {
		if (mImageContainer != null) {
			mImageContainer.cancelRequest();
			mImageContainer = null;
		}
		setImageBitmap(null);
		return;
	}

    // 略
}
```

mUrlがemptyだとsetImageBitmap(null)が呼び出されている．
このloadImageIfNecessaryはsetImageUrlしたときに呼ばれるが，オーバーライドされたonLayoutでも呼び出されているため，URLをセットしないで利用するとonLayoutが呼ばれたタイミングでセットしたリソースが破棄されてしまう．

## 解決

上記のsetImageBitmap(null)をコメントアウトして解決
（コメントアウトしても通常のImageViewに動作が近づくだけで，メモリリークの主要因になったりはしない…ハズ）
MaxOS10.9 Mavericks で pecl とか configure が無限ループして終わらない

MaxOS10.9 Mavericks デビューして開発環境を整えようと pecl install mongo とか pecl::mongo を自力コンパイルしようとした時に、なんか無限ループにハマって終わらなかったので調べてみた。

結論から言うと、こういうことらしい。
http://stackoverflow.com/questions/18667916/installing-psycopg2-has-it-stuck-between-xcrun-and-lipo

コマンドラインツールのアップデートがくれば解消するかもしれないけど、旧ツールで一時的に上書きするのが一番手っ取り早い模様。

iOSの開発に副作用がでるかはまだ未検証。でたらめんどくさいなーΣ(´□｀;)
ソースコードの公開されているAndroidアプリ

ソースコードを見るといろいろと勉強になるのでまとめてみました。

+ [GitHub Android App](https://github.com/github/android)
+ [EPUB3Reader Android App](https://github.com/pettarin/epub3reader)
+ [scanvine for Android](https://github.com/rezendi/scanvine-android)
+ [Google I/O app](https://code.google.com/p/iosched/)
+ [Spika](https://github.com/cloverstudio/Spika)
Vimで、バッファをを移動した時に自動的にプロジェクトルートをカレントディレクトリにする

# 問題

バッファをあちこちいったりきたりしていると、カレントディレクトリ(や、カレントディレクトリを基点にしたプロジェクト)単位でなんかやるみたいなプラグインを使ってる時にこまる。

# 解決

プロジェクト単位で自動的に`lcd`すると便利そう。というわけで、以下のような設定をほどこす(Uniteユーザ限定だけど…)。

  * `unite#util#path2project_directory(expand('%'))`でプロジェクトのルートを取得
  * `lcd`で移動

```VimL
function! ChangeCurrentDirectoryToProjectRoot()
    let root = unite#util#path2project_directory(expand('%'))
    execute 'lcd' root
endfunction
:au BufEnter * :call ChangeCurrentDirectoryToProjectRoot()
```

`lcd`ってのは、`cd`とは違って、カレントウィンドウのみ変更するそうです。

```
:lc[d][!] {path}	コマンド |:cd| と似ているが、カレントウィンドウのカレ
			ントディレクトリのみを変更する。別のウィンドウのカレン
			トディレクトリに変化はない。 {Vi にはない}
```

# 議論

自動的にやるとなんか困ることあるのかな。
【JavaScript】setIntervalを使うときの注意点(...とonload)

こんにちは。

さておもいっきしツマづいてしまったところです。

Jsは外部ファイルから読み込んでいるのですが、
setInterval関数をつかって、日時をリアルタイムに(1秒周期)表示させていこうという魂胆です。

実際に書いたコード

```js
function nowTime(){

  nowD       = new Date();

  nowHours  = nowD.getHours();
  nowMinutes = nowD.getMinutes();
  nowSeconds = nowD.getSeconds();

  nowMess = nowHours + "時" + nowMinutes + "分" + nowSeconds + "秒";
  document.nowForm.nowFormTime.value = nowMess;
  setInterval("nowTime()",1000);
}
```

関数メモ：

// ----------
setInterval("関数名",起動するミリ秒)
// ----------

```html
<form name="nowForm">
    <input type="text" name="nowFormTime">
</form>
```

はい、何も表示されませんでした。

どうやら、formが読み込まれる前に
このnowTime関数が実行されてしまったら、値は空でエラーになって帰ってくる模様。

HTMLのform定義が終わったあとにJavaScriptでsetIntervalを書けばいいということですが
下記で対応。

```html
<body onload='setInterval(nowTime(),1000)'>
```
ページを全て読み込ませてからスクリプトを実行させたい時は
このonloadを使います。

それでは、これからもよろしくお願いいたします。


追記：

nowTime()のなかでsetInterval("nowtime()",1000)を実行すると、タイマーがどんどん増えていき
クラッシュするとご指摘をいただきました。

下記onloadを使わずに、タイマーを使う修正内容です。

```js
function nowTime(){

  nowD       = new Date();

  nowHours  = nowD.getHours();
  nowMinutes = nowD.getMinutes();
  nowSeconds = nowD.getSeconds();

  nowMess = nowHours + "時" + nowMinutes + "分" + nowSeconds + "秒";
  document.nowForm.nowFormTime.value = nowMess;
    
 }

setInterval("nowTime()",1000);
```

上部に記述したのは```setInterval()```を```nowTime()```の中に入れていました。
だからonloadで実行してしまうとタイマーも増え、いずれはブラウザがクラッシュ。
そして外から読んであげないと実行されない。

勉強になります。

これからもよろしくお願いいたします。
【JavaScript】作成した関数のセット方法

こんにちは。

今回は作成した関数のセット方法備忘録です。
これは特にツマづきはしなかったので、端的に行きます。
（ただこの次に思いっきりツマづきました。）

```js
document.write() ;
```

これの代わりに値を指定する方法です。

例えば

```html
<form name="ex">
~~
<input type="text" name="exFunction">
~~
</form>
```

というのがあった場合、値の指定はこれでできます。

```js
document.ex.exFunction.value = hoge ;

つまり
document.(formのname要素).(inputのname要素).value = hoge ;
```

これで指定が可能です。
だんだんできることもふえてきたかな～。

参考文献：
http://www.red.oit-net.jp/tatsuya/java/realtime.htm
apache solr インストール


## 1. Javaインストール

```bash
$ sudo yum install java-1.6.0-openjdk
```

## 2. solr本体のインストール

/var/local/solr-x.x.x/ に配置する前提で進めます。

```bash
$ wget http://ftp.jaist.ac.jp/pub/apache/lucene/solr/4.6.0/solr-4.6.0.tgz 
$ tar -zxvf solr-4.6.0.tgz
$ sudo cp -R solr-4.6.0 /var/local/
```

※ 下記は任意の名前で置き換える。

- [db_name]
- [collection_name]

```bash
$ cd /var/local
$ sudo chown -R :wheel solr-4.6.0/
$ cd solr-4.6.0
$ sudo cp -R example [db_name]
$ cd [db_name]/solr
$ sudo mv collection1 [collection_name]
$ cd  [collection_name]
$ sudo echo "name=[collection_name]" ¦ sudo tee core.properties
```

## 3.　起動
```bash
# cd /var/local/solr-4.6.0/[db_name]
# java -jar start.jar >> /var/log/solr.log 2>&1 &
```

## 4. 確認

http://192.168.33.10:8983/solr/ にアクセスしてみる。
管理画面が表示されればOK (192.168.33.10 に立てた場合）