OmniAICreator/Qiita-1.07M huggingface dataset:
Karabiner-Elements で左右の Cmd 単押しに英数とかなを割り当てる

**本家で `complex_modifications` が設定できるようになったため fork を使わなくても良くなりました**

[`to_if_alone` 設定例](https://github.com/rhysd/dogfiles/blob/master/karabiner.json)

`complex_modifications` はかなり細かく設定ができるようで，下記のリポジトリでより複雑な設定例を見ることが出来ます．
[pqrs-org/KE-complex_modifications](https://github.com/pqrs-org/KE-complex_modifications)

また，下記のページから設定例をインポートできるようです．
https://pqrs.org/osx/karabiner/complex_modifications/

---

僕は IME をトグルで切り替えると今どっちの入力にいるのか分からなくなって嫌なので Mac でも Linux でも Windows でも英数入力への切り替えと日本語入力への切り替えを別のキーに割り当てています．
Karabiner-Elements 本家ではまだ Cmd などの modifier の単押しはできなくて，仕方なく Mac 上では Cmd+Enter でトグルしていたのですが，それを実装した fork がありました．

https://github.com/wwwjfy/Karabiner-Elements/releases

ここから **0.90.72を** ダウンロードしてインストールすると，`~/.config/karabiner/karabiner.json` に `standalone_keys` という設定を書けるようになります．最新の 0.90.76 は少なくとも僕の手元では正しく動いていませんでした．

```json
{
    "profiles": [
        {
            "name": "Default profile",
            "devices": [],
            "fn_function_keys": {
                "f1": "display_brightness_decrement",
                "f10": "mute",
                "f11": "volume_decrement",
                "f12": "volume_increment",
                "f2": "display_brightness_increment",
                "f3": "mission_control",
                "f4": "launchpad",
                "f5": "illumination_decrement",
                "f6": "illumination_increment",
                "f7": "rewind",
                "f8": "play_or_pause",
                "f9": "fastforward"
            },
            "selected": true,
            "simple_modifications": {
                "caps_lock": "left_control",
                "grave_accent_and_tilde": "escape",
                "left_command": "left_command",
                "right_command": "right_command",
                "right_shift": "grave_accent_and_tilde"
            },
            "standalone_keys": {
                "left_control": "escape",
                "left_command": "japanese_eisuu",
                "right_command": "japanese_kana"
            },
            "virtual_hid_keyboard": {
                "caps_lock_delay_milliseconds": 0,
                "keyboard_type": "ansi",
                "standalone_keys_delay_milliseconds": 0
            }
        }
    ]
}
```

`simple_modifications` に `"left_command": "left_command"` のように書いておくことで，デフォルト（モディファイアキーとして使うとき）では普通の左コマンドキーとして使い，単押しした時のみ `standalone_keys` の設定が使われ英数入力に切り替わります．

まとめるとこんな感じの設定になっています．

- 左Cmd → 通常時は左Cmd，単押し時は英数キー
- 右Cmd → 通常時は右Cmd，単押し時はかなキー
- バッククォートキー → escape
- 右Shift → バッククォートキー
- capslock → 通常時は左Ctrl，単押し時は escape

この `standalone_keys` 拡張はすでに PR も出ていて，スレの長さから要望がかなりあるのも分かるのですが，メイン開発者の tekezo さんはまだ姿を見せていません．早くマージされるかそれ相当の機能が入ってほしい…

https://github.com/tekezo/Karabiner-Elements/pull/247
エクセルファイルの数式を、文字列として取得する in Python

Pythonで、エクセルファイルの数式を文字列として取得する方法。

調べたところ、XLSXファイルなら[openpyxl](https://openpyxl.readthedocs.io/en/default/index.html)というライブラリが使えるようだ。ただし弱点は、数式の結果を取得することができないところ。

XLSファイルの場合、[xlrd](https://github.com/python-excel/xlrd)で読み込みができるが、数式そのものを取得することができないらしい([参考](http://stackoverflow.com/questions/4690423/get-formula-from-excel-cell-with-python-xlrd))。今度は逆に、値のみ手に入る。


下記は、動作実験。
openpyxlを使って、数式付きのXSLXファイルを作成し、それを"test.xlsx"として保存。さらに、このファイルを読み込んで数式部分を文字列として取得する。

```py3
import openpyxl


# 1. Create a XLSX file #

wb = openpyxl.Workbook()
ws = wb.active

# can access a cell by:
# - cell(row = 1, column = 1)
# - cell["A1"]
for i in range(1, 11):
    # note: cells are one-based
    ws.cell(row = i, column = 1).value = i
ws["C1"].value = "=SUM(A1:A10)"

wb.save("test.xlsx")


# 2. Read and get formula 

x = openpyxl.load_workbook("test.xlsx", data_only = False)
s = x.active
print("formula at C1 is...", s["C1"].value)
# Note. openpyxl does not read the computed value of cells
```
dockerコンテナにファイルを転送する

#はじめに
ローカルからリモートへファイルを転送することはよく行うのですが、dockerのコンテナへファイルを転送するところで詰まったのでまとめ。

参考にしたのは下記のリファレンスです。
http://docs.docker.jp/engine/reference/commandline/cp.html?highlight=cp

#ローカルからコンテナへ

```
docker cp [オプション] ローカル・パス|- コンテナ:パス
docker cp /tmp/local_file.php container_test1:/tmp/local_copy_file.php
```

これでローカルのtmpディレクトリにあるファイルをコンテナ内のtmpディレクトリのファイルへコピーができました。
コピー先にファイルを指定しない場合には新しく作成されます。

#コンテナからローカルへ

```
docker cp [オプション] コンテナ:パス ローカル・パス|-
docker cp container_test1:/tmp/container_file.php /tmp/container_copy_file.php
```

これでコンテナからローカルへファイルのコピーができました。
OpenVPNに必要なTAP-Windowsがインストールできなくて詰んだと思ったけど解決した件

##はじめに
会社でOpenVPN接続をする必要があり、OpneVPNをインストールしていざ接続しようとしたが、エラーが出て接続できず、半日ぐらい格闘した際のメモ。

##詰むまでの流れ
①タスクバーにあるOpenVPNを右クリック＞接続先を選択＞接続
②「接続先名への接続に失敗しました」というダイアログが出る
③ログに「There are no TAP-Windows adapters on this system.」と出ている
④TAP-Windowsのインストーラーを[OpneVPNのサイト](https://openvpn.net/index.php/open-source/downloads.html)より、ダウンロード（	tap-windows-9.21.2.exe）
⑤ダウンロードしたexeをダブルクリック
⑥「指定されたデバイス、パス、またはファイルにアクセスできません。アクセス許可がない可能性があります。」というエラーが出る
⑦アンチウイルスソフトのコンパネを見るとTAP-Windowsのexeのパスが隔離マネージャという欄に入っている
⑧以下を試すが全く手ごたえ無し。詰む。
・exeを右クリック＞管理者で実行
・exeを右クリック＞プロパティ＞全般タブ＞セキュリティのブロック解除
・exeを右クリック＞プロパティ＞セキュリティタブ＞ログインユーザーにフルコントロールを設定
・管理者権限でログインし、上記と同じことを試す

##解決方法
驚くほど簡単で、社内のインフラチームに相談したところ、PCを集中管理しているサーバ側のアンチウイルスソフトの設定で、該当のexeファイルが隔離対象として設定されていた（理由は不明とのこと）ので、その設定を解除してもらった。だけ。
つまり、自PC上で、どうあがいてもインストールは出来なかったということ。
無事、TAP-Windowsがインストールでき、OpenVPNの接続も成功。
MATLABでビン幅対数のヒストグラムの作成


# 三行で

- `histogram()`は引数`edge`を指定することでビンの両端の値を指定することができる
- `logspace()`で対数的に等間隔な点を作成する => これを`edge`として使用
- `set(gca, 'Xscale', 'log')`でx軸を対数軸にする

# ヒストグラムの作成 - [`histogram()`](https://jp.mathworks.com/help/matlab/ref/histogram.html "ヒストグラム プロット - MATLAB histogram - MathWorks 日本")

MATLABでヒストグラムを作成する場合，`hist()`[^1]や`histogram()`を使用する．
通常，これらの関数はビン幅が一定のヒストグラムを作成する．

[^1]: 少なくともR2016aでは`hist()`は非推奨

`histogram()`では第2引数`edge`を指定することで，各ビンの境界を指定することができる．
対数的に等間隔な数列が格納されたベクトルを`edge`に渡すことでビン幅を対数間隔にすることができる．

# 対数的に等間隔な点の作成 - [`logspace()`](https://jp.mathworks.com/help/matlab/ref/logspace.html "対数的に等間隔なベクトルの作成 - MATLAB logspace - MathWorks 日本")

MATLABでは，`linspace(a,b,n)`で両端$a,b$，要素数$n$の線形に等間隔な点を持つベクトルを作成することができる．

```MATLAB
>> linspace(-2, 3, 6)
ans =

    -2    -1     0     1     2     3
```

同様に，対数的に等間隔な点を持つベクトルを`logspace()`で作成することができる．
`logspace(a,b,n)`は両端$10^a,10^b$，要素数$n$のベクトルを作成する．

```MATLAB
>> logspace(-2, 3, 6)

ans =

   1.0e+03 *

   0.000010000000000   0.000100000000000   0.001000000000000   0.010000000000000   0.100000000000000   1.000000000000000
```

# x軸を対数軸化 - `set(gca, 'Xscale', 'log')`

`histogram()`は標準でx軸，y軸共に線形なヒストグラム(Figure)を作成する．
`set(gca, 'Xscale', 'log')`とすることで，最後に生成したFigureのx軸を対数軸にすることができる．

# 作成例

10,000個一様乱数を生成してヒストグラムを作ってみる．

```histo_example.m
clearvars;

% 10,000個の乱数を生成
rng(0, 'twister');
data = 1000 * rand(10000, 1);

% edge
edge = logspace(-3, 4, 29);

% ヒストグラム作成
histogram(data, edge);

%　fig1
print -dpng -r300 'fig1.png'

% x軸対数化
set(gca, 'Xscale', 'log');

% fig2
print -dpng -r300 'fig2.png'

% (おまけ) y軸対数化
set(gca, 'Yscale', 'log');

% fig3
print -dpng -r300 'fig3.png'

```


## fig1 (`histogram()`の出力そのまま)

![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/28382/bb932a39-0b4c-375e-1013-4758a179a590.png "fig1.png")

## fig2 (x軸を対数化)

![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/28382/86d1eef7-5cbf-f56d-8800-1f4919236b1b.png "fig2.png")

## fig3 (y軸も対数化)

![fig3.png](https://qiita-image-store.s3.amazonaws.com/0/28382/976c7757-2691-91d6-5c6b-b69fc5329099.png "fig3.png")
文字に色を付ける

#概要
チャットやアイテムの文字に色を付ける方法です。

バニラの金リンゴみたいなアイテムが作成できるようになります。

#使い方

com.mojang.realmsclient.guiパッケージのChatFormattingを使用します。

ChatFormatting.色 で、色の取得が出来るので、それを色を変更したい文字の前にくっつけます。

```java:ItemHogeHoge.java

public class ItemHogeHoge extends Item {

    public String getItemStackDisplayName(ItemStack stack)
    {
        String origin = super.getItemStackDisplayName(stack);
        return ChatFormatting.GOLD + origin;
    }

}

```

このソースではItemの名前の色をゴールドに変更します。

##実行結果

![無cc題.png](https://qiita-image-store.s3.amazonaws.com/0/159856/5181f202-436a-6d06-409c-c26616303b80.png)

※名前やテクスチャ、jsonは別で指定しています

#おまけ
ChatFormattingクラスは、バニラに元からある[仕組み](http://minecraft-ja.gamepedia.com/%E8%A3%85%E9%A3%BE%E3%82%B3%E3%83%BC%E3%83%89)を利用しやすくしたUtilクラスなだけなので、
文字の前に```§6```と書いたりしても色の変更は出来ます。
Ruby on Rails ~herokuにアップしたRailsアプリで、Amazon S3(AWS)に画像を保存する（コードメモ）

※Railsアプリのherokuへのデプロイは前回の記事を参照。
Ruby on Rails ~herokuにRailsアプリをデプロイ(アップロード)する方法（コードメモ）
〜　
http://qiita.com/wtb114/items/723d9ccdc00489476b8d

herokuにデプロイ後は多くの人が、
「せっかく本番環境のデプロイに成功したのに画像が保存されない。」という問題にぶつかります。
herokuでは、サムネイルなどに使用したアップロード画像を保存できないため、別にアップロードサーバーを用意する必要があります。

そこで、画像の保存先をAmazon S3に指定してみたいと思います。
(アプリはpaperclipを使用しています。）
※Amazon S3は1年間無料。（制限あり）

今回はUserページのavatarを、paperclipでアップロードできるように実装しています。

#1.Amazon S3に登録。

https://aws.amazon.com/jp/?tag=vig-20
にアクセス。
アカウントを持っていない場合はサインアップしてログインしましょう。
途中クレジットカード情報の登録と認証電話のプロセスがあります。プランはひとまずBasic(無料)を選択。

・トップページの「アカウント」タブから「セキュリティ認証情報」をクリック。
↓
・「アクセスキー」から「新しいアクセスキーを作成」。
アクセスキー情報を表示させ、大切に保管しておいてください。
アクセスキーIDとシークレットアクセスキーは後ほど使うのでメモしておいてからウィンドウを閉じてください。
↓
・「サービス」タブから「ストレージ」の「S3」をクリック。
↓
・「バケットを作成」から任意の名前で作成。リージョンは「Tokyo」を選択。

これでひとまず登録作業は完了です。

#2.Gemfileの編集

```
Gemfile

  gem 'paperclip', '~> 4.3'
  gem 'aws-sdk', '< 2.0'

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

#3.paperclipの環境設定

1.で生成したアクセスキーIDとシークレットアクセスキー、バケット名を用意。
リージョンは適切な形に変換しホスト名を指定する必要があります。（Tokyoの場合は "ap-northeast-1"、ホスト名は"s3-ap-northeast-1.amazonaws.com"）。
その他の場合は、下記を参照してください。
http://docs.aws.amazon.com/general/latest/gr/rande.html?tag=vig-20#s3_region

今回はユーザーページにアップロードする画像をAWSのS3にアップロードするので、
Userモデルに下記を追加します。

```app/models/user.rb


  if Rails.env.production?
    S3_CREDENTIALS={access_key_id: "アクセスキーID", secret_access_key: "シークレットアクセスキー", bucket:"バケット名", s3_host_name: "s3-ap-northeast-1.amazonaws.com"}#東京の場合
  end

  if Rails.env.production?
  has_attached_file :avatar, storage: :s3, s3_credentials: S3_CREDENTIALS,
  styles: { medium: "300x300!", thumb: "100x100!>"}, path:":attachment/:id/:style.:extension"
  else
    has_attached_file :avatar, styles: { medium: "300x300!", thumb: "100x100!>"}
  end

```

以上で、paperclipでアップロードした画像がAmazon S3に保存されるようになります。
jupyterこれだけは知っておくべきリスト

## 起動
```
jupyter notebook
```
## 行内にグラフを表示
```
%matplotlib inline
```

## 実行
`shift+Enter`

## 補完
しかるべきところで　`tab` そこまで強力ではない

## ショートカット
- `esc+M` ->　マークダウンモード
- `esc+Y` -> コードモード
- `esc+L` -> 行番号を表示
- `esc+A` -> セルを上に挿入
- `esc+B` -> セルを下に挿入
- `esc+DD` -> セルを削除

これだけあれば困らない。
[JavaScript] [jQuery UI] 動的・汎用的・使い捨てなダイアログ（ポップアップ）の表示

**jQuery UI にはダイアログ表示に便利な dialog メソッドが用意されています。通常の使い方としては、あらかじめ html 部分でダイアログの UI を定義しておきますが、事前の html 定義不要で、JavaScript のみで動的に生成することもできます。**

▼ダイアログ表示例
![dialog.PNG](https://qiita-image-store.s3.amazonaws.com/0/36751/c5cd3c43-ae53-29ca-62a0-006ae30e7697.png)


# ![](//goo.gl/tuSQrq) １）jQuery UI などの定義

まず初めに jQuery および jQuery UI の宣言が必要です。ダウンロードするのは面倒なので、今回は [CDN](https://code.jquery.com/) のを使います。

```html:html
<head>
<link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script type="text/javascript" src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
</head>
```


# ![](//goo.gl/tuSQrq) ２）テスト用ボタンの作成

次に、テスト用のボタンを設置します。

```html:html
<body>
<button id="btn1">ダイアログ表示</button>
</body>
```


# ![](//goo.gl/tuSQrq) ３）ダイアログ表示処理

ボタンを押すと、ダイアログが表示されるように、処理を記述します。

```js:JavaScript
// ボタン押した時の処理
$("#btn1").click(function(){
	// ダイアログ用のボタン（配列）
	var buttons = [
		{
			text: "OK",
			click: function () { alert("OK!!"); }
		},
		{
			text: "閉じる",
			click: function () { $(this).dialog('close'); }
		}
	];
	// ダイアログを表示
	showDialog("たいとる", "めっせーじ", buttons);
});

//------------------------------
// ダイアログ表示
//------------------------------
function showDialog(title, message, buttons) 
{
	var html_dialog = '<div>' + message + '</div>';
	$(html_dialog).dialog({
		title:   title,
		buttons: buttons,
		close:   function() { $(this).remove(); }
	});
}
```

※動的に生成しているので、ダイアログの close イベントで、きちんと破棄するようにしています。

デモはこちら。
https://jsfiddle.net/yasumodev/7d4n6ryn/2/

(･o･ゞ いじょー。
Ionic2 でプロジェクト作成から実機で実行まで

# Ionic2 とは
モバイルアプリ向けのUIフレームワーク [Ionic](https://ionicframework.com/) のバージョン2で、Ionic では AngularJS に最適化されていましたが、Ionic2 では Angular2 を採用しています。

[公式ドキュメント](https://ionicframework.com/docs/v2/components/)を見て分かるように、簡単なコードで iOS / Android / Windows の表示に最適化されたネイティブに近いUIが実装できます。

# インストール
cordova と Ionic の CLI(Common Language Infrastructure)をインストールします。
[Node.js](http://nodejs.org/)がインストールされていない場合は、先にインストールしておいてください。

```
$ npm install -g cordova ionic
```
以前は `ionic@alpha` や `ionic@bata` と指定していましたが、何も指定せず`ionic`だけで良くなりました。

Getting Started with Ionic
https://ionicframework.com/getting-started/

# プロジェクト作成
```
$ ionic start --v2 myApp tabs
```
`--v2` を指定しない場合は Ionic(AngularJS) となりますので、必ず `--v2` を指定してください。
以前は、TypeScriptのプロジェクトを作成する場合に `--ts` を指定していましたが、デフォルトで TypeScript のプロジェクトが作成されるようになりました。
`tabs`を指定した場合はタブベースのひな形で作成されますが、他に`blank`、`sidemenu`も指定可能です。
省略した場合はタブベースになります。

# ブラウザで実行
プロジェクトのディレクトリに移動して `ionic serve`コマンドを実行すると、Webブラウザが起動してアプリが実行されます。

```
$ cd myApp
$ ionic serve
```
Chromeの場合、[F12]で開発者メニューを開いて![Chrome-device-button.png](https://qiita-image-store.s3.amazonaws.com/0/158277/c2376983-97ef-a849-5760-9455f494bf49.png)ボタンを押すとスマホに最適化された表示にできますが、WEB開発者向けブラウザ [Blisk](https://blisk.io/) をインストールしておくと、スマホ画面とPCブラウザ画面が同時に表示できて便利です。

Download Blisk - a browser for web developers
https://blisk.io/

実行中はコードを編集すると自動でブラウザがリロードされますので、修正するたびに実行する煩わしい手順は必要ありません。

# 実機で実行
アプリを実機のiPhoneで実行する場合は Mac に Xcode をインストールして・・・
というのは結構手間がかかるので、今回はクラウドへアップロードして **Ionic View** というアプリを使用して実機で実行します。

iPhone は [App Store](https://itunes.apple.com/jp/app/ionic-view/id849930087?mt=8)、 Android は [Google Play](https://play.google.com/store/apps/details?id=com.ionic.viewapp&hl=ja) からアプリをインストールします。

インストールしたアプリ、または [ionic.io](http://ionic.io/)でアカウントを作成します。

ionicプロジェクトのディレクトリで以下のコマンドを実行して、クラウドへアップロードするためのツールをインストールします。

```
$ npm install @ionic/cloud-angular --save
```

以下のコマンドを実行すると、初回は Email と Password を要求されるので、先ほど登録したアカウントの情報を入力します。

```
$ ionic io init
```

`upload`で現在の状態をクラウドへアップロードできます。

```
$ ionic upload
```

先ほどインストールした Ionic View を起動し、作成したアカウントでログインすると、アップロードしたアプリが表示されていると思います。
これを選択して、 **VIEW APP** でアプリを実行できます。

アプリ実行中に画面を三本指でスワイプアップするとメニューへ戻れます。

# まとめ
Ionic２は、インストール、プロジェクトの作成、実行、アップロードまで全てコマンドラインで簡単に行うことができます。
Ionic2で開発を始めてみましょう！
Safariにselenium-webdriverを通してselenideで実行する

#はじめに

MacOSを再インストールしなおしたのでwebdriverも入れ直します。
ついでにjavaのテストフレームワークselenideから動作できるように設定して行きます。

# 動作環境

2017/01/17時点で以下の環境で実行しました
・MacOs Sierra
・safari 10.0
・Gradle 3.3
・IntelliJ IDEA

# 参考サイト

[Safari 10 の WebDriver ネイティブサポート](http://qiita.com/hiroshitoda/items/6ee3ad892357cda3f0e0) 
[Safari 10、WebDriverを搭載](https://www.infoq.com/jp/news/2016/06/safari-webdriver) 

# 導入

1. webdriverをインストール
2. Gradleにselenideを設定
3. Javaでテストソースコーディング & テスト実行


## webdriverをインストール

safari10より標準で入っている模様
だが下のステップを踏んでいく。

まずはsafariの「リモートオートメーションを許可する」をonにする。

![スクリーンショット 2017-01-16 20.11.26.png](https://qiita-image-store.s3.amazonaws.com/0/106929/fd69b028-003e-0ae5-c7c7-c576f7bd9170.png "スクリーンショット 2017-01-16 20.11.26.png")

ターミナルより初回起動を実行する。
touchbar搭載機の場合はtouchIDでパスを入力しなくても良い。

```lang:コマンド
/usr/bin/safaridriver --port 0
```

## build.gradle

```groovy:build.gradle
buildscript {
    ext {
        // SpringBoot framework
        springBootVersion = "1.4.3.RELEASE"// 2016,1223

        // Others
        // Selenide
        selenideVersion = "4.2"// 2016,1226
        // Selenium
        seleniumVersion = "3.0.1"// 2017,0117
    }
    repositories {
        jcenter()
    }
}
ext['selenium.version'] = '3.0.1'// 2017,0117
dependencies {

        // SpringBoot projects
        testCompile("org.springframework.boot:spring-boot-starter-test:$springBootVersion")
        compile("org.springframework.boot:spring-boot-starter-thymeleaf:$springBootVersion")
        compile("org.springframework.boot:spring-boot-starter-web:$springBootVersion")

        // Others
        // Selenide
        testCompile("com.codeborne:selenide:$selenideVersion")
        testCompile("org.seleniumhq.selenium:selenium-server:$seleniumVersion")
        // SafariDriver
        testCompile("org.seleniumhq.selenium:selenium-safari-driver:$seleniumVersion")

}
```

## Springbootに組み込み、テスト実行

```java:PageControllerSelenideTest.java
public class PageControllerSelenideTest {

	@BeforeClass
	public static void setUpClass() {

		// テスト対象アプリの起動
		WebApp.main(new String[]{""});
		Configuration.browser = WebDriverRunner.SAFARI;
	}
	@After
	public void tearDown() {
	}


	@AfterClass
	public static void tearDownClass() {
		WebDriverRunner.closeWebDriver();
	}

	@Test
	public void test() throws Exception {
		// Test対象画面をページオブジェクトパターンで実装
		ChoiceQuestionPage page = ChoiceQuestionPage.open();

		Selenide.screenshot("init");
	}
}
```

IntelliJから実行するとこんな感じでスクショ撮ってくれている
![スクリーンショット 2017-01-17 21.21.56.png](https://qiita-image-store.s3.amazonaws.com/0/106929/35336612-7828-526a-4b2d-494113e7bb18.png "スクリーンショット 2017-01-17 21.21.56.png")

# 苦労したこと
IntelliJの依存関係の中で、seleniumがひたすら古いバージョンを参照していてエラーが頻発していました。
spring-boot-starter-webをデフォルトで使用していると古いバージョンを引っ張ってしまうようです。
原因は下記ページを覗けばなんとなく伝わるかと思います。
[spring-boot-dependencies](https://github.com/spring-projects/spring-boot/blob/master/spring-boot-dependencies/pom.xml)
また、Safariのライブラリがselenideから除外されていたり、参考にするページがなかったりとひたすらtry&errorを踏んでいました。

# ソースはこちら
[MultiModule-Sudoku](https://github.com/mabubu0203/MultiModule-Sudoku/tree/master/micro-web/src/test/java/jp/co/valtech/sudoku/web/controller)
【プログラミング知識ゼロでもできる】Slackの発言をLineにzapierを使って転送する方法

# 概要
僕の職場では、障害が発生するとSlackのとあるチャンネルで障害についてのやりとりを行うようになっていて、
障害状況をPCを開いていない人向けにLineで報告しています。
ただ、障害状況をLineで報告するのに、わざわざLineを開くという作業が面倒だったので、
Slackのチャンネルから任意の発言のみをLineに送る仕組みを作ってみました。

# 方法
タイトルにもある通り、[zapier](https://zapier.com)を使うと、Slackへの通知をLineに転送できます。
(zapierはIFTTTのように、とあるサービスのアクションをトリガに、別のサービスでアクションを行う」ことのできる便利ツールです。)
また、zapierはIFTTTのようにLineへの通知をAppレベルでサポートしていなかったので、Lineへの通知はLine Notifyを使いました。

## Line Notifyの設定
別の方がスクショ付きで丁寧に解説していたので下記を参照してtokenのコピーまで行ってください。
http://qiita.com/takeshi_ok_desu/items/576a8226ba6584864d95

## zapierの設定
zapierのアカウントがなければアカウントを発行して、下記URLにアクセスして「MAKE A ZAP!」のボタンをクリックしてください。
https://zapier.com/app/dashboard

### トリガの設定
トリガの設定では、「Slack」を選択して、適当に設定をしてください。
※ものすごく親切なUIだったので迷うことはないはずです。

### フィルターの設定
トリガとしてSlackを選択しただけでは、すべての発言に反応してしまうので「Filter」を新たに追加して、
特定の発言にのに反応するように条件を設定します。
(僕は、SlackのTextを条件に、特定の文字列（@line-notify）が入っている時にのみ通す設定しました）

### アクションの設定
zapierにはWebhookと呼ばれるAppがあり、これを使うとHTTPのGETやPOSTを行えます。
このAppはPOST時のHEADERやFORMを指定できて、
すごいことにトリガで設定したAppのリクエストデータをここで使うこともできてしまうのです。

設定方法は、Line NotifyにPOSTできればいいので、メソッドをPOSTにして下記の通り設定します。
※ スクショにはないですが、HeadersのKeyに「Authorization」を設定して、
valueにあらかじめ取得したLineのtokenをBearerの文字列とともに「Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxx」のようにセットしてください。
![スクリーンショット 2017-01-17 20.44.53.png](https://qiita-image-store.s3.amazonaws.com/0/50185/617b22d3-6a64-5876-2945-196fa3954edc.png)

すべての設定を終えたら、Zapを有効にすれば完了です。

# 最後に
この機能を実現しようとした時に、最初は[botkit](https://github.com/howdyai/botkit)を使うか、[OutgoingWebhooks](https://api.slack.com/outgoing-webhooks)を使うか迷ったのですが、
わざわざ、これしきの機能のためにサーバを作って常駐プロセスを立てるのが嫌だったので別の方法をさがしてみることにしました。
（※常駐プロセスは突然死したりすることもあって、死活監視したりするのが面倒だったため・・・）

そこで、Slackからの発言をトリガとしてLineに通知できるように
[IFTTT](https://ifttt.com/create)を使ってみようと思ったのですが、
残念ながらIFTTTではSlackの発言をトリガにできないようだったので、
IFTTTよりもマイナー(?)でも、強力なツールとして名高いzapierを使ってみました。

Zapierであれば、非エンジニアでも簡単にChatOps的なことが実現できるほどに簡単&便利なので、
botやサーバを立てるのが億劫な皆さんの参考になればと思います。

（他にいい方法があれば教えてください:older_man_tone1:）
macOS Sierraでスクリーンショットを影なしにする

ニューマシンにする度に設定変更するのを苦々しく行っています。
影、邪魔だと思うんですよ。

 ![スクリーンショット 2017-01-17 20.52.43.png](https://qiita-image-store.s3.amazonaws.com/0/8405/f4d480a6-2b88-ad2e-c1dd-0398c5e1d3d2.png)

## いつもの手順

```
$ defaults delete com.apple.screencapture disable-shadow
$ killall SystemUIServer
```

とすればOK。

[Macのスクリーンキャプチャ機能で撮影したウインドウの影をなくす方法 / Inforati](http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-disable-shadow-effect-of-macos-screen-capture.html)

にて、随分前から紹介されております。

しかし、今回はエラーがでてしまいました。macOS Sirraが悪いのか、それとも他の要因なのかは分かりません。

## 新しい手順

```
$ defaults write com.apple.screencapture disable-shadow -bool true
$ killall SystemUIServer
```

[Disable Window Shadows on macOS Screenshots – 512 Pixels](https://512pixels.net/2017/01/disable-window-shadow-on-macos-screen-shots/)

上記にて紹介されていました。

![スクリーンショット 2017-01-17 21.00.44.png](https://qiita-image-store.s3.amazonaws.com/0/8405/2ea98cb6-9e21-069f-dca1-cb6e4d4edd2e.png)

これで影なしにする事ができ、よりスクリーンショットをすっきりと見せられるようになりました。

## 解説

調べたらやります。※ 識者の方、解説してもらえたら幸せです。
Andorid Chrome からのアクセスで、Django CSRF検証が失敗したりログインできなかったりする場合

## 環境

Django 1.9
Android Chrome ( おそらくドルフィンとかでも )

## 現象

Django のログインフォームなどに Android の Chrome でアクセスした時、CSRF のエラー (403) が出てログインできない。

Django ログには `CSRF cookie not set.` のメッセージが残る。


## 概要

おそらく、リクエストクッキーにマルチバイトが含まれてサーバに送られています。

僕のケースでは、Google Analytics が入れたクッキー ``__utmz`` に日本語が入っていて、不具合が出てました。

それを Django が受取り、Python の http ライブラリのクッキーパーサ `http.cookies` の正規表現 `http.cookies._CookiePattern` でパースしますが、その正規表現パターンは `flags` に `re.ASCII` が指定されているので、マルチバイトが出てきた所でパースが終わってるようです。

## 対応

僕は WSGIRequest の COOKIES をパッチしました。マルチバイトをURLエンコードしてみました。

```python
def patch_wsgi_request():
    """
    クッキーに日本語が含まれている場合、クッキーのパースが失敗するので
    パース前にURLエンコードする
    Android + Google Analytics でよく出る
    __utmz に日本語が入る
    """
    import re
    from urllib.parse import quote
    from django.core.handlers.wsgi import WSGIRequest
    from django import http
    from django.core.handlers.wsgi import get_str_from_wsgi
    from django.utils.functional import cached_property

    def _quote(s):
        return quote(s.group(0))

    def COOKIES(self):
        raw_cookie = get_str_from_wsgi(self.environ, 'HTTP_COOKIE', '')
        re_multibyte = re.compile(r'[^\x00-\x7F]+')
        raw_cookie_fixed = re_multibyte.sub(_quote, raw_cookie)
        return http.parse_cookie(raw_cookie_fixed)

    setattr(WSGIRequest, 'COOKIES', cached_property(COOKIES))

patch_wsgi_request()
```

このコードをどこか (urls.py の評価タイミングとか)で実行
git amで他人のコミットをパッチとして当てる方法

Gitを使っていると、代理でパッチを当てたいときがでてきます。そういうときは、[git-amコマンド](https://git-scm.com/docs/git-am)[^1]を使うことで、情報を欠落しないままコミットすることができます。

[^1]: `git-am`のamは、**Apply a series of patches from a mailbox**の略のようです。

# パッチを当てる手順
1. Pull RequestやMerge Request、Commitから、メールパッチを作成する
1. メールパッチを`mail.patch`としてファイルに保存する
1. `git am mail.patch` のようにしてコミットする

# メールパッチを入手する
Pull RequestやMerge RequestのURIがある場合には、`.patch`にアクセスすることでメールパッチが入手できます。

## [Gitlab](https://about.gitlab.com/)の例
Merge RequestのURI: `https://gitlab.*****.net/******/*****/merge_requests/162`
パッチのURI: `https://gitlab.*****.net/******/*****/merge_requests/162.patch`

## [GitHub](https://github.com/)の例
Pull RequestのURI: `https://github.com/******/*****/pull/162/files`
パッチのURI: `https://github.com/******/*****/pull/162.patch`

## メールパッチの例
メールパッチは、次のようにdiffに加えてコミット時刻、メッセージ、メールアドレス、名前が一緒に入っています。`git-am`を利用することで、コミットの情報を欠落させないまま、コミット適用することができます。

```
From 838715587106f46dc8be4a6faf3ed8ce55ecfc5a Mon Sep 17 00:00:00 2001
From: Kohki YAMAGIWA <xxxxxxx@gmail.com>
Date: Mon, 20 Jul 2015 06:49:43 +0900
Subject: [PATCH] bagfix(labeling) & add assertion

---
 ccv.py | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/ccv.py b/ccv.py
index 52698d4..b19e0b5 100644
--- a/ccv.py
+++ b/ccv.py
@@ -53,11 +53,12 @@ def ccv(src, tau=0, n=64):
     for a,c in zip(areas,coord):
       area_size = a[0]
       x,y = c[0], c[1]
-      bin_idx = int(ch[y,x]//(256//n))
-      if area_size >= tau:
-        alpha[bin_idx] = alpha[bin_idx] + area_size
-      else:
-        beta[bin_idx] = beta[bin_idx] + area_size
+      if (x < ch.shape[1]) and (y < ch.shape[0]):
+        bin_idx = int(ch[y,x]//(256//n))
+        if area_size >= tau:
+          alpha[bin_idx] = alpha[bin_idx] + area_size
+        else:
+          beta[bin_idx] = beta[bin_idx] + area_size
   return alpha, beta
```

# 参考資料
* https://git-scm.com/docs/git-am
さくらのクラウドのCentOS7にリモートデスクトップ接続する環境を作るスタートアップスクリプト

また仮想デスクトップです。
仮想デスクトップはロマンです。

さて、前回([さくらのクラウドに10秒でリモートデスクトップできる環境を作る](http://qiita.com/Dalice/items/96a9c141eae14167473f))はISOを作成するというプロセスが面倒くさかったので、順当にスタートアップスクリプトでサーバ作成の初回のセットアップで全部を対応したと思います。

スタートアップスクリプトのコードはこちらに掲載しています。
各自コントロールパネルからスタートアップスクリプトに登録してください。
[CentOS 7にXRDPをインストールするGist](https://gist.github.com/dalice/86f11631932897f65375c5523dc0a185)

サーバ作成時にCentOS7とこちらのスクリプトを選択することで、サーバの作成時に設定したスクリプトが実行され、作成から10分～15分後くらいにサーバに設定したIPアドレスに手元のリモートデスクトップクライアントから接続するとGnomeの環境が出迎えてくれます。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/100935/cb892b44-8f21-f848-7ce9-f825dbf6f355.png)
日本語フォントもブラウザもインストールされているので、すぐにでも使い始めることができます。
これで必要なときに必要なだけデスクトップ環境を利用することができます。

作成にあたってこちらのスクリプトを大変参考にさせていただきました。ありがとうございます。
[vagrant で立ち上げたCentOS 7 にリモートデスクトップ+日本語環境設定を行うシェルスクリプト](http://qiita.com/k_nakayama/items/a5b098eda33aa5753732)
デスクトップ版Ubuntuでネットワーク設定

## 経緯
- Ubuntuで**GUI上で**固定IPを降った後に，作業をしていたらDNSエラーが出たので困った

## 結論
- Ubuntu14.04の**GUI上で**ネットワーク設定をしたものは，/etc/network/interfaces に反映されない
    - 参考： https://forums.ubuntulinux.jp/viewtopic.php?id=17317

> $ sudo emacs /etc/network/interfaces
> $ sudo emacs /etc/resolvconf/resolv.conf.d/base
> を書き直した後，
> $ sudo resolvconf -u
> で設定を更新する

## メモ: それぞれの書き方
- https://forums.ubuntulinux.jp/viewtopic.php?id=17317 には，/etc/resolvconf/resolv.conf.d/baseはゲートウェイのアドレスを書いていたが，DNSサーバのアドレスを書くのが正しい

### /etc/network/interfaces
> interface
> auto eth0
> iface eth0 static 　←dhcpをstaticに変更する
> address 192.168.5.10　←固定するIPアドレス
> netmask 255.255.255.0　
> network 192.168.5.0
> broadcast 192.168.5.255
> gateway 192.168.5.1
> dns-nameservers hoge fuga

### /etc/resolvconf/resolv.conf.d/base
> nameserver hoge  ← DNSサーバアドレス
> nameserver fuga

## ぼやき
- けっこうIP設定してから日にち立ってたのに，pip installが失敗するまできづかなかったのつらい
BigQueryに入れたDatastoreのテーブルをParent KeyでJOINする

DatastoreのレコードをBigQueryに入れるのはこっち参照： http://qiita.com/tab02733/items/966eab11be6845eaf3ee


Datastore Backupから取り込んだtableにあるkey関連のカラム
![image](https://qiita-image-store.s3.amazonaws.com/0/9490/9d65dad7-03bd-7475-9398-a8b88e3d5f97.png)

この中の、`__key__.path`にこんな感じでancestor keyが文字列で入っている。

```
"ParentEntity", "9512e2b44c614b23216...", "ChildEntity", "child_key_name"
```

# SQL関数で`__key__.path`をバラしてやればJOINできた。

```sql
SELECT
  parent.hogehoge
FROM
  [datastore_backup20170117.Parent] parent
LEFT JOIN (
  SELECT
    REPLACE(NTH(2, SPLIT(__key__.path, ', ')), '"', '') parent_key_name
  FROM
    [datastore_backup20170117.Child]) child
ON
  parent.__key__.name = child.parent_key_name
```
ドメインをAWSに移管した

#そもそも
ドメインの管理はムームードメインで行っていました。
ネームサーバなどもムームードメインにあり、自分のサイトのホスティングはEC2でウェブサーバをたてて運営していました。
ですが、IPを固定しているとEC2の値段が高い(月2000円超)のと、EC2を始めた動機も

1. クラウドサーバってカッコイイ
1. Linux勉強したい
2. WEBサーバたててみたい
3. ソースコード管理サーバたててみたい

等の勉強のモチベーションもあったからでした。
ですが運用期間も長くなり必要な知識も得られ、ウェブサーバをS3に移動して安く済ませたくなりました。
そこで表題とはちょっと違う「EC2で公開しているサイトをS3で公開しなおしてみたい」という動機で始めました。

# 実際に必要だったこと
先にまとめると、

1. Route53 にドメインの移管をする
2. ネームサーバ切り替え
3. S3にデータのアップロード
4. S3とRoute53の連携設定
5. 独自ドメインでメール送受信するためにRoute53とSES(WorkMail)の連携設定

でした。
誤算は、ドメインを移管せざるを得なくなり、メール関連も引っ越す必要が出たことでした。
終わってみての感想は、「うーん、いまいち。WorkMailが微妙」でした。

# まずは
[Amazon S3](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Welcome.html)
[Amazon Route53](http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/Welcome.html)
[Amazon Simple Email Serviece(SES)](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/Welcome.html)
これらをいつでも開ける準備をしましょう。
特にSESはメール送受信でサンプルを試すのに死ぬほど見ます。

次に参考になるサイトですが、

1. ドメイン移管に関しては [更新間近なドメインをRoute53へ移管する(serverworks)](http://blog.serverworks.co.jp/tech/2016/07/05/route53_migration/)
2. ネームサーバ設定に関しては [はじめてのAmazon Route 53(Qiita)](http://qiita.com/Yuki_BB3/items/effdf1bb38263bfef82a)
1. [独自ドメインを使ってAmazon S3で静的Webサイトをホストする(Qiita)](http://qiita.com/Ichiro_Tsuji/items/c174d580587a622d3358)

以下はそこにたどりつくまでの変遷とやり方になります。
番号は上の数字とは関係ありません。

# 1. Route53の利用に至るまで
私のサイトは http://xhift.com/ というアドレスで、サブドメインがない状態で運営していました。
どうもこういうルートドメインを公開するためにはRoute53にドメインを移管する必要があるらしく
http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteHosting.html
ドメインの移管の予定はなかったのですが移管することになりました。
ドメインは１度移管すると60日後にしか次の移管が出来ないので、やっぱり戻そうが許されない点に注意が必要です。
移管の手順的には難しいところはないので各自頑張ってください。

# 2. ネームサーバ設定について
最初のはまりポイントでした。
ネームサーバの設定はRoute53の方でやりましょう。
ムームードメインの方で設定項目がうっかり見えてしまっていたのでドハマリしました。
Route53の方でnsの項目を４つ埋めましょう。（私の時は４つでした）
やり方は割愛します。

# 3. EC2のウェブサーバを止めましょう
S3のバケットとRoute53の連携がうまくいっているかわからなくなります。

# 4. WorkMailを使うならSESの設定はギリギリまでタッチしないようにしましょう
おそらくWorkMailの方で設定してくれるはずです。
自分でいじるとちゃんと理解していないと設定しなおせなくなりかねません。

# 5. SESの設定を行うのなら、ルールセットをちゃんと設定すること
受信が出来ないor送信者にエラーが返る場合、ルールセットが上手くいってなさそうです。
私の場合はS3への保存も失敗するしWorkMail側も受信出来ていない絶望的な状況でしたが、ルールセット見直しで修正できました。
それぞれ受信時のActionで

1. S3への書込みの失敗はObject key prefixを空にしたこと（どっかでそうしてみようと見た気がした...）
2. WorkMailへの連携失敗はそもそもActionを追加していないかったこと。

という状況でした。
WorkMailの設定の仕方ですが、Organization ARN が何なのか見つけるまで時間がかかりました...疲れていたのです。 https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/receiving-email-action-workmail.html

# 6. 任意のアドレスにメールが送信できない場合は
Amazonさんにちゃんとサンドボックスから出してもらっているか確認してみましょう。
プログラムで大量送信するわけでもない、と放っておくと、verifyが済んだアドレスにしか送信できなくなります。
ちゃんと申請しましょう。
申請の文章もちゃんとすると許可が下りる可能性が高いと書かれていますが、余程のことがない限りは常識的な範囲は許可が下りるのではないでしょうか。
[Amazon SESの送信制限を解除する（SandBoxの外へ移動する）(infoscoop)](https://www.infoscoop.org/blogjp/2015/07/29/amazon-ses-release-limit/)


# まとめ
1. やりたかったことは全部出来た
2. メールも移行しなくてはいけなくなったのが誤算だった
3. ドメインは60日間移動出来なくなるのでそもそも取組むのかよく検討すること
4. WorkMailはインターフェースは良い
5. だが高い（１人400円/月）し、機能少なくちょいちょいバグる
6. Gmailに転送できなそう

# 結論
びみょう...
メールは今までのままで良かった。


お仕事募集しております
http://xhift.com/
北千住でコワーキングスペースも運営しております
http://xhift.com/bonopri/
Swift3でRealmSwift（サンプルあり）

###アップデートしました
Xcode 10.0
Swift 4.2
Realm 3.12.0

#概要
目新しくもないんですが、RealmSwiftを使って、
なんちゃって家計簿的なサンプルを作ってみました。

概要しか記載してないので、ソース見たい方はどうぞ。
https://github.com/koji-nishida/RealmSwiftSample/tree/master/RealmSample

#完成図
![スクリーンショット 2017-01-17 19.24.28.png](https://qiita-image-store.s3.amazonaws.com/0/38124/b6936634-407b-0b46-a53a-8a4fa69b926c.png)

#1. 導入
1. プロジェクト作成  
まずはプロジェクトを作成。
今回は'RealmSample'としました。
2. インストール  
プロジェクト直下にて以下コマンド実行  
`$ pod init`  
'Podfile'というファイルが作成されるので、以下追記  
`pod 'RealmSwift'`  
インストール
`$ pod install`

![スクリーンショット 2017-01-17 17.05.30.png](https://qiita-image-store.s3.amazonaws.com/0/38124/0d208308-af31-a45e-34cc-4f7a55c391d4.png)

#2. コード作成
###アプリ概要
・品名と金額を入力して「登録」ボタンを押すと、保存される
・登録日時が新しいものから表示する
ただそれだけっ...

###手順
・画面作る(storyboard)
こんな感じです
![スクリーンショット 2017-01-17 19.43.03.png](https://qiita-image-store.s3.amazonaws.com/0/38124/7aca6295-5808-a2df-f5a7-7fa0aa7cd360.png)


・Realmオブジェクト作成  
サポートしている型や、Optional/非Optionalについては、公式？を参照下さい。
https://realm.io/jp/docs/swift/latest/#section-11

```swift:Item.swift

import RealmSwift

class Item: Object{
    // 品名
    @objc dynamic var name: String? = nil
    // 金額
    @objc dynamic var price = 0
    // 登録日時
    @objc dynamic var created = Date()
}
```

・保存

```swift:ViewController.swift
        // 入力値をセット
        let item:Item = Item()
        item.name = self.textName.text
        if ((self.textPrice.text?.characters.count)! > 0) {
            item.price = Int(self.textPrice.text!)!
        }
        
        // 保存
        let realm = try! Realm()
        try! realm.write {
            realm.add(item)
        }
```
 
・一覧取得

```swift:ViewController.swift
override func viewDidLoad() {
        super.viewDidLoad()
        
        // デフォルトRealmを取得
        let realm = try! Realm()
        // 一覧を取得：金額を条件に、登録日時が新しい順でソート
        self.itemList = realm.objects(Item.self).filter("price > 0").sorted(byProperty: "created", ascending: false)
    }
```


と、だいぶ端折りましたが、これだけといえばこれだけです。
コードの詳細はgithub見ていただければと。


#3. 最後に
導入が簡単で、比較的直感的に使えて便利、といったところでしょうか。
色々な型に対応していて、ソートもできて、ページングの考慮もする必要がないらしいので。
Auto Incrementがなくて不便という記事は見かけましたが。
じっくり使ってみたわけではないので、かゆいところに手が届かない的なことも当然あるんでしょうかね？
ghqで管理しているリポジトリを全部updateしたい！！！

任意のshell（bashrcやzshrcとか）に記載してね


```zsh
function ghq-update() { 
  ghq list | sed -E 's/^[^\/]+\/(.+)/\1/' | xargs -n 1 -P 10 ghq get -u
}
```

`xargs -n 1 -P 10` で並列で動くよ！
「Chromeでは動くけど、IEでは動かない」の原因が「'」と「`」を間違えていたことだった話

AngularJSを使用してアプリを作っています。
今日はそのときに少しはまった話です。


# 何が起きたか
AngularJSのFilterを自作しました。
Chromeでは動くけども、IEで動かすと、「Unknow provider」のエラーが。。。

そもそもChromeで動いているし、何でだ?
と思い、Unknow providerを調べていました。


# 原因
IEのコンソールをよーく見ると、「文字が正しくありません。」というエラーが！
filter定義しているファイルは単独のファイルにしていました。ファイル読み込み時に表示されていて見逃していました。。。
確認すると、filter定義のところで「'」(シングルクォート)が「`」(バッククォート)になっていました。

```lang:正解.js
 ・・・
1 angular.module('myApp', [])
2 　.filter('myFilter', [function () {　　//ここ！
3   　return function () {
4     　・・・ 
5   　};
6 　}]);
```

上記は正解です。
L2の`myFilter`の定義のところが以下のように、``になっていました。

```lang:正解.js
 ・・・
1 angular.module('myApp', [])
2 　.filter(`myFilter`, [function () {　　//ここ！
3   　return function () {
4     　・・・ 
5   　};
6 　}]);
```

これが原因でIEでは動いていませんでした。
これはfilter定義のみの話だけではなく、他でも同じようなことが起こりそうです(試したわけではないです)。


静的検証(ESLint等)使って確かめるなどをもっとくせづけていこうと思います。
WRF > 処理グループの期間を検討する > gantt diagramとdateコマンドの利用

```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を使用。
```

WRF(Weather Research and Forecasting Model)関連。

関連 http://qiita.com/7of9/items/f64f8cc72a038de03d35

処理する日数の検討をしている。

- 1つの処理グループの期間を長くしすぎると、終了までの時間が長すぎて扱いにくくなる
- 1つの処理グループの期間を短くしすぎると、別の処理グループとかぶる日数が短くなり、スピンアップタイムによりミスを見つけにくくなる
- スピンアップタイムは10日と仮定してみる
  + さらに3日の予備日を取り、2つのグループの結果を比較する

上記を考慮したスケジュールが以下。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4e28de57-0273-6e3d-7375-668195add69b.png)

### 余談 (作図)

上記は
http://knsv.github.io/mermaid/live_editor/
において以下のテキストを使って作図した。

```
gantt
  title data process groups with spin-up time
  G1_2016/10/20..(26d) : 2016-10-20, 26d
  spinup1(10d) : 2016-11-02, 10d
  overlap(3d) : 2016-11-12, 3d
  G2_2016/11/02..(26d) : 2016-11-02, 26d
  spinup2(10d) : 2016-11-15, 10d
  overlap(3d) : 2016-11-25, 3d
  G3_2016/11/15..(26d) : 2016-11-15, 26d
  spinup3(10d) : 2016-11-28, 10d
  overlap(3d) : 2016-12-08, 3d
  G4_2016/11/28..(26d) : 2016-11-28, 26d
```

開始日と期間の計算はdateコマンドを用いた。
http://qiita.com/7of9/items/389b5b5b25e3ec3c9b5e

### 余談2

~~ganttのスペルは検索すると「gantt」がよく見かけるが、mermaidのヘルプでは「gant」になっている。~~
http://knsv.github.io/mermaid/#styling40
(2019-02-12 gantだったのがganttに修正済のようだ）
docker-nginx を vagrant（centos 7）上で動かしたが、mac（ローカルマシン）から接続できず苦戦した話

## macから疎通できない…
nginx: `nginx:1.10.2-alpine` (Official)
vagrant: `centos7.0-tommy-muehle`

macで`curl 192.168.33.xx:8080`としても`docker logs -f docker_nginx_1`にアクセスログすら流れない。しかしvm上で `curl localhost:8080` とするとちゃんと返ってくる

### 考えたこと１
[vagrant or mac] port forwardingがうまくいっていない

→ (centos)`netstat -tanp | grep LISTEN`
→(mac)`lsof -i -P | grep "LISTEN"`
http://qiita.com/RyujiKawazoe/items/e45d1c5bf9892123d00f
問題なし


### 考えたこと２
[docker] docker-compose.ymlの設定が誤っている 

```
  nginx:
    image: nginx:1.10.2-alpine
    volumes:
     - ./nginx/nginx.conf:/etc/nginx/nginx.conf
     - ./nginx/mynginx.cnf:/etc/nginx/conf.d/mysite.template
    ports:
     - "8080:80"
    environment:
     - NGINX_HOST=127.0.0.1
     - NGINX_PORT=80
     .....
    command: /bin/sh -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
```
「公式からコピペしてきたしそんな変な設定してないっしょ」と思い軽く流し読み。（この思い込みが良くなかった…）


### 考えたこと３
[docker] nginx.confが誤っている 

```
upstream backend {
    server ${NGINX_HOST_SERVER}:1337;
}

server {
    listen ${NGINX_PORT};
    server_name ${NGINX_HOST};

    location ~ .*\.(jpg|gif|png|css|js|inc|ico) {
        expires 30d;
        root  ${NGINX_WEB_ROOT};
    }

    location / {
        add_header Access-Control-Allow-Origin '*';
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
        add_header Access-Control-Allow-Credentials true;

        expires modified +10m;
        proxy_pass  http://backend;
        break;
    }
}

```
これもざっと見（他のPJで使用していて実績があったため）OKっぽい


### 考えたこと4
[vagrant] firewalldが動いている

OFFにしたよなぁと思いつつ念のため見返すも、やはり動いてない


### 考えたこと5
[vagrant] 消滅したはずのiptablesが何か悪さをしている

動いてない

### そして正解へ
[CentOS7 (vagrant) に docker をインストールして nginx で hello world するまで](http://qiita.com/satoshi_iwashita/items/859b3d0d4593e7e3cfd2#_reference-c7ccee07f1a7ec4ec7e0)
を見つけ、この通りに実行するとすんなりmacからtelnetが通るではないか。
(`sudo sysctl -w net.ipv4.ip_forward=1`をvagrant上で実行する必要はあったが)


これはいよいよ、nginx.confくらいしか違いがないぞということで見直すと…

## `server_name ${NGINX_HOST};`が間違ってただけ（白目）

> nginxは HTTP リクエストに対して、最初にどのサーバでそれを処理すべきか を決定します。その際に用いられるのが、リクエストヘッダ中の Host フィールド です。以下の例では、このHost フィールドと server_name が一致した 場合、該当するサーバ設定が採用されます。

誤：`server_name 127.0.0.1;`
正：`server_name _;` or `server_name 192.168.33.xx;`

（何にもマッチしないと最初のserverディレクティブが使われるので。あるいはVagrantfileの`private_network`で設定したIPでも良い）

## おわりに
めっちゃはまった...



## （追記）19:59
```shell-session
vagrant:~ $ sudo sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
```
なんかこいつが重要な気がしてきた…
これが無効だとそもそも疎通できない？（要調査）
CNMeMのインストール方法

どういう効果があるのか、わかっていませんが、CNMeMのインストール方法だけ記述します。

まず、ファイルのダウンロード（GitHubより）

```shell-session
$ cd $HOME
$ git clone https://github.com/NVIDIA/cnmem.git
```

CNMeMのビルド

```shell-session
$ cd cnmem
$ mkdir build
$ cd build
$ cmake ..
$ make
```

ファイルのコピー

```shell-session
$ sudo cp include/*.h /usr/local/cuda/include
$ sudo cp -a build/libcnmem.so* /usr/local/cuda/lib64/
$ sudo ldconfig
```
※シンボリックリンクがシンボリックリンクとしてコピーされるように cp には -a をつけました。

コピーしたファイルの所有者などはこんな感じに設定しました

```shell-session
$ ll cnmem.h 
-rw-rw-r-- 1 root root 11482 10月 28  2015 cnmem.h
$ ll libcnmem*
lrwxrwxrwx 1 root root     13  1月 17 15:55 libcnmem.so -> libcnmem.so.1
lrwxrwxrwx 1 root root     17  1月 17 15:55 libcnmem.so.1 -> libcnmem.so.1.0.0
-rw-rw-r-- 1 root root 671248  1月 17 15:55 libcnmem.so.1.0.0
```

theanoで動作確認した出力（virtualenv&virtualenvwrapper環境下）

```shell-session
(theano) $ python
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import theano
Using gpu device 0: GeForce GTX 1050 (CNMeM is enabled with initial size: 80.0% of memory, cuDNN 5005)
```

（参考にしたサイト）
[NVIDIA/cnmem/README.md](https://github.com/NVIDIA/cnmem/blob/master/README.md)
[Yet Another Blog](https://npatta01.github.io/2015/08/08/installing_cuda/)
Chainer v1.20.0 がリリースされました

掲題の通りでございます。
# Featureはこちら
https://github.com/pfnet/chainer/releases/tag/v1.20.0

## 個人的に面白いと思ったもの
Add PlotReport (#2001)
https://github.com/pfnet/chainer/pull/2001
Chainerでもログからグラフ描画が可能に。
Webサーバも内包すればTensorBoardはもはや不要か?

Add DCGAN example (#1892)
https://github.com/pfnet/chainer/pull/1892
Generative系を何も無いところから「やってみた」するのは結構困難。
まだ試していませんがExampleがあるといいですね。

Add DeCov loss (#1942)
https://github.com/pfnet/chainer/pull/1942
元論文[Reducing Overfitting in Deep Networks by Decorrelating Representations](https://arxiv.org/abs/1511.06068)をまだじっくり読めていませんが「Reducing Overfitting」の見出しだけでも期待が持てます。
***
この一年、フリーランサーな私としてはお客様の要求は絶対ですので、TensorFlow一筋でしたがChainerもまだまだ負けていませんね。

v1.10.0あたりからは強力なTrainerのおかげで実装量がさらに削減されており、もっと実務的な採用事例が増えても良いと思うのですが...
2017年の躍進に期待します。
Dockerコマンドメモ

Dockerのコマンドでよく使いそうなものをまとめておく。
(自分が後から参照したときに分かるレベルでの記載になっています。)

``` shell
# debianイメージのwheezyタグ上で「echo "Hello World"」を実行
% docker run debian:wheezy echo "Hello World"

# コンテナ名「HOGE」、ホスト名「FUGA」として、コンテナ内でbashを実行
% docker run -it --rm --name HOGE --hostname FUGA debian:wheezy bash

# コマンド(この場合はbash)終了時にコンテナを削除(終了後に勝手に削除されるので「docker ps -a」で表示されない)
% docker run -it --rm -h HOGEHOGE debian /bin/bash

# 動作中のコンテナを表示
% docker ps

# 停止したものも含めてコンテナを表示
% docker ps -a

# 停止したものも含んだコンテナのコンテナIDのみを表示
% docker ps -aq

# 停止したコンテナの削除。
% docker rm -v $(docker ps -aq -f status=exited)

# 動作中のコンテナの削除。
% docker rm $(docker stop $(docker ps -q))

# 既に起動してるコンテナにbashで入る
% docker exec -it [name or containerID] /bin/bash
% docker exec -it hogehoge /bin/bash

# Dockerfileを作成してから下記を実行してイメージを構築(sampleという名前で、hogetagというタグを付与)
% docker build -t sample:hogetag .

# ローカルのコンテナのイメージ一覧を見る
% docker images

# イメージの削除
% docker rmi [image_id]

# -dを付与するとバックグラウンドで起動する
% docker run --name myredis -d redis
# myredisに対してredisという名前でlinkさせて起動
% docker run --rm -it --link myredis:redis redis /bin/bash

# どのコンテナにも紐付いていないvolumeの一覧を見る、又は削除する。
docker volume ls -qf "dangling=true"
docker volume ls -qf "dangling=true" | xargs docker volume rm

# データボリュームコンテナを作成するときの例
docker run --name dbdata mysql:5.6 echo "Data-only container for mysql5.6"
docker run -d --volumes-from dbdata --name db mysql:5.6

# コンテナの3000番ポートをホストの13000ポートにポートフォワード、またホストの現在のディレクトリ直下にあるappディレクトリをコンテナの「/app」にマウント
% docker run -d --name hogehoge -p 13000:3000 -v "$(pwd)"/app:/app sample:hogetag
# ENVという環境変数にproductionを設定
% docker run -e "ENV=production" --rm --name hogehoge -p 9090:9090 -p 9191:9191 sample:hogetag

# ポートを自動マッピング
docker run -d --name hogehoge -P sample:hogetag
# 自動マッピングされたポート番号の確認
docker port sample:hogetag
```


名前がhogehogeというコンテナに対するコマンド

``` shell
# 詳細を表示
% docker inspect hogehoge
# コンテナに対する変化点を表示
% docker diff hogehoge
# コンテナのログを出力
% docker logs hogehoge
# コンテナを削除
% docker rm hogehoge
# hogehogeというコンテナをtest/hogeimageというimageで保存する
% docker commit hogehoge test/hogeimage
```

docker-compose.ymlを作成したときに利用するコマンド

``` shell
% docker-compose build
% docker-compose up
% docker-compose up -d
% docker-compose -f docker-compose-prd.yml up
% docker-compose -f docker-compose-prd.yml up -d
% docker-compose ps
% docker-compose logs
% docker-compose stop
% docker-compose rm
```
AfterEffectsのExtendScriptでFolderクラスのプロパティが返す値まとめ

ExtendScriptにて、Folderクラスのプロパティは様々なシステムパスを返してくれます。
仕事柄たまにAfterEffectsのスクリプトを作成するのですが、
毎度どれがどのパスを返すのだったか忘れて調べ直している気がするのでまとめてみました。

###テスト環境
OS : Win7
ExtendScript実行環境 : Adobe After Effects CC 2015.3
実行スクリプトのパス : C:\Program Files\Adobe\Adobe After Effects CC 2015.3\Support Files\Scripts\test.jsx

###結果
```
//※見やすいようにdecodeしています
With( Folder ) {
    // Class Properties
    decode(appData)		// /c/ProgramData
    decode(commonFiles)	// /c/Program Files/Common Files
    decode(desktop)		// ~/Desktop
    decode(myDocuments)	// ~/Documents
    decode(startup)		// /c/Program Files/Adobe/Adobe After Effects CC 2015.3/Support Files
    decode(current)		// /c/Program Files/Adobe/Adobe After Effects CC 2015.3/Support Files/Scripts
    decode(system)		// /c/Windows/SYSTEM32
    decode(temp)		// /c/Users/username/AppData/Local/Temp
    decode(userData)	// ~/AppData/Roaming
    decode(trash)		// null

    // Object properties(絶対パスの場合)
    decode(startup.fsName)		// C:\Program Files\Adobe\Adobe After Effects CC 2015.3\Support Files
    decode(startup.parent)		// /c/Program Files/Adobe/Adobe After Effects CC 2015.3
    decode(startup.fullName)	// /c/Program Files/Adobe/Adobe After Effects CC 2015.3/Support Files
    decode(startup.name)		// Support Files
    decode(startup.path)		// /c/Program Files/Adobe/Adobe After Effects CC 2015.3
    decode(startup.relativeURI)	// ..
    decode(startup.absoluteURI)	// /c/Program Files/Adobe/Adobe After Effects CC 2015.3/Support Files

    // Object properties(相対パスの場合)
    decode(desktop.fsName)		// C:\Users\username\Desktop
    decode(desktop.parent)		// ~
    decode(desktop.fullName)	// ~/Desktop
    decode(desktop.name)		// Desktop
    decode(desktop.path)		// ~
    decode(desktop.relativeURI)	// ../../../../../Users/username/Desktop
    decode(desktop.absoluteURI)	// ~/Desktop
}
```

Folder.trashプロパティはMacOSだとゴミ箱のパスが取得出来るらしいのですが、
WindowsOSだとnullが入ってしまうので残念ながら使えないみたいです･･･
GNU coreutils > date > x週前の日付をyyyymmdd形式で取得する > date -d "20161020 - 4 weeks" "+%Y%m%d"

```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を使用。
date (GNU coreutils) 8.4
```

- 10月20日の4週間後は何日か?
- 11月2日の10日前は何日か?

などを`cal -3`コマンドでカレンダー表示をして「数えて」きた。

コマンドで自動計算して、yyyymmdd形式の結果を表示したい。

参考 http://unix.stackexchange.com/questions/24626/quickly-calculate-date-differences

### コマンド例

以下とすればよさそう。

```
$ date -d "20161020 - 4 weeks" "+%Y%m%d"
20160922
```

```
$ date -d "20161020 + 4 weeks" "+%Y%m%d"
20161117
```

```
$ date -d "20180218 - 300 days" "+%Y%m%d"
20170424
```

(追記 2017/01/18)

- 上記コマンドのdaysはdayでも同じ結果になった
- プラスの場合、"+"はなくても同じ結果になった

### 補足

dateの使用例で日付フォーマットの指定にシングルクォーテーションを使う例もある。
ダブルクォーテーションとの違いは未消化。
ファイル名もファイルの中身も一括で置き換えしたい時

ファイル名もファイルの中身も変数を使って
grep | sed したい時、


以下のshellでは
File_IDxxxx.txtってファイルの中身で
IDxxxx　に該当する部分を全て
指定の変数配列で置き換えて出力するshellです。



```

#!/bin/bash

array=(\
ID0001 \
ID0002 \
ID0003 \
ID0005 \
ID0008 \
ID0013 \
ID0021 \
ID0034 \
)


for i in "${array[@]}"; do
    #echo "$i"
    cp "File_IDxxxx.txt" "File_$i.txt"
    grep -l 'IDxxxx' "File_$i.txt" | xargs sed -i -e "s/IDxxxx/${i}/g"
done

exit 0

```

ヒアドキュメントとか使った方がスマートにかける気がしますが
めっちゃ個人用なのでこれで。

grep | sed はよく見かけると思うのですが
変数を使いたい時はシングルクオートではなくダブルクオートで
囲めばいけます。
テキストのコピー時に何かするjQueryプラグイン作った

# これは何ですか？

コピペをできなくするプラグイン **ではありません**。←重要
そんなの無理だ。諦めろ。
コピーしようとするテキストが個人情報等を含んでいる等で、扱いに注意を促すためのものです。
~~なんだったらカジュアルなコピーをできなくすることもできるプラグインです。~~
巷によくある右クリックを禁止する乱暴なやつとは異なり、特定のセレクタの要素を**コピーしたとき**に発動します。
そのため、コピー許可要素に対しては余計なことをしません。

https://github.com/smzk/jquery-copyGuard

# 使い方

```sample.js
    $(document).copyGuard({
        guardSelector: '.copyGuard',    //コピー禁止領域のセレクタ―
        isCopyDeny: function(){         //コピー禁止領域をコピーしようとした際の関数。
            alert("個人情報を含んでいますよ")
            return true;                //trueを返すとコピー不許可とみなし、クリップボードの中身をクリアする
        },
    });

```

```sample.html
    <div>
        ここはコピー許可
        <div style="border:1px solid;" class="copyGuard">
            ここはコピー禁止
            <div id="aaa">
                子要素でもコピー禁止
            </div>
        </div>
    </div>
```
「ここはコピー禁止」「子要素でもコピー禁止」を含んだ要素をコピーしようとするとalertを表示します。
isCopyDenyでtrueを返せば「コピー不許可」とみなし、クリップボードの中身をクリアします。
逆に言うと、falseを返せばコピー許可なので、動作を自由にカスタマイズできます。
（パスワードを入力したときだけコピー可とか。そのパスワードもjs内に書いてあるんだろうから意味ないけど）

# 繰り返しますが

jsを無効にしているといくらでもコピーできます。あくまで注意喚起を行うことが目的のプラグインです。

# 動作

> window.getSelection()

が動くブラウザ。古いIEでは動きません。
対応できればします。行けたら行く的な。
WordPressプラグイン「FrontEndPM」のデザインをモダンに変えてあげる

WordPressでユーザ同士がDMをすることを可能にする「FrontEndPM」だがデザインが残念すぎる。日本語も対応していない。


以下、デフォルトのスクショ

<img width="1230" alt="FrontEndPM.png" src="https://qiita-image-store.s3.amazonaws.com/0/109719/56dfa85d-93a9-2d5c-9da2-c5d807e5af13.png">

僕が実際に追加CSSで書いたものをまとめました。
参考にしてみてください。

# 受信ボックスのデザイン
<img width="916" alt="FrontEndPM2.png" src="https://qiita-image-store.s3.amazonaws.com/0/109719/3c557223-b2fb-8a86-197e-57e9f086efab.png">


こんな感じに変更できます。

## ボーダーをシンプルにする

footer部にFrontEndPMという文字が入ってるのでdisplay:noneにしてあげる。


```
#fep-footer {
  display: none;
}

#fep-header {
  border: none;
}

#fep-content {
  margin-top: 40px;
  padding-top: 10px;
  border-bottom: none;
  border-right: none;
  border-left: none;
}
```

## 受信ボックスに余白をつけよう
.fep-table-rowは最初display:table-rowに設定されているので、display:blockに変更した後、paddingを各自お任せで設定しよう。私は10pxで統一してたので10px。

```
.fep-table-row {
  padding: 10px;
}

.fep-table > div {
  display: block;
}
```

## アバターの右に余白
余白を右につける。importantに設定しているが、セレクタを詳しく記述して優先度をあげるとつけなくても良し。

```
.avatar.avatar-64 {
  margin-right: 30px !important;
}
```

## セレクトをモダン化する

```
.fep-bulk-action > select,
.fep-filter > select {
    display: block;
    width: 100%;
    height: 45px;
    font-size: 14px;
    color: #555555;
    background-color: #fff;
    border: 1px solid #ccc;
    border-radius: 4px;
    letter-spacing: 0.5px;
}
```

# 検索フォームのデザイン


<img width="912" alt="スクリーンショット 2017-01-17 18.21.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/109719/ce25a224-724c-3dac-3bbc-709dd795455e.png">

デフォルトではこんな残念すぎる検索フォームですが、以下のコードで

```
.fep-directory-search-form-field,
input.input-text {
  width: 80% !important;
  height: 50px;
  font-size: 14px;
  color: #555555;
  border: 1px solid #ccc;
  border-radius: 4px;
  letter-spacing: 0.5px;
}

.fep-directory-search-form-submit {
    color: #fff;
    height: 50px;
    display: inline-block;
    font-weight: bold;
    vertical-align: middle;
    cursor: pointer;
    border: 1px solid transparent;
    padding: 0.71428571em 2.28571429em;
    font-size: 14px;
    line-height: 1;
    background-color: #315b9d;
    border-radius: 4px;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}
```

<img width="908" alt="スクリーンショット 2017-01-17 18.21.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/109719/df7c345d-a743-5469-7e65-d89db93eebc5.png">

この通りに変身。

# その他細かい修正
好みでカスタマイズしてほしい部分ですが、明らかに気になったのでこんな風に書きました！

```
.fep-form-field {
  margin: 20px 0;
}
.fep-label {
  font-size: 14px;
  margin-top: 20px;
}
button.fep-button {
  margin-left: 10px;
}
```