OmniAICreator/Qiita-1.07M huggingface dataset:
オーバーロード関数をtolua++で生成しようとした話


## 問題のあるコード

下記のような C++ コード foo.cpp があったとします。

```foo.cpp
void overloaded_function(bool _) {
  std::cout << "type is bool" << std::endl;
}

void overloaded_function(int _) {
  std::cout << "type is int" << std::endl;
}

void overloaded_function(const std::string &_) {
  std::cout << "type is string" << std::endl;
}
```

この関数に対応するグルーコードを tolua++ で生成します。

```foo.pkg
$#include "foo.h"
void overloaded_function(bool);
void overloaded_function(int);
void overloaded_function(const std::string&);
```

```shell
$ tolua++ -o ./foo.cpp -H ./foo_glue.h ./foo.pkg
```

こうして用意した C++ の関数を Lua 側から呼び出してみましょう。

```lua
overloaded_function(1)
overloaded_function(true)
overloaded_function("")
```

結果はご覧の通り。

```
type is string
type is string
type is string
```

## 何が問題か

Lua は動的型付け言語なので、オーバーロードした C++ 定義の関数を Lua 側で呼び出そうとすると曖昧なマッチが行われてしまいます。
このような呼び出しをした際、pkg ファイルの下に書かれているものから逆順にテストされていくそうです。
このことは[リファレンス](https://webserver2.tecgraf.puc-rio.br/~celes/tolua/tolua-3.2.htm)にきちんと書かれていました(速度は重要なのだから呼び出しが多いものは最後に指定せよ、とも)。

Overloaded functions の項目より抜粋します。

>It is important to know that tolua decides which function will be called in run-time, trying to match each provided function. tolua first tries to call the last specified function; if it fails, tolua then tries the previous one. This process is repeated until one function matches the calling code or the first function is reached. For that reason, the mismatching error message, when it occurs, is based on the first function specification. When performance is important, we can specify the most used function as the last one, because it will be tried first.

だったらオーバーロードするのではなく、関数を別名にすれば良いじゃん！とか思ってしまいそうです。ですが、エレガントではありません。なんとかならないのでしょうか？

## 解決方法

もう少しリファレンスを眺めると、[Renaming constants, variables and functions](https://webserver2.tecgraf.puc-rio.br/~celes/tolua/tolua-3.2.html#renaming) に書いてありました。(pkgファイルで)「@」をつけるとリネームすることができるよと。

>When exporting constants, variable, and functions (members of a class or not), we can rename them, such that they will be bound with a different name from their C/C++ counterparts. To do that, we write the name they will be referenced in Lua after the character @.

というわけで、オーバーロードする関数は pkg ファイルで @ を付けて曖昧さを回避しましょう。

```foo.pkg
void overloaded_function @ overloaded_function_bool (bool);
void overloaded_function @ overloaded_function_int (int);
void overloaded_function @ overloaded_function_string (const std::string&);
```

lua 側からはこのリネームされた関数を呼び出すことができます。

```lua
overloaded_function_bool(true);
overloaded_function_int(1);
overloaded_function_string("");
```

Lua 側からは関数を呼び分ける必要がありますが、C++ 側で別名の関数なんて自分で定義しなくても良いのでした:)
Java switchで季節表示

※入力ストリームについて
■Systemクラスはjava.langパッケージに含まれているので、import文は不要。

■通常、クラスのフィールドを利用するには、newを使ってクラスをインスタンス化する必要があるが、Systemクラスはプログラムが起動した時点でインスタンス化が完了している。このため、インスタンス化を行わなくても、すぐに使うことができる（クラス変数）。

```java
import java.util.Scanner;

public class Season{

	public static void main(String[] args){
		System.out.println("整数を入力してください");

	    //入力ストリーム　newの次のScannerはコンストラクタ
		Scanner scan = new Scanner(System.in);
		int a = scan.nextInt();
		switch (a) {
			case 1 : case 2: case 12:
				System.out.println("冬です");
				break;
			case 3 : case 4 : case 5:
				System.out.println("春です");
				break;
			case 6 : case 7: case 8:
				System.out.println("夏です");
				break;
			case 9 : case 10: case 11:
				System.out.println("秋です");
				break;
			default :
				System.out.println(a+"月は存在しません");
			}

	    //closeメソッドを使って、インスタンスを破棄し、
	    //使用していたメモリー領域を解放する。
		scan.close();

	}
}
```

※switchについて
■Swiftのような
『case 1,3,5,7,8,10,12:』
という書き方はjavaではエラーになる。

■breakを忘れるというのが未だやってしまいかねないミス。
.NET で(空間)幾何学形状の演算や判定を行うなら NetTopologySuite(NTS) がオススメ

何度か紹介してるかもだけど、 ちょっと使う機会があったので改めて。

* [NetTopologySuite/NetTopologySuite: A .NET GIS solution that is fast and reliable for the .NET platform.](https://github.com/NetTopologySuite/NetTopologySuite)

NetTopologySuite、通称 "NTS" は、 JTS - Java Topology Suite を .NET へ移植したものです。

この JTS は、他にも各言語へ移植されています、次に一覧を載せときますね。

* .NET(C#) - [NetTopologySuite/NetTopologySuite: A .NET GIS solution that is fast and reliable for the .NET platform.](https://github.com/NetTopologySuite/NetTopologySuite)
* C++ - [GEOS](http://trac.osgeo.org/geos/)
* JavaScript - [bjornharrtell/jsts: JavaScript Topology Suite](https://github.com/bjornharrtell/jsts)

JTS は、 PostgreSQL や Solr、 Elasticsearch などにも採用されている十分に「枯れた」ライブラリで、その .NET 移植である NTS も十分に枯れています。

今回は、試しに Xamarin Workbooks で、サクッとその機能を試してみます。

Xamarin Workbooks の新規ドキュメントで Nuget Packages に "NetTopologySuite" を追加し、次のコードをタイプします。

```csharp
using NetTopologySuite.Geometries;
using NetTopologySuite.IO;
using NetTopologySuite.Operation.Distance;

var wktReader = new WKTReader();
var polyline = wktReader.Read("LINESTRING(10 5, 15 10, 20 7)");
var point = wktReader.Read("POINT(16 6)");
var distance = new DistanceOp(polyline, point);

var nearestLocation = distance.NearestLocations();
nearestLocation.ToList();
```

で、実行っぽいボタンを押す、または cmd+enter を押すとコードが実行され、最下行の結果がインタラクティブに表示されます。下図のような感じで。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8227/4099c419-0cb4-1208-a7e5-00baa4147006.png)

ここでは ``DistanceOp`` という演算クラスを使って (10, 5) - (15, 10) - (20 7) から成る線分（ポリライン、 NTS では LineString という） と (16, 6) の点との最も近い点(NearestLocations)を得ます。

結果は２つの GeometoryLocation があり、1つ目はポリラインの中でポイントと最も近い線分上の座標(Coordinate)、最も近い頂点インデックス(SegmentIndex)などが含まれます。２つ目はPointの中でポリラインと最も近い点なのでPointそのものです。

NTS/JTS の機能は膨大で、まともなドキュメントもないので初見で機能を探すのも大変なのですが、 API ドキュメントや UnitTest を眺めるといろいろ知ることができます。図形の演算、判定で困ったらアテにしてみるとよいでしょう。

Xamarin Workbooks を使うのは久しぶりですが、 nuget package の追加が簡単にできるようになって、使いやすくなってますね。
座標値がグラフィカルに可視化できたらなおよいですが、きっと方法がありそうですね。

NTS のような単純なライブラリなら、 Xamarin Workbooks を使ってサクッと試すことができるので、活用していきたいものです。
【Python】pipの中身を全部削除するコマンド

## はじめに
`pip`の中身を綺麗にしたい時、毎回ググってたのでコマンド化したいと考えました

いつもだいたい[この記事](https://qiita.com/hunzy/items/6965dce22cedb046af7c)を参考にさせて貰っていました

## 実装
### 1.スクリプトを作る
```pip_delete.sh
touch pip_delete_list.txt
pip freeze > pip_delete_list.txt
pip uninstall -r pip_delete_list.txt
rm pip_delete_list.txt
```
`pip_delete.sh`をどこか好きなところに置きましょう
ちなみに僕は`~/`に置きました

### 2.エイリアスを作る
`~/`に置いてある`.zshrc`の中に

```
alias pipDelete='sh ~/pip_delete.sh'
```
と記述してください
そうすると、terminalで`pipDelete`と入力すると`pip`の中身を消すことが出来ます

## おわりに
`alias`を無駄に量産している気がしますが、自分が便利だと思ってるので満足です（＾ω＾）
ちなみに僕の`alias`を晒します

```
## コマンド系
alias la='ls -a'
alias ll='ls -l'
alias mv='mv -i'
alias mkdir='mkdir -p'
alias cd..='cd ..'

## mosquitto
alias mosquitto='/usr/local/opt/mosquitto/sbin/mosquitto'

## git
alias ga='git add .'
alias gc='git commit -m'
alias gca='git commit --amend'
alias gcane='git commit -a --amend --no-edit'

alias gb='git branch'
alias gbd='git branch -d'
alias gbD='git branch -D'

alias gco='git checkout'
alias gcob='git checkout -b'

alias gpom='git push origin master'
alias gpoh='git push origin HEAD'
alias gpomf='git push -f origin master'

alias grh='git reset --hard'
alias grs='git reset --soft'
alias grh2='git reset --hard @~'

alias grbi='git rebase -i'

alias gs='git stash'
alias gsp='git stash pop'

## directory
alias wt='~/work/test'
alias wg='~/work/gitRepository'

## python
alias pyrn='python manage.py runserver 0.0.0.0:8080'
alias pymake='python manage.py makemigrations '
alias pymakeg='python manage.py makemigrations general'
alias pymig='python manage.py migrate'
alias pycsu='python manage.py createsuperuser'

## sudo の後のコマンドでエイリアスを有効にする
alias sudo='sudo '

## グローバル
alias -g L='| less'
alias -g G='| grep'

## 趣味
alias kyoko='open ~/Pictures/ゆるゆり/kyoko.jpg'

## 便利
alias pipDelete='sh ~/pip_delete.sh'
```

## 追記
**2017年10月26日追記**
@akamecoさんにご指摘いただきました！
`.zshrc`に

```
pipDelete() {
    touch pip_delete_list.txt
    pip freeze > pip_delete_list.txt
    pip uninstall -r pip_delete_list.txt
    rm pip_delete_list.txt
}
```

と記入すれば、そもそも`pip_delete.sh`を`~/`に置く必要がなさそうです(笑)
こっちの方が簡単そうなので、是非こちらで！
マイグレーションファイルの役割と生成

#環境
- IDE：Cloud9
- Ruby：ruby 2.0.0p648
- Rails：Rails 4.0.5

#マイグレーションファイルとは？
マイグレーションファイルは、データベースを生成する際の設計図になる。マイグレーションファイルを実行することにより、その内容に基づいたデータテーブルを生成してくれる。実際にどのような記述があるのか確認していく。

#マイグレーションファイルの生成
マイグレーションファイルを生成するコマンドは以下となる。

```:migrationファイルの生成
rails g migration　マイグレーション名
```

モデルと一緒に生成するには以下のコマンドとなる

```:モデルと一緒に生成
rails generate model モデル名 カラム名:型 カラム名:型 ....
```

基本的にはモデルと一緒に生成し、必要に応じてマイグレーションファイルのみ追加生成といった使い方か？

#マイグレーションファイルの中身
実際に`rails generate model`でマイグレーションファイルを生成し、その中身を見ていく。今回はよくあるUserモデルを生成することにする。

```:UserModel
rails generate model User name:string age:integer
```

```:[年月日時分秒日付]_create_users
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.integer :age

      t.timestamps
    end
  end
end
```
マイグレーションファイルの名前のは、頭に年月日時分秒日付が付き、複数形になる。
マイグレーションファイルの中身を作り終えたら、以下のコマンドで適用させなければならない。

```:マイグレーションファイルを適用
rake db:migrate
```

一度マイグレーションファイルを使用してテーブルを作ってしまうと、あとから同じマイグレーションファイルを変更しても反映されなくなるので注意が必要である。

#課題
マイグレーションファイルの生成と中身の確認を行った。今後は実際にどのように編集をしていけばいいのか、モデルファイルとの関係性の確認などを勉強していきたい。

#参考
http://maeharin.hatenablog.com/entry/20130212/rails_generate
https://qiita.com/zaru/items/cde2c46b6126867a1a64
GitHub で翻訳等の理由で master の内容を変えてしまった際に、オリジナルのリポジトリにプルリクエストを送る方法


GitHubであるリポジトリをフォークして、それをたとえば翻訳した場合、master ブランチは好き勝手に変わってるわけで、そこからプルリクエストを送ることはできません。

そんな時にオリジナル側に何らかのプルリクエストを送りたい場合は、オリジナル側と同じ内容のブランチを作ってそのブランチからプルリクエストを送ります。

## 手順

`git remote add` でオリジナル側のリポジトリを追加して `fetch` してください。今回の場合は、`upstream` という名前にしています。

```
$ git remote add upstream git@github.com:xxxx/xxxx.git
$ git fetch
```

次に新しく `upstream` というブランチを作って `upstream` の `master` ブランチからチェックアウトします。

```
$ git checkout -b upstream upstream/master
```

これでこの `upstream` ブランチからさらに作業用のブランチを作って GitHub に `git push` すればプルリクエストが送れます。

この手順がなかなかわからなくてハマってしまった。。。

というわけで、先日翻訳してたくさんのスターをいただいた [フロントエンドチェックリスト](https://qiita.com/miya0001/items/8fff46c201bf9eaeba4a) のオリジナル版の方に2つプルリクを送ってマージしてもらいました。

https://github.com/thedaviddias/Front-End-Checklist/pulls?q=is%3Apr+author%3Amiya0001+is%3Aclosed
Vue.js コンポーネントのネイティブイベント

ライブラリのコンポーネントを使ってイベントを購読したいのに
コンポーネントがイベントを提供しなければできないのかと思ったらできた話。

例えば、Vue MaterialのInputコンポーネントでエンターキーイベントを購読したくて
次のように書いても処理されない。

```html:template.vue
<md-input v-model="value" @keyup.enter="pushItem"></md-input>
```

次のように「.native」をつけることで処理される。

```html:template.vue
<md-input v-model="value" @keyup.native.enter="pushItem"></md-input>
```

（参考）
[ネイティブイベントとコンポーネントのバインディング — Vue.js](https://jp.vuejs.org/v2/guide/components.html#%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0)
re:dashでデータにhtmlタグが入っている場合

re:dashとは、WEB上で様々なデータベースに接続できて、結果を表やグラフで表示できるツール。dockerを使うと比較的に簡単に構築できる。
[AWS EC2にdockerベースのredashを一から設定して起動するまで](https://qiita.com/suzukihi724/items/91950450734e4c9913cf)

データにHTMLタグが入っていると、HTMLタグが効いてしまう。scriptタグが入っていた場合は、XSS対策なのか表示から削除されている。

![redashdash.png](https://qiita-image-store.s3.amazonaws.com/0/34699/280626fe-76d3-c25f-c8c3-6d6b462392f0.png)

あんまりこういったデータをre:dash上で使うことはないと思うけど、何か対策がないか気になる。
MIREX2017　コード進行認識タスクの手法まとめ

音楽情報処理技術コンテストMIREX(Music Information Retrieval EXchange)の、今年のコード進行認識タスクの結果が[発表されました](http://www.music-ir.org/mirex/wiki/2017:Audio_Chord_Estimation_Results)。筆者が提出したアルゴリズムを含め、計5個のアルゴリズムが自動コード認識の精度を競いました。それぞれの結果と手法を簡単にまとめます。
去年の結果については[筆者のブログ](http://xiao-ming.digick.jp/mir/mirex2016chord/)にまとめられています。今年はここに書くことにしました。

#CM1
[Chordino](http://www.isophonics.org/nnls-chroma)というソフトウェア(厳密にはプラグイン)で実装されているコード認識プログラムです。同じアルゴリズムで毎年参戦していて、ベースライン的な存在です。関連の論文は：
>Mauch, Matthias and Dixon, Simon: Approximate Note Transcription for the Improved Identification of Difficult Chords, Proceedings of the 11th International Society for Music Information Retrieval Conference (ISMIR 2010), 2010.

この成績が、一つの基準になります。今年の提出物の中だと完全に引き立て役に徹してしまっていますね。

#JLW1、JLW2
研究室の有能な後輩の提出物です。特徴量はChordinoで使われているNNLS-Chromaを使い、巨大な**ランダムフォレスト**を訓練してパターン認識を行いました。筆者のアルゴリズム(後述)と違い、複雑なコードタイプも一緒に分類しちゃうアプローチをとりました。JLW1は普通のHMMでポストフィルタリングを行いましたが、JLW2はBeat tracking用のCRFを参考に、コード分類と分割を同時にモデル化して最尤系列を探索するアルゴリズムを開発。精度も全体的にJLW1を上回っています。Seventhの精度は筆者のアルゴリズムに迫り、Bassは普通に良く、結果両方考慮するSeventhBass基準の精度で、筆者を抑え過去最高を達成しました。

#KBK1, KBK2
去年とんでもない数字をたたき出したアルゴリズムが今年も参戦してきました。KBK1がDeep Chromaで、KBK2がCNN-CRFモデルのやつ。やたらMajminの数字が高いと思ったら、IsophonicsとかRobbieWilliamsとかRWCとか全て訓練データに使っているんですね。でもTrain SetにないBillboardセットやUSPOPセットでも普通に数字がいいのでやっぱり性能自体は良いという事なんでしょう。
CNN-CRFの方が突出して精度が高く、やっぱりさすCNNという事なんでしょう。ただトライアドにしか対応していないのでMajmin以降の成績は良くないです。

#WL1
筆者の提出物です(自分、Wu Yimingと申します)。深層学習ベースのシステムですが、ざっくり説明すると、**大量のMIDIデータ**を使い、音声から各時間に鳴っている音高(＆ベース)を推定するニューラルネットワークを訓練し、その推定結果を特徴量としてさらにパターン認識を行おうというアプローチです。おおまかなNote transcriptionを行ったという感じでしょうか。
BLSTM-CRFで作った分類器はMajminレベルの認識に留まりますが、超簡素な後処理でセブンスと転置に対応しています。
Majminの精度にある程度自信はあったのですが、そこそこという感じ。DeepChromaよりは良かったようですね。意外にSeventhのスコアが過去最高の数字だったりします(そもそもSeventh以降を扱ったアルゴリズムは少なかったのですが)。Bassの分類がイマイチなのは第一、第二転置しか考慮していなかったからかもしれません(迂闊)。
別記事でもうちょっと詳しく説明したいと思います。

#まとめ
今年は計4つのグループ(うち二つは我々復旦大学)のみの参戦に留まりました。ちょっと少なかったので過去年の成績を掘り出して比較してました。
MIREXの評価セットを避けて、自分のモデルはRWCとUSPOPデータセットを使って学習したのですが、MIREXがRWCとUSPOPをしれっと評価セットに追加しててちょっと焦りました。タスクの責任者に(後輩が)問い合わせてみたら、「使った訓練セットをちゃんと明記すれば良いのよ」とのこと。まあKBKらもそうだしね・・・
とりあえず自分の提出物の成績が悪くなくてホッとしています。Bassはちょっとした改造で更に良くなれただけに結構悔いが残りますが、研究室からISMIR参加費を勝ち取れた事だし、収穫が大きいMIREX参戦でした。
ISMIRの最終日にポスターを貼る予定です。パッシブスキル人見知りが発動しそうで心配ですががんばります。
かんたん！KotlinでJSONパース【Jackson】

# かんたん！KotlinでJSONパース【Jackson】
Kotlinのお勉強がてらJSONパーサー(deserialize)を作成したのですが、
あまりにも記述が簡潔だったのでご紹介します！

## Jackson Kotlin Module
JavaのJSONパースライブラリとしてはJacksonがおなじみですね。
そのJacksonの開発元のFasterXMLからKotlin用に"Jackson Kotlin Module"が提供されています。
今回はこちらを用いてJSONをオブジェクトへとパースします。

## 環境
- Kotlin: 1.1.51
- Jackson Kotlin Module: 2.9.0

## 準備
まずはJackson Kotlin Moduleをダウンロードします。

Mavenの場合は以下をpom.xmlへ追加

```xml:pom.xml
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-kotlin</artifactId>
    <version>2.9.0</version>
</dependency>
```

Gradleの場合は以下を追加

```gradle:build.gradle
compile "com.fasterxml.jackson.module:jackson-module-kotlin:2.9.0"
```
## パースするJSON
今回パースするJSONはこちら。

```json:color.json
{
  "color": "green",
  "kana": "みどり",
  "code": {
    "rgba": [0,255,0,1],
    "hex": "#0F0"
  }
}
```

{}が入れ子になっていて少し厄介なJSONです。
それではコードを書いていきましょう。

## その1: dataクラスを作成
KotlinでJSONパースをするにあたってまずはdataクラスを作りましょう。
この記事においてdataクラスの詳しい説明は避けますが、
ざっくりいうとclassの定義にdataという修飾子を付けることで、
hashCodeやequals, toStringなどプロパティ関連の各種メソッドを自動で作ってくれます。
すごく便利ですね！

それではパースするJSONに合わせて以下のようにdataクラスを作ります。

```kotlin:Color.kt
data class Color(val color: String, val kana: String, val code: Code)
```

たった1行です。
Color.ktの各プロパティはcolor.jsonの3つのキー("color", "kana", "code")と対応しています。
またキー："code"の箇所は{}が入れ子になっているため、Code型のプロパティを作成し、dataクラス(Code.kt)を同様に作成します。

```kotlin:Code.kt
data class Code(val rgba: IntArray, val hex: String)
```

こちらも同じく1行です。
以上でパースしたJSONを格納するオブジェクトの準備はできました。

## その2: パース
あとはパース(deserialize)をする処理を書くだけです。

```kotlin:Main.kt
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue

fun main(args: Array<String>) {
    // パースするJSON
    val json = "{ \"color\": \"green\", \"kana\": \"みどり\", \"code\": { \"rgba\": [0,255,0,1], \"hex\": \"#0F0\" } }"

    // mapperオブジェクトを作成
    val mapper = jacksonObjectMapper()

    // jsonをdeserialize
    // 下の場合はjsonがColor型のオブジェクトにマッピングされる
    val color = mapper.readValue<Color>(json)

    println(color)
    println("色(かな)：${color.kana}")
    println("RGBAコードのG値：${color.code.rgba[1]}")
}
```
jackson-kotlin-modukeのjacksonObjectMapper()でマッパーを作成し、
あとはreadValue()でパースしたいjsonを渡すだけです。
実行結果は以下のようになります。

```
Color(color=green, kana=みどり, code=Code(rgba=[0, 255, 0, 1], hex=#0F0))
色(かな)：みどり
RGBAコードのG値：255
```
以上の通り、簡潔な記述によりJSONとして渡した内容をオブジェクトに変換することができました。

## さいごに
私はKotlinをはじめて1周間程度なのですが、簡潔な記述できる工夫を節々に感じ、すっかりKotlinが好きになりました。
特にJavaのLombokを使っているかのようにアクセッサメソッドをかかずに済むところは非常に便利ですね。
またJavaの膨大なライブラリの恩恵を受けることができるのもKotlinのいいところですね。

ソースコードはGitHubにも置きました。[こちら](https://github.com/gumimin/KotlinJsonParserSample)

本記事へのご指摘やアドバイスがございましたら、ぜひ教えて頂けるとうれしいです！
DBMS_PERF.REPORT_PERFHUBファンクションでパフォーマンス・ハブ画面をHTML出力してみる。

DBMS_PERFパッケージのREPORT_PERFHUBファンクションを使うと、
Enterprise Managerのパフォーマンス・ハブ相当の画面をHTML出力できるんやで彡(ﾟ)(ﾟ)
※Enterprise Managerを構築することなく、DB単体で出力できます。

まず以下のようにしてhtmlファイルをSPOOL出力。

```sql
SET LONG  10000000;
SET LONGC 10000000;
SET LINESIZE 32767;
SET PAGESIZE 0;
SET TRIMSPOOL ON;
SPOOL perfhub.html
SELECT DBMS_PERF.REPORT_PERFHUB FROM DUAL;
SPOOL OFF;

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <script language="javascript" type="text/javascript">
：
：
                </report>
   </report>
   <!--FXTMODEL-->
  </script>
 </body>
</html>
```

出力したHTMLファイルをブラウザで開くと、下記のような画面が見れます。
※ワイChrome使いなんですが、Chromeだと表示できんかったんでFirefoxで閲覧
![perfhub1.jpg](https://qiita-image-store.s3.amazonaws.com/0/110066/027d43c7-5ba7-76e7-05c7-ec9998723bed.jpeg)

「Monitored SQL」タブをクリックすれば、SQLモニタリングのトップ画面を見れます。
![perfhub2.jpg](https://qiita-image-store.s3.amazonaws.com/0/110066/b2c49b7c-424b-22fd-316e-7d5d962eb4e3.jpeg)

sql_id をクリックすれば、各SQLのSQLモニタリング・レポート(ACTIVE形式)も見れるやで彡(^)(^)
![perfhub3.jpg](https://qiita-image-store.s3.amazonaws.com/0/110066/52b9264a-dc7a-0a20-f8a1-f9e9574044d1.jpeg)

マニュアルもどうぞ彡(ﾟ)(ﾟ) 原則としてDiag と Tuning のオプション・ライセンスが必要です(｀･ω･)ゞ

> Oracle Database PL/SQL パッケージおよびタイプ・リファレンス
12c リソース2 (12.2) E85246-02
116 DBMS_PERF
REPORT_PERFHUBファンクション
https://docs.oracle.com/cd/E82638_01/ARPLS/DBMS_PERF.htm#GUID-85CD8AB9-B6E0-444F-91A5-762EB92A74E9


 > Oracle Databaseライセンス情報ユーザー・マニュアル
12cリリース2 (12.2) E81318-04
Oracle Database製品で許可される機能、オプションおよびManagement Pack
https://docs.oracle.com/cd/E82638_01/DBLIC/Licensing-Information.htm#GUID-0F9EB85D-4610-4EDF-89C2-4916A0E7AC87
 > ：
 > ●DBMS_ADDM、DBMS_PERF、DBMS_UMFおよびDBMS_WORKLOAD_REPOSITORYパッケージはこのパックの一部です。
 > ：
 > Oracle Tuning Packの機能は、データベース・サーバーAPIおよびコマンドライン・インタフェースでもアクセスできます。
 > ：
 > ●DBMS_PERF
rails s で起動できません。

takuminoMacBook-Pro:sample takumi$ rails s
=> Booting Puma
=> Rails 5.0.6 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.10.0 (ruby 2.3.1-p112), codename: Russell's Teapot
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop

どのようにしたら良いでしょうか？
UITableViewCellをXibから読み込む場合の落とし穴

# 今回自分がハマったポイント
xibファイルで作成したUITableViewに登録する方法は以下の４つである

- func register(UINib?, forCellReuseIdentifier: String)
- func register(AnyClass?, forCellReuseIdentifier: String)
- func register(UINib?, forHeaderFooterViewReuseIdentifier: String)
- func register(AnyClass?, forHeaderFooterViewReuseIdentifier: String)

最初は

```swift:
tableView.register(MyChatViewCell.self, forCellReuseIdentifier: "MyChat")
```
を利用していたが、クラッシュはしないものの、カスタムセルに追加したUIパーツが表示されず困っていた。

色々試行錯誤した結果、

```swift
tableView.register(UINib(nibName: "MyChatViewCell", bundle: nil), forCellReuseIdentifier: "MyChat")
```
とすれば正常に表示されるようになった。
同じ挙動をするメソッドだと思ったのに不思議だ。

```swift
Bundle.main.loadNibNamed("MyChatViewCell", owner: nil, options: nil) 
```
も試してみてはいたけど、うまく動作せず。。
リファレンス見ずにひたすら実装していたのでコピペでも少しは調べればよかったかなぁと。

# xib関係で役立ちそうなこと
色々サイトを見ながら実装していたけど、それでもだいぶ詰まったので誰かの役に立てればと少しメモ書き。

- xibファイルのFile's Owner にカスタムクラスを指定するという記事をみてそれで試してみたが、xibファイル内のカスタムセルにカスタムクラスを指定しても大丈夫だった。
- StoryboardのPrototypeCells にCellを追加してIdentifierを設定する方法でも、Xibファイル内のカスタムセルにIdentifierを設定する方法でも動作した

以上初投稿になります🙌
WordPressでメールの送信のユニットテスト


たとえば何らかのメールを送信する WordPress プラグインを開発する際に、WordPressの `wp_mail()` で意図した通りのメールが送信されているかどうかを、ユニットテストで確認するには以下のように `tests_retrieve_phpmailer_instance()` を使用する。

`wp_mail()` の後に `tests_retrieve_phpmailer_instance()` を実行するというのがなんだか謎だけど WordPress 本体でのユニットテストもそうなってるので間違いではないです。

```php
class WP_Multibyte_Patch_Test extends WP_UnitTestCase
{
	/**
	 * `wp_mail` should encode as expected
	 */
	public function test_wp_mail_should_be_sent_as_iso_2022_jp()
	{
		$to = 'hello@example.com';
		$subject = "こんにちは";
		$message = "日本語のメール";
	
		wp_mail( $to, $subject, $message );
	
		// テスト用のインスンタンスを作成
		$mailer = tests_retrieve_phpmailer_instance();
	
		// 送信先メールの確認
		$this->assertSame( 'hello@example.com', $mailer->get_recipient( 'to' )->address );
	
		// wp-multibyte-patchが有効化されている場合 ISO-2022-JP でエンコードされている
		$this->assertSame(
			"=?ISO-2022-JP?B?GyRCJDMkcyRLJEEkTxsoQg==?=",
			$mailer->get_sent()->subject
		);
	
		$this->assertSame(
			"こんにちは",
			iconv_mime_decode( $mailer->get_sent()->subject, 0, 'UTF-8' )
		);
	
		$this->assertSame(
			"日本語のメール\n",
			mb_convert_encoding( $mailer->get_sent()->body, 'UTF-8', 'ISO-2022-JP' )
		);
	}
}
```
RxJSでひとまとめの複数の非同期処理のうち一つでもエラーになったら他の全ての非同期処理を破棄するコードを書いた

ちきさんです。

Scalaのfor yieldみたいなことをRxJSで表現できないかと思ってやってみました。

ひとまとめの複数の非同期処理のうち、一つでもエラーになったら他の全ての非同期処理を破棄するRxJSのコードです。

デモ → http://jsbin.com/xerufem/10/edit?js,console

エラーが一つもなければ出力に `HELLO` と表示されますが、そうでなければ `(empty)` と表示されます。ランダムに結果が変わるので何回かRUNボタンを押して動作を確認してみてください。

以下、JS Binのコードに少しコメントを足したものです。

Scalaの`Some`と`None`に相当するものが`Observable.of`と`Observable.empty`になります。

```js
const Observable = Rx.Observable

// 9割の確率で成功する。
function isSuccess() {
  return Math.random() > 0.1
}

// 非同期処理。たまに失敗する。成功すると文字を大文字にして返す。
// 成功のときはObservable.of(value)を返すが、失敗のときはObservable.emptyを返す。
function httpRequest(value) {
  const promise = new Promise((resolve, reject) => {
    if (isSuccess()) {
      resolve(value.toUpperCase())
    } else {
      reject()
    }
  })
  // Observable.fromはPromiseをObservableに変換する。
  return Observable.from(promise) // resolveのときはObservable.ofを返す。
    .catch(_ => Observable.empty()) // rejectのときはObservable.emptyを返す。
}

// 複数の非同期処理をひとまとめにする。
function requests() {
  return [
    httpRequest('h'),
    httpRequest('e'),
    httpRequest('l'),
    httpRequest('l'),
    httpRequest('o'),
  ]
}

// ひとまとめの非同期処理を10回走らせる。理論上半分ぐらいは失敗する。
for (let i = 0; i < 10; i++) {
  // Observable.forkJoinはPromise.allに似た動きをするが、一つでもemptyを返すものがあるとemptyを返す。 
  Observable.forkJoin(requests())
    .map(array => array.join(''))
    .defaultIfEmpty('(empty)') // Observable.emptyのときにセットする値。
    .zip(Observable.of(i)) // ストリームに外側の変数を巻き込む。
    .map(([value, index]) => index + ': ' + value)
    .subscribe(console.log)
}
```
iRuleでHTTPリクエストに含まれる値を取得する

# このページの目的
BIG-IPのiRuleを使うと、HTTPリクエストの内容に基づいた様々な処理を書くことができますが、iRuleを書く度にDevCentralを開いて「えーと、HTTPリクエスト内のあの値をとるには・・・」と調べるのが面倒なので、まとめてみました。


# 簡易情報
例えば、以下のようなURLのリクエストをBIG-IPが受け取ったとします。

**サンプルURL**
![iRule_HTTP変数.png](https://qiita-image-store.s3.amazonaws.com/0/157891/99d1e5e6-1ccd-f3d2-4cac-cc764af2b972.png)

| コマンド | 説明 | サンプルURLを対象にした場合の値 |
|:-:|:-:|:-:|
| **[HTTP::host](https://devcentral.f5.com/wiki/iRules.HTTP__host.ashx)** | ホストヘッダの値を返します。 | www.example.com |
| **[HTTP::path](https://devcentral.f5.com/wiki/iRules.HTTP__path.ashx)** | ファイルパスを返します。注意点として、**「?」**（はてな）文字がセパレータになっているので、これがない場合は、末尾まで全てをファイルパスと認識します。 | /directory/file |
| **[HTTP::query](https://devcentral.f5.com/wiki/iRules.HTTP__query.ashx)** | URLのうち、引数部分を返します。ファイルパスとのセパレータとなっている**「?」**(はてな）は含みません。| var1=val1&var2=val2 |
| **[HTTTP::uri](https://devcentral.f5.com/wiki/iRules.HTTP__uri.ashx)** | HTTPリクエスト内のURI部分全体を返します | /directory/file?var1=val1&var2=val2 |

# （もう少し）詳細な情報
DevCentralの[HTTP](https://devcentral.f5.com/wiki/iRules.HTTP.ashx)の項から、HTTPリクエストを対象に情報を取得できる変数をまとめてみました。上で記載したものは除外してます。あと、あまり利用頻度が高くなさそうなものも省きました。

| コマンド | 説明 |
|:-:|:-:|
| **[HTTP::cookie](https://devcentral.f5.com/wiki/iRules.HTTP__cookie.ashx)** | **"HTTP::cookie \<name\>"**で、任意の名前のHTTP Cookieの値を応答します。  **"HTTP cookie count"**で、HTTPリクエストに含まれるcookieの数を応答します。| 
| **[HTTP::header](https://devcentral.f5.com/wiki/iRules.HTTP__header.ashx)** | **"HTTP::header \<name\>"**で、任意のHTTPヘッダーの値を応答します。対象のHTTPヘッダがHTTPリクエスト中に存在しない場合は、nullが返ります。  **"HTTP::header names"**で、すべてのHTTPヘッダ名をList型で返します。  **"HTTP::header count \<name\>"**で、任意のHTTPヘッダーがHTTPリクエストに含まれている数を応答します。  **"HTTP::header exists \<name\>"**で、任意のHTTPヘッダーがHTTPリクエストに含まれている場合Trueを応答します。|
| **[HTTP::is_keepalive](https://devcentral.f5.com/wiki/iRules.HTTP__is_keepalive.ashx)** | HTTP Keep-Aliveが有効なHTTPリクエストの場合は、Trueを返します。|
| **[HTTP::method](https://devcentral.f5.com/wiki/iRules.HTTP__method.ashx)** | HTTPリクエストのメソッドを応答します。|
| **[HTTP::password](https://devcentral.f5.com/wiki/iRules.HTTP__password.ashx)** | Basic認証のリクエストに含まれる、パスワードの値を応答します。|
| **[HTTP::request](https://devcentral.f5.com/wiki/iRules.HTTP__request.ashx)** | HTTPリクエストのヘッダー部を文字列として応答します。|
| **[HTTP::request_num](https://devcentral.f5.com/wiki/iRules.HTTP__request_num.ashx)** | 同一TCPコネクション内のHTTPトランザクション数を応答します。|
| **[HTTP::username](https://devcentral.f5.com/wiki/iRules.HTTP__username.ashx)** | Basic認証のリクエストに含まれる、ユーザ名を応答します。|
| **[HTTP::version](https://devcentral.f5.com/wiki/iRules.HTTP__version.ashx)** |HTTPリクストのHTTPバージョンを応答します。|

# 補足：HTTPリクエストのBody部を取得したい場合
**[HTTP::collect](https://devcentral.f5.com/wiki/iRules.HTTP__collect.ashx)**を使用してBody部を取得し、**[ HTTP_REQUEST_DATA](https://devcentral.f5.com/wiki/iRules.HTTP_REQUEST_DATA.ashx)**イベントを使う必要があります。

# 参考URL（DevCentral)
- [Wiki: iRules API:HTTP](https://devcentral.f5.com/wiki/iRules.HTTP.ashx)

# 免責事項
本ページの内容に誤り等があり、参考にされた方がなんらかの損害を被った場合、一切の責任は負いません。
正規表現の \w, \d で実際に検出できる文字を探してみた。

```csharp
using System.Linq;

static class Program
{
    static System.Collections.Generic.IEnumerable<char> charlist(string pattern)
    {
        var c = (char)0;
        do
        {
            if (System.Text.RegularExpressions.Regex.IsMatch("" + c, pattern))
            yield return c;
        } while (++c != 0);
    }

    static void Main(string[] args)
    {
        var digits = charlist(@"\d").ToArray();

        System.Diagnostics.Debug.WriteLine(string.Format("{0} chars.", digits.Length));
        System.Diagnostics.Debug.WriteLine(string.Join(",", digits));

        var wordchars = charlist(@"\w").ToArray();

        System.Diagnostics.Debug.WriteLine(string.Format("{0} chars.", wordchars.Length));
        System.Diagnostics.Debug.WriteLine(string.Join(",", wordchars));
    }
}
```

```
370 chars.
0,1,2,3,4,5,6,7,8,9,٠,١,٢,٣,٤,٥,٦,٧,٨,٩,۰,۱,۲,۳,۴,۵,۶,۷,۸,۹,߀,߁,߂,߃,߄,߅,߆,߇,߈,߉,०,१,२,३,४,५,६,७,८,९,০,১,২,৩,৪,৫,৬,৭,৮,৯,੦,੧,੨,੩,੪,੫,੬,੭,੮,੯,૦,૧,૨,૩,૪,૫,૬,૭,૮,૯,୦,୧,୨,୩,୪,୫,୬,୭,୮,୯,௦,௧,௨,௩,௪,௫,௬,௭,௮,௯,౦,౧,౨,౩,౪,౫,౬,౭,౮,౯,೦,೧,೨,೩,೪,೫,೬,೭,೮,೯,൦,൧,൨,൩,൪,൫,൬,൭,൮,൯,෦,෧,෨,෩,෪,෫,෬,෭,෮,෯,๐,๑,๒,๓,๔,๕,๖,๗,๘,๙,໐,໑,໒,໓,໔,໕,໖,໗,໘,໙,༠,༡,༢,༣,༤,༥,༦,༧,༨,༩,၀,၁,၂,၃,၄,၅,၆,၇,၈,၉,႐,႑,႒,႓,႔,႕,႖,႗,႘,႙,០,១,២,៣,៤,៥,៦,៧,៨,៩,᠐,᠑,᠒,᠓,᠔,᠕,᠖,᠗,᠘,᠙,᥆,᥇,᥈,᥉,᥊,᥋,᥌,᥍,᥎,᥏,᧐,᧑,᧒,᧓,᧔,᧕,᧖,᧗,᧘,᧙,᪀,᪁,᪂,᪃,᪄,᪅,᪆,᪇,᪈,᪉,᪐,᪑,᪒,᪓,᪔,᪕,᪖,᪗,᪘,᪙,᭐,᭑,᭒,᭓,᭔,᭕,᭖,᭗,᭘,᭙,᮰,᮱,᮲,᮳,᮴,᮵,᮶,᮷,᮸,᮹,᱀,᱁,᱂,᱃,᱄,᱅,᱆,᱇,᱈,᱉,᱐,᱑,᱒,᱓,᱔,᱕,᱖,᱗,᱘,᱙,꘠,꘡,꘢,꘣,꘤,꘥,꘦,꘧,꘨,꘩,꣐,꣑,꣒,꣓,꣔,꣕,꣖,꣗,꣘,꣙,꤀,꤁,꤂,꤃,꤄,꤅,꤆,꤇,꤈,꤉,꧐,꧑,꧒,꧓,꧔,꧕,꧖,꧗,꧘,꧙,꧰,꧱,꧲,꧳,꧴,꧵,꧶,꧷,꧸,꧹,꩐,꩑,꩒,꩓,꩔,꩕,꩖,꩗,꩘,꩙,꯰,꯱,꯲,꯳,꯴,꯵,꯶,꯷,꯸,꯹,０,１,２,３,４,５,６,７,８,９
50086 chars.
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,---割愛---
プログラム '[9276] ConsoleApp1.exe' はコード 0 (0x0) で終了しました。
```

"\w" は "[_0-9a-zA-Z]" 相当だと思っていたので、ちょっとびっくり。
SpringBoot + JPA + Thymeleafで簡単なCRUDを作る④～エラーメッセージのカスタマイズ～

## 内容

- [前回(Java版)](https://qiita.com/ozaki25/items/49fb8c876c93611e228d)、[前回(Kotlin版)](https://qiita.com/ozaki25/items/c4ea7af5a93909826478)の続き
- SpringBootで簡単なCRUDアプリを作る
- 今回はバリデーションエラー時のメッセージをカスタマイズする
    - 現状はデフォルトで用意されている英語のメッセージが出ている

<img width="717" alt="スクリーンショット 2017-10-26 0.31.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/0bbde10a-5770-8864-aca5-81af9a1aa04c.png">

## 手順

- 設定ファイルを作成しメッセージを定義する

### 設定ファイルを作成しメッセージを定義する

- `ValidationMessage.properties`というファイル名でメッセージの定義を作成するとSpringが勝手にこの内容を使ってくれる
- `src/main/resources`に`ValidationMessages.properties`を作成する

```properties:src/main/resources/ValidationMessages.properties
org.hibernate.validator.constraints.NotEmpty.message=必須項目です
javax.validation.constraints.NotNull.message=必須項目です
javax.validation.constraints.Max.message={value} 以下にして下さい
javax.validation.constraints.Min.message={value} 以上にして下さい
javax.validation.constraints.Size.message={min} 文字以上 {max} 文字以下にして下さい
```

- Eclipseでそのまま日本語を入れると画面を表示した時に文字化けしてしまうことがある
- そういう時はプロパティーエディターというプラグインを入れると解消する

<img width="647" alt="スクリーンショット 2017-10-26 0.39.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/f8384536-9740-4a8b-199e-1eac81eb37f9.png">

- デフォルトのエラーメッセージ一覧はここ
    - https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/resources/org/hibernate/validator/ValidationMessages.properties

## 動作確認

- うまく適用されるとこのようなイメージ

<img width="719" alt="スクリーンショット 2017-10-26 0.47.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/1d47bd08-b787-517d-3303-0cde4030c89f.png">
<img width="717" alt="スクリーンショット 2017-10-26 0.47.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/175213/c9e24e94-7b2d-9849-c840-bce1f5e43370.png">

## 次回

- 次回は[こちら](https://qiita.com/ozaki25/items/cf4d2f77e62a0faec93f)
Reduxで、reducer内でstateを書き換えると怒られる話

# 初めに

こんな感じでreduxのreducerを書いたら何故かexceptionが吐かれてとても悩んだ。

```javascript
export default (state: State = INITIAL_STATE, action: ActionType): State => {
  switch (action.type) {
    case MY_ACTION_NAME: {
      const current = state.handlingData;
      action.dataArray.forEach((d) => {
        current[d.key] = d.data;
      });
      return {
        ...state,
        handlingData: current,
      };
    }
    default:
      return state;
  }
};

```

エラーメッセージはこんな感じ ↓

```
YellowBox.js:78 Possible Unhandled Promise Rejection (id: 0):
Invariant Violation: A state mutation was detected inside a dispatch, in the path:  (state名)
```

# 原因
realmを使っていたり非同期にしていたりするせいで何かよくわからないところで変なエラーが起きているんじゃないか、とか余計なことを考えて的外れな調査をしてしまい時間がかかったが、何てことはない。
メッセージ通り、以下のようにreducer内でstateを書き換えていたのが原因だった。

```javascript
      const current = state.handlingData;
      action.dataArray.forEach((d) => {
        current[d.key] = d.data; // ← currentがstateの一部なのでこれで書き換わっている
      });

```

ちなみに、console内に出力されるエラーメッセージに以下のリンクが貼られていたお陰で気付くことができた。

http://redux.js.org/docs/Troubleshooting.html#never-mutate-reducer-arguments

# 対策
上記の部分を以下のように書き換えたら直った。

```javascript
      const current = { ...state.handlingData };
      action.dataArray.forEach((d) => {
        current[d.key] = d.data;
      });
```

# 終わりに

* 気を付けよう。
* 公式リファレンスは役に立つ。
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第七章 言語を使用する:応用例3

[その１](https://qiita.com/YasuhiroKimesawa/items/c138a5eee50da59cdfd8) / [その２](https://qiita.com/YasuhiroKimesawa/items/c823e79b86641a4254b3)　の続きです。（風邪やら出張やらなんやらで久々の投稿><;)

# リポジトリを選択する
[リポジトリその1](https://qiita.com/YasuhiroKimesawa/items/54a2adbc79bfc062e3f4) / [その２](https://qiita.com/YasuhiroKimesawa/items/713d79b196424103ba62) / [その３](https://qiita.com/YasuhiroKimesawa/items/30191b32e8603f14a2b0) / [その４](https://qiita.com/YasuhiroKimesawa/items/23e8d72668c5b6ffaab6)

リポジトリは集約が持つことができるが、その中で実際にもつものを決めるためには、

> アプリケーションの要求に立ち返らなければならない(第二部第七章より)

書籍の例では、予約アプリケーションで予約を取るために、荷受人、荷送人などの役割を選択する必要があり、顧客リポジトリが必要になる。。。など

# シナリオをウォークスルーする

[その１](https://qiita.com/YasuhiroKimesawa/items/c138a5eee50da59cdfd8)、 [その２](https://qiita.com/YasuhiroKimesawa/items/c823e79b86641a4254b3)、今回と見てきた内容を決定をチェックするためにシナリオを確認する。

ユースケースや、ユーザーストーリを確認しながら、エンティティ・値オブジェクトの選択などが問題ないか見ていきます。

# オブジェクトの生成
[ファクトリその1](https://qiita.com/YasuhiroKimesawa/items/f6fc33a46709cc0abe39)/[その２](https://qiita.com/YasuhiroKimesawa/items/c9e0cdb52f02d03a8a86)/[その３](https://qiita.com/YasuhiroKimesawa/items/dfd8b7ef451d247475b6)

ここでは、荷役イベントを抽象クラスにして、荷積みイベント・荷下ろしイベントなどの各イベントごとに実装クラスを作る例が上げられている。

また、循環参照などの解消の仕方などもあるのが参考になりますね。

# [モジュール](https://qiita.com/YasuhiroKimesawa/items/67d73bca7da60ff01ad8)

ここでは、モジュールの悪い例として、「エンティティモジュール」「値オブジェクトモジュール」とかに分けてしまう例が挙げられています。

ではなく、「顧客モジュール」「請求モジュール」「輸送モジュール」というドメインの概念に基づいたモジュールに分ける事が大事。
そうすることによって

**「顧客」への「輸送」を行っており、したがって「請求」できる。営業販売の担当社員が「顧客」に対応して、合意を取り付ける。営業部門が「輸送」を行い、・・・**

といった**ストーリーを語ること**ができる

明日に続きます。
マス目を歩く


気負うことなくさっくりと.


```tyama_henaf07.rb
#!/usr/bin/env ruby
#http://nabetani.sakura.ne.jp/hena/ordf07walk/
#https://qiita.com/Nabetani/items/cf93b63acc8a313c88bb
STDOUT.sync=true

while gets
	a=$_.chomp.split('/').map{|e|e.chars.map(&:to_i)}
	q=[[2,0]]
	z={q[0]=>0}
	while !q.empty?
		cx,cy=q.shift
		[[-1,0],[0,-1],[1,0],[0,1]].each{|dx,dy|
			nx,ny=cx+dx,cy+dy
			if 0<=nx&&nx<a[0].size && 0<=ny&&ny<a.size && !z[[nx,ny]] && (a[cy][cx]-a[ny][nx]).abs<=1
				z[[nx,ny]]=z[[cx,cy]]+1
				q<<[nx,ny]
			end
		}
		a[cy][cx]='*'
	end
	puts a.map(&:join)*'/'
end
```
既存のVue.jsアプリにQuasar Frameworkを入れる

Vue.jsを使ってリッチなアプリを作るのにスタイル組むのは面倒なのでいい感じに作れるものないかなと思ったら、[Quasar Framework](http://quasar-framework.org/)を教えてもらいました！

# Quasar Frameworkとは？
なんか、レスポンシブなウェブサイトとかPWAとかネイティブアプリ風のものが作れたりElectronアプリを作れるみたいです。

[awesome-vue](https://github.com/vuejs/awesome-vue)にはUI的な部分に並んでます。

## Getting Started

Componentsのページを眺めて、めっちゃこれいいじゃん！と思ったので使ってみようと思いました。
Getting Startedのページを見るとFirst Stepsには…。

```shell-session
# installing Quasar CLI
$ npm install -g quasar-cli
```

どうやら、Quasar CLIなるものを入れるらしいです。
でも自分は既存のものにQuasar Frameworkを入れたいんだ！となったので入れませんでした。

※ Quasar CLI入れないと動かないとかそういうのあるかもしれないですが、一旦知りません。詳しい人書いて！

# 既存のVue.jsアプリに入れる

```
$ vue init webpack myapp
```

のようにinitしたプロジェクトを参考に書いてきます！


## Quasar Frameworkのインストール

```
$ yarn add quasar-framework
$ yarn add quasar-extras # icons使わないなら入れなくてもOK!
```

インストールしたら、`src/main.js` に色々追加。この辺はquasar-cliのテンプレートを見るとわかります。
[quasarframework/quasar-template-default](https://github.com/quasarframework/quasar-template-default)

```js:src/main.js
import Quasar, * as All from 'quasar-framework'

// ios風のデザインなら quasar.ios.css
// マテリアルデザイン風なら quasar.mat.cssを読み込む
import 'quasar-framework/dist/quasar.ios.css'
//import 'quasar-framework/dist/quasar.mat.css'

// iconもいろいろ選べる
import 'quasar-extras/material-icons'
// import 'quasar-extras/ionicons'
// import 'quasar-extras/fontawesome'

// アニメーションのときに使うみたいです。
import 'quasar-extras/animate'

// すべてのコンポーネントを使いたいのでこうしてます
Vue.use(Quasar, {
  components: All,
  directives: All
})
```

## 使ってみる
あとは何も悩むことはありません。[Componentsのページ](http://quasar-framework.org/components/)から使いたいコンポーネントを選ぶのです！

今回はボタンを使ってみます。

```html
<template lang="html">
  <div>
    <q-btn icon="create" color="secondary">さくせす！</q-btn>
  </div>
</template>

<script>
export default {
}
</script>

<style lang="css">
</style>
```

## さくせす！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62429/0a793a62-1cbb-7126-7f9d-0cf71c18e308.png)
Azure FunctionsとEvent WebhookでSendGridのメール配信状況をチェックする


Azure FunctionsのSendGridバインディングで、特にライブラリをインストールせずとも[簡単にメールを配信できます](https://qiita.com/sato_ryu/items/30267d709d42b1d69aa4)。

しかし、配信リクエストが正しく送れたとしても、その後にどうなるかは気にする必要があります。例えば、

* SendGridから送信先のメールに配送されたのか
* メールは開封されたのか
* そして開封されたメールに記載してあるリンクはクリックしてもらえたのか
* そもそもメールは途中のメールサーバーで拒否されていないか
* 届いたけれどもスパムとして扱われていないか

などといったことを気にしないといけません。SendGridは、それを確認するための[Activity機能](https://app.sendgrid.com/email_activity?)を提供しています。
これは大変便利なのですが、画面の応答が遅く、複数人でこの画面を見ているとエラーになったりします。

# Event Webhook

「この情報を自分たちのシステムに持っておきたい！」と思う人のために、SendGridは[Event Webhook](https://sendgrid.com/docs/API_Reference/Webhooks/event.html)を提供しています。これは、各メールの配送状況を指定したWebhookのエンドポイントに情報を送ってくれる機能です。

![](https://sendgrid.com/docs/images/event_1.jpg)
> [Event Webhook](https://sendgrid.com/docs/API_Reference/Webhooks/event.html) より

メールの配送リクエストを受け付けた後のそれぞれの状態について、それら固有の情報をJSONとして、登録したWebhookのエンドポイントに送信してくれます。


# Azure Functions でWebhookのエンドポイントを実装

Webhook とくれば、Azure Functions のHttpトリガーの出番です！ということで、試しに作ってみました。

このサンプルは、メールが期待どおりに届かなかった場合にHipChatの指定したルームに通知をしてくれるFunctionです。

```SendGridWebhook/index.js
var Hipchatter = require('hipchatter');
var hipchatter = new Hipchatter(process.env.HIPCHAT_ROOM_TOKEN)

function notifyToRoom(event, context)
{
    event.timestamp = new Date(event.timestamp * 1000);
    var options = {
        message: `/code ${JSON.stringify(event, null, '  ')}`,
        message_format: 'text'
    };

    switch (event.event) {
        case 'bounce':
        case 'deferred':
        case 'dropped':
        case 'spamreport':
        case 'unsubscribe':
            options.color = 'red';
            options.notify = true;
        break;
        case 'delivered':
        case 'open':
        case 'click':
            options.color = 'green';
        break;
        default:
            options.color = 'gray';
        break;
    }

    hipchatter.notify(process.env.HIPCHAT_ROOM_ID, options,
        function (err) {
            if (err)
                context.log.error(err);
        }
    );
}

module.exports = function (context, req) {
    var events = req.body;

    if (!events) {
        context.log.error(`unexpected body: ${req.body}`);
        return;
    }

    events.forEach(function(event) {
        notifyToRoom(event, context);
        context.log(event);
    }, this);

    context.res = { status: 200, body: '' }
    context.done();
};
```

実際の通知はこんな感じです。ちゃんと配送された場合は緑で、何かしら問題があった場合は赤く通知が届くようになっています。

![Screen Shot 2017-10-26 at 0.08.41.png](https://qiita-image-store.s3.amazonaws.com/0/3662/65c48add-557f-9f76-a5be-9a6f48019c85.png "Screen Shot 2017-10-26 at 0.08.41.png")

今回は配送状況を知りたいだけだったので通知にしました。他にも応用として、

* メール開封、クリックを含めてコンバージョンを計測したい。
* メールが配送できなかった場合に、ユーザーの情報にフラグを立てたい。

といったことも出来そうです。

それでは楽しいメールライフを < ⚡ > 

# 参考

* [Azure Function からSendGridバインドを使ってメールを送る - Qiita](https://qiita.com/sato_ryu/items/30267d709d42b1d69aa4)
* [Event Webhook - SendGrid Documentation | SendGrid](https://sendgrid.com/docs/API_Reference/Webhooks/event.html)
Pandocを使ってMarkdownからLatexによるPDF生成をする

Latexを使うとフリーで綺麗な組版ができる．しかし，レポートのような作成頻度が高く，フォーマットが固定されている文章を毎回書くのは面倒だ．[Pandoc](https://pandoc.org/)はmarkdownとlatexの相互変換をサポートしてくれる．なおかつlatexのコンパイル環境が整って入れば直接PDFを生成してくれる．

PandocがサポートしているMarkdown記法はドキュメントで説明されているが，よく使われそうな記述を網羅したサンプルがあれば便利かもしれない．そこでレポートのサンプルを作ってみた：

[https://github.com/kzmssk/pandoc_report](https://github.com/kzmssk/pandoc_report)

以下はこのレポジトリの中身の説明．

Markdownの元ファイルは以下のようになっているとしよう：


```markdown:report.md

---
title: Title of report
author: Tanuki Kitsune
date: 2017.1.1
...

# First section

This is an example report content.

## How to include images

Including png image:

![Example of png image\label{fig:png_sample}](images/example.png){ width=10cm }

Including pdf image:

![Example of pdf image\label{fig:pdf_sample}](images/example.pdf){ width=10cm }

You can use tex reference like Figure \ref{fig:png_sample} and \ref{fig:pdf_sample}

## Citation

You can cite an article like [@Krizhevsky2012]

## First sub-section

You can put a list of items using itemize:

* Monday
* Tuesday
* Wednesday
* Thursday
* Friday
* Saturday
* Sunday

Or, numbering:

1. Totato
2. Carrot
3. Onion

## Other expressions

* Italic*
* _Italic2_
* **bold**
* __bold2__


## Quotation

> Quotation

## URL

URL: [www.waseda.jp](https://www.waseda.jp)

## Table

Table:

|  A  |  B  |  C  |
| --- | --- | --- |
|  22  |  99  |  128  |

## Math expressions

Formula:

$$
\frac{\partial^2 p}{\partial t^2} = c^2 \nabla^2 p
$$

\begin{eqnarray}
  2x_1 + x_2 & = & 5 \\
    2x_2 & = & 2
\end{eqnarray}

## Source code

\```test.py
t = np.arange(0, np.pi*4)
plt.plot(t, np.sin(t))
\```
You can put source code

# References
```

*注）souce codeの部分はエスケープがうまくできなかったのでバックスラッシュが入っているが，本来は不要*

一番上にあるのはYAMLデータブロックと呼ばれるもので，Latexに変換される場合には`title`, `author`, `date`に割り当てられるようだ．markdownと言いつつも図・数式や相互参照についてはLatex表記が使える．このファイルをPandocを使って変換するコマンドを毎回打つのは面倒なのでGNU Makeにまかせることにする：

```Makefile
SOURCE = report.md
TARGET = report.pdf

all:
	pandoc $(SOURCE) \
		-o output/$(TARGET) \
		-H style/preamble.tex \
		-V fontsize=12pt \
		-V papersize=a4paper \
		-V documentclass:article \
		--bibliography mybib.bib \
		--csl style/ieee-with-url.csl \
		-N

```

こうすれば`make`とすれば`output`ディレクトリの下にPDFファイルが生成される．この生成はLatexを通していて，フォーマットはPandocのコマンドオプションの他にヘッダーファイルとしてTexファイルを指定できる：

```latex:preable.tex
\usepackage{amsmath,amssymb}
\usepackage{bm}
\usepackage{setspace}
\usepackage[margin=3.0cm]{geometry}
\usepackage{color}
\usepackage{url}
\usepackage{here}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{fancyvrb}
\usepackage{graphicx}
```

参考文献に関してはbibtexが使える．CSLファイルで文献の表示スタイルを指定できる．
【Git編その１】cakephp3でwebサービスを開発してみる

折角なので、githubでソースコードを管理してみようと思います。

githubは全文、英語なのでわかりづらいですよね。その気持ち、わかります。
今回は、githubを使用するのに必要なソフトやプッシュするまでの手順をまとめてみました。
やることは２つです。
**1. githubのアカウントを作成して、リモートリポジトリを作成**
**2. eclipseのインストールとcakephpのインポート**
####１、githubのアカウントを作成して、リモートリポジトリを作成
![a.png](https://qiita-image-store.s3.amazonaws.com/0/208802/86751e80-21a5-9284-e0ae-8213212f9b72.png)
こんな感じで表示されます。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/208802/c0904b7b-b88e-60c4-ec2d-04afe2a51dac.png)
####２、eclipseのインストールとcakephpのインポート
eclipseのインストールと初期設定は割愛します。
ごめんなさい。また、どこかで復習も兼ねて書きます。
とりあえず、[こちら](http://ts0818.hatenablog.com/entry/2016/02/28/223647)を参考にして頂ければよいかと。
最新版でphpのフルバージョンをインストールしておけば、間違いはないかと思います。
続いて、[前回](https://qiita.com/naska/items/1e8008e992ccacbe7367)デスクトップにインストールしたcakephpをeclipseにインポートします。
方法は、画像の左上にある**cake3phpファイル**を**eclipse**の**プロジェクト・エクスプローラー**に**ドラッグ&ドロップ**するだけです。
※これでうまくいかない場合は、
eclipseのファイル→新規→phpプロジェクト→**内容欄の既存ロケーションにプロジェクトを作成**にチェック。→デスクトップにあるcakephpアプリを選択→完了をクリック
を試してみてください。　
エラーというか、警告が表示されていますが気にしなくて大丈夫です。
なんで出るかも今度、調査したいと思います。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/208802/6891321d-b37f-d036-9ec5-e16983f60e9b.png)

本日は、ここまで。
明日、
**eclipseでローカルリポジトリを作成してgihubにpush。**
**eclipseの初期設定**
を書いていく予定です。
※ご意見、ご要望があればコメントください。
ifBOOOOON!!!!

こんばんは。timperです。
今日はif文の勉強をしました。ifということで、もしもあの時こうしていれば、もしもこんな環境に生まれていたら…みたいなことを考えてしまいますね。もしも東京で生まれていたら…ペルソナライブに気軽に行ける、、、みたいな。

それは置いといて

if else文を使うと

 #include <iostream>
using namespace std;

int main()
{

	int res;
	cout << "もし味方になれば世界の半分をおまえにやろう\n";
	cout << "1:はい\n1以外:いいえ\n";
	cin >> res;

	if (res == 1)
	{
		cout << "GAMEOVER\n";
		
	}
	else {
		cout << "どうした？世界の半分をほしくはないのか？悪い話ではあるまい。\n";
	}
	cin.get();
	cin.get();

	return 0;
}
みたいな感じで２択の設問とか作れますね。
「本当は１以外」のところ2にしたかったのですが、時間がなくなったのでまた明日にでも修正しようと思います。あと投稿する時プログラミングのところが地の文とうまく区別されてないですね、、、
要勉強。
VeeValidateを使ってみる

Original: [VeeValidateを使ってみる \| tail \-f pinzo\.log](https://pinzolo.github.io/2017/10/25/vee-validate-regex-and-ja-locale.html)

Vue.js アプリケーションのバリデーションに [baianat/vee\-validate: Simple Vue\.js input validation plugin](https://github.com/baianat/vee-validate) を使ってみた。いくつかはまったこと。

## name

`name` 属性、もしくは `data-vv-name` 属性がないとフィールドが特定できない。

## 正規表現

```html
<input type="text"
       name="tel"
       placeholder="03-1234-5678"
       v-model="tel"
       v-validate="'regex:^0[1-9][0-9]{0,4}-[0-9]{1,5}-[0-9]{1,5}$'">
```

このように書くと `SyntaxError: Invalid flags supplied to RegExp constructor '4}-[0-9]{1,5}-[0-9]{1,5}$'` というエラーが出る。

[Regex error · Issue \#223 · baianat/vee\-validate](https://github.com/baianat/vee-validate/issues/223)
によるとこの形式ではパイプやカンマを含む正規表現は動かないらしい。

```html
<input type="text"
       name="tel"
       placeholder="03-1234-5678"
       v-model="tel"
       v-validate="{ regex: /^0[1-9][0-9]{0,4}-[0-9]{1,5}-[0-9]{1,5}$/ }">
```

のようにオブジェクトで書けばよい。また、正規表現オブジェクトではなく文字列でもよい。

## メッセージの日本語化

```js
Vue.use(VeeValidate, { locale: 'ja' })
```

これだけだと `You are setting the validator locale to a locale that is not defined in the dictionary. English messages may still be generated.` と警告がでて英語のメッセージになる。

```js
import VeeValidate from 'vee-validate'
import VeeValidateJaLocale from 'vee-validate/dist/locale/ja'

VeeValidate.Validator.addLocale(VeeValidateJaLocale)
Vue.use(VeeValidate, { locale: 'ja' })
```

としてやる必要がある。

フィールド名を日本語化するには `data-vv-as` 属性を使う。

```html
<input type="text"
       name="tel"
       placeholder="03-1234-5678"
       data-vv-as="電話番号"
       v-model="tel"
       v-validate="{ regex: /^0[1-9][0-9]{0,4}-[0-9]{1,5}-[0-9]{1,5}$/ }">
```

こんな感じ。
むりやり型変換

何らかの事情で全く異なる型の間の変換をする方法です。

unsafe です。


```go
package main

import (
	"fmt"
	"unsafe"
)

func main() {
	aa := []bool{true, false, true}

	//bb := ([]int8)(aa)
	//cannot convert aa (type []bool) to type []int8

	bb := *(*[]int8)(unsafe.Pointer(&aa))

	fmt.Printf("aa=%#v, bb=%#v\n", aa, bb) //aa=[]bool{true, false, true}, bb=[]int8{1, 0, 1}
}
```
https://play.golang.org/p/106qikGMB6

普通は使うものではありませんが、参考までに。
AWS Lambda, .Net Core(C#)をローカル環境で実行する

# はじめに

AWS LambdaをC#で操作できるの面白いのですが、もっとローカルでデバッグしたいとき、シンプルに設定する必要があったので整理しました。

## 実行環境

- Visual Studio Community 2017 Version 15.4.0
- AWS Toolkit for Visual Studio 2017, 1.12.2.1

# ローカル実行できる用に設定する

## 依存関係(NuGetで追加)

こちらを追加

- Amazon.Lambda.TestUtilities

## AWSLambda.csproj にプロパティを追加

```diff:AWSLambda.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp1.0</TargetFramework>
+   <NetStandardImplicitPackageVersion>1.6.0</NetStandardImplicitPackageVersion>
+   <OutputType>Exe</OutputType>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Amazon.Lambda.Core" Version="1.0.0" />
    <PackageReference Include="Amazon.Lambda.Serialization.Json" Version="1.1.0" />
  </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="Amazon.Lambda.Tools" Version="1.8.0" />
  </ItemGroup>

</Project>
```

- `NetStandardImplicitPackageVersion` : NetStandardのパッケージバージョンを1.6.0までに制限する(※AWS Lambdaの.Net Coreは1.0まで。NetStandardの1.6.1だと.Net Coreは1.0では使えない。
- `OutputType`: 出力するファイルを、実行形式で保存する

## Function.csにmainを追加する

```diff:Function.cs
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Threading.Tasks;

  using Amazon.Lambda.Core;
+ using Amazon.Lambda.TestUtilities;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace AWSLambda20171025_2330
{
    public class Function
    {
+       static void Main(string[] args)
+       {
+           // Invoke the lambda function and confirm the string was upper cased.
+           var function = new Function();
+           var context = new TestLambdaContext();
+           var upperCase = function.FunctionHandler("hello world", context);
+        }
        
        /// <summary>
        /// A simple function that takes a string and does a ToUpper
        /// </summary>
        /// <param name="input"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public string FunctionHandler(string input, ILambdaContext context)
        {
            return input?.ToUpper();
        }
    }
}
```


# 参考
- [project.json プロパティと csproj プロパティの間のマッピング](https://docs.microsoft.com/ja-jp/dotnet/core/tools/project-json-to-csproj)

# おわりに
ようやくAWS Lambdaの開発ができる……。
ISUCON7予選に参加してきました

# はじめに

- [株式会社エイチームライフスタイル](http://life.a-tm.co.jp/)のメンバーでISUCON7予選に参戦してきたのでそのレポートを書きました。
    - チーム名：ぶっちぎり
    - メンバー：@chimame, @tsutorm, @ihsiek 
- 会社にバックアップしてもらってよい経験をできた反面、とても悔しかったので悔しい思いに溢れたエントリになっている点はご容赦ください:wink:
- @ihsiek がインフラでやったことに終始するので、他は@chimame, @tsutormがまとめてくれるはず。

# 参加の背景

- @chimame がFacebookで ```今の会社なら特にインフラメンバーが素晴らしいので出ても悪くないと思うのですよ。```と発言したのがきっかけ。これが9/4/2017の話。
- 最初は個人的に組んで参加しようと思っていた発言を弊社CTOが拾って社内メンバーに呼びかけ、9人集まったので3チーム結成。
- CTOからCEOに伝わり、全社MTGで発表される。思った以上に大事になったとかなり焦る:fearful:
    - 過去問を使った模擬戦環境の構築費用やらオフィス間移動の交通費を会社が負担してくれることに:relaxed:
    - 会社の看板を背負ったという意味で負けられない戦いに:triumph:
- 9/15/2017以降、毎週金曜日に[社内制度](http://www.a-tm.co.jp/news/corporate-3553/)を使って過去問による模擬戦を実施。
    - 模擬戦1回目の結果は散々、過去の振り返り記事で要点を押さえて新たな問題に挑む日々
    - 間違いなく地力は上がった

# 予選結果

- ```fail	49,782	ぶっちぎり```
    - failになったのは再起動時のスクリプトの準備を失敗したせい
    - ぶっちぎりどころかfailになった。くやしい:confounded:

# 役割

- @chimame アプリ
- @tsutorm アプリ＋インフラ＋DBチューニング
- @ihsiek インフラ

# @ihsiek がやったこと

- 意外と緊張していたようでやることが頭から飛ぶ(開始5分間)
- あらかじめ用意した初期化スクリプトを実施
    - 公開鍵設置
    - ツールのインストール
    - mysqldump
- こちらもあらかじめ用意していたAnsibleの実行
    - sysctl.confのチューニング
    - ファイルディスクリプタの最大数拡張
    - rbenv, redis, alpのインストール
    - 普段の開発環境に合わせた設定ファイルの設置(.vimrc, .gitconfigなど)
- アプリの挙動をざっと確認してベンチマーカーを実行
- 他メンバーがRubyに切り替える準備に入ったのでログを見ながらチューニングへ
- Nginxのproxy_cache_pathをtmpfs上へ変更
- Nginxでgzip_staticを設定し、/home/isucon/isubata/webapp/public以下をgzip圧縮
- Rubyの切り替え準備ができたのでNginxの向き先を変更
- /home/isucon/isubata/webapp/publicをtmpfs上へ移動
- 1時間半経過時点で、15,000点くらい・・・だったと思う
- alpにより、icons以下の画像が10秒でtimeoutしていることを把握
- icons以下の画像はあらかじめ @chimame がファイルに吐き出してくれてたし、レギュレーションにあった304で返すしかないなと思い、キャッシュを設定  

```nginx
    expires 3s;  
    add_header Pragma public;  
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    etag off;
```

- expiresが3秒なのはたまたまベンチの結果が一番良くなったからで、根拠はなかった。本当はもっと長く設定すべきだった。
- このあたりで49,782に到達
- @tsutorm が帯域を使い切っていると分析。頭打ちということで、ダイレクトサーバリターンによる複数台構成を検討し始める。
    - このときレギュレーションをちゃんと読み込んで、ベンチマーカーに複数台設定できることを把握していれば次のステップに進めていたのだが・・・:pensive:
- @tsutorm がダイレクトサーバリターンを調査している間に、@chimame とともにインフラとアプリを複数台構成にできるよう変更。
- 残り1時間を切ったタイミングでサーバ再起動をかけると、アプリが動作しなくなることを確認。
    - この時点で再起動後のベンチが動かないとfailになるというレギュレーションを把握できていなかった。
    - tmpfs使ってるからそうだよなと思いつつ、init.dにスクリプトを書いてみる
    - もちろん動かなくて涙目:sob:
- systemdの記述に書き換えようとして時間が足りず・・・ということで、最大の戦犯は私でした:scream:
- ダイレクトサーバリターンのほうもツールにバグがあってうまくいかなかったようで、そのままタイムアップを迎えてしまいました。

# 反省

- レギュレーションの読み込みが甘かったことが最大の敗因。
- 上位入賞チームはベンチマーカーの挙動から出題者の想定を見抜くことをやっていたので、競プロ勢との経験の差を痛感した。

# よかったこと

- 過去問対策も含め、普段の業務と異なる仕組みに触れられたのは得るものが多く、正直いいことしかなかった。
    - 今まで持ってなかった武器が増えた
    - 足りない武器も見えた
    - ISUCON常連に喰らい付ける手ごたえを得た
- 最高のチームで現時点で最高の仕事ができた。@chimame, @tsutorm とまたISUCONやりたい。
- 最後まで予選突破を目指して走り続けられた。
    - 予選突破できない高得点を目指すくらいならfailになってもいいというのがチームの共通認識だった。
    - 最後まで心折れず、勝ちに拘れたのはうちのチームのいいところ。

# 最後に

- 運営メンバーの皆さん、いろいろな苦労があったと思いますがありがとうございました。
- 会社の皆さん、バックアップと応援がとてもありがたかったです。仕事を通してお返ししていきます。
- 競技プロコンやると組織が活性化するし、技量が上がる。
- 組織の全国的な立ち位置が分かるので、もっと多くの人が競技プロコンやるべき。
- エイチームグループ内で社内ISUCONやろうという話が出ているので、今から楽しみ。
- 来年は優勝を目指す:smiling_imp: