OmniAICreator/Qiita-1.07M huggingface dataset:
iOSアプリでやってしまいがちなバグと対策

iOSのアプリ開発をする時に、よくやってしまいがちな不具合の内容と対策メモです。  

## UILabelが長すぎて他の要素と被る、文字が切れる
### 詳細
constraintの設定が正しくされていなかったり、そもそもデザインに問題があるなど。
### 対策
* 必ずユーザーが入力する項目は文字数制限をする
* 開発環境で各項目の最大長データを用意して表示テストを行う

## tableViewをスクロールするとcellの状態が元に戻る
### 詳細
tableView:cellForRowAtIndexPathがスクロールして複数回呼ばれると、ボタンのstatusが変更されていても、APIから初回取得したデータで書き換わってしまうなど。下記のような画面で起こる。
![スクリーンショット 2015-11-17 12.04.21.png](https://qiita-image-store.s3.amazonaws.com/0/10532/232eb8f9-37e6-8029-cc23-92a2a9f44844.png)

### 対策
* アクションがあったらUIButtonのステータスを変える+データの書き換えも行う

## UITableViewCellやUICollectionViewCellに意図しない画像が表示される
### 詳細
cellにUIImageViewがある場合、セルのキャッシュが原因で同じ画像が表示されてしまったりすることがあります。
### 対策
下記のようにcellのクラス内でprepareForReuseを使って使い回すタイミングで初期化します。

```objc
- (void)prepareForReuse
{
    // セルが画像をキャッシュして、同じ画像が表示されてしまうので初期化
    self.imageView.image = nil;
}
```

## データが0件の場合の表示がおかしい
### 詳細
表示するデータが0件だった時にインジケータが表示され続けていたり、画面が真っ白だったり、 
特定の件数以上の表示ができないなど。
### 対策
* 0件の表示テストを行う

## ページングがループしてしまう
### 詳細
tableViewなどで下部までスクロールしたらページングする実装などで、2ページ目以降も1ページ目と同じ内容が表示されてしまったりする不具合
### 対策
* 1ページに表示する件数より多いデータでテストを行う
* ページングのリクエストに正常にパラメータが渡っているかテストする

## 新規ユーザーだけで発生する不具合
### 詳細
アプリをアップデートしたケースでは発生しないが、新規でDLするとバグが発生するケース。
### 対策
* 必ず新規DL&ユーザー登録のパターンでテスト

## delegateのメソッドがEXC_BAD_ACCESSになる
### 詳細
delegateのprotocol宣言をassignでしていたため、破棄された後にcallされると発生する
### 対策
宣言はweakで宣言する

## NSDictionaryやNSArrayにnilやnullが入ることを考慮していない
### 詳細
objective-cのNSDictionaryやNSArrayはnilやnullの代入を許可していないので、意図せず代入すると NSInvalidArgumentExceptionが発生する
### 対策
代入前にチェックする

## インジケータを通信処理が始まった後に表示させている
### 詳細
APIとの通信を開始する前にインジケータを表示させるのが本来の実装ですが、誤って通信開始後にインジケータを表示させてしまうと、通信が早い場合にインジケータが通信後に表示されてしまうという問題が発生します。

### 対策
必ずインジケータの表示は通信処理の前に行う

## 自戒
開発中はクラッシュなどに慣れてきてスルーしがちです。リリース後に問題になるものの中には、自分が既にクラッシュしているものだったということもあります。 
必ず多少の異変やクラッシュも見逃さないように気にかけるようにしましょう。。
Python の日本語ドキュメントをdashで利用できる形式に変換する(doc2dashを利用する) 

Macで利用できるドキュメントビューア（スニペット管理も出来るらしいです）にDashというアプリがあります。

このDashにPythonのドキュメントも登録できますが、日本語ドキュメントは（当然ですが）ありません。

過去にトライされた方がいまして、参考にさせていただきました。

[Mac - Python 2.7 日本語ドキュメントを Dash.app に追加する - Qiita](http://qiita.com/hetima/items/5c5d81822d35bb254ed5)
[Dash.appにSphinxベースのドキュメントを追加する方法(日本語ドキュメントでもOKだよ) - プログラマ行進曲第二章](http://takuan-osho.hatenablog.com/entry/2013/02/20/how-to-add-sphinx-based-documentation-in-dash-app)

# 日本語ドキュメントのsphinxを利用する

トライされた方は、日本語ドキュメントのHTMLをそのまま利用したようです。その場合、モジュールや関数と言った個別のインデックスが作れないという問題がありました。そのため、今回はsphinxのドキュメントコードをクローンして作成しました。

# 環境作成
virtualenvでsphinxとdoc2dashをインストールします。dashの公式でdoc2dashの使い方がありましたのでそちらをほぼまるまる引用です。

[Dash.app - Documentation Browser for Mac | Christoph Heer's thoughts and notes](http://christophheer.me/2012/7/30/dash-documentation-browser-for-mac/)

なお、今回はpython 3.4.3(Mac Yosemite, homebrew)で作成しました。2.7でdoc2dashを行うとUnicodeDecodeError的な嫌なものが出てきたので、避けるためにpy3kです

```bash
$ python --version
python 3.4.3 

$ mkvirtualenv cpydoc-ja-doc2dash
(cpydoc-ja-doc2dash)$ pip install sphinx doc2dash
```

# 日本語ドキュメントのリポジトリをクローン

日本語ドキュメントのリポジトリは、bitbucketにあるようです。

https://bitbucket.org/pydocja/cpython-ja/overview

hgのリポジトリなので、hgでcloneして下さい。sourcetreeを使ったのでコマンドは割愛します（汗）  
また、ブランチでタグの3.4でチェックアウトしています。

# sphinxで日本語ドキュメントのビルド

ビルドするときに、Sphinxの国際化対応のビルド方法で行う必要があります。以下を参考にしました。

[国際化 — Sphinx 1.3.2 ドキュメント](http://docs.sphinx-users.jp/intl.html)

```bash
(cpydoc-ja-doc2dash)$ cd <path/to/cpython-ja_repo>/Doc

(cpydoc-ja-doc2dash)$ make -e SPHINXOPTS="-D language='de'" html
```

# doc2dashでdocsetファイルを生成する

doc2dashを使って生成します。

```dash
(cpydoc-ja-doc2dash)$ doc2dash -n Python3.4jp -i build/html/_static/py.png -d ~/Documents/ build/html/
```

これで、ホームディレクトリの`~/Documents/`内に、`Python3.4jp.docset`という

なお、doc2dashのexampleにある、doc2dashのオプション `-a` はDashアプリに自動的に追加するオプションです。

# Dashに登録する

生成されたdocsetファイルをダブルクリックすればDash上に登録されます。

# 完成イメージ

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/19092/2f002b0b-0c32-5f41-47ca-57fc4d97f5ff.png)

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/19092/ad016fdb-299d-92a6-4575-5cff7cb656b5.png)

# 問題点

- 今のところわかりません
- Dash側でダウンロードできるPython3のドキュメントとインデックスの中身が違うようなので、どの差異があるのか不明です

# まとめ

sphinxから生成したhtmlを利用すると、検索類も綺麗に出してくれます。非常に便利なのでPythonistaな方々はぜひともチャレンジしてみてください！ 日本語翻訳プロジェクトの皆様に感謝です :+1: 

要望がありましたら生成したファイルをアップしても良いのですが、権利的に良いのかわからないので何方か教えて（汗）
RaspberryPi2と仲良くなってみるシリーズ番外編 - Androidタブレットをディスプレイとしてつかってみる

#はじめに
ディスプレイ重たいしラズパイをお家にあるXperiaZ2Tabletでうつしたいなっていうただの怠慢です
やってみてこれからXperiaをディスプレイとして使うイメージがなかったので番外編

#どうやるか
調べたらVNCserverでラズパイの画面を出すのが一番簡単そうでした。
なので今回はVNCserver経由で画面を出してみます。

#ラズパイ側でやること
##VNCserverの導入
VNCserverのインストール

```bash
$ sudo apt-get install tightvncserver
```

インストールしたら、起動します
初回起動の場合はVNCserverに接続するためのパスワードを設定

```bash
$ vncserver -geometry 1920×1200
You will require a password to access your desktops.

Password: 
Verify:   
Would you like to enter a view-only password (y/n)? Y
Password: 
Verify: 

New 'X' desktop is raspberrypi:1

Creating default startup script /home/pi/.vnc/xstartup
Starting applications specified in /home/penkoba/.vnc/xstartup
Log file is /home/pi/.vnc/raspberrypi:1.log
```

ここで覚えておきたいのが

```
New 'X' desktop is raspberrypi:1
```
の最後の **1** の部分。
後で使うので覚えておく
あと、

```bash
$ ifconfig
```

でIPアドレスを調べておく(メモり忘れたのでコマンドだけで‥)
192.ほにゃほにゃっていうのがあったらそれです。

#タブレット側でやること
## VNCviewerをインストールする
私はgoogleストアで[VNC Viewerのアンドロイド](https://play.google.com/store/apps/details?id=android.androidVNC&hl=ja)をインストールしますた。
## VNCviewerの設定
インストールが終わったら開いて設定します

```
コネクション名：任意の名前
パスワード：先ほどvncserverで設定したもの
アドレス：Raspberry Piのホスト名またはIP
ポート：デフォルトでは5900にディスプレイ番号を足した物（:1の場合は5901）となります。
```

このディスプレイ番号というのが、後で使うと言っていた数字です。
さっき覚えたのは1だったから、ここではポートは **5901** .
ポートの下にUsernameとかいうのがあるけど無視してOK

##接続
したら、左上のほうにある接続ボタンを押します
すると接続できました！
わーいヽ(=´▽`=)ﾉ。o0(なんか色変だけど)

![raspi_vnc.jpg](https://qiita-image-store.s3.amazonaws.com/0/77113/0605fd6f-030b-ff59-6843-b92d1198fedd.jpeg)


このままだと文字入力もなんもできないので、Bluetoothのキーボードを繋げて入力できるようにしました。

#なぜ番外編か
前置きで書いたように、これを今後使わないだろうなと思った理由を書きますと

* 今のところラズパイちゃんは実験機なので常時起動していないから
* ↑なので別のディスプレイでVNCserverを起動してAndroidをつなぐのがちょっと、いやかなり面倒くさい
* あとなんか文字小さいし(大きくすればいいけど)

そして何より

**Bluetoothのマウスもってないｗ**

以上です。
マウスなくても一応タッチでどうにかなるけどやはり使いづらい。
もうちょっとラズパイ使いこなして常時起動しておく感じになってきたらまた考えまーす。

ちなみに、sshでラズパイにログインして、export DISPLAY=:1してからXを起動すると画面に表示するらしいよ！
らしいよ！本編でまずssh接続できるようにしてから考えるね！(´ω｀*)
オーディオ・ケーブルの種類について


展示のお仕事が増えてきて音響関係をやる事が増えてきたのでまとめてみました。
オーディオ・ケーブルには大きくわけて3つあります。

・RCAケーブル
・フォンケーブル(TRS、TS)
・キャノンケーブル(XLR)


＜RCAケーブル＞
![41beDDbsyUL.jpg](https://qiita-image-store.s3.amazonaws.com/0/38279/195fa024-ca03-f8dd-a83f-31bf05bdcb07.jpeg "41beDDbsyUL.jpg")

昔からある三色ケーブルのオーディオだけのものです。
イメージとしてわかりやすいと思うので赤、白の画像を使いましたが古いイメージがあるかもしれませんがオーディオテクニカとかのケーブルだとそんな古いイメージにはならないかと思います。一般てきに赤=R、白=Lで使われています。


＜フォーンケーブル＞
![hosa_hssc.jpg](https://qiita-image-store.s3.amazonaws.com/0/38279/d21925d5-956a-f27a-93eb-f6b342f5a13e.jpeg "hosa_hssc.jpg")

シールドとも呼ばれる一般的なオーディオ・ケーブル
TSRとTSと２種類のタイプがあります。
写真に写っているのはTSRになります。
見分け方は、黒帯の本数になり１本ならTS、2本ならTSRになります。
TSRは、バランス方式、TSは、アンバランス方式で作られています。
バランス式はノイズに強い方式です。


＜キャノンケーブル＞
![hosa_xlrxxxa.jpg](https://qiita-image-store.s3.amazonaws.com/0/38279/a436e665-b19f-2e0f-8eeb-def3e6fce7df.jpeg "hosa_xlrxxxa.jpg")

グランド、ホット、コールドと呼ばれる3つのピンが特徴的なケーブルです。
バランス方式というノイズに強い方式でつくられています。
※グランド、ホット、コールドは3種類の信号の事


<購入先>
RCAケーブル
http://www.amazon.co.jp/dp/B000FHHW3Q/ref=cm_sw_r_tw_dp_Mkkswb0X9QZSD 

TRSフォン
http://www.soundhouse.co.jp/products/detail/item/168946/

キャノンケーブル
http://www.soundhouse.co.jp/products/detail/item/192002/
VCCWでWordPressのテーマ作成環境を構築する


追記: 後半のくだりはVCCWが元から編集するための環境を用意してくれてたので消しました。

VCCWで自分用のWordPressのテーマ作成環境を構築したのでメモ。

以下、VCCW公式より。

> Vagrant based development environment for WordPress plugins, themes, or websites.

要するにvagrantでWordPressの開発環境を整えてくれるやつです。

## WordPressを実行する

### VCCWを手元に持ってくる

http://vccw.cc/ からダウンロードする。

またはgitで持ってきてもOK。

```bash
$ git clone git@github.com:miya0001/vccw.git
```

### vagrantで起動する

ダウンロードしたフォルダに移動してvagrantで起動する。

```bash
$ cd <VCCWのフォルダ>
$ vagrant up
```

結構時間かかるので気長に。


### とりあえず確認

デフォルトのままなら 192.168.33.10 が振られるはずなので、ブラウザでアクセス。

うまくいってればWordPressのトップ画面が表示される。

## 修正する

<VCCWのフォルダ>/www/wordpress 以下が実行しているWordPressのフォルダなので、そこをいじってテーマを開発したりする。
Python3でPillowを使ってURLから画像を読み込む

StringIOでエラーが出てて辛かったけど，`BytesIO`があるらしく，それを使うとできました．
Python3とPython2で文字列の扱いが異なる仕様がファイル読み込みまで影響が出てるんですね．


```py3
import io
import urllib.request
from PIL import Image
f = io.BytesIO(urllib.request.urlopen("画像のURL").read())
img = Image.open(f)
```
Ubuntuにフォントを追加してみる

PCを新調したので、開発環境も新調してみる。
Qiita初投稿。

今まで気にしていなかったが、フォントを変えると、プログラムが捗るらしい。
なので、調べ得た鉄板フォント「Ricty Diminished」をOSに組み込み、気分を変えてみる。

環境は下記。

```bash
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"
```
手順は下記。

```bash
$ git clone https://github.com/yascentur/RictyDiminished.git
$ cd RictyDiminished
$ sudo cp *.ttf /usr/local/share/fonts/
$ sudo fc-cache -fv
```

うん、確かに読みやすい。
コーディングが楽しくなりそうです。
CSSにおけるコンポーネント設計


## 前提
cssを書いていくうえで、昨今コンポーネントの重要性が言われているので、コンポーネントについてまとめてみました。

## コンポーネントとは
コンポーネントについてまとめるうえで、深掘りすると非常に深く難しい概念なので、ここではcssを書いていく上で最低限知っておくべき範囲でコンポーネントについてまとめます。

### 関心の分離
コンポーネントには、前提として「関心の分離」という概念があります。例えば、railsにおいてMVCがあるように、htmlではマークアップ構造、cssではスタイリング構造など、特定の役割・機能・振る舞いなどを厳密にわけることを指します。

### カプセル化
そして、分離という機能を実現するうえで、「カプセル化」の概念も重要となってきます。カプセル化とは、外部からの影響を許可したもののみに限定し、また内部の変更等による影響を外部に与えないものとでもいっておきましょう。これをcssで当てはめたときに、カプセル化はcssにおいて存在しないことがわかります。cssは、常にグローバルスコープのため、常にお互いに作用しあっています。そのため、cssにおけるコンポーネント化は非常に難しいのですが、OOCSS（オブジェクト指向CSS）というものを使用すると可能となります。

## OOCSS

### OOCSSとは
- 構造と見た目の分離
- コンテイナーとコンテンツの分離

上記2つを基本概念とする考え方です。
簡単にまとめると、ページ上に存在する、同じような機能やパターンをもつものをコンポーネント（パーツ）ととし、それらを組み合わせていくことで1つのページが完成するという概念。

### 構造と見た目の分離

例えば、以下の項目のナビゲーションバーがあったとします。

```
・トップ
・株式会社テストとは
・採用条件
・お問い合わせ
```

これらをこれまで通りhtmlで書くと以下のようになります。

```index.html.erb
<div class="nav_top">トップ</div>
<div class="nav_detail">株式会社テストとは</div>
<div class="nav_employment">採用条件</div>
<div class="nav_contact">お問い合わせ</div>
```

```index.css
.nav_top {
  float: left;
  font-size: 10px;
  padding: 5px;
  color: red;
}

.nav_detail {
  float: left;
  font-size: 10px;
  padding: 5px;
  color: blue;
}

.nav_employment {
  float: left;
  font-size: 10px;
  padding: 5px;
  color: green;
}

.nav_contact {
  float: left;
  font-size: 10px;
  padding: 5px;
  color: yellow;
}
```

仮に上記のようなhtml、cssファイルがあったとします。
この場合、それぞれコンポーネントとしてはナビゲーションバーのコンテンツということで、実はまとめることができます。また、そのことはコードを見てもわかりますよね。同じようなコードが多数あるので、まとめることができます。それが以下のものです。

```index.html.erb
<div class="nav top">トップ</div>
<div class="nav detail">株式会社テストとは</div>
<div class="nav employment">採用条件</div>
<div class="nav contact">お問い合わせ</div>
```

```index.css
.nav {
  float: left;
  font-size: 10px;
  padding: 5px;
}


.top {
  color: red;
}

.detail {
  color: blue;
}

.employment {
  color: green;
}

.contact {
  color: yellow;
}
```
こうすることで、今後、ナビゲーションバーの修正を加えたい際、navクラスのみ修正すればすべて変更ができます。また、ナビゲーションバーに追加したい際も、```<div class="nav histroy">生い立ち</div>```のように、最小限の変更で追加することができます。

### コンテイナーとコンテンツの分類
htmlではコンテイナーという概念があります。例えば、headerとfooterなど。ここで、仮にheaderとfooterで同じものを使いたい場合、これまで通りやると以下のものとなります。

```index.css
#header.test{
  font-size: 10px;
  color: red;
}

#footer.test{
  font-size: 10px;
  color: red;
}
```

コンテイナーとコンテンツの分類の概念は、htmlの場所に関係なくcssを書くということです。今回の場合だと、headerとfooterで同じcssをあてたいので、わざわざわける必要はなく、以下のようにまとめることが可能です。

```index.css
.test {
  font-size: 10px;
  color: red;
}
```

## SMACSS
このOOCSSの考え方をより具体的な構造として構築し、css設計に当てはめた概念にSMACSSというものがあります。
SMACSSについては以下のqiitaにまとめたので、興味のある方はみてください。
http://qiita.com/ftyabu/items/14a45706154c5841d1b7
今流行りのSMACSSについて基本的なことをまとめてみました。

## はじめに
CSS設計で昨今非常に重要視され、多くのサービスで取り入れられている設計方法がSMACSSです。個人的にこのSMACSSを用いてCSS設計をすることがあったので、基本的な考え方や構造についてまとめてみました。

## SMACSSとは
長期的にCSSを保守するための考え方に「HTMLの構造に依存しないCSS設計」というものがあります。これを体現しているのが、まさにSMACSSといえます。また、CSSをコンポーネントとして再利用できるものとして構築する概念です。

主な構造は以下の通りです。
- base
- layout
- module
- state
- theme



それぞれ非常に便利なもので、使い勝手が良いのですが、すべてがどのサービスにも使えるものではありませんので、各々サービスにあった使い方をみつけてください。

### base
そのサービスやプロジェクト、サイトにおける要素すべてのデフォルト値を定めたものを管理する場所です。これまでのcssの考え方でいうと、reset.cssなどをここで管理します。

### layout
header, footer, sidebar, containerのようなレイアウトに関するものを管理する場所です。

```css
.l-header {
  background-color: gray;
}

.l-footer {
  background-color: black;
}
```

上記のように指定します。接頭辞の「l-」は、layoutファイル内で定義しているものであることを示すものです。こうすることで、誰がみてもわかりやすくcssを管理することができます。

### module
ページを構成しているほぼすべてのコンポーネントがここで管理されることになります。例えば、ボタンや表、見出しなど再利用可能なコンテンツとしてcssを定義していきます。

### state
layoutやmoduleの特定の状態を定義するものです。例えば、Javascriptなどで適用させていくCSSをここで管理します。

```css
.is-hidden {
  display: none;
}
```
layoutファイル同様、stateファイルでは、ここで定義していることを明示的に示すために、接頭辞として「is-」を使用します。

### theme
こちらは、stateなどの一部分が変わるためのものではなく、そのページの内容、テーマ自体がガラッと変わるときのためにCSSを適用させたいものを管理する場所です。
こちらは、接頭辞として「theme-」を使用します。
いまさらながらのJava & Maven設定

# はじめに
* 仕事でいまさらながらにMavenを利用することなりました。
* いろいろなＰＣに設定する必要があるので、そのメモ。
* Gradle使えよ！っていう突っ込みは禁止です。

# 手順書 
## 前提
* OS
    * Windows 7 64bit

## JDKの設定
* Oracleからインストールする
    * 執筆時点（2015-11-15）で最新のjdk-8u66での手順書となります。
        * 予断ですが、jdk-8u65で大事なアップデートがされているそうですね。
        * https://www.jpcert.or.jp/at/2015/at150038.html
        * http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
* インストール自体は省略
    * デフォルトのままでＯＫです。
* 環境変数の設定
    * スタート ＞　コンピュータ　＞　右クリック　＞　プロパティを選択
        * コントロール パネル\システムとセキュリティ\システム が表示される
    * システムの詳細設定を押下すると「システムのプロパティ」が表示される
    * 「詳細設定」タグの「環境変数」ボタンを押下する
    * 個別ユーザの環境変数の「新規」ボタンを押下する。
        * システムの環境変数は他のユーザに影響を出すため、あまりお勧めしない。
    * 下記の環境変数を登録する
        * 変数名
            * JAVA_HOME
        * 変数値
            * C:\Program Files\Java\jdk1.8.0_66
                * ※これはデフォルトでインストールした場合。インストール時に変更した場合は、環境に合わせて変更してください・
    * 個別ユーザの環境変数の「Path」か「PATH」に下記を追加する。
        * Windowsの環境変数には大文字・小文字の概念がないため、環境変数が先に登録されている場合は、それに追記した方が無難。
            * 無い場合は「Path」がお勧め（システムの環境変数がPathのため）。
        * C:\Program Files\Java\jdk1.8.0_66\bin
    * 環境変数の確認する
        * コマンドプロンプトを起動して下記のコマンドを実行
            * java -version
            * 下記のように出力されればＯＫ
                * java version "1.8.0_66"
                * Java(TM) SE Runtime Environment (build 1.8.0_66-b18)
                * Java HotSpot(TM) 64-Bit Server VM (build 25.66-b18, mixed 
mode)  
        * path
        * 最後にjdk1.8.0_66\bin が出力されればOK

## Mavenの設定
* まずは、本家からダウンロードする。
    * 執筆時点（2015-11-15）で最新の3.3.3での手順書となります。
    * https://maven.apache.org/download.cgi
        * Binary zip archive をダウンロード
* ダウンロードしたZipファイルを解凍する。
* Cドライブ直下にdevelopフォルダを作成して、解凍したディレクトリを格納する。
    * C:\develop\apache-maven-3.3.3
* Pathの設定
    * Pathに下記を追記する。
        * ;C:\develop\apache-maven-3.3.3\bin;
* コマンドプロンプトを実行して、mvn -v を実行する。
* maven情報が表示されればインストール完了。
Windows版JDKをインストールせずに使用する。 

# はじめに

最新のJDKがほしいけどインストーラでインストールするのではなく、[Pleiades All in One](http://mergedoc.osdn.jp/ "Pleiades")に含まれてるJDK様に扱う方法をメモしておきます。

# 手順

## JDKダウンロード
[Oracle](http://www.oracle.com/technetwork/jp/java/javase/downloads/index.html "Oracle")からexeのJDKインストーラをダウンロードする。

##  exeを解凍
7zipなどで、ダウンロードしたJDKのexeを解凍し、さらに「tools.zip」を解凍する。

7zipのコマンドで解凍する場合、Pathを通した上で以下コマンドで解凍できました。

```bat
7z x ≪JDK exeファイル≫ -o≪出力先≫
7z x ≪JDK exe解凍先≫\tools.zip -o≪出力先≫
```

※「7-Zip[64] 15.10 beta」で実行

## unpack200を使用してjarへ変換
「tools.zip」を解凍しただけではまだ使用できません。
展開したフォルダ内にあるunpack200を使用して、pack200で圧縮されたファイルをjarに変換する必要があります。
コマンドラインを開き、「tools.zip」の展開先に移動した後、以下のコマンドを実行する。

```bat
for /r %x in (*.pack) do .\bin\unpack200 -r "%x" "%~dx%~px%~nx.jar"
```

## 実行確認
バージョン確認コマンドを実行して、実行できることを確認します。
コマンドラインを開き以下のコマンドを実行。

```bat
cd ≪tools.zip展開先≫\bin
java -version
```

## 好きな場所へJDKを配置
上記でJDKが実行できるようになりました。
最後に「tools.zip」の展開フォルダのリネーム及び、移動をして好きな場所に配置してください。
※Pathを通す方は変更が必要です。

# 参考
[stackoverflow](http://stackoverflow.com/questions/1619662/how-can-i-get-the-latest-jre-jdk-as-a-zip-file-rather-than-exe-or-msi-installe "stackoverflow")
DE0 nano SoC(Atlas-SoC)環境構築

FPGAのコンパイル環境構築に結構ハマってて、やっとコンパイルできたのでメモ
#環境
ubuntu 15.10
Quartus Prime Lite 15.1
#ダウンロード
Quartus-lite-15.1.0.185-linux.tar
SoCEDSSetup-15.1.0.185-linux.run
2つで8.4G。ダウンロードに一晩ぐらいかかる。
#apt-get install
ここを参考に
http://rocketboards.org/foswiki/view/Documentation/AlteraSoCDevelopmentBoardYoctoGettingStarted

```
sudo apt-get install sed wget cvs subversion git-core coreutils unzip texi2html texinfo libsdl1.2-dev docbook-utils gawk python-pysqlite2 diffstat help2man make gcc build-essential g++ desktop-file-utils chrpath libgl1-mesa-dev libglu1-mesa-dev mercurial autoconf automake groff libtool xterm libqt4-gui:i386 itcl3:i386 itcl3-dev:i386 libgomp1:i386 libqtwebkit4:i386 libtbb2:i386 tcl8.5-dev:i386
```
tcl8.5-lib:i386は見つからないと言われたのでやめておいた。
DS-5をインストールするときのモジュールチェックで引っかかるので、先にインストールしておく。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka14522.html
ここの[ds-deps-ubuntu_64.sh](http://infocenter.arm.com/help/topic/com.arm.doc.faqs/attached/14522/ds-deps-ubuntu_64.sh)
をsudoで実行する。いっぱいインストールされる。
#インストール
まずはQuartusから。解凍してsetup.shを実行する。とくに問題なし。
Quartusを一回実行しておいたほうがいいかも。ライセンス選択する。free版。
SoCEDSSetupも実行する。インストールの最後にDS-5 installが出るので忘れずにチェックを入れて実行する。
DS-5はターミナルでインストールするようだ。最初にsudoで実行したほうがいいよとか言われるが、ユーザでインストールしたほうがいい。Bを押してインストールを続ける。その後は問題ない。
SoCEDSも実行しておいたほうがいいかも。
`~/altera_lite/15.1/embedded/ds-5/bin/eclipse`
ライセンスがどうのとか聞かれる。こちらもfree版を選ぶ。

#コンパイル
ここの通り
http://rocketboards.org/foswiki/view/Documentation/AtlasSoCCompileHardwareDesign
以下のように実行する。

```
cd
mkdir atlas
cd atlas
wget https://github.com/dwesterg/atlas-soc-ghrd/tarball/master -O atlas-soc-ghrd.tgz
mkdir atlas-soc-ghrd
tar -xzvf atlas-soc-ghrd.tgz --strip-components 1 -C atlas-soc-ghrd
cd atlas-soc-ghrd
```
make allはまだ。
環境変数を設定する。

```
~/altera_lite/15.1/embedded/embedded_command_shell.sh
~/altera_lite/15.1/embedded/env.sh
```
これでもlimitedとか言うファイルができてコンパイルが通らない。
[Atlas-SoCで遊んでみる準備をした](http://qiita.com/miyox/items/cf23040d8fa10ac62ff3)を参考にfftのファイルを消す。
`rm scripts/qsys_add_fft128_components.tcl`
最後に
`make all`
2時間ぐらいでコンパイルが通った。
#つぶやき
コンパイルが通らなくてOS入れ替えたり、開発環境入れ替えたり、すごく時間がかかった。
Quartus15.0だとStratixVのデバイス情報がいるようなんだけど、15.1はいらないみたい。
ライセンスが必要なIPをサンプルに入れるなよなぁ。
さくらVPSにMackerelを導入したぞ


## 前談

自分でテストサイトとかを立てる用途で持っているVPSが、大したことしてないはずなのに、けっこうカジュアルに落ちがちだったので、監視を付けないとやべーぜということになった。

サーバーの監視ツールについてはぜんぜん知識がなかったので、周りのひとに聞いたりいろいろした末に、Mackerelさんに目をつけました。

## 導入方法

基本的にchefに乗っけて管理しているサーバーなので、chefおよびBerksfileの作業で導入を片付けたいですね。

その際の手引は、公式が用意してくれてます。

[Chefによるセットアップ - Mackerel ヘルプ](http://help-ja.mackerel.io/entry/howto/chef)

ので本記事も、基本的にはこの手引をなぞっているだけです。

## アカウント登録

- https://mackerel.io/ からサインアップして、host登録して、API Key追加して、という感じで。
- github連携があるサービスはよいですね。
- host名登録するので、ここまででなんとなくできた感してしまいますが、まだMackerel側で受け皿を作ってくれただけなので、サーバー側に **mackerel-agent**をインストールしないと何も始まりません。


## インストール

自分の場合、３つほどファイルを編集すれば完了でした。

### Berksfile

以下を追記して、公式が用意してくれているcookbookへの依存を追加します。

```
cookbook 'mackerel-agent', tag: 'v1.1.0'
```

### recipe

サービス周りのセットアップに使っているrecipeに１行だけ追加。

```
include_recipe 'mackerel-agent'
```

```include_recipe 'mackerel-agent::plugins'```も追加してくれーと書いてありましたが、いきなりpluginもなにもないと思うのでいったん放置。

### attribute

お行儀良いかはあんまりわかってないですが、nodeの設定に追加。

```json
{
    "mackerel-agent": {                                                                  
        "package-action": "upgrade",                                                     
        "conf": {                                                                        
            "apiKey": "xxxxxxxxxxxxx"
        }                                                                                
    }
    
}
```

package-actionは、デフォルトでupgrade入れてくれてるっぽい気配がしたんですが、どうもその部分がうまく動かなかったので、手動追加。

API Keyは、先ほどのアカウント登録時につくったものをコピペです。

### cook

以上の記述を完了して、お好みの手段でcookすれば、インストールが走るはず。

## 起動

インストールしただけでは、監視は開始されません。mackerel-agentを実際に起動するとこまでやらねばです。

こちらも好みあると思いますが、自分は手動でinit.d実行。（chefのserviceでいいんじゃないかと書きながら気づいた）

```
sudo /etc/init.d/mackerel-agent start
```

## まとめ

監視を始めたら、いきなりMemoryが80%を越えてたことに気づいたりして、がたがたふるえています。
#Xojo スニペット「テキストファイルを作成」

```vbnet:
  Dim OutPut as TextOutputStream
  Dim OutFile as FolderItem
  OutFile = SpecialFolder.Documents.child("output.txt")
  Try
    OutPut = TextOutputStream.Create(OutFile)
    OutPut.Write(ConvertEncoding("テスト",Encodings.DOSJapanese))
    OutPut.Close
  Catch e As IOException
    //handle
  End Try
```
TextOutputStream の作り方が昔とちょっと違う気がするのは気のせい？？　昔は FolderItem のメソッドだったようなきもしますが、最近の Xojo では FolderItem を取得して TextOutputStream のシェアメソッドで作るんですね。

TextOutputStream を取得するシェアメソッドですが二種類ありそれぞれ Create が新規作成、Append が追記になっています。

```vbnet:
'新規作成
OutPut = TextOutputStream.Create(OutFile)
```
```vbnet:
'追記
OutPut = TextOutputStream.Append(OutFile)
```
1日4万PVのバズ記事を処理するためにしたこと

管理しているサイトの記事がバズって常に1000人がアクセスしているような状態になった。メモリは2GBでCPUも普通のVPSを使っていたので、すぐにサーバーが死んでしまった。

今回はそんなバズによる急激なアクセス増を処理する対応を行ったので、まとめておく。ちなみに環境はApache+PHP。

## 1. Apacheのhttped.confをチューニング

```
vi /etc/httpd/conf/httpd.conf
```

httpd.confを開き、以下の値に設定した。

```
StartServers       8 # Apache起動時に起動するプロセス数
MinSpareServers    5  # 最低待機プロセス数
MaxSpareServers   50 # 最大待機プロセス数
MaxClients        120 # 最大起動するプロセス数(これ以上は起動しない)
ServerLimit       120 # MaxClientsに指定可能な値の上限。基本は同じにする
MaxRequestsPerChild 10 # 子サーバープロセスが扱うことの出来るリクエストの総数
```

今回はMaxClientsとMaxRequestsPerChildの値を以下のように修正した。

```
MaxClients 
256 > 120

MaxRequestsPerChild
4000 > 10
```

MaxClientsの値が256になっていてhttpdがCPUリソースを専有していた。
そのため、最大起動のプロセス数を120に調整した。

MaxRequestsPerChildは大きすぎるとプロセスがいつまでも死なないので、
メモリを専有してしまっていた。
そのため、10リクエストをさばいたらプロセスが死ぬようにした。

## 2. PHPのメモリ利用を制限

次にPHPの利用するメモリの制限を行った。
php.iniのmemory_limitが1024MBになっていたので、128MBにした。

```
vi /etc/php.ini
```

```
memory_limit = 1024MB → 128MB
```

最後にhttpdを再起動して反映して終了。

上記の対策により合計約4万PVのアクセスがきてもCPUもメモリも問題なく、
リクエストをさばけるようになった。2GBメモリのVPSでもチューニングすれば、意外と何とかなるものですね。勉強になりました。

## 参考にした記事
さくらVPSで一日6万PVを処理するためにしたこと - 新卒インフラエンジニア２年目 http://d.hatena.ne.jp/koujirou6218/20101129/

Apacheのチューニングメモ - Qiita http://qiita.com/nownabe/items/1111cc32da9fe63289f0
CoreOSでswapを追加する

# はじめに
基本的な考えとしてはSWAPに割り当てる領域を確保し、
systemd経由で起動時にSWAPとして割り当てるようにする感じです。
今回は立ち上げてしまったCoreOSに対してしていますが、
cloud-config.ymlを使う場合でもほぼ同様の考え方でできるはずです。

# 手順(1GB追加するのを例に)

## swap領域を作る
まず、/配下に1GiB.swapというファイルを作ってそれをswap領域にします。

```
touch /1GiB.swap
chattr +C /1GiB.swap
fallocate -l 1024m /1GiB.swap
chmod 600 /1GiB.swap
mkswap /1GiB.swap
```

## systemdのserviceとして追加する
次にsystemdにswapサービスを認識させるためにファイルを作ります。

```
vim /etc/systemd/system/swap.service
cat /etc/systemd/system/swap.service
[Unit]
Description=Turn on swap

[Service]
Type=oneshot
Environment="SWAPFILE=/1GiB.swap"
RemainAfterExit=true
ExecStartPre=/usr/sbin/losetup -f ${SWAPFILE}
ExecStart=/usr/bin/sh -c "/sbin/swapon $(/usr/sbin/losetup -j ${SWAPFILE} | /usr/bin/cut -d : -f 1)"
ExecStop=/usr/bin/sh -c "/sbin/swapoff $(/usr/sbin/losetup -j ${SWAPFILE} | /usr/bin/cut -d : -f 1)"
ExecStopPost=/usr/bin/sh -c "/usr/sbin/losetup -d $(/usr/sbin/losetup -j ${SWAPFILE} | /usr/bin/cut -d : -f 1)"

[Install]
WantedBy=multi-user.target
```

ここまでできたらあとは有効化して再起動をするだけです。

```
systemctl enable swap.service
systemctl start swap.service
reboot
```

再起動したら

```
free -h
```

とかで確認して正常に追加されていることを確認しましょう。
Slackの通知設定について


Slackの通知設定についてのメモ。
少人数で使っているうちはたいした問題になりにくいですが、
参加者が増えるにつれて通知設定が便利さに影響を与えてきます。

自分に適した通知設定をしておかないと、
タイムリーな通知に気づけなかったり、通知地獄になります。

※この投稿内でいう通知は、デスクトップ通知のことです。


##ポイント1
Slackの通知設定は、Notificationから行う設定を**デフォルト値**とする

##ポイント2
Slackの通知設定は3種類
a)すべて通知
b)DMと、ハイライトワード（メンション含む）を通知
c)すべて通知しない

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/46104/e878a36b-528a-126d-1fb2-77f3e8f1ee5a.png)


##ポイント3
必要に応じて各チャンネル個別に設定ができる
![bbb.png](https://qiita-image-store.s3.amazonaws.com/0/46104/95b957b2-56db-6822-031a-834ab5554672.png)


------


##つまり
以上を踏まえると、やるべき設定方法は
①３つの通知設定のうち**一番多く該当するものをNotificationで選択**し、
②参加したチャンネル個別に設定を行っていく
ということになる。

イメージが湧かない、様子見したいのであれば、真ん中の
Only for Highlight Words and direct messages
を選び、必要に応じて変えていくのがい良いと思う。
Milkcocoa新機能のHistory APIで期間を指定してデータ取得


MilkcocoaのJavaScript SDKにHistory機能が追加されました。

## JavaScript SDKの導入について

ブラウザの場合は以下をHTMLファイルに貼り付けてください。

```
<script src="http://cdn.mlkcca.com/v0.6.0/milkcocoa.js"></script>
```

npmのmilkcocoaモジュールではv0.3.x以降で使用可能です。

```
npm install milkcocoa
```

## 使い方

対象のデータストアはmessageデータストアだとします。

### 個数を指定して取得する場合

limitを使います。

```
var history = milkcocoa.dataStore('message').history();
history.sort('desc');
history.size(10);
history.limit(2000);
// 上記のように書くと'data'イベントが200回発行されます。
history.on('data', function(data) {
    // 200回呼ばれる
    console.log(data);
});
history.run();
```

### 期間を指定して取得する場合

spanを使い、タイムスタンプを二つ指定します。二つのタイムスタンプの範囲内のデータが取得できます。タイムスタンプはデータのpush時に自動で付与されます。

```
var history = milkcocoa.dataStore('message').history();
history.sort('desc');
history.size(10);
// 2015/10/30-2015/11/3のpush()で保存したデータを取得
history.span(new Date(2015,9,30).getTime(), new Date(2015,10,3).getTime());
history.on('data', function(data) {
    console.log(data);
});
history.run();
```

## まとめ

History APIは過去データを取得したい場合に便利です。データの集計、解析やチャットの過去ログなどにご利用いただけると思います。
pyenv + pyenv-virtualenv (CentOS7)


## 概要
CentOSでのインストールについてまとめた。
OSXと差異は少ないが、前提となる環境が違うため整理した。


## 環境
次の環境で試している。

```
$ uname -r
3.10.0-229.14.1.el7.x86_64
$ lsb_release -a
LSB Version:	:core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID:	CentOS
Description:	CentOS Linux release 7.1.1503 (Core) 
Release:	7.1.1503
Codename:	Core
```


## パッケージのインストール
CentOSで必要となるパッケージのインストール

```
yum -y install git
yum -y groupinstall "Development Tools"
yum -y install readline-devel zlib-devel bzip2-devel sqlite-devel openssl-devel
```


## pyenv のインストール
https://github.com/yyuu/pyenv

```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
exec $SHELL -l
```

## pyenv-virtualenv のインストール

https://github.com/yyuu/pyenv-virtualenv

```
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
exec $SHELL -l
```

基本的にはここまでで使えるようになる。


## pyenv の使い方

### インストール可能なディストリビューション、バージョンのリスト

```
pyenv install -l
```

### インストール
使いたいバージョンのインストール

```
pyenv install 2.7.10
pyenv install 3.5.0
```

インストールしたバージョンのリスト

```
$ pyenv versions
* system (set by /home/saitou/.pyenv/version)
  2.7.10
  3.5.0
```

### デフォルトで使用するバージョンの変更 
システム側のPythonに変更を加えないようにする。
以下では、追加でインストールした2.7.10をユーザー環境のデフォルトに変更している。

```
pyenv global 2.7.10
pip install -U pip
```

システム側のPythonを使いたい場合は system を指定する。

```
$ python -V
Python 2.7.5
$ pyenv global 2.7.10
$ python -V
Python 2.7.10
$ pyenv global system
$ python -V
Python 2.7.5
```



## pyenv + pyenv-virtualenv の使い方

```
pyenv virtualenv <複製元> <任意の複製名>
```

プロジェクト毎に違うバージョンを使い分けたい。
つぎのようにすると、特定ディレクトリを特定バージョンに割り当て、すみ分けて使うことができる。

```
$ pyenv virtualenv 3.5.0 new_env
$ mkdir -p work/new_project && work/new_project/
$ pyenv versions
* system (set by /home/saitou/.pyenv/version)
  2.7.10
  3.5.0
  new_env
$ pyenv local new_env
pyenv-virtualenv: activate new_env
$ python -V
Python 3.5.0
$ cd ..
pyenv-virtualenv: deactivate new_env
$ python -V
Python 2.7.5
$ cd new_project/
pyenv-virtualenv: activate new_env
$ python -V
Python 3.5.0
```

3.5.0を元に新規にnew_envという名前で、新たな環境の複製を行っている。システム側のPythonはもとより、複製元の環境にも変更は加えないため、違うモジュールを試すことができる。
El Capitan にPhantomJS 2.0をインストールする


Mac OS X El Capitan にhomebrewでPhantomJSをインストールができないので、マニュアルでインストールしようとしたところ、一手間必要だったので、そのメモ。

# Homebrewでインストールできない。

2015年11月15日現在、Homebrew でphantomjsをインストールしようとすると、

```
$ brew install phantomjs
phantomjs: This formula either does not compile or function as expected on OS X
versions newer than Yosemite due to an upstream incompatibility.
Error: An unsatisfied requirement failed this build.
```

ということで、まだEl Capitan向けのFormulaが配布されていないようです。


# 公式からバイナリを落とす

[PhantomJS](http://phantomjs.org/) で配布しているMac OS X向けPhantomJSのバイナリがあるので、それをダウンロード、展開して、`bin/phantomjs` を実行可能な場所に移します。

ですが、この時点で実行すると、

```
$ phantomjs
zsh: killed     phantomjs
```

のように即死してしまいます。

Github上のPhantomJSのリポジトリに、これに関する[Issue](https://github.com/ariya/phantomjs/issues/12900)が上がっていて、それによると `upx` を利用して、実行環境に合わせてバイナリをパッケージング（？）し直すといいようです。

```
$ brew install upx 
$ upx -d /path/to/bin/phantomjs
```

`upx`…まだよくわかってないですが、デキる子や。。。


# 参考

* [OS X binary does not work on Snow Leopard and Yosemite #12900](https://github.com/ariya/phantomjs/issues/12900)
Travis CI 上で docker build/run を実行し、起動したコンテナを Serverspec でテストする

## こんな感じになりました

https://github.com/gongo/travisci-docker-serverspec-boilerplate

## 経緯

1. Dockerfile の CI ってみんなどうしてるのだろう
2. CI って思い浮かぶのは [Travis CI](https://travis-ci.org/) かな
3. Travis CI で Docker って使えるんだろうか
4. `before_script`で自力で Docker インストールしてる人がいた
    - [zuazo/docker-in-travis](https://github.com/zuazo/docker-in-travis)
5. README にこんなページ貼ってある
    - [The Travis CI Blog: Using Docker on Travis CI](http://blog.travis-ci.com/2015-08-19-using-docker-on-travis-ci/)

8月に Docker 標準サポートされてるということなので試してみました。

## 試しに書いてみた

### 1. Dockerfile

PHP 5.6 + Apache 環境に Emacs をインストールするという環境を作成するとします。

```dockerfile:Dockerfile
FROM php:5.6-apache

RUN apt-get -qqy update         \
 && apt-get -qqy install emacs  \
 && rm -rf /var/lib/apt/lists/*

COPY ./index.php /var/www/html/index.php
```

### 2. テストファイル

タイトルの通り `Serverspec` でコンテナのテストを行います。

```rb:spec/spec_helper.rb
require 'serverspec'

set :backend, :docker
set :docker_url, ENV['DOCKER_HOST'] # こいつは Travis CI 上で定義してくれています
set :docker_container, ENV['TARGET_CONTAINER_ID'] # これは後で使います
```

Dockerfile に書いた部分をコードに落としていきます。

```rb:spec/container_spec.rb
require 'spec_helper'

describe package('emacs') do
  it { should be_installed }
end

describe file('/var/www/html/index.php') do
  it { should exist }
end

# php:5.6-apache が CMD で apache 起動しています
describe service('apache2') do
  it { should be_running }
end
```

### 3. Travis CI の設定

Travis CI で docker を実行する為に最低限必要なことはこちら:

- `sudo: required` とする
- `services:` に `docker` を追加する

あとは Serverspec 用にコンテナIDを環境変数にセットしてあります。

```yaml:.travis.yml
sudo: required

language: ruby

services:
  - docker

env:
  - TARGET_CONTAINER_ID=container-php-emacs

before_script:
  - docker build -t php-emacs .
  - docker run -d --name $TARGET_CONTAINER_ID php-emacs

script:
  - bundle exec rspec
```

### 4. 準備完了

以上の準備をもって:

1. `services: docker` によって
    - Docker Host 環境が整えられ、docker build/run が使用可能に
    - Docker Host に対応した環境変数がセットされる (`$DOCKER_HOST` みたいなやつ)
1. `script` 実行前に
    1. リポジトリルートにある Dockerfile でイメージビルド
    2. 指定したコンテナIDでコンテナ起動
1. ↑ で指定したコンテナIDを持つコンテナに向けて RSpec (Serverspec) を実行

となります

[Build #1 - gongo/travisci-docker-serverspec-boilerplate - Travis CI](https://travis-ci.org/gongo/travisci-docker-serverspec-boilerplate/builds/91219741)

## まとめ

```
＿人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人＿
＞　どんなファイルでもテストして Travis CI の badge を貼りたい!!!!　＜
￣ＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹ人人￣
```

みたいな人の欲求を満たす方法として、「Dockerfile の CI」を実現してみました。

そんな私も「[Emacs 環境を Heroku 上で構築するための Dockerfile](http://gongo.hatenablog.com/entry/2015/11/14/212637)」を書いているので、勢いで試してみました。


## 参考

- [Using Docker in Builds - Travis CI](http://docs.travis-ci.com/user/docker/)
- [【Docker】Serverspecを用いたDockerのテスト - のんびりSEの議事録](http://carefree-se.hatenablog.com/entry/2015/06/24/000510)
Arduino同士でI2C通信する方法

![IMAG1400.jpg](https://qiita-image-store.s3.amazonaws.com/0/70925/42aae87c-97c9-4655-db13-d58f9003fb48.jpeg)

センサとArduinoとの接続にはI2Cがよく用いられます。ここではセンサとArduinoを接続する前にArduinoがしっかりとI2C通信できるか基本的な構成とコードで確認を行います。

#1. Arduino同士をつなぐ
Arduino同士で接続することで、コード上での送信と受信の大まかな手順を把握することができます。以下の図のように接続します。


![layout(noRegister).png](https://qiita-image-store.s3.amazonaws.com/0/70925/97d7d72d-f76f-de44-33f7-2d4b41cad94a.png)

今回はArduino Pro Mini 3.3Vを使用しました。MasterとSlaveの1対1構成です。どのArduinoでも基本的には同じですが、接続ピンと電圧レベル(5Vor3.3V)を確認して適切に接続します。電圧が異なる場合は変換させるなどの処置が必要となります。

#2. コード
I2CではMasterとSlaveの組み合わせが大原則になっています。通信の主導権は常にMasterが持ち、Masterからの要求に応じてSlaveが応える仕様になっています。したがって、Slave同士での通信やSlaveからMasterにリクエストを送ることはできません。

![wire2.png](https://qiita-image-store.s3.amazonaws.com/0/70925/1a92178b-f198-6cc2-84ba-39f6200791b8.png)


I2CのサンプルコードはArduino IDEのメニューの`[ファイル] -> [スケッチの例] -> [Wire]`から参照することができます。コードはMaster用とSlave用が以下のようにペアとなってそれぞれ用意されています。

![wire1.png](https://qiita-image-store.s3.amazonaws.com/0/70925/5dd73695-f621-57f1-6721-42bd1291cf9b.png)

- master_reader / slave_sender ： センサの読み取り etc...
- master_writer / slave_receiver ： EEPROMの書き込み etc...

![wire3.png](https://qiita-image-store.s3.amazonaws.com/0/70925/57b58221-b2b1-b04a-604e-8cd86adad15e.png)

ここでは[ master_reader / slave_sender ]のペアに少し変更を加えてMasterからSlave(ID#8)へ1Byteのデータを要求し、Slaveは要求のたびに1ずつカウントアップして値を返すコードを作成してみます。


```c:Master.ino
#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);
}

void loop() {
  Wire.requestFrom(8, 1);// request 1 bytes from Slave ID #8

  while (Wire.available()) {
    byte b = Wire.read();
    Serial.println(b);
  }

  delay(500);
}
```
スレーブのIDは8です。

```c:Slave.ino
#include <Wire.h>

byte b=0;

void setup() {
  Wire.begin(8);// Slave ID #8
  Wire.onRequest(requestEvent);
}

void loop() {
}

void requestEvent() {
  Wire.write(b++);
}
```

#3. 結果
Masterをシリアル通信で見てみると、正常に動作していれば以下のようになります。
![i2c_serialMonitor.png](https://qiita-image-store.s3.amazonaws.com/0/70925/01b078ec-6966-c453-d839-a6c85771e904.png)

#4. 【応用】外部抵抗でプルアップする
既にお気付きかもしれませんが、接続図にはプルアップ抵抗が入っていません。公式のWireライブラリを用いるとArduinoの内部でプルアップが行われます。もし、プログラムに問題がないのにI2C通信が不安定であったり、通信ができない場合は内部プルアップ抵抗を無効にしてオシロスコープで波形を見ながら外部で適切な抵抗値でプルアップする必要があります。内部プルアップ抵抗を無効にするには2つの方法があります。

## 方法1.ライブラリを編集する
Arduino IDEフォルダから
(Windows) `\hardware\arduino\avr\libraries\Wire\utility\twi.c`
(Mac) `Arduino.app/Contents/Java/hardware/arduino/avr/libraries/Wire/utility/twi.c`
を開いて、以下の行をコメントアウトさせます。
`
// activate internal pullups for twi.
  digitalWrite(SDA, 1);
  digitalWrite(SCL, 1);`

MasterとSlaveそれぞれにコメントアウトさせた状態で再度書き込みを行うと適用されます。

## 方法2.スケッチを変更する
ライブラリを編集してしまうとWireライブラリを使用するすべてのスケッチでSDAとSCLピンの内部プルアップが無効になります。任意のスケッチだけ内部プルアップを無効にするには、スケッチに以下のコードを追加します。
【重要】Wire.begin()の後に記述すること
`
pinMode(SDA, INPUT);
pinMode(SCL, INPUT);`

## 外部抵抗の接続図
抵抗値はオシロスコープで波形がなまっていないか、またはI2C通信のLowレベルがGNDから離れすぎていないかを見ながら適切な値を選択します。

![layout(addRegister).png](https://qiita-image-store.s3.amazonaws.com/0/70925/a0086087-b84d-95ff-68e7-dacf49cefcc1.png)
AngularJS勉強メモ その3(directive)

これはAngularJSを勉強した内容をまとめたものです。

# 今回したこと
* ディレクティブとは？
* ディレクティブを利用してみる
* 処理の内容を確認

# 環境
* Ubuntu 14.04 (VirtualBox)
* AngularJS 1.4.7

# ディレクティとは？
* DOM要素に付けることができる命令
* {{}}では式の結果を表示するだけなので、forとかifのような制御はディレクティブをつかう

# ディレクティブを利用してみる
１. 以下のようなhtmlを用意

```html
<!DOCTYPE html>
<html ng-app="testMod">
  <head>
    <title>directive</title>
    <script src="angular.min.js"></script>
    <script src="directive.js"></script>
  </head>
  <body ng-controller="testController">
    <table border="1">
      <tr><th>商品名</th><th>値段</th><th>窯元</th><th>在庫</th></tr>
      <tr ng-repeat="item in items">
        <td> {{ item.name }} </td>
        <td> {{ item.price + "円" }} </td>
        <td> {{ item.pottery }} </td>
        <td>
          <span ng-if=item.stock>在庫あり</span>
          <span ng-if=!item.stock>在庫なし</span>
        </td>
      </tr>
    </table>
  </body>
</html>
```

２. 以下のようなjsを用意

```js
angular.module('testMod', [])
  .controller('testController', function($scope, ItemList){
    $scope.items = ItemList();
  })
  
  .value('ItemList', function(){
    return [
    {
      name: "たぬきのおきもの",
      price: 20000,
      pottery: "ほげ窯",
      stock: 10
    },
    {
      name: "かえるのおきもの",
      price: 10000,
      pottery: "ふが製作所",
      stock: 0
    }
    ];
  });
```

３. ブラウザでhtmlをみてみる
![ディレクティブ.png](https://qiita-image-store.s3.amazonaws.com/0/97052/10c4276e-4ded-0054-8fdb-073322b99c83.png)

データをまわして表示と、ifでの表示ができた!

# 処理内容を確認
* 以下に今回使ったディレクティブを記載

## ng-repeat
### 構文: ng-repeat="変数 in 式"
* 式に渡された配列の値を順番に変数に格納する
* 繰り返し範囲は要素みたいだけど、リファレンスをみると開始終了を指定して、要素の範囲を超えた範囲での繰り返しができるっぽい。
 * ひとまず、ここでは基本だけ見る
 
### 今回の処理
* itemsにはモデルで用意されている値が入る
* 配列itemsの値を順番にitem変数に入れて、div要素の中で{{}}で表示させている

## ng-if
### 構文： ng-if="式"
* 式の結果がtrueの場合だけ、要素を表示する

### 今回の処理
* item.stockが0以上であれば"在庫があり"のspan要素を表示、0なら"在庫なし"のspan要素を表示している
 * (これくらいなら三項演算子でいいと思うけど、今回は勉強なのでng-ifで処理してみた。)

# そのほかメモ
* 他にもng-switchとかたくさん用意されている。
* "ng-"っていうのがAngularJSの標準で用意しているものということみたい。
* HelloWorldを表示したときにおまじないのように書いた"ng-app"もディレクティブで、このページをAngularアプリケーションとして自動起動するという命令らしい。
【Node.jsモジュール】node-multispinnerでいい感じに並列処理の実行をコンソールへ出力する

こんな感じのものをコンソールに簡単に出すことができる。
![](https://raw.githubusercontent.com/codekirei/node-multispinner/master/extras/demo.gif)

# node-multispinner
https://github.com/codekirei/node-multispinner

## install
```
npm install --save multispinner
```

## sample

例えばこんなコードを書ける
別途、superagentも使っているので注意。

```js:main.js
const Multispinner = require('multispinner')
const request      = require('superagent')
const requests = [
  'http://google.com',
  'http://yahoo.co.jp',
  'http://apple.com',
  'http://nobodyrequest.com'
]

const ms = new Multispinner(requests)

ms
  .on('success', () => {
    console.log('done without errors!')
  })
  .on('err', (e) => {
    console.log(`${e} spinner finished with an error`)
  })

requests.map((r) => {
  request
    .get(r)
    .end((err, res) => {
      if(err){ ms.error(r); return ;}
      ms.success(r);
    })
})

```


![ 2015-11-15 23.12.27.png](https://qiita-image-store.s3.amazonaws.com/0/19855/664c5ca5-7db7-7328-c400-63244d821803.png)
最低限知っておくべきCSSの基礎

## 前提
css初心者が最低限知っておくべきルールや書き方をまとめてみました。

## 順番によるcssの優先度（CSSファイル内）

```index.css
.hoge {
  font-size: 10px;
}

.hoge {
  font-size: 20px;
}
```

上記のように同じクラス名に、同じプロパティに値を指定した場合、下の```font-size: 20px;```が反映されます。cssファイルは上から順に呼ばれ、下に行くほど同じものがあった場合上書きされるので、優先度は下のものの方が高いのです。

## 順番によるcssの優先度（htmlファイル内）

```index.html.erb
<div class="hoge fuga">
  hogehoge
</div>
```

```index.css
.hoge {
  font-size: 10px;
}

.fuga {
  font-size: 20px;
}
```

上記のような場合、fugaクラスのfont-sizeが優先されます。htmlファイル内も上から下へ読み込まれるため、hogeクラスよりfugaクラスで定義されている内容の方が優先され、上書きされます。

## 全体的な優先度
cssでは、以下のような優先度があります。これらの順番を頭にいれたうえで、cssを書いていく必要があります。

```
<高>
・!important
・インライン記述（htmlファイル内への記述）
・IDセレクタ
・クラスセレクタ
・要素セレクタ
・ユニバーサルセレクタ
<低>
```

### !important
cssファイル内で使用するもので優先度として一番高いものです。

```index.css
.hoge {
  margin: 10px !important;
}
```

ただし、この方法はあまりお勧めしません。もしも、こういった指定の仕方があちこちでされていたら、自分以外の他者がcssをあてようした場合、必ず効かずに原因を探るためのロスタイムが生まれます。大きなサイトになるほど、それは複雑化し、探すのでさえ一苦労となるため、優先度は下のものから指定するべきでしょう。

### インライン記述（htmlファイル内への記述）
こちらは、htmlファイル内で、style属性を使用し、cssを当てる方法です。

```index.html.erb
<div style="margin-bottom: 10px;">
  hogehoge
</div>
```

こちらもあまりお勧めできる方法ではありません。チームで管理していくうえで、htmlはhtmlファイル内で、cssはcssファイル内で管理するべきでしょう。どこで何を定義しているかわからないことほどチーム内で他者に迷惑をかけることはありません。

### IDセレクタ
```
#hoge {
  font-size: 10px;
  margin-bottom: 10px;
}
```

IDはhtml内で一度のみ使用することができるものです。よって、cssにおいても、複数使用できるクラスよりもIDの方が優先度が高いのです。ただし、こちらもあまりお勧めできません。昨今のリッチなサイトが多数をしめる現状をみると、IDはjavascriptを呼ぶために使われていることが多数あり、html内で定義したIDがjavascriptを定義するためのものなのか、cssを定義しているものなのか一目では判断がつきません。必要以上に他者に悩ませないためにもIDはあまり使用するべきではないでしょう。

### クラスセレクタ
htmlにclass属性で定義し、cssに書く一般的な方法

```index.html.erb
<div class="hoge">
  hogehoge
</div>
```

```index.css
.hoge {
  font-size: 10px;
}
```

この方法が一番一般的に使用されており、かつ管理もしやすいものでしょう。特別な理由がない限り、この方法でcssを定義していくのがベストといえます。

### 要素セレクタ
要素に対して直接cssをかける方法です。

```index.css
p {
  margin-bottom: 10opx;
}
```

要素に対して、直接かけるため影響範囲は広いですが、IDやクラスなどより限定的にかける方法よりは優先度は下です。

### ユニバーサルセレクタ
すべてのものにcssをかける方法

```index.css
* { 
  margin: 10px;
  padding: 10px;
}
```
*を使用することで、サイトすべてのcssを定義することができます。優先度は一番下ですが、特に指定をしなかった場合、こちらの要素がすべてに対して適用されるので、注意すべきです。こういった方法で一番使用するのは、reset.cssなどでしょうか。気になった方は調べてみてください。
手書きしたほうが速いメソッドと疎な配列

JavaScriptで配列を駆使するようなプログラムを書くことも多いですが、状況によっては標準のメソッドを使うより、手書きでループを回したほうが速いこともあります。

# Qiitaの記事を読んでいて
少し前に投稿された[TypeScriptの記事](http://qiita.com/falsandtru/items/37721ce199714428df11)を見ていたのですが、その中で、

> 重大なボトルネックとなりうるため全体で100msに1回以上の間隔で実行される場合を除き以下のメソッドを原則使用禁止とする。
>
> * Array#concat
> * Array#slice
> * Array#splice

なんていう記述がありました。さすがに「え、そうなの？」と思いましたが、すぐ下に付いていた[ベンチマーク](https://falsandtru.github.io/benchmark/suites/3/)は、たしかにそのような結果を示しました。

# そうなる理由
もちろん、ネイティブに実装してあることもあるような標準メソッドが、JavaScript上に実装したものより遅いというのはさすがにおかしいので、調べてみました。すると、原因がわかりました。ということで、仕様書に沿って、JavaScriptで`Array#slice`を書き下してみることにします（`this`が特殊なオブジェクトだった場合など、厳密な動作は一部違うかもしれません）。

```js:slice.js

Array.prototype.slice = function(start, end){
  function ToInteger(num){
    //ToNumber
    num = +num;
    //NaN
    if (num !== num) return 0;
    if ((num === 0) || (num === Number.POSITIVE_INFINITY) || (num === Number.NEGATIVE_INFINITY) ){
      return num;
    }
    if (num > 0) {
      return Math.floor(num);
    } else {
      return -Math.floor(-num);
    }
  }

  //ToObject
  if (this == null) throw new TypeError;
  var obj = Object(this);

  var arr = [];

  var lenVal = obj.length;

  // ToUint32
  var len = lenVal >>> 0;

  var relativeStart = ToInteger(start);
  var k;
  if (relativeStart < 0) {
    k = Math.max(len + relativeStart, 0);
  } else {
    k = Math.min(relativeStart, len);
  }

  var relativeEnd;
  if (end === undefined) {
    relativeEnd = len;
  } else {
    relativeEnd = ToInteger(end);
  }

  //仕様書ではfinalだけど、予約語なので回避
  var final_;
  if (relativeEnd < 0) {
    final_ = Math.max(len + relativeEnd, 0);
  } else {
    final_ = Math.min(relativeEnd, len);
  }

  var n = 0, kPresent, kValue;
  while (k < final_) {
    //[[HasProperty]]
    kPresent = k in obj;
    if (kPresent) {
      kValue = obj[k];
      arr[n] = kValue;
    }
    ++k;
    ++n;
  }

  return arr;
};
```

引数の処理が大半を占めていますが、注目すべきは`while`のメインループの中です。`k in obj`として、プロパティの存在チェックをしていますが、これは普通に`obj[k]`を参照するより遅くなっています。これらは`concat`や`splice`にも共通しています。

もちろん、0から`length -1`まできっちり詰まった配列であれば、`k in obj`は常に真なので、ループから除外することで高速化できます。一方で、プロパティとして空きがある、[疎な配列](http://qiita.com/le_panda_noir/items/80fc46078e43c01cf928)の場合だと、`k in obj`をチェックせずに回せば`undefined`が入ります。

もちろん、そのままでも必要な性能が出ていれば無理に変える必要はありませんし、意図的に（`undefined`が要素として入っていると困るような）疎な配列を使う場面もそう多くはないかもしれません。とはいえ、標準のメソッドが汎用に作ってあることで、こんなオーバーヘッドがあることを、知っておいて損はないでしょう。
自分用のメモ Electronの環境構築 Windows編

Electron 環境構築(Windows)

自分用のメモです。
http://qiita.com/nyanchu/items/15d514d9b9f87e5c0a29 
を自分用に補足。
windows7。

# 参考にした記事
http://qiita.com/nyanchu/items/15d514d9b9f87e5c0a29
https://sites.google.com/site/nodejyuku/how_to_install_for_windows

# node.js インストール

## nodejs ダウンロード
https://nodejs.org/en/download/

## nodejs インストール
インストーラが指定してくるディレクトリに「v4.2.2」とかバージョンをつけると
将来的にバージョン変更になった時に管理がラクらしい。ほー。

```
C:\Program Files\nodejs\v4.2.2
```

## 環境変数の設定
windowsの環境変数に追加する。

### システムのプロパティを開く。
- [スタート]
- [コンピュータ] 右クリック してプロパティ
- コンピュータ名のとなりの [設定の変更] クリック
- システムのプロパティがひらく。[詳細設定タブ] クリック。したの方の [環境変数] 押す。

- NODE_HOME変数作成。
  - hogehogeユーザの環境変数 で [新規] クリック。
  - 変数名「NODE_HOME」/ 変数値「C:\Program Files\nodejs\v4.2.2」設定。

- PATH変数修正
  - PATH を選択して[編集]クリック。
  - 今ある内容に「;%NODE_HOME%」を追記。 
  こんなかんじ。

```
C:\Users\hogehoge\ima\aru\yatu;%NODE_HOME%
```
## コマンドプロンプトからnode.jsのバージョン確認
・  [Win] + [R] でファイル名を指定して実行画面を起動
・「cmd」と入力してコマンドプロンプト起動

```
C:\Users\hogehoge> node -v
v4.2.2  <--- バージョンが出ればOK
```

# Electronのインストール

## node.exe をインストールしたディレクトリに移動

（移動とかしなくて良い可能性が・・・・）
ひきつづきコマンドプロンプトから作業。

```
> cd %NODE_HOME%
> dir
```

## Electronのインストール

参考元のキータのやつをコピペ。

```
> npm -g install electron-prebuilt
```

参考元の記事をみてmain.jsとか用意する。

## 実行
main.js のあるディレクトリで

```
> electron .
```
CSS設計の基礎概念

## 前提
リッチなWebサイトが流行る昨今において、CSSやjavascriptなどのコードが複雑化してきました。それにより、長期的に管理していくためにもより構造的なCSS設計をすることが必要です。そのうえで、最低限しておくべき、CSS設計の基礎をまとめてみました。

## 破綻しやすいCSSの特徴
以下がよくある破綻しやすいCSSの設計です。長期的に管理していくサイトにおいて、以下の要素が少しでも見受けられる場合修正するべきでしょう。

### HTML側のコードと同じ構造で作られている場合

```index.html.erb
<div class="contents">
  <h1>見本</h1>
  <div class="list">
    <ul>
      <li>テスト1</li>
      <li>テスト2</li>
    </ul>
  </div>
</div>
```

```index.css
.contents list ul li {
  text-align: center;
  font-size: 15px;
  margin: 10px 10px;
}
```

こういったコードがある場合、もし以下のような修正がhtml側に入ったら、どうなるでしょうか??

```index.html.erb
<div class="contents">
  <h1>見本</h1>
  <div class="test">
    <p>テスト</p>
    <div class="list">
      <ul>
        <li>テスト1</li>
        <li>テスト2</li>
      </ul>
    </div>
  </div>
</div>
```

仮に、html側の構造と同じものでcssを書いていた場合、以下のように修正する必要が出てくるでしょう。

```index.css
.contents test list ul li {
  text-align: center;
  font-size: 15px;
  margin: 10px 10px;
}
```
今回のようなものであれば、すぐ修正できますが、一般的にWebサイトにおいては、より複雑な構造になっていますので、今回のように簡単に修正することは難しくなるでしょう。なので、htmlの構造に依存しないcss構造を構築する必要があります。

### 追加したコードを取り消すためだけのCSSが書かれている場合
もし、以下のように追加したCSSを消すためだけのcssが書かれていたらどうなるでしょうか。

```index.css
.test {
  font-size: 16px;
  padding-top: 10px;
}

.remove {
  padding-top: 0px;
}
```

```index.html.erb
<div class="test remove">
hogehoge
</div>
```

こういったものはコードをより複雑化させ、コード量も必要以上に多くなり、管理がしにくいものになります。cssは追加する場合のみ定義するようにすべきです。

### 絶対値を多くの場面で使用している場合
親要素によく指定しがちなものが、こちらです。

```index.html.erb
<div class="contents">
  <div class="nav">
    hogehoge
  </div>
</div>
```

```index.css
.contents {
  line-height: 1.5;
  margin: 10px 10px;
}

.nav {
  padding-top: 10px;
}
```

上記のような場合、親要素のline-heightが子要素にも反映されてしまいます。このように影響範囲の大きいクラスやIDなどにはこのようなものを定義するのはさけるべきです。

## よりよいCSSとは
HTML/CSS関連のドキュメントなどを多数書かれていらっしゃるフィリップ・ウォルトン氏によると以下の4つがよりよいCSSの特徴のようです。
参考: http://article.enja.io/articles/css-architecture.html

- 予測しやすい
- 再利用しやすい
- 保守しやすい
- 拡張しやすい

### 予測しやすい
チーム開発において、非常に重要な要素でもあるのが、コードが予測しやすこと。これは、そのままの意味でCSSコードが予測した通りに動いてくれることを意味しています。複雑なプログラムになればなるほど、CSSも複雑化し、思い通りに機能してくれなかったり、コード通しが悪影響を及ぼす場合もあります。そのようなことを避けるためにも、他者が読んで予測しやすいCSSを書く必要があります。

### 再利用しやすい
複雑化するにつれ、ほぼ必ず似たようなCSSコードを書く場面が出てくる。その場合に、毎回同じようなコードを書くのではなく、コンポーネントつくりコードを再利用し、必要以上にコードが増えることを避けるべきだという考えです。

### 保守しやすい
Webにおいて、短期的にキャンペーンをうったりして新しい機能やルールが増えることがあります。そういった場合に、CSSを毎回リファクタリングする必要のないように日頃から設計するべきだという考えです。

### 拡張しやすい
チームで開発するうえで、サイトのメンテナンスが必要になってきます。そういった場合に、誰がコードをいじっても管理しやすいようになっているべきでしょう。そういった意味合いで、サイトが大きくなるにつれて、既存のCSSが拡張しやすくなっているべきです。
QNAP firmware 4.1.4以降にgccを入れる


# ipkgはいずこ

TVS-471 を手に入れた。
これまでTS-459などを使っていて、redmineやらgitlabやらjenkinsやらsailsやら動かしていたが手狭になったので購入。

SSDを4台ぶち込んでメモリ増量して準備完了。
TS-459と同じ環境と作ろうと思ったのだが...

ファームを4.1.4(今はもう4.2.0が出ているけど)に上げて、ipkgでも入れようかとAppCenterをのぞいたら...ipkgいない...
調べたところ、すでにOptware ipkgはメンテされなくなったようだ。
[QNAPware(Entware)](http://apps.qnap.community/11-community/10-qnapware)を使えとのこと。
上記については[このあたりの話](http://forum.qnap.com/viewtopic.php?t=111856)を参照

# qpkgのインストール

AppCenterに行って手動でインストールする。
今回は/Apps/opt に入るようだ。(/Apps/opt は /share/.../.qpkg/Qnapware/opt にリンクされる)
使い方はおおよそ ipkg と一緒だが、一部違うのでヘルプは見ておいたほうがよいかも。
ソフトウェアの説明が複数行になってるので、listすると見にくい...

めげずにバージョンを確認したところ、新しいバージョンがそろってる！素敵！
ipkgにわざわざ戻す必要はないかなぁ...と思ったのだが...
よく見ると、lib系のパッケージが .h を含んでいない。
本当にライブラリのバイナリだけが欲しければそれでいいのだが、アプリのビルド時にヘッダファイルも要るので、結局ソースを持ってきてビルドするライブラリもありそうだ。

さて、これで色々とソフトウェアをビルド...と思ったらさらに問題が。

# toolchainがない!

あれ？qpkgに[gccが無い](http://www.qnapclub.jp/viewtopic.php?p=1701)ぞ！
これは、QNAPware(entware)のベースとなるOpenWRTでは、
gccのビルドは重すぎる(ターゲットは組み込み機器な)ので[入っていないようだ](http://forum.qnap.com/viewtopic.php?t=109154)。

さて、どうしたものかと思って調べてみたところQDKを使うことになるようだ。
まずは[「Client Development Kit QDK」](https://www.qnap.com/event/dev/en/p_qdk.php)に行って、

末尾の「Toolchains for Intel x86 and Marvell ARM」 からのリンクをクリック。
その先の cross-project... から適切なほうをダウンロード。(500MB近いので注意)
一覧の最後のほうにpdfもあって簡単な説明は書いてある。

これを適当な場所に置いて展開すると...見たことのあるフォルダ構成で展開される

上記のpdfにもあるように、展開場所にchrootした後、gccのソース一式を持ってきてビルド。
その後に本来の(希望の)場所へコピーすると、gcc使えるようになりました。

# nginx動いた!

結局 gcc 5.2.0を入れて多数のライブラリを入れて nginx 1.8.0を動かすところまで来た。
途中でもいろいろあったけど、それはまた今度。
次はredmineだな...
16進数 10進数 8進数 変換 それぞれワンライン


```
$ printf "%d" 0x12 // 16進数 → 10進数
18
$ printf "%X" 12 // 10進数 → 16進数
C
$ printf "%o" 12 // 10進数 → 8進数
14
```

ぼかの変換は出力フォーマット指定子ってのを見てがんばってね

参考
[フォーマット指定子一覧](http://www.k-cube.co.jp/wakaba/server/format.html)

--
2015-11-15 21:53
2進数はできなかった，8進数でした
スミマセン
ActiveAdmin 独自のindexを作る

ActiveAdminで管理画面を作るとき、indexページをカスタマイズしたいと思ってググると、だいたいここにたどり着く。

[activeadmin/3-index-pages.md at master · activeadmin/activeadmin](https://github.com/activeadmin/activeadmin/blob/master/docs/3-index-pages.md)

Tableの他、Grid、Blocks、Blogなんかが選べるよ！

...そうじゃなくて、もっと完全にカスタマイズしたい場合は？

[Custom Index](https://github.com/activeadmin/activeadmin/blob/master/docs/3-index-pages/custom-index.md)を作ってね

で、このCustom Indexがよくわからんので、ドツボにはまる。


# indexとして単なるViewを表示する

　実は、activeAdminのindexページとして単なるview templateを表示することができる。

たとえばapp/views/active_admin/_tree.haml を作って

```
Hello View World!
```

indexページに指定してやれば、そのViewがそのまま表示される

```
ActiveAdmin.register Category do
  index do
    render partial: 'active_admin/tree'
  end
```

![Tag_Categories___Dengenmap 3.png](https://qiita-image-store.s3.amazonaws.com/0/30743/153735d2-7b3e-4d6d-762b-4b623ab2d89a.png)

こんにちはいつものRailsの世界。

# collectionsを表示する

で、このViewには、いつものrails同様、インスタンス変数で表示すべきcollectionsが渡されてくるので、これを使えば、任意のデザインでindexを出力することができる。

```
.row
  - @categories.each do |tc|
：
```
(app/views/active_admin/_tree.haml)

![Tag_Categories___Dengenmap 2.png](https://qiita-image-store.s3.amazonaws.com/0/30743/8212fdbc-ad05-007a-3da8-9c5e01e201c3.png)


当然の事ながら、Collectionとして渡されてくるのはFilterで絞り込んだあとのデータなので、Filterで絞り込んだらViewにもその内容が自動的に反映される。

![Tag_Categories___Dengenmap.png](https://qiita-image-store.s3.amazonaws.com/0/30743/ae1e3776-bbbf-a826-38e4-4b51352ea3b5.png)

CustomIndexなんていらんかったんや！