OmniAICreator/Qiita-1.07M huggingface dataset:
chefでdata_bagの暗号化

#例えば

MHA用の鍵とかをchefで配ってるんだが、  生fileとして配布はかっこ悪い。  
なんか暗号化とか出来ないのかなーと探してみたらちょうどいいのがあった。


# [knife-solo_data_bag](https://github.com/thbishop/knife-solo_data_bag)

[公式](http://docs.chef.io/data_bags.html)にも書いてる

さっくり使えるようになる所まで書いていく


## 準備

```
#install
#
# gem install knife-solo_data_bag
#
#秘密鍵準備
#
# openssl rand -base64 512 > .chef/data_bag_key
#
#knifeのconfig
#
# cat .chef/knife.rb 
cookbook_path    ["site-cookbooks"]
node_path        "nodes"
role_path        "roles"
environment_path "environments"
data_bag_path    "data_bags"
encrypted_data_bag_secret ".chef/data_bag_key"
```

## data_bag編集

```
# editor指定
#
# export EDITOR=vim
#
# 鍵を使って編集
#
# knife solo data bag create kakeru kaeru --secret-file .chef/data_bag_key 
{                                                         
  "id": "kaeru",                                          
  "kakeru_key": "-----BEGIN DSA PRIVATE KEY-----\nhogehoge"
}                                                         
# こんな感じでjson_fileを編集
# 作れたかしら？
#
# cat data_bags/kakeru/kaeru.json 
{
  "id": "kaeru",
  "kakeru_key": {
    "encrypted_data": "EYapYk8BKax0HwfWhd2Px9IG/cWxQ9LRpeXPZirnUPuH8dtIvIyP3+pm2EcC\nUapBJSsyQSDQr3QLKmNWsj7bBg==\n",
    "iv": "GvVOtBO3WnM81jxbz3iGKw==\n",
    "version": 1,
    "cipher": "aes-256-cbc"
  }
}
```
み！  
見えへん！！！！！！！！！！！

ちなみに、もう一回編集したいならこう
```
knife solo data bag edit kakeru kaeru
```

## どうやってrecipeから呼び出すの？

```
kaeru = Chef::EncryptedDataBagItem.load("kakeru", 'kaeru')
kaeru_key = kakeru['kakeru_key']
```
こんな感じ
後はお好きに使う感じで
apt-getの利用リポジトリを日本サーバーに変更する

vagrantで使おうとしているBoxのapt-get利用リポジトリがUSになっている場合がよくある。

```bash
$ sudo apt-get update
Hit http://security.ubuntu.com trusty-security Release.gpg
Get:1 http://us.archive.ubuntu.com trusty Release.gpg [933 B]
Hit http://security.ubuntu.com trusty-security Release
Get:2 http://us.archive.ubuntu.com trusty-updates Release.gpg [933 B]
Hit http://security.ubuntu.com trusty-security/main Sources
```

なので、日本サーバにしてしまう。

```bash
# IIJにしたいとき
$ sudo sed -i.bak -e "s%http://us.archive.ubuntu.com/ubuntu/%http://ftp.iij.ad.jp/pub/linux/ubuntu/archive/%g" /etc/apt/sources.list

# jaistにしたいとき
$ sudo sed -i.bak -e "s%http://us.archive.ubuntu.com/ubuntu/%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list
```

vagrant up時に設定しておいてほしいときは、vagrantfileでshell provisionerを使えばよい。

```rb
  config.vm.provision "shell", inline: <<-SHELL
sudo sed -i.bak -e "s%http://us.archive.ubuntu.com/ubuntu/%http://ftp.iij.ad.jp/pub/linux/ubuntu/archive/%g" /etc/apt/sources.list
SHELL
```

dockerfileで FROM ubuntu なときは、us指定を外して

```bash
# IIJにしたいとき
$ sudo sed -i.bak -e "s%http://archive.ubuntu.com/ubuntu/%http://ftp.iij.ad.jp/pub/linux/ubuntu/archive/%g" /etc/apt/sources.list

# jaistにしたいとき
$ sudo sed -i.bak -e "s%http://archive.ubuntu.com/ubuntu/%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list
```

とする必要がある。


思い入れのあるサーバがある場合は下記から選べばよい。
- [日本国内のダウンロードサイト | Ubuntu Japanese Team](http://www.ubuntulinux.jp/ubuntu/mirrors "日本国内のダウンロードサイト | Ubuntu Japanese Team")
- [Mirrors : Ubuntu(回線の太さから判断できる)](https://launchpad.net/ubuntu/+archivemirrors "Mirrors : Ubuntu")


## 追記

sedコマンドをもっと簡単に書いた。

```bash
$ sudo sed -i.bak -e "s%http://[^ ]\+%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list
```
HTTPSのサイトをtelnetでページ表示できない

開発とか、日常の運用業務でhttpサイトにtelnetでアクセスすることが
よくあると思います。

例えば

```bash
telnet www.yahoo.co.jp 80
```

上記のように`telnet`してから、GETメソッドとかでHTTPリクエストを
出しますよね。

でも、HTTPSのサイトだとtelnetができません。

そんな時は`openssl`コマンドの出番です。

例えば下記のような感じ

```bash
openssl s_client -connect www.goole.co.jp:443
```

上記でアクセスできたら、後は通常通りGETメソッドとかでHTTPリクエストが出せます。
メソッドをオーバーライドする時のシグネチャにおける注意点

はじめに
-----------

Javaでメソッドをオーバーライドする時は、サブクラスのメソッドはスーパークラスの
メソッドのシグネチャ(メソッド名と引数列の型)に合わせる必要があります。

引数列の型が同じである必要があるということは知っていましたが、引数の数が
違うとどうなるか?

コンパイラに怒られることはわかっていつつ、試してみました。

例として、スーパークラスのメソッドは下記のように定義します。

```java
class Papa {
    ...
    int calParameter(int x, int y) {
        int sum_parameter = x + y;
        return sum_parameter;
    }
    ...
}
```

シグネチャを合わせて正しくオーバーライド
--------------------------------------------

説明するまでもありませんが、下記のようにオーバーライドすると、当然正常に
コンパイルできます。

```java
class MySon extends Papa {
    ...
    @Override
    int calParameter(int x, int y) {
        int diff_parameter = x - y;
        return diff_parameter;
    }
    ...
}
```

引数の数を増やしたり、減らしたりしてみる

引数の数を増やす:

```java
class MySon extends Papa {
    ...
    @Override
    int calParameter(int x, int y, int z) {
        int diff_parameter = (x - y) * z;
        return diff_parameter;
    }
    ...
}
```

引数の数を減らす:

```java
class MySon extends Papa {
    ...
    @Override
    int calParameter(int x) {
        int diff_parameter = x;
        return diff_parameter;
    }
    ...
}
```

上記二つのパターンでコンパイルすると、いずれも下記のように怒られました。

```bash
$ javac MySon.java
MySon.java:18: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません
```

まとめ
--------
今回のケースは想像はついてましたが、まとめると

**メソッドをオーバーライドするには**

* メソッドの名前が等しく、かつ
* 引数列の型と、引数の数が等しいこと

となるようです。
IPython NotebookでApache-Sparkを動かす

## 背景
ビッグデータとかリアルタイム解析とかデータマイニングとか機械学習とか、皆が面白そうにブログ書いてたり話してたりしてるから興味あるんですよ。面白そうなんですよ。
で、個人的に興味があって調べていますというただそれだけです。
下手の横好き以下なので、何をいまさらレベルのことをやりながら楽しんでます。
※ 前回の投稿と同じです

## やること
IPython NotebookでApache-Sparkを動貸せるように設定するだけです。
ググれば色々出てくるけど自分の近くに置いておきたいのでメモ。
さっき知ったけど、sparkの1.2.0が出てたので既に微妙に古い。
けどどうせ同じで大丈夫と思ってる。

## 前提
* PCローカルで動かすこと
* IPython Notebookが起動出来ること

## 環境
* Windows 7 / Mac OS X Yosemite / Ubuntu 14.11
  * 全部64bit

## 手順
1. Sparkをダウンロードしてきてどっかにコピーする、もしくはインストールする

    ![スクリーンショット 2014-12-20 23.26.53.png](https://qiita-image-store.s3.amazonaws.com/0/22446/12ea8c5f-0124-d3af-8f50-8b78061aa58f.png)

    Homebrewでインストールすると`/usr/local/Cellar/apache-spark/1.1.1`に置かれるご様子。


2. 環境変数に`SPARK_HOME`を設定する

    ```bash
    export SPARK_HOME="sparkを解凍したフォルダ"
    ```

3. IPythonのプロファイルを作る

    ```bash
    $ ipython profile create pyspark
    ```

4. IPython環境のプロファイルの`startup/00-pyspark-setup.py`を編集する

    ```python
    #coding:utf-8
    import os
    import sys
 
    os.environ['SPARK_HOME'] = '/usr/local/Cellar/apache-spark/1.1.1'
    spark_home = os.environ.get('SPARK_HOME', None)
    if not spark_home:
        raise ValueError('SPARK_HOME environment variable is not set')
    sys.path.insert(0, os.path.join(spark_home, 'libexec/python'))
    sys.path.insert(0, os.path.join(spark_home, 'libexec/python/lib/py4j-0.8.2.1-src.zip'))
    execfile(os.path.join(spark_home, 'libexec/python/pyspark/shell.py'))
    ```
    私の環境では設定ファイルは`~/.ipython/profile_pyspark`にあります。   `py4j-0.8.2.1-src.zip`はバージョンによって違うから書き換えましょう。
    Windowsではユーザフォルダあたりにあった気がします。

5. 起動してみる

    ```bash
    $ ipython notebook --profile=pyspark
    ```

6. なんか動いてる感じです。いえ〜い！

    ![クリー.png](https://qiita-image-store.s3.amazonaws.com/0/22446/c57e1f46-cabb-66b9-3cd6-409818d31370.png)

## 参考
http://blog.cloudera.com/blog/2014/08/how-to-use-ipython-notebook-with-apache-spark/
Javaのsuper()を書く場所に注意

Javaでサブクラスをつくった場合、特に何か書かなくてもスーパークラスの
**引数なし**のコンストラクタはコンパイラによって、自動的に挿入されます。

例えば下記のような、RectangleクラスのサブクラスNamedRectangleクラスをつくった場合
`NamedRectangle()`コンストラクタのところに、スーパークラスのコンストラクタ呼び出しは
書いていません。

```java
class NamedRectangle extends Rectangle {
    String name;
    NamedRectangle() {
        name = "NO NAME";
    }
```

この場合、コンパイル時に`super()`が自動的に挿入され、下記のように
スーパークラスの引数なしのコンストラクタが呼び出せるようになっています。

```java
class NamedRectangle extends Rectangle {
    String name;
    NamedRectangle() {
        super(); <-これ
        name = "NO NAME";
    }
```

ではスーパークラスの**引数付き**のコンストラクタを呼び出す場合はどうでしょうか?
そうです、明示的に書いてやる必要があります。
例えば下記のような感じ

```java
class NamedRectangle extends Rectangle {
    String name;
    NamedRectangle() {
        super(200, 32);
        name = "NO NAME";
    }
```

大変前置きが長かったですが、この`super()`を書く位置をずらしてコンパイルすると
どうなってしまうでしょうか?

```java
class NamedRectangle extends Rectangle {
    String name;
    NamedRectangle() {
        name = "NO NAME";
        super(200, 32); <-このように一行したに入れる
    }
```

コンパイルすると、、、

```bash
$ javac PlacedRectangle.java
PlacedRectangle.java:12: エラー: superの呼出しはコンストラクタの先頭文である必要があります
        super(width, height);
             ^
エラー1個
```

`superの呼出しはコンストラクタの先頭文である必要があります`と怒られてしまいました。

Javaを書く方には「当然のこと!」と怒られそうですが、、、
メソッドの仮引数名をフィールド名と同じにできるか?

Javaで下記のようなプログラムを書いた場合について考えます。

```java
class Rectangle {
    int width;
    int height;
    Rectangle(int w, int h) {
        width = w;
        height = h;
    }
    ... このあたりは省略
}
```

上記の場合、コンストラクタを呼び出す際、引数`w`と`h`で指定した値は
正しく`width`と`height`フィールドに代入されます。

しかし、下記のように仮引数名を変更した場合どうなるでしょうか?

```java
class Rectangle {
    int width;
    int height;
    void Rectangle(int width, int height) {
        width = w;
        height = h;
    }
    ... このあたりは省略
}
```

コンパイル時はエラーになりませんが、インスタンスを作成してコンストラクタが呼び出されると
`width`と`height`フィールドには指定した値が代入されず、0になってしまいます。

このように、**メソッドの仮引数名をフィールド名と同じ**にする場合、`this`を
使って次のように書く必要があります。

```java
class Rectangle {
    int width;
    int height;
    void Rectangle(int width, int height) {
        this.width = w; <- ここを変更
        this.height = h; <- ここを変更
    }
    ... このあたりは省略
}
```

例えばpythonの場合、クラスを宣言した場合、クラス内の
メソッドの第一引数には明示的に`self`と書き、フィールドの
宣言の時も、`self.width = w`のように書きますね。

例えばpythonで上記と同じプログラムを書くときは下記のようになります。

```python
class Rectange(object):
    def __init__(self, width, height):
       self.width = width
       self.height = height
```

javaの場合、pythonでいう`self`である`this`は、pythonとは異なり、メソッド宣言の中では
省略可能です。

これは、コンパイラによって自動的に`this`を補完してくれるからです。

ただし、今回の例のように、メソッドの仮引数名をフィールド名と同じにした場合、`this`を
省略すると、意図したとおりにプログラムが動きません。

私は最初に覚えたオブジェクト指向言語はpythonなので、`this`を省略するのは違和感が
あります。

私はpythonをメインに仕事をしていますので、javaを書くときも混乱しないように`this`を
省略しないで書こうと思っています。
iptables 1レコードで複数ポートを定義する方法

例えばApacheをたてて、iptablesを書く場合、`--dport`は80と443に
して、通信を許可することなどがあると思います。

その場合、私は今まで下記のように2レコードのiptablesを書いていました。

```bash
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
```

しかし、`-m multiport`を使用すると、`--dports`オプションが利用できるようになり、
これにより1レコードで複数のポートを指定できるようになります。

例えば下記のような感じです。

```bash
-A INPUT -m state --state NEW -m multiport -p tcp --dports 80,443 -j ACCEPT
```

私はついiptablesの行数を多くしてしまいがちなんで、重宝しそうです。
.bash_profileと.bashrcについて

はじめに
----------

`.bash_profile`と`.bashrc`でユーザ環境のカスタマイズはよくやってますが、
その使い分けについてまじめに確認したことがなかったのでメモをしておきます。

.bash_profileと.bashrc
-------------------------

ユーザがLinuxにログインすると、ホームディレクトリにある`.bash_profile`と
`.bashrc`が実行されるようになっています。

ユーザは、これらの中に環境変数やコマンドのエイリアスの設定を自由に追加できます。

.bash_profileと.bashrcの使い分けについて
------------------------------------------

sshでログインすると、`.bash_profile` -> `bashrc`の順に実行されます。
これは`.bash_profile`のソースの上のあたりを見るとすぐにわかります。

``` bash
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

***以下略***
```

しかし、すでにログインしている状況で、新たにシェル(bash)を起動した際は
`.bashrc`だけが実行されます。

とくに、Linuxデスクトップ環境では、テスクトップ上で新しいコマンド端末を開いた際は
`.bashrc`のみが実行されます。

つまり、

* ログイン時に一回だけ実行したい時

  -> `.bash_profile`に記載

* シェルを起動する度に実行したい時(一般的な設定)

  -> `.bashrc`に記載

テスト
-------

上記のことを確かめるために簡単なテストをしました。

`.bash_profile`に下記を追記

```bash
# テスト
echo '.bash_profileに記載されたechoです'
```

`.bashrc`に下記を追記

```bash
# テスト
echo '.bashrcに記載されたechoです'
```

ターミナルソフトで対象のサーバにsshログインすると、`.bashrc`に書いたものと
`.bash_profile`に書いたものが表示されました。

`.bashrc`に書いたものが先に表示されているのは、`.bash_profile`内で`.bashrc`が
呼び出された後の行に`echo '.bash_profileに記載されたechoです'`を書いている
ためです。

```bash
Last login: Thu Jun 12 13:51:12 2014 from office-gw01.bbtower.co.jp
.bashrcに記載されたechoです
.bash_profileに記載されたechoです
[testuser@www ~]$
```

ログインした後に、`bash`コマンドをたたくと、`.bashrc`の内容のみが表示されます。
```bash
[testuser@www ~]$ bash
.bashrcに記載されたechoです
```

ちなみに`su`コマンドに`-`をつけるかつけないで挙動が変わります。
`-`をつけると、ログインシェルが呼び出されます。

この違いも一応見てみると、下記のとおり

```bash
[testuser@www ~]$ su testuser
パスワード:
.bashrcに記載されたechoです

[testuser@www ~]$ su - testuser
パスワード:
.bashrcに記載されたechoです
.bash_profileに記載されたechoです
```

.bash_profileや.bashrcの大元
------------------------------

`.bash_profile`や`.bashrc`の大元は`/etc/skel`にあります。
つまり、`useradd`コマンドでユーザを作成すると、このディレクトリ内の
ファイルがサブディレクトリを含めて、作成したユーザのホームディレクトリに
コピーされます。

```bash
$ ls -la /etc/skel/
合計 36
drwxr-xr-x.   4 root root  4096  5月  9 20:21 2014 .
drwxr-xr-x. 114 root root 12288  6月 12 13:50 2014 ..
-rw-r--r--    1 root root    18  7月 18 22:19 2013 .bash_logout
-rw-r--r--    1 root root   176  7月 18 22:19 2013 .bash_profile
-rw-r--r--    1 root root   124  7月 18 22:19 2013 .bashrc
```

以上のことから、すべてのユーザのホームディレクトリに共通に配布したい
ファイルがある場合は、事前に`/etc/skel`内においておくと、確実です。
jrubyからkuromojiを使う

```rb
#encoding: UTF-8

require 'java'

java_import org.atilika.kuromoji.Token
java_import org.atilika.kuromoji.Tokenizer

tokenizer = Tokenizer.builder().build();

tokens =  tokenizer.tokenize(ARGV[0]).iterator
while tokens.hasNext
  token = tokens.next
  puts token.getSurfaceForm() + "\t" + token.getAllFeatures()
end
```

```bash
$ jruby -J-cp kuromoji-0.7.7/lib/kuromoji-0.7.7.jar test_tokenize.rb "ガンダムユニコーン"
ガンダムユニコーン	名詞,固有名詞,組織,*,*,*,*
```
ROS Indigo Gazeboシミュレータでturtlebotを表示する

#必要なパッケージ
$sudo apt-get install ros-indigo-viz
$sudo apt-get install gazebo4
オプショナル(NVIDIAやRADEON等GPUを使っている場合)
$sudo apt-get install mesa-utils
#ソースインストールの作業①
$cd ~/catkin_ws/src
$git clone https://github.com/turtlebot/turtlebot_simulator.git
$rosinstall ~/catkin_ws/src/turtlebot_simulator /opt/ros/indigo
$echo "source ~/catkin_ws/src/turtlebot_simulator/setup.bash" >> ~/.bashrc
＃ソースインストールの作業②
$source ~/.bashrc
$cd ~/catkin_ws/src/turtlebot_simulator
$roslocate info  turtlebot_simulator > turtlebot_simulator.rosinstall
$rosinstall ~/catkin_ws/src/turtlebot_simulator turtlebot_simulator.rosinstall
#依存関係のインストール
$ls ~/catkin_ws/src/turtlebot_simulator
$rosdep install パッケージ名
$rosmake パッケージ名
パッケージ名　＝　lsで表示されたディレクトリ名です。依存関係エラーが出たものは無視してください。rosmakeできないパッケージはcatkinシステムよりaptで補完されている場合が多いです。
#catkinでサポートされているパッケージのインストール
$apt-cache search ros-indigo-gazebo
#gazebo4をrosで動作させるためののパッケージ
$sudo apt-get install ros-indigo-gazebo4-ros
このパッケージだけでうまく行かなかったらapt-cacheの一覧のgazebo4 rosパッケージをインストールしてください。prereleaseはインストールしないように、もしインストールしてしまったら依存関係がネストし
$apt-get -f install
で復帰できないので強力なパッケージマネージャーaptitudeを使って
$sudo aptitude install
で復帰してください。aptitudeが開かない場合はaptプロセスをkillしてください。
$ps -ae | grep "apt*"
$sudo pkill --signal SIGKILL apt
$sudo apt-cache search ros-indigo-yocs
yocsはturtlebotの開発会社のyujin roboticsが提供しているパッケージで多分turtlebot系パッケージはindigoの場合こちらへ移行したと考えられるのでここの一覧をすべてインストールしておくと無難です。
$sudo apt-get install ros-indigo-yocs-○○(ここに一覧を入れてください)
#そして、遂にgazebo起動です！
$cd ~/catkin_ws/src/turtlebot_simulator/turtlebot_gazebo/launch
$roslaunch turtlebot_world.launch
![Screenshot from 2014-12-20 22:42:34.png](https://qiita-image-store.s3.amazonaws.com/0/54829/158d24f2-ab73-52b5-a837-93bc46de6f59.png)
こんな感じになりました。
#subscribeしているtopicが気になったら
$rqt_graph
![Screenshot from 2014-12-20 22:46:21.png](https://qiita-image-store.s3.amazonaws.com/0/54829/04ec54e2-7179-7be3-dba1-a7bb1f7c1656.png)
こんな感じになりました。
#困ったことがあれば
twitter : @kendemu まで連絡ください。
Zeroconfを使用しないようにする

はじめに
---------

RHEL6やCentOS6を普通にインストールして、ルーティングテーブルを
見ると下記のような感じになっています。

```bash
# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.0.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         10.0.0.254      0.0.0.0         UG        0 0          0 eth0
```

169.254.0.0/16のルーティングテーブルがありますが、これは何だろう?

これはZeroconfによって自動的に作られたものだそうです。

Zeroconfとは(引用)
-------------------

> 動的ホスト構成プロトコル(DHCP)が見つからなかった時(IPアドレスを取得できなかった時)に、
> TCP/IPがプライベートIPアドレスを自動的に割り当てる機能**(APIPA:Automatic Private IP Address)**を実装しています。
> この為、ルーティングに「169.254.0.0」が登録されています。

APIPAとは(引用)
-------------------

> ネットワーク機器に対して、IPアドレスを自動的に割り当て、利用するための機能。
> 
> 　TCP/IPを実装したネットワーク機器やシステムでは、それぞれのシステムに対して、
> 重複しない固有のIPアドレスを割り当てておかなければお互いに通信することはできない。
> しかしネットワークに詳しい管理者がいなかったり、DHCPサーバも用意されていないような
> 小規模なネットワークでは、IPアドレスを秩序立てて割り当てたり管理するのは困難である。
> そこで考案されたのがAPIPAというIPアドレスの自動的な割り当て、管理機能である。
> 
> 　APIPAを実装したシステムでは、最初に自分のシステムに割り当てるIPアドレスを
> 「169.254.1.0～169.254.254.255」の範囲内からランダムに1つ選択する。
> そして、ARP要求をネットワークにブロードキャストすることによって、そのIPアドレスがほかの
> システムで利用されていないかどうかを確認する。もしどこかのシステムからARPの応答が返ってくれば、
> そのIPアドレスは使用中であるとみなし、別のIPアドレスで再試行する。このようにして
> 未使用のIPアドレスを見つけ、それを自分のシステムに割り当てることによって、
> IPアドレスが重複しないことを保障する。
> 「169.254.*.*」というIPアドレスはLINKLOCALアドレスといい、一般的なプライベートIPアドレスではないが、
> どこの組織にも割り当てられていないことが保証された、APIPAでのみ有効な、特別なIPアドレスである。
> 
> 　このように、APIPAを利用することにより、ユーザーはネットワークのIPアドレスをまったく意識することなく、
> ネットワーク上のほかのシステムと通信をすることができる。
> 
> 　ただしAPIPAは、小規模なネットワークで使うことを前提としているため、複数のネットワークをまたいで使うことはできない。
> APIPAで割り当てられたIPアドレスを持つパケットは、ルータでルーティングしてはいけないことになっている。
> そのため通信できる範囲は同一のネットワーク（ブロードキャストが届く範囲）に限定されることになる。
> インターネットへ接続するのではなく、ローカルのLAN上でファイル共有やプリンタ共有しか使わないという用途にはこれでも十分である。
> 
> 　APIPAは、最近のWindowsやMacintoshシステムなどで実装されている。これらのシステムでは、最初にDHCPなどでIPアドレスの
> 取得を試みるが、それが失敗するとAPIPAによってランダムなIPアドレスを割り当てるようになっている。
> だがハブが壊れるなど、何らかの事情でネットワークが利用できない場合でも、自動的にランダムなIPアドレスが割り当てられたまま
> システムが起動してしまうことになるので、一見するとネットワークが正常に機能しているようにみえることがある。
> そのため、トラブルの原因を究明するのが困難になることもある。

Zeroconfを無効に
------------------

結局のところサーバ用途ではほぼ不要と思われるので、これを無効化します。

```bash
# vi /etc/sysconfig/network
NOZEROCONF=yes <-これを追記する
```

ネットワークを再起動して、再びルーティングテーブルを確認すると、無効化されることが
確認できますね。

```bash
# service network restart

# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.0.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
0.0.0.0         10.0.0.254      0.0.0.0         UG        0 0          0 eth0
```
UIDとGIDについて

はじめに
---------

RHEL6、CentOS6におけるUIDとGIDの割り当て範囲をマトリクスに
しました。

UID
----

ユーザの種類   | ユーザの機能                     | UIDの範囲  |
:-------------:|:--------------------------------:|:-----------|
rootユーザ     | 特権ユーザ                       | 0
システムユーザ | アプリケーションを実行するユーザ | 1 - 499
個人ユーザ     | Linux上で作業を行うユーザ        | 500 - 60000

GID
----

グループの種類   | UIDの範囲  |
:---------------:|:-----------|
rootグループ     | 0
システムグループ | 1 - 499
個人グループ     | 500 - 60000
blkidコマンド(UUIDに対応するディスクパーティション確認)

`cat /etc/fstab`をすると、RHEL6とかCentOS6の場合はパーティションの
*UUID*とマウント先のディレクトリを確認できるけど、そのUUIDに対応する
ディスクパーティションは知ることができません。

`blkid`コマンドを使うとその情報を見ることができます。

/etc/fstab:

```bash
# cat /etc/fstab
# Created by anaconda on Thu Oct 24 16:16:48 2013
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=9aafaf91-7ed9-4b25-bd01-be39f6afb935 /                       ext4    defaults        1 1
UUID=38d14fa5-8772-44cd-8db2-550d4c3780d7 /boot                   ext4    defaults        1 2
UUID=bd336ec5-2011-4f4e-a503-08af5cfa829c swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
LABEL=/data01           /usr/local/data01       ext4    defaults        1 2
```

blkid:

```bash
$ blkid
/dev/vda1: UUID="38d14fa5-8772-44cd-8db2-550d4c3780d7" TYPE="ext4"
/dev/vda2: UUID="bd336ec5-2011-4f4e-a503-08af5cfa829c" TYPE="swap"
/dev/vda3: UUID="9aafaf91-7ed9-4b25-bd01-be39f6afb935" TYPE="ext4"
/dev/mapper/vg_data01-lv_data01: LABEL="/data01" UUID="6d33e756-e794-48d4-a4d2-7211f9b11e7c" TYPE="ext4"
/dev/vdb: UUID="xI3sFz-3Wn6-3BdM-KmTP-vftc-31HD-sgnvuq" TYPE="LVM2_member"
```
文字列を処理して三角形を表示する


今回は文字列を処理して簡単な三角形を描写してみたいと思います。

#概要

- 適当な文字列を準備し、それを1行ずつ長さを変更して表示させる。

#プログラム
##コード(1)
```go:triangle_1.go
package main

import "fmt"

func main() {
    //ベースとなる文字列
	s := "**********"

	for i := 1; i <= 10; i++ {
		fmt.Printf("%s\n", s[0:i])
	}

	for j := 10; j >= 0; j-- {
		fmt.Printf("%s\n", s[0:j])
	}
}
```

##コード(2)
```go:triangle_2.go
package main

import "fmt"

func main() {
	for i := 1; i <= 10; i++ {
		for j := 0; j < i; j++ {
			fmt.Printf("●")
		}
		fmt.Println()
	}

	for x := 0; x < 10; x++ {
		for y := 0; y < 10-x; y++ {
			fmt.Printf("●")
		}
		fmt.Println()
	}
}
```
2パターンのコードを考えてみた。コード(1)の方がシンプルだから、こっちのほうがいいのかな・・・。

##実行結果
```
$ go run triangle_1.go //triangle_2.goも同じ結果
*
**
***
****
*****
******
*******
********
*********
**********
**********
*********
********
*******
******
*****
****
***
**
*
```

#所感
文字列処理って色んなところで使えそうな感じですね。でも、対象の文字列が1文字でもズレたら結果が異なるので、使い方は注意しないといけなそう。
d3.jsのeaseメソッドにこだわってdataを生き生きと表現しよう

これは[Data Visualization Advent Calendar 2014](http://qiita.com/advent-calendar/2014/dataviz)の20日目の投稿です。

![world_rainy_clock_og_image.png](https://qiita-image-store.s3.amazonaws.com/0/29793/6e4f57cc-709f-caf4-c226-ac8b1f060021.png)

dataをplotするにあたって大変便利な[d3.js](http://d3js.org/)ですが、時系列などによる"変化"も表現できるように便利な関数がいくつか備わっています。

基本的にはtransitionやtweenメソッドで遷移させるのですが、その際の動きを指定するeaseメソッドをちょっとこだわって使うだけで魅力的な表現になります。

自身も先日、雨に関するつぶやきを表示する作品を発表したのですが、その中でも簡単に使用しています。(http://world-rainy-clock.herokuapp.com/)

#### 基本

```
svg.select("circle").transition()
    .duration(10)
    .ease("linear")
    .attr("cy", 10)
```

transitionに続いて、遷移にかける時間、動き、遷移後の状態などを指定していきます。
easeが動きの指定です。

easeの動きの指定は基本の以下に加えて、末尾に`-in`、`-out`,`-in-out`,`-out-in`つけるパターン(`linear-in`のようなもの)があります。

- linear
- quad
- cubic
- sin
- exp
- circle
- elastic
- back
- bounce

それぞれがどのような動きなのかは以下が参考になります。
http://bl.ocks.org/hunzy/9929724

#### 引数がとれるもの

先に紹介した動きの種類の中には引数をとって微調整できるものがあります。
例えば`elastic`です。

```
.ease("elastic", 1, 0.8)
```

`elastic`は遷移終わりにびよよ～んって感じで伸び縮みするのですが、`1`が振れ幅、`0.8`が弾力のような感じだと思います。このへんは調整しながらいい具合のを指定しました。

他にはどの動きに引数が指定できるかどうかは公式ドキュメンの以下をみてみてください。
https://github.com/mbostock/d3/wiki/Transitions#easing

(ちなみに上記の値は先に紹介した[作品](http://world-rainy-clock.herokuapp.com/) 内の地球の回転で使用しているものです。)

#### 発展

そして更にこだわりたい場合、easeには独自の関数もわたせます。
以下が参考になりますが、きっとbuild-inの動きでいいやとなる場合が多いのではないでしょうか..

http://bl.ocks.org/mbostock/5743979

#### 最後に

せっかくd3.jsには色々なeasingが備わっているので、何も考えず`linear`を指定するのではなく、皆さんのdataをより魅力的に見せる動きを指定してみてはどうでしょうか。
ではでは！
245cloud.comにMilkcocoaを入れてみた


# 245cloudとは

24分間だけ仕事して5分間だけ他の人と交換日記をするサービスです。
http://245cloud.com

「ポモドーロテクニック」という仕事術があるのですが
それをみんなでできるサービスです。


もともとは自分の会社がコンテンツ版GitHubみたいなサービス
「ラフノート」 https://ruffnote.com/
を開発していて

https://ruffnote.com/pandeiro245/245cloud/13475
みたいな感じでコンテンツ管理できます。っていう
デモをするために作ったのですが
http://attrip.jp/138267/
で取り上げてもらったりして
１日10時間やってくれる人が出てきたりして
幸せです。

# 245cloudの実装

parse.comやPubNubなどを使っていてサーバ側の実装はこれだけ。
https://github.com/pandeiro245/245cloud/blob/master/app.js

あとはクライアントJSのみで開発しています。
これでfacebookログインまで対応しているのですが
parse.comはfacebookに買収されているせいなのか、
Twitterログインができないのです...。
そういう意味でもMilkcocoaには超期待しています！
（それができたら全部Milkcocoaでできちゃうな！）

参考記事：http://thebridge.jp/2014/10/milkcocoa

# とりあえず入れてみた

https://github.com/pandeiro245/245cloud/commit/58ab6deeffb70abe24ac40ba30894570a16edfd3

こちら、下記のコードを自分の作業しているHTMLに貼り付けておくと
245cloud.comで集中するボタンを押したらその貼り付けられたページを
持つブラウザタブが強制的に開くという仕組みです。
（ちなみにchromeやsafariはJSのalertがそういう強制力あるけど
Firefoxはそうならないらしい）

```
<script src="//cdn.mlkcca.com/v0.2.8/milkcocoa.js"></script>
<script>
  var userId = '#{user.id}';
  var milkcocoa = new MilkCocoa("https://io-ui2n0gy4p.mlkcca.com:443");
  var spartaDataStore = milkcocoa.dataStore("sparta");
  spartaDataStore.on("push",function(data){
  if(data.value.userId == userId) {
    alert('24分間頑張ってください！');
  }
});
</script> 
```

本体側はだれかが誰かが集中するボタンを押したら
押した人のuserIdをMilkcocoaに送っています。
で、貼り付けられた側はuserIdが自分だったらalertを出すという仕組み。

これ自体はちゃんと動いたのですが
PubNubが動かなくなったのでPubNub部分までMilkcocoa化することに。

# PubNubで実装していたチャット部分もMilkcocoa化

https://github.com/pandeiro245/245cloud/pull/36/files
これだけの差分で動きました！

PubNubにおける`send`はMilkcocoaでは`push`なのと
送る時のパラメータの中でidは予約語だったので取り急ぎid2としました。
（後でリファクタリングする予定）

# タイミング見て本番反映予定

今本番反映するとPubNubバージョンで使っている人がチャットできなくなってしまうので
誰もいなくなったタイミングで

```
$ git push heroku pubnub-to-mlkcca:master
```
して本番反映予定。

本番反映後、
よろしければ使ってみてバグ報告等頂けると幸いですｗ

そして、前述しましたが
クライアントJSだけでのTwitterログイン対応、何卒よろしくお願いします！
Windows ACE の AccessMask（マスク）ビットフラグの対応関係

Windows のアクセス権を示す ACL, ACE のビットフラグ位置と、
その名前の位置関係がわかりにくいので一覧にしています。

複数のフラグがついた汎用の名前があることや、ディレクトリ用とフォルダ用で別々の列挙体があることなどが見て取れます。

一覧表示のための PowerShell スクリプトも添付しました。

<pre>
ListDirectory                  :        1  =                      1  =  0x00000001  ~  2^ 0
ReadData                       :        1  =                      1  =  0x00000001  ~  2^ 0
WriteData                      :        2  =                     10  =  0x00000002  ~  2^ 1
CreateFiles                    :        2  =                     10  =  0x00000002  ~  2^ 1
CreateDirectories              :        4  =                    100  =  0x00000004  ~  2^ 2
AppendData                     :        4  =                    100  =  0x00000004  ~  2^ 2
ReadExtendedAttributes         :        8  =                   1000  =  0x00000008  ~  2^ 3
WriteExtendedAttributes        :       16  =                  10000  =  0x00000010  ~  2^ 4
Traverse                       :       32  =                 100000  =  0x00000020  ~  2^ 5
ExecuteFile                    :       32  =                 100000  =  0x00000020  ~  2^ 5
DeleteSubdirectoriesAndFiles   :       64  =                1000000  =  0x00000040  ~  2^ 6
ReadAttributes                 :      128  =               10000000  =  0x00000080  ~  2^ 7
WriteAttributes                :      256  =              100000000  =  0x00000100  ~  2^ 8
Write                          :      278  =              100010110  =  0x00000116  ~  2^ 8
Delete                         :    65536  =      10000000000000000  =  0x00010000  ~  2^16
ReadPermissions                :   131072  =     100000000000000000  =  0x00020000  ~  2^17
Read                           :   131209  =     100000000010001001  =  0x00020089  ~  2^17
ReadAndExecute                 :   131241  =     100000000010101001  =  0x000200A9  ~  2^17
Modify                         :   197055  =     110000000110111111  =  0x000301BF  ~  2^17
ChangePermissions              :   262144  =    1000000000000000000  =  0x00040000  ~  2^18
TakeOwnership                  :   524288  =   10000000000000000000  =  0x00080000  ~  2^19
Synchronize                    :  1048576  =  100000000000000000000  =  0x00100000  ~  2^20
FullControl                    :  2032127  =  111110000000111111111  =  0x001F01FF  ~  2^20
</pre>


```ps1
foreach ($name in [enum]::GetNames([System.Security.AccessControl.FileSystemRights])) 
 { 
  $mask = [int][System.Security.AccessControl.FileSystemRights]$name;
  [String]::Format("{0,-30} : {1,8}  =  {2,21}  =  0x{1:X8}  ~  2^{3,2:0}", @(
     ($name ), # 名前
     ($mask), # 値
     ([System.Convert]::ToString(($mask), 2)), # 2進数文字列
     ([System.Math]::Log($mask,2) - 0.499) # 先頭ビット位置
     ))
 }
```
【Sass】IE8以上対応の縦横中央揃え【Mixin】

#縦横中央揃えもMixinで簡単指定
IE8以上対応のpositionを利用した縦横中央揃えです。**~~子要素のサイズ可変~~(*1)、レスポンシブにも対応**してます。
内容としては、バシャログさんで紹介されているこちらの方法をMixinに落とし込んでいるだけです。
http://c-brains.jp/blog/wsg/14/08/06-100100.php

*1 追記を参照してください。

##Howto
###Mixin
```scss:_mixin.scss
// * Vartical & Horizontal Centering (IE8 and above. use position.)
@mixin vh-center($axis:xy) {
	position: relative;
	& > * {
		position: absolute;
		@if $axis == x {
			left: 0;
			right: 0;
			margin-left: auto;
			margin-right: auto;
		} @elseif $axis == y {
			top: 0;
			bottom: 0;
			margin-top: auto;
			margin-bottom: auto;
		} @else {
			top: 0;
			left: 0;
			right: 0;
			bottom: 0;
			margin: auto;
		}
	}
}
```
こちらのmixinを入れてください。

###HTML
```html:index.html
<div class="vhCenter"><img src="http://placeimg.com/200/200/any" alt=""></div>
```

###Scss
**縦横センタリングの場合**

```scss:test.scss
.vhCenter {
	@include vh-center;
	width: 600px;
	height: 600px;
	background: #ccc;
}
```
**横のみセンタリングの場合**

```scss:test.scss
.vhCenter {
	@include vh-center(x);
	width: 600px;
	height: 600px;
	background: #ccc;
}
```
**縦のみセンタリングの場合**

```scss:test.scss
.vhCenter {
	@include vh-center(y);
	width: 600px;
	height: 600px;
	background: #ccc;
}
```
**センタリングしたい要素の親要素**にvh-centerを``@include``します。
デフォルトは縦横センタリングですが、``$axis``で軸を指定することで、
縦横どちらかのセンタリングも可能です。
**親要素にはwidthとheightも指定**してください。（レスポンシブの場合はwidth: auto;もしくは%で）

###Output CSS
**縦横センタリングの場合**

```css:test.css
.vhCenter { position: relative; width: 600px; height: 600px; background: #ccc; }
.vhCenter > * { position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; }
```
**横のみセンタリングの場合**

```css:test.css
.vhCenter { position: relative; width: 600px; height: 600px; background: #ccc; }
.vhCenter > * { position: absolute; left: 0; right: 0; margin-left: auto; margin-right: auto; }
```
**縦のみセンタリングの場合**

```css:test.css
.vhCenter { position: relative; width: 600px; height: 600px; background: #ccc; }
.vhCenter > * { position: absolute; top: 0; bottom: 0; margin-top: auto; margin-bottom: auto; }
```


##Remarks
IE8以上対応で、子要素のサイズ可変に対応した縦横中央揃えの実現方法としては、

* ``display: table;``,``display: table-cell;``
* ``display: inline-block;``内に高さを持った空要素を配置

~~などの方法がありますが、こちらのほうがデバイス対応を考えた際に柔軟なレイアウトが可能なのでオススメです。~~

##Postscript 2014/12/28
どうやら、一部の[置換インライン要素](https://w3g.jp/css/guide/target#replace)しか子要素のサイズ可変には対応していないようです。
具体的には、``img``、``iframe``タグなどです。それ以外の要素は``width``,``height``を指定しないと中央揃えになりません。
デバイス対応を考慮しつつ、あらゆるタグで子要素のサイズ可変に対応させたい場合、前述のこちらの方法を利用したほうが良いと思います。

* ``display: inline-block;``内に高さを持った空要素を配置

こちらもmixinにしてみましたので、参考にしてみてください。

###Mixin
```scss:_mixin.scss
// * Vartical & Horizontal Centering (IE8 and above. use :before.)
@mixin vh-center {
	text-align: center;
	&:before {
		content: "";
		display: inline-block;
		vertical-align: middle;
		height: 100%;
	}
	& > * {
		display: inline-block;
		vertical-align: middle;
	}
}
```
ロマネスコに見る幾何学


この記事は [Pepabo Advent Calendar 2014 - Qiita](http://qiita.com/advent-calendar/2014/pepabo) の20日目の記事です。 昨日は @kurotaky くんの [問題解決時に意識していることをまとめてみる](http://blog.mo-fu.org/entry/2014/12/19/130059) でした。

## はじめに
こんにちは。
普段はGMOペパボで、[カラメル](http://calamel.jp/)のデザインやディレクターぽいことをしています。

突然ですが、私はブロッコリーが大好きです。(一番好きなのはビールです)
先月、社内で行ったLT大会ではブロッコリー愛について熱く語らせていただきました。(一体誰得なのか)

## と、いうことで今回のお題は
私は非エンジニアなので、勢いで参加したアドベントカレンダーのネタをどうしようか悩んだのですが、好きな事ならがんばって書けそうなので、今回のお題はブロッコリーに関するお話にしました。

「ロマネスコ」という野菜をご存知でしょうか？

<img src="http://upload.wikimedia.org/wikipedia/commons/archive/b/b5/20130210212825%21Romanesco_Brassica_oleracea_Richard_Bartz.jpg" width="400">

ドリルのような形状で、なんじゃこの見た目という感じですが、
ブロッコリーやカリフラワーの仲間です。
食感的にはカリフラワーに似ています。

## 規則正しく並ぶ花つぼみ
ロマネスコの花つぼみ(ドリルの部分)は頂点に向かって螺旋状に配置され、その形状はフラクタル図の幾何学模様を表しています。

フラクタル図とは、ざっくり言うと、拡大しても拡大しても同じ模様が繰り返される図形のことです。

ドリルの部分を拡大すると、小さいドリルがあり、さらにその小さいドリルの中にはもっと小さいドリルがあり…
そのような、無数のドリル型の花つぼみで、ロマネスコは形成されています。

さらに、そのドリルの配置はフィボナッチ数列に従っています。
フィボナッチ数列とは、隣り合った数字を足すとその隣の数字になり、その比がどんどん黄金比に近づいていくというものです。

## 規則性に感じる美しさ
ある規則に基づいた配置や物事は、身の回りにたくさんありますが、デザインにも当てはまります。
ロゴ1つを作るにしても、グリッドやルールに従って形を作っていきます。
Appleのリンゴマークも、フィボナッチ数や黄金比に基づいてデザインされています。

![appleロゴ](https://qiita-image-store.s3.amazonaws.com/0/61428/cf1d792b-c90e-e698-5621-c95a0e02429f.jpeg)

ロゴの話も好きなので、それはまた別で記事にしたいと思います。

## さいごに
人が見てきれいだと感じるにはどのようにしたら良いか、日々デザインする上で意識しています。
このような自然界に見られるルールを知ることなんかも、ヒントになるかもしれないですね。

明日は [tsuchikazu@github](http://qiita.com/tsuchikazu@github) です！

## おまけ
フラクタルっぽい壁紙つくりました ( ･ㅂ･)و ̑̑ ｸﾞｯ 
タイル上に配置するとつながります。
![bg_fractale.gif](https://qiita-image-store.s3.amazonaws.com/0/61428/863fa99a-3ee1-bdf1-b6ae-6b5c684ca8a2.gif)
gulp iconfontではまった！そしてその後…

この記事は[Frontrend Advent Calendar 2014](http://qiita.com/advent-calendar/2014/frontrend)の20日目の記事です。

最近gulp iconfont を使っていてハマってしまった…
ってことがあったのでハマったとことどう対応したかを書きます！

##font-smoothingにはまった…！
アイコンが綺麗に表示されるようにfont-smoothingを使っていたのですが、
Android2.3系のある特定のスマートフォンでアイコンがまったく表示されなくなりました…

だからfont-smoothingを使わないようにしました。（iOSは問題なかったのでいれてます）

##キャッシュにはまった…！
最初は気づかなかったのですが、アイコンフォントを追加するたびにキャッシュが残ってなかなか更新されなくなるというところにハマってしまいました…

だからアイコンを追加して更新するごとにCSS側にクエリパラメータをいれるようにしました。

```
@font-face {
  font-family: "icon";
  src: url("files/fonts/icon.eot?c=1419063630662");
  src: url("files/fonts/icon.eot?#iefix&c=1419063630662") format("embedded-opentype"),
    url("files/fonts/icon.woff?c=1419063630662") format("woff"),
    url("files/fonts/icon.ttf?c=1419063630662") format("truetype"),
    url("files/fonts/icon.svg#icon&c=1419063630662") format("svg");
}
```
Date.now();を使って数値を生成してるので、常に更新するたびにフォントを読み込みなおしてくれます。

##コードの領域にはまった…！
gulp iconfontは文字コードがデフォルト0xE001から始まります。
しかし、文字コードが0xE001から始まる場合、
Android4系のある特定のスマートフォンでその機種特有の絵文字が表示されてしまいました…

だからgulp iconfont のoption のstartCodepoint でスタートする文字コードを「0xE001」から「0xF001」に変更しました。

しかし、gulp iconfontで生成したcssテンプレートになぜか10進数で文字コードが書き出されるという現象が…

そのあたりの問題は下記のリンクの中にある16進数にコンバートしてくれるコードを使えば問題なく書き出せるようになります。
[https://github.com/nfroidure/gulp-iconfont/issues/16](https://github.com/nfroidure/gulp-iconfont/issues/16)

##結果…！
これで問題なくアイコンフォント使えるはずだ！！!
そんなわけで下記のGitコードを公開しています。

[タスク](https://github.com/tomo-e/gulp_iconfont_test/blob/master/gulpfile.js)

[CSSテンプレート](https://github.com/tomo-e/gulp_iconfont_test/blob/master/template/icon.css)

[gulp iconfont](https://github.com/nfroidure/gulp-iconfont) のおかげでスマートフォン開発が楽に進むことができました！
さらに上記を意識してればもっと楽に…なるはず！

次の[Frontrend Advent Calendar 2014](http://qiita.com/advent-calendar/2014/frontrend)はすぎもっさん！にバトン渡します！
ワクワク！ワクワク！
Swiftでjson取得サンプル

環境：Xcode 6.1.1

取得jsonは以下の様

```
{"names":["\u30ea\u30f3\u30b4","\u30aa\u30ec\u30f3\u30b8","\u30d6\u30c9\u30a6"]}
```

```swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let URL = NSURL(string: "http://localhost/test.json")
        let request = NSURLRequest(URL: URL!)
        let connection: NSURLConnection = NSURLConnection(
            request: request,
            delegate: self,
            startImmediately: false)!
        
        NSURLConnection.sendAsynchronousRequest(request,
            queue: NSOperationQueue.mainQueue(),
            completionHandler: didComplete)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    func didComplete(res: NSURLResponse!, data: NSData!, error: NSError!){
        let json: NSDictionary = NSJSONSerialization.JSONObjectWithData(data,
            options: NSJSONReadingOptions.AllowFragments, error: nil) as NSDictionary
        
        let names: NSArray = json.objectForKey("names") as NSArray
        
        for var i = 0; i < names.count;i++ {
            NSLog(names[i] as String)
        }
    }
}
```
HW保守でよく使うcommandまとめ

HW保守周りで使用するcommandを列挙していく    
追記アレば随時。  


# omreport/omconfig

```bash
# How to install 
$ wget -q -O - http://linux.dell.com/repo/hardware/latest/bootstrap.cgi | bash
$ yum install -y srvadmin-base srvadmin-storageservices srvadmin-omcommon
$ /opt/dell/srvadmin/sbin/srvadmin-services.sh start

# Alert Logかくにん
$ omreport system alertlog

# 故障確認
$ omreport chassis

# 故障詳細確認
$ omreport chassis Memory/nics/fans/pwrsupplies/-?

# RaidCard電源確認 
$ omreport storage battery

# 電源確認 
$ omreport chassis pwrsupplies

# controller確認
$ omreport storage controller

# vdiskかくにん
$ omreport storage vdisk controller=0

# pdiskかくにん
$ omreport storage pdisk controller=0 | egrep '^(Name|State)' 

# ランプ付けたり消したりヤーツ
$ omconfig storage pdisk action=blink/unblink controller=0 pdisk=[id]

```


# MegaCli

```bash
# How to install
$ rpm -Uhv https://ginernet.com/downloads/MegaCli-8.07.14-1.noarch.rpm

# pdiskかくにん
$ MegaCli64 -PDList -aALL

# vdiskかくにん
$ MegaCli64 -LDInfo -Lall -aALL
[‘Primary-0, Secondary-0, RAID Level Qualifier-0′] = RAID-0
[‘Primary-1, Secondary-0, RAID Level Qualifier-0′] = RAID-1
[‘Primary-5, Secondary-0, RAID Level Qualifier-3′] = RAID-5
[‘Primary-6, Secondary-0, RAID Level Qualifier-3′] = RAID-6
[‘Primary-1, Secondary-3, RAID Level Qualifier-0′] = RAID-10

# ランプ付けたりするヤーツ。ﾋﾟｶｰって光る
$ MegaCli64 -Pdlocate start/stop physdrv[E:S] -a0

# Diskオフラインヤーツ
$ MegaCli64 -PDOffline -PhysDrv[E:S] -a0

# Disk抜く前の削除のおまじないヤーツ・・・？
$ MegaCli64 -PDPrpRmv -PhysDrv[E:S] -a0

# Rebuildの情報確認
$ MegaCli64 -PDRBLD -showprog -physdrv [E:S] -a0

# Alert 止める
$ MegaCli64 -AdpSetProp AlarmSilence -aALL

# Disk情報イッキ見、便利d
$ MegaCli64 -PDList -a0 | egrep '^(Slot|Firm|Link)'

# DiskのerrorCount確認したい
MegaCli64 -PDList -aAll |grep 'Error Count'

# MegaCli log
$ MegaCli64 -FwTermLog -Dsply -aALL -nolog

```

# ipmitool

```bash
# How to install 
$ yum install OpenIPMI.x86_64 OpenIPMI-tools.x86_64
$ modprobe ipmi_devintf
$ modprobe ipmi_si

# 鯖の情報
$ ipmitool lan print

# System_log
$ ipmitool sel list/elist

# ハードの状態見るヤーツ
$ ipmitool chassis status
$ ipmitool sdr elist

# alert clear
$ ipmitool sel clear
```

# dmidecode


```bash

# 機種名
$ dmidecode -s system-product-name

# Serial
$ dmidecode -s system-serial-number 

# システム情報系
$ dmidecode -s

# デバイスごとの情報系
$ dmidecode -t

```

# sas2ircu

```bash
# Disk確認
$ sas2ircu 0 DISPLAY | grep State

```

# arcconf

```bash
# 情報表示 アダプタ情報のみ/論理ドライブ情報のみ/物理デバイス情報のみ/maxCache の情報のみ/all
/usr/StorMan/arcconf getconfig <Controller#:だいたい１> AD/LD/PD/AL

# raid ok?
/usr/StorMan/arcconf getconfig <Controller#> | grep 'Status of logical device'

# ﾋﾟｰﾋﾟｰウルサイ時に音止めたい
/usr/StorMan/arcconf setalarm <Controller#> silence

# 壊れてるDiskいないかな？
/usr/StorMan/arcconf getconfig <Controller#> | egrep '(Device #|Device\(|State|S.M.A.R.T)'

# ﾋﾟｶｰって光らせる。上のcommandでchannel id確認してから打ってね
/usr/StorMan/arcconf identify <Controller#> device <Channel#> <ID>
```


# nvme-cli

```bash
# how to install
git clone https://github.com/linux-nvme/nvme-cli.git 
cd nvme-cli/
make && make install

# show smart log
nvme smart-log /dev/nvme0n1p1 


```
簡単に使えて精度の良い機械学習ライブラリを作ったよ

# はじめに

こんにちは。皆さんD言語使っていますか？
今回は [liblinear のような教師あり線形分類器のライブラリ, libarow](https://github.com/kazoo04/libarow-d)を作ったので紹介します。

# 特長

- 収束が早い
- 精度が良い(liblinearより良い)
- パラメータが少ない（1個）
- そのパラメータもデフォルトの値を使っておけば大抵OK
- オンライン学習（すべてのデータを一度に読む必要がなく、省メモリ）

# アルゴリズム

以下の更新式にしたがって、各特徴の分散を小さくしつつ、与えられた教師データを正しく分類できるようにし、かつなるべく今までの分布に近い形で更新していきます。

```math
(\mathbf{\mu}_{t+1}, \Sigma_{t+1}) =
arg~min_{\mathbf{\mu}, \Sigma}
D_{KL} (\rm N(\mathbf{\mu}, \Sigma) || \rm N(\mathbf{\mu}, \Sigma))
+ \frac{1}{2 \gamma} L(\mathbf{x}, y, \mu)
+ \frac{1}{2 \gamma} L(\mathbf{x}^T \Sigma \mathbf{x})
```

詳しくはここを参照してください。[オンライン線形分類器とSCW](http://kazoo04.hatenablog.com/entry/2012/12/20/000000)

# パフォーマンス

[news20.binary](http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary.html)の約2万のデータのうち、15000件を教師データ、残りをテストデータにして、正答率 (accuracy) = 97.2% くらい。
これはデフォルトでの結果なので、AROWに渡すハイパーパラメータを変えるともっと良くなると思います。
あと1回だけデータを読ませるのではなく何周かさせるとわずかですが良くなるので、ちゃんとチューニングすれば98%くらいまではいけるんじゃないでしょうか。

実行時間はデータの読み込み時間を除くと1秒未満です。SVMと比べるとさすがに早いですね。

ただ、特徴ベクトルを連想配列で扱っているので、ベクトルが高次元かつ密だと遅いかもしれません。

# おわりに

パラメータが少なく、またパラメータ変化に敏感でもなく、オンライン学習が可能で精度が良い、となると利用できるシーンは多いかと思います。上記は自然言語処理系のタスクでしたが、特徴量がもっと dense な画像処理にもこの AROW を使って良い感じの成果が得られたりしているので、もっと流行ってもいいアルゴリズムなのではないでしょうか。

今後の予定としては以下の様なものを考えています。

- 生テキストを食わせてN-gramや形態素解析を通して素性を作る機能
- 画像を食わせられるようにする
- 多値分類
- 並列化
- 正則化オプション
[Swift] UIButtonでテキストを装飾する╭( ・ㅂ・)و ̑̑ ｸﾞｯ !

### 経緯

華やかなボタンを作りたい╭( ・ㅂ・)و ̑̑ ｸﾞｯ !

### コード

早速ですが、Playgroundでコーディングをしてみました！

```swift
// Playground - noun: a place where people can play

import UIKit

let button = UIButton(frame: CGRectMake(0, 0, 100, 100))


// NG: button.titleLabel!.text = "like"
button.setTitle("like", forState: UIControlState.Normal)


// NG: button.titleLabel!.textColor = UIColor.orangeColor()
button.setTitleColor(UIColor.orangeColor(), forState: UIControlState.Normal)

button.titleLabel!.font = UIFont(name: "Helvetica-Bold",size: CGFloat(30))

button.layer.masksToBounds = true
button.layer.cornerRadius = 50.0
button.backgroundColor = UIColor.blueColor()
```
※ コードからは、╭( ・ㅂ・)و ̑̑ ｸﾞｯ ! の絵文字を外しています。

### 成果物

![like.png](https://qiita-image-store.s3.amazonaws.com/0/9760/01bf5e18-a283-7e06-2093-20c6127eaa20.png)

うはｗｗｗｗｗｗｗださっｗｗｗｗｗｗｗ

### まとめ

**「色も変わらんし、フォントも変わらんし(ﾟДﾟ)ﾊｧ?」**

と小一時間嘆いている、わたしにそっくりなそこのあなた！

#### これは使うな

```swift
button.titleLabel!.text = "like"
button.titleLabel!.textColor = UIColor.orangeColor()
button.titleLabel!.shadowColor = UIColor.redColor()
```

#### これを使え

```swift
button.setTitle("like", forState: UIControlState.Normal)
button.setTitleColor(UIColor.orangeColor(), forState: UIControlState.Normal)
button.setTitleShadowColor(UIColor.redColor(), forState: UIControlState.Normal)
````

**公式ドキュメントに使うなって書いてあるやん…。**

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIButton_Class/index.html#//apple_ref/occ/instp/UIButton/titleLabel

````
Although this property is read-only, its own properties are read/write. Use these properties primarily to configure the text of the button. For example:

Do not use the label object to set the text color or the shadow color. Instead, use the setTitleColor:forState: and setTitleShadowColor:forState: methods of this class to make those changes.

The titleLabel property returns a value even if the button has not been displayed yet. The value of the property is nil for system buttons.
````

setTitle についても書いて欲しかったな＿|￣|○
setTitleShadowColor こっちも使うなってさ！

記述的に、StoryBoardとかで配置したボタンを後から変更する分には大丈夫そう？
分かり次第、追記しておきます╭( ・ㅂ・)و ̑̑ ｸﾞｯ !
コマンドラインでGitHubにプルリクエストを送る


- [github/hub](https://github.com/github/hub)

## 1. インストール

1. hubコマンドをインストールします。

		brew install hub --HEAD

2. gitコマンドでhubコマンドの機能を使えるようにします。

	`.zshrc`等に以下を追記します。

		eval "$(hub alias -s)"

## 2. clone

プルリクエストを送りたいリポジトリをcloneします。

	git clone [Githubユーザ名]/[Githubリポジトリ名]

## 3. checkout

作業用のブランチを作成して、そのブランチに移動します。

	cd [cloneしたGitHubリポジトリ名]
	git checkout -b [作業用ブランチ名]

## 4. 開発

ファイルを修正して保存します。

## 5. commit

修正したファイルをaddしてcommitします。

	git add [修正したファイル名]	
	git commit -m "[コメント]"

## 6. fork

自分のリポジトリとしてforkします。

	git fork

## 7. push

forkした自分のリポジトリにpushします。

	git push [自分のGitHubユーザ名] [作業用ブランチ名]

## 8. pull-request

現在いるブランチからオリジナルのGitHubリポジトリにプルリクエストを送ります。

	git pull-request

プルリクエスト用のコメントを入力して閉じればプルリクエストされます。

- [git pull-requestのオプション](https://github.com/github/hub#git-pull-request)


以上
Deckset便利話

# Decksetとは的な

この前LTをする機会があったのだが、できるだけ楽して資料を作成したかった。
markdownで書いてるメモ書きから資料をパパっと作ってくれたら更にいいなーなんて思ってググってたら、  [Deckset](http://www.decksetapp.com/)なるものを知った。  

# 使い方

基本的にMarkdown形式と[一緒](http://www.decksetapp.com/cheatsheet/)
マークダウンで何かモノを書いたことがある人だったら自然と使えると思う、

# 例 

百聞は一見にしかず的な感じで例を出してみる。  
例えばこんな感じで記述してみると  

```
# test

---

#[fit]aaaaaa

---

# **_testtest_**

```

こんな感じの資料がサクッとできる  
![スクリーンショット 2014-12-20 21.22.22.png](https://qiita-image-store.s3.amazonaws.com/0/41727/2195c636-e687-e404-df26-b8c9c19b4de8.png)  

ワー便利ヾ(:3ﾉｼヾ)ﾉｼ  


# 参考までに
自分がLTした時のfileはここに置いてますす

[実際に書いたMarkdown](https://github.com/kakerukaeru/MySQLCasualTalks7/blob/master/ContinuousRestore.md)  
[出来上がった資料](https://speakerdeck.com/kakerukaeru/continuous-restorehefalsedao)


# その他
他にも

- [remark.js](https://github.com/gnab/remark)
- [Swipe](https://www.swipe.to/markdown/)
- [reveal.js](https://github.com/hakimel/reveal.js/)

とかの選択肢が合ったんだけど、
Documentが豊富なのとか導入が楽そうなDecksetに落ち着いた。
gitでpush,commitせずにhookscriptを実行する


gitでフックスクリプトを作成しているとき、そのスクリプトの動作を確認したくなるときがあります。

たとえば、下記のような状態だったとします

■確認したいhookscript
　 **post-update**(pushできた後の動作を確認したい)

■対象のリポジトリ
　 **hogehoge.git**

■対象のブランチ
　 **test-branch**


そのようなときは、hogehoge.git リポジトリのルートディレクトリ(たとえば、 /var/git/hogehoge.git 直下) に移動して

```sh
./hooks/post-update refs/heads/test-branch
```

とすれば test-branch がpushされたときと同じ post-update の動作を確認することができます。
Pythonのリストインデックスについて(Paiza POH Lite4:ミッション３)

![poh_lite4_3.png](https://qiita-image-store.s3.amazonaws.com/0/41385/5db2c62f-2bab-8d56-7a8c-3c2c44797401.png)

Paiza POH Lite4のミッション３にて、
１：入力値から、list = [4,5,1,10,3,4,1]というリストを作り、
２：このリストから上図のように３つの要素を抽出・合計し、ひとつのまとまりを"sum_list"というリストに格納します(sum_list = [10,16,14,17,8]のように...)

質問は２の部分についてですが、
sum_list[0:3] #10
sum_list[1:4] #16
sum_list[2:5] #14
　　　・
　　　・
　　　・
というイメージなのですが、リストのインデックスだけを加算インクリメントして、それぞれの範囲指定された"list"の要素の合計値を抽出してするプログラムはPythonでどのように書くのでしょうか？

あるいは、インデックスから合計値を抽出するというアプローチ以外に、上図の合計値を抽出・格納する方法はありますでしょうか？
UNIXコマンドで、sortでファイルを上書きする

最初は

```zsh
sort -u hoge > hoge

sort hoge | uniq > hoge
```

とかでトライしたのですが、だめです。sortコマンドより先に、'> hoge'でファイルが上書きされてしまうようで、結果、hogeは空になってしまいます。

以下の方法で、上手くいきました。

```zsh
sort -u hoge -o hoge

# -o, --output=FILE         write result to FILE instead of standard output
```
Google スプレッドシートでビットコインの価格を表示する方法

以下に移行しました<br><a href="http://block-chain.jp/tech/bitcoin-price-on-google-spreadsheet/" title="Google スプレッドシートでビットコインの価格を表示する方法">Google スプレッドシートでビットコインの価格を表示する方法</a>
エンジニアとしてのおもてなし

![男の娘エンジニア.jpeg](https://qiita-image-store.s3.amazonaws.com/0/63627/6790c9c5-caa5-ea32-edf2-4f354fdb2201.jpeg)


これは ドリコム[Advent Calendar](http://www.adventar.org/calendars/518) 20日目の記事です。
19日目は asiram さんの [Unity2Dのこれだけは覚えておけ！集](http://qiita.com/asiram/items/3b2875731efdc34bc65a) です。

***
はじめましてshioriharaです、社内では団長と呼ばれています。
新卒でドリコムに入社して気づいたら３年目でした。

現在はとあるアプリのサーバーサイドエンジニアやってます。


新卒入社で３年目なので、17日目に担当だった係長（１年目）と19日目に担当だったasiram（アダ名は課長）（２年目）に３年目の威厳を示すべく、
プロパーとして入社した者にしか語れないことを語っていこうと思いました。

※団長＞課長＞係長　（態度のでかさ


が、ドリコム好きすぎて社内イベントとかサークルとかドリコムっぽい活動関連のことをやりすぎてて書き出すとキリがなさそうなんでやめておきます。

ちなみに社員イベント、社員総会ムービー制作、社内ＬＴ大会などによくからんでます。
社内サークルはダンスサークルとカラオケサークルのキャプテンやってて、あと他サークルに5個くらい所属してます。

***

さて本題。

わたしが今いるチームはアプリの制作時からいたのですが、
その時からずっとカスタマーサポート（CS）関連部分に大きく関わらせてもらったのでそのへんの話をしようと思います。


##管理画面作成
ユーザーの情報が見れるページですね。
アプリ用のwebサーバーとは別に1台サーバーをたてています。
コンソールから調査したり補てん作業が必要な時などもこのサーバーを使います。


管理画面を作るにあたって。
まずCSスタッフが作成してくれた欲しいページのまとめを元にＭＴＧ


ユーザー情報

| データ | 説明 |
|:-----------|:------------|
| ユーザーコード | ユーザーのコード |
| ユーザーレベル | ユーザー自身のレベル |
|・・・|・・・|

デッキ情報

| データ | 説明 |
|:-----------|:------------|
| 名前 | カードの名前 |
| レベル | カードのレベル |
|・・・|・・・|

合成履歴

| データ | 説明 |
|:-----------|:------------|
| 種類 | 合成の種類 |
| 合成元キャラID | 合成のベースにしたキャラクターのID |
| 合成元キャラレベル | ベースキャラのレベル（合成前→合成後などまとめて見れるとよい）|
|・・・|・・・|


こんな感じのやつです
（自分でさっき書いたので実際のものとは違います）


これをもとに顔を合わせて話しながら実際に保管しているデータから欲しい情報を表示できるか、抜けがないかを確認します。


運用が始まったあとも、機能が追加された際には管理画面に情報を追加することを忘れないようにしています。
どういう形で情報が追加されたかをリリース前に事前にCSスタッフに共有しておくとスムーズです。



##履歴保存・調査
というわけで管理画面でユーザーのデータを表示するわけですが、お問い合わせでこんなのが来たりするんですね

「カードが勝手に消えたんだけど？？？」
「ふえぇ、お金ふえなかったよぉ」

そんなときに必要になるのが履歴です。

「よろしい、ならば合成履歴全部保存だ」
「ユーザーのアプリ内通貨の変動履歴も保存しよう」
そうしたくなります。


が。むりです。


データ量が膨大になってしまいます。


現在とっている履歴系のテーブルはパーティション切って定期的に削除していますが、
それでも追い付かないと判断されたものはＤＢからテーブルを削除しました。


DB全体のデータ量はリリース前に容量計算しました。
1年後想定DAU： 10
1年後想定総合install：100

| tablename | 1レコードあたりの容量 | 想定最大レコード数 | 想定デイリー増加レコード数 | 想定最大容量 | 想定デイリー増加容量 | 備考 | 
|:-----------|:------------|:------------|:------------|:------------|:------------|:------------|
| users | 2 | 100 |  | 200 |  |   |
| cards | 3 |  | 20 |  | 60 | 1ユーザー2レコード増加想定 |
| composition_histories | 4 |  | 50 |  | 200 | 1ユーザー5レコード増加想定|
|・・・|・・・|・・・|・・・|・・・|・・・|・・・|・・・|
| 合計 |  |  |  | 200 | 260 |

こんなかんじ。
（さっき自分で書いたので実際のものとは異なります）

これでやばい容量になった履歴系はテーブル削除しました。
なので管理画面で履歴みれません。



履歴をみれません・・・


調査できないと思った？？残念！logでとってます


本来データ分析目的でユーザーの行動を細かくlogに出しているのですが、
そいつから履歴を出して調査してます。

データ分析目的なので今後はCS用のlogを出すようにしてそれを見れるツールを用意しようという動きが社内全体としてあります。
それまではデータ分析の方にお願いしてほしい部分の履歴データを出してもらっています。


##だいじだと思ってること
* チームメンバーという意識

最近CSスタッフから「◯◯チーム(私のいるチーム)はとてもやりやすい」と言われます。
「CSスタッフもチームのメンバー」という意識を持っているので、そこからそういった感想が出てきたのかなと思ってます。

問い合わせ返信の方針を顔を合わせて一緒に対応することはもちろんですが、
アプリ上のお知らせはCSスタッフのチェックを通してから出したり、チームの飲み会にはCSスタッフにも参加してもらったりして、開発チーム側に混ぜ込むような感じになってます。

* CSの重要性

不具合で問い合わせた方がCS対応の内容によってずっと遊び続けてくれるユーザーになったりその場でもうログインしなくなってしまったりします。
今後もそういう意識をずっと忘れずにいたいですね。



##最後に

わたし、社内では貴重な女子エンジニアです☆～(ゝ。∂)☆～(ゝ。∂)
女子もエンジニアとしてエンジョイしながら最高のものづくりができるんだよって事例を作れたらなと思っています(♡´ω｀♡)

女子エンジニアまってます♪ฅ•ﻌ•ฅ
個人的にはよしたかゆりこ似の女子が来てくれるとものすごくテンションあがってうれしいで٩(๑>∀<๑)۶


明日は21日目の[takao.uchikawa](http://www.adventar.org/users/5055)さんです。
お楽しみに(((o(*ﾟ▽ﾟ＊)o)))
android desk top on vmware on win７


記載に古い部分があれば、ご指摘下さい。

１．vmware　ＤＬ　＆　install
https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/4_0

2.最新版isoをＤＬ
http://www.android-x86.org/download

3.新規仮想マシン作成で、isoイメージを指定する。
![kobito.1419072657.809356.png](https://qiita-image-store.s3.amazonaws.com/0/33317/ae6f0163-8cc4-9f87-f5b1-0a8fd1260801.png "kobito.1419072657.809356.png")

4.仮想マシン起動
![kobito.1419072719.484006.png](https://qiita-image-store.s3.amazonaws.com/0/33317/d01785ad-811e-6b80-3922-7c7b1c35a3f8.png "kobito.1419072719.484006.png")

５．wifiはskip、gmailもスキップした設定で、あっさり起動
![kobito.1419072879.072430.png](https://qiita-image-store.s3.amazonaws.com/0/33317/cd8623e7-e488-3994-e594-b2fbc4dd5f24.png "kobito.1419072879.072430.png")