OmniAICreator/Qiita-1.07M huggingface dataset:
【Swift】reduceを使って文字列から"\r\n"、"\n"を抜く

# はじめに

表示領域の節約のために、文字列から改行コード(`\r\n`、`\n`)を抜いて代わりにスペース(`" "`)を入れた文字を表示させるという仕様が、担当しているサービスにありました。

これを簡潔に書くと以下のようになると思います。

```swift
let text = "このテキスト内には\n改行コード\r\nが含まれてします。\n"
var noNewLineText = text.stringByReplacingOccurrencesOfString("\r\n", withString: " ", options: [], range: text.startIndex..<text.endIndex)
noNewLineText = noNewLineText.stringByReplacingOccurrencesOfString("\n", withString: " ", options: [], range: noNewLineText.startIndex..<noNewLineText.endIndex)
print(text) //このテキスト内には 改行コード が含まれてします。
```

同じメソッドを複数回呼び出したり、`var`を使って再代入するなどあまりSwiftらしい書き方とは言えないものになってしまっています。

### reduceを使う

`\n\r`、`\n`を配列に持たせて、reduceを使ってみましょう。

```swift
let text = "このテキスト内には\n改行コード\r\nが含まれてします。\n"
let noNewLineText = ["\r\n", "\n"].reduce(text) {
    return $0.0.stringByReplacingOccurrencesOfString($0.1, withString: " ", options: [], range: $0.0.startIndex..<$0.0.endIndex)
}
print(noNewLineText) //このテキスト内には 改行コード が含まれてします。
```

初期値を`text`とすることで、初回の`$0.0`は`text`となります。その時の`$0.1`は`\r\n`なので、返す値は`text`中の`\r\n`が`" "`に置き換えられた`String`となります。
そのため、次の`$0.0`は`text`中の`\r\n`が`" "`に置き換えられた`String`なので、最終的に出力される値は、`text`中の`\r\n`と`\n`が`" "`に置き換えられた`String`となります。

このようにreduceでも該当の文字を除外することが簡単にできます。
{ellipse} 確率楕円を描く

# やりたいこと
・2D散布図を描画
・プロットの分布を2D正規分布で近似
・プロットの存在確率を示す確率楕円を描く

# 0. サンプルデータ
回転楕円みたいな分布を作る。

```r
set.seed(13)
dat0 <- matrix(rnorm(1000), , 2)
dat0[,1] <- 2 * dat0[,1]

sita <- pi/3
rot <- matrix(c(cos(sita), -sin(sita), sin(sita), cos(sita)),2)

dat <- data.frame(dat0 %*% rot)
```
<img width="176" alt="スクリーンショット 2016-09-02 15.12.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/92401/985f39f4-eca3-a9cb-3cd6-f6802229232a.png">
# 1. 確率楕円の算出

`ellipse::ellipse`を使って、楕円の中心を`centre`、描きたい確率範囲を`level`で与える。

```r
ellipse(cov(dat), centre=apply(dat, 2, mean), level=0.95)
```

# 2. 描画

### 楕円データの準備

```r
level <- seq(0.5, 0.95, by=0.05)

datE <- NULL
for(i in level){
  datE <-rbind(datE, cbind(i, ellipse(cov(dat), centre=apply(dat, 2, mean), level=i)))
}
datE <- data.frame(datE)
datE$i <- factor(datE$i)
```
<img width="179" alt="スクリーンショット 2016-09-02 15.29.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/92401/30877111-42aa-c404-ee2b-5af854b24f7d.png">

### 描画

```r
ggplot()+
  layer(
    data = dat,
    mapping = aes(x=X1, y=X2),
    geom = "point",
    stat = "identity",
    position = "identity"
  )+
  layer(
    data = datE,
    mapping = aes(x=X1, y=X2, color=i),
    geom = "path",
    stat = "identity",
    position = "identity"
  )+
  scale_color_manual(values=grey(seq(0, 200, length=10)/255))+
  theme_bw()
```
<img width=550, src=https://qiita-image-store.s3.amazonaws.com/0/92401/1aad84a5-f8db-6422-e8b6-b632ad1d2968.png>

`layer`を久しぶりに使ったら`position`表記が必須になったようで戸惑った。


### 参考
書いたあとこんなのを見つけて…。
何かパラメータいじったら楕円になりそうな気がしなくもなくもないですね〜。

```r
ggplot(dat, aes(X1, X2))+
  geom_density2d(n=10)+
  geom_point()
```
<img width="550" alt="スクリーンショット 2016-09-02 15.47.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/92401/b5d56034-1060-ad92-1278-1b40ba8a421b.png">
CakePHP1.3.21なプロジェクトを、PHP5.6.17のビルドインサーバで、DebugKitも含めて華麗に起動する

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">PHP5.6のビルドインサーバで、CakePHP1.3.21をDebugKitも含めて（Pluginのwebrootルーティングも含めて）綺麗に動かすまで頑張ってるの、たぶん俺くらい</p>&mdash; k1LoW (@k1LoW) <a href="https://twitter.com/k1LoW/status/766604523649376256">2016年8月19日</a></blockquote>

CakePHP1.3.21で作られたアプリケーションをPHP5.6.17のビルドインサーバで確認したいとき、ありますよね？

ありますよね？

ありますよね？

## CakePHP1.3.21はビルドインサーバで動くのか

