OmniAICreator/Qiita-1.07M huggingface dataset:
TeraTerm scpファイル転送で受信完了まで待つ

使っている人は少ないであろうTeraTermマクロで小ネタ一つ。

※TeraTerm for UTF-8 バージョン4.74で動作確認しております。
　（最低でも4.66以上必須）

# 概要

TeraTermマクロで、ファイルをscp受信する場合、scprecvコマンドが使えます。
しかしこのコマンドは非同期処理ですので、ファイルの受信完了を
待つには仕組みを作る必要があります。

今回はそのファイルの受信完了を待つテクニックです。

考え方は単純にしました。
約１秒毎にローカルファイルのサイズチェックを行って増えてなければ受信完了と見なす。
※注意：受信中にＬＡＮケーブルが抜けたりした場合でも、受信完了扱いになります。

# 実装方法

```text:scprececvコマンドで同期を取る
    filesearch localFile
    if result then
        ; 受信ファイルが存在する場合削除
        filedelete localFile
    endif

    scprecv remoteFile localFile
    ;受信完了確認(scprecvが非同期処理のため)
    mpause 1100
    sizeBef = 0
    :confirm_start
        filestat localFile sizeNow
        if sizeNow = sizeBef then
            goto confirm_end
        else
            mpause 1100
        endif
        sizeBef = sizeNow
        goto confirm_start
    :confirm_end

```
PHP5.2で遅延静的束縛

\_\_LINE\_\_とか\_\_FILE\_\_とかはあくまで定数なので、デフォルト引数に突っ込むことができます。

```php
<?php
function doSomething($hoge=__LINE__) {
  var_dump($hoge);
}
```

