OmniAICreator/Qiita-1.07M huggingface dataset:
iOSアプリのアップデート通知メソッド

AppStoreから最新バージョンを検索してユーザーに通知するメソッドを作ってみました。
ユーザーに使ってもらうアプリを常に最新版にして欲しい場合などに、使えるかと思います。

```objc:UpdateChecker.h
#import <Foundation/Foundation.h>

@interface UpdateChecker : NSObject

+ (void)checkApplicationNewVersionWithAppStoreId:(NSString *)storeId foundBlock:(void (^)(NSURL *url, NSString *version))block;

@end
```

```objc:UpdateChecker.m
#import "UpdateChecker.h"

#define kAppStoreAPIURL @"http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/wa/wsLookup?id=%@&country=jp"
#define kAppStoreLink @"https://itunes.apple.com/app/id%@"

@implementation UpdateChecker

+ (void)checkApplicationNewVersionWithAppStoreId:(NSString *)storeId foundBlock:(void (^)(NSURL *, NSString *))block
{
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:kAppStoreAPIURL, storeId]];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [NSURLConnection sendAsynchronousRequest:request
                                       queue:queue
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
                               if ([data length] > 0 && !connectionError) {
                                   dispatch_async(dispatch_get_main_queue(), ^{
                                       NSDictionary *appData = [NSJSONSerialization JSONObjectWithData:data
                                                                                               options:NSJSONReadingAllowFragments
                                                                                                 error:nil];
                                       NSArray *versionsInAppStore = [appData valueForKeyPath:@"results.version"];
                                       if ([versionsInAppStore count]) {
                                           NSString *appStoreVersion = versionsInAppStore[0];
                                           NSString *currentVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
                                           if ([currentVersion compare:appStoreVersion options:NSNumericSearch] == NSOrderedAscending) {
                                               //最新バージョンが見つかった
                                               if (block) {
                                                   NSURL *storeURL = [NSURL URLWithString:[NSString stringWithFormat:kAppStoreLink, storeId]];
                                                   block(storeURL, appStoreVersion);
                                               }
                                           } else {
                                               //最新バージョンが見つからなかった
                                               return;
                                           }
                                       }
                                   });
                               }
                           }];
}

@end
```
Cocos Code IDEで新規プロジェクトが実行できないときの対処

