OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHP3をPHP7.1で動かした場合、DateTime周りでWarningが出る

[前回記事](http://qiita.com/zaramme/items/df18270fffec548f4900)の対応で、現在稼働しているCakePHP3のシステムのPHPバージョンを5.6->7.1に上げる事を検証した際に、CakePHP3の仕様に依存するWarningが見つかったので共有します。

### 検証環境
- CentOS 6.8(on Vagrant)
- PHP7.1.0
- CakePHP3.3.3

## エラー内容

`Cake\I18n\Time` をロードしたバッチを起動した際に、以下のWarningメッセージが出力されます。実行内容には影響は出ません。

```
Warning Error: Declaration of Cake\Chronos\Traits\FrozenTimeTrait::setTime($hours, $minutes, $seconds = 0) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in [/vagrant/repos/vendor/cakephp/chronos/src/Date.php, line 24]
```

## 原因

PHP7.1で、Datetimeクラスがマイクロ秒に対応し、メソッドのインターフェースが変わったことが要因です。

- 継承元

```
DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL)
```

- 継承先

```cakephp/chronos/src/trait/frozenTimetrait.php
    public function setTime($hours, $minutes, $seconds = 0)
    {
        return parent::setTime(0, 0, 0);
    }

```

4番目の引数として`$mictoseconds=NULL`が追加されているため、継承元とメソッド構造が異なってますよ、ということですね。（とはいってもデフォルト引数なので動作自体には問題はないと思われます）
今回出た警告は上記の`frozenTimetrait.php`での物ですが、7.1で全般的にマイクロ秒対応したとのことなので、実際はもっと沢山の箇所で同様の警告が出ることが予想されます。

### 参考
- [PHP:DateTime constructor incorporates microseconds](http://php.net/manual/en/migration71.incompatible.php#migration71.incompatible.datetime-microseconds)

- [PHP 7.1からDateTimeが現在時刻のマイクロ秒まで見るようになった](http://qiita.com/hnw/items/665ff303d37d50fc0bff)

(PHPのドキュメントで具体的に7.1のDatetimeクラスの仕様ページがあった気がするのですが、見つからなくなってしまいました・・・。もし見つけた方はコメントください)

## そもそもCakePHP3.3.3ではPHP7.1には正式対応していないっぽい

- 公式ドキュメントを色々と当たってみたのですが、CakePHP3そのものや、`chronos` 関係でPHP7.1に対応したというリリースログは見当たりませんでした。明言はされていませんが、 **2017/1/19現在、CakePHPはPHP7.1に対応していない** と判断するのが妥当なのかな、と思われます。（こちらも公式で言及している部分を見つけた方がいましたらコメントください）

## 結論
CakePHP3でPHP7系を使用したい場合、特にプロダクトで使う場合はバージョンはPHP7.0で止めた方が無難である。
PowerShellメモ　ファイル選択ダイアログ

# <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
ファイル選択ダイアログを表示して、選択されたファイル名をコンソールに出力するサンプル。

# <i class="fa fa-file-text-o" style="font-size:1em;"></i> コード

```PowerShell
Add-Type -AssemblyName PresentationFramework
function FileSelect()
{
    $dlg = New-Object Microsoft.Win32.OpenFileDialog
    # フィルタ設定
    $dlg.Filter = "テキストファイル|*.txt|HTML|*.htm;*.html|CSVファイル|*.csv"
    # ダイアログ表示
    $result = $dlg.ShowDialog()
    # 戻り値確認
    if ($result -eq $true) {
        Write-Host $dlg.FileName  -ForegroundColor Cyan
    } else {
        Write-Host "選択キャンセル" -ForegroundColor Cyan
    }
}
```

# <i class="fa fa-cubes" style="font-size:1em;"></i> 実行例
![ps38.png](https://qiita-image-store.s3.amazonaws.com/0/142879/329c97f1-0541-112f-f419-c41615b3a69e.png)


# <i class="fa fa-cubes" style="font-size:1em;"></i> 動作確認した環境
* PowerShell V4 (Windows 8.1)
* PowerShell V5 (Windows 10)
macでnode.jsを動かす


## node.jsのインストール
node.jsのサイト
https://nodejs.org/ja/
から、推奨版　v6.9.4LTS (2017/1/19時点）をダウンロードし、インストール。

インストールは「次へ」を押すだけ。


![スクリーンショット 2017-01-19 20.32.31.png](https://qiita-image-store.s3.amazonaws.com/0/85811/1b94d9dd-0619-96df-ed13-6cdc3363aa3e.png "スクリーンショット 2017-01-19 20.32.31.png")

## 動作確認
ターミナルを開き、バージョンを確認する

> $node -v
> v6.9.4

無事インストールされた。
OpenJDKでPairを使う


Abstract: You can instantiate `java.util.AbstractMap.SimpleEntry` instead of `javafx.util.Pair`, even in OpenJDK or Java7 (or lesser).

---

- 競技プログラミングではときどきキーと値の組、すなわちペアを使いたいことがある。
- スクリプト言語では配列に複数の型の値を入れられる。
- C++では`std::pair`、C#では`System.Collections.Generic.KeyValuePair`や`System.Tuple`、Crystalでは`Tuple`といったように、コンパイル言語ではペアのサポートがある。
- 一方、Javaにはペアのサポートがない。
- Java8にはjavafx.util.Pairというクラスが導入されたが、OpenJDKには導入されていない。
  - 余談: yukicoderでは私の答案が一度ACになったものの、Sun JavaからOpenJDKに変更されたためCEになってしまった。
  - http://yukicoder.me/submissions/19483

---

- 同じインターフェースを持つものに`java.util.Map.Entry`があるが、これはインスタンス化することができない。
- これについて調べたところ、`java.util.AbstractMap.SimpleEntry`というクラスを用いれば良いことがわかった。
  - http://stackoverflow.com/questions/3110547/java-how-to-create-new-entry-key-value
  - 上記yukicoderの答案も無事に修正することが出来た。
  - http://yukicoder.me/submissions/144818
オフラインリアルタイムどう書くF01 の問題をRuby正規表現で解く

問題 : http://nabetani.sakura.ne.jp/hena/ordf01_twicel/
実装リンク集 : http://qiita.com/Nabetani/items/8e02ede04315b4eadd6d

Rubyで正規表現を使って電車の中で実装。
隣の人に肘がぶつかってやりにくかった。

```ruby:hoge.rb
def match_count(t, reg)
  cnt = 0
  while t =~ reg
    cnt += 1
    i = t.index($1)
    t = t[i + 1, t.size - i - 1]
  end
  cnt
end

def num_count(t)
  regh = /(\D{2}.{7}\D\d{2}\D.{7}\D{2})/
  regv = /(\D.{8}\D\d\D.{7}\D\d\D.{8}\D)/
  [regh, regv].map { |reg| match_count(t, reg) }.inject { |a, e| a + e }
end

def wb_count(src)
  t = ['a' * 10, src.split('/').map { |a| 'a%08ba' % a.hex }, 'a' * 10].flatten.join
  %w(1 0).map { |a| num_count(t.gsub(a, 'a')) }.join(',')
end

DATA.each do |d|
  n, src, exp, _link = d.split
  act = wb_count(src)
  puts %(#{n} : #{src}  #{act} != #{exp}) if act != exp
end

__END__
0 	dc/bc/a7/59/03/d5/d4/ea 	2,3 	リンク
1 	ff/ff/ff/ff/ff/ff/ff/ff 	0,0 	リンク
2 	00/00/00/00/00/00/00/00 	0,0 	リンク
3 	cc/33/cc/33/cc/33/cc/33 	16,16 	リンク
4 	aa/aa/55/55/aa/aa/55/55 	16,16 	リンク
5 	ac/a3/5c/53/ca/3a/c5/35 	8,8 	リンク
6 	db/00/db/00/db/00/aa/aa 	0,13 	リンク
7 	24/24/db/24/24/db/24/24 	0,12 	リンク
8 	d7/d7/e9/f1/f7/de/60/56 	3,2 	リンク
9 	17/7d/64/9b/a5/39/53/a6 	2,2 	リンク
10 	bb/8f/18/fb/89/c2/c7/35 	1,2 	リンク
11 	6d/63/20/08/54/cd/32/4f 	2,2 	リンク
12 	a9/ca/cd/46/99/e6/f0/30 	2,2 	リンク
13 	5b/70/fd/45/e2/a1/ab/9a 	1,2 	リンク
14 	24/e4/a8/12/e1/a6/3f/f3 	2,1 	リンク
15 	79/32/2e/07/d5/10/e7/9d 	2,2 	リンク
16 	60/bc/ab/ec/1f/eb/63/2c 	4,2 	リンク
17 	a5/dd/92/4e/67/c6/dc/34 	6,1 	リンク
18 	aa/96/6d/67/d2/a8/ac/90 	3,2 	リンク
19 	95/72/7d/5c/47/dc/ef/99 	4,0 	リンク
20 	17/d6/6a/27/1f/25/26/b8 	2,1 	リンク
21 	f0/f3/76/c5/31/ca/6b/ae 	1,2 	リンク
22 	01/59/26/fa/8c/70/12/cd 	1,4 	リンク
23 	1a/c3/1f/0b/83/b6/81/0d 	0,5 	リンク
24 	4c/49/05/cf/54/bb/1f/da 	1,2 	リンク
25 	eb/7c/d5/09/2a/c2/14/6b 	0,7 	リンク
26 	b4/d3/4c/c4/ed/19/e8/63 	1,3 	リンク
27 	bd/bc/6d/60/9b/00/9a/32 	2,4 	リンク
28 	94/97/3f/e3/c7/06/15/c0 	2,2 	リンク
29 	5f/1d/67/16/b8/f7/0a/2a 	2,2 	リンク
30 	df/e6/f9/4f/59/e9/1f/ee 	3,0 	リンク
31 	5a/53/9a/9a/73/b4/37/07 	3,2 	リンク
32 	bd/87/7c/e7/c0/37/82/da 	2,3 	リンク
33 	3d/c0/13/ac/57/3d/15/78 	2,2 	リンク
34 	63/64/54/3a/40/28/4e/4e 	0,3 	リンク
35 	f6/81/c9/15/00/4c/a0/a8 	1,4 	リンク
36 	19/41/df/f8/e3/74/6b/9b 	4,2 	リンク
37 	d5/0b/dd/35/3b/d2/0b/6b 	1,5 	リンク
38 	08/b7/91/f3/6e/3c/74/a0 	0,0 	リンク
39 	b8/a8/b4/a6/93/2c/94/3f 	0,0 	リンク
40 	88/22/21/ee/dc/19/43/01 	0,0 	リンク
41 	e1/ee/35/bc/fc/00/8e/fe 	0,0 	リンク
42 	3c/42/63/5f/27/47/07/90 	0,0 	リンク
```

端っこの判定が面倒なので上下左右に1マスずつクワイエットゾーンを設けました。（'a' のこと）

あとは2マスが横並び、縦並びの2種類あるので、それぞれのパターンにマッチする正規表現（regh, regv）を作って、マッチ数を白黒それぞれで数えています。

正規表現のパターンを作るのが面倒でした。
実際のところテスト通ったからOKなんだろうけど、パターンの要素数を目視では数えられませんでしたね。
例えば、¥D{7}の7のことです。

それと当初はマッチ数の計測にscan.sizeを使おうとしましたが、この方法だと文字列が重複する箇所は計測できないので、仕方なくマッチ数を求める関数を作ることにしました。

うまいやり方があれば教えてください。
> 投稿後にアドバイスいただきましたので、num_countの実装を以下のように修正しました。
正規表現の肯定先読みを使うことで、私のやりたかったscan.sizeでの実装が実現できました。

```ruby
def num_count(t)
  reg1 = /\D{2}(?=.{7}\D\d{2}\D.{7}\D{2})/
  reg2 = /\D(?=.{8}\D\d\D.{7}\D\d\D.{8}\D)/
  [reg1, reg2].map { |reg| t.scan(reg).size }.inject { |a, e| a + e }
end
```
曜日から次の曜日の日付を取得する

なかなか事例がないと思いますが、次の日曜日を取得する必要があったので、書いてみました。

```swift
// 例）次の日曜日を取得
let weekday : Int = 0

let cal = Calendar(identifier: Calendar.Identifier.gregorian)

let comp : DateComponents = cal.dateComponents([.year, .month, .day, .weekday, .hour, .minute], from: Date())
var fixComp : DateComponents = DateComponents()

// 　マイナスになった場合は7を足して、調整する
let addDay : Int = (weekday - comp.weekday!) < 0 ? (weekday - comp.weekday!) + 7 : (weekday - comp.weekday!)

// 計算した日付を足して、次の曜日が来る日に調整
fixComp.day = addDay

// 調整を基に日付を取得
let date : Date = cal.date(byAdding: fixComp, to: Date())!
```

なお、「次の」ではなく「その週の」曜日の日付を取得したい場合は、

```swift
let addDay : Int = (weekday - comp.weekday!) < 0 ? (weekday - comp.weekday!) + 7 : (weekday - comp.weekday!)

↓

let addDay : Int = (weekday - comp.weekday!)
```

このように変更すれば取得することができます。

そして例では今を基準にしていますが、``Date()``のところの箇所を過去・未来の日付にすれば、基準となる日を変更することができます。

```swift
// 例）今から2週間後を基準値に設定
let futureDate : Date = Date(timeIntervalSinceNow:60*60*24*7*2)
let weekday : Int = 0

let cal = Calendar(identifier: Calendar.Identifier.gregorian)

let comp : DateComponents = cal.dateComponents([.year, .month, .day, .weekday, .hour, .minute], from: futureDate)
var fixComp : DateComponents = DateComponents()

let addDay : Int = (weekday - comp.weekday!)

fixComp.day = addDay

// 2週間後の週の中の日曜日の日付を取得
let date : Date = cal.date(byAdding: fixComp, to: futureDate)!
```


参考：http://program.station.ez-net.jp/special/handbook/objective-c/nsdate/next-weekday.asp
C++BuilderでADO接続を使ってFileMakerへODBC接続

C++Builder 10.1 Berlin ProfessionalではFireDacやDbExpressによるODBC接続が出来ません。(無駄に高額なFireDAC Client/Server Add-On Packを購入する必要がある。)
![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/76058/928dffb9-91db-3240-1d01-81d1b8aa1699.jpeg)
そこで、dbGo（ADO接続）によってODBC接続してFileMakerに繋げてみました。
![スクリーンショット 2017-01-19 19.22.43.png](https://qiita-image-store.s3.amazonaws.com/0/76058/3e57cf09-1038-429e-ff06-c004c9610f70.png)

環境
Windows 10 pro
C++Builder 10.1 Berlin
FileMakerServer 11

## 1.ODBCクライアントドライバのインストール

下記URLからダウンロードしてインストール作業を行って下さい。(因みにFileMakerPro同封のドライバだと文字列をうまく処理出来ない可能性があるので、そちらは使わないでください）

> FileMaker 11.3.76 xDBC クライアントドライバ
> http://filemaker-jp.custhelp.com/app/answers/detail/a_id/9269/~/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2-%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%EF%BC%9Afilemaker-11.3.76-xdbc-%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90

## 2.DSNに追加
C:\Windows\SysWOW64\odbcad32.exe
を起動して、
ODBCデータソースアドミニストレータ(32bit)上で、「追加」をクリックし、新しく接続を構成します。この時、必ず「テキストフィールドをlong varcharとして記述」にチェックを入れましょう。
![10.jpg](https://qiita-image-store.s3.amazonaws.com/0/76058/f0971a8d-df2f-2560-2abf-1f68691d919c.jpeg)

## 3.TADOConnectionをフォームかデータモジュール上に貼り付け
![スクリーンショット 2017-01-19 19.43.43.png](https://qiita-image-store.s3.amazonaws.com/0/76058/7e268e79-db99-7e5b-a246-df36267ecb6d.png)

貼り付けた後はADOConnection1をダブルクリックして、データリンクプロパティを設定していきます。
![07.jpg](https://qiita-image-store.s3.amazonaws.com/0/76058/9fe2ea95-0e88-4d8a-fbb9-ef00b8b6db42.jpeg)

![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/76058/db866f8b-ac11-870c-3db4-f5fa889a66d1.jpeg)

データソース名を使用するに、先程追加したデータソース名を指定します

![05.jpg](https://qiita-image-store.s3.amazonaws.com/0/76058/919ec367-826d-eebe-e0fc-c224011199f0.jpeg)


![06.jpg](https://qiita-image-store.s3.amazonaws.com/0/76058/766600f6-565d-d401-5383-6c6b48556e5e.jpeg)

## 4.コードを記述

```c++:フォームorデータモジュール.cpp
/// Connectionとデータベースを接続
	ADOConnection1->Connected = true;
/// クエリオブジェクト作成。
	TADOQuery * ADOQuery1 = new TADOQuery(this);
/// コネクションとクエリオブジェクトと関連付け
	ADOQuery1->Connection = ADOConnection1;
/// クエリを書く
	ADOQuery1->SQL->Text = L"select * from \"テーブル名\"";
/// クエリ実行（なお、値を返さないクエリの場合はExecute()を使う
	ADOQuery1->Open();
/// 最初のレコードに移動
	ADOQuery1->First();
/// 1個ずつレコードを拾う
	for (int i = 0; i < ADOQuery1->RecordCount; i++) {
/// ここでデータを取得可能
/// (CodeSite ExpressはC++Builder Delphiで使用可能なロギングシステムです。)
		CodeSite->Send(ADOQuery1->FieldByName(L"カラム名")->AsString);
/// 次のレコードに移動
		ADOQuery1->Next();
	}
/// クエリオブジェクトの接続解除
	ADOQuery1->Close();
	ADOQuery1->Active = false;
/// コネクションの接続解除
	ADOConnection1->Connected = false;
	delete ADOQuery1;
```

## 5.コンパイル
正しく動作すると、CodeSiteに取得した値が表示されます。

## 6.FileMakerと日本語(追記)

DSNの設定上「データベース」の名前（ファイルの名前）が日本語まじりになると「Unable to open file」で接続出来ません。
しかし、接続する方法はあります。
FileMakerへの接続は、データベース名ではなくリレーション名で指定するので、半角英数で作ったファイル内に接続したいファイルのリレーションを作成して、そこに接続するようにすれば接続出来ます。
例：　

```c++:TADQuery
ADQuery1->SQL->Text = "select * ¥"フィールド名¥" from ¥"テーブル名¥"";
ADQuery1->Open();
```

## 追記

手順３でDSNではなく接続文字列を使って接続する場合、下記の仕様で接続可能

```
DRIVER={FileMaker ODBC};HST=IP;PRT=2399;UID=設定したID;PWD=パスワード;SDSN=データベースファイル名;
```
JSPで受け取ったTXT中のURLを自動linkタグで囲う

### 始めに

文字列からURLを見つけてタグを自動生成する。

TextAreaやデータベースから引っ張ってきたStringとかの
URLのみをリンクタグで囲む方法はたくさん参考サイトがあったが、
URLじゃない文字列も入り混じった文字列からURLリンクを識別してくれるってのは
なかなかなかったのでメモ

<hr>

具体的にはreplaceAllメソッドを使用する。
宣言も忘れずに

```jsp
<%@ page import="java.util.regex.*" %>
```

適当にMoziという変数にその自動生成したい文字列が入っているとする

```java
String result = Mozi.replaceAll("(http://|https://){1}[\\w\\.\\-/:]+","<a href='$0'>$0</a>");
```
これでresultに自動生成されたリンクタグ入り文章ができる。
あとは煮るなり焼くなりご自由に

正規表現って大切ね

<hr>
参考サイト（http://www.atmarkit.co.jp/ait/articles/0406/01/news101.html）
mac: _mysql.so, 2 / Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.20.dylib エラーの対応

macのOSはEl Capitan. MySQLは5.7。

brew で入れた mysql を uninstall して、Oracle公式のパッケージからインストールしたときに、不具合が起きた可能性。

```
$ mkdir -p /usr/local/opt/mysql/lib/
$ ln -s /usr/local/mysql/lib/libmysqlclient.20.dylib  /usr/local/opt/mysql/lib/libmysqlclient.20.dylib
```

で解消した。 (うーん)
javaからPHPに転向して感じた、ここが変だよPHP

多分PHPを使っている人からしたら基本的な内容で、特に気にならないかもしれない。
だけど、普段javaなへっぽこアプリエンジニアから見たら気持ち悪かった変数周りの話。

## 背景
ひょんなことからPHPを勉強することになりました

普段はアプリ開発をしていて、javaとswiftと、ときどきkotlinです
で、それらの場合、以下のように変数宣言します

```java:java
String string = "string";
```

```swift:swift
var string = "string"
```

だから、PHPでの代入もてっきり、swiftみたいな型推論だと思っていたのですが、

```php:php
$int = 1;
$int = "string";
```

というものが通ってしまうという。まず、この時点でなんか気持ち悪い。

```php:php
$test = $test === false ? "success" : -1
```
と、お前はbooleanなのか、stringなのか、intなのか、なんなんだと問いたくなるような1文も書けてしまう

ただ、今回はそこではなく、in_arrayについて調べていてたどりついた[PHPのin_arrayは罠が多いので注意喚起が必要](http://qiita.com/tadsan/items/2a4c3e6b0b74a408c038)を読んで、調べて知った気持ち悪いなと思った比較の話

## 本題
以下の最後の文以外、print("true")が実行されます

```php
if ( 0 == 0 ){ print("true"); }             //当たり前
if ( 0 == 0.0 ){ print("true"); }           //普通
if ( 0 == "0" ){ print("true"); }           //まだ、わかる
if ( 0 == "0.0" ){ print("true"); }         //まだ、わかる
if ( 0 == false ){ print("true"); }         //わからないでもない
if ( 0 == null ){ print("true"); }          //んー、まぁ
if ( 0 == "string" ){ print("true"); }      //は?
if ( "string" == 0 ){ print("true"); }      //は?
if ( 1 + "string" == 1 ){ print("true"); }  //は?
if ( "1" + "string" == 1 ){ print("true"); }//は?
if ( " 01 string" == 1 ){ print("true"); }  //これは通るが
if ( " 0 1 string" == 1 ){ print("false"); }//これは通らない
```

理由としては
[PHPマニュアルのString](http://php.net/manual/ja/language.types.string.php)の中の文字列の数値への変換にあるように

> 数値として文字列が評価された時、結果の値と型は次のように定義されます。

> 文字列の中に '.' や 'e'、'E' といった文字が含まれず、 数値が integer 型の範囲内 (PHP_INT_MAX で定義されています) におさまる場合は integer として評価されます。それ以外の場合は、すべて float として評価されます。

> 文字列の最初の部分により値が決まります。文字列が、 有効な数値データから始まる場合、この値が使用されます。その他の場合、 値は 0 (ゼロ) となります。有効な数値データは符号(オプション)の後に、 1 つ以上の数字 (オプションとして小数点を 1 つ含む)、 オプションとして指数部が続きます。指数部は 'e' または 'E' の後に 1 つ以上の数字が続く形式です。

なお、最初のスペースは除くみたいです。
このように文字列が数値変換される場合に法則があり、有効データでない場合、0になるために発生する現象です。
なので、以下も通ります。

```php:php
if ( -"1" == -1 ){ print("true"); } 
$test = "string" / 100;　//これも正常に動く
```
理屈はわかるんだけれど、凄い気持ち悪い。
FileMaker11へODBC接続時、取得文字列が空欄になる時

FileMakerのODBCドライバのバージョンによってはマルチバイト文字列をうまく処理が出来ないものがあります。
FileMakerPro11の同封ODBCドライバではこれを解決出来ません。
古い方をアンインストールした後、新しいバージョンのODBCドライバをダウンロードしインストールした後、ODBCデータソースアドミニストレータで「テキストフィールドをlong varcharとして記述」チェックボックスにチェックを入れて接続しましょう。(古い方にはこの項目がありません。)

> FileMaker 11.3.76 xDBC クライアントドライバ
> http://filemaker-jp.custhelp.com/app/answers/detail/a_id/9269/~/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2-%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%EF%BC%9Afilemaker-11.3.76-xdbc-%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90

また、このODBCドライバは32bitですので、64bitのwindows上で設定するときは、
C:\Windows\SysWOW64\odbcad32.exe
で設定可能です。

![odbc.jpg](https://qiita-image-store.s3.amazonaws.com/0/76058/f86006bd-2ccb-26fd-7fe6-0f0530ceb264.jpeg)
Bashでパスワードを平文ベタ書きしたくないなあって時に、お手軽に。

パスワードが平文だと嫌だなあってなって
いろいろ調べたので。


#共通鍵でお手軽に
自分が黙ってコピペする用

```bash:
#!/bin/bash
#暗号化
openssl enc -e -aes-256-cbc -salt -base64 -in "平文.txt" -out "暗号.txt" -pass pass:betagaki

#復号化
openssl enc -d -aes-256-cbc -salt -base64 -in "暗号.txt" -out "復号.txt" -pass pass:betagaki
```

keyをベタ書きしたくない人は

```bash:
-pass file:ファイル名

-pass env:変数名
```

とか利用してみよう。
以下のサイトが分かりやすい。

それマグで！ http://takuya-1st.hatenablog.jp/entry/2015/12/09/174928 


#公開鍵で暗号化・秘密鍵で復号化
普通は

パスワードが平文だと嫌だなあ


#共通鍵でお手軽に
自分が黙ってコピペする用

```bash:
#暗号化
openssl enc -e -aes-256-cbc -salt -base64 -in "平文.txt" -out "暗号.txt" -pass pass:betagaki

#復号化
openssl enc -d -aes-256-cbc -salt -base64 -in "暗号.txt" -out "復号.txt" -pass pass:betagaki
```

keyをベタ書きするのが嫌なときは

```bash:
-pass file:ファイル名

-pass env:変数名
```

とかもお手軽。

#公開鍵で暗号化・秘密鍵で復号化・・・できませんでしたorz
普通はSSHの公開鍵と復号鍵を持ってると思うので
ソレ使ってやろうとしたのですが上手くいきませんでした。

```bash:
#暗号化うまくいかず
openssl rsautl -encrypt -inkey ~/.ssh/id_rsa.pub -in "平文.txt"  -out "暗号.txt"

#復号化うまくいかず
openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in "暗号.txt" -out "復号.txt"
```

今日はここで時間切れ。
解決策が分かったら更新します。
CakePHP3：デフォルトのソート順を指定しつつ、ユーザの指定を尊重する


```ArticlesController.php

  if( null !== $this->request->query("sort") ){
    // ユーザがsort順を指定している
    $query = $this->Articles;
  }else{
    // デフォルトで、idの降順でソート
　  $query = $this->Articles->find()->order(['id' => 'DESC']);
  }
  
  $articles = $this->paginate($query);
Playgroundsでビューの表示

# はじめに
- Playgroundsは、Xcode上でコードを即時評価できるツールです
- アプリ内で実装する前に、アルゴリズムを確認するなどが可能です
- ここではもう一歩踏み込んで、PlaygroundSupportモジュールを導入してビューをリアルタイムに表示する方法を確認します
    - Xcode 7まではXCPlaygroundモジュールでしたが、そっちはdeprecatedになってます

# 検証環境
- Xcode 8.0
- Swift 3.0

# コード例

```swift:LiveViewSample.playground
import UIKit
import PlaygroundSupport    // このモジュールが必要

let frame = CGRect(x: 0, y: 0, width: 320, height: 320)
let image = UIImage(named: "macbook.jpeg")
let imageView = UIImageView(frame: frame)
imageView.contentMode = .scaleAspectFit
imageView.image = image

// 表のスレッドの処理が終わっても、別スレッドの処理を継続可能とする
PlaygroundPage.current.needsIndefiniteExecution = true

// アシスタントエディタ上に、対象のビューを表示
PlaygroundPage.current.liveView = imageView
```

- このサンプルは、GitHubに上げてあります
    - [LiveViewSample](https://github.com/aokiplayer/LiveViewSample)

# 実行例
![liveview.png](https://qiita-image-store.s3.amazonaws.com/0/100115/62b5566c-edcb-613d-0b89-b3aa93923983.png)


# その他
- 今回は試していませんが、ジェスチャーなどにも対応しているようなので、ちょっとしたインタラクティブ性は出せそうです

# 参考
- [PlaygroundSupport | Apple Developer Documentation](https://developer.apple.com/reference/playgroundsupport)
1Password Families契約してみた

時代遅れだけど、今までパスワードの管理はMacやiPhoneについているメモだったのですが、パスワードの数も半端なくなって来たのと仕事上重要なIDやpassword管理をしないといけなくなってきたので、そろそろ考えようと動きました。

##何を使うか？選定基準

1.出来るだけクラウド保存だけでないもの
2.家族で使えるもの
3.課金が安いもの
4.更新の都度、課金がないもの
5.複数デバイスに対応しているもの

上記の選定基準を元に1Password Familiesにしました。
1の「クラウドで保存しない」と言うところがとっても不安だったので恐々、インストールして保存先が選択できることがわかって一安心

##1Password Families内容

- 家族で使える1Passwordで1契約で最大5人まで利用可能。
- 月々$4.99ドル（現在800円弱）
- デバイス数には制限なし（私のようにiMac、MBP２台、iphone、iPadと全部で５台のデバイスを持っていても全台で使用可能！）
- 子供達のiPhoneでももちろん使用可能。来年長女が大学生になってパソコン持ち始めても大丈夫！
- アカウント作成すると1ヶ月のおためし期間あり

と言う$4.99ドルだとかなりお得なプランになる。
ついでに言うなら最初っから課金登録しなくて良いのがいい！！気に入ったらしてね方式です。

##他についている機能

- 1GBのドキュメントストレージ
- 最大1年前まで戻れるリカバリー機能
- 家族が使用しているサービスやサイトにセキュリティ違反がある場合は、24時間いつでもアラートを受信
- 24時間サポート（でも英語なのでサポートは使わないかもw）
- 1Passwordアプリの最新版が追加料金なし使える

とまぁ色々ついているわけですが、こんなお得なやつでも欠点もありました。

##使いにくかったところ

- サイトが英語表記のみ（子供が登録時に必死でしたwでも英語の勉強にはなるね）
- AppleStoreだと割高になるので頑張って英語読みながら公式サイトで契約
- アプリをダウンロードしたものの新規作成が前面に押し出されててログインする箇所がわかりにくい
- アプリはかろうじて日本語対応だが設定部分が所々英語なのでルー大柴状態の設定画面
- outlookメールのアイコン表記がLiveMailになってて子供が戸惑ってた

子供達が使い始めはちゃんと親がそばにいて導入したほうがいいですね！
ついでに使い方もある程度教えるもしくは一緒に調べましょう。


そして、今や子供達も平気でiPhoneやMacを使いまくっている生活なのでセキュリティを教えるのにいいきっかけになりました。
まだ、使い始めて初日ですが、実は導入するのに1ヶ月くらいかけて色々調べました。なのでその調べた成果と実際契約した結果をメモしたかったので書いてみました。
とりあえず、調べた結果と導入した結果は良好！！しばらくこいつを使ってみようと思います。

##参考にしたサイト
[1Password](https://1password.com/families/)
Swift 電話番号入力時自動スペース

UITextFieldを使って電話番号を入力する際に、自動的に半角スペースを追加させる。

# イメージ
![movie2.gif](https://qiita-image-store.s3.amazonaws.com/0/114320/b2d74e66-c27a-7dd2-43ed-bc4f2b90fa55.gif)

# repository
https://github.com/qingcai518/Swift_Demo_AutoSpace

# 実現方法
##actionの定義
ViewControllerにて、EditingChanged用のアクション関数を定義する.

```swift
@IBAction func edit() {
}
```

##actionとUITextFieldの関連
storyboardで、UITextFieldのEditingChangedアクションとaction関数を関連させる.
<img width="457" alt="スクリーンショット 2017-01-19 18.09.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/114320/4d102544-ab9c-ebd2-27ee-7a5a46f1a1c3.png">

##action中身の実装
UITextFieldの入力値に対して、スペースを挿入・削除処理を実施する.

```swift
@IBOutlet weak var telTf : UITextField!
var currentLength = 0
    
@IBAction func edit() {
    guard let text = telTf.text else {return}
    let length = text.characters.count
        
    if (length > currentLength) {
        // when add text.
        if (length == 4 || length == 9) {
            let content = NSMutableString(string: text)
            content.insert(" ", at: length - 1)
            telTf.text = content as String
        }
    } else {
        // when delete text.
        if (length == 4 || length == 9) {
            telTf.text = (text as NSString).substring(to: length - 1)
        }
    }
        
    currentLength = length
}
```
pythonでツイッターのタイムラインの取得

#1. はじめに

普段からtwitterを使うためプログラムを用いて投稿やタイムラインの取得を行いたいので、
それを行うための備忘録としてここに残します。

ここでは以下の内容を記載します。
イ. タイムラインの取得
ロ. ツイートに含まれる情報を見るには

また環境等は[pythonでツイートの投稿](http://qiita.com/sugurunatsuno/items/55a46a63112ad378dca2)と同様であり、API keyを取得していることが前提となります。

#2. タイムラインの取得

タイムラインの取得をするには次のようなURLが必要であり、
パラメータを変更することで取得できるタイムラインが変わります。

```py3:twitter_access.py
url = "https://api.twitter.com/1.1/statuses/home_timeline.json"
params = {"count":200, #ツイートを最新から何件取得するか(最大200件)
          "include_entities" : 1, #エンティティ(画像のURL等)をツイートに含めるか
          "exclude_replies" : 1, #リプライを含めるか
          }

req = sess.get(url, params=params)
timeline = json.loads(req.text)
```

こうすることによりtimelineという名前のリストに辞書型でツイートが代入されます。

一つ一つツイートを見ていきたい場合にはfor文等で回しましょう。

```py3:twitter_access.py
for tweet in timeline:
    print(tweet["text"])
```


#3. ツイートに含まれる情報を見るには

辞書型のツイートには次のようなキーがあります。

'is_quote_status', 'in_reply_to_user_id_str', 'place', 'geo', 'retweet_count', 'id_str', 'id', 'contributors', 'user', 'retweeted', 'text', 'in_reply_to_user_id', 'lang', 'in_reply_to_screen_name', 'truncated', 'source', 'favorite_count', 'created_at', 'entities', 'favorited', 'in_reply_to_status_id_str', 'coordinates', 'in_reply_to_status_id'

このキーで様々な要素を取得できます。
例として'text'を使えばツイートの本文を文字列として取得できます。
userにはツイートしたユーザーの情報が辞書型で格納されています

userのキーは以下の通りです。

'url', 'profile_background_tile', 'screen_name', 'profile_image_url', 'following', 'has_extended_profile', 'statuses_count', 'profile_background_color', 'profile_sidebar_fill_color', 'contributors_enabled', 'notifications', 'listed_count', 'translator_type', 'id', 'profile_background_image_url', 'profile_image_url_https', 'profile_link_color', 'profile_background_image_url_https', 'favourites_count', 'profile_banner_url', 'friends_count', 'location', 'default_profile_image', 'lang', 'verified', 'follow_request_sent', 'profile_use_background_image', 'profile_text_color', 'geo_enabled', 'protected', 'followers_count', 'description', 'is_translator', 'id_str', 'created_at', 'name', 'entities', 'time_zone', 'profile_sidebar_border_color', 'is_translation_enabled', 'utc_offset', 'default_profile'

また、たまにツイートのキーにextended_entitiesというキーがある場合があります。
このキーの中にはまた辞書型が格納されており、mediaというキーの中にさらにmedia_urlというキーがあります。
この中にツイートに付随している画像のURLがあります。

次はたぶんないです。
if constexprと戻り値autoで型リストのfind実装

# if constexprと戻り値autoで型リストのfind実装
C++17ならわざわざテンプレートで再帰しなくても、`if constexpr`と戻り値`auto`で`見た目がわかりやすく楽に実装できるんじゃないかと思ったので書く。
別にfindじゃなくても良いけどなんとなく。

結果だけならリンク先で見れます。
http://melpon.org/wandbox/permlink/d26Nr2XNmPRIk5R3

## 実装
### find実装に必要な型
`type_list`と`type_holder`。

```cpp:type_list
template <typename... Args>
struct type_list;

template <typename Head, typename... Tail>
struct type_list<Head, Tail...>
{
    using head = Head;
    using tail = type_list<Tail...>;
};
```

```cpp:type_holder
template <typename T>
struct type_holder
{
    using type = T;
};
```

### findの実装
```cpp:find
template <typename List, template <typename> typename F>
auto find()
{
    using head = typename List::head;
    
    if constexpr(F<head>::value)
    {
        return type_holder<head>{};
    }
    else
    {
        return find<typename List::tail, F>();
    }
}
```

## 使う
```cpp:main
int main()
{
    using list = type_list<char, unsigned short, const long, double>;
    
    using const_type = typename decltype(find<list, std::is_const>())::type;                // const long
    using unsigned_type = typename decltype(find<list, std::is_unsigned>())::type;          // unsigned short
    using floating_type = typename decltype(find<list, std::is_floating_point>())::type;    // double
    //using error_type = typename decltype(find<list, std::is_reference>())::type;          // error
}
```

エラー時のことは特に考えてない。

## 終わりに
このような実装だと`type_holder`がないと見つけたい型にデフォルトコンストラクタが必要になる(はず)。

テンプレートで再起するよりだいぶ楽になった気がする

```cpp
template <typename List, template <typename> typename F>
using find_t = typename decltype(find<List, F>())::type;
```

こんな感じのものを用意しておけば使う方もスッキリする。
NSManagedObjectのサブクラス作成時のエラー回避

# はじめに
- Core Dataでは、NSManagedObjectがエンティティです
- これをそのまま使うと、KVCによりプロパティ名を文字列で指定するため少し面倒です
- なので、NSManagedObjectのサブクラスを作って利用することが多いと思います
- が、Xcode 8で作成しようとするとなぜかエラーになったので、その理由と解決方法をまとめます

# 検証環境
- macOS Sierra 10.12.2
- Xcode 8.2.1

# 現象
- これまでどおり、モデルファイルに設定した内容を元にNSManagedObjectのサブクラスを生成します

    ![Model.png](https://qiita-image-store.s3.amazonaws.com/0/100115/e3953799-fa67-73ab-eb19-eded129818ad.png)


    ![CreateSubclass.png](https://qiita-image-store.s3.amazonaws.com/0/100115/3d712822-b0a9-ce02-43ab-590f5fabb238.png)

- クラスは作成されますが、エラーが発生していることがわかります
    - クラス定義が重複してると言われてますね

        ![Product.png](https://qiita-image-store.s3.amazonaws.com/0/100115/a85b8211-b2a4-e41b-29cd-94f0a12294f6.png)


# 原因
- Xcode 8では、NSManagedObjectのサブクラス定義を自動的に行うオプションが追加されました
    - 手動で作成する手間が省けるという点では、歓迎すべき点です
    - ただし、作成したクラスにコードを追加する場合には、これまで通り手作業で行う必要があります
- 今回は、自動生成が有効になっていたため、手動で生成したものとクラス名が重複していたのが原因です

# 解決方法
- モデルエディタに、自動生成するかどうかのオプション（Codegen）が追加されました

    ![Property.png](https://qiita-image-store.s3.amazonaws.com/0/100115/1c40ba44-65c9-3e51-9f59-77b0f7caab08.png)

- デフォルトではClass Definitionになっているため、自動生成が有効になっています
- これをManual/Noneに変えると自動生成は無効になり、これまでどおり自分で生成させることが可能となります

    ![Codegen.png](https://qiita-image-store.s3.amazonaws.com/0/100115/7b624751-3936-2290-7be7-a97e6f52cc85.png)


# まとめ
- このオプションが追加された件については、[公式ドキュメント](https://developer.apple.com/library/content/releasenotes/General/WhatNewCoreData2016/ReleaseNotes.html#//apple_ref/doc/uid/TP40017342-CH1-DontLinkElementID_7)にも記載があります
- が、「デフォルトはこれまでどおりだよ」とあったので油断してました
- エラーが出た際には、Codegenの設定を確認してみてください
Linux文字列操作学習：awk

Linuxで文字列を操作しデータを整形する方法について、各手法の特性や基本的な文法などを確認する。
今回はawkについて。

#■awkについて
awkはインタプリタとして、後ろに続くシングルクォートで囲まれたAWKスクリプト、
あるいはテキストファイルとして既に記述されているAWKスクリプトを解釈し実行する。

```bash:ex1
awk '{ print $1 }' /var/tmp/address.txt
```

これで、/var/tmp/address.txtを入力ファイルとし、シングルクォートで囲まれたスクリプト
「各読み込み行の1フィールド目を出力する」
を実行する。
構文については後述する。

シングルクォートで囲まれたスクリプト部を外部ファイル化して実行することもできる。
その場合は、ex2のようにawkコマンドに続いて-fオプション、スクリプトファイル名、（入力ファイル）の順で指定する。

```bash:ex2
awk -f test.awk /var/tmp/goods.txt
``` 

　

AWKの言語としての特性では、入力された文字列に対し行単位でパターン一致判定を行い
該当行に対し処理を実行することに長けている。

例として、
「入力されたCSVファイルのレコードの内、7フィールド目の値が"A"であるもののみ出力する」
などの処理についてはAWKを用いると容易に実行できる。

#■基本的構文
コマンドとしてのawkコマンドの基本的構文はex1でも例示したように、以下のような形である。

```awk '（スクリプト内容）' （入力ファイル）```

これで、（入力ファイル）に対し（スクリプト内容）を実行することができる。

AWKスクリプトの基本的な構成については以下の通りである。

```（パターン１）{（アクション１）} （パターン２）{（アクション２）}…```

各行に対し、左から順にパターン一致判定を行い、
一致した（条件に合致した）行に対して波括弧内の各アクションを実行する。

また、スクリプト文中では\$n（nは数値）を使用することで、行中の各フィールドを指定できる。
\$0は行全体を表し、以降\$1,\$2...とフィールド番号を指定できる。
（なお、デフォルトでは読み込んだ文字列に対しスペースまたはタブをセパレーターとしてフィールドが分けられる。）

#■パターン文について

パターン文については、正規表現あるいは比較演算子などを用いた真偽判定文などが利用できる。

真偽判定文の中では、"==" , ">=" , "!=" などの一般的な演算子のほかに、
"~"を演算子として用いることで正規表現でのマッチング判定を行うことができる。

また、"&&" , "||" を用いることで、AND,OR条件での判定を行うこともできる。

なお、波括弧の前に何も書かない場合、入力された全行に対して波括弧内のアクションを行う。
　

```bash:ex3
awk '/^2/{print $2}' /var/tmp/age.txt
```

波括弧の前に正規表現を記述した場合。
ex3の場合、age.txtのうち、行頭が2の行の2フィールド目を出力する。
　

```bash:ex4
awk '$2 == "山田"{print $0}' /var/tmp/employee.txt
```

波括弧の前に真偽判定文を記述した場合。
ex4の場合、employee.txtのうち、2フィールド目が"山田"である行の全行を出力する。
　

```bash:ex5
awk '$1 ~ /[0-9]+/{print $1}' /var/tmp/job.txt
```
波括弧の前に、真偽判定文に正規表現を組み込んだ判定分を記述した場合。
ex5の場合、job.txtのうち,1フィールド目に数値を含む行の1フィールド目を出力する。

　
その他に、"BEGIN"句、"END"句を波括弧の前に記述することで、スクリプト処理の最初と最後に必ず行う処理を組み込むことができる。
処理前の初期化や、最後の合計表示などに使用する。
　

```bash:ex6
awk 'BEGIN{num = 0} {num = num + $1} END{print num}' /var/tmp/price.txt
```

ex6の場合、price.txtの全行の1フィールド目を足し合わせた数を出力する。

#■アクション文について
Cをベースにしたいくつかのコマンド・制御構文が利用できる。
print（出力）、if（条件分岐）、for（ループ）などが利用できる。

また、セミコロンを用いて処理を区分し、一行に複数処理を記載することができる。

文字列の結合については、スペース区切りで並べるだけでよい。

```bash:ex7
awk 'BEGIN{num1=0;num2=0} {if($1>60) num1=num1+$1; else num2=num2+$1} END{print num1,num2}' /var/tmp/score.txt
```

ex7の場合、score.txtの全行に対し、1フィールド目の値が60より大きければnum1に加算、60以下であればnum2に加算し、最後にnum1,num2を出力する。
　

```bash:ex8
awk '{for(i=0;i<10;i++){print i}}' /var/tmp/text.txt
```

ex8の場合、text.txtの行数回、0から9までの数値を出力する。

#■その他

引数として"-F"を指定し、続けてセパレータ文字を指定することで、入力ファイルを指定したセパレータで分割し読み込む。

```bash:ex9
awk -F"," '{print $1}' /var/tmp/name.csv
```

ex9の場合、入力された"name.csv"をカンマ区切りで読み込み、各行の1フィールド目を出力する。

また、AWKスクリプト文中ではいくつかの組み込み変数が利用できる。
例として、"NF"は現在読み込み行のフィールド数、"NR"は現在読み込み行までに入力された行数を示す。

```bash:ex10
awk '{print NR ":" NF}' /var/tmp/food.txt
```

ex10の場合、入力されたfood.txtの各行について、「（行番号）:（その行のフィールド数）」を出力する。

　

今回は基本的な部分のみということで以上。
他にも多くのコマンド、組み込み変数が利用できる。

（参考サイト）
http://shellscript.sunone.me/awk.html
http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_1.html
ZabbixとMetrin


こちらの記事を見て、Zabbixとの連携を試してみました。
* [AWS CloudWatchの汎用監視プラグインMetrinの紹介 (Mackerelも対応) - Qiita](http://qiita.com/SatoHiroyuki/items/085d047e0ab92c3df524)
* [y13i/metrin](https://github.com/y13i/metrin)

# 環境

ESXiで動作している仮想マシン。Metrinは/usr/local/binにインストール済みです。

* CentOS 7.2
* Zabbix 3.2.0
* Metrin 0.0.6

# Metrinの動作確認

IAMロールは使用できないので、環境変数もしくは引数で必要なアクセスキー等を設定する必要があります。

試しに、使用料金を取得してみます。

```shell-session
$ AWS_PROFILE=default AWS_REGION=us-east-1 \
metrin --namespace AWS/Billing --metric-name EstimatedCharges \
--statistic Maximum --start-time -21600 --period 21600 --dimension Currency:USD \
print
CloudWatch.Currency.USD.EstimatedCharges.Maximum        1.480000        111111120
```

$1.48が取得できました。

# Zabbixへの設定

/var/lib/zabbixがzabbix agentのホームディレクトリなので、こちらにAWSの認証情報を設定しておきます。

```shell-session
$ tree -a /var/lib/zabbix/
/var/lib/zabbix/
└── .aws
    ├── config
    └── credentials

1 directory, 2 files
```

ユーザーパラメータでMetrinを実行できるよう、zabbix agentの設定を変更します。

```config
# vi /etc/zabbix/zabbix_agentd.conf
UserParameter=metrin[*],HOME=/var/lib/zabbix metrin --region $1 --namespace $2 --metric-name $3 --statistic $4 --start-time $5 --period $6 --dimension $7 print --template '{{.Datapoint.$4}}' --last-value-only
```

agentを再起動後、無事zabbix経由で実行できました。

```shell-session
 $ zabbix_get -s 127.0.0.1 -k 'metrin[us-east-1,AWS/Billing,EstimatedCharges,Maximum,-21600,21600,Currency:USD]'
1.48
```

後はアイテムを作って増やすだけですね。
ScalaTestでコンパイルエラーが発生した時


少し躓いたので備忘録

今のとこ下記を記述すればコンパイルできるようになりました

```build.sbt
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test"
```

%%にして、ライブラリのScalaバージョンを消しているらしい(参考URLより)

3.0.1等のバージョンは下記を確認
ScalaTest
http://www.scalatest.org/user_guide


追記
Specs2の場合は下記を追加

```build.sbt
libraryDependencies ++= Seq("org.specs2" %% "specs2-core" % "3.8.7" % "test")

scalacOptions in Test ++= Seq("-Yrangepos")
```

バージョンは下記を確認
https://etorreborre.github.io/specs2/website/SPECS2-3.8.7/quickstart.html


参考URL：

ScalaTestを動かそうとすると can't expand macros compiled by previous versions of Scala
http://dropout-shadow.hateblo.jp/entry/2016/01/04/153211
Ruby on Rails ~ GoogleAnalyticsでRailsアプリのアクセス解析（コードメモ）

herokuにデプロイしたアプリのアクセス解析をするために、GoogleAnalyticsを利用したいと思います。

先にデプロイが完了していることが前提です。


#1.トラッキングID発行。

下記URLにアクセス。
http://www.google.com/intl/ja_jp/analytics/ 
Googleアカウントでログイン後に登録フォームに必要情報を入力します。
登録が完了後にトラッキングIDが表示されます。

#2.gemのインストール。

```
Gemfile

gem 'google-analytics-rails'
```

Gemfile.lockを削除後、

```
$ bundle install
```

#3.トラッキングIDの記述。

```config/environments/production.rb
GA.tracker = "UA-xxxxxx-x"
```

application.html.erbのhead内に下記を記述。

```app/views/layout/application.html.erb

<head>
<%= analytics_init if Rails.env.production? %>
</head>

```

その後、ブラウザ上でGoogleAnalyticsにアクセスすると、解析情報を見ることが可能になります。
pythonでツイートの投稿

#1. はじめに

普段からtwitterを使うため、プログラムを用いて投稿やタイムラインの取得を行いたいのでそれを行うための
備忘録としてここに残します。

ここでは以下の内容を記載します。
イ. twitterにアクセスするためのAPI keyの取得
ロ. 実際にtwitterへの投稿

#2. twitterにアクセスするためのAPI keyの取得

twitterはAPIを公開しているので、それを用いてアクセスします。
以下のサイトを参考にAPI keyを取得します。
[Twitter API キーの取得手順 : まだプログラマーですが何か？](http://dotnsf.blog.jp/archives/1044796238.html)

ここでほしいのはConsumer Key, Consumer Secret, Access Token, Access Token Secretの4つです。

#3. 実際にtwitterへの投稿
ここからは実際にpythonを用いてプログラムからツイートを投稿します。
以下の環境で行います。
- windows 10
    - python 3.5.2 (Anaconda 4.2.0 64bit)

また以下のライブラリが必要です
- requests_oauthlib
- json
- urllib

まずはライブラリのインポートを行います。

```py3:twitter_access.py
from requests_oauthlib import OAuth1Session
import json
from urllib import request
```


続いて先ほど取得したAPI keyを用いるために変数に代入、API keyを用いてOauthセッションを作成します。

```py3:twitter_access.py
keys = {
            "CK":'Consumer Key',
            "CS":'Consumer Secret',
            "AT":'Access Token',
            "AS":'Access Token Secret',
        }

sess = OAuth1Session(keys["CK"], keys["CS"], keys["AT"], keys["AS"])
```



このセッションを用いて決まったURLにアクセスしgetメソッド、
postメソッドを用いることでツイートやタイムラインの取得ができます。
この決まったURLを変えることにより様々なAPIをたたけます。
詳しい説明は[Twitter Developer Documentation](https://dev.twitter.com/rest/reference)にあります。
実際にツイートする処理は以下のようになります。


```py3:twitter_access.py
url = "https://api.twitter.com/1.1/statuses/update.json"        
params = {"status":"Hello World!"}
#Hello World!の部分が実際にツイートされる

req = sess.post(url, params = params)

if req.status_code == 200:
    print ("OK")
else:
    print ("Error")
```

これでHello World!とツイートされます。
次はタイムラインの取得を書きます。
Ruby on Rails ~ rubycriticの簡単導入でRubyコードの品質を解析（コードメモ）

RubyCriticで静的解析を可能にするための実装方法です。

とは言っても、gemをインストールするだけです。

```
Gemfile


group :development do
  gem "rubycritic", :require => false
end
```

Gemfile.lockを削除後、
```
$ bundle install
```

起動するには、Railsコマンドを使います。

```
$ rubycritic
```

少し待つとブラウザが開き、解析結果が表示されます。

以上です。
PKソートするSELECT文を生成するSQL 

#SQL文

```sql:postgreSQL
select
  'select * from ' || tc.table_name || ' order by ' || string_agg(ccu.column_name, ',') || ';' sql 
from
  information_schema.table_constraints tc
  , information_schema.constraint_column_usage ccu 
where
  tc.table_catalog = (データベース名) 
  and tc.table_schema = （スキーマ名） 
  and tc.constraint_type = 'PRIMARY KEY' 
  and tc.table_catalog = ccu.table_catalog 
  and tc.table_schema = ccu.table_schema 
  and tc.table_name = ccu.table_name 
  and tc.constraint_name = ccu.constraint_name 
group by
  tc.table_name
```

#結果
テーブルごとにPKでソートするSQLを生成します。
`select * from table1 order by column1, column2;`
`select * from table2 order by column1, column2;`
`:`
`:`
sessionStorageをつかってみる

## そもそも
`WebStorage` という仕組みが HTML5 から導入されています。
`WebStorage` は JavaScript を用いてブラウザにデータを保存できる、Cookie よりもカジュアルに利用可能な仕組みであります。
利用方法は2種類あって、一つが `localStorage`, もう一つが今回の `sessionStorage` です。
基本的な使い方は変わりませんが、ライフサイクルが異なります。

双方のライフサイクルは以下の通り。

| WebStorage | localStorage | sessionStorage |
|:-----------:|:------------:|:------------:|
| ライフサイクル|ブラウザを閉じても持続 |ブラウザを開いてる間のみ|



## 対応ブラウザ

MDN的には対応ブラウザは以下の通り。

|機能|Chrome|Firefox (Gecko)|Edge|Internet Explorer|Opera|Safari (WebKit)|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|[localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage#browser_compatibility)|4|3.5|12|8|10.50|4|
|[sessionStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage#browser_compatibility)|5|2|12|8|10.50|4|


もしくはブラウザのコンソールに下記のコードを貼り付けて確認可能です。
-> @ryo511 さんからのご指摘を反映しました(2019/01/17更新)

```javascript
function storageAvailable(type) {
    try {
        var storage = window[type],
            x = '__storage_test__';
        storage.setItem(x, x);
        storage.removeItem(x);
        return true;
    }
    catch(e) {
        return e instanceof DOMException && (
            // everything except Firefox
            e.code === 22 ||
            // Firefox
            e.code === 1014 ||
            // test name field too, because code might not be present
            // everything except Firefox
            e.name === 'QuotaExceededError' ||
            // Firefox
            e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&
            // acknowledge QuotaExceededError only if there's something already stored
            storage.length !== 0;
    }
}

console.log(storageAvailable('localStorage'));
```
[参考: localStorage の機能検出](https://developer.mozilla.org/ja/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API#Feature-detecting_localStorage)

## 使い方
`sessionStorage`は `key` と `value` を対に持っています。
よって保存する際は `key` と `value` を、取得・削除する際は `key` を指定して操作します。
ちなみに`key` は文字列と整数を利用できますが、値は文字列のみのようです。 


### 保存
下記3行は全て同じ意味です。

```javascript
sessionStorage.key = 'value';
sessionStorage['key'] = 'value';
sessionStorage.setItem('key', 'value');
```
### 取得
```javascript
sessionStorage.getItem('key')
```
### 削除
```javascript
sessionStorage.removeItem('key')
```
### 初期化
```javascript
sessionStorage.clear()
```


## まとめ
以上のようにシンプルにブラウザにデータを持たせて利用することができます。
例えばページ遷移する際に、通信はしたくないけど前のページの情報を持っていたい場合などに使えそうですね！
Chrome Developer Tools のコンソールで使える機能（補足版）

[\[翻訳\]Chrome デベロッパーコンソール　意外と知られていない10の機能 \- Qiita](http://qiita.com/aosho235/items/f579ffd4d0901017d76b) の内容が便利だなと思いながら、最後にリンクされていた [Command Line API Reference  \|  Web  \|  Google Developers](https://developers.google.com/web/tools/chrome-devtools/console/command-line-reference) を読むと、他にも知らなかった機能があったので言及されていなかった機能について簡単に補足する。

注意として、Developer Tools の console 内でのみ有効で、スクリプトにこれらを記述しても機能の実行はできない。

## 最近選択された要素または JavaScript ヒープオブジェクトの履歴参照を取得

`$0` から `$4` には、[Elements]パネル内で最後に検査された5つの要素、または[Profiles]パネルで選択された最後の5つのJavaScriptヒープオブジェクトの履歴参照が入っている。

`$0` は直前に選択された要素となる。

![ref.gif](https://qiita-image-store.s3.amazonaws.com/0/36122/2d2fbec6-f2ac-ca70-a757-85755bb5d283.gif)

該当するものがなければ `undefined` が返される。また、`$5` は無いので `ReferenceError` になる。

## XPath による要素を取得

`$x(path)` で `path` に [XPath](https://ja.wikipedia.org/wiki/XML_Path_Language) を指定すると、該当する要素の配列が取得できる。

![xpath.png](https://qiita-image-store.s3.amazonaws.com/0/36122/392f1067-1e5d-926f-1c5b-6f3d9a7126af.png)

## クリップボードにコピー

`copy(object)` で `object` の文字列をクリップボードにコピーする。

```js
copy('abc')    // 'abc' がコピーされる
copy([1,2,3])  // [1,2,3] がコピーされる
copy($0)       // 選択している要素がコピーされる
```

## オブジェクトのキーと値の一覧を取得

`keys(object)` で `object` のキー一覧、`values(object)` で `object` の値一覧が取得できる。

![keys_values.png](https://qiita-image-store.s3.amazonaws.com/0/36122/e4670e33-e4f4-bbe2-b762-82024fca974f.png)

## 関数内でブレーク

`debug(function)` で `function` が呼ばれた直後にブレークするようになる。ブレークポイントが置かれるような動作。

ブレークポイントの全無効化ボタンの対象になっている。ただし、行番号エリアと Breakpoints（ブレークポイント一覧）にブレークポイントとして表示されない。

解除は `undebug(function)`。

![debug.gif](https://qiita-image-store.s3.amazonaws.com/0/36122/24152a85-dfc2-a9fc-9e35-7439db842908.gif)


通常ブレークポイントは[Sources]タブでマウスからコードの行番号をクリックして置くケースが多そうだが、圧縮されたりトランスパイルされたコードだと、該当行まですぐに辿りつく事が手間なので便利かもしれない。

ただ、ページをロードした直後に確認したい関数に対しては無理？

ブレークポイントについては [How to set breakpoints  \|  Web  \|  Google Developers](https://developers.google.com/web/tools/chrome-devtools/javascript/add-breakpoints) を参照。

## 関数を監視

`monitor(function)` で `function` を監視し、呼び出された事を引数付きでログに出力する。

例えば

![image](https://qiita-image-store.s3.amazonaws.com/0/36122/0331ce8b-f4b8-49be-f51c-81cdb13adba8.png)

「関数内でブレーク」と同様に、圧縮されたりトランスパイルされたコードに対して便利そう。特にブレークポイントを置くほどではなく、簡単に確認したい場合など。

監視解除は `unmonitor(function)`。

## JavaScript の CPU プロファイル

Profiles タブの JavaScript CPU プロファイル開始・終了はマウス操作だけでなく、それぞれ `profile([name])` と `profileEnd([name])` で実行できる。

`name` はプロファイル名で、指定しなかった場合 `Profile [番号]` になる。

CPU プロファイルによる高速化については [Speed Up JavaScript Execution  \|  Web  \|  Google Developers](https://developers.google.com/web/tools/chrome-devtools/rendering-tools/js-execution) を参照。
[Rails] Carrierwaveでformを使わずに画像を保存する方法いろいろ

Carrierwave, モデルとの関連付けも簡単で便利ですが、
formを使わないケースについてあまり紹介されていないのでメモ

## has_one のパターン

```user.rb
has_one :thumbnails
mount_uploader :image, ThumbnailUploader
```

```thumbnail.rb
belongs_to :user
```

### formを使わずに画像保存

```user_controller.rb
@user = User.new(name: "John")
@user.image = File.open("/path/to/file")
@user.save
```

### バイナリデータではなく、URLからダウンロードして保存

```
@user = User.create(name: "John")
@user.remote_image_url = "http://placehold.it/200x200"
@user.save
```

## has_many のパターン

formなら、accepts_nested_attributes_forを使えばいいが、使わないと少し面倒

```user.rb
has_many :thumbnails
```

```thumbnail.rb
belongs_to :user
mount_uploader :image, ThumbnailUploader
```

### formを使わずに画像保存

```user_controller.rb
@user.create(name: "John")
@user.save

thumb = Thumbnail.new(user_id: @user.id)
thumb.image = File.open("/path/to/file")

@user.thumbnails << thumb
@user.save
```

### バイナリデータではなく、URLからダウンロードして保存


```user_controller.rb
@user.create(name: "John")
@user.save

thumb = Thumbnail.new(user_id: @user.id)
thumb.remote_image_url = "http://placehold.it/200x200"

@user.thumbnails << thumb
@user.save
```

複数画像の場合、それぞれ2回saveしなければならないのは気持ち悪い・・
もっとスマートなやり方ご存知の方いましたらご教授くださいませm(__)m
nock の使い方メモ

## 概要

node のユニットテストでサーバーをモックするために、リクエストをフックして任意のレスポンスを返す時に、[nock](https://github.com/node-nock/nock) が便利です。

いつも使い方を忘れるのでよくある使い方をメモします。

## 使い方

`POST https://example.com/api/foo/bar` へリクエストを出す Promise を返す関数 `doFooBar` をテストします。

`/api/foo/bar` のリクエストに対して一度だけ 200 を返し、scope.isDone が true になります。

```js
const { doFooBar } = require("../fooClient")
const nock = require("nock")

describe("fooClient", () => {
  describe("doFooBar", function() {
    // API サーバーをモックする
    const scope = nock("https://example.com")
      .post("/api/foo/bar")
      .reply(200, "OK")

    it("should request api", () =>
      doFooBar("hoge fuga")
        .then(() => {
          // /api/foo/bar にリクエストを出した
          assert(scope.isDone)
        })
    )
```

## 注意点

nock は一つのモックを一回だけ実行するので、仮に `doFooBar` が２回リクエストを出すと、2度目は必ず失敗になります。

テストコードを通して何度も叩く場合などにモックしたままにするには、`persist()` を設定する必要があります。この場合、一度目のリクエストで isDone が true になります。

```js
const { doFooBar } = require("../fooClient")
const nock = require("nock")

describe("fooClient", () => {
  describe("doFooBar", function() {
    // API サーバーをモックする
    const scope = nock("https://example.com")
      .post("/api/foo/bar")
      .persist()
      .reply(200, "OK")

    it("should request api", () =>
      doFooBar("hoge fuga")
        .then(() => {
          // /api/foo/bar にリクエストを1回以上出した
          assert(scope.isDone)
        })
    )
```
iOSのWebViewでjsが動かないよどうしよう

#WebViewで表示したページ内のjsが動かなくなってしもた。

答えは簡単ですた。
そもそもソースが読み込めてなかった。
http通信が許可されてなかった。

## html側を変える
WebView内のscript呼び出し部分を
`src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"`
から
`src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"`
に変えたら無事動きました。

## アプリ側を変える
NSAppTransportSecurityの設定でhttpを許可してあげましょう。
NSAppTransportSecurityをつくり、
keyをNSAllowsArbitraryLoads、valueをtrueにしてあげればhttpが通るようになります。

もしくは
NSExceptionDomainsで一つ一つ設定してあげるのもよいでしょう。
こっちのがいいですかね。


以上です。
お粗末様でした。
プロジェクト（ディレクトリ）内のコードを一気に置換する

# TL; DR

```bash
git grep -l 置換したい文字列 | xargs sed -i '' -e 's/置換前/置換後/g'
```

## ファイル例

```js:first.js
Hoge
Fuga

BarBaz
```

```js:second.js
Hoge
Bar

FooBarBaz
```

first.jsとsecond.jsの1行目にあるHogeをFugaに置換してみましょう。

## 検索にヒットさせる

git管理している場合: gitのサブコマンド grep を使います。
結果が出たら、キーボードのqを押して抜けます。

```bash:command
git grep Hoge
```

```bash:result
first.js:Hoge
second.js:Hoge
(END)
```

git管理はしていない場合: [ag](http://qiita.com/thermes/items/e1e0c94e2875df96921c) を使います

```bash:command
ag Hoge
```

```bash:result
second.js
1:Hoge

first.js
1:Hoge
```

## ファイル名を抽出する

`-l` をつけます。

git grepのとき

```bash:command
git grep -l Hoge
```

```bash:result
first.js
second.js
```

agのとき

```bash:command
ag -l Hoge
```

```bash:result
first.js
second.js
```

## `xargs` に結果を渡す

[xargs](http://qiita.com/aosho235/items/231d6d12f56debc515f9) を使って、ファイル群にコマンドを当てることができます。
（使い方は次の `sed` と一緒に例示します）

## `sed` で置換する

[sed](http://qiita.com/muran001/items/472abcfc353d5df7b77a) を使って、ファイル内の文字列に置換処理を実行します。
先ほどの `git grep -l` や `ag -l` の結果を渡して行います。
ターミナルには特に何も表示されませんが、ファイルは変更されるはずです。

git grepのとき

```bash:command
git grep -l Hoge | xargs sed -i '' -e 's/Hoge/Fuga/g'
```

```bash:result
（なし）
```

agのとき

```bash:command
ag -l Hoge | xargs sed -i '' -e 's/Hoge/Fuga/g'
```

```bash:result
（なし）
```

## 変更したい文字列でgrepしたらいらない文字列がくっついている別のコードが出てきた

```bash:command
git grep BarBaz
```

```bash:result
first.js:BarBaz
second.js:FooBarBaz
(END)
```

`BarBaz` という文字列をほかの文字列に変更しようと思ってコマンドを叩いたとき、上の例でいうところの `FooBarBaz` は変えたくない、というときがあります。
そのような場合、 `grep -v` で候補を削ぎ落とします。

```bash:command
git grep BarBaz | grep -v Foo
```

```bash:result
first.js:BarBaz
```

このままだとファイル名だけを抽出できません。
ここで [awk](https://hydrocul.github.io/wiki/commands/awk.html) というコマンドを使います。

```bash:command
git grep BarBaz | grep -v Foo | awk -F: '{print $1}'
```

```bash:result
first.js
```

ここまで来たら、先ほどのコマンド群が適用可能になります。少し長いですが、

```bash:command
git grep BarBaz | grep -v Foo | awk -F: '{print $1}' | xargs sed -i '' -e 's/BarBaz/QuxQuux/g'
```

```bash:result
（なし）
```

これでファイルの中身が変更できます。
DietCubeで、twigのテンプレートファイルからconfig値を参照する方法

DietCubeではデフォルトでconfigという変数がtemplateに渡されているので、

テンプレートファイル内から

```
{{ config.foo }}
```

のようにして参照することができる。

# 仕組み

Application.phpの中で、コントローラをnewした直後にsetVar()が呼ばれている。
https://github.com/mercari/dietcube/blob/1.0.3/src/Application.php#L220

setVarで渡された値は、コントローラ内でview_varsというプロパティに格納され、
https://github.com/mercari/dietcube/blob/1.0.3/src/Controller.php#L30

view_varsはrender()の際にテンプレートエンジンに渡される
https://github.com/mercari/dietcube/blob/1.0.3/src/Controller.php#L74
【Python入門】continue文での繰り返しの方法とは?

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[【Python入門】continue文での繰り返しの方法とは?](http://programming-study.com/technology/python-continue/)


#【Python入門】continue文での繰り返しの方法とは?


Pythonのループ文は同じ処理を何度も繰り返し行うのに便利です。そんなループ文ですが、繰り返しの中で、ある条件の時だけ実行し、それ以外の時はスキップしたい時があると思います。そんな時には、continue文を使うと便利です。今回は、continue文の使い方について説明します。



continue文は、for文などの繰り返しを行う処理の中で使われます。continue文を使うと、それ以降の処理が実行されずにスキップされ、次のループに進みます。

```
list1 = [1, 5, 6, 2, 4, 9, 11, 3]

for number in list1:
    if(number < 5):
        continue
        
    print(number)
```

実行結果
>
5
6
9
11

この例では整数のリストの中から要素を取り出し、5より大きい要素だけを表示しています。その際に、数字が5未満の場合はcontinue文を実行するようにしています。continue文が実行されると、それ以降の内容がスキップされて次のループへ進みます。そのため、最後の要素が5未満の場合は最後のprint()がスキップされ、表示されないようになっています。

単純な処理の場合は、if-else文や例外などで実現することができますが、コードが長くなると見づらく複雑なものになってしまいます。ループ文の中で処理をスキップしたいときは、continue文を使うとよいでしょう。

##while文におけるcontinue文

さきほどはfor文でcontinue文を使いましたが、同じループであるwhile文でも同じようにcontinue文を使うことができます。

```
list1 = [1, 5, 6, 2, 4, 9, 11, 3]

index = 0

while index < len(list1):
    if(list1[index] < 5):
        index += 1
        continue
        
    print(list1[index])
    index += 1
```

実行結果
>
5
6
9
11

こちらはさきほどのfor文をwhile文で置き換えたものです。少し複雑になってしまいましたが、要素が5未満の場合はcontinue文を実行し、残りの処理をすべて飛ばす、ということに関してはfor文の場合と全く同じです。

##continue文で多重ループを抜ける

Pythonでは、ループ文を途中から抜ける構文としてbreak文が用意されています。

```
for x in range(100):
    if(x == 50):
        print('ループ文を抜けました（ループ回数：{}回）'.format(x))
        break
```

実行結果
>
ループ文を抜けました（ループ回数：50回）

このfor文ではループを100回繰り返しますが、if文でループ回数が50回に到達したらbreak文でループを抜けるようにしています。break文を使えば、ループを簡単に抜けることができます。しかし、break文の場合は1つのループを抜けることが出来ても、多重ループを抜けることはできません。

```
list1 = [ [1,5,7], [10,3, 4], [6, 8, 5]]

for list1_item in list1:
    for item in list1_item:
        print(item)
        if(item >= 10):
            print('10以上の数字が見つかりました')
            break
```

実行結果
>
1
5
7
10
10以上の数字が見つかりました
6
8
5

この例では、2次元のリストの中身を多重ループで参照し、もし10以上の要素があればそこで表示を終了するようにしています。ところが、break文では1つのループしか抜けることができません。そのため、この例では内側のループだけを抜けてしまうので全体のループが終了しません。

実は、Pythonには多重ループを抜けるための方法は用意されていません。多重ループを一気に抜けたい場合は、自分で実装を考える必要があります。方法はいくつかありますが、実はcontinue文と、if文でもおなじみのelse節を組み合わせることで多重ループを一気に抜けることができます。

```
list1 = [ [1,5,7], [10,3, 4], [6, 8, 5]]

for list1_item in list1:
    for item in list1_item:
        print(item)
        if(item >= 10):
            print('10以上の数字が見つかりました')
            break
    else:  #これはifではなく内側のfor文のelseなのに注意
        continue
    break
```

実行結果
>
1
5
7
10
10以上の数字が見つかりました

この方法なら、キレイにループを抜けることが出来ました。まず、内側のfor文を回すのですが、最後にelse節があります。for文のelse節は、ループが終わった後に最後に実行されます。内側のループが終わると、else節に移動し、continue文が実行されます。continue文が実行され、最後のbreakはスキップされるのでループが続行されます。
もし、内側のループでif文が実行される（この例だと10以上の数字が見つかる）と、breakで内側のループ文を抜けるので、else節は実行されません。そのため最後のbreakが実行され、ループ全体を抜けることができます。