OmniAICreator/Qiita-1.07M huggingface dataset:
【SQL】char型とvarchar型の違いについてまとめてみた

1年目ぐらいの時、DBとか弄ってるときに思った「charとvarcharって何が違うんだ…？」というところの当時のメモを発掘したので、改めてまとめてみたました。


##char型とは
・固定長文字列のことを指す。
・char(m)という形で指定する。mは文字数。0~255まで。
・charcter(m)の略。

・指定した文字数以下の文字を格納した時、文字列末尾に必要な分の空白を付け加えて指定の長さの文字列として格納する。
・値を取得する場合や比較する場合は、末尾の空白は削除された状態で取得や比較が行われる。


##varchar型とは
・可変長文字列のことを指す。
・varchar(m)という形で指定する。mはバイト数。0~65535まで。
・character varying(m)の略。

・char型と異なり、末尾に空白は付かない。
・末尾に空白が付いた文字列はそのまま格納される。
・↑の場合、取得時も空白が付いたままだが、WHERE句での比較時には削除された状態で比較が行われる。


##メリット・デメリット
・char型
メリット:文字数が固定のため、処理が早く一定。
デメリット:文字数が必ず定まった分格納されるため、メモリを圧迫しやすい。

・varchar型
メリット:指定された分だけメモリに格納されるため、効率がいい。
デメリット:文字数が値ごとに違うため、処理は遅く不定となる。
手の輝きを取り戻したいあなたへ

