OmniAICreator/Qiita-1.07M huggingface dataset:
Redshift使ったときに調べたこと

1年くらい前につけたメモが元なので最近は少し違うかもしれないけど

# 1.UPSERT

PrimaryやUniqueがRedshiftでは効かないからUPSERTするためには一時テーブルに読み込み→元テーブルから同じ主キーのレコードを消す→一時テーブルをくっつける操作が必要
http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/merge-replacing-existing-rows.html

# 2.通し番号、連番
Redshiftにはシーケンスが無い
ROW_NUMBER() を使って通し番号をゲットする。
http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_WF_ROW_NUMBER.html

```sql
UPDATE target_table
SET
  id_new = row
FROM
(
  SELECT
    id_org id
    ,row_number () over (partition by id_new ORDER BY id_new ASC) AS row
  FROM
    target_table
)
WHERE
  id_org = id
;
```

2回目以降のINSERT時にはやっぱ一旦一時テーブルにロードしてROW_NUMBER() をゲットしてそれを元テーブルのMAXやらに足してあげる

```sql
UPDATE target_table__stg
SET
  id_new = min_id + row
FROM
(
  SELECT
    id_org id
    ,row_number () over (partition by id_new ORDER BY id_new ASC) AS row
  FROM
   target_table__stg
)
WHERE
  id_org = id
;
```

# 3.最新のデータ
余裕でレコードが重複するので更新日が最新のものをとってくるクエリがよく必要になる

```sql
SELECT a.id, a.no, a.updt, a.dlfl
FROM table_ a, (SELECT id, MAX(updt) AS updt FROM table_ GROUP BY id) b
WHERE a.id = b.id AND a.updt = b.updt
```

# 4.COPYを使ったロード
INSERTは4万リクエストくらいでぶったぎられるからCSV作ってS3においてそっからロードする

http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/t_Loading_tables_with_the_COPY_command.html

# 5.DDLの取り出し
SQLワークベンチとかで頑張る

Database Explorer→テーブル右クリ→CREATE DDL SCRIPT

# 6.Redshiftに限らないけど便利でよくつかうUPDATE文
UPDATE文にFROMを使う
http://www.oss-db.jp/measures/dojo_20.shtml

# 7.客の無能クエリで容量もCPUも危ないときに使うCANCEL
PIDの調べ方とCANCELとABORT
クエリ実行中にタイムアウトしたり、客が失敗したクエリを放置したときに必要になる（しかも動作が重くなったって文句まで言ってくる）
http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/cancel_query.html

# 8.いつの間にか検証DBが消えてたときに本番DBを壊さないで検証する一時テーブル

```sql
CREATE TEMP TABLE target AS SELECT文
```

# 9.知ってたらよかったEXPLAIN
http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_EXPLAIN.html

# 10.参照権限
grant使う

```sql
grant select on table _TARGET_ to group read_only_group;
```

# 11.客のデータ型を無視した要求にこたえる
CAST - 数値型とか
LPAD - 左0埋めしてみたり
to_char - きっと便利

# その他知ってるとよいこと
- `YYYY-MM-DDTHH:mm:ss`はCOPYで形式エラー
- TEXTはVARCHAR(256)になる
- 15分でコネクション切れる（　http://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/connecting-firewall-guidance.html　）
- 無能クエリでデータが膨れ上がると容量がさよならする
- distinct
- top
PayPal HATEOAS Linkについて

PayPalのAPIには、前から使われいてるClassic APIと２年ぐらい前にリリースされた新しいREST APIがあり、REST APIへの機能の移行が徐々に進んでいますが、REST APIの便利な仕様としてHTEOAS Linkがあります。

**HATEAOSの説明（Wikipedia）**
https://en.wikipedia.org/wiki/HATEOAS

**PayPalのHATEOAS Link**
https://developer.paypal.com/docs/api/#hateoas-links

>HATEOAS, an abbreviation for Hypermedia as the Engine of Application State

ということですが、簡単に言ってしまうとURL（URI）をつかって、APIのデータを表現する方法です。

よく使われるパターンは、

APIが一度に100件しか返さなくて次の100件を取得したい場合に,
`https://xxxx.com/search?name=aaa&page=2`
みたいなクエリを投げると思いますが、今までは、この「page=2」のクエリ仕様をDeveloperがドキュメントなどを調べて知っておく必要がありました。
これを初めのレスポンス、
`https://xxxx.com/search?name=aaa` 
内に
`{next_link : "https://xxxx.com/search?name=aaa&page=2"}`
といったように、「次のページを取得するためのURL」というフィールドとして返すことで、
開発者はそのフィールドの値をGETすれば次のデータを取得することができます。

これにより、情報参照の手間が省けるとともに、仮に「page=2」の部分が「offset=101」に仕様変更になったとしても、プログラムの改修をしなくて済むというメリットがあります。

もうひとつのケースとしては、

従業員データを返すAPIなどで、検索結果には

`[{emp_id : "001"},
 {emp_id : "002"}, 
{emp_id : "003"}]`

というIDが返ってきて、それを詳細データ参照API

`https://xxxx.com/detail?id=001` 

を使ってデータを参照するというケースがあると思いますが、

`[{emp_id : "001", rel : "https://xxxx.com/detail?id=001"},
 {emp_id : "002", rel : "https://xxxx.com/detail?id=002"},
 {emp_id : "003", rel : "https://xxxx.com/detail?id=003"}]`

といった参照用のURIを示すことで、データ参照の実装がやりやすくなります。

単発のAPIコールだけでなくて、幾つかのAPIを複合的にコールすることが多いサービスには有効なアプローチかと思います。

決済は、ユーザーアクションや運用に応じた様々なフロー設計が必要なので、このアプローチにはマッチしていると言えます。

