OmniAICreator/Qiita-1.07M huggingface dataset:
新ドメインへパスごとリダイレクトする

WEBサイトを運営しているとドメインが変えなくてはならないときがあったりします。

コンテンツはパスを含めて全部移行しても、古いURLでアクセスしてきたユーザをきちんと誘導することをしなければ片手落ちです。なので簡単にその方法をまとめてみます。


###一般的な方法
一般的には、旧サーバの.htaccessで次のような設定をします。

``` .htaccess
RedirectMatch permanent (.*) http://newserver.com$1
```

###PHPを使った方法
何らかの理由で上の RedirectMatchが使えないときは、下のような方法も取ることができます。

旧サーバでmod_rewirteで index.php を動かして、REQUEST_URI に応じてリダイレクトする方法です。

.htaccessはこんなかんじです。

``` .htaccess 
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php [QSA,L]
```

phpはこんなかんじです。headerで３つ目の引数にHTTPステータス 301(Moved Permanently)を指定しています。

``` php:index.php 
<?php
$url = 'http://newserver.com' . $_SERVER['REQUEST_URI'];
header('Location:' . $url, true, 301);
```

phpで書いておけばこれ以外の処理が必要だったりした時も簡単に拡張できるのでもしかしたら結構いいかもしれません。
Zabbixのグラフの名前指定してgraphidを手に入れるスクリプト

```get_zabbix_graphid.pl
#!/usr/bin/env perl

use strict;
use warnings;
use DBI;

my $data_source = "DBI:mysql:zabbix";
my $username = "";
my $password = "";

my $graph_name = "DiskUsage";
my @recs = ();

eval {
    my $dbh = DBI->connect($data_source, $username, $password,
        {RaiseError => 1, PrintError => 0});

    my $sql = "SELECT graphid FROM graphs WHERE name = ?";
    my $sth = $dbh->prepare($sql);
    $sth->execute($graph_name);

    while (my $rec = $sth->fetchrow_arrayref) {
         push(@recs, $rec->[0]);
    }

    $sth->finish;
    $dbh->disconnect;
};

die "Error : $@\n" if ($@);
print join(", ", @recs), "\n";
```

例)

```bash
$ perl get_zabbix_graphid.pl 
1977, 1989, 1990, 1991, 1992, 1993, 1994, 1995
```
動的にアクセサを追加


via http://rubymotion-tutorial.com/7-models/

```ruby
class Hoge
  Properties = [:name, :email]
  Properties.each do |prop|
    attr_accessor prop
  end

  def initialize(hash = {})
    hash.each do |key, value|
      if Properties.member? key.to_sym
        self.send((key.to_s + '=').to_s, value)
      end
    end
  end
end

h = Hoge.new
h.name = "HogeName"
h.email = "hoge@hogehoge.jp"

p h.name  # => "HogeName"
p h.email # => "hoge@hogehoge.jp"

h = Hoge.new({name: "FugaName", email: "fuga@fugafuga.jp"})
p h.name  # => "FugaName"
p h.email # => "fuga@fugafuga.jp"
```
vimで右にhelpを表示する

便利な設定があるわけじゃなさそうなので、こんなコマンドを自分で定義してみた。

