OmniAICreator/Qiita-1.07M huggingface dataset:
Python > zip(*list4) > 行列の変換 > リストやタプルの引数展開 / 辞書引数展開 / ローカル変数辞書 locals()

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

関連 http://qiita.com/7of9/items/d7bc7038a697adb214ee#comment-1a85846225c5085f851a

```test_python_170323.py
list4 = [
	[ 1, 2, 3],
	[ 4, 5, 6],
	[ 7, 8, 9]
]

for cols in zip(*list4):
	print(cols)
```

```
$ python test_python_170323.py 
(1, 4, 7)
(2, 5, 8)
(3, 6, 9)
```

行と列が変換されているように思われる。

何を行っているのだろうか。

http://www.madopro.net/entry/2016/12/21/134846
> 注目すべきは zip(*pair)の部分です。zipの引数の前にアスタリスクがついています。
関数呼び出しの引数の前についているアスタリスクは、[公式ドキュメント](http://docs.python.jp/3.5/reference/expressions.html#calls
)にもあるように展開されて解釈されます。

上記のzip(*list4)は以下と同じになるのだろう。

```
for cols in zip((1,2,3),(4,5,6),(7,8,9)):
	print(cols)
```

```
>>> help(zip)
zip(...)
    zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]
    
    Return a list of tuples, where each tuple contains the i-th element
    from each of the argument sequences.  The returned list is truncated
    in length to the length of the shortest argument sequence.
```

を見ると、展開された結果の`(1,2,3),(4,5,6),(7,8,9)`において、i-th element（例: (i==0)の時は(1,4,7)のセット)がtupleとなる。

結果として、行列の変換のような機能になる。

## 教えていただいた事項

@shiracamus さんの[コメント](http://qiita.com/7of9/items/e23bdd6e8d4d7997104a/#comment-3cd011185d0632437f24)において、以下の事項を教えていただきました。

- リストやタプルの引数展開 (*)
- 辞書引数展開 (**)
- ローカル変数辞書 (locals())
  + locals()は過去にコメントで教えていただいていました (まだ身についてません)
laravel-mix@^0.8.8 で、 Sass が minify できない時は 0.9 以上にアップデートする

これで半日潰した。

# 状況

Laravel Mix を使っていて、高速化のため

```
  mix.options({
    processCssUrls: false,
  })
```

としている。

`resolve-url-loader` が遅すぎるためだ。
これは随所で指摘されていて、現状では定番の解決策となっている。

- https://github.com/JeffreyWay/laravel-mix/issues/49
- https://github.com/JeffreyWay/laravel-mix/issues/232

が、このせいで別のバグを踏んでしまった。
Sass が minify できなくなってしまったのだ。

# 解決策

下記の Issue で報告 & コミットで修正されているので、

- https://github.com/JeffreyWay/laravel-mix/issues/477
- https://github.com/JeffreyWay/laravel-mix/pull/471/files

laravel-mix のバージョンを上げれば解決する。

```diff:package.json
@@ -17,7 +17,8 @@
     "fullcalendar": "2.9.1",
     "jquery-ui-dist": "1.12.1",
     "jquery.cookie": "1.4.1",
-    "laravel-mix": "^0.8.8",
+    "laravel-mix": "^0.9.0",
     "materialize-css": "0.97.6",
     "materialnote": "1.2.1",
     "slick-carousel": "1.6.0",
```

# 治すまで

このオプションが関係しているとは想像つかなかった・・・

STEP 1.

`laravel mix sass minify not working` とかでひたすらググる。

→ laravel elixir の情報ばっかり出てくる。見つからず断念。

STEP 2.

色々オプション付けたり、 `mix.minify(file)` とかやってみた。けど無理。

STEP 3.

`composer create-project` で適当なプロジェクトを作って、 
関係あるファイルだけ移し、正常に minify できることを確認

STEP 4.

`3.` に色々追加していき、 `webpack.mix.js` をいじっていくと
processCssUrlオプションを無効にしている時だけ minify されないことに気づいた。

そこで、 `processCssUrls: false minify` でググってビンゴ。


最初から最新バージョンにしてみるべきだった。
ただLaravel5.4入れた時点では `laravel-mix@0.8.3` になってるんだよな・・・
`git rebase -i` でコミットをまとめる心意気

なかなか覚えられないので…。
汚いログが許されるのは小学生まで。

# 例

## バリバリ`feature/A`の実装をするぞ！
```shell-session
date > date.md ; git commit -am "WIP: feature/A"
date > date.md ; git commit -am "WIP: feature/A hoge"
date > date.md ; git commit -am "WIP: feature/A moge"
```

## コミットログ
```shell-session
git log --oneline
aa85fbe WIP: feature/A moge
db0645b WIP: feature/A hoge
464b054 WIP: feature/A
37c47c6 作業前のコミット
```

## これをまとめたい

「作業前のコミット」以後をまとめたいとする。
rebaseには「作業前のコミット」のhashを指定する。

```shell-session
git rebase -i 37c47c6
```

```
pick 464b054 WIP: feature/A
pick db0645b WIP: feature/A hoge
pick aa85fbe WIP: feature/A moge

# Rebase 37c47c6..aa85fbe onto 37c47c6 (3 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
```

上から古い順にcommitが並ぶ。
一番古いcommitに全部まとめます。

```
pick 464b054 WIP: feature/A
s db0645b WIP: feature/A hoge
s aa85fbe WIP: feature/A moge
```

一番古いcommitにまとめたいので sにします。
`meld into previous commit`という英語はわかりやすい。

コミットログの編集になるので、以下のようにする。

```
feature/A
```

まとまった。

```
commit b0e4523f24f48b84eccf41f4f024cf723a202a42
Author: kaibadash
Date:   Thu Mar 23 14:52:40 2017 +0900

    feature/A
```
Visual Studio 2017からSQL Server Express 2016 LocalDBを使ってみる

Visual Studio 2017からSQL Server Express 2016 LocalDBを使ってみました。
データベースを作成して新規にテーブルを追加しデータを登録するまでやってみました。

#環境
Windows 7 Professional SP1 64bit
Visual Studio 2017 Community

※今回はWindows7で問題なく動作しましたが、SQL Server 2016からWindows7はサポート外となったようです。
https://docs.microsoft.com/ja-jp/sql/sql-server/install/hardware-and-software-requirements-for-installing-sql-server

#SQL Server LocalDBとは
LocalDBは、SQL Serverを利用したアプリケーションを開発するとき、面倒な設定なしに使えるデータベースのようです。

詳細は以下のサイトを参考にしてください。

使わなきゃ損！ SQL Serverの新たな開発ツール「SQL Server Data Tools」
https://codezine.jp/article/detail/6531

SQL Server Compactの代わりにアプリケーションに組み込んで使うことができるようです。
Sqliteみたいな使い方ができるということなのかな？

LocalDB をどう考えますか？どう捉えていますか？
https://social.msdn.microsoft.com/Forums/ja-JP/82afff90-bea5-4987-9f4d-857a3c75fc4c/localdb-?forum=sqlserverja

#LocalDBをインストール
Visaul Studioのインストーラーで「SQL Server Data Tools」と「SQL Server Express 2016 LocalDB」がインストールされていれば使えるようです。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/71271ca9-ef13-47fa-f93d-42660a88f080.png)

#データベース作成
Visaul StudioからSQL Serverオブジェクトエクスプローラーを表示します。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/f2c5f4fb-503e-a11c-e699-9e5d371250f6.png)

少しするとLocalDB((localdb)\ProjectsV13 ...)が表示されるのでデータベースを右クリックして「新しいデータベースの追加」を選択します。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/6a5dceef-705d-1bf9-d5c4-f0b14450caf3.png)

ダイアログが表示されるのでデータベース名とデータベースを保存するフォルダを指定します。（フォルダは事前に作成しておく）

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/3fc9a1d2-01f1-50e8-05df-f5dd1f35c0a7.png)

Sampleデータベースが作成されます。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/9ebe83e4-027b-e4b6-5995-f617365df350.png)

#テーブル作成
作成したデータベースからテーブルを右クリックして「新しいテーブルの追加...」を選択します。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/e699f8c9-dd6f-fd9a-2832-78856daff7e2.png)

Customerテーブルを作成します。Id列はプロパティからIDENTITYの指定(自動採番)をTrueに変更しています。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/24e72e03-6ffe-4049-90f5-983f120974f7.png)

左上にある更新を押します。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/73d4fe3a-0178-b06d-5694-8c2c61c764a9.png)

ダイアログが表示されたらデータベースの更新を押します。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/269f29dc-faf5-f0d8-cbb0-e4ec03c3a0a2.png)

