OmniAICreator/Qiita-1.07M huggingface dataset:
Webサイトのパフォーマンス改善に使えるソフトウェア/サービスまとめ

もっといいのがあればご教授ください。

# Detail Performance Inspection

* [Yahoo! YSlow for Chrome](http://developer.yahoo.com/yslow/)
	* YSlow analyzes web pages and suggests ways to improve their performance based on a set of rules for high performance web pages.

* [GTmetrix](http://gtmetrix.com/)
	* Website Speed and Performance Optimization 

* [Pingdom Website monitoring.](https://www.pingdom.com/)
	* Can check css/javascript/image file download speed easily.

# File size & performance optimization

* [Closure Tools](https://developers.google.com/closure/compiler/?hl=ja)
	* Can optimize JavaScript code and make it faster.

* [CSS Sprite Generator | Project Fondue](http://ja.spritegen.website-performance.org/)
	* Support making of CSS sprite image.

* [ImageOptim](http://imageoptim.com/)
	* make websites and apps load faster (Mac app)

# Test

* [Selenium WebDriver](http://seleniumhq.org/docs/03_webdriver.jsp)
	* Automated test support

* [Apache Bench](http://httpd.apache.org/docs/2.2/programs/ab.html)
	* HTTP server benchmarking tool
今週の月曜日、先週の月曜日、来週の月曜日を取得する

# 今週の月曜日、先週の月曜日、来週の月曜日を取得する

## Ruby メソッドを使う
### コード
```ruby:
this_day = Date.today
this_monday = this_day - (this_day.wday - 1) # 今週の月曜日
last_monday = (this_day - (this_day.wday - 1)) - 7 # 先週の月曜日
``` 
### 実行結果
```ruby:
[1] pry(main)> this_day = Date.today
=> Thu, 10 Jan 2013
[2] pry(main)> this_monday = this_day - (this_day.wday - 1)
=> Mon, 07 Jan 2013
[3] pry(main)> last_monday = (this_day - (this_day.wday - 1)) - 7
=> Mon, 31 Dec 2012
```  

## Rails active_support のメソッドを使う
### コード
```ruby:
Date.today.beginning_of_week # 今週の月曜日
(Date.today - 1.week).beginning_of_week # 先週の月曜日
# Date.todayではなく、Time.nowでもOK
``` 
### 実行結果
```ruby:
[1] pry(main)> Date.today
=> Thu, 10 Jan 2013
[2] pry(main)> Date.today.beginning_of_week
=> Mon, 07 Jan 2013
[3] pry(main)> Date.today.beginning_of_week - 1.week
=> Mon, 31 Dec 2012
``` 

### active_support 追記

#### prev_weekメソッド

+ Rails v3.1.0 以降ならprev_week メソッドが便利。
　http://apidock.com/rails/Date/prev_week

##### コード
```ruby:prev_week
0.days.ago.prev_week # 先週の月曜日
0.days.ago.prev_week(:sunday) # 先週の日曜日
0.days.ago.prev_week(:friday) # 先週の金曜日
``` 
##### 実行結果
```ruby:
[1] pry(main)> 0.days.ago.prev_week
=> 2012-12-31 00:00:00 +0900
[2] pry(main)> 0.days.ago.prev_week(:sunday)
=> 2013-01-06 00:00:00 +0900
[3] pry(main)> 0.days.ago.prev_week(:friday)
=> 2013-01-04 00:00:00 +0900
``` 

#### next_weekメソッド(来週を取得したい！)

+ next_week メソッドの安定版はRails v3.0.0 以降で使える。
　http://apidock.com/rails/Date/next_week

##### コード
```ruby:next_week
0.days.ago.next_week # 来週の月曜日
0.days.ago.next_week(:sunday) # 来週の日曜日
0.days.ago.next_week(:friday) # 来週の金曜日
``` 
##### 実行結果
```ruby:
[1] pry(main)> 0.days.ago.next_week
=> Mon, 14 Jan 2013 00:00:00 JST +09:00
[2] pry(main)> 0.days.ago.next_week(:sunday)
=> Sun, 20 Jan 2013 00:00:00 JST +09:00
[3] pry(main)> 0.days.ago.next_week(:friday)
=> Fri, 18 Jan 2013 00:00:00 JST +09:00
```
Redmine 2.2.0 (ruby 1.9.3p362) rakeでエラー

## エラー内容
rake実行時に下記のエラーとなる。

````
# rake generate_secret_token
/usr/local/lib/ruby/1.9.1/yaml.rb:56:in `<top (required)>':
It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby
````

## 解決手順
* yamlをインストールする。

````
# wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
# tar zxvf yaml-0.1.4.tar.gz
# cd yaml-0.1.4
# ./configure
# make
# make install
````

* rubyを再インストールする。

````
# cd ruby-1.9.3-p362
# ./configure --disable-install-doc
# make
# make install
````
この後、rakeの再実施で正常にrakeが行われた。

## 環境
* CentOS release 6.3 (Final)
* ruby 1.9.3p362 (2012-12-25) [x86_64-linux] 
* gem 1.8.23
* Rails 3.2.9
* Redmine 2.2.0
複数の Key を持つ Dictionary

TKey を Tuple<> にしてあげればいい。
ついでにこんなクラスを書いてみた。

```csharp:Dictionary.cs
public Dictionary<TKey1, TKey2, TValue>
    : Dictionary<Tuple<TKey1, TKey2>, TValue>
{
    public TValue this[TKey1 key1, TKey2 key2]
    {
        get { return this[Tuple.Create(key1, key2)]; }
        set { this[Tuple.Create(key1, key2)] = value; }
    }
}
```
Phusion Passengerのログローテート設定


ミドルウェアにPassengerを利用してRailsアプリをホストしている場合、ログのサイズには要注意。いや、これはあらゆるログそうなんですけど、そのまま放置するとproduction.logが無限に増大するなんてアレな感じになる。そこで通常のログと同様logrotateを利用するのは同様なのだけど、`postrotate` で `touch restart.txt` するのがポイント。

こんな感じ。

```config
# /etc/logrotate.d/passenger.log
/path/to/app/shared/log/*log {
  notifempty
  daily
  missingok
  rotate 3650
  compress
  delaycompress
  sharedscripts
  create 0644 apache-user apache-group
  dateext
  postrotate
    touch /path/to/app/current/tmp/restart.txt
  endscript
}
```

rotateアノテーションを忘れるとログが消えちゃうので注意。`/path/to/app` の辺りは当然ながらアプリケーションのパスに書き換えること。
CarrierWaveを使ってファイルアップロード


```ruby:Gemfile
gem 'Carrierwave'
```
```bash:
bundle install
```

日本語のファイル名が____に置き換わってしまうのを防ぐために、以下の記述を追加する。

```ruby:/config/initializers/carrierwave.rb
CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/
```

参考

- https://github.com/jnicklas/carrierwave
公式です。

- [CarrierWave - がむしゃらにコードを書き続けるBlog](http://f96q.github.com/blog/2012/08/02/carrierwave/)
日本語のファイル名が____に置き換わってしまうのを防ぐために

- [Railsでcarrierwaveを使って画像ファイルのアップロード](http://www.geekzshu.com/rails/1587)

- [file_column から CarrierWave へ (基本編) - 篳篥日記 ](http://d.hatena.ne.jp/hichiriki/20111129/1322553926)
丁寧な解説でわかり易かった。もっと、しっかり読んでみたい
Elastic Load Balancerの配下にApacheをぶら下げたときのログ設定


Apacheに限らずですが、ELBを通すとApacheへのアクセスにアクセス元ではなく、ELBのアドレスが記録されてしまいます。

でも、ELBからのApacheへのアクセス時はX-Forwarded-Forヘッダにアクセス元のIPが記録されるため以下のようにしてやることで記録が可能。

```config:httpd-vhost.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i" elb-combined
CustomLog "/path/to/shared/log/access.log" elb-combined
```

* X-Forwarded-For: 接続元IP
* X-Forwarded-Proto: 接続元メソッド (ELBがSSL Terminatorになっている場合はhttps / 通常はhttp)

ログフォーマットは適当にカスタマイズしてやるといいです。後はログをfluentd等に突っ込んでおけば解析も簡単ですね。
Macでcalibreのコマンドラインツールを使う


Macでcalibreのコマンドラインツールを使うには、設定→その他→コマンドラインツールをインストールをクリックする。
すると/usr/binに/Applications/calibre.app/Contents/console.app/Contents/MacOS/以下のコマンドラインツールへのシンボリックリンクが張られる。

calibreのコマンドラインツールについては以下が参考になるだろうか。
http://d.hatena.ne.jp/toton/20110310/1299740105
http://d.hatena.ne.jp/propella/20100219/p1
JSON解析、出力をJavaでやるならこうやりたい

JSONに限らず、XML、あるいはその他オブジェクトの変換を行う際の
設計を考えました。

Play framework ScalaのJSONの変換APIが気持ち良すぎるので、その真似
とかを少し含みます。

まず、JSONに変換するインターフェース

```java:JsonWriter.java
public interface JsonWriter {
	public String write();
}
```

そして、JSONから変換するインターフェース

```java:JsonReader.java
public interface JsonReader<T> {
	T toObject(String json);
}
```

2つのインターフェースを実装したJSONに、JSONから変換可能なクラス。
今回は、自分のプロフィール用クラスとしてサンプルを用意。

```java:Profile.java
public class Profile implements JsonWriter, JsonReader<Profile> {
	private String name;
	private int age;

	public Profile() {
	}

	public Profile(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	/** JSON文字列を返すよ */
	@Override
	public String write() {
		return String.format("{\"name\":\"%s\",\"age\":%d}", name, age);
	}

	@Override
	public Profile toObject(String json) {
		// TODO:本当はここでJSONをパースする
		return new Profile("numa08", 24);
	}
}
```

あと、JSONからオブジェクトに変換する際のラッパークラス

```java:Json.java
public class Json<T> {
	public static <T> T toObject(JsonReader<T> reader, String json) {
		return reader.toObject(json);
	}
}
```

最後に今回の呼び出し元


```java:JsonConverterMain.java
public class JsonConverterMain {
	public static void main(String[] args) {
		Profile numa08 = new Profile("numa08", 24);
		output(numa08);

		final String json = "{\"numa\":\"numa08\",\"age\":\"24\"}";
		Profile me = Json.toObject(new Profile(), json);
		output(me);
	}

	public static void output(JsonWriter wrriter) {
		System.out.println(wrriter.write());
	}
}
```

見通しは悪くないんじゃないかと思ってます。
テストも、変換の実装自体は``Profile.java``にあるのでやりやすいのかなぁ。

もうちょっと規模が大きくなってくると、``JsonReader``の実装を別のクラスに分ける
かもしれませんが。

``implicit``が使えるのって本当に気持ちいいなぁ（白目
JavaScriptで文字数を削り、削った場合は末尾に"…"を付ける


```javascript
var hoge = "あいうえおかきくけこさしすせそたちつてと"

if (hoge.length > 10) {
  hoge = hoge.substring(0, 9) + "…";
}

```

```結果
あいうえおかきくけ…
```

毎回どこかからコピペしてるので、整理＆スニペット化。
こういうの、一杯あるなぁ…
(forkした)プロセスにオブジェクトを渡す方法


Marshalを使ってシリアライズしてパイプを使って渡す。
forkじゃなくて普通にプロセス間でやるときはunix domain socketなりnamed pipeなり使えば良いのかな…。試してないけど。

```ruby:
class Test
  attr_accessor :val
end

dump_obj = Test.new
dump_obj.val = 'test val'

read, write = IO.pipe
Marshal.dump(dump_obj, write)
write.close

pid = fork do
  load_obj = Marshal.load(read)
  p load_obj.val
  read.close
end

read.close
Process.waitpid(pid)
puts 'exit'
```
Ruby向けAutopagerizeをMechanizeで使えるようにした

autopagerize-rubのclientをMechanizeにしてみた。
ソースはこちら。
https://github.com/chezou/autopagerize-ruby/tree/mechanized

ぶっちゃけ、httpclientの方が軽くて高速だとは思うけど、robots.txtやその周りのMeta-tagをハンドリングするのにはMechanizeの方が良いと思ってやった。

少し気になるのが、gemspecのauthor周り。
人のコードをforkしたときに、gemspecってどうやって書けばいいのだろう？今回は特にオリジナルとは別路線でいくコードだし。
まぁ、[Treasuredataのtd-logger-ruby](https://github.com/treasure-data/td-logger-ruby)でもオリジナルのgemspecのままっぽいしいいか。

エラーハンドリングとかは結構適当かもしれません。

こんな適当な投稿がQiita初投稿とは、、、。
半端にrobots.txtを守らないといけない企業の方とか使ってください。
末端までスクロールした時になにかをしたい。 


#末端までスクロールした時にscroll_callbackをする
* scroll_callbackに実行したい関数を代入する
* scroll_callbackに、nullを代入すると止まる。

##参考
* http://archiva.jp/web/javascript/get_page-size.html
* http://satussy.blogspot.jp/2011/11/blog-post_25.html

```js
var isWin9X = (navigator.appVersion.toLowerCase().indexOf('windows 98')+1);
var isIE = (navigator.appName.toLowerCase().indexOf('internet explorer')+1?1:0);
var isOpera = (navigator.userAgent.toLowerCase().indexOf('opera')+1?1:0);
if (isOpera) isIE = false;
var isSafari = (navigator.appVersion.toLowerCase().indexOf('safari')+1?1:0);

function getScrollPositionY() {
  return document.documentElement.scrollTop || document.body.scrollTop;
}

function getScrollSizeY() {
  return document.documentElement.scrollHeight || document.body.scrollHeight;
}

function getScreenSizeY() {
  var y = new Object();
  if (!isSafari && !isOpera) {
    y = document.documentElement.clientHeight || document.body.clientHeight || document.body.scrollHeight;
  } else {
    y = window.innerHeight;
  }
  return y;
}

//上書きする
var scroll_callback = null;

//イベントリスナー
var scroll_timer;  
 window.addEventListener("scroll", function(){
 clearTimeout(scroll_timer);  
 scroll_timer = setTimeout(function(){  
 if(scroll_callback!=null){
   if( (getScrollSizeY() - getScrollPositionY() - getScreenSizeY()) < 50 ){
    scroll_callback();
   }
  }
 }, 500);  
});
```
Xcodeのファイルテンプレートを自作する

Xcodeでクラスファイルを新規作成した後、毎回同じようなコードを書いていて面倒だなと感じることがあります。たとえば、

- UIViewControllerを継承したクラスにカスタムセルのUITableViewを持たせる
- NSObjectを継承したクラスをシングルトンにする

といった実装はアプリ開発ではよくありますが、手順は大体毎回同じです。

こういった実装をファイルテンプレート化しておけば、クラスファイルの新規作成時にそのコードが生成されるので、何度も同じコードを書く手間が省けとても便利です。

以下に、NSObjectを継承したシングルトンクラスのファイルテンプレートを例にとり、作成手順を説明していきます。


##1. デフォルトテンプレートをコピーしてくる

**デフォルトテンプレート** はXcode.appのパッケージの中身をたどって行った先にあります。

```sh

open /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File\ Templates/
```

`~/Library/Developer/Xcode/Templates` が**カスタムファイルテンプレートの置き場**となります。

```sh
# 上記フォルダがなければ、作成してください
mkdir ~/Library/Developer/Xcode/Templates
```

**デフォルトテンプレート** から Cocoa Touchフォルダを **カスタムファイルテンプレートの置き場** へコピーします。
その際に、フォルダ名を"My Cocoa Touch"にリネームします。

```sh
cp -r /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File\ Templates/Source/Cocoa\ Class.xctemplate ~/Library/Developer/Xcode/Templates/My\ Cocoa\ Touch.xctemplate
```

##2. Xcodeで試しに開く

ここで、試しにXcodeから新規ファイル作成画面を開いてみてください。テンプレートの選択肢に、コピーしてきてリネームしたフォルダ名が入っていることが確認できます。表示されない場合には、Xcodeを再起動してみてください。

※以下、フォルダ名をMy Cocoa Touchにリネームしたものとして説明します。


##3. TemplateInfo.plistを編集する
My Cocoa Touch/Objective-C class.xctemplateフォルダ配下に、"TemplateInfo.plist"というファイルがあります。

このファイルをXcodeやテキストエディタ等で開き、"Options"という要素に次の項目を**追加**します。

````TemplateInfo.plist
<dict>
	<key>Default</key>
	<string>false</string>
	<key>Identifier</key>
	<string>Singleton</string>
	<key>Name</key>
	<string>Singleton</string>
	<key>RequiredOptions</key>
	<dict>
		<key>cocoaTouchSubclass</key>
		<array>
			<string>NSObject</string>
		</array>
	</dict>
	<key>Type</key>
	<string>checkbox</string>
</dict>
````

Xcodeから新規ファイル作成 > My Cocoa Touch > Objective-Cを選択 > Nextと進み、SubclassにNSObjectを選ぶとSingletonというチェックボックスが有効になることが確認できます。


##4. テンプレート用クラスファイルを作成する
TemplateInfo.plistと同階層にある"NSObject"というフォルダを複製して、"NSObjectSingleton"というフォルダ名にリネームします。

このフォルダ名は、手順2でTemplateInfo.plistに追記した項目のうち、Identifierと、RequiredOptionsに関係しています。

RequiredOptionsに指定してあるNSObjectをクラス生成時に親クラスとして指定し、Singletonのチェックボックスにチェックを入れると、{cocoaTouchSubclass名}+{チェックボックス項目のIdentifier}、すなわち"NSObjectSingleton"という名前がついたフォルダにあるテンプレートファイルを参照するようになります。

##5. テンプレート用クラスファイルを編集する

次に、NSObjectSingletonフォルダ配下にある、"\_\_\_FILEBASENAME\_\_\_.h"と、"\_\_\_FILEBASENAME\_\_\_.m"を編集します。

````___FILEBASENAME___.h
___IMPORTHEADER_cocoaTouchSubclass___

@interface ___FILEBASENAMEASIDENTIFIER___ : ___VARIABLE_cocoaTouchSubclass___

+ (id)sharedInstance;

@end
````




````___FILEBASENAME___.m
#import "___FILEBASENAME___.h"
    
@implementation ___FILEBASENAMEASIDENTIFIER___

static id instance = nil;

+ (id)sharedInstance {
    @synchronized(self) {
        if (!instance) {
            instance = [[self alloc] init];
        }
    }
    return instance;
}

@end
````

以上でNSObjectSingletonテンプレートは完成です。
型変換するとインデックスがきかなくなる

mysqlでのみ検証。
例えばcreated_at（datetime型）にインデックスがはってある場合、
こういうSQLだとヒントを使用してもインデックスが利かない。

```sql
SELECT
  *
FROM
  table
WHERE
  DATE(created_at) > CURRENT_DATE + INTERVAL -100 DAY
```

これなら有効になる。

```sql
SELECT
  *
FROM
  table
WHERE
  created_at > CURRENT_DATE + INTERVAL -2400 HOUR
```
iOS6でクライアントサイドオンリーでカメラロールの画像を扱う

# 背景
iOS6になりinputタグのtype=fileの指定が可能になった。
これにより、iPhoneから写真のアップロードが非ネイティブアプリで
可能になった。

しかし、サーバーにファイルをアップロードする分には問題ないのだが、
とはいえ、カメラロールの写真のサイズはそれなりにデカい。
クライアントサイドで扱えないか？
となるわけですが、カメラロールの写真のサイズはMobile Safariで
扱える画像サイズを遥かに超えており、困った。

# 何とかしてみた
サーバーにアップロードできるんだから、
内部的には、あるていど画像データを扱えているのだろう？
何か方法は無いものかと途方に暮れいた2012年。。

## ローカルファイルをバイナリーデータとして読み込めることを知る
先日、File APIでDataURLとして読み込まず、素のバイナリーに近い
形で扱える。FileReader#readAsBinaryStringなるメソッドを
Google DriveのAPIをJavaScriptで叩こうとしていた際に知った。
さらに調べると、バイナリ配列として扱える
FileReader#readAsArrayBuffer
があった！

ニヤリ。

## JPEGデコーダはやっぱりあるし。
今回は[jpgjs](https://github.com/notmasteryet/jpgjs)を使用。
撮影時の回転情報を反映してくれないが、それはおいおい。

## これらをまとめると

``` js
var item = document.getElementById('picInput').files[0];
var reader = new FileReader();
reader.onload = function (e) {
    var j = new JpegImage();
    var buffer = new Uint8Array(reader.result);
    j.parse(buffer);

    var c = document.getElementById("filterdImage");
    // 算数苦手なので、10分の1にとりあえず指定して、画像サイズを小さくする。
    c.width = j.width / 10;
    c.height = j.height / 10;
    var ctx = c.getContext("2d");
    var d = ctx.getImageData(0, 0, j.width / 10, j.height / 10);
    j.copyToImageData(d);
    ctx.putImageData(d, 0, 0);
};
reader.readAsArrayBuffer(item);
```

# サンプルはJsdo.itに
[iOS6で扱える画像サイズの制約をかわせるかの実験](http://jsdo.it/kjunichi/x4cD)

[2013年今年もよろしくお願いします](http://kjunichi.cocolog-nifty.com/misc/2013/01/2013-f5dd.html)。

## 追記（2014/9/24）

iOS8では、jpgjsでqt[i]が未定義とエラーが出て動かないようです。

# 関連投稿

- [iOS8のSafariでフォトライブラリの画像データにアクセスできた！ - Qiita](http://qiita.com/kjunichi/items/8c012fc40fe33fcf6b4c)
 

# 関連記事

- [非アプリでiPhoneのカメラロールの写真を扱う](http://kjunichi.cocolog-nifty.com/misc/2013/01/iphone-c66e.html)
Custom MVC using pure autoload

The code:

    function __autoload($class) {
    if(file_exists('models/' . $class . '_model.php')) {
    require_once('models/' . $class . '_model.php');
    }
    }

Inside your class you write class (model) which instantiates the other two hings - controller and the view by doing a require within \$class_model.php; .. this way, someone just has to browse your models to understand what you're trying to do
Eclipse(indigo)にMarketPlaceを追加

eclipseはindigoを使っているが，MarketPlaceが入っていないことに気がついた．

1. Help > Install New Software
2. Work with : Indigo - http://download.eclipse.org/releases/indigo
3. General Purpose Toolsの中のMarketplace Clientをインストール

これでHelpにEclipse Marketplaceが追加される．
ここからFindBugs Eclipse Pluginとか入れましょう．
Linuxのパッケージマネージャで入ったファイル一覧確認方法（yum, apt-get, pacman編）

こんなのが見えて嬉しい.

``````````````bash
$ sudo rpm -ql autojump
/etc/profile.d/autojump.bash
/etc/profile.d/autojump.sh
/usr/bin/autojump
/usr/bin/autojump.py
/usr/bin/jumpapplet
/usr/share/autojump
/usr/share/autojump/icon.png
/usr/share/doc/autojump-21.1.2
/usr/share/doc/autojump-21.1.2/AUTHORS
/usr/share/doc/autojump-21.1.2/LICENSE
/usr/share/doc/autojump-21.1.2/README.md
/usr/share/man/man1/autojump.1.gz
``````````````

### ArchLinux -- pacman

    $ pacman -Ql [package_name]

### Redhat -- yumで入れたものに対してrpmで調べる

    $ rpm -ql [package_name]

### Ubuntu(Debian) -- apt-getで入れたものに対してdpkgで調べる

    $ dpkg -L [package_name]
iOSシュミレーターのアプリなどを一気に消す方法


メニューバー > コンテンツと設定をリセット > リセット

![画像](http://farm9.staticflickr.com/8494/8363547536_d0478a5603.jpg)

[@Hiratti41](http://twitter.com/Hiratti41)に教えてもらった。アプリが増えて鬱陶しくなった時に便利！
map内のvalueソート

```java
private List<Map.Entry> valueSort(Map<Integer, Integer> tAsMap2) {

List<Map.Entry> entries = new ArrayList<Map.Entry>(tAsMap2.entrySet());
Collections.sort(entries, new Comparator(){
public int compare(Object o1, Object o2){
Map.Entry e1 =(Map.Entry)o1;
Map.Entry e2 =(Map.Entry)o2;
return ((Integer)e2.getValue()).compareTo((Integer)e1.getValue());//降順
//return ((Integer)e1.getValue()).compareTo((Integer)e2.getValue());//昇順
}
});
return entries;
}
```
正規分布発生 メモ


```
Random rand = new Random(777); // インスタンス生成時　　777＝多分シード
for (j = 0; j < NUMBER; j++) {
			//System.out.println("rand.nextDouble():"+rand.nextDouble());
			System.out.println("rand.nextGaussian():"+rand.nextGaussian());
//k=(int) (rand.nextDouble()*20);
k=(int) (rand.nextGaussian() +4);//正規分布　平均０+4　標準偏差１ 
//http://docs.oracle.com/javase/jp/6/api/java/util/Random.html

System.out.println("k:"+k);
f[k] = f[k] + 1;//頻度カウント
}
```
Jenkins1.498に更新するとSlaveの接続でこける問題

セキュリティ問題が見つかったため1.498への更新が薦められていますが、これまで問題なく接続できていたSlaveがこけるようになっています。

原因は下記でも言及されているようにAnonymousユーザでのSlaveの接続権限が要求されるように変更になったからのようです。

* [ブログズミ: Jenkins 1.498 に更新したときのメモ](http://srz-zumix.blogspot.hk/2013/01/jenkins-1498.html)

これまでログイン済みユーザにのみ権限を付与していましたが、これだとAnonymousに一切の権限がないためSlaveが使えません。
解決策としては「行列による権限設定」を選択し、AnonymousユーザにSlave周りの権限を付与。さらに"authenticated"グループに対して全権限を付与するとこれまで通りの「ログイン済みユーザは全権限を持つ」が実現できます。

![Jenkinsでの設定例](https://raw.github.com/tune/qiita_images/master/JenkinsSlaveConnection/JenkinsSlaveConnection.png)
MacでFinderから見えないファイルやフォルダを作る方法

~/Mailとか~/binとか~/shareとかをFinder上で表示させたくなかったのだが、それが[MacWikiにあった「SetFile -a V フォルダ名」というコマンドで実現できる][1]ことが分かった。

  [1]: http://macwiki.sourceforge.jp/wiki/index.php/OSX%E3%81%AE%E5%9B%BA%E6%9C%89%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89#-a_attributes

    h12o@Exegesis:~$ SetFile -a V "${HOME}/bin"
    h12o@Exegesis:~$ SetFile -a V "${HOME}/share"
    h12o@Exegesis:~$ SetFile -a V "${HOME}/VirtualBox VMs"
    h12o@Exegesis:~$ SetFile -a V "${HOME}/Mail"
    h12o@Exegesis:~$ SetFile -a V "${HOME}/Documents/Microsoft ユーザー データ"

これでFinderから「bin」や「share」や「VirtualBox VMs」、「Mail」「Microsoft ユーザー データ」が見えなくなり、不用意にFinderで削除することがなくなる。

なお、GetFileInfoでファイルを指定し、attributesの中に大文字の「V」があれば不可視になっている（小文字の「v」がある場合は可視）。

    h12o@Exegesis:~$ GetFileInfo "${HOME}/bin" 
    directory: "/Users/h12o/bin"
    attributes: aVbstclinmedz
    created: **/**/**** **:**:**
    modified: **/**/**** **:**:**
    h12o@Exegesis:~$ GetFileInfo "${HOME}/share" 
    directory: "/Users/h12o/share"
    attributes: aVbstclinmedz
    created: **/**/**** **:**:**
    modified: **/**/**** **:**:**
    h12o@Exegesis:~$ GetFileInfo "${HOME}/VirtualBox VMs"
    directory: "/Users/h12o/VirtualBox VMs"
    attributes: aVbstclinmedz
    created: **/**/**** **:**:**
    modified: **/**/**** **:**:**
    h12o@Exegesis:~$ GetFileInfo "${HOME}/Mail"
    directory: "/Users/h12o/Mail"
    attributes: aVbstclinmedz
    created: **/**/**** **:**:**
    modified: **/**/**** **:**:**
    h12o@Exegesis:~$ GetFileInfo "${HOME}/Documents/Microsoft ユーザーデータ"
    directory: "/Users/h12o/Documents/Microsoft ユーザー データ"
    attributes: aVbstclinmedz
    created: **/**/**** **:**:**
    modified: **/**/**** **:**:**
    h12o@Exegesis:~$ GetFileInfo "${HOME}/Documents"
    directory: "/Users/h12o/Documents"
    attributes: avbstclinmedz
    created: **/**/**** **:**:**
    modified: **/**/**** **:**:**
    h12o@Exegesis:~$ 

これらはすべてHFS+ファイルシステム上のファイルやディレクトリに対してのみ有効。つまり、USBメモリ等でHFS+以外のファイルシステム上では適用することはできないし、ネットワーク越しにマウントされたファイルシステム上でも適用することはできない（余談ではあるけれど、Time Machineがディスクイメージとしてバックアップを保存しているのは、HFS+ファイルシステムでないとこれらの属性を保存することができないからとおもわれる）。
AndroidでiOSのdispatch_after()に当たるもの

実行スレッドを指定しつつ一定時間後に処理を行いたいとき。たとえばUIの更新はメインスレッドでなければ例外が投げられるので、スレッドの指定ができないTimerでは不十分です。

そこで、Looper+Handlerを使います。

```java
void f() {
	long delayMS = 1000; // 1秒後に実行
	// mainスレッドのイベントループに投げるメッセージハンドラを作る
	final Handler uiHandler = new Handler(Looper.getMainLooper());
	uiHandler.postDelayed(new Runnable() {
		@Override
		public void run() {
			// ここではtoastを出したりUIを更新したりできる
		}
	}, delayMS);
}
```

Android Studio の Live Templates に追加するときは以下のコードでできます。

```java
final long delayMS = 1000;
final android.os.Handler uiHandler = new android.os.Handler(android.os.Looper.getMainLooper());
uiHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
        $END$
    }
}, delayMS);
```

参考: [AndroidのHandlerとLooper](http://gpsoft.dip.jp/hiki/?Android%A4%CEHandler%A4%C8Looper)
Effective Java 16章「継承よりコンポジションを選ぶ」

Effective Java 第2版の項目16章、「継承よりコンポジションを選ぶ」を読んだので軽くまとめておきます。

## 問題提起
Setに挿入された回数を記憶する為に、HashSetを継承した以下のようなクラスを作成した。この実装方法は正しいか？

```Java:InstrumentedHashSet.java

public class InstrumentedHashSet<E> extends HashSet<E> {
	private int addCount = 0;

	public InstrumentedHashSet() {
	}

	public InstrumentedHashSet(int initCap, float loadFactor) {
		super(initCap, loadFactor);
	}

	@Override
	public boolean add(E e) {
		addCount++;
		return super.add(e);
	}

	@Override
	public boolean addAll(Collection<? extends <E> c) {
		addCount += c.size();
		return super.addAll(c);
	}

	public int getAddCount() {
		return addCount;
	}
}
```

## 上手く動作しない！(問題点)
以下のように実行してみる。

```java:実行例
InstrumentedHashSet<String> s = new InstrumentedHashSet<String>();
s.addAll(Arrays.asList("AAA", "BBB", "CCC");
System.out.println(s.getAddCount());
```
このとき、s.getAddCount()は6を返す。要素を3つしか追加していないのに何故か？
その理由はHashSetが内部的にaddを呼び出しているから。add()とaddCount()で二重にaddCountが加算されている。

このInstrumentedHashSetを正しく動作させる為には、**HashSetのaddAllメソッドがallメソッドを使用しているという事実を実装者が知っている必要がある**。サブクラスとスーパークラスの実装が同じプログラマの管理下であれば安全だが、そうでない場合は脆いものになる。
また、スーパークラスの実装がリリース毎に変更され、サブクラスのコードが変更されていなくても機能しなくなるかもしれないという問題もある。

## コンポジションを使う
このようなケースでは、コンポジション(composition)と転送(forwarding)を使ってクラスを実装すると良い。
尚、コンポジションとは、あるクラスに別のクラスのオブジェクトを取り込んで扱うことを言う。尚、委譲(delegate)は自分自身のオブジェクトを渡して別のクラスに処理を任せることを言う。

```Java:ForwardingSet.java
// 転送クラス
public class ForwardingSet<E> implements Set<E> {
	// コンポジション
	private final Set<E> s;

	public ForwardingSet(Set<E> s) {
		this.s = s;
	}

	public void clear() {
		s.clear();
	}

	public add(E e) {
		return s.add(e);
	}

	public addAll(Collection<? extends E> c) {
		return s.addAll(c);
	}

	...
}
```

このクラスを継承してラッパークラスを実装する。

```Java:InstrumentedSet.java
// ラッパークラス
public class InstrumentedSet<E> extends ForwardingSet <E> {
	private int addCount = 0;

	public InstrumentedSet(Set<E> s) {
		super(s)
	}

	@Override
	public boolean add(E e) {
		addCount++;
		return super.add(e);
	}

	@Override
	public boolean addAll(Collection<? extends E> c) {
		addCount += c.size();
		return super.addAll(c);
	}

	public int getAddCount() {
		return addCount;
	}
}
```

このような書き方をすると、以下のような利点がある。

* このクラスが持つSetの実装を意識せずに、新たに自分が拡張した処理(addCount)を実装できる
* スーパークラスの実装がリリース毎に変更されたとしても、このクラスには影響が無い(インターフェースが変更されない限り)
* Setインターフェースを実装するすべてのクラスに対してこのクラスが使用出来る(Setの実装クラス毎に継承する必要が無い)

以下のように実行する。

```java:実行例
Set<Date> s = new InstrumentedSet<Date>(new TreeSet<Date>(cmp));
Set<E> s2 = new InstrumentedSet<E>(new HashSet<E>(capacity));
```

## 継承の使いどころ
継承はいつ使えば良いのか？という疑問が残る。継承元クラスと継承したクラスの関係が、本当のサブタイプ関係があるときだけ、継承は使うべき。
ただ拡張したいだけであれば上記のコンポジションの方法を使って実装する。

## さいごに

>「InstrumentedSetクラスが計測を追加することでセットを装飾するので、デコレータ(Decorator)パターンとしても知られています。
> (Effective Java 第２版 P84)

と書いてあるけど、DecoratorはForwardingSetではない？Decoratorパターンについてどこを参照すればいいか分からないけど、

> Decorator パターンの方針は、既存のオブジェクトを新しい Decorator オブジェクトでラップすることである。
> (Wikipediaの[Decorator パターン](http://ja.wikipedia.org/wiki/Decorator_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)の項より)

というのが定義なら、Setの参照を持っているForwardingSetがDecoratorな気がするんだけども。
Pythonプログラムのプロセス名を設定する

時々、実行しているプログラムのプロセス名を変更したいことがあります。
Pythonだとsetproctitleというパッケージを使うといいようです。

# インストール

DebianやUbuntu、Mintなら次のコマンドで一発でインストールできます。

```sh
# aptitude install setproctitle
```

あるいはpypiにUpされてるのでこれをpipでインストールします。一部Cで書かれていてコンパイルするのにPythonのヘッダファイルを参照する必要があるのでDebianやUbuntuならpython-devをインストールしましょう。

```sh
# aptitude install python-dev python-pip
# pip install setproctitle
```

# 実行

以下のような感じでsetproctitleでプロセス名を設定、getproctitleで現在のプロセス名を取得できます。「pgrep hoge」とかやって実際にプロセス名が変更されているかどうか確認してみましょう。

```
>>> from setproctitle import setproctitle, getproctitle
>>> getproctitle()
'python'
>>> setproctitle("hoge")
>>> getproctitle()
'hoge'
>>>
```
Language.Haskell.Interpreter


hintパッケージより。hintはGHC APIのラッパーで簡単に動的にスクリプトを読めるので、プラグインとかはこれで作れそう。

```haskell:
% runghc
module Main where
import Language.Haskell.Interpreter

main :: IO ()
main = do
  res <- runInterpreter withPlugins
  putStrLn . show $ res
  return ()

withPlugins :: InterpreterT IO ()
withPlugins = do
  setImports ["Prelude", "Data.List"]
  evaled <- interpret "intersperse ',' \"ABCDEF\"" (as :: String)
  (lift . putStrLn) evaled
  return ()
```

```
A,B,C,D,E,F
Right ()
```
GitHubのIssueにmaster以外へのPull-Requestを送る

[hub](https://github.com/defunkt/hub)を用いてIssueにmasterへのPull-Requestを送る方法は下記で、紹介されている。
[GitHub の Issue をあとから Pull Request にする (あとからコードを添付する)](http://qiita.com/items/170a188a87925f81ae86)

master以外へPull-Requestを送るには、`-b`オプションをつけて、Pull-Requestを送りたいブランチを指定するとできる。

```
$ hub pull-request -i ISSUE_No -b organization:base -h organization:head
```



参考：
[defunkt/hub](https://github.com/defunkt/hub)
[GitHub の Issue をあとから Pull Request にする (あとからコードを添付する)](http://qiita.com/items/170a188a87925f81ae86)
Macユーザー用vichromeのショートカットキー備忘録

#vichromeショートカット（よく使うもの）
変なところにカーソルがあるのをキャンセル：esc

ちょっと下にスクロール：j
ちょっと上にスクロール：k
もっと下へスクロール：Ctrl + u（アップ）
もっと上へスクロール：Ctrl + d（ダウン）
一番上へ：gg
一番下へ：G
ページ選択：f

戻る：H
進む：L
新規タブ作成：t
左のタブへ移動：Ctrl + h(gtでも可)
右のタブへ移動：Ctrl + l
タブの削除：x(⌘wでも可)
消したタブの復活：u

ページの更新（WindowsでいうF5）：r
ページ内単語検索：/
リンクのみ検索：a
検索時に次の候補へ移動：n
検索時に前の候補へ移動：N
次のリンクへ移動：Tab
前のリンクへ移動：Shift + Tab

#chromeのショートカット
アドレスバーにカーソルを移動：⌘l
全画面表示(WindowsでいうF11)：Shift + ⌘f
StatusBarをタップしてもUIScrollViewが上までスクロールしない場合の対処法

UIScrollViewのscrollsToTopがYESになっている場合、
StatusBarをタップすると上までスクロールするが、
subViewとして、scrollsToTopがYESになっている別のUIScrollViewサブクラスが含まれているとうまく動かない。

scrollsToTopはデフォルトでYESなので注意が必要。

## 注意するクラス
 * UIWebView
 * UITextView
 * UITableView

UIWebViewはUIScrollViewのサブクラスではないが、内部でsubViewとしてUIScrollViewを持っている。

## 内部でUIScrollViewを持っている場合の対処
```objc
for (UIView *view in view.subviews) {
  if ([view isKindOfClass:[UIScrollView class]]) {
    [(UIScrollView *)view setScrollsToTop:NO];
  }
}
```

※追記
WebViewなら以下のようにできます。
```webView.scrollView.scrollsToTop = NO;```

## viewの階層構造をチェック
どうしても、どのviewが原因か分からない場合は、非公開メソッドを使ってviewの階層構造を出力できる。
**そのまま審査提出するとリジェクトされるので注意**

```objective-c
[view performSelector:@selector(recursiveDescription)];
```

## 参考リンク
 * [２つ以上の UIScrollView \(UITableView, UITextView などを含む\) が存在するビューでStatusBar のタップで先頭に戻る機能を有効にするには。](http://d.hatena.ne.jp/KishikawaKatsumi/20100812/1281625745)
 * [ビュー (UIView) の階層構造をダンプする非公開の便利メソッド](http://d.hatena.ne.jp/KishikawaKatsumi/20100521/1274451944)
tmux+iTerm2でマウス(タッチパッド)利用時にマウスによるコピペができない問題の対処

**※コメントで takc923 さんに教えて頂いた「optionを押しながらだと解除される」の方が明らかに便利です。on/offしたい人もいるかもしれないので残してはおきます。**

tmuxのマウス機能を使った上で普通のコピペ(マウスで選択してcmd+cとか)を同時に実現できる方法は見あたらなかったので

http://tangledhelix.com/blog/2012/07/16/tmux-and-mouse-mode/

に紹介されていたキーバインドでマウス機能オンオフを割り当てる方法で回避しました。

```
bind m \
  set -g mode-mouse on \;\
  set -g mouse-resize-pane on \;\
  set -g mouse-select-pane on \;\
  set -g mouse-select-window on \;\
  display 'Mouse: ON'

# Toggle mouse off with ^B M
bind M \
  set -g mode-mouse off \;\
  set -g mouse-resize-pane off \;\
  set -g mouse-select-pane off \;\
  set -g mouse-select-window off \;\
  display 'Mouse: OFF'
```
で、^b(人による) + m でオン、Mでオフできるのでコピペしたいときだけ手軽にオフにできるようになります。

ちなみに、最初試したとき全く効かなかった(offにしようがマウス機能が効いてしまう)んですが、brewで入れた1.6だとダメだったようです。
iTerm2の最新版に同梱されていた1.8のソースをmakeした1.8に入れ替えるとうまく動きました。
(↓のtmux同梱版の方についていました)
http://code.google.com/p/iterm2/downloads/list

基本はキーボードで操作しているとは言え、paneの切り替え、paneのresizeとかログ見るときのスクロールにマウスが使えるとかなり便利です。

お役に立てれば幸い。
Linuxホームのディレクトリ名を英語化する

CentOSやFedora、Ubuntu等を日本語でLinuxインストールするとホーム下のディレクトリが「ダウンロード」のように日本語名で作成されます。

コマンドでダイアログを開き英語名に変更可能です。

```bash:Terminal
LANG=C xdg-user-dirs-gtk-update
```
Viewのレンダリングがなぜか途中で止まってしまう → Bulletをアップデートして解決


ある日突然、Viewが最後までレンダリングされない現象が発生するようになった。ブラウザが受け取るHTMLが途中で切れてしまうイメージ。

ある程度サイズの大きいViewをレンダリングしようとすると再現するので、何かしらがレンダリングできるViewのサイズに制限をかけけているのではないかと考えた。

いろいろ調べたところ、同じ問題に悩まされている人を発見。
[Unexpected behaviour of associated models in views · Issue #8283 · rails/rails](https://github.com/rails/rails/issues/8283 "Unexpected behaviour of associated models in views · Issue #8283 · rails/rails")

どうやら、[Bullet](https://github.com/flyerhzm/bullet "flyerhzm/bullet · GitHub")という非効率なデータベースクエリを検出してくれるGemが原因だとのこと。


問題が発生しているアプリにはBulletを導入していたので、`bundle update bullet`を実行し、Bulletを4.2.0から4.3.0にアップデートすると、問題は発生しなくなった。
指定したテーブル以外のレコードをdumpする


`mysqldump`コマンドの`--ignore-table`オプションを利用することで、指定したテーブルを除外した形でレコードをdumpすることができる。

例えば以下の用に実行すると`database_name`データベースの`table_name`テーブル以外のレコードをdumpできる。

```
$ mysqldump -u username -p -t database_name  --ignore-table=database_name.table_name
```

複数のテーブルを除外したい場合は`--ignore-table`オプションを複数書けばいい。

```
$ mysqldump -u username -p -t database_name  --ignore-table=database_name.table_name --ignore-table=database_name.another_table_namme
```

テーブル名の前にデータベース名を付けないとダメなことに注意。
GitHub のコミットログを日報がわりにする

 1. 以下の `nippo.rb` をダウンロードしパスの通ったディレクトリに配置する
 2. GitHub のリポジトリを clone してきた作業ディレクトリで `$ nippo.rb` と実行する
 3. その日のコミットログメッセージが GitHub へのリンクつきで表示される

日報がわりにコピペすると便利です（サボってると一目瞭然なので真面目に仕事しようという気になります）

```nippo.rb
#!/usr/bin/env ruby
 
remote = `git remote -v | grep origin | awk '{print $2}'`.split("\n").first.chomp.sub(/.*:(.*)/, '\1').sub(/\.git/, '')
puts "### #{remote} ###"
puts ""
`git log --after=yesterday --author='Kensuke Nagae'`.each_line do |line|
  puts line.gsub(/commit (\w+)/) {
    "commit https://github.com/#{remote}/commit/#{$1}"
  }
end
```

複数プロジェクトの作業ディレクトリを一箇所にまとめている場合は以下の `nippo-all.rb` を併用するとさらに便利です。

```nippo-all.rb
#!/usr/bin/env ruby
 
Dir.glob("#{ENV['HOME']}/works/**").each do |dir|
  next unless File.exists?("#{File.expand_path(File.join(dir, '.git'))}")
  Dir.chdir(dir) do
    system("nippo.rb")
  end
end
```

https://gist.github.com/4509627
iptablesセットアップ用のスクリプトを作成する


毎回オプションを綺麗に忘れるのでメモ。

```bash:iptables.sh
#!/bin/bash

# チートシート
# -F, --flush [chain]: 選択したチェーンのルールを消去する
# -P, --policy chain target: 選択したチェーンのポリシーを指定する
# -A, --append chain rule-specification: 選択したチェーンにルールを追加する
#
# -j, --jump target: ターゲットを指定する
# -p, --protocol protocol: プロトコルを指定する
# -i, --in-interface name: 入力インターフェースを指定する
# -o, --out-interface name: 出力インターフェースを指定する
# -m matchname
# --dport, --destination-port port[:port]: 送信先ポートを指定する
# --sport, --source-port port[:port]: 送信元ポートを指定する

# ルールを初期化する
iptables -F

# 外部からのアクセスは拒否, 自分からのアクセスは許可する
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# ループバックインターフェースは許可する
iptables -A INPUT -i lo -j ACCEPT

# セッション確立後のアクセスは許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED --jump ACCEPT


# サービス用のポートを開放する
iptables -A INPUT -p tcp --dport 22 -j ACCEPT   # SSH
iptables -A INPUT -p tcp --dport 25 -j ACCEPT   # SMTP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT   # HTTP
iptables -A INPUT -p tcp --dport 110 -j ACCEPT  # POP3
iptables -A INPUT -p tcp --dport 143 -j ACCEPT  # IMAP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT  # HTTPS
iptables -A INPUT -p tcp --dport 1194 -j ACCEPT # OpenVPN
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT # MySQL
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT # HTTP Alternate

# pingを許可する
iptables -I INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -I INPUT -p icmp --icmp-type 8 -j ACCEPT
```
Debian系のディストリビューションのデフォルトのエディタを変更する


毎回nanoが起動して操作が分からないのでメモ。

```bash:Bash
$ sudo update-alternatives --config editor
```

以下の様な画面になるので、希望のエディタの番号を押してEnterを押すとデフォルトのエディタが変更されます。
![update-alternative](http://i.imgur.com/qvLXE.png)

## 参考
- [遙かデジタリアへ: Debianでデフォルトのエディタを変更するには](http://16777215.blogspot.jp/2009/04/change-debian-default-editor.html)
$(SRCROOT)や$(BUILD_DIR)等のXcodeで使用しているマクロの置換内容の一覧を調べる

Info.plistや、ビルド設定を変更したりしていると、こんな文字列に出くわします。

- $(PRODUCT_NAME)
- $(TARGET_TEMP_DIR)
- $(SRCROOT)

これらはそれぞれ特別な意味を持ち、Xcodeがビルド時等の様々なタイミングでプロダクト名や環境に応じたパスに置き換えたりしてくれるものです。

複雑なパスを簡単な文字列で指定できるので便利なのですが、「SRCROOTがプロジェクトフォルダ直下かそれともその一つ下かわからなくなる」「Library Search Pathを指定したいがどのマクロを使っていいかわからない」といった状況で、その置換内容を逆に知りたい場合があります。

このXcodeマクロに関するドキュメントとしては、Appleの[Xcode Build Setting Reference](http://developer.apple.com/library/ios/#documentation/DeveloperTools/Reference/XcodeBuildSettingRef)に情報がまとまっているのですが、たとえばBUILT_PRODUCTS_DIRの項を見てみると

 >   $SYMROOT/BuiltProducts: When DEPLOYMENT_LOCATION = YES AND RETAIN_RAW_BINARIES = YES,
>    $CONFIGURATION_BUILD_DIR: Is the alternative.

といった感じで、条件分岐があったり他の環境変数との入れ子があったりして、これだけを見てマクロの置換内容を具体的に知るのは容易ではありません。


##現在の環境でのXcodeマクロの置換内容を一覧表示する方法

次のスクリプトをRun Scriptに登録（Build PhasesタブのAdd Build Phaseボタンから登録できます）してビルド実行することで、現在の環境でのXcodeで使用しているマクロの置換内容を一覧表示することができます。

    env > env.txt

ビルド実行すると、プロジェクトフォルダに env.txt というファイルが生成され、

>    PRODUCT_NAME=xxxxxx
>    TEMP_FILES_DIR=/Users/xxxx/Library/Developer/Xcode/DerivedData/xxxxx/Build/Intermediates/xxxx.build/Debug-iphoneos/xxxx.build
>    SRCROOT=/Users/xxxx/xxx/xxxx/xxxx

といった感じでズラズラとマクロ名とその置換内容の一覧が出力されます。
簡単なログ監視用のシェルスクリプト

# 参考

http://lab.hde.co.jp/2008/04/tail.html
http://d.hatena.ne.jp/kakurasan/20100112/p1

```bash:log_checker.sh
#!/bin/sh

# メール送信設定
_to="nekogeruge_987@gmail.com"
_from="appname@gmail.com"

# メール件名設定
_hostname=`hostname`
_application="AppName"
_subject="Fatal error!!"
_title="[${_application}][${_hostname}]${_subject}"

# エラー条件
_error_conditions="ERROR"

# ログファイルをtailし、_error_conditionsの条件にヒットしたらメールを送信する
mail_alert() {
  while read i
  do
    echo $i | grep -q ${_error_conditions}
    if [ $? = "0" ];then
      echo $i | /usr/sbin/sendmail -t << EOF
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
From: ${_from}
To: ${_to}
Subject: ${_title}
Data Replication Failed

---

$i

---

Please check with a administrator for details. 

EOF
    fi
  done
}

tail -n 0 --follow=name --retry $1 | mail_alert
```

引数にログファイルを指定して実行する

```
$ sh log_checker.sh application.log
```
CentOS 6.3に縦分割可能な256色GNU Screen環境を構築する


未だにyumで入るパッケージは縦分割(左右に分割)できないのでソースからコンパイルします。
ついでに、256色に対応させます。16色は厳しいです。

## 1.パッケージの準備

```bash:Bash
$ sudo yum install autoconf automake ncurses-devel
```

## 2.ソースの準備

```bash:Bash
$ git clone git://git.savannah.gnu.org/screen.git
```

## 3.コンパイル & インストール

```bash:Bash
$ cd screen/src
$ sh autogen.sh
$ ./configure --prefix=/usr/local/ --enable-colors256
$ sudo make
$ sudo make install
```

## 4.動作確認

```bash:Bash
$ which screen
$ screen -v
$ screen
```

## 参考
- [CentOS 5.6に最新版GNU Screenのインストールをする | 日々の記録](http://gajumaru.ddo.jp/wordpress/?p=168)
- [256色対応 gnu-screen 4.1.0 インストール - ひたすら事務](http://d.hatena.ne.jp/jimsei/20111022/1319290431)
D3.jsを学習する際に見ると良いドキュメント


## 1. Examples

まず見るべきなは、実際に動かせる例がたくさん存在するギャラリーページ
https://github.com/mbostock/d3/wiki/Gallery

最初は、上の方にあるのを幾つかクリックして「すごーい」と思えばいい。ただ、実際はちょっと下にある"Basic Charts", "Techniques, Interaction & Animation"という部分のほうが自分で使うとなった場合、参考になるはず。

## 2. Introduction

次に見るのはIntroductionページ
http://d3js.org/

ここはd3jsのトップページでありながらドキュメントのIntroductionも兼ねている。
...が、ここを読んでも全く使えるようになった気がしない。

ただ、

- Selections
- Dynamic Properties
- Enter and Exit
- Transformation not Representation
- Transitions

という５項目のみがセクション名になるほど大事で、これさえわかってしまえば使えるんだろうなという感覚を持っておくと気が遠くならずに済む。

## 3. Documentation

次に、Documentationページをチェック
https://github.com/mbostock/d3/wiki

ただ、ここはリンク集みたいになっていて、コンテンツではないことが分かる。
なにか疑問に思った時に、ぱっと自分でコード書いて動かせるようにここでd3.jsのInstallだけしておこう。

## 4. Tutorial & API Reference

次に見るのは、

チュートリアル一覧ページ
https://github.com/mbostock/d3/wiki/Tutorials

APIリファレンス
https://github.com/mbostock/d3/wiki/API-Reference

のどちらか、というか併用。

チュートリアルは理解しやすいけれど、網羅的に理解するのは不向き。こういうのしか読まないと、ある程度使えるようにはなるけれど、同じ事を行うより良い方法を見逃してしまったりする。

逆にAPIリファレンスは、出来ることの全てが書かれているのでこれさえ把握すれば出来ることを理解しきったと言えるけれども、普通の人間であればこれをそのまま読むのは苦痛なはず。

なのでチュートリアルを読み進めつつ、その時出てきた部分のAPIリファレンスを参照するという。こうすることで、網羅性も確保しつつ、重要なAPIの部分から読んでいくことが可能になる。

### Selections / Enter and Exit 

D3を使う上で特に大事な、データに追従して要素を作ったり更新したり削除したりする仕組みのチュートリアル
http://bost.ocks.org/mike/join/

重要な部分は、`enter`、`update`、`exit`という名前のvirtual selectorが作成され、それぞれ新規要素、既存要素、削除された要素が入っているという部分

> The data method binds data to elements, producing three virtual selections: enter, update and exit. The enter selection contains placeholders for any missing elements. The update selection contains existing elements, bound to data. Any remaining elements end up in the exit selection for removal.

これに伴い、selection.dataのAPIリファレンスを読んでおくと理解も深まる
https://github.com/mbostock/d3/wiki/Selections#wiki-data

https://github.com/mbostock/d3/wiki/SVG-Shapes
Windowsのターミナル環境を整える vol.2

##はじめに
[前回](http://qiita.com/items/2c51a33a3ca82999bea2)は､Linux仮想環境を構築する`Cygwin`やTerminalの`Console2`などを紹介したと思いますが､今回は､`PowerShell`関連のツールを紹介していきたいと思います｡

私自身も､`Cygwin`というのはあくまで補助的に使用するものであり､Windowsでは､メインは､`PowerShell`です｡したがって､やはり個人的なおすすめも`PowerShell`ということになります｡

##Chocolatey
Windows､特にPowerShellからパッケージ管理を行うには､`Chocolatey`がお勧めです｡GUIアプリの自動インストールにも対応していますので､とても使いやすいです｡`Chocolatey`のインストールは以下のように行います｡

`Windows` + `R`を押して､ `cmd`と入力し､ `Enter`を押します｡これは､コマンドプロンプトの起動手順です｡そこで､以下のコマンドを実行してください｡

```bat:cmd
cd /
 
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('http://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
```

ちなみに､`PowerShell`(以降､ps)の場合は､以下のようになると思います｡

```ps1:powershell
iex ((new-object net.webclient).DownloadString("http://bit.ly/psChocInstall"))
```

これで､ `Chocolatey`がインストールされます｡ルートディレクトリにフォルダが作成されているのが分かると思います｡インストール後は､ `cinst`コマンドが使えるようになります｡

ここで､試しに `7zip`をインストールしてみましょう｡

```ps1:powershell
cinst 7zip.commandline
```

これで､ `7za`コマンドが使えるようになったと思います｡その他のパッケージは､ [こちら](http://chocolatey.org/packages)を参考にしてください｡


##Posh-Git
`Posh-Git`とは､`Git for Windows`をインストールした時に使えるようになる`Git-Shell`をPowerShellで使えるようにするものです｡

###PortableGit
まずは､`git`コマンドを使えるようにするところまで説明します｡[PortableGit](http://code.google.com/p/msysgit/downloads/list)をダウンロードして解凍します｡拡張子は､ `.7z`ですので､解凍には､ `.7z`に対応したアプリを使ってください｡

```shell:cygwin
w3m http://code.google.com/p/msysgit/downloads/list
 
ln -s /cygdrive/c/"Program Files"/7-zip/7z.exe /usr/bin/7z
 
7z git hoge.7z
```

なお､先ほど使えるようにした`cinst`コマンドを使って､GUI `7z.exe`をインストールしてもいいと思います｡2行目の手順は､インストールされた`7z.exe`を呼び出すコマンドを設定するためのものです｡




そして､解凍してできたフォルダを `c:\git\`にでも置きましょう｡フォルダ構成は以下の様な感じです｡

![](https://lh6.googleusercontent.com/-OIUv6B6GiaM/UOfvGmjA_YI/AAAAAAAACf8/OtGFerBKT2Y/s640/win.png)

```ps1:powershell
Show-Tree git -Depth 1
```

ちなみに､便利な treeコマンドを使いたかったら [3.0 Production](http://pscx.codeplex.com/releases)をインストールすると使えます｡


後は､当該フォルダ `c:\git\bin\`にパスを通すだけです｡起動時に実行したい場合は､プロファイル `$Profile` に書いておきましょう｡

```ps1:powershell
$Env:Path = "c:\git\bin\;" + $Env:Path
```


###Posh-Git
GitHubから `posh-git`を複製し､ダウンロードしたインストール用のスクリプトを実行します｡そして､プロファイルを再読み込みすれば､導入の完了です｡

```ps1:powershell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Confirm.
 
git clone https://github.com/dahlbyk/posh-git.git
 
.\posh-git\install.ps1
 
. $PROFILE
```



##PsGet


次は､psでパッケージ管理ができる `PsGet`について紹介したいと思います｡

```ps1:powershell
(new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1") | iex
```



インストール後は､以下の様なコマンドが使えるようになります｡

```ps1:powershell
Install-Module posh-hg
```


インスールできるものについては､ [こちら](http://psget.net/directory/)を参考にしてみてください｡

これを使えば､ `posh-git`も簡単にインストールできると思います｡

psについては､ [PowerShell Advent Calendar 2012](http://atnd.org/events/34319)が開催されていました｡とても参考になりそうですね｡
Google Chrome でローカルファイルのJSを実行できるようにする

## 現象
ローカルで作成中の HTMLファイル（JavaScriptつき）をテスト実行しようとしたら、Google Chromeで表示してくれない。

- [確認] ChromeのJavaScriptコンソールを開いてみる

> _XMLHttpRequest cannot load file:///（中略）. Origin null is not allowed by Access-Control-Allow-Origin._ 
とエラー表示されている

## 解決法
Chrome の起動時に --allow-file-access-from-files というオプションをつける。

これを実現させる具体的な手順が思いつく人はここで読了です。
筆者は、Mac OS X上でいつも Dock からChrome を立ち上げているので、その手順はそのままに上記を実現したい人です。
ということで、以下そのやり方を記します。

### Mac OS X でアイコンのダブルクリックで上記を実行する準備
1) Chrome を終了する
2) Mac にプリインストールされている AppleScript エディタを起動する
3) 下記のシェルコマンドを入力し、「実行」ボタンを押してみる

> do shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --allow-file-access-from-files"

→これが正しくできていれば、次の２点を確認できる

- Chrome が立ち上がる
- 開きたかった JSつきHTMLファイルをそのChromeで読み込んでみて、JSが実行されている

4) AppleScript エディタに戻り、ファイル＞保存で「アプリケーション」フォーマットで保存する。名前は自分がわかるものなら何でもいいけれど、例えば Google Chrome JS.app とか。
5) 保存した .app をアプリケーションフォルダに入れる。Dock を使っている人は、従来の Google Chrome.app を 4) と入れ替える。
6) 完了。あとは Google Chrome JS.app をクリックして起動してください。 

#### ちょっと残念なこと（保留事項）
- アイコンがJSデフォルトになるのが少々気に食わない
- オリジナルの Google Chrome.app アプリも同時に立ち上がるので Dock の起動中アイコンが従来より１コ増える

Google Chrome JS.app のアイコンを入れ替えられれば少しはいいかな？でもすぐにはわからなかったのでとりあえず置いておく。
RewriteRuleのフラグと、RewriteCondの変数一覧


## 2018-10-09 追記

参考・引用のサイトURLが変わっていたので修正。片方は見つからず。
フィッシングサイトに飛んでたので踏まれた方、ご迷惑おかけしました。

@yayamamo さん、ご指摘ありがとうございました。助かりました。

-----

この辺、便利だけどたまにしか使わんから忘れますよねー
ということで、使いそうなもののみ抜粋。

## RewriteRuleのフラグ
|フラグ|意味         |説明|
|:----|:-----------|:--|
|C    |Chain       |このルールにマッチしたら、次のルールを評価|
|F    |Forbidden   |アクセス禁止（403-Forbidden）。[L]フラグと同様、以降のルールは無視される |
|G    |Gone        |削除（410-Gone）|
|L    |Last        |マッチしたらRewriteを止めます。以降のルールは無視！|
|NC   |No Case     |大文字小文字を無視|
|NE   |No Escape   |".", "?", "%"などの特殊文字が"%25″のようにエンコードされるのを防ぐ|
|OR   |Or          |RewriteCondを複数指定する場合のor指定。指定なしならAND|
|PT   |Path Through|Rewriteを終了し、それ以外の処理に移行|
|R    |Redirect    |指定したURLにリダイレクト。[R=303]のようにリダイレクトコードも付加できる。[L]フラグと同様、以降のルールは無視される|

[C]を指定すれば、RewriteCondの条件を複数のRewriteRuleに適用できる。けど、正規表現の方が速いそうな。


## RewriteCondの変数
説明書くのは面倒なので省略。気が向いたら追記ということで。

- HTTP_USER_AGENT
- HTTP_REFERER
- HTTP_COOKIE
- HTTP_FORWARDED
- HTTP_HOST
- HTTP_PROXY_CONNECTION
- HTTP_ACCEPT
- REMOTE_ADDR
- REMOTE_HOST
- REMOTE_USER
- REMOTE_IDENT
- REQUEST_METHOD
- SCRIPT_FILENAME
- PATH_INFO
- QUERY_STRING
- AUTH_TYPE
- DOCUMENT_ROOT
- SERVER_ADMIN
- SERVER_NAME
- SERVER_ADDR
- SERVER_PORT
- SERVER_PROTOCOL
- SERVER_SOFTWARE
- TIME_YEAR
- TIME_MON
- TIME_DAY
- TIME_HOUR
- TIME_MIN
- TIME_SEC
- TIME_WDAY
- TIME
- API_VERSION
- THE_REQUEST
- REQUEST_URI
- REQUEST_FILENAME
- IS_SUBREQ


## 参考・引用
- [mod_rewrite サンプル集/楽](https://snipsnaptmae.wordpress.com/2013/02/28/modrewrite/)
- mod_rewriteまとめ（3）mod_rewriteで使えるフラグ（←移転？URL分からず…）
Ubuntu 12.04にOpenVPNクライアント環境を構築する


普通はLinuxをVPNサーバにすると思いますが、たまにクライアントにしたくなるのでメモ。
やっぱりUbuntuは色々パッケージがあるので楽ですね。

## 1.インストール
```bash:Bash
$ sudo apt-get install openvpn
$ sudo apt-get install tunneldigger
```

## 2.設定
```bash:Bash
$ sudo cp -p /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/
$ sudo vi /etc/openvpn/client.conf
  # 以下のように修正する。
  remote vpn.server.example.com 1194
  cert user.crt
  key user.key

  # 以下の行をコメントアウトする
  ns-cert-type server
  tls-auth ta.key 1
```

## 3.起動
```bash:Bash
$ sudo /etc/init.d/openvpn start
```

## 参考
+ [ubuntu に OpenVPNのクライアントを入れる。](http://no14.biz/?p=155)
CentOS 6.3の最小構成でCaps LockをCtrlにする


CentOSで最小構成インストールした後にCaps LockをCtrlにします。
あまり需要はない気がしますが、覚えられないので自分メモ。

## 1.バックアップ
何はともあれデフォルトの設定をバックアップします。

```bash:Bash
$ cd /lib/kbd/keymaps/i386/qwerty
$ sudo cp -p jp106.map.gz jp106.map.gz.org
```

## 2.書き換え
圧縮されているので展開します。

```bash:Bash
$ sudo gzip -d jp106.map.gz

# jp106.mapができていることを確認する
$ ls
```

Caps LockをCtrlに書き換えます。

```ini:jp106.map
keycode 58 = Control
```

再度圧縮します。

```bash:Bash
$ sudo gzip jp106.map

# jp106.map.gzができていることを確認する
$ ls
```

## 3.反映
リブートするのが手っ取り早いのですが、やっぱり個別に読み込んだほうが早いので読み込みます。

```bash:Bash
$ sudo loadkeys jp106
```

## 参考
- [CentOS 4 : CapsLock と Control キーを入れ替える。 » ぶっちろぐ | ぶっちろぐ](http://bucci.bp7.org/archives/239)
Flex グローバル関数を任意のフォルダ内に定義する

一部、Flex Builder とか Flash Builder とかの使用を前提に書いていますが適当に読み替えてください。

## Flexのグローバル関数定義方法（基本）
かんたんです

### (1) ASファイルで関数をこさえる
  1つのASファイルで1つの関数を定義します。**関数名とASファイル名は揃えること。**
  
``` as:getZero.as
package
{
	public function getZero():Number
	{
		return 0;
	}
}
```

### (2) src直下にポイと置く

```
Flexプロジェクト
 |
 +-- bin-debug
 +-- html-template
 +-- libs
 +-- :
 +-- src
      |
      +-- :
      +-- getZero.as      ←
```

これでsrc内のどのソースからも `getZero` を使えるようになります。
でも…

## src直下にグローバル関数定義を置きたくない

srcの下には通常アプリケーションのMXMLなどが配置済みです。
ここにグローバル関数のファイルが並ぶのはすごくイヤです。

```
Flexプロジェクト
 |
 +-- :
 +-- src
      |
      +-- doSomething.as  ← グローバル関数
      +-- getZero.as      ← グローバル関数
      +-- MainApp.mxml    ← アプリケーション
      +-- TestApp.mxml    ← アプリケーション
      +-- zzz.as          ← グローバル関数
```

ですので、グローバル関数専用のフォルダを用意してそこに全部収納しようと思います。

```
Flexプロジェクト
 |
 +-- :
 +-- src
      |
      +-- global  ← グローバル関数専用
      |    |
      |    +-- doSomething.as
      |    +-- getZero.as
      |    +-- zzz.as
      |
      +-- MainApp.mxml
      +-- TestApp.mxml
```

### コンパイラオプションを変更する
設定ファイル flex-config.xml を使います。（アプリケーションごとに設定したい場合は MainApp-config.xml とか TestApp-config.xml とか）

プロジェクト内に flex-config.xml がなければ作ります。
適宜[このへん](http://livedocs.adobe.com/flex/3_jp/html/help.html?content=compilers_10.html)を参考に。

```
Flexプロジェクト
 |
 +-- :
 +-- src
 +-- flex-config.xml      ←
```

```xml:flex-config.xml
<?xml version="1.0"?>
<flex-config>
   <compiler>

      <source-path>
         <path-element>src</path-element>

         <!-- グローバル関数の定義場所 -->
         <path-element>src/global</path-element>
      </source-path>
      
      <allow-source-path-overlap>true</allow-source-path-overlap>

   </compiler>
</flex-config>
```

あとは、この設定ファイルを使ってコンパイルするようにプロジェクトプロパティを変更します。

[プロジェクトプロパティ]>[Flex コンパイラ]>[追加コンパイラ引数]

```:設定例
-load-config=../flex-config.xml
```

コンパイルして動作確認してみてください :)

内容が間違ってるとか、動かなかったとか、不備があったら教えてくださるとうれしいです。
PhantomJSを使って、SVGファイルからPNGを切り出す


iPhoneアプリ開発のように、小さい画像ファイルを沢山使う場合、元データを１ファイルにまとめて管理したくなります。なので、MacOSXでSVGファイルからPNGファイルを切り出す方法を調べてみました。

MacOSXでは、PhantomJSを使うのが簡単そうです。

http://phantomjs.org/

"PhantomJS is a headless WebKit with JavaScript API"とのことで、PhantomeJSを使うと、URLを指定してブラウザに表示したイメージをPNGファイルに出力したりするJavaScriptスクリプトがかけます。(他にもいろいろ）。

HomeBrewを使ってインストールできます。今回使用したバージョンはPhantomJS 1.8.0です。

```
$ brew install phantomjs
```

SVGファイルからPNGファイルを切り出すスクリプトを作成しました。

```javascript:clipsvg.js
//
// clipsvg 
// for phantomjs
//
// tested on phantomjs 1.8.0 and MacOSX 10.8.2
// 
// Usage : 
//   phantomjs cropsvg.js [--clipframe x,y,w,h] [--scale s] <input file(svg)> <output file(png)>  

var system = require('system');
var argDic = {};

var isArgsError = false;
if (system.args.length === 1) {
	isArgsError = true;
} else {
	var lastArg = null;
	system.args.forEach(function (arg, i) {
		if (i == 0) {
		}else if (arg == '-c' || arg == '--clipframe') {
			lastArg = '-c';
		}else if (lastArg == '-c') {
			argDic['clipframe'] = arg;
			argSplit = arg.split(",");
			argDic['clipX'] = parseFloat(argSplit[0]);
			argDic['clipY'] = parseFloat(argSplit[1]);
			argDic['clipW'] = parseFloat(argSplit[2]);
    		argDic['clipH'] = parseFloat(argSplit[3]);
    		lastArg = null;
		}else if (arg == '-s' || arg == '--scale') {
			lastArg = '-s';
		}else if (lastArg == '-s') {
			argDic['scale'] = parseFloat(arg);
    		lastArg = null;
		}else if (!lastArg && i == system.args.length -2) {
			argDic['inputFile'] = arg;
		}else if (!lastArg && i == system.args.length -1) {
			argDic['outputFile'] = arg;
		}else {
			isArgsError = true;
		}
	});
}
if (isArgsError || !argDic['inputFile'] || !argDic['outputFile']) {
	console.log("Usage : phantomjs clipsvg.js [--clipframe x,y,w,h] [--scale s] <input file(svg)> <output file(png)>")
	phantom.exit();
}

var page = require('webpage').create();

page.open(argDic['inputFile'], function () {

	var scale = argDic['scale'] ? argDic['scale'] : 1.0;
	var clipX = argDic['clipX'] ? argDic['clipX'] * scale : 0.0;
	var clipY = argDic['clipY'] ? argDic['clipY'] * scale : 0.0;
	var clipW = argDic['clipW'] ? argDic['clipW'] * scale : page.width;
	var clipH = argDic['clipH'] ? argDic['clipH'] * scale : page.height;

	page.zoomFactor = scale;
    page.clipRect = { top: clipY, left: clipX, width: clipW, height: clipH };
	page.render(argDic['outputFile']);
    phantom.exit();
});
```

以下のように使います。

```
phantomjs clipsvg.js -c SVGから切り出す領域(x,y,w,h) -s 出力する倍率] <input file(svg)> <output file(png)>  
```

```例
$ phantomjs clipsvg.js -c 10,10,100,100 -s 1.0 Icons.svg a.png
$ phantomjs clipsvg.js -c 10,10,100,100 -s 2.0 Icons.svg a@2x.png
```

これをシェルにすることで、1枚のSVG画像からまとめて複数のPNGファイルを切り出すなんてことことができます。スケールを指定できるので、Retina用と非Retina用といった、解像度ごとのPNGファイルを切り出すこともできます。

---
感想：
・背景を透過色で出力できるので、アプリ等で使いやすくなるかと
・ベクター画像を小さいラスター画像(特に非Retina用)を切り出すと画像が荒くなりがちなのが難しいところ
・そもそもSVGに表現する力が足りない（グラデーションが丸と平行の２種類しかない）ので、リッチなアイコンを書く際に障害がある。SVG2.0に期待。