OmniAICreator/Qiita-1.07M huggingface dataset:
Unity：アセット（Asset）のインポートの方法（５種類！？）




# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

Unity では、Asset Store や Github で 「～.unitypackage」ファイルをダウンロードして使う事がありますよね。

今回はこの ***.unitypackage ファイルをインポート***して使う方法／***Asset Storeでインポート***して使う方法をいくつかご紹介させていただきます。

# インポートの使い方

インポート方法については[ブログに使い方](https://www.fast-system.jp/unity-import-howto/)を記載しましたのでこちらをご参照ください。

# インポートの種類

アセットを組み込む方法は実はいくつかありますが、皆さんはいくつわかりますでしょうか？

私が調べた感じでは実は***５種類のアセットの組み込み方法***が存在します。
５種類ってすごくないですか！？

さっそくそれぞれの***方法をご紹介***させていただきます。

## １．ドラッグアンドドロップ

一番シンプルだと思う手順ですね。***～.unitypackage をドラッグアンドロップで Assets のフォルダに配置***
するとインポートが行えます。

※この方法はローカルに ～.unitypackage が無いと使えません。

![import1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/2a544c86-a5db-15d8-d4d7-c54df0f5e4bf.jpeg)

## ２．メニューからインポート

次にやるのは***メニューからインポート***するパッケージを選ぶ豊富です、こちらもポピュラーなやり方で皆さん知っているかと思います。

※この方法はローカルに ～.unitypackage が無いと使えません。

![import2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/c7bb7d19-a653-bed9-a8d8-efc014c918b7.jpeg)

## ３．Asset Storeからインポート

次の方法は、Asset Storeウィンドウを開いて、アセットを検索して***ページを開いてからインポート***を実行するやり方です。

※この方法は ***Asset Store を使う方法として一般的***です。
※ちなみにファイルの保存先は以下の保存先に保存されます。
　（C:\Users\%USERNAME%\AppData\Roaming\Unity\Asset Store-5.x）

![import3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/87e3f98b-b8d3-0f69-cd2b-0ea68d369fdb.jpeg)

## ４．PackageManager を使う

Unity 2018 移行では PackageManager の機能が追加されました。この機能はUnityの公式パッケージを配布するための方法として実装されているようです。そのため***Unityが公式で配布しているアセットはインストール***が行えます。

![image-212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/4b5d2f66-a020-11e5-8e8b-a76e148cb123.png)

![image-213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/9e1c9ad4-8c72-09aa-35f0-ab4d4c194e38.png)

## ５．manifest.json を記述する

[こちらの記事](https://www.fast-system.jp/unity-deform-1-0-assets/)で使っていますが、プロジェクトに保存されている***「manifest.json」にURLを追加すると自動的にアセットがインストール***されます。
これは PackageManager はUnity公式の配布で利用されていますが、manifest.jsonを変更する事により、第三者でもパッケージの配布が行えることを指します。（Unity的にはこの使い方はグレー・・・？）

Package ＞ manifest.json に保存されているファイルを編集するので、エクスプローラーで探してエディタで開きましょう。

![image-114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/8cf25594-1b24-6c38-1c3e-c293ff25ab34.png)

テキストファイルの先頭に「”com.beans.deform”: “https://github.com/keenanwoodall/Deform.git”,」を追加します。

![image-115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/4510c34e-6cee-6c68-86b8-9cf7a6d900d0.png)

# 最後に

どうでしたでしょうか、最後の manifest.json を変更する方法は知らない方が多かったのではないでしょうか。
Unity の PackageManager が追加されてから パッケージの管理の複雑さが増した感じがしますがすごく便利なのでぜひ積極的に活用してみましょう！

*よければ ブログ「[初心者向けUnity情報サイト](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
Unity：Sceneで特定モデルの表示・非表示を切り替える

# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

***Unity 2019.1*** からシーンビューでモデルの表示・非表示が行える機能が追加されていましたのでそのご紹介をさせていただきます。

# 切り替え方法

使い方は簡単です、HierarchyビューでON/OFFをしたいモデルにマークを付けます。

![image-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/fb4358a7-6a46-f99c-afca-d4d772cb3183.png)

次に、シーンビューのアイコンをON/OFFすると、表示・非表示が切り替えられます。!

![image-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/4f5ac12c-d61c-b4b6-abc5-76074e90bec2.png)

実際に試した感じはこんな感じです。

![visible-hidden-toggle.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227880/b8680130-744f-68d9-a1ba-23714a7e7998.gif)

# 終わりに

*よければ ブログ「[初心者向けUnity情報サイト](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*
今朝、Windows 10が起動しませんでした。

Windows10の入っているDell のノートPCが、今朝電源を入れても、
起動画面の棒が３分の１くらいのところで止まったまま。

ファンがうんうんうなりだして、止まった起動画面のまま先に進まなくなりました。

うんうんうなっているということは、前に動かしていたプロセスなどが残っているのだろうと思います。
電源を入れ直しました。

今度は途中で止まることなく、Windows 10が起動しました。

似た状態があれば、細かい仕様なども含めて順次追記します。

自分でメモリ増設した機材。（下記）。不具合があるとドキドキ。

 <この項は書きかけです。順次追記します。>


# 参考資料

DellのNotePCのメモリ増設作業記録
https://qiita.com/kaizen_nagoya/items/2dc00c1e79c740a16869

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
 

# 文書履歴(document history)
ver. 0.01 初稿 20190507 早朝
ver. 0.02 用語補正 20190507 朝
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Jakarta EEでのjakartaパッケージ名前空間への移行

5月3日に、Jakarta EEでのjavaxパッケージ名前空間の使用についてアナウンス(*1)がありましたが、javaxを拡張できない(*2)ことは、Java EEからJakarta EEへの移行において大きな問題となります。

Jakarta EE.next (Jakarta EE 9以降)において、Jakarta EE 8との互換を最大限保証し、jakartaパッケージ名前空間へのスムーズな移行のために、Jakarta EEワーキンググループの仕様策定委員会では２つの案を提示(*3)し、
開発者からのフィードバックを求めています。この２つの案は出発点にすぎず、それ以外の案の提案も歓迎しています。

以下が２案の概要。

# 案１ Jakarta EE 9でビッグバン、Jakarta EE 10で新機能
すべてのAPIを、javaxからjakartaに一気に変更することにより、
移行に伴うコストと痛みを１回限りにおさえる。
Jakarta EE 9ではパッケージ名の変更だけで新機能の追加はしない。
Jakarta EE 10で新機能を追加するが、Jakarta EE 9のリリース前に、検討を開始する。


# 案２ Jakarta EE 9で段階的に変更
仕様の拡張が必要なものから、順次javaxからjakartaに変更していくことで、
移行に伴う最初のコストを最小限におさえる。
仕様の変更(JavaMailなどの塩漬けAPI)がないものは、javaxのまま。
Jakarta EE 9では、javaxとjakartaパッケージが混在する。
Jakarta EE 10でも混在するが、Jakarta EE 9と混在具合が違うことになる。

-----
(*1)
原文 https://eclipse-foundation.blog/2019/05/03/jakarta-ee-java-trademarks/
日本語 https://qiita.com/kazumura/items/7f87afb0d2fdc7f42e2b

(*2)
拡張できない例

- enumに値を追加する
- メソッドをオーバーライドや追加する
- interfaceにデフォルトメソッドを追加する
- Java言語仕様の変更に対応した変更

(*3)
https://www.eclipse.org/lists/jakartaee-platform-dev/msg00029.html
Laravel5.8で簡単画像アップロード機能の実装

Laravelを使い初めて、画像アップロード公開が***ものすごく***簡単に実装できて感動したので、投稿します。

#１、画像を保存。
##(1) 下準備

/config/filesystem.phpの設定を変更。

```
'default' => env('FILESYSTEM_DRIVER', 'local'),
```

localのままだと不都合があるため（これから説明）、***.envファイルに下記を追記***しpublicに設定変更してあげる。

/.env

```
FILESYSTEM_DRIVER=public
```

## (2) 画像をアップロード

```
$image = $request->image->store('posts');
```
この１行で画像自体のアップロードは完了。
後は必要に応じて返り値の画像パスをDBに保存するだけ。

formから送られてきた画像データに対し、storeメソッドを呼ぶと、storage/app/public配下にデータが保存される。例のようにstoreメソッドでディレクトリを指定することもできる。今回の場合は、storage/app/public/posts配下に保存される。

※localのままだと、storage/app直下に保存されるので、これから説明するシンボリックリンクがはれない。




#２、画像を表示
##(1) viewで表示できるように、laravelの公開用publicフォルダにシンボリックリンクをはる。

```
php artisan storage:link;
```
上記コマンドをターミナルで実行すると、
public配下にstorageリンクが作成される。

/public/storage/画像パス

##(2) viewで表示

```
<img src="{ asset('storage/画像のパス') }}">
```
で保存した画像をviewで表示できる。

※asset()を使うとフルパスになる。

#３、アップロードした画像の削除

DBから画像のパスを削除した際に、Storageフォルダにアップロードした画像を同時に削除する方法。

Storageファサードのdeleteメソッドで保存していた画像を削除できる。

```
use Illuminate\Support\Facades\Storage;
```

```
Storage::delete('画像パス');
```

データ削除した際に、上記メソッドを行えば、画像データも同時に削除できる。

以上、で簡単に画像のCRUDが実装できます。

参考：（公式ドキュメント）
https://readouble.com/laravel/5.8/ja/filesystem.html
【.NET 5】 がやってくる！

#この記事 is 何？
[**.NETブログ**](https://devblogs.microsoft.com/dotnet/) に投稿された「[**Introducing .NET 5**](https://devblogs.microsoft.com/dotnet/introducing-net-5/)」という記事を掻い摘んで紹介するなんちゃって翻訳記事です。  

#TL;DR;
- .NET Core の次期バージョンから【**.NET 5**】って名前になるからよろしくね！  
- その兼ね合いで.NET Frameworkなくなるよ！
- Monoは、もうしばらく残るよ！

#.NET - 統一プラットフォーム
現在.NETのプラットフォームには, .NET Core / .NET Framework / Mono という3種類のフレームワークがありますが, 今後これらを統合して **.NET** という一つのプラットフォームとなります.  

`.NET 5` 以降からは, Windows / Linux / macOC / iOS / Android / tvOS / watchOS / WebAssembly などをターゲットにすることが可能となります.  

また, `.NET` を作成するために `.NET Core` と `Mono` を使用しています. `.NET Framework` については, 現時点でその大部分を `.NET Core 3.0` に統合が完了しており, 残りもわずかとなっています.  

`.NET 5` の最初のプレビューは2020年前半を予定しており, 2020年11月のリリースを予定しています.  

##.NET 5 = .NET Core vNext
`.NET プロジェクト` は `.NET Core プロジェクト` の次のステップです. `.NET 5`は主に以下のような点での .NET の向上を目指しています.  

- どんなプラットフォーム上でも動作し, 実行時の挙動や開発者の経験が統一された単一の.NETランタイムとフレームワークを作成する.
- .NET Core / .NET Framework / Xamarin / Mono を最大限に活かして, .NETの機能を拡張する.
- .NETの開発者(= Microsoft と コミュニティ) が単一のコードベースからプロダクトを構築することが可能になることで, すべてのシナリオが改善される.

この新しい `.NET プロジェクト` は, .NETにとって大きな変革となります.
`.NET 5` では, 作成するアプリの種類に関係なく, コードファイルとプロジェクトファイルは同じように見えます. これは, 各アプリで同じ ランタイム / API / 言語機能 にアクセス可能であることを意味しています.  

また, `.NET Core プロジェクト` のオープン性やハイパフォーマンスな点などについては, 今後も変わらずに担保されます.  


# おわりに
原文はもっといろいろなことが記載されていますが, 今回はおそらく大部分の方が気になる点についてのみ抜き出してきました.
.NET Core と Mono の今後についてや, どういった方向でフレームワークが開発されていくのかが気になるかたは, 原文を読んでみてみると良いかもしれません.
5Gの概観を探る3　　5Gへの要求

この記事は、第5世代移動通信システム(以下、5G)の概観を把握するために、役にたちそうな情報を取りまとめていく。　その３。

#ITU-Tからの要求
　5Gの仕様を標準化する組織は3GPPであるが、3GPPはITU-T(国際電気通信連合 電気通信標準化部門)の要求に従って標準化を進めている。
　ITU-Tは、次のような要求を行っている。

 - enhanced Mobile BroadBand (モバイルブロードバンドのさらなる高度化)
 - massive Machine Type Communications (多数同時接続を実現するマシンタイプ通信)
 - Ultra-Reliable and Low Latency Communications (高信頼・超低遅延通信)

>「Recommendation ITU-R M.2083-0, IMT Vision - Framework and overall objectives of the future development of IMT for 2020 and beyond」
>https://www.itu.int/dms_pubrec/itu-r/rec/m/R-REC-M.2083-0-201509-I!!PDF-E.pdf

#Release15における要求の言及
　Release15では「5.2 The 5GS service aspects」で、ITU-Tの要求に言及し、要求に基づいて定義される5Gの特徴を取りまとめている。

　5Gでは、実現すべき具体的な値を個々のシナリオごとに定義するが、それらのシナリオも値と一緒に定義される。(たとえば、航空サービスでは飛行機一機に対して1.2Gbpsのビットレートを期待する、など）

以下に取りまとめられた5Gの特徴を紹介する。

#####Enhanced Mobile Broadband (eMBB)
　高データレート、高トラフィック密度、高モビリティ
#####Critical Communications (CC) and Ultra Reliable and Low Latency Communications (URLLC)
　高信頼性、低遅延、高可用性
#####Massive Internet of Things (mIoT)
　高いトラフィック密度にある様々なIoTデバイスのサポート
#####Flexible network operations
　エンドツーエンドの品質を柔軟に提供するための能力。
　スライシング、ネットワーク機能の公開、拡張性、多様なモバイリティ、セキュリティ、効率的なコンテンツ配信、移行と相互運用性

>3GPP「TR 21.915 V1.0.0 　5.2 The 5GS service aspects」

#垂直産業を結び付ける5Gネットワーク
5Gではこれまで結びつきが弱かった産業(Veticals(垂直産業)と呼ばれる)の間にもネットワークを築こうとしている。release15では、5Gで新たなネットワークが構築される産業分野として以下を言及している。

-	Automotive and other transport (trains, maritime communications)
-	Transport, logistics, IoT.
-	Discrete automation.
-	Electricity distribution.
-	Public Safety.
-	Health and wellness.
-	Smart cities.
-	Media and entertainment.
node-gyp@3.8.0がtar@2.0.0に依存している問題の解決方法

Angularで何かを作ろうとするとき、`ng new project-name`して新しいプロジェクトを作成するわけですが、するとnpmが脆弱性のあるパッケージがあるから`npm audit fix`して修正するか、それが無理だったら`npm audit`して原因を確認して手動で修正してね、と言ってくることがあります。

調べてみるとnode-gyp@3.8.0がtar@2.0.0に依存していて、tarは4.4.2より前だと脆弱性があるんですね。

解決策をググってみても、どうもピンと来る解決策をズバリ書いている記事に出会わない...

そこで結論をズバリ書きますね。

```
npm install node-gyp -g
```
こうすると、node-gyp@4.0.0がグローバルに入るので、これで問題が解決します。
🔰オブジェクト指向を自分なりに落とし込んでみた



##なぜオブジェクト指向を使うのか。

類似処理が存在するときに、修正が発生した場合一つ一つのクラスに処理を生書きしていると変更箇所が多くなってしまう事と、類似処理なのに挙動が統一されなくなる可能性がある為。

複数人での開発時に、インターフェースが存在していると、継承したインターフェイスのデータと振る舞いしか使うことができなくなる為、オレオレコードが存在しにくくなる。

##基本用語集

**object(オブジェクト)**
データと振る舞いの集合体を表すもの
パソコンを操作している事を例に挙げると、
**object**

- パソコン
- ディスプレイ
- キーボード
- マウス
- 人

この様な形に分解できる

**property(プロパティ)**
objectが持っているデータのことをpropertyと言う。
パソコンというobjectは「CPU」「メモリ」「マザーボード」などのpropertyを持っている事になる。
オブジェクトの状態を示すものもpropertyとして持つこともある（パソコンの起動状態等）

**method(メソッド)**
Methodはobjectが持っている処理（関数）。
パソコンの例だと「電源をつける」「電源を落とす」「スリープ状態ににする」といったobjectが振る舞いをする処理のこと。

**instance(インタスタンス化)**
objectを呼び出して実態として生み出されるもの
Newして使うことが多い

```
pc1 = new pc();
```
上記の様な書き方をする

**継承**
Objectやinterfaceの機能を引き継いで使用することを継承と言う。
PCを例に挙げると「ノートパソコン」「デスクトップパソコン」などのデータと振る舞いが同一のものを作る際に同じ機能を実装できます。

**カプセル化**
外部からいじる必要のない振る舞いやデータを隠蔽することを指す。
Object内部のデータを参照したり使用したい場合は外部から操作可能な振る舞いを設ける

メソッドを使う人達にとって処理の中身がどうなっているのかはわからなくても、何ができるのかメソッド名で分かればいいのでカプセル化が有効。
Ban4ipをインストールした

[公開しているRaspberryPiにちょっかいを出してくる怪しい奴らを蹴るためにBan4ipをインストールした](https://xn--v6q832hwdkvom.com/post/%E5%85%AC%E9%96%8B%E3%81%97%E3%81%A6%E3%81%84%E3%82%8Braspberrypi%E3%81%AB%E3%81%A1%E3%82%87%E3%81%A3%E3%81%8B%E3%81%84%E3%82%92%E5%87%BA%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8B%E6%80%AA%E3%81%97%E3%81%84%E5%A5%B4%E3%82%89%E3%82%92%E8%B9%B4%E3%82%8B%E3%81%9F%E3%82%81%E3%81%ABban4ip%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F/)の抜粋版です

## What's Ban4ip

[disco-v8/Ban4ip](https://github.com/disco-v8/Ban4ip/blob/master/README_ban4ip.ja_jp.utf8)

## インストールした環境

```shell
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian
```

## Ban4ipを動作させるための環境を準備する

```
$ sudo apt update
$ sudo apt -y upgrade

$ sudo apt -y install php php-cli php-common php-dev php-pear
$ sudo apt -y install sqlite3 php7.0-sqlite3
$ sudo apt -y install php7.0-mbstring
$ php -r "phpinfo();" | grep sqlite
PDO drivers => sqlite

$ sudo apt -y autoremove

$ sudo pecl install inotify
$ sudo nano /etc/php/7.0/mods-available/inotify.ini
extension=inotify.so

$ cd /etc/php/7.0/cli/conf.d/
$ sudo ln -s ../../mods-available/inotify.ini ./20-inotify.ini

$ php -r "var_dump(function_exists('inotify_init'));"
bool(true)
```

## Ban4ipをインストールする

```
$ cd ~
$ mkdir Ban4ip
$ cd Ban4ip

$ wget 'https://github.com/disco-v8/Ban4ip/archive/master.zip' -O Ban4ip-master.zip
$ unzip Ban4ip-master.zip
$ cd ./Ban4ip-master

$ chmod 700 ./ban4ipd
$ chmod 700 ./ban4ipc
$ chmod 755 ./init.d/ban4ip

$ sudo mkdir /etc/ban4ip
$ sudo mkdir /var/lib/ban4ip

$ sudo cp ./ban4ipd.conf /etc/
$ sudo cp ./ban4ip/sshd.conf /etc/ban4ip/

$ sudo cp ./ban4ipc /usr/bin/
$ sudo cp ./ban4ipd /usr/bin/
$ sudo cp ./ban4ipd_*.php /usr/bin/
$ sudo cp ./logrotate.d/ban4ip /etc/logrotate.d/
$ sudo cp ./systemd/ban4ip.service /etc/systemd/system/
```

`$ sudo cp ./ban4ip/sshd.conf /etc/ban4ip/`でsshdを監視するための設定ファイルをコピー(=監視が有効になる)している  
`Ban4ip-master/ban4ip`にある設定ファイルは必要なものだけをコピーするようにする

## /etc/ban4ip/sshd.confを書き換える

```
$ sudo nano /etc/ban4ip/sshd.conf
# target_log = '/var/log/secure'
target_log = '/var/log/auth.log'
```

## Ban4ipを起動する

```
$ sudo systemctl daemon-reload
$ sudo systemctl enable ban4ip
Created symlink /etc/systemd/system/multi-user.target.wants/ban4ip.service → /etc/systemd/system/ban4ip.service.

$ sudo systemctl start ban4ip
```
RDBMSに格納したGTFSデータから時刻表を作成してみる

[GTFS Advent Calendar](https://gw-advent.9wick.com/calendars/14) 7日目の記事です。
今日はRDBMSに格納したGTFSデータに対してSQLクエリを実行し、時刻表を作成する手順を紹介しようと思います。

[6日目の記事](https://qiita.com/valsitoh/items/5ed7ad3168e3d54bc0e8)で作成したER図を眺めてみると、どうやら以下の4つのテーブルの情報を組み合わせると時刻表が作成できそうです。

<img width="430" alt="SnapCrab_NoName_2019-5-7_5-58-59_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152217/5c2f1cbf-499f-f7f0-2f91-e89c2a17bd0f.png">

さっそくSQLクエリを作成してみましょう。経路ID( `route_id` )と便ID( `trip_id` )、そして標柱ID( `stop_id` )をそれぞれ組み合わせることになります。「ある経路を走っている便と、その便の停留所(標柱)をまとめたものが時刻表だよね」という話になります。

```sql
SELECT
   r.route_short_name AS 経路略称,
   r.route_long_name AS 経路名,
   t.trip_id AS 便ID,
   t.trip_short_name AS 便名称,
   t.trip_headsign AS 便行先,
   s.stop_id as 停留所・標柱ID,
   s.stop_name as 停留所・標柱名称,
   st.arrival_time as 到着時刻,
   st.departure_time as 出発時刻
  FROM
    stop_times AS st,
    stops AS s,
    trips AS t,
    routes AS r
  WHERE
    r.route_id = t.route_id
    AND t.trip_id = st.trip_id
    AND st.stop_id = s.stop_id
  ORDER BY
    st.trip_id,
    st.arrival_time
  ;
```

このSQLクエリを実行すると、以下の結果が得られます。何となくそれっぽい結果ですが、ホントに時刻表の形になっているのでしょうか？

<img width="578" alt="SnapCrab_NoName_2019-5-7_6-36-13_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152217/68ca9ccf-aaac-b674-572c-047480ce56fa.png">

[北恵那交通株式会社](http://www.kitaena.co.jp/)の[GTFSデータ](http://www.kitaena.co.jp/info/2019/03/gtfs-jp.html)を用いた探索はGoogleマップからも行えるので、その探索結果を使って答え合わせ(？)してみます。

`9:30` に中津川駅前を出発して中京大学口に行くバスをGoogleマップ上で探索し、その結果と先のSQLクエリの結果を照らし合わせると良さそうです。

<img width="301" alt="SnapCrab_NoName_2019-5-7_6-14-53_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152217/f9fe9602-5d6b-5d7b-6c46-8fad79c38db7.png">

SQLクエリの結果と一致しています。ちゃんと時刻表が作成できていますね！

## まとめ

RDBMSに格納したGTFSデータに対してSQLクエリを実行し、時刻表を作成する方法を紹介しました。
GTFSデータは経路情報や便情報、通過時刻情報といった単位でファイル(CSV)が分けられていますが、IDをキーにしてデータをまとめる(RDBMS的には表結合する)ことで、比較的理解しやすい形でデータを処理できそうです。
GTFSのデータ構造をER図で概観する

[GTFS Advent Calendar](https://gw-advent.9wick.com/calendars/14) 6日目の記事です。
今日はRDBMSでER図を作成する機能を応用し、GTFSデータの構造をちょっとだけ見やすくする方法を紹介しようと思います。

## GTFS仕様におけるデータの関連

GTFSの仕様書では、各CSV内のフィールド間の関連を示す図が示されています(下記PDFファイルの5ページ目)。

 * [静的バス情報フォーマット（GTFS-JP)仕様書（第２版）　（2019年３月27日）](http://www.mlit.go.jp/common/001283244.pdf)(PDFファイル)

<img width="310" alt="SnapCrab_NoName_2019-5-7_5-21-50_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152217/236341a2-a08b-665c-a85c-3c8ca2d54cf7.png">

例えば便情報(trips.txt)であれば、 `route_id` や `service_id` 、 `shape_id` といったフィールドが他のCSVファイル内のフィールドと紐づいていることが見て取れます。

この紐づき情報を活用し、RDBMSでのテーブル定義時に外部キーとしてフィールド定義することで、ER図等で各GTFSデータ間の関連を見やすくしてみようと思います。

## GTFSのテーブル定義とER図作成

まずはテーブル定義です。テーブルと(完全ではありませんが)必要な外部キー定義を記載したSQLファイルを以下に用意しました。といっても、[2日目の記事](https://qiita.com/valsitoh/items/e3519bbfee27c2ecdcbd)での環境構築時にこのSQLを実行しているので、すでにDockerイメージ内のMySQLには定義が入った状態になっています。

 * [ValLaboratory/advcal/2019/gw/docker_env/docker/gtfs_db/script/gtfs_reference.sql](https://github.com/ValLaboratory/advcal/blob/master/2019/gw/docker_env/docker/gtfs_db/script/gtfs_reference.sql)

つぎはこのテーブル定義からER図を作成してみます。MySQLには[MySQL Workbench](https://www.mysql.com/jp/products/workbench/)というGUIツールがあり、このツールが提供する機能の一つにテーブル定義からER図を作成するというものがあります。

さっそくER図の作成機能を使ってみましょう。
MySQL WorkbenchからGTFSデータが格納されたDBに接続した状態で以下の手順を実行します。

ホーム画面から、"Models"-"Create EER Model from Database"を選択します。

<img width="265" alt="SnapCrab_NoName_2019-5-7_5-32-30_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152217/1cdb54bf-7410-ed65-5664-96bac64c0f75.png">

ER図の作成対象とするデータベースは「gtfs_db_reference」を選択します。
([gtfs_reference.sql](https://github.com/ValLaboratory/advcal/blob/master/2019/gw/docker_env/docker/gtfs_db/script/gtfs_reference.sql)でテーブル定義を作成したDBになります)

<img width="205" alt="SnapCrab_NoName_2019-5-7_5-35-28_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152217/6e8cf6f4-2e00-ddea-595d-5e9bf90c8950.png">

あとはダイアログの右下にある"Next"ボタンを押してゆくだけでOKです。

すると以下のような感じでER図が生成されます。テーブル定義にマウスカーソルを合わせると、主キー・外部キーになっているフィールドがそれぞれ青色と緑色で表示され、どのテーブルと関連しているかが把握しやすくなります。

<img width="516" alt="SnapCrab_NoName_2019-5-7_5-43-41_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152217/61212bb9-3e33-bd83-7f62-8d9c8c564df7.png">

実際にこれらの外部キー設定がある状態でGTFSデータをDBに投入しようとすると、制約が厳しすぎてエラーになってしまう場合があります(そもそも元のデータの段階でIDとなるレコードが重複していることもある)。そのため、まずは制約を付けない状態のテーブルを定義して利用するのが良さそうです。
([2日目](https://qiita.com/valsitoh/items/e3519bbfee27c2ecdcbd)の記事で紹介したRDBMS環境で `gtfs_db` と `gtfs_db_reference` という2つのDBを用意しているのはこのためです)

## まとめ

GTFSのテーブル定義に外部キー設定を加え、RDBMSのツールと連携させることでER図を生成してみました。

あらかじめ外部キーという形でテーブル間の関連を定義しておく必要があり、それがちょっと面倒ではありますが、GTFSについては最初にある程度テーブル定義と外部キーの関連を記載したSQLを用意しておき、仕様の追加・変更に応じてリファインメントするようにしておくと、後からGTFSの仕様を理解しようとする人の助けになりそうな気がします。
JavaScript(ES6)の関数、オブジェクト、クラスのまとめ

[文法まとめ](https://qiita.com/fujigaki/items/409dd0aa3fd1e3f6b269)に引き続き、関数、オブジェクト、クラスのまとめ。


今回クラス設計にふれて、内容がオブジェクト指向に関わって来ましたが、だんだん複雑になって来ますね。
そこで、[開眼! JavaScript](https://www.amazon.co.jp/%E9%96%8B%E7%9C%BC-JavaScript-%E2%80%95%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6JavaScript%E3%81%AE%E6%9C%AC%E8%B3%AA-Cody-Lindley/dp/487311621X)を読む事にしました。こちらは後程まとめますが、JavaScript特有のクセを理解するのに役立ちそうです。

以下、とりあえず今回は、文法まとめの続きです。


## 関数


### 関数の定義

```js
const 定数名 = function(引数名) {
  //まとめたい処理を書く
  return 戻り値
};
```

### アロー関数
ES6からの新しい関数定義方法です。
```function()```を```() =>```と短く書く事が出来ます。
この書き方をアロー関数と呼びます。

```js
const 定数名 = (引数名) => {
  //まとめたい処理を書く
　return 戻り値
};
```

## オブジェクト
文法まとめにも書きましたが、

```js
// オブジェクトの定義
const 定数名 = { プロパティ名1: 値1, プロパティ名2: atai2 }

// オブジェクトの呼び出し
console.log(定数名.プロパティ名)
```

オブジェクトの値に関数を持たせる

```js
// オブジェクトの値に関数を定義
const 定数名 = {
  プロパティ名: () => {
    処理
  };

// オブジェクトの値に定義した関数の呼び出し
定数名.プロパティ名();
```

## クラス
オブジェクトをたくさん作るための設計図です。
例えば、下記のように本のタイトルと著者の情報を持ったオブジェクトを使いたい場合、本の情報が増える度に無限にオブジェクトを定義する事になります。

```js
const book1 = { title: 'こころ', author: '夏目漱石' };
const book2 = { title: '人間失格', author: '太宰治' };
const book3 = { title: '銀河鉄道の夜', author: '宮沢賢治' };
.
.
.
本の情報が増える度に定義し続ける事になる
```

同じ構造のオブジェクトが複数回必要になる場合は、クラスを1度定義し、クラスからオブジェクトを生成します。
クラスから生成したオブジェクトは、インスタンスと呼びます。

### クラスの定義

```js
class クラス名 {

}
```

### インスタンスの生成

```js
　
class クラス名 {

}

const 定数名 = new クラス名();
```

### コンストラクタ
クラスにはコンストラクタと呼ばれる機能があります。
コンストラクタは、インスタンスが生成された時に実行されます。
また、コンストラクタの中で``` this.プロパティ名 = 値;```と書くとインスタンスにプロパティと値を追加出来ます。

```js
class クラス名 {
  constructor(引数) {
    this.プロパティ名 = 値;
  }
}
```

### メソッド

```js
//　メソッドの定義
class クラス名 {
  メソッド名() {
    処理
  }
}

// メソッド呼び出し
const 定数名 = new クラス名
定数名.メソッド名();
```



アンキパン欲しい・・・
現実逃避はさておき、地道にアウトプットして覚えるしかない。自作アプリに組み込むなどして、実際に使っていかないと。
JavaScript(ES6)の基本文法まとめ

JavaScriptを覚える必要が出て来たので、勉強開始。
忘れないうちに自分用にアウトプット。

## 今回やった事
JavaScriptを使う上で、Vue.jsやReactなどのフレームワークの使用が主流となっているようですが、最初は、ピュアなjsを覚えた方が良さそうなので、JavaScriptのES6を覚える事にしました。今回は、文法とクラスに関してまとめます。

* ES6とはJavaScriptのバージョン名で、これから始めるのであればES6推奨らしい。

##文法まとめ

### データ出力

```js
console.log(値);
```

### 文字列
値に文字列を使用したい場合は、使用したい文字列をシングルクォーテーション、ダブルクォーテーションで囲って使用します。

```js
'文字列1'
"文字列2"
```

### let 変数の宣言
``let``の後ろに変数名を書いて宣言する。
その後に=で代入。

```js
let 変数名 = 値;
```
### 算術演算子

```js

// 加算(足し算)
console.log(1 + 2);
// 減算(引き算)
console.log(5 - 3);
// 乗算(掛け算)
console.log(5 * 4);
// 除算(割り算)
console.log(9 / 3);
// 剰余(割った余り)
console.log(9 % 2);
```

### 加算、減算の省略
既に値の入っている変数```int```に対し、加算、減算を行った結果を代入する場合下記のように書きます。

```js
int += 1
int -= 1
```

ただし、1を足したり、引いたりする場合は下記のように省略して書く事が出来ます。

```js
int ++
int --
```
この書き方はループ処理で条件の値を更新する時に使うので、覚えておく必要があります。

### 比較演算子

```js
// 等しい時trueを返す
a === b
// 等しくない時trueを返す
a !== b
```

### 配列

要素を ```[]```で囲います。要素の間は```,```で区切ります。

```js
[値1, 値2, 値3]
```

### オブジェクト
配列とは違い```{}```で囲います。プロパティと値の間は```:```で区切ります。
要素の間は```,```で区切ります。

```
{ プロパティ1: 値1, プロパティ2: 値2, プロパティ3: 値3 }
```

### if 条件分岐

```js
if (条件式) {
  処理1;
} else if {
  処理2;
} else {
  処理3;
}
```

### switch 条件分岐

```js
switch(条件の値) {
  case 値1:
    処理1
    break;
  case 値2:
    処理2
    break;
  case 値2:
    処理2
    break;
  default:
    デフォルトの処理 //caseのどの条件にも当てはまらない時の処理を書く
    break;
}
```

### while 繰り返し処理

```js
while (条件式) {
  処理
}
```

### for 繰り返し
```js
for (変数の定義; 条件式; 変数の更新) {
  処理
}
```

このままアウトプットし続けて、なんとか覚えたい。
.NET Core 3.0 の目玉の single exe を preview5 で試してみた

# .NET Core 3.0 の目玉の single exe を preview5 で試してみた

.NET Core 3.0 の目玉の single exe がどれくらいのサイズになるのか興味があって、 preview5 で試してみた.
Hello World が 67MB だった.
出来た EXE を .NET Core 3.0 preview が入っていない別のマシンに持っていって動くことは確認できたが、Assembly trimmer 待ちかなあと思わされるサイズである.

```
C:\Users\user\source\repos\ConsoleApp1>type ConsoleApp1\Program.cs
using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

C:\Users\user\source\repos\ConsoleApp1>dotnet publish -r win10-x64 -c Release /p:PublishSingleFile=true
Microsoft (R) Build Engine version 16.0.462+g62fb89029d for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 33.73 ms for C:\Users\user\source\repos\ConsoleApp1\ConsoleApp1\ConsoleApp1.csproj.
C:\Program Files\dotnet\sdk\3.0.100-preview5-011568\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.RuntimeIdentifierInference.targets(157,5): message NETSDK1057: You are using a preview version of .NET Core. See: https://aka.ms/dotnet-core-preview [C:\Users\user\source\repos\ConsoleApp1\ConsoleApp1\ConsoleApp1.csproj]
  ConsoleApp1 -> C:\Users\user\source\repos\ConsoleApp1\ConsoleApp1\bin\Release\netcoreapp3.0\win10-x64\ConsoleApp1.dll
  ConsoleApp1 -> C:\Users\user\source\repos\ConsoleApp1\ConsoleApp1\bin\Release\netcoreapp3.0\win10-x64\publish\

C:\Users\user\source\repos\ConsoleApp1>dir ConsoleApp1\bin\Release\netcoreapp3.0\win10-x64\publish\
 Volume in drive C has no label.
 Volume Serial Number is 9697-D272

 Directory of C:\Users\user\source\repos\ConsoleApp1\ConsoleApp1\bin\Release\netcoreapp3.0\win10-x64\publish

05/06/2019  07:05 PM    <DIR>          .
05/06/2019  07:05 PM    <DIR>          ..
05/06/2019  07:05 PM        70,272,314 ConsoleApp1.exe
05/06/2019  07:05 PM               440 ConsoleApp1.pdb
               2 File(s)     70,272,754 bytes
               2 Dir(s)  79,950,237,696 bytes free
```
LaravelでLeague/Csvを使ってアップロードされたcsvを読み込みDBに保存する

#環境
Laravel 5.6
League/Csv 9.2

#前提
* Qiita初投稿です、お手柔らかにお願いします。
* 今回はバリデーションについては実装、言及しません。

#導入
League/Csvをインストールする。
composer dump-autoloadは多分必要。

```
composer require league/csv
composer dump-autoload
```

#今回ぶち込みたいCSV

|company_name|name|email|
|---|---|---|
|hoge株式会社|佐藤|exapmle1@example.com|
|foo株式会社|山田|exapmle2@example.com|

#実装

```UserController.php
<?php

namespace App\Http\Controllers;

use App\Eloquent\User;
use Illuminate\Http\Request;
use League\Csv\Reader;
use League\Csv\Statement;

class UserController extends Controller
{

    // 省略

    public function importCSV(Request $request, Statement $stmt, User $user)
    {
        $file_path = $request->file('file')->getPathname();
        // ReaderはDIできないらしい。
        $csv = Reader::createFromPath($file_path, 'r')->setHeaderOffset(0);
        $records = $stmt->process($csv);
        $data = [];

        // 後ほど解説。
        foreach ($records as $record) {
            $record['created_at'] = now();
            $record['updated_at'] = now();
            $data[] = $record;
        }
        $user->insert($data);

        return redirect()->route('user.index');
    }
}
```

# 解説
ここでリクエストされたfileの一時保管パス？的なのを取得する。

```.php
$file_path = $request->file('file')->getPathname();
```

そしてここ、

```.php
foreach ($records as $record) {
            $record['created_at'] = now();
            $record['updated_at'] = now();
            $data[] = $record;
        }
        $user->insert($data);
```

$recordsには

```
ResultSet {#375 ▼
  #records: LimitIterator {#372 ▶}
  #header: array:4 [▶]
}
```

というオブジェクトが入っているのでforeachで取得していくとなんと、各recordには

```
[ "company_name" => "hoge株式会社"
  "name" => "佐藤",
  "email" => "example1@example.com"
]
```

などの配列が入っているというわけ。

Laravelだとinsertの引数に各レコードを値にもつ多次元配列を渡すことで複数レコードまとめて挿入できる。
しかし、insertは「created_at」「updated_at」が更新されないので、foreachで回しながら入れている。


# おまけ

###今回のroute

```web.php
Route::post('/users/csv', "UserController@importCSV")->name('user.importCSV');
```

###今回のview

```users.blade.php
  {{ Form::open(['url' => route('user.importCSV'), 'method' => 'POST', 'class' => '', 'files' => true]) }}

  <div class='form-group'>
    <input type="file" name="file" value="">
  </div>

  <button type="submit">csv読み込み</button>

  {{ Form::close() }}
```

### 応用編

大切なことはすべて公式ドキュメントが教えてくれた。
9.0のドキュメント↓
https://github.com/thephpleague/csv/blob/master/docs/9.0/index.md

```.php
<?php
use League\Csv\Reader;
use League\Csv\Statement;

$csv = Reader::createFromPath('/path/to/your/csv/file.csv', 'r');

// headerは何行目か。
$csv->setHeaderOffset(0);

$header = $csv->getHeader();
//return [0 => "企業"
//  1 => "名前"
//  2 => "メールアドレス"]

//　10行飛ばして25行とる
$stmt = (new Statement())
    ->offset(10)
    ->limit(25);
$stmt->process($csv);

```

#まとめ
2019年でPHPでcsvをいじりたいってなると、goodbyか、このLeague/Csvの二強な感じがしていて、今回書きやすそうだしGitHubのスターもダントツでLeague/Csvの方が高かったのでこちらを採用しました。
今回は使わなかったのですが、goodbyは省メモリを売りにしているそうなのでメモリを気にする量のcsvを裁くときは視野に入れたいですね。
結局、Laravelが好きです。

#引用
https://github.com/thephpleague/csv/blob/master/docs/9.0/index.md
[News] .NET 5 を2020年11月にリリース予定

.NET CORE 3.0 = .NET 5が新しくリリースされるとのことで意訳しました。オリジナルはこちら　https://devblogs.microsoft.com/dotnet/introducing-net-5/

#.NET CORE 3.0 = .NET 5

今後は.NET5一本に統一。Windows, Linux, macOS, iOS, Android, tvOS, watchOS and WebAssembly などに対応していく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/8b7caa38-a747-3960-5536-ba0f863fa3e0.png)

# .NET5 2020年の11月にリリース(予定)

こちらがリリーススケジュール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/d4ebdbad-4fec-e903-e1a7-6deaf966ff36.png)


- 統一されたruntimeをすべてのプラットフォームで使えるようになる
- .NET Core, .NET Framework, Xamarin, Monoのいいことろを集約。
- 統一されたら１コードで管理が簡単になる（なりますね）。

- Javaとの互換性
- Objective-C, Swiftもサポート
- CoreFXでも稼働
- CORE 4 はスキップ、 .NET 4 との混乱を避けるため
- JITの強化
- 起動時間の改善、ソフトウェアの承認プロセスの簡素化、メモリー消費の効率化

# 一旦7月から

とりあえずは7月のRC版、9月のGAを見ていこうと思います。
【HTML CSS】

#目次

+ コーディングのコツ
+ HTML
+ CSS
+ デフォルトに戻す
+ floatと崩れ解除

##コーディングのコツ
・HTMLは、左上に重力のある積み木である
・積み木の一つ一つは中身の大きさの変わる箱である
・入れ子構造である
・レイアウトは大きな箱から考えていく
##HTML

##CSS
####デフォルトに戻す

```
body, html {
  height: 100%;
  background-color: white;
}

h1, h2, h3, h4, h5, h6, p, body {
  line-height: 1.77;
  font-size: 18px;
  color: #4a4a4a;
  font-family: sans-serif;
  margin: 0;
  padding: 0;
}
```
ブロック要素のデフォルトの大きさ

>横幅(width)・・・親要素の横幅と同じ
>高さ(height)・・・子要素の高さの合計

####floatと崩れ解除
左にコンテンツの箱を作り、右にサイドバーのレイアウトの場合

```:html
<div class="box">
    <div class="left"></div>
    <div class="right"></div>
</div>
```


```:css
.left_content{
    width: 700px;
    float: left;
}
.right_content{
    width: 140px;
    float: right;
}
```
float解除は、親要素=boxに対してclearfixをかけてあげることで崩れが修正される
classを追加して

```:html
<div class="box clearfix">
```
cssに追記します

```:css
.clearfix:after{
    content: "";
    clear: both;
    display: block;
}
```
Ruby SassからDart Sassへの移行手順

作業環境は以下の通り。

- Windows 
- Chocolatey
- Git Bash

SASSの公式を確認したところ、**Ruby Sass**は2019年3月に廃止されたとのこと。
廃止の公式アナウンス：https://sass-lang.com/ruby-sass

>Ruby Sass was the original implementation of Sass, but it reached its end of life as of 26 March 2019. It's no longer supported, and Ruby Sass users should migrate to another implementation.
>>Ruby SassはSassの元々の実装でしたが、2019年3月26日に廃止されました。現在はサポートされていないので、Ruby Sassユーザーは別の実装に移行する必要があります。

自身の環境ではまだ**Ruby Sass**だったので、**Dart Sass**への移行を決定。

```
$ sass -v
Ruby Sass 3.6.0
```

公式のインストール手順を確認したところ、Windowsの場合はChocolatey[^1]を使って簡単に更新できる模様。
自身の環境ではすでにChocolateyはインストール済み。

```
$ choco -v
0.10.11
```

Git Bashを**管理者として実行**で起動し、以下のコマンドを実行する。
インストール方法：https://sass-lang.com/install

```
choco install sass
```

途中で何度かChocolateyのスクリプトを実行するかどうか問われるので「y」で続行。
インストールが完了したら一度Git Bashを終了し、再起動。
この時の起動は**管理者として実行**でなくてもよい。

```
$ sass --version
1.20.1
```

Dart Sassのバージョンを確認する時は**sass --version**で行う。
Ruby Sassの場合と違って、**sass -v**では確認できないので注意。
以上でDart Sassのインストールは完了。

[^1]: Chocolatey（チョコレティ）はWindows用のパッケージマネージャーで、MacのHomebrewに該当。これを使うことでアプリケーションをインストールする際、依存するライブラリーや必要となる他のプログラムも一括でインストールしてくれる。本来であればインストーラを使って一つずつ処理するところが、Chocolateyであればまとめて短時間で処理できる点が大きなメリット。Windowsを使って開発するなら必ず入れておきたい。
(Java)継承により値要素を追加したクラスのequals()実装方法

# はじめに
　下記のような継承関係にあるクラスのequals()メソッドを普通に実装しただけでは、equals()が満たすべき性質が満たせない[(補足1)](#補足1)ということが知られている。[*1参考](#1)
同参考文献にはその回避策も記載されている[(補足2)](#補足2)が、別の文献[*2参考](#2)からの解決策を記載する。
![equals_impl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132020/9c289cae-b927-741b-41ef-16e4e990c8a3.png)

# 結論
　下記のような2引数のequals()静的メソッドを作成し、それを通してObject.equals()を呼び出す。重要なのは両クラスのequals()を呼び出す部分。これはこのクラス構成以外でも使用可能。[全文](https://ideone.com/KuxKFJ)
　ちなみに標準APIに Objects.equals(Object, Object) があるが、左辺のequals()しか呼び出していない。

```java:ObjectUtil.java
final class ObjectUtil {
    private ObjectUtil() { throw new AssertionError("Not intended to be instanciated"); }
    public static boolean equals(final Object lhs, final Object rhs) {
        // 左辺・右辺の参照先が同じなら同一
        if (lhs == rhs) return true;
        // 左辺・右辺の参照先が共にnullなら同一
        if (lhs == null && rhs == null) return true;
        // 左辺・右辺の参照先のどちらかがnullなら不同
        if (lhs == null || rhs == null) return false;
        // 左辺・右辺の参照先が同一クラスならそのクラスのequals()を返却する
        if (lhs.getClass() == rhs.getClass()) return lhs.equals(rhs);
        // 左辺・右辺の参照先が別のクラスなら両クラスのequals()のandを返却する
        return lhs.equals(rhs) && rhs.equals(lhs);
    }
}
```

# 補足1
```java
// 1. 対称性が満たせない
// -> 右辺・左辺を入れ替えると結果が異なる
// 上図のクラス構成を用いた例
Point1D p1 = new Point1D(0);
Point2D p2 = new Point2D(0, 0);
assert(p1.equals(p2) == true);  // x値しか比較しないためtrue
assert(p2.equals(p1) == false); // Point2Dのinstanceであることを判定するためfalse

// 2. 推移性が満たせない
// -> p1 == p2 && p2 == p3 の場合でも、p1 == p3 とならない
// 上図のクラス構成を用いた例
// 前提: Point2D.equals() 仕様に下記を追加しておく
//   引数が、Point1Dまたはそのサブクラス、かつx値が同じ場合でも、true
Point2D p1 = new Point2D(0, 0);
Point1D p2 = new Point1D(0);
Point2D p3 = new Point2D(0, 1);
assert(p1.equals(p2) == true); // 新仕様のためtrue
assert(p2.equals(p3) == true); // x値の比較しないためtrue
assert(p1.equals(p3) == false); // x,y値を比較するためfalse

// 3. リスコフの置換原則が満たせない
// -> サブクラスでも同様の動きが想定されるが、そうならない
// 上図のクラス構成を用いた例
// 前提1: Point1D.equals() 仕様を下記のように変更する
//   引数が、Point1D、かつx値が同じ場合のみ、true
// 前提2: CountingPoint1D.equals() 仕様を下記のように変更する
//   引数が、CountingPoint1D、かつx値が同じ場合のみ、true
Point1D p1 = new Point(0);
CountingPoint1D cp1 = new CountingPoint(0);
CountingPoint1D cp2 = new CountingPoint(0);
List<CountingPoint1D> list = Arrays.asList(cp1);
assert(list.contains(cp2) == true); // cp1 == cp2 のためtrue
assert(list.contains(p1) == false); // 前提1のためfalse

```

# 補足2
```java
// 継承ではなくコンポジションを用いる
// 例
class Point2D {
    private final Point1D p1;
    private final int y;
    ...
    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Point2D)) return false;
        Point2D rhs = (Point2D)o;
        return p1.equals(rhs.p1) && y.equals(rhs.y);
    }
}
```

###### *1
ジョシュア・ブロック(平成26年)「Effective Java 第2版」丸善. 項目8
###### *2
アンドレイ・アレキサンドレスク(2013)「プログラミング言語D」翔泳社. 6.8.3
イオンモバイルで Pixel 3 を使いたい人を安心させるためだけの記事

# この記事の目的

「イオンモバイル Pixel 3」で検索してもかかってこなくて不安になっている人を安心させるための記事です。

# 結論

Pixel 3 にイオンモバイルで契約したnano SIMを挿入することによって、正常にモバイルデータ通信・電話ができました。

# 参考情報

Pixel 3 を注文してから家に到着するまでの所要時間は約82時間でした。

その他動作で心配のある方がいらっしゃいましたらコメントでお申し付けいただけば可能な範囲でお答えいたします。
CNNを利用して判別（Udemyコースの応用）

# 1.はじめに
## 1.1 お断り
自身がUdemyを利用して学んだことをアウトプットするものです。
必ずしもUdemyがすべての人に有用だと主張するつもりはありません。
Udemyのご利用はご自身の判断でお願いします。
いいコースと思って利用していますが、それはあくまで私個人の主観でありすべての人に適用されるものではありません。
また、私は一利用者であり、Udemyやコースの関係者ではありません。
## 1.2　目的
Udemyのコースを利用して学習をしていましたがアウトプットとして利用するものです。
## 1.3　対象コース
[ディープラーニング : Pythonでゼロから構築し学ぶ人工知能（AI）と深層学習の原理](https://www.udemy.com/deepzero/)

### 1.3.1対象内容
セクション８　畳み込みニューラルネットワーク（CNN）

## 1.4 現状の確認
内容は講習で説明されているので概略のみ。
 - 入力はscikit-learnに収録されているdigits。8×8のサイズの0～9までの手書き文字1797個。
 - 入力の標準化を実施（（入力-平均値）/標準偏差）、
 - 正解をon-hotにする。正解の0～9を配列の0～9番目の配列値＝1.0に変更
 - 訓練データ、テストデータに分割。（３の倍数がテストデータ、倍数でないものが訓練データ）
 - 画像のサイズ、チャンネル、エポック（50）、バッチサイズ（8）

## 1.5 変更内容

## 1.5.1 入力を差し替えてみる。
入力をdigitsからMNINSTに差し替えてみます。

###1.5.1.1 読み込み部分
```
import keras
# -- 手書き文字データセットの読み込み --
(input_train, train_labels), (input_test, test_labels) = keras.datasets.mnist.load_data()
```

###1.5.1.2 標準化
（入力-平均値）/標準偏差　で計算します。
平均値、標準偏差はnumpyではaverage、stdメソッドでそれぞれ簡単に出せます。
digitsでは訓練データ、テストデータが分割されていない状態でしたが、
MNINSTでは分かれているため、一旦結合して算出します。

```
input_all = np.concatenate([input_train,input_test])
ave_input_all = np.average(input_all)
std_input_all = np.std(input_all)

input_train = (input_train - ave_input_all) / std_input_all
input_test = (input_test - ave_input_all) / std_input_all

```

###1.5.1.3 one-hot変換
学習データ、テストデータともにone-hot化します。
出力を1～10をそれぞれ10timesの出力に変換します。
元ソースではこの時点では学習・テスト分かれていなかったため。
行っている内容自体は変更ありません。

```
#トレーニングデータ
correct_train = np.zeros((input_train.shape[0], 10))
for i in range(input_train.shape[0]):
    correct_train[i, train_labels[i]] = 1.0

#テストデータ
correct_test = np.zeros((input_test.shape[0], 10))
for i in range(input_test.shape[0]):
    correct_test[i, test_labels[i]] = 1.0

```

###1.5.1.4 学習データ/テストデータ分離
digitは学習データ/テストデータの分離はされていませんが
mninstは分離されているためこの処理はコメント化します。

###1.5.1.5 設定値
縦横サイズを修正

```
img_h = 28  # 入力画像の高さ
img_w = 28  # 入力画像の幅
```

---
これで動くはずです。
ただしデータ数が1700＝＞70000、サイズが8×8＝＞28×28になったため
単純計算で500倍程度の計算量になります。
作業用PCでは２時間程度かかりました。
初心者必見！これだけGIT10選！

プログラマ歴１ヶ月の新米エンジニアが、これだけは覚えとけ！なGITコマンド１０こを厳選しているページです。なお、『このコマンド入らないのは謎だろ！！！』とか『そもそも、これ認識ちょい違いますよ〜』等々ツッコミ大歓迎です🙇‍♂️

むしろ先輩方からのアドバイス有難い。。。



では早速参りましょう。


※なお基本編はこの順に行えばgit push、自分の環境に最新のorigin情報を持ってくるところまで行えるようになってます。活用いただけたら幸いです！


⭐️基本編
①git branch
まず新たに作業を始める際にはブランチ（枝）を立てましょう。



②git checkout

上記git branchをしているとブランチが複数存在することもあります。というかそのいった状況の方が多いと思います。ブランチ間を行き来する際にこのgit branch 枝の名前　を行います。



③git add

自分のブランチでの変更内容
をgit add -A


④git commit -m""



⑤git push


⑥git fetch



⑦git merge origin
git pull



⑧git diff
git status

上記まででgit pullまで行えるのですが、随時現状を把握することは非常に重要です。これは⑧に記述しましたが、各工程で気になる際にはしつこいくらいに行いましょう。

⭐️＋α編

ここからは超基本からほんの少しレベルを上げた内容です。とはいっても通常業務で使用する機会も多いと思いますので、併せて覚えちゃいましょう〜

⑨git log -p 



⑩git stash



⭐️最後に

己の無力さに打ちひしがれることもあると思いますが、こけた分だけ学びがあると思います。恐れず共に前に進みましょう😇


⭐️おまけの用語集

リポジトリ

ソースコードなどのコンテンツすべてのバージョンを保持する場所、いわゆるデータベースです。
開発者の各PCにあるデータベースを「ローカルリポジトリ」、サーバーにあるデータベースを「リモートリポジトリ」といいます。

参考URL（先輩たちの知恵が詰まってます、チェックされたし👇）
https://qiita.com/kyoyyy/items/161b6905f45bee2efe21
【Unity】クリック（タップ）した場所にボタンが存在するかどうかを判定するメソッド

# ボタン判定メソッド

表題のメソッドは以下になります。


```c#
    bool IsButtonTap()
    {
        //タップ検知したGameObjectを取得。
        GameObject tapObj = EventSystem.current.currentSelectedGameObject;
        //取得したGameObjectがnullならばfalseを返す。
        if (!tapObj) { return false; }
        //取得したオブジェクトからButtonを取得。
        Button btn = tapObj.GetComponent<Button>();
        //ボタンがnullかどうかを返す。
        return btn;
    }
```

# 参考

###・[EventSystem.current.currentSelectedGameObject](https://docs.unity3d.com/ja/2018.2/ScriptReference/EventSystems.EventSystem-currentSelectedGameObject.html)
この関数で、現在の検知したオブジェクトを取得出来ます。

###・[Object.bool](https://docs.unity3d.com/jp/530/ScriptReference/Object-operator_Object.html)

unityでnullチェックをする際、上の例で言うと「btn!=null」と表記しなくても「btn」と書くだけで同じことが出来てしまいます。
初心者による初心者のためのAjaxについて

<h2>Ajaxとは何か</h2>
簡単にまとめると、以下の言葉の組み合わせでできている。

<b>「Asynchronous JavaScript + XML」の略</b>

まずは、それぞれの単語を分解してみる。

・<b>Asynchronous</b>・・・「非同期の」
・<b>JavaScript</b>・・・オブジェクト指向のスクリプト言語で、webブラウザ上で動作する。
・<b>XML</b>・・・eXtensible Markup Language の略。
　　 　　　　その名の通り「拡張可能な（extensible）マークアップ言語※」。詳細は後述。

（※マークアップ言語：視覚表現や文章構造などを記述するための形式言語。）


組み合わせると、「非同期のJavaScriptとXML」となるが、このままでは意味不明。。。
言葉を少し補足してまとめると、、、
「JavaScriptとXMLを使って、非同期にサーバとの通信を行うプログラミングの手法のこと」です。

内容を理解するためには、一つ一つの要素の分解をしていく必要があるので、
一つ一つを個別に整理していきます。


<h2>「非同期通信」</h2>
非同期通信があるということは、当然、同期通信が存在します。

なので、「同期通信」と「非同期通信」との違いを整理しながら見ていきます。

<h4>「同期通信」</h4>
まず、「通信」とは、サーバとのやりとりをすることを指します。
なので、クライアント ➡︎ サーバ間の情報のやりとりのことを意味します。
そして、「同期」とは、クライアント側での指令を送り、処理した後その情報が返ってくる一連の流れのことです。

（例）
1.クライアント：「このデータを更新してください」　（リクエスト を送る）

2.サーバ：「処理中」

3.サーバ：「できました」　（レスポンス を返す）

4.クライアント：「OK（確認）」


しかし、これではクライアント側が1.で出した
リクエストのレスポンスを待っている間（2. - 3.の間）は何もできないことになります。

情報の更新頻度が多くないものであれば特に問題はないですが、
例えばそれでは動作上問題である典型的な例としては、地図の画面遷移があります。

参考：
https://www.atmarkit.co.jp/ait/articles/0708/23/news134_2.html
図１：Ajaxを使わない地図サービス

上記を見ると一目瞭然で、
画面を動かす度に、先ほど示した1.から4.の工程を繰り返すことになります。
実際には、画面を動かす度に画面がリロードされるため、真っ白になる画面を都度都度見る事になります。

これでは画面更新の速度も遅くなり、またシームレスな動作とも程遠いものとなります。

そこで、この問題を解決してくれるのが「非同期通信」なのです。


<h4>「非同期通信」</h4>

https://www.atmarkit.co.jp/ait/articles/0708/23/news134_2.html
図2：Ajaxを使った地図サービス


先ほどの図１と比較すると非常にわかりやすく、現在ウェブサービスで当たり前にこちらのタイプを利用しているはずです。
実際には、通信を全く行っていないわけではなく、「同期通信」の際の原因である
「全ての情報をリクエスト→レスポンス」という仕組みから解放して、
一部の情報のみリクエストすることで動作をスムーズに行うことができるようにした仕組みです。

そして、その仕組みのために「JavaScript」と「XML」が活躍してくれます。
以下、それぞれについて順を追って見ていきます。


<h2>「JavaScript」</h2>
実際の実装自体は主にこの「JavaScript」で行います。
その中で、非同期なデータの通信を実現するために<b>「XMLHttpRequest(XHR)」</b>を活用します。
詳細は割愛するとして、、、非同期なデータの通信を実現するためのAPI（≒ 機能）で、
このAPIを使って実装するのがJavaScriptです。


<h2>「XML」</h2>
XMLは、簡潔に言うとデータを自由に構造化できる仕組みの言語です。
仮にこれが無かったとすると、、、
HTMLでは、決められたタグを使って画面構成をしていきます。
そこにJavaScriptを実装して、動的な環境を構築します。
ただし、Ajaxでは、最小限の情報をリクエスト→レスポンスする必要があり、
それが常にどの情報であるかをコンピュータに把握させる必要があります。

ただHTMLの場合、個々のデータが整理されていないため、情報の整理が不可欠となります。
データを構造化し、かつ各要素もそれぞれ自由に取り出せたり整理できたりすると、
膨大なデータ量からでもある特定のデータのみを取り出せたりできるようになります。
そのために、XMLを活用していきます。

XMLは、HTML同様にデータが構造化された仕組みであるものの、
違いとしてはタグ自体も自由に設定できるというものです。

（例）
<日付>1月1０日</日付>

上記のような<日付>タグを作ることもできるため、
データをタグごとに整理することができます。


まとめると、XMLを活用することでデータを特定しやすい環境を作れる。
そして、XMLとJavaScriptを活用することで非同期の通信が行える。

ただ、どうやってJavaScriptのコードからXMLの特定の箇所を指定するのかが解決できていません。
その特定の箇所を指定するのに<b>「DOM」</b>が使われます。

DOMとはDocument Object Modelの略でHTMLやXML文書を取り扱うためのAPIです。
が、、、ここでは詳細は割愛します。



<h2>まとめ</h2>

ウェブブラウザ上では、基本的には同期通信（リクエスト→レスポンス）により画面を更新しつつ表示させている。
ただし、連続的に画面更新が必要な場合には、実質的に運用不可。
よって、階層構造をもったデータの表現に長けたXMLとJavaScriptを使って、
必要最低限の情報更新に留めることで、実質的に画面更新をシームレスに表示させることができるのが「非同期通信」技術である。
その中で、「XMLHttpRequest(XHR)」や「DOM」などのAPIを活用していきます。


参考：
https://ja.wikipedia.org/wiki/JavaScript
https://www.cybertech.co.jp/xml/contents/xmlxmldb/serial/_xmlbeginner1.php
https://qiita.com/hisamura333/items/e3ea6ae549eb09b7efb9
https://www.atmarkit.co.jp/ait/articles/0708/23/news134.html
canvasを使って画像中の特定範囲にテキストを描画する (文字画像ジェネレーター)

# やりたいこと

* 画像上の特定範囲の上下左右中心にテキストを描画
* リアルタイムで編集
* 編集後の画像をコピー、ダウンロード (本記事では含まない)

いわゆる**吹き出し画像向けの文字画像ジェネレーター**

# 作ってみた (デモ)
フロントのフレームワークはVueとVuetifyを利用しました。

<p class="codepen" data-height="480" data-theme-id="0" data-default-tab="js,result" data-user="icchi" data-slug-hash="mYdaJe" style="height: 480px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="sentence-image-generator">
  <span>See the Pen <a href="https://codepen.io/icchi/pen/mYdaJe/">
  sentence-image-generator</a> by icchi (<a href="https://codepen.io/icchi">@icchi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# ポイント
## Canvasで描画
描画するだけであればvueと親和性の高いSVGのほうが個人的には扱いやすいと思います。ただし、今回は描画画像をBase64形式でコピー、またはダウンロードしたいという条件があり、それも含めて考慮するとSVGよりもCanvasの方が実装工数が低いと判断しました。

canvasであれば下記のようにたった1行のコードでcanvasオブジェクトからbase64形式の画像を取得可能です。

```js
canvas.toDataURL("image/png");
// canvas: 次のような感じで取得できるcanvasオブジェクト
// const canvas = document.getElementById("canvas");
```

SVGでもHeadless Chromeを利用した以下のようなnode moduleで変換は可能ですが、canvasに比べ利用ライブラリの規模は大きくなってしまいます。
<https://www.npmjs.com/package/convert-svg-to-png>

## テキスト描画範囲の座標指定
吹き出し(特定範囲)内にテキストを描画するために、その範囲を定義しておく必要があります。

今回は以下のように実装しました。
左上を原点として、範囲の左上、右下の座標を原点からの割合(小数)で定義しています。

```js
textareaRate: { // 画像中のテキスト表示エリアの左上・右下座標(左上基準)
  start: {
    x: 0.26,
    y: 0.1
  },
  end: {
    x: 0.72,
    y: 0.34
  }
}
```


## テキスト描画における基準点の位置
canvasにテキストを入力する場合、その指定座標に対する描画位置に若干クセがあります。

以下の画像がわかりやすいですが、デフォルトの設定だと指定座標が文字の左下に位置するように描画されます。
> ![WVwFw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135313/037a2d6a-c48e-461e-9ed3-9949b79b802f.png)
> https://stackoverflow.com/questions/11120392/android-center-text-on-canvas


今回は吹き出し範囲の上下左右中心にテキストを描画したいため、指定座標がテキストの中心に位置するようにしてあげる必要があります。canvasのcontext設定項目の中には指定座標に対するテキスト位置のオプションが用意されているので、それらを以下のように指定します。

```js
// get context
const canvas = document.getElementById("canvas");
const context = canvas.getContext("2d");

// set align center(horizontal/vertical)
context.textAlign = "center";
context.textBaseline = "middle";
```


# 改善点
## 自動フォントサイズ調整
例えばAPIライクなサービスを想定して完全な自動生成を実現するに、吹き出し範囲からテキストがはみ出さないよう描画する量に合わせてフォントサイズを調節

# 参考文献
* [HTML5.jp Canvasリファレンス](http://www.html5.jp/canvas/ref/property/textBaseline.html)
termcap を入れる

#screen を使うと画面が乱れるので termcap を入れてみる
gpsmon とかを使うとこんな風に画面が乱れてしまう。
![putty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/09602801-22f4-17a6-e768-936d2b8fcc8c.png)
読みにくいので termcap データベースを拾ってくる。
(terminfo はファイルが大量にできてしまうので、扱いやすい旧式の termcap にします)

#termcap データベースを拾ってきて設置
[NCURSES](https://invisible-island.net/ncurses/) のプロジェクトページにかなり網羅した termcap, terminfo が転がっているのでそれをもらってくる。
termcap は "Development termcap source (gzip'd text via http)" と書いてあるところから。
wget して gzip で解凍。
解凍した tarmcap.src に putty-256color や screen.putty-256color があることを確認して $HOME の下に設置。

```tcsh:
> wget https://invisible-island.net/datafiles/current/termcap.src.gz
> gzip -d termcap.src.gz
> grep -e "putty-256color" -e "screen.putty-256color" termcap.src
> mv termcap.src ~/.termcap
```
#putty の設定 (おまけ)
putty でログインするときの端末タイプを putty-256color にしてログインしなおす。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/589af6e3-1776-9e1a-120e-da00b1483efe.png)
せっかくなので 256 色表示を確認してみる。

```tcsh:
> wget https://raw.githubusercontent.com/zhengkai/config/master/script/256colors2.pl
> perl ./256colors2.pl
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/a32b0cee-1b4d-700e-d9f6-b37804ff771a.png)
綺麗に見えますね。

では screen に入り...$TERM は自動で正しく設定されるみたいですね。

```tcsh:
> echo $TERM
putty-256color
> screen
> echo $TERM
screen.putty-256color
```
#いよいよ gpsmon
さて、お楽しみの gpsmon

```tcsh:
> gpsmon localhost:2947:/dev/ttyUSB0
```
...同じでした。screen に入らずに gpsmon を叩くと大丈夫なんですけども。
でも cgps とかの画面の乱れ方はましになったのでとりあえずこれで。

#termcapファイルはいらなかった？
ちょっと見てみると既に terminfo で putty-256color や screen.putty-256color は存在していた模様。ひょっとして termcap ファイルは無駄でした？

```tcsh
> ls -l /usr/share/terminfo/?/*putty-256color
-rw-r--r-- 1 root root 2512 12月 28  2017 /usr/share/terminfo/p/putty-256color
-rw-r--r-- 1 root root 2552 12月 28  2017 /usr/share/terminfo/s/screen.putty-256color
```
$HOME/.termcap を mv して試してみたら動作は変わらないみたいですね。termcap ファイルは拾ってこなくてよかったかも。

# 256 color test
色を確認するのは bash 上なら以下のコマンドでも OK (https://wiki.archlinux.jp/r/1dm より)

```bash:color
$ (x=`tput op` y=`printf %76s`;for i in {0..256};do o=00$i;echo -e ${o:${#o}-3:3} `tput setaf $i;tput setab $i`${y// /=}$x;done)
```

```bash:
#!/bin/bash

# hex test
for i in {0..15};do
	for j in {0..15};do
		color=`printf "0x%x%x" $i $j`
		tput setab $color
		printf " %03d " $color
	done;echo
done;echo

# system color
for i in {0..15};do
	tput setab $i
	printf " %02d " $i
done;echo

# full color
for i in {16..231};do
	tput setab $i
	printf " %03d " $i
	[ $(( ( $i - 15 ) % 6)) -eq 0 ] && echo
done

# gray tone
for i in {232..255};do
	tput setab $i
	printf " %03d " $i
done;echo
tput op
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/7847fd13-564d-5f37-2df1-bf07ddccfc6d.png)
一部界隈で話題になっている Nim を使って、「、」や「。」等を修正するプログラムを作った。

# はじめに

そもそも Nim とは何ぞや。って人も多いと思いますので、かなり大雑把に (語弊を招くかもしれない) 説明をすると Python ライクな構文に魔改造した C 言語です。

Qiita にも僕より詳しい方が何人もいらっしゃるので、「Nim」と検索窓に入力してその方達の記事も同時に参考にしていただけるとありがたいです。

# 概要

ご存知の方もたくさんいらっしゃると思いますが、理系のレポートや論文を書く際は、タイトルにもあるような「、」や「。」といった句読点は好まれず、", " や ". " のような半角のカンマもしくはピリオドに半角のスペースを入力する形式が良しとされています。

しかし、日本語入力をしているとどうしても誤字として、先に挙げたようなものを入力してしまうんですよね。(人間だもの。)

そこで、自動で検知して置き換えてくれれば便利だよね。Nim のプログラムも書いてみたいよね。って事で今回のプログラムに至ります。

# 実行環境

macOS (ver 10.14)

Nim (ver 0.19.0)

# 実際に使ってみる

```sample_text.md

こんな感でぃで、半角・全角の句読点が入り乱れてても，自動的に変換してくれるんよ。

```

実行ファイルを動かしてあげるとこのように綺麗に直してくれます。

```result_text.md

こんな感でぃで, 半角・全角の句読点が入り乱れてても, 自動的に変換してくれるんよ.

```

# コード

コードはこのようになっています。

実際に見てみると、割と Python に似た構文ではないですか？

```shaping.nim

import strutils, pegs, unicode, os

if os.paramCount() == 2 :
  var clp = os.commandLineParams()
  var f : File = open($clp[0] , FileMode.fmRead)
  defer :
    close(f)
  var rf : string = f.readAll()
  rf = rf.replace("，",", ")
         .replace("、",", ")
         .replace("。",". ")
         .replace("．",". ")
         .replace(". \n", ".\n")
  var wf : File = open($clp[1], FileMode.fmWrite)
  defer :
    close(wf)
    echo "Successful"
  wf.writeLine $rf
else :
  echo "You should type \"./shaping (Read)FILENAME (Write)FILENAME\" "

```

プログラムを見ればなんとなく動きはわかると思いますが、やっている事といえば

* コマンドライン引数に変換元のファイル名と変換後のファイル名があるか判断
* (欠けている場合は else 文を実行)
* 変換元のファイルを読み込み
* 文字の置き換え
* 変換後に "Successful" と表示する

くらいのものなので、そんなに複雑ではないかと思います。

## コンパイル & ラン

Nim はコンパイルが必要な言語なので、このようにコンパイルをしてあげてから、生成された実行ファイルを使ってランします。

```

> nim c shaping.nim
> ./shaping.nim (Read)FILENAME (Write)FILENAME

```

# まとめ

Nim を使ってファイル中の文字の置き換えを行ってみました。今回は使用していませんが、正規表現を使ってあげる事でより豊かな変換ができそうですね。

Nim はまだバージョンが 1 に到達していない未熟な言語であり、実際の業務で使用するにはまだ安定性が足りないかもしれません。

しかし、様々なライブラリの開発も進んでいるためこれからの未来に可能性がないわけではないと僕は考えています。

今回の記事で Nim に興味を持って、使ってみたいという方がいれば嬉しいです。

アドバイスやコメントがあれば気軽によろしくお願いします。

# おまけ

GitHub の方にも挙げておきましたので、見てみてください。

[shaping.nim](https://github.com/hayabit/Shape)

# 参考にさせていただいた記事

* [nimファイル操作 - Qiita](https://qiita.com/6in/items/cbb161c401afe054314f)
はじめてのC++【43日目】

# はじめに
ゴールデンウィーク最終日なので進捗とか一応残しとこうかと思い書く。
あと、毎日投稿しないとだめだなと思いました。投稿しないとサボったりしてたので、投稿の大切さがわかりました。サボり防止投稿をまた始めよう。
## ブロック崩し
ゴールデンウィークはロベール全く触ってなくて、ブロック崩しをいじってました。
[ブロック崩しのソースコード](https://github.com/Suptree/Breakout)
多少汚いところはあるけど、なんとかブロックを大量に作ることができ消すことに成功しました。当たり判定は、まだまだ調整する必要があります。
![ブロック崩し.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298612/3dcb3df4-bf78-e701-aa9a-e692705795d6.gif)
# 終わりに
ブロック崩しを通して得られたことは結構ありました。
・配列でインスタンスを格納して、たくさん生成すること
・オブジェクト指向 イマイチ理解できていないかもしれない
・違うクラス内での当たり判定をする方法
あんまり思いつかなかったけど、結構力ついたかなと思います。
とりあえず明日からロベールまたやろ。
おやすみなさい。
Node.js v11.15.0リリースノート

https://nodejs.org/ja/blog/release/v11.15.0/

# deps
- add s390 asm rules for OpenSSL-1.1.1
    - s390 asmルールを追加？

# src
- add .code and SSL specific error properties
    - .codeとSSL特有のエラープロパティを追加

# tls
- add --tls-min-v1.2 CLI switch
    - CLIを切り替えるための--tls-min-v1.2オプションを追加
- supported shared openssl 1.1.0
    - openssl1.1.0をサポート？
- revert default max to TLSv1.2
    - デフォルトのTLSの最大をv1.3からv1.2に戻した
        - 下記TLSv1.3サポート時のミスの修正？
- revert change to invalid protocol error type
    - 下記ERR_TLS_INVALID_PROTOCOL_METHODの実装でエラーの型の指定が誤っていたため修正？
- support TLSv1.3
    - TLSv1.3をサポート
- add code for ERR_TLS_INVALID_PROTOCOL_METHOD
    - `ERR_TLS_INVALID_PROTOCOL_METHOD`のコードを追加
Node.js v11.14.0リリースノート

https://nodejs.org/ja/blog/release/v11.14.0/

# child_process
- doc deprecate ChildProcess._channel
    - `ChildProcess._channel`が非推奨であることを記載
        - 代わりに`ChildProcess.channel`を使用する

# deps
- update nghttp2 to 1.37.0
    - nghttp2を1.34.0から1.37.0に更新

# dns
- make dns.promises enumerable
    - `dns.promises`をenumerableに変更
- remove dns.promises experimental warning
    - `dns.promises`の警告を削除

# fs
- remove experimental warning for fs.promises
    - `fs.promises`の警告を削除

# stream
- make Symbol.asyncIterator support stable
    - `Symbol.asyncIterator`の状態をExperimentalからStable

# worker
- use copy of process.env
    - 各workerのprocess.envはそのworkerを作成したworkerからコピーされるようになった
        - これまではOSがストアしたものを共有していた？