OmniAICreator/Qiita-1.07M huggingface dataset:
普通じゃないHello World問題 in Common Lisp

CodeIQに以下のような問が出題されていた、と最近知りました。


> 標準出力に
> Hello World
> と出力するプログラムを作成して下さい。
> ただし、数値、文字及び文字列リテラルを解答に含めることはできません。（中略）
> 言語仕様をフル活用して下さい！
> http://codeiq.hatenablog.com/entry/2013/09/25/163547 より抜粋

この問題をCommon Lispで解答してみます。


#  一行解答

    (princ '|Hello World|)

    ;-> Hello World

シンボルは、数値でも文字でも文字列でもないので、要件は満たしています。
ですが、なんだか安直すぎて、あまりおもしろくありません。
そこで、言語仕様の中に何かいいものはないか、探してみました。


#  言語仕様を活用した解答

    (let ((*print-case* :capitalize))
      (princ 'hello)
      (princ '| |)
      (princ 'world))

    ;-> Hello World


Common Lispには`*print-case*`という大域変数がありました。
この値を変更することにより、シンボルの出力活字ケースを変更することができます。
取り得る値は、キーワードで、`:upcase`、`:downcase`、`:capitalize`のいずれかです。
デフォルト値は`:upcase`です。

    (let ((*print-case* :downcase))
      (princ 'I-AM-A-BIG-MAN))
      
    ;-> i-am-a-big-man


言語仕様を活用した、上述の解答でも、やはりシンボルを使用しています。
シンボルの使用は要件に違反していませんが、なんだか（他の言語に対して）ズルっこしているような気分になりました。
そこで、私は「Lispの本質とは何か？」、深く深く自問自答し、ついに次の解答に辿り着きました。


# Lispっぽい解答

Lispと言えば、「再帰」と「大量のカッコ」。
これらの概念を高次に融合したLisp的解答が以下のものです！
しかしながら、ここに載せるには[いささか刺激が強すぎますので、アルミホイルキャップをかぶって](http://www.aoky.net/articles/leon_bambrick/lisp_truth.htm)リンク先のシェルスクリプトを見てみてください。


https://gist.github.com/tkych/6726391


このシェルスクリプトは、自分自身を読み込み（再帰的！）、カッコのネストの深さ（大量のカッコ！）で文字コードを表しています。
一行目をコメントアウトすれば、CL-REPLから `(load "hello-world.lisp")` でも実行できるはずです。
Lispっぽいでしょ。


### この文章を書くにあたり、以下のリンク先を参考にさせてもらいました。

[athosさんのclojureの解答](http://athos.hatenablog.com/entry/solutions_in_clojure_for_restricted_words)
[深町さんのマクロを使用した解答](https://gist.github.com/fukamachi/6446193)
[スズキさんの解答](https://gist.github.com/ichimal/6466883)
[HyperSpec: \*print-case\*](http://www.lispworks.com/documentation/HyperSpec/Body/v_pr_cas.htm)

### 追加 2013-10-14
[g000001さんの解答](https://gist.github.com/g000001/6435840)
yaml で書いた複数の設定ファイルをひとつの json に書き出す Gruntfile

grunt ムネアツですね！

yaml で書いた複数の設定ファイルを、ひとつの json にまとめたい場合の Gruntfile です。
以下は、src/*.yml をまず src/*json に書き出し、js/settings.json にまとめる方法です。

# 使用するプラグイン
##grunt-yaml
https://npmjs.org/package/grunt-yaml
npm install grunt-yaml --save-dev

##grunt-extend
https://npmjs.org/package/grunt-extend
npm install grunt-extend --save-dev

```coffeescript::Gruntfile.coffee
module.exports = (grunt) ->
	pkg = grunt.file.readJSON 'package.json'
	grunt.initConfig
		yaml:
			my_target:
				files:
					'src/hoge.json': ['src/hoge.yml']
					'src/fuga.json': ['src/fuga.yml']
		extend:
			my_target:
				files: 'js/settings.json': ['src/*.json']
		watch:
			files: ['src/*.yml']
			tasks: ['yaml', 'extend']

	for t of pkg.devDependencies
		if t.substring(0, 6) is 'grunt-'
			grunt.loadNpmTasks t

	grunt.registerTask 'default', ['yaml', 'extend']
```
全テーブルのCreate Table文を作成する（テーブル単位）

ManagementStudioで出力した感じのスクリプトを作成します。

以前投稿した「[全テーブルのCreate Table文を作成する](http://qiita.com/nakaji/items/f04c585f1dd76d50f8bf)」は全テーブルをまとめて1ファイルで出力しますが、これはテーブル単位にファイルを作成します。

参考にしたサイト：[SQL Server PowerShell を使用した管理手法 第 2 回 実践編](http://technet.microsoft.com/ja-jp/sqlserver/ff730155.aspx)

```powershell:CreateTable.ps1
[void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")

$serverName = "localhost"
$databaseName = "AdventureWorks"

$scriptDir = "D:\テーブル"

if (Test-Path $scriptDir) {
    #追記するので既にファイルがある場合は出力ファイルを削除する
    Remove-Item "$scriptDir\*"
}else{
    #出力先ディレクトリがない場合は作成
    mkdir $scriptDir
}

$server = New-Object Microsoft.SqlServer.Management.Smo.Server($serverName)
$db = $server.Databases[$databaseName]

$scripter = New-Object Microsoft.SqlServer.Management.Smo.Scripter($server)
#出力するスクリプトの設定
$scripter.Options.Indexes = $true                 #インデックスを含める
$scripter.Options.ClusteredIndexes = $true        #クラスター化インデックスを含める
$scripter.Options.WithDependencies = $false       #依存オブジェクトを含めない
$scripter.Options.DriAll = $true                  #参照整合性の出力を含める
$scripter.Options.ToFileOnly = $true              #コンソール出力しない
$scripter.Options.Triggers = $true                #トリガーを含める
$scripter.Options.AnsiPadding = $true             #
$scripter.Options.AppendToFile = $true            #ファイルに追記する

[Microsoft.SqlServer.Management.Smo.SqlSmoObject[]]$db.Tables | 
%{
    #データベース選択のコマンドを出力
    Add-Content -Path $scriptFile -encoding Unicode -Value "USE [$databaseName]"
    Add-Content -Path $scriptFile -encoding Unicode -Value "GO"

    $datetime = (Get-Date).ToString("MM/dd/yyyy hh:mm:ss.fff")
    $schema = $_.Schema
    $tableName = $_.Name

    $scripter.Options.FileName = "$scriptDir\$tableName.sql"          #出力先ファイル

    #Drop文を出力
    Add-Content -Path $scriptFile -encoding Unicode -Value "/****** Object:  Table [$schema].[$tableName]    Script Date: $datetime ******/"
    $scripter.Options.ScriptDrops = $true
    $scripter.Script($_)

    #Create文を出力
    Add-Content -Path $scriptFile -encoding Unicode -Value "/****** Object:  Table [$schema].[$tableName]    Script Date: $datetime ******/"
    $scripter.Options.ScriptDrops = $false
    $scripter.Script($_)
}
```
Rubyを使用してタイピングゲームを作りました。

readlineを使用してコマンドラインから実行できるタイピングゲームを作りました。
まずはベースとなるソースコードです。
任意のファイル名で保存し、実行するとタイピングゲームが始まります。

```rb
# -*- coding: utf-8 -*-
# タイピング
require "readline"

qa = [ 
  "take a risk.",
  "easier said than done.",
  "more haste, less speed.",
  "there is always something better.",
  "good morning.",
]
score = 0 
puts "問題は#{ qa.length }問です。"

qa.shuffle!
start_time = Time.now
qa.each_with_index do |text, i|
  puts "第#{i+1}問"
  puts text
  loop do
    t = Readline.readline('入力: ')
    if text == t
      puts "正解"
      score += 10
      break
    else
      puts "入力ミス！！"
      score -= 10
    end 
  end 
end
end_time = Time.now

time = end_time - start_time
puts "時間: #{time} sec"
puts "得点は#{score}点でした"
puts "returnまたはenterキーで終了します。"
gets
```

上記のコードをベースに、時間を得点に換算したり、裏技的なボーナスポイントを付けたり、表示を調整したものが以下のコードになります。

```rb
# -*- coding: utf-8 -*-
# タイピング
require "readline"

#初期設定
qa = [
  "take a risk.",
  "easier said than done.",
  "more haste, less speed.",
  "there is always something better.",
  "good morning.",
]
max_score = 50 * qa.join.size
score = 0
point = 10
bonus_hints = ["Rubyを楽しみなさい", "Rubyってカッコいい"]
bonus_words = ["ruby is cool", "enjoy ruby"]
ng_word = []

#ゲームスタート
puts "----------------------------------------------------------"
puts "問題は#{ qa.length }問です。"
puts "ボーナスヒント「#{bonus_hints[rand(bonus_hints.length)]}」(英語で書くと…)"
puts "----------------------------------------------------------\n\n"

#入力モードチェック
loop do
  puts '入力モードが半角英数字であることを確認し、スペース入力後、Enterを押してください。'
  t = Readline.readline('入力')
  if t == " "
    puts "スタート\n\n"
    break
  else
    puts "入力モードを確認してください。"
  end
end

#入力スタート
qa.shuffle!
start_time = Time.now
qa.each_with_index do |text, i|
  puts "第#{i+1}問"
  loop do
    puts "入力：「#{text}」"
    t = Readline.readline('> ')
    if text == t
      puts "正解"
      score += point
      break
    elsif bonus_words.include? t
      puts "偉い！　ボーナス#{point*5}点！！"
      score += point*2
      ng_word = bonus_words.delete t
    elsif ng_word.include? t
      puts "あまいわ！ マイナス#{point*5}点！！！"
      score -= point*2
    else
      puts "入力ミス！！"
      score -= point
    end
  end
  puts "\n"
end
end_time = Time.now
time = end_time - start_time
time = time.ceil
score += max_score / time

#結果発表
puts "得点は#{score}点でした"
puts "returnまたはenterキーで終了します。"
gets
```


あと、今の問題は英語の文章にしてるけど、rubyの文法とかにしても面白いかも。

```
String.new("hoge")
ary = [1, 2, 3, 4]
puts "hoge"
(1..9).to_a.each { |ary| puts ary }
```
などなど、やってみれば遊びながらメドッドを覚えたり、入力スピードがアップできないかな。。。
【質問】iPadでbluetooth接続したキーボードから入力した場合（テキスト入力欄以外）のkeydownイベントの取得方法

iPadでキーボードをbluetooth接続し、そのキーボードから入力した文字を取得したいと考えています。

その際、テキスト入力欄 `<input type="text" id="aaa">` にフォーカスがある場合は以下の「onkeydown」イベントにて処理されますが、フォーカスが入力欄以外（ラジオボタンなど）にある場合このイベントが発生しません。

```html:sample.html
<html>
<head>
<script language="javascript" type="text/javascript">
<!--
document.onkeydown = function (e) {

  var chr = String.fromCharCode(e.keyCode);

  document.getElementById("aaa").value = document.getElementById("aaa").value + chr;
};
// -->
</script>
</head>
<body>
<form name="form1"  id="form1">
<input type="text" id="aaa">
<input type="radio" id="bbb" name="ccc">
</form>
</body>
</html>
```

どうすれば入力欄以外でも入力キーが取得できるのでしょうか？
Apple push Notification サービスのフィードバックサービスは監視されている

Apple push Notification は、フィードバックサービスというので、通知できないデバイスを知ることができるようだ。

[Local NotificationおよびPush Notificationプログラミングガイド](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCsQFjAA&url=https%3A%2F%2Fdeveloper.apple.com%2Fjp%2Fdevcenter%2Fios%2Flibrary%2Fdocumentation%2FRemoteNotificationsPG.pdf&ei=MChFUpPDDMWFkAWrkYDICA&usg=AFQjCNFWOadfzxEqfCrw1ueIOvmTw-gZ6w&sig2=eno0-gzRMDHn8fCAouebkQ)

そこには以下の注意が

~~~
注: APNsは、プロバイダがフィードバックサービスをチェックして、デバイス上に存在し
ないアプリケーションへのPush Notificationの送信を停止する作業をこまめに行っているか
どうかを監視します。
~~~

監視の結果、この作業をしていないプロバイダがどうなるかは書かれていない。
抹殺されるかも……。
C++の行列ライブラリEigenで逆行列を求めるときの注意

Eigen/LUもinclude しないとだめ。Eigen/Coreに逆行列 .inverse()と行列式 .determinant() は入ってない

```cpp
#include <Eigen/Core>
#include <Eigen/LU>
```

cannot find xxx.inverse()/determinant() みたいな親切なエラーメッセージは出てこないので、意外とハマった。templateのエラー読むのつらい

過去に二回くらいはまってる気がする


Eigenって何 → http://eigen.tuxfamily.org/index.php?title=Main_Page

### 2013/09/27 補足：
現実的なケースでは、逆行列を求めるのに.inverse()は使わず、LU分解なりQR分解なりを使います
http://eigen.tuxfamily.org/dox/group__TutorialLinearAlgebra.html
Android のファームビルド手順

# set build environment

    $ sudo apt-get update
    $ sudo apt-get upgrade
    $ sudo add-apt-repository ppa:webupd8team/java
    $ sudo apt-get update
    $ sudo apt-get install oracle-java6-installer

    $  sudo apt-get install git gnupg flex bison gperf build-essential \
        zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
        libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
        libgl1-mesa-dev g++-multilib mingw32 tofrodos \
        python-markdown libxml2-utils xsltproc zlib1g-dev:i386
     $ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

# get source

install repo command

    $ mkdir ~/bin
    $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
    $ chmod a+x ~/bin/repo
    $ export PATH=~/bin/:$PATH

add "~/bin" to PATH environment var on ~/.bashrc.

    export PATH=~/bin/:$PATH

setting git

    $ git config --global user.email "Mail address"
    $ git config --global user.name "name"

this source is version 4.3 from AOSP.

    $ cd ${ANDROID_ROOT}
    $ repo init -u https://android.googlesource.com/platform/manifest -b android-4.3_r1
    $ repo sync
    $ wget https://dl.google.com/dl/android/aosp/imgtec-panda-20130603-539d1ac3.tgz
    $ tar zxvf imgtec-panda-20130603-539d1ac3.tgz
    $ ./extract-imgtec-panda.sh

get kernel source. kernel on android repository is binary file. so if you change kernel config, you should build kernel from source.

    $ git clone https://android.googlesource.com/kernel/omap.git kernel
    $ cd kernel
    $ git checkout -b android-omap-panda-3.0 origin/android-omap-panda-3.0

# build kernel

    $ sudo apt-get install libncurses-dev
    $ export PATH=${ANDROID_ROOT}/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH
    $ export ARCH=arm
    $ export SUBARCH=arm
    $ export CROSS_COMPILE=arm-eabi-
    $ cd ${KERNEL_PATH}
    $ make XXXX_defconfig
    $ make menuconfig
    $ make -j 4
    $ cp -a arch/arm/boot/zImage ${ANDROID_ROOT}/device/ti/panda/kernel

# Android

    $ cd ${ANDROID_ROOT}
    $ . build/envsetup.sh
    $ lunch full_panda-userdebug
    $ make -j4
Windows8 の Python で PIL（Google App Engine のための）

Windows8 の Python に PIL を入れようとして、上手くいかなかったのでメモ。
ちなみに、GAE（Google App Engine 用なので Python は 2.7.5 です）
  
普通にやると、PIL のインストーラーに、Pythonがないんだけど・・・と言われる  
[ここ](http://d.hatena.ne.jp/kyart/20130320/1363760858)には、HKEY_LOCAL_MACHINE に有るレジストリデータを HKEY_CURRENT_USER にもコピーすれば何とかなる。とあるので、Pythonを for me（？だっけ、とりあえずfor all userじゃない方）にしてみたら、PLI のインストールまでは上手くいった  
ちなみにPILでググるとver.1.1.7が出てくるが、[こっち](https://pypi.python.org/pypi/Pillow/2.0.0)のver.2.0.0を使う。
1.1.7だとGAEから認識してくれなかった  
  
## まとめ
1. Python を自分のみにインストール（All User じゃない方）
2. [Pillow 2.0.0](https://pypi.python.org/pypi/Pillow/2.0.0)をインストール

多分これで問題ない。はず・・・
rbenvのirbで補完が効くようにする


デフォルトだと補完が効かなかった。

ruby-build時にreadlineオプションを常に有効にする為の以下プラグインを使う。

https://github.com/tpope/rbenv-readline

```
git clone git://github.com/tpope/rbenv-readline.git \
  ~/.rbenv/plugins/rbenv-readline
rbenv install 2.0.0-p247
```
zabbix externalscripts 周りの設定

使うときに気にしないといけない基本的な内容 
自分の設置環境はFedora17だけど、それほど違いはないと思う。

externalscriptsの位置
----

デフォルトでは /etc/zabbix/externalscripts/ が外部監視スクリプトを置く位置。
( manualでは/usr/local/share/zabbix/externalscriptsって書いてあるけど、yumで入れると違う)
zabbix_server.confの中に

```
ExternalScripts＝/path/to/externals/
```

みたいに設定しておけば好きな位置に変更可能。
この設定されたディレクトリの位置に実行ファイルを置けばアイテムの追加で外部チェックで使用可能

アイテム追加時のキーと引数の関係
----

```
check_http_status[{HOST.CONN}, "8080"]
```

上記のように記載すると

```
check_http_status {HOST ip address} 8080
```

のようにして引数が渡されてスクリプトが実行される。
1.8系までは自動的に最初の引数にホストのip アドレスが渡されていたけど、
2.0系以降は自分で指定してあげる必要があるので、マクロ等を使って渡す必要があります。
使えるマクロの一覧は↓
https://www.zabbix.com/documentation/2.0/manual/appendix/macros/supported_by_location

実行結果の返し方
---
標準出力への吐き出しが返りの値として使われて、標準エラーと終了コードは破棄されるようです。

```shell-session
#!/bin/sh

url -s http://$1:$2/server-status | grep IdleWorkers | awk '{print $2}'
```
xcodebuildコマンドを叩いてCodesignエラーが出たときの対処法

## 実行したコマンドと結果
* xcodebuildをコマンドラインで実行すると、Codesignエラーがでた

```
The following build commands failed:
CodeSign ./Frank/frankified_build/Applications/HOGE.app
(1 failure)
```

* 実行したxcodebuildコマンドは以下の通り

```
$ xcodebuild \
  -target HOGE \
  -xcconfig ./Frank/frank.xcconfig \
  -arch armv7 \
  -configuration Debug \
  -sdk iphoneos \
  DEPLOYMENT_LOCATION=YES \
  DSTROOT="./Frank/frankified_build" \
  FRANK_LIBRARY_SEARCH_PATHS="./Frank" \
  clean build
```

## 対処法
* 原因は他にもある場合もあるが、可能性の１つとして参考にしてもらえれば！
 * xcodebuildを実行する前に以下を実行する

```
$ security unlock-keychain -p <ログインパスワード> <キーチェーンのパス>
# ex) 
# security unlock-keychain -p password /Users/foo/Library/Keychains/login.keychain
```

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
1分でPython&CSSセレクタによるスクレイピングを実現する

##導入

```sh:導入
pip install pyquery
```

##サンプルコード

```python:サンプルコード
# -*- coding: utf-8 -*-
from pyquery import PyQuery as pq
url = "http://www.sicafe.net/macPackageManageTips/html/homebrewPythonInstall.html"
query = pq(url)
for a in query.find("a"):#CSSセレクタ！！
  print pq(a).text()


#出力結果
#前略
#Mac OS X Lion / homebrew にて python の環境を整える
#ポイント
#手順
#1. brew の更新と python のインストール
#2. pipの再インストール
#3. 古い環境の掃除と path の変更
#4. sphinx とかを再インストールしてみる
#5. pip で PIL をインストールしようとしても失敗する
#6. pip で PIL をインストールするときの注意点
#とりあえず現状の pip freeze
#Mac OS X Lion でとりあえずやった環境設定
#Show Source
#index
#previous
#JAWSUG-Okinawa 2nd study NOTE
#Sphinx
```
Redmineのユーザのメール通知を止める

Redmineのパスワード強制変更について前回書きましたが、同様にバージョンアップの検証環境などで動作確認をしつつ、メールだけはユーザに飛ばしたくない、というケースなどに、この方法を使っています。

たとえば：

* 検証環境のサーバの設定としては、メール通知を許可している。
* 本番環境のデータをコピーして検証していて、アカウント／設定は本番同様。
* Admin権限でチケットやプラグインの動作確認をしていて、更新テストもするが、そのままではメールが飛んでしまうので宜しくない。
* テストしている自分だけにメールが飛んで欲しい。

もちろん、DBからの一括更新でも大丈夫です。

下記は、Adminアカウント以外の通知をOffにする場合です。

```
# rails console production
Loading production environment (Rails x.x.x)
>> @users = User.all
>> for user in @users
>>   if user.login != 'admin'
>>     user.mail_notification = 'none'
>>     user.save!
>>  end
>> end
```
ただし、本番環境では、このようにはできませんので、データの一括インポートや、Adminアカウントによる変更をメールさせたくない場合は、このプラグインが便利です。

* Redmine Stealth Plugin
  * http://www.redmine.org/plugins/redmine_stealth
[Go] ファイルや標準入力から一行ずつ読み込む

おあつらえ向きな関数名の[bufio.ReadLine()](http://golang.org/pkg/bufio/#Reader.ReadLine)というのがありました。が、ドキュメントを読むとこれは低レベルの関数で、たいていの利用者はReadBytes('\n')かReadString('\n')かScannerを使うべきとあります。

[bufio.Scanner](http://golang.org/pkg/bufio/#Scanner)を使うのが良いようです。Example (Lines)のところにそのものスバリのサンプルコードがあります。

```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		fmt.Println(scanner.Text()) // Println will add back the final '\n'
	}
	if err := scanner.Err(); err != nil {
		fmt.Fprintln(os.Stderr, "reading standard input:", err)
	}
}
```

空白区切りで単語単位で読み込む例も書いてあります。
連番の空ファイルを生成するワンライナー


 ```bash
$ for count in `seq -w 100`;do :> file_$count;done
```

生成結果
> $ for count in \`seq -w 100`;do :> file_$count;done
  $ ls
file_001  file_021  file_041  file_061  file_081
file_002  file_022  file_042  file_062  file_082
file_003  file_023  file_043  file_063  file_083
file_004  file_024  file_044  file_064  file_084
file_005  file_025  file_045  file_065  file_085
file_006  file_026  file_046  file_066  file_086
file_007  file_027  file_047  file_067  file_087
file_008  file_028  file_048  file_068  file_088
file_009  file_029  file_049  file_069  file_089
file_010  file_030  file_050  file_070  file_090
file_011  file_031  file_051  file_071  file_091
file_012  file_032  file_052  file_072  file_092
file_013  file_033  file_053  file_073  file_093
file_014  file_034  file_054  file_074  file_094
file_015  file_035  file_055  file_075  file_095
file_016  file_036  file_056  file_076  file_096
file_017  file_037  file_057  file_077  file_097
file_018  file_038  file_058  file_078  file_098
file_019  file_039  file_059  file_079  file_099
file_020  file_040  file_060  file_080  file_100


*  seq -wオプションを使ってゼロパディング対応
*  ```touch```よりも```:>```を使ったほうが空ファイル生成が早かった

※13/10/1追記

# もっと早い方法があった
```bash
$ seq -f "file_%05g" 100 | xargs touch
```

* 作成するファイル名をxargsに渡して作成コマンド実行回数を減らした
* ゼロパディングは作成個数に応じてseq -fオプションのフォーマットを調整

# 10万ファイル作成時間を比較

>
$ time for count in \`seq -w 100000`;do :> file_$count;done
real	0m1.607s
user	0m0.092s
sys	0m1.512s
>
$ time seq -f "file_%06g" 100000 | xargs touch
real	0m0.269s
user	0m0.052s
sys	0m0.248s

早くなりました。
積み木の水槽

```rb:hena13.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/936e7885f4c607472060
#http://nabetani.sakura.ne.jp/hena/ord13blocktup/
STDOUT.sync=true
while gets
	n=0
	# 83141310145169154671122 => [[8,3,1,4,1,3,1],[1,4,5,1,6,9,1,5,4,6,7,1,1,2,2]]
	$_.chomp.split('0').map{|e|e.split('').map(&:to_i)}.each{|a|
		2.step(a.max||0){|i| #2段目から順番に
			b=a.each_with_index.select{|e|e[0]>=i} # [8,3,1,4,1,3,1] => [[8,0],[3,1],[1,2],[4,3],[1,4],[3,5],[1,6]]
			n+=b.last[1]-b.first[1]-1-(b.size-2) # n+=0 if b.size==1
		}
	}
	puts n
end
```
memolist.vimのメモファイルをUniteで一覧する

# 問題

[memolist.vim](http://blog.glidenote.com/blog/2012/03/26/memolist.vim/)で作成したメモの一覧もUniteで見たい。

# 解決

以下の様な設定をほどこす。

```vim
let g:memolist_path = "~/Dropbox/memo"
nmap ,mf :<C-u>execute('Unite file_rec/async:' . g:memolist_path)<CR>
```

これで、`,mf`でmemolist.vimのメモ一覧を一発で開けて便利。

## 追記

と思ったら作者に、memolistは既にUnite対応してるとおしえてもらいました。以下のような設定だけでいける。

```vim
let g:memolist_unite        = 1
let g:memolist_unite_source = "file_rec"
let g:memolist_unite_option = "-start-insert"
```

あとは普通に`:MemoList`コマンドを起動するだけ。

![](http://gyazo.com/100dabdf2da07fdef56376e69cb19997.png)

# 議論

[mattnさんがctrlp.vim用に書いてた設定](http://mattn.kaoriya.net/software/vim/20120328183428.htm)のUnite版です。

てか、変数を展開しつつUniteを起動するやりかた、これでいいのかよくわからない。
増やす減らす二倍する

横へなの中では最も基礎的な問題ではないかと.
いつものことながら採点プログラムと同時に動かす必要があります.

```cpp:hena13pre.cpp
//http://nabetani.sakura.ne.jp/hena/ord13updowndouble/
//http://qiita.com/Nabetani/items/89fb0e2e712d4b396535
#include <queue>
#include <map>
#include <cstdio>
using namespace std;
int main(){
	int n;
	map<int,int>back;
	back[0]=0;
	back[1]=0;
	map<int,int>count;
	count[0]=0;
	count[1]=1;
	queue<int>q;
	q.push(1);
	for(;!q.empty();){
		int x=q.front();q.pop();
		int a[3]={x-1,x+1,x*2};
		for(int i=0;i<3;i++){
			if(a[i]<500000&&count.find(a[i])==count.end()){
				back[a[i]]=x;
				count[a[i]]=count[x]+1;
				q.push(a[i]);
			}
		}
	}
	for(;~scanf("%d",&n);){
		printf("%d\n",count[n]);fflush(stdout);
	}
	return 0;
}
```
Pythonで単語の数え上げとかするならCounterを使うと便利なはなし

Mecabで遊んでて、いいのないかなって思ったら見つけたのでメモ。

テキストでもCSVでも何でも良いですが、重複の存在するようなリストで、各要素の出現頻度を数えるようなコードを書きたいことはまれによくあると思います。
辞書を使って素直に実装すると

```python

data = ['aaa', 'bbb', 'ccc', 'aaa', 'ddd']

word_and_counts = {}
for word in data:
    if word_and_counts.has_key(word):
        word_and_counts[word] += 1
    else:
        word_and_counts[word] = 1
for w, c in sorted(word_and_counts.iteritems(), key=lambda x: x[1], reverse=True):
    print w, c  # =>
                #   aaa 2
                #   bbb 1
                #   ccc 1
                #   ddd 1
```

とかそんな感じの雰囲気になると思います。

こういうとき[collectionsモジュール](http://docs.python.jp/2/library/collections.html)が便利なんですよ。
つうわけでcollections.Counterを使って実装しなおします。

```python
from collections import Counter

data = ['aaa', 'bbb', 'ccc', 'aaa', 'ddd']
counter = Counter(data)
for word, cnt in counter.most_common():
    print word, cnt # =>
                    #   aaa 2
                    #   bbb 1
                    #   ccc 1
                    #   ddd 1
```

なんか簡潔に実装出来ました。しかも組み込みなので早そうです。
その上、Counterは他にも各種演算子や便利メソッドをそなえています。

```python
from collections import Counter

dataA = ['aaa', 'bbb', 'ccc', 'aaa', 'ddd']
dataB = ['aaa', 'bbb', 'bbb', 'bbb', 'abc']

counterA = Counter(dataA)
counterB = Counter(dataB)

counter = counterA + counterB  # 頻度を足し合わせられる
counterA.subtract(counterB)  # 要素の差をとる（破壊的メソッド）
counter.most_common(3)  # 上位3要素の取得（上記の例のように、引数nの省略を省略すればすべての要素を降順で取得）
# 他にもいくつか
```

ハッシュ可能なオブジェクトであれば良いということなので、他にもなんかいい感じの使い道があるかもですね？

他にも、collectionsモジュールはいい感じに便利なクラスがあったりするので一度目を通しておくとたまに役に立つ気がします。


最終的に、Counterを使って、ダウンロードしてきたツイッターのツイート履歴でMecabってみたコードが以下の感じになります。

```python
# -*- coding: utf-8 -*-

from collections import Counter
import codecs
import json

import MeCab


# バッドノウハウ感あるけど、出力結果をリダイレクトしたいし
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

# codecsはunicodeを返す
# 一行目に余計な記述があってだるいしテストコードだし面倒なので事前に消しておこう
_tweetfile = codecs.open('./data/js/tweets/2013_09.js', 'r', 'sjis')
tweets = json.load(_tweetfile)
# Mecabはstr型しか受け付けないのでエンコード
texts = (tw['text'].encode('utf-8') for tw in tweets)

tagger = MeCab.Tagger('-Ochasen')
counter = Counter()
for text in texts:
    nodes = tagger.parseToNode(text)
    while nodes:
        if nodes.feature.split(',')[0] == '名詞':
            word = nodes.surface.decode('utf-8')
            counter[word] += 1
        nodes = nodes.next
for word, cnt in counter.most_common():
    print word, cnt
```

名詞かどうかを判別する部分がダサかったり、記号が入り込んだりしますがひとまずいい感じに動きました。めでたしめでたし。

------

こういう小技っぽいものをまとめてみたのでよろしければどうぞ　（[覚えるだけでPythonのコードが少し綺麗になる頻出イディオム](http://hachibeechan.hateblo.jp/entry/Python-idiom-101)）
XY-Sort

STDOUT.syncとreduceブロック以外は変数使わずに書けました

```rb:hena7pre.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/7b08b0eb9ef84d7cfe49
#http://nabetani.sakura.ne.jp/hena/ord7xysort/
STDOUT.sync=true
class Array
	def stable_sort(idx)
		sort_by.with_index{|s,i|[s[idx],i]}
	end
end
A=[
	[4,1,4,2,1,3],
	[7,3,2,0,5,0],
	[2,3,6,0,6,7],
	[6,4,5,7,5,1],
	[3,1,6,6,2,4],
	[6,0,5,5,5,1],
]
F={
	'u'=>lambda{|a|a.stable_sort(0)},
	'v'=>lambda{|a|a.stable_sort(1)},
	'w'=>lambda{|a|a.stable_sort(2)},
	'x'=>lambda{|a|a.stable_sort(3)},
	'y'=>lambda{|a|a.stable_sort(4)},
	'z'=>lambda{|a|a.stable_sort(5)},

	'A'=>lambda{|a|a.transpose.stable_sort(0).transpose},
	'B'=>lambda{|a|a.transpose.stable_sort(1).transpose},
	'C'=>lambda{|a|a.transpose.stable_sort(2).transpose},
	'D'=>lambda{|a|a.transpose.stable_sort(3).transpose},
	'E'=>lambda{|a|a.transpose.stable_sort(4).transpose},
	'F'=>lambda{|a|a.transpose.stable_sort(5).transpose},
}
while gets
	puts $_.chomp.chars.reduce(A){|s,e|s=F[e][s]}[0]*''
end
```
.zshrcで見かけるautoloadの意味と使い方

.zshrcにこういうのありませんか？

```.zshrc
autoload -U compinit
```

今回はこの `autoload` が何をするものなのか解説します。

## autoloadはシェル関数を読み込む

`autoload` はシェル関数を **自動読み込み** するシェルの組み込み関数です。上記のスクリプトの場合、 `compinit` というシェル関数を自動読み込みします。

シェルコマンドは `PATH` に入っていればそれだけで実行可能でしたが、シェル関数の場合は関数を定義しなければ使えません。 `autoload` はファイルシステム上にある関数定義を読み込むための関数なのです。そして `autoload` 探索するディレクトリは `FPATH` に入っています。

余談ですが `FPATH` だと `:` 区切りの文字列、 `fpath` だと配列になります。`PATH` と `path` と同じですね。

- [シェル関数とシェルコマンドの違い](http://qiita.com/yuku_t/items/1e6fc02d09038695f805)

## autoloadを使ってみる

```zsh
% mkdir ~/functions
% FPATH="${HOME}/functions:${FPATH}"  # ~/functionsをfpathに登録
% cat << EOF > ~/functions/test-func
#!/bin/zsh
echo Hello autoload
EOF
% ls ~/functions
. .. test-func
```

test-func という関数をfpathに登録したので実行してみます。

```zsh
% where test-func
test-func not found
% autoload test-func
% where test-func   # (1)
test-func () {
 	# undefined
	builtin autoload -X
}
% test-func
Hello autoload
% where test-func  # (2)
test-func () {
        echo Hello autoload
}
```

たしかに `~/functions/test-func` の中身を持つ関数が作られました。

ところで **(1)** で表示される関数の中身がなんかおかしいですね。 `builtin` は引数を強制的に組み込み関数名として解釈する関数なので、結局 `autoload -X` をやっているだけですが、意図したものとは異なります。一方で一回関数を実行した後の **(2)** になると意図したものになっています。

実はこの `-X` オプションがない場合、 `autoload` コマンドは autoload という名前にも関わらず関数を登録するだけで、実体をロードしません。そして `-X` があると、関数を実際にロードしてかつ即座に実行します。つまり、こうすることでzshは関数を遅延読み込みしているわけですね。

```zsh
# 下の2行は即座に実行される点で同じ
autoload test-func; test-func
autoload -X test-func  # 余計な中間関数がないので若干効率的
```

ロードだけして実行しない場合は `+X` オプションを使います。先ほどの `test-func` がまだロードされていない状態だとすると

```zsh
% where test-func
test-func not found
% autoload +X test-func  # ロードする
% where test-func  # ロード済みになっている
test-func () {
        echo Hello autoload
}
```

`-X` と `+X` オプションは覚えなくていいですが、zshrcでいくら `autoload` しようが立ち上がり速度にはそこまで影響がない、ということは覚えておいて損は無さそうです。

## -Uオプション

冒頭のコマンド

```zsh
autoload -U compinit
```

ですが、この `-U` オプションは一体何の働きをするのでしょう？個人的な観測範囲でいえば `autoload` で `-U` を使っていない場面をみたことがありません。

実はこのオプションは、展開される関数の内部で `alias` の展開を **しない** ためのオプションです。つまり、これがないとあなたが適当に作った`alias` が干渉して、関数の動作が変わってしまう危険があるので、それを回避するために使うのです。

```zsh
% alias foo='echo bar'
% cat << EOF > with-U > without-U
foo
EOF
% autoload -U with-U; with-U
zsh: command not found: foo
% autoload without-U; without-U
bar
```

というわけで `autoload` を使うときは **必ず** `-U` オプションを使った方がよさそうです。

ちないに `-U` と `-X` は同時には使えないみたいです。なので `-U` してかつ即座に実行したい場合は下記のようにしなければいけません。

```zsh
autoload -U funcname; funcname
```

`-X` オプションの説明に、シェルスクリプト内部でしか使うことないと思う、みたいなことが書いてあって、たぶんここら辺の事情が関係しているんだと予想してます。

## もうちょっと追いかけてみる

`autoload` みたいな組み込み関数についてのマニュアルは zshbuiltins(1) にあります。それによると

> `-X`, `+X`, `-w` なしの `functions -u` と等しい

とあります。そして `functions` は

> `-M` なしの `typeset -f` と等しい

つまり `autoload` は `typeset -fu` と等しい、ということになります。そもそも `typeset` が何をするのかというと、簡単な話が変数宣言です。

例えば環境変数を設定する `export` は `typeset -gx` と同じです。 `-g` はグローバルフラグで、 `-x` は宣言した変数が環境変数であることを意味します。これによって宣言された変数が環境変数として外部からも利用可能になります。

で、問題の `typeset -fu` ですが、 `-f` は関数(function)である、という意味で `-u` は(`-f` と一緒に使っている場合)その関数を自動読み込み(autoloading)する、という意味です。

なるほどなるほど

## 合わせて読みたい

- zshmisc(1) の AUTOLOADING FUNCTIONS
- zshbuiltins(1)
sbt-assemblyで作るjarのMANIFEST.MFの内容を指定する

タイトルのまんまです。
JavatterプラグインをScalaで開発していて、sbt-assemblyでjarに固めていたのですが`MANIFET.MF`の内容を中々設定できなくて困ったのでメモしておきます。

##方法

`packageOptions`に`Package.ManifestAttributes`を追加すればいいようです。

```build.sbt
packageOptions in (Compile, packageBin) +=
    Package.ManifestAttributes("Plugin-Main" -> "info.alucky...")
```

みたいな感じに。

他にも、分けておいたManifestファイルから読み込むこともできるらしいです。

参考: <http://www.scala-sbt.org/release/docs/Howto/package.html>
textobjの範囲選択をいい感じに行う

# 問題

`i(`とか`i"`とか`i<`とか、いちいち入力しわけるのがだるい。

# 解決

[textobj-multiblock](http://d.hatena.ne.jp/osyo-manga/20130329/1364569153)を使う。

内容は↑のリンク先の通り。

# 議論

この記事によってなんの情報量も増えてないけど、社内のVim詳しいひとでも知らないひとが多かったので、書いた。

個人的に、いまのところ一番好きなVimプラグインです(Vim歴15日)。
Uniteで.gitを基準に検索する

# 問題

Uniteを使って、プロジェクト単位で検索したい。

# 解決

Unite自体で対応されていた。

<blockquote class="twitter-tweet"><p>そういえば、unite.vimは.git以下で絞り込みができない、と言われているようですが、最新版のunite.vimは:Unite file_rec:!や:Unite file_rec/async:!でプロジェクトのディレクトリを認識するんですよ！</p>&mdash; 暗黒美夢王(Shougo) (@ShougoMatsu) <a href="https://twitter.com/ShougoMatsu/statuses/197635918633508864">May 2, 2012</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

以下のように設定した。

```vimL
nnoremap <silent> ,e  :<C-u>Unite file_rec/async:!<CR>
```

# 議論

[ctrlp.vim](https://github.com/kien/ctrlp.vim)が不要になった。
64bit OSにHTKをインストールする

環境変数CFLAGSに"-m64"を追加してconfigure && make && make install するのが簡単

```
export CFLAGS="-m64"
```

x系のヘッダがないと怒られる場合は、

```
sudo apt-get install xorg-dev
```

とする。ubuntu 12.04 lts 64bitではこれでいけた。

ちなみに32bit互換のライブラリを入れて何とかする方法もあるけど、-m64を追加するほうが簡単だった。

何回もはまってるのでメモ
日報をVimで書く

# 問題

日報をブラウザで書くのがだるい。

# 解決

[nippoコマンド](https://github.com/kentaro/nippo)を使う。

1. `$EDITOR`をvimにする
2. nippoコマンドをインストールする
3. 適当に書く
4. `:wq!`で終了する

以下のような感じ。

![](http://gifzo.net/BFD7rw20DQW.gif)

# 議論

paperboy社特化のtipsですが、各社で工夫できると思います。
自作ビューで layout_width のマネをしたい時


``android:layout_width`` って、型は ``dimension`` であるのに、Layout XML には、 ``"match_parent"`` とか ``"wrap_content"`` とか指定できる。これと同じことを自作ビューの自作プロパティでやりたい。

自作ビュー(カスタムビュー)の作りかたは下などを参照。

* [Androidでxmlファイルを用いてカスタムViewを作る方法 | Tech Booster](
http://techbooster.org/android/application/7361/)

で、``android:layout_width`` のマネをするには、 attrs.xml に以下のように書く。

```xml：attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="MyCustomView">
    <attr name="my_width" format="dimension">
      <enum name="fill_parent" value="-1" />
      <enum name="match_parent" value="-1" />
      <enum name="wrap_content" value="-2" />
    </attr>
  </declare-styleable>
</resources>
```

Android Framework のソースコードにこう書いてあったので、真似しただけ。

* [GrepCode: frameworks / base / core / res / res / values / attrs.xml - Source Code View](http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/frameworks/base/core/res/res/values/attrs.xml)

自作ビューの実装クラスで、この値を読み込む時は、``TypedArray.getLayoutDimension`` を使う。

```java:MyCustomView.java
public MyCustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
    
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView, 0, 0);

    _myWidth = a.getLayoutDimension(R.styleable.MyCustomView_my_width, 
            LayoutParams.WRAP_CONTENT);
    
    a.recycle();
}
```

Android Framework 側で仕様が増えた時は、追従しないといかんのかー。
ブランチ名をコミットメッセージにしてコミットするエイリアス

```:~/.gitconfig
cib = !git commit -m \"`git rev-parse --abbrev-ref HEAD | ruby -e \"print STDIN.read.strip.gsub('-', ' ').capitalize\"`\"
```

とかして、ブランチ名 (ブランチ名はハイフン区切り) をコミットメッセージにする。

```zsh
☁  git co -b remove-foo-file-from-head
Switched to a new branch 'remove-foo-file-from-head'
☁  git cib
[remove-foo-file-from-head 8f04925] Remove foo file from head
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 b.txt
```

アイディアは [爆速でトピックブランチを切るGitのエイリアス](http://qiita.com/fujimura/items/c537e142cacff882c454) から頂きました。この逆バージョン。
WordPress: アイキャッチ画像のURLを取得する function【functions.php】


```php:functions.php
/**
 * アイキャッチ画像のURLを取得
 *
 * @param string $size アイキャッチ画像サイズの名前
 * @param string $type echoするなら 'e' を第二引数に渡す
 * @return string アイキャッチ画像のURL
 */
function get_featured_image_url($size, $type = '')
{
  $image_id  = get_post_thumbnail_id();
  $image_url = wp_get_attachment_image_src($image_id, $size, true);

  if ($type === 'e')
  {
    echo $image_url[0];
  }
  else
  {
    return $image_url[0];
  }
}
```
WordPress: 最終更新日を取得する function【functions.php】


```php:functions.php
/**
 * 最終更新日を取得
 *
 * @param string $format 日付フォーマット
 * @return string 最終更新日 - 投稿日より新しい場合に最終更新日を返す
 */
function get_last_modified($format)
{
  $posted_time   = get_the_time('Ymd');
  $modified_time = get_the_modified_time('Ymd');

  if ($posted_time > $modified_time)
  {
    return get_the_time($format);
  }
  elseif ($posted_time === $modified_time)
  {
    return null;
  }
  else
  {
    return get_the_modified_time($format);
  }
}
```
CodeIgniterにクラスのオートローディングのサポートがなかったので

サーバのPHPバージョンが5.3未満で、じゃあCodeIgniter使うかーってことにしたのですが、クラスのオートローディングのサポートないのですね...
（"オートロードがない"って言っちゃうと、あるじゃんって言われちゃうと思うのですが、__autoLoad関数とかspl_autoload_register関数を使った”クラス参照時にクラスファイルを読み込む”って形のものです）


<del>modelは動的に読み込んでますが、model以外のクラスでもオートローディングしたいですよね？</del>
modelのように読み込むのは $this->load->library()  （localdiskさんありがとうございます）で可能ですが、コントローラの親クラスを読み込むのどうしようってことで...

分かり難いと思うけど↓のような継承関係

> CI_Controller  
>> MY_Controller
>>> AbstractResourceController 　　←ここのload  
>>>> ルーティングで到達するコントローラ  

>>> AbstractXxxxxController 　　　　←ここのload  
>>>> ルーティングで到達するコントローラ  

>>> ルーティングで到達するコントローラ  


という事で、ないものはしょうがないので追加しちゃいましょー

```php:hooks/code-igniter-class-loader.php
<?php

/**
 * CodeIgniterClassLoader
 * 
 * クラス名をキャメルケースからハイフンケースにして、classesディレクトリからファイルを読み込む（アンダースコアは DIRECTORY_SEPARATOR に置換）
 * 
 * @license MIT
 * @author atomita
 */
class CodeIgniterClassLoader {

	function init() {
		spl_autoload_register(array('CodeIgniterClassLoader', 'loader'));

		if (!function_exists('lcfirst')) {

			function lcfirst($value) {
				return strlen($value) ? strtolower($value[0]) . substr($value, 1) : '';
			}

		}
	}

	static function loader($class_name) {
		return self::classLoader($class_name);
	}

	static function classLoader($class_name) {
		$segments	 = explode('_', str_replace('\\', '_', ltrim($class_name, '\\')));
		$file		 = implode(DIRECTORY_SEPARATOR, array_map(array('CodeIgniterClassLoader', 'camel_case_to_hyphen_case'), $segments));
		$path		 = APPPATH . 'classes' . DIRECTORY_SEPARATOR . $file . '.php';

		if (file_exists($path)) {
			include_once $path;
			if (class_exists($class_name, false) || interface_exists($class_name, false)) {
				return true;
			}
		}
		return false;
	}

	static function camel_case_to_hyphen_case($value, $isLcfirst = true) {
		static $callback = null;
		if ($callback == null) {
			$callback = create_function('$m', 'return $m[1] . \'-\' . strtolower($m[2]);');
		}

		$value = preg_replace_callback('/(.)([A-Z])/u', $callback, $value);
		if ($isLcfirst) {
			$value = lcfirst($value);
		}
		return $value;
	}

}
```

CodeIgniterのhook機能でCodeIgniterClassLoaderクラスを呼び出しておくために、 config/hooks.php を編集してください。
（hooksディレクトリ以外にCodeIgniterClassLoaderを設置した場合は、filepathの値を変更してください）

```php:config/hooks.php
$hook['pre_system']	 = array(
	array(
		'class'		 => 'CodeIgniterClassLoader',
		'function'	 => 'init',
		'filename'	 => 'code-igniter-class-loader.php',
		'filepath'	 => 'hooks',
	),
);
```

クラスコメントにも書いてますが、キャメルケースなクラス名をハイフン区切りにして、APPPATH以下のclassesディレクトリ内のファイルを探します。
命名規則がCodeIgniter的じゃないですがｗ
Go用のvim設定

# 環境変数の設定

## GOROOT環境変数

[Getting Started - The Go Programming Language](http://golang.org/doc/install#install)によると、(バイナリパッケージで) /usr/local/go (WindowsではC:\Go)以外の場所にインストールした場合はGOROOT環境変数を設定する必要があるそうです。

私は/usr/local/goにインストールしています。

## GOPATH環境変数

GOPATHは[go get](http://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies)でサードパーティのライブラリソースをインストールするディレクトリを設定します。私は~/goにしています。

```
export GOPATH=~/go
```

## PATH環境変数

あとは~/.bash_profileに以下の行を追加してPATHを通しておきます。

```
export PATH=$PATH:/usr/local/go/bin
```

# vim設定

[jnwhiteh/vim-golang](https://github.com/jnwhiteh/vim-golang)を参考にしています。

```vim
" go setttings
filetype off
filetype plugin indent off
set runtimepath+=/usr/local/go/misc/vim
au FileType go setlocal sw=4 ts=4 sts=4 noet
au FileType go setlocal makeprg=go\ build\ ./... errorformat=%f:%l:\ %m
au BufWritePre *.go Fmt
filetype plugin indent on
syntax on
```

Goには[gofmt](http://golang.org/cmd/go/#hdr-Run_gofmt_on_package_sources)というソースコード整形ツールがあります。```au FileType go setlocal sw=4 ts=4 sts=4 noet```はgofmtに合わせてタブでインデントするための設定です。

```au FileType go setlocal makeprg=go\ build errorformat=%f:%l:\ %m```は```:make```でビルドして```:copen```でビルドエラーのquickfixウィンドウを開くための設定です。

```au BufWritePre *.go Fmt```はファイル保存時にgofmtを実行するための設定です。
rsyncの-R(--relative)オプション

rsync で -R オプションを使ってたら、同僚から「なんぞそれ」と聞かれたので、私の -R オプションの使い方を書いておきます。

---

ソースのディレクトリ構成は次のようになっていたとします。

```
/tmp/source/
  aaa/
    aaa.txt
  bbb/
    bbb.txt
  ccc/
    ccc.txt
  xxx/
    xxx.txt
  yyy/
    yyy.txt
  zzz/
    zzz.txt
  kuso.txt
  miso.txt
  tech.txt
```

これを別のサーバに次のように転送したいとします。

```
/tmp/target/
  aaa/
    aaa.txt
  bbb/
    bbb.txt
  ccc/
    ccc.txt
```

ポイントは・・・

 - aaa と bbb と ccc だけ転送したい
 - 転送先の基準ディレクトリが異なる（/tmp/source/ != /tmp/target/）

---

普通にやると次のようになるでしょうか

```console
$ rsync -azvn /tmp/source/ remote:/tmp/target/ --include /aaa/ --include /bbb/ --include /ccc/ --exclude /\*
```

 * `--include /aaa/`
 * `--include /bbb/`
 * `--include /ccc/`
    * 必要なディレクトリを含める
 * `--exclude /\*`
    * その他のファイル/ディレクトリを除外

--include や --exclude が沢山出てきてうっとうしいです。

---

そこで -R オプションを使います。

```console
$ cd /tmp/source/
$ rsync -Razvn aaa/ bbb/ ccc/ remote:/tmp/target/
```

-R オプションを使うと転送元に指定したディレクトリ/ファイルの名前がそのまま転送先のディレクトリの下に展開されます。なので aaa/ のようなディレクトリ名の指定で remote:/tmp/target/aaa/ のように転送されます。

カレントディレクトリを変更するのが気持ち悪ければ次のようにもできます。

```console
$ rsync -Razvn /tmp/source/./{aaa,bbb,ccc}/ remote:/tmp/target/
```

転送元のディレクトリの途中に /./ があれば、それ以降のパスが転送先のディレクトリの下に展開されます。
爆速でトピックブランチを切るGitのエイリアス

こういうエイリアスを用意しておくと、

```gitconfig
tb =  "!sh -c \"git checkout -b `git log --pretty=\"%s\" -1 | ruby -e \"print STDIN.read.strip.gsub(/[^a-zA-Z0-9]/, '-').downcase\"`\""
```

直近のコミットコメントからトピックブランチを切れます。

```
$ touch foo
$ git add foo
$ git commit -m "Add foo, only for test/staging env"
[mster f5455b1] Add foo, only for test/staging env
 1file changed, 0 insertions(+), 0 deletions(-)
 ceate mode 100644 foo
$ git tb
Swtched to a new branch 'add-foo--only-for-test-staging-env'
```



## 追記(2014-01-21)

ブランチ名生成は別スクリプトにしました。

`git-tb`にパスを通しておいてください。

`.gitconfig`

```gitconfig
  tb              = git-tb
```


`git-tb`

```ruby
#! /usr/bin/env ruby

branch_name = `git log --pretty="%s" -1`.
  strip.
  gsub(/[^a-zA-Z0-9]/, '-').
  gsub(/--*/, '-').gsub(/^-|-$/, '').downcase

`git checkout -b #{branch_name}`
```
そのgitリポジトリで自分の書いたコードの行数を数える。

大人の事情で自分の書いたコード行数を対外的に説明しないといけないときがあったりします。
そんなときはこれ

```shell-session
git ls-files | xargs -n1 git --no-pager blame -f -w|grep 自分のgitユーザ名 |wc -l
```

git ls-filesでリポジトリ管理下のファイル名一覧を獲得し

git --no-pager blameで全部の行の作者を行単位で吐き出し

grepで自分が作者になってる行を洗い出して

wc -lでカウントします。

簡単ですね。
Vimで、EmacsのC-oみたいな動作をする

# 問題

`o`や`O`は便利なのですが、時には以下の様な場合があります。

* カーソルを移動させたくない
* インサートモードに入ってほしくない

# 解決

以下のような設定を追加します。

```vimL
" EmacsのC-oと同じ動作
nnoremap go :<C-u>call append('.', '')<CR>

" ↑の逆バージョン
nnoremap gO :normal! O<ESC>j
```

↓こんな感じ。

![](http://gifzo.net/cBJEsVu8in.gif)

# 議論

最初は、`o`/`O`を置き換えていたけれども、それはそれで不便だったので、`go`/`gO`にした。
Xcode5でカバレッジレポートを作成する方法


#  前提条件

+ Xcode4でカバレッッジレポートを出していた
+ 対象osが6も含んでいる

# 解決方法

+ ターゲットをios7にすると *.gcda ファイルが作成されないのでカバレッジが出せない。<del>なので、ターゲットを6.1などにする。</del>　XCTestObserverというものでやるらしい。
http://stackoverflow.com/questions/19136767/generate-gcda-files-with-xcode5-ios7-simulator-and-xctest
 + nameはxcodeの左上のスキーマ部分に表示されている文言と合わせる
+ jenkinsでも、build時に以下のシェルを叩くようにする
+ jenkinsサーバーでは、権限で動作しないことがないように、workspaceなどにファイルを置くようにする

```
/usr/bin/xcodebuild -scheme SampleCommandLineUnitTest -workspace Sample.xcworkspace -destination OS=6.1,name='iPhone Retina (4-inch)' -configuration Debug clean build test
SYMROOT=${WORKSPACE}/build CONFIGURATION_BUILD_DIR=${WORKSPACE}/build CONFIGURATION_TEMP_DIR=${WORKSPACE}/build 
```

あとは、以下のようにカバレッジを表示する

```
/usr/local/bin/gcovr -v --xml -e '.*Tests/' -o cobertura-coverage-report.xml -r ${WORKSPACE}
```
Vimでファイルを自動保存する

# 問題

編集したあとにいちいち`:w`とかして保存するのがだるい。Emacsでいうところの以下の拡張のようなことをしたい。

  * [auto-save-buffers](http://0xcc.net/misc/auto-save/)
  * [auto-save-buffers-enhanced](https://github.com/kentaro/auto-save-buffers-enhanced)

# 解決

[vim-auto-save](https://github.com/vim-scripts/vim-auto-save)を使う。

設定は以下(NeoBundleの場合)。

```vimL
NeoBundle 'vim-scripts/vim-auto-save'

" デフォルトで有効にする
let g:auto_save = 1
```

200msecなんもしなかったり(デフォルト設定)、インサートモードを抜けたりした時に、ファイルが保存される。

# 議論

> 実際のところ、僕の場合は、auto-save-buffers を設定してから困っ たことはほとんどない。その反対に以前は、ファイルが自動保存さ れないために、編集内容を失ったり、コードは修正したものの保存 を忘れて「なんでバグが直らないんだ!」と混乱したりと、困った ことは何度もあった。誰もが auto-save-buffers に向いていると は言わないけど、興味のある人は試してもらえるとうれしい。これ に慣れると「ファイルの保存」を手動で行うなんてばかばかしいと 気づくはずである。

[Emacsでファイルの自動保存 (auto-save-buffers)](http://0xcc.net/misc/auto-save/)

ファイルの保存をフックにサーバをリロードしたりテストを実行したりするような設定とは相性が悪いが、人生においてはサーバの再起動やテストの実行よりファイルの保存のほうが機会が圧倒的に多いので、自動保存のほうが幸せをもたらす。
チェックボックスのオンオフ

探しても複数パタンばかり出てくるので、メモり。

```form.html
<form action="test.php" method="post" name="chekbo">
<input type="hidden" name="testcheck" value="0">
<input type="checkbox" name="testcheck" value="1">オン
</form>
```

で投げて

```test.php
<?php $_POST['testcheck'] == 1 ? echo "オン": echo "オフ"; ?>
```

で受け取って表示。
Yii frameworkのlazy loadingとeager loading

`Post has many Comment` という[Yii公式ガイド](http://www.yiiframework.com/doc/guide/1.1/ja/)によく登場するモデルを例に記載してみます。

# lazy loading(default)

```php
$posts = Post::findAll();
foreach($posts as $post){
  foreach($post->comments as $comment){
    echo $comment->content;
  }
}
```
最初にpostsがSELECTされ、$post毎にcommentsがSELECTされる。
SELECT回数は(1+post数)となり、いわゆるn+1問題が起きる。
（パフォーマンス上のボトルネックとして顕在化してきて初めて発覚するケースが多いかも。）
使い方によっては省メモリ。

# eager loading

イーガーローディングはtogetherオプションにより、2つの手法を使い分けられるようになっている。

## `together => true`の場合

```php
$posts = Post::findAll(['with'=>['comments' => ['together' => true]]]);
foreach($posts as $post){
  foreach($post->comments as $comment){
    echo $comment->content;
  }
}
```
最初のSELECTでpostsとcommentsのオブジェクトが全てロードされる。
SELECTは1回だけ。
DBから返却されるデータセットとしては、postsが各コメントにくっついてくるため、
余分なデータがアプリケーションに返却され、冗長かつ無駄が多いが、
クエリ回数が少なくなる等、メリットがある。
Yiiでpostsオブジェクトまで冗長に生成はしてないはず。

## `together => false`の場合

```php
$posts = Post::findAll(['with'=>['comments' => ['together' => false]]]);
foreach($posts as $post){
  foreach($post->comments as $comment){
    echo $comment->content;
  }
}
```
最初にpostsがSELECTされ、次にpostsのidに一致する全てのcommentsがSELECTされる。
SELECT回数は2回。オブジェクトは全てロードされる。
DBからは必要なデータセットのみアプリケーションに返却されるためその点は効率的だが、クエリ回数が多くなる。
SQLが`FROM comments WHERE comments.post_id IN (1,2,3,4,5,6,7,………)`
みたいになるため、
postsの件数によってはIN句にIDが大変な数指定されることがあるので、ちょっと怖い。

# おわりに

ここらへんの基本的なところは、
[公式ガイド](http://www.yiiframework.com/doc/guide/1.1/ja/database.arr#sec-8)に書いてあるけど、
togetherでこのあたりを使い分けられるのはいいなーと思ったのと、
具体的にどう動くの？というのがなかったのでちょっと書いてみました。

どれがいいかは公式ガイドに記載のある通り、

> 絶対的な答えはありません。
AMIから立ち上げたインスタンスで Permission denied

作成したAMIを別のアカウントにコピーし、そのAMIから立ち上げたインスタンスにSSHで入ろうとすると以下のようなエラーが出ることがある。

~~~
ssh -i hoge.pem user@xxx.xxx.xxx.xxx
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
~~~

AMI作成時に .ssh/authorized_keys の中に作成元の公開鍵の情報が残っていることが原因。
作成元でAMIを再作成する。
その際 ~/.ssh/ 以下はまるっと削除しておくことが望ましい。

~~~
rm -rf ~/.ssh/*
~~~
CentOSのインストールをkickstartで自動化しよう

* 今回はUSBブートしてからインストールメディアにDVDを指定する方法を取ります。
* [参考](http://www.linuxmania.jp/kickstart.html)

/root/anaconda-ks.cfgを用意
====================================
* CentOSはOSインストール時の選択内容が`/root/anaconda-ks.cfg`に保存されています。
* 次回からこのファイルを指定してインストールすると複数台のインストールも楽になります。

DVDから起動してオプションを指定
====================================
* FAT32かFATでフォーマットしたUSBメモリにanaconda-ks.cfgをコピーしておきます。
* bootオプションに以下指定することでインストーラーが読み込みます。

```bash:
:boot> ks ks=hd:sdb1:/anaconda-ks.cfg
```


netinstall.isoをリマスターする方法
====================================

ISOをダウンロード
------------------
* 32bitの場合 `CentOS-5.9-i386-netinstall.iso`と`CentOS-5.9-i386-bin-DVD-1of2.iso`をダウンロード。
* 64bitの場合 `CentOS-5.9-x86_64-netinstall.iso`と`CentOS-5.9-x86_64-bin-DVD-1of2.iso`をダウンロード。

以下、64bitとして話を進めていきます。

CentOS-5.9-x86_64-netinstall.isoのremastering
------------------------------------------

```bash:CentOS-5.9-x86_64-netinstall.isoの中身を展開
$ mkdir -p ~/iso ~/build/ks
$ sudo mount CentOS-5.9-x86_64-netinstall.iso ~/iso
$ cp ~/iso/isolinux/* ~/build/
$ sudo umount ~/iso
```

```bash:kickstartファイルを設置
$ cd ~/build
$ cp ~/Downloads/anaconda-ks.cfg ks/template.cfg
```

```bash:~/build/isolinux.cfg
default ks-template
timeout 100 (←10秒待つ)
(略)
label ks-template
  kernel vmlinuz
  append ks=hd:sdb1:/ks/template.cfg initrd=initrd.img
```

* これは、USBメモリ(sdb1)のks/template.cfgを読み込んで起動するオプションです。

```bash:~/build/ks/template.cfgを編集
# Kickstart file automatically generated by anaconda.
# install as text mode.
text
install
# install source is cdrom.
cdrom
(略)
clearpart --all --drives=sda (←これを指定しないと、セットアップは正常に終わりますが、USBメモリもパーティション消されます。)
(略)
```

```bash:~/build/以下をISOイメージに変換
$ sudo mkisofs -o ~/CentOS-5.9-x86_64-ks.iso -b isolinux.bin -c boot.cat \
  -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -T .
```

* 最後の`.`はディレクトリの場所です。

USBメモリにISOイメージを焼き付ける
---------------------------------
* USBメモリをFAT32でフォーマットしてマウントしておきます。
* ~/CentOS-5.9-x86_64-ks.iso  を unetbootin でUSBメモリに書き込みましょう。

いざセットアップ
---------------------------------
* (DVDは差し込まずに)USBメモリを差し込んで起動。
* 途中DVDを要求していますのでDVDを差し込みます。
* あとは延々と待つだけ。
simple_form_forでネームスペースを指定する


例えば、routes.rbで

````rb
namespace :admin do
	resources :resources
end
````

という感じでnamespaceを指定した場合、普通に

````rb
= simple_form_for(resource)
````

と書くと`/resource`へPOSTもしくはPUTしてしまいます。

`/admin/resource`へPOSTシたりPUTしたい場合は

````rb
= simple_form_for([:namespace, resource])
````

上記のようにネームスペースを指定すればOKです。
rails のヒアドキュメントで終端の識別子の後は改行しないとおかしな事になる

自分用のメモ。

当然といえば当然ですが、ヒアドキュメントを使う際は、終端の識別子の後に改行を忘れないこと。

複数行コメントアウトをヒアドキュメントを使って実現しようとした時に、あれ？となったのでメモ。

間違った例:

```sample.html.erb
<%
doc=<<-DOC
何かコメント
DOC %>
<div>ここが無視される</div>
<%
doc=<<-DOC
何かコメント
DOC
%>
```

運よくと言うか、悪くと言うか、二個目の終端識別子の後だけ改行してた。

この状態では、2-9が doc に入ってしまう。

正しくは以下の様にするべき:

```sample.html.erb
<%
doc=<<-DOC
何かコメント
DOC
%>
<div>ここが無視される</div>
<%
doc=<<-DOC
何かコメント
DOC
%>
```

これで意図した結果。

当然といえば当然ですね…
ssh-add がCould not open a connection to your authentication agent.と出て成功しないとき

ssh-addは環境変数SSH_AUTH_SOCKを参照し，ssh-agentと通信するのですが，ディストリビューションによってはインストール時にこの環境設定が設定されないようです．（Fedora19ではダメでした）

なので，
```shell-session
Could not open a connection to your authentication agent.
```
とエラーになってしまうことがあります．
```shell-session
eval $(ssh-agent)
```
とすることで，この環境変数を一時的に設定できます．この後，もう一度ssh-addをすれば，秘密鍵をssh-agentに登録することができます．
mkisofsコマンドをmacでも使いたい！

`brew search mkisofs`しても出てこなかったのでメモ

```bash:
$ brew install cdrtools
```


```bash:iso作成
$ mkisofs -l -J -o a.iso .
```

>   -l, -full-iso9660-filenames Allow full 31 character filenames for ISO9660 names

* [＠IT：CD-ROMの内容をISOイメージにするには](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/500cdrom2iso.html)
* [Linuxコマンド集 - 【mkisofs】ISO9660ファイルシステムを作成する：ITpro](http://itpro.nikkeibp.co.jp/atcl/column/14/230520/082000005/)
XOOPS Cube bullitenモジュール コメント機能を無効にする　としても「0コメント」と表示されるのを抑止

bulletinの一般設定で　コメント投稿に関するルール＝この機能を無効にする　としても、0コメントと出てしまうのを修正。

xoops_trust_path\modules\bulletin\templates\item.html

<span class="itemPermaLink"> の <{if $mod_config.comment_dirname != '' && $mod_config.comment_forum_id > 0}> の上に、 

<{if $mod_config.com_rule > 0}> 

（コメントルールが0より大きいとき）を入れる。

この下にコメント表示の部分があるからこれで出なくなる。

上記spanの閉じの前に　/if　を入れる

<{/if}> </span>
chsh on cygwin

`cygwin` には `chsh` はありません。

ではどうやってシェルを変更するかというと `/etc/passwd` を変更します。
こんな感じ

```
username:unused:1000:513:pcname\username,S-1000:/home/username:/usr/bin/zsh
```

インストールしたディレクトリに `Cygwin.bat` とかありますが、過去の遺産のようです。
Capistranoのdeploy時にrake assets:precompileでerrorがでたら


いつもどおりdeployしようとしたら、assets precompileの部分で落ちてしまいます。
deploy先にで実際にコマンドを試すと下記エラーが出ます。

```
Command failed with status (): [/home/nwsadmin/.rbenv/versions/2.0.0-p247/...]
/var/www/hogehoge/shared/bundle/ruby/2.0.0/gems/actionpack-3.2.13/lib/sprockets/assets.rake:12:in `ruby_rake_task'
/var/www/hogehoge/shared/bundle/ruby/2.0.0/gems/actionpack-3.2.13/lib/sprockets/assets.rake:21:in `invoke_or_reboot_rake_task'
/var/www/hogehoge/shared/bundle/ruby/2.0.0/gems/actionpack-3.2.13/lib/sprockets/assets.rake:29:in `block (2 levels) in <top (required)>'

```

何でだろう何でだろうと悩んでいたら、下記のような記事を見つけました。

http://stackoverflow.com/questions/14991365/command-failed-with-status-when-precompiling-assets

開発環境下でdevelopment向けにassets precompileすればcapistranoが通るというのもの

```
rake assets:precompile RAILS_ENV=development
```

本当かなぁと思ってやったら通った。。。なんで。。。
pry show-sourceでメソッドの実装をみる

pry-docをいれるとshow-sourceコマンドがつかえるようになる。

```
pry> def foo ; 42;  end
=> nil
pry> show-source foo

From: (pry) @ line 2:
Owner: Object
Visibility: private
Number of lines: 1

def foo ; 42;  end
```

`request.referer` みたいに.でつないだメソッドでも参照できる。
シェル関数とシェルコマンドの違い

マニュアルによるとシェル関数とシェルコマンドの違いは「それを起動するシェルプロセスで実行されるか、フォークされて別プロセスで実行されるか」らしいです。

```zsh
% function echo-pid-function {
function> echo $$
function> }
% cat << 'EOF' > echo-pid-command
heredoc> #!/bin/zsh
heredoc> echo $$
heredoc> EOF
% echo $$
84532
% echo-pid-function
84532  # シェルと同じ
% ./echo-pid-command
84949  # シェルと違う
```

## バックグラウンドに移した場合の挙動の違い

ctrl-zを押した時にフォアグラウンドジョブがバックグラウンドに移りますが、シェル関数はシェルと同じプロセス上で動いているので、シェル関数実行中にctrl-zすると、シェルが新しくフォークされます。
この違いが特に重要なのは、バックグラウンドに移された関数内で環境変数を設定している場合です。

```zsh
% function test-func { FOO="bar${FOO}" }
% test-func; echo $FOO
bar
% test-func; echo $FOO
barbar
% test-func &
[1] 6053
[1]  + done       test-func
% echo $FOO  # barbarbar にならない
barbar
```

ちなみにこの挙動はZsh特有で他のシェルとは異なるものなので注意が必要です。

## シェル関数の利点

同一プロセス内で実行されることからシェル関数にはコマンドに比べて下記の利点があると言えそうです。

- フォークしないので処理の立ち上がりが若干速い。
- 同じプロセスから実行した全ての関数が同じプロセス上で動作するので、関数同士が簡単に環境変数を使ってやりとりができる。
    - コマンドの場合、プロセスが異なるので、親プロセスの環境変数を引き継ぎますが、子供で環境変数を変更してもその値は親プロセスには影響しない。

Zshの補完機能が関数で定義として実装されているのは、特に2つ目の利点の影響が大きそうです。
インナークラスを親クラスに持つクラスを作る方法

```ruby:innerparent.rb
class Child < Class.new
  Base = self.superclass
end
Child.ancestors #=> [Child, Child::Base, Object, Kernel]
```
匿名クラス（`Class.new`）は定数に収められアクセスされるまで名前が決定しないのを利用したもの

[昔のブログ記事](http://d.hatena.ne.jp/isaisstillalive/20090106/1231233068)よりサルベージ
WordPress: 本文やコメントのURLに対する自動リンクを停止する【functions.php】


本文に書いたURLが自動的にリンク化されるのを停止したい場合は下記

```php:functions.php
/**
 * 本文中URLの自動リンク化を停止
 */
remove_filter('the_content', 'make_clickable');
```

コメントに含まれるURLが自動的にリンク化されるのを停止したい場合は下記

```php:
/**
 * コメント中URLの自動リンク化を停止
 */
remove_filter('comment_text', 'make_clickable');
```