OmniAICreator/Qiita-1.07M huggingface dataset:
ループの処理速度をいい加減に検証してみた

はじめましての方ははじめまして。
そうでない方も忘れていると思いますのではじめまして。

今回は単純にループの処理速度が知りたくなりました。
でもこの程度のことならば、すでに調べた人が何人もいるようです。
http://ameblo.jp/mingw/entry-10385952873.html
http://blog.generace.co.jp/2013/06/21/894
と思ったのですが、真逆の結論が出てしまいました。
はたして for foreach while で本当に速いのは？

ということで、以下のコードを作ってみました。
なお、 PHP 5.4 で検証しています。

```php
$r = [0,0,0];
$range = 100000;
$c = range(0,$range-1);
for($a = 0;$a < 10;$a++){
  $t = microtime(true);
  for($i = 1;++$i < $range;)$i;
  $r[0] += microtime(true) - $t;
  $t = microtime(true);
  foreach($c as $i)$i;
  $r[1] += microtime(true) - $t;
  $t = microtime(true);
  $i = 0;
  while(++$i < $range)$i;
  $r[2] += microtime(true) - $t;
}
var_dump($r);
```

あくまでいい加減な検証なので、コーディングスタイルとか読みやすさとか、そういうのは無視しました。
（本当はワンライナーで記述しています）
処理としては、各ループで 0 ～ 99,999 までループする処理を 10 回ループして、それぞれの合計時間を計算しています。
range は処理時間が大きいらしいので、ループの外に記述しました。
結果はどうかというと、

```
array(3) {
  [0]=>
  float(0.042150497436523)
  [1]=>
  float(0.036016702651978)
  [2]=>
  float(0.023873090744019)
}
```

一番上から for foreach while です。
for がやや遅くて、 while がやや速いといった結果に。
while が遅いという情報が多いのですが、真逆になりました。
http://d.hatena.ne.jp/tweeeety/20130416/1366096299
ループ回数を増やすと変わるのでしょうか。

```php
ini_set("memory_limit",-1);
$r = [0,0,0];
$range = 1000000;
$c = range(0,$range-1);
for($a = 0;$a < 10;$a++){
  $t = microtime(true);
  for($i = 0;++$i < $range;)$i;
  $r[0] += microtime(true) - $t;
  $t = microtime(true);
  foreach($c as $i)$i;
  $r[1] += microtime(true) - $t;
  $t = microtime(true);
  $i = 0;
  while($i < $range)$i++;
  $r[2] += microtime(true) - $t;
}
var_dump($r);
```

結果

```
array(3) {
  [0]=>
  float(0.5011191368103)
  [1]=>
  float(0.44765543937683)
  [2]=>
  float(0.24919891357422)
}
```

変わった気がしないです。

そういえば、 while が遅いとしているソースは配列処理を念頭に置いた、より実用的なものです。
ということで、配列の中身を参照してみました。

```php
$r = [0,0,0];
$range=100000;
$c = range(0,$range-1);
for($a = 0;$a < 10;$a++){
  $t = microtime(true);
  for($i = 0;++$i < $range;)$c[$i];
  $r[0] += microtime(true) - $t;
  $t = microtime(true);
  foreach($c as $i)$i;
  $r[1] += microtime(true) - $t;
  $t = microtime(true);
  $i = 0;
  while($i < $range)$c[$i++];
  $r[2] += microtime(true) - $t;
}
var_dump($r);
```

結果

```
array(3) {
  [0]=>
  float(0.067676544189453)
  [1]=>
  float(0.035441637039185)
  [2]=>
  float(0.065758228302002)
}
```

while が遅くなり、 foreach が最速になりました。
ところで、前掲のページをよく見ると、 while と一緒に list や each を使っています。
これらを使うとどうなるのでしょうか。

```php
$r=[0,0,0];
$range=100000;
$c=range(0,$range-1);
for($a=0;$a<10;$a++){
  $t=microtime(true);
  for($i=0;++$i<$range;)$c[$i];
  $r[0]+=microtime(true)-$t;
  $t=microtime(true);
  foreach($c as $i)$i;
  $r[1]+=microtime(true)-$t;
  $t=microtime(true);
  $i=0;
  while(list(,$i)=each($c))$c[$i];
  $r[2]+=microtime(true)-$t;
}
var_dump($r);
```

```
array(3) {
  [0]=>
  float(0.066687345504761)
  [1]=>
  float(0.0352942943573)
  [2]=>
  float(4.7683715820312E-5)
}
```

while がとんでもないことに。
ケタ違いどころか、 3 ケタも違う結果になりました。
これがバージョンの差か、マシンの差か、はたまた別の要因かは分かりません。
（いい加減なので、テストが間違っている可能性もあり）
ただ、検索結果を信じるのではなく、自分で実験するのが大事なようです。

ただし、どの結果でも for は最遅のようです。
他の言語だと一般的なループだと思うので、以外な落とし穴かもしれません。
自作ライブラリのMethod/PropertyをDeprecatedにする。


公開している自作ライブラリ中のMethodやPropertyをDeprecated（廃止予定）とするときは、宣言の末尾に ```  __attribute__ ((deprecated))``` を追加する。

```objectivec
@property (nonatomic) NSString *someString __attribute__ ((deprecated));
- (void)someMethod __attribute__ ((deprecated));
```

互換性確保のために他の箇所でDeprecatedなものを使用する場合、そのままだとWarningが出る。
これを抑制するためには、該当する箇所を

```objectivec
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
```
と

```objectivec
#pragma clang diagnostic pop
```

で挟む。