…で、何が嬉しいのかですが、PHP5.3未満でLate Static Binding(遅延静的束縛）みたいなことをやるときに使えます。

PHP5.3だと、こんな風になりますね。

```php
<?php
class A {
  static function hoge() {
    var_dump(get_called_class());
  }
}

class B extends A {}
class C extends B {}

A::hoge(); //A
B::hoge(); //B
C::hoge(); //C

//staticメソッドで、どのクラスのメソッドとして呼ばれたか判定が可能
```

LSBはPHP5.3以降に搭載された機能なので、これはPHP5.2で動きません。
5.2などというレガシーな環境を今時使う人は少ないかもしれませんが…

以下の様な書き方をすることで、5.2でもLSBを真似ることができます。（再現ではないし効率は悪いです。あくまで真似。PHP5.3以降を使う方がいいです）

```php
<?php
class A {
  static function hoge($class=__CLASS__) {
    var_dump($class);
  }
}

class B extends A {
  //派生クラスには以下のコードをコピペする
  static function hoge($class=__CLASS__) {
    return parent::hoge($class);
  }
}

class C extends B {
  //派生クラスには以下のコードをコピペする
  static function hoge($class=__CLASS__) {
    return parent::hoge($class);
  }
}

A::hoge(); //A
B::hoge(); //B
C::hoge(); //C
```

要はデフォルト引数を使って呼び出し元のクラスを伝播させてるのです。
コードの重複が発生していますが、コピペで済んでいるところがポイント。\_\_CLASS\_\_を使っていればこそです。
drb and reflection

# Get instance variable from remote object

Remove **instance_variable_get** from DRbObject

```rb
remote = DRb::DRbObject.new_with_uri(uri)
class << remote
  undef_method :instance_variable_get
end

remote.instance_variable_get(:@hoge) # get remote's @hoge value
```

In this result, _remote_ forwards **instance_variable_get** calling to remote object.

# Define method on remote object

Use **instance_eval** and **send** with **define_method**

```rb
remote = DRb::DRbObject.new_with_uri(uri)
class << remote
  undef_method :instance_eval
end

remote.instance_eval(<<EOS
self.class.send(:define_method, :ping, Proc.new {
  'pong!'
})
EOS
)

remote.ping # pong!
```
Java6でのリソースと例外処理


```java:修正前
InputStream in = null;
try {
    in = new FileInputStream("test.txt");
    // stream操作
} catch (IOException e) {
    // error処理
} finally {
    try { // 必要に応じて
        if (in != null) {
            in.close();
        }
    } catch (IOException e) {
    }
}
```

というコードをよく見かける(定石？だったはず)が、そもそも、Stream(というかオブジェクト)のインスタンス生成に失敗すると、絶対にinにはnullしか入り得ない。
そのため、finallyブロックでのif文は必ずin==nullとなり、無駄である。
スコープを考えた場合にも不自然に思える。
(コードカバレッジを取ると、絶対に通せないため、C1が上がらない)

Java7ならば、try-with-resourceを使用することで、綺麗になるだろうが、6以前では以下のようにするベキではなかろうか？

```java:修正後
try {
    InputStream in = new FileInputStream("test.txt");
    try {
        // stream操作
    } finally {
        try { // 必要に応じて
        in.close();
        } catch (IOException e) {
        }
    }
} catch (IOException e) {
    // error処理
}
```

因みに、finallyでのtry-catchは、closeで投げられるIOExceptionを握りつぶすか否かに依るため、「必要に応じて」とコメントしている
Xamarin Studio でコード整形を Visual Studio っぽくする


Xamarin Studio の既定のコードフォーマットは、メソッド名の後ろにスペースが空いていてどうにも気に入らない。いろいろ設定をさばくって(方言)いたら見つかりました。

既定のフォーマットはこちら

!["default_formatting"](https://dl.dropbox.com/u/264530/qiita/xamarin_studio_formatting_default.png)

変更は、システムメニュー → Preference から。

!["default_formatting"](https://dl.dropbox.com/u/264530/qiita/xamarin_studio_formatting_preference.png)

次に、ソースコード → コード フォーマッティング → C#ソースコード ときて、愛しの「Visual Studio」を選択！

!["default_formatting"](https://dl.dropbox.com/u/264530/qiita/xamarin_studio_formatting_codeformatting.png)

変更が適用されるのは、新しいクラスを作った時から。

!["default_formatting"](https://dl.dropbox.com/u/264530/qiita/xamarin_studio_formatting_vs.png)

既存のクラスは、メニュー → 編集 → フォーマット で整形しなおせばおｋ
多重起動を防止する方法

作成したシェルスクリプトを多重起動させたくない場合のテクニックです。マルチスレッドなどでいう排他制御ですね。処理前に処理中を示すロックファイルを作成して、処理が完了した際にロックファイルを消す。シェル実行前にファイルがあれば、処理中だから、ダメねってことです。デーモンなどの起動スクリプトでもよく使われている手ですね。

```:bash
#!/bin/sh
lockfile=lockfile

if [ -f $lockfile ]; then
	echo $0
	exit 1
fi

touch $lockfile

#ここでやりたい処理を書く
echo start
sleep 10
echo end

rm -f $lockfile
```

■2013/03/14追記
↑のスクリプトだと、少し問題があるので下記のように修正しました。

```:bash
#!/bin/sh
lockfile=lockfile

ln -s $0 ${lockfile} 2> /dev/null || exit 1

#ここでやりたい処理を書く
echo start
sleep 10
echo end

rm -f $lockfile
```
Fulcrum + Herokuセットアップ

* [wholemeal: Fulcrum](http://wholemeal.co.nz/projects/fulcrum.html)
* [malclocke/fulcrum · GitHub](https://github.com/malclocke/fulcrum)

----

## ローカルセットアップ

```
git clone git://github.com/malclocke/fulcrum.git
cd fulcrum
```

```
bundle install
```

```
bundle exec rake fulcrum:setup db:setup
```

```
rails server
```

## JavaScriptエラー回避

vendor/assets/javascripts/bootstrap-twipsy.js

* プロジェクトページを開いた時に「Uncaught TypeError: Cannot read property 'webkit' of undefined」エラー(Chrome)

エラー発生箇所コメントアウト

```
    // set CSS transition event type
    if ( $.support.transition ) {
      transitionEnd = "TransitionEnd"
      // if ( $.browser.webkit ) {
        transitionEnd = "webkitTransitionEnd"
      // } else if ( $.browser.mozilla ) {
      //   transitionEnd = "transitionend"
      // } else if ( $.browser.opera ) {
      //   transitionEnd = "oTransitionEnd"
      // }
    }
```

* プロジェクトページを開いた時に「Uncaught TypeError: Object [object Object] has no method 'live'」エラー(Chrome)

エラー発生箇所コメントアウト／記述変更行追加

```js
    if (options.trigger != 'manual') {
      // binder   = options.live ? 'live' : 'bind'
      binder   = 'bind'  // ★↑コメントアウトしこの行を追加
      eventIn  = options.trigger == 'hover' ? 'mouseenter' : 'focus'
      eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur'
      this[binder](eventIn, enter)[binder](eventOut, leave)
    }
```

## Herokuセットアップ

* SSL設定有効化

config/environments/production.rb

```rb
  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  config.force_ssl = true
```

```
heroku create test-fulcrum
```

```
heroku config:set APP_HOST=test-fulcrum.herokuapp.com
```

* Define where the user emails will be coming from(This email address does not need to exist)

```
heroku config:set MAILER_SENDER=noreply@example.org
```

```
heroku addons:add sendgrid:starter
```

```
git push heroku master
```

```
heroku run rake db:setup
```

```
heroku open
```

## BASIC認証

app/controllers/application_controller.rb

```rb
  http_basic_authenticate_with name: "test-fulcrum", password: ENV['BASIC_AUTHENTICATE_PASS'] unless Rails.env.development?
```

```
heroku config:set BASIC_AUTHENTICATE_PASS=password
```
PHPにはconst Arrayとenumが無いので処理速度を犠牲にしないで代用する方法

開発者ブログを立ち上げました。
http://marketinnovation.co.jp/devblog/

今回は”PHPにはconst Arrayとenumが無いので処理速度を犠牲にしないで代用する方法”です。
http://marketinnovation.co.jp/devblog/?p=4
Ruby 2.0 & Sinatra 1.4.0.d でアプリ作った

AAが出力できて便利です。

* http://cool-ruby2-sinatra14-app.herokuapp.com/

```ruby:Gemfile
source "https://rubygems.org"
ruby '2.0.0'

gem 'sinatra', '1.4.0.d'
gem 'slim'
gem 'pebbles-soreyuke'
gem 'puma'

group :development do
  gem 'foreman'
  gem 'sinatra-contrib', github: 'sinatra/sinatra-contrib', require: 'sinatra/reloader'
end
```

```ruby:app.rb
require 'bundler'
Bundler.require
require "sinatra/reloader" if development?

helpers do
  # This is a Ruby 2 feature
  def presence_of(word: nil)
    word.nil? || word.size <= 0 ? nil : word
  end
end

configure :production do
  set :server, :puma
end

get '/' do
  slim :index
end

get '/say-hello' do
  word = presence_of(word: params[:word])
  @text = Pebbles::Soreyuke::AA(params[:type], word)
  slim :hello
end
__END__

@@ layout
doctype html
html
  head
    title 便利ウェブアプリサンプル
    link href="/css/bootstrap.min.css" rel="stylesheet"
    css:
      body { padding-top: 60px; }

  body
    .navbar.navbar-inverse.navbar-fixed-top
      .navbar-inner
        .container
          a.brand href="/" The Sinatra 1.4 & Ruby 2.0 Example
    .container
      == yield
      .well.well-small
        p © Uchio KONDO 2013.
        p
          | Using
          code= RUBY_DESCRIPTION
          |  & Sinatra
          code= Sinatra::VERSION

    script src="http://code.jquery.com/jquery.js"
    script src="/js/bootstrap.min.js"

@@ index
.row
  .hero-unit
    h1 Hello
    p コレがルビー2.0 & シナトリャ 1.4 だァーッ
  .span9
    h2 インタラクティブコンテンツを試す
    form action='/say-hello' method='GET'
      fieldset
        label タイプ :
        select name="type"
          option value="apm" あんパン
          option value="cpm" カレーパン
          option value="spm" 食パン
        label 挨拶の文言 :
        input type='text' name='word'
        br
        input.btn type="submit" value="シナトラを試す"

@@ hello
.row
  .span9
    pre
      = @text
  .span9
    p
      a.btn href="/" Back
```

```bash:Procfile
web: bundle exec ruby app.rb -p $PORT -e $RACK_ENV
```

## Tips

### うごいたgem

* `sinatra-reloader`: githubのHEADから取った。普通に動いた。sinatra-contrib自体はeventmachineって言う凄いやつに依存しているので取り扱い注意（reloaderだけのときは依存していないけど……）。
* `slim`: 動いた。
* `pebbles-soreyuke`: 便利だった。動いた。 see also: http://qiita.com/items/19807642971ebcc92f52
* `puma`: 動いた。Railsでも http://qiita.com/items/71e9f7df7f6bdb93966e

### Heroku でRuby 2.0 を使う

`ruby '2.0.0'` ってGemfileに書いとくだけでヨイ。すごい。

* https://blog.heroku.com/archives/2012/11/5/ruby-2-preview-on-heroku

## コード

* https://github.com/udzura/soreyuke-online
.ipa ファイル生成を自動化する

通常.ipaファイルを作成するには、Product メニューの Archive 実行後に、

- Organizer から アーカイブを選択し Distribute ボタン押下
- "Save for Enterprise or Ad-Hoc Deployment" を選択し Next ボタン押下
- ドロップダウンリストから該当するプロビジョニングプロファイルを選択
- 保存先を指定

という手順を踏みます。ウィザードに従って進めるだけなので、たまに行う程度であれば問題ないのですが、.ipaファイルを作成して共有する頻度が多い場合（例えばリリースが近く細かい修正と確認を繰り返す場合）は面倒になってきます。

Xcode の Run Script を利用し、**アーカイブ完了後に自動で ipa ファイルを生成する**よう設定する方法を紹介します。

※通常のアドホックビルドの準備の手順（アドホックビルド用のプロビジョニングプロファイルの作成とインストール、Configurationの作成と Code Signing Identity の設定）については説明を省略します。


##準備

Build Phases タブの右下にある "Add Build Phase" ボタンから Run Script を追加し、次のようにスクリプトを登録します。

````
if [ "${CONFIGURATION}" = "<Configuration名>" ]; then
xcrun -sdk iphoneos PackageApplication \
"${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}"/"${WRAPPER_NAME}" \
-o <出力パス>/<ipaファイル名> \
--embed ~/Library/MobileDevice/Provisioning\ Profiles/<プロファイルのファイル名>
fi
````

\<Configuration名> はプロジェクトの設定に従って置き換え、\<出力パス>、\<ipaファイル名> はそれぞれ任意のパス、名前に置き換えてください。（例：~/Hoge.ipa）

<プロファイルのファイル名>は、オーガナイザで該当するプロファイルを選択し、右クリックメニューの「Reveal Profile in Finder」からプロファイルの実体ファイルを Finder で表示して調べることができます。（713F1C87-93C7-4F29-9F3E-F8C5E652394B.mobileprovision というように、英数字の羅列＋拡張子 .mobileprovision で構成されるファイル名です。）

たとえば、Configuration名が Ad Hoc となるプロジェクトの.ipaファイルをホームフォルダ直下に自動生成したい場合のスクリプトは次のようになります。

````
if [ "${CONFIGURATION}" = "Ad Hoc" ]; then
xcrun -sdk iphoneos PackageApplication \
"${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}"/"${WRAPPER_NAME}" \
-o ~/Hoge.ipa \
--embed ~/Library/MobileDevice/Provisioning\ Profiles/xxxxxxxxxxx.mobileprovision
fi
````


##実行

（Build の Scheme として "Ad Hoc" を選択した状態で、）**Product メニューから Build を実行するだけ**で、自動で.ipa ファイルが生成されます。


##More

xcrunコマンド（これで .ipa ファイルを生成している）の後に curl コマンドで Testflight の API を叩くようにすれば、アーカイブ実行時に **Testflight へのアップロードまで自動化**することもできます。

##参考
- [.ipaをサッとつくる - blog.ishkawa.org](http://blog.ishkawa.org/blog/2013/02/27/make-ipa/)
- [$(SRCROOT) や $(BUILD_DIR) 等の Xcode で使用しているマクロの置換内容の一覧を調べる方法](http://d.hatena.ne.jp/shu223/20120804/1344155002)
RubyMine にメモリをたくさん割り当てる

RubyMine、普通につかってる分には問題ないんですが、使い込んでるとメモリ使用量が気になってきます。足りなくなってくると動きがカクカクしたりします。というわけで、どうせ空きメモリが十分にあるなら、もうサクッと大量にメモリを割り当ててしまいましょう。

メモリ割当量は、設定ファイル (idea.vmoptions) で変更できます。その設定ファイルは、ふつう Mac なら `/Applications/RubyMine.app/bin/idea.vmoptions` だと思います。これをエディタで開くと

```
-Xms128m
-Xmx512m
-XX:MaxPermSize=250m
-XX:ReservedCodeCacheSize=64m
-XX:+UseCodeCacheFlushing
-XX:+UseCompressedOops
```

となっているので、Xms と Xmx の値を好きなだけ増やしてください。

(Eclipse ユーザや Java 開発者の人ならピンとくると思いますが、これらはずばり Java 仮想マシンに渡すパラメータです。くわしくは Java のマニュアルをみてください。)

Xms が起動時のメモリ確保量、Xmx が最大のメモリ確保量です。RubyMine (というかRubyMineを動かしているJava仮想マシン)は起動直後に Xms に指定した値のぶんだけメモリを確保します。それで足りなくなってくると、少しずつ確保量を増やしていきます。Xmx に指定した値以上は確保しません。個人的には

```
-Xms1024m
-Xmx1024m
```

と設定してしまうのが好きです。こうするとちびちびとメモリ確保しなくなる(らしい)のでメモリの断片化を防ぐ効果がある(らしい)ですが、どのくらい効果があるのかは不明です。

しかしこのファイル、RubyMine をアップデートするたびに消えてしまうんですよ、たぶん。どうしたらいいものか……
TortoiseSVNで変更があったファイルだけをエクスポート

* 作業コピーのルートのディレクトリを右クリック、メニュー「ログを表示」。
* ログ表示から、比較したいリビジョンを選ぶ。（Ctrlキーを使って2つ。）
* 右クリック、「リビジョンを比較」。
* 比較結果より、エクスポートしたいファイル選択する。
* 右クリック、「選択をエクスポート」。
* エクスポート先を指定して出力。  
　→ディレクトリ構造を保ったまま出力される。

※「選択ファイルをエクスポート」以外に、変更のあったファイルのリストも作成できる。
GASのライブラリでクラス化と補完

今回はGASのライブラリでクラス化を補完について書きます。

# GASでライブラリをクラス化と補完の問題

GASのライブラリは補完が有効になるため、開発をラクにする為にも、
ライブラリをとりあえず作るシーンはよくあります。

またライブラリを設計する上で、内部でクラスを作り、
そのインスタンスを利用させるような物を作ることも多々あると思います。

ただGASでは、このライブラリ(で補完)とクラスは少し相性が悪いです。
理由はライブラリ化した際、補完メソッドとして表示されるのは、グローバルメソッドのみだからです。

```javascript:メソッド名が補完できるライブラリのメソッド.js

/**
 * このメソッドはライブラリを利用する方で補完できる
 * @param {string} templateName テンプレートの名称
 * @return {Page} 見つけたテンプレートページ
 */ 
function getTemplateByName(templateName) {
   //処理
}

```

クラス化する場合、クラスの内部のメソッドはグローバルメソッドとならないため、補完が出来ないです。

```javascript:クラス化されている場合、補完できない.js
function HogeClass(fuga) {
  this.fuga = fuga;
}
//このHogeClass.getFugaは補完できない
HogeClass.prototype.getFuga = function() {
  return this.fuga;
};
```

# 良い感じでクラス化と補完を出来るようにする。

微妙に嫌なハックですが、クラス化と、補完を両立させるには、

「クラスのメソッドのダミーをグローバルメソッドに書く」

ということをします。

```javascript:クラス化しつつ、メソッドが補完できる.js

//このライブラリのプロジェクト名はHogeとする。

/**
 * HogeClassをインスタンス化するためのファクトリメソッド
 * @param {string} fuga HogeClassのコンストラクタ引数を指定
 * @return {Hoge} ←の{}の中にライブラリのGASプロジェクトと同じ名前を指定する。
 */
function createHoge(fuga) {
  return new HogeClass(fuga);
}

//HogeClassの中で補完させたいメソッドのダミーメソッドをグローバルメソッドとして作る。
/**
 * Fugaを取得します。
 * @return {string} fuga
 */
function getFuga() {
  throw new Error('createHogeを呼び出してから呼び出してください。')
}


//HogeClassメソッド自体は補完させたくないので隠す
(function(global){
  function HogeClass(fuga) {
    this.fuga = fuga;
  }
  //このHogeClass.getFugaは補完できない
  HogeClass.prototype.getFuga = function() {
    return this.fuga;
  };
  global.HogeClass = HogeClass;
})(this);
```

これにより、ライブラリの利用側では、`Hoge.createHoge('fuga').getFuga()`の全てが補完可能になります。
少し手間はかかりますが、補完が効くようになり、自作ライブラリの使い勝手もかなり良くなります。

※参考例

Yahooの日本語API周りを扱うライブラリ
apiKey毎にインスタンスを作成したかったのでクラス化しています。

https://script.google.com/d/1SUrdiAP_Dys7qFTR6XnNgK4zGxIpMmKFxWv4_6kCi-H1QgEVUJubE_CH/edit
Sql serverのSelect文でIF文 (は、つかえない)

使えないから こんな感じにするとできた。

```sql:this
SELECT case when max([NUM]) is NULL then 0 else max([NUM]) + 1 end as NUM
  FROM [hoge].[huge].[fuge]
  where ID='99'
```

書いてあった場所
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1250933162
Googleの検索結果に著者情報（顔写真など）を出す方法

Googleの検索結果に著者情報を表示する方法です。
ブロガーな方は必須かもしれません。

設定は大きく３つの手順で可能です。
※ 著者サイト [http://suzulabo.com] を例に説明します。

■ 1. Google+登録

言わずもがな。まずはGoogle+に登録しましょう。

※ 名前と写真、フォロワー数が検索結果に表示されるので意識してください。


■ 2. サイトとGoogle+のオーナー設定

WebMasterToolを使用すると簡単に設定状況が確認できます。
http://www.google.com/webmasters/tools/richsnippets

(1) サイトのオーナー設定

サイトに以下のタグを設置。（HEAD内）
```<link rel="author" href="https://plus.google.com/104186714055363673196/posts" />
```

(2) Google+のオーナー設定

Google+のプロフィール編集で、
公開投稿先リンクに対象サイトを設定。


■ 3. 公開タグの設定

サイトに発行者というメタ情報を追加してあげましょう。（HEAD内）

```<link href='https://plus.google.com/104186714055363673196' rel='publisher'/>```

以上で設定は完了です。

反映までは２〜３日くらい掛かる模様です。
ちなみにアメブロで試したらダメでした。。。


ついでに良かったらGoogle+のフォローお願いします。
https://plus.google.com/104186714055363673196/posts
PerlでSQLのin句のプレースホルダを作る

まぁライブラリ使うから直接やることはないと思うけど、「x」の使い方として。

```perl
my $place_holder = "(" . join(",", ("?") x 10) . ")";
say $place_holder;
# (?,?,?,?,?,?,?,?,?,?)
```
refs. DBIx::Skinny::DBD::mysql
UITapGestureRecognizer subviewsのタップジェスチャーを無効にする


UITapGestureRecognizerを加えたViewのsubviewsに対するタップジェスチャーを無効にする方法です。

***

viewAのsubviewsには、viewBとviewCが配置し、viewAにはUITapGestureRecognizerを加えています。

```objectivec:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewADidTap)];
[self.viewA addGestureRecognizer:tap];
```

![ss](http://f.cl.ly/items/2m1L3m3F011L2V41443k/スクリーンショット_2013_03_11_22_28.png)

上記の設定でviewAをタップすると`- (void)viewADidTap`が呼ばれます。
viewB、viewCの領域内をタップした場合にも`- (void)viewADidTap`が呼ばれます。
これをviewB、viewCの領域内をタップした時に`- (void)viewADidTap`を呼ばないようにする方法です。

## 実装
```objectivec:ViewController.m
#import "ViewController.h"

@interface ViewController () <UIGestureRecognizerDelegate>

@property (weak, nonatomic) IBOutlet UIView *viewA;
@property (weak, nonatomic) IBOutlet UIView *viewB;
@property (weak, nonatomic) IBOutlet UIView *viewC;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewADidTap)];
    tap.delegate = self;
    [self.viewA addGestureRecognizer:tap];
}

/* タッチジェスチャーを発生させるかどうかを返す実装をする */
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
	/* タッチイベントが発生したビューとviewB, viewCを比較する */
    if (touch.view == self.viewB || touch.view == self.viewC) {
		// viewB, viewCの場合ジェスチャーを許可しない
        return NO;
    }
    return YES;
}

- (void)viewADidTap
{
    NSLog(@"viewA");
}

@end
```
全テーブルのフィールド情報を一括取得

ドキュメント作りにどうぞ。

--この部分は任意のデータベース名に変更
use master

--全テーブルリスト
select *  from
(
SELECT  
		(select name from sys.schemas where T.schema_id = schema_id) スキーマ,
		T.name AS 表名,
        C.column_id AS 列番,
        C.name AS 列名,
        Y.name AS 型,
        CASE 
			WHEN Y.name IN ('nvarchar', 'nchar') THEN C.max_length / 2 
			WHEN C.precision = 0 THEN C.max_length 
			ELSE C.precision 
		END AS 桁,
        C.scale AS 小数桁,
		C.max_length as [サイズ(バイト)],
         C.is_nullable AS Null可,
object_definition(C.default_object_id) AS デフォルト値,
         (select COUNT(*) from sys.index_columns ic where ic.column_id = C.column_id and C.object_id = ic.object_id and exists (select * from sys.key_constraints kc where kc.type = 'PK' and kc.parent_object_id = T.object_id and kc.unique_index_id = ic.index_id ))  as [PK],
         ep.value as 説明
         

FROM    sys.tables AS T INNER JOIN
        sys.columns AS C ON T.object_id = C.object_id INNER JOIN
        sys.types AS Y ON C.system_type_id = Y.system_type_id AND C.user_type_id = Y.user_type_id  left OUTER JOIN
        sys.extended_properties AS ep ON C.object_id = ep.major_id and C.column_id = ep.minor_id
) z
order by z.スキーマ, z.表名, z.列番
ファイル暗号化/復号化スクリプト

*openssl(1)* を実行してファイルを暗号化/復号化する処理を簡易的に実行するための簡単なシェルスクリプトによる wrapper を作成しました。
暗号化/復号化は *openssl(1)* の **enc** コマンドに暗号化アルゴリズムとして aes-128-cbc を指定して実施しています。
指定されたファイルの先頭 8 バイトを参照して **Salted__** の場合は暗号化されていると仮定し復号化、それ以外は暗号化する処理をデフォルトで実行しますが、実行時オプション -d、-e を指定する事で強制的に暗号化/復号化を指定する事も可能です。
-p オプションでパスワードを指定してバッチ処理も実行できますが、コマンド実行履歴等にパスワードが平文で残るのでお勧めできません。
暗号化/復号化が成功した場合は元のファイルを置き換えます。

```sh:cipher
#!/bin/sh
#
#   All rights reserved, copyright (c) 2011, Mitzyuki IMAIZUMI
#   $Id: cipher,v 1.1 2011/02/09 10:32:09 mitz Exp $
#

myname=${0##*/}
tmpfile=${TMP:-/tmp}/${myname}.$$
enc="openssl enc -e -aes-128-cbc -in "
dec="openssl enc -d -aes-128-cbc -in "

trap 'rm -r ${tmpfile}; exit' 0 1 2 3 9 15

if opt=`getopt dep: $*`
then
	set -- ${opt}
	while [ -n "${1}" ] 
	do
		case "${1}" in
			-d )
				force=${dec};;
			-e )
				force=${enc};;
			-p )
				pass="-pass pass:${2}"
				shift;;
			-- )
				shift
				break;;
		esac
		shift
	done
else
	echo "Usage: ${myname} [-d][-e][-p pass] file[, ... file]" 1>&2
	exit 255
fi

for i
do
	if [ -f ${i} ]
	then
		if [ -z "${force}" ]
		then
			# magic number を取得してファイル種別を自動判別
			# バイナリファイルからの read なので dd(1) を利用
			if [ "`dd if=${i} bs=8 count=1 2> /dev/null`" = "Salted__" ]
			then
				command=${dec}
			else
				command=${enc}
			fi
		else
			command=${force}
		fi
		# 暗号化/復号化が成功した場合は元ファイルを置換
		${command} ${i} -out ${tmpfile} ${pass} && mv ${tmpfile} ${i}
	else
		echo "${myname}: cannot open ${i} for input" 1>&2
	fi
done
```
history.back()の入力データ保持について

Webサイトによくある検索画面で文字入力とチェックボックスをチェックして検索ボタンを押下して検索結果画面が出るサイトがあるとします。

検索結果画面でブラウザの戻るボタン（history.back()）したときに入力した文字やチェックボックスが保持されている場合と保持されていない場合があったのでちょっと調べてみました。

IE、Firefox、Opera、Safariの場合
特に条件なく保持されるようです。

Chromeの場合
リンクで遷移したあとのhistory.back()はデータが保持されますが、submitで遷移したあとのhistory.back()はデータが保持されないようです。
ということでボタンなどで検索する場合はjavascriptを使って無理やりlocation.hrefすればできました。

でもそうなったときformのパラメータを全部取ってくるのがめんどくさい。。。
どうにかうまくできないものですかね。
インポートしていないVGのVGIDを取得する方法。



対象：HP-UX11i V3

ストレージミラー機能を利用してLUNをsyncすると、
正副のVGIDが同じ値になってしまい、色々不都合が生じます。
それを調べるためにこいつを利用します。

```
# echo 0x2008?4D |adb /dev/disk/disk<seq> |awk '{print $2,$3}'|sed "s/ //g" |sed s/0<seq>//g
```
Solaris 11 ExpressをiSCSIターゲットとして稼働させる


zpool内のボリュームをiSCSIやFCoEターゲットとして作成することができるようになります。


```手順
# pkg search COMSTAR
# pkg install pkg:/network/iscsi/target
 
# svcs -a |grep iscsi
# svcadm enable -r svc:/network/iscsi/target:default
# echo $?
# svcs -a|grep iscsi
# zfs create -V 200G rpool1/vm01
 
# sbdadm create-lu /dev/zvol/rdsk/rpool1/vm01
Created the following LU:
 
              GUID                    DATA SIZE           SOURCE
--------------------------------  -------------------  ----------------
600144f01890430000004dae0a930001  214748364800         /dev/zvol/rdsk/rpool1/vm01
 
 
# stmfadm list-view -l 600144f01890430000004dae0a930001
stmfadm: 600144f01890430000004dae0a930001: no views found
# sbdadm list-lu|grep vm01|awk '{print$1}'|xargs stmfadm add-view
 
 
# sbdadm list-lu|grep vm01|awk '{print$1}'|xargs stmfadm list-view -l
View Entry: 0
    Host group   : All
    Target group : All
    LUN          : 0
 
 
~# itadm create-target
Target iqn.1986-03.com.sun:02:a659aace-ba00-4c14-fc4a-d2136b95749f successfully created
 
 
# itadm list-target -v
TARGET NAME                                                  STATE    SESSIONS
iqn.1986-03.com.sun:02:a659aace-ba00-4c14-fc4a-d2136b95749f  online   0
        alias:                  -
        auth:                   none (defaults)
        targetchapuser:         -
        targetchapsecret:       unset
        tpg-tags:               default

```

後はイニシエータから接続するだけ
iOS開発でよく使うマクロ数種


自分がアプリ開発をする際にプロジェクト問わずよく使うものをいくつか。

##型の安全なキャスト

```
// メッセージを続けて記述可能
// [SafeCast(NSMutableURLRequest, request) setTimeoutInterval:30];

#define SafeCast(type, var) \
    ^type *(id obj, Class clazz) {\
        if ([obj isKindOfClass:clazz]) {\
            return obj;\
        }\
        return nil;\
    } (var, [type class])
```

##Blocks呼び出しのnilチェックのラッパー

```
// 第一引数にブロック本体を、続けてブロックに渡す引数を記述
// SafeBlockHandler(completion, arg0, arg1); // == completion(arg0, arg1);

#define SafeBlockHandler(block, ...) \
    do {\
        if (block) {\
            block(__VA_ARGS__);\
        }\
    } while (0)
```

##NSUserDefaults読み書きのラッパー


```
// 実際はこのマクロを直接利用せず、型ごとにインライン関数を定義してそこから利用している
// e.g.
// static inline void NSUserDefaultsWriteObject(id aKey, id anObject)
// {
//     NSUserDefaults_Write(aKey, anObject, setObject);
// }
// static inline id NSUserDefaultsReadObject(id aKey)
// {
//     NSUserDefaults_Read(aKey, objectForKey);
// }



#define NSUserDefaults_Write(aKey, anObject, method) \
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\
    if (anObject) {\
        [defaults method:anObject forKey:aKey];\
    } else {\
        [defaults removeObjectForKey:aKey];\
    }\
    [defaults synchronize]

#define NSUserDefaults_Read(aKey, method) \
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\
    return [defaults method:aKey]

```
ATNDからイベントに参加したユーザーのリストを取得

ユーザーの組み合わせを取得しているのは、同じイベントに参加したユーザーをカウントするため。

以下で使用
http://shimz.me/blog/node-js/2701

必要なライブラリ

```
$ npm install request
$ npm install cheerio
```

コード

```javascript:atnd.js
var request = require("request");
var cheerio = require("cheerio");
var atndId  = process.argv[2];
if(!atndId){
	console.log('Not Found atndId')
	return ;
}

request({
	uri: "http://atnd.org/events/" + atndId,
	}, function(error, response, body) {
	var $ = cheerio.load(body);
	var user =[]; 

	$(".a-b > li > span").each(function() {
		var link = $(this).find('a');
		var text = link.text(); //ユーザー名取得
		user.push(text);
	});

	//以下はユーザーの全組み合わせを取得
	var n = user.length;
	var i, j;

	for(i = 0; i < n; i++){
		for(j = i + 1; j < n; j++){
			console.log(user[i] + ", " + user[j]);
		}
	}
});
```

実行

```
$ node getuser.js <ATND PAGE_ID> 
```

ATND APIがある事に後で気付いた orz
OSXでスクリーンキャプチャのシェルスクリプトRetina対応版

OSXでスクリーンキャプチャをとるシェルスクリプトです。Retina対応版というのは具体的には、キャプチャした画像が72dpi以外なら72dpiになるようにリサイズする処理を入れています。

```sh:capture.sh
#!/bin/sh
f=${1:-~/Desktop/capture-`date '+%Y%m%d-%H%M%S'`.png}
/usr/sbin/screencapture -i $f 2>/dev/null
/usr/bin/sips -g dpiWidth -g dpiHeight -g pixelWidth -g pixelHeight $f |
/usr/bin/awk -v imagefile=$f '
$1=="dpiWidth:" {dpiWidth = $2}
$1=="dpiHeight:" {dpiHeight = $2}
$1=="pixelWidth:" {pixelWidth = $2}
$1=="pixelHeight:" {pixelHeight = $2}
END {
  if (dpiWidth != 72 || dpiHeight != 72) {
    w = int(pixelWidth * 72 / dpiWidth)
    h = int(pixelHeight * 72 / dpiHeight)
    cmd = sprintf("/usr/bin/sips %s -s dpiWidth 72 -s dpiHeight 72 -z %d %d >/dev/null 2>&1", imagefile, h, w)
    system(cmd)
  }
}
'
```

[Ben Alman » Fixing "Retina" Image Scaling with Gyazo](http://benalman.com/news/2012/07/fixing-retina-image-scaling/) の記事と [dotfiles/bin/resample-dpi at master · cowboy/dotfiles · GitHub](https://github.com/cowboy/dotfiles/blob/master/bin/resample-dpi) のスクリプトを参考に作りました。ありがとうございます。
iPhoneアプリ開発の参考書を見ながら学習するときに初期に引っかかるポイント


プログラミング初心者向けに書いております。
iPhoneアプリ開発の入門者に見せるために記事を書いており
他の言語学習においても汎用的な内容であると思います。

「引っかかる」という状態は、参考書の通りにしたのに結果が参考書通りにならないことを指します。

学習初期に引っかかるパターンは３つです。
・参考書が間違っている
・参考書と違う文字を入力している
・参考書と手順が違う
これらを攻略する方法を色々な手順で説明します。

## 1.参考書の誤植・古いなどの理由による間違い
参考書は、誤植がある可能性があります。
プログラムは一文字でも違うと動きませんから、誤植は致命的です。
発行元のサポートページにて正誤表がある場合があるので確認してペン入れしましょう。
正誤表のページURLは参考書の最初か最後の方のページに記載されている場合が多いです。
また古い問題に関しては、出来るだけ新しい参考書を買ったり、詳しい人に相談してみましょう。

## 2.スペルミス（書き間違い）
学習初期で最も多いのは、スペルミスです。
間違っている行にはエラーや警告が出ますので、その辺りを参考書と見合わせて誤字脱字がないか調べましょう。

## 3.スペルミスの見つけ方

### 3.1.エラー・警告文を読む
エラー・警告文は簡単な英語です。Google翻訳にでもかけて何となく読んでみましょう。
ただし、文章の指示に従ったところで問題が解決する分けではありません。
おそらくスペルミスですから、文章は参考程度にスペルミスが無いかじっくり観察しましょう。

以下の参考画像のAの三角形はその文字辺りが怪しいと言うヒントです。
Bの赤いアイコンがエラーを表しています、クリックするとエラー文が表示されます。

### 3.2.エラー・警告行の先頭を疑う
一気にエラーが複数表示される場合があります。
この場合は、エラー１個目もしくは１個目より上の行に注目して下さい。
１個目のエラーのせいで出ている２個目のエラーを見ても解決にしにくいです。

### 3.3.大文字小文字の違いに気をつける
myTableViewとmytableViewは違う文字として認識されます。
Tとtなどの大文字小文字の打ち間違いが無いか確認して下さい。

### 3.4.次の行に打ち直す

[self.view addSubviewself.webView];
[self.view addSubview:self.webView];

このように２行目に書いてみましょう。
元の行と、打ち直した行を見比べればスペルミスに気づけます。

### 3.5.ヘッダー側のスペルミスを疑う
エラー・警告が出ている箇所がスペルミスしているとは限りません。
.mのファイルを見ていた場合は.hを見直してみましょう。

### 3.6.それでも駄目なら教科書の間違いを疑う
公式の正誤表に載っていない誤りがある可能性があります。
誰かに相談してみましょう。

## 4.Storyboardを使ったときに自動生成されたコードを修正した場合
このような自動生成されたコードを修正した場合は、Storyboardも直す必要があります。
出来れば、Storyboard側から修正した方が良いのですが、難しければプロジェクトを作り直してやり直してみましょう。

## 5.参考書の手順と違う
参考書と違う手順でやってしまっているかもしれません。
間違った手順を途中から正すのは難しいので、最初からやり直してみましょう。
もし上手くいったとしても、古い方は残しておきましょう。
上手くいった新しい方と、失敗した古い方を誰かに見せることが出来るなら聞いてみましょう。

### 5.1.画像が表示されない！そのファイルは存在しますか？
UIImage等を扱う際にxxxx.pngなどの文字を入れる場合がありますが
そのファイルはプロジェクト内にありますか？
プロジェクト内に無いpngファイルを指定しても何も表示されません。
これも参考書の手順と違うことをしていると言えるでしょう。

## 7.コメントを書いてプログラミング内容をより理解する
スペルミスや手順を間違うのは、プログラミングに対する理解がまだ低いからかもしれません。
書いたコード全てにコメントを書いてみて理解を深めましょう。
コメントに関してはどの参考書にも序盤に書いてありますので確認してみて下さい。
codesign を使って appに設定されているkey-valueを確認する

iCloudとか使う事になると、appにentitlementをつけないといけないのだが、ぼくの環境だと、設定されているはずのkey-valueが落ちちゃうことが頻発している。rebuildするだけでokになったりもする。そもそもこの状況を修正すべきなのだが、とりあえずの対処として、submit前に以下のcommandを使って、applicationにどんなkeyがついているか調べるようにしている。

```
unzip my.ipa
codesign -d --entitlements - Payload/Application/my.app
```
rails-backbone gemを使ってとりあえず単ページJS CRUDアプリケーションを作ってみる

今回は**RubyMine**を使うが、それ以外の場合もほぼ同じだろう。

1. rails applicationを作る

アプリケーション名があとで必要になる。

1. コードを書く

```ruby:Gemfile
gem "rails-backbone"
```

1. bundle install

1. Tools > Run Rails Script > `rails`, `g backbone:install`

1. `app/assets/javascripts/backbone/`に以下のフォルダができる

```
routers/
models/
templates/
views/
```

1. Tools > Run Rails Generator > scaffold > `Post title:string content:string`

1. Tools > Run Rails Script > `rails`, `g backbone:model`

`app/assets/javascript/backbone/models`にBackboneのモデルとコレクションができる。

1. Tools > Run Rake Task > `db:migrate`

1. Tools > Run Rails Script > `rails`, `g backbone:scaffold Post title:string content:string`

1. コードを書く

Blogの部分をアプリケーション名で置き換えること。

```ruby:app/views/index.html.erb
<div id="posts"></div>

<script type="text/javascript">
    $(function() {
        // Blog is the app name
        window.router = new Blog.Routers.PostsRouter({posts: <%= @posts.to_json.html_safe -%>});
        Backbone.history.start();
    });
</script>
```

1. Run > Run 'Development'

1. ブラウザで見ると、単ページ・アプリケーションができている


-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
client 側で yyyy mm dd 入力時に処理

年もしくは月を変えると、それに伴って日が変わります。

日付け選択時にわざわざサーバ側を通さなくても、と思っていたので
それで作った js
ずっと使っていたんですが、最近の書き方じゃないなあと思い始めました。
クラスとか使うともっときれいに出来るんだろうか。
というほど長いコードでもない……

```html:index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" src="initdate.js"></script>
<script type="text/javascript" language="javascript">
window.onload = function()
{
    initYYYY(document.getElementById('birthyear'),-1,1,true);
    initMM(document.getElementById('birthmonth'));
    iniD(document.getElementById('birthyear'),document.getElementById('birthmonth'),document.getElementById('birthday'),true);
};
</script>
</head>
<body>
  <select name="yyyy" id="birthyear" onChange="iniD(document.getElementById('birthyear'),document.getElementById('birthmonth'),document.getElementById('birthday'),true);">
  </select>/
  <select name="mm" id="birthmonth" onChange="iniD(document.getElementById('birthyear'),document.getElementById('birthmonth'),document.getElementById('birthday'),true);">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
    <option value="4">4</option>
    <option value="5">5</option>
    <option value="6">6</option>
    <option value="7">7</option>
    <option value="8">8</option>
    <option value="9">9</option>
    <option value="10">10</option>
    <option value="11">11</option>
    <option value="12">12</option>
  </select>/
  <select name="dd" id="birthday">
  </select>
</html>

```

```javascript:initdate.js

function initYYYY(obj,start,end,flg)
{
    var nowdate = new Date();
    var thisyear = nowdate.getYear() + 1900;
    var startyear = thisyear + parseInt(start);
    var endyear = thisyear + parseInt(end);
    obj.options.length = endyear - startyear + 1;
    for(var i=startyear;i<=endyear;i++)
    {
        obj.options[i - startyear].text = i;
        obj.options[i - startyear].value = i;
        if(flg && thisyear == i)
            obj.options[i - startyear].selected = "selected";
    }
}
function initMM(obj)
{
    var nowdate = new Date();
    var thismonth = nowdate.getMonth() + 1;
    for(var i=0;i<obj.options.length;i++)
    {
        if(thismonth == obj.options[i].value)
            obj.options[i].selected = "selected";
    }
}
function iniD(yy,mm,obj,flg)
{
    var yt = yy;
    var mt = mm;
    var dt = obj;
    var selectedday = obj.value;
    var lastday = new Date(yy.value, mm.value, 0).getDate();
    obj.options.length = lastday;
    for(var i=0;i<lastday;i++)
    {
        dt.options[i].text  = i + 1;
        dt.options[i].value = i + 1;
        if(flg && i+1 == selectedday)
        {
            dt.options[i].selected = "selected";
        }
    }
}


```
same quality cat with ffmpeg1.2


動画の回転をしたくてffmpeg1.2にバージョンアップを行ったらオプションやらがいろいろ変わっていたので、まとめ。

やったことは

* iPhoneで撮影したMOVファイルをmpgに変換
* 変換したmpgを結合
* できたmpgを90度回転してまたMOVに戻す

## iPhoneで撮影したMOVファイルをmpgに変換

```
$ ffmpeg -i input1.MOV -qscale 0 input1.mpg
# ffmpeg -i input2.MOV -qscale 0 input2.mpg
$ ffmpeg -i input3.MOV -qscale 0 input3.mpg
```

## 変換したmpgを結合

```
$ cat *.mpg > output.mpg
```

## できたmpgを90度回転してまたMOVに戻す

```
$ ffmpeg -i output.mpg -vf transpose=1 -strict -2 -qscale 0 output.MOV
```

以前までconcatを使っていたが、画質の劣化がかなりあったので、こちらに変更した。動画のサイズはかなり大きくなったが。。。
Cygwinの更新でエラー

今朝Cygwinを更新しようとしたらなんか次のエラー出ました。

```
pango1.0.sh exit code 1
```

なんぞ

```
/etc/pango
```

がないのがエラーの原因っぽいので、Quik FixとしてCygwinで先に

```
mkdir /etc/pango
```

でエラーは治りました。

この対応でたぶん問題ない。
Rasberry PiをセットアップしてMacのバックアップ用として設定するまで


rasberry-piをセットアップして外付けHDDを接続、MacのTimeMachineに表示されるまで。

## rasberry-piの設定

### ディスクイメージの作成

SDカードにraspberrypiのイメージ書き込みをします
MacにでもSDカードをさしてコマンド操作

    mount
    > /dev/disk1s1 on /Volumes/Untitled (exfat, local, nodev, nosuid, noowners)

    diskutil umount /dev/disk1s1

* http://www.raspberrypi.org/downloads
imgのダウンロード


    sudo time dd bs=1m if=2013-02-09-wheezy-raspbian.img of=/dev/disk1
    sudo diskutil umountDisk /dev/disk1


### 起動、初期設定

rasberry-piにSDカードを差し込んで電源も接続して起動。

初期状態では2GBの容量しかSDカードを使ってくれないので
raspi-configの`expand_rootfs`を実行してください。
設定が終わってからreboot後に適応されます。

raspi-configの画面はrasberry-piを起動したら最初に表示される画面。
あとから画面を表示したくなったら

    sudo raspi-config

でOK
他にも

- locateの設定
- タイムゾーンの設定
- GUI起動の有無
- ssh接続の設定

等があるので都度切り替えてください。
とりあえずssh接続できるようにしておけば何とかなる(かも)。

### ネットワークの設定
初期設定が終わったらauthorized_keysを置いてsshの設定や固定IPの設定

    sudo vi /etc/network/interfaces

```interfaces
iface lo inet loopback
iface eth0 inet static
  address 192.168.111.100
  netmask 255.255.255.0
  gateway 192.168.111.1
  dns-nameservers 8.8.8.8
```

### パッケージのインストール、アップデート

    sudo apt-get install screen vim git
    screen
    sudo apt-get update; sudo apt-get -y dist-upgrade; sudo reboot

結構時間かかるので放置して本でも読んでましょう。
`screen`で開く意味はそんなに無いかもですが、長い処理が途中で中断(sshが切れる)されたら不安なのでなんとなくです。

## Time Machineの設定

### Netatalkインストール

    sudo apt-get -y install libssl-dev libgcrypt11-dev libpam0g-dev libwrap0-dev libdb-dev libavahi-client-dev libacl1-dev libldap2-dev
    cd /usr/local/src
    sudo wget http://prdownloads.sourceforge.net/netatalk/netatalk-3.0.3.tar.bz2
    sudo bzip2 -dc netatalk-3.0.3.tar.bz2 | sudo tar xvf -
    cd netatalk-3.0.3/
    screen
    sudo ./configure --with-init-style=debian; sudo make ; sudo make install

お茶でもすすって待ちます

### HDDのフォーマット

今回は外付けHDD,1TBの容量すべてをTimeMachine用の容量として使います。

    sudo fdisk -l

今回は`/dev/sda1`に接続できたようです。

    sudo fdisk /dev/sda1

コマンド、d- > n -> p -> 空エンターでデフォルト設定 -> w
既存のパーティションをすべて削除してパーティションを１つだけ作成

    sudo mkfs -t ext3 /dev/sda1

フォーマットされるのをしばし待つ。

### HDDのマウント

    sudo mkdir /media/mbatc
    sudo mount /dev/sda1 /media/mbatc
    mount

`/dev/sda1 on /media/mbatc`の表示があればOK
起動時の自動マウント設定

    sudo vi /etc/fstab

```fstab
/dev/sda1       /media/mbatc    ext3    relatime        0       2
```

    sudo umount /media/mbatc
    sudo mount -a
    mount

### Netatalkの設定

Netatalk3系からはsamba風の設定ファイル１つで設定できるようになったようです。大変便利。

    sudo vi /usr/local/etc/afp.conf

```afp.conf
;
; Netatalk 3.x configuration file
;

[Global]
mac charset = MAC_JAPANESE
uam list = uams_clrtxt.so uams_dhx.so uams_dhx2.so uams_guest.so
log file = /var/log/netatalk.log
vol preset = my default values

[my default values]
valid users = @pi
file perm = 0660
directory perm = 0770

[Time Machine]
path = /media/mbatc
time machine = yes
vol size limit = 1000000
```

バックアップする時のログインユーザーは標準のpiユーザーです。別途ユーザーを作成して設定しても良いでしょう。

    sudo service netatalk restart


Mac側でTimeMachineのHDD設定に表示されるんでバックアップを作成して完了。
rbenv を利用している際に Pow が rbenv の ruby を使ってくれない場合の対処法

Pow や Powder はとても便利なのですが、インストールした際に rbenv の ruby ではなく、OSX に付属の ruby が使われてしまう場合の対処法です。

## 問題が発生した環境
OSX 10.8
rbenv 0.4.0
pow 0.4.0

## 症状
rbenv で ruby を導入していて、global や local で ruby のバージョンを指定しているにもかかわらず、pow が OSX 付属の ruby(`/System/Library/Frameworks/Ruby.framework/`) を使ってしまう。

## 解決方法
`~/.powconfig` で rbenv の shims や bin に path を通す。

### 設定例
    export PATH=$(rbenv root)/shims:$(rbenv root)/bin:$PATH

## 参考情報
[rbenv does not work well with pow](https://github.com/37signals/pow/issues/202)
Tumblrのエントリーにdata-id='unko'などとhtml5のdata系を入れても消されてしまう


Tumblrの投稿欄に

```html
<div id="unko" data-id="chinko">大好きです！</div>
```

などとしても

```html
<div id="unko">大好きです！</div>
```

data系はバリデートされて消されるぽい。
UIImage で Resizable Image

Android でいう 9-Patch 的な画像引き延ばしができる。（9-Patch ほど小回りは効かない）

角丸ボタンなんかの素材は小さく作っておいて、実装側で引き延ばすやり方がエコかもしれない。
<del> その場合、細かいノイズをかけたようなデザインは避け、平坦なグラデーションの方が都合が良い（ノイズ等だと残念な感じに引き延ばされ汚くなる）。 </del>
ノイズ系には後述の `UIImageResizingModeTile` を使用すると良い。

```objectivec
UIImage *image = [UIImage imageNamed:@"ButtonNoGazou.png"];

// image の上0pt, 左4pt, 下2pt, 右8pt の padding を残して引き延ばす
UIImage *btnbg = [image resizableImageWithCapInsets:UIEdgeInsetsMake(0, 4, 2, 8)];

// UIButton の背景にあてれば、ボタンの大きさに合わせて画像が引き延ばされる。
[btn setBackgroundImage:btnbg forState:UIControlStateNormal];
```

## UIImageResizingMode (iOS 6)

iOS 6以降からは `UIImageResizingMode` で引き延ばし方を指定出来る。
標準は `UIImageResizingModeTile` でタイル状に補完される。ノイズ系の画像に向いている。
もうひとつの `UIImageResizingModeStretch` では引き伸ばして補完される。グラデーションやのっぺり系の画像に向いている。

## UIViewContentMode

UIImageView の場合は ContentMode によって描画内容が変化する。
いちばんしっくりくるのが UIViewContentModeScaleToFill、
UIViewContentModeAspectFit, UIViewContentModeAspectFill では View の矩形に合わせて描画しようとする。
UIViewContentModeTop 等ではそもそもうまく描画されないような気がする。
正規表現にマッチした文字をスコープを超えて取得する方法

正規表現リテラルやRegexpオブジェクトでマッチした文字は `$&`, `$1`, `$2` などの 特殊変数で取得することが可能です。しかし、以下のように、マッチさせた文字はそのスコープ内のみで有効となります。

```ruby:test_match1.rb
class Hoge
  def match(match_str, src_str)
    match_str =~ src_str
    puts "(in #{__method__} method) [ #{$1} ]"
  end
  
  def match_str_get
    puts "(in #{__method__} method) [ #{$1} ]"
  end
end
 
a = Hoge.new
a.match(/^(....)/, "hogefuga") #=> (in match method) [ hoge ]
a.match_str_get #=> (in match_str_get method) [  ]
### a.match でマッチした文字列は a.match_str_getのスコープでは取得できない。
```

ですが、以下の例のように、`Regexp#match` を使用することによって、スコープを超えてマッチした文字列を取得することができます。`Regexp#match` はマッチした文字列情報を持った `MatchData` オブジェクトを返します。これはマッチした時の情報を保持した状態でインスタンス生成されるので、別の正規表現をマッチさせても更新されることはありません。

```ruby:test_match1.rb
class Hoge
  def match(match_str, src_str)
    @match_data = match_str.match(src_str)
    puts "(in #{__method__} method) [ #{@match_data[1]} ]"
  end
  
  def match_str_get(match_str, src_str)
    @mach_data_last = match_str.mach(src_str)
    puts "(in #{__method__} method) [ #{@match_data[1]} ]"
  end
end
 
a = Hoge.new
a.match(/^(....)/, "hogefuga") #=> (in match method) [ hoge ]
a.match_str_get(/^(...)/, "fugahoge") #=> (in match_str_get method) [ hoge ]
### a.match でマッチした文字列を a.match_str_getのスコープで取得できるようになった。
### a.match_str_get 内で別の正規表現をマッチさせても以前の文字列を保持している。
```

### 余談
`Regexp#match` の代わりに、`Regexp.last_match` を使うことも出来ます。
一度 `=~` で文字列比較した後、`Regexp.last_match` を用いて `MatchData` オブジェクトを取得可能です。
でも、`Regexp.last_match` って長いですよね。これにも特殊変数が用意されています `$~`がそれです。
マッチした文字列全体は `$~`で、一つ目のグループは `$~[1]` で取得できます。二つ目、三つめは添え字内の数値を増やせばOKです。
圧縮して転送をバックグラウンドにまわす


````gzip_scp.sh
for file in $files; do
    # サブシェルで圧縮と転送をひとまとめにした処理をバックグラウンドで実行
    (gzip $file; scp $file.gz $server:~) &
done
# 全部の転送が終わるのを待つ
wait
最近オブジェクト指向ってのが流行ってるみたいなので、Rubyに実装してみた


ぼくオブジェクト指向ってよくわかんないんですけど、データ構造と処理を抽象化してオブジェクトと呼ぶものにメッセージを送信することでプログラミングを実現する考へかたのことなんじゃないですかねえ……。

```ruby:ruby-oop.rb
Klass = ->(klass){
  lex = {
    methods: {},
    class_methods: {
      new: ->{}
    },
  }.merge(klass)
  kvars = {}

  return ->(source){
    object = {source: source}
    vars = {}
    return ->(name, *as){lex[:methods][name][*[object]+as]}
  }
}

OreString = Klass[
  name: 'OreString',
  methods: {
    to_s: ->(rsv){ rsv[:source] }
  },
]

str = OreString["String"]

p str[:to_s]
#=> "String"
```

もうちょっとうまい実装の仕方があるんだけど、時間がなかった。 `class_methods` って書いてあるあたりから察しろ……!
CSSでリボン

CSSでリボン風の見出しを作る。という何番煎じかわからないネタ。

![Σ字状のリボンが描画されるはず](https://photos-6.dropbox.com/t/2/AACShWioOEQJ_rd1nm6PLt7OKA7_EVcIYQOZD-7lT02yxg/12/7605502/png/32x32/3/1496437200/0/2/RibbonSample.PNG/ENaB0wUYr7ACIAcoBw/Ue0VazJ5Bda7d5Z9TDSEJA8aCtSTwGHSCClt9QpHDyg?dl=0&size=2048x1536&size_mode=3)

```html:ribbon.html
<!DOCTYPE html>
<html>
    <head>
        <title>リボン</title>
    </head>
    <body>
        <h1>リボンのテストです。</h1>
    </body>
</html>
```

```css:ribbon.css
html, body
{
    margin: 0;
    padding: 0;
}

body > h1
{
    /* 余白は適当に調整してください */
    margin: 20px 0 20px 0;
    padding: 0 160px 0 60px;
    /* サイズも適当に調整してください */
    font-size: 32px;
    height: 50px;
    line-height: 50px;

    /* 内容に応じた幅になるよう inline-block を指定する */
    display: inline-block;

    color: #FFFFFF;

    /* 今回の本題とは関係ない。文字を立体的にしているけどあんま効果感じない */
    text-shadow: 2px 2px 0 rgba(0, 0, 0, 1);

    /* ここがステッチになる */
    border-style: dashed none;
    border-width: 1px;
    border-color: #FFFFFF;

    /* relative にしてスタックを生成 */
    position: relative;
    /* before 擬似要素を裏に持っていくために必要 */
    z-index: auto;
}

    body > h1:before
    {
        content: "";

        /* 右側のボーダーだけ透明色とすることでリボンの形を表現 */
        border-style: solid;
        border-color: #131132 transparent #131132 #131132;
        border-width: 30px;
        height: 0;

        /* 立体感出してるだけ */
        box-shadow: -1px 1px 1px #000000;

        /* 位置の指定 */
        position: absolute;
        left: 0;
        right: -7px;
        top: -5px;
        bottom: 0;

        /* z-index を負の数にして h1 より後ろに持っていく */
        z-index: -1;
    }
```

IE8だとステッチが出ないようだ。気が向いたら改良します。
並列処理してみる


「並列化したのに却って遅くなった」が解決するかも？

次のループ処理について並列化してみます。

```c#:3で割った余りでそれぞれ総数を求める
// 初期化
int div = 3;
int[] array = new int[10000000];
Random random = new Random();
for (int i = 0; i < array.Length; i++) { array[i] = random.Next(); }

{	// ループ処理　for版
	int[] ct_mods = new int[div];
	for (int i = 0; i < array.Length; i++) {
		ct_mods[array[i] % div]++;
	}
}

{	// ループ処理　foreach版
	int[] ct_mods = new int[div];
	foreach (var x in array) {
		ct_mods[x % div]++;
	}
}
```

これを単純に並列処理にしたのが次の２つ。

```c#:並列処理(1-1)　for版
int[] ct_mods = new int[div];
object lockobj = new object();
Parallel.For(
	0,	// ループ変数の初期値
	array.Length,	// ループ変数の終了値
	(i) => {
		lock (lockobj) { ct_mods[array[i] % div]++; }
	});
```

```c#:並列処理(1-2)　foreach版
int[] ct_mods = new int[div];
object lockobj = new object();
Parallel.ForEach(
	array,
	(x) => {
		lock (lockobj) { ct_mods[x % div]++; }
	});
```

ロックとかする必要がなければこの書き方で十分高速化できるけど、今回の例では毎回結果格納用変数をロックしているから逆に遅くなったり。
ではどうすれば速くなるのかというと、次のように各スレッドごとに結果を求め、最後に結果をマージすれば良い。

```c#:並列処理(2-1)　結果を最後にマージする方式　for版
object lockobj = new object();
int[] ct_mods = new int[div];
Parallel.For<int[]>(	// int[]はスレッドのローカル変数の型
	0,
	array.Length,
	() => new int[div],	// 各スレッドのローカル変数（ここではct_mods_wk）の初期化
	(i, loopstate, ct_mods_wk) => {	// ct_mods_wkは並列の数だけ作成される
		ct_mods_wk[array[i] % div]++;
		return ct_mods_wk;
	},
	(ct_mods_wk) => {
		// 並列処理が終わったときに実行する処理
		// 各スレッドのローカル変数の値をマージする
		lock (lockobj) { for (int i = 0; i < div; i++) { ct_mods[i] += ct_mods_wk[i]; } }
	});
```

```c#:並列処理(2-2)　結果を最後にマージする方式　foreach版
object lockobj = new object();
int[] ct_mods = new int[div];
Parallel.ForEach<int, int[]>(	// intは要素の型、int[]はスレッドのローカル変数の型
	array,
	() => new int[div],
	(x, loopstate, ct_mods_wk) => {		ct_mods_wk[x % div]++;
		return ct_mods_wk;
	},
	(ct_mods_wk) => {
		lock (lockobj) { for (int i = 0; i < div; i++) { ct_mods[i] += ct_mods_wk[i]; } }
	});
```

## 参考

http://ufcpp.net/study/csharp/lib_parallel.html
http://msdn.microsoft.com/ja-jp/library/vstudio/dd460703.aspx
http://msdn.microsoft.com/ja-jp/library/vstudio/dd997393.aspx

## 2013/04/01追記
誤りがあったので修正しました。(2-1)および(2-2)で、マージ処理するところはロックする必要があります。
(1-1), (1-2)の総ロック回数 = 千万回
(2-1), (2-2)の総ロック回数 = 数十〜数百回（状況によって変動する）

参考までに、私の環境で並列化しない場合と比べて(2-1),(2-2)は約2倍高速化しました。
gem install 時に "env: ruby_bundler_wrapper: No such file or directory"と怒られた

## 現象
http://qiita.com/items/88746e6e328a1533ccfe こちらの手順に従ってインストールしていたら表題のエラーが出た

```bash
$ gem install rails
$ rbenv rehash
$ rails -v
env: ruby_bundler_wrapper: No such file or directory
```

## 解決策
gem install する際にsudoを付けると問題は解消した

```bash
$ sudo gem install rails -v 4.0.0.beta1
$ rbenv rehash
$ rails -v
Rails 4.0.0.beta1
```

良いやり方かわからないのでより良い解決策が知りたいです
Octopress Top Categories Plugin を使う


サイドバーに表示するカテゴリリストを投稿数の多い順＆上位○件 の表示にするプラグインです。

先生はこちら。

* [Octopress Top Categories Plugin - Time To Pull The Plug](http://time.to.pullthepl.ug/blog/2012/8/20/octopress-top-categories-plugin)
* [ctdk/octopress-category-list - GitHub](https://github.com/ctdk/octopress-category-list)


## プラグインのダウンロード
[ctdk/octopress-category-list - GitHub](https://github.com/ctdk/octopress-category-list) から ``plugins/category_list.rb`` を自分の octopress リポジトリの ``plugins/`` へコピーします。


## サイドバーに TopCategoryList を表示するための HTML を用意する
自分の octopress リポジトリの ``source/_includes/custom/asides/`` に ``top_category_list.html`` というファイルを作成、内容は以下のようにする。

```html:top_category_list.html
<section>
  <h1>Top Categories</h1>
    <ul id="top-category-list">{% top_category_list counter:true %}</ul>
</section>
```

## top_category_list.html を使用するように設定を書き換える
自分の octopress リポジトリの ``_config.yml`` をエディタで開き、

以下のように変更する

```yml:_config.yml
# [変更]custom/asides/top_category_list.html を任意の位置に挿入する
default_asides: [custom/asides/about.html, asides/recent_posts.html, custom/asides/top_category_list.html]


# [追加]カテゴリの表示件数
top_category_limit: 15
```

## 動かす

``rake generate`` して ``rake preview`` して確認した後、``rake deploy`` しましょう。


自分のブログに適用してみました。
 
* [Experiments Never Fail](http://amay077.github.com/)

Top Category List だけだと当然ながらすべてのカテゴリがわからないので、別途全てのカテゴリを列挙するページを作って、'view All-Categories' でリンクしてます。
無料ソフトだけでMacのデスクトップにiTunes再生中の曲の歌詞をクールに表示

AppStoreで無料にて配布されているGeekToolはご存知だと思う。
簡単に説明するとあらかじめGeekToolで設定しておいたコマンドの標準出力をデスクトップに表示できるというもの。

例えば

```bash:
date +"%a %b%d [%k:%M]"
```

 などとしておけばSun Mar31 [15:03]と表示される。
表示する位置やフォント、色、サイズなどかなり詳細にカスタマイズ出来るため拘るほどに見た目は自分好みになる。
CPUやメモリまわりの情報を使えばそれこそギークな雰囲気にはなるが、以外とすぐ飽きる？？かも知れない。

このアプリの使い方のお手本を検索するとよく見られるパターンが、GeekToolで先ほどのギークっぽい情報の表示に加え、デスクトップに歌詞をiTunes再生中の歌詞を表示するといったもの。

しかし紹介されているやり方では歌詞表示に関しては、どれも別のアプリに頼っている。
デスクトップに歌詞を表示するアプリは２つほど存在したが、たかだかデスクトップを盛り上げるのに２つものアプリを常駐するのはどうかと思う。

GeekToolだけで済んだ方が管理も楽だろうし統一感も出しやすいだろう。
となるとコマンドラインで歌詞を表示することを考えるしかない。
そうすればGeekToolだけで事足りる。

結論は、iThiefというコマンド（もちろんフリー）をダウンロードして来て、配布サイトの指示に従ってファイルを配置する。「~/Library/iTunes/Script」へ「iThief.scpt」を配置すればiThiefはiTunesに対しての操作が可能になる。曲の再生、検索、歌詞出力からいろいろと機能がある。

それらのコマンドの実行については

```bash:
iThief h
```

(ヘルプコマンド)で一覧を見てもらいたい。
コマンドラインからガンガンiThiefを使いたい人は、使っているシェルにiThiefのパスを通しておくとよい。

そして肝心のGeekToolを使ってデスクトップに歌詞を表示する方法だが、GeekToolはどのシェルを使っているかもよく分からないしパスをどう通してよいか分からないので、コマンドを設定するときは

```bash:
[iThiefまでのパス]/iThief l
```

というふうにする。
最後のlはlyric(歌詞)のLだ。

とりあえず参考までにコマンドラインでの実行結果の一例を挙げておく。
ちなみにパスは既に通してあるということで。

```bash:zsh
MacBook-Pro-Retina% iThief p 
iTunes is now playing "Silent Jealousy" by X in "破滅に向かって1992.1.7 TOKYO DOME LIVE [Disc 1]" (1995) Composed by 編曲：X/作詞･作曲：YOSHIKI from the playlist "Z".
MacBook-Pro-Retina% iThief l
I'm looking for you trying to reach your roses
Carried away by the time

静寂の凶気に片目を潰されたまま

You've gone away from the stage
Leaving no words
There's just fake tears left

偽りの真珠で飾った薔薇の花束を探す

I'm blind insane in the red of silence
Now I've lost your love

幻覚の愛に飼われた操り人形

Get me on my feet Get me back to myself
Pretend you love me

指先まで真紅に染まったオレをみつめて

もう耐えきれない 孤独のセレナーデ
虚像の海に流して
夢から覚めた血塗れの天使を
胸に抱いても I can not stop

※Silent Jealousy
Don't you Leave me alone 悲しみに乱れて※

戻れない愛を飾る 繰り返す孤独の中に
Tell me true 何処に行けば 苦しみを愛せる
I still want your love 愛を止めて
くるい咲く記憶を消して

(セリフ)「I just wanted to stay with me
I just wanted to feel your breath of grace
I didn't know what to do I couldn't say anything
When consciousness returned
Everything had been wasted away
by the tide of time, even you
But the scars of memory never fade away
I can't stop loving you
Stop my tears Stop my loving 
Kill my memories」

You dyed my heart in blood
No way to kill my sadness
立ち去る前に殺して
叫気の愛に抱かれた瞳は 何も見えない
今も I miss you can't live without you 

Silent Jealousy 夢に堕ちて
抱き締める記憶を
Stay in yesterday 時を止めて
繰り返す孤独を消して

Take me back to the memory, to the dream

(※くり返し)

Kill me, Love
```

このGeekTool、任意の画像をデスクトップに表示することも可能なので再生中の曲のアートワークのパスなりを取得出来ればいいのだが、そこらは模索中である。

デスクトップをいじくりまわすのがどうというより、コマンドラインで遊ぶことを楽しんでみるのも良いかもしれない。
無料ソフトだけでMacのデスクトップにiTunes再生中の曲の歌詞をクールに表示

AppStoreで無料にて配布されているGeekToolはご存知だと思う。
簡単に説明するとあらかじめGeekToolで設定しておいたコマンドの標準出力をデスクトップに表示できるというもの。

例えば date +"%a %b%d [%k:%M]" などとしておけばSun Mar31 [15:03]と表示される。
表示する位置やフォント、色、サイズなどかなり詳細にカスタマイズ出来るため拘るほどに見た目は自分好みになる。
CPUやメモリまわりの情報を使えばそれこそギークな雰囲気にはなるが、以外とすぐ飽きる？？かも知れない。

このアプリの使い方のお手本を検索するとよく見られるパターンが、GeekToolで先ほどのギークっぽい情報の表示に加え、デスクトップに歌詞をiTunes再生中の歌詞を表示するといったもの。

しかし紹介されているやり方では歌詞表示に関しては、どれも別のアプリに頼っている。
デスクトップに歌詞を表示するアプリは２つほど存在したが、たかだかデスクトップを盛り上げるのに２つものアプリを常駐するのはどうかと思う。

GeekToolだけで済んだ方が管理も楽だろうし統一感も出しやすいだろう。
となるとコマンドラインで歌詞を表示することを考えるしかない。
そうすればGeekToolだけで事足りる。

結論は、iThiefというコマンド（もちろんフリー）をダウンロードして来て、配布サイトの指示に従ってファイルを配置する。「~/Library/iTunes/Script」へ「iThief.scpt」を配置すればiThiefはiTunesに対しての操作が可能になる。曲の再生、検索、歌詞出力からいろいろと機能がある。

それらのコマンドの実行については iThief h (ヘルプ)で一覧を見てもらいたい。
コマンドラインからガンガンiThiefを使いたい人は、使っているシェルにiThiefのパスを通しておくとよい。

そして肝心のGeekToolを使ってデスクトップに歌詞を表示する方法だが、GeekToolはどのシェルを使っているかもよく分からないしパスをどう通してよいか分からないので、コマンドを設定するときは [iThiefまでのパス]/iThief l というふうにする。
最後のlはlyric(歌詞)のLだ。

このGeekTool、任意の画像をデスクトップに表示することも可能なので再生中の曲のアートワークのパスなりを取得出来ればいいのだが、そこらは模索中である。

デスクトップをいじくりまわすのがどうというより、コマンドラインで遊ぶことを楽しんでみるのも良いかもしれない。