OmniAICreator/Qiita-1.07M huggingface dataset:
WordPressの超便利プラグイン MW WP Formの管理者宛メールにREMOTE_ADDRとUSER_AGENTを追加する方法。

*※この記事は、[個人ブログ](https://blog.motoo.net/2017/12/01/080505)からのマルチポストです。*

意外とGoogle先生の回答に出てこないのでココでメモ。

フィルターフックの [mwform_custom_mail_tag](https://plugins.2inc.org/mw-wp-form/filter-hook/mwform_custom_mail_tag/) を使います。

functions.php に以下のコードを貼り付けます。

```php:functions.php
function add_sender_mwform_mail_tag( $value, $key, $insert_contact_data_id ) {
	if ( 'user_agent' === $key ) {
		return $_SERVER[ 'HTTP_USER_AGENT' ];
	}
	if ( 'remote_addr' === $key ) {
		return $_SERVER[ 'REMOTE_ADDR' ];
	}
	return $value;
}
add_filter( 'mwform_custom_mail_tag', 'add_sender_mwform_mail_tag', 10, 3 );
```

んで、管理者宛メール設定の本文欄末尾に以下のテキストを貼り付け。

```
--- 送信者情報 ---
REMOTE_ADDR: {remote_addr}
USER_AGENT: {user_agent}
```

That's all.

Googleで「[MW WP Form user_agent remote_host](https://www.google.co.jp/search?q=mw+wp+form+user_agent+remote_host)」的な検索をすると、だいたい [mwform_custom_mail_tag_mw-wp-form-xxx](https://plugins.2inc.org/mw-wp-form/filter-hook/mwform_custom_mail_tag_mw-wp-form-xxx/) が検索結果として出て来るんだけど、これだとテストサーバと公開サーバでお問い合わせフォームIDが違ってたりしてキーーーってなるので、前述のほうが便利だと思うよ、知らんけど。
FTPクライアントの踏み台経由のsshログイン設定

# 概要
FTPクライアント(CyberDuck)における踏み台経由でのサーバ接続設定が非エンジニアに刺さったので記録

# トンネル接続設定
`$ ssh -f -N -L 10220:<target>:22 <user>@<bastion> -i ~/.ssh/<private-key>`

 * f:バックグラウンド処理
 * N:SSHしたホストでコマンド実行しない

# イメージとCyberduckの接続設定
![AWS Design.png](https://qiita-image-store.s3.amazonaws.com/0/58788/db32803a-e52b-4e21-a037-401a7cab4513.png "AWS Design.png")

# トンネル接続解除
`$ ps aux | grep ssh`で当該PIDを調べてkill
xlsx-populateを使ってクライアントサイドでExcelを編集する

このエントリは[NIJIBOX Advent Calendar 2017](http://qiita.com/advent-calendar/2017/nijibox)の3日目です。

### :point_up: はじめに
IE、Edge、Excelから逃れられない人生を送っている皆様こんにちは:smiling_imp:

### :whale: 今回の要件
- Excelをダウンロードしたい
- Excelテンプレートがすでにあるので、そこに値を埋め込めればいい
- ある一定の時期のみ負荷がめっちゃかかる

最後の要件があったので、サーバ負荷をかけないように、
クライアントサイドでExcelを出力するのもありでは？と思い調べてみました。

### :dark_sunglasses: ライブラリ選定
#### [js-xlsx](https://github.com/SheetJS/js-xlsx)
一番starが多そう。
単純に読み込み、出力をしたもののテンプレートのスタイル情報が失われてしまった。
[issue](https://github.com/SheetJS/js-xlsx/issues/121#issuecomment-272371902)を読んでいると、このような用途であれば、別ライブラリがいいよと書いてあったので、それを試してみることに。

#### [xlsx-template](https://github.com/optilude/xlsx-template)
試してみたものの値が置き換わらなかった...。

#### [xlsx-populate](https://github.com/dtjohnson/xlsx-populate)
望んでいた結果が得られました。

どれもNode.jsでもブラウザでも動くよといった感じでした。

### :bar_chart: xlsx-populateについて
リポジトリにも書いてありますが、このライブラリでは従来のライブラリのように、
`XMLをdeserialize → モデル化 → 編集 → XMLにserialize`
というフローではなく、直接XMLを操作するみたいです。

そのため、スタイル情報などが保持されたままであると。
今回はこの恩恵に大いにあずかった感じです:heart_eyes:

:warning: 今あるXMLの構造体を操作して修正していくので、
例えばワークシートのコピーなどは、このライブラリはサポートしていないです。
(シートのコピーを何個か作っておいて、不要なものを消したりといったことが必要)

詳しくは[ここ](https://github.com/dtjohnson/xlsx-populate#how-xlsx-populate-works)を読んで下さい。

### :eyes: 確認
#### :globe_with_meridians: ブラウザ互換性
IE11, Edge14, FF57(Mac), Chrome62(Mac)では問題なさそうでした。

#### :desktop: 性能
10000セルへの書き込みをして1秒かからないくらいでした。
intel core i5のmemory 16GBマシンでの検証なので、数値は参考程度で。

### :cupid: デモ
[デモ](https://re-fort.net/xlsx-populate-demo/)

- テンプレートに値を入れ込む
- 10000セルに書き込む
- zip化する

の3パターンが試せるデモをあげました。
確認してみてください:blush:
エンタープライズ向けオープンソース CMS「eZ Publish (eZ Platform)」の概要

## eZ Publish (eZ Platform)
https://ezplatform.com/
**eZ Publish** は PHP で開発されているオープンソースのエンタープライズ向け CMS です。
ノルウェー王国の eZ Systems 社によって1999年から開発されています。
**eZ Platform** は eZ Publish 5 の次のバージョンで、新しい名称としてブランディングされました。
12月1日現在の最新安定版のバージョンは eZ Platform 1.12.1 で、ベータ版として eZ PLatform 2.0.0 Beta 2 がリリースされています。

## 特徴
* 開発元の eZ Systems 社による製品の有償サポートがある
* フレームワークに **Symfony** をフルスタックで採用。
* **コンテンツタイプ**（または**クラス**）という概念により、コンテンツやユーザーなどほぼ全ての情報を汎用的かつ構造的に管理することが可能。
* コンテンツを視覚的な階層構造で管理できるツリー表示
* ロケーションによる重複しないコンテンツ配置
* 階層的にユーザーを整理できるユーザー管理
* ユーザー権限の詳細な設定が可能な権限管理
* 同一コンテンツとして複数の翻訳言語を登録できる多言語対応
* 同一コンテンツに複数のテンプレートを持たせられるサイトアクセス


## eZ Publish (eZ Platform) が適しているサイト
* 部署やユーザー数が多い組織で利用するサイト
* ユーザーやコンテンツの内容に応じて細かく権限を設定する必要のあるサイト
* コンテンツの多言語展開が必要なサイト
* コンテンツの階層構造が複雑なサイト
* コンテンツの種類や決まった入力項目が多いサイト
* 同一コンテンツを複数の出力（テンプレート）で配信するサイト

## システム要件
https://doc.ezplatform.com/en/1.12/getting_started/requirements_and_system_configuration/
### 推奨セットアップ
|	|Debian	|Ubuntu	|RHEL / CentOS|
|---|---|---|---|
|**OS**|8.x "Jessie"	|16.04LTS	|7.x|
|**Web サーバー**|Nginx 1.6<br>Apache 2.4 *(prefork)*|	Nginx 1.10<br>Apache 2.4 *(prefork)*|	Nginx 1.10 *(via RHSCL)*<br>Apache 2.4 *(prefork)*|
|**DBMS**|MariaDB 10.0<br>MySQL 5.5	|MariaDB 10.0<br>MySQL 5.7*	|MariaDB 10.1 *(via RHSCL)*<br>MariaDB 10.0 *(via RHSCL)*<br>MySQL 5.6 *(via RHSCL)*<br>MariaDB 5.5|
|**PHP**|PHP 5.6 *(via libapache2-mod-php5 for Apache)*	|PHP 7.0	|PHP 7.0 *(via RHSCL)*<br>PHP 5.6 *(via RHSCL)*|
|**PHP パッケージ**|php5-cli<br>php5-fpm *(for use with nginx)*<br>php5-readline<br>php5-mysqlnd or php5-pgsql<br>php5-json<br>php5-xsl<br>php5-intl<br>php5-mcrypt<br>php5-curl<br>php5-gd or php5-imagick<br>php5-twig *(optional, improves performance on php 5.x)*|php-cli<br>php-fpm *(for use with nginx)*<br>php-readline<br>php-mysql or php-pgsql<br>php-json<br>php-xml<br>php-mbstring<br>php-intl<br>php-mcrypt<br>php-curl<br>php-gd or php-imagick	|php-cli<br>php-fpm *(for use with nginx)*<br>php-mysqlnd or php-pgsql<br>php-xml<br>php-mbstring<br>php-process<br>php-intl<br>php-pear *(optional, provides pecl)*<br>php-gd or php-imagick *(via pecl)*<br>php-memcached *(recommended, via pecl)*|
|**Cluster PHP パッケージ**|php5-memcached or php-redis *(via pecl)*	|php-memcached *(via pecl)* or php-redis *(via pecl)*	|php-memcached *(via pecl)* or php-redis *(via pecl)*|
Spring boot CLI&Spring cloud CLIをインストール（Ubuntu 32-bit）

# 概要
spring bootでの開発のちょっとした確認などに便利だと思いspring boot CLIとspring cloud CLIを入れてみたメモ

## 環境
spring boot CLI 1.5.9
spring cloud CLI 1.3.1
Ubuntu 14.04 LTS(32-bit)
Maven 3.3.9

# spring boot CLIインストール
## 前提
java（JAVA_HOMEもPATHにセット済み）とmaven(またはgradle)がインストールされている環境であること

## インストール手順
基本的には[公式のマニュアル](https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started-installing-spring-boot.html)の通り

1.tarをダウンロード
※今回は「spring-boot-cli-1.5.9.RELEASE-bin.tar.gz」を利用

2.tarを展開して配置
※コマンドややり方はもっといい方法が多分あると思いますが自分が慣れてるやり方を記載・・

```bash
ls -l spring-boot-cli-1.5.9.RELEASE-bin.tar.gz
tar -zxvf spring-boot-cli-1.5.9.RELEASE-bin.tar.gz
mv -ir ./spring-1.5.9.RELEASE/* ${SPRING_PATH}/
```

3.パスのセット

```bash
vim ~/.bashrc
```

```bash:※以下を追記
export SPRING_HOME=[今回インストールしたディレクトリ]
export PATH="$SPRING_HOME/bin:$PATH"
```

4.インストールの確認

```bash
spring --version
```

```bash:※下記のような結果が返ってくればインストールOK
Spring CLI v1.5.9.RELEASE
```

# spring cloud CLIインストール
spring boot CLIがインストルされている状態で下記のコマンドでインストール

1.インストール

```bash
sudo /usr/local/spring/bin/spring install org.springframework.cloud:spring-cloud-cli:1.3.1.RELEASE
```

2.インストールの確認

```bash
spring cloud --version
```

```bash:※下記のような結果が返ってくればインストールOK
Spring Cloud CLI v1.3.1.RELEASE
```
gitのGUIのGitKrakenでコマンドから既存レポジトリを開く方法

## やりたいこと

gitのGUIの[GitKraken](https://www.gitkraken.com/)で既存のローカルリポジトリを開く方法です。


## 環境

Mac

GitKraken 3.3.0

## やり方

```bash
$ cd 開きたいリポジトリ
$ /Applications/GitKraken.app/Contents/MacOS/GitKraken -p .
```

## その他のオプション

その他のオプションを見るには`-h`でいけます

実際の出力は以下の感じになりました

```
$ /Applications/GitKraken.app/Contents/MacOS/GitKraken -h
Node started time: 1512007657896
Options:
  -h, --help      Print this usage message.            
  -l, --log-file  Log all output to file.              
  -p, --path      Open the repository specified by path
  -v, --version   Print the version.                   
  -n, --nexxuz    Nothing to see here...   
```
jsでの国際化（数値と日付のフォーマットについて）

##国ごとの日付・数値のフォーマットの違いについて

同じ英語圏でも、アメリカとイギリスでも日付のフォーマットが大きく違います。

```
米国  mm-dd-yy 08-24-01 
イギリス dd/mm/yy 　24/08/01
```
~~Oracleさんが国ごとの違いをめっちゃわかりやすくまとめてました。
[日付の形式 (国際化対応言語環境の利用ガイド) - Oracle](https://docs.oracle.com/cd/E19683-01/816-3979/overview-46/index.html)~~
→ 少なくともドイツの日付表記が正しくなさそうです。。。

## jsアプリでの対応方法

結論：javascriptには国際化APIが存在する。
[Intl - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Intl)

| 数値 | 日付|
|---|---|
| Intl.NumberFormat  | Intl.DateTimeFormat |

これらは IETF言語タグ (= BCF 47 = RFC5646 + RFC 4647)を引数に持つ。
返り値はフォーマット化された日付・数値の文字列

言語タグは window.navigator.language でブラウザから拾ってくれば良い。

>
#メモ
window.navigator.language は RFC 4646を返す。
[window.navigator.language - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/NavigatorLanguage/language)
>
RFC 5646はRFC 4646を含む。よってタグ変更は必要ない。
[HTMLとXMLにおける言語タグ - W3C](https://www.w3.org/International/articles/language-tags/index.ja)
git-repo-pluginで`Ref master can not be resolved`

git-repo-pluginを使ったprojectで `Ref master can not be resolved` のようなエラーが出てbuildできなくなる事象の対処メモ

1. `ssh-add -K ~/.ssh/hoge_rsa` <- hoge_rsaはgithubに登録した鍵
2. `~/.gitRepos`を削除

これでbuildが通るようになりました
spring-securityのエラーメッセージが変更できない

# キーワード
「Bad Credential」から変わらない・・・

# 問題
Spring(Spring-Bootではない)に、spring-securityを導入して
ログイン認証を実装したところ、IDやパスに誤った入力をした際のエラー文言を出力するとデフォルトで設定されている文字しか出ないことで悩んでいました。

# 原因
MessageResourceのBean定義を
DispatcherServlet側(servlet-context.xml)で行なっていないでしょうか？

# 解決方法
ContextLoaderListner側（applicatinoContext.xml）で行うと動作しました。

# 原因の詳細
SpringでWebアプリケーションとして動作させる場合には
以下の２つのアプリケーションコンテキストを設定する必要がある。

* ContextLoaderLister(親)
* DispatcherServlet(子)

この２つは親子関係になっており、親が子のBeanを参照することはできるが逆はできない
なので、messageResourceを親でDIしてしまうと
spring-securityをDIしている子からは参照できないため発生してしまいます。

![IMG_4263.JPG](https://qiita-image-store.s3.amazonaws.com/0/41506/da1d4440-01ac-1d06-8cd8-391f88765a70.jpeg)


# 参考
Springで開発を行う際には以下の大前提の知識がないと解決しづらいのでおさえておくといい

* サーブレットコンテナとは
[Javaサーブレットコンテナの定義とファイル構成　sever.xmlとweb.xml]
(https://matome.naver.jp/odai/2142426284144340601)

* アプリケーションコンテキストとは
[サーブレットコンテナから近づくSpring MVC入門]
(https://matome.naver.jp/odai/2141415757276619101)
filter_inputで配列を取得する方法

POSTメソッドで、下記のクエリを投げた時にPHPで$_POST["hobby] で受け取れますが、
filter_input関数を使って受け取ろうとしたらつまってしまったので、解決した方法を記入したいと思います。

```php
 <input name="[]" type="checkbox" value="checkboxA"> 野球
 <input name="[]" type="checkbox" value="checkboxB"> サッカー
```

最初は、このように書いていたのですがデフォルトでは配列の取得はできません。

```php
$hobby = filter_input(INPUT_POST, 'hobby');
```

なので、第四引数に FILTER_REQUIRE_ARRAY を指定すると、取得できるようになります。

```php
$hobby = filter_input(INPUT_POST, 'hobby', FILTER_DEFAULT, [
    'flags' => FILTER_REQUIRE_ARRAY
]);
```

これを省略して書きた場合かつFILTER_REQUIRE_ARRAY以外の細かい設定をする必要がなければ

```php
$hobby = filter_input(INPUT_POST, 'hobby', FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);

```

もしくは

```php
$post = filter_input_array(INPUT_POST, [
    'hobby' => [
        'flags' => FILTER_REQUIRE_ARRAY
    ]
]);
```

このように書けば解決できました。
マイクロインタラクションのためのCSSアニメーション

UXの一部としてマイクロインタラクションが重要視されています。また、jsよりもcssアニメーションの方がレンダリングコストが低いと聞いたことがあります。マイクロインタラクションにおけるcssアニメーションの使い分けに関して投稿いたします。

## CSSによるアニメーション
- transition
- animation(keyframes)

transformはあくまで原形から変形させるものであり、アニメーションではないです。

## transition
 監視するcssプロパティを指定し、そのプロパティが変更されればアニメーションを実行する。

```css:css
transition: background-color .2s ease-in
/*background-colorの監視*/
```
 プロパティの変更は、:hoverなど事前に定義したものだけでなく、javascriptによる変更にも適用されます。

```js:js
var myElement = document.querySelector("#myElement");
myElement.style.backgroundColor = "333";
````
※ `transition: all ~~~;` とすると全てのプロパティを監視できるので便利ですが、描画が重くなる原因になるので避けましょう。

## animation
事前に `@keyframes 名前 {変化}` と定義しておき、animationプロパティから呼び出し、中間点やループなど様々なアニメーションに関する指定をすることができます。

```css:css
@keyframes move {
  from {
    transform: translate(0, 0);
  }
  to {
    transform: translate(10px, 10px);
  }
}
```

```css:css
.yeah {
   animation: move 1s forwards;
 }
 /*moveアニメーションを1秒で行い、再生後、最後のキーフレームの状態を保持する*/
```
[ユーザー動作（hoverなど）がなくても実行できる。中間点、ループ、開始前・開始後の状態を指定できる、複数のアニメーションを連動させることができる](https://qiita.com/7968/items/1d999354e00db53bcbd8)ことが魅力的です。

※念のためにtransitionとanimationについて説明しましたが、[リンク先](http://better-than-i-was-yesterday.com/css-transition-and-css-animation/)の方が詳細に書かれています。
## マイクロインタラクションにおける選択
この記事の本題です。マイクロインタラクションにおいて、どちらのプロパティを優先的に使用するかですが、<font color="red">transitionを優先的に使用する</font>ことが適切かと思います。

マイクロインタラクションは、<font color="red">ユーザーイベントによって発火させるためです。（特にクリック）</font>

1.  transitionで特定のcssプロパティを監視し、jsを使ってclassの付け替えを行う。
2. 確実に同じ動作をするか、中間点やループなどが含まれる場合は、animation(keyframes)を使用する。

animation(keyframes)は関数型言語のように、同じ動作を事前に定義し、コントロールすることができますが、引数を渡せるわけではありません。ユーザーがクリックした座標を使用するなどはできません。

```css:css
@keyframes move {
  from {
    transform: translate(0, 0);
  }
  to {
    transform: translate(10px, 10px);
  }
} 
```
これは必ず10pxずつ移動してしまう。ユーザーがクリックした座標に向けての動作をアニメーションにすることができません。

## そもそもの問題点
マイクロインタラクションのイベントはクリックが多いと思います。
ですが、現状のcssには、click擬似クラスがないです。:disappointed_relieved:

## postcss
postcssのプラグインの中に[click擬似クラスを追加する](https://github.com/ismamz/postcss-click)というものがありましたが、解決策にはならなさそうです。
jsファイルを生成し、jQueryにてtoggleしているだけでした。
jsとphpを両方扱う人のためのforで詰まったらみるやつ

```js
//js
var array = ['apple', 'melon', 'banana'];

for (var i=0;i<array.length;i++) {
	console.log(array[i]);
}
```


```php
//php
$array = ['apple', 'melon', 'banana'];

for ($i=0;$i<count($array);$i++) {
	echo $array[$i].'<br>';
}

```
バッチファイルでwaitを入れる


# 例

コメントで指摘いただいた方法がベストだと思うのでコレを推奨。

```bat:10秒Waitを入れる
timeout /t 10 > nul
```

ただし、プロンプト上でキー入力があると待ちがキャンセルされます。

```bat:普通に実行するとこうなる
C:\>timeout /t 10
 10 秒待っています。続行するには何かキーを押してください ...
```

キー入力待ちでキャンセルされたくない場合は`/nobreak`オプションを指定します。

```bat:キャンセルされない
timeout /t 10 /nobreak >nul
```

# 別の方法

最初に記載していた方法。
コメントで教えてもらった上記の方法で事足りると思うので、こんな方法もありますという程度です…。

```bat:10秒Waitを入れる
waitfor dummy /t 10>nul 2>&1 & verify>nul
```

* `waitfor`は指定した名前のシグナル（例では`dummy`）が送られるまで`/t`に続いて指定された数値の秒数だけ待つ。[^1]
* シグナルが送られない場合、エラーとして終了する。
* `waitfor`コマンドのエラー終了時には`エラー: 'dummy' 待ちがタイムアウトしました。`とメッセージが標準エラー出力に送信される。バッチで利用する場合はエラー出力を抑制したいので、`>nul 2>&1`にリダイレクト
* また、エラーの副作用で`errorlevel`が`1`になるため、バッチ内で他の処理へ影響を与えないように`& verify>nul`で`verify`コマンドの実行を連結して、`errorlevel`を`0`で上書きする。（古典的なやり方かも）

[^1]: シグナルを送る場合、`/si`オプションを使って`waitfor /si dummy`のように指定する。（別のコマンドプロンプトを開いて実行）

# さらに他の方法

pingを使う方法が紹介されている場合もある。

```bat:pingを利用する方法
ping -n 11 localhost>nul
```

ただ、この方法は`errorlevel`が`1`になるような副作用はないものの、pingの送信間隔が必ずしも1秒ではない（実際にはもっと短い）ことと、実際に待ちたい間隔+1を指定する必要がある[^2]ため、長い時間を指定するほど誤差が生まれやすい。

[^2]: `ping -n 1 localhost`で試せばわかるが、1回目の送信が即時終了するため。
Bootstrapのカスタマイズ

BootstrapのCSSファイルを丸ごとインポートすると、既存のデザインに影響を与えてしまうことがある。
必要な部分だけ使用したい場合、以下ページでBootstrapのCSSファイルやJSファイルを取捨選択してカスタマイズすることができる。

https://getbootstrap.com/docs/3.3/customize/

参考
https://mndangler.net/2017/03/bootstrap_bottun_only/
簡略Typography

# ほんの少しの調節で文字は生き生きする
バナーデザインで使う見出し文字装飾、悩みますよね。
目立たせたいけど派手にし過ぎるのは嫌だな…あと時間もかけられない…そんなときに私がよく使う**「簡単なのにオシャレ・目を引くリズムを使った見出し文字装飾方法」**をまとめてみました。
ネタが尽きてしまった時に思い出して、参考にして頂ければ幸いです！

# 文字装飾の基本はリズム
ごちゃごちゃとレイヤースタイルで弄らなくても、オシャレで目立つ見出しデザインはリズムで作れます。基本の文字の動かし方を覚えて、部分部分で組み合わせる事で見出しを作っていきましょう。

![6d6e5a5f-2b42-07b0-b15c-0e58f1c9b55c.png](https://qiita-image-store.s3.amazonaws.com/0/54944/e0a5a16a-df45-e530-71ad-376f8e440941.png)
今回はこれを例にリズムをつけていきます。

---

①文字のアウトラインをずらす
![93d9233c-c864-b508-ced8-1814229dd4ab.png](https://qiita-image-store.s3.amazonaws.com/0/54944/1f9d1481-ed1e-f8b5-3c09-603c72ca4cde.png)


---

②文字の大小を変化させる
![2993c2db-1ae1-d8f2-454a-36f6317b028a.png](https://qiita-image-store.s3.amazonaws.com/0/54944/6bc3f7b4-089b-dca3-545e-6afbd0b302c2.png)


---

③文字の一部のウェイトを変える
![2bcce889-2ed0-a47e-8129-8dad447a525a.png](https://qiita-image-store.s3.amazonaws.com/0/54944/93cd827c-d76f-cfeb-4090-0ec0cc0bf08c.png)


---

④文字の一部に装飾をつける
![115db8c6-d2e7-8e53-7cd2-e5a928ac1ed9.png](https://qiita-image-store.s3.amazonaws.com/0/54944/915ad54b-028c-2238-4c5b-146dcbf2aef7.png)


---

⑤文字の一部のフォントを変更する
![876e5262-d392-4929-450c-34bb30fcf86e.png](https://qiita-image-store.s3.amazonaws.com/0/54944/026ffcee-5871-f3d7-bd07-18b894a5a2fa.png)


---

⑥文字同士をたっぷり離す
![3522653c-6672-6a53-2db1-b0fd918a4a4d.png](https://qiita-image-store.s3.amazonaws.com/0/54944/6e2fc578-6d1d-69b7-0f01-b43a764fe0da.png)


---

⑦文字をグリッドで揃える
![0d85f3e7-c3cf-514d-41c9-cdc96103fea3.png](https://qiita-image-store.s3.amazonaws.com/0/54944/5a43c782-fb28-cb0b-0f24-c7c6387effbe.png)


---

⑧文字の一部に色をつける
![e6ceede2-ec0f-85f1-3b8b-bf6ede9b03e8.png](https://qiita-image-store.s3.amazonaws.com/0/54944/8d87bf9c-d58d-2a9a-0ce9-a06fe2a75768.png)


---

基本な文字の動かし方を複数組み合わせる事で、このような見出し文字を作る事ができます。
(②、⑤、⑦、⑧を使用しました)
![753e99c5-91ca-43a4-2295-5b43f0b8136e.png](https://qiita-image-store.s3.amazonaws.com/0/54944/00f0e1a6-b148-6755-5bac-a1caae59bff5.png)




## 時間がなくてもそれなりに美しいタイポグラフィは作れる
いかがだったでしょうか？考え出すと止まらない文字装飾の世界、凝るならどこまででも凝ることができますが、いつもいつも時間がある訳ではないのが辛いところですね。  
コスパの良い装飾方法を覚えて、貴重な製作時間を有効に使っていきましょう！
爆速Photoshop

#ショートカットを制するものは時間を制する
画像加工用ソフトの最高峰Photoshop。とても沢山のツールが用意されていますが、その殆どに便利なショートカットが設定されている事はご存知ですか？
ここでは、そのPhotoshopでの**「まず覚えるべき基本のショートカット」**に加え、**「設定しておくと爆速になるオリジナルショートカット」**を記載していきたいとおもいます。

##まずはお友達から…基本的なショートカットを覚えよう
Adobeが配布しているチートシートはこちら
[これで作業効率が劇的に上がる！ Photoshopのショートカットキー早見表](https://helpx.adobe.com/jp/photoshop/how-to/use-shortcut-keys-for-efficiency-photoshop.html)
![c919f10e-e5da-1423-d557-4af89e6efc0e.png](https://qiita-image-store.s3.amazonaws.com/0/54944/88aa3db4-2392-ea8f-577e-e040c07ffe6c.png)

すばらしいチートシートですね！これを全て覚えていればAdobeツールを教える講師になれます。
しかしやはり量が多い…ぱっと見ただけでもウッとなってしまい、覚える気が削がれてしまいますね。
セレスではLPを作ったりバナーを作ったり、というPhotoshopの使い方が多いので、そこの部分で特によく使うショートカットをピックアップしてみました。
本当によく使う基本中の基本20個、まずは以下を頑張って覚えてみましょう！

|ショートカット|何が出来る？|
|:-:|:-:|
|Z|拡大|
|Z選択中に⌥|縮小|
|V|オブジェクト/レイヤーの移動|
|V選択中に⌘|クリックしたオブジェクト/レイヤーの選択|
|T|テキスト入力|
|P|ペン(パス)|
|B|ブラシ|
|G|バケツ|
|I|スポイト|
|U|シェイプ|
|X|描画色・背景色の切り替え|
|L|なげなわ選択|
|W|自動選択|
|M|範囲選択|
|space|手のひら(押している時だけ)|
|⌘+A|すべてを選択|
|⌘+D|選択解除|
|⌘+T|自由変形|
|⌥+DEL|描画色で塗りつぶし|
|⌘+DEL|背景色で塗りつぶし|

:bulb:豆知識
各種ツールはshiftを押しながらショートカットを実行することで、そのツールと似ている機能を順繰りに選択できます。
<img width="212" alt="8365726d-9248-5839-56a8-b01028bc18ca.png" src="https://qiita-image-store.s3.amazonaws.com/0/54944/308b1d5d-02d7-b285-0fd5-c611282c2609.png">


基本的なショートカットを覚えるとツールを探す時間が減り、使いこなせなかった時と比べて作業効率が大分アップしたのではないでしょうか？
ツールの基本形を覚えたら次はレイヤー系、そして少し踏み入ったオプション機能など、様々なものを覚えていきましょう！きっと今まで以上にPhotoshopと仲良くなれるはずです。



##愛着を感じてきたら…オリジナルショートカットを作ろう
さて、基本のショートカットを使いこなし、それなりにPhotoshopとの絆を深めている方もいると思いますが、使い続けている中でこう思った事は無いでしょうか？

***「あっ、この項目ショートカット無いんだ」***

そう。意外と使うのにショートカットが無い。そんな項目に出会った事があったと思います。
結構深い階層にあるのにショートカットが無いなんて…わざわざ毎回そこまで行くのめんどくさいなぁ…。そう思い始めたら思い切って**オリジナルショートカット**を作ってみませんか？
折角いつだって一緒にいるパートナーツールなのですから、愛情を込めてもっともっと使いやすくしてあげましょう！

```
オリジナルショートカット設定場所
Photoshop > 編集 > キーボードショートカット
```

オリジナルショートカットを作成する項目は各々変わってくるとは思いますが、このページでは私個人が今現在設定している物を載せておきます。いいじゃん！と思ったら是非設定して使ってみてください！
特におすすめなのはレイヤー系のショートカットです。

###レイヤー系のショートカット
|ショートカット|何が出来る？|
|:-:|:-:|
|⌘+¥|レイヤースタイルを開く|
|⌘+Control+C|レイヤースタイルのコピー|
|⌘+Control+V|レイヤースタイルのペースト|
|⌘+Control+Z|レイヤースタイルの削除|
|⌘+R|レイヤーの名前変更|
|⌘+Control+S|スマートオブジェクトに変換|
|⌘+Control+R|レイヤーをラスタライズ|
|⌘+Control+T|レイヤーを上下反転|
|⌘+Control+Y|レイヤーを左右反転|
|⌘+Control+P|PNGでクイック書き出し(選択レイヤー)|

###編集系のショートカット
|ショートカット|何が出来る？|
|:-:|:-:|
|⌘+Control+U|スマートオブジェクトとして画像を配置|
|⌘+⌥+Control+P|PNGでクイック書き出し(ファイル/ボード)|

###ツール系のショートカット
|ショートカット|何が出来る？|
|:-:|:-:|
|Q|カラーピッカー※|
|Y|指先ツール|
※クイックマスクに割り当てられているショートカットをカラーピッカーに変更しました

##毎日使って手に覚えさせよう
頭で考えているだけでは中々覚えないものです。日々の業務の中でなるべくショートカットを使うこと優先し、手に覚えさせる事が重要です。Photoshopショートカットチートシートを見て「う〜ん多い！」と諦めてしまった方も、是非この記事を参考にしてちょっとずつ基本中の基本から覚えていってもらえればと思います。
それでは、Photoshop内迷子脱出で作業効率をあげ、毎日定時で帰りましょう！
jsdoでbpmn その3

#概要
jsdoでbpmn-jsやってみた。
モデルのxml取得してみた。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/8/x/7/8x7I.jpg?t=1511954981)

#成果物
http://jsdo.it/ohisama1/8x7I

以上。
【VBScript】ServerXMLHTTPでWebAPIにアクセスする

![ad_banner4.gif](https://qiita-image-store.s3.amazonaws.com/0/8292/ef5f6cbc-0702-1c98-580f-786429f835e5.gif)

このエントリーは[アラタナAdventカレンダー](https://qiita.com/advent-calendar/2017/aratana)3日目のエントリーです。
2日目は @mather314 さんによるエントリーでした。

平素は大変お世話になっております。アラタナ開発部の @aratana_ogawa です。

アラタナ Advent Calendar 2017 も3日目ですね。今回はASP(VBScript)でWebAPIにアクセスする方法について触れてみようと思います。

## ServerXMLHTTP とは

ServerXMLHTTP は、サーバーをセキュリティで保護しながら、異なる Web サーバー間で HTTP アクセスを行うためのメソッドとプロパティを提供します。このオブジェクトを使用して、異なる Web サーバー間で XML/JSON データを交換できます。

## 実装

さっそく実装してみましょう。例として[Qiita API](https://qiita.com/api/v2/docs#タグ)の `v2/tags` をたたいて `vbscript` のタグ情報を取得してみます。

```vbnet
Dim oHTTP : Set oHTTP = CreateObject("MSXML2.ServerXMLHTTP")
oHTTP.Open "GET", "https://qiita.com/api/v2/tags/vbscript", False
oHTTP.SetRequestHeader "Content-Type", "application/json"
oHTTP.Send()

Response.write "status: " & oHTTP.status
Response.write "ResponseText: " & oHTTP.ResponseText

Set oHTTP = Nothing
```

### 出力結果

```
status: 200
ResponseText: {"followers_count":96,"icon_url":"https://s3-ap-
northeast-1.amazonaws.com/qiita-tag-
image/0d1729c2a49f71e7c201686d051382a3df4cf96b/medium.jpg?
1434007445","id":"VBScript","items_count":163}
```

簡単ですね！

少し解説してみます。

```vbnet
oHTTP.Open "GET", "https://qiita.com/api/v2/tags/vbscript", False
```

`Open` メソッドで「要求するメソッド」「URL」「非同期通信かどうか」を指定しています。

```vbnet
oHTTP.Send()
```

`Send` メソッドでサーバーに HTTP 要求を送信し、応答を受信します。

```vbnet
Response.write "status: " & oHTTP.status
Response.write "ResponseText: " & oHTTP.ResponseText
```

ここでレスポンスのステータスと内容を文字列として表示しています。
今回はJSONをそのまま表示していますが、実際には "ASPJSON" などのライブラリを使って、JSONをパースすることになると思います。

参考：[レガシーASPのJSON入出力用ライブラリ "ASPJSON"のメモ \- Qiita](https://qiita.com/sisisin/items/f45174eda8a2f766d921)

### タイムアウトを検知する

より実用的な実装にするため、タイムアウトを検知する方法も紹介しておきます。

```vbnet
Dim oHTTP : Set oHTTP = CreateObject("MSXML2.ServerXMLHTTP")
oHTTP.Open "GET", "https://qiita.com/api/v2/tags/vbscript", True
oHTTP.SetRequestHeader "Content-Type", "application/json"
oHTTP.Send()

If oHTTP.readyState <> 4 Then
	oHTTP.waitForResponse(10)
End If

If oHTTP.readyState = 4 Then
	Response.write "status: " & oHTTP.status
	Response.write "ResponseText: " & oHTTP.ResponseText
Else 
	Response.write "Timeout!"
End If

Set oHTTP = Nothing
```

これも解説していきます。

```vbnet
oHTTP.Open "GET", "https://qiita.com/api/v2/tags/vbscript", True
```

まずは非同期フラグを `True` にするのがポイントです。こうしないと、後述する
 `waitForResponse` がうまく動きません。

```vbnet
If oHTTP.readyState <> 4 Then
	oHTTP.waitForResponse(10)
End If
```

ここで `readyState` が `4`、つまり「完了」ではない場合は `waitForResponse` を使って 10 秒待ちます。

```vbnet
If oHTTP.readyState = 4 Then
	Response.write "status: " & oHTTP.status
	Response.write "ResponseText: " & oHTTP.ResponseText
Else 
	Response.write "Timeout!"
End If
```

10秒後、`readyState` が `4` になればレスポンスを出力し、
そうでなければタイムアウトと判断します。

◆

以上、ServerXMLHTTP について解説してみました。

## さいごに

明日は東京から宮崎に移住したエンジニアの話です。
みなさま良い ASP ライフを！

## リンク

* [IServerXMLHTTPRequest/ServerXMLHTTP メンバー](https://msdn.microsoft.com/ja-jp/library/ms754586(v=vs.85).aspx)
私が初めて作ったWebComponentsのご紹介

Polymerアドベントカレンダー１日目を担当します、川上と申します。
今回は、私が初めて作って公開したWebComponentsを紹介させ頂きます。

# [split-upload](https://www.webcomponents.org/element/monkick/split-upload)

### 概要
動画ファイルなど、ファイル容量の大きなファイルをアップロードする際に、一定のサイズで分割してアップロードすることが出来ます。

### インストール方法
　はじめに、[webcomponents.org](https://www.webcomponents.org/)にアクセスし、検索BOXで`upload`と検索してもらうと、uploadに関連する機能を持ったタグがリストアップされ、その中に、`split-upload`がありますので、そちらを選択して下さい。
　次に、画面の右パネルに`INSTALLED VIA BOWER`とありますので、そちらを選択しますと、[Bower](https://bower.io/) を使ったインストールコマンドが表示されますので、そのとおりに実行して下さい。
　インストール後に、使いたい`.html`ファイルを開き、`<header>`内に以下を記入して下さい。

```
<header>

    ...

    <link rel="import" href="bower_components/split-upload/split-upload.html">
</header>
```

### 使い方
HTMLに以下のようにタグを入力します。

```html
<upload-split id="uploadSplit" url="/foo/bar"></upload-split>
```

`url`パラメーラーは、送信先を指定します。
このままではファイルを指定できないので、ファイルを選択するボタンと、ファイルを送信するボタンを追加します。

```html
        <upload-split id="uploadSplit" url="/foo/bar">
          <button onClick="choice()">choice</button>
          <button onClick="upload()">upload</button>
        </upload-split>

        <script>
            function choice () {
                const split = document.getElementById ('uploadSplit');
                split.choiceButtonClick ();
            }

            function upload () {
                const split = document.getElementById ('uploadSplit');
                split.uploadButtonClick ();
            }
        </script>
```

`choice`メソッドは、ファイルを指定するメソッドでクリックされた時に、`split-upload`の`choiceButtonClick`メソッドを実行するようにしています。

`upload`メソッドは、ファイルを送信するメソッドでクリックされた時に、`split-upload`の`uploadButtonClick`メソッドを実行するようにしています。

以上で、ファイルを送信先に分割して送ることが出来ます。分割サイズについては、デフォルトでは５MBで分割するようになっております。
※受け取った後に、サーバー側で分割されたものを合成する必要があります。そのサンプルコードは[こちら](https://www.webcomponents.org/element/monkick/split-upload)に書いておりますので参考にして下さい。

### 感想
　大きな動画ファイルをアップロードする事は、以前からなんとなくやり方はわかっておりましたが、いざとなると、「どうやって分割するの？」「分割して壊れないの？」「戻す時はどおするの？」など、色々とわからない点が出てきましたが、Google検索でなんとかなりました。
　またWebComponentsにして良かったところは、今回のように「実装が複雑な機能」を、HTMLタグとして使えるようになるという事です。`split-upload`は、`ファイル選択`と`ファイル送信`にJSを使いましたが、このJSを無くしパラメーターのみにすることも可能です。そうなると、HTMLタグのみで複雑な機能なども動かせることになります。まさに、HTMLのエコシステムと言えると思います。
　是非、ここまで読んで頂けた方は特に、WebComponentsを作って、それを公開してエンジニアみんなが、よりクリエイティブな事に専念できる世界を作っていきましょう！
HTTPステータスコード 超簡易版

wikipedia記事の抜粋です
https://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89

## HTTPステータスコードとは？
HTTPにおいてWebサーバからのレスポンスの意味を表現する3桁の数字からなるコード

## 200番台: Success
200 OK

## 300番台: Redirection

## 400番台: Client Error
400 Bad Request
401 Unauthorized
404 Not Found

## 500番台: Server Error
500 Internal Server Error
503 Service Unavailable
LinkedBlockingQueueのdrainToは安全なのか、ソースを追った

## 概要
業務で、`LinkedBlockingQueue`から、一時点の状態を取得する必要に迫られたので、`drainTo`を使うことにしました。

`drainTo`は、

> このキューから利用可能なすべての要素を削除し、それらを指定されたコレクションに追加します。

というメソッドです。

ただ、ヘルプを見ると、

> オペレーションの進行中に指定されたコレクションが変更された場合の、このオペレーションの動作は定義されていません。

[掲載元](https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/LinkedBlockingQueue.html#drainTo-java.util.Collection-)

という、不安な一文があり、問題が無いかどうか調査しました。

2017/11/30追記
※コメントで、**指定されたコレクション**とは、引数で渡されたコレクションを指す、とご指摘いただきました。
よって、引数で渡されるコレクションがスレッドセーフであれば、問題ないようです。
ただし、以下の調査内容はそのまま残します。

## ソース
```java:LinkedBlockingQueue.java
/**
* @throws UnsupportedOperationException {@inheritDoc}
* @throws ClassCastException            {@inheritDoc}
* @throws NullPointerException          {@inheritDoc}
* @throws IllegalArgumentException      {@inheritDoc}
*/
public int drainTo(Collection<? super E> c, int maxElements) {
    if (c == null)
        throw new NullPointerException();
    if (c == this)
        throw new IllegalArgumentException();
    if (maxElements <= 0)
        return 0;
    boolean signalNotFull = false;
    final ReentrantLock takeLock = this.takeLock;
    takeLock.lock();
    try {
        int n = Math.min(maxElements, count.get());
        // count.get provides visibility to first n Nodes
        Node<E> h = head;
        int i = 0;
        try {
            while (i < n) {
                Node<E> p = h.next;
                c.add(p.item);
                p.item = null;
                h.next = h;
                h = p;
                ++i;
            }
            return n;
        } finally {
            // Restore invariants even if c.add() threw
            if (i > 0) {
                // assert h.item == null;
                head = h;
                signalNotFull = (count.getAndAdd(-i) == capacity);
            }
        }
    } finally {
        takeLock.unlock();
        if (signalNotFull)
            signalNotFull();
    }
}

```

なお、実際に使っているのは、引数一つの`drainTo`ですが、

```java:LinkedBlockingQueue.java
return drainTo(c, Integer.MAX_VALUE);
```

と、オーバーロードしている同メソッドを呼び出しているだけなので、こちらを確認すれば問題ないです。

## 変数
### takeLock
データの**取り出し**に、ロックをかけるための、ロックオブジェクトです。

### putLock
上記ソースには出ませんが、データの**追加**にロックをかけるための、ロックオブジェクトです。

### count
`AtomicInteger`型のフィールドです。
データ変更のたびに、クラス内で手動変更しているようです。
（単に`Queue.size`を返しているわけではない模様）

### 解説
必要な部分だけ、上から順に見ていきます。

* ロック獲得

```java
final ReentrantLock takeLock = this.takeLock;
takeLock.lock();
```

データ取得を開始する前に、取得ロックを獲得します。
*追加ロックはいらないの？*思いましたが、下記処理によって不要となっています。

* 件数取得

```java
int n = Math.min(maxElements, count.get());
```

データ取得を始める前に、**先頭から何件取得するか**決めています。
こうすることにより、**drainToの処理中に追加されるデータを無視する**ことができるようになっています。

## 結論
* データの取り出しは、`drainTo`の中でロックを獲得しているため、安全に行われる
* データの追加は、最初に取得データ件数を求めているため、`drainTo`とは無関係に、安全に行われる
* よって、`LinkedBlockingQueue.drainTo`は、マルチスレッド環境下においても、安全に実行できる

と言えるようです。

## 余談（感想）
個人的には、

**まとめてデータ取得するなら、その間の追加もロックかけるべきだろ！**

と考えてしまいます。

「先にデータ件数を決めてしまう」というアプローチもあるのかと、正直感心しました。
すごくいい勉強になりました。
強化学習OpenAIGymを使うための環境をWindowsで作ってみた 

2017/11/30 現在　書き溜め中
表題の件、サイトで調べ回った結果苦労した点をメモ！


1.仮想環境の準備
1.1　環境のインストール
仮想環境　　　　：VMWare
インストールOS　：Ubuntu16.04

参考サイト様：http://choreonoid.org/ja/workshop/vmware.html

補足：ところどころroot権限が必要な場合があるので書きを参照
参考サイト様：
http://note.kurodigi.com/post-0-10/
sudo suで結局は良いみたいです・・。

1.2　Ubuntu16.04の細々した設定

■　キーボード
参考サイト様：
http://blog.amedama.jp/entry/2017/03/10/210552
英字用のキーボード入力になっているようなので変更。
Generic 105-key (Intel) PC >
Japanese >
Japanese >
The default for the keyboard layout >
No compose key
と設定するのがミソ

■　日本語化
https://www.server-world.info/query?os=Ubuntu_16.04&p=japanese

2.OpenAIGymインストール
※インストール時のエラー対処については、順不同の可能性があるので申し訳ない！

インストール
参考サイト様：https://github.com/openai/gym

2.1.コマンド
■　git clone https://github.com/openai/gym.git

プログラム 'git'は現在インストールされていません。次のように入力してインストールできます。		
sudo apt install git
↑を打つ！

Intel VT-x に対応していますが、Intel VT-x は無効になっています。

エラーの対応手順
参考サイト様：
https://www.linuxmaster.jp/linux_blog/2015/01/intel-vt-x-intel-vt-x.html
http://faq.epsondirect.co.jp/faq/edc/app/servlet/relatedqa?QID=029608
※仮想化機能(インテルVT：Virtualization Technology)を有効にする必要あり
「Advanced」-「CPU Configuration」-「Virtualization Technology」/「Intel(R) Virtualization Tech」/「Vanderpool T		echn	ology」を「Enabled」に設定します。
Ubuntu16.04LTS server を無線LANでインストールすると無線LANに接続できない

# Ubuntu16.04LTS Serverを無線LANでインストールすると無線LANに接続できない

## 現象
Ubuntu16.04LTS serverをインストール時に無線LANを選択すると、インストール時には無線LANが有効となるものの、インストール後再起動時に無線LANが有効にならない。

## 解決策
手動で設定ファイルを書く

```
$ wpa_passphrase SSID password > ~/wpa_supplicant.conf

$ cat ~/wpa_supplicant.conf
network={
    ssid="SSID"
    psk=***************************************
```


```
sudo cp ~/wpa_supplicant.conf /etc/wpa_supplicant.conf
```


インターフェース名を調べる。(wlp1s0等)
```
ifconfig -a
```

```:/etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

auto wlp1s0
iface wlp1s0 inet static
address 192.168.10.201
netmask 255.255.255.0
gateway 192.168.10.1

wpa_conf /etc/wpa_supplicant.conf
```

DNSの設定

再起動
```
sudo shutdown -r now
```
AWS re:Invent Andy Jassy's KEYNOTE

現地より自分のレポート用まとめ

# Andy Jassy’s KEYNOTE

・800億ドル。42%の成長率
・クラウドで生まれたSI会社を紹介(日本に関したはCloudpackも紹介)
・毎年お馴染みGartnerのマジッククアドラント。
 　 - IaaSにおいてAWS以外のシェアを全て合わせても半分に満たない
　https://aws.amazon.com/jp/resources/analyst-reports/
・17以上のAZをこれから追加予定
・VM wareとシームレスにつなげるクラウドはAWSだけ
・他者を色で表示していかに違うかを表示
　- 他者ではAWSの半分くらいが限界
・やはり、LightsailはEC2(T2インスタンス)よりもしたという位置付けの様子
・Lambdaの年間成長率300%。サーバーレスへの注目が高い
・OrchestrationにはやはりStep Functionを押している
・サーバーレスは他者はAWSの1/3しかできていない
・

## [Expedia CEO]
・世界有数のEコマーステクノロジー。
・人のロジスティクスをやっている会社
・96年にMicrosoftの一部門としてスタート
・1000万行のC++のコードを書き直した(日々イノベーションを行なっている)
・1日あたり2000デプロイ
・今後2年間をかけて、全てをAWSに持っていく

## [新サービス：Amazon Elastic Container Service for Kubanate(EKS)]
・Kubanate用のコンテナサービス。
・ECSをKubanate用拡張したサービス

## [新サービス：AWS Fargate]
・ECSやEKSをマネジメント
・タスクレベルでコンテナをコントロール

## [新サービス：Aurora Multi Master]
・read/WriteがスケールするAurora
・AZを超えてRead/Write可能
・2018年に複数のリージョンで利用可能に

## [新サービス：Aurora Serverless]
・Auroraの全機能をサーバーレスに！！
・必要な時だけ起動されるAuroraの
・何これ、素晴らしい！！

## [新サービス：DynamoDB  Global Table]
・リージョンを超えて同時に展開。
・グローバルな顧客向け

## [新サービス：DynamoDB Back up & restore]
・瞬時にバックアッップトリストアを行う
・過去35日間のリストアを瞬時に可能

## [新サービス：Amazon Neptune]
・フルマネージドグラフデータベース
・何10億というリレーションをあっという間にクエリで検索可能
・グレムリン、スパークルのクエリ処理に対応

## [Goldman Sachs CEO]
・ほとんどがエンジニア
・オンプレからAWSに移行
・新しいビジネス、イノベーションを行うために業界のリーダーとなるパートナーが欲しかった
・強固な管理に対してKEYが必要と要望。(BYOK:Bring your own key)
・これからは主要アプリケーションをパブリッククラウドに移管していく

## [新サービス：S3 Select]
・S3に入っている情報から必要な情報だけを持ってくる
・標準的なSQLの記法で実行可能
・すげー！！！Athenaいらないじゃん！

## [新サービス：Glacier Select]
・Glacierも取り出せないとね。
・S3 SelectのGlacier版

## [新サービス：Amazon Sagemaker]
・Machine Learningのモデルを簡単に作れる
・よく使われるアルゴリズムを選択することもできる
・Tensorflowなどメジャーなフレームワークは組み込み済み
・ABテストもできる

## [新サービス：AWS DeepLens]
・DeepLearning向けに最適化されたカメラ
・Lambdaトリガーにも対応
・カメラ出したw Snowball以来の衝撃 !!

## [新サービス：Amazon Recognition Video]
・動画でのRecognition
・Person Tracking(フレームから出た人もスケルトントラッキングという技術で人を認識)

## [新サービス：Amazon Kinesis Video Stream]
・各メーカーのデバイスのSDKをサポート。デバイスからKinesisのようにAWSに流し込める
・Video Recognitionと統合。

## [新サービス：Amazon Triscrive]
・自動音声認識
・長時間の音声認識
・最初は英語とスペイン語
・マシンラーニングを入れて使いやすいようにする。
・Videoの字幕付なども楽になるかも

## [新サービス：Amazon Translate]
・リアルタイム翻訳

## [新サービス：Amazon Comprehead]
・フルマネージド自然言語処理
・トピックモデリング(何千もの記事からビジネスの記事を抽出など)
・傾向に応じてフィルタにかけて分類。対象に応じて見せる

## [NFL CIO]
・放送局がリアルタイムの情報を見せられる(選手位置などをRFIDでとっている)
・スピードの分析なども

## [新サービス；AWS IoT 1-Click]
・デバイスを登録して、Lambdaを1クリックで。

## [新サービス：AWS IoT Device Management]
・何千というローケーションから1clickで取得
・メーカーや型番を引っ張ってトラブルシューティング
・

## [新サービス：AWS Not Device Defender]
・セキュリティポリシーの定義と強化
・ベストプラクティスを適用
・複数拠点のデバイスのセキュリティー管理


## [新サービス：AWS IoT Analitycs]
・チャンネルを定義し、分析。

## [新サービス；Amazon Free RTOS]
・IoTデバイス用のOS

## [新サービス：Green grass ML Inference]
・つくったMachine Learningのモデルをデバイスに適用する
AWS Reinvent2017 KeyNote#1 で発表されたサービスまとめ（リンク付き）

Instace、DBも進化させつつ、IoT, MLに本気で攻めてきている　Good balance!

# Instance and Container
## The preview of Amazon Elastic Container Service for Kubernetes (EKS)
– now it’s easier than ever to run #kubernetes on AWS. #reInvent http://amzn.to/2hZkkRv

##AWS Fargate 
- Now you can run containers without having to deploy, manage, or update clusters or servers. #reInvent http://amzn.to/2jvbQlm

## Amazon EC2 Bare Metal Instances with EC2 I3! 
- #reInvent http://amzn.to/2BmLtpf

# DB,Storage
## Aurora Serverless.
- All the capabilities of Aurora, but pay only by the second when your database is being used https://aws.amazon.com/jp/blogs/aws/in-the-works-amazon-aurora-serverless/

## Amazon S3 Select 
- filters data within an object & can accelerate applications up to 400%! #reInvent http://amzn.to/2jvNfx4

# ML 
## Amazon SageMaker! 
- A fully managed service to build, train & deploy machine learning models at scale. #reInvent http://amzn.to/2jv2eqW

## Amazon Comprehend 
- you can now discover insights & relationships in text. #reInvent http://amzn.to/2j0LtV6

## Kinesis Video Streams:
-ingest & store video streams for analytics, machine learning, & more! #reInvent http://amzn.to/2hZ9Cuq

## Amazon Transcribe
- a fully managed & continuously trained automatic speech recognition (ASR) service that converts speech to text! #reInvent http://amzn.to/2juMG6H

## Amazon Rekognition Video
- Add video analysis to your applications using our new Amazon Rekognition Video. #reInvent http://amzn.to/2jwyf1I

##aws DeepLens - Get Hands-On Experience with Machine Learning Using our New Video Camera - http://amzn.to/2iiKm65 #reinvent


# IoT 系

##AWS IoT Device Management 
- securely onboards, organizes, monitors & remotely manages your IoT devices at scale! http://amzn.to/2jx242v

## Amazon FreeRTOS:
-IoT microcontroller operating system that makes small, low-powered edge devices easy to program, deploy, secure, connect & maintain. #reInvent http://amzn.to/2i4gNRP

## AWS IoT Analytics 
- cleans, processes, enriches, stores & analyzes IoT device data at scale. #reInvent http://amzn.to/2i1rQLP

## AWS IoT Device Defender 
- Audit device fleets & detect abnormal behavior. #reInvent http://amzn.to/2jvvyOd

## AWS Greengrass ML
- https://aws.amazon.com/jp/greengrass/ml/
Google Assistant 開発用ブックマーク


Actions On Google 
ダッシュボード
https://console.actions.google.com/?pli=1

Converse（チャットボット作成）
ダッシュボード
https://radiotaisoudaiichi8668.converse.ai/#/dashboard
ドキュメント
https://get.converse.ai/docs/how-to-get-started

Dialog
ダッシュボード
https://console.dialogflow.com/api-client/
ドキュメント
https://developers.google.com/actions/dialogflow/


Alexa Skills をAPI.AI(=DIalog Flow)にインポートする
https://github.com/dialogflow/fulfillment-webhook-importer-nodejs
CWL User Guide 21: Writing Workflows をやってみた

# CWL User Guide 21: Writing Workflows

今回は、いくつかのツールをまとめてワークフローにする方法について書かれています

Key Points より引用

* Each step in a workflow must have its own CWL description.
* Top level inputs and outputs of the workflow are described in the inputs and outputs fields respectively.
* The steps are specified under steps.
* Execution order is determined by the flow of inputs and outputs between steps.


# この回にでてくる主なキーワード


# CWLファイル、1st-workflow.cwl

```1st-workflow.cwl
#!/usr/bin/env cwl-runner

cwlVersion: v1.0
class: Workflow
inputs:
  inp: File
  ex: string

outputs:
  classout:
    type: File
    outputSource: compile/classfile

steps:
  untar:
    run: tar-param.cwl
    in:
      tarfile: inp
      extractfile: ex
    out: [example_out]

  compile:
    run: arguments.cwl
    in:
      src: untar/example_
```

# パラメータファイル 1st-workflow-job.yml

```
inp:
  class: File
  path: hello.tar
ex: Hello.java
```

# 必要なファイル

`arguments.cwl`, `tar-param.cwl` と
`Hello.class` を持っている `hello.tar` です。
これらは以前作ったものがつかえます。
  

# 実行

## 実行前確認

`Hello` ではじまるファイルが無いことが確認できます

```
$ rm Hello.*
$ ls
1st-workflow.cwl  1st-workflow-job.yml  arguments.cwl  hello.tar  tar-param.cwl
```

## 実行方法


## 実行結果

```
$ cwltool 1st-workflow.cwl 1st-workflow-job.yml
/usr/local/bin/cwltool 1.0.20171107133715
Resolved '1st-workflow.cwl' to 'file:///home/vagrant/cwl_user_guide_work/21-1st-workflow/1st-workflow.cwl'
[workflow 1st-workflow.cwl] start
[step untar] start
[job untar] /tmp/tmpCI9OHQ$ tar \
    xf \
    /tmp/tmpLIXNiE/stg205fd207-085e-47cf-b3cc-476f28a33da8/hello.tar \
    Hello.java
[job untar] completed success
[step untar] completed success
[step compile] start
[job compile] /tmp/tmp3Ui2EV$ docker \
    run \
    -i \
    --volume=/tmp/tmp3Ui2EV:/var/spool/cwl:rw \
    --volume=/tmp/tmpwFWaRm:/tmp:rw \
    --volume=/tmp/tmpCI9OHQ/Hello.java:/var/lib/cwl/stg713fb841-c885-436b-b0b3-ba8e5a93a43a/Hello.java:ro \
    --workdir=/var/spool/cwl \
    --read-only=true \
    --user=1000:1000 \
    --rm \
    --env=TMPDIR=/tmp \
    --env=HOME=/var/spool/cwl \
    java:7-jdk \
    javac \
    -d \
    /var/spool/cwl \
    /var/lib/cwl/stg713fb841-c885-436b-b0b3-ba8e5a93a43a/Hello.java
[job compile] completed success
[step compile] completed success
[workflow 1st-workflow.cwl] completed success
{
    "classout": {
        "checksum": "sha1$e68df795c0686e9aa1a1195536bd900f5f417b18",
        "basename": "Hello.class",
        "location": "file:///home/vagrant/cwl_user_guide_work/21-1st-workflow/Hello.class",
        "path": "/home/vagrant/cwl_user_guide_work/21-1st-workflow/Hello.class",
        "class": "File",
        "size": 184
    }
}
Final process status is success
```


## 実行結果確認

`Hello.java` と `Hello.class` が新しくできていることがわかる

```
$ ls
1st-workflow.cwl  1st-workflow-job.yml  arguments.cwl  Hello.class  hello.tar  tar-param.cwl
```

# 今回使ったファイル

[cwl\_user\_guide\_work/21\-1st\-workflow at master · manabuishii/cwl\_user\_guide\_work](https://github.com/manabuishii/cwl_user_guide_work/tree/master/21-1st-workflow)
ちょっとずつ読むドメイン駆動設計 第三部 より深い洞察へ向かうリファクタリング 第十章 しなやかな設計8 宣言的スタイル

# これまでの第十章

- [序章](https://qiita.com/YasuhiroKimesawa/items/c240451e6746497fd446)
- [意図の明白なインターフェース](https://qiita.com/YasuhiroKimesawa/items/988ed817de9aac785633)
- [副作用のない関数](https://qiita.com/YasuhiroKimesawa/items/a035d872d630eadeaffb#)
- [表明](https://qiita.com/YasuhiroKimesawa/items/bc2c417c30ec79efce15)
- [概念の輪郭](https://qiita.com/YasuhiroKimesawa/items/32c8ad3c54a4c486041d) 
- [独立したクラス](https://qiita.com/YasuhiroKimesawa/items/ad710fd130fa1aee9df2)
- [閉じた操作](https://qiita.com/YasuhiroKimesawa/items/f79ab74d05bed015e1fb)

# 宣言的な設計
## コードの自動生成？
いくら表明を使ったり、意図の明白なインターフェースなどのパターンを駆使して、モデル駆動で設計しても、結局はどこかで副作用は発生し、手続きをどこかで書かなくてはいけませんね。

じゃあということで、コードの自動生成ツールを使ってみてはということになります。
完全な宣言的設計。宣言に基いて設計を書けばソースコードが生成されるツールってありますよね。

しかし、エヴァンスはこれを否定しています。理由は

- 必要なことをすべて行えるほど表現力豊かではない
- 拡張が困難
- 手書きのコードに組み込み、再生成するとコードが破壊されてしまう。

今でもこの課題って解決されていないのではないでしょうか？

## ルールベースプログラム？
じゃあということで、次にあげられるのはルールベースプログラムのフレームワーク。自分も使ったことは無いですが、これもエヴァンスは否定的です。

- 制御コードが副作用を持ち込む
- ルールの追加・削除・再編成によって予期しない結果になることもある
- 開発者によってコードが付け加えられると破綻する可能性がある
- 誰もがフレームワークのルールに従わなければならない

ただ、そんなフレームワークのなかでも局所的に使われるフレームワークは価値があったといいます。例えば、永続化・O/Rマッピングツールなどです。これらは開発者の負担を減らし、設計の自由を残したまま利用できます。

## ドメイン特化言語？
一昔前に流行ったDSLですね。DSLを使えばプログラムは表現力豊かになり、ユビキタス言語とも強く結びつけることができます。

しかし、DSLにも欠点が・・・

- DSLの保守が必要。モデルを改良するのに、DSLを修正できなくてはならない
- アプリケーションとモデルが同じ言語でシームレスに実装されなければならない。

# 設計の宣言的スタイル

宣言的な設計の利点を多く得るには、これまで読んできた意図の明白なインターフェース・副作用のない関数・表明などのパターンを駆使して、**しなやかな設計**にしていくことが結局は一番近道ということですね。

「宣言的な設計」ではなく「宣言的スタイル」と言っているところがまた絶妙な表現だったりします。
matplotlibで作成したプロットを画像ファイルに保存する方法

matplotlibで作成したプロットを新しいウィンドウに表示するのではなく、画像ファイルに保存する方法です。
サーバーでプログラムを動かした時に役に立ちました。

## 環境
- Ubuntu 14.04.5 LST
- Python 2.7.6
- matplotlib 1.3.1
- numpy 1.8.2

## 画面に表示しないで画像ファイルとして保存する

(1) pyplotをインポートする前にmatplotlib.use('Agg')を記述します。
(2) plt.savefig(figure.png')で画像ファイルとして保存します。この場合カレントディレクトリに保存されます。

```python
import numpy as np
import matplotlib
matplotlib.use('Agg') # -----(1)
import matplotlib.pyplot as plt

# y = f(x)
x = np.linspace(-np.pi, np.pi)
y1 = np.sin(x)
y2 = np.cos(x)

# figure
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

# plot
ax.plot(x, y1, linestyle='--', color='b', label='y = sin(x)')
ax.plot(x, y2, linestyle='-', color='#e46409', label='y = cos(x)')

# x axis
plt.xlim([-np.pi, np.pi])
ax.set_xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
ax.set_xticklabels(['-pi', '-pi/2', '0', 'pi/2', 'pi'])
ax.set_xlabel('x')

# y axis
plt.ylim([-1.2, 1.2])
ax.set_yticks([-1, -0.5, 0, 0.5, 1])
ax.set_ylabel('y')

# legend and title
ax.legend(loc='best')
ax.set_title('Plot of sine and cosine')

# save as png
plt.savefig('figure.png') # -----(2)
```

## 結果
作成された画像ファイルを示します。

![figure.png](https://qiita-image-store.s3.amazonaws.com/0/108851/e6b04df2-f669-f199-b40c-93783a36aebd.png)

## 参考
公式ページの[doc](https://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear)を参考にしました。
CWL User Guide 20: Specifying Software Requirements をやってみた

# CWL User Guide 20: Specifying Software Requirements

今回は、ジョブに対して必要なものや、依存関係などの記述にについて書かれています

# この回にでてくる主なキーワード

* SoftwareRequirement
* hints
* specs

# CWLファイル、custom-types.cwl (ただし明示されていない)

```custom-types.cwl
cwlVersion: v1.0
class: CommandLineTool

label: "InterProScan: protein sequence classifier"

doc: |
      Version 5.21-60 can be downloaded here:
      https://github.com/ebi-pf-team/interproscan/wiki/HowToDownload

      Documentation on how to run InterProScan 5 can be found here:
      https://github.com/ebi-pf-team/interproscan/wiki/HowToRun

requirements:
  ResourceRequirement:
    ramMin: 10240
    coresMin: 3
  SchemaDefRequirement:
    types:
      - $import: InterProScan-apps.yml

hints:
  SoftwareRequirement:
    packages:
      interproscan:
        specs: [ "https://identifiers.org/rrid/RRID:SCR_005829" ]
        version: [ "5.21-60" ]

inputs:
  proteinFile:
    type: File
    inputBinding:
      prefix: --input
  applications:
    type: InterProScan-apps.yml#apps[]?
    inputBinding:
      itemSeparator: ','
      prefix: --applications

baseCommand: interproscan.sh

arguments:
 - valueFrom: $(inputs.proteinFile.nameroot).i5_annotations
   prefix: --outfile
 - valueFrom: TSV
   prefix: --formats
 - --disable-precalc
 - --goterms
 - --pathways
 - valueFrom: $(runtime.tmpdir)
   prefix: --tempdir


outputs:
  i5Annotations:
    type: File
    format: iana:text/tab-separated-values
    outputBinding:
      glob: $(inputs.proteinFile.nameroot).i5_annotations

$namespaces:
 iana: https://www.iana.org/assignments/media-types/
 s: http://schema.org/
$schemas:
 - https://schema.org/docs/schema_org_rdfa.html

s:license: "https://www.apache.org/licenses/LICENSE-2.0"
s:copyrightHolder: "EMBL - European Bioinformatics Institute"
```

# パラメータファイル

明示されていないが19でつかった `custom-types.yml` ではないか？

```
```

# 必要なファイル

`InterProScan-apps.yml`
がない
`test_proteins.fasta`
がない

# 実行

## 実行方法

```
cwltool custom-types.cwl custom-types.yml
```

## 実行結果


```console
$ cwltool custom-types.cwl custom-types.yml
/usr/local/bin/cwltool 1.0.20171107133715
Resolved 'custom-types.cwl' to 'file:///home/vagrant/cwl_user_guide_work/20-software-requirements/custom-types.cwl'
custom-types.cwl:1:1: unrecognized extension field `http://schema.org/license`.  Did you include a $schemas section?
custom-types.cwl:1:1: unrecognized extension field `http://schema.org/copyrightHolder`.  Did you include a $schemas section?
[job custom-types.cwl] /tmp/tmpjRiC7g$ interproscan.sh \
    --outfile \
    test_proteins.i5_annotations \
    --formats \
    TSV \
    --disable-precalc \
    --goterms \
    --pathways \
    --tempdir \
    /tmp/tmpTMGwaq \
    --input \
    /tmp/tmpmNwsQU/stg83da0937-cf6f-4047-8161-6e8246f3154b/test_proteins.fasta
'interproscan.sh' not found
[job custom-types.cwl] completed permanentFail
{}
Final process status is permanentFail
```

# 今回使ったファイル

[cwl\_user\_guide\_work/20\-software\-requirements at master · manabuishii/cwl\_user\_guide\_work](https://github.com/manabuishii/cwl_user_guide_work/tree/master/20-software-requirements)
Scale Free NetworkをMatlabで実装する

## はじめに
[RyosukeCla](https://qiita.com/RyosukeCla)の急な発案によって[明治大学総合数理Advent Calender 2017](https://qiita.com/advent-calendar/2017/meiji-ims)が始まってしまった。とりあえず初日は僕がその場のノリで請け負ってしまった責任もあるので、今やっている何がしかを書いていこう。

## 目標
**Scale Free NetworkをMatlab(2017a)にて実装する。**

## Scale Free Network
Scale Free NetworkとはNetworkの一種で、Nodeの次数(Nodeから出ているエッジの数)がべき分布に従っているようなNetworkである。

なんのこっちゃ？となるので、平たく言うと**「お金持ちがよりお金持ちになる」**っていうことを表すNetworkである。次数がべき分布(裾が重い)に従うNetworkは現実に結構溢れていて、このScale Free Networkはそれをよく表しているとされている。

僕はNetworkの上にある「もの」がどうにかなったり、拡散したりする様子に興味があるので、これを実装していこうという算段である。

*これからNetworkとGraphは同じ意味で使います。*

## Scale Free Networkのレシピ
BarabasiさんとAlbertさんというRandom Network界隈のお偉い方々が考えたレシピは以下の通り。
1. 適当な大きさの完全Graphを用意する。
2. Nodeを一つ付け加える
3. $m$個のNodeを選び、2にて付け加えたNodeから、選んだNodeへとその次数に比例する確率でEdgeを繋ぐ。
4. 2-3をお望みの大きさのGraphが得られるまで続ける。

## 実装
MatlabにはGraphを表現するpackageがあるので、存分に使っていく。
- startSize : レシピ1の完全Graphの大きさ
- m : レシピ3のやつ
- N : レシピ4の「お望みの大きさ」
を引数に取って、Scale Free Networkをgraphとしてreturnする。

```matlab:scalefreenetwork.m

function g = scalefreenetwork(startSize, m, N)
    % create complete graph
    A = ones(startSize) - diag(ones(1, startSize));
    remain = N - startSize;
    g = graph(A);
    
    for r = 1 : remain
        r + startSize
        g = addnode(g, 1);
        
        % add m links
        deg = degree(g);
        prob = rand(m, 1) * sum(deg);
        randIndex = zeros(m, 1);
        
        A = adjacency(g);
        for i = 1 : m
            total = 0;
            
            for j = 1 : startSize + r - 1
                total = total + deg(j);
                if (total >= prob(i, 1))
                    randIndex(i) = j;
                    break;
                end
            end
            
            if (A(startSize + r, randIndex(i)) == 1) 
                continue;
            else
                g = addedge(g, [startSize + r], [randIndex(i)], [1]);
            end
            
            A = adjacency(g);
        end
    end
    
    [~, order] = sort(degree(g), 'descend');
    order
    [g, idx] = reordernodes(g, order);
end
```

## 完成品
Node数200のScale Free Networkはこんな感じ。中心に行くほど次数が高くなるように描画している。
![network.png](https://qiita-image-store.s3.amazonaws.com/0/217692/0f70b7b2-5a82-0d79-f281-51b1f6496ea1.png)
ちなみにこんな感じで描画している。

```matlab
startSize = 16;
m = 5;
N = 200;
g = scalefreenetwork(startSize, m, N);
plot(g, 'LineWidth', 0.2, 'EdgeAlpha', 0.4, 'MarkerSize', 8, 'Layout', 'force');
```
次数のヒストグラムを見るときちんと裾が重くなっている。
![scalefreeDegreeHistogram.png](https://qiita-image-store.s3.amazonaws.com/0/217692/408387ba-b41f-8409-f514-ecc1f1a37926.png)

## 結論
Scale Free NetworkをMatlabにて実装できた。