PayPalのHATEOASLinkにおいては、支払い関連のAPIで次にコールすべきAPIのエンドポイントや返された支払いデータの詳細を取得するAPIのエンドポイントを、メソッド（POST/GET）とともに指定しています。
(以下はデベロッパーサイトでの例）

`
           "links": [
              {
                "href": "https://api.sandbox.paypal.com/v1/payments/sale/4RR959492F879224U",
                "rel": "self",
                "method": "GET"
              },
              {
                "href": "https://api.sandbox.paypal.com/v1/payments/sale/4RR959492F879224U/refund",
                "rel": "refund",
                "method": "POST"
              },
              {
                "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-17S8410768582940NKEE66EQ",
                "rel": "parent_payment",
                "method": "GET"
              }
            ]
`

ちなみに、PayPalは[この投稿](http://qiita.com/benzookapi/items/0b6a5b41e63a4f20671f)でも述べたように、APIの標準化にも積極的で、HATEOASで検索すると上記のデベロッパーサイトのページが上位にHITしたり、広く参考にされていたりします。
箱屋さんからみた自動化の理想と現実


[NetOpsCoding Advent Calendar 2015](URL "http://qiita.com/advent-calendar/2015/netopscoding") 4日目のエントリーです．


ネットワーク運用のためのネットワークスイッチを製造している側の中のひとです。
今回は箱屋さんからみた個人的な悩みとかを書いてみたりします。

#自動化が必要なケースと必要でないケースがある。
## 必要なケース
ルーティンワークが発生する。大量の箱を面倒みる必要がある。
これこそ、NetOpsの出番、運用が楽になる。開発が楽になる。

## いらないケース
一度いれたら二度と設定しない系の箱
MGMT用の箱だったり、、エンプラの島ハブだったり、、


#悩み
##エントリー系のスイッチ/ルータのUIをどうするか。
過去の歴史があり、簡単に変えられない。そもそもコストをどこに乗っけるのか問題とか、、、5000円のスイッチにAPI乗っけて値段あげられるかというと、、、
仮に過去の歴史が長いOSにアドオンすると実装が完全にならないという悩みがあります。
ここは永遠の課題だったりします。

#解決策
最初から自動化を考えたOSを作ってしまう。APIが神でCLIやGUIが従、間違いがおこらない。
ホワイトボックス上のOSよりかは優しく保守できる形にすると喜んでもらえるかなぁとか、、
いっそ箱からオフロードしてVirtual Functionになってしまう。物理の制約から離れるので自動化がかなりできる。

# 古い箱たちやマルチベンダ対応とか
　例えば OpenDaylightなどのネットワークコントローラ経由で抽象化して REST-APIで叩いて先をCLIにしたりとか
　一つの回答かなと。実際ODLベースで動かされているベンチャーさんとかもいるそうです。


# ちょっと考える。
API提供するだけだと、路頭に迷うよね、、、

えーい作っちまえということで、手前味噌ながらメーカーでライブラリやサンプルを提供していたりします。
こんな感じ
https://github.com/BRCDcomm/

あ、会社がばれた。。

こちらの紹介とかでおそらくおなかいっぱいになってしまうと思うので、今日はここまでで(^^;




#まとめ

・自動化を考えるならば新しめの思想のOSでやるといいかもしれない。
・Out of BOX(ネットワークコントローラ)で抽象化するのも答えかな
・探すとAPIだけじゃなくてサンプルコードもあるよ

とりとめもないですが、読んで頂いてありがとうございました。
オープンソースとなったSwift coreの実装を覗いてみよう 。例えばOptional.swift。

# Swiftのcore部分が公開された！
さて、今朝Swiftがオープンソースとして公開されました :tada: みなさま、仕事なんてやってる場合じゃねえというテンションになってることと思います。

C++やLLVMについては残念ながら知見がなく見てもなかなかピンと来るところがないのですが、今回のオープンソース化ではSwiftのCore部分ももちろん公開されています。こちらについては、いつも利用している機能たちがどのようにして実現されているのかを、Swiftのコードで読むことが出来るのでなかなかテンションがあがります。

SwiftのCore部分のソースコードは以下のリディレクトリに配置されており自由に閲覧することができます。

https://github.com/apple/swift/tree/master/stdlib/public/core

例えば下記のOptional.swiftは、Optionalの実装ファイルです。

https://github.com/apple/swift/blob/master/stdlib/public/core/Optional.swift


# mapの実装を見てみる
中を見てみると、例えばOptional型に対するmapの実装は下記の様になっています。

```swift:Optional.swift
 public func map<U>(@noescape f: (Wrapped) throws -> U) rethrows -> U? {
    switch self {
    case .Some(let y):
      return .Some(try f(y))
    case .None:
      return .None
    }
  }
```

ご存知の様にOptional型の実態は`.Some(Wrapped)`と`None`からなる列挙型です。なので、`switch self`して、`.Some`だったならばfという関数(mapの引数で渡されたクロージャ)を現在Wrappedしてる中身に適用して、その結果を包んだ`.Some`をreturnするという実装になっています。`.None`だったならばそのまま`.None`をreturnする、というシンプルな実装ですね。

# flatMapの実装を見てみる
せっかくなので、次はOptionalに対するflatMapの実装も覗いてみましょう。

```swift:Optional.swift
  public func flatMap<U>(@noescape f: (Wrapped) throws -> U?) rethrows -> U? {
    switch self {
    case .Some(let y):
      return try f(y)
    case .None:
      return .None
    }
  }
```

ほぼ同じなのですが、注目すべきは先ほどのmapの実装では`.Some(try f(y))`となっていた部分が`try f(y)`となっているところです。.Someに包むことなく直接 `f(y)`の結果をreturnしていることがわかります。これにより、flatMapにより2重になっていたOptionalの箱を1重にするという機能を実現することが出来ているのがわかります。

# ??の実装
他にも、いつもお世話になっている`??`の実装なども同じファイルに実装されています。

```swift:Optional.swift
public func ?? <T> (optional: T?, @autoclosure defaultValue: () throws -> T?)
    rethrows -> T? {
  switch optional {
  case .Some(let value):
    return value
  case .None:
    return try defaultValue()
  }
}
```
元々公開されていた宣言から大体わかる話ではあるのですが、`@autoclosure`を利用して`defaultValue()`の遅延実行を実施していることがわかります。`case .Some`の場合はreturn valueをするので、`defaultValue()`は実行されることがなく、`.None`のときのみ`defaultValue()`が評価され実行される、という実装です。

# 他にもいろいろ見てみよう

Swiftのcoreだけでなく、Foundationについても同様にオープンソースとして公開されています。普段利用している標準の機能がどのようにして実現されているかをみるのは、面白いし勉強にもなるので、みんなでじゃんじゃん覗いてみましょう！

https://github.com/apple/swift-corelibs-foundation/tree/master/Foundation

みんな大好きNSObjectや
https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/NSObject.swift

なるほど、、、という感じのNSNullの中身をみることもできます。
https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/NSNull.swift

では、みなさま良きSwift Lifeを！
Swift2.xでUITextView内のテキストをHTMLとして表示する

## APIから取得した情報を表示する際にはリンク付テキストやCSS付きのテキストで表示したい場合も多いはず

iOS開発の中でもWebAPIとの連携する場合等、HTMLタグ付きの情報を取得してUITextViewに表示させたい場合があったので試してみたのですが、少しハマってしまいましたので、その方法を備忘録も兼ねて記しておこうと思います。

■ 私の使用環境：

+ OS：Yosemite 10.10.5 ※まだEl Capitanにはしていません><
+ XCode：XCode 7.1.1
+ Swift：Swift2.1

## ポイントとなるのはNSAttributedString

上記のNSAttributedStringを使用することによって、UILabelやUITextViewに対して文字の一部やフォントなどを変更することができます。
今回は下記のような見た目のものをUITextFieldを使って再現するコードになります。

![display_textfield_as_html.png](https://qiita-image-store.s3.amazonaws.com/0/17400/369b82d6-430c-df0f-bceb-b73d8fc7d81e.png)

そして実際のコード例は下記になります。

````swift:●●●●.swift
//事前の準備としてtargetTextViewというUITextViewのインスタンスを作成。

//配置したUITextViewのインスタンスに対してリンクを有効にする
self.targetTextView.dataDetectorTypes = .Link

//HTMLタグが混在している文字列に対してHTMLで表示させるようにする処理
//※ "（ダブルクオーテーション）の前に、\（バックスラッシュ）をつけること
do {

    //対象のテキスト
    let htmlText: String =
        "テキストカラーは<font color=\"blue\">青色</font>です。<br>" +
        "テキストカラーは<font color=\"red\">赤色</font>です。<br>" +
        "ヤフージャパンへのリンクは<a href=\"http://www.yahoo.co.jp/\"><strong>こちら</strong></a><br>" +
        "CSSスタイルは<strong style=\"color:#663399;\">こんな風に</strong>適用されます。"

    //テキストをUTF-8エンコード
    let encodedData = htmlText.dataUsingEncoding(NSUTF8StringEncoding)!
    
    //表示データのオプションの設定
    let attributedOptions : [String : AnyObject] = [
        NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType, //表示データのドキュメントタイプ
        NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding, //表示データの文字エンコード
    ]

    //文字列の変換処理の実装（try 〜 catch構文を使っています。）
    let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil)
    
    //HTMLとしてUITextViewに表示する
    self.targetTextView.attributedText = attributedString

//ここは例外処理
} catch {
    fatalError("Unhandled error: \(error)")
}
````
※もちろん上記はリンクを押すと遷移します＆直書きのスタイルも反映されています。

Swiftも今は少し落ち着いた感はあるのですが、バージョンアップを重ねていくうちに、同じ処理でも微妙に記法が違っていたりして「思わず時間を食ってしまった…」的なことになってしまいました。この部分に関しては旧のバージョンでは動いていたのにというものでも、Swift2.x系でどのように変わったかの振る舞いは今後もう少し深掘る必要がありそうですね。

## 参考にしたもの一覧

※引用：[NSAttributedStringによる文字装飾](http://blogios.stack3.net/archives/530)
（こちらはObjective-Cでの記事になりますが「こんなことができるのかー」的な参考になりました。）

※引用：[既存コードのSwift2.0とiOS9対応の暫定措置](http://qiita.com/bloody_snow/items/9d7571552614655250cc#nserrorpointer%E3%82%92%E8%A6%81%E6%B1%82%E3%81%97%E3%81%A6%E3%81%84%E3%81%9Fapi%E3%81%AE%E6%A4%9C%E6%9F%BB%E4%BE%8B%E5%A4%96%E5%8C%96)

※引用：[Apple公式のドキュメント(NSAttributedStringに関して)](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/NSAttributedString_UIKit_Additions/index.html#//apple_ref/occ/instm/NSAttributedString/initWithData:options:documentAttributes:error:)

※引用：[【iOS】UITextViewの任意の文字列にリンクを埋め込む](http://tech.vasily.jp/entry/ios_linktextview)
（実際に実装を行った際のサンプルで非常に勉強になりました！）

※引用：[Swift: Using Attributed Strings in Swift](http://makeapppie.com/tag/swift-nsattributedstring-in-swift/)
Heroku の新プラン移行に備えよう！

この記事は[ソニックガーデン Advent Calendar 2015](http://www.adventar.org/calendars/855) 、4日目の記事です。

# はじめに
みなさん、今日も元気に Heroku 使ってますか？
楽ちんにアプリをデプロイできる Heroku ですが、2016年の1月末をもって旧プランが使えなくなり、新プランに強制的に移行されます。

参考：https://blog.heroku.com/archives/2015/5/7/new-dyno-types-public-beta#plan-for-general-availability-grandfathering-and-migration

自動的に移行されるのを待っても良いですが、場合によっては早めに移行した方が費用が下がったりしますしここではプランを変更する方法をまとめておきます。

# 新プランのざっくりまとめ
今回のプラン変更の肝は、今までのように無料で24時間使える dyno が無くなるが有料 dyno に関しては値段が下がる、という点ですね。
詳細は以下のページを参照して下さい。

参考：https://www.heroku.com/pricing

また、今までと違ってアプリごとに以下の3種類のプランからどれを使うかを選ぶことになります。

- Free
- Hobby
- Professional

24時間使いたい場合は Hobby にする必要がある、というのが一番のポイントだと思います。
一日の中で18時間だけ稼働すればよい、dyno 数も 1 だけで良いと言う場合は Free でいけます。

# プランの移行手順
プランの変更はアプリのダッシュボード画面から行えます。
dyno の数はそのまま引き継がれるので、プラン変更だけすれば終わりです！

![heroku_plan1.png](https://qiita-image-store.s3.amazonaws.com/0/16746/f3cd43e4-d25d-7e2f-b7f1-8655fd8c250c.png)

ここで change を押すとプラン変更用のモーダルが表示されます。
本番環境は Professional、ステージング環境は Hobby とかが良くありそうな気がしますね。

![heroku_plan2.png](https://qiita-image-store.s3.amazonaws.com/0/16746/2d89b6f4-2974-fbeb-fa88-9bafb3c84e83.png)

ステージング環境は Free でも十分な場合も多いと思うので、そこはサービスの内容と合わせるのが良いと思います。
プランを選んだら Save ボタンを押します。
すると以下のような画面になります。

![heroku_plan3.png](https://qiita-image-store.s3.amazonaws.com/0/16746/650c5f3d-60f4-fb83-cc16-f4df02a812ab.png)

ここでちゃんと意図した通りのプランになってれば完了です！

# まとめ
画面が分かりやすいのでさくっと終わりますね。
dyno の値段が変わってるので、before after で値段の違いもチェックすると良いと思います。
それでは皆さん、プラン変更に事前に備えて快適な heroku 生活をー！
El Capitan‎にアップデートしたらJenkinsが起動しなくなった

MacのビルドサーバーをEl Capitanにアップデートしたら、
launchctlからJenkinsが起動しなくなった。

何がおきたのかとjenkinsのログをみようとしたら、ログが出力されてない。
よく見ると権限の問題みたい。

```
$ ls -l /var/log/
....
drwxr--r--   2 root             wheel                 68 12  4 10:41 jenkins
....
```
以下で所有者を変更すると無事起動した。

```
$ sudo chown jenkins /var/log/jenkins/
```

参考
----
* http://stackoverflow.com/questions/26483089/launchd-is-not-starting-jenkins-server-on-os-x-yosemite
VagrantのCentOS6にRailsをインストール

自分用のめも。


#Rails環境構築

#手順
1. gitインストール 
2. 必要なパッケージインストール 
3. git から 必要なモノ（rbenv, ruby-build） を clone 
4. rbenv動作設定 
5. rbenvでrubyインストール 
6. rbenvでrailsインストール

※vagrantでvm（centos6.6）環境まではある前提

#1. Gitインストール
```
$ sudo yum install git
$ git --version
```

#2. 必要なパッケージインストール
```
$ sudo yum install zlib zlib-devel openssl-devel sqlite-devel gcc-c++ glibc-headers libyaml-devel readline readline-devel zlib-devel libffi-devel
```

#3. git から モノ（rbenv, ruby-build） を clone
```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

$ git clone https://github.com/sstephenson/ruby-build.git　~/.rbenv/plugins/ruby-build
```

#4. rbenv動作設定
bash_profie 
「~/.bash_profile」に次の行を加える。 
```
export PATH=$PATH:$HOME/.rbenv/bin:$HOME/.rbenv/shims　
```
そして以下のコマンドを実行
```
$ source ~/.bash_profile 
$ rbenv -v 
```
バージョン確認できたらＯＫ


#5.rubyインストール
```
$ rbenv install --list 
$ rbenv install 2.2.2 
$ rbenv global 2.2.2 
$ rbenv -v 
```
rbenvのバージョンが2.2.2になってることを確認。
2.2.2 (set by /home/vagrant/.rbenv/version) 
```
$ ruby -v 
```
Rubyのバージョン確認できたらＯＫ

#6.Railsインストール
「/etc/resolv.conf」に次の行を加える。　
※これをやらないとインストールにすごく時間がかかる 
```
options single-request-reopen　　#　これを追記
```

「~/.gemrc」に次の３行を加える 

```
install: --nori --no-rdoc 
update: --nori --no-rdoc 
gem: --no-ri --no-rdoc

```
コマンド実行
```
$ gem update --system
$ sudo yum install libxml2-devel libxslt-devel 
$ gem install nokogiri -- --use-system-libraries 
$ gem install --no-ri --no-rdoc rails 
$ rails -v
```
Railsのバージョン確認できたらＯＫ
c言語での文字列ポインタと文字列配列の違い

C言語での文字列操作の違いをまとめてみました。

|宣言              |変数入れ替え    |文字列操作|
|:---------------:|:---------------:|:---------:|
|char[]           |コンパイルエラー  |OK        |
|char*            |OK               |ランタイムエラー |
|const char*      |OK               |コンパイルエラー |
|char* const      |コンパイルエラー  |ランタイムエラー|
|const char* const|コンパイルエラー  |コンパイルエラー|


文字列配列は宣言したときにchar[]という型で宣言されるのでそれ以降ポインタ型の文字列は受け付けないのでコンパイルエラーが出ると思われる。
文字列ポインタは変数そのものの中身は入れ替えることはできるが変数が指している文字列自体の変更はできないと思われる。読み取り専用のメモリに置かれるのでセグメンテーションフォールトが発生する。

テスト用のプログラムを作ったので置いておきます。

```c
#include <stdio.h>
 
int main() {
        char chararray[] = "chararray";
        char chararray2[] = {'c', 'h', 'a', 'r'};
        //chararray = chararray2;                   // compile error - incompatible types when assigning to type 'char[10]' from type 'char *' 
        //chararray = "chararray_change";           // compile error - incompatible types when assigning to type 'char[10]' from type 'char *'
        chararray[0] = '0';
        printf("%s\n", chararray);
 
        char* charp = "charp";
        charp = "charp_change";                     // OK
        //charp[0] = '0';                           // runtime error - segmentation fault
        printf("%s\n", charp);
 
        const char* constchar = "constchar";
        constchar = "constchar_change";             // OK
        //constchar[0] = '0';                       // compile error - read only variable
        printf("%s\n", constchar);              
 
        char* const charconst = "charconst";
        //charconst = "charconst_change";           // compile error - read only variable
        //charconst[0] = '0';                       // runtime error - segmentation fault
        printf("%s\n", charconst);
 
        const char* const constcharconst = "constcharconst";
        //constcharconst = "constcharconst_change"; // compile error - read only variable
        //constcharconst[0] = '0';                  // compile error - read only variable
        printf("%s\n", constcharconst);
}
```
PHP7とPHP5.6でメモリ使用量をくらべてみる

PHP7がリリースされたので下記スクリプトで配列を10万個作ってメモリの使用量を比べてみる。

##PHP7のインストール
PHP7はDockerでインストール

```bash
git clone https://github.com/docker-library/php
cd php/7.0/
docker build -t pman/php7 ./
```

```bash
docker images
pman/php7                latest              0aa7a4b8159c        2 hours ago        488.6 MB
```
488MB...でかい。



## スクリプトを実行
スクリプトは下記で実行。今いるディレクトリに実行するPHPファイルがある前提でdocker側の/usr/src/myappを結びつけてそのスクリプトを実行しています。

```bash
docker run -it --rm --name php7 -v `pwd`:/usr/src/myapp pman/php7 php /usr/src/myapp/test.php 
```

#### スクリプト
```php
<?php
$a = [];
for($i=0;$i<100000;$i++){
    $a[] = $i;
}

//$b = $a;
//$b[0] = 0;
print memory_get_usage() ."\n";
```

#### 結果
|バージョン|メモリ使用量（バイト）|
|---|---:|
|php7 |4,544,416|
|php5.6 |14,869,384|



## Copy On Write

配列のコピーがCopy On Writeなのを確認。
一つでもコピーした配列の中を変更すると全てのデータがコピーされる。

### 配列をコピー
殆どメモリ使用量は増えない

#### スクリプト
```php
<?php
$a = [];
for($i=0;$i<100000;$i++){
    $a[] = $i;
}

$b = $a;
//$b[0] = 0;
print memory_get_usage() ."\n";
```

#### 結果
|バージョン|メモリ使用量（バイト）|
|---|---:|
|php7 |4,544,520|
|php5.6 |14,869,584|


### コピーした配列のひとつを変更
配列の値もコピーするのでメモリがかなり増える。

#### スクリプト
```php
<?php
$a = [];
for($i=0;$i<100000;$i++){
    $a[] = $i;
}

$b = $a;
$b[0] = 0;
print memory_get_usage() ."\n";
```

#### 結果
|バージョン|メモリ使用量（バイト）|
|---|---:|
|php7 |8,743,160|
|php5.6 |24,718,536|

整数の配列をコピーしたときに5.6だと9,848,952バイト、7だと4,198,640バイト増えています。
整数のzvalがポインタと合わせて7は5.6の半分のサイズになっているとのことなので概ねそんな感じかなと。
[java]コンソール入力を求められる、外部プロセス実行

外部プロセスの実行のみであればProcessBuilderを利用し簡単に行えます。

```
String[] cmds = {"cmd.exe", "/k", "del", "C:\\sample.txt"};
ProcessBuilder b = new ProcessBuilder(cmds);
Process process = b.start();

boolean ret = process.waitFor(10, TimeUnit.MINUTES);
process.destroy();

```
※Windows環境でのコマンド
このプログラムを実行すればC:\\sample.txtのファイルが削除されます。

外部プロセス実行後に、コンソール入力を求められるコマンドを実行する場合は
標準出力にコンソール入力値を出力してあげる必要があります。

コンソール入力値をプログラムから出力する例を以下に記述します。
以下の実行コマンドではdelコマンドに/pオプションを付けることで削除時に確認メッセージが表示されます。
確認時にプログラムより"Y"を入力し削除を実行します。

```
String[] cmds = {"cmd.exe", "/k", "del", "/p", "C:\\sample.txt"};

ProcessBuilder b = new ProcessBuilder(cmds);
Process process = b.start();

// 入力値の入力
String password = "Y";
PrintStream out = new PrintStream(process.getOutputStream());
out.println(password);
out.flush();
out.close();

boolean ret = process.waitFor(10, TimeUnit.MINUTES);
process.destroy();
```
※Windows環境でのコマンド

実際こんなプログラムは書かないですよね

で実際どういうときに役立つか
例えば証明書と秘密鍵を結合したPKCS12ファイルを作る場合などです。
PKCS12ファイルはjavaプログラムでは生成できないので外部プロセスのopensslを利用します。
プロセスを実行した後パスフレーズを求められます。

```
String processStr = "openssl pkcs12 -export -inkey greenwich.key -in greenwich.crt -out greenwich.p12";
Process process = r.exec(processStr);

Thread.sleep(1000); // 1秒待ってから処理しよう

PrintStream out = new PrintStream(process.getOutputStream()); 

String password = "greenwich"; // パスフレーズ
out.println(password); 
out.flush();

Thread.sleep(1000); // 1秒待ってから処理しよう
out.println(password); // 再入力パスフレーズ
out.flush();

out.close();

boolean ret = process.waitFor(10, TimeUnit.MINUTES);
process.destroy();
```
※linux環境でのコマンド
こんな感じでパスフレーズを入力し証明書と秘密鍵からPKCS12ファイルを生成します。
Creative Cloudをアップデート後に、CPU使用100%が止まらなくなった


## 起こったこと

2015年11月末に公開された Adobe Creative Cloud (ver.3.4.1.181) をインストール後に、Mac (El Capitan) のファンが止まらなくなって、バッテリー消費も異常に早くなった。

## 解決方法

オフィシャルから、「[【お知らせ】Creative Cloud デスクトップアプリケーションアップデート後のトラブルにつきまして](https://forums.adobe.com/docs/DOC-6661)」というのも出ているけど解決しないので、アクティビティモニタを見て、CPUを食い続けている、

- **CCLibrary**
`/Applications/Utilities/Adobe Creative Cloud/CCLibrary/CCLibrary.app`

- **CCXProcess**
`/Applications/Utilities/Adobe Creative Cloud/CCXProcess/CCXProcess.app`

の2つをゴミ箱に入れて削除 (一応バックアップ用にzipして残した)。

参考: [Adobe Creative Cloud の自動アップデート後に99%メモリ消費で取った対策 | Mistyz.com](http://mistyz.com/cclibrary-ccxprocess-memory/)

----


本家フォーラムでも未解決。

・[Creative Cloud is charging the CPU at 99% since... | Adobe Community](https://forums.adobe.com/thread/2015939?tstart=0)


Sketchもまだ実用レベルじゃないけど、Adobeの毎回のアップデートにも全く共感できない、我慢の過渡期。
[Android] 利用しているライブラリの依存関係を確認する


`Android Studio` ベースのプロジェクトなら楽ちん。例えば拙作のサンプルプロジェクト (https://github.com/hkusu/android-controller-delegate-sample) を例にすると、

- `Terminal` を開く。

	![スクリーンショット 2015-12-04 11.04.40.png](https://qiita-image-store.s3.amazonaws.com/0/35733/2a964b29-0879-ba7d-7ccf-9d36d5e8b005.png "スクリーンショット 2015-12-04 11.04.40.png")

- プロジェクトのルートにある `gradlew` に実行権限を付与する。

	```
	$ chmod +x gradlew
	```

- `app` ディレクトリ配下へ移動して `$ ./../gradlew dependencies` とコマンドを実行する。すると、ずらずらと表示されます。

	![スクリーンショット 2015-12-04 11.09.20.png](https://qiita-image-store.s3.amazonaws.com/0/35733/0900a682-bda6-10ee-5f07-678c4ee75018.png "スクリーンショット 2015-12-04 11.09.20.png")
作業用BGMの手に入れ方

どうも、Harmonie Chromatiqueの中の人です。
本業では機械学習とかやってまして、本業以外のメインは同人音屋です。最近は水中撮影とかも。
http://h-chromatique.info/

作業用BGMなんてAdvent Calendarがあるので、こりゃ手を出さないわけにはいかないでしょう。
どこで作業用BGMを仕入れるか。

# 定額サービス系
個人的にはクラシック好きとしてNaxos Music Libraryイチオシ。
http://ml.naxos.jp/
AppleとかGoogleとかAmazonのもありますよねー。Amazonプレミアムは通販用途で持ってる人も多いのでは。

# 無料サービス系
著作権のことさえ脇に置いておけばYouTubeっていいですよね。ニコニコ動画にも色々。
ただ、帯域食いまくるって問題があります。

# お皿の買い方
最近タワレコ行ってないなー。国内盤の新リリースはAmazon.co.jpで普通に買えるし、曲の発掘はタワレコよりNaxos Music Libraryのほうが強いし(特に北欧クラシックは事実上無敵：NMLで聴けない曲は広島の某ショップ以外で購入できる手段が思いつかないです)
……同人？とりあえずM3とコミケで。東方好きなら例大祭も。

# ヘッドホン
うちは普段の音作業も兼ねてHA-MX10-B使ってます。ただ、図体でかいんで、イヤホン欲しいなーとは思ってたり。
Elasticsearch+Kibana環境構築に再チャレンジ

#はじめに
Kibana4.0.xで環境を作ったらOops!と表示されて、
うまく環境構築が進まなかったため、最新版を入れて作った。

#環境
OS X Yosemite 10.10.5
VirtualBox 4.3.14
CentOS 6

#ゲストOSにログイン

~~~
ssh root@192.168.56.10
~~~

#Elasticsearchのインストール,　起動
インストールについて、[本家サイト](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-repositories.html#_yum)を参照。

起動。

~~~ホストOS
service elasticsearch start
~~~

#Kibanaのインストール,　起動
[本家サイト](https://www.elastic.co/downloads/kibana)からKibanaの最新版をダウンロードして解凍する。

~~~ホストOS
wget https://download.elastic.co/kibana/kibana/kibana-4.1.3-linux-x64.tar.gz
tar zxf kibana-4.1.3-linux-x64.tar.gz
~~~

起動。

~~~
[root@localhost bin]# ./kibana
  log   [02:07:59.990] [info][status][plugin:kibana] Status changed from uninitialized to green - Ready
  log   [02:08:00.111] [info][status][plugin:elasticsearch] Status changed from uninitialized to yellow - Waiting for Elasticsearch
  log   [02:08:00.162] [info][status][plugin:kbn_vislib_vis_types] Status changed from uninitialized to green - Ready
  log   [02:08:00.166] [info][status][plugin:markdown_vis] Status changed from uninitialized to green - Ready
  log   [02:08:00.203] [info][status][plugin:metric_vis] Status changed from uninitialized to green - Ready
  log   [02:08:00.214] [info][status][plugin:spyModes] Status changed from uninitialized to green - Ready
  log   [02:08:00.221] [info][status][plugin:statusPage] Status changed from uninitialized to green - Ready
  log   [02:08:00.230] [info][status][plugin:table_vis] Status changed from uninitialized to green - Ready
  log   [02:08:00.271] [info][listening] Server running at http://0.0.0.0:5601
  log   [02:08:05.790] [info][status][plugin:elasticsearch] Status changed from yellow to yellow - No existing Kibana index found
  log   [02:08:09.387] [info][status][plugin:elasticsearch] Status changed from yellow to green - Kibana index ready
~~~

##疎通確認
ホストOSから http://[ゲストOS IP]:5601/ へアクセス。

![kobito.1449193199.554294.png](https://qiita-image-store.s3.amazonaws.com/0/65994/cf006de4-9d15-8ef7-b711-2c109dc56dab.png "kobito.1449193199.554294.png")

#おわりに
ElasticsearchとKibanaを連携させることで、まずは受け皿ができた所感。
引き続きFluentdと連携させて、可視化を行う。

追記:Fluentdと連携し可視化について続編を書いた。[こちら](http://qiita.com/Kenji_TAJIMA/items/ca8725402034a6d7615d)から参照。
JavaScriptから部屋の植物を監視。 Parrot Flower PowerをNode.jsから制御する


おうちハックアドベントカレンダー4日目です。

[IoTLT](https://www.facebook.com/groups/IoTLT/)というコミュニティで活動していたりする @n0bisukeです。
[次回のIoTLTは12/21](http://iotlt.connpass.com/event/22514/)にありますのでよかったらお越しください。

今回はParrot Flower Powerを使って部屋の植物の情報を取得したいと思います。

## Parrot Flower Powerとは

植物プランターなどの **土の部分に突き刺すだけで土壌情報を取得することが出来るIoTデバイスです**。
**電池入れて土に挿すだけなのでホントに手軽です。**

http://www.parrot.com/jp/products/flower-power/

![](https://i.gyazo.com/26cd5a402a8e0c140010e275ce5e91f4.png)

Amazonで現時点では7344円で買えます。http://amzn.to/1Q41Lbe

ParrotといえばMiniDroneシリーズが有名なイメージですが、こういったプロダクトも出しています。

## 準備
箱から開けるとこんな感じになります。けっこう箱から取り出すところで苦戦しました。
![](https://i.gyazo.com/e6ac89220cce85c3ff5a06e4717efd42.png)

短い方の"枝"のキャップを外して電池を入れましょう。 長い方の"枝"がLEDになってますが、電池を入れると光ります。
![](https://i.gyazo.com/9fb6c5db427e9c1e085d0c0d0036e6d3.png)

**あとは植物のそばに突き刺しましょう。**

## Node.jsから制御できます。

https://github.com/sandeepmistry/node-flower-power

先人のチカラは偉大ですね。めちゃ簡単に制御できました。

ちなみに環境は

* Mac OS X Yosemite
* Node.js v5.1

です。

## 使い方

npm installしましょう。

```bash
$ npm install flower-power
```

サンプルコードはリポジトリ側にはなかったのですが、README.mdを見ながら書いてみいました。

```app.js
'use strict'

let FlowerPower = require('flower-power');
console.log('FlowerPowerを探しています...');

//1.FlowerPowerに接続
FlowerPower.discover((fp) => {
  console.log('FlowerPowerを見つけました。接続中です...');
  fp.connectAndSetup((err) => {
    if(err) return;
    console.log('接続しました。');
    action(fp);
  });
});

//2.各メソッドを実行
function action(fp){
  fp.ledPulse((err) => {
    if(err) return;
    console.log('LED on!');
  });

  fp.readSoilMoisture((err, soilMoisture) => {
    if(err) return;
    console.log('土壌湿度は'+soilMoisture+'です。');
  });

  fp.readSoilTemperature((err, temperature) => {
    if(err) return;
    console.log('土壌温度は'+temperature+'です。');
  });

  fp.readAirTemperature((err, temperature) => {
    if(err) return;
    console.log('空気中の温度は'+temperature+'です。');
  });

  fp.readSunlight((err, sunlight) => {
    if(err) return;
    console.log('照度は'+sunlight+'です。');
  });

  fp.readBatteryLevel((err, batteryLevel) => {
    if(err) return;
    console.log('バッテリーレベルは'+batteryLevel+'です。');
  });
}
```

FlowerPowerはBLE接続して情報を取得します。

1.でBLEスキャンをしてFlowerPowerデバイスを探し出し、接続します。
2.で各メソッドを実行します。

実行してみましょう。

```bash
$node app.js

FlowerPowerを探しています...
FlowerPowerを見つけました。接続中です...
接続しました。
LED on!
土壌湿度は25.175161501381837です。
土壌温度は25.119048480359996です。
空気中の温度は26.058746040000006です。
照度は1.0485464488570566です。
バッテリーレベルは100です。
```

![](https://i.gyazo.com/c7bf02b559cb224d3bc4cf0625a5e09e.gif)

こんな感じで情報取得しつつ`.ledPulse()`メソッドでLEDも光らせることが出来ていることが確認できます。

簡単ですね！

##まとめ

センサー買ってくれば自作も出来ますが、手軽さという点ではかなり優位性があるのではないでしょうか。
自宅の`植物が水を欲しがっている`や`空気が乾燥している`などの情報をスマートに取得するためのツールとして活用してみてはいかがでしょうか。

>ホントにちゃんと運用するなら、近くにEdisonなどのBLEが利用出来るマイコンボードを置きつつロギングする必要がありそうですね。
ROMAの設定をカスタマイズする方法(mkconfig)

ROMAの設定をデフォルトから変更する方法です
Storage の種類を変更したり、使用するプラグインの指定したり、各種設定値の変更を行います

## default値
- デフォルトでは、ライブラリの中にある以下configファイルを利用するようになっています  
https://github.com/roma/roma/blob/master/lib/roma/config.rb

## 任意の設定のconfigファイルの作成
- 今回は任意の設定に変更したconfigファイルを作成し、そのconfigファイルの設定で起動する方法を紹介します

### configファイル実行
```
$ mkconfig
```
- configファイルの作成は`mkconfig`コマンドを使用します
- このコマンドは対話的に設定値を入力することで、configファイルを作成します

### Storage選択
```
if you doesn't input anything, default value is set.
+----------------------------------------------+
|STORAGE_CLASS: Roma::Storage::RubyHashStorage |
|STORAGE_OPTION:                               |
|PLUGIN_FILES: ["plugin_storage.rb"]           |
+----------------------------------------------+
Which storage will you use?
[1] Ruby Hash
[2] Tokyo Cabinet
[3] Groonga
>
```
- 希望するStorage typeの番号を入力してEnterをおしてください
- brankでEnterを押すとデフォルトのRuby Hash(memory mode)になります

### Plugin選択
```
Please select which plugin will you use.(plugin_storage.rb is essential unless you make alternative plugin.)
[1] plugin_storage.rb
[2] plugin_mapcount.rb
[3] plugin_gui.rb
[4] plugin_cmd_aliases.rb
[5] plugin_test.rb
[6] plugin_map.rb
[7] plugin_alist.rb
[8] plugin_debug.rb
[9] Select all plugins
>
```
- 使用するpluginの番号を選択してください
- `plugin_storage.rb`はdataのget/set系など基本のコマンドが入っているので、代替のpluginを開発している場合以外は必須です

### FD値の計算
```
Please select programming language of client by number.
[1] Ruby
[2] Java
[3] PHP
>

How many machine run as ROMA server?
>

How many machine run as ROMA client?
>
```
- 上から
<ul>
<li>使用するクライアントの種類</li>
<li>ROMAクラスター何台のserverで構成するか</li>
<li>ROMAクライアントを何台用意するか</li>
</ul>
を指定します
- (ここはFDの推奨値を計算するだけでconfigファイル自体には関係ありません)

最初にRuby Hash(memory mode)を選択した場合はこれで終了です

## 物理ファイル選択時
最初の選択で物理ファイル(TokyoCabinet, Groonga)を選択した場合は以下の項目が追加されます

```
How big memory size in 1 server? Please measure in GB.
>

How many run ROMA process per machine?
>

How many data will you store?
>
```
- ROMAは物理ファイルをStorageに指定した場合、まずはメモリに保存した後に物理ファイルへFlushします。その際、ROMAに使用を許可させるメモリの容量を設定することが出来ます
- データを読み込む際には、メモリ上に残っているデータは高速で読み込まれますが、上記の設定値を超えてメモリ上に残っていないデータに関しては物理アクセスが発生するためにその分スピードは遅くなります
- この項目では単純にサーバ1台のメモリーサイズを入力すれば、ROMAが使用するmemory量を自動で計算します  
<ul>
<li>厳密には物理ファイル(TCファイル)1ファイルにつき、どれだけのメモリー量の使用を許可するかの値です</li>
<li>
  計算式は以下です  
  `res["memory"].value.to_f * GB - OS_MEMORY_SIZE) / res["process"].value.to_i / TC_FILE`
</li>
<li>入力されたメモリーサイズからOS用として1GB引き、プロセスの数と物理ファイルの数で割っています</li>
</ul>

## 確認
- mkconfigが終了したら、カレントディレクトリにconfigファイルが作成されます

```
$ ls -l config.rb
-rw-rw-r-- 1 roma roma 2999 Dec  4 01:09 config.rb
```

### PATHの設定
カレントディレクトリにROMAのroutingファイル等がある場合には変更不要ですが、以下のPATHを変更することで読み込むroutingファイルの場所や保存するデータのディレクトリを指定することが出来ます。

```
$ grep -r 'PATH' config.rb
    LOG_PATH = '.'
    RTTABLE_PATH = '.'
    STORAGE_PATH = '.'
    STORAGE_DUMP_PATH = '/tmp'
    WRITEBEHIND_PATH = './wb'
```

## 起動
作成したconfigファイルを利用してROMAを起動します

```
$ romad ${address} -p ${port NO.} -d --config ./config.rb

```
- `--config`オプションは読み込むconfigファイルを指定します
- 入力しない場合はデフォルトのライブラリに入っているconfigを読み込みます

## 参照URL
ROMA HP Configuration File : http://roma-kvs.org/docs/configuration.html
ROMA HP Install Main Unit : http://roma-kvs.org/learn/main_unit.html#dist-jump-link-6
マイナンバーを検証する gem を作った

# tl;dr

開発中のサービス <a href="https://smarthr.jp/" target="_blank">SmartHR</a> で必要になったので、マイナンバー、法人番号の validator を作りました。

[kufu/tsubaki](https://github.com/kufu/tsubaki)

こんな感じで検証できます。

```ruby
# マイナンバーの検証
validates :digits, my_number: { strict: true, allow_blank: true }

# 法人番号の検証
validates :digits, corporate_number: { strict: true, allow_blank: true }
```

（あんま需要なさそうですが）マイナンバー関連のシステムを構築する際などにご活用ください。


# チェックディジットについて

12 桁で構成されているマイナンバーのうち、最後尾の 1 桁は「チェックディジット」として利用されます。
この数値は最後尾の 1 桁を除く 11 桁の数値をもとに算出されます。
入力ミスを計算によって発見することができる、とても便利な仕組みです。

ちなみにマイナンバーのチェックディジット計算方法はこんな感じです。

<img class="aligncenter size-medium wp-image-16647" src="http://kufuinc.com/wp-content/uploads/2015/11/451747da6b9049ea7f2dc2be6674222c-620x288.png" alt="スクリーンショット 2015-11-29 10.52.29" width="620" height="288" />
<small><a href="http://www.soumu.go.jp/main_content/000327387.pdf" target="_blank">総務省令第八十五号 第五条より</a></small>

ワザワザこのロジックを書くのは面倒ですね。
<a href="https://github.com/kufu/tsubaki">Tsubaki</a> を利用すると、簡単にチェックディジットの検証を行うことができます！

# 法人番号

各企業に割り当てられる 13 桁の法人番号にもチェックディジットが付与されています。
マイナンバーが最後尾の 1 桁をチェックディジットとしている一方で、法人番号は先頭の 1 桁を利用します。また、マイナンバーとは計算方法も少々異なります。

<img class="aligncenter size-full wp-image-16651" src="http://kufuinc.com/wp-content/uploads/2015/11/d8eeb43e09384eceb161a9258b35d848.png" alt="スクリーンショット 2015-11-29 11.05.37" width="486" height="177" />
<small><a href="https://www.nta.go.jp/mynumberinfo/FAQ/03houjinbangoukankei.htm" target="_blank">法人番号に関するFAQ｜社会保障・税社会保障・税番号制度FAQ｜社会保障・税番号制度＜マイナンバー＞について｜国税庁より</a></small>

<a href="https://github.com/kufu/tsubaki">Tsubaki</a> は法人番号の検証にも対応しています。

# おまけ
検証用にランダムなマイナンバーや法人番号を生成するページを用意しました。
テスト等にご利用ください。

<a href="https://my-number-kun.herokuapp.com/" target="_blank">擬似マイナンバーくん</a>
Raspberry Pi 2 ✕ Arduino ✕ Xbee ✕ myThings = ？（IDCFクラウドの設定 Ⅱ）

ここからは、IDCFクラウドサーバーのネットワーク設定を始めます。
まだ、仮想マシンの作成ができていない人は、[こちら](http://qiita.com/masaomi_k/items/f6254c9f26d1077ab1a8)を見てくださいね。

# IDCFクラウド　ネットワークの設定
## IPアドレスの取得
外部からターミナルなどでクラウドサーバーに接続するためには、サーバーに[グローバルIPアドレス](http://www.atmarkit.co.jp/aig/06network/globalip.html)を割り当てて上げる必要があります。さっそく設定をしてみましょう。
まずは、IDCFクラウドの左メニューから「IPアドレス」を選択します。その後、右上の「IPアドレスの取得」をクリックします。
<div align="center">
![IDCFクラウド_ip1.png](https://qiita-image-store.s3.amazonaws.com/0/87230/5f3629c7-7f82-570e-f1b2-06b4c4314c05.png)
</div>
すると、ポップアップで下のような入力画面が現れます。
<div align="center">
![IDCFクラウド_ip2.png](https://qiita-image-store.s3.amazonaws.com/0/87230/5c03692c-7b1f-a374-f1e5-120f5d263b11.png)
</div>

- IPアドレス名：好きなお名前を

- ゾーン：選択ボックスから選んで下さい

- ネットワーク：選択ボックスから選んで下さい

全てを入力したら。「取得する」をクリックして、しばらく待つと…
<div align="center">
![IDCFクラウド_ip3.png](https://qiita-image-store.s3.amazonaws.com/0/87230/bae71bc1-ffb7-cce7-bf19-498971a3ea1a.png)
</div>

グローバルIPアドレスが、割り振られました！！！　:clap:

あともう一息です。

## ファイアウォールの設定
つぎに、このNATに対し[ファイアウォール](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%83%BC%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB)の設定をする必要があります。これも、[めちゃ楽ガイド](http://www.idcf.jp/cloud/pdf/IDCFCloud_installation_guide_nonreg.pdf)　P8　これ通りにすすめればOK。簡単:kissing_smiling_eyes:
<div align="center">
![IDCFクラウド_ip4.png](https://qiita-image-store.s3.amazonaws.com/0/87230/9baff418-9b06-e4dd-2d55-fe3448c8b3fd.png)
![IDCFクラウド_ip5.png](https://qiita-image-store.s3.amazonaws.com/0/87230/8d2bdb98-e5d8-debc-1b09-a106958e2a81.png)
</div>

- コメント：なんでもいいよ

- ソースCIDR：「Any」「My IP」「Custom IP」があります。「**My IP**」でOKです。操作端末のゲートウェイ IPを自動設定してくれるから便利

- タイプ：SSH（まずはSSHでリモートログインしたいから）

- ポートレンジ：２２（自動で設定されます）

入力が完了したら、右の「＋」ボタンをクリックして下さい。
<div align="center">
![IDCFクラウド_ip6.png](https://qiita-image-store.s3.amazonaws.com/0/87230/dc4dda16-6ea7-b0b2-b80b-92c78e4bc06c.png)
</div>

はい。登録できました。:clap:

最後は、このIPでSSHを受け付けた通信を、どのサーバーに送るかを設定する必要があります。それが、「ポートフォワード」の画面になります。
<div align="center">
![IDCFクラウド_ip7.png](https://qiita-image-store.s3.amazonaws.com/0/87230/5519781f-4838-2864-08a1-5279f0d77c76.png)
</div>

- コメント：わかりやすいやつ

- プライベートポート：SSHを選んで下さい

- パブリックポート：これは、前のファイアウォール設定でポートレンジで指定したポートを入力（今回は22番）

- 仮想マシン：ここでついに、前回作ったサーバー名を選択します

入力が完了したら、右の「＋」ボタンをクリックして下さい。
<div align="center">
![IDCFクラウド_ip8.png](https://qiita-image-store.s3.amazonaws.com/0/87230/cb531ec6-9788-ddea-75ce-994767b0ce4b.png)
</div>
おめでとうございます！これで、マイ仮想マシンができました！:tada::tada::clap::clap::tada::tada:

さぁ次は、自分の作ったサーバーにリモートでアクセスしてみましょう。
mysqlのgroup_concatで@OneToManyをカンマ区切りにしてCSV出力

下記の記事と思い切りネタかぶりなので大変恐縮なのですが、すこし前に自分も使ったので、ユースケースの共有ということで。
http://qiita.com/kyuu1999/items/93b02128f07c577b3e48

実際のテーブルは違うのですが、単純化のために別の例で説明します。
Redmineのプロジェクトをイメージして、下記のようなテーブルがあるとします。

* Project
* Project_Member
* User
* Ticket

プロジェクトに、ユーザとチケットが1:nで関連づけられているとします。
このとき、プロジェクト毎に、メンバー名とチケット番号のリストをカンマ区切りしたものを全件出力してというようなときにgroup_concatを使いました。下のようなcsvを作るイメージです。

```lang:project.csv
プロジェクト名,メンバー,チケット
プロジェクトA,"○山,△田,□村","#1,#2,#3"
...
```

基本方針は「group_concatでカンマ区切りにしたテーブルとjoin」でいきます。

```lang:sample.sql
SELECT 
    Project.id,
    Project.name,
    pm.members,
    pt.tickets
FROM Project 
    LEFT JOIN (select project_id, group_concat(user_id) members FROM Project_Member GROUP BY project_id) pm ON Project.id = pm.project_id
    LEFT JOIN (select project_id, concat('#', id) tickets FROM Ticket GROUP BY project_id) pt ON Project.id = pt.project_id
```

あとは、これをもとにCSVライブラリで書き出すか、SQLだけでがんばって整形すればという感じです。

ORMの機能だとSQLのN+1問題になる場合の回避策や、（パフォーマンスの要件がゆるいなら）カンマ区切りにしたのをビューテーブルにしてそれとマッピングさせて困難を分割する、というときに使えると思います。

# まとめ

ORMだけだときびしいというときに、その難しさをSQL側で解決する（押し付ける?）テクニックのひとつです。
オープンソースになったSwiftをビルドしてみる

Swiftがついにオープンソース化されました！自分も何か pull request 送って「Swiftコントリビュータ」を名乗りたいところですが、**言語のソースコードを前にしたところでいったい何からはじめてよいものかわからない**、けど気分だけでもこの祭りに乗っかりたい、ということでとりあえずビルドしてみることにしました。

[README](https://github.com/apple/swift) をみると [Getting Started](https://github.com/apple/swift#getting-started) のところに色々書いてあります。が、Ubuntuだけで必要な手順とかも混じっているので、**OS X でビルドするための最短距離** を探ってみました。

色々試してみて、Swift をビルドするにあたって clone が必須なのは以下のリポジトリ。

```
$ git clone git@github.com:apple/swift.git swift
$ git clone git@github.com:apple/swift-clang.git clang
$ git clone git@github.com:apple/swift-llvm.git llvm
$ git clone git@github.com:martine/ninja.git
```

（clang, llvm, ninja は入れてないとビルドスクリプト実行時におこられる）

Ninja というのはビルドシステムの一種のようです。

> Ninja is the current recommended build system for building Swift and is the default configuration generated by CMake


clone してきたら、あとは swift リポジトリにあるビルドスクリプトを実行するだけ。

```
$ swift/utils/build-script
```

だいたい**30分弱**（MBP Retina, 15-inch, Mid2014）でビルドが完了しました。お昼休みとかに走らせておくとちょうどいいかもしれません。

完了すると以下に各種 libswift{フレームワーク名}.dylib ファイルが生成されてました。

```
build/Ninja-DebugAssert/swift-macosx-x86_64/lib/swift/macosx
```

`build/Ninja-DebugAssert/swift-macosx-x86_64/lib/swift/iphoneos` フォルダとかもできてたのですが空だったので、iOS向けにビルドするにはスクリプトのオプションを指定しないといけないのかもしれません。

```
$ swift/utils/build-script -h
```

でビルドスクリプトのヘルプが見れるのですが、

```
usage: build-script [-h] [-l] [-b] [-p] [--xctest] [--foundation] [-c]
                    [-d | -r | -R] [--debug-llvm] [--debug-swift]
                    [--debug-swift-stdlib] [--debug-lldb] [--debug-cmark]
                    [--debug-foundation] [--assertions | --no-assertions]
                    [--cmark-assertions] [--llvm-assertions]
                    [--no-llvm-assertions] [--swift-assertions]
                    [--no-swift-assertions] [--swift-stdlib-assertions]
                    [--no-swift-stdlib-assertions] [--lldb-assertions]
                    [--no-lldb-assertions] [-x] [-X] [-m] [-e] [-t] [-T] [-o]
                    [-S] [-i] [--tvos] [--watchos] [--build-subdir PATH]
                    [--extra-swift-args EXTRA_SWIFT_ARGS]
                    [build_script_impl_args [build_script_impl_args ...]]
```

と、 `--tvos` や `--watchos` といったオプションもあります。

iOS はどこかなーとヘルプを読み進めると、

```
  -i, --ios             also build for iOS, but disallow tests that require an
                        iOS device
```

ということで `-i` もしくは `--ios` でいけるようです。



上記の通り簡単なのでぜひお試しあれ！
プログラミング言語・技術に関わりそうな国際会議

プログラミング言語・技術に関わりそうな国際会議の一覧です。

#2016
Modularity http://2016.modularity.info/

#2015
SPLASH http://2015.splashcon.org/
ECOOP http://2015.ecoop.org/
Modularity http://modularity.info/conference/2015/
GPCE http://2015.gpce.org/home
ICFP http://icfpconference.org/icfp2015/
ICSE http://2015.icse-conferences.org/
アウトソーシング嫌いのベンチャーが2ヶ月でオフショア開発でサービスをローンチしてみた ~CTO編~

# はじめに
某渋谷のベンチャーでCTO(ちょっと、たのしい、おじさん)をしています。
CTOばかりの忘年会で、先日公開したPJマネジメント編に続いて、大先輩達のCTOメンバを前にLTをしてきました。
あまりに素敵なお店だったため、まさかここではないよなぁーと2回ほど前を通り過ぎました。
日本一Geekな人ばかりなはずなのに、ワイン片手に生演奏を聞いたのち、酔っぱらい状態プレゼンとリア充な夜。

当日のプレゼンでは、オフショア開発で気になるところの品質面やコミニケーションレベルのお話なども
散りばめてお話しています。

先人の方に色々ご指導頂いて今回のプロジェクトも無事成功を収めているので
恩返しのつもりで、直接お会い出来ない、皆様にも経験値シェアさせていただこうと思います。
少しでも、経験値シェアさせて頂き、皆様の一歩踏み出すきっかけになればと思います。

### 品質の面
自分の感想としては、日本とほぼ変わらないと思います。
日本ならではの気にするポイントなどは、予めお伝えをしてプロトタイプを使い、どのような形で進めていきたいかなど、事前に摺り合わせが出来ていれば違和感なく、システム開発が出来ます。

今回は単体は「Rspec」でお願いして、E2Eは自社で「Turnip + RSpec + Capybara + Selenium」という切り分けで進めました。

プロジェクト規模が小さいこともあってRspecのカバレッジについては使用頻度の低いlib配下のファイルを除いたら「95%」程度。

※リリース当初は70%くらいでローンチして、ローンチ終わった後にさらに品質をあげています。

リリース後のバグ発生の内訳としては
10/1にリリースしていますが、12/4現在で重要度:低 14個(レイアウト崩れや文言修正)、重要度:中 6個(OSやブラウザの依存で動作がおかしかったもの)と当初見込んでいたよりも、かなりバグ発生率が低いです。

ちなみに作ったサービスはこれ
[コンバージョン率自動アップサービス ヒキアゲール](https://info.conversion-up.net/pr/)

## 発表内容
今回はCTO編として
オフショア開発に至った経緯、プロジェクトの人選、オフショア開発先の選定、プロジェクトを振り返り、成功したポイントなどをご紹介しております。

[![オフショア開発 事例](https://qiita-image-store.s3.amazonaws.com/0/74153/fe079e7c-c649-58c8-c842-01a6bbf1e939.png "オフショア開発 事例")](http://www.slideshare.net/nakanonoriyuki1/2cto-55451574)

12/03公開 [アウトソーシング嫌いのベンチャーが2ヶ月間でオフショア開発でサービスをローンチしてみた(cto編)](http://qiita.com/devopsCoordinator/items/045423010da495dc19de)

## その他
その他公開資料としては、開発リーダー編、PJマネジメント編、システム編と公開していきます。

11/30公開 [アウトソーシング嫌いのベンチャーが2ヶ月でオフショア開発でサービスをローンチしてみた ~開発リーダー編~)](http://qiita.com/dirty_hero/items/8df6860da862a886d70b)
CTOに無茶ぶりされた開発リーダーの心境を紹介

12/02公開 [アウトソーシング嫌いのベンチャーが2ヶ月間でオフショア開発でサービスをローンチしてみた(PJマネジメント編)](http://qiita.com/devopsCoordinator/items/045423010da495dc19de)
オフショア開発する際にしたPJマネジメントの取捨選択紹介

12/07公開予定 [アウトソーシング嫌いのベンチャーが2ヶ月間でオフショア開発でサービスをローンチしてみた(システム編)]
時間が無い中、開発を完了させるために工夫したこと。
R でドキュメンテーション・老害編

この記事はドキュメンテーションツールAdvent Calendar (http://www.adventar.org/calendars/1196) の 3 日目です。

誕生日を再び迎え、老害ポイントが増えたのを記念に軽く投稿させてもらいます。

Rでドキュメンテーションといえば、もうRStudio の Rmarkdownで決まりということになっていて、私も使わないことはないんですが、日常、EmacsをLinuxで利用している身であり、資料やスライドは実は org-mode + Babel を使って作成しています。

![back.png](https://qiita-image-store.s3.amazonaws.com/0/9239/be38966b-0188-4449-fe48-00680e8b5a85.png)


org-mode + Babel って、多分Rユーザーのほとんどが知らないと思うんですが、要はレポートとRのコードを混在させたファイルを作成したら、一発でPDFに変換してくれる仕組みです。詳細は、ググって頂くとして、例えば、こんなファイルを用意します。


```org
#+TITLE: Org をオルグする
#+AUTHOR: R_Linux
#+DATE:      2015年12月03日
#+BEAMER_THEME: Warsaw 
#+BEAMER_COLOR_THEME: default 
#+LATEX_HEADER: \RequirePackage{fancyvrb}
#+BEAMER_HEADER: \setbeamerfont{parent A}{size=\LARGE}

* ggplot2のコードとプロット
** R  code 						      :BMCOL:B_block:
    :PROPERTIES:
    :BEAMER_col: 0.5
    :BEAMER_env: block
    :END:
#+name: ggplot2
#+BEGIN_SRC R :results ouput graphics :file "ggplot2.pdf" :exports both  :session *R* :cache yes 
library(ggplot2)
gp <- ggplot(iris,
            aes(x=Sepal.Width,
                y=Sepal.Length,
                colour=Species))
gp + geom_point()
#+END_SRC
** output 						      :BMCOL:B_block:
    :PROPERTIES:
    :BEAMER_col: 0.5
    :BEAMER_env: block
    :BEAMER_act: <2->
    :END:
#+RESULTS: ggplot2
```
								   
これを変換すると、こんなスライドができあがります。

![org.png](https://qiita-image-store.s3.amazonaws.com/0/9239/0a9a38f6-b51b-9110-909c-a4961dd24aed.png)



```tex
#+BEGIN_SRC R

#+END_SRC
```

こんな部分にRのコードを書いておくと、コードと実行結果、またグラフィックスを良い感じでドキュメントに配置してくれるわけです。
このファイルの場合、いったんLaTeXに変換してから PDF 化しています。LaTeXへの命令などは `#+ATTR_LATEX` で指定できます。
Emacs なのでコードの挿入や補完も当然使えます。

![hokan.png](https://qiita-image-store.s3.amazonaws.com/0/9239/2e98b0f0-3295-02da-13d5-896ec6490ed9.png)

とても便利なので、いつかEmacsを捨ててRStudioに移行しなきゃと思いつつ、現状に甘えているところです。
願わくば、来年はこのAdventで RMarkdown で少しノウハウ的なものを書けますように。
facebook APIメモ

``` 
function statusChangeCallback(response) {
    if (response.status === 'connected') {
      // Logged into your app and Facebook.
		read_profiles();
    } else if (response.status === 'not_authorized') {

    } else {
		FB.login(function(response){
			read_profiles();
		});
    }
  }

function checkLoginState() {
  FB.getLoginStatus(function(response) {
    statusChangeCallback(response);
  });
}

//fb-init
window.fbAsyncInit = function() {
    FB.init({
      appId      : '{you-app-id}',
      cookie     : true, 
      xfbml      : true,  
      version    : 'v2.4' 
    });
  };

  //login check
  function fb_check(){
    FB.getLoginStatus(function(response) {
    statusChangeCallback(response);
  });
}
  
  // Load the SDK asynchronously
(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/sdk.js";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
  
  //get user info
function read_profiles(){
    FB.api('/me/?fields=name,email,gender',function(response){
      console.log(response);
    })
}
```

##### 今年４月から仕様が変更されましたので、申請しない限りに、user_profile,email,nameぐらいしか取れません
シェルスクリプトの改行コードにはまったこと

#windowsからwinscpで持ってきたファイルからスクリプト作ろうと思ってはまった

普段はテキストファイルからコピーしてvimエディタとかに張り付ける。
今回はコピーするファイル数が多かったので、winscpでファイルを転送した。
持ってきたファイルをスクリプトで加工しようと思ったら変な文字がついてはまった。

```lang:
[user@host01]$ cat -A file.txt
aaa^M$
bbb^M$
ccc^M$
ddd^M$
eee^M$
```



調べてみたらこれだった
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/164linendm.html

スクリプトの先頭に入れて一行入れて回避。
ポイントは^Mを入力するには、**［Ctrl］＋［V］キーを押してから、［Ctrl］＋［M］キーを押す。**

```lang:
[user@host01]$ sed -i -e 's/^M//' file.txt
[user@host01]$ cat -A file.txt
aaa$
bbb$
ccc$
ddd$
eee$
```

以上
ソフトウェアデザインの理論：組織構造と意思決定プロセス

#はじめに
この記事では、ソフトウェア開発における組織の構造が、ソフトウェアデザインにおける意思決定プロセスに与える影響を考察します。

John Gero さんによれば、工学におけるデザインのプロセスには、以下の側面があります[1]。 
> goal-oriented, constrained, decision-making, exploration and learning activity which operates within a context, which depends on the designer's perception of the context.

- (1) ゴール指向
- (2) 制約がある
- (3) 意思決定
- (4) 探索
- (5) 学習

この記事では、ソフトウェアデザインでの「意思決定」の側面に着目します。

#ソフトウェアデザインにおける意思決定

ソフトウェアデザインでの意思決定とは、ここでは、プログラム構造に影響を与える以下の決定であるとします。

- (1) 抽象度の高いレベル。アーキテクチャスタイル（もしくはデザインパターン）の選択に関わる決定など。
- (2) 抽象度の低いレベル。プログラムの変数の名前付けに関わる決定など。

次に、どのような状況で意思決定を行うのかについては考えます。状況の一つは、意思決定者の数です。

- (a) 一人の開発者が意思決定を行う。
- (b) 二人以上の開発者が意思決定を行う。

通常、ソフトウェア開発ではbの状況ですので、この記事ではbの場合を考察します。

次の状況は、意思決定者の間の関係です。

- (i) ある意思決定者の決定は、他の意思決定者の影響を受けない。
- (ii) ある意思決定者の決定は、他の意思決定者の影響を受ける。

iで言いたいことは、ある決定されたことAとBとが依存していないというわけでなく、意思決定が必要なことについて、意思決定者XとYが共同して最終的な決定を行わない、ということです。

#ソフトウェア開発における組織構造

ここで、意思決定の権限の強さは、技術的な能力で決まるのではないと仮定します。意志結果が得られる過程には次が考えられます。

- (1) 権限が低いものにとって（部下）技術的に適切だと思われる意思決定が、権限が高いもの（上司）に受け入れられる。
- (2) 権限が低いものにとって（部下）にとって技術的に適切だと思われる意思決定が、権限が高いもの（上司）に受け入れられない。

![org_design.png](https://qiita-image-store.s3.amazonaws.com/0/102438/a975034b-7761-3c3e-97c8-4061af4b291f.png)

ただし、ここでは、デザインは、個人的な経験や知識によって行われるため、「技術的に適切」というのが実際に「技術的に適切」かどうかの判断は難しいとします。

また、意思決定は、「技術的に適切」かどうかだけでなく、スケジュールやコストといった開発状況の考慮も必要です。そのため、そのような考慮が欠けている部下の意思決定を、上司が受け入れないというのは現実的です。

#まとめと課題
この記事では、ソフトウェア開発での組織構造が意思決定に影響を与えるとするなら、ソフトウェア開発での最終的な成果物である「コード」もしくは「プログラム構造」を技術的に適切な観点からアウトプットするのは難しいということを議論しました。

今後調査したいと思っているのは、オープンソースソフトウェア開発の組織構造での意思決定プロセスとの比較です。

#参考文献
[1] J. S. Gero, Design prototypes: a knowledge representation schema for design, AI Magazine, 11(4): 26-36, (1990).
.NET Framework バージョン判定(4.5から4.8)

判定方法
----
レジストリ エディター(regedit.exe や reg.exe)で、次のサブキーを開きます。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full

```コマンドプロンプト
C:\>reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" | find "Release"
    Release    REG_DWORD    0x70805
```

Full サブキーが存在しない場合は、.NET Framework 4.5 以降がインストールされていません。
 
Release という名前の DWORD 値を確認します。Release DWORD がある場合は、.NET Framework 4.5 以降がコンピューターにインストールされていることを示します。

```
4.8以上   Release DWORD値が ******以上 [NEW]
4.7.2以上 Release DWORD値が 461808以上 
4.7.1以上 Release DWORD値が 461308以上
4.7以上   Release DWORD値が 460798以上
4.6.2以上 Release DWORD値が 394802以上
4.6.1以上 Release DWORD値が 394254以上
4.6以上   Release DWORD値が 393295以上
4.5.2以上 Release DWORD値が 379893以上
4.5.1以上 Release DWORD値が 378675以上
4.5以上   Release DWORD値が 378389以上
4.5未満   Release キーが存在しない
```

※OS毎のRelease DWORD値
----
Phase1:Win10登場前。

|Version	|OS不問	|Vista	|Win7SP1	|Win8	|Win8.1	|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|4.5	|378389	|←	|←	|←	|←	|
|4.5.1	|OS個別	|378758	|←	|←	|378675	|
|4.5.2	|379893	|←	|←	|←	|←	|

Phase2:Win10は4.6以上が必ずインストールされている

|Version	|OS不問	|Vista	|Win7SP1	|Win8/8.1	|Win10|
|:--:|:--:|:--:|:--:|:--:|:--:|
|4.6	|OS個別	|393297	|←	|←	|393295	|

Phase3:Vistaサポート終了以降

|Version	|OS不問	|Win7SP1/8/8.1	|Win10|AU|CU|FCU|RS4|RS5|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|4.6.1	|OS個別	|394271	|394254	|N/A |N/A |N/A  |N/A  |N/A  |
|4.6.2	|OS個別	|394806	|←	|394802 |N/A |N/A  |N/A  |N/A  |
|4.7	|OS個別	|460805	|←	|←	|460798 |N/A  |N/A  |N/A  |
|4.7.1	|OS個別	|461310	|←	|←	|←	|461308 |N/A  |N/A  |
|4.7.2	|OS個別	|461814	|←	|←	|←	|←	|461808 |461814  |
|4.8	|OS個別	|******	|←	|←	|←	|←	|←	|******  |



※AU=Windows 10 バージョン 1607 (Anniversary Update)
※CU=Windows 10 バージョン 1703 (Creators Update)
※FCU=Windows 10 バージョン 1709 (Fall Creators Update)
※RS4=Windows 10 バージョン 1803 (April 2018 Update)
※RS5=Windows 10 バージョン 1809 (October 2018 Update)

Release値判定コマンド
----
> reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"| find "Release"


----

How to: Determine Which .NET Framework Versions Are Installed
----
https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx

----

2016 年 1 月 12 日からはマイクロソフトは .NET Framework 4、4.5、および 4.5.1にセキュリティ更新プログラム、テクニカルサポートや修正プログラムを提供されなくなります。.NET Framework 4.6.1、4.6、4.5.2、3.5SP1 を含む他のすべてのバージョンは、それらの確立されているライフサイクルの間サポートされます。
http://blogs.msdn.com/b/dotnet/archive/2015/12/09/support-ending-for-the-net-framework-4-4-5-and-4-5-1.aspx

----

.NET Framework 4.6.2 用のブートストラップ (setup.exe) の問題
https://blogs.msdn.microsoft.com/jpvsblog/2016/09/13/netfx4-6-2bootstrapissue/

----

Welcome to the .NET Framework 4.7.1 Early Access!
https://blogs.msdn.microsoft.com/dotnet/2017/08/07/welcome-to-the-net-framework-4-7-1-early-access/

----

Microsoft .NET Framework 4.7.1 は、互換性が高い、Microsoft .NET Framework 4、4.5、4.5.1、4.5.2、4.6、4.6.1、4.6.2、4.7 のインプレース更新です。インターネットに接続できないため Web インストーラーが使用できない場合にオフライン パッケージを使用できます。
 
----

Announcing the .NET Framework 4.7.2
https://blogs.msdn.microsoft.com/dotnet/2018/04/30/announcing-the-net-framework-4-7-2/?utm_source=vs_developer_news&utm_medium=referral
pythonの辞書の引き数での展開


```py 
>>> def main(u,i):
...     print "u are " + u
...     print "i am " + i
... 
>>> config = {}
>>> config["i"] = "me"
>>> config["u"] = "you"
>>> config
{'i': 'me', 'u': 'you'}
>>> 
>>> main(**config)
u are you
i am me
>>> main(*config)
u are i
i am u
```