OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】BEMのmodifier付きのclassを生成するhelperを作る


## はじめに

特定の条件の時だけテキストの色を赤色にしたいのように、動的にBEMのmodifier付きのクラスを追加したいということはよくありますよね。
結構頻繁にあるなと思ってmodifier付きのclassを生成するhelperを作成しました。

今回は、Railsですがどのプロジェクトでも応用はきくとおもいます。

## コード

早速コードにうつります。


```application_helper
def class_with_modifier(class_name, class_modifier)
  "#{class_name}--#{class_modifier}" if class_modifier.present?
end
```

実際にはこういう感じで使います。

```
.hoge class="class_with_modifier('hoge', 'red')"
```

さて、なぜ

```
if class_modifier.present?
```

があるのかと思うかもしれないですが、別のhelperを作った時に、ある条件のときはmodifierをつけないで返すというようなことをしたいときがしばしばあったためです。
もしifの条件がないと ```hoge--```みたいに意味のないclassが生成されるのが嫌だなと感じたので条件を追加しています。

## 終わりに

意外に使用頻度が高くてDRYにしておきたいなと思ったので、この機会にまとめてみました！
以上参考になれば幸いです！
MySQL5.6の初期設定


##MySQLの起動

```bash:Terminal
$ sudo service mysql start
Starting MySQL.. SUCCESS!
```

##MySQLの自動起動設定

```bash:Terminal
$ sudo chkconfig mysqld on
```

##MySQLのrootパスワード確認
MySQL5.6からは、rootパスワードを設定し直さないと、MySQLにログインは出来ても、その後の操作が一切何もできないようになりました。
以下のコマンドで初期設定のパスワードを確認することができます。
以前のバージョンからアップデートした方など、仕様変更にご注意ください。

```bash:Terminal
$ cat /root/.mysql_secret
# The random password set for the root user at Thu Feb  7 14:24:54 2013 (local time): XXXXXXXX
```

##MySQLの初期設定

```bash:Terminal
$ mysql_secure_installation
```

rootパスワード設定や匿名ユーザーの削除、リモートからのrootログイン禁止など、いくつかの質問を聞いてきますが、全て「空ENTER」で進んでいきます。
MySQL5.6のインストール方法


サーバー上で何かしらのサービスを運用する際、データベースは欠かせません。
WordPressやRedmine、OpenPNEなど、データベースを利用するものは山のようにあります。
普通にyumインストールすることもできるのですが、バージョンが5.1になってしまい、セキュリティ面や処理速度などの面において、少し都合が悪いです。

##RPMパッケージをダウンロード

```bash:Terminal
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-client-5.6.27-1.el6.x86_64.rpm
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-compat-5.6.27-1.el6.x86_64.rpm
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-server-5.6.27-1.el6.x86_64.rpm
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-devel-5.6.27-1.el6.x86_64.rpm
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-5.6.27-1.el6.x86_64.rpm
```

##MySQL本体をインストール
パッケージ依存関係の都合により、2回に分けてインストールします。

```bash:Terminal
$ sudo yum install MySQL-{client,devel,server,shared-compat}-5.6.27-1.el6.x86_64.rpm
$ sudo yum install MySQL-shared-5.6.27-1.el6.x86_64.rpm
```
WordPress利用開始前のデータベース準備


##データベースとユーザーの作成
データベースを作成します。今回作成するデータベースの名前は"wpdb"としました。

```sql:SQL
create database wpdb;
```

続いてデータベースを操作するユーザーを作成します。今回はユーザー名を"wpadmin"としました。

```sql:SQL
grant all on wpdb.* to ‘wpadmin'@'localhost' identified by ’password';
```

与える権限は、wpdbデータベースに対して「all」です。
上記では例としてパスワードを"password"としていますが、適切なパスワードに変更して設定してください。
cassandra-loaderでbulk load

# install

```
git clone https://github.com/brianmhess/cassandra-loader.git
cd cassandra-load
gradle loader
```

# load動作確認

```make_test_csv.sh

#/bin/sh
for i in $(seq 1 100000) ; do
   echo "$i,$((i * 10))"
done
```

```
make_test_csv.sh > test.csv
cat test.csv
>1,10
>2,20
>3,30
>....
```

## bulk insert
```
build/cassandra-loader -f test.csv -schema "test_from_spark.fun(k,v)" -host 127.0.0.1
```

## cqlshで確認
```
cqlsh

cqlsh:test_from_spark> select * from fun limit 10;

 k    | v
------+-------
 4317 | 43170
 3372 | 33720
 1584 | 15840
 7034 | 70340
 9892 | 98920
 9640 | 96400
 9067 | 90670
 4830 | 48300
 2731 | 27310
 5056 | 50560

(10 rows)

```

## spark-shell上で確認
```

scala> val t = sc.cassandraTable("test_from_spark", "fun");
t: com.datastax.spark.connector.rdd.CassandraTableScanRDD[com.datastax.spark.connector.CassandraRow] = CassandraTableScanRDD[3] at RDD at CassandraRDD.scala:15

scala> t.count
res6: Long = 10000


scala> t.collect.slice(1, 10).foreach(println)
CassandraRow{k: 9067, v: 90670}
CassandraRow{k: 4830, v: 48300}
CassandraRow{k: 2731, v: 27310}
CassandraRow{k: 5056, v: 50560}
CassandraRow{k: 6428, v: 64280}
CassandraRow{k: 2713, v: 27130}
CassandraRow{k: 769, v: 7690}
CassandraRow{k: 9973, v: 99730}
CassandraRow{k: 1863, v: 18630}


scala> t.take(10).foreach(println)
CassandraRow{k: 9640, v: 96400}
CassandraRow{k: 9067, v: 90670}
CassandraRow{k: 4830, v: 48300}
CassandraRow{k: 2731, v: 27310}
CassandraRow{k: 5056, v: 50560}
CassandraRow{k: 6428, v: 64280}
CassandraRow{k: 2713, v: 27130}
CassandraRow{k: 769, v: 7690}
CassandraRow{k: 9973, v: 99730}
CassandraRow{k: 1863, v: 18630}
```
PHP5.6のインストール


##PHPのパッケージインストール

```bash:Terminal
$ yum install --enablerepo=remi --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-pecl-xdebug phpMyAdmin
```

##php.iniの設定変更

```PHP:php.ini
[ 202行目]  short_open_tag = On
[ 366行目]  expose_php = Off
[ 375行目]  max_execution_time = 300
[ 452行目]  error_reporting = E_ALL & ~E_NOTICE
[ 663行目]  post_max_size = 20M
[ 811行目]  upload_max_filesize = 20M
[ 889行目]  date.timezone = "Asia/Tokyo"
[1660行目]  mbsting.language = Japanese
[1667行目]  mbstring.internal_encoding = UTF-8
[1675行目]  mbstring.http_input = UTF-8
[1685行目]  mbstring.http_output = pass
[1693行目]  mbstring.encoding_translation = On
[1698行目]  mbstring.detect_order = auto
[1703行目]  mbstring.substitute_charset = none
```
SSH接続エラー回避方法

SSH接続を行った際に、サーバー側がOSを再インストールしたり、ホスト名を付け替えたりすると、次のようなエラーが発生し、接続できない場合があります。

>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00.
Please contact your system administrator.
Add correct host key in /home/hogehoge/.ssh/known_hosts to get rid of this message.
Offending key in /home/hogehoge/.ssh/known_hosts:3
RSA host key for remote_host has changed and you have requested strict checking.
Host key verification failed.

##SSH接続とは
SSHでは、安全な接続を行うために接続先サーバーの情報（RSA公開鍵のフィンガープリント）を、クライアントは保存しています。
SSH接続時には、以前保存したこの情報と、これから接続しようとしているサーバーの情報が一致しているのかを確認することで、
ユーザー（クライアント）が知らない間に、別のサーバーへ接続されてしまうことを防ぐことができ、安全性を保つことが可能となります。

##対処方法
Macのターミナル上で以下のコマンドを実行し、ホスト鍵の情報を削除します。その後、再度SSH接続を行うことで解決します。

```bash:Terminal
$ rm ~/.ssh/known_hosts
```
Slimでrender partialを見やすく改行して書く方法


erbからSlimに改行したら意図しないところでエラーが出たりしますよね。
かといってそのまま書くと長くてちょっと見にくいなという経験があるかもしれません。

