OmniAICreator/Qiita-1.07M huggingface dataset:
where句とorder句のテーブルを集中させて最適化


Mysql 5.5.20

## RailsでAR使ってたら遅いクエリーが

HABTMで
tags <-- pictures_tags --> pictures

の3枚のテーブルが主役。

```sql
desc `pictures_tags`
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| picture_id | bigint(20) unsigned | NO   | MUL | NULL    |                |
| tag_id     | bigint(20) unsigned | NO   | MUL | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+
```

tags, picturesはいろいろ詰まってる。

## tag_id指定でpicturesにあるカラムでソートしたい

普通にやると、explainのextraで
Using temporary; Using filesort
って出る。最悪。
(explainコピペるの忘れた。。

要はjoinしてからorderかけるもんで、
テンポラリーテーブルを作るわファイルソート（メモリ上でクイックソート）はするわでkuso遅い。

原因は
where句で指定しているカラムはtagsにあるし、
order句で指定しているカラムはpicturesにあるので、
一気にインデックス使ってできねえよ、
てことらしい。

参考：
http://nippondanji.blogspot.jp/2009/03/using-filesort.html

## order句、where句で指定するカラムをひとつのテーブルに

そーすっと
Using temporary; Using filesort
が無くなるはず。

要するにpicturesテーブルのカラムを、
pictures_tagsテーブルにもってきただけ。

```sql
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| id         | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| picture_id | bigint(20) unsigned | NO   | MUL | NULL    |                |
| tag_id     | bigint(20) unsigned | NO   | MUL | NULL    |                |
| sort_suru_key | bigint(20) unsigned | YES  |     | 0       |                |
+------------+---------------------+------+-----+---------+----------------+
```

後からソート用の複合インデックス（tag_id, sort_suru_key）は貼った。

## HABTM構成だったからPKないし

RailsはHABTMでPKあると怒る。
だから作ってなかったんだけど、カラム増やすならあった方いいかなと。

```sql
alter table pictures_tags add id bigint unsigned not null AUTO_INCREMENT first, ADD INDEX(`id`), ADD PRIMARY KEY(`id`);
```

Mysqlのドキュメント読んでこんなクエリーになった。
初めて知ったことがあるのでメモ

* PRIMARY KEYはKEYじゃないとNGなので、後から足す時は同時にADD INDEXもする。
* after `カラム名`はできるけど、beforeはないので先頭追加のときはfirstってうつ
* そもそも、ALTER TABLE構文のケツにADD PRIMARY KEY(`id`)ってつけられたんだ。

MySQL音痴なのがバレますね。

## まとめ

殴り書きになってしまい申し訳ないですが、感想としては、、、

* MySQLのパフォーマンスチューニングはexplainの語句の意味分かれば結構簡単にやれる。
* 単純にインデックス貼っとけばOKってのはデータが少ないうちだけ。Mysqlのクエリーオプティマイザの気持ちを知ろう。

ああテキトー
だけど、クエリーは爆速になりました。測定してないけど。。。
論理削除とbelongs_to

リレーション元を削除したら例外出た、を防ぐために論理削除を実装する。
[論理削除系のgemはたくさんある](https://www.ruby-toolbox.com/categories/Active_Record_Soft_Delete)が、とりあえず定番の[rails3_acts_as_paranoid](https://github.com/goncalossilva/rails3_acts_as_paranoid)を使う。

## Gemfileを書いてbundle

```ruby:Gemfile
gem "rails3_acts_as_paranoid"
```

## マイグレーションを作成してmigrate
```
rails g migration AddDeletedAtToCategory deleted_at:timestamp
```

### 論理削除するモデル
```ruby:category.rb
class Cateogory < ActiveRecord::Base
  has_many :items
  acts_as_paranoid
end
```

### リレーション先のモデル
```ruby:item.rb
class Item < ActiveRecord::Base
  belongs_to :item, :with_deleted => true
end
```

### リレーション
```ruby:relate.rb
@category = Category.create
@item = category.items.create
```

### リレーション元を論理削除
```ruby:delete_category.rb
@category.destroy
```

### リレーション先ではまだ参照できる
```ruby:get_category.rb
p @item.category
```

### 論理削除されているかどうかを判定
```ruby:orphan.rb
p @item.category.deleted? #=> true
```

### リソースにリンクはできない
```ruby:items_helper.rb
link_to @item.category.name, @item.category #=> categories#indexへのリンクになる
```

:dependent => :destroyにできない時、したくない時に便利です。
例えば「商品を購入」を中間モデルで表現しているような場合、商品を削除しても購入した記録は残したい時とか。
CapistranoのHookは自前のNamespaceでもいける

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

deployをloadする必要も特に無く、`before`と`after`で好きなようにHookが可能。

```ruby:Capfile
namespace :first do
  task :one   do logger.info "1-1"; end
  task :two   do logger.info "1-2"; end
  task :three do logger.info "1-3"; end
end

namespace :sec do
  task :one   do logger.info "2-1"; end
  task :two   do logger.info "2-2"; end
end

namespace :third do
  task :bang do
    logger.important "I'm third."
  end
end

before "third:bang" do
  top.first.one
  top.first.two
end

before "first:one" do
  top.sec.one
end

before "sec:one" do
  top.sec.two
end

after "third:bang" do
  top.first.three
end
```

Hookされて数代前のBeforeも実行してくれる。
`before/after`にはもちろん普通の処理を書いてもOK。

```Shell:CLI_output
$ cap -n third:bang 
  * executing `third:bang'
    triggering before callbacks for `third:bang'
  * executing `first:one'
    triggering before callbacks for `first:one'
  * executing `sec:one'
    triggering before callbacks for `sec:one'
  * executing `sec:two'
 ** 2-2
 ** 2-1
 ** 1-1
  * executing `first:two'
 ** 1-2
*** I'm third.
    triggering after callbacks for `third:bang'
  * executing `first:three'
 ** 1-3
```

リモートそっちのけでアレコレやってもよいでしょう。ループにはご注意。
JUnitで各種assertとmatcher、Mockitoのmockを呼ぶstaticインポート文

```java
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.junit.matchers.JUnitMatchers.*;
import static org.mockito.Mockito.*;
```
いつもJUnitのテストをMockitoを使ってモックを作りながら実装するとき、
このstaticインポート文を利用する。

これでassert()とかis()とかnotValue()などがEclipseのコードアシストに出てくる。

ただEclipseのインポート編成をすると消えてしまう。
消えない設定をすればいいのだけれど。
友人のプログラミングSF小説のレビュー-haskellとタイムトラベル

[【protected function finally return 0】](http://goo.gl/PyFrB)
Revin(@rev84)によるプログラミング系のSF小説。オブジェクト指向の基本的なことがわかっていれば、楽しめる。 
登場人物の直也とリョウがどことなくRevinと自分っぽい。以前は近くに住んでいたし、関係性も似ている。Redbullのくだりについても、まさにそんなことを喋った記憶がある。もし、似たような題材で書くことがあれば、次は関数型言語についても触れて欲しいと思った。([参考](http://qiita.com/items/a4b6cdbcb937a64147af))
haskellをやると、プログラミングの考え方が変わる。例えば、オブジェクト指向で世界を捉える場合は、この小説のように各オブジェクトの状態の更新(=副作用)によって世界を表現するが、haskellのIOモナドで捉えると、パラパラ漫画のような表現になる。状態を書き換える世界ではなく、状態がパラレルに存在する世界(パラレルな時間軸ではなく、パラレルな状態であることに注意)。
初めてhaskellに触れたとき、時間軸に関する一つの思考実験を思い出した。もし、我々の世界がパラパラ漫画的であるとしたら、切り取られたただの1コマであるこの瞬間の私たちは、未来と過去のどちらに向かっているかを知覚することができない。パラパラ漫画を順めくりしても逆めくりしても、1枚1枚の絵の中のキャラクターは、自身の持つ記憶によって、過去から現在に至るまで、自身が連続的に存在し、それが未来に続いていくと錯覚している。
パラレルで独立で世界の書き換えがない(副作用がない)状態であれば、タイムトラベルを矛盾なく記述することができる、はず。
JavaScriptでゲームループ


ただのコピペです。
詳細はこちら→ http://t100life.blog121.fc2.com/blog-entry-209.html
動くテスト→ http://jsfiddle.net/T7Hug/
※consoleに出力しているだけなので、consoleみないとなにも動いてないように見えます。

```javascript
var Game = {};
Game.FPS = 60;

Game.run = (function() {
	var loops = 0,
		 skipTicks = 1000 / Game.FPS,

		//1秒間に実行したいロジックの回数
   		 maxFrameSkip = 10,

		//スキップする間隔
   		 nextGameTick = +new Date();

    return function {
        loops = 0;

        while (+new Date() > nextGameTick && loops < maxFrameSkip) {
            Game.update();
            nextGameTick += skipTicks;
            loops++;
        }

        //Rendering
        Game.draw();
    };
})();

//Rendering logic
Game.draw = function () {console.log('draw');};

//Game logic
Game.update = function () {console.log('update');};

// Start the game loop
Game._intervalId = setInterval(Game.run, 0);
```
Avoid var self = this 


```
			
var Animal = function(name){
  this.name = name;
  this.arr = [1,2,3,4];
  this.inc = function(num){
      return num + 1;
  };

  this.fireArr = function(){
    this.arr.forEach(function(item){
     console.log(this.inc(item));
    }.bind(this));
  };
    
  };


var dog = new Animal("dog");
console.log(dog.fireArr());

```
RubyMotionで多言語対応する方法


RubyMotionで多言語対応するためには`resources`ディレクトリ配下に、言語に応じたディレクトリと、それぞれの言語で使用する設定ファイルを配置する必要があります。

## ディレクトリ構造

例えば日本語版と英語版を作る場合には以下のようにディレクトリを作成します。それぞれ`ja.lproj`ディレクトリが日本語版、`en.lproj`ディレクトリが英語版を指します。

```text
[RUBY_MOTION_ROOT]
  └/resources
    ├── /ja.lproj
    │     ├── InfoPlist.strings
    │     └── Localizable.strings
    └── /en.lproj
          ├── InfoPlist.strings
          └── Localizable.strings
````

## InfoPlist.strings
`InfoPlist.strings`ファイルには言語別のアプリ名を設定します。

* CFBundleName
  * そのアプリであることが分かる16字未満の値を設定します。
* CFBundleDisplayName
  * アイコンの下に表示されるアプリ名を設定します。

```ja.proj/InfoPlist.strings
CFBundleName = "日本語ですよ";
CFBundleDisplayName = "日本語";
```

```en.proj/InfoPlist.strings
CFBundleName = "English Ver";
CFBundleDisplayName = "English";
```

## Localizable.strings
`Localizable.strings`ファイルには言語別にアプリ内で使用する文字列を設定します。

形式は以下の通りです。

```
"key" = "value";
```

```ja.proj/Localizable.strings
"run" = "実行";
"build" = "ビルド";
"stop" = "中止";
```

```en.proj/Localizable.strings
"run" = "Run";
"build" = "Build";
"stop" = "Stop";
```

### アプリ内で使用する場合
ObjectiveCでは`NSLocalizedString((NSString *)key, (NSString *)comment)`でキーを指定して使用することができますが、どうやらこのメソッドはマクロのようで、RubyMotionから使用することができません。

使用する場合は自分でNSBundleから取得する方法と、[BubbleWrap](https://github.com/rubymotion/BubbleWrap)を使用する方法があります。

#### NSBundleを使用する場合

以下のようなコードを読み込んでおくと便利です。（[RubyMotionフォーラムからの引用です](https://groups.google.com/d/msg/rubymotion/6jgA3H1lduM/QiWlQkKxVOkJ)）

```ruby
module Kernal
  def localized_string(*args)
    key     = args.shift
    default = args.shift || key
    NSBundle.mainBundle.localizedStringForKey(key, value:default, table:nil)
  end
end
```

#### BubbleWrapを使用する場合

以下のようなコードでローカライズされた文字列を取得することができます。

```ruby
BW::localized_string(:run, 'Run')
```
CoreAnimationのdelegate処理をblocks処理に置き換える

1. CAAnimationのカテゴリとしてblocks定義。
2. delegate処理する為にSingleton Class (ここではEEAnimationHandler)を作る。
3. implement側のdelegate呼ばれるタイミングでblocks呼んであげる。

```Objective-C:EEAnimationHandler.h
typedef void (^EEAnimationDidStopHandlerBlock)(CAAnimation *anim, BOOL finished);
typedef void (^EEAnimationDidStartHandlerBlock)(CAAnimation *anim);

@interface CAAnimation (handle)

@property (nonatomic, strong) EEAnimationDidStartHandlerBlock startHandlerBlock;
@property (nonatomic, strong) EEAnimationDidStopHandlerBlock stopHandlerBlock;
@property (nonatomic, strong) NSString *animationKey;
@property (nonatomic, weak) CALayer *addedLayer;

@end

@interface EEAnimationHandler : NSObject

+ (EEAnimationHandler *)sharedHandler;
- (void)registerAnimation:(CAAnimation *)animation toLayer:(CALayer *)layer forKey:(NSString *)key;

@end
```

```Objective-C:EEAnimationHandler.m
@implementation EEAnimationHandler

- (void)registerAnimation:(CAAnimation *)animation toLayer:(CALayer *)layer forKey:(NSString *)aKey
{
    animation.animationKey = key;
    animation.addedLayer = layer;
    animation.delegate = self;
    [layer addAnimation:animation forKey:aKey];
}

#pragma mark - Animation Delegate
- (void)animationDidStart:(CAAnimation *)anim
{
    if (anim.startHandlerBlock) anim.startHandlerBlock(anim);
}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    if (anim.stopHandlerBlock) anim.stopHandlerBlock(anim, flag);
}
```

ざっくりはこんな感じ。
[github](https://github.com/335g/EEAnimationHandler "github - 335g")にアップしてますのでぜひ。
for と forEach の違いの顕著な例


```
var foo = ['a', 'b', 'c'];

for (var i = 0; i < foo.length; i++) {
  var bar = foo[i];
  setTimeout(function() {
    console.log(bar);
  }, 10);
}
// c
// c
// c

foo.forEach(function(bar) {
  setTimeout(function() {
    console.log(bar);
  }, 10);
});
// a
// b
// c
```
Unity3DのiOS用ビルドでファイルサイズを削る方法

細かい最適化のテクニックに関しては、公式リファレンスに色々書いてあるけど、一番手っ取り早い方法は書かれていない。
http://docs.unity3d.com/Documentation/Manual/ReducingFilesize.html

Build Architecturesからarmv6を削る。iPhone 3G以下のサポートを諦める形になるが、結果的に12MBくらい減る。
Dartで日付の計算をする2　休日を除外する

`XMLHttpRequest`を使ってみた。
休日のデータは、GoogleカレンダーAPIを利用して取得する。
JSONのParseの部分で例外処理とかしてないので、データがおかしいと落ちる。

ちなみに、`dart:html`はWeb ApplicationでApplicationを作らないと利用できないので注意。

```js:date-calculator2.dart
#import('dart:html');
#import('dart:json');


void main() {
  //計算開始日
  var start_day = new Date(2012,9,13,0,0,0,0);
  //計算終了日
  var end_day = new Date(2012,9,18,0,0,0,0);

  //DartのAPIを利用して日付の差を求める
  var diff_all = end_day.difference(start_day);
    print(diff_all.inDays);
    
  //土日を除いた日付の差を求める
  var diff_weekday =  difference(start_day, end_day);
  print(diff_weekday);
  
  //土日と休日を除いた日付の差を求める
  var url = makeUrl(end_day, start_day);
  getHolidayData(onSuccess(XMLHttpRequest request){
    var count = pickHoliday(request);
    var diff_un_hollyday = difference(start_day, end_day) - count;
    print(diff_un_hollyday);
  }, url);
}

difference(start,end){
  var diff = 0;
  while(start < end){
    var weekday = start.weekday;
    if(weekday !== Date.SAT && weekday !== Date.SUN){
      diff++;
    }
    start = start.add(const Duration(1,0,0,0));
  }
  return diff;
}
pickHoliday(XMLHttpRequest request){
  var data = JSON.parse(request.responseText);
  var count = data["items"].length;
  return count;
}

getHolidayData(onSuccess(XMLHttpRequest request), url){
  var request = new XMLHttpRequest();
  request.open("GET", url);
  request.send();
  
  request.on.readyStateChange.add((Event e){
    if(request.readyState === XMLHttpRequest.DONE && (request.status === 200 || request.status === 0)){
      onSuccess(request);
    }
  });
}

makeUrl(timeMax, timeMin){
  final API_KEY = 
  final CalendarURL = "https://www.googleapis.com/calendar/v3/calendars/ja.japanese%23holiday%40group.v.calendar.google.com/events";
  var timeMaxString = "${timeMax.year}-${timeMax.month}-${timeMax.day}T00:00:00Z";
  var timeMinString = "${timeMin.year}-${timeMin.month}-${timeMin.day}T00:00:00Z";
  return "${CalendarURL}?timeMax=${timeMaxString}&timeMin=${timeMinString}&key=$API_KEY";
}
```

1つのクラスにまとめたのであれだけど、すごくJavaっぽいコードになっている。

Dartの思想だとか知らないけど、JavaScriptをJavaっぽく書いているってイメージ。

だとしたら、まさにDirtな言語なんじゃないだろうか・・・。
express 3.x と socket.io を組み合わせて使う


express 2.x までは socket.io と以下のように組み合わせて使うことができました。

```
var express = require('express')
  , app = express.createServer()
  , io = require('socket.io').listen(app);

app.listen(3000);
```

express Wiki の [Migrating from 2.x to 3.x](https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x) によれば、3.x から `express.createServer()` のかわりに `express()` を使うようになりましたが、`express()` の戻り値は `http.Server` ではありません。socket.io の `listen()` は `http.Server` を引数にとるので、以下のように `http.createServer()` でラップしたものを使う必要があります。

```
var express = require('express')
  , http = require('http')
  , app = express()
  , server = http.createServer(app)
  , io = require('socket.io').listen(server);

server.listen(3000);
```
dircolorsが見つからないときは

lsの色を変えようと思って検索するとdircolorsコマンドを使えという記事がよく出てくるのですが、Macでは標準でこのコマンドはありません。(dircolorsはGNU ls用のコマンドで、Mac標準のlsはFree BSD lsのためのようです)

環境変数の``LSCOLORS``で色指定することもできるのですが、[dircolors-solarized](https://github.com/seebi/dircolors-solarized)を使いたかったのでGNU lsをインストールしました。

```sh
brew install coreutils
```

```.zshrc
export PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"
```

これで標準のlsがGNU lsに変わり、dircolorsコマンドもインストールされて使えるようになります。
.tmux.confでifを使う

tmux-powerlineを使い始めたのですが、設定ファイルを複数端末で共有している関係で、tmux-powerlineがインストールされていない場合は読み込まないようにしたいと思いました。
.tmux.confはシェルスクリプトではないので、あまり自由度は高くないのですが、ifは使うことができます。
syntaxは``if shell-command command [command]`` となっていて、shell-commandのexit codeが0の時のみcommandが実行されます。

今回はこんな感じで~/work/tmux-powerlineが存在するときのみ設定をロードするようにしてみました。

```.tmux.conf
if "test -d ~/work/tmux-powerline" "set-option -g status-left '#(~/work/tmux-powerline/status-left.sh)'"
```
デスクトップ等の特殊ディレクトリのパスを取得する

よく忘れるのでメモ。

デスクトップ等の特殊ディレクトリのパスを取得するには `System.Environment.GetFolderPath()` メソッドを使います。

```csharp:SampleGetFolderPath.cs
using System;

string desktopDirectoryPath =
 Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
```

# 参考

* [特殊ディレクトリのパスを取得する: .NET Tips: C#, VB.NET](http://dobon.net/vb/dotnet/file/getfolderpath.html)
npm init で package.json を生成


`npm init` すると、質問に答えるだけで package.json を作ることができます。node_modules に入っているパッケージを `dependencies` に勝手に入れてくれたりも。

また、後でパッケージを追加するときに、入れてみないと最新のバージョンがわからない時があります。

```
$ npm install foo -save
or
$ npm install foo -S
```

とすると、インストールしつつ、そのバージョンで package.json の `dependencies` に書き足してくれて便利です。

```
$ npm install foo -save-dev
or
$ npm install foo -D
```

とすると、`devDependencies` に書き足してくれます。テストライブラリなど開発中にしか使わないものに使います。
oh-my-zsh導入後にhistoryが全件表示されるのを解決する方法

##問題と解決方法
**oh-my-zsh**を導入すると、`history`コマンドを入力した際に、コマンドの全履歴が表示されるようになります。
僕は毎回全件表示されるのはうれしくないので、以下の方法で標準の動きに戻しました。

````~/.zshrc
alias history='fc -l'
````

またこの変更により、世間一般で使われている`history`コマンドのオプションが普通に使えるようになります。

````zsh
# 最新の20件を表示
% history -20
# 全件を表示
% history 1
````

##原因
全件が表示されたり、通常のオプションが効かなくなったりしてしまうのは`~/.oh-my-zsh/lib/aliases.zsh`に以下の設定があるためです。

````~/.oh-my-zsh/lib/aliases.zsh
alias history='fc -l 1'
````

ちなみにGithub上のコードはこちらです。
https://github.com/robbyrussell/oh-my-zsh/blob/master/lib/aliases.zsh

##裏話
この問題を解決できたのは@yaottiさんの[コメント](http://qiita.com/items/fd6182aeedcd194d3937#comment-a94326649bfb405d1bbb)のおかげです。@yaottiさん、どうもありがとうございました！！

今回僕はこんな感じで原因を特定していきました。

1. `history`コマンドは`fc -l`と同じはず (@yaottiさん情報)
1. `alias history`でエイリアスを確認
1. `history='fc -l 1'`と表示される (つまり全件表示)
1. おかしい。特に自分でエイリアスを設定した記憶はない。oh-my-zshが原因か？
1. まず手始めに`~/.zshrc`を読む
1. `~/.oh-my-zsh/oh-my-zsh.rc`が怪しいので読む
1. `~/.oh-my-zsh/lib`の下で何か色々と設定を読み込んでいる
1. `grep history ~/.oh-my-zsh/lib/*`で検索
1. `~/.oh-my-zsh/lib/aliases.zsh:alias history='fc -l 1'`が表示される。これが原因か！
1. `~/.zshrc`でエイリアスを上書きすることで解決！

なかなか苦労しましたが、これでスッキリしました。ついでにLinux/UNIXの勉強にもなりました。
クラスメソッド内でselfを使う

親クラスに書いておくだけで
[HogeHoge hogeWithDictionary];
[Poi hogeWithDictionary];
によって子のオブジェクトが作れます。


```objc:hoge.m
@interface Hoge : NSObject
+ (id)hogeWithDictionary:(NSDictionary *)dic;
@end

@interface HogeHoge : Hoge
@end

@interface Poi : Hoge
@end

@implementation Hoge
+ (id)hogeWithDictionary:(NSDictionary *)dic
{
    Hoge  *hoge = [[[[self class] alloc] init] autorelease];
    [hoge setUp:dic];
    
    return hoge;
}

- (void)setUp:(NSDictionary *)dic
{
    //処理
    NSLog(@"Hoge処理");
}
@end

@implementation HogeHoge
- (void)setUp:(NSDictionary *)dic
{
    [super setUp:dic];
    //処理
    NSLog(@"HogeHoge処理");
}
@end


@implementation Poi
- (void)setUp:(NSDictionary *)dic
{
    //処理
    NSLog(@"Poi処理");
}
@end

```
アノテーションを自作してみる。


[カスタムクラスローダを作ってみる](http://qiita.com/items/2545a78ec953d692a70e)に引き続き、リフレクションとかで遊ぶ。アノテーションでなんかしてみる。
## MyAnnotation.java

    import java.lang.reflect.Method;
    import java.lang.annotation.Annotation;
    import java.lang.annotation.Target;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    
    public class MyAnnotation {
        public static void main(String[] args) {
            Class clazz = MyAnnotation.class;
            Method[] methods = clazz.getDeclaredMethods();
            for (Method method : methods) {
                try {
                    Annotation[] annotations = method.getDeclaredAnnotations();
                    for (Annotation annotation : annotations) {
                        if (annotation.annotationType().equals(CallMe.class)) {
                            method.invoke(null); 
                        }
                    }
                } catch (Exception e) { // nice catch!
                }
            }
        }
    
        @CallMe
        static void test1() {
            System.out.println("call test1");
        }
    
        static void test2() {
            System.out.println("call test2");
        }
    
        @CallMe
        static void test3() {
            System.out.println("call test3");
        }
    }
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    @interface CallMe {
    }
Classオブジェクトから＠CallMeアノテーションのついているstaticメソッドだけ呼び出し。

## 実行結果

    $ java MyAnnotation 
    call test1
    call test3
＠CallMeをつけたメソッドtest1, test3メソッドだけ呼ばれてますね。

## 参考サイト
- [Javaアノテーションメモ(Hishidama's Java annotation Memo)](http://www.ne.jp/asahi/hishidama/home/tech/java/annotation.html)
- [Java プログラミングのダイナミックス: 第 2 回 リフレクション入門](http://www.ibm.com/developerworks/jp/java/library/j-dyn0603/)
- [当然JDK APIリファレンスも](http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html)
Dartで日付の計算をする

もしかしたら、ブームが来ているかもしれないと思ったので、簡単なコードを書いてみた。

```js:date-calculator.dart
void main() {
  var start_day = new Date(2012,8,3,0,0,0,0);

  var one_week_ago = new Date(2012,8,10,0,0,0,0);
  
  var diff = one_week_ago.difference(start_day);
  
  print(diff.inDays);//7
  var difference =  difference(start_day, one_week_ago);
  print(difference);//5
}

int difference(start,end){
  var diff = 0;
  while(start < end){
    // start の曜日を調べる
    var weekday = start.weekday;
    // 土曜、日曜でないならdiffを増やす
    if(weekday !== Date.SAT && weekday !== Date.SUN){
      diff++;
    }
    // startを1日進める
    start = start.add(const Duration(1, 0, 0, 0));
  }
  return diff;
}
```

今回定義したメソッド`difference`は、土日を除いた平日のみを計算する。

この程度のコードの量だとあんまりJSと変わらないかなぁ？なイメージ。むしろ、JSはプロパティの追加が簡単にできるので、`Date`クラスにメソッドを追加して
`var diff = one_week_ago.difference(start_day, true)`こんなこともできるのでは？

フラグが`true`の時は、平日のみの計算みたいな・・・
Djangoの管理コマンでスクリプトを実行させる

Djangoの管理コマンドから, Djangoの環境でPythonスクリプトを実行させるカスタムコマンドクラス.

何らかの例外をキャッチすると, ロガーにスタックトレースを吐いて, ステータスコード1を返す.

こんなかんじに使う.

```
$ python manage.py script do_something.py && do_next || else_do
```

```py:app/management/commands/script.py
# -*- coding: utf-8


import sys
import logging

from django.core.management.base import LabelCommand, CommandError


logger = logging.getLogger(__name__)


class Command(LabelCommand):
    help = u'Executes the specified script file in current context.'
    args = u'[file]'
    label = u'script file'

    # Prevent to validate installed models.
    requires_model_validation = False

    def handle_label(self, label, **options):
        try:
            locals_ = {u'__name__': u'__main__'}
            globals_ = {}
            execfile(label, locals_, globals_)
        except Exception:
            logger.exception(u'Got an error in executing %s.' % label)
            raise CommandError
```
WordPress でカテゴリ別アーカイブ


```php
$cat_ID = 12;
wp_get_cat_archives('type=monthly', $cat_ID);
```

という感じで使います。

以下のリンクの情報をもとに書きました。

- http://wordpress.org/support/topic/wp_get_archives-and-conditional-tags
- http://www.stemlegal.com/greenhouse/2012/setting-up-month-archives-to-only-display-custom-taxonomy-wordpress/

```functions.php
add_filter('getarchives_where', 'custom_archives_where', 10, 2);
add_filter('getarchives_join', 'custom_archives_join', 10, 2);

function custom_archives_join($x, $r) {
  global $wpdb;
  $cat_ID = $r['cat'];
  if (isset($cat_ID)) {
    return $x . " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)";
  } else {
    return $x;
  }
}

function custom_archives_where($x, $r) {
  global $wpdb;
  $cat_ID = $r['cat'];
  if (isset($cat_ID)) {
    return $x . " AND $wpdb->term_taxonomy.taxonomy = 'category' AND $wpdb->term_taxonomy.term_id IN ($cat_ID)";
  } else {
    $x;
  }
}

function wp_get_cat_archives($opts, $cat) {
  $args = wp_parse_args($opts, array('echo' => '1')); // default echo is 1.
  $echo = $args['echo'] != '0'; // remember the original echo flag.
  $args['echo'] = 0;
  $args['cat'] = $cat;

  $archives = wp_get_archives(build_query($args));
  $archs = explode('</li>', $archives);
  $links = array();

  foreach ($archs as $archive) {
    $link = preg_replace("/href='([^']+)'/", "href='$1?cat={$cat}'", $archive);
    array_push($links, $link);
  }
  $result = implode('</li>', $links);
  
  if ($echo) {
    echo $result;
  } else {
    return $result;
  }
}
```
多言語なcsvをﾍﾟｯてしたかっただけなんだよう

無駄に半日費やしました。
**iconv**ってなんですか**mb_convert_encoding**が使えないから絶望してたらiconvで一発解決じゃないですかーやだー！

というどうでもいい前置きは置いといて、本題。
**多言語な内容のcsvをPHPで吐き出すのに、どうしたら文字化けないか**。ってことです。

答え。

**BOM付きUTF-16LEでTAB区切りでﾍﾟｯってしましょう。**
（余談ですが、TAB区切りはtsvって言うそうですね。）

これならWindowsでもMacでもダブルクリックでExcelさんに読み込ませてもちゃんと読み込まれます。

```csv.php
<?php
header('Content-Encoding: UTF-16LE');
header('Content-type: text/csv; charset=UTF-16LE');
header('Content-Disposition: attachment; filename=file.csv');

$bom = chr(255) . chr(254); //BOM

//以下お好みのレイアウトでテキストを生成してください。
$txt = "あああ\tいいい\tううう\n";
$txt .= "えええええ\tお。";

//mb_convert_encodingが使えるならそっちでもいいでしょう。
echo $bom . iconv("UTF-8", "UTF-16LE", $txt);

exit();
```

とりあえずこれで、ブラウザでアクセスするとfile.csvをﾍﾟｯってしてくれます。
エスケープ処理とかは頑張ってください！
xinetdだけでTCP接続を他サーバへ転送する

メールサーバのリプレースで旧サーバに来たTCP接続を新サーバに転送したい場合など、他サーバへのTCP接続の転送が必要な場合、xinetdだけで実現することができます。

なお、最近のディストリビューションでは標準ではxinetdが無効化されている場合があるため、xinetd パッケージを導入し、chkconfig や update-rc.d などであらかじめ有効化してください。

例えば、imaps(TCP ポート番号993)を、別のサーバ<yy.yy.yy.yy>のポート番号993に転送するのであれば、以下のファイルを /etc/xinetd.d/imaps として作成します。

> service imaps
> {
>         disable                 = no
>         socket_type             = stream
>         wait                    = no
>         user                    = nobody
>         redirect                = yy.yy.yy.yy imaps
> }

ポート番号は port = 10993 のように変更することができます。

TCP接続を受けるたびに、userで指定したユーザ(上記ではnobody)で xinetd のプロセスが増えるので、たくさんの接続が来ることが想定される場合は、秒間接続数を制限するcpsなどを指定するか、別の手法を用いるべきです。
Readline module for Gauche インストールログ 

Gaucheの対話型インタプリタが貧弱で弱っていたのだが、Readline Moduleを入れれば良くなるよと教えてもらったので入れてみたログ。

```gauche-readline-install-log.dat
$ wget http://www.netlab.is.tsukuba.ac.jp/~yokota/archive/Gauche-readline-20100625.tar.gz
$ tar xzf Gauche-readline-20100625.tar.gz
$ cd Gauche-readline-20100625
$ ./configure
$ make
$ make check
$ sudo make install
$ gosh-rl 
WARNING: Quote character setting is not supported by the library.
gosh> 
```

最新版は[筑波大学の横田さんのページ](http://www.netlab.is.tsukuba.ac.jp/~yokota/izumi/gauche/)からダウンロードすることができる。
Scheme手習いメモ (9章 - …もう一度、もう一度、もう一度…)


##keep-looking
`(6 2 4 caviar 5 7 3)` のようなリストがあったとき、まず1番目の要素は `6`,6番目の要素は `3`, 3番目の要素は `caviar` 。探している要素が `caviar` かどうか？という風に、順々に要素を辿る関数を定義する。

```Lisp:keep-looking.scm
(define looking
  (lambda (a lat)
    (keep-looking a (pick 1 lat) lat)))

(define keep-looking
  (lambda (a sorn lat)
    (cond
      ((number? sorn)
       (keep-looking a (pick sorn lat) lat))
      (else (eq? sorn a)))))

(define a 'caviar)
(define l '(6 2 4 caviar 5 7 3))
(print (keep-looking a 'caviar l))
```

##shift
第一の要素がペアであるペアを引数にとり、括弧をシフトする関数 `shift` を定義する。

```Lisp:shift.scm
(define first
  (lambda (p)
    (car p)))

(define second
  (lambda (p)
    (car (cdr p))))

(define build
  (lambda (a1 a2)
    (cons a1 (cons a2 (quote ())))))

(define shift
  (lambda (pair)
    (build (first (first pair))
           (build (second (first pair))
                  (second pair)))))

(define l '((a b) (c d)))
(print (shift l))
```

出力は `(a (b (c d)))` となる。

##length*
入れ子になったペアに含まれる要素の個数を計算する `length*` を定義する。

```Lisp:length*.scm
(define length*
  (lambda (para)
    (cond
      ((atom? para) 1)
      (else
        (+ (length* (first para))
           (length* (second para)))))))
```

##collatz
Collatz予想の計算を行う関数。

```Lisp:collatz.scm
(define collatz
  (lambda (n)
    (cond
      (eq? n 1)
      (else
        (cond
          ((even? n) (collatz (/ n 2)))
          (else (collatz (add1 (* 3 n)))))))))
```
ありがとう Lothar Collatz。

##ackermann
Ackermann関数を計算する関数

```Lisp:ackermann.scm
(define ackermann
  (lambda (n m)
    (cond
      ((zero? n) (add1 m))
      ((zero? m) (ackermann (sub1 n) 1))
      (else (ackermann (sub1 n)
                       (ackermann n (sub1 m)))))))
```

ありがとう Wilhelm Ackermann。

##
web2pyのcookieの有効期限を変更する方法


cookieの有効期限を設定していなかったせいではまったのでメモ。

次のコードで有効期限を変更できる。
最終アクセス日からの秒数で指定

```python:db.py
response.cookies[response.session_id_name]['expires'] = 3600 * 24 * 30
```

この例では最終アクセス日から30日間有効となる。
TerminalからSublimeText2を開くコマンドをインストールする。


Sublimeのパッケージの中にsublコマンドが用意されていますが、
デフォルトではパスが通っておらず使用できないため、パスを通して使えるようにします。

```shell
$ echo $PATH
```

シンボリックをはります。

```shell
$ ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" /usr/local/bin/subl
```

これでsublが使えます。
ファイルを開いたり、

```shell
$ subl ./hoge.txt
```

ディレクトリの中、全体を開くことができます。

```shell
$ cd ~/myproject
$ subl .
```

参考資料：
Document > Miscellaneous > [OS X Command Line](http://www.sublimetext.com/docs/2/osx_command_line.html)
CentOSに最新版ImageMagickをインストールする

※ 各種依存ライブラリは導入済であることが前提の、ただの手順になります。

## 公式サイトからソースパッケージ(SRPM)をダウンロード

```bash:
wget http://imagemagick.org/download/linux/SRPMS/ImageMagick.src.rpm
```

### 当該パッケージのバージョン確認

```bash:curlでrdf取得してバージョンが分かる部分を確認
curl -s http://imagemagick.org/download/linux/SRPMS/digest.rdf | grep 'rdf:about'
```

```xml:出力例
  <digest:Content rdf:about="ImageMagick-6.7.9-1.src.rpm">
  <digest:Content rdf:about="ImageMagick.src.rpm">
```

- 上記例だと、ImageMagick-6.7.9-1.src.rpm の方をインストールしても同じ。そこらへんはお好みで。

## リビルド

```bash:ソースパッケージをリビルド
rpmbuild --rebuild --clean --rmsource --rmspec ImageMagick.src.rpm
```

- 「 `--rebuild` 」以外のオプションはリビルド後の残骸を削除するためのもの。あってもなくてもよい。お好みで。

### CentOS 6ならそのままリビルドできるが、CentOS 5の場合は以下の点に注意

- Fedoraでは、Perlのパッケージが `perl` 、 `perl-devel` に分かれているが、CentOS 5ではどちらも同じ `perl` パッケージに入っている。
 - CentOS 6からはFedoraと同様に `perl-devel` が存在する。
 - http://qiita.com/items/3bac11eb48ba9d24ef7a


#### CentOS 5の場合はソースパッケージを展開して、SPECファイルを直接変更してからリビルド

```bash:ソースパッケージ展開
rpm -Uvh --nomd5 ImageMagick.src.rpm
```

- 「 `/usr/src/redhat/SPECS/ImageMagick.spec` 」のファイルで置換→「 `s/perl-devel/perl/g` 」

## リビルドしたパッケージをインストール

- CentOS 6からは展開先が「 `/root/rpmbuild` 」に変更されているので注意。
 - ※ユーザがrootの場合。
 - CentOS 5までは「 `/usr/src/redhat` 」だった。

```bash:rpmインストール
rpm -Uvh /root/rpmbuild/RPMS/`uname -i`/ImageMagick-*.`uname -i`.rpm
```

## 確認

### 実行ファイル確認

```bash:convertコマンドのバージョンで確認
convert -version
```

### ライブラリ確認

```bash:ldconfigの出力結果を絞り込んで確認
ldconfig -p | grep libmagic
```

```bash:出力例
        libmagic.so.1 (libc6,x86-64) => /usr/lib64/libmagic.so.1
        libmagic.so (libc6,x86-64) => /usr/lib64/libmagic.so
```
ec-cubeの商品登録数を制限する


ver2.12.1で対応した

商品データはdtb_productsテーブルに保存される為
countで件数を調べ分岐させる

また商品登録はadmin画面から
1件ずつ登録する方法と
CSVで登録する方法がある為
2つのPHPを編集する

```vi:data/class/pages/admin/products/LC_Page_Admin_Products_Product.php
154行目
case 'complete':
    // パラメーター初期化, 取得
    $this->lfInitFormParam($objFormParam, $_POST);
    $arrForm = $this->lfGetFormParam_Complete($objFormParam);
    // エラーチェック
    $this->arrErr = $this->lfCheckError_Edit($objFormParam, $objUpFile, $objDownFile, $arrForm);

	/////////////////////////////////////////
	//商品数をチェックしreturnさせる処理を追加する
	/////////////////////////////////////////

    if (count($this->arrErr) == 0) {
        // DBへデータ登録
        $product_id = $this->lfRegistProduct($objUpFile, $objDownFile, $arrForm);
```


```vi:data/class/pages/admin/products/LC_Page_Admin_Products_UploadCSV.php
249行目
if ($all_line_checked) {

	/////////////////////////////////////////
	//商品数をチェックしreturnさせる処理を追加する
	/////////////////////////////////////////

    $this->lfRegistProduct($objQuery, $line_count, $objFormParam);
    $arrParam = $objFormParam->getHashArray();

    $this->addRowResult($line_count, '商品ID：'.$arrParam['product_id'] . ' / 商品名：' . $arrParam['name']);
}
SC_Utils_Ex::extendTimeOut();
```

CSVの方はDBの件数とCSVの件数を合計し処理した。
CSV件数：$line_count
スリープの阻害要因を調べる


macがスリープしなくなったら、 pmset -g assertions を実行するといい。

```
$ pmset -g assertions
2012/08/24 7:43:00 JST   
Assertion status system-wide:
   PreventUserIdleDisplaySleep    0
   PreventSystemSleep             1
   PreventUserIdleSystemSleep     0
   ExternalMedia                  0
   UserIsActive                   0
   ApplePushServiceTask           0
   BackgroundTask                 1

Listed by owning process:
  pid 57744(InternetSharing): [0x0000000800001ffb] 08:17:26 DenySystemSleep named: "com.apple.InternetSharing" 
  pid 66253(named): [0x000000080000200f] 08:17:20 DenySystemSleep named: "org.isc.named.denysystemsleep" 
  pid 73891(helpd): [0x0000000c0000218c] 00:15:21 BackgroundTask named: "com.apple.helpd.sdmbuilding" 

```

PreventSystemSleepが1となっていて、スリープを阻害しているプロセスがあることが分かる。そのプロセスは、Listed by owning process以下に出力される。

この例ではインターネット共有が原因。

https://discussions.apple.com/thread/4139090?start=0&tstart=0
最速podspec自炊研究会



- [CocoaPods ではじめる Objective-C ライブラリ管理 (2) - Watsonのメモ]("http://d.hatena.ne.jp/Watson/20111205/mac_dev_jp_advent_calendar_cocoapods02")
- [A-Liaison BLOG: CocoaPods に対応していないライブラリを集めた自分用リポジトリを作る方法]("http://akisute.com/2011/12/cocoapods.html")
- [Cocoa/iOSライブラリのPodspecを修正して、CocoaPodsで依存関係の解決 - rh7&apos;s blog]("http://rh7.hateblo.jp/entry/20120113/1326387581")

このへんの手順を簡単にこなせるように自分がやっている方法です。
あんまり調べずに自己流でやってるだけなので正規の方法やもっと効率いいやりかたがあるかもしれません(ツッコミ歓迎)。

- 自作のライブラリをCocoaPodsでインストールできるようにしたいんだけどまだそんなに自信がないので共有リポジトリにpull-requestするのはちょっと……
- インストールしたいライブラリの新しいバージョンが出てるんだけど古いバージョンしかない……
- CocoaPods対応したいライブラリがあるんだけどどんな作業をすればいいの？
- pod install したんだけど一部のパッケージでエラーが出て困った！

以上のような問題を解決します

まず`mkdir -p ~/.cocoapods/local/MyLibrary/0.1.0` で作業スペースを作ります。localの部分は任意です。ローカルで作業したいだけなのでlocalはgitのツリーに入ってなくていいです。
次にそのディレクトリに`pod spec create MyLibrary`コマンドで`MyLibrary.podspec`を配置し編集します。依存パッケージの記述方法など`~/.cocoapods/master/*`の適当に参考にコピペするといいです。

    pod search MyLibrary
    # ==> MyLibrary (0.1.0)

検索するとこの時点でもう出てくるのであとはダミーアプリのXcodeプロジェクトでもつくって、pod install -> podspec修正をうまくいくまで繰替えすだけでできあがりです。

既にmasterにあるパッケージの最新バージョンをとりあえず今欲しい、という場合は`cp -a ~/.cocoapods/master/RestKit/0.10.1 ~/.cocoapods/local/RestKit/0.10.2`のように移植してバージョン番号のタグだけ書き換えちゃいましょう。

これでインストールなどうまくいくことを確認したら中央リポジトリ加える為に本家Specをフォークし直しpull-requestすることも可能です。

またCocoaPodsのSpecリポジトリのプロジェクトはpull-requestやissueでヘイヘイ言ってるとコミット権限すぐもらえます(Google翻訳でつくった英文とかで問題ない)。
vimで、rails.vimやrubyを使ったらエラーが出る場合の対処法(MacOS)


## vim-rails

vim-rails( rails.vim )は、RoRプロジェクトでのコマンドをvim上から行えたり、色々便利なプラグインです。

## 問題点

その中で、mountain lionにしてから下記のコマンドがバグるようになりました。
何故かRuby系の実行ファイルをMacOSにプリインストールされている方で実行しており、`:!ruby filename`や`:QuickRun`で実行したときに盛大にバグってました。
Rails.vimでもこんな有様です。

`:Rake db:create`

```vim
rake aborted!
no such file to load -- bundler/setup
/Users/taichou/project/gift/Rakefile:5:in `require'
(See full trace by running task with --trace)
(in /Users/taichou/project/gift)
```

`:Rails new hoge`

```vim
Rails is not currently installed on this system. To get the latest version, simply type:

$ sudo gem install rails

You can then rerun your "rails" command."
```

しかし、shell上からはちゃんと動かせるしPATHが通っていないはずはない。

`:!$PATH`でvimから$PATHを調べてみました。
すると

```shell
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/Applications/MacVim.app/Contents/MacOS:/Users/taichou/.autojump/bin:…続く
```

何故か`/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin`が先頭でも読み込まれている？
MacOS標準搭載のrubyを避けるために、/usr/binのPATHは後ろに記述しているはずなのですが。。

## 解決

原因はMacOSに標準で入っているshellの設定ファイルが原因でした。

```shell
cd /etc
sudo vim paths

# /usr/binを削除
```

どうやら、vim上からコマンドを呼び出すと、先にこちらに記述したPATHへアクセスするようです

これでめでたし、~/.zshrcなどの設定から$PATHを構築してくれるようになりました。

なお、/etc/pathsは恐らくshellのデフォルト$PATHを設定しているので、編集する場合は十分注意してくださいね。

## おまけ

調べている最中に`:sh`コマンドを発見した。
vimをいったん抜けてshellを起動出来るみたい。（しかもshellを閉じたらvimに戻る）
おぉ、これは捗る！
Vim でキーストロークに割り当てられている機能を確認する

Trinity.vim 便利ですね。まだ使いこなせていないのですが。

![](https://lh5.googleusercontent.com/-03XFfseWU7M/UDZT8fihogI/AAAAAAAAEkM/q8AHpVuNNpE/s800/2012-08-24_00h55_34.png)

さて、Trinity.vim を起動してる間、ノーマルモードで`<SPACE>`キーを押した時の挙動が変わってしまい困っています。
他にも、新しいプラグインをインストールした後に、キー割り当てが変わってしまうこともあります。

そんな時、以下のコマンドで調べることができるようです。

# キー割り当てを調べるコマンド

```vim:
:verb nmap [キーストローク] (※ノーマルモード)
:verb imap [キーストローク] (※インサートモード)
```

## 例

```vim:
:verb map <space>
```

こんな感じで、キーストロークへの機能の割り当てをしているプラグインでまで詳しくわかります。

![](https://lh3.googleusercontent.com/-LyF06MV6Shc/UDZT8Fg4ZqI/AAAAAAAAEkI/dNtcuGB2gbE/s800/2012-08-24_01h00_36.png)

# キー割り当て一覧を調べるコマンド


```vim:
:verb nmap (※ノーマルモード)
:verb imap (※インサートモード)
```

# 参考

* [Vimで現在割り当てられているショートカットキーの一覧を見る - アインシュタインの電話番号☎](http://blog.ruedap.com/entry/20110111/vim_keyboard_shortcut_key)
Sassで乱数を返す関数


## コード
```sass
require 'sass'

module ::Sass::Script::Functions

  # <tt>0</tt>から<tt>x</tt>の間の乱数を返す。
  # 返り値の単位は<tt>x</tt>と同じ。
  # @param [::Sass::Script::Number] x
  # @return [::Sass::Script::Number]
  def rand_between_0_and(x)
    numeric_transformation(x){|value| rand*value}
  end

  # キーワード引数をサポート。
  # この場合は引数1つだから不要ではあるが。
  declare :rand_between_0_and, args: [:x]
end
```

## 使い方
```sass
// h1-7要素のcolor属性をランダムな色相を持つ暗めの色に設定。
h1, h2, h3, h4, h5, h6, h7
  color: hsl(rand_between_0_and(360deg), 30%, 35%)
```
rbenvで2.0.0を入れたらopensslがrequireできない

メモです。

https://github.com/sstephenson/ruby-build/issues/197

* Ruby 2.0が、Macに最初から入ってるopensslより新しいバージョンを必要とする
* brew install opensslで最新版を入れる(keg-only)

```
$ CONFIGURE_OPTS=--with-openssl-dir=`brew --prefix openssl` rbenv install 2.0.0-dev
```

でうまく行った。
カンマ区切りで処理を繋ぐ書き方


とあるJSを解析していたところ、下記のような書き方でJSを記述していた。

```:javascript
var a = (function(){
	var hoge,fuga;
	return hoge = 1, fuga =2 , function(){
		return hoge + fuga;
	}
})();
a();
// >>3
```
returnの後に処理をカンマで区切って書いている。。
結局は最後に記述した処理がreturnされるのだけど、、、
非常に読みにくい。

素直にこれじゃだめなのか？

```:javascript
var a = (function(){
	var hoge = 1,
		fuga = 2;
	return function(){
		return hoge + fuga;
	}
})();
a();
// >>3
```

カンマ区切りのメリットはあるのだろうか。。
JavaScript で flatten


配列の配列を展開します。

```js
var nested = [
  [0, 1, 2],
  [3, 4, 5],
  [6, 7, 8]
];
Array.prototype.concat.apply([], nested);
// -> [0, 1, 2, 3, 4, 5, 6, 7, 8]
```

`apply` が配列を引数として展開してくれるおかげで、以下と同じようなことになるためです。

```
[].concat(nested[0], nested[1], nested[2]);
// -> [0, 1, 2, 3, 4, 5, 6, 7, 8]
```

[Concatenating an array of arrays in Coffeescript - Stack Overflow](http://stackoverflow.com/questions/4631525/concatenating-an-array-of-arrays-in-coffeescript) で知りました。これは便利。

Array を拡張するならこんな感じですね。

```js
Array.prototype.flatten = function() {
  return Array.prototype.concat.apply([], this);
};
```
mintty ターミナル上の vim で、モードに応じてカーソル形状を変える


（cygwin や mingw の）mintty ターミナル上の vim で、カーソル形状をモードによって次のように変えたい。

* 通常はブロック型点滅カーソル
* 挿入モード時はライン型点滅カーソル

# vimrc の設定

vimrc に次を追加すればよい。

```.vimrc
let &t_ti.="\e[1 q"
let &t_SI.="\e[5 q"
let &t_EI.="\e[1 q"
let &t_te.="\e[0 q"
```

（引用元 : http://code.google.com/p/mintty/wiki/Tips#Mode-dependent_cursor_in_vim ）

起動・終了時、モード切替時に、mintty の制御シーケンスを使ってカーソル形状を変えている。

# 参考：mintty の制御シーケンス

mintty でカーソル形状を変える制御シーケンスは以下のとおり。

* ESC [ 0 SP q ⇒ mintty のデフォルト設定
* ESC [ 1 SP q ⇒ ブロック型、点滅あり
* ESC [ 2 SP q ⇒ ブロック型、点滅なし
* ESC [ 3 SP q ⇒ 下線型、点滅あり
* ESC [ 4 SP q ⇒ 下線型、点滅なし
* ESC [ 5 SP q ⇒ ライン型、点滅あり
* ESC [ 6 SP q ⇒ ライン型、点滅なし

（参照 : http://code.google.com/p/mintty/wiki/CtrlSeqs#Cursor_style ）

この制御シーケンスは、VT510 ベースに mintty 独自拡張を追加した感じらしい。

# 余談

ちなみに、制御シーケンスをテキストファイルに記述するときに、vim で C-v C-[ と入力して ESC コード（表示上は ^[ になる）を直接埋め込んでいるのをよく見かける。

でも、上記の設定で ESC コードを "\e" と書いているように、普通のテキスト文字だけで記述できることが多い。

個人的には、テキストファイルに制御コードを埋め込むのは好きではないので、テキスト文字で記述できるときはなるべくそうしている。
シャドウを画像の内側にかけるCSS/jQuery


CSS3のbox-shadowを使うと、ドロップシャドウだけでなく内側のシャドウをかけることができます。ただ、次の例ように画像に適用しようとすると、ちょっとしたトリックが必要になります。

![内側シャドウ](http://cl.ly/image/2B3T3Y2Y401A/Image 2012.08.23 10:46:08.png)

例えば、このようなHTML(↓)に対して、

```html
<figure>
    <img class="inset-shadow"
        src="http://www.osscafe.net/images/164x164/shimokita-php.png" />
</figure>
```

次のようなスタイルを適用しても、内側にシャドウをかけることはできません。

```css
img.inset-shadow {
    border-radius:15px;
    box-shadow:inset 0 1px 5px rgba(0,0,0,.5);
}
```

これは、描画順で画像がシャドウの手前に来てしまうためです。

0. background
0. box-shadow
0. content (画像)

回避方法は、主に2つ。

* シャドウだけ別要素で描いて手前に表示する →CSSによる解決
* 画像の内容を背景に移してシャドウを有効にする →スクリプトによる解決

## CSSによる解決

画像をまずクロップして、::after疑似要素で影を重ねます。この例では、figure要素にしていますが、適用するHTML次第でa要素などでも構いません。

```css
figure {
    position:relative;
    display:inline-block;
    line-height:0;
    border-radius:15px;
    overflow:hidden;
}
figure::after {
    content:"";
    position:absolute;
    top:0; right:0; bottom:0; left:0;
    border-radius:15px;
    box-shadow:inset 0 1px 5px rgba(0,0,0,.5);
}
```

## スクリプトによる解決

span要素を新たに作り、背景画像に、img要素のsrc属性の画像を設定して、もともとあった画像要素と差替えます。

```coffee
$.fn.img2span = () ->
    $img = $ this
    $span = $ '<span />'
    $span.attr 'class', $img.attr 'class'
    $span.css
        display: 'inline-block'
        backgroundImage: "url(#{$img.attr('src')})"
        width: $img.width()
        height: $img.height()
    $img.before($span).remove()
    $span

$('img.inset-shadow').img2span()
```

cssで、span要素にもスタイルを適用しておけばOK。

```css
img.inset-shadow,
span.inset-shadow {
    border-radius:15px;
    box-shadow:inset 0 1px 5px rgba(0,0,0,.5);
}
```

## デモ
jsfiddleに置いておきます。

* http://jsfiddle.net/cognitom/QLTMe/
Node.jsでWake On LANコマンドを作る

モジュールnode_wake_on_lan を試してみた。
https://github.com/agnat/node_wake_on_lan

#インストール
$ npm install wake_on_lan

#例
```
var wol = require('wake_on_lan');
wol.wake('20:DE:20:DE:20:DE');
```

#準備
1) BIOS等で"Wake On LAN" を設定する
2) NICの "Wake On LAN" サポートを確認
3) 起こしたいマシンのMacアドレスを調べておく

#やってみる
下記のようなshebang付きnodeコードを書いてwol.jsとかの名前で保存し、実行権限を与える

```wol.js

#!/usr/bin/env node

var wol = require('wake_on_lan');

//起こしたいマシンのMacアドレスを調べてリストアップしておく
var lists = {
  '1': '80:ee:73:xx:xx:xx', //192.168.1.1
  '2': '80:ee:73:xx:xx:xx'  //192.168.1.2
  
};

//引数まわして起動
process.argv.forEach(function (val, index, array) {
  if(index < 2)return;
  wakeUp (val);
});

//マジックパケット送信
function wakeUp (val){
  var mac = lists[val];
  if(!mac){
    console.log(val + ' はリストにありません');
    return; 
  }
  console.log('処理中: ' + val + ': ' + mac);
  
  wol.wake(mac, function(error) {
    if (error) {
      console.log(error);
    } else {
      // done sending packets
      console.log('マジックパケットを送りました: ' + mac );
    }
  });
}
```

#do it !

```
hoge@myserver:~$ /home/hoge/wol.js 1
処理中: 1: 80:ee:73:xx:xx:xx
マジックパケットを送りました: 80:ee:73:xx:xx:xx
```

で、192.168.1.1が起動しました。
vmstatやiostatより便利そうなdstatをインストールしてみた


[reoring](http://qiita.com/users/reoring)さんの紹介で `dstat` がいいとのことでインストールしてみた。

インストール(Ubuntu)

```
$ sudo aptitude install dstat
```

Ubuntu 11.04だと簡単に入りました。

使い方

```
$ dstat
```

出力もカラフルでいいですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/889/a65a4cf7-7e84-b8f6-7605-ccbd5cf350b5.png)

アプリケーションに対して CPU パワーが不足気味だな…
hubot で utf-8 以外のページも取得していろいろしたい

まず request を使いましょう。 jsdom で楽をしようなどとは思ってはいけません。
jsdom も内部で request を使っていますが結果的に utf8 決め打ちになります。死にます。

```coffeescript
request = require('request')
iconv = require('iconv-jp')

module.exports = (robot) ->
  robot.hear /https?:\/\/\S+/i, (msg) ->
    url = msg.match[0]

    # encoding に null を渡すと body を buffer のままで返してくれる
    request.get url: url, encoding: null, (error, response, body) ->

      if 200 <= response?.statusCode < 300

        # 適当に charset をぶっこぬく
        charset = response.headers['content-type']?.match(/charset=([\w\-]+)/)?[1]
        charset = body.toString('binary').match(/charset="?([\w\-]+)"?/)?[1] unless charset?

        # utf-8 じゃなかったら iconv で変換
        if charset? && !charset.match(/utf-?8/i)
          converter = new iconv.Iconv(charset, 'UTF-8//IGNORE')
          body = converter.convert(body)

        body = body.toString()

        # なにかする
```

なんかたまに response が null で返ってきたりしてよくわかりませんね。
PHPでシンプルなRSS writerを作ってみた


既にこういうのあるんだろうけど、探すより作るほうが早いので作ってみました。

https://github.com/suin/php-rss-writer

```php
<?php
$feed = new Feed();

$channel = new Channel();
$channel
    ->title("Channel Title")
    ->description("Channel Description")
    ->url('http://blog.example.com')
    ->appendTo($feed);

$item = new Item();
$item
    ->title("Blog Entry Title")
    ->description("<div>Blog body</div>")
    ->url('http://blog.example.com/2012/08/21/blog-entry/')
    ->appendTo($channel);


echo $feed;
```

って書くと

```
<?xml version="1.0"?>
<rss version="2.0">
  <channel>
    <title>Channel Title</title>
    <link>http://blog.example.com</link>
    <description>Channel Description</description>
    <item>
      <title>Blog Entry Title</title>
      <link>http://blog.example.com/2012/08/21/blog-entry/</link>
      <description>&lt;div&gt;Blog body&lt;/div&gt;</description>
    </item>
  </channel>
</rss>
```

って出る
Docpad入れてみた (作業ログ)

DocpadはNode.js上で動く静的コンテンツジェネレータである。
http://tomohisaoda.com/posts/2012/using_docpad.html では「JekyllのNode版」と書かれている。

とりあえずインストール。

```
$ npm install -g docpad
```

とりあえず起動してみる。

```
/tmp/foo % docpad run
...
  : notice: There is a new version of docpad available, you should probably upgrade...
```

え、今入れたばかりなのに最新版でないとは。

https://github.com/bevry/docpad を見ると、なんかバージョンを指定しないといけないらしい。なんなんだろう。

```
/tmp/foo % npm install -g -f docpad@6.5
npm ERR! Unsupported
npm ERR! Not compatible with your version of node/npm: docpad@6.5.6
npm ERR! Required: {"node":">=0.6.0","npm":">=1.1.0"}
npm ERR! Actual:   {"npm":"1.0.106","node":"0.6.18"}
```

npmが古いのか。ふーむ。

これで上がってくれるかなぁ。

```
/tmp/foo % curl https://npmjs.org/install.sh |sh
```

うまくいった模様。docpad 6.5を再度インストール。

空ディレクトリを作ってdocpad runしてみる。サンプルのテンプレートを使うかどうか聞かれる。

```
Which skeleton will you use?
  1) HTML5 Boilerplate
  2) Twitter Bootstrap
  3) Kitchensink
  4) Website
  5) Hogan
  6) SlidePad
  7) No Skeleton
```

3のKitchensinkは http://docpad-kitchensink.herokuapp.com/ にデモがある。
とりあえず4を選択したら、スーパーインストールタイムに。ちょっとこれ時間かかりすぎじゃね…？回線が細いのもあるけどさぁ。

じっと待つとこんなんが出た。

http://gyazo.com/66a271b8de9590040e078a3ba5041e78.png

## ディレクトリ構成

out/以下に生成されたHTML・CSS・画像などが出力されるみたいだ。

でsrc/以下がソース。7のNo skeltonを選ぶと、src/以下にdocuments/ files/ layouts/という3つの空ディレクトリができる。4のWebsiteではもうひとつ、partials/というディレクトリがある。

layoutとpartialはRailsのやつとだいたい同じ意味かな？files以下にはjsと画像が入っている。favicon, robots.txtとかも。

## 1 HTML5 Boilerplate

こんなんができた。

http://gyazo.com/3bb4be6272bd0135c670c1136e35cecf.png

## 記事は何で書くの？

https://github.com/bevry/docpad/wiki/Plugins まあmarkdownだろうなぁ。
CrashlyticsとTestFlightを共存させる

Crashlytics(https://www.crashlytics.com) とTestFlight(https://testflightapp.com/) を同時に使っている際、Crashlyticsがクラッシュレポートを送信しない不具合に遭遇しました。

## 再現例

```AppDelegate.m
[Crashlytics startWithAPIKey:CrashlyticsAPIKey]; 
[TestFlight setDeviceIdentifier:[[UIDevice currentDevice] uniqueIdentifier]]; 
[TestFlight takeOff:TestFlightTeamToken]; 
```

そこで、Crashlyticsの中の人にこの不具合について伺ったところ、解決策を教えていただきました。
## 解決策

```AppDelegate.m
[TestFlight setDeviceIdentifier:[[UIDevice currentDevice] uniqueIdentifier]]; 
[TestFlight takeOff:TestFlightTeamToken]; 
[Crashlytics startWithAPIKey:CrashlyticsAPIKey]; 
```

実行する順番を変更したら解決しました。
KobitoのデータをDropbox経由で複数端末で共有する


## オリジナルの端末で
```
$ mv ~/Library/Kobito/Kobito.db ~/Dropbox/dotfiles/                                                                                                                                                                                                                                     
$ ln -s ~/Dropbox/dotfiles/Kobito.db ~/Library/Kobito/Kobito.db
```

## 新規の端末で
Kobitoを一度起動してログイン後、終了する。

```
$ rm ~/Library/Kobito/Kobito.db                                                                   $ ln -s ~/Dropbox/dotfiles/Kobito.db ~/Library/Kobito/Kobito.db
```

Kobitoが標準でやって欲しい気もするけど、プライベートなメモを軽々しく書けるのが担保されていると嬉しいなあ。
Amazon EC2上でChromium for Androidをビルドする


おおまかには http://code.google.com/p/chromium/wiki/AndroidBuildInstructions ここに記載されてる手順に従うのだけど、わけあってAmazon EC2上のインスタンスでビルドしたので誰かの参考になればと。ただし、2012/08/22時点ではまだブラウザ本体のビルドに必要なコードが公開されておらず、生成されるapkはユニットテスト用のもの。本体ソースはよ。
**→その後、某先生から指摘を頂き どうやらその後ツールセット更新、コード公開などありChromium本体をビルド出来るようになっていたようなので(&不足パッケージ指摘も頂いた)2013/02/13に手順更新しました。**

## 前準備: インスタンス立ち上げ
Ubuntuでは、なんと公式のEC2用AMIを用意しているので、 http://cloud-images.ubuntu.com/releases/precise/release/ にあるUbuntuの公式イメージからインスタンスを生成(生成したいリージョンを選んでリンククリック)。
今回の構成は

 * US-Westリージョン(SVNで大量のファイルを拾ってくるので、どうせならネットワークレイテンシの低そうなところにしてみた。Tokyoでもok)
 * ami-db86a39e
 * Largeインスタンス
 * rootボリュームサイズ=60GiB

とした。

## 必要なパッケージのインストール

>$ sudo apt-get update
$ sudo apt-get upgrade

一応12.04リリース以降の変更を取り込み、その後ごっそり依存ライブラリを突っ込む。

>$ sudo apt-get install git-core subversion libgtk2.0-dev libc6-dev-i386 libgconf2-dev libgnome-keyring-dev libdbus-glib-1-dev libudev-dev gperf bison libpci-dev g++-multilib

それから、後で詰まないようにsun-java6-jre sun-java6-bin sun-java6-jdkをなんとかしてインストール( http://www.gaggl.com/2012/04/installing-java6-jdk-on-ubuntu-12-04/ こういう方法とかがあるらしい)しておく。
あと、antの1.8がUbuntu12.04では用意されてないので10.04のものを拾ってきてインストールしておく。

>$ wget http://mirror.pnl.gov/ubuntu//pool/main/a/ant1.8/ant1.8_1.8.0-4ubuntu1_all.deb
$ wget http://mirror.pnl.gov/ubuntu//pool/main/a/ant1.8/ant1.8-optional_1.8.0-4ubuntu1_all.deb
$ sudo dpkg -i ant1.8_1.8.0-4ubuntu1_all.deb ant1.8-optional_1.8.0-4ubuntu1_all.deb

## Chromiumのソースコードをダウンロード
基本的に、前の段階で必要なもの(ant1.8とかsun-java-*とか)をインストールしていれば

 * http://dev.chromium.org/developers/how-tos/get-the-code
 * http://dev.chromium.org/developers/how-tos/install-depot-tools

の手順通り。具体的には

>$ cd ~ && mkdir Chromium && cd Chromium && git clone https://git.chromium.org/chromium/tools/depot_tools.git && export PATH="$PATH":\`pwd\`/depot_tools && gclient config https://src.chromium.org/chrome/trunk/src && echo "target_os = ['android']" >> .gclient

これでソース取得用の設定作成。丸ごと1行コピペでok。続いて

>$ gclient sync --nohooks && export GYP_GENERATORS=ninja && . ./src/build/android/envsetup.sh && gclient runhooks

でソース取得と前処理(GYP_GENERATORS環境変数は.bash_profileなどに予め書いておいても良いかもしれません)。

>$ cd src/build/ && sudo ./install-build-deps-android.sh

でAndroid関連のビルドに必要なパッケージを追加取得。

## ビルド
ここまでやったら

>$ cd ~/Chromium/src && android_gyp && ninja -C out/Release -j6 content_shell_apk

でok(並列度をどれくらいにするかは、インスタンスによって変更)。Largeインスタンスで、ソース取得から現状でのapk完成まで4時間ぐらいだったかな。結構かかるのでもっと高グレードのインスタンスを使ったほうが良いかもしれません。

>ubuntu@ip-xx-xxx-xx-xxx:~/Chromium/src/out$ find . -name '*.apk' | xargs ls -l
-rw-rw-r-- 1 ubuntu ubuntu   361622 Aug 22 13:11 ./Debug/ipc_tests_apk/ipc_tests-debug.apk
-rw-rw-r-- 1 ubuntu ubuntu   361621 Aug 22 13:11 ./Debug/ipc_tests_apk/ipc_tests-debug-unaligned.apk
-rw-rw-r-- 1 ubuntu ubuntu    10637 Aug 22 13:11 ./Debug/replaceme_apk/replaceme-debug.apk
-rw-rw-r-- 1 ubuntu ubuntu    10636 Aug 22 13:11 ./Debug/replaceme_apk/replaceme-debug-unaligned.apk
-rw-rw-r-- 1 ubuntu ubuntu 16286294 Feb 13 06:14 ./Release/apks/ContentShell.apk
-rw-rw-r-- 1 ubuntu ubuntu 16286277 Feb 13 06:14 ./Release/apks/ContentShell-unaligned.apk
-rw-rw-r-- 1 ubuntu ubuntu 16283376 Feb 13 06:14 ./Release/apks/ContentShell-unsigned.apk

出来てますね! あとはadbで普通にインストールすればokです。