テンプレートから作ったプロジェクトをそのまま実行しようとするとこんなエラーが出て実行できない場合があります。
![popup.png](https://qiita-image-store.s3.amazonaws.com/0/2490/ab68ff41-2777-2381-75e1-aaed6854b74e.png)

```
Problem Occurred
'Launching CocosLuaGame' has encountered a problem.
Error occured while notifying runtime to start logic
```

Cocos Code IDEはプロジェクトディレクトリのruntime/mac/PrebuiltRuntimeLua.appを起動してそこにluaのソースを転送してデバッグします。新規プロジェクトを作った際にコピーしてきたPrebuiltRuntimeLua.appが壊れている場合このエラーが出るため、ビルドし直すことで解決できます。

プロジェクトを右クリック => Cocos Tools => Build Runtime...を選びます。
![ss02.png](https://qiita-image-store.s3.amazonaws.com/0/2490/5d655009-0687-34d9-4b13-f64138965b98.png)

デバッグしたい環境をチェックして進むとビルドが始まります。
![ss.png](https://qiita-image-store.s3.amazonaws.com/0/2490/09ca8715-83f1-c226-ff77-4625cb77ab43.png)

完了するとプロジェクトディレクトリのruntime/mac/CocosLuaGame.appにappが出力されているので、このappを実行するようにします。Debug Configurations... => Select Runtime => Runtime pathにビルドしたappを指定します。
![スクリーンショット 2014-05-09 14.31.09.png](https://qiita-image-store.s3.amazonaws.com/0/2490/3a3e0057-9d52-dd68-34ea-c5ad56eccd0d.png)
![ss03.png](https://qiita-image-store.s3.amazonaws.com/0/2490/684484cb-1d38-26bb-b2cb-a8121648119b.png)

あとは⌘F11でデバッグできるようになります。
Symfony2.3でcallbackValidatorが使えなくなったのでFormEventで書き換える

***BEFORE***
public function buildForm(FormBuilder $builder, array $options)
  {
    $builder
      ->add('name')
      ->add('email', 'repeated', array(
        'type' => 'email',
        'invalid_message' => '同じ値を入力してください',
      ))
      ->add('rawPassword', 'password', array(
        'always_empty' => false,
      ))
      ->add('tel')
      ->add('birthday', 'birthday')
      ->add('agreement', 'checkbox', array(
        'property_path' => false,
        'required'      => true,
      ))
      ;
      $builder->addValidator(new CallbackValidator(function($form) {
      if (!$form['agreement']->getData()) {
        $form['agreement']->addError(new FormError('利用規約に同意してください'));
      }
    }));
}

***AFTER***

use Symfony\Component\Form\FormEvents;

  public function buildForm(FormBuilderInterface $builder, array $options)
  {
    $builder
    ->add('name')
    ->add('email','repeated',array(
      'type' => 'email',
      'invalid_message' => '同じ値を入力してください',
    ))
    ->add('rawPassword','password',array(
      'always_empty' => false,
    ))
    ->add('tel')
    ->add('birthday','birthday')
    ->add('agreement','checkbox',array(
      'property_path' => false,
      'required'      => true,
    ))
    ;
    $builder->addEventListener(FormEvents::POST_BIND,function($event){
      $form = $event->getForm();
      if(!$form->has('agreement')){
        $form->addError(new FormError('利用規約に同意してください'));
      }
    });
  }
MySQLWorkbench を Vagrant + VirtualBox 上の MySQL と繋ぐ方法

Vagrant + VirtualBox を使って Macbook Air に VM を立てて、CentOS 上に Rails4 の開発を行っています。

DB には MySQL を使っているのですが、なんともわかりづらい。
ノートで設計して、頭で設計してコマンド叩いて...の手法に限界を感じました。

できればER図かけるし、DBとも繋がっているし、な環境にならないかなぁって思っていたら、MySQL Workbenchと出会いました。（1年位前にorz）

VagrantとMySQLWorkbenchを繋ぐ方法をメモります。

# MySQL Workbenchのインストール

こちらからどうぞ => http://dev.mysql.com/downloads/tools/workbench/

**面倒くさくて有名なORACLEの認証が必要になりますorz**

ナビゲーション通りにすすめば問題なくインストール出来るはずです。

# MySQL Workbench

![Screen Shot 2014-05-09 at 13.54.35.png](https://qiita-image-store.s3.amazonaws.com/0/18705/cb426a04-f98b-f0ad-c151-d4c97e58e1da.png)

1. 上のバーのDatabase > Connect Database を押下。
もしくは、MySQL Connections 画面の + を押下(こちらからやると接続する際の設定が保存されるので、次回から便利かも)

2. Connection Method に Standard TCP/IP over SSH を指定。

3. Parametersタブを開き、以下を指定。

|項目|設定内容|
|:----|:----|
|SSH Hostname|127.0.0.1:2222|
|SSH Username|通常はvagrant, それぞれの環境に合わせてユーザー名を指定|
|SSH Password|そのまま|
|SSH Key File|鍵認証を利用しいている場合は指定|
|MySQL Hostname|localhost|
|MySQL Server Port|3306|
|Username|MySQLにログインするときのユーザー名, rootとか|
|Password|そのまま|
|DefaultSchema|そのまま|

これでOKを押下すると、接続出来ました。
私の場合はMySQLのログインにパスワードを設定してたので、パスワード入力画面が出力されました。
![Screen Shot 2014-05-09 at 14.07.10.png](https://qiita-image-store.s3.amazonaws.com/0/18705/b6a3f7dc-4efa-a3ad-09ce-bebfddb65528.png)

無事に接続できると以下の様な画面になります。

![Screen Shot 2014-05-09 at 14.10.26.png](https://qiita-image-store.s3.amazonaws.com/0/18705/b631a964-ef4c-e0eb-5dc4-b93776b5406f.png)

ref) http://www.vmichnowicz.com/blog/entry/get_mysql_workbench_to_connect_to_mysql_running_with_vagrant

# ちなみに

## vagrantへのsshに関して

vagrantの設定に関してはvagrantを立ち上げる時、vagrant up の歳などに表示されます。

```pl:example
・
・
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: （＾－＾）
    default: SSH auth method: (´・ω・`)
    default: Warning: Connection timeout. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
==> default: Machine booted and ready!
```

vagrant ssh でいつも入っていましたが、以下でのsshログイン出来ました。

```
$ ssh {username}@127.0.0.1 -p 2222
```

## mysqlの設定に関して

/etc/my.cnf に設定があります。追記もできます。

ref) http://open-groove.net/mysql/mycnf-config-example2/
AIXでTest::Simpleがインストールできなかったときの対応

AIX 7.1でTest::Simpleをインストールしたときにエラーになってしまったのでこれを解決した。

`export LANG=C`
としてあげないと、t/fail-more.tのテストがこけてしまう模様。
下記が、失敗するテスト
`.. 1/80 #   Failed test at t/fail-more.t line 426.`
Chromeコンソールでお手軽クローリング


[PhantomJS](http://phantomjs.org/)はすごく便利なのですが、ちょろっと使いたいだけのときにスクリプトファイルを用意するのは若干面倒です。対話モード([REPL](http://phantomjs.org/repl.html))も用意されていますが、対話的に使うだけならChromeの方が使いやすい場面が多いです。

今回の想定シーンは、「GitHubでStarしてくれた人の一覧が欲しい」というようなケース。時々、Issueで全員に連絡したいことがありますよね。↓ こういうやつ。

> @user1, @user2, @user3, ...

GitHubだと[JSONを返すAPIが用意されている](https://api.github.com/repos/cognitom/symbols/stargazers)ので、それを使います。

## コンソールを開く

新規タブを開いて、`about:blank`に移動します。まっさらな状態にするのがポイントです。

![about-blank.png](https://qiita-image-store.s3.amazonaws.com/0/1858/6bd59a9e-86e8-4d40-8662-8ce47ec0e075.png "about-blank.png")

## jQueryを仕込む

PhantomJSを使う場合もそうですが、素のJavaScriptだと面倒が多いので、jQueryを仕込みます。次の2行を実行すればOK。

```javascript
> (script = document.createElement('script')).src = 'http://code.jquery.com/jquery-latest.min.js'
> document.getElementsByTagName('head')[0].appendChild(script)
```

![about-blank.png](https://qiita-image-store.s3.amazonaws.com/0/1858/1dfaa1d2-db34-5154-436b-4382a9dae352.png "about-blank.png")


## APIからデータを取得

キーが必要なAPIの場合は一工夫要りますが、公開のものであれば次の3行でOK。JSONデータが入ります。

```javascript
> result = {}
> url = 'https://api.github.com/repos/cognitom/symbols/stargazers'
> $.getJSON(url, function(data){ result = data })
```

## データを加工

まずは取得できたかの確認。

```javascript
> result
```

配列かオブジェクトが表示されればOK。続けて、必要な文字列に整形します。正規表現を使うまでもなかった!

```javascript
> result.map(function(x){ return '@' + x.login }).join(', ')
```

無事、冒頭のような `@user1, @user2, @user3,...`という文字列を得られました。実行結果のスクリーンショットは、こんな感じになります。

![about-blank.png](https://qiita-image-store.s3.amazonaws.com/0/1858/04e19b9a-e284-7905-e1fd-f3d9ecd7c2b4.png "about-blank.png")

## 最後に

上記の事例は、APIが用意されているので「クローリング」というほどのものでもないですが、HTMLページから取得する場合もコンソールが使えます。"about:blank"に行く代わりに対象ページを開いて、jQueryが導入済みならそれを、なければこのページの説明と同様に追加して、あとはDOMを参照してデータを取得すればOK。コンソールからはワンライナーの方が使いやすいので、map関数が活躍しますね。
Gmailをビジネスで使うのが不安だという人を説得する材料

Gmailをビジネスに使うと「停止が不安」「やはり自前」といった意見を聞くことがあるので公開情報を探してみました。
おそらく金融機関など特殊なコンプライアンスを満たす必要がある場合以外はGoogle AppsのGmailを使ったほうが低コストで質の高いサービスが得られるでしょう。

# 2013年の稼働率は99.978%

[Gmail、2013年の可用性は稼働率99.978％、年間ダウンタイム2時間以内だったとGoogleが明らかに － Publickey](http://www.publickey1.jp/blog/14/gmail2013999782google.html)

# エンタープライズ版にはSLAもあります

99.9%の稼働率を割り込んだ場合は返金の対象になるようです。

<table border="1" class="c1" width="500px">
              <tbody><tr>
                <td width="200px">
                  <strong>各月の稼働率</strong>
                </td>
                <td width="300px">
                  <strong>本サービス期間終了後に無償で追加されるサービスの日数（または、毎月後払いでご請求するお客様に対する、サービスの日数分に相当する金銭）</strong>
                </td>
              </tr>
              <tr>
                <td>
                  99.0% 以上 99.9% 未満
                </td>
                <td>
                  3
                </td>
              </tr>
              <tr>
                <td>
                  95.0% 以上 99.0% 未満
                </td>
                <td>
                  7
                </td>
              </tr>
              <tr>
                <td>
                  95.0% 未満
                </td>
                <td>
                  15
                </td>
              </tr>
            </tbody></table>


[Google Apps 利用規約 – Google Apps](http://www.google.com/apps/intl/ja/terms/sla.html)



# 採用事例には多くの企業

さまざまな規模の企業や団体が利用しています。公表していないだけで利用しているところもあるでしょう。

[お客様の声 – Google Apps for Business](http://www.google.co.jp/intx/ja/enterprise/apps/business/customers.html)

- キユーピー株式会社
- 株式会社マイナビ
- 株式会社クボタ
- 全日本空輸株式会社
- ミサワホーム株式会社
- ソフトバンクテレコム株式会社
- カシオ計算機株式会社
- 戸田建設株式会社
- 三井倉庫株式会社
- 株式会社ノーリツ
- 株式会社アデランス（旧株式会社ユニヘアー）
- 株式会社ジェイティービー
- 生活協同組合コープさっぽろ


# 年間1ユーザあたり6000円でその他のGoogleツールも付いてくる

![料金情報_-_Google_Apps_for_Business.png](https://qiita-image-store.s3.amazonaws.com/0/10032/bb9ebf4a-2b5c-8bdd-6082-424eb21fb8cd.png)

Gmail以外のさまざまなアプリケーションが利用可能です。
ファイル共有やビデオ会議、カレンダーなどが使えます。もちろんモバイルにも対応し二段階認証などのセキュリティを担保する機能も備えています。
あなたが自前で運用するメールサーバーには2段階認証をすぐに実装可能でしょうか。

[料金情報 - Google Apps for Business](https://www.google.com/intx/ja/enterprise/apps/business/pricing.html?utm_campaign=apps-help-center&utm_medium=et&utm_source=apps-help-center&utm_content=ja)
Bitnami Redmineでプラグインのアンインストール

Bitnamiで構築したRedmineから、プラグインをアンインストールするためにやったこと。

##環境
MacOS 10.9.2
Bitnami Redmine 2.5.1-1 (64-bit) 
/Applications/redmine-2.5.1-1/ にインストール（デフォルト設定）


##状況
/Applications/redmine-2.5.1-1/apps/redmine/htdocs/ で
rake redmine:plugins:migrate を実行しようとすると、以下のエラーが出る。

```
rake aborted!
cannot load such file -- bundler/setup
```
bundlerがインストールされていないのが原因らしい。

##アンインストールまでの手順
###1. bundlerを入れる

```
sudo gem update
sudo gem install bundler
```

　 bundle install を実行。以下のエラーが出る。
```
An error occurred while installing rmagick (2.13.2), and Bundler cannot
continue.
Make sure that `gem install rmagick -v '2.13.2'` succeeds before bundling.
```

#### RMagickを入れる

```
brew install imagemagick
```

　`sudo gem install rmagick` を実行したら、
　`pkg-config: command not found` と怒られたので、

```
brew install pkg-config
sudo gem install rmagick
```

####今度こそbundle install

```
bundle install --without development test
```

```
Installing rmagick 2.13.2
Your bundle is complete!
Gems in the groups development and test were not installed.
It was installed into ./vendor/bundle
```
成功！

###2. rake redmine:plugins:migrateを実行
再度rake redmine:plugins:migrate を実行しようとすると、以下のエラーが出る。
```
rake aborted!
You have already activated rake 0.9.6, but your Gemfile requires rake 10.1.1. Prepending `bundle exec` to your command may solve this.
```
activateしてるRakeのバージョンと、Gemfile.lockで固定しているバージョンが違っているのが原因らしい。
Gemfileで指定されたgem環境で実行できるように、bundle execをつけてやる。

```
bundle exec rake redmine:plugins:migrate NAME=プラグイン名 VERSION=0 RAILS_ENV=production
```
※ db:migrate_plugins は2.X系から非推奨になった模様。
http://www.redmine.org/projects/redmine/wiki/Plugins

###3. プラグインを削除
/Applications/redmine-2.5.1-1/apps/redmine/htdocs/plugins/ 以下にあるプラグインをフォルダごと削除。

Redmineを再起動してやればOK。

* * *

間違いがあればご指摘ください。
ライブラリプロジェクトのリソースとアプリプロジェクトのリソースの競合を避けるためにライブラリプロジェクトで出来ること

Android では、各種のリソース管理はアプリケーションプロジェクトに含まれるリソースのものが優先されるように作られています。
つまり、 ___ライブラリプロジェクトと同じ名前のリソースをアプリケーションプロジェクトに配置すると、アプリケーションプロジェクトのものが使われる___ ことになります。

意図しないリソースの競合を避けるには、ライブラリプロジェクト側の配慮が必要です。
幸いなことに、ビルドスクリプトでこれに対応することができます。

## リソース名の接頭辞を宣言する

以下の様にすることで、自分のライブラリで使用する接頭辞を宣言します。

```groovy:build.gradle

android {
  resourcePrefix 'mylib_'
}
```

こうしておくと、 ___この接頭辞が付与されていないリソースに対して Lint による警告___ が出力されるようになります。

本当は自動で接頭辞付けてくれたらいいんだけどな…

AndroidStudio における警告表示は、0.5.8 から対応しています。
TabBarControllerとNavigationControllerを同時に使う(Storyboard)

StoryBoardで作成する場合は下記のような構造で組めば良い。
rootViewControllerをNavigationControllerにすると、実行時に一見うまくいってるように見えるが、
実際には各UIViewControllerで追加したNavigation Itemの設定が反映されないので注意。

![tabbarctrl+navbarctrl.png](https://qiita-image-store.s3.amazonaws.com/0/17287/a752c721-45cb-acb7-747e-9edcd03b33ec.png)
Vimで検索実行後にカーソル位置を単語の末尾に設定させる方法

検索実行時に末尾に/eを追加すればOK

例）"test"の単語を検索して末尾のtの部分にカーソル位置を合わせたい場合
```/test/e```
として実行する。

もっと詳しく知りたい場合は
```:h search-offset```
に色々書かれてる
NGUI free版 でラベル作成


初期状態だとNGUI用のFontのプレハブが無いのでまずそれを作成する。

![スクリーンショット 2014-05-09 13.25.07.png](https://qiita-image-store.s3.amazonaws.com/0/8219/ebdabb39-9f36-6156-17cc-e7a697240534.png "スクリーンショット 2014-05-09 13.25.07.png")

とりあえず Type で　Dynamic を選択。

![スクリーンショット 2014-05-09 13.26.10.png](https://qiita-image-store.s3.amazonaws.com/0/8219/f6728d5c-30e3-cd56-f88e-6f35e962e9c9.png "スクリーンショット 2014-05-09 13.26.10.png")

Font TTF の横の○をクリックして、Arial を選択。

![スクリーンショット 2014-05-09 13.28.19.png](https://qiita-image-store.s3.amazonaws.com/0/8219/a31e824e-2727-2e34-5e26-7b2cb132ae21.png "スクリーンショット 2014-05-09 13.28.19.png")

Font Maker に戻って [Create the Font] をクリック。
すると、UnityのProjectビューに"Arial"という名前でプレハブができるので、それを適当な場所("Fonts"フォルダなど)に移動。

シーンビューに戻って、メニューから [NGUI]-[Open the Widget Wizard] を選択。
Widget Tool で Template から Label を選択し [Add To] をクリック。

![スクリーンショット 2014-05-09 13.32.12.png](https://qiita-image-store.s3.amazonaws.com/0/8219/75aabdec-cb36-a043-014a-48aa8f234db6.png "スクリーンショット 2014-05-09 13.32.12.png")
Protractorを利用してAngularJS appsをテストする

http://qiita.com/drafts/b60766d9017a1eaeada0/edit
（[Testing AngularJS apps with Protractor][元サイト] の訳）

もし、AngularJSアプリケーションを開発するならば、テストにはProtractorを使いなさい！なぜかって？

* ProtractorはAngularJSアプリケーションのためのend-to-endテストフレームワークで、強力なツールや技術（NodeJSやSeleniumやwebDriverやJasmineやCucumberそしてMochaなど)を結合するような ソリューションの結合に作用する。
* AngularJSアプリケーションのテストをより簡単に作るためにSeleniumからのたくさんのカスタマイズをProtractorは持つ。
* また、Protractorは、テストにたくさんの"sleeps"や"waits"の必要性を避け、"sleep"と"wait"時間を最適化することでテスト実行をスピードアップします。
* AngularJSコンセプトに基づいているため、既にAngularJSについて知っているならば逆に、Protractorを学ぶことは簡単にしてくれます。
* ProtractorはテストをJasmineをベースに構成されせることを許容するので、ゆえに、Jasmineのunit/function テストの両方を書くことを可能にします。
* 実際のブラウザをそして、ヘッドレスブラウザで実行します。

テストを自動化するためのフレームワークに必要なものは他にはありますか？

ProractorへのDeep-diving

Protractorの最初のバージョンは2013年6月にリリースされ、基本的にテストフレームワークのプロトタイプでした。しかしながら、テストコミュニティをサポートするGoogleは、AngularJSの発展に沿った形でかつAngularJSを利用するコミュニティの必要性に出会うことでフレームワークを発展させています。ProtoractorプロジェクトはGithubで公開しており、Projectのissueを参照でしたり、面白いと思ったことをissueで追加したり、その他の人々によって公開されたissueにコメントしたり、プロジェクトを手伝うためにpull requestを実行したりなど可能です。プロジェクトの成長をサポートすることに興味を持った誰もが歓迎されます！


![testing-angularjs-apps-protractor.png](https://qiita-image-store.s3.amazonaws.com/0/6846/03fc30be-f7ca-8929-134e-d6525b1bddd0.png)


Protractorはfunctionalテストの自動化のためのフレームワークですので、その意向はAngularJSアプリケーションをテストすることを示すだけではなく、顧客によって要求される受入れ条件にも渡ります。たとえ、Protractorを用いたUI階層の実行するテストがあるとしても、単体/結合テストもまた必要になります。それはSelenium上で実行し、そして、ゆえに、Seleniumからの有利でそして便利なすべてを備えます。加えて、AngularJSアプリケーションをテストするカスタム可能なフィーチャを供給する。また[ChromeDriver][ChromeDriver]や[GhostDriver][GhostDriver]などのようなWebdriverのwire protocolを実行するドライバーを使うことも可能です。しかしながら、GhostDriverを利用するテストを実行するには、ヘッドレスモードでテストを実行するGhostDriverを利用するPhantomJSを使う必要があります。


Jasmineで結合されたフレームワークはテストやユーザの期待値を生成し構成できる。Jasmineは、ブラウザから抽出されたリソースがpromiseを通してテストを作ることに利用されている理由からProtractorと依存性があります。それらのpromiseはJasmineから"expect"コマンドを利用することによって内部的に解決されます。それは、promiseがテストを生成する間にスムーズに作用することを、示します。
（訳注：ここの節の文書はもう少し内部の技術的な理解を進めないと本来の訳にはならなさそう）

数年前のProtractorのドキュメントはプアで、Protractorの定期的な進展を急激に必要とするようなすたれた状態になるリスクがあった。しかしながら、ここ数か月でコミュニティはたくさんの共同作業があり、そして、Protractorのドキュメントは更新されている。課題を送ることやGithub上の公的なプロジェクトを通した共同作業を容易に行えるようになったことになります。注意点が1つあり、それはGoogleの協力者としてデジタル契約書にサインされていることです。

あなたはAngularJSアプリケーションをどのようにテストしてますか？あなたの経験はProtractorで何がありますか？

[元サイト]: http://bit.ly/1k4rZbn
[ChromeDriver]: https://code.google.com/p/chromedriver/
[GhostDriver]: https://github.com/detro/ghostdriver
なぜ、Go言語にはpackageに対するリフレクションがないか。または如何にしてgo testが動作しているか。


プログラマあるあるとしては、新しい言語をはじめると自然とリフレクションAPIを探してしまうものです。

当然、golangにもreflectパッケージはあって、それを眺める訳ですが、packageに自体に対するclassや関数の列挙がないのです。
そうなってくると不思議なのは、``go test``です。

``go test``は、テストコードから、TestやBench、Exampleといったprefixのついているものだけを実行したり、Testしたい関数のprefixを指定できたりします。

```bash
$ go test .
$ go test -bench Unit
```

これをみて、すっかりLL脳になっていた私は、packageに対してのreflectionがあるんだろうと思い込んでいたのです。

実際のところ``go test``は標準ライブラリとしてついてくるgo/parserをつかい、astから関数を見つけ出し、mainパッケージやmain関数をtext/templateをつかって作成し、コンパイルするという方法をとっていました。

一方、すべて静的リンクされているはずなのだから、ソースコードなど持たなくてもpackageから関数を取り出す方法があるだろう、といろいろ探してみると

http://stackoverflow.com/questions/12127585/go-lookup-function-by-name

このようなStack Overflowの記事を見つけました。
なんのことはない動的に名前から関数を見つけたいという質問なんですが、
それに対する回答で、

> There's no way to dynamically look up a function by name, but I think it's worth mentioning why. Basically, the reason is so that the compiler and/or linker can eliminate unused functions.

>Consider that if you were able to get a function by name, then every function in every imported package (recursively) would have to be linked into the final executable, even if it was never used, just in case someone wanted to look it up by name. People already complain about the large size of Go binaries, but this would cause them to be much larger still.

というのがありました。
ふむふむ、なるほど。使っていない関数をリンクしていないと。

```unused.c
int main(){

}
// 使っていない。
int AAAA(int a,int b){
    return a+b;
}
```
たとえば、C言語ではこのようにつかっていない関数があった場合、

```bash
$ nm -a a.out                                                                                                 
0000000100000f80 T _AAAA
0000000100000000 T __mh_execute_header
0000000100000f70 T _main
                 U dyld_stub_binder
```
こんなかんじにAAAAもlinkされます。

```used.go
package main

import (
    "fmt"
)

func main() {
    AAAAAA(2, 4)
}

func AAAAAA(a, b int) {
    fmt.Println(a + b)
}

```
go言語でも次のように使っている関数であれば、

```bash
$ nm -a hoge | grep main                                                                                      
207:00000000000226a0 T _main
1692:0000000000002040 t main.AAAAAA
		:
		:

```
mainにエントリがあることがわかります。

一方で、

```unused.go
package main

import (
    "fmt"
)

func main() {
    // AAAAAA(2, 4)
}

func AAAAAA(a, b int) {
    fmt.Println(a + b)
}

```
このようにコメントアウトして、使っていない関数を作ると

```bash
nm hoge | grep main                                                                                      
206:0000000000022310 T _main
1677:00000000000c6e8c s main.gcargs·0
1678:00000000000c6e90 s main.gcargs·2
1679:00000000000c6e94 s main.gclocals·0
1680:00000000000c6e98 s main.gclocals·2
1681:0000000000002010 t main.init
1682:000000000016d9c2 s main.initdone·
1683:0000000000002000 t main.main
```

エントリが消えたことがわかります。
このように、利用されていない関数をリンクしない仕組みによって必要以上に実行ファイルが肥大化しないようにしているんですね。
fluent-plugin-file-alternativeで出力したログをin_tailで読み込む

Fluentdでは出力側が詰まると、バッファがたまっていき、ある程度するとバッファが詰まり、今度はそこにForwardしているバッファが詰まり、数珠つなぎにバッファが詰まっていく。大量にたまらないときは出力側が流れ出したら、復帰してくれてとても便利だ。memoryバッファにしておくと、プロセスを再起動しないといけないときに消えちゃうので、fileバッファにするのがいまのところ王道設定である。

しかし、出力先で障害が発生し長引くと、バッファが詰まっていって回復するまでにバッファがあふれてログを取りこぼしてしまったり、いざ回復しても、今度はFluentdからバースト的にログが流れてきてまた詰まってしまったりする。また、出力先が何かの障害でログが失われてしまったとき、復旧する手段がなくて困る。

そこで、Fluentdからいろんな時に出力するときに、一旦ファイルにログを書き出して数週間ためておいて、いつでも復旧できるようにしたい。こうすると、以下のメリットがある。

- 入力側Fluentdと出力側Fluentdのプロセスを分離できる。これによって出力側が障害になっても入力側Fluentdが詰まることはないし、設定更新による再起動もそれぞれ分けて行うことができる。
- 出力先で障害が起こっても、ファイルをfluent-cat等で出力側Fluentdに流し込むだけで簡単に復旧ができる。
- 出力側Fluentdを複数プロセスに分けることができる。

図にすると、次のような感じだ。

![Fluentd.png](https://qiita-image-store.s3.amazonaws.com/0/5218/5b3d9d1b-9123-ffa0-bf39-714e582f881e.png)

単純に入力側Fluentdと出力側Fluentdのプロセスを分けて、fileバッファにしたforwardで受け渡しても良いんだけど、バッファの設定に困るし、出力先障害時の復旧には使うことができない。このために以前はfluent-plugin-tailexを使っていたけど、相当する機能がFluentd v0.10.45で組み込まれた。めでたい。

ということで設定。

## 出力側Fluentdの設定

出力側Fluentdは`type file_alternative`で適当に出力する感じだ。

```apache:出力側fluentdの設定
<source>
  type forward
  # ここは適当に
</source>

<match ap.activity>
  type file_alternative
  path /hoge/log/%Y%m%d/access.log.%Y%m%dT%H%M

  buffer_type file
  flush_interval 1s

  output_data_type    json
  output_include_time true
  output_include_tag  false
  add_newline         true
</match>
```

## 入力側Fluentdの設定

入力側は`in_tail`で読み込む。ローテートに対応するため、`read_from_head`と`rotate_wait`を設定しておく。

`rotate_wait`はローテートを検出したときに、前のファイルを何秒間読んでくれるかを設定する。1分間に1回ファイルが変わるので60秒にしておけば、1つ前のファイルと現在のファイルを読むようになる。`/proc/$PID/fd`を`ls -al`すれば確認できる。

`read_from_head`を有効にすると、ファイルの先頭から読むようになる。これを有効にしておかないと、新しいファイルの0秒付近を取りこぼしてしまう。

`refresh_interval`は短めにしておく。長すぎると切り替わりの最初で、30秒分とかのログが出力され、1回のflushごとの量が偏ってしまう。しかし、短すぎると今度はファイルが切り替わるタイミングで、ファイルができる前に切り替わってしまって`No such file or directory`エラーが発生する。この`No such file or directory`は出なくて良いんだけど、どうすればいいかな……

```apache:入力側fluentdの設定
<source>
    type tail
    path /hoge/log/%Y%m%d/access.log.%Y%m%dT%H%M
    pos_file /hoge/log/access.log.pos
    tag access.log
    format json
    time_key time
    read_from_head true
    rotate_wait 60
    refresh_interval 5s
</source>

<match access.log>
  ...
  ここに出力設定を書く
  ...
</match>
```

## まとめ

こんな感じで、中間ファイルを用いることでより堅牢なログ転送が実現できた。Fluentdを複数プロセス立てるときは、monitで監視してるんだけど、`in_multiprocess`を使ってもいいかもしれない。

問題としては、入力側Fluentdがファイルを書き出す前に出力側Fluentdを動かしてしまうと、前述した`No such file or directory`で起動しなくなってしまう。これを無視するオプションあっても良いかもしれない。もしくは、こんなことを実現できるbufferプラグインがあってもいいのかなーとさっき思った。
各Composerファイルの役割

composer.lock：現在使用しているバンドルのバージョン等が管理されます。

composer.json：必要となるバンドルを記述します。

composer.pharで実行。

コマンドの場所は`which composer.phar`で検索


`composer.phar update *` 
で全てをアップデート。
VagrantでWindows Guestを試してみた


Vagrant 1.6でWindows Guestがサポートされたので試してみました。

#環境
* OSX 10.9
* VirtualBox 4.3.10 r93012
* Vagrant 1.6.1

#手順
ブログにデモがありますので、こちらをみれば大体わかります。
http://www.vagrantup.com/blog/feature-preview-vagrant-1-6-windows.html

デモではWindowsのboxがすでに追加されている状態から始まってます。
Vagrant Cloudで適当にWindowsのBoxを探してダウンロードしておきましょう。

https://vagrantcloud.com/search?utf8=%E2%9C%93&sort=&provider=&q=windows

opentableさんが評価版のWindows Boxをたくさんあげているので、それをもとにVagrantfileを作成すると簡単に起動することができます。opentableさんのBoxはOpenSSH,Git,Curl,Wgetなどがすでに入ってます。[packer.io](http://www.packer.io/ "packer.io")さんが提供しているようです。
例えば、Windows Server 2012 R2であれば次のコマンドで起動できます。

```bash
$ vagrant init opentable/win-2012r2-standard-amd64-nocm
$ vagrant up
```

Boxがかなり大きいので、コーヒーでも飲みながらしばらく待ってください。

しばらく待つと起動するので`vagrant ssh`でつないでみます。
`pwd`コマンドをたたくとvagrantユーザーのホームにいることがわかりますね。

```bash
$ vagrant ssh
WARNING: Could not load IOV methods. Check your GSSAPI C library for an update
WARNING: Could not load AEAD methods. Check your GSSAPI C library for an update
WARNING: Nokogiri was built against LibXML version 2.8.0, but has dynamically loaded 2.9.1
Last login: Thu May  8 20:02:53 2014 from 10.0.2.2

vagrant@vagrant-2012-r2 ~
$ pwd
/cygdrive/c/Users/vagrant
```

VirtualBoxのマネージャーを見るとWindowsが立ち上がってるのがわかります。

![スクリーンショット 2014-05-09 12.35.58.png](https://qiita-image-store.s3.amazonaws.com/0/41603/a1b1033e-fb2e-e364-08d8-7101837aeaa9.png "スクリーンショット 2014-05-09 12.35.58.png")

新しく追加された`vagrant rdp`コマンドでつないでみます。するとこんなエラーが。

```bash
$ vagrant rdp
WARNING: Could not load IOV methods. Check your GSSAPI C library for an update
WARNING: Could not load AEAD methods. Check your GSSAPI C library for an update
WARNING: Nokogiri was built against LibXML version 2.8.0, but has dynamically loaded 2.9.1
==> default: Detecting RDP info...
RDP connection information for this machine could not be
detected. This is typically caused when we can't find the IP
or port to connect to for RDP. Please verify you're forwarding
an RDP port and that your machine is accessible.
```

`vagrant ssh`でもう一度入ってみると3369番のポートがListenされていないのでリモートデスクトップが起動されていないようです。
というわけで今日はここまで。
[続きはこちら](http://qiita.com/zrock/items/0eef43a23e057021d3e6)
has_many関連を拡張する

例えばこんな事をしたい場合。

```rb
class User < ActiveRecord::Base
  has_many :items
end

User.items.total_attack  # 装備しているアイテムの総攻撃力
User.items.drop_random!  # ランダムでアイテムを1つ落とす
```

`scope`で実装できることも多いと思いますが、SQLだけで処理できないような(Arelだけで記述できないような)処理を`scope`にしてしまうのもいかがなものかと思います。
`has_many`には`extend`オプションがあって、その名の通り関連を拡張できます。

```rb
module ItemCollection
  def total_attack
    # ...
  end

  def drop_random!
    # ...
  end
end

class User < ActiveRecord::Base
  has_many :items, extend: ItemCollection
end
```

## 参考
http://railsadventures.wordpress.com/2012/08/28/activerecord-association-extensions/

Rails4では`has_many`に渡したブロック内で`extending`するようです。
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Association+extensions
String.length() と 配列.length が違う理由（解決してない）

```java
String str = "a";
int[] array = new int[10];
System.out.println(
        "文字列の長さ = " + str.length()
         + "配列の要素数 = " + array.length);
```

なぜ、配列のlength には```()``` がつかないのか？
疑問に思ってAPI のソース(1.8)を見てみました。

## String.java#length()

```java
    /**
     * Returns the length of this string.
     * The length is equal to the number of <a href="Character.html#unicode">Unicode
     * code units</a> in the string.
     *
     * @return  the length of the sequence of characters represented by this
     *          object.
     */
    public int length() {
        return value.length;
    }
```

なるほど、こっちはメソッドになっています。
value は、charの配列ですね。

```java
    /** The value is used for character storage. */
    private final char value[];
```

## 配列のlength
一般的には配列オブジェクトのフィールド変数と説明されるやつですね。
が、あれ、クラスはどれみればいいんだ？
java.lang.reflect.Array にもそんなフィールドはないし。
java.lang.Class の中にこんなのがあったけど

```java
2699     static class MethodArray {
2700         private Method[] methods;
2701         private int length;
```

**MethodArray？**
どなたか識者のかたお助けを..
Rails(v4)チュートリアル7章メモ


## デバッグ情報をブラウザに表示

開発中は以下のコードをテンプレートに埋めこむと開発がやりやすくなる。

```application.html.erb
<%= debug(params) if Rails.env.development? %>
```

## テスト確認用ユーザーを用意

**Factory Girl**を使うとモデルを使ったテストが楽に出来る

```spec/factories.rb
FactoryGirl.define do
  factory :user do
    name     "Michael Hartl"
    email    "michael@example.com"
    password "foobar"
    password_confirmation "foobar"
  end
end
```

シンボル:userがfactoryコマンドに渡されると、Factory Girlはそれに続く定義がUserモデルオブジェクトを対象としていることを認識する。

**ハッシュ保存するパスワードなどを含むモデルを使ったテストは遅い。**

- BCryptアルゴリズムによるセキュアパスワードのハッシュ生成そのものが仕様上遅い

対策としては以下のコードを埋め込む

```config/environments/test.rb
SampleApp::Application.configure do
  .
  .
  .
  # bcrypt'のコスト関数を下げることでテストの速度を向上させる。
  ActiveModel::SecurePassword.min_cost = true
end
```

## redirect_to @user(@model)

redirect_to @userと書けばユーザー表示ページに移動(User#show (ルーティングによる))

参考URL

- http://gagapi.hatenablog.jp/entry/2013/03/16/102746

## flash


>登録完了後に表示されるページにメッセージを表示し (この場合は新規ユーザーへのウェルカムメッセージ)、2度目以降にはそのページにメッセージを表示しないようにするというものです。Railsでは、こういう場合にflashという特殊な変数を使用できます。この変数はハッシュのように扱うことができます。

## SSLを導入して本番環境をデプロイする

config/environments/production.rbを以下のように修正(コメントを外す)

```config/environments/production.rb
SampleApp::Application.configure do
  .
  .
  .
  # Force all access to the app over SSL, use Strict-Transport-Security,
  # and use secure cookies.
  config.force_ssl = true
  .
  .
  .
end
```

## herokuに公開

http://railstutorial.jp/chapters/beginning?version=4.0#sec-heroku_setup

上記URLを参考にもろもろ準備する。

```
$ heroku run rake db:migrate
```

上記コマンドを実行してherokuの環境にデータベースを用意する
Windowsのvimでクリップボードにコピーする

Vimでのコピー方法を調べてたら「Visualモードで`y`を押せばテキストがコピーできて便利だぜ、ヤフゥー！」な紹介がすぐに見つかったのに他のソフトと連携するために`yank`じゃなくてクリップボードにコピーする方法がちょっと見つかりにくかったので紹介します。

## クリップボードにコピー

まずテキストを選択する。`"*y` と入力する。以上です。

## 参考

http://stackoverflow.com/questions/3961859/how-to-copy-to-clipboard-using-vim
Rのインストール (Linux Mint, Ubuntu)

# 概要
Linux Mint (Ubuntu系) にRをインストールする。
デフォルトパッケージが古かったのでCRANの最新版をインストールした。

# 環境
* Linux Mint 16 Petra
* R 3.1.0

# 内容

* パッケージの取得先を追加
CRANのミラーサイト (http://cran.r-project.org/mirrors.html) から適当なサイトを選んで設定ファイルを作成する。末尾のsaucyのところはOSのバージョンに合わせて記載する。

```bash:/etc/apt/sources.list.d/r.list
deb http://cran.ism.ac.jp/bin/linux/ubuntu saucy/
```

* パッケージ取得先を更新

`apt-get update`しても署名が検証できずエラーになるので公開鍵を取得して再度実行する。

```bash
$ sudo apt-get update
・・・
W: GPG エラー: http://cran.ism.ac.jp saucy/ Release: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY <公開鍵>
$ gpg --keyserver keyserver.ubuntu.com --recv-key <公開鍵>
$ gpg -a --export <公開鍵> | sudo apt-key add -
$ sudo apt-get update
```

* 最後にRをインストール

```
$ sudo aptitude install r-base
```
# 参考
* http://www.okada.jp.org/RWiki/?R%20%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB
Proxy環境でgem install

# gem installはProxy環境でエラーが出る
学校でSassをインストールしようとしたら、プロキシのせいでエラーが出る。
環境は以下の通り。

+ OS:Windows8
+ msysgit
+ Ruby 2.0.0p451
+ gem 2.2.2

## エラーメッセージ

```bash
$ gem install sass
ERROR:  Could not find a valid gem 'sass' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - Errno::ETIMEDOUT:
 A connection attempt failed because the connected party did not properly respon
d after a period of time, or established connection failed because connected hos
t has failed to respond. - connect(2) (https://api.rubygems.org/latest_specs.4.8
.gz)
```

# 対応策
参考：[プロキシが邪魔してRubyGemでインストールできないとき](http://kyow.cocolog-nifty.com/blog/2007/04/rubygems_16c9.html)

概ねリンク先の通りですが、ユーザー名とパスワードが必要だったので以下のように入力。

```bash
$ gem install パッケージ名 -r -p http://username:password@proxy.hostname:port
```

これでOK。
※1 username,password,proxy.hostname,portなどはご自身の環境に合わせて変更してください。
※2 ユーザ名に@を含む場合、エスケープする必要があるそうです
（参考：[gem install実行時、Proxyサーバ認証ユーザに @ を含む場合のTips](http://www.tamoot.net/d/20130508.html)）
Atom Shellを動かしてみた

# はじめに

# 自分がやってみた事

## GPS

ちょっと前に対応したとISSUEで見かけたので試したら、
警告表示されずに即取得した。

DevToolで以下を入力して試した。

```js
location.href="http://jsrun.it/kjunichi/1iyC"
```

## WebGL

OSX、Linuxはフツーに動きそう。

Windowsは自分の環境固有の問題なのか、動かなかった。

## WebRTC

最近Virtualboxでも静止画はWebCam使えるが、動画はSkypeで
試した限りはNGだったので、試せていない。

OSX、Windows共に動いた。

## main.jsからhttpでのhtmlの読み込み

jsdo.itの過去の作品で試したが、問題なさそうだった。

# 今後

- [Atom Shellでkoaを動かせた](http://qiita.com/kjunichi/items/f4f5b75686f26d1bc18c)
- [Atom Shellでファイルを選択ボタンが使えない件](http://qiita.com/kjunichi/items/18f88256746f0298ff4e)
 
何かあったり、やったことをここに追記する予定。

# 関連記事

- [Atom ShellでCocoa APIが叩けるようになった](https://abrakatabura.hatenablog.com/entry/2014/08/29/064518)
- [AtomエディタをUbuntu 14.04 LTSで動かした](https://abrakatabura.hatenablog.com/entry/2014/05/08/072845)
- [Atom Shellでデスクトップキャプチャー（動画）アプリ](https://abrakatabura.hatenablog.com/entry/2014/05/29/075150)
- [Atom Shellいじってたが、apmはビルドしないと行けなかった件 #windows](https://abrakatabura.hatenablog.com/entry/2014/05/23/072249)
Numpyによる乱数生成まとめ


Python標準にも random というモジュールがあるが、ベクトル演算の可能な numpy のほうが「大量に乱数を生成してなんかの処理をする」という場合に高速に動く。あと分布関数が山ほど用意されている。

一様乱数
----

numpy.random.rand() で 0〜1 の一様乱数を生成する。引数を指定すれば複数の乱数を生成できる。乱数の範囲を変えたい場合は後からベクトル演算をすれば良い。

```python
from numpy.random import *

rand()		# 0〜1の乱数を1個生成
rand(100)	# 0〜1の乱数を100個生成
rand(10,10)	# 0〜1の乱数で 10x10 の行列を生成

rand(100) * 40 + 30	# 30〜70の乱数を100個生成
```


特定の分布関数に従う乱数
----
どれも size=(10,10) などと引数を指定すれば、任意の個数の乱数を生成できる。

```python
from numpy.random import *

""" 標準正規分布。いわゆるガウシアン。標準正規分布ならば randn() で、平均・分散を指定したい場合は normal() を用いる。"""
randn()			# 標準正規分布 (平均0, 標準偏差1)
randn(10)		# 標準正規分布を10個生成
randn(10,10)	# 標準正規分布による 10x10 の行列

normal(50,10)	# 平均50、標準偏差10の正規分布

""" 二項分布。確率pでオモテが出るコインをn回投げて、オモテが出る個数。 """
binomial(n=100, p=0.5)

""" ポアソン分布。稀にしか起きない現象を長時間観測したときに起きる回数の分布。λはその平均。 """
poisson(lam=10)		# λ=10 のポアソン分布

""" ベータ分布。二項分布の共役事前分布などに用いる。"""
beta(a=3, b=5)		# a=3, b=5 のベータ分布

```
他にもχ分布、ディリクレ分布、指数分布、F分布、ガンマ分布、幾何分布、ガンベル分布、超幾何分布、ラプラス分布、ロジスティック分布、対数正規分布... など山ほどある。詳しくはこのへんを参照。
http://docs.scipy.org/doc/numpy/reference/routines.random.html


整数
----

```python
from numpy.random import *

randint(100)			#  0〜99 の整数を1個生成
randint(30,70)			# 30〜69 の整数を1個生成
randint(0,100,20)		#  0〜99 の整数を20個生成
randint(0,100,(5,5))	#  0〜99 の整数で5x5の行列を生成

random_integers(100)	# 1〜100 の整数を1個生成
random_integers(30,70)	# 30〜70 の整数を1個生成
```

リストからのランダム抽出
----

```python
from numpy import *

city = ["Sapporo","Sendai","Tokyo","Nagoya","Kyoto","Osaka","Fukuoka"]

random.choice(city)						# 1個をランダム抽出		
random.choice(city,10)					# 10個をランダム抽出（重複あり）
random.choice(city,5,replace=False)	# 5個をランダム抽出（重複なし)

# 確率を重み付けする場合
weight = [0.1, 0.1, 0.3, 0.1, 0.1, 0.2, 0.1]
random.choice(city, p=weight)			# 指定した確率で1個を抽出
````

乱数発生の初期化
----
Numpyで生成される乱数は擬似乱数であるため、固定したseedを指定してやれば毎回同じ乱数が出る。デバッグ時など毎回同じ乱数を出して欲しいときに使う。

```python
from numpy.random import *

seed(100)		# 数値はなんでもいい
rand()			# 毎回同じ値を返す
```


分布をヒストグラムで確認
----
目的どおりの乱数が生成しているか不安な場合は、大量に乱数を生成してヒストグラムを描写すると良い。ここでは matplotlib というグラフ描写モジュールを用いる。

```python
from numpy.random import *
import matplotlib.pyplot as plt

R = randn(10000)		# 標準正規分布で乱数を1万個生成
plt.hist(R, bins=100)	# 100本のヒストグラムを作成
plt.show()				# グラフを表示
```
![output.png](https://qiita-image-store.s3.amazonaws.com/0/40166/466e1755-c2f1-419c-f372-67b2e8a84dfe.png "output.png")


応用: ランダムウォークの生成
----

右か左、つまり +1 か  -1 の乱数列を生成し、その累積和 cumsum() をとる。

```python
from numpy import *

L = 1000							# 歩数
step = random.choice([-1,1],L)	 	# +1 or -1 をL個生成
position = cumsum(step)				# 位置の変化
```

![output.png](https://qiita-image-store.s3.amazonaws.com/0/40166/1a98a670-c727-9029-773a-ffe39166a950.png "output.png")
Pixasticで複数のアクションを同時に実行するためのTips

ブラウザ上で画像を編集するため、[Pixastic](http://www.pixastic.com/lib/)というライブラリを利用している。

ひとつひとつのアクションを実行するのは問題ないが、複数のアクションを実行するとたまに反映されない事がある。

```js
Pixastic.process(
  img,
  'brightness',
  {brightness: param.brightness, contrast: param.contrast / 100}
);

Pixastic.process(
  img,
  'rotate',
  {angle: param.angle
);
```

解決策としては、processのコールバックで次のアクションを実行することで、正しく反映されるようになる。

```js
Pixastic.process(
  img,
  'brightness',
  {brightness: param.brightness, contrast: param.contrast / 100},
  function(res) {
    Pixastic.process(
      res,
      'rotate',
      {angle: param.angle
    );
  }
);
```

※processの戻り値を第一引数に指定することも考えたが、dataImg.completeがfalseになりundefinedになるため断念
redis-objectsを用いたお知らせ機能の実装


facebookの上に出てくるようなお知らせ機能を作成するために、
redisを用いて実装をしてみたのでメモ。
お知らせ機能の作成方法、redis-objectsの使い方の参考になれば。
プッシュ機能の実装ではないのでご注意を。
詳しいAPIの利用方法は[Github](https://github.com/nateware/redis-objects)で。

## 環境

- Ruby 2.0.0
- Ruby on Rails 4.0.2
- Redis 2.8.9
- redis(gem) 3.0.7
- redis-objects 0.9.1

## 要求

まず前提として要求の確認をしておきます。

* 未読お知らせ件数は日をまたいだ全てのものをカウント
* お知らせの内容、未読既読は日毎に管理

## redis-objectsのインストール

以下の行を追加してbundle install

```Gemfile
gem 'redis-objects'
```

## redis-objectsの使い方

redis-objectsには

1. モデルにインクルードする方法
2. モデルと独立して利用する方法

の２通りがあります(Githubより)。

1のモデルにインクルードする方法では

```
モデル名:id:フィールド名
```

の形式でRedisのキーが作成されます。

2では独自の形式のキーが作成可能です。

## 実装

未読お知らせ件数と、未読既読管理についてそれぞれ実装方法をまとめます。

### 未読お知らせ件数のカウント

1のモデルにインクルードする方法を用います。

```app/models/user.rb

class User < ActiveRecord::Base

  include Redis::Objects

  counter :notice_counter

end

```

Redis::ObjectsをインクルードするとDSLが追加されます。
counterで定義したキーはRedisのString型を用いて、整数値のデータが保存されます。
上記の例ではuser:id:notice_counterというString型のキーが作成されます。

``` notice_counter.rb

@user = User.find(1)
@user.notice_counter.incr # お知らせに追加があったとき
@user.notice_counter.decr # お知らせがpopされたとき
@user.notice_counter.reset # すべてのお知らせを消去したとき

```

### 日毎の未読既読管理

2の独立した方法を利用します。

キーを独自に定義できるので

```
user:id:notice:date(yymmdd)
```

形式で作成します。
データ型にはリストを用います。
このキーに追加する値はモデル名:idの形式で保存します。
例) comment:10


```app/models/user.rb

class User < ActiveRecord::Base

  def push_notice(object, date)
    l = Redis::List.new(notice_key(date))
    l << "#{object.class.to_s.underscore}:#{object.id}"
    notice_counter.incr
  end

  def pop_notice(date)
    l = Redis::List.new(notice_key(date))
    res = l.pop
    notice_counter.decr unless res
    res
  end

  private
  def notice_key(date)
    "user:#{self.id}:notice:#{date.strftime('%y%m%d')}"
  end
end

```

(例外処理などは省きました)
これで日毎の通知の未読既読の管理が可能になりました。

## まとめ

以下のことについてまとめました。

- redis-objectsのインストール方法
- redis-objectsの使い方２通り
- お知らせ機能の実装

RedisはAPIがわかりやすくて使っていて気持ちいいですね。
KVS一般に言えることですが、キーの設計をちゃんと行わないと収集がつかなくなってしまうのでredis-objectsのように予め使い方をしぼってくれるのは嬉しいですね。
Pythonのexec文


# 概要

```python:
exec <実行するコード> [参照変数の辞書 [, 変数割当先の辞書]]
```

# 例

```python:exec.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-



## 基本の例。グローバル環境に副作用あり
exec "x=1"
print "x in global env is", x


## 独自環境で実行する。
ref1=dict(x=100)
exec """print 'x in temporary env is', x
y=x+1""" in ref1
print "y is in global()? ->", "y" in globals()
print "y in ref1 is", ref1["y"]



## 独自環境で実行する。変数の割当は、別環境に
ref2=dict(x=1000)
dest=dict()
exec "z=1+x" in ref2, dest
print "z is in global()? ->", "z" in globals()
print "z is in ref2? ->", "z" in ref2
print "z in dest is", dest["z"]
```

実行結果

```bash:
bash-3.2$ ./exec.py 
x in global env is 1
x in temporary env is 100
y is in global()? -> False
y in ref1 is 101
z is in global()? -> False
z is in ref2? -> False
z in dest is 1001
```
VirtualBox内のLinuxでWebGLを動かすには

# 2015/01/18追記

どうも、ChromeではWebGLを動かせない模様。
またAtom ShellでもNG。

現状、Firefoxだと簡単なものは表示されるが、
例えば、

- http://www.chromeexperiments.com/detail/streetlights/?f=webgl

は表示が正しくされなかった。

# 背景

先日公開されたAtom-Shellをいじっており、OSX、Windows、Linuxで
HTML5な機能がどの程度使えるのか試している。

手始めに、WebGLは使えるよね？ってことで今回の事が分かった。

ちなみに、手元のWindows（非仮想環境）ではDLLを有効にしてもWebGLが動かなかった

# 本題

WindowsはダメでもLinuxは出来るようね？ってことで、
自作PCのVirtualBox内のUbuntu12.04で試したのだが、NG。

念のため、ダメ元で、MacBook ProのVirtualBox内のUbuntu14.04で
試したら、なんと動いた！

なんでだろ？Ubuntu14.04で新しいからか？
などと、考えたが、どうやら、VirutalBoxの3Dアクセラレーションを切って
おくと、WebGLが動く模様。ただし激重。


# 関連記事

- [AtomエディタをUbuntu 14.04 LTSで動かした](http://kjunichi.cocolog-nifty.com/misc/2014/05/atomubuntu-1404.html)
- [VirtualBoxのUbuntuでSkypeを試した](https://abrakatabura.hatenablog.com/entry/2011/05/31/224745)
- [#trouble #windows8 VirtualBoxを入れるとスリープ後、ネットワークが使えない](https://abrakatabura.hatenablog.com/entry/2012/03/13/072259)
- [VirtalBoxに入れたLinuxをヘッドレスで起動してしまったときのDropbox](https://abrakatabura.hatenablog.com/entry/2013/08/27/071430)
- [VirtualBox上のUbuntuでFaceTime HD カメラが使えた](https://abrakatabura.hatenablog.com/entry/2013/11/08/104448)
- [Mavericksにして分かったTimeMachineとVirtualBoxの関係](https://abrakatabura.hatenablog.com/entry/2013/11/21/060034)

- [YosemiteにYosemiteを入れた #VirtualBox](https://abrakatabura.hatenablog.com/entry/2014/11/05/052322)

# Link

- [atom/atom-shell
](https://github.com/atom/atom-shell)
[Excel VBA] get the list of file path.

FileListの中で呼んでいる`GetFilePathList`関数に適切に引数を渡してあげてください。

第1引数で指定したディレクトリ下を再帰的に検索し、第2引数で指定したファイル(ワイルドカードOK)
を、シートに全部書き出します。

```vb
Option Explicit

Sub FileList()
    Dim Files As Variant
    Files = GetFilePathList("c:\Samples", "*.pdf")
    
    Range(Cells(1, "A"), Cells(UBound(Files, 2), "B")) _
        = Application.WorksheetFunction.Transpose(Files)
End Sub

Private Function GetFilePathList(Path As String, Target As String) As Variant
    Dim FSO As Object, Folder As Variant, File As Variant
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    
    Dim Files() As Variant
    ReDim Preserve Files(1, 0)
    
    For Each Folder In FSO.GetFolder(Path).SubFolders
        Dim SubFiles() As Variant
        SubFiles = GetFilePathList(Folder.Path, Target)
        
        Dim FromIndex As Integer
        Dim ToIndex As Integer
        
        FromIndex = UBound(Files, 2)
        ToIndex = FromIndex + UBound(SubFiles, 2)
        ReDim Preserve Files(1, ToIndex)
        Dim i As Integer
        For i = FromIndex To ToIndex
            Files(0, i) = SubFiles(0, i - FromIndex)
            Files(1, i) = SubFiles(1, i - FromIndex)
        Next i
    Next Folder
    
    
    For Each File In FSO.GetFolder(Path).Files
        If File.Name Like Target Then
            ReDim Preserve Files(1, UBound(Files, 2) + 1)
            Files(0, UBound(Files, 2) - 1) = File.ParentFolder
            Files(1, UBound(Files, 2) - 1) = File.Name
        End If
    Next File
    
    GetFilePathList = Files
End Function
```

## 参考サイト
[Office Tanaka(1)](http://officetanaka.net/excel/vba/tips/tips36.htm)
[Office Tanaka(2)](http://officetanaka.net/excel/vba/filesystemobject/file.htm)
[hiroaki's Lab](http://hiroakis-lab.net/entries/entry/121?type=date)
bundle update

アプリケーションサーバを起動した状態で bundle update を叩くと Gemfile.lock の更新が行われない

ganshou-no-MacBook-Air:sample_app takako$ bundle install
Fetching gem metadata from https://rubygems.org/.........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Bundler could not find compatible versions for gem "activesupport":
  In snapshot (Gemfile.lock):
    activesupport (4.0.2)

  In Gemfile:
    rails (= 4.0.4) ruby depends on
      activesupport (= 4.0.4) ruby

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.



サーバを止める
rshをバックグラウンドで多数実行


## 症状

条件は以下．

```bash
$ cat /etc/redhat-release 
CentOS release 5.4 (Final)
$ uname -a
Linux mike.bw.nitech.ac.jp 2.6.18-164.2.1.el5 #1 SMP Wed Sep 30 12:52:46 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
```



```bash:test.sh
#!/bin/bash

for i in `seq 1 200`
do
  rsh cnode005 "echo $i" &
done
```

というシェルスクリプトを実行すると，169までは実行されるが，それ以降は`poll: protocol failure in circuit setup`というエラーが出て実行されない（この169というのは再現性がある．つまり同時並列rshのリミットがその値なのだろう）．直後にまた`test.sh`を実行すると，最初から同様のエラーが出るが，少し間をおいて実行するとまた，169までは実行される．．．



```bash:test2.sh
#!/bin/bash

for i in `seq 1 100`
do
  rsh cnode005 "echo $i"
done
for i in `seq 1 100`
do
  rsh cnode006 "echo $i"
done
```

のように，別のリモートホストに100回づつ接続するのであれば問題は生じない．
つまりこのリミットはリモートホスト側の制限ということになる．


## 現状

[あるサイト](http://wall-climb.com/2007/01/26/rsh%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B/)を参考にして`rsh`に`-n`オプションを付けて，リモートホストで`< /dev/null`を加えてみたが，解決されなかった．

```bash:test.sh
#!/bin/bash

for i in `seq 1 200`
do
  rsh cnode005 -n "echo $i < /dev/null" &
done
```

## 結論

分からん．．．

まぁ，なんにせよ，rshやsshには（それを利用するmpirunなどにも）ある時間内の同時接続数制限があると考えてプログラムを考えた方が良さそうだ．．．
PHPBrewをPHPバージョンを管理する


先週あたりからフロントエンドからバックエンドにチームを移動したため、
PHPの入れ方を調べてみました。色々あるみたいだけど、
nodebrewやrbrewなどとよく似ているphpbrewで
インストールしてみることにしました。

#PHPBrewでPHPバージョンを管理する。

##まずはアップデート

```
sudo apt-get update
```

##PHPBrewをインストール
参考ページ：https://github.com/c9s/phpbrew


```
wget https://raw.github.com/c9s/phpbrew/master/phpbrew
chmod +x phpbrew
sudo cp phpbrew /usr/bin/phpbrew
```

##初期化

```
phpbrew init
```

##バージョンの確認

```
# phpbrew known
    Available stable versions:
      5.5 versions:    5.5.12, 5.5.11, 5.5.10, 5.5.9, 5.5.8, 5.5.7, 5.5.6, 5.5.5
      5.4 versions:    5.4.28, 5.4.27, 5.4.26, 5.4.25, 5.4.24, 5.4.23, 5.4.22, 5.4.21
      5.3 versions:    5.3.28, 5.3.27, 5.3.26, 5.3.25, 5.3.24, 5.3.23, 5.3.22, 5.3.21
```


##最新を入れる

```
phpbrew install 5.5.12 +default
```

怒られた。
```
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
configure: error: Please reinstall the BZip2 distribution
```

足りないものをインストール
```
sudo apt-get install re2c bzip2
sudo apt-get install libbz2-dev
sudo apt-get install libmcrypt
```

もう一回。

```
phpbrew install 5.5.12 +default
```

いけたーーーー。

```
To use the newly built PHP, try the line(s) below:

    $ phpbrew use php-5.5.12

Or you can use switch command to switch your default php version to php-5.5.12:

    $ phpbrew switch php-5.5.12

Enjoy!
```

##インストールしたPHPを選択する。

```
phpbrew switch php-5.5.12
```

簡単ですねー。
mbedのスタートアップ処理

mbedLPC1768のmain()に来る前のスタートアップ処理を覗き見してみました。

http://nora66.com/mbed/mbed-src.html#2014/05/09startup


ごく普通のコードみたいで、特に変わったことも無いような･･･って、RAMのクリアとかコピー処理が無い！
ほえぇぇ？？？　ぇぇぇ？？？？
DebianにBCM43142のモデルWIFI接続用ドライバーをインストールする。


ブラジルに売ってある、Lenovoのノートパソコンを買ってきてDebianを入れて
WIFIが認識されなかった。

lspciでハードを確認

```shell

lspci -k | grep Network

```

最新版をUbuntuのリポジトリから取得してくる！

```shell

# wget http://de.archive.ubuntu.com/ubuntu/pool/restricted/b/bcmwl/bcmwl-kernel-source_6.30.223.141+bdcom-0ubuntu2_amd64.deb

# apt-get install dkms libc6-dev linux-libc-dev

# dpkg -i bcmwl-kernel-source_6.30.223.141+bdcom-0ubuntu2_amd64.deb


```

これで、認識されました。

めでたし、めでたし。

ちょっと、調べるのに時間がかかったのでメモしておきます。
Keynoteに日本語コメントを含むコードをSyntaxHighlightしたい

Ruby初学者向けにスライドを作っている間に、
Keynoteに日本語コメントを含むコードを、シンタックスハイライトしたいと考えました。

見つけた日本語を含まないコードのシンタックスハイライトのする手法(rtf)は2つありました。

# brew パッケージ highlightを使う方法

```zsh
 $ brew install highlight
 $ highlight -O rtf foo.rb | pbcopy
```

しかし、日本語を含んでしまうと、
クリップボードにコピーされてないです。

これの解決方法はわかりませんでした。

# Pygments を使う方法

```zsh
 $ easy_install pygments
 $ pygmentize -O encoding=utf-8 -O style=monokai -f rtf -g hoge.rb | pbcopy
```

これは、日本語を含んでいると、
クリップボードにコピーされますが、化けます

```text
print "foo" #=> 改”¹行¡Œなし
puts "foo"  #=> 改”¹行¡Œあり‚Š
p "foo"     #=> デƒ‡バッƒƒグ‚°用”¨途€”
```

Keynoteにはrtf形式の他、html形式でも貼れるようですので、そっちで試してみます。

# 結論は Vim
[Vimでの見た目そのままにソースコードをKeynoteのスライドに貼り付ける方法](http://blog.sorah.jp/2011/07/03/vim2keynote)
をすることで解決しました。。。
**選ぶブラウザは、Chromeではダメでした。**

できればコマンドライン上でやりたかったですが、致し方ないです。

試してないですが、Emacsでもできるみたいです。
[Emacsでの見た目そのままにソースコードをKeynoteのスライドに貼り付ける方法](http://kakutani.com/20110703.html#p01)
Mac OS Xでスリープ、復帰時の通知を扱う

Objective-CでOS Xがスリープ、復帰するときの通知を受け取るには。

ここに書いてあった。

[Registering and unregistering for sleep and wake notifications](https://developer.apple.com/library/mac/qa/qa1340/_index.html)

```objc
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Setup system event notifications
    [self fileNotifications];
}
- (void) fileNotifications
{
    //These notifications are filed on NSWorkspace's notification center, not the default
    // notification center. You will not receive sleep/wake notifications if you file
    //with the default notification center.
    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self
                                                           selector: @selector(receiveSleepNote:)
                                                               name: NSWorkspaceWillSleepNotification object: nil];

    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self
                                                           selector: @selector(receiveWakeNote:)
                                                               name: NSWorkspaceDidWakeNotification object: nil];
}
- (void) receiveSleepNote: (NSNotification*) note
{

    NSLog(@"Sleep");

}

- (void) receiveWakeNote: (NSNotification*) note
{

    NSLog(@"Awake");
}
```