OmniAICreator/Qiita-1.07M huggingface dataset:
Formのローカリゼーションを一括切り替え


アプリケーション内で動的にローカリゼーションを切り替えるサンプル。
子フォームや子コントロールの言語を再帰的に更新してきます。

```cs:MainForm.cs
namespace Hoge
{
    public partial class MainForm : Form
    {
        #region メニューバー「Language」
        private void englishToolStripMenuItem_Click( object sender, EventArgs e )
        {
            // メニューバー「Language」-「English」
            Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo( "" );
            this.ChangeLanguage( this, null, Thread.CurrentThread.CurrentUICulture );
        }
        private void japaneseToolStripMenuItem_Click( object sender, EventArgs e )
        {
            // メニューバー「Language」-「Japanese」
            Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo( "ja" );
            this.ChangeLanguage( this, null, Thread.CurrentThread.CurrentUICulture );
        }
        #endregion  // メニューバー「Language」

        /// <summary>
        /// フォーム、コントロール、メニューバー、ツールバー、ステータスバーの言語を再帰的に更新する
        /// </summary>
        private void ChangeLanguage( object obj, ComponentResourceManager resources, CultureInfo culture )
        {
            if ( obj is Form ) {
                Form form = obj as Form;
                ComponentResourceManager form_resources = new ComponentResourceManager( form.GetType() );
                form_resources.ApplyResources( form, "$this", culture );
                foreach ( Form fm in form.OwnedForms ) { this.ChangeLanguage( fm, form_resources, culture ); }
                foreach ( Form fm in form.MdiChildren ) { this.ChangeLanguage( fm, form_resources, culture ); }
                foreach ( Control c in form.Controls ) { this.ChangeLanguage( c, form_resources, culture ); }
            }
            else if ( obj is ToolStripItem ) {
                ToolStripItem item = obj as ToolStripItem;
                resources.ApplyResources( item, item.Name, culture );
                if ( item is ToolStripDropDownItem ) {
                    ToolStripDropDownItem dditem = item as ToolStripDropDownItem;
                    foreach ( ToolStripItem tsi in dditem.DropDownItems ) { this.ChangeLanguage( tsi, resources, culture ); }
                }
            }
            else if ( obj is Control ) {
                Control ctrl = obj as Control;
                resources.ApplyResources( ctrl, ctrl.Name, culture );
                foreach ( Control c in ctrl.Controls ) { this.ChangeLanguage( c, resources, culture ); }
                if ( ctrl is ToolStrip ) {
                    ToolStrip ts = ctrl as ToolStrip;
                    foreach ( ToolStripItem tsi in ts.Items ) { this.ChangeLanguage( tsi, resources, culture ); }
                }
            }
        }
    }
}
```

<BR>
もっと良い方法ないかな・・・
AtCoder #4: D - 表現の自由 ( Freedom of expression )

http://arc004.contest.atcoder.jp/tasks/arc004_4

Hackageのライブラリと多倍長を使ってシンプルにしてみる。

~~~ {haskell}
import Control.Applicative
import Data.List
import Data.Numbers.Primes

main :: IO ()
main = do
  [n, m] <- map read . words <$> getLine
  let factors = group $ primeFactors $ abs n
      ans = product (map (h m . genericLength) factors) * 2 ^ (m - 1)
  print $ (ans :: Integer) `mod` 1000000007

h n r = comb (n + r - 1) r

comb _ 0 = 1
comb n m = comb (n-1) (m-1) * n `div` m
~~~
ブランドロゴのまとめ

* http://logos.heroku.com/
* https://www.facebook.com/brandpermissions/logos.php
* https://twitter.com/logo
* http://www.google.co.jp/intl/ja/permissions/geoguidelines.html
* http://mixi.co.jp/brand_guide/
* https://github.com/
	* 左上のロゴを右クリック(コンテキストメニュー表示操作)
GaucheでNクイーン

```scheme:nqueen.scm
#!/usr/local/bin/gosh

(define count 0)

(define (solve? num ls)
  (let loop ((ls ls)(n 1))
	(cond
	  ((null? ls)#t)
	  ((= (abs (- num (car ls))) n)
	   #f)
	  (else (loop (cdr ls)(+ n 1))))))

(define (check? lst)
  (let loop ((lst lst))
	(cond
	  ((null? (cdr lst))#t)
	  ((solve? (car lst) (cdr lst))
	   (loop (cdr lst)))
	  (else #f))))

(define (queen lst)
  (let loop ((lst lst)(result '()))
	(if (null? lst)
	  (and (check? (reverse result))
		   (set! count (+ count 1))
		   (print (reverse result)))
	  (for-each (lambda(x)(loop (delete x lst) (cons x result))) lst)))
  (display count)
  (newline))

(define (main args)
  (display ">> ")(flush)
  (let ((n (read)))
	(queen (iota n 0))))
```

#実行例#
>.>> 5
>(0 2 4 1 3)
>(0 3 1 4 2)
>(1 3 0 2 4)
>(1 4 2 0 3)
>(2 0 3 1 4)
>(2 4 1 3 0)
>(3 0 2 4 1)
>(3 1 4 2 0)
>(4 1 3 0 2)
>(4 2 0 3 1)
>10
++とストックをまとめてほしい