```これはエラー＞＜
= render partial: 'hoge', locals: {
  user: @user,
  answer: @answer,
  survey: @survey
}
```

```かといってこれは長い・・・
= render partial: 'hoge', locals: { user: @user, answer: @answer, survey: @survey }
```


そこで普段見やすくするために行っているちょっとしたtipsを紹介します。(当たり前のことかもしれませんが、、)

```こう書くと見やすい!
= render partial: 'hoge', locals: { user: @user,
  answer: @answer,
  survey: @survey }
```


はじめのうちは悩んだので参考になれば幸いです！！
(※他に綺麗に書く方法あればご教授いただきたいです。)
さくらのクラウドのAPIを使ってみる

##はじめに

サービスを運用していると、ビルド用サーバの自動起動や、アプリケーションサーバのイメージの自動構築をしたくなります。そこでさくらのクラウドのAPIを使ってそれを実現しようと思います。
　とりあえず今回は、APIを使うのが初めてなので、「さくらのクラウドの東京第１ゾーンにあるサーバの名前リストを出す」という簡単なプログラムを書いてみようと思います。さくらのクラウドのAPIの利用には、Node.JS用のSDKを利用します。

sacloud : https://github.com/sakura-internet/node-sacloud

##やり方

まず、さくらのクラウドのコンソールで、APIキーを作っておきます。
<img width="1110" alt="スクリーンショット 2015-11-14 23.40.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/8d5ff9d3-49ec-6443-2669-4cd6e201e6e6.png">



sacloudをインストール（Node.JSが必要です）

```
npm install sacloud
```


適当な名前のJSファイルを作成して、さっそくプログラミングします。気をつけた点として、sacloud.API_ROOTを1.1のものにしました。東京第１ゾーンなのでzone/tk1aですね。

以下list.js

```js
var sacloud = require('sacloud');

sacloud.API_ROOT = 'https://secure.sakura.ad.jp/cloud/zone/tk1a/api/cloud/1.1/';

var client = sacloud.createClient({
  accessToken        : 'access token',
  accessTokenSecret  : 'access token secret',
  disableLocalizeKeys: false,
  debug              : false
});

client.createRequest({
  method: 'GET',
  path  : 'server'
}).send(function(err, result) {
  if (err) throw new Error(err);
  console.log( result.response.servers.map(function(s) {return s.name;}) );
});
```

API_ROOTは以下を参考に設定します。

- https://secure.sakura.ad.jp/cloud/zone/tk1a/api/cloud/1.1/ (東京第1ゾーン)
- https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/ (石狩第1ゾーン)
- https://secure.sakura.ad.jp/cloud/zone/is1b/api/cloud/1.1/ (石狩第2ゾーン)
- https://secure.sakura.ad.jp/cloud/zone/tk1v/api/cloud/1.1/ (Sandbox)

こんな感じで、とりあえずサーバのリストを出すことができました。
次回以降で、サーバ起動→fabricで環境構築→サーバイメージの作成までできればと思います。
【手作りマウスキット】抵抗について

