OmniAICreator/Qiita-1.07M huggingface dataset:
Python で Amazon Simple Notification Service を使う

あらすじ
---

何かを常にチェックして、ある条件が発生したらメールを送る、というのをやりたいというのはよくあること。しかし AWS の EC2 インスタンスからメールを直接送る方法はデフォルトで制限がかかっていて、解除に手続きごとが必要だったりする。

解除したい場合はこちらから
[EC2 メール送信制限解除フォーム](https://portal.aws.amazon.com/gp/aws/html-forms-controller/contactus/ec2-email-limit-rdns-request)


予め指定された通知先にメールを送るだけなら Amazon Simple Notification Service が圧倒的に簡単。

Amazon SNS の画面から ARN 発行
---
1. AWS のマネジメントコンソールのサービス一覧から Amazon SNS へ移動
2. 左側のナビゲーションバーから Create and Add プルダウンメニューを見つけてクリック
3. Create new topic をクリック
4. ポップアップして来た画面で Topic Name を入れる。Topic Name は実際に ARN の一部になるものなので256文字以内で入力（記号はハイフンとアンダーバーのみ可）。Display Name は SMS 用なので特に入れなくても先に進める
5. Crate Topic をクリックして作成
6. 出来上がった後、画面に Topic ARN という表示があるのでその右側の "arn:aws:sns:ap-northeast-1:111111111111:testtopicname" みたいな値を確認する。ap-northeast-1 は作成したリージョンが 111111111111 という12桁の数字は各自の AWS アカウント ID が入るはず。これ重要なのでどこかにメモっとく
7. 同じ画面下部にある Create Subscription ボタンをクリック
8. Protocol のところは Email をプルダウンメニューから選択、Endpoint は受け取りたいメールアドレスを入力して、右下の Subscribe ボタンをクリック
9. close ボタンをクリックして元の情報に戻る。画面上では Subscription ID という項目が Pending Confirmation となっているはず
10. 登録したメールアドレスには最初に受け取り確認のメールが来る。該当メール内の Confirmation リンクを必ずクリックして受け取り意思表示をしておく。これをやらないと以降の通知メールが届かないので注意
11. 上の手順をちゃんとやると先ほどまで Pending Confirmation だったところに Subscription ID "arn:aws:sns:ap-northeast-1:111111111111:testtopicname:8851ea7b-0610-4def-9b38-exxxxxxxxxxxxx" がちゃんと入っているはず。でもこれを使うような場面は特になかった気がする。使うのは 6 の手順の Topic ARN だけ

コードを書く
---

書くというほどたいしたことはしていない。
サンプルコードをコピって内容を書き換えて、元のコードの後ろに継ぎ足しただけ。

```snstest.py
import boto.sns

region = 'ap-northeast-1'
#このリージョンはどこのリージョンを使うかの指定なので、実際に ARN 取得したリージョンを入れる

if conditionmatched:
#とある条件にマッチしたら

        topic = 'arn:aws:sns:ap-northeast-1:111111111111:testtopicname'
#さっきの Topic ARN を使って

        subject = 'Your Email Subject!!'
#こんなメールのタイトルで

        body = 'You got %s !' % (messagebody)  
#こんなメールのボディの内容を送る。英語なのは文字コードとか面倒だったからだけど、多分そんなに面倒ではないはず...

        conn = boto.sns.connect_to_region(region)
        conn.publish(topic, body, subject)
```

終わりに
---

Amazon Simple Notification Service は今でこそ Mobile Push が対応で脚光を浴びている感じがするけど、これまであまり表には出て来てなかった縁の下の力持ち的存在。特に CloudWatch のアラーム設定の後ろで静かに働いているけなげな姿に心打たれる...しかし、たった数行をもともと書いたコードの後ろになんとなくくっつけてあげただけで、ちゃんと動いてくれる可愛いやつなので使わない手はない。

本当は API コール失敗したら Exponential back off でリトライとかまで考えないといけないのかもしれないけど、今回監視しているのはそこまでクリティカルなものじゃないのでこれで良い。

参考文献
---

API コールのよくあるエラーについてはこちらを参考に
[Amazon Simple Notification Service API Guide - Common Errors (英語のみ)](http://docs.aws.amazon.com/sns/latest/APIReference/CommonErrors.html)

API コールが失敗した際のリトライ方法についてはこちらを参考に 
[Amazon Web Service General Reference (日本語翻訳版)](http://docs.aws.amazon.com/ja_jp/general/latest/gr/api-retries.html)
markdown > "---"の入力が分からない > "\---"と入力する

githubのWikiなどではMarkdownで入力できるのが便利。

でも、Markdownだと"---"は水平線として自動変換されてしまう。

"---"自体を入力する方法がよく分からない。検索しても水平線ばかりが引っかかってしまう。

<hr>
(追記 2015/03/15)
mandel59さんに教えていただいた。

`\---`と入力すればいいとのことです。

`\`については、Macの場合は`Optionキー`と`"¥"`を押すことでを入力できる。
Excelマクロで最小二乗近似

Excelマクロ内で最小二乗法による近似多項式の各項の係数を求める方法を記録する。
Excelのワークシートで用意されている関数`LinEst`を用いる。

```
LinEst(既知のy, 既知のx, 定数項, 補正)
```

**既知のy** 計測値などを入力する。1行もしくは1列の配列。
**既知のx** 既知のyと同じ行、もしくは列方向に並んだデータ。`^{1, 2}`を付けることで1乗、2乗のベクトルを表す。
**定数項** `TRUE/FALSE`で与える。`TRUE`は定数項を計算することを示す。`FALSE`は定数項を0とすることを示す。
**補正** `TRUE`は計算結果の詳細を返す。確実度である`R^2`値を得るために`TRUE`を指定する。

本投稿では、2次の式で近似する例を示している。
既知のxに付加する文字列を`^{1, 2, 3}`などと変更することで、3次式で近似するなど対応する。

`LinEst`関数は、求めた回帰直線の係数を

```
m1 * x1 + m2 * x2 + ... + b
```

に対して

```
{mn, mn-1, ... , m2, m1, b}
```
で返すため、これを`Index`関数により取り出す。
なお、`R^2`値については、返される配列の3行1列目に格納されるため、これも`Index`関数で取り出すことができる。

```vbnet:近似多項式
    ' ax^2+bx+cの式で近似する
    Dim coef_a As Double
    Dim coef_b As Double
    Dim coef_c As Double
    Dim r2 As Double
    Dim xvalues As String
    Dim yvalues As String
    Dim result As String

    ' 解析対象データの構築
    xvalues = "a7:a23"
    yvalues = "c7:c23"
    
    ' 最小二乗近似("^{1,2}"を付加することで、1乗、2乗の項の定数配列を構築する)
    coef_a = WorksheetFunction.Index(WorksheetFunction.LinEst(Evaluate(yvalues), Evaluate(xvalues + "^{1,2}"), True, True), 1, 1)
    coef_b = WorksheetFunction.Index(WorksheetFunction.LinEst(Evaluate(yvalues), Evaluate(xvalues + "^{1,2}"), True, True), 1, 2)
    coef_c = WorksheetFunction.Index(WorksheetFunction.LinEst(Evaluate(yvalues), Evaluate(xvalues + "^{1,2}"), True, True), 1, 3)
    r2 = WorksheetFunction.Index(WorksheetFunction.LinEst(Evaluate(yvalues), Evaluate(xvalues + "^{1,2}"), True, True), 3, 1)
```

既知のxを与える部分、多項式の各項の係数を受ける部分を動的に変更させることで、任意の次数での近似多項式を求めることができる。
Twigで定数にアクセスする方法



下記のようなClassがあった場合。

```php
<?php
namespace App\Demo;

class Test
{
    const DEMO = 40;
    ...
}

```

上記のClassにアクセスするにはconstantを使用して下記のように記述する

```html
{{ constant('App\\Demo\\Test::DEMO') }}
```
文字列はescapeされるのでバックスラッシュは2つ重ねで記述する
めもり



C言語プログラム実行時には必要なメモリが割り当てられる。
起動に必要になるのは静的な場所とシンボルをもった場所。
実行中はシンボルだけのモノは中身が要らない。実行時にあればおkなのでその情報だけ要る。

とどのつまり、プログラムとプロセスで要る情報は違う。
宣言と定義、リンケージをてきとうに与えよう。

```c

func(int arg) {...}

```

<i>arg</i> は宣言に近い。初期化や割り当ては呼び出し時で。
<i>func</i> はグローバル。


```c

func(int arg)
{
  char c;
  int b;
}

```

<i>arg</i> は呼び出し元で確保されてるだろう。
<i>c</i> と <i>b</i> は呼び出し元に返るまで有効。

注目すべきは

```c

int f1(int arg)
{
  char c;
  int b;

  return b;
}

int f2(int arg)
{
  int b;
  char c;

  return b;
}

```

これらは問題のない程度にちがう。
int が プッシュされてから char がプッシュされるか、その逆かだけだけど。
さまつなようだけど、次は事情がちがう。

```c

int f(int arg)
{
  int buff[SIZE];
  int x;

  return 0;
}

```

関数の呼び出しはまず、リターンアドレスが上位に。
そのしたに下位から上位アドレスの順に ローカルな引数 → ローカルな変数が積まれる。


```

[スタック]
上位

　f のリターンアドレス
　引数arg
 buff
 x

下位

```


配列が増えすぎるとリターンアドレスに届く・・・。

逆：

```c

int f(int arg)
{
  int x;
  int buff[SIZE];

  return 0;
}

```

<i>buff[0]</i> がスタックの成長方向にあり、<i>buff[SIZE]</i>が <i>x</i> の手前。
<i>buff[SIZE+1]</i> が <i>x</i> の場所（かもね～）。

これは、次のような配列の隣り合う要素を調べるのが問題なく行えると言えるだろう。

```c

int i;
int buff[SIZE];

for(i=0; i<SIZE; i++) {
  if(buff[i]==buff[i+1]) {...}
}

````


構造体を思い出すといい。

```c 

struct hoge
{
  char x;
  int y;
};

```

<i>hoge</i> のオブジェクトは char -> int の順。 
そして 

```c

struct hoge ob;
struct hoge *p = &ob;

```

この場合 p の値とob.xのアドレスは同じ。
よって、次の場合。

```c

char *cp = &(ob.x);
cp = cp + sizeof(int);


```

<i>cp<i> は ob.y の位置を指してるはず。


こういった事実を活かして構造体の末尾をノリシロにしてる構造体があるね!

```c

struct X 
{
  int z;
  char data[1]; /* 場合によって char *data もあり */
};

```
WufooのAPIでデータを登録するときにあなたが知っておかないといけないたった一つのこと

WufooのAPIを使うと、JSONまたはXMLでデータをGETできるが、POSTできるのはForm URL-Encodedである。

### 誤

```json
{ 
  "Field24": "Soutaro Matsumoto",
  "Field25": "matsumoto@soutaro.com"
}
```

### 正

```
Field24=Soutaro%20Matsumoto&Field25=matsumoto%40soutaro.com
```

ちょうどうでもいいけど、「プログラマじゃなくてもフォームとか作れて便利だし」というサービスであるWufooに、API経由で別のプログラム経由でデータを送りつけるというのは、あまり正しい使い方でない気がしなくもない……

### 参考文献

* http://stackoverflow.com/questions/27095356/how-to-post-json-to-the-wufoo-entries-api

> The service doesn't accept json, it only replies in json.
typeaheadのprefetchが動いていないように見える件


Twitter謹製の検索窓ライブラリ[typeahead.js](https://twitter.github.io/typeahead.js/)。同梱されている **Bloodhound** にprefetchというオプションがあるのですが、全然prefetchしてくれない。バグかな！？と思って調べたのでメモしておきます。

## いきなり結論

**localStorageに既にデータがある場合は、prefetchが動かない。**

そういうことなんですね。だから、最初の一回はprefetchしていたんです。でも、1度値を受け取ってブラウザのlocalStorageに格納されるともうprefetchしないんですね。

これは、prefetchの`cacheKey`オプションの値を変えると、prefetchが発動することからもわかります。

```JavaScript
var engine = new Bloodhound({
  datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
  queryTokenizer: Bloodhound.tokenizers.whitespace,
  prefetch: {
    url: "stations.json",
    cacheKey: "change here!"
  }
});
```

`cacheKey`が新しくなると、新しいキーに対応するデータが`localStorage`にないわけですから、prefetchが発動するわけです。

また、Google chromeのデベロッパーツールでも確認することができます。

![localstorage.png](https://qiita-image-store.s3.amazonaws.com/0/24041/23886ead-1c67-3b91-3401-b92c4c307960.png "localstorage.png")

データが格納されています。右クリックでDeleteができるので、Deleteすると次に画面を開く際にprefetchがちゃんと動きます。

バグじゃなかったんですね。

## js読み込み時のみ新しい値をprefetchしたいけどどうする？

```js
engine.clearPrefetchCache();
engine.initialize()
```

で、localStorageをクリアするのが良いと思います。

Web開発初心者が恐る恐る書きました。
nagiosで通知時間を限定する

* [‪How to Define Nagios Timeperiod Exclude for Maintenance Window](http://www.thegeekstuff.com/2013/09/nagios-timeperiod/)

## timerperiodを使う

```bash:定義
define timeperiod{
        timeperiod_name myworktime
        alias           myworktime
        sunday          04:30-22:00
        monday          04:30-22:00
        tuesday         04:30-22:00
        wednesday       04:30-22:00
        thursday        04:30-22:00
        friday          04:30-22:00
        saturday        04:30-22:00
}
```

```diff:指定
  define service{
        use                             generic-service
        host_name                       devserver
        service_description             HTTP
        contacts                        ramesh
        check_command                   check_http
+       check_period                    myworktime
+       notification_period             myworktime
        }
```
Syntastic を使ってて :wq で閉じるとき、チェックを走らせない


Twitter 漁ってたらその方法を見つけたので共有。

```vim:.vimrc
let g:syntastic_check_on_wq = 0
```

シンタックスチェッカー使ってるとやっぱり露骨に遅くなってストレス溜まるけど、それが晴れる。

ただ、「Vim 閉じる瞬間に一瞬表示されるチェッカーのアラートを見逃さないで、もう一度 開いて修正する」っていう愚かな行為はできなくなる。

この設定、Syntastic のドキュメントに Recommended settings として載っているのでちゃんと見ておけばよかったと思う。

[syntastic/syntastic.txt at master · scrooloose/syntastic](https://github.com/scrooloose/syntastic/blob/master/doc/syntastic.txt)

```vim:.vimrc
------------------------------------------------------------------------------
1.2. Recommended settings                              *syntastic-recommended*

Syntastic has a large number of options that can be configured, and the
defaults are not particularly well suitable for new users. It is recommended
that you start by adding the following lines to your vimrc, and return to them
later as needed: >
    set statusline+=%#warningmsg#
    set statusline+=%{SyntasticStatuslineFlag()}
    set statusline+=%*

    let g:syntastic_always_populate_loc_list = 1
    let g:syntastic_auto_loc_list = 1
    let g:syntastic_check_on_open = 1
    let g:syntastic_check_on_wq = 0
<
==============================================================================
```

でも、``g:syntastic_check_on_open``（起動時にチェッカーを走らせる） とか ``auto_loc_list``（警告のリストペインを表示する） とか結構邪魔なので個人的にはおすすめしない。

### 自分のおすすめ
チェッカーを走らせるファイルタイプ、走らせるチェッカーをちゃんと定めてるのと、error, warning symbol の設定。Ruby で mri を走らせるかどうか悩んでる。

```vim:.vimrc
let g:syntastic_mode_map = { 'mode': 'passive',
            \ 'active_filetypes': ['ruby', 'javascript','coffee', 'scss'] }
let g:syntastic_ruby_checkers = ['rubocop'] " or ['rubocop', 'mri']
let g:syntastic_javascript_checkers = ['jshint']
let g:syntastic_coffee_checkers = ['coffeelint']
let g:syntastic_scss_checkers = ['scss_lint']
let g:syntastic_error_symbol='✗'
let g:syntastic_warning_symbol='⚠'
let g:syntastic_style_error_symbol = '✗'
let g:syntastic_style_warning_symbol = '⚠'
let g:syntastic_check_on_wq = 0
hi SyntasticErrorSign ctermfg=160
hi SyntasticWarningSign ctermfg=220

```

## 参考
<blockquote class="twitter-tweet" lang="ja"><p>syntasticの:wqした時にはシンタクスチェックを走らせないようにする設定(g:syntastic_check_on_wq), どうなってるんだろうか. vim-watchdogsでも同様のことがしたい</p>&mdash; とさいぬ (@myon___) <a href="https://twitter.com/myon___/status/576725054425202688">2015, 3月 14</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Sinatra + Heroku で Qiita 戦闘力を測る Web アプリケーションを作成してみる

## :tophat: 概要
Sinatra + Heroku で Qiita 戦闘力を測る Web アプリケーションを作成してみます

## :scroll: 仕様
### UseCase
* ユーザー名を入力し、「Analyze」を押すと Qiita 戦闘力、レーダーチャート、ツイートボタンが表示される
* QiitaScouter は処理が遅いので、「Analyze」を押してから結果が表示されるまで Loading アイコンを表示する

## :trophy: heroku への公開

~~~bash
$ heroku create qiita-scouter-app
$ git push heroku master
$ heroku ps:scale web=1
# 動作確認
$ heroku open
~~~

## :trophy: 完成
* <i class="fa fa-external-link" style="font-size:1em;"></i> <a href="https://qiita-scouter-app.herokuapp.com">qiita-scouter-app</a>

### 初期表示
![qiita-scouter-app0.png](https://qiita-image-store.s3.amazonaws.com/0/43480/06119ad7-3ef8-fdf3-6122-f6960ffef9d7.png)

### 読み込み中
![qiita-scouter-app1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/caaf82f5-2cf0-9ced-2cca-6180850e2050.png)

### 結果表示
![qiita-scouter-app2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/f695c718-6794-6a78-cae7-fd4cec82d700.png)
![qiita-scouter-app3.png](https://qiita-image-store.s3.amazonaws.com/0/43480/f1ff783b-70b3-f91a-ad31-92d780664487.png)

### ツイートボタン押下
![qiita-scouter-app4.png](https://qiita-image-store.s3.amazonaws.com/0/43480/b0eab39d-223b-8e95-302b-f7f355b3ab68.png)

## :memo: 補足
* Google Web Font を利用
* Font Awesome を利用
    * 目のアイコン
    * loading
* ズルイグレーを利用
* ズルイ角丸を利用
    * input text
    * input button
* Chart.js を利用

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [qiita-scouter-app GitHub](https://github.com/tbpgr/qiita-scouter-app)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ズルいデザインテクニック2013 + セミフラット version](https://speakerdeck.com/ken_c_lo/zuruidezaintekunituku2013-plus-semihuratuto-version)
SwiftプロジェクトでObjective-CのSDKやFrameworkを利用する手順と注意点

##はじめに

SwiftでObjective-Cで書かれたSDKやソースコードを利用することができます。プロジェクト内で両者を共存させることも可能です。今回、Swiftプロジェクト内でObjectiv-CのSDKをいくつか使おうとした時に、読み込みやビルドでエラーが出ることがあったので、その時の対処法について。

今回は、[Romo SDK](http://www.romotive.com/developers/)を例にとってみます。

##SwiftプロジェクトでObjective-CのSDKを利用する
###SDKの追加

まずは、Swiftプロジェクトに使用するSDKを追加してみます。追加するためには、"File -> Add files to..."から対象のファイルを追加します。
今回は、ダウンロードしてきたファイルからRMChacacter.framework、RMCharacter.bundle、RMCore.frameworkを選択して追加します。bundleにはリソースファイルなどが保存されています。

![Screen Shot 2015-03-14 at 9.30.03 PM.png](https://qiita-image-store.s3.amazonaws.com/0/35442/c4132ad8-4ca6-caa0-64f3-d856f0978eab.png)


###Bridging-Header
Swiftで書かれたコード内でObjective-Cで書かれた昨日を使うには、\<ProjectName\>-Bridging-Header.hをプロジェクト内に作り、そこを介してヘッダーを読み込みます。SDKも同様にBriding-Header.hに追加をして読み込みます。

![Screen Shot 2015-03-14 at 9.34.46 PM.png](https://qiita-image-store.s3.amazonaws.com/0/35442/df846d12-7423-7a8e-4a18-9db647ce308a.png)


Bridging-Header.hを生成しますか？と聞かれるので"Yes"

![Screen Shot 2015-03-14 at 9.37.00 PM.png](https://qiita-image-store.s3.amazonaws.com/0/35442/e7d5cee7-9e57-706a-aa8e-8226f9d0cf6e.png)

RomoSample-Bridging-Header.hが生成されたので、RMChacacter.framework、RMCore.frameworkをインポートします。これでRomoのSDKを利用することができます。他のObjective-Cで書かれたSDKを使いたい場合は同様にインポートすれば使えます。

![Screen Shot 2015-03-15 at 3.48.42 AM.png](https://qiita-image-store.s3.amazonaws.com/0/35442/e3b966fd-277f-458a-c296-3a5384d5d5f5.png)



##SDKで使用されるFrameworkの追加

SDKを使う際にFrameworkを利用することがあります。ソーシャル系のFrameworkでは、Social.framework, Security.frameworkを利用します。RomoではSDKを使うにあたって、いくつかのFrameworkが利用されます。

RMCore.framework
- CoreMotion.framework
- ExternalAccessory.framework

RMCharacter.framework, RMCharacter.bundle
- AVFoundation.framework
- QuartzCore.framework

Frameworkの追加は"Build Phases -> Link Binary With.... -> +"から追加することができます。

![Screen Shot 2015-03-14 at 9.30.23 PM.png](https://qiita-image-store.s3.amazonaws.com/0/35442/c083ca4b-9886-bf65-7d70-fe0e75a3135a.png)

"+"を押すと追加できるFrameworkのリストが表示されるので、検索で対象のFrameworkを追加します。

![Screen Shot 2015-03-14 at 9.31.55 PM.png](https://qiita-image-store.s3.amazonaws.com/0/35442/ddb9540e-49fc-631b-c3c0-1a1808a07aef.png)

すると、選択したFrameworkが追加されたことを確認できます。

##Architecture対応
iPhoneデバイスのバージョンによっては、使うアーキテクチャが異なってきます。それは32bit/64bitといった具合です。iPhone 5以前は32bit, iPhone 5sから64bitとなっています。

SDKによっては64bit対応がなされていない場合があります。そのため、64bitバイナリが見つかりません。という警告がでる場合があります。

その場合は使用するアーキテクチャを変更することで解決できることがあります。

![Screen Shot 2015-03-14 at 9.51.21 PM.png](https://qiita-image-store.s3.amazonaws.com/0/35442/bb108166-7a15-210b-7bbe-7c1a4f2627d1.png)

"Build Settings -> Architectures"で使用するアーキテクチャを設定できます。展開すれば、Debug/Releaseなど細かく設定することも可能です。スタンダードでは"armv7, arm64"になっているので、今回は"armv7"に設定しなおします。

![Screen Shot 2015-03-14 at 9.52.28 PM.png](https://qiita-image-store.s3.amazonaws.com/0/35442/288ad7f5-694a-e353-e2d0-7a3cabc95402.png)

するとエラーが解消され、ビルドすることができるようになります。


##Frammeworkの追加でエラーが発生した場合
@kakipo さんが[Library not loaded エラー？ここを見直そう](http://qiita.com/kakipo/items/3cd87e00bc96bc3888b2)のページに書いてくれています。
参考にしてみてください。
Boost.Logの使い方(1. 概略)

1. [概略](https://qiita.com/termoshtt/items/071fcefef4720dcd790d)
2. [ログの収集](https://qiita.com/termoshtt/items/ee9a6df5d4a5f30a86f6)
3. [ログの出力](https://qiita.com/termoshtt/items/6b25084556f8a69239cb)
4. [cmakeによるコンパイル](https://qiita.com/termoshtt/items/9c856562fe8a8c42560c)

# Boost.Logの全体像

![Design.png](http://www.boost.org/doc/libs/1_57_0/libs/log/doc/html/images/log/Design.png)
([Design overview](http://www.boost.org/doc/libs/1_57_0/libs/log/doc/html/log/design.html)より転載)
Boost.Logには3つの階層があり、

- logger : アプリがログを出力するためのインターフェイス
- core : 各loggerから取得したログをまとめて、フィルタリングしたりする
- sink : logをファイルや標準出力したりする(ここでフィルターもできる)

アプリ、あるいはモジュールをユーザーが使用する場合

- core, logger : アプリ、モジュールが使用
- core, sink : ユーザーが使用

のように使う事になります。
loggerはなるべく多くの情報を提供し、ユーザー側がcore/sinkの設定でフィルターします。


# 特徴
- macroを多用する
- placeholderを多用する

特にplaceholderは慣れると便利なんですが、
Boost.Lambdaに慣れ親したしんだ諸兄にはともかく、
C++11以降の我々ゆとりC++erには少しハードルが高いかもしれません。

## 利点
- 全体の設計が一貫しているので大規模化しやすい（？）

## 難点
- compile遅い
- macroなにしてるかわかりにくい
- placeholderきもい (個人の感想です)

# references

- [Boost.Log(本家)](http://www.boost.org/doc/libs/1_57_0/libs/log/doc/html/index.html)
  個々の説明はそこそこわかりやすいが長い
- [boost.Logの使い方を勉強した (｡･ｘ･)ゝ](http://d.hatena.ne.jp/yamada28go/20140215/1392470561)
  詳しい所まで調べてあるが、結構情報量があるので読むの大変
Angularでwiki作成画面を作ってみた

#目的
研究室wikiツールのフロント作成
メンバーにリアルタイムでpreviewの更新をして欲しいと言われたのでchangeイベント使ってるから重いかもしれないがご愛嬌

#使用したライブラリ
marked.js

#やったこと
marked.jsのインストール
`bower install marked`

その後読み込み

```html:index.html
<script src="bower_components/marked/lib/marked.js"></script>
```

モジュール化

```coffeescript:app.coffee
angular.module('marked',[]).factory 'marked', ()=> @.marked
```

コントローラーの記述

```coffeescript:wiki.coffee
angular.module('Sample').controller 'WikiCtrl', ($scope, marked) ->
  $scope.markdown = ''
  $scope.previe = ''
  $scope.markdown_change = () ->
    $scope.preview = marked($scope.markdown)
```

viewの記述

```haml:wiki.haml
.editor
  %h2 Markdown
  %textarea#editor-area{'ng-model'=>'markdown', 'ng-change'=>'markdown_change()'}
.preview
  %h2 Preview
  %p#preview-area{'ng-bind-html'=>"preview"}
```

これでテキストエリアにマークダウンを書けばリアルタイムでプレビューに更新されます
ubuntu 14.04 LTS にAptanaStudio3をインストール


ubuntu 14.04 LTS にAptanaStudio3をインストールしたので手順をメモ。

#環境
OS:ubuntu 14.04 LTS
## インストール手順

### Java JDKのインストール
1. リポジトリを追加

```console
$ sudo add-apt-repository ppa:webupd8team/java
```

```console
・・・
[ENTER] を押すと続行します。ctrl-c で追加をキャンセルできます
・・・
gpg: 鍵XXXXXXXX: 公開鍵“Launchpad VLC”を読み込みました
gpg: 処理数の合計: 1
gpg:               読込み: 1  (RSA: 1)
OK
```

2.アップデート

```console
$ sudo apt-get update
```

3.インストール

```console
$ sudo apt-get install oracle-java9-installer
```

```console
・・・
update-alternatives: /usr/lib/mozilla/plugins/libjavaplugin.so (mozilla-javaplugin.so) を提供するために 自動モード で /usr/lib/jvm/java-9-oracle/lib/amd64/libnpjp2.so を使います
Oracle Java 9 browser plugin installed
```

4.バージョンの確認

```console
$ java -version
```

```console
java version "1.9.0-ea"
Java(TM) SE Runtime Environment (build 1.9.0-ea-b54)
Java HotSpot(TM) 64-Bit Server VM (build 1.9.0-ea-b54, mixed mode)
```

### AptanaStudioのインストール
1.AptanaStudioのダウンロード

http://www.aptana.com/index.html からダウンロードする

2.Aptana_Studio_3_Setup_Linux_x86_64_3.6.1.zipを展開

```console
$unzip Aptana_Studio_3_Setup_Linux_x86_64_3.6.1.zip 
```

3.起動

```
$ cd Aptana_Studio_3
$ ./AptanaStudio3
```

## エラーが出た時
### その１ AptanaStudio起動時にダイアログが出て「Exit code=-1」と表示される

```conaolw
JVM terminated. Exit code=-1
```

1.eclipse.iniの編集
以下のコードを-vmargsより上に追記

```console
-vm
/usr/bin/java
```
* javaのパスは以下のコマンドで表示されたパスを記載

```console
$ which java
```

### その２ AptanaStudio起動時に「MaxPermSize=256m」でエラーが出る

```console
$ ./AptanaStudio3
Unrecognized VM option 'MaxPermSize=256m'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
```

1.eclipse.iniの編集

```console
・・・
--launcher.XXMaxPermSize
256M
・・・
```

の部分を以下に変更

```console
--launcher.XXMaxPermSize=256M
```
ubuntu 14.04 LTS にRails4の環境を作る


ubuntu 14.04 LTSの環境にRails4の環境を作ってみたので手順をメモ。

#環境
OS:ubuntu 14.04 LTS
## インストール手順
###rbenvのインストール
1.rbenvをclone

```console
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

2.bashrcを修正

```console
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc 
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ . .bashrc 
```

3.rbenvの確認

```console
$ type rbenv
```

###Rubyのインストール
1.インストールできるバージョンの確認

```console
$ rbenv install --list
```


2.今回はRuby 2.1.5 をインストール

```console
$ rbenv install 2.1.5
$ rbenv rehash
$ rbenv global 2.1.5
```

3.インストールバージョンを確認

```console
$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
```

###Railsのインストール

1.Railsをインストール

```console
$ gem i rails --no-ri --no-rdoc
```

2.インストールバージョンを確認

```console
$ rbenv rehash
$ rails -v
Rails 4.2.0
```

##エラーが出た時
### その1 rbenv install --list でエラー
```console
$ rbenv install --list
rbenv install --listrbenv: no such command `install'
```

1. ruby-buildをclone

```console
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

2.再度listを表示

```console
$ rbenv install --list
```

### その2 rbenv installでエラー
```console
$ rbenv install 2.2.1
Downloading ruby-2.2.1.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/5a4de38068eca8919cb087d338c0c2e3d72c9382c804fb27ab746e6c7819ab28
Installing ruby-2.2.1...

BUILD FAILED (Ubuntu 14.04 using ruby-build 20150303)

Inspect or clean up the working tree at /tmp/ruby-build.20150314153959.5122
Results logged to /tmp/ruby-build.20150314153959.5122.log

Last 10 log lines:
make[3]: ディレクトリ `/tmp/ruby-build.20150314153959.5122/ruby-2.2.1/ext/fiddle/libffi-3.2.1' から出ます
linking shared-object fiddle.so
/usr/bin/ld: ./libffi-3.2.1/.libs/libffi.a(raw_api.o): 再配置 R_X86_64_32S (`.rodata' に対する) は共有オブジェクト作成時には使用できません。-fPIC を付けて再コンパイルしてください。
./libffi-3.2.1/.libs/libffi.a: error adding symbols: 不正な値です
collect2: error: ld returned 1 exit status
make[2]: *** [../../.ext/x86_64-linux/fiddle.so] エラー 1
make[2]: ディレクトリ `/tmp/ruby-build.20150314153959.5122/ruby-2.2.1/ext/fiddle' から出ます
make[1]: *** [ext/fiddle/all] エラー 2
make[1]: ディレクトリ `/tmp/ruby-build.20150314153959.5122/ruby-2.2.1' から出ます
make: *** [build-ext] エラー 2
```

1.libffi-devをインストール

```console
$ sudo apt-get install libffi-dev
```

2．再度Ruby 2.2.1 をインストール

```console
$ rbenv install 2.2.1
```
com.twitter.util.Future の ExecuteContext 相当のものは？

答え [FuturePool](https://github.com/twitter/util/blob/ade642eb1d05edd20a5dd8b9c0f87a958c19b4ce/util-core/src/main/scala/com/twitter/util/FuturePool.scala)

コメント読むと良さそう。細かい使い方は[テスト](https://github.com/twitter/util/blob/af1fbc7af36a755117fd2b4dca8bd3fac825363d/util-core/src/test/scala/com/twitter/util/FuturePoolTest.scala ) を見よう。

あとは検索するしかないです https://github.com/twitter/util/search?utf8=✓&q=FuturePool https://github.com/twitter/zipkin/search?utf8=✓&q=FuturePool https://github.com/twitter/finagle/search?utf8=✓&q=FuturePool

はい。

ExecutionContext.Implicits.global 相当は unboundedPool （
https://github.com/twitter/util/blob/develop/util-core/src/main/scala/com/twitter/util/FuturePool.scala#L67 ）でいいのかな。


ちなみに ExecuteContext と FuturePool の相互変換もあった https://github.com/twitter/bijection/blob/71ed7b50d3ef4b5083060457dec6e52b6f65bad8/bijection-util/src/main/scala/com/twitter/bijection/twitter_util/TwitterExecutionContext.scala
Rails(Grape)でAPIを作成する備忘録2

前回作ったAPIのクロスドメインアクセスを許可させてみた

##やったこと
rack-corsを追加

```rb:Gemfile
gem 'rack-cors', :require => 'rack/cors'
```

config/applicationを編集

```rb:config/application.rb
module APISample
  class Application < Rails::Application
    ... 
    config.middleware.insert_before ActionDispatch::Static, Rack::Cors do
      allow do
        origins '*'
        resource '*', :headers => :any, :methods => [:get, :post, :options, :patch, :delete]
      end
    end
    ...
  end
end
```

これだけで他ドメインからアクセスできるようになりました

参考
http://qiita.com/hkusu/items/b34f684b49751d9c9abd
genymotionからsqliteのデータを取り出す方法


* terminalから以下を実行<br>
`adb pull /data/data/package.name/databases/dbname.db`

  デバッグ用のアプリケーションをインストールしている場合は以下
   
 `adb pull /data/data/package.name.debug/databases/dbname.db`
サーバでd3.jsを使ってSVGを生成する．


d3.jsをサーバで動かした時のサンプル．
jsdomでDOMを生成して，HTMLタグ要素に変換している．


# 環境
- Linux
- Node.js v0.10.3x
- Node.js package
	- jsdom
	- d3.js

# コード

処理の流れは以下．
- DOMを生成．`global.document`に渡す．
- d3をロードして，DOMを参照する．
- d3.jsでDOMにデータを追加して，HTMLに出力する．
- SVGを削除

```javascript:serversideJS
// モジュールの読み込み
try {
  var jsdom        = require('jsdom').jsdom; // d3モジュールの前にjsdomをロードしておくこと
  
  global.document  = jsdom('<html><body><div id="container"></div></body></html>'); // DOMを生成する
  var d3           = require('d3');

} catch(error) {
  ...
}

// SVGを生成する
function createSvg() {
  d3.select('#container')
    .append('svg') // SVGを追加
    .attr('id', 'hoge') // SVGのID
    .attr('xmlns', 'http://www.w3.org/2000/svg')
    .attr('version',  '1.1')
    // 以下，SVGに追加する要素を記述

  // SVGデータをHTML形式に変換する．
  var svgHtmlTag = d3.select('#container').node().innerHTML;
  // => <svg id='hoge' xmlns='http://www.w3.org/2000/svg' version=''1.1''>...</svg>
  
  output(); // どこかに出力
  
  d3.select('#hoge').remove(); // hogeを削除．
}

(function () {
  createSvg();
})();
```

# 困った所

d3.selectで要素の指定方法と範囲が良く理解できていなかったので，ハマりました．
DOM構造を理解していないと，”どこ”のツリーを指しているのか分からず，思うようにデータが消えませんでした．
413「ふぇぇ…りくえすとえんてぃてぃ、おっきすぎるよぉ。」


この間やったcanvasの画像をmongoDBに保存する続き。

前回は適当にcanvasをfillしただけのデータだったのでいけてた気がしてたが、写真をセーブしようとしたらエラーでた。
``Error: 413 Request Entity Too Large``

``Sorry, the requested URL 'http://localhost:8080/post' caused an error:``

``Request to large``

ググって解決。
``bottle.BaseRequest.MEMFILE_MAX = 1024 * 1024``
でいけるっぽい。というかいけた。

これでいいやと思ったけど、デフォルトのpngやめてjpegで保存できるとどこかで読んだのを思い出して、やってみた。

``var img_src = canvas.toDataURL("image/jpeg",0.5);``みたいにしておけば、mongoでドキュメント見たときに``"img" : "data:image/jpeg;base64,/...``となってる。サイズが小さいのでエラーはでない。
サイズ確認するのに、``Object.bsonsize(db.collectionName.findOne({_id: ObjectId("ここにID")}))``としてるのが面倒。ターミナルで操作すると捗らない。

ちなみにchromeはカメラがちゃんと使えなくて（黒画面になる）、firefoxだとどっかにキャッシュされてるのか、作業後に再起動しないとエラーでカメラ使えなくなるときがある。
Windowsで過去の時刻のズレ確認方法

Windowsのイベントビューアのシステムログ内にある以下のログが時刻を変更したログです。

```
ソース：Kernel-General
イベントID：1
```

ログの内容に以下のような感じで出力されてました。

```

システム時間は ‎2015‎-‎03‎-‎14T14:59:16.601578800Z から ‎2015‎-‎03‎-‎14T14:59:16.600000000Z に変更されました。

```

でもこれは手動で時刻を変更した場合など、理由がなんであれ時刻が変わったときに出力されるログだそうで、時刻同期によって修正されたのか手動で変更したのかわからないので、時刻がずれているのかわからない。

ということで時刻同期したときに出力されるログを探したところ、どうやら以下の二つがあるそうです。

```
同期開始したログ
ソース：Time-Service
イベントID：37

同期終了したログ
ソース：Time-Service
イベントID：35

```

ということで同期終了した時あたりにあるKernel-Generalのログを見ればわかるんじゃないかなと。
あってるかな？
SKK で旧字旧かなと新字新かなを切り換へられる設定を書いた．(新字新かな)

SKK で旧字旧かなと新字新かなを切り換へられる設定を書いた．

#以下を home directory に置く：

ldic_kyuji.dic --- 北極三号改の辞書 npiiii.l.euc をこの名にしておく．
udic_kyuji.dic --- 旧字旧かなの user 辞書．
udic_kyuji.dic.BAK --- 旧字旧かなの user 辞書の backup.

ldic_shinji.dic --- SKK-JISYO.L をこの名にしておく．
udic_shinji.dic --- 新字新かなの user 辞書．
udic_shinji.dic.BAK --- 新字新かなの user 辞書の backup.

#以下を init.el に記述する：

```el:init.el
(setq skk-large-jisyo "~/ldic_kyuji.dic")
(setq skk-jisyo "~/udic_kyuji.dic")
(setq skk-backup-jisyo "~/udic_kyuji.dic.BAK")

(defun kyu-shin (x) (replace-regexp-in-string "kyu" "shin" x))
(defun shin-kyu (x) (replace-regexp-in-string "shin" "kyu" x))

(defun shinji-to-kyuji nil
  (interactive)
  (progn 
    (skk-mode -1)
    (skk-save-jisyo)
    (setq lub (list skk-large-jisyo skk-jisyo skk-backup-jisyo))
    (setq newlub (mapcar (function shin-kyu) lub))
    (setq skk-large-jisyo (nth 0 newlub))
    (setq skk-jisyo (nth 1 newlub))
    (setq skk-backup-jisyo (nth 2 newlub))
    (skk-mode 1)))

(defun kyuji-to-shinji nil
  (interactive)
  (progn 
    (skk-mode -1)
    (skk-save-jisyo)
    (setq lub (list skk-large-jisyo skk-jisyo skk-backup-jisyo))
    (setq newlub (mapcar (function kyu-shin) lub))
    (setq skk-large-jisyo (nth 0 newlub))
    (setq skk-jisyo (nth 1 newlub))
    (setq skk-backup-jisyo (nth 2 newlub))
    (skk-mode 1)))

(defun toggle-jitai nil
  (interactive)
  (cond 
   ((and 
    (equal skk-large-jisyo "~/ldic_shinji.dic")
    (equal skk-jisyo "~/udic_shinji.dic")
    (equal skk-backup-jisyo "~/udic_shinji.dic.BAK"))
   (shinji-to-kyuji))

   ((and 
    (equal skk-large-jisyo "~/ldic_kyuji.dic")
    (equal skk-jisyo "~/udic_kyuji.dic")
    (equal skk-backup-jisyo "~/udic_kyuji.dic.BAK"))
   (kyuji-to-shinji))
   ((t nil))))

(defun show-lub nil
  (interactive)
  (setq lub (list skk-large-jisyo skk-jisyo skk-backup-jisyo))
  (princ lub))

(global-set-key [f8] 'toggle-jitai)
(global-set-key (kbd "C-<f8>") 'show-lub)
```

#結果
Emacs および DDSKK の起動時は旧字旧かなで入力できる．
F8 で旧字旧かなと新字新かなを toggle できる．
C-F8 で現在の状態を表示できる．
ddskk の mode の絶対的な切り換え (新字新かな)

ddskk でひらがな・カタカナ・英字を toggle ではなく絶対的に切り換へられるようにした．
init.el 等に以下のように記せばよい．肝は，
・カタカナ mode, 英字 mode はそれぞれ skk-katakana, skk-latin-mode という変数が t になっている状態と定義できる．
・ひらがな mode は単一の変数では定義できず，skk-j-mode が t かつ skk-katakana が nil の状態と定義される．
の2点．
私は dvorak 排列を使っているので，keybind に登用した o, e, u は左手の home position にある．

```elisp:init.el
(defun skk-hiragana-set nil
  (interactive)
  (cond (skk-katakana
	 (skk-toggle-kana nil))
	(t
	 (skk-kakutei))))

(defun skk-katakana-set nil
  (interactive)
  (cond (skk-katakana
	 (lambda))
	(skk-j-mode
	 (skk-toggle-kana nil))
	(skk-latin-mode
	 (dolist (skk-kakutei (skk-toggle-kana nil))))))

(global-unset-key (kbd "C-o"))

(global-set-key (kbd "C-o o") 'skk-hiragana-set)
(global-set-key (kbd "C-o e") 'skk-katakana-set)
(global-set-key (kbd "C-o u") 'skk-latin-mode)
```
\maketitle を再定義する．(新字新かな)

LaTeX では \maketitle という命令で文書の標題と著者名を表示できる．しかし標準のままだとあまりにも大仰な表示がされるので，これを再定義してみる．

次のように stylefile を作ってみた：

```moderntitle.sty

\renewcommand\maketitle[0]{
	\hspace{-1em}
	\fontsize{24.88}{72}{\textgt{\@title}} \normalsize \\
	\vspace{-2em}
	\begin{flushright}
		\@date \quad \@author
	\end{flushright}
}
```

TeX 文書はこんなふうに作ってみる：

```document.tex
\documentclass[12pt]{jsarticle}

\usepackage[bold]{otf}
\usepackage{moderntitle}


\begin{document}
\title{第3回運営会議資料}
\author{運営委員長 山田太郎}
\maketitle
\section*{今日の議題}
あれやこれや．
\end{document}
```

結果として，次のように出力される：

![output](http://s15.postimg.org/53scdyuo9/ss2.jpg)
北大の wifi への login を自動化　(新字新かな)

#本文
北大の図書館等では wifi (elms-g) を利用できる．しかし，

![login](http://s30.postimg.org/vb7qgj5ap/elm2.png)
のような login 作業が必要になり，少し手間である．そこでこれを自動化してみた．

次のように ruby script を書いた：

```elms-g_login.rb
require 'mechanize'

username = '*****' # your id
password = '*****' # your password

agent = Mechanize.new
agent.get('https://webauth.ec.hokudai.ac.jp:8888/login-page1.html') do |page|
  page.forms[0].tap do |form|
    form.field_with(:name => 'name').value = username
    form.field_with(:name => 'pass').value = password
  end.click_button
end
```

これを実行すれば，問題なく wifi に login できる．

なお，私の使っている ruby の version は， 1.9.3p194 (2012-04-20 revision 35410) である．他の version では不具合が出るかもしれない．

#謝辞
北大の学内 wifi への login を自動化するという発想は， [mole-studio](http://d.hatena.ne.jp/mole-studio/20130614) からいただきました．ありがとうございます．

riocampos さんのご指摘により

```elms-g_login.rb
require 'rubygems'
```

を削除しました．ありがとうございます．
北大の学内 wifi (elms-g) への接続を自動化する．(新字新かな)

北大の図書館や一部の校舎では，学内 wifi  (elms-g) を利用できる．本稿ではこれへの接続を自動化する方法を書く．

私は wifi への接続に wicd-cli を使っている．本稿に登場する option の意味をあらかじめ書いておくと，

```wicd-cli -h
  -n NETWORK, --network=NETWORK
  -p NETWORK_PROPERTY, --network-property=NETWORK_PROPERTY
  -S, --scan            
  -l, --list-networks   
  -c, --connect         
  -y, --wireless        
```

のとおりである．

elms-g の飛んでいる場所で 

```
$ wicd-cli -ySl
```
とすると，

```
#	BSSID			Channel	ESSID
0	00:1D:73:C2:AB:50	1	elms-g
1	00:1D:73:C2:AB:53	1	eduroam
2	00:1D:73:C2:AB:52	1	elms-x
```
のように表示される．

次いで，

```
$ wicd-cli -ycpelms-g
```
としてやれば，elms-g としてやれば，elms-g に接続できる．実は，

```
$ wicd-cli -ySl
```

の手順は不要である．当該の場所に着いて PC を開いたら，即座に

```
$ wicd-cli -ycpelms-g
```

としてやれば，elms-g に接続できる．

このようにして快適な elms-g 生活をしてきたが，error が出てうまくいかないことがあると気づいた．そういうときに

```
$ wicd-cli -ySl
```

としてやると，

```
#	BSSID			Channel	ESSID
0	10:6F:3F:E5:C6:C3	1	eduroam
1	10:6F:3F:E5:C6:C0	1	elms-g
2	10:6F:3F:E5:C6:C2	1	elms-x
3	00:1D:73:F8:D4:30	6	elms-g
4	00:1D:73:F8:D4:32	6	elms-x
```

のように表示される．どうやら，"elms-g" と名乗る電波が複数あって，wicd-cli に "elms-g" と指定してやったのではどの電波なのか同定できない，というのが原因のようだ．ならば，番号で指定してやろう．

```
$ wicd-cli -ycn1
```

としてやったら無事に接続できた．

elms-g の番号を調べる → その番号で接続する

の流れを自動化してやろうと思い，下のように script を書いた：


```connect_elms-g.rb
wave_list = `wicd-cli -ySl`
wave_list.each_line do |line|
  if line.match(/elms-g/) then
    $num = line.split("\t")[0]
  end
end

command = "wicd-cli -ycn" + $num
system(command)
```

elms-g と名乗る電波の番号を取得して，そのうち最も大きいものを $num に格納して，その番号の電波に接続する，という script である．

elms-g に接続したあと，LAN への login が必要になる．これを自動化する方法は 

[北大の wifi への login を自動化](http://qiita.com/ticonz/items/7faefb3965238d27f96a)

に記した．私は .zshrc に

```.zshrc
alias wie='ruby $HOME/connect_elms-g.rb; ruby $HOME/elms-g_login.rb'
```

と書いてあるので，図書館等で PC を開いたら

```
$ wie
```

とすることですぐに net を利用できる．便利である．
NUCにCentOS 6.6でセットアップ

#NUC
NUC DN2820FYKH を購入。一応事前に調べてCentOSがインストール出来そうってのは分かっていたけど、つまずく人も多いかも。
##BIOS Update
BIOSをアップデートしないと、色々とトラブルの元みたいです。
[Intel Download Center](https://downloadcenter.intel.com/ja/search?keyword=%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AB%C2%AE+NUC+%E3%82%AD%E3%83%83%E3%83%88+DN2820FYKH)
検索ワード : NUC DN2820FYKH | 型番が違う場合、各々変更してほしい。

[BIOS アップデート [FYBYT10H.86A ]](https://downloadcenter.intel.com/ja/download/24709/BIOS-FYBYT10H-86A-)
執筆時の最新は上記である。特別なことがない限り閲覧時の最新BIOSを推奨する(つまり上記URLのBIOSを適応する前に最新か確認)

###手順
ダウンロードした FY00XX.BIO ファイルを USB媒体へコピー。フォーマットはFAT系
NUCにUSBメモリーとキーボードを接続し電源押下
F7を押し続け BIOS Flash Update 先ほどの FY00XX.BIO を選択し、Update
※電源ボタンのLEDが点滅している間は更新中と思われるので注意
更新後、再起動したら F2 で BIOS画面を呼び出す。このBIOSがやば格好良い！
BIOS Versionが XX になっているのを確認。

###BIOS 設定変更
UEFI Boot のチェックを外し、設定を保存。チェックが入っていると影響あるそうです。

##CentOS
CentOS7が出ているので、 7 にしようかなーと色々調べると MySqlではなくGoogleも利用しているMariaDBを推奨するように変更されているとのこと。
興味あるけど、NUCにCentOS7が入るか不明だったので、今回はCentOS6.6を選択。

###Installer作成
CentOS 6.6のイメージをダウンロード [CentOS 6.6 Download mirror](http://isoredirect.centos.org/centos/6/isos/x86_64/)
minimal.iso か netinstall.iso でいいでしょう。

ダウンロードしたら、USBメモリーに書き込みます。フォーマットはFAT系

USBメモリーのマウント場所を確認
```localDomain: username$ diskutil list
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                                                   *4.1 GB     disk1
```

アンマウント ※ USBメモリが /dev/disk1 として認識されている場合
`localDomain: username$ diskutil unmountDisk /dev/disk1`

書き込み
`localDomain: username$ sudo dd if=CentOS-6.6-x86_64-netinstall.iso of=/dev/disk1 bs=1m`

取り出し
`localDomain: username$ sudo diskutil eject /dev/disk1`

###セットアップ
出来上がったUSBメモリをNUCに差し込み起動。
F10でBOOTする媒体を選べるので、USBからBOOT
SKK の句読点を「、。」と「，．」で toggle できるやうにした．(新字新かな)

次のように init.el に書いてやればいい．

```init.el
(defun toggle-skk-kutouten-type nil
  (interactive)
  (cond
   ((equal skk-kutouten-type 'en)
    (setq-default skk-kutouten-type 'jp))
   ((equal skk-kutouten-type 'jp)
    (setq-default skk-kutouten-type 'en))
   ((t nil))))


(global-set-key (kbd "<f7>") 'toggle-skk-kutouten-type)
```
Command 指向の Emacs 利用 (新字新かな)

Emacs は大変便利だ．しかし，いろいろな key bind を記憶するのが辛い．記憶できても，指がもつれる．この問題を解決するのが，本稿で紹介する「Command 指向の Emacs 利用」である． 

# 「Command 指向の Emacs 利用」とは何か 

「Command 指向の Emacs 利用」とは，command を打ち込んで Emacs を操作することを本則とする利用法である． 

# Command を入力するには 

M-x を押して，command 名を入れてやればよい．Command 名は概ね系統的に命名されているし，command 入力では Tab や C-i による補完が使えるから，楽だ． 

# M-x を押すのが辛いならば 

init.el に 

```init.el 
(global-set-key [tab] 'execute-extended-command) 
``` 

と書いてやる．「M-x」は実は「execute-extended-command」という command を実行しているのだ．私はこの command に tab を割り当てているが，もちろん，他の key でもよい． 

# Command 名を思い出せぬときは 

「apropos」という command を使う．Keyword を入力すれば，それに関係する command や変数を表示してくれる． 

# 長い command 名を入力するのが辛いならば 

Command に alias を設定できる．例えば init.el に 

```init.el 
(defalias 'kb 'kill-buffer) 
``` 

と書いてやれば，「kill-buffer」という command に「kb」という alias を与えられる． 

# key bind から command 名を知るには 

「describe-key」という command を活用する．M-x describe-key の後に当該の key bind を入力すれば，その key bind がどの command を実行しているかを表示してくれる． 

# key の押し間違いに悩むならば 

その key bind を無効にしてやる．やはり init.el に 

```init.el 
(global-unset-key (kbd "C-o")) 
``` 

と書いてやれば， C-o を押しても何も起こらなくなる． 

# 最後に 

皆様の快適な emacs life のお役に立てたらうれしいです！
Amazon AWSの資料


# Amazon AWS

- amazon aws説明資料  
http://dev.classmethod.jp/cloud/aws/aws-overview-for-non-engineers/#overview
- ビデオ
http://aws.amazon.com/jp/
	- クラウド導入によるメリットを投資観点から説明したビデオ．
- スライド
http://www.slideshare.net/AmazonWebServicesJapan

- ホワイトペーパ
http://aws.amazon.com/jp/whitepapers/

- 説明資料
http://d36cz9buwru1tt.cloudfront.net/jp/wp/AWS_Overview.pdf
Raddishのドキュメント

http://getraddish.com/
githubに書いてなかった？からメモ

それ関係のスレッド
https://github.com/JaspervRijbroek/raddish/issues/193

上記に記載されてたサンプルプロジェクト
https://github.com/JaspervRijbroek/raddish-examples
Angularのtemplateでng-classがたくさんあるとき in Jade



```jade
div(
  ng-class= "{" +
    "'cls-a': type === 'a'," +
    "'cls-b': type === 'b'," +
    "'cls-c': type === 'c'," +
    "'cls-d': type === 'd'"  +
  "}"
).base-class
 p こんにちは

```

こうやって書くと良い。まずインデントが見やすくなるし。なんか変更があるときに　↓


![pr.gif](https://qiita-image-store.s3.amazonaws.com/0/2204/c693f2a9-6b18-f95a-609a-52daa2cd7576.gif)

こうやって、一気に変更できるのだ。

やったね！！
TabBarControllerを使う Swift版


**このメモはswiftもUIKitについてもほぼ知識ゼロな人が勉強のメモとして書いています。色々間違っている可能性があるので、ご注意下さい**

# プロジェクト作成時の設定

1. プロジェクト作成時にTabbed Applicaitonを選択するだけ

# 新しいタブの追加方法

1. Storyboardを開く
2. ViewControllerを追加する
3. TabBarControlelrをStoryboard上で2.で追加したViewにControl+Dragする
4. RelationshipSegue - view controllersを選ぶ

[iOS Quick Tip: Creating a UITabBar Application with Storyboards](http://code.tutsplus.com/tutorials/ios-quick-tip-creating-a-uitabbar-application-with-storyboards--mobile-10449)

# タブのアイコンの変更方法

1. Storyboard上で変更したいViewのタブ部分を選択
2. Attributes InspectorでSystem Itemを変更
	Customにすれば好きなアイコンを表示出来る？

# カスタムTabController導入手順

1 UITabBarControllerを継承したコントローラを定義
2 UITabBarControllerDelegate protocolを定義したクラスのインスタンスをdelegateメンバ変数に設定する

```swift
import UIKit

class MyTabBarController: UITabBarController, UITabBarControllerDelegate  {
    override func viewDidLoad() {
        println("viewDidLoad")
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.delegate = self
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //UITabBarControllerDelegateプロトコルを実装する
    func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
        println("shouldSelectViewController")
        return true
    }
    //UITabBarControllerDelegateプロトコルを実装する    
    func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
        println("didSelectViewController")
    }
    
}
```

3 Interface Builder上でTab Bar Controllerを選択し、定義したカスタムTabControllerクラスを下記のように指定する

![スクリーンショット 2015-03-14 22.40.59.png](https://qiita-image-store.s3.amazonaws.com/0/13615/c9250c52-4606-9dfb-4f1a-fe0b1d13f835.png "スクリーンショット 2015-03-14 22.40.59.png")

# TabBar上にバッジを表示する

- Content view controlelrが保持するtabBarItemプロパティのbadgeValueに値を設定してあげればいい
- 以下は選択されたタブにバッジを付ける実用性のないサンプル

```swift
    func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
        viewController.tabBarItem.badgeValue = "1"
    }
```


# 参考

[UITabBarController Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UITabBarController_Class/index.html#//apple_ref/occ/cl/UITabBarController)

[View Controller Catalog for iOS](https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/TabBarControllers.html#//apple_ref/doc/uid/TP40011313-CH3-SW4)
Selenium2+Ruby で作業自動化


# Ruby の準備
これでやってた。
http://qiita.com/8mamo10/items/677d62fa0348f5bb4824

# Selenium のインストール

```ruby
gem install selenium-webdriver
```

# 簡単なサンプルで動作確認
これで firefox 立ち上がって、google 開いて、firefox 終了したらきっと OK。

```ruby
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.navigate.to 'https://www.google.co.jp/'
driver.quit
```

この辺に、もうちょっと詳しく載ってる。
https://code.google.com/p/selenium/wiki/RubyBindings

# ブラウザでの登録処理を自動化した例
テストで、まとまった数のユーザを登録する必要があったので。
これを実行すると、firefox で 30 人ユーザ登録してくれる。

登録処理の遷移は、`入力ページ`→`確認ページ`→`登録完了ページ`。

(2015/7/30) riocampos さんからの指摘を受けてコード微修正

```ruby
require 'selenium-webdriver'

# 各入力欄で、何入れるか・何選択するかの対応表
# メールアドレスとかは少しずつ値をずらしてる
text = [
  ['last_name',     'test_%d'],
  ['first_name',    'test_%d'],
  ['nick_name',     'test_%d'],
  ['user_mail',     'test_%d@example.com'],
  ['user_password', 'test'],
  ['user_password_confirm', 'test'],
]

select = [
  ['user_pref',         1],
  ['user_birth[year]',  30],
  ['user_birth[month]', 1],
  ['user_birth[day]',   1],
]

radio = [
  ['user_sex',   0],
]

driver = Selenium::WebDriver.for :firefox

# メールアドレスが重複すると登録失敗するんで、
# 前回どこまで数字使ったかを覚えておいて、start の値を決める
start = 0
# 何回登録処理を行うか
num = 30

num.times do |i|

  # 入力ページの URL
  driver.navigate.to 'http://xxxxxx'

  text.each do |id, data|
    element = driver.find_element(:id, id)
    s = sprintf(data, start + i);
    element.send_keys(s);
  end

  select.each do |id, data|
    element = Selenium::WebDriver::Support::Select.new(driver.find_element(:name => id));
    element.select_by(:index, data)
  end

  radio.each do |id, data|
    elements = driver.find_elements(:name, id)
    elements[data].click
  end

  # 入力ページの submit をする
  driver.find_element(:xpath, '/html/body/div[3]/div[2]/div/div/form/div/input').click
  # 確認ページの submit をする
  driver.find_element(:xpath, '/html/body/div[3]/div[2]/div/div/form/div/input[2]').click

  # 登録完了ページが表示される
end
```
SoftLayerの無料ベアメタルでOpenStackの学習をする(4) - Horizonへのアクセス

[前回はこちら](http://qiita.com/orz/items/4629577032a1a0f77d53) - [次回はこちら](http://qiita.com/orz/items/ad7b23756f290d1dcf61)
***
#これはなに
[「OpenStackクラウドインテグレーション オープンソースクラウドによるサービス構築入門」](http://www.shoeisha.co.jp/book/detail/9784798139784)の実習をSoftLayerの無料ベアメタルで行う記録である。
![OpenStackクラウドインテグレーション オープンソースクラウドによるサービス構築入門](http://www.seshop.com/static/images/product/17681/L.png)

# Horizonへのアクセス
本書では、基本的にCLIで操作をするが、Horizonからの状況確認も行うことになっている。本ではUbuntu Desktop上に環境を構築しているのでホストのGUIでブラウザーを動かしHorizonにアクセスすればいいが、今回はSoftLayerのベアメタルである。標準ではGUIは使えない。IPMIのローカルコンソールやvncでGUIを使う方法もあるが、今回はnginxでReverse Proxyを構築することとする。
ただし、いくらテスト環境だからといって、Horizonを書籍に載っているユーザー名・パスワードで全世界に公開するわけにはいかない。
SoftLayerのシステムはインターネットに公開されるPublicとしてIPの他、内部からのみアクセス可能なPrivare IPの二つのIPが割り当てられている。そこで、Privare IPだけでHorizonを利用可能にしよう。
なお、複数のデータセンターにサーバーを構築した場合、Privare IPでデータセンター間の通信もできる。Privare Lanを経由したトラフィックは、データセンターをまたがっても、どれだけ使っても無料なのがうれしい。

## Private Lanへの接続方法
Private Lanに接続する方法はいくつもあるが、一番お手軽なのはSSL-VPNだ。ブラウザーで[アクセスポイント一覧](http://www.softlayer.com/VPN-Access)にアクセスし、希望の接続先をクリックするだけでいい。JavaのVPNクライアントが導入され、VPN接続が完了する。なお、アクセス先はサーバーのあるデータセンターとは無関係でよい。どのアクセスポイントにつなげても、すべてのデータセンターの自分のPrivate Lanに接続できる。
Javaを使いたくない人は、クライアント([Windows用](http://speedtest.dal05.softlayer.com/array/ArrayNetworksL3VPN_WIN.zip)、[Mac用](http://speedtest.dal05.softlayer.com/array/ArrayNetworksL3VPN_MAC.zip)、[Linux用](http://speedtest.dal05.softlayer.com/array/ArrayNetworksL3VPN_LINUX.zip))をダウンロードして利用する。
注意が必要なのは、VPNアクセス用のパスワードは、ポータルへのログインのものとは別に、独立して存在していることである。デフォルトでは設定されていないので、ユーザーが自分で設定する必要がある。また、マスターユーザーで無い場合、マスターユーザーにVPNアクセスを可能にしてもらう必要がある。

## nginxの導入と設定
今回の環境では、HorizonのURLは「[http://192.168.100.10/](http://192.168.100.10/)」である。KVM環境の内部LANのため、もちろん外部からはアクセスできない。そこで、nginxをReverse Proxyとして設定する。
まず、導入。

```
sudo apt-get install nginx
```

/etc/nginx/conf.dにhorizon.confという名前で、下記を作成する。

```
upstream horizon {
  server 192.168.100.10:80;
}

server {
  listen [Public_Ip]:80;
  server_name _;
  return 444;
}

server {
  listen [Private_Ip]:80;
  server_name [Private_Ip];
  location /  {
    proxy_pass http://192.168.100.10/;
  }
}
```

そして、nginxを起動。

```
sudo service nginx restart
```

[Public_Ip]と[Private_Ip]には、実際のIPアドレスが入る。[444は接続を閉じるnginx の特別な標準外コード](http://nginx.org/ja/docs/http/request_processing.html#how_to_prevent_undefined_server_names)で、Public Ipへのアクセスはただちに切断される。
Private IPへのアクセスは[http://192.168.100.10/](http://192.168.100.10/)に転送され、Horizonにつながる。
restartしているのは、個人的な好み。起動中でも停止中でも、新たに起動できるので使っている。
![04-01.png](https://qiita-image-store.s3.amazonaws.com/0/71995/774cdd88-f2c8-e5c4-6b77-6cad9e696f2b.png)
時間があるときにFirewallでふさごう。nginxも必要な時だけ起動することとする。
***
次回の5章より、いよいよストーリー仕立てのOpenStack活用が始まる。
***
[前回はこちら](http://qiita.com/orz/items/4629577032a1a0f77d53) - [次回はこちら](http://qiita.com/orz/items/ad7b23756f290d1dcf61)
JacksonつかってJavaオブジェクトをJSONに変換する際、enum型を数値で出力する



JacksonっていうのはJavaオブジェクトをJSON文字列に変換してくれる便利なアレです。
Jackson自体に関してはいろいろ記事があるのでそれを参考にしてください。

* [FasterXML/jackson | Github](https://github.com/FasterXML/jackson)
* [Jackson使い方メモ | Qiita](http://qiita.com/opengl-8080/items/b613b9b3bc5d796c840c)
* [Jackson JSON Processor | so-zou.jp](http://so-zou.jp/software/tech/programming/java/package/json/jackson.htm)


# enumが文字列として出力されてしまうのダルい

今回の問題点は、以下です。

```
Javaオブジェクトにenum型が含まれる場合、値が数値ではなくキーの文字列として出力されてしまう
```


例えば以下。

```java
// enum型を定義
public enum DayOfWeek {
	Sunday,
	Monday,
	Tuesday,
	Wednesday,
	Thursday,
	Friday,
	Saturday
}

// オブジェクトのクラスを定義
public class PeriodicTodo implements Serializable {
	private String todo;
	private DayOfWeek day;

	public String getTodo() { return todo; }
	public void setTodo(String todo) { this.todo = todo; }
	
	public DayOfWeek getDay() { return day; }
	public void setDay(DayOfWeek day) { this.day = day; }
}
```

あとはこれを使ってJavaオブジェクトをJSONにシリアライズ

```java
// インスタンス生成
PeriodicTodo todo = new PeriodicTodo();
todo.setTodo('do something');
todo.setDay(DayOfWeek.Monday);


// シリアライズ
ObjectMapper mapper = new ObjectMapper();
String serialized = mapper.writeValueAsString(todo);
System.out.println(serialized);

// ホントはMondayを数値で出力したかった！！
// 結果　==> { "todo":"do something","day":"Monday" }
```

# enumでも独自にシリアライズできるようにする

dayは数値で出力したいっていう場合には独自のシリアライザを作りましょう。

以下のようにenumにJsonSerializableを実装し、Jsonシリアライズ可能にしてやります。

```java
// enum型をシリアライズ可能に
public enum DayOfWeek implements JsonSerializable {
	Sunday,
	Monday,
	Tuesday,
	Wednesday,
	Thursday,
	Friday,
	Saturday;
	
	@Override
	public void serialize(JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
		jgen.writeNumber(ordinal());
	}
	
	@Override
	public void serializeWithType(JsonGenerator jgen, SerializerProvider provider, TypeSerializer typeSer)  throws IOException, JsonProcessingException  {
		jgen.writeNumber(ordinal());
	}
}
```

あとはさっきと同じことすれば見事数字で出力されます

```java
// インスタンス生成
PeriodicTodo todo = new PeriodicTodo();
todo.setTodo('do something');
todo.setDay(DayOfWeek.Monday);


// シリアライズ
ObjectMapper mapper = new ObjectMapper();
String serialized = mapper.writeValueAsString(todo);
System.out.println(serialized);

// 結果　==> { "todo":"do something","day":1 }
```

enumでもimplementsできるなんて地味に知らなかった。