OmniAICreator/Qiita-1.07M huggingface dataset:
aws-sdk を利用して Ruby で AWS にアクセス

# はじめに
AWS で管理するマシンの台数が増えてくると、各種作業を自動化したくなってくる。
色々選択肢はあるが、今回は [SDK for Ruby](http://aws.amazon.com/jp/sdk-for-ruby/) を利用して、Ruby から AWS にアクセスしてみる。

# 環境
下記の環境を前提に作業を進める。

* OS: CentOS 6.4
* Ruby: 2.1.0p0
* aws-sdk: 2.0.6.pre


# インストール
## 作業用ディレクトリの作成

適当な作業ディレクトリを用意する。
今回は `~/projects/aws_ruby`  以下で作業を行う。

```
$ mkdir -p ~/projects/aws_ruby
$ cd ~/projects/aws_ruby
```

## aws-sdk のインストール
作業ディレクトリの `vendor/bundle` 以下に Gem をインストールする。
作業ディレクトリで下記コマンドを実行。

```
$ bundle init
```

作成された Gemfile を以下のように編集。

```ruby:Gemfile
# A sample Gemfile
source "https://rubygems.org"

gem 'aws-sdk', '2.0.6.pre'
```

```
$ bundle install --path vendor/bundle
```

## access_key と secret_access_key の作成
AWS のダッシュボードから、

* Administration & Security
  * Identity & Access Management (IAM)
     * Users
          * Create New Users

を選択し、ユーザー名を入力。次の画面の `Show User Security Credentials` をクリックすると `access key` と `secret_access_key` が確認できる。

次に作成したユーザーを選択し、 Attach User Policy をクリック。
今回はテンプレートにある Administrator Access を選択して Apply Policy をクリックする。
これでAWSの全ての機能にアクセス出来るユーザーが作成できた。

特定の機能のみ許可できるようにするには、Policy を適切に設定してやればよい。

## config の作成
`access_key` 、 `secret_access_key`、`region` の設定を `config_ec2.yml` に記述する。

例えば東京リージョン の Region 名は `ap-northeast-1`。
その他 Region名の一覧は[ここ] (http://docs.aws.amazon.com/general/latest/gr/rande.html#ec2_region)にある。

 `config` ディレクトリを作成し、設定ファイルを編集する。

```yaml:config/config_ec2.yml
access_key_id: "さっき取得した access_key"
secret_access_key: "さっき取得した secret_access_key"
region: "ap-northeast-1"
```

# サンプルコード実行
下記のようにコードを記述する。

```ruby:src/get_instance_id.rb
#!/usr/bin/env ruby
#-*- coding: utf-8 -*-

require 'yaml'
require 'bundler'
Bundler.require

# Load config file
config = YAML.load(File.read "config/config_ec2.yml")

# Create ec2 object
ec2 = Aws::EC2::Client.new(
  access_key_id: config["access_key_id"],
  secret_access_key: config["secret_access_key"],
  region: config["region"]
  )

# Access describe of instances
reservations = ec2.describe_instances.reservations
reservations.each_with_index do |reservation, i1|
  reservation.instances.each_with_index do |instance, i2|
    puts "i1: #{i1}\ti2: #{i2}\tID: #{instance.instance_id}"
  end
end
```

作業ディレクトリ直下で下記コマンドを実行。

```
$ ruby src/get_instance_id.rb
i1: 0 i2: 0 ID: i-AAAAAAA
i1: 1 i2: 0 ID: i-BBBBBBB
...
```

# おわりに
これで AWS に Ruby からアクセス出来るようになった。
次はインスタンス作成・削除等を行えるようにしたい。
CircleCIのマシンにSSHする方法

目的
----

CircleCIを使い始めましたが、ブラウザ越しだと実際どんなマシン環境なのかよく分かりません。そこでSSHログインしてマシン環境がどうなっているか見てみたいと思います。

前提
----

まだ使い始めて間もないので、間違った理解で書いてる可能性が大きいです。

手順
----

### SSH用にビルドする

こちらに方法が書いてあります。
https://circleci.com/docs/ssh-build

CircleCIのホーム画面から実際に調査して確認したいビルドを選択します。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/7c4cfebb-0a0d-8a0d-4cef-ee2a58e10c11.png)

するとビルドの詳細画面の右上に「& enable ssh」というボタンがあります。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/1946446b-9cef-6129-e423-37182796ad0b.png)

これを押下します。すると、下記のように30分SSHが有効になった事が分かります。接続情報も記載されているのでこれを使ってSSHログインします。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/82b78e78-036d-0434-5d04-85ed95871023.png)

ちなみにCircleCIの環境は常に起動していてSSHも常時OKという形ではなく、GitHubへのPUSHなどの契機からビルドが始まりテストやデプロイ等が終わると消えていくという形なのかなと想像しています。SSH用にビルドすると、下記のような履歴になりました。RunningしてるところがSSHが有効になっているところでSSHを終了してビルドをキャンセルしないと次のビルドが走らないようになっています。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/f4cb79e9-8290-dce6-a3d8-5fdd109fba6f.png)

### SSHログインする

下記のようなコマンドでSSHログインします。

```
$ ssh -p xxxx ubuntu@xx.xx.xxxx.xxx -i ~/.ssh/<GitHubの秘密鍵>
```

するとCircleCIのubuntuにログインができます。

### 環境を確認する

```
ubuntu@box290:~$ ls -l
total 944
drwxr-xr-x 1 ubuntu ubuntu     34 Jan  2 00:20 bin
drwxr-xr-x 1 ubuntu ubuntu     20 Jan  2 00:31 cassandra.logdir_IS_UNDEFINED
drwxrwxr-x 1 ubuntu ubuntu    382 Jan 28 14:10 <GitHubからcloneしたリポジトリ>
drwxr-xr-x 1 ubuntu ubuntu    594 Jan  1 23:53 nvm
-rw------- 1 ubuntu ubuntu    668 Jan  1 22:41 openssl.patch
drwxr-xr-x 1 ubuntu ubuntu     42 Jan  1 23:29 php
-rw------- 1 ubuntu ubuntu   2502 Jan  2 00:30 pkg-versions.sh
-rw-r--r-- 1 ubuntu ubuntu     55 Jan  1 23:28 postgis-2.1.0.tar.gz.md5
-rw-r--r-- 1 ubuntu ubuntu 844148 Jan  2 00:20 setuptools-3.4.4.zip
drwxr-xr-x 1 ubuntu ubuntu     16 Jan  2 00:25 target
-rw-r--r-- 1 ubuntu ubuntu 104949 Jan  2 00:35 versions.json
```

rootにもなれるようです。

```
ubuntu@box290:~$ sudo su
root@box290:/home/ubuntu# 
```
DjangoのログをLTSVで出力する


備忘録。

Djangoのログフォーマットを切り替えるには`logging.Formatter`を継承したカスタムクラスを作れば良い。`format()`メソッドを追加して`str`オブジェクトを返すようにする。

```python:log_formatter.py
import logging
import socket
from django.utils.datastructures import SortedDict

from ltsv import ltsv


class LTSVFormatter(logging.Formatter):
    def format(self, record):
        # dictオブジェクト並び順が保証されない？のでDjango SortedDictを使っている
        data = SortedDict()
        data['host'] = socket.gethostname()
        data['time'] = record.created
        data['pid'] = record.process
        data['level'] = record.levelname

        # ログメッセージが辞書の場合には出力データにそのままマッピングする
        if isinstance(record.msg, str):
            data['msg'] = record.msg
        elif isinstance(record.msg, dict):
            data.update(record.msg)

        return ltsv.writer(data).decode('utf-8')
```

