OmniAICreator/Qiita-1.07M huggingface dataset:
ASP.NET Web APIを使ってAzure上にWeb APIサーバをつくる

「Hello World」と返すだけのWeb APIサーバーをつくってみましょう。

**Azure SDK**をダウンロードしておきます。

「新しいプロジェクト」

![Windows_7.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/dd26e51e-60c8-b637-a8d4-afffc71fe4a0.jpeg)

「Visual C#」→「Web」→「ASP.NET Webアプリケーション」→「OK」

![Windows_71.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/e3bc6ef9-27a4-9d30-a8f0-c77230b4d0c6.jpeg)

「Empty」→「Web API」→「OK」

![Windows_72.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/caf29d4d-b742-f5cc-3947-455ffd39fc2f.jpeg)

「App Service plan」はてきとうに「TrialServicePlan」とでもしておきましょう。「Resource group」は「Default-Web-NorthCentralUS」を選びます。

![Windows_73.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/1e9aaf0a-adc7-9290-f327-6f614dea75ac.jpeg)

しばらく待つとアプリケーションがAzureに正常にデプロイされたメッセージが表示されます。

![Windows_74.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/078e6009-acdd-528a-8f05-f128baf9d59a.jpeg)

Controllersフォルダに「Web API 2 コントローラー」を追加します。

![Windows_75.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/d76473c7-bc2b-b7ad-0711-819163972657.jpeg)

名前は**HelloWorldController.cs**とし、以下のように編集します。

```csharp:HelloWorldController.cs
namespace CloudbitWebapi_p150713.Controllers
{
    public class HelloWorldController : ApiController
    {
        // /api/HelloWorld
        public string Get()
        {
            return "Hello world";
        }
    }
}
```

それでは実行してみましょう。

![Windows_76.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/5f436867-1ae2-53e7-731e-a616d8e0af85.jpeg)

「localhost:xxxx/api/HelloWorld」にアクセスすると、XMLが返ってきます。

![Windows_77.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/bba8f94e-d71d-213e-6628-7b5ca5efbd5d.jpeg)

XMLはイマイチなのでJSONを返すようにしましょう。

App_Startフォルダの**WebApiConfig.cs**を以下のように編集します。

```csharp:WebApiConfig.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Net.Http.Headers;  // <---追加

namespace CloudbitWebapi_p150713
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API の設定およびサービス

            // Web API ルート
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            // 次の行を追加
            config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html") );
        }
    }
}
```

するとJSONが返ってきます。

![Windows_78.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/53c7bbbc-b0bf-3c50-3e52-6fb463590507.jpeg)

あとはAzureに発行してお終いです。

![Windows_79.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/a1f5489d-87e9-b5db-205f-25af71adc3b0.jpeg)


お疲れさまでした！

---
ブログやっています：http://weed.nagoya
機械学習と戯れる：足し算ゲームを強化学習で学習できるか？


はじめに
========

強化学習という分野を初めて認識したので、簡単なお題を強化学習で対応できるかをやってみることにします。

