OmniAICreator/Qiita-1.07M huggingface dataset:
Goでファイルの存在チェック

# 2014-09-01 追記

http://qiita.com/suin/items/b9c0f92851454dc6d461#comment-70c188ae8ad783fe57f9 に正しい方法が書かれていました。ありがとうございます！

```go
func Exists(filename string) bool {
    _, err := os.Stat(filename)
    return err == nil
}
```

# ここから元記事

http://stackoverflow.com/questions/12518876/how-to-check-if-a-file-exists-in-go#answer-12527546
で紹介されていますが、os.Stat()してerrを!os.IsNotExist(err)で判定するのが良いようです。

https://github.com/hnakamur/commango/blob/master/os/osutil/osutil.go

```go
package osutil

import (
	"os"
)

func Exists(name string) bool {
	_, err := os.Stat(name)
	return !os.IsNotExist(err)
}
```

なぜ、IsExist(err)のほうを使わないかというと
http://golang.org/src/pkg/os/error_posix.go
を見ればわかります。IsExist()はerrがnilのときはfalseを返すからです。err == nil | os.IsExist(err)と書けばよいという話もありますが、errがnilのときfalseを返すということはIsExist()はファイル上書きの時に存在していたらエラーという時のためにあるのだと思います。syscall.EEXISTと比較している箇所もありますし。

IsNotExistのほうなら、os.IsNotExist(err)自体がerrがnilの場合はfalseなのでerr == nil | !os.IsNotExist(err)書かなくても!os.IsNotExist(err)だけでよいわけです。
ターミナルを便利にする設定色々


毎度忘れて調べたりするのでメモ。

- 2015/12/18、ちょっと見にくかったので修正（追加なし）

## タブ補完時に、大文字と小文字を見分けない

```~/.inputrc
set completion-ignore-case on
```