shin1x1さんの[コントリビュート](https://github.com/cakephp/cakephp/commit/9cbc301)により、CakePHP1.3.21は、特に手を入れずにビルドインサーバで動くようになりました。

```sh
$ php -S localhost:3000 -t app/webroot
```

で起動できます。

しかし、

実は、このままだとDebugKitなどは綺麗には表示されないのです。

<img width="790" alt="ScrenCaptured 2016-09-02 15.28.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/808/ed9f4344-1786-61a0-f047-86d8ec4d43ec.png">

これはプラグインのCSSやJavaScriptのパス解決がうまくいっていなからです。

## 綺麗に動かしたい

ということで、app/webroot/index.php にさらにパッチを当てます。

```diff
--- index.php	2016-09-02 15:04:53.000000000 +0900
+++ index.mod.php	2016-09-02 15:06:14.000000000 +0900
@@ -74,6 +74,9 @@
 		}
 	}
 	if (php_sapi_name() == 'cli-server') {
+		if ($_SERVER['REQUEST_URI'] !== '/' && file_exists($_SERVER['DOCUMENT_ROOT'] . $_SERVER['REQUEST_URI'])) {
+			return false;
+		}
 		$_SERVER['PHP_SELF'] = '/'.basename(__FILE__);
 	}
 	if (!include(CORE_PATH . 'cake' . DS . 'bootstrap.php')) {
```

そして、起動コマンドにもひと工夫加えます。

```sh
$ php -S localhost:3000 -t app/webroot app/webroot/index.php
```

すると！

<img width="791" alt="ScrenCaptured 2016-09-02 15.30.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/808/166571fc-e072-ada0-1a78-61483ad4da48.png">

これで無事CakePHP1.3.21なプロジェクトもストレスなく確認ができますね！
モーダルウィンドウのヘッダの色付 [バッドノウハウ]

```html
<div class="modal" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content panel-warning">
      <div class="modal-header panel-heading">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">
          ×
        </button>
        <h4 class="modal-title" id="myModalLabel">
          タイトル
        </h4>
      </div>
      <div class="modal-body">
        本文
      </div>
      	︙
      フッター（手抜き）
      	︙
    </div>
  </div>
</div>
```
アプリ組み込みのWebビューによるGoogle OAuth認証リクエストが遮断されます

# ソース
https://developers.googleblog.com/2016/08/modernizing-oauth-interactions-in-native-apps.html

※11/29追記
今更ですが日本語のページも見つけたのでリンクを置いておきます。
https://googledevjp.blogspot.jp/2016/09/modernizing-oauth-interactions-in-native-apps.html

# 概要
Googleが、アプリ組み込みのWebViewによるGoogleのOAuth認証を遮断することを発表しています。
これにより、以下のWebViewによるOAuth認証ができなくなります。

- Android
    - WebView
- iOS
    - UIWebView, WKWebView

安全かつシームレスな認証のため、OAuth認証はアプリごとではなくデバイスごとに行いたいという背景があるようです。

**2016/10/20**から、上記WebViewを使用したアプリの新規登録を禁止し、またWebViewを使用した既存アプリにてOAuthクライアント向けに通知を行うようになります。
**2017/04/20**から、上記WebViewによるGoogle OAuth認証が遮断されます。

近々アプリのリリースを考えている方は対応する必要がありそうです。

# 代替案
### デバイスに入っているブラウザを使用する
アプリからデバイスに入っているブラウザを呼び出し、そのブラウザでOAuth認証を行います。
AndroidではChrome、iOSではMobileSafariと連携することになります。

### ライブラリを使用する
Google Sign-In (Google公式)

- [Google Sign-In for iOS](https://developers.google.com/identity/sign-in/ios/)
- [Google Sign-In for Android](https://developers.google.com/identity/sign-in/android/)

AppAuth

- [AppAuth for iOS and Mac OS](http://openid.github.io/AppAuth-iOS/)
- [AppAuth for Android](http://openid.github.io/AppAuth-Android/)

Windows向けサンプル

- https://github.com/googlesamples/oauth-apps-for-windows


### デバイスのブラウザと連携しているWebViewを使用する
アプリ内でOAuth認証が完全にできなくなるのかというとそうではなく、デバイスの情報と連携する以下のWebViewを使用すればOAuth認証は可能のようです。
単にアプリ内でやるなという意図ではなく、デバイスごとにOAuth認証させたいという意図なのでしょうね。

- Android
    - Chrome Custom Tabs(Chrome 45以降、Support Library ver23以降)
- iOS
    - SFSafariViewController(iOS9以降)
NativeScriptでちゃんとAppStore申請が通る話

マルチプラットフォーム開発で不安になるのは、AppleのAppStoreで本当に審査が通るのかということです。

特にNativeScriptは実例に乏しく、これで作ったアプリがちゃんと審査に通るかはかなりの懸念事項となります。
弊社は一般公開しないクライアント様向けのマルチプラットフォームアプリの開発環境としてNativeScriptを利用していますが、ストア申請を伴う案件があり事前に調査をした事があります。

その昔、Adobe FLASHを使ったアプリはAppStoreには登録できないとアップル社が公言したというのが話題になったのは皆さん記憶にあると思います。
アップル側の主張としては、iOSでは仮想マシンで動くアプリは許可しないというものでしたが、今その手の単語で検索しても、仮想通貨は使ってはいけませんといったものばかり引っかかって、仮想マシンが云々なんてのはひっかかりません。
方針が変わったのか、ネットは広大なのでどこかに埋もれてしまったのか・・・。

その頃の記憶がある開発者としては、UIWebViewもしくはWKWebViewを利用するhtml5系のアプリなら大丈夫だろうとは思えても、単体のJavaScript実行エンジンを利用している点で、NativeScriptは仮想マシン上で動くとみなされる恐れから逃れる事はできません。

それを言い出したら、XamarinだってUnityだってmonoで動いてるじゃなんとなるので、じゃあ大丈夫かとも思うのですが、それは「後ろの車も速度超過してたじゃんおまわりさん！　なんで先頭の俺だけ！」ってごねてるのと同じレベルなので安心はできません。

まず、NativeScriptの審査通過事例としては、公式のデモアプリがあります。
これだけ見て、じゃあ大丈夫だと言えるほどには世の中は簡単にGOが降りないのです。

ここで、NativeScriptの公式ドキュメントの解説を見てみることにしました。
http://developer.telerik.com/featured/nativescript-works/

>Everything starts with JavaScript virtual machines, as they’re what NativeScript uses to execute JavaScript commands. 

うん、めっちゃ仮想マシンって言い切ってますね。大丈夫なのか。
さらに読んでいくと、

>NativeScript uses V8 on Android and JavaScriptCore on iOS. 

iOSはJavaScriptCoreとな？
実はこれ、公式で用意されているJavaScript実行エンジンなんですね。
https://developer.apple.com/library/tvos/documentation/Carbon/Reference/WebKit_JavaScriptCore_Ref/index.html

つまり、NativeScriptは公式に用意されているframeworkを用いてJavaScriptを動かしてるに過ぎませんというスタンスで、確かにこれなら独自の仮想マシンではないため、アップルもケチがつけられません。

詳しい動作原理は上記の公式解説サイトに書いてあるので目を通すとなかなか良く出来ている事がわかります。

さて、結論ですが、弊社の作成したNativeScriptアプリは、無事AppStoreの審査を通りました。
**皆さん、どんどんNativeScriptでアプリを作って、少ない手間でiOS版とAndroid版の両展開でウハウハになりましょう！**
[Git] SourceTree でファイル内の一部のコードのみをコミットする方法

# SourceTree でファイル内の一部のコードのみをコミットする方法

## 背景

いままでファイル内の一部のコードだけをコミットしたい場合は,
一旦バックアップを取ってコミットしないコードを削除していました。

かなり無駄な方法を取っていたのですがSourceTreeをいじっていたら
一部のコードのみをステージにあげてコミットする方法を見つけたのでご紹介いたします。

## 方法

1. 変更したい部分を選択して, 右上のにある"選択した行をステージへ移動" をクリック
2. 後はいつもどおりコミットすれば, 変更したいコードのみがコミットされます


![part_commit_by_sourcetree.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/74135/6e5853f0-c720-660f-c0a8-fd8ed93f34ca.gif)


## まとめ
コマンドの git add -p でやろうとしたのですが行単位でなぜかできなかったので, 
もしコマンドでやる方法があれば教えていただけたら嬉しいです。
Node.jsでコマンドライン引数を取得する

実装段階で値を変えながら試したい場合に、毎回忘れてしまうのでメモしておく。

## コマンドライン引数を渡す
通常通り、引数を渡します。

```terminal:terminal
$ node test.js aaa bbb ccc ddd eee
```

## コマンドライン引数を受け取る
### 取得するインデックスの場所
少し注意が必要です。
C言語などでは上記```aaa```はargv[0]で取得できますが、Node.jsではargv[2]となります。

|インデックス|内容|
|:------:|:-:|
|0|node    |
|1|test.js |
|2以降|コマンドライン引数で渡される値    |


### コードでの受け取り
`process.argv[int]`で値を受け取ります。
`argv`だけでなく、`process`を忘れないようにしましょう。

```js:test.js
for(var i = 0;i < process.argv.length; i++){
  console.log("argv[" + i + "] = " + process.argv[i]);
}
```

出力結果

```terminal:terminal
argv[0] = node
argv[1] = /workspace/test.js
argv[2] = aaa
argv[3] = bbb
argv[4] = ccc
argv[5] = ddd
argv[6] = eee
```


以上です。
Docker ComposeでPritunl使ってOpenVPN環境を整える。


## はじめに

こちらの[投稿](http://qiita.com/to_obara/items/0622bdc5cacaa2758057)をみて、[Pritunl](https://pritunl.com/)をDocker上で構築してみたところ、利用されているDocker Imageが最新バージョンの[Pritunl](https://pritunl.com/)に対応していなかったようなので、あらためてDocker Composeを利用して環境を構築してみました。

## 構築イメージ

networkについては[以前の投稿](http://qiita.com/cha2maru/items/6fc8d4468db381a4f175)のように、ポート開放専用コンテナを作成し、他のコンテナは専用コンテナのnetworkを利用する形で。
Mongodbについては[Officialイメージ](https://hub.docker.com/_/mongo/)を利用し、Pritunlについては比較的ビルド頻度の高い[fridus/pritunl](https://hub.docker.com/r/fridus/pritunl/)を利用しました。

```yaml:docker-compose.yml
network:
  image: busybox
  ports:
    - "127.0.0.1:9700:443"
    - "1194:1194/udp"
    - "1194:1194/tcp"
  restart: always
  tty: true
mongo:
  image: mongo
  volumes:
    - ./mongo:/data/db
  restart: always
  net: container:network
pritunl:
  image: fridus/pritunl
  privileged: true
  environment:
    - MONGO_URI=mongodb://127.0.0.1:27017/pritunl
  restart: always
  net: container:network
```

## 利用方法

docker-compose.ymlと同じ階層にmongoディレクトリを作った後は
docker-compose up -d
で立ち上がります。
管理コンソールはローカルホストからのアクセスに限定しているのでご注意を。

## 終わりに

勉強がてらPritunlを使ってOpenVPNを立ててみたのですが、VPS一台しか管理してない環境だとどう使えばいいのやら・・・
また、Dockerで構築したOpenVPNからDockerホスト自身、もしくは別コンテナにアクセスするにはどうしたらいいのかわからなくてまだ何も活かせてないです。

（できたら別コンテナで動かしているプロキシを利用したいのだけど、どうやればいいのやら・・・同じようにネットワークコンテナに相乗りすれば大丈夫だろうけど、docker-compose.ymlが肥大化するのも嫌だし・・・）

誰か、VPS1台しかなく、他に常時起動しているマシンがない状態でVPNを立てることで幸せになれる何かがあればぜひ教えて下さい
よく分からないサーバーで何が動いているのか調べるtips

#プロセスを調べる
    ps aux
    pstree

#CPUとかメモリの利用量を調べる
    top

#networkの状態を調べる
    netstat

#スケジューリングされているスクリプトを調べる
    crontab -e

他にも「こんなコマンドあるよ」とか「こんなオプションあるよ」とか教えて下さい！
CentOS6での１台でnfs-server、nfs-clientを動かした時の問題

# CentOS6での１台でnfs-server、nfs-clientを動かした時の問題

普通に考えたら１台のサーバでnfs-server、nfs-client同時実行で自分自身にnfs mountなんて設定はやらないので問題にはならないとは思いますが、dev環境作成等、本番同様の環境構築を一台で行うときにnfs-serverとnfs-clientが同居した時に起動時、終了時のマウントのタイミングについての問題です。

## nfsのマウント、アンマウントのタイミング

nfsサーバの自動起動をONにすると

```shell-session
chkconfig nfs on
```

rc系に放り込まれるserver側の主要なリンクは以下のとおりとなります

* /etc/rc3.d/S30nfs
* /etc/rc0.d/K60nfs
* /etc/rc6.d/K60nfs

nfsのマウント、アンマウントのタイミングがnetfsで行っているので

* /etc/rc3.d/S25netfs
* /etc/rc0.d/K75netfs
* /etc/rc6.d/K75netfs

明らかに起動時はマウントデーモンが起動前にnfs mountを行い（失敗する）  
シャットダウン時はマウントデーモンが死んだ後に unmountを行います（もちろん失敗）

なので、nfs-server、nfs-clientを一台に同居させるときはnetfsの起動、終了のタイミングを変更する必要があります。

## netfsの起動、終了のタイミング変更

単純にmvでリネームでOK

```shell-session
# mv /etc/rc3.d/S25netfs /etc/rc3.d/S31netfs
# mv /etc/rc0.d/K75netfs /etc/rc0.d/K50netfs
# mv /etc/rc6.d/K75netfs /etc/rc6.d/K50netfs
```

これで、起動、終了が問題なく行えます

## ansible playbookの作成

こっちが本題です。
上記の事象を加味してansible playbookを作成しようと思ったのですけど、ansibleのマニュアルを読む限り、リモートでのコピーはあるのですがファイルの移動が見当たりません。
（知ってる方いたら求むです）
単純にcommand等でmvを行ったら冪等性が保たれない（再実行でエラーになるかも）なので、真剣にplaybookを書いたらこんな感じなりました。

```yaml
- name: Check /etc/rc3.d/S25netfs
  stat: path=/etc/rc3.d/S25netfs
  register: rc3netfs

- name: Setting Startup mount timing(develop)
  shell: mv /etc/rc3.d/S25netfs /etc/rc3.d/S31netfs
  when: 
    - inventory_hostname in groups['develop']
    - rc3netfs.stat.exists

- name: Check /etc/rc0.d/K75netfs
  stat: path=/etc/rc0.d/K75netfs
  register: rc0netfs

- name: Setting rc0 unmount timing(develop)
  shell: mv /etc/rc0.d/K75netfs /etc/rc0.d/K50netfs
  when: 
    - inventory_hostname in groups['develop']
    - rc0netfs.stat.exists

- name: Check /etc/rc6.d/K75netfs
  stat: path=/etc/rc6.d/K75netfs
  register: rc6netfs

- name: Setting rc6 unmount timing(develop)
  shell: mv /etc/rc6.d/K75netfs /etc/rc6.d/K50netfs
  when: 
    - inventory_hostname in groups['develop']
    - rc6netfs.stat.exists
```

※もう一度書け言われると辛いのでメモ書き代わり。。。
Install confluent-kafka for Python on Ubuntu

`confluent-kafka` はネイティブ `librdkafka` を利用しているため、インストールはやや面倒くさいです。

いちようメモをとっておきましょう：

まずは必要なパーケージを入れておく：

```
apt-get install python-pip
apt-get install python2.7-dev
apt-get install software-properties-common

```

次は **confluent** 社のリポジトリを追加する：

```
wget -qO - http://packages.confluent.io/deb/3.0/archive.key | sudo apt-key add -
add-apt-repository "deb [arch=amd64] http://packages.confluent.io/deb/3.0 stable main"
```


最後は `librdkafka` と `confluent-kafka` をインストールする：

```
apt-get update
apt-get install librdkafka-dev
pip install confluent-kafka
```

以上です。
storyboard上で、UIViewに影や、角丸、線を入れる方法


## 角丸 & 影 にする方法

![image](https://qiita-image-store.s3.amazonaws.com/0/37406/b21e13e9-761e-524d-5d71-9c5277152295.png)

ポイント：　影をつける場合は、masksToBoundsを**false**にする必要があります。

## 線（border)を入れる方法

![image](https://qiita-image-store.s3.amazonaws.com/0/37406/18e92c4a-357d-10cb-2ac9-9956a294e30a.png)


で、どちらも実際にシミュレータや実機で実行しないと反映されないのでご注意を！！

参考にさせて頂いたサイト様
http://edywrite.blogspot.jp/2015/08/swiftstoryboarduiview.html
http://qiita.com/k-yamada@github/items/d64d2a22aa8995474c37


UIButtonのテキストのminimumScaleFactorで、端末サイズを意識したフォントサイズの拡縮もいじれたらなーとおもいつつ調べましたが、
できませんでした。。
だれか知ってたら教えてくださいｗ汗（コードじゃない方法で）
http://kechengpuzi.com/q/s35860102


というか、@IBDesignableというもので、
storyboard上でリアルタイムで角丸や、枠線など装飾できる方法があっった！！！！！

http://qiita.com/MilanistaDev/items/ba85a0bc557681b8041e

こんな素晴らしいものがあったのか、もっと早くから知りたかった！
AWS SDK for JavaScript (Node.js) で期限付きURLの発行

# はじめに
[**AWS SDK for Ruby バージョン 2 で期限付きURLの発行**](http://qiita.com/kooohei/items/e473a6749c5a650d8e0c)の内容のJavaScriptバージョンです。
なので対象の準備とかは省略します。

また、今回はNode.jsでの作成となります。


# スクリプト
**bucketname**、**objectname**、**uploadfile**と**アクセスキーID**と**シークレットアクセスキー**は適宜変更してください。
バケットのリージョンをTokyoにしなかった場合も適切なリージョンに変更する必要があります。

```js:presigned_url.js
var AWS = require('aws-sdk');

var bucketname = "kohei-no-bucket";    // バケット名
var objectname = "ceresso.png";        // オブジェクト名

AWS.config.update({
    "accessKeyId": "********************",                          // アクセスキーID
    "secretAccessKey":"****************************************",   // シークレットアクセスキー
    "region": "ap-northeast-1"                                      // Tokyoリージョン
});

var s3 = new AWS.S3();
var params = {Bucket: bucketname, Key: objectname, Expires: 60};  // Expires:有効期限(秒)
s3.getSignedUrl('getObject', params, function (err, url) {
    console.log(url);
});
```

aws-sdkをインストールしておくのも忘れずに。

```bash:aws-sdkインストール
$ npm install aws-sdk
```


# 実践！

```bash:URL発行
$ node presigned_url.js
https://kohei-no-bucket.s3-ap-northeast-1.amazonaws.com/ceresso.png?AWSAccessKeyId=********************&Expires=1472183082&Signature=gcmfSyy1xxWqAQnZANxNm1sWRXk%3D
```


# おわりに
ポイントは[getSignedUrl](http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property)です。Rubyでの[presigned_url](http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Object.html#presigned_url-instance_method)にあたります。
ただ、Rubyの場合は「**604800秒(１週間)**」の制限がありましたがJavaScriptの場合だとドキュメントに記載がないのでそれがないみたいで、期限付きURLも問題なく発行できました。
となると今回の場合は「**AWS SDK for JavaScript**」を利用した方が良さそうですね。
失敗 > 長さ0の文字列をListにAddした場合の処理

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

数日前から遭遇していた不具合。
ようやく不具合の症状が見えてきた。

主な処理は

- TStringListにAddする
- TStringListから取得する
  - 取得したものがLength=0の場合は処理しない
- 処理が成功したらTStringListから取り除く

2つの失敗があった。

- TStringListにAddする
  - ""でもAddしていた
- TStringListから取得する
  - 取得したものがLength=0の場合は処理しない
  - ""がAddされた場合、Listから取り除かないかぎり、ずっとこちらになる

以下に失敗例を示す (変数名は適宜変更した)

```失敗.cpp
while(1) {
    Sleep(1000);
    String txt = get1stFromList();
    if (txt.Length() == 0) {
        continue;
    }
    // txtの処理
}
```

一度Listに""が入ると、`//txtの処理`に永遠にいかなくなる

以下のような変更が必要だろう。

```変更.cpp
while(1) {
    Sleep(1000);
    String txt = get1stFromList();
    if (txt.Length() == 0) {
        remove1st();
        continue;
    }
    // txtの処理
}

void remove1st(void) {
    // ListのCountが1以上の時に1つ目を消す
    // ListのCountが0の時は何もしない
}
```

上記のような無限ループに落ちいったことが分かるような仕組みが必要だ。

Addするときに""はAddしない処理も別途追加した。
環境変数による AWS CLI のプロファイル切り替えをうまいこと

aws cli のプロファイル設定を切り替えたり、無効にしたりしたい。
ふとした拍子に実行したくないし、ヘンなプロファイルでうっかり実行したくない。
場合によっては同じアカウント内で権限を切り分けて異なるIAMを使うこともあるじゃない。

aws のプロファイルを、デフォルトのプロファイルを作らずに

```
aws configure --profile aaa
aws configure --profile bbb
```
とかで作ってあったとして、

環境変数をつけたり外したりすればいいかな？と思う。

安直に、bashrc に書くなり、別ファイルに書いておいて bashrc, zshrc で source する。

```
alias aws-aaa 'export AWS_DEFAULT_PROFILE=aaa'
alias aws-bbb 'export AWS_DEFAULT_PROFILE=bbb'
```
`aws-aaa` と実行すると aaa のアカウントで aws コマンドを実行できるようになる。

または、これだと実行終了後にもコマンドを打てる状態で残るので危ないと思う場合は

```
alias aws-aaa='env AWS_DEFAULT_PROFILE=aaa PS1="${PS1}[aws-aaa]$ " ${SHELL}'
alias aws-bbb='env AWS_DEFAULT_PROFILE=bbb PS1="${PS1}[aws-bbb]$ " ${SHELL}'
```
みたいにしておいて、

`aws-aaa` で aws コマンドを使えて、`exit` すればawsコマンドのプロファイルは消える、とかどうだろうか。
やっつけだけど、プロンプトが変われば混乱しないかも。
Unity　Editor拡張を使ってpersistentDataPathフォルダをFinderかExplorerで開く


    /// <summary>
    /// PersistentDataPathをOSごとに判定して開く
    /// </summary>
    [MenuItem("Assets/Open PersistentPath")]
    public static void OpenPersistentPath()
    {

        if (Application.platform == RuntimePlatform.OSXEditor)
        {
            System.Diagnostics.Process.Start(Application.persistentDataPath);
        }
        else if (Application.platform == RuntimePlatform.WindowsEditor)
        {
            EditorUtility.RevealInFinder(Application.persistentDataPath);
        }

    }
concrete5でinc()が失敗するとき



```
予期せぬエラーが発生しました。
include(/Applications/MAMP/htdocs/concrete/themes/(テーマ名)/elements/side.php): failed to open stream: No such file or directory
```

こういう感じのエラーが出る。ちゃんと読み込み先のファイル入れてるのに出る。
調べると、テーマ名にハイフンとか空白が入っているとダメという説が出るが、正しいテーマ名を使ってても出ることがある。
http://worktoolsmith.com/2014/06/8816/

30分ほど調べた結果、キャッシュを消すと解決した。げっそり。
システムと設定 ＞ 最適化 のところに「キャッシュをクリア」というのがあるので、そこから消す。
ページ設定のほうからできる「ページキャッシュ」の設定はキャッシュしないようにしていたが、システム設定のほうからキャッシュ無効にしないと意味がないっぽい。
PostgreSQLのデータベースクラスタのサイズを汎用ファイルアクセス関数で算出する

昨晩、[U_ikki](http://qiita.com/U_ikki)氏の[PostgreSQLのデータベースクラスタのサイズをSQLで確認する](http://qiita.com/U_ikki/items/ce14c5809d8d38078673) という記事を見て、俺なら、データベースクラスタサイズ全体を算出するSQL関数を作るぜ、と思い作ってみた。

## 今回はplpgsql関数で作る
もちろん、C言語関数を使えば、こんなのはどうにでもなるのだが、それでは面白くないので、あえてplpgsql関数で作ってみる。

## 汎用ファイルアクセス関数
PostgreSQLにはディレクトリ内のファイルリストを取得したり、そのファイルのstat(サイズやアクセス日時、ディレクトリかどうかのフラグ)を取得できる[汎用ファイルアクセス関数](https://www.postgresql.jp/document/9.5/html/functions-admin.html#functions-admin-genfile)というSQL関数がある。

この関数のうち、pg_ls_dir(), pg_stat_file() という関数を使う。
pg_ls_dir()でファイルリストを取得。個々のファイルについて、ディレクトリがどうか判別し、ディレクトリならそのディレクトリ全体のサイズを取得する関数を再帰的に呼び出し、そうでなければpg_stat_file()でサイズを取得し、加算していくという単純な考え方で作ってみる。

## やってみた
データベースクラスタ全体のサイズを求める関数名は get_database_cluster_size() という、何のひねりもない名前にした。

~~~
[nuko@localhost test]$ vi get_size.sql 
[nuko@localhost test]$ psql postgres -U postgres -f get_size.sql 
CREATE FUNCTION
CREATE FUNCTION
[nuko@localhost test]$ psql postgres -U postgres -c "SELECT get_database_cluster_size()"
 get_database_cluster_size 
---------------------------
                 294310856
(1 row)
~~~

はい。なんか数値が出ましたね。
で、そのデータベースクラスタのサイズを du -s -b で算出する。

~~~
[nuko@localhost 9.4]$ du -s -b /home/nuko/pgdata/9.4
294310856	/home/nuko/pgdata/9.4
~~~

一致しましたね。やったね♪

## 注意点
汎用ファイルアクセスはPostgreSQLスーパーユーザ権限でないと動作しないので、get_database_cluster_size()の実行にもスーパーユーザ権限が必要です。

## SQL関数のコード
そんなに難しいコードではないけど、一応plpgsqlのコードを載せておきます。

~~~
CREATE OR REPLACE FUNCTION get_dir_size(path text)
 RETURNS integer
 LANGUAGE plpgsql

AS $function$
DECLARE
  files RECORD;
  stat RECORD;
  size INTEGER;
  dir_size INTEGER;
  target_size INTEGER;
BEGIN
  size = 0;
  FOR files IN SELECT pg_ls_dir(path) AS name LOOP

    -- RAISE NOTICE 'file name = %', path || '/' || files.name;

    SELECT * INTO stat FROM pg_stat_file( path || '/' || files.name );
    IF NOT FOUND THEN
      RAISE EXCEPTION 'file not found, %', files.name;
    END IF;

    target_size = stat.size;
    IF stat.isdir = 'f' THEN
      size := size + target_size;
    ELSE
      dir_size = get_dir_size(path || '/' || files.name) + target_size;
      size := size + dir_size;
    END IF;
  END LOOP;
  RETURN size;
END;
$function$;

CREATE OR REPLACE FUNCTION get_database_cluster_size()
 RETURNS integer
 LANGUAGE plpgsql
AS $function$
DECLARE
  size INTEGER;
  stat RECORD;
BEGIN
  SELECT * INTO stat FROM pg_stat_file('.');
  size = stat.size;
  size := size + get_dir_size('.');
  RETURN size;
END;
$function$;
~~~
RailsでDB2を扱う

RailsでDB2を扱う場合の注意点などをまとめたメモです。

## 導入方法
https://www.ibm.com/developerworks/jp/data/library/techarticle/dm-0705chun/

## 確認環境
ibm_db (3.0.3)
activerecord (4.2.6)

## マイグレーションの注意点
・マイグレーションでVARGRAPHIC型のカラムを追加するには「vargraphic」を指定
・マイグレーションで「integer」を指定するとlimit指定に係わらずINTEGER型となる
・マイグレーションで「boolean」を指定するとSMALLINT型となる
　※SMALLINT型を読み込むとboolean型として扱われる
　　数値を取得したい場合はカラム名の後ろに「_before_type_cast」をつける

```rb
class Sample < ActiveRecord::Migration
  def change
    create_table :sample do |t|
      t.string :test1, limit: 20     # =>VARCHAR
      t.vargraphic :test2, limit: 20 # =>VARGRAPHIC
      t.integer :test3, limit: 1     # =>INTEGER
      t.integer :test4, limit: 4     # =>INTEGER
      t.integer :test5, limit: 8     # =>INTEGER
      t.boolean :test6               # =>SMALLINT
    end
  end
end
```

・「bundle exec rake db:migrate:reset」はサポートされていない

## その他注意点
　・ハングアップすることがある？
　　複雑なSQLで構文エラーがあった時にRailsがハングアップすることがある。
　　to_sqlでSQLを取得し、find_by_sqlで直接実行すればハングアップせずに例外が発生する

　・TIMESTAMP型が文字列で取得されることがある？
　　TIMESTAMP型が文字列で取得されることがあった。
　　Active Recordのselectメソッドを使用しないようにすると時刻型で取得された。

## 参考
https://github.com/ibmdb/ruby-ibmdb/tree/master/IBM_DB_Adapter/ibm_db
Macに構築するIEプレビュー環境 modern.IE ＋ Virtual Box

# Macに構築するIEプレビュー環境 modern.IE ＋ Virtual Box

- MacOS上で動作するWindowsOSとIEなどのMicrosoftブラウザ
- OSを入れる箱の役割 ： 『Oracle VM VirtualBox』
- OSイメージファイル ： 『Microsoft Download virtual machines』などから入手

## Oracle VM VirtualBox

[Oracle VM VirtualBox](http://goo.gl/Lp3p6N) 

1. ［Platform］
2. ［Mac OS X］
3. ［dmg Image］ボタンを押下
4. インストール

## Microsoft Download virtual machines

[Microsoft Download virtual machines](https://goo.gl/PQhLrg) 

以下のとおり必要なOSイメージを選択してダウンロードする

### Virtual machine

以下から必要なOSとIEの組み合わせを選択（2016年09月現在）

- IE8 on Win7
- IE9 on Win7
- IE10 on Win7
- IE11 on Win7
- IE11 on Win81
- Microsoft Edge on Win 10 Stable (14.14393)

※ OS本体なのでファイル容量は大きく、ダウンロードにはある程度（数分〜数十分）時間を要します
※ IE7の提供は終了しています（2016年09月現在）
※ IE7はダウンロード済みの環境からAirDrop経由での共有が可能です
※ バージョンによりログイン画面が表示される際のパスワード ： Passw0rd!


### Select platform

1. ［VirtualBox］を選択


### Download

1. ［Download .zip］ボタンを押下
2. 数分〜数十分でダウンロードが完了する

### 解凍

1. zipファイルを解凍する
2. MacOS標準zip機能でzipファイル←→zip.zipファイルのループになる場合、StuffIt Expanderのようなサードパーティアプリを利用する
3. ovaファイル、またはovfファイルとvmdkファイルのセットが展開されたら解凍完了


## 起動

### 初回起動

1. VirtualBoxを起動
2. ovaファイル、またはovfファイルをダブルクリックで起動
3. ［アプライアンスの設定］画面において［インポート］ボタンを押下
4. ［Oracle VM VirtualBox マネージャー］画面の左メニューに出現したIE・OSメニューをダブルクリックで起動

### 2回めからの起動

1. VirtualBoxを起動
2. ［Oracle VM VirtualBox マネージャー］画面の左メニューからIE・OSメニューをダブルクリックで起動
jade(pug)内で使うHTMLに変数を使えるようにする。

jade(pug)は整形フォーマットを細かく指定できないのでどうにかならないか考えてみました。

追記 2016/9/2
gulpに登録したら動かなかったのでgulp-jade対策したものを追加しました。
追記 2016/9/3
→ この後知ったことなのですが、jadeのfilter機能を使うのがよさそうです。

# コマンドラインjade版
+ jade

```jade
.test
  -  var val1 = "hoge";
  -  var val2 = "fuga";
  -
    var b = `<ul>
        <li>${val1}</li><!--
        --><li>${val2}</li>
    </ul>`;
  !=b
```

+ html

```html
<div class="test"><ul>
    <li>hoge</li><!--
    --><li>fuga</li>
</ul>
</div>
```

これでHTMLを直接テンプレートかきるejsの優位性がなくなりそう


配列などの変数を改行させる方法
http://chaika.hatenablog.com/entry/2015/10/29/080000

を参考しました。


# gulp-jade対応版

```jade
.test
  - 
  -  var data = {url: 'http://github.com',title: 'GitHub',description: '便利'};
  -
    var template = (function() {/*
    <ul><!--
    --><li>${url}</li><!--
    --><li>${title}</li><!--
    --><li>${description}</li><!--
    --></ul>
    */}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1].replace(/\n|\r/g, "");
  -
    var html = template.replace(/\${(\w+)}/g, function(m, key) {
      var text = data[key] || '';
      return text;
    }).replace(/-->/g, '\n-->');
  !=html
```

```html
<div class="test"><ul><!--
--><li>http://github.com</li><!--
--><li>GitHub</li><!--
--><li>便利</li><!--
--></ul>
</div>
```
Rails 5でseedsファイルの作り方

開発中にseeds.ymlが作りたくて、実行コードをメモ代わりにペロッと。

# seeds.ymlを作る意味
アプリケーションを作る時にどうしても固定で保持したいデータを保存するのにseeds.yamlに使ってます。
データ量が少なかったらmodelにenumで持つのもありなのですが、10~100行くらいならseeds.ymlで持つのが楽かな…って思います。

# 実行コード
```rb
$ cd path/to/app_root # アプリのルートに移動
$ mkdir db/seeds # seedsディレクトリを作り、そこにymlを保存しておきます
$ rails c # コンソールを立ち上げます。
Loading development environment (Rails 5.0.0.1)

Frame number: 0/10
$ pry(main)> target_model = OriginalAreaToArea
=> OriginalAreaToArea(id: integer, original_area: string, area_id: integer)
$ pry(main)> target_records = target_model.all
  OriginalAreaToArea Load (0.3ms)  SELECT `original_area_to_areas`.* FROM `original_area_to_areas`
=> [#<OriginalAreaToArea:0x007facf9847378 id: 1, original_area: "Akasaka/Roppongi", area_id: 4>,
 #<OriginalAreaToArea:0x007facf9847198 id: 2, original_area: "Ginza/TokyoNihonbashi", area_id: 3>,
 #//..
 ]
$ pry(main)> write_filepath = "#{Rails.root}/db/seeds/#{target_model.to_s.underscore}.yml"
=> "/path/to/app_root/db/seeds/original_area_to_area.yml"
$ pry(main)> open(write_filepath,"w") do |write_file|
$ pry(main)*   write_file.puts target_records.to_yaml
$ pry(main)* end 
nil
$ pry(main)> quit

# rake db:seedで初期データを登録するため、データはクリーニングしておく
rake db:migrate:reset
```

あとは、`/db/seed.rb`に以下を追記する

```rb
Dir.glob("#{Rails.root}/db/seeds/*.yml").each do |yaml_filename|
  # yamlのファイル名から、対応するモデルクラスを特定し、クラスをロードする
  # 下記行が無いと、「ArgumentError: undefined class/module」が発生する。
  File.basename(yaml_filename,".yml").classify.constantize

  # yamlに記述されたレコードをDBに登録する。
  File.open(yaml_filename) do |load_target_yaml|
    records = YAML.load(load_target_yaml)

    records.each do |record|
      record.dup.save
    end
  end
end
```

seedデータを入れるときは、`bundle exec rake db:seed`で。

参考：
[RailsのDBの初期データ(rake db:seed用)をyamlで美しく管理する方法](http://qiita.com/yukimura1227/items/ff04eb6a771ffe1ab0b8)
自動erb->slimのgem使って辛かった話


erbファイルをガーッとslimにした（してもらった）ときにあった問題

http://qiita.com/mocchicc/items/abab4cdfac7b542742a6
この辺のやつ使って自動で変換したときに気をつけること。
気をつけることっていうか、あるある？

## タグ内のrails変数

たとえばこういうの

```erb
<p class="<%= :hoge if hoge? %>">ほげ</p>
```

こうなる

```slim
|  <p class=
= :hoge if hoge?
| ">ほげ
```

### 正しくは

こうだね

```slim
p class=(:hoge if hoge?) ほげ
```

## scriptタグ

```erb
<script>
  $(".hoge").addClass("pero");
</script>
```

こうなる

```slim
script
  |  $(".hoge").addClass("pero");
```

### 一応正しくは

こうであってほしい

```slim
coffee:
  $(".hoge").addClass "pero"
```

## erbコード

```erb
<!-- 上の方に divのはじまりとかはあるよ -->
  <p><%= check_box :hoge, :pero, {class: "hoge", "ng-model"=>"hoge_pero"}, true, false %> <%= label :hoge, :pero do %>ほげぺろ<% end %></p>
</div>
<% end %>
<%= f.hidden_field :moga, "ng-value" =>  "moga", required: true %>
```

```slim
p
  | <ruby code="= check_box :hoge, :pero, {class: "hoge", "ng-model"=>"hoge_pero"}, true, false %> 
  = label :hoge, :pero do ">ほげぺろ</ruby></p>
  -     </div>
  -     </ruby>
  -     <%= f.hidden_field :moga, "ng-value" =>  "moga", required: true
```

### つらい

```slim
/ 上の方でformとかdivとかのインデントがされてるとして
    p
      = check_box :hoge, :pero, {class: "hoge", "ng-model"=>"hoge_pero"}, true, false
      = label :hoge, :pero do
        | このまま会員登録をして進む
= f.hidden_field :moga, "ng-value" =>  "moga", required: true
```

こんな感じだったので直すのが大変だった。slim化gemがイケてなかったという話かもしれない。
ていうかファイル増える前にはやめのslim化を勧めます。
JSONで読み込んだモデルの色を変える


# colorDiffuse

`mesh.material.materials`で捜査してJSONの中身を見てみる

```javascript:model.json
"materials":[{
  "colorEmissive":[0,0,0],
  "DbgName":"_______-_03",
  "DbgIndex":1,
  "DbgColor":15597568, // 削除してもよさげ
  "visible":true,
  "blending":"NormalBlending",
  "depthTest":true,
  "opacity":0.5,
  "depthWrite":true,
  "wireframe":false,
  "transparent":true,
  "specularCoef":52,
  "shading":"phong",
  "colorSpecular":[0,0,0], // 鏡面反射
  "colorDiffuse":[0.886275,0.631373,0.639216] // 色
}, 
...
```

> 参考
[BlenderでエクスポートしたJSONがThree.jsで変な色になる問題が解決](http://abrakatabura.hatenablog.com/entry/2015/12/21/071507)

`mesh.material.materials`が配列になっているので、これを`for...of`で回してプロパティを書き換える。

```javascript:クリックで透明度の調整
const materials = mesh.material.materials;
for (let mat of materials) {
  mat.transparent = true; // これ忘れずに
  mat.opacity = (mesh.opacity === 1) ? 0.2 : 1;
}
```

検証：meshを作った後に`opacity`や`wireframe`は上書きすることができたが、`colorDiffuse`は上書きできなかった。色の変更は`color`を操作する。

# color

## Meshをつくる前に色を変える

### MeshFaceMaterial()を使用

```javascript
// MeshFaceMaterial：あらかじめジオメトリーにひもづけられたマテリアル
const loader = new THREE.JSONLoader();
loader.load('./data/model.json', (geometry, material) => {
  const faceMat = new THREE.MeshFaceMaterial(material);
  for (let mat of faceMat.materials) {
    mat.color = new THREE.Color(0xffcc88);
  }
  const mesh = new THREE.Mesh(geometry, faceMat);
  this.scene.add(mesh);
});
```

### Mesh()のみ使用

```javascript
const loader = new THREE.JSONLoader();
loader.load('./data/model.json', (geometry, material) => {
  for (let mat of material) {
    mat.color = new THREE.Color(0xcccccc);
  }
  const mesh = new THREE.Mesh(geometry, material[0]);
  this.scene.add(mesh);
});
```

## Meshをつくったあとに色を変える

```javascript:クリックしたら色が変わる
window.addEventListener('click', () => {
  const materials = this.mesh.material.materials;
  for (let mat of materials) {
    mat.color = new THREE.Color(0xff00cc);
  }
}, false);
```
AVFrameのtupleのデータをArrayで変換


<更新>
- 2016.06.02 - まあAVFrameに関しては全部無視してください。extended_dataの存在を今更気づきました。

僕は会社でiOSようの動画プレーヤーを作っている人です。
今年の後半は**Objective C**で作られているコードを**Swift 3**に変わる企画を立て、やってます。
実に楽しい作業です。
作業の中で一番面倒くさいところは、**C**で作成されている配列と**struct**に関連するものが多いです。そこで、ま、すぐれた方には簡単なことだと思いますが。僕にはどんでもない難しかったものなので、同じ悩みを持ってる方のため、ここに短いソースを上げてみます。

まずCでの**AVFrame**の一部です。

```
typedef struct AVFrame {
   ...
   uint8_t *data[AV_NUM_DATA_POINTERS]; // AV_NUM_DATA_POINTERS = 8
   ...
```
**C**の**AVFrame**の構造体はでコーディングされたデータをuint8_t型のポインターの配列の変数に保管しでいます。
問題は**swift**は**C**の配列を**tuple**と扱ってしまうことです。

**swift**で変わった**AVFrame**の一部です。

```
public struct AVFrame {
    public var data: (UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?, UnsafeMutablePointer<UInt8>?)

```

>tupleは目に見るのは楽だけど、実に使用するには沢山の問題があります。一々にハードコーディングするしかないし、配列の数がなん百、なん千、なん万を超えたら、Xcodeが気絶することもあります。なんでarrayでやってくれないのかな疑問です。

変更するコードは以下のようです

```
let tuplePointer: UnsafePointer<(UnsafePointer<UInt8>?, UnsafePointer<UInt8>?, ...)> = withUnsafePointer(to: $tuplePointer){$0}
let unsignedInteger8Buffer: UnsafePointer<UnsafePointer<UInt8>?> = UnsafePointer(tuplePointer.withMemoryRebound(to: (UnsafePointer<UInt8>?.self)!, capacity: 8){$0}
let bufferPointer: UnsafeBufferPointer<UnsafePointer<UInt8>?> = UnsafeBufferPointer(start: unsignedInteger8Buffer, count: 8)
let arr = Array(bufferPointer)
```

- **withMemoryRebound**関数はポインターの形態を変わる関数です。**to**の引数には変更したいタイプを入れて、**capacity**にはタイプのサイズに当たる単位を何個持つかを関数に知らせます。ここでは**AVFrame**が最大8個の**data**を持っているので、８に入れました。
- **UnsafeBufferPointer**を初期化しながら**start**引数に*unsignedIntegerBuffer*を入れて、**count**には8を入れます。
- **UnsafeBufferPointer**をArrayの初期化の引数で入れます。

で、簡単に**tuple**が**Array**で変わりますた。
Eclipse IDE for JavaEE環境でTomcat Managerを起動する

たまに忘れてしまうのでメモ

# Eclipseの入手
http://www.eclipse.org/downloads/packages/ からダウンロード
Eclipse IDE for Java EE Developers を選択
記事執筆時点ではNeonが最新
ダウンロード完了したら適当なフォルダに解凍

# Tomcatの入手
http://tomcat.apache.org/ からダウンロード
TomcatプラグインじゃなくてTomcat本体を落とす
記事執筆時点では9が最新
ダウンロード完了したら適当なフォルダに解凍

# サーバ追加
Eclipseの「Window」→「Show View」→「Others」で「Servers」を選択
Serversビュー内で右クリックして「New」→「Server」
「Apache」→「Tomcat vX.x Server (Xは適当なバージョン番号)」
「Next」を押して解凍したTomcatのフォルダを指定する

サーバ名の欄が選択できなくなる不具合がある
`{workspace-directory}/.metadata/.plugins/org.eclipse.core.runtime/.settings`内の
`org.eclipse.wst.server.core.prefs`と`org.eclipse.jst.server.tomcat.core.prefs`を削除
その後Eclipseを再起動すると直る

# 設定
EclipseのPackage ExplorerからServersを開くと「Tomcat vX.x Server at localhost-config」配下に設定ファイル一式がある

tomcat-user.xmlにユーザを追加

```xml
<tomcat-users>
  :
  (中略)
  :
  <role rolename="manager-gui"/>
  <user name="tomcat" password="s3cret" roles="manager-gui"/>
</tomcat-users>
```

server.xmlにコンテキストを追加

```xml
<Host>
  :
  (中略)
  :
  <Context path="/manager" docBase="${catalina.home}/webapps/manager" privileged="true"/>
</Host>
```

# アクセスする
`http://localhost:8080/manager/html`にアクセスするとマネージャの画面が表示される
ユーザとパスワードを聞かれるのでtomcat-user.xmlで設定したものを入力する

終わり！
System.Timeを使うときは気をつけよう

少なくとも[２００５年ごろには認識されている][hcafe]ことですが、一応メモ。これが理由か分かりませんが、現在ではこのモジュールに代わる`Data.Time`の利用が推奨されています。

# 問題点
`System.Time`には`TimeDiff`という日付の差を表現するデータ型と、それを正規化する`normalizeTimeDiff :: TimeDiff -> TimeDiff`という関数があります。`TimeDiff`の定義は次の通り。

```hs
data TimeDiff
 = TimeDiff {
     tdYear    :: Int,
     tdMonth   :: Int,
     tdDay     :: Int,
     tdHour    :: Int,
     tdMin     :: Int,
     tdSec     :: Int,
     tdPicosec :: Integer -- not standard
   }
   deriving (Eq,Ord,Read,Show)
```
`TimeDiff`の正規化というのは、可能な限り上位の時間単位を使った表現へ変換することです。（例：13ヶ月→1年1ヶ月）
ここで思うのは**「`TimeDiff`の正規化は無理筋なのでは・・・？」**ということ。月によって1ヶ月に含まれる日数が異なるからです。

というわけで試してみます。

```
Prelude> :m + System.Time
Prelude System.Time> let oct1 = toClockTime $ CalendarTime 2016 October 1 0 0 0 0 Saturday 0 "UTC" 0 False
Prelude System.Time> let nov1 = toClockTime $ CalendarTime 2016 November 1 0 0 0 0 Tuesday 0 "UTC" 0 False
Prelude System.Time> let d = nov1 `diffClockTimes` oct1
Prelude System.Time> d `addToClockTime` oct1
Tue Nov  1 09:00:00 JST 2016
Prelude System.Time> (normalizeTimeDiff d) `addToClockTime` oct1
Wed Nov  2 09:00:00 JST 2016
```

正規化した`TimeDiff`を足してやると日付が一日ずれてしまいました。
`normalizeTimeDiff`では1ヶ月を一律30日として計算しているためこのようなことが起こります。

```
Prelude System.Time> d
TimeDiff {tdYear = 0, tdMonth = 0, tdDay = 0, tdHour = 0, tdMin = 0, tdSec = 2678400, tdPicosec = 0}
Prelude System.Time> normalizeTimeDiff d
TimeDiff {tdYear = 0, tdMonth = 1, tdDay = 1, tdHour = 0, tdMin = 0, tdSec = 0, tdPicosec = 0}
```
ちなみに1年の方も一律に365日で計算されます。


[hcafe]:https://mail.haskell.org/pipermail/haskell-cafe/2005-January/008738.html
php+postgresqlでinsert後のレコードのidを取得する

# テーブルにレコード追加後、紐づくレコードを関連テーブルに追加したい時
```
<?php
//DB接続
$conn = pg_pconnect(****);

//sql文作成
$sql = "INSERT INTO users (name) VALUES('hoge') RETURNING id";

//sql発行
$result = pg_query($conn, $sql);

//結果配列を取得
$row = pg_fetch_row($result);

//$idに追加したレコードのidをセット
$id = $row[0];
?>
```
VMware vSphere PowerCLI で ゲストOSの情報をCSVにエクスポートする方法

以下のブログでやってることを実行したくてインストールした。

Get-VM・Get-VMguestで取得できる仮想マシン・ゲストOS情報とプロパティの一覧。VMware PowerCLI
http://blog.putise.com/get-vm%E3%83%BBget-vmguest%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%82%8B%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%83%BB%E3%82%B2%E3%82%B9%E3%83%88os%E6%83%85%E5%A0%B1%E3%81%A8%E3%83%97/

## 準備
#### ダウンロード
vSphere PowerCLI 5.5
https://my.vmware.com/jp/web/vmware/details?downloadGroup=PCLI550&productId=352

## 使う
PowerShell を起動してポリシーを変更する
```
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
```
これをしないと、PowerCLI起動してもエラーになる。

以下のPSファイルを ほげほげ.ps1 として保存して実行する。

```
$_USER="root"        #ユーザー名
$_PASS="パスーワード" #パスワード
$_SERV="192.168.XXX.XXX" #サーバーのIP

$_HOME="c:\temp"
$_DATE = Get-Date -Format "yyyyMMdd_HHmmss"
$_OUTP_VM="get-vm_$_DATE.csv"
$_OUTP_VMGUEST="get-vmguest_$_DATE.csv"
$_OUTP_VMDISK="get-disk_$_DATE.csv"

Add-PSSnapin VMware.VimAutomation.Core

cd $_HOME

Connect-VIServer -Server $_SERV -User $_USER -Password $_PASS

Get-VM | select Name,Version,Guest,Folder,ProvisionedSpaceGB,UsedSpaceGB |Export-csv $_OUTP_VM

$VMLIST = Get-VM 
Foreach($VM in $VMLIST ){
    $VM.Name
    $VM.Guest | select VmName,OSFullName,IPAddress,State,Disks,HostName,Nics,ScreenDimensions,VmId,VM,VmUid,GuestId,ExtensionData,Client,GuesetFamily | Export-csv  $_OUTP_VMGUEST -Append
    $VMGuest = Get-VMGuest $VM.Name 
    $VMGuest.Disks |select @{ Name = "Name" ; Expression= {$VM.Name}},CapacityGB,FreeSpaceGB,Path | Export-Csv $_OUTP_VMDISK -Append
}

Disconnect-VIServer -Server $_SERV -Confirm:$False
```
IntelliJ IDEAでPlantUMLを書く

# 概要
テキスト形式でUMLの図を表現できる[PlantUML](http://plantuml.com/)をIntelliJ IDEA上で書くための設定メモです。

# インストール
## プラグイン
* IntelliJ IDEAでSettings -> Pluginsを表示します。
* Browse Repositories... ダイアログでキーワード「plantuml」を入力し、「PlantUML integration」を選択・インストールします。再起動するとプラグインが有効になります。
![plantuml-intellij-01.png](https://qiita-image-store.s3.amazonaws.com/0/131679/8823c3c4-ad53-c8f4-ae4d-4ddebe9805de.png)

## Graphviz
シーケンス図以外を書く場合は[Graphviz](http://www.graphviz.org/Download.php)というソフトウェアが必要です。サイトからダウンロード・インストールします。

# 使い方
## 新規ファイル作成
* コンテキストメニューに各種UML図を作成するメニューが追加されていますので、最初はこれらを選択するとよいでしょう。

![plantuml-intellij-02.png](https://qiita-image-store.s3.amazonaws.com/0/131679/0a1338f1-4875-9982-8a7d-7fcc593472cf.png)

## 編集
* エディタとプレビューが同時に表示されます。
    * シンタックスハイライトも効いています。
    * エディタ側の修正はプレビューにリアルタイムに反映されます。

### シンタックスエラーがない場合
![plantuml-intellij-03.png](https://qiita-image-store.s3.amazonaws.com/0/131679/763988a5-6dab-ac35-d973-2805d9000a7e.png)

### シンタックスエラーがある場合
![plantuml-intellij-04.png](https://qiita-image-store.s3.amazonaws.com/0/131679/e4c2cae4-5448-7b58-65f3-115497396ef6.png)

## 図の保存
プレビューペイン上部のアイコンをクリックすると、画像の保存やクリップボードへのコピーができます。

# その他
PlantUMLそのものを軽く試してみたい場合は、下記ページなどでオンラインプレビューできます。2番目の方が好きですね。

* http://www.plantuml.com/plantuml/uml
* http://sujoyu.github.io/plantuml-previewer/
OpenCVの関数名を検索する

OpenCVを使っていると、ドキュメントが更新されていなかったり、間違っていたりすることがたまにあります。そんな時は現物を拠り所にするのが一番確実だと思います。
例えば、関数名がうろ覚えで、部分検索したいならこんな感じでしょうか。

```py
import cv2
items = dir(cv2)
for item in items:
    if 'Back' in item:
        print item
PCABackProject
SVBackSubst
calcBackProject
createBackgroundSubtractorKNN
createBackgroundSubtractorMOG2
```

私の環境では、BackgroundSubtractorは２種類使えることが分かりました。

参考: [How to find functions by name in OpenCV](http://www.pyimagesearch.com/2015/08/31/how-to-find-functions-by-name-in-opencv/)

[追記]
list comprehension を使えば一行で。

```py
print [x for x in dir(cv2) if "Back" in x]
```
DynamoDBのscanのFilterExpressionでネストしたクエリを使う


`FilterExpression`は`(条件1) OR ( (条件2) AND (条件3) )`の様にネストできる。

```
var item = 'hoge';
var shipping_state1 = 'shippingA';
var shipping_state2 = 'shippingB';
var params = {
  TableName: 'Item',
  FilterExpression: '(items = :items) AND ((shipping_state=:shipping_state1) OR (shipping_state=:shipping_state2))',
  ExpressionAttributeValues: {
	':items':item,
	':shipping_state1':shipping_state1,
	':shipping_state2':shipping_state2
  }
}
dynamodb.scan(params).promise().then(function(data) {
	console.log(data);
}).catch(function (error) {
	console.log(error)
})
```

`IN`を使う場合は`(キー IN (:候補1,:候補2,:候補3)`のようにする。

```
var item = 'hoge';
var shipping_state1 = 'shippingA';
var shipping_state2 = 'shippingB';
var params = {
  TableName: 'Site',
  FilterExpression: '(items = :items) AND (shipping_state IN (:shipping_state1,:shipping_state2,:shipping_state3))',
  ExpressionAttributeValues: {
	':items':item,
	':shipping_state1':shipping_state1,
	':shipping_state2':shipping_state2
  }
}
dynamodb.scan(params).promise().then(function(data) {
	console.log(data);
}).catch(function (error) {
	console.log(error)
})
```
Mosesの後輩への引き継ぎのためのまとめ


# この記事の目的
「言語処理研究室の後輩」が[Moses](http://www.statmt.org/moses/)を使う（動かす）ために、できる限り最低限必要な情報および情報にたどり着く道筋をまとめる。（基本的に日本語の情報）
全てを理解するのは厳しいので、こんな情報があるということを頭に入れておく。

# 統計的機械翻訳の概要

＊順不同

- [書籍「コロナ社の自然言語処理シリーズ4 機械翻訳」](http://www.coronasha.co.jp/np/isbn/9784339027549/)
- [Graham Neubig先生のチュートリアル資料 フレーズベース統計的機械翻訳システムの構築法](http://www.phontron.com/teaching.php)
- [筑波大、山本先生の統計的機械翻訳入門のスライド](http://www.nlp.mibel.cs.tsukuba.ac.jp/pdf/SMT2008.pdf)
- [上垣外さんの30分で学ぶ句に基づく統計的機械翻訳のスライド](https://speakerdeck.com/hkamiga/smt-basic-in-gunosy)

統計的機械翻訳を構築するためにさまざまな手法があることや、評価にもいろいろあることを知っておく。

# Mosesの概要

[Moses](http://www.statmt.org/moses/)は統計的機械翻訳システムである。
対訳コーパスを用意すれば、統計的機械翻訳を試すことができる。
いろいろな統計翻訳の手法が実装されている。
[ExternalTools](http://www.statmt.org/moses/?n=Moses.ExternalTools)などもかなり有益なツールの情報があるので、一度目を通すこと。
英語で検索できると、エラーはかなり解決できる。

# Linuxの知識
Linuxの知識がないと、いちいち操作に手間取るのでできる限り習得すること。

- 必要な知識
    - Linuxの基本的なディレクトリ操作
        - ディレクトリ操作
        - 圧縮・解凍
        - 相対パス・絶対パス
        - …
    - 環境変数の知識
    - 共有ライブラリの知識
    - configure
        - インストール先オプションが指定できることを知っていること
    - シェルスクリプト
    - 初歩的なGit

- [Linux LPIC - Library](http://www.infraeye.com/study/linuxz6.html)

# インストールや実行

＊順不同

- [Moses奮闘記](http://mahlog.typepad.jp/moses/)
- [松本宏さんのページ Moses](http://www.jnlp.org/matsumoto/moses)
- [y_utiのブログ 統計的機械翻訳システムMosesで遊ぶ](http://y-uti.hatenablog.jp/entry/2014/10/25/214843)
- [Ryuuta Yoshiさん【機械学習】Google翻訳(みたいなもの)を自作してみた。](http://qiita.com/RyutaYoshi/items/9a809c0a03e02874fabb)
- [Mosesのマニュアルインストール](http://qiita.com/kanjirz50/items/c9630193d72eb2698373)
- [林さん Mosesを使ったフレーズ機械翻訳の演習-2日目-](http://www.kecl.ntt.co.jp/icl/lirg/members/hayashi/files/alagin15-enshu2.pdf)

# 作業の残し方

単語分割の方法やパラメータなどがわからなくなるため、実験管理ツールやシェルスクリプトを用いるのがおすすめ

- [Moses Experiment Management System](http://www.statmt.org/moses/?n=FactoredTraining.EMS)
- [luigi](https://github.com/spotify/luigi)
- シェルスクリプト
    - 例をGistにアップする予定です。
- Makefile

# 前処理
## 英語
- 小文字化
- 記号の置換


## 日本語
- 単語分割
- 半角・全角の統一
    - NFKCなど
MySQLコマンド備忘録

構築済みのMySQLに入ってデータを探すときのコマンド備忘録

### データベース一覧を表示

```
> show databases;
```

### データベースに接続
```
> use [db name];
```

### テーブル一覧を表示

```
> show tables;
```

### テーブルのカラム情報を表示

```
> show columns from [table name];
```

### データを検索

```
> select [column names] from [table name] where [column name] [検索条件]
[column names] = * | [column name] | [column names] , [column name]
[検索条件] = = 'hoge | like 'hoge%' | like 'h_ge' など
```
c++ builder XE4, 10.2 Tokyo > Tagが同じTMemoからテキストを取得する実装

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

## 仕様

- Button押下時、ButtonのTagプロパティ値と同じ値をTagプロパティに持つTMemoのTextを取得する

## code v0.1

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TButton *Button1;
	TMemo *Memo1;
	TMemo *Memo2;
	TMemo *Memo3;
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
	String __fastcall getMemoText(TForm *frmPtr, String tag);
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	if (Sender == NULL) {
		return;
	}

	TComponent *cmpPtr = (TComponent *)Sender;
	String ret = getMemoText(this, cmpPtr->Tag);
	ShowMessage(ret);
}

String __fastcall TForm1::getMemoText(TForm *frmPtr, String tag)
{
	String ret = L"";
	for(int idx=0; idx < frmPtr->ComponentCount; idx++) {
		if (dynamic_cast<TMemo *>(frmPtr->Components[idx]) == NULL) {
			continue;
		}

		TMemo *mmPtr = (TMemo *)frmPtr->Components[idx];
		if (mmPtr->Tag != tag) {
			continue;
		}

		ret = mmPtr->Text;
	}

	return ret;
}
//---------------------------------------------------------------------------
```

TForm *frmPtrを渡しているのは、別のユニットに持っていく前準備として。同じフォームで使う場合はthisで十分。


### 設定

- Memo1
  - Tag: 3141
  - Text: Memo3141
- Memo2
  - Tag: 2718
  - Text: Memo2718
- Memo3
  - Tag: 6022
  - Text: Memo6022
- Button
  - Tag: 2718 


### 結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2fc084e6-2c5a-0dae-6a37-c3866c76ee9d.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a6b93ca3-176a-9bc2-2e49-2522a0093577.png)
GulpでAWSのS3に簡単デプロイして静的サイトを作成する

静的なWebサイトを作るって案件があったのですが、わざわざサーバー作るの面倒だよね。
もう全部S3に置いちゃえば良いんじゃない？ってことでファイルを全部S3にアップロードすることにしました。

フロントエンドをビルドするのにgulpを使うので、そのままgulpでデプロイする方法を。

## S3バケットとIAMを用意する

公開用にS3のバケットを作成してください。
作成したバケットにアクセスできるように、IAMのポリシーは以下のようにS3への権限を付与します。

```json:IAMポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::{BucketName}",
                "arn:aws:s3:::{BucketName}/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        }
    ]
}
```

ここで作成したリージョン名やバケット名、IAMのaccessKeyIdやsecretAccessKeyは後のデプロイタスクで使用します。


## npmで``gulp-awspublish``をインストールする

npmのpackage.jsonに``gulp-awspublish``を加えます。
npmからgulpを実行できるように``scripts``にbuildとdeployを設定しています。

```js:package.json
{
  "scripts": {
    "build": "gulp build",
    "deploy": "gulp deploy",
  },
  "dependencies": {
    "gulp": "3.9.1",
    "gulp-awspublish": "3.3.0"
  }
}
```

ターミナルでnpmインストールを実行

```bash
$ npm install
```


## S3へのデプロイタスク作成

gulp.jsを作成します。keyに入れる中身は先程作成したS3とIAMの情報を入力してください。

```js:gulp.js
var gulp = require('gulp');
var awspublish = require('gulp-awspublish');

gulp.task('build', function() {
  gulp.src("./origin/*")
      // build task
      .pipe(gulp.dest('./build/'));
});

gulp.task('deploy', function() {
  var key = {
    accessKeyId: "********",
    secretAccessKey: "********",
    region: "ap-northeast-1",
    params: {
      "Bucket": "{BucketName}",
    }
  }
  var publisher =awspublish.create(key);

  gulp.src("./build/*")
      .pipe(publisher.publish())
      .pipe(publisher.sync())
      .pipe(awspublish.reporter());
});
```

今回は``./origin``に元のファイルを入れておき``./build``にビルド済みのファイルを配置し、``./build``の中身をS3にアップロードするようにしています。


## デプロイタスクを実行

あとはターミナルで実行するだけ

```bash
$ npm run build && npm run deploy

[12:08:09] Using gulpfile ~/gulpfile.js
[12:08:09] Starting 'deploy'...
[12:08:10] Finished 'deploy' after 205 ms
[12:08:10] [update]   index.html
[12:08:10] [skip] main.css
[12:08:10] [create] main.js
[12:08:10] [delete] main.png
```

``publisher.sync()``を指定しているので、ディレクトリの中身とS3の差分を見て自動で作成・更新・削除・スキップを行ってくれます。


## おわり
これでS3の中身を確認して、無事アップロードされていればOKです。
実際に運用するときはGithubとJenkinsも組み合わせてワンクリックでデプロイされるように構築して使っています。

いじょ、簡単便利にS3に静的サイトをデプロイする方法でした。
rex0220 添付ファイル再利用プラグイン

kintone アプリの標準機能では、レコード再利用時に添付ファイルが複写されませんが、このプラグインにより、添付ファイルを複写できます。

- 複数の添付ファイル項目を指定可能
- １添付ファイル項目内の複数ファイルを複写
- サブテーブル内の添付ファイル項目を複写
- PC/モバイル対応
 
追加画面で、「保存」クリック後に添付ファイルを追加処理します

[rex0220 stores](https://rex0220.stores.jp/)で、販売中です。

Ver.8 変更点
・レコード再利用時に、テーブル内のルックアップを再取得しないように変更
・プラグイン設定画面のデザイン変更対応
・プラグイン設定に、「説明」設定機能を追加
・kintone.Promise を Promise に変更

![fdup02.png](https://qiita-image-store.s3.amazonaws.com/0/100572/ab847788-452a-659a-4f4e-c72cdd59023a.png)


# レコード再利用時の追加画面

ファイルがコピーされる添付ファイル項目は、黄色表示になります。
追加画面で、新たにファイルをアップロードした場合は、新ファイルが設定されます。

![fdup03.png](https://qiita-image-store.s3.amazonaws.com/0/100572/87dc8735-4e04-15be-3edf-5ddbe33ace62.png)


# プラグインの追加

![fdup11.png](https://qiita-image-store.s3.amazonaws.com/0/100572/c8430144-a8c9-3201-94f7-37b0ed38918a.png)



# プラグインの設定

添付ファイル項目が一覧表示されますので、複写対象にする項目を選択します。

- プラグイン有効：　プラグインの有効／無効を指定。
- 添付ファイル別チェックボックス：　複写対象項目を指定。


![fdup12.png](https://qiita-image-store.s3.amazonaws.com/0/100572/715ea9d2-3bb2-eea5-2d72-56540effd4e2.png)

# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- 対象の添付ファイル項目を変更した場合は、フォーム変更を本番環境に反映後に、プラグインを再設定してください。