OmniAICreator/Qiita-1.07M huggingface dataset:
RSpec/FactoryBotでモデルのインスタンスメソッドを検証

Modelにインスタンスメソッド定義した時にちゃんとメソッドが通るか rails console で確認したりするのですが、クラスの親子関係が複雑になると rails console でインスタンス作るのが面倒になります。
そういう時はFactoryBotを使ってテスト環境にインスタンス作成してspec書いた方が楽です。

spec書いた時に気づいたtraitの使い方とこういう時にtransient使えるなっていうメモ
##想定モデル(適当)
- ReservationとMenuは一対多の関係
- ホットペッパービューティーみたいに一つの予約に、カットとかシャンプーとかのたくさんのメニューをいれれるイメージ


```ruby:Reservation.rb
class Reservation
  has_many :menus, dependent: :destroy
  
  validates :costomer_name, presence: true
  validates :phone_number, presence: true
  
  # menuの合計金額を得るメソッド
  def total_price_from_menu
    total_price = Money.new(0)
    menus.each do |menu|
      total_price += menu.price
    end
    total_price
  end 
end
```
```ruby:Menu.rb
class Menu
  belongs_to :reservation
  
  validates :name, presence: true
  validates :price_cents
  
  #　Moneyオブジェクト
  monetize :price_cents
end
```
##FactoryBot
- Factoryを定義する
- traitはfactoryの特定の状態に名前をつけて自由につけ外しができるようにする。下記ではreservationをcreateした時に子要素のmenuも同時に生成するようにtraitを定義した。
- transientは作成するデータと関係ないattributeを生成する。下記ではtransientのmenu_numの数だけ子要素のインスタンスを作成する。






```ruby:spec/factories/reservations.rb
FactoryBot.define do
  factory :reservation do
    customer_name { "山田太郎" }
    phone_number { "00000000000" }
  trait :with_menus do
    transient do
      menu_num { 1 }
    end
    after(:create) do |reservation, evaluator|
      evaluator.menu_num.times do
        create(:menu, reservation: reservation)
      end
    end
  end
end
```

```ruby:spec/factories/menus.rb
FactoryBot.define do
  factory :menus do
    association :reservation, factory: :reservation
    name { "カット" }
    price { "1000" }
  end
end
```

##RSpec
- テストの実行
- with_menuで子要素が作られる
- menu_numで引数を指定することで任意の数のインスタンスを作れる
- インスタンスメソッドが期待どうりの挙動をするか確認する

