OmniAICreator/Qiita-1.07M huggingface dataset:
Docker入門: 4日目

# コンテナにNginxを入れてブラウザで閲覧

## コンテナ作成、Nginxをインストール

```
$ docker run -it -p 8080:80 intern/sshd /bin/bash

root@0d4430a80668:/# aptitude install -y nginx
...
Setting up xml-core (0.13+nmu2) ...
Processing triggers for sgml-base ...

root@0d4430a80668:/# 
```

## Nginxの設定、起動

バーチャルサーバの設定を書きます。

```
root@0d4430a80668:/# vim /etc/nginx/conf.d/default.conf
```

```lang:/etc/nginx/conf.d/default.conf
server {
  listen  80;
  server_name localhost;

  location / {
    root /usr/share/nginx/www;
    index index.html;
  }
}
```

## ブラウザで閲覧

起動。

```
root@0d4430a80668:/# /etc/init.d/nginx start
Starting nginx: nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
nginx.

root@0d4430a80668:/# 
```

ブラウザで開く。

![スクリーンショット 2014-07-08 11.31.09.png](https://qiita-image-store.s3.amazonaws.com/0/48014/0e659acd-2344-6a90-c2ff-7755021f1174.png)

アクセスするURLは...

```
$ boot2docker ip

The VM's Host only interface IP address is: 192.168.59.103

$ docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS                  NAMES
0d4430a80668        intern/sshd:latest   /bin/bash           17 hours ago        Up 16 minutes       0.0.0.0:8080->80/tcp   romantic_elion  
```

# 参考
## Dockerの参考
* [Network Configuration](https://docs.docker.com/articles/networking/#quick-guide-to-the-options)

## Nginxの参考
* [nginx連載1回目: nginxの紹介](http://heartbeats.jp/hbblog/2012/01/nginx01.html)
* [nginx連載2回目: nginxのインストール](http://heartbeats.jp/hbblog/2012/02/nginx02.html)
* [nginx連載3回目: nginxの設定、その1](http://heartbeats.jp/hbblog/2012/02/nginx03.html)
* [nginx連載4回目: nginxの設定、その2 - バーチャルサーバの設定](http://heartbeats.jp/hbblog/2012/04/nginx04.html)
* [nginx連載5回目: nginxの設定、その3 - locationディレクティブ](http://heartbeats.jp/hbblog/2012/04/nginx05.html)
UIPageViewControllerを調べてみた

## 基本的な使い方

UIPageViewControllerと、UIPageViewControllerDataSourceプロトコルを使うと、実際の中身のページを良い感じで切り替えてくれる。

- 必要に応じてUIPageViewControllerDelegateプロトコルを実装する。
- 実際のページ用のUIViewControllerのサブクラスを実装する。
- UIPageViewControllerDataSourceプロトコルを実装する。(親クラスはNSObjectとかでよい)
  - データを保持してページ指定にしたがって取り出せるような感じの実装しておく。
  - ページ遷移が発生したら実際のページインスタンスを生成しデータを紐付けるような処理をさせる。
    - pageViewController:pageViewController viewControllerBeforeViewController:viewController
    - pageViewController:pageViewController viewControllerAfterViewController:viewController
- UIPageViewController::dataSourceにUIPageViewControllerDataSourceインスタンスを設定する
- 初期化時
  - UIPageViewControllerのインスタンスをつくる。
  - UIPageViewControllerのインスタンスに最初のページをセットする。
  - UIPageViewControllerインスタンスを親UIViewControllerに関連づける。

参考)http://d.hatena.ne.jp/hyoromo/20130406/1365274911

### 構成

親のUIViewControllerがUIPageViewControllerとUIPageViewControllerDataSource,、UIPageControlを持っていて遷移の概要を管理し、データそのものと中身のページは基本的にUIPageViewControllerDataSourceが与えるような感じみたいです。

## UIPageViewControllerの実装

初期化時にいくつか設定する。

- transitionStyle
  - ページ送りの表現の種類。カールするかスライドか選べる。
  - UIPageViewControllerTransitionStyle
- navigationOperation
  - ページ送りする方向の設定。縦か横か選べる。
  - UIPageViewControllerNavigationOrientation

本のレイアウト情報であるspineLocationとか余白の設定をしたい場合はNSDictionaryに入れてoptionsで渡すと設定できる。
これらは基本的にすべてread-only。

参考) http://d.hatena.ne.jp/hyoromo/20130422/1366658331

もしStoryBoardで上記のプロパティを設定する場合、クラスをUIPageViewControllerにセットしておけばAttributes Inspectorのところにそれ用のチェックボックスが出てくるので適宜設定しておく。

構成としてはUIPageViewControllerを継承してStoryboardで管理しようと思ったけど、
UIPageControlを直接は保持できないみたいだし、他のUIViewControllerに紐付けるわけでもなかったので、コードでインスタンス化する形にしました。

## UIPageViewControllerDataSourceプロトコルの実装

プロトコルさえ実装されていればNSObjectでもなんでもいい。
ページが遷移した時に次のUIViewControllerを返すメソッドを実装する感じです。

前後にページ遷移が発生したことが分かるだけでindex的なものは持っていないため、NSArrayとかで管理したいのであれば適宜実装する。
発生した方向に次のUIViewControllerがなければnilを返す。

## UIPageViewControllerDelegateの実装

画面遷移の前後のタイミングやデバイスの向きが変わったときに呼ばれるみたいです。

## 公式ドキュメント

- [UIPageViewController](https://developer.apple.com/library/ios/documentation/uikit/reference/UIPageViewControllerClassReferenceClassRef/UIPageViewControllerClassReference.html)
- [UIPageViewControllerDataSource](https://developer.apple.com/library/ios/documentation/uikit/reference/UIPageViewControllerDataSourceProtocolRef/UIPageViewControllerDataSource.html)
- [UIPageViewControllerDelegate](https://developer.apple.com/library/ios/documentation/uikit/reference/UIPageViewControllerDelegateProtocolRef/UIPageViewControllerDelegate.html)


これは[2013-09-24の記事からの転載](http://yd-niku.hatenablog.com/entry/2013/09/24/220226)です
Booleanを使うときありがちなバグを避ける方法

Booleanを使って、一度ダイアログ表示していたら次は出さない的なフラグ管理や、未読既読とかのトグル的な処理をすることがよくありますが、かつてその手の実装でよくハマったことと対応策としてミスりにくい考え方をまとめてみました。

具体的に起こるミスとしては下記のようなものがあります。

- 数値の0と1で表されていbooleanとしての用途かどうか不明瞭
- 文字列で"false"と表現されている
- 値が空の場合も考慮しなければいけない

こういう状況でおこりうる問題としては、

- 他人に引き継いだときに空気が読めずに困る
- APIの仕様がなにかと信用出来ない
- 単純にプログラムに慣れていないのでミスる

というものの他に、

- 実装に自信がもてずに時間がかかる
- 昨日の自分を信用出来ない

という感じでストレスになったりします。

実際にはBooleanかどうかでは大したことはないのですが、いろんなことがチリも積もってバグとなるわけなのでクリアにしておきたいところです。

この手の実装をするときには、事前にきめた正しいもの以外はすべてfalseと判断する「ホワイトリスト」的な考え方で実装するといいです。

```javascript
var boolA = config.isRead === true;
var boolB = $("script#config").text() === "true";//仮にHTMLとかテキスト情報で記載しなければいけないとき
```

こういうふうに常にBooleanのtrue以外はダメという感じで実装するように心がけておけば、初心者でも混乱しにくいし、疲れてても判断しやすいのでオススメです。

JSONとかであれば大体Booleanをそのまま使える場合がありますが、特に既存のWebAPIから取ってきた値の仕様が0/1とかだったり、Cookieとか設定ファイルとか文字列で保存しないといけないときは文字列できたりするので、特定の表記以外をfalseにすれば安全だと思います。

下記のようなしつこくチェックしたお陰でミスする可能性があがることがあるので、シンプルで迷いのない表現をこころがけると幸せになれる気がします。

```javascript
// Anti pattern
if(config.isRead !== undefined && config.isRead !== null &&
config.isRead !== "") // 毎回やってらんない
```

最悪、値が0/1でかつ型が数値か文字列かが分からないようなときは、下記のようにいったんtoString()したものを文字列と比較すると良いと思いますが、そんなことしないでも良い設計にするべきだと思いますので参考程度に。

```javascript
var boolC = config.isRead.toString() === "1";
```
SubversionでAddを取り消したいときはRevertする


プロジェクトの開発環境をSubversionやGitを使って管理していて、エディタが自動的に追加(Add)されちゃったやつを解除したいときはRevertするとAddを取り消せるというのを今年にはいって気づいたやつです。ずっと知らなくて、どっかに移してDeleteしてから再度戻したりしてたけど1発でできました。
「おっぱい曲面」を3Dグラフで描く(1)

[『プログラミング言語 Julia でグラフを描画する』](http://qiita.com/akmiyoshi/items/a2aca5369c8e3c11ae59) でとりあえずサンプルを動かすことに成功したが、自分の(Julia言語の)プログラムで作ったデータを使ってグラフを描画するにはどうしたら良いかを調べることにした。

今回は[『「おっぱい曲面」で学ぶ「Julia言語の実用テクニック」』](http://www.hirax.net/diaryweb/2012/03/01.html)を参考にして、3D空間に「おっぱい曲面」を描画するサンプルを作ってみた。
例によって、Julia で求めた計算結果を PyQtGraph でグラフ表示するようになっている。(環境を作って是非動かしてみてください)

* Oppai.jl (Julia のソースコード)は、Python のソース内の graph_run() という関数に配列を渡す。グラフの描画は Python にお任せ。。
* Oppai.py (Python のソースコード)では、Julia から渡された配列を基に3Dグラフを描画する(51個の折れ線グラフ)。
* PyCall を用いて Python のコードを呼び出す際には、C:\julia-0.2.1-win32\bin がロードパスに含まれるので、Oppai.jl および Oppai.py の両方共を C:\julia-0.2.1-win32\bin 配下に保存しておくこと。
* ソースコードを保存する際には文字エンコーディングは utf-8 にしておくこと。
* サンプルを起動するには、Oppai.jl (Julia のソースコード) をエクスプローラーからダブルクリックする。

> 注記：環境構築については、[『プログラミング言語 Julia でグラフを描画する』](http://qiita.com/akmiyoshi/items/a2aca5369c8e3c11ae59) を参照してください。

![2014-0708-1055.png](https://qiita-image-store.s3.amazonaws.com/0/32879/671f2f84-4c70-70bd-ab10-740eda2229c8.png)
↑マウスでドラッグしたりカーソルキーを押すと3Dグラフが回転します。マウスホイールを回すと拡大・縮小ができます。

```jl:Oppai.jl(C:\julia-0.2.1-win32\binに保存すること)
# -*- coding: utf-8 -*-

function bust(x,y)
1/8* (6*exp(-((2/3*abs(x) - 1)^2 + (2/3 *y)^2) - 1/3*(2/3*y + 1/2)^3)+ 2/3 *exp(-2.818^11*((abs(2/3*x) - 1)^2+ (2/3 *y)^2)^2) + 2/3*y - (2/3*x)^4)
end

nx = 100
ny = 51
x = linspace(-3, 3, nx)
y = linspace(-3, 3, ny)
z = zeros(Float64, length(y), length(x))

for iy = 1:length(y)
    for ix = 1:length(x)
        z[iy, ix] = bust(x[ix], y[iy])
    end
end

using PyCall
@pyimport Oppai
Oppai.graph_run(x, y, z, 10)
```

```python:Oppai.py(C:\julia-0.2.1-win32\binに保存すること)
# -*- coding: utf-8 -*-

from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph.opengl as gl
import pyqtgraph as pg
import numpy as np

def graph_run(plot_data_x, plot_data_y, plot_data_z, distance):

    app = QtGui.QApplication([])

    w = gl.GLViewWidget()
    w.resize(600,400)
    w.opts['distance'] = distance
    w.show()
    w.setWindowTitle(u'Julia+PyQtGraph サンプル')

    x = plot_data_x
    y = plot_data_y
    for i in range(len(y)):
        yi = [y[i]]*len(x)
        z = plot_data_z[i,:]
        pts = np.vstack([x,yi,z]).transpose()
        plt = gl.GLLinePlotItem(pos=pts, color=pg.glColor((i,len(y)*1.3)), width=(i+1)/10., antialias=True)
        w.addItem(plt)

    app.exec_()
```
垂直センタリングするSCSS Mixin

mixin便利

``` scss
@mixin vertical-align-ghost() {
  &:before {
    content: '';
    display: inline-block;
    vertical-align: middle;
    height: 100%;
    margin-right: -0.25em;
  }
}

@mixin vertical-align-block() {
  display: inline-block;
  vertical-align: middle;
}
```

``` scss
.container {
  @include vertical-align-ghost;

  text-align: center;

  .block {
    @include vertical-align-block;
  }
}
```

最近のブラウザだと、もっと簡単な方法としてこういうのもある。

``` scss
@mixin vertical-align {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}
```

``` scss
.container {
  .block {
    @include vertical-align;
  }
}
```
ggplot2でx軸とy軸のタイトルを消す

## はじめに
メモです。

## やってみた
`theme(axis.title.x = element_blank(), axis.title.y = element_blank())`の部分です。

```r:
g <- ggplot(dat, aes(x=ind, y=values, fill=category)) +
     geom_bar(stat="identity") +
     theme(axis.title.x = element_blank(), axis.title.y = element_blank())
print(g)
```
ggplot2でx軸のラベルを斜めにする

## はじめに
メモです。

## やってみた
`theme(axis.text.x = element_text(angle = 45, hjust = 1)) `の部分です。

```r:
g <- ggplot(dat, aes(x=ind, y=values, fill=category)) +
     geom_bar(stat="identity") +
     theme(axis.text.x = element_text(angle = 45, hjust = 1))  
print(g)
```
MacでWi-Fiのパスワードを変更する方法メモ


## 方法その1
キーチェーンアクセス 
-> 分類「パスワード」を選択 
-> パスワードを変更したいネットワーク名を選択
-> "ネットワーク名"を削除
-> AirMacからネットワーク名を選択して再接続

##方法その2
AirMac
-> "ネットワーク環境設定"を開く..
-> 「ネットワーク名」プルダウンメニュー
-> 他のネットワークに接続
-> パスワードを変更したいネットワーク名・セキュリティ・パスワードを入力
-> 接続
ggplot2でMA plot

## はじめに
MA plotは、x軸のAが平均、y軸のMが差。
[MA plot - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/MA_plot)

## やってみた
EdgeRの出力結果の表を想定しています（遺伝子ごとに、a.value, m.value, estimatedDEGが記録されている）。
estimatedDEGは、1ならば発現変動遺伝子(DEG)を表します。下の例では、DEGの点だけを赤くします。

```r:MAplot
g <- ggplot(res, aes(x=a.value, y=m.value, colour=factor(estimatedDEG))) +
geom_point(size=1) + 
scale_colour_manual(values = c("black", "red")) + 
scale_fill_manual(values = c("black", "red"), breaks=c("0", "1"), labels=c("non DEG", "DEG")) + 
theme(legend.title=element_blank()) + 
ggtitle(paste0(conditions[1], " vs ", conditions[coef]))
print(g)
```

さらに、DEGが何個あったかをプロットに追加します。

```r:MAplot
g <- g + annotate("text", x = rep(max(res$a.value)*0.8, 2), y = c(0.8,0.9) * min(res$m.value), label = c(label1, label2))
print(g)
```
SwiftでシンプルにPOST/GET/PUT/DELETEするライブラリ

githubでもswiftのライブラリ系が活発になってますね。
本日発見したライブラリはこちら

##hallas/agent
https://github.com/hallas/agent
ライセンスはMIT

#使い方
こちらもまだPodに対応していないようなのでダウンロードして、Agent.swiftをプロジェクトに投げ込んで利用開始。

#記述例


##POST(url: String)

~~~swift
let req = Agent.post("http://example.com")
req.send([ "Key": "Value" ])
req.end({ (response: NSHTTPURLResponse!, data: Agent.Data!, error: NSError!) -> Void in
  // react to the result of your request
})
~~~

##GET(url: String)

~~~swift
let req = Agent.get("http://example.com")
req.end({ (response: NSHTTPURLResponse!, data: Agent.Data!, error: NSError!) -> Void in
  // react to the result of your request
})
~~~
GETは`req.send([ "Key": "Value" ])`には対応していない模様

##PUT(url: String)

~~~swift
let req = Agent.put("http://example.com")
req.send([ "Key": "Value" ])
req.end({ (response: NSHTTPURLResponse!, data: Agent.Data!, error: NSError!) -> Void in
  // react to the result of your request
})
~~~

##DELETE(url: String)

~~~swift
let req = Agent.delete("http://example.com")
req.end({ (response: NSHTTPURLResponse!, data: Agent.Data!, error: NSError!) -> Void in
  // react to the result of your request
})
~~~
enthumble（キーカスタマイズ例）


今のところデフォルトで使ってます。
参考にならなくてすいません！

左利きなので丁度こんなの探してました！

 WASD
A={Left}
S={down}
D={right}
W={up}

あとバックスペースの位置を自分なりに丁度いい位置を探してみようと思います。
SLIC Superpixel segmentation in scikit image

To calculate SLIC superpixels in python, we have two options:

+ Wrapper of the original code https://github.com/amueller/slic-python
+ ```skimage.segmentation.slic``` http://scikit-image.org/docs/dev/api/skimage.segmentation.html#skimage.segmentation.slic

I found that these provided completely different segmentation unless ```enforce_connectivity=True``` in ```skimage.segmentation.slic```. Here I show a brief example describing how different they are, which we could not see at http://scikit-image.org/docs/dev/auto_examples/plot_segmentations.html

``` example.py

from skimage.segmentation import slic, mark_boundaries
from skimage.data import lena
import slic as slic_wrap # code available at https://github.com/amueller/slic-python
import matplotlib.pyplot as plt

img = lena()

plt.subplot(1,3,1)
plt.imshow(mark_boundaries(img, slic_wrap.slic_n(img, 40, 10)))
title('Original version')
plt.subplot(1,3,2)
plt.imshow(mark_boundaries(img, slic(img, 40, 10, sigma=1, enforce_connectivity=False)))
title('skimage version\n enforce_connectivity=False', size=9)
plt.subplot(1,3,3)
plt.imshow(mark_boundaries(img, slic(img, 40, 10, sigma=1, enforce_connectivity=True)))
title('skimage version\n  enforce_connectivity=True', size=9)

```

Here I tried to tune the parameter ```sigma``` in skimage version to obtain a similar output to the original version. Obviously, ```enforce_connectivity``` option is essential to avoid color-sensitive segments.

![Screen Shot 2014-07-08 at 9.56.51.png](https://qiita-image-store.s3.amazonaws.com/0/69/18c6b900-776e-92b8-6b3d-501c7e416cf8.png)
Quickly finding linked node modules


Sometimes, it's easy to forget which resources you've actually added to your project using `npm link`, and it can be quite a pain to find out which ones you've pulled in that way.

You could use `npm list` and look for dependencies with `->`, but that takes quite a while to do manually, is hard to see, and quite frankly, waiting for npm to do recursive searches is terribly slow.

# A ridiculously simple solution

`ls -lh node_modules/ | grep ^l`

`ls` - list your files
`-lh` - list in human readable format
`node_modules` - your node modules folder
`|` - pass all the output of the previous command to the next
`grep` - pretty useful search tool, not as nice as `ack`
`^l` - just match "l" at the beginning of a line


...and there you have it. Nice and easy, and very fast.


    jwoo at justins-mbp in ~/github/input-type-warning on api-stub-static-test*
    
    $ ls -lh node_modules/ | grep ^l

    lrwxr-xr-x   1 jwoo  staff    40B Jul  2 19:32 ember-cli -> ../../../.npm/lib/node_modules/ember-cli
    lrwxr-xr-x   1 jwoo  staff    56B Jul  2 19:32 ember-cli-api-stub-static -> ../../../.npm/lib/node_modules/ember-cli-api-stub-static
    lrwxr-xr-x   1 jwoo  staff    59B Jul  2 19:45 ember-cli-rest-api-blueprint -> ../../../.npm/lib/node_modules/ember-cli-rest-api-blueprint
CentOS7で使われているsystemctlについて少しまとめた

[Linux女子部 systemd徹底入門](http://www.slideshare.net/enakai/linux-27872553)が詳しい。

## systemdに移行していくディストリビューション

* Debianの次のリリースJesseでsystemdに移行。
  * [【LinuxTutorial】Debian が systemd を採用、Ubuntu 12.04.4 LTS リリース、Linux カーネル 3.13.2 および 3.14 rc2 のリリース - インターネットコム](http://internetcom.jp/webtech/20140213/1.html)
* Ubuntu16.04あたりでsystemdに移行かな
  * [upstart - systemd in ubuntu 14.04 - Ask Ubuntu](http://askubuntu.com/questions/513024/systemd-in-ubuntu-14-04)

# [RHEL 7 に採用される systemctl コマンド - /dev/null blog](http://devnull.synergy-marketing.co.jp/2013/07/rhel7-systemctl/)より

postfixなどの個別サービス設定は以下のファイルに書いてある。

```bash:
/etc/systemd/system/multi-user.target.wants/postfix.service
```

開いてみると、monitのような書き方。

一覧は以下にある。

```bash:サービス一覧
ls /usr/lib/systemd/system/
```

```bash:
/etc/systemd/system/*.wants
```

ここにリンク貼られている。

よく使いそうなディレクトリは以下

```bash:
/etc/systemd/system/multi-user.target.wants/*.wants
```

例えば、sshd, crond, postfixは以下で登録されている。

* /etc/systemd/system/multi-user.target.wants/sshd.service
* /etc/systemd/system/multi-user.target.wants/crond.service
* /etc/systemd/system/multi-user.target.wants/postfix.service


# [Systemd入門(2) - Serviceの操作方法 - めもめも](http://d.hatena.ne.jp/enakai00/20130915/1379212787)より

```bash:稼働中のサービス
systemctl list-units --type=service
```

```bash:定義されているサービス一覧
systemctl list-unit-files --type=service
```

```bash:サービス状態
systemctl status sshd
systemctl is-enabled sshd
```

* is-active   -- Check whether units are active
* is-enabled  -- Check whether unit files are enabled
* is-failed   -- Check whether units are failed


```bash:ログを省略せずに表示
systemctl status sshd -l
```

```bash:従来のchkconfigリスト
chkconfig --list
```

# ログの見方

```bash:systemd-journalグループで実行
systemctl status postfix
journalctl -u postfix
journalctl -u postfix -f
journalctl --since=today -u postfix
journalctl --since=yesterday -u postfix
journalctl --no-page -l --since="2014-09-22 12:00:00" --until="2014-09-29" -u postfix
journalctl -p4 -l --since="2014-09-22 12:00:00" --until="2014-09-29" -u postfix
```

* [FC20は、rsyslogじゃなくjournal - 投稿練習用 :: 簡単ＢＬＯＧ](http://www.kklib.com/samples/blog/view.php/1398164674.htm)

```bash:
journalctl /usr/bin/procmail
journalctl /usr/bin/dovecot
```

# ログサイズの制限

* [systemd(journald)のログ容量を制限する - Qiita](http://qiita.com/sharow/items/c56e81e4c2a658c3c921)
* [systemd (日本語) - ArchWiki](https://wiki.archlinux.org/index.php/Systemd_(%E6%97%A5%E6%9C%AC%E8%AA%9E))

```bash:journalサイズ確認
$ sudo du -sh /var/log/journal
3.1G	/var/log/journal
```

```diff:/etc/systemd/journald.conf
- #SystemMaxUse=
+ SystemMaxUse=50M
```

```bash:journald再起動
systemctl restart systemd-journald
```

```bash:journalサイズ確認
$ journalctl --disk-usage
Journals take up 408.1M on disk.
```

## リモートのsystemctlを実行

```bash:
systemctl status postfix -H server1
```

* ssh経由でsystemctlを実行。~/.ssh/config が使える。


## その他参考リンク

* [systemdを本番運用してわかったこと | mixi Engineers' Blog](http://alpha.mixi.co.jp/2013/12063/)
* [systemd (日本語) - ArchWiki](https://wiki.archlinux.org/index.php/Systemd_(%E6%97%A5%E6%9C%AC%E8%AA%9E))
CentOS7でepel,remi,rpmforgeリポジトリを有効にする

# epel,remi

```bash:
yum install -y epel-release
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

# rpmforge

```bash:
http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
```

```bash:/etc/yum.repos.d/rpmforge.repo
[rpmforge]
name = RHEL $releasever - RPMforge.net - dag
baseurl = http://ftp.kddilabs.jp/Linux/RPMS/repoforge/redhat/el7/en/$basearch/rpmforge
enabled = 1
protect = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag
gpgcheck = 1
```

```bash:
curl -I http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-7
```

## CentOS4にrpmforgeリポジトリを追加する場合

```bash:
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el4.rf.i386.rpm
```
CentOS7でファイアウォールとSELinux無効化

firewalldについては[こちら](https://www.google.co.jp/search?hl=ja&q=firewalld&lr=lang_ja&gws_rd=ssl&as_qdr=y1)

```bash:
iptables -F
systemctl disable firewalld.service
```

```diff:/etc/sysconfig/selinux
-SELINUX=enforcing
+SELINUX=disabled
```

```bash:
reboot
```
まとまってなかったので備忘録的に纏めておく sizeWithFont -> sizeWithAttributes

Qiitaとかでまとまってるかなーって思ってたけど見当たらなかったので。まとめてみましたw

```objc:test.m
 CGSize captionSize = [caption sizeWithFont:[UIFont boldSystemFontOfSize:14] constrainedToSize:CGSizeMake(160, 200) lineBreakMode:UILineBreakModeWordWrap];
```
というのは、fontのところと、lineBrakeModeとかのparagraphに別けられるので

```objc:test.m
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
	NSDictionary *attributeDic = @{NSFontAttributeName:[UIFont boldSystemFontOfSize:14],
NSParagraphStyleAttributeName:paragraphStyle};
        
        CGSize captionSize = [caption boundingRectWithSize:CGSizeMake(160, 200)
                                  options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine
                               attributes:attributeDic
                                  context:nil].size;
```
とかに出来ますね。 基本的に fontとparagraphに別れて「細かく」調整出来る様になった。ということですね。便利便利。

ついでに似たようなものとしては
drawInRect の withFont ってのもありますね

```objc:test.m
[caption drawInRect:f withFont:[UIFont boldSystemFontOfSize:14] lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter];
```

これもattributesに変更なので

```objc:test.m
NSMutableParagraphStyle *textStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
    textStyle.lineBreakMode = NSLineBreakByWordWrapping;
    textStyle.alignment = NSTextAlignmentCenter;
    UIFont *textFont = [UIFont boldSystemFontOfSize:14];
    [caption drawInRect:f
         withAttributes:@{NSFontAttributeName:textFont,
                          NSParagraphStyleAttributeName:textStyle}];
```

こんな感じに。

まー、使える人は「もう知ってるよ m9」ってところなんでしょうけどたまに忘れてググって「あれ? なんだっけ?」ってなってしまう健忘症なおいら用の
備忘録
でありました。

にんともかんとも にんにん(おい、おっさんw
Swiftの@lazyの使い道


遅延初期化来たか。ということで、実験と応用を考えてみます。

## lazyなし

```swift
class Sub {
    init() {
        println("initialized!!")
    }
}

class foo {
    var lazySub = {
        Sub()
    }()
}
```

コンソールには'initialized!!が２回出力される'

## lazyあり

```swift
class Sub {
    init() {
        println("initialized!!")
    }
}

class foo {
    @lazy var lazySub = {
        Sub()
    }()
}
```
コンソールには'initialized!!'が一回だけ出力される

## 何をやっているか

```swift
class foo {
    @lazy var lazySub = create()

	func create() {
		return Sub()
	}
}
```

これを無名関数化 + 実行しているだけ。

## どこで使えるか

```Objective-C
@property lazySub

- (Sub *)lazySub {
	if (_lazySub == nil) {
		_lazySub = [Sub new];
	}

	return _lazySub;
}
```

こういうよく見るやつに使えるかなーと。

※このやり方だとクロージャ内でselfを使おうとするとエラーになる。。。原因調査中です。

## 追記

ちなみにこんなのをやってた記事を見たんですけど、普通に何回でも実行されるのになんで@lazyが書けるのか不明...

```swift
class foo {
    @lazy var lazySub: () -> Sub = {
        return Sub()
    }
}

// 変数にクロージャをバインドしているが、当然呼べば呼ぶだけ実行される。
```
SwiftのArrayの書き方がちょっと変わった


**注:挙動も大きく変わってたので、別に記事を書きました**
[SwiftのArrayがヤバくなくなった](http://qiita.com/aki/items/6c68a69de0c05cb174ea)

先ほどXcode6beta3を入れてswiftのプロジェクトを開いたところ、Warningが増えていた。

**Array types are now written with the brackets around the element type**

これまでの配列の型の指定の書き方が、非推奨になって新しい書き方に変わるらしい。
エラーではないので、どちらでも動作上は問題ありません。

```swift:Arrayの型指定
//Xcode6beta2以前
let arrayOld : Int[] = [10, 20, 30]

//Xcode6beta3以降
let arrayNew : [Int] = [10, 20, 30]
```

こんな感じで、型の後ろに[]ではなくて、[型]と囲むようになりました。
新しい書き方のほうが直感的でいいですね。
Google検索結果ページに”英語限定","1年限定"の切り替えリンクを付けるChrome拡張

調べものをしてると、Googleの検索結果を、"英語限定","1年限定"にしたいことがよくあるのですが、マウスで何ステップか必要になるので、なるべくキーボードだけで操作を済ませようとしている自分にはちょっと面倒でした。

そこで、"英語限定","1年限定"条件の結果に簡単に切り替えられるようなextensionを探したのですが、ツールバーボタンだったり、"1年限定"のみだったりと、微妙に機能が足りなかったので、自分で作ってみました。

# switchEY

switchEY - Chrome Web Store
http://bit.ly/_switchEY

検索ツールバーの右側に表示される "E(英)", "Y(年)"をクリックすると、赤字になり条件onの状態になります。再クリックすると、黒字で条件offです。そのまま検索フォームに入力すると、検索条件をひきついだまま検索します。

![switchEYdisplay_jp.png](https://qiita-image-store.s3.amazonaws.com/0/37262/0708d683-f85a-9d5a-a5ad-3e593705122a.png)

とくにエンジニアの人は、調べものが捗るようになるのでオススメです。
gitweb

## 準備

* webrickの利用にはrubyが必要です。

```bash:
apt-get install -y git ruby
```

## 起動方法

```bash:
git instaweb --httpd=webrick
```

```bash:ブラウザ指定してみる
git instaweb --httpd=webrick -b w3m
```

```bash:バックで起動
git instaweb --httpd=webrick --start
```

http://127.0.0.1:1234/ にアクセスし画面が見れることを確認。

## ヘルプ

apache組み込み方法とかあって一読すべき

```bash:
git instaweb --help
```
外部yumリポジトリの利用

# 外部yumリポジトリの利用
CentOSであらかじめ登録されているyumリポジトリ(base,update)は、

- 提供パッケージのバージョンが古い
- 欲しいパッケージが未登録

であることがが多い.
おそらく安定性を重視しているからでしょう.

でもとにかく最新のパッケージを使いたい場合もある.

そのような場合のために、外部yumリポジトリを予め追加しておくとよい.
個人的には以下リポジトリ追加している.

 - epel
 - remi
 - rpmforge

但し、rpmforgeはパッケージ間の依存関係でバージョン不整合がちょいちょい発生するので、通常は無効にして、rpmforgeにだけ登録されたパッケージのインストールにだけ利用している.


## epel,remi,rpmforgeリポジトリの導入

CentOS6.xの場合の以下の実行でepel,remi,rpmforgeリポジトリを導入できる.

### 64bitsの場合
~~~bash
$> rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$> rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$> rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
~~~

### 32bits場合
~~~bash
$> rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
$> rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$> rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm
~~~

### updateのデフォルト設定
各リポジトリに対してyum update時にデフォルト有効にするか否かの指定が可能である.

設定を行う前にyum-utilsのインストールが必要.

~~~bash
$> yum install yum-utils
~~~

epel,remiをデフォルト有効,rpmforgeを無効とする例.

~~~bash
$> yum-config-manager --enable epel
$> yum-config-manager --enable remi
$> yum-config-manager --disable rpmforge
~~~

--enableを指定したリポジトリはyum update コマンドでデフォルト有効となる.
--disableを指定したリポジトリはyum update コマンドでデフォルト無効となるが、--enablerepo=rpmforgeのように--enablerepoオプションをつければ有効にできる.

yum-config-managerを利用しなくても、/etc/yum.repos.d/*.repoのenabledを0 or 1に直接書き換えで設定も可能.
CentOS7でkickstartしてみた

# DVDから普通にインストール

/root/anaconda-ks.cfgをwebサーバにコピーしておく。

# anaconda-ks.cfgを利用

## BIOSの場合

1. DVD挿入
1. Esc押す
1. `linux text ks=http://192.168.0.103:8887/anaconda-ks.cfg`

## EFIの場合

1. DVD挿入
1. e押す
1. 最後に `text ks=http://192.168.0.103:8887/anaconda-ks.cfg`をつける
1. ctrl-x を押しBOOT (ctrl-xが効かない場合はF10)

もしくは

1. `text ks=hd:sdc1:/ks/centos7.cfg`

![スクリーンショット 2014-07-08 9.03.06.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c445ff26-12a6-a23a-679b-7c4bac497b6a.png)

# anaconda-ks.cfgサンプル

## 例1: BIOSの場合

```bash:
#version=RHEL7
# System authorization information
auth --enableshadow --passalgo=sha512

# Use CDROM installation media
cdrom
# Use text mode install
text
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=jp106 --xlayouts='jp106'
# System language
lang en_US.UTF-8
# custom
firewall --disabled
selinux --disabled

# Network information
network  --bootproto=dhcp --device=enp0s3 --onboot=off --ipv6=auto
network  --hostname=localhost.localdomain
#Root password
rootpw --lock
# Do not configure the X Window System
skipx
# System timezone
timezone Asia/Tokyo --isUtc
#user --groups=wheel --name=vagrant --password= --iscrypted --gecos="vagrant"
# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
#autopart --type=plain #xfs
#autopart --type=ext4
autopart --type=btrfs
# Partition clearing information
clearpart --all --initlabel --drives=sda

%packages
@core
telnet
#logwatch
#vim-enhanced
#git
#gitweb ruby
%end

%pre
%end

%post
%end
```

## 例2: EFIの場合

```bash:
#version=RHEL7
# System authorization information
auth --enableshadow --passalgo=sha512

# Use CDROM installation media
cdrom
# Use text mode install
text
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=jp106 --xlayouts='jp106'
# System language
lang en_US.UTF-8
firewall --disabled
selinux --disabled

# Network information
network  --bootproto=static --device=enp3s0 --gateway=192.168.0.1 --ip=192.168.0.2 --nameserver=8.8.8.8,8.8.4.4 --netmask=255.255.255.0 --ipv6=auto --activate
network  --hostname=centos7.local
#Root password
rootpw --lock
# Do not configure the X Window System
skipx
# System timezone
timezone Asia/Tokyo --isUtc
#user --groups=wheel --name=vagrant --password= --iscrypted
# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
autopart --type=btrfs
# Partition clearing information
clearpart --all --initlabel --drives=sda

%packages
@core
%end
```

# パスワード生成

```bash:
openssl passwd -1
```
SwiftでCALayerを使う


Swift(OS X App)でCALayerを使いたくなったのでメモ。


### 事前準備
1. QuartzCoreをインポートする
1. ViewをLayer Backed Viewにする

```swift
import QuartzCore


class MyView: NSView {
    // ...

    override func awakeFromNib() {
        self.wantsLayer = true  // Layer Backed Viewにする
        self.layer.delegate = self
    }
}
```


### レイアウト設定
レイアウトの設定はlayout()で行うと良いようです。
これはレイアウトを設定する必要がある時に呼ばれます。

```swift
override func layout() {
    // 諸々レイアウト
}
```
サンプルでは全部入れていますが、
変更する予定の無いプロパティは別にすると無駄が無くて良いかもしれません。

### レイヤーの追加
CALayerのfunc addSublayer(layer: CALayer!)で追加します。
NSViewのメンバ layer をルートとして、階層を作って行きます。

```swift
var bgLayer = CALayer()
self.layer.addSublayer(bgLayer)
```

### とりあえず何か表示してみる例
ドロップシャドウ付きのレイヤーを表示してみます。
なお、CALayerではデフォルトだと座標系が左下原点で、
右/上がそれぞれX/Yの+方向となります。

![CALayerTest1.png](https://qiita-image-store.s3.amazonaws.com/0/45742/654124f2-2a04-2c4d-60f9-90063010fa85.png "CALayerTest1.png")

```swift
import QuartzCore

class MyView: NSView {
    var bgLayer     = CALayer()

    init(frame: NSRect) {
        super.init(frame: frame)
        // Initialization code here.
    }
    
    init(coder: NSCoder) {
        super.init(coder: coder)
    }
    override func awakeFromNib() {
        self.wantsLayer = true  // Layer Backed Viewにする
        self.layer.delegate = self
        self.layer.addSublayer(bgLayer)
    }

    override func layout() {
    	// 諸々レイアウト
        super.layout()

        bgLayer.frame     = CGRectMake(100, 10, 100, 60)
        bgLayer.backgroundColor = NSColor.redColor().CGColor
        bgLayer.shadowOffset = CGSizeMake(2, 2)
        bgLayer.shadowRadius = 5.0
        bgLayer.shadowColor = NSColor.blackColor().CGColor
        bgLayer.shadowOpacity = 0.9
    }

    override func drawLayer(layer: CALayer!, inContext ctx: CGContext!) {
        super.drawLayer(layer, inContext:ctx)
    }

    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)

        // Drawing code here.
    }
}
```

### まとめ
CALayerを使う事でNSViewでは難しいデザインを実現できるようになります。

たとえばmail.appの本文みたいな見た目とか。
というか、こういうのCALayerを使わないで作れたりするんでしょうか・・・。
![mail_like.png](https://qiita-image-store.s3.amazonaws.com/0/45742/ddf7f481-b534-dafb-d0ff-8369daffab83.png "mail_like.png")
アラビア数字文字列を "そのまま読める" 日本語文字列に変換

@miyabi787 さんの **[「PHPで万とか億とかつける感じの」](http://qiita.com/miyabi787/items/9331975b731afbc3b601)** にインスパイアされてやってみました。

# **関数定義**

**※ 「大数」と無量大数より大きな数を扱う「仏典の数詞」をくっつける解釈は誤りなので修正しました。**

これ間違ってます↓
**[Yahoo!知恵袋 - 「無量大数」の上ってありますか？？](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1217326022)**

```php:通常・現代仮名遣い
function japanese_number_readable_format($amount) {
    static $segment_names = [
          '', '万', '億', '兆', '京', '垓',
        "\xf0\xa5\x9d\xb1", '穰', '溝', '澗', '正', '載',
        '極', '恒河沙', '阿僧祇', '那由他', '不可思議',
    ];
    static $level_names = ['', '十', '百', '千'];
    static $number_names = ['一', '二', '三', '四', '五', '六', '七', '八', '九'];
    if (!(is_int($amount) && $amount >= 0) && !ctype_digit($amount)) {
        throw new InvalidArgumentException('正整数か正整数形式文字列で渡してください');
    }
    $results = [];
    $segments = array_filter(str_split(strrev($amount), 4), 'intval');
    foreach ($segments as $i => $segment) {
        $result = '';
        $numbers = array_filter(str_split($segment));
        foreach ($numbers as $j => $number) {
            $result = 
                ($j !== 0 && $number === '1'
                    ? ''
                    : $number_names[$number - 1])
                . $level_names[$j] . $result
            ;
        }
        if (!isset($segment_names[$i])) {
            return '無量大数';
        }
        $result .= $segment_names[$i];
        $results[] = $result;
    }
    return $results ? implode(array_reverse($results)) : '零';
}
```

```php:大字・歴史的假名遣ひ
function japanese_historical_number_readable_format($amount) {
    static $segment_names = [
          '', '萬', '億', '兆', '京', '垓',
        "\xe7\xa7\xad", '穰', '溝', '澗', '正', '載',
        '極', '恆河沙', '阿僧祇', '那由他', '不可思議',
    ];
    static $level_names = ['', '拾', '佰', '仟'];
    static $number_names = ['壹', '貮', '參', '肆', '伍', '陸', '柒', '捌', '玖'];
    if (!(is_int($amount) && $amount >= 0) && !ctype_digit($amount)) {
        throw new InvalidArgumentException('正整數か正整數形式文字列で渡し給へ');
    }
    $results = [];
    $segments = array_filter(str_split(strrev($amount), 4), 'intval');
    foreach ($segments as $i => $segment) {
        $result = '';
        $numbers = array_filter(str_split($segment));
        foreach ($numbers as $j => $number) {
            $result = 
                ($j !== 0 && $number === '1'
                    ? ''
                    : $number_names[$number - 1])
                . $level_names[$j] . $result
            ;
        }
        if (!isset($segment_names[$i])) {
            return '無量大數';
        }
        $result .= $segment_names[$i];
        $results[] = $result;
    }
    return $results ? implode(array_reverse($results)) : '零';
}
```
# **使用例**

```php
printf(
    '今日のテスト%s点だった、やばい（確信）' . PHP_EOL,
    japanese_number_readable_format('8108939311919889464364364114514')
);
printf(
    '本日の試驗%s點にていみじ ― 確信' . PHP_EOL,
    japanese_historical_number_readable_format('8108939311919889464364364114514')
);
```

↓

今日のテスト八百十穰八千九百三十九𥝱三千百十九垓千九百八十八京九千四百六十四兆三千六百四十三億六千四百十一万四千五百十四点だった、やばい（確信）
本日の試驗捌佰拾穰捌仟玖佰參拾玖秭參仟佰拾玖垓仟玖佰捌拾捌京玖仟肆佰陸拾肆兆參仟陸佰肆拾參億陸仟肆佰拾壹萬肆仟伍佰拾肆點にていみじ ― 確信
CentOSへのRedisインストールメモ


CentOSなサーバーにRedisをインストールしたのでメモしておきます。参考サイト
参考: [linux/redisインストール/redis2.6 - 初心者エンジニアの簡易メモ -](http://go.shr.lc/1kwLRlx)

##インストール

```
$ wget http://download.redis.io/releases/redis-2.8.12.tar.gz
$ tar xzf redis-2.8.12.tar.gz
$ cd redis-2.8.12/
$ make
$ sudo make install
```

##設定
参考: [redis 2.2.12のインストールメモ(amazon Linux) - developer's diary - ](http://go.shr.lc/1otS58w)

```
$ ls
00-RELEASENOTES  COPYING    Makefile  redis.conf        sentinel.conf  utils
BUGS             INSTALL    README    runtest           src
CONTRIBUTING     MANIFESTO  deps      runtest-sentinel  tests

#設定ファイルを /etc/に設置
$ sudo cp redis.conf /etc/
```

###設定ファイル編集

```
$ sudo vim /etc/redis.conf
```
```
#daemonize no
#↓
daemonize yes

#logfile ""
#↓
logfile /var/log/redis.log
```

##起動

```
#先程作った設定ファイルを指定して起動
$ redis-server /etc/redis.conf

#動作確認
$ redis-cli
127.0.0.1:6379> set name n0bisuke
OK
127.0.0.1:6379> get name
"n0bisuke"
```
オレオレ rbenv 運用 Tips

https://github.com/sstephenson/rbenv では、rbenv を

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

のように設定すると書いているが、私はちょっとひねって以下のように設定している。

```bash
# /etc/profile.d/rbenv.sh
if [ -d "$HOME/.rbenv" ]; then
  export PATH="$HOME/.rbenv/bin:$PATH"
  eval "$(rbenv init --no-rehash -)"
fi
```

ポイントは２点あって、

1. /etc/profile.d/rbenv.sh に設定を書く
2. eval "$(rbenv init --no-rehash -)" のように --no-rehash を付ける

理由としては

1. は /etc/profile.d ならばファイルの分割ができ、~/.bash_profile よりも綺麗に整理できるため。また >> で追記する必要がないので、冪等性を保ちやすくプロビジョニングツールで設定を記述しやすいため。
2. は rbenv init - はデフォルトでは rbenv rehash もするが、**rbenv rehash は時間がかかる**ので(下手すると 0.5 sec とかかかる)、ログインのたびにイライラすることになってしまうため。rbenv rehash は bin を持つ新しい gem を入れた時にのみやれば良いので、ログインのたびにやるのはやり過ぎ感しかない。
NICひとつでOpenStack(でも、All-in-oneインストールじゃない）



NICが１つしかない
セグメントは１つしかない

などの環境でもお手軽にOpenStack(icehouse)を構築する方法


1. 準備
----
今回使うのは、RDOインストーラです。
ホストOSは、CentoOS6.5

* 外部からVMにアクセスするためのfloating-ipが後で必要となります。
 > ホームルータなどを導入しているセグメントに払い出す場合IPがかぶらないように
 > ホームルータのDHCPの払い出し範囲を確認してください
>１テナントに付き内部的に数個IPを消費します。余裕を持って専用区画を切っておくと便利です。（２０個くらい）

* cinderを使う場合には、lvmで20GByteくらい最低でも必要。(NFSとかするなら別途設定）
また、VG nameを "cinder-volumes"としておくと、手間が省けます

* ホストOSを固定IPへ変更
適当にぐぐって固定IPにしてください

```
/etc/sysconfig/network-scripts/ifcfg-eth0
```


2. インストール
-----
この[あたり](http://openstack.redhat.com/Quickstart)を見て、上からそのまま突っ込みます

```sh
yum update -y
yum install -y http://rdo.fedorapeople.org/rdo-release.rpm
yum install -y openstack-packstack
```

3. 設定
----

packstackのanswer-fileを作ります。

```
packstack --gen-answer-file= < ファイル名 >
```

* インストールしたい／したくないコンポはお好きに。
* ntpサーバは、nictあたりを適当に。
* eth1を書かれている箇所をeth0へすべて変更

で、そんなことしたファイルが[こちら](https://gist.github.com/tnaoto/01f461a94566d5f58507)

作ったファイルをpackstackに食わせてあとは待つだけ

```
packstack --answer-file= < ファイル名 >
```
初回だけ、rootのパスワードが聞かれます。

今回は、swiftをインストールしない設定になっています。
> 20140707現在、swiftのパッケージにエラーがあります。
> 一つ前のpackestackに戻すか、swiftをインストールしないことで回避できます。


3. インストール後の設定
----

インストール後、ネットワークの設定を変更します。
eth0に設定していたIPをbr-exにセットします。

* eth0をethernetからOVSに変更
/etc/sysconfig/network-scripts/ifcfg-eth0

```
TYPE=OVSPort
DEVICETYPE=ovs
OVS_BRIDGE=br-ex
NM_CONTROLLED=no
BOOTPROTO=none
ONBOOT=yes
DEVICE=eth0
PEERDNS=no
```

* OVSブリッジの作成
/etc/sysconfig/network-scripts/ifcfg-br-ex

```
DEVICE=br-ex
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
IPADDR= < IP >
NETMASK=255.255.255.0
GATEWAY= <GATEWAY>
ONBOOT=yes
```

* gatewayの設定(なくてもいいかも)
/etc/sysconfig/network

```
GATEWAY= < GATEWAY >
```

4. 完成
----
残りは、openstackの設定と同じ
公開ネットワークの設定で、ホームネットワークと同じ設定をする
192.168.1.0/24とし、IPアドレス範囲は任意で。

## ホストへのSSH接続は、br-exブリッジに設定IPアドレスから接続することが出来ます。

コメントどうぞ
tmlib.jsでのアセットのロード


tmlib.jsでは、画像や音声等の素材を使用する前にロードしておくためにtm.ui.LoadingSceneを使います。

画像のロード
----------

以下、"hiyoko.png"という画像をスプライトに貼って画面に出すコード例です。

~~~js:画像のロードとスプライトの表示
tm.main(function() {

    var app = tm.display.CanvasApp("#app");

    // LoadingSceneを作成
    // "hiyoko.png"をロードし、"piyo"という名前で登録する
    // ロード完了後、MainSceneへ遷移する
    var loadingScene = tm.ui.LoadingScene({
        assets: {
            "piyo": "hiyoko.png"
        },
        nextScene: MainScene
    });

    app.replaceScene(loadingScene);

    app.run();

});

// メインシーン
tm.define("MainScene", {
    superClass: "tm.app.Scene",
    init: function() {
        this.superInit();

        // 事前ロードした画像を使い、スプライトを作成・表示
        tm.display.Sprite("piyo", 32, 32)
            .setFrameIndex(0)
            .setPosition(200, 200)
            .addChildTo(this);

    }
});
~~~

tm.asset.Manager
----------------

LoadingSceneによってロードされたアセットは、裏でtm.asset.Managerというオブジェクトに登録されます。

Sprite等を経由せず、直接これらのアセットを取得したい場合は、tm.asset.Manager.getメソッドを使用します。

画像の場合、アセットはtm.asset.Textureクラスのインスタンスとして格納されています。

~~~js:画像を直接取り出す

var texture = tm.asset.Manager.get("piyo");
console.log(texture instanceof tm.asset.Texture); // ==> true

~~~

アセットのデータ型
----------------

ロードしたアセットがどのクラスのインスタンスとして格納されるかは、アセットの拡張子によって決定されます。

たとえば以下のように"userdata.json"をロードした場合、tm.asset.Managerにはtm.util.Fileクラスのインスタンスとして登録されます。

~~~js:JSONのロード
tm.main(function() {
    var app = tm.display.CanvasApp("#app");

    app.replaceScene(tm.ui.LoadingScene({
        assets: {
            "userdata": "userdata.json"
        },
        nextScene: MainScene
    }));

    app.run();
});

tm.define("MainScene", {
    superClass: "tm.app.Scene",

    init: function() {
        this.superInit();

        var userData = tm.asset.Manager.get("userdata");

        // userDataの型はtm.util.File
        console.log(userData.data.name);
        console.log(userData.data.age);
    }
});
~~~

サンプル
-------

http://jsdo.it/daishi.hmr/epXO
rloginって何？


[O'reilly|ネットワーク管理](http://www.oreilly.co.jp/books/4873112478/)を読んでたら開始数ページでrloginという聞き慣れないキーワドがバンバン出てくるので調べてみたので忘れないようにメモ

##rloginとは##
>rlogin（アールログイン）は、UNIXでネットワーク経由で遠隔のサーバにログインするソフトウェア・ユーティリティであり、TCPポート番号 513 を使う。4.2BSDで最初に実装された。rlogin はそのソフトウェアで使われているアプリケーション層の通信プロトコル名でもあり、TCP/IPプロトコルスタックの一部である。認証されたユーザーは、あたかもそのコンピュータに物理的に存在しているかのように振舞うことができる。
>>wikipediaよりhttp://ja.wikipedia.org/wiki/Rlogin

なるほどSSHやtelnet的なアレか。
でもここ数年ネットワークを触ってきたが聞いたことがないのであまり使われていないのかなと。
以下の数点を検証してみましょう。

- 拡張性
- セキュリティ
- 認証

##拡張性##

rloginはほぼないですね。
[rlogin【コマンド】とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 http://wa3.i-3-i.info/word11724.html](http://wa3.i-3-i.info/word11724.html)

[管理者必見！ ネットワーク・コマンド集 - rloginコマンド：ITpro http://itpro.nikkeibp.co.jp/article/COLUMN/20070904/281099/ ](http://itpro.nikkeibp.co.jp/article/COLUMN/20070904/281099/)

telnetの半分もなさそうですね。
通信に関するオプションは-8とか-xぐらいですね。


##セキュリティ
UNIX「使うな。いやマジでデフォルトで使えねぇようにすっから」
ってぐらいセキュリティに関しては配慮されていないようです。
元はLAN内が信用されているホストのみという平和主義な感じで作られてるので **お察しください**。
試しに通信をキャプチャーしようとしたら色々あってできなかったので今度機会があったら…うん…


##認証
telnetやsshはコマンドを打ち込むとログイン待ちになりますが、rloginの場合はログイン処理まで含みます。
遠隔ホストが/etc/hosts.equivもしくはホームディレクトリに.rhostsを作成して登録しておけばパスワードなしでログインできます。

##結論

SSH使いましょう。

以上



##余談
実際に使ってみようとして
man rlogin
って打つとsshのmanページ出てきます。

きっとなんかの間違えだって思って
rlogin -?
って打ってもsshが出てきます。
さらに「rlogin: illegal option --?」とか出てきて禁止されてる感ヤバいです
Ansibleの環境分けをやってみた

# なりゆき

ここしばらくChefを使っていたけど、台数が増えてくると実行がだんだん面倒になってきたのでpull型のツールだけじゃなくてpush型のツールも使ってみなきゃなあ、と思っていたところ、Ansibleが目に入ったので使ってみることにした。

Ansibleを触っての最初の目標は、chefのenvironmentに当たるもの、つまり環境によって設定内容の切り替えを行う方法を見つけることとした。
Ansibleでenvironmentは環境変数を示す予約語のようなのでgoogleに聞くのはちょっと難易度が高かったのだが、なんとか以下のようなページを見つけることができた。

* http://qiita.com/yteraoka/items/5ed2bddefff32e1b9faf
* http://tdoc.info/blog/2014/05/30/ansible_target_switching.html

もっとも、これらはAnsibleをある程度触るまでは内容を理解できなかったのだが、内容を理解した時、以下のような考えに至った。

* インベントリファイルを環境ごとに分ける、というのは素晴らしいので即採用。
* しかしインベントリファイルに配列型の変数を作ることはできなさそうに見える（し、できたとしてもそういうのはインベントリファイルでなくyamlに外出しした方がきれいだよね）。
* ダイナミックインベントリにすれば配列型の変数も作れそうだが、ダイナミックインベントリ書くのめんどいし、実行しないと内容がわからないのがちょっと。リポジトリは見えるけど実行できない、しても意味ない、という状況はままある。
* 環境名を実行時に入力する、というのは入力ミスが怖いな。2つの環境を誤って同じ設定内容にしてしまったらIPアドレスかぶり（特にありそうなのが負荷分散する時のVirtual IP address）とかでこれまで動いていたのがどっちも動かない、とかなるからね。
* インベントリファイルに環境名を与えた変数だけ書いておく、という案も考えたがインベントリファイルをコピーして環境名だけ後回しにしていて結局直し忘れた、はありそうなシナリオでやっぱり怖い。

で、考えた結果。
インベントリファイル名をそのまま（か、ちょっと加工して）環境名にするのがいいよね、という結論に。

# そしてこうなった

site.ymlの最初に以下を追加する。

```site.yml
- hosts: all
  gather_facts: no
  tasks:
    - group_by: key={{ inventory_file | basename | regex_replace('^hosts-', '') }}
      changed_when: False
```

インベントリファイル名がhosts-env1, hosts-env2, hosts-env3, ...だったらgroup_varsディレクトリ以下にenv1.yml, env2.yml, env3.yml, ...を作ってここに環境ごとの設定値を変数に書いていく。

**2014-07-23追記**: 実際に何かが変更されるわけではないのにchanged判定されるのは良くないので「changed_when: False」を追加。

**2014-07-30追記**: ソースを読んだところ、group_varsの中の各ファイルの変数の優先順位は、(group_byで追加されたグループ).ymlはすべてのホストに適用されるall.ymlより高く、(インベントリで定義されたグループ).ymlより低いようだ。

# さいごに

まあしかし、何やってもコピーした後の書き直し忘れには対応できないよね。
ゆめゆめチェックを怠るなかれ。
Arduinoで自動水やり器を作る①

#背景
私は植物を育てると大体枯らしてしまう。でもベランダで野菜を育てたい。
といわけで土壌湿度センサーを利用し、乾燥したら水を勝手にやってくれる機械を作ることにした。

##利点
ベランダでは重量の問題からあまり土を厚く敷くことができないため、枯れるリスクと栄養不足のリスクが高い。しかし、水やり器で液体肥料を撒くことで、土壌が薄くてもちゃんとした野菜ができる（といいなぁと思っている。）

#全体構成
今回は水道から水を引く形ではなく、水を溜めたタンクからポンプを使い水をまく形とする
全体像は以下の通り。
![Skitch から.png](https://qiita-image-store.s3.amazonaws.com/0/39559/28e47a14-374d-3fa7-3703-703efb728d27.png)


- 土壌湿度センサで土壌湿度を計測
- Arduinoで、センサの値が一定以下になったら信号を送る
- Arduinoから信号がきたら、スイッチ(リレー)を入れる
- スイッチが入ると、灯油ポンプが動いて水をくみ上げる

#材料
- [電池式灯油ポンプ](http://www.amazon.co.jp/%E4%B8%89%E5%AE%85%E5%8C%96%E5%AD%A6-%E4%B9%BE%E9%9B%BB%E6%B1%A0%E5%BC%8F%E7%81%AF%E6%B2%B9%E3%83%9D%E3%83%B3%E3%83%97-TP-10R/dp/B005VJIX3G/ref=sr_1_6?s=home&ie=UTF8&qid=1404739755&sr=1-6&keywords=%E7%81%AF%E6%B2%B9%E3%83%9D%E3%83%B3%E3%83%97)
500円くらい 自動で止まらないやつの方がよい
- Arduino (自分はLeonardを使用)
- [土壌湿度センサー](http://akizukidenshi.com/catalog/g/gM-07047/)　500円くらい
　※釘２本とかで代用している人もいる
- リレー 200円くらい(5V・10〜20mmAで動くもの。自分はomron G5V-1を利用)
- ワイヤとか

#作成

##センサー⇒Arduino
土壌湿度を計り、湿度が低かったらArduinoのデジタル1ピンから出力するようにする。
また、一度水が出たら一定時間信号を出し続ける（水を出し続ける)ようにする。

###回路
下の図のように、赤⇔5V、黒⇔GND、青⇔Analog1ピンにつなぐ
- ![hoge](http://www.dfrobot.com/wiki/images/thumb/c/c9/SEN0114_Dia.png/350px-SEN0114_Dia.png)
*引用:http://www.dfrobot.com/wiki/index.php?title=Moisture_Sensor_(SKU:SEN0114)*

###プログラム

初心者なのでごちゃっとしていて恥ずかしい :see_no_evil: 。きれいにかける人がいたら直してほしい…。

```cpp
/*
  # the sensor value description
  # 0  ~300     dry soil
  # 300~700     humid soil
  # 700~950     in water
*/
  int time;
  int moi;
  int ON;
 
void setup(){ 
  pinMode(1,OUTPUT);
}
 
void loop(){
  moi=analogRead(0); 
 // Serial.println(moi);
  delay(1000);
 if(moi<300){ //湿度センサの抵抗値が300以下ならdigital1ピンから出力
      digitalWrite(2,HIGH);
      time = time++;
      ON=1;
      delay(1000);
    }else{   //一度出力したらtimeが30秒立つまでは出力し続ける
          if(time<30 & ON>0){
          digitalWrite(2,HIGH);
          time=time+1;
          delay(1000);  
          }else{
          digitalWrite(2,LOW);
          time=0;
          ON=0;} 
}
}
```

##Arduino⇒ポンプ
ポンプはArduinoのデジタルピンからの出力では動かないため、リレーを使うことでArduinoからの出力信号をスイッチとして使い、乾電池で動かす。

##スイッチ部分

##リレー部分
リレーは電気が流れるとスイッチが入る（or切れる）部品。制御部分(Arduino)の出力だけでは動かせないものを動かすときに、外部電源のスイッチとして働く。
2-9番に電気が流れる(小さい信号・スイッチ)と、10-5(or6)番に電気が流れる(大きい電気・モーターを動かす) 
参考）http://www.omron.co.jp/ecb/products/pdf/g5v_1.pdf

1.1.  digital2⇔リレー2番(or9番)
1.2. リレー9番(or2番)⇔GND

![Skitch から (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/39559/3727004b-8db5-1e09-0221-cc2646e80fc6.jpeg)
電池ボックスを空けてみると、青い①のところと②のところが接触し電気が流れるとモーターが動く仕組みになっていた。
なので、①と②をリレーでスイッチが入ると電流が流れる10番-5番(or6番)につないでやる。

2.1. リレー5番(or6番)⇔①(or②)
2.2. リレー10番⇔②(or①)

#実験

濡らしたティッシュなどでセンサーの金属部分を覆い、Arduinoのリセットボタンを押す。
濡らしたテッシュをセンサーから外したらポンプのモーターが動いたら小成功。
ティッシュに戻してしばらくして自動で止まったら成功（そのままにしとくと動き続ける）。

#残課題
あとはホースの部分を作成してやり、必要部分のハンダ付けやケースへの収納をすれば実用できる。
最適な水やりタイミングのための土壌湿度センサー値の調整や、水やり時間の調整はばあちゃんのアドバイスを聞き野菜を育てながら進めたい。
あと電池がなくなったら、電池をやめて太陽電池バッテリーから電気をとるように改造しようかな。

#参考
http://www.dfrobot.com/wiki/index.php?title=Moisture_Sensor_(SKU:SEN0114)
http://startelc.com/elc/elc_3_6Lr.html
特定アプリのapp storeでのランキングを取得する

アプリのランキングを取得するスクリプトを書いてみました。

```php
<?php

$targetAppIds = array(
  'id834802911',
  'id443904275',
);

$feed = file_get_contents('https://itunes.apple.com/jp/rss/topfreeapplications/limit=100/xml');
$rss = simplexml_load_string($feed);

$result = array();

foreach($rss->entry as $val) {
    $ranking++;

    $title = $val->title;
    $url   = $val->id;

    foreach ($targetAppIds as $targetUrl) {
	if (strpos($url, $targetUrl) !== false) {
	    $result[] = array(
	        'app_name' => (string)$title,
	        'ranking' => $ranking);
	}
    }
}

foreach ($result as $val) {
    echo sprintf("【%s位】%s\n", $val['ranking'], $val['app_name']);
}
```
Github と合わせて使いたいサービス (リポジトリにバッジを付けろ！)

# Github と合わせて使いたいサービス

* 使っていて便利なサービスがあったので 2 つほど紹介

1. Travis Ci
2. Coveralls

* また、これらを使うと最近良く見るこんなバッジをリポジトリにつけられる
![スクリーンショット 0026-07-07 23.53.24.png](https://qiita-image-store.s3.amazonaws.com/0/28573/1fae7778-90b0-12c1-4bee-9f99c224af7e.png)

* こんなのもおすすめ！というのがあれば、コメントください

# Travis CI
* [公式ページ](https://travis-ci.org/)
* CI（継続的インテグレーション）サービス

## メリット
* Github と簡単に連携できる
    * push や PullRequest をフックできる
* 色々な言語に対応している
* 任意の言語の複数のバージョンでテストできる
* パブリックリポジトリなら無料


## 使い方
1. 設定ファイル(.travis.yml)を書いて、リポジトリのトップに配置
2. Travis CI のページで設定をする

### 設定ファイル(.travis.yml) の書き方 : Rails の例

```yaml:.travis.yaml
language: ruby
rvm:
  - 2.1.0

gemfile:
  - Gemfile

env:
- DB=mysql

script:
  - RAILS_ENV=test bundle exec rake db:create
  - RAILS_ENV=test bundle exec rake db:migrate
  - RAILS_ENV=test bundle exec rake db:test:prepare
  - RAILS_ENV=test bundle exec rake spec
```

# Coveralls
* [公式ページ](https://coveralls.io/)
* コードカバレッジレポートサービス (あくまでレポート)
* Travis CI などの CI が稼働していることが前提

## メリット
* パブリックリポジトリなら無料


## 使い方
1. 設定ファイル(.coveralls.yml)を書いて、リポジトリのトップに配置
2. Coveralls のページで設定をする

以下、Rails の場合
* Gemfile に 下記を追加

```
gem 'coveralls', :require => false
gem 'simplecov'
```

* (RSpec を使用している場合) spec / spec_helper.rb に以下を記載

``` rb:spec/spec_helper.rb
require 'simplecov'
require 'coveralls'
Coveralls.wear!('rails')

SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
  SimpleCov::Formatter::HTMLFormatter,
  Coveralls::SimpleCov::Formatter
]
SimpleCov.start 'rails'
```


### 設定ファイル(.coveralls.yml) の書き方 : Travis CI の例

```yaml:.coveralls.yml
service_name: travis-ci
```


# バッジをつけよう
* バッジは README にそれぞれ指定の通り記載すると表示される
* Travis CI のバッジはビルドの状態(passing / failing)、Coveralls はカバレッジのパーセンテージが表示される

## Travis CI
* 参考ページ : http://docs.travis-ci.com/user/status-images/

```
[![Build Status](https://travis-ci.org/<username>/<repo_name>.svg?branch=master)](https://travis-ci.org/<username>/<repo_name>)
```

## Coveralls

```
[![Coverage Status](https://coveralls.io/repos/<username>/<repo_name>/badge.png?branch=master)](https://coveralls.io/r/<username>/<repo_name>?branch=master)
```
プライベートコンストラクタ

[ぐぐってもそれらしい結果なかった](https://www.google.co.jp/search?q=private+constructor+site%3Awww.dartlang.org) ので。[言語仕様のページ](https://www.dartlang.org/docs/spec/latest/dart-language-specification.html)には書いてあるんだろうけど、ちょっとページ内検索してもよくわからなかったので、メモ。

基本的には、フィールドやメソッドの頭に `_` をつけるって仕様と同じ。

```person.dart
class Person {
  String _name;

  Person._raw(); // ←これがプライベートコンストラクタ

  factory Person(String name) {
    var d = new Person._raw();
    d._name = name;
    return d;
  }

  String get name => _name;
}
```

実際、これだけのコードなら、`final String name; Dart(this.name);` の方が適切なんですが。
mdpressいろいろ

[参考元](http://egonschiele.github.io/mdpress/)

## スライド区切り
横線3本と上1行以上の改行で各スライドの区切り

```例
# アイドルマスター  // スライド1の内容

---
## 天海春香 // スライド2の内容
```

## = data-x(y, z)="xx"
- 横線の下に記述。 **#1スライドを中心に**指定した座標にスライドを設置する。
- 例）`= data-x="500"`と記述すると#1スライドよりも500pt右にスライドを設置する。
![f31317f707af5534b322ca928a75d0ef.gif](https://qiita-image-store.s3.amazonaws.com/0/45047/eedbc7c7-3f40-50e2-d69a-52076a1d19d0.gif "f31317f707af5534b322ca928a75d0ef.gif")

## = data-scale="xx"
- 次のスライドに移る前になんかアニメーションする（言葉で説明するには私の語彙が足りなすぎる）
- 例）`= data-scale="2"`
![0ceb12bf6a25169d82ee9aaae756281e.gif](https://qiita-image-store.s3.amazonaws.com/0/45047/df499753-1d91-4f3c-5ad1-42ef1531927c.gif "0ceb12bf6a25169d82ee9aaae756281e.gif")

## = data-rotate-x(y, z)="xx"
- 指定した軸をスライドに刺してクルッと回す感じ。
- 例）`=data-rotate-x="50"`
![79ff4d2b9ed46ead7b23c633731adfe4.gif](https://qiita-image-store.s3.amazonaws.com/0/45047/038bc172-ebac-0aea-070a-db8dd3d61d57.gif "79ff4d2b9ed46ead7b23c633731adfe4.gif")

## 組み合わせ
- これらは組み合わせて使うことができる
- 例）

```test.md
  1# アイドルマスター
  2 
  3 ---
  4 = data-y="1000" data-scale="5"
  5 
  6 ## 天海春香
  7 
  8 ---
  9 = data-y="500"
 10 
 11 ## 我那覇響
 12 
 13 ---
 14 = data-rotate-y="100"
 15 
 16 ## おわりだよー
```
![a0a5dbffda76fa751fd0b287969d1a85.gif](https://qiita-image-store.s3.amazonaws.com/0/45047/cc216194-92d4-9e71-5cc7-93ba06bb5263.gif "a0a5dbffda76fa751fd0b287969d1a85.gif")

## まとめ
使いすぎるとわかりづらい