OmniAICreator/Qiita-1.07M huggingface dataset:
mox generator とか欲しい

最近、テストを書くのがとても面倒になってきたので、mox で簡単にスタブできないか考えてみた。

まずは、クラスを。

```mox_generator.py
import mox
class MoxGenerator(object):

    def __init__(self):
        self.mox = mox.Mox()
```

まだ思いつきの書き始めなので、とりあえず１つ書いてみました。なんでもいいから、True を返すスタブします。引数すら考慮せず。これはひどい（汗）。

```mox_generator.py:
    def true_stub(self, stub_class, stub_method, num_args):
        self.mox.StubOutWithMock(stub_class, stub_method)
        stubbed = getattr(stub_class, stub_method)
        args = tuple([mox.IgnoreArg() for i in range(num_args)])
        stubbed(*args).AndReturn(True)
```

呼び出すときは、こんな感じで。ここでは、MyClass.hoge(x,x,x) が True を返すように。最後の数字は、MyClass.hoge に渡す引数の個数です。

```example_test.py:
    moxgen= MoxGenerator()
    moxgen.true_stub(MyClass, 'hoge', 3)
```

もちろん Replay も面倒なので、名前が変だけどジェネレータに入れてしまえ！

```mox_generator.py:
    import contextlib
    @contextlib.contextmanager
    def mox_replay(self):
        self.mox.ReplayAll()
        yield
        self.mox.VerifyAll()
```

テスト実行側。

```example_test.py
    with moxgen.mox_replay():
        MyClass.method_which_should_call_hoge()
```

github にも上げてみました。https://github.com/norobust/mox_generator なぜか本名でコミットされとるやないかー。どうやってユーザ名に変えるんだろう？
Gitでどうしても覚えられない操作


##### サブモジュールの削除

e.g. "Plugin/Upload"というサブモジュールの場合

```
$ git config --remove-section submodule."Plugin/Upload"
$ git config --file .gitmodules --remove-section submodule."Plugin/Upload"
$ git rm --cached Plugin/Upload
$ rm -rf Plugin/Upload
```
FactoryGirlでpassword_confirmationを設定する

factory_girlでパスワードのペアのような"confirmation => true"なカラムをセットするには以下のように書く。

```ruby:qiita.rb
# coding: utf-8

FactoryGirl.define do
  factory :user, :class => User do |f|
    f.sequence(:email) {|n| "email#{n}@domain.tld" }
    f.password "password"
    f.password_confirmation { |u| u.password }
    f.status User::ACTIVE
  end
end
```
iOSプログラミングTips


## テーブルビューセルの境界線を点線にする

Interface Builderでは設定できないようなのでコードで行う。

```objectivec
__weak IBOutlet UITableView *tableView;
...
tableView.separatorColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"dotted-line.png"]]; // 点線イメージを指定
```


## ナビゲーションバーやツールバーが非表示の画面に、UINavigationControllerのpushで遷移するとき、バーが表示されていた領域が一瞬黒くチラついてカッコわるい問題の解決策

```objectivec:AppDelegate.m
// ウィンドウ背景色をセット
self.window.backgroundColor = [UIColor whiteColor]; // 例えば白とか
```

別の方法。こっちの方が良さそう。

```objectivec:SomeViewController.m（ツールバーを持つビューコントローラ）
// ビューが表示される前に呼ばれる
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    [self.navigationController setToolbarHidden:NO animated:NO];
}

// ビューが消える前に呼ばれる。
- (void)viewWillDisappear:(BOOL)animated
{
    [self.navigationController setToolbarHidden:YES animated:YES];
    
    [super viewWillDisappear:animated];
}
```


## iOSシミュレータのカメラロールに写真／ムービーを保存する

（iOSシミュレータ バージョン6.0で確認）

1. 保存したい写真／動画のファイルを用意する。
2. そのファイルをFinderからiOSシミュレータのウィンドウにドラッグ&ドロップする。
3. iOSシミュレータのSafariが起動される。動画の場合、自動再生されるので停止する。
4. iOSシミュレータのSafariのツールバー上のアクションボタンを押し、「カメラロールに保存」を選択する。
fog gemを使って、特定のURLのファイルをS3へ保存する


```ruby:s3.rb
require 'rubygems'
require 'open-uri'

storage = Fog::Storage.new(
  provider: 'AWS',
  aws_access_key_id:ENV['AWS_S3_KEY_ID'],
  aws_secret_access_key:ENV['AWS_S3_SECRET_KEY'],
  region: ENV['AWS_REGION']
)
bucket = storage.directories.get(ENV['AWS_S3_BUCKET'])
bucket = storage.directories.create(key: ENV['AWS_S3_BUCKET']) unless bucket

path_to_save = 'users/images/hoge2.png'
image_url = 'http://a0.twimg.com/profile_images/2900491556/9d2bf873770958647f18b8e61af31f1a_normal.png'

file = bucket.files.create(key: path_to_save, public: true, body: open(image_url))
puts file.public_url

```

## region list

* eu-west-1 : 欧州 – アイルランド
* sa-east-1 : 南米 – サンパウロ
* us-east-1 : 米国 – バージニア北部
* ap-northeast-1 : アジア – 東京
* us-west-2 : 米国 – オレゴン
* us-west-1 : 米国 – 北カリフォルニア
* ap-sourtheast-1 : アジア – シンガポール
* ap-sourtheast-2 : アジア – シドニー
Android環境構築


