OmniAICreator/Qiita-1.07M huggingface dataset:
matplotlibのインストールでつまづいた話


CentOS6.5でデータ解析の環境を整えようとしたとき、matplotlibのインストールでつまづきました。

まずは、普通にpipでインストール

```
$ pip install matplotlib
Downloading/unpacking matplotlib
  Downloading matplotlib-1.4.0.tar.gz (51.2MB): 51.2MB downloaded
  Running setup.py (path:/tmp/pip_build_vagrant/matplotlib/setup.py) egg_info for package matplotlib
    ============================================================================
    Edit setup.cfg to change the build options

    BUILDING MATPLOTLIB
                matplotlib: yes [1.4.0]
                    python: yes [2.7.7 (default, Aug 25 2014, 16:44:54)  [GCC
                            4.4.7 20120313 (Red Hat 4.4.7-4)]]
                  platform: yes [linux2]

    REQUIRED DEPENDENCIES AND EXTENSIONS
                     numpy: yes [version 1.8.2]
                       six: yes [using six version 1.7.3]
                  dateutil: yes [using dateutil version 2.2]
                   tornado: yes [using tornado version 4.0.1]
                 pyparsing: yes [pyparsing was not found. It is required for
                            mathtext support. pip/easy_install may attempt to
                            install it after matplotlib.]
                     pycxx: yes [Couldn't import.  Using local copy.]
                    libagg: yes [pkg-config information for 'libagg' could not
                            be found. Using local copy.]
                  freetype: no  [Requires freetype2 2.4 or later.  Found
                            2.3.11.]
                       png: yes [version 1.2.49]
                     qhull: yes [pkg-config information for 'qhull' could not be
                            found. Using local copy.]


...


============================================================================

                        * The following required packages can not be built:

                        * freetype

----------------------------------------
Cleaning up...
Command python setup.py egg_info failed with error code 1 in /tmp/pip_build_vagrant/matplotlib
Storing debug log for failure in /home/vagrant/.pip/pip.log
```


freetypeというものがないらしいので、インストールします。

```
$ sudo yum install freetype
```

改めて、matplotlibをインストールすると・・

```
$ pip install matplotlib
Downloading/unpacking matplotlib

...

    * The following required packages can not be built:
    * freetype
```

同じエラーが発生。
もう一度、エラーメッセージを読みなおしてみると、

```
freetype: no  [Requires freetype2 2.4 or later.  Foundd 2.3.11.]
```

どうやら、バージョン2.4以上必要なのに、2.3.11が入ってるとのこと。（長いエラーメッセージの途中じゃなくて、色を変えるとか、一番下に表示するとか、もっと強調して欲しかった。。）

そして、yumでは、2.4以上のものはインストールできないみたいなので、[こちら](http://download.savannah.gnu.org
/releases/freetype/)から最新版をダウンロードして、ソースからコンパルしてました。現時点（2014.8.29）の最新版は、2.5.3でした。

```
$ tar xzvf freetype-2.5.3.tar.gz2
$ cd freetype-2.5.3
$ ./configure
$ make
$ make install
```

make installでエラーでました。
ここでも大いにつまづきました。。

調べたところ、gmakeを使うと解決するらしい。

```
$ cd freetype-2.5.3
$ env GNUMAKE="/usr/local/bin/gmake"
$ ./builds/unix/configure
$ gmake
$ gmake install
```

これでようやくインストールできました。
再び、pipでインストールして、無事インストール完了。

１つモジュール入れるだけなのに、半日くらいかかりました。。


## 参考
- http://ameblo.jp/shangoo/entry-10015671540.html
C#でマルチスレッドのベストプラクティスって何かある？

StackExchange/Code Reviewで見かけた質問とステキな回答。

