OmniAICreator/Qiita-1.07M huggingface dataset:
Windowsにgemのlibv8を入れる

[以前やった手順](http://qiita.com/kmats@github/items/bfba38da9fdfdc593beb)でWindowsにRubyInstaller,EVELOPMENT KITをインストールした状態で、bundleでibv8を入れようとしたところ以下のようなエラーが出た

```
C:/Ruby193/lib/ruby/gems/1.9.1/gems/libv8-3.11.8.17/ext/libv8/builder.rb:49:in `setup_python!': libv8 requires python 2 to be installed in order to build, but it is currently not available (RuntimeError)
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/libv8-3.11.8.17/ext/libv8/builder.rb:35:in `block in build_libv8!'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/libv8-3.11.8.17/ext/libv8/builder.rb:34:in `chdir'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/libv8-3.11.8.17/ext/libv8/builder.rb:34:in`build_libv8!'
        from C:/Ruby193/lib/ruby/gems/1.9.1/gems/libv8-3.11.8.17/ext/libv8/location.rb:24:in`install!'
        from extconf.rb:7:in `<main>'


Gem files will remain installed in C:/Ruby193/lib/ruby/gems/1.9.1/gems/libv8-3.11.8.17 for inspection.
Results logged to C:/Ruby193/lib/ruby/gems/1.9.1/gems/libv8-3.11.8.17/ext/libv8/gem_make.out
An error occurred while installing libv8 (3.11.8.17), and Bundler cannot
continue.
Make sure that `gem install libv8 -v '3.11.8.17'` succeeds before bundling.
```

## 対応
http://stackoverflow.com/questions/16514758/gem-install-libv8-version-3-11-8-17-on-ruby-windows

* bundle installの前にlibv8を入れる
 * エラーメッセージでは libv8 requires python 2 とあるけどPythonは入れなくてもインストールできた
 * -- --with-system-v8 がないとインストールできなかった

> $ gem install libv8 -v '3.11.8.17' -- --with-system-v8

* bundle installに--path指定してるような人はbundle config試すと良いんじゃないかと思う(試してないけど)
 * http://journal.sooey.com/233

### 補足
* 公式に書いてあった
** https://github.com/cowboyd/libv8#bring-your-own-v8
メモ: Gitリモートリポジトリにpushして自動更新してもらう方法

* [hookまとめ](http://qiita.com/khlizard/items/dfe1ec9d82c0ed5da7c6)

リポジトリの新規作成
=============

1. サーバーでbareリポジトリを作成
-----------------

```bash:bareリポジトリを作成
# mkdir -p /opt/repo/src.git
# cd /opt/repo/src.git
# git init --bare
```

2. サーバーでbareリポジトリをclone
-----------------

```bash:リポジトリのクローンを作成
# cd /opt
# git clone /opt/repo/src.git
```


3. ローカルでサーバーのbareリポジトリをclone
-----------------

```bash:リポジトリのclone
# git clone ssh://192.168.11.11/opt/repo/src.git
```

4. ローカルでなにかコミットする
-----------------

```bash:何かファイルを作ってコミットしておく。
# cd src
# date > memo.txt
# git add memo.txt && git commit -m "memo"
```

5. ローカルでサーバーにpush
-----------------

```bash:リモートリポジトリにpush
# git push --all
```

自動更新用にHookスクリプトを作成
=============

1. サーバーで作業
-----------------

```bash:
# cd /opt/repo/src.git/hooks/
# cp -a post-receive.sample post-receive
```

2. サーバーでpost-receiveを編集
-----------------

```diff:post-receive
+ cd /opt/src
+ git --git-dir=.git pull
```

3. ローカルからサーバーにコミットをpushする
-----------------

```bash:何かファイルを作ってコミットしておく。
# echo "hoge" > memo.txt
# git add memo.txt && git commit -m "hoge"
```

```bash:リモートリポジトリにpush
# git push
```

4. 変更を確認する
---------------

これで、/opt/src/memo.srcの内容が自動で更新される。
1分で実現できる！関数の実行結果をmemcachedにキャッシュするデコレータ


```python:これだけでmemcachedに戻り値をキャッシュできる
@cached(time=1200)
def functionToCache(arguments):
  return arguments
```
##どんなときに便利？
特に、スクレイピングや外部のデータを絡めた開発をするときに利便性を感じます。

##使い方
1.　`pip install python-memcached`をする
2. 下記のpythonのファイルを適当なところに保存してcachedの関数をimportする
3.	関数定義するときに@cached(time=1000)のような形式でデコレートする



##スニペット

```python:memcached-decorater.py
def decorator_with_args(decorator_to_enhance):
  """ 
  デコレータに引数を与えて返す関数
  """
  def decorator_maker(*args, **kwargs) :
    def decorator_wrapper(func) :
      return decorator_to_enhance(func, *args, **kwargs)
    return decorator_wrapper
  return decorator_maker

@decorator_with_args
def cached(func, *args, **kwargs):
  """
  関数の名前、引数をキーにして結果をキャッシュするデコレータ
  使い方
    @cached(time=1200)
    def functionToCache(arguments):
  """
  def wrapper(*pars):
    key = func.__name__ + '_' + '_'.join([str(par) for par in pars])
    print key
    client = memcache.Client(['127.0.0.1:11211'])
    val = client.get(key)
    if not val:
      val = func(*pars)
      try:
        client.set(key, val, time=kwargs['time'])
      except:
        pass #適当にどうぞ
    return val
  return wrapper


```
##参考
gae-memcache-decorator.py
https://gist.github.com/abahgat/1395810
古いバージョンのCocoaPodsをつかう


CocoaPods本体の古いバージョンを使う話。普通は問題ないが強引なことをやっているとバージョンアップして動かなくなることがある。

以下のようにして古いバージョンにダウングレードできる。

```bash
gem uninstall cocoapods --version=0.26.2
gem install cocoapods -v 0.25
```

別の方法として特定のプロジェクトだけ別のバージョンを使いたい場合はBundlerを使い、Gemfileを以下のように作成して

```ruby:Gemfile
source 'https://rubygems.org'
gem 'cocoapods', '0.25.0'
```

``bundle install `` でインストールする。

```bash
bundle install --path=vendor/bundle
```

podコマンドを使うときは ``bundle exec`` を使う。


```bash
bundle exec pod --version
```
Android SDK メモ


SDK Manager の起動

```
adt/sdk/tools/android
```

AVD Manager の起動

```
adt/sdk/tools/android avd
```

エミュレータにGoogle Play ストアのアプリをインストール

* [Android端末を持ってなくてもエミュレータでGoogle Play配布アプリを動かす](http://yusukebe.com/archives/20130412/123033.html)


```
adb install xxxx.apk
```
XcodeでiOSデバイスの位置情報をシミュレートする


XcodeではGPXファイルを使用することで **iOSシミュレータおよびiOSデバイス実機** の位置情報をシミュレートすることが出来ます。このエントリではGPXファイルの説明および作成方法、Xcodeでの使用方法について解説しています。

# GPXファイルを作る

## GPXファイルとは

位置情報を取り扱うファイル形式の一つで、Garminのトレッキング用デバイスや[Yahoo! ルートラボ](http://latlonglab.yahoo.co.jp/route/)などで経由地（=ルート）を表現するために使われているメジャーな形式です。実体はXMLが記述されたテキストファイルで、waypoint形式のサンプルは次のようなデータになっています。

```xml
<?xml version="1.0"?>
<gpx version="1.1" creator="drive.py coded by basuke">
        <wpt lat="35.681507" lon="139.765581">
                <name>Tokyo Station, 1 Chome-9 Marunouchi, Chiyoda, Tokyo, Japan</name>
        </wpt>
        <wpt lat="35.681507" lon="139.765581"/>
        <!-- 中略 -->
        <wpt lat="35.466046" lon="139.623581"/>
        <wpt lat="35.466046" lon="139.623581">
                <name>Yokohama Station, 2 Chome-16 Takashima, Nishi Ward, Yokohama, Kanagawa Prefecture, Japan</name>
        </wpt>
</gpx>
```

GPXはwpt（ウェイポイント）, rte（ルート）, trk（トラックポイント）の3種が存在しますが、wpt, trkを確認したところXcodeはwptのみ対応しているようです。


## GPXファイルの作り方

いくつか方法があります。

* GarminなどのGPSデバイスから生成したファイルを使う
* ルートラボから適当なデータをダウンロードする
* 自作する

テストでいくつかのバリエーションを試すには自作が良いでしょう。[id:basuke](http://d.hatena.ne.jp/basuke/)作の`drive.py` ([iOSシミュレータで使えるGPXファイルジェネレータ](http://d.hatena.ne.jp/basuke/20120902/1346627868))を使うとGoogle Direction Serviceを使用したルートデータをGPXファイルにすることが出来ます。

先のURLに書かれているpythonスクリプトを`drive.py`という名称で保存して、次のようにコマンドを実行します。

```
$ python drive.py "東京駅" "横浜駅" > tokyo_to_yokohama.gpx
```

これで東京駅から横浜駅までのルートデータを`tokyo_to_yokohama.gpx`というGPXファイルとして作成されました。


# Xcodeでシミュレーション

## 位置情報を使ったアプリケーションを作る

テスト用のアプリを作ったので利用してください！

* [MBGPXTest](https://github.com/key/MBGPXTest)


## GPXファイルをプロジェクトに登録する

作成したGPXファイルをプロジェクトに登録します。Xcodeに追加するだけで、シミュレーション用のデータとして認識されます。

![Menubar_and_gpx_and_gpx_and_MBGPXTest_xcodeproj_—_MBAppDelegate_h-2.png](https://qiita-image-store.s3.amazonaws.com/0/29860/2b3c8e74-3e12-7416-4e27-29fe64986b50.png "Menubar_and_gpx_and_gpx_and_MBGPXTest_xcodeproj_—_MBAppDelegate_h-2.png")


## 位置情報をシミュレーションする

アプリを実行すると地図が表示されます。

![スクリーンショット 2014-01-08 15.58.40.png](https://qiita-image-store.s3.amazonaws.com/0/29860/6dc6f3b4-b874-d78e-77a9-9a0ceac94eb7.png "スクリーンショット 2014-01-08 15.58.40.png")

Xcode内の下部ペインから矢印アイコン的なものをクリック。

![MBGPXTest_xcodeproj_—_MBAppDelegate_h.png](https://qiita-image-store.s3.amazonaws.com/0/29860/3a01c2ab-ff5b-ac97-ecd1-af2548d28a4c.png "MBGPXTest_xcodeproj_—_MBAppDelegate_h.png")

先ほど登録した`tokyo_to_yokohama.gpx`が選択肢として表示されているはずです。`tokyo_to_yokohama`をクリックするとシミュレーションが開始されます。

![Pasted_Image_1_8_14__16_04-4.png](https://qiita-image-store.s3.amazonaws.com/0/29860/a02960de-f5eb-7656-ff1f-4a5bf6b24bce.png "Pasted_Image_1_8_14__16_04-4.png")


アプリのビューを確認すると、現在地が移動しているのがわかると思います。

![Failed to upload スクリーンショット 2014-01-08 16.07.04.png: Monthly upload quota exceeded]()

----

# 注意点

位置情報はOS内で1つのみ扱われるので、 **位置情報を取り扱うすべてのアプリに影響があります。** Movesや僕の来た道などのライフログ系アプリは、位置情報のシミュレーションを行うことによってログが汚染されるのでお気をつけください（何回か泣きました）。
rails3系でtime属性カラムへの初期値の与え方


migrationファイルでdefault値を指定することはできないようでした。そこで、
hoges_controller.rbにて

```
class Hoge < ActiveRecord::Base
  Time.zone = 'Tokyo' #application_controller.rbに記述がベター
  validates_presence_of :time_shop_closed
  before_validation(on: :create) do
      #:time_shop_closedカラムの初期値に今日の18：00を与える
      self.time_shop_closed =Time.local(Date.today.year,Date.today.month,Date.today.day, 18, 0, 0)
  end
　#以下省略
```
before_createだとvalidationエラー(Time shop closed can't be blank)が出て困りました。before_validation(on: :create)が正解。ハマったので記録しました。

##ローカル時間に変更
参考： [Rails3系のtimezoneの扱いに関するメモ](http://qiita.com/semind/items/68341489a9c5149b815d "Rails3系のtimezoneの扱いに関するメモ")
railsの場合にデフォルトの設定だとタイムゾーンがUTCになっています。
application_controller.rbなどで以下を記述

```
Time.zone = 'Tokyo'
```

config/application.rbにて以下を追記

```
config.active_record.default_timezone = :local
```


ほぼ参考の丸写しです。
ELBとApache(mod_proxy)の付与するHTTPヘッダメモ

ELBとApacheどっちがつけたヘッダか分からなくなったので調べてメモ

* ELBの付与するヘッダ([Elastic Load Balancing Developer Guide API Version 2012-06-01](http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#x-forwarded-headers)に記述あり)
 * X-Forwarded-For
 * X-Forwarded-Port
 * X-Forwarded-Proto

* mod_proxyの付与するヘッダ([apache 2.2のmod_proxy文書](http://httpd.apache.org/docs/2.2/ja/mod/mod_proxy.html#page-header)に記述あり)
 * X-Forwarded-For
 * X-Forwarded-Host
 * X-Forwarded-Server
Rack::Request#hostがX-Forwarded-Hostの最後のプロキシホストを返す理由

```
client ---> proxy1 ---> proxy2 ---> rails app
※ proxy1/2はX-Forwarded-Host設定
```
上記のような環境ではrailsにX-Forwarded-Hostで"proxy1, proxy2"なリクエストが届く。
railsでrequest.hostするとproxy2のホスト名が返される。

[1.6.0.alphaの該当ソース](https://github.com/rack/rack/blob/234d6d3ca68af2019fbd330c807d7d532ce8992a/lib/rack/request.rb#L88-L94)では以下のようになっていてX-Forwarded-Hostの最後をとってくるようになっている。
なぜ最後を返してくるのか、最初では駄目なのかを調べてみた。

```rb
    def host
      # Remove port number.
      host_with_port.to_s.sub(/:\d+\z/, '')
    end

    def host_with_port
      if forwarded = @env["HTTP_X_FORWARDED_HOST"]
        forwarded.split(/,\s?/).last
      else
        @env['HTTP_HOST'] || "#{@env['SERVER_NAME'] || @env['SERVER_ADDR']}:#{@env['SERVER_PORT']}"
      end
    end
```

## 調べた結果
[同じような質問](https://groups.google.com/forum/#!topic/rubyonrails-talk/r_W9EgHmfoY)があったので追ってみると該当箇所の修正を行ったチケットを見つけた。

 * 変更のチケット(Archiveサイトより)：[#3397 ([PATCH] CgiRequest returns incorrect host name in event of multiple proxies) - Rails Trac - Trac](https://web.archive.org/web/20100618053001/http://dev.rubyonrails.org/ticket/3397)
  * チェンジセット(Archiveサイトより)：[Changeset 3412 - Rails Trac - Trac](https://web.archive.org/web/20100616203118/http://dev.rubyonrails.org/changeset/3412)

チケットの内容としてはActionController::Base::redirect_toでX-Forwarded-Hostが複数あるとうまくいかないのを最後のを取得することで対応したというものみたい。
最初のではなく最後のを取るようにしたのはリダイレクトする先は最後のプロキシのホストが適切だと判断したためのよう。

納得したけどclientがリクエストしてきたホストを取りたい場合にはRack::Request#hostは使えないということかな、、、
Pythonで標準出力をnon-blockingにする

標準出力はある程度のバッファが用意されていますがそこが埋まるとブロッキングされます。
ブロッキングするぐらいなら出力を諦めたい状況に遭遇することもあります。
そういう時はこれ

```py
import fcntl, sys, os
fl = fcntl.fcntl(sys.stdout.fileno(), fcntl.F_GETFL)
fl = fl | os.O_NONBLOCK
fcntl.fcntl(sys.stdout.fileno(), fcntl.F_SETFL, fl)
```

こうすることで

```py
while True:
    try:
        print("hoge" * 100)
    except IOError, (errno, strerror):
        sys.stderr.write("I/O error(%s): %s\n" % (errno, strerror))
```

などと書いた時

```shell-session
$ ./hoge.py | ./遅いプログラム
I/O error(11): Resource temporarily unavailable
I/O error(11): Resource temporarily unavailable
...
```

という感じの挙動になります
Java で Shift_JIS を Unicode へ変換する際の非互換

（久しぶりに嵌ったので、忘れないうちにメモ）

## 3 種類の変換テーブル

Java には、Shift_JIS を Unicode へ変換するテーブルが 3 種類ある。

* Shift_JIS
* windows-31j
* x-IBM943

一部の文字（'～'など）に対して、それぞれのテーブルが独自の変換をし異なる Unicode へ変換する。このため、Shift_JIS の文字化けの原因となる。
なお、これらの変換テーブルは `Charset` クラスの `forName` メソッドを用い次のようにして取得することができる。

```java:
Charset charset = Charset.forName("windows-31j");
```


## Shift_JIS 変換の非互換

どのような文字に非互換があるかを次表に示す。


Glyph | Shift_JIS Code | "Shift_JIS"によるUnicodeへの変換 | "windows-31j"によるUnicodeへの変換 | "x-IBM943"によるUnicodeへの変換
------|---------------:|---------------------------------:|-----------------------------------:|-------------------------------:
\     |             5c |                               5c |                                 5c |                              a5
~     |             7e |                               7e |                                 7e |                            203e
―    |           815c |                             2014 |                               2015 |                            2014
～    |           8160 |                             301c |                               ff5e |                            301c
∥    |           8161 |                             2016 |                               2225 |                            2016
－    |           817c |                             2212 |                               ff0d |                            2212
￠    |           8191 |                               a2 |                               ffe0 |                            ffe0
￡    |           8192 |                               a3 |                               ffe1 |                            ffe1
￢    |           81ca |                               ac |                               ffe2 |                            ffe2
￤    |           eefa |                              n/a |                               ffe4 |                              a6
￤    |           fa55 |                              n/a |                               ffe4 |                              a6


表中に n/a とあるのは、`Shift_JIS` は、機種依存文字や全角ハイフンを変換できないためである。
なお、`Shift_JIS` と `windows-31j` では、変換できない場合、変換できない文字が fffd になる。
`x-IBM943` では、変換できない文字は 0 となるようである。
Homebrew で R をインストールする時に cairo.h がないエラーになるので cairo を外して回避する

`brew install r` が以下のようにエラーとなる。

```
$ brew tap homebrew/science
Cloning into '/usr/local/Library/Taps/homebrew-science'...
（略）
$ brew doctor
Your system is ready to brew.
$ brew install r
==> Using Homebrew-provided fortran compiler.
This may be changed by setting the FC environment variable.
==> Downloading http://cran.r-project.org/src/base/R-3/R-3.0.2.tar.gz
（略）
/private/tmp/r-pW8z/R-3.0.2/lib/libRlapack.dylib is unchanged
make[1]: *** [R] Error 1
make: *** [R] Error 1

READ THIS: https://github.com/Homebrew/homebrew/wiki/troubleshooting
If reporting this issue please do so at (not Homebrew/homebrew):
  https://github.com/homebrew/homebrew-science/issues

These open issues may also help:
    https://github.com/Homebrew/homebrew/issues/23009
    https://github.com/Homebrew/homebrew/issues/18947
    https://github.com/Homebrew/homebrew/issues/15900
    https://github.com/Homebrew/homebrew/issues/15909
    https://github.com/Homebrew/homebrew/issues/22806
    https://github.com/Homebrew/homebrew/pull/6427
    https://github.com/Homebrew/homebrew/pull/6428
$
```

`Using Homebrew-provided fortran compiler.` とあるので gfortran は入れる必要ないようだ。

エラーログをファイルにとる。

```
$ HOMEBREW_MAKE_JOBS=1 brew install -v r 2>&1 > _brew.log
Error: r did not build
$
```

_brew.log を見ると


```
（略）
In file included from devX11.c:72:
./devX11.h:62:12: fatal error: 'cairo.h' file not found
#  include <cairo.h>
           ^
1 error generated.
make[3]: *** [devX11.d] Error 1
make[2]: *** [make.X11] Error 2
make[1]: *** [R] Error 1
make: *** [R] Error 1
==> Formula
（略）
```

cairo.h が見つからなくてエラーになっている。

```
$ brew upgrade cairo
Error: cairo-1.12.16 already installed
```

cairo は最新。

[R depends on cairo?](https://github.com/Homebrew/homebrew-science/issues/593) を参考に、`brew edit r` して configure のオプションで cairo を外す。

```
$ brew edit r
```

エディタが立ち上がるので、以下のような部分を探して、

```
  def install
    args = [
      "--prefix=#{prefix}",
      "--with-aqua",
      "--enable-R-framework",
    ]
```

ここに `--without-cairo` を付け加える。

```
  def install
    args = [
      "--prefix=#{prefix}",
      "--with-aqua",
      "--enable-R-framework",
      "--without-cairo",
    ]
```

すると `brew install r` で R がインストールされる。このように cairo を外すと、きっとグラフィックス機能の一部が使えなくなるだろうと思う。
RedmineのパスワードをDBから直接変更する

RedmineのDB設定は、インストールしたディレクトリの「config/database.yml」に書いてある。

ユーザーテーブルは、「users」となっている。

パスワードは、ユーザー毎に持っているsaltキーとSHA1で暗号化したパスワードを連結し、更にSHA1で暗号化する。

```php
<?php

echo sha1( "saltキー" . sha1('パスワード'));
```
grepでコメント行および空白行を削除する

### grep で`#`で始まるコメント行および空白行を削除する

```bash
$ grep -v '^\s*#' filename |grep -v '^\s*$'
```

もしくは

```bash
$ grep -v -e '^\s*#' -e '^\s*$' filename
```

### 簡単な解説

* grep の `-v` オプションは除外を意味します。
* 正規表現で `^` は行頭を表します。
* 正規表現の `\s` は空白文字を表し、`^\s*` は行頭から0回以上繰り返しの空白を意味します。
そのため、`\s*#` と書くと `#` から始まるコメント行（`#`より前には空白がいくつあっても良い）にマッチします。
* 正規表現の `$` は行末を表します。`^\s*$` だと空白のみの行にマッチします。


### 実行例

```bash
$ vim /tmp/greptest.rb
```

```ruby:/tmp/greptest.rb
#=========================
# ここのコメントは除去されます
#=========================
class Hoge

  # このコメントも除去されます
  def hello
    puts "Hello, World!" # ここのコメントは除去されません
  end

end

# このコメントは除去されます
hoge = Hoge.new
hoge.hello
#=> Hello, World! # これも除去されます
```

このようなファイルがあるとき、

```bash
$ grep -v -e '^\s*#' -e '^\s*$' /tmp/greptest.rb
```

を実行すると、

```
class Hoge
  def hello
    puts "Hello, World!" # ここのコメントは除去されません
  end
end
hoge = Hoge.new
hoge.hello
```

という結果が返ってきます。
Haskellでマルチスレッド処理

`Control.Concurrent`を使うとHaskellでもマルチスレッド処理ができます。
よく使う函数は(多分)以下の通り。

```hs
forkIO :: IO () -> IO ThreadId -- IO ()を渡すとその場で実行
killThread :: ThreadId -> IO () -- 指定のThreadをkillする
threadDelay :: Int -> IO () -- スレッドを指定の時間[microsec]だけ停止する

data MVar a -- スレッド内で使えるmutableな変数
newMVar :: a -> IO (MVar a) -- 変数を初期化
takeMVar :: MVar a -> IO a -- 変数の値を取り出す
putMVar :: MVar a -> a -> IO () -- 変数に代入する
```

サンプルコードその1
-----

```hs
import Control.Concurrent
import Control.Monad

waiting :: Int -> IO ()
waiting n = do
  putStrLn $ "waiting" ++ (replicate n '.')
  threadDelay 100000
  waiting (n+1)

doSth :: IO Bool
doSth = do
  -- do something
  threadDelay 3000000
  putStrLn $ "=========== done ========="
  threadDelay 3000000
  putStrLn $ "=========== done ========="
  threadDelay 3000000
  putStrLn $ "=========== done ========="
  
  return True

ex1 = do
  w <- forkIO $ waiting 0
  u <- doSth
  when u $ killThread w
  putStrLn "killed the waiting thread"
```

`doSth`スレッドは「3秒かかる処理」を3回行います。
`waiting`スレッドは"waiting..."というメッセージを出力します。処理が3回終わったところで待ちスレッドをkillしておしまいです。

サンプルコードその2
-----

```hs
import Control.Concurrent
import Control.Monad

waiting :: Int -> IO ()
waiting n = do
  putStrLn $ "waiting" ++ (replicate n '.')
  threadDelay 100000
  waiting (n+1)

doSthWithMVar :: MVar Bool -> IO ()
doSthWithMVar ref = do
  threadDelay 3000000
  putStrLn $ "=========== done ========="
  threadDelay 3000000
  putStrLn $ "=========== done ========="
  threadDelay 3000000
  putStrLn $ "=========== done ========="

  putMVar ref True

ex2 = do
  ref <- newMVar False
  w <- forkIO $ waiting 0
  _ <- forkIO $ doSthWithMVar ref
  
  go ref w
  
  where
    go :: MVar Bool -> ThreadId -> IO ()
    go ref w = do
      tf <- takeMVar ref
      case tf of
        True -> do
          killThread w
          putStrLn "killed the waiting thread"
        False -> go ref w
```

大体さっきと同じですが、今回は`MVar`を使ってフラグを管理しています。
`doSthWithMVar`は、3秒かかる処理を3回したあとフラグを`True`にします。
`ex2`は2つのスレッドを立ち上げたあとループに入ります(`go`)。フラグが`True`になったらスレッドをkillしてループを抜けます。

これだけ！

まとめ
--------

- `Control.Concurrent`のThreadはとても簡単で使いやすい
- `MVar`を使えばスレッド間で共有したいmutableな変数を作成することができる
- こころなしか(特に日本語)ググってもサンプル・チュートリアルが少ないような…[要出典]
KVM クローン作成スクリプト

```
#!/bin/bash

function main(){

    local SRC_NAME=$1
    local DST_NAME=$2

    if [ -z ${SRC_NAME} ] || [ -z ${DST_NAME} ]
    then
        echo $0 [SRC_NAME]  [DST_NAME]
        exit 1
    fi

    clone_kvm ${SRC_NAME} ${DST_NAME}
    start_kvm ${DST_NAME}
}

function clone_kvm(){

    local SRC_NAME=$1
    local DST_NAME=$2

    virt-clone \
    --original ${SRC_NAME} \
    --name ${DST_NAME} \
    --file /var/lib/libvirt/images/${DST_NAME}.img \
    --prompt
}

function start_kvm {

    local DST_NAME=$1

    echo "virsh start ${DST_NAME}"

}
main ${@}
```
特定のファイルを開いているプロセスを探す（fuser, lsof でやるアレ）

`/proc/プロセス番号/fd/ファイル記述子` は、そのプロセスの開いているファイルをシンボリックリンクで指し示しているのでコレを使う。

```fuser.rb
USAGE = <<USAGE
$0 [FILE]...
ファイルを開いている pid を出力
USAGE

file_paths = ARGV.select{|fp| File.exist? fp }.
  map{|fp| File.expand_path fp}

if file_paths.empty?
  puts USAGE
  exit 1
end

fp_pids_map = Hash.new {|h,k| h[k] = [] }
Dir.glob '/proc/*/fd/*' do |fd|
  fp = File.readlink(fd) rescue next
  if file_paths.include?(fp)
    pid = fd.sub(%r!/proc/(\d+)/fd/\d+!, '\1').to_i
    fp_pids_map[fp] << pid
  end
end

fp_pids_map.each{|v| puts '%s:	%s' % v}
```

使ってみる:

```bash
$ touch foo
$ ruby -e 'open "foo"; sleep' &
[1] 9918
$ ruby -e 'open "foo"; sleep' &
[2] 10281
$ ruby tmp/fuser.rb foo
/home/kui/foo:  [9918, 10281]
```

できてるっぽい。
Chef のテスト環境を整える


WIP!

## 概要

* test-kitchen と serverspec で受け入れテスト
 * virtualbox
 * ec2 (TODO)
 * docker (TODO)
* foodcritic で chef syntax check (TODO)
* robocop で ruby syntax check (TODO)

## 手順
### Chef 自体のインストール

```bash:console
$ gem install chef
```

### VirtualBox のインストール
https://www.virtualbox.org/wiki/Downloads
### Vagrant のインストール

http://www.vagrantup.com/downloads.html

opscode 公式の BOX を追加

```bash:console
$ vagrant box add opscode-ubuntu-12.04 https://opscode-vm.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box
```

### Test 関連 Gem のインストール

```bash:console
$ cd your-cookbook
```

test-kitchen, vagrant, busser, serverspec など gem をインストール

```ruby:Gemfile
source 'https://rubygems.org'

gem 'berkshelf'
gem 'foodcritic'
gem 'rubocop'

group :integration do
  gem 'test-kitchen'
  gem 'kitchen-vagrant'
  gem 'busser'
  gem 'serverspec'
end
```

```bash:console
$ bundle install
```

vagrant plugin のインストール

```bash:console
$ vagrant plugin install vagrant-berkshelf
```

busser plugin のインストール

```bash:console
$ busser plugin install serverspec
```

### test-kitchen スケルトン作成

test-kitchen のスケルトン作成

```bash:console
$ kitchen-init
```

serverspec のスケルトン作成

```bash:console
$ cd test/integration/default/
$ serverspec-init
Select OS type:

  1) UN*X
  2) Windows

Select number: 1

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 2

 + spec/
 + spec/localhost/
 + spec/localhost/httpd_spec.rb
 + spec/spec_helper.rb
 + Rakefile
```

```bash:console
$ rm Rakefile
$ mv spec serverspec
```

## テストを書く

```ruby:test/integration/default/serverspec/localhost/sample_spec.rb
require "spec_helper"

describe file("/tmp/hello") do
  it { should be_file }
  it { should contain "Hello World" }
end
```

## レシピを書く
```ruby:recipes/default.rb
file "/tmp/hello" do
  content "Hello World"
end
```

## テストを走らせる

Chef の Recipe の Lint Check

```bash:console
$ cd your-cookbook
$ foodcritic .
```

test-kitchen の設定ファイル書く

```yml:.kitchen.yml
---
driver_plugin: vagrant
driver_config:
  require_chef_omnibus: true

platforms:
- name: ubuntu-12.04
  driver_config:
    box: opscode-ubuntu-12.04
    box_url: https://opscode-vm.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box

suites:
- name: default
  run_list:
    - recipe[your-cookbook::default]
  attributes:
```

テストを走らせる。

```bash:console
$ kitchen test
```

platforms × suites の数だけ

1. VM 作成
2. VM へChef のインストール
3. Cookbook ダウンロード
4. Chef-Client 実行
5. Serverspec 実行

が行われる
proxyサーバーを立てる (squid)

アクセス元IPの制限や、他の人のページ閲覧状況を残したいとき活躍します。

```diff:/etc/squid/squid.conf
+acl localnet src 111.111.111.111/32

-http_access allow localhost
+http_access allow localnet
```

```bash:リスタート
$ sudo /etc/init.d/squid restart
```

デフォルトでポート番号が`3128`になっています。

https
--------

squidでhttpsアクセスをする場合、squidを--enable-sslでビルドする必要がある。
ビルドオプション確認 : `squid -v`

w3mでの設定
--------

* proxyサーバーの指定は`http://<ip>:3128`のように、http://指定する必要があります。
pandas.DataFrameをつかってみる


jsonのデータがいっぱいある系

```
a = [{"poko": 1, "hoge":2}, {"poko": 1, "hoge":2}, {"hoge":2}, {"poko": 1}]
```

みたいな

```
from pandas import DataFrame
frame = DataFrame(a)
```

ipython でframeを出力すると

```
Out:
   hoge  poko
0     2     1
1     2     1
2     2   NaN
3   NaN     1
```

的な

```
In: frame[“poko”]
Out: 
0     1
1     1
2   NaN
3     1
Name: poko, dtype: float64

In: frame[“poko”][:2]
Out: 
0    1
1    1
Name: poko, dtype: float64
```

みたいな

カウントアップがほしいとき

```
In: frame["poko"].value_counts()
Out:
1    3
dtype: int64
```

みたいに
collections.Counterを用いてlistのカウントアップ


```
a = ["poko", "poko", "hoge", "aaa", "aaa", "poko", "aaa", "aab"]
```

のようなlistがある

```
from collections import Counter
counts = Counter(a)
#上位2番目
print counts.most_common(2)
# [Out]: [('poko', 3), ('aaa', 3)]
 
#上位から全部
print counts.most_common()
# [Out]: [('poko', 3), ('aaa', 3), ('aab', 1), ('hoge', 1)]

# key指定
print counts[“poko”]
# [Out]: 3
```

sort済みのdict(みたいな言い方で良いのか?)っぽくつかえる
tmuxでSSH時に変更したwindow-nameを自動でもとに戻す

* [tmuxで色んなホストにsshする時に便利な.ssh/config - Qiita](http://qiita.com/catatsuy/items/631d1d5d0b357082ba74)

上記の記事の設定が便利ですが、コメントで @kawaz さんが指摘しているように、SSHを終了して戻ってきたときにwindow-nameが戻らないのが不便だったのでこんな感じの関数を登録しました。

```zsh:.zshrc
function ssh() {
    local window_name=$(tmux display -p '#{window_name}')
    command ssh $@
    tmux rename-window $window_name
}
```

あとは通常通りの `ssh` コマンドを使えば自動でtmuxのwindow-nameが切り替わります。tmuxの外にいても特にエラーなどは発生しません。
moshで「Mosh: You have a detached Mosh session on this server (mosh [XXXX]).」と出る時。



moshでサーバーに接続してゴニョゴニョ作業していた時に、パソコンが急に落ちて、再度moshでアクセスした時にでるやつ。

セキュリティ上の理由から出来ないようにしているので、

```
kill xxxx
```

として対応する。再接続的な事は出来ない。

#### thanks
- http://stackoverflow.com/questions/17857733/how-do-i-reattach-to-a-detached-mosh-session
- https://github.com/keithw/mosh/issues/394
NSUserDefaultsにproperty経由でアクセスするためのカテゴリ

NSUserDefaultsは非常に便利ですが、キーの名前をハードコードするのは保守性に問題があります。
文字列定数を定義する方法もありますが、僕はカテゴリを作成して、プロパティとしてアクセスするようにしています。

メリットはざっと下記の通りです。

- 型制約がかけられる
- キーとなる文字列が一カ所で定義されるので保守が簡単になる
- キーとなる文字列と、propertyの名前を独立に管理できる
- 必要に応じてgetterをフックできる。
 - たとえばキーを変更した場合に、古いキーからも値を読めるようにする

以下サンプルコードです。
メソッド名がppで始まっているのは、僕がカテゴリでメソッドを足す時のルールです。

```objc:NSUserDefaults+PPUtils.h
#import <Foundation/Foundation.h>

@interface NSUserDefaults (PPUtils)

@property BOOL ppABool;

@end
```

```objc:NSUserDefaults+PPUtils.m
#import "NSUserDefaults+PPUtils.h"

@implementation NSUserDefaults (PPUtils)

- (BOOL)ppABool
{
    return [self boolForKey:@"ppABool"];
}

- (void)setPpABool:(BOOL)ppABool
{
    [self setBool:ppABool forKey:@"ppABool"];
}

@end

```
Microsoft Remote Desktopの解像度変更

Macbook Airの解像度は1440x900。
ウィンドウモードで操作するとき最適な解像度がなかったが、変更方法があったんですね。

Microsoft Remote Desktopの指定解像度はいくつか初期設定があるが、任意に決めることも可能。

* Preferences.. -> Resolution -> + -> `1400x850`

にして、`Edit`-> Resolution -> `1400x850` を選択し接続する。
Rでベイズ線形回帰（PRML§3.3）の図版再現


[ベイズ線形回帰（PRML§3.3）の図版再現](http://qiita.com/naoya_t/items/80ea108cebc694f5cd63)を見て、ちょうどこのあたりを社内読書会で読んでいたところだったので、理解を深めるためにRで実装しなおしてみた。

```r
library(ggplot2)
library(MASS)
library(mvtnorm)

# our example data points are generated from this function with gaussian noise
underlining_function <- function(x) sin(x * pi * 2)

# params for prior probability
S <- 0.1
ALPHA <- 0.1
BETA <- 9

# use 9 gaussian basis functions
NUM_BASES <- 9

basis_centers <- seq(0, 1, length=NUM_BASES)

gaussian_basis_func <- function(x, sigma, mu) dnorm(x, mean=mu, sd=sigma)

apply_gaussian_basis_funcs_to_xs <- function(xs) {
  phis <- matrix(0, nrow=length(xs), ncol=NUM_BASES)
  for (m in 1:NUM_BASES) {
    phis[,m] <- dnorm(xs, sd=S, mean=basis_centers[m])
  }
  return(phis)
}

# observed data points (underlining function plus some noise)
NUM_OBSERVED <- 20

observed <- data.frame(x = runif(NUM_OBSERVED, min=0.0, max=1.0))
observed$t <- underlining_function(observed$x) + rnorm(NUM_OBSERVED, mean=0.0, sd=0.1)

# graph boundaries
xmin <- -0.05
xmax <-  1.05
ymin <- -1.5
ymax <-  1.5

x_ <- seq(xmin, xmax, by=0.01)
t_ <- seq(ymin, ymax, by=0.01)

# data frame for plot
df <- data.frame(x = x_, t = underlining_function(x_))

# design matrix
PHI <- apply_gaussian_basis_funcs_to_xs(observed$x)

# posterior distribution
S_N_inv <- ALPHA * diag(NUM_BASES) + BETA * t(PHI) %*% PHI
S_N <- ginv(S_N_inv)
m_N <- BETA * S_N %*% t(PHI) %*% observed$t

# predictive distribution
phix <- apply_gaussian_basis_funcs_to_xs(x_)
predictive_distribution_mean <- phix %*% m_N # vectorized.
predictive_distribution_sd <- apply(phix, 1, function(phis) sqrt(1.0 / BETA + t(phis) %*% S_N %*% phis))

df$predictive_distribution_low <- predictive_distribution_mean - predictive_distribution_sd
df$predictive_distribution_high <- predictive_distribution_mean + predictive_distribution_sd

# plot
plt <- ggplot(df, aes(x = x)) +
  xlim(xmin, xmax) + #ylim(ymin, ymax) +
  geom_line(aes(y = t)) +
  geom_ribbon(aes(ymin=predictive_distribution_low, ymax=predictive_distribution_high), alpha=0.5) +
  geom_point(data=observed, aes(x = x, y = t), shape=1, size=3)

#   print(plt)

for (i in 1:5) {
  # pick some w from posterior distribution
  w <- mvrnorm(mu=m_N, Sigma=S_N)
  hypothesis <- data.frame(x = x_, t = phix %*% w)
  plt <- plt + geom_line(data=hypothesis, aes(x=x, y=t), linetype=2)
}  
print(plt)
```

![kobito.1389135787.116736.png](https://qiita-image-store.s3.amazonaws.com/0/5978/3023fb28-313b-6c38-4bf3-f98ec91d0434.png "kobito.1389135787.116736.png")

PythonをRに写経してみて思ったのは、Pythonはラムダの配列を作れるのが便利。mapとかあるし。Rはラムダが作れるが、リストしかできないしmap的なのが難しい。

Rはデータ構造がvectorだとかmatrixだとかlistだとかdata.frameだとか似たようなのがいくつもあって面倒。applyとかsapplyとか調べても、バッチリ欲しいデータ構造で出力してくれなかったり。上のプログラムでは`predictive_distribution_sd`がvectorで、`predictive_distribution_mean`が1列のmatrixだけど、普通に足し合わせることができるならもうvectorとか要らないのに。

あとggplot2でylimとgeom_ribbonの相性が良くなくて、geom_ribbonの上下の境界がylimの範囲を出るとプロットされなくなる。なのでylimをコメントアウトしてある。
Process.WaitForExit()でハングしないようにするには

コード内で別プロセスを起動する際にはProcessクラスを使いますが、出力をリダイレクトする場合は正しく初期化しないとWaitForExit()がいつまで待っても返って来ません。

リダイレクションのための内部バッファは4Kバイトしかありません。もし呼び出したプロセスが4KB以上出力した場合、その出力が取り出されるまでプロセスが停止するためです。UNIXのパイプの扱いと同じですね。この問題を避ける一番簡単な方法は、簡単なイベントハンドラを用意して適宜データを吸い出してやることです。

以下にpowershellを内部から呼び出すサンプルを書きます。

```csharp
var command = "powershell.exe";
var arguments = "gci $ENV:TEMP";
var startInfo = new ProcessStartInfo(command, arguments) {
    WorkingDirectory = Environment.CurrentDirectory,
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    UseShellExecute = false,
    CreateNoWindow = true
};

var output = new StringBuilder();
var timeout = TimeSpan.FromMinutes(2); // 2分だけ待つ

using (var process = Process.Start(startInfo))
{
    var stdout = new StringBuilder();
    var stderr = new StringBuilder();

    process.OutputDataReceived += (sender, e) => { if (e.Data != null) { stdout.AppendLine(e.Data); } }; // 標準出力に書き込まれた文字列を取り出す
    process.ErrorDataReceived += (sender, e) => { if (e.Data != null) { stderr.AppendLine(e.Data); } }; // 標準エラー出力に書き込まれた文字列を取り出す
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();

    var isTimedOut = false;
    
    if (!process.WaitForExit((int)timeout.TotalMilliseconds))
    {
        isTimedOut = true;
        process.Kill();
    }
    process.CancelOutputRead();
    process.CancelErrorRead();

    output.AppendLine(stdout.ToString());
    output.AppendLine(stderr.ToString());
    if (isTimedOut)
        output.AppendLine("TIMEOUT AT " + DateTimeOffset.Now);
}
var resultString = output.ToString();  // これを使う
```

適当にメソッドにするなりヘルパークラスに入れるなりしてお使いください。タイムアウト発生時、上記サンプルでは文字列に追加していますが、TimeoutExceptionを投げるのもありです。まあお好みで。
Twitterのリストの操作

https://dev.twitter.com/docs/api/1.1/get/lists/members

##リストの参照

```Python
#ユーザーのリストを取得し、登録されているユーザー数を出力

#tはtwitterクラスインスタンス
hoge = t.lists.list(user_id='user_id')

for h in hoge:
    print(h['name'] + ':' + h['id_str'])
    cursor = '-1'　
    count = 0
    while cursor != '0':
        #cursor=-1 the first "page."
        tl = t.lists.members(list_id=h['id_str'],cursor=cursor)
        count += len(tl['users'])
        cursor = tl['next_cursor_str'] #次ページなければ0が入力されている
    print(count)

```
LXC 1.0: 最初のUbuntuコンテナー [1/10]

## この文書について

この文書は、連載記事「[LXC 1.0: Blog post series](https://www.stgraber.org/2013/12/20/lxc-1-0-blog-post-series/)」の一つである以下の記事を翻訳したものです。連載の目次や注意点は[こちら](http://qiita.com/m-shibata/items/ee9b295a2596824da819)を参照してください。

* https://www.stgraber.org/2013/12/20/lxc-1-0-your-first-ubuntu-container/

この文書のライセンスは原文と同じく、[Creative Commons BY-NC-SA 2.5](http://creativecommons.org/licenses/by-nc-sa/2.5/)のもとに提供されています。

![CC-BY-NC-SA 2.5](http://i.creativecommons.org/l/by-nc-sa/2.5/88x31.png)


## LXCとはなんぞや？

ほとんどの人はその問いに対する答えを既に知っていることでしょう。まとめますと：

> LXCはLinuxカーネルの隔離機能に対するユーザー空間のインターフェースです（訳注１）。強力なAPIとシンプルなツールを用いて、Linuxユーザーは簡単にシステムやアプリケーションのコンテナーを作成・管理できます。

私は二人いるLXCのアップストリームのメンテナーのうちの一人であり、もう一人はSerge Hallynです。このプロジェクトは、毎月マイルストーンをリリースするほど活発に開発されており、安定版は次の2月にリリースする予定です。これまでに67人の、背景も会社も異なる幅広い貢献者が開発に携わっています。

* プロジェクトは主にgithubで開発しています： http://github.com/lxc
* ウェブサイトもあります： http://linuxcontainers.org
* メーリングリストはこちらです： http://lists.linuxcontainers.org


## LXC 1.0

1.0のリリースはどういう意味を持つのでしょうか？

そうですね、簡単に言うとLXCにとって最初の安定版のリリースであり、5年間の不具合修正をサポートする最初のリリースです。2014年の4月にリリース予定のUbuntu 14.04 LTSで採用される予定のリリースでもあります。

安定したAPIとバインディング群も提供し、今後の記事で紹介する予定の新機能を搭載しており、Androidを含むさまざまなホスト・ゲストディストリビューションをサポートしています。


## どうやって入手するの？

読者の多くはUbuntuを使っていると仮定します。ここから先の記事では、私自身はUbuntu 14.04上のアップストリームのデイリービルドを使っていますが、私たちは12.04や12.10、13.04、13.10、14.04用のデイリービルドもメンテナンスしているので、最新のアップストリームのコードが欲しければ、[私たちのPPA](https://launchpad.net/~ubuntu-lxc/+archive/daily)を使うと良いでしょう。


他にも、Ubuntu 12.04 LTS以降であればUbuntuから直接LXCを使うこともできます。使用しているUbuntuのリリースによって選択できるバージョンは変わります。またバックポートバージョンを使用することもできます。

自分自身でビルドすることも可能です（使用しているディストリビューションにパッケージが存在するのであれば、この方法はおすすめしません）：

```bash
git clone git://github.com/lxc/lxc
cd lxc
sh autogen.sh
# パスを指定したい場合は、まず--helpオプション付きでconfigureスクリプトを実行すると良いでしょう
./configure
make
sudo make install
```


## 最初のコンテナーとは？

そうでした。それがこの記事の本来の目的でしたね？

LXCが、できればUbuntuのパッケージを使って、インストールされたとしましょう。あとは本当に簡単です：

```bash
# 「ubuntu」テンプレートを使って、ホストと同じUbuntuのバージョンとアーキテクチャである
# 「p1」コンテナーを作成します。すべての利用可能なオプションを表示したい場合は、
# "-- --help"を指定してください。
sudo lxc-create -t ubuntu -n p1

# コンテナーを（バックグラウンドで）起動します。
sudo lxc-start -n p1 -d

# 以下の方法のいずれかでコンテナーの中に入れます。
## コンテナーのコンソールをアタッチする（Ctrl-A + Qでデタッチできます）
sudo lxc-console -n p1

## コンテナーの中で直接bashプロセスを生成する（コンソールログインを回避する）
## 3.8以上のカーネルが必要です
sudo lxc-attach -n p1

## SSHでログインする
sudo lxc-info -n p1
ssh ubuntu@<lxc-infoで表示されたIPアドレス>

# 以下の方法のいずれかでコンテナーを終了できます。
## コンテナーの中から終了する
sudo poweroff

## コンテナーの外から安全に終了する
sudo lxc-stop -n p1

## コンテナーの外からkillする
sudo lxc-stop -n p1 -k
```

これで、最初のコンテナーはできました。Ubuntuだとこれだけですべてがうまく動くことがわかるかと思います。私たちのカーネルはLXCが使うであろうすべての機能をサポートしていますし、私たちのパッケージはコンテナーが標準で使用するブリッジやDHCPサーバーの設定も行うようになっています。これらはすべて設定で変更可能で、今後の記事でその方法を紹介する予定です。


## 訳注１

（訳注：記事のコメントに回答する形で、LXCについてもう少し初心者向けの説明をしていたのでここに追記しておきます）

chrootについて知っているのであれば、LXCを独自のネットワーク環境や独立したプロセスツリーを持つ強化版chrootと考えるのが簡単です（実際はもっと多くの機能を持っていますが）。

chrootについて知らないのであれば、極めて柔軟ではあるもののホストとカーネルを共有する必要のある仮想化技術のみを使ったオーバーヘッドのないLinux、が不確かな近似となるでしょう。
LXC 1.0: Blog post series [0/10]

## はじめに

この文書は、LXCの開発者の一人であり、Ubuntu/CanonicalでUbuntu Server、Ubuntu Phoneの開発に携わっているStéphane Graberが2013年末から2014年初めにかけて投稿した「[LXC 1.0: Blog post series](https://www.stgraber.org/2013/12/20/lxc-1-0-blog-post-series/)」の記事の一つを翻訳したものです。

翻訳の際に追記したものは「（訳注：……）」と表記するか、「（訳注１）」という形で記事の最後に説明を追加しています。文書の中の一人称はすべて原文の執筆者であるStéphane Graberを指します。文書の体裁はQiitaのMarkdownにあわせて原文から若干変更しています。

この文書のライセンスは原文と同じく、[Creative Commons BY-NC-SA 2.5](http://creativecommons.org/licenses/by-nc-sa/2.5/)のもとに提供されています。

![CC-BY-NC-SA 2.5](http://i.creativecommons.org/l/by-nc-sa/2.5/88x31.png)


## LXC 1.0: Blog post series [0/10]

* https://www.stgraber.org/2013/12/20/lxc-1-0-blog-post-series/

今年（訳注：2013年の終わりに公開されました）もほぼ終わりです。私は10日ほどの休暇を取得しましたが、少しだけ時間が残っています。

私は、来年の早い段階でリリースされるLXC 1.0のために、LXCの最新版に対して作業を行なってきました。そこで、LXCの現状についてブログを書くことが、その余った時間の素敵な使い方になるのではないかと考えたのです。

その結果、LXCでもっとも素晴らしいと私が考える機能について解説した10個の記事を準備することにしました。予定される構成は以下のようになっています。

* [LXC 1.0: 最初のUbuntuコンテナー [1/10]](http://qiita.com/m-shibata/items/140a22215db40e99a720)
* [LXC 1.0: 二つ目のコンテナー [2/10]](http://qiita.com/m-shibata/items/6a42ea6b4e3e89bc1259)
* [LXC 1.0: コンテナーの高度な使い方 [3/10]](http://qiita.com/m-shibata/items/0bfef9f8be86b375b428)
* [LXC 1.0: コンテナーのさらに高度な使い方 [4/10]](http://qiita.com/m-shibata/items/dd1a46ea6d98bbdf1ee5)
* [LXC 1.0: コンテナーストレージ [5/10]](http://qiita.com/m-shibata/items/e599d2cba27539baf8ae)
* [LXC 1.0: セキュリティ機能 [6/10]](http://qiita.com/m-shibata/items/2735fa498fceb390dc59)
* [LXC 1.0: 非特権コンテナー [7/10]](http://qiita.com/m-shibata/items/698d92d67c7a76612009)
* [LXC 1.0: APIを用いたスクリプト [8/10]](http://qiita.com/m-shibata/items/482966870ddb96baddcc)
* [LXC 1.0: コンテナーの中でGUI [9/10]](http://qiita.com/m-shibata/items/907986ed25f7619dc5eb)
* [LXC 1.0: 問題の解決方法とデバッグ [10/10]](http://qiita.com/m-shibata/items/ec723b891e59154c5798)

LXC 1.0というタイトルがついているものの、ほとんどは古いLXCでも動くものと思います。しかしながらいくつかの機能については、できるだけ最新のLXC（つまりアップストリームのgitリポジトリにあるもの）を必要とするかもしれません。必要なものは明示し、[Ubuntuのstable backport](https://launchpad.net/ubuntu/+source/lxc)や[PPA上のアップストリームのスナップショット](https://launchpad.net/~ubuntu-lxc/+archive/daily)を導入する方法も説明する予定です。

この最初の記事に、個々の記事へのリンクを追記するつもりです。ブックマークや参照したいのであれば、この記事を使ってください。
Windows Azure モバイルサービスでテーブル操作をREST APIで行う方法


## 概要
- モバイルサービスのテーブル操作（挿入・更新・削除・読み込み）をREST APIにて行う。
- リクエストにはcurlコマンドを使う。

## 方法
コマンドの雛形は以下の通り。
見やすくするために改行をしていますが実際には改行しません。

### 挿入
```
curl https://<service_name>.azure-mobile.net/tables/<table_name>
-H "Accept: application/json" 
-H "X-ZUMO-APPLICATION: <アプリケーションキー> 
-H "Content-Type: application/json" 
-d ‘<JSONデータ>’ 
```

### 更新
```
curl —request PATCH https://<service_name>.azure-mobile.net/tables/<table_name>/<item_id>
-H "Accept: application/json" 
-H "X-ZUMO-APPLICATION: <アプリケーションキー> 
-H "Content-Type: application/json" 
-d ‘<JSONデータ>’ 
```

### 削除
```
curl —request DELETE https://<service_name>.azure-mobile.net/tables/<table_name>/<item_id>
-H "X-ZUMO-APPLICATION: <アプリケーションキー> 
```

### 参照（読み込み）
参照については、GETリクエストでパラメータを組み立てるだけなので説明は不要と思います。
詳細は[レコードのクエリの操作（公式リファレンス）](http://msdn.microsoft.com/ja-jp/Library/jj677199.aspx)を参照して下さい。

##その他
カスタムAPIのコマンド操作については、[Azure Mobile Services でアクセス許可を制限した Custom API に カジュアルにアクセスする](http://tech.tanaka733.net/entry/2013/12/16/azure-mobile-services-custom-api)が参考になります。

## 参考
- [モバイル サービスのテーブルに対する操作（公式リファレンス）](http://msdn.microsoft.com/ja-jp/library/windowsazure/jj710104.aspx)
Raspberry Piで Audio の録音

Raspberry Piを使ってAudioを録音する仕組みが必要になったので,ちょっと備忘録.

### 準備
道具をAmazonで買ってくる.

* [Raspberry Pi Type B 512MB](http://www.amazon.co.jp/gp/product/B00EWGFMSI)
* [iBUFFALO USBオーディオ変換ケーブル](http://www.amazon.co.jp/gp/product/B007WPMIN8)
* [audio-technica GOLDLINK Fine ステレオミニ](http://www.amazon.co.jp/gp/product/B000UDACQO)

その後,必要なソフトをInstall

```shell-session:01
raspberrypi - pi% sudo apt-get install alsa-utils sox libsox-fmt-all
```

### 確認

Deviceが認識されているかの確認.

```shell-session:02
raspberrypi - pi% lsusb                                                                                                         
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 0d8c:013c C-Media Electronics, Inc. CM108 Audio Controller

raspberrypi - pi% arecord -l                                                                                                     
**** List of CAPTURE Hardware Devices ****
card 1: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

```

### 録音

確認した結果HWはcard 1っぽいので結構当てずっぽうで録音コマンドを叩いてみる.

```shell-session:03
raspberrypi - pi% export AUDIODRIVER=alsa
raspberrypi - pi% AUDIODEV=plughw:1,0 rec test.mp3
```

録音できたっぽい.

### 再生

```shell-session:04
raspberrypi - pi% AUDIODEV=plughw:0,0 play test.mp3
raspberrypi - pi% AUDIODEV=plughw:1,0 play test.mp3
``` 

の両方で再生できた.plughw:0,0だとRaspberry Pi本体のAudio出力から,plughw:1,0だとUSB側から出力される.

### まとめ

* Raspberry PiからAudio変換ケーブルを使って録音することに成功した.
* コマンドラインベースで手打ちなので次回はスクリプトから呼び出したい.

### 参考
[Raspberry Piで録音再生](http://shokai.org/blog/archives/7914)
eclipseのデバッグ用署名鍵を別の署名鍵に設定したい場合


デバッグ用の署名鍵はEclipseのPreferencesのAndroid, Build, Custom debug keystoreで設定可能ですがalias名やパスワードの変更が必要です。

```bash
#!/bin/sh

keystore=(設定したい署名鍵のファイルパス)
old_alias=(設定したい署名鍵のalias名)
storepass=(設定したい署名鍵のstore password)
keypass=(設定したい署名鍵のalias password)

debugkeystore=debug.keystore
debugalias=androiddebugkey
debugpassword=android

cp ${keystore} ${debugkeystore}

# alias名変更
keytool -changealias -keystore ${debugkeystore} -alias ${old_alias} -destalias ${debugalias} -keypass ${keypass}  -storepass ${storepass}

# キーストアのパスワードをandroidに変更
keytool -storepasswd -keystore ${debugkeystore} -new ${debugpassword} -storepass ${storepass}

# androiddebugkeyのパスワードをandroidに変更
keytool -keypasswd -keystore ${debugkeystore} -alias ${debugalias} -new ${debugpassword} -storepass ${debugpassword} -keypass ${keypass}

```
境界線分　：　オフラインどう書く第16回


（元ネタは http://nabetani.sakura.ne.jp/hena/ord16boseg/ ）

これも基礎的なリスト操作で楽に書ける。
肝心の数え上げ部分は蓄積引数2つ使って再帰してるのがダサいので
気に入らないといえば気に入らない（ループに等価なのは望ましいとしても）。
二進表現に直して処理する箇所も筋悪のやり方だが、
Numericは使いにくいしかといってLens使うのも癪。


```hs:Borderline.hs
module Main where

import Data.List
import Control.Applicative
import System.Environment (getArgs)

data Cell = B | W deriving (Eq, Show)
type Field = [[Cell]]

countpath :: Field -> [[Int]]
countpath [] = []
countpath [x] = []
countpath (x:y:xs) = cp x y 0 [] : countpath (y:xs)
  where
  	cp [] [] num list = num:list
  	cp (a:as) (b:bs) num list = case a==b of
  	  True -> cp as bs 0 (num:list)
  	  False -> cp as bs (num+1) list
  	cp _ _ _ _ = undefined

aggregate :: Field -> [Int]
aggregate f = count $ filter (/=0) $ concat $ (countpath f)++(countpath $ transpose f) 
  where count xs = [\n -> length.filter (==n)] <*> [1..6] <*> [xs]
 

-- 個人的メモ：自分でchunksとか書かずにData.List.Split (chunksOf)を使うこと。

construct :: String -> Field
construct = take 6 . chunks 6 . concat . map oct . parse
  where 
    parse  str = map read $ transpose [str]
    chunks n xs = take n xs : chunks n (drop n xs)
    oct n = (if elem rem [4,5,6,7] then B else W):
            (if elem rem [2,3,6,7] then B else W):
            (if elem rem [1,3,5,7] then B else W):[]
      where rem = mod n 8

solve = aggregate.construct

main = solve<$>concat<$>getArgs >>= print
```
RailsでTwilioを使ってみた

##twilioとは
twilioは電話や音声メッセージ、SMSなどを使うことの出来るAPIである。日本語のドキュメントも用意されていて簡単に使えて便利なのだが無料版では使い勝手が凄く悪いので個人で利用する場合は有料アカウントをとらざる終えない場合になってしまうことが多い


##ドキュメント
[公式](http://twilio.kddi-web.com/)
[公式チュートリアル](https://jp.twilio.com/docs/quickstart)
[git ruby](https://github.com/twilio/twilio-ruby)

[電話基本](http://blog.twilio.kddi-web.com/2013/05/21/ruby%E3%81%8B%E3%82%89%E9%9B%BB%E8%A9%B1%E3%82%92%E3%81%8B%E3%81%91%E3%82%8B/)
[便利ツール](http://dev.classmethod.jp/etc/twim11/)

##電話機能の使い方
まずは公式ページでアカウント登録をしてtwilow電話番号を取得する

sid, token、twilioの電話番号を取得する(取得するのは米の電話番号が良いですよ!)

その後、Gemのインストールをします

```bash:gem
gem "twilio-ruby"
```

```bash:ターミナル
bundle
```

modelの中に作成したcall.rbに記述するだけ

```ruby:model
class Call
  def self.voice_message
    account_sid = ENV['TWILIO_SID']#中身は自分のものに変える
    auth_token = ENV['TWILIO_TOKEN']#中身は自分のものに変える
    client = Twilio::REST::Client.new(account_sid, auth_token)
    client.account.calls.create(
      from: '+8100000000', # twilio電話番号
      to:   '+8100000000', # 宛先の電話番号
      url: 'http://huntr-static.s3.amazonaws.com/mother/call.xml', #再生される音声の内容が書かれたxmlのURL
      method: 'GET',　#defaltではこれがpostになっているためCall内容が反映されずエラーになるから気をつける
    )
  end
end
```


あとはこのメソッドを呼びだす

```bash:コンソール
Call.voice_message
```
とするだけでxmlがパースされたコンテンツの電話がかかってくる

ちなみURLの内容は

```xml:xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say language="ja-jp">おかんから、メッセージがあります</Say><!--読み上げられる内容-->
    <Play>http://huntr-static.s3.amazonaws.com/mother/test.mp3</Play><!--再生されるmp3-->
</Response>
```

のような感じで実装できる

今回私は[サイバーダック](http://cyberduck.softonic.jp/mac)を使ってファイルをアップしたが勿論なんでもいい
*ただしサイバーダックを使う場合はすべてのファイルをeveryone readのアクセス設定にしてないとエラーとなるので気をつけてください

##SMS機能の使い方
gemをインストールするまでは同じ
あとはコントローラーの中身を変えるだけ

```ruby:コントローラー
class SmsSender
  def self.send_sms
    account_sid = ENV['TWILIO_SID']
    auth_token = ENV['TWILIO_TOKEN']
    client = Twilio::REST::Client.new(account_sid, auth_token)
    client2 = Twilio::REST::Client.new(account_sid, auth_token)

    client.account.messages.create(
      from: '+0000000',
      to:   '+00000000',
      body: "ヽ(･∀･)人(･∀･)ﾉ文章の中身ヽ(･∀･)人(･∀･)ﾉ",
    )
```


*注意　取得したtwilioの電話番号が日本のものである場合はSMSは使えないので注意しましょう。アメリカの電話番号でないとこの機能は使えません。このことに気づかず長い時間を無駄にしました( *´Д⊂ ｸﾞｽﾝ…
Matplotlibによるヒストグラム透明重ね書き


Pythonにおいてmatplotlibを使って透明なヒストグラムを重ね書きする．

```python:histgram.py
import numpy as np
import matplotlib.pyplot as plt
a = np.random.randn(10000)
plt.figure()
plt.hist(a-1, bins=100, alpha=0.3, histtype='stepfilled', color='r')
plt.hist(a+1, bins=100, alpha=0.3, histtype='stepfilled', color='b')
plt.show()
```

alphaで透明度を調整できます．0で完全に透明．1で透明度0．

実行結果
![hist.png](https://qiita-image-store.s3.amazonaws.com/0/35293/58ab6804-fe21-4fb0-0b66-dfb8fb52d42a.png "hist.png")
Sprout by pivotal labs の紹介（aka pivotal_workstation）

Mac OS X 向け開発環境プロビジョニングのツールとして [Boxen by GitHub](http://boxen.github.com/) が有名だが、 [Sprout by Pivotal Labs](https://github.com/pivotal-sprout/sprout) (以下pivotal-sprout)も同じ目的のツールである。日本語情報が全然無いようなので軽く紹介する。

最大の特徴は、BoxenがPuppetベースなのに対し、pivotal-sproutは **Chefベース** であること。

他にも以下のような違いがある。

### homebrew、rbenvの特殊インストール縛りは無い

* Boxenは独自のディレクトリに上掲のツールを入れるので、既存の環境の場合アンインストールが必要なことがある。

### 上に関連して、イニシャルスクリプトとして使いやすい

* homebrewもrbenvもごく普通の入れ方をするので、その後pivotal-sproutで管理しなくても普通に使える。

### Chefが得意ならカスタマイズもハックも楽

* ぼくはそうなので...
* `brew` と言うリソースがあるので入れていないものは個人のレシピ集を作って、それ経由で入れればいい。brewで入らない場合も `execute` + `creates` オプションあたりでインストールコマンドを羅列すればたいてい何とかなる。 `dmg_package` というのもあるらしい、詳しくはソースへ。

ちょうべんりだが、デメリットもあって、

### 日本語情報が全然ない

* 最大のもの。おまけに、用意されたレシピの意味がぱっと見よく分からない。Chefのレシピを実際に読んで追える程度に精通してるのなら良いツールになってくれるのでは？

### デフォルトでよくわからないアプリを一杯入れる

* forkしてsoloistrcをコメントアウトすればいいだけだが、「これ、コメントアウトしていいのかな？」みたいなレシピ名が結構あってヤバい。まあ、謎アプリを我慢したり、むしろ使いこなす方向もあると思う。

### レシピが凄いとっ散らかっている

* 旧名「pivotal_workstation」で、徐々にsprout-*のネームスペースに移動してるっぽいけど、pivotal_workstationと言う名前空間の下に残ってるものも沢山ある。なのでgitのレシピ一つにしてもどっちなのかクックブック内部に確認しに行かなければならなかったりする。

つまるところPuppetに慣れているのならBoxenで、Chefに慣れているのならpivotal-sproutで環境管理すればいいんじゃないでしょうか。あと、集団で環境を合わせたいのならBoxen-webとかがあるBoxenの方が楽かもしれない。逆にpivotal-sproutはその後のマシンを管理しないイニシャルスクリプトですよ、と割り切ることもできる。

あと、どっちも **なんだかんだプロビジョニングが失敗しまくる** ので、直しては実行しまた直しになりがちだと思う。まあ、ベキトーセーがあるので何度実行しても安心なんですが！

プロビジョニングこけまくるのにそれって意味あるのかと言う話もあるが、Chefさんがこけるのを直す駆動でセットアップするのは割と指向性として楽な感じはする。ちくちくGistのメモを見ながらコピペでやるより疲れないと言うか。というか、まあ、そんなコケないっすよ（どっち）。

あとあと、pivotal-sproutはbrew実行時のcurlがなぜか死にがちだったので、curlプロセスを強制終了したりしたことがあった。

そんな感じ。

----

pivotal-sprout の実行はsprout-wrapと言うプロジェクトを利用する。 [README見れ](https://github.com/pivotal-sprout/sprout-wrap#readme) で終わりだが、一応補足しとく。

* コマンドライントゥールはもちろん入れる。他に必要なツールは無い。gitもrubyも最初からあるやつで良し。
* sprout-wrapをホークしとく。
* `soloistrc` を編集しとく。この設定YAMLの意味はシェフマスターなら見れば分かると思う。
* sprout-wrap プロジェクトのルートで以下（System Ruby 推奨）

```bash
git clone https://github.com/pivotal-sprout/sprout-wrap.git
cd sprout-wrap
sudo gem install bundler
sudo bundle
bundle exec soloist
```

Mountain LionでもMavericksでも大丈夫そう。

終わり。

外部レシピ、カスタムレシピを使う場合はCheffile、librarian-chefについて、Googleと言う凄い便利なサイトで検索してほしい。

ぼくはカスタムレシピを [udzura_workstation](https://github.com/udzura/udzura_workstation) として公開している。チンケなレシピだけれど参考になるのなら何より。

----

[Pivotal Sproutの歴史。](http://sprout-talk.cfapps.io/#)