OmniAICreator/Qiita-1.07M huggingface dataset:
VaporでMySQL Providerを追加する方法(Swift4)

公式ドキュメント(https://docs.vapor.codes/2.0/mysql/package/)
の手順だけだと追加できない。
import MySQLProviderとすると怒られたりビルド時に以下のようなエラーが出たりする。

> error: manifest parse error(s):
/Users/username/hoge/Package.swift:17:10: error: ambiguous reference to member 'package'
        .package(url: "https://github.com/vapor/mysql.git", majorVersion: 2)
         ^      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/username/hoge/Package.swift:17:10: note: overloads for 'package' exist with these partially matching parameter lists: (url: String, from: Version), (url: String, Package.Dependency.Requirement), (url: String, Range<Version>), (url: String, ClosedRange<Version>), (url: String, version: Version), (url: String, branch: String), (url: String, revision: String), (url: String, range: Range<Version>)
        .package(url: "https://github.com/vapor/mysql.git", majorVersion: 2)

ちょっと手順を加えるだけで大丈夫です

環境
MacOS　HighSierra
Xcode 9
Swift 4
Vapor Toolbox: 3.1.2
Vapor Framework: 2.3.0

# Package.swiftを編集する
Projectのすぐ下にあるPackage.swiftを以下のように編集する

```swift:Package.swift
import PackageDescription

let package = Package(
    name: "hoge",
    products: [
        .library(name: "App", targets: ["App"]),
        .executable(name: "Run", targets: ["Run"])
    ],
    dependencies: [
        .package(url: "https://github.com/vapor/vapor.git", .upToNextMajor(from: "2.2.0")),
        .package(url: "https://github.com/vapor/leaf-provider.git", .upToNextMajor(from: "1.1.0")),
        .package(url: "https://github.com/vapor/mysql-provider.git", .upToNextMajor(from: "2.0.0")),
        .package(url: "https://github.com/vapor/fluent.git", .upToNextMajor(from:"2.0.0")),
        .package(url: "https://github.com/vapor/mysql-driver.git", .upToNextMajor(from:"2.0.0"))
    ],
    targets: [
        .target(name: "App", dependencies: ["Vapor", "LeafProvider","MySQLProvider"],
               exclude: [
                   "Config",
                   "Database",
                   "Public",
                   "Resources"
               ]),
        .target(name: "Run", dependencies: ["App"]),
        .testTarget(name: "AppTests", dependencies: ["App", "Testing"])
    ]
)
```
Swidt4ではpackageの書き方が違うのが引っかかりポイント。あと、Targetのところに"MySQL Provider"を追加しないとビルドが通りません。

# swift package updateする
```
$ swift package update
```

これだけでOK！
Pipenv で Python パッケージを管理する

# はじめに

例えば Ruby では [Bundler](http://bundler.io) を使って [Gemfile](http://bundler.io/man/gemfile.5.html) で、Node.js では [npm](https://www.npmjs.com) や [Yarn](https://yarnpkg.com) を使って [package.json](https://docs.npmjs.com/files/package.json) でパッケージを管理できます。

同様に Python では [pip](https://pip.pypa.io/en/stable) を使って [requirements.txt](https://pip.pypa.io/en/stable/user_guide/#requirements-files) でパッケージを管理できます。しかし `Gemfile` や `package.json` と違って機能が十分ではありません。

そこで、もっと便利なパッケージ管理方法を調べていたところ [Pipfile](https://github.com/pypa/pipfile) というものを発見しました。まだ実験段階のようですが、`requirements.txt` より高機能で便利そうです。そして [Pipenv](https://github.com/kennethreitz/pipenv) というツールを使用することで `Pipfile `を取り扱うことができるようなので、試してみました。

# Pipenv とは

[公式ドキュメントの日本語訳](http://pipenv-ja.readthedocs.io/ja/translate-ja/) によると

> Pipenv — Python.org が正式に推薦するPythonパッケージングツール、そして (自由としての) フリー。
> (略)
> pipenvは、手動でパッケージのインストールおよびアンインストールを行うのと同じように Pipfile に対してパッケージの追加および削除を行うのに加え、自動でプロジェクト用の仮想環境を作成し管理します。 また、pipenvはいかなるときも重要な Pipfile.lock を生成し、これは決定論的ビルドをもたらすために使われます。

とのことです。機械翻訳っぽいですね :robot:

なお Pipenv では仮想環境の作成に [virtualenv](https://virtualenv.pypa.io/en/stable/) を使っています。

# インストール

```
$ pip install pipenv
```

# 使い方

任意の Python プロジェクトのディレクトリに移動しておきましょう。

```
$ cd pipenv-sandbox
```

はじめに仮想環境を作成します。このとき、virtualenv が使う Python のバージョンをオプションで指定します。

```shell-session
$ pipenv --three  # Python 3
$ pipenv --two  # Python 2
$ pipenv --python 3.6.3  # バージョンを厳密に指定する
```

次に、パッケージをインストールします。試しに `beautifulsoup4` と `requests` をインストールしましょう。

```
$ pipenv install beautifulsoup4==4.6.0 requests==2.18.4
```

さらに `ipython` をインストールしてみましょう。`pipenv install` コマンドには `yarn add` コマンドと同様に `--dev` オプションがあり、開発環境のみにパッケージをインストールすることができます。

```
$ pipenv install --dev ipython==6.2.1
```

ここでプロジェクトを確認すると Pipfile が自動生成されていることが分かります。なお Pipfile は [TOML](https://github.com/toml-lang/toml) 形式です。そして Pipfile.lock という JSON 形式の lock ファイルも自動生成されています。

```
$ cat Pipfile
```

```Pipfile
[[source]]

url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"


[packages]

"beautifulsoup4" = "==4.6.0"
requests = "==2.18.4"


[dev-packages]

ipython = "==6.2.1"
```

作成した仮想環境でコマンドを実行するには、先頭に `pipenv run` を付けます。これは Bundler の `bundle exec` に相当します。

```
$ python -c 'from bs4 import BeautifulSoup'  # pipenv run なし
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named bs4

$ pipenv run python -c 'from bs4 import BeautifulSoup'  # pipenv run あり
```

```shell-session
$ ipython  # pipenv run なし
pyenv: ipython: command not found

$ pipenv run ipython  # pipenv run あり
Python 3.6.3 (default, Nov  8 2017, 15:19:48)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]:
````

あるいは `pipenv shell` コマンドで仮想環境を activate することもできます。

```shell-session
$ pipenv shell
$ ipython
$ exit
```

# 参考

* [Pipenv: Python Dev Workflow for Humans](https://docs.pipenv.org)
  * 公式ドキュメント
* [How to manage your Python projects with Pipenv](https://robots.thoughtbot.com/how-to-manage-your-python-projects-with-pipenv)
  * thoughtbot 社の記事
テンプレート引数の整数

## 前置き

テンプレート引数には型のほかに整数を指定することもできます。
そのような場合の挙動を調べました。
サンプルとして以下のコードを使います。

```C++:クラステンプレートのサンプル
template <class T, int N=10>
class Sample {
	T data[N];
public:
	int size() const { return N; }
};
```

```C++:テンプレート関数のサンプル
template <class T, int N>
inline int size(const T (&a)[N]) { return N; }
```

## クラステンプレートの動作

前提として、テンプレートはコンパイル時にクラスや関数の実体が生成されます。したがって、コンパイル時に決まる値のみテンプレート引数として使うことができます。

```C++:クラステンプレートを使う
#include <iostream>

 // OK
Sample<int, 3> s1;
std::cout << s1.size() << std::endl;

// OK, 省略されたNにはデフォルト引数の10が入る
Sample<int> s2;
std::cout << s2.size() << std::endl;

// NG, nは変化しうる値なのでテンプレート引数にできない
int n = 4;
Sample<int, n> s3;
std::cout << s3.size() << std::endl;

// こちらのnはconstなのでOK
const int n = 5;
Sample<int, n> s4;
std::cout << s4.size() << std::endl;

// NG, 'bar'はconstだが動的な値fooを経由している
int foo = 7;
const int bar = foo;
Sample<int, bar> s7;
std::cout << s3.size() << std::endl;    

// 配列サイズが0やマイナスになるのはもちろんNG
Sample<int, 0> s6;
Sample<int, -1> s7;
std::cout << s6.size() << "," << s7.size() << std::endl;
```

## 関数テンプレートの挙動

テンプレート引数が暗黙的に解決できる場合、通常の関数のように使えます。
特殊な型変換などをしたい場合は、テンプレート引数を明示してあげる必要があります。

```C++:関数テンプレートを使う
// OK
int a1[3] = { 3,4,5 };
std::cout << size(a1) << std::endl;    // 3

// OK
int a2[] = { 7,6,5 };
std::cout << size(a2) << std::endl;    // 3

// OK, a[2], a[3]は自動的に（0で?）初期化される
// 0初期化はテンプレートとは関係ない
int a3[4] = { 8,9 };
std::cout << size(a3) << std::endl;    // 4

// 配列サイズ0でNG
int a4[] = {};
std::cout << size(a3) << std::endl;

// NG, 型が合わない
int *a5 = new int[10];
std::cout << size(a5) << std::endl;

// NG, size_check関数内ではNがわからない
template <class T>
void size_check(T ar[])
{
	std::cout << size(ar) << std::endl;
	return;
}
int a6[3] = { 3,3,4 };
size_check(a6);

// OK, なぜかSTLは動的に変更してもテンプレートに渡せる…?
std::vector<int> a7 = { 1,1,2,3,5,8 };
int hoge = 13;
a7.push_back(hoge);
std::cout << size(a7) << std::endl;    // 7
```

~~動的に変更しているはずのvectorで正しい結果が返る理由はよくわかりません…。~~
コメントにて @yumetodo さんから補足がありました。ADL(Argument Dependent Look-up)という仕様による動作だそうです。

[size - cpprefjp C++日本語リファレンス] (https://cpprefjp.github.io/reference/iterator/size.html)

なお、`a5`のような形式でも、テンプレートを追加すれば（だいぶ強引に）size関数を使えます。サイズを知るための関数に手動でサイズを指定するというのも不思議な話ですが。

```C++:動的配列へのテンプレート関数
template <class T, int N>
inline int size(const T* a) { return N; }

int* a5 = new int[10];
std::cout << size<int, 10>(a5) << std::endl;
```

## 参考資料

[C++テンプレートテクニック 第2版](http://www.sbcr.jp/products/4797376685.html)
これを読み始めたばかりなので、認識や用語にかなりあやふやなところがあります。
お詳しい方がおられましたら、コメントにて補足やご指摘をお願い致します。
ES6で関数群を名前空間に押し込めるときどう書けばいいの問題


# 3行で
- 関数をHoge内にいくつか定義してHoge.someFunc() みたいな形で使いたい
- クラスとして定義したが、これをインスタンス化することはなかった
- 名前を付けて定義したobjectをexportすることにした

# 詳しく

あるユーティリティ系の関数群を、

```js:app/javascript/foo.js
import Hoge from './utils/hoge';

Hoge.someFunc();

```

こういう形で使いたかったので、初めはこうしていました。

```js
export class Hoge {
  static someFunc() {
  	console.info('do something');
  }
}
```

やりたいことはできていますが、Hogeは関数の集まりをまとめたモジュールなので、インスタンス化することはありません。そのため、classを使う必要はありません。

以下のように書くことができればいいのですが、調べる限りそういう書き方はないようでした。

```js
export module Hoge {
  someFunc() {
    console.info('do something');
  }
}
```

検索していると、以下のStackoverflowを見つけました。

- [javascript \- ES6 modules: Export single class of static methods OR multiple individual methods \- Stack Overflow](https://stackoverflow.com/questions/29893591/es6-modules-export-single-class-of-static-methods-or-multiple-individual-method%20question)


```js

export default {
  myMethod1() {
    console.log('foo'); 
  },
  myMethod2(args...) {
    console.log('bar'); 
  }  
};
```

なるほどそう書けばいいのか。しかし、これだと毎回importする側でモジュールの名前を決めなければいけません。

```js
import Hoge from './utils/hoge';
```

import側で決めるということは、このようにも書けます。

```js
import Fuga from './utils/hoge';
```

これはどうなんでしょうか。やはりexportするところでモジュールの名前は決まっていたほうがいいような気がします。


少し考えて、名前を付けて定義したobjectをexportすることにしました。

```js:utils/hoge.js
const Hoge = {
  someFunc: () => {
  	console.info('do something');
  }
};

export default Hoge
```

うん、これでやりたいことはできました。ただ、この書き方あまり見ないような気がします。

たとえばMastodonのソースを読んでみると、

```js
import { getLocale } from '../locales';
```

- https://github.com/tootsuite/mastodon/blob/057db0ecd0049c76c113cbe5412e098d686f0700/app/javascript/mastodon/containers/mastodon.js#L13

のような具合に、関数を単体でimportしています。

関数群をconstで宣言したobjectに入れて、それを使うのはあまり一般的ではないんでしょうか。困ることはないので、問題が出るまではobjectごとexport,importする方式でいきたいと思っています。

## その後（12/15追記）
この記事を書いたあと思い直して以下のようにオブジェクトをexportする書き方にしていました。

```js:utils/hoge.js
export default {
  hello: () => {},
  goodbye: () => {},
  // ...
}
```

が、やはり補完が効かなくてつらいので、この記事に書いたようにobjectに名前をつけてexportする形に直しました。


```javascript:utils/hoge.js
const Hoge = {
  hello: () => {},
  goodbye: () => {},
}

export default Hoge
```

`export function` で関数一つずつexportする方法も考えました。

```javascript:utils/hoge.js
export function hello() { }
export function goodbye() { }
```

結局それでは関数名がかぶって補完が活かせないことになりそうだったのでやめました。たとえばAPIを叩くための関数群が複数あったとしたら、 `load` という関数がたくさんexportされて補完対象になってしまう。それをimportするときに毎回たくさんの候補から選んでいたらつらい、という感じです。
Jekyll でCSVファイルを読み込んでHTMLとして表示

# 仕様

* 定型のフォーマットで繰り返されるデータがあるのでいい感じにループ回したい
* コピペでもHTMLタグなんて書きたくない
* 元データ更新すればいいだけにしたい

https://jaws-ug.jp/previous-events/
![screencapture-jaws-ug-jp-previous-events-1510140382998.png](https://qiita-image-store.s3.amazonaws.com/0/18348/45637884-b536-121b-6e7e-953d5a2c4ba1.png)
赤枠のところで、URL,イベント名,日付、バナーのセットをループで回します。

# ソース

https://jekyllrb.com/docs/datafiles/

Jekyll では `_data` に入れた YAML, JSON, CSV を変数（オブジェクト）として読み込む機能があります。
今回はCSVで実装してます

用意したCSV

```text:_data/sample.csv
name,url,cover,date
JAWS DAYS 2013,http://jawsdays2013.jaws-ug.jp/,jawsdays2013.png,2013.3.15-16
JAWS DAYS 2014,http://jawsdays2014.jaws-ug.jp/,jawsdays2014.png,2014.3.15
```

Jekyllでの書き方

```html:events.html
{% for event in site.data.events %}
	<div class="previous-event">
		{% if event.name != 'blank' %}
		<a href="{{event.url}}" target="_blank">
			{% if event.cover %}<img src="{{ site.baseurl }}/assets/images/site-cover/{{event.cover}}" alt="{{event.name}}"><br>{% endif %}
			{{event.name}}
			{% if event.date %} at {{event.date}}{% endif %}
		</a>
		{% endif %}
	</div>
{% endfor %}
```

画像は特定のディレクトリに入れてファイル名のみをCSVに記述する形にしたので、画像のパスはテンプレート側で補完してます。

現場からは以上です。
SQLite(3.5.4以前)でgroup_concat(PHPから使う場合)

SQLiteはバージョン3.5.4から便利な集約関数group_concatが使用できるようになりました。
逆に言えば、それより前のバージョンでは当然のことながら使うことはできません。
そこで、ユーザ定義関数(UDF)の出番です。

今回は、PHP5.1以降に標準で入っているPDOでgroup_concatを追加します。

```php:group_concat.php
// $dbにはSQLiteのPDOオブジェクトが入っているものとする。
function createGroupConcat($db)
    if (version_compare($db->getAttribute(PDO::ATTR_SERVER_VERSION), '3.5.4')<0) {
        $step_func = create_function('&$context, $rownumber, $string, $delimiter=\',\'', 'if (isset($string)) { if (isset($context)) $context .= $delimiter; $context .= $string; } return $context;');
        $finalize_func = create_function('&$context, $rownumber', 'return $context;');
        $db->sqliteCreateAggregate('group_concat', $step_func, $finalize_func);
    }
}
```

一応補足しておきますと、登録したgroup_concatが使えるのはユーザ関数を追加したPDOオブジェクトだけです。

SQLite3.5.4以降では登録処理をスキップしているので、元々あるgroup_concatをそのまま残します。
SQLite3.3.7で確認していますが、SQLite2系列でもできるかどうかは調べていません。

([昔自分のサイトで書いたやつ](https://tgws.plus/prog/group_concat/)の再掲です。)
AWSでAPI GatewayのステージにLambdaのエイリアスを対応させた際にハマったこと＆解決方法

# AWSでAPI GatewayのステージにLambdaのエイリアスを対応させた際にハマったこと＆解決方法

本題まで長いです。

## API GatewayのステージにLambdaのエイリアスを対応させる

### API Gatewayのステージとは？

APIをデプロイする際に設定できます。

![APIデプロイ時のステージ設定](https://qiita-image-store.s3.amazonaws.com/0/203323/24e99551-7d79-744c-3556-9ea522deb851.png)


このステージをいい感じに設定することで、開発用と本番用の運用ができます。

例えば、開発用では`Develop`というステージにデプロイし、本番用では`Product`というステージにデプロイすることで、開発者とユーザが使用するAPIを切り替えることができます。

### Lambdaのエイリアスとは？

Lambdaでは任意の状態のスナップショットをバージョンとして発行することができます。
エイリアスとは、特定のバージョンに対して付与する名前のことです。（ポインタと表現されています。）

Gitみたいなモノですね。（考え方はGitで良いと思います。）

* Lambdaのバージョン → Gitのコミットに相当
* Lambdaのエイリアス → Gitのタグに相当

![Lambdaのバージョンとエイリアス](https://qiita-image-store.s3.amazonaws.com/0/203323/e83ae7c0-d9fb-5f9a-ab7c-f370bec54c00.png)



以下のように、Lambdaの設定画面からバージョンとエイリアスを作成することができます。

![Lambdaのバージョンとエイリアスの作成方法](https://qiita-image-store.s3.amazonaws.com/0/203323/dc0584c9-d513-7a5f-4837-47913fe650b1.png)


### 対応させるとは？

`API Gatewayのステージ`と`Lambdaのエイリアス`を対応させることです。

つまり、以下のことが実現できます。

* 開発用のAPI Gateway(ステージ：Develop)から、開発用のLambda(エイリアス：Develop)を実行できる
* 本番用のAPI Gateway(ステージ：Product)から、本番用のLambda(エイリアス：Product)を実行できる

### 対応させる方法

以下を参照してください。

* <http://blog.serverworks.co.jp/tech/2017/02/01/apigateway-lambda-cloudwatchlogs/>
* <https://qiita.com/szk3/items/298dfc8bb86ba802617f>

## 本題：ハマったこと

ようやく本題です。

API Gatewayのステージに`alias`という変数を定義し、実行するLambda関数を以下のように設定します。

![実行するLambda関数の設定](https://qiita-image-store.s3.amazonaws.com/0/203323/f3492d35-73ca-ef41-cdb6-50e7bd1a8d37.png)


設定すると、以下のような画面が表示され、「このコマンドを実行してね」と表示されます。

![実行すべきコマンドが表示される](https://qiita-image-store.s3.amazonaws.com/0/203323/96845201-bf74-9662-bd25-2fd0d3063c3d.png)


このコマンドの`${stageVariables.alias}`の部分は、Lambdaのエイリアスに合わせて変更するため、`TestAPIGateway:Develop`と`TestAPIGateway:Product`にして2回実行します。（今回の例の場合です。Lambdaのエイリアスに合わせてください。）

なお、AWS CLIのインストールと設定は以下を参照してください。

* <http://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html>

ようやくハマったことです。**このコマンドが失敗しました。**

### エラーメッセージ

```
An error occurred (ValidationException) when calling the AddPermission operation: 1 validation error detected: Value ''arn:aws:execute-api:ap-northeast-1:xxxxxxxx:yyyyyyyyyyy/TestAPIGateway'' at 'sourceArn' failed to satisfy constraint: Member must satisfy regular expression pattern: arn:(aws|aws-us-gov):([a-zA-Z0-9\-])+:([a-z]{2}(-gov)?-[a-z]+-\d{1})?:(\d{12})?:(.*)
```


### 原因

`--source-arn`のあとに「'」が含まれているとNGでした。

### 解決方法

コマンドから「'」を取り除いて実行します。

#### NGのコマンド

```
aws lambda add-permission --function-name arn:aws:lambda:ap-northeast-1:xxxxxxxx:function:TestAPIGateway:Develop --source-arn 'arn:aws:execute-api:ap-northeast-1:xxxxxxxx:yyyyyyyyyyy/TestAPIGateway' --principal apigateway.amazonaws.com --statement-id zzzzzzzzzzzzzz --action lambda:InvokeFunction
```

#### OKのコマンド

```
aws lambda add-permission --function-name arn:aws:lambda:ap-northeast-1:xxxxxxxx:function:TestAPIGateway:Develop --source-arn arn:aws:execute-api:ap-northeast-1:xxxxxxxx:yyyyyyyyyyy/TestAPIGateway --principal apigateway.amazonaws.com --statement-id zzzzzzzzzzzzzz --action lambda:InvokeFunction
```

## 最後に

分かってしまえば単純な原因でしたが、解決するまで苦労しました。
同じ症状に遭遇した方の役に立てば幸いです。
Movable Type 7 developer preview (アルファ版)を動かしてみた

Movable Type 7 developer previewが以下のページで公開されているのでインストールして動かしてみました。

https://www.movabletype.jp/beta/

まずはログイン直後のダッシュボード画面です。

![capture1.png](https://qiita-image-store.s3.amazonaws.com/0/42710/ebec2fe6-0db1-5c01-f75d-a295922e9390.png)

デザインが大きく変わっています。

気になるコンテンツタイプの管理機能は、以下のようにメニューに項目が増えて専用の画面が用意されています。

![capture2.png](https://qiita-image-store.s3.amazonaws.com/0/42710/6f652971-f88f-4552-20c6-891a2e95ab10.png)

コンテンツタイプの編集画面はこんな感じです。

![capture3.png](https://qiita-image-store.s3.amazonaws.com/0/42710/3d6665df-a25d-b803-7262-5a3203208251.png)

「Content」のドロップダウンリストから追加したいフィールドのタイプを選択して「Add content field」ボタンをクリックするとフィールドが追加されます。追加されたフィールドの「Setting」をクリックすると以下のように編集用の表示に切り替わります。

![capture4.png](https://qiita-image-store.s3.amazonaws.com/0/42710/af66d9d8-61e5-7180-03a3-c256add772c3.png)

ここで作ったコンテンツタイプをどのように使うかというと、メニューの「Content data」の下に作成したコンテンツタイプが表示され、そこからそのコンテンツタイプに対するデータを管理することができます。記事の方で指定して使うのかと思っていたのですが、まったく別の存在が追加された形になるようです。なんとなくWordPressのカスタム投稿タイプっぽい感じがします。

![capture5.png](https://qiita-image-store.s3.amazonaws.com/0/42710/8155bc64-91c1-e0b6-a6b4-68dd6a417c51.png)

コンテンツタイプには記事のタイトルのような必ず存在する項目というものがないので、一覧画面に表示する項目はすべてDisplay optionで指定する形になっています。とはいえ人間が識別できる名前のようなものがないと困るので、自前でそういったフィールドを用意することになるのではないかと思います。

コンテンツタイプのデータ編集画面はこんな感じです。

![capture6.png](https://qiita-image-store.s3.amazonaws.com/0/42710/81434f9f-7e2b-3a27-fe82-fe63afe4a029.png)

で、こうして作成したコンテンツタイプのデータをサイト上に表示するには、記事と同じようにアーカイプテンプレートを作成したりすることで行います。そのためにアーカイブタイプにコンテンツタイプに対するものが一式追加されています。

たとえば「コンテンツタイプ 月別」のアーカイブテンプレートに以下の内容を記述すると、

```html
<mt:Contents>
<h3>[<$mt:ContentID escape="html"$>] <$mt:ContentDate escape="html"$></h3>

<mt:ContentField unique_id="dbd4aa7823941f9b10cf8d08276781ad1934a69d">
<div>
<$mt:Var name="__value__" escape="html"$>
</div>
</mt:ContentField>

<div>
<mt:ContentField unique_id="e40a1e0c83c9e87dfaf05206cffd23113041992b">
<$mt:Var name="__key__" escape="html"$>: <$mt:Var name="__value__" escape="html"$>
</mt:ContentField>
</div>

<div>
<mt:ContentField unique_id="e4d192e6a8fa2693b0a503edd6c314a26de361a8">
<$mt:AssetURL escape="html"$>
</mt:ContentField>
</div>

<hr />
</mt:Contents>
```

こんなページが生成されます。

![capture7.png](https://qiita-image-store.s3.amazonaws.com/0/42710/ef97f800-a5a8-15b7-cc38-4b937167f431.png)

``mt:ContentField``タグはフィールドタイプによって自動的に挙動が変わります。タイプごとに専用のタグがあった方が分かりやすいような気もしますが、タイプを増やすとそれ用のタグ一式を追加しなければならなくなるということを避けたのかもしれません。
ライブラリの選定の手法1


要件が曖昧だったり複雑になるとライブラリの選定が一気に難しくなる気がする。
方法論を少し考えたい。

## 思想や手法のパターン

* 「もっと早く知っていれば...」とならないための、開発効率を最大化するライブラリとの向き合い方・探し方・使い方
	* http://qiita.com/kentya6/items/731eba21a9802f606044
* 非機能要件 - Wikipedia
	* https://ja.wikipedia.org/wiki/%E9%9D%9E%E6%A9%9F%E8%83%BD%E8%A6%81%E4%BB%B6
* ソフトウェア品質 - Wikipedia
	* https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E5%93%81%E8%B3%AA

## 基準パターン

### 軸

* 依存度
* 責務・守備範囲
* 速度
* コントロールの見た目や機能性
* サポートの安心感
* メンテナンス性
* ベンダー製のコンポーネント故のブラックボックス化
* コンポーネント側に不具合があった場合の対応
* バージョンアップのたびに買い換えが発生するか
* 学習コスト
* 実行環境
	* 言語

### 基準例（採用基準・不採用基準）

* GitHubにリポジトリを持つこと
* Starが100以上ついていること
* 直近1年でコミットがあること
* コミットの頻度が1回/月以上あること
* Issue/Pull requestが放置されていないこと
* ライブラリ依存が少ないこと
* アプリケーション本体と疎結合に導入できること
* ドキュメントが充実していること
* 検索エンジンで情報が十分に収集できること
* 必要としているテストケースにパスしていること

## 現状の考え

* 前提
	* 個人レベル
	* 技術力はそんなに高くない
	* 要件が詰めきれていない
	* 技術の進歩が早い
	* 柔軟性、拡張性が求められる
	* 機能要件や一般基準から逸脱した特性を洗い出してある
* 選定の考え
	* 機能
		* 特に気をつけるべき要件を満たすか
	* 非機能
		* 完全性
		* 保守性
	* コード品質
		* 個人の手に負えるか
		* 理解不足でもバージョン固定すれば済ませられるか
		* セキュリティに懸念はないか
		* ある程度カスタマイズできる（拡張API、シンプルな構造）
		* 責務が小さく代替が考えられる

まとまんね。個別の場合で考えた方がいいかな。。
非機能の品質の検討軸で初期段階で重要視しないものがあるけど、
それを重要視しなかったこととか、あとあと必要になったとかを記録していくといいのかもな。

## 参考

http://konifar.hatenablog.com/entry/2015/05/14/184237
http://www.buildinsider.net/pr/grapecity/wijmo/01
http://qiita.com/kentya6/items/731eba21a9802f606044
Powerlineのインストール on Mac


*at Sierra 10.12.6*

Powerlineについては説明を省略します。Terminalでの表示がカッコよくなるやつです。

一般的なインストール方とか設定は他を見ましょう。Macで引っかかったところを書きます。

## インストール
Powerlineの動作にはv8以降が必要なのでMacVimを入れる

```bash
brew install macvim --with-override-system-vim --with-python3 --with-lua --with-luajit
```


次にPowerlineを入れる

```bash
pip3 install --user powerline-status
```

## MacVim
MacVimはこの時点で起動できるようになっていて `mvim` という別名が切ってある。

普通に `mvim` とするとGUIが起動するけど、`mvim -v`だとCUIで起動する。

めんどいので `.zshrc` で `alias vim='mvim -v'` としてもよいかもしれない。

Powerlineのセットアップをする人ならGUI版は使わないのかもしれないけど、フォントの設定さえすればちゃんとPowerlineがvimのと同じで動きます。


## Powerlineの設定ファイルを読み込み
pipで `--user` を指定するとユーザ領域にインストールしてくれるんですが、それは `~/Library/Python/3.6/lib/python/site-packages/powerline/bindings/` で、以下に各プログラム用のファイルがある。

vimだと

```
set rtp+=~/Library/Python/3.6/lib/python/site-packages/powerline/bindings/vim/
```

tmuxだと

```
source ~/Library/Python/3.6/lib/python/site-packages/powerline/bindings/tmux/powerline.conf
```

zshだと

```
source ~/Library/Python/3.6/lib/python/site-packages/powerline/bindings/zsh/powerline.zsh
```


## 参照
http://raichel.tech/web/vim-powerline
https://qiita.com/macoshita/items/63188395375686cd6e79
npm install gulp-sass でエラー

gulpfile.jsをmacで環境セッティングして、別端末のwindowsで `npm install` したところ、 'gulp-sass' のインストールでこけてハマったのでメモ。

過去のインストーラーを完全にアンインストールできていなかったというケースなので、これで解決できるかは場合によるとおもいます。

## 環境
- windows 7 64bit
- 昔 [node.jsを公式インストーラー](https://nodejs.org/en/) で入れている (node v0.12.0)
- nodeのバージョンをプロジェクトによって変えたくなったので [nodist](https://github.com/marcelklehr/nodist) を採用 (node 6系/7系/8系 などを切り替えながら利用)
- nodist を入れる場合には通常、インストーラーで入れたnodejsはアンインストールしておくべきだがアンインストールがうまくいっていなかった

## 現象
- `node_module` をインストールするために 'npm install' を実行するも、利用している `gulp-sass` のインストールがうまくいかないとエラーがでる
- 個別に `npm install gulp-sass` を打ってもインストールできない
- `nodist` のバージョンをさまざまに切り替えてもエラーは変わらず

![2017-11-08_18h48_01.png](https://qiita-image-store.s3.amazonaws.com/0/94035/2ba3065f-19d6-f05d-6e06-9dca90571a45.png)

## 考察/要因
- nodistでバージョンを切り替えていたけれど、過去に公式インストーラーで入れたものがうまくアンインストールされていなくて、変数が残っていた模様
- `npm config list` で確認してみる  
![2017-11-08_18h33_08.png](https://qiita-image-store.s3.amazonaws.com/0/94035/a28498e9-62fd-6ebe-d6cb-c3629cf0e29e.png)
- nodist によるバージョンを変えても `user-agent = npm/2.5.1 node/v0.12.0 win32 x64` とか `node bin location = C:\Program Files\nodejs\\node.exe` が変化無かった
- nodeのバージョンを変更しているはずなのに `user-agent` が変更されないのが非常にあやしい

## 対処
- `node bin location = C:\Program Files\nodejs\\node.exe` というのがどうも過去の `exe` を参照している風に見えるので思い切ってフォルダを削除(は怖いのでリネーム)  
 ![2017-11-08_18h35_20.png](https://qiita-image-store.s3.amazonaws.com/0/94035/9f851ee0-f3d7-43e0-2c53-1af61de545c8.png)

## 結果
- `user-agent` も `node bin location` も nodist によるバージョン切り替えに合わせて変わるようになった  
![2017-11-08_18h36_43.png](https://qiita-image-store.s3.amazonaws.com/0/94035/5e9e3dcc-eeee-bd3a-f089-f52351395be0.png)
- これにより `npm install gulp-sass` も無事インストールすることができた
【メモ】LaravelでDBマイグレーション時の注意点

#外部キー

**外部キーの参照先のテーブルのキーは主キー(ユニークキーでもOK?)に**
主キーを`increment('id')`ではなく、`integer('id')->unsigned()`にした時に外部キー制約のエラーでマイグレーションが失敗した。インクリメントを使わない場合は、`integer('id')->primary()`にする。

```php
   public function up()
    {
        Schema::create('reservations', function (Blueprint $table) {
            $table->integer('id')->primary();
            //以下省略
        }
    }
```

**参照先のテーブルのマイグレーションファイルを先に作成する**
ファイルが作成された順にマイグレーションが実行されるので、参照先のテーブルのファイルを先に作成しておかないと参照先のidが存在しないことになって外部キーの生成に失敗する

#カラム変更時
カラム名変更などカラムを変更する場合のみ先にdoctrine/dbalをインストールする必要がある
```
composer require doctrine/dbal
```
忘れやすいのでデフォで入れて欲しい。。

その他随時更新。
axiosのパラメータ指定方法まとめ

# 概要
HTTPクライアントの[axios](https://github.com/axios/axios)を使っていて、
パラメータの指定する方法を毎回調べるのが面倒だったのでまとめました。
ほぼREADMEに書いてある内容と同じです。

# GET

## クエリパラメータをつける

直接URLにつける

```js
axios.get('/user?ID=12345');
```

optionに指定する

```js
axios.get('/user', {
  params: {
    // ここにクエリパラメータを指定する
    ID: 12345
  }
});
```

# POST

## json形式で送る

```js
axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
});
```

## application/x-www-form-urlencoded形式で送る

`URLSearchParams` を使う方法

``` js
var params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/foo', params);
```

[`qs`](https://github.com/ljharb/qs) を使う方法

```js
var qs = require('qs');
axios.post('/foo', qs.stringify({ 'bar': 123 }));
```
ちょっとずつ読むドメイン駆動設計 第三部 より深い洞察へ向かうリファクタリング 第九章 暗黙的な概念を明示的にする7 選択・要求

# 仕様(Specification)
[前回](https://qiita.com/YasuhiroKimesawa/items/e6a52bd261727ec0004b)仕様について読んでいくなかで、仕様パターンには、

- [検証](https://qiita.com/YasuhiroKimesawa/items/e6a52bd261727ec0004b#%E6%A4%9C%E8%A8%BC)
- 選択(問い合わせ)
- 要求(生成)

の３つのパターンがあるということでした。検証まで読んだので、選択・要求について読んでいきます。

## 選択(問い合わせ)

コレクションから、一部を選び出すというものですね。

コレクションがメモリ上にあるか、RDB上にあるかというはここでは問いてはないですね。クライアントからはどちらか意識しなくていいように実装するのは[Repository](https://qiita.com/YasuhiroKimesawa/items/713d79b196424103ba62)の章で読んだとおり。

例では、Repositoryに仕様オブジェクトを渡してSQLを返したり、仕様オブジェクトにRepositoryを渡して選択されたコレクションをRepositoryから取得するとかしています。

自分がよく実装しているパターンは選択の条件をまとめた「Criteria」クラスをRepositoryに渡して、インフラストラクチャ層でCriteiraを元にSQLを構成、実行し、コレクションを返すといったことをしています。

SQLを組み立てる支援があるツール（[MyBatis](http://www.mybatis.org/mybatis-3/ja/)など)を利用すれば、容易に実装が可能です。

Criteriaが仕様クラスになる感じですね。

## 要求(生成)

要求は生成時に条件を指定して、条件に従ったオブジェクトを生成するというパターンですね。

書籍の例では、コンテナにどんな化学製品を入れるかによって、別々のコンテナを生成するといった例が上げられています。

こちらも条件をコンテナ自体が持つのではなく、コンテナ仕様クラスが持つということをしていますね。

# コラム：動くプロトタイプを使って開発の停滞を解消する

この章の最後に表題とは無関係ながら、面白いコラムが載っていたのでご紹介。

他のチームの実装を待ったり、ユーザーからのフィードバックを待ったりする停滞を避けるため、インターフェイスを活用して、実装と分けることで、一旦動くプロトタイプを作成しておいて、後からしかるべき実装に置き換えるといったことが紹介されています。

こういうのを活用すればなかなか分離しにくいユースケースやストーリも分割して進められることができますね。
Tips_01:時系列データ分析SARIMAモデル 「seasonal_orderの長さについて」【statsmodels】

# 概要
- SARIMAモデルを用いた、時系列データ分析におけるプログラミング中に起きたエラー
- プログラム初心者の私に起きたので、同じ初心者の方の解決になれば…
- 　SARIMAモデルには、(p,d,q)(P,D,Q,S)といったハイパーパラメータを入れてあげなければならない。総当り法でp,d,q,P,D,Q(Sは24で固定）を求め、最もaicが低いパラメータを採用するプログラムを作った。

# 問題
 len()使えないからだめだよ。長さないよ。って怒られました。

```py3:Error
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-997d8c7cdfa2> in <module>()
      5 SARIMAorder,SARIMAORDER = orderoptimize2(1)
      6 
----> 7 FitSARIMA = TrainSarimaRev2(S_ForecastDF,TrainStartDate,TrainEndDate,SARIMAorder,SARIMAORDER)
      8 ForecastSARIMA = pd.DataFrame(FitSARIMA.forecast(steps=PredictTerm))
      9 

C:\Users\***\Anaconda3\lib\site-packages\statsmodels\tsa\statespace\sarimax.py in __init__(self, endog, exog, order, seasonal_order, trend, measurement_error, time_varying_regression, mle_regression, simple_differencing, enforce_stationarity, enforce_invertibility, hamilton_representation, **kwargs)
    329         else:
    330             self.polynomial_seasonal_ar = np.r_[
--> 331                 1., [0] * self.seasonal_periods * len(seasonal_order[0])
    332             ]
    333             for i in range(len(seasonal_order[0])):

TypeError: object of type 'numpy.int32' has no len()
```


　使用したのは、予め[これ](https://qiita.com/snuow/items/366107cf1d35d1db037e)を使って作った最も低いaicのハイパーパラメータをcsvに格納したものを呼び出して、SARIMAモデルに突っ込むだけの関数です。

```py3:Orderと学習
#SARIMA Order
def orderoptimize(cnt):
    paraDF = pd.read_csv(r'SARIMA_ParameterOptimize.csv',header=None,dtype ='int')
    order = list(paraDF.loc[cnt,0].values.flatten())   
    sorder = list(paraDF.loc[cnt,3:6].values.flatten())
    return order,sorder

#SARIMA Train
def TrainSarimaRev2(df,Start,End,Order,SOrder):
    TrainResultsSARIMA = sm.tsa.statespace.SARIMAX(df.loc[pd.to_datetime(Start):pd.to_datetime(End)],
                                                   enforce_stationarity=False,
                                                   enforce_invertibility=False,
                                                   order=Order,
                                                   seasonal_order=SOrder
                                                  ).fit()
    return TrainResultsSARIMA

```
リストで与えたらええんとちゃうんか。って思ったのに駄目でした。

# 解決策

```py3:改善案
def orderoptimize(cnt):
    paraDF = pd.read_csv(r'SARIMA_ParameterOptimizerev3.csv',header=None,dtype ='int')
    order = [int(paraDF.loc[cnt,0])]
    order.append(int(paraDF.loc[cnt,1]))
    order.append(int(paraDF.loc[cnt,2]))
    sorder = [int(paraDF.loc[cnt,3])]
    sorder.append(int(paraDF.loc[cnt,4]))
    sorder.append(int(paraDF.loc[cnt,5]))
    sorder.append(int(paraDF.loc[cnt,6]))
    return order,sorder
```

あきらめました。

# まとめ

動くけどダサい。
Python使ってるのに、こんなにダサくしてしまった。ごめんよPython
DelphiのFiremonkeyでFizzBuzzをやってみた

#DelphiのFiremonkeyでFizzBuzzをやってみた

ことのほったんはTwitter上でフォロワーさんの @pik さんが[delphiで最小文字数でFizzBuzzを作った](https://twitter.com/pik/status/928129307259441152 )というのを見てなんとなくどう動くのか実際に実行したらコマンドプロンプトが一瞬で消えたのでフォーム上で確認したくなり作ってみた

出来上がりイメージをフォームにて開始と終了の数値を入力できてボタンを押せば実行されて、フォーム画面上で結果を確認できるようなものを想定し作成しました

Delphiなので1つのソースファイルでWinでもMacでも動きます

Win7版スクリーンショット
![Win7_p1.jpg](https://qiita-image-store.s3.amazonaws.com/0/212566/7f145504-eeb0-bfef-1b83-3b4c42613bd9.jpeg)

MacOSX版スクリーンショット
![MacX_p1.png](https://qiita-image-store.s3.amazonaws.com/0/212566/ccd3df84-df00-e459-af07-c2d511dae07a.png)

ソースコード

```delphi:p.pas

unit p;
interface
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.Layouts,
  FMX.Memo, FMX.Edit;
type
  Tf = class(TForm)
    b: TButton;
    L1: TLabel;
    L2: TLabel;
    e1: TEdit;
    e2: TEdit;
    m: TMemo;
    procedure bClick(Sender: TObject);
  private
  public
  end;
var
  f: Tf;
implementation
{$R *.fmx}
procedure Tf.bClick(Sender: TObject);
var
  i: Integer;
  s: String;
begin
  for i := e1.Text.ToInteger to e2.Text.ToInteger do
  begin
    s := '';
    if (i mod 3 = 0) then
    begin
      s := 'Fizz';
    end;
    if (i mod 5 = 0) then
    begin
      s := s + 'Buzz';
    end;
    if (s = '') then
    begin
      s := i.ToString;
    end;
    m.Text := m.Text + s + #13#10;
  end;
end;
end.

```
Rのfilter()関数について

Rで移動平均を計算したい時に便利なのが、filter()関数です。
この関数を使うと、引数で指定した通りに重み付けをして平均してくれますが、パッケージdplyrを読み込んだあとではエラーで使えないことがわかった。

> aaa <- rnorm(100, mean=10, sd=4)
> filter(aaa, c(1,1,1))
 UseMethod("filter_") でエラー: 
   'filter_' をクラス "c('double', 'numeric')" のオブジェクトに適用できるようなメソッドがありません 

なので、dplyrパッケージを一旦detach()でunloadしてから使わなければならないようです。
IntelliJ IDEAでFlashBuilderのプロジェクトをインポートする。

#目次
1. 環境
2. インポート
3. FireFoxのデバッグプレイヤーで確認
4. 参考サイト

#1. 環境
* MacBook Pro 13inch Early 2015
* IntelliJ IDEA 2017.2.5
* FlashBuilder4.7

MacOS を HighSierra にアップグレードしたところ、FlashBuilder4.7が使い物にならなくなったので、
IntelliJ IDEA に乗り換えしました。ただ、今まで作っていたFlashBuilder4.7のプロジェクトをIntelliJ IDEAでも引き続き使いたいので、再度設定はめんどくさいので、インポート機能を使って取り込みたいと思います。

#2. インポート
IntelliJ IDEAのサイトにもFlashBuilderからのインポートの設定の[ヘルプページ](https://www.jetbrains.com/help/idea/importing-adobe-flash-builder-projects.html)がありますので、そちらを元にインポートの手順を説明します。
####1. IntelliJ IDEAの起動画面
プロジェクトのインポートを選択
![スクリーンショット 2017-11-01 09.36.24.png](https://qiita-image-store.s3.amazonaws.com/0/49845/f5fa7b98-28d5-e171-6a03-397038bff21e.png)
プロジェクトフォルダの選択を促されますので、インポートしたいFlashBuilderプロジェクトのあるフォルダを選択し、`Open`をクリック。
####2. プロジェクトのインポート1
`外部モデルからプロジェクトをインポート`を選択し、`FlashBuilder`を選択。次へ。
![スクリーンショット 2017-11-08 17.07.35.png](https://qiita-image-store.s3.amazonaws.com/0/49845/a05a3179-d6fb-e0a1-c78e-d81a2a7fcf52.png)
####3. プロジェクトのインポート2
FlashBuilderで作ったプロジェクトの内容が表示されます。プロジェクトのファイルの場所やプロジェクト名、プロジェクトの保存先に変更がなければそのまま`完了`。`プロジェクト・フォーマット`はとりあえずそのままで使っています。
![スクリーンショット 2017-11-08 18.34.24.png](https://qiita-image-store.s3.amazonaws.com/0/49845/0f7b59f6-c7f7-0471-f773-2daa299c5787.png)
#3. ブラウザのデバッグプレイヤーで確認
そのままデバッグを押すと、FireFoxのウィンドウに` To view this page ensure that Adobe Flash Player version 11.4.0 or greater is installed. `というメッセージが出てしまうことがあります。
これを回避するには、FireFoxのURLに`about:config`と入力し、`動保証対象外`という警告を乗り越え、検索窓に`plug*ht`といれて検索された、設定名`plugins.http_https_only`の項目をダブルクリックして、値を`true`から`false`に変更します。
![スクリーンショット 2017-11-08 18.41.23.png](https://qiita-image-store.s3.amazonaws.com/0/49845/14afc6f0-d2d2-e0c8-b1a4-adae7ca6b1f6.png)
これで再度デバッグを押すことで、FireFoxで確認できるようになると思います。
注意：今回は、FireFoxを`通常使うブラウザ`に設定した状態で試しています。
#4. 参考サイト
[Importing Adobe Flash Builder Projects](https://www.jetbrains.com/help/idea/importing-adobe-flash-builder-projects.html)
Cognos Analytics 11.0.8 新機能 - 地図で緯度・経度サポート

#概要
Cognos Analytics 11.0.8 からレポートの機能の「地図機能」で、緯度・経度のデータが使用できるようになりました。
さっそく動作検証してみましたので共有します。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2e021f2f-5ff3-c89a-f3f4-c8e7195e5524.png)

#手順
Excelでこんなデータを作ってみました。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/88d722ac-1f7e-57f9-0bf1-975b52e2af06.png)

データアップロードします。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/0ab881f8-31f1-3cc0-49ff-773ebe8a8f5b.png)

アップロードしたデータを、データ・モジュールとして取り込み、レポートの機能から、視覚化の「地図」を選択します。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c6d7e42c-4227-b4f5-7074-c4c693e71773.png)

初期状態はこんな表示です。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b3324148-efa7-ec9d-d44a-7fcdfbdc4ad0.png)

「領域」と書いているところをプルダウンすると、以下のような表示になり「緯度/経度」が選べます。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c85c4308-3e5f-8996-93b6-e6e2fec208ed.png)

こんな表示になるので、緯度、経度、ラベル、サイズ、色にそれぞれデータアイテムを配置します。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/20bff614-fb11-4d45-99af-84f2c7c26562.png)

レポート実行画面です。簡単にできました！
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7f7f799f-55f8-5da3-835c-8602cd2dc58c.png)

こんな感じに、日本の上の円にマウスを合わせてみると、先ほど「ラベル」に指定した「City」も表示されます。
「Tokyo」の表示がそれですね。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2652d953-4155-f841-35b4-80e687a9c22a.png)

拡大・縮小もしっかり動きます。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/77d50d9a-8611-95e6-8dd9-6b98421f7e9e.png)

#注意点
・ラベル
ラベルには一個しかデータアイテムを置けませんでした。
複数置けるようになると良いのですが。

・緯度/経度のデータ
WGS 84形式のみがサポートされるそうです。
つまり、緯度は-90～+90、経度は-180～+180の範囲で、±XX.XXXXXXで表されるデータですね。

・範囲外の緯度/経度データ
上記の範囲外のデータの場合、緯度・経度共に0として扱われ、以下のようなアフリカ西方の海上にプロットされるようです。ここにプロットがあったら、データがおかしいという事なので、注意して確認しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/e62bba56-b4fd-e514-ad37-9912574b16f9.png)

#参考情報
**Cognos Analytics 11.0.8: Adding Latitude/Longitude Maps in Reports**
https://www.ibm.com/communities/analytics/cognos-analytics-blog/cognos-analytics-11-0-8-adding-latitudelongitude-maps-in-reports/

**Cognos Analytics 11.0.8の地図機能で領域に複数アイテム置く場合の注意**
https://qiita.com/shinyama/items/db41854fbeb9c9b84642
Unity2017.2のVuforiaをシーンごとに無効化する

##Unity2017.2でのVuforia
Unity2017.2からVuforiaが内蔵され、Player > XR Settingsでチェックを入れるだけで使用できるようになりました（インストールしていない場合には初回に別途ダウンロードが必要）

![vuforia1.PNG](https://qiita-image-store.s3.amazonaws.com/0/31032/8229c02b-889c-308a-b21d-b118892e483d.png)

チュートリアルを読むと、ARCameraを配置するだけでVuforiaのマーカー認識などの機能が使えるようになるので大変便利です。

##Vuforiaを使いたくないシーンでもカメラが有効になってしまう
ところが、ARCameraだけでなく、標準のUnityのCameraを配置したシーンでも、カメラ（PCの場合はWebカメラ）が有効になってしまいます。

![vuforia2.PNG](https://qiita-image-store.s3.amazonaws.com/0/31032/0b6d53fd-d4bb-f425-4e8d-900e7622bab5.png)

これは、Vuforiaがカメラに対して自動的にVuforia Behaviorを始めとしたコンポーネントをアタッチするために起こります。

##回避方法
Vuforiaを使用したくないシーンでは、MainCameraに対して、VuforiaBehaviorスクリプトをアタッチします。（実体はdllになっており、スクリプトファイルは存在しませんが、Add Componentして検索すると見つけられます）

![vuforia3.PNG](https://qiita-image-store.s3.amazonaws.com/0/31032/034415a7-6878-e3fa-a69b-b1b0ff122421.png)

そして、コンポーネントを無効化するためにチェックボックスを外します。

以上です！
メールを送信する際に存在するメールアドレスかどうか判定する

deviseでユーザーをメールアドレスで登録する際に、登録と同時にメールを送信していたのですが、その**メールアドレスが本当に生きているか**確認する必要があったので実装してみました。
参考にしたサイト https://github.com/kurochan/mail-address-checker/blob/master/mail-address-checker.rb
備忘録程度に書いたので、何か質問があればコメント欄に。。。

## 実行環境
* OSX 10.11.6
* Rails 5.0.4
* Ruby 2.3.1
* net-telnet 0.1.1

## コード

```app/controllers/concerns/mail_check.rb
require 'resolv'

module MailCheck
  extend ActiveSupport::Concern
  MY_DOMAIN = 'gmail.com'.freeze
  TIMEOUT = 20

  def mail_check(addr)
    domain = addr.split('@')[1]
    return { exist: false, valid: true, message: 'SMTP Server Not Found' } unless get_exchange(domain)

    begin
      addrs_exist?(get_exchange(domain), addr)
    rescue
      return { exist: false, valid: true, message: "Unknown Error.(Maybe #{addr} Does Not Exists.)" }
    end
  end

  private

  def get_exchange(domain)
    begin
      mx = Resolv::DNS.new.getresource(domain, Resolv::DNS::Resource::IN::MX)
    rescue
      return nil
    end

    mx.exchange.to_s
  end

  def addrs_exist?(domain, addr)
    status = ''
    pop = Net::Telnet.new(Host: domain, Port: 25, Timeout: TIMEOUT, Prompt: /^(2\d{2}|5\d{2})/)
    pop.cmd("helo #{MY_DOMAIN}")
    pop.cmd("mail from:<#{mail_address}>")  # mail_addressには送信元のメールアドレスを入れる
    pop.cmd("rcpt to:<#{addr}>") { |c| status << c }
    pop.cmd('String' => 'quit')
    /^250/ === status
  end
end
```

インスタンスメソッドは`mail_check`です。
コントローラー側で`MailCheck`モジュールを`include`してやり、`mail_check`メソッドの引数にチェックしたいメールアドレスを入れるだけ。
あとは`status`にステータスを含む文字列が入っているので、それを元に判定すればいいだけです。
ドメイン等の設定はプロジェクトの環境に合わせてください。

#### 追記
addrs_exist?メソッドが真偽値を返さないので、修正しています。
なので、addrs_exist?メソッドで判定できます。


## 懸念点
**なぜか存在しないメールアドレスでも、存在するステータスを返すことがある。**
マジで謎です。
ターミナル上のtelnetで上記と同じコマンドを打つと、存在しないメールアドレスのときは5xx系のステータスが吐かれます。
でもgemだとうまくいかない。じゃあ何で書いたんだよって言われてしまえばそこまでなんですが。。。
せっかく作ったので；；；；

## 終わりに
存在しないドメインを渡した場合(@asdfa.jp.comなど)は必ずエラーのステータスが吐かれるので使えるかもです。

後日SMTPライブラリで同じような実装を行ってみます。
アデュ。


## 追記
https://tools.verifyemailaddress.io
↑こんなAPIもあったので使いたかったんですけどね。。。
なにせ１００通までしか使えないので。。。
Kotlinでレイアウトを動的に変更する

#LinearLayoutに動的にViewを追加する
チャットみたいな画面が簡単に作ってみたいと思って、色々調べて、LinearlayoutにViewを追加する方法を理解したので、ノート程度の書いて行きます。

```title:android.xml
<LinearLayout
    android:id="@+id/linear"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/send"
    android:orientation="vertical"/>
```

Linearlayoutをレイアウトファイルに設定しておく。

Kotlinのソースコードの方で、

```title:MainActivity.kt
val layout = findViewById<LinearLayout>(R.id.linear)
val button = findViewById<Button>(R.id.send)

button.setOnClickListener{
    val textView: TextView = TextView(this)
    textView.text = "セットしたいテキスト"
    layout.addView(textView)
}
```

こちらの方法で動的に追加することが可能。
```val layout = findViewById<LinearLayout>(R.id.linear)
```

で、LinearLayoutのlayoutを生成。そこに、引数にView型の引数を取るaddView()メソッドを使用して、動的にViewを追加していくという方法を用いた。


以上が、Layoutに動的にViewを追加していく方法でした。
このほかにもKotlinのソースコードのみで、Linearlayoutを生成する方法もあると思いますが、ここでは割愛します。

何かコメントなどあればお願いいたします。
rails、ストロングパラメーターにおけるネストされた複雑なパラメータの処理

[rails、ストロングパラメーターにおけるネストされた複雑なパラメータの処理](http://u-kan.hatenadiary.jp/entry/2017/11/08/180956)

正確な内容は[公式ドキュメントを参照](http://guides.rubyonrails.org/action_controller_overview.html#more-examples)

## 許可したかったparameter

```
{
  "nickname": "nickname",
  "info1": {
    "key1": "yes",
    "key2": "",
  },
  "info2": {
    "array1": ["aaa"],
    "array2":[]
  }
}
```

素直にkeyだけを列挙するのではエラーになる。
**配列が存在する/ネストが生じている**場合やたらとややこしくなり良く間違えるので注意が必要。

## 配列のpermitの仕方

配列がvalueになっているkeyのpermitは下記の様に行う。

```some_controller.rb

def some_params
  params.permit(:name, {:array => []}
end
```

配列は、strong parameteが許可しているスカラー値ではないので、一旦ハッシュとして定義してあげます。


## ネストが生じている場合

ネストが生じている場合は、ネストしているキーのバリューの中のキー（難しいな）に関しては、配列で定義してあげます。

```
def some_params
  params.permit(:name, array: [:key1, key2])
end
```


## 結論

初めにでてきたjsonを通すストロングパラメータの定義の仕方は次の様になる。

```
def some_params
  params.permit(:name, keys: [
    :nickname,
    {
      info1: [
        :key1, :key2
      ]
    },
    {
      info2: [
        { array1: [] }, { array2: [] },
      ]
    }
  ])
end
```

## まとめ

配列 => ハッシュの中に格納して定義
ハッシュ => 配列に値のキーを格納して定義



ややこしいな。。
IntelliJ IDEAでAIRアプリを書き出す

#目次
1. 環境と経緯
2. プロジェクトの設定画面を開く
3. p12の証明書のパスワードが通らない
4. ビルドでタイムアウトしてしまう
5. p12ファイルの作り方
6. 参考サイト

#1. 環境と経緯
MacBook Pro 13inch Early 2015
IntelliJ IDEA 2017.2.5
AnimateCC 2017

MacOS HighSierraにしてからFlashBuilder4.7が起動はするものの、メニューがアクティブにならない現象が起こったため、IDEをIntelliJ IDEAに変更してAIRアプリをデバッグまでは設定できたものの、ビルド時にいろいろとエラーが出たので、そのあたりの備忘録です。

#2. プロジェクトの設定画面を開く
プロジェクトごとにAIRの設定を行うには、プロジェクト名（ここではTestAIR）を右クリックして、
`モジュール設定を開く`を選択で、`プロジェクト構造`ウィンドウが開きます。
![スクリーンショット 2017-11-02 11.12.58.png](https://qiita-image-store.s3.amazonaws.com/0/49845/8e2cb0eb-0993-9f85-5116-9d8e86597665.png)

#3. p12証明書のパスワードが通らない
AIRアプリを作るときには証明書を作りますが、この指定は、`プロジェクト構造`ウィンドウの`モジュール`の項目からプロジェクト名（ここではTestAIR）の中に`TestAIR(app)`という項目があり、それを選択した後、右側のウィンドウに`AIR Package`タブを選びます。
![スクリーンショット 2017-11-02 11.13.19.png](https://qiita-image-store.s3.amazonaws.com/0/49845/ab549128-2c52-fdb9-c48b-aeed17e94f8a.png)
`Use temporary self-signed certificate`のチェックが入っていますので、このチェックを外します。
![スクリーンショット 2017-11-02 11.13.43.png](https://qiita-image-store.s3.amazonaws.com/0/49845/0a54d650-301a-4c2f-6554-884d38d631bd.png)
`鍵ストア・ファイル`から`...`をクリックして、p12ファイルを選択します。`鍵ストア・タイプ`は`PKCS12`と入力。`キー・エイリアス`と`Provider class`は空でも良さそうです。
#4. ビルドでタイムアウトしてしまう
上記設定を行い、いざビルドを開始したものの、`Could not generate time-stamp: Remote host closed connection during handshake`というエラーがでて、タイムアウトしてしまいます。
あちこちForumを探して見たところ、どうやらタイムスタンプがうまく取得できないよ、的な事らしいので、
先ほどの`AIR Package`の画面に戻り、`TSA`の項目に以下のURLを入れたところ、無事書き出しができました。たぶんFlashBuilderでいうところのタイムスタンプにチェックを外すのと同じ事なのかな？
`http://sha256timestamp.ws.symantec.com/sha256/timestamp`
![スクリーンショット 2017-11-02 11.14.03.png](https://qiita-image-store.s3.amazonaws.com/0/49845/6061db6c-f189-6378-06ce-36eee6e004ab.png)
#5. p12ファイルの作り方
今まで共通で使っていたp12ファイルが何故かパスワードが通らなくなったので、新しく作り直すことにしました。`AnimateCC`を起動して、新規AIRドキュメントを作って、AIR設定から新しくp12ファイルを作りました。
![スクリーンショット 2017-11-08 17.57.35.png](https://qiita-image-store.s3.amazonaws.com/0/49845/d5518a66-bb00-b76e-466c-280599a24200.png)
#6. 参考サイト
[Packaging error: Could not generate timestamp](https://forums.adobe.com/thread/2218793)
Vue.jsで自作のプラグインを作ってみる

Vue.jsでプラグインを作ってみたくなったので、それの作り方を調べました。（Vue.js 2.0以上です）

本記事では、カスタムディレクティブを与えた要素にイベント付与するところが参考になるかと思います。

以下の仕様を満たすプラグインを作るやり方を示していきます。

- v-qiita-clickというカスタムディレクティブをプロジェクト全体で利用できる
- そのディレクティグを与えた要素をクリックすると console.log('qiita!!')と出力される。

[参考: カスタムディレクティブとは](https://jp.vuejs.org/v2/guide/custom-directive.html)

versionについては、この記事の執筆時のlatestのversionを想定しています。

# 手順

プロジェクトの作成 ~ プラグインの利用までを示します。

## プロジェクトの作成

vue-cliを使うと簡単なので、利用しましょう。

[vue-cli](https://github.com/vuejs/vue-cli)

```
$ npm install -g vue-cli
$ vue init webpack my-project # my-projectの部分は自分のプロジェクト名
```

以降、このプロジェクト名をmy-projectとして扱います。

## プラグインとなるファイルの作成

次にプロジェクトのrootに移動します。

```
$ cd my-project
```

`src` というフォルダがありますが、こちらはプロジェクトのソースコードです。

src以下に、今回のプラグインの実装を持つファイルを作成します。
ファイル名は、 `qiita-click.js` としましょう。

src以下の構成は以下のようになったと思います。

```
src
 - main.js
 - qiita-click.js
 - assets/
 - App.vue
```

では、 `qiita-click.js` にプラグインの記述をしていきます。

```js
const VueQiitaClick = {
  install (Vue, options) {
    Vue.directive('qiita-click', {
      bind: (el) => {
        el.addEventListener('click', click, false)
      }
    })

    const click = () => {
      console.log('qiita!!')
    }
  }
}

export default VueQiitaClick
```

これで、プラグインを利用できる状況になりました。

## プラグインの利用

先ほど作成した、プラグインを利用する方法ですが、

`main.js`
で `qiita-click.js` を読み込み、 useというグローバルメソッドで呼び出します。

```js
import VueQiitaClick from './qiita-click'

Vue.use(VueQiitaClick)

```


あとは、 `.vue` のほうで利用する方法です。以下のように `v-qiita-click` をdivタグ等任意のタグに追加します。

```
<div v-qiita-click>divテスト</div>
```


これを実行してみると、 「divテスト」 という要素をクリックすると、console上で意図した出力が確認できると思います。

# 参考

[Vue plugin](https://jp.vuejs.org/v2/guide/plugins.html)
Qiitaのフィードから特定キーワードが含まれた投稿を非表示にするユーザースクリプト




# 2017/11/27追記
Qiita新デザイン（ベータ版）ではトレンドや新着一覧内に本文情報を持たなくなっているので、恐らくですが、このスクリプトは使い物にならなくなっていると思います。

# はじめに
Qiitaのフィードから、ユーザが任意で指定した特定キーワードが含まれた投稿を非表示にするユーザスクリプトです。
@khsk さんの [Qiitaのフィードから特定ユーザーの投稿を非表示にするユーザースクリプト](https://qiita.com/khsk/items/392ec147c4962caed9ca) を参考にして作成させていただきました。ありがとうございます。

# 動作検証環境
Google Chrome 61.0.3163.100
Tampermonkey 4.4

参考にさせていただいたスクリプトがgreasemonkeyで検証されているので、恐らくそちらでも動くとは思います。

# コード

```js:特定キーワード非表示スクリプト

// ==UserScript==
// @name        Qiita keyword filter for feed
// @namespace   real_yaruo
// @description フィードから特定キーワードが含まれた投稿を非表示にする
// @include     http://qiita.com/
// @include     https://qiita.com/
// @include     http://qiita.com/items
// @include     https://qiita.com/items
// @include     http://qiita.com/stock
// @include     https://qiita.com/stock
// @include     http://qiita.com/mine
// @include     https://qiita.com/mine
// @version     1
// @grant       none
// ==/UserScript==


console.time('keywordfilter');

// フィードから非表示にしたいキーワードを以下に追加する
var NG_KEYWORDS = [
    '',
];

// 変更を監視する。追加分だけには対応しておらず、毎回全チェック。
var mo = new MutationObserver(function(data1, data2) {
  var posts = document.querySelectorAll('div.item-body > p');
  Array.prototype.forEach.call(posts,function(post){
    if (post.innerHTML.indexOf(NG_KEYWORDS) != -1) {
      post.parentNode.parentNode.parentNode.parentNode.parentNode.style.display = 'none';
    }
  });
});

var items = document.getElementsByClassName('col-sm-9')[0];
var options = {childList: true, subtree:true};
mo.observe(items, options);

console.timeEnd('keywordfilter');

```

# おわりに
Qiitaのフィード機能には自分がフォローしているタグが紐付いた記事が新着順に表示されますが、稀に宣伝目的なのか単に理解していないだけなのかよく分かりませんが、タグと全然関連しない内容の記事だったり、利用規約をちゃんと読んでいない（と思われる）教えてクンの記事が表示されることがあり、精神衛生上あまり宜しくないケースがあります（タイトルで見て分かればまだ楽なのですが）。

後者の場合、都度都度外部の質問サイトを案内して誘導されている有志の方には本当に頭が下がる思いですが、そもそも目に触れない機能も必要としている人もきっといるよなぁと思い、@khsk さんの[記事](https://qiita.com/khsk/items/392ec147c4962caed9ca)を参考にこのスクリプトを作成させていただきました。

質問を投げて回答を基に記事を再利用できるFAQとして昇華してくれるのであればまだマシで（ただそういう人は最初から質問サイトに行く）、実際は欲しい答えを貰った途端に出来ましたの返信だけ、下手するとその返信すらなくそのままドロン、というケースの方が圧倒的に多いと思われます。
私個人としても、昔利用していたマイナー言語のフォーラムが、ルールを守らない教えてクンに誰かが餌をあげたがばかりに、教えてクンが好き放題し、その結果人が離れて過疎っていったという苦い思い出があります。その時に悪貨は良貨を駆逐するというのはホントなんだなぁと強く実感しました。
個人的には初心者ウェルカムですし、人に教えるのも好きなのですが、それとルールを守らないというのはまた全然別の話ですし。

他のユーザが任意にタグの付け外しが出来るのであれば（編集リクエストは出来るようです）、質問用のタグを用意してそちらに~~隔離~~まとめる手段もあるとは思うのですが、現状ではこのようにキーワードで除外するのがモアベターかと思います。

このスクリプトが皆様の満足したQiitaライフに少しでも役立てれば幸いです。
プログラミング初心者、UIデザインに興味を持つ

　先月からプログラミングを勉強し始めて、なんとなくWebサイトを周遊しているうちに"ゆーざーいんたーふぇいす"なるものに興味が向いた。

　そんな感じで気持ちに勢いのあるうちに調べたことと考えたことをまとめておく記事。



# UIが優れている必要性はあるか
　まず、UIっていうとこう、コンピュータ上で実際に人が操作するための画面とか、機材の操作盤とかそういうのを示す言葉という認識で書く。UIのなかにはGUIやCUIといったものがあって、というそのへんの説明は割愛。
　
### ゲームにおいて妥協されるGUI
　ゲーム好きの私にとって「このゲームのUI（GUI）はクソ」みたいなのはときたま耳にする話。具体的なクソの内容というと、セーブデータを保存しようとするとセーブできる画面と同じ画面にそっけない「タイトルに戻る（データを保存しない）」というコマンドがあってセーブしようとするたびにヒヤッとするとか、そんな感じ。特に古いゲーム。

　ただゲームというコンテンツの場合、よっっっぽど不便でない限りGUIひとつでゲームの良し悪しが別れることはない。

　べつに私も楽しくゲームやってるなかで何度もヒヤッとしたくはないし、優れたGUIであることに越したことはないが、GUIがクソだからといって買ったばかりのゲームをすぐに売り飛ばした経験はない。

　それがなぜかといえば、ゲームのプレイヤーはアプリケーション（ゲーム）を操作することそのものに時間やお金を費やして楽しんでいるからだと私は考えている。その楽しい体験さえ阻害しなければ、ゲームにおいてのUI（GUI）は、多少快適性に問題があっても特に気に留められることがないように感じる。


### UIが重視される場所

　だがゲームとは違って、Webサイトや各種サービスの場合は文字や画像などのコンテンツの見やすさやアクセスの容易さ、不自由のない操作や動作などの要素からなる__利用しやすさ__というのはユーザーからとても重視されているものである。

　その利用しやすさを改善しようとするとき、工夫しなければいけないのが__UI__となる。UIを蔑ろにしているWebサイトやアプリケーションならば、ユーザーが目的のコンテンツを見つけられず、利用しづらいサービスであるとして早々に見切りをつけてしまう可能性が高い。

　Web上を周遊する多くのユーザーはどこかのWebサイトやサービスを利用しようというとき、たとえば最新のニュース記事を読みたいとか、情報を手軽にシェアしたいとか、サービスを利用した先に得られるものを求めていて、その目的に合致したサイトやサービスを探して利用し始めるものだと思う。

　という前提であれば、まずそのユーザーの目的が達成できるサイトやサービスであることというのは利用時の最低条件になる。だが、その目的を達成しやすいサイトかどうか、似たようなサービスと比べてどちらが使いやすいか、好みか（または如何に好みに設定できるか）、というのは実際に利用するユーザーが判断する。

　そこでWebサイト・サービスがより多くの利用者を獲得するためには、デザインやUIを工夫し、少しでも多くの人にストレスフリーな利用しやすさを実感してもらうということが大切になる。



# 見やすいUIってなんじゃろな

　で、UIって大事なんだなーと思ったわけだけど、結局見やすい、使いやすいUIっていうのは具体的になんぞやと。

　私は同じようなコンテンツを扱えるサービスをたくさん使っているわけではないし、普段使っているサービスの利用しやすささえもたぶん言語化できないぞ…と気づいた。

　おーけー、ぐーぐる。そんな感じでたどり着いたディスワン。　↓

[UX思考を学ぶ。UIデザインパターン全28選 \| UIUX JAPAN](https://ohako-inc.jp/uiux-japan/ui-design/201410-ui_design_patterns.html)

　項目ごとに問題点と解決策が示されているのと、実際に工夫されてるサイトの画像が載っけられてるのはすごい参考になる。

　いずれのサイトも、徐々に蓄積されたフィードバックを得てなんやかんやあってこういう仕様になりましたーというような過程が結構面白そう。



# 思ったこととか

　今回の記事と直接関係していることではないけど、普段使うサイトの利用しやすさについて明文化できないかなーと考えていたときに思ったこと。

　自分、割と利用しにくいサービスでもなんとなく惰性で利用し続けてたり、本来の用途に適さないソフトウェアを長時間かけて使ってたりするなぁということ。

　今までそんな無駄の多い作業に時間を費やしてきたことってきっと多いと思います。些細なことでも効率化を念頭に置いて取り組んでみるというのは今後プログラミングを学んでいくにも大切にしていきたいことなので、まずは普段作業しているなかでの「無駄に気づく」ことが大事になるかなぁと思いました。