OmniAICreator/Qiita-1.07M huggingface dataset:
ScalaScalableProgramming 03章 ふりかえり 配列

# Scala 03章　配列

## 配列でやる

```scala:array.scala
    val greetStrings = new Array[String](3)
    greetStrings(0) = "Hello"
    greetStrings(1) = ", "
    greetStrings(2) = "world!\n"
    for (i <- 0 to 2)2
      print(greetStrings(i))
```

forを簡素化してみるチャレンジ。

```scala:array.scala
    val greetStrings = new Array[String](3)
    greetStrings(0) = "Hello"
    greetStrings(1) = ", "
    greetStrings(2) = "world!\n"
    greetStrings.foreach(print)
//    for (i <- 0 to 2)2
//      print(greetStrings(i))
```

```scala:けっか
    Hello, world!
```

foreachでやると、すっきりまとまって、Scalaっぽい。
Rails APIでクロスドメインとpre-flight対応

localでRails APIとWebクライアントを別途立てていた時に、クロスドメインとpre-flightへの対応が必要になりました。
Rails APIサーバ: localhost:3000
Webフロントエンド: localhost:3355

Webフロントエンドでは、HTTPクライアントとしてaxiosを利用しました。

## クロスドメイン対応

クロスドメイン対応が無い場合、リクエストで"No 'Access-Control-Allow-Origin' header is present on the requested resource." とエラーが出ます
。
![スクリーンショット 2017-03-06 17.46.37.png](https://qiita-image-store.s3.amazonaws.com/0/29637/fea31fbb-d492-e20c-2808-115cdea40958.png)


localhost:3355からのアクセスに対して、クロスドメイン対応をいれます。

``` config/application.rb
config.action_dispatch.default_headers = {
  'Access-Control-Allow-Credentials' => 'true',
  'Access-Control-Allow-Origin' => 'http://localhost:3355',
  'Access-Control-Request-Method' => '*'
}
```

未検証ですが、下記gemではrackレベルで対応可能のようです。
[cyu/rack-cors
](https://github.com/cyu/rack-cors)

### 参考

[Rails4アプリに対してクロスドメインでAjaxでCookieを送信したい場合](http://qiita.com/tridentfield/items/290e21f04aed587afad2)

## pre-flight対応

axiosは異なるオリジンに対してリクエストする時に、OPTIONSメソッドでpre-flightのリクエストを送信します。
[How to disable OPTIONS request?](http://stackoverflow.com/questions/29954037/how-to-disable-options-request)

OPTIONSメソッドでリクエストしようとして404になります
![スクリーンショット 2017-03-06 17.57.59.png](https://qiita-image-store.s3.amazonaws.com/0/29637/573638ee-3f1b-d67d-1a48-a8ec2d106cf1.png)


Railsサーバは以下のようなエラーが出ます

```
Started OPTIONS "/user_token" for ::1 at 2017-03-06 17:57:46 +0900
  ActiveRecord::SchemaMigration Load (3.9ms)  SELECT `schema_migrations`.* FROM `schema_migrations`

ActionController::RoutingError (No route matches [OPTIONS] "/user_token"):
```

[Railsでのpreflightリクエストの実装およびテスト例](http://web-salad.hateblo.jp/entry/2015/05/03/170754)の実装を参考に実装してみます。

routes.rbの先頭でOPTIONSメソッドでのリクエストに対して、options_requests_controllerをルーティングします。

``` config/routes.rb
Rails.application.routes.draw do
  match '*path' => 'options_request#preflight', via: :options
  # other resources
end
```

ヘッダに'Access-Control-Max-Age', 'Access-Control-Allow-Headers', 'Access-Control-Allow-Methods' をつけて返します。

``` app/controllers/options_request_controller.rb
class OptionsRequestController < ApplicationController
  ACCESS_CONTROL_ALLOW_METHODS = %w(GET OPTIONS).freeze
  ACCESS_CONTROL_ALLOW_HEADERS = %w(Accept Origin Content-Type Authorization).freeze

  def preflight
    set_preflight_headers!
    head :ok
  end

  private

  def set_preflight_headers!
    response.headers['Access-Control-Max-Age'] = ACCESS_CONTROL_MAX_AGE
    response.headers['Access-Control-Allow-Headers'] = ACCESS_CONTROL_ALLOW_HEADERS.join(',')
    response.headers['Access-Control-Allow-Methods'] = ACCESS_CONTROL_ALLOW_METHODS.join(',')
  end
end
```
Vimで現在のカーソル行をGitHubで開く

できたのか！って感じだったのでメモ。

## 様子

![70d87de3d2a9c1f551a55c077991398f.gif](https://qiita-image-store.s3.amazonaws.com/0/36518/45198e15-a8c9-03e7-f3d9-e14cbb20d674.gif)

Vim から GitHub の該当行が一発で開ける。

## 方法1：[tpope/vim-fugitive](https://github.com/tpope/vim-fugitive) を使っている場合

vim-fugitive 使ってるので私はこれでできました。
`Shift+v` でカーソル行を選択した後、

```
:Gbrowse
```

を実行する。
`:Gbrowse` はカーソル行を指定しなくても該当のファイルを開くことができて便利。

## 方法2：その他のプラグインを入れる

試してませんが、「vim open current line github」とかで検索して見つかったものを。

* [vim-gh-line](https://github.com/ruanyl/vim-gh-line)
* [vim-open-url](https://github.com/henrik/vim-open-url)


どちらも README 見る限り同じことができそう。




## 方法３：コマンドを自作する

参考：[Vim Trick: Open current line on GitHub - Felix Geisendörfer](http://felixge.de/2013/08/08/vim-trick-open-current-line-on-github.html)
pm2でExpressアプリケーションをデーモン化する

pm2を使ってExpressアプリケーションを永続化する方法
バックグラウンドで実行されるデーモン化することが出来るので、1つのサーバーで複数のNode.jsアプリケーションを管理するときに便利です。

#環境
* OS: CentOS 7.2
* Node.js: v6.9.4
* npm: 3.10.10
* アプリケーションディレクトリ: /home/appuser/work/app  
※Expressで作成したアプリケーションが、上記ディレクトリに保存されていることとします。  

#pm2のインストール

pm2をグローバルインストール

```bash
$ npm install -g pm2
```

インストール確認

```bash
$ pm2 -v
2.4.2
```

※2017/03/06現在、npmからインストールした場合の最新

#pm2設定ファイルの作成

アプリケーションディレクトリに設定ファイルをpm2の設定ファイルを作成します。
今回は.jsonで設定ファイルを記述します。(.jsonの他にyamlでも記述可能)

最低限の設定

```json:app.json
{
  "name" : "app",
  "script" : "./bin/www",
}
```

環境変数を設定して起動

```json:app.json
{
  "name" : "app",
  "script" : "./bin/www",
  "env" : {
    "NODE_ENV" : "development"
  },
  "env_production" : {
    "NODE_ENV" : "production"
  }
}
```

#アプリケーションの開始

起動

```bash
$ pm2 start app.json
```

環境変数を指定して起動

```bash
$ pm2 start app.json --env production
```

#アプリケーションの停止

起動中アプリケーションの確認

```bash
$ pm2 list
| App name     | id | mode | pid   | status x restart | uptime | cpu | mem       >| watching |
| app | 0  | fork | 28638 | online | 2       | 32m    | 0%  | 55.6 MB   | disabled |
 Use `pm2 show <id|name>` to get more details about an app
```

アプリケーションの停止

```bash
$ pm2 stop app
```
現在ログインしているサーバと異なるサーバでcomposer installを実行したい

よくデプロイツールなどでは、デプロイ先のサーバーで
`composer install` を実行してセットアップ処理を行うなどありますが
それを実際にシェルスクリプトでやるとどんな感じになるかというメモです。


### 実例

ssh越しにコマンドを実行します。
今回は、Composer本体を取得して、そのcomposerを実行します。

```bash:実際に実行するシェルスクリプト
DEPLOY_USER="DEPLOYで実行したいユーザー名"
SERVER="DEPLOYするサーバー"
REMOTE_DEPLOY_DIR_PATH="対象サーバのcomposer.jsonがあるディレクトリのフルパス"
ssh $DEPLOY_USER@$SERVER "
curl -sS https://getcomposer.org/installer | php -- --install-dir='$REMOTE_DEPLOY_DIR_PATH' --filename=composer
cd $REMOTE_DEPLOY_DIR_PATH; php composer config -g secure-http false;php composer install
rm $REMOTE_DEPLOY_DIR_PATH/composer
"
```

### 余談

最新ソースを取得して、手元で `composer install` し
そのソースを対象サーバに `rsync` というようなことをやっていたのですが
手元のサーバと、 `rsync` 先のPHPのバージョンが異なるとできない方法を取っていたので
今回この方法を実践しました。
Oven使ってCakephpインストールする

cakephpをインストールするための新しい手順：

まず、下記をローカルホストサーバーにてクローンする/ダウンロードする
https://github.com/CakeDC/oven

次、
http://localhost/oven.php　
をアクセスすると以下のように画面が出てくる。

![image](https://qiita-image-store.s3.amazonaws.com/0/161262/a53fe831-e430-a43b-f3b1-504c372d6a96.png)


APP INSTALL DIRにて普通にプロジェクトのパス/名を記載する
CAKEPHP VERSIONでSTABLEを選んでください
ComposerはCakephpのため必要なので、必ずInstall Composer to current dirを選ぶ
※もし、既にComposerがある場合、Use existing composer installationを選んで、パスを記載してください。

DATABASE CONFIGURATION
【HOST】
→DBホスト名/URL
【DATABASE】
→DB名
【USERNAME】
→登録ユーザー名（普通にroot使える）
【PASSWORD】
→設定したパスワード


上記を全部記入後以下のノーブをクリックしてください
![image](https://qiita-image-store.s3.amazonaws.com/0/161262/bf12dc71-6e4f-5e00-805b-aeac6909f68a.png)

※もし、エラーが発生した場合は、フォルダのパーミッションでWriteの許可がされているか確認してください。

インストールが完了しましたら、Cakephpのプロジェクトが記載したパスにインストールされ、格納されます。
もし、APP INSTALL DIRを変更せずそのままプロジェクト名を記載すると

http://localhost/oven/<<プロジェクト名>>
で確認できます。

以上！


参考：
以下の画像通り表示されれば成功です！
お疲れ様でした！
![image](https://qiita-image-store.s3.amazonaws.com/0/161262/f6d15aae-219b-7dad-511b-bcf5fe49d084.png)
Bluemix OpenWhisk Cloudant 使用時の認証情報メモ

Cloudant 使っている人であれば普通に判るのだと思うが
OpenWhiskで初めてCloudant触ったので困った点を書いておく

## Bulemix OpenWhisk

OpenWhisk で Cloudant を使用する際に対象のCloudant DBへのアクセス情報を設定する必要がある。

![image](https://qiita-image-store.s3.amazonaws.com/0/11547/4332de9c-2d56-f1ec-bd80-eddf645701e7.png)

`New Binding`を選択すると以下の様な設定項目が表示される。
※人によっては自動で設定済みになるらしいのだが・・・無料ユーザーとの違いかな？
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/3371c8cc-510c-5eea-e3e3-8a9c01dd3df0.png)

### Cloudant 認証情報の確認
「サービス」＞「ダッシュボード」からCloudant を選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/d99bdd31-fb3f-9956-325d-b2ff164264fc.png)

「サービス資格情報」を選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/fd8e589f-ce39-0c81-6ff2-e84754f3db08.png)

「資格情報の表示」を選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/db4c580d-3370-df96-4bf3-b8a4d2210717.png)

Cloudant の資格情報が表示されるので`username`,`password`,`host`を夫々OpenWhiskのCloudantバインディングに設定します。
`dbname`は資格情報が正しい場合に使用可能なDBの選択肢が表示されるようになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/11547/8a58c6b0-2924-1fce-6b0c-f67ba4a252e8.png)


## OSS OpenWhisk
TableViewで複数セルを一気に複数削除する

## はじめに
TableView上のセルの削除を行うとき、`canEditRowAtIndexPath`や`commitEditingStyle`等のdelegateメソッドを駆使することで、右スワイプでの削除や編集ボタンをトリガーにセルを削除したりすることができます。
ただ、これらはいずれも「**対象の一つのセルしか一度に削除できない**」という制約に阻まれます。
右スワイプはもちろん、せっかく編集モードになっているのに削除できるセルは１つずつです。
そこで、複数のセルを1セクションで選択でき、それをそのまま一気に消せるUIを作ってみたので、作るにあたってのTipsをまとめます。

## つくったものの動き
![input.gif](https://qiita-image-store.s3.amazonaws.com/0/55807/a32bf4a0-3847-36c4-699f-6e8710d82cc6.gif)

## Tips
ここからは複数削除において気をつけなければいけないことを紹介していきますが、
前提として
- TableViewへの値の設置
- NavigationController、およびそのボタンの設置
等の基本的な説明は省きます。

### Tips1 TableViewの編集モードで複数選択を許可する
まず、TableViewの編集モードで複数選択を許可してあげる必要があります。
そのときはTableViewのプロパティである`allowsMultipleSelectionDuringEditing`をtrueにしてあげればOKです。

```swift:allowsMultipleSelectionDuringEditing
tableView.allowsMultipleSelectionDuringEditing = true
```

こうすることで、TableViewが編集モードになると複数選択できるViewとして表示されます。

![名称未設定.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55807/420c7992-10fd-dcc8-33a9-f58719b52bb1.jpeg)

### Tips2 選択肢情報の格納される順番について
複数選択モードで何かのセルを選択状態にしたとき、そのイベントは`didSelectRowAt`で取得することができます。
逆に選択状態を解除したときは、`didDeselectRowAt`で取得することが出来ます。
また、「どの行が選択されているか」という情報は、TableViewの`indexPathsForSelectedRows`というプロパティに[IndexPath]の型で格納されます。
この`indexPathsForSelectedRows`に格納される順番が少し曲者で、上から順番に格納されるのではなく「**セルがタップされた順番**」に格納されます。

![111111.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/55807/63ae66de-1666-6329-abd7-ac78b745d474.jpeg)

たとえば上図の順番で選択されたとすると、`indexPathsForSelectedRows`の値は`[[0,3],[0,7],[0,6],[0,1]]`となります。
※ 0はセルが所属するセクション番号を表します。今回は1セクションでのTableViewなので常に0ですね。
これの何が曲者かというのは次のTips3で紹介します。

### Tips3 cellに表示する情報の削除方法
ここまでで選択肢情報が取得できたので、あとは削除するだけです。
ここで削除するのは
1. TableViewのセルそのものの削除
2. TableViewのセルに表示する情報の削除

の2つが必要になります。

1. TableViewのセルそのものの削除  
これは簡単です。
TableViewは`deleteRows`メソッドを持っているので、取得した選択肢情報を引数に渡してあげれば削除できます。

```swift:deleteRows
tableView.deleteRows(at: tableView.indexPathsForSelectedRows, with: UITableViewRowAnimation.automatic)
```

2. TableViewのセルに表示する情報の削除  
こっちが少し厄介です。
たとえば削除対象の情報を配列で持っているケースの場合、for文を使って`remove`で要素を順番に削除することが考えられますが、
`indexPathsForSelectedRows`をそのまま渡して削除しようとすると、**チェックした順番でindexPathが格納されているため**、removeする度に削除対象の要素番号がズレてしまいます。

```swift:indexPathsForSelectedRowsの順番のまま削除するとダメ
for indexPathList in indexPathsForSelectedRows {
    deleteArray.remove(at: indexPathList.row)
}
```

なのでこの場合は`indexPathsForSelectedRows`を降順にソートしてからfor文で削除します。
なぜ昇順ではないかというと、これも要素番号がズレるからです。
たとえば昇順にソートした結果、`indexPathsForSelectedRows`が`[[0,1],[0,2],[0,4],[0,5]]`になった場合、これらの要素をfor文で削除しようとすると、
・最初に[0,1]が削除される → OK
・[0,1]が削除されたことによって、それより後ろの要素が前に詰まる。
([0,2]→[0,1]、[0,4]→[0,3]、[0,5]→[0,4になる])
・次に削除すべき[0,2]の要素は[0,1]に移動しているため、削除対象が異なってしまう
となってしまいます。
降順になっていると、このようなindexのズレが起こることはなくなります。

```swift:indexPathsForSelectedRowsを降順にソートしてから削除
let sortedIndexPaths = indexPathsForSelectedRows.sorted { $0.row > $1.row }
for indexPathList in sortedIndexPaths {
    deleteArray.remove(at: indexPathList.row)
}
```

## まとめ
以上がTableViewのセルを一気に複数削除する上でのTipsになります。
ソースコードは[Github](https://github.com/vivayashi/MultipleDelete/blob/master/MultipleDelete/ViewController.swift)上にあがっているので参考にしてみて下さい。
hyperapp使ってみた

## 参考

* [HyperApp - 1KBのビューライブラリ MOONGIFT](http://www.moongift.jp/2017/03/hyperapp-1kb%E3%81%AE%E3%83%93%E3%83%A5%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/)
* [Getting Started · hyperapp/hyperapp Wiki](https://github.com/hyperapp/hyperapp/wiki/Getting-Started)

## ブラウザ

* IE11 : 非対応
* Edge : 対応
* Chrome : 対応

## 使い方

```bash:ダウンロードも可
wget -O hyperapp.js https://unpkg.com/hyperapp
wget -O hyperx.js https://wzrd.in/standalone/hyperx
```

```html:index.html 
<body>
  <!--<script src="https://unpkg.com/hyperapp"></script>-->
  <!--<script src="https://wzrd.in/standalone/hyperx"></script>-->
  <script src="hyperapp.js"></script>
  <script src="hyperx.js"></script>
  <script>

  const { h, app } = hyperapp
  const html = hyperx(h)

  app({
    model: "Hi.",
    view: model => html`<h1>${model}</h1>`
  })

  </script>
</body>
```
Pythonでwebスクレイピング はじめの一歩

Python3とBeautifulSoup4を使ったwebスクレイピングの初心者向けの記事です。

過去記事を参照しましたが、
警告が表示されたりバージョンの違いからか動かないことがあったため、改めてまとめてみました。

##概要
webスクレイピングの基本的な処理は、以下のような流れになります。

　①webページを取得。
　②取得したページを要素を分割し、任意の箇所を取り出す。
　③データベースに保存。

①のwebページの取得にrequest、②の処理にBeautifulSoup4を利用します。
③については環境によって異なるため、この記事では説明を割愛します。

##準備
Python3をインストール後、
pipコマンドを使って、BeautifulSoup4、requests、lxmlの３つのパッケージをインストールします。

```
$ pip install requests 
$ pip install lxml
$ pip install beautifulsoup4
```

##プログラムの実行

以下のスクリプトファイルを作成します。

```python:sample.py
import requests
from bs4 import BeautifulSoup

target_url = 'http://example.co.jp'  #example.co.jpは架空のドメイン。任意のurlに変更する
r = requests.get(target_url)         #requestsを使って、webから取得
soup = BeautifulSoup(r.text, 'lxml') #要素を抽出

for a in soup.find_all('a'):
	print(a.get('href'))         #リンクを表示

```

コマンドプロンプトを起動し、以下のコマンドを実行します。

```
$ python sample.py 
```

実行後、コンソールにページのリンクが表示されれば成功です！

##BeautifulSoupのメソッド
BeautifulSoupの便利なメソッドを一部紹介します。

```
soup.a.string　　　　　　　　　　#aタグの文字列を返る
soup.a.attrs    　　　　　　　　#全属性を返る
soup.a.parent　　　　　　　　　　#親要素が返る

soup.find('a') 　　　　　　　　　#先頭の要素が返る
soup.find_all(id='log')　　　　#すべての要素が返る

soup.select('head > title')   #cssセレクターによる指定
```

BeautifulSoupには、他にも使えるメソッドが多数あります。
詳しくは、公式ドキュメントを参照ください。
https://www.crummy.com/software/BeautifulSoup/bs4/doc/

##要素の絞り込み
対象の要素を絞り込むため、reの正規表現を利用すると便利です。

```
import re
soup.find_all('a', href=re.compile("^http"))     #先頭がhttpではじまるリンク
```

```
import re
soup.find_all('a', href=re.compile("^(?!http)")) #先頭がhttpではじまらない(否定)
```

```
import re
soup.find_all('a', text=re.compile("N"), title=re.compile("W")) #textがNが含まれる、かつtitleにWが含まれる要素
```

##文字列の操作
スクレイピングの際、覚えておくと便利な文字列操作について補足します。

######・文字の前後の空白を削除

```
"  abc  ".strip()
→abc
```

######・文字を分割

```
"a, b, c,".split(',') 
→[a, b, c]
```

######・文字列の検索

```
"abcde".find('c') #指定した文字がある場合、位置を返します。
→2
```

######・文字の置き換え

```
"abcdc".replace('c', 'x')
→abxdx
```

##参考にした記事
http://qiita.com/itkr/items/513318a9b5b92bd56185
対話的シェルをexpectを使って自動化する

# 概要
`expect` を使う機会があったので作ったシェルを残しておく

# jenkinsユーザのbash設定

ユーザを作成しただけだと、`/bin/false`となっているので`bash`を有効にしてあげる

```
#!/bin/bash
expect -c "
spawn chsh jenkins
expect \"New shell\"
send \"\/bin\/bash\\n\"
interact
"
```

# パスワードなしsshキー作成

```
#!/bin/bash
expect -c "
spawn sudo -u jenkins -H ssh-keygen -t rsa -C jenkins@xxx.com
expect \"Enter file in which to save the key\"
send \"\n\"
expect \"Enter passphrase\"
send \"\n\"
expect \"Enter same passphrase again\"
send \"\n\"
"
```

# 参考
http://www.uetyi.com/server-const/command/entry-158.html
Null Object パターン (メモ)

#Null Object パターン
最もよく使用されるデザインパターン。
このパターンの目的は、NullReferenceExeptionを無意識にスローしてしまい、nullオブジェクトをチェックするコードだらけになることを防ぐためにある。
##使い方
Nullオブジェクトとは、オブジェクトが存在しないことを表すオブジェクト。
Nullオブジェクトは何の動作も行わずに、デフォルトを返す。
###詳しくはこちら
[C#におけるNull Objectパターン](https://codezine.jp/article/detail/4721)
AWS Certificate manager の導入前に気を付ける事

# 概要
AWSの無料SSL証明書発行サービスであるACMのサービスを一通り確認頂いた上で
導入検討している方向けの細かい部分の説明です。

# ACMとは
AWSの証明書発行サービスです。
ワイルドカード証明書にも対応しています。
発行には料金はかかりません。
証明書は自動的に更新されるので、期限切れを気にする必要がなくなります。


# 自動更新が出来ない条件
・ワイルドカードでの証明書発行
　「*.example.co.jp」のようにワイルドカードで申込みした場合

・FQDNの名前解決の結果がAWS リソースではない
　「dig test.example.co.jp 」などで得られるanswerがELBのIPなどAWSのリソースではない場合

・インターネットから SSL/TLS で接続できない
　「openssl s_client -connect test.example.co.jp:443」などのコマンドで
　SSL/TLS接続が可能である事。

上記以外にもAWSの方針による変更の可能性はあります。

# 検証ドメインの宛先変更
AWS CLIより以下コマンドで変更が可能です。
exp 検証ドメインをtest.example.co.jpからexample.co.jpに変更する場合。
※叩く前に実行するリージョンを確認しましょう。

aws acm request-certificate \
 --domain-name test.example.co.jp \
 --domain-validation-options DomainName=test.example.co.jp,ValidationDomain=example.co.jp

もし毎年更新が必要なドメインの場合は、この変更は次回更新時も有効です。
逆に申込み時に検証ドメインを変更すると元に戻す事はできません。

※この記事は2017年3月時点の情報です。
他にもあれば追加します。
MacにMySQL Utilitiesをインストールする


MySQLを使う時に便利なツールをまとめた、MySQL Utilitiesというものがあります。
例えば、異なるデータベース間でスキーマの変更点を確認できるmysqldiffなどが含まれています(本番環境と検証環境でスキーマに差がないか調べたい時など重宝します)。

# MySQL Utilitiesをインストールする

## Windowsの場合

普通にMySQL公式サイトの[配布ページ](https://dev.mysql.com/downloads/utilities/)からダウンロードしてインストールしましょう。

## Macの場合

MySQL公式サイトでもmacOS版は配布されているのですが、なぜかOS X 10.9以下でないとインストーラが動作しないようになっています。ソースからインストールすることもできますが、HomebrewのFormulaを作成したので、以下のコマンド一発でインストールできます。

```
brew install mysql-utilities
```

では。
画像を指定のサイズに変更し余白を黒くする

手元にある画像のサイズを全て一致させたく行いました。

まず、手元にある画像を縦横比を変えずに指定のサイズ以下になるように変形します。
縦横比を維持したまま変形するため、上下または左右に指定のサイズとのズレが生まれます。そのズレは黒く塗りつぶす、ということを行いました。

Python、PILを用いて行いました。

# コード
（追記）コメントにて、@shiracamus さんに補足頂きました。あわせてご確認ください！

```image.py
from PIL import Image

# 縦横のサイズを指定
width =360
height = 240

# 画像の縦横を指定のサイズより小さくなるように変形
img = Image.open("hoge.jpg")
img.thumbnail((width,height),Image.ANTIALIAS)

# 黒く塗りつぶす用の背景画像を作成
bg = Image.new("RGBA",[width,height],(0,0,0,255))

# 元の画像を、背景画像のセンターに配置
bg.paste(img,(int((width-img.size[0])/2),int((height-img.size[1])/2)))
```

# 参考
下記のサイトを参考にさせていただきました。
[盗用を防ぐ！Pythonを使って画像に透かしを入れる](https://remotestance.com/blog/2834/)
[Pythonで画像の貼り付け](http://tt-house.com/2011/01/python-image-paste.html)

# 最後に
ありがとうございました。
VisualStudioのツールボックスにスニペット的なものを登録する。

VisualStudioには定型のコードを登録できるコードスニペットという機能が存在する。
便利なのだが、いちいち登録するのがめんどくさい。

ところが、実はツールボックスに定型コードを登録できることを発見した。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/143913/2b29b006-32de-5a9a-cc8b-33b2be451c1b.png)

#登録のやり方
１．登録したいコードをコピーする。

２．ツールボックスを開き、ツールボックス上で貼り付け

３．ツールボックスにコードが登録されるので、名前の変更で分かりやすい名前に変更

#使い方
定型コードを挿入したいところにツールボックスからドラッグドロップ


#注意点
別ソリューションを開いていると、登録した定型コードが消えている場合がある。
ツールボックスの設定だけをエクスポートしておくことをお勧めする。
ブロックチェーン技術を活用したサービスアイデア・コンテストシリーズについて【ソフトバンク様主催】

ソフトバンク様は、2016年1月よりブロックチェーン技術を活用してインターネット上で信頼性の高い取引を実現するプラットフォームの研究開発を行っています。この取り組みの一環として、今後新たなサービス創出につながる可能性がある魅力的なアイデアを発掘することを目指してコンテストが開催されます。こちらは、世界最大規模の開発者コミュニティである「Topcoder」上で開催されます。
ブロックチェーンの技術面においては、コンセンサス・ベイス株式会社が全面的にサポート致します。

ソフトバンク株式会社様のリリースはこちら
http://www.softbank.jp/corp/group/sbm/news/press/2017/20170302_02/


コンテストの募集ページはこちら（英語のみ）
http://crowdsourcing.topcoder.com/softbank_blockchain
I2C > データ変更とデータ[sample,capture]のタイミング | Timing Chart Formatterでの図示

I2C通信において、SDAラインへのデータ出力（データ変更）および、[sample, capture]のタイミングについての調査。

### リンク

https://en.wikipedia.org/wiki/I%C2%B2C
Timing diagramの画像があり、その説明が以下。
> `2.` SDA sets the 1st data bit level while keeping SCL low (during blue bar time) .
> `3.` The data is sampled (received) when SCL rises (green) for the first bit (B1).

> ...

> In order to avoid false marker detection, SDA is changed on the SCL falling edge and is sampled and captured on the rising edge of SCL.

<hr>
https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/183280
>  I2C specs are that the data lien is allowed to change while SCL is low. Not a tthe beginning or the end, not after or before or at an edge, but any time while SCL is low. 

<hr>
http://www.nxp.com/documents/user_manual/UM10204.pdf

### 例

例として、以下の場合。

- ACK読取り
- 3つのDAT読取り
- ACK書込み

タイミングチャートとしては以下のような感じだろうか。
![timing-chart.png](https://qiita-image-store.s3.amazonaws.com/0/32870/cfe1142c-5c7e-f87b-df18-1ffb055c3ac1.png)

https://rawgit.com/osamutake/tchart-coffee/master/bin/editor-offline.html

```
clock  __~~~~__~~~~__~~~~__~~~~____~~
data   __=ACK RD===__=DAT RD===__=DAT RD===__=DAT RD===X=ACK WR==__
```

関連 [onlineTool > タイミングチャート生成](http://qiita.com/7of9/items/4febc353f37ee2cd262b)
チラ裏: phpでログイン認証

今度読む:

* [php+MySQLでセッションを使用したログイン認証 - Qiita](http://qiita.com/singlestroke/items/b38f9f9f9b62f2522539)
* [IPA ISEC　セキュア・プログラミング講座：Webアプリケーション編　第8章 マッシュアップ：クライアントサイドマッシュアップ: #4 対策に利用できる技術](https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/705.html)

```php:index.php(作りかけ)
<?php
$IP=$_SERVER["REMOTE_ADDR"];
$UA=$_SERVER["HTTP_USER_AGENT"];
$TIME=$_SERVER["REQUEST_TIME"];

// ログインページを表示してから$allow_seconds秒後までにSUBMITされたらOK
$allow_seconds = 3600;
if(($_POST["time"] + $allow_seconds) < $TIME) {
    echo sprintf("NOW: %d<br>PST: %d", $TIME, $_POST["time"] + $allow_seconds);
    echo "login time over.";
}

// 送信元IP
if($_POST["ip"] != $IP) {
    echo sprintf("NOW: %s, POST: %s", $IP, $_POST["ip"]);
    echo "login failed. ip";
}

// UserAgent
if($_POST["ua"] != $UA) {
    echo sprintf("NOW: %s, POST: %s", $UA, $_POST["ua"]);
    echo "login failed. ua";
}

// 許可するUserAgent
$w3m = "/w3m/";
//$w3m = "/Gecko/i";
//$w3m = "/ msie /i";
if(!preg_match($w3m, $UA)) {
    echo sprintf($UA);
    die("login failed. ua not in list");
}

// user:pass
if($_POST["ip"] == $IP) {
    if($_POST["username"] == "user1"
    && $_POST["password"] == "pass1") {
        echo "login success.";
        header('Location: mypage.php');
        exit;
    } else {
        echo "login failed.user:pass";
    }
}

echo "現在時刻:";
echo date("Y-m-d H:i:s", $_SERVER["REQUEST_TIME"]);
?>
<form method="post">
<input type="hidden" name="ip" value="<?php echo $IP ?>">
<input type="hidden" name="ua" value="<?php echo $UA ?>">
<input type="hidden" name="time" value="<?php echo $TIME ?>">
<li>user: <input type="text" name="username">
<li>pass: <input type="password" name="password">
<input type="submit" value="login">
</form>
```

```html:mypage.php
hi
```
Microsoft Azureの仮想マシンにXamarinの開発環境が作れなかったメモ

タイトルの通り、作ることができなかったのでメモ
※出来る方法もあったらしいのですが、やった範囲内ではできませんでした。

**なお、動かしてみてできなかった理由をネット上で調べただけなので、間違っている、情報が古い可能性があります。**


#結論
開発環境の構築、ビルドは可能。ただし、エミュレータが起動しないためデバッグできない。
→Azureの仮想マシン上ではHyper-Vを使ったエミュレータが起動できないため
→起動できるエミュレータは存在するらしい。検証前に心が折れたけど。

#出来たこと
・仮想マシンの作成
・開発環境(VisualStudio+Xamarin)の構築
・Xamarinプロジェクトの作成&ビルド

#出来なかったこと
・Androidエミュレータの起動


#分かったこと（たぶん）
現在のHyper-Vは実機上に仮想マシンを構築することしかできず、仮想マシン上にさらに仮想マシンを立てることはできない。
AzureはHyper-Vをベースに仮想マシンを構築しているため、Azureの仮想マシンでは仮想エミュレータは使用できない。


Windows Server 2016、もしくはWindows 10なら「Nested Hyper-V」で仮想マシン上に仮想マシンを構築可能らしい。
ただし、Azureで使用するためには、MSDNサブスクリプションに加入し、Windows 10の仮想マシンを構築しなければならない。


仮想マシンを利用しないエミュレータなら起動できるらしい。
→導入前に心が折れたので未検証。
Angular2 雛形 ver.0.0.1

# はじめに
デフォルトでは TypeScriptファイルとJavaScript、Mapファイルが同じフォルダに作成され
見にくいため別フォルダに分けられるように quickstart のソースを元に変更する箇所をメモします。

### 手順1
- 公式サイトを参考に quickstart のソースを取得する。[参考サイト](https://angular.io/docs/ts/latest/guide/setup.html)

```
# GitHubよりソースの取得
git clone https://github.com/angular/quickstart.git sample01

# フォルダへ移動
cd sample01

# 不要なファイル・フォルダを削除（残したいなら実行しなくてもよい）
for /f %i in (non-essential-files.txt) do del %i /F /S /Q
rd .git /s /q
rd e2e /s /q
```

### 手順2
- package.json の修正
-- npm-run-all、cpx パッケージの追加

```js:package.json
 
  },
  "devDependencies": {

    // デフォルトのまま

    "npm-run-all": "^4.0.1",  // 追加
    "cpx": "^1.5.0"           // 追加
  },
```

### 手順3
- package.json 内の実行スクリプトの追加・修正

```js:package.json
  "scripts": {
    "build": "tsc -p src/",
    "build:watch": "tsc -p src/ -w",
    "build:e2e": "tsc -p e2e/",
    "serve": "lite-server -c=bs-config.json",
    "serve:e2e": "lite-server -c=bs-config.e2e.json",
    "prestart": "npm-run-all clean copy build",                                                          // 変更
    "start": "concurrently \"npm run copy:watch\" \"npm run build:watch\" \"npm run serve\"",            // 変更
    "pree2e": "npm run build:e2e",
    "e2e": "concurrently \"npm run serve:e2e\" \"npm run protractor\" --kill-others --success first",
    "preprotractor": "webdriver-manager update",
    "protractor": "protractor protractor.config.js",
    "pretest": "npm run build",
    "test": "concurrently \"npm run build:watch\" \"karma start karma.conf.js\"",
    "pretest:once": "npm run build",
    "test:once": "karma start karma.conf.js --single-run",
    "lint": "tslint ./src/**/*.ts -t verbose",
    "copy": "cpx \"./src/**/{*.html,*.css,*.js,*.jpeg,*.gif,*.json}\" ./dist",                          // 追加
    "copy:watch": "cpx \"./src/**/{*.html,*.css,*.js,*.jpeg,*.gif,*.json}\" ./dist --watch",            // 追加
    "clean": "rimraf ./dist"                                                                            // 追加
  },
```

### 手順4
- bs-config.json の修正
-- コンパイル結果ファイル（jsファイル、Mapファイル）の出力先の指定

```js:bs-config.json
{
  "server": {
    "baseDir": "dist",   // src を dist に変更
    "routes": {
      "/node_modules": "node_modules"
    }
  }
}
```

### 手順5
- tsconfig.json ファイルの修正
-- コンパイル出力結果出力先の指定を追加

```js:.src/tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": [ "es2015", "dom" ],
    "noImplicitAny": true,
    "suppressImplicitAnyIndexErrors": true,
    "outDir": "../dist"                         // 追加
  }
}
```

### 手順6
- パッケージをインストールし、実行

```
npm install
npm start
```

### 手順7
- dist フォルダに js、mapファイルが存在し正常に動作することを確認する。

### 最後に
正常に動作すれば src 配下のファイルを修正しすれば、dist 配下に修正後ファイル、もしくは
コンパイル結果のファイルが出力されるようになります。

### 参考
[ver.0.0.1 ソース](https://github.com/nissato-hitoshi/angular2-sample01/tree/ver.0.0.1)

[Angular2 ひな型 ver.0.0.2](http://qiita.com/nissato-hitoshi/items/716ead1cfb1d4e4d46a1)

以上
GCEからSendGrid使ってActionMailerでメールを送信する方法

## 背景
- GCE上のRailsアプリで[Devise](https://github.com/plataformatec/devise)のメール送信を使いたかった
- 今回はSendGridでメールを送ることに
- Deviseのメール送信できるようにActionMailerを設定

## やったこと
- [SendGrid](https://sendgrid.kke.co.jp/)にアカウント作成
- conf/application.rbに以下の設定を追加した

```rb

    # deviseのメール設定
    config.action_mailer.delivery_method = :smtp

    # keyはsesの送信用keyです
    config.action_mailer.smtp_settings = {
      :user_name => 'ENV['SEND_GRID_ID']',
      :password => 'ENV['SEND_GRID_PASS']',
      :domain => 'ENV['SOME_DOMAIN']',
      :address => 'smtp.sendgrid.net',
      :port => 2525,
      :authentication => :plain,
      :enable_starttls_auto => true
    }
```

 - https://sendgrid.com/docs/Integrate/Frameworks/rubyonrails.html
Botを高速開発するためのフレームワーク「bot-express」の概要と使い方


# 概要

bot-expressはオーダーメイドのChatbotを高速に開発するためのフレームワークでNode.jsで動作します。開発者はフォーマットにしたがって「スキル」を追加するだけでChatbotの能力を拡張していくことができます。

# bot-expressに含まれる主な機能

- NLU（Natural Language Understanding）によるメッセージの意図解析
- 複数メッセンジャーへの対応
- 文脈の記憶
- ユーザーからの情報収集・リアクション
- 多言語翻訳

# 構成

### コンポーネント

bot-expressをベースとしたChatbotは下記のコンポーネントで構成されます。

![アーキテクチャー](https://raw.githubusercontent.com/nkjm/bot-express/master/material/architecture.png)

- メッセンジャー
- 自然言語処理のサービス
- Chatbot本体（bot-expressベースのNode.jsアプリ）

開発者はChatbot本体に「スキル」を追加することでChatbotの能力を拡張していくことができます。丁寧で品質の高いスキルを開発することでChatbotの精度が上がり、スキルの数を増やすことでChatbotは多くのリクエストに応えることができるようになります。このスキルは1スキル:1スキルスクリプトという形で作成します。

### 基本的な動作パターン

最も基本的な動作は下記のようになります。

1. ユーザーがChatbotにメッセージを送信。
2. bot-expressがメッセージを自然言語処理サービスに連携してメッセージの意図を解析。
3. 解析された意図に応じてbot-expressが利用するスキルを選択。
4. スキルが実行される。（例：メッセージ返信、データベース更新、IoTデバイスへの命令送信など）

bot-expressはスキルに定められたアクションを完了するために必要に応じて対話を続けていきます。対話は必要な情報を収集するためにおこなわれ、ユーザーからの返信メッセージはスキルに定められたパース処理とリアクションが自動的に適用されていきます。

# Getting Started

まずはチュートリアルをご覧ください。必要なすべての流れをステップ・バイ・ステップでカバーしています。

[bot-expressを使ってピザ注文受付Botを60分で作ってみる](http://qiita.com/nkjm/items/1ac1a73d018c13deae30)

また、bot-expressのsample_skillディレクトリにスキルのサンプルがいくつか収められていますのでスキル開発の参考にしてみてください。

[スキルのサンプル](https://github.com/nkjm/bot-express/tree/master/sample_skill)

# リファレンス

bot-expressの設定オプション、スキルスクリプトの構成、提供されるライブラリについては下記のリファレンスに完全な情報が記載されています。

https://nkjm.github.io/bot-express

# サポートされるメッセンジャー

- LINE
- Facebook Messenger

# サポートされるNLU

- Dialogflow


# 制約

Webhookでサポートしているイベントは下記の通りです。

**LINE**
- message
- follow
- unfollow
- join
- leave
- postback
- beacon

**Facebook**
- messages
- messaging-postbacks
【違い】/etc/crontabと/var/spool/cron/[user]

# はじめに
これまで、cronの設定をする際は/etc/crontabに記述して設定を行っていました。　
しかし、ある時/var/spool/cron/[user]というファイルを見つけてしまったので、この二つの違いを自分なりに調べてまとめてみます。 
ちなみに、[user]には任意のOSのユーザー名が来ます。

# 比較
##/etc/crontab
- システムジョブ（デイリーログローテーション、デイリーバックアップ等）で使用するもの
- すべてroot権限で実行
- 設定ファイル： /etc/crontab
- 設定方法: ```# vi /etc/crontab```でファイルを編集
- 記述方法： 分　時　日　月　曜日　ユーザ　コマンド
- 設定の反映には、HUPシグナルを**手動**で送信する必要あり（crondの再起動）

##/var/spool/cron/[user]
- ユーザージョブ（臨時バックアップなどの臨時で実行するジョブ）
- [user]毎に実行
- 設定ファイル： /var/spool/cron/[user]
- 設定方法: ```# crontab -u [user] -e```
- 記述方法： 分　時　日　月　曜日　コマンド （※ユーザー名は不要）
- ```# crontab -u [user] -e```後に**自動的**に反映される

# まとめ
rootで実行するか(/etc/crontab)、それ以外のユーザーで実行するか(/var/spool/cron[user])で使い分ける。　
/var/spool/cron/[user]は、直接```vi```で編集するのではなく```crontab```コマンドを利用する。
期間をSQLで取得する

columnに、StartとEndがあった場合に、
その期間がどのぐらいあったのかを調べるSQLをメモメモ。


```sql:sql文
select  (CASE 
WHEN TIMESTAMPDIFF(MONTH,@op,@ed) = 0 
	THEN (case when DATEDIFF(@ed,@op) > 27 then '1ヶ月' else '1ヶ月未満' end  )
WHEN TIMESTAMPDIFF(MONTH,@op,@ed) >= 1 
	THEN concat(TIMESTAMPDIFF(MONTH,@op,@ed) + 1 , 'ヶ月') 
ELSE '不正な日数を検出' end ) as  '期間'
```

テストのために、変数で定義してありますが、
op には 開始日 en には 終了日を入れると該当の期間を取得できまする。
cakephp3 で 嬉恥ずかし json


・RequestHandlerコンポーネントは使いません
・routes.php 設定も必要ありません

AJAXでJSONを返すコントローラー




```yourcontroller.php 

//このアクションに対する ajaxperas.ctp はいらない
    public function ajaxperas()
    {
        $this->Peras = TableRegistry::get('Peras');

        $res = $this->Peras->find()
            ->where([
                'user_id' => $this->request['data']['user_id']
            ])
            ->first();

        $this->set([
            'res' => $res,
            '_serialize' => ['res']
        ]);

    }

```



```yomidashimoto.ctp

<script>
    var data = {
        user_id:99
    };

    $.ajax({
        url: "/yourcontroller/ajaxperas/",
        type: "POST",
        dataType: "json",//これが味噌
        data: data
    }).done(function(res){

        console.log(res.res.body);//これでいける。わざわざ解析しなくていい。


    }).fail(function(res){
        alert('error!!!');
    });
</script>

```

んー！
Ajax で json 取得 と 解析完了。

まとめ
・$.parseJSON は使わない。使うとバグる。
・dataType は json を指定

以上です。
またお会いしましょう。
Gradleでファイルの文字列を置換する方法

Gradleでファイル内の特定の文字列を置換するとき、AntのReplaceタスクを使うと簡潔に書けます。

# ファイル内の対象文字列を置換する
target.txt内の「@@@」を「wombat」に置換する。
※ 変更前のファイルを残したい場合は事前にコピーしておきます。

```yaml
# file/target.txt
AAA@@@BBB@@@
```

```groovy
// build.gradle
task replaceToken; replaceToken.doLast {  
  ant.replace(file: 'file/target.txt', token: '@@@', value: 'wombat')
}
```

## 実行結果
```yaml
# file/target.txt
AAAwombatBBBwombat
```

# 参考
[公式リファレンス](https://docs.gradle.org/3.4.1/userguide/working_with_files.html#sec:filtering_files)にある通り、Copy APIの中でReplaceTokensを使えば、コピーしながらまとめて置換することもできます。

ただしその場合は、意図していなかったファイルまで置換してしまうなどの事故が起こる可能性があるため、特定のファイルだけを対象にしたい場合には、こちらの方法がベターだと思います。
地味に便利なJenkinsプラグイン

# はじめに #

Jenkins2.0がでてPipelineのgroovyスクリプトですべてが書けると思っていた時期が僕にもありました…
最終的にはそこを目指しているのでしょうが残念ながら今現在の状態としては、個人的には一番良い使い方は条件分岐やパラメータの読み込みなんかがいいんだろうなぁとおもってます。（サーバーなんかのデプロイはpipelineで解決し思想ですが…）


というわけでまだまだフリースタイルのジョブは健在なわけで…そんなフリースタイルジョブで地味に便利なプラグインをいくつか紹介したいと思います。

## pre-scm-buildstep ##

https://wiki.jenkins-ci.org/display/JENKINS/pre-scm-buildstep

Jenkinsでgitなんかを使いたいときにgitの前に操作をしたいときがあります。
そんな時にこれを使えばgitの前の操作を指定できます。

## ThinBackup ##

https://wiki.jenkins-ci.org/display/JENKINS/thinBackup

設定だけバックアップできます。
これをgitで管理しちゃうのが一番バージョニング楽だと思います



## Scriptler Plugin ##


https://wiki.jenkins-ci.org/display/JENKINS/Scriptler+Plugin


共通のスクリプトを定義できます。

似たような処理を共通で使いたいときに…


まぁ、なんというかフリースタイルでもpipeline使わせてくれないかなーとかおもうじゃん？
使えないんだなーこれが…


各種スクリプト系のプラグインの中ではまぁいい方だと思います。

これセキュリティ上の問題が解決できないまま消えました。

## Configuration Slicing plugin ##

https://wiki.jenkins-ci.org/display/JENKINS/Configuration+Slicing+Plugin

横断的にいろんな設定ができるので特にログローテーションの設定とかしたいときに便利。






#pipeline登場前は便利だった系#

## Conditional BuildStep ##

https://wiki.jenkins-ci.org/display/JENKINS/Credentials+Binding+Plugin

こいつはif文てきな条件分岐を作れます…
が…使いすぎると設定わけわからなくなるのでほどほどにしましょう。
pipelineで構築したほうが基本的には今は良いです。

## Naginator ##

https://wiki.jenkins-ci.org/display/JENKINS/Naginator+Plugin

失敗したときのリトライに…
でもpipelineでいいや
[Perl]Log::Dispatch系モジュールとuse utf8の併存

## 要旨
use utf8プラグマの影響下で[Log::Dispatch](https://github.com/houseabsolute/Log-Dispatch)(あるいは[Log::Dispatch::Config](http://search.cpan.org/~miyagawa/Log-Dispatch-Config-1.04/lib/Log/Dispatch/Config.pm))を使おうとすると"Wide character in print ~"なwarningが出る件について調査しました。

## 結論
configファイルに数行書き加えるだけでしたが、[file](https://github.com/houseabsolute/Log-Dispatch/blob/master/lib/Log/Dispatch/File.pm)と[screen](https://github.com/houseabsolute/Log-Dispatch/blob/master/lib/Log/Dispatch/Screen.pm)で指定方法が違います。

## 実装

```perl:sample.psgi
use strict;
use warnings;
use Encode;

use Log::Dispatch::Config;
Log::Dispatch::Config->configure('./log.conf');
my $dispatcher = Log::Dispatch::Config->instance();
$dispatcher->info( decode_utf8 "再起動" );
# ↑全ての出力をencodeするため、use utf8されていないスコープではdecode_utf8が必須

use Plack::Request;

sub {
    use utf8;
    my $req = Plack::Request->new(shift);

    unless( $req->path eq '/') {
        $dispatcher->warning("ルート以外へのアクセス");
        return [404, [], ['Not Found']];
    }
    # 必要な処理を書く

    $dispatcher->info("正常な処理の完了");
    return [200, [], ["OK"]];
};
```

```text:log.conf
dispatchers = file screen

file.class = Log::Dispatch::File
file.min_level = notice
file.filename = ./log/error_log         
file.mode = append
file.format = [%d] [%p] %m at %F line %L %n
file.binmode = :utf8

screen.class = Log::Dispatch::Screen
screen.min_level = debug
screen.stderr = 1
screen.format = [%p] %m %n
screen.utf8 = 1
```

fileのプロパティの定義に`file.binmode = :utf8`、screenのプロパティの定義に`screen.utf8 = 1`と書き加えることで[Log::Dispatch](http://search.cpan.org/~drolsky/Log-Dispatch-2.63/lib/Log/Dispatch.pm)が全ての出力をencode_utf8してくれるようです。

ちなみにこれがわかるまでは、

```perl:sample2.psgi
sub {
    use utf8;
    my $req = Plack::Request->new(shift);

    unless( $req->path eq '/') {
        $dispatcher->warning( encode_utf8("ルート以外へのアクセス") );
        return [404, [], ['Not Found']];
    }
    # 必要な処理を書く

    $dispatcher->info( encode_utf8("正常な処理の完了") );
    return [200, [], ["OK"]];
};
```

のように逐一encodeを挿入してて辛かったです。

## 参考文献
- [Log::Dispatchにそれっぽいテストがあった](https://github.com/houseabsolute/Log-Dispatch/tree/master/t)
Unityにおける??(null合体演算子)の使用例

#??(null合体演算子)とは
?? 演算子は、null 合体演算子と呼ばれます。左側のオペランドが null 値でない場合には左側のオペランドを返し、null 値である場合には右側のオペランドを返します。

##使用例
###if文の時
```ruby:sample.cs
var boxCollider = gameObject.GetComponent<BoxCollider> (); //コンポーネントを取得
if (BoxCollider == null) 
{
    // 取得できなかったら追加する
    BoxCollider = gameObject.AddComponent<BoxCollider> ();
}
```
###??を使用した書き方
```ruby:sample.cs
//コンポーネントを取得できなかったら追加する
var boxCollider = gameObject.GetComponent<BoxCollider> () ?? gameObject.AddComponent<BoxCollider> ();
```

すっきり書けました！

[追記]
そもそも、取得元のオブジェクトにMonoBehaviourを継承したクラスをくっつけて[RequireComponent(typeof (BoxCollider))]として必須のコンポーネントを指定しておけば問題ない場面が多いかもしれません。

[参考]
[必須コンポーネントの指定 http://www.wisdomsoft.jp/654.html](http://www.wisdomsoft.jp/654.html)
コントロールをGraphicsへ描画

DataGridViewではCellにUserContorlを表示することができない。
なら、DataGridViewColumnにUserControlを持たせておき、
そのUserControlを利用して描画すればよいのではないか(-_-)

なので、Control.DrawToBitmapを~~参考~~流用して実現してみた。

```csharp:CaptureControl.cs
public class CaptureControl
{
	[DllImport("user32.dll", CharSet = CharSet.Auto)]
	private static extern IntPtr SendMessage(HandleRef hWnd, int msg, IntPtr wParam, IntPtr lParam);
	[DllImport("gdi32.dll", CharSet = CharSet.Auto, ExactSpelling = true, SetLastError = true)]
	private static extern bool BitBlt(HandleRef hDC, int x, int y, int nWidth, int nHeight, HandleRef hSrcDC, int xSrc, int ySrc, int dwRop);

	public static void Capture(Graphics graphics, Control control, Rectangle rect)
	{
		int width = Math.Min(rect.Width, control.Width);
		int height = Math.Min(rect.Height, control.Height);
		using (var image = new Bitmap(width, height))
		using (Graphics sourceGraphics = Graphics.FromImage(image))
		{
			var sourceHdc = sourceGraphics.GetHdc();
			SendMessage(new HandleRef(control, control.Handle), 791, sourceHdc, (IntPtr)30);
			IntPtr hdc2 = graphics.GetHdc();
			BitBlt(new HandleRef(graphics, hdc2), 0, 0, width, height, new HandleRef(sourceGraphics, sourceHdc), 0, 0, 13369376);
			graphics.ReleaseHdcInternal(hdc2);
			sourceGraphics.ReleaseHdcInternal(sourceHdc);
		}
	}
}

```
調整さんと整数線形計画

提出された調整さんから、ランチ会の最適な組み合わせを整数線形計画として定式化して解いてみました。

PuLPというpythonの最適化パッケージで解いてみました。

PuLPの使い方はこの記事がとてもわかりやすいです。
http://qiita.com/mzmttks/items/82ea3a51e4dbea8fbc17

# 要件
まず調整さんを出してもらいましょう。
<img width="1439" alt="TECH__MASTER_３月ランチ会___調整さん_と_pandas_get_dummies_—_pandas_0_19_2_documentation.png" src="https://qiita-image-store.s3.amazonaws.com/0/151852/63f64140-8308-10e7-8d7d-0094776a82d6.png">

**・一人あたりどこかの日程に必ず参加する**
**・日程ごとの人数はできる限り等しくする**

これを頑張って定式化しましょう。

まず、
$P$ = (メンバーの集合)
$D$ = (日程の集合)
とします。

$p\in P, d\in D$に対し、

```math
\mathrm{hope}[p][d] = \left\{
\begin{array}{ll}
1 & (pがdに○) \\
0 & (pがdに×)
\end{array}
\right.

```
と調整さんの結果から定数を決めます。

次に変数を設定します。

$\mathrm{attend}[p][d]= (1or0)$は、$p$が$d$に実際に参加するかを表す変数です。
$M$は各日程の参加人数の上限です。これの最小化を目指すことで、各日程にばらつきない人数を割り当てることができます。

定式化するとこんな感じ。

```math
\begin{align}
\mathrm{min} &\ M \\
\mathrm{s.t} \ &\forall d\in D\ \Sigma_{p \in P}\mathrm{hope}[p][d]\times \mathrm{attend}[p][d] \leq M \\
&\forall p\in P\ \Sigma_{d \in D}\mathrm{hope}[p][d]\times \mathrm{attend}[p][d] = 1

\end{align}
```

制約条件の一つ目の式は、それぞれの日において、参加人数はM以下という条件。
制約条件の二つ目の式は、それぞれの人は、必ず１回だけ参加するという条件。

これをガンガンときましょう。

# コード

```python:chousei.py
import pulp

date = ["3/8", "3/9", "3/11", "3/15"]
people = # ここにメンバーの名前のリストを入れる

_table = [
[1,1,1,1], 
[0,1,0,0],
[1,1,0,0],
[0,1,1,0],
[1,0,0,0],
[1,1,0,1],
[1,0,0,0],
[0,1,0,1],
[0,1,1,0],
[1,1,1,1],
[1,1,1,1],
[1,1,0,0],
[1,0,0,1],
[0,1,1,1],
[0,1,0,0],
[1,1,1,1]] #調整さんの結果を書く


table = {}
for i,p in enumerate(people):
    table[p] = {}
    for j,d in enumerate(date):
        table[p][d] = _table[i][j]
# 辞書型に変換

problem = pulp.LpProblem('chousei', pulp.LpMinimize)
attend = pulp.LpVariable.dicts('attend', (people, date), 0, 1, 'Binary')
M = pulp.LpVariable('M', 0, 1000, 'Integer')
problem += M

for p in people:
    each_people = 0
    for d in date:
        each_people += table[p][d]*attend[p][d]
    problem += each_people == 1

for d in date:
    each_date = 0
    for p in people:
        each_date += table[p][d]*attend[p][d]
    problem += each_date <= M

problem.solve()

for d in date:
    each_date = ''
    for p in people:
        if(table[p][d] == 1　and attend[p][d].value() > 0):
            each_date += p
    print "{}: {}".format(d, each_date)
```

# 改良
このままだと年長者だけが固まる日程ができる可能性があるので、メンバー一人一人に重みをつけておいて、各日程ごとの重みの和の上限も最小化するみたいなことをすると良いと思います。気が向いたら解説します。
NSStringのサイズ取得の穴

#sizeWithAttributes
`sizeWithAttributes`は、正しいサイズを取得できないケースがあります。

>文字列に、指定フォントに無いものが含まれていれば、`sizeWithAttributes`は正しいサイズを取得出来ません。

例えば、等倍フォントである「Courier」は日本語が含まれていません。
**フォントに「Courier」を指定し、文字列に日本語が含まれていれば、`sizeWithAttributes`は本来のサイズを返しません。**

iOSでは、足りない分は他フォントで代用、文字が表示されない事は無いので、
一見困ることはないのですが、上記の様な落とし穴に注意してください。

CoreTextならば、このような場合でも正しいサイズが取得できます。

```objc:サイズ取得の比較
NSString *text = @"チ";

// 文字装飾
NSMutableDictionary *dictAttr = [NSMutableDictionary dictionary];
[dictAttr setObject:[UIFont fontWithName:@"Courier" size:64.0] forKey:NSFontAttributeName];

/* ********************
 * sizeWithAttributesでサイズ取得
 ******************** */
// サイズ取得
CGSize sizeFont = [text sizeWithAttributes:dictAttr];

// ログ出力
NSLog(@"sizeWith~:%@", NSStringFromCGSize(sizeFont));

/* ********************
 * CoreTextでサイズ取得
 ******************** */
// 装飾文字列の生成
NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:text attributes:dictAttr];
//フレームセッターの作成
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attrStr);
// サイズ取得
CGSize contentSize = CTFramesetterSuggestFrameSizeWithConstraints(
                                                                  framesetter,
                                                                  CFRangeMake(0, attrStr.length),
                                                                  nil,
                                                                  CGSizeMake(200, 200),
                                                                  nil);

// ログ出力
NSLog(@"CoreText:%@", NSStringFromCGSize(contentSize));

```
```:出力ログ
sizeWith~:{64, 64}
CoreText:{64, 71}
```

このように、sizeWithAttributesでは縦幅が小さくなっています。

#drawInRect
drawInRectでも、上記に起因すると思われる問題が見られます。

>drawInRectは、sizeWithAttributesと同じ認識を元に、描画の原点としている？

```objc:前述のtextを描画
CGRect rectImage = CGRectMake(0, 0, 96.0, 96.0);

// 画像処理開始
UIGraphicsBeginImageContextWithOptions(rectImage.size, NO, 0.0);

// テキストの描画
[text drawInRect:rectImage withAttributes:dictAttr];
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
    
// 画像処理終了
UIGraphicsEndImageContext();
```
![resultImage](https://qiita-image-store.s3.amazonaws.com/0/46091/ccccdd31-e99b-bfa6-2aa6-c022f5c6ea75.jpeg)

64x64に対して96x96の十分な余裕を持たせても、"チ"の上部がわずかに欠けてしまっています。

本来64x71のところ、
`drawInRect`が64x64と誤認している為、原点がズレてしまっていると思われます。

`drawInRect`のy軸を少しズラすと、上部も描画されます

#まとめ
日本語が含まれないフォントの使用は、それほど珍しくないように思います。
その都度、CoreTextを意識しないといけないのは少々面倒な話ですね。
C++ Builder XE2, 10.2 Tokyo > ","付きの文字列に追加項目を加えて、通信して、項目ごとに分解する

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

- 項目の区切りに","を使用
- 送信したい項目の１つに","が含まれる場合
- 送信先できちんと","つきで１つの項目として処理したい

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

#include <vcl.h>
#pragma hdrstop

#include <memory>
#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)
{
	String wrk;

	static const String kString_replaced = L"..."; // 一時的に置き換える文字列
	String payload = L"ab,cd"; // 送信文字(例)

	wrk = L"original:" + payload;
	OutputDebugString(wrk.c_str());

	// 1. encode
	payload = StringReplace(payload, L",", kString_replaced, TReplaceFlags()<<rfReplaceAll);

	// 2. add 2nd item
	payload += L",column2";
	wrk = L"with 2nd:" + payload;
	OutputDebugString(wrk.c_str());

	// 3. parse
	std::unique_ptr<TStringList> list(new TStringList);
	list->Delimiter = L',';
	list->StrictDelimiter = true;
	list->DelimitedText = payload;

	// 4. decode
	list->Strings[0] = StringReplace(list->Strings[0], kString_replaced, L",", TReplaceFlags()<<rfReplaceAll);

	// debug

	wrk = L"1st:" + list->Strings[0];
	OutputDebugString(wrk.c_str());
	wrk = L"2nd:" + list->Strings[1];
	OutputDebugString(wrk.c_str());
}
//---------------------------------------------------------------------------
```

```txt:結果
デバッグ出力: original:ab,cd プロセス Project1.exe (3860)
デバッグ出力: with 2nd:ab...cd,column2 プロセス Project1.exe (3860)
デバッグ出力: 1st:ab,cd プロセス Project1.exe (3860)
デバッグ出力: 2nd:column2 プロセス Project1.exe (3860)
```

### TODO

- 一時的に置き換える文字列の検討
  - 長すぎない文字列で適当なもの
  - https://en.wikipedia.org/wiki/Escape_character
【メモ】LPWA

### LPWAとは?
![link-labs-lpwa-webinar-4-638.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/3253bf70-bb87-d19f-f4ac-34f7553fbebf.jpeg)
![iot-seminar-jan-2016-4-friedhelm-rodermund-lwm2m-and-lpwa-3-638.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/70a3fb22-80f8-2b63-2595-bf24d3af450e.jpeg)

### why LPWA?
![LPWA-GRAPH-1.png](https://qiita-image-store.s3.amazonaws.com/0/134166/1f07ad94-b61c-37da-f53a-3aca76f6b481.png)
![en_lpwa_img_3.png](https://qiita-image-store.s3.amazonaws.com/0/134166/2cea6270-4c37-6fcb-dff8-72746b5cc984.png)
try! Swift Tokyo 2017 ざっくりレポート (day1)

2017年3月２日と3日に開催された try!Swift Tokyo 2017 に参加してきましたので、ざっくりとレポートをまとめます。
両日とも半日のみの参加でしたので、全てのセッションは網羅していません。
特に興味を持ったセッションについては個別に取り上げていきたいと思います。

- [try! Swift Tokyo 2017 - Swift on Android(1)](http://qiita.com/metal-president/items/2f8abaeb85ab46fe3b22)

# 2017-03-02 (day 1)
まず1日目から。

## Swift開発者が知りたかったけど聞きにくい機械学習のすべて

[Alexis Gallagher さん](https://twitter.com/alexisgallagher)

普通のプログムは `関数を定義する` だったのが、機械学習(ML) は `人間の分析を加えて定義する` に進化したものだそうです。
例えば人に関する何らかの平均値を出力する関数があったとして、MLの場合は性別や年齢に応じたアプトプットができるようになる、というお話でした。

## Swift on Android

[Eric Wing さん](https://twitter.com/ewingfighter)

Cross-Platform ゲームエンジニア 視点での、Swiftによる Androidアプリ開発という内容でした。
要約すると

- Apple が公開している [Getting Started with Swift on Android](https://github.com/apple/swift/blob/master/docs/Android.md) では、アプリを作れないからダメだ
- C言語は最強
- NDK は大変お粗末だ（具体的な解説多数あり）
- CMake いいよ
- [IUP](http://webserver2.tecgraf.puc-rio.br/iup/) というマルチプラットフォームなUIライブラリがあるよ
- Cross-Platform ゲームエンジンの [BLURRR SDK](http://blurrrsdk.com/) いいよ

という内容でした。


## SwiftのPointy Bits

[Nate Cook さん](https://twitter.com/nnnnnnnn)

Swift は型安全な言語だけどバグによりクラッシュするよ、という内容（？）から始まり、Unsafe にメモリを直接割り当てて操作する 4つの API についての解説でした。
- UnsafePointer<T>
- UnsafeMutablePointer<T>
- UnsafeRawPointer
- UnsafeMutableRawPointer

これらは C言語のライブラリをインポートするときに利用することがあったり、処理を高速化する（安全性とのトレードオフ）ときに利用するとのことでした。


## アプリを新次元に導く3D Touch

[Meghan Kane さん](https://twitter.com/meghafon)

なぜ 3D Touchサポートするべきか？
- 使いたい機能に早く辿り着ける
- App Storeでとあげられる

3D Touch 概要
- 静的と動的が混在できる
- 最大４つまで
- iOS10 からは `Peek&Pop` に対応

ノウハウとして
- デバイスのサポート、設定のON/OFFをチェックすること
- 未サポートの場合Long Press で似たようなUIを提供できる(Peek&Pop)
- UIPreviewInteraction で圧力を取得できる


1日目のレポートは以上です。
「プレミアムフライデー」を求める関数を作ってみた

（これは私のブログ記事「[「プレミアムフライデー」を求めるパッケージを作ってみた](http://text.baldanders.info/golang/premium-friday/)」からの一部転載です）

そういえば先月の「プレミアムフライデー」，皆様はいかがお過ごしでしたか。私は3時間も残業してしまいましたよ（笑）

ちうわけで，以下を真似して「プレミアムフライデー」を求める関数を考えてみる。もちろん息抜きである。潤いは大事。でも実用性はないと思われ。

- [プレミアムフライデーを求めるメソッドを作った - Qiita](http://qiita.com/neko_the_shadow/items/4ebf94a8a6d9282e7207)
- [プレミアムフライデーを求めるメソッドを作った（Java8版） - Qiita](http://qiita.com/deaf_tadashi/items/963a62072338f09f12a5)

とりあえずベタに書いてみる。

```go:pf.go
package main

import (
	"flag"
	"fmt"
	"os"
	"strconv"
	"time"
)

//GetPremiumFriday returns day of premium friday
func GetPremiumFriday(y int, m time.Month) (int, error) {
	//引数のチェック
    if y < 2017 || m < time.January || m > time.December {
		return 0, os.ErrInvalid
	}
	if y == 2017 && m < time.February { //2017年1月は実施前なのでエラー
		return 0, os.ErrInvalid
	}

	//指定月末（翌月0日）で初期化する
    tm := time.Date(y, m+1, 0, 0, 0, 0, 0, time.UTC) //時差は影響しないので，とりあえず UTC で

    w := tm.Weekday() - time.Friday
	if w < 0 {
		w += 7
	}
	return tm.Day() - (int)(w), nil
}

func main() {
	flag.Parse()
	argsStr := flag.Args()
	if len(argsStr) < 2 {
		fmt.Fprintln(os.Stderr, "年月を指定してください")
		return
	}
	args := make([]int, 2)
	for i := 0; i < 2; i++ {
		num, err := strconv.Atoi(argsStr[i])
		if err != nil {
			fmt.Fprintln(os.Stderr, err)
			return
		}
		args[i] = num
	}
	d, err := GetPremiumFriday(args[0], time.Month(args[1]))
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		return
	}
	fmt.Println(d)
}
```

指定月末を求めるのに「翌月0日」で初期化するのがポイント（つか，ここしかポイントになるものがないw）。実行結果は以下の通り。

```text
$ go run pf.go 2017 2
24
```

期待通りの値が得られた。

## ブックマーク

- [Perl6でプレミアムフライデーを求める - Qiita](http://qiita.com/B73W56H84/items/89c07a6f26b445f1c6d8)
- [プレミアムフライデーを求める記述をKotlinで書いてみた - Qiita](http://qiita.com/deaf_tadashi/items/8e4b3f0bfb50242fad76)
- [Golangでプレミアムフライデーかどうか判定する - Qiita](http://qiita.com/qube81/items/1e93c837c0a7e3d99a10)
Key-Value形式

key:valueに対応した形式。
営業部：山田　、等。

疑問。
同じkeyは存在できない？

下記参照。
http://dev.classmethod.jp/etc/concrete-example-of-json/
http://www.trident-game.com/blog/2015/10/14/%E3%80%90%E8%BC%AA%E8%AC%9B%E3%80%91json%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9/