OmniAICreator/Qiita-1.07M huggingface dataset:
Term 2 でテキストが読めない

Term 2 が One Dark Theme だと背景色とテキストカラーの明度がほぼ同じで読めない。
とりあえず、styles.less を修正し、乗り切る。

```~/.atom/styles.less
.term2 {
  .terminal {
    color: mix( hsl(220, 100%, 66%), hsl(0,0%,72%), 12%);
  }
}
```
Bootstrap: navbarをデフォルトでcollapseさせる


- [http://getbootstrap.com/customize/](http://getbootstrap.com/customize/) でも良いかとおもいますが

## bower インストール

- [anyenvでnpm install bower -g](http://qiita.com/hidelafoglia/items/e1e85a785f4e1d5d0b29)


## grunt インストール

~~~
$ npm install -g grunt-cli
~~~

## bootstrap インストール

~~~
$ bower install bootstrap
$ cd bower_components/bootstrap/
~~~

## 依存パッケージインストール

~~~
$ npm install
~~~

## variables.less:@grid-float-breakpointの修正

~~~
$ vi less/variables.less 
~~~

- デカめのスクリーンでもcollapseするように変数を修正

~~~
//@grid-float-breakpoint:     @screen-sm-min;
@grid-float-breakpoint:    2000px; 
~~~

## ビルド

~~~
$ grunt dist
~~~

## dist を配布

~~~
$ tree dist
dist
├── css
│   ├── bootstrap-theme.css
│   ├── bootstrap-theme.css.map
│   ├── bootstrap-theme.min.css
│   ├── bootstrap.css
│   ├── bootstrap.css.map
│   └── bootstrap.min.css
├── fonts
│   ├── glyphicons-halflings-regular.eot
│   ├── glyphicons-halflings-regular.svg
│   ├── glyphicons-halflings-regular.ttf
│   ├── glyphicons-halflings-regular.woff
│   └── glyphicons-halflings-regular.woff2
└── js
    ├── bootstrap.js
    ├── bootstrap.min.js
    └── npm.js

3 directories, 14 files

~~~
gitで削除したファイルを復活させる

gitで削除したファイルを復活させるコマンドを覚えられないのでメモ

git rev-listで削除したコミットを調べる。
```
$ git rev-list -n 1 HEAD -- (削除したファイルパス)
3348b8148327353a092d72230feb457737a74338
```
git checkoutでコミットを指定して復活させる。
```
$ git checkout 3348b8148327353a092d72230feb457737a74338^ -- (削除したファイルパス)
```
Kobito for Windows 使ってみた

[QiitaがMarkdownメモツール「Kobito」のWindows版をElectronベースでリリース  |  TechCrunch Japan](http://jp.techcrunch.com/2015/05/12/qiita-releases-markdown-tool-kobito-for-windows/)

> プログラマのための技術情報共有サービス「Qiita」（キータ）を提供するIncrementsが今日、Markdown形式のメモツール「Kobito for Windows」をリリースした。Microsoftが5月29日にリリースしたばかりのコードエディタ「Visual Studio Code」と同じく、これは「Electron」（旧Atom Shell）と呼ばれるオープンソースのデスクトップアプリ開発プラットフォームを使って実装されたものだ。

初回に GitHub でログインしようとすると、何も表示されなくなって「戻る」のボタンだけ表示されるという状態になったが、[個人用アクセストークン](https://qiita.com/settings/applications)を発行して、Kobito の設定画面の以下の部分にアクセストークンをコピペすればログイン出来た。

![](http://go-gyazo.appspot.com/05fd6953ecefa724.png)

<del>Kobitoからアップロードも出来なかったのでおそらくProxy周りに対応していないのかもしれない。</del>GitHub 認証をやめてQiitaのユーザパスワードで入りなおしたら一覧もアップロードも出来た。おそらくGitHub認証がおかしい。

使い勝手だけど、設定画面に「更新」ボタンが無いので若干モニョるのと、画面下まで移動しないと「戻る」が無い。<del>あとMac版にこの機能があるのかどうか分からないけど、画像をポスト出来る機能があれば便利そうだなと思った。</del>ドラッグアンドドロップで出来るらしいです。チートシートに書いてました。
vimキーバインディングが付いてて「おっ！」と思ったが若干バギーな気がする。ノーマルモード時の行末移動や最下行へのジャンプを行っていると稀にカーソルが思った所に移動しない現象が起きた。再現不可。出来ればvimキーバインディングでもコピペは欲しい。

その他の機能については概ねイイカンジです。

![](http://go-gyazo.appspot.com/2546b853f1bfd946.png)

Markdown のプレビューも綺麗だし、自動保存も便利。欲を言うと設定画面に行きたい場合に書きかけ文書を保存したくない。

あと、中の人によると[CSSファイルを置くとデザインを弄れる](http://twitter.com/mizchi/statuses/597932416833949697)らしいので、背景に画像貼ったりとか出来るんじゃないかと思います。
各 SNS のブランドカラー

![](https://qiita-image-store.s3.amazonaws.com/0/20613/03024be7-ead1-6133-965d-ab428486062d.png)

Qiita のユーザーページでなにか違和感があると思ったら各 SNS へのリンクに使われているロゴの色が正しくないからでした。

```css
.userPage_oauthLink a[href^="https://github.com/"] { color: #333333; }
.userPage_oauthLink a[href^="https://twitter.com/"] { color: #55acee; }
.userPage_socialLink a[href^="https://facebook.com/"] { color: #3b5998; }
.userPage_socialLink a[href^="https://plus.google.com/"] { color: #dd4b39; }
```

というスタイルシートを書いて解決。

![](https://qiita-image-store.s3.amazonaws.com/0/20613/93bdb8e1-b777-91ab-a5f8-db66c6939361.png)

すっきり!

……

とまあ、ここでおわっても良いのですが、ロゴの色は Twitter と Google+ はガイドラインの提供があります。ほかの箇所との統一性という問題もありますが、できる限り従ったほうが良いでしょう。

- [Twitterのブランドガイドライン | About](https://about.twitter.com/ja/press/brand-assets)
- [ブランディングに関するガイドライン - Google+ Platform &mdash; Google Developers](https://developers.google.com/+/branding-guidelines?hl=ja)

また他社のサービスに関しても [BrandColors](http://brandcolors.net/) という非常に便利なウェブサイトがあり、こちらを参考にすると、統一感を持たせることができ、閲覧者に違和感を与えないでしょう。

「色」というのは結構面倒な問題でありますので、こうしたガイドラインは各社が公式に提供してくれれば助かるのになあ……と思うばかりです。
Ansible+AzureでVM作成


azureもansibleのazureモジュールもあんまりドキュメント無くて結構はまったので誰かの参考になればと思いメモ

# 環境

* OSX 10.10
* python 2.7
* ansible 1.9

# 前提条件

* 管理証明書作成済み、Webコンソールからアップロード済み
* VMのSSHログイン用鍵ペアは作成済み

# 手順

## azure操作用パッケージをインストール

```
sudo pip install azure
```

## azure認証情報を環境変数にセット

サブスクリプションIDと、管理証明書の場所を環境変数に指定する。

```
export AZURE_SUBSCRIPTION_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
```

```
export AZURE_CERT_PATH=~/.ssh/manage.pem
```

この証明書をmacで作ろうとしてめっちゃハマった。
色んなサイト見たけど結局公式の[ここ](http://azure.microsoft.com/ja-jp/documentation/articles/cloud-services-python-how-to-use-service-management/
)の手順で作成したpem使ったら通った。

```
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
openssl x509 -inform pem -in mycert.pem -outform der -out mycert.cer
```

コンソールにアップロードするのはcer、クライアントで使うのはpemなので注意。

## VM作成用playbookの作成

VM作成用のplaybookとインベントリファイルを作成する。

```create_vm.yml
- hosts: 127.0.0.1
  connection: local
  tasks:
    - name: create new virtual machine
      local_action:
        module: azure
        name: sample-vm
        role_size: Small
        image: 0b11de9248dd4d87b18621318e037d37__RightImage-CentOS-6.6-x64-v14.2.1
        location: 'Japan West'
        user: admin
        state: present
        ssh_cert_path: ~/.ssh/sample.pem
        storage_account: storage_account_name
        password: s@mple1234
        wait: yes
```

```hosts
127.0.0.1
```

## Playbookの実行

```
ansible-playbook -i hosts create_vm.yml
```

結構遅いので進捗気になる方は`-vvv`とか付けて。

## インスタンスへのアクセス

混んでなければ多分デプロイから3〜5分くらいでインスタンスにアクセス出来るようになる。
特に何も設定しなければport22のアクセスが許可されているはずなので、

```
ssh admin@sample-vm.cloudapp.net -i ~/.ssh/sample.pem
```

とかやればアクセス出来る。

## 備考

### VMの名前

cloudapp.net内でユニークである必要がある。
重複しててもエラーメッセージが出ず、最後のVM確認でNot Foundエラーになるので地味に分かりづらい。

### 証明書

VM用証明書も管理証明書作成と同じように作ってpemを指定する。

### パスワード

[ansible公式](http://docs.ansible.com/azure_module.html#this-is-a-core-module)には必須じゃないと書いてあるけど、新規インスタンス作成時はpasswordが無いとエラーになる。
6-72文字で記号と数字(?)を含める必要あり。

### ストレージ作成

今のところストレージの自動作成オプションは無さそうなので、手作業で作ったものを使うか、nodeのazureパッケージかなんか使って自動化する必要がありそう。

### ストレージのロケーション

ストレージのlocationとインスタンスのlocationをあわせる必要がある。

# 参考

ansible公式ドキュメント
http://docs.ansible.com/azure_module.html

ansibleのazureモジュール
https://github.com/ansible/ansible-modules-core/blob/9d25d88b9a993d628afdd69a06793debca37c5d1/cloud/azure/azure.py

Microsoft公式
http://azure.microsoft.com/ja-jp/documentation/articles/cloud-services-python-how-to-use-service-management/
Git サーバを移行する



- 旧サーバからデータ取得する

```
git clone --mirror git@example.com:example.git
```

- 新サーバへデータをプッシュする

```
cd example
git push --mirror git@new-example.com:example.git
```

- 既存リポジトリの remote origin を変更する

```
git remote set-url origin git@new-example.com:example.git
```
ネットワーク関連のコマンドいんすとーる、OSバージョンコマンドなど、自分めも

# ネットワーク関係コマンド
コマンド使いたいけど、あれなんのパッケージをインストールするんだっけ？ってよく忘れるのでその自分メモ

# yum

| ソフトウェア | パッケージ |
|:-----------|:----------|
|mail    |mailx      | 
|telnet        |telnet    |
|nmap        |nmap    | 
|nslookup, dig        |bind-utils    | 
|ifconfig        |net-tools    | 

# メールのテスト
echo "メール本文" | mail -s "メール件名" hoge@ドメイン

# ip , ss コマンドが思ったより使える！！
[Deprecated Linux networking commands and their replacements](https://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/)

```
$ ip a
$ ip r
$ ss
```

# OSのバージョンなど確認するコマンド

```
OSバージョンの確認
$ cat /etc/redhat-release　　（CentOS, RedHatのとき）
$ uname -a
アーキテクチャの確認
$ arch
$ getconf LONG_BIT
```
android-5.1.1_r2メモ


5.1.1_r1からのコミット

特に大きな変更はないようです。
frameworkは一件でNexus9向けの対応のようですね。

## project bootable/recovery/
e4b838b Bump up max_map_count value.

## project build/
750a343 "LRX22L"
db01341 LRX22K
8313af3 LRX22J
65024e1 LRX22I
686fac0 "LRX22H"

## project cts/
29252f4 Further refinement of the alarm batching test
75a1a5c Tweak alarm batching CTS test
14af22a Add alarm test for exact/inexact coalescing

## project external/chromium_org/
c212afe Fix crash in Java Bridge methods that can receive a non-existant object ID
ced57b7 Cherry pick [Android] Support unfocusable container views.

## project frameworks/base/
e0dd951 Increase timeout when uncrypting OTA
selenium IDEで作ったテストケースでchrome,IEでもテスト実行する


# selenium IDEで作ったテストケースでchrome,IEでもテストをする。

以前投稿した、http://qiita.com/takky/items/73b71b36dab037072e7c
でselenium IDEでテストケースを作成し、FireFoxでテストを行った。
しかし、Webプログラミングでは他のブラウザでもテストを行いたいという要望は発生する。

特にIE

そのため、selenium IDEで作ったテストケースで他ブラウザでもテストを行えるようにする。

# 環境準備
## eclipse
### DL

eclipseをダウンロードする。日本語化されると便利なので、今回はPleiadesを使用する。
http://mergedoc.sourceforge.jp/

Eclipse 4.4 Luna Pleiades All in Oneを使用して、説明を行う。
ダウンロードするバージョンは Javaが使えればいいので、Javaで。またOSが64bitだったので64bitのStandard Editionを使用した。バージョンはお好みで。

### インストール
zipなので解凍すればいいが、ファイル名が長くて解凍ができない場合があるので、可能であればCドライブ直下でa.zipのようにして解凍するとよい。その後、好みのディレクトリに配置する。

## WebDriver
### Java用
http://docs.seleniumhq.org/download/ からJava用のWebDriverを DLして、解凍しておく。

### IE用
http://docs.seleniumhq.org/download/ の The Internet Explorer Driver Serverから使用中のIEにあわせたbitのDriverをDL、解凍する。
その後IEを開いて、ツール→インターネットオプション→・セキュリティタブから保護モードを有効にする(Internet Explorerの再起動が必要)にチェックを入れる。

また、追加設定が必要。
https://code.google.com/p/selenium/wiki/InternetExplorerDriver#Required_Configuration
のRequired Configurationを参考に、使用しているversionにあわせて、追加設定を加える。
IE11の場合のみレジストリの追加が必要なので注意。

### chrome
https://sites.google.com/a/chromium.org/chromedriver/downloads
から任意のバージョンで、OSに合わせたChromeDriverをDL、解凍する。

上記3ファイルは使いやすいように任意の場所に設置する。
例えばC:\WebDriverのように。

# selenium IDEで作ったテストケースのエクスポート
作ったテストケースをファイル→テストケースをエクスポート→Java/JUnit4/WebDriverを選択してエクスポートする。
![yahoo.JPG](https://qiita-image-store.s3.amazonaws.com/0/57634/ae58f286-b44a-49c4-9b01-1565583574f9.jpeg)
# テストケース実行
## 初期設定

Eclipseを開いてファイル→新規Javaプロジェクトで任意のプロジェクト名をつけて「次へ」
次のページでライブラリータブを選択し、外部Jarの追加でJava用のWebDriverで解凍したしたディレクトリ配下の者をすべて追加する。
そして、完了を押す。
![yahoo_2_nm.JPG](https://qiita-image-store.s3.amazonaws.com/0/57634/c9072546-d05f-465b-c074-6662cf3c69c5.jpeg)
もし、ここで設定を忘れた場合はパッケージエクスプローラで今回作成したプロジェクトを右クリックして、プロパティー→Javaのビルド・パス
→ライブラリーから同様に外部Jarが追加できる。

## テストファイルの読み込み。
パッケージエクスプローラのsrcに対してエクスポートしたテストケースをドラッグアンドドロップする。
すると、図のように選択肢が現れる。今回はコピーする。
![CP.JPG](https://qiita-image-store.s3.amazonaws.com/0/57634/3b960c1f-5cba-a22c-8c5a-ab3f55f12321.jpeg)
## ファイルを開く
src/(デフォルト・パッケージ)/Test.java
のようにコピー　or リンクが貼られるので、開く。
すると赤下線でエラーがでる。

これは、デフォルトでは、com.example.testsというパッケージ配下に存在している前提でエクスポートされているからである。
そのため、その一行を消去するかパッケージを作成して、その配下に対象ファイルを移動させれば、アラートは消える。

# テスト実行
実行→実行　もしくは Ctrl+F11でテストが実行できる。
うまく設定ができていればFireFoxが立ち上がり自動でテストを行ってくれる。

## chromeの場合

driver = new FirefoxDriver();をコメントアウトして

以下の文を追記する

```java
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("chrome.binary", "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe");
System.setProperty("webdriver.chrome.driver", "C:/Users/Chromedriver.exe");
// chromeDriverのパス
driver = new ChromeDriver(capabilities);
```

chromeのファイルパスやDLして解凍したChromedriverのパスは適宜変更する。

そして、実行するとChromeが立ち上がり自動でテストを行う。

## IEの場合

FireFox/Chromeの記述をコメントアウトして
以下の文を追加する。

``` java
File file = new File("C:/Users/IEDriverServer.exe"); //DLして解凍したIEDriverServerのパス
System.setProperty("webdriver.ie.driver", file.getAbsolutePath());
driver = new InternetExplorerDriver();
```
IEdriverのパスを適宜変更して、実行するとIEが立ち上がり自動でテストを行う。

# まとめ
FireFoxのIDEでテストケースを作ってしまえば、少しの工夫で使いまわせるのでかなり便利にテストが実行可能
PyBrainを用いて強化学習をしてみた

#Pybrainはニューラルネットワークの仕組みが実装されているPythonのライブラリです。

今回はチュートリアルに乗っている強化学習（Reinforcement Learning）をやったので備忘録の意味も込めて記述しておきます。

##強化学習とは試行錯誤を通じて環境に適応する学習制御の枠組です。

![Screen Shot 2015-05-12 at 8.20.22.jpg](https://qiita-image-store.s3.amazonaws.com/0/10496/cb7d449b-0475-8a60-137a-bfcd0598d3d6.jpeg)

例えば

新米セールスマンをエージェントとして、環境をお客さんとします。

その再に新米セールスマンがセールスする行動をアクション
セールスに対するお客様の反応を状態観測
それに対する”お客様の購買意欲が上がったか”を報酬とします。

新米セールスマンはセールスの経験がないので報酬つまり”お客様の購買意欲が上がったか”が正確なものか把握できません。

またセールスに対するお客様の反応も新米セールスマンは正確に把握することはできません。

このような不確実性の高く、教師データもないような状況で使われる強化学習がPOMDPと呼ばれます。

詳しい説明は下記を参照下さい（引用元：NTTコミュニケーション科学基礎研究所　南泰浩）
http://www.lai.kyutech.ac.jp/sig-slud/SLUD63-minami-POMDP-tutorial.pdf

下記のチュートリアルでは、観測された状態が正しいと仮定しているMDPを使用しています。

MDP（マルコフ決定過程）
http://www.orsj.or.jp/~wiki/wiki/index.php/%E3%83%9E%E3%83%AB%E3%82%B3%E3%83%95%E6%B1%BA%E5%AE%9A%E9%81%8E%E7%A8%8B

#今回はこの枠組みを使用して迷路ゲームをクリアするためのチュートリアルをPythonで実践しました。

PyBrainの始め方は下記を参考にして下さい。

https://github.com/pybrain/pybrain/blob/master/docs/documentation.pdf

必要なライブラリをインストールします。

```py
from scipy import *
import sys, time

from pybrain.rl.environments.mazes import Maze, MDPMazeTask
from pybrain.rl.learners.valuebased import ActionValueTable
from pybrain.rl.agents import LearningAgent
from pybrain.rl.learners import Q, SARSA
from pybrain.rl.experiments import Experiment
from pybrain.rl.environments import Task
```
ビジュアル化の準備をします。

```py
import pylab
pylab.gray()
pylab.ion()
```
チュートリアルでは迷路ゲームのクリアを目標とするので下記のような迷路構造を定義します。

```py
structure = array([[1, 1, 1, 1, 1, 1, 1, 1, 1],
                   [1, 0, 0, 1, 0, 0, 0, 0, 1],
                   [1, 0, 0, 1, 0, 0, 1, 0, 1],
                   [1, 0, 0, 1, 0, 0, 1, 0, 1],
                   [1, 0, 0, 1, 0, 1, 1, 0, 1],
                   [1, 0, 0, 0, 0, 0, 1, 0, 1],
                   [1, 1, 1, 1, 1, 1, 1, 0, 1],
                   [1, 0, 0, 0, 0, 0, 0, 0, 1],
                   [1, 1, 1, 1, 1, 1, 1, 1, 1]])
```
迷路構造を環境として定義します。
先ほど定義した迷路構造と最終ゴールを渡しておきます。

```py
environment = Maze(structure, (7, 7))
```
次にエージェントのアクションを定義します。
エージェントのアクションは今回は値のテーブルを持つエージェントとし、81の状態と4つのアクションを持っています。
そしてエージェントの状態を初期化しておきます。

81状態：迷路構造が9×9構造のため
4アクション：上、下、右、下のアクションが可能なため

アクション定義用のインターフェースはActionValueTableとActionValueNetworkがあります。

ActionValueTable：離散的な行動の時に使用
ActionValueNetwork：連続的な行動の時に使用


```
controller = ActionValueTable(81, 4)
controller.initialize(1.)
```

エージェントの学習の仕組みを定義します。
Q学習を用いて、エージェントのアクションが報酬に対して最適化されるように定義しておきます。

```py
learner = Q()
agent = LearningAgent(controller, learner)
```

エージェントと環境をつなげるタスクを定義します。


```py
task = MDPMazeTask(environment)
```
下記のコードで実際に強化学習を100回実践し、実践ごとに再度エージェントの位置をプロットするようにしています。

```py

experiment = Experiment(task, agent)

while True:
    experiment.doInteractions(100)
    agent.learn()
    agent.reset()

    pylab.pcolor(controller.params.reshape(81,4).max(1).reshape(9,9))
    pylab.draw()
    pylab.show() 
```

以上で終わりです。
psコマンド

*個人的な授業のメモです*

##psコマンドとは
####　実行中のプロセスを表示するコマンドである。

　`sidekiq`のgemを使ってるサービスのデプロイをする機会があり、`sidekiq`の再起動をせずにデプロイだけして、ソースコードが反映されないという事態になりました。そこで使ったのが`psコマンド`です！
　
`psコマンド`でsidekiqが動いていることを確認して、プロセスを殺してからsidekiqを起動する必要がありました。

###本番環境で実際に打ったコマンド
```Bash
$ ps aux | grep sidekiq
```
動いてるsidekiqのプロセスを確認。
※grepコマンドはその後の文字列を含むものを表示します

```Bash
$ kill プロセスID
```
`killコマンド`でプロセスIDを指定して、そのプロセスを殺します。

```Bash
$ RAILS_ENV=production bundle exec sidekiq -C config/sidekiq.yml -d
```
再び、sidekiqを起動。


###これで無事本番環境で変更したソースコードが反映されました！
　
####それで、`psコマンド`はどうやって使うの！？
今から、説明します。

##実行方法
```Bash
$ ps
```
これだけでも使えますが、通常`オプション`を付けて実行します。

####オプション
	a : 自分以外のユーザーのプロセスも表示
	u : ユーザー名と開始時刻も表示
	x : 制御端末のないプロセスの情報も表示する
	
####表示される要素の意味
	USER : 所有者のユーザー名
	PID : プロセスID
	%CPU : プロセスのCPU負荷率
	%MEM : プロセスのCPU時間の総計
	VSZ : 仮想メモリサイズ
	RSS : プロセスが使用中の物理メモリ量
	TT : 制御端末の種類および番号
	TIME : プロセスが起動してから利用したCPU時間の総計
	COMMAND : プロセスのコマンド名
	STAT : プロセスの状態
		· S ···スリープ状態
		· T ···停止中またはトレース中
		· D ···割り込み不可能なスリープ状態
		· < ···負のnice値を持つプロセス
		· R ···実行中
		· N ···正のnice値を持つプロセス
		· Z ···ゾンビ
		· W ···スワップアウトされたプロセス
Chatwork で info + title で記事を共有する


ChatworkでWebの記事を共有するときとかに info + title でチャットを飛ばしたりするんだけど、毎回書いていると大変めんどくさい。

[チャットワークAPIドキュメント](http://developer.chatwork.com/ja/messagenotation.html)

そんなわけで最近はChromeの拡張のCreate Linkを使ってる。

[Create Link - Chrome ウェブストア](https://chrome.google.com/webstore/detail/create-link/gcmghdmnkfdbncmnmlkkglmnnhagajbm?hl=ja)

下みたいな設定にしておけば、ページを開いてメニューから選択するだけでChatworkの記法で装飾してクリップボードに保存してくれる。

```
[info][title]%text%[/title]%url%[/info]
```

弊社の場合、他の人も色々やってるんだろうな、きっと。
Rで本を書く📚

## はじめに

[Gitbook](https://www.gitbook.com)というものがある。Gitbookを使えばマークダウン形式で書かれたファイルを本の形式で表示したり電子書籍として公開・配布することができる。使い道はいろいろあると思うのだけど、自分は**RユーザーなのでRのことを書きたい**。その際、図の貼り付けは自動的にできるようにしたいし、出力結果の表示はコピペしたくない。要するに、**`.md`でなくて`.Rmd`で、Rのコードを実行したりしながらあれこれ書きたい**。...そんな願いは[`Rgitbook`](https://github.com/jbryer/Rgitbook)を使えば叶えることができる。

## セットアップ

`Rgitbook`はCRANに登録されていない野良パッケージ。GitHubにリポジトリがあるのでそちらからダウンロードする。

```{r}
library(devtools)
install_github("jbryer/Rgitbook")
library(Rgitbook)
```

```{r}
checkForGitbook()
# Error in checkForGitbook() : 
#   Cannot find node.js. You can install it from http://nodejs.org/download/
```

どうもRgitbookのエラー修正・更新がとまっているみたいで、蓮くんをはじめとした有志が解決案を提案している ref) [https://github.com/jbryer/Rgitbook/issues/23](https://github.com/jbryer/Rgitbook/issues/23)。というわけでそちらのリポジトリから再度ダウンロード。

```{r}
# install_github("renkun-ken/Rgitbook")
install_github("liyi-1989/Rgitbook")
checkForGitbook()
# checking npm
# checking gitbook
# gitbook is installed and available
```

### 新規GitBookの作成

```{r}
newGitbook("~/rpkg_showcase/") # GitBookを作るディレクトリ、フォルダ名を指定する
```

指定したフォルダ内に４つのファイルができた。

```{r}
initGitbook()
```

`initGitbook()`は`SUMMARY.md`に記述されているマークダウンファイルを生成する関数。`SUMMARY.md`に従ってファイルを自動作成してくれるので大変便利だ。その際に作成されるファイルは、[こちら](https://github.com/liyi-1989/Rgitbook/blob/master/R/initGitbook.R#L23)のようになっている。chunkオプションや俺々風な変更を加えたい場合には、フォークしてから該当ファイルを編集し、再度パッケージとしてビルド・インストールすると良い。自分は[次のようにしている](https://github.com/uribo/Rgitbook/blob/master/R/initGitbook.R)。

## ビルド

`buildRmd()`は`.Rmd`ファイルを実行し、`.md`として出力してくれる関数なのでとても重要。ある程度作業を進めたら定期的に`buildRmd()`を実行しよう。

```{r}
buildRmd()
```

この関数を実行すると、`.Rmd`ファイルから同名の`.md`ファイルが作成される。

しかしこれで終わりではない。次に`buildGitbook()`関数でGitbook全体のビルドを行う必要がある。ビルドをすると`_book`というフォルダができあがる。Gitbookの実態は、ここにあるHTMLをもとに表示しているので、この作業が欠かせない。ビルドが成功したらできたものを見てみる。`openGitbook()`でビルドされたgitbookの内容をブラウザで確認することができる。

見た目はこんな感じになる -> http://suryu.me/rpkg_showcase/utility/Rgitbook.html

## GitHubにリポジトリをつくる

ここまできたら、Gitbookの公開先としてGitHubにリポジトリを作成する。`Rgitbook()`には`publishGitbook()`という便利な関数があり、`_book`フォルダのファイルをgh-pagesブランチにプッシュしてくれる。

```{r}
publishGitbook("uribo/rpkg_showcase") # GitHubのユーザー名/対象リポジトリ名
```

## おわりに

一連の作業をまとめると次のような感じ。

1. `checkForGitbook()` # Gitbookがインストールされているかを確認
2. `newGitbook()` # 新規gitbook用のディレクトリを用意
3. `SUMMARY.md`を編集
4. `initGitbook()` # `.Rmd`ファイルを自動生成
5. 各`.Rmd`ファイルを編集
6. `buildRmd()` # `.Rmd` -> `.md`
7. `buildGitbook()`
8. `openGitbook()`
9. `publishGitbook()` # gh-pagesブランチに変更点をプッシュ

というわけで、つまづくところもあったがなんとかして`.Rmd`で本を書く用意ができた。めでたい。**備えよう**。

### 目標達成

そもそもこれで何がしたかったのかというと、パッケージの利用方法について、これまでEvernoteにちまちまメモをとっていたのだけど、Evernote上ではR実行できないし、数が増えてきてつらくなってきた（検索は便利だけど）。

あくまでも個人のメモ段階であるが、Rパッケージの使い方メモと、パッケージ開発のための覚え書きリポジトリを立てた。個人のチラシの裏段階だが、将来誰かのお役に立てれば幸いである。

* [uribo/rpkg_showcase](https://github.com/uribo/rpkg_showcase); [**Gitbook**](https://uribo.github.com/rpkg_showcase)
* [uribo/myr_dev](https://github.com/uribo/myr_dev)
楽天ランキングAPIを叩いて任意のカテゴリーの順位をCSVで保存する

楽天ランキングAPIを叩き、
CSVに順位・商品名・URL・価格を保存するスクリプト。

任意のカテゴリIDを入力することで、
取得したいカテゴリランキングを取得可能です。
何らかの楽天ランキングに基づくデータを取りたいときにも使えるんじゃないかとか。

```python:rakutenrank.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import csv
import sys, codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)

gen_input = input("catID input here: ")

url = "https://app.rakuten.co.jp/services/api/IchibaItem/Ranking/20120927?"

st_load = {
	"genreId": gen_input,
	"applicationId": ******************************,
    }

r = requests.get(url, params=st_load)

res = r.json()

f = open("raku.csv" , "ab")
writer = csv.writer(f)
writer.writerow(["No", "Itemname", "URL", "Price"])

for i in res["Items"]:
	item = i["Item"]
	Rank = item["rank"]
	Name = (item["itemName"].encode("utf-8"))
	Url = item["itemUrl"]
	Price = item["itemPrice"]
	
	writer.writerow([Rank, Name, Url, Price])
	
f.close()
```
iTerm 2 で Cmd+R (⌘R) しても Reset しないようにする

端末とブラウザを行ったり来たりしているときに、うっかり (ブラウザに切り替えたつもりがタイミングが悪く) iTerm の上で Cmd+R を叩いてしまい、Reset が発動した結果 tmux とかにマウスイベントが渡らなくなって困るということが良く起こります。

これをとりあえず無効にするハックを見つけたので共有します。手順としては以下の通りです:

`Preferences... (Cmd+,)` > `Keys` > `Global Shortcut Keys` にて

![scr 2015-05-12 at 07.13.34.png](https://qiita-image-store.s3.amazonaws.com/0/32911/5eb3658f-0312-4df3-28fb-41c5b1c424a9.png)

1. 下にある `+` ボタンをクリック
2. `Keyboard Shortcut:` にフォーカスされている状態で Cmd+R (⌘R) を押下
3. `Action` を `Ignore` にして `OK` をクリック

![scr 2015-05-12 at 07.13.52.png](https://qiita-image-store.s3.amazonaws.com/0/32911/2c94dbfc-6e34-6912-28a6-600d4ef31837.png)

以上です。
c++ > HOWTO: Covariant Return Types in C++ > clone()の例

http://www.lwithers.me.uk/articles/covariant.html
から抜粋

```cpp
    Derived* d = new Derived;
    Base* b = d->clone();
    Derived* d2 = dynamic_cast<Derived*>(b);
    if(!d2) {
        delete b;
        throw SomeCrazyException();
    }
```

> As you can see, this is pretty long-winded given that we _know_ d2 should be a Derived instance.

>If, instead, the clone() method could tell the compiler "actually, I always return a Derived*" (i.e. it became virtual Derived* Derived::clone() we could do away with the upcast and the check, moving all this away from run-time and into compile-time:

```cpp
    Derived* d = new Derived;
    Derived* d2 = d->clone();
```

> This is the ideal solution; there is no run-time cost associated with it, and it's completely safe: the compiler will check all our types for us. If somebody changes Derived::clone() to return a Base*, the compiler will complain; 


続きがある

> Fortunately, a language feature does exist to do this: covariant return types.
Effective C++ > 27項 > dynamic_castが必要になる時の問題を避ける方法

引用: Effective C++ 第3版

> dynamic_castが必要になるのは、派生クラスのオブジェクトを操作するのに、その基底クラスのポインタか参照しか持たないときです。この問題を避けるのには、一般に、２つの方法があります。
...
まず、はじめから「派生クラスのポインタ(...)のみを格納するコンテナ」を用意し、使う方法です。
...
もう一つの方法は、派生クラスで定義するすべての関数を仮想関数として基底クラスに持たせ、その関数を使って派生クラスを操作するというものです。

上記に関係しそうなものとしては
[SO:1](http://stackoverflow.com/questions/9949110/pattern-to-avoid-dynamic-cast)
[SO:2](http://stackoverflow.com/questions/459503/how-can-i-avoid-dynamic-cast-in-my-c-code)

関連キーワード?
- covariant return types @ SO:2
HerokuでDockerでTrusterdを動かすまで 最終回

# 前回

- [HerokuでDockerでTrusterdを動かすまで　準備編その3 - Qiita](http://qiita.com/kjunichi/items/11921600d39c9917bbf8)

# TL;DR

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">週末ぶつくさQiitaに投稿してた結果がこちらになりますｗ HerokuでDockerでTrusterdが動いたぞ!!! / “hello.rb” <a href="http://t.co/STUycaGAIU">http://t.co/STUycaGAIU</a></p>&mdash; kjunichi (@kjunichi) <a href="https://twitter.com/kjunichi/status/597572787377549312">2015, 5月 11</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# Trusterdを動かしたらエラー

```bash
2015-05-10T12:26:42.057210+00:00 app[web.1]: /app/src/trusterd.conf.rb:157: getpwnam failed (RuntimeError)
```

## 解決方法

trusterdの実行ユーザーの指定？をコメントアウトしたら、よきに計らってもらえた。

HerokuのDockerだと、rootで動かせない事からくる制約と思われる。

```rb
# runngin user, start server with root and change to run_user
#:run_user => "app",
```

# 出来ました！

- https://github.com/kjunichi/trusterd-app-on-heroku-using-docker

## 何ができる

動的コンテンツにRubyスクリプトを使える。

htdocs配下に.rbで終わるrubyスクリプトを置き、デプロイすると

http://hoge.herokuapp.com/hoge.rb

とアクセスする事が可能。
Effective C++ > 27項 > dynamic_castは非常に遅くなる

引用: Effective C++ 第3版

> 多くの実装でdynamic_castは非常に遅くなるということを指摘しておきましょう。
...
もし、「4回単一継承を繰り返してできたクラス」のオブジェクトに対してdynamic_castを使えば、クラス名を比較するために最低4回strcmpを呼び出すことになるわけです。
...

<hr>
dynamic_castの遅さについては、以下のリンク先で調査されているようだ。
http://tozicode.com/cgi/weblog/diary.cgi?no=131&continue=on
Dart 正規表現 Engine を作成する (3) FSM(有限オートマトン)で表現

VMの作成(http://qiita.com/kyorohiro/items/cbd2617a979a31efb3ba)
と、Parserの作成(http://qiita.com/kyorohiro/items/eed9617aebdbe450aad3)
でVM型の正規表現エンジンを作成しました。

ついでに、FSM(有限オートマタ)での実現方法も紹介しておきます。

# FSMだと以下のように簡単に描けます。30行もないですね。


```text:dart
bool fsm(String target, int currentStatus, Map<Action, int> table, List<int> goal) {
  if (target.length == 0) {
    return goal.contains(currentStatus);
  } else {
    Action expectAction = new Action(currentStatus, target[0]);
    if (table.keys.contains(expectAction)) {
      return fsm(target.substring(1), table[expectAction], table, goal);
    } else {
      return false;
    }
  }
}

class Action extends Object {
  int status;
  String character;
  Action(int status, String character) {
    this.status = status;
    this.character = character;
  }
  int get hashCode => status << 8 | character.codeUnitAt(0);
  bool operator ==(Action t) => this.hashCode == t.hashCode;
}

```

# いくつか簡単な例を見ていきましょう。

### "a"をFSMで表現

```text:"a"をFSMで図で表現
(1) -a-> (2)
```

```text:"a"をFSMをコードで表現
void main() {
  var table = <Action,int> {
    new Action(1, 'a'): 2,
  };
  var goal = [2];
  print(fsm("a", 1, table, goal));// true
  print(fsm("aa", 1, table, goal));// false
  print(fsm("b", 1, table, goal));// false
}
```

### "a+"をFSMで表現

```text:"a+"をFSMで図で表現
           __a_
          |    |
(1) -a-> (2)<--
```

```text:"a+"をFSMをコードで表現
void main() {
  var table = <Action,int> {
    new Action(1, 'a'): 2,
    new Action(2, 'a'): 2,
  };
  var goal = [2];
  print(fsm("a", 1, table, goal));// true
  print(fsm("aa", 1, table, goal));// true
  print(fsm("b", 1, table, goal));// false
}
```

### "[a-b][c-d]?"をFSMで表現


```text:"[a-b][c-d]?"をFSMをコードで表現
  //
  var table = <Action,int> {
    new Action(1, 'a'): 2,
    new Action(1, 'b'): 2,
    new Action(2, 'c'): 3,
    new Action(2, 'd'): 3
  };
  var goal = [2,3];
  print(fsm("a", 1, table, goal)); //true
  print(fsm("b", 1, table, goal)); //true
  print(fsm("ad", 1, table, goal)); //true
  print(fsm("e", 1, table, goal)); //false
```


# おわり

こんな感じで、オートマトンに直接落としてしまうのもありですね。
ref https://www.udacity.com/course/programming-languages--cs262
FOAM Frameworkのチュートリアルをやる その0


これはFOAM Frameworkについて、公式ページを翻訳しながら学んでいこうという記事です。

前回の記事は[こちら](http://qiita.com/tako-black/items/6e5613867135215a67f2)。

今回からはいよいよチュートリアルを翻訳しながらやっていきたいと思います。
もし何か間違いやおかしい点などありましたら、コメントを頂けると幸いです。 
原文は[github.io](http://foam-framework.github.io/foam/tutorial/0-intro/)で、 
ライセンスは[こちら](https://github.com/foam-framework/foam/blob/master/COPYRIGHT)に準拠します。

以下翻訳

---

チュートリアル パート0 
## はじめに

### 概要 
FOAMはJavaScriptのライブラリです。コンセプトによっていくつかのパートに分かれますが、一般的には相互にインポートしています。 

* 先進的なクラスのシステム。Javaの原理に似ていますが、さらにパワフルです。 
* データソースを抽象化するものやキャッシュのためのヘルパーやログのためのライブラリ 
* ウェブアプリを作成するために使われるビューのライブラリ

FOAMは抽象的な概念や生産性やパフォーマンスの点でハイレベルな働きをします。[Aboutページ](http://foam-framework.github.io/foam/about/)([翻訳したものはこちら](http://qiita.com/tako-black/items/6e5613867135215a67f2))にこの原理について更に記述してあります。または、このチュートリアルに従うことで、すぐに始められます。

このチュートリアルはいくつかのパートに分かれます。 

* はじめに（以下） 
* [中心となる概念](http://foam-framework.github.io/foam/tutorial/1-concepts/) 
* [`電話`モデル](http://foam-framework.github.io/foam/tutorial/2-model/) 
* [コントローラー](http://foam-framework.github.io/foam/tutorial/3-dao/) 
* [カスタムテンプレート](http://foam-framework.github.io/foam/tutorial/4-templates) 
* [ナビゲーション](http://foam-framework.github.io/foam/tutorial/5-navigation) 
* [`詳細なビュー`や他のテンプレート](http://foam-framework.github.io/foam/tutorial/6-detailview)

### 対象者 
このチュートリアルの対象者はJavaScriptやウェブアプリには詳しいけれども、FOAMの概念や使い方を知らない人々です。 
このチュートリアルは手短な概念の説明と、電話のカタログを表示するアプリをFOAMでコードを書いて作成する詳細なチュートリアルを織り交ぜて提供します。

### 必要なツール 
このチュートリアルには2つだけ、必要なツールがあります。
 
* `git`
* ローカルウェブサーバー。Pythonの組み込みのサーバーモジュールをお勧めします。

### はじめに 
では始めましょう。プロジェクトの新しいディレクトリを作成して、そこに移動して、FOAMをダウンロードしてください。

```
mkdir $PROJECT 
cd $PROJECT 
git clone https://github.com/foam-framework/foam.git
```

いま、 `foam/` というサブディレクトリができました。それは、FOAMのすべてのコードと、たくさんのデモとテストページを持っています。 
このライブラリはたくさんのファイルに分割されていますが、HTMLドキュメントにインクルードする必要があるのは `core/bootFOAM.js` 1つだけです。 
`core/foam.css` も同様に正しくビューが表示されるためにはインクルードしておくべきです。

以下の内容で `$PROJECT/index.html` を作成してください。 

```
<html>
  <head>
    <script src="foam/core/bootFOAM.js"></script>
    <link rel="stylesheet" href="foam/core/foam.css" />
  </head>
  <body>
    <script>
      document.write(FOAM_POWERED);
    </script>
  </body>
</html>
```

ウェブサーバーを立ち上げて、このファイルに直でアクセスしてください。Pythonを使う場合、以下のようになります。 

```
python -m SimpleHTTPServer    # Python 2
python -m http.server         # Python 3
```

上記は、8000番ポートでカレントディレクトリのファイルを表示します:[http://localhost:8000/](http://localhost:8000/).

ページがローディングされると「FOAM Powered」のロゴが表示され、JSコンソールにはエラーは表示されません。

もし上記のように表示されたなら、おめでとうございます！FOAMが動き、次のチュートリアルである[パート1:中心となる概念](http://foam-framework.github.io/foam/tutorial/1-concepts/)を正しく行う準備が出来ました。

---

以上翻訳

上記の通りやってみると、確かにロゴが表示され、コンソールにエラーは見られませんでした。
Hello World的な扱いでしょうか。
次回はパート1をやってみたいと思います。
Reshaperで"Cannot resolve symbol"と怒られるがビルドできる問題

たまによくあるこの問題。個人的にはクラスのメンバ変数に多い気がします。

メンバ変数にアクセスしようとしてもReShaperさんのインテリセンスにはサジェストされない。だけど確かに変数は存在するし無視してもビルドできる。だけども"Cannot resolve symbol"と怒られる。

#解決方法

Visual Studioから ```ツール > オプション > Reshaper > Options``` でオプション画面を開き
```Environment > General``` からClear Chachesボタンを押し、VSを再起動すると解決します。
sudoersのお勉強

sudoersの`【ユーザー名】 ALL = (ALL:ALL) ALL`とは一体何表してんのかってことで`man sudoers`を読んでみた。
（全文読むのは結構時間がかかる上に、知識がないと上の方は恐らく読むことすらできない。わからないけど読みたい方は【Runas_Spec (どのユーザやグループに変身できるか)】あたりから読み始めることをお薦めする。）

##【ユーザー名】
ここはユーザー名を指定。
%付きにするとグループ名

##最初のALL
ホストに対する許可。
ホストに対するエイリアスを書かない限りALL指定で問題ない。
ホスト指定を書かなくてはならないような人は間違いなく趣味人ではなくプロのネットワーク管理者だと思われ・・・

##()内の左のALL
どのユーザーになれるか。
当たり前だがALLだと誰にでもなれる。
ここに個々人のユーザー名を書くとその人と同じ権限を得られる。
（つまるところサブの管理人になりたければ羅列して書いたらいいんじゃないかな。10人をまとめるグループリーダーとしてその誰しもの権限はあげるけど、管理者の権限までは持てない的なユーザー。）

##()内の右のALL
上記のグループ版。
（この：（コロン）以降書かなかった場合はグループ権限は自由に変えることはできない。それが`ALL = (ALL) ALL`。グループのみを変更したい場合は`ALL = (:ALL) ALL`ってな感じでコロン付きで書く。）

##()外のALL
実行できるコマンド。
ちまちまとコマンドを羅列して実行できるコマンドを指定するか、本文には書けないが正規表現っぽい（sudoers内のみで定義されてる）ものを使って指定する。
ALLは当然どんなソフト・スクリプトも実行可能。

因みに全てに言えることだが複数指定したければ「`,`」で区切る。

##例
こんな人たちが使ってるコンピュータがあったとして・・・

|name    |group                    |
|:-------|:------------------------|
|admin   |sudo, Admin, TeamA, TeamK|
|subadmin|TeamA, TeamK             |
|hoge    |TeamA                    |
|fuga    |TeamA                    |
|foo     |TeamK                    |
|bar     |TeamK                    |

1. `%sudo ALL = (ALL:ALL) ALL` ← sudoersに初めから書いてあることは当然といえば当然
2. `subadmin ALL = (hoge, fuga, foo, bar : Admin) ALL` ← 実行する際は`sudo -u` でユーザーを指定
3. `hoge ALL = (:TeamK) ALL` ← TeamKのスペースも何やらできる

##最後に
てな感じです。
例はいろいろ考えたけど、趣味でサーバーいじってる程度だから正直わかりません。

後は注意事項として、sudoersファイルを編集する際はどんなにトチ狂っても`/etc/sudoers`を直接編集しないこと！！
`chmod +w`とか最悪。
変更後`rm -rf /`を実行するんだったらしてもいいかもしれないけど、必ず`visudo`を使って編集すること。


##まとめ

who　　where　　　=　　(as_whom)　　　what

[誰が　どのホストで　=　(誰に変身して)　何をするか]


だそうです。
上記はmanからの引用。

##追記（2015/05/13）
具体例がなかったので追記
球座標の計算

Three.jsで重宝しそうな球座標の計算式は以下。

```
x = Math.cos(rad) * Math.cos(rad2) * r;
y = Math.cos(rad) * Math.sin(rad2) * r;
z = Math.sin(rad) * r;
```

以下デモ。
http://codepen.io/ykob/details/bdEQdv/

以下のページを参考にしました。
http://fnorio.com/0098spherical_trigonometry1/spherical_trigonometry1.html
【データサイエンス基礎】APIからデータ取得

データサイエンスにおいて情報取得技術は基礎ということで。そのお勉強。

# pythonでAPIからデータ取得して表示するところまで

まずはサイエンスするためのデータを持ってくる手法を学ぼうということで、APIからデータを持ってきてみるとする。

## まず、APIって
### [APIとは](http://e-words.jp/w/API.html)
>あるコンピュータプログラム(ソフトウェア)の機能や管理するデータなどを、外部の他のプログラムから呼び出して利用するための手順やデータ形式などを定めた規約のこと。

データ持ってるやつ(ツイッターとか)に外部からデータください(pythonに関するツイートくださいとか)って言ったら、データ返してくれるんだけど、そのための決まりごとみたいな感じだ。

APIなんでもいいから使ってみようということなので、どっからなんのデータを取ってこよう。腹が減ってるので飯系がいい→飯系のwebサービス...→yelpに決定。

### Yelp APIの使い方

ドキュメントは[こちら](https://www.yelp.com.au/developers/documentation)。

Yelpの[API Console](https://www.yelp.com.au/developers/api_console)ってのが便利で、あんまりドキュメンテーション見なくても動きがわかる。とりあえず、場所とキーワードでレストラン10件ひっかけてプリントしてくれるプログラムを書くとしてみむ。パラメータ```term```と```location```がそれぞれに対応しているみたい。(ドキュメントみながら)

~~説明しながら進むのがめんどくさくなってきたので先に見せると~~、できたコードは以下。

OAuthリクエスト扱うのに便利っぽかったのが[rauth](https://github.com/litl/rauth)だったので、それ使いました。

```find_restaurant.py
import urllib2, sys
import rauth
import ConfigParser

inifile = ConfigParser.ConfigParser()
inifile.read("config/secrets.ini")

def search_params(term, location):
  params = {}
  params["term"] = term
  params["location"] = location
  params["limit"] = "10"
  return params

def get_restaurants(params):
  consumer_key = inifile.get("yelp", "consumer_key")
  consumer_secret = inifile.get("yelp", "consumer_secret")
  access_token = inifile.get("yelp", "access_token")
  access_token_secret = inifile.get("yelp", "access_token_secret")

  session = rauth.OAuth1Session(
      consumer_key = consumer_key,
      consumer_secret = consumer_secret,
      access_token = access_token,
      access_token_secret = access_token_secret)

  request = session.get("http://api.yelp.com/v2/search", params=params)

  data = request.json()
  session.close()

  return data

def main():
  term = sys.argv[1]
  location = sys.argv[2]
  params = search_params(term, location)
  response = get_restaurants(params)
  restaurants_info = response["businesses"]
  restaurant_names = []
  for restaurant_info in restaurants_info:
    restaurant_name = restaurant_info["name"]
    print restaurant_name

if __name__ == "__main__":
  main()
```
うぇい、非常にシンプル。(python文法全く知らなかったので当初```:```とか忘れまくりましたが。)
パラメータつくるメソッドと、API叩いてdataもらってくるメソッド作って、そいつら使っただけですな。```"business"```とか```name```はそれぞれレスポンスのjsonのkey名です。

とくにpython初心者の僕にとって、最後の二行、

```
if __name__ == "__main__":
  main()
```

これ調べたり。([なぜ__name__ == "__main__"をするか](http://qiita.com/shunsuke227ono/items/a043bfa9998e7033de3a))あとはconfigparserもね、調べた。([これとか](getbootstrap.com))


とまぁ話がそれたけど、本題にもどり、コード出来上がったので、コンソールで、

```
python find_restaurant.py food tokyo
```
で

```
大和寿司
沼津港 新宿西口店
とんき
Full Monty
丸山珈琲 西麻布店
AW Elements 六本木ヒルズ店
原宿餃子楼
The chef's table
一蘭
```

と出てきた。うむ。APIから情報取得完了!いえい。([gitはこちら](https://github.com/shunsuke227ono/gci))

まぁこれだけじゃなんというか普通だし、簡単すぎるよね。
結果みても、「あ、一蘭しってるぞ！」くらいにしかならないね。。
なので、もう少しひねってみることにことする。
→次回以降に続く.更新時にリンク貼ります.

****
※お願い: パイソニスタな方は、ぜひコードに不自然なところ等あれば突っ込みをいれてください。
【pythonの基礎の基礎の基礎】なぜ__name__ == "__main__"をするか


```sample.py
import ~~
def hoge
	#~~
if __name__ = "__main__": 
	#~~

```
こういうコードをみるけど、```__name__```ってなんなのっていう話。

pythonインタープリターがコードを実行する前に定義する特別な変数がいくつかあり、そのうちの一つが```__name__```変数である。そして、読んでいるモジュールすなわちソースコードがメインプログラムだった場合、pythonは```__name__```変数に値```"__main__"```をセットする。もし、ファイルが他のモジュールからインポートされている場合は、```__name__```には、そのモジュール名が入る。

つまり、コンソールで、

```
python sample.py
```
とかしてるときは、メインプログラムとして走らせてるsample.py内では```__name__```変数に```__main__```がセットされているということ。

上のsample.pyでいうと、こういう特殊な最初に定義される変数をセットしてから、次に```import```宣言たちを実行して、その次に```def```ブロックを評価して```hogehoe```っていうfunction objectを参照する変数をつくる。それから```if```文を見に行き、その中の処理を実行する。
この手順によって、定義した関数とかインポートしたモジュールをもってしてif内の処理を実行できる。

これを持つ意味は、他のモジュールからインポートされた際には実行されたくないけど、メインプログラムとして走らせたときには行い処理をかけるね。C++とかjavaのmain関数の考えかたと一緒ってことかな。

なるほど。
YahooショッピングAPIでPOSTしたときのエラー：12019 Unknownの原因

Excel VBAで商品情報を更新するアプリを組んでおります。
商品コードと価格から商品一括更新APIで情報を更新しようとしています。

すこし前まではstatusTextがOKで返ってきていたのですが、
12019、Unknownというエラーが返ってくるようになってしまい、原因がわかりません。

原因がお分かりになるようでしたらご教示いただけないでしょうか？
どうぞよろしくお願いいたします。


リクエストをブラウザに打ち込むと下記のようなレスポンスが来ますが、
リクエストには商品コードを入れてあります。

	<Error>
	<Message>
	<![CDATA[ 商品が指定されていません。 ]]>
	</Message>
	<Detail/>
	<Code>it-02001</Code>
	</Error>

コードは下記のようにしています。
※アクセストークンをHTTPヘッダーに含めて認証するのがうまくできなかったため、
リクエストボディに含めて認証しています

        url = "https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/updateItems"
        
        postParam = "seller_id=storeid&item1=item_code%3D" & "XXXXXXXX" & "%26sale_price%3D%26price%3D" & "15000" & "&access_token=" & acsToken
        
        Set objXML = New MSXML2.XMLHTTP
        
        With objXML
            .Open "POST", url, False
            .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
            .send (postParam)
        End With
        
        ActiveSheet.Cells(i, eCol) = objXML.statusText
PSM:データ保存、読込


※個人で管理しているHPに引っ越ししました。
リンク切れ等考慮して本ページは残しておきますが、今後は[HP](https://kittenkitten.net/2015/05/12/psm_save_load/)のほうで更新します。

PlayStation(R)Mobile SDK
略してPSM SDKと呼ばれています。

要するに、PS VitaやSonyの認めた端末上で動かせるアプリケーションを作るものです。


早速本題に入ります。

PSMでデータを扱う方法は下記の2つがあります。
・ファイル保存
・永続的なメモリ領域保存

ユーザ任意に編集しても問題無いものに関しては、ファイル保存。
そうではなく、チート対策とかしたいものに関しては、永続的なメモリ領域保存。

と言う感じでしょうか。(ぱっと見た感じではありますが)

永続的なメモリ領域保存では、PersistentMemoryを使用します。
この際注意しないといけないのは、PC上で動作確認する場合にアプリケーションを終了する方法です。
Shift+F5か実行->停止にて終了させると、次回起動時にデータが保存されていません。
実行時に別ウィンドウが開かれると思うので、そちらの閉じるボタン押下からの終了を行えば、次回起動時に正常に読み込みが行われます。

具体的な処理等に関しては、追々追記していきます。
Imagineで簡単に画像操作する


WEBアプリケーションを開発してるとアップロード画像のリサイズやトリミングなどすることが割と多いですよね。
そこでPHPで簡単に画像操作できそうなライブラリを試してみました。

公式サイト [Imagine](http://imagine.readthedocs.org/en/latest/index.html)
Github https://github.com/avalanche123/Imagine

## インストール

### imagineのインストール

composer.jsonに以下のように記述する。

```composer.json
{
    "require": {
        "imagine/imagine": "~0.6.0"
    }
}
```

そんで、imagineをインストール。

```sh
$ composer install
```

### 依存モジュールの確認

imagineの動作には下記いずれかPHP拡張モジュールが必要らしい。

* GD2
* Imagick
* Gmagick

なので調べてみる。ぼくの場合はこんな感じだった。

```sh
$ php -i | grep -Ei '^(gd|imagic|gmagic)' | grep enabled
GD Support => enabled
imagick module => enabled
```

## 試してみる

### 元画像

![sample_320_240.png](https://qiita-image-store.s3.amazonaws.com/0/18682/b3e4edaf-68cf-bff5-faac-b0c59576968d.png)
sample_320_240.png

* w320 x h240

### スクリプトを書く

公式ドキュメントを見ながら簡単なスクリプトを書いてみる。

```php:hoge.php
<?php
require 'vendor/autoload.php';

class MyImagine {
	public static function factory() {
		if (class_exists('Imagick')) {
			return new Imagine\Imagick\Imagine();
		}
		if (class_exists('Gmagick')) {
			return new Imagine\Gmagick\Imagine();
		}
		if (function_exists('gd_info')) {
			return new Imagine\Gd\Imagine();
		}
		throw new Exception('Not found dependency modules');
	}
}

$path = '/path/to/sample_320_240.png';

$imagine = MyImagine::factory();
$size = new Imagine\Image\Box(200, 200);

$imagine->open($path)
	->resize($size)
	->save('/path/to/sample_resize_200_200.jpg');

$imagine->open($path)
	->thumbnail($size)
	->save('/path/to/sample_thumbnail_200_200.jpg');

```

### 実行結果

```sh
$ php hoge.php
```

#### **resize()で出力された画像。**

![sample_resize_200_200.jpg](https://qiita-image-store.s3.amazonaws.com/0/18682/69b5a9b3-b409-8ec4-d7db-1e4c8ade9c15.jpeg)
sample_resize_200_200.jpg

* w200 x h200 に縮小された。
* new Imagine\Image\Box()で指定したサイズにリサイズされるっぽい。
※ 縦横比は維持されない。

#### **thumbnail()で出力された画像。**

![sample_thumbnail_200_200.jpg](https://qiita-image-store.s3.amazonaws.com/0/18682/c70674cd-0fe2-3889-d9fa-7fd12e00f162.jpeg)
sample_thumbnail_200_200.jpg

* w200 x h150 に縮小された。
* new Imagine\Image\Box()で指定したサイズに収まるように縦横比を維持したままリサイズされるっぽい。
* thumbnail()メソッドはよく使いそうな感じ。

## そのた

ドキュメント読んでるとすごく色んな操作ができるっぽい。

画像にwatermark（著作権表示）つけたり
http://imagine.readthedocs.org/en/latest/usage/introduction.html#image-watermarking

アニメGIF作ったり
http://imagine.readthedocs.org/en/latest/usage/layers.html#generate-animated-gif
Rails アプリケーションに Bugsnag を導入したら開発環境以外では動かなかったけどちゃんとかんがえたら原因がわかってすぐに解決できたというお話

こんにちは! みなさん! 今日も元気に Rails を使ったウェブアプリケーションの開発を行っていますか? わたしは元気ではありませんが、がんばってコードを書き続けています。

さて、ウェブアプリケーションに限った話ではありませんが、アプリケーションの開発にあたって大切なのはエラーを正しく確認してそこを修正していくというものがあります。エラーが発生しないアプリケーションを開発するというのが大前提ではあるのですが、開発するのが人間である以上どうしてもミスが起こります。

というわけでエラーが発生したらそれを開発者側に伝えられる良いのですが、発生したエラーを全て通知するということをしていると同じような内容のエラーが発生している場合には、それを切り分けるという手間が発生します。これは明確に無駄な工数となってしまい、また見落としを発生させてしまいがちです。なので、適切にエラー情報をまとめて、それを選り分ける仕組みづくりが大切です。

そこで便利に使えるウェブサービスが [Bugsnag](https://bugsnag.com/) です。

Bugsnag は前述したアプリケーションで発生したエラーを送信すると、それを適切にまとめて整理した上で開発者に通知してくれるウェブサービスです。使いかたも単純で Bugsnag のアカウントを作り API Key を手に入れたあとは [Bugsnag 側が提供している Ruby ライブラリーの README](https://github.com/bugsnag/bugsnag-ruby/blob/v2.8.6/README.md) の手順に従えば通常の Rails を使ったウェブアプリケーションであればそれだけで Bugsnag の導入は完了です。

非常にお手軽です。

……で済めば良かったのですが、自身の手元の開発環境では発生したエラーの確認がきちんとできるのですが、ステージング環境やプロダクション環境では確認ができませんでした。

ステージング環境とプロダクション環境で確認できなければ意味がないので、どうしたものかと思っていましたが、少しかんがえたら原因は単純なものでした。アプリケーション側で `rescue_from` を用いて例外を握り潰し独自のテンプレートを表示させていたためでした。

単純な原因によって発生している問題なので、解決方法も単純で、

```rb
class ApplicationController < ActionController::Base

  # ...

  unless Rails.env.development?
    rescue_from Exception, with: :handle_500
  end

  # ...

  def handle_500(exception = nil)
    # 明示的に Bugsnag へ例外を通知する
    if exception.is_a? Exception
      Bugsnag.auto_notify(exception)
    end
    render template: "errors/500"
  end
end
```

のように `Bugsnag.auto_notify` を使い、例外を明示的に Bugsnag 側に通知するだけで解決です。便利ですね。

エラーを確認しながら、一つづつ潰して、元気に元気にがんばって開発を進めましょう。

元気!
quick-highlight つくった

[quick-highlight](https://atom.io/packages/quick-highlight)

Vim を使っていた頃(まだ平行して使ってますが) [vim-quickhl](https://github.com/t9md/vim-quickhl) を作って、使っていた。
使用頻度は割と高く、コードリーディングや、ライティング時に重宝していた。

Atom を使い始めて、似たようなのがなく、作った。

![gif](https://raw.githubusercontent.com/t9md/t9md/3b13d5fb6134b0b393e0a18b27bdd9c7b4350ace/img/atom-quick-highlight.gif)

# 使い方

コマンドパレットから、

* `quick-highlight:toggle` でハイライトを toggle.
* `quick-highlight:clear` で全ハイライトをクリア

# 機能

* 見えている Pane(のTextEditor)全部が対象
* バッファのテキストを更新すると `TextEditor::onDidStopChanging` イベントで更新(*1)

*1 シンタックスハイライトで自動で更新している訳ではないので、手動で更新する都合上、こういう実装になる。Vim の `matchadd()` みたいに新規に追加した text を自動で色付けはしてくれないので。

# キーマップ

デフォルトキーマップは無し。

例)

* general

```coffeescript
'atom-workspace atom-text-editor:not([mini])':
  'cmd-k m': 'quick-highlight:toggle'
  'cmd-k M': 'quick-highlight:clear'
```

* vim-mode user

```coffeescript
'atom-text-editor.vim-mode.command-mode, atom-text-editor.vim-mode.visual-mode':
  'space m': 'quick-highlight:toggle'
  'space M': 'quick-highlight:clear'
```

これまで 5つのプラグインを作ったが、全部プラグイン側ではデフォルトのキーマップ設定していない。
私は、大量のキーマップ設定されてるとそのプラグインが嫌いになってしまう。
私はこんな事で他人に嫌われたくないので設定しません。
※ 本当は Atom 側が何らかの解を用意しないと行けないと思う。
※ 各プラグインが「このキーマップは、俺のプラグイン用のものだ」と主張しているようで、醜い取り合いをしているようで悲しい。

こういうディスカッションもある
[Key-binding hell](https://discuss.atom.io/t/key-binding-hell/12075)

Atom のEmmet Package は素のAtom のデフォルト keymap を奪うので、こんな文句も出ている
[Key binding Conflicts #161](https://github.com/emmetio/emmet-atom/issues/161)

うーんよくない。。

# TODO

* [x] Refresh only added/deleted decoration for performance.
* [ ] Make color configurable.
* [ ] Serialize, deserialize
* [ ] Highlight with RegExp.
* [ ] Show matched count on statusbar?
* [ ] Wrap highlight with HTMLElement, to be able to use full color.
* [x] auto highlight for newly added texts while editiong.
* [x] highlight across visible buffer.
* [x] Or some configurable decoration style like outline, underline.

# Decoration の色付けについての制限事項(覚え書き):
Atom の [Decoration](https://atom.io/docs/api/v0.198.0/Decoration) は View エンティティではなく、直接的に Text と色を指定できない。
指定できるのはバックグラウンドの色のみなので、透過させるか、box 形式で囲むかにしないとだめ。透過色にしないと Text の色が指定した background-color とかぶった時に、文字が背景に同化して見えなくなってしまう。

対策をざっと調べてみたのでメモを残しておく。
ちなみにどちらの対策も大変そうなのと、処理が重くなりそうなので、ひとまず見送り。

### 対策1: HTMLElement で Wrap する
[pigments](https://atom.io/packages/pigments) では、HTMLElement で wrap して、text を `div`で囲い、更にテキストを色付けしている Syntax Grammar の style に負けないように、`z-index` を駆使してテキストの色を指定している。
重たそうなので、とりあえず見送り。
参考: [Editor marker CSS](https://discuss.atom.io/t/editor-marker-css/8616)

### 対策2: Grammar を動的に生成してシンタックスハイライトに任せる
もう一つの対策としては、一時キーワードを Grammar にしてしまって、Syntax ハイライトとして色がつくようにすれば、Marker で目印を付けて色付けしたり、消したり、リフレッシュしたり、といった Marker 管理をしなくて良くなる。(Vim では `:syntax` や `matchadd()` でこれをやれた。)
これはコードから動的に Grammar を生成して、ロードすれば良い。
ただ難度も高そうだし、頻繁に更新する quick-highlight のようなプラグインには不向きなので、不採用。
参考: [Automatically Update to Dynamic Grammar](https://discuss.atom.io/t/automatically-update-to-dynamic-grammar/10181)
niconico (Rubygems) でランキング情報を持ってくる

ハッシュの使い方が分からなかったのでメモ

---

```rb
ranking = niconico.ranking("all", { span: "daily", method: "all" } )
```

`"all"` : カテゴリ (例: VOCALOID `vocaloid`, 歌ってみた`sing` 等)

`span` : 期間 (毎時`hourly`, 24時間`daily`, 週間`weekly`, 月間`monthly`, 合計`total`)

`method` : 種類 (合計`all`, 再生`view`, コメ`comment`, マイリス`mylist`)

## 例

```
$ irb
irb(main):001:0> require "niconico"
=> true
irb(main):002:0> niconico = Niconico.new("user@example.com", "********")
=> #<Niconico: user@example.com, not logged in>
irb(main):003:0> niconico.login
=> true
irb(main):004:0> ranking = niconico.ranking("all", { span: "daily", method: "all" } )
=> [#<Niconico::Video: sm26206801. "友人の卒業作品が予想外すぎる件について" (defered)>, #<Niconico::Video: sm26228122. "【実況】 いまだかつてないほど初見すぎるMinecraft Part48" (defered)>, #<Niconico::Video: sm26146712. "【手描きアニメ】海外のオタクが1年間アニメ作った結果【オールスター】" (defered)>, ......
```
SonarQubeでプログラムの品質管理をはじめる（概要）

# はじめに
SonarQubeは日本語のドキュメントが少なく導入に苦労したので、同じように導入を試みようとする方の手助けになればと思い、使い方などまとめておこうと思います。
（２週に１度程度の頻度です）

## 記載する予定のもの
* 概要（今回）
* [インストール方法(CentOS 7にSonarQubeを立ち上げる)](http://qiita.com/sh-ogawa/items/4966afaaed72b444ab80)
* [Maven、Jenkinsを使用してCIに組み込む](http://qiita.com/sh-ogawa/items/120b3c0eef93e48a862a)
* SonarQubeで行った品質レポートの見方
* SonarQubeのバージョンアップ方法

# SonarQubeとは
スイスのSonarSource社が主に開発を行っている統合的なプログラム品質管理を行える統合品質管理ツールです。

[SonarQubeのHP](http://www.sonarqube.org/)

## 何ができるのか
* 様々な言語で書かれたソースコードに対して、静的解析チェックを実行して、その結果をWebで閲覧できる。
* JUnitなどでユニットテストを実行して、テスト成功数、失敗数、カバレッジなどを採ることができ、Webで閲覧できる。
* プログラムが循環参照している箇所をWebで閲覧できる。（現在Javaのみ）
* プログラムの複雑度を測り、Webで閲覧できる。
* プログラムの重複している箇所を洗い出して、その箇所をWebで閲覧できる。
* プログラムのチェック方法はプラグインとして自分自身で拡張が可能。
* 技術的負債を可視化してくれる。
* チェック方法やチェック結果はWeb APIを使用することで外部にExport可能。
<br>※Export機能はありますが現在非推奨となっています。
* CI環境に組み込み、継続的な品質チェックを行える。

## 対応言語
現在（SonarQube 5.1）では主に以下の言語を対象としています。
※対応言語が多いため一部抜粋です。
その他の言語については公式を参照してください。
[公式はこちら](http://docs.sonarqube.org/display/SONAR/Plugin+Library)
* Java
* Android
* C/C++
* C#
* Objective-C
* PL/SQL
* HTML/JavaScript/CSS
* PHP

## ライセンス
LGPLで公開されており、無料で使え、拡張も行えます。
また、SonarSource社のサポートを受けられるEnterprise Editionもあります。

## SonarQubeのリポジトリ
https://github.com/SonarSource

## SonarQube導入のメリット
* 品質を見える化して公開することにより、成果物がどんな状態かをチーム皆で共有できる。または役職者にいつでも見せることができる。
* コード遵守率などが上がるとグラフィックが変化するため、ちょっとしたゲーム感覚で開発者のモチベーションが上がる（かも）
* CIの中の１ジョブとして実行できるため、クライアントのリソースを喰わなくて済む。
* 品質集計をSonarQubeに任せることで、PMOの仕事が減る。

## SonarQube導入のデメリット
* 日本語の情報が不足
* 新しすぎるバージョンを入れると、Javaの古いバージョンを切り捨てないといけないということがあるため、使用しているプログラム言語のバージョンによっては既知のバグ込みバージョンのSonarQubeを使用しないといけない。

次回はインストール方法についてまとめます。
通知のロックスクリーン上の表示マトリクス


Android 5系ではロックスクリーン上に通知を表示できる。
その表示の仕方は、本体の通知設定とアプリ側で通知に設定した[visibility](https://developer.android.com/reference/android/app/Notification.Builder.html#setVisibility(int))によって変わるので、そのまとめ。

|&nbsp;                              |[public](https://developer.android.com/reference/android/app/Notification.html#VISIBILITY_PUBLIC)|[private](https://developer.android.com/reference/android/app/Notification.html#VISIBILITY_PRIVATE)     |private<br>(publicVer付)|[secret](https://developer.android.com/reference/android/app/Notification.html#VISIBILITY_SECRET)|
|:-----------------------------------|:----:|:----------:|:----------------------:|:----:|
|すべての通知内容を表示する          |表示  |表示        |表示                    |表示  |
|プライベートな通知内容を非表示にする|表示  |内容が非表示|publicVerが表示         |非表示|
|すべての通知を表示しない            |非表示|非表示      |非表示                  |非表示|

- **内容が非表示**  
通知自体は表示されるが、アプリ名のみ表示され内容はわからない。
- **publicVerが表示**  
[setPublicVersion()](https://developer.android.com/reference/android/app/Notification.Builder.html#setPublicVersion(android.app.Notification))で設定した代替の通知が表示される。

### 備考

- ロックをかけない設定の時は、「プライベートな通知内容を非表示にする」は選択できない。
- [priority](https://developer.android.com/reference/android/app/Notification.Builder.html#setPriority(int))が[MIN](https://developer.android.com/reference/android/app/Notification.html#PRIORITY_MIN)の場合は、どの本体設定・visibilityでも常にロックスクリーンには表示されない。
Hacking Secret Ciphers with Python

"Hacking Secret Ciphers with Python", Al Sweigart, 2013
http://inventwithpython.com/hacking/
CC BY-NC-SA 3.0 US

> **ABOUT THIS BOOK**
> There are many books that teach beginners how to write secret messages using ciphers. There are a couple books that teach beginners how to hack ciphers. As far as I can tell, there are no books to teach beginners how to write programs to hack ciphers. This book fills that gap.
>
> This book is for complete beginners who do not know anything about encryption, hacking, or cryptography. The ciphers in this book (except for the RSA cipher in the last chapter) are all  centuries old, and modern computers now have the computational power to hack their encrypted messages. No modern organization or individuals use these ciphers anymore. As such, there’s no reasonable context in which you could get into legal trouble for the information in this book.
>
> This book is for complete beginners who have never programmed before. This book teaches basic programming concepts with the Python programming language. Python is the best language for beginners to learn programming: it is simple and readable yet also a powerful programming language used by professional software developers. The Python software can be downloaded for free from http://python.org and runs on Linux, Windows, OS X, and the Raspberry Pi.
> （後略）

（参考訳）
> **本書について**
> 暗号を使って秘密のメッセージを作る方法を初学者に教える本はたくさんあります。また暗号解読の方法を教える本もいくつかあります。しかし私が知る限りは、暗号解読プログラムの書き方を教える本というものは存在しません。本書はこのギャッップを埋めるものです。
>
> この本は暗号化処理や暗号解読、暗号技術について全く知識を持たない初学者向けに書かれています。本書で触れる暗号は（最終章のRSA暗号を除いて）全て100年以上前のものであり、最新のコンピュータはこれら暗号文の解読に必要な計算パワーを十分に有しています。現代の組織や個人では、もはやこれらの暗号を利用しません。そのため、本書の情報によって法的トラブルに巻き込まれることはありえません。
>
> またこの本はプログラム未経験の初学者向けに書かれています。本書ではプログラミング言語Pythonを用いてプログラミングの基本概念を教えます。Pythonはプログラミング初学者向けに最適な言語です：シンプルで読みやすく、プロ用途のソフト開発にも利用される強力なプログラミング言語です。Pythonソフトウェアは http://python.org より無償でダウンロードでき、Linux, Windows, OS X, Raspberry Piの環境上で動作します。
> （後略）