* [DQNの生い立ち　＋　Deep Q-NetworkをChainerで書いた](http://qiita.com/Ugo-Nama/items/08c6a5f6a571335972d5) ： きっかけになった記事
* [強化学習](http://www.sist.ac.jp/~kanakubo/research/reinforcement_learning.html)： ε-Greedy法 について参考にしました

今回のは ChainerとかDeepLearningは関係ない話です。


お題: 足し算ゲーム
======
ゲームの基本は足し算です（？）よね。

ゲーム
------
* 状態S: 0~9 の整数
* アクションA: 1~4の整数
* 次状態S': (S + A) % 10
* 報酬R:
	* +1:  S' == 7
	* -100: S' in (5, 9)

というゲームを考えます。

要するにプレイヤーには ０〜９の数字が提示され、それについて １〜４ の数字で答える(A)というものです。
そして次の状態が 7 になれば 1点もらえて、 5か9になると -100点されます。この「報酬」は次のターンになったときにゲーム環境からプレイヤーに知らされます。

現在の状態(S)と次の状態(S') は `S' = (S + A) mod 10` という単純な関係ですが、それはプレイヤーには知らされていません。

学習の評価
------
「100回アクション（ターン）した際の報酬Rの総和」とします。
基本的に３ターンで１つ報酬がもらえるので、100ターンの報酬上限は３３〜３４になります。

実験
----

[実験に使ったコードはこちら](https://github.com/mokemokechicken/PlayingChainer/blob/master/src/reinforce1/adding_game.py)になります。

Q-Learning というのをそのまま実装したつもりです。

ゲーム環境を表しているのが `AddingGame` classで、 QLearning を実装したのが `QLearningPlayer` になります。

`QLearningPlayer` は ひたすら `action(state, last_reward)` Methodを呼ばれるので、 `action` (1〜4の整数値) を return するのが義務になります。
training モードのときは、 「E-Greedyによるランダムな行動選択」「QTableの更新」を行いますが、そうでないとき(評価モード)は、今信じている最善の行動を返すのみです。

結果
------

QTableの初期値はRandomなので、それによって学習の進捗はかなり違うのですが、
一例を示すと以下のようになります。

このグラフは **「100turn Trainingモード」 → 「100turn 評価モード」**
を繰り返したときの「評価モード」フェーズの報酬の総和の推移をグラフにしたものです。

![スクリーンショット_2015_07_13_12_10.png](https://qiita-image-store.s3.amazonaws.com/0/11124/ed015a36-fcbc-9be8-8e7b-ee1ad5e82fdb.png "スクリーンショット_2015_07_13_12_10.png")

1500回目の評価辺りで MaxなScoreを出しています。この後も安定してこのScoreを出します。
※ちなみに1回目は-3300というScoreだったですが、グラフが見難くなるので切ってます。

あと（約20回くらい試したうち）1度だけScoreが25のまま33にならない時がありました。
こんな単純な問題でも局所最適解から抜けられないということがあるようだ、ということなのでしょうか。
興味深いです。

さいごに
======

今回は 状態Sの種類が10個しかないのでこういう実装でもOKですが、
状態Sが画面のピクセル数にもなると全く適用できないのはまあ間違いないでしょう。

そこで DeepLearning的な何か の出番なのだと思いますが、
まだイマイチちゃんとイメージできていないので、もうちょっと勉強しよう。。

続き：[足し算ゲームをChainerを使って強化学習できるか？](http://qiita.com/mokemokechicken/items/aa1535696514bfe51329)
技術英語 > meteorology > meteor + o + logy

meteorology
rとlどちらが先に出てくるか覚えていない。

meteor: 隕石
に
logy
がくっついたものと覚えればよさそう。
(meteol というスペルミスはしないので）

logyで終わる単語は多いので、こちらもrogyとは間違うことはなさそう。
audiology
chronology
phychology
など。
略語 > 気象関連 > Aeronautical meteorology abbreviations / METAR and TAF Weather Reports 

気象関連の言葉の略語へのリンク

コンポーネントの名前に略語を使うのがいいのか迷いどころではあるが、使うとしたら以下のようなリンクは参考になりそう。

<hr>
Aeronautical meteorology abbreviations.
http://www.ebzw.be/abbreviationsmeteocontent.html
> MET : Meteorological, meteorology

<hr>
METAR and TAF Weather Reports 
http://www.moratech.com/aviation/metaf-abbrev.html
> MET : Meteorological

他にもたくさんの略語が紹介されている。
JavaでselectBySqlFileを使って複数レコードを取得してコンソールに表示させる方法

MySQLで下記のようなテーブルがあるとする。


![yamato_table.gif](https://qiita-image-store.s3.amazonaws.com/0/75451/9496d766-221b-2288-b53b-da3fcd85c605.gif)

selectBySqlFile を使って、レコードを取得する。下記のように実装する。

  	List<BeanMap> results = this.selectBySqlFile(BeanMap.class, 
		"yamato_sql/yamato.sql").getResultList();
	java.lang.System.out.println("yamatokenりざると: "+results);

ここで、yamato_sql フォルダ内の yamato.sql には、下記のようなクエリを記述しておく。

    select id, name from yamato

コンソールへの表示結果は下記のようになる。

    yamatokenりざると: [{id=1, name=kenichiro}, {id=2, name=harumi}, {id=3, name=makiko}, {id=4, name=shouji}]
RedomeBlock - redo-me-uk blocker Chrome Extension


https://chrome.google.com/webstore/detail/redomeblock/mgofjbehiiocjdpcdgkdegojaogpbnff

redo.me.ukはURL短縮サイトですが、プロキシとしての側面を持っています。
「Replace [A] with [B]」という入力欄があり、HTML中のAを全てBに置換する機能のようです。
で、短縮URLの後ろに別のURLを付けることでこのルールを他のサイトにも適用できるという触れ込みのようです。
この機能こそが、巷で話題のパクリサイト構築の肝になっているわけです。

redo.me.ukなサイトに繋いだ時、この「別のURL」を認識して元のサイトに誘導するChrome拡張を作りました。
別なURLが検出できない場合は普通につなぎに行きますので、URL短縮サイトの部分には影響を与えず、パクリ部分だけを無効化できているように思います。

別のサイトにもルールを適用する機能は失われますが、大したことでは、ないはず＾＾；
AWSアカウントを取得してから行う初期設定

# AWSアカウントを取得してから行う初期設定

AWS Config や VPC Flow Logs といった標準で有効にしてても良さそうな機能が増えてきたのでメモ。
CloudFormationで一発で設定できたら最高なんですが、IAMのパスワードポリシーとかいじれない項目がいくつかあったはず。

## 監査ログ記録のためCloudTrailの有効化
* 必要に応じてアーカイブ用のS3バケットを作成する
* アラート設定はお好みで

> 参考：[AWS管理コンソールの不正ログインをCloudTrail と CloudWatch Logsで検知する](http://dev.classmethod.jp/cloud/aws/aws-cloudtrail-cloudwatch-logs-badip/)
> 参考：[全リージョンのCloudTrailロギングを有効にするワンライナー](http://qiita.com/j3tm0t0/items/ebc74903c4cf9b25e248)

## 構成履歴記録のためAWS Configの有効化
* こちらもアラート設定はお好みで

> 参考：[AWS ConfigでAWSリソースの変更管理をする](http://blog.cloudpack.jp/2014/12/02/manage-updates-of-aws-resources-with-aws-config/)
> 参考：[[新サービス] AWS Configを触ってみた #reinvent](http://dev.classmethod.jp/cloud/aws/aws-config-ataglance/)

## ログ保存用のS3バケットのローテート
* 必要に応じてCloudTrailやAWS Configのログに対してS3のLifecycleポリシーで定期的にログを削除 or Glacierへアーカイブする

> 参考：[Amazon S3でオブジェクトの有効期限を設定できるようになりました](http://dev.classmethod.jp/cloud/amazon-s3-object-expiration/)

## パスワードポリシーの変更
* 標準の状態だと強度の低いパスワードも設定可能なので任意でパスワードポリシーを設定する  

> 参考：[IAM ユーザー用のアカウントパスワードポリシーの設定](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/Using_ManagingPasswordPolicies.html)

## IAMアカウント・グループの作成
* ルートアカウントは何でも出来るので使わない
* 運用ルール（個人単位、部署単位、ベンダー単位、etc）に応じてIAMアカウントを発行する
* アカウント作成にあたり特に理由がなければAPIキーは発行しない

> 参考：[【AWS】アカウント作成後の初期設定（IAMユーザーとグループ作成・Password Policy設定）](http://www.task-notes.com/entry/20141021/1413901474)

## MFA（2段階認証）の設定
* 必要に応じて設定する
* ルートアカウントは特に推奨

> 参考：[AWSアカウントのセキュリティを強化する 〜 MFAの利用](http://dev.classmethod.jp/cloud/aws/secured-aws-account-by-mfa/)
> 参考：[AWSアカウント作ったらこれだけはやっとけ！IAMユーザーとAuthyを使ったMFAで2段階認証](http://qiita.com/yoshidashingo/items/cd206daca0596659b440)

## ネットワーク設計を行い必要に応じてVPCを作成する
* 今後の拡張性を考慮（拠点間VPNやVPC Peeringによる他NWとの接続）
* そもそもVPCが必要か（EC2やRDSを必要とするシステムか）

> 参考：[VPC とインターネットゲートウェイをセットアップする](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/GettingStartedGuide/Wizard.html)
> 参考：[ELBをVPC内に設置する際のサブネット設計の注意点](http://qiita.com/tetor/items/4c9e1aa58da2c5755452)

## VPC Flow Logsの設定
* パケット取得や調査の要件がある場合
* 現状特にデメリットも見当たらないので、何かあった時に備えてとりあえず有効にしておくのでも良さそう

> 参考：[【新機能】VPC Flow LogsでVPC内のIPトラフィックを監視することができるようになりました!](http://dev.classmethod.jp/cloud/aws/introduce-to-vpc-flow-log/)

# 番外編：EC2構築時にやること

## IAM Roleの作成
* 特にAPIを使う予定がない場合でも、何もPermissionを設定しない状態でIAM Roleは作成しておくこと

> 参考：[AWS EC2インスタンス用のIAMロール作成手順](http://qiita.com/na0AaooQ/items/3ec5f8b80150c37a0566)

## EC2 Mailの上限緩和
* EC2からメール送る場合は上限緩和しておかないとすぐメールがスタックする
* ユーザ宛のメール送信はもとよりシステムのアラートメールなどを送る場合でも行うこと

> 参考：[EC2インスタンスからメール送信のための準備](http://blog.cloudpack.jp/2015/03/23/prepare-to-send-mails-from-amazon-ec2-instance/)
Mantisのニュースを改行表示にする

`HTML`表示時に、改行をそのまま表示していたのでタグに変換する。


# <i class="fa fa-plus"></i> ニュース有効方法

```php:mantisbt/config_inc.php
$g_news_enabled = ON; // 変数から新規追加
```

デフォルトはOFFらしい。
`config_defaults_inc.php`はできるだけ書き換えないほうが良いらしい。
ブラウザからも設定は追加・変更できる。

# <i class="fa fa-code"></i> 修正箇所

```php:mantisbt/core/print_api.php

function print_news_entry( $p_headline, $p_body, $p_poster_id, $p_view_state, $p_announcement, $p_date_posted ) {

        // 前略

        $t_body = nl2br($t_body); // 改行文字を<br>に

        $output .= '</td>';
        $output .= '</tr>';
        $output .= '<tr>';
        $output .= "<td class=\"news-body\">$t_body</td>";
        $output .= '</tr>';
        $output .= '</table>';
        $output .= '</div>';

        echo $output;
}

```

作成したニュースは生のまま`mantis_news_table`テーブルに保存されています。
出力時も生のまま使うので、HTML上では改行は無効化されます。
ソースを見ればひと目で分かりましたが、気づいたのはPHPのプリントデバッグ後でした…
完ッ全に**ニュース用に改行を取り除いているんだろう。ニュースっぽく？**って思っていました。
なので、`$t_body = nl2br($t_body)`と改行文字をタグに変換しています。

最新版ではアウトプットあたりに修正が見られますが、おそらくまだ未改行に見えるコードでした。

# <i class="fa fa-desktop"></i> 表示例

## 投稿画面

![新規ニュース.png](https://qiita-image-store.s3.amazonaws.com/0/62354/64d96718-1ab9-71f2-b9e7-73334d5c3d85.png)

## デフォルト表示

![ニュースデフォルト.png](https://qiita-image-store.s3.amazonaws.com/0/62354/9039d524-6af1-64d4-bb01-31dad33b9430.png)

## 改行表示

![ニュース改行後.png](https://qiita-image-store.s3.amazonaws.com/0/62354/13d0bf60-fc59-2267-dcd9-3b870ce1c174.png)
AndroidでGoogleMap表示するまで

ただの手順メモ。

# Project作成

Create New Project > Add an Activity to Mobile > Google Maps Activity

![GoogleMapsActivity.png](https://qiita-image-store.s3.amazonaws.com/0/15000/ed4e1a73-61ab-a4e0-e72d-89230f73354f.png)

# API KEY作成

Google Developer Consoleにアクセス

- https://console.developers.google.com/

1) Google Maps Android API を有効にする

![step1_enable_map_service.png](https://qiita-image-store.s3.amazonaws.com/0/15000/14e30b21-f514-85be-3a95-5cbd3ca72a57.png)

2) 公開APIへのアクセス > 新しいキーを作成

![step2_create_public_key.png](https://qiita-image-store.s3.amazonaws.com/0/15000/c2133d55-f3dc-893d-c7f8-dd24279175c7.png)

3) インストールされているアプリケーションを選択

![step3_click_installed_application.png](https://qiita-image-store.s3.amazonaws.com/0/15000/607d90b7-367e-27b9-7cad-929fbea7fd0f.png)

4) Androidキーを選択

![step4_create_android_key.png](https://qiita-image-store.s3.amazonaws.com/0/15000/5db940ab-5c7f-81ba-6052-c01391e00142.png)

5) 鍵の登録

署名キーのSHA1を下記コマンドで確認

```shell
$ keytool -list -v -keystore myapp.keystore

別名: ...
作成日: 2014/02/17
エントリ・タイプ: PrivateKeyEntry
証明書チェーンの長さ: 1
証明書[1]:
所有者: ...
発行者: ...
シリアル番号: ...
有効期間の開始日: ...
証明書のフィンガプリント:
	 MD5:  ...
	 SHA1: ...
	 SHA256: ...
	 署名アルゴリズム名: SHA1withRSA
	 バージョン: 3
```

`<SHA1_key>;<package_name>` になるように入力する

![step5_finger_print_and_package_black.png](https://qiita-image-store.s3.amazonaws.com/0/15000/e514fa1c-2941-33ea-4471-12ecd8d8ee80.png)

6) API Keyを確認

![step6_key_created_black.png](https://qiita-image-store.s3.amazonaws.com/0/15000/5eff02f7-5b64-fe16-6a96-b6030ae9df81.png)

# API KEYの入力

```xml:res/values/google_maps_api.xml
<resources>
    <string name="google_maps_key" translatable="false" templateMergeStrategy="preserve">
      ココに入力
    </string>
</resources>
```

コレで指定の署名キーで署名したアプリから確認すればOK
DeviseInvitableの使い方

[公式](https://github.com/scambra/devise_invitable)に書かれていることを、端折って日本語で書いただけです。

調べたことの備忘録なので、不定期で更新される可能性があります。
間違っている点や、怪しい日本語訳があると思いますorz

# 環境
Ruby: 2.2.1
Rails: 4.2.3
devise: 3.5.1
devise_invitable: 1.5.1

# Devise

deviseのインストールは、[こちら](http://qiita.com/kehra/items/6fab6ef0661824d0fa0d)の手順で終わっているものとします。

# DeviseInvitable
## インストール
```
$ bundle exec rails g devise_invitable:install
      insert  config/initializers/devise.rb
      create  config/locales/devise_invitable.en.yml
```

## 初期設定
### モデルの設定
```
# deviseで作ったモデルを指定します（ここでは「User」）。
$ bundle exec rails g devise_invitable User
      insert  app/models/user.rb
      invoke  active_record
      create    db/migrate/20150713020302_devise_invitable_add_to_users.rb
```

## 使い方
`User`モデルを前提で記述します。

devise_invitableのオプションを、モデルに設定します。

```
class User < ActiveRecord::Base
  # deviseのオプションはあえて消しました。
  devise :invitable
end
```

```
# 該当カラム
t.string     :invitation_token
t.datetime   :invitation_created_at
t.datetime   :invitation_sent_at
t.datetime   :invitation_accepted_at
t.integer    :invitation_limit
t.references :invited_by, polymorphic: true
t.integer    :invitations_count, default: 0
t.index      :invitations_count
t.index      :invitation_token, unique: true # for invitable
t.index      :invited_by_id
```

## 任意の設定
### ビュー
カラムを追加したり、デザインを変えたりする場合は、テンプレートのビューを`app/views/devise`配下に作成。

```
$ bundle exec rails g devise_invitable:views
      invoke  DeviseInvitable::Generators::MailerViewsGenerator
       exist    app/views/devise/mailer
      create    app/views/devise/mailer/invitation_instructions.html.erb
      invoke  form_for
      create    app/views/devise/invitations
      create    app/views/devise/invitations/edit.html.erb
      create    app/views/devise/invitations/new.html.erb
```

### コントローラ
デフォルトの処理から変更したい場合は、devise_invitableのコントローラをoverrideする。
※deviseと違い、ジェネレータは用意されていません。

```
class Users::InvitationsController < Devise::InvitationsController
  def new
    super
  end

  def create
    super
  end

  def edit
    super
  end

  def update
    super
  end

  def destroy
    super
  end
end
```

続いて、ルーティング設定を行います。

```
# routes.rb
# overrideするコントローラを指定
devise_for :users, controllers: {
  invitations: 'users/invitations'
}
```

#### 追加カラム
Strong Parameterを有効にしていて追加カラムがある場合は、permitの設定をする必要があります。
※deviseと共通です。

```
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    # アカウント登録時に「username」を追加した場合
    devise_parameter_sanitizer.for(:invite) << :username
  end
end
```

`for()`で指定できるシンボルは、以下の3点です。

- `:invite`: 招待メールを送る時
- `:accept_invitation`: 招待メールからアカウント情報を登録する時
FuelPHPでZipファイル作成

 - いい加減アクセスのたびにMySQL読みに行くのが重い
 - cronで最新データを取得、ファイルを作成してキャッシュの代わりにする
 - cron用のサーバーからアプリケーションサーバーへzipファイルを送信する
	 - ユーザー閲覧時にはappサーバーでローカルファイルの読み出しだけを行う

みたいな話。
FuelPHPタグ付けておきながら中身は普通のPHPです。ご容赦ください(´@ω@｀)

## 前提

FuelPHPにはZip作成が無いみたいなのでPHPからZipを作成できるようにしておく必要があります。
コンソールで ```php -m``` を叩いてzipが入っていればよし、無ければzip.soを読み込んでやります。
当方の環境(さくらVPS、CentOS6.6)では/usr/lib64/php/modules/にありました。参考までに。

## ファイル作成

MySQLにアクセスしてデータを取得、JSONファイルを作成します。

```
$folowerList=Model_Folower::getAll();
        foreach($folowerList as $folower){
            $id = $folower['screen_name'];
            $new =       Model_Folower::getNewTweetList($id);
            $contents = array("new"=>$new);
            File::create(APPPATH."tmp/data/",$id.".json",json_encode($contents));
        }
        
        $zipPath=Model_Zip::createFeedZip();
        if($zipPath==false){
            $this->response(array('status'=>500));
        }...
```

ちょっとこの後の処理をどうしようかは悩んでるので取り敢えずここまで。
ファイル作成とZip作成処理の呼び出しが見えればいいかなっと

## Zip作成

``` Model_Zip.php
    public static function createFeedZip()
    {
        $zip = new ZipArchive();
        $zipFileName = date("YmdHi") . '.zip';
        $zipFilePath = APPPATH . "tmp/zip/";
        
        $result = $zip->open($zipFilePath . $zipFileName, ZipArchive::CREATE);
        if ($result != true) {
            return false;
        }
        $filePath = APPPATH . "tmp/data";
        $folder = scandir($filePath);
        
        foreach ($folder as $file) {
            if (is_dir($file))
                continue;
            $zip->addFile($filePath . DS . $file, $file);
        }
        
        if ($zip->close()) {
            // 成功
            return true;
        } else {
            // 失敗
			 return false;
        }
    }
```

scandirでさっき作成したjsonファイルの一覧を取得し、forループでZipに登録していきます。
scandirは.やら..も一緒に取得してしまい、これを含むとうまくZip作成ができないためis_dirで取り除いています。

add_fileの第二引数は上書きするファイル名。
第一引数でZipに追加するファイルをパスで指定しているんですが、第二引数なしだとフォルダ構成ごと圧縮されてしまったので注意。
ちなみに圧縮されたのはフォルダ構成だけで、フォルダごと圧縮できるわけではありません。
フォルダごと圧縮するにはLINUXコマンド使うしか無いんですかね。今回使わないんでいいですけど別に。
OSXの暴走を止める方法

# 環境
OSX Version 10.9.5

# 問題
systemstatsdのプロセスのCPUが99%くらい利用して重たい

# 解決

以下の方法で解決した

```
$ sudo launchctl stop com.apple.systemstatsd
$ sudo launchctl stop com.apple.systemstats.analysis
$ mkdir /Users/Shared/oldsysstats
$ sudo mv /private/var/db/systemstats/* /Users/Shared/oldsysstats
$ sudo reboot
```

参考：
[mac osx maverics systemstats 暴走](http://d.hatena.ne.jp/name774a/20140508)
reveal.jsで作った資料をChromeでPDF出力する方法

reveal.jsでの資料の作り方の説明はここではしない。

webサーバを起動して作った資料のurlをGoogle Chromeで開く。たとえば、ブラウザでプレゼンをするとき、`http://localhost:8080/test-presentation/#`というurlになるのであれば、PDF出力する際には`http://localhost:8080/test-presentation/?print-pdf/#`というurlをまずChromeで表示する。`print-pdf`という文字列を挿入する必要がある理由は、`index.html`に以下の記述があるためである。

```html:index.html
<!-- Printing and PDF exports -->
<script>
  var link = document.createElement( 'link' );
  link.rel = 'stylesheet';
  link.type = 'text/css';
  link.href = window.location.search.match( /print-pdf/gi ) ? '../reveal.js/css/print/pdf.css' : '../reveal.js/css/print/paper.css';
  document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
```

Chromeで開いたら、以下の操作によりPDF出力ができる。
1. __Destination__の項目を__Save as PDF__に変更する。
2. __Layout__の項目で__Landscape__を選択する。
3. __Margins__の項目で__None__を選択する。
4. __Save__をクリックする。
jQueryのメソッド（備忘録）


# .on()メソッド
## イベントの定義
たとえば、.click()はこの.on()メソッドを呼び出している。

```
$('element').click(function() {
    // 処理内容
});
```

.on()を使うと

```
$('element').on('click', function() {
    // 処理内容
});
```
と書ける。

## 機能
### 一度に複数のイベントタイプを定義できる。（半角スペース区切り)
```
$('element').on('event1 event2', function() {
    // 処理内容
});
```
### 複数のイベントとイベントハンドラを一括定義できる。
```
$('element').on({
    'event1': function() {
        // 処理内容
    }
    'event2': function() {
       // 処理内容
   }
});
```
### データを渡せる
```
.on(events [, selector] [, data], handler(eventObject) );
```
dataにキーと値の組み合わせのデータを渡しておくとそのイベントが発生した時にイベントオブジェクトを通してevent.dataにその値が格納され、イベントハンドラから扱えるようになる。
→共通のイベントハンドラを使って異なる処理ができる。

# .bind()と.delegate()
jQuery1.7で.on()が実装されるよりも前は、別のイベント定義用のメソッドが使われていた。
現在は.on()を使うことが推奨されているが、要素に直接イベントを定義するには.bind()、祖先要素にイベントを定義するには.delegate()を使うことで.on()と同じ機能を実装できる。
.on()では引数の渡し方でバインドとデリゲートを分けているので、パッと見分かりにくい。
→.bind()と.delegate()を使い続けることもある。

```
$('element').on('event', function() { // 処理内容 });
$('element').bind('event', function() { // 処理内容 });

$('element').on('event', 'element', function() { // 処理内容 });
$('element').delegat('element', 'event', function() { // 処理内容 });
```
MacのサービスとしてJavaScript/CoffeeScriptを実行する


# 概要
Macの「サービス」ってありますよね。
これ使って、任意のエディタ上に入力したJavaScript/CoffeeScriptのコードを実行させてしまおうという記事です。

実は以前、[Rubyバージョンを作成された方](http://d.hatena.ne.jp/r_kurain/20130219/1361270262)がおられまして、それが元ネタです。すみませんアイデア丸パクリですｗ

# 準備

まずはNode.jsをインストールしましょう。ちなみに私はnodebrewというnode.jsの環境構築ツールを使いました。
次に、CoffeeScriptもインストールします。

```bash
$ npm install -g coffee-script
```

あと、今回のサンプル用に、何らかのパッケージも読み込んで利用できることを示すために、d3パッケージをインストールします。

```bash
$ npm install -g d3
```

# 環境構築

Automatorを起動します。今回は２つのサービスを作ります。１つがJavaScript用、もう一つがCoffeeScript用です。

## JavaScript用のサービス

Automatorで新規書類を作成し、種類は「サービス」にします。
ウィンドウが開いたら、「シェルスクリプトを実行」というアクションを右ペインにドラッグ＆ドロップしましょう。

次に、「入力の引き渡し方法」を「引数として」にします。

そして肝心のコードですが、以下を入力します。

```bash
export NODE_PATH=/Users/emadurandal/.nodebrew/current/lib/node_modules:$NODE_PATH
/Users/emadurandal/.nodebrew/current/bin/node --harmony -e "$1" 2>&1 || echo;
```

NODE_PATHやnodeコマンドのパスは、各自のみなさんの環境のものに置き換えてください。ちなみにNODE_PATHを指定する理由は、エディタに入力するJavaScriptコードで、パッケージをrequireするときに、パッケージがちゃんと見つかるようにするためです。

以下の様な感じになりましたか？

![スクリーンショット 2015-07-13 9.49.31.jpg](https://qiita-image-store.s3.amazonaws.com/0/12753/a366c07c-1cd6-b466-cdef-cc706831d14f.jpeg "スクリーンショット 2015-07-13 9.49.31.jpg")

--harmonyオプションをつけているので、ECMAScript2015(いわゆるES6)の文法も使えます。

## CoffeeScript用のサービス

さて、２つ目、今度はCoffeeScript用です。
Automatorで新規サービスを作成し、JavaScript用と同じ設定をします。違うのはコード部分だけでして、以下のようにします。

```bash
export NODE_PATH=/Users/emadurandal/.nodebrew/current/lib/node_modules:$NODE_PATH
PATH=/Users/emadurandal/.nodebrew/current/bin/:$PATH
/Users/emadurandal/.nodebrew/current/bin/coffee -e "$1" 2>&1 || echo;
```

これも、各パスは皆さんの環境に置き換えてください。

# さっそくためしてみよう！

何か、エディタを立ち上げてください。そして、例えば以下の様なJavaScriptコードを入力します。

```javascript
var d3 = require('d3');
d3.entries({"hoge": 32, "piyo": 43}).forEach((elm)=>{
	console.log(elm);
})
```

そしたら、このJavaScriptコードの文字列を選択して、サービスメニューから先ほど保存したサービスを選びます。

![スクリーンショット 2015-07-13 9.41.00.jpg](https://qiita-image-store.s3.amazonaws.com/0/12753/54a2ed11-eaa1-a3fc-4e78-232c4ad2b923.jpeg "スクリーンショット 2015-07-13 9.41.00.jpg")

すると、

```
{ key: 'hoge', value: 32 }
{ key: 'piyo', value: 43 }
```

おお、ちゃんと実行されてます。ね、簡単でしょう？（ボブ・ロス風）

もちろん、CoffeeScriptコードも同様に実行できます。上記JavaScriptコードをCoffeeの文法に書き換えて、ぜひ試してみてください。

# まとめ

さて、これ、何の役に立つのか。そうですねぇ。

* Emmet的な、何らかの大量の文字列データの生成に使う。
* エディタ上でさくっとJavaScript/CoffeeScriptをプレイグラウンド的に試すために使う（文法を間違えるとちゃんとエラー文が出てくれますので）

って感じですかねー。後者は別にnodeコマンドとかAtomエディタのscriptパッケージでもできるじゃん、という話なので、やはり前者の用途が一番でしょうか。

何か、こんなことにも使えたよーという方いらっしゃったらぜひ教えてくださいｗ
【Linux, パーミッション】グループ開発をするときのディレクトリの権限設定


## 新規開発用グループの作成

### グループ作成方法

groupaddコマンドを使用して新規開発用グループを作成

	groupadd [グループ名]

### グループ作成コマンド例

	groupadd hogehoge


## 開発ユーザを開発用グループに追加

### ユーザ追加方法

gpasswdコマンドを使用して、新規開発用グループに開発ユーザを追加

	gpasswd -a [ユーザ名] [グループ名]

### ユーザ追加コマンド例

	gpasswd -a nishide hogehoge


## 共有ディレクトリのパーミッション設定

### 共有ディレクトリのパーミッション設定方法

開発用ディレクトリにSGIDを設定

	chmod -R 2775 [ディレクトリ名]

### パーミッション設定コマンド例
/var/www/htmlのディレクトリ以下にSGIDを設定

	chmod -R 2775 /var/www/html
	chmod -R g+s /var/www/html
Chainerで機械学習と戯れる： k/Nの実数入力から k を出力できるのか？


はじめに
=======

[前回：加算と減算を同時に学習できるか？](http://qiita.com/mokemokechicken/items/81cea0ea2400451acf0d) は加算と減算を同時にできるのか、ということについて試してみました。「加算」「減算」単体ではうまくいきましたが、「加算と減算を入力で切り替える」のはどうもやり方が悪いのかできませんでしたが。。。

今回は、今まで整数kの入力するのに２進法で表現していましたが、そもそも入力には実数値がとれるので、k/N を入力としたときにkが出力できるのか試してみます。できて当たり前のような気もしますが、頭の中にその式がすぐに浮かんでこなかったので実際に試してみます。

お題:k/Nの実数入力から k を出力できるのか？
====
問題
-------
* 問題： 0~1の実数を 0~Nの出力に対応させる学習ができるか
* 入力： １つの k/N (k=0~N) という実数 (入力層は1個)
* 出力： k に対応する Nodeを１にする (出力層は N+1個)

例えば、N=4だとして、 
0 -> 0.0, 1 -> 0.25, 2 -> 0.5, 3-> 0.75, 4 -> 1.0 
という入力から、対応する出力のNodeを１にするという問題です。

実験
-------

[実験に使ったソースコードはこちら](https://github.com/mokemokechicken/PlayingChainer/blob/master/src/play3/float_to_digital.py)です。

Nは 2~8 の間で試してみました。中間層は適当です（あってもなくても学習できたので）。

結果
-------

問題なく学習出来ました。なるほどー

追加のお題: ２つの k1/N, k2/Nの実数入力から k1+k2 を出力できるのか？
=========

前のお題の発展です。

問題
------
* 問題： 0~Nの整数を0~1の実数にMappingした入力を２つとり、その足し算を0~2Nの対応するNodeに出力することを学習できるか
* 入力： ２つの k1/N, k2/N (k1,k2 = 0~N) という実数 (入力層は2個)
* 出力： k1+k2 に対応する Nodeを１にする (出力層は 2N+1個)

実験
----

[実験に使ったソースコードはこちら](https://github.com/mokemokechicken/PlayingChainer/blob/master/src/play4/add_floats_to_digital.py)です。

結果
-----

これも問題なく学習出来ました。

さいごに
=========

この実験から、例えば、ゲームにおいてあるマスのオブジェクトがN種類あり得る場合、
１マス辺り１Nodeで表現しても良さそうです(あるマスのオブジェクトkはk/Nとして入力する）。
マスごとにK個の入力Nodeを用意する必要が無いというのは結構便利ですね。

DQNでAtariのゲームをやったときも、ピクセルのRGBをGrayScaleに変換したものを入力にしたようですし、そんな感じでやっても良いっぽいです。

[次回:足し算ゲームを強化学習で学習できるか？](http://qiita.com/mokemokechicken/items/f1b71170d332c0543db8)

[ログファイルの行から /apple/i を含む行を見つける、を学習できるか？](http://qiita.com/mokemokechicken/items/37ed5da4a74c1b8224bb)
【デザインパターン】Mediatorパターン

##概要
オブジェクト群の相互作用をカプセル化するオブジェクトを定義するパターン

以下の3種類のクラスからなる
1. Mediatorクラス(3.と通信するためのインターフェイスを定義)
2. Concrete Mediatorクラス(Colleagueオブジェクトを保持し、それらの協調的な振る舞いを実装する)
3. Colleagueクラス(1.のインターフェイスを介してのみ他のCollegueオブジェクトと通信する)

##具体例と実装
学校で撮る空中写真を例にすると、

上記1~3はそれぞれ

1. 配置指示クラス(Mediatorクラス。撮影者クラスが使うインターフェイスを定義)
2. 撮影者クラス(Photographerクラス。男子生徒、女子生徒に指示を出す)
3. 男子生徒クラス、女子生徒クラス(BoyGroup、GirlGroupクラス。撮影者の指示を受けて、動いたり、帽子の色を変えたり、ポーズを撮ったりする)

が対応する。
コードの詳細は以下

```rb:mediator.rb
class Mediator
  def change_cap_color
  end

  def change_direction
  end
end
```

```rb:photographer.rb
class Photographer < Mediator
  def initialize
  end

  def change_cap_color
    # 赤白帽の色を逆の色にする
  end

  def change_direction
    # 逆向きを向く
  end

  ....
end
```

```rb:boy_group.rb
class BoyGroup
  def initialize(photographer)
    @photographer = photographer
  end

  def change
    @photographer.change_cap_color
    @photographer.change_direction
  end

  def change_color
    @photographer.change_cap_color
  end
end
```

```rb:girl_group.rb
class GirlGroup
  def initialize(photographer)
    @photographer = photographer
  end

  def change
    @photographer.change_cap_color
    @photographer.change_direction
  end

  def change_color
    @photographer.change_cap_color
  end
end
```


##メリット
* Mediatorクラスをサブクラス化刷るだけで振る舞いを変更出来る
* Collegueオブジェクトの結びつきを疎にし、再利用性を高める
* 多対多の相互作用を一対多の関係に置き換える事ができる

##まとめ
協調的な振る舞いを実装したい際に便利なパターン
【デザインパターン】Strategyパターン

##概要
アルゴリズムの集合を定義し、各アルゴリズムをカプセル化してそれらを交換可能にするパターン

以下の3種類のクラスからなる
1. Strategyクラス(サポートする全てのアルゴリズムに共通のインターフェイスを宣言)
2. Concrete Strategyクラス(1.で定義されたインターフェイスのアルゴリズムを実装する)
3. Contextクラス(ConcreteStrategyオブジェクトを備えている)


##具体例と実装
東京〜京都の移動方法の検索を例にすると、

上記1~3はそれぞれ

1. 移動手段検索クラス(TransitSearchクラス、東京〜京都間の移動方法検索に共通のインターフェイスを定義)
2. 格安プラン検索クラス、最速プラン検索クラス(それぞれLowCostSearch、ShortTimeSearchクラス。それぞれ、安さ重視、早さ重視での東京〜京都間の移動手段検索を実装)
3. 出張予約クラス(BuisinessTripReservationクラス。東京〜京都の移動方法の検索結果情報を保持)

が対応する。
コードの詳細は以下

```rb:transit_search.rb
class TransitSearch
  def search(date)
  end
end
```

```rb:low_cost_search.rb
class LowCostSearch < TransferSearch
  def search(date)
    # 指定日の最安移動方法を取得
  end
end
```

```rb:short_time_search.rb
class ShortTimeSearch < TransferSearch
  def search(date)
    # 指定日の最速移動方法を取得
  end
end
```

```rb:buisiness_trip.rb
class BuisinessTrip
  def initialize(transit_search)
    @transit_search = transit_search.search(#{trip_date})
  end

  def transfer_reservation
    reserve(@transit_search)
  end

  def reserve(transit_search)
    #検索結果日程を予約 
  end
end
```

クライアントコード

```rb
# 急ぎの出張
buisiness_trip = BuisinessTrip.new(ShortTimeSearch.new)
buisiness_trip.transfer_reservation

# 金欠出張
buisiness_trip = BuisinessTrip.new(LowCostSearch.new)
buisiness_trip.transfer_reservation
```


##メリット
* 関連するアルゴリズムの集合を再利用出来るよう、Strategyクラスの階層によって定義している
* Contextオブジェクトと独立にアルゴリズムを変更出来るようになる

##まとめ
関連するアルゴリズムをまとめることで、アルゴリズムと、それを利用するオブジェクトとを独立させることができるパターン
FuelPHP+ACCONシステム構成

![システム構成図](https://lh3.googleusercontent.com/cZgHYr6smJLGodWm_Iw2akgQbhHhSj3uioBcAL3S3aM=w566-h400-no "システム構成図")

[拡大](https://photos.google.com/share/AF1QipOCZF2S__FVwOT2AxgX89vbCqGN9xngPBpQc8NRAfgJaaYplVi84T1Ok0F_X3i4gQ/photo/AF1QipNDKt1koHKTkx7ohKxcddNvZhW7MiVHBQdcGlfv?key=bHdVVjA3bVltUHVnUFUxVElKTkUwb3dOdE1HT25n "システム構成図")

* [accon/fuelphp-accon](https://registry.hub.docker.com/u/accon/fuelphp-accon/)
  Webアプリケーション開発・実行環境

* [ACCON](https://kurobuta.jp/books/book/manual/accon/)
  Webアプリケーション開発・実行基盤

* Blog
  ACCONを利用したサンプル（ブログの管理機能と公開機能）

* Service module
  ACCON上で動作するWebアプリケーションサービス

* [accon/ubuntu-nginx-phpfpm-redis-mysql](https://registry.hub.docker.com/u/accon/ubuntu-nginx-phpfpm-redis-mysql/)
  Webアプリケーション開発サーバー

インストール方法は後日
いまさら聞けないIAM

IAMとは、Identity and Access Managementのことです。AWSアカウントの中で、だれが何をできるかをコントロールするためのサービスです。

特徴は、
1.ユーザ、グループ、ロール、パーミッションで設定できます。
2.集中管理：サーバごとに設定する必要がありません。AWSコンソールで集中管理できます。
3.安全性：デフォルトは全禁止。新規IAMユーザがなにもできません。

#ユーザ

みんなが同じAWSアカウント（ルート）を使うのはまだ管理が出来ていない状態です。まずユーザを作りましょう。AWSコンソール及びCLIでユーザを作成できます。

AWSコンソールから作成する手順は、[ここ](http://qiita.com/RyuKahou/items/afd0ad95f6ba5701b86d)をご参照ください。

#パーミッション

新規ユーザはデフォルトでなにもできないので、権限を与える必要があります。
ここでは、最小権限の原則を適用します。すべての操作ができる権限を与えてしまうのは、セキュリティ管理になっていないので、意味がありません。
権限を緩くすることは、厳しくすることより簡単です。まずユーザに最小権限を与えて、必要に応じて新たな権限をあたえば良いです。

他の環境との違うところは、AWSコンソール権限と、API権限に分けていることです。AWSコンソールにサインインするのに、パスワードが必要です。APIを使う際に、アクセスキーが必要です。
ですから、AWSコンソールしか使わないユーザの場合は、アクセスキーを作らないようにしましょう。同様、APIしか使わないプログラマーの場合は、パスワードを設定しないようにしましょう。

＊:＊権限がなんでもできるので、実際の運用上完全になくすことが難しいが、最小限に控えるべきです。

注意すべきなのは、パーミッションはAWSアカウント(ルート)に適用しません。AWSアカウント(ルート)のできることを制限できないのは、AWSアカウントを利用しない最大の理由です。


#グループ

ユーザとパーミッションがあれば、管理できますが、ユーザ一人一人のパーミッションを管理するのは大変です。IAMは、他の環境と同じようにグループをサポートします。

複数のユーザを１つのグループに纏めて同じパーミッションを与えるようにすれば、パーミッションを変更したいとき１回の修正で済むので便利です。さらに、グループの間にユーザを移動できるので、柔軟な管理ができます。


#まとめ
以上、ユーザ、パーミッションとグループの３つは、IAMのコアな機能です。もっと複雑な機能を利用しなくても、十分に管理できます。
snippet: vim

## フォントをricty for powerlineにする

```vim:~/.gvimrc(mac)
set guifont=Ricty\ for\ Powerline:h16
```

```vim:~/.gvimrc(ubuntu)
set guifont=Ricty\ for\ Powerline\ 14
```

## ~や.swpを作成する場所を変更

* [Vimが変なファイルを作るようになった — KaoriYa](http://www.kaoriya.net/blog/2014/03/30/)

```vim:gvimrc
set directory=c:/Temp
set backupdir=c:/Temp
undodir=c:/Temp
```

## いつもの設定

```vim:~/.vimrc
sy on
se hlsearch
se nowrapscan
se nowrap
colorscheme desert
```

## yankしたものを実行する手順

1. `v`で選択->`y`
2. `:r!<c-r>"`
【デザインパターン】Facadeパターン

##概要
サブシステム内に存在する複数のインターフェイスに一つの統合インターフェイスを与えるパターン

以下の2種類のクラスからなる
1. Facadeクラス(クライアントからの要求をサブシステム内の適当なオブジェクトに委譲する)
2. サブシステム内のクラス(サブシステムの機能を実装している)

##具体例と実装
エスプレッソマシーンを例にすると、

上記はそれぞれ

1. 全自動エスプレッソコーヒーメーカークラス(AutoEspressoCoffeeMakerクラス。Grinder、Stamper、Steamer、Dripperの各クラスに処理を委譲してコーヒーの作成を行う)
2. 豆挽きクラス、スタンピングクラス、ドリップクラス(それぞれGrinder、Stamper、Dripperクラス)

が対応する。
コードの詳細は以下

```rb:auto_espresso_coffee_maker.rb
class AutoEspressoCoffeeMaker
  def make_coffee(coffee_bean, density, size)
    grinder = Grinder.new(density, size)
    stamper = Stamper.new(density, size)
    dripper = Dripper.new(size)
    grinded_bean = grinder.grind(coffee_bean)
    return dripper.drip(samper.stamp(grinded_bean))
  end
end
```

```rb:grinder.rb
class Grinder
  def initialize(density, size)
    @coffee_bean = coffee_bean
    @density = density
    @size = size
  end

  def grind(coffee_bean)
    # 濃度、サイズに応じて豆を挽く
  end
end
```

```rb:stamper.rb
class Stamper
  def initialize(density, size)
    @density = density
    @size = size
  end

  def stamp(grinded_bean)
    # 濃度、サイズに応じてスタンピングする
  end
end
```

```rb:dripper.rb
class Dripper
  def initialize(size)
    @size = size
  end

  def drip(stamped_bean)
    # サイズに応じてドリップする
  end
end
```

##メリット
* クライアントがサブシステムを知らなくてよいため、クライアントが扱うオブジェクトが少なくなり、サブシステムの利用が容易になる
* サブシステム内のクラスを直接利用する必要がある場合の妨げにならない

##まとめ
クライアントに対してシステムの複雑さを軽減し、サブシステムとクライアントの結合を弱めるパターン
vagrant 1.7.3からvirtualbox5に対応

* http://www.vagrantup.com/downloads.html

virtualbox5がリリースされた7/11朝に試した時はまだ1.7.2だった。
今見たところ1.7.3に上がっていたので無事起動できた。

## 成功時のログ

```bash:
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'base'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: act_default_1436737795254_37927
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> 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: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: 
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: 
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default: 
    default: Guest Additions Version: 4.3.28
    default: VirtualBox Version: 5.0
==> default: Mounting shared folders...
    default: /vagrant => /home/Users1/Documents/box1
```

## 1.7.2のエラー

```bash:vagrant1.7.2では以下エラーとなる
$ vagrant up
No usable default provider could be found for your system.

Vagrant relies on interactions with 3rd party systems, known as
"providers", to provide Vagrant with resources to run development
environments. Examples are VirtualBox, VMware, Hyper-V.

The easiest solution to this message is to install VirtualBox, which
is available for free on all major platforms.

If you believe you already have a provider available, make sure it
is properly installed and configured. You can see more details about
why a particular provider isn't working by forcing usage with
`vagrant up --provider=PROVIDER`, which should give you a more specific
error message for that particular provider.
```
技術英語 > As a rule of thumb / ei か ieか > ei after c

As a rule of thumb
http://ejje.weblio.jp/content/rule+of+thumb
> 親指で計ること、大ざっぱなやり方、経験から得た方法

<hr>
rule of thumbで検索していて、以下のようなものを偶然見つけた。

https://github.com/bubnicbf/I-before-E-except-after-C
> "I before E, except after C" is a mnemonic rule of thumb for English spelling

スペルが ei か ie かのおおざっぱな覚え方のようだ。

>ie believe, fierce, collie, die, friend
>ei after c in deceive, ceiling, receipt, ceilidh

Cの後には ei になるとのこと。
ただし、例外もあり

>ie after c: species, science, sufficient
>ei not preceded by c: seize, weird, vein, their, foreign, feisty, heist
Focus.app と terminal-notifier の合わせ技で自分を働かせる

気を抜くとすぐサボるので、出来る限り自分を働かせたいが、ずっと『頑張る』だと息が続かないので、プログラムで適切に通知する。

基本はポモドーロテクニックなのだけれど、ポモドーロテクニックを管理するアプリケーションはその時間の『中身』まで特に言及しないので難しい。

そこで見つけたのがこちら

# Focus

https://heyfocus.com/

起動すると Blacklisted なサイトに繋がらないとか、 Blacklisted なアプリケーションが落とされるとかするロックなアプリケーション。

標準の Blacklisted なサイトに加え、僕がよく見てる小説サイトとか、ニコ動とかを入れてある。アプリケーションは LINE と Twitter を落とすようにした。

これだけで大分違う。特に『手持ち無沙汰になると Cmd+L して b.haten <TAB> <ENTER> ではてブトップを見に行ってしまう』というバカみたいな悪癖の防止になる。

# Focus with script

Focus には focus 開始時と unfocus 時に bash スクリプトを実行出来る機能があるので、 focus 時に以下のようなコードを入れてある。

```bash
touch /tmp/focus-now

open -a Reminders.app
```

`touch` がなぜ必要かはあとでわかるけど、やってることは単に Mac 標準のリマインダーアプリを起動してるだけ。すでに起動済みの場合はフォーカスが移るので、どうやっても視界に入れさせられるハメになる。

なんかのタスクやコード書いてると、途中で『おっ、これライブラリ化できるのでは？』とか言い始めて脇道にそれるから、最悪それても25分以内に現実に帰ってこれるようにした。それるのはまぁ、仕方ない。そういうのもクリエィティブだよ。

んで肝心の unfocus の方

```bash
rm /tmp/focus-now

terminal-notifier \
  -title "おつかれさまでした！" \
  -message "もし延長が必要なら、すぐにこの通知をクリックしましょう。" \
  -group "focus-rest" \
  -remove "focus-rest" \
  -sender "BradJasper.Focus" \
  -open "focus://focus?minutes=5"

sleep 300

[ ! -f /tmp/focus-now ] && terminal-notifier \
  -title "そろそろお仕事しませんか？" \
  -message "5分もゆっくりなさったんですから、お元気でしょう？" \
  -group "focus-5min" \
  -remove "focus-5min" \
  -sender "BradJasper.Focus" \
  -open "focus://focus?minutes=25"

exit 0
```

ちょい煽ってる文言なのは僕の趣味なんでお好きに変えていただくとして、 teminal-notifier の機能をフル活用した作りになってる。

`-sender` は BundleID を指定するとそのアプリケーションの通知として機能するようになるので、別の通知と分けるために使ってる。これ指定しないとなんでもかんでも terminal-notifier からの通知になるから気をつけた方がいい。

`-group` と `-remove` を指定してるのは、同じ通知で通知センターが圧迫されないように。これを入れておくと、最悪放置してても最後の一件だけが残るようになる。ゴミは溜めない。

そして、肝心の `-open` だけど、このカスタム URI スキームは Focus が標準で提供してる機能で、ターミナルとかから手軽に Focus を起動するためにあるんだけど、これを使って『もうちょっと、もうちょっとだけ！』を実現してる。

この際、延長したのに『5分もゆっくりなさったんですから……』って言われると頭の血管ブチ切れるので、それを抑制するために `/tmp/focus-now` のロックが生きてくるという感じ。便利。

# 厳密な管理は息苦しい

正直、通知を無視して仕事し続けるのも休み続けるのも出来るんだけど、問題はそれが常態化することで、ポモドーロテクニックはイケてるけど、それに縛られ続けるってのもよくない。

僕は仕事し続けるのもしんどいけど仕事でいい感じに進んでる時に強制的に休まされるのも嫌いなので、例えば『ハーイ5分休憩でーす。コーヒーを飲みなさーい』とかされるとめちゃ腹立つ。

その辺を柔軟にするための延長機能拡張で、これはなかなか悪くない。急かされるけど怒られはしない感じ。

そういう管理面もほとんど割れ窓だと思っていて、結局ポモドーロアプリ起動しなくなって終わるなら、厳密じゃなくてもいいからゆるい感じで出来る範囲の運用した方がいいと思う。

# まとめ

Focus.app 買え。
Q.jsのdeferを使用したfunctionをES6 Promiseに書き換える

```js:Q

function a() {
  var defer = Q.defer();
  doSomething(function(err,ret){
     if(err){
         defer.reject(err);
     }
     defer.resolve(ret);
  });
  return defer.promise;
}

```

```js:ES6&nbsp;Promise
function a() {
  return new Promise(function(resolve,reject){
      doSomething(function(err,ret){
         if(err){
             reject(err);
         }
         resolve(ret);
      });
  });
}
```
エクセルのマクロ（VBA）でUTF-8を書き出す方法


#VBAは標準ではShift-JISかUTF16LEのみ
マクロを使ってHTMLの出力をする際にUTF-8で書き出したかったのですが、WriteLine()関数などでは基本的にShift-Jisになるようです。



#UTF-8を書き出すにはADODB.Streamを使う(設定が必要)

Visual Basic Editor のメニューから［ツール］→［参照設定］を選び，［参照可能なライブラリファイル］の中から "Microsoft ActiveX Data Objects x.x Library" にチェックを入れます。

バージョンは最新のものでOK?

#サンプルコード
##書き出し用オブジェクトの準備
```vba:準備
Dim output As ADODB.Stream
Set output = New ADODB.Stream

With output
    .Type = adTypeText
    .Charset = "UTF-8"
    .LineSeparator = adLF
    .Open
End With

```
##書き出す内容の準備

```
HTML_code = ""
HTML_code = HTML_code & "<!DOCTYPE html> "
HTML_code = HTML_code & "<html> "
HTML_code = HTML_code & "<head> "
…
…
```

##書き出し＆ファイル保存
```
  output.WriteText HTML_code, adWriteLine
  output.SaveToFile "保存先のディレクトリ/ファイル名", adSaveCreateOverWrite
  output.Close
```
realm-cocoa マイグレーション - RLMException が出てアプリが停止するときにファイルを消して対処する


**※これは iOS/Android モバイルデータベース Realm についての記事です。詳しくは以下をご参照ください。** 
Webサイト: [realm.io](https://realm.io/)、Facebookグループ: [Realm Japan User Group](https://www.facebook.com/groups/realmjp/)、質問: [Slack Channel](http://slack.realm.io/) 

--

以下のように Xcode のコンソール画面に `'RLMException', reason: 'Migation' is required` と出て、アプリが停止したときは以前実行したときと Realm モデルクラスのスキーマが変わっているためマイグレーションが必要となります。スキーマが変わったというのは、`RLMObject` を継承して定義したクラスのプロパティに何らかの変更があったということを指します。(名前変更を含む)

![Migration_Exception.png](https://qiita-image-store.s3.amazonaws.com/0/9061/dd253f5e-08d0-c1ba-ce3a-b3e4076ac415.png "Migration_Exception.png")


**スキーマのカラムが増えた時**

```
2015-07-11 13:04:32.142 ASNFindMovie[10892:356134] *** Terminating app due to uncaught exception 'RLMException', reason: 'Migration is required for object type 'ASNProduct' due to the following errors:
- Property 'hoge' has been added to latest object model.'
```

上記のようなエラーメッセージは、「`ASNProduct` クラスに `hoge` プロパティが追加されたからマイグレーションが必要です」という意味です。

**スキーマのカラムが減った時**

```
2015-07-11 13:01:41.641 ASNFindMovie[10724:352635] *** Terminating app due to uncaught exception 'RLMException', reason: 'Migration is required for object type 'ASNProduct' due to the following errors:
- Property 'hoge' is missing from latest object model.'
```

上記のようなエラーメッセージは、「`ASNProduct` クラスに `hoge` プロパティが見当たらないからマイグレーションが必要です」という意味です。

## なぜマイグレーションが必要か?

Realm はデータベースであり、それまでに使っていたスキーマのデータが Realm ファイルに保存されています。スキーマを変えてしまうと、今まで保存されているデータが新しい変更後のスキーマに対応できなくなり、新しいスキーマに対応させるためにマイグレーション処理が必要となります。

データが一つも保存されていない場合でも Realm ファイルが存在していれば、スキーマの書き込みが行われ、Realm を呼び出し時に、今定義されているスキーマと以前使っていたスキーマが整合性が取れているのかチェックされますので、マイグレーションは必要となります。

公式ドキュメントのマイグレーションのセクションにも説明が記述されています。
[公式ドキュメント(日本語) - realm-cocoa マイグレーション(Objective-C)](https://realm.io/jp/docs/objc/latest/#section-19)
[公式ドキュメント(日本語) - realm-cocoa マイグレーション(Swift)](https://realm.io/jp/docs/swift/latest/#section-19)

## 対処法
1. マイグレーションを実行する
一つはマイグレーションを実行する方法があります。
詳しくは公式ドキュメントの[マイグレーションのセクション](https://realm.io/jp/docs/objc/latest/#section-19)をご覧ください。

2. Realm ファイルをスキーマの変更がある度に消す
開発序盤であれば、スキーマが変更される頻度が高いので、変更がある毎に Realm ファイルを一度消すのも一つの方法です。

### Realm ファイルの消し方(手動での消し方)

1. AppDelegate などの適当な場所にブレークポイントをセットする
![AppDelegate_m.png](https://qiita-image-store.s3.amazonaws.com/0/9061/7b690a1b-14b2-faa9-a859-19758f9ca170.png "AppDelegate_m.png")
  
2. アプリを実行させ、ブレークポイントで処理を止め、Xcode のコンソールで `po RLMRealm.defaultRealmPath` と入力する。すると defaultRealm までのパスが表示される。
![AppDelegate_m2.png](https://qiita-image-store.s3.amazonaws.com/0/9061/63528da6-87c6-97f6-843c-1c3c7bb49ec6.png "AppDelegate_m2.png")

3. 表示されたパスの末尾を `default.realm` を消し spotlight などで入力して Finder で Documents ディレクトリを表示させる。
![スクリーンショット_2015-07-11_13_43_59.png](https://qiita-image-store.s3.amazonaws.com/0/9061/9d9a2e53-af98-51e5-a1b7-7dc430268ba2.png "スクリーンショット_2015-07-11_13_43_59.png")

4. Finder で表示し、Realm 関連のファイルを全て消す
![Documents.png](https://qiita-image-store.s3.amazonaws.com/0/9061/596335d6-c743-a7d3-75a2-81fbcb11c6e7.png "Documents.png")

5. アプリを停止して再起動。これで、新しいスキーマの Realm ファイルが作成されます。
画像スライスの罠？。。  8192px以上のデザインカンプに注意


Photoshopの「WEB用に保存」ではバージョン問わず
縦横どちらかが8192pxを超えると
スライス画像が勝手に小さくなることがあるそうです、、、

すごい縦長のページをスライスしててまんまとはまりました。。
(10000pxくらい)

このバグ？のせいで日曜日の数時間を無駄にしました。。
皆さんも気おつけてください（：：）

■Adobeのヘルプ ページ
Web用に保存で100%のサイズにならない
https://forums.adobe.com/message/5602035
最近まで引数のある即時関数が謎だった件

```js:sample
(function(w,$){
    console.log(w);
    console.log($("a").text());
})(window,jQuery);
```

こういうのたまに見かけますが、
最近まで謎でした。。
理解すべくシンプルにしてみました

```js:sample
(function (name) {
    console.log(name);
})("まさみ");

/*ログの結果は↓*/
// まさみ
```

```js:sample
function loveCall (name) {
    console.log(name);
}
loveCall("まさみ");
```
のloveCall関数の定義とコールを
省略してるわけですね。

これでjQueryの他のライブラリとの衝突防止の
おまじないの意味なども理解できるはず！

```js:sample
(function($){
    console.log($('#sample').text());
})(jQuery);
```

以上、明日もがんばりましょう！
Itamaeのeditアクションが便利

# Itamaeのeditアクションが便利

chefでもやろうと思えばできるんだとは思うが、少なくとも自分はここまで簡潔に書ける方法を知らなかったし、非常に便利だと感じたので書く。

itamaeのファイル系リソース(`file`・`remote_file`・`template`)では、`action`アトリビュートに`:edit`という値を指定できる。
これを使うと`block`アトリビュートに指定したブロックを実行し、ファイルの内容を編集することができる。

## 使い方

```ruby
file "/foo" do
  action :edit
  block do |content|
    content.gsub!("world", "Itamae")
  end
end
```

`content`に対して破壊的な変更を下すことで、ファイルの内容が置き換わる。
ブロックの戻り値がファイルの内容に置き換わっても良いのでは、とも思ったが作者の思想的にはこれがベストなんだろうか。

## おわりに

itamaeはchefと比べて、学習コストを割くことなく、さくっと環境構築フローをコードに落とし込めるDSL兼ツールという認識でいる。
chefはちょっとヘビーで…という人にはまさに最適なプロヴィジョニングツールになる気がする。

また、**構築された環境に対するテストツールとして有名なserverspecも、itamaeと同様に基盤はspecinfraによって作られているので、itamaeとの親和性がものすごく高い印象を受けた**。

itamaeで環境構築フローをコードに落とし込んで自動化し、Serverspecでテストを書くというのが自分の中では鉄板化していくと思う。
カルマンフィルターでパラメータ推定

天気予報では、モデル出力を予報変数（例えば、最高気温など）に変換するのに、カルマンフィルターを用いて、パラメータ推定を行っています。その手法については、気象庁（1997）に記載されています。

## パラメータ推定

### 時間依存がない場合

ここでは、 $y = ax + b$ という線形の式の$a$と$b$を推定してみる。$y_i = a x_i + b + v_i $式を用いて、模擬データを生成し検討してみる。

$a = 2$、$b = 5$とし、$x$は-5から5の一様乱数とし、$v_i$は、平均0、標準偏差2のガウス乱数を与える。

```py:KLM.py

def update(P, C, R, x_hat, obs, I):
  """
  P: 誤差共分散行列
  C: 観測系数行列
  R: 観測ノイズ分散行列
  """
  #カルマンゲイン
  G = P * C / (C.T * P * C + R)
  x_hat = x_hat + G * (obs - C.T * x_hat)
  P = (I -  G * C.T) * P
  return x_hat, P

a = 2.
b = 5.

x = np.random.uniform(-5, 5, 365)
v = np.random.normal(0, 2, 365)
y = []
for i in range(365):
    y.append(a * x[i] + b + v[i])
    
A = np.mat([1])
P = np.mat([[1, 0], [0, 1]])
R = np.mat([1])
I = np.identity(2)
x_hat = np.mat([[0], [0]])

for i in range(365):
  C = np.mat([[x[i]], [1]])
  obs = np.mat([y[i]])
  x_hat, P = update(P, C, R, x_hat, obs, I)

```

推定された$a$、$b$を図示すると、
![KLM.png](https://qiita-image-store.s3.amazonaws.com/0/64468/00cc56b5-ced4-ab18-8aa4-4734811a9a45.png)
となり、短時間の間に、$a$、$b$が推定されているのが見える。

### 時間依存がある場合

途中でモデルが変わった場合やパラメータが季節変動している場合。
今回は180日目で係数にそれぞれ2が加わった場合。

```py:KLM2.py
import numpy as np

def update(P, C, R, x_hat, obs, I):
  """
  P: 誤差共分散行列
  C: 観測系数行列
  R: 観測ノイズ分散行列
  """
  #カルマンゲイン
  G = P * C / (C.T * P * C + R)
  x_hat = x_hat + G * (obs - C.T * x_hat)
  P = (I -  G * C.T) * P
  return x_hat, P

a = 2.
b = 5.

x = np.random.uniform(-5, 5, 365)
v = np.random.normal(0, 2, 365)
y = []
for i in range(365):
    if i < 180:
        y.append(a * x[i] + b + v[i])
    else:
        y.append((a + 2) * x[i] + (b + 2) + v[i])

A = np.mat([1])
P = np.mat([[1, 0], [0, 1]])
R = np.mat([1])
S = 0.1
I = np.identity(2)
x_hat = np.mat([[0], [0]])

for i in range(365):
  C = np.mat([[x[i]], [1]])
  obs = np.mat([y[i]])
  P = P + S ** 2
  x_hat, P = update(P, C, R, x_hat, obs, I)
```

![KLM2.png](https://qiita-image-store.s3.amazonaws.com/0/64468/b06a455f-08da-48c6-1c82-4963f48494bf.png)

見事に変化に追従しました。

## 参考文献
気象庁（1997） 最新数値予報ガイド 第5章アプリケーションシステム 1カルマンフィルター　pp.66 - 78
CGPathの確認用にサンプルアプリを作ってみた


ちょっと作りたかっただけだけど手間がかかった・・・。これくらいさくっと作れるようになりたいものだ。

![iphonePlay_20150712.gif](https://qiita-image-store.s3.amazonaws.com/0/40693/167d81ce-7f3f-69f3-38b4-e698f8f0991a.gif "iphonePlay_20150712.gif")


とりあえず次の８個を動かせるようにしてみた。
・CGPathCreateWithEllipseInRect
・CGPathCreateWithRect
・CGPathCreateWithRoundedRect
・CGPathAddArc
・CGPathAddRelativeArc
・CGPathAddArcToPoint
・CGPathAddCurveToPoint
・CGPathAddQuadCurveToPoint


CGPathそれぞれの設定出来る値を画面で入力してすぐに反映するようにしてみてたので画面での大きさとか確認しやすいと思うけど、iPhone6のPortraitでしか確認してない。

それと、CGPathAddArcToPointだけ他のと違って角度だけ調整出来るようにしている。

![スクリーンショット 2015-07-13 00.35.00.png](https://qiita-image-store.s3.amazonaws.com/0/40693/49d256bb-017d-624f-acd4-220a5196527d.png "スクリーンショット 2015-07-13 00.35.00.png")



後、作ってて初めて気付いたけどフィールドをタブで移動した際、入力された値を選択した状態に簡単には出来ない。
作ったのはGitHubにあげておきました。

[CGPathSample](https://github.com/rnsm504/CGPathSample)

07/14 追記
UIコンポーネントをどの画面でも大体似たような位置に表示されるように修正。おまけに横向けても動くようにもした。
ひらがなとカタカナを含んだ乱数を作成する

# コード

rubyってすごいね

```
#!/usr/bin/env ruby
# encoding: utf-8

length = 10
puts [*("あ".ord)..("ん".ord), *("ァ".ord)..("ヶ".ord)]
    .shuffle
    .first(length)
    .map{|x| x.chr('utf-8') }
    .join
```

# 参考

[「秘密の質問」に答えます](http://xaro.hatenablog.jp/entry/2013/12/22/022723)
Java SAXParserでXMLをパースするためにやったこと

# 事象

社内ネットワーク上で、Javaのjavax.xml.parsers.SAXParserを使ってXMLをパースしたかった。
以下、２点ちょっとはまった。

1. SAXParserがDTDの検証のためにインターネットに接続しようとしてこける
2. XMLコメントの内容をパースしたかったがうまく取れなかった

パースしたかったファイルはiBatisで定義されたSqlMapファイル。
# 対応

1.SAXParserがインターネットにつながらないとき向けの対応

<code>
// パーサファクトリの初期化
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
// saxParserがDTDの検証のためにインターネットに接続するのを抑止する。
saxParserFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
</code>

この記述でSAXParserがネットワークに接続しようとするのを抑止した。


2.XMLコメントの内容をパースしたい向けの対応

<code>
CustomHandler handler = new CustomHandler();
SAXParser saxParser = saxParserFactory.newSAXParser();
// (<!-- -->によるxmlコメントを読み込むために設定)
saxParser.getXMLReader().setProperty("http://xml.org/sax/properties/lexical-handler", handler);
</code>
これで、CustomHandler#commentが呼ばれるようになり、コメント文もパース可能になる。

以上。
透明度のアルファ値早見表

透明度に応じて指定するアルファ値の早見表（自分用）


```
100% — FF
95%  — F2
90%  — E6
85%  — D9
80%  — CC
75%  — BF
70%  — B3
65%  — A6
60%  — 99
55%  — 8C
50%  — 80
45%  — 73
40%  — 66
35%  — 59
30%  — 4D
25%  — 40
20%  — 33
15%  — 26
10%  — 1A
5%   — 0D
0%   — 00
```