##参考
- [Xcode 4 と \__attribute__((deprecated))](http://mtakagi.blogspot.jp/2011/03/xcode-4-attributedeprecated.html)
- [Suppressing deprecated warnings in Xcode](http://stackoverflow.com/questions/2622017/suppressing-deprecated-warnings-in-xcode)
AWS SDK for RubyでEC2作成後に起動を待つ

EC2作成後システムチェックとインスタンスステータスチェックが行われる

* [ステータスチェックでインスタンスをモニタリングする - Amazon Elastic Compute Cloud](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html)

インスタンスステータスチェックが終わるまで待てば起動完了となる
インスタンスステータスチェックの結果はDescribeInstanceStatus APIで取得できる

* 使用API：[DescribeInstanceStatus - Amazon Elastic Compute Cloud](http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeInstanceStatus.html)
* AWS SDKの使用クラス[Class: AWS::EC2::Client — AWS SDK for Ruby](http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/EC2/Client.html#describe_instance_status-instance_method)

以下のようにインスタンスステータスチェックの結果を取得して完了するまで待てば良い

```rb
require 'aws-sdk'

ec2 = AWS::EC2.new(:proxy_uri => ENV['HTTP_PROXY'] || ENV['HTTP_PROXY'], :region => "ap-northeast-1")

# 略

created_instance = ec2.instances.create(ec2hash)

ec2info = ec2.client.describe_instance_status({"instance_ids" => [created_instance.instance_id]})
status = ec2info.instance_status_set[0].instance_status.details[0].status rescue nil

st_retry = 0
while status != "passed" do
  sleep 15
  ec2info = ec2.client.describe_instance_status({"instance_ids" => [created_instance.instance_id]})
  status = ec2info.instance_status_set[0].instance_status.details[0].status rescue nil
  st_retry += 1
  raise "instance status is still bad" if st_retry >= 20
end

```
PHPでクッキーの寿命をPHP_INT_MAXにしようとすると64bitでハマる

```php
<?php
setcookie("TestCookie", $value, PHP_INT_MAX);
```

などと書くと、64bit環境で

```
PHP Warning:  Expiry date cannot have a year greater than 9999 in hoge.php
```

などというエラーが出る。32bit環境だとPHP_INT_MAXは西暦2038年だが、64bit環境だと西暦3000億年だからだろう。PHPにはありがちなことだが、そのような機能制限についてドキュメントは存在しない。
http://php.net/manual/ja/function.setcookie.php
（もっとも、PHPがこれを通したとしても、ブラウザ側が適切に扱えないという事はありそうなので、PHPだけを責めるわけにもいかないが）

2038年問題を避けようとした結果がごらんの有様だよ！
具体的にどういう動作になるのかとか、正確にはいくつまでOKなのかは調べていない。エラーメッセージを素直に信じるなら、西暦9999年12月31日23時59分59秒が上限だろう。
果てしなくどうでもいい問題だが、踏んだので記念パピコ。

追記：
setcookieの実装はここ（エラーメッセージの定義もここ）
https://github.com/php/php-src/blob/94e15ff3877f842e5eb5c89e3aeab214fb4a3a33/ext/standard/head.c#L76
日付のフォーマット関数が呼ばれて
https://github.com/php/php-src/blob/19e8052be31d8361477906932f4c6dc9cd738de2/ext/date/php_date.c#L1219
フォーマット関数で
https://github.com/php/php-src/blob/94e15ff3877f842e5eb5c89e3aeab214fb4a3a33/ext/date/lib/unixtime2tm.c#L40

```c
while (tmp_days >= DAYS_PER_LYEAR) {
    cur_year++;
    if (timelib_is_leap(cur_year)) {
        tmp_days -= DAYS_PER_LYEAR;
    } else {
        tmp_days -= DAYS_PER_YEAR;
    }
}
```

となるので、ここで3000億年分ループを回して関数が呼ばれるため、たいていの環境で処理がタイムアウトする。また、9999を超えるとエラー扱いになるため（最初のコード）、クッキーは吐かれない。
（タイムスタンプをいじりながら確認すると、処理時間が線形で伸びていくのがわかる）

なお、9999年までは正常に吐けることを確認（PHP 5.3.9 64bit）。
tmuxinator で can't find pane エラーでペイン分割を自動でやってくれないとき

tmuxinator で作成するプロジェクト名にドットが入ってるとダメぽいですよ。
ドットの代わりにハイフンとかにしたらうまくペイン分割も自動で動くようになりました。
tmuxinator 0.6.6 時点の話です。

### 参考

[Tmuxinator doesn't work when the project name contains a dot · Issue #93 · aziz/tmuxinator](https://github.com/aziz/tmuxinator/issues/93)

### よくみたらちゃんとそう書いてあったので、よく読みましょうという話だった

[aziz/tmuxinator](https://github.com/aziz/tmuxinator)

> Note that if you wish to use panes, make sure that you do not have . in your project name. tmux uses . to delimit between window and pane indicies, and tmuxinator uses the project name in combination with these indicies to target the correct pane or window.
RHEL5.10でRepositoryをDVDに指定

```bash:事前準備
# mkdir /media/cdrom
# mount /dev/cdrom /media/cdrom
# vi /etc/yum.repos.d/rhel-dvd.repo
# cat > /etc/yum.repos.d/rhel-dvd.repo <<EOF
[rhel-dvd]
name=Red Hat Enterprise Linux 5.10 - x86_64 - DVD
baseurl=file:///media/cdrom/Server
enabled=1
gpgcheck=1
gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release
EOF
```

```bash:Repository一覧を表示
# yum --disablerepo=\* --enablerepo=rhel-dvd list
```

* `\*`は全てを選択。

puppetlabsをmirrorする
=================
遅いサイトは時間のある時mirrorするといいかも。

```bash:
$ rsync -a --delete rsync://yum.puppetlabs.com/packages/yum/el/5/ ./yum.puppetlabs.com/
```
Ubuntuのアップデートが失敗する場合はソースのダウンロード元を変更する

```
$ sudo apt-get update
```

アップデート時にデータが取得できず失敗する場合、ソースのダウンロード元を変更すると解決できるようです。

[システム] > [システム管理] > [ソフトウェア・ソース]

「Ubuntuのソフトウェア」タブのダウンロード元で "その他" -> "最適なサーバを探す" -> ”サーバの選択”
で変更できます。

サーバーをアメリカ合衆国に変更して、問題なくアップデートできるようになりました。
Treasure Dataからデータをrubyで取得する

## Treasure Dataからrubyで結果を取得する。
### gemをインストール
```rb:Gemfile
gem 'td-client'
gem 'multimap'
```

### インストール
```shell-session
bundle install
```

### rakeを作成
```rb:config/initializers/td_select.rb
# -*- coding: utf-8 -*-
require 'td-client'
require 'multimap'
namespace :td do 
  desc ''
  task :sample => :environment  do
    p "start"
     
    # This is a script that
    # get the difference from TreasureData by timestamp
    apikey = ENV['TREASURE_DATA_API_KEY']
    db     = "db_name"
    table  = "pageview"
    query  = "SELECT v['session_id'],v['path_info'] FROM #{table} order by time desc limit 100"
    cln = TreasureData::Client.new(apikey)
    job = cln.query(db, query)
     
    until job.finished?
        sleep 2
        job.update_status!
    end
     
    job.update_status!  # get latest info
    
    multimap = Multimap.new
    if job.success? && job.finished?
        logs = []
        job.result_each do |row|
            session_id = row[0]
            path_info = row[1]
            multimap[session_id] = path_info
        end
    end
    pp multimap.keys
  end

end

```

### rake task を実行
```shell-session
bundle exec rake td:sample
```
Homebrewでbrew updateに失敗した際の対処方法


### エラー時

```
$ brew update
error: Your local changes to the following files would be overwritten by merge:
     share/man/man1/brew.1
Please, commit your changes or stash them before you can merge.
Aborting
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master
```

### 直すgitコマンド

```
$ cd /usr/local
$ git add .
$ git stash
$ git reset --hard
```


`git add .` で全てのファイルをステージしたあとに、
`git stash` でそれをスタックに入れて作業を隠し、
`git reset --hard` で全て同じライン（history位置）にしてる。


これで、`brew update` が出来ました。
PHPで binary ダンプ。

実用的？って言われるとどうか知らないけど、
とりあえず作ったから共有。

```php:binary_dump.php
/**
 * バイナリのダンプ。
 * なにげに使いそうなので
 */
public function bin_dump($data)
{
	$binary = unpack("C*", $data );
	$result = '';
	foreach($binary as $v)
	{
		$result .= sprintf("%02x ",$v);
	}
	return $result;
}
```

おんなじこと書いてるだけだけど、
gistにも書いたので。
べっ、別にあんたのために書いたんじゃないからね Σ(///□///)ｿ､ｿﾝﾅﾝｼﾞｬﾅｲｼｯ!

https://gist.github.com/tienlen/7407168
tagbar.vimでctagsを使ってJSの関数、CSSの一覧を出す

Vimにtagbar.vimがインストールされている前提で。

## 下記からctagsをインストール
HomeBrewでインストールするとCSS用のパッチを当てられない
CSS用のパッチが必要ない場合はHomeBrewでインストールしても良い

http://prdownloads.sourceforge.net/ctags/ctags-5.8.tar.gz

## CSS用のパッチを上記ディレクトリに突っ込む
http://designtomarkup.com/vim/download/ctags5.8-patch.zip

## ctagsをインストール
```bash
$ cd ctags-5.8
$ ./configure
$ make
$ sudo make install
```

## .bash_profileまたは.bashrcに下記を追記
MacOSデフォルトのctagsを使用しないように

```bash
$ export PATH="/usr/local/bin:$PATH"
```

## ホームディレクトリに設定ファイルである.ctagsを追加する
```bash
$ cd ~/ && touch .ctags
```

## JS用の設定ファイルを.ctagsに記述
https://gist.github.com/tim-smart/199338

## 検索結果を別タブで開きたいので下記を.vimrcに設定
```bash
nnoremap <F3> :<C-u>tab stj <C-R>=expand('<cword>')<CR><CR>
```

## 下記の方法で検索できる
1. methodName上でctrl + ] 
2. methodName上で```<F3>```
3. :tag methodName

## 対象となるディレクトリに移動してtagsファイルを作成
```bash
$ ctags -R .
```

## 注意点
エディタで開くときはtagsファイルがあるディレクトリで開くこと。

## 参考リンク
* http://nob-log.info/2012/07/29/ctags-illegal-option/
* http://blog.stwrt.ca/2012/10/31/vim-ctags
* http://kannokanno.hatenablog.com/entry/20121127/1354019826
* http://gmarik.info/blog/2010/10/08/ctags-on-OSX
* http://designtomarkup.com/vim/taglist-ctags-css-patch
* http://www.runtime-era.com/2012/05/exuberant-ctags-in-osx-107.html
多段sshの設定

# シナリオ
localからgwを経由してtargetにsshする。

# 手順
1. 鍵認証
localでssh-keygenし、公開鍵をgwとtargetの双方のauthorized_keysに追加する。

1. config設定
localの$HOME/.ssh/configに以下を設定する。

```
Host gw
  HostName xxx.xx.xx.xxx
  User xxx

Host target
  HostName xxx.xx.xx.xxx
  User xxx
  ProxyCommand ssh gw nc %h %p
```

これで、ssh targetできるようになった。scpも可能。
targetにログインするユーザーとlocalのユーザーが違う場合はUserを必ず設定すること。

また、sshのバージョンによってはncの代わりに-Wオプションで同じことができるらしい。
オープンソースのレコメンドエンジン「recommendify」をrailsで使う。

## recommendifyとは
オープンソースのレコメンドエンジンです。
アイテム間の結びつきをスコア付で返してくれます。


## redisのインストール(Admin権限で)
```shell-session
yum install redis
chkconfig redis on
/etc/init.d/redis start
```

## hiredisのインストール(Admin権限で)
```shell-session
yum install hiredis hiredis-devel
```

## Gemfileに記述し、インストール
```ruby:Gemfile
gem 'redis'
gem 'recommendify'
```
```shell-session
bundle install
```

## nativeでbuildする。(10倍早いらしい)
```shell-session
# pathは状況による
cd ~/.rvm/gems/ruby-2.0.0-p247/gems/recommendify-0.3.8/
bundle install
bundle exec rake build_native
```

## railsで初期化に組み込む。
```rb:config/initializers/recommendify_init.rb
# configure redis
Recommendify.redis = Redis.new(:host => "localhost", :port => 6379)

class PageviewRecommender < Recommendify::Base
 
  max_neighbors 50
 
  input_matrix :order_items,  
    :native => true,
    :similarity_func => :jaccard,    
    :weight => 5.0 
end
```

## レコメンドデータを投入する
```rb:lib/tasks/recommendify_indexing.rake
task :recommendify_indexing => :environment do |x, args|
  recommender = PageviewRecommender.new
  
  # 2つ以上を同時に投入しないと意味がない。
  recommender.order_items.add_set("order1", ["product23", "product65", "productm23"])
  recommender.order_items.add_set("order2", ["product14", "product23"])

  # 確定
  recommender.process!

end
```
### rakeを実行
```shell-session
bundle exec rake  recommendify_indexing
```

## recommendifyからデータを取り出す
```rb:ruby
recommender = PageviewRecommender.new

# product23と関連付いたitemを取得
p recommender.for('product23')
```

## redis-cliでデータを確認
```shell-session
redis-cli -h localhost
hgetall recommendify:similarities
```


## 各種操作
### redisからレコメンドデータをリセットする
```rb:ruby
Recommendify.redis.del "recommendify:order_items:ccmatrix"
Recommendify.redis.del "recommendify:similarities"
Recommendify.redis.del "recommendify:order_items:items"
```

### アイテムを指定して削除
```rb:ruby
recommender.delete_item!("product23")
```
[Rails] SporkでAddress already in use - bind(2)エラーが出た場合の対処


##概要
Sporkを実行したら以下のエラーがでた。

```sh

$  bundle exec spork
Using RSpec, Rails
Preloading Rails environment
Loading Spork.prefork block...
Address already in use - bind(2) (Errno::EADDRINUSE)
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:879:in `initialize'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:879:in `open'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:879:in `open_server'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:764:in `block in open_server'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:762:in `each'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:762:in `open_server'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:1373:in `initialize'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:1664:in `new'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/lib/ruby/2.0.0/drb/drb.rb:1664:in `start_service'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/spork-1.0.0rc4/lib/spork/server.rb:30:in `listen'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/spork-1.0.0rc4/lib/spork/server.rb:21:in `run'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/spork-1.0.0rc4/lib/spork/runner.rb:76:in `run'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/spork-1.0.0rc4/lib/spork/runner.rb:10:in `run'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/spork-1.0.0rc4/bin/spork:10:in `<top (required)>'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/bin/spork:23:in `load'
/Users/taniguchidaiki/.rbenv/versions/2.0.0-p195/bin/spork:23:in `<main>'
No examples found.


Finished in 0.00013 seconds
0 examples, 0 failures

Randomized with seed 11942

```

##対応

Address already in useとのことなので、とりあえずプロセスを確認。

```sh
$ ps ax|grep spork
85664 s006  T      0:04.00 ruby /Users/hoge/.rbenv/versions/2.0.0-p195/bin/spork
87228 s007  S+     0:00.00 grep spork
```
いた。
一度終了した時のプロセスが残っていた？
killする。

```sh
$ kill -9 85664
$ ps ax|grep spork
87233 s007  R+     0:00.00 grep spork
```

もう一度起動してみる。

```sh
$  bundle exec spork
Using RSpec, Rails
Preloading Rails environment
Loading Spork.prefork block...
Spork is ready and listening on 8989!
```

成功。
MacBookPro 13in Retina Haswell をトリプルブートにしてみたけども。。。

発表されたその日に勢いで注文してトリプルブートにしてみました。
1) OSX 2)Win7 3)Ubuntu13.10
です。
Ubuntuは12.04LTSにするつもりだったのですが、Haswell Archにカーネル他が対応してないようで、ブートすらしなかった。現在の所13.10で安定しています。

導入に当たっては,rEFIlのインストールで何事もなく終わりました。
パーティションは、OSXのディスクユーティリティで４つにわけています。SWAPサイズは2G。

Ubuntuの起動が少し遅いときが有りますが、今の所は起動は問題ありません。
ただし、Intel HDA 回りのドライバが上手くいかず、音がイヤホン以外からはなりません。海外でも同様な事象が報告されており、bag情報に上がっていますので根気よく待つしか無い状態ですね。

Ubuntu日本語フォーラムのほうにも少し書いておきました。
ザ・インタビューズをダウンロードするRubyスクリプト


[ザ・インタビューズ](http://theinterviews.jp/)が2014年1月6日で終了するので、<a href="http://theinterviews.jp/hyuki/">自分(hyuki)が受けたインタビュー</a>のテキストをダウンロードしておこうと思いました。

128ページに渡っていたので、wgetをぐるぐる回しています。

```getint.rb
(1..128).each do |n|
  system("wget -O #{n}.html http://theinterviews.jp/hyuki/page/#{n}")
end
```

これを実行すると、カレントディレクトリに1.htmlから128.htmlまでのファイルができるので、後で何とか加工します。たとえばpandocなどを使えば簡単にMarkdownに変換できます。
カレントディレクトリ以下の検索して見つかった全ファイルをコピーする


## 例: カレントディレクトリ以下で、hoge*に該当し、1Mbyte以上のファイルを/var/tmp/にコピーする

```sh: 
$ find . -type f -name 'hoge*' -size +1000000k -print0 | xargs -0 -I % cp % /var/tmp/
```

osxで確認済み。linuxはおそらくオプションが異なる。

## 参照
http://uguisu.skr.jp/Windows/find_xargs.html
labelクリック時にcheckboxを切り替えられるようにした場合のstopPropagationによる親要素イベントの制御


原因は大した話じゃなかったですが、ちょっとハマったのでメモ。

## こんな場合
以下のようにcheckboxとlabel、親となる要素（ここではdiv）があったとします。

```html:sample.html
<div id="container">
	<label id="testLabel"><input type="checkbox" id="testCheckBox" name="testCheckBox" />ラベル</label>
</div>
```
で、イベントがこう。（jQuery使用）

``` js:sample.js
$('#container').click(function(e) {
	alert('container');
});

$('#testCheckBox').click(function(e) {
	// 親要素のイベントを発生させない。
	e.stopPropagation();
	alert('checkbox');
});
```

ハマったのは、「checkboxをクリックした際に、親要素のイベントを発生させたくない」という動きです。

## 問題
この状態でcheckboxを直接クリックした場合は、狙い通りdivのイベントは発生しません。

が、labelをクリックした場合はcheckboxのイベントが発生したあと、divのイベントが発生してしまいます。

## 原因
原因は簡単なことでしたが、labelをクリックした際に発生するのはあくまでもlabelのclickイベントであって、そこからcheckboxのclickイベントが呼ばれているということを見逃していました。

## 解決方法
なので、labelクリック時に親要素のdivのイベントを発生させないようにするには、こうすると良かった。

``` js:sample.js（修正後）
$('#container').click(function(e) {
    alert('container');
});

$('#testCheckBox').click(function(e) {
    // 親要素のイベントを発生させない。
    e.stopPropagation();
    alert('checkbox');
});

// 以下を追記
$('#testLabel').click(function(e) {
	e.stopPropagation();
});
```

もっと良い方法あるかもだけど、とりあえず解決。

- - -
> Blog URL : http://www.utano.jp/ (Syntax Error.)
すでにリポジトリで管理されているファイルを.gitignoreで除外したい場合の手順


すでにリポジトリで管理されちゃってるけど、本当は除外すべきだったファイルがあった時に、.gitignoreを編集して除外対象にしたい場合の手順。（最新の.gitignoreの設定を反映する方法）


## 一度インデックスを全部クリアする
```
git rm -r --cached .
```

## 改めてインデックスを作りなおす
```
git add .
```
これで新しく.gitignoreで除外したいファイルがdeletedになる。（ワーキングツリーには残ったままで、インデックスから除外できる）

あとはcommitして完了。

- - -
> Blog URL : http://www.utano.jp/ (Syntax Error.)
Similarity of Pokemon Names

### データ
http://en.wikipedia.org/wiki/List_of_Pok%C3%A9mon の表をExcelに読み込ませたものを使用.
簡単のため英語名を使用.

```rb:similarity.rb
#!/usr/bin/ruby
#coding:utf-8
def alignment(x, y)
	#initialize
	a = Array.new(x.size+1){Array.new(y.size+1, 0)}
	back = Array.new(x.size+1){Array.new(y.size+1, 0)}
	tx = ""; ty = ""; t=""

	#DP
	back[0][0]=[0,0,0]
	gap=1
	1.step(a.size-1){|i| a[i][0] = a[i-1][0] - gap;back[i][0]=[i-1,0,  0]}
	1.step(a[0].size-1){|j| a[0][j] = a[0][j-1] - gap;back[0][j]=[0,  j-1,0]}
	1.step(a.size-1){|i|
		1.step(a[0].size-1){|j|
			#一致=+1+(連続一致数), 不一致/ギャップ=-1
			z = [ x[i-1] == y[j-1] ? a[i-1][j-1]+back[i-1][j-1][2]+1 : a[i-1][j-1]-1, a[i-1][j]-gap, a[i][j-1]-gap ].each_with_index.max
			a[i][j]=z[0];
			case z[1]
				when 0 then back[i][j]=[i-1,j-1,x[i-1] == y[j-1] ? back[i-1][j-1][2]+1 : 0]
				when 1 then back[i][j]=[i-1,j,  0]
				when 2 then back[i][j]=[i,  j-1,0]
			end
		}
	}
	return -a[x.size][y.size]
end

a=[]
evolve={}
while gets
	arr=$_.chomp.split(',')
	arr[1]=~/(^[a-zA-Z0-9\.\- ]+)/
	pkm=$1
	a<<pkm
	if arr[10]&&arr[10]!=''&&arr[10]!='-'&&arr[10]!='_'&&arr[10]!='Egg'
		arr[10]=~/^(?:Egg\/)?([a-zA-Z0-9\.\- ]+)/
		base=$1
		evolve[base]=[base] if !evolve.has_key?(base)
		evolve[pkm]=evolve[base] #進化元と同じ配列を参照させる
		evolve[pkm]<< pkm
	end
end
b=[]
0.step(a.size-2){|i|
	(i+1).step(a.size-1){|j|
		#進化系を持たないか同じ進化系に属さないならば
		if !evolve.has_key?(a[i])||!evolve.has_key?(a[j])||evolve[a[i]]!=evolve[a[j]]
			#類似度を計算し、配列に追加
			b<<[alignment(a[i].downcase,a[j].downcase),a[i],a[j]]
		end
	}
}
b.sort.each{|e|
	puts (-e[0]).to_s+' '+e[1]+' '+e[2]
}
```

類似度12以上の組は以下のとおり：

```
20 Electrode Electrike
18 Rhyperior Serperior
18 Vanillish Frillish
15 Seaking Slaking
15 Volcarona Volcanion
14 Bastiodon Gastrodon
14 Electrike Electivire
13 Simisage Simisear
13 Tyranitar Tyrantrum
12 Beedrill Excadrill
12 Clamperl Lampent
12 Dratini Giratina
12 Electrode Electivire
12 Meloetta Floette
12 Sandslash Aegislash
12 Shellder Shellos
12 Swampert Clamperl
12 Totodile Krookodile
12 Tyranitar Darmanitan
```

### 結論
(私はXYはやっていないのですが)フラエッテとメロエッタって名前が似てるなと思ったのですが全くそのようなことはありませんでした(類似度算出方法をかなり恣意的にしたのに笑)
CygwinとKarma+PhantomJSの相性がイマイチ

Anglur.JSをいじくっているうちにKarmaというテストランナーとPhantom.JSというヘッドレスブラウザ（プログラム中から呼び出せるテスト用の仮想ブラウザというべきか）に出会いました。

こりゃすげーと思って試したんですが、なんかCygwinとの相性がわるい。
node.js自体がCygwinと相性が悪いという話もあるが…。

ハマりポイントは以下でした。

1. phantom.jsのインストールでエラーに
2. karmaからブラウザが立ち上がらない（phantomJS含む）
3. karmaを止めてもphantomJSのプロセスが残る

##1. phantom.jsのインストールでエラーに
KarmaとphantomJSは　-g つけてグローバルインストールしたほうがいいですね。
あと、cygwin上からでなくDOS窓から。
なんかインストール途中でコケるんですよ。

```bat:DOS窓で
> npm install -g phantomjs@1.9.2-1
> npm install -g karma
```

phantomjsのバージョンを指定しているのは目下の[最新版の1.9.2-2だとコケる](https://github.com/Obvious/phantomjs/issues/108)ので。

karmaは -g つけると自動的にパスが通るので。どっちみちプロジェクトごとに分けるライブラリでもないし。

## 2. karmaからブラウザが立ち上がらない（phantomJS含む）

デフォルトではChromeを立ち上げに行くのですがこれが立ち上がらない。
自分のPCはユーザーホームをDドライブに置くように設定しているせいかもしれません。

最初はCygwinで ~/.bashrc にCHROME_BINを設定していたのですがこれだとダメです。
なんだか / -> \に置き換えて解釈するようでchromeの実行ファイルが見つからないと。

Windowsの環境変数に設定したら行けました。

PhantomJSも起動しなかったのですが -g でインストールしたら起動するようになりました。

## 3. karmaを止めてもphantomJSのプロセスが残る

で、めでたくkarmaからChrome,PhantomJSが起動してテストが実行されるようにはなったのですが、KarmaをCtrl+Cで停止してもPhantomJSのプロセスが停止しない…。

結局KarmaをCygwinからキックするのは諦めてDOS窓でやることになってしまったというオチでした。。。
cordovaの基本的な事柄


## 特徴
* HTML+JavaScriptでAndroid/iOSのアプリが作れる

## しくみ
* WebView上にローカルなHTML/JavaScriptを実行するだけ
* Pluginにより、ネイティブな機能を呼び出すことが可能
 * JavaScriptから呼び出すことが可能
 * Pluginは各プラットフォームで実装されている

### コード
* http://cordova.apache.org  からそれぞれのPlatformむけのコードをダウンロードできる
* Apacheライセンス 
 * https://cordova.apache.org/index.html#about
 * https://github.com/apache/cordova-lib/blob/master/LICENSE

## 環境

Node.jsをインストールして、

```shell-session:
$npm install -g cordova
```



### プロジェクトの作成とビルド
* cordovaコマンドでプロジェクトの作成と実行ができる
 * cordova create <プロジェクトの場所> <プロジェクトのid> <プロジェクト名>　: プロジェクト作成
 * cordova platform add <プラットフォーム名> : 対応するプラットフォームを追加 
 * cordova build : プロジェクトのビルド
 * cordova run : プロジェクトの実行

下記はプロジェクトを作成し、実行する

   ```shell-session:
   $cordova create ~/dev/helloCordova jp.blogspot.sassylog helloCordova
   $cd ~/dev/helloCordova 
   $cordova platofrm add ios
   $cordova build 
   $cordova run 

   ```


## 実装
* (iOSの場合)プロジェクトを開き、wwwフォルダ以下に HTML/CSS/JavaScriptを頑張って書く(Webとほぼ同じ)
* ネイティブの機能を使いたいときはプラグインを追加する

## Plugin

### Pluginの使い方
* http://plugins.cordova.io/ から必要なプラグインを探す
* cordovaコマンドでインストール

カメラの場合

```shell-session:
$cordova plugin add org.apache.cordova.camera
```

APIの使い方は下記を見る

http://plugins.cordova.io/#/package/org.apache.cordova.camera

### Pluginの作り方
欲しい機能があってプラグインが用意されていない場合は自分で作る。
下記を参考にする。
http://cordova.apache.org/docs/en/5.0.0/guide_hybrid_plugins_index.md.html#Plugin%20Development%20Guide

### ライセンス
* プラグインのライセンスに関しては特に記述がないので、自由にライセンスをつけていいのでは？
 * Apacheライセンスなので、まぜるな危険ではないはず。
Xlint:unchecked オプションを指定して再コンパイルしてください。 対策

はい。なぜかこういったものがお仕事に絡んできたので。
androidstudio上でアプリ動作確認が出来る(らしい)[https://code.google.com/p/android-test-kit/](https://code.google.com/p/android-test-kit/)のスタート手順を流し読みしながらで、
TestRunnerのsrcと同じ階層にlibsディレクトリを作って、standaloneのsnapshotのjarファイルをコピペしてAdd as a library...して、とりあえずでビルドしたら

java: 詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。

と怒られた。最初はandroidstudio上でセッティングの項目とか探してオプション付け外しかと思って探したんですが項目見つからず。
今回のケースで出来た解決策としてはcompiler.xmlの
``` <option name="ADDITIONAL_OPTIONS_STRING" value="-Xlint:none" />```

noneをuncheckedに変えればエラーには一まずは対処終わりました。
Tikz, overpic等でpdf上に作った図をepsにする

[Tikz/PGF](http://sourceforge.net/projects/pgf/), overpic等を使用してLaTeX上で図を作成する事がある。
METAPOSTのファイルを別に作る必要もなく、使い様によっては便利なのだが、
論文を投稿する際には通常のepsにしてある方がトラブルが少ないだろう。

pdfをGIMPでインポートして切り出せばいいのだが、せっかくのベクターデータが失われる。

そこで今回とった方法は

- 図だけを生成する.texを作成し、.pdfにコンパイルする
- `pdftocairo`を使用してpdfからepsを作成する

という手順である。他にも

- (latex) .tex > .dvi
- (dvips) .dvi > .ps
- (ps2epsi) .ps > .eps

のように変更する手段が紹介されていたが、
私の場合はTikz中で違うepsを取り込んだ図がうまく変換できなかった。
MacでのJAVA_HOME設定

# 2021年5月7日追記
個別にJDKをインストールするのを止めて[SDKMAN!](https://sdkman.io/)を使いましょう。
[rbenv](https://github.com/rbenv/rbenv)や[pyenv](https://github.com/pyenv/pyenv)のように複数のJDKをバージョン別に管理できますし、JDK以外のgradleなどのJVM言語開発用ツールも同様に管理できます。

以下は古い内容ですが、2021年5月13日現在の最新のmacOS Big Surでも利用可能な方法ですので一応残しておきます。ですが個人的にはmacOSのバージョンに依存しない[SDKMAN!](https://sdkman.io/)の使用を推奨します。

--- 


# [Deprecated] 注意事項
- 本記事に書いてある内容は[OracleJDK](https://www.oracle.com/technetwork/jp/java/javase/downloads/index.html)，[OpenJDK](https://openjdk.java.net/)，[AdoptOpenJDK](https://adoptopenjdk.net/)で動作を確認したもので、他のJDKについては不明です。

# [Deprecated] 忙しい人向け

```
export JAVA_HOME=`/usr/libexec/java_home -v 10` #java10が使いたいとき
export JAVA_HOME=`/usr/libexec/java_home -v 9` #java9が使いたいとき
export JAVA_HOME=`/usr/libexec/java_home -v 1.8` #java8が使いたいとき
export JAVA_HOME=`/usr/libexec/java_home -v 1.7` #java7が使いたいとき
export JAVA_HOME=`/usr/libexec/java_home -v 1.6` #java6が使いたいとき
```

# [Deprecated] 解説

- バージョンが異なる複数のjava appの開発を行うケースなどで、同じMacのローカル環境でjava/javacのバージョンを切り替えて使いたいケースがあります。
- xcode toolsには `/usr/libexec/java_home` という複数のバージョンのjavaそれぞれのhome directoryのpathを表示してくれるコマンドがあるので、これを使うとそれが可能になります。 
    - このコマンドの詳細は `$ man java_home` で確認ください

- なので前提条件としてXcode Command Line Toolsが必要ですが、普段macで開発してる人なら入れてると思うので（これがないとbrewもportsも使えないですし）問題ないかと思います
- このコマンドの実態は `/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java_home` ですが、 `/usr/libexec/java_home` にsymbolic linkが貼られます
- オプション無しで実行すると最新のJDKのバージョンのhome directoryのpathを表示してくれます(バージョン数降順がdefault orderのようです多分）

```shell-session
$ /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home
```

- manページにも記載がありますが、 `-v` オプションで表示したいJDKのバージョンを指定することができます。

```shell-session
$ /usr/libexec/java_home -v 1.8
/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home
```

- なお、java9以降は `-v {version}` と指定しないとエラーが出るので注意が必要です。

```shell-session
$ /usr/libexec/java_home -v 1.9
Unable to find any JVMs matching version "1.9".
/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home
$ /usr/libexec/java_home -v 9
/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home
$ /usr/libexec/java_home -v 8
Unable to find any JVMs matching version "8".
/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home
```

## [Deprecated] 例：java8が使いたい時のJAVA_HOME指定
```sh
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
# JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home
```

## [Deprecated] 例：java6が使いたい時のJAVA_HOME指定

```sh
export JAVA_HOME=`/usr/libexec/java_home -v 1.6`
# JAVA_HOME=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
```

## [Deprecated] 補足

インストールされていないバージョンを指定した場合は最新のバージョンが指定される？ようです（詳細未確認）

```sh
$ /usr/libexec/java_home -v 1.7
# Unable to find any JVMs matching version "1.7".
# /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home
```

```sh
$ /usr/libexec/java_home -v 1.4
# Unable to find any JVMs matching version "1.4".
# /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home
```
jMockit そんな無理矢理privateなトコロに…

だんだんタイトルが投げやりになっているjMockitのお話です。

### privateなfieldに無理やり値をセットする

前回も紹介した [Deencapsulation](http://jmockit.googlecode.com/svn/trunk/www/javadoc/mockit/Deencapsulation.html)ですが、名前の通りカプセル化を完全無視できます。使いがちなのが [setField](http://jmockit.googlecode.com/svn/trunk/www/javadoc/mockit/Deencapsulation.html#setField(java.lang.Object, java.lang.Object))でprivate fieldに好きな値を代入してしまうとか。

```java
     Deencapsulation.setField(hoge, "firstName" ,"ホゲ男");
```

こんな感じで hogeインスタンスの firstNameというprivateインスタンス変数に値をセットしてしまえます。
これはExpectationとかVerificationとか関係なしに使えます。

もはややりたい放題ですね。

### @Cascading アノテーション

今まで @Mocked アノテーションを使う例ばかりでしたが、

```java

public class Hoge {
    public Fuga getFuga() { ... }
}

public class Fuga {
    public Moga getMoga() {...}
}

public class Moga {
    public String exec() {...}
}
```

こんな場合には、

```java
@Mocked Hoge hoge;
@Mocked Fuga fuga;
@Mocked Moga moga;

@Test
public void test() {
    new NonStrictExpectations() {{
        hoge.getFuga(); result=fuga;
        fuga.getMoga(); result=moga;
        moga.exec(); result="もがもがー";
    }};
}
```

と定義が必要でしたが、@Cascadingを使うと一発で書けます。

```java
@Cascading Hoge hoge;

@Test
public void test() {
    new NonStrictExpectations() {{
        hoge.getFuga().getMoga().exec(); result="もがもがー";
    }};
}
```
RSpec.configure の extend 、 include はどうなっているのか

RSpec で

```rb
module M1
  def hoge
    p 'hoge'
  end
end

module M2
  def fuga
    p 'fuga'
  end
end

RSpec.configure do |c|
  c.extend M1
  c.include M2
end

describe 'test' do
  hoge

  it do
    fuga
  end
end
```

のように extend で DSL を、 include で example 内で使えるメソッドを追加することができます。
これをどのようにして実現しているのか調べてみました。

# RSpec::Core::Configuration#extend 、 include
RSpec.configure のブロック引数である c は RSpec::Core::Configuraion のインスタンスです。
ここで呼び出している extend は、RSpec::Core::Configuraion でオーバーライドしてあります。
Object#extend ではないです。
RSpec::Core::Configuration#extend、include によって extend や include するべきモジュールが登録されます。

# extend 、 include 先のクラス
describe もしくは context を呼び出すと、RSpec::Core::ExampleGroup を継承したクラスを作成します。
クラスを作る際に、そのクラスに RSpec::Core::Configuration#extend、include で登録したモジュールが extend 、 include されます。

# 実行
DSL 部分の解釈は describe 時に作ったクラスに module_eval しているので extend したメソッドを使うことができます。
example 部分の実行は describe 時に作ったクラスのインスタンスに instance_eval しているので include したメソッドを使うことができます。
Jenkinsセットアップメモ

> masterができていて、新規プロダクト用のslave nodeを追加して運用する予定なんだけど、本を読んでもmasterを対する設定かslaveに対する設定がよくわからない。実際運用してみないとよくわからない。
> 適当なメモしか書かない。

# 構成

- master = debian（apache2）
 - パッケージをjenkins.orgから落とせる
 - インストール後、`sudo /etc/init.d/jenkins start` で起動できる
 - http://xxxx.xxxx:8080 で開く
- slave = macos
 - slaveマシンからjenkinsを開く → Jenkins管理 → ノード管理 → 新規ノード追加 → JNLP経由 → jenkinsおやじの指示を従ってdaemonを起動 → jenkinsのサイトからslave追加成功のを確認

# 入れたいplugin

- git plugin
- backup plugin
 - JENKINS_HOME以下をバックアップしてくれる
 - ジョブの設定とか、jenkins自体の設定とか、ワークスペースとか、ビルド履歴とか...
- jenkins disk-usage plugin
 - ディスク使用量推移がみえるようになる
- Clover PHP Plugin
 - phpユニットテストのカバー率を測る


# ヒント

## 履歴

- ビルド履歴はデフォルトで残らない。ジョブの設定で、ビルド後の動作を変更し、履歴を残るようにしなければいけない。容量を考慮するなら何件・何日分の履歴を残すのも指定可能

## ビルド通知

- email, irc, twitter でもできる
- jenkins mood widget ってandroidアプリから最新ビルドの情報もみれる

## ビルドタイミング

- 定期的に実行（CRON）
- SCMポーリング（トリガー+CRON）
- 他のプロジェクトのビルド後でビルド
表示しているページの欲しい画像をZIPでまとめてダウンロードできるChrome拡張を作ってみた。「ちょうだいExtension」

以前からChrome拡張に興味があって、今回試しに作ってみたので紹介してみる。

# スクリーンショット
ちょうだいExtension
![ss.jpg](https://qiita-image-store.s3.amazonaws.com/0/20629/24af8523-3c6d-d0b9-4aa5-6f2978c5bbec.jpeg)

# 機能
ちょうだいExtensionの機能は以下の通り

- 表示しているページの画像をグリッドで表示
- 選択した画像だけをZIPで圧縮してダウンロードできる
 - 全て選択と解除ボタン付き

画像まとめブログで使うことを想定して作っているけど、ふたば等の画像アップローダでも使えるはず

# 使い方
## 必要なもの
- Google Chrome
- Choudai Extension([ダウンロード](https://github.com/chuross/choudai-extension/raw/master/choudai.crx))

## 手順
1. Google Chromeを起動する
2. アドレスバーに`chrome://chrome/extensions/`と入力してエンターキーを押す
3. Choudai Extensionのcrxを拡張機能の画面にドラッグ&ドロップ
4. 拡張を追加しますかみたいなこと聞かれるのでそのまま追加する

## 実際にダウンロードしてみる
1. 画像まとめブログなどのページを表示する
2. 右上に追加されたアイコンを押す![ss2.jpg](https://qiita-image-store.s3.amazonaws.com/0/20629/a0e75c03-06cc-be38-0a29-52a89f92b7a9.jpeg)
3. 画像があった場合は一覧に表示されるので欲しい画像にチェックを入れる
4. 「選択した項目をZIPに保存する」を押してプログレスバーを見ながら待つ
5. ZIPが生成されて表示がプログレスバーから「ダウンロード」と書かれたボタンに変わるので押す
6. ZIPダウンロードされる

# 今後
- もう少しコード整理したい
  - jQueryでビューを操作してるとことか
- チェックされている画像をもう少しわかりやすくしたい
- 今のところダウンロードを高速化させるために並列で処理させているけど、うまく待ち合わせできていない等の問題がある場合は直列化するかもしれない
  - たまに残り一件から進まないことがある
    - サイトによるかも？
- zipでダウンロードした後に自動的に解凍して画像フォルダに保存するスクリプト書きたい
  - 解凍して移動させる作業だるい
- 保存以外にも閲覧しやすくする機能を何か追加するかもしれない

# 技術的な話題
- zipを圧縮する部分はJSZipを使用した
  - http://stuk.github.io/jszip/
  - 割りと使いたい機能が揃っていて、手軽に作れるのでjavascriptでzipの解凍・圧縮させたい時に結構便利
- 取ってくる画像の条件はaタグのhrefの飛び先がjpg or png or gifだった場合のみ
  - そのため現状ではリンク先のない画像が取ってこれない
  - 片っ端から取ってくるとゴミも増えるのでやりたくない
  - そこら辺はなにかいいアイデア出てきたら試す予定

# まとめ
- 初めてまともにjavascriptで実装したので凡ミス多かった
  - ついでにCoffeeScriptかTypeScriptで再実装してみたい
- Chrome拡張は[クロスドメイン](http://tutty.info/496)とか気にしなくていいので色々できそう
- 結構楽しかったのでまたなにかネタが見つかったら作る予定
- ソースコードはGitHubに公開しているので自由に改変して使ってください。
  - https://github.com/chuross/choudai-extension
TikZの小さなサンプル


TeXの描画用パッケージTikZの小さなサンプルです。TikZについてはTeX Wikiをどうぞ。

* [TikZ (TeX Wiki)](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?TikZ)

```sin.tex
\documentclass[a5paper,dvipdfmx]{jsarticle}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[utf8]{inputenc}
\usepackage{amsmath,amssymb}
\usepackage{inconsolata}
\usepackage{tikz}
\usepackage{okumacro}

\title{Ti{\em k}Zの小さなサンプル}
\author{結城浩\footnote{http://www.hyuki.com/, \texttt{@hyuki}}}
\date{2013年11月10日}

\begin{document}

\maketitle

\begin{center}
\begin{tikzpicture}[x=0.1mm,y=5.73mm,domain=-380:380,samples=300,>=stealth]
  \draw[->] (-380,0) -- (380,0) node[right] {$\theta$};
  \draw[->] (0,-2) -- (0,2) node[above] {$y$};
  \draw[line width=0.7pt] plot (\x,{sin(\x)});
  \draw plot (180,1.2) node[above] {\Large$y = \sin \theta$};
  \foreach \t in {-360,-180,...,360} \fill[gray] (\t,0) circle (1pt);
  \draw (-360,0) node[below right] {$-2\pi$};
  \draw (-180,0) node[below left]  {$-\pi$};
  \draw (   0,0) node[above left]  {O};
  \draw ( 180,0) node[below left]  {$\pi$};
  \draw ( 360,0) node[above left]  {$2\pi$};
\end{tikzpicture}
\end{center}

\end{document}
```
上のようなsin.texを用意して、以下のコマンドを実行します。

```
$ platex sin
$ dvipdfmx -p a5 sin
```

すると、以下のようなsin.pdfができます（画像抜粋）。

![sin.png](https://qiita-image-store.s3.amazonaws.com/0/12361/db8f953a-02fe-5585-3963-c1354dd196da.png "sin.png")
Jadeでmarkdownやcoffeescriptを使ったり、カスタム・フィルタ作ったり

## 混ぜ過ぎ注意

Jadeで色々な記法を使う方法とカスタム・フィルタの作り方。
複数の書き方ができるけど、エディタによっては、シンタックス・ハイライトのされ方が変わったりする。

### html

通常のhtmlのタグを書くだけで使える。

```
block body
  
  div.
    <h1>HTML</h1>
    <p>通常のHTML</p>
```

### markdown

事前に対応モジュール(<a href='https://github.com/chjj/marked' target='_blank'>marked</a>、<a href='https://github.com/ForbesLindesay/supermarked' target='_blank'>supermarked</a>、<a href='https://github.com/evilstreak/markdown-js' target='_blank'>markdown-js</a>のいずれか)をインストールしておく必要がある。

インストール後、markdownフィルターを使うと使用できる。

```jade
block body

  :markdown
    ## Markdown記法
    
    - hoge
    - foo
```

もしくは、エイリアスの:mdでも大丈夫。

```jade
  :md
    ## Markdown記法
    
    - hoge
    - foo
```

### JavaScript

jsフィルターを使う。

```jade
  :js
    $(document).on("click","h1",function(){
      console.log('clicked');
    });
```

もしくはscriptタグ。

```
  script.
    $(document).on("click","h1",function(){
      console.log('clicked');
    });
```

### coffee-script

事前に<a href='https://github.com/jashkenas/coffee-script/' target='_blank'>coffee-script</a>をインストールしておく必要がある。グローバル・インストールだと認識しないので、プロジェクトにローカル・インストールする。

```jade
  :coffeescript

    $(window).on "load" , ->
      console.log "onLoad"
```

もしくはエイリアスの:coffeeを使う。

```jade
  :coffee

    $(window).on "load" , ->
      console.log ":coffee"
```

### css

cssフィルターを使う。

```jade
  :css
    body{
      background:#efefef;
    }
```

もしくはstyleタグの中に書く。

```
  style.
    body{
      background:red;
    }
```

あまりhtmlファイル内にcssを書くことないけど、、、

### less

こちらも事前に<a href='https://github.com/less/less.js' target='_blank'>less</a>をローカルにインストールしておく必要がある。

インストールしたら、lessフィルタを使う。

```jade
  :less
    body {
      @link-color : #f00;
      background:#efefef;

      a{
        color:@link-color;
      }
    }
```

### stylus

<a href='https://github.com/LearnBoost/stylus' target='_blank'>stylus</a>をローカルにインストールしておく。

stylusフィルターを使うか、

```jade
  :stylus
    .container{
      font-size:1.2em;
      
      .some-layout{
        width: 80%;  
      }
    }
```

もしくは、エイリアスのstylを使う。

```jade
  :styl
    color-text = #333;

    .container
      color color-text
```

### cdata

cdataフィルターを使う。

```jade
  :cdata
      hoge
```

### カスタム・フィルタ

カスタム・フィルタはfiltersに追加定義するだけで追加できる。
例えばsomeというfilterを作る場合。

```jade
  :some
    <div>code</div>
```

コンパイル時にフィルターを追加する。
下記は、シンプルに文字をリプレイスしてみる例。

```js
var jade = require('jade');
var filters = jade.filters;
filters.some = function (block) {
    return block.replace(/</g,'&lt;')
                .replace(/>/g,'&gt;');
};
```

下記のように出力される。

```html
&lt;div&gt;code&lt;/div&gt;
```

## やはり

混ぜ過ぎ注意。
LaTeXの小さなサンプル


```small.tex
\documentclass[a5paper]{jsarticle}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[utf8]{inputenc}
\usepackage{amsmath,amssymb}
\usepackage[euler-digits]{eulervm}
\usepackage{inconsolata}
\usepackage{okumacro}
\title{\LaTeXe{}の小さなサンプル}
\author{結城浩\footnote{http://www.hyuki.com/}}
\date{2013年11月10日}
\begin{document}
\maketitle

\section*{物語のはじまり}

カードには、こんな式が書かれていた。
\[
\sum_{k = 1}^{\infty} \frac{1}{k^2} = \zeta(2)
\]

\end{document}
```

このようなファイルsmall.texを準備して、

```
$ platex small
$ dvipdfmx -p a5 small
```

と入力すると small.pdf が作られます。

[作られたPDF(small.pdf)](http://sdrv.ms/1dVQ7d2)

* TeXLive 2013を想定しています。
* eulervmの行をコメントアウトするとEulerフォントではなく通常の数式フォントになります。
* inconsolataパッケージを使っているので、\texttt{foo}はInconsolataフォントになります。
Test::RedisServerとTest::Mock::Redis

redisのテストを書くのに，2つモジュールを使ってみたので，両者の違いを軽くメモ
テスト対象のモジュールには，[Redis::hiredis](https://metacpan.org/pod/Redis::hiredis)を使っている．

# Test::RedisServer
https://metacpan.org/pod/Test::RedisServer

テスト用のredis-serverを立ち上げる．
redis-serverが入ってないと使えないので，別サーバのjenkins上でテストするときとか注意
Test::RedisServer->newしてできたオブジェクトが破棄されるときにテストサーバも止まるので，テストサーバを使う使わないの切り替えが簡単

# Test::Mock::Redis
https://metacpan.org/pod/Test::Mock::Redis

名前の通りモックする，モックなのでredis入ってなくても大丈夫．
ちょっと機能不足なところがある．
auth非対応でokしか返ってこないとか，keyを複数受け付けるコマンドのはずが複数受け付けられるようになってなかったり， ArrayRefが帰ってきてほしいのにArrayが返ってくるとか
（もしかしたら最後のは[Redis](https://metacpan.org/pod/Redis)とRedis::hiredisの違いかもしれない）
XfceでWindows7のAeroSnap的なものを使う

xubuntuにはWindows7のAeroSnapがありません。代替としてなんちゃってAeroSnap(xfwm4-tiling)を入れたときのメモです。
**Xfce環境を利用していることが前提となります。**
**また、インストールの際は5，6個の依存関係ソフトウェアが別に必要です。容量にはご注意を。**

##導入方法
1./etc/apt/sources.listを実行し、「他のソフトウェア」->「追加」にて、

```
deb http://cz.archive.ubuntu.com/ubuntu quantal main universe
```
を入力し、リポジトリを追加します。

2.次にこちらからxfwm4-tilingとxfwm4(Xfceウィンドウマネージャー)のソースコードをダウンロードします。
**ダウンロードの際は、xfwm4-tilingがxfwm4本体の対応するバージョンかどうか確認してください。**

```
https://aur.archlinux.org/packages/xfwm4-tiling/ ( xfwm4-tiling )
http://archive.xfce.org/src/xfce/xfwm4/ ( xfwm4本体 )
```

2013.11.8現在、以下から直接ダウンロードできます。(hをつけてダウンロードしてください)
ttps://aur.archlinux.org/packages/xf/xfwm4-tiling/xfwm4-tiling.tar.gz
ttp://archive.xfce.org/src/xfce/xfwm4/4.10/xfwm4-4.10.1.tar.bz2

3.それぞれのパッケージを適当な場所に展開し、カレントディレクトリを変更します。
ここでは、/tmp/に配置するものとします。

```
cd /tmp/
```

4.xfwm4-tilingフォルダ内に「xfwm4-tiling-4.10.1-1.patch」（バージョンによってファイル名は変化します）があることを確認し、端末に以下のコマンドを入力します。

```
patch -p0 < xfwm4-tiling/xfwm4-tiling-4.10.1-1.patch
```

実行すると、xfwm4のフォルダが見つからずファイルパスを求められる場合があります。
その場合、

```
/tmp/xfwm4/src/client.c
```

と入力してください。

5.依存関係を先に解決します。(私はあれがないこれがないと、5、6回くらいmakeを繰り返したので・・・)
以下のコマンドを実行し、パッケージをすべてインストールしてください。

```
sudo apt-get install intltool xorg-dev libgtk2.0-dev libxfce4util-dev libxfce4ui-1-dev libwnck-dev
```

6.xfwm4をインストールします。xfwm4フォルダにカレントディレクトリを変更します。

```
cd /tmp/xfwm4/
```

7.次に、configureを実行します。以下のコマンドを実行してください。

```
./configure
```

8.makeします。これもそのまま。

```
make
```

9.SuperUserでインストールします。

```
sudo make install
```

10.無事インストールが終わりましたら、リブートするか再ログインをします。ウィンドウをドラッグして張り付くようになれば成功です。お疲れ様でした。
QiitaやGithubで使える絵文字をEmacs上で選べる


...Emacs上に絵文字を並べたかっただけです。:pensive:

![emacs-emoji-cheat-sheet.png](https://qiita-image-store.s3.amazonaws.com/0/8920/78034fbe-3277-b54e-558a-187b4b9e1b7e.png)

### ダウンロード

任意の場所（ここでは~/.emacs.d/elispとします）に移動します。 
:octocat: gitコマンドでダウンロードします。

```zsh
cd ~/.emacs.d/elisp
git clone https://github.com/ShingoFukuyama/emacs-emoji-cheat-sheet
```

### 設定

:pencil2: init.elなどに書き込みます。

```el
(add-to-list 'load-path "~/.emacs.d/elisp/emacs-emoji-cheat-sheet")
(require 'emoji-cheat-sheet)
```

### 使い方

`M-x emoji-cheat-sheet` で絵文字一覧を呼び出します。 
:memo: 絵文字の上でRETキーを押すとクリップボードにコピーされます。

### リンク
:link: [ShingoFukuyama/emacs-emoji-cheat-sheet](https://github.com/ShingoFukuyama/emacs-emoji-cheat-sheet)
:link: [emoji-cheat-sheet.com](http://www.emoji-cheat-sheet.com/)
検索対象が多すぎる場合の対処法


ある条件を満たすファイルのうち、grepに引っかかるファイルを見つけるには、find、xargs、grepを組み合わせて使う。

しかし、例えば、

```Bash
$ find / -name "*.*" -type f | xargs grep -n '$PATH' --color
```

なんてやったりすると、

```Bash
xargs: grep: Argument list too long
```

このように返ってきてしまう。

上記はあまりに極端な例だけれども、きちんとfindで条件を絞ってみても、このように失敗する事はあるだろう。

これは、

>シェルが展開した文字列が OS の制限 (正確には execve(2) の制限) を越えたためである。
[引用元](http://x68000.q-e-d.net/~68user/unix/pickup?xargs)

そうな。

詳細は上記引用元に譲るとして、手っ取り早く問題を解決するには、以下の様にすれば良い。

```Bash
$ find / -name "*.*" -type f | xargs -n 10 grep -n '$PATH' --color
```

これは、findの結果10ファイル分でgrepが実行される様に設定したオプション例で、これによって文字数制限に引っかからないらしい。

## ~~追記~~

~~`Permission denied`とか`No such file or directory`とか言われてターミナルが埋まるのが嫌な時はこんな感じでどうぞ。~~

~~```Bash
$ find / -name "*.*" -type f | xargs -n 10 grep 2> -n '$PATH' --color
```~~

## ~~お詫びと訂正~~

~~申し訳ない、上記"追記"の記載内容に不備がございました。
お詫びして訂正致します。~~

~~`Permission denied`とか`No such file or directory`とか言われてターミナルが埋まるのが嫌な時はこんな感じでどうぞ。~~

~~```Bash
$ find / 2> ~/.Trash/ZZZ -name "*.*" -type f | xargs -n 10 grep 2> ~/.Trash/ZZZ -n '$PATH' --color
```~~

~~これは、標準エラー出力の結果として吐き出したファイルを、直接ゴミ箱に突っ込んでます。
ていうかゴミ箱に吐き出させています。
前回の追記の内容を実施すると、カレントディレクトリに、`2>`直後のオプションをファイル名に持つファイルが出来てしまいます。
`rm`コマンドで削除しようとするとそんなオプションないよ、とか言われることもありますので、そういった場合はfinderから削除してください。~~

## 再度のお詫びと訂正

前回のコマンドが誤りというわけではないのですが、シェルコマンドの定番として、ゴミ箱じゃなくて`Null`を指定するっていうのがあるそうです。

以下が標準エラー出力を捨てる検索方法。

```Bash
$ find / 2> /dev/null -name "*.*" -type f | xargs -n 10 grep 2> /dev/null -n '$PATH' --color
```

以上。
Goで__FILE__、__DIR__のようなものをこさえる

# カレントファイルのファイル名やディレクトリ名を知りたい

[runtime.Caller](http://golang.org/pkg/runtime/#Caller)を利用し、stackの返り値を利用すれば解決できる、というのを
グーグル先生で検索して知った。

元ソース
https://gist.github.com/abrookins/2732551#file-gistfile1-go

# code snippet

```go
import (
  "runtime"
  "path"
)

// __FILE__
func GetCurrentFile() string {
  _, filename, _, _ := runtime.Caller(1)
  return filename
}

// __DIR__
func GetCurrentDir() string {
  _, filename, _, _ := runtime.Caller(1)
  return path.Dir(filename)
}
```

# 利用シーン

ライブラリとコマンドライン、それぞれのソースコードを
同一プロダクト且つ別ディレクトリで管理する形にし、
テスト実行時・コマンド実行時に解決するファイルパスを
都度解決させたいという場合に役に立つ。

[takarabago](https://github.com/futoase/takarabago)という[takarabako](https://github.com/willnet/takarabako)のパクリプロダクトをGoの勉強目的で書いてみた時に利用した。
Twitter検索文法


# リツイートを除外

`exclude:retweets`

# ユーザで検索

`from:rev84`

# ユーザ宛（文中の先頭でリプライ送信しているもののみ）を検索

`to:rev84`

# ユーザ宛（文中のどこでも）を検索

`@rev84`

# 除外は先頭にハイフンを付ける

`-from:rev84`
【質問】Twigで変数から変数を呼び出せない

Twig使われている方でわかる方いらしたら教えて下さい。

Twigをテンプレートエンジンにして、簡易的なCMSを作ってます。

コンテンツ側から、設定などの変数を呼び出したいのですがうまく行かず。
テンプレートエンジン自体にあまり慣れてないので、何か根本的に間違ってる気がしますが・・

```php:index.php
# コンテンツを変数に格納
$content = file_get_contents("./content/20130101.html");

# 設定
$vars = array(
	"site" => array(
		"name" => "HOGE Blog",
		"img_path" => "./inc/images"
	),
	"content" => $content
);

# Twigを読み込んで表示
require_once "./twig/Autoloader.php";
Twig_Autoloader::register();

$loader = new Twig_Loader_Filesystem("./");
$twig   = new Twig_Environment($loader);
$twig->display("template.html", $vars);
```

```php:template.html
<!DOCTYPE html>
<html lang="ja">
<head><title>{{ site.name }}</title></head>
<body>{{ content|raw }}</body>
</html>
```

```html:./content/20130101.html
<p>This blog name is {{ site.name }}.</p>
<dl>
	<dt>My photo<dt>
	<dd><img src="{{ site.img_path }}/myphoto.jpg"></dd>
</dl>
```
RSpecのConfig#before(:all)メモ


Rspec勉強中。

テスト本体をこんな感じで書いてみます。

```rb:a_spec.rb
require 'spec_helper'

describe 'a spec' do
  before(:all) { puts "I'm before(:all) in 1st layer" }
  before(:each) { puts "I'm before(:each) in 1st layer" }

  describe '1st nested describe' do
    before(:all) { puts "I'm before(:all) in 1st nested describe" }
    before(:each) { puts "I'm before(:each) in 1st nested describe" }
    it { puts "I'm first it in 1st nested describe" }
    it { puts "I'm second it in 1st nested describe" }
  end

  describe '2nd nested describe' do
    before(:all) { puts "I'm before(:all) in 2nd nested describe" }
    before(:each) { puts "I'm before(:each) in 2nd nested describe" }
    it { puts "I'm first it in 2nd nested describe" }
    it { puts "I'm second it in 2nd nested describe" }
  end
end
```

そしてHelper。

```rb:spec_helper.rb
RSpec.configure do |config|
  config.before(:all) {
    puts "I'm before(:all) in configuration file."
  }
  config.before(:each) {
    puts "I'm before(:each) in configuration file."
  }
end
```

実行します。

```
I'm before(:all) on configuration file.
I'm before(:all) in 1st layer
I'm before(:all) in 1st nested describe
I'm before(:each) on configuration file.
I'm before(:each) in 1st layer
I'm before(:each) in 1st nested describe
I'm first it in 1st nested describe
.I'm before(:each) on configuration file.
I'm before(:each) in 1st layer
I'm before(:each) in 1st nested describe
I'm second it in 1st nested describe
.I'm before(:all) in 2nd nested describe
I'm before(:each) on configuration file.
I'm before(:each) in 1st layer
I'm before(:each) in 2nd nested describe
I'm first it in 2nd nested describe
.I'm before(:each) on configuration file.
I'm before(:each) in 1st layer
I'm before(:each) in 2nd nested describe
I'm second it in 2nd nested describe
.
```

Config#before(:each)は各Specのbefore(:each)のテスト単位と対応してるけど、
Config#before(:all)は実行の単位が対応しないんですねー。
Specのファイル単位で実行されている感じです。


```rb:a_spec.rb
require 'spec_helper'

describe 'a spec' do
  # config.before(:all) { puts "I'm before(:all) in configuration file." }　こんなイメージ
  before(:all) { puts "I'm before(:all) in 1st layer" }
  before(:each) { puts "I'm before(:each) in 1st layer" }

  describe '1st nested describe' do
    # ここで実行されるイメージだったけどされない
    before(:all) { puts "I'm before(:all) in 1st nested describe" } 
    before(:each) { puts "I'm before(:each) in 1st nested describe" }
    it { puts "I'm first it in 1st nested describe" }
    it { puts "I'm second it in 1st nested describe" }
  end

  describe '2nd nested describe' do
    # ここで実行されるイメージだったされない
    before(:all) { puts "I'm before(:all) in 2nd nested describe" }
    before(:each) { puts "I'm before(:each) in 2nd nested describe" }
    it { puts "I'm first it in 2nd nested describe" }
    it { puts "I'm second it in 2nd nested describe" }
  end
end
```
SVGの画像サイズ指定でわかったこと

せっかくHTML5なんで、SVGタグを使って画像をきれいに表示させることを検討してもらったのですが、
それを利用しようとしてわからなかったことが、サイズ指定でした。

imgタグだと、widthとheight属性を設定するかCSSで同様の指定をすればいいだけです。
さくっとできます。

しかし、SVGだとキャンパス制御になるためちょっとだけ面倒なようです。その面倒な面がわかったため取りまとめします。

svgタグは、HTML5で追加された新しいタグのようで「キャンパス」という表現が使われていることから、
ブラウザをキャンパス用に自由に自在に位置指定でオブジェクトを配置できる。
けれど、その自由さ故の分かりにくさがあります。

今回、サイトのロゴファイルをSVGファイル形式で保存した、logo.svgというファイルを作成した前提で説明です。
logo.svgで表示される大きさは幅450px高さ114pxの画像を表示するものと考えてください。
画像の表示自体は下記のobjectタグを使えばできます。もろもろはブラウザに任せます。

```html
<object type="image/svg+xml" data="/images/logo.svg" id="svgID"> </object>
```

ただし、上記のobjectタグのwidthとheightでは、キャンバスサイズ指定をするだけの属性になるため、
表示するオブジェクトに対しては働きません。

そこで、SVGファイル内の記述を展開して、svgタグで囲むことにします。
ようは、キャンバスをキャンバスで囲むことで表示制御するのです。
具体的には下記のようになります。

```html:logo.html
<svg ...
   preserveAspectRatio="xMinYMin meet"
   viewBox="0 0 450 114"
   x="0px" y="10px" width="225px" height="57px"
   ... >
  <svg ...>
      <!-- /images/logo.svg ファイルの内 450px X 114px の画像表示 記述-->
  </svg>
</svg>
```

上記の「...」の部分はその他に必要となる属性を省略しています。
重要になるところだけ表示しました。
ポイントは、preserveAspectRatio と viewBoxです。

viewBoxは取り扱うオブジェクトのサイズを指定します(位置指定できるため実際のオブジェクトの使いたい部分を指定できます)。ようは、対象物に向けられたカメラの位置および表示する領域を指定することになります。
x,yはキャンパスの相対位置で、width,heightはキャンパスの大きさです。

上記で、今回のポイントは抑えているため、やることはわかるかと思います。

以下の説明は、上記のHTMLを自分なりに納得する形で説明した文章になります。
（HTMLを見て分かる人は不要です)

SVGのpreserveAspectRatioやviewBoxとブラウザの関係をリアル世界で言い換えると
撮影カメラと撮影結果を投影するプロジェクタを、ブラウザ上で制御するイメージになると思います。
例えば、ブラウザを壁とした場合、

* x,yで、壁にプロジェクターの投影する位置を指定、
* width,heightで、投影されるスクリーンの大きさを指定する

ことにになります。
また、スタジオ側のカメラの制御を、viewBoxで行うようなイメージになるのではないでしょうか。
上記のHTMLをスタジオとプロジェクトたで説明すると、

* 今回の撮影対象物は、450px X 114px のサイズです。
* 壁に投影する位置は、壁の左上隅に10px程下げて設定しています。
* 投影されたスクリーンの大きさは、225px X 57px です。
* カメラで、撮影対象物そのものを表示することを指定(左隅から450pxの幅で、114pxの高さを撮影するよう指定)
 * これが、viewBoxに対応 
* そして、撮影した対象物が投影時に幅を基準に最大表示になるように指定しました
 * これが、preserveAspectRatioの(xMinYMin meet)になります。
 * もし、meetをsliceにすると、撮影対象物そのものを撮影する指定をしても、原寸を基準にスクリーンの大きさの内容しか表示されないことになります

※スクリーンは投影対象物より小さいです。ここを実現するためにはまりました

( *読み直していて、なんか遠回りな対応をしたのかもと思ったりしましたが、理解するための通り道だったとします* )