```ruby:spec/app/models/reservation_spec.rb
require 'rails_helper'

RSpec.describe Reservation, type: :model do
  describe "#total_price_from_menus" do
    let(:reservation) { create(:reservation, with_menu, menu_num: 2) }
    
    it "期待通りの合計金額になる" do
      expect(reservation.total_price_from_menu.format).to eq "200円"
    end
  end
end
```
####参考： traitの切り替えやassoiationについては以下の記事が詳しい
 [FactoryBot（旧FactoryGirl）で関連データを同時に生成する方法いろいろ](https://qiita.com/metheglin/items/47116ccbdb26aa00e034)
[FactoryGirlのtransientとtraitを活用する]
(https://qiita.com/joker1007/items/da63b8630351c1f3fe1d)
食生活を支えるサプリメント

#　食生活を支えるサプリメント

* 問題提起
   * 自分の能力を最大限に発揮するには、健康を維持する必要がある。
   * 食生活のわるさは、健康の維持をさまたげる要因になる。
   * 食事のみで必要な栄養をもれなく摂取するのは難しい。
   * サプリメントで手軽に食生活をサポートすることがおすすめ

* どのような栄養がどれだけの量必要か？
   * 興味がある人向け
      * [「日本人の食事摂取基準（2015年版）策定検討会」　報告書](https://www.mhlw.go.jp/stf/shingi/0000041824.html)
      * [食品成分データベース](https://fooddb.mext.go.jp/)

* 結論: 私がおすすめするサプリメント
   * マルチビタミン・ミネラル
      * 手軽に栄養バランスを整えられる。
   * オメガスリー
      * オメガスリーとは？ 脳の材料となる貴重な油。
      * 一般的な食事では、絶対に不足する。
         * 食物に含まれるオメガスリーの量は年々減っている。
      * オメガスリーの欠乏は、体調不良の原因になりうる。
         * 産後うつの原因となることもあるそう。
   * プロテイン
      * タンパク質は重要
         * 人間の体はほとんどはタンパク質と脂質からできている。
      * 意外に足りていない
      * 一日の目安: 体重 × 1gくらい
         * 例: 60gのタンパク質相当の食品
            * 鳥むね肉: 300g
            * さんま: 340g(2尾とちょっと)
            * 豚肉(肩ロース脂身付きの場合): 350g
            * 納豆: 360g(7～9パック)
            * 卵: 500g(9～10)
            * 牛乳: 1800g(2本くらい)

* その他、好みや必要に応じて
   * カルシウム
      * 普通は足りていない
   * ビタミンC
      * かぜが引きづらくなると言われる
   * ビタミンB100
      * パフォーマンスが上がる(気がする)

* おまけ
   * 食生活をよくするには？
      * まごはやさしい、を意識して食べるのがおすすめです。
         * ま: 豆類(大豆など)
         * ご: ごま、ナッツなど
         * は: 海藻(わかめなど)
         * や: 野菜
         * さ: 魚
         * し: きのこ(しいたけなど)
         * いも: いも類
Dockerの特徴とメリットについてまとめてみた

[Docker Advent Calendar 2018](https://qiita.com/advent-calendar/2018/docker) 12日目です。

こんにちは、はじめまして。

Dockerは業務で初めて触り、予想外に素晴らしいと思ったので、いつかまとまった勉強をしたいと思っていました。なので、Qiitaに記事を書きがてら勉強することにしました。

Dockerとは何か、どういうメリットがあるのかを解説します（コンテナの概念についてはスコープ外とします）。

対象はDockerを名前くらいしか知らない人や、開発時のDockerのメリットを把握したい初学者です。


## Dockerとは

Dockerは Linux上で動作するツールのひとつで、サーバー設定などのインフラと、Webサービスなどのアプリケーションをひとまとめにして、コンテナとして保存したり配布したり手軽に再現したりできるものです。

メンバーの誰もが**手軽に同じ環境を手に入れることができる**として、ローカル環境の構築手段として開発フローに取り入れられます。

また、インフラと一体化していることに着目して、コンテナごとデプロイして運用することで**環境差異の影響を最小限にしながら高速デプロイをする**といった使い方が代表的なようです（断言できないのは、私自身が本番環境にコンテナをデプロイするようなプロジェクトに携わったことがないから）。

このDocker、本来であれば MacやWindowsでは使用できないのですが、Docker for Mac等を導入することで MacやWindowsでもDockerを使用できるようになります。

これはDocker for Mac等に LinuxKitという軽量で高速な仕組みが内蔵されており、その上でDockerが動くという形になっているため、らしいです（詳細は知らない）。


## Dockerの特徴

#### コードベースでのインフラ定義

Dockerではどんなサーバー構成にするか、インストールするライブラリやツールは何かを Dockerfile等にコードベースで定義することができます。

これにより手作業やローカル環境の差異によって起きるミスを最小限にできます。

#### 環境構築における差異の最小化

Dockerfile等をもとに環境を構築するので、基本的には同じ環境で同じアプリケーションを実行することができます。コードによる構成管理（Infrastructure as Code）の思想。

※ただし「ライブラリの最新バージョンを取得」のような設定がされている場合、環境の構築をした時期によっては環境差異ができてしまうので注意すること。バージョンはしっかり指定しよう。

※設定を変えたりした場合、全員のDockerfileを書き換えてビルドするのではなく、設定が変わったコンテナをイメージ化して配布した方が手作業も減るし、環境差異を減らすことにもつながる。

#### 軽量でシンプル

VirtualBoxと比較すると、パソコンに負荷を与えない軽量設計になっています。メモリ8ギガの旧式PCで「パソコンが重くてなかなかPHPStormが起動しないよぉ」と泣き言を言ってるプログラマにはとてもありがたいです（切実）

PC立ち上げ時にDockerを自動起動するように設定しておけば、ローカル環境へのアクセスも楽ですし、VirtualBoxを起動して仮想環境を起動して、サーバーにログインして httpd startする手間が省けるので、ちょっと嬉しい。

#### デプロイが簡単になる

本番環境でDockerを運用したことがないので他サイトや書籍の受け売りになってしまいますが、大事なポイントだと思うので書いておきます。

コンテナは、インフラとアプリがセットになっているようなものです。
これをそのまま本番サーバーにデプロイすることで、高速で環境依存バグの少ないデプロイが実現できます。

また、ローカルと本番で同じ構成のコンテナを使うということは環境が統一されるということで、デプロイ後に差異がないか確認する作業が最小化できたり、確認やテスト時間の短縮につながりそうだと思いました。Dockerってすごいなあ（小並感）

## 実際に使ってみて

プロジェクトに新しくメンバーが入ってきても、Docker入れてREADMEに書いてあるコマンド実行してね、で差異なくローカル環境ができるので効率的。

今までは「すみません、手順通りにやったらエラーが出まして」とか「サイトがちゃんと表示されないんですけど」みたいな質問が必ず飛んできていたので、ありがたみを感じます。

Dockerさえあれば、もうnodeのバージョンをプロジェクトごとに変更する必要はないですし。

## さいごに

ある記事では、ITエンジニアとして仕事をしていて [Dockerを自分で動かしていない人は相当遅れている](https://qiita.com/poly_soft/items/fb649573c19b7a5c0227)と書いてあったりして、わりと必須感があったのでいま勉強しています。あとプロジェクトで環境構築や環境の差異に苦しんだ経験が多いので、そのあたりも勉強の動機になっています。

まだDockerの簡単な概念を知っただけの初心者なので、間違ったところなどがあれば指摘をお願いします。

本番でもバリバリDocker使うプロジェクトやりたい（小声）


## 参考文献

[Docker/Kubernates -実践コンテナ開発入門-](https://www.amazon.co.jp/Docker-Kubernetes-%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E5%B1%B1%E7%94%B0-%E6%98%8E%E6%86%B2/dp/4297100339/ref=sr_1_1?ie=UTF8&qid=1543843633&sr=8-1&keywords=%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80)
駅データ.jpのCSVファイルをMySQLで取り込む

駅に関する情報を収めたCSVデータを[駅データ.jp](http://www.ekidata.jp/)で入手することができる。駅の所在地・鉄道会社・緯度経度などさまざまな情報が紐付いており実用性が高い。座標データが含まれるため、Geocoding APIなどと組み合わせると住所から最寄りの駅を割り出したりすることもできる。

## この記事を読む人

技術的な話はだいたい分かるけど専門ではない、というレベルの人。勉強中のデザイナーさんとか。シェルスクリプトでバッチを作るくらい簡単って人には[こちら](https://qiita.com/ebihara99999/items/ccaf427a252727228132)の記事のほうが参考になると思う。

## データをダウンロードする

http://www.ekidata.jp/dl/

上記URLからダウンロードできる。メールアドレスの登録が必要。

http://www.ekidata.jp/doc/station.php
ダウンロードできるデータは7種類あって、今回説明するのは上記のデータ。路線名コンボの[ドリルダウン](https://www.google.com/search?q=%E9%A7%85%E5%90%8D+%E3%83%89%E3%83%AA%E3%83%AB%E3%83%80%E3%82%A6%E3%83%B3)を実装する場合などは路線データも必要だけど、当ページの内容を参考にすれば同じように取り込めると思う。

## テーブルを作成する

phpMyAdminやAdminerのSQL実行画面を開いて、下記のスクリプトを実行する。

```SQL
CREATE TABLE `ekidata` (
	`eki_id` INT(11) NOT NULL COMMENT '整数7桁 ※新幹線は6桁',
	`eki_g_id` INT(11) NOT NULL,
	`eki_name` VARCHAR(80) NOT NULL COMMENT '全角半角は同一視' COLLATE 'utf8_unicode_ci',
	`eki_name_k` VARCHAR(100) NOT NULL COMMENT '※有料版のみ' COLLATE 'utf8_bin',
	`eki_name_r` VARCHAR(100) NOT NULL COMMENT '※有料版のみ' COLLATE 'utf8_bin',
	`line_id` INT(11) NOT NULL,
	`pref_id` INT(2) NOT NULL,
	`zip` VARCHAR(10) NOT NULL COLLATE 'utf8_bin',
	`address` VARCHAR(300) NOT NULL COMMENT 'イバラキもイバラギも同じ' COLLATE 'utf8_unicode_ci',
	`lng` DOUBLE NULL DEFAULT NULL COMMENT '経度',
	`lat` DOUBLE NULL DEFAULT NULL COMMENT '緯度',
	`open_ymd` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_bin',
	`close_ymd` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_bin',
	`status` SMALLINT(6) NOT NULL COMMENT '0:運用中 1:開業前 2:廃止',
	`sort` INT(11) NULL DEFAULT NULL,
	PRIMARY KEY (`eki_id`),
	INDEX `index_stations_on_station_name` (`eki_name`),
	INDEX `index_stations_on_lng_and_lat` (`lng`, `lat`)
)
COMMENT='駅名マスタ'
COLLATE='utf8_bin'
ENGINE=InnoDB
;
```

上記のようなテーブルを作成し、ここにデータを取り込む。フィールド名はekidata.jpを連想できるように、stationナントカではなくekiナントカで。open_ymdとclose_ymdはdatetime型のほうがいいんだけど、個人的には使い道が思い浮かばないデータなので文字列としてシンプルに扱う。

テーブルの構成はもっと簡単でも動作する。この後で実行する取り込みスクリプトではフィールド名の照合などを行わないので、フィールドの数さえ合っていればフィールド名とか型とかは適当に決めることができる。取り込んでから変更することもできるので、案件に合わせてきっちり考えるのは後回しにしてもいいと思う。

http://www.ekidata.jp/doc/station.php
公式サイトではこう書かれてるけど・・

そして取り込みを実行。

```SQL
TRUNCATE ekidata;

LOAD DATA LOW_PRIORITY LOCAL INFILE 'C:\\download\\ekidatajp.csv'
INTO TABLE ekidata
FIELDS TERMINATED BY ','
ENCLOSED BY '"'   
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
```
これでデータを取り込める。

## 駅データはこまめにメンテしたい

さっそく[これ](https://www.google.com/search?q=%E9%AB%98%E8%BC%AA%E3%82%B2%E3%83%BC%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A4)に対応しなきゃと思いました。
シェルで出力(printf)するアスキーアート(テキスト)に色をつけたい

アスキーアートアドベントカレンダー２日目の記事です
シェルで出力(printf)するアスキーアート(テキスト)に色をつける実装です。

## 前段
以前、「nem.sh」というブロックチェーンを使ったshellスクリプト共有ツールを作成しました。
・nem.sh
https://github.com/scrpgil/nem.sh

そのデモでターミナルにアスキーアートのNEMロゴを表示したいと思いました。また、せっかくなのでモノクロじゃなくて色をつけて表示しようと考えました。色付きの方がCLIツールとはいえ結構豪華な感じになるんじゃないかな？と思って。
<img src="https://qiita-image-store.s3.amazonaws.com/0/165335/65c663f6-7ff9-277d-950e-20d8dd1a7a5a.png" width=100>

## 方法
shellでprintf出力したいテキストの前に、こんな感じ`\033[0;33m`にエスケープすれば色が変わるようです。

`[`以降の最初の数値が状態番号、その次の`33`がカラーコードになります。

各状態番号、カラーコードの意味はこちらの記事のスクリプトを利用して調べました。
https://qiita.com/soramugi/items/46117274419665e601fa

```
状態番号
 デフォルト状態 00
 強調           01
 下線           04
 点滅           05
 色反転         07
 塗りつぶし     08 (塗りつぶし     08)

色番号
 黒               30   40   31;40   32;00;40
 赤               31   41   32;41   33;01;41
 緑               32   42   33;42   34;04;42
 黄(または茶)     33   43   34;43   35;05;43
 青               34   44   35;44   36;07;44
 紫               35   45   36;45   37;00;45
 シアン           36   46   37;46   30;01;46
 白(またはグレー) 37   47   30;47   31;04;47
```

## 実装
はい、というわけで実装はこんな感じです。

```shell
Y='\033[0;33m'
B='\033[1;34m'
G='\033[1;36m'
N='\033[0m'
![Screen Shot 2018-12-02 at 21.21.52.png](https://qiita-image-store.s3.amazonaws.com/0/165335/653a775c-9ea1-11f4-b576-0be4c630c040.png)

printf "       ${Y}sssssssssssss${N}\n"
printf "  ${Y}ssssssssssssssss${N}  ${B}sssssssssss${N}\n"
printf "${Y}ssssssssssssssss${N}   ${B}sssssssssssss${N}\n"
printf "${Y}sssssssssssssss${N}  ${B}sssssssssssssss${N}\n"
printf " ${Y}ssssssssssssss${N}  ${B}ssssssssssssss${N}\n"
printf "  ${Y}sssssssssssss${N}   ${B}sssssssssssss${N}\n"
printf "    ${Y}'''''''''${N}         ${B}ssssssss${N}\n"
printf "   ${G}hssssssssssssssss${N}    ${B}sssss${N}\n"
printf "    ${G}sssssssssssssssssss${N}  ${B}sss${N}\n"
printf "      ${G}sssssssssssssssss${N}  ${B}ss${N}\n"
printf "        ${G}sssssssssssssss${N}  \n"
printf "          ${G}ssssssssssss${N}\n"
printf "             ${G}sssssss${N}\n"
printf "               ${G}sss${N}\n"
```


## 出力
いい感じで色ついてますね！
やはり色が付いている方が映えますね！ 

![Screen Shot 2018-12-02 at 21.21.52.png](https://qiita-image-store.s3.amazonaws.com/0/165335/9f3399fa-e1ce-480a-f035-2cac93c22854.png)


## まとめ
思っていたよりも簡単に文字に色をつけることができました。


ちなみに、このNEMロゴのアスキーアートは私がコンソール上で下に透過させたものをなぞったものです。エディタはvimを使いました。
![Screen Shot 2018-12-02 at 21.41.16.png](https://qiita-image-store.s3.amazonaws.com/0/165335/369b6af0-621f-0cec-3c95-2bf366c00dd3.png)

意外と簡単に作れますし、アスキーアートがあるとCLIツールとしても映えると思います。自作CLIツールを作っている方は是非ともアスキーアートを作成してツールに追加してみてください。
それでは。
Ubuntu18.04インストール後の初期設定

##コマンド
```
#update & upgrade
sudo apt update && sudo apt upgrade

#不要パッケージの削除
sudo apt autoremove

#日本語入力
sudo apt install ibus-mozc
killall ibus-demon
ibus-demon -d -x &

#vim
sudo apt install vim

#Git
sudo apt install git

##generate ssh-key
ssh-keygen -t rsa

#default Editor
update-alternatives --config editor

#Python Warnings表示
echo "export PYTHONWARNINGS=default" >> ~/.bashrc
source ~/.bashrc
```

##参考サイト
[ubuntu 16.04 LTS インストール後の設定](https://qiita.com/TaichiIto/items/d17202eab0c53fa0c7ac)
[Ubuntu 18.04の初期設定をしてみた](https://qiita.com/iganari/items/587c330a62e52023679d)
[Ubuntu 18.04 LTSのセットアップ](https://qiita.com/SUZUKI_Masaya/items/54cc17a42597733c87d1)
卓上電卓と電卓アプリで計算結果がちがってくるはなし。とExcelの乗算について

この記事は [actindi Advent Calendar 2018](https://adventar.org/calendars/3391) の2日目の記事です。

#最近、卓上電卓を使っていますか？
スマホの普及で、スマホ内の電卓アプリを使ったり、googleの検索窓を使う、なんて人も多いかと思います。

電卓アプリや検索窓で計算をする場合は、ちょっと注意が必要です。以前まで使っていた、卓上電卓と同じ感覚で使ってしまうと、求めている答えと違ってくる場合があります。

**4+4×4=?**

これを卓上電卓で計算すると32になります。
4+4=8
8×4=32
入力した順番通りに計算してくれます。

しかし、スマホアプリや検索窓を使うと20という答えになります。
4×4=16
4+16=20
これは計算をする順番に違いがあります。小学校の授業を思い出してください。
>四則演算は乗算と除算を先頭から行う必要がある。

googleやスマホ内アプリは計算の順番を考慮してくれているのです。
でもこれってこのことを知ってないとちょっと大変です。

こんなシーンで電卓を使うとします。
130円のお菓子と160円のお茶を17人分購入すると、いくら必要か。

130+160×17=?

求めたい答えはこれですね。
130+160=290
290×17=4930

卓上電卓で計算すると問題なくこの値がでます。
しかし、この計算をアプリや検索窓で行うと、
<img width="380" alt="pict.png" src="https://qiita-image-store.s3.amazonaws.com/0/223333/17360d29-7a9c-53fd-c2ab-9204ed356151.png">

乗算を先に計算してくれるので、全く違った値になってしまいます。
余計なことしないでー！と思うのですが、仕方ありません。
ちなみに、Excelでも同様です。求めたい答えを出したいなら、
**=(130+160)*17**
()を忘れずに付けましょう。


4～5年前にちょっと話題になった、計算問題。
**6÷2（1+2）=?**
これも、小学校で習ったことを思い出すと、

*括弧から先に計算する
*乗算と除算を左から計算する
*加算と減算を左から計算する

なので答えは9ですね。

ちなみに、電卓アプリでも卓上電卓と同じ感覚で使えるアプリもありますし、
卓上電卓でもちょっとイイヤツは、計算の順番を考慮してくれる電卓もあります。



##最後に、ちょっと知っておくと便利なExcelの使い方。

<img width="320" alt="pict0.png" src="https://qiita-image-store.s3.amazonaws.com/0/223333/6936c43d-f96b-05bb-8e4f-5184741c3e2c.png">

このような表の各値に1.08を乗算したい場合、
玉ねぎの価格の下のセルに、数式を入力しても良いのですが、

<img width="476" alt="pict3.png" src="https://qiita-image-store.s3.amazonaws.com/0/223333/62efecfc-9563-7eda-b149-babe05bf0a8c.png">
<img width="478" alt="pict5.png" src="https://qiita-image-store.s3.amazonaws.com/0/223333/6dfabb21-043c-50cd-c65d-ac013df0994a.png">
<img width="740" alt="pict6.png" src="https://qiita-image-store.s3.amazonaws.com/0/223333/2fac2c6d-66b0-4109-5056-30ac14399335.png">
<img width="434" alt="pict8.png" src="https://qiita-image-store.s3.amazonaws.com/0/223333/3ee94d8b-cb6c-ab73-f183-848458c24533.png">

こうすると、一気に値が変わります。
四則演算はすべてできるので、何十列・何十行の表の値全てを2倍にしたい・・
といった時には非常に便利かと思います。

是非、活用してみてください。
Windows から iPad Safari をデバッグして TweetDeck をアプリのように使う

# 目的
本記事の目的は iOS でアプリのように TweetDeck を使えるようにすることです。
詳細は以下の記事を参照ください。
[iPad で TweetDeck をネイティブアプリのように使う][link-1]
[link-1]:https://qiita.com/fiftystorm36/items/415d9e0e08a1d705dc78

[元記事][link-1]のコメントにもあるように iPad OS 13.1.2（以降？）では Safari から「ホーム画面に追加」するだけで OK です。

それ以前の OS で Safari から「ホーム画面に追加」するだけでは、開く度にログインが必要でとても使う気になりません。
Safari の Cookie を編集してログイン状態が継続されるようにする必要があります。

[元記事][link-1]では Mac からデバッグする方法が紹介されていますので、本記事では Windows からデバッグする方法を紹介します。

# 手順

## RemoteDebug iOS WebKit Adapter の準備

[Getting Started][link-2] に従って準備する。Step 3 以降は以下を参照。
[link-2]:https://github.com/RemoteDebug/remotedebug-ios-webkit-adapter#getting-started

## iTunes、Chrome の準備

1. Windows PC で iTunes、Chrome をインストール。
1. Chrome で `chrome://inspect/#devices` を開く。
1. Devices -> Discover network targets にチェックが入っていることを確認する -> Configure... -> `localhost:9000` を追加。

## 設定手順

1. iPad の設定で Web インスペクタ を ON にする。
    設定アプリ -> Safari -> 詳細 -> Web インスペクタ ON

1. iPad の Safari で [TweetDeck](https://tweetdeck.twitter.com/) を開いてログイン。
1. Windows PC の Powershell で下記を実行。

    ```
    remotedebug_ios_webkit_adapter --port=9000
    ```

1. Windows PC と iPad を接続し、iPad のロックを解除。
1. iPad、iTunes で Windows PC を信頼。
1. Chrome で `chrome://inspect/#devices` を再度開く。
1. Remote Target 下に TweetDeck が表示されるのでそれを inspect。
1. 後は[元記事の「Cookie の取得」](https://qiita.com/fiftystorm36/items/415d9e0e08a1d705dc78#cookie-の取得)以降と同じです。開いた DevTools 画面の Application タブから Cookies にアクセスできます。

# 参考
- [iPad で TweetDeck をネイティブアプリのように使う][link-1]
- [GitHub - RemoteDebug/remotedebug-ios-webkit-adapter: Debug Safari and WebViews on iOS from tools like VS Code and Chrome DevTools][link-2]
ESCAPEキーを押した時に日本語入力を解除するようにすると捗る

この記事は [KLab Advent Calendar 2018](https://qiita.com/advent-calendar/2018/klab) の二日目のエントリです。

# 日本語入力の状態管理って面倒くさい

vim を使っていて、日本語入力をする場合、NORMALモードからiを押してINSERTモードにしたあと、半角全角キーなどを使って日本語入力をONにして入力をはじめる事になりますよね。
この状態からNORMALモードに戻る時には、当然ですが、まず日本語入力をOFFにしたあとにESCキーを押してINSERTモードから抜ける事になります。

INSERTモードに入った時は日本語入力を行うかどうかはわからないので明示的にONするのは納得いくのですが、INSERTモードを抜けた後に日本語入力を行う事はないので、INSERTモードを抜ける時に自動的に日本語入力をOFFにしても問題ないはずです。

というわけで設定してみましょう。

## Windowsの場合

Windowsの場合はキー設定を変更する場合、のどかを使います。(2019-09現在、サイト閉鎖されてしまったようです)
のどかの設定はホームディレクトリ下に `dot.nodoka` というファイルを作ってそこに書き込みます。
ESCが押された時に日本語入力をOFFにするわけですが、半角全角キーだとトグルなので、` &SetImeStatus `を利用して以下のように書きます。

```
key IL-Esc = &Default &SetImeStatus(off)
key C-IL-LeftSquareBracket = &Default &SetImeStatus(off)
```

` IL- ` はIMEがONになっている時を判定するモディファイヤで、その時にEscが押されると、通常のEscが押された時の動作( ` &Default ` )と同時にIMEをOff( ` &SetImeStatus(off) ` )にします。
` C-[ ` を押した時にも同じ動作をしてほしいので、同じ設定を二行目に書いています。

## Macの場合

Windowsで設定している事は当然Macでもやりたくなりますよね。Macでキー設定をカスタマイズする場合は[Karabiner-Elements](https://pqrs.org/osx/karabiner/)を使います。

```
     "rules": [
                  {
                      "description": "C-[ to ESC and KANA UNLOCK",
                      "manipulators": [
                          {
                              "from": {
                                  "key_code": "open_bracket",
                                  "modifiers": {
                                      "mandatory": [
                                          "control"
                                      ]
                                  }
                              },
                              "to": [
                                  {
                                      "key_code": "escape"
                                  },
                                  {
                                      "key_code": "lang2"
                                  }
                              ],
                              "type": "basic"
                          }
                      ]
                  },
                  {
                      "description": "ESC to ESC and KANA UNLOCK",
                      "manipulators": [
                          {
                              "from": {
                                  "key_code": "escape"
                              },
                              "to": [
                                  {
                                      "key_code": "escape"
                                  },
                                  {
                                      "key_code": "lang2"
                                  }
                              ],
                              "type": "basic"
                          }
                      ]
                  }
              ]
```

## ことあるごとにESCを連打していこう

Windowsの場合、日本語入力のON/OFFは半角全角キーによるトグル操作なので、今の日本語入力の状態を自分で把握しておかないといけないですが、とりあえずESCキーを連打すれば日本語入力がOFFになるというのは他のエディタを使っていても直感的で便利です。

ESC連打していろんなことからESCAPEしていきましょう。
今すぐaliasを登録しておくべきGitワンライナー

## はじめに

[今すぐalias登録すべきワンライナー by ゆめみ① Advent Calendar 2018](https://qiita.com/advent-calendar/2018/yumemi01_one-liner) の2日目です。

私はプロジェクト依存のものはなるべくMakefileから利用するようにしているので，`.zshrc` は Git 関連程度で薄く保たれています。
皆さんの素敵なワンライナーが見られるよう，貢献させていただきます。
大いに盛り上がって欲しいと思います。

## 本題

業務で叩くものの中で1番多いであろうGitコマンド。

もう checkout のタイポで移動できない，なんて無くしましょう。`gc` で十分です。
また，GitHub では issue 駆動の開発をしていますが，issues/ は 7 文字です。`i` で十分です。
以下をコピペし，些細な工夫でモチベーションが下がるのを防ぎましょう。

```zsh:.zshrc
# g: git
alias g='git'

# gc: checkout
alias gc='git checkout'
fuction gci (){ git checkout issues/$@ }

# gcb: checkout with a new branch
alias gcb='git checkout -b'
function gcbi (){ git checkout -b issues/$@ }

# gpr: pull the PR branch
function gpr (){ git fetch upstream pull/$@/head:pr/$@ && git checkout pr/$@ }

# gp: push
alias gp='git push'
alias gpo='git push origin'
function gpoi (){ git push origin issues/$@ }
```
chainer 5.0.0におけるVirtual Adversarial Trainingの実装

元論文
[Distributional Smoothing with Virtual Adversarial Training](https://arxiv.org/abs/1507.00677)


深層学習で，半教師あり学習に興味を持ったので，[ここ](http://segafreder.hatenablog.com/entry/2017/06/26/000000)に書いてあったコードを動かそうとしたら，バージョンの関係で動かなかったので，chainerの勉強がてら5.0.0で動くようにしました
(深層学習関係のライブラリはアップデートが早すぎる...)
元々の記事がGPU onlyだったので，GPUを積んだマシンでしか動きません(CPUで動かすとかなり時間を食うのでCPU版を実装する気が無いというのはわかる...)

#実装例
[github](https://github.com/verb55nta/vat_chainer)

VATLossClassifierはchainer.links.Classifierの中身をコピーして
イテレータはラベル付きのものとラベル無しのものの二つを用意して，それを共にVATUpdaterに食わせました

#実行例
    python train_mnist_vat.py -g [gpuid] -e 25000

#実行結果
手元の環境(Windows 10 + Nvidia GTX 1080 Ti)で，大体96~98%くらいのaccuracy

#メモ
元論文ではAdamの学習率は0.002って書いてあったけど，0.0001にした方が収束しました

#参考文献
[論文メモ：Virtual Adversarial Training](https://qiita.com/yuzupepper/items/e2d093f05adccbe1b7f1)
[chainerでVAT(準教師学習)](http://segafreder.hatenablog.com/entry/2017/06/26/000000)
Linuxカーネルパラメータのチューニング

## カーネルパラメータとは

カーネルパラメータというのは、カーネルの個々の機能やドライバが解釈して、 それぞれの振る舞いを変更できるようにするためのもの。

なぜこの設定が必要なのかというと、例えば「Webサーバ」だったり「DBサーバ」だったり「インメモリーのキャッシュサーバ」だったりサーバは様々な用途があるがそれぞれ必要な特性がありその特性を活かすために設定するのが主ではないかと思う。

## どんなパラメータがあるの？

カーネルパラメータの説明は下記を読むのが一番性格。

[linux/Documentation/sysctl/](https://github.com/torvalds/linux/tree/v4.15/Documentation/sysctl)

Linuxカーネルソースに付属しているドキュメントです。

例えばnet系のパラメータの説明をみたいならここで確認できます。

[linux/Documentation/sysctl/net.txt
](https://github.com/torvalds/linux/blob/v4.15/Documentation/sysctl/net.txt)

よく使う設定項目である「netdev_max_backlog」なんかの説明も以下のように記載されています。
(もちろんここで見れるのは概要だけであり詳細がみたいならソースをおう必要があります。)

```
netdev_max_backlog

Maximum number of packets, queued on the INPUT side, when the interface 
receives packets faster than kernel can process them
```

## TCPサーバ向けのtuning

#### 基本

```
# 恒久的設定
$ vi /etc/sysctl.conf
$ sysctl -p
```

#### kernel

```
# 共有メモリの最大サイズ。サーバーの搭載メモリ(1GB)に合わせて変更
kernel.shmmax      = 1073741824

# システム全体の共有メモリ・ページの最大数
kernel.shmall      = 262144

# システム全体のプロセス数の上限
kernel.threads-max = 1060863

# kernel panicで自動再起動
kernel.panic=30
```

#### ファイルシステム関連

```
# ファイルシステムでのオープンファイルの上限
fs.file-max = 1619870
```

#### 仮想メモリ

```
# OOM killer 発動した場合は kernel panicを起こして再起動させる
vm.panic_on_oom=1
```

#### Network

```
# ネットワークデバイス別にカーネルが処理できるように貯めておくqueueのサイズ
net.core.netdev_max_backlog

# backlog値のhard limit
net.core.somaxconn = 4096

# ソケット当たりのSYNを受け付けてACKを受け取っていない状態のコネクションの保持可能数
net.ipv4.tcp_max_syn_backlog = 16000

# NIC に対する受信パケットの最大キューイング数
net.core.netdev_max_backlog = 16000

# TCPとUDPの受信バッファのデフォルトサイズと最大サイズ
net.core.rmem_max = 4194304

# TCPとUDPの送信バッファのデフォルトサイズと最大サイズ
net.core.wmem_max = 4194304

# データ受信バッファ サイズ
net.ipv4.tcp_rmem = 4096        87380   4194304

# FINのタイムアウト時間
net.ipv4.tcp_fin_timeout = 12

# tcpのSYNを送信するリトライ回数
net.ipv4.tcp_syn_retries = 2

# TCP/IPの送信時に使用するポートの範囲
net.ipv4.ip_local_port_range = 32768    60999

# 自分からの接続を使い回す
net.ipv4.tcp_tw_reuse = 1

# RFC1337に準拠させる
net.ipv4.tcp_rfc1337 = 1

# システムが同時に保持するtime-waitソケットの最大数
net.ipv4.tcp_max_tw_buckets = 360000

# クライアントからの Sync パケットは捨てずに、 Syn cookies を利用した通信を行うかの設定
net.ipv4.tcp_syncookies = 1

# accept キューがあふれた場合、クライアントからの SYN に RST を返す
net.ipv4.tcp_abort_on_overflow = 0

# SYN flood攻撃対策。
net.ipv4.tcp_syncookies = 1
```
自家製家計簿システム作って家庭内で運用する

[Stylez Advent Calendar 2018](https://qiita.com/advent-calendar/2018/stylez)の2日目です。
今年は色々な方が書いてくださるようなので嬉しいです。

## はじめに
家計ってどう管理していますか？

私事ですが、今年結婚いたしました。
共働きなのでいい感じに折半したいなーとなったのですが、いい感じに折半できるアプリケーションを見つけることができませんでした。。。

ないんだったら自分で作ればいいのよ！
と、某黄色いカチューシャの人が言っていたのを思い出したので作ってみました。
ここ1年半ほどまともに作らせてもらえてないですし、息抜きを兼ねて…。

## こんな感じ
必要な機能は折半なのでこれだけです。
<img width="450" alt="スクリーンショット 2018-12-02 20.44.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/120491/de564dc3-707e-eb5e-514c-31f585e3fb39.png">
メモ欄の部分にまとめたいkeyを入力して、精算を押すだけです。

## 分担
お互いSEなので分担して進めました。
- 自分：認証周りとか土台周り
- 嫁：画面、計算周り

## アーキテクチャ
- 言語：Java 8
- フレームワーク：SpringBoot 2.0
- 画面：Thymleaf 3、mini.css
- データストア：zaim
- 認証：OAuth1.0a

認証周りはこの辺を見てください。
[JavaでZaimのAPI(OAuth1.0)を叩く](https://qiita.com/kxn4t/items/9f0f920e41e47bb2aaf4)
（以前やってたのはこれがやりたかったのです。

## 選定理由
- zaim
 - 折半したいだけだから家計簿部分まで作るのはなんかちがう
 - レシート読み取りでの登録が便利（最近ますます精度が上がっててすごい
 - APIが公開されている
- Java + SpringBoot
 - お互いJavaはわかる
 - SpringBootだと早そうだけどちゃんと使ったことはなかった
- mini.css
 - Bootstrapはなんだかんだ面倒だから別の使ってみたかった(らしい  
 嫁曰く、結局同じくらいの使用感だったみたいですが。。

## どう使っているか
### データ登録
スマホアプリから各々レシートを読み取ったりしてデータをzaimに登録します。
このとき、メモ欄にお互いの名前をいれておきます。
これをグループ化のキーとして使います。
<img width="300" alt="スクリーンショット 2018-12-02 21.05.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/120491/58cf05b4-cf3b-3686-62c9-2e8d6333dea2.png">

### データ取得
データ取得はOAuth1.0aでzaimと認証してREST APIで引っ張ってきます。
ローカルで使うだけなので、tokenはCookieに入れてしまって、再認証がいらないようにしています。
<img width="300" alt="スクリーンショット 2018-12-02 21.08.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/120491/0395af19-971d-719d-fc54-23585b57d78a.png">

### 計算
集計期間を指定して、お互い使った金額を取得し計算をします。
グループ化のキーもこのとき指定します。
<img width="300" alt="スクリーンショット 2018-12-02 21.12.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/120491/ba6a8c3d-a928-4dfc-5b13-eaaebc7f9408.png">
面倒なので前回精算した日をLocalstorageにいれてしまって、現在日付との間で使った金額を算出してます。
グループ化のキーにお互いの名前を入れて、どっちが何円使って、どっちが何円払うかみたいなことを計算します。

### 運用
今は2〜3ヶ月に1回で精算しています。
今のところローカルPCで実行して、集計後はslackで共有しています。

### 今後の改善
- Slack連携
 - スラッシュコマンド打ったら精算してくれるとか
 - 精算後自動で通知してくれるとか
- サーバでの運用
 - 買って以来何者にもなれていないラズパイに乗っけたい  

## まとめ
やっぱり作るのはたのしい。
自分たちの生活は自分たちでどんどんよくしていきたい。

これで困ってる人結構いると思うんですよね……。
（ほんとはもっと作り込んでwebサービス化したかったのですが、データストアにzaimを使用しているところでよくないかなと思い諦めました。）

---
この内容で社内LTをさせていただいたときの資料です。
LTするの初めてだしでちょっと緊張したのは内緒です。
https://speakerdeck.com/kxn4t/homemade-household-account-book-system
デザインしたことがない人なんて本当はいないんじゃないかという話。


##はじめまして

こんにちは。デザイナーの佐藤(初登場)です。

前職の制作会社から、グロービスに転職して1年半くらいが経過しました。
もともと事業会社で、開発組織自体が新参者ではあるのですが、入社してから「デザイナーじゃないのでデザインなんてできないです！」とか「やったことないので！」という言葉を社内で度々耳にしてきました。いやいやそんなことないよーーー！みんなもやってるよーーー！！！と感じておりましたので、今日はその所以について綴ってみます。



##ファンを獲得するための仕組みもデザイン？

さて、突然ですが、モーニング娘。ってご存知ですか？（唐突！）

彼女たちのトークシーンをちょっとだけ思い出していただきたいのですが、「なっちは…」「後藤的には…」「さゆが…」と、自分のことを名前で呼んでいますよね。~~このメンバーのチョイスで歳がばれs…~~

一般的には、自分のことを名前で呼ぶという行為は受け手に子供っぽい印象を与え、心理学的にも、ナルシズムや幼児性の現れと言われています。

しかし**「モー娘。は大人数の中で発言するとき、“私”でなく“名前orあだ名”を使うシステムになっている。」**とアイドルファンの友人から聞き、それ立派なコミュニケーションデザインでは！と思ったことがありました。（※果たして、それが事実かどうかは一旦横に置かせてください。）

そして、そのシステムの目的は至極シンプルで、**ファンになってもらうにはまず名前を知ってもらう必要があるから**だそうです。
単純な日頃のクセなどではなく、ファン獲得のために意図的かつ客観的な戦略のひとつだったと気づいて、なんだかアイドル文化の奥深さを感じました。

確かに。マーケティングで「AISAS」というフレームワークがありますが、序盤の「Attention」→「Interest」→「Search」あたりまで、スムーズに進むには、名前を覚えてもらうことがキーになりそうなので、納得＆合理的な仕組みだなとも思いました。

###さて、ここまではファン目線でのお話ですが、この仕組みが面白い理由ををもう一段掘り下げてみます。

ファンとの関係値を築くには、タッチポイントとなるコンテンツも重要です。例えばテレビのトーク番組など。
番組制作にはカメラを回す人、音声を拾ってくれる人、ディレクター、プロデューサー、さらにその場にはいないかもしれませんが脚本家やスポンサー。また共演者など様々なモチベーションの関係者が登場しますが、全員が必ずしも積極的に名前を覚えてくれる人ばかりとは限りません。

貴重なアピールの場で、背丈も衣装も似た人たちの中から、個々を判別して、間違いのないようカメラやマイクを向けるのって結構難易度が高そうです。

でもそんな時、自ら「〇〇は〜」と名乗ってくれたら、誰が話しているのか把握しやすくなります。
共演者目線で考えたら、全員の名前を覚えなければ…という心理ハードルが下がって、少し話しかけやすくなるかもしれません
。
そして何度も繰り返し名乗っていれば、自然と顔と名前が一致し、誰かしらの記憶に残る可能性がグッと上がりそうです。

アイドルを取り巻くエコシスステムの中で「自分のことを名前で呼ぶ」というシンプルなアクションが、コンテンツを作る過程を円滑にし、視聴者への発信になり、受信した人がファンになる過程までをスムーズにしているとしたら、それってもうコミュニケーションをデザインしていると言っていいのではと思ったりしました。

でも、この仕組みを考えた人は、果たしてデザイナーという肩書きがあったののでしょうか。
この例を見ると、もしかして自分にも考えられそう！と感じた、NON-デザイナーの方もいらっしゃるのではないでしょうか。

##デザインとは、思いやりなんじゃないか説

知らない人に、顔と名前を覚えてもらうという課題で言えば、日常生活でわりと起こりうる事案です。
その時「先方の負担になっていないか？」「先方はちゃんと理解できたか？」「失礼でないか？」など、相手を思いやるという行為は、誰でもやっていると思います。

誤解を恐れずに言うならば。
この思いやりを極限まで突き詰めれば、誰でもデザイナーになれるのでは！と思ったりするのです。（異論、反論、認めます！！！）


##結局デザイナーって何なの？

じゃあ、職業としてデザイナーを名乗っている人は何が違うの？というと、思いやりの思考をより深く、広く、速く巡らせ、体系立てながら課題解決の策を錬ることを訓練されている人、といったかんじではないでしょうか？

もう少し具体的にするなら…
*鳥の目で全体エコシステム捉えながら、虫の目でヒトの行動を観察し、魚の目で潮流を掴み、最も受け手を思いやれているであろう決定打を探る〜仮説立てる〜検証するというプロセスを超高速で無意識的に回しまくる思考訓練を、まるで呼吸するくらいナチュラルに体現できるよう鍛錬してる。*みたいな。

###はて？突然ちょっと何言ってるかわからなりましたが（笑）
上記はあくまでも主観に基づく持論なので気にしなくて大丈夫です。

つまるところ本稿で、何をお伝えしたかったのかというと、
「デザイナーじゃないから、デザインできない。」は、「I cannot speak English at all.」くらい違和感があって、誰でも語れる、考えられる、取り入れられるものだよ！ということです。

英語が話せません！ってそれ自体英語で話せているし、旅行くらいなら問題ないという人、結構いますよね。
デザインも同じで、実務で使うにはそれなりの訓練を要すとしても、思いやりを持っていれば全くできていないことはないんじゃないと思う次第です。

以上、なんだか取り留めのない話になってしまいましたが。
デザインってなんだかよくわかんない！とっつきにくい！と思っていた方の心のハードルが少しでも緩和されたらいいな〜と思った次第です。

では、また〜！
ソフトウェア開発プロジェクトでPerlを選択する理由について

本記事は[Perl Advent Calendar 2018](https://qiita.com/advent-calendar/2018/perl)の3日目の記事です。

初めてPerlを使った開発プロジェクトに携われたのが嬉しくて、そのことについて書こうと思います。

## 記事を書くきっかけ

　自分はSESで主にSIer系の様々な現場に出向して仕事をしています。
今の現場ではPerlが採用されています。自分自身、懐かしいなーと思いながら日々開発を進めています。

Perlの文法は自由度があって楽しいです。ですが、これがチーム開発となると制約が大きくて敬遠される
という声も聞きます。

そこで、実際に業務でPerlを使うときの良い点・悪い点を自分なりに整理できればと思いました。
稚拙な点はぜひご指摘ください。

## 記事の目的

・開発現場でPerlが主な言語として採用されており、なぜPerlを採用したか調べるため。
・開発現場の事情は普段なかなか目にすることはできないので、少しでも情報を共有できれば良いな
と思ったため。

## 本文

1. 顧客・開発現場の組織特性
2. 組織特性を踏まえたPerl採用のメリット
3. Perlを採用したことで起きている問題・デメリット
4. 今後の展望

### 顧客・開発現場の組織特性

・組織としてPerlを採用したのは2008年くらいから。開発者が各自で使っていたのは20年前くらいから。
・サービスの長期継続を見込んでいる(5~15年くらい)
・「自前主義」な面が強い

　お客さんは自前のデータ収集機構を持っています。収集したデータをさまざまな用途に
加工して、ユーザにサービスすることで対価を得ています。利益の最大化というより
は、利益の出る範囲内で長期的にサービスを行うことが主目的のようです。
なぜかというと、お客さんが提供するサービスは生活に密着しており、データの質が流行り
に左右されないからです。

　お客さんはエンジニアの個人的な能力を評価する傾向があります。そのため、能力の
ある個人が主体となって開発を進めることが多いです。自分が担当しているサービスはRDBMS
を使わず、データはJSONファイルをUNIX OSのディレクトリに格納して管理しています。
データベースといえばRDBMSを想像していたので衝撃を受けました。

RDBMSがメジャーになる以前から大容量のデータを取り扱っていたということもあってか、
RDBMSを使うとデータ容量が爆発的に増えてストレージ容量を圧迫する可能性が高いということ
で使っていないのだそうです。

　これは推測ですが、ミドルウェアを使うと障害発生時でもベンダーの内部事情に大きく制約され
るので、それが嫌なのかも知れません。Oracleとか、露骨にそいういうことをやりますよね。
緊急障害なので早く対応して欲しいのに、ビジネスインパクトがどうとかいう書類を書かされて、その内容によって対応の優先度を変えられたり。。そもそもビジネスインパクトを第一に考えるならクソ高い
データベースなんか採用したくありません。ただでさえ高いライセンス料を支払って、更に待たされないために書類を書かされるときました。お役所仕事ここにあり。これこそがベンダーロックインの最たるものと疑いません。

### 組織特性を踏まえたPerl採用のメリット

・言語として安定しており、長期運営に向く

サービスの長期継続を見込んでいるので、流行に左右されないのは大きなメリットです。
Perlはシステム開発に必要な機能が安定したレベルで一通り揃っています。リファレンスも
充実しているので、導入コストは低いと思います。

また、10年以上前に開発メンバーによって書かれたローカルライブラリでさえ、現役でバリバリ使えるのでとても助かります。
言語として後方互換性が保たれているのはかなり嬉しいことです。

### Perlを採用したことで起きている問題・デメリット

・モダンな開発に対する意識を育てにくい
・高品質な開発を推進しにくい

　言語の問題というよりも周りの環境の問題ですかね。
最新のフレームワークに触れたり、継続的インテグレーションを考えたり、OOPを意識したり、
そういったことを推進しにくいです。

　個人的には、言語のデメリットはないと思っています。
Rのように、大量データ加工に向かないだとかいうこともありませんし。

モダンな環境に触れていると、（それが良いか悪いかはともかくとして）最新の考え方を取り入れやすく
なります。何も考えずにPerlで書くと、OOPをやらずとも一枚岩のロジックで何とかなってしまいます。
開発規模も小規模なものが多いので、テストコードを書かなくても何とかなります。

ただ、ソフトウェア開発の質を高めようと思うと明らかなマイナスです。技術負債も大きくなります。
1000行近くもあるmain関数が一つだけの.plファイルは読みたくないですよね？

自由に書ける一方、良い書き方を啓発しづらいのはデメリットです。おそらく、Perlの最新書籍が少
ないのも原因の一つだと思います。

### 今後の展望

・フレームワークの使用
・より高品質な開発に耐えられるようにする

　現行システムは、構成としてはWebアプリです。フレームワークを使えばある程度効率的に
開発できると思います。フロントエンドは独自フレームワークっぽいものをJavaScriptとJQuery
を使って実装しているので、Mojoliciousを使うことも考えています。SPAを意識して作ら
れていますが、実装の欠陥も多いので、どうやって技術負債を返済するか考え中です。

また、TDDを推進するためにテストコード作成に力を入れたり、OOPを意識して柔軟な開発を
できるようにしたいと思っています。

　お客さんはシステム開発に重きを置くよりも、サービス開発に重きを置いています。
柔軟で変化に強く、すばやく結果を見られるように開発を行うことが、より求められ
ていくと思います。

できるだけソフトウェア開発の制約に縛られることなく、お客さんがやりたいことをやれる
ようになっていきたいと思います。

　記事を書いていて思いましたが、ソフトウェア開発の品質を制約するのは、使われる言語
ではなく開発者の意識の持ち方にありそうです。というわけで、今後も堂々とPerlを使って
楽しく開発を進めていこうと思ったのでした。

明日は[@hkoba](https://qiita.com/hkoba)さんです！
LaravelでPostgreSQLを使うための設定メモ

Laravel の公式ドキュメントが MySQL を使う前提になっているため、PostgreSQL を使うための設定をメモしておく。
（いろいろとまだ理解できていないので、あとで修正するかも）

# 前提条件
Laradock を使って Laravel をインストール済みであること。

# .env （ホスト） 

ホストからコンテナ内の PostgreSQL に接続する際に、すでに起動している PostgreSQL と競合しないようにポート番号 ```POSTGRES_PORT``` を変更しておく。

```shell:.env
# POSTGRES_DB=default
POSTGRES_DB=sample_db
POSTGRES_USER=default
POSTGRES_PASSWORD=secret
# POSTGRES_PORT=5432
POSTGRES_PORT=54320
POSTGRES_ENTRYPOINT_INITDB=./postgres/docker-entrypoint-initdb.d
```

# .env （コンテナ）

```DB_HOST``` を ```postgres``` に変更しておく。

```shell
docker-compose exec workspace bash
```

```shell:.env
# DB_CONNECTION=mysql
# DB_HOST=127.0.0.1
# DB_PORT=3306
DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
# DB_DATABASE=default
DB_DATABASE=sample_db
DB_USERNAME=default
DB_PASSWORD=secret
```

# データベース作成

コンテナ内に入り、```psql``` コマンドで DB 接続し、データベース ```sample_db``` を作成する。

```shell
docker-compose exec workspace bash
psql -U default -h postgres
```

```sql
create database sample_db;
```

migrate を実行し、```sample_db``` にテーブルが作られていれば正常に動作している（はず）。

```shell
php artisan migrate
```

# コンテナ起動・停止

```shell
# 起動
docker-compose up -d nginx postgres

# 停止
docker-compose stop

# 状態確認
docker-compose ps
```

# ホストからのDB接続

DBeaver から繋ぐ際の設定を載せておく。

![スクリーンショット 2018-12-02 20.54.03.png](https://qiita-image-store.s3.amazonaws.com/0/141299/c056ccb2-8cfe-6c11-e595-9d67321464bb.png)
C言語でmakeのいろいろ

## 概要

makeファイルについてのまとめ

## makeとは

makeは主にCやC++などのコンパイル型言語で記述されたプログラムを用意にビルドするためのツール。
「$ gcc -Wall -I../common/ -I. -DUTIL -g」とか毎回記述するのが面倒なので一つのコマンドでビルドを実行します。
最近ネットで見たのですがGolangでも良く使われているようですね。

面白い記事を見たので紹介します。
[Golang を使うなら Makefile を恐れるな](https://frasco.io/golang-dont-afraid-of-makefiles-785f3ec7eb32)

GNU Makeのサイト
https://www.gnu.org/software/make/

## makeを使ってみる

今回使用しているバージョンは下記です。
macならデフォルトで入ってます。

``` bash
$ make --version
GNU Make 3.81
```

## 基本情報

Makefileの基本形は下記の通り。
___インデントは、スペースではなく、必ずタブにしてください___


``` 基本形
[変数名] = 値
[作りたいもの]: [材料]
(-----TAB-----) [作り方]
```

## makeを試す

先ずは一つのファイルのコンパイルとバイナリ削除までを試します。
ソースは以下。

``` c:hello.c
#include <stdio.h>

int main(int argc, char **argv)
{
        fprintf(stdout, "Hello World!\n");
        return 0;
}
```

これをコンパイルしたりバイナリ削除したりするのはまだ容易です。
本領を発揮するのはまだですがそこまではとりあえず基本。

``` :Makefile
CC = /usr/bin/gcc

hello:
        $(CC) -o hello hello.c -g

clean:
        rm -f hello
```

上記ファイルを元にmakeを実行してみます。
今回はターゲット名にhelloと記載したので「make hello」として実行します。

``` bash
$ make hello
/usr/bin/gcc -o hello hello.c
$ ls
Makefile  hello  hello.c
$ make clean
rm -f hello
$ ls
Makefile  hello.c
```

次は複数ファイル同時にコンパイルとバイナリ削除の例です。
ターゲット名をallとしています。
またここでソースごとにオプションを書くのが面倒ってことでオプションをCFLAGSに代入してます。

``` Makefile
CC = /usr/bin/gcc
CFLAGS = -O4 -Wall -I/usr/local/include

all:
        $(CC) $(CFLAGS) -o hello1 hello1.c -g
        $(CC) $(CFLAGS) -o hello2 hello2.c -g

clean:
        rm -f hello1 hello2
```

## 自動変数

Makefileには文字数を減らすための仕組み自動変数がある。

|変数名|説明|
-------|---
|"$@"  |ターゲットファイル名|
|"$%"  | ターゲットがアーカイブメンバだったときのターゲットメンバ名|
|"$<"  | 最初の依存するファイルの名前|
|"$?"  | ターゲットより新しいすべての依存するファイル名|
|"$^"  | すべての依存するファイルの名前|
|"$+"  | Makefileと同じ順番の依存するファイルの名前|
|"$*"  | サフィックスを除いたターゲットの名前|
会社のバリューを浸透させるためにこっそりやってみたこと

これは、 [ClassiAdventCalendar2018](https://qiita.com/advent-calendar/2018/classi) ５日目の記事です。

今回は、 @keikomito から Wantedlyブログで紹介している[『Classi流、会社のビジョンとバリューの作り方。』](https://www.wantedly.com/companies/classi/post_articles/145931) のスピンオフとして、 "バリューを浸透させるための取り組み" についてご紹介していきたいと思います。

箸休めとして楽しんでいただけたら幸いです...。

##会社のバリューについて
Classiのバリューは、

- 経営サイドが大切にしている価値観、みんなに伝えたいメッセージを明文化
- これから拡大していく組織に対して、会社が大事にしたい価値観や想いを全員で紡いでいきたい
- 一人ひとりが日々の活動において判断基準になるものとして、現時点だけではなく、自分自身やチームが成長するストレッチ目標のようなものになるように

という思いのもと作成しました。

▼Classiのバリュー
![スクリーンショット 2018-12-05 3.34.50.png](https://qiita-image-store.s3.amazonaws.com/0/223776/e47b5ed6-75ff-8092-4919-7fe69355de0b.png)


##バリューを浸透させるためにこっそりやってみたこと

####1. こっそり Slack のスタンプを作成
バリューを会社のみんなにお披露目した時に、エンジニアの方が裏側でせっせと作ってくれました。感動して泣きそうになったのを今でも覚えています。※赤枠で囲ってあるスタンプ
![スクリーンショット 2018-12-05 2.08.11.png](https://qiita-image-store.s3.amazonaws.com/0/223776/70ef0341-647f-ae64-d7fa-24053a49c5b4.png)

####2. こっそり Unipos のハッシュタグに追加
Classiでは、ピアボーナス（成果給）を「感謝」と共に従業員同士で贈り合うことのできるツール ["Unipos"](https://unipos.me/ja/) を導入しています。
※参考：https://qiita.com/keikomito/items/7ec302b32de43578e79f

運営サイドで追加できるハッシュタグにバリューを忍ばせてみたら、みんなが自然に使い始めてくれました...（感動）
![スクリーンショット 2018-12-05 2.28.53.png](https://qiita-image-store.s3.amazonaws.com/0/223776/22ab5819-3abb-fc36-64d3-8eb75decdb50.png)
![スクリーンショット 2018-12-05 2.25.58.png](https://qiita-image-store.s3.amazonaws.com/0/223776/f0167f47-e30b-c7e4-9128-d002a67a5c51.png)

####3. こっそり会議室の名前をバリューにした
「今日は、 "Unlearn" でミーティングです」というのが度々、会話に登場してくるようになりました。いよいよ浸透してきた感...（違 
![47576322_378940409339609_2336752458618896384_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/223776/9808edeb-704f-7b96-c781-392275da6f1c.jpeg)

####4. こっそりマグネットを作成
これは、まだ使われているところを見ていません...が、会議室のホワイトボードにこっそり貼ってあります。
ここまでくると、もう止まりません。
![47307631_2337766709785374_7870616248109760512_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/223776/f1e25ab9-9ac6-76bd-5cc0-fce0f09dd439.jpeg)

####5. ついにパーカーを作成
もう、何屋なのかわからなくなってきました。そして、こっそりの領域を超えはじめました...。

今回のコンセプトは、　"普段使いできるかっこいいパーカー"　ということでデザイナーの方とただただかっこいいかどうかだけを追求してつくりました。目論見が当たり、今ではたくさんの人たちが日常で着用してくれています。
![スクリーンショット 2018-12-05 3.02.05.png](https://qiita-image-store.s3.amazonaws.com/0/223776/72fafc4f-80ef-8cd8-63f0-31c2ce7902e8.png)

##まとめ
実は、全ての取り組みにいろんな人が関わってくれて形になったものばかりで、みんなで一緒につくっていくということが バリュー浸透 への近道なんだなとつくづく実感しています。そして、その一つひとつをしっかり積み上げて  "Classiらしさ" を築いていけると良いなと思いました。
これからもバリュー浸透のためにいろんな角度からこっそりみんなで仕掛けていきたいと思います！

明日は、 @toku345 さんです！ お楽しみに〜♪
AIDEでハローワールドを作ってみた 

##まずはハローワールドから
下水道探検アプリ(仮)を作るために、まずはハローワールドが表示できるアプリを作ってみます。
スマホアプリを作ったことはないので、この記事に沿って進めます。
https://allabout.co.jp/gm/gc/431890/

##チュートリアルが増えてる
さて、AIDEをインストールして起動しました。
記事が2015年なので、AIDEがアップデートされてるのは当然ですが、チュートリアルが追加されていたので、とりあえず言われるがままにチュートリアルやりました。

##有料だったので断念
実はチュートリアルでハローワールドはできましたが、それ以上のチュートリアルは有料だったので、ここでチュートリアルは断念しました。引き続き記事に従って進めます。

##端末ファイルへのアクセス権が必要
セキュリティとかよく分からないので、アクセス権とかを聞かれたらすべて拒否してます。
でも、アプリ作るのにファイルアクセス権をAIDEに与えないと始まらないので、アクセス許可したところ、記事の通りファイルが生成されました。

##日本語入力できない
記事では、"hello world!"を"こんにちは。世界！"に書き換えてみましょうって内容でしたが、既定のIMEだと日本語入力ができませんでした。

##他で入力した日本語をコピペした
調べてみると、専用のIME入れたり色々方法があるようですが、一番楽な、ブラウザとかの検索窓に入れた言葉をコピペ、という方法で対処しました。

##提供元不明なアプリのインストール
AIDEで作ったアプリを走らせてみようとすると、作ったアプリを端末にインストールする形になります。
当然このインストールはストア経由じゃないので、提供元不明アプリのインストールを許可しないと入りません。
セキュリティ良く分からないのに、この許可を与えるのは不安ですが、使い終わったら毎回許可切るって感じでやります。

##できた
"すべてのアプリ"の一覧に、今回作った"MyApp"ができました。嬉しい。

##次は文字サイズとか変えてみる
日本語入力の仕方を紹介していたこのサイトには、簡単な応用が載っていたので、次はこの記事に従って進めてみます。
http://blog.livedoor.jp/nexusseven975/archives/30749750.html
Spigot1.13.2にMultiverse2.6.0を導入してみた

#Multiverseとは
Minecraftのマルチサーバプラグインの一つで、複数のワールドを管理することができ、ワールド間の移動も可能にする。
資源用ワールドと本ワールドを分けるなどの使い方ができる。
2018年12月2日現在、Multiverseは最新バージョンである1.13.2に対応していないが、試験的に開発版のMultiverseを導入してみた。

*注意
互換性のあるバージョンではないので、何が起こるか分かりません。導入する場合は必ずバックアップの上、自己責任でお願いします。*

#最新版のMultiverseをダウンロード
[Multiverse公式](https://dev.bukkit.org/projects/multiverse-core)サイトのDev Buildsから最新の開発版Multiverseをダウンロードする。
正式版ではなく、開発版です。"Download Latest File"からではダウンロードできません。


#Modを適用
通常のプラグインと同様、ダウンロードした"multiverse-Core-x.x.x.jar"をpluginフォルダに移動し、サーバを再起動する。

サーバコンソールにて、「pl」コマンド実行後、プラグインの一覧の中に緑字で"Multiverse-Core"があればとりあえずはインストール完了です。
pluginsフォルダにMultiverse-Coreフォルダが生成され、その中に"config.yml","world.yml",scriptsフォルダがあれば問題ありません。

#動作テスト
以下の環境で簡単な動作テストを行いました。


サーバ環境

|項目 | 値 | バージョン |
|:------------|:----------|:---------------------|
| サーバOS    | CentOS     | 7.4                  |
| サーバ      | Spigot     | 1.13.2-RO.1-SNAPSHOT |

---
プラグイン構成

|導入プラグイン | バージョン |
|:---------|:----------|
| Multiverse Portals   | 2.5.0 |
| Multiverse Core      | 2.6.0 |
| Per World Inventory  | 2.2.1 |

---

行ったコマンドは

* mv creative （ワールドの作成）
* mv list （接続できるワールドの表示）
* mv tp （ワールド間の移動）
* mv delete （ワールドの削除）
* mvpc （ゲートの作成）
* mvpc xxx p:yyy （ゲートの接続）
* mvpc remove （ゲートの削除）
* その他、表示系のコマンド

です。どのコマンドも設計通りの動作が確認できました。
また、ワールド間移動ゲートを作成する[Multiverse Portals](https://dev.bukkit.org/projects/multiverse-portals)、インベントリを管理する[Per World Inventory](https://www.spigotmc.org/resources/per-world-inventory.4482/)プラグインについても基本的な動作の確認はできました。

多少バグはあるかもしれませんが、とりあえずエラーが表示されたり、プラグインが動作しないなどの現象は起きませんでした。


#参考リンク
Multiverse → https://dev.bukkit.org/projects/multiverse-core
Multiverse Portals → https://dev.bukkit.org/projects/multiverse-portals
Per World Inventory → https://www.spigotmc.org/resources/per-world-inventory.4482/
Bukkit Spigot Japan Wiki → https://wiki.craftportal.jp/view/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E8%A7%A3%E8%AA%AC:Multiverse-Core
Minecraft Japan Wiki → https://www26.atwiki.jp/minecraft/pages/1432.html
[python]Beautifulsoupとseleniumを使ってDアニメストアをスクレイピングし、人気アニメランキング作ってみた

# 動機
- 今世間でどんなアニメが人気なのかを客観視したい

# 何をやるか
- アニメ配信サイトとしては最大手であるDアニメストアから全アニメのお気に入り数をスクレイピングで取得し、多いものから順にCSV出力する。

# 使用技術
- python3.7.0
- selenium 
    - pip install seleniumでインストール出来ます。
- Beautifulsoup
    - pip install beautifulsoup4でインストール出来ます。
- Chrome Driver
    - [Downloads - ChromeDriver - WebDriver for Chrome](https://sites.google.com/a/chromium.org/chromedriver/downloads)からダウンロード出来ます。 

# 実装

```anime_scraping.py
from selenium import webdriver
from bs4 import BeautifulSoup
from time import sleep
import csv

# リンク文字列
hiragana_list = [
    "あ", "い", "う", "え", "お", "か", "き", "く", "け", "こ", "さ", "し", "す", "せ", "そ",
    "た", "ち", "つ", "て", "と", "な", "に", "ぬ", "ね", "の", "は", "ひ", "ふ", "へ", "ほ",
    "ま", "み", "む", "め", "も", "や", "ゆ", "よ", "ら", "り", "る", "れ", "ろ", "わ", "を", "ん"
]
driver = webdriver.Chrome(executable_path="chromeドライバの保存先パス")
driver.get("https://anime.dmkt-sp.jp/animestore/c_all_pc?initialCollectionKey=1")
results = {}
for hiragana in hiragana_list:
    # 最初のアクセス時以外、五十音順にクリックで遷移
    if hiragana != "あ":
        continue_link = driver.find_element_by_link_text(hiragana)
        continue_link.click()

    html01 = driver.page_source
    # 最後までページスクロール
    while 1:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        sleep(1)
        html02 = driver.page_source
        if html01 != html02:
            html01 = html02
        else:
            break

    soup = BeautifulSoup(html01, "html.parser")
    titleAndFavoriteCounts = soup.find_all(class_='textContainerIn')

    # {アニメタイトル: ファボ数}
    for titleAndFavoriteCount in titleAndFavoriteCounts:
        title = titleAndFavoriteCount.find(class_='ui-clamp webkit2LineClamp').get_text()
        favoriteCount = int(titleAndFavoriteCount.find(class_='favoriteCount').get_text())
        results[title] = favoriteCount

driver.close()
driver.quit()

sorted_results = {}
# 降順にソート
for k, v in sorted(results.items(), key=lambda x: x[1], reverse=True):
    sorted_results[k] = v

field_names = ['anime_title', 'favorite_count']

# csv出力
with open("anime_ranking.csv", "w") as f:
    writer = csv.writer(f, delimiter=';')

    # ヘッダー
    writer.writerow(field_names)

    # 各行
    for anime_title, favorite_count in sorted_results.items():
        writer.writerow((anime_title, favorite_count))


```
# 結果
- 全アニメ数2657本
- 以下にお気に入り数top20を示す

<img width="509" alt="スクリーンショット 2018-12-02 20.18.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/190081/464e510e-2200-38ab-0fdb-72802b0c5569.png">

# 考察
- やっぱ最近のアニメは強い。当たり前か。
- SAOtueeeee。キリトさんさすがっす。
- ラノベ原作アニメが強い。top20のうち実に14本をラノベ原作アニメが占めることとなった。
- 逆にオリジナルアニメが一本も無い。やはり原作ものの方が多くの人が触れる機会があるということだろうか。
Akkaについての勉強メモ

## Akkaとは何か？

- ScalaとJavaで使える、並行処理を実現するためのツールキット
- ツールキットであたフレームワークではないため（ScalaのPlay Framework2などに組み込まれていたりする）

## Akkaで出てくる概念

- Actors
- ActorSystem
- mailboxes
- switching actor behaviors.
- Supervision 
- Monitoring
- actor life cycle
- actor hierarchy
- Routing Messages
- Akka dispatcher 
- Futures 
- Agents
- Akka scheduler 
- Akka Persistence
- Akka Clustering
- Akka Streams
- Akka HTTP
- Lagom

## Actorについて

## Akka Patterns

## 参考文献・情報源

- [アクターモデル - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%A2%E3%83%87%E3%83%AB)
- [並行処理初心者のためのAkka入門](https://www.slideshare.net/sifue/akka-39611889)
- [Akka Cookbook](https://www.amazon.co.jp/Akka-Cookbook-Hector-Veiga-Ortiz/dp/1785288180/ref=sr_1_1?ie=UTF8&qid=1543748065&sr=8-1&keywords=akka+cookbook)
- [Source code of Akka Cookbook](
https://github.com/PacktPublishing/Akka-Cookbook
)
確認ダイアログの戻り値はPromiseにしよう

# 確認ダイアログは共通関数になりがち

確認ダイアログを表示する処理って、ベタに書くとこんな ↓ 感じ。

```javascript:ベタ.js
function sample0() {
  // 確認ダイアログ表示
  if (!window.confirm('Are you ready?')) {
    return;
  }

  // ※OK時の処理
  console.debug('OK');
}
```

`window.confirm`を直に呼び出すのは如何なものかと、こんな ↓ 共通関数を定義したりする。

```javascript:共通関数_boolean.js
//----------------
// 共通関数
//----------------
function confirmExBoolean(message) {
  // 戻り値はboolean
  return window.confirm(message);
}

//========================================

function sample1() {
  // 確認ダイアログ表示
  if (!confirmExBoolean('Are you ready?')) {
    return;
  }

  // ※OK時の処理
  console.debug('OK');
}
```

これをさらに、`Promise`[^promise]を使ったこういう ↓ 感じにしておきたい。

```javascript:共通関数_promise.js
//----------------
// 共通関数
//----------------
function confirmExPromise(message) {
  if (window.confirm(message)) {
    return Promise.resolve();
  }
  return Promise.reject();
}

//========================================

function sample2() {
  // 確認ダイアログ表示
  confirmExPromise('Are you ready?')
    // ※OK時の処理
    .then(function() {
      console.debug('OK');
    });
}
```

# なぜ Promise にしたほうがいいのか?

jQuery UI などを使用した確認ダイアログでは、ボタンクリック時の処理をコールバック関数で定義することが多い。(別の記事で書いた →  [jQuery UIで確認ダイアログを表示する](https://qiita.com/pale2f/items/2f4ae16991bb03c05350))
これは、`window.confirm`を使用しないダイアログ表示では処理を止められないからだ。

このため、最初の例のように確認ダイアログの結果を boolean で返す関数では色々と具合が悪い。あとから仕様変更が発生したときとか。

かといって、`Promise`が普及した今[^polyfill]、コールバック関数というのもいまいち。コールバック関数は`Promise`に包んでしまおう。こんな ↓ 感じ。

```javascript:showConfirmDialogを応用した共通関数.js
//----------------
// 共通関数
//----------------
function confirmExPromise(message) {
  var _promise = new Promise(function(resolve, reject) {
    // ※別途定義されたコールバック関数を受け取る関数を呼び出す
    showConfirmDialog(message, resolve, reject);
  });
  // 戻り値はPromise
  return _promise;
}

//========================================

// ※sample2と同じ
function sample3() {
  // 確認ダイアログ表示
  confirmExPromise('Are you ready?')
    // ※OK時の処理
    .then(function() {
      console.debug('OK');
    });
}
```

## 副次的な効果

確認ダイアログの戻り値がbooleanだと、処理がダラダラ記述されがち。
このインターフェイスなら、必然的にOK時の処理が関数に分割される。すっきりする。
また、戻り値が`Promise`なら、Cancel時の処理もすっきり書ける。

```javascript:すっきりした.js

// (共通関数部分は省略)

function executeTask() {
  console.debug('OK!');
}

function cancelTask() {
  console.debug('Cancel!');
}

function sample4() {
  // 確認ダイアログ表示
  confirmExPromise('Are you ready?')
    .then(executeTask)  // ※OK時の処理
    .catch(cancelTask); // ※Cancel時の処理
}
```

# 最後に

まとめたものをCodePenに置いておきます。

<p data-height="265" data-theme-id="0" data-slug-hash="MzLqNy" data-default-tab="js,result" data-user="pale2f" data-pen-title="確認ダイアログの戻り値はPromiseにしよう" class="codepen">See the Pen <a href="https://codepen.io/pale2f/pen/MzLqNy/">確認ダイアログの戻り値はPromiseにしよう</a> by pale2f (<a href="https://codepen.io/pale2f">@pale2f</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


[^promise]: https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Using_promises
[^polyfill]: IEの人はpolyfillを使いましょう。
jQuery UIで確認ダイアログを表示する

# 概要

`window.confirm`[^confirm-api]のかわりに、[jQuery UI の Dialog](https://jqueryui.com/dialog/)で確認ダイアログを表示してみましょう。

## 確認環境

|           | Version |
| :-------: | :-----: |
|  jQuery   | 1.12.4  |
| jQuery UI | 1.12.1  |

# 実装コード

以下の様に`showConfirmDialog`関数を定義します。
引数として、`message`の他に**各ボタンクリック時のコールバック関数を渡す**ようにしましょう。

```javascript:showConfirmDialog.js
/**
 * 確認ダイアログを表示します。
 * @param  {String} message ダイアログに表示するメッセージ
 * @param  {Function} [okFunction] OKボタンクリック時に実行される関数
 * @param  {Function} [cancelFunction] Cancelボタンクリック時に実行される関数
 */
function showConfirmDialog(message, okFunction, cancelFunction) {
  // Dialogを破棄する関数
  var _destroyDialog = function(dialogElement) {
    dialogElement.dialog('destroy'); // ※destroyなので、closeイベントは発生しない
    dialogElement.remove(); // ※動的に生成された要素を削除する必要がある
  };

  // Dialog要素(呼び出し毎に、動的に生成)
  var $dialog = $('<div></div>').text(message);

  // 各ボタンに対応する関数を宣言
  // ※Dialogを破棄後、コールバック関数を実行する
  var _funcOk     = function() { _destroyDialog($dialog); if (okFunction)     { okFunction();     } };
  var _funcCancel = function() { _destroyDialog($dialog); if (cancelFunction) { cancelFunction(); } };

  $dialog.dialog({
    modal: true,
    title: '確認',

    // 「閉じる」の設定
    // ※Cancel時の処理を「閉じる」に仕込むことで、Cancelと「閉じる」を同一の挙動とする
    closeText: 'Cancel',
    closeOnEscape: true,
    close: _funcCancel,

    // 各ボタンの設定
    buttons: [
      { text: 'OK',     click: _funcOk },
      { text: 'Cancel', click: function() { $(this).dialog('close'); } } // Dialogのcloseのみ
    ]
  });
}
```

このコードのポイントは以下です。

- Dialog 用の要素を動的に生成している
  - Dialog を閉じるときに、要素を削除する必要がある
- Dialog を「閉じる」挙動と、Cancel ボタンクリック時の挙動を同一にしている

詳細はコード中のコメントをご参照ください。

# 使い方

こんな感じです。

<p data-height="265" data-theme-id="0" data-slug-hash="QJYxrK" data-default-tab="html,result" data-user="pale2f" data-pen-title="jquery.ui-confirm" class="codepen">See the Pen <a href="https://codepen.io/pale2f/pen/QJYxrK/">jquery.ui-confirm</a> by pale2f (<a href="https://codepen.io/pale2f">@pale2f</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 最後に

久しぶりに jQuery を書きましたが、まだまだ捨てたもんじゃないなと思いました。

この記事は、別記事への布石として書きました。
↓の方にある*「この記事は以下の記事からリンクされています」* からリンクされてると思います。

[^confirm-api]: https://developer.mozilla.org/ja/docs/Web/API/Window/confirm