OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7にssh専用ハニーポット、Kippoをインストールする

Kippoインストールには、Python2.5以上が必要なので、もし入っていなければインストールしておく。

### 必要なパッケージを入れていく。

easy_install 時に必要なので、`python-devel`を入れる。

```
yum install python-devel
```

kippoに必須のモジュールを入れる

```
easy_install PyCrypto pyasn1
easy_install pip
pip install twisted service_identity
```

## kippo をインストール

Kippoはrootユーザーでは実行出来ないようになっているため、一般ユーザーを作成する。

```
useradd kippo
su kippo
git clone https://github.com/desaster/kippo.git
cd kippo
```

### Kiippoの設定

設定ファイルを作成する。

```
cp -p kippo.cfg.dist kippo.cfg
```

`Port`の部分を`22222`に設定した。

### Kippo起動。

```
./start.sh
```

### SSH(ポート22)の接続を転送させる。

Kippo は `22222` でListenしているので、22ポートへ来たアクセスを22222に転送するようにfirewalldで設定する。

```
firewall-cmd --permanent --zone=public --add-forward-port=port=22:proto=tcp:toport=22222
systemctl restart firewalld.service
```

### ダミーアカウントを作成したい場合は、`data/userdb.txt`にユーザーを追加する。

```
# cat data/userdb.txt
root:0:123456
adm:10001:adm
ruth:10002:ruth
dragon:10003:abc123
public:10004:public
test:10005:test
administrator:10006:password
guest:10007:guest
```

左から、 `アカウント名:UID:パスワード` となっている。


設定は以上になる。ハニーポットライフをお楽しみにください！

## 備考

### python-develが入ってないのとeasy_install実行時に以下エラーとなる。

```
src/MD2.c:31:20: 致命的エラー: Python.h: そのようなファイルやディレクトリはありません
 #include "Python.h"
                    ^
コンパイルを停止しました。
```

### twistdのパスが通ってない場合は、以下エラーとなる。

yum で`python-twisted-core` をインストールだと以下エラーだった。

```
  File "kippo.tac", line 15, in <module>
    from twisted.conch.ssh import factory, keys
exceptions.ImportError: No module named conch.ssh

Failed to load application: No module named conch.ssh
```

※ 本記事は [CentOS7にKippoをインストールする](http://atani.github.io/2015/07/CentOS7にKippoをインストールする/) の転載記事になります。

---

## 参照URL

- [sshハニーポットをkippoで作ってみる](http://d.hatena.ne.jp/ozuma/20130829/1377703104)
- [CentOS 6.5 に kippo をインストールしてみる](http://d.hatena.ne.jp/akishin999/20140210/1391983700)
Nginxでrewriteを使わずに転送(主に内部転送用)

indexを使う。

例えば、転送元が /src/ 転送先が /dst/filename などの場合、
```
location = /src/ {
    index /dst/filename
}

location = /dst/filename {
・・・
}
```
http://～には使えませんが、内部転送だとパス指定のみだと思いますので。
ファイル名が異なって、rootでディレクトリを付け替えるだけでは転送できない場合に。
(使えないパターンもあると思いますが・・・)
※マッチング順などに注意しましょう。(うっかりループしないように)

aliasは、ちょっと危なめ。(予想外のパスに変換されることがあるので。)

rewriteだと、ステータス302や301を使うので、内部転送に使うには、往復コストがもったいないな・・と。

indexは、index.htmlなどを指定する以外にも使い道があるよね?という話題でした。

----
openrestyを入れてある環境なら、(まだ何も出力していないなら)、ngx.exec()の方が使いやすいですが・・
ReactNative で unexpected end of script

コードの整理してたら急に動かなくなったなーと思ってググったら解決策が出てきた。
https://github.com/tvcutsem/harmony-reflect/issues/47

> Simply adding a newline at the end of your node_modules/harmony_reflect/reflect.js solves the issue.

コンポーネントのコードの最終行に改行を足したら動いた。。
なんじゃこの仕様は。
「第３章」Hello World ～ !!

**<h1><font color=orange>１．プロジェクトの作成</font></h1>**
まずは、プロジェクトを作成します。プロジェクトは、プログラムに関する各種情報を管理します。

①　「パッケージエクスプローラ」ビュー ⇒ マウス右クリック ⇒ 新規 ⇒ Javaプロジェクト
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/b5332c75-7771-a431-03c4-f538c59df3a3.png)

②　プロジェクト名：HelloWorld
　JRE：デフォルトで設定されているJREを利用する場合には「デフォルトJREを使用」をチェックします。プロジェクトに対して個別にJREを指定するには「プロジェクト固有のJREを使用」をチェックして右側のコンボボックスからJREを選択します。また「実行環境JREの使用」をチェックした場合は、Javaのバージョンや携帯開発用などJavaの実行環境に合わせたJREを選択できます。

ここで入力したプロジェクト名は、このあと作成するソースファイル等を格納するフォルダ名にもなるので、分かりやすい名称にするよう心掛けましょう。

今回は「デフォルトJREを使用」をチェックします。「プロジェクト名」を入力し、「次へ」をクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/d4790b59-8f12-0633-84ad-2a9f2ffaf02f.png)

③　何も変更する必要がないので、「完了」をクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/49f293a7-eed4-2cee-424a-0212086a0c04.png)

④　「はい」をクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/20e46d76-6059-9dc2-e4e5-b738432ddc86.png)

⑤　プロジェクト作成完了
これで、プロジェクトが作成できました。画面左側の「パッケージエクスプローラ」ビューに「HelloWorld」というプロジェクトが登録されているはずです。
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/0d3f196a-0ca8-3248-5673-de55ea6ff2e9.png)

**<h1><font color=orange>２．クラスの作成</font></h1>**

⑥　HelloWorldプロジェクトの「src」フォルダー右クリック ⇒ 新規 ⇒ クラス
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/09a7b862-f3b2-3bf2-547e-1c181333e55c.png)

⑦　パッケージと名前入力。
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/19b0dc93-8859-f358-0343-8429f5395f98.png)

⑧　Hello worldソースコード入力。
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/d22a1208-c78d-1c8f-a8be-7848318cba0f.png)

```lang:test01.Sample01
package test01;

public class Sample01 {
	public static void main(String[] args) {
		System.out.println("Hello World~!!");
	}
}
```
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/458333d1-d84d-ec53-ce7f-a7c08c0be8ea.png)