![image.jpeg](https://qiita-image-store.s3.amazonaws.com/0/100762/19b08a7b-59c4-85b7-febd-c470fd2dfc10.jpeg)

今日は「手作りマウスキット」を買ってマウスを作りました！

各部品を基板にはんだづけしました♩はんだづけめちゃめちゃ楽しかったです♪

はて…それぞれの部品は何の役割をしているのだろう？

さっぱり分からない初心者なので、調べてみました！

#抵抗

![WS2015-11-14-23-15000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/100762/c47be871-a1b0-d56a-7fb8-dfc70de388d9.jpeg)

抵抗は、電流の流れを制御する部品です。

抵抗の値は表面の4本の線を見て、計算して求めることが出来るそうです。

今回使った抵抗は、青、灰、黒、金の順に線が並んでいます。

1番目と2番目の色は数字、3番目の色は10の何乗、4番目の色は許容誤差を表しているそうです。

計算してみました！

68(青灰) × 10の0乗(黒) = 68Ω ± 5%(金)

・・・はたしてこの抵抗値って小さいのか大きいのか？

それに抵抗って何で必要なの？(何の知識もなく初心者の私の感覚では、抵抗なくすいすい電流が流れた方が、何だか良さそうな感じがします)

ここまで調べてずいぶんと体力を使ってしまったので、今日はこれでおしまいにします♪

これからもいろいろ作って調べてお勉強してみます！

参照記事
バラして納得！ 電子部品入門（3）：リード線付き抵抗器のカラーコードを読む
http://monoist.atmarkit.co.jp/mn/articles/0708/17/news076.html

手作りマウスキット
http://store.shopping.yahoo.co.jp/medistock/4521718935980.html
Elasticseach2.0.0とKibana4.2.0の環境をVagrantコマンド一発で構築するを試してみた


[Elasticseach2.0.0とKibana4.2.0の環境をVagrantコマンド一発で構築する](http://qiita.com/ariarijp/items/f94962de91a36545a070)を試していた時にハマった

# 検証環境

|Software/OS|Version|
|---|---|----|----|
|VirtualBox|5.0.10 r104061|
|Vagrant|1.7.4|
|Ansible|1.9.4|
|OSX|Yosemite(10.10.5)|

# 事前準備
## ansible

```
$ brew install ansible
```

### 動作確認

```bash
$ ansible-playbook  --version
```

出力結果

```
ansible-playbook 1.9.4
  configured module search path = None
```


## VirtualBox
Download [VirtualBox](https://www.virtualbox.org/wiki/Downloads)

## Vagrant
Download [Vagrant](https://www.vagrantup.com/downloads.html)

# 実行

```
$ git clone https://github.com/ariarijp/elasticsearch-and-kibana-playbook.git
$ cd elasticsearch-and-kibana-playbook
$ vagrant up
```

# 動作確認

http://192.168.33.10:5601/
(Redirect)=> http://192.168.33.10:5601/app/kibana

`vagrant up`実行後に、上記のアドレスが実行できればOK

# トラブルシューティング
## 問題

```
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'ubuntu/trusty64' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
The guest machine entered an invalid state while waiting for it
to boot. Valid states are 'starting, running'. The machine is in the
'poweroff' state. Please verify everything is configured
properly and try again.

If the provider you're using has a GUI that comes with it,
it is often helpful to open that and watch the machine, since the
GUI often has more helpful error messages than Vagrant can retrieve.
For example, if you're using VirtualBox, run `vagrant up` while the
VirtualBox GUI is open.

The primary issue for this error is that the provider you're using
is not properly configured. This is very rarely a Vagrant issue.
```

VirtualBoxのエラー
![Oracle_VM_VirtualBox_マネージャー.png](https://qiita-image-store.s3.amazonaws.com/0/2432/98fee344-0b51-b010-37fd-968dee6b2906.png "Oracle_VM_VirtualBox_マネージャー.png")


## 解決

```
$ sudo chown root /Applications
$ vagrant up
```


## 参考
http://okogeki.hatenablog.com/entry/2014/06/10/152035
ツールバー、ナビバーの上にviewを被せる


# 実現すること

ユーザ操作を止めるためにナビバー、ツールバーの上にviewを被せる。

# 完成品

この状態から
![スクリーンショット 2015-11-14 22.31.00.png](https://qiita-image-store.s3.amazonaws.com/0/100736/8683374c-e7a5-d4b5-dc67-f4e69b288cfa.png)
こんなふうにします。
![スクリーンショット 2015-11-14 22.31.07.png](https://qiita-image-store.s3.amazonaws.com/0/100736/c1a38275-dc8d-11bc-3a1a-440ed20f3e92.png)


# コード

AppDelegateはUINavigationControllerを使うためにちょっと書き換えます。

```swift:AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        let vc: ViewController = ViewController()
        let navi: UINavigationController = UINavigationController(rootViewController: vc)
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window?.rootViewController = navi
        self.window?.makeKeyAndVisible()
        return true
}
```

VCはこんなかんじ

```swift:ViewController.swift
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.grayColor()
        self.navigationController?.toolbarHidden = false
        
        self.setupButton()
    }
    
    private func setupButton()
    {
        let button = UIButton()
        button.frame = CGRectMake(0, 0, 100, 50)
        button.layer.position = CGPoint(x: self.view.bounds.width / 2, y: 300)
        button.backgroundColor = UIColor.blueColor()
        button.setTitle("tap!!", forState: .Normal)
        button.addTarget(self, action: "tappedButton", forControlEvents: .TouchUpInside)
        self.view.addSubview(button)
    }
    
    @objc private func tappedButton()
    {
        self.navigationController?.view.addSubview(self.createView())
    }
    
    private func createView() -> UIView
    {
        let view = UIView(frame: CGRectMake(0, 0, self.view.bounds.width, self.view.bounds.height))
        view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.7)
        return view
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
```

このようにself.navigationController?.view.addSubviewをすればバーの上にviewを被せることができます。
ElectronでOS固有のファイルパスを得る app.getPath()の出力まとめ

ドキュメントにはふわっとしか載っていなかったのでここにまとめます。
https://github.com/atom/electron/blob/master/docs/api/app.md#appgetpathname

Electron v0.34.3

Windows
----
```js:index.js
console.log(app.getPath('home'));      // -> C:\Users\【ユーザー名】
console.log(app.getPath('appData'));   // -> C:\Users\【ユーザー名】\AppData\Roaming
console.log(app.getPath('userData'));  // -> C:\Users\【ユーザー名】\AppData\Roaming\【パッケージ名】
console.log(app.getPath('temp'));      // -> C:\Users\【ユーザー名】\AppData\Local\Temp
console.log(app.getPath('exe'));       // -> 【実行している.exeのパス】
console.log(app.getPath('module'));    // -> 【実行している.exeのパス】
console.log(app.getPath('desktop'));   // -> エラー
console.log(app.getPath('documents')); // -> エラー
console.log(app.getPath('downloads')); // -> エラー
console.log(app.getPath('music'));     // -> エラー
console.log(app.getPath('pictures'));  // -> エラー
console.log(app.getPath('videos'));    // -> エラー
```

Mac
----
```js:index.js
console.log(app.getPath('home'));      // -> /Users/【ユーザー名】
console.log(app.getPath('appData'));   // -> /Users/【ユーザー名】/Library/Application Support
console.log(app.getPath('userData'));  // -> /Users/【ユーザー名】/Library/Application Support/【パッケージ名】
console.log(app.getPath('temp'));      // -> /var/folders/df/w01nd66568g0ql8wdmcd21vr0000gn/T/
console.log(app.getPath('exe'));       // -> 【実行している.appのパス】/Contents/MacOS/Electron
console.log(app.getPath('module'));    // -> 【実行している.appのパス】/Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework
console.log(app.getPath('desktop'));   // -> エラー
console.log(app.getPath('documents')); // -> エラー
console.log(app.getPath('downloads')); // -> エラー
console.log(app.getPath('music'));     // -> エラー
console.log(app.getPath('pictures'));  // -> エラー
console.log(app.getPath('videos'));    // -> エラー
```

...何故かdesktop以下はエラーに。
プロキシ下でCentOS7にDockerを導入する


Dockerはversion1.8以降からCentOS6のサポートがなくなった．
導入の他にproxy設定も記述する．
まだ始めたばかりで，どの作業にproxyが関わってくるのかわからないから，随時更新していく

## install
### インストール

```yum -y install docker```

### /etc/sysconfig/docker

```/etc/sysconfig/docker
・
・
##追加
OPTIONS='--selinux-enabled --storage-opt dm.no_warn_on_loop_devices=true'
```

`OPTIONS='--selinux-enabled`は最初からあるので，それ以降を追加する．

### 起動

```
systemctl enable docker.service
systemctl start docker.service
```


## proxy
### yum

```etc/yum.conf```に `proxy=http://your.proxy.server:port`を追加

### Docker Hub
[DockerをProxy配下で使う](http://qiita.com/RyotaIshii/items/44061e35966c11296d64)を参照


`/etc/sysconfig/docker`を編集

```/etc/sysconfig/docker
・
・
http_proxy=http://your.proxy.server:port
https_proxy=https://your.proxy.server:port
```
実務で役立つシェル系Tips

## パスの末尾に`/`があるかないかを気にしたくない
文字列を結合してパスを生成したりするときに、パスを格納した複数の変数を文字列結合するときがあります。

```shell-session
dirHome="/var/lib/hoge/"
workDirName="work"

echo "${dirHome}${workDirName}"  # /var/lib/hoge/workと表示される
```

しかし、`dirHome`や`workDirName`のような変数をコンフィグファイルで設定していたり、実際に参照するところと定義箇所が遠いときがあると厄介なことが起こりえます。

例えば、下記のように`dirHome`の末尾に`/`がなかったらどうなりますでしょうか？

```shell-session
dirHome="/var/lib/hoge"
workDirName="work"

echo "${dirHome}${workDirName}" #/var/lib/hogeworkと表示されてしまう
```

これを防ぐ方法があります。

```shell-session
${dirHome%/}/${workDirName}
```
`%X`はその前の変数に含まれる文字列を末尾から`X`を検索して最も近くでヒットした`X`を削除します。
この`%/`の場合、末尾に`/`のあるパターンの`/`を削除します。
そのため、`${dirHome}`の末尾に`/`があるかないかを問わず、常に`/`を末尾に追記することができます。
ちなみに、最も最後にヒットした`X`を削除する`%%X`も存在します。

## プロセスの検索には`pgrep`を使う

pgrepが使える環境であれば、それを使うようにしましょう。
`pgrep hoge`と記述すれば、下記のようなコマンドを打つ必要がなくなります。

```shell-session
ps -ef | grep -v grep | grep hoge
```

## 0でpaddingされた連番のファイルを作りたい

`printf`のようにフォーマットを指定して連番を作ることが可能です。

```shell-session
seq -f "hoge%03g.txt" 3

# 下記が表示される
# hoge001.txt
# hoge002.txt
# hoge003.txt
```
（※`seq`は内部で数値を実数として扱っているため`dフォーマット指定子`は使用できません）

> `-w`オプションもありますが、-fの方が汎用的なので、そちらを使った方がわかりやすいかと思います。

## 文字列はクォートで囲うようにする
変数の定義の仕方は3通りあります。

```shell-session
var=HOGE
var='HOGE'
var="HOGE"
```

格納する文字列にスペースが入っていたり、エディタのシンタックスハイライトのことを考えると、クォートで囲うようにしたほうが良いでしょう。

## ファイル名に実行した日付を入れたい

```shell-session
ls -la > _result_`date +"%Y%m%d-%H%M%S"`.txt
```

フォーマットの記述が覚えづらいかもしれませんが、`「月と日以外は大文字」`でフォ−マットの指定の仕方を覚えると良いでしょう。

## 数値計算には`$(())`を使うようにする
数値計算の記述の方法が2種類あります。

```shell-session
ans=$((1 + 1))
ans=`expr 1 + 1`
```

しかしながら、`$(())`を使うようにしたほうがよいでしょう。
`expr`は掛け算と割り算に関してエスケープが必要であったり直感的でありません。

```shell-session
ans=`expr 2 \* 1`
ans=`expr 2 \/ 1`
```
## 検索したファイル名とファイル名称とファイルサイズを獲得したい
```shell-session
find . -ls -print | awk '{ print $11 " "  $7}'
```
findコマンドに`-ls`をつけると`ls -l`をしたときのようにファイルのメタ情報が見られるようになるのですが、それらは列表示されています。そしてそれらをawkコマンドに渡すことで`$11`のようにしてカラム番号を指定してカラムを獲得することができます。

## ファイルサイズを物理サイズで獲得したい
duコマンドはブロックサイズでサイズを計算します。 
そのためduコマンドでは物理サイズを獲得することができません。
`find -ls`コマンドを使用します。

```shell-session
find . -ls | awk '{ print $11 " "  $7}' 

# ./hogehoge.txt 430620 と表示される
```

>なお、ディレクトリサイズはコピーしたときに減ることがあります。
これはディレクトリにファイルを格納していくとディレクトリのブロックサイズも増えていくのですが、その後にファイルを削除してもブロックサイズは縮小されないためです。

##コマンドの結果から複数の特定のワードが含まれないもののみを出力するようにする

grepコマンドの`-v`オプションを指定すると、指定したワードを除外してgrepすることができます。
しかしながら、複数ワードの除外ワードを指定したい場合、

```shell-session
grep -v hoge | grep -v hoge2
```

などと、パイプでつないでいくのは冗長になってしまいます。

grepには複数のワードを指定するためのオプションが用意されています。

```shell-session
grep -v -e hoge -e hoge2
```

`-e [ワード]`を複数記述することで複数ワードを記述することができるようになります。

これを応用すれば、下記のようなことも可能になります。

```shell-session
## コメントと空行を除いてファイル行数をカウントする
cat hoge.txt | grep -v -e '^\s*#' -e '^\s*$' | wc -l
```

## findしたファイルリストをソートしたい

```
ls -lt `find /var -name *.txt -type f -print`
```

上記の場合、上から下に、新しい順に表示されます

## findする時に`Permission denied`のものを排除する

```
find . 2>/dev/null
```

## エラーがあったときに処理を中断する

```
#!/bin/bash
set -e
```
cocos2d-xの描画入門

cocos2d-xのプロジェクトに異動して困ったので、基本的な事柄をメモしていく。
###図形描画

```drawPrimitive.cpp
void MySample::drawPrimitives()
{
    // 矩形
    // x座標, y座標, width, height
    Rect rect = Rect( 0, 0, 100, 100 );
    Sprite* square = Sprite::create();
    square->setTextureRect( rect );
    square->setPosition( 100, 100 );
    this->addChild( square );
    
    // 塗りつぶしていない円
    DrawNode *cirlce = DrawNode::create();
    // 中心座標、半径、角度、頂点数、中心に向かう線を描画するか、倍率x、倍率y
    cirlce->drawCircle( Vec2::ZERO, 50, 45, 360, true, 1, 1, Color4F::BLUE );
    cirlce->setPosition( Vec2( 200, 100 ) );
    this->addChild( cirlce );
    
    // 塗りつぶした円（＝大きな点）
    DrawNode *dot = DrawNode::create();
    dot->drawDot( Vec2::ZERO, 50, Color4F::YELLOW );
    dot->setPosition( Vec2( 300, 100 ) );
    this->addChild( dot );
    
    // 線
    DrawNode* line = DrawNode::create();
    line->drawSegment( Vec2( 100, 100 ), Vec2( 300, 100 ), 2.5f, Color4F::RED );
    this->addChild( line );
}
```
![スクリーンショット 2015-11-14 22.52.34.png](https://qiita-image-store.s3.amazonaws.com/0/85509/002e5958-a1b7-bf7d-9f88-a45fc87a50eb.png)
###画像配置
画像等のリソースはResource以下に格納する。

```image.cpp
void MySample::drawImages()
{
    Size viewSize = Director::getInstance()->getWinSize();
    
    // パスを指定して配置
    Sprite *imageSp = nullptr;
    imageSp = Sprite::create("images/cat_01.jpg");
    imageSp->setPosition( Vec2( viewSize.width * 0.5, viewSize.height * 0.5 ) );
    this->addChild( imageSp );
    
    // searchPathにパスを登録してから配置
    FileUtils::getInstance()->addSearchPath( "images" );
    imageSp = Sprite::create("cat_02.jpg");
    imageSp->setPosition( Vec2( viewSize.width * 0.5, viewSize.height * 0.5 ) );
    this->addChild( imageSp );
}
```
###角度、回転
####atan2で取得した角度は反時計周り。
```angle.cpp
// 角度のテスト
void MySample::angleTest()
{
    Vec2 center = Vec2( 0, 0 );
    Vec2 right = Vec2( 100, 0 );
    Vec2 top = Vec2( 0, 100 );
    Vec2 left = Vec2( -100, 0 );
    Vec2 bottom = Vec2( 0, -100 );
    
    float angle = getAngle( center, right );
    CCLOG("右 : %f", angle);
    angle = getAngle( center, top );
    CCLOG("上 : %f", angle);
    angle = getAngle( center, left );
    CCLOG("左 : %f", angle);
    angle = getAngle( center, bottom );
    CCLOG("下 : %f", angle);
}

// 2点の成す角(0~360度)を返す
float MySample::getAngle( cocos2d::Vec2 from, cocos2d::Vec2 to )
{
    float dX = to.x - from.x;
    float dY = to.y - from.y;
    
    float radian = atan2f( dY, dX );
    // ラジアンから度へ変換
    float angle = CC_RADIANS_TO_DEGREES( radian );
    
    // 0 ~ 360度に限定
    angle += 360;
    while (angle >= 360) {
        angle -= 360;
    }
    
    return angle;
}
```
結果は以下の通り。
右 : 0.000000
上 : 90.000000
左 : 180.000000
下 : 270.000000

####setRotationによる回転は時計周り。
```lrotation.cpp
// 回転のサンプル
void MySample::rotationTest()
{
    for ( int i = 0; i < 10; i++ )
    {
        // 横一列に配置
        Sprite *image = Sprite::create("images/fish.png");
        this->addChild(image);
        image->setPosition(Vec2(25 + i * 50, 150));
        
        // 10度ずつ回転
        image->setRotation(i * 10);
    }
}
```
結果
![スクリーンショット 2015-11-15 21.22.44.png](https://qiita-image-store.s3.amazonaws.com/0/85509/6c214da3-3505-6aa2-1036-a582860e8547.png)
Elastic IP の逆引きを設定する

# 前置き
ホストの正当性を証明するためにグローバルIPアドレスからホスト名の逆引きが必要になる場合があります

通常、固定IPを利用している場合にはIPアドレスの所有者(プロバイダなど)に権限を委譲してもらう手続きが必要です
Elastic IPを利用している場合そのIPアドレスを管理しているのはAmazonなので手続き方法を調べました

# やりたいこと
逆引きの設定をしていないElastic IPを逆引きすると以下のような自動でインスタンスに割り当てられたホスト名が返却されるようになっています
`ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com.`

この結果が独自ドメインになるように変更します

# 手続きの方法
以下のフォームから申請を行います
https://aws.amazon.com/forms/ec2-email-limit-rdns-request

それぞれの項目に申請内容を入力し Submit をクリックするだけです

##### Use Case Description
どういう目的で利用するかを入力します
メールサーバー運用のため、等と用途を入力すればよいでしょう

##### Elastic IP Address
逆引きを可能にしたいElastic IPを入力します

##### Reverse DNS Record for EIP
逆引きの結果として設定してほしいドメイン名を入力します


設定が完了すると1時間もしないうちにメールで連絡が来ます
その後 dig, nslookup 等のコマンドで反映されていることが確認できればOKです

たったこれだけでした

# 参考リンク
https://aws.amazon.com/jp/blogs/aws/reverse-dns-for-ec2s-elastic-ip-addresses/

https://forums.aws.amazon.com/thread.jspa?threadID=152776
AWS認定ソリューションアーキテクト 模擬試験を受けてみた

AWS歴4か月。
前々から気になっていたソリューションアーキテクトを取得してみようかなと思い、力試しに模擬試験を受けてみました。


#模擬試験について

- 2015年10月時点で2,160円(税込)
- Webassessorのアカウントを作成する必要がある。 ※このアカウントは本試験を受ける際にも必要。
- 本試験とは違い自宅で受験可
- 試験内容は本番同等の試験を30分で20問解く。
- 試験終了後、すぐに結果がわかる。
- <font color="red">**問題の解答、解説等は一切なし**</font>

問題の解答、解説が全く連携されないのが残念です。。
問題の内容を覚えておき、わからなかった箇所を後から調べるしかなさそうですね。
ちなみに、試験内容を複製・公開することは禁止されています。


#筆者の実力
 

- インフラの保守歴1.5年
- AWS歴4か月（EC2,S3,VPC,RDSを使用して小さなシステムのインフラを構築） 
- 認定試験に関しては、AWSが公開しているサンプル問題を一回解いた程度。<br>
(サンプル問題：https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)


#試験の内容
問題の内容は公開することができませんが、雰囲気は以下のような感じです。

- 可用性に関する問題が多く問われる。<br>⇒これは公式にも発表がありますが、システムの可用性を高める設計思想についてはよく問われます。(アベイラビリティゾーン分けるとか、レプリケーションするとか)
- 重箱の隅をつつくような問題は少ない。<br>⇒20問しか解いていないので確かなことは言えませんが、どの問題も本質的な理解があれば正しい回答に行きつくようになっていると思います。小手先より基礎力が一番大事です。
- 時間が足りなくなることはない。<br>⇒それなりに時間の余裕はあります。落ち着いて丁寧に回答しましょう。


#本試験に向けて
結果は正解率60%で残念ながら合格圏内には届きませんでした。(合格圏内は66%以上)
また、本試験の問題数が55問なのに対し、模擬試験が20問なので実際のスコアは5%~10%低くなるのではないでしょうか。

とはいえ全く歯が立たないという印象でもなかったので、2週間ほどしっかり勉強すれば何とかなるのではないかなと思います。一発合格を目指すのであれば、模擬試験を受けてみるのも良いのではないでしょうか？(本試験は16,200円もしますし・・)





おしまい。
連番バーコード

7桁連番 + modulus 10, weight 3 のチェックディジットのバーコードの単純計算

- これの為に、[オブジェクト指向のおさらい](http://qiita.com/bunzaemon/items/c2397be3b134c73eba97)した
- [8桁バーコードのチェックデジット](http://qiita.com/bunzaemon/items/84b9e9803e830623e59c)
- [CODE39 のチェックデジット](http://qiita.com/bunzaemon/items/49433c0e8054cbc307a4)

## コード
メインの部分を。

```
$ pbpaste
package BARCODE;
sub _ad  { eval join q{+}, @_ }
sub _cut { ( split//, shift @_ )[0..6]}
sub _fmt { sprintf "%07d", substr $_[0], 0, 7 }
sub _mg  { join '', @_ }
sub _init {
    my $self = shift ;
    $self->{barcode} = _fmt $self->{barcode}  ;
    my @d = _cut $self->{barcode}  ;
    $self->{barcode} = _mg +( @d, ( (  10 - ( ( _ad @d[0,2,4,6] ) * 3 + _ad @d[1,3,5] ) % 10 ) % 10 )  ) ;
    return $self ;
}
sub new{ bless _init { barcode => $_[1] || "0000000" } , $_[0]  }
sub add{
    my $self = shift ;
    $self->{barcode} = _fmt 1 + _mg _cut $self->{barcode} ;
    return _init $self ;
}
1;

my $o = BARCODE->new(100) ;
print $o->{barcode} ;
print $o->add->{barcode} ;
print $o->add->{barcode} ;
```

## 実行
```
$ pbpaste | perl -l
00001007
00001014
00001021
```
異なるサブルーチンの選択実行


`(*CODE)->(ARGV)` って当たり前なのに思い付かなかった、、、って時にメモった奴。

- [型グロブとファイルハンドル](http://perldoc.jp/docs/perl/5.20.1/perldata.pod#Typeglobs32and32Filehandles) perldoc.jp
- [リファレンスを使う](http://perldoc.jp/docs/perl/5.20.1/perlref.pod#Using32References) perldoc.jp

>デリファレンスの構文では常に目的とするリファレンスの型を 示すことができるので、型グロブをリファレンスと同じように デリファレンスすることができます。 つまり、${*foo} と ${\$foo} は、どちらも同じスカラ変数を 示すことになります。
（上記URLより）

```pl:A
sub c { print qq{c:$_[0]} }
sub d { print qq{d:$_[0]} }
```

```pl:B
my $c = sub { print qq{c:$_[0]} };
my $d = sub { print qq{d:$_[0]} };
```

## 0. 普通に実行
```pl:A
( 1 ? *c : *d )->(42)
```

```pl:B
( 1 ? $c : $d )->(42)
```


### 0.1. ハッシュ

```
my %h = (
    c => sub { print qq{c:$_[0]} },
    d => sub { print qq{d:$_[0]} },
);

$h{ 1 ? c : d }->(42) ;
```

定番

## 1. デリファレンスを利用

```pl:A
&{ 1 ? *c : *d }( 42 ) ;
```
```pl:B
&{ 1 ? $c : $d }( 42 ) ;
```

### 1.1. 型グロブへデリファレンス

```pl:A
*{ 1 ? *c : *d }->( 42 ) ;
```
```pl:B
*{ 1 ? $c : $d }->( 42 ) ;
```
当たり前だが、 `B` は動かん

## 2. `do{}` による実行
```pl:A
do{ 1 ? *c : *d }->( 42 ) ;
```
```pl:B
do{ 1 ? $c : $d }->( 42 ) ;
```

## そして追加訂正
### 0.1. ハッシュ

```pl:C
sub c { print qq{c:$_[0]} } 
sub d { print qq{d:$_[0]} }
my %h = ( 
    c => *c,
    d => *d,
) ;
```

```pl:D
my %h = (
    c => sub { print qq{c:$_[0]} },
    d => sub { print qq{d:$_[0]} },
);
```
それぞれ、以下のコードで実行出来る。

```
$h{ 1 ? 'c' : 'd' }->(42);
&{$h{ 1 ? 'c' : 'd' }}(42);
*{$h{ 1 ? 'c' : 'd' }}->(42);  # D では不可
do{$h{ 1 ? 'c' : 'd' }}->(42);
```
OpenCV3+Python3で"アップル加工"

「[アップル加工](http://twinavi.jp/topics/tidbits/5645d9b5-fc70-4e3d-bbc8-55a8ac133a21)」なる画像フィルタがあるらしいのでOpenCV＋Pythonで真似して作ってみた。

単なる色相(H)抽出フィルタともいう。補色が無くなったせいか元画像よりも淡く見える。追加で彩度(S)をいじった方がいいかも。


変換後画像：
![output1.jpg](https://qiita-image-store.s3.amazonaws.com/0/6657/27e43070-c6b5-61c3-ae0d-16c7fa9c642e.jpeg)

元画像（[画像出展](https://commons.wikimedia.org/wiki/File:ItsukushimaTorii7396.jpg)）：
![image1.jpg](https://qiita-image-store.s3.amazonaws.com/0/6657/e9edef35-6c99-0eac-af2c-c1ceba6d34d9.jpeg)

ソース: https://gist.github.com/yohhoy/4f762ccf7c7a0bfcccfe

```
$ curl https://upload.wikimedia.org/wikipedia/commons/0/0b/ItsukushimaTorii7396.jpg > download.jpg
$ convert -resize 400 download.jpg image1.jpg
$ ./redgray.py image1.jpg output1.jpg
```
（`convert`コマンドは[ImageMagick](http://www.imagemagick.org/)で提供される）
Ruby minitest で標準出力をテストする

# 経緯

[minitest](https://github.com/seattlerb/minitest) で標準出力の結果をテストしたい時に、どうすればいいのか調べたので記載

# 結論

`assert_output` を使えばいけるみたい。

```rb
assert_output(stdout = nil, stderr = nil) { || ... }
```

- 標準出力の期待値があれば、stdout に引数を渡す。
  - 引数に `nil` を渡すとテストされない
- 標準エラー出力の期待値があれば、stderr に引数を渡す。
  - 引数に `nil` を渡すとテストされない
- 標準出力とエラー出力がどちらも期待値が `nil` のテストをしたい場合には `assert_silent` を使う
- テストしたい処理をブロックで渡す

# 簡単な使用例

標準出力だけテストする。

```rb
require 'minitest/autorun'

class StdoutTest < MiniTest::Test

  def test_puts
    assert_output("std capture\n") { puts "std capture" }
  end

end
```

# 参考

- http://docs.ruby-lang.org/en/2.1.0/MiniTest/Assertions.html#method-i-assert_output

- http://ruby-doc.org/stdlib-1.9.3/libdoc/minitest/unit/rdoc/MiniTest/Assertions.html#method-i-assert_output
環境変数 USERNAME で実行ユーザーを取得するワナ

Zsh (と Python) の小ネタです。

# 事件

ある日、Windows 環境で使われている Python スクリプトを受け取りました。しかし手元の Ubuntu で実行したところ動作せず。トレースバックによるとスクリプトの実行ユーザー名を取得する処理で環境変数 USERNAME を参照、KeyError が発生していました。

```py
Traceback (most recent call last):
[...]
    return os.environ["USERNAME"]
  File "/usr/lib/python2.7/UserDict.py", line 23, in __getitem__
    raise KeyError(key)
KeyError: 'USERNAME'
```

たしか Unix で実行ユーザー名がセットされるのは環境変数 USER でなかったか? Zsh で確認してみよう。

```bash
$ echo "<$USER>"
<taro>
$ echo "<$USERNAME>"
<taro>
```

おやおや、今時の Unix では USERNAME も定義されているのか。ではなぜ Python スクリプトから参照できないのか。

# 調査

チクチクチク ポーン💡

# 判明

わかりました。$USERNAME は Zsh 固有のパラメータでした。Zsh から参照できますが子プロセスには渡りません。

```bash
$ dash -c 'echo "<$USERNAME>"'
<>
$ bash -c 'echo "<$USERNAME>"'
<>
$ zsh -c 'echo "<$USERNAME>"'
<taro>
```

man zshparam で zsh のマニュアルを見ると詳細が書いてあります。

```
       USERNAME <S>
              The  username  corresponding  to  the  real user ID of the shell
              process.  If you have sufficient privileges, you may change  the
              username  (and  also  the  user ID and group ID) of the shell by
              assigning to this parameter.  Also (assuming  sufficient  privi-
              leges),  you  may start a single command under a different user-
              name (and user ID and group  ID)  by  `(USERNAME=username;  com-
              mand)'
```

# 教訓

環境変数 USERNAME は Windows で有効ですが Unix ではの利用は控えましょう。代わりに環境変数 USER を参照しましょう。

# おまけ

そもそも Python で実行ユーザー名を取得するときは環境変数ではなく getpass モジュールの getuser() 関数を使いましょう。ソースコードを見ると環境変数の LOGNAME, USER, LNAME, USERNAME を順に参照していることがわかります。(LNAME って何だ?)

/usr/lib/python/getpass.py より抜粋:

```py
def getuser():
    """Get the username from the environment or password database.

    First try various environment variables, then the password
    database.  This works on Windows as long as USERNAME is set.

    """

    import os

    for name in ('LOGNAME', 'USER', 'LNAME', 'USERNAME'):
        user = os.environ.get(name)
        if user:
            return user

    # If this fails, the exception will "explain" why
    import pwd
    return pwd.getpwuid(os.getuid())[0]
```

# まとめ

実行ユーザー名を取得する場合、

- Windows なら環境変数 USERNAME を参照する。
- Unix なら環境変数 USER を参照する。
- Python なら getpass.getuser() を使う。
Linux に windows  標準装備のフォントをインストール

普段は Ubuntu を使ってるんだけど、ときどき Windows も使う。

英字フォントは Times New Roman が個人的に好きでよく使うんだけど、Linux にはデフォルトで入ってない。
このままだと LibreOffice とか Inkscape のファイルを両方のOSでいじる場合に困る。
なので Ubuntu に MS fonts をインストールする。簡単。

`$ sudo apt-get install msttcorefonts`

たぶんこれで十分だけど一応

`$ sudo apt-get install ttf-mscorefonts-installer`

これも。
これで各種アプリケーションで Times New Roman 等が使えるようになる。
SinatraをThinで起動したときのメモ


Thinという速いWebサーバがあるらしいのでSinatraと一緒に使ってみた

## ソースファイル
```Ruby:Gemfile
source "https://rubygems.org"

gem 'sinatra'
gem 'shotgun'
gem 'thin'

gem 'config'

group :test do
  gem 'rspec'
end
```

```main.rb
require 'rubygems'
require 'sinatra'

get '/' do
  body "Hello world"
end

get '/user' do
  body "User World"
end
```
ソースファイルはこれだけ
## 設定ファイル
ふだんRailsを使っていると自動で生成してくれるのであんまし気にしないけどSinatraのときはconfig.ruを手で書く

```config.ru
require 'rubygems'
require 'sinatra'

require './main.rb'
run Sinatra::Application
```
Procfileには以下を追記してthinが起動するようにする。

```bash:Bash
web: bundle exec thin -R config.ru -p $PORT -e $RACK_ENV start
```


## ローカルでの起動
```bash:Bash
$ bundle exec thin -p 8000 start
```
Railsのときの同じように`log/`, `puclic/`, `tmp/`, `tmp/pids/`を作っておく必要があるらしい。

Shotgunをつかう場合はこのコマンドを実行

```bash:Bash
$ bundle exec shotgun main.rb -p 8000
```

## 使った資料たち
- http://qiita.com/kaz3439/items/606c1d58afcfb06f14c4
- http://shokai.org/blog/archives/4717
初めてのMacでわからないことだらけ

就職先からMac貸してもらってウキウキ気分
MacからQiitaに登録したし、アカウント教えるためにメールの返信してたんだけど
いざ、アカウント教えるぞって時にURLのコピーの仕方がわからない！！
キーボード見てもWindowsPCみたいにctrlキーがないじゃん！！

というわけでGoogleで早速調べました。
Macではcommandキーを使うんですね！
あとはWindowsPCと変わらないことを知りました！

またこれでMacに詳しくなったぜ、ニヒヒ。

と、まあ
こんな調子で調べたこととか些細なことでも投稿していこうかなと思います！

参考にしたサイトのURL貼り忘れてました(汗
http://tokyo.secret.jp/macs/shortcut.html
bash で TCP 通信して Java オブジェクトを送信する

[『bash で TCP 通信』](http://qiita.com/k_ui/items/a01fdcfa8ac6729e7870) の記事を読んで、シリアライズした Java のオブジェクトを送れるなあ、なんて思ってサンプルを書いてみた。

```java:Main.java
import java.io.*;
import java.net.*;

public class Main {

	public static void main(String[] args) throws IOException, ClassNotFoundException {

		try (ServerSocket server = new ServerSocket(38080);
				Socket socket = server.accept();
				ObjectInputStream in = new ObjectInputStream(socket.getInputStream())) {
			String obj = (String) in.readObject();
			System.out.println(obj); // "Hello, Java!!"
		}
	}
}
```

```bash:HelloJava.sh
#!/bin/bash
exec 3> /dev/tcp/127.0.0.1/38080
echo -en "\xAC\xED\x00\x05\x74\x00\x0D\x48\x65\x6C\x6C\x6F\x2C\x20\x4A\x61\x76\x61\x21\x21" >&3
# "Hello, Java!!" をシリアライズして16進数表現にしたもの。この文字列は SerializeSample.java で出力した。
```

```java:SerializeSample.java
import java.io.*;
public class SerializeSample {
    public static void main(String... args) throws Exception {
        try (ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream oo = new ObjectOutputStream(bo)) {
            oo.writeObject("Hello, Java!!");
            oo.flush();
            byte[] bytes = bo.toByteArray();
            for (byte b : bytes) {
                System.out.printf("\\x%02X", b);
            }
        }
    }
}
```
ArduinoでMaster-Slave方式を実現する方法

#はじめに
制作をしていく中で、Arduinoから出力させるピンが足りなくなることがあります。そのような時に、ArduinoをMaster-Slave方式に分割することを考えました。

#方法
WireとよばれるライブラリがArduinoには標準搭載されています。これを用いるとArduino間でMaster-Slave方式の通信が可能になります。この通信の方式をI2C通信と呼びます。この通信を行うためにはArduinoのA4ピンとA5ピン同士を接続する必要があります。また、電源供給元が異なる場合は、**GND同士も接続**しましょう。

#コード
Master側
ここでは、PCからのシリアル通信を受け取って、Slave側に通信を行っています。デバック用に13番ピンにLEDを接続しています。

```lang:master.ino
#include <Wire.h>

void setup() {
  Serial.begin(9600);
  Wire.begin();
  pinMode(13,OUTPUT);
}

void loop() {
  char c = Serial.read();
  if(c=='1'){
    digitalWrite(13,HIGH);
    Wire.beginTransmission(8) ;             // 通信の開始処理、スレーブのアドレスは８とする
    Wire.write("1",strlen("1"));  // 通信データ送信
    Wire.endTransmission();
  }else if(c=='0'){
    digitalWrite(13,LOW);
    Wire.beginTransmission(8) ;             // 通信の開始処理、スレーブのアドレスは８とする
    Wire.write("0",strlen("1"));  // 通信データ送信
    Wire.endTransmission();
  }
}
```
Slave側
ここでは、Master側から来たI2C通信を読み取って、通信が有った時に割り込み関数を呼び出しています。読み取ったデータに応じて13番ピンのLEDをon/offしています。

```slave.ino
#include <Wire.h>
void setup() {
  Wire.begin(8) ; //アドレスを8に設定
  pinMode(13,OUTPUT);
  Wire.onReceive(myReadLine); //割り込み関数の指定
}

void loop() {
//ここでは何もしない。
}

void myReadLine(int a){
  char c;
  if(Wire.available()) c = (char)Wire.read();
  if(c=='1'){
    digitalWrite(13,HIGH);
  }else if(c=='0'){
    digitalWrite(13,LOW);
  }
}
```

#参考文献

[2台のarduinoをI2Cバスで接続して通信を行う実験](http://nuneno.cocolog-nifty.com/blog/2013/12/2arduinoi2c-fca.html)
[3台のArduinoをI2Cで通信してみた](http://shirotsuku.sakura.ne.jp/blog/?p=710)
複数DBのデフォルトじゃない方のDBでmigrationができない時

# 起きたこと
[複数databaseのmigration](http://qiita.com/y1row/items/b05cc0d78dd6b671e16b)を参考にさせていただいて、使っているのだが、db:migrateができない。

# 環境

```ruby:Gemfile
gem 'rails', '4.1.7'
# デフォルトじゃない方のDBはsqlite3
gem 'sqlite3'
```

# エラー内容
```
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: no such table: synset: ALTER TABLE "synset" ADD "is_addition" boolean DEFAULT 'f' NOT NULL/Users/ryohei/talker/vendor/bundle/gems/sqlite3-1.3.10/lib/sqlite3/database.rb:91:in `initialize'
```
そんなテーブルはないと言われる。。。

# 原因
案の定、デフォルトの方のテーブルを見に行っていた。

# 解決方法
ActiveRecord::Migrationがこんな感じになっているので、


```ruby:active_record/lib/migration.rb
    def connection
      @connection || ActiveRecord::Base.connection
    end
```
設定時にオーバーライドする

```ruby:other_db.rake
  task :set_custom_db_config_paths do
    ENV['SCHEMA']                                     = 'other_db/schema.rb'
    Rails.application.config.paths['db']              = ['other_db']
    Rails.application.config.paths['db/migrate']      = ['other_db/migrate']
    Rails.application.config.paths['db/seeds.rb']     = ['other_db/seeds.rb']
    Rails.application.config.paths['config/database'] = ['config/other_db.yml']
    ActiveRecord::Migrator.migrations_paths           = 'other_db/migrate'
    ENV['db_model'] = "OtherDb"

# 以下を追記
    class OtherDbMigration < ActiveRecord::Migration
      def connection
        @connection = OtherDb.connection
      end
    end

  end
```

migrationファイルも以下のように変更

```ruby:other_db.rake
class AddIsAdditionToSynset < OtherDbMigration #OtherDbMigrationを継承するようにする
  def change
    add_column :synset, :is_addition, :boolean, null:false, default:false
  end
end
```

多分もっといい方法があると思いますが、とりあえず。。。！
[Neo4J]　④Cypherでグラフ構造を扱ってみる

息長くNeo4Jを試していこう、のコーナー。

最近、オープンになったグラフデータベース向けクエリ言語Cypherをマスターすれば、グラフ構造を作って検索したり、ができるようになる。ということで、Cypherを使いはじめてみよう。

前々回に入れてみた、py2neoをお供に使ってみる。インストールはpip経由で:
> sudo pip install py2neo
$ python -V
Python 2.7.10

#1) py2neoでバッチ処理

webに転がっていた、DRYでない微妙な例(しかも動かない)をとりあえず写経し修正し、バッチ処理ができるようにした:

```test.py
from py2neo import Graph

graph = Graph("http://neo4j:yourpassword@:7474/db/data/")
statement = """
  MERGE (person:Person {name:{person_name}}) ON CREATE SET
    person.age = {person_age},
    person.sex = {person_sex}

  MERGE (pet:Pet {name:{pet_name}}) ON CREATE SET
    pet.type = {pet_type}

  MERGE (person)-[:owns]->(pet)

  RETURN person
  """

tx = graph.cypher.begin()

persons = [
    {'name': 'Homer', 'age': 32, 'sex': 'Male', 'pet_name': 'Buller', 'pet_type': 'Dog'},
    {'name': 'Lucy', 'age': 12, 'sex': 'Male', 'pet_name': 'Buller', 'pet_type': 'Dog'},
    {'name': 'Lucy', 'age': 12, 'sex': 'Male', 'pet_name': 'Betty', 'pet_type': 'Cat'}
]

for person in persons:
    print person
    tx.append(statement, {
      'person_name': person['name'],
      'person_age': person['age'],
      'person_sex': person['sex'],

      'pet_name': person['pet_name'],
      'pet_type': person['pet_type']
    })

tx.process()

tx.commit()
```

トランザクションの部分だけ取り出すと流れが分かる:
>tx = graph.cypher.begin()
tx.append(statement, { ...   })
tx.process()
tx.commit()

また、statement中のMERGE 〜　ON CREATEというcypher構文、マスターすれば、なかなかよさそうだ。

以下にあるJSONをコミットするpy2neoの例を見るに別の書き方もできそうだ。
http://jexp.github.io/blog/html/load_json.html

#2) コマンドラインでクエリを書く。
お次は、コマンドラインからcypherをいじってみる(環境はMac)。

```
$ neo4j-shell
Unable to find any JVMs matching version "1.7".
Welcome to the Neo4j Shell! Enter 'help' for a list of commands
NOTE: Remote Neo4j graph database service 'shell' at port 1337

neo4j-sh (?)$ MATCH (p)-[:owns]-(pet) WHERE p.name = "Lucy" RETURN p, pet;
+------------------------------------------------------------------------------+
| p                                       | pet                                |
+------------------------------------------------------------------------------+
| Node[11]{name:"Lucy",age:12,sex:"Male"} | Node[12]{name:"Betty",type:"Cat"}  |
| Node[11]{name:"Lucy",age:12,sex:"Male"} | Node[10]{name:"Buller",type:"Dog"} |
+------------------------------------------------------------------------------+
2 rows
46 ms
```

neo4j-shell立ち上げ時に何か文句を言われるが無事、クエリをかけられた。

#3) ブラウザ上でクエリ実行しグラフ化
同じクエリを、ブラウザ上で実行:
> MATCH (p)-[:owns]-(pet) WHERE p.name = "Lucy" RETURN p, pet;

右のGraphボタンを押すと期待通りのグラフ画面が登場する:
http://localhost:7474/browser/
![スクリーンショット 2015-11-14 19.52.40.png](https://qiita-image-store.s3.amazonaws.com/0/16455/4ceec4de-f507-b357-04b4-4a3dc4248573.png)


#4) cypherクエリ　チートシート など
本家サイトにある以下:
http://neo4j.com/docs/stable/cypher-refcard/

日本語の入門はなかなか良い物がweb上では見つからないなぁ。

取り急ぎ、随時更新との"勉強メモ"に期待！
http://qiita.com/Keech/items/6bd5b667e935a20be018

こちらもマイペースでやっていこう^^;
APIレベルの変更

4.0のAPIで作ってたけど2.3にも対応させたかった場合の例です。

File→Project Structureを選んで出てくるウィンドウのFlavorsタブからMin Sdk Versionとかを変更。
これで終わりですが2.3のAPIがインストールされてなかったので選べませんでした。
なのでTools→AndroidのSDKマネージャーからSDKをインストール。
これで選べるようになったかと思ったらまだできなかったのでAndroid Studioを再起動。
再起動したら選べるようになりました。
S3上の静的ウェブサイトを独自ドメインで利用する

「[アマゾン ウェブ サービスで静的ウェブサイトをホストする](http://docs.aws.amazon.com/ja_jp/gettingstarted/latest/swh/website-hosting-intro.html)」の記事を参考にS3で静的ウェブサイトホスティングの設定をする。今回はRoute 53に登録してある独自ドメインを使用したいので、**バケット名はドメイン名と同じものにする**のがポイント。

例として、Route 53にはあらかじめ独自ドメイン「www.example.com」が登録されていることとする。

## S3で静的ウェブサイトホスティングの設定をする

1. S3に「www.example.com」のバケット名でバケットを作成する
![Clipboard02.jpg](https://qiita-image-store.s3.amazonaws.com/0/81380/96562e93-8e37-ae1c-33c7-5600ae3cbf18.jpeg)

1. バケット一覧でバケットを選択し、右上の「プロパティ」をクリックするとバケットの情報が表示される
![Clipboard05.jpg](https://qiita-image-store.s3.amazonaws.com/0/81380/a2a76aee-ed49-e706-a145-5237eb153515.jpeg)

1. プロパティの「アクセス許可」で「バケットポリシーの編集」をクリックするとバケットポリシーエディターが開く
![Clipboard01.jpg](https://qiita-image-store.s3.amazonaws.com/0/81380/c8d738dc-4968-d3f5-ec64-c32f3277c53c.jpeg)

1. バケットポリシーを編集し、誰でもこのバケットの内容を閲覧できるように設定する（「[ステップ3](http://docs.aws.amazon.com/ja_jp/gettingstarted/latest/swh/getting-started-configure-bucket.html)」参考）
![Clipboard03.jpg](https://qiita-image-store.s3.amazonaws.com/0/81380/fbdb944d-968f-e74a-1278-aef7f0faf523.jpeg)

1. ウェブサイトのホスティングを有効にする
「インデックスドキュメント」はエンドポイントのURLにアクセスした際に表示されるファイル、「エラードキュメント」は存在しないファイルのURLにアクセスした際等に表示されるファイル
![Clipboard04.jpg](https://qiita-image-store.s3.amazonaws.com/0/81380/af4dd872-d341-9fc4-7b28-4faefa73625f.jpeg)

1. コンテンツ（index.html, error.html等）を作成して、バケットにアップロードする
![Clipboard06.jpg](https://qiita-image-store.s3.amazonaws.com/0/81380/7a91eb5b-a81c-a211-181c-a5563988f04f.jpeg)

1. エンドポイントのURLにアクセスすると、index.htmlの内容が表示される

## Route 53に登録してあるドメイン名を関連付ける

1. Route 53で「Hosted Zones」から関連付けを行うドメイン名を選択する

1. 「Create Record Set」ボタンをクリックし、Aレコードを登録する
 「[ステップ5](http://docs.aws.amazon.com/ja_jp/gettingstarted/latest/swh/getting-started-configure-route53.html)」の説明では、「 [Alias Target] をクリックします。リストから www サブドメインのウェブサイトエンドポイント（www.example.com）を選択します。」のように記載があるが、実際にリストに表示されるのは`(www.example.com)s3-website-ap-northeast-1.amazonaws.com`のように長いもの。ステップ5の説明に貼ってあるキャプチャーのように「Alias Target」に「www.example.com」と入力するとエラーで登録できないので注意。
 （S3で静的ウェブサイトのホスティングを有効にしたバケットを登録すると以下のように「Alias Target」のプルダウンに表示されるようになる）
![Clipboard07.jpg](https://qiita-image-store.s3.amazonaws.com/0/81380/64d59f8b-f94c-1df7-e4c6-0114d6d475df.jpeg)

1. レコード登録後、しばらくすると設定したドメイン名でS3のコンテンツにアクセスできるようになる
![Clipboard08.jpg](https://qiita-image-store.s3.amazonaws.com/0/81380/67b01bd7-9312-781c-b6fb-679eb94b15ff.jpeg)

## まとめ
- S3のバケット名はドメイン名と同じものにする
- Route 53でAレコードのAlias TargetにS3のエンドポイントURLを指定する
Hinemos情報のオレオレまとめ

# [概要]
## Hinemosとは
NTTデータが開発する、開発する監視OSSである。

## 特徴
- OSSで提供している
- 日本生まれのソフトウェア
- ワンパッケージでインストール可能

## 公式リンク
* 公式サイト
 - http://www.hinemos.info
* Hinemos 技術情報公式
 - http://www.hinemos.info/technology


# [知っておくべきこと]
あれば随時更新

# [目次]
* [Hinemos ver5.0のインストールからエージェントインストールまで](http://qiita.com/mackerel/items/8f9fb87938cc3083db89)
* [Hinemos ver5.0の監視設定](http://qiita.com/mackerel/items/a873fd40f58741631fd2)
* [AWS上にHinemosを構築する](http://qiita.com/mackerel/items/77609eeb74a7635c2cf0)
* [Hinemosトラブルシューティング](Hinemosトラブルシューティング)
AWS IAMアカウントの作成、設定、IAMアカウントでのログイン


AWSの操作には基本的にルートアカウントを使用せずにIAMアカウントを作成する。

#1.サービス　→　IAM →　ユーザ　→　新規ユーザの作成でユーザを作成する
![Kobito.ee0hoq.png](https://qiita-image-store.s3.amazonaws.com/0/72578/d82f0621-b1a9-435e-03ce-d1fbed9cdbaf.png "Kobito.ee0hoq.png")

#2.IAMアカウントが作成され、認証情報がダウンロードできる
＊認証情報のダウンロードはこの1回限りで紛失すると認証情報の再作成が必要となるので注意

#3.IAMアカウントへの権限設定
今回は管理者権限を持ったIAMアカウントを作成するので、以下とした。

+ AdministratorAccessのポリシーを設定したグループを作成
+ ユーザにグループを割り当て

#4. IAMアカウントにパスワードを設定

+ パスワードポリシーの設定

アカウント設定→必要な設定にチェックボックス欄チェック→パスワードポリシーの適用

![Kobito.uFV4Qf.png](https://qiita-image-store.s3.amazonaws.com/0/72578/ae8f48d1-3461-03af-c838-4c427c3d4aff.png "Kobito.uFV4Qf.png")

+ IAMアカウントにパスワードを設定
IAMアカウントを選択→パスワードの管理→自動作成パスワードの割り当てでパスワードを設定
以下設定が完了した後の画面
![Kobito.He8c03.png](https://qiita-image-store.s3.amazonaws.com/0/72578/02ba5108-afed-3326-4dfa-987ea015587f.png "Kobito.He8c03.png")


#4. IAMアカウントでのAWSコンソールへのサインイン

+ ログイン用URLのカスタマイズ

サービス → IAM で表示されているIAMユーザのサインインリンク　横のカスタマイズボタンを押す
![Kobito.KKXBOH.png](https://qiita-image-store.s3.amazonaws.com/0/72578/4af13285-f27d-c9b0-bcba-2084a7a9b19f.png "Kobito.KKXBOH.png")

アカウントの別名を作成で、IAMアカウント名を入力して、はい、作成するボタンを押す
![Kobito.j7bBIS.png](https://qiita-image-store.s3.amazonaws.com/0/72578/171ab4d8-92aa-6518-8589-66ad8b139d92.png "Kobito.j7bBIS.png")

+ 上の手順でカスタマイズしたURLにアクセスログインする
![Kobito.xzY4s0.png](https://qiita-image-store.s3.amazonaws.com/0/72578/051dd1be-e523-cc47-620a-90f977238e50.png "Kobito.xzY4s0.png")


#5. 設定できたらルートアクセスキーは削除する。
Macにパッケージ管理ツール(Homebrew)を導入するよ。


# 概要
Macって標準ではyumとかapt-getみたいなのが入っていないんですね…。

今回は、(表題ままですが)MacにHomebrewを導入する方法を綴ります。

※検証環境は OS X Yosemite です。

# Homebrewって？
CentOSで言うところのyumみたいなやつ。
パッケージのインストールとかが簡単にできるよ！

- [Homebrew — The missing package manager for OS X](http://brew.sh/)

# 導入手順

公式のトップにでかでか書いてありますが一応。 (^o^)/

### 1. ターミナルを起動
![ss_229.png](https://qiita-image-store.s3.amazonaws.com/0/97611/48d2a002-a665-31f8-58f4-0adbf7edcbbe.png)

<br>

### 2. コマンドを入力

インストールコマンドはこちら。
`$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`

↓こんな表示が出たら、Enterを押して続行してね。
`Press RETURN to continue or any other key to abort`

パスワードを求められたら入力してEnter！
`Password: `

<br>
最後にこんな表示になったらOK！

```
==> Installation successful!
==> Next steps
Run `brew help` to get started
```


これでインストールは完了！

とっても簡単ね！

# 試しに何か入れてみる

これも公式ままだけど、wgetをインストールしてみるよ！

### 1. コマンドを入力

`$ brew install wget`

### 2. あとは待つだけ

```
MyMac:~ sango$ brew install wget
==> Installing dependencies for wget: openssl
==> Installing wget dependency: openssl
==> Downloading https://homebrew.bintray.com/bottles/openssl-1.0.2d_1.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring openssl-1.0.2d_1.yosemite.bottle.tar.gz
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl/certs

and run
  /usr/local/opt/openssl/bin/c_rehash

This formula is keg-only, which means it was not symlinked into /usr/local.

Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/openssl/lib
    CPPFLAGS: -I/usr/local/opt/openssl/include

==> Summary
☆  /usr/local/Cellar/openssl/1.0.2d_1: 464 files, 18M
==> Installing wget
==> Downloading https://homebrew.bintray.com/bottles/wget-1.16.3.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring wget-1.16.3.yosemite.bottle.tar.gz
☆  /usr/local/Cellar/wget/1.16.3: 9 files, 1.5M
MyMac:~ sango$
```

ログが止まって入力待機状態になったらインストール完了！