この記事は[クラッピーチャレンジアドベントカレンダー2019](https://adventar.org/calendars/4222?fbclid=IwAR1R5JARl-7czdiHFMoUmZYtWMbXm8eN3CwOjKe0BfUuxknZYhSFDaBdhRY) 16日目の記事になります。

**クラッピーは手が命！**
![バイバイワールド](http://blog.byebyeworld.co.jp/wp-content/uploads/2017/04/IMG_5533-e1493188214467-768x1024.jpg)
「帰ってきたパチパチクラッピー」は[手が光ったりします](https://omocoro.jp/bros/kiji/203652/)。
![ブロス！](https://omocoro.jp/assets/uploads/2019/10/15723404335arwr.jpg)

が、やはりヒカリモノの宿命。電池が切れると輝きを失ってしまいます。
じゃあ電池交換を・・・と言いたいところですが、残念ながらクラッピーの手の中に入っているモジュールは電池交換ができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/7120ca5e-7cf1-7d78-e309-c36506681a5c.png)

じゃあどうすれば・・・とお困りのあなたに朗報です。
秋葉原ラジオデパート3Fの[Shigezone](https://twitter.com/ShigezoneAkiba/status/1202517877032488962/photo/1)で **似たようなものが手に入ります！**
![Shigezone](https://pbs.twimg.com/media/ELAzoU2VUAEk7EE?format=jpg&name=4096x4096)

ただ、もともと入っていたものとは形が違うので、そのままでは手の中に入りません。
![IMG_8376.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/8a828c55-d163-5fe3-4a21-2ac148fa0cb8.jpeg)

そこで、クラッピーの手の内側にある突起をカットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/7120ca5e-7cf1-7d78-e309-c36506681a5c.png)　　　![2019-12-13_103959.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/d65361ca-bc64-5e34-352d-03e9827af088.png)

新しいモジュールを組み込むことができました！
![IMG_8373.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/ee09e464-165d-8ba5-1f07-944340c1f398.jpeg)

それではよいクラッピーチャレンジを
設定ファイルの語尾に付くrcの意味とは？


# 参考

[こちらがとても分りやすく参考になりました！](https://amzn.to/2zNLPdf)

# アンサー

.bashrc, .vimrcなどよく使われている`rc`は`run command`の略らしいです。使う機会がありましたら、`アールシー`ではなく、`ランコ マンド`(ドヤ顔)と言ってみてはいかがでしょうか。
データ設定のテスト自動化

## 1. はじめに
とあるスマホ向けゲームアプリのQAを担当しています。
クエストデータのテストを一部自動化できたので紹介します。

## 2. 背景
* クエストにはステージ毎に、登場する敵やそのスキル、行動パターンなどが設定されている
* プランナーがExcelでクエストデータを作成している
* 開発環境の管理ページ(Rails)でデータ設定が確認できる
* クエストデータの設定値の組み合わせによってNGとなるパターンがある
 * 敵スキルと行動パターンが適切な組み合わせになっていない
 * あるキャラクターが違うキャラクターのスキルを使ってしまう 等

<img width="300px" alt="20191213_171113.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541170/3990588b-77bf-d4ee-a214-f2ed5d827072.png">

これらは進行不能や、世界観的にNGとなるので不具合となります。
再現工数が高い、キャラクターの知識が必要など検知しづらく、自分のチームではノウハウのあるテスターに頼っている状況でした。

## 3.やったこと
**クエストデータにNGパターンがあると、管理ページにワーニングメッセージを表示する様にしました。**

具体的には
1. テストケースとテスト担当者からのヒアリングで実装すべき項目をリストアップ
2. 検証したいデータのカラム名、NGとなる値の範囲と組み合わせ条件を整理
3. 上記の条件で管理ページにメッセージを表示するようにエンジニアへ実装を依頼

<img width="300px" alt="20191213_182154.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541170/d7556664-1023-c685-b2f3-fd8512f7b270.png">

|観点 |カラム | 条件 |
|---|---|---|
|敵スキルと行動パターンが適切な組み合わせになっていない |skill_id, attack_pattern |物理スキル(id:10xxxxx)の時、行動パターン1～5以外が設定されている |
|あるキャラクターが違うキャラクターのスキルを使ってしまう |character_id, skill_user |character_idとskill_userが一致しない |

## 4.よかったこと
QAでは一般的に仕様書を元にテストすると思いますが、ルールベースでのテストなのでデータの仕様書自体が間違っていた場合でもNGを検知することができます。
今回はサーバ側で実装してもらえたのですが、SpreadsheetやExcelで関数を組み合わせてQA側でテスト用のシートを作る場合と比較して以下のようなメリットがあります。

* 設定するプランナー側でも確認でき、NGが無いか一発でわかるのでQA前品質が上がる
* マスタデータを取得してシートに流し込む手間がないのでQA工数が減らせる

また、自分のチームでは属人化していたテストを他のテスターでも実施できるようになりました。

## 5. まとめ
データ設定のテストにを効率化したいと考えている方に、こういった方法もあることを知っていただければ幸いです。
もちろんエンジニアの実装・メンテナンス工数が必要になりますが、メリットは小さくないので可能であれば提案してみてください。
No module named 'libs.resources'が出た場合の解決方法

## 事の発端
yoloとかSDDやるためにアノテーションのツールを使う必要がある。
↓
labelImgというアノテーションツールをwindows10にインストールして使いたい。
↓
labelImgはコマンドラインにpython labelImg.pyと打つことで起動するツールらしいので、webサイトの説明どおりにやってみた。
↓
No module named 'libs.resources'のエラーが出た（←今ここ）

## 動作環境
windows10
anaconda

## エラーが出た流れ
はじめに自分が参考にしたサイトはここ
https://haitenaipants.hatenablog.com/entry/2018/06/09/235950
「labelImg インストール Windows10」などと検索すると、このサイトがトップに出る状況なので、他の人も同じエラーになると思う。(自分は解決に結構時間がかかりました。)
このサイトに書かれている通りに実行したら、次のコマンドで以下のエラーが出た。

```
python labelImg.py
[エラーの内容]
No module named 'libs.resources'
```
つまり、libs.resourcesというモジュールがないという警告。

結果から書くと、１つ前に実行しているコマンドが間違っていて、

```
pyrcc5 -o resources.py resources.qrc
```
ではなく、

```
pyrcc5 -o libs/resources.py resources.qrc
```
というコマンドが正しい。
つまり、git cloneでダウンロードしたフォルダの中にあるresource.qrcファイルから、libsというフォルダにresource.pyが作成されなければならない。
（なので、実行前後でlibsフォルダにresource.pyが作成されたことを確認するとよい）

## さらにエラーとなる
このあとに、python labelImg.pyを実行すると、今度は次のエラーが発生する。

```
ModuleNotFoundError: No module named 'lxml'
```
このエラーに関しては、以下のようにpipでlxmlをインストールすれば解決する。

```
pip install lxml
```

改めて以下のコマンドを実行する

```
python labelImg.py
```

LabelImgの起動に成功。やったぜ。
<img width="712" alt="labelImg.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262477/8583ec84-827c-e8a7-d523-5490f48e9074.png">

## まとめ
自分が再度やる場合は、以下のようにlabelImgをインストールします。(Windows10の場合)
・git bash を起動して、 IabelImgフォルダをおきたいフォルダに cd で移動する。
↓
・git clone でlabelImgをダウンロードする。

```
git clone https://github.com/tzutalin/labelImg.git
```
↓
anacondaを起動して、Terminalを立ち上げて以下の内容を実行する。

```terminal
# labelImgのGUIはPyQt5を利用しているためPyQt5をインストールする
pip install PyQt5

# インストールされたことを確認する
pip list

# labelImgのディレクトリにcdで移動する
cd xxxx/xxxxx/labelImg

# libsフォルダにresource.pyを作成する
pyrcc5 -o libs/resources.py resources.qrc

# labelImgを起動するも、lxmlがないのでエラーが出ることを確認する
python labelImg.py
~(省略)~
ModuleNotFoundError: No module named 'lxml'

# lxmlをインストールする
pip install lxml

# 再度labelImgを起動する
python labelImg.py
```
【Perl】動的に<input type="file">を増やし、複数ファイルをサーバにアップロードする

#なぜmultiple属性を使わないのか？
HTML5を日頃から使用している方なら複数ファイルアップロードを実装する場合、multiple属性を使うことを真っ先に思いつくと思いますが、今回はあえてmultiple属性を使用せずに、一つファイル選択が終了したらまた真下に次の<input type="file">タグを増やしていくようにしました。というのも、クライアント端末のブラウザのバージョンが古く、HTML5に対応していないからという業務上の都合です。

#前提条件
-サーバにPerlをインストールしていること
-jqueryをサーバ上に配置していること

#機能
-動的に<input type="file">タグを増やし、複数ファイルアップロードができる。
-<input type="file">タグに個数制限を設ける。

##フロント側処理
```perl:uploadform.cgi
#!/usr/bin/perl
#アップロードフォーム
#メイン

&disp

#画面部HTML
sub disp{
print <<EOM;
	<form action="upload.cgi" method="post" enctype="multipart/form-data">
		■アップロード
		<ul id="filelist">
  			<li><input type='file' name='uploadfile[]' maxlength='1'  size='155' class='fileinput' accept='csv'  /></li>
		</ul>
		<p><input type="submit" value="アップロード" style= " position: relative; left: 800px; top:0px;" class="$buttonstyle" /></p>
	</form>
EOM
}

#スクリプトルーチン
sub check_js{
	
print <<EOM;
	<SCRIPT language="JavaScript" src="/hogehoge/jquery-1.12.4.min.js"></SCRIPT>	
	<script>
	var cnt = 0; //カウンタ変数
	const max = 100; //アップロード上限数
	/*アップロードフォームにファイルが選択されたら下にアップロードフォームを追加する*/
	\$\("document").ready(function(){
	\$\(".fileinput").change(fileInputChange);
	});
	function fileInputChange(){
		if(cnt < max ){
			if(\$\(".fileinput").last().val() != ""){
				\$\("#filelist").append('<li><input type="file" name="uploadfile[]" maxlength="1"  size="155" class="fileinput" accept="text/comma-separated-values" /></li>')
				.bind('change', fileInputChange);
				cnt++;		
			}else{
				setTimeout("fileInputChange()", 3000);
			}
		}			
	}
	</script>		
EOM
}
```
##サーバ側処理
```perl:upload.cgi
#!/usr/bin/perl

#リダイレクトする
print "Location: /hogehoge/uploadform.cgi/\n\n";

use CGI;
$CGI::POST_MAX = 1024 *1024 *10;
my $form = new CGI;

#複数のアップロードファイルを配列に挿入
my @uploadfile = $form->param("uploadfile[]");

# ファイルを保存する。
foreach my $upfiles(@uploadfile){
	@newfile = split /\\/, $upfiles;
	$newfile = pop @newfile;
	open (OUTFILE,">/home/foo/upload/$newfile") or die "Can't make serverside file!\n";
	while ($bytesread = read($upfiles,$buffer,1024)) {
  		print OUTFILE $buffer;
	}
}
close OUTFILE;
```

#あとがき
サーバ側の処理はmultiple属性を使用しても変わりません。
ここまで読んだならお気づきかと思いますが、まごうことなきウンコードです。
使用可能なら素直にmultiple属性を使おう！
フロントエンド側は[こちらのサイト](https://php-archive.net/javascript/upload-multiple-files/)を参考にさせていただきました。
サーバ側は[こちらのサイト](http://good-stream.com/goodstream/perl/tips/upload.html)を参考にさせていただきました。
正規表現を簡単にまとめてみた

未来電子テクノロジーでインターンをしているyasungaといいます。
今回は正規表現についてまとめました。
#正規表現とは？
正規表現とは ***ある文字列を一つの文字列で表すための表現方法のこと***です。
長い文章から特定の文字列を検索するのによく使われています。
文章だけだといまいちわからないと思うので一つ例を挙げます。
例えば以下のような文章から「」を検索したいとき
このような文字のことを***メタ文字***といいます。
#メタ文字
メタ文字とはそれ自体が特殊な意味を持つ記号のことです。
メタ文字を普通の文字列として出力したいときは
```\.```
のように***バックスラッシュを先頭につけることで普通の文字列として出力***できます。
#メタ文字の種類
メタ文字にはたくさんの種類があります。
今回は使用頻度の高いものをまとめました。

| メタ文字 | 意味 |
|:-:|:-:|
| . | 全ての文字とマッチ |
| * |　１つ前の文字を繰り返す　　|
| ^ | 行の先頭の文字とマッチ |
| $ |  行の末尾の文字とマッチ |
| A｜B | AかBのどちらかとマッチ  | 
| [X] | []内で指定した文字とマッチ  |  
| [X-Y] | XとYの範囲で指定した文字とマッチ  |  
| [^X] | []内で指定した文字以外とマッチ | 
| (X)|   複数の文字を指定|   
#正規表現のバックスラッシュ
バックスラッシュはメタ文字をエスケープ（普通の文字列として出力）するだけではありません。***特定の文字と合わせて使うことでメタ文字として扱う***ことができます。これをエスケープシーケンスといいます。
以下の表によく使うエスケープシーケンスをまとめました。

| メタ文字 | 処理 |
|:-:|:-:|
| \n  | 改行コード  |
| \t  |  タブ |
| \s  |  すべての空白文字（半角スペース、タブなど） |
| \d  |  数字（[0-9]と同じ） |
| \w  |  すべてのアルファベットとアンダースコアから任意の一文字 |
| \l  |  すべての半角英小文字のうち一文字 |
| \u  |  すべての半角大文字のうち一文字|
| \0  |  　NULL文字 |

また上図の\sから\uは***大文字を使うことで指定した文字以外の文字を出力***します。
#まとめ
今回は正規表現の基本的なことを簡単にまとめました。今回まとめたこと以外にもメタ文字やエスケープシーケンスなどの制御文字も存在し、結構奥が深いなと感じました。
#参考文献
[サルにもわかる正規表現入門](https://www.mnet.ne.jp/~nakama/)
[正規表現：メタ文字（特殊文字）の一覧](http://www-creators.com/archives/2612)
Vim から conda を使って Python 環境を切り替えられる vim-conda が便利

空いていたので穴埋め。

# はじめに

Python をお使いの皆さんならば、各アプリケーションを入れる際に conda を使って環境を綺麗に保っていると思います。

また Vim で Python スクリプトを実行する際には thinca さんの QuickRun を使ったりしてると思います。さらには Python Language Server を起動して入力補完を行ったりもするでしょう。そういった場合、いちいち Vim を終了して conda で activate して、とやるのは手間ですよね。

# 重い conda ら

そこで vim-conda です。

https://github.com/cjrh/vim-conda

vim-plug をお使いであれば以下を vimrc で指定して `:PlugInstall` でインストールできます。

```
Plug 'cjrh/vim-conda'
```

# 使い方

`:CondaChangeEnv` を実行すると選択可能な conda env が表示されます。

![terminal7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665/7fd1b059-2ae7-50e4-1495-30329b518e23.gif)

選択すれば内部的に activate され、それ以降に実行される python コマンドから有効になります。

# おわりに

Vim を起動しっぱなしにしたい人には vim-conda は便利。
A-FRAME: 物理演算でボーリングっぽい動きを実現してみる１１（これまでのまとめ）

A-Frameをつかって物理演算をできるようにしてみます。
これまで１０回の記事を通して、物理演算ライブラリについて学んできました。

- [A-FRAME: 物理演算でボーリングっぽい動きを実現してみる１（ボールの速度）](https://qiita.com/matsukatsu/items/7b5a2bddecd1102e18a2)
- [A-FRAME: 物理演算でボーリングっぽい動きを実現してみる２（ボールの形状）](https://qiita.com/matsukatsu/items/9a3b6b81a35f9f867ca4)
- [A-FRAME: 物理演算でボーリングっぽい動きを実現してみる３（ボールの重さ）](https://qiita.com/matsukatsu/items/50feef3430b323bfb43f)
- [A-FRAME: 物理演算でボーリングっぽい動きを実現してみる４（ボールの平行移動への抵抗）](https://qiita.com/matsukatsu/items/cea871316cdb0a1d8526)
- [A-FRAME: 物理演算でボーリングっぽい動きを実現してみる５（ボールの回転への抵抗）](https://qiita.com/matsukatsu/items/ce5adede728a7ad0d380)
- [A-FRAME: 物理演算でボーリングっぽい動きを実現してみる６（ピンの形状）](https://qiita.com/matsukatsu/items/c5571725cad4455e3f15)
- [A-FRAME: 物理演算でボーリングっぽい動きを実現してみる７（ピンのモデル）](https://qiita.com/matsukatsu/items/c6f252bbeb181c74cbe7)
- [A-FRAME: 物理演算でボーリングっぽい動きを実現してみる８（ピンの物理的形状の中心）](https://qiita.com/matsukatsu/items/c21d71424c0dae4d26c9)
- [A-FRAME: 物理演算でボーリングっぽい動きを実現してみる９（ピンに複合シェイプの基本形状を適用する）](https://qiita.com/matsukatsu/items/da9c0b1d6c3acbe03247)
- [A-FRAME: 物理演算でボーリングっぽい動きを実現してみる１０（ピンに複合シェイプの基本形状を複数適用する）](https://qiita.com/matsukatsu/items/ead20097156b7bfad521)

他にも色々な機能がありますが、ボーリングっぽい動きを実現するのに必要な機能は一通り検証できた気がするので、ここらでボーリング場を実装してみたいと思います。

ボーリング場のモデルを拾ってきて、ピンを１０本並べ、ボールの色や重さ・速度を調整し、ボールの転がりタイミングを調整し、ライトを設置してボーリング場ができました。
では、ボールを転がしてみます。

![lane.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/b2b6fd22-1ad2-60e6-af5e-c8d96e8d2d99.gif)
[demo](https://k38.github.io/aframe/physics-system/lane.html)

それっぽくなった気がします。

## さいごに

ボーリング場としては質感や影、音などを実装する事で、よりリアリティを出せるのではないかと思います。

物理演算ライブラリについては、
- mesh、hullの形状の使い方
- 普通のシェイプと複合シェイプのcylinderの特性が違う
- 複合シェイプのcylinderでtopとbottomが逆転しているように見える
- 四元数をうまく扱えない（理解できていないから）
あたりがまだ理解できていないのと、未使用の機能があるので、また別のテーマでチャレンジしてみようと思います。

今回初めて物理演算に取り組んだのですが、次回はシーンを作る際にはスケールと同時に、重さも現実の比に合わせて作るようにします。

最後に、途中で気づいていたのですが、 `ボーリング` ではなくて `ボウリング` と書くべきだったようです。

## 参考

今回利用させて頂いたモデル

- [Bowling Alley Mozilla Hubs Room, Lazanja](https://sketchfab.com/3d-models/bowling-alley-mozilla-hubs-room-644609db6a5a435098b305413b162266)
- [Bowling Pin, MSerdar Tekin](https://sketchfab.com/3d-models/bowling-pin-028ccb945012460aa9056ffda5b53e20)
『作って動かす ALife』の1章を完全理解した

これは『作って動かす ALife』の1章の要約です。
正しくない箇所、疑問に思う箇所がある場合はコメントでご教示いただけると幸いです。

# ALife のアプローチ
Alife は、すでに存在する生命体を観察することで「生命とは何か」を理解しようとする方法をとりません。「生命の本質とはこうではないか」と仮説をたくさん立て、それを元に人工的なシステムを作ってしまい、作りながら生命の本質を理解しようとするアプローチをとります。

# 生命の定義
遺伝子工学のようにテクノロジーやエンジニアリングと生命性が結びつくことで、私たちがもつ生命の認識は徐々に変容しています。生命は変わることのできない所与のものではなく、目的に応じて変更可能なものへと変化するのです。例えば、身体障がい者の義肢（= 生命の一部）が高度化（= 変更可能なもの）すれば、健常者よりも速く走る（= 目的）ことが可能となります。

「そもそも生命は目的があって存在するのか」という見解もあります。ダーウィンが提唱した自然選択説の立場をとると、自然淘汰のプロセスは目的を持って行われるものではありません。例をあげて説明します。私たちは空飛ぶ鳥を見ると「羽根は空を飛ぶために適応したものだ」と考えます。しかし実際には、羽根がもっていた本来の機能は飛ぶことではなく、保温のためだったと考えられています。保温のために進化した羽毛が、性選択によって様々な模様を描けるような平板状の羽根に進化し、それがたまたま飛ぶための翼として使われるようになったのではないか、という仮説です。

# 計算と意識
アラン・チューリングは「計算可能なもの」という概念を作りました。この概念を土台に、実際に計算を実行できる機械（= コンピューター）の基本原理が考えられました。それでは、私たちがもつ「意識」は計算可能なものでしょうか。近年注目されている「人工知能」は意識をもつのでしょうか。

それを知るには、人間がどのように知覚しているのかを簡単に整理していきましょう。私たちがもつ「意識」は、センサー（五感）から入ってくる情報を精査して、身体への運動へとつなげています。外を見たら雨が降っている（= 五感から入ってくる情報を精査）ので、今日は傘を持って家を出よう（= 身体への運動）というように。これを「感覚運動のカップリング」といいます。深層学習が得意とするのは、センサーから受け取る情報に対して、カテゴリー分けをすることで必要な情報を抽出する作業です。しかし、現実の知覚プロセスはもっと複雑です。

同じ情報を与えられたとしても、どう行動するのかは状況によって変わります。ユクスキュルの環世界論を引用すれば、ヤドカリにとってのイソギンチャクとは、お腹が空いたときはエサになる。お腹が空いていなければ、殻の装飾となる。つまり同じインプットに対しても、コンテキストによって異なるアウトプットが起こりえるのです。

このように、コンテキストを汲んだ複雑な処理部分を生み出すのはとても難しい。生命の意識のように柔らかい、作り込まれていないシステムが必要となります。

# まとめ
- 人工知能と ALife(人工生命)は違うよ。
- ALife は「計算」「生命」「システム」という諸概念を引き継ぎながら、生命とその生命からなる環世界を理解していくよ。
Rails JQuery 動かない

# JQueryはちゃんと書けている。ソースも更新されている。
しかし、狙い通りに動作しない。Javascriptのエラーもでてない。
単純にalert();とかconsole.log()；とかやっても反応しない。

全く動かないわけではなく、ページを再読み込みしたときは狙い通りに動く。
ぐぬぬ。

## 理由はturbolinksだった。

```erb:application.html.erb
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
```

turbolinksがあるとSPAのような動きをするらしい。(SPAよく知らないが)

>[Rails 4のturbolinksについて最低でも知っておきたい事](https://kray.jp/blog/must-know-about-turbolinks/)
>turbolinksの動作は、すごく大雑把に言うと以下の通りです。
>
>1. リンクのclickイベントをフック
>2. リンク先のページをXHRで取り寄せる
>3. レスポンスをDOM化
>4. 現在のページと取り寄せたページの外部JavaScriptファイルとCSSファイルが同一なら、titleとbodyを読み込んだページのもので置き換える

上記の理由で$(document).readyが発火しない。なるほど。

## Rails5では書き方がまた違う

[Rails5でjqueryを動かす方法](https://qiita.com/hiroyayamamo/items/b258acbaa089d9482c8a)

動いた。

```変更前.js
$(function () {
  // 処理
});
```

``` 変更後.js
$(document).on('turbolinks:load', function() {
  // 処理
});
```
Cookieの仕様変更"SameSite=None"にユーザーは対応する必要があるのか？

前提
[SameSite cookies explained](https://web.dev/samesite-cookies-explained/)
- Chrome80以降CookieはデフォルトでSameSite=Laxになる。
- クロスドメインでのCookie利用は"SameSite=None"を指定(+HTTPS接続のみ許可するためSecure属性)する必要がある

考察

- GoogleのDeveloper Advocate（エバンジェリスト rowan-m）によると、ユーザー個別で対応する必要はなく、そのCookieを生成するツールのベンダーが対応する問題の模様である

[Setting Google Tag Manager cookies with SameSite and Secure attributes](https://stackoverflow.com/questions/58344364/setting-google-tag-manager-cookies-with-samesite-and-secure-attributes)
>For any of these warnings, if you are not responsible for the domain then you are not responsible for updating the cookies. The Google Tag Manager team will be responsible for updating the relevant code that sets the SameSite attributes for cookies from googletagmanager.com.
At this point, the warnings are purely informational and are not impacting functionality. Enforcing this behaviour in stable Chrome is not scheduled until M80, currently targeted for Feb 2020.


[How can I resolve a cross-site Google Analytics cookie `SameSite=None` warning in Chrome on Apache 2.4 and PHP 7.1?](https://stackoverflow.com/questions/58363553/how-can-i-resolve-a-cross-site-google-analytics-cookie-samesite-none-warning-i)
>The cookies triggering the warning are coming from google.com so you will not be able to alter them. The Ads team is aware of these issues and is working to get their cookies fixed before the Feb 2020 stable date. It also means that none of the header directives you're specifying will affect the google.com cookie, it will only cover cookies set for your site.
If you have any cookie warnings that specifically list a domain you control, then you will need to add the correct attributes. -rowan-m


- 例えばリマーケティングなどの場合はサードパーティーCookie（別ドメイン）なのでそのベンダーが対処すべきと思われる


---
何かあればお手数ですが、本記事か以下アカウントでお知らせください！

\ Follow Me! /
[Qiitaアカウント](https://qiita.com/MasatoEmata)
[Twitterアカウント](https://twitter.com/masatoemata)
Amazon S3 

# SpringBootでS3にアップロード

Clientらしきもの

```java:UploadService.java
    private AmazonS3 getAmazons3() {
        return AmazonS3ClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
                .withRegion(region)
                .build();
    }
```

S3にアップロード

```java:UploadService.java
public String putObject(MultipartFile file, String fileName) {
        try {
            InputStream inputStream = file.getInputStream();
            String path = 『保存する名前、ここでランダムの名前生成など』
            ObjectMetadata objectMetadata = new ObjectMetadata();
            objectMetadata.setContentType(file.getContentType());
            objectMetadata.setContentLength(Integer.valueOf(inputStream.available()).longValue());
            getAmazons3().putObject(bucketName, path, inputStream, objectMetadata);

```
アップロードしたものを特別取得URLを生成して返してくる
`アップロードされたものを限定しないと、特別scriptなどのリンクが生成されてアクセスすると実行されてしまうので要注意！`

```java:UploadService.java
            GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, path)
                    .withMethod(HttpMethod.GET);

            final URL fileUrl = getAmazons3().generatePresignedUrl(generatePresignedUrlRequest);
            return fileUrl.toString();
        }catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
     }
}
```
機械学習を使ってCSのお問い合わせ判定をしてみた

本記事は、[サムザップ Advent Calendar 2019 #1](https://qiita.com/advent-calendar/2019/sumzap1) の12/13の記事です。

##はじめに
株式会社サムザップで戦国炎舞を担当しておりますnakamuraです。
以前から機械学習に興味がありましたので学びながら掲題のようなことを試してみました。

ゲーム運営は機能実装だけでなくお問い合わせ対応や調査もエンジニアの仕事の一つです。
１次対応で間違えてしまうとヒート案件化してしまうケースもありますので問い合わせを頂いた時点で適切に判別、振り分けが出来れば、よりよい対応ができるのではないかと考えました。

##処理の流れ
- お問合せデータを形態素解析する
- お問い合わせ毎にラベルを付ける
- 機械学習(教師あり学習)しモデルを作成
- お問い合わせ判定
![adcal_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266880/79a4e2b0-8748-2f94-4d64-5a5a392a18d4.png)

##使用したツール
-Phyton
-Jupyter Notebook（分析環境）
-scikit-learn(機械学習）
-MeCab（形態素解析）

### 形態素解析コード例
```
import MeCab
tagger = MeCab.Tagger()

#形態素解析
word_s = tagger.parse(text)
words = []
for line in word_s.split("\n"):
# 省略
```

### 機械学習コード例
```
from sklearn.naive_bayes import GaussianNB

#省略

#学習用とテスト用に分割
x_train, x_test, y_train, y_test = train_test_split(data)
# 学習
model = GaussianNB()
model.fit(x_train, y_train)
# テスト
y_pred = model.predict(x_test)
acc = accuracy_score(y_test, y_pred)
```

##結果
上記で機械学習させたモデルをもとに実際のCSデータ2000件程の判定を行ってみましたが精度は５０％程度という結果になりました。
実業務で使うにはいまいちな結果ですが文字列の正規化やより多くの単語の新規登録をし形態素解析精度をあげることで判定の精度も上がりそうなので引き続き取り組んでいきたいと思います。

##参考
すぐに使える! 業務で実践できる! Pythonによる AI・機械学習・深層学習アプリのつくり方
<img width="200" alt="book.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266880/d2d2a642-651e-b14a-8311-999e6146ebd8.png">


明日は、@shoichi1023 さんの記事です。
AWS Lambdaでbotoを使ってファイルをダウンロードするときのハマりポイント

## 謎の文字列がついてきてしまう問題
このように

```python
s3 = boto3.client("s3")
pdf_filepath = 'tmp/' + key.split('/')[-1]
print(pdf_filepath)
# => tmp/20191016101246759.pdf
s3.download_file(bucket, key, pdf_filepath)
```
S3からファイルをダウンロードするコードを動かすと
`[ERROR] FileNotFoundError: [Errno 2] No such file r directory: 'tmp/20191016101246759.pdf.47cf5CFA' `
このような感じで謎の文字列がついてきてしまい、エラーでダウンロードできません。

## Lambdaで変更できるファイルの制限
Lambdaでは、
 - <b>`/tmp`以下のファイルしか変更することができない</b>
 - <b>`/tmp`以下でも階層構造にすることはできない(`/tmp`以下にディレクトリを作成することはできない)</b>

という制限があります。
なので、`/tmp`以外の場所にダウンロードしようとしたり`/tmp/food/chocolate.jpg`というようにディレクトリに区切ってダウンロードしようとするとエラーになってしまいます。

## 解決法
今回の場合、`tmp/`に保存しようとしていまっているので

```python
s3 = boto3.client("s3")
pdf_filepath = '/tmp/' + key.split('/')[-1]
print(pdf_filepath)
# => /tmp/20191016101246759.pdf
s3.download_file(bucket, key, pdf_filepath)
```
と`/tmp`以下に直で指定することで無事にダウンロードできました。
「〜は、開発元を検証できないため開けません。」と表示されて困ったときの備忘録。

### はじめに
「〜は、開発元を検証できないため開けません。」と書かれたダイアログが表示され、
「ゴミ箱に入れる」「キャンセル」の選択肢しか無くて困ったので、メモっておきます。

<img width="671" alt="スクリーンショット 2019-12-13 9.10.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42581/790b84b2-6e50-e19a-3071-befefe1b4e60.png">

### 対応策

1. 「キャンセル」を選ぶ。
1.  > システム環境設定 > セキュリティとプライバシーを開く。
1. 一番下に「〜は開発元を確認できないため、使用がブロックされました。」が表示される。
1. その隣の「このまま許可」を押す。
1. ダイアログが表示された手順をやり直す。
1. 「〜の開発元を検証できません。開いてもよろしいですか？」が表示される。
1. 「ゴミ箱に入れる」「開く」「キャンセル」から「開く」を選ぶ。 
1. ダイアログが表示されなくなるまで繰り返す。


<img width="672" alt="スクリーンショット 2019-12-13 9.08.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42581/fdf383d5-5029-2278-3152-508b1b3bc0e6.png">
<img width="671" alt="スクリーンショット 2019-12-13 9.12.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42581/94b0a897-e52f-bee7-7e9d-a1e20a28bf4d.png">

### おわりに

これでなんとかなりました。
ひさしぶりにUnityを使おうとしたら、
il2cppなどでこれが出ていました。

Scripting Backend を il2cpp から mono へ
変更すれば回避できそうだったのですが、解決できて良かったです。

Macbook Proを買い直し、環境が変わったのも
原因の1つだったかもしれません。
JSONファイルが使えない！そんな環境下でのlottie

こんにちは、cssアニメーション大好き人間の@Nakazです。
[Diverse Advent Calendar 2019](https://qiita.com/advent-calendar/2019/diverse) 15日目の記事です。

### はじめに
今回は、lottieを使う際に一番のキモである、JSONファイルを扱えなかった場合というとてもニッチなケースを書こうと思います。
※この記事はlottieの使い方をイチから書くわけではありません。ごめんなさい。
※なんでJSONが使えないんだ？と思うかもしれませんが「色々あって」使えなかったんです。。。

### まずはJSONが使える時の使い方
[lottie-web](https://github.com/airbnb/lottie-web)にもある通り、基本的にはAfterEffects+bodymovinで作ってもらったJSONを元に

```lotti.js
lottie.loadAnimation({
  container: element, // the dom element that will contain the animation
  renderer: 'svg',
  path: 'data.json' // the path to the animation json
});
```

細かいオプション設定はありますが、基本的にはpathの部分にJSONファイルを設定するだけです。
カンタンですね。

### でもJSONが使えない
じゃぁどうすんの？使えないの？ってなりそうなのですがそこはちゃんと用意されてます。
それが

`animationData: an Object with the exported animation data`
>エクスポートされたアニメーションデータを持つオブジェクト

というpathの代わりにデータを受け取れるオプションです。

### で、どうすんのさ？
結論から話すと

**1. エクスポートされたJSONを一旦Objectとして受け取る**
**2. 受け取ったObjectを再度JSON形式に変換してanimationDataに設定する**

です。

#### エクスポートされたJSONを一旦Objectとして受け取る
やってることは単純で、エクスポートされたJSONファイルの中は

``` export.json
{"v":"5.4.4","fr":60,"ip":0,"op":120,"w":80,"h":80,...
```

のようになってます。これを

```export.js
var animationdata = {"v":"5.4.4","fr":60,"ip":0,"op":120,"w":80,...
```

のように一旦格納して、jsファイルにリネームします。
※ファイル自体中身が巨大なので、極力外部にしたほうがいいです。

そしてその中身をscriptタグで読み込み受け取ってください。
import/requireの場合はそれに沿った記述で受け取ってください。

#### 受け取ったObjectを再度JSON形式に変換してanimationDataに設定する

```sample.js
lottie.loadAnimation({
  animationData: JSON.parse(JSON.stringify(animationdata)),
});
```

これで無事データを格納することができました。

### 最後に
少々回りくどい方法ではあるのですが、今のところこの方法で困ってはないのでよしとしてます。

> うそ？！私の環境JSON使えないの？？

って時にこの記事に辿り着いてもらえたら僥倖です。
エリック・エヴァンスのドメイン駆動設計（日本語訳版）を読み解くための用語解説 その2: しなやかな設計

CBcloud Advent Calender 14日目の記事です。

[前回の記事](https://qiita.com/shin-m/items/490fc9b92dbca5a8f62a)に引き続き[エリック・エヴァンスのドメイン駆動設計(日本語訳版)](https://www.amazon.co.jp/dp/B00GRKD6XU/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)を理解するための用語解説をしていこうと思います。

この記事では本書で語られる多くの背景や詳細を省いているので、この記事を読んだだけでは理解できないと思います。本書を読む前に読んでおくと理解がしやすく、後から読んだ時にどんなものだったかを思い出せるような内容にすることを目指しています。

今回は第3部「より深い洞察へ向かうリファクタリング」から「しなやかな設計」について解説します。

本記事で出てくる「ドメイン」「モデル」「値オブジェクト」などの用語の意味については他の記事を参照してください。

- [その1: ドメインモデル](https://qiita.com/shin-m/items/490fc9b92dbca5a8f62a)
- その2: しなやかな設計(この記事)
- [その3: モデルの整合性を保つためのパターン](https://qiita.com/shin-m/items/cf161a6325c2718085fe)

# しなやかな設計
「しなやかな設計」と聞いただけではこれが何らかの設計手法を指すのか、あるいは何らかのプラクティスを施した結果、ソフトウェアの設計が「しなやか」な特性を持つようになるのか、そのどちらなのか分かりづらいですが、本書では後者を指しています。

本書ではソフトウェアを「しなやかな設計」にしていくのに有効なパターンが示されています。
ドメイン駆動設計ではドメインの分析とシステム設計のどちらにも使えるモデルを見出すことが目的です。モデルに関して新たな発見があったらその発見をコードにも反映する必要があります。よってモデルとコードの表現を一致させるためのリファクタリングが繰り返し行われる必要があります。この繰り返しのリファクタリングを容易にするためにしっかりとした設計がコードに施されていないと、リファクタリングを継続するのが難しいことは容易に想像できるでしょう。

この恒常的なリファクタリングによりモデルとコードを繰り返し変形させることで、最も変更される部分の設計が柔軟になっていくと本書では述べています。この柔軟性を持つことが「しなやかな設計」です。本書では

> 使い込んだグローブは、指の曲がる場所はしなやかになるが、他の部分は堅く、手を保護してくれる

と例えています。
恒常的なリファクタリングは設計においてモデルの概念を改良する洞察を得ることができ、さらにそれを容易にモデルとコードに取り込むことでより洗練されたモデルを構築することにも寄与します。

# しなやかな設計に向かうためのパターン
本書では、ソフトウェアをしなやかな設計にする公式はないとしながらも、経験上しなやかな設計に近づける傾向のあるパターンについて下記を挙げています。
[前回の記事](https://qiita.com/shin-m/items/490fc9b92dbca5a8f62a)で説明した用語が出てきますので適宜ご参照ください。

### 意図の明白なインタフェース
クラスと操作の名前にはユビキタス言語を使用する。さらにその効果と目的を記述する名前にして、実現手段については言及しないようにする。こうすると開発者が内部を理解せずに済み、ユビキタス言語からふるまいを推測できるようになる。


### 副作用のない関数
ロジックのうち、できる限り多くの部分を関数に置くようにする。関数とは副作用なしに結果を戻す操作のこと。
コマンド（状態を変更するメソッド）は分離して、状態変更だけを行うシンプルなメソッドにしてドメインに関わるデータを戻さないようにする。クエリは値オブジェクトを生成して戻すようにする。これらにより、副作用のない関数を安全に組み合わせて複雑な演算を行うことができる。オブジェクトの変更が演算に含まれてしまうと、結果の予測が難しくなり利用者は実装を把握しなければならず、インタフェースの抽象化の恩恵が薄れてしまう。クエリの結果として受け渡された値オブジェクトは不変なので、それに対する操作は関数であるし、安全に使用できる。


### 表明
操作の事後条件と、クラスおよび集約の不変条件を宣言するようにする。プログラミング言語で表明を直接コーディング出来ない場合には、自動化されたユニットテストを書くようにする。
そうしないと、操作の副作用を知る方法が実装を読むしかない場合、委譲が多く行われている設計では内部を徹底して理解する必要があるため、抽象化の価値が失われてしまう。表明が記述する不変条件は、すべて状態に関することなので容易に理解できる。不変条件により結果が保証できるなら、操作がどのようなロジックであるかを気にする必要はなくなるので、実装を読む必要はなくなる。


### 概念の輪郭
概念的に意味のある機能の単位を見つけ出し、それに従いインタフェースを分割するようにする。技術的な思考でインタフェースの粒度を画一的に揃えることは可能だが、それでは意味のある単位でモデルを操作できないため役に立たない。
そのため、ドメインにおける自分の直感を考慮に入れることで概念を捉えたインタフェースができあがる。このインタフェースは、論理的に組み合わせることができ、自然とユビキタス言語に従った意味のある文章を作り上げるように利用することができる。


### 独立したクラス
オブジェクトを低結合にするのは基本。できる時に徹底的にやる。オブジェクトの概念から本質的でない他の概念をすべて取り除くようにする。
依存は設計を理解することが難しくなってしまう。ただし間違えてはいけないのは、目標はすべての依存関係を取り除くことではなく、本質的ではない依存関係を取り除くことだということ。また、依存関係を取り除くといっても、あらゆるものをプリミティブにすることで、モデルの表現力を落としてしまっては元も子もないので注意すること。


### 閉じた操作
戻り値の型が引数の型と同じにできる場合は、そのようにする。
引数と戻り値とで型が異なると、操作に異なった概念を持ち込むことになる。引数と戻り値の型を同じにすると、その操作はインスタンス集合の下で閉じている。閉じた操作は他の概念を巻き込まず、組み合わせが容易になる。「閉じた操作」の由来は、数学における「加算は、実数の集合の下で"閉じている"」から。閉じているのは抽象的な型の下になることもある。その場合、具体的な引数は別の具象クラスでも良い。加算は実数の下で閉じていて、実数は有理数と無理数のどちらでも良いのと同じ。

# おわりに
恒常的なリファクタリングで、その変更箇所が柔軟になるという考え方はなるほど、と思う一方、なかなかに実践が難しそうです。とはいえ変更箇所は集中するものなので取り組む価値はありそうです。
A-Frameで日本語を表示したい

本記事は [AR Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ar) の19日目の投稿です。

# はじめに
A-Frameとは、WebAR/VRをHTMLのように書いて実装できるフレームワークです。
A-Frameで3DモデルをAR空間に表示する方法については以前「[【WebAR】A-frameを使ってマーカー上に3Dモデルを表示するまで](https://qiita.com/emuyuu/items/98d04a671ed0d648334a)」に書いたので興味のある方はぜひ読んでみてください。

さて、A-Frameで文字を表示する場合、`<a-text>` もしくは `<a-entity>`を使用します。
しかし、`<a-text>`は日本語に対応していません。
（`<a-entity>`は使用していないのでわかりません。多分対応していないと思います！）

日本語が表示できないのは困るので調べてみたところ、
無事に日本語を表示することができたのでその方法をまとめます。

# 日本語を表示する方法
公式ドキュメントの[Non-ASCII Characters](https://github.com/aframevr/aframe/blob/master/docs/components/text.md#non-ascii-characters)の項目でその方法が簡単に紹介されています。(英語)
せっかくなので、この記事で日本語で詳しく書いていきたい思います。

### フォントファイルの用意

下準備は以下のようなサイトで行います。

<img width="835" alt="スクリーンショット 2019-12-13 20.20.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404873/102fba1d-88ca-168f-22b7-60324071de7b.png">
1. 使用したいフォントのttsファイルを用意します。
2. [MSDF変換ツール](https://msdf-bmfont.donmccurdy.com/) (↑画像のサイト)を開きます。
3. 画像の1番で、用意したttsファイルを選択します。
4. 画像の2番で、ARで使用したい文字を全て入力します。
5. 画像の3番で、 [CREATE MSDF] ボタンをクリックします。
6. 準備ができたら画像4番の [DOWNLOAD] ボタンが押せるようになります。クリックしてzipファイルをダウンロードしてください。

### A-Frame用にDLしたファイルを整える
1. 先ほどDLしたファイルを解凍すると、jsonファイルとpngファイルが入っています。
2. pngファイルの名前を、`*.png` から `*-msdf.png` にリネームしてください。

### ファイルの配置
用意した２つのファイルをポーンとプロジェクトファイルに置いてやります。

```
project_file
├ custom-msdf.json
├ custom-msdf.png
└ index.html
```


### コード
以下の様に記述します。
文字コードは必ず`utf-8`にしてください。

```html
<!DOCTYPE html>
<html>
  <head>
  <head>
    <meta charset="utf-8" />
    <script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script>
    <script src="https://jeromeetienne.github.io/AR.js/aframe/build/aframe-ar.js"></script>
    <title>WebAR</title>
  </head>
  <body>
    <a-scene embedded arjs="debugUIEnabled:false; sourceType: webcam;">
      <a-text
        value="こんにちは世界！"
        font="custom-msdf.json"
        font-image="custom-msdf.png"
        negate="false"
        scale="2 2 1"
        position="0 1 -4"
        color="red">
      </a-text>
    </a-scene>
  </body>
</html>

```

# 結果
こんな感じで表示されます。

![140098.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404873/af424330-3628-952a-3769-c5ff3e05fe50.jpeg)


# 参考サイト
[A-Frameで日本語フォントする方法](http://yonemura.hatenablog.com/entry/2018/08/14/162700)
[公式ドキュメント](https://github.com/aframevr/aframe/blob/master/docs/components/text.md)

# さいごに
少しだけ裏話をば。
実は、当初は公式ドキュメントのコード例には`font-image`が書いてありませんでした。
おそらくドキュメントが作成された当時は記述なしでも動作したのだと思いますが、A-Frameの現在のバージョン（0.9.2）では`font-image`も書かないと日本語が表示されないです。
(先日v1.0.0がリリースされましたね。こちらのバージョンではまだ動作確認していません。)

なので、人生で初めて公式にPRを出しましたー！無事にマージもされています！
このアドベントカレンダーがなかったらきっとまだOSS活動をしたことのない人生を送っていたことでしょう。
この様な機会をくださったアドベントカレンダーに感謝。

それではみなさまよいARライフをお過ごしください！
カルネージハートとは関係ないLaravelのnow()の小ネタ

カルネージハート Advent Calendar 2019 11日目の記事です。

今回はカルネージハートとは全く関係ないLaravelのnow()の小ネタの話です。

# はじめに

公式ドキュメントの[Laravel 6.x ヘルパ](https://readouble.com/laravel/6.x/ja/helpers.html#method-now)見てますか？

## 現在時刻が欲しいだけなら`use Carbon\Carbon;`は不要

そのまんまです。

[![Screenshot from Gyazo](https://gyazo.com/b535731438cf532730a56cd29b475342/raw)](https://gyazo.com/b535731438cf532730a56cd29b475342)


```php
now();
```

~~よくuse Carbon\Carbon;宣言したり、Laravelでdate関数使ってごにょごにょしているの見て保守するの辛いんだなこれが~~

で現在時刻取れます。

## 最後に

事実上の最新作EXAが2010年に発売以降続編の情報が皆無ですが、一部の熱狂的ファンは大会を開催してゲームを続けています。ゲームを盛り上げることで続編も出るかもしれません。カルネジスト、ネジらーの皆様のご協力をお願いします！

カルネージハートファンのプログラミング知識を共有しましょう！
日付と時刻

個人的な勉強のためにまとめたものです

#日付と時刻

Java SE 8から日付や時刻を扱うための新しいAPIが追加された

##クラス

###LocalDate

**日付**を管理するクラス


###LocalTime

**タイムゾーンなし時刻**を管理するクラス
時間は、ナノ秒の精度まで表すことができる


###DateTimeFormatter

指定した**日付パターン**に変更するクラス
「事前定義されている標準フォーマッター」、「ローカル固有のフォーマッター」、「カスタムパターンを使ったフォーマッター」の3種類がある（より複雑なフォーマッターは**DateTimeFormatterBuilder**によって提供）

###Duration

**時刻の差**を管理するクラス

###Period

**日付の差**を管理するクラス

###ZonedDateTime

**タイムゾーンあり時刻**を管理するクラス

##メソッド



###ofメソッド

日付けを指定してインスタンス生成するときに使うメソッド

###nowメソッド

現在の時刻でインスタンス生成したいときに使うメソッド

###parseメソッド

文字列の日付を日時の情報に変換するメソッド。

###formatメソッド

日付の情報を文字列に変換するメソッド
事前定義されている標準フォーマッターは、**java.time.format.DateTimeFormatterクラス**に定義されている

| フォーマッター |   例 　|        
|:-----------------|------------------:|
| BASIC_ISO_DATE   | 20191213  |
| ISO_ZONED_DATE_TIME   |  2019-12-13T00:00:00+09:00[Asia/Tokyo]  |
| ISO_INSTANT   |  2019-12-12T15:00:00Z  |
| ISO_DATE_TIME   |  2019-12-13T00:00:00 |


・**ISO_ZONED_DATE_TIME**と**ISO_INSTANT**は、ゾーン付き時刻を表す**ZonedDateTime**のフォーマッター

###untilメソッド

**LocalDate**のは**日付の差**を、**LocalTime**のは**時刻の差**を計算するメソッド 

###betweenメソッド

**Period**のは**日付の差**を、**Durtion**のは**時刻の差**を計算するメソッド

###toDays、toHours、toMinutes、toMillis、toNanosメソッド

**Durtion**には、日、時間、分、秒、ナノ秒というように、時間の差を取得したい単位ごとにメソッドが用意されている
Unicorn導入後本番環境でRailsを起動してもアクセスできなかった時、tail -fコマンドが便利だった

## はじめに
グループ開発でデプロイ担当になった自分が、アプリケーションをAWSのEC2サーバにデプロイ中に発生した問題と解決できた方法についての話です。

##問題発生経緯
- AWSでEC2インスタンスの生成やポートは設定済み。
- ec2-userでログインしてRubyやRails、MySQLなどは一通り導入・設定済み。
- Railsを起動すべくUnicornをインストール。GitHubへのSSH鍵の設定を始め、個人課題でデプロイした時を参考にデプロイ作業を進める。
- 設定が終わってEC2サーバでRailsを起動。ブラウザに本番環境のURLを入れると以下のエラーが出た。

<img width="492" alt="01エラー画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365312/00b2b924-f2de-b3e8-0a52-8ebbce05580b.png">

##確認したこと
Unicornのエラーログを確認した。
less log/unicorn.stderr.logコマンドでエラーログを表示できるので実行したところ

```
I, [2019-12-04T09:31:44.672753 #14271]  INFO -- : listening on addr=0.0.0.0:3000 fd=8
I, [2019-12-04T09:31:44.678089 #14271]  INFO -- : master process ready
I, [2019-12-04T09:31:44.685516 #14275]  INFO -- : worker=0 ready
```
エラーは見つからなかった...（本当はエラーがあったけど今回の話とは別件だったため割愛）

その後エラーが特定できずデプロイ作業を最初から見直すも状況は改善せず。どうしようか途方に暮れていた時、タイトルのtail -fコマンドに思い至った。

## tail fコマンドを実行
tailコマンドは指定したファイルの最後の行を表示してくれるコマンド。-fオプションを追加するとそのままリアルタイムで更新される。

```
$tail -f log/production.log
```
上記のコマンドでproduction.logの最後の行がリアルタイムで更新される。さながらローカル環境でサーバを起動した時にターミナルに流れるログのようだった。
tail -fコマンドにより可視化されたログを見るとエラーが発生しているのが確認できた。

```
$ tail -f log/production.log
F, [2019-12-04T09:43:01.337938 #14275] FATAL -- : [00000000-0000-0000-0000-000000000000] ActionView::Template::Error (The asset "application.css" is not present in the asset pipeline.):
F, [2019-12-04T09:43:01.338103 #14275] FATAL -- : [00000000-0000-0000-0000-000000000000]      5:     <%= csrf_meta_tags %>
[00000000-0000-0000-0000-000000000000]      6:     <%= csp_meta_tag %>
[00000000-0000-0000-0000-000000000000]      7: 
[00000000-0000-0000-0000-000000000000]      8:     <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
[00000000-0000-0000-0000-000000000000]      9:     <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
[00000000-0000-0000-0000-000000000000]     10:   </head>
[00000000-0000-0000-0000-000000000000]     11: 
F, [2019-12-04T09:43:01.338136 #14275] FATAL -- : [00000000-0000-0000-0000-000000000000]   
F, [2019-12-04T09:43:01.338213 #14275] FATAL -- : [00000000-0000-0000-0000-000000000000] app/views/layouts/application.html.erb:8:in `_app_views_layouts_application_html_erb__3535391086825638395_34723080'
```

application.html.erbファイルでapplication.cssのところでエラーが出ていた。
個人課題のデプロイ作業時、この時点ではCSSが反映されないが画面自体は表示されていた。
そのため今回もアセットファイルのコンパイルはまだしていなかったが、どうもそれでエラーが出ているっぽい。
そこで試しにアセットファイルのコンパイルを実行してUnicornを再起動したところ

<img width="373" alt="02正常画像.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365312/59d47f1c-e667-1669-f20a-e04402416608.png">

本番環境にアクセスできるようになった。

## まとめ
問題発生時はこうしたログの確認ができないと原因の特定ができないので、ログ確認は少しずつ覚えていきたい。
Amazon ECSでコンテナの依存関係を設定したときのエラー時の挙動が想定外でハマった

Amazon Elastic Container Service(Amazon ECS)のタスク定義で複数コンテナを追加して依存関係を設定したときにハマったのでメモ。

コンテナの依存関係については下記が参考になります。

タスク定義パラメータ - Amazon ECS
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/task_definition_parameters.html

ECSとFargateでコンテナの起動順が制御できるようになりました - Carpe Diem
https://christina04.hatenablog.com/entry/ecs-fargate-dependson-parameter


## なにが起こったのか

### タスク定義

以下のようなコンテナをタスク定義に登録しました。

- コンテナA
  - Essential(基本): `false`
- コンテナB
  - Essential(基本): `false`
  - DependsOn(コンテナの依存関係):
      - Condition: `SUCCESS` 、ContainerName: コンテナA
- コンテナC
  - Essential(基本): `true`
  - DependsOn(コンテナの依存関係):
      - Condition: `SUCCESS` 、ContainerName: コンテナB

正常動作時はコンテナA、コンテナB、コンテナCの順に起動してコマンドを実行して終了します。


### エラー時に期待した挙動にならなかった

上記設定でコンテナAでエラーとなった場合、以下のような挙動を期待しました。連なってくれるでしょうと。

- コンテナA: `STOP(ERROR)`
- コンテナB: `STOP`
  - コンテナAが`SUCCESS` を返さなかったから
- コンテナC: `STOP`
  - コンテナBが`SUCCESS` を返さなかったから


ところが、期待した挙動とはならずにコンテナBは`PENDING` のまま沈黙しました。
コンテナのタイムアウトを設定しなきゃダメなのかと試してみても変わらず沈黙。

- コンテナA: `STOP(ERROR)`
- コンテナB: `PENDING`
- コンテナC: `PENDING`


コンテナBでエラーとなった際にはコンテナCは`STOP` となりました。
こちらは期待したどおりです。

- コンテナA: `STOP(SUCCESS)`
- コンテナB: `STOP(ERROR)`
- コンテナC: `STOP`
  - コンテナBが`SUCCESS` を返さなかったから


### 期待する動作をさせるには

以下のようにコンテナCの依存関係にコンテナAを追加してやると期待する動作となりました。

- コンテナA
  - Essential(基本): `false`
- コンテナB
  - Essential(基本): `false`
  - DependsOn(コンテナの依存関係):
      - Condition: `SUCCESS` 、ContainerName: コンテナA
- コンテナC
  - Essential(基本): `true`
  - DependsOn(コンテナの依存関係):
      - **Condition: `SUCCESS` 、ContainerName: コンテナA**
      - Condition: `SUCCESS` 、ContainerName: コンテナB


コンテナAでエラーになるとコンテナCも`STOP` してタスクが終了します。

- コンテナA: `STOP(ERROR)`
- コンテナB: `STOP`
  - コンテナAが`SUCCESS` を返さなかったから
- コンテナC: `STOP`
  - コンテナAが`SUCCESS` を返さなかったから


## まとめ

複数コンテナを追加して依存関係を設定したときの挙動がハマることでわかりましたが、コンテナ数が増えると大変そうなのもみえてきました・・・



## 参考

タスク定義パラメータ - Amazon ECS
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/task_definition_parameters.html

ECSとFargateでコンテナの起動順が制御できるようになりました - Carpe Diem
https://christina04.hatenablog.com/entry/ecs-fargate-dependson-parameter
Alibaba Java Coding Guidelinesについて

##はじめに
初めてQuiitaにブログを書く機会が現れたので、ここに来ました！
現在、自分の技術武器は二つがあります、JavaとAlibaba Cloud。そしてこの二つを組み合わせ、何か書きたかったです。
色々がありますが、今回Alibaba Java Coding Guidelinesについてちょっと紹介したいと思います。
何で？自分のコードもっとキレイにしたいですから！

###Alibaba Java Coding Guidelinesとは？
長年にわたるAlibabaの技術チーム内部のベストプログラミングプラクティス。
様々なJavaプログラミングチームが同じルールに則ってプログラミングすることにより、コードクオリティーを高め、お互いのプログラムの再利用と理解を促進しているものです。

このGuidelineは、他のプログラマーも利用できるよう[GitHub](https://github.com/alibaba/p3c?spm=a2c65.11461447.0.0.5d19d1cdpnXlEo)で公開されており、現在２万弱の★がついています。また、アップデートされ続けています。
しかしこのドキュメントは今のところ[英語](https://alibaba.github.io/Alibaba-Java-Coding-Guidelines/)と[中国語](https://github.com/alibaba/p3c/blob/master/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%EF%BC%88%E5%8D%8E%E5%B1%B1%E7%89%88%EF%BC%89.pdf)しか存在していません。
下記に記事の構成をメモします。
-----
このCoding Guidelineは下記の5つに分けられます。
1. プログラミング仕様
2. 例外とログ
3. MySQLの仕様
4. プロジェクト仕様
5. セキュリティ仕様
6. 
各仕様は3つのレベルに分類されます。
1. 必須
2. お勧め
3. 参照

詳細は次の通りです。
[説明]：内容説明
[正例]：コーディングと実装が近づい推奨について説明【？】
[反例]：注意事項と実際のエラー事例

-----
###具体例
-----
プログラミング仕様

命名規則

[必須] 定数変数名は全て大文字記載、区切りにアンダースコアを用いなければなりません。
各定数変数名は、意味的に完全で明確でなければなりません。

正例:
MAX_STOCK_COUNT

反例:
MAX_COUNT

-----
ドキュメントを読み、自身のコードと比較するのも手ですが、下記プラグインでコードをチェックすることも可能です。（自分のコードに使ったら、結構怒られました）
●　[PMD implementations](https://github.com/alibaba/p3c/tree/master/p3c-pmd)
●　[IntelliJ IDEA plugin](https://github.com/alibaba/p3c/tree/master/idea-plugin)
●　[Eclipse plugin](https://github.com/alibaba/p3c/tree/master/eclipse-plugin)

###試験
Alibaba Cloud AcademyにAlibaba Java Coding Guidelinesの試験があります。ドキュメントを読み、実際の知識を試すことができます。試験は無料で、合格したらバッジがもらえます。

試験のリンクは[こちら](https://edu.alibabacloud.com/certification/clouder_java?spm=a3c0i.11597324.1232445.113.67084755IOh6SQ)です

###おわりに
このベストプログラミングプラクティスは、自分のコードのクオリティーを高めるのにとても役立つものです。潜在的なコードエラーを避けて、最高のコード作れるようになりましょう！

**特に私！**

最後まで読んで頂き、ありがとうございました。
Next.jsでアクセス数増加した話

この記事はNext.js Advent Calendar 2019 13日目の記事です。


Reactで描画していたページの検索流入が低下したのをNext.jsで改善した話です。

## はじまりはいつも突然に
諸般の事情で簡易的なスクレイピング対策として、 HTML + React.js で作成された BtoB 向けの Webサイトがありました。
Google様の言いつけを守りLighthouseの Performance Scores のSEOは100で運用していました。

![対策前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265124/75b0f02d-6fbf-ddb5-02a9-6f677ab34e01.png)


コンテンツの充実化を図り、検索流入も右肩上がりで大変喜ばしい結果になっていました。
![落ちる前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265124/c4d5d179-ddd1-be8d-96b9-952851977f08.png)



しかし、その日は突然やってきました。
Google様に嫌われてしまい検索流入がガクッと1/5まで落ちてしまったのです。
![堕ちたな.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265124/dae63515-074a-b0ed-182f-bd2dab5581c6.png)


 
## ご機嫌取り
プロジェクトのメンバーは大慌てです。

「最近のリリースで変更点ありましたっけ⁉」
「いや、コンテンツの追加しかしてません。SEO対策はできているはずです」
「Googleのクローラーの仕様変更ですかね・・・」

そこで、実際にLighthouseの結果を確認してみると変化は見られませんでした。
しかし、Fetch as Google の結果を見るとReactを使って動的に描画していたコンテンツの中身が上手く表示されていませんでした。コンテンツ描画前のスケルトンだけが虚しく表示されており、コンテンツの中身が無いサイトとして認識されてしまっていたのです。

「Reactの描画待ってくれていませんね。これ・・・」
「静的なページにはしたくないんだよねぇ」
「なにか打つ手がないか探してみます」

そんなときにNext.jsの噂を聞き、Next.jsならば既存のReactの資産を活かしつつSSRへ移行して、静的に出したくない箇所は Dynamic Import で動的に描画できそうと目処が立ちました。
最終的な構成は、AWS Lambda を通して React + Redux を Next.js で SSR する構成に変更しました。
加えて、Amazon CloudFront を使ってコンテンツを配信し、パフォーマンス改善も図りました。

「これで、Googleのクローラー向けにやれることはやりましたね」
「あとは、クローラー様の判断を待ちましょう」

## Next.jsでSSRした結果
Next.jsに移行した結果、検索流入はリリースした次の日から右肩上がりに変わりました。

![移行後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265124/afe4dccf-9fac-2a6f-e1f7-77f4de3ba727.png)

Lighthouse の結果も向上し、コンテンツのファーストビューまでの時間も40％向上しました。

![対策後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265124/cf61c0e2-2a95-a703-1100-534b2e89903b.png)

検索流入数は、1/5まで落ちたところから7倍程度まで上昇と移行前の最大値をあっという間に更新する結果となりました。

## おわりに
SEO対策は前提でしかなく、コンテンツの中身をクローラーが滞りなく解釈できる形で出してあげることが大事だと痛感しました。
Next.jsは既存の React コンポーネントをそのまま移行できたので本当に便利でした。
SPAで作っているサイトやReactで動的に描画しているサイトの方の参考になれば幸いです。
テクノロジーとD2Cブランドの甘い関係 （導入）

この記事は、[JSL (日本システム技研) Advent Calendar 2019 - Qiita ](https://qiita.com/advent-calendar/2019/jsl) の12日目の記事です

## やったこと
インターネットサービスを軸にしている企業は有名なリポジトリが多くあります。
小売業の新たな潮流を担っているD2Cブランドたちは、テクノロジー※をどう捉えているか、どのようにテクノロジーを社会に届けているのか、と思い調査してみました。

※ ここでのテクノロジーとはWEBに関するものとします。

## D2Cブランドとは
もともとは「Direct to Consumer」の略。
Direct to Consumer (D2C) とはその名前の通り、自ら企画、製造した商品をどこの店舗にも介すことなく販売する、小売業の新しいビジネスモデルのこと。

ただ定義はアップデートされており、『ユニークな商品・顧客体験のある、データとテクノロジーを活用したライフスタイルブランド』(Digitally Native Vertical Brand(DNVB))をD2Cブランドと呼んだりするようです。

新しい小売業のブランド、と思っていただければと。
興味があるかたは以下をご参考になさってください。

[DNVB / Future of Retailへ（D2Cの過去・現在・未来） \| Takram Cast](https://cast.takram.com/podcast/dnvb-future-of-retaild2c)
[100社を超える米国D2C Brands Listを公開:D2C Brands\.com vol\.03｜D2C Brands\.com｜note](https://note.com/d2c_com/n/na726aba5406a)

## 調査対象
Githubリポジトリのデータを対象に調査したいと思います。

### D2Cブランド
| ブランド名 | 商材 | オフィシャルサイト | Githubリポジトリ |
|:--|:--|:--|:--|
| Glossier | 化粧品 | http://www.glossier.com | https://github.com/glossier |
| Bonobos | 衣料品 | https://bonobos.com | https://github.com/bonobos |
| Warby Parker | メガネ | https://www.warbyparker.com | https://github.com/WarbyParker |
| Everlane | 衣料品 | https://www.everlane.com | https://github.com/Everlane |
| Away | スーツケース | https://www.awaytravel.com | https://github.com/Away-Travel |
| Casper | マットレス | https://www.casper.com | https://github.com/CasperSleep |
| THIRDLOVE | 女性用下着 | https://www.thirdlove.com/ | https://github.com/mecommerce |
| FABRIC TOKYO | 衣料品 | https://corp.fabric-tokyo.com | https://github.com/lifestyledesign |

テック業界に愛されている[AllBirds](https://www.allbirds.com)にはリポジトリはなく、また、創業が新しい[thearrivals](https://thearrivals.com)、[objcts.io](https://objcts.io)などもGithubリポジトリはありませんでした。

### 調査方法
まずはGithub REST API v3で見てみます。


```python
import requests
import pandas as pd
import json

headers = {
    'Accept': 'application/json',
}
lst = ["glossier", "bonobos", "WarbyParker", "Everlane", "Away-Travel", "CasperSleep", "mecommerce","lifestyledesign"]
dict_array = []

for i in lst:
  url = f'https://api.github.com/orgs/{i}'
  response = requests.get(url,headers)
  data = response.json()
  dict_array.append(data)
some_df = pd.DataFrame([], columns=data.keys())
some_df = pd.concat([some_df, pd.DataFrame.from_dict(dict_array)])
```
一部ですが以下のような結果が見れます。

| id | public_gists |
|:--|--:|
| glossier | 35 |
| bonobos | 27 |
| WarbyParker | 38 |
| Everlane | 38 |
| Away-Travel | 0 |
| CasperSleep | 51 |
| mecommerce | 5 |
| lifestyledesign | 2 |

すみません。力つきました。
後半に続く。
結局、PATH通すってなんなん？


##結局、PATH通すってなんなん？

Flutterの勉強を始めようとダウンロードした後、
公式カンファレンスにPATHを通せという場所でつまずいた。


```:flutter公式カンファレンス
$ export PATH="$PATH:`pwd`/flutter/bin"
```
はっ！？？？絶妙にわからん！！！っていう感じだったので
改めて、PATHについて学んだ。

##知らなかった事

結局PATHを通すとは？
exportとは？
bash_profileとは？

pathについて知るにはwhichコマンドが役に立つって知ってます？。
今までは何も考えずにターミナル上でLinuxコマンド使っていた。
lsを打って、わーいわーい俺もプログラマーだと喜んでいたが
改めて考えた。

### whichコマンドを使えばPATHについて理解できる

```:ターミナル
$ which ls
→/bin/ls　
/bin/という所にあるlsファイルを開きます。
そのlsファイルに『現在のディレクトリの中にファイルを一覧にする』プログラムが書いていると言う意味
```

つまり、
PATHを通すとは
ls や　python　コマンドを打つ為(ファイルを開く為)の
場所を明示してあげること。なるほど


##今回の目標
flutterコマンドを使えるようになりたい。PATHを通したい。

flutterのZIPファイルをダウンロードして、下記場所に保存している

```:flutter保存場所
$ Users/Tarou/development/flutter
```

```:結論
$ Users/Tarou/development/をPATHで通してあげたらOK
```

```:flutter公式カンファレンス
$ export PATH="$PATH:上のPATH/flutter/bin"
```

```:結論
$ export PATH="$PATH:/Users/daisuke/development/flutter/bin"
→これでOK
```


```:ターミナル
$ pwd
→Users/Tarou/development(コピペしやすいようにpwd実行)
$ cd 
→ホームに戻す(次のコマンドを打つ為)
$ vi ~/.bash_profile
→.bash_profileに書き込む(vimコマンドは調べてね)
$ :i
→vimコマンド　i=文章を挿入する
$ export PATH="$PATH:/Users/daisuke/development/flutter/bin"
→　上記をコピペする
$ :wq
→vimコマンド　保存して終了
```


上の工程を行えば
PATHを追加できる。やっとわかったわ。簡単やん。やっと理解できたわ。

ターミナル上でexportするだけではターミナルを消すとPATHが消えてしまうので
bash_profileにみんな書き込んでいるイメージ

```:ターミナル
export 
source
```


```:.bash_profile
export 
```

.bash_profileに書き込むタイプの違い


#結論
#素人はvi .bash_profileに書き込めばいい

おわり
ざっくり案件のまとめ

#:baby_tone1:現場で使ったツールとかをまとめたしん:baby_tone1:
　**あ、これなんか聞いたことある！！！**的な役に立てばうれしいです

##JP1
　- ミドルウェア
　- 日立が開発した運用管理ツール
　- オートメーション、コンプライアンスで主に使用しました
　- [HPはこちら](https://www.hitachi-systems.com/ind/jp1/about_jp1/)

##HULFT
　- ミドルウェア
　- SCSKが開発したファイル連携、データ管理ツール
　- 総合テスト、お客様環境で使用しました
　- [HPはこちら](https://www.hulft.com/)

##Subversion
　- オープンソースのバージョン管理ツール
　- Gitと似たようなもん
　- [Gitとの違い](https://tracpath.com/works/development/subversion_vs_git/)
　- [ちょっとわかりやすい記事](https://qiita.com/YusukeHosonuma/items/14c59f3878d640a401a1)
　
##Jmeter
 - apacheソフトウェア財団なるところが開発したらしい
 - サーバに対してリクエスト送りまくって性能を評価するときに使います
 - [わかりやすい記事](https://qiita.com/kanimisonson/items/922e43dafc2bc484bf69)

##Active Directory
　- Microsoftが開発したオンプレ専用のディレクトリサービス
　- [わかりやすい記事](https://securitynavi.jp/4145)

##その他達
　- [crontab](http://e-words.jp/w/cron.html)※デーモンの一種
　　- [デーモンとは](https://wa3.i-3-i.info/word11000.html) 
　- [WinSCP](https://techacademy.jp/magazine/2567)
　- [WinMarge](https://love-guava.com/winmerge-excel/)
　- [SSO(シングルサインオン)](http://e-words.jp/w/シングルサインオン.html)

##まとめ

　- オンプレよりもクラウドを触りたくなりました
　
　- 結局ツールは使ってみないとわからないと思いますが、会話で「???」にならない程度の知見は必要かなと思うしん

　- 雑ですがご参考までに！！！！
Akashic EngineとフォントとLabelのtips

この記事は、Akashic Engine Advent Calendar 2019の13日目の記事です。
数年前から[Akashic製ノベルゲームエンジン](https://github.com/cowlick/cowlick)を細々と開発しており、その開発中や実際に使ってゲームを作る際にやったことなどを2, 3個書いておきます（ほんとはもっとたくさんあるのですが、時間がないので…ごめんなさい）。

## Akashicとフォント

Akashic EngineではDynamicFontとBitmapFontが扱えるわけですが、DynamicFontはとりあえず表示したりするには便利なものの、ちゃんとしたゲームを作るならやはり雰囲気にあったフォントを使いたくなるものです。というわけでBitmapFontを使うための準備をします…といっても基本は公式ガイドに従うだけなのですが。

https://akashic-games.github.io/guide/bmpfont-generator.html

## 扱う文字をまとめてから生成

さて、少ない文字数なら公式ドキュメントのやり方で十分なのですが、ノベルゲームはいかんせん文字数が膨大かつシナリオを修正するたびに扱う文字が変わる可能性があるのでスクリプト化して何度も生成できるようにしておきましょう。

```js
const glob = require("glob");
const fs = require("fs");

const font = {
  ttf: "./font.ttf",
  output: "./font.png"
};

const strings = (files, extra) => {
  return files
    .map(name => fs.readFileSync(name, "utf-8"))
    .reduce((a, b) => a.concat(b))
    .split("")
    .filter((value, index, self) => self.indexOf(value) === index)
    .sort()
    .reduce((a, b) => a + b)
    .replace(/\r?\n/g, "")
    + extra;
};

// 文字収集対象のファイル群
const files = [
  "./text/settings.json",
  ...glob.sync("./scenario/*.txt")
];
const extra = "シナリオに現れないシステム用文字列";

const generate = `bmpfont-generator ${font.ttf} ${font.output} -H 32 -c ${strings(files, extra)} -m ?`;

const exec = require("child_process").exec;
exec(generate, function(err) {
 if (err) {
   console.log(err);
 }
});
```

雑な実装なのでスクリプト記述用の文字が含まれてしまったりしますが、十数文字程度は誤差だと思って妥協しています。

## akashic-labelと禁則処理

Akashic Engineで文字を描画したい場合は[akashic-label](https://github.com/akashic-games/akashic-label)を使います。akashic-labelは禁則処理を設定できるのですが、どういう処理にするかは利用者にゆだねられています。

私はW3Cのものに従えばいいかなと考えたので、以下のように実装しました。

https://github.com/cowlick/cowlick/blob/42bcfcaa0e77b22f436aeecb57fdcf6dc97ebfb7/packages/%40cowlick/engine/src/lineBreakRule.ts

## テキスト表示のスピード調整

ノベルゲームによくある機能の1つにテキスト表示スピードの調整やクリック時全文表示があります。

まずテキスト表示スピードの調整ですが、これをAkashic Engineで再現するには `g.Scene.setInterval` を使います。あとは呼び出しごとに1文字ずつ表示させるだけでそれっぽい感じに仕上がります（fpsによっては多少ちらついたりするかもしれませんが、まぁ許容範囲です）。

https://github.com/cowlick/cowlick/blob/42bcfcaa0e77b22f436aeecb57fdcf6dc97ebfb7/packages/%40cowlick/engine/src/components/Message.ts#L82

ただし、ルビの場合は1文字削ってから次のルビ付き文字列を追加する、みたいなことをしてあげないと自然にならないので注意が必要です。

https://github.com/cowlick/cowlick/blob/42bcfcaa0e77b22f436aeecb57fdcf6dc97ebfb7/packages/%40cowlick/engine/src/components/Message.ts#L143
ディスプレイ/キーボードを使わずにsshとWiresharkを使ってRaspberry Piをセットアップする

# TL;DR
rasbianにはavahi(mdns)が入っているので、起動時のmdnsパケットをキャプチャしてsshアクセスする
WiresharkのDisplay Filterにmdnsを入力してから、Raspberry Piの電源を入れる

# 動機
~~MicroHDMIケーブルを買い忘れた~~
そもそもUSBキーボードもない
いろんなケーブルつなげるのが面倒
普段使っているソフト(ssh client, wireshark)だけでなんとかしたい
Bonjour Print Services for Windowsなどは入れたくない


## 環境
- Windows
  - Wireshark
  - ssh client(TeraTermなど)
- Raspberri Pi
  - buster(stretchもたぶん可)
  - MicroSD
  - Lanケーブル
  - 電源

# 手順
- Wiresharkを立ち上げておく
- Display Filterにmdnsと入力
  - ブラウザ、sshなど落としたくない 
- Raspberry Piの電源を入れる
- Wiresharkにmndsパケットが表示されるので、そのIP Addressをコピー
- ssh client(TeraTerm)を使って、IP Addressへアクセス
  - pi, raspberry(default) 

# link
[Raspberry Pi をディスプレイ/キーボードなしで初期設定する](https://qiita.com/eup42/items/58bf6c336d325eba3ee2) 
[ラズパイをディスプレイなしでsshだけでリモートセットアップする](https://qiita.com/yuppejp/items/413b32d14d58c10e192c)