OmniAICreator/Qiita-1.07M huggingface dataset:
フロントエンド開発環境選定から導入まで

[DMM.com #2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dmm2) 18日目の記事です。

カレンダーのURLはコチラ
[DMM.com #1 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dmm)
[DMM.com #2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dmm2)

こんにちは。
普段はフロントエンド周りの設計、実装を行っています[@abcdarts](https://qiita.com/abcDarts)と申します。
Qiitaには初めて投稿させていただきます。よろしくお願いします。

本記事は時代に取り残されていたフロントエンドの開発環境をなんとか現代レベルに引き上げるために行なった軌跡を記述していますので
最新技術を使ってみた話などエモい話は出てきませんのでご了承ください。

## はじめに
私は現在のプロダクトに今年の6月頃にJoinしました。
それまでいたプロダクトでは、すでにフロンドエンドの開発環境周りは整備済みで、
リファクタリングの余地はあるものの、特段大きく改修をかける必要はないかな？といった状況でした。
現在のプロダクトは6月時点でビルドツールやメタ言語も使っておらず、はっきり言って流れの激しいフロントエンド界隈から遅れをとっていました。
私の直近のミッションは遅れをとっていたフロントエンド開発環境を見直し、生産性の高い現場を作ることでした。

## 考慮すべきこと
DMMではデザイナーもコードを触っています。
ただし、コードの品質の責任はフロントエンドエンジニアが持っているのでコードレビューには
フロントエンドエンジニアの承認が必須といった開発体制をとっています。
ですので開発環境を見直すといってもデザイナーも使いこなせるようなものでないと意味がないと考えました。
また、私の以前いたプロダクトとJoinしたプロダクトは大きな組織体でいうと繋がっていましたので、
その間の人員の流動性が高いことを見越して、ある程度開発環境についてはSyncされているのが望ましいという結論にいたりました。

## どのように技術選定していったか
考慮すべきことで２つの制約条件を述べました。

1. デザイナーでも理解しやすい（学習コストが高くない）
2. 人員の入れ替えに対応しやすい

上記を網羅した上で技術選定を行なっていきました。
まずは1をクリアするためにデザイナーに向けてフロントエンド知識についてのGoogle Formを使ってアンケートをとって情報収集しました。
そこで「gulp, gruntは知ってるよー」だったり、「Sassは聞いたことがある」といった声が聞けたのでとりあえず導入してもいいということが確認できました。
次に2についてです。前いたプロダクトではビルドツールにgulp+webpack、CSSメタ言語にはSassを利用していて、一部ではJSフレームワークを使用しており、Reactを採用していましたのでそれに準拠した形が望ましかったのですが、1のアンケート結果から同じものを使用できる礎があることがわかったのでこちらを採用していくことに決めました。

## デザイナーへの普及
使用するツールは決まりました。
早速作業ブランチを切り、せこせこと環境を構築していきます。
**当時CSSのデプロイはデザイナー側が持っていた**ので一旦はデザイナーへ普及することが課題となっていました。
私自身は六本木所属で、デザイナーの拠点は石川にありましたので出張して、直接ハンズオンを通して環境構築から使い方までを講義し、環境改善後の開発フローの学習を行いました。
他の方の記事でも紹介されていますが、DMMではslackがメインのコミュニケーションツールとなっていて、不明点などあれば都度メッセージを飛ばすか電話を使って技術的バックアップを行いました。

## 今の状況と今後の課題
ほぼデザイナーへの普及は完了して使いこなせるようになったと思います。
担当プロダクトは現在過渡期を迎えていて、**開発体制も変わろうとしています**。
今後はバックエンドエンジニアもフロント側のコードを触るようになるのでそちら側へのハンズオンもしていかないとなーっと思っています。
またこの開発環境改善作業、ほぼ一人で行なっていました（笑）
なのでconfigなど仕様がわかるのが今のところ私一人しかおりません。。。
この点も属人化に繋がるので開発者全員に浸透させていくのが課題となっています。

## まとめ
これまで開発者全員が使えて生産性を上げることができるように動いてきました。
そのためには「今この技術流行ってるみたいだから採用！」とかではなく周りの環境に合わせて
適切なツールを選んでいくことが大事ということを学びました。

## そしてこれから
現在担当プロダクトは開発体制について大きな過渡期を迎えています。
記事中で太字にしたのですが抜本的なデプロイフローについても改善されつつあります。
ここまでつらつらと開発環境改善したんだぜ、すげーだろと書いてきましたが、効果が現れるのは開発体制が変わったこれからだと思っています。
それに合わせ、開発環境も変えていく余地が出てくるので、柔軟に対応できる設計を心がけようと思っています。以上。

明日はいのひー[@ino_moe](https://qiita.com/ino_moe)です。お楽しみに！
End-to-Endでタスク指向対話するTC-Botを紹介してみる


## TC-Botとは？

[Nextremer Advent Calendar 2017](https://qiita.com/advent-calendar/2017/nextremer) 13日目の記事です。

[TC-Bot](https://github.com/MiuLab/TC-Bot)はMicrosoftResearchが発表した[End-to-End Task-Completion Neural Dialogue Systems](http://arxiv.org/abs/1703.01008)の著者による実装です。
これは論文のタイトル通り、タスク指向対話をEnd2Endで行なうテキストベースの対話システムになります。
TC-Botの特徴としては次の2つがあります。

1. 強化学習による対話管理
2. ユーザシミュレータを使用した対話管理部の学習

ユーザシミュレータとは、ルールベースでユーザの応答規則を記述したシミュレータです。
TC-Botでは、このユーザシミュレータとの対話を通してエージェント(対話管理部)の学習を進めてゆきます。
 
ユーザシミュレータを使用することにより、
1. 従来の対話コーパスを強化学習の訓練データに使用できる
2. 一定の応答精度になるまでモデルをオフラインで訓練できる

といったメリットがあります。

TC-Botではデフォルトでは映画チケット予約、映画検索、の2つのタスクを行なうことができます。

## 提案手法について

![スクリーンショット 2017-12-12 21.35.15.png](https://qiita-image-store.s3.amazonaws.com/0/133575/7c542166-757c-29d8-306f-6e71c50ee5f4.png "スクリーンショット 2017-12-12 21.35.15.png")
([2]より引用)

システムの概要は上図の通りです。

映画チケット予約タスクを例に説明すると、
ユーザシミュレータは各エピソードにおいて達成したいGoalを持っています。
Goalはjson形式で表現されます。
例えば「『明日』『シアトル』の『regal meridian 16』で『16時』から上映する『ズートピア』を観る」だと次のようになります。

```json
{
"date":"tomorrow",
"city":"seatle",
"place":"regal merdian 16",
"starttime":"16:00",
"moviename":"zootopia"
}
```

対話を通じてユーザシミュレータからこの条件を聞き出し、条件マッチするチケットを規定ターン以内に予約することができればタスク成功となります。

なお、シミュレータとエージェントがやり取りする意味フレームは次のような形式で表現されます。

```json
{
  "request_slots": {
    "ticket": "UNK"
  },
  "diaact": "request",
  "inform_slots": {
    "theater": "regal meridian 16",
    "moviename": "zootopia"
  },
  "nl":"Can I get tickets for zootopia at regal meridian 16?"
}
```

diaactは発話行為で、inform slotsは伝達する情報、request slotsには要求する情報、nlにはこれらを自然言語で表現した文が入ります。
これらのやり取りで対話を進めていきます。

またエージェントの入力値となるのは対話履歴です。
前ターンのユーザの発話行為、inform slots・request slotsののone-hot表現、既に回答済みのスロット情報などがベクトル化され状態として表現されます。

まとめるとTC-Botにおける設定は次のとおりです。

```
環境 = ユーザシミュレータ
行動 = 発話行為・スロット
状態 = 対話履歴
報酬 = タスク成否
```

報酬はタスクの成否に応じて固定で、学習が進むに連れより早くタスクを達成できるようになってゆきます。

## 使い方

READMEに詳しく書かれているので説明の必要は無いかと思いますが、次のコマンドでDL〜学習を開始できます。
なお、Pythonは2.X系でないと動きません。

```bash
$ git clone https://github.com/MiuLab/TC-Bot.git
$ cd TC-Bot/src
$ python run.py --agt 9 --usr 1 --max_turn 40
	      --movie_kb_path ./deep_dialog/data/movie_kb.1k.p
	      --goal_file_path ./deep_dialog/data/user_goals_first_turn_template.part.movie.v1.p
	      --write_model_dir ./deep_dialog/checkpoints/rl_agent/
	      --dqn_hidden_size 80
	      --experience_replay_pool_size 1000
	      --episodes 500
	      --simulation_epoch_size 100
	      --run_mode 3
	      --act_level 1
	      --batch_size 16
	      --warm_start 1
	      --warm_start_epochs 120
```

## 感想
TC-BotはEnd-to-Endでのタスク指向対話を行なう対話システムです。
実装もnumpyの使用以外はほぼフルスクラッチで書かれており、対話システムとしても非常にシンプルに実装されているので、色々と参考になります。

強化学習での対話管理は現時点ではまだまだ課題も多いですが、柔軟な対話には欠かせない技術だと思うので、今後の動向も目が離せません。

## 参考
[1][MiuLab/TC-Bot](https://github.com/MiuLab/TC-Bot)
[2][End-to-End Task-Completion Neural Dialogue Systems](http://arxiv.org/abs/1703.01008)
[3][A User Simulator for Task-Completion Dialogues](https://arxiv.org/abs/1612.05688)
【PlayCanvas】2Dスクリーンでスクロールバーを作る

この記事は [PlayCanvas Advent Calendar 2017](https://qiita.com/advent-calendar/2017/playcanvas) の9日目の記事です。
#作ったもの
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148084/664108e3-447b-55d9-9637-3733239e8ce2.png)
以前紹介した[ポータルサイト](https://utautattaro.com)で、スクロールバーを実装してみました。
動作はアクセスしていただけるとわかるかと思いますが、
位置に応じて上下、ドラッグでの位置変更等できます。
htmlのスクロールバーではなくWebGLに直接書き込んでいるため、ブラウザ設定でサイドバーを無効にしても表示されます。

#なぜ作ったか
自分が使っているラップトップに搭載されたSynaptics製のタッチパッドの2本指スクロールがEdgeでは拾えなくて、ポータルサイトが動かなくなってしまったので急遽実装しました。

#作り方
2D Screenエンティティを配置し、その下にImage Elementを配置します。
スクロールバー用の画像を適当に用意して、Image Elementのテクスチャにアタッチします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148084/0c0b6297-921e-d2f7-aa62-4475341b225e.png)

エレメントのinputイベントを取得したいので、Use Inputのチェックボックスをtrueにしておきましょう。

Image Elementに以下スクリプトをアタッチします。

```javascript:sidebar.js
var Sidebar = pc.createScript('sidebar');
Sidebar.attributes.add("selectColor",{type:"rgb"});
Sidebar.attributes.add("unSelectColor",{type:"rgb"});

// initialize code called once per entity
Sidebar.prototype.initialize = function() {
    this.isMousePressed = false;
    this.entity.element.on("mousedown",this._mdown,this);
    this.app.mouse.on("mousemove",this._mmove,this);
    this.app.mouse.on("mouseup",this._mup,this);
};

// update code called every frame
Sidebar.prototype.update = function(dt) {
    this.entity.element.anchor = new pc.Vec4(1,1-camera.cameraPosition,1,1-camera.cameraPosition);
    this.entity.element.pivot = new pc.Vec2(1,1-camera.cameraPosition);
    if(this.isMousePressed){
        this.entity.element.color = this.selectColor;
    }else{
        this.entity.element.color = this.unSelectColor;
    }
};

Sidebar.prototype._mdown = function(ev){
    if(ev.button === 0){
        this.isMousePressed = true;        
    }
};

Sidebar.prototype._mup = function(ev){
    this.isMousePressed = false;
};

Sidebar.prototype._mmove = function(ev){
    if(!ev.buttons[0]){
        this.isMousePressed = false;
    }
    if(this.isMousePressed){
        camera.cameraPosition = (ev.y / window.innerHeight);
    }
};
```

_mmove()でマウスが動いた時のイベントを取得しています、マウスが押されているときだったらcameraのポジションを変更するようにします。
またサイドバーの位置はanchor,pivotで操作し、update内で常に同期させてあげます。

initializeのイベント周りは、mousedownはエレメントからのインプット限定ですが、mouseup,mousemoveはエレメント外、canvas全体のイベントで取得します。

ポータルページではカメラのY座標に割り当てましたが、ほかのパラメータに割り当てて発展した使い方なんかもできそうですね
既存のディレクトリをGitのリモートリポジトリで管理する

とりあえず作業ディレクトリで作って、その後Gitにリポジトリを作成する事が多いのでメモ。
と言っても、Githubのヘルプに全部書いてありますが(;´Д`)

Adding an existing project to GitHub using the command line
https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/

1. 初期化

    ```sh
    $ git init
    ```

1. .gitignoreファイルを作成
※大抵の場合は必要だと思いますが、要らなければ無くてOK
1.  ファイルを追加

    ```sh
    $ git add .
    ```
1. ファイルをコミット

    ```sh
    $ git commit -m "First commit"
    ```

1. リモートリポジトリのURLを追加
※ 基本forkして作業するのでfork元をupstreamとしている

    ```sh
    $ git remote add upstream 【リモートリポジトリURL】
    ```

1. リモートリポジトリにプッシュする
※Githunのヘルプでは -u オプションがついてますが、 git push する際は自分の origin にしたいので、デフォルト設定はしないです

    ```sh
    $ git push upstream master
    ```

1. リモートリポジトリをFork
1. Forkした自分のリモートリポジトリを追加

    ```sh
    $ git remote add origin 【自分のリモートリポジトリURL】
    ```
GCP Project のベストプラクティス


## Google Cloud Platform(GCP) について
AWSやAzureに並ぶ、Googleが提供するクラウド基盤（PaaSやIaaS）です。
AWSの方が微に入り細に入っている感はまだ否めませんが、今後伸びることが想定されます。
基本的なコンピューティングサービスやコンテナサービス、機械学習といったトレンドに従ったものはありますし、他のクラウドサービスと比較して安価になりやすい事が利点です。

## Projectとは
GCPでは、プロジェクトと呼ばれる単位で課金アカウントを紐付け、その下でサービスを実行します。
これにより、各プロジェクトでのコストを明確に管理できるという事になりますし、各プロジェクトで環境を明確に分ける事ができます。

ですが、
「どのような単位でプロジェクトを切り分ければいいのか？」
「相互に連携する機能を開発したいけど、同じネットワークに属している必要があるからプロジェクト一緒にしなきゃいけないの？」
といった疑問が浮かぶのではないでしょうか。

本稿では、プロジェクトを分ける指針を「GCP Project のベストプラクティス」と銘打って述べたいと思います。

## Projectはサービス単位で分けるべし！

#### サービス（機能）毎に分けた場合のベストプラクティス
プロジェクトは、各社各人でいろいろな単位で分かれていると思います。
例えば機能毎・顧客毎・チーム/部署毎といった形で、一番使い良い形で分けているのではないでしょうか。
GCPのプロジェクトは、その単位で分けても大丈夫なようにできています。
例えばチーム毎に作成し、VPCを顧客毎に分けて作成し、その中にSubnetを機能毎に作成するといったことが可能です。

ですが、

* ホストプロジェクトを利用する事で、環境毎の統制を行える
	* 他プロジェクトからの参照可能なリソース、特定のプロジェクト専用のリソースを柔軟に構築できる
* プロジェクト間のトラフィックに対する課金は、プロジェクト内での課金と同一（コストデメリット無し）
* ホストプロジェクトのリソースは、別のホストプロジェクトからも利用可能

という点から、組織や環境毎にホストプロジェクトを作成し、ある程度のサービス毎に（例えば、ECサイトとコーポレートサイトを別サービスとして）分ける方が理にかなっています。
![](https://cloud.google.com/compute/images/xpn/xpn-1.svg)


例えば、本番環境、検証環境、開発環境としてホストプロジェクトを作成し、そこに各サービスごとにプロジェクトを作成します。
![](https://cloud.google.com/compute/images/xpn/xpn-2.svg)

こうすることで、本番環境と開発環境を分けて影響を排除しつつ、各サービス間での通信を担保することができます。

#### 参考URL
[プロジェクトの作成と課金管理](https://cloud.google.com/appengine/docs/standard/python/console/?hl=ja)
[共有 VPC の概要](https://cloud.google.com/compute/docs/shared-vpc/?hl=ja)
WordPressのカスタム投稿タイプで管理画面に表示される公開画面のリンク先を変更する

例えばカスタム投稿タイプで 求人情報や製品情報などを作るが、
詳細ページは利用せずに、アーカイブページのみや特定のページにループで表示させるだけの場合。

記事を入力して、管理画面から「投稿を表示」をクリックしても、表示されるのは詳細ページのURLになるので実際に見せたいページではないので、また何回かクリックして公開画面に遷移したりする必要があるが、下記のように書くと書き換えられる。

~~~
add_filter('post_type_link', 'my_custom_public_link',10,2);
function my_custom_public_link($permalink) {

	// 現在の投稿タイプを取得
	$post_type = get_post_type();
	
	// 書き換えたい投稿タイプを指定
	if ( $post_type == 'recruit' ){
		$permalink = '表示したいページのURL';
	}
	return $permalink;
}
~~~

### アンカーリンクをつけたい場合

アンカーリンクをつけてその部分を表示させたい場合は

~~~
add_filter('post_type_link', 'my_custom_public_link',10,2);
function my_custom_public_link($permalink) {

	// 現在の投稿タイプを取得
	$post_type = get_post_type();
	
	// 書き換えたい投稿タイプを指定
	if ( $post_type == 'recruit' ){
		global $post;
		// 指定のURLにアンカーリンクも付けて返す
		$permalink = home_url('/').'★表示したいページまでの階層★/#'.'id-'.$post->ID;
	}
	return $permalink;
}
~~~

となる。

勿論公開画面側のテンプレートにも

~~~
id="id-<?php echo esc_attr( $post->ID );?>"
~~~

などの記述は必要
【Swift4】JSONExportがCodableプロトコルに対応しました

# JSONExportとは

JSONExportはJSONの記述からからClassやStructのコードを生成するMac用のアプリケーションです。
先日久しぶりにBuildしてみたらCodableプロトコルに対応していました！！
（下記スクショ参照）
Swiftだけでなく、Objective-C、Javaに対応しており、Codableプロトコル以外にも
ObjectMapperのMappableやRealm Objectにも対応しています。

下記のサンプルはシンプルなもので特に手書きでもいいかな、と思いますがレスポンス構造の中にはどんだけ複雑なんだと思うようなものもあります。そのような複雑なレスポンスを手書きで書くと必ずミスが発生しますし、何よりも時間がもったいないです。
JSONExportを使えばサーバサイドの設計者に事前にJSONでレスポンスを定義しておいてね、と一言お願いしておくだけで（聞いてくれるかどうかはともかく）一発でレスポンス構造を実装できます。

![スクリーンショット 2017-12-13 12.07.37.png](https://qiita-image-store.s3.amazonaws.com/0/37634/c56459ea-6382-3e62-5fa8-500afef8bdad.png)

# 入手

https://github.com/Ahmed-Ali/JSONExport

から入手できます。

# 注意点

JSONの記述が抜けていたり、型が不明な場合はAnyObjectでコードが作成されてしまうので食わせるJSONはなるべく明確なものが必要です。AnyObjectになってしまった部分は手動で修正が必要です。

# サンプル

```json:JSON
{ "name"   : "John Smith",
  "sku"    : "20223",
  "price"  : 23.95,
  "shipTo" : { "name" : "Jane Smith",
               "address" : "123 Maple Street",
               "city" : "Pretendville",
               "state" : "NY",
               "zip"   : "12345" },
  "billTo" : { "name" : "John Smith",
               "address" : "123 Maple Street",
               "city" : "Pretendville",
               "state" : "NY",
               "zip"   : "12345" }
}
```

をJSONExportに食わせると下記のファイルを２つ出力してくれました。

```swift:Swift
//
//	RootClass.swift
//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport

import Foundation

struct RootClass : Codable {

	let billTo : BillTo?
	let name : String?
	let price : Float?
	let shipTo : BillTo?
	let sku : String?


}
```

```swift:Swift
//
//	BillTo.swift
//	Model file generated using JSONExport: https://github.com/Ahmed-Ali/JSONExport

import Foundation

struct BillTo : Codable {

	let address : String?
	let city : String?
	let name : String?
	let state : String?
	let zip : String?


}
```
GAE/JでRemote APIを使ってみた

GAE/Jで本番環境のデータをローカルに取り込みたいことがあったので、Remote APIを利用してみました。ここでは、ローカル環境のGAEから本番へのリモートアクセスでデータを取得し、取得したデータをローカルのDatastoreに保存する方法を説明します。

#前提
以下のバージョンで実装を行なっています。

- Java: Java8
- appengine-java-sdk: 1.9.57


#準備

###Remote APIの有効化

プロジェクトのweb.xmlに以下を追記します。

```xml:web.xml
<servlet>
  <display-name>Remote API Servlet</display-name>
  <servlet-name>RemoteApiServlet</servlet-name>
  <servlet-class>com.google.apphosting.utils.remoteapi.RemoteApiServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>RemoteApiServlet</servlet-name>
  <url-pattern>/remote_api</url-pattern>
</servlet-mapping>
```

### appengine-remote-api.jarの追加
Remote APIのクライアントコンポーネントを利用するために、`${JAVA-SDK-ROOT}/lib/appengine-remote-api.jar`を`WEB-INF/lib`ディレクトリに追加し、クラスパスを通します。

#実装
Kind名"book"のデータをローカルに取り込みます。

```java
import com.google.appengine.tools.remoteapi.RemoteApiInstaller;
import com.google.appengine.tools.remoteapi.RemoteApiOptions;

// ...
		RemoteApiOptions options = new RemoteApiOptions()
			.server("your_app_id.appspot.com", 443)				
			.useApplicationDefaultCredential();
		RemoteApiInstaller installer = new RemoteApiInstaller();
		DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
		List<Entity> books;
		try {
			installer.install(options);
			Query q = new Query("book");
			books = datastore.prepare(q).asList(FetchOptions.Builder.withDefaults());
		} finally {
			installer.uninstall();
		}
		
		// ローカルに保存するために、データを移し替える
		List<Entity> devBooks = new ArrayList<>();
		for (Entity book : books) {
			Entity devBook = new Entity(book.getKind(), book.getKey().getName());
			devBook.setPropertiesFrom(book);
			devBooks.add(devBook);
		}
		datastore.put(devBooks);

```

本番から取得したデータをそのまま`datastore.put()`した場合はうまくいきませんでしたが、上記の方法でローカルに取り込むことができました。
sublime text3 のビルドを使ってpythonのunittestを実行

ファイルのカレントディレクトリがルート的な解釈されるのが課題。どういうことかというと、

```
.
├─fizz
│  └── buzz.py
└─test
   └── test_hoge.py
```
こういうフォルダこうせいになってたとして、sublimeでtest_hoge.pyを実行しながら編集したいというとき。

```test_hoge.py
import unittest
from fizz import buzz

if __name__ == "__main__":
    unittest.main()
```

最終的には全部のテストファイルを「.」から実行するのでこう書きたいんだけど、編集中にtest_hogeだけを実行させるのが意外と大変。テストフォルダがカレントなので、このまま実行buzzのインポートに失敗する。
```
ImportError: No module named 'buzz'
```
テストファイルでパスに「..」を追加するのも一案だけど、めんどいし見た目もよくない。みんなどうしてるんだろうな。

sublimeからctrl+Bで実行したいので、新しいビルドシステム(python_testsとか)を作ることにする。

```python_tests.sublime-build
{
	"shell_cmd": "cd .. & python -m unittest $file"
}
```
これで目的は果たせた。
test個別実行をうまくやりたいけどできてないのが課題。
Windows Update ができない [エラー: 0x80248015]

http://uits.co.jp/trouble/120527-1.html

本件が起きたときの対処方法は、Windows Updateのインストール方法の設定画面にて、

Windows Update 自動更新の有効化または無効化画面

「更新プログラムを確認しない（推奨されません）」を選択した上で、手動で更新チェックボタンを押すと

更新プログラム確認画面

更新プログラムインストール画面

更新処理が正しく走ります。
 一度上記の手順を行えば、更新設定を以前の状態に戻し再起動を行っても、正しく行えるようになります。
 本現象の原因は不明ですが、0x80248015によりWindows Updateができなくなった方は、
■ Windows時刻の確認　　■ 更新プログラムを確認しないを選択した上での、更新チェック
 を行ってみると良いかもしれません。


WindowsUpdateのメモを複数貼って失礼しました。
historyの上書きを防止

#historyの上書き問題
LAN外部から踏み台サーバを経由してLAN内部にsshして入る事を考える．
[サーバA（LAN外部）] <---> [サーバB（踏み台）] <---> [サーバC（LAN内部）]

1. サーバAからサーバBにログインしたときにサーバB上のhistoryの記録が開始される．
2. サーバBからサーバCにログインしたときにサーバC上のhistoryの記録が開始される．
3. サーバCからログアウトしたときにサーバC上のhistoryが書き込まれる．
4. サーバBからログアウトしたときにサーバB上のhistoryが書き込まれる．

ここで，サーバBとサーバCがLDAPにより同じ環境をマウントしている場合を考える．
サーバBとサーバCのhistoryの書き込み先（~/.bash_history)が同じファイルなので，サーバC上のhistoryが上書きによって失われる．

#解決策
historyの書き込み先は環境変数$HISTFILEによって決定される．
デフォルトは~/.bash_historyである．
よって.bashrcでサーバごとに$HISTFILEを変更し，historyの書き込み先が被らないように設定する．

> ["$HOSTNAME"=="hogehoge" ] && HISTFILE=~/.bash_history_hogehoge

#結果
サーバごとに異なるhistoryを持つ．
RDSでr3とm4を比較してみた

この記事は、Opt Technologies Advent Calendar 2017の13日目です。

# はじめに

RDS(PostgreSQL)で、r3.xlarge を利用していましたが、
利用のされ方を~~見ている~~モニタリングしていると、m系の方が適していそうと漠然と感じたので、
比較検証をしてみましたので、その結果について書いてみようと思います。

# 書き込み速度
- Redshiftで集計したデータをdblinkでPostgreSQLで書き込んでいるので、この点について比較を実施します
- 対象とするテーブルは以下のような24テーブルです
- 2回実行した平均です

|#| レコード数       |バイト数(MB)|
|	:-:	|	--:	|	--:	|
|1|	24,689,290	|	17,445	|
|2|	26,807,199	|	18,616	|
|3|	26,658,915	|	18,523	|
|4|	27,216,467	|	18,872	|
|5|	21,746,356	|	16,140	|
|6|	22,243,298	|	16,363	|
|7|	23,346,676	|	16,938	|
|8|	25,408,481	|	17,982	|
|9|	23,021,530	|	16,816	|
|10|	20,564,258	|	15,685	|
|11|	21,436,185	|	16,586	|
|12|	20,653,664	|	16,234	|
|13|	18,860,732	|	15,382	|
|14|	20,036,435	|	16,007	|
|15|	18,819,465	|	15,541	|
|16|	20,192,921	|	16,392	|
|17|	16,203,493	|	14,202	|
|18|	16,200,846	|	14,318	|
|19|	15,585,507	|	14,049	|
|20|	14,966,510	|	13,805	|
|21|	13,120,155	|	12,818	|
|22|	12,692,634	|	15,954	|
|23|	6,199,836	|	13,115	|
|24|	9,846,026	|	11,264	|

# 検証結果

|	#	|	レコード数	|	バイト数(MB)	|	PostgreSQL側のレコード数	|処理時間(r3.xlarge)|処理時間(m4.xlarge)|	処理時間が何%に短縮されたか？	|
|	:-:	|	--:	|	--:	|	--:	|	--:	|	--:	|	--:	|
|	1	|	24,689,290	|	17,445	|	9,191,484	|	0:03:42	|	0:02:40	|	72%	|
|	2	|	26,807,199	|	18,616	|	9,705,530	|	0:03:59	|	0:02:59	|	75%	|
|	3	|	26,658,915	|	18,523	|	9,714,430	|	0:04:03	|	0:02:59	|	74%	|
|	4	|	27,216,467	|	18,872	|	9,879,839	|	0:04:03	|	0:03:03	|	75%	|
|	5	|	21,746,356	|	16,140	|	7,769,635	|	0:03:17	|	0:02:25	|	74%	|
|	6	|	22,243,298	|	16,363	|	7,782,167	|	0:03:11	|	0:02:24	|	75%	|
|	7	|	23,346,676	|	16,938	|	7,928,929	|	0:03:21	|	0:02:26	|	73%	|
|	8	|	25,408,481	|	17,982	|	8,494,064	|	0:03:35	|	0:02:28	|	69%	|
|	9	|	23,021,530	|	16,816	|	7,515,539	|	0:03:07	|	0:02:23	|	76%	|
|	10	|	20,564,258	|	15,685	|	6,426,314	|	0:02:39	|	0:01:58	|	74%	|
|	11	|	21,436,185	|	16,586	|	6,466,979	|	0:02:37	|	0:02:00	|	76%	|
|	12	|	20,653,664	|	16,234	|	6,183,918	|	0:02:25	|	0:01:52	|	77%	|
|	13	|	18,860,732	|	15,382	|	5,370,144	|	0:02:06	|	0:01:41	|	80%	|
|	14	|	20,036,435	|	16,007	|	5,751,794	|	0:02:17	|	0:01:45	|	77%	|
|	15	|	18,819,465	|	15,541	|	5,233,820	|	0:02:04	|	0:01:36	|	77%	|
|	16	|	20,192,921	|	16,392	|	5,596,285	|	0:02:09	|	0:01:44	|	81%	|
|	17	|	16,203,493	|	14,202	|	4,367,008	|	0:01:39	|	0:01:21	|	82%	|
|	18	|	16,200,846	|	14,318	|	4,365,299	|	0:01:49	|	0:01:19	|	72%	|
|	19	|	15,585,507	|	14,049	|	4,098,571	|	0:01:36	|	0:01:16	|	79%	|
|	20	|	14,966,510	|	13,805	|	3,822,217	|	0:01:32	|	0:01:08	|	74%	|
|	21	|	13,120,155	|	12,818	|	3,443,428	|	0:01:17	|	0:01:02	|	81%	|
|	22	|	12,692,634	|	15,954	|	3,321,944	|	0:01:19	|	0:00:58	|	73%	|
|	23	|	6,199,836	|	13,115	|	3,103,642	|	0:01:11	|	0:00:55	|	77%	|
|	24	|	9,846,026	|	11,264	|	3,043,508	|	0:01:05	|	0:00:49	|	75%	|

# 結論
- 使用可能なメモリ量には余裕がある
- IOPSが頭打ち

以上のような状態であれば、間違いなくr系よりはm系の方が適しているかと思います。
前から使い続けているインスタンスタイプだからといってそのままにせず、利用状況をモニタリングしながら最適なインスタンスを選択する事でよりよい効果が得られるかと思います。

---
以上です。

読み込み側の検証は今回は記載しておりませんが、またの機会にまとめたいと思います。
それではより良いAWSライフを。
デザインを参考にしたい技術系スライド

Jenkins 2.0 Pipeline & Blue Ocean https://www.slideshare.net/hico_horiuchi/jenkins-20-pipeline-blue-ocean

- フォントはたぶん 自家製 Rounded M+ (ラウンデッド エムプラス) http://jikasei.me/font/rounded-mplus/
    - 柔らかい印象
    - Webフォント https://googlefonts.github.io/japanese/#roundedmplus1c
- 背景色とかアクセントカラーの配色が良い たぶん http://sanographix.github.io/azusa-keynote/
- イラストにいらすとや、絵文字にTwitter Emojiを使っている
8年目エンジニアが新卒や2年目、3年目にエンジニア論を語ってみた

# はじめに

- ビジョンや世界を可視化してみたかったのです。
- 背景は最近色々思うところがあったので纏めてみました。
- 新卒や2年目のことを対象に発表しました。

# 私が思ふエンジニア論

https://www.slideshare.net/KeitaNeriai/ss-83972476

# まとめ

- 伝わったとは思いますが、多少自己満足です。
- 色々思い悩むことをあるみたいで知ることができました。
kotlinとjavaのアクセス修飾子の関係性

# はじめに
kotlinの`public`, `internal`, `protected`, `private`と、javaの`public`, `package private`, `protected`, `private` がお互いにどう見えているのかを調べました。

まずは、それどれがどのようなアクセス権があるのかを見ていきます。


## Javaのアクセス修飾子 (クラスに対する宣言)

|**public**          |**どこからでもアクセス可能**|
|---------|---------|
|**protected**       |宣言できない|
|**package private** |**同じパッケージからアクセスできる**|
|**private**         |宣言できない|

## Javaのアクセス修飾子 (クラスメンバに対する宣言)

|**public**          |**全てのクラスからアクセス可能**|
|---------|---------|
|**protected**       |**サブクラスor同じパッケージのクラスからアクセスできる**|
|**package private** |**同じパッケージのクラスからアクセスできる**|
|**private**         |**宣言したクラスからのみアクセスできる**|


## Kotlinのアクセス修飾子 (クラス/トップレベル関数・変数に対する宣言)

|**public**          |**どこからでもアクセス可能**|
|---------|----------|
|**internal**        |**同じモジュール内からアクセスできる**|
|**protected**       | 宣言できない |
|**private**         |**宣言したクラスからのみアクセスできる**|

## Kotlinのアクセス修飾子 (クラスメンバに対する宣言)

|**public**          |**全てのクラスからアクセス可能**|
|---------|----------|
|**internal**        |**同じモジュール内のクラスからアクセスできる**|
|**protected**       |**サブクラスからのみアクセスできる**|
|**private**         |**宣言したファイルからのみアクセスできる**|

# kotlinとjavaにおけるアクセス修飾子の関係性

ここから本題に入っていきます、kotlinのアクセス修飾子をJavaから見た時にどうなるのかを見ていきます。

## kotlinの`private`なクラス

kotlinのprivateなクラスは、javaではパッケージプライベートとして見なされます。

```A.kt
package com.example.model

private class A(name: String, age: Int, height: Int)

```

```B.java
package com.example.model

public class B {

  public B() {
    A a = new A("taku", 23, 168); // OK
  }
}

```

```C.java
package com.example.ui


public class C {

  public C(){
    A a = new A("taku", 23, 168) // ERROR
  }
}

```

# kotlinのinternal修飾子
Javaにはinternal修飾子はありません。そのため、kotlinでinternalがつけられたものは、Javaからはpublicとして見なされます。しかし、クラスメンバーの場合は難読化されることになります。


```A.kt
package com.example.model

internal class A(val name: String, internal val age: Int, private val height: Int)

```

```B.java
package com.example.model

public class B {

  public B() {
    A a = new A("taku", 23, 168); // OK

    a.getName(); // OK

    a.getAge(); // ERROR
    
    a.getAge$production_sources_for_module_example(); // OK
    
    a.getHeight(); // ERROR
  }
}

```
Spring Bootで日本語PDF出力したい

個人開発アドベントカレンダーにご招待されてしまったので僕も何か書こうと思います。
僕の場合は圧倒的技術力が無いのでお勉強からスタートすることが多いです。

## 帳票
この得意先は集計をまとめてこの形式で出してね。
あ、お客様からの手数料も計算して紙に出しておいて。
というような謎帳票が何個もあったりします。

古いFileMakerで作られていて変更もままならない。

iReport Designerというツールを探し出して帳票設計して出力するようにしました。
これを事務に配布して自分で印刷してもらうことにしました。

それも時代と共に問題が…。

1. iReport -> JaspersoftStudio
2. Java6時代遅れ
3. itextasian -> font_extension
4. Web対応

## iReport Designerは開発終了
JaspersoftStudioという帳票設計ツールがあるのでそっちで開発してねって開発者に直接言われました。
JaspersoftStudioだと印刷ができない。💦

iReport Designerで帳票設計してDatasourceを指定して印刷するだけにしていた。
事務の人にこれ印刷しておいてで済んだのに…。

Javaでjarファイル作ってkickかな。
そしてjrxmlをkickしてプリンターに出力する簡単なjavaプログラムを作った。

[JasperCSVprint - GitHub](https://github.com/arachan/JasperCSVprint)

### Java6時代遅れ
何故だ！
何故、俺のjarファイルが動かない！
Java6だからか？
NetBeansのbuildをJDK8にして再コンパイル。
ふー、何とか動くか。

## iTextAsianはサポートしない
いつからかiTextAsianをサポートしなくなってしまいました。
font_extensionという機能を使えとのこと。

Jaspersoft Studioだと出来た。
jarファイルの場合はどうすればいいのだろうか…。

[Javaで帳票をPDF出力(JasperReport) - Qiita](https://qiita.com/AkihiroTakamura/items/da7f7ef2d7da21a17ef1)

上記のサイトを参考にしまいた。
さらにGithubでSource探し。
紆余曲折あってjarにキックできるものは作り出せました。
下記のGithub がそうです。
その過程でNetBeansとMavenに愛想をつかすわけですが…。
[JasperReportsFont - Github](https://github.com/arachan/JasperReportsFont)

## Web対応
印刷する帳票ファイルを各自にばらまくのが面倒。
WebにしてPDF出力にして勝手に印刷させられないだろうか？

JavaはServletコンテナが辛い。
ゲリラ展開を考えるとSpring Bootだろうな。

## 課題から足りない技術を考える
圧倒的Java力　(´;ω;｀)

というと身もふたもないので、

- Spring Boot
- Gradle or Maven
- JasperReport Library

先ずはこんなところでしょうか。

### Spring Boot
最初はspring.ioの写経をしてました。
語学力に限界を感じて **はじめてのSpring Boot [改訂版]** を買って写経し始めました。

### Gradle
Font_extensionsを使ったSampleを探し始めてました。

Javaの場合、font_extensions等のresourcesを置く場所は決まっています。
mavenやgradleの決まりだと project/src/java/resources のようです。

- NetBeans
    - jarにするとfont_extensionを読まない
    - Spring Bootは推奨されてない
- eclipse
    - jarにしてもfont_extensionを読む

NetBeans卒業決定(´;ω;｀)

- Maven
    - font_extensionsのサンプルが無い。
    - 本家はant_ivy
- Gradle
    - 時代はGradleなのか何故かサンプルあり

Maven卒業(´;ω;｀)

Spring BootもGradleでも動くようなのでGradleにした方が良さそう。

Gradleは公式Tutorialを一通り読んで写経しました。
時間掛かった。

現在、Gradle Version4.4 です。
去年までVersion2.0だったのにね。
進化が速すぎて書籍だと間に合わないかも。

Gradleマスターとはいきませんが怖くはなくなりました。

## Spring Boot+JasperReports+font_extensions

現在、これに取り組んでいる途中。
Spring BootのサイトにはJasperViewというSpring BootのLibraryを使ったSampleがある。
しかし、Spring Framework v5からは削除されてしまうのでJasperReports Libraryを直接呼んでPDFに出力した方がよさそうだ。

Sourceは？
現在進行中。

なんとmaking氏がsampleプログラムを作ってくれました。
はじめてのSpring Bootの著者さんです。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">JasperReport版のサンプル作ってみました。こんなイメージでしょうか？<a href="https://t.co/M1MQrMInq0">https://t.co/M1MQrMInq0</a></p>&mdash; Toshiaki Maki (@making) <a href="https://twitter.com/making/status/940983272594534400?ref_src=twsrc%5Etfw">2017年12月13日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### JasperBoot
どんなJRXML Templeteを入れても動くように変更してみた。
フルオープンな場所なので追加はしてませんが、
JDBC DriverやConnectionを追加すればDBのデータもPDFにできます。

[JasperReportsBoot - GitHub](https://github.com/arachan/JasperReportsBoot)
AdventCalendarをノリでやってみた

[SC（非公式） Advent Calendar 2017](https://qiita.com/advent-calendar/2017/unofficial-sc)の最終日です。
最後まで繋ぐことができて良かったです。

この記事をみなさんへのクリスマスプレゼント代わりに贈ります。

#アドベントカレンダーやってみて
アドベントカレンダーをやるに至る経緯や思いは色々なあったけども端的に言うと
私自身で抱えている目標のうちのひとつの働き方改革として何かやろう
という目論見のうちのひとつになればいいなぁと思ってみんなに声をかけました。
とか言ってみましたが、エンジニアみんなで何か楽しくやろうぜってことで、
ノリでアドベントカレンダーをやってみました。
楽しいことは大事ですよね。

参加人数がもっと少ないかなぁと思っていましたが、まぁまぁ参加してくれる人がいてとてもうれしいです。アドベントカレンダーの参加にあたって声をかけたのは限られた年代の人達だけでしたが、いろんな年代が集まれたのも素晴らしいと思いました。
私自身では残り枠、小さいネタをたくさん書いたのですが、あまりうまくまとめる事ができませんでした。なんなら、私が一番陳腐な内容だったと思います。


このカレンダーもいいねランキングで一時的に
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80457/f508b4c3-8505-280d-d421-2c8961dbd186.png)

という順位に！意外と頑張っていましたね。はじめての試みにしてはかなりいいのではないでしょうか。

#おわり
今回、アドベントカレンダーに参加した人は年明けに是非祝勝会をやりましょう。
来年も是非挑戦しましょう。
今回参加できなかった人も次は挑戦できるといいですね。

ではでは
Ancient C探訪記：基本型編

**おことわり**： この記事では「1975年頃のC言語」仕様を解説します。2017年現在のC言語仕様とは異なるため、あなたのC言語ライフには役立たないことを予めご承知おきください。

（本投稿は [Ancient C探訪記](https://qiita.com/yohhoy/items/6631443736ab779d3fbb) シリーズの一部です。）

つづいて、プログラムの構成要素である「基本型(fundamental types)」を見ていきます。

# Ancient Cの基本型
"[C Reference Manual][cman]" §4. What’s in a Name? より引用します。4種類の基本型 `int`, `char`, `float`, `double` が定義されています。

> C supports four fundamental types of objects: characters, integers, single-, and double-precision floating-point numbers.
>
> * Characters (declared, and hereinafter called, `char`) are chosen from the ASCII set; they occupy the rightmost seven bits of an 8bit byte. It is also possible to interpret `char`s as signed, 2's complement 8bit numbers.
> * Integers (`int`) are represented in 16bit 2's complement notation.
> * Single precision floating point (`float`) quantities have magnitude in the range approximately 10<sup>±38</sup> or 0; their precision is 24 bits or about seven decimal digits.
> * Double-precision floating-point (`double`) quantities have the same range as `float`s and a precision of 56 bits or about 17 decimal digits.

それぞれ `char` は8bit文字型（符号有無は任意）、`int` は符号付き16bit整数型、`float` は単精度浮動小数点数型（32bit幅）、`double` は単精度浮動小数点数型（64bit幅）となっています。


[pdp11-float]: https://nssdc.gsfc.nasa.gov/nssdc/formats/PDP-11.htm


## 標準規格との差分
Ancient Cに加えて、標準規格（ANSI C、C90）では下記の基本型が追加されます。

* 文字型
  * `signed char`
  * `unsigned char`
* 符号付き整数型
  * (`signed`) `short int`
  * (`signed`) `long int`
* 符号なし整数型
  * `unsigned short int`
  * `unsigned int`
  * `unsigned long int`
* 浮動小数点数型
  * `long double`


## 符号なし整数型？
Ancient Cの整数型は、符号付き整数型 `int` しか定義されません。符号なし整数型を扱いたい場合は、“`char *` などの**ポインタ型で代用**” していたようです。は？？

- [pre K&R Cコンパイラ](http://d.hatena.ne.jp/oraccha/20101106/1289039703)
- [素朴な C (pre K&R C) のお話](http://blog.kmckk.com/archives/922803.html)

ポインタ型は非負値をとるメモリアドレスを保持する型ですから、メモリアドレスを整数値とみなすことで符号付き整数型(`unsigned int`)演算を行うという理屈です。例えば、2つの符号なし整数 `a`, `b` のうち最大値を返す関数 `max` は、次のよう記述されていました：

```c:ancient-max.c
/* Return the logical maximum
 * of the 2 arguments.
 */
max(a, b)
char *a, *b;
{
  if (a > b)
    return(a);
  return(b);
}
```

Ancient Cの関数宣言は標準Cとは色々と差異があるのですが、ここでは関数パラメータ `a`, `b` がポインタ型(`char *`)として宣言されています。参考までに、標準C（ANSI C、C90）で同関数を記述すると次のようになります：

```c:stdc-max.c
unsigned int max(unsigned int a, unsigned int b)
{
  if (a > b)
    return a;
  return b;
}
```


適当に明日以降につづきます。

[cman]: https://www.bell-labs.com/usr/dmr/www/cman.pdf
Variable Fontがブラウザで使えるようになってきた

##Variable Fontとは？
ひとつのフォントファイルで，いろんなウエイトや効果が実現できる。
それぞれの表現について作り手の指定したパラメータが用意されており，それを変化させることで多彩な表現が可能に。

例えば [DECOVAR](https://www.typenetwork.com/brochure/decovar-a-decorative-variable-font-by-david-berlow) というフォントでは，以下のような表現が一つのフォントファイルで可能。

![Screenshot from 2017-12-13 10-43-07.png](https://qiita-image-store.s3.amazonaws.com/0/1217/5f481863-8761-9ce8-9512-663651b24312.png)


##ブラウザ対応状況
[Caniuse](https://caniuse.com/#search=font-variation-settings) によると各ブラウザの実装状況はこんな感じ。

![](https://qiita-image-store.s3.amazonaws.com/0/1217/82872ff8-33dc-b7b3-6db0-642105a1bc8a.png)


##サンプル
ウェブフォントとしてVariable Fontの機能を利用する場合は，いまのところCSSで `font-variation-settings` を使います。

DECOVARの場合は [DecovarAlpha.designspace](https://github.com/TypeNetwork/fb-Decovar/blob/master/sources/2-build/DecovarAlpha.designspace) というファイルに `Tag` が定義されており，例えば "Inline Skelton" は "SKLA"，"Weight" は "WMX2"，"Flared" は "TRMB" という `Tag` が割り当てられています。更に，それぞれの `Tag` の値の幅が `minimum`，`maximum` として決められており，この間の値を指定することになります。

```html
<html>
  <head>
    <style>
      @font-face {
        font-family: 'Decovar';
        src: url('DecovarAlpha-VF.ttf');
      }

      .deco {
        font-family: 'Decovar';
        font-size: 72px;
        font-variation-settings: 'SKLA' 1000, 'WMX2' 1000, 'TRMB' 1000;
      }
    </style>
  </head>
  <body>
    <div class='deco'>
      Hello, World !!
    </div>
  </body>
</html>
```
![](https://qiita-image-store.s3.amazonaws.com/0/1217/422a495c-4024-b51f-0d12-825d0cfaf7a1.png)

ちなみに上で指定した値の組合せは [DecovarAlpha.designspace](https://github.com/TypeNetwork/fb-Decovar/blob/master/sources/2-build/DecovarAlpha.designspace) では"Fancy"としてあらかじめ登録されています。各アプリケーションではこの `stylename` を使えるようになっていくはずですが，CSSではいまのところまだです（誰か教えて）。

FontView（Variation Font確認用のMacアプリ）では実装されているので，ぜひ試してみてください。

![](https://qiita-image-store.s3.amazonaws.com/0/1217/b605cca9-7529-de16-7453-165b59f2e935.png)


##便利なリンク
- [AXISPRAXIS](http://www.axis-praxis.org) - Variable Font対応フォントでいろいろ遊べる
- [Variable Fontについて](http://sadah.hatenablog.com/entry/variablefont) - [@sada_h](https://twitter.com/sada_h) さんがVariable Fontについて調べたやつ
- [font-variation-settings - Variable Fontの機能を利用する](https://lab.syncer.jp/Web/CSS/Reference/Property/font-variation-settings/) - CSSでVariable Fontを使ってみたデモ
- [FontView](https://github.com/googlei18n/fontview/releases) - Variable Font確認用Mac向けアプリ。ビルド済
ASP.NET Core で Swagger を使ってファイルアップロード API

ASP.NET Core で [Swashbuckle](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) を使用し Web API を実装する場合、基本的に Controller にメソッドを追加するだけだが、ファイルアップロードする API を追加し UI から使えるようにする際はフィルタを使う必要がある。

```C#
    /// <summary>
    /// Swagger UI 用ファイルアップロードフィルタ
    /// </summary>
    public class UploadFileOperationFilter : IOperationFilter
    {
        /// <summary>
        /// フィルタ適用
        /// </summary>
        /// <param name="operation">オペレーション</param>
        /// <param name="context">コンテキスト</param>
        public void Apply(Operation operation, OperationFilterContext context)
        {
            operation.Consumes.Add("multipart/form-data");
            operation.Parameters = new IParameter[]
            {
                new NonBodyParameter()
                {
                    Name = "file",
                    In = "formData",
                    Required = true,
                    Type = "file",
                    Description = "アップロードするファイル",
                }
            };
            return;
        }
    }
```

このようなフィルタクラスを作り、アップロード API のメソッドに `SwaggerOperationFilter` 属性を介して指定する。

```C#

    [Produces("application/json")]
    [Route("api/v1/uploadfile")]
    public class UploadController : Controller
    {
        [HttpPost]
        [SwaggerOperationFilter(typeof(UploadFileOperationFilter))]
        public async Task<IActionResult> UploadFile(IFormFile file)
        {
            // ここではオリジナルのファイル名の拡張子を取り出し
            // 格納するときは GUID をベースの名前に変えている。
            var orgFileName = ContentDispositionHeaderValue
                .Parse(file.ContentDisposition)
                .FileName.Trim('"');
            var uploadFileName = Guid.NewGuid().ToString() + Path.GetExtension(orgFileName);
            var url = await UploadToStorage(file.OpenReadStream(), uploadFileName);
            return Json(url);
        }

        private async Task<string> UploadToStorage(Stream stream, string fileName)
        {
            // stream からデータを取り、
            // それを適当なストレージに格納し、
            // その URL を返す 処理を実装。
            return "https://xxx.xxx.xxx/xxx/" + fileName;
        }
    }

```

UI ではこのような表示に。

<img src="https://qiita-image-store.s3.amazonaws.com/0/151464/9675b33e-c396-afc2-8171-90f4fc2a49bf.png" width=80%/>

[参照] にてファイルを指定して 送信すると、Response にアドレスが返る。
＃先のサンプルコードでは、実際に保存する処理は実装していないですが。

<img src="https://qiita-image-store.s3.amazonaws.com/0/151464/ca7f5364-635c-d6b0-7b90-fc3be7d8378a.png" width=80% />
【Swift4】iOS11から導入されたAVCapturePhotoSettingsのプロパティを使って写真に位置情報を格納する

## はじめに

iOS10から導入されたAVCapturePhotoSettings()にOS11よりメタデータのプロパティが追加されました。
カメラ撮影から写真保存までのプロセスはiOSのバージョンで色々あって、古い（？）方式の情報はままあるのですが、
AVCapturePhotoSettingsでは、Appleのサンプルコードに位置情報の格納方法の記載がなく、このプロパティを発見するまではあちこち放浪しました。

## AVCapturePhotoSettingsのプロパティ

```swift:Swift
var metadata: [String : Any] { get set }
```

このプロパティに位置情報を格納することができます。
位置情報は、CLLocationと違って±がありませんので要注意です。
経度、緯度の±の代わりに"N"、"S"、"E"、"W"で指示します。

## ソースコード

```swift:Swift

    func configure(location: CLLocation)
    {
        var photoSettings = AVCapturePhotoSettings()

        photoSettings.metadata = self.setMeta(location: location)

        // 以下適当に省略

        let photoCaptureProcessor = PhotoCaptureProcessor(with: photoSettings, willCapturePhotoAnimation:
        {
            // 省略
        }, livePhotoCaptureHandler: { capturing in
            // 省略
        }, completionHandler: { photoCaptureProcessor in
            // 省略
        })

        self.photoOutput.capturePhoto(with: photoSettings, delegate: photoCaptureProcessor)
    }

    /// 位置情報をメタデータ用Dictionaryにに書き込む
    ///
    /// - Parameter location: 位置情報
    /// - Returns: メタデータ用Dictionary
    private func setMeta(location: CLLocation) -> Dictionary<String, Any>
    {
        // メタデータ
        //exif情報を準備する
        let gps = NSMutableDictionary()
        var exif = Dictionary<String, Any>()
        var meta = Dictionary<String, Any>()
        
        // 位置情報
        gps.setObject(location.timestamp,   forKey: kCGImagePropertyGPSDateStamp as! NSCopying)
        gps.setObject(location.timestamp,   forKey: kCGImagePropertyGPSTimeStamp as! NSCopying)
        
        // 経度の設定
        
        // 緯度情報を取得
        var latitude = location.coordinate.latitude
        var gpsLatitudeRef = "N"        // 北緯
        if latitude < 0
        {
            latitude = -latitude;       // マイナス値はプラス値に反転
            gpsLatitudeRef = "S"        // 南緯
        }
        gps.setObject(gpsLatitudeRef,   forKey: kCGImagePropertyGPSLatitudeRef as! NSCopying)
        gps.setObject(latitude,         forKey: kCGImagePropertyGPSLatitude as! NSCopying)
        
        // 経度情報を取得
        var longitude = location.coordinate.longitude
        var gpsLongitudeRef = "E"       // 東経
        if longitude < 0
        {
            longitude = -longitude;     // マイナス値はプラス値に反転
            gpsLongitudeRef = "W"       // 西経
        }
        gps.setObject(gpsLongitudeRef,  forKey: kCGImagePropertyGPSLongitudeRef as! NSCopying)
        gps.setObject(longitude,        forKey: kCGImagePropertyGPSLongitude as! NSCopying)
        
        gps.setObject(0,                forKey: kCGImagePropertyGPSAltitudeRef as! NSCopying)
        gps.setObject(0,                forKey: kCGImagePropertyGPSAltitude as! NSCopying)
        
        exif[kCGImagePropertyGPSDictionary as String] = gps
        
        exif[kCGImagePropertyExifUserComment as String] = "コメント"
        
        meta[kCGImagePropertyExifDictionary as String] = exif
        
        return meta
    }

```
twitterしかできない俺達の新しい継続的アウトプット

開設したその月に２件、次の月に１件しかないブログ
タイトルと出だしを少しだけ書いて放置している下書きたち
「何か書く」と登録だけして一向に埋まることのないAdvent Calendar

twitterでみた、きらきらした人たち（注：にゃーんとかいう人たち）にあこがれて、あるいは誰かが書いてくれたものに助けられたから、
でも書きあがらない、書き始められない

でもtwitterはできるんだ。140文字のつぶやきを、俺達は永遠に作り続けることができる
始めよう、この140文字で。新しい継続的アウトプットってやつをよお！この[Scrapbox](https://scrapbox.io/) で！！

![scrap.png](https://qiita-image-store.s3.amazonaws.com/0/74093/03633c42-a10a-d986-261c-b033e5c3b5b5.png)
> 1人wikiとして使われるScrapbox

# 本記事の読み方
本記事では4ステップで最近わたしが使っているScrapboxのよさをお伝えします
1. 俺達の文章を書くにあたっての特徴をあげる
2. 文章を書くのが苦手でもtwitterができる理由をあげる
3. Scrapboxでもtwitterと同じようにアウトプットできることを説明する
4. Scrapboxでのアウトプット


## 文章を構造化できないのでよい見出しがつけれません（twitterしかできない俺（達）の特徴）

さて、twitterはできるのにブログや、ドキュメントが書けない人の特徴は何でしょうか。3つ、上げたいと思います

1. 長い文章が書けない
継続して長い文章が書けません
そもそも文体が維持できません


2. 文章を構造化できない
序文にこれを書いて、これは補強だからここに入れて、このエピソードは大事だから伝わるように・・・
ちょっと難しいですね。markdownの見出しさえちょっと手間取ります


3. 途中で飽きる/やりたくなくなる/みたくもなくなる
ブログ管理画面を開くのすら精神的に負荷を感じます！
一回中断してしまったらそのままずるずるできなくなることあります（そもそもこの記事も前書きを書いた状態でしばらく放置してました

## 長い文章が書けないのでそろそろ終わりたい（ではなぜtwitterはできるのか）

1. 長い文章が書けない
書かなくていいです

2. 文章を構造化できない
しなくていいです

3. 途中で飽きる/やりたくなくなる/みたくもなくなる
twitterがプラットフォーム化してるんですよね
大体開いているし、何か気になるものが流れてきたら何も考えずに反応できる

## Scrapboxはそれらの課題を解決しているか？

Scrapboxはwikiです。たぶん。自分専用のwikiとして使っています

1. 長い文章が書けない
書かなくていいです
思いついたときに書き足せばいいので、とりあえず今頭の中の一番先頭にある文章を打ち込みましょう
blogではないので何も気にすることはありません

2. 文章を構造化できない
勝手にしてくれます
`[]`で囲んだり`#`で始めるとScrapbox内linkになります
このlink機能が強くて、このすばらしさを紹介したいが俺達の文章能力では無理なので[作っている人のScrapboxを見に行くがいいさ！](https://scrapbox.io/shokai/Scrapbox%E3%81%AE%E5%93%B2%E5%AD%A6)
とりあえず何も考えずに書いた文章のキーワードを囲んで、あとから書いていくことで勝手にScrapboxに内容が増えていって記事同士のlinkで構造化させる感じです

3. 途中で飽きる/やりたくなくなる/みたくもなくなる
プラットフォーム化、つまり常に開いている状態にしています
一人wiki（として使っている）なので、思いついたことはとりあえず書きこみます
非公開にして心理的抵抗をもっと減らす
わたしの場合は公開していますが非公開にもできるのでちゃんとした文章を書かないといけないという思い込みをなくしましょう。とりあえず吐き出します
Scrapboxは閲覧と編集もシームレスです
そもそも編集モードがないです。文章にカーソル持っていったら書きこめます
行単位の編集モードといった感じです

## Scrapboxのアウトプットとは
3つの話を軸にScrapboxはいいぞ、ということを書きましたが結局合うか合わないかという問題になるんではと思います
ごちゃごちゃしたまとまりのないものを吐き出すことでアウトプットになっていくのがわたしにとってはよかったですが、みなさんにとってはどうでしょうか

# 最後に
そもそもなんでアウトプットするんでしょうか
前文に書いたように誰かにあこがれて？誰かの記事に助けられたから？
わたしは過ぎ去っていってしまうからだと思う。もう昨日の自分のことも覚えていない

理由なんてなんでもいいけどとりあえず吐き出しとくのはいいぞ
AWSのPaaS, SaaSを利用して開発を効率化する

## はじめに
- AWSにはサーバやネットワークを提供するIaaSだけでなく、様々なPaaSやSaaSが提供されている
- これらを利用することで開発効率を上げることが出来る
- 今後の指針とするためにも、まずはどんなものがあるのか、どんな使い方が出来るのかを列挙してみる

## 対象
- AWSって名前を聞いたことはあるけど実際よくわかってない人
- クラウドっていうのはネット上にサーバがあるだけだと思ってる人

## そもそもIaaS, PaaS, SaaSとは

### IaaS
- Infrastructure as a Service
- サーバやストレージ、ネットワークといったインフラを提供するサービス
- レンタルサーバなどのホスティングサービスと違い、サーバのスペックやOS等をユーザが選択することが出来る
- AWSのEC2やGCPのComputeEngineなどが該当

### PaaS
- Platform as a Service
- OSやミドルウェアを含めたプラットフォームを提供するサービス
- インフラを管理する必要がなくなり、アプリケーションの構築に集中できるという特徴がある
- AWSのLambdaやElastic Beanstalk、GCPのAppEngineなどが該当

### SaaS
- Software as a Service
- アプリケーションまで含めたソフトウェア全体を提供するサービス
- 利用者はインターネット上で利用するだけでいい
- AWSのS3やCloudWatch, GoogleAppsのGmailやGoogleDriveが該当

### 分類方法
- TomcatやNginxなどのミドルウェアを用意する必要があるのはIaaS
- ソースコードなどのアプリケーションだけ用意すればいいのはPaaS
- 設定するだけですぐ使えるようになるのがSaaS
- 割と使い方によって変わる
    - 例えばS3を直接クラウドストレージとして使えばSaaSといえる
    - が、アプリケーションのバックエンドとして使うとPaaSっぽい
    - なので、あまり分類に意味はない気がする

## AWSの代表的なPaaS, SaaS

### Lambda
- サーバの設定などなく、コードをデプロイするだけで実行可能になる
- ElasticBeanstalkは構築をしてくれるサービスだが、こっちはサーバを意識する必要は全くない
- PaaSではなくFaaS(Function as a Service)とも呼ばれる

### S3
- 主に画像や動画などの静的ファイルを置いておくクラウドストレージ
- 一般的にはアプリのバックエンドなどで利用するためPaaSと言えるが、別に単体でも使えるのでSaaSとも言える

### Cognito
- ユーザーの認証や管理、デバイス間の情報同期を行える
- TwitterやGoogleなどのOpenID Connectプロバイダーとの連携も可能

### API Gateway
- 簡単にRESTfulAPIを作成、公開、管理できる
- モニタリングやアクセス権の管理まで可能

### CloudFront
- ContentsDeliveryNetwork(CDN)サービス
- キャッシュサーバーを利用したレイテンシの高速化やSSL通信、DDos対策などのセキュリティ設定が可能

### DynamoDB
- フルマネージドのKVS
- テーブルを作成するだけですぐにスケーラブルなDBが利用できる

### STS
- AWSのリソースに対する一時的なアクセス権を管理できる
- OAuth2.0でいう認可サーバの役割

## ユースケース
### バックエンドなしでSPAを作る
- バックエンドのコーディングをすることなくユーザ認証を備えたSPAを作成出来る
- 一部の仕様がAWSに縛られるので普通よりSPAのコード量は増えるかもしれない
- が、自分でユーザ管理やアクセス管理を作るよりだいぶ楽かつ安全
![SPA.PNG](https://qiita-image-store.s3.amazonaws.com/0/118147/21704efc-fa98-8365-a709-23cd2b6d8c7d.png)

- やっていることは
    1. Route53で独自ドメインを設定
    2. CloudFrontで高速化&SSL化
    3. S3で作成したSPAを配信
    4. Cognitoでユーザの認証を実施
    5. STSでユーザの認可を実施
    6. アクセス権にしたがってDynamoDBへアクセス

### サーバを立てずにユーザ統合をする
- 別々にユーザ管理を行っていたサービスのユーザ統合を行うような場合を想定
- 普通にやると、各サービスとは別にユーザ管理用のサーバを立てる必要がある
- AWSを利用すると、簡単にサーバレスな認証APIを作ることができる
![serverless.PNG](https://qiita-image-store.s3.amazonaws.com/0/118147/48f09260-1a2e-4ee9-4153-a0d0419a64e3.png)
- やっていることは
    - Cognitoを利用してユーザの管理、認証を行う
        - 外部からのユーザ取り込みにも対応している
    - Cognitoを利用するための処理をLambdaを利用して共通化する
    - API Gatewayを利用してRESTfulAPIとして公開
- これによって、各サービスからRESTfulAPIを呼び出すだけで認証を行うことが出来るようになる
    - Cognitoの仕様上の制約は諸々あるので、サービス側の修正は多少必要

## まとめ
- とりあえずざっと書き出してみました
- この辺を手がかりに何を勉強すればいいのか考えると良いと思います
pythonで任意の場所に文字を挿入したい！（関数・ラムダ式でも書いてみた）

``` code
base_string = 'test'
INSERT_POINT = 2  #分かりやすくするために大文字
insert_string = '--hoge--'

# 2文字目から挿入したい場合
print '{0}{1}{2}'.format(base_string[:INSERT_POINT], insert_string, base_string[INSERT_POINT:])
```

これの結果は
**te--hoge--st**
となります。

# 応用
``` code
def insert_string_to_base(target_string, insert_point, insert_string):
    return target_string[:insert_point] + insert_string + target_string[insert_point:]
```

とすると関数で使えるし、

``` code
insert_string_to_base = lambda base_string, insert_point, insert_string : base_string[:insert_point] + insert_string + base_string[insert_point:]
```

とするとラムダ式になります。
どちらも、

``` code
base_string = 'test'
INSERT_POINT = 2  #分かりやすくするために大文字
insert_string = '--hoge--'

# lambdaで見たい場合は予め上記コードをここに書いておく

# 出力
print insert_string_to_base(base_string, INSERT_POINT, insert_string)
```

で結果を参照できます。
Windows Update がエラーで失敗する(5)(80072EE2)

https://www.projectgroup.info/tips/Windows/comm_0106.html

3.「このゾーンのサイトにはすべてサーバーの確認（https:）を必要とする」にチェックが入っている場合は外します。
 「この Web サイトをゾーンに追加する」のテキストボックスに以下のアドレスを入力して「追加」ボタンを押し、リストへ追加します。
 　　・http://*.update.microsoft.com
　　・https://*.update.microsoft.com
　　・http://download.windowsupdate.com


でできましたっ
品質重視の見積もり

# はじめに

これは`3年前`に今のプロジェクトにジョインした際にまとめた時のまま、今も使っているものです。
この方法だと、`見積もり完了=仕様FIX=設計完了`状態なので、見積もりが出るまでにある程度時間が必要になります。
そのため、見積もりが出た時点ではもう工数足りないじゃんってことがまぁあります。（そうなったらどう間に合わせるか調整します）
ただ、これで引いたスケジュールが崩れることは少ないです。

ですが、見積もり次第でリリースバージョンを決めたい場合には、ちょっとイケてないなーと感じていたりするわけで。

というものになるのですが、 **品質を重視** してこれまでやってきたので、もうちょっと良い方法がないかなーと模索中なこの頃です。

---

#・心構え的な

　残業、徹夜等で体調を崩して休むことになったり遅刻してしまっては、結局作業時間をロスしてしまいます。
　MTGがあったり、他のセクションとの連携にも影響が出ます。
　早く帰ってちゃんと朝来ましょう。
　頑張って残業してロジカルなことやろうとしても、きっとバグ生成してますよ。

# ・単位は時間（h）

　時間で出してください。

# ・作業時間は1日6時間で見積もる

　MTGなどで **8時間も作業できない** はず。

# ・見積もりは定時で帰る前提

　とりあえず、まともに定時で帰る見積もりを出してみて、終わるのがいつになるのか出しましょう。
　で、リリースしたい希望日との擦り合わせをしながら、一日何時間まで残業を許すかプロジェクトで決めて、どこまで早められるか検討しましょう。
　 **最初から残業前提で見積もってしまうのはやめましょう。** 

# ・1チケット8時間以内に細分化する

　8時間を超えるチケットはさらにタスクを分けたチケットを作る。

# ・普段見積もり慣れていない人は、自分が考えた見積もりの1.5倍くらいのバッファを加える

　早く終わる分にはいいですが、遅れた場合はスケジュールに影響があります。

# ・遅れた時間の倍ロスすることになる

　つまり、1日遅れると2日分ロスすることになると考えます。
　 **タスクが終わるのに1日遅れ、予定していた次のタスクに取りかかるのが1日遅れるため** です。

# ・自身で見積もった工数は死守すること

　 **約束は守りましょう。** 
　その見積もりを考慮した上でスケジュールがあります。
　守ってもらえなくなると、どーせ見積もり通り終わらないんでしょってことで信じてもらえなくなります。
　スケジュールの調整もやりづらくなってしまい、結果、プロジェクトが上手く回らなくなります。

# ・なんとなくで見積もらない

　このくらいかなーで見積もりしないように。
　例えば、課金機能というので見積もりをするとして、なんとなく大変そうだから10日くらいかなーはダメです。
　いうなれば設計をしてください。
　テーブル設計で○h、実装が必要な関数が10個で各○h、修正が必要な機能が5個で各○h、などなど作業を洗い出してください。
　それで初めて工数がでるはずです。

　洗い出した作業はそれぞれチケットを作りましょう。
　関数1つで1チケットでも良いです。
　そこまで細分化しておくと、その関数だけ他の人に担当してもらったりと作業を割り振り易くなります。

# ・言われた期日に合わせた見積もりはしない

　企画陣はリリースしたい日を言ってきますが、そこに工数を合わせないこと。

　例えば、見積もりが10日だとして、言われた期日までは7日しかないとします。
　だからといって見積もりを7日にしないように。
　自身が品質を担保できるのが10日だとしたら10日で。
　短く見積もり出したところで結局間に合わないので、関係者に迷惑です。
　約束は守りましょう。
　
　ただ、単純にリスケを訴えるのではなく、溢れた3日をどうすればいいかは考えて相談しましょう。
　仕様を削るのか、作業者を追加するのか。
　企画陣は意図があって期日を決めているはず（でないと困る）なので、出来る方法を考えましょう。

# ・難易度判定ができない、チケットの細分化ができないという場合は、仕様が曖昧 or 技術調査が必要

* 仕様が曖昧：プランナーへ仕様を確認、確定の上、開発工数を算出
* 技術調査が必要：調査に必要な工数を提示、その後、開発工数を算出 

# 簡易な見積もり表

（前述の方針を基本として）スピーディに工数見積りを出すべく、難易度判定をして時間を出す方法をとっていたり。
細かく見積もり切れちゃう人はこれは不要です。

|難易度|作業時間の目安|Redmine上予定工数（時間）|
|:-----------------:|:------------------:|:------------------:|
|A|2日以内|12|
|B|6時間（1日）以内|6|
|C|3時間以内|3|
|D|1時間以内|1|
|E|30分以内|0.5|

# 最後に
うちの見積もり方法イケてるよってのがあれば、ぜひ教えてくださいー。
GoのインストールからHello worldまで



アプリを作ろうという話になり、普段使っているRailsではなくGoで作ってみようとなったので、[A Tour of Go](https://go-tour-jp.appspot.com/list)を始めました。
そのときのメモです。

## Homebrewでインストール
まずはHomebrewを使ってGoインストール。

```bash
brew install go
```

自分の場合はすでにインストールはしてあったので、アップデートをしました。

```bash
brew upgrade go
```

## Pathを通す
シェルはfishを使っているので、config.fishにPathを追加します。

```fish:config.fish
set -x GOPATH $HOME/go
set -x PATH $PATH /usr/local/opt/go/libexec/bin
```

config.fishを再読込みするとPathが通っています。

```bash
echo $GOPATH
```

## Hello world
任意のディレクトリに`hello.go`を作成し、Hello world記述していきます。

```go
package main

import (
  "fmt"
)

func main() {
  fmt.Println("Hello world")
}
```

Goのプログラムはpackageで構成されます。
（構成されるとは？？）
プログラムは`main`packageから開始されます。

`go run ファイル名`で実行できる。

```bash
go run hello.go
```

実行はmainパッケージのmain関数が実行されるので、main packageではじめ、main関数を作成するう必要がある。

## 終わりに
Goのフレームワークをこのあと調べようと思っているのですが、おすすめや気になっているフレームワークがあったらコメントで教えていただけるとうれしいです。
この記事を流し見しただけですが、モバイルアプリならEchoでも十分かなと思ったり。
いやいや、ルーターの正規表現はあったほうが良いかなと思ったり。。
[Top 6 web frameworks for Go as of 2017](https://blog.usejournal.com/top-6-web-frameworks-for-go-as-of-2017-23270e059c4b)
FuelPHPでUnitテストが途中で止まる。

いままでJavaしか扱ってこなかったのですが、転職しPHPを使うようになりました。
使っているフレームワークは「FuelPHP」なのですが、Unitテストでハマったので備忘録程度に記載します。

#使っているもの
PHP 5.6
FuelPHP 1.8
PHPUnit 5.5.7
aspect-mock 1.0.0

#起きたこと
　pho oil test -group=App を実行するが、途中で止まる。

```console
$ php oil test -group=App
Tests Running...This may take a few moments.
PHPUnit 5.5.7 by Sebastian Bergmann and contributors.

.... 
↑　12ケースあるのに、5ケースで止まって終了する。結果も表示されない。
```
#原因
　Controller内でRedirectが実行されていたため。
　（Redirectの内部ではexit()が呼び出されている）

#対策
　以下のページを参考に対応しました。
　https://qiita.com/tuttieee/items/a140fb0b5c4e67386ea3

#対応結果
ちゃんとテストできるようになりました！

```console
Tests Running...This may take a few moments.
PHPUnit 5.5.7 by Sebastian Bergmann and contributors.

............                                                      12 / 12 (100%)

Time: 2.06 seconds, Memory: 21.75MB

OK (12 tests, 12 assertions)
```