質問：[What are the best practices with multithreading in C#?](http://codereview.stackexchange.com/questions/55299/)
（Code ReviewはQ&Aサイトというより、名前の通りコードレビュー依頼が主目的）

回答：
> Rather than reviewing your specific code -- which at first glance seems very, very buggy -- let me answer your question directly:
> 1. Don't. Multithreading is a bad idea. Programs are hard enough to understand already with a _single_ point of control flow in them; why on earth would you want to add a second, third, fourth... ? Do you enjoy tracking down incredibly difficult-to-reproduce, impossible-to-understand bugs? Do you have an encyclopaedic knowledge of the differences between weak and strong memory models? No? Then don't write multithreaded programs! Processes are a perfectly good unit of work; if you have work to do, spawn a process.
> 2.（後略）

（参考訳）
> あんたのそのコード ―ひと目見てバグだらけ― をレビューするより、質問に直接答えていこうか：
> 1. そんなものは無い。マルチスレッドは悪い考えだ。プログラム中に_1つ_の制御フローがあるだけでも理解するのは十分難しいってのに；一体どうして2個目、3個目、4個目を増やそうとするんだ？途方も無く再現性が低くて、難解なバグを見つけだす作業を楽しみたい？あんたは弱いメモリモデルと強いメモリモデルの違いについて十分な知識があるか？ない？じゃあマルチスレッドプログラムを書くのなんて止めとけ！プロセスは申し分のない処理単位だ；そういうことをしたければ、プロセスを生成するんだね。
> 2.（後略）

回答では計8項目が挙げられています。興味があれば、ぜひ読んでみて:P
HTML5のIE8以下への対応内容例



#JavaScript読み込み

IE8以下だけに読み込ませるという条件付きコメントと、IE10以上への対応

```
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9">
<!--[if IE]>
<script src="［JavaScriptファイルパス］"></script>
<![endif]-->
```
　

#JavaScriptの内容
```
document.createElement('article');
document.createElement('aside');
document.createElement('details');
document.createElement('figcaption');
document.createElement('figure');
document.createElement('footer');
document.createElement('header');
document.createElement('hgroup');
document.createElement('main');
document.createElement('nav');
document.createElement('section');
document.createElement('summary');
document.createElement('audio');
document.createElement('canvas');
document.createElement('progress');
document.createElement('video');
document.createElement('audio');
document.createElement('template');
```
　

#JavaScriptのライブラリによる対応

上記の機能を持ったJavaScriptライブラリーを読み込むこで解決することもできる

```
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9">
<!--[if IE]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
```
　

#cssの内容
```
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary {
  display: block;
}
audio,canvas,progress,video {
  display: inline-block;
  vertical-align: baseline;
}
audio:not([controls]) {
  display: none;
  height: 0;
}
[hidden],template {
  display: none;
}

```
IPython notebookで目次をつくる

目的
======

こんな感じでIPython notebookの先頭に目次(Table of contents)をつくりたい

![ipython_links_ex.png](https://qiita-image-store.s3.amazonaws.com/0/35293/28382c5f-f604-cd75-621b-eb45cfd1cfc5.png)

（注: 画像は[こちら](http://nbviewer.ipython.org/github/rasbt/python_reference/blob/master/tutorials/table_of_contents_ipython.ipynb)から頂きました）


やり方
====== 
このライブラリを使って作成できます．

- [github.com/kmahelona/ipython_notebook_goodies](https://github.com/kmahelona/ipython_notebook_goodies)

次の3行をMarkdown cellに貼り付けるだけです．
Header cellを自動で取得して，目次を書いてくれます．

    <h1 id="tocheading">Table of Contents</h1>
    <div id="toc"></div>
    <script src="https://kmahelona.github.io/ipython_notebook_goodies/ipython_notebook_toc.js"></script>
Javascriptのreplaceは破壊系ではない。


小さなことですが無駄にハマったのでメモ程度に。

JavascriptのStringオブジェクトについてるreplaceメソッドは、
破壊系ではないので何かに代入してあげないと意味がないです。

つまり、

```
var hoge = "hoge";
console.log(hoge); // output: hoge

hoge.replace("hoge", "fuga");

console.log(hoge); // output: hoge
```

になっちゃいますね。
最終行で出力 "fuga" を期待したいなら、

```
var hoge = "hoge";
console.log(hoge); // output: hoge

var fuga = hoge.replace("hoge", "fuga");

console.log(fuga); // output: fuga
```

という風にしましょう。
WordPressでドメインやディレクトリ変更


# 概要
WPでディレクトリ構造を変更したりドメイン名を変更したりすると，DBも書き換える必要がある．

> 例）example.com → newdomain.com

WPの場合，DBのwp-optionsだけでなく，投稿内に挿入した画像URLにもフルパスが書き込まれる．
そのため，置換対象のドメイン名がDB内に大量に含まれる．

また，一部のプラグインではURLをシリアライズしている場合がある．
シリアライズされているデータは，単純に文字列置換をすると整合性が取れなくなり，パース時にエラーが出るようになってしまう．

これらの問題を解決し，簡単にドメイン名を変更できるツールを紹介する．

# 事前準備
- 移転先に全ファイルを複製しておく．
- DBをバックアップしておく．
- DBも移転するなら，移転先にインポートしておく．
- サイトを見ていた場合は閉じておく．

# ツールダウンロード
以下にアクセス．
[DATABASE SEARCH AND REPLACE SCRIPT IN PHP](https://interconnectit.com/products/search-and-replace-for-wordpress-databases/)
v3.0.0 betaをダウンロードして解凍する．
betaではあるが，筆者が使用している限りは問題は見当たらない．

安定版はv2.1.0なので，こちらを使用しても良い．
v2.1.0の解説は以下のサイトなど
[ウィジェットも対応。WordPressでサーバ移転時にデータベースのドメインを置換する方法](http://thinking.ne.jp/2013/03/wordpress-server-iten/)

# 設置
__移動先__のディレクトリ（wp-congfig.phpを置いた階層）に，解凍したフォルダごと設置（アップロード）する．

# 使い方
ブラウザでツールにアクセスする
> 例）http://newdomain.co.jp/Search-Replace-DB-master/

## search/replace
replace欄に旧アドレス，with欄に新アドレスを入力する．
「use regex」にチェックを入れると，正規表現も使用可能．

## databese
同階層にwp-config.phpが見つかった場合はdatabase設定を自動で読み込んでくれる．
database欄が空欄の場合は，置換対象のDB設定を入力する．

## tables
tables欄で「select tables」を選択すると，テーブルを限定して置換が行える．
複数選択は，Commandキー（WindowsはCtrlキー）やShiftキーを使用．

### columns to exclude（空欄可）
この欄にカラム名を入れると，そのカラムを除外する．

### columns to include only（空欄可）
この欄にカラム名を入れると，そのカラムのみを置換する．


# 置換欄記述方法
## 通常
> 例）
> example.com → newdomain.co.jp （ドメイン変更）
> example.com → www.example.com （www追加）
> example.com → new.example.com （サブドメイン化）
> dev.example.com → example.com （本番化）

replace
[dev.example.com]
with
[newdomain.co.jp]

上記のように入力すれば，ごっそり置換してくれる．


## ディレクトリ変更あり or メールアドレスの設定は変更したくない場合
単純に置換してしまうと，以下のようになってしまう．
> example.com → example.com/site
> mail@example.com → mail@example.com/site

replace
[http://example.com]
with
[http://example.com/site]

上記のように，「http://」も入れれば良い．

* サイト内で「https://」も使用している場合は，そちらも忘れずに．
* ディレクトリ変更の場合は，.htaccessも書き換える必要があるので注意．


## メールアドレスのドメイン部分のみ変更したい場合
replace
[@example.com]
with
[@mail.example.com]

上記のように，「@」も入れれば良い．

## その他
ドメインだけでなく，どんな文字列でも置換できる．はず．
> 例）
> Microsoft → microsoft
> Apple Computer → Apple,Inc.

# 実行 : actions
## dry run
実行して結果だけ表示．

## live run（おすすめ）
置換中のファイルを表示しながら実行．

# ツール削除
外部からDBのデータを書き換えられる状態になっているので，ツール自体を必ず削除する．
「delete me」ボタンを押すと自動で削除される．

「Could not delete the search replace script automatically.」
上記のようなエラーが出た場合は，サーバ上から手動で削除する．

# 置換後
置換後にサイトを開き，もしInternal Server Errorなどのエラーが出ていたら，
パーマリンク設定ページから「変更を保存」を押すと直る場合が多い
[newdomain.com/wp-admin/options-permalink.php]
RubyMotionでAviaryを使って画像編集機能を簡単に追加する


ソフトにちょっと画像編集機能を入れたい時に[Aviary]SDKがあります。以下のような感じで簡単に編集機能を追加する事ができます。

![sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/14768/870aae4e-88c1-aeb1-06a7-59d4b5d3bc0a.jpeg "sample")


基本は無料のフリーミアムモデルです。編集後のサイズが1Mピクセル以上の出力がほしい場合は$120/月、Aviaryのリンクをはずしたい場合は$275/月が必要です。[参照](https://developers.aviary.com/pricing)

編集機能を外部サービスに依存するのはサービス停止等のリスクを考えるとメインに使うには怖いんですが個人や趣味アプリ系なら良いかと。簡単に使える画像編集のSDKは少なくおもしろいビジネスモデルだと思いますので発展していって欲しいです。

## 手順

### 1.ファイルダウンロード

http://developers.aviary.com

デベロッパー登録をしてSDKをダウンロードします。

### 2.アプリケーション登録

MyAppsからアプリケーション登録をすると、keyとsecretが表示されます。このキーをSDKで使います。

### 3.ファイル配置

下記の位置にSDKのファイルをコピー

vender/AviarySDK.framework
resources/AviarySDKResources.bunlde

### 4.Rakefile

```Ruby:Rakefile
Motion::Project::App.setup do |app|

	...(省略)...

  app.vendor_project('vendor/AviarySDK.framework',:static,
    :products => ['AviarySDK'],:headers_dir => 'Headers',
    :cflags => '-ObjC -all_load -fobjc-arc'
  )
  app.frameworks += %w(Accelerate Accelerate Foundation MessageUI
    OpenGLES QuartzCore StoreKit UIKit)
  app.libs += %w(/usr/lib/libsqlite3.0.dylib /usr/lib/libz.1.2.5.dylib)

end
```

### 5.実行はAPIキーをセットした後、画像を渡します

```
    AFPhotoEditorController.setAPIKey('***', secret:'***')
    editorController = AFPhotoEditorController.alloc.initWithImage(image)
    editorController.delegate = self
    presentViewController(editorController, animated:true, completion:nil)
```

delegateとして以下をセットします。

```
  def photoEditor(editor, finishedWithImage:image)
	# 編集済みimageをセット
    dismissViewControllerAnimated(true, completion:nil)
  end

  def photoEditorCanceled(editor)
	# キャンセル処理
    dismissViewControllerAnimated(true, completion:nil)
  end
```

## サンプルコード

以下よりダウンロード可能です。

https://github.com/bellx2/motion-aviary

## ぶつぶつ

* FPhotoEditorCustomization.setToolOrderが実行できません。REPLで見てもmethodが変換されていないようです。Swiftから使ってみるとちゃんと使えるので、Framework側では無いようなのですが....


[Aviary]: https://aviary.com
FuelPHP tipsメモ


## action_indexへのリンク
action_indexへのリンクを/index無しに貼りたい
例) hoge.com/moge/index → hoge.com/moge

```php
	echo Html::anchor('/','リンクタイトル');
	// × Html::anchor('','リンクタイトル');
```

結果
```<a href="http://hoge.com/moge">リンクタイトル</a>```


## ViewをHTMLで書きたい

 - configファイルのコピー(fuel/pachages/parser/config/perser.phpをfuel/app/configへ)
 - extensionsの値を変更(```'php'=>'View'```を```'html'=>'View'```へ)
 - \Fuel\Core\Viewを継承したViewクラスの作成(fuel/app/classes/view.php)
 - bootstrap.phpへ記述を追加(```Autoloder::add_classes(array('View'=>APPPATH.'classes/view.php'));```)


参考：[FuelPHP【parser】デフォルトのviewの拡張子が.phpだとみずらいので識別拡張子を変更する](http://qiita.com/ryurock/items/845fd7329572dd923217)
Wantedlyさんがやっているカルチャーランチを真似してやってみた


こんにちは、株式会社イノベータのエンジニア @kenzan100 です。
社内の勉強会でエンジニアの一人が「Wantedlyさんがイケてるよね」ということで、Wantedlyさんの発表スライドを共有してくれました（~~ページ最下部にて表示~~ embed表示ができなかったので、直接リンクを貼ります）。
https://speakerdeck.com/awakia/developer-productivity-at-wantedly

この中で「施策２」として登場する「カルチャーランチ」なるものが良さげとなり、実際にやってみました。

##カルチャーランチの意義
* カルチャーランチの弊社での目的は、 __お互い「何をカッコイイ」「何を良し」と思うのかを知り、すり合わせることで、会社の文化・基準となるものをつくり、日々の判断スピードを上げよう__というものです。
* 具体的なやり方は、いくつかのチームに別れ１つのテーマについてディスカッション、お互いに発表した後、最後に質疑応答やコメントをして終了という流れです。

##ポイント
* 前述のスライド発表者の @awakiaさんに「どんな風にやっているのか詳しく教えてください」とぶしつけなお願いをしたところ、快くシェアしてくださいました。多謝です。曰く、
	* テーマは会社に関係するのと関係しないの交互、重いのと軽いの交互。 __最初は公募より経営陣が関心を持っている話題が良さそう。__話題が発散しすぎないテーマを選ぶ。
	* グループ分けを普段話さない人となど割と恣意的に組んでOK。発表者を決めておきその人にマネージさせる。
	* 議論+ランチ45分、発表は1分半ぐらい、質問は1,2個受け付け。
	* テーマは「ディベート　テーマ」でググると結構出てくる。
	* 最初はやった後すごく疲れて30分ぐらいは仕事に支障がでるのも念頭においておくｗ
* とのことでした。

##実際にやってみた

* 二つのチームに分かれて、それぞれ飯を食いながらディスカッションし、発表に備えました。
* テーマは、経営陣の関心領域＋参加者がイメージしやすいものということで、 __「スタートアップ（弊社イノベータ）における外国人雇用の是非」__でやってみました。

###チームこぬま
![TeamKonuma](https://www.evernote.com/shard/s23/sh/4095edce-635d-4881-9ef8-351bd7f1fd2e/c05461dbebf062a8847b076899d938c9/deep/0/0e0e0f4d6402e95b1340969bba99e78f.dat-(1607-1200).png)

###チームえみりー
![TeamEmily](https://www.evernote.com/shard/s23/sh/709822a4-666e-44ee-9f68-0488b72622fd/b1ca9c919b8df9cc9481eb6fbdd9b2b3/deep/0/金曜日,-8月-29---Dropbox.png)

##やってみての感想

* 今までも飯会自体は週一でやっていたのですが、今回テーマと目的を決めてご飯を食べることで、より __お互いの考え方を知ることに集中できた__気がします。
* やっていることが業務に直結するということではないですが、実際に「今後の面接では 社員/スタッフ全員が 応募者のことが分かるようにしよう」といった、 __すぐに使えそうなアイデアも出ました__。
* コミット頻度が違うメンバー同士でも対等に話し合えたので、 __社内全体のコミュニケーションスピードが上がった__気がします。
* 今後もぜひふりかえりつつやっていきたいです。
* Wantedlyさん、ありがとうございます！
HUnit 超入門

Haskellのユニットテスト用ライブラリHUnitを使うのに最低限必要な事項を説明します。

この記事は[Haskell 超入門](http://qiita.com/7shi/items/145f1234f8ec2af923ef)シリーズの番外編です。

# 設定

HUnitへの参照が必要です。

Leksahでの設定方法を説明します。Leksahについては以下を参照してください。

* [Haskell IDE Leksah 入門](http://qiita.com/7shi/items/d1e5a0c22be6cf61d286)

メニューから設定します。

* Package → Edit
    * Dependencies → HUnit と入力して [Add]
    * [Save]

依存関係を変更した後は[1]中間生成物を消去して[2]configureをやり直します。

![clean-configure.png](https://qiita-image-store.s3.amazonaws.com/0/32057/52e613c5-2aca-2d47-5e1e-564cad1a6268.png)

以上で設定は完了です。

# 使用方法

簡単な使用方法を説明します。

HUnitで定義されている`~:`と`~?=`という演算子を使って、想定される結果を記述します。奇妙な演算子ですが、先頭の`~`で識別してください。

```text
ラベル ~: 式 ~?= 期待値
```

ラベルはテストに名前を付けるのに使用します。省略可能ですが、エラー発生時に識別が難しくなるため、付けておく方が無難です。

```hs
import Test.HUnit
import System.IO

fact 1 = 1
fact n = n * fact (n - 1)

tests = TestList
    [ "fact 1" ~: fact 1 ~?= 1
    , "fact 2" ~: fact 2 ~?= 2
    , "fact 3" ~: fact 3 ~?= 6
    , "fact 4" ~: fact 4 ~?= 24
    , "fact 5" ~: fact 5 ~?= 120
    ]

main = do
    runTestText (putTextToHandle stderr False) tests
```

テストが通れば結果のみが表示されます。表示がシンプルになるように`putTextToHandle`で調整しています。

```text:実行結果
Cases: 5  Tried: 5  Errors: 0  Failures: 0
```

## 失敗

故意にテストを失敗させて結果を確認します。

```hs:テストの改変部分
    , "fact 5" ~: fact 5 ~?= 100
```
```text:実行結果
### Failure in: 4:fact 5
expected: 100
 but got: 120
Cases: 5  Tried: 5  Errors: 0  Failures: 1
```

## エラー

故意にエラーを発生させて結果を確認します。

```hs
import Test.HUnit
import System.IO

f 1 = 0

tests = TestList
    [ "f 0" ~: f 0 ~?= 0
    , "f 1" ~: f 1 ~?= 0
    , "f 2" ~: f 2 ~?= 0
    ]

main = do
    runTestText (putTextToHandle stderr False) tests
```
```text:実行結果
### Error in:   0:f 0
src\Main.hs:4:1-7: Non-exhaustive patterns in function f

### Error in:   2:f 2
src\Main.hs:4:1-7: Non-exhaustive patterns in function f

Cases: 3  Tried: 3  Errors: 2  Failures: 0
```

# その他

以上の知識で、初めのうちは充分ではないかと思います。

それ以外の使い方は以下を参照してください。

* [HaskellのUnitTest、HUnitについて学ぶ - エンジニアのソフトウェア的愛情](http://d.hatena.ne.jp/E_Mattsan/20121020/1350707524)

何か関数を実装するときは想定される結果でテストを書いておくことをお勧めします。テストについては以下を参照してください。

* [テスト駆動開発 - Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA)
Unityの用語整理



[見てわかるUnity4 2Dゲーム制作超入門 (GAME DEVELOPER BOOKS) ](http://www.amazon.co.jp/%E8%A6%8B%E3%81%A6%E3%82%8F%E3%81%8B%E3%82%8BUnity4-2D%E3%82%B2%E3%83%BC%E3%83%A0%E5%88%B6%E4%BD%9C%E8%B6%85%E5%85%A5%E9%96%80-GAME-DEVELOPER-BOOKS/dp/4798041254/ref=sr_1_2?ie=UTF8&qid=1409293982&sr=8-2&keywords=unity2d)を参考にしました。

http://japan.unity3d.com/developer/document/tutorial/2d-shooting-game/
にあるチュートリアルをやりながら出てきた単語をまとめてみました。



---

###unityの構造

プロジェクト (ゲーム全体を管理)
=> シーン(ゲームオブジェクトを配置して構成される画面。)
=> ゲームオブジェクト (キャラや背景等ゲームの要素。シーンの中に配置される)

---

### アセット
ゲームオブジェクトやシーンに使われる画像や音声等の素材
	
- テクスチャ(unityで使用される画像のことをこう呼ぶ)
- Prefab(あるゲームオブジェクトを生成するためのひな形)
- etc..

### ゲームオブジェクト

- トランスフォーム(ゲームオブジェクトの位置、向き、大きさを決める)
- コンポネント(ゲームオブジェクトに様々な機能を追加する)

	- コライダー(ゲームオブジェクトに衝突判定を与える)
	- リジッドボディ(ゲームオブジェクトに剛体を設定する)
	- スクリプト(ゲームオブジェクトにプログラムを実装できる)
	- マテリアル(ゲームオブジェクトの表面の描画を決める。アセットを活用できる。)
	- etc..


#### スプライト(2D用のゲームオブジェクト)

- レイヤー(Z軸が存在しないから、重なりを管理する)	
- シングルモード(1枚のテクスチャのみを使う)
- マルチプルモード

	複数枚のテクスチャを用いる。その中からスプライトに表示するものを1枚選択して表示する。
	「アニメーション」を設定することで、テクスチャが切り替わりパラパラマンガのように表現される。

##### アニメーション
ゲームオブジェクトを選択して「アニメーションview」から設定する。

#### スクリプト

ゲームオブジェクトのコンポネントに割り当てる。

StartとUpdateがデフォルトで定義されている。
Startがシーン開始時に一度実行される。
Updateはシーンの表示が更新された時に実行される。

シーンの表示の更新はマシンスペックによって異なるので、前のシーンからの差分を取得する`Time.deltaTime`を使って移動距離を調整する。

#### コライダー2D

2Dのゲームオブジェクトに __衝突判定__ を設定する。
スクリプトで物体が重なっているかどうかが判別できるようになる。
コライダー2Dは衝突判定を設定するだけなのでこれだけでは、衝突した物同士が反射したりしない。
そうさせるためには、リジッドボディ2Dが必要。

#### リジッドボディ2D

剛体を設定する
Pecoを使ってインタラクティブにcd

ヒストリから探してディレクトリに移動できるのはいくつかあったが、今いるディレクトリの中を見ながら1階層ずつ移動したかったので、適当にシェルスクリプトを書いてみた。

```zsh
#!/usr/bin/env zsh
 
#add following alias to your ~/.zshrc 
#alias cdp='. _cdp'
 
PWD=`ls -la | grep '^d' | awk '{print $9}' | peco --prompt="$(pwd) >"`
if [ $PWD = "." ]; then
    cd $PWD
else
    cd $PWD
    . _cdp
fi
```
bindを用いてタッチイベントを定義した際の座標取得

iOSなどでは`onmousedown`、`onmousemove`などのマウスイベントが使えない。

代わりに`ontouchstart`、`ontouchmove`などを使う必要がある。

ここでハマったのが、タッチした座標を得る際に

```js
$('#hoge').bind('touchstart', function(e){
    var x = e.touches[0].pageX;
    var y = e.touches[0].pageY;  //touchesが無いと怒られる
});
```

とすると、touchesが無いと怒られる。どうやらbindを用いると上記の方法では上手くいかないようだ。
解決策として

```js
$('#hoge').bind('touchstart', function(e){
    var x = e.originalEvent.touches[0].pageX;
    var y = e.originalEvent.touches[0].pageY;
});
```

とすれば良い。
CakephpのAuthで管理者と担当の権限分け


ユーザーテーブルにroleというカラムを作って、adminかuserを入れておく。
以下をAppControllerの方に書く。

```php
class AppController extends Controller {
	public $components = array(
		'Session',
		'Auth' => array(
			'loginRedirect' => array('controller' => 'pages', 'action' => 'display', 'home'),
			'logoutRedirect' => array('controller' => 'users', 'action' => 'login'),
			'authorize' => array('Controller') 
		)
	);

	public function isAuthorized($user) {
		if (isset($user['role']) && $user['role'] === 'admin') {
			return true;
		}

		return false;
	}

}
```

個別のコントローラに以下を書く。

```php
	public function isAuthorized($user) {
		if ($this->action === 'index') {
			return true;
		}

		return parent::isAuthorized($user);
	}
```

許されたページ以外のリンクをたたいても移動しない。
Rubyにおける`{}`とメソッドの相互作用



Rubyの世界では[だいたいなんでもオブジェクト](http://learn-ruby-from-one.herokuapp.com/#1)だったのでした。

Rubyのメソッドは`()`で括った引数だけでなく、
`do .... end `または`{ .... }`で括ったコードブロックを続けることができます。

コードブロックは引数同様メソッドに引き渡されます。
したがって、メソッドはブロックに対して、それを実行したり、それを変数に保存しておいたりと様々な処理を施せます。
こういうのを「ブロック付きメソッド呼び出し」とか「ブロック構文」とか呼びます。
では、メソッドとコードブロックはどのようにはたらくのでしょうか。

メソッド内に`yield`を書くことがポイントです。
大雑把には、`yield = (コードブロックの中身に書いてあること) `としてはたらきます。

```ruby:
# yieldを手続きとしてみなす
def foo
    print "yo!"
    yield
    print "yoyoyo!"
end

foo{ print "yoyo!" }
```

[こうなる](http://ideone.com/LlaqXz)

```ruby:
# yieldを値（返り値）としてみなす
def foo
   return yield
end

print foo{ "Hello." }
```

[こうなる](http://ideone.com/C8j577)

```ruby:
# yield var1, var2, ... と書くと、逆流（？）する。すなわち、メソッド内からブロックの||で囲われた部分へブロックパラメータが渡る。
def foo
   yield 1, 2, 3
end

foo{|x, y, z|
    print x
    print y
    print z
}
```

[こうなる](http://ideone.com/QVTTAr)

### ブロック構文がわかると
```ruby:
['toast', 'cheese', 'wine'].each { |food| print food.capitalize }
```
[たのしい引用元](http://www.aoky.net/articles/why_poignant_guide_to_ruby/chapter-3.html)
みたいな、Ruby独特の書き方が身近に感じられるような気がしますね・・・？
JekinsのURLを8080→80にする

#対象OS等
OS　　　：Amazon Linux（8/29の最新版で実施）
Jenkins：ver1.577（8/29の最新版で実施）

#手順

##JenkinsのURL変更
デフォルトのURLから変えておかないと、上手く画像等が表示されないようです。
以下のような画像になるようです。
![jenkinsエラー.jpg](https://qiita-image-store.s3.amazonaws.com/0/47012/1c997bfa-d2aa-db42-1d3b-a31d9acede2e.jpeg)

定義ファイルの修正
`$ sudo vi /etc/sysconfig/jenkins`

```
#以下の行を修正
JENKINS_ARGS="--prefix=/jenkins"
```

サービス再起動
`$ sudo service jenkins restart`

##apacheの導入

インストール
`$ sudo yum install httpd`

定義ファイルの修正
`$ sudo vi /etc/httpd/conf/httpd.conf`

```
#以下の行を修正
<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>
ProxyPass /jenkins http://localhost:8080/jenkins　←追加
#           ↑変更後のURL　　　↑今のJenkinsのURL
```

サービスの起動
`$ sudo service httpd start`

サービスの自動起動
`$ sudo chkconfig httpd on`
Running Kubernetes on CoreOS with flannel (formerly Rudder)

Introducing flannel: An etcd backed overlay network for containers
https://coreos.com/blog/introducing-rudder/

> Things are not as easy on other cloud providers where a host cannot get an entire subnet to itself. Rudder aims to solve this problem by creating an overlay mesh network that provisions a subnet to each server.

Running Kubernetes Example on CoreOS, Part 2 - Qiita
http://qiita.com/yungsang/items/f286154be7bb6c4ef09f

で懸案になっていた VirtualBox でのコンテナ間のネットワーキングが Rudder によって解決できそうです。

今回大きく変更したのは、[master.yml](https://gist.github.com/YungSang/6177b69f1754f0590dbe#file-master-yml) と [minion.yml](https://gist.github.com/YungSang/6177b69f1754f0590dbe#file-minion-yml) で、
**flannel のおかげで複雑だったブリッジや iptables の設定が一切必要無くなりました！素晴らしいー！！**

**もちろん、前回手作業で行った「[コンテナ間のルーティングの設定](http://qiita.com/yungsang/items/f286154be7bb6c4ef09f#3-2)」も不要！！**

ここでポイントとなったのは、

```yaml:minion.yml
    - name: flannel.service
      command: start
      content: |
        [Unit]
        Requires=etcd.service
        After=etcd.service
 
        [Service]
        ExecStart=/opt/bin/flanneld -iface=$public_ipv4
```

**flannel に対して使用する IP アドレス(インターフェース)を指定してあげること。**
これをしないと Vagrant で起動した場合に、全ての VM で共通のプライベートな IP が選択されてしまい、全ての VM で同じ SUBNET が設定されてしまう結果になりました。

以下、Kubernetes の操作は前回と全く変更ありません。

コードは前回同様、
Running Kubernetes Example on CoreOS, Part 2 with Rudder
https://gist.github.com/YungSang/6177b69f1754f0590dbe
に置いてあります。

## Step Zero: クラスタの構築

```
$ git clone https://gist.github.com/6177b69f1754f0590dbe.git
$ vagrant up
```

これで、etcd discovery 用に一つ、Kubernetes master 用に一つ、Kubernetes minion が２つ起動されます。

### SSH tunnel の設定

ローカルマシンから `kubecfg` を使う場合は、以下の設定をします。
`master` にログインしてから `kubecfg` を使っても同じです。

```
$ curl -OL http://storage.googleapis.com/kubernetes/darwin/kubecfg
$ chmod +x kubecfg
$ mv kubecfg /usr/local/bin
$ kubecfg --version
Kubernetes v0.2-dev
```

```
$ vagrant ssh-config master > ssh.config
$ ssh -f -nNT -L 8080:127.0.0.1:8080 -F ssh.config master
$ kubecfg list pods
ID                  Image(s)            Host                Labels              Status
----------          ----------          ----------          ----------          ----------


```

## Step One: redis master の起動

```
$ kubecfg -c redis-master.json create pods
```

## Step Two: redis master service の設定

```
$ kubecfg -c redis-master-service.json create services
```

## Step Three: redis slave の起動

```
$ kubecfg -c redis-slave-controller.json create replicationControllers
```

## Step Four: redis slave service の設定

```
$ kubecfg -c redis-slave-service.json create services
```

## Step Five: frontend UI の起動

```
$ kubecfg -c frontend-controller.json create replicationControllers
```

```
$ open http://192.168.12.11:8000
$ open http://192.168.12.12:8000
```

どちらからアクセスしても Guestbook の同期がちゃんと取れています。
簡単なAPIの使い方

以前、[簡単な処理を行うAPIの作り方](http://qiita.com/seiya1121/items/669a63402536da1da209)について書きました。

前回は、`test_controller.rb`に`user_photos`というAPIを作成し、ルーティング設定までしました。
ちなみに`user_photos`は、`user_id`に紐づいている`photo_id`を取得し、JSON形式で返してくれるAPIです。

今回は、そのAPIの使い方について記そうと思います。

フォームにuser_idが入力されたら非同期でそのユーザーの写真を表示するということをやってみようと思います。

今回、非同期でphotoを取ってきたいので、Ajaxを使って呼び出します。

```javascript:user_photosが使用されている箇所
$.ajax({
    type: 'GET',
    url: '/test/user_photos/' + user_id,
    datatype: 'json'
})
```

ルーティング設定をした際に、`get /test/user_photos/:id`と設定したのでまず、`type:GET`でAPIのURL`url: '/test/user_photos/' + user_id`を叩き、その値を`datetype:'json'`で受け取ります。

##まとめ
APIを使いたい場合は、そのAPIが必要としている値やアクションをした際に、そAPIのURLを指定された方法で叩きにいけば良いのです。
その後、そのデータをどのように表示させるかは作り手次第です！
Test-Kitchenでモンキーパッチ

<!-- permanent -->

古めのJoyent SmartOSでTest-Kitchenをしようとしたら、Ohai7.2以上,Chef11.8以上がさくっとインストール出来ない状態だった。
Omnibusにも対応してないのでプラグインを作ってRubyGemsからChefを入れていたけど、バージョン指定の処理を実装しておらず困ったので、とりあえずモンキーパッチすることにした。


## rubyコマンドでrequireする。

実行時に適当なRubyファイルを読ませるには-`r(require)`オプションを付けてRubyを実行すればよい。

```monkey_patch/hoge.rb
puts 'hogehoge'
```

ファイルを用意して`-r`

```shell:
$ ruby -r ./monkey_patch/hoge ./bin/kitchen -v
hogehoge
Test Kitchen version 1.2.1
```


ただ毎回rubyコマンドからkitchenするのは面倒。


## じゃあ.kitchen.ymlに書いちゃう 

driverで`ohai_version`、`chef_version`を指定したら、`gem install`時に指定するようにしたかったので、応急処置として`.kitchen.yml`でクラスをオープンしてしまうことにした。`def install_chef_for_smartos`をまるっとオーバーライド。

なんか色々と酷い気がするので常用はおすすめしません。

```yaml:.kitchen.yml
---
driver_plugin: zcloudjp
driver_config:
  api_key: PLEASE_REPLACE_IT_BY.kitchen.local.yml
  ohai_version: 7.0.4
  chef_version: 11.6.2

provisioner:
  name: chef_solo
  require_chef_omnibus: false
  data_path: <%= ENV['NO_DATA'] ? "null" : "data" %>

platforms:
- name: sm-base64
  driver_config:
    username: root
    metadata_file: tk/metadata.json
    dataset: "sdc:sdc:base64:1.9.1"
    package: xxx_xxx
    with_gcc: true

suites:
- name: default
  use_sudo: false
  run_list:
  attributes: {}


<%
## Monkey Patch for SmartOS 1.9.1
require 'kitchen/driver/zcloudjp'

module Kitchen
  module Driver
    class Zcloudjp
      class_eval do
        def install_chef_for_smartos(ssh_args)
          if config[:with_gcc]
            install_pkgs = "gcc47 gcc47-runtime scmgit-base scmgit-docs gmake ruby193-base ruby193-yajl ruby193-nokogiri ruby193-readline pkg-config"
          else
            install_pkgs = "scmgit-base scmgit-docs ruby193-base ruby193-yajl ruby193-nokogiri ruby193-readline"
          end

          ssh(ssh_args, <<-INSTALL.gsub(/^ {10}/, ''))
            if [ ! -f /opt/local/bin/chef-client ]; then
              pkgin -y install #{install_pkgs}

            ## for smf cookbook
              pkgin -y install libxslt

            ## install chef
              gem update --system --no-ri --no-rdoc
              gem install --no-ri --no-rdoc ohai #{config[:ohai_version] ? '--version ' + %Q{'=  #{config[:ohai_version]}'} : nil }
              gem install --no-ri --no-rdoc chef #{config[:chef_version] ? '--version ' + %Q{'=  #{config[:chef_version]}'} : nil }
              gem install --no-ri --no-rdoc rb-readline
            fi
          INSTALL
        end
      end
    end
  end
end
%>
```

### 外部ファイルにして.kitchen.ymlでロード

流石に`.kitchen.yml`が読みにくいのでloadにした。`SafeYAML::OPTIONS[:default_mode]`は警告の抑制。

```yaml:.kitchen.yml
...

<%
## Monkey Patch for SmartOS 1.9.1
SafeYAML::OPTIONS[:default_mode] = :unsafe
load File.expand_path('../monkey_patch/fix_install_for191.rb', __FILE__)
%>
```

なお、後日Gemのほうに反映してモンキーパッチは消しました。
Google Drive上のBoxファイルをVagrant Cloudで公開できなくなります


残念ながら。

[Google Drive のウェブ ホスティング 機能 廃止のお知らせ](http://googledevjp.blogspot.jp/2015/10/google-drive.html?m=0)

## 手順

* Google DriveにアップロードしたBoxファイルの公開設定オプションを **「ウェブ上で一般公開」**へ

* 共有設定に表示されている共有リンクをVagrant CloudのProvider設定のURL欄に一旦コピペ

* コピペしたURLを `https://drive.google.com/file/d/FILE_ID/edit?usp=sharing` 的なやつから `https://googledrive.com/host/FILE_ID` に編集してProviderを作成

Vagrant Cloudがよくわからない場合は [Vagrant CloudにBoxを公開する](http://qiita.com/y-mori/items/529a3a61903e7c80bad6) を参考にしましょう。

## 共有設定を「リンクを知っている全員」にすると

vagrant upでエラーが出ます。

```
$ vagrant up
...
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

The requested URL returned error: 404 Not Found
```

## 他の無料オンラインストレージサービス

### [Yahoo!ボックス](http://info.box.yahoo.co.jp/index.html)

ブラウザからだと300MB以上のファイルはアップロードできなかった。アプリは入れたくないの。

### [Amazon Cloud Drive](http://www.amazon.co.jp/gp/feature.html?docId=3077664656)

アップロードする際のサイズ制限は2GBらしいのでイケるかと思ったら、ファイル共有の機能がなかった...
R言語で、MongoDBの値を直接取得する。


R言語で、MongoDBの値を直接扱う。ログとか非定型データをスキーマレスにMongoDBに入れといて、R言語で直接扱うといろいろ捗る。
RMongoでAggregationも出来ますが、それはまた今度。

# 流れざっくり

## インストール

CRANからパッケージを取得しておき、インストールする。Linuxならtar.gzで、windowsならzip。今回はRStudio使ってるのでtar.gz。RMongo使うには、rJavaが必要。

```
install.packages("/tmp/rJava_0.9-6.tar.gz", repos = NULL, type = "source")
install.packages("/tmp/RMongo_0.0.25.tar.gz", repos = NULL, type = "source")
```

## ライブラリ読み込み

```
library('RMongo')
```

## 接続

```
mongo <- mongoDbConnect("test", "localhost", 27017)
```

## データ取得

MongoDBの値をデータフレームとして取得できる

### 取得項目指定なし

第二引数に条件を指定する

```
dbGetQuery(mongo, "test",{"hoge":"fuga"})
```

### 取得項目指定あり

第二引数に条件を、第三引数に取得したい項目を指定する

```
dbGetQueryForKeys(mongo, "test",'{"hoge": "fuga"}', '{"hige": 1}')
```

## 切断

```
dbDisconnect(mongo)
```

# 参考

[CRAN - Package RMongo](http://cran.r-project.org/web/packages/RMongo/index.html)
[CRAN - Package rJava](http://cran.r-project.org/web/packages/rJava/index.html)
[Package ‘RMongo’](http://cran.r-project.org/web/packages/RMongo/RMongo.pdf)
Submoduleの一部をassetsとして扱い、apkに含める方法

## やりたいこと

ハイブリッドアプリを開発していて、`assets`を別のリポジトリで開発している。
  
`assets`リポジトリは、`Grunt`で管理されているので普通に`submodule`として取り込んでビルドすると、圧縮前のファイルが`apk`に含まれてしまって、ファイルサイズが大きくなる＼(^o^)／
  
最終的な成果物が格納される、`dest`ディレクトリだけをAndroid側から参照できる`assets`として扱い、`apk`ファイルに含めるようにしたい。

## やりかた

Androidアプリの`src`ディレクトリ構成は下記のような構成と仮定する。

```shell-session:src
.
|-- androidTest
`-- main
    |-- AndroidManifest.xml
    |-- assets <= submoduleとして取り込んでいる
    |   |-- Gruntfile.js
    |   |-- README.md
    |   |-- css
    |   |-- dest <= このディレクトリだけを対象としたい
    |   |-- img
    |   |-- index.html
    |   |-- js
    |   `-- scss
    |-- java
    `-- res
```

  
`gradle`先生が、全て解決してくれました。

```groovy:build.gradle
android {
    sourceSets {
      main {
        assets.srcDirs = ['src/main/assets/dest']
      }
    }
}
```

## さいごに

簡単すぎワロタ…＼(^o^)／
Eclipse 4.4を日本語化 (mac)

いつもと手順一緒ですね。

* [eclipse download](https://www.eclipse.org/downloads/)
* [Android sdk込み](http://developer.android.com/sdk/index.html#download)

[Pleiades - Eclipse プラグイン日本語化プラグイン | MergeDoc Project](http://mergedoc.sourceforge.jp)からpleiades最新版をダウンロード

![スクリーンショット 2014-08-29 13.31.27.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2e318ed7-c949-6e2c-558b-90e3d4778fa5.png)


```bash:pleiades.zipを解凍しコピー
cp -a pleiades/features/* /Applications/eclipse/features/
cp -a pleiades/plugins/* /Applications/eclipse/plugins/
```

```text:/Applications/eclipse/Eclipse.app/Contents/MacOS/eclipse.iniに追加
-javaagent:/Applications/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```


あとは [eclipse初心者にもおすすめなプラグインを教えてもらうスレ - Qiita](http://qiita.com/tukiyo3/items/443469ed57069be9a4d6) を参考にする
iOS7 な iPad の Safari で box-shadow が効かなくなるコトがある件について


# 概要

普通に素直に書いているハズの box-shadow がウンともスンとも効かない。

何故か効いてる箇所もある。

# 詳細

例えばこんな HTML があるとする

```html:index.html
<!DOCTYPE html>
<html>
  <head><title>Sample</title></head>
  <body>
    <div id="container">
      <div class="hoge">
        <p>さんぷる</p>
      </div>
    </div>
  </body>
</html>
```

んで、こんな CSS があるとする

```css:bad.css
.hoge {
  width: 400px;
  height: 200px;
  background-color: #ff0000;
  box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.5);
}
```

まぁ、効かないんですわ。そりゃもう盛大に。

※ひょっとしたら、上の例だと効くかも？ (検証してないｗ

# 解決策

色々あるのかも知れないけど、何故か border-radius 付けたら描画された。

```css:good.css
.hoge {
  width: 400px;
  height: 200px;
  background-color: #ff0000;
  box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.5);

  border-radius: 1px;
}
```

レイアウトが微妙に変化するので、どうにかならんかと思って、プロパティの値として 0 やら -1px やら付けてみたけどダメだった。
RailsでTwitterBootstrapを使ったflashメッセージ

僕はbootstrapをよく使うので、bootstrapのAlerts Componentを使ってflash部分をpartial化してみる。
もちろんbootstrapじゃなくても、flashのタイプごとにhtmlとかcssを変えたい場合に応用できると思う。

```html+erb:_flashes.html.erb
<% flash.each do |type, message| %>
<div class="alert <%= flash_class_for(type) %>" role="alert">
  <button class="close" data-dismiss="alert">×</button>
  <%= message %>
</div>
<% end %>
```

```html+erb:application.html.erb
<%= render partial: "shared/flashes", flash: flash %>
```

```rb:application_helper.rb
module ApplicationHelper
  def flash_class_for flash_type
    case flash_type
    when 'success' then 'alert-success'
    when 'error'   then 'alert-danger'
    when 'alert'   then 'alert-warning'
    when 'notice'  then 'alert-info'
    end
  end
end
```
Dart 1.6 になって Polymer.dart のカスタム要素が作りやすくなった


[Polymer.dart でアプリを作ってみて][ansi-pixels]感じたことは、新たなカスタム要素や、そのアプリが動くページ（エントリポイントと呼ぶ）を作成するのに、決まった記述が多いため煩わしいということ。既存のものからコピペして書き換え忘れがあると情けないことになるし。

しかし、Dart 1.6 になって追加された [pub run][pub-run] を利用してカスタム要素やエントリポイントの Scaffolding ができるようになった:

```bash:&lt;nyan-cat&gt;要素を作る例
#プロジェクトルート作成
$ mkdir nyan_cat
$ cat > pubspec.yaml
name: nyan_cat
dependencies:
  polymer: any
$ pub get

# カスタム要素の Scaffolding
$ pub run polymer:new_element nyan-cat -o lib
Successfully created:
  /home/kui/dart/nyan_cat/lib/nyan_cat.dart
  /home/kui/dart/nyan_cat/lib/nyan_cat.html

# サンプルを動かすためのエントリポイントの Scaffolding
$ pub run polymer:new_entry example/index.html
Added example/index.html to /home/kui/dart/nyan_cat/pubspec.yaml
Successfully created:
  /home/kui/dart/nyan_cat/example/index.html

# 新しくディレクトリ作ったので
$ pub get
```

さすがにエントリポイントに `<nyan-cat>` 要素までは記述してくれないけれど、だいぶコレで負担が減る。もっと早くきてくれたらアプリ開発もう少し楽だったのに。

余談
======

[Dart v1.6 のリリースノート](https://groups.google.com/a/dartlang.org/forum/#!msg/announce/Ek1EROgTD1Q/SR7lFmYjn20J) に `pub run` について書かれていないのって:

> In 1.6, pub run starts up slowly. This will be significantly improved in the next release of the SDK.
> [pub run | Dart: Structured web apps][pub-run] から

これのせい？

[ansi-pixels]: http://qiita.com/k_ui/items/12e3067795d299c02778
[pub-run]: https://www.dartlang.org/tools/pub/cmd/pub-run.html "pub run | Dart: Structured web apps"
Ruby 1.9.3-p484と 1.9.3-p545の違いで構文エラー

次のようなコードをシンタックスチェックする。

~~~ruby:test.rb
p :abc,

def test
  "".method {}
  "".method do ; end
end
~~~

***
***1.9.3-p545***
OK。

~~~
$ ruby -v
ruby 1.9.3p545 (2014-02-24 revision 45159) [x86_64-linux]

$ ruby -c test.rb
Syntax OK
~~~

***

***1.9.3-p484***
ブロックが “{}” はOKだけど、“do end”だとエラーになる。

~~~
$ ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]

$ ruby -c test.rb
test.rb:5: syntax error, unexpected keyword_do_block, expecting keyword_end
  "".method do ; end
~~~

***

p545でなにか変わって解釈の仕方が変化しらしい。

何が問題かというと ```p :abc,```の末尾の ","のようだ。
これををとれば、どのバージョンでもOKになる。
Windows 8.1 に TeX Live 2014 をインストール

忘れるのでメモ  

# インストール
　[ここ](https://www.tug.org/texlive/ "Tex Live")の download にある install-tl.zip をダウンロードする．

　解凍してできた install-tl-20140828 を適当なフォルダに移動する．ただし，全角文字や空白のある PATH は避けるほうが無難です．また，install-tl-20140828 の日付は，install-tl.zip をダウンロードした日によって変わると思います．

　プロキシ環境の場合 %HOME%（%HOME% が設定してなければ，C:\Users\xxxx になると思います） に下記のような内容で .wgetrc を作成する．

```.wgetrc
http_proxy=http://url:port/
ftp_proxy=http://url:port/
```

　コマンドプロンプトからインストーラを実行する（必要なら管理者権限でコマンドプロンプトを実行）．ウィルス対策ソフトが起動していると失敗することがあるようです．
`> install-tl-windows.bat --no-persistent-downloads -v`

　途中で失敗した場合は，再度実行して処理するを再会する．  
（ネットワークの環境にもよると思いますが，標準設定のインストールで 5 時間以上かかったので，DVD イメージからインストールする方が無難です）

# アップデート
tlmgr のアップデート
`> tlmgr update --self --no-persistent-downloads`

パッケージ のアップデート
`> tlmgr update --all --no-persistent-downloads`

# 設定 (Sublime Text 3 を使用)
## 游書体を使用する．  
`> kanji-config-updmap status` （現在の設定の確認）
`> kanji-config-updmap yu-win` （書体の設定）

## Sumatra PDF を使用する．  
　[ここ](http://blog.kowalczyk.info/software/sumatrapdf/free-pdf-reader-ja.html "Sumatra PDF")のダウンロードにあるポータブル版（SumatraPDF-2.5.2.zip）をダウンロードして適当なフォルダに解凍する．
【設定】→【詳細設定】から設定を変更．（SumatraPDF を終了してから編集）

```SumatraPDF-setting.txt
MainWindowBackground = #f0f0f0 // #80fff200
EscToExit
ShowStartpage = false
InverseSearchCmdLine = "C:\Program Files\Sublime Text3\sublime_text.exe" "%f:%l"
```

## latexmk を使用してタイプセットを楽にする．  
%HOME% に下記のような内容で .latexmkrc を作成する．

```.latexmkrc
$latex         = 'platex -src-specials -interaction=nonstopmode -synctex=1';
$bibtex        = 'pbibtex %O %B';
$dvipdf        = 'dvipdfmx %O -o %D %S';
$pdf_mode      = 3;
$pdf_update_method = 0;
$pdf_previewer = 'C:\Programs\SumatraPDF\SumatraPDF.exe';
```

　簡単な使い方
`> latexmk -pv main.tex` （PDF の作成とプレビュー）
`> latexmk -c`           （一時ファイルの削除）

## Sublime Text からタイプセット（Ctrl+B）
　メーニューバーの【Tools】→【Build System】→【New Build System…】を選択．
LaTex.sublime-build のという名前で下記内容を保存．

```LaTex.sublime-build
{
    "cmd": ["latexmk", "-pv", "$file_name"],
    "selector": "source.tex",
}
```
Web ComponentsをHTML Importsでロードする必要性


慣例的に`<link rel="import" href="x-element.html">`な感じでロードされているけど、前提として、 **HTMLImportsである必要はない** 。何故ならば、Web Componentsを構成する4つの仕様はそれぞれ独立しているからである。だから、インポートを使わなくても`document.registerElement()`でカスタム要素の定義は出来るし、HTMLのひな形を使いたい場合に`<template>`タグを使っても良い。

## HTMLを部品として含む場合

HTMLやCSSを部品として含む場合は、`<template>`タグや、ShadowDOMを駆使しながらパーツを構成していくので、HTMLファイルに書かざるを得ない。もちろん、JavaScriptだけで書けないこともないんだけど、本質ではない。

先日画像をスクロール同期的にロードする要素、 [1000ch/lazyload-image](https://github.com/1000ch/lazyload-image) を作ったけど、こちらはHTMLファイルではなく、単一のJSファイル。GitHubが作っている [github/time-elements](https://github.com/github/time-elements) なんかも、[time-elements.js](https://github.com/github/time-elements/blob/master/time-elements.js)だけで構成されているけど、こういう場合は`<link rel="import" href="x-element.html">`ではなく、`<script src="x-element.js"></script>`で事が足りる。

## 他のWeb Componentsに依存している場合

`<x-element>`が`<y-element>`に依存している場合は以下のように、`x-element.html`内で`y-element.html`をインポートする。

```html:x-element.html
<link rel="import" href="y-element">
<template id="tmpl">
  <div>This is x-element!</div>
</template>
<script>
  var XElementPrototype = Object.create(HTMLElement.prototype);
  XElementPrototype.createdCallback = function () {
    console.log(document.querySelector('#tmpl'));
  };
  window.XElement = document.registerElement('x-element', {
    prototype: XElementPrototype
  });
</script>
```

## そのコンポーネントからの相対パスを得たい

これは @hokaccha 氏が詳しく書いているが、Web Componentsとして配布するときに、画像等のサブリソースを含む場合は一工夫が必要になる。

- [HTML Importsで読み込まれたドキュメントからの相対パスを得る - Webtech Walker ](http://webtech-walker.com/archive/2014/07/html-import-relative-path.html)

例えば`<x-element>`というカスタムエレメントが以下のように、`img`フォルダの配下に`foo.png`と`bar.png`を含んだ構成とする。

- x-element
    - x-element.html
    - img
        - foo.png
        - bar.png


`bower`なんかでインストールされれば`x-element`というフォルダごとダウンロードされて、いざインポートするときには`<link rel="import" href="bower_components/x-element/x-element.html">`のようになる。

このとき、`foo.png`と`bar.png`を含むフォルダは`bower_components/x-element/img`というパスになるけど、`x-element.html`側で素直に`img/foo.png`と参照していると、インポート元のドキュメントルートからそのパスを辿ることになるので、上手く参照出来ない。

だから`document.baseURI`を使って相対パスを得たいということになるが、この場合に、HTMLファイルでないと`document.currentScript.ownerDocument.baseURI`と、`x-element.html`からみたベースのURLを辿れない。`URL`オブジェクトと組み合わせるとアレコレするときに幾分スマートかも。

```html:x-element.html
<script>
  var doc = document.currentScript.ownerDocument;
  var imgRoot = new URL('img', doc.baseURI);

  console.log(imgRoot.href);
  // => bower_components/x-element/img
</script>
```

ネタに走った感あるけど、 https://github.com/1000ch/x-zangief は上記のようなパス解決をしている。
CentOS7のAsterisk11イメージ作った

# インストールが面倒なので作った

* [tukiyo3/asterisk11:centos7](https://registry.hub.docker.com/u/tukiyo3/asterisk11/) 842.4 MB

正常動作確認はこれから。

## 起動方法

```bash:
sudo docker run \
 -it \
 -d \
 --privileged \
 --name="asterisk11" \
 -v /home/owner:/root \
 -p 30011:5090 \
 -p 30012:30012 \
 -p 30013:30013 \
 -p 30014:30014 \
 tukiyo3/asterisk11:centos7 \
 /sbin/init
```

```bash:~/.zshrc
nsconnect() {
    DOCKER_PID=$(docker inspect --format '{{.State.Pid}}' $(docker ps -ql))
    sudo nsenter -t ${DOCKER_PID} -m -u -i -n -p /bin/sh
}
```

```bash:コンテナに接続
nsconnect
```


# 作り方

## CentOS7コンテナ起動

```bash:コンテナ起動
sudo docker run \
 -it \
 -d \
 --privileged \
 --name="asterisk" \
 -v /home/owner:/root \
 -p 30011:30011 \
 -p 30012:30012 \
 -p 30013:30013 \
 -p 30014:30014 \
 tukiyo3/centos-ja:7.0 \
 /sbin/init
```

```bash:コンテナに接続
nsconnect
```

## Asteriskビルド手順

```bash:インストール手順
yum install -y vim wget tar hostname initscripts
yum install -y gcc gcc-c++ ncurses-devel libxml2-devel sqlite-devel make

cd /opt
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11-current.tar.gz
tar xzf asterisk-11-current.tar.gz
cd asterisk-11.*
./configure --prefix=/srv/asterisk11 | grep -v yes
make
make install
make samples
make config

adduser --system asterisk
chown -R asterisk:asterisk /srv/asterisk11/var
```

メモ:

* `systemctl stop asterisk`でkillprocを呼びます。
* killproc関数は/etc/init.d/functionsに含まれます。
* /etc/init.d/functions は initscripts に含まれます。


## Asterisk起動

```bash:起動
systemctl start asterisk
export PATH=$PATH:/sbin:/usr/sbin:/srv/asterisk11/sbin
asterisk -r
```
Slack chat plugin for Redmineを入れてみた。


slackを利用しているので色々と連携させたい欲求が出てきたので調べてみました。
LIGさんの、[SlackとRedmineを連携し、登録したチケットの更新を通知する方法](http://liginc.co.jp/web/programming/other-programming/97710)というのを見つけたのでその手順に従って入れてみたのでログを残します。

## インストール

私の環境のredmineのバージョンは2.2.3.stableとなっています。
pluginsディレクトリに、gitに公開されているredmine-slackを取ってきます。
手順としては以下を行いました。

```
$ cd /www/redmine/current/plugins
$ git clone https://github.com/sciyoshi/redmine-slack.git redmine_slack
$ bundle install
$ cd ../
$ rake redmine:plugins:migrate RAILS_ENV=production
```

unicornを停止・起動します。再起動でも出来るのかもしれないですが、この手順で行いました。

```
sudo /etc/init.d/unicorn_rails_redmine stop
sudo /etc/init.d/unicorn_rails_redmine start
```

プラグインが適用されました。

![Redmine Slack](http://i.gyazo.com/0f73a62a1cae46a6e397b28b9953b7e2.png "Redmine Slack")


## slackと連携

こちらの手順はLIGさんの手順通りに進めています。

### slack側の作業

* 「Slack」から「Configure Integrations」メニューへ移動
* 最下部の「DIY Integrations & Customizations」にある「Incoming WebHooks」をクリック
* 通知先となるチャンネルを指定し、「Add Incoming Webhook」をクリックして登録
* Your Unique Webhook URLを取得

### redmine側の作業

プロジェクト毎に通知を分けたいので、カスタムフィールドを追加する手順を記述します。

* Redmineの「管理」メニューにある「カスタムフィールド」をクリック
* カスタムフィールドの「プロジェクト」タブをクリックし、「新しいカスタムフィールドを作成」をクリック
* 以下のように設定し、保存をクリック
 * 名称：Slack Channel
 * 書式：リストから選択
 * 複数選択可：チェックしない
 * 選択肢：#をつけてSlackのチャンネルを記述
 * デフォルト値：未記入
 * 必須：チェックしない
 * 表示：チェック
 * 検索条件に設定可能とする：チェックしない
 * フィルタとして使う：チェックしない
![Redmine Slack](http://i.gyazo.com/ffb9deb9a74d02da593828b0235aad01.png "Redmine Slack")


今度はプロジェクト側の設定です。

* 通知したいプロジェクトの「設定」をクリック
* Slack Channelという項目とリストが表示されているので、チャンネル名を選択し、保存をクリック
![Redmine Slack](http://i.gyazo.com/367eaf6b9664a75737fc333484f21630.png "Redmine Slack")



プラグインの設定を行います。

* Redmine Slackの設定をクリック
![Redmine Slack](http://i.gyazo.com/0f73a62a1cae46a6e397b28b9953b7e2.png "Redmine Slack")
* 以下の項目を入力
 * Slack URL：slackにて取得した「Your Unique Webhook URL」を設定
 * Slack Channel：未記入
 * Slack Icon：そのまま
 * Slack Username：そのまま
![Redmine Slack](http://i.gyazo.com/f11f108213912cfdd6656e69a4d9ab2d.png "Redmine Slack")
* 適用ボタンをクリック

これで設定が完了しました。

該当するプロジェクトでチケットを発行すると、slackに通知が飛ぶようになります。

![Redmine Slack](http://i.gyazo.com/918b0f4a162199231bdc33c17ef22f08.png "Redmine Slack")

とても便利ですね。


## 参考にしたURL

* [SlackとRedmineを連携し、登録したチケットの更新を通知する方法](http://liginc.co.jp/web/programming/other-programming/97710)
ファイルのユーザ権限制御・Windows vs UNIX比較

間違っているところあったらコメントなしに直接編集していただいてかまいません。

| Windows|項目| UNIX |
|:-----------|:------------|:------------|
|ユーザ、グループは同列の権限主体であり、セキュリティプリンシパルというもっと広義のオブジェクトに含まれる。|権限主体|ユーザ、グループは別枠のオブジェクト。別々に権限主体となる。|
|可変長の数値構造体“SID（セキュリティ識別子）”。<br>既定のアカウント以外についてはランダム生成されるのでグローバルユニーク性が期待できる。|ユーザID|マシン内で固有の整数“uid”。グループもグループで、マシン内固有の整数ID“gid”を持つ。|
|ドメインコントローラ作成したユーザやグループはドメイン配下の各マシンで可搬。<br>また、ドメイン配下外でも認証を経てログオンセッションを“接続”することで【このマシンの資源についてはこのユーザーとして】振る舞える。|マルチマシン環境でのユーザ可搬性|いくつか選択肢がある。<br>・ユーザは各マシンに作成し、マッピングファイルを作ってuid対応関係を記述<br>・ユーザは各マシンに作成し、Kerberos認証でuid対応付け<br>・ユーザはLDAPサーバに作成し認証機能を委譲する（uidもLDAP側で定義する）。|
|ユーザは複数のグループに所属できる|グループの位置づけ|ユーザは必ずひとつ以上のグループに所属する。複数のグループに所属する場合、その中でも“本拠地”となるプライマリグループがひとつ決まっている。<br>これにより、ユーザがファイルを新規作成したときの所有ユーザ・所有グループが必ず一つ決まる。|
|ファイル・ディレクトリには必ず所有セキュリティプリンシパルがある（＝所有者がユーザである場合もグループである場合も、マシンなどそれ以外の主体である場合もある）。<br>所有者はそのエントリに対して全権限を持つ。<br>その他に、【誰は何をできる】という権限エントリを複数設定できる。この権限リストは親ディレクトリのものを継承しており、オーバーライドする形で設定していく。|権限の持ち方|ファイル・ディレクトリには必ず所有ユーザ、所有グループが一つずつある。その上で、読み・書き・実行の3項目について<br>・所有ユーザができること<br>・所有グループの所属ユーザができること<br>・それ以外のユーザができること<br>を設定できる。|
|ファイルの権限設定を無視できる全能ユーザはいないが、Administratorsグループの所属者はファイルの所有者を強制的に変更可能なので結果的に全権限を行使できる。|全権限ユーザ|rootユーザ（uid 0）がマシン内で全権限を持ち、ファイルの権限設定にかかわらずアクセス可能。|
|ユーザは所属するグループの権限を行使できる|グループの権限とユーザ権限の関係|ユーザは所属するグループの権限を行使できる|
YAPC::ASIA 2014 / 最近のウェブサービスの検索機能やその先の話


## はてなブックマークの検索の歴史

- 2007 MySQL の LIKE 検索
	- 特に問題はなかった
- 2008 サービス規模が拡大
	- 過去のナレッジを有効に活用できるようにしたい
	- Sedue を導入して過去エントリの全文検索が可能に
- 2009 関連エントリ
	- タグを元に関連エントリを表示できるようになった
	- Senna で 全文検索結果にまとめてタグづけなど可能に
		- スケールしないので課金ユーザのみ
- 2011 検索機能が不調になる
	- 保守を新たに結ぶか、OSS を利用するか
	- Solr の利用を検討
- 2013 Elasticsearch 検討
	- 今は多くの場所で使っている

## Elasticsearch の特徴

- 複雑なクエリを記述できる
	- 例: 自分のブクマから YAPC が入ってるエントリを検索
	- 例: お気に入りから YAPC エントリを検索
- Presso
	- 管理画面でパラメータを設定するとどうみえるか表示される
- はてなブックマークカウンター
	- ウェブサイト全体のブックマーク数を表示する
	- URL で検索して足し合わせていたが、aggregation で実現できる

## ES をなぜ採用したか？

- Query DSL の自由度で高度な企画要件にも耐えうる
- RDBMS だとスケールしにくい処理がオフロード可能

## 質疑応答

- オンラインでマッピングを変えるような時にどうしてるか？
	- 同じ構成の ES を用意して切り替える。ブルーグリーンデプロイメント。
UnityのAssetBundle差分更新システムの設計

# 概要
１年程前に実装した内容のまとめ
最近まで実装の変更はあったが、下記で落ち着いた感じです。
一応、アプリのバージョンアップを考慮した設計にしたつもり。

# 開発環境の前提
* 更新リストを利用したAssetBundleの利用が前提
* バージョン管理にSubversionの利用を前提
* ブランチ毎にアプリのバージョンが異なる前提

# 設計
* 依存関係の取得
AssetBundleにするファイルの依存関係のファイルリストを取得し、そのファイルと.metaについてもリビジョンを取得
※ 依存関係は`AssetDatabase.GetDependencies`にリストを渡すことで取得
更新するかは、最終の更新リストのリビジョンと照らし合わせる ※更新リストについては後述

* リビジョンの取得方法
svn infoにある
Last Changed Rev: からファイルのリビジョンを取得する

* ビルド後の格納パス
ビルドしたファイルは下記のフォルダに格納する
[platform]/[アプリバージョン]/[リビジョン]/ファイル名
アプリバージョンは変更を考慮し、アプリバージョンとは別でナンバーリングした値を利用
例) Android/11/12345/hoge.prefab

# 気をつけること
WWW.LoadFromCacheOrDownloadのバージョンにリビジョンを利用した場合、 別ブランチ(異なるアプリバージョン)でのリビジョンの方が上のことがある。
更新リスト取得時に以前のアプリバージョンのAssetBundleを消す事で対処とする

※ WWW.LoadFromCacheOrDownloadのCRCの値にダミーを放りこむことで削除する

# 更新リストの管理
ビルド後、[platform]_ [アプリバージョン]_ [連番].csvを作成

* csvフォーマット
`ファイル名,容量,リビジョン,CRC`

※ アプリバージョンは前述のナンバーリングした値
※ 連番は更新リストの作成数

# CRCの管理
* AssetBundleの更新の無い分については最終の更新リストから継続
* AssetBundle更新分はビルド時に収集していく

# 後処理
* ビルドが正常に完了した場合のみ、AssetBundleは別フォルダに格納して利用可能な状態にする

# メモ
外部コマンドの結果を取得する場合に、取得出来ないバグがあるので下記で対応

```csharp:command.cs
static string systemCommand(string command, string args){

	System.Diagnostics.Process p = new System.Diagnostics.Process();
	p.StartInfo.FileName = command;
	p.StartInfo.Arguments = args;
	p.StartInfo.UseShellExecute = false;
	p.StartInfo.RedirectStandardError=true;
	p.StartInfo.RedirectStandardOutput = true;

	p.Start();
	//string output = p.StandardOutput.ReadToEnd();
	string output = "";
	while (p.StandardOutput.Peek() > -1)
	{
		output += p.StandardOutput.ReadLine() + "\n";
	}
	p.WaitForExit();
	p.Close();
	return output;
}
```
macで/var/log/cronを記録したい


linuxだと普通にログ取られてるのにMacは無効だったので有効化します。


#手順

```/etc/syslog.conf``` に以下を追記

```/etc/syslog.conf
cron.*      /var/log/cron.log
```

```/System/Library/LaunchDaemons/com.vix.cron.plist``` 修正
1. ```ProgramArguments```に```-x```と```misc```を追加
2. ```StandardErrorPath``` を追加




```xml:/System/Library/LaunchDaemons/com.vix.cron.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.vix.cron</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/sbin/cron</string>
        <string>-x</string>
        <string>misc</string>
    </array>
    <key>KeepAlive</key>
    <dict>
        <key>PathState</key>
        <dict>
            <key>/etc/crontab</key>
            <true/>
        </dict>
    </dict>
    <key>QueueDirectories</key>
    <array>
        <string>/usr/lib/cron/tabs</string>
    </array>
    <key>EnableTransactions</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/var/log/cron.log</string>
</dict>
</plist>
```

有効化

```:有効化
$ sudo launchctl
Password:
launchd% unload /System/Library/LaunchDaemons/com.vix.cron.plist 
launchd% load /System/Library/LaunchDaemons/com.vix.cron.plist 
```




#参考
http://superuser.com/questions/134864/log-of-cron-actions-on-os-x
Vagrant / VirtualBoxプロバイダのときにVM名を指定する

[vboxss](http://d.hatena.ne.jp/hirose31/20140828/1409222812) と言う便利そうなツールがでてきたけれど、Vagrantはデフォルトでは深遠なVM名をつけてしまうので連携上不便。

https://docs.vagrantup.com/v2/virtualbox/configuration.html の通り、VM名を指定できるのでそうすると良いと思う。

```rb:Vagrantfile
config.vm.provider :virtualbox do |vbox|
  vbox.name = "vagrant-foobarproj"
end
```

multi vm でいちいち名前を変えるためにコピペするのが不毛なので、

```rb:Vagrantfile
def define_machine_name(c, name)
  c.vm.provider :virtualbox do |vbox|
    vbox.name = name
  end
end
```

みたいなマクロを定義して

```rb:Vagrantfile
config.vm.define :www do |c|
  define_machine_name c, "vagrant-www-foobarproj"
end
```

とすると読みやすい。