OmniAICreator/Qiita-1.07M huggingface dataset:
archlinux で vagrant を使う

次の記事と同様のことを行いました。
[VagrantとDockerについて名前しか知らなかったので試した](https://qiita.com/hidekuro/items/fc12344d36d996198e96)
相違点は
>Host OS が archlinux (64bit)
>Guest OS が Ubuntu 18.04 (64bit)

1) Vagrant と VirtualBox のインストール

```bash
sudo pacman -S vagrant
sudo pacman -S virtualbox
```

2) Vagrantfile の作成

```bash
vagrant init --minimal ubuntu/bionic64
```

>次のファイルが作成されます。

>```text:Vagrantfile 
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/bionic64"
end
```

3) VM の起動

```bash
vagrant up
```

>初回は１５分程かかりました。

4) ssh でログイン

```bash
vagrant ssh
```

>次のようになります。

```text
$ vagrant ssh
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-45-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sat Feb  2 01:04:44 UTC 2019

  System load:  0.0              Processes:             92
  Usage of /:   9.9% of 9.63GB   Users logged in:       0
  Memory usage: 12%              IP address for enp0s3: 10.0.2.15
  Swap usage:   0%


  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.


Last login: Sat Feb  2 00:55:29 2019 from 10.0.2.2
```

5) 停止

```bash
vagrant halt
```

>次のようになります。

>```text
$ vagrant halt
==> default: Attempting graceful shutdown of VM...
```
[2019年1月版] angular-cliが神過ぎて涙が溢れているのを止めないで

# angular-cli をインストール
```shell
$ npm install -g @angular/cli
```
環境によっては```sudo npm ...```を行って下さい。
# angular-cli での新規作成するコマンドいろいろ

## プロジェクトの新規作成
```shell
$ ng new angular-cli-example
$ cd angular-cli-example
```
この```ng new```コマンドでプロジェクトの初期設定をいろいろやってくれます。素敵です(涙目)。
カレントディレクトリにプロジェクト名ディレクトリが生成されるので```cd```で下に移動するのは忘れずに。
```ng new```で渡すプロジェクト名で"_"を使うとCSS選択の後でエラーが発生し、先に進めません！

```shell
$ ng new sample_project
? Would you like to add Angular routing? No
? Which stylesheet format would you like to use? SCSS   [ http://sass-lang.com   ]
Schematic input does not validate against the Schema: {"name":"sample_project","version":"7.2.1","routing":false,"style":"scss"}
Errors:

  Data path ".name" should match format "html-selector".
```
う～ん、"_"はdamnみたいです。

## ローカルの開発サーバー起動
例えば4203ポートで開発サーバー起動する場合は以下のようになります。

```shell
ng serve--open --port 4203
```
デフォルトポートでは4200ですが複数の環境でng serveしたい場合はポート指定すると便利です。

## コンポーネントの追加
```shell
$ ng g c sample/list
```
gはgenerateの略、cはcomponentの略です。このコマンドでsrc/app/sample/list/list.component.xxxファイル群が生成されます。
app.moduleにも追記してくれます。(！)
htmlやcssをcomponent.tsに含めてしまう場合は、

```shell
$ ng g c sample/list --inline-template --inline-style
```
とすればhtmlやcssファイルは生成されません。

## サービスの追加
```shell
$ ng g s sample
```
例によってgはgenerateのgですが、sはserviceのsです。上記のコマンドでsample.service.ts、sample.service.spec.tsが生成されます。

ただし、コンポーネントの時とディレクトリの階層が違うので注意が必要です。コンポーネントと同じディレクトリにサービスを生成したい場合は、```sample/sample```と指定します。

ちょっと ```e2e``` でも書きたいことがあるのでまとまったら上げます。

こちらからは以上です！
AWS認定ソリューションアーキテクトプロフェッショナル再認定試験に合格した

AWS認定ソリューションアーキテクトプロフェッショナル再認定試験に合格したので今後のために内容を記録しておきます。

# 再認定試験の変更について

2019年2月末で再認定のポリシーが変更になり以下のようになるそうです。

* 有効期限が2年から3年に
 * 再認定が取得できる期限と有効期限が一致するようになる
 * 現状は2年で有効期限が切れた後の1年間が再認定をうけられる期限となる。
* 現状の再認定試験がなくなり本番と同じ認定試験を50%の価格で受験することになる。

現状は過渡期で2月末まで待ったら認定の有効期限が伸びて新ポリシーになるみたいです。
もう1年ほど待って新ポリシーで再認定を受ける選択肢もありましたが、再認定に向けて勉強を続けていたので試験内容が変わる前に現状の再認定試験を受ける選択をしました。

# 試験勉強について

## 勉強開始時の状況

ここ最近はAWSではLambda、API-Gateway、Batchを使ったサーバーレスアーキテクチャを触っていたので試験範囲のこと大分忘れていたり、最近のアップデートを把握していない状況でした。
このため、受験勉強は必須でした。

## 自信がない状態