- [Terminalで大文字小文字を区別せず補完する - Fight the Future](http://jyukutyo.hatenablog.com/entry/20081016/1224132898)

## rubygemsインストール時にrdocなどは追加しない

```~/.gemrc
gem: --no-ri --no-rdoc
```

- [RubyGemsでgemのインストール時に--no-ri --no-rdocをデフォルトにする - アインシュタインの電話番号](http://blog.ruedap.com/2011/05/14/ruby-gem-install-no-ri-no-rdoc-gemrc)

## irbの日本語文字化けを直す

```~/.bash_profile
alias irb="irb --noreadline"
```

- [Mac OS X Lion で rvm 管理下の Ruby の irb で日本語が文字化けするのを直した | EasyRamble](http://easyramble.com/fixed-garbled-characters-on-irb.html)

## gitのブランチ名を表示する

```bash
$ brew install git
```

```~/.bash_profile
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
```

- [bash_completionで「-bash: __git_ps1: command not found」となった時の対処法 - くりにっき](http://sue445.hatenablog.com/entry/2012/08/30/005627)
Homebrewを使ってMacにOpenCVを導入するまで


参考書籍を読みつつOpenCVをインストールするまでのメモ。
今回はHomebrewからパッケージをインストールするだけの簡単なお仕事…でもなかったので書籍になかったつまづきポイントをまとめてます。

## 環境
MacBook Air Mid 2012
OS X Mountain Lion 10.8.4
Core i5 1.8GHz
8GB RAM

## Homebrewのセットアップ
とりあえず

```
brew doctor
brew update
```
を実行したところupdateでエラー。

```
error: The following untracked working tree files would be overwritten by merge:
	Library/Formula/haxe.rb
	Library/Formula/log4shib.rb
	Library/Formula/opensaml.rb
	Library/Formula/osm2pgsql.rb
	Library/Formula/re2.rb
	Library/Formula/rebar.rb
	Library/Formula/xml-security-c.rb
	Library/Formula/xml-tooling-c.rb
Please move or remove them before you can merge.
```
[SOF](http://stackoverflow.com/questions/10762859/brew-update-the-following-untracked-working-tree-files-would-be-overwritten-by)によると、brewのローカルブランチが古いからresetしろとのこと。

```
~ root# cd /usr/local
local root# git fetch origin
remote: Counting objects: 121, done.
remote: Compressing objects: 100% (62/62), done.
remote: Total 111 (delta 51), reused 100 (delta 40)
Receiving objects: 100% (111/111), 26.87 KiB, done.
Resolving deltas: 100% (51/51), completed with 7 local objects.
From https://github.com/mxcl/homebrew
   8a77613..6305d2d  gh-pages   -> origin/gh-pages
   9e8ffa9..3e7f9ae  go         -> origin/go
   de55321..fbc33db  master     -> origin/master
local root# git reset --hard origin/master
HEAD is now at fbc33db libcppa: 0.7.1 - Actor Model implementation for C++11
```
問題なくbrew updateは通った。

## おまちかねのOpenCVインストール
さて、OpenCV用のパッケージ入れます。

```
$ brew install opencv                                                                                                                                                     Warning: It appears you have MacPorts or Fink installed.
Software installed with other package managers causes known problems for
Homebrew. If a formula fails to build, uninstall MacPorts/Fink and try again.
Error: No available formula for opencv
```
Warningの件はMacPorts入れてたのが原因。
現在MacPortsで管理してるパッケージはないので削除することに。

```
$ sudo port -f uninstall installed
$ sudo rm -rf /opt/local
```
で、OpenCVライブラリが見つからないエラーは[ここ](http://qiita.com/kon_yu/items/f3eed19f397f2226c32c)で解決。
デフォルトで入ってないのでscience入れてねというのは罠ですね。

```
$ brew tap homebrew/science
```
このtapというコマンドの説明は[こちら](http://tukaikta.blog135.fc2.com/blog-entry-204.html)で解説されてる。
ようやくインストール。

```
$ sudo brew install opencv
```
おわり。

## 参考資料
[OS XとiOSのためのOpenCV環境構築ガイド](http://www.amazon.co.jp/dp/4877833099/)
マウストラッキングをインタプリタでやってみる

MacOS Xのマウス座標を拾ってみる、というのをコマンドラインベースでやってみようと、
色々見てみたけども、rubyCocoaはこういう用途に向いているかもしれない。

```rb
#!/usr/bin/ruby
require 'osx/cocoa'
while true
	event=OSX::CGEventCreate(nil); 
	pt = OSX::CGEventGetLocation(event); 
	print pt.x, ':', pt.y; print "\n"
	
	sleep 0.1
end
```
```
-- 結果のサンプル
1211.30859375:707.2578125
1121.4375:723.9765625
1000.21875:690.53515625
961.55078125:653.265625
```

マウス座標は整数値だと思っているので
小数点がとれてくるのがいまいち理解できてないところ。。
jQueryでクロスドメインAjaxを実現する方法(jquery.xdomainajax.js)

ブログに書いたよ。
<a href="http://d.hatena.ne.jp/replication/20130831/1377932112">jQueryでクロスドメインAjaxを実現する方法(jquery.xdomainajax.js) - 大人になったら肺呼吸</a> <a href="http://b.hatena.ne.jp/entry/d.hatena.ne.jp/replication/20130831/1377932112"><img src="http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/replication/20130831/1377932112" alt="はてなブックマーク - jQueryでクロスドメインAjaxを実現する方法(jquery.xdomainajax.js) - 大人になったら肺呼吸" border="0" /></a>
VisualStudioコード整形ショートカット

Visual Studio（2010以降）のIDEエディタ内で、コードの一括自動インデントを行うキーボードショートカット。下記キーストロークを順番に入力する。

 * ファイル全体：Ctrl+K, Ctrl+D
 * 選択範囲：Ctrl+K, Ctrl+F

http://www.shortcutworld.com/en/win/Visual-Studio_2010.html
Finderでtouch(空ファイルを作成)

コンテキストメニューから新規フォルダを作成する方法はあるが、新規ファイルを作成、というのはなかったので、これもAppleScriptとSpark.appの組み合わせで解決してみました。

```applescript
-- 空ファイルをカレントディレクトリに作成
tell application "Finder" to make new file at (the target of the front window) as alias
```

問題は、どのキーを割り当てるか。
悩ましいのだけど、ひとまず Cmd+Nに割当してます。
brew でインストールした jenkins でハマった @ OSX with tmux

deamonで動かす予定で
`launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist`
で起動して、githubに繋がらないのでハマっていた。

シェルからgithubにはアクセスできる。
`brew install jenkins` ではログインユーザで動作するので、アクセスできるはずだった。

```
$ brew info jenkins 
jenkins: stable 1.524, HEAD
http://jenkins-ci.org
/usr/local/Cellar/jenkins/1.524 (5 files, 179M) *
  Built from source
From: https://github.com/mxcl/homebrew/commits/master/Library/Formula/jenkins.rb
==> Caveats
To reload jenkins after an upgrade:
    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist

WARNING: launchctl will fail when run under tmux.
```

`WARNING: launchctl will fail when run under tmux.`
tmux環境からlaunchctlすると駄目って書いてあって、まさにこの状況だった。

別ターミナルで
`launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist`
したら問題なかった。
Finder項目をキーボードショートカットでラベル付けする

Finder のラベル機能は便利ですが、コンテキストメニューからマウスポイントすることを強いられるため、大量のファイルを分類したり、ささっとファイルをマーキングしたりする用途には、不向きな導線です。

ショートカットでラベリングできたら便利かと思い、スクリプトを書いてみました。
Spark.app で適当なショートカットを割りあてるとワンストロークでラベリングできて爽快です。

```applescript:changeFinderLabel.scpt
on run
	tell application "Finder"
		repeat with curItem in (selection as list)
			set label index of curItem to ((label index of curItem) + 1) mod 8
		end repeat
	end tell
end run
```

ラベルなしの状態から、実行する度に順繰り色が変わります。
ruby の Hash#shift が遅い

ruby2.0 の Hash クラスを queue として使おうと思い、shift の代わりに first + delete という処理をしていた。

しかし、Hash#shift があることに気づき、なーんだこれ使えばいいのかと思ったものの、Hash#shift に置き換えたら遅かった。

で。どれくらい遅いかという話。

```ruby
require "benchmark"

def test_shift(size)
  data=Hash[ size.times.map{ |a| [a,a] } ]
  Benchmark.realtime{
    while( size/2 < data.size ) do
      data.shift
    end
  }
end

def shift(v)
  return nil if v.empty?
  a=v.first[0]
  b=v.delete(a)
  [a,b]
end

def test_myshift(size)
  data=Hash[ size.times.map{ |a| [a,a] } ]
  Benchmark.realtime{
    while( size/2 < data.size ) do
      shift(data)
    end
  }
end

R=(10..16)
puts R.map{ |s| "%.4f" % test_shift( 1<<s ) }.join(",")
#=> 0.0016,0.0080,0.0360,0.1718,0.8168,3.5163,14.7884

puts R.map{ |s| "%.4f" % test_myshift( 1<<s ) }.join(",")
#=> 0.0004,0.0008,0.0015,0.0031,0.0064,0.0205,0.0246
```

ご覧のとおり、6万要素ぐらいあると、自前の実装の shift よりも500倍ぐらい遅い。

なにか見落としている気もするんだけど、どうなんだろ。
第13回オフラインリアルタイムどう書くの参考問題をF#で 

問題は[「増やす減らす二倍する」](http://nabetani.sakura.ne.jp/hena/ord13updowndouble/)

ダイクストラ法もどき。副作用を使った書き方を勉強したので2時間以上かかった。
（追記）どうせmutableなら.NETのコレクションを使うことにする。

```fsharp:doukaku13pre.fs
open System.Collections.Generic

let tree = List<_>([[0]])
let set = new HashSet<int>()

let rec find i x =
  let current =
    if i < tree.Count then
      tree.[i]
    else
      let next =
        tree.[tree.Count - 1]
        |> List.collect (fun x -> [x+1; x-1; x*2])
        |> List.filter (fun x -> (x >= 0) && set.Add(x))
      tree.Add(next)
      next
  if List.exists ((=) x) current then i else find (i+1) x

let solve s = (string)(find 0 ((int)s))

(* for test *)

type TestResult = Success | Failure

let test target expected =
  let actual = solve target
  printfn "%A" (if expected = actual then Success else Failure)

[<EntryPoint>]
let main args =
  test "59" "9"
  test "10" "5"
  test "11" "6"
  test "12" "5"
  test "13" "6"
  test "14" "6"
  test "15" "6"
  test "16" "5"
  test "17" "6"
  test "18" "6"
  test "27" "8"
  test "28" "7"
  test "29" "8"
  test "30" "7"
  test "31" "7"
  test "32" "6"
  test "33" "7"
  test "34" "7"
  test "35" "8"
  test "41" "8"
  test "71" "9"
  test "1023" "12"
  test "1024" "11"
  test "1025" "12"
  test "1707" "17"
  test "683" "15"
  test "123" "10"
  test "187" "11"
  test "237" "12"
  test "5267" "18"
  test "6737" "18"
  test "14796" "20"
  test "18998" "20"
  test "23820" "20"
  test "30380" "21"
  test "31119" "21"
  test "33301" "20"
  test "33967" "21"
  test "35443" "22"
  test "35641" "22"
  test "43695" "23"
  test "44395" "23"
  test "44666" "22"
  test "987" "14"
  test "1021" "13"
  test "1019" "13"
  test "1015" "13"
  test "1007" "13"
  test "1011" "14"
  test "1003" "14"
  test "983" "14"
  test "999" "14"
  test "2731" "18"
  test "6827" "20"
  test "10923" "21"
  test "27307" "23"
  test "43691" "24"
  test "109227" "26"
  test "174763" "27"
  0
```
Padrino 0.11 以降で Better Errors を使う


Padrino 0.12.0 以降では protect_from_csrf に except オプションを指定します。

```ruby:app/app.rb
module Sample
  class App < Padrino::Application
    #...
    set :protect_from_csrf, except: %r{/__better_errors/\d+/\w+\z}
```

以降は、Padrino 0.11.x でのお話です。

---

Better Errors の導入自体は[以前書いた記事](http://qiita.com/tyabe/items/1512c5c4aab5d51c811a)の通りでいいのですが、protect_from_csrf が有効となっている場合 ( Padrino 0.11 からデフォルトで有効 ) には、Better Errors が表示するページからの HXR が通らずページ右側が表示されません。

これでは Better Errors を使っている意味がまるっきり無くなってしまうので、とりあえず、以下のパッチで回避しました。

1.指定したパスを保護対象外とするパッチを lib の下に置く

```ruby:lib/rack_protection.rb
if Padrino.env == :development
  module Rack
    module Protection
      class AuthenticityToken
        def accepts_with_allowed_path?(env)
          if defined?(Padrino::Application.exclude_from_protection)
            [Padrino::Application.exclude_from_protection].flatten.each do |path|
              return true if Regexp.new(path).match(env['REQUEST_PATH'])
            end
          end
          accepts_without_allowed_path?(env)
        end
        alias_method_chain :accepts?, :allowed_path
      end
    end
  end
end 
```

2.保護対象外とするパスを Better Errors の設定と一緒に指定する

```ruby:config/boot.rb
if Padrino.env == :development
  # Setup better_errors
  Padrino::Application.use BetterErrors::Middleware
  BetterErrors.application_root = PADRINO_ROOT
  BetterErrors::Middleware.allow_ip! ENV['TRUSTED_IP'] if ENV['TRUSTED_IP']
  Padrino::Application.set :exclude_from_protection, '/__better_errors' # Append this
  # ...
end
```

Rack:: Protection 側をいじるのは嫌だったのですが、これしか思いつきませんでした…。
Rails3.2 to Rails4 アップデートしてみた

* gemのupdate

```rb
ruby '2.0.0'
gem 'rails', '>= 4.0.0'
gem 'sass-rails',   '~> 4.0.0'
gem 'coffee-rails', '~> 4.0.0'
gem "railties", ">= 4.0.0"
gem "activesupport", ">= 4.0.0"
gem 'rails_12factor', group: :production
```
* Rails4へupdate

```rb
bundle exec rake rails:update
```
Rails4用のファイルが吐かれるので, git diffして差分を確認して取捨選択.　

* 実行していないmigrationがあると、errorを吐くようになった

* 画像を添付しても保存ができず、Can't mass-assign protected attributes for HOGEと言われる
paperclip側の問題. versionを3.5に上げて、gem 'protected_attribute'をしない
http://stackoverflow.com/questions/18453219/paperclip-gem-with-rails-4-doesnt-save-non-file-fields

* Herokuにdeployするならこちらも参照を
https://devcenter.heroku.com/articles/rails4

* こんなgemもある
https://github.com/alindeman/rails4_upgrade
What is Spring?

## Spring?
一言にSpring言っても、Spring関連プロジェクトを指す場合とSpring Framworkを指す場合があるので、ここで整理。

### Springの主要プロジェクト
* **Spring Framework** DI、AOPなどを実現するSpringのメインプロジェクト。Spring MVC,Spring JDBCもここに含まれる。
* **Spring Security** XML定義だけで認証、認可機能の実現。要はログインやアクセス制限などを行う。
* **Spring Web Flow** 条件分岐などを設定ファイルで定義し、Spring MVCだけでは複雑になりがちな処理を、シンプルな記述にする。
* **Spring Batch** バッチ処理を実現するためのフレームワーク。設定ファイル等で、処理を定義することで、プログラムをシンプルにすることができる。
* **Spring Roo** 設定ファイルやMVCファイルの自動生成を行うScaffold機能の提供。
* **Spring Mobile** クロスプラットフォームのモバイル向けWebアプリケーション開発フレームワーク。 Spring MVCをモバイル向けにカスタマイズしたもので、簡単にモバイル版Webアプリケーションを作成できる機能を提供。
* Spring Integration
* Spring Data
* Spring Web Services
* Spring Social
* Spring Android

[Springプロジェクト](http://www.springsource.org/projects)


### Spring Framework
上記の通り、Spring FrameworkはSpring Projectの中のメインかつ1プロジェクト。

Spring Frameworkというと、特にDI、AOPを指していることが多い。
DI、AOPはSpring Frameworkの中でも中心の機能なので、Springを使うと言えば、まずこの機能を使用することが多い。
sudo -s って何？

nginx のインストールしようと思ったら `sudo -s` というのが出てきた。

`man sudo` によると

```
      -s [command]
                 The -s (shell) option runs the shell specified by the SHELL
                 environment variable if it is set or the shell as specified
                 in the password database.  If a command is specified, it is
                 passed to the shell for execution via the shell's -c
                 option.  If no command is specified, an interactive shell
                 is 
```
ということでシェルを指定するらしいんだけど、実際は現在のユーザーがrootに変更される。

## 何故か？

初めは意味がわからなかったけど、これはつまり今使ってるシェルがbashなら

`$ sudo /bin/bash` と同じことになるらしい。

例えば `$ /bin/bash` と入力すると画面の見た目は変わらないけど、実際はbashの入れ子構造になってて `$ exit` してもコンソールウィンドウは閉じずに”中の”bashだけが終了される。それを sudo, つまり root 権限で行ってるのでユーザーが root に変更されるというわけだ。多分そういうことだと思う。

もっと詳しく知りたい人は下にある「"su -s" と "sudo -s" の違いって何？」をお読みください。
私はよくわからなくなってきたのでそっとタブを閉じました。

## 参考

linux - What does "sudo -s" actually do? - Super User
http://superuser.com/questions/306923/what-does-sudo-s-actually-do

linux - What's the difference between the commands "su -s" and "sudo -s"? - Super User http://superuser.com/questions/29/whats-the-difference-between-the-commands-su-s-and-sudo-s
MacにTracをインストール

Redmineを入れるよりよほど手軽に入れられます。
Tracの欠点は日本語でTrac内検索が貧弱な点。

インストール
====

```bash:
$ sudo easy_install trac
$ mkdir $HOME/trac && cd $HOME/trac
$ trac-admin mac initenv
プロジェクト名、データ保管場所について入力が求められる。Enter押下でよい。
```

管理者権限作成
====

```bash:adminユーザーにTRAC_ADMIN権限付与
$ trac-admin $HOME/trac/mac permission add admin TRAC_ADMIN
```

* id:pass = admin:adminでログインできるように、Digestファイル準備

```bash:
$ cat > $HOME/trac/mac/trac.htdigest <<EOF
admin:tracd:d1d5105feef38ad528a53373c8e5d556
EOF
```

起動スクリプト
====

```bash:start_trac.sh
#!/bin/sh
PROJECT_PATH=$HOME/trac/mac
tracd \
 -a mac,$PROJECT_PATH/trac.htdigest,tracd \
 --port 8000 $PROJECT_PATH \
 -b localhost \
 -s \
 -d
```

起動
====

```bash:起動
$ sh start_trac_sh
```
http://localhost:8000 にアクセスすると利用できる。外からはアクセスできない。
!![自分用メモ]!!次買うスマホ検討中

なんだかiPhoneも飽きたし、Androidも面倒くさそうなので同じ面倒くさいならWindowsPhoneはいいかもしれない。

## 検討機種

* iPhone 5S
	* 9/10 発表会待ち
* Android
	* [三国大洋の箸休め（11）：話題のグーグルフォン「Moto X」～米有力レビュアーの評価やいかに？ - ＠IT](http://www.atmarkit.co.jp/ait/articles/1308/27/news017.html "三国大洋の箸休め（11）：話題のグーグルフォン「Moto X」～米有力レビュアーの評価やいかに？ - ＠IT")
	* Nexus Phone Q4 情報待ち
* WindowsPhone
	* [Nokia Lumia 520 (SIMフリー, Cyan)価格&特徴 - EXPANSYS 日本](http://www.expansys.jp/nokia-lumia-520-unlocked-cyan-247072/ "Nokia Lumia 520 (SIMフリー, Cyan)価格&特徴 - EXPANSYS 日本") 

## 使えれば良いアプリ

* メール
* GoogleMap 
* RSS
* Pocket
BeagleBoneでPWM出力


ubuntu 13.04をBeagleBoneに入れたらkernelが3.8になったせいか
/sys/devicesの構成が変わってpwm出力の方法が今までのと変わってたのでメモ

下ごしらえ
-----------

以下のコマンドで/sys/devices/ocp.2/pwm_test_P9_21.14にP9の21番ピンにPWM出力するためのファイルが出来上がる
/sys/devices/ocp.2/pwm_test_P9_21.14は環境で数字が違うかも

* 要root

```bash
SLOTS=/sys/devices/bone_capemgr.7/slots
echo am33xx_pwm     > $SLOTS
echo bone_pwm_P9_21 > $SLOTS
cd /sys/devices/ocp.2/pwm_test_P9_21.14
```

PWM出力
-------

10ms周期で2ms間オンにする

```bash
echo 10000000 > period
echo  2000000 > duty
echo 1 > run
```

runに1を書くと出力開始、0を書くと出力停止

サーボへの出力
----------------

サーボは大抵10〜20ms周期で1.5msで中立点

```bash
echo 2000000 > period
echo  150000 > duty
echo 0 > polarity
echo 1 > run
```

polarityは極性の設定。
初期値だと1になっていて、dutyで1.5msと設定としたら、1.5msオンで18.5msオフとなる。
それだとサーボが動かなかったので逆転しておく。
これで、dutyが100000〜200000くらいでサーボが動く
ApacheのSSLCipherSuiteにRC4を設定すべきではない

Apacheに限らないが、暗号化方式としてRC4暗号が最優先に設定されていることがままある。
これは必ずしもいいとは言えない・・・ので、その理由をまとめてみた。

そもそもRC4がよく設定されているのには理由がある。
過去BEASTという攻撃方法が発見されCBC暗号(Cipher Block Chaining：一定の長さごとに暗号化を行う方式)は全部危ない！？という感じになった。そこで登場したのがストリーム暗号の代表格RC4であり、これに設定すればＯＫ、という流れが今にも至っているのだ。
[BEAST攻撃について](http://bizex.goo.ne.jp/column/ip_16/84/61/)

ただ当時とは状況が変わり、RC4を設定するのが最適とは言えなくなってきた。

## 理由1 RC4は非推奨となった
まず有権者に訴えたいのは、現在RC4は脆弱性が発見され、「電子政府における調達のために参照すべき暗号のリスト（CRYPTREC暗号リスト）」にて推奨されない運用監視暗号の対象になっている、ということであります。

[電子政府における調達のために参照すべき暗号のリスト（CRYPTREC暗号リスト）](http://search.e-gov.go.jp/servlet/Public?CLASSNAME=PCMMSTDETAIL&id=595212035&Mode=2)

少なくとも攻撃が困難であるSSL/TLS1.0以上で運用を行う必要がある。
[ストリーム暗号RC4の安全性評価](http://www.cryptrec.go.jp/estimation/techrep_id2205.pdf)

## 理由2.CBC暗号利用時の対策が実装されている
当初は TLS1.1/1.2 でないと対策はできず、これに対応しているサーバー/ブラウザはほとんどないから実質無理、ということだった。
[SERVER TECHNOLOGIES - HTTPS BEAST ATTACK](http://contextis.com/research/blog/server-technologies-https-beast-attack/)

実際今もこの状況はあまり変わっていないが、その代わりTLS1.0でも対応できる対策がOpenSSL0.9.6dから実装されている。
[BEAST, OpenSSL and Apache](http://arcticdog.wordpress.com/2012/08/29/beast-openssl-and-apache/)

SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS というオプションを **無効にする** ことで対応が可能になっている。これはSSL_OP_ALLの設定にも含まれるが、SSL_OP_ALLを設定するとバージョンによってはバグが発生したり他の対策とバッティングしてSSL_OP_DONT_INSERT~が有効になってしまうこともあるので注意が必要だ（命が惜しかったら最新版にすべきか。こちらを要確認→[OpenSSL](http://www.openssl.org/)）。
※また、SSL_OP_DONT_INSERT~を無効にすると一部携帯端末のブラウザで表示ができなくなることがあるので、設定時は要確認。

[「OpenSSL」におけるバージョン・ロールバックの脆弱性 (0.9.8未満)](http://www.ipa.go.jp/security/vuln/documents/2005/JVN_23632449_OpenSSL.html)
[OpenSSL における暗号スイートのダウングレードに関する脆弱性 (0.9.8q未満、1.0.0c未満)](http://www.ipa.go.jp/security/vuln/documents/2005/JVN_23632449_OpenSSL.html)
[SSL_OP_ALLを設定するとBEAST対策の設定が無効化される(Apache2.4.4)](https://issues.apache.org/bugzilla/show_bug.cgi?id=53899)

## 理由3 そもそもBEASTの攻撃条件はかなり厳しい
BEASTを成立させるためには1.パケットを全部盗聴できて 2.任意のリクエストをサーバーに送信できる必要がある。最近はどのブラウザでもSameOriginPolicyの実装があり、2は厳しい(BEASTのデモでもJavaアプレット/Websocket脆弱性を利用していたようだ(当然もう修正されている))。

またブラウザ側の対策も進んでいる。
[BEAST/SSLの脆弱性を突く「BEAST攻撃」って何だ？](http://j-net21.smrj.go.jp/develop/digital/entry/001-20120229-01.html)
[SSL/TLSの脆弱性を攻撃する”BEAST”を防ぐ修正をChromeが追加](http://d.hatena.ne.jp/sen-u/20110922/p1)

当然新しい技術と共に抜け穴は出てくるであろうが、それと同じくらい対策も進んでいるといえる。
そのため、「BEASTが怖いからRC4」というのはより怖いほうを選択してしまっているのでは？という気がするのである。
enhanced-ruby-modeの概説

[enhanced-ruby-mode](https://github.com/zenspider/enhanced-ruby-mode)はEmacsのメジャーモードのひとつ。標準で付属しているruby-modeの代替を目指して開発されている。[Ripper](http://rurema.clear-code.com/2.0.0/library/ripper.html)（Rubyの標準添付ライブラリ）によって構文解析を行うのが特徴。

## 機能
  * インデント
  * シンタックスハイライト
  * リアルタイムの文法チェック

## よいところ
Ripperを使っているので、厳密な構文解析を行わないruby-modeではパースに失敗するコードでも正しく扱うことができる。

## わるいところ
  * たまにパースが止まる。

## ruby-modeとの互換性
  * `enh-ruby-forward-sexp`, `enh-ruby-backward-sexp`などのコマンドの振る舞いがruby-modeと異なる。
  * シンタックスハイライトの色の対応が一部異なる。

## 開発状況
2010年にGeoff Jacobsen氏によって[jacott/Enhanced-Ruby-Mode](https://github.com/jacott/Enhanced-Ruby-Mode)で開発が始められ、2012年ごろまで同氏によってメンテナンスされていた。現在はRyan Davis氏による[fork](https://github.com/zenspider/enhanced-ruby-mode)を中心に開発が進められている。

## インストール方法
Emacs 24以降ならパッケージマネージャーを使ってインストールできる。

`package-archives`に[MELPA](http://melpa.milkbox.net/)を追加していない場合は追加する。

```el
(add-to-list 'package-archives
  '("melpa" . "http://melpa.milkbox.net/packages/") t)
```

`M-x package-install enh-ruby-mode`を実行するとインストールできる。

## どういう仕組みなのか
ソースコードをerm_buffer.rbのErmBuffer::Parserで処理すると、インデントの開始・終了位置やハイライトの開始・終了位置を示すS式が出力される。EmacsはそのS式に従ってインデントやハイライトを施す。

## ruby/erm_buffer.rbについて
Ripperを利用してRubyのコードをパースしている。

RipperはSAX風のイベントドリブン型インターフェイスを基本に構築されている（`Ripper.sexp`や`Ripper.lex`の出力結果もイベントドリブン型のインターフェースを利用して生成されている）。Ripperのイベントには、字句解析によって発生するscanner event（`Ripper::PARSER_EVENTS`）と、構文解析によって発生するparser event（`Ripper::SCANNER_EVENTS`）の二種類がある。

構文解析ベースのparser eventでは一部のトークンが捕捉できないので、enhanced-ruby-modeはparser eventではなくscanner eventを利用している。scanner eventの情報だけでは正確なシンタックスハイライトやインデントができないため、erm_buffer.rb側で部分的に構文解析を行なっている。

ErmBuffer::Parser#parseで初期化されているインスタンス変数は自前の構文解析のために使われているが、

* 変数名から役割が推測しづらい
* しばしば複数のメソッドから操作されていて全体像を理解しづらい
* Ripperのscanner eventの挙動を把握していないとコードの意図を理解するのが難しい箇所がいくつかある
* コメントがほとんどない

などの理由から、解読するのに手間が掛かる。以下で構文解析に関わる一部のインスタンス変数の役割を説明する。

### `@mode`とは
Ripperのscanner eventを補正するために使われる。詳しくは[Rubyのコードをパースするライブラリ](http://qiita.com/vzvu3k6k/items/dd45ad293ae2d60c7a4e)のscanner eventについての説明を参照。

### `@block`とは
同じくscanner eventの補正のために使われる。ブロックの仮引数を囲む`|`が`on_op`に分類される問題に対応するためのフラグ。

### `@statment_start`とは
`while`, `until`, `rescue`などのキーワードが後置修飾かどうかを確認するために使われる。`while ok?; do(something); end`のようにブロックを取る場合にはインデントを1つ深くし、`do(something) while ok?`のような後置修飾ではインデントはそのままにする。

現在の実装では、下記のように条件式の部分で入れ子になった場合には正常に検出できない。実用上は問題ないと思われる。

```rb
while until condition
      end
end
```

## インデントの種類
* `d` - `do`
* `e` - `end`
* `c` - `method.chain`
Blocksの定義の引き数名は省略しない方がよい

```objc
// 引数名付きの定義
-(void)registerWithName:(NSString*)name
        completionBlock:(void (^)(NSString* accessToken, NSError* error)) completionBlock;

// 補完入力後、特に引き数名を変えない場合はblocksの処理だけ書けばよい
    [self registerWithName:@"fuga"
           completionBlock:^(NSString *accessToken, NSError *error) {
        
    }];
```

```objc
// 引数名省略の定義
-(void)registerWithName:(NSString*)name
        completionBlock:(void (^)(NSString* , NSError* )) completionBlock;

// 補完入力後、わざわざ引き数名を自分で打つのが面倒くさい
    [self registerWithName:@"fuga"
           completionBlock:^(NSString *, NSError *) {
    }];
```
シェルスクリプトメモ 条件分岐編


## 書き方

```sh
if [ 条件 ]; then
elif [ 条件 ]; then
else
fi
```

### 注意
* `[` `]` それぞれと`条件`の間には、必ずスペースがいる
* `;` を忘れないこと
    * `;` を書かないで改行を挟んでから `then` を書いても良い

## 条件分岐に使えるオプション

そもそも `[]` これは `test` コマンドの糖衣構文らしい。
`test` コマンドで使えそうなオプション一覧。

| オプション | 説明 |
|:----|:----|
|-e| 対象が存在するなら新|
|-d| 対象がディレクトリなら新|
|-f| 対象がファイルなら新|

## 使用例

```sh
# $HOME/.zsh/environment が存在していたら読み込む
if [ -e "$HOME/.zsh/environment" ]; then
  source "$HOME/.zsh/environment"
fi
```
第13回オフラインリアルタイムどう書くの参考問題。ruby による実装。

オフラインリアルタイムどう書く

* 第13回(9月6日) http://atnd.org/events/41603
* 第14回(9月28日) http://atnd.org/events/43076

の、参考問題「増やす減らす二倍する」
http://nabetani.sakura.ne.jp/hena/ord13updowndouble/
の実装例。

ruby 1.9 以降用。

他の言語などの解答例は
http://qiita.com/Nabetani/items/89fb0e2e712d4b396535
から辿れます。

で。

```ruby
#!ruby
#this code works on ruby 1.9 or later.
def solve( src_text )
  src=src_text.to_i
  queue={0=>0}
  loop do
    v=queue.first[0]
    depth = queue.delete(v)
    [v+1, v-1, v*2 ].each do |new_val|
      next if queue[ new_val ] || new_val<0
      return depth+1 if new_val==src
      queue[ new_val ] = depth+1
    end
  end
end

DATA.each do |line|
  num, src, exp = line.split( /\s+/ )
  act = solve( src )
  ok = act==exp ? "ok" : "***NG***"
  puts [ ok, src, act, exp ].join( " " )
end

__END__
0 59  9  +1 ×2 ×2 ×2 ×2 -1 ×2 ×2 -1
1 10  5  +1 +1 ×2 +1 ×2
2 11  6  +1 ×2 ×2 +1 ×2 +1
```

いつも通り、テストデータの大半は省略。

で。

順当な幅優先探索。
全部は無理なので、発見済みならスキップ。
最初に書いたのはこういう感じだった。

出題者の都合でボタン名のリストを作ったりする必要があって、もう少しいろいろ書いていたけど。

Hash を queue にするという、私としては意外な展開。
ruby1.9からは Hash に順序があるのでこれでいい。（そういえば、先頭に追加はできないよねぇ）

テストデータは 27 手が最長なので、32bit 整数でもoverflow しないはず。
まあ ruby だから overflow しないんだけど。
Objective-Cで値型を文字列に変換するときに少し簡単な方法

```objc
NSInteger num = 3;
// 普通はこう書くはず 
NSString* str1 = [NSString stringWithFormat:@"%d", num];
// こう書ける
NSString* str2 = @(num).stringValue;
```

コンパイル後、ほとんどのケースで問題にならない程度に差は出るかもしれないけど、意味的にも分かりやすくなって、下の書き方が好み。
sudoコマンドの公式な発音

話のネタになるコマンドの発音について、`sudo`は公式な発音があるようです。
Sudo Main Pageの[FAQ and Troubleshooting Tips](http://www.sudo.ws/sudo/troubleshooting.html)に次のFAQがあります。

> Q) How do you pronounce `sudo'?
> A) The official pronunciation is soo-doo (for su "do").  However, an
>    alternate pronunciation, a homophone of "pseudo", is also common.

ここで soo-doo なので「すどぅー」で決まりですね！

※追記

Chrome限定ですがGoole翻訳で[soo-doo](http://translate.google.co.jp/#en/ja/soo-doo)の発音を聞くことができます。
WebStormからMochaのテストをトリガーしてデバッグする（リンクのみ）

下記参照。多謝。
http://d.hatena.ne.jp/anton0825/20120902

以下元ネタ。
http://yieldthedog.github.io/blog/2012/03/12/configure-webstorm-to-run-and-debug-mocha-tests/
Git で競合ファイル一覧を楽に見る方法



競合ファイル一覧を楽に見る方法は、あまりないようで。
設定ファイルに書くのが一番よさそうです。


## コマンドの場合

```
git diff --name-only --diff-filter=U
```

```
git ls-files -u | cut -f 2 | sort -u
```

```
git ls-files -u | awk '{print $4}' | sort | uniq
```


## 設定して、 git conflicts で見る

以下を設定する

```
git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
```

以下で競合一覧を見る

```
git conflicts 
```

## 参考URL

merge - What's the simplest way to git a list of conflicted files? - Stack Overflow
http://stackoverflow.com/questions/3065650/whats-the-simplest-way-to-git-a-list-of-conflicted-files

## 検索用

git, conflict, list, diff, 競合, コンフリクト, 一覧, 差分
skype 特定ワードで音声出す方法

設定->一般->サウンド-> チャット受信時をon
好きな音声登録するなりノック音でも設定すればいい

後は、めんどいがチャットグループを選択して
上部の会話->通知設定->以下の単語～～
「dark nishiyama ugdark 」
とかを入れる。
最後に改行
「dark nishiyama ugdark 
」
とかしちゃうとugdarkは反応しなくなったので要注意
objcopyでテキストファイルをバイナリに埋め込む時の注意点

objcopyでテキストファイルをバイナリに埋め込むとデフォルトでは「_binary_hoge_start/end/size」みたいに_binary_(ディレクトリ区切りを_にmungleしたパス)というシンボルを作ってくれるが、当然ながら0ターミネートされないので文字列として使うときには何らかの方法で0で終端する必要がある。

ちなみにそれぞれ配列で埋め込んだデータは_binary_hoge_start[0]から始まっていて、_binary_hoge_end[0]は埋め込んだデータの次のバイト、_binary_hoge_size[0]にサイズが入ってる。

埋め込む方法は、

```
objcopy -I binary -O elf64-x86-64 -B i386 $< $@
```
こんな塩梅。-Bで環境を設定してやらないとldに拒否られるので注意。

終端する方法はいろいろ考えられるけどビルド時にファイルに0を付け足すのは結構面倒だったのでソースを改行で終端するというルールでも作っておいて_binary_hoge_end[-1]に0を書くのが一番簡単かも。
OTA構成プロファイル登録に必要なセットアップ

[OTA構成プロファイル登録](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/iPhoneOTAConfiguration/Introduction/Introduction.html#)

* OTAプロファイル登録に必要なコンポーネント
  * ユーザ認証サーバ
  * プロファイル配信サーバ
  * SCEPサーバ


* ユーザ認証サーバ
  配信するユーザを限定するのであれば、そのユーザを認証できる仕組みが必要。
  特に制限はない。


* プロファイル配信サーバ
  ユーザ認証サーバと同一でかまわない。
  iOSからSCEP認証プロセスを開始するのに必要なエンドポイントを提供する。
  特に制限はない。


* SCEPサーバ
  デバイス内の秘密鍵を用いて、デバイス一意性をプロファイル配信サーバで保証するために、
  SCEPを用いてデバイスに証明書を発行するサーバ。
  経験上では、Windows Server 2008 Enterprise / DataCenter EditionでしかiOSとの連携動作を確認していない。
  他の選択肢としては、OpenSCEP, EJBCA, OpanCA等があると思うが、動くか、動いている例があるのかは知らない。


* 登録ステップ概要
  1. ユーザ認証サーバは、iOSからのアクセス(例:HTTP等)に対し、ユーザを認証する
  2. iOSから、プロファイル配信サーバが用意したプロファイル登録用プロファイル配信エンドポイントにアクセスする
  3. プロファイル配信サーバは、必要であれば、続く本HTTPセッションを保たないiOSからのアクセスに対応するための一時トークンを、プロファイル登録エンドポイントとしてプロファイル登録開始用プロファイルに含めるURLにGETパラメータなどで含めておく。
  5. プロファイル配信サーバは、プロファイル登録用プロファイルに上記情報及びリクエストするデバイス情報を含め、iOSに返す。
  6. iOSがプロファイルを認識し、[設定]->[プロファイル]ページにてOTAプロファイル登録ステップ
を開始する
  7. iOSは、デバイス内の証明書を用いてリクエストされたデバイス情報のPlistに署名し、それをボディとしてプロファイル登録サーバにアクセスする。
  8. プロファイル登録サーバは、署名がSCEPサーバから発行された証明書に基づくものであるかをチェックし、そうでないこと(デバイス内部の証明書であること)を確認して、SCEPサーバに証明書発行用チャレンジを要求する。
  9. プロファイル配信サーバは、実際のプロファイル配信に用いる証明書を取得するために用いる証明書を取得するための(2回書いてあるのは書き間違いではない)、SCEP登録要求リクエストとして、上記チャレンジを含めたプロファイルをiOSに返す。
  10. iOSは、上記チャレンジを用いてSCEPサーバから証明書を取得し、その証明書でリクエストボディに署名して再度プロファイル配信サーバにアクセスする。
  11. プロファイル配信サーバは、証明書の発行元を検証し、確認できれば、更にもう一つのSCEP発行用チャレンジを取得する。
  12. プロファイル配信サーバは、上記チャレンジと、実際に配信する構成プロファイルを合わせたプロファイルを、今回のアクセスでデバイスが用いた証明書を使って暗号化したプロファイルを、暗号化プロファイルとして含めたプロファイルをiOSに返す(表現が冗長なのは間違いではない)
  14. デバイスは、上記チャレンジを用いて、SCEPから再度別の証明書を取得し、プロファイルをインストールする。

*  備考
  サンプルのWEBrickコードが、Appleのドキュメントの右上からダウンロードできる。
  WS2008のNDES(Network Device Enrollment Service) のMSCEP(Microsoft Simple Certificate Enrollment Protocol)を用いるが、Active Directoryを有効にしてActive Directory Certificate Serviceを用い、[エンタープライズ](https://social.technet.microsoft.com/wiki/contents/articles/9063.network-device-enrollment-service-ndes-in-active-directory-certificate-services-ad-cs.aspx#Enterprise_Scenario_Deployment)CAとしないと、iOSと連携して動かなかった。
  そのほかにも、NDESのセットアップで気をつけなければいけないことも色々あるので、検索して確認要
iOSっぽいUIに使うコンポーネント

* UINavigationController
  基本的にはstartActivity
  場合によってはViewFlipperやViewPagerで実装も可能
  戻るボタンはsetDisplayHomeAsUpEnabled
  
* UINavigationBar
   4.0以降はActionBar
   それ以前はActionBarSherlock

* presentViewController:animated / dismissViewController:animated
   アニメーションを定義してViewFlipperと共に使う。具体的にはタイマーでアニメーション終了後に
   ビューを切り替える。
　アニメーションの参考: android-3d-flip-view-transition
   Fragmentと一緒に使うと、Fragmentが非同期でViewを初期化するために(viewController.viewでviewDidLoadが同期で呼び出される)iOSと同じフローだと上手くいかない。

* UIDatePicker
   Fusion-Dateslider

* UIPickerView
   android.widget.NumberPickerを使い、formatterForTagでラベルを返す。

* UITableViewのsectionHeader/Footer
   android-pull-to-refreshとAmazingListViewを相当カスタマイズして使ったが、(スクロール時テーブル上部に残る、内部にコンポーネントを持つ)sectionHeaderは一つが限界だった。気が向いたら複数セクション実装試みる。

* pullToRefresh
   android-pull-to-refreshを使うが、(恐らくAndroid自体の)バグが多いので火だるまになる。
  と思ったらhttps://github.com/chrisbanes/ActionBar-PullToRefresh
  というのがある。使ってみる。

* UITableView全体
  上の２つなどを色々修正して使うが、機種によっては意味不明なタイミングで沢山タッチイベントを出したりするので、リストビューの状態を正常にたもつのが大変。

* animateWithDuration
   描画にはアニメーションを用いて、アニメーション終了時にセットしたタイマーで実際のプロパティを調節したりする。（確か所々必要だったはず）

* その他
  端末依存でわけの分からないところでNPEが出たりするので、むしろUIの外見よりプログラム自体が複雑化しないように気を配るほうが大切な気がして、無理にiOSに合わせようと頑張るのは余りお奨めできない。
@AfterメソッドはTestWatcher#failedよりも先に実行される

タイトルが全て．

最近のJUnitには[TestWatcher](http://junit.czweb.org/apidocs/org/junit/rules/TestWatcher.html)というクラスがあって，テストの実行結果を，テストケースから観測することが出来る．例えば上記リンク先では，テストが失敗した時にログを取るみたいな例が紹介されている．

これを使って，テストの結果に応じて@Afterのついたメソッドで行なっている後処理を制御できるのだろうか，と思って試してみた．JUnit4.11を利用した．

```java
import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;

import static org.junit.Assert.fail;

/**
 * @Test, @AfterとTestWatcher#failedの実行され順を確認する
 */
public class TestWatchMan {
    private boolean lastTestFailed = false;

    @Rule
    public TestWatcher watchman = new TestWatcher() {

        @Override
        protected void failed(Throwable e, Description description) {
            System.err.println("テスト失敗が観測される");
            lastTestFailed = true;
        }
    };

    @Test
    public void alwaysFailingTest() {
        fail();
    }

    @After
    public void doSomethingWhenTestFails() {
        if (lastTestFailed) {
            System.out.println("なんか後処理");
        } else {
            System.err.println("テスト失敗のフラグがセットされるまえに@After付きメソッドが実装される");
        }
    }
}
```

```出力
java.lang.AssertionError
	at org.junit.Assert.fail(Assert.java:86)
	at org.junit.Assert.fail(Assert.java:95)
	at TestWatchMan.alwaysFailingTest(TestWatchMan.java:27)

テスト失敗のフラグがセットされるまえに@After付きメソッドが実装される
テスト失敗が観測される
```

ということで，@Test付きのメソッド，@After付きのメソッド，TestWatcher#failedの順で実行されるようだ．
RailsのルートページにDeviseの登録フォームを埋め込んだように見せる方法

RailsのTopページに、Twitterみたいに登録フォームを埋め込めたらなぁと思ったのですが、
Deviseのビューをルートに設定できないらしいので、少しズル？をしてルートに設定（してるように）しました。

# 1.Deviseの登録画面をトップ画面用に編集する

```html:/app/view/users/registrations/new.html.erb
 <!-- /.navbar -->
<div class="container">
# 略
</div>

<div class="container">
<!-- Registration Form -->
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>

<div><%= f.label :email %><br />
<%= f.email_field :email, :autofocus => true %></div>

<div><%= f.label :password %><br />
<%= f.password_field :password %></div>

<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>

<div><%= f.submit "Sign up" %></div>
<% end %>
<%= render "users/shared/links" %>
</div>
```
今回は、ユーザーモデルに認証機能をつけたので、usersというフォルダに入っている登録画面の
ERBを編集します。

# 2.トップ画面のコントローラーをルートに設定する

static_pagesコントローラのhomeメゾッドでトップ画面を表示していたので、
static_pages#homeをルートに設定します。

```rb:/config/routes.rb
root :to => "static_pages#home" #追加
```

# 3.トップページのコントローラーにリダイレクトを設定する

```rb:/app/controller/static_pages_controller.rb
class StaticPagesController < ApplicationController
	def home
		redirect_to '/users/sign_up'
	end
end
```

んで、サーバー立ち上げて確認すると、ちゃんとルートから自動で登録ページに移動してます！！
でかい表をmarkdownで作るのに疲れたら、、、

ちょっと大きめの表を markdown形式で作成する機会がありました。

* `|`の数を合わせるのが面倒!
* 追加・変更が大変!

となったので、

https://github.com/arches/table_print

という gemを使いました。

以前のバージョンだと、 ヘッダー行の下に`|`がなく、
若干面倒だったので、Pull requestを送ったところ見事マージされました！

ということでちょっと使い道を

## インストール

適当に rubyをインストール(私は2.0系)

```
gem install table_print
```

## コード

追加・変更が必要だったので、コードがしました。

```rb:sample.rb
require 'table_print'
require 'ostruct'

x = []
x << OpenStruct.new(title: "たいとる1", description: "せつめいぶん", photos: %w(しゃしんa-1 しゃしんa-2 しゃしんa-3).collect{|o| {name: o}})
x << OpenStruct.new(title: "たいとる2", description: "せつめいぶん", photos: %w(しゃしんb-1 しゃしんb-2).collect{|o| {name: o}})
x << OpenStruct.new(title: "たいとる3", description: "せつめいぶん", photos: %w(しゃしんc-1 しゃしんc-2 しゃしんc-3 しゃしんc-4).collect{|o| {name: o}})

# ここで出力
tp x, :title, :description, 'photos.name'
```

### 実行結果

実行結果は以下のようになります。

```
TITLE     | DESCRIPTION  | PHOTOS.NAME
----------|--------------|------------
たいとる1 | せつめいぶん | しゃしんa-1
          |              | しゃしんa-2
          |              | しゃしんa-3
たいとる2 | せつめいぶん | しゃしんb-1
          |              | しゃしんb-2
たいとる3 | せつめいぶん | しゃしんc-1
          |              | しゃしんc-2
          |              | しゃしんc-3
          |              | しゃしんc-4
```

コレをコピペすると以下のようになります。

ヘッダーとかの文字を適宜修正して、完成。

ちょっと楽になりましたとさ。

TITLE     | DESCRIPTION  | PHOTOS.NAME
----------|--------------|------------
たいとる1 | せつめいぶん | しゃしんa-1
          |              | しゃしんa-2
          |              | しゃしんa-3
たいとる2 | せつめいぶん | しゃしんb-1
          |              | しゃしんb-2
たいとる3 | せつめいぶん | しゃしんc-1
          |              | しゃしんc-2
          |              | しゃしんc-3
          |              | しゃしんc-4
Pythonでバイナリファイルを作成する


ちょっとしたバイナリファイルをPythonで作成する方法。

```python:
import struct

def main():    
    with open("data", "wb") as fout:        
        for x in [0xFF, 0x12, 0x89]:            
            fout.write(struct.pack("B", x))

if __name__ == "__main__":    
    main()
```

`hexdump` コマンドで作成したファイルの中身を確認してみます。

```
% hexdump data
0000000 ff 12 89
0000003
```

問題なく作れていますね。

(追記 2013-09-07)

shiracamus さんにコメントで bytearray を教えていただきました。こちらの方が import も必要ないので手軽ですね。

```python:
def main():
    with open("data", "wb") as fout:
        bary = bytearray([0xFF, 0x12, 0x89])
        bary.append(0)
        bary.extend([1, 127])
        fout.write(bary)

if __name__ == "__main__":
    main()
```

`hexdump` の実行結果です。

```
% hexdump data
0000000 ff 12 89 00 01 7f
0000006
```
Goで可変引数の関数にスライスを展開して渡す

http://golang.org/ref/spec#Passing_arguments_to_..._parameters
で説明されています。

スライスの変数の後に...をつけて呼び出せば、Goで可変引数の関数にスライスを展開して渡すことができます。

試しに変数を用意せずに配列のリテラルの後に...をつけて見ましたが、こちらでも動作しました。

```go:
package main

import "fmt"

func main() {
	// normal variadic function call
	greeting("Hello", "世界", "日本")

	// you can pass an array with following '...'
	// http://golang.org/ref/spec#Passing_arguments_to_..._parameters
	names := []string{"世界", "日本"}
	greeting("Hi", names...)

	// actually you can pass an array literal following '...'
	greeting("Yay", []string{"世界", "日本"}...)
}

func greeting(prefix string, who ...string) {
	fmt.Printf("%s", prefix)
	for _, name := range who {
		fmt.Printf(" %s", name)
	}
	fmt.Printf("\n")
}
```

上のプログラムは
http://play.golang.org/p/9Yhowss0JM
で試せます。
Sublime Text 用プラグイン sublime-cakephp-find の使い方

Sublime Text 2 用のプラグイン「sublime-cakephp-find」の使い方を簡単にご説明します。
これは CakePHP で作業中にファイルを検索できたり移動が楽になるプラグインです。

- ダウンロード  
 https://github.com/gold1/sublime-cakephp-find/archive/master.zip
- インストール方法はこちら。
 https://github.com/gold1/sublime-cakephp-find/wiki/Wiki-日本語  

- 準備
ダウンロードした Zip を解凍して、「Packages」フォルダの下に置いてください。
その後エディタを再起動してください。

```php
Sublime Text 2\Packages\sublime-cakephp-find
```

CakePHP の最新版のバージョン 2.4.0 で説明していきます。(2013/08/31)
https://github.com/cakephp/cakephp/archive/2.4.0.zip

# 検索
cakephp の Zip を解凍したら、その中にコントローラとビューを作成してください。

```php:app\Controller\SamplesController.php
<?php

App::uses('Controller', 'Controller');

class SamplesController extends Controller {
	public $helpers = array("Form");
	public function index() {
	}
}
```
```php:app\View\Samples\index.ctp
Samples / index.ctp
```
SamplesController の3行目 `App::uses('Controller', 'Controller');` の上にマウスカーソルを置いて、 `Ctrl + Shift + c`, `f` を続けて順番に押してください。

![sample01.png](https://qiita-image-store.s3.amazonaws.com/0/14224/0bb3039d-950c-92ce-ab4f-bb35990912ca.png)

すると、 `lib\Cake\Controller\Controller.php` のファイルが開きます。
`Ctrl + Shift + c`, `f` のコマンドは、マウスカーソルが置いてあるコードを読み取って該当するクラスを検索します。

次に、SamplesController の6行目 `public $helpers = array("Form");` の "Form" の上にマウスカーソルを置いて、 `Ctrl + Shift + c`, `f` を続けて順番に押してください。

![sample02.png](https://qiita-image-store.s3.amazonaws.com/0/14224/bb6dc81a-ff90-0068-57f0-26479c88f1ce.png)

今度は、 `lib\Cake\View\Helper\FormHelper.php` のファイルが開きます。
Helper の文字が省略されていても、自動的にクラス名を補完して検索します。

このようにコードを読み取ってファイルを開くことができます。

# 移動

SamplesController の7行目 `public function index() {` の上にマウスカーソルを置いて、 `Ctrl + Shift + c`, `v` (f ではない)を続けて順番に押してください。

![sample03.png](https://qiita-image-store.s3.amazonaws.com/0/14224/8f6b3277-3d86-e672-1195-32f148324b89.png)

対応するビュー `app\View\Samples\index.ctp` のファイルが開きます。
その場で `Ctrl + Shift + c`, `c` (f ではない)を順に押すと、元のコントローラ `app\Controller\SamplesController.php` のファイルに移動します。

c, v, m のコマンドがそれぞれ Controller, View, Model に対応しています。

# フォルダ移動

マウスを使わずにキーボードだけでフォルダを移動できます。
`Ctrl + Shift + c`, `Ctrl + c` を順に押すと、エディタの上部にパネルが開いてコントローラの一覧が表示されます。

![sample04.png](https://raw.github.com/gold1/sublime-cakephp-find/master/docs/0001.png)

ファイル名を選択すると開きます。
一番上の `../` を選択すると、一つ上の階層に移動します。

コントローラ以外のフォルダへのショートカットキーは、Wiki に記載されています。
 https://github.com/gold1/sublime-cakephp-find/wiki/Wiki-日本語  

# 補足

- 検索機能は Cake のコアの部分のソースを読むときや、他の人のコードを読んで関数を調べたいときなどに役立つと思います。
- Emacs の CakePHP 用プラグイン `emacs-cake2` のソースを移植してそれを拡張して作成しています。
第13回オフラインリアルタイムどう書くの参考問題。C#で解く。


- [増やす減らす二倍する 〜 横へな 2013.9.6 参考問題](http://nabetani.sakura.ne.jp/hena/ord13updowndouble/)

をC#で解きました。幅優先探索です。


```cs:
using System;
using System.Collections.Generic;

namespace Example {
    class MainClass {
        public static int Calc(int n) {
            var fns = new List<Func<int, int>> {
                x => x + 1,
                x => x - 1,
                x => x * 2,
            };

            var used = new HashSet<int>();
            var q = new Queue<Tuple<int, int>>();
            q.Enqueue(Tuple.Create(0, 0));
            used.Add(0);
            while (q.Count > 0) {
                var t = q.Dequeue();
                if (t.Item1 == n) return t.Item2;

                foreach (var fn in fns) {
                    int x = fn(t.Item1);                    
                    if (x <= 0 || used.Contains(x))
                        continue;

                    used.Add(x);
                    q.Enqueue(Tuple.Create(x, t.Item2 + 1));
                }
            }
            return -1;
        }

        public static void test(string input, string expect) {
            int answer = Calc(Convert.ToInt32(input));
            if (answer == Convert.ToInt32(expect)) {
                Console.WriteLine("OK");
            }
            else {
                Console.WriteLine("!!! NG !!!");
            }
        }

        public static void Main(string[] args) {
            /*0*/ test( "59", "9" );    
            /*1*/ test( "10", "5" );    
        }
    }
}
```
バックグラウンド系処理の起動/停止スクリプトのテンプレ

ちょくちょく忘れるのでメモ。

ubuntuとかでバックグラウンド処理をするときにシェルスクリプトから起動したコマンドを停止するためのサンプル

```shell-session
command &
echo $! > pidを保存するファイル
```

のようにすると、実行したコマンドのプロセスIDが保存されるので、停止時には

```shell-session
cat pidを保存したファイル | xargs kill -term
```

とすればＯＫ
もちろん停止時のロジックを応用して、psと組み合わせて今停止しているかどうかのチェックも可能。

```shell-session
cat pidを保存したファイル | xargs ps -o pid -p 
```

とすると稼働中のプロセスIDが表示されるので、これを利用する。
Python 3のsorted関数と比較関数



Python 3 では sorted 関数に比較関数を渡すことが出来なくなったのだけど、Python 3.2 では functools.cmp_to_key を使えば、sorted 関数に比較関数を渡すのと同様のことが出来るようになった。いくつかサンプルを書いてみる。

- [functools.cmp_to_key(func)](http://docs.python.org/3/library/functools.html?highlight=functools#functools.cmp_to_key)


はじめに、整数を文字列で比較してソートするサンプルを書いてみる。

```python:
from functools import cmp_to_key

def cmp(a, b):
    if a == b: return 0
    return -1 if a < b else 1
    
def cmpstr(a, b):
    return cmp(str(a), str(b))

def main():
    xs = [4, 90, -9, 12, 42]
    print(sorted(xs, key=cmp_to_key(cmpstr)))

main()
```

実行結果です。

```実行結果
[-9, 12, 4, 42, 90]
```


大小の比較結果は -1, 0, 1 のいずれかを返す。小さければ -1 を返し、等しければ 0 を返し、大きければ 1 を返す。

ただ、この例に限っては、`sorted(xs, key=str)` と書いても同じです。

`functools.cmp_to_key` の使い方が分かったので、今度は本当にやりたかったソートをやってみる。2 つの要素を持つタプルのリストがあり、このリストをソートしたい。比較方法は、タプルの 2 番目の要素の小さい順、かつ、もし 2 番目の要素が等しいなら、1 番目の要素の大きい順にソートする。比較関数は以下のようになります。

```python:
from functools import cmp_to_key

def cmp(a, b):
    if a == b: return 0
    return -1 if a < b else 1

def cmptuple(a, b):
    return cmp(a[1], b[1]) or cmp(b[0], a[0])

def main():
    xs = [(4, 90), (-9, 12), (42, 12), (100, 12), (1, 1), (-123, 1)]
    print(sorted(xs, key=cmp_to_key(cmptuple)))

main()
```

実行結果です。

```実行結果
[(1, 1), (-123, 1), (100, 12), (42, 12), (-9, 12), (4, 90)]
```

## リンク

- [Sorting HOW TO](https://docs.python.org/3/howto/sorting.html#sortinghowto)
テンプレート関数の宣言と実装を分離する方法

自分の備忘録のために投稿する。

ヘッダにはテンプレート関数の宣言のみ記述し、定義は実装ファイルに書く場合、単純にヘッダと実装を分離したのではリンクエラーが出るが、下記の様にすればリンクエラーを回避できる。
本手法はBoostでも使用されている手法であるため、悪くない手法であると思う。

Utility.h : テンプレート関数の宣言のみ記述したファイル

```cpp
// Utility.h
#pragma once

#include <string>                                                                               

template<typename T>                                                                            
class Utility
{
    public:
        std::string toString(const T & value);                                                  
};

#include "details/Utility.h"
```

details/Utility.h : 上記ファイル ( Utility.h ) で宣言したテンプレート関数の実装を記述したファイル

```cpp
// details/Utility.h
#include "../Utility.h"
#include <sstream>

template<typename T>
std::string Utility<T>::toString(const T & value)
{
    std::stringstream ss; 
    ss << value;
    return ss.str();
}
```

main.cpp : Utilityクラスの使用法を説明するためのファイル

```cpp
// main.cpp
#include <iostream>
#include "Utility.h"

int main()
{
    Utility<int> utility;
    std::cout << utility.toString(20) << std::endl;
    return 0;
}
```
PHPで例外発生時のメッセージを記録する


なんか例外発生時のメッセージを記録しておきたいんだけど、こんな感じでいいのかな。エラーログと混ぜるなって話もあるけど



``` php
<?php
try {
    throw new Exception("Some error message");
} catch(Exception $e) {

    // /var/log/php/error.log とかphp.ini で設定した所に記録される
    error_log($e, 3);

	// 混ぜたくないなら
    error_log($e, 3, "/var/log/php/exception.log");
}
```
* [PHP: Exception::__toString - Manual](http://www.php.net/manual/ja/exception.tostring.php "PHP: Exception::__toString - Manual")
* [PHP: error_log - Manual](http://www.php.net/manual/ja/function.error-log.php "PHP: error_log - Manual")
第13回オフラインリアルタイムどう書くの参考問題。groovy による実装。

オフラインリアルタイムどう書く

* 第13回(9月6日) http://atnd.org/events/41603
* 第14回(9月28日) http://atnd.org/events/43076

の、参考問題「増やす減らす二倍する」
http://nabetani.sakura.ne.jp/hena/ord13updowndouble/
の実装例。

まだ出てない言語で出すべきだといかいうルールはないけど、groovy。

他の言語などの解答例は
http://qiita.com/Nabetani/items/89fb0e2e712d4b396535
から辿れます。

で。

```groovy
//Groovy Version: 2.1.5 JVM: 1.7.0_07 Vendor: Oracle Corporation OS: Mac OS X
int solver( int src )
{
    if ( src==0 ){
        0;
    } else if (( src & 3 )==3){
        1+Math.min( solver(src-1), solver(src+1) )
    } else if(src & 1){
        1+solver(src-1)
    } else {
        1+solver(src>>1)
    }
}

def test( src, expected )
{
    String actual = solver( src.toInteger() ).toString();
    println( [expected==actual ? "ok" : "***NG***", src, actual, expected ] )
}

/*0*/ test( "59", "9" );    
/*1*/ test( "10", "5" );    
/*2*/ test( "11", "6" );    
```

いつも通り、テストデータの大半は省略。

で。

順当に行けばまずは幅優先探索。

でも全部やるのはちともったいないので逆にたどることにして

* 0 なら 0 手で到達可能。初期状態
* 2進数で下二桁が 11 の場合、[-1] を押した結果なのか[+1]を押した結果なのか判断しかねるので、両方試す。
* ２進数で下二桁が 01 の場合は [+1] を足した直後だと思うことにする。
* 偶数なら、[×2]を押した直後だろう

という方針にしてみた。
中途半端な感じ。
これで計算が終わるかどうかはちゃんと考えないとよくわからないんだけど、まあおわるみたいだからよしとする。
switch〜case にしてみてもよかったかも。
インストール済みgemの ri と rdoc を一括でインストール

今までずっと

```rb:~/.gemrc
install: --no-ri --no-rdoc
update: --no-ri --no-rdoc
```

と処理速度優先でドキュメントはインストールしてなかったけど、rcodetoolsを使えば簡単にriドキュメントにアクセスできるようなので全部入れなおすことにしました。

上記の .gemrc に設定してデフォルトで rdoc をインストールしない方法はすぐに見つかるけど逆は見つからなかったのでStackOverflowで質問したらすぐ答えが返ってきた。本当にいつもありがとうございます。

## ri と rdoc を一括インストール

`$ gem rdoc --all --ri`

でインストール済みの全てのgemに対応する rdoc と ri がインストールされます。
ちなみに rdoc を(使いやすさのために？)変換したのが ri だそうです。

## 参考

Ruby の ri ドキュメントに付いて教えてください。 1. ri ドキュ.. - 人力検索はてな
http://q.hatena.ne.jp/1234512471

ruby on rails - How can I install ri and rdoc files for gems afterwards? - Stack Overflow 
http://stackoverflow.com/questions/18544900/how-can-i-install-ri-and-rdoc-files-for-gems-afterwards/18544985?noredirect=1#18544985
RSpec の should/stub から expect/allow の早見表


RSpec 2.14.0 からは `allow`, `expect_any_instance_of`, `allow_any_instance_of ` も使えるようになりました。

```should_to_expect.rb
obj.should ...
expect(obj).to ...
 
obj.should_not ...
expect(obj).not_to ...
 
obj.should =~ //
expect(obj).to match(//)

[1, 2, 3].should =~ [3, 2, 1]
expect([1, 2, 3]).to match_array([3, 2, 1])

obj.should > 3
expect(obj).to be > 3
 
lambda { ... }.should raise_error
expect { ... }.to raise_error
 
# RSpec 2.14.0 or later
 
obj.stub(:foo)
allow(obj).to receive(:foo)
 
SomeClass.any_instance.should_receive(:foo)
expect_any_instance_of(SomeClass).to receive(:foo)
 
SomeClass.any_instance.stub(:foo)
allow_any_instance_of(SomeClass).to receive(:foo)

# RSpec 2.99.0.beta1 or later

it { should eq(something) }
it { is_expected.to eq(something) }

# RSpec 3.0.0.beta1 or later

obj.stub_chain(:foo, :bar).and_return(something)
allow(obj).to receive_message_chain(:foo, :bar).and_return(something)
```
PaperTrail が Konacha の邪魔をする時


[paper_trail](https://github.com/airblade/paper_trail) は ActiveRecord のモデルデータの変更履歴を記録してくれる便利な gem ですが、そのままだと [Konacha](https://github.com/jfirebaugh/konacha) のサーバがエラーで落ちてしまいます。これは paper_trail が `ActionController::Base` にフックを設定するため、Konacha のサーバでもフックが動いてしまうのが原因のようです。

そこで Konacha のサーバでは paper_trail を無効にします。

```config/initializers/konacha.rb
Konacha::SpecsController.class_eval do
  def paper_trail_enabled_for_controller
    false
  end
end if defined?(Konacha)
```

これで JS の快適なテストライフが楽しめます。
連想配列のn番目の要素を取り出す

`$n`番目のキーと値がペアになった部分配列で欲しい場合
-------------------------------------------------------------------------

```php
var_dump(array_slice($arr, $n, 1, true));
```

`$n`番目のキーだけ欲しい場合
-------------------------------------------------------------------------

```php
var_dump(key(array_slice($arr, $n, 1, true)));
```

`$n`番目の値だけ欲しい場合
-------------------------------------------------------------------------

```php
var_dump(current(array_slice($arr, $n, 1, true)));
```


先頭の値が欲しい場合(内部ポインタを変更しても問題ない場合)
--------------------------

```php
var_dump(reset($arr));
```

**PHP 7.3 以降は [`array_key_first`](https://www.php.net/manual/ja/function.array-key-first.php) ベースでの記述も可能です。** 

末尾の値が欲しい場合(内部ポインタを変更しても問題ない場合)
---------------------------

```php
var_dump(end($arr));
```

**PHP 7.3 以降は [`array_key_last`](https://www.php.net/manual/ja/function.array-key-last.php) ベースでの記述も可能です。** 

`reset()` や `end()` などに「変数」じゃなくて「値」を使いたい！
==============================================

<del>そういうときは <code>call_user_func()</code> や <code>call_user_func_array()</code> を通せば大丈夫です。</del>

**このギミックは，PHP 7.1 以降は不可能になりました。**

```php
var_dump(call_user_func('reset', ['a', 'b', 'c']));
```
【Unity】UnityでGPS機能を使ってGoogleMap表示

###説明
5秒ごとにGoogle Map APIを利用してMAP 画像を取得し、画面にGUI Textureに張る もしMAP画像を取得中ならダウンロードが終わるまで待って表示 フールサイズ(画面に合わせた)にしているからiPhoneやPCでもフールサイズでGoogleMap画像が表示される

###動作確認
iPhone
PC

###参考
・ソースコード - https://github.com/shori0917/UnityiPhoneGoogleMap
・Static Maps API V2 - https://developers.google.com/maps/documentation/staticmaps/?hl=ja
blockdiagのfreetype対応

出力例:![a.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a5a51cbd-5409-2d8e-412f-313d0ed888e7.png)

まず、`XCode`とXCodeからいれられる`commandline tools`を入れておく。

[freetype-2.5.0.1.tar.gz](http://download.savannah.gnu.org/releases/freetype/freetype-2.5.0.1.tar.gz)をダウンロードし、

```bash:
$ ./configure
$ make
$ sudo make install
```

[libpng-1.6.3.tar.gz](http://prdownloads.sourceforge.net/libpng/libpng-1.6.3.tar.gz?download)が入っていない場合は同様にビルドして入れておく。

そのあと`sudo easy_install PIL`
もしPILを入れた後にfreetypeを入れる場合は

```bash:PILのアンインストール方法
$ sudo rm -r /Library/Python/2.7/site-packages/PIL-1.1.7-py2.7-macosx-10.8-intel.egg/
$ sudo vim /Library/Python/2.7/site-packages/easy-install.pth
./PIL-1.1.7-py2.7-macosx-10.8-intel.egg/ の行を削除。
```

して、もう一度easy_installで入れる。

```bash:blockdiagのフォント指定
$ vim $HOME/.blockdiagrc 
[blockdiag]
fontpath = /Library/Fonts/ヒラギノ角ゴ Pro W3.otf
```