Customerテーブルがデータベースに登録されます。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/f17d69fb-07d7-ad25-30be-116b3a9ec9f9.png)

#データ登録
Customerテーブルを右クリックして「データの表示」を選択します。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/1c11153c-0351-d732-972c-47993fe956bf.png)

データを入力するとそのままテーブルが更新されます。Id列は自動採番されます。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/1277a02e-c5cc-9c2a-68f0-39ef22bf43a7.png)

#まとめ
ほとんどの操作をVisual StudioのSQL Serverオブジェクトエクスプローラーからできそうです。

SQL Serverデータベースプロジェクトを作成して本番環境のデータベースと比較したり変更を反映するなどできるようです。機会があれば試してみたいと思います。

今回作成したデータベースを使ってアプリケーションを開発してみましたので、そちらも参考にしてみてください。
http://qiita.com/akabei/items/3412ed032ca325c168a0
Android emulator へのコピペ

入力フィールドにフォーカスあてて

```
$ adb shell input text 'コピペしたいtext'
```

---
`.bashrc` に関数作ってもう少し楽に

```
# adb shell input text
adbpaste() {
    adb shell input text "$(echo -n "$1")"
}
```

```
$ adbpaste コピペしたいtext
```

*cmd + v で貼り付けたい...*
XAMLのデザイン画面からイベント定義に移動できない(Ensure Event Failed)

開発ツール：Visual Studio、言語：C#、プロジェクト：WPFアプリケーション

ウィンドウに適当なコントロールを作成し、イベントを追加した。

```
<TextBox x:Name="TextBox1" (略) KeyDown="TextBox_KeyDown"/>
```

普通なら「TextBox_KeyDown」の部分にカーソルを移動させて「F12」キーを押すとイベントの定義に移動する。

```
private void TextBox_KeyDown(object sender, KeyRoutedEventArgs e)
{
}
```

はずなのだが「Ensure Event Failed」というエラーが出て移動できなかった。
とりあえず「Ensure Event Failed」で調べてみたところStack Overflowに同じような質問があった。
http://stackoverflow.com/questions/33094622/ensure-event-failed-error-occur

このQ&AのケースだとXAMLファイルに「x:Class」が無いですよ、ということだった。
「x:Class」属性とはXAMLファイルとクラスを結合させるために必要で、通常であればMainWindow.xamlファイルを作成すると<Window>要素に「x:Class="APP名.MainWindow"」が追加されている。
自分のソースを確認してみるとなぜか「x:Class=" APP名.MainWindow"」という感じで余計な半角スペースが一つ入っており、それが原因で該当のクラスが無い、と判断されていたらしい。
実際に半角スペースを削除して「x:Class="APP名.MainWindow"」とすると問題なくコードに移動することができた。

なぜ半角スペースが入っていたかについては、謎。
今までは大丈夫だったのかな？とも思うが例えばすでにイベントが追加された後で「x:Class=" APP名.MainWindow"」みたいになった場合、「F12」キーで移動できないだけでビルドエラーにはならないので特に問題はなかったのかもしれない。
EC-CUBE 3.1-αの拡張機構を試してみる

3/15、16に、EC-CUBE 3.1-αの方針説明会が開催されました。

資料は以下で公開されていますが、当日ライブコーディングでデモした内容は含まれていないので、こちらでも紹介したいと思います。