最初は模擬試験を見直す、BlackBeltを見直す、ホワイトペーパーを読むをしていたのですがイマイチ手応えがない状態でした。
[AWS SA PRO 再認定試験は落ちやすい？その対策。](http://ntuser.hatenablog.com/entry/2018/06/03/110810)という話もあり認定取得の時に合格点ギリギリだったのもあって完全に自信がない状態。

[【AWS認定】ソリューションアーキテクト プロフェッショナル（AWS CSA-Pro）に合格してきた【英語重要】](https://qiita.com/tmiki/items/c83df748261c7b87ed18)とかの記事を読んだのですが英語力ない自分にはきつい感じでした。

ちなみに何年かたってるので模擬試験受け直してみたら内容変わってない上に不合格という有様(割と悪問多いですが)。
なお、模擬試験の解答は[AWS Solution Architect Professionalサンプル問題38選](https://blog.mosuke.tech/entry/2018/10/25/sapro-sample-question/)が参考になります。

## Udemy万歳

そんな感じでエイっと決めた試験日1ヶ月前くらいにかなり焦ってたのですが、Udemyで[AWS Certified Solutions Architect - Professional 2019](https://www.udemy.com/amazon-certified-solutions-architect-professional/)というコースを見つけてちょうど年始セールで安くなっていた(たしか1500円くらい)こともあり受講してみました。
これがすごく良かったです。
英語の問題集なんですがGoogle翻訳を使えばほとんど原文見なくても解いていけて解説も確認できました。
(一部英語を見ないと内容がわからなかったり誤解するような問題はありましたがごく一部)
質の良い問題が多量にあり本番の試験と同様の時間制限ないで解いていく方式で、しっかり解説もついていました。
結局、このコースの問題を一通り解いて間違えていた部分を中心に解説を読んで知識習得するというのを残り1ヶ月で2セットまわしました。
結果合格。試験でも、あ、この問題Udemyで見たというのがいっぱい出ました。
現状の再認定試験や認定試験対策では(セールで安くなっていれば)個人的に一押しの勉強法です。

# 試験本番

Webカメラ越しに監視する外国の試験管と英語でチャットが必要という記事を見てびびっていたのですが、日本語のチャットでいけました。
結局こちらから打ったチャットは「同意します」という一文だけでした。
(日本語入力する方法がチャットではalt+shiftでと書かれていたができなくてちょっと焦った、かなボタンでいけた)
試験中も顔触って試験止められるという状況にはなりませんでした。
「ソフトウェア開発者の人生マニュアル」にキャリア、就職、転職の裏技を学びたい、3行スナップショットまとめ。

「ソフトウェア開発者の人生マニュアル」にキャリア、就職、転職の裏技を学びたい、3行スナップショットまとめ。

# ソフトウェア開発者のキャリアを事業として扱おう

![image](https://user-images.githubusercontent.com/13635059/52114799-582b9080-2650-11e9-818c-46ab615e66c2.png)

# Qiitaやブログの書くのは正義、実は採用館官は、技術面のあらゆる要素で人を採用する

![image](https://user-images.githubusercontent.com/13635059/52115533-2f0bff80-2652-11e9-950a-9b8a2d869d8a.png)

# リアルソーシャルハッキング的な就職成功の裏技

マネージャーの地元クラブを調べて潜り込んで、知り合いになったらしい。


![image](https://user-images.githubusercontent.com/13635059/52115598-5236af00-2652-11e9-80fb-032a2289ebe7.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
制御工学をCで実現する（比例制御）

　制御工学はなかなか人が寄り付かない。今時モーションコントロールなんて、モータ屋さんが自動調整できるアンプを付けて販売しているから、位置指令を与えるだけでいい感じに制御してくれる。
　PIDがなんとなくわかっていれば、仕事に支障はありません。みんなそこまでで満足しちゃう。
（追記）
PIDの説明で良い記事を見つけました。
https://qiita.com/RyosukeH/items/9e5ce2ebdadd90e3db00

### 制御工学の何が難しい？
　何が障害になってるのかなあと考えてみると、制御系をプログラム言語で書くところまでがわからないんじゃないか。僕もそう言えばそうだった。制御工学の本にも書いてない。
　普通プログラムと言ったら、書いたコードを順番にコンピュータが実行していきます。
この時、CPUのクロック周波数を意識することはないでしょう。そして入力した情報は最速で処理され、出力も最小のタイムラグで表示されます。
　制御工学の理論通りに動くプログラムを作る場合には、こういった動き方、一番短い処理時間で処理が終わる動き方をされると、理論通りに動きません。一定の時間ごとに入力を受け付け、計算をして、出力を出す。そういった動き方が求められるので、タイマー割り込みで一定の時間ごとに入力信号を受け取り、計算して出力を出すことが多いです。無限ループ内にSleepを入れて、一定時間ごとに実行する方法でも良いかもしれない。
### 今回の目的
　最終的な目標はPI制御器を作るところに設定しました。だいたいPIしか使わないから。
　この記事では比例制御を実装するところまでにしました。
### ブロックのないブロック線図
制御工学の話なのでブロック線図を書きます！
<img width="302" alt="スクリーンショット 2019-01-31 22.49.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/211702/8fefd81c-2bd8-eb4e-78c8-193dd9fa9b09.png">
これです。ブロック、ないような・・・
真ん中にブロック欲しいなあ。

図の中のI(s)をinput、O(s)をoutputという変数にして、
これをCで書いてみましょう。

```cpp
int filter(float input)
{
   float output;
   output = input;
   return output;
}
void main()
{
   float input,output;
   while(1)
   {
      input = get_input_signal();
      output = filter(input);
      set_output_signal(output);
      sleep(100);
   }
}
```
この関数をサンプリング周波数のタイミングに合わせて実行すると理論通りに・・・と言ってもまだ理論でてきません。
ここで理解してもらいたいのは、サンプリング周波数に合わせてウェイトを入れて実行するところです。
実際のマイコンなどではタイマーでサンプリング周波数の間隔で実行することが多いです。

### 比例制御
ブロックつきました。
<img width="288" alt="スクリーンショット 2019-01-31 23.05.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/211702/e76d8221-52dd-7fa8-13a0-e80ca3a5782e.png">

```cpp
int filter(float input, float Kp)
{
   float output;
   output = Kp*input;
   return output;
}
```
出力に係数Kpをかけるだけです。

### フィードバックつけてみよう！
ここからは新しい要素をつけてみます。モータの伝達関数Gm(s)を入れて、よくあるフィードバック制御のブロック線図にしてみます。
モータはハードウェアなので当然ソフトには影響しません。モータのフィードバック信号を
　あ、符号忘れた。
<img width="523" alt="スクリーンショット 2019-01-31 23.29.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/211702/8114a0e1-87cf-31b4-3a67-d06675ccd3ed.png">
対応するソースコードは何と無く想像ができたと思います。
O(s)がモータに渡す指令値で、モータの動きがR(s)=responseになります。
指令値と実際の動きの差分をとって、それを０にするように制御がかかります。

```cpp
int filter(float input, float response, float Kp)
{
   float output;
   output = Kp*(input-response);
   return output;
}
```

### 長くなってきたので記事を分けます
　ここまで、入力信号に係数をかけて出力する比例制御のソースコードを紹介しました。
　なんだ、簡単じゃん。と思ってもらえたら嬉しいです。
　積分は過去の値を使って出力値を計算する要素が出てきますので、そちらの記事は別に分けて紹介しようと思います。
ROS 複数台での通信時の問題点：rostopic list 見えるが rostopic echo 見えない

複数台のパソコンでROSを取り扱う際の通信でハマった事の覚書
# 前提条件
使用PC:3台(ここではmaster, client1, client2で説明する)
使用OS:全てUbuntu 16.04 LTS
使用ROSバージョン:Kinetic
非WAN接続のルータに全て有線接続。DHCP設定は192.168.1.xxx。
masterでroscore起動
masterで/publish/master, client1で/publish/client1, client2で/publish/client2をそれぞれ1Hzでpublishしている。
#現象
ROS公式チュートリアル: http://wiki.ros.org/ROS/Tutorials/MultipleMachines
に従って実行したところ、全てのPCでrostopic listが見れるもののclient1でpublishしたtopicのみ他のPCでechoできない状況に陥る。
#先に結論
専門家では無いので詳しい理由は分からないが、
IPアドレス群をクラスC(192.168.x.x)からクラスB(172.30.x.x)に、
サブネットマスクを255.255.255.0から255.255.128.0にすると解決する。
#現象詳細
rostopic listの結果

| master | client1 | client2 |
|:---|:---|:---|
| /rosout<br>/rosout _agg<br>/publish/master<br>/publish/client1<br>/publish/client2| /rosout<br>/rosout _agg<br>/publish/master<br>/publish/client1<br>/publish/client2| /rosout<br>/rosout _agg<br>/publish/master<br>/publish/client1<br>/publish/client2|

rostopic echo /publish/master　及び　rosotpic hz /publish/masterの結果

| master | client1 | client2 |
|:---:|:---:|:---:|
|◯|◯|◯|

rostopic echo /publish/client1　及び　rosotpic hz /publish/client1の結果

| master | client1 | client2 |
|:---:|:---:|:---:|
|✖|◯|✖|

rostopic echo /publish/client2　及び　rosotpic hz /publish/client2の結果

| master | client1 | client2 |
|:---:|:---:|:---:|
|◯|◯|◯|

#結論に至った経緯
ルータのDHCP設定192.168.1.xで作業。WANには繋がず。
export設定の精査　→　変化なし
初心に戻り[ROS公式のNetworkSetup](http://wiki.ros.org/ROS/NetworkSetup)の手順を追う。
それぞれのPC同士でping　→　問題なし
netcatを用いた通信　→　client1をlistenerにした時のみ通信できない事が発覚。
client1から他PCへのssh　→　通る
他PCからclient1へのssh　→　通らない
ufwを用いたclient1の全ポート開放　→　変化なし
ルータの変更2台　→　変化なし
ルータのDHCP設定を192.168.2.xや192.168.10.xに変更　→　変化なし
事務所のwifiを経由して接続を試みる　→　通信成功
この時のネットワーク設定は
　IPv4 Address: 172.30.122.xx
　Ipv4 Subnet Mask: 255.255.128.0
　Ipv4 Default Gateway: 172.30.0.1 
上記設定を自分のルータに反映させる　→　通信成功

#最終的な設定
ルータのIPアドレス: 172.30.0.1
サブネットマスク: 255.255.128.0
DHCP設定: 172.30.0.2~172.30.0.254
デフォルトゲートウェイ: 172.30.0.1
それぞれのPCの.bashrc末尾に以下書き込み
　export ROS_HOSTNAME=(自分のIPアドレス)
　export ROS_MASTER_URI=http://(masterのIPアドレス):11311
　export ROS_IP=(自分のIPアドレス)

#おわりに
サブネットマスクは255.255.255.0のままでも良かった気がするが、折角うまくいっているので、このままの設定にしている。
問題の本質は分からないが、この方法で解決している人は見つからないので同じようにハマっている人は一度お試しあれ。

#解決を試す中で参考にしたサイト
export設定の精査(ROS_MASTER_URI,ROS_IP,ROS_HOSTNAME)で参考にしたサイト
　[ROS 複数台での通信時の問題点：clientからmasterへと情報送信できない](https://qiita.com/ossyaritoori/items/b2336451583ce40d1b9a)
　[Running ROS across multiple machines [closed]](https://answers.ros.org/question/38694/running-ros-across-multiple-machines/)
　[ROS remote master: can see topics but no data](https://answers.ros.org/question/90536/ros-remote-master-can-see-topics-but-no-data/)
　[ROSが配信する情報を別のPCのROSで確認する方法](http://asukiaaa.blogspot.com/2018/06/rospcros.html)
　[ROS　複数のPCを使ってノードを走らせる場合。](http://morokyuu.way-nifty.com/blog/2015/10/rospc-3b2d.html)
ポート開放で参考にしたサイト
　[Ubuntuのポート開放方法（ファイアウォールを設定する）](https://qiita.com/toujika/items/be21d361cf80d664859c)
　[Ubuntu 80/tcpのポート開放が出来ない](https://teratail.com/questions/108829)
ZCU102向けPYNQビルド 備忘録

公式サポートされてないZCU102向けにPYNQv2.3イメージをビルドしました。
色々とハマったのでメモ。

参考
http://xilinx.eetrend.com/d6-xilinx/blog/2018-12/13960.html
https://github.com/Xilinx/PYNQ/tree/image_v2.3/sdbuild

## 前提となる環境

以下の環境で実行しました。
バージョンは揃えてください。

- Ubuntu 16.04
- SDSoC 2018.02
- Petalinux 2018.02 [参考](https://dora.bk.tsukuba.ac.jp/~takeuchi/?電気回路%2Fzynq%2FPetalinux%20のビルド)

## 事前準備

次のファイルを~/に用意します。

- bionic.aarch64.2.3.img (from: http://www.pynq.io/board.html)
- xilinx-zcu102-v2018.2-final.bsp (from: https://japan.xilinx.com/support/download.html)

## ビルド実行

```bash
# pynq
$ git clone https://github.com/Xilinx/PYNQ.git
$ cd PYNQ
$ git checkout image_v2.3

# ZCU102 setting
$ cp -rf ./boards/ZCU104 ./boards/ZCU102
$ rm -rf ./boards/ZCU102/petalinux_bsp/
$ mv ./boards/ZCU102/ZCU104.spec ./boards/ZCU102/ZCU102.spec

# 修改ZCU102.spec的内容
$ vim ./boards/ZCU102/ZCU102.spec
> ARCH_ZCU102 := aarch64
> BSP_ZCU102 := xilinx-zcu102-v2018.2-final.bsp
> STAGE4_PACKAGES_ZCU102 := ethernet

# copy files
$ cp ~/xilinx-zcu102-v2018.2-final.bsp ./boards/ZCU102/
$ mkdir ./sdbuild/prebuilt
$ cp ~/bionic.aarch64.2.3.img ./sdbuild/prebuilt

# 检查依赖环境，qemu，crosstool-ng
$ cd ./sdbuild/
$ ./scripts/setup_host.sh

# path
$ PATH=/opt/qemu/bin:/opt/crosstool-ng/bin:$PATH
$ source /opt/pkg/petalinux/settings.sh
$ source /opt/Xilinx/Vivado/2018.2/settings64.sh

# build
$ sudo echo
$ make boot_files BOARDS=ZCU102
$ mkdir ccache
$ make images BOARDS=ZCU102 PREBUILT=./prebuilt/bionic.aarch64.2.3.img

# done
$ ls ./output/
```
Rhinoceros Grasshopper　立体トラスを作成する（UU_CD会）

# はじめに
Rhinoceros/Grasshopperで立体トラスを作成します。
~~その際に用いる作業がデータ構造の理解につながると感じたのでここでシェアしたいと思います。~~ 作成の流れは使用するコンポーネントとキャンバスの画像にて説明します。
~~データ構造の操作は、全体の流れの解説の後に、遡りながら説明しています。~~
<img width="543" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/255561/3beed83c-4585-8cc3-5963-2572ef047f8a.png">

# 全体の流れ
流れは以下になります。
サーフェスの作成→サーフェスの分割→法線の取得→データの整理→部材の作成

#サーフェスの作成
<img width="727" alt="サーフェスの作成.png" src="https://qiita-image-store.s3.amazonaws.com/0/255561/559c8a43-ed25-5e63-9db9-00eae0c1e060.png">
＜使用するコンポーネント＞
Construct point
Move
UnitZ
Number slider
4PointSurface
Surface
Panel

# サーフェスの分割
<img width="479" alt="サーフェスを分割.png" src="https://qiita-image-store.s3.amazonaws.com/0/255561/ec5729fe-9306-47fd-c90d-e246cfa253c2.png">
＜使用するコンポーネント＞
Divide domain^2
isotrim
Deconstruct Brep

# 法線の取得
<img width="719" alt="法線の取得.png" src="https://qiita-image-store.s3.amazonaws.com/0/255561/4d035d68-f92e-94c3-2348-75a414b50e2d.png">
＜使用するコンポーネント＞
Evalute Surface(inputSはreparametarize）
Line
End points
Point(inputはFlatten)
MD slider
Number slider

# データの整理
<img width="320" alt="データの整理.png" src="https://qiita-image-store.s3.amazonaws.com/0/255561/168cd126-a208-00d1-8ea3-d6df3cb6ef28.png">
＜使用するコンポーネント＞
Partition list
Points list
Number slider

# 部材の作成
<img width="300" alt="トラスの部材を作成.png" src="https://qiita-image-store.s3.amazonaws.com/0/255561/15363616-c5ff-d796-8935-60198ce7684a.png">
＜使用するコンポーネント＞
Interpolate curve
Flip
Pipe

PipeのRには直径を指定するNumber sliderを入力しています。

# 記述全体
最後に作成したPipeとサーフェスをgeometryに格納し、カスタムプレビューに接続したら完成。colour swatchでプレビュー色を変更できます。
＜使用するコンポーネント＞
Geometry
Colour swatch
Custom preview

記述全体
<img width="1263" alt="記述全体.png" src="https://qiita-image-store.s3.amazonaws.com/0/255561/6358a312-46da-6ce8-64d8-2200105aab5c.png">

# データ操作について
この立体トラスの中の要となる部分は、部材の作成の中のLineコンポーネントに繋ぐところです。途中にEvalute Surfaceをreparametarizeしたり、pointコンポーネントをFlattenに設定したデータ操作がこのような形態を導いています。
（長くなったので、詳しくは別途記事を作成します。）


#終わりに
いかがでしたでしょうか。
grasshopperなどを用いたデジタルデザインは、今回作成したトラスのような反復した操作を用いる表現に向いています。
Swift：Macのデスクトップ背景画像を取得する

# 概要
Macの背景画像をどうしても抜いてきたい状況に使えるコード．CGWindowの座標系とNSScreenの座標系が異なるため，マルチディスプレイ対応するのは困難だった．

#　ソース
```swift:Extension
import Cocoa

extension NSScreen {
    static var mainHeight: CGFloat {
        return main?.frame.height ?? CGFloat.zero
    }
    static var totalRect: CGRect {
        return screens.reduce(CGRect.zero) { (result, screen) -> CGRect in
            return result.union(screen.frame)
        }
    }
}

extension NSImage {
    static func background(_ frame: CGRect) -> NSImage? {
        guard var list = CGWindowListCopyWindowInfo(.optionOnScreenOnly, kCGNullWindowID) as? [NSDictionary] else {
            return nil
        }
        let origin = CGPoint(x: frame.minX, y: NSScreen.mainHeight - frame.maxY)
        list = list.compactMap({ (dict) -> NSDictionary? in
            guard let name = dict[kCGWindowName] as? String, name.contains("Desktop Picture") else { return nil }
            let bounds = dict[kCGWindowBounds] as! NSDictionary
            guard CGPoint(x: bounds["X"] as! CGFloat, y: bounds["Y"] as! CGFloat).equalTo(origin) else { return nil }
            return dict
        })
        guard
            let dict = list.first, let id = dict[kCGWindowNumber] as? CGWindowID,
            let cgImage = CGWindowListCreateImage(CGRect.null, .optionIncludingWindow, id, .boundsIgnoreFraming)
            else { return nil }
        return NSImage(cgImage: cgImage, size: frame.size)
    }
}
```

```swift:使用例
func getMainScreenBackground() -> NSImage? {
    guard let screen = NSScreen.main else { return nil }
    return NSImage.background(screen.frame)
}

func getAllScreenBackgrounds() -> [NSImage] {
    return NSScreen.screens.compactMap { (screen) -> NSImage? in
        return NSImage.background(screen.frame)
    }
}
```

# おまけ

CGWindowの座標系とNSScreenの座標系とCGImageの座標系の差．
座標変換がかなり厄介なことがわかっていただけると思う．
![座標系.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/796ac011-a6e6-9855-3b0e-243a9852c58f.png)

# さらにもう一歩先へ

もしも動作環境にApp Sand Boxが必要ないのであれば，

```swift
let url = NSWorkspace.shared.desktopImageURL(for: NSScreen.main!)!
let image = NSImage(contentsOf: url)
```

このようにNSWorkspaceを経由して画像のソースを直接取得できる．
【ネットワーク】分散型DB, CDN, AWS CloudFrontについて


##はじめに
こんにちは。
昨日、2/1(金)に大阪で行われた勉強会
[関西Node学園 5時限目 - connpass](https://nodejs.connpass.com/event/113631/)
に参加してきました。
バックエンドエンジニアでも楽しめるような内容が盛り込まれており非常に勉強になりました。
その中でも[@leichtgewicさん](https://twitter.com/leichtgewicht)がお話しされていた
「分散データの基本」について自分なりにゆるふわと調べてみたので備忘録として記事にします。

## 分散型DBとは
そもそも分散型DBとは、
現在の主流である**中央集権管理型(そのサービスやシステムを運用する事業者が持つDBで
集中管理する方法)**に対して
**ネットワーク上、もしくは地理的に近くて複数存在するDBで分散管理する方法です。**

メリットとしては以下が挙げられます。

+ 通信負荷・費用の軽減
+   パフォーマンスの向上(処理速度など)
+   障害が起きても全体の機能が失われない  
...

上記のメリットに加えてユーザは複数あるDBを意識せずにあたかも１つのDBのようにアクセス出来ます。
いわゆる**透過性**です。

対して、デメリットとしては

+ DBの構築や管理が複雑化する
+ ACID特性が保たれづらい

**レプリケーション**(他のDBとのデータの同期する事)、**デプリケーション**(マスターとなるDBのデータを他のDBに同期する事)を行う必要があるのでその際に「あっちのDBとこっちのDBの情報がちょっと違う...」な事が稀に起こってしまうわけですね。
以下記事の図が概略を掴みやすかったです。

+ [「分散データベース」を理解する (1/2)](http://www.atmarkit.co.jp/ait/articles/1703/01/news203.html)

CDN(Contents Delivery Network)も距離的に近いサーバとやり取りして
通信の高速化、負荷分散を行う点で似たような考え方でしょうか。
CDNではPush型やPull型などの種類があります。

+ [第１回 ＣＤＮ の 仕組み （CDNはどんな技術で何が出来るのか） \| REDBOX Labo](https://blog.redbox.ne.jp/what-is-cdn.html)

## ブロックチェーンとの違い
何だか記事を書いていると複数データを管理するところがあって...
それぞれ更新して...ブロックチェーンと何が違う...?という気分になってきました。
大まかにまとめると
**分散型DBは「分散したノードで個別に台帳を管理している」のに対して、
ブロックチェーンにはDBが無く、「分散したノードはただ一つの台帳を全員で管理しています。」**
なのでブロックチェーンの方は更新などに他のノードの合意が必要になったりします。
詳しくは下記記事をご参照ください。

+ [「分散型」の意味。分散型データベース(DB)とブロックチェーン、分散型台帳の違いとは？ \| やまとは国のまほろば](https://www.yamato0506.info/entry/difference-distributed-database-blockchain-2)

## AWSに絡めると？
先程軽く紹介したCDNのサービスが天下のAWSに存在します！

+ [Amazon CloudFront（高速コンテンツ配信ネットワーク - CDN） \| AWS](https://aws.amazon.com/jp/cloudfront/)

+ [Amazon CloudFront とは - Amazon CloudFront](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Introduction.html)

Amazon CloudFrontはコンテンツファイルをサーバーから直接配信せず、
CDNを介してユーザーに配信するサービスです。処理速度が速い上に１枚かますことによって
プロキシサーバ的な役割も果たします。
静的、動的コンテンツの配信やAPIの呼び出しに使われているようです。
サービスの説明読んでたり使ってる企業を見てるとワクワクしてきますよね。

## あとがき
ソースコード無しの、参照列挙の記事となってしまいました。
ですが今回参加した勉強会がネットワークの事について調べる良い切っ掛けとなりました。
今日触れたKVSやマークルツリーについてもそのうち書いていきたいです。
cmakeでオプション付きの関数を定義する

cmakeの組み込み関数にはオプション引数をとれるものがありますね。例えば`install`は

```
install(TARGETS targets... [EXPORT <export-name>]
        [[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE|
          PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE]
         [DESTINATION <dir>]
         [PERMISSIONS permissions...]
         [CONFIGURATIONS [Debug|Release|...]]
         [COMPONENT <component>]
         [NAMELINK_COMPONENT <component>]
         [OPTIONAL] [EXCLUDE_FROM_ALL]
         [NAMELINK_ONLY|NAMELINK_SKIP]
        ] [...]
        [INCLUDES DESTINATION [<dir> ...]]
        )
```
https://cmake.org/cmake/help/v3.13/command/install.html
のようにたくさんのオプションを持ちます。これを自分で実装する話です。

cmakeの関数の引数
-----------------
まず`function`を使って関数を定義してみましょう：

```cmake
function(myfunc arg)
  message("ARG1 = ${arg}")
endfunction()

myfunc("a1")
```

```
$ cmake .
ARG1 = a1
...
```

名前を付けた引数は`${arg}`のように参照できますね。実はcmakeは名前を付けなかった引数はすべて`${ARGN}`に入れます

```cmake
function(myfunc arg)
  message("ARG1 = ${arg}")
  message("ARGN = ${ARGN}")
endfunction()

myfunc("a1" "a2" 3)
```

`${ARGN}`はリスト型になるので、表示するときは各成分が`;`でつながれた形になります

```
$ cmake .
ARG1 = a1
ARGN = a2;3
...
```

cmake_parse_arguments
----------------------
この`${ARGN}`は手動でパースしないといけないのでしょうか？ここで登場するのが[cmake_parse_arguments](https://cmake.org/cmake/help/latest/command/cmake_parse_arguments.html)です。
この関数はちょっとややこしい引数をとるのでドキュメントを読んでも分かりにくいです。サンプルをいくつか試してみましょう。

```cmake
function(myfunc arg)
  cmake_parse_arguments(MYFUNC "" "OUTPUT" "" ${ARGN})
  message("ARG1 = ${arg}")
  message("ARGN = ${ARGN}")
  message("OUTPUT = ${MYFUNC_OUTPUT}")
endfunction()

myfunc("a1" "a2" 3 OUTPUT "/path/to/output")
```

これで`OUTPUT`というオプションを持たせることが出来ます。

```
$ cmake .
ARG1 = a1
ARGN = a2;3;OUTPUT;/path/to/output
OUTPUT = /path/to/output
...
```

`OUTPUT`は値を一つとるオプションです。関数に渡したオプションの値は`${MYFUNC_OUTPUT}`として参照できます。この`MYFUNC`はcmake_parse_argumentsの最初の引数で上げた文字列で、cmakeには名前空間が無いので関数名を付けて名前の衝突を回避します。

cmake_parse_argumentsの第2,3,4引数はそれぞれbool値のみを保持するフラグオプション、値を一つとるオプション、値を複数とるオプションです。

```cmake
function(myfunc arg)
  cmake_parse_arguments(MYFUNC "" "OUTPUT" "SOURCES" ${ARGN})
  message("ARG1 = ${arg}")
  message("ARGN = ${ARGN}")
  message("OUTPUT = ${MYFUNC_OUTPUT}")
  message("SOURCES = ${MYFUNC_SOURCES}")
endfunction()

myfunc("a1" "a2" 3
  OUTPUT "/path/to/output"
  SOURCES "vim" "emacs"
  )
```

```
$ cmake .
ARG1 = a1
ARGN = a2;3;OUTPUT;/path/to/output;SOURCES;vim;emacs
OUTPUT = /path/to/output
SOURCES = vim;emacs
...
```

それぞれの引数にリストを上げると複数のオプションが定義できます

```cmake
function(myfunc arg)
  cmake_parse_arguments(MYFUNC "" "OUTPUT" "SOURCES;DEPENDENCIES" ${ARGN})
  message("ARG1 = ${arg}")
  message("ARGN = ${ARGN}")
  message("OUTPUT = ${MYFUNC_OUTPUT}")
  message("SOURCES = ${MYFUNC_SOURCES}")
  message("DEPENDENCIES = ${MYFUNC_DEPENDENCIES}")
endfunction()

myfunc("a1" "a2" 3
  OUTPUT "/path/to/output"
  SOURCES "vim" "emacs"
  DEPENDENCIES "glibc" "linux"
  )
```

```
$ cmake .
ARG1 = a1
ARGN = a2;3;OUTPUT;/path/to/output;SOURCES;vim;emacs;DEPENDENCIES;glibc;linux
OUTPUT = /path/to/output
SOURCES = vim;emacs
DEPENDENCIES = glibc;linux
...
```

最後に
------
cmakeの変数の扱いはshellに少し似てますが独特で触りにくいですね…(´・ω・｀)
Oracle Cloud 仮想ネットワークに含まれるコンポーネントメモ

# はじめに

Oracle Cloud の勉強の一環で、Oracle Cloud Infrastructure の仮想ネットワーク(Virtual Cloud Network)に含まれるコンポーネントを整理していきます。

勉強を進めるにつれて不足しているものがある場合は追記していきます。



# Virtual Cloud Networkに含まれるコンポーネント

## VCN

Oracle Cloud 上で定義した Software Defined Network。VCNの中に複数のSubnetを定義することが可能



## Subnet

仮想ネットワークを構成するIPv4のサブネット。Subnetの中に、Private Subnetと、Public Subnet の2種類が存在している

### Private Subnet

Internet と通信することが出来ないSubnet。Internet Gatewayや、Security List などを作成しても通信はできない

### Public Subnet 

Internet と通信することが出来るSubnet。Subnet作成時のDefaultは、Public Subnet。



## VNIC

インスタンスにアタッチされ、サブネットに接続する仮想的なネットワーク・インターフェース・カード 

### Primary VNIC

インスタンスに一番初めに接続するVNIC

### Secondary VNIC

インスタンスに2個目以降に接続するのVNIC。付与できるVNICの数は、InstanceのShapeに依存する



## Private IP

VCN内で使用されるPrivate な IPアドレス。Internet から接続は不可

### Primary Private IP

VNICに付与する一番初めの Private 用IPアドレス。

### Secondary Private IP 

VNICに付与する、2個目以降の Private IP アドレス。Secondary Private IP を使用する理由は、Virtual IP のような使用方法が可能。Act - Stb 構成のインスタンスを構成し、障害に応じて Secondary Private IP を Failover することが出来る



## Public IP

インターネットから疎通可能なグローバルIPアドレス。インスタンスがInternetと直接通信するには、VCNに作成するInternet Gatewayが必要。

### Ephemeral

短時間稼働してすぐ止めるインスタンス(正確にはVNICに設定するPrivate IP)に対して、一時的に付与することが可能。他のインスタンスに付け替えることはできない

### Reserved

Public IPを予約して置くことが出来る。他のインスタンスに付け替えることが出来る。Regionごとに50個までしか予約することが出来ない



## Internet Gateway

Internet側から Instance に接続するときに必要になる仮想ルータ



## NAT Gateway

InstanceからInternetへは接続できるが、Internet → Instance は接続を遮断する仮想ルータ



## Service Gateway

VCNと OCI の各サービス間を、インターネットを経由しないプライベート接続用の経路を提供。現段階では Object Storage との通信に使われている様子



## DRG (Dynamic Routing Gateway)

VCNとオンプレミス間のプライベートネットワークのpathを提供。IPSec VPN か、FastConnect を使用してオンプレミスと接続が可能。また、VCNと別Region間のVCNを接続するときにも、DRGを使用する (Remote VCN Peering)。1個のVCNに対して、1個のDRGを接続することが出来る



## Local Peering Gateway

同一Regionに存在するVPNを接続するために使用する仮想ルータ。別のRegionに存在する VCN と接続する場合は、DRGを使用して、 Remote VPN Peering をする。



## Route Table

 VCN/サブネットのルーティングを行う仮想ルーターに設定するルーティング・テーブル 



## Security List

VCNに対する Firewall のルール



## DHCP Option

VCNでインスタンスを起動するときに付与するDHCP の Optionを管理。DHCPで配布する DNSサーバの指定、Search Domain の指定を変更することが可能



## VCN Resolver 

VCN内部のInstanceを名前解決するための VNC Resolver。`<instance_name>.<subnet_name>.<vcn_name>.oraclevcn.com` という形式で名前解決が可能




# 参考URL

OCI Document

https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/overview.htm
Github最悪のpushコード(参考にしてはいけない)

# はじめに
ここでやっていることはあまり人様にお見せできるようなまともなことではありません。完全に自分ひとりしかいじることのないプロジェクトでpushするとき用にお使いください。なぜ参考にしてはいけないかは一番下に書いてあります。

## 使う人の想定
- とりあえずなんでもいいから変更履歴残したい
- 慣れてなくて`add`、`commit`、`push`コマンドが覚えられない
- 普通にコマンド打つのだるい
- GUIツール覚えるのはそれはそれでめんどくさい

っていう人。

# push用のスクリプト作成
まずはチートコードを作ります。コマンドライン上で以下を実行します。

```
touch push.sh
chmod 700 push.sh
```

### 上の説明
- `touch`コマンドは上のように使うと`push.sh`という名前の空のファイルを作ることができます。
- `chmod`コマンドは、指定したファイルを「どのユーザが読み書き実行のどこまでやっていいのか」の権限を指定することができます。今回は上のようにすることで、自分が読み書き実行できるようになります。(詳しくは[[Linux][chmod] パーミッションを数値で指定する](https://qiita.com/koara-local/items/185838ea3fa37d9007f7))

ファイルを作ったら中身を以下のようにします。

```push.sh
git add .
git commit -m "更新"
git push origin master
```

### 上の説明
- `git add .` で今いるディレクトリのファイルを全部commitする対象にします。
- `git commit -m "更新"`でaddで対象にしたファイルを追加、変更、削除した履歴をローカル(自分のパソコン上)に保存します。
- `git push origin master`でcommitした履歴の内容をリモート(Githubなど)に保存します。

チートコードの完成。

# Githubなどにあげたいディレクトリの設定
Githubなどにあげたいディレクトリの初期設定をします。あげるディレクトリまで`cd`コマンドで行き、以下を実行します。

## 初期化
```
git init
git remote add origin リモートリポジトリのURL
```

### 上の説明
- `git init`で初期化をします。
- `git remote add origin リモートリポジトリのURL`で`origin`が「内容をあげたいリモートリポジトリ(Githubなど)」だと設定できます。sshの設定をしてたらそっちのほうがいいけど、めんどうだったらhttpsで。

## .gitignoreの設定
作成したpush.shをリモートリポジトリにあげたくないので、commitする内容には含めないよって設定します。以下の内容のファイルを作成します。

```:.gitignore
push.sh
```

そしてさっき作ったpush.shを`mv`コマンドであげたいディレクトリに持ってきて準備完了。

# pushするとき
「よし、色々作ったぞ！！！Githubに作った内容をpushするぞ！！！」ってときに以下を実行します。

```
./push.sh
```

設定していたらGithubのパスワードとか求められますが、これでリモートリポジトリに内容をあげられます。楽ちん。

# どうしてこの方法を参考にしてはいけないか
`push.sh`は全ての行が気軽にやってはいけないことです。何故か?(もちろん、ちゃんと理解した上であえてやる分には何も言うことはありません)

## `git add .`
`.`はディレクトリ全てのファイルを対象とするということです。もしも弄りたいファイル以外のファイルの内容が変わっててこれを実行すると、意図しない内容がcommitされてしまします。基本的には`git add ファイル名`でファイルを指定してaddするべきです。

## `git commit -m "更新"`
もしも他の人がcommit履歴を見たときにコメントに「更新」ってあったら、「何をどうしたんだよおぉぉぉぉぉぉぉぉぉぉぉ、ふざけんじゃねぇよぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉ」ってなります。コメントには具体的にどういう変更をしたか書くべきです。

## `git push origin master`
Githubにはブランチという機能があります。masterブランチは基本的に本番で使うような完成形が保存されるブランチです。なので、複数人の開発で誰かが他の人を無視してmasterにあげてたらその内容がちゃんとしたものでも「うわっ、勝手にいじられてるやんけ！」ってなります(まぁ、ちゃんとした開発環境ではそれができないように設定してあったりもしますが)。なので、基本的には`git push origin 別のブランチ名`で他のブランチにプッシュし、そこからプルリクエストを使ってmasterなどに反映してもらうようにするべきです。

いかがでしたか?今回は一人で使うプロジェクト用のpushスクリプトを作成しました。コマンドの意味をしっかり覚えてちゃんと使えるようになりたかったらこんなことやってないで毎回コマンド叩くなりGUIツール使うなりしてください！
AWSのssh接続がTimeoutするときの対処法

## はじめに

この記事は、筆者がAWSを勉強していた際、ssh接続時にハマったことを備忘録として書き留めた記事です。

## 前提

すでにEC2インスタンスを作成してあり、pemキーをダウンロード済み(なければAmazonのブラウザ上で発行される)であること。

## 結論

Timeoutしているときには、ルートテーブルの設定を疑うべし。

今回の場合は、

1. VPCからの
2. ルートテーブルに遷移
3. 該当のRoute TableのIDをクリック。
4. Routesタブを開いて
5. Edit Routesを選択
![vpc-route-table.png](https://qiita-image-store.s3.amazonaws.com/0/195539/e914ab07-a49a-eea1-ea41-96236aa2b492.png)

6. Add routesでDestinationに`0.0.0.0/0`を設定
7. Save routes
8. EC2を停止 => 再起動
9. `ssh -i sample.pem ec2-user@12.345.678.910`のような形でアクセス
10. ログインできれば成功


## なぜ起きたか

ルートテーブルの送信元とターゲット(サブネットグループ)が正しく設定されていなかったのが原因ですね。

誰もいない部屋にずっと呼び鈴を鳴らしている状態だったため、問い合わせしているsshが「誰もいねーよ！」とキレて戻ってくるというお話でした。
Power BI Desktop で Azure Table Storageを読み込み & JSON列を展開

# 1. Table Storage データの取得
- Power BI Desktopを起動する
- `ホーム`メニューから`データを取得` > `その他` > `Azure` > `Azure Table Storage`
- `アカウント名またはURL`に、ストレージアカウントの名前を入力
- `アカウントキー`に、ストレージアカウントのkey1(またはkey2)を入力して`接続`
- 読み込みたいテーブルをチェックして`読込み`
  - テーブルストレージは、PartitionKey, RowKey, Timestamp, Content の4列で読み込まれる。
  - 画面左側の`リレーションシップ`を選択すると、読み込んだテーブルが表示される。
  - PartitionKey, RowKey, Timestampの3列しかないため、クエリを編集して列を追加する。

# 2. クエリの編集
- `ホーム`メニューから`クエリの編集`
- 変換ステップを作成する
  - `ホーム`メニューから`行の保持`>`上位の行`を選択して任意の行数（ex:1000行)を指定する。
  - `Content`列の`列の展開`ボタンを押す.上位の行の内容を元に列名がプレビューされるので`OK`
  - 内容がJSONの列の場合、`変換`メニューから`解析`>`JSON`でJSONの内容が解析される。項目が列に展開されるまで列の`列の展開`をクリックする。
  - すべて文字列の列になっているので、必要に応じて`変換`メニュー>`データ型`を数値などに変換する。
  - 特定の条件の行だけにフィルタをしたい場合は、列名の横の`フィルタ`ボタンを押す
- これまでに指定した条件は`適用したステップ`欄に表示される。ステップの追加・削除・並べ替えが可能。
- 条件が完成したら、`ホーム`メニューから`閉じて適用`
  - 画面左側の`リレーションシップ`を選択すると、読み込んだテーブルが表示される。
  - 対象レコードの中にエラーがあると、失敗する。対象の行をフィルタするなどして、調整する。
Vue.jsでMarkdownを表示する

軽いメモ。

根っからのアプリエンジニアな所為か、静的なページを作るのがとても面倒に感じます。

なんでいちいち文字組みせんといかんねんって感じで。
HTMLタグとか知らんし。

デザインセンスの欠片もないエンジニアはMarkdownが限界です。
ってか、Markdownそのまま表示したらええやん。

で、思い立ったんででやりました。
(ざーっとやったんで、きっともっと簡単な手法があると思います)

## 構想
- Vue.jsで
- .mdファイルを読ませて
- 表示だけする

### Vue.jsを準備
- 前回参照

### Vue.jsでmdファイルを読めるようにする
- npmで `markdown-to-vue-loader` をインストール

```terminal
$ npm install markdown-to-vue-loader vue-loader webpack --save-dev
```

- webpackの設定ファイルに追記

```js:webpack.base.conf.js
module: {
  rules: [
    {
      test: /\.md$/,
      exclude: /(node_modules|bower_components)/,
      use: [
        'vue-loader',
        {
          loader: 'markdown-to-vue-loader',
          options: {
              exportSource: true    // この設定でMarkdownのRawデータを読み込めるようにする
          },
        },
      ],
    },
  ],
}
```

詳しいことはここを参照 (https://github.com/fengyuanchen/markdown-to-vue-loader

### Markdownを解析できるようにする
- npmで `marked` をインストール

```terminal
$ npm install marked --save--dev
``` 

詳しくはここを参照 (https://github.com/markedjs/marked)

### Vue.jsでMarkdownファイルを追加する
- assetsに追加します

<img width="816" alt="スクリーンショット 2019-02-02 1.49.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/7690/4958a7ed-2565-2ab9-3342-a1827f63949b.png">

### Vue.jsでMarkdownを表示してみる
- 適当にvueコンポーネントを追加
- Markdownファイルを読み込んで、 `marked` 関数でパースして、 `v-html` で展開します

```vue:Markdown.vue
<template>
  <div class="markdown">
    <div v-html="compiledMarkdownText" />
  </div>
</template>

<script>
import marked from 'marked'
import md from '../assets/markdown.md'

export default {
  name: 'Markdown',
  data () {
    return {
      markdownText: md.source    // sourceで Rawデータが取得できます 
    }
  },
  computed: {
    compiledMarkdownText: function () {
      return marked(this.markdownText)    // computedにする必要あるかどうかは知らん
    }
  }
}
</script>

<style scoped>
</style>
```

## 結果
ビルドしたらこんな感じで表示されます

<img width="1107" alt="スクリーンショット 2019-02-02 1.52.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/7690/e33e6dd6-a5b5-749b-f9d1-6a5cd0b8e9cf.png">

あとはCSSを適当にいじって終わり

以上！
Scalaのimplicitlyの使い方

## 概要
以前に[Scalaのimplicit（暗黙）に関する理解のためのメモ](https://qiita.com/someone7140/items/82d79f4bd35dfd0b5127)でimplicitの使い方について、まとめました。今回は「implicitly」について取り上げます。

## implicitlyについて
implicitlyについてはあまり情報がないのですが、stackoverflowの[What is the Scala identifier “implicitly”?](https://stackoverflow.com/a/3855599)が分かりやすいかなと思います。
要するに暗黙の変数として定義されたものを、型で指定して取得する関数になります。とはいっても、これだけだと何が嬉しいかよくわからないと思うので、下記に例題を用意しました。

## 例題
下記のように親子関係となっているオブジェクトクラスがあります。ImplicityTestから親クラスにある暗黙の変数（test）の値を取得するためには、どうしたら良いでしょうか。

```
object ImplicityTest extends ParentImplicityTest{}

abstract class ParentImplicityTest {
  implicit val test:String = "implicitTest"
}
```
## 取得方法
### ① 変数名をそのまま使う
変数名が分かっていればそのまま取得すれば良いのですが、ソースを追って変数名を調べなければいけません。

```
println(test)
```
### ② 暗黙の引数を使う
関数で暗黙の引数をString型にすれば、取得可能です。ただ、変数として使いたいだけの場合は、わざわざ関数を作らなければいけないのかと少し感じるかもしれません。

```
def printlnImplicity(implicit param:String):Unit = {
　　println(param)
}
```
### ③ implicitlyを使う
最後にimplicitlyを使う方法です。implicitlyは型さえ指定すれば、暗黙の変数を変数として取得できます。

```
println(implicitly[String])
```
初めてのJavaScript⑥

今日の学習内容です。

------

**アロー関数**
「function()」の部分を「() =>」としても
これまでと同じように関数を定義することができる。
呼び出し方も「定数名();」で出力できる。


**引数**（ひきすう）
関数に与える追加情報のようなもの。
関数を呼び出すときに一緒に値を渡すことで
関数の中でその値を利用することができる。

「**(引数名) =>**」と括弧の中に引数名を書くことで
引数を受け取ることができる。


------

今までProgateで学習していましたが
少しややこしくなってきて、実践してみないと分からなくなってきたので
一旦次からDot installで学習していきたいと思います。
vimのユーザーマニュアルを読んだメモ

## はじめに
後で読み返しやすくするようにメモを残しておきます。
詳細はvimでhelpを引く前提です。

## usr_01 マニュアルについて
`CTRL-]`ヘルプでも定義ジャンプができる。
`CTRL-o`ジャンプ元に戻る。

## usr_02 初めてのVim
基本的な操作とヘルプの引き方について。
ヘルプの引き方は読む価値あり。

## usr_03 カーソルの移動
タイトル通り移動や検索コマンドの話。

$のカウント指定は、他の行の行末に移動
`2$`は次の行末へ移動。

`CTRL-E` `CTRL-Y`1行スクロール。

`/\>the` theで始まる単語だけを検索。
`/the\>` theで終わる単語だけを検索。
合わせて`/\<the\>`theだけを検索できる。

## usr_04 簡単な編集
基本的な編集のためのコマンドの話。
オペレーター、モーション、テキストオブジェクトの紹介も。

ビジュアルモード中に`o`で始点の変更。
矩形ビジュアルモードでは`O`で同じ行の反対側に移動できる。

`~` カーソル位置の大文字小文字を切り替えてカーソルを進める。
ビジュアルモードでも使える。

## usr_05 設定の変更
vimrcの話。
ネット上でもよく見かける情報。

## usr_06 構文強調表示
シンタックスハイライトと印刷の話。

`CTRL-L` 画面の再描画

## usr_07 複数のファイルを開く
引数リストの話。

`:set autowrite` 編集中のファイルから離れたときに保存される。

`:write >> logfile` カレントファイルの内容がlogfileの末尾に追記される。
ビジュアルモードで選択すると、その部分だけ追記できる。

## usr_08 ウィンドウの分割
`CTRL-w`系、diff、タブページの話。

`CTRL-W K` 現在のウィンドウを１番上に表示する。
HJKLそれぞれで使える。

`:wall` 変更点のあるバッファをすべて書き込む。

`:diffsplit` コマンドからvimdiffを使える。

## usr_09 GUIを使う
タイトル通り。
GVimを使うならクリップボードの所は読んでおくといいかもしれない。

## usr_10 大規模な編集
ドットリピート、マクロ、`:s`、`:g`、range、矩形ビジュアル、！の話。
気になったら読むべし。

## usr_11 クラッシュからの復帰
スワップファイルの話。

## usr_12 便利な小技
正規表現を使った編集、`:Man`等の話

## usr_20 コマンドラインを素早く入力する
コマンドライン、コマンドとオプションの短縮形の話等。
`:`や`/`を押したときの所がコマンドライン。

### 矢印/BS連打からの開放
`<C-Left>`or`<S-Left>` 1単語移動。Rightも同様。
`CTRL-b` 行頭へ。
`CTRL-e` 行末へ。
`CTRL-w` 1単語削除。
`CTRL-u` すべて削除。

## usr_21 中断と再開
`CTRL-z`→`$ fg`、viminfo、セッション、モードラインの話。

Vimを終了するたびにマークが設定され、最新のマークは '0。

`:oldfiles` viminfoに記録されている今まで開いたファイルが見れる。
`:e #<3`で３番目の物を開ける。

## usr_22 ファイルを探す
netrw、カレントディレクトリ、path、バッファの話。

## usr_23 特殊なファイルを編集する
OSごとのファイルタイプ、ネット上のファイルの編集、暗号化、バイナリファイル、圧縮ファイルの話。

## usr_24 素早く入力する
`i_CTRL-<いろいろ>`、 `<C-p>`,`<C-x><C-<いろいろ>>`な補完、短縮入力`:ab`、ダイグラフ`:digraph`の話。

`i_CTRL-o` 挿入ノーマルモード。ノーマルモードのコマンドを１つだけ使える。

## usr_25 テキストの整形
`gq`、字寄せ等の見た目の変更の話。

## usr_26 繰り返し
`gv`  前回と同じ範囲のビジュアルモードを開始する。
`CTRL-a` `CTRL-x` 数字のインクリメント、デクリメント。
`:argdo` 引数リストのすべてのファイルにコマンドを実行。
シェルスクリプトからVimを使う、標準入力をVimに渡す話。

## usr_27 検索コマンドと正規表現
タイトル通りの話。正規表現は`:h pattern`を見たほうがわかりやすいかも。

検索するとき、オフセットを指定できる。
`/foo/2` fooの２行下にカーソルが行く。
`/hoge/b` `/hoge/e` カーソルが検索文字の先頭/末尾に行く。
`/hoge/b±2`等でそこからずらすことができる。

## usr_28 折り畳み
zから始まる系の折り畳みの話。
`}}}`のようなマーカー以外にも構文・インデント・スクリプトの折り畳みができる。

## usr_29 プログラムの中を移動する
ctags、C系のジャンプコマンドの話。

## usr_30 プログラムの編集
`:make`、タブやスペースの設定、インデントの設定の話。

## usr_31 GUIを活用する
GVimの話。

## usr_32 undoツリー
undoしてredoしてを繰り返すとundoツリーができるという話。
undoを今より便利に使えるかも。

`:earlier {count}` {count}回前に保存したときの状態に戻す。
`:later` earlierの逆。

## usr_40 新しいコマンドを作る
map、コマンド関連の話。
プラグインをいじるのに使いそうな感じ。

### mapと短縮入力(ab)の違い
引数の処理は同じ。

#### map
+ マップ文字列の最後の文字を入力したときに実行される。
+ マップが実行されるまでそれまでの文字は入力されない。
+ 'showcmd'`がオンの場合、入力途中の文字が右下に表示される。

#### 短縮入力
+ 単語のあとで単語以外の文字を入力したとき実行される。
+ 入力中の文字は入力され、実行されたとき置換される。

## usr_41 Vim script書式
タイトル通り。プラグインの作り方まである。読んで損なし。

## usr_42 新しいメニューを追加する。
GVimのメニューの話。

## usr_43 ファイルタイプを使う。
タイトル通り。ftplugin等の話。

## usr_44 構文ファイルを作成する
タイトル通り。

## usr_45 言語を選択する
言語と文字エンコードの話。

`:language` 言語を変更できる。

## usr_90 Vimのインストール
タイトル通り。
Windows 10 Pro x64 + Excel2016 x86 VBA の ListBox で複数の列を表示する

##目的
Excel VBA のUserForm上のListBoxに複数列を表示したい時のメモ
普段はデータベースからのデータを表示することが多いんだけど
最小限必要なコードを張りつけてみる
##作成手順
・UserFormを1個追加する(UserForm1)
・UserForm1の上にListBoxを1個追加する
・UserForm1の上にCommandButtonを3個追加する
・CommandButton1-3をクリックしたときにListBox1に対応するデータを追加する
・ListBox1をダブルクリックしたときに、対象データを表示する
対象データは[郵便番号データダウンロード](http://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html)の全国一括(KEN_ALL.CSV)より一部抜粋
##サンプルコード
```vba
Option Explicit

Private Sub CommandButton1_Click()
    Call SetPostal("01")
End Sub

Private Sub CommandButton2_Click()
    Call SetPostal("02")
End Sub

Private Sub CommandButton3_Click()
    Call SetPostal("03")
End Sub

Private Sub SetPostal(ByRef aPrefCode As String)
'
    ListBox1.Clear
    ListBox1.ColumnWidths = "30 pt;40 pt;70 pt;100 pt"
    ListBox1.ColumnCount = 4
'
    Select Case aPrefCode
    Case "01"
            ListBox1.AddItem ""
            ListBox1.List(0, 0) = "01101"
            ListBox1.List(0, 1) = "0640954"
            ListBox1.List(0, 2) = "札幌市中央区"
            ListBox1.List(0, 3) = "宮の森四条"
            ListBox1.AddItem ""
            ListBox1.List(1, 0) = "01102"
            ListBox1.List(1, 1) = "0028071"
            ListBox1.List(1, 2) = "札幌市北区"
            ListBox1.List(1, 3) = "あいの里一条"
    Case "02"
            ListBox1.AddItem ""
            ListBox1.List(0, 0) = "02201"
            ListBox1.List(0, 1) = "0301271"
            ListBox1.List(0, 2) = "青森市"
            ListBox1.List(0, 3) = "六枚橋"
            ListBox1.AddItem ""
            ListBox1.List(1, 0) = "02202"
            ListBox1.List(1, 1) = "0361516"
            ListBox1.List(1, 2) = "弘前市"
            ListBox1.List(1, 3) = "藍内"
     Case "03"
           ListBox1.AddItem ""
            ListBox1.List(0, 0) = "03201"
            ListBox1.List(0, 1) = "0200886"
            ListBox1.List(0, 2) = "盛岡市"
            ListBox1.List(0, 3) = "若園町"
            ListBox1.AddItem ""
            ListBox1.List(1, 0) = "03202"
            ListBox1.List(1, 1) = "0270202"
            ListBox1.List(1, 2) = "宮古市"
            ListBox1.List(1, 3) = "赤前"
    End Select
'
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
'
    Dim setVal1 As String
    Dim setVal2 As String
    Dim setVal3 As String
    Dim setVal4 As String
'
    If ListBox1.ListIndex >= 0 Then
        setVal1 = ListBox1.List(ListBox1.ListIndex, 0)
        setVal2 = ListBox1.List(ListBox1.ListIndex, 1)
        setVal3 = ListBox1.List(ListBox1.ListIndex, 2)
        setVal4 = ListBox1.List(ListBox1.ListIndex, 3)
    End If
'
    Debug.Print setVal1, setVal2, setVal3, setVal4
'
End Sub
```
DonkeyCar 3.1.0 RamDiskを使用する

#目的
手動操縦で走らせて学習データを集めていると，ときどき操縦が効かなくなる事がある（１～２秒間）．
これはデータをSDカードに保存する事に時間が掛かるときがあるため．
データをRamDiskに保存すれば改善される．

#方法
mycar/myconfig.py の20行目
TUB_PATH = os.path.join(CAR_PATH, 'tub') # if using a single tub
を
TUB_PATH = '/run/shm/tub/'
とする．

#注意事項
ホストに学習データを転送する際はこのフォルダから．
RamDiskの容量は約250キロバイト．
ラズパイの電源を切ると消える．
ラズパイが再起動すると消える．
LED点灯の小さなメモ

よく分からなくなる時に戻るメモ：

- LEDの定格電流は20mA（下記本の付属品）
- 電源は電池2本（3V)
- 抵抗は220Ω
- 電流は I = V/R → 3/220 → 13mA

![写真 2019-02-02 0 03 15.jpg](https://qiita-image-store.s3.amazonaws.com/0/50690/d4bb30b9-4dc6-94a2-f013-3e1078e61f9a.jpeg)


## 参考リンク
直列回路 http://www.max.hi-ho.ne.jp/lylle/omu3.html
→基本が分かりやすい

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4903272761/kuredev-22/ref=nosim/" name="amazletlink" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/51VxZH%2BIo0L._SL160_.jpg" alt="キットで遊ぼう電子回路 基本編vol.1" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4903272761/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">キットで遊ぼう電子回路 基本編vol.1</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 19.02.01</div></div><div class="amazlet-detail">キットで遊ぼう電子回路研究委員会 <br />株式会社アドウィン (2017-10-01)<br />売り上げランキング: 80,320<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4903272761/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>
[C#]スマートなSQLの書き方

```C#:変数
int id = 1;
string name = "yamada";
```

```C#:bad
string sql = "";
sql += " SELECT";
sql += "   id";
sql += "   , name";
sql += " FROM";
sql += "   hoge h";
sql += " WHERE 1=1";
sql += "   AND h.id   = "  + id;
sql += "   AND h.name = '" + name +"'";
```

```C#:good
var sql = new StringBuilder();
sql.AppendLine(" SELECT");
sql.AppendLine("   id");
sql.AppendLine("   , name");
sql.AppendLine(" FROM");
sql.AppendLine("   hoge h");
sql.AppendLine(" WHERE 1=1");
sql.AppendLine(string.Format("   AND h.id   = {0}", id));
sql.AppendLine(string.Format("   AND h.name = '{0}'", name));
```

```C#:best
// 「@」をつけると逐語的文字列リテラルとなります。
//　文字列内ではエスケープシーケンスが不要になり、改行も可能になります。
// また、C#6.0からは「$」による文字列埋め込みが使えます。
// （SQLインジェクション対策としては、生の文字列埋め込みではなくDBパラメータの利用が推奨です。）
// $@が正解ですが、@$とするとコンパイルエラーを起こすので注意。
string sql = $@"
 SELECT
   id
   , name
 FROM
   hoge h
 WHERE 1=1
   AND h.id   = '{id}'
   AND h.name = {name}
";
```


badなんかはやめてくださいね。
文字列連結ごとに新たにオブジェクトを生成するのでかなり遅くなります。

goodではStringBuilderオブジェクトを使っているので
速度的には速くなりましたが可読性は悪いです。
なお、文字列は一度にa + b + cなどと連結するのが
最もパフォーマンス的には優れるそうです。

bestは文字列を一度で生成し、かつシンプルで可読性も一番ですね。

また余談になりますが、WHERE句に1=1とつけることで
WHERE条件の先頭へ条件を追加する場合に
SQLを修正する手間が省けます。（行入れ替えも可能です）
~~```' OR 1=1 --```とすると、SQLインジェクションですね。悪用厳禁。~~
Lightning Web Components（Jest）

####事前準備
Jestを使用するには、npm と Node.jsをローカル環境にインストールする。stableバージョンの利用が推奨されている。
[Macへのインストール](https://qiita.com/PolarBear/items/62c0416492810b7ecf7c)
[Windowsへのインストール](https://qiita.com/Masayuki-M/items/840a997a824e18f576d8)

npmとNodeのインストールが終わったら、lwc用のプロジェクトフォルダに移動してから、npmを使ってlwc用のJestを導入する。

```
cd ~/lwc_project   //プロジェクトフォルダに移動
npm install
npm install @salesforce/lwc-jest --save-dev
```

ルート/package.jsonファイル にテスト実行用のスクリプトを登録する。

`npm init -y` を実行して作成されるpackage.json に下記を追加する。※スクリプト名の"test" の部分は任意の文字列でOK

```shell
"scripts": {
    "test": "lwc-jest"
 },
```

####テストクラスの作成

DXプロジェクトのルートに \__tests__ フォルダを作成し、そこにテストモジュール（ネーミングルール：xx.test.js）を作成する。dataフォルダにはMockデータ（サーバーからの戻り値を定義したJSONファイル）を入れる。

<img width="347" alt="Screen Shot 2019-02-19 at 21.39.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/161463/35d099af-635f-88b7-7ce0-bac1584c9769.png">

※ 上記はただの慣習的なネーミングコンベンションであり、このフォルダ名でないと実行できないわけではない

####テストの実行
DXプロジェクトのルートフォルダで下記のコマンドを実行する（'test'はpackage.jsonで登録したスクリプト名に合わせること）

```
npm run test
```

####VS Codeでのデバッグ
コマンドプロンプトから実行する以外にも、VS Code上でJSコードをデバッグ実行することも可能。

ルートフォルダ/.vscode/launch.json ファイルを作成し、下記を定義する。

```shell
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug Jest Tests",
            "type": "node",
            "request": "launch",
            "runtimeArgs": [
                "--inspect-brk",
                "${workspaceRoot}/node_modules/.bin/jest",
                "--runInBand"
            ],
            "console": "integratedTerminal",
            "internalConsoleOptions": "neverOpen",
            "port": 9229
        }
    ]
}
```

VS Codeの左側のバーからデバッグアイコンをクリックする。
<img width="55" alt="Screen Shot 2019-02-19 at 21.55.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/161463/ff24f812-b846-07e4-4cab-790dd9c7f3d6.png">

"Debug Jest Tests" を選択して、緑色の実行ボタンを押すとデバッガー上でテストモジュールが実行される。
<img width="236" alt="Screen Shot 2019-02-19 at 21.56.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/161463/5ec7a102-1571-6688-bc2e-854e660292c9.png">

実行時に node が見つからないというエラーが出る場合は、runtimeExecutableをlaunch.jsonに追加する。nodeモジュールの場所はコマンド `which node` で調べる。

```shell
            "port": 9229,
            "runtimeExecutable": "/Users/xxx/.nodebrew/current/bin/node"

```
 
VS Code上でデバッガーが起動する。
<img width="1327" alt="Screen Shot 2019-02-19 at 21.58.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/161463/9a99468d-db3f-24b1-6a00-b8bb15417a7e.png">
サーバ・クライアントソケット通信（Golang並行処理）

こんにちは。
"[GOROUTINES AND CHANNELS: A REAL(LY) SIMPLE SERVER IN GO](http://elliot.land/post/goroutines-and-channels-a-real-ly-simple-server-in-go)" という記事を見つけ、```server.go``` と ```client.go``` をほぼ真似て作りました[^1]。後者は複数クライアントを動かせます（goroutine を利用し、下記例では3並行の通信が動作）。

[^1]: 参考：「[golangで書くunix domain socketを使ったserver/clientのサンプルコード](https://qiita.com/ikeisuke/items/f5eccc178ed388aac92f)」

なお初心者なので、一本の通信路のみを使っているように見えるのにも関わらず（```net.Dial("unix", )```）、サーバと複数クライアント間で混信せず通信できることは不思議な気がします。

```console
$ go run client.go cat dog rat
sent: cat
sent: dog
got: true: cat==cat (0.659071 s)
sent: rat
got: true: dog==dog (0.600131 s)
sent: cat
got: true: rat==rat (0.804632 s)
sent: dog
got: true: cat==cat (1.015675 s)
sent: rat
got: true: dog==dog (1.317314 s)
got: true: rat==rat (0.719661 s)
sent: cat
^Csignal: interrupt
```

```client.go
package main

import (
	"io"
	"log"
	"net"
	"time"
	"flag"
	"sync"
	"fmt"
)

const SECONDS = 1e9
const PATHSOCKET = "/tmp/go.sock"

func sleep(dt float64) {
	time.Sleep(time.Duration(dt * SECONDS))
}

func reader(r io.Reader) string {
	buf := make([]byte, 1024)
	n, err := r.Read(buf[:])
	if err != nil {
		return "error occurs when r.Read()"
	}
	return string(buf[0:n])
}

func client_job(msg string) {
	conn, err := net.Dial("unix", PATHSOCKET)
	if err != nil {
		log.Fatal("Dial error", err)
	}
	defer conn.Close()

	for {
		_, err := conn.Write([]byte(msg))
		if err != nil {
			log.Fatal("Write error:", err)
			break
		}
		println("sent:", msg)
		start := time.Now()
		response := reader(conn)
		elapsed := time.Now().Sub(start).Seconds()
		fmt.Printf("got: %t: %s==%s (%f s)\n", response==msg, response, msg, elapsed)
		sleep(1.0)
	}
}

func main() {
    flag.Parse()
    msg := flag.Args()
    wg := &sync.WaitGroup{} 
    for i := 0; i < len(msg); i++ {
    	wg.Add(1)
    	sleep(0.5)
    	go client_job(msg[i])
    }
    wg.Wait() 
}
```

```server.go
package main

import (
    "os"
	"fmt"
	"net"
	"time"
	"errors"
	"math/rand"
)

const SECONDS = 1e9
const PATHSOCKET = "/tmp/go.sock"

func sleep(dt float64) {
	time.Sleep(time.Duration(dt * SECONDS))
}

func check_print(err error, message string) {
	if err != nil {
		panic(err)
	}
	fmt.Printf("%s\n", message)
}

func server_job(conn net.Conn) {
    buf := make([]byte, 512)
	for {
	    nread, err := conn.Read(buf)
		if err != nil {
			fmt.Printf("Client disconnected.\n")
			break
		}
		reply := string(buf[0:nread]) // simple echo
		sleep(0.5 + rand.Float64())
	    _, err := conn.Write([]byte(reply))
		if err != nil {
			if errors.Is(err, syscall.EPIPE) {return}
			log.Fatal("Write error:", err)
		}
	}
}

func main() {
	os.Remove(PATHSOCKET)
	listener, err := net.Listen("unix", PATHSOCKET)
	check_print(err, "Server is ready.")
	for {
		conn, err := listener.Accept()
		check_print(err, "Accepted connection.")
		go server_job(conn)
	}
}
```
SOTA "state-of-the-art" な論文ばかりを収集した超ベンリなサイト

イカスぜ！！！

**Browse state-of-the-art**

**https://paperswithcode.com/sota**

![1.png](https://qiita-image-store.s3.amazonaws.com/0/194769/037d9bd1-2de5-8c16-ce65-ed2981a05ca5.png)

以上 :grin:
GoogleCTF #beginners/misc-floppy2

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/2c2234f2-7f81-87ee-0ddf-0b0b3b37c401.png)


#問題

https://capturetheflag.withgoogle.com/#beginners/misc-floppy2

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/0317637f-49a8-41de-7f39-fe2e39a1543e.png)

#解いてみた

[GoogleCTF #beginners/misc-floppy](https://qiita.com/CTFman/items/7b745760ae0ca39a580d)で生成されたファイルのうち全く触れなかったファイル「www.com」を解析する問題。

サクラエディタで見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ee795d31-10d2-84fa-675f-2675b6719dc5.png)

暗号問題？
2行目は普通の英語ですが、1行目が謎ですね。1行目を解くとflagが明らかになるんでしょう。
ダメ元でROT13とかbase64とかいろいろやってみたものの何にもヒットしませんでした。

やれることがなくなってきたので、ダブルクリックしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/17cae725-dbae-a3f0-8526-26af4be24db6.png)

ん？実行できなかったものの、もしかして実行ファイル？
コマンドプロンプトから実行してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/dfc39f71-7aad-7905-6ab7-9728f1bc6ee0.png)

やはり実行ファイルっぽいけど、64ビット環境では実行できないものらしい。

ちなみにwikipediaにもありました。
[COMファイル - Wikipedia](https://ja.wikipedia.org/wiki/COM%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)

仮想マシンでWinXPがあるのでそこで実行してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/00cab1db-1b4e-face-049c-3e38dc31d5bf.png)

んーflagでない。ただエラーはでないのでとりあえず実行はできているようですが、1行目の処理はどこかへ。。。
ダブルクリックしたところ一瞬コマンドプロンプトが出て閉じるだけ。
リダイレクトしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/53ad7827-b791-ac7c-90ff-7004c942eb22.png)

そしてできたファイルを開いてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/5ce7e082-ba0b-46bd-78f6-8f09dd8fa822.png)

できた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/849e9f64-df1e-17ce-c46c-a56be0841cf6.png)