`settings.LOGGING`のformattersに次のように追加する。カスタムフォーマッタを使うには`()`というキーにコーラブルオブジェクトを渡す。[公式のドキュメント](https://docs.djangoproject.com/en/1.7/topics/logging/)に書いてなくて、コード読んで初めて知った…。


```python:settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'ltsv': {
            '()': 'apps.base.logging.LTSVFormatter',
        },
    }
}
```

出力結果。

```text
host:mbp15-retina.local	time:1422418685.587985	pid:58432	level:INFO	msg:Hello world!
```

余談。

pypiにあるltsvモジュールは`writer()`が上手く動かなかった。[フォークされているコード](https://github.com/koseki/python-ltsv/tree/improve-writer)は正常に動作した。[プルリク投げられてる](https://github.com/hekyou/python-ltsv/pull/10/commits)のでマージしてほしいなあ…。

----

# 参考

* [16.6. logging — Logging facility for Python](https://docs.python.org/3/library/logging.html)
Go でファイルから複数の JSON をストリーミングして読み込む

以前に、あらゆるログを 1 行ずつの JSON として出力しよう、という趣旨の記事を書きました。

* [あらゆるログを JSONable に、というご提案](http://qiita.com/yuya_takeyama/items/825ceb6a2f4ab251745c)

JSON のログを正しく運用するには、それ用のツールが必要になってくるでしょう。
多くの問題は [jq](http://stedolan.github.io/jq/) が解決してくれるかもしれません。
(Ruby が得意な方には [jr](https://github.com/yuya-takeyama/jr) がオススメ)
ですが、より特化したツールを Go で作りたい、というときのやり方です。

# JSON ファイルを用意する

```json:test.json
{"foo":"bar","qux":"quux"}
{
  "more":{
    "nested": ["structure"]
  }
}
"hoge"
42
1.01
true
false
null
```

いろんなデータを試すためにあえて変なデータを混ぜてます。
基本的にはインデント無しで 1 行ずつ Object を書き込むようにすると、`tail -F` したときに壊れなくて良いでしょう。

あと、JSON といえば以前は `Object` か `Array` のみでしたが、最近は `String` や `Number` などだけの値も JSON に含まれるようになったそうです。

* [RFC 7159](https://tools.ietf.org/html/rfc7159)
* [json に値を直接書く話](http://blog.64p.org/entry/2014/12/14/180805)

# Write in Go

ここでは標準入力から JSON を読み込んで、[k0kubun/pp](https://github.com/k0kubun/pp) で prettify するだけのものを実装してみます。

`json.Decoder` を使うだけです。
for ループのなかで `error` として `io.EOF` を返すまで `Decode()` し続けます。

```go:main.go
package main

import (
	"encoding/json"
	"github.com/k0kubun/pp"
	"io"
	"os"
)

func main() {
	d := json.NewDecoder(os.Stdin)
	var data interface{}

	for {
		err := d.Decode(&data)
		if err != nil {
			if err == io.EOF {
				break
			} else {
				panic(err)
			}
		}

		pp.Println(data)
	}
}
```

実行結果は以下の通りです。

```
$ cat test.json | go run main.go
{
  "foo": "bar",
  "qux": "quux",
}
{
  "more": {
    "nested": []interface {}{
      "structure",
    },
  },
}
"hoge"
42
1.01
true
false
nil
```

実際はカラフルなのでキャプチャも載せておきます。
![1f28b74943aa81a082d33a30e936665b.png](https://qiita-image-store.s3.amazonaws.com/0/208/1f44352a-236d-c38c-4922-925b2fb2514d.png)

# 加えて

今回の例はファイルでなくとも JSON を持った `io.Reader` だったら何にでも適用できます。
上記の実装も、普通のファイルではなく標準入力から読み込んでいました。

拙作の [argf](https://github.com/yuya-takeyama/argf) と組み合わせることでコマンドラインツール開発が捗るかもしれません。
Railsで開発をしていてGem作ったりして、プロダクトに取り込もうとした時の話

## 状況
Railsで開発をしていて、Gemを使おうとしたが、期待通りの動きではなかったのでforkして開発した。
そしていざプロダクトに取り込もうとして「あれ？あれ？」となったお話。

## Gem
```sh:fork元
https://github.com/wtnabe/jshint4r
```

```sh:fork先
https://github.com/amanattou44/jshint4r
```

## 現状と対策
Gemの開発方法がよく分からなかったのでプロダクトにfork元を取り込んだ状態で開発しながら進めていた。
そしていざ、完成して、Gemfileに取り込もうとした時にまず、 [rubygems.org](https://rubygems.org/) に登録する必要があると思って、ずっと奮闘していた。
結論から言うと [rubygems.org](https://rubygems.org) にforkした物は取り込めない。
こういうエラーが出る。

```shell-session
Pushing gem to https://rubygems.org...
You do not have permission to push to this gem.
rake aborted!
```

じゃあどうするか、と言えばこうする。

```rb:Gemfile
gem 'jshint4r', github: 'amanattou44/jshint4r'
```

こうする事でGitHubを指定する事が出来る。

そして次に `bundle install` するとエラーが出て困った。

```shell-session
jshint4r at /プロダクト/vendor/bundle/ruby/2.1.0/bundler/gems/jshint4r-ee196b6af
cd6 did not have a valid gemspec.                                                                     
This prevents bundler from installing bins or native extensions, but that may not affect its functionality.                                                                                                 
The validation message from Rubygems was:                                                             
  ["vendor/jshint/CHANGELOG", "vendor/jshint/Makefile", "vendor/jshint/README.md", "vendor/jshint/jshint.js"] are not files                                                                                 
```

???となったが、よくよく考えるとこのfork元はgit submoduleを使っていた為、それらが無いよ、との事だった。

![スクリーンショット 2015-01-28 14.23.40.png](https://qiita-image-store.s3.amazonaws.com/0/11101/dfd4daa1-7456-1eb1-c258-55e6ceb9926d.png)

こういうの。
最初、submoduleという単語を忘れていた為に結構どハマりした。
単語を思い出したら即解決したし、bundlerスゲーってなった。

これを解決する為にはどうすればいいかは [PR#1935](https://github.com/bundler/bundler/issues/1935) に書いてあるが、

```rb:Gemfile
gem 'jshint4r', github: 'amanattou44/jshint4r', submodules: true
```

とすれば、 `git submodule update --init` してくれる。
以上が、開発してからプロダクトの `vendor/bundle` に取り込むまでに苦労しました。

## 所感
やっぱりRails、便利！
あと、Gemに関しては今後も改良して行きたいし、erb, haml, jadeなどにも対応して行きたい。
inlineのjavascript:配下をただぶっこ抜いてるだけなので、ここら辺もリファクタしたいと思う。
jshintも最新の使うようにしたい。

## 追記
あ、ちなみにHTMLにcompileしてから `jshint --extract=auto target.html` って普通の人はすればいいと思うので、これを使うメリットは無いです！
[参考URL](http://bahmutov.calepin.co/linting-javascript-inside-html.html)
スクロールで表示された時に、画像を読み込む


画面外に画像がある時、その画像を表示する所までスクロールされたら、その画像を表示させる。縦に長いページとかで使う。

```css
img {
	background-attachment: scroll;
}
```

追記:

コレ間違いです。やり方忘れた。なんか方法あった気がするけどなんだったっけね。
bisonをソースコードビルドする


# 概要
## これはなに？
- 構文解析ツール
- http://www.gnu.org/software/bison/

## 目標
- bison-3.0.4 の実行ファイルが使用可能になる

## 実行環境
- CentOS-7.0
- [ソースコードビルドするための環境](http://qiita.com/boscoworks/items/0d442d446436f7d72183)

## 依存パッケージ
- なし

# 導入手順
## tar.gz をダウンロードする
```
wget http://ftp.gnu.org/gnu/bison/bison-3.0.4.tar.gz -P /usr/local/share/downloaded/
```

## tar.gz を解凍する
```
tar -zxvf /usr/local/share/downloaded/bison-3.0.4.tar.gz -C /usr/local/src/
```


## configure を実行する
```
cd /usr/local/src/bison-3.0.4/

./configure --prefix=/usr/local/lib/bison-3.0.4
```

## make を実行する
```
make
```

## make install する
```
sudo make install
```

## ディレクトリのシンボリックリンクを作成する
```
sudo ln -s /usr/local/lib/bison-3.0.4 /usr/local/bison
```


# 削除手順
## 導入時に生成したファイルを削除する
```
sudo rm -r /usr/local/share/downloaded/bison-3.0.4.tar.gz
sudo rm -r /usr/local/src/bison-3.0.4/
sudo rm -r usr/local/lib/bison-3.0.4/
sudo rm -r /usr/local/bison
```
【javascript】処理を分岐させるのにswitch caseを使うのはもう終わりにしよう

sensationalなタイトルでごめんなさい。

# 1. 魅力に欠けるswitch-case

```js:bad
var f = function(v) {
  switch (v) {
    case 'a':
      return 1;
      break;
    case 'b':
      return 2;
      break;
    case 'c':
      return 3;
      break;
  }
};

var v = _.sample(['a', 'b', 'c']);
f(v);
```

# 2. アトラクチブな書き方

```js:good
var f = {}
f['a'] = function() {
  return 1;
};
f['b'] = function() {
  return 2;
};
f['c'] = function() {
  return 3;
};

var v = _.sample(['a', 'b', 'c']);
f[v]();
```

### 所感
* 個人的には2のほうが好みです。スコープも切れますし。
素早くSSL/TLSのテストが行えるtestssl.sh

## SSL Server Testは便利だけど時間がかかる

各種サーバにおけるSSL/TLSの設定テストには、[SSL Server Test](https://www.ssllabs.com/ssltest/)がよく使われます。
各種ブラウザにおけるシミュレーション結果など、非常に詳しく出してくれる反面時間がかかります。
また、TCPの443番以外のテストには対応していないため、例えばメールサーバなどのテストを行うことができません。

## そこでtestssl.sh

[testssl.sh](https://testssl.sh/)はシェルスクリプトベースのSSL/TLSのテストツールで、OpenSSL 1.0以降がインストールされているシステムで利用が可能です。

現時点(2015/01/28)の正式版である2.2では、以下の機能をサポートしました。

- POODLE(CVE-2014-3566)に対するチェック
- HPKP(Public Key Pinning Extension for HTTP)への対応
- OCSP Staplingへの対応
- サービスの検出(HTTP, IMAP, POP, SMTP)
など

以下の脆弱性のテストをサポートしています。

|CVE番号|名称|概要|
|-------|----|----|
|CVE-2014-0160|Heartbleed|OpenSSL 1.0.1系列などに存在した有名な脆弱性|
|CVE-2014-0224|CCS Injection|OpenSSLのChangeCipherSpecメッセージの処理に関する脆弱性|
|CVE-2014-3566|POODLE|SSL3に存在する脆弱性|
|CVE-2011-3389|BEAST|TLS1.0までにおけるCBCモードの暗号への攻撃|
|CVE-2013-3587|BREACH|TLS上でやりとりされた圧縮データの特徴を使った攻撃|
|CVE-2012-4929|CRIME|TLSのプロトコルレベル圧縮に対する攻撃|
|CVE-2009-3555|-|TLSのrenegotiationに存在する脆弱性|

(3/13追記) [GitHubにある開発版](https://github.com/drwetter/testssl.sh)ではFREAK(CVE-2015-0204)のテストに[対応しています](https://github.com/drwetter/testssl.sh/commit/77e28922c1a92a234e28a4675e02055c853bb342)。

## 使い方

とりあえず使えるようにするには、testssl.shをダウンロードして実行権限を付与するだけでOKです。

```console
$ wget https://testssl.sh/testssl.sh
$ chmod +x testssl.sh
```

testssl.shをPATHの通ってるところに置いたりとかしておくと便利です。

たとえば、example.com:443をチェックするには以下のコマンドを実行します。

```console
$ ./testssl.sh example.com
(HTTPS:443は省略できます)
```

## 便利なオプション

あるサーバがサポートしている暗号スイートの一覧を表示するには、`-e`オプションを使います。

```console
$ ./testssl.sh -e example.com
```

脆弱性テストは単体でも実行可能で、例えばPOODLEのテストは`-0`オプションです。

```console
$ ./testssl.sh -0 example.com
```
Rails で JIS X 0208 に対応する文字だけを扱うようにする

外部システムとの連携時によくあるのが、使用できる文字の問題

とある決済系の外部システムとの連携で、使用可能な全角文字は、JISX0208 ( JIS 非漢字 + JIS 第一水準 + JIS 第二水準 ) だけですって書いてあって、しばらく途方に暮れた後、色々と調べて何とか実装できた。

ざっくりいうと、文字コードを、正規表現でチェックするやり方。

## サンプルコード
とりあえず、concerns に作成した  

```ruby:app/models/concerns/character_code.rb
module CharacterCode
  extend ActiveSupport::Concern
  # 使用できる文字は、JISX0208 ( JIS 非漢字 + JIS 第一水準 + JIS 第二水準 ) 
  REGEXP = /\A#{"[　-╂亜-腕弌-熙]".encode("SHIFT_JIS")}+\z/

  def self.jisx0208_include?(target_string)
    REGEXP.match(target_string.encode("SHIFT_JIS")).present?
  rescue Encoding::UndefinedConversionError
    false
  end
end
```

場合によっては、半角英数字等も OK の場合もあるので、その場合は、正規表現にそのまま追加  

```ruby:app/models/concerns/character_code.rb
module CharacterCode
  extend ActiveSupport::Concern
  # 使用できる文字は、半角英数字と JISX0208 ( JIS 非漢字 + JIS 第一水準 + JIS 第二水準 ) 
  REGEXP = /\A#{"[0-9a-zA-Z　-╂亜-腕弌-熙]".encode("SHIFT_JIS")}+\z/

  def self.jisx0208_include?(target_string)
    REGEXP.match(target_string.encode("SHIFT_JIS")).present?
  rescue Encoding::UndefinedConversionError
    false
  end
end
```

今回は、DBに登録する時点で弾きたかったので、モデルの validate に追加した

```ruby:app/models/user.rb
class User < ActiveRecord::Base
  include CharacterCode

  validate :validate_last_name_available, if: -> { last_name.present? }
  validate :validate_first_name_available, if: -> { first_name.present? }

  private
  def validate_last_name_available
    errors.add(:last_name, 'に使用できない文字が含まれています') unless CharacterCode.jisx0208_include?(last_name)
  end

  def validate_first_name_available
    errors.add(:first_name, 'に使用できない文字が含まれています') unless CharacterCode.jisx0208_include?(first_name)
  end
end
```

正規表現を修正すれば、カタカナ`[ァ-ヶ]`だけとか、ひらがな`[ぁ-ん]`だけとかも可能。

使用できる文字は下記で調べた  

http://ash.jp/code/codetbl2.htm
Twitter Streaming APIからAmazon SNSに転送

## 背景
Qiitaで記事がツイートされると通知が来るのがちょっと嬉しいので、Poinでも同じようなことをしたくて調べています。

## Twitter Streaming APIとは
Twitter Streaming APIを利用すると、ツイートをリアルタイムなストリームとして取得することができます。Twitterそのものですね。
もちろんすべてのツイートをモニターするのは現実的ではありませんが、filterという機能を使用することで特定条件に合致するツイートのストリームを取得できます。
[Twitter Streaming API](https://dev.twitter.com/streaming/overview)
[statuses/filter](https://dev.twitter.com/streaming/reference/post/statuses/filter)

## なぜAmazon SNS + SQSに転送するのか
Steaming APIは非常に魅力的なのですが、取得できるのは接続中のツイートのみで過去にさかのぼってツイートを取得することはできません。そのため、Steaming APIを使うプログラムはできる限りダウンタイムを短くする必要があります。

しかし、ツイートの使い方にはいろいろな可能性があります。プログラム修正時にはどうしてもダウンタイムが発生しますし、もしかしたら複数のプログラムからツイートを利用したくなるかもしれません。

このように入力側と出力側を疎結合させたい場合に、Amazon SNS + SQSは大きな力を発揮します。

## 入力側
Twitter Streaming API経由でストリームを受け取り、ひたすらAmazon SNSにポストします。僕はJava Servletとして実装し、Elastic Beanstalkにデプロイしました。負荷は低いのでt2.microで十分処理できます。

## 出力側
出力側では目的毎にSQSキューを作成し、上記のSNSトピックを購読します。あとはSQSキューをポーリングしながら処理を進めるだけです。ダウンタイムにもキューが溜まるだけなので、安心してコーディングを進める事ができます。
JavaScript から Android 側のメソッドを呼び出す


今回は単純に、WebView 内の JavaScript から Android のトーストを表示してみます。

まず、Android 側で、JavaSript ⇔ Android(Activity) 間のブリッジとなるクラスを新規に作成し、

![スクリーンショット_2015-01-28_13_27_43.png](https://qiita-image-store.s3.amazonaws.com/0/35733/cfd5e0eb-4883-2113-a801-f105f873a227.png "スクリーンショット_2015-01-28_13_27_43.png")

`hogeMethod` メソッドが呼ばれたら、トーストを表示するようにします。

> クラス名は安直に `JavaScript` としましたが、何でもいいです。

```java:JavaScript.java
package com.example.hkusu.javascripttest;

import android.content.Context;
import android.widget.Toast;

public class JavaScript {
    private Context c;

    public JavaScript(Context c) {
        this.c = c;
    }

    public void hogeMethod(String s) {
        Toast toast = Toast.makeText(c, s, Toast.LENGTH_LONG);
        toast.show();
    }
}
```

Android 側の Activity で、WebView インスタンスを生成します。

```java:MainActivity.java
package com.example.hkusu.javascripttest;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.webkit.WebView;

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        WebView wv = new WebView(this);
        wv.getSettings().setJavaScriptEnabled(true);
        //wv.setWebViewClient(new WebViewClient());
        wv.addJavascriptInterface(new JavaScript(this), "android");
        setContentView(wv);
        wv.loadUrl("file:///android_asset/hoge.html");
    }
}
```

> `《WebView》.getSettings().setJavaScriptEnabled(true)` で WebView 内で JavaScript 利用を有効化しています。
> `《WevView》.addJavascriptInterface(new JavaScript(this), "android")` で先ほどの `JavaScript` クラスをアタッチしています。ここの `android` という文字列は任意の文字列で、JavaScript 側から見える『オブジェクト名』です。

次に HTML(JavaScript) を作成します。今回は、WebVeiw でロードする HTML は Android プロジェクトに内包することにします。(もし無ければ)Android プロジェクトの `res`ディレクトリと同じ階層に `assets`ディレクトリを作成して `hoge.html` を設置し、

![スクリーンショット_2015-01-28_13_30_19.png](https://qiita-image-store.s3.amazonaws.com/0/35733/1a6c0c81-613d-d78b-b62d-60ee82cec0d7.png "スクリーンショット_2015-01-28_13_30_19.png")

次のように書きます。

> 単純にボタンが押下されたら `android.hogeMethod()` をコールだけのものです。

```html:hoge.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Toastを表示するテスト</title>
</head>
<body>
<button onClick="android.hogeMethod('ほげほげ')">Toastを表示</button>
</body>
</html>
```

※ もし外部のHTMLファイルを `http://` でロードする場合は、`AndroidManifest.xml` でインターネットアクセスのパーミッションを設定しておく必要があります。

## 動かしてみる

ボタンを押すと..

![Screenshot_2015-01-28-14-46-06.png](https://qiita-image-store.s3.amazonaws.com/0/35733/975f859f-7be7-c3ce-79e5-49af11e96352.png "Screenshot_2015-01-28-14-46-06.png")

トーストが表示されました。

![Screenshot_2015-01-28-14-56-26.png](https://qiita-image-store.s3.amazonaws.com/0/35733/d2fb94eb-c341-98c0-e16d-c8b9b4eca5a3.png "Screenshot_2015-01-28-14-56-26.png")

## おわりに

これを応用すれば、いろいろ出来そう。
アプリケーションエンジニアだけどGHOST（CVE-2015-0235）対応してみた

GHOST（glibcアップデート）対応
=======

Linuxのglibcに深刻なセキュリティホールがみつかりました。
「GHOST」（CVE-2015-0235）と呼ばれているそうです。

インフラ周りは本職ではないのですが、個人的に利用しているLinux（CentOS）があるので急ぎ対応してみました。
ので、よかったら参考にしてください。

**間違っていたら教えてください！（大声）**

基本的にはこちらを参照しています。（僕でも理解出来て、とても分かりやすいです。ありがたし。。）
http://www.walbrix.com/jp/blog/2015-01-ghost.html

※限定された用途で利用しているOSなので、いきなりアップデート＆OS再起動を実施しましたが、商用利用しているOS等は影響範囲含めもろもろご注意をば。。。

CentOSのバージョン確認
--------------

```
$ cat /etc/redhat-release
CentOS release 6.5 (Final)
```

ダメっぽい。。（6.5は対象）

glibcのバージョン確認
-------------

```
$ rpm -q glibc
glibc-2.12-1.7.el6_0.5.x86_64
```

やっぱりダメっぽい。。（2.12は対象）

脆弱性確認
-----

というわけで、脆弱性があるかどうか確認します。

適当な場所に以下のプログラムを作成します。

```
$ vi GHOST.c
```

引用元：http://www.openwall.com/lists/oss-security/2015/01/27/9

```
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define CANARY "in_the_coal_mine"

struct {
  char buffer[1024];
  char canary[sizeof(CANARY)];
} temp = { "buffer", CANARY };

int main(void) {
  struct hostent resbuf;
  struct hostent *result;
  int herrno;
  int retval;

  /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
  size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;
  char name[sizeof(temp.buffer)];
  memset(name, '0', len);
  name[len] = '\0';

  retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);

  if (strcmp(temp.canary, CANARY) != 0) {
    puts("vulnerable");
    exit(EXIT_SUCCESS);
  }
  if (retval == ERANGE) {
    puts("not vulnerable");
    exit(EXIT_SUCCESS);
  }
  puts("should not happen");
  exit(EXIT_FAILURE);
}
```

コンパイルして実行します。

```
$ gcc -o GHOST GHOST.c
$ ./GHOST
vulnerable
```

＼(^o^)／ｵﾜﾀ
（vulnerable=脆弱性あり）

## glibcのバージョンアップ 

というわけで、バージョンアップします。

```
$ yum clean all
$ yum update glibc
```

最後にcompleteが表示されればOK。

バージョン再確認
---------


```
$ rpm -q glibc
glibc-2.12-1.149.el6_6.5.x86_64
```
基本のバージョン自体は変わらないらしい。（修正版として配布される）

OS再起動
-----

```
$ reboot
```

脆弱性再確認
------

```
$ ./GHOST
not vulnerable
```

ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!
（not vulnerable=脆弱性なし）


最後に
---

ざっとアプリケーション確認したけど、僕の環境では問題なく動いてそうε-(´∀｀*)ﾎｯ
これから詳しい原因や影響範囲を調べよう。あと、もっとインフラ周り勉強しなきゃ。

参考サイト
-----
Linuxに深刻なセキュリティホール「GHOST」、今すぐパッチが必要：
http://japan.zdnet.com/article/35059585/
glibcのgethostbyname関数に存在するCVE-2015-0235(GHOST)脆弱性について：
http://www.walbrix.com/jp/blog/2015-01-ghost.html
oss-security - Qualys Security Advisory CVE-2015-0235 - GHOST: glibc gethostbyname buffer overflow：
http://www.openwall.com/lists/oss-security/2015/01/27/9
GHOST脆弱性にyum update glibc、その後リブートする前に

CentOS7で遭遇したトラブル。
本日話題のGHOST脆弱性にyum updateでパッチを当てたところ **SSHログインできなくなってしまった** というものです。

1. root権限でyum update → もちろん成功<br>
(この時点で /root/.ssh/authorized_keys が空ファイルになってしまったよう)
3. リブートしてSSHで再ログインを試みる。公開鍵認証が通らない。
4. パスワード認証でSSHログインを試みる。しかしパスワード認証は切ってあった！
5. VPSのリモートコンソールでログインし状況確認を試みる。この時点で、/root/.ssh/authorized_keys が空になっており、タイムスタンプがアップデート作業した頃になっているのを確認。
6. パスワードログインで入れるよう、sshdの設定ファイルを修正（ただし、リモートコンソールゆえの苦労がたくさん。キーボード配列がおかしくvimもemacsも保存ができなかったのでUNIXツール類を組み合わせて書き換えたりするなど）。
6. sshdを再始動してログイン成功。
7. このままじゃまずいし公開鍵を置き直すか… え？ /root/.ssh/authorized_keys の内容が復活している！？

最初に authorized_keys が空になってしまったのも再ログイン成功後に authorized_keys の内容が復活しているのも、見間違えでない証拠に、タイムスタンプが変わっていました。誰の仕業なんだ…

ともかく、yum update glibc の動き、どうもおかしゅうございます。
パッチ適用後はリブートする前に authorized_keys を確認し、もし異常があればsshdの設定を変えてパスワードでも入れるようにしておいてから抜けることをお薦めします。

```:/etc/ssh/sshd_config
PasswordAuthentication yes
```
ボタンのマウスホバーとクリックを共存させる

例えば、オン・オフの画像があって、以下のような動きをしたかった。
1. マウスホバーでオン・オフが切り替わる
2. クリックでオンがオフ、オフがオンに切り替わる

これだけのことなんだけど、2の時、それをマウスホバーしたときにリンクの切れた画像が表示されてしまって、うまくいかなかった。

## マウスホバーのスクリプトと、クリックのスクリプトを単に一緒にするだけだとだめだった

まずはそれぞれのスクリプトから
前提として、オンの時の画像名には`_o`を末尾につけています。
`img_◯◯_o.png`みたいな



```マウスホバー時
$(function(){
	var $img = $('.img');
    var src = $img.attr('src');
    var srcOn = src.substr(0, src.lastIndexOf('.')) + '_o' + src.substring(src.lastIndexOf('.'));
    var srcOff = src.substr(0, src.lastIndexOf('.')) + 	src.substring(src.lastIndexOf('.'));

    $img.hover(function() {
        $(this).attr('src', srcOn);
      }, function(){
        $(this).attr('src', srcOff);
    }) 
})
```



```クリック時
$(function(){
	var $img = $('.img');
    var src = $img.attr('src');
    var srcOn = src.substr(0, src.lastIndexOf('.')) + '_o' + src.substring(src.lastIndexOf('.'));
    var srcOff = src.substr(0, src.lastIndexOf('.')) + 	src.substring(src.lastIndexOf('.'));

    if ($(this).hasClass('on')) {
        $(this).removeClass('on');
        $(this).attr('src', srcOff);
    }else {
        $(this).addClass('on');
        $(this).attr('src', srcOn);
    }
})
```

このままだと、ボタンがオフの時はいいけど、オンになってしまっていると、`_o`が付いているものにさらに`_o`をつけることになってしまうので、そんな画像はねぇよって怒られた・・・。これだと困ります。

## フラグを使って状態を判断
フラグでオフの時は`false`，オンの時は`true`として、今の状態がオンなのかオフなのか判断すればいいみたい。

ということで、最終的なコードはこうなりました。


```jQuery
$(function(){
	var flag = false;
	var $img = $('.img');
	var src = $img.attr('src');
	var srcOn = src.substr(0, src.lastIndexOf('.')) + '_o' + src.substring(src.lastIndexOf('.'));
	var srcOff = src.substr(0, src.lastIndexOf('.')) + 	src.substring(src.lastIndexOf('.'));

	// クリック時
	$img.click(function(e) {
      e.preventDefault();
	   // フラグがtrue(オン)だったら 
      if (flag) {
        $(this).attr('src', srcOff);
		 // フラグをfalse(オフ)に戻す
        flag = false;
	   // フラグがfalse(オフ)だったら 
      }else {
        $(this).attr('src', srcOn);
		 // フラグをtrue(オン)に
        flag = true;
      }
    })

	//マウスホバー時
    $img.hover(
      function() {
		 //状態がオンの時、画像のURLを元に戻して、状態がオフの時、_oをつける
        if(flag){
          $(this).attr('src', srcOff);
        }else {
          $(this).attr('src', srcOn);
        }
      }, function(){
		 //状態がオンの時、_oをつけて、状態がオフの時、画像のURLを元に戻す
        if(flag){
          $(this).attr('src', srcOn);
        }else {
          $(this).attr('src', srcOff);
        }
      }
	)
})
```

これで理想とする動きになりました。

ポイントはflagで状態を判断すること。
良かったら参考にしてください。
HTTP GET / POST それぞれで Jenkins パラメータ付きビルド

Jenkins 1.585 で確認。


GET でも POST でも方法があるが、URL やデフォルト値の扱いに違いがある。

デフォルト値とは、Job 設定の「ビルドのパラメータ化」でパラメータ毎に設定できるもので、設定しておくと Web UI からビルドするときにビルド時のフォームに最初から入力された状態になる。

### POST で行う場合(1)

公式ドキュメントによれば
https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API

>
```
curl -X POST JENKINS_URL/job/JOB_NAME/build \
  --user USER:PASSWORD \
  --form file0=@PATH_TO_FILE \
  --form json='{"parameter": [{"name":"FILE_LOCATION_AS_SET_IN_JENKINS", "file":"file0"}]}'
```

上記のように `/job/JOB_NAME/build` にフォームデータのようにして POST すればよい。この場合、直接ビルドキューに入れるような動作になり、Job 設定で入力したデフォルト値とは独立してビルドされる (反映されない)。

### GET で行う場合
```
JENKINS_URL/job/JOB_NAME/buildWithParameters?MYNAME=foo&MYPARAM=bar
```

`/job/JOB_NAME/buildWithParameters` にクエリパラメータで渡せば良い。この場合だと、クエリパラメータに特に指定しない場合には Job 設定のデフォルト値を使ってビルドされる。

### POST で行う場合その(2)

上記の "GET で行う場合" の URL にそのまま POST でアクセスした場合も、GET 同様の動作となる。

### まとめ
- デフォルト値と関係無くやりたいなら POST で `/job/JOB_NAME/build`
- デフォルト値を使いたいなら `/job/JOB_NAME/buildWithParameters` 、GET でも POST でも。

自分はデフォルト値を指定して使う場合が多いので、`buildWithParameters` のほうが使いやすかった。

昔のバージョンと違う気がするのだけどどうだったかな…
Chromeアプリ：アイコンをクリックしたらhtmlを表示するアプリ

メモ代わりに使っていきます。

#chromeアプリを作ってみます。

1.デスクトップにファルダを作り，以下のファイルを作成します。

```manifest.json
{
  "name": "sample app",
  "version": "1.0",
  "manifest_version": 2,
  "icons": {
     //アイコン画像
  },
  "description": "sample app",
  "browser_action": {
    "default_popup": "popup.html"
  }
}
```

```popup.html
<h1>popup</h1>
```
2.chromeブラウザを開いて，URLの右側にある三本線をクリック
![スクリーンショット 2015 01 28 15.20.29.png](https://qiita-image-store.s3.amazonaws.com/0/67439/179d704d-0c0a-5852-3716-b77125cd8e29.png)

「その他のツール」から「拡張機能」を開く。
3.下図のようにデベロッパーモードをチェックし，先ほどのフォルダを拡張機能に読み込ませる。
![スクリーンショット 2015 01 28 15.06.49.png](https://qiita-image-store.s3.amazonaws.com/0/67439/20ff55ce-34da-4193-7cda-b3f2cda3daaf.png)

popupアイコンができてクリックすると以下のように表示される。
![スクリーンショット 2015-01-28 15.18.23.png](https://qiita-image-store.s3.amazonaws.com/0/67439/a91f2320-ff28-e0dc-9501-8230ca31da49.png)
##参考文献
>[ドットインストール：Google Chrome拡張機能入門](http://dotinstall.com/lessons/basic_chrome_v2)
【jQuery】ラジオボタンの状態取得と選択制御


以下のようなHTMLを想定して、ラジオボタンの状態取得（どの要素が選択されているかを取得する）と選択制御（ソースコードから指定の要素を選択する）を行う。

```html
<p class="radio-area">
	<input type="radio" name="lang" value="ruby" checked="checked">Ruby
	<input type="radio" name="lang" value="perl">Perl
</p>

<button type="button" name="radio-change" value="radio-change">切替</button>
```

## ラジオボタンの状態取得

どのラジオボタンが選択されているかどうかは、以下のいずれかで取得できる。

```javascript
// 以下はすべてRubyが選択されていた場合にtrue
// 1.
$('input[name=lang]:checked').val() === 'ruby';

// 2.
$('input[name=lang]:eq(0)').prop('checked');

// 3.
$('input[name=lang]:eq(0)').is(':checked');
```

## ラジオボタンの選択制御

指定の要素を選択するためには、以下のいずれかの方法で実現可能。

```javascript
// 以下はすべてRubyを選択する処理
// 1.
$('input[name=lang]').val(['ruby']);

// 2.
$('input[name=lang]:eq(0)').prop('checked', true);
```

## ラジオボタンの切替機能を実装

状態取得と選択制御の処理を組み合わせて、ボタンを押すたびに要素の選択を切り替える機能を実装する。

```javascript
// 2.の方法を使ってみる
$('[name=radio-change]').click(function() {
	if ($('input[name=lang]:eq(1)').prop('checked')) {
		$('input[name=lang]:eq(0)').prop('checked', true);
	} else {
		$('input[name=lang]:eq(1)').prop('checked', true);
	}
});
```

## おまけ
attr()とprop()とか、checked属性とcheckedプロパティとか、そこら辺ざっと調べてみたことを書いたので、興味ある方はどうぞ。
[attr()とprop()とchecked属性とcheckedプロパティと...](http://tomcky.hatenadiary.jp/entry/2015/01/28/attr%28%29%E3%81%A8prop%28%29%E3%81%A8checked%E5%B1%9E%E6%80%A7%E3%81%A8checked%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%A8___)
ifconfig -a に要注意


普段Linuxを使っている方は、ネットワーク設定を確認するときに`ifconfig -a`を躊躇なく(時にはrootで!)実行しているのではないでしょうか。

## `ifconfig -a`の持つ意味

SunOS/Solarisでは`ifconfig -a`は若干違う意味を持つので注意が必要です。

>  -a
>
>    Apply the command to all interfaces of the specified address family. If no address family is supplied, either on the command line or by means of /etc/default/inet_type, then all address families will be selected.

Oracle社の[マニュアル](http://docs.oracle.com/cd/E19253-01/816-5166/6mbb1kq31/)より

上記にあるように、commandをすべてのinterfaceにapplyするということだけを意味しています。interfaceのステータスを表示する、ということに限定はしていません。

つまり、例えば以下のようなcommandを入力した場合、

```
ifconfig -a down
```

そのホストのすべてのinterfaceがダウンすることになってしまいます。`-a`の後ろにcommandを追加した途端に、危険なcommandへと変貌してしまうのです。

## やってしまいそうなミス
また、SunOS/SolarisではIPv4アドレスが設定されているinterfaceのステータスを確認する際に以下のようなcommandを実行しますが、

```
ifconfig -a4
```

これを間違って、

```
ifconfig -a 4
```

と入力してしまうと、すべてのinterfaceのアドレスが、0.0.0.4というIPv4アドレスに設定されることになってしまいます<sub>[IPアドレス表記](#1)</sub>。

## MacやLinuxではどうか
一方、MacOSXやLinuxのmanでは以下のように書かれています。

> if a single  -a  argument  is  given,  it  displays the status of all interfaces, even those that are down.  Otherwise, it configures an interface.

ここでは明示的に、すべてのinterfaceのステータスを表示する、ということが書かれており、間違って全てのinterfaceの設定を変更してしまう、ということは無さそうです。

## どう対策するか
そもそも、interfaceのステータス表示させるためにはroot権限は不要ですので、不用意にrootで作業をしないという基本ルールでこのようなミスは防ぐことができます。

***
<a name="1">IPアドレス表記</a>
このように数値をIPアドレスとして解釈してしまうのは、IPv4アドレスを`192.168.0.1`のような[RFC3986](http://www.ietf.org/rfc/rfc3986.txt)で規定されたドット表記だけではなく、`3232235521`という数値表記であっても許容するように、`gethostbyname()`や`inet_aton()`といった関数で実装されているためです。SunOS/Solarisだけではなく、LinuxやMacOSXでも数値表記は可能となっています。

```
$ ping 3232235521
PING 3232235521 (192.168.0.1): 56 data bytes
64 bytes from 192.168.0.1: icmp_seq=0 ttl=64 time=3.197 ms
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=1.590 ms
^C
```
curlでYo

# 参考

* [Yo APIを利用するためにAPI Keyを取得する - テノニッキ (@hideack 's diary)](http://hideack.hatenablog.com/entry/2014/07/13/134604)

http://developer.justyo.co/ から`api token`を確認


## 使い方

```bash:yo.sh
#!/bin/sh
set -eu

TOKEN="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
UNAME="XXXXXXX"
msg="${1}"
LINK="http://hoge.com/yomsg.php?msg=${msg}"

curl --silent --data \
  "api_token=${TOKEN}&username=${UNAME}&link=${LINK}" \
  http://api.justyo.co/yo/ > /dev/null
```

```php:yomsg.php
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<?php
//ini_set("display_errors", 1);
echo @$_GET["msg"];
```

```bash:送信
./yo.sh hello
```

## 画像を送る(失敗)

* `cover`パラメータでいけるようだが成功しなかった。
* [How to add a picture or Apple Watch cover?](http://docs.justyo.co/discuss/55a24847cfd73f2100f196e4)

```bash:yo.sh
#!/bin/sh
set -eu

TOKEN="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
UNAME="XXXXXXX"
COVER=""

case ${1} in
  "msg1") COVER="$(base64 -w0 /home/user1/yo/msg1.jpg)";;
  "msg2") COVER="$(base64 -w0 /home/user1/yo/msg2.jpg)";;
esac

curl --silent --data \
  "api_token=${TOKEN}&username=${UNAME}&cover=${COVER}" \
  http://api.justyo.co/yo/ > /dev/null
```

### rubyで画像送信する例(失敗)

```rb:yo.rb
require 'net/http'
require "base64"

TOKEN="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
UNAME="XXXXXXX"
COVER=Base64.encode64(File.new('msg1.jpg').read)

postData = Net::HTTP.post_form(URI.parse('http://api.justyo.co/yo/'),
  {'api_token'=>TOKEN, 'username'=>UNAME, 'cover'=> COVER}
)

puts postData.body
```
素人大学生が何も知識がない状態でゲームを作ってみる〜ダウンロード編〜

某大学工学部の2年生です。
大学の勉強は数学ばかりで何も実学的なことを学べない……ってことで独学で何かスマートフォンアプリを作ってみよう！と思い立ちました。
調べてみると、スマートフォンアプリはcocos2d-xってのが熱いらしい！
!
まず、App Storeを開いて

![スクリーンショット 2015-01-28 13.12.22.png](https://qiita-image-store.s3.amazonaws.com/0/48709/d2d51582-bb8c-505c-14df-2a94a8aaf916.png)

xcodeで検索

![スクリーンショット 2015-01-28 13.13.39.png](https://qiita-image-store.s3.amazonaws.com/0/48709/9176b77e-0a7f-9529-f0f0-6adef6a69f2a.png)

おおおう…デベロッパっぽい…

![スクリーンショット 2015-01-28 13.14.25.png](https://qiita-image-store.s3.amazonaws.com/0/48709/2ab62365-4f25-33c1-b452-6c1e67d8882f.png)

入手！

![スクリーンショット 2015-01-28 13.15.28.png](https://qiita-image-store.s3.amazonaws.com/0/48709/bb210458-043e-e8a6-6363-8c706abf860b.png)

さてさてこれでプログラミングとやらの準備は整ったのではないでしょうか…。

準備は整った！…かに思えた。
いやまだまだ先は長いようですね…
調べてみると、最近のスマートフォンアプリはcocos2d-xが熱い！らしい！！

http://www.cocos2d-x.org/

![スクリーンショット 2015-01-28 13.19.53.png](https://qiita-image-store.s3.amazonaws.com/0/48709/b0fffd2a-9f2c-1c7f-7ea1-9a352b692aff.png)

ふむふむ…ダウンロード…？え？xcodeいらないのかな…？
うーんよくわからない…いいや！なんとなくダウンロード！

http://www.cocos2d-x.org/download

![スクリーンショット 2015-01-28 13.20.54.png](https://qiita-image-store.s3.amazonaws.com/0/48709/fbccd25a-674d-9458-d002-11e2bd2ea2d0.png)

ぎゃぁ…どれや…全くわからん……
とりあえず！一番左の！う〜ん…3.3？なんとなく数字が大きい方が強そう。うんこれだな。

zipファイルがダウンロードされたぞ。
これ確か圧縮ファイルだよな。
http://ja.wikipedia.org/wiki/ZIP_%28%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%29

![スクリーンショット 2015-01-28 13.24.06.png](https://qiita-image-store.s3.amazonaws.com/0/48709/cd0fce3a-e47f-048e-99ad-eaf4c47fa0ea.png)

とりあえず、クリックして解凍してみました。
な、なんか中にいっぱい入ってて大変そうですな…。

![スクリーンショット 2015-01-28 13.25.44.png](https://qiita-image-store.s3.amazonaws.com/0/48709/6d1ac4fa-39a9-7013-1185-a269dc67382e.png)

次にcocos2d-xをxcodeに導入する方法を頑張ります。
このままだと使えないようです。

さてさて、まず、ターミナルを開きます。

![スクリーンショット 2015-01-28 13.51.23.png](https://qiita-image-store.s3.amazonaws.com/0/48709/f35467bd-413e-aa60-fbee-844843ac0d65.png)

次に、ダウンロードしたcocos2d-xの階層に移動します。
因みにダウンロードして解凍したcocos2d-xのフォルダはデスクトップに移動させました(すぐに作業できそうなので笑)。
ターミナルで以下のコマンドを打って移動します。

```
$ cd cocos2d-x-3.1.1
```
次にset.pyを実行して、セットアップをします。

```
$ ./setup.py
```

何やらたくさんでてきますが、

![スクリーンショット 2014-07-12 12.39.42.png](https://qiita-image-store.s3.amazonaws.com/0/48709/78a9a540-a154-dd77-d95e-5684ef03e742.png)

とりあえずenterを3回ほど押して乗り切ります。

最後に、
```
$cocos new exam3(←プロジェクト名) -p jp.cocos2dx.newgame -l cpp -d ~
```
を実行してcocos2d-xを導入したプロジェクトが完成します！
今回ぼくはexam3というファイル名にして保存してあります。

![スクリーンショット 2015-01-28 14.01.40.png](https://qiita-image-store.s3.amazonaws.com/0/48709/a15ed08d-2b3d-6f78-46c8-fdb328fd61df.png)

さてさて次回から遂に(今度こそ)プログラミングの開始ですよ！
RubyからHTTP通信させたいときはFaradayを使おう


こんにちは。

RailsつかってるとAPI叩きたいことってしょっちゅうあるとおもうんですが、以前はnet/httpを愚直やってました。コードが煩雑になってしまいました。

最近はFaraday一択です。

## 準備

インストール。

Gemfileに

```ruby
gem 'faraday'
```

って書くか

```sh
$ gem install faraday
```

## 使用例

まずは宣言。


```ruby
## HTTPリクエスト設定（Faraday）
uri = "http://[適当なURI]/"
req = Faraday::Connection.new(url: uri) do |conn|
  conn.adapter Faraday.default_adapter
  conn.request :url_encoded 
  conn.response :logger # ログを出す
  conn.headers['Content-Type'] = 'application/json' # ヘッダー指定
end
```

こんな感じで指定します。

もしBASIC認証とかしたいときは以下を追加すればいいです。

```ruby
conn.basic_auth('ユーザ名', 'パスワード')
```

### GETアクセス
GETは以下。

```ruby
## 普通にアクセスさせる場合
res = conn.get("/hoge/test")
```

## パラメータ付ける場合
```
conn.get "/hoge/test?user_id=1"
```

/hoge/testは適当に読み替えてください。

パラメータつけたいときはそのまま後ろにそのまま&や?でつけていけばいいようです。

### POSTアクセス

次はPOST

```ruby
res = conn.post "/hoge/test",:hash => value
```

まあこんな感じだそうで。メソッドをpost,getで変えられるの便利ですね。net/http直書きで苦労してたときが懐かしいですね。


## 値確認

あとは戻り値を確認します。僕結構pp好きなのでppします。

```ruby
pp res.body
```
DjangoのログをMacOSX Notificaiton Centerに出す


ウェブアプリケーションを書いていると、ajaxやタスクが動作しているときにサーバサイドの動作状況が分からないことがある。デバッグログはともかく、error, warnレベルは視界に入るところで確認したい。

PythonからNotification Centerに通知するには[pync](https://pypi.python.org/pypi/pync)を使うのが良さそう。Python 3.4でも動いた。

カスタムロガーハンドラを使ってDjangoのログ出力先を追加する。

```python:logger_handler.py
# -*- coding: utf-8 -*-
import logging
import os
from django.conf import settings


class MacNotificationHandler(logging.Handler):

    def __init__(self):
        logging.Handler.__init__(self)

    def emit(self, record):
        # プラットフォーム固有なのでモジュールがなければ握り潰す
        try:
            from pync import Notifier
        except ImportError:
            return

        Notifier.notify(record.msg)
```

`settings.LOGGING`に追加しておしまい。

```python:settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'mac_notification': {
            'level': 'INFO',
            'class': 'apps.base.logging.MacNotificationHandler',
        }
    },
    'loggers': {
        'apps': {
            'handlers': ['console', 'mac_notification'],
            'level': 'DEBUG',
        }
    }
}
```

出力するとこんなふうに出る。

I![kobito.1422415843.809795.png](https://qiita-image-store.s3.amazonaws.com/0/29860/69e1d448-bc96-a199-32b4-65fe0b6d48ab.png "kobito.1422415843.809795.png")
【Unity2D】移動床の作り方


## はじめに

![thumb.png](https://qiita-image-store.s3.amazonaws.com/0/43772/703613d3-effb-f8b7-94af-6c48f9e4302d.png)

今回は2Dのジャンプアクションを作る際に、少し実装が大変な移動床の実装方法を紹介します。

## サンプル
動作サンプルはこちらとなります。

* [移動床サンプル](http://2dgames.jp/unity/lift "移動床サンプル")

左右キーで移動で、Spaceキーでジャンプします。

プロジェクトファイルもダウンロードできます。こちらのソースコードは自由に使ってもらってOKです。

## 移動床オブジェクトの設定
移動床には通常のコリジョンとは別に、プレイヤーが上に乗っているかどうかのトリガーコリジョンをかぶせます。

![lift_col.png](https://qiita-image-store.s3.amazonaws.com/0/43772/70bd3ecd-a62b-dc07-a436-d5f10b2f0503.png)

トリガーコリジョンが左右に少しはみ出しているのは、左右の壁に当たったときに跳ね返る動きをするためです。もし跳ね返りをしないのであれば、左右のはみ出しは不要となります。


それと `Rigidbody2D`で物理挙動をシミュレートしたいのであれば、`Gravity Scale`は「0」、`Is Kinematic` にチェックを入れます。

![lift_rigid.png](https://qiita-image-store.s3.amazonaws.com/0/43772/03f763c3-a773-eb56-cfbe-21aaede48ee7.png)

それと`Fixed Angle`も念のためチェックを入れています。

## プレイヤーの設定
トリガーコリジョンに接触しているのがプレイヤーかどうかを判定するために、プレイヤーをLayerグループに登録します。

![layer.png](https://qiita-image-store.s3.amazonaws.com/0/43772/622987e6-10dc-ff0e-990b-a83614cd139d.png)

このようにLayersに「Player」グループが作成済みであるとします(Groundグループは壁や床の判定に使っています）。
PlayerのLayerを「Player」に登録します。

![player.png](https://qiita-image-store.s3.amazonaws.com/0/43772/c8de2ae8-2885-8b35-ad5d-3f2f3113cc51.png)

## 移動床のスクリプト
移動床のスクリプトは以下のように記述します。（必要な部分のみを抜粋しています）

```csharp:FloorMove.cs
/// 移動床
public class FloorMove : Token
{
  // 前回の更新時のX座標
  float _xprevious = 0;
  // プレイヤーの参照
  Player _target = null;

  /// トリガーイベント発生
  void OnTriggerEnter2D (Collider2D other)
  {
    string name = LayerMask.LayerToName (other.gameObject.layer);
    if (name == "Player") {
      // プレイヤーに当たったので参照を保持
      _target = other.gameObject.GetComponent<Player> ();
    }
  }

  /// トリガーイベント終わり  
  void OnTriggerExit2D (Collider2D other)
  {
    string name = LayerMask.LayerToName (other.gameObject.layer);
    if (name == "Player") {
      // プレイヤーがいなくなったので参照を消す
      _target = null;
    }
  }

  /// 更新
  void Update ()
  {
    // 前回の座標からの差分を求める
    float dx = X - _xprevious;
    if (_target != null) {
      // 上にプレイヤーが乗っていたら動かす
      _target.X += dx;
    }
    // 現在の座標を次に使うように保存
    _xprevious = X;
  }
}
```

まずメンバ変数に、前回のフレームの座標(`_xprevious`)とプレイヤーの参照(`player`)を用意します。そしてOnTriggerEnter2Dイベントでトリガーコリジョンへの衝突を検知します。ここでは衝突したのが`Player`であるかどうかを判定して、プレイヤーであれば、その参照を変数`_player`に保持しています。そしてOnTriggerExit2Dイベントで、トリガーコリジョンからプレイヤーが離れたら参照を消すようにしています。

最後のUpdate関数で、前回からの移動量を計算し、Playerの参照があれば直接座標を足しこんで、移動床と同じ速度で移動させています。ちなみに大文字の「X」は `transform.position.x` を独自にラッパーしたプロパティとなります。

## 注意点
プレイヤーが移動床に乗った状態でDestroy(死亡など)するとnull参照エラーとなります。
そのため、「プレイヤーが移動床に乗ったまま消滅する」可能性があるときは何らかの対策が必要となります。
OS X Yosemiteでライブラリフォルダを表示させる

1. Finderでホームフォルダを開く
2. メニューから 表示 ＞ 表示オプションを表示 を選択
3. 表示されたダイアログで，「"ライブラリ"フォルダを表示」にチェックを付ける
RedHat系でのglibcの脆弱性(GHOST)への対応方法

#The GHOST
glibcの脆弱性が見つかりましたね。。。
今回のお名前は「GHOST」だそうです。

https://community.qualys.com/blogs/laws-of-vulnerabilities/2015/01/27/the-ghost-vulnerability

#RedHat系での対応
yum update glibcでパッチの当たったバージョンにアップデートされます。

```
yum clean all
yum update glibc
```


以下がパッチの当たった公式パッケージとなっています。

| OS | glibcのバージョン | 
|:-----------|:------------|
| RHEL(CentOS)5系    |        glibc-2.5-123以降 |
| RHEL(CentOS)6系     |  glibc-2.12-1.149以降 |
| RHEL(CentOS)7系     |        glibc-2.17-55以降 |
| AmazonLinux     |  glibc-2.17-55.93以降 |

※追記
かなり古めのAmazonLinuxだとglibcが見つからないと言われてしまうので、最新バージョンを指定すればパッケージが見つかりました。（--releasever=latestだとうまくいかず..）

```
yum update glibc --releasever=2014.09
```

#OSの再起動
glibcはいろんなところで使われているので、アップデート後は既に起動しているアプリケーションが再読み込みするようにOSの再起動をしたほうがいいと思います。
以前、再起動せずにglibcを更新したらcronが動かなくなってしまったことが...


#タイムゾーン
あと、/etc/localtimeでタイムゾーンを設定している場合に、glibcのアップデートでタイムゾーンが更新されてしまうようなので、アップデート後にタイムゾーンの確認も忘れずに。
UTCからJSTへ戻すには以下の設定を行います。

```
/bin/cp -f /usr/share/zoneinfo/Japan /etc/localtime
```

ちなみに/etc/localtimeではなく、/etc/sysconfig/clockで設定すればglibcをアップデートしてもタイムゾーンは変更されません。今回を機に設定変更しておくといいと思います。

```
ZONE="Asia/Tokyo"
UTC=False
```


#参考
http://www.walbrix.com/jp/blog/2015-01-ghost.html
http://qiita.com/mokemokechicken/items/fb55671da445240142eb
http://blog.branch4.pw/blog/2014/07/12/fix-the-time-on-ec2/
rsyncでディレクトリごとコピー


**ついでにsshもしてる…。**

```sh
rsync -auz -e ssh ~/public/dir/ <目的のサーバー>:~/public
```

これだとdir **配下の物**が、publicにコピーされる。


```sh
rsync -auz -e ssh ~/public/dir <目的のサーバー>:~/public
```

こちらは **dir自体**が、publicにコピーされる。

転送元のディレクトリの終わりに`/`をつけるかつけないかがポイントです。

|オプション|意味|
|---|---|
|a|よしなに保存|
|u|新しいファイルを転送|
|z|圧縮して転送|
|e ssh|sshにする|


### おまけ
ssh しないでコピーだけする場合

```sh
rsync -auz ~/public/dir ~/public_copy
```
Elasticsearch 0.90.x から 1.3.x へのアップグレード

Qiita投稿テストも兼ねて、
以前Gistに非公開で作成したメモの
Markdownをいじりつつ投稿。

## 1. インストール済みプラグインを確認

```
$ curl -XGET 'http://localhost:9200/_nodes/_all?plugin=true&pretty'
```

実行結果例

```json
{
  "ok" : true,
  "cluster_name" : "elasticsearch",
  "nodes" : {
    "<何かランダムな文字列>" : {
      "name" : "Doctor Sun",
      "transport_address" : "inet[/<サーバのIPアドレス>:9300]",
      "hostname" : "<ホスト名>",
      "version" : "0.90.13",
      "http_address" : "inet[/<サーバのIPアドレス>:9200]",
      "plugins" : [ {
        "name" : "analysis-kuromoji",
        "description" : "Kuromoji analysis support",
        "jvm" : true,
        "site" : false
      } ]
    }
  }
}
```

  "plugins" の 各プラグインの "site" が false の場合、プラグイン更新後にElasticsearchの再起動が必要。
  （この例ではkuromojiしか入れていない）

## 2. サービスの停止
それぞれ改行を除いて入力する方が無難かも。改行込みは試してない。

```
$ curl -XPUT localhost:9200/_cluster/settings -d '{
  "transient" : {
    "cluster.routing.allocation.enable" : "none"
  }
}'
```

```
$ curl -XPUT 'http://localhost:9200/_cluster/settings' -d '{
    "transient" : {
        "cluster.routing.allocation.disable_allocation": "true"
    }
}'
```

```
$ curl -XPUT 'http://localhost:9200/_all/_settings' -d '{
    "index": {
      "translog.disable_flush": "false"
    }
}'
```

```
$ curl -XPUT 'http://localhost:9200/_cluster/settings' -d '{
  "transient" : {
    "cluster.routing.allocation.disable_allocation": "false"
  }
}'
```

```
$ service elasticsearch stop
```

## 3. リポジトリ書き換え
（元々のインストール手段により適宜アップグレード手順を変更すること）
元のやつの書き換えが必要かどうかは試してない。
  
```
$ vi /etc/yum.repos.d/elasticsearch.repo
```

>```
>[elasticsearch-1.3]
>name=Elasticsearch repository for 1.3.x packages
>baseurl=http://packages.elasticsearch.org/elasticsearch/1.3/centos
>gpgcheck=1
>gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
>enabled=1
>```

## 4. Elasticsearchアップグレード

```
  $ yum undate elasticsearch
```

## 5. kuromojiのアップグレード

### 5-1. 古いkuromojiの削除
```
$ /usr/share/elasticsearch/bin/plugins -remove elasticsearch/elasticsearch-analysis-kuromoji
```
  
### 5-2. 新しいkuromojiのインストール
```
$ /usr/share/elasticsearch/bin/plugins -install elasticsearch/elasticsearch-analysis-kuromoji/2.3.0
```

## 6. Elasticsearch立ち上げ
```
$ service elasticsearch start
```
サービス立ち上げて少しの間はリクエストを受け付けないらしい。
馴染ませてる？
（自分の時は特に問題は無かった）

```
$ curl -XGET 'http://localhost:9200/'
```
これで何か返ってきたら完了。  

ダウングレードの方法は不明。
どこかのサイトで「入れ直せ」みたいなやり取りを見た気がする。
Git でブランチ名の先頭に # （シャープ）をつける際の注意点


SourceTree が良さ気にしてくれてたようで、ブランチ名が # （シャープ）で始まるブランチを CUI で操作する際には注意が必要なことを今さら気づきました。

なお、Git 的には、ブランチ名に # を使うことに問題はありません。使用できる文字列は `git check-ref-format` で確認できるようなので、詳しくは [git-check-ref-format(1) Manual Page](https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html) を見てみてください。

### 追記 - 2015/1/28
コメントで @_shimada さんにご指摘いただいた通り、単にシェルで `#` 以降がコメントになってるんですね... 皆さんもシェルで `#` 使う際には気を付けましょう！　

## ブランチの作成

新しくブランチを作成する際、

```bash:NG
$ git checkout -b #1_new-branch
```

これだと `-b` オプションに値がないよ！って怒られる。正しくは、

```bash:OK
$ git checkout -b "#1_new-branch"
```

と `" "` で囲む必要がある。

## ブランチの取得

既に remote に存在するブランチの取得の際にも、やはり

```bash:OK
$ git checkout -b "#1_new-branch" origin/#1_test 
```

しなければならない。

## ブランチの削除

もちろんローカルブランチを削除する際も、

```bash:OK
$ git branch -b "#1_new-branch"
```

となるが、リモートブランチの削除の場合は、

```bash:OK
$ git push origin :#1_new-branch
```

で削除できます。

## まとめ

「ブランチ名の先頭にチケット番号を付けるぞ！」と意気込んで、ブランチ名を `#1_new-branch` にしてみたけど、さんざ作業した後にサーバー側で pull しようとしたら見事にハマって、いちいち `" "` するの面倒なので、今後はブランチ名の先頭に # を付けずに `1_new-branch` にする事にした、って話でした。

ちなみに SourceTree とか GitHub の Web UI だと `#1_new-branch` って名前でブランチを作れますが、Bitbucket の Web UI からだと先頭の # が自動的に削除されて作られます。Bitbucket は各所で先頭の # を削除してくれる仕様な模様。
Consul Web UI をApacheでプロクシして /consul 配下にマウントする

NagiosやMuninとの共存もできて便利と思うので共有します。

```apache:consul.conf
RewriteEngine On

RewriteRule ^/consul(/)?$ /consul/ui/ [R=301,L]
RewriteRule ^/consul/ui$ /consul/ui/ [R=301,L]

<Directory /consul/ui/>
  ProxyPass http://localhost:8500/ui/
  ProxyPassReverse http://localhost:8500/ui/
</Directory>

<Directory /v1/>
  ProxyPass http://localhost:8500/v1/
  ProxyPassReverse http://localhost:8500/v1/
</Directory>
```

これで、 `http://manage.udzura.example/consul` にアクセスすればWeb UIが正常に見えるようになる。

### ポイント

* トップからのリダイレクトをconsulに任せると `http://manage.udzura.example/ui/` に飛ばされるので、Apache側でやってしまう。（これ、 ProxyPassReverse マスター氏ならなんかうまいことできるんでしたっけ...）
* `/v1` 配下にEmberが使ってるAPIがある。内部的に指定が相対パスになっていないもよう。しょうがないので `/v1` もProxyした。Muninとかが今後Ember化したら問題になるかもしれない。

----

むろんアクセス制限等も無限に入れられる。こんなんで良いですね。Apache最高！ 一番好きなサーバーです。

```apache
<Proxy *>
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1
</Proxy>
```
commands for initial settings on AWS

- create a machine

- check disk size
 - fdisk if wrong disk size (http://stackoverflow.com/a/24030938)

```shell-session:shell
# adduser vagrant
cp -r ~/.ssh ~vagrant/
chown vagrant.vagrant -R ~vagrant/.ssh
visudo

# create db user
psql --host=endpoint --username=user --password --dbname=db
  CREATE USER user WITH PASSWORD '';
sudo yum install postgresql93-devel

# set some passwords to env
vi ~/.profile
  export DB_PASSWORD=pass

# iptables (http, https)
sudo vi /etc/sysconfig/iptables
sudo service iptables restart
```
長くなったapp.jsをどうにかしたい

node.jsのexpressでWebアプリを作っているとどんどんapp.jsが長大になっていくお・・・
というわけで分割する方法色々

## 機能毎に別アプリとして別ポートで起動させる

利用者側のapp.js、管理画面機能のmanager.jsとか完全に別のアプリとして実装、別ポートで起動、リバースプロキシで別のサブドメインを割り当ててさばく
セッション情報の共有(Cookieのdomain)に一工夫が必要だが、そもそも管理画面のセッション情報を利用者側のアプリで必要にすることなんてほぼないわけで
同じようにリバースプロキシを設定すれば別ポートのアプリ同士をディレクトリに見せかけることもできる

DBの接続情報などは設定ファイルに出せばいいので、これはこれで有効かなという気もする

## Router機能を使う

今回のメインディッシュで例はExpress4前提

/などのメインはapp.js、/dir1以下はdir1.js、/dir2以下はdir2.jsでさばく
node app.jsで全部起動する

まず、dir1.js側の実装

```js:dir1.js
var express = require('express');

module.exports = function(receiveFromAppJs){
    var router = express.Router();

    router.get('/foo', function(req, res){
        // ...
    });

    router.get('/bar', function(req, res){
        // ...
    });

    return router;
};

```
同じようにdir2.jsも作っておく
そしてメインのapp.js側で

```js:app.js
//...
app.use('/dir1', require('./dir1.js')({a:1, b:2}));
app.use('/dir2', require('./dir2.js')({a:1, b:2}));
//...

```
と書いておけば

* /dir1/fooのアクセスはdir1.jsの/fooに
* /dir1/barのアクセスはdir1.jsの/barに
* /dir2/fooのアクセスはdir2.jsの/fooに
* /dir2/barのアクセスはdir2.jsの/barに

・・・という形にとりはからってくれる

{a:1, b:2}などはサブプログラムに渡したいオブジェクトを指定
サブプログラム側でreceiveFromAppJsで参照できるので、データベースの接続とかはここで渡すといいかもしれない