[EC-CUBE3.1開発方針説明会資料](https://www.slideshare.net/ec-cube-official/clipboards/201703_ec-cube3-1)

大きな方針としては、学習コストの低減とカスタマイズ性の向上の2点。
3.0での課題やフィードバックに対応していく予定です。

GitHubの、主要なissueやpull requestには、milestone:3.1、label：experimentalが振られていますので参考にしてください。

https://github.com/EC-CUBE/ec-cube/issues?utf8=%E2%9C%93&q=is%3Aopen%20label%3Aexperimental%20milestone%3A3.1.0%20

## 3.1-αのインストール

3.1-αは、experimental/3.1というブランチで開発が進められています。
パッケージ版は公開されていないため、GitHubからcloneしてくる必要があります。

```shell-session
// githubからclone
git clone --branch=experimental/3.1 https://github.com/EC-CUBE/ec-cube.git

// コマンドラインインストーラからインストール
cd ec-cube
php eccube_install.php sqlite
```

## アノテーションでのルーティング制御

ここから、当日デモした内容です。
phpのビルトインサーバを立ち上げてれば簡単に動作確認を行うことができます。

```shell-session
// ビルトインサーバを立ち上げる
php -S localhost:8081 -t ./
```

3.1からルーティングの制御を`アノテーション`という仕組みで行うことができるようになりました。
試してみるには、`app/Acme/Controller`ディレクトリに、コントローラのクラスを配置します。

```php:app/Acme/Controller/HogeController.php
<?php

namespace Acme\Controller;

use Eccube\Application;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class HogeController
{
    /**
     * @Route("/hoge")
     */
    public function index(Application $app)
    {
        return "hoge";
    }
}
```

http://localhost:8081/index_dev.php/hoge にアクセスし、`hoge`という文字列が表示されていれば成功です。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/72858/cad18316-63c2-316a-6bdd-c9e4d1e4fc3f.png)

既存のルーティングを上書きすることもできます。

```php
    /**
     * @Route("/")
     */
    public function index(Application $app)
    {
        return "hoge";
    }
```

http://localhost:8081/index_dev.php/ にアクセスすると、トップページから、hogeという文字列が表示されるように変わっているはずです。

![図2.png](https://qiita-image-store.s3.amazonaws.com/0/72858/7bb45f95-51cc-4163-2a2f-ef2b483e109c.png)

## どう変わったか

3.0では、コントローラを新たに追加する際には

- コントローラのクラスを追加する
- `src/Eccube/ControllerProvider/Front(Admin)ControllerProvider.php`にルーティングの定義を追加する

を行う必要がありました。

また、コアコードに手を入れずに拡張するには、プラグイン機構を利用し、プラグイン関連のファイルを設置する必要があり、非常に手間のかかるものでした。

3.1ではアノテーションを利用できるようになり、だいぶ簡略化されているのがわかるかと思います。

また、[購入フローのコントローラ](https://github.com/EC-CUBE/ec-cube/blob/3.1.0-alpha/src/Eccube/Controller/ShoppingController.php)を参照いただければわかりますが、コントローラ内のメソッドが、細かな粒度に分割されています。これにより、処理の一部の振る舞いを変更する、といったことも可能になります。

## 利用できるアノテーション

`@Route`アノテーション以外にも、以下のアノテーションが利用できます。

- `@Route`
- `@Method`
- `@Template`
- `@Security`

それぞれのアノテーションの利用方法は、`app/Acme/Controller`以下にサンプルを作成していますので、参考にしてみてください。

https://github.com/EC-CUBE/ec-cube/tree/3.1.0-alpha/app/Acme/Controller
JetBrains Toolboxについて

JetBrains Toolboxを紹介します。

#JetBrains Toolboxとは
JetBrains Toolboxとは、JetBrains製品本体やプロジェクトを管理するソフトウェアです。
複数のJetBrains製品 (及びそのプロジェクト) を一括して管理できるというのが利点になります。

#インストール方法
1. [JetBrains Toolbox App: A control panel for your tools and projects](https://www.jetbrains.com/toolbox/app/)からJetBrains Toolboxをダウンロードします。
2. ダウンロードしたファイルを実行します。<br>※Linuxでは圧縮ファイルをダウンロードする形になるため、解凍が必要となります。

#JetBrains製品に関して
学生はJetBrains製品のUltimate(有料版)を無料で使うことができます(詳しくは[Free for students: Professional developer tools from JetBrains](https://www.jetbrains.com/student/)をご覧ください)。
【Django】postfixを使ってメールを送信する設定

## postfixのインストール
### sendmailの停止
```
$ sudo service sendmail stop
Shutting down sm-client:                                   [  OK  ]
Shutting down sendmail:                                    [  OK  ]
```

### postfixのインストール
```
$ sudo yum install postfix
```

以下でバージョン確認

```
$ postconf  mail_version
mail_version = 2.6.6
```
今回は2.6.6が入った


### MTA切り替え設定、自動起動の設定
```
$ sudo alternatives --config mta

2 プログラムがあり 'mta' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.sendmail
   2           /usr/sbin/sendmail.postfix

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します
```
2を入力し、postfixに切り替える


```
$ sudo chkconfig sendmail off
$ chkconfig --list sendmail
sendmail       	0:off	1:off	2:off	3:off	4:off	5:off	6:off
$ sudo chkconfig --add postfix
$ sudo chkconfig postfix on
$ chkconfig --list postfix
postfix        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```

sendmailを自動起動無効、postfixを自動起動有効にする

### メール送信のテスト
```
$ sendmail foo@foo.co.jp
From:bar@bar.com
To:foo@foo.co.jp
Subject:テスト送信
テスト送信です
.
```
foo@foo.co.jpにメールが送信されているかを確認する
仮に`postdrop: warning: unable to look up public/pickup: No such file or directory`といったエラーが出た場合は下記で対処

```
$ sudo service postfix restart
Shutting down postfix:                                     [FAILED]
Starting postfix:                                          [  OK  ]
```
<br>
## Djangoの設定
setting.pyの中で以下を追記する

```python:setting.py
....
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 25
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = False
DEFAULT_FROM_EMAIL = '送信者名 <test@example.com>'
....
```
<br>
## /etc/postfix/main.cfの編集
```
$ sudo vi /etc/postfix/main.cf
```

下記を追記する

```
myhostname = mybox.example.com
mydestination = localhost.server.com, localhost, example.com
```

example.comの部分は送信メールアドレスのドメイン名を記載する

## 参考
[Postfixをインストールしてメール送信してみる | 本日も乙](http://blog.jicoman.info/2013/08/postfix_install/)
[python - How do you configure Django to send mail through Postfix? - Stack Overflow](http://stackoverflow.com/questions/26333009/how-do-you-configure-django-to-send-mail-through-postfix)
SharePoint Client Object Model でサイトやサイトコレクションのモダンUIを無効化するコード

# サイト単位で無効化
```javascript
// モダンUI無効化サイト機能のIDを指定
var featId4Web  = "{52E14B6F-B1BB-4969-B89B-C4FAA56745EF}"; // SPListNextWebOptOut for Web

// コンテキスト取得
var custCtx = new SP.ClientContext();

// 対象の機能(Feature)を追加(Activate)予約
var feat4Web  = custCtx.get_web().get_features().add(new SP.Guid(featId4Web), true, SP.FeatureDefinitionScope.none);

// 機能(Feature) オブジェクト取得予約
custCtx.load(feat4Web,'DisplayName');

// サーバーへのクエリー実行（ここまでのコンテキストに含まれる指示予約を送信）custCtx.executeQueryAsync(
	function() { // クエリー実行時コールバック処理
		// 追加した機能（Feature）の名前をコンソールに出力
		console.log(feat4Web.get_displayName() + " activated.");
	},
	function(sender, args) { // クエリー失敗時コールバック処理
        	console.error('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
	}
); 
```
# サイトコレクション単位で無効化
```javascript
// モダンUI無効化サイトコレクション機能のIDを指定
var featId4Site = "{E3540C7D-6BEA-403C-A224-1A12EAFEE4C4}"; // SPListNextSiteOptOut for Site

// コンテキスト取得
var custCtx = new SP.ClientContext();

// 対象の機能(Feature)を追加(Activate)予約
var feat4Site = custCtx.get_site().get_features().add(new SP.Guid(featId4Site), true, SP.FeatureDefinitionScope.none);

// 機能(Feature) オブジェクト取得予約
custCtx.load(feat4Site,'DisplayName');

// サーバーへのクエリー実行（ここまでのコンテキストに含まれる指示予約を送信）custCtx.executeQueryAsync(
	function() { // クエリー実行時コールバック処理
		// 追加した機能（Feature）の名前をコンソールに出力
		console.log(feat4Site.get_displayName() + " activated.");
	},
	function(sender, args) { // クエリー失敗時コールバック処理
        	console.error('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
	}
); 
```
macでlineアプリの起動とログイン

# 概要

Macでlineアプリを起動させるときに，毎回パスワード入力がめんどくさいのとよく間違うので
一発でできるようにしました．

記載したスクリプトをline.jsっていうファイルに保存して

```shell-session
osascript -l JavaScript line.js
```

ってやれば動きます．

あと，セキュリティとプライバシーの設定で，lineのアプリにコンピュータ制御を許可しておく必要があります．

```js
var app = Application('LINE');
app.activate();

delay(1);

var ui = Application("System Events").processes[app.name()];

var mail     = ui.uiElements()[0].uiElements()[0];
var password = ui.uiElements()[0].uiElements()[1];

mail.value = "*******" // mail adress
password.value = "*****"; // password

delay(1);

Application('System Events').keyCode(36);
```
# 課題

ログインボタンをクリックっていうのをしたかったんだけど，uiElementsとかで見つけられなかったので，最後の方で改行コードでログインするようにしてます．
Retrofit2+GsonでJsonの形式が配列になったりオブジェクトになったりする時に対応する方法

# レスポンスの形式

```
{
   "val":[]
}
```

```
{
   "val":{
      "val1":1,
      "val1":2
   }
}
```
こんな風に同じキーでも配列とかオブジェクトになったりするとき。

```kotlin
class Response{
    @SerializedName("val")
    val val<Val>? = null
}
```

っていうモデルだとうまくいかない。形式が異なるのでエラーになる。
そこで**JsonDeserializer**を使う。

以下のようにjsonMappingのタイミングでリマップする。

```kotlin
class ValRequestDeserializer:JsonDeserializer<Response>{
  override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): Response {

          // ここでjsonが配列かオブジェクトか判定して配列にリマップする
          return context!!.deserialize(json, Response::class.java)
      }
      return Gson().fromJson(json, Response::class.java)
  }
}
```

これを以下のようにセットする。

```kotlin
val gson = GsonBuilder()
  .setDateFormat("yyyy-MM-dd'T'HH:mm:ss")
  .registerTypeAdapter(Response::class.java, ValRequestDeserializer())
  .create()

```

なんかもっといいやり方ありそうだが、今はこれしか知らない・・・・

まぁそもそもこんな実装必要なAPIやめてくれってのはもはや言うまい。いろいろな事情があるのだ、いろいろな
try-with-resources構文でfinally句を書くとどうなる？

ふとした疑問。try-with-resources構文でfinally句を書くとどうなるのか。
もちろん、try句で指定したCloseable(AutoCloseable)#closeが呼ばれて、finally句も呼ばれることを期待。

```java:Main.java
public class Main {

    public static void main(String[] args) throws Exception {
        try (Hoge hoge = new Hoge()) {
            System.out.println("try");
        } finally {
            System.out.println("finally");
        }
    }

    public static class Hoge implements AutoCloseable {

        @Override
        public void close() throws Exception {
            System.out.println("close");
        }
    }

}
```

結果

```
try
close
finally
```

ちゃんと期待通りになってる。（そりゃそうか）
デコンパイルするとこんな感じ。

```java:Main.java
public class Main2 {
    public static void main(String[] args) throws Throwable {
        try {
            Throwable arg0 = null;
            Object arg1 = null;
            try {
                Main.Hoge hoge = new Main.Hoge();
                try {
                    System.out.println("try");
                } finally {
                    if (hoge != null) {
                        hoge.close();
                    }
                }
            } catch (Throwable arg14) {
                if (arg0 == null) {
                    arg0 = arg14;
                } else if (arg0 != arg14) {
                    arg0.addSuppressed(arg14);
                }
                throw arg0;
            }
        } finally {
            System.out.println("finally");
        }
    }

    public static class Hoge implements AutoCloseable {
        public void close() throws Exception {
            System.out.println("close");
        }
    }
}
```
NSNotificationをシンプルに書く方法

## 概要
NSNotificationをpostしたりaddObserver/removeObserverする際、NSNotification.Nameに文字列を指定するとタイプミスをすると、正しく動作しなくなってしまいます。しかし、ビルドは通るため、気づくのに時間がかかってしまいます。そこで、NSNotification.Nameを拡張し、独自のnameを定義します。

### 1. NSNotification.Name拡張

独自のnameを定義します。

```swift
extension NSNotification.Name {
    static let sample = Notification.Name(rawValue: "sample")
//    static let hoge = Notification.Name(rawValue: "hoge")
//    static let fuga = Notification.Name(rawValue: "fuga")
}
```

### 2. 通知発行コード
```swift
NotificationCenter.default.post(name: .sample, object: nil)
```

### 3. 通知受信側コード
```swift
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
         object: nil)

        NotificationCenter.default.addObserver(self, selector: #selector(onSampleNotified(_:)), name: .sample, object: nil)
    }

    deinit {
        NotificationCenter.default.removeObserver(self, name: .sample, object: nil)
    }

    func onSampleNotified(_ notification: NSNotification) {
        print("Notification button pushed")
    }
}
```

## サンプル
[Notification-Name@github](https://github.com/ayakix/Notification-Name)に動作するプロジェクトがあります。
メソッドの中からクラス名とメソッド名を取得する

rubyのメソッド中において `クラス名` と `メソッド名` を取得する方法。

```ruby
class Sample
  
  # @return [String]
  def self.class_name
    self.name   
  end

  # @return [Symbol]  
  def self.class_method_name
    __method__
  end

  # @return [String]
  def class_name
    self.class.name
  end

  # @return [Symbol]  
  def instance_method_name
    __method__
  end
  
end
```

```ruby
> Sample.class_name
"Sample"

> Sample.class_method_name
:class_method_name

> sample = Sample.new
> sample.class_name
"Sample"

> sample.instance_method_name
:instance_method_name
```

Deprecateなメソッドが呼ばれた時など、ログを出力することに使うと良い感じ。

```
#{self.class.name}\##{__method__}"
```
【Google Data Studio】スプレッドシートを日本地図に反映

Google Data Studioで地図を作る[この記事](https://support.google.com/360suite/datastudio/answer/7065037?hl=ja#supported-geographic-field-types)が、正直よくわからないので書いておきます:boy_tone1:

##Google Data Studioを使って日本地図にヒートマップを作成
[ここ](https://datastudio.google.com/u/0/#/org//navigation/reporting)にアクセス
![image](https://qiita-image-store.s3.amazonaws.com/0/150607/da86b739-2fbf-b4a2-a31c-1a27daef251c.png)
空白の新しいレポートの開始からスタート

新しいデータソースを作成　→　Googleスプレッドシート
ドライブに保存してあるスプレッドシートをアップ

今回は[これ](https://docs.google.com/spreadsheets/d/1rvs8mjN_NUQO-sO01F0EhrZgQriZ2-xGAbwjmBn2gg8/edit?usp=sharing)を自分のスプレッドシートにコピペして読み込んでください。

読み込んだ際に地域のディメンションがテキストになっているので、地域にしましょう。
（※よくわからない警告が出ますが無視）
![image](https://qiita-image-store.s3.amazonaws.com/0/150607/64cdbf53-35da-ad25-e429-e47f72217cf4.png)


##レポートの作成
地図を選択して、レポート上で適当に広げてみる
![image](https://qiita-image-store.s3.amazonaws.com/0/150607/4e2117cd-d97e-e305-64af-89292760f5ac.png)

右サイドバーにある`エリアをズーム`から日本を選択
こんな感じになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/150607/594b6941-953f-e2cd-3b39-b3ba77a2c945.png)

フィルタオプションを選択して、適当に広げる
![image](https://qiita-image-store.s3.amazonaws.com/0/150607/ef80b0a6-aa3d-1cb1-5040-71fd240ba6c1.png)

こんな感じで、チェックボックス型のフィルタリングを作れる
（※縦が足りていなくても、閲覧の時はスクロールで見れる）
![image](https://qiita-image-store.s3.amazonaws.com/0/150607/3d9902af-8395-9e1f-9d90-fea93c903f45.png)

右上の編集をオフにすると閲覧モードにできるので、チェックボックスを外したりして遊ぶ
![image](https://qiita-image-store.s3.amazonaws.com/0/150607/3c0e5af9-cd97-20fe-fc05-3f112d3599ae.png)

完成したら、[こんな感じ](https://datastudio.google.com/open/0Bwwqt3M9gVIvdkx3SW9od243TjA)になります


##注意点①スプレッドシートの編集が反映されない
もはや注意点というか、意味不明な話ですが
データを編集しても結果が反映されない時は、データの1行目のタイトルを編集してみましょう。
1行目の編集はちゃんと理解して、列全体が更新されるため、データの編集が適用されます。

##問題点（誰か助けてほしい）
①上記にもある通り、編集の反映が謎仕様
②地域の指定を漢字で行なっているが、地域コードにしたい
③日本だけ表示したいのに、アジアの他の大陸も写り込んでいる

##参考
何かに使えるかもしれないので、知ってるもの全部載せておきます。
[地図のリファレンス](https://support.google.com/360suite/datastudio/answer/7065037?hl=ja#supported-geographic-field-types)
[データスタジオの関数リスト](https://support.google.com/360suite/datastudio/table/6379764)
[Google Data Studio ~ スプレッドシートのデータを読み込む方法 ~](http://qiita.com/omi_yasu/items/1c883e2182d6a7fc37db)
opensslコマンドでAWS SESを経由でメール送信テスト

AWSのSimple Email Service(SES)ではUse Transport Layer Security (TLS)を使わないいけないので、簡単にtelnetから接続できません。
下記はサーバーから送信できるかどうかを試してみる手順です。

#### SMTP credentialsトークンの生成

```bash
$ perl -MMIME::Base64 -e 'print encode_base64("auth-user-name");'
```
```
QUtJ...auth-user....RMSUE=
```
```bash
$ perl -MMIME::Base64 -e 'print encode_base64("auth-password");'
```
```
QXVDR...auth-pass....3Q= 
```

#### メール送信

```bash
$ openssl s_client -crlf -quiet -starttls smtp -connect email-smtp.us-west-2.amazonaws.com:587
```

```
depth=2 C = US, O = "VeriSign, Inc.", OU = VeriSign Trust Network, OU = "(c) 2006 VeriSign, Inc. - For authorized use only", CN = VeriSign Class 3 Public Primary Certification Authority - G5
verify return:1
depth=1 C = US, O = Symantec Corporation, OU = Symantec Trust Network, CN = Symantec Class 3 Secure Server CA - G4
verify return:1
depth=0 C = US, ST = Washington, L = Seattle, O = "Amazon.com, Inc.", CN = email-smtp.us-west-2.amazonaws.com
verify return:1
250 Ok
EHLO smtp.example.com                              # ← 入力
250-email-smtp.amazonaws.com
250-8BITMIME
250-SIZE 10485760
250-STARTTLS
250-AUTH PLAIN LOGIN
250 Ok
AUTH LOGIN                                        # ← 入力
334 VXNlcm5hbWU6
QUtJ...auth-user....RMSUE=                        # ← 入力
334 UGFzc3dvcmQ6
QXVDR...auth-pass....3Q=                          # ← 入力
235 Authentication successful.
MAIL FROM: info@example.com                       # ← 入力
250 Ok
rcpt TO: test@example.com                         # ← 入力
250 Ok
DATA                                              # ← 入力
354 End data with <CR><LF>.<CR><LF>
From: info@example.com                            # ← 入力
Subject: SES TEST                                 # ← 入力
Hello World                                       # ← 入力
.                                                 # ← 入力
250 Ok 0101015af9158693-aec4e9fe-5e1f-4211-826a-f9ca21411aac-000000
421 Timeout waiting for data from client.         # 入力せずにtimeout
```

#### メール確認

```
Delivered-To: test@example.com
Received: by .........;
        Wed, 22 Mar 2017 19:53:43 -0700 (PDT)
X-Received: by .......
....
From: info@example.com 
Subject: SES TEST
Message-ID: <0101015af9158693-aec4e9fe-5e1f-4211-826a-f9ca21411aac-000000@us-west-2.amazonses.com>
Date: Thu, 23 Mar 2017 02:53:42 +0000
X-SES-Outgoing: 2017.03.23-54.240.27.29
Feedback-ID: 1.us-west-2.jj20/+c1csFRX4yd6JTZjvVI/J8oJxtSw+150dH6qcs=:AmazonSES

Hello World
```
#### 参考
http://qiita.com/tasaki-i3/items/e5ce2a235a4eb75c6d9b
WRF / Python > ２つのNetCDFファイルを読んで(緯度,経度,対象値)の表示にする > enumerate(zip(*rows))を教えていただたきました

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

関連 http://qiita.com/7of9/items/6fd5d52439b0adc92d95

LN-test_nc: WRF関連の処理結果ファイル
LN-latlon_nc: 緯度経度情報ファイル

2つのファイルを読込んで、(lat, lon, 対象値)の形式とするために以下を実装していた。

1. proc_vallatlon_170315_exec: bash script
2. read_lat_lon.ncl : NCAR Command Language script
3. combine_3files_170315.py: Python script 

NCLはよく分かっていなく、bashは苦手。Pythonもまだまだ学習中。
これら３つのファイルを使い続けるのはメンテナンス性が悪い。

PythonでnetCDF4パッケージを使えば簡単、と聞いてそのようにした。

参考 http://qiita.com/okadate/items/954574a95545b06ca257

### code

```read_netcdf_170323.py
import netCDF4
import sys

# on Python 2.6.6
# codingrule:PEP8

# LN-test_nc: netCDF file including processed data
# LN-latlon_nc: netCDF file including (lat, lon)
#

# 1. read data
nc = netCDF4.Dataset('LN-test_nc', 'r')
cnc = nc.variables['CONC'][:]
nc.close()

# 2. read lat lon
nc = netCDF4.Dataset('LN-latlon_nc', 'r')
lat = nc.variables['XLAT'][:]
lon = nc.variables['XLONG'][:]
nc.close()

# debug
print(cnc.shape)  # (24, 1, 1, 3, 65, 82)
print(lat.shape)  # (65, 82)
print(lon.shape)  # (65, 82)

print(cnc[0, 0, 0, 0, 0, 81])  # (24, 1, 1, 3, 65, 82)

# 3. extract map
timidx = 2  # 2: arbitrary
cmap = cnc[timidx, 0, 0, 0, :, :]  # (65, 82)
print(cmap.shape)

# 4. output
for alat, alon, acnc in zip(lat, lon, cmap):
    for idx in range(len(alat)):
        print('%.5f, %.5f, %.5f' % (alat[idx], alon[idx], acnc[idx]))
        # debug
        if idx > 5:
            sys.exit()  # debug
```

```txt:結果
$ python read_netcdf_170323.py 
(24, 1, 1, 3, 65, 82)
(65, 82)
(65, 82)
0.0
(65, 82)
36.07000, 111.17000, 0.00000
36.07000, 111.29000, 0.00000
36.07000, 111.41000, 0.00000
36.07000, 111.53000, 0.00000
36.07000, 111.65000, 0.00000
36.07000, 111.77000, 0.00000
36.07000, 111.89000, 0.00000
```

これで1つのファイルだけメンテナンスすればよくなった。

NCL(NCAR Command Language script)は既存スクリプトを読めればいい程度。書くための学習コストは不要となった。

上記コードはvirtualenvのPython 3.6.0でも動作する。
(easy_install netCDF4した)

## 教えていただいた事項

@shiracamus さんの[コメント](http://qiita.com/7of9/items/d7bc7038a697adb214ee/#comment-1a85846225c5085f851a)にて`enumerate()`と`zip(*)`の使用例を教えていただきました。

情報感謝です。
Meteorでログイン機能をつけるときに必要なパッケージとその手順

Meteorでログイン機能をつけるために必要なパッケージとそのインストール手順。
そして、clientに表示されるまでを書きたいと思います。
※「accounts-password」のインストール時にerrorが出たのでその回避策も含めて。

## 環境
- node v6.9.5
- npm v3.6.0
- meteor v1.4.2.3

## パッケージをインストール
※順番通りにインストールしないとerrorになります。

1. meteor add useraccounts:bootstrap
2. meteor add accounts-ui
3. meteor add accounts-password@1.2.12
4. meteor add useraccounts:flow-routing
5. meteor add softwarerero:accounts-t9n

## パッケージについて補足
### 「useraccounts:bootstrap」について
「sign in」「sign up」のレイアウトを作成してくれる。
カスタマイズすることもできます。
参考サイトは[こちら](https://github.com/meteor-useraccounts/core/blob/master/Guide.md)

### 「accounts-ui」について
ログイン機能をつけるパッケージ。
twitterやfacebook、GitHubなどのアカウントでログインさせるときに必要なパッケージ。
参考サイトは[こちら](https://atmospherejs.com/meteor/accounts-ui)

### 「accounts-password@1.2.12」について
ここがハマったところ。

``` terminal:error
meteor add accounts-password
```

と打つとerrorになりました。

``` terminal:error内容
Failed at the bcrypt@0.7.7 install script 'node-gyp rebuild'.
```

「node-gyp rebuild」をインストールしてもうまくいかなかったので、末尾に「@1.2.12」を付けた

``` terminal:インストールできた書き方
meteor add accounts-password@1.2.12
```

で対応。

### 「useraccounts:flow-routing」について
「sign in」「sign up」のページディレクトリを設定できるパッケージ。(route)
参考サイトは[こちら](https://atmospherejs.com/useraccounts/flow-routing)


### 「softwarerero:accounts-t9n」
「sign in」「sign up」のレイアウトを日本語化させるために必要なパッケージ。
参考サイトは[こちら](https://atmospherejs.com/softwarerero/accounts-t9n)

## 最後にclientに書き込む

``` meteor:client.html
<div class="{{atClass}}">
  {{> atForm}}
</div>
```

と記述すると「ログインフォーム」と「アカウント作成フォーム」が表示されるかと思います。
そこでアカウント作成するとDB「mongo」の「users」コレクションにアカウントが追加されます。
jqx問合せ用の画像アップロード

![2017-03-23_110331_mail1.png](https://qiita-image-store.s3.amazonaws.com/0/150571/a5e95b41-61c5-904c-1ee1-2cae90bfe1ff.png)
![2017-03-23_110434_mail2.png](https://qiita-image-store.s3.amazonaws.com/0/150571/a8631f17-8fe1-ce4b-d0d2-c6ea28a6dd7f.png)
![2017-03-23_110514_mail3.png](https://qiita-image-store.s3.amazonaws.com/0/150571/9f9fe079-d330-5e65-c58e-6ad26986ec65.png)
![operation2.png](https://qiita-image-store.s3.amazonaws.com/0/150571/95948a47-2d81-25fd-adc0-20b3ecdc3821.png)
![2017-05-12_141520.png](https://qiita-image-store.s3.amazonaws.com/0/150571/03fa38c3-374c-48f5-617b-c96b6c44f9a8.png)
Python more-itertools 2.5 → 2.6 を比べてみた

# more-itertools が 2.5 から 2.6 で変わったところ

## (変更) ilen

実装が、sum から deque に変わった。何故 deque?

```py3:python3
from collections import deque
n = 10000
%timeit sum(1 for _ in range(n))                      # 2.5
%timeit deque(enumerate(range(n), 1), maxlen=1)[0][0] # 2.6
>>>
1000 loops, best of 3: 439 µs per loop
1000 loops, best of 3: 289 µs per loop
```

確かに、速くなっている。

## (追加) divide

おおよそ同じサイズになるように、指定個数に分割する。

```py3:python3
from more_itertools import divide, always_iterable, adjacent, groupby_transform, context
[tuple(i) for i in divide(3, range(10))]
>>>
[(0, 1, 2, 3), (4, 5, 6), (7, 8, 9)]
```


## (追加) always_iterable

iterable はそのまま、iterable でないものも iterable に。

```py3:python3
always_iterable(None)
>>>
()

always_iterable(1)
>>>
(1,)

always_iterable([1,3,5])
>>>
[1, 3, 5]
```


## (追加) adjacent

条件が一致するところの前後もTrueにする。

```py3:python3
list(adjacent(lambda x: x==3, range(7)))
>>>
[(False, 0),
 (False, 1),
 (True, 2),
 (True, 3),
 (True, 4),
 (False, 5),
 (False, 6)]

list(adjacent(lambda x: x==3, range(7), distance=2)) # 前後2つ差まで
>>>
[(False, 0),
 (True, 1),
 (True, 2),
 (True, 3),
 (True, 4),
 (True, 5),
 (False, 6)]
```


## (追加) groupby_transform

グルーピング後に、キーと値を変換する。

```py3:python3
[(i,list(j)) for i,j in groupby_transform([1,1,3,2,2,2],
                                          lambda x: f'<{x}>', # キーの変換
                                          lambda x: x*10)]    # 値の変換
>>>
[('<1>', [10, 10]), ('<3>', [30]), ('<2>', [20, 20, 20])]
```


## (追加) context (3.0 で削除)

with で使えるやつをジェネレータに。

```py3:python3
with open(ファイル名) as fp:
    print(fp.read())

↓ このように書ける

print(*[fp.read() for fp in context(open(ファイル名))])
```


参考: [itertools、more-itertoolsの紹介](http://qiita.com/Tsutomu-KKE@github/items/ddb5076ef62745f03b56)

以上
/usr/local/var/run/nginx/client_body_tempでPermission deniedと言われた

環境
---

```
OS X 10.11.6
$ nginx -v
nginx version: nginx/1.6.2
```
nginxはHomebrewで入れたやつ。

現象
---
Macでnginx+WordPressで動かしていたら、なにかのきっかけで非公開プレビューや公開処理でエラーページに飛ばされて作業ができなくなった。
エラーログ見るとなんか変なの出てた。どうやら権限がおかしいらしい。

```
2017/03/22 11:59:02 [crit] 20195#0: *1 open() "/usr/local/var/run/nginx/client_body_temp/0000000001" failed (13: Permission denied), client: 127.0.0.1, server: localhost, request: "POST /wp-admin/post.php HTTP/1.1", host: "localhost:8082", referrer: "http://localhost:8082/wp-admin/post.php?post=100873&action=edit"
```

解決
---
issueで同じようなの見つけた。
[13: Pemission denied in /usr/local/var/sun/nginx/client_body_temp · Issue #124 · Homebrew/homebrew-nginx](https://github.com/Homebrew/homebrew-nginx/issues/124)

ので、この通りにしたらエラーが取れて解決(^o^)b

```zsh
$ sudo chown -vhR $USER_NAME:admin /usr/local/var/run/nginx
$ nginx -s reopen
```
[Clang][C++14][Linux] Clangで標準ライブラリのヘッダでコンパイルエラーが出る場合の対処法

LinuxのClangでc++14を使おうとしたら標準ライブラリを使うだけでコンパイルエラーが発生した。その場合の対処方法のメモ

# エラー内容

```console:エラー１（GCC向けのヘッダが使われている）
$ clang++-3.8 -std=gnu++14 test.cpp
In file included from test.cpp:1:
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/cstdio:120:11: error: no member
      named 'gets' in the global namespace
  using ::gets;
        ~~^
1 error generated.
```

```console:エラー２（libc++が存在しない）
$ clang++-3.8 -stdlib=libc++ -std=gnu++14 test.cpp
test.cpp:1:10: fatal error: 'cstdio' file not found
#include <cstdio>
```

# 対処法
## libc++-devのインストール

そもそもGCC向けのヘッダが使われているので、clang向けのヘッダを取得する

```console:libc++-devのインストール
$ apt-get install libc++-dev
```

## clang++のライブラリの指定を `-stdlib=libc++` とする

```
$ clang++-3.8 -stdlib=libc++ -std=gnu++14 test.cpp
```

以上でコンパイルエラーを回避できた。

# 参考
[c++ - clang seems to use the gcc libraries - Stack Overflow](http://stackoverflow.com/questions/24342312/clang-seems-to-use-the-gcc-libraries)
[c++ - Clang doesn't see basic headers - Stack Overflow](http://stackoverflow.com/questions/26333823/clang-doesnt-see-basic-headers)
[“libc++” C++ Standard Library — libc++ 5.0 documentation](http://libcxx.llvm.org/docs/)
CentOS7 に nginx導入


### リポジトリの設定
リポジトリを追加するので `nginx.repo` のファイルを作成
`$ sudo vi /etc/yum.repos.d/nginx.repo`

```nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
```

### インストールと起動
```
nginxをインストール
$ sudo yum install nginx
バージョンの確認
$ nginx -v
自動起動設定
$ sudo systemctl enable nginx
起動
$ sudo systemctl start nginx
```
### デフォルトページの確認
表示の確認をする。 http://サーバーのアドレス/
![スクリーンショット 2017-03-23 午前10.51.21.png](https://qiita-image-store.s3.amazonaws.com/0/33553/ff270b8e-8a44-4373-9f0c-2027c6e37ce0.png "スクリーンショット 2017-03-23 午前10.51.21.png")
上記の `index.html` のデフォルトのパス
`/usr/share/nginx/html/index.html`
nginx の設定ファイルのパス
`/etc/nginx/conf.d/default.conf`
### 簡単なリバースプロキシ
`/etc/nginx/conf.d` 以下に XXX.confという命名でファイルを作成する
ココでは `server.conf` とし、`80` 番で受けたリクエストを `8000` 番に転送する
`$ sudo vi /etc/nginx/conf.d/server.conf`

```
server {
	 listen 80;
	 # アクセス可能なIPアドレス、もしくはドメイン
	 server_name hogehoge.com;
	 proxy_set_header X-Real-IP $remote_addr;
	 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	 proxy_set_header Host $http_host;
	 proxy_redirect off;
	 proxy_max_temp_file_size 0;
	 location / {
	 	proxy_pass http://localhost:8000;
	 }
}
```

### nginx基本コマンド
```
起動
$ sudo systemctl start nginx
停止
$ sudo systemctl stop nginx
再起動
$ sudo systemctl restart nginx
再起動しても設定ファイルが反映されない場合など
$ sudo nginx -s reload
状態の確認
$ sudo systemctl status nginx
```
VBAにおけるクリップボードフリーのすすめ

仕事でExcelVBAを使う機会が多いのですが、最近1つの真理を発見したので書き残すことにします。

Excel等のオフィスソフトから直に呼び出すにせよ、外部プログラムからOLE等を使って間接に呼び出すにせよ、VBAで処理を実装する際に、クリップボードは極力、というか絶対に使ってはいけない。

VBAでは目的を遂行するために実に様々な実装方法がありますが、これが1つの指針になるのではないかと思います。

クリップボードはWindows上で共有されます。
VBAが独占的に使えるリソースではありません。

VBAでクリップボードを使った値のコピー中にユーザがほかの場所でコピペするとその値が割り込んできて正確なコピーができません。
ユーザが何か他の場所で大事なファイルをコピペしているときにVBAがクリップボードを使うと大事なファイルが正しくコピーされなくなってしまいます。

さらに言うと、VBAでオブジェクトをコピーしてからペースト可能になるまでには少しタイムラグがあるので、クリップボードを多用するマクロは再現できないバグの温床にもなります。

VBA実行前と実行後でクリップボードに変化がないこと。
つまりクリップボードフリー。
これをVBA業界のテスト標準に組み込んでいきましょう。

---
追記
具体的な例をあげます
### 初級編
``` vb:ダメな例
Range("A1").Select
Selection.Copy
Range("A2").Select
ActiveSheet.Paste
```
``` vb:良い例
Cells(2, 1).value = Cells(1, 1).value
```
### 中級編
``` vb:ダメな例

```
``` vb:良い例

```
### 上級編

``` vb:ダメな例
ThisWorkbook.Sheets(1).Shapes(1).Copy
ThisWorkbook.Sheets(1).Paste
Set obj = Selection
obj.ShapeRange.LockAspectRatio = msoFalse
obj.Left = 0
obj.Top = 0
```

``` vb:良い例
Set obj = ThisWorkbook.Sheets(1).Shapes(1).Duplicate
obj.LockAspectRatio = msoFalse
obj.Left = 0
obj.Top = 0
```
Windowsで精密な時刻を取得する（Windows8以降）

`DateTime.Now` は精度が 10 msec 程度。より正確な時刻がほしいときに使う。時間であれば `Stopwatch` クラスがじゅうぶんに高精度（High-Resolution Timer 精度）。

```c#
[DllImport("kernel32.dll")]
private static extern void GetSystemTimePreciseAsFileTime(out long filetime);

public DateTime GetSystemTimeAsDate()
{
    long fileTime;
    GetSystemTimePreciseAsFileTime(out fileTime);
    return DateTime.FromFileTimeUtc(fileTime).ToLocalTime();
}
```

参考：[GetSystemTimePreciseAsFileTime function](https://msdn.microsoft.com/ja-jp/library/windows/desktop/hh706895(v=vs.85).aspx)

***

蛇足（背景）：Wireshark の測定結果とアプリのログを付き合わせようとしたら、アプリ側の時刻がガバガバで何も得られなかったので、高精度な時刻がほしいなあと[Wiresharkのソース](https://www.wireshark.org/download/src/) を読んでいたら以下のようなコメントがあった。

```C:dumpcap.c
#ifdef _WIN32
    /*
     * Current time, represented as 100-nanosecond intervals since
     * January 1, 1601, 00:00:00 UTC.
     *
     * I think DWORD might be signed, so cast both parts of "now"
     * to guint32 so that the sign bit doesn't get treated specially.
     *
     * Windows 8 provides GetSystemTimePreciseAsFileTime which we
     * might want to use instead.
     */
    GetSystemTimeAsFileTime(&now);
```
GitHubのWebUIからライセンスを追加してみました。

### きっかけ

#### リポジトリのメニュー、なにかが違う？

たまたま調査の関係で他の方のリポジトリを見ていたところ、わたしの個人のリポジトリの画面とは「何かが違う！」ことに気がついたのが始まりです。

違いは、リポジトリの上部のコミット数、ブランチ数を記載しているタブ。
なにやら、わたしのリポジトリより項目が1つ多いのです。
よく見ると、**「GPL-2.0」**というタブでした。

#### どうやったら設定できるの？

クリックすると、ライセンスのファイルと色々な注意書きが表示されました。
実は、わたしも個人リポジトリはGPLのライセンスをソースコードに添えて公開しています。でも、そんなメニューは出てこない...。

「（ナニコレステキ！）どうやったら出せるのかしら？」と思ったのがきっかけです。

さて、そのままライセンスの表示されたページのリンクをたどると、GitHubの “[Licensing a repository](https://help.github.com/articles/licensing-a-repository/#disclaimer)” というページに辿りつきました。

このページで、オープンソースとしてリポジトリを公開している場合のライセンス設定のガイドが記載されていました。

#### メニューに反映させるには？

わたしもライセンス用のテキストファイルを添えていましたが、どうやら **LICENSE** もしくは **LICENSE.txt** という名前で設定してあげると、GitHubがライセンスファイルと認識してくれるようです。
ソースコードに含めていたのは GPL.txt だったので、対象外だった模様です。

さて、引き続きGitHubのライセンスのページを見ていくと、[Adding a license to a repository](https://help.github.com/articles/adding-a-license-to-a-repository/) というページに、オンラインでWebUI経由でライセンスを追加する方法が載っていましたので、こちらを試すことにしました。

### WebUIからライセンスを追加する

では、[Adding a license to a repository](https://help.github.com/articles/adding-a-license-to-a-repository/) に従って、WebUIからライセンスファイルを追加する方法を取ってみます。

#### Creating Fileでファイル追加

まずは、リポジトリ上部の「Creating File」ボタンを押します。
そうすると、ブランクのページが出てきますので、ファイル名に「LICENSE」または「LICENSE.txt」と入力します。

すると、右端に「テンプレート適用しますか？」というプルダウンが出てきます。

![add-file.png](https://qiita-image-store.s3.amazonaws.com/0/27976/8bc86b71-fc8a-566d-7db7-77241561a22a.png)

例ではRedmineのプラグインなので、そもそもRedmineがGPLv2なことと、プラグイン自体Redmineがないと動かないので、GPLv2に揃えています。

リポジトリに合ったライセンスを選ぶと、本文にライセンス文面が適用されます。

![add-license.png](https://qiita-image-store.s3.amazonaws.com/0/27976/946c1fa3-f485-6688-2b53-2e5b4cf21e88.png)

#### Submitしたら？

masterブランチへのファイル追加であれば、即リポジトリにライセンスを明示するタブが追加されました。

![license-after.png](https://qiita-image-store.s3.amazonaws.com/0/27976/23c483d3-0a22-0784-a5fd-e997ddadd099.png)

完全に自己満足ですが、嬉しいです。

### 既存のファイルのRenameだとどう？

さて、リポジトリは他にも少しあるので、既存のGPL.txtをLICENSE.txtにリネームしてmasterに反映させてみたらどうでしょうか？

GitHubが自動で検出する...とガイドにありましたので、試してみました。
流れとしては以下の通り。

* devブランチでGPL.txtをLICENSE.txtにリネーム
* devブランチをpush
* GitHub上で、masterへのプルリクを作成
* プルリクをsubmitして、masterに反映

devブランチに適用しただけでは、やはりタブは増えませんでした。masterに適用されて、初めてタブが追加となりましたが、問題なく表示となりました。

![rename-file.png](https://qiita-image-store.s3.amazonaws.com/0/27976/6a92da65-0aac-6c5b-9063-bb7cc1ba7789.png)

### まとめ

以上、簡単ですがライセンスの明示のための手順でした。
さて、GitHubのライセンスのガイドを遡っていくと、**Building a strong community** というカテゴリにたどり着きます。

Contributeのためのガイドラインや、コードの規範といったものも、ファイルとして登録して、GitHubのリポジトリ上から見えやすくできるようです。

わたし個人のリポジトリは大規模ではないので、そこまで設定しないと思いますが、参考にしているリポジトリや大規模なリポジトリについては、そのあたりも注意して見てみようと思いました。

あと、[GitHub Jobs](https://jobs.github.com) っていうページもあるんですね...。こちらについても記載ガイドが載っていたりして、眺めていて面白かったです。　（GitHub Jobsも初めて知りました！）
ChromeのDeveloper ToolsでToggle device toolbarをONにするとUAがandroidになる



OFF

```UserAgent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36
```

ON


```UserAgent
Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Mobile Safari/537.36
```


~~UAをChromeのままで確認したい場合は、Network conditionsのタブを開いてUser agentを設定する~~

menuからAdd device typeを選ぶと、device typeの選択欄が出てくるので、そこでDesktopかMobileを選ぶ
Microsoft Remote Desktop(mac)の設定を別マシンにコピーする。

いつかまた同じことをやるためのメモ

## やりたいこと

* Macで現在利用しているMicrosoft Remote Desktopサーバリストを別のマシンにそのままコピーしたい。
* Microsoft Remote DesktopのExport機能を使うと設定はExportできるが、パスワードなど一部の情報が移行できない。

## やりかた

こちらに書いてあるとおり

* [Copy all of "My Desktops" to another Mac with Microsoft Remote Desktop v8.0.9](https://social.technet.microsoft.com/Forums/office/en-US/c54f3e68-064c-4c0f-ba15-8bfe2fd062a1/copy-all-of-my-desktops-to-another-mac-with-microsoft-remote-desktop-v809?forum=winserverTS)


* `~/Library/Containers/com.microsoft.rdc.mac/Data/Library/Preferences/com.microsoft.rdc.mac.plist`ファイルを古いマシンからコピー
* `~/Library/Containers/com.microsoft.rdc.mac/Data/Library/Application Support/Microsoft Remote Desktop`ディレクトリを古いマシンからコピー
* `sudo killall cfprefsd` defaults serverを再起動(おそらくキャッシュをクリアとかそういう意味だと思う。)

これで前の設定が復元できた。

## ファイルやディレクトリの中身

### `~/Library/Containers/com.microsoft.rdc.mac/Data/Library/Preferences/com.microsoft.rdc.mac.plist`の中身

```
defaults read com.microsoft.rdc.mac.plist
{
    NSNavLastRootDirectory = "~/Desktop/rdc";
    NSNavPanelExpandedSizeForOpenMode = "{712, 448}";
}
```

### `~/Library/Containers/com.microsoft.rdc.mac/Data/Library/Application Support/Microsoft Remote Desktop`の中身

以下のようなuuidの記載されたディレクトリとログファイルがあるだけ、設定情報はどこに保存されているんだろう？

```
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
```

```
./logs/rdplog.log
./logs/rdplog.log.1
```

## 環境

* OSX: macOS 10.12.3
* Microsoft Remote Desktop: 8.0.38

## 参考

* [Copy all of "My Desktops" to another Mac with Microsoft Remote Desktop v8.0.9](https://social.technet.microsoft.com/Forums/office/en-US/c54f3e68-064c-4c0f-ba15-8bfe2fd062a1/copy-all-of-my-desktops-to-another-mac-with-microsoft-remote-desktop-v809?forum=winserverTS)
Cognos パフォチュー事例 - 自動グループ化の停止

##概要
リストやクロス集計などで、集計の必要の無い単純な明細レポートの表示で、パフォーマンスが出ない場合のTipsです。

##内容
リストやクロス集計の作成時に、クエリーが生成されますが、クエリー・エクスプローラーで生成されたクエリーのプロパティーを確認すると、「自動グループ化および集計」がデフォルトで「はい」になっています。
この場合、単純な明細の表示なので集計は必要ないのですが、実際に発行されるSQLは以下のようなもので、SUM()やGROUP BYが入ってしまい、余計な処理の追加のためパフォーマンスに影響が出る事があります。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/7f5addfc-4eb2-63b8-922b-a4b4ec929915.png)

以下のように、「自動グループ化および集計」を「いいえ」に設定する事で、SUM()やGROUP BYの余分な処理が無くなり、SQLのパフォーマンスが向上し、レポート実行のレスポンスが改善される事があります。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/135a0d3d-e0f0-0801-4966-48befdacba93.png)

単純な明細レポートを作成した際には、お試し下さい。
NERDTreeの初歩

Vimmerならみんな使ってるNERDTree。これだけは覚えておけ、というコマンドです。

## ファイル・ディレクトリ共通

|コマンド|説明|
|:--:|:--:|
|mm|名前変更、移動|
|md|削除|
|ma|追加|
|mc|コピー|

## ファイルの開き方

|コマンド|説明|
|:--:|:--:|
|o（Enter）|（NERDTreeのバッファで）開く|
|i|水平分割で上に開く|
|s|垂直分割で左に開く|
|t|タブで開く|

## ツリーの操作

|コマンド|説明|
|:--:|:--:|
|o|（ディレクトリの上で）開く/閉じる|
|O|以下すべて開く|
|X|以下すべて閉じる|

## 番外編
NERDTreeのバッファが他のファイルで塞がれた場合は「:ls」でバッファ一覧を表示して、NERDTreeのバッファを「:b2」などで開きます。

以上です。
あなたの開発、Hype(誇大宣伝) Driven Development になっていませんか？

去年ですがmediumで話題になっていた記事にHype(誇大宣伝) Driven Development(HDD)というものがあります。

https://blog.daftcode.pl/hype-driven-development-3469fc2e9b22#.n3r3o0wim

国内でもこれで失敗している例をよくみかけますし、とても共感したので紹介できればと思います。
翻訳ではなく、自分なりに噛み砕いて個人的な考えなども入れています。

## 概要

HDDとは一言でいえば、技術選定という重要なプロセスを他人任せにしてはならないという啓蒙です。
誰かが良いと言っているという理由で技術選定をしてはいけません。

例えば以下を理由に技術選定するのは `Hype Driven Development`(HDD)です。

・すごく偉い人がおすすめしていた
・カンファレンスですばらしい技術だと紹介されていた
・新しい技術だ
・人気が急上昇している
・超有名企業のA社が導入した

その技術は自分たちのどんな問題を解決してくれるのか。
開発の規模に、自分たちのスキルに、プロジェクトの特性にあっているのか。
そういったことを自分たちで考え、使う技術を決定しなくてはなりません。

## Hype Driven Development の具体例

記事では下記をHDDの例としてとりあげています。
これらを使うことが即HDDというわけではありません。
HDDによって技術選定されがちな技術だということです。

### フロントエンドフレームワーク(React.js/Angular/Vue etc.)

これらはSPAを作るための素晴らしいフレームワークであることは確かです。しかし、これらを適用する必要があるほど自分たちが作ろうとしているものが複雑なのかは判断する必要があります。導入によって発生する学習コストやワークフローの構築コストに見合うだけのメリットが本当にあるでしょうか。

関連するものとして、最近ではjQueryを排除しようとする流れが強くなってきていますが、シンプルなアプリケーションではjQueryで十分なはずで、学習コストや情報量の観点からもjQueryは今後もひとつのオプションとしてあり続けるはずです。

### TDD is dead by DHH

Ruby on Railsの開発者として有名な DHH が TDD is dead とブログ記事に書きました。
これをうけてTDDを止めようというのならHDDです。
これまでTDDをしていて、たしかに恩恵を受けていたなら止める理由はないはずです。

### マイクロサービス

Netflixが採用したことで人気が急上昇している技術のひとつです。しかし、マイクロサービスが有効に機能するプロジェクトは限られています。
個人的には相当に規模が大きいソフトウェアとチームでなければメリットがデメリットを上回ることはないと考えています。
設計の難しさや、失敗した場合の後戻りの難しさも考えるとかなり慎重に選択すべき技術です。
国内でも何度か失敗したという事例を見聞きしました。

### NoSQL

いまでは多くの企業がNoSQLを有効に利用していますが、大量に選択肢があるがゆえにいまだに誤ってNoSQLを導入してしまう事例はあるかと思います。
NoSQLの多くはスケーラビリティやハイパフォーマンスが売りです。でも自分たちのプロジェクトに本当にそれは必要でしょうか。そしてそのNoSQLプロダクトを選択することで何を捨てることになるのか理解できているでしょうか。
特に、キャッシュや一時的なデータストアとして使うのではなく、RDBの置き換えとしてNoSQLを選択する場合は多くの試練が待っています。

### Etc.

元記事にはElixir、Phoenixも例として記載されています。あと個人的にはServerlessもここに含めたい技術の一つです。有効なケースはかなり限られるわりに過大に宣伝・適用されているように感じます。

## HDDにしないために

### ブログからではなく経験から学べ

記事では技術を決定する前に、数日かけてプロトタイプを作ったりハッカソンをして実際に技術を試すことを推奨しています。
たしかにこれは良い方法だと思います。ただ、どれだけ時間をかけるべきかは内容によって変わると考えています。
例えばちょっとしたライブラリの選定などであればそれで十分かもしれませんが、フレームワークやインフラの基盤となるようなツール(仮想化ソフトウェアなど)はもっと長い時間をかけるべきだと思います。
また本番に採用する場合であっても、できればリスクが少ないプロジェクトから徐々に適用するのが理想的です。

## 元記事にはない話。捨てるものと規模。

HDDをしてしまう人たちが特に見過ごしがちだと思うのは「捨てるもの」と「規模」です。

### 捨てるもの
得られるものばかり考えてしまい、自分たちがその技術を使うことによって何を捨てているのかを理解しないまま技術を決定しているように感じます。
NoSQLにすればRDBの堅牢性や培ってきたノウハウを失います。マイクロサービスにすればWebAPIのコールが増えパフォーマンスが劣化します。それぞれ捨てているものはもっとあるでしょう。

### 規模
マイクロサービスやサーバーレスはどんな規模のソフトウェアでもメリットがデメリットを上回るでしょうか？マイクロサービスを小規模なソフトウェアに使えばパフォーマンスと開発速度を落としデプロイフローを複雑化するだけです。
サーバーレスを大規模な開発に適用すればソフトウェアの可読性を落とし、デバッグはかなり難しくなるでしょう。

何を捨てているのか、その技術が適用できる規模なのか、慎重に考えて技術選定すべきだと思います。

#補足

元記事にはもうちょっと色々書かれていますので、お時間があれば見てみてください。

https://blog.daftcode.pl/hype-driven-development-3469fc2e9b22#.n3r3o0wim

選定のときに何を考えるべきかも書かれています("When to go?")が、いまいち賛同できない部分もあるのでここには書きません。

ちょいちょい見聞きする技術・アーキテクチャ選定に関する失敗の多くがHDD的な失敗であると感じます。
得られるものと捨てるもの、自分たちが本当に欲しいものを見極め正しく技術選定できるようにしなければなりません。
Windows 10 > ウィンドウを横に2つ並べる

```txt:動作環境
Windows 10 Pro (64bit) Anniversary Update適用済
```

```txt:動作しないことを確認した環境
Windows 7 Pro
Windows 8.1 Pro
```


二台のモニタ環境において、１つのモニタにてウィンドウを2つ横に並べたい。

### 環境と知っていた情報

- 23インチ 1920x1028 のモニタ二台
- タスクバー上右クリック「ウィンドウを左右に並べて表示」
   - ウィンドウの左右が入れ替わる場合があり、使いにくい
- ウィンドウ上部をドラッグして、モニタの横端にぶつける
   - 横半分のサイズになる
   - マルチモニタの場合、モニタ同士の境界が「横端」と認識されないので使えない

### 見つけた方法

2つのウィンドウがあるとする。
配置はばらばら。

1. 右のウィンドウをモニタ右端にぶつける
   - 右のウィンドウが横半分のサイズになる
   - 左のウィンドウが小さく表示される
2. 左のウィンドウをクリックする
   - 左のウィンドウが左側で横半分のサイズになる
Python > these are all considered False:

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2045 / 12833)

> A false value doesn't necessarily need to explicitly be False. For example, these are all considered False:

|  |  |
|:-:|:-:|
| boolean  | False  |
| null  | None  |
| zero integer  | 0  |
| zero float  | 0.0  |
| empty string  | ''  |
| empty list  | []  |
| empty tuple  | ()  |
| empty dict  | {}  |
| empty set  | set()  |

> Anything else is considered True.

試してみた。

http://ideone.com/fTS6kQ

```py
def check_empty(something):
	if something:
		print('Not Empty')
	else:
		print('Is Empty')
	
alist = []
check_empty(alist)
alist.append('7of9')
check_empty(alist)

aint = 0
check_empty(aint)
aint = 314
check_empty(alist)
```

```txt:結果
Success	time: 0 memory: 23304 signal:0
Is Empty
Not Empty
Is Empty
Not Empty
```
nasa space apps challenge その８

#概要
nasa space apps challenge に行けないので、勝手にハッカソンしてみる。
他のサイトからajaxするために、node-redでクロスドメイン対策した。

#写真
![](https://qiita-image-store.s3.amazonaws.com/0/18104/81fb1400-6a1e-b87f-c53a-59bc5935ed8a.jpeg)

#func0
```
msg.url = msg.payload.url;
return msg;
```

#func1
```
msg.res.header('Access-Control-Allow-Origin', '*');
msg.res.send(msg.payload);
return msg;
```

#サンプルコード
```
$.ajax({
    type: 'get',
    url: 'http://node-red /proxy?url=www.data4citizen.jp/app/users/openDataOutput/json/get/aizuwakamatsu_map',
    success: function(res) {
        alert('success');
    },
    error: function(res) {
        alert('err!');
    }
});
```