OmniAICreator/Qiita-1.07M huggingface dataset:
windowsで他のユーザのごみ箱を消す。

会社などでみんなが使い古したパソコンを譲り受けたときにいらないファイルを消すのはもちろんですが、ほかのユーザのごみ箱にいらないファイルが残ってる場合があります。
それらを消す方法がわからなかったので調べてみました。

そもそもゴミ箱っていうのはc:\$Recycle.Binにあるようです。
その中の仕様はよくわかりませんが、以下コマンドでフォルダ内を消せば全ユーザのごみ箱を消すことができます。

rd /s c:\$Recycle.Bin

※コマンドプロンプトを起動するときに右クリックで「管理者として実行」から起動して実行してください。
TRPGのオンセ用チャットという

需要があるのかないのかよくわからないツールをちょいと前から作り始めました。

今ドキはRailsがどうなってるのかもういっかい勉強しないとな〜ということで、勉強がてらRails3.2.9で開発をはじめたんですが一応動くようになったのでHerokuにデプロイし、仲間内でこちゃこちゃ使ってます。

HTML部分がほぼScaffoldのまんまというひどさなので色々アレですが、まあ動いてます。一応。

http://shrouded-meadow-8468.herokuapp.com/

ユーザー認証をオレオレで作っちゃってたりしてアレなので、ちょっと構成を見直すことにしました。