⑨　短縮キー：「Ctrl + F11」で実行。 :white_flower: 
![image](https://qiita-image-store.s3.amazonaws.com/0/85145/70fe8ef1-bbf7-0d55-0104-875092286bcc.png)
【AWS】Amazon Simple Queue Service

AWSサービスを勉強するためのメモ。
Amazon Simple Queue Serviceです。

公式サイト
http://aws.amazon.com/jp/sqs/

# 特徴
・コンピュータ間でやり取りされるメッセージを格納するための信頼性と拡張性の高いキューサービス
・SQSはゾーンをまたいで利用可能なサービス
・メッセージの順序は保障していない。分散キュー。
・一度に最大10通送信可能
・一度に最大10通受信可能
・削除されないが、メッセージはデフォルトで4日保持する
・1つのキュー毎に最大12万通のIn flight(VisibilityTimeoutによって他から見えない状態のメッセージ)メッセージを保持

# 基本キューリクエスト
・CreateQueue:お客様のAWSアカウントで使用するキューを作成する
・ListQueus：既存のキューをリストアップする
・DeleteQueue：キューの1つを削除する
・SendMessage：指定されたキューにメッセージを追加する
・SendMessageBatch：指定されたキューに複数のメッセージを追加する
・ReceiveMessage：指定されたキューから1つ以上のメッセージを返す
・ChangeMessageVisibility：以前に受け取ったメッセージの可視性タイムアウトを変更する
・ChangeMessageVisibilityBatch：以前に受け取った複数のメッセージの可視性タイムアウトを変更する
・DeleteMessage：指定されたキューから以前に受け取ったメッセージを削除する
・DeleteMessageBatch：指定されたキューから以前に受け取った複数のメッセージを削除する
・SetQueueAttributes：再度読み込まれないように読み込み後にメッセージがロックされる時間のようなキュー設定をコントロールする
・GetQueueAttributes：キューに含まれるメッセージ数のようなキューについての情報を取得する
・GetQueueUrl：キューのURLを取得する
・AddPermission：指定されたキューについて別のAWSアカウントの為に共有するキューを追加する
・RemovePermission：指定されたキューの為に共有しているキューからAWSアカウントを削除する

# 機能
・キューの数、メッセージ数については無制限
 - キューはどのリージョンでも作成できる
 - メッセージペイロードは最大256KBテキストを任意のフォーマットで含めることができる
 - 複数のメッセージ(最大10個または256KBまで）をバッチとしてまとめて送信、受信、削除ができる
・Amazon Simple Notification Service（SNS）と組み合わせることで、開発者は同一のメッセージを複数の SQS キューへ「同時送信」できる。
  開発者が複数のパスにあるメッセージを処理したい場合、同時送信ならよりすばやく完了できるうえに、いずれかのステージにおけるボトルネックに起因する遅延も少なくなる。
  また、同時送信によって、異なるデータベースに存在する場合など、メッセージの重複コピーを記録しやすくなる。
・最大受信回数を超えたメッセージは元のキューと関連付けられているデッドレターキューに移動される
・LongPoling
 - メッセージが有効になるまで待つことができる
 - ReceiveMessageWaitTimeSecoundsを設定するとロングポーリングデキューができる。ロングポーリングにしておくとエンキューされたら即時実行され、キューが溜まっていない時には接続しっぱなしで受信処理を行うため余計なリクエストを行わない。
・DelayQueue
 - キューに送られた新規メッセージをある一定秒の間見えなくする
・MessageTimes
 - 個々のメッセージを送信されてから見えるようになるまでの時間を設定できる 

新しくインプットできたら随時更新予定。
次はSMSを投稿予定です。
i18nロケールファイルの書き方小技集


時々追記してます。

# Yes/No
```yml:ja.yml
"Yes": はい
"No": いいえ
```
YesとNoは" "で囲わないと使えませんでした。

# 改行つきの文
パイプ（｜）を書いて、その後の行は改行付きの文で書けます。
viewでsimple_format内で呼べば改行付きで出力されます。

```ja.yml
hogehoge: |
	1行目
	2行目
	3行目
```

```rails:view
simple_format(t(:hogehoge))
```


# ２つの語を連結して表示
## 方法１：変数を使う
I18n.tでは変数を使うことができます。

```yml:ja.yml
new: 新着%{smtg}
```
```ruby:view
t(:new, smtg: t(:posts))
# => 新着投稿
```
自分はずっとこの形でやってたんですが、ネストが見づらくて嫌だなあと思ってました。
そこで次の方法を取ってみました。

## 方法２：arrayを使う
I18n.tでは複数の名前空間を一度に呼び出せます。

```ruby:
t [:new, :posts]
# => ["新着","投稿"]
```

ただ、このままだとarrayで出力されるので、以下のようにstringにしてしまえばそのまま使える形に。

```ruby:
(t [:new, :posts]).join
# => 新着投稿
```
なんかもう少しいい書き方はないのかという感じですが、方法１よりは単語が直接並ぶので記述内容がわかりやすいです。

## 方法３：ヘルパーメソッドを作る

```ruby:helper
def joined_t(*args)
	(I18n.t args).join
end
```
```ruby:view
= joined_t(:new, :posts)
# => 新着投稿
```
方法２をヘルパーメソッドに。まだマシな気もしますが、あまり気に入りません。
他に良案があれば教えて下さい。

# エイリアス

（2015/7/21追加）

```yml:ja.yml
Comment: &Comment コメント
Comments: *Comment
```

&で設定、* で呼び出し

# submitボタンのロケール

（2015/7/29追加）

createやupdateのデフォルトのロケールは`helpers: submit:`以下にまとめて設定されます。modelごとに名前を変える場合には、model_name以下に別途記載すればそのモデルのボタンのテキストが変わります。

```yml:ja.yml
ja:
  helpers:
    submit:
      create: 登録する
      update: 更新する
      submit: 保存する
      model_name:
		create: 送る
		update: 変える
```

# flashメッセージのロケール
（2017/2/23追加)
createやupdateなどした時に出るflashメッセージを一つ一つ設定するのは面倒ですが、respondersというgemの機能を使うと簡単にさくっと整理されていい感じです。
https://github.com/plataformatec/responders

こんな風に書けば基本のflashメッセージが設定されます。

```yml:
ja:
  flash:
    actions:
      create:
        notice: "%{resource_name}が保存されました"
      update:
        notice: "%{resource_name}が更新されました"
      destroy:
        notice: "%{resource_name}が削除されました"
        alert: "%{resource_name}が削除できませんでした"
```

デフォルトと違うメッセージを設定したいところはコントローラーごとに以下のように書きます。

```yml:
flash:
	posts:
      create:
        notice: 投稿できました！
```

なんとなくふわっと使ってたのですが、いつの間にか使えなくなっていたので改めて使い方を調べました。
respondersはrails4.1以前で標準だったrespond_toをgemとして切り出してものですね。gemはいつの間にか入っていましたが、railsのバージョンを上げたことで`rails g responders:install`をしていないと使えなくなっていました。
この方法でメッセージ管理すればコントローラー内で記載しなくて済むのでコントローラーがすっきりしますね！

-
### 参考サイト
- [Rails Internationalization (I18n) API — Ruby on Rails Guides](http://guides.rubyonrails.org/i18n.html)
- [Ruby on RailsのI18nで使用する名前空間に関してのまとめと、ベストプラクティスの検討。](http://alfa.hatenablog.jp/entry/2013/12/03/221308)	
- [Customize text in form submit buttons with i18n](http://www.mrlab.sk/customize-form-submit-buttons-with-i18n.html)
pdf2svgをMacにインストール


pdf2svgはその名の通り、pdfをsvgにするソフトです。
依存関係が色々あってインストールに手間取ったので覚書。

pdf2svg: 以下のリンクからソースをダウンロード。
http://www.cityinthesky.co.uk/opensource/pdf2svg/
※ちなみにhomebrewでも入れられるか試しましたが、formulaがないんだぜと言われてしまいました。

上記ページのドキュメントに従ってインストールを進めます。
ターミナルでダウンロードしたtarファイルの解凍先フォルダに移動して以下のコマンドを入力。

```
./configure --prefix=/usr/local
```
エラーが出たら→ 下の方に記載のエラー集を参考に必要なものをインストールしていきます。
エラーが出なくなったら上記tarファイルの解凍先フォルダでmake。

```
make
make install
```

> make[1]: Nothing to be done for `install-data-am'.

と書かれていても気にしなくて良いようです。

`pdf2svg`とコマンドを入れて以下のように返ってきたら成功です。
> Usage: pdf2svg \<in file.pdf> \<out file.svg> [\<page no>]


##エラー集
人によって当たるエラーが違いそうな気もするので以下は該当のものを潰していきます。

### cairoをインストール
pdf2svgはcairoに依存しています。homebrewでcairoをインストール。

```
brew install cairo
```

### xcb-shmがない

> Package 'xcb-shm', required by 'cairo', not found

x11のパスを追加。x11がインストールされている必要があります。

```$User/.bashrc
export PKG_CONFIG_PATH=/opt/X11/lib/pkgconfig
```

ターミナルで `source ~/.bashrc`と入力。パスが通ります。

### poppler-glibがない
> No package 'poppler-glib' found

homebrewでpopplerをインストール。

```
brew install poppler
```

### gtk+-2.0がない
> No package 'gtk+-2.0' found

homebrewでgtkをインストール。

```
brew install gtk
```
Starscream + Webサーバ 連携メモ (3日目)

いよいよ Starscream を使って OSX(Swift) と Web サーバを連携させてみる。
Web サーバといっても、[ただの echo サーバです](http://qiita.com/ntmukai/items/8702579596c6ed45e7cc)。

[1日目につくった Xcode のプロジェクト](http://qiita.com/ntmukai/items/212dfc99c9578ee872d9)を開いて、
`ViewController.swift` をこんな風に書き換える。

```lang:swift
import Cocoa
import Starscream

class ViewController: NSViewController, WebSocketDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        var socket = WebSocket(url: NSURL(scheme: "ws", host: “example.com:3000", path: "/echo")!)
        socket.delegate = self
        socket.connect()
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }

    func websocketDidConnect(socket: WebSocket) {
        println("websocketDidConnect")

        // Webサーバにテキストを送信
        socket.writeString("Xcodeからテスト")
    }

    func websocketDidDisconnect(socket: WebSocket, error: NSError?) {
        println("websocketDidDisconnect")
    }

    func websocketDidReceiveMessage(socket: WebSocket, text: String) {
        println("websocketDidReceiveMessage")

        // Webサーバから届いたテキストを出力
        println(text);
    }

    func websocketDidReceiveData(socket: WebSocket, data: NSData) {
        println("websocketDidReceiveData")
    }
}
```

ポイントは特にないです。

* `Starscream` をインポートする
* `WebSocketDelegate` を継承する
* 例えば `viewDidLoad()` で Web サーバへの接続とデリゲートの設定を行う
* 必要なメソッドを実装しないとビルドこける

あとは日本語でコメントを書いてるとおりです。

最後に動作確認をしましょう！

echo サーバを起動して、テストページにアクセス。
http://example.com:3000/

間髪いれずに、Xcode のプロジェクトを実行する。
テストページに `Xcodeからテスト` って表示されたら成功！

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/14157/a98b9e67-c134-aa1a-9658-251172e8e590.png)

逆に、テストページで打ったテキストが
Xcode のデバッグエリアに表示されるかもチェック！

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/14157/ee0dd29e-0da9-9a97-4023-c961a63238ec.png)
Web からのテスト投稿にタブ記号が入ってるのはどうか見逃してください。

うまくいったら、今日はおわり。
Geohashの確認ツールを作った

Geohash、便利ですよね。
でもGeohashのhashがどのぐらいの範囲を表すのか、いまいちわかりづらかったのでgooglemapの中で四角形で表示するページ作りました。
視覚的に理解できるので結構分かりやすいと思います。
是非使ってみてください。

http://malt.dip.jp/~malt/map/
MacをPXEサーバーにする


## この記事について

タイトルの通り、MacをPXEサーバーにします。
別筐体へのLinuxインストールのときなどに、ブートメディアを用意する必要が無くなるので便利です。

### Macを使うと何が嬉しいのか

Macのインターネット共有機能を使うと、DHCP(bootpd)がついてきます。([過去記事参照](http://qiita.com/honeniq/items/7e825ca6414c39374484))
さらに、TFTPサーバーも最初からついてきます。

また、インターネット共有機能のおかげで、PXEでのブート後はそのままインターネットにも到達できます。つまり、ネットインストールのイメージでもOK。


### 環境

* MacBookAir 13 Mid 2011
    * Thunderbolt Ethernet付き
* OS X Yosemite
* tftpd (OSX標準)
* bootpd (OSX標準)

#### 構成図

```
+----------+  Wi-Fi  +---------+  Ethernet  +--------+
| Wi-Fi AP | ------> | MacBook | ---------> | Server |
+----------+         +---------+            +--------+
```

ServerはPXEで立ち上がってくるマシン。
今回使ったのはALIX.2D13っていうワンボードx86機ですが、PXE対応していれば機種は選ばないはず。

### だいたいの手順

1. tftpdのルートパスにファイル配置
    * 初期状態だと``/private/tftpboot/``
2. tftpd有効化
3. bootpd設定変更
    * ``/etc/bootpd.plist`` オプション66・67の設定
    * ``/etc/bootptab`` 固定アサインしたいなら
4. インターネット共有を有効にする


## tftpd

特に設定は必要なし。
``/private/tftpboot/``配下がルートパスになります。

ルートパスを変更したい場合は、``/System/Library/LaunchDaemons/tftp.plist``を変更してください。

### tftpd有効化

```
$ sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist
```

無効にするときは``launchctl unload``で。

### 動作確認

```
$ tftp localhost
tftp>
tftp> quit
```

プロンプトが出てくればOK。``quit``で終了。


## bootpd

インターネット共有を有効にすれば勝手に立ち上がりますが、何点か変更が必要です。

### DHCP オプション66,67の設定を追加

``/etc/bootpd.plist``にオプションを2つ追加。

* 66 ftp_server_name
    * 例では``192.168.2.1``
* 67 boot_file_name
    * 例では``pxelinux.0`` 


``` bootpd.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Subnets</key>
	<array>
		<dict>
			<key>_creator</key>
			<string>com.apple.NetworkSharing</string>
			<key>allocate</key>
			<true/>
			<key>dhcp_domain_name_server</key>
			<array>
				<string>192.168.2.1</string>
			</array>
〜中略〜
			<key>net_range</key>
			<array>
				<string>192.168.2.2</string>
				<string>192.168.2.254</string>
			</array>
			<key>dhcp_option_66</key>
			<string>192.168.2.1</string>
			<key>dhcp_option_67</key>
			<data>cHhlbGludXguMAA=</data>
		</dict>
	</array>
	<key>bootp_enabled</key>
	<false/>
〜中略〜
	<key>use_server_config_for_dhcp_options</key>
	<false/>
</dict>
</plist>
```

#### ちょっとハマったこと

後述の``bootptub``で指定するからって、オプション67を端折ってはいけません。
OSXのbootpdは、``bootpd.plist``に66・67両方が書かれていないと、両方ともDHCP_OFFERに流してくれないようです。

### 固定アサインの設定

``/etc/bootptub``を作成・編集。
必須じゃないけど、固定の方があとで楽なことが多いので。

``` bootptub
# hostname      hwtype  hwaddr              ipaddr          bootfile
client1         1       01:02:03:04:05:06   192.168.2.11    pxelinux.0
```

### bootpd有効化

インターネット共有機能を有効にすれば勝手に有効になります。
手動で立ち上げたいときは以下。

```
sudo launchctl load -w /System/Library/LaunchDaemons/bootps.plist
```

tftpdと同じく、無効にするときは``unload``。

そういえば、何でここだけ「bootps」なんだろう。

### 動作確認

何か繋いでみる。

```
$ tail -f /var/log/system.log | grep DHCP
```

とかやって見ていると、払い出されたログが見れます。
今まで知らずに損してたauthorized_keysの書き方

SSHの公開鍵認証を行うために、以下の様に**authorized_keys**に公開鍵を書きますよね。

**~/.ssh/authorized_keys**

```
ssh-rsa ....
```

ほとんどの場合はこれで事足りるのですが、意外と知られていない(?)便利な書き方が有ることを知ったので共有します。

## 特定のIPからの接続のみ許可する

```
from="1.2.3.4" ssh-rsa  ....
```

と書くと、その鍵では1.2.3.4というIPアドレスを持つクライアントからしか接続できないように制限をかけることができます。
これを知るまでは**iptables**だけで接続元を弾いていたのですが、これを使えば鍵ごとに接続元を指定できるので、よりきめの細かなアクセス制限がかけられて幸せです。


以下の様に書けば、サブネット単位で許可したり複数のIPを指定することも可能です。

```
from="1.2.3.0/24,44.55.66.77" ssh-rsa ...
```

以下の様に他のオプションと組み合わせることも可能です。

```
from="1.2.3.4",no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa ...
```
この例では、IP制限をかけつつエージェント転送とポートフォワーディングを禁止してます。

## 特定のコマンドの実行のみを許可する
実はこれは前から知ってたのですが、ついでにメモっておきます。

```
command="/usr/local/bin/my-prog" ssh-rsa ..
```

## 参考
* https://www.debian-administration.org/article/685/Restricting_SSH_logins_to_particular_IP_addresses
ディレクトリの使用量を調べる



直下のディレクトリ、ファイルの容量を調べる

```sh:.sh
du -sh *
```

容量大きい順

```
du -sk * | sort -nr
```

全ファイル容量大きい順

```
du -ak * | sort -nr
```

PDFのみ

```
du -ak ./**/*.pdf | sort -nr
```
P、NP、NP完全、NP困難…似て非なる階層構造

コンピューターに問題を解かせるときに、それがどの程度の時間を消費するのかも大きな問題です。この観点から、問題はいくつかのパターンに区分されています。ただし、ややこしいです。

#おことわり
なお、分かりやすさを優先して、厳密でない説明となっている部分があります。たとえば、チューリング完全性を前提に、チューリング機械で計算するものを、通常のコンピューターで計算するものとしています。

# P
ある**判定問題**（yes/noで答えられる問題）があって、それを解くことのできる多項式時間アルゴリズム（問題の規模に対して、計算時間が規模の多項式で表現される上限を持つ）が存在する場合に、その問題は「Pに属する」ということになります。

なお、この定義にはいくつかの注意点があります。まず、yes/noで答えられない問題（配列のソート）などは、定義上Pには分類されません。また、定数時間の場合や、問題規模の対数で多項式になる場合など、$O(n)$より小さい場合でも、Pに区分されます。さらに、「問題規模」の取り方には任意性があって、たとえば素数判定問題では入力値の「桁数」を問題の大きさとするのが主流です（入力値自体を大きさとすると、$O(n)$以下であることは自明なので議論が深まりません）。

たとえ多項式時間アルゴリズムがあっても、次数や定数項が大きいなどで、実用的なサイズの問題にはそうでないアルゴリズムのほうが速い、というケースもありますが、あくまで多項式かどうかで区分します。

# NP
NPには、2通りの定義がありますが、どちらも本質的には同じものです。

1. ランダム性を持った多項式時間アルゴリズムがあって、運がよければyesの結果を返す判定問題。
2. ある問題とそれがyesになる証拠があった場合に、本当に成立しているかどうか多項式時間で検証できる問題。

NPはNon-deterministic P（非決定的多項式時間）の略で、**Not Pという意味ではありません**（2. より、そもそも多項式時間で解けるP問題はNPにも含まれます）。また、これも判定問題以外はNPに含まれません。

## NP完全
上でP問題もNP問題に含まれるといったように、同じ「NP」といっても難易度の違う[^1]いくつかの問題が存在していますが、このNPの中には、同じNPの中にある任意の問題を多項式時間で変形することで、その問題に変形することができる問題があります。つまりはこの問題がNPの中でいちばんむずかしい（これが解ければNPの問題はすべて解ける）ということになりますが、そういった問題を**NP完全問題**といいます。

「いちばん」とは言いましたが、NP完全問題は多数発見されています（それぞれ同士を多項式時間で変換できるものであれば、すべてがNP完全です）。

* ハミルトン閉路問題（頂点を辺でつないたグラフで、すべての頂点を1回ずつ回る閉路があるかの判定問題）
* 部分和問題（整数の組に対して、その中からいくつか抜き出して特定の数を作れるかという判定問題）
* [ぷよぷよ](http://www.kurims.kyoto-u.ac.jp/~kyodo/kokyuroku/contents/pdf/1426-24.pdf)（与えられたぷよの組とフィールドに対して、特定の数の連鎖を組めるかという判定問題）
* [テトリス](http://arxiv.org/PS_cache/cs/pdf/0210/0210020v1.pdf)（与えられたテトリスの組とフィールドに対して、特定の列数だけ消すことができるかという判定問題）

# NP困難
NPに関連する区分として「NP困難」というものがあります。これは、以下の条件を満たすものです。

* 判定問題以外の問題でも構わない
* その問題自身がNPに属するかは問わない
* 多項式時間ですべてのNP問題（実質、どれか1つのNP完全問題）をその問題に帰着できる

有名な「巡回セールスマン問題」も、「これ自体が判定問題でない」「ハミルトン閉路問題から容易に変換できる」ということで、NP困難問題に区分されます（判定問題でないので、NPでもNP完全でもありません）。

さらに言えば、「チューリングマシンの停止問題」という決定不能な問題もNP困難に属します。適当なNP完全問題について「解ければ終了、解けなければ無限ループ」というようなプログラムを書いて、これを停止性問題として判定すれば、NP完全問題も解けるからです。

# まとめ
NP完全なものはNPかつNP困難なものです。また、NPにはNP完全やPが含まれますが、この3つは判定問題だけが属するものです。けっこう混同されることが多いので、よく知った上で峻別しましょう。

[^1]: 多項式時間で解けないNP問題があるという見方も強いですが、証明はされていません。
extensionでoverride func .... 多態性が機能しない


少しハマったのでメモ．


```swift:SuperHoge.swift
class SuperHoge {
  // hogehoge
  func foo {
    print("Super")
  }
}
```

``` swift:Hoge.swift
class Hoge : SuperHoge {
   // hogehoge  
}

extension Hoge {
  override func foo {
     print("Sub")
  }
}
```

``` swift:Main.swift
class Main {
  var hoge: SuperHoge
  hoge = Hoge()
  hoge.foo() // Output >> Super
}

```
もしやと思って Hoge.swiftをこうした

``` swift:Hoge.swift
class Hoge : SuperHoge {
   // hogehoge  
  override func foo {
     print("Sub")
  }
}

extension Hoge {
  // ここにはoverride書かない
}
```

Lovely Swift♡
Java8のStreamを使ったprimitive型二次元配列の型変更（mapping）


前置き
----
学校の課題でよくある，基本的な行列演算をJavaのクラスで実装するアレに出会いました。何回やればいいんだ。

最初，息を吸うようにdouble[][]をコンストラクタの引数にとっていたのですが，
せっかくだからBigDecimal[][]にしたいなあ，と思い立った矢先エラー

```java:WA
// double[][] を引数に取るコンストラクタからワンラインでthis(BigDecimal[][])に渡したい
BigDecimal[][] mat = Stream.of(new double[][]{
    { 2, 4, -3, 4 },
    { -5, 2, 1, 5 },
    { -3, 4, 2, -1 },
    { 4, 6, -7, -2 }
}).map(a -> Stream.of(a)
        .map(BigDecimal::new) // Cannot resolve constructor BigDecimal
        .toArray(BigDecimal[]::new)
).toArray(BigDecimal[][]::new);
```

んなバカな。
書き直してみたところ，`.map(v -> new BigDecimal(v)) // Connot resolve constructor 'BigDecimal(double[])'`，
どうやらvの型がdouble[]みたい。んなバカな。

あまり，Streamのことについて勉強しなかったのが悪いのですが，
primitive型は扱いが特殊になるので，DoubleStreamを使わないといけないみたいですね。
なんで分かれているんだろうと思ったら，そのためか。

と，いうわけでDoubleStreamに直せばOK（mapもDoubleStream対応のmapToObjに変える）。

Accepted Code
----
```java:AC
BigDecimal[][] mat = Stream.of(new double[][]{
    { 2, 4, -3, 4 },
    { -5, 2, 1, 5 },
    { -3, 4, 2, -1 },
    { 4, 6, -7, -2 }
}).map(a -> DoubleStream.of(a) // ココ
        .mapToObj(BigDecimal::new) // ココ
        .toArray(BigDecimal[]::new)
).toArray(BigDecimal[][]::new);
```

...コンパイルは通ったが。検証コード

```java:Tester
System.out.println(Stream.of(mat)
        .map(a -> Stream.of(a)
                .collect(Collectors.mapping(b -> b.toString(),
                        Collectors.joining(", ", "\t{ ", " }"))
                )
        ).collect(Collectors.joining(",\n", "{\n", "\n}"))
);
```

```text:output
{
	{ 2, 4, -3, 4 },
	{ -5, 2, 1, 5 },
	{ -3, 4, 2, -1 },
	{ 4, 6, -7, -2 }
}
```

やったぜ:punch:
----
息を吸うようにStreamが書けるようになりたいです
（2次元配列になるとすごく頭がこんがらがる）。
あと早くこんな学生気分未満のコード生成からおさらばしたい。
node.jsで簡単にwebserverをたてる


####任意のディレクトリにpackage.jsonを作成

```json
{
"name": "todos",
  "version": "1.0.0",
  "scripts": {
    "start": "http-server"
  },
  "dependencies": {
    "http-server": "^0.7.4"
  }
}
```
#### 以下のコマンドを実行

```
npm install
npm start
```

#### 起動したサーバーへアクセス
localhost:8080へ
AWS CLI で S3 にファイルをアップロード

awscli のインストール
--------------------------------

brewでインストール

```
brew install awscli
```

pipでインストール

```
$ sudo pip install awscli
```

pipが無いとき

```
$ sudo easy_install pip
```


バージョンの確認

```
$ aws --version
```

AWSのセットアップ
--------------------------------

regionとoutput formatは大概固定でいいんじゃないかと。
`ap-northeast-1`は東京

```
$ aws configure --profile=PROFILE_NAME
AWS Access Key ID [None]: myaccesskey
AWS Secret Access Key [None]: mysecretkey
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

S3のバケット一覧出力

```
$ aws s3 ls --profile=PROFILE_NAME
```

ファイルのアップロード
--------------------------------

ファイルを個別にアップロード

```
$ aws s3 cp sample.txt s3://mybucketname/ --acl public-read --profile=PROFILE_NAME
```

ファイルをまとめてアップロード

```
$ aws s3 sync . s3://mybucketname/ --include "*" --acl public-read --cache-control "max-age=3600" --profile=PROFILE_NAME
```

HTMLファイルをまとめてアップロード

```
$ aws s3 sync . s3://mybucketname/ --exclude "*" --include "*.html" --acl public-read --cache-control "max-age=3600" --profile=PROFILE_NAME
```

gzip圧縮したhtml,js,cssをアップロード

```
aws s3 sync ./build s3://mybucketname/DIRECTORY_NAME/ --exclude "*" --include "*.js"\
  --acl public-read --cache-control "max-age=600" --content-type "application/javascript"\
  --content-encoding "gzip" --profile PROFILE_NAME
aws s3 sync ./build s3://mybucketname/DIRECTORY_NAME/ --exclude "*" --include "*.css"\
  --acl public-read --cache-control "max-age=600" --content-type "text/css"\
  --content-encoding "gzip" --profile PROFILE_NAME
aws s3 sync ./build s3://mybucketname/DIRECTORY_NAME/ --exclude "*" --include "*.html"\
  --acl public-read --cache-control "max-age=300" --content-type "text/html"\
  --content-encoding "gzip" --profile PROFILE_NAME
```



登録済みの情報を確認する
--------------------------------

設定一覧

```
$ cat ~/.aws/config
```

アクセスキーとシークレット一覧

```
$ cat ~/.aws/credentials
```



参考
--------------------------------

- cp : http://docs.aws.amazon.com/cli/latest/reference/s3/cp.html
- sync : http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
【AWS】Simple Notification Service

AWSの勉強の為にSNS(Simple Notification Service)について公式サイトの説明と、質問を観てまとめてみました。
随時更新していくメモです。

公式サイト
http://aws.amazon.com/jp/sns/

# 特徴
・APIまたはマネジメントコンソールを介してメッセージをモバイルデバイスまたは分散サービスにプッシュできる
・メッセージにシームレスにスケールできる

# 用語
・トピック：メッセージを送信し、通知を受信する通信チャネル
・サブスクライブ：メッセージを受信すること
・パブリッシュ：メッセージを送信する

# メリット
・即時性がある、プッシュベースの配信(ポーリング)
・シンプルなAPI(CreateTopi、Subscribe、Publish)とアプリとの容易な統合
・複数のトランスポートプロトコルに対応する柔軟性のあるメッセージ配信
・安価で前払いのない従量課金制
・信頼性：全メッセージは冗長的に格納されている

# SQSとの違い
SNSはアプリのプッシュメカニズムを使って、複数の受信者にタイミングが重要なメッセージを送信できる
そのため、更新を定期的に確認または「ポーリング」する必要性が無くなる

SQSは分散型アプリが使用するメッセージキューサービスであり、ポーリングモデルを通じてメッセージを交換してコンポ―ネントの送受信を切り離すために使用できる

# 請求
・従量課金制
・100万件に追記0.50USD
・HTTP経由で通知配信10万件につき、0.06USD
・SMS経由での通知配信100件につき0.75USD
・Eメール経由での通知配信10万件につき2.00USD

次は、SQSを投稿する予定です。
mongo shell, arango shell で全 document の表示

こんにちは。
MongoDB (3.0.4) shell, ArangoDB (3.0.2) shell で、指定した ```<db>```/```<collection>``` の全 document の内容を表示させてみました。

### mongo shell

```console
$ mongo
> db.getName()
    :
> show dbs
    :
> use <db>
> show collections
    :
> db.<collection>.count()
    :
> db.<collection>.find()  # <== list all documents
    :
    :
  Type "it" for more
> it
    :
> db.<collection>.find().count()
    :
>
```

### arango shell

```console
$ arangosh
> db._isSystem()
  true
> db._databases()  # このコマンドは、db == "_system" の場合に動作する
    :
> db._collection("_aqlfunctions").toArray().forEach(function(f){print(f.name)})  # ユーザ関数名
> db._useDatabase("<db>")
> db._name()
    :
> db._collections()
    :
> db._collections().forEach(function(c){if (!c.properties().isSystem) print(c._name, c.count())})  # system以外のコレクション名一覧
    :
> db.<collection>.count()
    :
> db._query("FOR d in <collection> RETURN d")  # <== list all documents
    :
    :
  type 'more' to show more documents
> more
    :
> db._query("RETURN LENGTH(FOR d in <collection> RETURN d)")
  [ 
    <count of documents>
  ]
>
```
- ただし ```db._databases()```は、v.2.8.x 以前では ```db._listDatabases()```。

- ```db.<collection>.all()``` を行っただけでは cursor オブジェクトを返すのみとなる。

```console
> db.<collection>.all()
  SimpleQueryAll(example)
>
```

- ```db.<collection>.toArray()``` を行うと cursor が末尾まで走り、全 document の array が出力される。

```console
> db.<collection>.toArray()
[
  {
    ...
  },
    :
    :
    :
  {
    ...
  }
]
> 
```
Windows8 でKinect XNAゲームが起動しない件

# Windows8 でXNAゲームが起動しない件

Windows7で制作したXNAソフトウェアが動かなかった。
動くように出来たのでメモ書き。

## 結論

まず述べておくと、
**Windows8 はデフォルトで入っているライブラリが少ない。**

使用している技術を全て覚えておくことが大事！
身に覚えがあるライブラリは全て入れましょう。

## 概要

・Kinect SDK 1.8
・Speech API (音声認識)
・XNA 4.0

まず、Windows8 に XNAは簡単にインストールすることは出来ない。

マーケットプレース クライアントをインストールする
http://www.xbox.com/ja-jp/LIVE/PC/DownloadClient

XNA Game Studio、 XNA GameStudio Redistributableをインストールする
https://www.microsoft.com/en-us/download/details.aspx?id=23714
https://www.microsoft.com/en-us/download/details.aspx?id=20914

Kinect SDK 1.8をインストールする  **Runtimeだけでは動作しなかった**
https://www.microsoft.com/en-us/download/details.aspx?id=40278

Speech SDKをインストールする
https://www.microsoft.com/en-us/download/details.aspx?id=27226


以上で解決

## Windows 7ではどうだったの？

XNA GameStudio Redistributable, Kinect runtime 1.8だけでいけたはず・・・。
エクスプローラから直接Excelファイルを読み取り専用で開く

#エクスプローラから直接Excelファイルを読み取り専用で開く

エクスプローラでExcelファイルを右クリックした際に「読み取り専用で開く」を有効にするスクリプトです。
通常、Shiftを押しながらExcelファイルを右クリックすると「読み取り専用で開く」が表示されますが実行しても読み取り専用になりません（ＭＳのバグ？）。DDEメッセージの引数で「読み取り専用」が有効になっていないためです。
このスクリプトはDDEメッセージの「読み取り専用」フラグをONにし、Shiftを押さなくても「読み取り専用で開く」を表示させます。

![excel.jpg](https://qiita-image-store.s3.amazonaws.com/0/69810/1b2ee990-7e61-4d1c-5f37-f0074de62ad5.jpeg)

```vb.net:Excelファイルの右クリック「読み取り専用で開く」を有効にするスクリプト
'-------------------------------------------------------------------------------
' Excelファイルの右クリック「読み取り専用で開く」を有効にするスクリプト
' 
' ExcelReadOnly.vbs
' 
' Copyright (c) 2015 Y.Watanabe
' 
' This software is released under the MIT License.
' http://opensource.org/licenses/mit-license.php
'-------------------------------------------------------------------------------
' 動作確認 : Windows 7 + Excel 2010 / Windows 8 + Excel 2013
'-------------------------------------------------------------------------------
' 以下参考サイト

' 無題 - 右クリックメニュー「読み取り専用で開く」を表示する(Excel&Word) 
' https://sites.google.com/site/universeof/tips/openasreadonly'
'-------------------------------------------------------------------------------
Option Explicit

On Error Resume Next

If WScript.Arguments.Count = 0 Then

    '自分自身を管理者権限で実行
    With CreateObject("Shell.Application")
        .ShellExecute WScript.FullName, """" & WScript.ScriptFullName & """ dummy", "", "runas"
    End With
    
    WScript.Quit
    
End If

If MsgBox("エクスプローラ右クリック(Excelの読み取り専用)を有効にしますか？", vbYesNo + vbQuestion, "読み取り専用有効化") = vbNo Then 
    WScript.Quit 
End IF

With WScript.CreateObject("WScript.Shell")

    'シフトを押さなくてもメニューが表示されるようにするように「Extended」キーを削除
    .RegDelete "HKCR\Excel.Sheet.8\shell\OpenAsReadOnly\Extended"
    .RegDelete "HKCR\Excel.Sheet.12\shell\OpenAsReadOnly\Extended"
    .RegDelete "HKCR\Excel.SheetMacroEnabled.12\shell\OpenAsReadOnly\Extended"

    Err.Clear

    '読み取り専用を有効にする
    .RegWrite "HKCR\Excel.Sheet.8\shell\OpenAsReadOnly\ddeexec\","[open(""%1"",,1,,,,,,,,,,,,1,,1)]", "REG_SZ"
    .RegWrite "HKCR\Excel.Sheet.12\shell\OpenAsReadOnly\ddeexec\","[open(""%1"",,1,,,,,,,,,,,,1,,1)]", "REG_SZ"
    .RegWrite "HKCR\Excel.SheetMacroEnabled.12\shell\OpenAsReadOnly\ddeexec\","[open(""%1"",,1,,,,,,,,,,,,1,,1)]", "REG_SZ"

End With

If Err.Number = 0 Then
    MsgBox "正常に関連付けを変更しました。", vbInformation + vbOkOnly, "読み取り専用有効化"
Else
    MsgBox "エラーが発生しました。", vbCritical + vbOkOnly, "読み取り専用有効化"
End IF
```
macOSでの便利な画面キャプチャテクニック

仕様書、技術系のブログ、プレゼン資料など、画面のキャプチャが必要な機会は多くあります。今回は基本的な画面キャプチャテクニックと共に、**覚えておくと得をする2つの応用テクニック**を紹介します。
#基本編
macOSにおける基本的な画面キャプチャの方法は以下です。

[command] + [shift] + [3] → 画面全体のキャプチャ画像を書き出す
[command] + [shift] + [4] → 画面上の選択範囲をキャプチャ画像を書き出す
[command] + [shift] + [4] + [スペース] → 選択したウインドウのキャプチャ画像を書き出す

キャプチャ画像はデスクトップに書きだされます。それぞれのキーに加えて**[control]を同時押しすると、画像の書き出しではなくクリップボードへのコピーとなります**。

#応用編
##キャプチャしたウインドウの周りのシャドウを消す
[command] + [shift] + [4] + [スペース] キーでウインドウをキャプチャした時、ウインドウの周りに自動でシャドウが入りますが、デザイン上このシャドウが不要な場合があります。そんなときはこのコマンドを使ってシャドウを消しましょう。

```lang:ターミナル
defaults write com.apple.screencapture disable-shadow -boolean true
```

以下のコマンドで設定を有効にします。

```lang:ターミナル
killall SystemUIServer
```

シャドウあり、なしの設定でウインドウをキャプチャーした画像が以下です。
![cats.jpg](https://qiita-image-store.s3.amazonaws.com/0/67884/a5b3ca86-7669-8b04-d804-44521c025c45.jpeg)

##カーソルも一緒に書き出す
上記の画面キャプチャの方法では、画面上のカーソルはキャプチャされません。しかし、macOS標準搭載のアプリ「グラブ」を使うと、**カーソルを含めて画面キャプチャを撮影することが可能**です。
![スクリーンショット 2015-07-06 20.55.50.png](https://qiita-image-store.s3.amazonaws.com/0/67884/054f3794-ef50-3d12-fee2-79cfb0c7237d.png)

手順は簡単です。
1. グラブを起動し、[グラブ]→[環境設定]を選択
2. 画面キャプチャ時に表示したいカーソルを選択
3. [取り込み]→[タイマー]を選択
4. 取り込みウインドウで[タイマーを開始]を押すと、10秒後にカーソルも含めて画面キャプチャが撮影されます。
5. キャプチャした画像が表示されるので、任意の名前で保存します。形式はtiffです。
6. Photoshop CC等で書きだされた画像を開き、必要な部分を切り抜けば完成です。
例えば下図の赤枠部分のように、アプリの操作説明時にカーソルを一緒に表示したいときに重宝します。
![psキャプ.png](https://qiita-image-store.s3.amazonaws.com/0/67884/42b09b48-c4e4-58e6-a747-4c17a70b6101.png)

他にも画像の保存場所を変更したり書き出し画像形式をjpg等に変更する設定もありますが、この2点を抑えておけば充分です。
ansible-xmlを使うには

# はじめに
ansibleでxmlのプロパティの一部を変えようと思ったのですが、こんな便利そうなものをみつけました。その名もズバリ、ansible-xmlです。

https://github.com/cmprescott/ansible-xml

さっそく使ってみようと思いタスクにxmlと書いてみたのですが、こんなタスクはないよと怒られてしまいました。どうやらansible-xmlデフォルトで入ってるタスクではないようですが、どうすれば新しいタスクを入れることが出来るんでしょうか。

# ansible-xmlのインストール方法
インストール方法はとても簡単です。ansible-xmlのレポジトリのトップにlibraryというフォルダがあるのですが、それをplaybook.ymlと同じ階層に置くだけです。案外簡単にできるんですね。

ちなみに、この方法はansibleのモジュールを自作する方法を調べてヒットしました。この記事を読めば、どうしてlibraryフォルダを置くだけでansible-xmlが動くのか分かると思います。

http://qiita.com/yunano/items/d58199eada0109d1e2fb#%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA
配布用に作成したElectronアプリを起動すると、ライブラリ読み込み時にエラーが発生する

# 原因

開発時に「./electrion path」でElectronを起動した時と、配布用に作成したElectron.appを起動した時では、node_modulesの参照PATHの優先度(global.module.paths)が違うようです。
node_modulesの参照PATHの優先度は、以下のメソッドで確認することができます。


~~~
> console.dir(global.module.paths)
~~~

配布用アプリのnode_modulesもglobal.module.pathsに含まれていましたが、優先度が低いためライブラリ読み込み時にエラーが発生していました。

# 解決方法

global.module.pathsの先頭に、配布用アプリのnode_modulesディレクトリのPATHを挿入することで解決できます。
Electronのアプリのメインスクリプト(注: package.jsonのmainで指定したmainスクリプトとは別です)の一番上に以下のようなコードを追加します

~~~
# src/scripts/main.cjsx

path = require('path');
node_module_path = path.resolve(path.join(__dirname, 'node_modules'));

global.module.paths.unshift(node_module_path)

...
~~~
YARN上のアプリケーション失敗時に簡単にログを収集する方法

YARNでMapReduceジョブが失敗したとき、往々にして各NodeManagerで実行されたタスクのログを確認する必要があります。数ノードクラスタであればそれほど苦になりませんが、数十、数百ノード以上のクラスタにおいてすべてのログを収集するのは困難です。トラブルシューティングする前に、必要なログを集めるために悩まなければなりません。

Clouderaのサポートチームでは、YARNアプリケーションが失敗した際の解析のために、YARNサービスのログの他に、Cloudera Manager(CM)が提供している「YARNアプリケーション診断データの収集」機能を使ってお客様から一括でログを提供頂いています。GUIから操作可能なので、簡単に必要なログを収集でき、お客様にとってもサポートチームにとっても非常に有用な機能です。これは、Cloudera Managerを使用していれば誰でも（Clouderaのサブスクリプションを未購入でも）取得可能なので、その方法を紹介します。

1. まず、CMのトップページからクラスタ >> アクティビティ:YARNアプリケーション を選択します。
![Screen Shot 2015-07-06 at 20.30.08.png](https://qiita-image-store.s3.amazonaws.com/0/32466/d300ca9b-7785-93e7-c48e-fd600a1dc6cc.png)

2. 実行中、完了済みのYARNアプリケーションの一覧が表示されます。必要に応じて、調査対象のアプリケーションを特定します。下記例では、"root.daisuke"というプールに投入された"QuasiMonteCarlo"というジョブを抽出しています。
![Screen Shot 2015-07-02 at 15.11.50.png](https://qiita-image-store.s3.amazonaws.com/0/32466/37c38858-4e13-74f0-1596-0f348228e455.png)

3. 右のドロップダウンメニューから、「診断データの収集」をクリックします。
![Screen Shot 2015-07-02 at 15.12.11.png](https://qiita-image-store.s3.amazonaws.com/0/32466/8944ac8f-7f9e-79f8-f811-9f9b3bf43e76.png)

4. 収集ウィザードではサポートチケット番号などを入力する項目がありますが、無視します。また、「Clouderaに診断データを送信します。」もチェックを外します。
![Screen Shot 2015-07-02 at 15.12.34.png](https://qiita-image-store.s3.amazonaws.com/0/32466/526ede29-2d11-9a34-8154-600ef71579fe.png)

5. 実際の収集ステップです。大まかに何をやっているのかがわかります。タスクが実行されている全ホストからログを収集しているわけですね。
![Screen Shot 2015-07-02 at 15.12.46.png](https://qiita-image-store.s3.amazonaws.com/0/32466/ba463542-0264-f4b0-30e4-76fcb8b1a80a.png)

6. 実行が完了しました。「結果データのダウンロード」から収集結果をダウンロードしましょう。"Stderr"というリンクをクリックすると、実際に内部で実行されているコマンドが確認可能です。
![Screen Shot 2015-07-02 at 15.15.24.png](https://qiita-image-store.s3.amazonaws.com/0/32466/9e894899-0cff-8a98-8998-48611988f3f3.png)

7. ダウンロードしたファイルを解凍し、展開後のディレクトリ内にあるYarnApplicationDiagnosticsCollection-XXX.tgzというファイルを解凍します
8. ディレクトリ構造は以下のようになっています。ジョブのConfigurationやCounterがJSON形式で収集されています。また、タスクのログはaggregated_logs配下に収められています。
![Screen Shot 2015-07-02 at 15.19.04.png](https://qiita-image-store.s3.amazonaws.com/0/32466/2c74219a-d6d8-de18-14e9-101297514a82.png)

JSONファイル名と中身の対応は以下のとおりです。改行が省かれているので、適宜整形ツールを使って表示するとよいでしょう。

* job_info.json: ジョブのメタデータ。起動/完了時刻や、mapper/reducerの数など
* job_tasks.json: ジョブの各タスクのステータス
* job_counters.json: ジョブのCounter
* job_conf.json: ジョブのConfiguration
* job_attempts.json: ジョブの試行に関する情報。起動/完了時刻や、ログをJobHistoryServerから参照するためのリンクなど

もちろん、YARNモードで実行したSparkのアプリケーションログも収集可能で、以下のような構造でログやアプリケーションのメタデータが格納されています。
![Screen Shot 2015-07-06 at 20.56.37.png](https://qiita-image-store.s3.amazonaws.com/0/32466/68b38500-c528-18b1-fe56-8e2f21acfebf.png)

以上です。Cloudera Managerの仕組みについては以下の記事も参考になると思います。
[Cloudera Managerの仕組み その1](http://www.cloudera.co.jp/blog/how-does-cloudera-manager-work1.html)
[Cloudera Managerの仕組み その2](http://www.cloudera.co.jp/blog/how-does-cloudera-manager-work2.html)

基本的な使い方を知る上では下記ドキュメントもご覧ください。
[Cloudera Manager 日本語ドキュメント 5.0.0 ドキュメント](http://www.cloudera.co.jp/doc/cm/index.html)

また、Clouderaでは月次でCloudera Manager勉強会を開催し、機能紹介やデモを中心に弊社のエンジニアが講師を務めています。次回の開催日時はニュースレターで案内しているので、購読希望の方は info-jp@cloudera.com に件名: ML_SUBSCRIBE でメールをお送りください
scriptingDefineSymbolsの各プラットフォームごとの値

ProjectSettings.asset内 のscriptingDefineSymbols値を調査しました
　プラットフォーム毎にこんな感じです。
    1: PC、Linux
    2: Web Player
    4: iOS
    7: Android
    13: WebGL
    14: WinStoreApp
    15: WinPhone8
    16: BlackBerry
    22: Samsung TV

■ProjectSettings.assetをテキスト形式で見たければ
　Edit->ProjectSettings->Editor->Asset Serialization->Force Text　に変更


※非公式の値なので自己責任で
Mac、iOSで、rand()関数の疑似乱数アルゴリズムがヘン！

話の発端は、StackOverflowの、この質問にあった。

[StackOverflow 日本語版 - c言語での乱数生成](http://ja.stackoverflow.com/questions/12003/c言語での乱数生成)

質問に対する回答は、きわめて単純で、`rand()`関数を、取得したい乱数の個数分、呼んでやりましょうというもの。
いちおう、XcodeのCommand Line Toolで、サンプルコードを作って、それを実行してみて、ちゃんと意図したとおりの結果になることを確認する。が、ここで奇妙なことに気づく。
何度実行しても、初項が4になる。
試しに、こんなC言語のコードを書いて、Xcodeで実行してみる。

```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, const char * argv[]) {
    unsigned int i;
    unsigned int seed = (unsigned int)time(NULL);
    for (i = 0; i < 100; i++) {
        srand(seed + i);
        printf("%d, ", rand() % 7);
    }
    putchar('\n');
    
    return 0;
}
```
結果はこちら：

> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 

2015年7月4日時点では4の繰り返しになりましたが、現時点（2015年7月6日）では2の繰り返しになります。値が変わったのは、乱数の種に`time()`関数を使っているからでしょう。
7の剰余を使うと、同じ値の繰り返しになりますが、それ以外の剰余、たとえば3だと、「2, 1, 0, 2, 1, 0……」と循環数になります。
これはひとめで、まずいと思う。実践的には、`srand()`関数をなんども呼ぶことはないだろうが、毎回プログラムを実行すると、つねに初項がおなじというのは、きっと不都合な影響を出すに違いありません。たとえば、シューティングゲームのプログラムで、`rand()`関数を使って、標的を出現させたとしたら、ゲームスタートで、いつも同じ標的が、おなじ場所から現れる、ってことになる。
言い遅れましたが、実行環境は、MacBook Pro、OS X 10.10.4 Yosemite、Xcode  6.4、Clangのバージョンは、Apple LLVM version 6.1.0 (clang-602.0.53)。
同様のプログラムを、iOS 8.4のiPadで動かしても、おなじ結果になります。まあ、それはそうでしょうね。
Mac、iOS、Clang以外の環境だと、どうなるんだろうか？ざんねんながらApple製以外のコンピュータがないので、C言語をウェブ上で実行してくれるサイトで、実験してみました。

[ideone](http://ideone.com/)
[codepad](http://codepad.org)

前出のコードを上の2箇所で実行したら、ぱっと見、規則性が認められない結果が得られました。
なにが悪いんでしょうか？Clang、それとも、Appleが用意したC言語の標準ライブラリ？
どなたか、C言語の疑似乱数アルゴリズムに詳しい方がいらっしゃいましたら、なんでもいいんで、情報を共有してもらえたらありがたいです。
Elixir/Phoenixを実行してみる

# はじめに

　Elixir/Phoenixを覚えたら、向こう数年おいしいごはんを食べられると偉い人たちが言っています。Railsに取って代わる次世代のWeb言語＆フレームワークだそうです。楽してご飯を食べてゆきたいエンジニアとしては、スタダせざるを得ませんね。

　参考１：http://qiita.com/HirofumiTamori/items/0dfdbada30c7d8f183fd
　参考２：http://qiita.com/mizchi/items/e38d3f0461fe316021f7

　ということで、rails s的なことをするところまで、簡単に見ていくこととしましょう。尚、以降のコードに関してはcentos6で動作を確認しております。centos7でも動くと思います。デビアンマンは適宜読み替えて下さい。

# 手順

## evm&erlang/OTP


```
$ sudo yum install -y lynx wget curl git nodejs npm redhat-lsb inotify-tools
$ git clone https://github.com/robisonsantos/evm.git
$ cd evm
$ ./install

$ echo 'source /home/sen/.evm/scripts/evm' >> ~/.bashrc
$ source ~/.bashrc
$ evm list
Available Erlang versions on http://www.erlang.org

OTP_18.0
OTP_17.5
OTP_17.4
OTP_17.3
OTP_17.1
OTP_17.0
R16B03


$ evm install OTP_17.5
$ evm use 17.5 default
$ erl
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V6.4  (abort with ^G)

$ cd ../
```

※ kerlというバージョン管理マネージャーもあるようですが、evmの方がrvmっぽくってrubyエンジニアには向いていると思いました。


## kiex/elixir

```
$ \curl -sSL https://raw.githubusercontent.com/taylor/kiex/master/install | bash -s
$ echo 'test -s "$HOME/.kiex/scripts/kiex" && source "$HOME/.kiex/scripts/kiex"' >> ~/.bashrc
$ source ~/.bashrc
$ kiex list known
$ kiex install 1.0.5
$ kiex use 1.0.5 default
$ iex
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]

Interactive Elixir (1.0.5) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
```

## rebar

```
$ git clone git://github.com/rebar/rebar.git
$ cd rebar
$ ./bootstrap
$ sudo mv rebar /usr/local/bin/
$ rebar -V
rebar 2.6.0 17 20150706_104711 git 2.6.0-14-ge83a214


$ cd../
```


## phoenix
```
$ mix local.hex
$ mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v0.14.0/phoenix_new-0.14.0.ez
$ mix phoenix.new hello_world
$ cd hello_world
$ mix deps.get
$ npm install
$ mix phoenix.server
[info] Running HelloWorld.Endpoint with Cowboy on http://localhost:4000
06 Jul 19:53:33 - info: compiled 3 files into 2 files, copied 3 in 1580ms

```

# 確認

実際にアクセスしてみると、以下のとおりログが出力されることを確認できました。

```
[info] GET /
[debug] Processing by HelloWorld.PageController.index/2
  Parameters: %{"format" => "html"}
  Pipelines: [:browser]
[info] Sent 200 in 42ms
[error] backend port not found: :inotifywait

[info] GET /favicon.ico
[info] GET /
[debug] Processing by HelloWorld.PageController.index/2
  Parameters: %{"format" => "html"}
  Pipelines: [:browser]
[info] Sent 200 in 534μs
```

　早い早いと有名なElixir/Phoenixですが、実際にマイクロ秒とか見せられると、お前それ本当かよって突っ込みを入れたくなりますよね。とは言え、オッパイとアクセス速度は小さいに越したことありません。ロリコンも大満足です。今後のハッテンに期待でしょう。
googlemapで「みちびき」の軌道をプロットした。

![mitibiki.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/27e97acc-f4f0-82df-ce88-8427067e8f22.png)

[サンプルコード](http://jsdo.it/ohisama1/r6bY)
この軌道が正しいか検算できる、学のある方、ご指導願います。
mailxコマンドで、FromとEnvelope Fromを指定する

CentOS6.6のmailx-12.4-8.el6_6.x86_64で確認しています。

```bash:test.sh
#!/bin/bash

export LANG=ja_JP.utf8

to=you@host.domain
from=me@host.domain
env_from=空条承太郎
subject=こんばんは

cat body.txt | mail -s "${subject}" -S from="${env_from} <${from}>" ${to}
```
【PHP】配列内の要素が全て数値か調べる

## 概要
配列内の要素が全て数値か調べる。
is_numeric は数値形式の文字列も true とみなすので注意。

## code
```php:is_numeric_array.php
function is_numeric_array($array)
{
    if (in_array(false, array_map('is_numeric', $array))) {
        return false;
    } else {
        return true;
    }
}
```

```php
/* 実行結果 */
$array = array(
	'1',
	1,
	(object)'qiita',
	array(),
);
var_dump(is_numeric_array($array));
// boolean false

$array2 = array(
	'1',
	1,
);
var_dump(is_numeric_array($array2));
// boolean true
```
Raspberry pi 2が外付けHDDを自動認識してくれなかった

##経緯
UUIDを調べて、

```console
$ sudo blkid
```
自動起動に叩き込んで

```console
$ sudo vim /etc/fstab
```

```text:/etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
UUID=YUNOCCHIKAWAII   /mnt/hdd  ntfs    defaults          0       0
```

これで再起動すれば自動的にHDDを`/mnt/hdd`にマウントしてくれるはず！ 
→してくれませんでした

書式がおかしいのかとも思ったけど手動で`sudo mount -a`するとちゃんとマウントしてくれるのよね。

##なんでや
同じ症状が出てる人結構いるみたいです。
[/etc/fstab down't work with RPI2 · Issue #824 · raspberrypi/linux](https://github.com/raspberrypi/linux/issues/824 "/etc/fstab down't work with RPI2 · Issue #824 · raspberrypi/linux")

- raspi2では起動プロセスが複数コアで並列して行われてる
 - /etc/fstabのパースがHDD認識と同時またはそれ以前に行われてしまう
 - /etc/fstabを読んでる段階ではUUIDとHDDが紐ついていないので、そんなHDDないよってことですっとばされる

##解決策
各HDDのUUIDが判明するまでマウント作業を待ってもらえばいい。
`/boot/cmdline.txt`に`rootdelay=5`を追記。

うちの環境ではまだちょっと怪しい。3回試して1回読み込み失敗。
使ってる外付けがへっぽこすぎるのかな・・・？
どうせ鯖なんだし起動が多少遅くてもいいやってんで、`rootdelay=10`にして一旦解決。

###追記
@tukiyo3 さんにコメント頂きました。
いちいちroot以下全てのディスクの読み込みを遅らせなくとも、`cron`の`@reboot`マクロを使うことで
起動プロセス終了後(正確には`cron`の起動時)に`mount`させられるとのことです。

###追記2(2015/11/16)
[さっきのissue](https://github.com/raspberrypi/linux/issues/824 "/etc/fstab down't work with RPI2 · Issue #824 · raspberrypi/linux")で`usbmount`なるパッケージに言及がありました。
aptから拾ってくるだけでUSBメモリやらHDDやらをマウントしてくれるゆとり向け難易度らしいです。マウントする場所を替えたいなら`/etc/usbmount/usbmount.conf`を弄れとかなんとか。
UIButtonでボタン作成

UIButtonでボタンの作成方法のメモ

まず最初にUINuttonクラスのインスタンスを定数で設定します。
①UIButtonクラスのインスタンス作成ーーーーーーーー
let myButton = UIButton()

②装飾ーーーーーーー

◼︎title設定
myButton.setTitle("ボタンのタイトル", forState: UIControlState.Normal)
myButton.setTitle("タップされている時のタイトル", forState: UIControlState.Highlighted)
// UIControlState.Normal → 通常時のタイトル
// UIControlState.Highlighted → ボタンがタップされている時のタイトル

◼︎ボタンの背景色設定
myButton.backgroundColor = UIColor.blueColor()

◼︎ボタンの文字色
myButton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)

◼︎size設定
myButton.frame = CGRectMake(x, y, width, height) // ボタンの配置位置、幅、高さを指定
myButton.sizeToFit() // 文字の長さ、大きさにフィットするサイズ

※ layerプロパティを使った装飾
◼︎枠を丸くする
myButton.layer.masksToBounds = true

◼︎コーナーの半径を設定
myButton.layer.cornerRadius = 3

◼︎ボタンの位置の指定
myButton.layer.position = CGPoint(x: スーパービューの左端からの距離, y: スーパービューの上端からの距離)

③ボタンを押した時のアクションを設定ーーーーーーー
myButton.addTarget(self, action: "clickAction:", forControlEvents: .TouchUpInside)
// ClickAction : 押した時に呼ばれるメソッド名
※ action名の中でclickAction:の「:」を忘れずに。

④ボタンをビューに配置するーーーーーーー
self.view.addSubview(myButton)


ここでボタンの設置は完了です。
ですがまだ、押した際に起こるアクションが設定されていないのでclickActionメソッドを定義します。
「ボタンが押されました。」と出力させてあげましょう。


⑤アクションメソッドの設定ーーーーーーー
func clickAction(sender: UIButton) {
    println("ボタンが押されました。")
}

以上です。
間違えている点があれば教えていただけると幸いです。
Amazon Elastic Mapreduce

#Qwik labs を引き続きやっていきます！！

今日はAmazon Elastic Mapreduce　をやります。

そもそもAmazon Elastic Mapreduceとはなんぞや？？

要するに Hadoop をAWSに埋め込んだみたいな感じらしいです。
この解説がとても分かりやすいです。

https://www.youtube.com/watch?v=kNsS9aDf6uE
https://www.youtube.com/watch?v=Hhj3fOdt7zo

ここで前提としてHadoopの理解があげてあるのでslideshareで載せておきます。
http://www.slideshare.net/hamaken/hadoop-cloudera-world-tokyo-2014

要するにHadoopとは。。。？

➡大量のデータを処理するときに複数のサーバーを利用してよりスムーズにしていくもの。
　googleの論文を元に開発されたとか。。。

早速　やっていきましょーーー

まずはサインインをしてS3のコンソールを選ぶ
![スクリーンショット 2015-07-06 16.17.37.png](https://qiita-image-store.s3.amazonaws.com/0/84382/053120a2-f41a-4243-b7c5-578d7201a533.png)

ここでbucketを作成

名前のところでemr-bucket-○○○　＊○○○のところには名前のイニシャルを入れる
![スクリーンショット 2015-07-06 16.19.52.png](https://qiita-image-store.s3.amazonaws.com/0/84382/b911e933-3590-d3ec-4dd8-7a6e9488d53b.png)

また、リージョンは今いる場所以外のものを選ぶと高くなるらしいのでTOKYOを選択。

bucket完成！！

次にEMRのコンソールへ

手順はこんな感じです。
![スクリーンショット 2015-07-06 16.36.35.png](https://qiita-image-store.s3.amazonaws.com/0/84382/19a4dc6b-d6fb-c009-8e5e-5f34974908f3.png)

続いてはタグセッション。
![スクリーンショット 2015-07-06 16.52.21.png](https://qiita-image-store.s3.amazonaws.com/0/84382/c74a219e-db76-3f09-3ce4-b1ef51eb2842.png)

次にHardware configurationセッション

![スクリーンショット 2015-07-06 16.54.14.png](https://qiita-image-store.s3.amazonaws.com/0/84382/93a89c94-f800-4c83-738f-25a677494047.png)


次にsecurity and access

ここではEC2のペアーキーなしで進みます。
![スクリーンショット 2015-07-06 17.53.43.png](https://qiita-image-store.s3.amazonaws.com/0/84382/8d415336-9e15-7170-7909-68a97e780dde.png)

あとはOK押すだけです。クラスターはこんな感じに見えます。
![スクリーンショット 2015-07-06 17.54.36.png](https://qiita-image-store.s3.amazonaws.com/0/84382/80034334-ec6f-bc5b-5b66-6ad81046664e.png)

クラスターをモニタリングできます。まずは、クラスターリストをクリック
![スクリーンショット 2015-07-06 17.56.10.png](https://qiita-image-store.s3.amazonaws.com/0/84382/febcd82b-cca8-a2df-4784-c46e306b067b.png)

こんな感じでモニタリング
![スクリーンショット 2015-07-06 17.58.04.png](https://qiita-image-store.s3.amazonaws.com/0/84382/79d4cda3-3b6b-6d8d-e26f-cf66a9652631.png)

ここで問題発生。結果を見ようとS3へ
ここでの指示が「output folderを選択してください」

ところがそんなもんないよーーーー
![スクリーンショット 2015-07-06 18.48.31.png](https://qiita-image-store.s3.amazonaws.com/0/84382/811892a8-2bbd-a9b9-5882-b289026e1752.png)

同じ質問を発見
![スクリーンショット 2015-07-06 18.47.02.png](https://qiita-image-store.s3.amazonaws.com/0/84382/1ce2ba0b-ef1f-d3d1-36b7-c44000ecc446.png)

しかし、stackoverflowで誰かが答えてました！！
![スクリーンショット 2015-07-06 18.59.07.png](https://qiita-image-store.s3.amazonaws.com/0/84382/9ac708c4-ffa8-e367-ef76-3df2e8ca2077.png)

![スクリーンショット 2015-07-06 19.02.14.png](https://qiita-image-store.s3.amazonaws.com/0/84382/b5aff9e3-2fcf-98b0-9c81-212eeb0966f8.png)


すげーーー

恐るべし。。。

僕も無事できました。！

stackoverflow　やばいっすね。

みなさん、コメントお待ちしております。
messageを最速でeditする


## 結論
「↑キー」を押せば良い

## 例

![スクリーンショット 2015-07-06 18.52.52.png](https://qiita-image-store.s3.amazonaws.com/0/43938/bc91c5d9-e050-1792-dc88-6c9e115838c6.png "スクリーンショット 2015-07-06 18.52.52.png")
ミスった

![スクリーンショット 2015-07-06 18.54.41.png](https://qiita-image-store.s3.amazonaws.com/0/43938/d6656cc5-986a-5b59-f31a-be224d3e5e8b.png "スクリーンショット 2015-07-06 18.54.41.png")
すかさず「↑キー」を押してedit

![スクリーンショット 2015-07-06 18.53.15.png](https://qiita-image-store.s3.amazonaws.com/0/43938/34f51138-0f24-6cc6-41c1-d68aaebc5977.png "スクリーンショット 2015-07-06 18.53.15.png")
直った
ubuntu 14.04でdockerでjiraで遊んでみる

Dockerで遊んでみる　第四弾です。
いつもインストールして使ってみたいなぁ～　と思うのですが「redmineがあるから」と言われ遊んだことのないjiraを入れてみたいと思います。

いつものようにこちらのページでやり方を見ながら順にやってみたいと思います。
https://registry.hub.docker.com/u/cptactionhank/atlassian-jira/

### jiraのイメージのインストール

```shell-session

※永続化データの置き場所を作成
root@raidtest:~/docker_test# pwd
/home/miyumiyu/docker_test
root@raidtest:~/docker_test# mkdir jira

※言われた通り実行！
root@raidtest:~/docker_test# docker run --detach --publish 8080:8080 cptactionhank/atlassian-jira:latest

～イメージダウンロードがずらら～　と
409e26f642a52c4ffe2dad160f54eca0a5352e5cd268150f69946b7bc7b105c4
root@raidtest:~/docker_test#

※確認すると、なんか動いてる
root@raidtest:~/docker_test# docker ps
CONTAINER ID        IMAGE                                 COMMAND                CREATED             STATUS              PORTS                    NAMES
409e26f642a5        cptactionhank/atlassian-jira:latest   "/usr/local/atlassia   51 seconds ago      Up 50 seconds       0.0.0.0:8080->8080/tcp   insane_stallman
root@raidtest:~/docker_test#

```

これで完了したっぽいです。
この状態でホストのIP:8080にアクセスすると、jiraの設定画面が出ました！

で、次へをクリックすると
![1fbb41e871b4d5a72d62b38db848b646.png](https://qiita-image-store.s3.amazonaws.com/0/79067/692fc31d-2e67-9b31-1077-311322cce542.png)

勝手に登録すると怒られるので、ここでゲームオーバーです。　ぐすん。。。
CTF for ビギナーズに行ってきた

#CTF for ビギナーズ


東京で行われたCTF for ビギナーズに参加してきた。仮想環境のキーボードでトラブったがスタッフさんがすぐに解決してくれたりと、とてもよい環境で講習と演習ができた。
以下は午後に行われたCTFのWriteUp(解答)を忘れないように書いたもの。

##【その他 100P】練習問題(まずはここから)(最初にこれを開く)(これを解いてから他の問題をやる)
練習問題。CTFのやり方を説明してある。書いてあるフラッグをそのまま提出しておわり。

##【Web 100P】Can you login as admin?
IDとパスワードを入力するログインフォームがあり、ID:guest、パスワード:guestでログインできるよとかいてあり、
ログインするとadminでログインすればフラッグやるよと言われる。
SQLインジェクションができるので、ID:adminでログインできてフラッグが表示される。
講義の資料そのまま読めばできた


##【Web 200P】Find the flag
HTTPヘッダを開発者ツールで見たらフラッグがあった。詳しくは覚えていない


##【Web 300P】1M4G3 V13W3R
画像のアップローダがあったのでphpをアップすると実行される感じかと思ったら。
URLに「?file=なんとか.jpg」的なURLだったので「?file=../view.php」「?file=../index.php」で
どっちだか忘れたけどコメントにフラッグが書いてあった。


##【Network 100P】Insecure Protocol
pcapファイルが渡されるので、Wiresharkで開くとtelnetのパケットがあることがわかる。
telnetは暗号化されていないプロトコルなので、WiresharkのFollow TCP Streamを実行すると、フラッグが出る。


##【Network 200P】Insecure Protocol2
pcapファイルがまた渡されるのでWiresharkで開いてFollow TCP Streamすると、フラッグ部分は隠されているがIDとパスワードは書いてあるので
telnetで接続するとフラッグが手に入った。


##【Binary 100P】NOT onion 
exeファイルが渡されるのでとりあえずfileコマンドを叩くとgifのデータだと分かる。拡張子を変更して画像として開くとフラッグが表示された
画像からフラッグを書き写すときにスペルミスで死んだ

##【Binary 200P】読めますか？
とりあえずfileコマンドを叩くと、PNGだった。画像を開くと@_wata1221さんのアイコンが一部表示された。
バイナリエディタに投げて目grepしたらフラッグがあった。
よくよく考えてみると「strings | grep ctf4b」で一発で出たよなとか思った。