0. JDK SE6とAntをインストールする。(JDK SE7以降だと少々めんどくさい。)
1. [adt-bundle-windows-x86_64.zip](http://developer.android.com/sdk/index.html)をダウンロードする。
2. そのzipファイルを解凍しパスを通す。

        C:\Java\adt-bundle-windows-x86_64\sdk\tools
        C:\Java\adt-bundle-windows-x86_64\sdk\platform-tools

3. `SDK Manager.exe`を起動し`Google USB Driver`をアップデートする。(他にも必要なものがあればそれも...)

4. 存在しているAndroidターゲットを調べる。

        C:\Users\rbtnn\Desktop\and>android list target
        Available Android targets:
        ----------
        id: 1 or "android-17"
             Name: Android 4.2
             Type: Platform
             API level: 17
             Revision: 1
             Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, W
        XGA720, WXGA800, WXGA800-7in
             ABIs : armeabi-v7a

5. アプリケーション作成のためのプロジェクトを作成する。

        C:\Users\rbtnn\Desktop\and>android create project --target 1 --path ./ --activity Sample --package rbtnn.sample
        Error: Project folder 'C:\Users\rbtnn\Desktop\and' is not empty. Please consider
         using 'android.bat update' instead.
        Created directory C:\Users\rbtnn\Desktop\and\src\rbtnn\sample
        Added file C:\Users\rbtnn\Desktop\and\src\rbtnn\sample\Sample.java
        Created directory C:\Users\rbtnn\Desktop\and\res
        Created directory C:\Users\rbtnn\Desktop\and\bin
        Created directory C:\Users\rbtnn\Desktop\and\libs
        Created directory C:\Users\rbtnn\Desktop\and\res\values
        Added file C:\Users\rbtnn\Desktop\and\res\values\strings.xml
        Created directory C:\Users\rbtnn\Desktop\and\res\layout
        Added file C:\Users\rbtnn\Desktop\and\res\layout\main.xml
        Created directory C:\Users\rbtnn\Desktop\and\res\drawable-xhdpi
        Created directory C:\Users\rbtnn\Desktop\and\res\drawable-hdpi
        Created directory C:\Users\rbtnn\Desktop\and\res\drawable-mdpi
        Created directory C:\Users\rbtnn\Desktop\and\res\drawable-ldpi
        Added file C:\Users\rbtnn\Desktop\and\AndroidManifest.xml
        Added file C:\Users\rbtnn\Desktop\and\build.xml
        Added file C:\Users\rbtnn\Desktop\and\proguard-project.txt

5. ビルド。

        C:\Users\rbtnn\Desktop\and>ant release

6. アプリケーションに署名するために、キーを作成する。
 
        C:\Users\rbtnn\Desktop\and>keytool -genkey -dname "c=JP" -keypass hogehoge -keystore rsa.keystore -storepass hogehoge -validity 10000 -alias Sample -keyalg RSA

7. アプリケーションに署名する。

        C:\Users\rbtnn\Desktop\and>jarsigner -keystore rsa.keystore -keypass hogehoge -storepass hogehoge Sample-release-unsigned.apk Sample


参考
----

* http://relog.xii.jp/archives/2011/06/keystore.html
* http://d.hatena.ne.jp/nink/20121121/1353503717
ルビーラックワンライナーウェッブサーバー  ~ the new age ~

@udzura さんという人のプルリクエスト [#480](https://github.com/rack/rack/pull/480) のマージから、 `rackup` コマンドに `-b/--builder` というオプションが追加されました。

これは、従来は `config.ru` に書いていたようなRackアプリケーションビルダーDSLをコマンドで直接指定するためのフラグです（従来から `-e` オプションはありましたが、これはDSLではなくただのeval扱いで、別途`config.ru`などの設定ファイルがないとサーバは起動しませんでした）。

以下のようなGemfileを作って

```ruby:Gemfile
gem 'rack', '~> 1.5.0', github: 'rack/rack'
```

```bash
$ bundle install
Using rack (1.5.0) from git://github.com/rack/rack.git (at master) 
Using bundler (1.2.3) 
```

未リリースのrack 1.5.0が入ります。そうしたら、

```bash
$ bundle exec rackup -b "run Rack::Directory.new '~/Pictures'"
```

とでもしてみれば、ワンライナーでサーバが立ち上がります。そのうち 1.5.0 がちゃんとリリースされれば -b オプションは普通に使えるようになるでしょう。

ということで、Perlモンガ〜の方に「えーrackupってワンライナーでサーバ立ち上げられないんだ〜」と言われることもなくなり、rackupでのワンライナーバッドノウハウ論争も必要なくなり、平和が訪れるといいなあと思いました。

というか割とあっさりマージされてびっくりしましたとさ。
CLtL2: 第27章 プリティプリント その４

プリティプリントの方法には、今までみてきたようなプリティプリント用関数を駆使する方法のほかに、format文を使う方法もあります。その場合、通常の制御文に混ぜて、プリティプリント用の制御文を使うことになります。

論理ブロックは"~<"と"~:>"で指示されます。任意のprefixとsufixを用いることができます。たとえば、jsonのような出力をするには、`~;`でprefix部と本体とsufix部を分けて、次のようにします。

```cl
cg-user(147): (setq foo '((slot1 val1) (slot2 val2) (slot3 val3)))
((slot1 val1) (slot2 val2) (slot3 val3))
cg-user(148): (defun pprint-json-object (list)
                (format t "~<{~;~@{~{\"~W\": ~W~}~^, ~_~}~;}~:>" list))
pprint-json-object
cg-user(149): (pprint-json-object foo)
{"slot1": val1, "slot2": val2, "slot3": val3}
nil
cg-user(150): (pprint-json-object foo)
{"slot1": val1,
 "slot2": val2,
 "slot3": val3}
nil
```

ここで`~_`は`(pprint-newline :linear)`に相当するものです。Window幅を狭くして、一行に収まらないときには、各行に分割されます。:fillにするには`~:_`を使います。上記関数を書き換えてその変化を確かめてください。

Json-object の表記に、クラス名とオブジェクト名を書くことにします。そうすると次のようになります。

```cl
cg-user(152): (setq foo '(long-long-class-name long-long-object-name (slot1 val1) (slot2 val2) (slot3 val3)))
(long-long-class-name long-long-object-name (slot1 val1) (slot2 val2) (slot3 val3))
cg-user(153): (defun pprint-object (list)
               (format t "~<{~;~W ~@_~W~1I ~@{~_~{\"~W\": ~W~}~^, ~}~;}~:>" list))
pprint-object
cg-user(154): (pprint-object foo)
{long-long-class-name long-long-object-name "slot1": val1, "slot2": val2, "slot3": val3}
nil
cg-user(155): (pprint-object foo)
{long-long-class-name long-long-object-name
  "slot1": val1,
  "slot2": val2,
  "slot3": val3}
nil
```

ここで`~1I`は`(pprint-indent :block 1)`に相当します。詳しい使い方はCLtL2を見ていただくとして、制御文の大体が分かってしまえば、試行錯誤を手早くするにはフォーマット制御文の方が圧倒的に楽ですね。

ウーム、やはりSBCLではこの例も働きませんね。何か前提のセットアップがあるのでしょうか。エラーにはならないんですよ。どなたか教えてください。

なんか不満が残りますが、新しい情報が入り次第、お知らせいたします。
Erlang VMがノード間通信に使用するTCP/IPポートを指定する

Erlang VMがノード間のプロセス間通信に使用するポートは2種類ある。

1. epmd（Erlang Port Mapper Daemon）が使用するポート **4369**
2. Erlang VMがノード間の通信に使うポート。epmdが **動的に割り当てる**

後者は `inet_dist_listen_*`パラメータで範囲を指定できる。

例：後者の通信にポート 6000 から 6099 を使う場合

```sh
$ erl -sname nodeX +A8 -kernel inet_dist_listen_min 6000 inet_dist_listen_max 6099
```
Pythonのfeedparserをつかってみる。


自分用メモです。

(取得しているフィードを気にしてはいけない)

``` feedをパースする(取得しているフィードを気にしてはいけない)
skeameba = feedparser.parse('http://rssblog.ameba.jp/ske48official/rss.html')
```

このままだと、日本語がエスケープされている

``` 読めない……
In [21]: skeameba['entries'][0]['title']
u'(\u5927\u77e2\u771f\u90a3)\u6709\u540d\u306a\u306e\u304b\u306a'
```

と、いうことで日本語の表示

``` 日本語を表示する
def pp(obj):
    pp = pprint.PrettyPrinter(indent=4, width=160)
    str = pp.pformat(obj)
    return re.sub(r"\\u([0-9a-f]{4})", lambda x unichr(int ("0x" + x.group(1), 16)), str)
```


そうするとこんな感じで。

``` こんな感じで使える
for entry in skeameba['entries']:
    title = entry['title']
    link = entry['link']
    print "title:", pp(title)    print "link: " , link
```

```
title: u'(大矢真那)有名なのかな'
link:  http://ameblo.jp/ske48official/entry-11442256228.html
title: u'ちゅり＝(((O゜◇゜)o｛２０１３年もカメラ女子楽しんでこ～!!!'
link:  http://ameblo.jp/ske48official/entry-11442248464.html
title: u'初詣。（花・з・）～♪'
link:  http://ameblo.jp/ske48official/entry-11442205471.html
title: u'オレンジジュースとおにぎり(・∀・＞)'
link:  http://ameblo.jp/ske48official/entry-11442174092.html
title: u'古川(゜∀。*)ポチ'
link:  http://ameblo.jp/ske48official/entry-11442139096.html
title: u'おいひ～＊♪(゜ー゜夏)'
link:  http://ameblo.jp/ske48official/entry-11442056727.html
title: u'小木曽(・*・隠れ家。)3汐莉'
link:  http://ameblo.jp/ske48official/entry-11442023303.html
title: u'秦＊その瞬間'
link:  http://ameblo.jp/ske48official/entry-11441959773.html
title: u'☆あけおめです!!★KUMI'
link:  http://ameblo.jp/ske48official/entry-11441813459.html
title: u'れな(初詣・ω・さん)'
link:  http://ameblo.jp/ske48official/entry-11441713875.html
```
特定のディレクトリ以下を除外して RSpec を実行する Rake タスク


```ruby:rspec_core_rake_task_with_ignore_patterns.rb
require 'rspec/core/rake_task'
unless defined?(RSpec::Core::RakeTaskWithIgnorePattern)
  class RSpec::Core::RakeTaskWithIgnorePattern < RSpec::Core::RakeTask
    attr_accessor :ignore_patterns

    def setup_ivar(args)
      super

      self.ignore_pattern ||= []
    end

    def files_to_run
      original_files_to_run = super

      unless ENV.has_key?('SPEC')
        original_files_to_run.exclude(*ignore_patterns)
      end

      original_files_to_run
    end
  end
end
```

```ruby:with_ignore_patterns.rake
ignore_patterns_file = File.expand_path('.rspec-ignore')
ignore_patterns = File.readable?(ignore_patterns_file) ? [*File.read(ignore_patterns_file).lines] : []
RSpec::Core::RakeTaskWithIgnorePattern.new(test: spec_prerequisites) do |t|
  t.ignore_patterns = ignore_patterns
end
```

```.rspec-ignore
spec/factories/**/*.rb
```
とあるフィルタの備忘: 置き換え・ずらしフィルタ

とあるフィルタの備忘

## 概要

Photoshop の「置き換え」フィルタ（フィルター＞変形＞置き換え）は、GIMP のずらしフィルタに相当するらしい。
GIMP のアルゴリズムでは、輝度値をマスクとしてピクセルを移動させるためのフィルタとなっている。いわゆるワープフィルタ。

## アルゴリズム（GIMP 版）

Photoshop の置き換えフィルタが何をやっているかは分からないが、GIMP では以下のような感じになる：

- マスクは256諧調のグレースケールで、対象となるビットマップ画像と同じ縦横画素数とする
- X方向移動用とY方向移動用のマスク、2種類を用意する
- 移動はマスクの輝度に依存する。ここで、輝度値 - 127.5 とすると、その範囲は -127.5 〜 +127.5となる
- 128 ではない理由はたぶん 255 / 2 = 127.5 だから
- 輝度値 - 127.5 = 0.0 の場合は移動が発生しない
- 正数と負数で移動方向が真逆になる

### 移動量の計算

あるピクセルP(x, y)について、

- X方向移動用のマスクから座標(x, y)の輝度値を抽出、更に -127.5　……mx 
- Y方向移動用のマスクから座標(x, y)の輝度値を抽出、更に -127.5　……my
- Xずらし強度（パラメータ）　……wx
- Yずらし強度（パラメータ）　……wy

#### 移動量 = (輝度値xずらし強度)/127.5

に代入すると、
PのX移動量 = (mx•wx)/127.5
PのY移動量 = (my•wy)/127.5

// あってんのかなこれ。
free-gameで円を描く！

[@fumieval](http://qiita.com/users/fumieval) さんのお作りになった free-game(http://hackage.haskell.org/package/free-game) というGUIを扱うパッケージの(骨組み)サンプルです。

画面に円を描きます。
(円を描く函数renderCircleはfree-game 3.0では未実装なのでここでは自前で実装しています)

```haskell:sample.hs
{-# LANGUAGE TemplateHaskell #-}
import Graphics.FreeGame
import Data.Word
import Data.Array.Repa
import Control.Monad

import Control.Lens

data World = World{
  _object :: Picture,
  _pos :: (Float, Float)
  }

$(makeLenses ''World)

initWorld :: Picture ->  World
initWorld p = World { _object = p, _pos = (100,300) }

renderCircle :: Int -> (Word8, Word8, Word8, Word8) -> Bitmap
renderCircle size (r,g,b,a) = toStableBitmap $ computeS $ fromFunction (Z :. size :. size :. 4) render where
    center = fromIntegral size / 2
    render (Z:.y:.x:.0)
        | s < 0 = a
        | s >= 1 = 0
        | otherwise = floor ((1 - s) * 256)
        where
            r = sqrt $ (fromIntegral y - center) ^ 2 + (fromIntegral x - center) ^ 2
            s = r - fromIntegral size / 2
    render (Z:._:._:.c) = [undefined,b,g,r] !! c

draw :: World -> Game ()
draw w = let (x,y) = (w ^. pos) in drawPicture . Translate (Vec2 x y) $ (w ^. object)

main :: IO (Maybe ())
main = runGame defaultGameParam $ do
  p <- loadPicture $ renderCircle 128 (128, 216, 128, 255)
  run $ initWorld p
  
  where
    run :: World -> Game ()
    run w = do
      isQuit <- askInput KeyEsc
      
      draw w
      
      tick
      unless isQuit $ run w
```

簡単で強力なfree-gameをあなたもぜひ！
rails_adminをdeviseぬきで


rails (3.2.5)
rails_admin (0.3.0)

## 詳しくはgistをご参照ください

Using rails_admin without devise
https://gist.github.com/4452504

devise依存の他のgemを使いたい、もしくは既にdeviseに密結合してアプリが動いている的な時。

rails_admin載せるようなレベル感のサービスなので、認証もある程度のラインでOKだろうと。

[rails_adminのwiki](https://github.com/sferik/rails_admin/wiki)に
[Authentication > Manually](https://gist.github.com/1278355)が貼ってあって、gistで紹介してくれてるんだけど動かないらしいのでforkして省略せずかいといた。

## Refinery CMSをいれたかった

で、自分は何をしたかったというと、Refinery CMSをいれたかった。
これ、既存のdevise依存プロジェクトにいれるのは苦痛というか、出来ても後が辛いでしょう。。。
http://sdownie.com/blogs/integrating-refinery-rails-3-2-into-your-existing-rails-app
/proc/uptime に依存するアプリの長期稼働のテスト

あるアプリで `/proc/uptime` が `497 days, 2:27:52.95` を超えた時に不具合が発生しました（1/100秒単位の32ビット符号なし整数の限界）。

検証環境とかで再現させようにも 497 日も連続稼働させないといけないので現実的ではありません・・・

そこで、次のようにダミーのファイルをマウントして無理やり長期稼働させた状況を再現させました。

## 方法

ダミーの uptime を作成して /proc/uptime にマウントする。

	echo "42949672.96 42949672.96" > /root/uptime.dummy
	mount --bind /root/uptime.dummy /proc/uptime

元に戻す。

	umount /proc/uptime
PHPUnitの$this->assertXXXX() の別記法

staticメソッドなので、self::でも呼べるみたい。

```php
<?php
class SomeTest extends PHPUnit_Framework_TestCase
{
  function testSomething() {
    $this->assertEquals(2, 1+1); //普通こう書くけど
    self::assertEquals(2, 1+1);  //これでもOK
  }
}
```

$this-> より self::の方がタイプするのが楽かも。
依存しているライブラリのソースをダウンロード

依存しているライブラリのソースは Dependency Plugin でダウンロードできる。

```
$ mvn dependency:sources
```

ダウンロード後、Eclipse Plugin を実行し、Eclipse にプロジェクトをインポートするとソースコードがアタッチされた状態になっている。

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

### 2014/04/28 追記
pom.xml pom.xml の build -> plugins に以下を追記して、`mvn eclipse:eclipse` でも可能なことを知りました。Eclipse にソースコードをアタッチする目的ならこちらの方が楽だし、共有もできていいですね。

```xml
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-eclipse-plugin</artifactId>
  <configuration>
    <downloadSources>true</downloadSources>
    <downloadJavadocs>true</downloadJavadocs>
  </configuration>
</plugin>
```
Windows の Git Shell で vim を使う

[GitHub for Windows](http://windows.github.com/)を導入すると、Git Shellが使えます。
ここで多くの Unixライクなコマンドが使えます。vim も入っていますが、単に vim しても実行できませんが、下記のように設定すると使えるようになります。

+ Git Shell は PowerShell にしておきます。(デフォルト)
+ Git Shell を起動し、下記を実行します。
+ `mkdir $(Get-ChildItem $profile).DirectoryName`
+ `echo 'function vim {sh vim $args}' > $profile`
+ いったん、終了します。

次回の起動から、vim が使えるようになります。(viでも 同様にできます)

+ 既にプロファイルを作成済みの場合は、echoの内容を追記してください。
+ Unicodeで作成されるのがいやならば、別途メモ帳などで作成してください。
zsh のファイル名生成で除外パターンを指定する

zsh に限らずたいていのシェルでは、ファイル名としてパターンを指定してマッチさせることができる。例えば `rm *.bak` とすると .bak で終わる名前のファイル全部を削除できる。

でも zsh はもっと強力で、「まとめてファイルを削除したいけど、このファイルだけは残したい」 というような除外パターンも指定できるので紹介する。

まず準備として、.zshrc で下のオプションを有効にしておこう。

```sh:.zshrc
setopt extended_glob
```

これで `^` と `~` を使って除外パターンを指定できるようになる。

`^` と `~` の使い方は以下。

## マッチを反転させる
`^` を使うとマッチの反転ができる。

例えば `^Makefile` で「Makefile 以外のファイル全部」、`^*.bak` で「ファイル名の末尾が .bak でないファイル全部」という意味になる。

## マッチを引き算する
「パターン1~パターン2」という形で `~` を使うと、パターン1にマッチしてパターン2にマッチしないもの全部という意味になる。パターン1からパターン2を引き算しているようなイメージ。

例えば `*~OLD` で「OLD 以外のすべてのファイル」、`*.c~temp_*` で「ファイル名の末尾が .c かつファイル名の先頭が temp_ でないファイル全部」という意味になる。

どんな時に使うと便利かという例を紹介する。

## 例1
ファイル全部を1つのディレクトリに移動させたいようなときに使える。

```sh
% cd Desktop
% ls
hoge.c fuga.c piyo.h
dir1/ dir2/ dir3/
...
# なんかデスクトップにいっぱいファイルとかフォルダがある。

# 一旦ディレクトリを作って全部そこに入れたい。
% mkdir OLD
% mv ^OLD OLD
# 「OLD以外の全ファイルをOLDに移動」という意味になるのでうまくいく。
```

## 例2
大事なファイルといらないファイルが1つのディレクトリ内にまざってしまったときにも役に立つ。

```sh
% cd ~
% ls
Desktop/ bin/
img.jpg img.jpg img.jpg
gomi4.png gomi5.png gomi6.png
...
# おおお、ホームディレクトリに変な画像をぶちまけてしまった!
# いらないのを削除したい。でも Desktop と bin は大事なので残したい。

# zsh なら大丈夫。

% rm *~Desktop~bin

# これで「Desktop と bin を残して、それ以外を全部削除する」という意味になる。
# こんなふうに ~ は何個も連結して引き算できる。
```

## 例3
「今回はこのファイルだけは含めたくない」というようなときにも使える。

```sh
% ls
file1.rb file2.rb file3.rb file4.rb
% vim ... # 何か編集 ...

# 勢いでばんばん修正したけど、そろそろ git にコミットしたい。
# でも file3.rb だけは今回コミットしたくない。

% git add ^file3.rb
# git add file1.rb file2.rb file4.rb になる。

% git commit
# file3.rb 以外だけコミットできた!
```

工夫次第でいろいろ役に立つと思うので参考にしてください!

### 参考
zshexpn(1) の FILENAME GENERATION
fs.mkdirの第2引数のパーミッションモードをテスト

うーん、その他　の書き込み属性がうまくいかない。。。。。

```
 fs.mkdir('./dir1', '0666',
  function (err) {
    if (err) throw err;
    console.log('ディレクトリ作成完了');
  }
);

//結果> 664のディレクトリができた
```

```
fs.mkdir('./dir2', '0707',
  function (err) {
    if (err) throw err;
    console.log('ディレクトリ作成完了');
  }
);

//結果> 705のディレクトリができた
```

```
fs.mkdir('./dir3', 0707,
  function (err) {
    if (err) throw err;
    console.log('ディレクトリ作成完了');
  }
);

//結果> 705のディレクトリができた
```

```
fs.mkdir('./dir4',  455,　// parseInt("0707", 8)
  function (err) {
    if (err) throw err;
    console.log('ディレクトリ作成完了');
  }
);

//結果> 705のディレクトリができた
```

大津さんのアドバイスで、デフォルトのマスク 0002 を忘れたことに気がついて、直してみた＾＾。

```
var fs = require('fs');
process.chdir(__dirname);


console.log('マスク: ' + process.umask().toString(8)); //結果>マスク: 2
var oldMask = process.umask(0);
console.log('マスク: ' + process.umask().toString(8)); //結果>マスク: 0


fs.mkdir('./dir1', '0666',
  function (err) {
    if (err) throw err;
    console.log('ディレクトリ作成完了');
  }
);
//結果> 666のディレクトリができた


fs.mkdir('./dir2', '0707',
  function (err) {
    if (err) throw err;
    console.log('ディレクトリ作成完了');
  }
);
//結果> 707のディレクトリができた

fs.mkdir('./dir3', 0707,
  function (err) {
    if (err) throw err;
    console.log('ディレクトリ作成完了');
  }
);
//結果> 707のディレクトリができた

fs.mkdir('./dir4',  455, // parseInt("0707", 8)
  function (err) {
    if (err) throw err;
    console.log('ディレクトリ作成完了');
  }
);
//結果> 707のディレクトリができた

console.log('マスク: ' + process.umask().toString(8)); //結果>マスク: 0
process.umask(oldMask);//マスクを戻す
console.log('マスク: ' + process.umask().toString(8)); //結果>マスク: 2


//　結果の順番に非同期が与える影響の可能性は無視^^;
```

これ、そういえば、数か月前にもミスった記憶が、、、^^;
D言語書いた

## コンパイラ

`rdmd` 含む

```bash
brew install dmd
```

## d-mode

* https://github.com/Emacs-D-Mode-Maintainers/Emacs-D-Mode

```d:hello.d
import std.stdio;

int main() {
  printf("Hello\n");
  return 0;
}
```

```bash
rdmd ./hello.d
Hello
```

特にリファレンスを読まずに書いたら、

> hello.d(4): Error: undefined identifier println, did you mean function printf?

って言ってくれたので凄く感動した。
String#matches は完全一致


Scala（Java もかな？）の String#matches は、正規表現が String 全体にマッチしているかを判断する。

```scala
"Hello".matches("ll")
// res0: Boolean = false
"Hello".matches(".*ll.*")
// res1: Boolean = true
```

Ruby ならこんな感じ？

```rb
!!("Hello" =~ /^ll$/)
# => false
!!("Hello" =~ /^.*ll.*$/)
# => true
```
NSArrayの差分を取る


カテゴリ拡張でつくってみた。

## 使い方
``` objc:

NSArray* aArray = @[@"a", @"b", @"c", @"d"];
NSArray* bArray = @[@"b", @"c", @"d", @"e", @"f"];

NSArray* newArray = [aArray difference:bArray];
NSLog(@"diff : %@", [newArray description]);

/* diff : a, e, f */
```

## 実装

**1/5追記**

[Twitter](https://twitter.com/y_matsuwitter/status/287171134347157504)にて「NSOrderedSet使って順番も保持したら」とツッコミいただきました。


``` objc:NSArray+Difference.m
@implementation NSArray (Difference)

- (NSArray*)difference:(NSArray*)otherArray
{
    NSMutableOrderedSet* allSet = [NSMutableOrderedSet orderedSetWithArray:self];
    [allSet addObjectsFromArray:otherArray];
    
    NSMutableOrderedSet* duplicateSet = [NSMutableOrderedSet orderedSetWithArray:self];
    [duplicateSet intersectOrderedSet:[NSOrderedSet orderedSetWithArray:otherArray]];
    
    [allSet minusOrderedSet:duplicateSet];
    return [allSet array];
}

@end

```

これなら順番を保持したいとき、そうでないときのどちらにも対応できますね。
用途に応じて、ここから更に拡張もできそうです。
ありがとうございます！  

---
---

**1/4追記**

コメントにていただいたアドバイスを元に書き換えてみました。

``` objc:NSArray+Difference.m

@implementation NSArray (Difference)

- (NSArray*)difference:(NSArray*)otherArray
{
    // まとめる
    NSMutableSet* allSet = [NSMutableSet setWithArray:self];
    [allSet addObjectsFromArray:otherArray];
    
    // 重複する要素のみ抜き出して、
    NSMutableSet* duplicateSet = [NSMutableSet setWithArray:self];
    [duplicateSet intersectSet:[NSSet setWithArray:otherArray]];
    
    // 削除
    [allSet minusSet:duplicateSet];
    return [allSet allObjects];
}

@end

```

すっきり！




---
---

前のも残しておきます。

``` objc:NSArray+Difference.m
@implementation NSArray (Difference)

- (NSArray*)difference:(NSArray*)otherArray
{
    // 配列をまとめる
    NSArray* all = [self arrayByAddingObjectsFromArray:otherArray];

    // 配列の中身をキーに、それぞれの数を格納
    NSMutableDictionary* dic = [NSMutableDictionary dictionary];
    for (NSString* key in all) {
        if (![dic hasKey:key]) {
            [dic setObject:@(1) forKey:key];
        } else {
            NSInteger num = [[dic objectForKey:key] integerValue];
            num++;
            [dic setObject:@(num) forKey:key];
        }
    }
    
    // 値が1のものだけ追加して返す
    NSMutableArray* res = [NSMutableArray array];
    for (NSString* key in [dic allKeys]) {
        if ([[dic objectForKey:key] integerValue] == 1) {
            [res addObject:key];
        }
    }
    return res;
}

@end
```

## 参考
[配列の差分　PerlとObjective-C](http://www.mobile4children.com/?p=316)

[NSMutableSet Class Reference](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsmutableset_Class/Reference/NSMutableSet.html)
pwgen のよく使うオプション

- -B: 1 と l のような紛らわしい文字を使わない
- -s: 全くのランダムな文字列を生成する
- -y: 記号を含める

pwgen は覚えやすそうなパスワードを生成するコマンドラインツール。
`pwgen 16` のようにすると 16 文字からなるパスワードを羅列するので、良さそうなものを選ぶ。
Macで\入力めんどくね？

正規表現の時にやたら使う\（バックスラッシュ）ですが、Macの日本語キーボードの場合は、option + ¥ で入力しなくちゃいけなくて正直めんどいです。

と言われたのでやってみた。

    noremap! ¥ \
    noremap! \ ¥

なんか、あたりまえ体操なんですが。やってみると効果大ですｗ
Trouble when using google drive api on Ruby on Rails

I'm using google/api_client for  testing google drive service. When my rails app tried to authorize, on ssl ,the trouble occurred.
[Error Message] 
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
I solved it like it.
1. Download the CA file from http://curl.haxx.se/ca/cacert.pem and copy it to /usr/local/etc/openssl/certs/ .
2. Add  "export  SL_CERT_FILE=/usr/local/etc/openssl/certs/cacert.pem" to ~/.bash_profile so that apps can it pick up.

[End]
LINQ 一覧

|演算子|説明|
|:--|:-------------|
|Where|述語関数に基づく制限演算子|
|Select/SelectMany|選択関数に基づくプロジェクション演算子|
|Take/SkipTakeWhile/SkipWhile|位置決め関数または述語関数に基づくパーティション分割演算子|
|Join/GroupJoin|キー選択関数に基づく結合演算子|
|Concat|連結演算子|
|OrderBy/ThenBy/OrderByDescending/ThenByDescending|省略可能なキー選択関数と比較関数に基づいて昇順または降順に並べ替える並べ替え演算子|
|Reverse|シーケンスの順序を反転する並べ替え演算子|
|GroupBy|省略可能なキー選択関数と比較関数に基づくグループ化演算子|
|Distinct|重複を削除するセット演算子|
|Union/Intersect|和集合または積集合を返すセット演算子|
|Except|差集合を返すセット演算子|
|AsEnumerable|IEnumerable<T> への変換演算子|
|ToArray/ToList|配列または List<T> への変換演算子|
|ToDictionary/ToLookup|キー選択関数に基づく Dictionary<K,T> または Lookup<K,T> (多重辞書) への変換演算子|
|OfType/Cast|フィルタ選択に基づく IEnumerable<T> への変換演算子または型引数への変換|
|SequenceEqual|対になった要素の等値性をチェックする等価演算子|
|First/FirstOrDefault/Last/LastOrDefault/Single/SingleOrDefault|省略可能な述語関数に基づいて初期要素、最終要素、または唯一の要素を返す要素演算子|
|ElementAt/ElementAtOrDefault|位置に基づいて要素を返す要素演算子|
|DefaultIfEmpty|空のシーケンスを既定値の単一シーケンスに置き換える要素演算子|
|Range|範囲内の数を返す生成演算子|
|Repeat|特定の値の複数の出現を返す生成演算子|
|Empty|空のシーケンスを返す生成演算子|
|All/Any|述語関数の実存的または普遍的充足度をチェックする限定子|
|Contains|特定の要素の存在をチェックする限定子|
|Count/LongCount|省略可能な述語関数に基づいて要素を数える集計演算子|
|Sum/Min/Max/Average|省略可能な選択関数に基づく集計演算子|
|Aggregate|累積関数および省略可能なシードを基に複数の値を集積する集計演算子|
[アルゴリズム演習] 2分探索

2分探索せよ。

+ funcがfalseからtrueに切り替わる値を求める。
+ lower, upperは仮の値とする。
+ func(lower) == false となるlowerを探す
+ func(upper) == true となるupperを探す
+ upper – lower < εとなるまで繰り返す

```c#
static double BinarySearch(Func func, double lower, double upper);
Console.WriteLine("{0:F4}", BinarySearch(x => x * x - 2 > 0, 0, 1)); // 1.4142
```
[アルゴリズム演習] UnionFind木

UnionFind木を完成させよ。

+ グループ分けを管理するデータ構造。
+ 要素aと要素bが同じグループかどうかを調べる。
+ 要素aと要素bのグループを併合する。
+ 配列(parent)で親を管理。
+ 追加（Add）：最後にユニークな値を入れる。
+ 併合(Union)：片方のグループの木の根からもう片方のグループの木の根をはる。
+ 判定(IsSame)：親をたどり各々の根が同じかどうかを見る。
+ 根を調べる(Find)：親をたどる。

```c#
public class UnionFind
{
	private List<int> parent = new List<int>();
	public void Add() { ... }
	public bool IsSame(int i, int j) { ... }
	public int Find(int i) { ... }
	public void Unite(int a, int b) { ... }
}
```
コマンド一発でrvmのgemフォルダへ移動

これまでいちいち cd ~/.rvm/gems/...みたいなコマンドを打ってたけど、こうすればよかった。

```bash
cd `rvm gemdir`/gems
```

/gemsを打つのが面倒なので、これをエイリアスすると楽。

```bash
alias cd_gems='cd `rvm gemdir`/gems'
```
[アルゴリズム演習] ヒープ

ヒープとは、二分木で、要素の追加と最小値の取り出しができる構造

+ 親は子供より必ず小さい(ルートが最小)
+ 要素の追加(Push)は、最後に追加し、逆転がなくなるまで更新
+ 最小値の取り出し(Pop)は、最後の要素で埋めて、逆転がなくなるまで更新
+ 各操作はO(log n)

下記のクラスを完成させよ

```c#
public class Heap
{
	private List data = new List();
	public bool IsEmpty() { ... }
	public void Push(int a) { ... }
	public int Pop() { ... }
	int Swap(int i, int j) { int t = data[i]; data[i] = data[j]; data[j] = t; return j; }
}
```
[確率・統計演習] 平均と標準偏差と信頼区間

家でメダカを飼っている。全部の長さを調べたところ下記の通りだった。
平均と標準偏差を求めよ。

> double[] dd = {11, 13, 12, 16, 18, 19, 14, 17};

庭でメダカを飼っている。8匹すくってみたところ、長さは上記の通りだった。
標準偏差と95%信頼区間を求めよ。
[確率・統計演習] 指輪をしている人に恋人はいるか

表 指輪の装着と恋人の有無(度数)

|        |恋人あり|恋人なし|
|:-------|-------:|-------:|
|指輪あり|      25|      11|
|指輪なし|      10|      16|

「指輪の装着と恋人の有無には関係がない」という帰無仮説を有意水準5％でカイ二乗検定で判定せよ。
[シミュレーション演習] M/M/1 待ち行列

平均到着率 ＝ 3、平均サービス率 ＝ 4として、M/M/1の待ち行列を1万単位時間行い、平均稼働率、平均系内数、平均系内時間を求め、理論値と比較せよ。
理論値は、平均稼働率=ρ、平均系内数=ρ/(1-ρ)、平均系内時間=1/(μ-λ)を用いよ。参考リトルの公式「L＝λW」
[PSP演習] 5A 数値積分

次のような形式で、シンプソン則で積分する関数を作成せよ。

```c#
public delegate double CalcFunc(double x);
public static double Simpson(CalcFunc f, double lower, double upper);
```				
シンプソン則は、n 分割した n+1 個の位置での値に 1,4,2,4,2,...,1 を掛けて和をとり、 (upper-lower) を掛けて 3*n で割ったものが積分値となる。分割数は偶数でなければいけない。 無限ループにならないようにチェックせよ。
[PSP演習] 4A 線形回帰による予測

n 個の実数の組(x,y)から y = β0 + β1*x となる線形回帰の係数 β0、β1 を求め算出せよ。
計算式は![計算式](http://plaza.harmonix.ne.jp/~fakira/turedure/pic2.GIF)を用いよ。
ゼロ割しないようにすること。

```c#
public static void CalcB0B1(double[][] l, out double b0, out double b1)
```
Mac のテキスト複数選択・矩形選択を無効化する

こんなの誰も得しないと思うが備忘で。

option キーや command キーを押しながらマウスを使うと複数選択・矩形選択が可能だが、`NSProhibitMultipleTextSelectionByMouse` というキーを plist に書き込んで BOOL 値を設定することで無効化可能。

特定アプリの複数選択・矩形選択を無効化

```sh:Xcode
defaults write com.apple.dt.Xcode NSProhibitMultipleTextSelectionByMouse -bool YES
```

OS 全体で無効化

```sh:Global
defaults write NSGlobalDomain NSProhibitMultipleTextSelectionByMouse -bool YES
```
[PSP演習] 2A LOCカウント

C#のプログラムを文字列で受け取り、LOC(LineOfCode)を計算せよ。
ただし、LOC は、コメントと文字内と文字列内を除き、「;」と「{」の数とする。
```c#
public static int CalcLoc(string src)
```
[PSP演習] 1A リンクリスト作成

下記の「TODO」を埋めて、リンクリストを完成させよ。

``` c#
public class MyLinkedList<T> : IEnumerable<T>
{
	internal class Item
	{
		internal T Value;
		internal Item Next;
		public Item(T t){ Value = t; }
	}
	public int Length { get; private set; }
	private Item Top;
	public MyLinkedList()
	{
		// TODO:初期化
	}
	public void AddLast(T t)
	{
		// TODO:追加
	}
	public IEnumerator<T> GetEnumerator()
	{
		// TODO:反復子
	}
	System.Collections.IEnumerator
		System.Collections.IEnumerable.GetEnumerator()
	{
		return GetEnumerator();
	}
}
```
Ruby RSSライブラリーの重箱の隅

重箱の隅って、意味が違うけど。

標準添付の[RSSライブラリー][rss]を使ってAtomとかRSSとかのフィードを作る時。
基本的にはるりまやそこから辿れる[COZMIXNG][cozmixng]のチュートリアル・リファレンスを見れば分かるんだけど、直感的じゃないのが幾つかあるので、昔の日記から持ってきてみた。

Atomフィードに複数のlink要素を入れる
------------------------------------
Ruby標準添付のRSSライブラリーでAtomフィードを作っている時。
[公式サイトのサンプル][maker]では

```ruby
maker.channel.link = uri
```

とやって、一つのリンクを入れている。

```ruby
maker.channel.link = uri
maker.channel.link = another_uri
```

とやっても、後からのリンクしか入らない。
これをどうするか。

```ruby
maker.channel.links.new_link do |link|
  link.rel = 'self'
  link.type = 'application/atom+xml'
  link.href = uri
end
maker.channel.links.new_link do |link|
  link.rel = 'alternate'
  link.type = 'text/html'
  link.href = another_uri
end
```

これは、複数のlinkを入れるだけでなく、あるlinkにtypeやrelなどの属性を設定する方法でもある。

Atomフィードのsummaryの属性を設定する
-------------------------------------
entry要素のコンテンツ本体を設定するには

```ruby
item.summary = content
```
とする。

ここで、contentが（エスケープ済みの）HTMLの場合（エスケープしないとXMLの要素になっちゃうからそもそもNG。でもRSSライブラリーが面倒見てくれるから、あんまり気にしないでいい。こういう警告を食らった時くらいかな）、これで[W3Cのバリデーター][validator]を通すと、警告として、「summary要素にHTMLが入っているけど、入れたいならtype属性にhtmlって指定しなさいよ」って言われる。
これの解決法。

```ruby
item.summary do |summary|
  summary.type = 'html'
  summary.content = content
end
```

item.contentのAPIが何か変な気がする
-----------------------------------
Ruby標準添付のRSSライブラリーでAtomフィードを組み立てていて、entry要素の中に要素を置く時、普通はこうする。

```ruby
item.summary = entry_summary
```

属性を付けるんだったらこんな感じ。

```ruby
item.summary do |summary|
  summary.type = 'html'
  summary.content = entry_summary
end
```

でもitem.contentだけ違う。
これはNG。

```ruby
item.content do |content|
  content.type = 'html'
  content.content = entry_content
end
```

エラーにはならないけど、ブロックは無視される。
正しくはこうしなければならない。

```ruby
item.content.type = 'html'
item.content.content = content
```

まあ昔の日記見ろよって話なんですが、Qiitaにある方が（自分が）参照しやすいし、何より日記のレンサバが重いので……。

[rss]: http://doc.ruby-lang.org/ja/1.9.3/library/rss.html
[cozmixng]: http://www.cozmixng.org/~rwiki/?cmd=view;name=RSS+Parser
[maker]: http://www.cozmixng.org/~rwiki/?cmd=view;name=RSS+Parser%3A%3ATutorial.ja#RSS.2fAtom.e3.82.aa.e3.83.96.e3.82.b8.e3.82.a7.e3.82.af.e3.83.88.e3.82.92.e4.bd.9c.e3.82.8b
[validator]: http://validator.w3.org/feed/
RailsのArray拡張にforty_twoがいる謎

よく使われるのはまぁthirdくらいまで?

```
arr = %w(a b c)
arr.second # => b
arr.third # => c
```

一応`fourth`, `fifth`まで用意されている。
過去には`tenth`まであった様子。

謎なのが、`forty_two`がいること。
その理由はコミットログから追える。
https://github.com/rails/rails/commit/e50530ca3ab5db53ebc74314c54b62b91b932389#activesupport/lib/active_support/core_ext/array/access.rb
ZendQueueとKestrelでメッセージキューサーバーを体験

###Kestrel
Scalaで書かれたメッセージキューサーバー。Twitterで使われてるらしいです。  
[Twitterで使っているScalaで書かれたオープンソースのメッセージキューサーバー、Kestrel :侍ズム#samuraism](http://samuraism.jp/diary/2011/11/20/1321770660000.html)  


####インストールと起動

    $ curl -O http://robey.github.com/kestrel/download/kestrel-2.4.1.zip
    $ unzip kestrel-2.4.1.zip
    $ cd kestrel-2.4.1
    $ sudo java -jar kestrel_2.9.2-2.4.1.jar


###ZendQueue
Zend Frameworkのコンポーネントの１つで、メッセージキューを利用するために使います。　　

GitHub 
[https://github.com/zendframework/ZendQueue](https://github.com/zendframework/ZendQueue)  

メッセージを格納する方法によって複数のアダプタが用意されています。  
Kestrel用のアダプタはありませんが、Kestrelはmemcachedプロトコルをサポートしているので、MemcacheQアダプタを利用します。  

###Memcache
あらかじめMemcachedライブラリもインストールしておいて下さい。  
Macの場合はHomebrewを使うと簡単にインストールできます♪

    $ brew install memcached
    $ brew install memcache-php

###メッセージキューサーバーを体験
２つのスクリプトを用意してください。  
・worker.php : ワーカープロセス。キューからメッセージを取得して表示する。  

```php
<?php
// worker.php
$options = array(
  'name' => 'ack_queue',
	'driverOptions' => array(
		'host' => 'localhost',
		'port' => '22133',
		),
	);
 
$queue = new ZendQueue\Queue('MemcacheQ', $options);
 
for (;;) {
	$messages = $queue->receive(1);
	foreach ($messages as $mess) if ($mess->body) echo $mess->body . PHP_EOL;
}
```

・front.php : キューにメッセージを送信する。  

```php
<?php
// front.php
$options = array(
  'name' => 'ack_queue',
	'driverOptions' => array(
		'host' => 'localhost',
		'port' => '22133',
		),
	);
 
$queue = new ZendQueue\Queue('MemcacheQ', $options);
$queue->send('Hello, World!');
```

ターミナルを２つたちあげてください。  
・ターミナル１でworker.phpを実行  
プロンプトが返ってこない → Kestrelのキューを監視してくれています。  

・ターミナル２でfront.phpを実行すると…  
ターミナル１に「Hello, World!」と表示されます！  


簡単ですが以上です。  
Hello, Worldが表示された時には感動しますね (・∀・)  
worker.phpを実行するターミナルを増やしたりするとなお楽しくなってきます♪

####参考
[Twitterで使っているScalaで書かれたオープンソースのメッセージキューサーバー、Kestrel :侍ズム#samuraism](http://samuraism.jp/diary/2011/11/20/1321770660000.html)  
[PHP+Kestrel+Supervisorでお手軽タスクキューイング :アシアルブログ](http://blog.asial.co.jp/875)  
[PHPアプリでメッセージキューサーバを活用する - Zend_Queue - :CodeZine](http://codezine.jp/article/detail/5744)
いろんな言語で実行時にバージョン番号を取得する


- REPL がある場合は、REPL で実行します。
- REPL がない場合は、ソースファイルを作成して実行します。

## 環境

- Mac OS X 10.10.5

## Ceylon 

[Ceylon Web Runner](http://try.ceylon-lang.org/) より実行。

```
print(language.version); // 1.1.0
```
## Clojure

```
user=> (clojure-version)
"1.4.0"
```

## Elixir

```
iex(1)> System.version()
"1.0.5"
```

## Erlang

```
1> erlang:system_info(otp_release).
"18"
```

## Emacs

```bash:
(emacs-version)
"GNU Emacs 24.3.1 (x86_64-apple-darwin, NS apple-appkit-1038.36)
 of 2013-03-13 on bob.porkrind.org"
```


## Gauche

```
gosh> (gauche-version)
"0.9.4"
```

## Go

```version.go
package main

import (
	"fmt"
	"runtime"
)

func main() {
	fmt.Println(runtime.Version())
}
```

実行結果です。

```
% go run version.go
go1.4.2
```

## Groovy

```GroovyConsole
groovy> println(GroovySystem.getVersion()) 
 
2.4.4
```

## IO

```
Io> System version
==> 20110905
```

## Java

```java:Version.java
class Version {
    public static void main(String[] args) {
        String ver = System.getProperty("java.version");
        System.out.println(ver);
    }
}
```

実行結果です。

```
$ javac Version.java
$ java Version
1.8.0_51
```

## Julia

```
julia> VERSION
v"0.3.11"
```

## Lua

```
> print(_VERSION)
Lua 5.3
```

## Nim

```version.nim
echo(NimVersion)
```

実行結果です。

```
$ nim compile --run version.nim
(コンパイル出力ログ省略)
0.11.2
```

## OCaml

```
# Sys.ocaml_version;;
- : string = "4.02.3"
```

## PHP

```php:version.php
<?php
echo phpversion() . "\n";
```

実行結果です。

```
$ php version.php
5.5.27
```

## Python

```
>>> import platform
>>> platform.python_version()
'3.4.0'
```

## Perl

```
perl -e 'print $]'
perl -e 'printf "version is v%vd\n", $^V'
   # perldoc perlvar 参照
```

- 参考: http://www.naney.org/diki/dk/Perl%20%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3.html

## R

```
> R.version.string
[1] "R version 3.2.2 (2015-08-14)"
```

## Ruby

```
irb(main):001:0> RUBY_VERSION
=> "2.2.2"
```

## Scala

```
scala> scala.util.Properties.versionString
res0: String = version 2.11.7
```

以下もあります。

- `scala.util.Properties.versionMsg`
- `scala.util.Properties.versionNumberString`
- `scala.util.Properties.javaVersion`


## SWI-Prolog

```
?- version.
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.2.2)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

true.
```
Ruby on Rails 3.2.10でとりあえずプロジェクト立ち上げるメモ


昨日、rvmで念願のRubyをインストールしましたので、お目当ての
Railsをインストールして、とりあえず起動してみる事に！

##とりあえずsqlite3をインストールしました

必須かどうか知りません。

	$ gem install sqlite3

sqlite-develが無いと言われて困ったので、インストールする

	$ yum install sqlite-devel

この、develって物、開発用ファイルを含む物だそうで、ヘッダーファイルやらが含まれるそうです。

改めて
	
	$ gem install sqlite3

##railsインストール！！

	$ gem install rails

こちらはすんなり終了。

##railsで新規プロジェクト（アプリケーション）を作る

	$ cd /var/www/rails/ #どこか好きな所
	$ rails new helloApp
	$ cd helloApp

これだけ！？これだけでもうスケルトンが出来てるようです。
便利な世の中です。
さて、早速ブラウザからアクセスしたいです。

	$ rails s

でサーバを立ち上げます。

***が。***

	`autodetect': Could not find a JavaScript runtime.

エラーがでます。ググると
	
	gem 'execjs'
  	gem 'therubyracer'

この二つを`Gemfile`に追加すれば動く様です。
これは、Rails3.2から必要になったそです。
最初から追加しておいて欲しいで(ry

さて、追加して
	
	$ bundle install

で、適応させます。

***が。***
	
	An error occurred while installing therubyracer (0.11.0), and Bundler cannot continue.
	Make sure that `gem install therubyracer -v '0.11.0'` succeeds before bundling.

はいはい。
	
	$ gem install therubyracer
	$ bundle install

 
***が。***

	An error occurred while installing therubyracer (0.11.0), and Bundler cannot continue.
	Make sure that `gem install therubyracer -v '0.11.0'` succeeds before bundling.

**おなじじゃねーか。**
これは、よくエラー文を読むしか無いですね。

そうすると、こんな一文があります。

	If you don't want to bother with all that, there is a
    rubygem that will do all this for you. You can add
    following line to your Gemfile:
        gem 'libv8', '~> 3.11.8'


ということなので、おとなしく`Gemfile`に
	
	gem 'libv8', '~> 3.11.8'

を追加しておきます。

	$ bundle install
	…
	Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.

今度は成功です！

さて

	$ rails s
	=> Booting WEBrick
	=> Rails 3.2.10 application starting in development on http://0.0.0.0:3000
	=> Call with -d to detach
	=> Ctrl-C to shutdown server

起動しました。
こいつでサーバの3000番ポートにアクセスすれば、アプリケーションの画面が表示されます。

ウッひょひょい
あけましておめでとうございます

拙いですが

```ruby:fortune.rb
puts(%=JXPjgZXjgpPjga7ku4
r                       l
u                       b
T   jga7pgYvli6I6ICVz   #
=   .unpack(%Q+m+)[0]   %
[   `whoami`.chomp,%*   5
Z                       C
J                       I
O   S4reWQiSDlpKflkIkg5py
r   5ZCJIOWHtiDlpKflh7  Y
=   *.unpack([109,%Q|   #
$                      10
$$                    |][
0].chr)[0].split.sample])
```

or

```bash
curl https://gist.github.com/raw/4441763/cadd72a3c30604febfafa1a497d65047951c3302/akeome.rb | ruby -
```

or do it

```bash
echo '
puts(%=JXPjgZXjgpPjga7ku4
r                       l
u                       b
T   jga7pgYvli6I6ICVz   #
=   .unpack(%Q+m+)[0]   %
[   `whoami`.chomp,%*   5
Z                       C
J                       I
O   S4reWQiSDlpKflkIkg5py
r   5ZCJIOWHtiDlpKflh7  Y
=   *.unpack([109,%Q|   #
$                      10
$$                    |][
0].chr)[0].split.sample])
' | ruby
```
ファイル全体を読み込む

ファイル全体を読み込んで内容を文字列やバイトベクタで得たい場合、ファイルと同じ大きさの配列を作って[read-sequence](http://www.lispworks.com/documentation/HyperSpec/Body/f_rd_seq.htm)で書き込むのが一般的です。

```cl
;; ファイルを読み込んで内容を文字列で返す
(with-open-file (s "abc.txt" :direction :input)
  (let ((buf (make-string (file-length s))))
    (read-sequence buf s)
    buf))

;; ファイルを読み込んで内容をバイトベクタで返す
(with-open-file (s "abc.txt" :direction :input :element-type '(unsigned-byte 8))
  (let ((buf (make-array (file-length s) :element-type '(unsigned-byte 8))))
    (read-sequence buf s)
    buf))
```

32ビットの環境で大きなファイルを読み込む場合、[array-total-size-limitの制限](http://cl.cddddr.org/index.cgi?ARRAY-TOTAL-SIZE-LIMIT)に引っかかることがあるので注意してください。

また、[Alexandria](http://common-lisp.net/project/alexandria/)や[arnesi](http://common-lisp.net/project/bese/arnesi.html)といったユーティリティライブラリには、このための関数が用意されています。

```cl
;; ファイルを読み込んで内容を文字列で返す
(alexandria:read-file-into-string "abc.txt")
(arnesi:read-string-from-file "abc.txt")

;; ファイルを読み込んで内容をバイトベクタで返す
(alexandria:read-file-into-byte-vector "abc.txt")
```
wxArrayを使う

wxWidgetsで遊んでいてwxArrayを使うサンプルがぱっと見無かったのでメモ

* 使用環境
  * wxWidgets 2.8.11
  * Mac OSX 10.4.11/ppc

```c++:wxarraytest.cpp
#include <wx/wx.h>
#include <stdio.h>

class MyData;
WX_DEFINE_ARRAY(MyData *, ArrayOfMyData);

class MyData
{
public:
  int x;
  int y;
  MyData(int, int);
  void Print();
};

MyData::MyData(int inx, int iny) {
  x = inx; y = iny;
}

void MyData::Print() {
  wxPrintf(_("%d, %d\n"), x, y);
}

int main(int argc, char ** argv) {
  ArrayOfMyData array;
  array.Alloc(20);
  // Add to array
  for ( int i = 0; i < 30 ; i++ )
    array.Add(new MyData(i, -i));
  // Remove some items
  for ( int i = 29 ; i > 0 ; i -= 2) {
    MyData* item = array[i];
    wxPrintf(_("Remove %d at %p\n"), i, item);
    delete item;
    array.RemoveAt(i);
  }
  
  // Show array's items
  for ( size_t i = 0 ; i < array.GetCount() ; i++ )
    array[i]->Print();
  
  // Finalize
  for ( size_t i = 0 ; i < array.GetCount() ; i++ ) {
    delete array[i]; array.RemoveAt(i);
  }
  return 0;
}
```

実行結果はこんなかんじ:

> Remove 29 at 0x1308390
> Remove 27 at 0x1308370
> Remove 25 at 0x1308350
> Remove 23 at 0x1308330
> Remove 21 at 0x1308310
> Remove 19 at 0x1308270
> Remove 17 at 0x1308250
> Remove 15 at 0x1308230
> Remove 13 at 0x1308210
> Remove 11 at 0x13081f0
> Remove 9 at 0x13081d0
> Remove 7 at 0x13081b0
> Remove 5 at 0x1308190
> Remove 3 at 0x1308170
> Remove 1 at 0x1308150
> 0, 0
> 2, -2
> 4, -4
> 6, -6
> 8, -8
> 10, -10
> 12, -12
> 14, -14
> 16, -16
> 18, -18
> 20, -20
> 22, -22
> 24, -24
> 26, -26
> 28, -28
> Hello?

int型整数のタプルを格納するクラスMyDataを定義して、そのクラスへのポインタの配列ArrayOfMyDataを定義。クラスへのポインタの配列はwxArrayじゃなくてwxObjArray使えって書いてあった気がする。

普通の配列みたいに扱えてなかなか便利。
最初に`array.Alloc(20)`してその後30個の要素を追加しているのであらかじめallocした数以上の要素を利用できる。
Sakura VPSにmoshで接続するための設定


[参考:Mosh(mobile shell)](http://mosh.mit.edu/)

##VPS環境
CentOSのバージョン確認

```
$ cat /etc/redhat-release
```
**CentOS release 6.3 (Final)**


パッケージの検索。

```
$ yum search mosh
```
mosh.x86_64 : Mobile shell that supports roaming and intelligent local echo

あったのでインストール

```
$ sudo yum install mosh
```

iptablesの設定変更

```
# vi /etc/sysconfig/iptables
```

60000〜61000のポートを使うので、それを開ける。

iptablesの設定内にあるINPUTのポート設定に下記を追記する

```
 -A INPUT -p udp -m udp --dport 60000:61000 -j ACCEPT
```

iptablesを再設定

```
# service iptables restart
```

一旦ログアウト

```
$ exit
```

##手元のmac環境
MacOSX 10.8.2

Homebrewから

```
brew install mobile-shell
```


**※~/.ssh/configにhostの設定がされている必要があるので適当に設定**

```
Host vps
        Hostname wwwXXXXue.sakura.ne.jp
        port 10022
        IdentityFile ~/.ssh/vps_rsa
        User username
```

```
$ mosh vps
```

上記のコマンドでログインできるはず。
系列ラベリング（品詞タグ付け）用のデータをサクッと作る


NLTKのnltk_dataに付属しているBrown Corpusを使うと簡単。品詞タグ付け用のデータを作るには、tagged_sents()を呼び出すだけで良い。categoriesを指定しておくと、そのドメインのデータのみを扱うこともできる（news以外にもreviews、fiction、romance、mysteryなど色々ある）。


``` python
import nltk
from nltk.corpus import brown

corpus = brown.tagged_sents(categories='news')

def dataset(N=100):
    d = []
    for tagged_sent in corpus[:N]:
        untagged_sent = nltk.tag.untag(tagged_sent)
        pos_sequence = [pos for (word, pos) in tagged_sent]
        d.append((untagged_sent, pos_sequence))
    return d

if __name__ == "__main__":
    dataset = dataset()
interfaceがエラーになるケース

PHPのinterfaceは多重継承が可能（一つのクラスにつき複数のインターフェースを実装したと宣言可能）であるが、実際にはFatal Errorになって実装できないケースがあるのでまとめる。

## シグネチャが違う2つのinterface

interfaceはシグネチャまで揃っていることを保証するためのものなので、違うシグネチャを同時に実装することはできない。

```php
<?php
interface i1 {
  function hoge();
}
interface i2 {
  function hoge(array $a); //引数定義が違う
}

class A implements i1, i2
{
  function hoge() {} //i2に合ってないというFatal Error
  //function hoge(array $a) {} //こう書くとi1に合ってないというFatal Error
}
```

シグネチャが同一であれば問題なく実装できる。

## 同じinterfaceを複数回implementsに並べる

多重に実装できるはずだが、これはエラーになる。

```php
<?php
class A implements i1, i1
{
  function hoge(){};
}
```

## 継承したinterfaceを継承順と逆に並べる

すごくわかりにくい。

```php
<?php
interface i1 {
  function foo();
}
interface i2 extends i1 {
  function moo();
}

class A implements i2, i1 //Fatal Error
{
  function foo(){}
  function moo(){}
}
```

なお、implementsにi1, i2の順で書けば、エラーは起きない（！）
この場合、単にimplements i2としておけばi1も実装したことになる((new A) instanceof i1)ので、書き方が変ではある。
エラーの理由がわかりにくいのでやっかいである。親interface→派生interfaceの順ならエラーにならないと覚える。

interfaceは多重に実装可能なので、あまり継承を使う場面はないような気もする。（タイプヒントに使いたいときだけだろう）
重箱の隅っぽいな。

## IteratorとIteratorAggregate

特殊な例だけれど、組み込みのIteratorとIteratorAggregateは同時に実装しようとするとFatal Errorになる。どちらか片方のみを使うことで解決する。

```php
<?php
// エラーになる
class A implements Iterator, IteratorAggregate
{
  function getIterator(){}
  //...(省略)
}
```

他にもあったら教えてください。
GHUnitの導入について


###事前にしておくこと
* GHUnitIOS.frameworkの取得

```
git clone https://github.com/gabriel/gh-unit.git
cd gh-unit/Project-iOS
make
```


###手順
* 新規プロジェクトを**Empty application**で作成

* **Add Target**新しくhoge(仮称)のターゲットを追加

* 追加したターゲットの**Build Setting**の項目にある**Other Linker Flags**に**-ObjC -all_load**を追加

* Frameworksに**GHUnitIOS.framework**を追加する。その際、**ターゲットにはhoge**にチェックを入れる
※ DirPath : gh-unit/Project-iOS/build/Framework

* **Empty application**でプロジェクトを作成すると**QuatzCore.framework**が無いので、これも追加する

* 追加したターゲットに存在する、**AppDelegate.h/m**と**main.m**を削除

* その代わりに、**GHUnitIOSTestMain.m**を追加
※ DirPath : gh-unit/Tests

* 実行のターゲットを**hoge**にして実行。この時、シュミレータ上に**Run**のボタンがあれば環境の構築は完了。


###参考にした情報
[GHUnitとOCMockでUnit Test効率化](http://blog.jarinosuke.com/entry/20120228/unit_testing_with_ghunit_and_ocmock "GHUnitとOCMockでUnit Test効率化")

[Undefined symbol for architecture i386 compile error caused by CACurrentMediaTime()](http://stackoverflow.com/questions/8549335/undefined-symbol-for-architecture-i386-compile-error-caused-by-cacurrentmediatim "Undefined symbol for architecture i386 compile error caused by CACurrentMediaTime()")

[GHUnitで単体テストをしてみよう](http://alpha.mixi.co.jp/2012/10858/ "GHUnitで単体テストをしてみよう")
UIAppearance APIでクラス全体に対して見た目の変更を行う

iOS5で導入されたUIAppearanceを使うと、クラス全体に対して見た目の変更が出来る。

使い方はこんな感じ
テーブルビューのバックグラウンドに色を設定
[[UITableView appearance] setBackgroundColor:[UIColor clearColor]];
macでrvmを使用し、複数バージョンのrubyを導入

rvm管理対象ディレクトリを作成し、rvmをインストール

```bash
$ mkdir -p ~/.rvm/src
$ cd ~/.rvm/src
$ git clone --depth 1 git://github.com/wayneeseguin/rvm.git
$ cd rvm 
$ ./install
```


パスを通す

```bash
$ source ~/.bashrc
```

確認

```bash
$ rvm -v
$ rmv info
```

rubyインストール

```bash
$ rvm list
```

ruby1.9.2をインストール

```bash
$ rvm install 1.9.2
```

ruby1.9.3をインストール

```bash
$ rvm install 1.9.3
```

1.9.3をset

```bash
$ rvm use 1.9.3
Using /Users/kohgami/.rvm/gems/ruby-1.9.3-p362
$ 
$ rvm list

rvm rubies

   ruby-1.9.2-p320 [ x86_64 ]
=> ruby-1.9.3-p362 [ x86_64 ]

# Default ruby not set. Try 'rvm alias create default <ruby>'.

# => - current
# =* - current && default
#  * - default

$ ruby -v
ruby 1.9.3p362 (2012-12-25 revision 38607) [x86_64-darwin12.2.0]
```

rubyとgemを確認

```bash
$ which ruby
/Users/kohgami/.rvm/rubies/ruby-1.9.3-p362/bin/ruby
$ 
$ which gem
/Users/kohgami/.rvm/rubies/ruby-1.9.3-p362/bin/gem
$ 
$ gem env
RubyGems Environment:
  - RUBYGEMS VERSION: 1.8.24
  - RUBY VERSION: 1.9.3 (2012-12-25 patchlevel 362) [x86_64-darwin12.2.0]
  - INSTALLATION DIRECTORY: /Users/kohgami/.rvm/gems/ruby-1.9.3-p362
  - RUBY EXECUTABLE: /Users/kohgami/.rvm/rubies/ruby-1.9.3-p362/bin/ruby
  - EXECUTABLE DIRECTORY: /Users/kohgami/.rvm/gems/ruby-1.9.3-p362/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-darwin-12
  - GEM PATHS:
     - /Users/kohgami/.rvm/gems/ruby-1.9.3-p362
     - /Users/kohgami/.rvm/gems/ruby-1.9.3-p362@global
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :benchmark => false
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - http://rubygems.org/
```