・認証は普通に[Devise](http://devise.plataformatec.com.br/)
・ActiveRecordを標準で使用、チャットログはMongoidを使用（参考にしたのはこちら　http://qiita.com/items/846038c47f51c6b90c64）
・プッシュサーバーはfayeというかPrivate_pubから[async_sinatra](https://github.com/raggi/async_sinatra)に変更（…したら更新もれなくなるのかなあ…）

という方針で作ろうかなと。


今のところ、プッシュ更新にはprivate_pubを使ってるのですが、これがなんかめちゃくちゃ更新洩れして、何か設定間違えてるのか、Herokuの無料枠の制限なのか、頭を抱えている次第です。
だいたい2〜50発言に一回は更新洩れが発生するので、相当不快な使い心地で困ったな。

それ以外は、パフォーマンス的には、10人くらいで使ってる分には無料枠で充分な感じでした。DBの件数があっというまに上限突破してしまう以外は。
まあちょっとごにょごにょがんばってみます。
ClojureとHello world


Clojure、はじめました。

```clj
(defn random-string [n]
  (let [random (java.util.Random. n)]
    (clojure.string/join
      (map #(char (+ % (int \`)))
           (take-while #(not= % 0) (repeatedly #(.nextInt random 27)))))))

(println
  (clojure.string/join " " (map random-string [-229985452 -147909649])))
```

[Why does this code print “hello world”? - stackoverflow](http://stackoverflow.com/questions/15182496/why-does-this-code-print-hello-world)
Applicative Form と Monadic Form を併用する

AForm ではレイアウトなどの自由が効かないが、全てを MForm で書くのは意外と大変だということがわかった。AForm で済む部分は極力 AForm で間に合わす一つの方法。
この例では renderBootstrap ベースで、氏名に AForm、生年月日に MForm を使っている。

```haskell
mformPerson :: MForm App App (FormResult (Text, Day), Widget)
mformPerson = do
    (nameRes, nameWidget) <- flip renderBootstrap "" $ areq textField "氏名" Nothing
    (dobYearRes, dobYearView) <- mreq intField (small "") Nothing
    (dobMonthRes, dobMonthView) <- mreq intField (small "") Nothing
    (dobDayRes, dobDayView) <- mreq intField (small "") Nothing
    let res = (,)
            <$> nameRes
            <*> (fromGregorian
                <$> fmap fromIntegral dobYearRes
                <*> dobMonthRes
                <*> dobDayRes
                )
    let dobErrors = fvErrors dobYearView <|> fvErrors dobMonthView <|> fvErrors dobDayView
    let widget = [whamlet|$newline never
<!-- name -->
^{nameWidget}

<!-- date of birth -->
<div .control-group :has dobErrors:.error .required>
    <label .control-label for=#{fvId dobYearView}>生年月日
    <div .controls>
        ^{fvInput dobYearView} 年
        ^{fvInput dobMonthView} 月
        ^{fvInput dobDayView} 日
        $maybe err <- dobErrors
            <span .help-block>#{err}
|]  

    return (res, widget)
    where
        small lbl = lbl { fsAttrs = [("class", "input-small")] }
        has (Just _) = True
        has Nothing = False
```
シェルスクリプトでの疑似乱数の取得

相変わらず blog からの転載

*bash* (1) には ``${RANDOM}`` というシェル変数が用意されていて、 アクセスするたびに疑似乱数(風)の値が取得できるが、*bash* (1) 独自の機能なので拡張性がない。そこで汎用的な疑似乱数取得の方法として *awk* (1) を利用した方法を使ってみる。

*awk* (1) には rand() という関数が組込まれているので疑似乱数が生成できる。 その際に利用される種（seed）は srand() という関数で初期化する。
ただし *awk* (1) の rand() は仕様として 0 ～ 1 までの桁数不定の少数を返すので、乱数として利用する場合には整数に変換する必要がでてくる。
そこで、整数にするために rand() で取得した値の前 2 文字 ("0.") 以降を切り出した文字列を乱数として使用する様にしている。
データの型がない（文字列であり数字である）*awk* (1) ゆえの小技じゃないかな。

```sh:random.sh
#!/bin/sh

awk 'BEGIN{
    srand();
    print substr(rand(), 3) % '${1:-1}'
}'
```

引数なしでこのスクリプトを実行すると乱数が取得できる。
引数で整数を指定すると 0 から引数で指定した値までの範囲の乱数が取得できる。
BITNAMIを使ってredmineを簡単インストール

#インストール

このサイトから

Redmine cloud hosting, installers and virtual machines <http://bitnami.org/ja/stack/redmine>

`bitnami-redmine-2.2.3-0-linux-installer.run`

をダウンロード

下記のコマンドでインストール

```bash
$ chmod 755 bitnami-redmine-2.2.3-0-linux-installer.run
$ ./bitnami-redmine-2.2.3-0-linux-installer.run
```
そうすると、GUIが立ち上がって数クリックでインストール完了

`/home/username/redmine-2.2.3-0`
にApacheとかmysql,redmine一式がインストールされる。

rootユーザーでインストールすると別のディレクトリにインストールされる。

>Where is the installation directory? <http://wiki.bitnami.org/Native_Installers_Quick_Start_Guide>

#アクセス
http://localhost:8080/redmine/

#感想
数ヶ月前にBITNAMIのwordpressを試したがとても簡単にインストールできた。

入れた直後の感想

>BITNAMIつかってUbuntuにRedmineインストールしたけど、数クリックでインストールできた。　簡単過ぎて、XAMPP以来ぐらいの感動 <https://twitter.com/wei_yuan/status/309177413164748800>

**でもよく考えたら、gitのサーバーも欲しいのでこちらを入れたほうがいいかも**

インストールが困難と噂のGitorious

Gitorious cloud hosting, installers and virtual machines <http://bitnami.org/stack/gitorious>
magitのログ出力を時系列順に表示したい。

使えば使うほど深みにハマる g i t

こんにちは。最近gitを無駄遣いしはじめました。magitと一緒に使い始めたんですが、慣れるまでがたいへん面倒でございました。しかしいざ使ってみるとなんとも面白いツールでして。まだメリットを活かしきれない感じなので、もっとガッツリ使っていこうと思います。

-
さっさと本題。
普段gitのグラフ付きログはトポロジカルな並びで出力されてますが、ちょっと時系列順で表示したいなーって時があったのでいじってみました。

Initにドーンしましょう。

```scm
(require 'magit) ; requireしたあとで↓

;; magit-logに日付順ソートオプションを追加
(magit-key-mode-insert-switch 'logging "-do" "Date order" "--date-order")
```

これでmagitから`l`キーでのポップアップ中、`Switches`の欄に
`-do: Date order (--date-order)`が追加されてますね！

> \- d o

をタイプしてからAction！
ログが時系列順になりました！！
おしまいです！

-
ちなみにコマンドは別に`-d`でも大丈夫ですが、git的に凄まじくデリィト感ただよってたので`-do`にして使っています。
Reflection vs Closure: どちらが高速にプライベートプロパティにアクセスできるかベンチマークを取ってみた


結論から言うと、Reflectionでアクセスするほうが早い。有意差はとっていないので、ReflectionのほうがClosureより劇的に早いかというと不正確になるが、パッと見た感じでは若干早いかなくらい。

Reflectionでアクセスする方法:

```php
<?php
function accessViaReflection($object, $property)
{
    $reflection = new ReflectionProperty($object, $property);
    $reflection->setAccessible(true);
    return $reflection->getValue($object);
}
```

Closureでアクセスする方法:

```php
<?php
function accessViaClosure($object, $property)
{
    return call_user_func(
        Closure::bind(
            function () use ($property) {
                return $this->$property;
            },
            $object,
            $object
        )
    );
}
```

ベンチマーク用関数:

```php
<?php
function benchmark(callable $test)
{
    $start = microtime(true);

    for ($i = 0; $i < 100000; $i += 1) {
        $test();
    }
    
    return microtime(true) - $start;
}
```

テストで使うクラス:

```php
<?php
class Foo
{
    private $bar = 1;
}
```

ベンチマークの内容:

```php
<?php
$result = benchmark(function(){
    $foo = new Foo();
    accessViaReflection($foo, 'bar');
});

echo 'accessViaReflection: ',$result, PHP_EOL;

$result = benchmark(function(){
    $foo = new Foo();
    accessViaClosure($foo, 'bar');
});
echo 'accessViaClosure:    ',$result, PHP_EOL;
```

結果:

```
accessViaReflection: 0.83559417724609
accessViaClosure:    0.94324016571045
```
普段使ってるCakefile


さくっとCompileとかしたいとき用。

```coffeescript
fs = require 'fs'
util = require 'util'
{spawn, exec} = require 'child_process'
 
option '-o', '--output [DIR]', 'Output directory.'
option '-t', '--target [DIR]', 'Watch target directory.'
 
stdout_handler = (data) ->
    console.log data.toString().trim()

fileCopy = ->

    dirname = '_src/coffee'
    fs.readdir dirname, (err, filelist) ->
        for filename in filelist
            if /.*\.coffee$/.test filename
                rio = fs.createReadStream "#{dirname}/#{filename}"
                wio = fs.createWriteStream "js/#{filename}"
                util.pump rio, wio

        return
 
build = (watch, output = 'js', target = '_src/coffee') ->
    console.log 'Watching coffee scripts'
    console.log "Watch to #{target}"
 
    options = ['-cmb', '-o', output, target]

    if watch is true
        options[0] = '-cmbw'
 
    coffee = spawn 'coffee', options
    coffee.stdout.on 'data', (data) ->
        fileCopy()
        stdout_handler data
 
style = (watch) ->
    console.log 'Watching compass files.'

    options = ['compile']

    if watch is true
        options = ['watch']

    compass = spawn 'compass', options
    compass.stdout.on 'data', (data) -> stdout_handler
    compass.stderr.on 'data', (data) -> stdout_handler

 
task 'build', 'build the project', (watch) ->
    build watch
    fileCopy()
 
task 'watch', 'watch for changes and rebuild', (options) ->
    build true, options.output, options.target
    style true

task 'copy', 'copy coffee file.', ->
    fileCopy()
```
RubyでFizzBuzzのコードゴルフ(58bytes)

以下のページを参考に作成しました。

[東京Ruby会議10で行われたコードゴルフの解答例を紹介します](http://blog.livedoor.jp/sasata299/archives/51872727.html)

```ruby:fizzbuzz_58bytes.rb
1.upto(100){|x|p"#{[:Fizz][x%3]}#{[:Buzz][x%5]}"[/.+/]||x}
```

メモ
* 1..100の要素生成・取り出しは 1.upto(100){} が最短っぽい
* puts を p に変えることで3字節約。ただしエスケープシーケンスを用いるコードが利用できなくなる欠点がある
* [こちらのサイト](http://golf.shinh.org/p.rb?FizzBuzz)によると50bytesが可能らしいが、ここから8bytesどう削るのか皆目検討が付かない
ROOTでroot finding

CERNのROOTライブラリを使ってroot findingします。
ほとんどGSLのラッパみたいだけどね。

ほぼドキュメントの[Root Finder Algorithms](http://root.cern.ch/drupal/content/root-finder-algorithms)と[MultiRootFinderのテスト](http://root.cern.ch/svn/root/trunk/math/mathmore/test/testMultiRootFinder.cxx)の写経ですが少し自分好みに直しています。
かなり簡単だしなかなか使い勝手がよさそうだった。コードが有ればほぼ説明不要かと思われる。

ハマったところは

* RootFinderAlgorithmsはベクトル値関数用のものがなくMultiRootFinderを使う必要があった
* MultiRootFinder::AddFunctionに第二引数を渡してはいけなかった！

とか。

```cpp
#include "stdafx.h"                     //プリコンパル済みヘッダ
#include <Math/Functor.h>
#include <Math/RootFinderAlgorithms.h>  //ROOT::Math::Roots::Newton
#include <Math/MultiRootFinder.h>       //ROOT::Math::MultiRootFinder
#include <TMath.h>
#include <boost/format.hpp>
#include <iomanip>
#pragma comment(lib, "libCore.lib")
#pragma comment(lib, "libMathMore.lib")

int _tmain(int argc, _TCHAR* argv[])
{
	//1変数1式
	const auto myfunc0       = [](const double x){return sin(x);};
	const auto myfunc0_deriv = [](const double x){return cos(x);};
	ROOT::Math::GradFunctor1D f0(myfunc0, myfunc0_deriv);

	ROOT::Math::Roots::Newton rf;
	rf.SetFunction(f0, TMath::Pi() - 1);
	rf.Solve();
	const auto a = rf.Root();
	std::cout
		<< boost::format("円周率はおよそ%1%です") % boost::io::group(std::setprecision(3), a)
		<< std::endl;


	//2変数2式
	const auto myfunc1       = [](const double* xs){return 1. - xs[0];};
	const auto myfunc2       = [](const double* xs){return 10. * (xs[1] - xs[0]*xs[0]);};
	const auto myfunc1_deriv = [](const double* xs, const unsigned int icoord)->const double{
		if(icoord == 0){
			return -1.;
		}else{
			return 0.;
		}
	};
	const auto myfunc2_deriv = [](const double* xs, const unsigned int icoord)->const double{
		if(icoord == 0){
			return 10.* -2. * xs[0];
		}else{
			return 10.;
		}
	};

	ROOT::Math::GradFunctor f1(myfunc1, myfunc1_deriv, 2);
	ROOT::Math::GradFunctor f2(myfunc2, myfunc2_deriv, 2);
	ROOT::Math::MultiRootFinder rf_multi(ROOT::Math::MultiRootFinder::kNewton);
	rf_multi.AddFunction(f1);
	rf_multi.AddFunction(f2);
	const double xs0[2] = {-1, -1};
	rf_multi.SetPrintLevel(1);
	rf_multi.Solve(xs0);


	return 0;
}

```

相変わらずMSVCでしか動かしていない。
とりあえずニュートン法でやった。
Dynatreeのサンプルを動かす

Dynatreeのサンプルを動かすときのメモ

```javascript:sample.js
//仮のクッキーを定義
$.cookie("dynatree-expand",null);
$.cookie("dynatree-select",null);

//以下サンプルのコピー
$(function() {
    // Attach the dynatree widget to an existing <div id="tree"> element
    // and pass the tree options as an argument to the dynatree() function:
    $("#tree").dynatree({
        onActivate : function(node) {
            // A DynaTreeNode object is passed to the activation handler
            // Note: we also get this event, if persistence is on, and the page
            // is reloaded.
            alert("You activated " + node.data.title);
        },
        persist : true,
        children : [ // Pass an array of nodes.
        {
            title : "Item 1"
        }, {
            title : "Folder 2",
            isFolder : true,
            children : [ {
                title : "Sub-item 2.1"
            }, {
                title : "Sub-item 2.2"
            } ]
        }, {
            title : "Item 3"
        } ]
    });
});
```

クッキーを定義しないと怒られるのでnullを入れたクッキーを読み込ませている。
Chatworkの裏技（いつでもその時点に飛べるマーカー機能）

チャットワークを長く使用していると、昔の記事を探したくなる。
でも、基本的に検索（複数回使用すると有料になる）を使わない場合、
記事を時系列に遡らないといけない。

これが結構、地味で大変。
なので、これを楽にする裏技をご紹介します。


ファイルアップロードを使用して、任意の個所にいつでも飛べるマーカーを付ける。
画像は何でも良いです。（容量も一定値を超えると有料になるので小さいのがおすすめ）

具体的なやり方は、チャットワーク画面右側のファイル欄から、「ファイルの追加時点に移動」を使う。

初月とかでファイルでマーキングしておけば、
１ヶ月前も２ヶ月前も瞬時にその時点に飛ぶ事が出来ます。

ちなみに、もっといい方法は、有料プランを使用してください-^^/
grep と SIGPIPE


```sh:sample
#!/bin/sh
    :
if ${command} | grep -q "${word}"
then
    :
```    

この様なシェルスクリプトの ``${commnand}`` がたまに異常終了している事がある。
気になって調べてみると SIGPIPE を受信してエラー終了している様だ。
*grep* (1) のマニュアルを調べてみると

> Exit immediately with zero status if any match is found, even if an error was detected.

と明記してあるので ``${word}`` が見付かった時点で *grep* (1) が先に終了してしまい、``${command}`` に SIGPIPE が送信されているらしい。
スクリプト中で ``grep -q`` は割と多用すると思うが、こんな落とし穴もあるので気をつけなくては。

（というか実は常識的な話だったりするのかな?だったら恥ずかしいな ）
UIWebView+JSP/サーブレットのエラー処理

iOSでハイブリッドアプリで、UIWebView全面に出すようなアプリだと、Webアプリ側のエラーが出て、スタックトレースがでるとまずいことがある。

iOSのネイティブアプリ側で、Webアプリからのレスポンスのステータスコードを見て、400/500番台だったら処理を変えたいが、ネイティブアプリ側でステータスコードをとるのはちょっと大変。

JSP/サーブレットとかであれば、Web.xmlの編集でも対応できる。

```xml:web.xml
  <error-page>
    <error-code>500</error-code>
    <location>/out.jsp</location>
  </error-page>
  ```
 
 `<error-code>`に指定するステータスコードはその他、401/403/404などでも。
` <location>`はhtmlでもJSPでも良い。
 
 
```html:out.jsp
<head>
<meta http-equiv="Refresh" content="0; URL=native://closeWebView">
</head>
```

表示させたページに`<meta>`で、リダイレクトされるように書いておく。

それで、ネイティブアプリ側では、

-UIWebViewを配置しているビューコントローラのクラスにUIWebViewDelegateプロトコルをインプリメント
-クラスをUIWebViewのdelegateに設定
-webView:shouldStartLoadWithRequest:navigationType: を実装

を行なって、shouldStartLoadWithRequest:navigationTypeには、上記のlogout.jspみたいなリダイレクトされたとき、プロトコル部分がnative でホスト部分が closeWebViewだったら画面を終了するように書いておく。
パイプコマンド中の終了ステータス取得

シェルスクリプトでは頻繁に複数のコマンドをパイプで連結して使用するが、posix の機能だけではパイプの途中のコマンドの終了ステータスは通常では参照できない（bashには拡張された機能としてPIPESTATUSが存在するが posix 準拠ではないので除外）。

そこで前回のループ処理同様リダイレクトを利用してパイプの途中のコマンドの終了ステータスを取得する方法を考えてみた。

```sh:sample
exec 3>&1
ret1=`{ { command1; echo $? 1>&3; } | command2; } 3>&1`
ret2=$?
```    

*exec* (1) を利用してあらかじめ FD3 を利用可能にしておき、 ``command1`` の終了ステータスを FD3 に出力している。
``command2`` の実行後に FD3 の出力を FD1(標準出力) に変更しているので、 ``ret1`` は標準出力から ``command1`` の終了ステータスが取得できる。 ``command2`` の終了ステータスはそのまま ``$?`` を参照して ``ret2`` に格納される。 

制限はあるのだがこれで ``command1`` の終了ステータスが取得できる。
railsのDBをmysqlに変更する。


最初に、

```console
$ rails new アプリケーション名 -d mysql
or
$ rails new アプリケーション名 --database=mysql
```

でやれば、出来るのだが、今回は後から変更することを想定しています。

```database.yml
development:
  adapter: mysql2
  encoding: utf8
  database: blog_development
  pool: 5
  username: root
  password:
  socket: /tmp/mysql.sock
```

に設定を変更。
この内容は、 `$ rails new アプリケーション名 -d mysql` でアプリケーションを作成した時の`config/database.yml` を参考に記述しているだけです。

DB設定を更新したので、DB側の準備をしていきます。

```console
bundle exec rake db:create
```

を行うと、以下のエラーが出ました。

```console
(in [DIRECTORY])
rake aborted!
Please install the mysql2 adapter: `gem install activerecord-mysql2-adapter` (mysql2 is not part of the bundle. Add it to Gemfile.)
```

内容は、mysql用のアダプタがないということです。
したがってGemfileを書き換えて、mysqlのアダプタのgemを追加していきます。

```Gemfile
# gem 'sqlite3' <- 必要ないので削除
gem 'mysql2'
```

コンソールに移って、

```console
$ bundle install
```

これで、mysqlのアダプタのgemを加える事ができました。
更に、mysqlにDBの追加と、テーブル作成を行っていきます。

```
$ bundle exec rake db:create
$ bundle exec rake db:migrate
==  CreateTables: migrating ===================================================
-- create_table(:tables)
   -> 0.0186s
==  CreateTables: migrated (0.0187s) ==========================================
```

これで完了です。
Macアプリの.icnsを作るときのメモ

# アイコン画像の準備
.icns変換用に"app_name.iconset"というフォルダを用意し、そこに以下のアイコン画像を入れる。

1. icon_512x512@2x.png (1024px)
2. icon_512x512.png
3. icon_256x256@2x.png (512px, 2と同じ画像サイズ)
4. icon_256x256.png
5. icon_128x128@2x.png (256px, 4と同じ画像サイズ)
6. icon_128x128.png
7. icon_32x32@2x.png (64px)
8. icon_32x32.png
9. icon_16x16@2x.png (32px, 8と同じ画像サイズ)
10. icon_16x16.png

# .iconsetフォルダを.icnsに変換
ターミナルで以下を実行して完了。

```code:Terminal
// .iconsetフォルダのあるファイル断層まで移動
$ cd file_path
// .iconsetを.icnsに変換
$ iconutil -c icns app_name.iconset
```

## GUIでやるなら。。

[Icon Creator](http://mediaware.sk/ware/?page_id=489) ってアプリはRetina対応済み。
ギター入力ができるまで


注) [@7gano](https://twitter.com/7gano)さん著書[『iPhone Core Audio プログラミング』](http://www.amazon.co.jp/iPhone-Core-Audioプログラミング-永野-哲久/dp/4797355158/ref=sr_1_1?ie=UTF8&qid=1362492904&sr=8-1) のパクリ記事です。

Sample Code: [github/GuitarInput](https://github.com/335g/GuitarInput/tree/master/GuitarInput)

-----

上にも書いた通りパクリ記事です。
本の中ではマイクからスピーカーのPlayThroughとして紹介されています。

ギターとiPhoneは[Apogee Jam](http://www.electori.co.jp/apogeepro/jam.htm)を使いました。(iRigでも問題無く動きます)

説明する事がほとんど無いぐらい簡潔に書けてしまう。
ギター入力するためのコードがたった20行程度で書けてしまった。
けっこうすごいねAudioUnit。

``` Objective-C
- (void)prepareAUGraph {
    
    NewAUGraph(&_graph);
    AUGraphOpen(_graph);
    
    AudioComponentDescription cd;
    cd.componentType            = kAudioUnitType_Output;
    cd.componentSubType         = kAudioUnitSubType_RemoteIO;
    cd.componentManufacturer    = kAudioUnitManufacturer_Apple;
    cd.componentFlags           = 0;
    cd.componentFlagsMask       = 0;
    
    AUNode remoteIONode;
    AUGraphAddNode(_graph, &cd, &remoteIONode);
    
    AudioUnit remoteIOUnit;
    AUGraphNodeInfo(_graph, remoteIONode, &cd, &remoteIOUnit);
    
    UInt32 flag = 1;
    AudioUnitSetProperty(remoteIOUnit,
                         kAudioOutputUnitProperty_EnableIO,
                         kAudioUnitScope_Input,
                         1,
                         &flag,
                         sizeof(flag));
    
    AUGraphConnectNodeInput(_graph, remoteIONode, 1, remoteIONode, 0);
    
    AUGraphInitialize(_graph);
    
}
```

AUGraph作って、remoteIO用のAudioUnit作って、繋ぐだけ。
ポイントはremoteIOのenableIOスイッチをオンする所ぐらいでしょうか。

##### 追伸
ギター入力してbluetoothスピーカーへの出力がしたかったのですができませんでした。
カテゴリをAVAudioSessionCategoryPlayAndRecordにするとbluetoothスピーカー読んでくれなくなります。
(パフォーマンスの問題で絞ってるのかも。ただでさえややラグだし)

ちなみにiOS6からカテゴリにAVAudioSessionCategoryMultiRouteができたのですが、
これでもbluetoothスピーカー出力できませんでした。
WWDC2012のセッション見るとHDMI(2ch)とイヤホン(2ch)の表記があるので、
いい音で聞きたかったらiRig+HDMIが良いのかな(できるのかは未確認)
ただそれだとノイズ出そうだし悩ましいw
Google のオープンソース圧縮ライブラリ zopfli を使って Zip アーカイブ最適化するツールを作ってみた。

表題にあるとおり、[zopfli](https://code.google.com/p/zopfli/) を使って既存の Zip アーカイブの圧縮率を最適化するツールを作ってみました。

https://github.com/komiya-atsushi/zipzop

zlib ヘッダも付加されていない生の deflate ストリームを zopfli を出力するには、deflate.c で定義されている ```Deflate()``` 関数を使うといいみたいですね。
https://github.com/komiya-atsushi/zipzop/blob/master/src/recompress.c#L56
bashでランダム数を生成

シェルとかでランダム変数を作成したくて調べたのでメモ書きです。
RANDOM % n とすると0〜n-1の値がランダムで返ります。
下記は、サイコロの擬似乱数のつもりです。

```sh:sample.sh
function getRandomValue() {
　#0〜5までの数を返す
　random=$(( (RANDOM % 6)))
　echo -n "$random"
}
```
ACAccount Twitterのuser_idを取得する


ACAccountからTwitterの`user_id`を取得する方法です。

## 実装
ACAccountのカテゴリにしました。

```objectivec:ACAccount+Extras.h
@interface ACAccount (Extras)

- (NSString*)user_id_String;

@end
```
```objectivec:ACAccount+Extras.m
@implementation ACAccount (Extras)

- (NSString *)user_id_String
{
    NSString *idStr = [self valueForKeyPath:@"properties.user_id"];
	// 今後の仕様変更に備えて確認
    NSAssert1(idStr != nil && [idStr isKindOfClass:[NSString class]] , @"ACAccount(Extras) %@", self);
    return idStr;
}

@end
```

## 補足

Twitterでは特定のユーザーを指定する方法で`user_id`と`screen_name`があります。
`screen_name`はACAccountのusernameで取得出来ます。`screen_name`は[変更](https://support.twitter.com/articles/249172-)することも出来ます。

`user_id`は`screen_name`が変更されても変更されることのないユーザーを識別する一意の値ですので、ユーザー管理は基本`user_id`でした方がよいかと思われます。

## 参考
http://stackoverflow.com/questions/13741438/how-to-get-the-friendslist-of-twitter-user-in-iphone
linuxのc言語で同じファイルかどうかの判定

文字列で比較するのは、いろいろパターンを考えないといけないので結構面倒だと思い、少し考えてみました。linux上では、inode番号は、そのinode が記録されているデバイス上で唯一の整数値なので、同一デバイス上にあり、このinode番号が一致しているということは、同一のファイルということです。この情報は、stat(3)をコールすると取得できるので、statで取得したstruct statを比較するという方法でいけます。
Xamarin.Android で Google Maps Android API v2 を使う


だんだん自力でサンプルプログラム書くのに疲れてきたので、MonoDroid のサンプル集に頼ることにします。

* [xamarin / monodroid-samples](https://github.com/xamarin/monodroid-samples)

すごく豊富なので、これひと通り動かせば大抵のことはできるようになるんじゃないか。。。

というわけで、この中の [MapsAndLocationDemo_v2](https://github.com/xamarin/monodroid-samples/tree/master/MapsAndLocationDemo_v2) を動かしてみます。Readme.md に沿って。

## ソースを取得する
まず monodroid-samples を Clone しときます。

> $git clone git://github.com/xamarin/monodroid-samples.git

## クライアントライブラリをビルドする(Building the Client Library)
ここでいうクライアントライブラリとは、Android SDK に含まれる **Google Play services** の事です。
この準備は本家Android開発で Google Maps Android API v2 を使うときに必要なので、これが何者かは、

* [throw Life - Google Maps Android API v2を使ってみた](http://www.adamrocker.com/blog/334/google-maps-android-api-v2.html)

などを参考に。
SDK で Google Play services が取得できていれば、

``{※あなたのAndroidSDKディレクトリ}/extras/google/google_play_services/libproject/google-play-services_lib`` ができているはず。

※Xamarin.Android で使われる Android SDK は、Xamarin Studio のPreferences → SDK Locations → Android で確認できます。

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


``google-play-services_lib`` へ移動して、Ant 用のビルドファイルを生成します。

> $cd google-play-services_lib
> $Android update project --path .
> $ant debug

Readme.md では ``android project update -p .`` って書いてあるけど上のコマンドじゃないとうまくいかないんですけど？
あと ``{あなたのAndroidSDKディレクトリ}/tools`` にパス通しておかないと android コマンド使えないです。ant も(ry

ant の実行に成功すると /bin の中に classes.jar とかができてるはずです。

次に、Xamarin Studio で ``MapsAndLocationDemo.sln`` を開いて、GooglePlayService プロジェクトを展開します。
すると、`project.properties`` ファイルが赤くなってる(ちゃんと指定した位置に google-play-services_lib をコピってれば赤くなってないかも)ので、これを一度削除して、追加しなおします。リンクファイルとして、ね。

一連の画像貼っときます。

!["red"](https://dl.dropbox.com/u/264530/qiita/xamarin_studio_delete_file.png)
!["red"](https://dl.dropbox.com/u/264530/qiita/xamarin_studio_add_exist_file.png)
!["red"](https://dl.dropbox.com/u/264530/qiita/xamarin_studio_add_a_link.png)


## Google Maps v2 API Key

Google Maps v2 API Key の取得も本家と同じですが、
ディレクトリが、``/Users/[USERNAME]/.local/share/Xamarin/Mono for Android/debug.keystore`` なのでそこだけ注意。(←Mac の場合。Win は Readme.md 見て)

該当のディレクトリへ移動して、以下のコマンドで表示されるキーの内、SHA-1 をコピーします。

>$ keytool -V -list -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android

あとは、

* [throw Life - Google Maps Android API v2を使ってみた](http://www.adamrocker.com/blog/334/google-maps-android-api-v2.html)

を参考に、Google API Console から、API key を取得します。
API Key を取得する際に必要なパッケージ名、取得した API Key を貼り付ける場所は、いずれも MapsAndLocationDemo プロジェクトの AndroidManifest.xml にあるので、先に開いておくとよいでしょう。

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

API Key を取得したら、``com.google.android.maps.v2.API_KEY`` のところに貼り付けて準備完了です。

## A Note About Google Play Services

Google Play Services が端末にインストールされてないと動かんよ、つまりエミュレータでは動かんよ。Google Play Services のインストールの仕方など、私の知ったことではない。だそうです。

## 動かしてみる

「実機で」動かしてみます。

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

動いてます。(上は Show Map with Overlays を動かしたところ)

今回はここまで。コードの深追いは日を改めて。
（11）Capistranoでdeploy #2｜EC2でgit+RonR+unicorn+nginx+capistrano+Jenkins 



##その11｜Capistranoでdeployをstageとproductionで分けてみる。


###１．これまでの目次

1. [EC2＋gitリモートサーバ構築#1](http://qiita.com/items/bed591f7a076cb92ed20)
2. [（２）EC2＋gitリモートサーバ構築#２](http://qiita.com/items/14afe3712ff43a01da69)
3. [（３）EC2にrvm+rubyインストール](http://qiita.com/items/35ab6c6e6750110dc621)
4. [（４）EC2にrailsインストール](http://qiita.com/items/296aa3af986b4bffe7d8)
5. [（５）EC2にrails起動テスト](http://qiita.com/items/978bc6e2a53450be90f1)
6. [（６）EC2にunicorn準備](http://qiita.com/items/7ee7fa53b0066dd274a6)
7. [（７） EC2にnginx準備](http://qiita.com/items/12325db56282a6e3a79d)
8. [（８） EC2にnginx経由のunicorn](http://qiita.com/items/0473b7ad89a3a6d21211)
9. [（９）Capistranoでdeploy#1](http://qiita.com/items/c6c2199e586f0e5db928)


###２．概要
複数の環境にデプロイする事が良くある。今回はstage環境とproduction（本番）環境別に、サーバが分かれていると仮定してdeploy.rbの書き方を纏めてみた。

###３．deploy.rb｜共通設定を記述

```config/deploy.rb
equire 'bundler/capistrano'
require 'capistrano/ext/multistage'

set :application, "アプリケーション名"
set :repository,  "ssh://gituser@xx.xxx.xxx.xxx/home/gituser/repos/hogehoge.git"
set :scm, :git

set :user, "artist"
ssh_options[:port] = "22"
ssh_options[:forward_agent] = true
default_run_options[:pty] = true

#
# ommit upgrade and asset folders
#
set :normalize_asset_timestamps, false

#
# releaseフォルダ内の古いソースコードは過去３つ分までにしよう
#
set :keep_releases, 3

#
# cap deploy:setup 後、/www/shitedama の権限変更
#
namespace :setup do
  task :fix_permissions do
    sudo "chown -R #{user}.#{user} #{deploy_to}"
  end
end
after "deploy:setup", "setup:fix_permissions"

```

###４．環境別のファイルを作成

config/にdeployディレクトリを作成し、その下に環境毎に設定ファイルを作成する。今回は、サーバのIPとdeployディレクトリが違うだけ。

#####１）stage用｜staging.rb

```config/deploy/staging.rb
#set :branch, 'stging'
#set :rails_env, 'staging'


set :deploy_to, "/www/#{application}"

role :web, "54.249.238.224"
role :app, "54.249.238.224"
role :db, '54.249.238.224', :primary => true # rake:db:migrateを実行するサーバ
```

#####２）production用｜production.rb

```config/deploy/production.rb
#set :branch, 'prod'
#set :rails_env, 'production'
set :deploy_to, '/usr/local/shite-dama-prod'

role :web, "54.249.248.8"
role :app, "54.249.248.8"
role :db, '54.249.248.8', :primary => true # rake:db:migrateを実行するサーバ
```

###５．デプロイ実行

各ファイル名を指定してcapを実行する。


```ステージング
cap staging deploy:setup
cap staging deploy
```

```本番
cap production deploy:setup
cap production deploy
```

###６．注意点と重要点

1. deploy.rbの`require 'capistrano/ext/multistage'`が必要です。
2. ローカルから行うので、どちらのサーバからもgitリポジトリへアクセス出来るようにssh公開鍵の設置。そして、デプロイユーザである`artist`ユーザが両サーバに存在し、/home/artist/.ssh/autorized_keysにデプロイする人の公開鍵が設置されている必要があります。
（10）mysql2でハマった｜EC2でgit+RonR+unicorn+nginx+capistrano+Jenkins

 
##その10｜mysql2のインストールでハマる


###１．これまでの目次

1. [EC2＋gitリモートサーバ構築#1](http://qiita.com/items/bed591f7a076cb92ed20)
2. [（２）EC2＋gitリモートサーバ構築#２](http://qiita.com/items/14afe3712ff43a01da69)
3. [（３）EC2にrvm+rubyインストール](http://qiita.com/items/35ab6c6e6750110dc621)
4. [（４）EC2にrailsインストール](http://qiita.com/items/296aa3af986b4bffe7d8)
5. [（５）EC2にrails起動テスト](http://qiita.com/items/978bc6e2a53450be90f1)
6. [（６）EC2にunicorn準備](http://qiita.com/items/7ee7fa53b0066dd274a6)
7. [（７） EC2にnginx準備](http://qiita.com/items/12325db56282a6e3a79d)
8. [（８） EC2にnginx経由のunicorn](http://qiita.com/items/0473b7ad89a3a6d21211)
9. [（９）Capistranoでdeploy#1](http://qiita.com/items/c6c2199e586f0e5db928)


###２．mysql2のインストール
今回のプロジェクトでmysqlを使用する予定で、Gemfileに`gem 'mysql2'`と記述してローカルでは何も問題が無かったのだが、
deployサーバでdeployする途中でmysqlが入っていない！エラーが出てこけた。

```
gem install mysql
```

駄目！

下記のコマンドでmysqlとmysql-develを突っ込んでおく必要があり。

```
sudo yum -y install mysql
sudo yum -y install mysql-devel
```

これで、`gem install mysql`が通ります！
[Blender] Propotional Editing


## Propotional Editing
どこか一部分をいじった場合に、他の箇所の似たような感じで変形してほしい時がある。そんな時にPropotional Editingを使うと、勝手に補完を行なってくれる

##注意
注意というか当然といえば当然だけれど、はまったのでメモ。
Propotional Editingは勝手に切り替わらないので、使い終わったらきちんと切らないと自分が思ったとおりの変形ができなくなる場合がある。他の頂点まで勝手に拡大されたり、移動したりするので気をつける。
AndroidがUSBデバッグで接続できない場合（USBストレージとしてしか認識されない場合）

詳しい記事はこちら
http://blog.collab-it.net/2011/08/androidusbusb.html

Android端末のF-12Cで、USBデバッグ接続しようとして嵌ったのでメモ。
ちなみに環境はwindows7です。

F12-Cで試しましたが、他の端末でも同じように嵌りそうな予感がします。


■症状
本体のUSBデバッグをOnにしてUSBでPCと接続するも、
PC側からUSBストレージとして認識されてしまう。
（Android側では、ドロイド君が表示されて、USBデバッグ接続OK状態になってる）


■解決方法
解決方法は以下の通り。


１．デバイスマネージャーを起動

２．以下のデバイスを削除する
・USB 大容量記憶装置
（他のUSB外部記憶装置が刺さってる場合、注意が必要かも知れません）

３．すると、以下のデバイスも消えると思います。消えてなかったら念のため手動で削除
・Fujitsu Mass storage USB Device

４．端末のUSBケーブルをPCから引っこ抜いて、もう一度差し込みます。

５．デバイスマネージャーの「ほかのデバイス」を見ると、
Fujitsu HSUSB Deviceが認識されていますので、ここからは公式のDriverの手順どおりでOK
http://spf.fmworld.net/oss/usb_driver/f-12c/data/download.html
Play Framework の evolutions で Downs を間違えたら

間違った Downs を書いた時の Evolutions の挙動。run する場合は Mark it resolved とかなんとかで対処できるんだけど、start の場合がよく分からなかったのでログを残しておく。Play Framework のバージョンは 2.1.0。

こんな状況を想定

* 1.sql, 2.sql があって、2.sql の Downs が間違っていたとする。
* 起動するときは dist でできる start を使う

まず、Ups が正常であれば、Downs が間違ってても 2.sql を適用できてしまう。

あっ、間違ってた！と思って 2.sql の Downs を書き換えて、start すると「破壊的な DOWNS ですよ！」というエラーが出る。

```
$ start
(略)
[warn] play - Your production database [default] needs evolutions! 

# !!! WARNING! This script contains DOWNS evolutions that are likely destructives

# --- Rev:2,Downs - (略)
ここに間違った SQL
# --- Rev:2,Ups - (略)
Ups の SQL

[warn] play - Run with -DapplyEvolutions.default=true and -DapplyDownEvolutions.default=true if you want to run them automatically (be careful)
Oops, cannot start the server.
以下スタックトレース
```

これ自体は SQL が間違ってなくても出てくるよくある話。じゃぁ、ということでオプション付きで start してみる。

```
$ start -DapplyEvolutions.default=true -DapplyDownEvolutions.default=true
(略)
[error] play - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '間違ったSQL' at line (ry
Oops, cannot start the server.
以下スタックトレース
```

ここで間違った 2.sql の Downs が実行されて、失敗しましたというエラーが出る。この時点では play_evolutions に新しい 2.sql の内容は反映されていない。

run の場合は、ここで手動でデータベースを書き換えて Mark it resolved を押せばいいんだけど、start ではどうしたものか。

play コマンドを使える場合は [play evolutions:resolve](https://github.com/playframework/play/blob/master/documentation/manual/evolutions.textile) で解決できるみたいですが、play コマンドが使えない状況だとどうしようもなさそう。

evolutions の範囲内でできたらきれいなんだけど、どうにもできそうにないので、自力で対策するしかないのかなぁと思いました。自力での対策は以下の通り。

* 手動でデータベースを書き換える
* play_evolutions テーブルから 2.sql の行を消し去る
* 何事も無かったかのように再度 start する。念のため -Dapply〜 オプションなしで一旦 start して、Ups を確認してから -DapplyEvolutions.default=true だけつけて実行するといい
abに代わる負荷試験ツールを探している…

## 経緯

今までは昔ながらのab(Apache Bench)で負荷試験を実施していたのだけど、昨今のウェブフロントエンド事情の移り変わりで、画像読込やJavaScript実行についても、もはや無視できないレベルになってしまった。

というか、abでの負荷試験では、運用実態との乖離がかなり大きくなってきて、ガラケー準拠やプレーンHTML準拠のabによる負荷試験基準では、実際の負荷を推し量ることができなくなってきた。

そうはいっても、やはり負荷試験はサーバで行いたい。自PC等からブラウザや専用ツールでテスト、なんてのは、「負荷試験」というより「動作試験」だし、どうせ動作試験をするなら、実機でやった方が相応しい…と思う。

## だから、負荷試験ツールを選定するにあたり、以下の条件は絶対に譲れない。

* Windows専用ではなく、Unixサーバで実行可能であること。
* GUIではなく（X Window抜き；いわゆる「ヘッドレス」）、CUI(コマンドライン；CLI)で操作できること。
* 画像読込、JavaScript実行（Ajax等の非同期通信も含む）など、実際のブラウザが行う挙動を再現できること。
* 独立したテストツールであること。
    * アプリに組み込みようなものではなく、アプリ側には一切手を付けず、外形からブラウザアクセスと同等のテストを行うものであること。
    * 同様に、特定のアプリケーションフレームワーク専用のテストツールではなく、汎用的なツールであること。

## あればいいな、という条件は以下のものになる。

* abのように操作が簡単である（ワンライナー一発で試験できる）こと。
    * 複雑なシナリオ（やテストコード）を作ってからでしか実施できないものではなくて、abのようにURL単発での簡易的な試験にも素直に対応できること。
* 贅沢を言えば、「複数ツールの組み合わせ」ではなくて「そのツール単体」で問題解決ができるといい。

## つまり、やりたいことは、以下の内容になる。

* abのように、コマンドに対してURLを引数として渡すと、そこに対して規定数アクセスする。ただし、abと違い、画像読込やJavaScript実行（Ajax等の非同期通信も含む）などの実ブラウザが行う挙動も全て再現してくれる。

## というわけで…

これをドンピシャでかなえてくれるツールはあるのだろうか…。

需要は絶対にありそうなんだけど、複雑なツールしか見つからない。

俺がやりたいのはとりあえずは負荷試験であって、動作試験や機能試験じゃないんだ…。
「実ブラウザをエミュレーションしつつ、特定のページに規定数のアクセスを発生させる」ということがやりたいだけなんだ。

そして、abタイプの単純な試験から、シナリオタイプの複雑な試験へ段階を追ってステップアップできるようなものだとなお良いけれど、どうなんだろう。

## あるいは…

皆さんはどうやって上記のような負荷試験をやられているのだろう…？

あるいは、負荷試験のコンセプトとしてab以上のことを求めるのが根本的に間違ってるいるのだろうか。
MacでAndroid端末が認識されない


FlashBuilderでAIR for Androidを試そうとしたらAndroid端末が認識されなかった。

そもそも
adb devices
してもデバイスがでてこない。

ググってもUSBデバッグモードとかそんなのばっかり

で、まずココに書いてることをやった

Macにgalaxy S2をつなげたのに認識してくれなかった
http://kyabetsutaro.hatenablog.com/entry/2012/04/15/013217

これで再起動したら端末が認識されるようになった。

それでもFlashBuilderは端末を認識しないので、次にコレを試す。

Re: FlashBuilderで認識されないAndroidデバイス
http://www.fxug.net/modules/xhnewbb/viewtopic.php?topic_id=5153

また再起動。

つながりました。
Applicative でデータ変換

フィールドを持つ、似たようなデータ構造を変換しつつ構築するとき、`((->) a)` の Applicative インスタンスを好んで使う。この例の計算には全く意味は無いが。

```haskell
import Control.Applicative

data Point = Point {x :: Int, y :: Int} deriving Show
data Rect = Rect { p1 :: Point, p2 :: Point } deriving Show

main = print $ Rect
  <$> (Point
    <$> (2*) . y
    <*> (3*) . x
    ) . p2
  <*> (Point
    <$> x
    <*> y
    ) . p1
  $ Rect (Point 1 2) (Point 3 4)
```
EclipseとEGitでGithubのリポジトリを扱う

EclipeでGithubのリポジトリを編集できるようにする、主にEclipseの設定方法。

## 事前準備
事前に以下の準備はできていることとする。

- Eclipse　    　  (インストール済み)
- EGit     　 　   　(インストール済み)
- リポジトリ　(Githubに作成済み)
- 公開鍵　　　(Githubに登録済み)

EGitや公開鍵の設定は以下のサイトがとても分かりやすい。

- [eclipse 4.2(Juno)でeclipse×gitな開発環境を構築する](http://moomindani.wordpress.com/2012/09/03/eclipse-4-2juno%E3%81%A7eclipsexgit%E3%81%AA%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B/)
- [初心者Git日記その五～GitHubにSSH公開鍵登録～](http://design1.chu.jp/setucocms-pjt/?p=580)

##Eclipseのsshを公開鍵認証方式にする
1. Eclipseの「環境設定」->「Network Connections」->「ssh2」->「Authentication Methods」を選択する

2.「publickey」にチェックを入れて「password」のチェックを外して「OK」

##EGitにGithubリポジトリの設定をする
1.  Eclipseの「Window」->「Show View」->「Other」->「Git」->「Git Repositories」を選択して「OK」

2. 「Clone a Git repository」を選択する

3. 「URI」にGithubの git://〜 から始まる「Gitリポジトリのアドレス」を入力する

4. 「Protocol」「User」「Password」は以下になるように変更する

 ```
Protocol： ssh
User： 　　 git
Password： 何も入力しない
```

<span>5. 「Next」を押し進め「Finish」を押すと
　　    GithubからリポジトリをCloneし始めるので終わるまで待つ</span>

<span>6. 「Git Repositories」にリポジトリが表示される</span>

## リポジトリを使って作業できるようにする
1. リポジトリの上で右クリックして「Import Projects...」を選択する

2. 「Import existing projects」を選択してプロジェクトを選んで「Next」

3. リポジトリに含まれるプロジェクトが表示されるのでチェックを入れて「Finish」

4. 「Package Explorer」にプロジェクトが表示されることを確認する

これでEclipseでGithubのリポジトリを編集できるようになった。

-------------------

実際に作業をするためには、編集内容をリポジトリに反映させる必要があったり、リポジトリを最新に保つ必要がある。その方法は以下で詳しく説明されているので参考にしましょう。

[最低限おさえておきたいEGitの使い方について](http://d.hatena.ne.jp/ishibashits/20110627/1309193856)
GithubとJenkinsでCI


Jenkins 1.463
Jenkins Github plugin 1.5

## GitlabよりGithubのがやっぱ使いやすい

今までGitlabとJenkinsでCIやってたのですが、
Gitlabはあんまり使われていなかったｗ

一部プロジェクトをGithub Organizationの非公開リポジトリで管理して、今まで通りCIやりましょうというお話。

## Gitlab時代

ForkやPRという概念がなかった。
リポジトリはひとつで、ブランチ間のマージにMerge Requestという機能はあったけれど。

GitlabのWeb hookからJenkinsのURLを指定して、Jenkins Git pluginが受け取りビルドするという流れだった。

## さあ、Github

Organizationに非公開の親リポジトリがあり、そこにメンバーがForkしたリポジトリがぶら下がる形。

OSSの開発と似たような感じだけど、非公開リポジトリなので当然外からは見えない。
（非公開リポジトリをForkしたら、メンバーのGithubアカウントがFreeアカウントでも非公開になるんだね！）

上記の構成で下記を実現する。

* 親リポジトリのmasterにpushしたら、**本番環境**にデプロイされる。
* 親リポジトリの開発ブランチにpushしたら、**ステージング環境**にデプロイされる。
* 個々のリポジトリの開発ブランチにpushしたら、**個々の専用のステージング環境**にデプロイされる。

開発者毎にステージングがあるのがポイント。
開発者毎のステージングで問題がなければ、親リポジトリの開発ブランチへPRを投げる。

それを実現する過程で問題になった点/気になった点をいくつか。

### セキュリティ対策

Githubにして問題になったのは、まず外部のネットワークということでセキュリティを気にしないといけなくなった。

ここでは割愛するけれど、Jenkinsの管理から権限をしっかり設定すべき。

### Github plugin

これドキュメントがなさ過ぎるんだけど、要するに自分のgithubのid/passwordをJenkinsに入力すると自動でやってくれる。

これ楽だけど、気持ち悪い。。。

### JenkinsからGithubへ繋ぐ時の鍵

鍵を作ってDeploy keysに貼っつけてもいいのだけど、そうすると複数リポジトリを持つときに困ったことになる。

今回、Github Organizationの親リポジトリだけでなく、個々のForkしたリポジトリからのデプロイもやるので、複数のリポジトリにJenkinsから繋げないといけない。

それを素直に実現しようとすると、以下のようになるんだけど、

```config
Host production.github.com
  HostName github.com
  User git
  IdentityFile pem_for_production

Host user1.github.com
  HostName github.com
  User git
  IdentityFile pem_for_user1
```

こうすると、当然、Jenkinsの設定でもGitのリポジトリ名を

```
git@production.github.com:hogehoge/hogehoge
```

みたいに書かないといけない。

そうすると、Github pluginがGithubからのHookを違うものと認識してしまって動かない。。。
実装を考えると当然かと思うのだが。

なので、自分のSSH keysにJenkins用の鍵を追加してやらないといけない。。。
気持ち悪い。。。

### デプロイ先からGithubに繋げるように

これは素直に

```
ssh-keygen -t rsa
```

していただいて、公開鍵をリポジトリ毎のDeploy keysに追加していただく。

分かりやすい。

ここらへんまでやると動く。

## 感想

個人のアカウントにJenkins用の鍵を追加するのは気持ち悪すぎるので、他の方法があれば採用したい。
（だって個人のリポジトリもJenkinsからgit cloneできちゃうわけだしね！！）

ただ、仕組みとしては最高に使いやすいです。
windows ファイル名を指定して実行覚書

|コマンド|プログラム|
|:-------|:---------|
|acrord32|Adobe Reader|
|calc|電卓|
|charmap|文字コード表|
|cmd|コマンドプロンプト|
|control|コントロールパネル|
|dxdiag|DirectX診断ツール|
|eudcedit|外字エディタ|
|eventvwr|イベントビューア|
|excel|Excel|
|explorer|Windowsエクスプローラー|
|logoff|ログオフ|
|magnify|拡大鏡|
|mmc|マイクロソフト管理コンソ?ル|
|msaccess|Access|
|msconfig|システム設定ユ?ティリティ|
|mspaint|ペイント|
|mstsc|リモートデスクトップ接続|
|notepad|メモ帳|
|nslookup|NSLOOKUP|
|outlook|Outlook|
|pbrush|ペイント|
|powerpnt|PowerPoint|
|regedit|レジストリエディタ|
|regedt32|レジストリエディタ|
|sndrec32|サウンドレコーダー|
|sndvol32|ボリュームコントロール|
|taskmgr|タスクマネージャー|
|telnet|Telnetクライアント|
|winmsd|システム情報|
|winver|Windowsバージョン情報|
|winword|Word|
|wordpad|ワードパッド|
|write|ワードパット|
|wupdmgr|Microsoftアップデート|
Sequelで定型句を使う

RubyのデータベースツールキットSequelで、何度も同じ検索句を書くのが冗長に思えたので、定型句をメソッドにできないかと思って調べた。以下のように書くとできるようだ。

```rb:
class Sequel::Dataset
	def valid
		self.exclude(deleted: /X.*/)
	end
end
```

このようにvalidメソッドを作っておいて、

```rb:
@db[:members].where(age: (30..40)).valid.all
```

のように使う。deletedカラムがXで始まるメンバーは抽出されない。
これで正しいのかどうかは、ちょっと自信がない。
Windowsでgem installするときproxyが邪魔をする場合の対処法

会社で少しはまったのでメモとして残す。

1. proxyサーバのアドレスとポート番号をまず調べる。
2. コマンドプロンプトを開いて　set http_proxy=http://hogehoge:80
この場合はアドレスが http://hogehoge ポート番号が80
3. 次に gem install haml 等でインストールを行うとちゃんとインストールされる。

たぶんググればすぐ出ると思う。
Xcode で外部エディタを利用する

Xcode で iPhone 向けのプログラムを作成していると、慣れ親しんで身体の一部と化したエディタがどうしても使いたくなる。
そんな時は OSX の基本的な機能を利用するだけで簡単に好きなエディタで編集する事ができる様になるので作業効率が3倍に！

1. Finder.app で関連づけする
*.m*、 *.h* ファイルをファインダで右クリック→情報をみる（もしくはコマンド＋iキーを押す）で表示される画面の中程『▽このアプリケーションで開く：』の選択肢から **MacVim**（もしくは好きなエディタ）を選択肢、『すべてを変更…』ボタンをクリックする。

2. コントロールパネル→キーボード→キーボードショートカットを開いて左側の枠から『アプリケーション』を選択。

3.真ん中あたりの『+』をクリックして『アプリケーション」から **Xcode** を選択、『メニュータイトル』に **Open with External Editor** を指定（この文字列は as is で入力する事）、『キーボードショートカット』に好きなショートカット（コマンド+Eなど）を指定して『追加』ボタンクリック

これで Xcode でソースファイル、ヘッダファイルを選択した状態でショートカットを押す事で **MacVim** （もしくは好きなエディタ）で編集できる様になる。
multiprocessingで並列処理


```
#! /usr/local/bin/python
# -*- coding:utf-8

import multiprocessing

def plus_data(num):
    return num+1

def multi_plus_one(before_list):
    pool = multiprocessing.Pool(processes=4)
    return pool.map(plus_data, before_list)

if __name__ == "__main__":
    before_list = range(10)
    print before_list
    # リストの要素にすべて+1
    print multi_plus_one(before_list)

```

こんな感じ。ただ並列計算したいだけならmultiprocessing.Processかな

```
#! /usr/local/bin/python
# -*- coding:utf-8

import multiprocessing

def plus_data(num, plus_num):
    return num + plus_num

# multi pool用のラッパー
def wrapper_plus_data(args):
    return plus_data(*args)

def multi_plus_one(before_list):
    pool = multiprocessing.Pool(processes=4)
    return pool.map(wrapper_plus_data, before_list)

if __name__ == "__main__":
    before_list = [(i, 2) for i in range(10)]
    # リストの要素にすべて+2
    print multi_plus_one(before_list)

```

複数の引数を渡したいときはこんなかんじにすれば
gitでfooとfoo/barというブランチは同時には作成できない

```bash
$ git co -b foo
$ git co -b foo/bar
error: unable to resolve reference refs/heads/foo/bar: Not a directory
fatal: Failed to lock ref for update: Not a directory
```

ブランチを作ると，そのブランチの指すコミットのsha1を保存するために`refs/heads/BRANCH_NAME`というファイルを作る．このときブランチ名に`/`が入っているとディレクトリを作成してからファイルを作る．
そのため`git co -b foo/bar`時に`foo`ディレクトリを作ろうとするが，既にファイルが存在するためエラーとなる．
回転するシェーダー

回転するシェーダーです。

http://glsl.heroku.com/e#7170.1

更新しました
http://glsl.heroku.com/e#7170.2

```

#ifdef GL_ES
precision highp float;
#endif


uniform sampler2D backbuffer;

uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;


void main( void ) {
     	float pixelwide = 1.0 / resolution.x;
     	float pixelhigh = 1.0 / resolution.y;
	
     	vec2 position = gl_FragCoord.xy / resolution.xy;

    	 vec2 v = position - mouse;
	
	float w = (position.x - mouse.x) * (resolution.x / resolution.y);
	float h = position.y - mouse.y;
	float dist = sqrt(w * w + h * h);

	float radius = 0.1;
	vec4 maxColor = vec4(sin(time * 3.0) + 0.25 + 0.75, cos(time * 3.0) * 0.25 + 0.75, sin(time * 1.0) * 0.5 + 0.5, 1.0);
	vec4 minColor = vec4(0.0, 0.0, 0.0, 0.0);
	float x = dist * (1.0 / radius);
	
	//color from mouse
        vec4 newColor = smoothstep(maxColor, minColor, vec4(x, x, x, 1.0));
	
	//rotate
	vec2 moved = position - vec2(0.5, 0.5);
	moved *= 1.01; /*いじると面白い*/
	float theta = 0.1; /*いじると面白い*/
	moved *= vec2(resolution.x / resolution.y, 1.0); /*幅補正*/
	vec2 rotated = vec2(moved.x * cos(theta) - moved.y * sin(theta), 
			    	        moved.x * sin(theta) + moved.y * cos(theta));
	rotated /= vec2(resolution.x / resolution.y, 1.0); /*幅補正*/
	vec2 result = rotated + vec2(0.5, 0.5);
	gl_FragColor = max(texture2D(backbuffer, result), newColor) * 0.999;
	

     	if(abs(position.y - 1.0) < 0.01)
          	gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);

     //gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
}      

```

参照するピクセル座標を回転しています。
シェルにおけるコマンド出力とループ処理の問題

シェルスクリプトでコマンドの出力をループ処理する場合、コマンドとループをパイプ "|" で連結して処理をするのが一般的だけど、シェルの仕様によりパイプ "|" を使うとコマンドとループが別のプロセスになってしまうため、ループの内側でセットしたシェル変数をループの外側で参照できない等の問題がある。
（たまに『シェルによってはループが別プロセスになる』といった解説も見られるがそれは間違い）。

```sh:sample
#!/bin/sh
# コマンドの出力をパイプでループに連結

command="/path/to/command"
count=0

${command} |
while read line
do
    :
	# 変数 count をインクリメント
    count=`expr ${count} + 1`
done

# count の値は 0
echo ${count}

```

パイプを使うと別プロセスになるならパイプを使わないでコマンドの出力をループに流し込めば良いじゃ無いか、
という事で、ヒアドキュメントとシェルビルトインの exec (1) を利用してコマンドの出力を while ループの標準入力にしてしまうのが一番汎用的で柔軟性のある対応だと思うのでその方式。

勿論一時ファイルを作成しても良いのだが、ヒアドキュメントを利用する事で一時ファイルが不要になる分だけ処理的に美しいかなと思う(完全に好みの問題)。

```sh:sample
#!/bin/sh
# コマンドの出力をバッククォートしてヒアドキュメントとして使用する

command="/path/to/command"
count=0

# exec 3<&0: 標準入力 (FD0) を FD3 に複製
# exec 0<<EOF: ヒアドキュメントを標準入力として使用
exec 3<&0  0<<EOF
`${command}`
EOF

while read line
do
    :
	# 変数 count をインクリメント
    count=`expr ${count} + 1`
done

# exec 0<&3: FD3 に複製した標準入力 (FD0) を復帰
# exec 3<&-: FD3 をクローズ</i>
exec 0<&3 3<-

# count の値はインクリメントされている
echo ${count}

```
IPアドレスとネットワークアドレス

ネットマスクとはその名の通り IPv4 アドレスのうち、どこまでのビットがネットワークアドレスなのかを示している値なので、IPv4 アドレスとネットマスクの論理和はネットワークアドレスとなる。
従って、取得した論理和とネットワークアドレスが等しい場合は IPv4 アドレスはネットワークに属す事になる。

C で実装する場合はこんな感じ。

```c:sample.c
/*
 * network: ネットワークアドレス
 * netmask: ネットマスク
 * ipaddr:  IPアドレス
 */ 
int     checkAddr(const char *network, const char *netmask, const char *ipaddr)
{

    struct  in_addr net,
                    mask,
                    addr;

    if(inet_aton(network, &net) &&
            inet_aton(netmask, &mask) &&
            inet_aton(ipaddr, &addr))
        return((addr.s_addr & mask.s_addr) == (net.s_addr & mask.s_addr));
    else
        return(0);

}
```
ステータスメニューの表示


```objectivec:AppDelegate.c
#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;

@end
```

```objectivec:AppDelegate.m
#import "AppDelegate.h"

@interface AppDelegate () // クラスエクステンション？

@property (weak) IBOutlet NSMenu *statusMenu;

@end

@implementation AppDelegate{
    NSStatusItem* _statusItem;  // ステータスバーに表示されるアイテム
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [self setupStatusItem];  // setupStatusItemメソッドの実行
}

- (void)setupStatusItem
{
    NSStatusBar *systemStatusBar = [NSStatusBar systemStatusBar];  // ステータスバー
    _statusItem = [systemStatusBar statusItemWithLength:NSVariableStatusItemLength];
    [_statusItem setHighlightMode:YES];  // ステータスバーに表示されるメニュー
    [_statusItem setTitle:@"StatusBarApp"];  // ステータスバーに表示されるメニューのタイトル
    [_statusItem setImage:[NSImage imageNamed:@"StatusBarIconTemplate"]];  // ステータスバーに表示されるメニューのアイコン画像
    [_statusItem setMenu:[self statusMenu]];  // メニューをセットする
}

@end
リスト構造


```c:list.c
#include <stdio.h>
#include <stdlib.h>

struct node{
	char data;
	struct node* next;
};

/* リストの検索 */
int listSearch( struct node* head, char str ){
	int count = 0;
	struct node* p;
	p = head;
	while (p != NULL) {
		count ++;
		if( p->data == str ){
			return count; /* xが存在する */
		}
		p = p->next;
	}
	return -1; /* xが存在しない */
}

/* リストの表示 */
void listUp( struct node* head ){
	struct node* p;
	p = head;
	while (p != NULL) {
		printf("%s\n",p->data);
		p = p->next;
	}
	printf("\n");
}

void enqueue(struct node** hp){
	struct node* p;
	p = *hp;
	*hp = p->next;
	free(p);
}

void dequeue(struct node** hp, char str[]){
	struct node* p;
    /* リストが空の場合 */
    if ( *hp == NULL ){
        p = *hp = malloc( sizeof(struct node) );
    }
    /* リストが空でない場合 */
    else{
        p = *hp;
        /* リストの末尾までたどる */
        while ( p->next != NULL ) {
            p = p->next;
        }
        p->next = malloc( sizeof(struct node) );
        p = p->next;
    }
    p->data = *str;
    p->next = NULL;
}

int main(int argc, char *argv[]) {
	struct node *head;
    char* str="aaaa";
	dequeue(&head,str);
	listUp( head );
	return 0;
}
```
適当なプログラム

```c:printMaxInt.c
void printMaxInt (int a[], int n) {
    int max = 0, i;
    for (i = 0; i < n; i++) {
        if (max < a[i]) {
            max = a[i];
        }
    }
    printf("%d\n", max);
}
```

```c:printArray.c
void printArray (int a[], int n){
    int i;
    for (i=0 ; i<n; i++) {
        printf("x[%d] = %d \n",i,a[i]);
    }
}
```

```c:findInt.c
int findInt (int a[], int n, int x){
    int i;
    for (i=0; i < n; i++) {
        if (a[i] == x) {
            return 1;
        } else {
            return 0;
        }
    }
    return -1;
}
```

```c:func.h
#include <stdio.h>

void printMaxInt (int a[], int n);
void printArray (int a[], int n);
int findInt (int a[], int n, int x);
```
PHP フォームに入力された値の取得


フォームに入力された値のPHPによる取得方法について解説します。
##フォームの作成
formタグのmethod属性に"post"を指定し、action属性に送信先のPHPファイルのURLを指定します。

```html:form.html
<form action="action.php" method="post">
  <label for="text1">テキスト: </label>
  <input type="text" name="text1">
  <input type="submit" name="send" value="送信">
</form>
```

##フォームの取得
`$_POST['text1']`でname属性に"text1"を指定したinput要素の値を取得できます。

```php:action.php
<?php
	echo($_POST['text1']);
?>
```
Qiita からメールが届かない

そういえば Qiita からって notification 的なメール来ないなぁ
( 個人的にはできるかぎり来て欲しくないので良いのだけど )

そう思っていて今日 gmail の迷惑メールフォルダーを見たら、Qiita からのメールが迷惑メールに判定されてました、便利〜…

- http://gyazo.com/468502042f4290d2aa4175de2df916ae

文面変えた方が良いかもね。
モジュールを使ったアプリを実機転送する際にリンクエラーが発生する場合の対処

モジュールを作成して、デモアプリ等で利用する際に実機転送時に

    [ERROR] : ** BUILD FAILED **
    [ERROR] : The following build commands failed:
    [ERROR] :   Ld build/Debug-iphoneos/gpuimagedemo.app/gpuimagedemo normal armv7
    [ERROR] : (1 failure)

のようなエラーが発生する場合がある。
これは、Titanium がビルド時に最適化で利用していない内部モジュールとのリンクを切ってしまうために起こる。

build ディレクトリの下の Xcode のプロジェクトを開くと

    Undefined symbols for architecture arvm7:
        ...
    "_OBJC_CLASS_$_TiUIImageView", referenced from:
        ...

のようにビルドエラーが発生している。


これを解決するには、モジュールで利用している内部クラスを、JavaScript 側のソースコードに現れるようにする。

例えば、今回の場合だと、TiUIImageView の参照先が見つからないとなっているので JavaScript のコードの方に

```javascript:
if (false) {
    Ti.UI.createImageView({
        image: 'demo.jpg'
    });
}
```

のようなコードを加えれば良い。
tapを使ってメソッドチェインの途中の値をログ出力する

サンプルには何の意味もないけど。

```ruby
"Test".upcase.reverse.next.swapcase
# => "tseu"
```

```ruby
"Test".upcase.tap{|s| p s }.reverse.tap{|s| p s }.next.tap{|s| p s }.swapcase
"TEST"
"TSET"
"TSEU"
# => "tseu"
```

Railsならloggerに渡して以下のようにもできる。

```ruby
"Test".upcase.tap{|s| Rails.logger.debug s }.reverse.next.swapcase
# => "tseu"
```

```log/development.log
TEST
```
UIView  convertPoint:toView:の回転を独自に計算する


UIViewクラスには2つのビュー間のCGPointやCGRectを取得メソッドが用意されています。

	- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;
	- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;
	- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;
	- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;

**使用例**

	CGPoint point = [viewA convertPoint:CGPointZero toView:viewB];

上記を簡単に説明すると、pointの値はviewAの原点(CGPointZero)の位置が、viewBの原点から見てどの位置になるかです。
***※ ここでの原点は `bounds.origin.x == 0, bounds.origin.y == 0` を指しています***

***

convert系の4つのメソッドはとても優秀で、

- 異なるsubviews間
- スクロールビューのcontentOffset
- 回転

も全て考慮されて正確に取得することが出来ます。

しかし、通常は考慮されるはずの回転が**考慮されない場合があります。**
それは対象のビューの回転処理が管理されていない(回転処理が行われていない)場合です。
例えば、

- [ビュー階層から外れているビュー](http://hmdt.jp/blog/?p=633)
- keyWindow

などがそうです。
[ビューの回転はboundsとtransformで実現しています](http://hmdt.jp/blog/?p=123)ので、そういった管理されていないビューは `@property(nonatomic) CGAffineTransform transform` の値が回転に合わせて変更されていないことから確認出来ます。
そして、おそらくconvert系のメソッドは `transform` の値を考慮して回転の計算が行なわれているため、回転処理が行われていないビューに対しては正常に取得出来ないと考えられます。

今回は、そういった回転処理が管理されていないビューに対して正しい値を取得したかったので実装してみました。

## 実装

windowの原点から見たviewAの原点の位置を求めます。
単純に回転に合わせて計算します。

```objectivec:Sample.m
CGPoint origin = [self.viewA convertPoint:CGPointZero toView:self.view.window];
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
switch (orientation) {
    case UIInterfaceOrientationPortrait:
        break;
    case UIInterfaceOrientationPortraitUpsideDown:
        origin.x -= self.viewA.bounds.size.width;
        origin.y -= self.viewA.bounds.size.height;
        break;
    case UIInterfaceOrientationLandscapeLeft:
        origin.y -= self.viewA.bounds.size.height;
        break;
    case UIInterfaceOrientationLandscapeRight:
        origin.x -= self.viewA.bounds.size.width;
        break;
    default:
        break;
}
```

***※ `- addSubview:`元のビューによってはステータスバーの高さも計算に入れる必要がある場合があります。***

***

限定的なケースですが、参考になれば幸いです。
*※ こんな計算しなくても取得出来るメソッドがあるかなと思って探してみたのですが、見つかりませんでした。*
WordPressからTumblrへexport


いろいろ探しまわって試してみるも動かず、最終的に見つけたのがこれ。
[vijedi/tumblr_import · GitHub](https://github.com/vijedi/tumblr_import)


1. [ここ](http://www.tumblr.com/oauth/apps)からアプリの登録
2. Default callback URLを`http://localhost:4567/oauth_callback`に、あとは適当で。
3. `OAuth consumer key`と`OAuth consumer secret`を控える
4. `git clone`して以下実行。

```
$ git clone git@github.com:vijedi/tumblr_import.git
$ cd tumblr_import
$ bundle install
$ ruby main.rb
```

5. **インポートしたいTumblrアカウントでログイン**したうえで、[http://localhost:4567/start](http://localhost:4567/start)にアクセス
6. `Allow `して、待つ。
7. `Import Complete` と表示されれば完了。

これだけでした。

注意としては、
- とりえあず全部Text投稿になる
- ひょっとしたら、複数ブログを持っていた場合で、どのブログにインポートするかを選べないかも、、、
- 使えないHTMLタグがあった場合は無視される
- imgのURLなどはインポート前のURLのまま（WordPressの!）
ってところでしょうか。

画像の扱いがやっかいですね、、、

---

ちなみに試してないけど、こんなのもあるみたい。これはWordPressからBloggerにインポートしてそこからTumblrにインポートするらしい。
[How to migrate your wordpress to tumblr. Including images and comments. - Random Howtos](http://howto.pui.ch/post/37850192094/how-to-migrate-your-wordpress-to-tumblr-including)