OmniAICreator/Qiita-1.07M huggingface dataset:
Node.js 4 で Gulp のエラー

##Node v4でハマッたエラー

```Error: `libsass` bindings not found. Try reinstalling `node-sass`?```

node-sass に関するエラー


##参考のサイト
[Node.js 4.0.0 and Gulp first aid](http://fettblog.eu/gulp-and-node4-first-aid/)

```
$ npm uninstall gulp-sass node-sass
$ npm install node-sass@1.0.3
$ npm install gulp-sass
```

```npm install node-sass@1.0.3
```
はエラーになったけど、とりあえず動きました。
よかった。
最小限のCommon Lisp環境(Emacs+SLIME)の作成

Linuxでの操作を想定していますが、流れはWindows等でも変わらないと思います。
自分用メモなので読みにくいかも、です。

# ソフトのインストール
## Emacsのインストール
http://gnu.org/s/emacs から自分の環境に合ったものをダウンロードするか、aptやyumなどで入手する。
Emacs24を想定。
(追記 2016/09/27: Emacs25でも変わらないと思います)

## Common Lispのインストール

aptやyumなどでインストールするか、インストーラを使う。パスの通ったフォルダに展開してもよい。
SBCL(http://sbcl.org) がオススメ。
Clozure CL(http://ccl.clozure.com)
CLISP(http://clisp.org)
CMUCL(http://www.cons.org/cmucl)
でもよい。

## .emacs.dの作成

ここで一度Emacsを起動しておく

```sh
$ emacs
```

特に今はファイルを編集しないので、終了させる。
終了するには、

```el
C-x C-c
```

とすれば終了する。(C-xはCtrlキーを押しながらx、の意、C-cも同様)。
これで、ホームディレクトリの下に.emacs.dディレクトリが作成された。

## SLIMEのインストール

SLIMEのページ(https://github.com/slime/slime/releases) から最新版をダウンロードして展開し、~/emacs.d/以下に配置する。

Gitが使えるなら

```sh
$ cd ~/.emacs.d/
$ git clone https://github.com/slime/slime.git
```

とする。

# 環境設定
## init.elの作成
~/.emacs.d/ 以下にinit.elというファイルを作成する。

```sh
$ touch ~/.emacs.d/init.el
$ vi ~/.emacs.d/init.el #お好きなエディタで
```
以下を記述。

```init.el
;; SBCLをデフォルトのCommon Lisp処理系に設定
(setq inferior-lisp-program "sbcl")
;; ~/.emacs.d/slimeをload-pathに追加
(add-to-list 'load-path (expand-file-name "~/.emacs.d/slime"))
;; SLIMEのロード
(require 'slime)
(slime-setup '(slime-repl slime-fancy slime-banner)) 
```

# SLIME起動

```sh
$ emacs
```

としてEmacsを起動する。
画面に特にエラーが出ていないことを確認する。

最後に 

```el
M-x slime
```
(Altキーを押しながらx, slimeと入力)をするとSLIMEが起動する。

画像はubuntu server14.04で起動させた様子です
![emacs.png](https://qiita-image-store.s3.amazonaws.com/0/3898/97e2d791-9f7c-eae7-fa54-38625586e9e2.png)

あとはCL-USER> と書かれた部分に入力していけばLispが楽しめます！

Emacsの使い方は各自調べてください。

例：http://yohshiy.blog.fc2.com/blog-entry-256.html

GNU公式ドキュメントは ”Documentation” の項目にあります
http://www.gnu.org/software/emacs/

# リンク
Common Lispをさらに勉強したい方は、書籍をあたるか、Webで情報を探してください。
いくつか無料で読める入門記事を紹介します。

## 日本語での入門記事

### M.Hiroi's Home Page / xyzzy Lisp Programming
http://www.geocities.jp/m_Hiroi/xyzzy_lisp.html#abclisp

xyzzyというWindows向けテキストエディタでプログラミングをする話ですが、基礎的な文法はほぼ同一なので入門程度なら大丈夫だと思います。

### 初めての人のためのLISP[増補改訂版]

http://www.amazon.co.jp/dp/4798119415
どちらかと言うと読み物に近いです。
主にLispの設計思想が書かれており、理解の助けになると思います。


## 英語

### Plactical Common Lisp

http://www.gigamonkeys.com/book/
Common Lispの比較的有名な入門書です。
和訳版が
「実践 Common Lisp」(http://www.amazon.co.jp/dp/4274067211)
という書籍で出ています。
英語が読める方なら無料で読めます。

### On Lisp

日本語 http://www.asahi-net.or.jp/~kc7k-nd/onlispjhtml/
原著 http://www.paulgraham.com/onlisp.html
こちらは発展的内容になりますが、入門書程度では物足りない方はどうぞ。


# 謝辞

以下のサイトを参考にさせて頂きました。ありがとうございます。

* https://github.com/slime/slime
* http://dev.ariel-networks.com/wp/archives/462
* http://yohshiy.blog.fc2.com/blog-entry-256.html

#追記

* (2015/09/26 18:05) CMUCLへのリンクURLが間違えていたので訂正しました。
* (2015/09/26 18:42) リンクの項目を追加
* (2016/06/16 20:51) もうちょっとモダンな使い方を知りたい人はroswellで調べるといいよ
https://github.com/roswell/roswell
技術英語 > data

**data** [名] データ、資料、情報

big dataといった表現でもよく使われる単語data。日本語でもデータと言うので、今さら覚えるまでもない単語です。ですが、その発音は要注意！

<a href="http://toshiaizawa.com/2015/09/techenglish-data/#american" target="quizlet">リスニング用音声（アメリカ英語）</a>

"data" しっかり聞き取れましたか？

dataの発音は「デイタ」だけでなく、「ダータ」と発音されることも多いようです。dataのような基本的な単語ほど、聞き取れないときの痛手が大きくなりがち！ぜひ「二通りの発音がある」ということを意識して、両方の音に慣れておきましょう。

<a href="http://toshiaizawa.com/2015/09/techenglish-data/#british" target="quizlet">リスニング用音声（イギリス英語）</a>

ちなみに、同様のパターンで要注意の単語、他にもあります。advertisementやschedule、ネットワークの世界ではrouteも注意が必要ですよ。

#関連情報

**英語講師 相澤俊幸ブログ**より [技術英語 > data](http://toshiaizawa.com/2015/09/techenglish-data/)
**英語講師 相澤俊幸ブログ**より [英語学習では、沈黙は金？銀？](http://toshiaizawa.com/2014/09/silence-is-golden/)
c3.jsの円グラフで表示順を指定する


javascriptで簡単に様々なグラフを描画できるc3.jsですが、ちょっと躓いた部分を書いておきます。


##公式
http://c3js.org/

##1.円グラフを描画する

###html
```html
<div id="chart"></div>
```

###js
```javascript
var chart = c3.generate({
    data: {
        // iris data from R
        columns: [
            ['S', 10],
            ['M', 30],
            ['L', 60],
        ],
        type: 'pie'
    }
});
```

###結果

![](http://cl.ly/image/0T1V3p452k3n/download/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%200027-09-26%2017.12.20.png)



これだけのコードで円グラフ書けるなんてすごい。
ただこの円グラフ、必ず数値が大きい順に並んでくれちゃいます。

今回躓いたのはこれを降順にしたい場合。

c3.jsにはorderオプションもあり、積み上げ棒グラフでは問題ないが円グラフの場合はこれが効かない。
（以下のように記述しても上の実行結果と変わらない）


```javascript
var chart = c3.generate({
    data: {
        // iris data from R
        columns: [
            ['S', 10],
            ['M', 30],
            ['L', 60],
        ],
        type: 'pie',
        order: 'desc'
    }
});
```


さてどうするか、といろいろ試していたらorderオプションにnullを指定することで解決。

```javascript
var chart = c3.generate({
    data: {
        // iris data from R
        columns: [
            ['S', 10],
            ['M', 30],
            ['L', 60],
        ],
        type: 'pie',
        order: null
    }
});
```

columnsに渡している順番に並んでくれましたね。

![](http://cl.ly/image/3a0O3L0u3K01/download/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%200027-09-26%2017.32.14.png)
【初めてのEdison】さあ初期設定～Wi-Fiに接続だ！

前回の投稿「[【初めてのEdison】まずは買わないと始まらない](http://qiita.com/umi_kappa/items/88a841c281429e57c870)」で華々しくEdisonを手に入れたので今回は初期設定をするよ。Lチカまで長くなりそうなのでひとまずWi-Fi接続まで
※Windowsでの設定方法です。

# 必要なもの
- USBケーブル MicroB 2本 (AndroidのスマートフォンにさすやつでOK)
- Intel Edison (あたりまえだけど念のため)

# 1. PCにUSB接続
PC経由で色々と設定するためUSBでPCに接続。[こちら](https://nonnoise.github.io/Edison/Setup/02.html#usb)みたいいに2本ぶっさすと。あと、SW1スイッチをさしたUSB側にする。購入時からなっているはず。
[Edison (F:)]のようにドライバーとして認識されればOK！

# 2. ファームウェアの更新
インストーラーで更新しようとしたらなぜが失敗。そのままPCに認識されなくなりゴミ箱にポイしそうに。。。バージョン2.1で追加された「Flash Tool Lite」でなんとか更新出来ました。こちらの記事にまとめたのでどうぞ。「[【初めてのEdison】ファームウェア更新に失敗。Edisonが認識されなくなった時の対処法](http://qiita.com/umi_kappa/items/008f949b849a2aaf99c0)」

# 3. Edisonに接続
[PuTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/)や[Tera Term](https://ttssh2.osdn.jp/)をインストールしてシリアル通信します。くわしくは「[Step 3 –シリアルターミナルの設定](http://edison-lab.jp/gettingstarted/edison-arduino/windows/)」をどうぞ。

# 4. Wi-Fiに接続
くわしくは「[Step 4 – EdisonをWi-Fiにつなぐ](http://edison-lab.jp/gettingstarted/edison-arduino/windows/)」をどうぞ。投げてばかりですみません。。でもここは一番の感動ポイントかもしれません！
GitHubのPR内容をcurlで取得する

## 取得方法

```
curl -H "Authorization: token [API Token]" https://api.github.com/repos/[owner]/[repo]/pulls/[pr_number]/files
```

* API Token：認証のために必要。後述。
* owner：Owner名かOrganization名
* repo：リポジトリ名
* pr_number：プルリクエストの`#`に続く番号

## 取得できる情報

参考：https://developer.github.com/v3/pulls/

ファイル名一覧だとこんな感じのものがとれる

https://developer.github.com/v3/pulls/#list-pull-requests-files

## API Tokenの取得方法

```
$ curl -u '[UserName]' -d '{"scopes":["repo"],"note":"Help example"}' https://api.github.com/authorizations

パスワード手入力
```

すると以下のようなレスポンスを得ることが出来る。tokenに入っているのがAPI Token。

```
{
  "scopes": [
    "repo"
  ],
  "token": "your_token",
  "app": {
    "url": "http://developer.github.com/v3/oauth/#oauth-authorizations-api",
    "name": "Help example (API)"
  },
  "url": "https://api.github.com/authorizations/123456",
  "note": "Help example",
  "note_url": null,
  "id": 123456,
}
```

## 具体的な用途

**マージされたPRの差分ファイル名一覧を取得する。**

1. GitHubのWebHookでPRのマージ時にPR情報をJenkinsに送る。
    * 参考：https://developer.github.com/v3/activity/events/types/#pullrequestevent
2. PR情報のjsonからPRのnumberを取得する
    * 参考：http://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af
    * ``number=`echo $payload | jq -r '.pull_request.number'` ``
3. PRの差分ファイル一覧を取得する
    * ``file_list=`curl -H "Authorization: token [API Token]" https://api.github.com/repos/hoge/[repo]/pulls/${number}/files`
file_list=`echo $file_list | jq -r '.[].filename'`
``

```
echo $file_list

hoge/piyo.jpg
hogehoge/foo.png
```

あとはチャットワークに通知するなり、ハッシュ化して別リポジトリに取り込むなり自動化しましょう。


## 所感

PRの差分ファイルをハッシュ化して別リポジトリに取り込む作業が面倒だったのでこういうことしてました。GitHub API使うとだいたいなんでも取れるっぽいのでいろいろできそうです。
Goで多重連想配列

Go言語で多重連想配列を実現したいとします。
一次元の連想配列はこの記法で問題なく動作するのですが…。

```go
test := make(map[string]int)
test["a"] = 1
test["b"] = 2
```

同じように多次元連想配列を実現しようとして下記のような書き方をするとpanicが発生します。

```go
test := make(map[string]map[string]map[string]int)
test["a"]["a"]["a"] = 1
test["a"]["a"]["b"] = 2
```

多次元連想配列を実現するには、最下層より前まで都度makeしてやらないといけないようです。
2次元連想配列の場合、下記のような書き方で解決できます。

```go
// 2次元連想配列
test2 := make(map[string]map[string]int)
test2["a"] = make(map[string]int)
test2["a"]["a"] = 1 // ok
test2["a"]["b"] = 2 // ok
test2["b"]["b"] = 3 // これはpanic。test["b"] = make(map[string]int)してからならok
```

3次元連想配列ならこう。

```go
// 3次元連想配列
test3 := make(map[string]map[string]map[string]int)
test3["a"] = make(map[string]map[string]int)
test3["a"]["a"] = make(map[string]int)
test3["a"]["a"]["a"] = 1 // ok
test3["a"]["a"]["b"] = 2 // ok
test3["a"]["b"]["b"] = 3 // panic。test["a"]["b"] = make(map[string]int)してからならok
```
rbenvでruby環境構築メモ


# インストール

```bash:コマンド例
$ brew install rbenv ruby-build
```

.bashrcに以下を追記

```bash:.bashrc
if which rbenv > /dev/null; then
  eval "$(rbenv init -)"
fi
```

# Rubyのインストール

```bash:コマンド例
# インストール可能な一覧を確認
$ rbenv install --list

# インストール
$ rbenv install 2.2.3

# インストールしたバージョンを global で使用するバージョンに指定
$ rbenv global 2.2.3

# 結果確認
$ rbenv versions
```
【初めてのEdison】ファームウェア更新に失敗。Edisonが認識されなくなった時の対処法

すんなりいくはずのファームウェア更新でなぜが失敗。その後PCにUSBで接続しても認識されずゴミ箱行きか。。。と絶望している中、バージョン2.1で追加された「Flash Tool Lite」でなんとか蘇生しました。

# Flash Tool Lite
[Flash Tool Lite](https://software.intel.com/en-us/flashing-firmware-with-flash-tool-lite)
GUIでEdisonのファームウェアを書き換えられるというものです。

# ファームウェア書き換えまでの流れ
1. Flash Tool Liteのインストール
2. ファームウェアのダウンロード
3. Flash Tool Liteでダウンロードしたファームウェアを読み込み
4. 「Start to flash」ボタンをクリック
5. EdisonへUSB接続
6. 完了！

ざっくりとした流れです。詳しくは公式記事をごらんください。
[Flashing your firmware with Flash Tool Lite](https://software.intel.com/en-us/flashing-firmware-with-flash-tool-lite)

これでやっとEdisonで遊べる。。。
Maven Pluginを特定Profileでは実行しない方法

## 目的
maven pluginを特定 profileでは実行したくない

## 経緯
mavenで Javaウェブアプリケーションのpackaging時 jsとcssを`compress`するため、[yuicompressor-maven-plugin](http://davidb.github.io/yuicompressor-maven-plugin/)使っているが、開発時は compressが走らないようにしたい。
開発結果の packaging時も compressが走ってしまい、jsとcssの確認が難しくなるし、compressされた状態で commitするケースも発生する。

## 対応方法
対象profileの buildタグに `<phase/>`のplugin定義を追加

## 例
```xml
<profile>
    <id>dev</id>
    ...
    <build>
        ...
        <plugins>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>yuicompressor-maven-plugin</artifactId>
                <version>1.5.1</version>
                <executions>
                    <execution>
                        <phase/>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile>
```

## 参考
[Disable a Maven plugin defined in a parent POM](http://stackoverflow.com/questions/7821152/disable-a-maven-plugin-defined-in-a-parent-pom)
[In a Maven multi-module project, how can I disable a plugin in one child?](http://stackoverflow.com/questions/7800647/in-a-maven-multi-module-project-how-can-i-disable-a-plugin-in-one-child)
Packerを使ってAMIを使ってみる

Packerを一度も触ったことがなかったので触ってみたメモ。
シェルスクリプトのプロビジョニングでnginxがインストールされたAMIを作成。

# 参考

+ [Packer](https://www.packer.io/)
+ [PackerでAmazon LinuxのAMI(Amazon Machine Image)を作成する](http://dev.classmethod.jp/cloud/aws/create_amazon-ami_by_packer/)

# 環境

+ MacOSX 10.10.5(Yosemite)
+ Packer 0.8.6

# インストール

```
# バイナリをダウンロード
$wget https://dl.bintray.com/mitchellh/packer/packer_0.8.6_darwin_amd64.zip

# ~/packerに配置
$mkdir ~/packer
$mv packer_0.8.6_darwin_amd64.zip ~/packer
$cd ~/packer
$unzip packer_0.8.6_darwin_amd64.zip
$rm packer_0.8.6_darwin_amd64.zip

# PATHを通す.bashの場合、~/.bashrcに追記
$vi ~/.zshrc

# packer
export PATH=$PATH:$HOME/packer

# 確認
$source ~/.zshrc
$packer --version
0.8.6
```

# AWSアクセスキーの設定

AWSのアクセスキーを設定します。
以下のいずれかの設定をしておけば大丈夫のようです。

+ 環境変数に設定。アクセスキーは「AWS_ACCESS_KEY_ID」か「AWS_ACCESS_KEY」。シークレットキーは「 AWS_SECRET_ACCESS_KEY」か「AWS_SECRET_KEY」
+ ~/.aws/credentials
+ EC2上で実行している場合、IamInstanceProfile(IAMロール)による設定


# templateの作成

nginxがプリインストールされたAMIを作成するためのテンプレートファイルを作成します。

```lang:sample.json
{
  "builders": [
    {
      "type": "amazon-ebs",
      "region": "ap-northeast-1",
      "source_ami": "ami-9a2fb89a",
      "instance_type": "t2.micro",
      "ssh_username": "ec2-user",
      "ssh_timeout": "5m",
      "ami_name": "packer_example {{timestamp}}"
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "sudo yum -y update",
        "sudo yum -y install nginx"
      ]
    }
  ]
}
```

# 実行してみる

```
# ファイルの確認
$packer validate sample.json
Template validated successfully.

# ビルド
$packer build sample.json
・・・
    amazon-ebs: sudo: sorry, you must have a tty to run sudo

```

失敗しました。。。これはよく見るやつです。PackerでUserDataの設定ができるようなのでこれでsudoの設定を変えましょう。

UserDataファイルを作成します。

```lang:user_data
#!/bin/bash
sed -i 's/^Defaults.*requiretty$/#Defaults    requiretty/' /etc/sudoers
service sshd reload
```

templateでuser_data_fileを追加し、上記ファイルを呼び出すようにします。

```lang:sample.json

  "builders": [{
    "type": "amazon-ebs",
    "region": "ap-northeast-1",
    "source_ami": "ami-9a2fb89a",
    "instance_type": "t2.micro",
    "ssh_username": "ec2-user",
    "ssh_timeout": "5m",
    "user_data_file": "user_data",
    "ami_name": "packer_example {{timestamp}}"
  }],
 "provisioners": [{
    "type": "shell",
    "inline": [
      "sudo yum -y update",
      "sudo yum -y install nginx"
    ]
  }]
}
```

実行してみると成功し、AMIが作成されていました。
SendGridのTemplate EngineをRubyから使う

## Template Engineとは

SendGrid では、Template の管理機能を持っている。この機能を使うことにより、テンプレートの管理とアプリケーションを分離することができる。テンプレートの編集は、管理画面より行える。ちょっとした変更などがアプリのデプロイなしに、すぐに行えるのがメリット。

メールの文面考える人と、アプリ作る人が別で、もろもろ面倒くさいよー。という時に使うと良さそう。

## この記事でやること

Ruby(2.2.3)を使ってSendGridのTemplate Engine機能を使う

### 使用するGems

- [sendgrid-ruby (1.0.2)](https://github.com/sendgrid/sendgrid-ruby)
- [smtpapi (0.0.12)](https://github.com/SendGridJP/smtpapi-ruby)

## テンプレートの編集

SendGrid Dashboard の左のメニューより、`TEMPLATES`を選び、テンプレートを作成する。

![スクリーンショット 2015-09-25 10.49.20.png](https://qiita-image-store.s3.amazonaws.com/0/61997/7479f9d1-656a-de65-a376-32efdd9d6a9a.png)

テンプレート名は適当に。あとから変更することができる。

![スクリーンショット 2015-09-25 10.50.20.png](https://qiita-image-store.s3.amazonaws.com/0/61997/6838bd91-4bd2-c1d0-e3af-b22d14da9bd6.png)

![スクリーンショット 2015-09-25 10.57.14.png](https://qiita-image-store.s3.amazonaws.com/0/61997/b90ca696-645d-48e6-ee88-34fc3210b606.png)

最初に提示されるテンプレートには、`<%subject%>`, `<%body%>` がある。これは、APIで送信する subject, body の内容に対応する。ただし、一部分だけ置き換えたメールを送りたいときに、アプリ側でテンプレート割り当ててbodyを作るのでは、ちょっと使い勝手が悪い(と個人的に思っている）。そこで、[Substitute Tags](https://sendgrid.com/docs/API_Reference/SMTP_API/substitution_tags.html) を使う方向性とする。 
`<%subject%>`や`<%body%>`タグを消したテンプレートは残念ながら保存できないので、文末などに置いておく。

![スクリーンショット 2015-09-25 10.57.43.png](https://qiita-image-store.s3.amazonaws.com/0/61997/bfbba791-db9a-f0ca-ece5-1e7dbc4b048d.png)

保存すると、IDが生成される。このIDをメール送信時に利用することができる。

## いざメール送信

ごく最近、SendGridのオフィシャルライブラリでは、AccessTokenに対応したので、その機能を使ってみる。

と思ったのだが、`sendgrid-ruby`(1.0.1) を使おうとした時に、ちゃんとロードできない問題があった。PRを送って、取り込んでもらいました。(現状は修正済み)

```ruby:Gemfile
source 'https://rubygems.org'

gem 'sendgrid-ruby'
gem 'smtpapi'
```

```ruby:sample.rb
require 'sendgrid-ruby'
require 'smtpapi'

client = SendGrid::Client.new do |c| 
  c.api_key = ENV['SENDGRID_APIKEY']
end

# 送信先
to = ['kawahara@example.com']

header = Smtpapi::Header.new
# テンプレート有効化
header.add_filter('templates', 'enable', 1)
header.add_filter('templates', 'template_id', '916f4c70-563e-46ac-a4ca-5867f0a62591')
# 送信先を配列で指定
header.set_tos(to)
# 代替文字の設定 送信先と同じく配列で指定
header.add_substitution('-name-', ['kawahara'])

mail = SendGrid::Mail.new do |m| 
  m.to = to
  m.from = 'noreply@example.com'
  # subject と、text の指定は必須なのでとりあえずスペース。。これがちょっと嫌だなぁ
  m.subject = ' ' 
  m.text = ' ' 
  m.smtpapi = header
end
result = client.send(mail)
p result.body            
```

API KEYは、SendGridの設定メニューより発行できる。ついこないだのバージョン (0.0.3)までは、管理用のユーザ名・パスワードが必要だったが、それらの情報をアプリで共有する必要がなくなるので、より安全。

実行して送信を確認。

```
$ bundle install 
$ SENDGRID_APIKEY=APIKEY bundle exec ruby sample.rb
```

![スクリーンショット 2015-09-26 15.13.20.png](https://qiita-image-store.s3.amazonaws.com/0/61997/6ef43f47-a166-1655-8193-b78ef29ce051.png)

来た。`-name-`が kawahara に置き換わっている。

複数人に送りたい場合は、to の配送先を複数選び、同時に Substitution も配列で送る必要があるので要注意。
`tos=['メールアドレスA', 'メールアドレスB']`, `names=['a', 'b']` のような感じで対応付ける必要がある。

CC/BCCつきのメールでもやってみたりはしたのだが、Substitutionが置き換えられていないメールが来てしまった。。。これ、どうにかならんのですかね。。

## 参考資料

- [Template Engineチュートリアル](https://sendgrid.kke.co.jp/blog/?p=1477)
- [SendGrid の Template Engine をやっと試してみた](http://blog.shibayan.jp/entry/20150121/1421819956)
Crystal のパッケージマネージャー shards の使い方

Crystal は Ruby 風のシンタックスを持つ静的言語です。
shards は Crystal でバージョン v0.8.0 より正式採用されたパッケージマネージャーです。

- [ysbaddaden/shards](https://github.com/ysbaddaden/shards)<br />
  Dependency manager for the Crystal language<br />

# shards 概要
- Crystal 製
- 設定は YAML で shard.yml へ記載
- 任意の git レポジトリをパッケージのダウンロード先として指定可能
  - github と bitbucket は特に略記が可能
- branch, tag, commit を使ってパッケージのバージョンを指定可能
  - 範囲指定のような記法も可能
- Ruby の Gemfile.lock のような働きをする shard.lock を生成

# shards のインストール方法
[公式のコンパイル済みバイナリ](https://github.com/ysbaddaden/shards/releases)を落としてきて適当なパスに配置するか、Crystal でビルドします。[crenv](https://github.com/pine613/crenv) を使うと、Crystal のインストールと同時に shards のビルドが走るのでお薦めです。

shards をビルドする場合は、以下のようにして行えます。

```
$ git clone https://github.com/ysbaddaden/shards.git
$ cd ./shards
$ make
$ ./bin/shards --version
Shards 0.4.0 (2015-09-24)
```

# shards の使い方
依存ライブラリのバージョンを設定ファイル `shard.yml` に記述し、shards を使ってライブラリをインストールします。

基本的には、Ruby の Bundler などと同じような使い方です。`shard.yml` は、Crystal v0.7.7 までサポートされていた `Projectfile` にあたります。

## shard.yml 記法
shards の公式ドキュメントである [SPEC.md](https://github.com/ysbaddaden/shards/blob/master/SPEC.md) にかなり詳しく書かれているので、ここでは簡単な概要のみ説明します。

```yaml:shard.yml
name: package_name # あなたのライブラリの名前
version: 0.1.0 # あなたのライブラリのバージョン

dependencies:
  dependency_pkg_1: # 依存しているパッケージ名
    github: user/repo # GitHub に存在する場合
    bitbucket: user/repo # Bitbucket に存在する場合
    git: git://git.example.org/crystal-library.git # 任意の Git レポジトリを指定可能
    version: ~> 0.1.0 # 依存バージョンを指定 (<, <=, >=, >, ~> が使える)
    branch: master # 最新に向けたりなどブランチ名で指定する場合

development_dependencies: # 開発で使う依存パッケージ
  development_dependency_pkg_1:
    ... (略)

license: MIT # ライセンス
```

## `shards` の使い方
基本的に `$ shards` と打つだけです。

```
$ shards --help
shards [options] <command>

Commands:
    check
    install
    update

Options:
    --no-colors
    --version
    --production
    -v, --verbose
    -q, --quiet
    -h, --help
```

## 解説
`shard.yml` は、ただ依存パッケージを列挙していく形で記述し、特に際立った記法ではないので直感的にかけます。

ライブラリのバージョニングは、[Semantic Versioning](http://semver.org/) に基づいて行ってください。Git リポジトリ上のタグも、それに基づいて `v0.1.0` (プレフィックスとして v をつける) のように作成する必要があります。`shards` や他の開発者がそのようにバージョニングされていることを期待するので、必ず従う必要があります。

従来の `Projectfile` とは違い、依存ライブラリのバージョンを解決するために Crystal コンパイルを必要としないので、高速に動作することが期待できます。また、依存ライブラリのバージョンも詳細に指定できるようになり、やっと本格的な開発にも取り組めそうになってきました。

## 注意点など

 - `Projectfile` からの移の際は、`.crystal`, `.deps`, `libs` を一旦削除しましょう。何故か動かない場合があります。
 - 依存ライブラリのダウンロード先が `.deps` から `.shards` に変更になっていますので、忘れずに ignore しましょう。

# まとめ
shards を使うと、Crystal の依存ライブラリを安全に指定することができます。ぜひ使いましょう。
CSSで要素を横に並べる主な3つのやり方（ブラウザ対応表のおまけつき）

## はじめに
　本記事では ul > li でリスト要素を作ったときによしなに横に並べてもらう方法について見ていきます。

## できるもの
　見た目的にはこんな感じ。
![スクリーンショット 2015-09-26 15.02.01.png](https://qiita-image-store.s3.amazonaws.com/0/62039/cbbda301-7eda-695e-96b1-1c8024c44b5c.png)

　タイトルではこんな風にいってますが、実は[６つのやり方](https://www.halawata.net/2011/10/css-float-display-box/)があります。

　この記事ではその中でも私がよく見てきたやり方に絞ってご紹介します。

## 基本のhtml
基本となるhtmlのソースは以下のindex.htmlです。これをCSSで飾っていきます。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <link rel="stylesheet" href="style.css">
  <title>ぐろーばるめにぅ〜</title>
</head>
<body>
  <h3></h3>
  <ul class = "foo">
    <li><a href="#">HOME</a></li>
    <li><a href="#">page1</a></li>
    <li><a href="#">page2</a></li>
    <li><a href="#">page3</a></li>
    <li><a href="#">page4</a></li>
  </ul>
</body>
</html>
```

## 主なやり方
　以下の実装方法について簡単にご紹介します。
1. display: inline-block での実装
2. display: table-cell　 での実装
3. float　　　　　　　 での実装

## display: inline-block
メリット：inline なのに block なので、padding, margin をキッチリ設定できる。ソース読みやすい。
デメリット： widthで設定した中でli要素をうまいことやりくりせねばならない（borderつけるなら余計に）


displayの説明は[とほほさん](http://www.tohoho-web.com/css/prop/display.htm)にゆずるとして……。
この例では inline-block　という値で設定しています。
以下参考ソースです。

```css:inline-box.css
ul.foo {
  width: 600px;
  border:1px solid red;
  padding:0;
  font-size:0px;
}

ul.foo li {
  width:118px;
  border:1px solid black;
  display: inline-block;
  text-align: center;
  font-size:16px;
}

ul.foo li:first-child {
  height:60px;
}

ul.foo li a {
  display: block;
}
```

## display: table-cell
　メリット：配置関連をよしなにやってくれます。便利です。
　デメリット：対応ブラウザ（IE8以上とか）が限られます。後述の表にまとめていますが、レガシーブラウザ対応する方はご注意。

```css:table-cell.css
ul.foo {
    display:table;
    table-layout:fixed;
    width:500px;
    padding-bottom: 40px;
}
ul.foo li {
    display:table-cell;
    vertical-align:middle;
    text-align:center;
    background-color:red;
    border-left:1px solid white;
}
ul.foo li:first-child {
    border:none;    
}
ul.foo li a {
    display:block;
    text-decoration:none;
    color:white;
}
```

#float:left & clearfix
　メリット：上二つよりは効くブラウザが多い
　デメリット：ソースと概念がちょっぴり複雑

　float:leftで回り込みが利きます。それを利用して横並びにしていきます。
　このパターンだけ、htmlすらも変わります。

```html:float.html
  <div class="clearfix box_wrap">
    <div class="box_left">
        左寄せ1
    </div>
    <div class="box_left">
        左寄せ2
    </div>
    <div class="box_left">
        左寄せ3
    </div>
  </div>
```

```css:float.css
.box_left {
    color: #FFF;
    width:100px;
    height:100px;
    margin-left:10px;
    float:left;
    background-color:#F00;
}
.box_wrap {
    width:500px;
    height:auto;
    border:1px solid #000;
}
.clearfix:after {
  display: block;
  clear: both;
  content: "";
}
```

##おまけ：各ブラウザ対応
[displayの各プロパティのブラウザごと対応状況まとめ](http://builder.japan.zdnet.com/html-css/sp_css-firefox-safari/20373825/)をこちらに再掲します。
ご参考までに (2015-09-26 15.10.04時点) 。

![スクリーンショット 2015-09-26 15.10.04.png](https://qiita-image-store.s3.amazonaws.com/0/62039/10a35f5c-85f3-9ca8-dca5-0677049a4dda.png)


以上、ご質問・コメントなどございましたらお寄せください。
dockerがVPNのせいで繋がらなくなった時は面倒くさい

VPNとか繋いだりすると、詳しいことはよくわからないが`docker`コマンドが返ってこないことがよくある。

そういう時は、次のコマンドを打つと直る。

```bash
boot2docker down
sudo route -nv delete -net 192.168.59 -interface vboxnet1
sudo route -nv add -net 192.168.59 -interface vboxnet1
boot2docker up
```

それも面倒くさいので、`.zshrc`に以下の様なエイリアスを付けてやると楽。

```bash
alias redock="boot2docker down && sudo route -nv delete -net 192.168.59 -interface vboxnet1 && sudo route -nv add -net 192.168.59 -interface vboxnet1 && boot2docker up"
```

`redock` を打つだけで再起動できる。

## References
- [http://christophermaier.name/blog/2010/09/01/host-only-networking-with-virtualbox](Host-Only Networking With VirtualBox)
- [osx mavericks - docker can&#39;t connect to boot2docker because of tcp timeout - Stack Overflow](http://stackoverflow.com/questions/26686358/docker-cant-connect-to-boot2docker-because-of-tcp-timeout)
- [Vallard&#039;s Blog | Boot2Docker with Cisco AnyConnect](http://benincosa.com/?p=2974)
Life is Tech! school 半年間の振り返り

1.keep 良かったこと
・忘れていたコードを思い出すことができた。
・バーチャルジョイスティックコントローラなどの難しい技術を使えるようになった
・数学に若干強くなった。←

2.problem 反省点
・無駄なスクリプトがあったりしたので「美しい」コードが書けるように意識する。
・もう少しプログラムのために使う時間増やすべきだった。

3.try やりたいこと
・飽きやすいミニゲーム的なものじゃなくてそこそこやり込み要素があって楽しめるゲームを作りたい。
・通信などができるものを作りたい。
psqlコマンドのパスを通す

## まえおき
会社のステージング環境でpsqlコマンドが実行できなかった際に
コマンドのパスを通す方法を覚えたのでメモ。

## 実行環境
- CentOS5.6
- PostgreSQL9.0.2
- ...

このケースの場合で他に必要な情報があればコメントで教えていただければ助かります！

## やったこと
### 1.現在のパスを確認する
実行コマンドとその結果

    $ echo $PATH
    /usr/local/bin:/bin:/usr/bin:/home/username/bin

--> : で区切られたそれぞれのパスが既に設定されているパス

### 2.パスを追加する(一般)
~/.bash_profile にパスを追加

    $ vim ~/.bash_profile
    (ファイル内パス追記)
    # .bash_profile
    
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
            . ~/.bashrc
    fi

    # User specific environment and startup programs

    PATH=$PATH:$HOME/bin
    PATH=$PATH:/usr/local/pgsql/bin/ <-- コレ追加！！

    export PATH

### 3. 追加したパスをシステムに反映させる
    $ source ~/.bash_profile

### 4. 最後にパスが追加されているか確認
    echo $PATH
    /usr/local/bin:/bin:/usr/bin:/home/username/bin:/usr/local/pgsql/bin/

追加されていればOK！

## 最後に
わたくしを含め初心者のかたは、そもそも「なぜコマンドが実行できているのか？」
という仕組みをまずは知る必要があるかと思います。
そのためには、[FHS(Filesystem Hierarchy Standard)](https://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard)の理解が必須でしょう。

以上です。
OSX docker のセットアップ

今更、書くことでもないが。
基本的に公式ドキュメント見ればいいと思う。

- [Installation on Mac OS X](https://docs.docker.com/installation/mac/)

VertualBoxが必要なので、予めインストールしておくとよい。

## インストール

インストールは `homebrew` でサックっと行う。

```
brew update
brew install boot2docker
```

OS起動時に起動設定するので、書いてある通り実行する。

```
To have launchd start boot2docker at login:
    ln -sfv /usr/local/opt/boot2docker/*.plist ~/Library/LaunchAgents
Then to load boot2docker now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.boot2docker.plist
```

## 環境変数の設定


今までは

```
export DOCKER_HOST=tcp://192.168.59.103:2376
export DOCKER_CERT_PATH=${HOME}/.boot2docker/certs/boot2docker-vm
export DOCKER_TLS_VERIFY=1
```

を書いてたけど、

shellinitコマンドができてから、

```
eval "$(boot2docker shellinit)"
```

でよくなったみたい。

これだと、毎回シェル起動するたびに `Writing ~/.boot2docker/certs/boot2docker-vm/ca.pem` みたいに出てきてうざいので、少しアレンジして以下の行をrcなどに追加するとよい。

```
eval "$(boot2docker shellinit 2> /dev/null)"
```

ただ、毎回Writing~も実行されてるっぽくて気持ち悪い場合は、最初の`export`形式に戻すことになる。

実験。

```
$ time (eval "$(boot2docker shellinit 2> /dev/null)")
( eval "$(boot2docker shellinit 2> /dev/null)"; )  0.05s user 0.04s system 38% cpu 0.244 total
$ time (export DOCKER_HOST=tcp://192.168.59.103:2376 && export DOCKER_CERT_PATH=${HOME}/.boot2docker/certs/boot2docker-vm && export DOCKER_TLS_VERIFY=1 )
( export DOCKER_HOST=tcp://192.168.59.103:2376 && export  && export ; )  0.00s user 0.00s system 61% cpu 0.001 total
```

`export`のほうがいいね。
ImageMagick 出力ファイル名指定

ImageMagickにて、出力画像のファイル名に画像の幅高さ情報を埋め込む方法を記述する。

使用バージョン

* ImageMagick 6.9.1-4 Q16

# -set filename: プロパティ
[こちら](http://qiita.com/hsagae/items/1320428f74ce57816197 "解像度変換")の処理結果のファイル名に変換後の幅高さ情報を埋め込む。
`convert -size 640x400 -depth 8 gray:circle_640x400.raw -filter point -interpolate Nearest -distort Resize 200% -set filename:f circle_%wx%hNN.raw -depth 8 gray:%[filename:f]`

|コマンド|入力画像|変換指定|プロパティ設定|出力画像|
|:--------|:---------|:---------|:---------|:---------|
|convert |-size 640x400 -depth 8 gray:circle_640x400.raw |-filter point -interpolate Nearest -distort Resize 200% |-set filename:f circle_%wx%hNN.raw |-depth 8 gray:%[filename:f]|

## プロパティ設定
`-set filename:`の後にプロパティ名を置く。本例では`f`としている。
その後に`f`が受ける名前を指定する。`%`付き書式指定が可能である。
`%w`は画像幅(ピクセル)
`%h`は画像高さ(ピクセル)
を表す。

## 出力画像指定部
設定したプロパティを用いる。
`%[]`にてプロパティ名を指定する。


わざわざ出力画像のサイズを頭で計算してファイル名に含めて記載しなくて良いので便利。
RAW画像を扱うときに有用。
node.jsで階層ディレクトリ作成やコピーをしたいときは？

node.jsには標準で[fs][1]という普通に便利なファイル操作のライブラリがあります。しかし、[fs][1]にはプリミティブな機能しか用意されておらず、ディレクトリ階層を操作するにはひと手間必要になってしまいます。

例えば、

- ディレクトリがなければ掘る(`mkdir -p`に相当)とか
- ディレクトリ階層を丸ごとコピー(`cp -r`に相当)とか
- ディレクトリ階層を削除(`rm -rf`に相当)

などの機能はありません。

それぞれ自作していくのもまぁ大きな手間ではありませんが、[node-fs-extra][2]という[fs][1]を拡張したモジュールを使うと、どれも簡単に実現できてしまうので、紹介します。

# インストール

```
$ npm install fs-extra --save
```

# 使い方
[node-fs-extra][2]は[fs][1]の素直な拡張になっているので、今まで

```:javascript
var fs = require('fs')
```
と書いていた箇所を

```:javascript
var fs = require('fs-extra')
```

に入れ替えれて使うことができます。fs-extraをrequireしてあれば、もうfsをrequireする必要はないということです。

## 利用例

### ディレクトリがなければ掘る mkdirs
```:javascript
var fs = require('fs-extra');
fs.mkdirsSync('/some/path/that/does/not/exist/');
```

### ディレクトリ階層をコピー copy
```:javascript
var fs = require('fs-extra');
fs.copySync('/path/to/srcdir', '/path/to/destdir');
```
copyにはfilterオプションがあり、特定のファイルだけコピーや削除することも可能です。

### ディレクトリ階層を削除 remove
```:javascript
var fs = require('fs-extra');
fs.removeSync('/some/path/to/delete');
```

# その他の機能

上に挙げた例では、同期呼び出し版(〜Sync)を紹介しましたが、もちろん非同期呼び出し用の関数もあります。

他にも moveや ensure{Dir,File,SymLink}、JSONファイルの読み書きなどの機能があり、比較的よく使う機能が盛り込まれた、便利なモジュールかなと思います。

[1]: https://nodejs.org/api/fs.html
[2]: https://github.com/jprichardson/node-fs-extra
ImageMagickでの解像度変換

ImageMagickを用いて解像度変換を行う方法を記述する。

使用バージョン

* ImageMagick 6.9.1-4 Q16

# convertコマンド
基本的な書式は次の通り。
`convert -size 640x400 -depth 8 gray:circle_640x400.raw -filter point -interpolate Nearest -distort Resize 200% -depth 8 gray:circle_1280x800NN.raw`

|コマンド|入力画像|変換指定|出力画像|
|:--------|:---------|:---------|:---------|
|convert |-size 640x400 -depth 8 gray:circle_640x400.raw |-filter point -interpolate Nearest -distort Resize 200%|-depth 8 gray:circle_1280x800NN.raw|

## 入力画像指定部
本例では、RAW画像を扱うコマンドとしている。
RAW画像は幅高さ、および1ピクセルあたりの画像深さ情報を持たないため、`-size`オプション、`-depth`オプションで指定する。
また、画像ファイル名の先頭に`gray:`を付加する。

## 変換指定部
`-filter point -interpolate`で解像度変換方式を指定する。
`Nearest`の他にも、`Bilinear`や`Bicubic`などを指定できる。
変換後のサイズ指定として、`-distort Resize`オプションを使用する。
本例の他、`200%x300%`などとすると、幅方向と高さ方向とを別々に指定できる。(幅x高さの順で指定する)
BreakPointのAll Exceptionsが、何故かアプリ起動時に反応してしまう

#問題点
BreakPointのAll Exceptionsを設定すると、何故かアプリ起動直後にブレークしてしまい、アプリを開始できない。
しかし、All Exceptionsを無効にしていると、特に問題もなくアプリが起動出来てしまう。
原因が特定出来ない。

上記の症状について、原因となりうる一つがこの記事で述べられています。
[stack overflow : Xcode throws an exception in Main() in iOS 8 with 'all exceptions' breakpoint](http://stackoverflow.com/questions/26127004/xcode-throws-an-exception-in-main-in-ios-8-with-all-exceptions-breakpoint)

私の場合もこれが原因でした。
検索で見つけやすいよう、日本語での説明を投稿しておきます。

#症状の解析
All Exceptionsを編集し、Exception項目のAllをObjective-Cに変更します。
![スクリーンショット 2015-09-26 14.08.55.png](https://qiita-image-store.s3.amazonaws.com/0/46091/b1999383-8ba9-160c-fb07-18815a06c6be.png)

![スクリーンショット 2015-09-26 14.12.09.png](https://qiita-image-store.s3.amazonaws.com/0/46091/53a24dd1-02f7-6a08-6e72-227bb0b4d02b.png)

このAll Objective-C Exceptionsでアプリを起動し、ブレークせず正常に起動したならば、
Exceptionは、Objective-CではなくC++で発生している可能性があります。

#原因：用意されていないカスタムフォントの使用
原因がC++のExceptionであるならば、
StoryBoardやxibで指定したフォントが、Xcodeに用意されておらず、それがExceptionを引き起こしている可能性があります。

Storyboardの各Sceneや、カスタムしたViewのxibで、カスタムフォントになっていないか確認してください。

#最後に
何事にも原因はしっかりあると言うことですね。
All Exceptionsを有効にしなければ何も問題はなかった為、結構な期間この問題を放置していました（^^;
HTMLの<form>

# はじめに
HTMLの`form`に関して、
あれ？ `submit`ってどうするんだっけ？ `<submit>`って要素あったけ？
みたいなトンチンカンなことや、`<select>`ってどんなんだっけ？
みたいなことに毎回なって、毎回検索するのだけど、さすがにそろそろ覚えてもよいんじゃないかと思って自分用にまとめ。

# マインドマップ
![Form.png](https://qiita-image-store.s3.amazonaws.com/0/27895/ae71e89f-d566-bf5a-b16d-ee34520b9c43.png)


# `submit`, `button`, `<button>`の違い

## 参考
http://chaichan.lolipop.jp/qa3500/qa3719.htm
http://www.webword.jp/xhtml/form/index4.html
http://okwave.jp/qa/q8192923/a22683038.html
http://www.w3.org/TR/2014/REC-html5-20141028/forms.html#the-button-element
http://momdo.github.io/html5/forms.html#attr-button-type

### 引用
`<button>`について
> The missing value default is the Submit Button state.

> 欠損値のデフォルトは、Submit Button状態である。

type書いてないときのデフォルトの動きみたいな意味の英語は、

The missing value default　って表現されてるのか。
The resulting API analysis file is too largeというWarning


iPhoneアプリの申請で今度出たWarningはこれ

![WarningTooLarge.png](https://qiita-image-store.s3.amazonaws.com/0/8868/29167049-5272-1f89-8ebd-6627ee5d9c71.png "WarningTooLarge.png")

```
iTuens Store operation succeeded with a warning.
The resulting API analysis file is too large. We were unable to validate your API usage prior to delivery. This is just an informational message.
```

アプリで使うデータをすべてぶっ込んでいるsqliteのファイルが6.2MBくらいになってたからこれのせいかな。。。

`just an informational message`って書いてあるし、審査にも出せたからきっと問題無しだろう。
審査の結果がでたら追記する。

【追記】
やっぱり問題なく審査通った。
Buy a new bike in Tokyo


继买了在北京的2台自行车之后, 也是时候在东京这边购置新车了. 其实刚来这边就有计划, 但是一直很多事情耽搁了, 这次借着 `silver week` 假期,感觉把这个事情给办了. 

这次首先目标很明确就是想玩一玩公路车. 而对于公路车, 很多好牌子都是来自国外的, 而且感觉要比山地车更加高大上的意思. 所以去过这里最好的自行车专门店` Y's road`, 之前来东京的时候去过有乐町哪里的店, 这次去新宿和涉谷的店, 正好二子玉川这里也有店, 正好都去逛逛. 巧的是, 家附近还有一个` Trek` 的专门店, 好赞. 其实上面说了这多么 感觉还是看上的都是贵啊, 最后还是选择了` giant`. 二子玉川这里还有专门店, 好赞.

不过在逛的过程中间发现一个问题, 很多时候你看上的车都是么有对应的号的车,他们需要和提供商联系调货, 而最短也是需要一个周交付, 尼玛这在天朝不敢想象, 你不能够当场拿货完全就是损失了这个客户啊. 最后好在 giant 这里有2016新款的` TCR advanced2`!

上图!
![IMG_8841.jpg](https://qiita-image-store.s3.amazonaws.com/0/56713/37f21eeb-de2b-4bf5-202a-860a1664d235.jpeg "IMG_8841.jpg")
![IMG_8837.jpg](https://qiita-image-store.s3.amazonaws.com/0/56713/9e5e33ef-2959-04ec-385a-4430c561020c.jpeg "IMG_8837.jpg")
![IMG_8835.jpg](https://qiita-image-store.s3.amazonaws.com/0/56713/5cee5ae9-b92d-d821-8a8a-151dbb969590.jpeg "IMG_8835.jpg")
![IMG_8838.jpg](https://qiita-image-store.s3.amazonaws.com/0/56713/ddf5e92f-0ef7-a521-b091-f85634a0ca4b.jpeg "IMG_8838.jpg")
![IMG_8836.jpg](https://qiita-image-store.s3.amazonaws.com/0/56713/9220676d-22c6-c96d-c95b-927e98738e45.jpeg "IMG_8836.jpg")
![IMG_8839.jpg](https://qiita-image-store.s3.amazonaws.com/0/56713/6de7d3bc-a6fa-cb54-a77a-c2a3983edf0b.jpeg "IMG_8839.jpg")
![IMG_8850.jpg](https://qiita-image-store.s3.amazonaws.com/0/56713/68c4450b-72b1-1148-4b19-7af0147d8707.jpeg "IMG_8850.jpg")
![IMG_8851.jpg](https://qiita-image-store.s3.amazonaws.com/0/56713/e9cfc25e-eb22-1500-9a91-33692ebb1b4d.jpeg "IMG_8851.jpg")
P/Invoke使わないで モニタハンドラを取得してみた

ギャグですよ(^_^.)

```csharp

var monitorfield = typeof(System.Windows.Forms.Screen).GetTypeInfo().DeclaredFields.Single(x => x.Name == "hmonitor");
var Screens = System.Windows.Forms.Screen.AllScreens.Select(x => new {
                            Screen = x,
                            hmonitor = (IntPtr)monitorfield.GetValue(x) });
```
lxml使って、htmlファイルを書き換える


# やりたかったこと
base.html内の<xml>タグの中に、insert.htmlの内容を挿入した結果を、output.htmlとして書き出したかった。

今回は、pythonのlxmlモジュール使ってみた。

## ベースファイル（base.html）
```base.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>テスト</title>
  <xml id="toolbox"></xml>
</head>
<body>
  
</body>
</html>
```

## 挿入内容（insert.html）
```insert.html

<category id="hoge">
	<block></block>
</category>
```

## 出力結果（output.html)
```output.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>テスト</title>
  <xml id="toolbox">
	<category id="hoge">
		<block></block>
	</category>
  </xml>
</head>
<body>
  
</body>
</html>
```

# スクリプト（joint.py）
下記のスクリプトで、イメージどおりのoutput.htmlが生成される。

```joint.py
import lxml.html

def unescape(s):
  s = s.replace("&lt;", "<")
  s = s.replace("&gt;", ">")
  # this has to be last:
  s = s.replace("&amp;", "&")
  return s

def readContent(path):
  f = open(path)
  content = f.read()
  f.close()
  return content

base_path = "./"

insert = base_path + "insert.html"
base = base_path + "base.html"
output = base_path + "index.html"
id = 'toolbox'

html = readContent(base)
html = html.decode('utf-8')
root = lxml.html.fromstring(html)

element = root.get_element_by_id(id)
html = readContent(insert)

element.text = html
content = lxml.html.tostring(root,encoding="utf-8")
text =  unescape(content)

f = open(output,"w")
f.write(text)
f.close()

```

## 備考
### lxmlのインストール
lxmlモジュールは、pipで一発。

    pip install lxml

### htmlタグの置換
<xml>タグのテキストは、そのままでは```<``` や ```>``` が、 ```&lt;``` や ```&gt;```　になってるので、下記関数で置換した。

```
def unescape(s):
  s = s.replace("&lt;", "<")
  s = s.replace("&gt;", ">")
  # this has to be last:
  s = s.replace("&amp;", "&")
  return s
```

### 文字化け対策
ファイル内の日本語が文字化けしていたので、下記コードでデコードとエンコードした。

```
#読み込み
html = html.decode('utf-8')

#書き込み
content = lxml.html.tostring(root,encoding="utf-8")
```
c++ builder XE4, 10.2 Tokyo > char [] をdoubleで取得

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

charで指定された文字列からdouble型を取得したい。
一応下ので動いた。

```
	char szbuf[] = "12.5";
	double val = StrToFloatDef(String(szbuf), 0.0);
```

szbufが`12.5b`など数値以外が入っている場合は0.0になるようにしている。

とりあえず自分の用途としては上でいいが、他にも読み方はあるだろう。
リモート開発視点で考えるTODO管理ツール　「asana」

[asana](https://app.asana.com/ "Asana")というツールをご存知だろうか。
TODO管理ツールの１つである。
この記事ではリモート開発という観点で
Asanaを採用する活用法について考えてみた。

# まずはリモート開発の主流を考える
リモート開発で主流となる開発スタイルに
コミュニケーションはチャット、
タスク管理はチケット管理を採用しているパターンが多い。
具体例をあげると、Chatwork、Redmineなどの組み合わせなどだ。

# チャットツール + チケット運用の弱点
チケット管理はタスクが発生してからの記録には長けているが、
発生した経緯を残すのがチケット起票→追記の手順を踏むなどいささか面倒な事がある。

タスクが発生するポイントは
 - 会議(議事録)
 - 日常コミュニケーション
が多い。
リモート開発前提とするため、日常コミュニケーションとはチャットツールを前提と、
解決策を含めてAsanaの活用方法を提案したい。

# Asanaの活用提案とメリット
AsanaにはConversations(会話)という機能がありチャットと同等の機能を保持する。
対チーム、対プロジェクトなど主に複数人での対話を目的としている。
コミュニケーションツールとして代替可能だろう。

Asanaはタスクが主とした考え方なので発言と同時にタスク追加も可能。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/48623/2d55ee9a-3583-ee31-995c-225deab39bbd.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/48623/8b2f8ad3-0003-0978-102b-883c03e8f60e.png)


各タスクを確認時、発生元が表示されるため辿れば経緯を確認出来る。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/48623/dcea6b0e-57d4-e1b6-d604-9e09ff19e6fe.png)

![1.png](https://qiita-image-store.s3.amazonaws.com/0/48623/5d148209-9cf8-e5df-af06-da5f04178211.png)

上記では日常コミュニケーションとして例にあげたが
議事録としてConversationsを活用する事も有効だ。

# デメリット
 - チケット(タスク)とソースの紐付けが出来ない。
 - 外部連携は行えるがAsana単体での拡張性は欠ける。

# まとめ
決められたルールが多く導入時間に余裕があればチャット+チケット運用に軍配があがるだろうが、
タスク重視、かつ、スピード感のあるプロジェクトであればAsanaの採用は十分メリットがあるではないだろうか。
FacebookがキャッシュしているOGP情報を削除する方法

Facebook向けのOGP情報を変更したのだけど、Facebookがキャッシュしてて変更されず、どうしたらいいかわからんまん(☝ ՞ਊ ՞)みたいなときの解決方法です。

# Open Graph Object Debugger にアクセス
Open Graph Object Debuggerに該当ページのURLを入力するとOGP情報が表示されます。
https://developers.facebook.com/tools/debug/og/object/

# キャッシュ削除ボタンを押す
**Fetch new scrape information**というボタンを押します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/1624/74535420-1c78-1c70-b919-0e8dc4d7effc.jpeg" width="30%" />

# OGP情報が新しく更新されているかを確認
OGOP情報が新しくなっているか、**Show existing scrape information**ボタンを押して確認します。

設定した新しいOGP情報が表示されました(☝ ՞ਊ ՞)
ConoHaオブジェクトストレージで公開コンテナを作成する


# 概要
ConoHaオブジェクトストレージのデフォルトは、オブジェクトを参照するだけでも必ず認証が必要になっています。

オブジェクトストレージに格納したオブジェクトをWEBに公開する場合は、コンテナの設定を行う必要があり、現時点ではコントロールパネルからは設定できないようです。

今回はswiftコマンドで設定してみました。

# swiftと依存するプログラムをインストール

```bash
$ sudo yum install gcc
$ sudo yum install python-setuptools
$ sudo yum install python-pip
$ sudo yum install python-devel
$ sudo pip install python-swiftclient
$ sudo pip install pbr
$ sudo pip install --upgrade setuptools
$ sudo pip install python-keystoneclient
$ swift --version
	python-swiftclient 2.6.0
```

ConoHaオブジェクトストレージにアクセスするための認証情報を環境変数に設定します。

```bash 
$ export OS_AUTH_URL='https://identity.tyo1.conoha.io/v2.0'
$ export OS_TENANT_NAME='[テナント名]'
$ export OS_USERNAME='[APIユーザー名]'
$ export OS_PASSWORD='[APIユーザーのパスワード]'
```

# 認証なしでアクセスできるコンテナを作成
swift コマンドで認証なしで参照可能なコンテナを作成します。
```bash 
$ swift post -r '.r:*' public
```

Cyberduck などでファイルをアップロードすると、ブラウザから認証なしでアクセスできるようになります。

# 参照URL
URLは「[Object Storage Serviceのエンドポイント]/[コンテナ名]/[ファイル名]」になります。
もう少し具体的に書くと「 https://object-storage.tyo1.conoha.io/v1/nc_000000000000000000000000/public/hoge.jpg 」のような感じ。

URLが長くテナントIDが含まれているため、リバースプロキシを用いてURLを短くする方法がありますが、リバースプロキシを導入するとオブジェクトストレージへ逃がしたファイルへのリクエストが必ずリバースプロキシを経由してしまうため、負荷対策という面からこのような形にしています。

HTMLには下記のように記述することで、静的リソースはオブジェクトストレージに直接処理を任せて、WEBサーバは動的コンテンツのみを配信すればいいことになります。

```html
<img src="https://object-storage.tyo1.conoha.io/v1/nc_000000000000000000000000/public/hoge.jpg" />
```
Segue で tableview の cell の中身を渡す時の Segueの設定の仕方

tableview のcellの中身を渡す場合は storyboardのtableview から遷移先にsegueをつなぐのではなく 遷移元の ViewController から遷移先のViewControllerにsegueをつないでIdentifierを設定。

```lang:swift
func tableView(tableView: UITableView,
        didSelectRowAtIndexPath indexPath: NSIndexPath)
```

で 

```lang:swift
performSegueWithIdentifier("", sender: indexPath)
```

を指定。

```lang:swift
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
```

で値を渡す。
GoでデザインパターンObserver

## きっかけ

同僚がGithub公開したAndroidモジュールで、
通知による振る舞いの参考例の中、`Observer`というキーワードが。
http://qiita.com/m1noon/items/b63035d3e9bc2b9bb8f4

そういや、デザインパターン、１つ１つおさらいしときたいなと。Goでね！
ここで改めて復習。。。
http://www.techscore.com/tech/DesignPattern/Observer.html/

## 書いたもの

上記の復習した例を簡素にしてGoでカキカキ。
http://play.golang.org/p/eAo9NV1vnF
Raspberry Pi 2（略してパイ２）を初期設定


# 概要
Raspberry Piを近所の電気屋（マルツ）で発見して衝動買いしてしまったので設定してみました。
パイ２を買うためにサーバ削減をコソコソとやっていたのだが、それはまた別の機会に書きたいと思う。

# 用意したもの
+ 本体：http://www.amazon.co.jp/gp/product/B00T356SFO
+ MicroSDカード：http://www.amazon.co.jp/gp/product/B00SUNRT8U
+ USB充電器ACアダプタ：iPhone6に付属していた5V1Aのヤツ
+ 電源ケーブル：倉庫にあったヤツ
+ HDMIケーブル：倉庫にあったヤツ
+ LANケーブル：倉庫にあったヤツ
+ USBキーボード：倉庫にあったヤツ
+ USBマウス：倉庫にあったヤツ

MicroSDはTOSHIBA SD-C016GR7AR040Aを使いました。
相性問題が方々でいわれていますが、私の場合はこのMicroSDで問題なく動作しているようです。

![IMG_0818.JPG](https://qiita-image-store.s3.amazonaws.com/0/94538/53c777d4-c172-a24f-3316-3f3a7ed994be.jpeg)

すべてパイ２に接続しました。
MicroSDのみ裏面になります。

# Raspbianのインストール
ACアダプタをつないで電源を供給するとNOOBS から Raspbian のインストールが始まります。

![IMG_0819.JPG](https://qiita-image-store.s3.amazonaws.com/0/94538/01d52819-0c9f-5a39-7ce4-1ca4d33d9594.jpeg)

ちなみに、相性の悪いMicroSDだとここでエラーになりました。

![IMG_0820.JPG](https://qiita-image-store.s3.amazonaws.com/0/94538/76a2463b-5bdb-e1fc-9ccd-56f97f5ef7b8.jpeg)

当初、ADATA AUSDH16GUICL10-RM3BKBL を使ってRaspbianのインストールを試みたのですが、どうやってもエラーになってしまいました。
LABELをカラにする、大文字にする、SDFormatterで選択可能なフォーマット方式をすべて試すなどやりましたが解決できず。
NOOBS を使わずに Raspbian を直接MicroSDに書き込んで起動するとI/O errorになっていました。
TOSHIBA SD-C016GR7AR040A に差し替えたら問題なくインストールできたので、相性だと思います。

無事インストールが完了し、SSH接続することができました。
初期状態のTOPコマンドはこんな感じ。

![2015-09-22.png](https://qiita-image-store.s3.amazonaws.com/0/94538/bfd91815-8377-0ff3-cd4e-db69885a56c2.png)

さて、これからパイ２と楽しいLinuxライフを送りつつ、徐々に電子工作にチャレンジしてみたいと思います。
【Pepper】お天気APIとの連携

ヤマロボ 技術担当のHataです。

Pepperに「今日の天気は？」と聴いてもデフォルトでは教えてくれません。
そこで、今回は[OpenWeatherMap](http://openweathermap.org/)という無料のお天気APIと連携して、Pepperがお天気情報を教えてくれるようなプロジェクトを自作したのでご紹介します。

APIのレスポンスはJSON形式です。以下の記事を参考にしてください。
[JSON - 天気情報を取得する](http://qiita.com/s0hno/items/b67a24bd3cbeb6e7cdc0)

# お天気取得ボックスの作成

1. ビヘイビア上で右クリック > [ボックスの新規作成] > [Python] で新規にボックスを作成
2. スクリプトエディタで以下のコードを作成
3. [出力を追加]で出力に「result」を追加
4. Speech Recoボックスを作成し、Word listに「今日の天気は;今日の温度は;明日の天気は;明日の温度は」を追加
5. Set language > Speech Reco(4.) > Weather(1.～3.) > Say Textの順で繋ぐ

![WeatherPepper.PNG](https://qiita-image-store.s3.amazonaws.com/0/94209/ef5fe3c3-ad25-117f-2056-95b1cbd2ade3.png)

```py:Weatherボックスのスクリプト
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self, False)

    def onLoad(self):
        pass

    def onUnload(self):
        pass

    def onInput_onStart(self, p):
        # self.logger.info(p)

        import requests
        import json

        r = requests.get('http://api.openweathermap.org/data/2.5/forecast?q="Tokyo","Japan"')

        list = r.json()['list']
        today = list[2]
        tommorow = list[10]

        result = {\
            "今日の天気は":getWeather(today),\
            "今日の温度は":getTempa(today),\
            "明日の天気は":getWeather(tommorow),\
            "明日の温度は":getTempa(tommorow)\
        }

        self.result(result[p])

        pass

    def onInput_onStop(self):
        self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
        self.onStopped() #activate the output of the box

def getWeather(obj):
    weather = obj['weather'][0]['main'].replace('"', '')
    if (weather == 'Clear'):
        return '晴れです'
    elif (weather == 'Clouds'):
        return '曇りです'
    elif (weather == 'Rain'):
        return '雨です'
    else:
        return 'わかりません'

def getTempa(obj):
    temp = int(float(json.dumps(obj['main']['temp']).replace('"','')) - 273.15)
    return str(temp) + '度です'
```

# コードの解説

順に解説します。

まず、onInput_onStartメソッドの引数にpを追加します。
これは前のボックスからの出力値を受け取ります。

```py:Weather
def onInput_onStart(self, p):
```

次にAPIにアクセスして取得します。
この時、事前に必要なモジュールをインポートしておきます。

```text:APIについて
今回アクセスするAPIで取得できる天気情報は、
0時・3時・6時…と、3時間おきに定時刻に配信されます。

APIを叩いた時刻に最も近い天気情報は、list[2]で取得できます。

1日あたりの配信数は8通となりますので（24時間÷3時間 = 8通)
翌日の同配信時刻は、リスト番号に+8した
list[10]で取得できます。
```

```py:Weather
import requests # HTTPリクエストするのに必要
import json # JSON操作するのに必要

# 東京の天気を取得
# forecastで"Call 5 day / 3 hour forecast data"(5日分の3時間毎の情報)を取得
r = requests.get('http://api.openweathermap.org/data/2.5/forecast?q="Tokyo","Japan"')

# listにforecastの情報が配列として入っているので取得
list = r.json()['list']
# 今日の情報を取得
today = list[2]
# 明日の情報を取得
tommorow = list[10]
```

後は出力に結果を返すだけです。

```py:Weather
# Speech Recoの結果によって返す値を切り替える
result = {\
    "今日の天気は":getWeather(today),\
    "今日の温度は":getTempa(today),\
    "明日の天気は":getWeather(tommorow),\
    "明日の温度は":getTempa(tommorow)\
}

# 出力変数resultに値をセット
self.result(result[p])
```

# おわりに

APIによってJSONの構造が違いますので、
利用したいAPIに合わせて変えてください。

今回のコードは[こちら](https://github.com/yamarobo/pepper_samples/tree/master/Weather)から。
【CoreOS】新規ディスク、パーティションの自動マウント

# CoreOS自動マウントについて

[CoreOSのcloud-config解説〜インストール](http://qiita.com/xshsaku/items/1ba3f930ff80bef685a6)にて紹介するのを忘れてたのでささっと

***

coreosにはfstabがないのでcloud-config.ymlにて設定をします。

## DISKのフォーマット

以下コマンドでフォーマットすることができます。
※対象DISKがsdbの場合

```shell-session
wipefs -f /dev/sdb
mkfs.ext4 -f /dev/sdb
#マウントディレクトリ作成
mkdir -p /mnt/data
```

## 新規Disk or パーティションのマウント方法

coreosセクションに以下の内容を記述していきます。

```coreos:cloud-config.yml
coreos:
  units:
    - name: mnt-data.mount
      command: start
      content: |
        [Mount]
        What=/dev/sdb
        Where=/mnt/data
        Type=ext4
```

## 前記事通り以下のcloud-config再読み込みをします

```shell-session
# cloud-configの再読み込み　おまじないでuser_dataにコピー
sudo coreos-cloudinit -from-file=./cloud-config.yml
sudo cp cloud-config.yml /var/lib/coreos-install/user_data
sudo reboot
```

## **注意点**

マウントをするときのnameには命名規則があり、[mnt-data.mount]は/mnt/dataのディレクトリをマウントしますよという内容になります。

上記の設定を誤ると、起動時のマウントに失敗します。

>It's important to note that systemd requires mount units to be named after the "mount point directories they control". In our example above, we want our device mounted at /media/ephemeral so it must be named media-ephemeral.mount.

参考：

[Mounting Storage](https://coreos.com/os/docs/latest/mounting-storage.html)

前回記事ご紹介：
[【CoreOS】cloud-config解説〜インストール](http://qiita.com/xshsaku/items/1ba3f930ff80bef685a6)
[Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)](http://qiita.com/xshsaku/items/5be3837c39bb8c9bd4e7)
[Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(2)](http://qiita.com/xshsaku/items/a5b57fafa0b41740bd7f)
[Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(完)](http://qiita.com/xshsaku/items/3b1c92a60f3d7e401061)
シリアルモニタからArduinoへ数値を送る方法

シリアルモニタから数値を送り、Arduinoに数値に応じた処理をさせたいときがあります。しかし、以下のコードを書き込んでもちっとも反応してくれません。

```cpp:sample1.ino
void setup() {
  Serial.begin(9600);
}

void loop() {
  byte var = Serial.read();

  switch (var) {
    case 1:
      //hoge(var);<-数値を送って何かをさせる処理
      Serial.println('1');
      break;
    case 2:
      //hoge(var);
      Serial.println('2');
      break;
    case 3:
      //hoge(var);
      Serial.println('3');
      break;
  }
}
```

理由はSerial通信が1Byteの文字コード(ASCIIコード)で行われているからで、[ASCIIコード表](http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html)を確認してみると、数字の『1』は10進数で『49』、16進数で『0x31』に対応していることがわかります。

数字自体は0x30から始まっているため、先ほどのコードに1行追加すると目的の動作をさせることができます。

```cpp:sample2.ino
void setup() {
  Serial.begin(9600);
}

void loop() {
  byte var = Serial.read();
  var = var - 0x30; // 追加の行

  switch (var) {
    case 1:
      //hoge(var);<-数値を送って何かをさせる処理
      Serial.println('1');
      break;
    case 2:
      //hoge(var);
      Serial.println('2');
      break;
    case 3:
      //hoge(var);
      Serial.println('3');
      break;
  }
}
```

単純にシリアルモニタからの数字入力で条件判断させたいのであれば、switch文のcaseを

`case '1':`
または
`case 0x31:`

とすることで文字としての『1』を認識させることができます。