OmniAICreator/Qiita-1.07M huggingface dataset:
IPMI Toolのインストールと操作方法入門

IPMI(Intelligent Platform Management Interface)を使うとリモートのサーバーを自在に操れます。
例えば電源オンオフ、リセットしたりわざわざサーバーを物理的にいじらなくていいので楽チンです。
今回はクライアント側のお話です。
各プラットフォームでIPMI Toolをインストールして使ったことがあるのでインストール方法と簡単なコマンド体系を紹介したいと思います。
詳しい使い方は省きます。
覚え書き。

## インストール

### Linux(CentOS)

```bash
yum -y install OpenIPMI-tools
```

### Mac

homebrewで手軽にインストールできるらしいですよ、奥さん。

```bash
brew install ipmitool
```

### Windows

Windowsだけ違うツールを使います。

[ipmiutil - IPMI Management Utilities](http://ipmiutil.sourceforge.net/)

からダウンロードします。MSIでもzipでもどっちでも大丈夫です。

- zipはそのまま展開するだけ。
- MSIでインストールしたときは全く想定できないところにインストールされるので locate32 とかで探したほうがいいかもです。  
<del>パスも通ってないのでコマンドプロンプトで補完も効きません。</del> 再起動したらパスが通りました。  
私の場合は `C:\Program Files (x86)\sourceforge\ipmiutil` にインストールされました。

### Raspberry Pi(Raspbian)（クライアント側）

エラーが出ますが、気にしなくていいです。
クライアント側としてサーバーに対して命令発行できればいいので。

```
$ sudo apt-get -y install ipmitool
...
(snip)
...

Processing triggers for man-db ...
Setting up ipmitool (1.8.11-5) ...
[....] Starting IPMI event daemon ipmievdipmievd: using pidfile /var/run/ipmievd.pid0
Could not open device at /dev/ipmi0 or /dev/ipmi/0 or /dev/ipmidev/0: No such file or directory
Unable to open interface
 failed!
invoke-rc.d: initscript ipmievd, action "start" failed.
Unable to start ipmievd during installation.  Trying to disable.
```

## 簡単な使い方

LinuxとMacは共通のコマンド体系です。`-P`オプションを省略するとインタラクティブにパスワードを聞かれます。

```bash
ipmitool  -H ip_addr -U user_name -P password subcommand option
```

Windowsだけコマンドの形式が微妙に違います。

```
ipmiutil subcommand option -N ip_addr -U user_name -P password
```

### 電源オン

```bash
ipmitool  -H "192.168.1.55" -U "admin" -P password power on
```

### 電源オフ

```bash
ipmitool  -H "192.168.1.55" -U "admin" -P password power off
```

### 電源リセット

OSが動いていようがなかろうが強制的にリセットするのでどうしようもないとき、実験しているとき以外は使わないほうがいいです。
もっとソフトなコマンドがあると思います。

#### Linux, Mac

```bash
ipmitool  -H "192.168.1.55" -U "admin" -P password power reset
```

#### Windows

```
ipmiutil power -r -N 192.168.1.55 -U admin -P password
```

## 参考サイト

- [大量のサーバを管理するために、IPMIのお話｜サイバーエージェント 公式エンジニアブログ](http://ameblo.jp/principia-ca/entry-10983675114.html)
[ReVIEW Tips] LATEXBuilderでURLの書体を変える

ReVIEWの``review-pdfmaker``では標準でhyperrefパッケージを使っています。``@<href>``インラインを使ったURL表記では、LaTeXの``\url``マクロが使われます。

ところがこの``\url``マクロは、URLの書体が``tt``(モノスペース)になります。これだとただでさえ長くなって扱いに困るURLが妙に間延びしてしまいます。

これを修正するには、スタイルファイルで以下の様な指定を追加します。

```tex
\urlstyle{sf}
```

こうすると、``sf``(サンセリフ、ゴシック)になります。同様に、

```tex
\urlstyle{rm}
```

で``rm``(ローマン)に、また、

```tex
\urlstyle{same}
```

で本文と同じ書体になります。
[ReVIEW Tips] LATEXBuilderでシングルクォートを綺麗に表示する

ReVIEWのreview-pdfmaker(LATEXBuilder)でPDFを作ると、ASCII文字のシングルクォート（``'``）が``’``になってびっくりすることがあります。

とりわけ問題になるのはソースコードの表記に使われる場合で、コピー＆ペーストするとコードが動かない、という困った事態が多発します。さらに、シングルクォートの後ろに日本語の文字が来ると、余分な空白が入ったりして、また困ったことになります。

それを防ぐには、独自スタイルファイルに以下のような記述を追加します。

```tex
%%シングルクォート対応
\usepackage{upquote,textcomp}
\xspcode`'=0
```

こうすると、シングルクォートが全て``'``で表示され、また前後の空白も自動的に調整されます。日本語の場合はこの表記で困ることは特にないと思うので、この指定を推奨します。
twilioのDial動詞

Twilio？
「クラウド電話 API」。
日本では KDDI Web Communicationsが提供している電話APIです。

下記のコードをご覧ください。

```xml:twilio-dial.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Dial callerId="+8150xxxxyyyy">+8180xxxxyyyy</Dial>
</Response>
```

上記のコードを書いといてTwilioが参照できる場所（ウェブサーバー）に配置して置けば指定されている電話番号に電話をかけることが可能です。

このようにたった数行のコードを書くだけで様々なシステムやアプリなどと電話を繋いでくれるのが「Twilio」です。

・Twilio for KDDI Web Communications
[Twilio for KDDI Web Communications](http://twilio.kddi-web.com "Twilio for KDDI Web Communications")

・公式Facebook
[Twilio for KDDI Web Communications Facebook Page](https://www.facebook.com/TwilioforKWC "Twilio for KDDI Web Communications")
レイアウトファイルからパーツ取り込み

メモ

```html:レイアウトファイル
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<title>テンプレート</title>
	</head>
	<body>
		<header>
			<h1>テンプレート</h1>
		</header>
		<article>
			<section>
			</section>
		</article>
		<footer>
			<address>(C) @asahina_dev</address>
		</footer>
	</body>
</html>
```

```html:表示ページ
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<script src="lib/jquery-2.0.3.js"></script>
		<script src="lib/jquery-ui-1.10.3.custom.js"></script>
		<link rel="index" href="index.html">
		<link rel="stylesheet" href="lib/theme/blitzer/jquery-ui-1.10.3.custom.css" type="text/css"/>
		<title>タイトル</title>
		<script>
			$(document).ready(function(){
				$("footer").load("include/layout.html fotter > address");
			});
		</script>
	</head>
	<body>
		<header>
			<h1>タイトル</h1>
		</header>
		<article>
			<section>
			</section>
		</article>
		<footer>
			<!-- include -->
		</footer>
	</body>
</html>
```


```html:実行後
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<script src="lib/jquery-2.0.3.js"></script>
		<script src="lib/jquery-ui-1.10.3.custom.js"></script>
		<link rel="index" href="index.html">
		<link rel="stylesheet" href="lib/theme/blitzer/jquery-ui-1.10.3.custom.css" type="text/css"/>
		<title>タイトル</title>
		<script>
			$(document).ready(function(){
				$("footer").load("include/layout.html fotter > address");
			});
		</script>
	</head>
	<body>
		<header>
			<h1>タイトル</h1>
		</header>
		<article>
			<section>
			</section>
		</article>
		<footer>
			<address>(C) @asahina_dev</address>
		</footer>
	</body>
</html>
```
scikit-learnのParallelで並列処理

2019/1016 追記: Joblibのキャッシュ機能について書きました。
[[Python] Joblibのキャッシュを使って同じ計算を省略する](https://tma15.github.io/blog/2019/10/06/python-joblibのキャッシュを使って同じ計算を省略する/)

scikit-learnのチュートリアルといえば@Scaled_Wurmマンの紹介がとても分かりやすい。
今回はたまたまソースコードを読んでいて、かつその[ブログエントリ](http://sucrose.hatenablog.com/entry/2013/05/25/133021)では紹介さていなかったニッチなところをメモする。
結論としては特に理由が無いならmultiprocessingで書いている部分はParallelで置き換えても良さそう、ということ。

## Parallel
+ 並列処理をおこなうクラス
+ 基本的にはmultiprocessingで並列処理をおこなうんだけど、あったらいいな〜というヘルプ機能を提供してくれる。

## multiprocessingじゃダメなの？
Parallelは (原文はソースコード中のNotes)

+ 関数の引数をリストで作らなくもていいよ
+ debugが簡単だよ
    + コードを変更しなくてもn_jobs=1にしたら並列機能を無くせる
    + 子プロセスで吐いたエラーもtracebackしてくれる
+ 進捗度合いを見れるよ
+ 面倒なことしなくてもmultiprocessingのジョブを``Ctrl-C``で中止できるよ ([参考](http://stackoverflow.com/questions/1408356/keyboard-interrupts-with-pythons-multiprocessing-pool))
    
## 引数
+ n_jobs (int): 並列処理するcpuの数
+ verbose (int): 出力するメッセージの詳細さ。10以上ですべての反復でメッセージ出力。
+ pre_dispatch: 並列処理を開始する前に呼び出されるcpuの数

## 例

+ 例を見たほうが早い
+ delayedは並列処理をおこないたい関数のラッパーで、関数とその引数を返す。Parallelの__call__()が呼び出された時にそれらの関数が実行される。

### 簡単な例

```python
>>> from math import sqrt
>>> from sklearn.externals.joblib import Parallel, delayed
>>> Parallel(n_jobs=1)(delayed(sqrt)(i**2) for i in range(10))
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
```

### 進捗を見る例

```python
>>> from time import sleep
>>> from sklearn.externals.joblib import Parallel, delayed
>>> r = Parallel(n_jobs=2, verbose=5)(delayed(sleep)(.1) for _ in range(10)) #doctest: +SKIP
[Parallel(n_jobs=2)]: Done   1 out of  10 | elapsed:    0.1s remaining:    0.9s
[Parallel(n_jobs=2)]: Done   3 out of  10 | elapsed:    0.2s remaining:    0.5s
[Parallel(n_jobs=2)]: Done   6 out of  10 | elapsed:    0.3s remaining:    0.2s
[Parallel(n_jobs=2)]: Done   9 out of  10 | elapsed:    0.5s remaining:    0.1s
[Parallel(n_jobs=2)]: Done  10 out of  10 | elapsed:    0.5s finished
```

+ verboseに入れる値が大きいほどたくさんメッセージを出してくれる
+ ジョブの数、経過時間などを出力してくれる

### pre_dispatchを指定する
+ defaultは'all'
+ 一つのジョブが使うメモリが多かったら減らしたりして使う感じなのかな
+ 下の例では3 (1.5 * 2 jobs) つのジョブが並列処理をおこなう前に呼び出されている

```python
>>> from math import sqrt
>>> from sklearn.externals.joblib import Parallel, delayed

>>> def producer():
...     for i in range(6):
...         print('Produced %s' % i)
...         yield i

>>> out = Parallel(n_jobs=2, verbose=100, pre_dispatch='1.5*n_jobs')(
...                         delayed(sqrt)(i) for i in producer()) #doctest: +SKIP
Produced 0 ### 1つ目
Produced 1 ### 2つ目
Produced 2 ### 3つ目
[Parallel(n_jobs=2)]: Done   1 jobs       | elapsed:    0.0s
Produced 3
[Parallel(n_jobs=2)]: Done   2 jobs       | elapsed:    0.0s
Produced 4
[Parallel(n_jobs=2)]: Done   3 jobs       | elapsed:    0.0s
Produced 5
[Parallel(n_jobs=2)]: Done   4 jobs       | elapsed:    0.0s
[Parallel(n_jobs=2)]: Done   5 out of   6 | elapsed:    0.0s remaining:    0.0s
[Parallel(n_jobs=2)]: Done   6 out of   6 | elapsed:    0.0s finished
```
RubyのHashでPythonのdefaultdictみたいなことがやりたいとき


何かの共起頻度をカウントしたいとき、Pythonでは良くdefaultdictを使いますよね。

```python
import collections from defaultdict

d = defaultdict(lambda: defaultdict(int))
d['news']['Japan'] += 1
d['sport']['Tokyo'] += 1
d['sport']['Tokyo'] += 1
```

で、これと同じ事をRubyでやりたい時には、Hashの`default_proc`を使ってあげればよいです。

```ruby
h = Hash.new { |h, k| h[k] = Hash.new(0) }

h['news']['Japan'] += 1
h['sport']['Tokyo'] += 1
h['sport']['Tokyo'] += 1
p h # => {"news"=>{"Japan"=>1}, "sport"=>{"Tokyo"=>2}}
```

`default_proc`にHash以外にもArrayを使えば、新しく作ったkeyにどんどんvalueをpushしていくことができますよね。

```ruby
h = Hash.new { |h,k| h[k] = [] }
h[:a] << 1
h[:a] << 2
h[:b] << 1
p h # => {:a=>[1, 2], :b=>[1]}
```

当たり前っちゃ当たり前なのですが、知らないと調べようがないので昔ハマりました。
Intellijのimport from existing sourcesがつらかった話

Intellijには既存のソースからプロジェクトを作成する機能があります。
File -> Import Projectとか、gitからとってくる時などに使います。
こんな感じの画面です。
![Screen Shot 2013-09-14 at 18.31.38.png](https://qiita-image-store.s3.amazonaws.com/0/29484/5b6f09bd-7d3d-c964-fbea-8f7a60c7c369.png "Screen Shot 2013-09-14 at 18.31.38.png")

EclipseでもFlashBuilderでもGradleでもMavenでも無いときは、上の方を選択せざるを得ないですね。
例えばこれとかです。
https://github.com/twitter/Rowz.git

これをGitからとってくると、先ほどの画面を経てこんな感じのダイアログがでてきます。
![Screen Shot 2013-09-14 at 18.41.01.png](https://qiita-image-store.s3.amazonaws.com/0/29484/a88fdeb8-6602-0872-8029-6fae7570370a.png "Screen Shot 2013-09-14 at 18.41.01.png")

ディレクトリ内のソースを自動で検出してくれるのはいいのですが、それ以外のディレクトリが取り込めないのは困ります。
プロジェクトのビューもこんな感じです。
![Screen Shot 2013-09-14 at 18.59.23.png](https://qiita-image-store.s3.amazonaws.com/0/29484/584cdd55-b0fa-460a-3f9e-48439d51a58e.png "Screen Shot 2013-09-14 at 18.59.23.png")


丸ごと取り込みたかったのですが直接そうする機能がなさそうだったので次のようにしました。

- まず先ほどの設定で突き進みます。
- プロジェクトができたら`command + ;`でproject structureを開きます。
![Screen Shot 2013-09-14 at 18.47.18.png](https://qiita-image-store.s3.amazonaws.com/0/29484/a0db6f79-d45f-8ce9-c80f-95391221d8c6.png "Screen Shot 2013-09-14 at 18.47.18.png")
- mainかtestのどちらかを削除します。どちらでもいいです。
- 残った方を選択し、画面中程の水色のところからcontent rootを削除します。
- Add content rootから、落としてきたディレクトリを指定します。
- 名前もそのままだとあれなので適当に変更します。

するとこうなります。
![Screen Shot 2013-09-14 at 18.55.33.png](https://qiita-image-store.s3.amazonaws.com/0/29484/a441a4d1-36fd-8598-3ae1-debd49bcd382.png "Screen Shot 2013-09-14 at 18.55.33.png")

プロジェクトの方でも見えるようになっています。

こういうどうでもいいところではまるとつらい気持ちになりますが、これは正攻法でやる方法あるんでしょうか？
Pythonでprofilerを使う

たまに使うんだけど, すぐ使い方を忘れるので.

プログラム中やインタープリタ上でprofileをとる. some_commandって関数のprofileをとるならこう.

```py
import cProfile
cProfile.run('some_command()', 'spam.prf')
```

コマンドラインからprofileをとる. do.pyというファイルの実行のprofileをとるならこう.

```bash
$ python -m stats -o spam.prf do.py
```

それぞれのproifleはspam.prfに保存される.

プロファイル結果を表示する.

```bash
$ python -m pstats spam.prf
spam.prf% stats
```
Lisp in parallel : スレッド並列計算に lparallel

重い関数 `heavy-function` がありました。

``` cl
(defun heavy-function (n)
  (sleep n)
  (random n))
```

下を実行するととても時間がかかってしまいます・・・。

``` cl
(let ((a (heavy-function 100))
       (b (heavy-function 100)))
  (+ a b))
```

# plet

そこで登場、 `lparallel` (4コアあるマシンだと思ってください)

``` cl
(setf *kernel* (make-kernel 4))

(plet ((a (heavy-function 100))
       (b (heavy-function 100)))
  (+ a b))
```

`let` を `plet` にするだけであら不思議、ニスレッド並列で計算してくれます。

# pmap, preduce, pmap-reduce

こんな重い計算も

``` cl
(defvar vector (make-array 300))
(iter (for i below 300)
      (setf (aref vector i) (random 300)))

(reduce #'+ (map 'vector #'sin vector))
```

こうするだけで、計算時間は1/4に！

``` cl
(preduce #'+ (pmap 'vector #'sin vector))
```

こうするともっといい。

``` cl
(pmap-reduce #'sin #'+ vector))
```

詳しい評価は http://lparallel.org/benchmarks/ へ。

# ptree

makefile のような依存関係を一瞬で並列に解決。

``` cl
(ptree ((area   (width height) (* width height))
        (width  (border)       (+ 7 (* 2 border)))
        (height (border)       (+ 5 (* 2 border)))
        (border ()             1))
  area)

; => 63
```

# ホスト間通信

`lfarm` で、同じAPIのままホスト間通信。 https://github.com/lmj/lfarm/blob/master/README.md


書き捨て御免!
jsonを取得、表示するアプリケーション　その３

HTTPメソッドを指定するコンボボックスを追加してPOSTメソッドに対応する
あと、設定していなかったタイトルを設定

```groovy:json_client.groovy
import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.*

def cbMethod
def txtUrl
def txtJson

def sendRequest = {
	def conn = txtUrl.text.toURL().openConnection()
	conn.requestMethod = cbMethod.selectedItem
	
	txtJson.text = conn.inputStream.text
}

new SwingBuilder().frame(title:'jsonを取得、表示するアプリケーション', defaultCloseOperation:JFrame.EXIT_ON_CLOSE,
						size: [800, 600], show:true) {
	lookAndFeel('nimbus')
	borderLayout()
	hbox(constraints: BorderLayout.NORTH) {
		cbMethod = comboBox(items:['GET', 'POST'])
		txtUrl = textField()
		button(text:'送信', actionPerformed:sendRequest)
	}
	scrollPane(constraints: BorderLayout.CENTER) {
		txtJson = textArea(editable:false)
	}
}
```

![qiita-003.png](https://qiita-image-store.s3.amazonaws.com/0/17179/4a8fb32c-295f-f59b-db05-331041bac8dd.png)
Ruby でライフゲーム

* [50行で作る、HTML5+JavaScriptな簡単ライフゲーム](http://ottati.hatenablog.com/entry/2013/09/14/105014)

これを見て作りたくなったからつくった。
あれれ、130行になったぞ……　まあ、使っていないコードもあるのと、割と丁寧に書いてはいる気がするのでこんなもんで……

```ruby:life.rb
require 'singleton'

FPS = 30.0 # 60.0
SIZE = 75

def mainloop
  loop do
    update
    sleep 1.000 / FPS
  end
end

def clear
  puts "\e[H\e[2J"
end

def update
  field = Field.instance
  field.each do |cell|
    count = cell.around_self.map{|x, y| field.get(x, y) }.count(&:alive?)
    new_cell = case
               when (2..3).cover?(count) && cell.alive?
                 cell.to_alive
               when count == 3           && cell.dead?
                 cell.to_alive
               else
                 cell.to_dead
               end
    field.set(new_cell)
  end
  field.commit
  clear
  puts field.to_s
end

class Field
  include Enumerable
  include Singleton

  def initialize
    @field = 
      get_mock_field.map.with_index do |row, y|
        row.map.with_index{|_, x| Cell.gen(x, y) }
      end
    clear_tmp_field
  end
  attr_reader :field, :tmp_field

  def to_s
    each_row.map do |row|
      row.map(&:to_s).join(" ")
    end.join("\n")
  end

  def get(x, y)
    return nil if x < 0 or x > SIZE or y < 0 or y > SIZE
    field[y][x]
  end

  def set(cell)
    tmp_field[cell.y][cell.x] = cell
  end

  def commit
    @field = tmp_field
    clear_tmp_field
  end

  def each
    return to_enum unless block_given?
    @field.flatten.each do |cell|
      yield cell
    end
  end

  def each_row
    return enum_for(:each_row) unless block_given?
    @field.each do |row|
      yield row
    end
  end

  private
  def clear_tmp_field
    @tmp_field = get_mock_field
  end

  def get_mock_field
    ([[nil] * SIZE] * SIZE).map{|r| r.clone } # change pointer
  end
end

class Cell < Struct.new(:cont, :x, :y)
  def self.gen(x, y)
    new [true, false].sample, x, y
  end

  def to_s
    cont ? "@" : "_"
  end

  alias alive? cont
  def dead?; !alive? end

  def to_toggled
    Cell.new(!cont, x, y)
  end

  def to_alive
    Cell.new(true, x, y)
  end

  def to_dead
    Cell.new(false, x, y)
  end

  def around_self
    return enum_for(:around_self) unless block_given?
    x_min = [0       , x - 1].max
    x_max = [SIZE - 1, x + 1].min
    y_min = [0       , y - 1].max
    y_max = [SIZE - 1, y + 1].min
    [*x_min..x_max].product([*y_min..y_max]).each do |_x, _y|
      next if x == _x and y == _y
      yield _x, _y
    end
  end
end

mainloop
```

![スクリーンショット 2013-09-14 18.11.30.png](https://qiita-image-store.s3.amazonaws.com/0/569/0c1ea662-511c-6053-c3f8-5c90763017cf.png)
シンプルだけどIP変更チェック付きのValue DomainのDDNSアップデートスクリプト


シェルスクリプトじゃなかったり、複数ホスト対応などの不要な機能があるものが多かったので、自分で作っちゃいました。

https://gist.github.com/ypresto/6559955

## インストール

とりあえず落として、設定ファイルを書きます。

```sh
wget 'https://gist.github.com/ypresto/6559955/raw/	d6386d44483a291a2899e935c7c6b440c7e8716d/update-ddns'
chmod +x ./update-ddns

wget 'https://gist.github.com/ypresto/6559955/raw/8135fba20f0ea9d23165c553b177156246f73dfb/update-ddns.conf'
chmod 600 ./update-ddns.conf
```

お好きなエディタで./update-ddns.confを編集してください。
下記の内容を記述します。

- DOMAIN=：契約しているドメイン名（hogefuga.com）
- PASSWORD=：Value Domainで設定したDDNS専用パスワード
- HOST=：アップデートしたいホスト名（www2）

最後に下記を実行してインストールします。

```sh
sudo chown root:root ./update-ddns ./update-ddns.conf
sudo mv ./update-ddns.conf /etc/
sudo mv ./update-ddns /etc/cron.hourly/
```

1時間ごとに実行されますが、IPが変更されていた時のみ更新するので、負荷は最小限に留められます。

Happy DDNS hacking!
改めて、Androidの開発環境をセットアップしたのでメモ。

改めて、Androidの開発環境をセットアップしたのでメモします。
今回の環境は、Windows8 64bit　です。

# JDKのインストール
Android SDKをインストールする前に、
JDK(Java Development Kit)をインストールする必要があります。
ここでインストールするバージョンは、「7u25」です。

1. http://www.oracle.com/technetwork/java/javase/downloads/index.html にアクセスします。

1. Java Platform(JDK) 7u25 のDOWNLOADアイコンをクリックします。
![1_1.png](https://qiita-image-store.s3.amazonaws.com/0/22465/2266fb07-1f03-0917-db7b-442d5539adf6.png)


1. ライセンスを読み、『Accept License Agreement』ラジオボタンをクリックして、使用OSに合わせて、ダウンロードするファイルをクリックしてダウンロード開始します。
Windows8 64bitであれば jdk-7u25-windows-x64.exe を選択します。
![2_1.png](https://qiita-image-store.s3.amazonaws.com/0/22465/d4f9a23f-0d20-7d3a-8855-f486a5d0a7f2.png)

1. ダウンロードしたインストーラの指示に従ってインストールします。
特にこだわりが無ければ途中の設定はすべてデフォルトで問題ありません。

1. 環境変数JAVA_HOMEをインストールしたフォルダに設定します。
変数[JAVA_HOME] 値[C:\Program Files\Java\jdk1.7.0_25;]
![3.png](https://qiita-image-store.s3.amazonaws.com/0/22465/497ae5c4-3698-6599-8957-6f86a594fb10.png)

# Android SDK及びEclipseのインストール
Android SDKの「r21」版から、開発環境構築に必要なものがひとまとめになったパッケージをダウンロードできるようになりました。
別途ADT Pluginをインストールする必要がないので、便利です。

1. http://developer.android.com/sdk/index.html にアクセスします。
![4_1.png](https://qiita-image-store.s3.amazonaws.com/0/22465/dd94e0b5-667b-1f87-a988-56a6075589ab.png)

1. DOWNLOAD THE SDK をクリックして展開後、規約に同意し、 64-bit を選択。
『Download the SDK ADT Bundle for Windows』をクリックしてダウンロードします。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/22465/211f5055-f355-40bc-2bbf-b19d88c9db7a.png)

1. ダウンロードしたファイルを適当な場所で解凍します。
今回はDドライブ直下（D:\）に配置しました。
※Eclipseに非常に長いフォルダー名が含まれているため、解凍アプリケーションによっては、解凍に失敗するケースがあります。なるべく浅い階層の場所にzipファイルを置いて解凍したしましょう。

# Eclipseの日本語化
Eclipseのメニューなどを日本語化するため、Pleiadesプラグインを導入します。

1. http://mergedoc.sourceforge.jp/ にアクセスします。

1.  Pleiades プラグインの最新版をダウンロードします。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/22465/0d60624c-5417-7236-495d-94aa3e25f6f2.png)

1. ダウンロードしたpleiades.zipを解凍します。
※なお、このzipファイルは格納ファイルを1つのフォルダーにまとめた形になっていないので、作業用フォルダー（例えばpleiadesというフォルダー）を作ってそこにzipファイルを移動し、そこで解凍するようにしましょう。

1. 解凍してできたfeaturesとpluginsのフォルダを、Android SDKを展開したフォルダーのすぐ下にあるeclipseフォルダーの中に移動します。
eclipseフォルダーにはすでにこの2つのフォルダが存在するので、確認メッセージが表示されますが、置き換えを選択します。 

1. eclipseフォルダーの中にあるeclipse.iniファイルを編集します。
解凍したreadmeフォルダの下にあるreadme_pleiades.txtの中に説明があります。
必要なのは、eclipse.iniの末尾に

```
-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar=default.splash
```

# Eclipseを起動する

1. eclipse.exeのアイコンをダブルクリックして、起動します。

1. ワークスペースを選択します。

1. エンコードの設定をします。
［ウインドウ］⇒「設定」のリストから「一般」を選択し、その下にある「ワークスペース」を選びます。
ここで、「テキスト・ファイルのエンコード」を「デフォルト」から「その他」に変更し、リストから「UTF-8」を選択します。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/22465/e404b089-26de-2da2-71e7-24398b20fcfe.png)

以上です。
Backbone.Viewでやりがちなミス


positionやoffsetを取得するときに上手く動作しないことがあります。
大抵はthis.$elがまだhtml本文に挿入されていないというものです。

わかっていても定期的にやってしまいます。

```ts:うっかり
class View extends Backbone.View{
	
	constructor(options?){
		super(options);
		//この位置ではだめ
		this.render();
		$('body').append(this.$el);
	}
	render(){
		//this.$elが挿入前だと取得したい値が正しくとれない
		var position = this.$el.position();
		return this;
	}
}
ChefSpecのcookbook_pathを一括指定する

ChefSpecを使うときに地味に面倒なのが、複数のcookbook_pathがあるときのその指定。`ChefRunner.new`するときに指定できますが、これだとspecファイル毎に指定なのでとっても面倒。

実際に実行するのはrakeからという方も多いと思うので、rakeから実行するspecファイル全部にcookbook_path指定をする方法。

## はじめに
ここでは`cookbooks`、`site-cookbooks`の2つのディレクトリにcookbookが分かれて保存されており、`rake rspec`で実行できる状態になっているものとします。テスト対象は`site-cookbooks`のみ。

```ruby:Rakefile_org
require "rspec/core/rake_task"

TOPDIR=File.expand_path(File.dirname(__FILE__))

desc "execute all chefspec test"
task :rspec do
  RSpec::Core::RakeTask.new(:rspec) do |t|
    t.pattern = 'site-cookbooks/*/spec/*_spec.rb'
    t.rspec_opts = ['-c']
  end
end
```


## spec_helperの作成
Rubyの場合、オープンクラスという機能を使って、gemで配られているライブラリのコードを書き換える事ができます。`ChefSpec::ChefRunner`では`vendor/cookbooks`,`test/cookbooks`, `spec/cookbooks`の3つは存在すれば追加してくれるようですが、今回のケースみたいに特定のサイトで使うChef全部のリポジトリを想定したものではないので当てはまりません。

なので、この3つのパスを追加している部分をオープンクラスで書き換えてしまいます。

```ruby:spec_helper.rb
require 'chefspec/chef_runner'

TOPDIR=File.expand_path(File.dirname(__FILE__))

module ChefSpec
  class ChefRunner
    remove_method :cookbook_paths
    def cookbook_paths
      ["#{TOPDIR}/cookbooks", "#{TOPDIR}/site-cookbooks"]
    end
  end
end
```

ここでは元あった`cookbook_paths`の定義を削除して、都合のいい`cookbook_paths`に差し替えています。


## Rakefileの修正
先ほどのspec_helperを有効にするには、ChefSpec実行前にこのコードが読み込まれている必要があります。なので、ChefSpec(RSpec)実行時にこのファイルを必ず読み込むように、以下のようにRakefileを修正します。

```ruby:Rakefile_new
require "rspec/core/rake_task"

TOPDIR=File.expand_path(File.dirname(__FILE__))

desc "execute all chefspec test"
task :rspec do
  RSpec::Core::RakeTask.new(:rspec) do |t|
    t.pattern = 'site-cookbooks/*/spec/*_spec.rb'
    t.rspec_opts = ['-c']
    t.ruby_opts = ["-r", "#{TOPDIR}/spec_helper.rb"]
  end
end
```

追加したのは`t.ruby_opts = ["-r", "#{TOPDIR}/spec_helper.rb"]`です。これによってChefSpecを実行する際は必ずspec_helper.rbを読んでから実行するようになります。

## 補足
上記を組み込んだ場合は「cookbook_pathのデフォルト値がspec_helperで指定したものになる」だけなので、`ChefRunner.new(:cookbook_path => paths)`として渡した場合はそちらが優先されます。また、これはcookbook_path以外にも応用可能なので、それでコードの重複を減らすこともできます。
Emacsで現在開いてるバッファを再読込する

Compassを使いはじめたけど、まだ慣れてないので実際にどんなcssが出力されるかを確認しながら使っているとEmacsで開いてるバッファの再読み込みをブラウザの「更新」みたいにやりたくなったので設定方法を調べてみました。

## 設定方法

まず revert-buffer だと確認をしないといけないので、確認の必要のない関数を定義。
ファイルの変更が保存されてない場合はエラー。それでも必ず再読込したい場合は「参考」を見てください。

```el:~/.emacs.d/inits/00-common-func.el
(defun revert-buffer-no-confirm (&optional force-reverting)
  "Interactive call to revert-buffer. Ignoring the auto-save
 file and not requesting for confirmation. When the current buffer
 is modified, the command refuses to revert it, unless you specify
 the optional argument: force-reverting to true."
  (interactive "P")
  ;;(message "force-reverting value is %s" force-reverting)
  (if (or force-reverting (not (buffer-modified-p)))
      (revert-buffer :ignore-auto :noconfirm)
    (error "The buffer has been modified")))
```

MacではCommand+Rで、UbuntuではF5で更新

```el:~/.emacs.d/inits/cocoa-emacs-keybinds.el
;; reload buffer
(global-set-key "\M-r" 'revert-buffer-no-confirm)
```

```el:~/.emacs.d/inits/linux-keybinds.el
;; reload buffer
(global-set-key (kbd "<f5>") 'revert-buffer-no-confirm)
```

いつものこのファンクションキーを割り当てる方法を忘れるのどうにかしたい。

## 参考
EmacsWiki: Revert Buffer
http://www.emacswiki.org/emacs/RevertBuffer
WindowsのSublime Text 2 でVintageを使いやすくしたい

INSERT MODEの時に日本語入力のままCOMMAND MODEになるのは非常に使いにくいのでプラグインを書いてみたよ。

Windows環境以外の方はググれば他の方が書いた物が見つかるはず。

```python:exit_insert_mode_jp.py
import sublime, sublime_plugin
import ctypes
class ExitInsertModeJpCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        try:
            hwnd = ctypes.windll.user32.GetActiveWindow()
            himc = ctypes.windll.imm32.ImmGetContext(hwnd)
            try:
                ctypes.windll.imm32.ImmSetOpenStatus(himc, 0)
            finally:
                ctypes.windll.imm32.ImmReleaseContext(hwnd, himc)
        finally:
            self.view.run_command("exit_insert_mode")
```

<h5>使い方</h5>

上のプラグインを%USERPROFILE%\AppData\Roaming\Sublime Text 2\Packages\Userあたりに突っ込んで

Preferences→Key Bindings - Userに以下のコードを追加

```js
    { "keys": ["escape"], "command": "exit_insert_mode_jp",
        "context":
        [
            { "key": "setting.command_mode", "operand": false },
            { "key": "setting.is_widget", "operand": false }
        ]
    }
```
Shimの意味

rbenvには shims というフォルダがあって、本体を上手いこと実行するためのシェルスクリプトが入ってるんだけど、この `shims` って名前はどういう意味なのかわからず困ってた。

いや、別に意味がわからなくても困らないけど、何となくスッキリしなくて気持ち悪い。なので調べてみました。

## 辞書に載ってる意味

英辞郎によると

《名》詰め木
《他動》～に詰め木を入れる
《動》詰め木を入れて水平にする

とのことですが、詰め木？ よくわからん。

”Shim とは”で検索しても木材についての話とか「SIMフリーの携帯とは？」とか出てくる。違うお前じゃない。

## コンピュータ用語としてのShimの意味

Wikipediaには書いていました。 ただし英語版のみ。

>In computer programming, a shim (from shim) or shiv is a small library that transparently intercepts an API and changes the parameters passed, handles the operation itself, or redirects the operation elsewhere. Shims typically come about when the behavior of an API changes, thereby causing compatibility issues for older applications which still rely on the older functionality. In such cases, the older API can still be supported by a thin compatibility layer on top of the newer code. Web polyfills are a related concept. Shims can also be used for running programs on different software platforms than they were developed for.

テキトーな意訳：プログラムのバージョン間の差異を埋める緩衝材のように使う薄いレイヤーみたいなものがShimです。

あー、なるほど。それで詰め木。それなー。

## 参考

Shim (computing) - Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/Shim_(computing)
【日本初?】CarrierWaveでアップロードされた画像の横幅などをValidateする方法

弊社ブログ記事からの転載です
[CarrierWaveでアップロードされた画像の横幅などをValidateする方法](http://lab.heathrow.co.jp/2013/09/14/287) @ [heathrow.lab](http://lab.heathrow.co.jp)

最近CarriweWaveのことばかり書いてる気もしますが、気にせず今回もCarrierWaveです。

例えば横幅100px未満の画像がアップロードされた場合、エラーにしたいってことありますよね。
CarrierWaveにデフォルトでそういうValidatorが提供されていればいいんですが、そうでもないのが悩ましい。

では、どういった方法でやればいいのか。
日本語情報がなかったようのなので、弊社で行っている方法を共有してみます。
\# Rmagick使います

## 下準備
1.画像の横幅縦幅を取得するためCarrierWave::RMagickを拡張
2.画像の横幅縦幅を検証するValidatorクラスを作成

まず、CarrierWave::RMagicを拡張します。
このset_dimensionという関数で
アップロードされた画像をRmagickで読み込んで、横幅縦幅を@dimension保存させます。

```rb:config/initializers/carrierwave.rb
module CarrierWave
  module RMagick
    attr_reader :dimension

    def set_dimension
      image = Magick::Image.read(current_path).shift
      @dimension = { width: image.columns, height: image.rows }
    end
  end
end
```

次に、Validatorの作成です。
先ほどの#set_dimensionで保存した横幅縦幅を検証します。

```rb:app/validators/image_size_validator.rb
class ImageSizeValidator < ActiveModel::EachValidator
  OPTIONS = {
    width: {
      field:    :width,
      function: :'==',
      message:  'invalid_image_width'
    },
    max_width: {
      field:    :width,
      function: :'<=',
      message:  'invalid_image_max_width'
    },
    min_width: {
      field:    :width,
      function: :'>=',
      message:  'invalid_image_min_width'
    },
    height: {
      field:    :height,
      function: :'==',
      message:  'invalid_image_height'
    },
    max_height: {
      field:    :height,
      function: :'<=',
      message:  'invalid_image_max_height'
    },
    min_height: {
      field:    :height,
      function: :'>=',
      message:  'invalid_image_min_height'
    }
  }.freeze

  def validate_each(object, attribute, value)
    return if value.nil? || value.dimension.nil?

    dimension = value.dimension
    options.each do |key, val|
      next unless OPTIONS.key? key
      check = OPTIONS[key]
      unless dimension[check[:field]].send check[:function], val
        object.errors[attribute] << (options[:message] || I18n.t("activerecord.errors.messages.#{check[:message]%[val]}"))
      end
    end
  end
end
```

## 使い方
Uploaderに対して#set_dimensionを登録してやります。

```rb:app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::RMagick

  process :set_dimension
end
```

Modelでこんな風にかけます

```rb:app/models/photo.rb
class Photo < ActiveRecord::Base
  mount_uploader :image1, ImageUploader
  mount_uploader :image2, ImageUploader

  # 横幅640px、縦幅920pxでなければならない
  validates :image1, presence: true, image_size: { width: 640, height: 920 }

  # 横幅が100px以上でなければならない
  validates :image2, presence: true, image_size: { min_width: 100 }
end
```

***
弊社ブログ記事からの転載です
[CarrierWaveでアップロードされた画像の横幅などをValidateする方法](http://lab.heathrow.co.jp/2013/09/14/287) @ [heathrow.lab](http://lab.heathrow.co.jp)
jsonを取得、表示するアプリケーション　その２

入力されたテキストをURLに変換してGETメソッドでデータを取得する
あとなんとなくLook&FeelをNimbusにする

この段階ではPOSTメソッドでデータを取得することはできない

```groovy:json_client.groovy
import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.*

def txtUrl
def txtJson

new SwingBuilder().frame(title:'', defaultCloseOperation:JFrame.EXIT_ON_CLOSE, size: [800, 600], show:true) {
	lookAndFeel('nimbus')
	borderLayout()
	hbox(constraints: BorderLayout.NORTH) {
		txtUrl = textField()
		button(text:'送信', actionPerformed:{txtJson.text = txtUrl.text.toURL().text })
	}
	scrollPane(constraints: BorderLayout.CENTER) {
		txtJson = textArea(editable:false)
	}
}
```

![qiita-002.png](https://qiita-image-store.s3.amazonaws.com/0/17179/1dc84f2c-8e4d-a3a8-57e9-6367f9b4a92e.png)
標準入力で受け取ったりとかコマンドライン操作からGmailの送信

[http://blog.livedoor.jp/vine_user/archives/51575120.html](http://blog.livedoor.jp/vine_user/archives/51575120.html)
全面的に上記サイト様よりいただいております。

```python:mail.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

user = 'example@gmail.com'
pswd = 'password'
print '送信先を入力して下さい。enterキーで確定になります。'
to_addr = raw_input()
print '件名を入れて下さい。enterキーは件名確定になります。'
title = raw_input()
print '本文を入れて下さい。enterキーは本文確定で送信になります。'
body = raw_input()


def create_message(user, to_addr, subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = user
    msg['To'] = to_addr
    msg['Date'] = formatdate()
    return msg


def send_via_gmail(user, to_addr, msg):
    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login(user, pswd)
    s.sendmail(user, [to_addr], msg.as_string())
    s.close()

if __name__ == '__main__':
    msg = create_message(user, to_addr, title, body)
    send_via_gmail(user, to_addr, msg)
```

今回はコマンドラインから受け取る風にですが、何か他の事をキッカケとして本文など渡せばメール送信用スクリプトとして使い回しが効く、、といいなぁと。。
文字コードで事故など怖いですが検証しておりませぬ。
私が想定した使用方法ならログインしてるアカウントままFromで差支えがなかったな、と。
普段と違うgmailの送信方法、ログイン方法なので初回は必ず失敗するので
[http://qiita.com/hilotter/items/ffa5a7d14f6d50c81dfa](http://qiita.com/hilotter/items/ffa5a7d14f6d50c81dfa)
上記様をご参考にすすめてくださいませ。



別記事で書いてたら流石にどうでも良すぎて心が折れたので追記という形で、、、、
特定に人にフォローされたら友人に自慢するメールを送るというものであります。
フォローされたらというのは一例としているだけですので、TLを読み込んで特定の単語を含む発言が合ったとか、リプライされたときに自分宛にメールを送るとかも出来ますが公式でそういう機能がありますよね。

```python:mayu.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate
import tweepy
import oat
##↑は私的にtwitterのOAuthトークンを別に置いているものです。
##gmailのパスなども別保管したり平文でない方法にしなければですが、、、

user = 'example@gmail.com'
pswd = 'password'
to_addr = '友人のメールアドレス'
title = '件名'
body = '本文'


def create_message(user, to_addr, subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = user
    msg['To'] = to_addr
    msg['Date'] = formatdate()
    return msg


def send_via_gmail(user, to_addr, msg):
    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login(user, pswd)
    s.sendmail(user, [to_addr], msg.as_string())
    s.close()

if __name__ == '__main__':
#今回ではフォロアー数5000までの_ids取得なので、実行の前後が5000未満である必要があります。
#例のuser_idsの611447337はtwitterの発言が度々とある超巨大掲示板で話題になる希美まゆさんです。
    chk = oat.api.followers_ids(twi)
    if 611447337 in chk:
        msg = create_message(user, to_addr, title, body)
        send_via_gmail(user, to_addr, msg)
    else:
        pass
```
How to install rails3 on ubuntu

[Ubuntu ソフトウェアセンター]で「rails」を指定すると、下図のようになりますが…。
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/28376/c5fd1b72-6d06-07e0-de1b-22bc7566b0cc.png)
これは rails2 です。

rails3 をインストールするには「rails3」を指定しなければなりません。
![screenshot1.png](https://qiita-image-store.s3.amazonaws.com/0/28376/2fa9bff8-4731-8ed7-f7aa-188e35f66250.png)
「第13回オフラインリアルタイムどう書くの問題」をPHPで解く

http://qiita.com/Nabetani/items/936e7885f4c607472060
http://nabetani.sakura.ne.jp/hena/ord13blocktup/

積み木の水槽に、水をどれだけ貯められるかを計算します。

```php
<?php
	class BLOCKTUP{
		
		/**
		* 貯められる水容量を返す
		* @param  String 「83141310145169154671122」みたいな文字列
		* @return int 「24」みたいな数値
		*/
		public function get($input){
			$count = 0;
			
			// 0で分割
			$input = explode('0', $input);
			
			// くるくる
			foreach($input as $key=>$block){
				// 幅が2以下であれば0
				if(strlen($block) < 3){continue;}
				// 2文字目から最後-1文字目までをくるくる
				$arr = str_split($block);
				for($i=1; $i<count($arr)-1; $i++){
					// ( 左MAXと右MAXの低い方 - 自分 ) > 0であればそのぶん足す
					$bucket = min(max(array_slice($arr, 0, $i, true)), max(array_slice($arr, $i+1, NULL, true))) - $arr[$i];
					if($bucket > 0){
						$count += $bucket;
					}
				}
			}
			return $count;
		}
		
	}
	
	// テスト
	$test = [
		['83141310145169154671122', '24'],
		['923111128', '45'],
		['923101128', '1'],
		['903111128', '9'],
		['3', '0'],
		['31', '0'],
		['412', '1'],
		['3124', '3'],
		['11111', '0'],
		['222111', '0'],
		['335544', '0'],
		['1223455321', '0'],
		['000', '0'],
		['000100020003121', '1'],
		['1213141516171819181716151413121', '56'],
		['712131415161718191817161514131216', '117'],
		['712131405161718191817161514031216', '64'],
		['03205301204342100', '1'],
		['0912830485711120342', '18'],
		['1113241120998943327631001', '20'],
		['7688167781598943035023813337019904732', '41'],
		['2032075902729233234129146823006063388', '79'],
		['8323636570846582397534533', '44'],
		['2142555257761672319599209190604843', '41'],
		['06424633785085474133925235', '51'],
		['503144400846933212134', '21'],
		['1204706243676306476295999864', '21'],
		['050527640248767717738306306596466224', '29'],
		['5926294098216193922825', '65'],
		['655589141599534035', '29'],
		['7411279689677738', '34'],
		['268131111165754619136819109839402', '102'],
	];

	$blocktup = new BLOCKTUP();
	foreach($test as $key=>$data){
		$answer = $blocktup->get($data[0]);
		if($answer !== (int)$data[1]){
			print('えらー');
		}
	}
```

なんか見た感じ難しそうだなあと思ってたのですが、実際に作ってみたら予想外に一瞬で終わった。
かかった時間は30分くらい。

考え方は単純です。
「83141310145169154671122」を例に挙げてみると、まず0で分けて「8314131」「145169154671122」にします。
「8314131」を2文字目の「3」で見ると、左側にある壁の最大値は8、右側にある壁の最大値は4、よって左右両方の最大値は4です。
自分の高さは3なので、1升ぶんだけ水が貯まります。
同じく3文字目の「1」は、左の最大値は8、右の最大値は4、自分は1なので3貯まります。
4文字目の「4」は、左の最大値は8、右の最大値は3、自分は4なので貯まりません。
というのを列ごとにくるくるしていくだけです。
C# MP3タグをいじるライブラリ

# メモ #

[C# ID3 Library](http://sourceforge.jp/projects/sfnet_csid3lib/)
[Taglib-Sharp](https://github.com/mono/taglib-sharp)


[ID3.NET MP3 Tagging Library](http://id3dotnet.sourceforge.net/)
[C# ID3 Library](http://csid3lib.sourceforge.net/)


mono の Taglib-Sharp がいいのかなぁ

NuGet を使えば、Taglib-Sharp の管理が楽にできるので、 Taglib-Sharp でイイかな
[NuGet Gallery](http://www.nuget.org/packages/taglib/)
最近のVisual Studio だと NuGet 標準搭載なので便利（2008には無かったが、2012にはあった。）
jqGridの過去バージョン取得方法メモ

特に詳しく調べてないから、簡単な方法があるかも。。。

[公式のダウンロードページ](http://www.trirand.com/blog/?page_id=6) だと過去のバージョンは一部しか用意されていないので、[GitHubのページ](https://github.com/tonytomov/jqGrid/tree/master) からプロジェクトをダウンロードして、ビルドする方法をメモする。

#必要なもの
##Java + Ant
ビルドに Ant が必要。

##Closure Compiler（compiler.jar）
Google が提供してる JavaScript コードの圧縮用ツール。

[ここ](https://developers.google.com/closure/compiler/?hl=ja&csw=1) からダウンロードできる。
（「How do I start?」と書かれているところの「Download the application.」というリンクをクリック：2013/09/13 現在）

#手順
##プロジェクトを入手する
[GitHubのページ](https://github.com/tonytomov/jqGrid/tree/master) から欲しいバージョンを取得（Git で落としてきてもいいし、zip を落としてもいいし好きな方法で）

##Closure Compiler の jar ファイルを配置する
Closure Compiler の jar（compiler.jar）を、プロジェクトのルートに配置する。

![compiler.jarを配置した様子](https://qiita-image-store.s3.amazonaws.com/0/28302/977baf01-69c0-358e-099c-0fb13d17be41.jpeg)

##ant を実行する
コマンドラインからプロジェクトのルートに移動して、 ant を実行する。

```batch:ant実行
>cd D:\tmp\jqGrid-4.3.2

>ant
```

ant タスクが終了すると、 `dist` というフォルダの下にマージされたソース（`jquery.jqGrid.js`）と min 化されたソース（`jquery.jqGrid.min.js`）が出力されてる。

##要らない機能を除く
多分 build.xml の以下の `fileset` タグを削除するなりコメントアウトするなりすれば、不要な機能を任意に外すことができると思う。

```xml:build.xml
<target name="jqgrid" depends="init">
  <concat destfile="${distdir}/${target}">
    <fileset file="js/grid.base.js"/>
    <fileset file="js/grid.custom.js"/>
    <fileset file="js/jqModal.js"/>
    <fileset file="js/jqDnR.js"/>
    <fileset file="js/JsonXml.js"/>
    <fileset file="js/jquery.fmatter.js"/>
    <fileset file="js/grid.common.js"/>
    <fileset file="js/grid.filter.js"/>
    <fileset file="js/grid.formedit.js"/>
    <fileset file="js/grid.inlinedit.js"/>
    <fileset file="js/grid.celledit.js"/>
    <fileset file="js/grid.subgrid.js"/>
    <fileset file="js/grid.treegrid.js"/>
    <fileset file="js/grid.grouping.js"/>
    <fileset file="js/grid.import.js"/>
    <fileset file="js/grid.jqueryui.js"/>
    <fileset file="js/grid.tbltogrid.js"/>
  </concat>
</target>
```
cron関連ファイルをgitで管理したい


##概要
/var/spool/cronの中のファイルをgitで管理するには。

##前提：'/etc/crontab' と 'crontab -e' の違い

**/etc/crontab**
→os用cron。一般ユーザが編集するのはあまり好ましくない。

**crontab -e**
→/var/spool/cron 配下が編集される。
基本はこちらを触るのが作法。

よって、git管理していない場合、触るのは後者になる。

##git管理する

git配下の#{release_path}/cron/hogeを、実際のcronファイルである
/var/spool/cronにコピーする。


#####capistrano recipe：

```sample.rb
namespace :www_hoge_com do
  desc "install crontab"
    task :cron_install, :roles => :app do
      sudo "/usr/bin/crontab -u hoge #{release_path}/cron/hoge"
  end
  after "deploy:create_symlink", "www_hoge_com:cron_install"
end
```

※「/usr/bin/crontab」は実行可能ファイル。
このコマンドは、/var/spool/cron/配下のファイルを参照する。

##参考
http://blog.mizoshiri.com/archives/215
https://users.miraclelinux.com/technet/document/linux/training/2_3_5.html
curl_multi_select() > 0なら無事通信が終わったら報告してくれる・・・とは限らない！

[curl_multiでHTTP並列リクエストを行うサンプル](http://qiita.com/Hiraku/items/1c67b51040246efb4254 "curl_multiでHTTP並列リクエストを行うサンプル")
に助けられながらcurl_multi_*と楽しくダンスしていたのだが、ちょっとお洒落な事をしようとしたら上手くいかない！

##やりたかった事
curl_multi_selectって待ってくれるんでしょ？んじゃループで回さないで、$this->mhにcurl_multiハンドラ持たせておいて、

```php:curl_benriクラス
class curl_benri {
	function startMultiRequest(){
		$this->mh = curl_multi_init();
		curl_multi_add_handle($this->mh, $ch1);
		curl_multi_add_handle($this->mh, $ch2);
		curl_multi_add_handle($this->mh, $ch3);
		curl_multi_add_handle($this->mh, $ch4);
		// アクセスの実行
		do{
			$stat = curl_multi_exec($this->mh, $this->still_running);
		}while($stat === CURLM_CALL_MULTI_PERFORM);
	}

	function getContents(){
		curl_multi_select($this->mh, $timeout);
		do{
			$stat = curl_multi_exec($this->mh, $still_running);
		}while($stat === CURLM_CALL_MULTI_PERFORM);
		$info = curl_multi_info_read($mh, $remains);
		return curl_multi_getcontent($info["handle"]);
	}
}
```

って用意したら

```php:使うがわ
$curl_benri = new curl_benri();
$curl_benri->startMultiRequest();
while($content = $curl_benri->getContents()){
	// ここで$contentをほにゃらら
}
```

で楽に処理出来るかと思ってた。
ところがどっこい、これだと$infoに容易くfalseが入って上手く動かない。というかcurl_multi_selectが0.02秒くらいで戻ってくる！なんで！？お前待ってるって言ったよね！！？

##何が起こったか
curl_multi_selectは確かに待ってくれる献身的な奴だった。だがしかし、奴が待つのはHTTPのレスポンスではない。あくまでもアクティビティ、イベントなのだ！
###CURLOPT_VERBOSEしてみました
```bash
> GET /honyarara.html HTTP/1.1
Host: example.com
Accept: */*

$
```

・・・GETはしてるけどレスポンス待たないで終わった。

そう、つまりcurl_multi_selectはちゃんと待っていた。そして僕らに教えてくれたのだ。
**「GET投げ終わったよ！褒めて褒めて！」**

##どうしたか
```php:curl_benriクラス
class curl_benri {
	// 〜省略〜
	function getContents(){
		do if($this->remains > 0 || curl_multi_select($this->mh, $timeout) != -1){
			do{
				$stat = curl_multi_exec($this->mh, $still_running);
			}while($stat === CURLM_CALL_MULTI_PERFORM);
			$info = curl_multi_info_read($mh, $this->remains);
			if($info === false) continue;
			return curl_multi_getcontent($info["handle"]);
		}while($still_running);
	}
}
```

selectをループでぶん回した。
selectを抜けてもcurl_multi_info_readがfalseを返す事が多いので（先述のリクエスト完了等）、falseの場合には再度ループを回してselect氏に待ってもらう事にした。
合わせてcurl_multi_info_readの残りのキューがあれば、selectをすっ飛ばしてとりに行くようにもした。これをやらないと、他のところで処理して戻って来た時にselect氏は「2番と3番のデータが来ました！」とまとめて報告してくれる。そうなれば2番だけデータを受け取ってこのループから抜けたが最後、「さっきので報告は終わりです！他ありません！」と言われて3番をとりに行けないからだ。そんな場合でもcurl_multi_info_readは「二件のメッセージをお預かりしています。一件目〜・・・残りのメッセージは一件です。」と留守番電話並みによくできた対応をしてくれるので、この残り件数をメモっておけばselectに聞くまでもなくデータが取得できる。（curl_multi_execが無駄に呼ばれるのはご愛嬌）


これにほぼ一日使ってしまった。俺のような犠牲者がもう出ない事を祈りここに記す。
IE で ExternalInterface を使った時のバグ対処法

なんか最近 FlashPlayer がアップデートされて
IE で ExternalInterface を使った時に文字化けするという話をよく聞くので少し調べてみた。

※ 明らかなバグだと思うのでそのうち直るだろうけど気持ち悪いので

# 条件
* IE 用のFlashPlayer
* ExternalInterface.call を使用して JS を呼んでいる
* 引数にマルチバイト文字列が含まれている

# 現象
* 文字化け
* 文字化けによりJSエラー

# 対処法

## JS にマルチバイト文字列を渡さない
マルチバイトかどうかは

```as3
if (/^[^\u0001-\u007D]+$/.test(text)) 
{
	trace("マルチバイトがふくまれてるよ");
}
```

こんなんでざっくりチェックが出来る。
かなり適当だけど化けそうな文字が判定できればいいのでよしとする。


## でも日本語渡したい
って人は IE だけ少し特別な処理にする。

```as3
if (ExternalInterface.call("window.navigator.userAgent.toLowerCase").indexOf("msie") >= 0)
{
	// IE 用の処理
}
```

って感じに IE を分ける。
中ではどんなことをするかというと

```as3
var objectID: String = ExternalInterface.objectID;
var functionName: String = "moja";
var param: String = "\"あいうえお\"";
navigateToURL(new URLRequest(
	"javascript:document.getElementById('" + 
	objectID + "').SetReturnValue(eval('try{__flash__toXML(" + 
	functionName + "(" + param + "));}catch(e){\"<undefined/>\";}'))"
), "_self");
```

こんな感じでやると普通に日本語も渡せた。


### 問題点

この方法で呼ぶと 

```as3
var res:String = ExternalInterface.call("moja");
```

のように戻り値を受け取ることが出来ない。

## でも戻り値ほしい
AS側から Base64 でエンコードしたやつを ExternalInterface.call で渡す。
そのへんから Base64 をデコードできるやつを拾ってきて JS 側で Base64 をデコードする。


***

気が向いたら他にも調べてみる。
Gitで、HEAD^[n]とHEAD~[n]とHEAD@{[n]}の違いが分かってなかったので書いとく

おそらくこんなかんじっぽい。
※ざっくり書いて公開しちゃったけど、もう少し詳しく補足しました（2013/09/15 17:13）

# それぞれ説明してみる

## HEAD^[n]
`git log`で出力される変更履歴（コミットログ）を参照してる。
この場合のnは、「n番目の親コミット」の意。
`git merge`とかした場合にマージ元となっている親ブランチが複数あった場合にnで指定してたどれるようです。
ぼくが使ってるリポジトリで試したら`HEAD^2`くらいまでしか辿れなかったんで、あんまり使いどころ実感してないんですけど…

## HEAD~[n]
`git log`で出力される変更履歴（コミットログ）を参照してる。
この場合のnは、「n世代目の親コミット」の意。
基本的には（この場合は起点をHEADとして）`git log`のタイムラインを遡るイメージでnを利用できます。要は、`git show HEAD^^^^`と`git show HEAD~4`は同義。

## HEAD@{[n]}
`git reflog`を参照してる。Gitを操作した記録がなされてて、それベース。
reflogはHEADの動きを記録しているもので、Gitにトラッキングされているファイルの操作で何かミスをした場合に`git reset (--hard) HEAD@{[n]}`とかで復旧することが可能らしいです（ぼくは幸いなことに、まだこれを利用する状況に陥ったことはないです）。

# おわりに
何か起こったときにちゃんと対処できるように、このへんの違いを理解しとくとよさそうです。

# 参考
- [Git初心者が絶対に覚えておくべきコマンド \- idesaku blog](http://d.hatena.ne.jp/idesaku/20091106/1257507849)
- [gitの相対的なコミットの指定、コミットの範囲指定方法 \- Linux, Mac, Emacsについての設定、覚え書き](http://d.hatena.ne.jp/kenbeese/20120310/title)
- Junio C Hamano: <a href="http://www.amazon.co.jp/gp/product/4798023809/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4798023809&linkCode=as2&tag=plane25-22">入門Git</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=plane25-22&l=as2&o=9&a=4798023809" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />, 秀和システム, 2009
NSAttributedStringを検索して特定文字列に色を付ける方法



    -(void) attributeStrings{
        NSString* plainStr = [zNSAttributedStringObj string];
        NSString* searchWord = @"\n    *";
        NSRange range = NSMakeRange(0,[plainStr length]);
        NSRange target;
   
        while ( target.location != NSNotFound ) {
            target = [plainStr rangeOfString:searchWord options:NSLiteralSearch range:range];
            NSDictionary *stringAttributes3 = @{ NSForegroundColorAttributeName : [NSColor blueColor]};
       
            if (target.location != NSNotFound) {
                [zNSAttributedStringObj setAttributes:stringAttributes3 range:target];
                NSInteger from = range.location + [searchWord length];
                NSInteger end = [plainStr length] - from;
                range = NSMakeRange(from, end);
            }
        }
   
    }
    //searchWordをNsRegularExpressionとNSDictionaryのNSArrayにでもすれば、まとめて色付けできるかな？
    //いまのところ実行速度は期待していない。。。
Java、Objective-Cで実行結果を非同期に取得する方法


いつもやり方を忘れてしまうのでメモ

## Javaでメソッドの引数にリスナーを渡す

```java:HogeConnection.java
private SearchWebListener searchWebListener;

public void searchWeb(String searchText, SearchWebListener _searchWebListener) {
	searchWebListener = _searchWebListener;

	
	// 時間がかかる処理を非同期で //

	searchWebListener.didFinish(CONNECTION_NO_ERROR, resultList);

}

public interface SearchWebListener {
	public void didFinish(int err, List<HogeSearchResultData> resultList);	
}

```

呼び出し側

```java:Hoge.java
HogeConnection hogeConnection = new HogeConnection();
hogeConnection.searchWeb(searchText, new HogeConnection.SearchWebListener() 
	@Override
	public void didFinish(int err, List<HogeSearchResultData> _resultList) {
		if (err == HogeConnection.CONNECTION_NO_ERROR) {
		
		}
		// エラーの時の処理
		else {
							
		}					
	}
});	
```

または

```java:Hoge.java

public void hogeMain() {
	HogeConnection hogeConnection = new HogeConnection();
	hogeConnection.searchWeb(searchText, new MySearchWebListener());
}

public class MySearchWebListener implements HogeConnection.SearchWebListene{
	@Override
	public void didFinish(int err, List<HogeSearchResultData> _resultList) {
		if (err == HogeConnection.CONNECTION_NO_ERROR) {
		
		}
		// エラーの時の処理
		else {
							
		}					
	}
}	
```

またはHoge.javaにHogeConnection.SearchWebListeneをimplementsしてもいい

## Objective-CでBlocksを使う

```objectivec:

typedef void (^TestMethodBlock)(BOOL arg1, BOOL arg2);

- (void)testMethodWithCompletion:(TestMethodBlock)_completion {

	TestMethodBlock completion = [_completion copy];

    // 別スレッド
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{

        /// 時間のかかる処理 ///
        
        // メインスレッド
        dispatch_sync(dispatch_get_main_queue(), ^{
            completion(YES, YES);
        });
    });
}

```

呼び出

```objectivec:
    [self testMethodWithCompletion:^(BOOL arg1, BOOL arg2) {

    }];
```

## Objective-Cでdelegateを使った方法

```objectivec:HogeDelegate.h
@protocol HogeDelegate <NSObject>
- (void)didFinish:(NSArray*)_resultList;
@end
```

```objectivec:HogeConnection.h
#import <UIKit/UIKit.h>
#import "HogeDelegate.h"

@interface HogeConnection : NSObject

@property (nonatomic, weak) id<HogeDelegate> delegate;

- (void)connection;

@end
```

```objectivec:HogeConnection.m
#import "HogeConnection.h"

@implementation HogeConnection

@synthesize delegate = _ delegate;

- (void)connection {
	
	// 別スレッド　時間がかかる処理
	
	[delegate didFinish:resultList];
}

@end
```

呼び出し側

```objectivec:HogeClass.h
#import <UIKit/UIKit.h>
#import "HogeConnection.h"

@interface HogeClass. : NSObject<HogeDelegate>
@end
```

```objectivec:HogeClass.m

- (void)hogeMain {
   	HogeConnection hogeConnection = [HogeConnection alloc];
	hogeConnection.delegate = self;
	[hogeConnection connection];
}

#pragma mark - hogeConnection delegate
- (void)didFinish:(NSArray*)_resultList {

}
```
traitの持ち物が衝突したときの振る舞いについて

下記は動作する

```LegalBuz.scala
package test

trait Foo {
  def hello = "foo"
}

trait Bar {
  def hello = "bar"
}

class Buz extends Foo with Bar{

  override val hello = super[Foo].hello

  def sayHello():Unit = {
    println(hello)
  }
}

object RunBuz extends App{
  new Buz().sayHello()
}
```

FooとBarのdefをvalにしてみると動作しない

```IllegalBuz.scala
package test

trait Foo {
  val hello = "foo"
}

trait Bar {
  val hello = "bar"
}

class Buz extends Foo with Bar{

  override val hello = super[Foo].hello

  def sayHello():Unit = {
    println(hello)
  }
}

object RunBuz extends App{
  new Buz().sayHello()
}
```

```
error: super may be not be used on value hello
override val hello = super[Foo].hello
```

may be not be...?

下記も動く(結果はbuz)

```YetAnotherLegalBuz.scala
package test

trait Foo {
  val hello = "foo"
}

trait Bar {
  val hello = "bar"
}

class Buz extends Foo with Bar{

  override val hello = "buz"

  def sayHello():Unit = {
    println(hello)
  }
}

object RunBuz extends App{
  new Buz().sayHello()
}

```

valをリテラルで置き換えることはできるけど、どちらかのtraitで宣言されているものは参照できないのか？
と思っていたら
https://issues.scala-lang.org/browse/SI-1938
こういうのがあったので、やはりできなかったというお話。