![](http://cdn-ak.f.st-hatena.com/images/fotolife/a/aereal/20120616/20120616223224.png?1339853549)

スクリーンショットを見るとわかるのですが、同じユーザが同じ投稿に対して連続で++とストックをすると、同じタイトルと本文が並んで冗長に見えます。

投稿を単位としたフィードにして、他のユーザの反応はまとめて見られると嬉しいです。
(はてなブックマークをイメージしています)

![はてブ](http://cdn-ak.f.st-hatena.com/images/fotolife/a/aereal/20120616/20120616223745.png?1339853864)
designMode="on"にしたiframeでTabやEnterを入力させないようにする


```javascript:
$("#iframeid").load(function(){
	$(this).contents().find("body").keydown(function(e){
		switch(e.keyCode){
			case 9://Tab
				return false;
			case 13://enter
				return false;
			default:
				return true;
		}
	});
});
gitサーバの構築


共同開発をすることになったので、ソース管理にgitを使うことにした。

忘備録も兼ねてメモ。

gitの共用リポジトリ作成(サーバ上で実行)
[bash]
$git --bare init
[/bash]
ローカルでgitリポジトリ作成してコミット

[bash]
$ mkdir repos
$ cd repos
$ git init
$ git add .
$ git commit -m 'first commit'
[/bash]
**ローカルリポジトリをサーバにpush

[bash]
$ git remote add origin *****@example.com:/foo/bar.git
$ git push origin master
[/bash]
gitプロトコル gitプロトコル(git://)を使うには、git-daemonを使う方法がある。 サーバ上rpmforgeをインストールして、yumのリポジトリとして追加。

[bash]
# yum install git-daemon
[/bash]
/etc/xinetd.d/gitを編集して、リスタート
github使用時のSSH public keyの作り方


githubを使うに当たってSSHのpublic keyの登録を求められたので作成。
[bash]
$ ssh-keygen -C "xxxxxxx" -t rsa
[/bash]

パスフレーズを２回求められるので、入力して生成。

生成したファイルは、ユーザのホームディレクトリの.ssh/配下にできるので、そのディレクトリ内のid_rsa.pubの内容を登録すれば完了。
init-loaderでgnupack用の設定を分離


[init-loader](http://d.hatena.ne.jp/kitokitoki/20101205/p1)を使えば、Emacsの設定ファイルを簡単に分割できる。
しかも特定の環境でのみ読み込ませる設定ファイルなんてのも簡単に作ることができ、設定ファイルを一元管理して複数の環境で使う場合などにとても便利。

init-loaderには

* Meadow (meadow-*.el)
* Carbon Emacs (carbon-emacs-*.el)
* Cocoa Emacs (cocoa-emacs-*.el)
* no-window環境 (nw-*.el)

用の設定があらかじめ用意されているが、今回これらに[gnupack](http://gnupack.sourceforge.jp/docs/latest/UsersGuide.html)用の設定を付け加えてみる。

```Lisp:init-loader.el
;; gnupack-emacs-*.el という名前のファイルのみ、gnupack Emacsで読み込む
(defcustom init-loader-gnupack-emacs-regexp "^gnupack-emacs-"
  "MinGWで起動するEmacs(gnupack)で読み込まれる設定ファイルにマッチする正規表現"
  :group 'init-loader
  :type 'regexp)

;;; Code
(defun* init-loader-load (&optional (init-dir init-loader-directory))
  (let ((init-dir (init-loader-follow-symlink init-dir)))
    (assert (and (stringp init-dir) (file-directory-p init-dir)))
    (init-loader-re-load init-loader-default-regexp init-dir t)
    ;; ~ 略 ~
    ;;---- ここから ----
    (and (string-match "mingw" system-configuration)
         (init-loader-re-load init-loader-gnupack-emacs-regexp init-dir))
    ;;--- ここまで ----
    (when init-loader-show-log-after-init
      (add-hook  'after-init-hook 'init-loader-show-log))))
```

これでinit-loaderで読み込ませるディレクトリ(デフォルトでは .emacs.d/inits)にgnupack-emacs-*.elという設定を配置すれば、gnupack Emacs起動時にのみ読み込まれることになる。
Static Site on Heroku


Herokuで静的なWebページを公開する方法です。
HerokuってApplicationServerのPaasなんで、通常、アプリケーションのルートにindex.htmlをおいてあげたとしてもクライアントから直接Getすることはできません。

なんでRubyでサーブレットを書いて（Rubyでもサーブレットっていうのかわからないのですが）公開する方法が[Static Sites with Ruby on Heroku/Bamboo](https://devcenter.heroku.com/articles/static-sites-on-heroku)に記載されています。

実際にやってみました。

```アプリケーション構成
sample
	|-config.ru
	|
	|-public
		|-index.html
		|-lib
			|-sample.js
```

use Rack::Static に登録されていないディレクトリの静的ファイルにアクセスしようとするとエラーが発生すると思います。
私の試した限りですが、「lib」を登録せずに実行した場合、sample.jsの先頭でエラーが発生し、読み込まれません。

```config.ru
use Rack::Static, 
  :urls => ["/lib"], 
  :root => "public"

run lambda { |env|
  [
    200, 
    {
      'Content-Type'  => 'text/html', 
      'Cache-Control' => 'public, max-age=86400' 
    },
    File.open('public/index.html', File::RDONLY)
  ]
}
```


今回は、Rubyをアプリケーションとして使用しますので、cedarスタックではなく、Bambooスタックを使用してください。cedarスタックではRubyは動作しません。

```commandline
//アプリケーションを作成する際はBanbooスタックに作成してください。
$heroku create sampleApp

```

後は、普通通り、アプリケーションのgitリポジトリにgit pushしてあげるだけです。
ISO8601形式の時刻をUNIXタイムスタンプに


FacebookのAPI変更で、FQLの日時フィールドの戻り値がISO8601になってしまいました。(2012/7/5現在)

というわけで、表題のことをやる方法です。簡単なのは、strtotimeに渡すだけ。

```
<?php
$dt = '2012-07-05T22:09:28+09:00';
$ts = strtotime($dt);
echo $ts; // 1341493768 と表示
```

[関数のリファレンス](http://jp2.php.net/manual/ja/function.strtotime.php)に言及がないので、ちょっとびくびくしてしまいますが、[こちら](http://jp2.php.net/manual/ja/datetime.formats.compound.php)を見ると、大丈夫そうです。

より明示的に変換するのであれば、

```
<?php
$dt = '2012-07-05T22:09:28+09:00';
$ts = DateTime::createFromFormat(DateTime::ISO8601, $dt)->getTimestamp();
echo $ts; // 1341493768 と表示
````

と書くこともできます。

## 付記
FacebookのAPIについて、Facebookアプリによって戻り値がISO8601だったり、UNIXタイムスタンプだったりするようです。下記のようにしておくと無難ですね。

```
<?php
$dt = /* FacebookからFQLで日時フィールドを取得 */;
$ts = preg_match('/^\d+$/', $dt)
	? $dt - 0
	: strtotime($dt);
echo $ts; // 1341493768 と表示
```

別解↓ ※「@」が先頭に付くと、UNIXタイムスタンプとして解釈されます。

```
<?php
$dt = /* FacebookからFQLで日時フィールドを取得 */;
$ts = strtotime((preg_match('/^\d+$/', $dt) ? '@' : '') . $dt);
echo $ts; // 1341493768 と表示
```
ContentProviderClientで高速化

JellyBeanでも関連するAPIが拡張されている、ContentProviderClientです。
軽量なクエリだとContentResolver経由で発行するより5倍ほど高速です。
詳細：http://yuki312.blogspot.jp/2012/07/androidcontentresolvercontentprovidercl.html

使い終わったらreleaseを忘れないようにします。

```java:ContentProviderClientのサンプルコード
@Override
protected void onResume() {
    super.onResume();
    initContentProviderClient();
}
 
@Override
protected void onPause() {
    super.onPause();
    releaseContentProviderClient();
}
 
private void initContentProviderClient() {
    releaseContentProviderClient();
    mContentProviderClient = getContentResolver()
            .acquireContentProviderClient(
                    ContactsContract.Contacts.CONTENT_URI);
}
 
private void releaseContentProviderClient() {
    if (mContentProviderClient != null) {
        mContentProviderClient.release();
    }
}
 
private void onUpdate() {
    Cursor c = null;
    try {
        c = mContentProviderClient.query(
                ContactsContract.Contacts.CONTENT_URI,
                null, null, null, null);
    } catch (RemoteException e) {
        // ContentProviderがDeadObject化している。
        // 必要に応じて、ContentProviderClientの再取得とリクエリを実施
        initContentProviderClient();
    } finally {
        if (c != null) {
            try {
                c.close();
            } catch (Exception e) {
                // N.O.P
            }
        }
    }
}
```
Rでパッケージがインストールされてないときだけインストールする書き方を教えてください。

今はこう書いてますが、他にいい方法ありませんか？

```r
pkg.name <- "animation"

if(length(find.package(pkg.name, quiet=TRUE)) == 0) {
  install.packages(pkg.name)
}
```

追記：

```r
if(!require("animation")){
  install.packages("animation")
}
```

これでできる。

```r
pkg.name <- "animation"
if(!require(pkg.name, character.only=TRUE)){
  install.packages(pkg.name)
}
```

パッケージ名を変数にしたい場合には `character.only=TRUE` とする。
HTML5 Canvasの描画メソッドを拡張


JavaScriptでCanvasを操作する際に、2Dコンテキストに予め定義されているrectなど基本的なものだけだと、いろいろ足りなくなってきます。[paper.js](http://paperjs.org/)や、[Kinetic.js](http://www.kineticjs.com/)など、Canvasの抽象ライブラリを導入して、そちらを拡張するのも手です。ただ、そこまでしなくても良い場合は、2Dコンテキストを拡張してしまうのが簡単です。

通常、2DコンテキストはCanvasエレメントから取得します(jQueryの場合)。

```javascript
var ctx = $('canvas')[0].getContext('2d');
```

この2Dコンテキストのプロトタイプを取得するには....

```javascript
Object.getPrototypeOf($('canvas')[0].getContext('2d'))
// あるいは、より一般的にして
// Object.getPrototypeOf(document.createElement('canvas').getContext('2d'))
```

としても取れますが、まどろっこしいですよね。[W3Cのワーキングドラフト](http://www.w3.org/TR/2dcontext/)によれば、CanvasRenderingContext2D として定義されているので、

```javascript
CanvasRenderingContext2D.prototype
```

とした方が、シンプルです。

以下、コードの例。グラフを

 ●●●●●○○○○○
 ●●●○○○○○○○
 ●●●●●●●○○○

のような形式で、Canvas上に描画できるメソッドを2Dコンテキストに追加しています。(インフォグラフィクスの一部として使う想定)

```javascript
CanvasRenderingContext2D.prototype.drawDotGraph = function(num, max, size, color, x, y) {
	this.lineWidth = 1;
	this.strokeStyle = '#999';
	for (var i = 0; i < max; i++){
		this.beginPath();
		this.fillStyle = (num > i) ? color : '#FFFFFF';
		this.arc(x + (size + 2)*i, y, 0.5*size, 0, 2*Math.PI, false);
		this.fill();
		this.stroke();
	}
};

var ctx = $('canvas')[].getContext('2d');
ctx.drawDotGraph(3, 10, 8, '#FF0000', 50, 50);
```


## 付記

1. ビルトインオブジェクトを拡張することになるので、[Googleのスタイルガイド](http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml)などに従うのであれば、ラッパークラスを書くのがベターです。
MySQL Workbench で SSH 越しに MySQL につなぐ

    [MySQL Workbench] --> [sshd] --> [mysqld]

といった構成のネットワークで、sshd には外からつながるけど、mysqld には外からつなげない場合に、MySQL Workbench でどうつなぐか、という話です。突き詰めていくと SSH の話になるのですが。

「mysql workbench ssh」といったキーワードでググったら http://php-tips.com/server/2011/05/mysql-workbench-with-ssh-connection がヒットしたんですが、パッと見このサイトは

    [MySQL Workbench] --> [sshd, mysqld]

という構成にしか通用しないように見えました。が、先述した sshd と mysqld が別々に立っている構成でも通用するようです。

ただし、注意点として、ポートフォワーディングを有効にしてやる必要があります。 .ssh/authorized_keys に no-port-forwarding が付いてたり、/etc/ssh/sshd_config で  AllowTcpForwarding no とされていたりするとアウトです。参考にしたサイトを見ただけではここが分からず、しばらくハマってしまいました。

SSH 周りの問題だろうなーと思って /var/log/secure を見たら

> Received request to connect to host xxxxx.example.com port 3306, but the request was denied.

といったログが出てたので、「but the request was denied.」でググったら http://wiki.metawerx.net/wiki/SSHTunnelTroubleshooting がヒットして解決に至ったわけです。

ちなみに、実際どういうシチュエーションでこれにハマったかというと、Amazon VPC 内の RDS に MySQL Workbench でつなぎたいなーという話からでした。
シンメトリー

対称性のある式の例

```c
main()
{
  int a[]={1,10,100};;
  int p=2;
  int * q=a;
  int x=1;
  int o=2;
  struct s{ int x; };
  struct s * d=0;
  int b=3;
  int l=4;
  o=!(--p*!*q--)!=o;
  (p*=x=*q);
  ++p**q++;
  l<d->x|x<-b>l;
}

```

意味は無い。
カーソル位置を記録してハイライトする

ファイル内でカーソル位置を記憶して、いきいきできるようにします。さらに記憶したカーソル位置をハイライトします。

インストールします。


```
M-x install-elisp http://cvs.savannah.gnu.org/viewvc/*checkout*/bm/bm/bm.el
```

下記を設定ファイルに追加します。

```common-lisp:.emacs.d/init.el
(setq-default bm-buffer-persitence nil)
(setq bm-restore-repository-on-load t)
(require 'bm)
(add-hook 'find-file-hooks 'bm-buffer-restore)
(add-hook 'kill-buffer-hook 'bm-buffer-save)
(add-hook 'after-save-hook 'bm-buffer-save)
(add-hook 'after-revert-hook 'bm-buffer-restore)
(add-hook 'vc-before-checkin-hook 'bm-buffer-save)
(global-set-key (kbd "M-SPC") 'bm-toggle)
(global-set-key (kbd "M-[") 'bm-previous)
(global-set-key (kbd "M-]") 'bm-next)
```

`M-SPC (bm-toggle)`でその行をハイライトします。`M-[ (bm-previous)`で前の印へ、`M-] (bm-next)`で次の印へ移動します。

上記の設定でEmacsを終了しても印は記録されます。


## 参考

「Emacsテクニックバイブル」P116
ECMA-262 (5th|Harmony|next) で宣言された プロトタイプ の拡張はアリ？ナシ？

気になっているので質問スレ。

## 現況
現在、Webブラウザで実行する JavaScript における状況は基本 ECMA-262 3rd Edition 標準の実装を元にコーディングされ、開発者は(JScript|JavaScript)の実装間の差異などを自分でラッパーを書くか jQuery などでラップして開発をしているかと思います。

そして、ほぼ自動アップデートされるようになった Firefox, Chrome, Opera は着実に 5th Edition の仕様を実装しつづけており、canvas, CSS 3 もデモンストレーションの段階から、商用サイトでも利用されるようになってきています。

後押しするように、スマートフォン向けのブラウザも、HTML 5, CSS 3 がレンダリング(ベンダープレフィックスはつくものの)でき、5th Edition の実装も一部利用できるよう展開されています。

## 標準ライブラリへの拡張とプロトタイプ汚染
そこで気になるのが、IE 7,8,9 を始め、古いバージョンのブラウザの為に、ECMA Script の次世代仕様を実装することの是非です。

Prototype.js の流行の反動で、「標準ライブラリへのプロトタイプを書き換えるのは弊害があるので避けるべきなのでは」という流れがありました。Google JavaScript Style Guide でも「[ビルトインオブジェクトのプロトタイプの書き換えはしてはならない](http://cou929.nu/data/google_javascript_style_guide/#id23)」としています。

## 「もう既に実装済みのブラウザもあるし、追加しても”汚染”と呼ばなくてもよい」？
例えば

+ `Array.prototype.forEach`
+ `Array.prototype.every`
+ `Object.defineProperty`
+ `Function.prototype.bind`

などは Chrome や Firefox で実装済みであり、古いブラウザ向けに拡張しても、これまで語られてきた問題の対象になるのか？という疑問があります。

## 実装の実例
例えば `Array.prototype.reduce` は [MDNでこう紹介されています](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce)

``` javascript
if (!Array.prototype.reduce) {  
  Array.prototype.reduce = function reduce(accumulator){  
    if (this===null || this===undefined) throw new TypeError("Object is null or undefined");  
    var i = 0, l = this.length >> 0, curr;  
  
    if(typeof accumulator !== "function") // ES5 : "If IsCallable(callbackfn) is false, throw a TypeError exception."  
      throw new TypeError("First argument is not callable");  
  
    if(arguments.length < 2) {  
      if (l === 0) throw new TypeError("Array length is 0 and no second argument");  
      curr = this[0];  
      i = 1; // start accumulating at the second element  
    }  
    else  
      curr = arguments[1];  
  
    while (i < l) {  
      if(i in this) curr = accumulator.call(undefined, curr, this[i], i, this);  
      ++i;  
    }  
  
    return curr;  
  };  
}
```
この場合、`Array.prototype.reduce` がサポートされていないブラウザでのみ、実行されるようになっています。

## 自分の考える メリット・デメリット・やっても良い理由
### メリット
1. ビルトインオブジェクトの汎用性が高まって便利
1. コードを全体で見た時にブラウザ間の違いによる条件分岐が減り、統一感が保たれる
1. 3rd Edition で問題視されていた部分の解決が図られる
1. 既存の js フレームワークへの疎結合を図れる

### デメリット
1. 未サポートブラウザのシェアが減るほど、デッドコード化する
1. 自分のビルトインへの実装が間違っている可能性
1. 手がけたものが息が長いライブラリであった場合、技術的負債を抱える可能性
1. まだ仕様が最終勧告でないものは書き直しになる可能性

### やってもよい理由
1. 実質 Polyfill (新しい環境を基準に、古い環境へは新しい環境に近づけて差をなくす) な Web デザインがスタンダードになっている
1. 既にサポートされているブラウザにとってパフォーマンスが低下する大きな原因となるものではない
1. 少なくとも 5th Edition は既に仕様策定済みなので、これから仕様が変更される心配は無い
1. 実装したプロダクトのライフサイクルが短ければデメリットの 3, 4 は杞憂では

## メリット・デメリット についてコメントください
よろしくおねがいします
Xcode: NSLog() の入力が捗る Code Snippet

ショートカット`log`で登録、補完メニューは `control` `P` / `control` `N` で移動、Tab 等でプレースホルダを選択。

```objectivec
NSLog(@"%@", <#obj#>); // Object ダンプ
NSLog(@"%s", __PRETTY_FUNCTION__); // 現在地のクラス名、メソッド名出力
NSLog(@"%s|%@", __PRETTY_FUNCTION__, <#obj#>); // 現在地のクラス名、メソッド名出力 + Object ダンプ
NSLog(@"%d", <#int#>); // Integer 出力
NSLog(@"%ld", <#long#>); // long 出力
NSLog(@"%qi", <#longlong#>); // long long 出力
NSLog(@"%lld", <#longlong#>); // long long 出力
NSLog(@"%f", <#float#>); // float 出力
NSLog(@"%lf", <#double#>); // double 出力
NSLog(@"CGRect: %@", NSStringFromCGRect(<#rect#>)); // CGRect 出力
NSLog(@"CGSize: %@", NSStringFromCGSize(<#size#>)); // CGSize 出力
NSLog(@"CGPoint: %@", NSStringFromCGPoint(<#point#>)); // CGPoint 出力
```
Ruby の what_methods で標準出力を抑制する

what_methods は，やりたいことが決まっているのに，それに使用するメソッド名がわからないときに非常に便利なツール．入力と出力を与えると，その変換を行えるメソッドを一覧表示してくれる．こんな感じ．

```ruby
(0..3).what? [0, 1, 2, 3]       # => [:to_a, :entries, :sort]
# >> 0..3.to_a == [0, 1, 2, 3]
# >> 0..3.entries == [0, 1, 2, 3]
# >> 0..3.sort == [0, 1, 2, 3]
```

このように，返り値としてメソッドの配列が，標準出力として入力にメソッドを適用した結果を表示してくれる．インストールは `gem install what_methods` するだけ．GitHubリンク → https://github.com/BMorearty/what_methods

これをソースコードに組み込むときに標準出力はいらなかったので，silent_what? を定義してみた．

```ruby
require 'what_methods'

class Object
  def silent_what?(*a)
    WhatMethods::MethodFinder.find(self, *a)
  end
end

(0..3).silent_what? [0, 1, 2, 3] # => [:to_a, :entries, :sort]
```

これで返り値が返ってくるのみとなった．コード内で使うなら `WhatMethods::MethodFinder.find` を直接呼び出すのがいいんだろうけどね．どちらかと言うと，irb で使うときにメソッドの配列だけでいいという人におすすめかな．

どうでもいいけど，bool を返さないのに末尾が '?' ってどうなの．
Objective-Cの文法メモ

###文字列操作
```obj-c:
// 結合
NSMutableString * string = [NSMutableString stringWithString:@"aaa"];
NSString *joined = [string appendString:@"bbb"];

// 配列を結合
NSArray *array = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];
NSString *joined = [array componentsJoinedByString:@","];

//配列に分割
NSString * string = [NSMutableString stringWithString:@"aaa,bbb,ccc"];
NSArray *record = [string componentsSeparatedByString:@","];

// 長さ
int length = [@"abcdef" length];

//切り出し
NSString *string = [@"abcd" substringWithRange:NSMakeRange(0, 2)];

//検索
NSString *string = @"abcd";	
NSRange range = [string rangeOfString:@"cd"];
NSLog(@"%d:%d", range.location, range.length);
```

###配列
```obj-c:
// 作成
NSArray* array = [NSArray arrayWithObject:string];
NSArray* array = [NSArray arrayWithObjects:@"A", @"B", @"C", nil];

// 取得
NSString* thirdObj = [array objectAtIndex:2];
for (NSString* string in array) {
    NSLog(string);
}

// 追加
NSMutableArray* array = [NSMutableArray array];
[array addObject:@"A"]; 
NSArray* arrayB = [NSArray arrayWithObjects:@"B", @"C", @"D", nil];
[array addObjectsFromArray:arrayB];

// 挿入
[array insertObjects:@"E" atIndex:0];

// 置換
[array replaceObjectAtIndex:1 withObject:@"F"];
```
###辞書
```obj-c:
// 作成
NSDictionary* dic = [NSDictionaryWithObject:@"Taro" forKey:@"name"];

// 追加
NSDictionary * dic = [NSDictionary dictionary];
[dic setObject:obj ForKey:@"key"];

// 取得
NSString* str = [dic objectForKey:@"key"];
for (id key in dic) {
    NSLog(@"key: %@, value: %@\n", key, [dic objectForKey:key]);
}
```

###例外処理
```obj-c:
@try {
    // something
}
@catch (NSException *e) {
    NSLog(@"Error: %@: %@", [e name], [e reason]);
}
@finally {
    // something
}
```
```obj-c:
NSException *exception = [NSException exceptionWithName:@"hoge" reason:@"foo" userInfo:nil];
@throw exception;
```
UPナビゲーションの実装と独自カスタマイズ方法

JellyBean以降、UPナビゲーションを独自カスタマイズするにはActivity.onPrepareNavigateUpTaskStackをオーバーライドします。
詳細：http://yuki312.blogspot.jp/2012/07/androidup.html

互換ライブラリのTaskStackBuilderとNavUtilsを使用したUPナビゲーション実装は下記。

```java
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            Intent upIntent = new Intent(this, ParentActivity.class);
            if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
                // 下記のような状態のバックスタックを生成
                // | ParentActivity            | (peek)
                // |---------------------------|
                // | GrandParentActivity       |
                // |---------------------------|
                // | GreateGrandParentActivity |
                // |---------------------------|
                TaskStackBuilder.from(this)
                        .addNextIntent(new Intent(this, GreatGrandParentActivity.class))
                        .addNextIntent(new Intent(this, GrandParentActivity.class))
                        .addNextIntent(upIntent)
                        .startActivities();
                finish();
            } else {
                // ParentActivityは自タスク上に生成される。
                // シンプルなUPナビゲーション
                NavUtils.navigateUpTo(this, upIntent);
            }
            return true;
    }
    return super.onOptionsItemSelected(item);
}
```
Scalaでファイル出力を少し簡単にする．

Scalaで入力を取るとき，普通はscala.io.Sourceあたり，もしくはJavaのライブラリ(java.io.*)を使えるのですが，ファイル出力をしたいとき，いちいちJavaのライブラリを使うのが面倒だなぁ…という場合が多いと思います．そこで面倒なときにはファイルにリダイレクトするような感じで出力するようにしました．

## ファイルに出力する

```scala:sample.scala
import scala.sys.process._
import java.io.File

// 出力先のファイル
val f = new File("output.txt")
val list = List("String1", "String2", "String3")
for (element <- list){
  "echo %s".format(element) #>> f!
}
```

ファイルoutput.txtに出力されます．

## 参考: 入力をファイルから

```scala:ReadInput.scala
import scala.io.Source
val source = Source.fromFile("input.scala")
for( line <- source.getLines ) {
  println( line.stripLineEnd )
}
source.close
```

## メモ
もう少し真面目に便利な使い方を紹介(http://d.hatena.ne.jp/kmizushima/20110510/1304985703)
lp_solveを用いたNクイーン問題の解の探索

Nクイーン問題のような問題は自分で探索プログラムを書くと探索空間が広くなりがちでなかなか解が見つけられなかったりします．そうでなくても書くのが面倒です．そういう時には線形計画法ソルバー(lp_solve)やSATソルバー(Sugar)などが便利です．今回は簡単にインストールできるlp_solveを用いてNクイーン問題を解きましょう．

#解決法
まずlp_solveをインストールしてください．MacならMacPortsで，Ubuntuならaptで入ると思います．そして下記PHPプログラムをn-queen.phpで保存します．

```php

<?php
$n = 8;
$conditions = array('x4y5'); // すでに置いているところを指定 (盤面は1-origin)

$constraints = array();
$variables = array();
for ($y = 1; $y <= $n; $y++) {
	for ($x = 1; $x <= $n; $x++) {
		$v = sprintf('x%dy%d', $x, $y);
		$variables[] = $v;
		$constraints["row$y"][] = $v; // 横方向の制約
		$constraints["col$x"][] = $v; // 縦方向の制約
		$constraints['~add' . ($x + $y)][] = $v; // 斜め方向(／)の制約
		$constraints['~sub' . ($x - $y)][] = $v; // 斜め方向(＼)の制約
	}
}
ksort($constraints);
echo 'max: ' . implode('+', $variables) . ";\n";
foreach ($conditions as $condition)
    echo "$condition=1;\n";
foreach ($constraints as $constrain)
    echo implode('+', $constrain) . "<=1;\n";
echo 'int ' . implode(',', $variables) . ";\n";
```

## 実行方法
```sh
$ php n-queen.php | lp_solve | grep '1$'
x2y1                            1
x6y2                            1
x1y3                            1
x7y4                            1
x4y5                            1
x8y6                            1
x3y7                            1
x5y8                            1
```

これで7つの配置がわかりました．

## 別解の探索
もし別の解が知りたければ，

```
x2y1+x6y2+x1y3+x7y4+x4y5+x8y6+x3y7+x5y8<8;
```

という行でもn-queen.phpの出力に加えておくと良いでしょう．
PHPで、配列にキャストしたオブジェクトのプロパティからクラス名を取り除く

オブジェクトを配列にキャストすると、連想配列のキーにクラス名が入ってしまうので、
それを取り除くコード。よく使う割には意外と忘れやすいので共有。

``` php
$pre_array_object = (array)$original_object;
$array_object = array();
foreach ($pre_array_object as $key => $value) {
	$splited_key = preg_split("/[\\x0]/", $key); // 配列化すると"\u0000クラス名\u0000キー名"となるため処理
	$array_object[$splited_key[2]] = $value;
}
```
osx で dnsmasq を homebrew で入れてみる


## 前提条件

* homebrew

## インストール

```bash:
brew install dnsmasq
```

## 設定

設定ファイルの雛形を利用する

```bash:
cp `brew --prefix dnsmasq`/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
```

## LaunchDaemons から起動する

```bash:
sudo cp `brew --prefix dnsmasq`/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
```

## 試してみる

同一のマシンからだと確認がしにくいので、別のマシンから試す方がいいです。

どうしても自分のマシンから試す場合には、dnsmasqが利用する resolv.conf を変更しておかないと、循環参照に陥ってしまいます。

```dnsmasq.conf
resolv-file=/etc/resolv.conf.dnsmasq
```

osx では、/etc/resolv.conf を書き換えても意味はなく、「システム環境設定>ネットワーク」からDNSサーバを変更する必要があります。

### DNS キャッシュをクリアする

動作確認する前に、DNS キャッシュをクリアしておくとよいでしょう

```bash:
sudo dscacheutil -flushcache
``` 

### 確認する

ping を打つなり host コマンドを使うなりしましょう。

```bash:
% host hogegege
host hogegege
hogegege has address 127.0.0.1
```

ただし注意しないといけないのは、検索ドメインが設定されていると、hogegege はドメインをつけて検索されるので、 /etc/hosts にドメイン付きで記述するか、検索ドメインの設定を外すかが必要です。

この動作は/etc/hostsでの解決と異なるので、ハマリがちです。

## /etc/hosts 等を変更したら

dnsmasqの再起動が必要です。

```bash:
sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
```

また、クライアント側でキャッシュをクリアしておくとすぐ確認できます
LINQで7クイーン(書類選考無し＆高級うなぎGET)

[問題はこちら](http://tech-gym.com/2012/07/%E6%9C%AA%E5%88%86%E9%A1%9E/786.html)。
[実行結果はこちら](http://ideone.com/UtOU8)。

```c#:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;

struct Queen
{
  public int X;
  public int Y;
  public Queen(int x, int y)
  {
    this.X = x;
    this.Y = y;
  }
  public bool IsMovable(Queen q)
  {
    return (this.X == q.X) || (this.Y == q.Y) || this.IsDiagonal(q);
  }
  public bool IsDiagonal(Queen q)
  {
    var diffX = this.X - q.X;
    var diffY = this.Y - q.Y;
    return (diffX == diffY || diffX == -diffY);
  }
}

class Program
{
  static void Main()
  {
    var letters = new string[]
    {
      "lhikoav",
      "rqsczlp",
      "uwalnfo",
      "tykajeh",
      "ahitsyd",
      "efoptxn",
      "ruzwyve"
    };
    var result =
      from q1 in Enumerable.Range(1, 7).Select(x => new Queen(x, 1))
      from q2 in Enumerable.Range(1, 7).Select(x => new Queen(x, 2))
      from q3 in new Queen[] {new Queen(3, 3)}
      from q4 in Enumerable.Range(1, 7).Select(x => new Queen(x, 4))
      from q5 in new Queen[] {new Queen(4, 5)}
      from q6 in Enumerable.Range(1, 7).Select(x => new Queen(x, 6))
      from q7 in Enumerable.Range(1, 7).Select(x => new Queen(x, 7))
      let queens = new Queen[] {q1, q2, q3, q4, q5, q6, q7}
      where Combinations(queens).All(t => !t[0].IsMovable(t[1]))
      select new string((from q in queens
                         orderby q.X * q.Y
                         select letters[q.Y - 1][q.X - 1])
                        .ToArray());
    foreach (var s in result)
      Console.WriteLine(s);
  }

  static IEnumerable<T[]> Combinations<T>(IEnumerable<T> source)
  {
    var list = new List<T>(source);
    for (var i = 0; i < list.Count; i++)
      for (var j = i + 1; j < list.Count; j++)
        yield return new T[] {list[i], list[j]};
  }
}
```
jQueryとiFrame,FrameSetのイベントバインド処理について

iframeやframesetで構成されるサイトで各ページにjqueryを使う時の注意。
イベントバインド処理を子ページの$(document).ready(function());の中で行い、
他のフレームからjavaScriptでフレームソースを動的に書き換える処理(ページ遷移)すると確実にメモリリークする。(FirefoxとIE6)

子フレーム内のページではjQueryオブジェクトを使わず、
window.onload = function(){イベントバインド処理};
window.onunload = function(){イベントバインド解除処理};を行う。

onloadなどでバインドしたイベントは必ずアンバインドする。しないとメモリリーク。
Google Chromeの最新版はここら辺をクレバーに処理してくれてますが。

常識だったらすみません。
screenに名前を付ける

screenのセッションを立ち上げて、プロジェクト毎にEmacsやらを立ち上げて開発をしています。

`screen -ls`をしたときにどれがどれだかよくわからなくなってきたので、screenのセッションに名前をつける方法をまとめます。

## screen起動時にセッション名を付ける

```
$ screen -S セッション名
```

## 起動してあるscreenに名前を付ける

screenで`^A + :`を実行し、コマンドモードにする。`:sessionname セッション名`を入れる。
Railsプロジェクトでpryを使う

最近ようやくpryを使い始めました。Railsでpryを使う際に`pry -r ./config/environment`としていたのですが`reload!`ができず、不便だったのでその対処をまとめておきます。

※ここでは、`Gemfile`に追加しない方法をご紹介します。もし、`Gemfile`に追加するのであれば、[こちら](http://qiita.com/items/2b36068cdf2e40e75c2d)を参照してください。`Gemfile`に追加する方が`binding.pry`とか使えるので便利です。

まずは、関連するgemをいれます。

```bash:gemを追加
$ gem install pry pry-doc pry-rails
```

設定ファイルを作成します。

```ruby:~/.pryrc
# Load plugins (only those I whitelist)
Pry.config.should_load_plugins = false
Pry.plugins["doc"].activate!

# Launch Pry with access to the entire Rails stack.
# If you have Pry in your Gemfile, you can pass: ./script/console --irb=pry instead.
# If you don't, you can load it through the lines below :)
rails = File.join Dir.getwd, 'config', 'environment.rb'

if File.exist?(rails) && ENV['SKIP_RAILS'].nil?
  require rails
  
  if Rails.version[0..0] == "2"
    require 'console_app'
    require 'console_with_helpers'
  elsif Rails.version[0..0] == "3"
    require 'rails/console/app'
    require 'rails/console/helpers'
  else
    warn "[WARN] cannot load Rails console commands (Not on Rails2 or Rails3?)"
  end
end

# for Rails 3.2+
if defined?(Rails) && Rails.env
  extend Rails::ConsoleMethods
end
```

これで、Railsプロジェクトのルートで`pry`を実行します。

```
$ pry
```
Windows+Emacs+xmpfilter を改行コード LF の環境で使用する

xmpfilter は Ruby 開発に非常に便利なツール。「コード # =>」と記述している行の末尾に，その行の返り値を出力してくれる．Emacs or Vim + Ruby な人はたいてい使っているんじゃないだろうか。

```ruby
1 + 2                           # => 3
[1, 2, 3].map {|i| i + 3}       # => [4, 5, 6]
3 == 5                          # => false
```

興味があれば是非使ってみて欲しい。
はてなキーワード → http://d.hatena.ne.jp/keyword/xmpfilter


さて、本題に移ろう。この xmpfilter、Windows の Emacs で改行コードが LF の環境で使用すると、改行コードを CR+LF に変換して返してくる。これは Ruby が Windows では '\n' を CR+LF と認識するためである。

この問題は xmpfilter のソースコードを少し弄るだけでなんとかなる。rcodetools-0.8.5.0/bin/xmpfilter の最終行を以下のように変更すればいい。

```ruby
# Do the job. dispatched by klass.
# puts klass.run(targetcode, options)
$stdout.binmode.puts klass.run(targetcode, options)
```

しっかりテストしたわけでもないが、今のところは期待通りに動いている。同じ症状に困っている人がいれば参考にどうぞ。
MVC is dead, it's time to MOVE on.

MVCの時代は終わり、MOVEという新しいデザインパターンを使ったらどうか？という記事が関心を集めているようです。

![MVC is dead, it's time to MOVE on.](http://cirw.in/images/move.jpg)

[MVC is dead, it's time to MOVE on.](http://cirw.in/blog/time-to-move-on) 

* [ふじこのプログラミング奮闘記](http://blog.neo.jp/dnblog/index.php?module=Blog&action=Entry&blog=pg&entry=3442&rand=6f82e) - 翻訳
* [[翻訳]MVCは死んだ。MOVEするときがきた](http://d.hatena.ne.jp/nowokay/20120704#1341366107) - 翻訳その2
* [はてブの反応](http://b.hatena.ne.jp/entry/cirw.in/blog/time-to-move-on) 

確かにModelとViewはよく分かるけど、Controllerって何なんだろう？と思うことはよくあった気がします。自分の場合MとVは意識するけどそれ以外の部分がコントローラでそんなに意識していない、みたいなイメージ。曖昧なコントローラ部分をオペレーションとイベントに分離して書くといいよ、みたいな主張なのかな？(まだ読み切れていない)

内容とは別に感心したのが、記事を[CC BY 3.0](http://creativecommons.org/licenses/by/3.0/deed.ja) ライセンスで提供している所。おかげで色々な人が(作者の許諾プロセスを踏まずに)自由に翻訳文をアップ出来たりするのが素晴らしい。

Qiitaコミニュティの皆さんの感想を聞きたい所です。
aws-s3を使ってS3上のファイルの期限付きURLを発行する方法


AWSのS3の機能として一定期間のみ有効なURLを発行することが出来る。これをaws-s3(http://amazon.rubyforge.org/) を利用して発行する方法

```ruby:ex)　mybuckets/example.txtに対する30秒で失効するURLを発行
require 'rubygems'
require 'aws/s3'

include AWS::S3

BUCKET_NAME = 'mybuckets'

Base.establish_connection!(
  :access_key_id => "Input Your Access Key",
  :secret_access_key => "Input Your Secret Access Key"
)

example = S3Object.find 'example.txt', BUCKET_NAME
url = example.url(:expires_in => 30)
```
タームのスラッグを取得する

タクソノミー（taxonomy-xxx.php）・投稿記事（single-xxx.php）・ループ内でタームのスラッグを取得する関数。
※投稿記事のターム選択は単一でお願いします。

## Source Code

```php5:functions.php
<?php
function get_current_terms_slug($args){
  $defaults = array(
    'taxonomy' => '',
    'loop' => false
  );
  $args = wp_parse_args($args, $defaults);
  extract($args, EXTR_SKIP);

  if(is_tax() && !$loop){
    $terms = get_query_var('term');
    if($terms && !is_wp_error($terms)){
      $result = $terms;
    }
  }elseif(is_single() || $loop){
    $terms = get_the_terms(0, $taxonomy);
    if($terms && !is_wp_error($terms)){
      $term = reset($terms);
      $result = $term->slug;
    }
  }

  if($result){
    return esc_html($result);
  }
}
?>
```


## Usage
`<?php get_current_terms_slug( $args ); ?>`


## Default Usage

``` php
<?php $args = array(
  'taxonomy' => ,
  'loop' => false
);
?>
```


## Examples

``` php:archive-xxx.php/single-xxx.php
<?php echo get_current_terms_slug('taxonomy=xxxx&loop=true'); ?>
```
ccchartサイトのfont-sizeメディアクエリやめてJSでモバイル対応してみた

ccchart http://jsgt.org/c/ のfont-sizeがiPhoneで見た時にはみ出してしまうので、最初

```
@media screen and (max-width: 740px) {
    .hogegoge {
        font-size: 0.6rem;
    }
}
```

みたいな処理を試したんだけどうまくいかなくて、結局こうした。

```
window.addEventListener('load', function () {

    if (isMobile()) {
        var targets = document.querySelectorAll('.hogehoge');
        for (var i = 0; i < targets.length; i++) {
            targets[i].style.fontSize = '0.6rem';
        }
    }
});

function isMobile() {
    var ua = navigator.userAgent.toLowerCase();
    var match = /(android|iphone|ipad|iemobile)/.exec(ua);
    return match ? match[0] : null;
}
```
メディアクエリうまくいかないこと多い。
javascriptを使って，htmlで数式を出力

```html
<script type="text/javascript">
var tex=encodeURIComponent("y=ax+b");
document.write("<img src=\"http://chart.apis.google.com/chart?cht=tx&chl="+tex+"\"/>")
</script>
```

こんな感じでいけるっぽい．
これとdeck.jsを組み合わせれば，もはやPowerPoint必要なくなるのでは！
UIScrollView を無限ループさせる

UIScrollView にはループ機能は無いのでスクロールのタイミングでサブビューを再配置＋スクロールのオフセットを戻して擬似的にループを再現させる方法がよく取られます。

例えば、


- UIScrollView の中に5つの subview があり、

![My cool picture](http://resources.qnote.jp/qiita/infinite-scroll-view-1.png)


- 右にスワイプしたとします。

![My cool picture](http://resources.qnote.jp/qiita/infinite-scroll-view-2.png)


- スクロールが止まったらすぐに一番右のサブビューを抜き出して、一番左になるよう全ての subview を再配置。(A) 

![My cool picture](http://resources.qnote.jp/qiita/infinite-scroll-view-3.png)


- それと同時にスクロールオフセットを元の位置に戻す。(B) 

![My cool picture](http://resources.qnote.jp/qiita/infinite-scroll-view-4.png)

- 1サイクル完成。

![My cool picture](http://resources.qnote.jp/qiita/infinite-scroll-view-5.png)


これを繰り返せば無限ループしているように見えます。
(A) と (B) の処理を一瞬で行うため、subview の数によっては描画が追いつかないので、pagingEnabled = YES にして、かつ UIScrollView のデリゲートメソッド scrollViewDidEndDecelerating: の中で (A)+(B) の処理をすればスムーズに見えます。


拙作の InfiniteScrollView を使うと簡単。

■ GitHub InfinitePagingView
https://github.com/caesarcat/InfinitePagingView


- 使い方

```Objective-C

#import "InfinitePagingView.h"
 :
 :
/* インスタンス作成 */
InfinitePagingView *pagingView = [[InfinitePagingView alloc] initWithFrame:frame];
[self.view addSubview:pagingView];

/* サブビュー作成 */
UIImageView *page1 = [[UIImageView alloc] initWithImage:image1];
/* ページとして追加 */
[pagingView addPageView:page1];
    :
    :
/* 最低5個は必要 */

```

![Screenshot0](http://resources.qnote.jp/qiita/infinite-scroll-view-sample-1.png)

- AppStore のスクリーンショット風に1ページあたりのサイズ指定も可能

```Objective-C

/* インスタンス作成 */
InfinitePagingView *pagingView = [[InfinitePagingView alloc] initWithFrame:frame];
/* 1ページあたりのサイズを指定 */
pagingView.pageSize = CGSizeMake(120.f, 100.f);


```

![Screenshot0](http://resources.qnote.jp/qiita/infinite-scroll-view-sample-2.png)

- 縦スクロールも可能

```Objective-C

/* インスタンス作成 */
InfinitePagingView *pagingView = [[InfinitePagingView alloc] initWithFrame:frame];
/* 1ページあたりのサイズを指定 */
pagingView.pageSize = CGSizeMake(120.f, 100.f);
/* スクロール方向を垂直に指定 */
pagingView.scrollDirection = InfinitePagingViewVerticalScrollDirection;

```
![Screenshot0](http://resources.qnote.jp/qiita/infinite-scroll-view-sample-3.png)
hostsファイルに列挙されたアドレスへのpingチェック

$ grep -v \# /etc/hosts | grep -v 127 | awk '{print $1}' | ./pinger.sh

$ cat pinger.sh
#!/bin/sh
trap 'exit 1' 2
while read host
do
	ping -o -t 1 $host > /dev/null
	if [ $? == 0 ]
	then
		echo "$host OK"
	else
		echo "$host NG"
	fi
done
shell scriptで対話式で処理を進めるメモ


```shellscript
#!/bin/sh

while read -p "Do you want to move the www directory?[y/n] " yn ; do
    case $yn in
        [Yy]* ) {
            echo ----------------------
            echo "       MOVING"
            echo ----------------------
            mv www www2
            mv www2/build/production www
            rm -dR www2/build www2/archive
            exit
        };;
        [Nn]* ) exit;;
        * ) echo "Please answer yes or no.";;
    esac

done

```

read [変数名]
で標準入力からの入力を変数に格納する。

case文は、各パターンを完全一致か部分一致（正規表現）で記述する。

```shellscript
case [変数] in
	パターン1) ;; #処理1
	パターン2) ;; #処理2
	* ) ;; #なにも入力されなかったとき
esac
```
iOS: JMImageCache でラクラク画像非同期取得＋キャッシュ


最近お世話になることが多いので、この際情報をまとめておきたい。

## 概要
GitHub: https://github.com/jakemarsh/JMImageCache


* GCD で画像を非同期取得
* NSCache ベースのキャッシュ機構（サブクラス）
* キャッシュ時のキーは URL
* シングルトン
* Blocks
* デリゲート通知
* MIT LICENSE

## 追記：12.10.03
Blocksでコールバック返ってくるようになってた。

```objectivec

- (void)imageForURL:(NSURL *)url key:(NSString *)key completionBlock:(void (^)(UIImage *image))completion;
- (void)imageForURL:(NSURL *)url completionBlock:(void (^)(UIImage *image))completion;

```

## 画像を取得
`UIImage *image = [[JMImageCache sharedCache] imageForURL:@"http://URL.jpg" delegate:OBJ];`

非同期で実行され、ダウンロードとキャッシュが完了したらデリゲートに通知が来る。既にキャッシュがあれば UIImage が即返る。
シングルトンなのでデリゲートが途中で変わったりする可能性もあるが、その場合はたぶん通知せずに終わる。

通信は単純に `[NSData dataWithContentsOfURL:URL];` で行っている。同期処理だが、GCD なので非同期。
もし NSURLRequest を使いたいなら、この部分を NSURLConnection の同期処理に書き換えてしまえば良い。その場合返り値は NSData なので1行書き換えるだけで済む。

## キャッシュ削除
__すべて削除__
`[[JMImageCache sharedCache] removeAllObjects];`

__特定のキャッシュを削除__
`[[JMImageCache sharedCache] removeImageForURL:@"http://URL.jpg"];`

キャッシュファイルが `/Library/Caches/JMCache/` にあるので、これも削除するように実装を変えた方がいいかもしれない。
Ruby のクラスメソッド定義まとめ

クラスメソッドは特異メソッドやシングルトンメソッドとも呼ばれる，インスタンスではなくクラス本体に紐付けられるメソッドです．
C++ や Java などでいう static メソッドのような感じのものです．

##一番オーソドックスなやり方

```ruby
class Hoge
  def self.hoge
    "hoge"
  end
end

# クラス名を直接指定して呼び出し
Hoge.hoge #=> "hoge"

# ::を使っても OK
Hoge::hoge #=> "hoge"
```

頭に self. を付けます．
あまり使わないですが，外からでも定義できます．

```ruby
def Hoge.huga
  "huga"
end

Hoge.huga #=>"huga"
```

クラス定義スコープ内では`self`が定義するクラス自身を指すため，`self.hoge`で良かったですが，外から定義するときは直接クラス名を指定する必要があります．
また，クラス`Hoge`は定義済みである必要があります．

##複数定義する時
毎度頭に`self.`を付けるのが面倒な場合は

```ruby
class Hoge
  class << self
    def hoge
      "hoge"
    end

    def piyo
      "piyo"
    end
  end
end

Hoge.hoge #=> "hoge"
Hoge.piyo #=> "piyo"
```

のように書けます．
これは1つ上のものと同様にクラス定義スコープ外でも定義できます．

```ruby
class << Hoge
  def hoge
    "hoge"
  end

  def piyo
    "piyo"
  end
end
```

更に，`Hoge` がモジュールの場合は `extend`を使って書くことができ，

```ruby
module Hoge extend self
  def hoge
    "hoge"
  end

  def piyo
    "piyo"
  end
end

Hoge.hoge #=> "hoge"
Hoge.piyo #=> "piyo"
```

と書けます．
`class << self` に比べてインデントが深くならないので，module の場合はこちらのほうがおすすめです．

##外の変数を取り込んで定義
あまりないですが，外の変数を取り込んで定義したい場合は`define_singleton_method`メソッドが使えます．

```ruby
class Hoge
  a = 3
  define_singleton_method :hoge do
    a
  end
end

Hoge.hoge #=> 3
```

また，クラス定義スコープ外でも定義できます．

```ruby
class Hoge
  # クラス定義スコープ
end

m = "hello "

Hoge.define_singleton_method :greet do |i|
  m * i
end

Hoge.greet 3 #=> "hello hello hello "

m = "goodby "
Hoge.greet 2 #=> "goodby goodby "
```
クラスメソッド定義のイディオム 

この記事は[Ruby開発環境 Advent Calendar / Jul.](http://qiita.com/advent-calendar/ruby-devenv)の4日目の記事です．
3日目は[okitan](http://qiita.com/users/okitan)さんの[テストの自動実行あれこれ](http://qiita.com/items/25238a9b836c14d52cbd)でした.

開発環境とはちょっと離れてしまいますが, 便利なイディオムの枠としてクラスメソッドの定義について書いていきます.

動作原理自体は単純ですがあまり目にやさしくない記法のため慣れていない人は全く読めない処理が時々あります.
今回はその中からclass_eval(フラットスコープ)を使ったクラスメソッドの定義について少し書いて皆の理解に役立てばと思います ; )

## class_eval ##

class_evalについて簡単に説明しておきます.

> class_evalメソッドは、ブロックをクラス定義やモジュール定義の中のコードであるように実行します。ブロックの戻り値がメソッドの戻り値になります。
>引用:http://ref.xaio.jp/ruby/classes/module/class_eval

とあるように所謂eval族の一員です. これを使うことで

```ruby
class Qiita; end
Qiita.class_eval { def hello; "hello qiita!"; end }

puts Qiita.new.hello #=> hello qiita!
```

こんな感じで、あたかも`class Qiita`の中で定義しているかのように実行できます.

```ruby
class Qiita
  #ここ
end
```

## class_evalを使ったクラスメソッド
それではここからが今回のメインです. class_evalを使ってクラスメソッドを定義してみましょう.

とにかく一番シンプルにいくならば

```ruby
class Qiita; end

Qiita.class_eval do
  def self.hello
    "hello qiita!"
  end
end
```

のような感じでしょうか. 次は少し難しく書いてみます

```ruby
class Qiita; end

Qiita.class_eval do
  class << self; self; end.class_eval do
    def hello
      "hello qiita!"
    end
  end
end

#または
Qiita.class_eval { class << self; self; end }.class_eval do
  def hello
    "hello qiita!"
  end
end
```

いきなり少しわかりづらくなりましたが, `class << self; self; end`の戻り値は実行した部分の特異クラスのselfです.


```ruby
class Qiita; end

Qiita.class_eval do
  # これだとselfはQiita
  p self

  # これだとselfはQiitaの特異クラス
  p class << self; self; end
end
```

また, 上で書いたようにclass_evalの戻り値はブロックの戻り値なので

```ruby
Qiita.class_eval { class << self; self; end }.class_eval do
```

の部分は特異クラスに対してclass_evalを行なっていることになります. 特異クラスに対してclass_evalを行うことは以下の場所で定義していることと同じになります.

```ruby
class Qiita
  class << self
    #ここ
  end
end
```

さらに

```ruby
class Qiita; end
message = 'hello qiita!'

Qiita.class_eval { class << self; self; end }.class_eval do
  define_method('hello') do
    message
  end
end

p Qiita.hello #=> 'hello qiita!'

message = 'hello kobito!'
p Qiita.hello #=> 'hello kobito!'
```

`define_method`は引数にメソッド名や引数名を取り, blockに実際の動作を渡すことで`def`のスコープを超えることが出来るメソッドです.

こう書くことで、本来は`class (module)` `def` で区切られたスコープ外の変数(例では`message`)を参照できます. これをフラットスコープとも言ったりします.



他にもsendを使ってこういった書き方も可能です.

```ruby
class Qiita; end
message = 'hello qiita!'

Qiita.class_eval { class << self; self; end }.send('define_method', 'hello') { message }

puts Qiita.hello #=> hello qiita!

message = 'hello kobito!'
puts Qiita.hello #=> hello kobito!
```

## まとめ

何もわからない状態だと結構何をやっているのか想像しにくい処理だったと思いますが, 実際に行なっていることの１つ１つはそんなに難しいことではないと思います.

ですがリフレクション系は使い過ぎると大変なことになってしまうので用法用量を守って正しくお使いください :p
可変長引数を取るメソッドのように使えるが、引数の個数を制限する。

・使う側からしたらシグニチャの違いに気づかない
・引数の個数を強制できる（コンパイルが通らない）
ので、addAllNumOfArgsRestrictedのほうが優れている気がする。
しかし、引数を「全部足す」なのに、足される数が1つの配列になってないのは気持ち悪い。

どっちがいいんだろ。

```java:AddTest.java
package com.example.javamisc.variableargs;

import static org.junit.Assert.*;

import org.junit.Test;
import static com.example.javamisc.variableargs.Add.addAll;
import static com.example.javamisc.variableargs.Add.addAllNumOfArgsRestricted;

public class AddTest {

    @Test
    public void addAll可変長引数版() {
        assertEquals(3, addAll(1, 2));
        try {
            assertEquals(1, addAll(1));
            fail();
        } catch (IllegalArgumentException e) {
        }
    }

    @Test
    public void addAll引数の個数制限版() {
        assertEquals(3, addAllNumOfArgsRestricted(1, 2));
        // assertEquals(1, addAllNumOfArgsRestricted(1));
        // ↑コンパイルエラー
    }
}
```

```java:Add.java
package com.example.javamisc.variableargs;

public class Add {

    public static final int addAll(int... nums) {
        if (nums == null) {
            throw new NullPointerException();
        }
        if (nums.length < 2) {
            // add a to bなので。
            throw new IllegalArgumentException();
        }

        int sum = 0;
        for (int i : nums) {
            sum += i;
        }
        return sum;
    }

    public static final int addAllNumOfArgsRestricted(int a, int b, int... nums) {
        if (nums == null) {
            throw new NullPointerException();
        }

        int sum = a + b;
        for (int i : nums) {
            sum += i;
        }
        return sum;
    }
}
```
http で飛んできたアクセスを UA によって異なる https に飛ばす httpd.conf

http://example.com/hogee へのアクセスに対して

* スマートフォンは https://example.com/hogee
* それ以外は https://other.example.com/hogee

へと飛ぶような 302 レスポンスを返したい場合の httpd.conf の一例です。

```apache
<VirtualHost *:80>

  RewriteEngine On
  
  RewriteCond %{HTTP_USER_AGENT} (iPhone|iPod|iPad|Android)
  RewriteRule ^/(.*)$ https://%{HTTP_HOST}/$1 [R,L]

  RewriteRule ^/(.*)$ https://other.example.com/$1 [R,L]

</VirtualHost>
```
PostgreSQL 9.1.4 で 複合型の配列を扱う方法。


　最近のPostgreSQLでは、複合型の配列が使えるようです。
　（過去のことはあまり知らないのですが、検索すると少なくとも8.2.3の時点では使えなかったみたい）

　データベースの正規化に反するということで、無理に使うことはないし、使わないですむに越したことはないのでしょうけれど、使えるものは使ってみたい！？


### 複合型の定義

　複合型を定義します。今回はdisplay_nameとgenderの2つの属性を持ったperson型というのを定義します。
<pre>
CREATE TYPE gender AS ENUM('male','female');
CREATE TYPE person AS(
    display_name character varying(40),
    gender gender
);
</pre>

### 複合型の配列を利用したテーブルの定義

　personの配列を列として持つようなテーブルを定義します。

<pre>
  CREATE TABLE groups(
    group_name character varying(40),
    members person[]
  );
</pre>

我ながら例が悪いというか、こういうのはちゃんと関係テーブルでやった方がみんなが幸せになりますね(°°;)

### データの挿入

まずは、要素が一つの場合
<pre>
postgres=> INSERT into groups values('fist_group', '{"(first_member,male)"}');
INSERT 0 1
</pre>

結果を確認してみると...
<pre>
postgres=> select * from groups;
 group_name |         members
------------+-------------------------
 fist_group | {"(first_member,male)"}
(1 行)
</pre>

同様に、複数の要素がある場合は

<pre>
postgres=> INSERT into groups values('second_group','{"(second_member,female)","(third_member,male)"}');
INSERT 0 1
postgres=> select * from groups;
  group_name  |                     members
--------------+--------------------------------------------------
 fist_group   | {"(first_member,male)"}
 second_group | {"(second_member,female)","(third_member,male)"}
(2 行)
</pre>

と、こんな感じになります。

### データのアクセス

このmembersカラムには、配列で複合型のデータが入っているということで、それぞれのアクセサを使ったアクセスも勿論できる……はず？

まずはシンプルに。
<pre>
postgres=> select members from groups;
                     members
--------------------------------------------------
 {"(first_member,male)"}
 {"(second_member,female)","(third_member,male)"}
(2 行)
</pre>

PostgreSQLの配列添え字は**1始まり**なので注意
<pre>
postgres=> select members[0] from groups;
 members
---------


(2 行)


postgres=> select members[1] from groups;
        members
------------------------
 (first_member,male)
 (second_member,female)
(2 行)
</pre>

複合型の各フィールドには、カラム名でアクセスできます。
が、勿論配列添え字まできっちり指定する必要があるので、
この使い方をするのは微妙……？
<pre>
postgres=> select members[1].display_name from groups;
 display_name
---------------
 first_member
 second_member
(2 行)


postgres=> select members[1].gender from groups;
 gender
--------
 male
 female
(2 行)
</pre>

DBを完全に永続化層とだけ捉えて、なにがしかのロジックは完全にアプリ側に持たせるのなら、あるいは？


とりあえず現状だと、「こんなのも使えるらしい」というトリビア的なメモです。

memo:これを書くのに大体2ポモ。<br />
　　　使い方の調査の時間は含まず、ただし例題は書きながら実行してコピペしていた。
Emacs でカーソル位置のシンボルをハイライト

Eclipse みたいなやつ。こんなことができる → [Youtube](http://www.youtube.com/watch?v=xzJ2r4-s7fo)。

インストールは、
M-x auto-install-from-url https://raw.github.com/mitsuo-saito/auto-highlight-symbol-mode/master/auto-highlight-symbol.el
の後に以下を .emacs に記述すればOK。

```cl
(require 'auto-highlight-symbol)
(global-auto-highlight-symbol-mode t)
```

シンボル間のカーソル移動や、ハイライトされているシンボルを一括リネームできたりして便利。
Vimのペーストモード


つい最近まで、端末のVimからはneocomplcacheがきかなくなるという謎の現象に悩まされていました。
しかし、そもそも仕事ではVimを使わない上に、GVim上では問題なく作動するので「あれ？ そもそもneocomplcacheってGVim限定だったっけ？」などと間の抜けたことを思っておりました。
設定とかをいじりまわしていると楽しすぎて時間を浪費してしまうので、あまりVimの設定を調べて時間使いたくなかったというのもありますがw

しかしネットを徘徊していたところ、どうやら `set paste` という設定が原因だったもよう。
なぜこれを設定したのかは謎。エキスパートPythonあたりからコピペしたのかしら……
　　

さて、問題の設定ですが、これがオンになるとVimがペーストモードに移行するみたいです。
なんのこっちゃという話ですが、つまるところ端末のVimは打ち込まれたテキストとペーストされたテキストの区別がつかないようなのです。つまり端末のVimに、インサートモードのままで改行のあるコードなどをペーストするとautoindentなどが働いてしまって大変都合が悪い。
そこでペーストモードに切り替えることでスマートなコピペライフが遅れるとのこと。

しかし、これをvimrcに書いてしまうと常時ペーストモードになってしまう。neocomplcacheは当然、ペーストに対して補完はしない。というタネだったようで。
わかってしまうとなんてあほらしい……。

ちなみにGVimでは入力とペーストを判断できる(？)ようなので、ペーストモードは自動でオフになります。だからGVimではオートインデントや補完がきいたんですね〜。

ともあれ、これで素のVimでも快適なコーディングライフを送れます。
　　

しかしGVimがあまり好きではない僕にとって、これはこれで困るのでペーストモードのオンオフが出来る関数かなんかを設定したほうが良いのかもしれません。
一応
`:set paste` とか
`:a!` 後にペーストすることでオートインデントの悪さは回避できるみたいですが！

参考にしたページ：
[basyura's blog](http://d.hatena.ne.jp/basyura/20090926/p1)
MacVim-kaoriyaの設定

###ヤンクをクリップボードにも入れる
```vim:.vimrc
set clipboard=unnamed,autoselect
```
できない場合は
vim --version | grep clipboard
+clipboardになっているか確認
(参考:http://d.hatena.ne.jp/sea_mountain/20110421/1303362772)

###クリップボードから貼付ける
```vim:.vimrc
noremap <C-v> "+p
```

###フルスクリーンモードで起動する
```vim:.vimrc
if has("gui_running")
    set fuoptions=maxvert,maxhorz
    au GUIEnter * set fullscreen
endif
```
###.gvimrcの設定
```vim:.gvimrc
if has('gui_macvim')
    set guifont=Monaco:h14
    set imdisable
    set fuoptions=maxvert,maxhorz
endif
set showtabline=2
set guioptions-=T
set background=dark
colorscheme desert
set cmdheight=2
```
JellyBean以降のUPナビゲーション実装

JellyBean以降、activity要素にandroid:parentActivityName属性が新設されました。
ここに"親"となるActivityを指定すると、UPナビゲーションが実装できます。

```AndroidManifest.xml
<activity
    android:name=".ChildActivity"
    android:label="@string/title_activity_child"
    android:parentActivityName=".ParentActivity" >
```

詳細：http://yuki312.blogspot.jp/2012/07/androidupparentactivityname.html