![command](http://gyazo.com/d96e474ae19d51408d908c7ddc569171.png?1344926946)

```vim:.vimrc
commands! -nargs=1 -complete=help Vh :vertical belowright help <args>
```
- `commands!`でコマンドを指定。同名のコマンドがあれば上書きする。
- `-nargs=`で引数の数を指定
- `-complete=`で補完のタイプを指定。他にもファイルとかディレクトリとかあるらしい。
- `vertical belowright [cmd]`で縦分割して右ウィンドウにコマンドの結果を表示する。
- `<args>`は引数
配列メソッドを使ったTips


```javascript
var arr = [[0, 1, 2, 3], [4, 5, 6, 7]];

//2次元配列の最初の値だけ返す
var firstItems = arr.map(function (x) { return x[0]; });

//有効な要素だけをフィルタリング（excludes null, undefined, 0, etc…)
var enableItems = firstItems.filter(function (x) { return x; });
```
「オープンソースで学ぶ社会ネットワーク分析」におけるpythonコマンド


「[オープンソースで学ぶ社会ネットワーク分析――ソーシャルWebの「つながり」を見つけ出す](http://www.oreilly.co.jp/books/9784873115504/)」の文中のpythonサンプルを写経するために適切なコマンドライン例:

``` sh:シェルコマンド
ipython -i -c '%doctest_mode' --pylab
```

明示的にそう書いていない箇所でもおそらくpylab指定のIpython環境を前提にしている。サンプル中のプロンプトは `>>>` なのでdoctest_modeも設定しているはず。

このジャンルのPython本の対話型のサンプルはもしかしたらたいていdoctest_modeのIpython用に書かれているものなのかもしれない。
Ruby の enum.inject の初期値

ブロックなしの enum.inject では初期値を設定できる。総和を求めるときなどに enum が空の可能性がある場合、大抵は初期値 0 を設定しておくほうが都合がいいだろう。

```ruby
[1, 2, 3].inject(0, :+)  # => 6
[1, 2, 3].inject(:+)     # => 6
[].inject(0, :+)         # => 0
[].inject(:+)            # => nil
```
Scheme手習いメモ (2章 - 一度、もう一度、さらにもう一度、またもう一度…)


##lat?
与えられたリストが、アトムからなるリストか判定する関数 `lat` を定義する。

```Lisp:lat.scm
(define atom?
    (lambda (x)
        (and (not (pair? x)) (not (null? x)))))

(define lat?
  (lambda (l)
    (cond
      ((null? l) #t)
      ((atom? (car l))(lat? (cdr l)))
      (else #f))))

(print (lat? '(bacon and eggs)))
(print (lat? '(bacon (and eggs))))
```

最初の `atom?` の定義は本の序文に乗ってたやつ。で、 `lat?` が新しく定義した関数。  `cond` という関数でパターンマッチが行われて、再帰するのだと予想する。

コードを実行した出力結果は次の通り。

```
:!gosh lat.scm
#t  
```

`(bacon and eggs)` はアトムからなるリストなので、真になっている。 `(bacon (and eggs))` は二つ目の要素がリストなので偽である。

##or
ご存知 `or` が登場。ブール演算子ですね。

```Lisp
(define l '())
(define l2 '(d e f g))
(or (null? l) (atom? l2))
```

のように使える。真。 `define` を変数の代入に使ってみたのだけれど、使い方あってるのかこれ。

##member?

続いて、ある要素がリストのメンバーか尋ねる関数 `member?` を定義する。

```Scheme:member.scm
(define member?
  (lambda (a lat)
    (cond
      ((null? lat) #f)
      (else (or (eq? (car lat) a)
                (member? a (cdr lat)))))))
```

```Lisp
> (define a 'meat)
> (define lat '(mashed potatoes and meat gravy))
> (member? a lat)
#t
```

2章まではサクサク進めた印象。再帰が分かっていれば、ここまでで躓くことは無さそう。3章も楽しみです。
Maven でプロジェクト作成から Eclipse で利用できる形式にするまで

Maven 3.0.4 を使った。

プロジェクトの作成。
対話形式でいくつか質問があるけど、今回は全部デフォルトにした。

```
$ mvn archetype:generate \
  -DarchetypeGroupId=org.apache.maven.archetypes \
  -DgroupId=sample \
  -DartifactId=SampleApp
```

Eclipse の設定ファイルを作成し、クラスパス変数 M2_REPO を設定

```
$ cd SampleApp
$ mvn eclipse:eclipse
$ mvn eclipse:configure-workspace \
  -Declipse.workspace="/path/to/workspace"
```

Eclipse を開いて、作ったプロジェクトをインポートすればよい。
Scheme手習いメモ (1章 - おもちゃ)


## 準備
 - 本を購入
 - Gaucheをインストール
 - Vimで、編集中のコードを実行したいときは `:!gosh %` でできる。

## 本編
### atom?, list?
とりあえずSchemeを書いてみたかったので、p.3に書いてあるコードをちょっと変えて試してみる。

```lisp:p3.scm
;p.xiii に掲載されているアトムを判定するっぽい関数
(define atom?
    (lambda (x)
        (and (not (pair? x)) (not (null? x)))))
;#t, #fがtrue, falseに対応するっぽい
;評価の結果は表示されないみたいなので、printで出力してみる
(print (atom? (quote 0)))
;出力 : #t

;ここからp.3
(print (atom? 'atom))
(print (atom? 'turkey))
(print (atom? 1483))
(print (atom? 'u))
(print (atom? '*abc$))

;リストかどうか判定するのはlist?かしらん
(print (list? '(atom)))
(print (list? '(atom turkey or)))
;p.3一番下のはエラー
```

出力は以下のとおり。

```
:!gosh hello.scm
[No write since last change]
#t
#t
#t
#t
#t
#t
#t
#t     
```


アトムもリストもS式です。あと、空リストももちろんある。対話型インタプリタを使ってみる。 `$gosh` コマンドで起動。

```
gosh> (list? ())
#t
```

###car
`car` というのがあるらしい。リストに含まれる一番目のS式を取り出す関数？

```lisp
gosh> (car '(a b c))
a
gosh> (car '((a b c) x y z))
(a b c)
gosh> (car '(((hotdogs)) (and) (picke) relish))
((hotdogs))
(car (car '(((hotdogs)) (and) (picke) relish)))
```

ホットドッグ食べたくなってきた。

###cdr
`cdr` はリストから `car` した要素を取り除いたリストを返す。

```lisp
gosh> (cdr '(a b c))
(b c)
gosh> (cdr '(hamburger))
()
```

###cons
`cons` は任意のS式をリストの最初の要素として追加する関数。

```lisp
gosh> (cons 'a '(better and jelly))
(a better and jelly)
gosh> (cons '(banana and) '(peanut butter and jelly))
((banana and) peanut butter and jelly)
gosh> (cons 'a (car '((b) c d)))
(a b)
```

###null?
`null?` で空リストか判定できる。

```lisp
gosh> (null? '()) 
#t
```

###eq?
`eq?`で二つの数値以外のアトムが等しいか判定できる。

```lisp
gosh> (eq? 'Harry 'Harry)
#t
```
Kobito.appのDBファイルの中身を見る


Kobito.appはSQLiteのDBで管理されている(`$HOME/Library/Kobito/Kobito.db`)
このKobito.dbに書いた記事、tag、日付などが入ってます。

```perl:access2Kobito.pl
#!/usr/bin/env perl

use strict;
use warnings;

use DBIx::Simple;

my $db = DBIx::Simple->connect('dbi:SQLite:dbname=./Kobito.db') || die DBIx::Simple->error;

my $result = $db->query('select ZCREATED_AT, ZTITLE, ZRAW_BODY, ZBODY from ZITEM') || die $db->error;

while ($result->into( my($CREATED_AT, $TITLE, $ROW_BODY, $HTML) )) {
    print "$CREATED_AT\t";
    print "$TITLE\n";
}

$db->disconnect;


=pod

Example:
366526282.454518	Hooo
366526950.474287	Hoge!
366529876.797163	てすと
...

=cut
```

## Tips
　`ZRAW_BODY`にはmdファイル、`ZBODY`にはHTMLに変換されたデータが入っているので、好きに取り出すことができるし、バックアップに使うこともできる。
　あるいは、Kobito.appで管理し、共有したい記事はDropboxへ保存する、といった使い方も可能になる。
iOSでシングルトンクラスを定義する！


iOSでシングルトンクラスを定義する方法です。

```objectivec:SampleSingleton.h
+ (SampleSingleton *)sharedManager;
```

```objectivec:SampleSingleton.m
static SampleSingleton *_sharedInstance = nil;
+ (SampleSingleton *)sharedManager
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[SampleSingleton alloc] init];
    });
    return _sharedInstance;
}
```

## あわせて読みたい

* [[iOS][Mac] dispatch_once を使ったシングルトン | Cocoaの日々](http://cocoadays.blogspot.jp/2011/05/iosmac-dispatchonce.html)
* [[iOS 5.0][ARC][GCD]GCDのdispatch_onceを使ったシングルトン（ARC対応版） | メモてきなあれと，日記てきなあれ．](http://d.hatena.ne.jp/koichirohonda/20120325/1332651629)
VIMで選択行をソートする


`<S-V>` で行選択した状態で、以下のコマンドを実行すれば昇順にソートされます。

```vim
:sort
```

vimの内部コマンドにsortがあったのね。初めて知りました。

以下のように、外部コマンドの sort.exe を使ってソートすると、文字化けすることがあるので上記の内部コマンドを使いましょう。

```vim
:!sort
```

# 2012/08/14 補足

内部コマンドsortのヘルプを以下のコマンドで参照すると、色々なオプションがありますね。

```vim
:h :sort
```

## 逆順でソート

```vim
:sort!
```

## 重複行を削除(uniq)

```vim
:sort u
```

## 最初に見つかる数字でソート(10進数)

```vim
:sort n
```


## 正規表現にマッチする部分でソート

```vim
:sort /\a\a\a/ r
```
neocomplcache-snippets-complete プラグインで、スニペットの場所を指定する方法

neocomplcache-snippets-complete の設定サンプルには書かれていなかったのでメモ。

.vimrc に以下の１行を追加する。

```vim:.vimrc
let g:neocomplcache_snippets_dir = $HOME.'/.vim/snippets'
```
Mountain Lion+rubyでopensslエラー

## エラーメッセージ

>
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed


## 環境
ruby 1.9.3p194
Mac OSX 10.8

## 原因
証明書がない．

```sh
⚡ ruby -ropenssl -e 'p OpenSSL::X509::DEFAULT_CERT_FILE'
"/usr/local/etc/openssl/cert.pem"
```

## 対処
上記の場所("/usr/local/etc/openssl/cert.pem")に証明書をダウンロードして置いてやる．

```sh
cd /usr/local/etc/openssl && wget http://curl.haxx.se/ca/cacert.pem && mv cacert.pem cert.pem
```
Vim の置換で後方参照


例として `winston.info` などを `logger.info` などに置換。

```vim
:%s/winston\.\(info\|warn\|error\)/logger.\1/g
```

Vim の 正規表現は `()` を `\(\)` としないといけないので、少し面倒ですね。

## 追記

コメント欄の t_uda さんのご指摘のように `\v` を使えばもっと自然に書けるようです。

```vim
:%s/\vwinston\.(info|warn|error)/logger.\1/g
```
「初めてのPerl 第6版」が出版されたらしい

5.14以降のモダンな書き方も出ているみたい。PerlをDISるならせめてこの本に出てくる程度のモダンな記法は身につけてないと恥ずかしいってじっちゃんが言ってた。

[「初めてのPerl 第6版」が発売されました](http://www.kondoyoshiyuki.com/2012/08/12/learning-perl-6th-published/)
▼WebKitCSSMatrixについて


```javascript
//matrixオブジェクトを得る
var matrix = new WebKitCSSMatrix(window.getComputedStyle(obj)).webkitTransform);

//matrix.a(b, c, d, e...)のプロパティあり。
//aとdがスケール。

//↓プロパティの意味
/*
⎛a c e⎞
⎜b d f⎟
⎝0 0 1⎠
*/
```
rvmのdo機能で複数バージョンのRubyを同時に実行する

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


rvmにdoというオプションがある、使用例は[公式の`rvm test`](https://rvm.io/set/tests/)。

渡したシェルを複数のrvmコンテキストで別々に実行してくれる。主にテスト向けの機能。


### バージョン表示のrakeタスク

それぞれのRubyでバージョンを表示するだけのタスクを走らせてみる。

```ruby:Rakefile
desc "print version"
task :print_ruby_version do
  puts ENV['RUBY_VERSION']
end
```


### カンマ区切りでバージョンを複数指定して実行

```
$ rvm ruby-1.9.2-p320,ruby-1.9.3-p194 do rake print_ruby_version
ruby-1.9.2-p320
ruby-1.9.3-p194
```

### allでインストール済みのすべてのバージョンで実行

```
$ rvm all do rake print_ruby_version
jruby-1.6.7.2
ruby-1.9.2-p320
ruby-1.9.3-p194
ruby-1.9.3-p125
```

例えば`.travis.yml`を勝手に拾ってテストしてみるのも良い。
Clutch A/B TestingによるiOSアプリ向けA/Bテストソリューションのご提案

<div class="message attention">
# 追記
非常にビックリしたんだけど、これを投稿してから24時間も経たないうちにTwitter社によるClutch.ioの吸収が発表されていた……
[Clutch.io Joins the Flock at Twitter!]("http://blog.clutch.io/post/29340796276/clutch-joins-the-flock")
によると「サービス終了。オープンソースでサーバー環境は公開」のコースみたいですね……
なので以下の文章は早速「当時こういうものがあった」というものになってしまいました。
</div>


# 追記 10/15/12

Githubにて公開されました
https://github.com/clutchio


# 以下は初稿です

https://clutch.io/

Clutch A/B TestingはClutch.ioによるA/Bテスト実行のフレームワーク+ウェブサービス。
属にいうモバイルBaaSの内の更にA/Bテスト実行に特化した作りになっているところが面白いと思いましたのでここで紹介します。

# Clutch.ioとは？
iOS/Androidに対応したモバイルアプリケーション開発基盤を提供するサンフランシスコのスタートアップが運営しているサービス。
元々はWeb技術とネイティブAPIのハイブリッドアプリケーションを作る為のClutch Frameworkを提供してたんだけど、最近A/Bテストの方に注力してきた。

# ここで言うA/Bテスト
ウェブ業界のランディングページ最適化のようなサイト一部の見た目を切り替えるのが典型的な例。
iOSアプリの事情でいうとウェブアプリのように柔軟に内部処理の切り替えや平行的実験をすることが難しいので、従来は単純にウェブサイトを埋込むことで行われてきた。
Clutch A/B Testingのアプローチは,まずA/Bテスト=実験に使うデータだけをキー・バリュー構造に定義してサーバーからクライアントへ配信できるようにしておき、実験が「達成」した時に今度はクライアントがサーバにその通知をする。
そうするとその統計情報をClutch.ioのダッシュボードで閲覧・分析ができるようになる。

# 利用までの流れ
1. Clutch.ioにユーザー登録
2. Clutch.frameworkをダウンロード
3. ダッシュボードからApp作成
4. AppにExperimentを追加する
5. iOSアプリのObjective-Cソースコードにアプリケーションキー・A/Bテスト用の記述をする

[Clutch.io - A/B Testing - Documentation](http://docs.clutch.io/ab-testing.html "Clutch.io - A/B Testing - Documentation")

# テストコード
Blocksベースのメソッドを使用する。
Normal Testsは単純な分岐のみ
Data-driven Tests はダッシュボードで定義した文字列をそのままアプリに渡す

## Normal Tests

    // Test which color of tint performs better
    [ClutchAB testWithName:@"loginButtonColor" A:^{
        // Red?
        loginButton.tintColor = [UIColor redColor];
    } B:^{
        // Or green?
        loginButton.tintColor = [UIColor greenColor];
    }];

## Data-driven Tests

    [ClutchAB testWithName:@"loginButtonTitle" data:^(NSDictionary *testData) {
        // Extract the title from the testData dictionary, and assign it to the button.
        loginButton.title = [testData objectForKey:@"title"];
    }];

## Goal

    //ログイン後に呼び出す
    [ClutchAB goalReached:@"loginButtonColor"];

詳細はドキュメント参照。
[Clutch.io - A/B Testing on iOS - Documentation](http://docs.clutch.io/ab-testing-ios.html "Clutch.io - A/B Testing on iOS - Documentation")

# 不満だった点
Goalの段階設定が足りない。
    例：ゴール=ユーザー登録完了→ボタンをタップしたけど完了まで操作してもらえなかった/ボタンをタップしてもらえなかった

# プランについて
freeプランでは1つのアプリ、月に5000ユーザーのアプリ起動までに制限されてる。
これダッシュボード上は無制限に検証用にアプリを作成できて、本番に有効化できるのが1個だけとかだと使いやすいのに、と思いました。
月額プランも割高に感じるが、ちなみに以前はA/B Testingはfreeプランでは利用でなかったので改善される余地はあるかもしれない。

# 組込むことのオーバーヘッドについて
Clutch.ioのサーバーにA/Bテストに使う値を取得しに言って結果を送信していることによる通信処理の負担はないのか気になっている。一応ネットワークが利用不可の時は以前にダウンロードしたデータを使いまわして、結果はネットワークが復帰した時に再度サーバーに送信されるようになる。

# 個体識別方法について
サービスの性質上、各端末を区別しないといけないので個体識別の値を取得しているものと思われる。Clutch.ioのサイト上では
・MACアドレス+Bundle Identifierのハッシュ値
・MACアドレスのハッシュ値
が利用されると書いてある。
今のところ一方向的は送信のみなのでこのハッシュ値を元にサーバー上の個人のデータが取得できる、というようなことはなさそう。
アプリ間で端末を同定する必要もなさそうなのでUUIDでよさそうだが、このへんClutch.ioの「月あたり何ユーザーまではこの月額プラン」というビジネスモデルが関係しているのかもしれない。

# 留意点
自分が使ってみた限りでは特にアルファ版とか実験的とか謳っているわけではないんだけど、実用的な段階には程遠いと感じました。たとえばアプリを作成できるけど削除、変更できなかったりと。
ただ前述のとうりコンセプト自体は面白いと思うし発展の余地もありそうなので取り上げました。
むしろアプリをバンバンリリースしている会社なんかは既に同じような社内向けシステムを構成しているのかもしれません。
またサーバーアクセス解析などとは違ってデスクトップアプリの統計情報送信に近いのでユーザー同意やオプトアウト設定などまだ課題があると感じました。
ファイルをかき集めてくる。ただし重複ファイルは1つのみ集める。

$1にあるファイルを$2にハードリンクする。内容が同じファイルは、それらのうちどれか１つだけがリンクされる。


```mufufu.sh
#!/bin/sh
if [ $# -ne 2 ]; then
    echo "usage: `basename $0` search_dir copy_dir" >&2
    exit 1
fi
if [ ! -e "$2" ]; then
    mkdir "$2" || exit 1
fi
if [ ! -d "$2" ]; then
    exit 1
fi

find "$1" -wholename "$2" -prune -o -type f -regex '.*\(jpg\|png\)' -print0 | xargs -0 md5sum | sort -k 1,1 | uniq -w 32 | while read md5 fname ; do ln -f "$fname" "$2"/"${md5}_`basename "$fname"`" ; done
```
GUIでTableViewCellの画面配置を作る(Dynamic prototypes)


以前のXCode(InterfaceBuilder)では、UITableViewCellのViewを作る事は出来なかった(はず、記憶違いかも）のですが、最近のXCodeのStoryBoardでは"Dynamic Prototypes"という機能で、GUIからTableCellViewを作る事が出来るようになっていました。

これが使えれば、GUIでTableViewCellの配置等も調整出来て便利そうです。

* StoryBoard上でUITableViewControllerの"Attribute inspector"->"Table view"の中に、"Content: Dynamic Prototypes"という指定がある。
	* その下の"Prototype cells"は表示する個数
	
![](https://img.skitch.com/20120812-ssni6k9gyq4bqy8s6kthcg7yj.jpg)

* このTableViewの中のTableViewCellに"identity"を設定しておけば、Objective-Cからアクセスが出来る

![](https://img.skitch.com/20120812-kcuqhjd4xkc6my7qs6ft1wf4te.jpg)


* Obj-Cからは、以下のコードで取得出来る。

```objectivec
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cell1";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    
    return cell;
}
```

* StoryBoard上で、セルに対応する自作クラスも設定できるので、そこで自作クラスのIBOutletに項目を関連付けしておく。

```objectivec
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cell1";
    PATableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    // Configure the cell...
    cell.lavel.text=[NSString stringWithFormat:@"%d",indexPath.row];
    
    return cell;
}
```
Debian で WPA-PSK(AES) 方式で無線接続 - NetworkManager 編

実家に帰省したら Debian を無線 LAN でネットに繋ぐのに大はまりした。ということで、Debian から WPA-PSK(AES) 方式で無線 LAN に接続する方法。

## 環境
- OS: Debian wheezy
- 無線 LAN firmware: iwlwifi
- ルータ: Buffalo WZR2-G300N

## NetworkManager を使う

最初は比較的カンタンな NetworkManager を使う方法でやってみます。

まずはお約束。無いものがあれば先に入れておいてください:

```sh
$ sudo aptitude install firmware-iwlwifi
$ sudo aptitude install wireless-tools
$ sudo aptitude install network-manager
```

### PSK 入手

AOSS 対応機種なんて買ってきてる時点でどうせ既に繋がっている Windows 機がその辺に転がってるんでしょう！！！！

はい、ということで passwordkey (以下、psk) は既に繋がっているマシンを使って適当に引っこ抜いてくることにします。Windows なら、ネットワーク接続のプロパティ的なアレで「パスワード文字列を表示」か何かにチェック入れれば見れます。あるいは、Buffalo の場合は 192.168.11.1 をブラウザで開き (root 空パスワード)、無線設定のとこから SSID と暗号鍵の一覧を見れます。AOSS??ナニソレオイシイノ？

とりあえず、以下では

- (E)SSID: MY_HOME
- psk: HogeFuga

として説明を進めます。

### NetworkManager の接続設定

さて、繋ぎたい SSID と psk のセットは手に入れましたか？では早速 Debian の方に戻ります。GUI の場合、ネットワーク設定を開いて SSID を探して一度繋いでおけば、自動的にその SSID に対応する NetworkManager の接続プロファイルが出来上がるのでやっておくと楽です。

\# なぜ GUI のネットワーク設定からだと WPA-PSK の psk を入力するダイアログとか出てこないのだ……。Ubuntsu とかなら psk 入力求められるらしいから NetworkManager とかいらなさそう。

はい、じゃぁ以下 CUI な人と GUI だけど運悪く psk を聞かれなくて繋げなかった人のための解説。

```sh
$ cd /etc/NetworkManager
$ lv NetworkManager.conf
NetworkManager の設定ファイルです。
今回はいじりませんが、必要なら man NetworkManager.conf でも見ながら編集してください。
$ cd ./system-connections
$ ls
MY_HOME   MY_UNIVERSITY   MY_...
$ sudo vim MY_HOME
```

`/etc/NetworkManager/system-connections` に接続プロファイルがたくさん転がってるので、そいつを編集（もしくは新規作成）します。

\# ちなみに、GUI で接続するアクセスポイントをうっかり間違えて全く関係ないところに繋いでしまったりした場合でもここにファイルができてしまうので、どんどん増えていきます。結構間違えて繋いでしかも自分がホントに繋ぎたいのよりもそっちが優先されてしまうなんて事態になるので、要らないものは削除しときましょう。

```ini:MY_HOME
[connection]
id=MY_HOME
uuid=***-***-***-***-***
type=802-11-wireless

[802-11-wireless]
ssid=MY_HOME
mode=infrastructure
mac-address=**:**:**:**:**:**
security=802-11-wireless-security

[802-11-wireless-security]
key-mgmt=wpa-psk
auth-alg=open
psk=HogeFuga

[ipv4]
method=auto

[ipv6]
method=auto
ip6-privacy=2
```

ファイルは ini 形式で書きます。自動生成されたやつに手直ししてるのであんまよく分かってません。uuid とか mac-address は適当に埋めてください。最後に、psk を直書きしてるので、ちゃんと 600 にするのも忘れずに。

```sh
$ sudo chmod 600 MY_HOME
```

ちなみに、ファイル名と id は SSID と同じじゃなくてもいいです。

これで放っておけば多分自動的に接続されると思いますが、気になる人は network 再起動して確認してください:

```sh
$ sudo service networking restart
$ sudo service network-manager restart
$ /sbin/iwconfig
無線ネットワークインターフェースの確認
$ nm-tool
NetworkManager で接続状況を確認
```

----

NetworkManager 編おしまい。

psk 直書きが気持ち悪い人のための後編:[Debian で WPA-PSK(AES) 方式で無線接続 - wpa_supplicant 編](http://qiita.com/items/a29874cbeecd080ea2fe "Debian で WPA-PSK(AES) 方式で無線接続 - wpa_supplicant 編 #UNIX #Debian - Qiita")
boto で S3 アップローダー


Googleで調べればさんざん出てくるわけではあるが。
boto でAWSにファイルアップロードするよ。

```python:upload.py
#!/usr/bin/python 
# coding: utf8

import sys
from boto.s3.connection import S3Connection
from boto.s3.key import Key

AWS_ACCESS_KEY	= 'XXXXXXX'
AWS_SECRET_KEY	= 'YYYYYYY'
BUCKET_NAME		= 'mybucket'

conn = S3Connection(
	aws_access_key_id		= AWS_ACCESS_KEY,
	aws_secret_access_key	= AWS_SECRET_KEY)

bucket = conn.get_bucket(BUCKET_NAME)

print "connect:", bucket

if len(sys.argv) == 1:
    print "Error: no input file specified"
    sys.exit()


args = sys.argv
# arg[0] は実行スクリプト名なのでスキップ
args.pop(0)

for arg in args:
	upload_file = arg

	key		= Key(bucket)
	key.key	= upload_file
	key.set_contents_from_filename(upload_file)

	# web 公開モードにする
	key.make_public()
	print "upload file:", key

```

実行は、アップしたいルートディレクトリから

```shell
$ python path/to/upload.py file1 file2 ...
```

ファイルのパーミッションとか、オプションの制御は[マニュアル](http://boto.s3.amazonaws.com/ref/s3.html#module-boto.s3.key)を参照すればいいと思うよ。


最終的には rsync 的な同期スクリプトにしたいけど、とりあえずの下書きってぇ事で。
LinuxとMacでのRWIN,MTUの設定

あまり設定の詳しいことは知らないけどとりあえず枠は大きくすれば速くなるものなので．MTUは環境によって変わるので調べること．自宅環境はBフレッツなので1454に．

# Linuxでの設定

```
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_wmem = 4096 257232 1028928
net.ipv4.tcp_rmem = 4096 257232 1028928
net.ipv4.tcp_mem = 2048000 2048000 2048000
net.core.rmem_default = 257232
net.core.wmem_default = 257232
net.core.rmem_max = 1028928
net.core.wmem_max = 1028928
```

を /etc/sysctl.conf に追記し，sudo sysctl -p で反映．

```
# The primary network interface
auto eth0
iface eth0 inet static
	address 182.48.40.100
	mtu 1454
```

の MTU の設定行を /etc/network/interfaces の適切な位置に書き込む．一時的には ifconfig eth0 mtu 1454 で良い．

# Macでの設定

```
$ sudo sysctl -w net.inet.tcp.recvspace=262144
net.inet.tcp.recvspace: 65536 -> 262144
```

```
$ sudo ifconfig en0 mtu 1454
```

起動時に反映させるにはスクリプト書いて登録しておかないといけないのかな．そこについてはさらに調べる必要がある．

### 参考文献
Ubuntu関係
http://linux2.g.hatena.ne.jp/lnznt/20120708/1341729750
http://d.hatena.ne.jp/poez22/20110511/1305072154
Mac関係
http://macdeunix.com/modules/xfsection/article.php?articleid=21
MacVimをダウンロードしたら~/.zshrcとかに書いておく設定

# 設定

```bash:~/.zshrc
alias vim=/Applications/MacVim.app/Contents/MacOS/Vim
alias vi=vim
```

上記のように, `vim`自体に対する`alias`の設定についてはよく見かけるが,
[`vimdiff`](https://macvim.org/docs/diff.txt.html)や[`view`](https://macvim.org/docs/starting.txt.html#view)も使うなら, 下記のいずれかの方法による設定が必要.

## ①aliasによる設定
```bash:~/.zshrc
alias vimdiff=/Applications/MacVim.app/Contents/bin/vimdiff
alias view=/Applications/MacVim.app/Contents/bin/view
```

## ②PATHによる設定
```bash:~/.zprofile
export PATH="/Applications/MacVim.app/Contents/bin:${PATH}"
```

<details><summary> MacVimに同梱されているコマンド </summary>

```console
$ ls -lhFG /Applications/MacVim.app/Contents/bin
total 328
lrwxr-xr-x  1 skkzsh  admin     4B  1  4  2024 gview@ -> mvim
lrwxr-xr-x  1 skkzsh  admin     4B  1  4  2024 gvim@ -> mvim
lrwxr-xr-x  1 skkzsh  admin     4B  1  4  2024 gvimdiff@ -> mvim
-rwxr-xr-x@ 1 skkzsh  admin   144B  1  4  2024 gvimtutor*
lrwxr-xr-x  1 skkzsh  admin     4B  1  4  2024 mview@ -> mvim
-rwxr-xr-x@ 1 skkzsh  admin   1.9K  1  4  2024 mvim*
lrwxr-xr-x  1 skkzsh  admin     4B  1  4  2024 mvimdiff@ -> mvim
lrwxr-xr-x  1 skkzsh  admin     9B  1  4  2024 mvimtutor@ -> gvimtutor
lrwxr-xr-x  1 skkzsh  admin     4B  1  4  2024 view@ -> mvim
lrwxr-xr-x  1 skkzsh  admin     4B  1  4  2024 vim@ -> mvim
lrwxr-xr-x  1 skkzsh  admin     4B  1  4  2024 vimdiff@ -> mvim
-rwxr-xr-x@ 1 skkzsh  admin   2.1K  1  4  2024 vimtutor*
-rwxr-xr-x@ 1 skkzsh  admin   149K  1  4  2024 xxd*
```

</details>


# 参考

自分はおおよそ以下のように書いている.

```bash:~/.zprofile
case "$(uname)" in

    Darwin) # OSがMacならば
        if [[ -d /Applications/MacVim.app ]]; then # MacVimが存在するならば
            export PATH="/Applications/MacVim.app/Contents/bin:${PATH}"
        fi
        ;;

    *) ;; # OSがMac以外ならば何もしない
esac
```

# 参照
https://macvim.org/docs/gui_mac.txt.html#macvim-start
マングリングを解除する。

    #include <iostream>
    #include <cxxabi.h>
    #include <typeinfo>

    using namespace std;
    
    template <typename T>
    class hoge{};
    
    int main(){
      typedef hoge<int> want_name;
      int status = 0;
      cout << abi::__cxa_demangle( typeid(want_name).name(), 0, 0, &status ) << endl;
    }        
    // Output:
    // hoge<int>
Parsec 正規表現との関係



letter	→ /[a-z]/
char 'a'	→ /a/
string "hoge" <|> string "huga"	→ /hoge/
try(string "hoge") <|> string "huga"	→ /hoge|huga/
many (char '@')	→ /@*/
many1 (char '@')	→ /@+/
sepBy (string "hoge") (char ',')	→ /(hoge(,hoge)*)?/
sepBy1 (string "hoge") (char ',')	→ /hoge(,hoge)*/
sepEndBy (string "hoge") (char ',')	→ /(hoge(,hoge)*)?,?/
sepEndBy1 (string "hoge") (char ',')	→ /hoge(,hoge)*,?/

[Parsec, a fast combinator parser](http://legacy.cs.uu.nl/daan/download/parsec/parsec.html)
pacman-key --init

「pacman-key --init」してもデフォルトのSigLevelだと、パッケージのインストールを拒否する設定になっているっぽい。 なので、SigLevelをPackageRequiredからTrustAllにした。

    $ sudo pacman -Syu
    「pacman-key --initしてくれ」とかいうエラー発生した。
    $ sudo pacman-key --init
    $ sudo pacman -Syu
    ...
    failed to commit transaction (invalid or corrupted package (PGP signature))
    ...
    $ sudo vi /etc/pacman.conf
      [core]
    - SigLevel = PackageRequired
    + SigLevel = TrustAll
      Include = /etc/pacman.d/mirrorlist
    
      [extra]
    - SigLevel = PackageRequired
    + SigLevel = TrustAll
      Include = /etc/pacman.d/mirrorlist
    
      #[community-testing]
      #SigLevel = PackageRequired
      #Include = /etc/pacman.d/mirrorlist
    
      [community]
    - SigLevel = PackageRequired
    + SigLevel = TrustAll
      Include = /etc/pacman.d/mirrorlist
    $ sudo pacman -Syu
    $ sudo pacman -S filesystem --force
    $ sudo pacman -Syu
Arch Linux USBオートマウントの設定


以下の設定ファイルを作成することで、USBメモリとSDカードを自動マウントすることを確認している。

    $ vi /etc/udev/rules.d/11-media-by-label-auto-mount.rules
    KERNEL!="sd[a-z][0-9]", GOTO="media_by_label_auto_mount_end"

    # Import FS infos
    IMPORT{program}="/sbin/blkid -o udev -p %N"

    # Get a label if present, otherwise specify one
    ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}"
    ENV{ID_FS_LABEL}=="", ENV{dir_name}="usbhd-%k"

    # Global mount options
    ACTION=="add", ENV{mount_options}="relatime"
    # Filesystem-specific mount options
    ACTION=="add", ENV{ID_FS_TYPE}=="vfat|ntfs", ENV{mount_options}="$env{mount_options},utf8,gid=100,umask=002"

    # Mount the device
    ACTION=="add", RUN+="/bin/mkdir -p /media/%E{dir_name}", RUN+="/bin/mount -o         $env{mount_options} /dev/%k /media/%E{dir_name}"

    # Clean up after removal
    ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /media/%E{dir_name}",     RUN+="/bin/rmdir /media/%E{dir_name}"

    # Exit
    LABEL="media_by_label_auto_mount_end"

[ArchLinux: Auto Mounting USB Drives](http://binaryexistence.co.uk/2011/12/22/archlinux-auto-mounting-usb-drives/)
素数のときにJoJo - CoffeeScript - 

* [素数のときだけ&quot;JOJO!&quot;って出力するプログラムを作ってみた - くりにっき](http://sue445.hatenablog.com/entry/2012/08/11/164950)
* [言葉をポッケに持ち歩こう: 素数のときにJoJo - scala -](http://daiksy.blogspot.jp/2012/08/jojo-scala.html)

自分も CoffeeScript で作って見ました．

```CoffeeScript:jojo_prime.coffee
isPrime = (x) ->
  return false if x < 2
  return true if x == 2
  return false if x % 2 == 0
  for i in [3..(Math.sqrt x)] by 2
    return false if x % i == 0
  true

for i in [1..100]
  console.log (if isPrime i then 'JOJO!' else i)
```
git log A..B と git log A...B の違い

原文

    Ranges

    The syntax first..second takes all commits which lead to second,
    except those which lead to first. It's the same as: ^first second.
    Likewise, first^..second takes all commits which lead to second,
    except those with lead to the parent of first; theirby including first.

    The syntax first...second takes all commits from both branches,
    except those from the common branch point. 

直訳

    範囲

    first..second 構文はsecondまでのすべてのコミットを、
    firstまでのコミットを除いて収得する。これは^first second と同じである。
    同様に、first^..second 構文はsecondまでのすべてのコミットを、
    firstの親までのコミットを除いて収得する。

    first...second 構文は両方のブランチからすべてのコミットを、
    共有しているブランチポイントまでのコミットを除いて収得する。

[Getting up speed with Git](http://www.codingdomain.com/git/tricks/)
VimでPowerShellのスクリプトを書く

# プラグインの導入

__PowerShell__のスクリプトを書くなら,
PowerShell ISEなどの専用のIDEを使う方が便利かもしれない.
しかし, 普段使い慣れた __Vim__で書きたいこともある.
ただ, 残念ながら, デフォルトではPowerShell用のFileTypeはない.

そこで, __Vim__で __PowerShell__のスクリプトを書きたい場合は,
以下のいずれかのリンクからプラグインを導入する.

https://www.vim.org/scripts/script.php?script_id=1327

https://github.com/PProvost/vim-ps1


# 補足

[Windows PowerShell Indent File](http://www.vim.org/scripts/script.php?script_id=1815)
[Windows PowerShell File Type Plugin](http://www.vim.org/scripts/script.php?script_id=1816)
はタイトルにあるとおり既に古い (_Obsolete_).
_description_ に書かれているように, これらは既に
[Windows PowerShell Syntax Plugin](http://www.vim.org/scripts/script.php?script_id=1327)
に統合されているので, ここからダウンロードするだけで良い.

また, これには`ftdetect\ps1.vim`が含まれているため,
拡張子が`ps1`のファイルは自動でFileTypeがPowerShell用になる.
そのため, `vimfiles`以下に, `ftdetect\ps1.vim`の作成や,
`filetype.vim`への追記を自分でする必要はない.

(2012年8月時点)

# 参考

- [vimにWindows PowerShellの編集環境を追加する](http://d.hatena.ne.jp/eel3/20110702/1309532706)
- [Windows版VimでPowerShellのスクリプトファイルをカラー表示する。](http://munibus.blog17.fc2.com/blog-entry-176.html)
broadcomの無線LANの設定のメモ

Arch Linuxで無線LANを使うためnm-appletをインストールしたができない（有線LANは普通に使用できる）。 どうやら、Broadcom's IEEE 802.11a/b/g/n hybrid Linux® device driverが自分のPCには入っていないらしい。 なので、www.broadcom.comから [hybrid-portsrc_x86_32-v5_100_82_112.tar.gz](http://www.broadcom.com/support/802.11/linux_sta.php) をダウンロードしてくる。 ちなみに、Arch LinuxのPacmanではこれを扱っていない。 

ダウンロードしてこのtar.gzファイルを展開するまではよいのだが、makeに失敗してしまう。 失敗原因の１つ目は、Linuxのヘッダーがない。なので、ダウンロードする。

    $ sudo pacman -S linux-headers

まだ致命的原因があって、このBroadcomさんが配布しているソースコードが間違っているらしい。 なので、以下の場所を変更する。

    $ vi hybrid-portsrc_x86_32-v5_100_82_112/src/wl/sys/wl_linux.c  388行目
    -  .ndo_set_multicast_list = wl_set_multicast_list,
    +  .ndo_set_rx_mode = wl_set_multicast_list,

そうすると、やっとビルドが通りインストールができる。

    sudo make
    sudo make install 

そうするとwl.koモジュールがインストールされているので、モジュールを再構築する （この辺から怪しい。必要のない操作もあるかもしれない...）。

    $ sudo insmod  /lib/modules/3.3.5-1-ARCH/kernel/drivers/net/wireless/wl.ko
    $ sudo depmod -a
    $ sudo modprobe wl

あとは、設定ファイルに必要事項を追記する。 （dbusとnetworkmanagerはインストールしてある前提で）

    $ sudo vi /etc/rc.conf
    ...
    - MODULES=()
    + MODULES=(wl)
    ...
    - DAEMONS=(hwclock syslog-ng network netfs crond)
    + DAEMONS=(hwclock syslog-ng dbus networkmanager netfs crond)
    ...
    $ vi /etc/modprobe.d/modprobe.conf
    + blacklist b43
    + blacklist ssb

ちなみに、nm-connection-managerはroot権限がないと無線LANの設定ができない(入力フォームがDisable状態になってしまう)。 なので、sudoで対処する。(加えてsystem trayを入れたほうがコマンドを入力せずで楽だった...)

    $ sudo nm-connection-manager
restricted shell

rbashで起動した時、もしくはbashで --restricted オプションか -r オプション付きで 起動した時、次のことが起こる：

+ cd ビルドインは使えない。
+ 環境変数SHELL、PATH、ENV、BASH_ENVに値を設定することはできない。
コマンド名にスラッシュを含めることはできない。
+ スラッシュが含まれているファイル名を.(source)ビルドインコマンドに渡すことを許さない。
+ hash ビルドインは -p オプション付きでスラッシュを許可しない。
+ スタートアップ時に関数のインポートは使えない。
+ SHELLOPTSはスタートアップ時には無視される。
+ >, >|, ><, >&, &> や >>を使った出力リダイレクトは使えない。
+ exec ビルトインは使えない。
+ enable ビルドインに -f や -d オプションを使えない。
+ command ビルドイン
+ デフォルトPATHは command ビルドインで指定することができません。
+ restricted モードを切ることはできない。
+ シェルスクリプトであると分かるコマンドが実行される場合、 rbashはそのスクリプトを実行するためにそのシェル中のどんな制限も切ります。

[Bash Guide for Beginners/1.2.2.10. The restricted shell](http://tldp.org/LDP/Bash-Beginners-Guide/html/Bash-Beginners-Guide.html)
BUFFALO ポータブルWiFiルーターの設定

BUFFALO ポータブルWiFiルーター をSIMカード付きで契約したのですが、中古で購入したXperia rayにそのSIMカードを挿してもデータ通信ができませんでした。結局、APNの選択が間違っていたらしい。

ということで、その設定の仕方を以下に示します。
「設定」を選択
「無線とネットワーク」を選択
「モバイルネットワーク」を選択
「アクセスポイント名」を選択
メニューを開いて「新しいAPN」を選択
以下のように設定する。名前はお好きに、APNは契約しているやつを、そのほかはデフォルトでOKらしい。

    名前: 定額データプラン
    APN: mopera.flat.foma.ne.jp
    ...
    MCC: 440
    MNC: 10
    ...

メニューを開いて「保存」を選択
保存した新しいAPNを選択
これで、データ通信が可能になると思います。
console.log は長くてつらい

`console.(log|error|warn|info|debug)` を短い奴に再定義したい時は、こんな感じ。

```js
var log = console.log.bind(console);
```

動かない例
-----------

```js
var log = console.log
```

↑これで、`log('foo');` とかやってみても、例外でてダメ。
`console.log` とはレシーバーが違ってしまうせいかも。

動くけど・・・
---------------

```js
var log = function(o){ console.log(o); }
```

↑これは、動く。でも`console.log` の可変長引数な仕組みを潰してるので勿体無い。

ブラウザ互換とか考えると
-------------------------

こんな感じ？他になにかいい方法ありませんかね。

```js
var methods = ['log', 'warn', 'error', 'info', 'debug', 'dir'];
for (var i in methods){
  (function(m) {
    if (console[m]) {
      window[m] = console[m].bind(console); };
    } else {
      window[m] = log;
    }
  })(methods[i]);
}

log('hoge');
warn('fuga');
error('piyo');
info('nyan');
debug('wan');
```

メソッド存在チェックして、無かったら `console.log` を使う感じにしてる。

ここまで来たら、ログレベルを定義して、レベル低い出力は抑制する仕組みを作るの簡単そうですね。専用のライブラリ使ったほうが良い気もしますが。
omniauth-twitterで「can't convert nil into String」のTypeError

下記のエラーになっているため。
「Rate limit exceeded. Clients may not make more than 350 requests per hour.」

omniauth-twitter-0.0.12/lib/omniauth-twitter.rbの22行目でraw_info['screen_name']の中身が無いため、「can't convert nil into String」エラー。

この時のraw_infoの中身は↓

```ruby
{"error"=>"Rate limit exceeded. Clients may not make more than 350 requests per hour.", "request"=>"/1/account/verify_credentials.json"}
```

1時間以上時間を置けばエラーは自動的に解消される。
PhantomJS/CasperJS でファイル操作


PhantomJS/CasperJs でローカルのファイルを操作するには fs module を使います。**Node の fs module とは違う同期 API** です。

[リファレンス](http://code.google.com/p/phantomjs/wiki/Interface#Filesystem_Module) によれば [CommonJS Filesystem proposal](http://wiki.commonjs.org/wiki/Filesystem/A) を基に作られてるとか。

例えば、あるディレクトリの中身を列挙するには以下のようにします。

```js
var fs = require('fs');

var files = fs.list(fs.workingDirectory + '/data');
files.forEach(function (file) {
  console.log(file);
});
```

Node の `fs` module の `readdirSync()` と違い、`.` と `..` を含めた結果が返ってきます。
Array#map() などに関数を直接渡すときは引数に注意


ちょっとはまったのでメモ。

```js
['1', '2', '3'].map(parseInt);
// -> [1, NaN, NaN]
```

`map()` のコールバック関数の引数は 3 個、`parseInt()` の引数は 2 個なので以下と同じ結果になってしまいます。

```js
['1', '2', '3'].map(function (value, index, arr) {
  return parseInt(value, index, arr);
});
// -> [1, NaN, NaN]
```

`parseInt()` の基数が 0, 1, 2 と変わってしまうため変なことに。

同様に `forEach()` などでも、渡す関数の引数には注意が必要です。

```
['john', 'michael', 'mark'].forEach(console.log);
// john 0 [ 'john', 'michael', 'mark' ]
// michael 1 [ 'john', 'michael', 'mark' ]
// mark 2 [ 'john', 'michael', 'mark' ]
```


参考: [javascript - Array.map and parseInt - Stack Overflow](http://stackoverflow.com/questions/262427/javascript-array-map-and-parseint)
PHP で関数合成

2014-11-28 追記

関数合成については Composer からインストール可能な形で `yuyat\compose` というのを作ったので、そちらをご利用ください。

* https://github.com/yuya-takeyama/compose
* http://qiita.com/yuya_takeyama/items/b65afa141327e7ccd1ac

`yuyat\compose` は PHP 5.6 以降でないと使えませんが、それ未満のバージョンであれば `igorw\compose` を使うのが良いでしょう。

* https://github.com/igorw/compose

---

[「関数型Ruby」という病(2) - 関数合成 Proc#compose](http://yuroyoro.hatenablog.com/entry/2012/08/09/203959) という記事が面白かったので

```php:compose.php
<?php
class ComposableFunction
{
    /**
     * @var callable
     */
    private $fn;

    /**
     * Constructor
     *
     * @param callable $fn
     */
    public function __construct(callable $fn)
    {
        $this->fn = $fn;
    }

    /**
     * Invokes function
     */
    public function __invoke()
    {
        return call_user_func_array($this->fn, func_get_args());
    }

    /**
     * Composes new function
     */
    public function compose(callable $fn)
    {
        return new static(function () use ($fn) {
            return $fn(call_user_func_array($this, func_get_args()));
        });
    }
}

$splitWithUnderscore = new ComposableFunction(function ($str) {
    return explode('_', $str);
});

$mapUcfirst = function ($words) {
    return array_map('ucfirst', $words);
};

$camelize = $splitWithUnderscore->compose($mapUcfirst)->compose('join');

var_dump($camelize('foo_bar_baz'));
// => FooBarBaz
```
MacのTerminal+通知センターを利用した3分カップラーメンタイマー


ターミナルから通知センターに通知を送れる [`terminal-notifier`](https://github.com/alloy/terminal-notifier) を使います。

```sh
sleep 180 && /Applications/terminal-notifier.app/Contents/MacOS/terminal-notifier -message "ラーメンできたよ！" &
```

`.bashrc` などでエイリアス貼っておけばすぐに使えます 笑

```sh
alias 'ramen3min=sleep 180 && /Applications/terminal-notifier.app/Contents/MacOS/terminal-notifier -message "ラーメンできたよ！" &'
```
kobitoでデフォルトショートカットキーが変更できない

command shift Kを他のショートカットキーに割り当てているため、kobitoホットキーをcommand shift Tに変更したのですが、kobito再起動のタイミングでリセットがかかるようで、ホットキーが元に戻ってしまいます。


![1.png](https://qiita-image-store.s3.amazonaws.com/0/889/872b0511-b3cb-e67d-646f-8f8f50cd1ef8.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/889/2967705d-dd24-db6a-e1b5-e41eb91865b7.png)
![3.png](https://qiita-image-store.s3.amazonaws.com/0/889/13803a50-0a60-74db-db0c-568ac6511b34.png)
PHPでメソッドを動的に追加する方法


JavaScriptではオブジェクトに後からメソッド追加して、オブジェクトを動的に拡張できますよね。

```js
var Object = function() {
	this.foo = "foo";
}

var object = new Object();

object.getFoo = function() {
	return this.foo;
}

console.log(object.getFoo()); // foo
```

PHP5.4からは `Closure::bindTo()` を使うとこれと似たようなことができます。

```php
class Object
{
	/**
	 * @var \Closure[]
	 */
	private $methods = [];

	private $foo = 'foo';

	public function __set(string $name, \Closure $method)
	{
		$this->methods[$name] = $method->bindTo($this, self::class);
	}

	public function __call(string $name, array $arguments)
	{
		if (!array_key_exists($name, $this->methods)) {
			throw new \BadMethodCallException(
				'Call to undefined method ' . __CLASS__ . "::$name()"
			);
		}
		return $this->methods[$name](...$arguments);
	}
}

// オブジェクトを作る
$object = new Object();

// 後からメソッドを追加する
$object->getFoo = function () {
	return $this->foo;
};

// 追加したメソッドを呼び出す
echo $object->getFoo();
```

ただし、カプセル化を破壊するので、使い所は計画的かつ慎重に判断したほうがいいです。

せっかく `trait` が使えるので、この動的メソッド追加の処理をトレイト化すると再利用性が高まり、動的メソッド追加を実装するクラスも形式的なコードが少なくなりますね。

```php
trait DynamicMethodDeclaration
{
	/**
	 * @var \Closure[]
	 */
	private $__dynamicMethods = [];

	public function addMethod(string $name, \Closure $method): void
	{
		$this->__dynamicMethods[$name] = $method->bindTo($this, self::class);
	}

	public function __call(string $name, array $arguments)
	{
		if (!array_key_exists($name, $this->__dynamicMethods)) {
			throw new \BadMethodCallException(
				'Call to undefined method ' . __CLASS__ . "::$name()"
			);
		}
		return $this->__dynamicMethods[$name](...$arguments);
	}
}

class Object
{
	use DynamicMethodDeclaration;

	private $foo = 'foo';
}

// オブジェクトを作る
$object = new Object();

// 後からメソッドを追加する
$object->addMethod('getFoo', function () {
	return $this->foo;
});

// 追加したメソッドを呼び出す
echo $object->getFoo();
```
レビューするポイント


レビューに上がってきた以上、必要な機能はできているとする。その上で、メンテナンス性や品質を上げるためのレビューポイントを纏めてみる。まだ草案です。

## 変数名・関数名は理解しやすいか

変数であれば、そこに入る値と関連のある名前かどうか。関数であれば、内容を推測できるか、副作用の有無が暗示されているか。

## 無駄にネストしていないか

Readable Code 7.7 参照。ネストを浅くするのを目的とすべきではないが、ネストを浅くしたほうが読みやすいことが多い。

## 条件式は理解しやすいか

条件式はなるべく単純にする。not/and/or が入る場合はunlessは使わない。ガード節であれば、下記のように単文ifを並べるほうがよい。

```perl
return if $s > 10;
return if $s < 0;
return if $s % 2 == 0;

…;
```

## 無駄なコメントはないか

単にコードを言い換えただけのコメントは不要である。

## クラス設計は単純か

同じも機能を提供するものであれば単純なもののほうがよい。
関連したクラスであれば無駄にファイルを分ける必要もない（これは言語にもよるが）。

## クラス同士は疎結合か

密結合したクラスは理解しにくい。

## テストしやすい設計になっているか

一般に、疎結合したクラス群はテストしやすい。

## コードの再利用はできているか

同じようなコード片をプログラム中にばらまくのは悪である。

## グローバル変数を使っていないか

グローバル変数を使うとプログラムの思わぬ部分が結合してしまう。
FacebookのiOS SDK勉強するならここから見るといいよ

https://developers.facebook.com/docs/getting-started/getting-started-with-the-ios-sdk/jp/#project

ここにある情報でやれば近いと思う。sqliteのリンク設定って他で情報を見つけられなかった。偶然先に見つけていたので助かりました。

あと、下手にドキュメントあさるよりも、Hello World的なサンプルを見てやる方が良いです。リソースも付いているし楽。
Ancestry の　has_ancestry :adoptオプション


ツリー構造が作れるAncestryというgemがありまして、親が削除されたときの子の振る舞い、ツリーの再構築の方法をオプションで選べます。

ところが、

	has_ancestry :orphan_strategy => :adopt

にすると、エラーではじかれRailsも起動しなくなる。

エラーをみたところ、どうやら:adoptのコードが含まれていない模様。

なので、

```Gemfile
gem 'ancestry', git: "https://github.com/stefankroes/ancestry.git"
```

とgithubから直接コードをbundle installしたら動きました。

このオプション群、便利ですねー。

くわしくは、
https://github.com/stefankroes/ancestry
のReed meから！
iOSで吹き出しを描こう

完成品はこんな感じ

 [![画像](http://miyakeryo.com/wp-content/uploads/bubble-200x300.png)] (http://miyakeryo.com/?p=186)
メッセージアプリとかでよくあるやつなんだけど、画像でもいいんだけどセリフの長さによってサイズ変えたりしたいから、描いたほうが楽だなってことで簡単なんで描いちゃいましょう。


コードは主要部分はこんな感じ

```objc
//描画するぜ！
- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextBubblePath(context, CGRectMake(60.5, 40.5, 170, 70));
    CGContextStrokePath(context);
}

//角度→ラジアン変換
#if !defined(RADIANS)
#define RADIANS(D) (D * M_PI / 180)
#endif

//吹き出しを描く
void CGContextBubblePath(CGContextRef context, CGRect rect)
{
    CGFloat rad = 10;  //角の半径
    CGFloat qx = 10; // くちばしの長さ
    CGFloat qy = 20; // くちばしの高さ
    CGFloat cqy = 4; // 上くちばしカーブの基準点の高さ
    CGFloat lx = CGRectGetMinX(rect)+qx; //左
    CGFloat rx = CGRectGetMaxX(rect); //右
    CGFloat ty = CGRectGetMinY(rect); //上
    CGFloat by = CGRectGetMaxY(rect); //下

    CGContextBeginPath(context);

    CGContextMoveToPoint(context, lx, ty+rad); //左上
    CGContextAddArc(context, lx+rad, ty+rad, rad, RADIANS(180), RADIANS(270), 0); //左上のカーブ
    CGContextAddArc(context, rx-rad, ty+rad, rad, RADIANS(270), RADIANS(360), 0); //右上のカーブ
    CGContextAddArc(context, rx-rad, by-rad, rad, RADIANS(0), RADIANS(90), 0); //右下のカーブ
    CGContextAddArc(context, lx+rad, by-rad, rad, RADIANS(90), RADIANS(125), 0); //くちばしの付け根(下の凹み)
    CGContextAddQuadCurveToPoint(context, lx, by, lx-qx, by); //くちばしの先端
    CGContextAddQuadCurveToPoint(context, lx, by-cqy, lx, by-qy); //くちばしの付け根(上)

    CGContextClosePath(context); //左上の点まで閉じる
}
```

意外と短い。
でもこれで吹き出しの形が描けます。

ちょっとだけ説明。

まず、左上のカーブ。

```
CGContextAddArc(context, lx+rad, ty+rad, rad, RADIANS(180), RADIANS(270), 0);
```

点(lx+rad, ty+rad)を中心にして、半径radの円を180度から270度まで時計回りで描くよ。ってことです。
これで左上のカーブが描けます。

※ 注意
原点が左上なので、0度が右、90度が下になります。
180度から270度ってことは、左から上ってことです。

次の行で上の直線を描かずに、すぐに右上のカーブを描いてるのは勝手に間は直線で結ばれるからです。
勝手に結ばれるのが気になるなら、こんな感じで直線を描いてもいいです。

```
CGContextAddLineToPoint(context, rx-rad, ty);
```

左下のカーブは、円を下から35度だけ描いて止めてます。

次に、くちばしの先端。

```
CGContextAddQuadCurveToPoint(context, lx, by, lx-qx, by);
```

現在の点から、点(lx-qx, by)まで線を引くんだけど、点(lx, by)で線を引っ張って曲げる。ってことです。
厳密には違うかもしれないけど、まあそんなとこです。
だから、もっと強く曲げたかったら、点(lx, by)を点(lx+1, by+1)とかにしたらいいんです。

最後に、一番上。吹き出しの大きさを指定してるところ。

```
CGRectMake(60.5, 40.5, 170, 70)
```

0.5とか中途半端な座標を使ってるのは、よくあるTips。
1ptの線を描くとき座標の中心に描こうとして線がぼやっとするから。
Retinaだったら問題ないんだけどね。

はい。おわりです。
完成品では、Clipしてグラデーションで塗ったり、縁取りしたり、影つけたりしてるんだけど、
気になったらGitHubにあげてるんでみてねー。
[BubbleDraw - GitHub](https://github.com/miyakeryo/objc-ryo/tree/master/BubbleDraw/BubbleDraw)
Windows 標準コマンドを使ってファイルサイズを指定してテキストファイルを分割する（不完全版）

肥大化したログファイルを Windows 上のテキストエディタで開きたいと思っても、数百メガあるとなかなか開けなかったり、テキスト検索に時間がかかったりと困りものです。

Linux の `split` コマンドのように好きなサイズや行数でファイルを分割するようなものは Windows には存在しないようで、いろいろ調べたのですが、どの方法も「バッチファイルを作れ」とか「VBScript を書け」とか面倒。ひたすら別の方法がないか探していたら、どうやら `MakeCab` コマンドを使ってファイル分割ができるようです。

*※ただしこの方法は不完全で、分割したファイルの先頭に文字化けした Unicode 文字列が入ったり、なにかの拍子にファイルの途中に Unicode 文字が出現したりします（原因解析してない）。個人的にログ解析に支障は無い程度だったので放置していますが、ご了承のうえご利用ください*

MakeCab コマンド
----------------

Windows XP や Windows 7 では標準コマンドとして用意されているようです（確認した環境は Windows XP Professional SP3 です）。
*現在は Windows SDK に含まれている？（未確認）*

キャビネット形式（*.cab）の圧縮ファイルを作るためのコマンドですが、オプションを指定してやることでファイルをサイズ指定して分割することが出来ます。
今回は指定するコマンドが少々多いので、 `*.ddf` ファイルに書き出してコマンド実行時に指定する方法で実行します。

オプション指定ファイルを用意
----------------------------

分割対象のファイルや、分割後のファイルサイズの指定を `*.ddf` ファイルに記述します。
`*.ddf` のファイル名は何でも構いません、たとえば `split_textfile.ddf` とか。
分割対象のファイルは複数指定することが出来ます。

```text:split_textfile.ddf
.Set CabinetNameTemplate=splited.file.name.* ;分割後のファイル名（* に 1,2,... の連番が入ります。）
.Set DiskDirectoryTemplate=                  ;この指定が無いと　Disk1,Disk2,... というフォルダが作成されます
.Set MaxDiskSize=1024000                     ;分割後のファイルサイズ（byte。512の倍数で指定）
.Set Cabinet=on                              ;必ず on にします。off にすると分割されません
.Set Compress=off                            ;圧縮はしないので off に。
"C:\\path\to\textfile.txt"
"C:\\path\to\textfile2.txt"
```

この `*.ddf` ファイルを分割したいファイルと同じ場所に置きます。
（あるいは別の場所に置いて実行することも可能です。今回は説明のために同じ場所に置くことにしました）

ファイル分割の実行
------------------

コマンドプロンプトで、分割したいファイルと `*.ddf` ファイルを置いたフォルダへ移動して以下のコマンドを実行します。

```bat:cmd
>MakeCab /F split_textfile.ddf
```

分割中は処理状況（パーセント）が表示され、数分で `splited.file.name.1`,`splited.file.name.2`,... という名前の分割ファイルが作成されます。

最後に `setup.inf` と `setup.rpt` というファイルが出来ますが、今回の目的では使用しませんので削除してしまって構いません。
`setup.inf` は CAB 形式のインストールファイルとしてインストール内容が記述されるファイルです。`setup.rpt` は MakeCab の実行結果のリポートファイルです。
オプションに以下を追加して `*.inf` ファイルが出来ないようにしておくとちょっと安心かもしれません。

```text:split_textfile.ddf
.Set InfFileName=hoge  ;拡張子つけない
```


以上で
------

望んだサイズに分割されたファイルが出来ました！
先に書いたとおり Unicode による文字化けが発生する場合もありますが、ほとんどの内容は無事に出力されていると思います。

参考記事
--------
* [2011-03-09 - メモ](http://d.hatena.ne.jp/koolah/20110309)
* [コマンド忍法　～作業効率向上支援～コマンドプロンプト使い方指南](http://command.ninpou.jp/50onM.htm)
Xcode 用の超お手軽パッケージングスクリプト作った

App Store に出さない野良アプリの配布は、 .app を zip で固めて GitHub に置いてご自由にダウンロードしてください、で済ませたい。

済ませたいので `releasebuild` スクリプトを作った。Xcode プロジェクトのルートディレクトリ直下にスクリプトを置いて `./releasebuild` か `./releasebuild clean build` を実行するだけ。コマンド一発でビルドから zip 化まで行う。あとはコミットしてプッシュすればいい。

```sh:releasebuild

#!/bin/sh

set -e
set -x

# Build
xcodebuild $*

# Package
name=`xcodebuild -showBuildSettings | perl -nE 'say $1 if /^ +FULL_PRODUCT_NAME = (.+)$/;'`
pdir="$PWD/Products"
mkdir -p "$pdir"
(cd build/Release; zip -r "$pdir/$name.zip" "$name")

```

zip への直リンクは `https://raw.github.com/$USER/$REPO/master/$PROJECT/Products/$APP.zip` これ。サクッと開発してサクッと配布しましょう。

**注意：** 頻繁に更新するようなアプリは素直に GitHub の Downloads セクションにアップロードすべき。 [GitHub のヘルプ](https://help.github.com/articles/what-is-my-disk-quota)にもそう書かれている。
herokuに公開鍵を追加する

git pushするとき公開鍵を追加していないPCだと当たり前に怒られる

```
% git push heroku master
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
```

なので作ってある公開鍵をherokuに追加

```
heroku keys:add ~/.ssh/id_rsa.pub
```
CoffeeScriptで三項演算子


``` coffeescript
hoge ? piyo : fuga
```

ってかくと、JavaScriptでは

``` javascript
if (typeof hoge !== "undefined" && hoge !== null) {
  hoge;

} else {
  ({
    piyo: fuga
  });
};
```

期待した形じゃない。幸福じゃない。
幸福は欲しいから。

``` coffeescript
if hoge then piyo else fuga
```

こう書いた。

``` JavaScript
if (hoge) {
  piyo;

} else {
  fuga;

}
```

期待した形ぽい。幸福だ。
Capistranoデプロイ後にプロセスのリビジョンを確認する(scm＝git版)

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

Capistranoでデプロイすると、コードを設置した後に新旧コードをシンボリックリンクで入れ替える。
この方式はロールバックが簡単で良いのだが、リスタートしたつもりのプロセスは本当に`Current`のものか気になるので確認する。


## revisionチェックのタスク
scmにgitを指定した際、capistranoは`#{current_path}/REVISION`にコミットのハッシュを置くので、`/proc`から実行中プロセスのワーキングディレクトリを覗く。


```ruby:deploy.rb
namespace :deploy do
  task :print_revision do
    run "cat #{current_path}/REVISION"
    run "/proc/`cat #{shared_path}/pids/myapp.pid`/cwd/REVISION"
  end
end
```

## 実行サンプル

```
  * executing "cat /opt/deploy/myapp/current/REVISION"
 ** [out :: xx.xx.xx.xx] 7f36e97e7d4fa16b3556b0d2a2c73f86fb108871
  * executing "cat /proc/`cat /opt/deploy/myapp/shared/pids/myapp.pid`/cwd/REVISION"
 ** [out :: xx.xx.xx.xx] 7f36e97e7d4fa16b3556b0d2a2c73f86fb108871
```

ハッシュがあっていればよし。
Mosh で Did not find mosh server startup message が発生した時の対処方法

クライアント側(Mac)で、サーバー側が(Ubuntu)で生じた。

どうやらクライアントと、サーバー側の言語設定が日本語と英語で違っていたのでDid not find mosh server startup message が発生していたっぽい。

そこで Ubuntu側の言語を英語にしてみた。


/etc/default/locale
```
LANG="en_US.UTF-8"
```

これで解決した。


参考にしたのはこのページです。
https://github.com/keithw/mosh/issues/98
NSPasteboard の変更を監視する

ペーストボードの内容に変更があると `NSPasteboard#changeCount` がインクリメントされる。 KVO での監視はできないようなので素直にタイマーでポーリングをかければいい。

```objc

- (void)beginObservingPasteboard
{
    self.changeCount = [[NSPasteboard generalPasteboard] changeCount];
    [NSTimer scheduledTimerWithTimeInterval:1
                                     target:self
                                   selector:@selector(observePasteboard:)
                                   userInfo:nil
                                    repeats:YES];
}

- (void)observePasteboard:(NSTimer *)timer
{
    NSPasteboard *pboard = [NSPasteboard generalPasteboard];
    if (pboard.changeCount > self.changeCount) {
        [self pasteboardChanged:pboard];
    }
    self.changeCount = pboard.changeCount;
}

- (void)pasteboardChanged:(NSPasteboard *)pboard
{
    // Do something with pboard
}

```
NSPasteboard は KVO に対応していない

ペーストボードの変更を監視するため `NSPasteboard#changeCount` に KVO をかけたが監視できなかった。 `NSPasteboard#pasteboardItems` も同様。監視するには [`changeCount` をポーリングするといい](http://qiita.com/items/559949a709ea1c5e346f)。
Github for WindwosでのProxy設定


Git Shell立ち上げて、

```shell
> git config http.proxy = http://xxx.xxx.xxxx.xxx:port
```

でいけるようなことが書いてあるサイトがあったが、

```shell
> git config -l
```

しても、表示されないので、.gitconfigを直接弄る。

C:\Users\username
直下に、「.gitconfig」ファイルがあるはずなので、以下の様に追加。

```
[http]
	proxy = http://xxx.xxx.xxx.xxx:port
```

これで、保存して、Github for Windowsを立ち上げれば、Proxy通して通信出来るはず。
Omniauth + Facebook = OpenSSL::SSL::SSLError

# Omniauth + Facebook = OpenSSL::SSL::SSLError

```
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
```

### 参考

[ruby on rails - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed - Stack Overflow](http://stackoverflow.com/questions/4528101/ssl-connect-returned-1-errno-0-state-sslv3-read-server-certificate-b-certificat)

[Ruby 1.9 and the SSL error « Martin Ottenwaelter](http://martinottenwaelter.fr/2010/12/ruby19-and-the-ssl-error/)

### certファイルダウンロード

```
sudo mkdir -p /opt/local/share/curl
curl http://curl.haxx.se/ca/cacert.pem > ~/Downloads/cacert.pem
sudo cp ~/Downloads/cacert.pem /opt/local/share/curl/cacert.pem
```

### OmniAuth設定

config/initializers/omniauth.rb

```ruby
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, Settings.facebook_app_id, Settings.facebook_app_secret, { client_options: { ssl: { ca_file: "/opt/local/share/curl/cacert.pem" } } }
end
```

or

### 「OpenSSL::SSL::VERIFY_PEER」設定削除

```ruby
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
```
Mac OS Xのターミナルでよく使うコマンド tput bel

ターミナルで時間の掛かるコマンドを実行するときに、ターミナルをアクティブにしていなくてもコマンドが終了したことがわかるようにするコマンドです。

ターミナルのアイコンをジャンプさせバッジを表示させます。
Lionで使えるようです(Snow Leopardではダメでした)。

```sh
$ make install && tput bel
```

参考URL:
http://osxdaily.com/2012/07/17/send-a-notification-badge-to-the-terminal-dock-icon-when-a-task-is-finished/