OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby で「モルダー、あなた疲れてるのよ」を出力したりしなかったりするクラスを作った

# 動機

「Ruby で『モルダー、あなた疲れてるのよ』を出力したりしなかったりしたいなぁ」と思い悩んでいたところ、
[Ruby でモルダー、あなた疲れてるのよを出力する方法](http://qiita.com/supermomonga/items/3a3da5518ae72b35ce8b) という素晴らしい記事に出会いました。ただ、もっと汎用的に「モルダー、あなた疲れてるのよ」を出力したりしなかったりしたいので、専用のクラスを作ってみました。

# 成果物

[Enumerable](http://docs.ruby-lang.org/ja/2.3.0/class/Enumerable.html) で Mulderable な感じにしてみました。

```rb
class Mulder
  include Enumerable

  SCULLYS_WORDS = %w(モルダー あなた 疲れてる のよ).map(&:freeze).freeze
  SCULLYS_NATURAL_REMARK = SCULLYS_WORDS.dup.insert(1, '、').join.freeze

  def each(&block)
    @words ||=
      SCULLYS_WORDS
        .shuffle
        .each_slice(2)
        .map { |pair| join_capriciously(pair) }
        .flatten
        .insert(2, '、')

    @words.each(&block)
  end

  def to_s
    to_a.join
  end

  def natural?
    to_s == SCULLYS_NATURAL_REMARK
  end

  private

  def join_capriciously(pair)
    pair
      .map { |word| halve(word) }
      .flatten
      .tap { |words| break words.values_at(2, 1, 0, 3) if rand(2) == 0 }
  end

  def halve(word)
    word.chars.each_slice((word.size + 1) / 2).map(&:join)
  end
end
```

# 動作確認

```ruby
loop.with_index(1) do |_, i|
  mulder = Mulder.new

  puts("#{i}: #{mulder}")
  break if mulder.natural?
end
```
```
1: あなた、モルダー疲れてるのよ
2: モルダー、あなたのてる疲れよ
3: あなた、モルダーのよ疲れてる
4: のよ、モルダーあなた疲れてる
5: あなてる、疲れたモルダーのよ
6: のよ、モルダーあなてる疲れた
7: 疲れてる、あなたモルよのダー
8: のよ、疲れてるモルダーあなた
9: 疲れよ、のてるモルダーあなた
10: 疲れてる、モルダーあなよのた
11: 疲れてる、あなたのダーモルよ
12: のた、あなよ疲れダーモルてる
13: 疲れダー、モルてるのたあなよ
14: あなよ、のた疲れダーモルてる
15: のてる、疲れよあなたモルダー
16: あなた、モルダー疲れてるのよ
17: モルてる、疲れダーあなよのた
18: あなよ、のたモルてる疲れダー
19: 疲れた、あなてるのダーモルよ
20: のよ、あなたモルダー疲れてる
21: 疲れダー、モルてるのたあなよ
22: 疲れよ、のてるモルダーあなた
23: のた、あなよモルダー疲れてる
24: あなダー、モルたのよ疲れてる
25: モルダー、のよ疲れてるあなた
26: モルよ、のダー疲れたあなてる
27: 疲れた、あなてるモルよのダー
28: モルダー、疲れてるのよあなた
29: あなた、のよ疲れダーモルてる
30: のよ、モルダーあなてる疲れた
31: あなた、モルダーのよ疲れてる
32: モルダー、のよあなてる疲れた
33: 疲れてる、あなたのダーモルよ
34: モルダー、のよあなた疲れてる
35: のよ、あなたモルダー疲れてる
36: あなてる、疲れたのダーモルよ
37: モルダー、疲れてるのよあなた
38: モルよ、のダーあなた疲れてる
39: モルダー、あなた疲れよのてる
40: あなた、疲れてるモルよのダー
41: モルよ、のダーあなた疲れてる
42: 疲れてる、モルダーのよあなた
43: のよ、あなた疲れダーモルてる
44: あなた、疲れてるモルよのダー
45: モルダー、あなた疲れてるのよ
```

また Enumerable を include しているので `map` などが使えます。`to_a` も自動で定義されます。

```rb
puts Mulder.new.map.with_index(1) { |word, i| "#{i}: #{word}" }.join("\n")
```
```
1: の
2: よ
3: 、
4: あな
5: た
6: モル
7: てる
8: 疲れ
9: ダー
```

# 参考

* [Ruby でモルダー、あなた疲れてるのよを出力する方法](http://qiita.com/supermomonga/items/3a3da5518ae72b35ce8b)
    * リスペクト元です :sparkles: 
* [The X-Files - Wikipedia, the free encyclopedia](https://en.wikipedia.org/wiki/The_X-Files)
    * 「スカリー」のスペルを調べるためだけにアクセスしました :woman: 

# 個人的な疑問

```rb
def each(&block)
  ### 略 ###

  @words.each(&block)
end
```

を `yield` を使って書けないだろうか。

```rb
def each
  ### 略 ###

  @words.each { |word| yield(word) }
end
```

だと、ブロック無しで呼んだ場合に配列 `@word` を返してしまう。本当は [Enumerator](http://docs.ruby-lang.org/ja/2.3.0/class/Enumerator.html) オブジェクトを返したい。

```rb
def each
  ### 略 ###
  
  if block_given?
    @words.each { |word| yield(word) }
  else
    @words.each
  end
end
```

と書くしかないのか。
EC2+Postfix+お名前.comでメール受信で引っかかったこと

転んだ所だけメモします。

なお主な設定は、
[AWS上のpostfixでメールを受信してみる](
https://github.com/mechamogera/MyTips/wiki/AWS%E4%B8%8A%E3%81%AEpostfix%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E5%8F%97%E4%BF%A1%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B) : mechamogeraさん
が非常に参考になりました。


# 環境

* EC2
    * AmazonLinux 2015.09
    * MySQL5.5(5.6だとPostfix2.6が依存しているMySQL5.5のLibと競合してしまったりするので5.5の方が楽だった
    * dovecot 2.2
    * postfix 2.6
* ドメインはお名前.com


# AWSに申請する編

AWSにメールを送信するので制限を解除してなって申請する必要がある。
以下がとても参考になりました。

[Amazon EC2 Eメール送信ベストプラクティス](http://dev.classmethod.jp/cloud/aws/ec2-send-email-best-practice/) ： Developers.io,  大瀧隆太さん(クラスメソッド株式会社)



# インストール編
* Postfixの依存関係の解決
    * MySQL5.6が動作している環境だったため、MySQL5.5にダウングレードして、Postfix2.6をyumで導入。

# ドメイン設定編
お名前.comでの作業。

* AとMXのレコードを設定する必要があったが、AだけしててMX設定しわすれてた。
    * MXが設定されているか確認するときは👇のツールが役に立った
        * [MXTOOLBOX](http://mxtoolbox.com/SuperTool.aspx)
        * MXとAレコードが反映されていないと、メールが届かないかと思いますので、反映されたか確認するときにも使えた

# Postfixの設定編
* SASL認証関係
    * 引っかかってるか分からなかった
        * ` testsaslauthd -u test -p password` で認証成功してるか確認できる。便利
            * この場合の`test`はUserID、`password`はパスワードです。
    * そもそも`saslauthd`の設定で`MECH=shadow`を設定していなかった。
        * ☝︎を設定したら、testsaslauthdがSuccessになりました。

# alias編

* 特定のアドレス(例:test@hogehoge.jp)宛てにGmailから送ってるのに、testユーザーのメールボックスに無い。
    * ログを確認
        * `tail -f /var/log/maillog`
    * 送信処理（Gmailとか）からしたあとに幾ら待てどもログが流れてこないときは、ポートを確認。
        * 25番(SMTP)や587番(サブミッションポート)
    * ログは流れてくるが、`to=<test@hogehoge.jp>`となっておらず、`orig_to=<test@hogehoge.jp>`となってるときはaliasの設定が効いてる。
        * postfixの設定でaliasの設定を施していない時は、`/etc/aliases`の中をgrepして確認してみると良い
            * 僕は`to=<root@hogehoge.jp>`となっていた。そのためrootのメールボックスに届いてた。
        * `/etc/aliases` の設定編集後は`$ newaliases`を実行してaliasを反映させる必要がある


# 最後に

SESとか使いたい。(　´･‿･｀)
vagrant box addやvagrant upでエラーが出た場合の対処方法のまとめ

# 概要
最近導wordpressのローカル環境をvagrantで構築しました。一度削除して再構築しようと思いよくわからず物理的にローカルのwordpress環境のディレクトリを削除したらvagrant box addしたらエラーが出たので色々と調べて試してみました。

# vagrant box addで出たエラー
```
vagrant box add miya0001/vccw
==> box: Loading metadata for box 'miya0001/vccw'
    box: URL: https://atlas.hashicorp.com/miya0001/vccw
==> box: Adding box 'miya0001/vccw' (v2.19.0) for provider: virtualbox
The box you're attempting to add already exists. Remove it before
adding it again or add it with the `--force` flag.

Name: miya0001/vccw
Provider: virtualbox
Version: 2.19.0
```

[vagrant upで A VirtualBox machine already exists.とでる解決方法](http://qiita.com/pugiemonn/items/92f234b7894bd4709f72)

上の記事を参考にして試してみましたがエラーは解消されませんでした。


次に参考したのはこちらのサイト
[Mac で $ vagrant box add にエラーが出た時の対処法メモ](http://yasainet.net/archives/369)

>つまり
$ rm -r ~/.vagrant.d/
をしたあとに
$ vagrant box add ubuntu-14.04 trusty-server-cloudimg-amd64-vagrant-disk1.box
をすると

~/.vagrant.d/配下を全部消してしまうともう一つ構築していた他の環境が使えなくなるのかなと思い、最終的には以下のようにエラーを出していたboxだけ削除したらエラーは解消されました。

```
cd ~/.vagrant.d/boxes/
ls
CentOS71			miya0001-VAGRANTSLASH-vccw #こちらのboxでエラーが出ていたので、これだけ削除
rm -fr miya0001-VAGRANTSLASH-vccw/
```

# vagrant box addのエラーは解消したがvagrant upでエラー
vagrant box addは成功しましたらが、結局vagrant upで以下のエラーが出ました。
~/.vagrant.d/を退避して試して

```
A VirtualBox machine with the name 'vccw.dev' already exists.
Please use another name or delete the machine with the existing
name, and try again.
```

# ~/.vagrant.d/を退避
~/.vagrant.d/を退避してvagrant box addしてvagrant upしたがまた同じエラーが出ました。

```
A VirtualBox machine with the name 'vccw.dev' already exists.
Please use another name or delete the machine with the existing
name, and try again.
```

# ~/VirtualBox VMsの中にvccw.devを複数発見

とりあえず最新日付のvccw.dev_1(4/1のもの)をひとつだけ残して、他を削除してvagrant upしたら最終的にvagrant up出来ました。

```

3 18 17:12 vccw.dev/
3 27 18:22 vccw.dev_1_1459070520871_21360/
3 27 20:52 vccw.dev_1_1459079515262_11949/
4  1 07:18 vccw.dev_1_1459462678135_49839/
```
Raspberry Pi をMacでセットアップ忘備録 8 - WiFiをスリープさせない

Raspberry PiのiMacを利用したセットアップ忘備録です。

1.  [初期設定](http://qiita.com/PonDad/items/bfb1cc6ddc18ccf08208) 
2. [無線LANと接続](http://qiita.com/PonDad/items/c0f559962d4108774424) 
3. [SFTPと接続](http://qiita.com/PonDad/items/516e0ef5295f47228a5c) 
4. [USBスピーカーと接続](http://qiita.com/PonDad/items/80fb3abebb5adaa7888d)
5. [USBマイクと接続](http://qiita.com/PonDad/items/565f816dc1ebcbe2467e) 
6. [VNCでリモートデスクトップ](http://qiita.com/PonDad/items/232f1aacbef2c4fcb746) 
7. [GPIO接続の小型モニタ取付](http://qiita.com/PonDad/items/6d58b8a58e7ff11ae9cd)　
8. [WiFiをスリープさせない](http://qiita.com/PonDad/items/e0db8e74a34e484533f8)<<

## 環境

- Raspberry Pi2 ModelB （raspbian-Jessie・Node.js v4.2.4）
- PLANEX 無線LAN子機 (USBアダプター型) GW-USNANO2A (FFP)

## WiFiが自動的に切れる

HubotとSlackを導入し外部デバイスから更新しようとしても30分程で接続出来なくなります。（Hubotの表示は「online」になっているのですが）

そこで以下対応を実施しました。

Hubotをデーモンプロセスで実行。

参考：[RaspberryPi上でhubotが自動起動するように設定する - Qiita](http://qiita.com/KeitaMoromizato/items/d9130b3f6c04292c129d)

WiFiのパワーマネージメントをオフに。

参考：[Raspberry PI 2 を WiFi で運用する - すらりん日記](http://blog.techlab-xe.net/archives/3540)

上記サイトを参考に実施してみましたが、WiFi接続がやはり途切れます。

## Cronを利用する

参考：[Raspberry Pi 2で遊ぶ：無線LAN番外編 - COZY ATTIC](https://cozyattic.wordpress.com/2015/12/11/raspberry-pi-2%E3%81%A7%E9%81%8A%E3%81%B6%EF%BC%9A%E7%84%A1%E7%B7%9Alan%E7%95%AA%E5%A4%96%E7%B7%A8/)

Raspberry PiのJessieでは

`/etc/ifplugd/action.d/action_wpa`

このディレクトリのスクリプトを実行するとWiFi再接続を行うことが出来る様です。

![Raspberry Pi 2016-03-31 21-30-23.png](https://qiita-image-store.s3.amazonaws.com/0/47128/fb1d0991-b8c1-c10e-f85d-e24309485574.png)

Cronを利用してpingを入力して、反応がない場合はこのスクリプトを実行。という処理をする事でWiFiが切れずに接続できる様になります。

上記サイトを参考にして以下の通り実行。

```bash:ssh
$ sudo vim wifi.sh 
#!/bin/sh
ping -c 1 192.168.0.11 test $? -eq 1 && sudo /etc/ifplugd/action.d/action_wpa wlan0 up

```

`home`ディレクトリ直下に`wifi.sh`ファイルを作ります。

`ping`コマンドを打って反応がなければ`action_wpa`スクリプトを実行します。

```bash:ssh
$ sudo crontab -e

*/10 * * * * sh ~pi/wifi.sh

```
crontabを利用して1０分おきに上記の`wifi.sh`を実行します。

![IMG_8225.jpg 2016-03-31 21-45-29.png](https://qiita-image-store.s3.amazonaws.com/0/47128/41933e5f-3d4d-4436-c604-f6dd5c6ce71f.png)

これで昼休みもRaspberry Piと戯れることが出来る様になりました。
Sql Loader CSVで最終列が空白だと列が見つかりません旨のエラーが出る。

Sql Loaderで読み込みをしたところ最終列が空白の行の場合に、列が見つかりませんでしたというエラーが出た。
環境：Oracle 11g
※環境が手元にないのでコードは未テストです。

#エラーの内容
以下のようなCSVをSQL Loaderにて取り込むと下記のエラーが出る。

3行目の4列目は空文字

``` sample.csv
列A,列B,列C,列D
A1,B1,C1,D1
A2,B2,C2,D2
A3,B3,C3,
```

テーブルの定義

```
sampleTable
列A 列B 列C 列D

```

「拒否されました。- 表テーブル名,列列Dでエラーが発生しました。
論理レコードが終了する前に列が見つかりませんでした。(TRAILING NULLCOLSを使用)」

#原因
CSVのデータを読み取りそれをテーブルの列にマッピングしているらしい。

上記のエラーはつまり列Dに対応するCSVのデータが見つからなかったということを言っている。

#解決法
TRAILING NULLCOLSとNVLを使うことで列として認識させることができた。CTLファイルは下記のような感じ。


```sample.CTL
省略 
FIELDS TERMINATED BY "," TRAILING NULLCOLS
(
 列A "NVL(:列A, ' ')"
,列B "NVL(:列B, ' ')"
,列C "NVL(:列C, ' ')"
,列D "NVL(:列D, ' ')"
)
```

TRAILING NULLCOLSで空文字の列でもNULLの値が読み取られるようになり、NULLがNVLで' 'に変わるという仕組みになっている。
Windowsデベロッパーセンターでアプリ名の予約が重複できない鬼仕様

Windowsデベロッパーセンターで新しいアプリの名称を予約できるようです。
アプリ名を予約して開発のモチベーションあがりますよね。
しかも、まだWindowsはストアにアプリが全然無いのでユニークな名前抑え放題！

でもこれ、パッケージ名ではなくアプリ名です。
しかも、予約できる個数に制限はなさそう？

![image](https://qiita-image-store.s3.amazonaws.com/0/16612/46264d36-84ae-6129-3490-3141ec8f5451.png)

こんな感じに有名ドコロのサービスの名前を先に抑えてしまうと1年間は無効にならないようです。
（この後キャンセルを押してます）

一応、法的権利がある名前が使えない時にはマイクロソフトへ問い合わせろって[書いてあります](https://msdn.microsoft.com/ja-jp/library/windows/apps/jj657967.aspx)が、
いろいろとめんどくさそう
もしスパイウェア的なのを仕込まれたらWindows10が流行りだした頃に問題になりそうな？

これはもしかしてマイクロソフトから早くデベロッパー登録しろとの無言の圧力か？
AppIndexingのGoogleクローラについて

## ある日見つけた不思議なアクセスログ
アプリの運用において、アクティブでないユーザーというのは悩みの種でして日々アクセスログなど眺めつつ改善につなげています。そうした調査の中で、それほど数は多くないのですが、アプリをインストールしてすぐに利用を停止するユーザーの集団を発見しました。調査してみたところ、Androidアプリ向けに作っていたAPIを叩く `AdsBot-Google-Mobile-Apps` というUser-Agentのアクセスのみで構成されていたため、これはなんぞやと調べた次第です。

## AppIndexingとGoogle Crawler
結論として、このアクセスはAppIndexingを有効にしたAndroidアプリに対してGoogleのBotがクロールした結果発生するものだとわかりました。
AppIndexingとは、公式ページから引用させてもらうと、

> App Indexing を使うと、Google 検索であなたのアプリがヒットしやすくなります。 アプリにインデックスを付けると、モバイル端末ユーザーがアプリに関連するコンテンツを検索したとき、Android アプリのインストール ボタンが検索結果に表示されます。 そのため、アプリのインストール数の増加につながります。

という機能で、Webページ側にlink要素などでアプリ側のディープリンクを記載し、アプリ側でディープリンクに対応する挙動を用意しておくと、Google検索の結果にアプリのインストール導線が置かれ、Google検索からシームレスにアプリ内のコンテンツにたどり着くものです。
このAppIndexingを実現するにあたって当然Google側はクローリングしており、アクセスログから察するに、AppIndexingを担当するクローラは下記の用に振る舞うようです。

1. 通常通りWebページをクロールする
2. クロールした結果、AppIndexingの設定を見つけたら、`AdsBot-Google-Mobile-Apps` のクローラが起動。Androidのエミュレータをコンテナ上で動かすような仕組みだと推察。
3. 2.のBotは、アプリのパッケージをダウンロードし、1度だけ起動、AppIndexingのレギュレーションを満たしているか確認する。
4. 問題なければAppIndexing対応ページとしてインデックスする。

上記の結果、クロールのたびにエミュレータがアプリをダウンロード=>起動まで実施、完了後アンインストールする or コンテナごと破棄する、ようなアクセスが観測されます。

## 我々はどう考えるべきか
ベースのアプリのインストール数によっては、このBotによるアクセスログが意思決定を曲げうる数にもなるのではないかなと思った次第です。
アクセスログに乗っかってくるユーザーにこうしたBotが含まれてしまうとそれらを「一日で死ぬユーザー」としてカウントしてしまうため、施策がよかった、悪かったの判断を誤りかねないのではないかと。
Webページの運用においてはGoogleAnalyticsなどBotのアクセスをよしなに扱ってくれますが、これからはNativeアプリもBotのアクセスを気にする時代なのかもしれません。

## 参考
- AppIndexing https://developers.google.com/app-indexing/?hl=ja
- GoogleのCrawlerのUser-Agent https://support.google.com/webmasters/answer/1061943?hl=en
Swift覚書02 頻度低

自分用の覚え書きです。
Swift1.x混ざってるかも。

### 背景を敷き詰める
```
let collectionViewBg:UIImage = UIImage(named: "bg.png")!
self.view.backgroundColor = UIColor(patternImage: collectionViewBg)
```

### アニメーション基本構文
```
UIView.animateWithDuration(
    0.4,
    delay: 0.4,
    options: UIViewAnimationOptions.CurveEaseOut,
    animations: {
        //
    },
    completion:{
        (value: Bool) in

    }
)
```

### UIViewのhitTest
```
 override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {

        let rv:UIView? = super.hitTest(point , withEvent: event)
        return rv == self ? nil : rv

    }
```
### NSDate
NSDateFormatterマジ便利。 曜日をとる場合はカレンダークラスで。
### NSDateから文字列
```
let dateFormatter = NSDateFormatter() // フォーマットの取得
dateFormatter.locale = NSLocale(localeIdentifier: "ja_JP")  // JPロケール
dateFormatter.dateFormat = "yyyy/MM/dd HH:mm:ss" // フォーマットの指定
print(dateFormatter.stringFromDate( NSDate() ) )
```

#### 文字列からNSDate
```
var date_string: String = "2014-12-01 10:00:00"
var date_formatter: NSDateFormatter = NSDateFormatter()
date_formatter.locale     = NSLocale(localeIdentifier: "ja")
date_formatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
date_formatter.dateFromString( date_string )
```
Swift覚え書き

自分用の覚え書きです。
Swift1.x混ざってるかも。

### AppDelegateをインスタンス化
```
private let myApp:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
```

### Segueを使わず、コードで遷移
```
let userRegistViewController:UserRegistViewController = self.storyboard!.instantiateViewControllerWithIdentifier("UserRegistView") as! UserRegistViewController
self.presentViewController( userRegistViewController, animated: false, completion: nil)
Segueで遷移時に値の受け渡し方

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "SegueIdx") {
        let controller:SecondViewController = segue.destinationViewController as! SecondViewController
            // controller.idx = 1
        }
    }
```

### StoryBoad上でカスタムUIの反映
IBDesignablでカスタムクラスを作ってStoryBoadに適用する
#### 例えば角丸ボタンができる
```
import UIKit

@IBDesignable

class RadiusUIButton: UIButton {

    @IBInspectable var textColor: UIColor?

    @IBInspectable var cornerRadius: CGFloat = 0 {
        didSet {
            layer.cornerRadius = cornerRadius
        }
    }

    @IBInspectable var borderWidth: CGFloat = 0 {
        didSet {
            layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var borderColor: UIColor = UIColor.clearColor() {
        didSet {
            layer.borderColor = borderColor.CGColor
        }
    }

}
```

### Bridge-Header Sample
```
#ifndef catalogApp_Bridging_Header_h
#define catalogApp_Bridging_Header_h

//#import "AFNetworking.h"
//#import "AFNetworkActivityLogger.h"

#import "MWFeedParser.h"
#import "SVProgressHUD.h"
#import "sqlite3.h"

#import <GoogleMobileAds/GoogleMobileAds.h>
//#import "GADBannerView.h"
//#import "GADInterstitial.h"

//#import <GoogleAnalytics-iOS-SDK/GAI.h>
//#import <GoogleAnalytics-iOS-SDK/GAIFields.h>
//#import <GoogleAnalytics-iOS-SDK/GAILogger.h>
//#import <GoogleAnalytics-iOS-SDK/GAIDictionaryBuilder.h>
#endif
```
- BuildSettings > Objective-C Bridge Header
- appName/Bridge-Header.h

### ステータスバーの色
info.plistに以下２つのkeyとvalueを追加する
```
View controller-based status bar appearance
```
- NO : アプリ全体で設定
- YES : ViewControllerごとに設定

```
Status bar style
```
- Gray style (default) : 文字色が黒になる
- Transparent black style (alpha of 0.5) : 文字色が白になる(iOS7以降では非対応)
- Opaque black style : 文字色が白になる(iOS7以降では非対応)
- UIStatusBarStyleLightContent : 文字色が白くなる(iOS7以降)

### 汎用アラート
```
func showAlert( title:String = "title", text:String = "text") {

    let alert = UIAlertController(title: title, message: text, preferredStyle: UIAlertControllerStyle.Alert)

    alert.addAction( UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: {
        (alert: UIAlertAction!) in

    })
    )

    self.presentViewController(alert, animated: true, completion: nil)
}
```

### GCD便利用
```
dispatch_async_global {

    // サブスレッド

    self.dispatch_async_main {

        // メインスレッド

    }
}

func dispatch_async_main(block: () -> ()) {
    dispatch_async(dispatch_get_main_queue(), block)
}

func dispatch_async_global(block: () -> ()) {
       dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block)
}
```
Carthageのcacheを実現して、CircleCIを10分早くする！

## Why
iOSのビルド＆テストにCircleCIを使用していますが、毎回`carthage bootstrap`をしていると、それだけでも10分くらい食います。CIが遅いと不便なので、このボトルネックを解消しようと思いました。

## 実装方法

### Carthageを更新するべき時だけ更新する

`Cartfile.resolved`に変更があった場合だけ、`carthage bootstrap`を走らせます。


```bash:script/install
#!/bin/bash

bundle install --path=vendor/bundle

if ! diff Cartfile.resolved Carthage/Cartfile.resolved &>/dev/null; then
  carthage bootstrap
  cp Cartfile.resolved Carthage
fi

```

`Cartfile.resolved`に変更があったかどうかを知るために、git管理外で`Carthage/Cartfile.resolved`を保持しておきます。

```:.gitignore
# Carthage
Carthage/Checkouts
Carthage/Build
Carthage/Cartfile.resolved

```

### CircleCIの設定
用意したscriptを使います。
また、`cache_directories`でCarthageを持っておくのがポイントです。

```yml:circle.yml
dependencies:
  override:
    - . script/install
  cache_directories:
    - "Carthage"
```

## 参考
ほぼこれに近いです
https://robots.thoughtbot.com/caching-carthage-con-circleci
Gradleでbowerを利用したフロントエンドのビルドまでを行う方法  (4/6)

# はじめに

Java/SparkプロジェクトのGradleを利用したビルド/デプロイについて、私が試したことをまとめたものです。
(ここで言う`Spark`は、分散処理ライブラリの`Apache Spark`ではなく、JavaのSinatraライクなMicroframeworkの`Spark`のことです)

## 目次

1. [Hello Worldアプリ](http://qiita.com/kaakaa_hoe/items/0e3c622ae8bde3d116ad)
2. [jadeテンプレートエンジン](http://qiita.com/kaakaa_hoe/items/6d4311e250df89f836b9)
3. [Grunt/bowerによるWebパッケージのビルド](http://qiita.com/kaakaa_hoe/items/61b326dcc5d7f161ff28)
4. **付録A. TravisCIによるビルド**
5. [付録B. Gradleでdocker build](http://qiita.com/kaakaa_hoe/items/18e5f3047931ee886acb)
6. [付録C. TravisCIからDockerHubへ docker push](http://qiita.com/kaakaa_hoe/items/87221df2dfe6b894b2b7)


各章でのソースコードは [Commits · kaakaa/gradle-frontend-boilerplate](https://github.com/kaakaa/gradle-frontend-boilerplate/commits/master) から確認できます。

## 環境

* Java 1.8.0_74
* Gradle 2.12
* spark-core 2.3
* spark-template-jade 2.3
* node.js 4.4.0


# 付録A. TravisCIによるビルド

## 概要

GithubへのPushを契機に[Travis CI](https://travis-ci.org/)でビルドを実行し、実行バイナリのzip/tarファイルをGithubページへリリースする。

## 準備

下記を実施しておく。

* TravisCIのアカウントを作成する
  * Githubのアカウントでサインインできる
* [Profile](https://travis-ci.org/profile/)ページから、ビルドを実行するリポジトリを選択しておく
* [travis-ci/travis.rb](https://github.com/travis-ci/travis.rb#readme)をインストールする(要Ruby環境)
  * 無くても`.travis.yml`を書けば良いのですが、Githubの認証情報などの秘密情報を暗号化するのが楽になります

## ビルドスクリプト

プロジェクトのルートで下記`travis`コマンドを実行し、`.travis.yml`というTravis CIのビルド設定ファイルを作成する。  

```
> travis init
> travis setup releases
```

対話的にプロジェクトの情報を入力していくだけで、`.travis.yml`がほぼできあがります。
(自分で`.travis.yml`を書いても問題無いです)


```yaml:.travis.yml
language: java  // (1) - Javaビルドの設定
jdk:
- oraclejdk8
script: "./gradlew build"  // (2) - ビルドコマンド
deploy:  // (3) - デプロイ設定
  provider: releases
  api_key:
    secure: ${GITHUB_TOKEN}
  file:  // (4) - GithubのReleaseページにPushするファイル
    - "./build/distributions/gradle-frontend-boilerplate-1.0-SNAPSHOT.tar"
    - "./build/distributions/gradle-frontend-boilerplate-1.0-SNAPSHOT.zip"
  on:
    repo: kaakaa/gradle-frontend-boilerplate
    tags: true  // (5) - tag付きのコミットのみデプロイが行われるようにする
```

### (1) Javaビルドの設定

`travis init`コマンドでJavaプロジェクトを選択すると、このように生成される。
デフォルトではJavaのバーージョンにJDK6,7が指定されているので`oraclejdk8`にしておく。  

### (2) ビルドコマンド

Travisで実行するビルドタスク指定する。

### (3) デプロイ設定

`travis setup releases`コマンドで作成される。  

### (4) GithubのReleaseページにPushするファイル

ここで指定したファイルが、Githubのリリースページにダウンロードできる形で公開される。
今回は、`gradle assembleDist`の成果物であるzip/tarファイルがリリースされるようにした。  

### (5) tag付きのコミットのみデプロイが行われるようにする

Pushするたびにリリースされるのも辛いので、タグ付きコミットのみデプロイが行われるようにする
middlemanのexternal_pipelineを使ってみる


アセットパイプラインがv4で削除されたので、jsのbuildはbrowserifyにお願いしてみる。
config.rb に以下のように追記をした。

```ruby
activate :external_pipeline,
  name: :browserify,
  command: build? ? "npm run build":"npm run watch",
  source: "./.tmp/"

```

`bundle exec middleman build`した際には、`npm run build`が実行され、
それ以外の`bundle exec middleman server`とかでは最初に`npm run watch`が実行される。

`name`は適当。

`source`で指定したディレクトリ以下が、buildした際のルートディレクトリに追加される。

なので、package.jsonで

```json
  "scripts": {
    "build": "browserify js-source/main.js > ./.tmp/javascripts/all.js",
    "watch": "watch 'npm run build' js-source/ -du"
  }

```

みたいな感じで.tmp/以下にjsをビルドさせた。そうすると、

http://localhost:4567/javascripts/all.js

にマッピングしてくれる。（sourceディレクトリ内のjavascripts/ は消しておいた）

コード書いてる時は`npm run watch`がjsを監視・ビルドして、吐き出されたファイルをmiddleman-livereloadが監視してブラウザreloadっていう感じになった。

そのせいかreloadが数回走ったり、遅かったりするけど、なんとか使えてる。

---

ドキュメントなさすぎで、以下の設定画面が一番役に立ったかも。

http://localhost:4567/__middleman/config/

external_pipelineの定義を見てみる

## :external_pipeline

### :command = "npm run watch"
The command to initialize

###:disable_background_execution = false
Don't run the command in a separate background thread

###:latency = 0.25
Latency between refreshes of source

###:name = :browserify
The name of the pipeline

###:source = "./.tmp/"
Path to merge into sitemap
アジャイルソフトウェア開発の奥義 第2章を読む

# エクストリームプログラミングの概要

輪読しているので自分の担当章をqiitaにまとめてみます。

# エクストリームプログラミングの実践

- XPは以下に示す複数のシンプルなプラクティスから構成される
- プラクティスが相互作用し、単なる集合以上のものとなっている

## チームメンバーとしての顧客

- 顧客と開発者は親密に仕事をするのが良い
 - チームの一員であり身近な存在
- 顧客とは？
 - 仕様の定義とその優先順位の決定権を持つ個人またはグループ

## ユーザーストーリー

- 計画を練るには仕様要求の概略をある程度知っておく必要があるが詳しく把握する必要はない
 - 作業量を見積もれる情報があれば十分
- 仕様要求の詳細はプロジェクトが進むにつれて変わるものである
- 顧客と話し合うことで「仕様要求の概略」をつかむが、「仕様要求の詳細」を詰めることはしない

## 短期間のリリースサイクル

- 動くソフトウェアを2週間間隔でリリースしていく

### イテレーションプラン

- イテレーションごとに小さな機能をいくつか実装していく
- 開発者が作成した見積もりをベースに顧客が複数のユーザーストーリーを選ぶ
- 開発者は前回のイテレーションを参考に次回のイテレーションの仕事量を見積もる
- 顧客はその範囲を超えない範囲でストーリーを選択する
- イテレーションがスタートしたらストーリーや作業の優先順位の変更はしない
- 開発者は自由にストーリーをタスクに分解し、合理的な順序で実装していく

### リリースプラン

- 6回分程度のイテレーションを1つにまとめたプランのことである
 - およそ3ヶ月単位
- イテレーションプラン同様に前回のリリースでこなした仕事量を参考に次回のリリースでの仕事量を見積もる
- リリースの内容は不変不動のものではなく、顧客はいつでも内容を変更できる

## 受け入れテスト

- ストーリーの受け入れテストは実装直前か実装と並行して作られる
- 自動的に繰り返し実行できるようにスクリプト言語で書かれる
- 自動的に繰り返し行うことでシステムが顧客の要求通りに動くかをチェックできる

## ペアプログラミング

- 納品するコードはすべてペアを組んだプログラマが実装する
- 2人は役割を頻繁に交代できる
- ペアそのものも、少なくとも1日に1回組み替える
 - イテレーションの間にチームの全員が他のメンバーとペア組み、作業内容のほぼすべてに関わることになる
- ペアを組み替えていくことでチーム内に知識が広まる

## テストファーストの開発

- 納品するコードにはすべて、失敗するユニットテストをパスさせる目的で書かれる。
 - テストする機能が組み込まれていないユニットテストを書いておく
 - 次にそのテストをパスさせるためのコードを記述する
- これを繰り返すことでテストケースがコードともに形成されることになる
- 個別にテストできるようにモジュールに分割されたコードは独立性（分離性）が高いものになる

## 共同所有権

- 共同作業をしているペアにはどんなモジュールでもチェックし、かつ、それを改善する権利がある
- しかし個人がモジュールや技術に対して責任を負うことはない
- 最終的にチームの誰もが技術を等しく共有することになる
- とはいえ、XPは専門家の必要性を否定しているわけではない

## 継続的なインテグレーション（統合）

- プログラマは担当しているコードを1日に数回システムにチェックインしながら作業を進める
 - 先にチェックインした人が勝ちで、他の人はそれをマージする
- XPチームはソースコードコントロールをブロッキングしない

## 持続可能なペース

- ソフトウェアプロジェクトは短距離競走ではなくマラソン
- 全力疾走するチームはゴール前に燃え尽きてしまう
- 素早くフィニッシュするには持続可能なペースで走り、活力と集中力を維持しなければならない
- XPのルールでは残業は許されない
 - ただしリリース最後の週は例外

## オープンワークスペース

- チームはオープンな部屋でともに作業する
- 各ペアは他のペアの会話も聞こえる程度の距離にいて、別のペアが困っているときには気づけるようになっている
- 気が散るかもしれない、と心配するかもしれないが事実は逆である
 - ミシガン大学の研究でこういう環境では効率が2倍になるという結果が示された

## 計画ゲーム

- 本質はビジネス側と開発側の責任の切り分けにある
- ビジネス側（つまり顧客）は各機能のビジネス的な重要度（価値）を決定
- 開発者側はその機能を組み込むために必要なコストを見積もる
- 直前のイテレーションの完了にかかった期間を参考に、開発者は顧客に見積もりを提示する
- 顧客はその見積もりを超えないように調整しながら、組み込むたいストーリーを選択する
- こういったシンプルなルールを採用しリリースを頻繁にすると顧客と開発者はプロジェクトのリズムに適用できる
 - そうすることでプロジェクトにかかる時間と費用を割り出すことができる

## シンプルな設計

- 現在のイテレーションで計画しているストーリーにだけ焦点を絞り、将来組み込むことになるかもしれないストーリーについてあれこれ心配しない
- イテレーションごとにシステム設計を現行のストーリーの処理に最適な設計に変えていく
- 開発チームがまずすることは、最初に与えられたストーリーの一群を考えられる限り最もシンプルな方法で正常に動作させることである
- 3つのXPスローガン
 - 何とか動くだけの最もシンプルなものを考えよう
 - あとで必要になんてならないよ
 - 同じことは2度しない

## リファクタリング

- コードは劣化するものであるので、頻繁にリファクタリングをすることで劣化を防ぐ

## メタファー

- メタファーはジグソーパズルの絵の役割を果たす
 - ピースの形のみでパズルを完成させることはできるが難しい
 - パズルの絵の全体像そのもが見えていればパズル解決はずっと楽になる
- メタファーはシステム全体をつなぐ大きな絵柄である
 - 個々のモジュールの位置や形状を明らかにするシステムのビジョンと言える
ちょっと使えるかも（？）しれない、正規表現

## 箇条書きのテキストを用意

Java で Getter と Setter を作るのは Eclipse に任せてしまえば良いのですが、
例えば、下記のように「変数名みたいな文字」をリストしてみる。

```
hoge
fuga
abc
xyz
```

## 正規表現を実行！

vi で下記のコマンドを実行する

```:vim
:%s/^.\+$/    private String &;\r\r    public String get&() {\r        return &;\r    }\r\r    public void set&(String &) {\r        this.& = &;\r    }\r/g
```


## こうなりました。

すると、どうでしょう？
下記のようなテキストに早変わり。。

```:java
    private String hoge;

    public String gethoge() {
        return hoge;
    }

    public void sethoge(String hoge) {
        this.hoge = hoge;
    }

    private String fuga;

    public String getfuga() {
        return fuga;
    }

    public void setfuga(String fuga) {
        this.fuga = fuga;
    }

    private String abc;

    public String getabc() {
        return abc;
    }

    public void setabc(String abc) {
        this.abc = abc;
    }

    private String xyz;

    public String getxyz() {
        return xyz;
    }

    public void setxyz(String xyz) {
        this.xyz = xyz;
    }
```


## 最後に

ただ、get と set の後に続く文字がキャメルケースになってません。
（もう少し頑張ればなんとかなるかも？）

特に難しい正規表現は使ってませんが、応用すれば、いろいろ使えるかもしれません。


＃共有まで。
TerminalからXcodeのプロジェクトをAppCodeで開く


## 環境
- AppCode 3.3.3

## セットアップ

1. AppCodeを起動させて、メニューバーから　```Tools > Create Command Line Launcher...```を選択する。

2. Script名とPathを指定する。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/25250/d15aaf5f-55a2-dd0b-59cb-77b15b8dfe88.png "01.png")


デフォルトでは、```Name```には"appcode"、```Path```には"/usr/local/bin"が入っています。
今回は```Name```を"ap"としてみました。名前の衝突が起こらない様に気をつけてください。

これで、指定したPathのディレクトリにPythonで記述された実行ファイルが生成され、準備ができました。

## 使い方
   
![appcode.gif](https://qiita-image-store.s3.amazonaws.com/0/25250/500d1297-bea5-b184-e3a1-54b2ddd0e796.gif "appcode.gif")

```
ap --help
Usage:
  /usr/local/bin/ap -h |-? | --help
  /usr/local/bin/ap [-l|--line line] file[:line]
  /usr/local/bin/ap diff <left> <right>  /usr/local/bin/ap merge <local> <remote> [base] <merged>
```

```.xcodeproj``` を引数として、プロジェクトを開く事もできますし、任意のファイルの行数を指定して開く事や、diffも確認できます。

## まとめ
プロジェクトのリポジトリをghqで管理していて、Terminalを常用する場合には、案外便利なのではないでしょうか。

## 謝辞
- [Working with AppCode Features from Command Line](https://www.jetbrains.com/help/objc/2016.1/working-with-appcode-features-from-command-line.html?origin=old_help)
- [Open a Xcode project with AppCode from the command line.mp4 - youtube](https://www.youtube.com/watch?v=aBG_TysasP4)
知られざるMonoDevelopの神機能


## はじめに
### この記事で使用している環境
 - OSはMac OS X Yosemite
 - MonoDevelopのバージョンは **5.9.6**
 
MonoDevelopのバージョンは、メニューの MonoDevelop-Unity -> About MonoDevelop-Unityで確認できます。
Unity5系の最新版に同梱されているもの。
(事情があって古いUnityをお使いの方も、MonoDevelopのみ最新を使うという事も可能ですので、ぜひお試しを。)

## Source解析
メニューの MonoDevelop-Unity -> Prefarences... で環境設定画面をたちあげ。
Text Editor -> Source Analysis と進み、
Enable source analysis of open files にチェックを入れる。

エディター右側にバーが表示され、改善の提案箇所が表示されます。
この機能をONにするだけですぐに役立つのが、***不要な記述の指摘***でしょう。

不要なusing, 記述などを色分けして視覚的に教えてくれます。
![スクリーンショット 2016-03-31 午後7.39.26.png](https://qiita-image-store.s3.amazonaws.com/0/74817/32047e9b-b53d-4ec8-734c-b8dabb3e146b.png "スクリーンショット 2016-03-31 午後7.39.26.png")

![スクリーンショット 2016-03-31 午後8.15.24.png](https://qiita-image-store.s3.amazonaws.com/0/74817/edadf685-1a25-fc19-4246-18074a2d5561.png "スクリーンショット 2016-03-31 午後8.15.24.png")
省略できる箇所の色が薄くなっているのが分かりますね。

個人的にイチオシの機能。何に提案を出してくれるかは、Source AnalysisのC#設定で変更可能です。


## Quick Fix
**Alt + Enter** または、
キャレットの下に表示される小さい矩形をクリック。
![スクリーンショット_2016-03-31_午後7_43_28.png](https://qiita-image-store.s3.amazonaws.com/0/74817/a65c0e1e-e2d0-ce75-98ba-f887fbb80ee0.png "スクリーンショット_2016-03-31_午後7_43_28.png")


usingのソート、コードの整形や、for文の書き換えなどが出来ます。実行する箇所によって、選択肢が変わります。
![スクリーンショット 2016-03-31 午後7.03.03.png](https://qiita-image-store.s3.amazonaws.com/0/74817/9c429898-0c9b-e172-f609-4411392fb149.png "スクリーンショット 2016-03-31 午後7.03.03.png")
![スクリーンショット 2016-03-31 午後7.41.46.png](https://qiita-image-store.s3.amazonaws.com/0/74817/994e037b-7e1a-a7dc-530b-142c6f818291.png "スクリーンショット 2016-03-31 午後7.41.46.png")

getter, setterを生成したり
![スクリーンショット 2016-03-31 午後7.57.40.png](https://qiita-image-store.s3.amazonaws.com/0/74817/c43b8d0b-7072-a56a-fea7-37faedbb7614.png "スクリーンショット 2016-03-31 午後7.57.40.png")

## git連携
(手元に良いサンプルが無かったので、Unity-jpが公開しているAssetGraphのソースを例に使わせて頂きます。)

View -> Solution にチェックが入っているのを確認。
画面下部 Source, Changes, Blame, Log, Merge というボタンがあるはず。
それぞれボタン押下で表示が変わり、

- Changes は自分が変更した箇所
![スクリーンショット 2016-03-31 午後7.38.44.png](https://qiita-image-store.s3.amazonaws.com/0/74817/b56b208d-e910-e774-3655-0669248904e7.png "スクリーンショット 2016-03-31 午後7.38.44.png")



- Blameは行ごとに最後に変更した人と日時、リビジョン
![スクリーンショット 2016-03-31 午後7.37.06.png](https://qiita-image-store.s3.amazonaws.com/0/74817/553bc4c3-319a-7cec-c049-2795a346324d.png "スクリーンショット 2016-03-31 午後7.37.06.png")



- Logはそのファイルの変更履歴
![スクリーンショット 2016-03-31 午後7.38.14.png](https://qiita-image-store.s3.amazonaws.com/0/74817/9b60c08f-87c7-794c-dc17-93fad950aaac.png "スクリーンショット 2016-03-31 午後7.38.14.png")


- Merge (この機能だけ把握しておらず)



## その他
 - タブをドラッグ＆ドロップして2画面表示
![スクリーンショット 2016-03-31 午後7.58.59.png](https://qiita-image-store.s3.amazonaws.com/0/74817/af060fdb-836f-1924-8852-b65f0e12aab1.png "スクリーンショット 2016-03-31 午後7.58.59.png")

 - 矩形選択
 Altを押しながらドラッグすると、コードの矩形選択が可能です。
 (これはMonoDevelopの機能というより、Macのテキストエディター全般にある機能のようです)
 ![スクリーンショット 2016-03-31 午後8.01.40.png](https://qiita-image-store.s3.amazonaws.com/0/74817/57336330-2a19-711f-5fcb-3819795b8257.png "スクリーンショット 2016-03-31 午後8.01.40.png")
 

 - 他
コードテンプレートなどを入れるのも良さそうですね。

CodeTemplateでMonoBehaviourのOn****系コールバックも入力補完しよう - テラシュールブログ http://tsubakit1.hateblo.jp/entry/20130518/1368877171

他に便利な機能があれば是非教えて下さい！
c++ builder XE4, 10.2 Tokyo > fileIO > 最下層フォルダ名を取得する実装

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/09)
```

`AAA\\BBB\\CCC\\DDD`というフォルダ文字列から`DDD`を取得する。

```Unit1.cpp
String getDeepestDir(String srcstr)
{
	// [AAA\\BBB\\CCC\\DDD]から[DDD]を取得する

	std::unique_ptr<TStringList> list(new TStringList);

	list->StrictDelimiter = true;
	list->Delimiter = L'\\';
	list->DelimitedText = srcstr;

	return list->Strings[list->Count - 1];
}
```

ビルトイン関数がないのだろうか。

### code v0.2

上記の場合srcstrの文字列の最後が`\\`のようになっていたらL""が戻ってしまう。
ExcludeTrailingPathDelimiter()を使う以下のようにした。

```Unit1.cpp
String getDeepestDir(String srcstr)
{
	// [AAA\\BBB\\CCC\\DDD]から[DDD]を取得する

	std::unique_ptr<TStringList> list(new TStringList);

	list->StrictDelimiter = true;
	list->Delimiter = L'\\';
	list->DelimitedText = ExcludeTrailingPathDelimiter(srcstr);

	return list->Strings[list->Count - 1];
}
```

Countが0の時のエラー処理などは実装していない。
コマンドメモ



ファイル名が"*.txt"を満たすファイルに対して、
"aaa"を含む行があるかどうかを探す。
条件に合致する行があった場合、ファイル名と該当行を表示する。

```
find . -type f -name "*.txt" -exec grep aaa {} \; -print
```


サイズの大きいディレクトリトップ20

```
du -k  | sort -n | tail -20
```

MacでJavaホームを変更する

```
export JAVA_HOME=`/usr/libexec/java_home -v 1.8.0`
```
タブレットはダイアログ、スマートフォンは全画面でActivityを表示する

Activityをスマートフォンは全画面で、タブレットはダイアログっぽくしたいときのTips
fullscreen dialogというらしい

Themeに```DialogWhenLarge```がついたものを使う。

スマートフォンのとき
<img width="400" alt="スマートフォン" src="https://qiita-image-store.s3.amazonaws.com/0/34084/001a5bea-4321-58b9-ebc9-edf75fd87e18.png">

タブレットのとき
<img width="500" alt="タブレット" src="https://qiita-image-store.s3.amazonaws.com/0/34084/dcc538d8-a002-c4f3-6dfe-51dc8854606f.png">

そのままだと外の半透明なところをタップしたときにActivityが終了してしまうので
終了しないようにするにはThemeを継承して```android:windowCloseOnTouchOutside```を追加する。

例

```xml
<style name="DialogWhenLargeNotCloseOnTouchOutside" parent="Theme.AppCompat.DialogWhenLarge">
        <item name="android:windowCloseOnTouchOutside">false</item>
</style>
```
テーブルのinsert/updateログをtriggerで簡単実装する

テーブルに対する登録/更新処理のログをトリガーを使って残そうと思います。
でも「どのカラムの値を残そうかなぁ」とか考えるのが面倒なので、
完全なコピーのログをとろうと思います。
これをかんたんに実装するコードです。

```php
	//サンプルテーブル sample_user をつくる
	$db->query('DROP TABLE IF EXISTS sample_user');
	$db->query('
	CREATE TABLE `sample_user` (
	  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
	  `name` VARCHAR(255) NOT NULL,
	  `email` VARCHAR(255) NOT NULL,
	  `created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
	  PRIMARY KEY(id)	
	) ENGINE=MyISAM;
	');

	//ログ用テーブル _sample_user を sample_user から簡単につくる
	$db->query('DROP TABLE IF EXISTS _sample_user');
	//こうすると primary key や unique 属性を排除してテーブル生成できる
	$db->query('CREATE TABLE _sample_user as SELECT * FROM sample_user LIMIT 0');
	//更新日を記録するカラムを追加する
	$db->query('ALTER TABLE _sample_user ADD _created TIMESTAMP NOT NULL');

	//INSERT, UPDATE時に、_sample_tableへの挿入処理を行う
	$db->query("DROP TRIGGER IF EXISTS insert_sample_user");
	$db->query("DROP TRIGGER IF EXISTS update_sample_user");
	$query1 = "CREATE TRIGGER insert_sample_user AFTER INSERT ON sample_user ";
	$query2 = "CREATE TRIGGER update_sample_user AFTER UPDATE ON sample_user ";
	$query3 = "FOR EACH ROW 
		   BEGIN
		      INSERT IGNORE INTO _sample_user (SELECT *, NOW() FROM sample_user WHERE id = NEW.id);
		   END;";
	$db->query($query1 . $query3);
	$db->query($query2 . $query3);
```

これで、insert/updateのたびに完全なコピーログを、日付つきで残していくことができます。
dp↔px変換サンプルコード


そのものずばりのサンプルコードがQiita上にはないようだったのと、詳しい記事ばかりでさくっとサンプルが欲しかったので。

dpの説明は詳しい記事があるのでそちらをどうぞ。
[【Android】いまさら聞けないdp入門](http://qiita.com/nein37/items/0a92556a80c6c14503b2)
[Y.A.M の 雑記帳: Android　dip, dp, から pt, px に変換する](http://y-anz-m.blogspot.jp/2010/10/androiddip-sp-pt-px.html)

## サンプルコード
端末の解像度を取ってきて計算してるだけです。
（pixelの返却値がfloatなので使うときはキャストしてどうぞ）

```java
/**
 * dpからpixelへの変換
 * @param dp
 * @param context
 * @return float pixel
 */
public static float convertDp2Px(float dp, Context context){
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return dp * metrics.density;
}

/**
 * pixelからdpへの変換
 * @param px
 * @param context
 * @return float dp
 */
public static float convertPx2Dp(int px, Context context){
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return px / metrics.density;
}
```
2016-03-31 c++ builder / teechart > Link > 多量のプロットの描画高速化 + 実装ミスの訂正(2019-04-11)

```txt:動作環境
C++ Builder XE4
```

TeeChartで多量のプロットを短時間で描画したとき、描画が遅くなる症状に出くわした。
スレッド関連の実装も関係あるとは思うが検索してみたところ、以下を見つけた。

http://stackoverflow.com/questions/4767684/large-tchart-takes-a-long-time-to-draw

delphiコード

```pascal
Chart.Series[0].XValues.Value := TChartValues(XValues);
Chart.Series[0].XValues.Count := high(XValues);
Chart.Series[0].XValues.Modified := true;
```

同様にYValusも入れる。

delphiのHigh()は
http://www.delphibasics.co.uk/RTL.asp?Name=High


C++の場合は TDoubleDynArray を使うようだ。
関連 http://www.teechart.net/support/viewtopic.php?f=3&t=15201

```cpp
TDoubleDynArray xs, ys;
xs.Length = 2000;
ys.Length = 2000;

...
xs[idx] = 3.14;
ys[idx] = 2.71;
...

m_targetSeries->XValues->Value = xs;
m_targetSeries->XValues->Count = cnt;
m_targetSeries->XValues->Modified = true;
m_targetSeries->YValues->Value = ys;
m_targetSeries->YValues->Count = cnt;
m_targetSeries->YValues->Modified = true;
```

しかし、この方法では既存の折れ線の後ろにプロットを追加する場合、以下のような処理が先に必要になる。

```cpp
// 既存のプロットからの読込み
for(int idx=0; idx < m_targetSeries->XValues->Count; idx++) {
	xs[cnt++] = m_targetSeries->XValues->Value[idx];
	ys[cnt++] = m_targetSeries->YValues->Value[idx];
}
```

### 実装のミス
(追記 2019/04/11)

上記の「// 既存のプロットからの読込み」の処理に実装ミスが見つかった。
下記のようにする必要がある。cntを余分にインクリメントしていた。

```cpp
// 既存のプロットからの読込み
for(int idx=0; idx < m_targetSeries->XValues->Count; idx++) {
	xs[cnt] = m_targetSeries->XValues->Value[idx];
	ys[cnt] = m_targetSeries->YValues->Value[idx];
	cnt++;
}
```
仕様書を意味があるものにするために気をつけるべき3つのこと


## 前置き

長年、書いてはバインダに挟まれキャビネットの奥深くにしまわれるシステム仕様書を書いてきました。
単にハンコをつくための台紙にしかならない仕様書作成ほど、エンジニアのやる気を削ぐものはありません。だからこの業界では、仕様書不要論なんてあったりするんですよね。
でも、それは間違いです。不要なのは仕様書ではなく、使われない仕様書です。
使われる仕様書を書いてみんなで幸せになりましょう。


## まず読む

やさしい機能仕様 - Joel on Software
http://japanese.joelonsoftware.com/Articles/PainlessFunctionalSpecifi-2.html

読んだ？

大丈夫。長いけれど面白いのでするする読めます。
この知識が一番ベースになります。

で、読んだ？

はい。
読んだあなたには、仕様書が必要だということ、どのような仕様書を書けばそれが不要なものにならないのか、既に悟りの境地にすらあると思います。

そこに蛇足感満載ですが、いくつか私の経験の中から付け加えてみます。


## 複数ドキュメント間の重複記述は絶対に避ける

仕様書を腐らせる一番大きな原因はなにか？それは更新の手間です。
更新がめんどくさくなると、コードだけ修正してドキュメントを修正しない、なんてことが起き始めます。
そしてコードとの乖離がほんの5%程度になった時、そのドキュメントはもう信用ならないものになると感じます。

なぜなら**ウソが書いてある**からです。
しかも**どこがウソなのかわかりません**。もう正解をさぐるにはコードを見るしかなくなります。
ここに仕様書の価値がゼロどころかマイナスになりました。

こういった悲しい結末を避けるためには、変更箇所を局所化することが第一歩です。
少なくともドキュメントの変更は一箇所で済みます。


## 機能仕様と技術仕様は厳密に分離する

「やさしい機能仕様」を読んだあなたは既にご存知だと思いますが、それぞれの役割は以下です。

<img width="432" alt="Screen Shot 2016-03-31 at 18.29.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/50a615aa-11d4-18e6-a59e-0599104c5a8c.png">


なぜ分けなければならないのか？それは対象読者が異なるからです。
機能仕様は、顧客やプロデューサーなどの非エンジニアであり、技術仕様は、ともにコードと格闘するエンジニア仲間向けです。
読む人のことを考えれば、読むべきドキュメントの量は減らすべきです。読まれないドキュメントは悲劇の存在です。
読まれるために、ここは厳しく厳密にいきましょう。


## 技術仕様はソースのヘッダに書く

仕様書のゴミに変えてしまう**更新の手間**を減らすために、なるべくドキュメントはコードの近くに置いておくべきです。
物理的な近さが、片方しか更新されないという悲劇を防ぎます。
Markdownが使えれば、体裁もかなり整えられます。

apigen等良いドキュメント化ツールもあることですし、対象読者はエンジニアですし、むしろその方がテンションもあがろうというものです。


明日からレッツトライ！
さ、テスト仕様書かかなきゃ....
Cloud Storage（SoftLayer / S3）からdashDBへLoadコマンドでロードする方法

Cloud Storageから並列でファイルをロードするために、Loadコマンドをバッチ化する際に利用

１．CLPを起動、カタログ、コネクトする
db2 => catalog tcpip node <ノード名> remote <dashDB hostname> server <ポート番号>
db2 => catalog db \<database名> at node <ノード名>
db2 => connect to \<database名> user <ユーザ名>

２．ロードする
・Object Storageの下記情報を利用する
コンテナー名：\<container名>
ファイルロケーション：\<folder名>/\<file名>
エンドポイントの認証：\<endpoint url>
ユーザー名：\<user名>
APIキー(パスワード)：\<api-key>

・ロードコマンドサンプル（SoftLayerの場合）※S3の場合は、Softlayerの箇所をS3にする。
<pre>
db2 => call sysproc.admin_cmd('load from Softlayer::\<endpoint url>::\<user名>::\<api-key>::\<container名>::\<folder名>/\<file名> of <file-type> messages on server insert into "\<table-name>"')
</pre>

以上。
sqldfライブラリを使ってRでSQLコマンドを使う　日本語もOK

SQLでの集計、抽出に慣れているとRのデータフレームの集計にややイライラを感じるのは私だけではないと思います。[sqldfパッケージ](http://overlap.hatenablog.jp/entry/2013/06/14/103605)を使うと、Rのデータフレームに対してSQLコマンドが使えるのでとても便利です。[Overlapさんのブログ](http://overlap.hatenablog.jp/entry/2013/06/14/103605)に詳しく書かれていますが、SELECTした結果は１列であってもカラム名付データフレームになり、取得後の使用に若干戸惑ったため、備忘録的にR内での使い方をまとめました。なお、日本語の扱いはOKでした。

##sqldfパッケージの読み込み
```r:sample.r
#--------------------------------------------------
#SQLコマンドをRで使う
#--------------------------------------------------
install.packages("sqldf")
library(sqldf)


``` 
SQL命令は（　）の中にダブルクォーテーションで囲った上で記述します。

```r:
sqldf("SQL文")
```
日本語はシングルクォーテーションまたはダブルクォーテーションで囲います。以下は完全一致の条件文の書き方です（↓）

```r:
sqldf("SELECT ’日本語' AS var1")
sqldf("SELECT 列名 FROM データフレーム名 WHERE 列名 ==\'検索文字列\'")
sqldf("SELECT 列名 FROM データフレーム名 WHERE 列名 ==\"検索文字列\"")

```

##RでSQLを使ってみた例
###サンプルデータフレーム
shoplistというサンプルデータフレームを考えます。
連番(shop_id）と、カテゴリ付き店名の文字列からなるshopnameの列があります。

![image](https://qiita-image-store.s3.amazonaws.com/0/114127/4dcc1753-a536-5df3-f16c-63f125acdef1.png)


###Step.1 「コーヒーチェーン店」という文字列を含むshopnameを検索し、条件に一致したshop_idを抽出し、res_1に格納します。

```r:
#---------------------------------------------------------
# SQLのコマンドをRで使うライブラリsqldfを使う
#---------------------------------------------------------
#「コーヒーチェーン店」を含む文字列を抽出する。

res_1<-sqldf("SELECt shop_id FROM shoplist WHERE shopname LIKE　\"％コーヒーチェーン店%\"")

```
SELECTの結果、「コーヒーチェーン店」を含むshopname列に対応するshop_idを取得できました。結果はres_1というデータフレームの「shop_id」カラムに格納されています。


![image](https://qiita-image-store.s3.amazonaws.com/0/114127/04f6f287-4609-2d17-f8a3-95c7d09f79ca.png)


###Step.2 shoplistデータフレームに「コーヒーチェーン店」カラムを作成します。

```r:
#コーヒーチェーン店という列を追加し、0をデフォルトで入れる
shoplist$コーヒーチェーン店<-0
```

###Step.3 データフレームshoplistのコーヒーチェーン店列のうち、res_1$shop_idで取得したのと一致する行のみ、1のフラグを立てます。

```r:
shoplist$コーヒーチェーン店[res_1$shop_id]<-1
```

###Step.4 確認します。
shoplistのコーヒーチェーン列＝＝１となっている行のみ画面に書かせます。

```r:
shoplist[shoplist$コーヒーチェーン店==1,]
```

![image](https://qiita-image-store.s3.amazonaws.com/0/114127/a19eb40e-e174-c226-dd0f-3185256830cf.png)
無事、shopnameに「コーヒーチェーン店」を含む行のみ、フラグが立てられました。

##この方法が役にたった課題
- 長い商品名や店舗名のデータがあるが、上位の階層のカテゴリ名が不規則に文字列に含まれているため、上位階層の文字列を決めて、カテゴリを割り当ててる必要がありました。そこで、各商品名や店舗名を上位カテゴリ名に読み替える対応テーブルを作成しました。
- SQLソフトウェアで対応テーブルを作ったほうが速いでしょうが、商品購買テーブルや利用店舗テーブルはRのデータフレームとして存在するため、対応テーブルもRで作成することで、カテゴリを読み替えた商品購買テーブル、利用店舗テーブルの再集計が手早く行えるようになりました。

##備考 
- [postgreSQLに存在するテーブルをRから呼び出して使う](http://qiita.com/junkonakajima/items/07ad8a227c6c586e1f99)はこちらです。RPostgreSQLライブラリを使います。 
-  sqldfライブラリは*Rのデータフレームに対してSQLを使いたい時*に使います。



##参考になったページ
- [［R］SQLクエリでRのデータを加工・集計できるパッケージ「sqldf」
R](http://overlap.hatenablog.jp/entry/2013/06/14/103605)
facebookのwebViewでheight 100%にすると余分な高さが発生する

# facebookのwebViewでheight 100%にすると余分な高さが発生する
上記の通り。
css height 100%にして、
overflow: hidden;にするにしても余分な分のスクロールが発生してします。

facebookアプリが
スクロールバーなどの分、計算して引いてないのが原因だと思われる。
仕方ないので、

ブラウザ情報を受取るところに追加
```
var _ua = (function(u){
  return {
    Facebook:(u.indexOf("fban/fbios;fbav") != -1)
  }
})(window.navigator.userAgent.toLowerCase());
```

んで、フラグがたったときだけ、
height: calc(100% - 100px);
にした。

ある意味成功だけど、
ファーストビュー的によくなっただけで、やっぱスクロールが出る。

全体にスクロール禁止のjavascriptを書いてもよいかもしれない。

```
// スクロール禁止
$(window).on('touchmove.noScroll', function(e) {
    e.preventDefault();
});

// スクロール禁止 解除
$(window).off('.noScroll');
```

けど、今回サイトの仕様で一部はスクロールをさせたかったので、
以下にしました。

```
$(window).scroll(function(){
  $('body,html').scrollTop(0);
});
```

むりやりだけど、
これだとキーボードが出て強制的にスクロールされた時にも
元に戻ってくれるので対応できる。

ちなみに、vew viewのスクロール量は
2016/3/31で100pxで調度良かった。
現場ですぐに使える！　Swift逆引き大全 555の極意

<h2>Swiftの逆引き事典というよりiOS SDKの逆引き事典</h2>
Swift2対応 iOS9対応の逆引き事典です。環境の整備から事例別のプログラム例、UIエレメントの設定から、ファイル操作、そしてアプリ登録までを網羅して555項目のTipsを収めてあります。XCodeの使い方からiTunes Connectの使い方などまで入っているので、Swiftの逆引きというよりもiOS SDK の逆引き事典といった方がマッチしています。同じシリーズで既刊で「Objective-C逆引き大全」というのがあるので、そのSwift版ということでしょう。極端に初歩的な内容から、かなり高度な内容まで含まれています。JSONデータの取り扱いや、In-App Purchaseやローカライズについての解説があったり、各種のViewの使い方などは使い方を忘れた時にReferenceを調べるよりも役立ちそうです。

<h2>あまりに初歩的な内容は不要では？</h2>
本書の読者層は、入門書などを使って多少なりともアプリ開発をやった経験のあるレベルだと思います。（何の経験もない人には逆引き事典はいらないでしょう）そうだとすると、XCodeのインストールやあまりに初歩的なXCodeの操作方法は必要ないのではないでしょうか？
また、ローカライズなどでは、必要な操作の1つ1つをそれぞれ1項目に割り当てています。これで555の極意というのはちょっと盛り過ぎの感があります。

<h2>用語などがきちんとしていない部分がある</h2>
Objective-Cの版をベースにしているせいか、用語がReferenceなどにマッチしていない部分が見受けられます。例えば、Swiftではイニシャライザと呼んでいる初期化処理コードをコンストラクタと呼んでいたり、オプショナルチェインを妙な呼び方をしたりしています。

<h2>大全というには足りない機能も</h2>
大全というからには機能は網羅してほしいところですが、例えばLocaton ManagerやTouch ID、3D-Touchには触れられていません。また広告表示については、バナービューの配置だけで広告表示のためのAPIについては何も説明されていません。

<h2>完璧ではないが、持っていると役に立つことは多そう</h2>
上記で述べたように幾つかの足りない点や欠点はありますが、持っていれば初めて使う機能を調べたり、使い方が思い出せないような時に本書を見るとヒントが得られるでしょう。本書だけでは情報が十分ではないかもしれませんが、本書をヒントにReferenceと併用すると、時間の短縮になるでしょう。
全てのコードが基本的に短いので、解説書のサンプルよりも直感的にわかりやすいのも良い点です。サポートサイトに用意されているサンプルもうまく作られていて使いやすく、コードスニペットとして役立ちそうです。

![IMG_0407.jpg](https://qiita-image-store.s3.amazonaws.com/0/60473/955a4a9e-7e70-d9d8-2197-44569fb4cf42.jpeg "IMG_0407.jpg")
Rails 4.2とOracleでの日時検索でTO_DATE関数が適用されないISSUEへの秘伝のタレGem

Rails 4.2.x と Oracle の組み合わせでタイムゾーンが適用されず日時検索できない問題への秘伝のタレを Gem にしました。

https://github.com/koic/oracle-enhanced-monky_patch_755

ざっくり言うと config/initializers/oracle.rb に書くようなモンキーパッチをプラギン化したものになります。もしかしたら誰得だよ的な Gem かもですが、Oracle で Rails な人たちどうしているんだろう？ということで公開してみました。
もちろん依存ライブラリ本体にパッチを送れるのがベストなのですが、手が届かずで思いつく次善策となります (あと Gem としてのテストコードはあとで書きたい気持ち) 。

## 使い方

Rails プロジェクトであれば、こんな感じに Gemfile に追加して bundle update することになります。

```ruby
gem 'activerecord-oracle_enhanced-adapter', '~> 1.6.0'
gem 'activerecord-oracle_enhanced-adapter-monky_patch_755'
(snip)
gem 'rails', '~>4.2'
```

## 解決する問題

Rails 4.1 系で ActiveRecord::Base.where メソッドの引数に日付オブジェクトを渡すと TO_DATE 関数が適用された SQL が実行されます。

```ruby
> created_at = Model.first.created_at
> Model.where(created_at: created_at)
  Model Load (5.1ms)  SELECT "MODELS".* FROM "MODELS"  WHERE "MODELS"."CREATED_AT" = TO_DATE('2015-12-28 03:55:04','YYYY-MM-DD HH24:M
I:SS')
=> [#<Model id: ***snip***>]
```

Rails 4.2 系で同様のコードを実行すると、TO_DATE 関数が適用されずタイムゾーン分の時差 (JST だと UTC+9) が調整されないため期待する結果オブジェクトを得られないという事象がおきてました。

```ruby
> created_at = Model.first.created_at
> Model.where(created_at: created_at)
  Model Load (11.8ms)  SELECT "MODELS".* FROM "MODELS" WHERE "MODELS"."CREATED_AT" = :a1  [["created_at", 2015-12-28 03:55:04 UTC]]
=> []
```

本稿で取り扱っている activerecord-oracle_enhanced-adapter-monky_patch_755 では、本質的な問題解決の仕方ではなく、日時オブジェクトに対して時差分を調整してバインド変数で実行するアプリーチで対応しております (時差分を Time#utc_offset で調整しています) 。

## おまけ: 名前の由来

名付けるとき、これは名前が長過ぎてダメなだなあと思ったのですが、逆の考え方ではやく外したい Gem として認知されるにはむしろ悪くないのではと思い「えいやー」とリリースしました。サフィックスになっている 755 の数字は、oracle-enhanced に挙げている [ISSUE の番号です](https://github.com/rsim/oracle-enhanced/issues/755)。このあたりはかつて Java のライブラリで、JSR 175 から名前を付けた backport175 というライブラリの名前に影響を受けています。
もう少しまとも(?)な意図としては、Gemfile には gem 名を ASCII 順に並べることを前提に、ISSUE 元になっている Gem と隣り合わせの形にした方が後々に意図が伝わるのではと思ってはいます。

余談ですが、Gemfile に書く gem 名を ASCII 順に並べるのは、ASCII 順ということ以外にその並びに意味を持っているのではという考えをさせたくないという意図があります。

## おわりに

この問題は、UTC+0 のタイムゾーンに特化しているアプリケーションでないと結構な確率で踏むと思っており、それぞれの Rails アプリケーションで秘伝のタレを持っているか、Rails 4.2.x にアップグレードしていないかなのかな (あるいはもっとミドルウェアに近いレイヤーでうまいことやれる？) と思っており、後者のアップグレードできない問題を抱えている方にはご参考になればなと思っています。
BigQueryでREPEATEDが複数あるレコードを検索、表示するまで

ドハマりしたのでメモ

GAEなサービスでDatastoreに合ったデータをバックアップした後、BigQueryに投入するとBigQuery上からSQLっぽいもので検索が出来るので便利です。
ですが、RDBとは仕組みなどが違うため、探したレコードを表示する時におもわぬところでハマりますorz

# やったこと
とあるGAEのDatastoreをバックアップ後、BigQueryに取り込んで以下のようなGQLを書いてみました

```
SELECT __key__.name,functions,codes,airports,level,codes 
     FROM [appengine.data]
      where (codes is null) and (airports is null) LIMIT 1000
```

こんなエラーが出ますorz

```
Cannot query the cross product of repeated fields airports and codes.
```

上記のModelはSlim3でいうと以下のような感じです。

```
	@Attribute(primaryKey = true)
	private Key key;

	@Attribute(unindexed = true)
	private List<String> airports = new ArrayList<>();

	@Attribute(unindexed = true)
	private List<String> codes = new ArrayList<>();
	//以下省略

```
上記のようなModelの定義だとBigQuery上はList定義したプロパティーが*REPEATED*になりRDBでいうと1対Nの関連付けがなされた感じになります。
このため、複数のREPEATEDの要素を含むレコードを検索、表示しようとすると
**そこ複数件レコードがあるからな！**
と言うエラーになります。

解決方法としては、 *FLATTEN*関数を使って1カラムにならせば良いのですが、これFROM句で1カラムに対してだけ設定可能な関数のようなので、複数REPEATEDがあると以下のようなことになりますorz

```
SELECT __key__.name,functions,codes,airports,level,books
FROM 
FLATTEN(
 (select __key__.name,functions,codes,airports,level,codes FROM 
   FLATTEN(
     (SELECT __key__.name,functions,codes,airports,domInt,codes
     FROM flatten([appengine.usernotificationsetting],codes )
      where (codes is  null)
     ), functions) 
 where (codes is null)
 ), categories) 
 where (level is null) LIMIT 1000 
```

それと、where句の最後にLIMITを付けておいたほうが安心です。
数万レコードあるテーブルに対してうっかり全文表示するようなQueryを投げるとBigQueryと言っても3分以上ぐるぐるしてて結果が返ってこなかったりします(；´Д｀)
【AWS】教訓 RDSのスケールアップ　

あくまで個人メモ

RDSの負荷が上がったのでスケールアップしたい。
だがしかし、コレすでに動いてるけど大丈夫・・・((((；ﾟДﾟ))))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙ

---

##Multi-AZにしていますか？

【はい】
Multi-AZをオンにしているばあい、RDSは無停止でスケールアップできる。
実際に掛った時間としては30分位かかったので落ち着いて待つ。

<img width="563" alt="RDS_·_AWS_Console.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/52141/b2dbe8b1-16ed-d2fa-f4f7-fa7243bbc5e3.jpeg">

####なかなかクラスが変わらなくて心配だけど、10分毎くらいにイベント起きてるから大丈夫！


いろいろ調べたところによると、フェイルオーバーのタイミングで15秒位はダウンタイムあるかもしれない。

---

【いいえ】
まず、Multi-AZにしてから作業する。

---

スケールアップで逃げられるのもクラウドの利点かと。
amazon ec2 ubuntu マシンに windows からリモートデスクトップ接続する

# 概要

amazon ec2 ubuntu マシン（Ubuntu Server 14.04 LTS）に windows7 からリモートデスクトップで接続したいと思いました。基本手順は AWS 公式に載っているのですが、リモートデスクトップのクライアントのバージョンが RDP 8.0 以上だと、手順通りではうまくいきませんでした。そのため、手順をまとめることにしました。

# サーバ側設定手順

## パッケージを更新する
```
sudo apt-get update
sudo apt-get -y upgrade
```

## パスワードでログインできるようにする
PasswordAuthentication yes ⇒ no に修正します。

```
sudo vim /etc/ssh/sshd_config
```

sshd を リスタートします。

```
sudo /etc/init.d/ssh restart
```

## ubuntu ユーザのパスワードを変更する
root になって変更します。

```
sudo su - 
passwd ubuntu
```
ubutu ユーザに戻します。

```
su ubuntu
cd
```

## ubuntu desktop をインストールする

```
export DEBIAN_FRONTEND=noninteractive
sudo -E apt-get update
sudo -E apt-get install -y ubuntu-desktop
```

## xfce4 をインストールする

```
sudo apt-get install -y xfce4 xfce4-goodies
```

## xrdp をソースからインストールする

apt でインストールすると、0.6.0 が入りますが、RDP8 以降に対応していないようです。

なので、ソースからインストールします。
2016/03 時点での最新は 0.9.0 でした。

```
cd
mkdir src
cd src
wget https://github.com/neutrinolabs/xrdp/archive/devel.zip
unzip devel.zip
cd xrdp-devel
sudo apt-get install -y autoconf libtool libssl-dev libpam0g-dev libx11-dev libxfixes-dev libxrandr-dev
./bootstrap
./configure
make
sudo make install
```

## xfce4 をデフォルトに設定する

```
echo xfce4-session > ~/.xsession
sudo cp /home/ubuntu/.xsession /etc/skel
```

## allow changing of the host port you will connect to

```
sudo vim /etc/xrdp/xrdp.ini

```
[xrdp1] セクションの port 値を -1 から ask-1 に変更します。

```
[xrdp1]
name=sesman-X11rdp
lib=libxup.so
username=ask
password=ask
ip=127.0.0.1
port=ask-1
xserverbpp=24
code=10
```

## vnc4server をインストールする
```
sudo apt-get install -y vnc4server
```

## xrdp をリスタートする

```
sudo service xrdp restart
```

## システム起動時に起動するようにする

```
sudo update-rc.d xrdp defaults
```

# windows から接続

## 接続

リモートデスクトップ接続アプリを起動します。

「オプションの表示」⇒「画面」タブで、画面の色を 16ビットに変更します。
![RDP.png](https://qiita-image-store.s3.amazonaws.com/0/108071/4e8ba24f-2ba8-8801-a4a5-621524897e4f.png)

対象マシンのIPアドレスを入力して接続します。

## ログイン画面

Session を 「sesman-Xvnc」にします。
username(ubuntu), password(上で変更しましたね) を入力します。
![VNC.png](https://qiita-image-store.s3.amazonaws.com/0/108071/44c71720-12ee-601c-5dd2-fea4dc5b102b.png)

## デスクトップ表示

デスクトップが表示されました！
![DESKTOP.png](https://qiita-image-store.s3.amazonaws.com/0/108071/39152fad-54c5-7c64-de08-49e03fba05c8.png)


# 参考サイト

https://aws.amazon.com/jp/premiumsupport/knowledge-center/connect-to-linux-desktop-from-windows/