OmniAICreator/Qiita-1.07M huggingface dataset:
boto3インストール

macのローカル環境にboto3をインストール。

```
sudo pip install boto3
```

これでboto3経由でawsを操作できるようになりました！


## 参考サイト
http://boto3.readthedocs.io/en/latest/guide/quickstart.html
http://dev.classmethod.jp/cloud/aws/aws-sdk-for-python-boto3-released/
ライブラリを使わずJSでコピペをカスタマイズ

ブラウザでコピーとペーストの際にJSで任意のデータをクリップボードに追加したり取得したりした検証のまとめです。
※IEのことは考慮していません。

# clipboard API

[まだ実験段階の機能](http://w3c.github.io/clipboard-apis/)なので、[対応状況](http://caniuse.com/#feat=clipboard)がブラウザによって異なります。
APIを使うには、まずはイベントを起こさないと使えないようです。
ユーザーのアクションがないと使えないという意図がありそうです。

copyイベントハンドラのイベントオブジェクトに[clipboardData](https://developer.mozilla.org/en-US/docs/Web/API/ClipboardEvent/clipboardData)が入ってきます。
clipboardDataは[DataTransfer](https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer)なので、ここから色々データをとってこれます。

```js
window.addEventListener('copy', function(e) {
  var clipboardData = e.clipboardData; // ←ここにclipboardDataがある
});
```

# Copy


## [clipboardData.setData](https://developer.mozilla.org/ja/docs/DragDrop/DataTransfer/setData)で任意のデータをコピー

setDataメソッドを使えば、文字列などのデータを追加できます。
`format`を独自の文字列で定義できるので、後述するclipboardData.itemsでデータを取得するところで独自のtypeから引っ張ってくることもできます。
画像データの追加はできないんですかね。


```js
clipboardData.setData('text/plain', 'コピーする文字列');
```


## document.execCommand('copy')で任意の文字列をコピー

[execCommand('copy')](https://developer.mozilla.org/ja/docs/Web/API/Document/execCommand)で選択している文字列をコピーすることができます。
これを使ってJS側から任意の文字列をコピーさせることもできます。
強制的にコピーイベントを発火させるちょっとハックっぽい使い方です。
なにかしらユーザのアクション(ここではボタンをクリック)のイベントハンドラ内で、処理をする必要があります。
[デモ](http://codepen.io/kwst/pen/wJYmXX?editors=1011)

```js
document.getElementById('btn').onclick = function() {
  var input = document.createElement('input');
  input.setAttribute('id', 'copyinput');
  document.body.appendChild(input);
  input.value = 'コピーする文字列';
  input.select();
  document.execCommand('copy');
  document.body.removeChild(input);
}
```

# Paste


## clipboardData.itemsでデータを引っ張ってくる

ペーストイベントオブジェクトのclipboadDataのitemsプロパティにクリップボードのデータが格納されています。
[デモ](http://codepen.io/kwst/pen/aJRRya?editors=1010)
ちなみに[safariではサポートされていません](https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer)。

### [getAsFile](https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/getAsFile)

Fileとして取得できます。
画像はこれを使ってBlobオブジェクトがとれます。

```js
if (item.type.indexOf('image') >= 0) {
  var blob = item.getAsFile();
}
```

### [getAsString](https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem/getAsString)

単純な文字列はこれでとれます。
なぜかこちらは非同期なので、コールバックを引数にわたしてやる必要があります。

```js
if (item.type.indexOf('text') >= 0) {
  item.getAsString(function(str) {
    console.log('text data: ', str);
  });
}
```


## document.execCommand('paste')でデータを引っ張ってこようとしたが

これも試してみたんですが、どうやら[使えなくなっている](http://stackoverflow.com/questions/39193878/javascript-execcommandpaste-not-working)ようです。。。
Hammerspoonでfn+英字をctrl+英字にマップする

HammerspoonはmacOSでキーのマッピングを変更することのできるソフトウエアです。
SierraにバージョンアップしたらKarabinerが使えなくなってしまい、Hammerspoonに乗り換えている人もいると思います。(私みたいに)

私はKarabinerで、USキーボードの左下にあるfnキーをcontrolに割り当てていたのですが、それと同じことをHammerspoonで行う設定を書いてみました。

fnと英字キー(とスペースバー)を押したときだけ、fnをcontrolキーに変えています。
(オートリピートのときにちゃんと動くのか自信がありません。)

```lua:~/.hammerspoon/init.lua
local handler = function(e)
  local key = hs.keycodes.map[e:getKeyCode()]
  local fn = e:getFlags()['fn']

  if (fn and ((string.len(key) == 1 and 'a' <= key and key <= 'z') or key == 'space')) then
    hs.eventtap.keyStroke({'ctrl'}, key, 1000)
    return ''
  end
end

eventtap = hs.eventtap.new({hs.eventtap.event.types.keyDown}, handler)
eventtap:start()
```
React Componentのkey

#下記Postコンポーネントからkey属性の値を読み取れない。key属性を設ける目的は、ただReactのVirtualDomを構築する時に役に立つだけです。

```
const content = posts.map((post) =>
  <Post
    key={post.id}
    id={post.id}
    title={post.title} />
);
```

## Reactドキュメント
[Lists and Keys](https://facebook.github.io/react/docs/lists-and-keys.html)

## Full検証用ソースコード

```
class Post extends React.Component {
  constructor(props) {
    super(props);
  }
  
  render() {
    // consoleログにundefinedが出力される
    console.log("component key:" + this.props.key);
    return (
      <div>
      <h3>{this.props.title}</h3>
      <p>{this.props.content}</p>
    </div>
    );
  }
}

function Blog(props) {
  const sidebar = (
    <ul>
      {props.posts.map((post) =>
        <li key={post.id}>
          {post.title}
        </li>
      )}
    </ul>
  );
  const content = props.posts.map((post) =>
    <Post key={post.id} title={post.title} content={post.content} />
  );
  return (
    <div>
      {sidebar}
      <hr />
      {content}
    </div>
  );
}

const posts = [
  {id: 1, title: 'Hello World', content: 'Welcome to learning React!'},
  {id: 2, title: 'Installation', content: 'You can install React from npm.'}
];
ReactDOM.render(
  <Blog posts={posts} />,
  document.getElementById('root')
);
```

#参考記事
[React.jsの地味だけど重要なkeyについて](http://qiita.com/koba04/items/a4d23245d246c53cd49d)
[ReactJS - Keys](https://www.tutorialspoint.com/reactjs/reactjs_keys.htm)
スマートホームでの行動認識をやってみる

# 概要
スマートホームのセンサデータから日常行動認識をやってみます．
今回対象とするセンサは，ドアやいろいろな家具，器具に取り付けられた動きセンサで，そこから取得されるオンオフデータから行動のラベルを推定します．

Yala氏の手法を参考にしました．
https://hal.archives-ouvertes.fr/hal-01202168/file/Inista_Yala_Session5B.pdf

コードも拙いですが，公開しました．（何かしら問題があればコメントなどいただけると幸いです．）
jupyterを使ってpython3で書いてます．pandas，sklearnなどのライブラリを使っております．
https://github.com/LittleWat/ActivityRecognitionInSmartHome


# データセット
ワシントン州大学で取得されたデータセット（ http://ailab.wsu.edu/casas/datasets/ ）をありがたく使わせていただきます．
ここの研究室(?)，活動が2014年で止まっているようで残念です．

今回はこのうち，17番のArubaデータセットを用います．


### Arubaデータセットのセンサ配置
<img width="637" alt="スクリーンショット 2017-03-26 17.25.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/893f49ec-b83e-cc87-aa52-19aa3d24ec56.png">


### Raw Data
<img width="498" alt="スクリーンショット 2017-03-26 17.22.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/cf6b4699-8a79-485c-0ee9-255e69079527.png">

# 行動認識のパイプライン
<img width="643" alt="スクリーンショット 2017-03-29 16.10.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/b4341c22-c3e7-9877-21bf-5322de7f75e7.png">


## DataSegmentation

<img width="682" alt="スクリーンショット 2017-03-29 17.09.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/378a9279-2e76-86e8-1110-b9b396dc71be.png">

実際は，上手のように，activityごとに，時間幅やセンサ数幅など異なっており，うまく扱う必要がありそうですが，
今回は，単純にRaw Dataの一定数行(10行)ごとに（センサ数幅で）データを切り分けました．


## Feature Extraction
Feature Engineeringをするわけですが，今回はYala氏の手法のうちベースラインの方法と最終状態のON/OFFを特徴量とする手法の2つのみ試してみました．
### ベースラインの手法
<img width="944" alt="スクリーンショット 2017-03-27 10.53.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/83440342-0ae1-c1ce-e032-572628d6a2a0.png">

### 最終状態を特徴量とする手法
<img width="945" alt="スクリーンショット 2017-03-27 10.53.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/0bb97e07-ae86-532a-fbc9-beeedf0eefb8.png">

時刻がスカラー値になっておりますが，どうスカラー値にencodigするか不明だったため，1日24時間ということで24次元のone-hot-vectorにencodingしました．


# 結果
### ベースラインの手法（Accuracy: 0.913）

<img width="668" alt="スクリーンショット 2017-03-27 11.08.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/2739d9ff-42f6-ea2d-819f-948861ce40d8.png">



### 最終状態を特徴量とする手法（Accuracy: 0.920）

<img width="608" alt="スクリーンショット 2017-03-27 11.07.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/66dfc584-4f2a-6573-284d-d0c61f9a9aad.png">

どちらも特にパラメータチューニングなどやったわけではないですが，高い精度が出ました．
簡単すぎる問題設定だったようです，

# まとめ
Yala氏の手法を実装して，それなりの結果が出ることを確認しました．

jupyter + pandas + seaborn

の組み合わせはやはり便利ですね^^

# References
- [データセットの元論文](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3068197/)
ActiveReportsのページレポートでページ番号がグループごとに表示されない?

ActiveReportsのページレポートのヘルプをみてページ番号をグループごとに表示するようにしたがうまくいかなかった。
原因を調べたのでまとめ 

#ヘルプ箇所
PowerTools ActiveReports for .NET 9.0J > ActiveReportsユーザーガイド > 概念 > ページレポート／RDLレポートの概念  > ページ番号の追加 

#結論
下記手順でできる。
１．ページプロパティのFixedLayoutのGroupingで…ボタンをクリック
２．レイアウトタブの「グループごとにページ番号を設定」にチェックを入れる
３．ページ番号を表示したいテキストボックスのvalueに「=Globals!PageNumberInSection」を設定する

#やり方詳細

![プロパティ設定.png](https://qiita-image-store.s3.amazonaws.com/0/143913/e6151ef8-ed2f-c624-320e-91d7536242e4.png)

![プロパティ設定2.png](https://qiita-image-store.s3.amazonaws.com/0/143913/021e470e-ac19-62c6-5edd-1d6c12dcde92.png)

![プロパティ設定3.png](https://qiita-image-store.s3.amazonaws.com/0/143913/3a07d7a3-0def-66aa-39d9-db8a9c05d351.png)

![プロパティ設定4.png](https://qiita-image-store.s3.amazonaws.com/0/143913/3f25fa5b-3314-5615-286a-bb1a12033242.png)
Web Starter Kit 

Web Starter Kit
インターネットに接続された様々なデバイスにコンテンツを配信するためのフレームワークです。
簡単に必要な環境を使うことが出来るパッケージになっているツールがWeb Starter Kitです。
https://developers.google.com/web/tools/starter-kit/
参考
http://creator.aainc.co.jp/archives/4815

何ができる
環境ごと揃えられる

・マルチデバイス対応
・スタイルガイド
・ブラウザシンク
・ライブリロード
・JavaScript、CSS、HTMLの最適化
・HTTP Serverの構築
・sassコンパイル
・ページスピードのレポート

必要環境
・Node
・Ruby
・Gulp
・Sass

インストール
WindowsでコマンドラインからGitを使えるようにする
Git exe ダウンロード
http://git-scm.com/

実行

コマンドプロンプトを起動し下記のコマンドを実行します。
スタートメニューの検索で「cmd.exe」と入力
画面がたちあがったら
git --version
UbuntuでRubyMineを日本語化

##環境
Ubuntu 16.04 LTS
RubyMine 17.01

##はじめに
rubymineは基本英語なので英語弱者の自分には正直つらい。
ので[こちら] (http://qiita.com/tukiyo3/items/f245744c4c18259016f9)のサイトを参考に日本語化をすすめていきます。

###日本語化していく
1. [ここ](http://mergedoc.osdn.jp/)からPleiadesの最新版プラグインをダウンロード・インストールします。
2.  ダウンロードしたフォルダをRubyMineのplugins配下にコピー
3.  RubyMineのbinフォルダにあるrubymine.vmoptionsに以下のコードを追記する

```text:bin/rubymine.vmoptionsに追記
-javaagent:../plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
-Dfile.encoding=UTF-8
```

もしUbuntu Lightなどのフォントを選択していてこのまま起動すると文字化けするのでSansSerifなどの文字化けしないフォントを選択する。
##起動する
日本語化されました！
![Screenshot from 2017-03-29 16-50-38.png](https://qiita-image-store.s3.amazonaws.com/0/129082/1873fbdc-1b37-c6de-37d8-4aa73fbcfe39.png)


##感想
IntelliJのIDEならほとんどなんでもPleiadesで日本語化できるのかと感動。。。
中国語のメールの件名（Subject）が文字化けした。

中国語のメールのSubjectが文字化けしました。
`mb_convert_encoding` とか 単純に base64 にしたりしてみましたがうまくいかなかった。

MIME ヘッダエンコーディング方式によって文字列をエンコードすることで解決。

## 解決した方法

```php
$subject = mb_encode_mimeheader('中国語件名');
```

http://php.net/manual/ja/function.mb-encode-mimeheader.php

## 参考にしました
http://qiita.com/kidatti/items/16b9fa22399d6db7bcff

ありがとうございます。
Robocodeによるロボットバトル入門（開発初級編）

[Robocodeによるロボットバトル入門（環境構築編）](http://qiita.com/genzouw/items/08107d2d10f3c5436fc2) で ロボット開発ツールとして [kiy0taka/robocode-start](https://github.com/kiy0taka/robocode-start)  を紹介しました。

今回は、[robocode-start](https://github.com/kiy0taka/robocode-start) の機能を使いロボットを開発するための流れを説明します。


## 前提

* 以下のものがインストールされていること（ **[Robocodeによるロボットバトル入門（環境構築編）](http://qiita.com/genzouw/items/08107d2d10f3c5436fc2) を参考** ）
    1. [JDK1.8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
    2. [IntelliJ IDEA the Java IDE](https://www.jetbrains.com/idea/#chooseYourEdition)
    3. [robocode-start](https://github.com/kiy0taka/robocode-start)
    4. [Robocode](http://robocode.sourceforge.net/)


## ロボットを作成

[robocode-start](https://github.com/kiy0taka/robocode-start) にサンプルコードが含まれているため、コピーします。

**robocode-start** 配下の `src/main/java/org/kiy0taka/robots/MyFirstRobot.java` を COPY -> PASTE します。

![2017-03-29_12h49_52.png](https://qiita-image-store.s3.amazonaws.com/0/15523/b540f66e-0915-2026-1b01-b40c7a9bc296.png)

![2017-03-29_12h53_40.png](https://qiita-image-store.s3.amazonaws.com/0/15523/d33296f7-a10c-fc78-ffbc-5424e8f2cad7.png)



コピー後に作成する新しいクラスの情報を設定します。
以下の情報を適当に入力します。

* New name （ **クラス名** ）
* Distination package （ **パッケージ名** ）

![2017-03-29_12h56_57.png](https://qiita-image-store.s3.amazonaws.com/0/15523/4a8582be-e33e-a6f8-e497-b088904fe97c.png)


新しいソースコードが追加されます。

![2017-03-29_13h54_48.png](https://qiita-image-store.s3.amazonaws.com/0/15523/baefeddb-652b-4551-523f-40cbdefe23f1.png)


## ロボットの実行

@TODO
A-FrameのVRモードで一部iOS上のSafariのアドレスバーが消えない問題への対処

一部のiOS機（画面解像度が一定以下？）でA-FrameのVRモードに入った時アドレスバーが消えない問題に遭遇しましたがページの末尾に以下のスクリプトを挿入するとアドレスばーが消えるようになりました。

```
var html = document.getElementsByTagName('HTML'); 
html[0].style.position = 'initial'; 
html[0].style.overflow = 'scroll'; 
var canvas = document.querySelector('.a-canvas'); canvas.style.top = '1000px';
```
かなり強引に見えますがどうもiOS Safariのバグらしく正攻法の対処法は無いようです。

iOS SafariのWebVR正式対応がなされることを祈るのみ・・・。

参考：https://github.com/aframevr/aframe/issues/1231
（↑では対象機種がiPhone5,5S,SEとなっていますがiPod touch 5thでも同様の問題が発生しました）
okHttp3 の client に selenium でとった cookie を差し込む

# selenium(selenideもおなじ) の webdriver から cookie をとって okhttp の client に差し込む

型が違うので受け渡してやる必要あった。もっとうまくやれそうだがあきらめた。
以下は、url を download する例

```java
    private void downloadFileSync(final String downloadUrl, String orgFilename) throws Exception {
        List<Cookie> cookies = new ArrayList();
        String domain = "example.com";// . で始まるドメインだと例外になるので k.getDomain() でとったあと . をとるか、直接指定する
        val cc = new Cookie.Builder();
        for (org.openqa.selenium.Cookie k : getWebDriver().manage().getCookies()) {
            cc.domain(domain).name(k.getName()).path(k.getPath()).value(k.getValue());
            if (k.isSecure()) { cc.secure(); }
            if (k.isHttpOnly()) { cc.httpOnly(); }
            if (k.getExpiry() != null) { cc.expiresAt(k.getExpiry().getTime()); }
            cookies.add(cc.build());
        }
        CookieManager cookieManager = new CookieManager(null, ACCEPT_ALL);
        CookieHandler.setDefault(cookieManager);
        JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager);
        cookieJar.saveFromResponse(HttpUrl.parse(downloadUrl), cookies);
        OkHttpClient client = new OkHttpClient().newBuilder().cookieJar(cookieJar).build();

        String filename = orgFilename + ".jpg";
        log.info("download filename : {}", filename);
        Request request = new Request.Builder().url(downloadUrl).build();
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) {
            throw new IOException("Failed to download file: " + response);
        }
        FileOutputStream fos = new FileOutputStream("/tmp/" + filename);
        fos.write(response.body().bytes());
        fos.close();
    }
```

ChromeDriver では get(url) で、画像ファイルなどを取得する方法がみつからなかったので、上記のように url を okhttp に渡して、cookie との整合性も用意してやるようにしました。

あるいは

```java
        String[] cookieKeys = { "hoge", "hogehoge", "hogehogehoge" };
        StringBuilder cookie = new StringBuilder();
        for (String key : cookieKeys) {
            val oneCookie = getWebDriver().manage().getCookieNamed(key);
            cookie.append(String.format("%s=%s;", key, oneCookie.getValue()));
        }

        OkHttpClient client = new OkHttpClient().newBuilder().build();
        Request request = new Request.Builder().url(downloadUrl).header("Cookie", cookie.toString()).build();

        Response response = client.newCall(request).execute();
```

こんなで header にいれてやるだけでも良かった。
`getWebDriver().manage().getCookie()` が、String でまるっととれればいいんだが。できるのかな？

over.
pythonでkafka consumerで最初のoffsetからメッセージを取得する

##### 背景
kafkaにリアルタイムデータを入れてるけど、offsetの最初からデータを取得したくなった。
その方法がドキュメントに書かれてないので、備忘録として書いておく

##### ライブラリ
いくつかkafkaのライブラリがあるようだけど
kafka-python 1.3.2を使うことにする

##### コード

```py3
from kafka import KafkaConsumer, TopicPartition
consumer = KafkaConsumer(bootstrap_servers='hoge')

tp = TopicPartition('topic_name', 0)
consumer.assign([tp])
consumer.seek(tp, 0)

for msg in consumer:
    // do something
```

##### 説明
KafkaConsumerのコンストラクタでトピックを指定せずにTopicPartitionをつかってトピック名を指定する。
あとはseekでTopicPartitionとoffsetを指定してあげるとできる
[Objective-C] ViewController間の遷移

# 遷移の仕方一覧
よく頭が混んがらがるのでメモまとめました
いまだ何がベストかちょっとわかってないですが・・・;

以下を考慮して臨機応変に
・コードでの遷移
・StoryBoardのsegueを使った遷移
・NavigationControllerを使った遷移

## Present
```
[self presentViewController:移動先ViewController animated:YES completion:nil];
```

## segue
```
[self performSegueWithIdentifier:@"セグエのID" sender:self];
```

## Push
```
[self.navigationController pushViewController:移動先ViewController animated:YES];
```
## Pop

### 指定ビューコントローラーへ
```
[self.navigationController popToViewController:viewController animated:YES];
```

### 前の画面に戻る
```
[self.navigationController popViewControllerAnimated:YES];
```

### NavigationControllerの１番目の画面に戻る
```
[self.navigationController popToRootViewControllerAnimated:YES];
```

## StoryBoard

#### ・StoryBoard ID
※storyboardファイルで 'identify → StoryBoard ID'の入力が必要

```
UIStoryBoard* storyBoard = [UIStoryboard storyboardWithName:@"ストーリボードID" bundle:nil];
UIViewController* viewController = [storyboard instantiateInitialViewController];
```

#### ・StoryBoard initial ViewController 
※storyboardファイルで 'is initial View Controller'のチェックが必要

```
UINavigationController* rootNavigationController = [storyboard instantiateInitialViewController];
UIViewController* viewController = [[rootNavigationController viewControllers] lastObject];
```

そのうち
Swiftのメモもまとめたいです
Android O Preview 1のSecretKey周りの変更点について【超簡易まとめ】

DroidKaigi2017で予想しておきながら、SecretKeySpecは今回変更がありませんでした。すいません……（でもなくて良かった……）。

とはいえそれだけで終わらせるのはひどいなと思ったので、今回のAndroid O Preview 1でのSecretKey周りの変更点をざっと記述していきます。

## API Difference

URLがわかりにくいですが、すでにAnroid O Preview 1のAPI Differencesは公開されています。

[API Differences between 25 and o-dp1](https://developer.android.com/sdk/api_diff/o-dp1/changes.html)


## SecretKeySpecの変更について

**ありません（謝罪）。**代わりに同パッケージ内にあった`PBEParameterSpec`のコンストラクタに変更があります。鍵アルゴリズム（`AlgorithmParameterSpec`）が設定できるようになったことと、その設定したアルゴリズムを取得するためのメソッドが追加されています。

- [javax.crypto.spec](https://developer.android.com/sdk/api_diff/o-dp1/changes/pkg_javax.crypto.spec.html)
- [PBEParameterSpec | Android Developers](https://developer.android.com/reference/javax/crypto/spec/PBEParameterSpec.html)

## その他SecretKey周りの変更について

- [javax.crypto](https://developer.android.com/sdk/api_diff/o-dp1/changes/pkg_javax.crypto.html)

`SecretKey`に`Destroyable`インターフェースが追加されました（あれ、いままでありませんでしたっけ？）。

Destroyableインタフェースはその名のとおり破棄まわりのインターフェースで、これによってAndroid Oからは明示的に破棄可能なステータスを伝える`isDestroyed()`と、破棄処理である`destroy()`の実装が必要となります。

[SecretKey | Android Developers](https://developer.android.com/reference/javax/crypto/SecretKey.html)


`SecretKeyFactory`からkeySpecを取得する際の`getKeySpec()`において、鍵仕様の指定部分にワイルドカードがつきました。正直に言うと知識疎いので理由はわかりません……。PBEParameterSpecのアルゴリズム追加に伴うワイルドカード対応なんでしょうか？

[SecretKeyFactory | Android Developers](https://developer.android.com/reference/javax/crypto/SecretKeyFactory.html#getKeySpec(javax.crypto.SecretKey, java.lang.Class<?>))

この変更は`SecretKeyFactorySpi`の`getKeySpec()`も同様です。


## まとめ

SecretKeySpec自体の変化はありませんでした。代わりにAndroid界隈ではあまり見受けられなかった（経験談）PBEParameterSpecがコンストラクタでアルゴリズムを指定できるようになったのは、この記事を書くにあたって調べた肌感だと大きいように感じました。

いろいろあやふやな内容になってしまったので、編集リクエストやコメントでのツッコミなど、お待ちいたしております！
招待コードでログインする方法

初めまして。プログラミング初心者で3ヶ月ほど前から、swiftの勉強をしています。

今勉強で、AppstoreにあるHeart is in というアプリを自分で真似して作ってみようと思っています。
以下の写真のようなログイン機能(片方が招待コードを送って相手がそれを入力欄に入力する)をつけたいのですが
どうすればよろしいのでしょうか？

(自分でもswift3 ログイン種類、swift3 招待コードログイン 開発等のワードで検索しているのですが出てきません。)

![スクリーンショット 2017-03-29 15.17.51.png](https://qiita-image-store.s3.amazonaws.com/0/172808/4a7e0551-61c6-ebd7-f401-ec3a9a6bbcbe.png)


まだまだ私の知識が少ないので参考資料でも構いませんので
教えていただけますと幸いです。

よろしくお願いします。
Widonws10のスタートメニューへ(プログラムソフトでない)アイコンを追加する方法

2017/03/29
インストールせずに使用しているソフトなどは、手動でショートカットをコピーしないと追加できない。
ただ、ショートカットであればなんでも登録できる(フォルダやメモ帳のショートカットとかでも)。

# 方法
1. C:\ProgramData\Microsoft\Windows\スタートメニュー\プログラム へ移動。
2. 登録させたいショートカットを"プログラム"フォルダ配下へコピーする。このとき管理者権限を求められるので注意。
3. スタートメニューを開くと、"すべてのアプリ"に先程コピーしたショートカットが登録されている。あとはドラッグしてお好みの場所へ配置。
Firebase Notificationをクライアントからオプトアウトする疑似的手法

Firebaseのコンソールから送る通知(Notification)、いわゆるpushは、クライアントから受信をオフにすることは出来ません。
OS4.1以降ならアプリの設定から「通知」を切ればいいですが、旧ＯＳで「通知が切れない、ウザい」とレビューを書かれるのを避けるには、アプリ内に設定を設けて、ユーザーがオフにしたときはサービス内で受信した通知を無視するコードを書くしかありません。

この方法で、アプリがフォアグラウンド時には無視できるのですが、問題はバックグラウンド時です。

バックグラウンド時の受信は、SDKが自動でやってしまうため、これをコードから「機能を停止させる」ことはどうやら出来ません。

疑似的にpushを無視する方法として、以下のパターンを考えました&見つけました。

- topic購読機能を利用する
- FirebaseAnalyticsのユーザープロパティを利用する
- priorityの高いレシーバークラスを作成して無視するコードを書く
- コンソールからの通知を行わず、FCMのみ利用する

#1. topic購読機能を利用する

必ずtopic購読を指定する方法です。
もともと仕様上topicが複数ある場合はいいのですが、特に何も考えていない場合は、アプリからtopic購読・購読解除のコードを書く必要が本来はありません。
ここであえて"all"などのトピックを作成して、通知設定がONの時は購読、OFFの時は購読解除、とすることで、疑似的にpush受信のon/off設定に使うというわけです。

```java:通知ONにしたとき
FirebaseMessaging.getInstance().subscribeToTopic("all");
```

```java:通知OFFにしたとき
FirebaseMessaging.getInstance().unsubscribeFromTopic("all");
```

コーディングは恐らく最も簡単な方法です。
注意点は、**必ずtopicをターゲット指定した通知をコンソールから送るという運用ルールが必要になる**ことです。
また、ユーザーセグメントを使ったターゲット指定を最初から考えている場合は、この手法はとらない方がいいです。
というのも、ユーザーセグメントをターゲットにした通知と、topicをターゲットにした通知が、**同時に指定できない**からです。

#2. FirebaseAnalyticsのユーザープロパティを利用する

FirebaseAnalyticsに特定のuserPropertyを送り、それをユーザーセグメント指定のフィルタに利用する方法です。

```java:通知ONにしたとき
mFirebaseAnalytics.setUserProperty("push_enabled", "true");
```

```java:通知OFFにしたとき
mFirebaseAnalytics.setUserProperty("push_enabled", "false");
```

※userPropertyは先にコンソールから登録すること

この方法も、1と同じく、**必ずユーザープロパティ"push_enabled"="true"をフィルタにターゲット指定した通知をコンソールから送るという運用ルールが必要**です。

この方法の難点として上げるならば、userPropertyによるフィルタリングがどの程度のタイムラグで行われるか分からないこと、です。
FirebaseAnalyticsの送信は定期的にまとめて行われているようで、反映に時間がかかることが分かっています。
数時間前に設定をoffにしたユーザーに、pushを打ったら届いちゃった、ということが発生する可能性は高いです。

#3. priorityの高いレシーバークラスを作成して無視するコードを書く

こちらで紹介されていた方法です。
(http://stackoverflow.com/questions/37511198/firebase-on-android-i-want-to-disable-firebase-notifications-on-android-client)

WakefulBroadcastReceiverの派生クラスを登録して、設定がoffになっていたら`abortBroadcast()`すればよいようです。（試してみていないです。）
長期の運用が予想されて、その運用がアプリ開発者の目の届かないところにいく可能性が高い場合は、運用ルールを必要とする1や２の方法はあまり好ましくありません。
なので、この方法を検討した方がいい気がしますが、コメントにも書かれているとおり、**将来にわたって動作が保証されている手法ではない**ことに留意する必要があります。

#4. コンソールからの通知を行わず、FCMのみ利用する

自前のサーバーからpushを打つ方法です。この方法はアプリに作成した自前の受信サービスの`onMessageReceived`に必ず飛んできますから、自由にpushを無視できます。

難点は、サーバー開発担当者が必要になることでしょうか。
Firebaseのお手軽さを損なう方法でもありますが、大規模なアプリ運用が予想される場合には初めから取っておいた方がよい手法かと思います。
あとこの手法も、一応、**Firebaseコンソールからはpushを打ってはいけないという運用ルールが必要**と言えますかね。


何か有用な情報がありましたら、コメント頂けたら幸いです。
[HTML編]<link>タグ

*きっかけ*
最近、ECサイトの移行案件を参加していました。
結構前はSEO関して、SEOというワードだけ知ってます。
だから、phpビュー側いっぱいhtmlメタ・タグを見たら、
これらは「何だろう、何の役割である」と思いつつ、
今からヘッダーの中にそれぞれタグの調査を始めるばかりです。
（HTML分からん＝.＝）

まずは「`<link>`タグとは」から始めましょう。

#`<link>`タグ
####　link要素タイプ 
link要素は文書全体についての情報を記述するhead要素の中に置かれ、HTML文書を前後の文書、スタイルシート、スクリプト、代替文書などの様々なリソースと結びつける働きをします。
ブラウザなどのユーザーエージェントは、これを使ってナビゲーション・パレットを表示したり、自動的に正しい順番でファイルを印刷したりといった応用が可能です。

<link>タグを指定する場合には、href属性とrel属性が必須です。 
href属性とrel属性が指定されていない場合には、<link>タグの指定は無効となります。 
href属性には、リンクする外部ファイルのURLを指定します。


###### [rel 属性に与えられる値(リンクタイプ)の一覧](http://xn--lcki7of.jp/845/)
|値  |	link|	a, area	| 意味・利用目的 |
|:--------------|---------------:|:----------------:|:----------------:|
| alternate | 	○	| ○	| 代替文書 |
| author | 	○	| ○	| 著者情報 |
| bookmark | 	×	| ○	| パーマリンク |
| help | ○ | ○ | ヘルプの文書 |
| icon | ○ | × | アイコン |
| license | ○ | ○ | ライセンス(著作権文書) |
| next | ○ | ○ | 連続した文書の次の文書 |
| nofollow | × | ○ | リンク先の情報を保障・推奨しない |
| noreferrer | × | ○ | リンク先にリファラを送信しない |
| prefetch | ○ | ○ | リンク先のリソースを予めキャッシュする |
| prev | ○ | ○ | 連続した文書の前の文書 |
| search | ○ | ○ | 現在のドキュメントとその関連ページに対する検索機能 |
| stylesheet | ○ | × | スタイルシート |
| tag | × | ○ | 現在のドキュメントに適用されるタグが提供されている |

```ruby:sample:
<link rel="canonical" href="{$canonical}">
/*参考⇒[canonical属性とは]*/
<link rel="prev" href="{$prevPageUrl}">
<link rel="next" href="{$nextPageUrl}">
<link rel="stylesheet" href="css/top.css" type="text/css">
```

*参考：*
[`<link>`タグとは](http://www.htmq.com/html5/link.shtml)
[link 要素の使い方](http://www.kanzaki.com/docs/html/link.html#robots)
[rel 属性に与えられる値(リンクタイプ)の一覧](http://xn--lcki7of.jp/845/)
[canonical属性とは](http://web-tan.forum.impressrd.jp/e/2009/03/05/5112)



--- I love you ,PHP (｡･ω･｡)ﾉ♡
自分メモ：月や日の2桁表示方法

phpだとsprintfを使うのが一般的？なんだろうけどJSの日付フォーマットに二桁表示させるものが用意されていない（ES6に追加されてるかどうかは知りませんwww）。
どうしても01月とか07日みたいな表示をしなきゃいけない場面に遭遇します。

そこで登場、みんな大好き？slice先生！

例えばgetMonthやgetDateで取得した値が一桁の場合、まずはそれに「0」を連結（この時点で型はstring）して強制的に2文字以上の文字列とし、slice先生に頑張ってもらって末尾から2文字になるようカットしてもらう！！（謎）

例）
値が1→01→Slice→01
値が20→020→Slice→20

参考として本日の西暦月日を出すコードは

```javascript:sample.js
  var now = new Date();
  var today = now.getFullYear() + '年' + ('0' + (now.getMonth() + 1)).slice(-2) + '月' + ('0' + (now.getDate())).slice(-2) + '日';
  console.info(today);
```

今日が2桁じゃない月や日の人はごめんねw

ちなみに
01や02をクオーテションでくくらない限り、型はnumberで、01+02という計算をすると「3」というnumberで返ってきます。
カメラロール内写真を使うアプリでの iCloud 「ストレージを最適化」テスト環境構築手順

#目的
iCloudには、デバイスの容量を節約するために「ストレージを最適化」の機能がある。
この機能をONにすると、iCloud フォトライブラリがデバイス上のライブラリのサイズを自動的に管理し、iCloud にオリジナルの写真とビデオが保管され、デバイスには省スペースのバージョン(低解像度画像など)が保存されるようになる。

このとき、普通にフォトライブラリから写真を取得すると低解像度の画像が取得されるので、本来やりたいことができない場合がある。

この状態での動作確認を行うための環境構築手順を記述する。

なお、iCloud がどのように動作するかは公開されておらず、環境によってはうまく再現できない場合があることを了承されたい。

#環境構築手順
1. 共通で使える Apple ID を用意する
1. https://www.icloud.com/ にアクセスし上記IDでログイン後、「写真」を開いて写真 / 動画をできるだけ削除する(すべて削除できるなら削除した方が良い、iCloudの容量を空けるため)
1. テスト用の2つの端末(テストしたい端末をA,もう一つの端末をBとする)を用意しそれぞれに以下の操作を行う
    * 写真アプリを開いて、画像 / 動画をできるだけ削除する(iCloudとの通信を最小限にするため)
    * Wi-Fi に接続する
    * 設定アプリ → iCloud → Apple ID を入力 → サインイン で iCloud にサインインする 
    * 同じ画面で 写真 → iCloudフォトライブラリのスイッチをONにする
    * 「iCloud フォトライブラリ」の下に進捗状況が表示されるのでアップロード / ダウンロードがすべて完了するまで待つ
    * 同じ画面で「iPhone のストレージを最適化」を選択する
1. 端末Aの残容量を300MB未満にする(数字は目安)
    * http://qiita.com/matsuokah/items/17329c90a4dec9a76ece などで行うと良い(写真や動画で一杯にすると iCloud のほうが埋まってしまうため)
1. 端末Bで写真を2,3枚撮影する
1. 端末B(Wi-Fi接続済み)で 設定アプリ → iCloud → 写真 を開き、「iCloudフォトライブラリ」の下の表示が「アップデート完了」になるまで待つ
1. 端末Aで写真を2,3枚撮影する
1. 端末A(Wi-Fi接続済み)で 設定アプリ → iCloud → 写真 を開き、「iCloudフォトライブラリ」の下の表示が「アップデート完了」になるまで待つ
1. 写真アプリを確認し、写真 / 動画に雲のマークがついていたらOK
1. ついていない場合、端末Aの容量をさらに減らし、5.~8. を繰り返す
 
#補足 : iCloud フォトライブラリの仕組み
公式はコチラ → [iCloud フォトライブラリ - Apple](https://support.apple.com/ja-jp/HT204264)

要点をまとめます。

* iCloud へのアップロード / ダウンロードには Wi-Fi 接続が必要
* 同じ Apple ID で iCloud フォトライブラリ を ON にしたすべての端末の写真 / 動画が iCloud上にアップロードされ、iCloud上に保存されている他の端末の 写真 / 動画 がすべてダウンロードされる
    * アップロード / ダウンロードの状況は 設定アプリ → iCloud → 写真 を開かないと確認できず、通信速度が遅いとメッセージが全然変わらないため、状況がわかりづらい
    * ダウンロード中も「アップロード中」と表示される
* 自端末の残容量 < iCloud 上の写真 / 動画容量 の場合、iCloudからダウンロードができなくなる
* iCloud を無料で使える容量は5GBのため、複数の端末でフォトライブラリをONにするとあっという間に上限に達する
* (16GBだと特に)端末容量もiCloud容量もすぐいっぱいになるので、満足に使えない状況になりがち
* スムーズに使うには、iCloud に保存している写真 / 動画を減らす & 同期が不要な端末のフォトライブラリをOFFにする のが良さそう
MySQLのSELECT結果をCSV形式で出力する

SELECT結果を直接CSV出力する方法。
今回は、sqlファイルを作成しコマンドラインから直接出力する。

###### SQLファイル
```mysql:query.sql
SELECT * FROM tables
INTO OUTFILE '/tmp/output.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
```

###### コマンドラインで実行
```
% cat query.sql | mysql -u root -p [database]
```
Railsでlocalのサーバーに接続できない時の対処方法

少し前に触れたプロジェクトのアプリケーションを立ち上げた時につまずいたので、その対処法を備忘録として残しておきます。

サーバーを立ち上げローカルに接続しましたが、その時に出てきたコンソール上のエラーがこれです。

```
[FATAL][2017-03-29T14:08:00+09:00 #53498 /vendor/bundle/ruby/2.3.0/gems/better_errors-2.0.0/lib/better_errors/middleware.rb#log_exception:123] -- :  Mysql2::Error - Can't connect to MySQL server on 'paintd.cluster-cexg5st0vwbx.ap-northeast-1.rds.amazonaws.com' (60)
```
実際はもっとエラーが出てますが、解決した後にここがエラーの根幹であったことがわかったので記述しておきます。

主な原因はこいつ

```
Mysql2::Error - Can't connect to MySQL server on 'paintd.cluster-cexg5st0vwbx.ap-northeast-1.rds.amazonaws.com'
```

ローカルに接続するべきなのにMySQLに接続してやがりました。
いつの間に設定が変わったのか…

アプリケーションのディレクトリ内にある `¥config¥database.yml`ファイルを変更してやれば解決。
この時は `development`に接続されてたので、 `development`の中身を

```
host: localhost
database: ローカルで設定したDB
username: root
password:
```
へ変更してあげれば無事解決しました。

ローカルのDBへ接続できなければ、 `database.yml`を疑いましょう。
勝手に変わってる可能性大。
rspecでis_expectedにブロックを渡す

rspecで`change`などを使う場合、ブロックを渡さないといけません。

```ruby:spec/models/hoge_spec.rb
describe 'hoge' do
  it{ expect{ hoge }.to change{ Hoge.count }.by(1) }
end
```

なので、`subject/is_expected`を使いたい場合は少し気をつけないといけません。

```ruby:spec/models/hoge_spec.rb
describe 'hoge' do
  subject { hoge }
  it{ is_expected.to change{ Hoge.count }.by(1) }
end

#=> Failure/Error: is_expected.to change{ Hoge.count }.by(1)
#     expected result to have changed by 1, but was not given a block
```

上記の通り、subjectにブロックを渡していないのでエラーになります。

# そのままブロックを渡すパターン
とりあえず、subjectにそのままブロックを渡せば要件は満たせます。

```ruby:spec/models/hoge_spec.rb
# Proc.newで渡す場合
describe 'hoge' do
  subject{ Proc.new { hoge } }
  it{ is_expected.to change{ Hoge.count }.by(1) }
end

# lambdaで渡す場合
describe 'hoge' do
  subject{ ->{ hoge } }
  it{ is_expected.to change{ Hoge.count }.by(1) }
end
```

# 拡張するパターン
ただ、拡張してメソッド追加したほうがいろいろ捗りそうです。

```ruby:spec/rails_helper.rb
module IsExpectedBlock
  def is_expected_block
    expect { subject }
  end
end

RSpec.configure do |c|
  c.include IsExpectedBlock
end
```

```ruby:spec/models/hoge_spec.rb
# subjectにはブロックを渡していない
describe 'hoge' do
  subject{ hoge }
  it{ is_expected_block.to change{ Hoge.count }.by(1) }
end
```

以上。

# 参考
* [rspec - Can I use is_expected with block matchers? - Stack Overflow](http://stackoverflow.com/questions/32729067/can-i-use-is-expected-with-block-matchers)
* [is_expected with block expectations · Issue #805 · rspec/rspec-expectations](https://github.com/rspec/rspec-expectations/issues/805)
C++ Builder > TCanvas > 凡例を描画する

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

TCanvasで凡例を描画してみた。

参考 http://www.ne.jp/asahi/aaa/tach1394/delphi/0300/03.htm

エラー処理はきちんとしていない。

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

static const int kNumColor = 4;

// Microsoft color
// @ http://colorhunt.co/blog/google-microsoft-brand-colors/
static const int baseColors[][3] = {
	{ 0x00, 0xA1, 0xF1 }, // R, G, B
	{ 0x7C, 0xBB, 0x00 }, // R, G, B
	{ 0xFF, 0xBB, 0x00 }, // R, G, B
	{ 0xF6, 0x53, 0x14 }, // R, G, B
};

TColor __fastcall TForm1::getTColor(int index)
{
	if (index < 0 || index >= kNumColor) {
		return RGB(0, 0, 0);
	}
	int R = baseColors[index][0];
	int G = baseColors[index][1];
	int B = baseColors[index][2];
	return RGB(R, G, B);
}

void __fastcall TForm1::clearTImage(TImage *imgPtr)
{
	imgPtr->Canvas->Brush->Color = clWhite;
	imgPtr->Canvas->FillRect(Rect(0, 0, imgPtr->Width, imgPtr->Height));
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	drawLegends();
}

void __fastcall TForm1::drawLegends(void)
{
	// 1. 消去
	clearTImage(Image1);

	// 2. 凡例の描画
	int step_y = 20; // 結果を見ながら調整した
	for(int idx=0; idx < kNumColor; idx++) {
		char code = 'A' + idx;
		writeTextOnTImage(Image1, /*x=*/30, /*y=*/10 + step_y * idx, String(code)); // 位置30は任意
		drawLegentColor(Image1, /*x=*/14, /*y=*/14 + step_y * idx, getTColor(/*index=*/idx)); // 位置14は任意
	}
}

void __fastcall TForm1::writeTextOnTImage(TImage *imgPtr, int x, int y, String text)
{
	imgPtr->Canvas->Font->Color = clBlack;
	imgPtr->Canvas->Brush->Color = clWhite; // これがないとdrawLegendColor()の後に文字に背景色が付く
	imgPtr->Canvas->Font->Size = 10; // サイズ10は任意

	imgPtr->Canvas->TextOutW(x, y, text.c_str());
}

void __fastcall TForm1::drawLegentColor(TImage *imgPtr, int x, int y, TColor acolor)
{
	imgPtr->Canvas->Brush->Color = acolor;
	imgPtr->Canvas->FillRect(Rect(x, y, x+10, y+10)); // サイズ10は任意
}
//---------------------------------------------------------------------------
```


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/81f7240d-8639-7b34-62f6-177659763a58.png)

こんな感じで使う。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/76c8ecbb-2a27-45f7-7fa2-1a9877fb1114.png)
WindowsServerFailoverCluster構築

#はじめに
WindowsServerFailoverCluster(2012R2)を商用環境で構築してきました。
なかなかググってもいい情報もなし、書籍をみても簡単なチュートリアルしかなく実際に自分で構築をしてから作業にあたりましたが、NECさんや富士通さんが出している構築手順書は秀逸だと思います。
http://support.express.nec.co.jp/os/w2012r2/WS2012R2_WSFC_installation_guide.pdf

なら、こここで終わってしまうのですが、構築時にはまっている人向けに、構築して分かった事象解決やナレッジ的な情報を書いてみたいと思います。困っている人の味方あまちゃん:wink:
ほんとは画面SSを見せたいのですが、閉じた環境での構築やコンプラなんちゃらで載せられませんの。


この先は私のブログを参照してください。
http://amachan007.techblog.jp/archives/14159936.html
APFSで再燃したNFD問題

iOS 10.3 でAPFSが本番投入されました。それでiPhoneやiPadが文鎮化するなどの深刻な問題はみられなかったものの、やはり無問題とはいかなかったようで。

[APFS]: https://ja.wikipedia.org/wiki/Apple_File_System

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">iOS10.3で不具合の出るアプリは、APFS関連の影響かも（Unicode Normalizationの振る舞いが変わったらしい）。GoodReaderとDropboxの同期でエラーが出るようになったのだが、ファイル名に濁点を含むファイルを除いたら同期できるように。</p>&mdash; 山路達也 (@Tats_y) <a href="https://twitter.com/Tats_y/status/846899701425201152">March 29, 2017</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

原因を調べてみました。

```:nfdtest.pl
#!/usr/bin/env perl
use strict;
use warnings;
use feature ':all';
use Encode;
use Unicode::Normalize;
use utf8;
binmode STDOUT, ':utf8';

sub listdir {
    my $dn = shift;
    opendir my $dh, $dn or die "$dn: $!";
    my @fn = map { decode_utf8($_) } readdir $dh;
    closedir $dh;
    map { encode( 'ascii', $_, Encode::FB_PERLQQ ) } @fn;
}

my $dir = shift or die "usage: $0 dirname";
my $fn     = 'かばん.txt';
my $fn_nfd = NFD($fn);
say 'fn     =', encode( 'ascii', $fn,     Encode::FB_PERLQQ );
say 'fn_nfd =', encode( 'ascii', $fn_nfd, Encode::FB_PERLQQ );
eval {
    my $path = "$dir/$fn";
    open my $fh, '>:utf8', $path or die "$path:$!";
    say $fh "食べないでくださーい";
    close $fh;
};
say $@ if $@;
eval {
    my $path = "$dir/$fn_nfd";
    open my $fh, '<:utf8', "$dir/$fn_nfd" or die "$fn:$!";
    say <$fh>;
    close $fh;
};
say $@ if $@;
{
    say for listdir($dir);
    unlink "$dir/$fn";
}
```

上記のscriptを macOS Sierra v10.2.4 で実行した場合、HFS+では

```:HFS+
fn     =\x{304b}\x{3070}\x{3093}.txt
fn_nfd =\x{304b}\x{306f}\x{3099}\x{3093}.txt
食べないでくださーい

.
..
\x{304b}\x{306f}\x{3099}\x{3093}.txt
```

となりますが、APFSでは

```:APFS
fn     =\x{304b}\x{3070}\x{3093}.txt
fn_nfd =\x{304b}\x{306f}\x{3099}\x{3093}.txt
かばん.txt:No such file or directory at ./test.pl line 32.

.
..
\x{304b}\x{3070}\x{3093}.txt
```

となります。`かばん.txt`というファイルは:

* HFS+
  * '\x{304b}\x{3070}\x{3093}.txt'でも'\x{304b}\x{306f}\x{3099}\x{3093} .txt'でも読み書きできる
  * 正式名称は`\x{304b}\x{306f}\x{3099}\x{3093}.txt`
* APFS
  * '\x{304b}\x{3070}\x{3093}.txt'のみ読み書きできる
  * 正式名称は`\x{304b}\x{3070}\x{3093}.txt`

余談ですが、

* ZFS + normalization=FormD
  * 双方読み書きできる
  * 正式名称は`\x{304b}\x{3070}\x{3093}.txt`

でした。

より深刻なのは後者の、正式名称が[NFD]分解されるかいなかでしょう。HFS+では分解された方(decomposed)が正式名称ですが、APFS(というよりHFS+以外)は逆です。

[NFD]: https://ja.wikipedia.org/wiki/Unicode%E6%AD%A3%E8%A6%8F%E5%8C%96

ご覧の通り、HFS+の方はどちらのファイル名でもアクセスできるので、常に分解されていない方(composed)を用いればよいだけの話ではあるのですが…

Dan the Man with too Many Filesystems to Support
[Javascript][Deferred] ある条件が満たされるまでループする

[こちら](http://qiita.com/jiyu/items/82c8265392b0ac8f9d84) のDeferred版。jQuery.deferredでも、Javascript標準のPromiseでも使える。

```javascript
let makeDeferredLoop = (promise, func, args, interval) => {
    (function deferredLoop() {
        promise.then(() => {
            return func(args);
        }).catch(() => {
            setTimeout(deferredLoop, interval, args);
        });
    })();
};
```
EditTextのカーソル色変える時の注意点

`textCursorDrawable`で指定をするとEditTextのカーソルの色が変えることができる。
http://qiita.com/konifar/items/47d467e3574c9228fdc8


colorをそのまま指定することもできるが、機種によって見た目が変わるのでdrawableファイルで指定した方がよい。


```shape_cursor.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size android:width="1dp"/>
    <solid
        android:color="@color/apply_fragment_cursor_kind_ui"/>
</shape>

```

http://stackoverflow.com/questions/11523494/change-the-color-of-the-cursor-of-an-edittext-in-android-across-all-the-sdk

# 挙動の違いメモ（2017.3.29時点)
## colorでも出る
* Galaxy
* AQUOS(微妙にカーソル線が細くなる…）

## drawableじゃないと出ない
* Xperia
* Nexus
制約の修正なしで縦方向に要素を追加可能なビューの作成

## 概要
タイトルが長ったらしいですが、オートレイアウトでビューを組版している時、後から機能追加が発生し、「途中にビューを追加したい！」、「最後にビューを追加したい！」ってなると非常に面倒です。
そこで、Scroll ViewとStack Viewを組み合わせることで、AndroidでいうLinearLayoutっぽいものを実現できます。

![image9](https://github.com/ayakix/Scroll-Stack-Content/raw/master/images/image9.png)

## 構築手順
### 1.Scroll Viewの配置
基盤となるViewの全画面にScroll Viewを配置します。

![image1](https://github.com/ayakix/Scroll-Stack-Content/raw/master/images/image1.png)

Add New Constraintsで上下左右全てのマージンを0とします。

![image2](https://github.com/ayakix/Scroll-Stack-Content/raw/master/images/image2.png)

### 2.Stack Viewの配置
Scroll viewの子要素として、Vertical Stack Viewを配置します。
手順1と同様に、Add New Constraintsで上下左右全てのマージンを0とします。

![image3](https://github.com/ayakix/Scroll-Stack-Content/raw/master/images/image3.png)

しかし、このままではScroll Viewのコンテントサイズの制約がないためエラーがでます。
![image4](https://github.com/ayakix/Scroll-Stack-Content/raw/master/images/image4.png)

### 3.Scroll Viewコンテンツサイズの横幅の制約
Controlキーを押しながらStack Viewを選択し、Scroll Viewへドラッグします。
![image5](https://github.com/ayakix/Scroll-Stack-Content/raw/master/images/image5.png)

**Equla Widths** を選択し、Stack Viewの横幅をScroll Viewコンテントの横幅と揃える制約をつけます。

![image6](https://github.com/ayakix/Scroll-Stack-Content/raw/master/images/image6.png)

### 4.Scroll Viewコンテンツサイズの高さ（=Stack Viewの高さ）の制約
手順2により、Scroll Viewコンテンツサイズの高さ=Stack Viewの高さなため、Stack Viewの高さを決定します。様々なやり方があるのですが、ここでは、Stack Viewに配置されているビュー間のマージンが同じになるDistribution=Equal Spacingを例に取り説明します。

![image7](https://github.com/ayakix/Scroll-Stack-Content/raw/master/images/image7.png)

Stack Viewの子要素として適当なViewを追加します。
このViewの高さに制約を設けます。

![image8](https://github.com/ayakix/Scroll-Stack-Content/raw/master/images/image8.png)

Viewの高さが決定できると、Stack Viewの高さが決定でき、Scroll Viewのコンテンツサイズの高さが決まるため、エラーがなくなります。

以後、このStack Viewの子要素として、高さが決定しているViewを追加すれば、他のビューの制約を修正する必要はなくなります。

今回の例では、縦方向に要素を追加するサンプルについて説明しましたが、Horizontal Stack Viewを使えば同様の処理を横方向についても実現できます。

## サンプル
[Scroll-Stack-Content@github](https://github.com/ayakix/Scroll-Stack-Content)に動作するプロジェクトがあります。
dig内のJSで三項演算子

「:」前後に空白があるとエラー

```
$ cat a.dig
+task1:
  _export:
    val: ${true ? 1 : 2}
  echo>: ${val}
$ digdag run a.dig
2017-03-29 14:08:07 +0900: Digdag v0.9.7
error: Validating project failed
workflow /tmp/a.dig mapping values are not allowed here
 in 'string', line 3, column 22:
        val: ${true ? 1 : 2}
                        ^
 (model validation)
```

「:」前後の空白を詰めると動く

```
$ cat a.dig
+task1:
  _export:
    val: ${true ? 1:2}
  echo>: ${val}
$ digdag run a.dig
2017-03-29 14:11:33 +0900: Digdag v0.9.7
2017-03-29 14:11:36 +0900 [WARN] (main): Using a new session time 2017-03-29T00:00:00+00:00.
2017-03-29 14:11:36 +0900 [INFO] (main): Using session /tmp/.digdag/status/20170329T000000+0000.
2017-03-29 14:11:36 +0900 [INFO] (main): Starting a new session project id=1 workflow name=a session_time=2017-03-29T00:00:00+00:00
2017-03-29 14:11:40 +0900 [INFO] (0016@+a+task1): echo>: 1
1
Success. Task state is saved at /tmp/.digdag/status/20170329T000000+0000 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
```

「"」で囲んだ方が良さそう

```
$ cat a.dig
+task1:
  _export:
    val: "${true ? 1 : 2}"
  echo>: ${val}
$ digdag run a.dig
2017-03-29 14:38:36 +0900: Digdag v0.9.7
2017-03-29 14:38:39 +0900 [WARN] (main): Using a new session time 2017-03-29T00:00:00+00:00.
2017-03-29 14:38:39 +0900 [INFO] (main): Using session /tmp/.digdag/status/20170329T000000+0000.
2017-03-29 14:38:39 +0900 [INFO] (main): Starting a new session project id=1 workflow name=a session_time=2017-03-29T00:00:00+00:00
2017-03-29 14:38:42 +0900 [INFO] (0016@+a+task1): echo>: 1
1
Success. Task state is saved at /tmp/.digdag/status/20170329T000000+0000 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
```
filter_var関数とLaravelの落とし穴

## tl;dr
- `filter_var('1 ', FILTER_VALIDATE_INT)` としたときの戻り値は `1`
- これが引き金になってLaravelのバリデーションルールに `integer` を使っても `'1 '` が素通りする

## はじめに
PHPの標準関数には罠があるものが数多ありますが、今回は`filter_var`関数の罠について書きます。

## `filter_var`関数とは
[PHP: filter_var - Manual](http://jp2.php.net/manual/ja/function.filter-var.php)によれば

>指定したフィルタでデータをフィルタリングする

とのことです。巷ではバリデーションに使われているようです。

## 罠
以下のコードを実行したときの戻り値はどうなるでしょうか。
```
filter_var('1 ', FILTER_VALIDATE_INT);
```
このコードによって `1` が返ってきます。いかにもPHPらしいですね。
実行結果は https://wandbox.org/permlink/m4jD8Iiktn4VaQXb でご覧になれます。

`filter_var`関数の第2引数に渡している`FILTER_VALIDATE_INT`は[PHP: 検証フィルタ - Manual](http://jp2.php.net/manual/ja/filter.filters.validate.php)によると以下の効果があります。

>値が整数であるかどうか、オプションで指定した範囲内にあるかどうかを検証し、成功した場合は整数に変換します。

`'1 '`が整数であるかどうかについて、PHP的には整数ということですね。
検証としてはどうなんだろうと思うところであります。

## Laravelにおける落とし穴
Laravelのバリデーションルールとして`integer`を使ったときに呼ばれるメソッドに利用されています。
https://github.com/laravel/framework/blob/fe1ef6570d10c955da8e90c8be429d96ad5574ee/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L813-L823

```
    /**
     * Validate that an attribute is an integer.
     *
     * @param  string  $attribute
     * @param  mixed   $value
     * @return bool
     */
    protected function validateInteger($attribute, $value)
    {
        return filter_var($value, FILTER_VALIDATE_INT) !== false;
    }
```

つまり、Laravelではバリデーションルール`integer`を使っても`'1 '`は整数であると認識されます。そして、バリデーションを通過した値を得るにしても`filter_var`関数を通した値が得られるわけではなく、元の入力値が得られます。
なので、たとえば[`Carbon`オブジェクトの`year`](http://carbon.nesbot.com/docs/#api-setters)などに代入しようとすると`ErrorException (A non well formed numeric value encountered)`となります。

## おわりに
いかにもPHPらしい感じです。気をつけましょう。
【git】ブランチ間の差分の取り方

#ブランチ間の差分を見たい

```ターミナル
$ git diff [ブランチ名A] [ブランチ名B]
```

使用例

```ターミナル
$ git diff master develop 
```
ブランチAの方がBより古い扱いで差分が表示される。

###リモートブランチとの比較
```ターミナル
$ git diff origin/develop fix_routes
```
リモートブランチのdevelopとローカルのfix_routesを比較する。

###更新行数を取得
```ターミナル
$ git diff master develop --shortstat
 7 files changed, 502 insertions(+), 1 deletion(-)
```
オプション"--shortstat"をつけると、ブランチ間の更新行数を比較できる。
/etc/network/interface での IPv6

Ubuntu で NetworkManager off 設定なマシンで、IPv6 の付け方を調べたメモ。詳しくは man ページ参照のこと。

`/etc/network/interface` で設定する。dual stack 環境なので `iface` を複数書くべし。

`inet6 auto` というのは、SLAAC なアドレス自動設定を指している。「RAを元によろしく全部やる」という意味ではないことに注意。DNS 設定などは、まだまだDHCPv6で配布するケースが多いと思うので `wide-dhcpv6-client` パッケージをインストールして、`auto` にさらに `dhcp 1` オプションを追加する。

`inet dhcp` というのは DHCPv6 でアドレス設定とその他の設定をすることを指している。

まとめると例えばこうなる。IPv6 で `auto` と `dhcp` **両方設定**して構わない。

```
auto br0
iface br0 inet dhcp
 bridge_ports eth0 eth1

iface br0 inet6 auto
 dhcp 1

iface br0 inet6 dhcp
```
Arrays are not allowed in class constants in....

PHPでsyntaxcheckを行った際の出来事。
gitで他のソースをマージして、コミットしようとしたら(コミットする際にシンタックスチェックが走る)以下のエラーが…

```
PHP Fatal error:  Arrays are not allowed in class constants in /PATH/TO/FILE.php on line 10
```

調べてみると、クラス内変数として，
`const $arr = array();`
と宣言できるようになったのは，PHP5.6からみたいです．

ちなみにMacOS10.11ではPHP5.5が初期インストールされている様です。

```
PHP 5.5.38 (cli) (built: Aug 21 2016 21:48:49)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
```

PHPは最新に上げてこうな！
DCGANのモデルをチェックする機能を作ってみた

こんにちは。山田田中商店 情報処理研究室の田中です。
教師なし学習でモデルが何を学んでそれが何に使えるかを日々研究しています。

昨年はGANがとても盛り上がり一気に加速して、今年はさらに加速しそうな勢いですね。

当ラボでもその使い道を検討しているのですが、その過程で作ったモデルのチェック機能を公開してみることにしました。
Generatorモデルのイメージをつかむ助けになればいいなぁ、と思っています。(裏ではDiscriminatorも使っています)

下記のサイトにアクセスするとチェック機能を試すことができます。
女性の顔を出力するモデルになっています。
Discriminatorの分類がまだ甘いので変な顔も出力されますが、そこは今後改善していきたいと考えています。
リロードすると新しい画像表示します。
左側のパラメータを変更して「Create Image」をクリックするとそのパラメータの変更を加味した画像が再表示されます。

デモは停止しました。
超シンプル ひたすら dig なシェル


3月〜4月は引っ越しのシーズンです。サーバーのお引っ越しもよくあります。DNS を切り替わったかをひたすら確認するためのシェルスクリプトを作ってみました。

大したことしてないですが、偉そうに変数使っています。

## 使い方

- 下記テキストを、適当に名前をつけて保存。
    - 例: `dns-check.sh`
- DNSServer に権威サーバーのアドレスを指定。（権威DNSサーバーとは各ドメインの whois に設定されているネームサーバーのことです。）下記のスクリプトは Google のパブリックDNSを見に行っています

- Mac 等でターミナルを起動
- 実行可能形式に変更 例: `chmod 744 dns-check.sh`
- 実行 例: `sh dns-check.sh`
- Ctlr + C で停止されます
- DNSServer変数にそのドメインの権威NDSサーバーを入れて下さい。分からなければ、自分のドメイン登録サイトに登録しているネームサーバーを確認してください。ターミナルで `whois [ドメイン名]` とコマンドを打つと、出てきます。

## オプション

- デフォルトでは 30秒間隔でチェックをします。

## 実際のシェル

```DNScheck.sh
#! /bin/sh
# DNS Check script

# Variables
# ----------
SiteName="サイト名を入れる"
Domain="チェック希望のドメイン.com"
DNSServer="8.8.8.8" # 権威DNSサーバーを入れて下さい
# -----
Type="any"
IntervalSec="30"  # Interval seconds to repeat
# -----

# Actual Script
while :
do
    clear
    echo "=============================="
    echo "${SiteName} DNS Check"
    echo "Domain: ${Domain}"
    echo "------------------------------"
    echo "$(date "+%Y/%m/%d-%H:%M:%S")"
    echo "=============================="
    dig -t any ${Domain} @${DNSServer}
    sleep ${IntervalSec}
done
```

## クレジット

この記事が役に立ったら、「 **CMS は concrete5 が一番**」と頭の中で10回唱えてみてください〜。
phpでのfopenとcopyエラー

今phpで数百個の日本語名ファイルをディレクトリから読み取る作業を行っているのですが、

‐がファイル名に入ってしまうとfopenもcopyもエラーとなりどうする事も出来ません。

試したことは

mb_convert_encodingでutf-8に変換
ハイフンが？になるのでstr_replaceで置換

まではやってみましたが、エラーになってしまいます。

何か打開策はあるのだろうか
linebot ～完結編～

スロットの設定推測を作成する予定でしたが、もう少し簡単なパチンカス診断ボットを作ることにしました。
switch文を用いて簡易的な質問にこたえて診断するようなものです。

[ソースコード]
/*
 * Copyright 2016 LINE Corporation
 *
 * LINE Corporation licenses this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

package com.example.bot.spring.echo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.linecorp.bot.model.event.Event;
import com.linecorp.bot.model.event.MessageEvent;
import com.linecorp.bot.model.event.message.TextMessageContent;
import com.linecorp.bot.model.message.TextMessage;
import com.linecorp.bot.spring.boot.annotation.EventMapping;
import com.linecorp.bot.spring.boot.annotation.LineMessageHandler;

@SpringBootApplication
@LineMessageHandler
public class EchoApplication {
   private static final String START = "始める";
   private static final String A = "1";
   private static final String B = "2";
   private static final String C = "3";
   private static final String D = "4";
   private static final String E = "5";
   private static final String F = "6";
    public static void main(String[] args) {
        SpringApplication.run(EchoApplication.class, args);
    }

    @EventMapping
    public TextMessage handleTextMessageEvent(MessageEvent<TextMessageContent> event) {
String message = "";
     String remessage = "";
     message = event.getMessage().getText();
        System.out.println("event: " + event);
     switch(message){
     case START:
     remessage += "診断開始。3度の飯よりパチスロである。\n";
     remessage += "1.はい\n";
     remessage += "2.いいえ";
     break;
     case A:
     remessage += "朝起きたすぐに打ちに行きたくなる。\n";
     remessage += "3.はい\n";
     remessage += "4.いいえ";
     break;
     case B:
     remessage += "恋人とパチンコならどっちをとる？\n";
     remessage += "5.パチンコ\n";
     remessage += "6.恋人";
     break;
     case C:
     remessage += "あなたはパチンカスです。";
     break;
     case D:
     remessage += "あなたはパチンカスです。";
     break;
     case E:
     remessage += "あなたはパチンカスです。";
     break;
     case F:
     remessage += "あなたはパチンカスではありません";
     break;
     default:
    remessage += "選択してください";
    break;
    }
        return new TextMessage(remessage);
    }

    @EventMapping
    public void handleDefaultMessageEvent(Event event) {
        System.out.println("event: " + event);
    }
}
Elasticsearch5.3.0リリース記念 kibana5.3.0機能追加を試す

# 概要

kibana5.3.0で遊ぼう会。

https://www.elastic.co/blog/kibana-5-3-0-released の内容を見てなぞりながら、新規機能を確認します。

# 環境作成

例によってDockerで立てましょう。docker-compose up -dと。

```yaml
version: '2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:5.3.0
    container_name: elasticsearch
    ports:
      - 9200:9200
      - 9300:9300
  kibana:
    image: docker.elastic.co/kibana/kibana:5.3.0
    container_name: kibana
    links:
      - elasticsearch:elasticsearch
    ports:
      - 5601:5601
```

# Timepicker improvements

これまで、時間の幅を指定するところは、QuickだったりRelativeだったり、Absoluteだったり、条件を変えるときは、
時計マークのアイコンから選んでいました。
5.3.0では、そのアイコンの前後に時間をずらすアイコンが表示されるようになりました。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/111676/3614e255-c41f-4a3c-d9ff-ca99c67a6523.png)

例えば、「Last 1m」という条件で表示させていたときに、「＜」の部分を押すと、その前の１分を示す条件になります。
（内部的には、Absoluteを設定しているように見えました）

![2.png](https://qiita-image-store.s3.amazonaws.com/0/111676/f84d235f-e37f-9aba-3597-bf12494326cb.png)

こうすることで、もうちょっと前（や後）が見たい、というときに簡易に使えるようになったと思います。
時間軸のページャーのような感じでしょうか。

余談ですが、Last 1m　の条件から、矢印アイコンで前の条件に移動し、後アイコンを押して条件を戻した場合にはどうなるか、
というとLast 1m表記にはならず、Absoluteの指定形式になります。


# Top hits aggregation

Top Hits Aggregationが使えるようになりました、と。

データは気象庁のサイトから、３月分の東京近辺の気温データをCSVでダウンロードして入れました。
最高気温を出すだけであればメトリクスにMaxなどを指すと良いのでしょうが、
今回は各日の記録された気温の上位３件を平均した値をHeatMapにしてみました。

![heatmap   Kibana.png](https://qiita-image-store.s3.amazonaws.com/0/111676/26b16174-c982-efa1-7f92-5322b08e1966.png)

赤枠の部分がTop Hits関係のところです。

どうやら3/20前後は暖かい日が続いていたんだな、と。


# 雑感

きれいに整形され、どうしても譲れない好みのUIがあるのであれば、慣れたExcelや高価なBIツールを使うと良いと思うのです。

> Elastic {ON} 2017 3/7 ノート(1日目)
> http://n-agetsuma.hatenablog.com/entry/2017/03/08/155644

によると、そのうち出るらしいcanvasプラグインでは、PowerPointで作ったような見た目ができるようになったりするようです。

Excelでしこしこ設計書風のものを書いている日々が続くと、素晴らしいスピードでエンハンスが続く製品が眩しくて仕方ない。