OmniAICreator/Qiita-1.07M huggingface dataset:
テザリングとPCがあるけど、Wifi子機が無い・・・

引越ししたときにネットワーク環境が無くて、スマホのテザリングでしばらく凌ごうと思ったけどPCに無線機能が無かったので、ボロPCを中継させて何とかした話。
![net.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/51602e6c-e752-910f-10e4-0a527fa17610.png)
※US版のWindows使っているので、表現が全て英語です。

### 1. 中継用PCのRouting and Remote Accessを有効化する。
"Type here to search"に"Services"と入力するとサービス一覧が開くので、そこでRouting and Remote Accessを探し、Automaticに設定する。

### 2. 中継用PCのインターネット接続共有を有効化する。
Network Connecitonsでテザリングに接続しているWifiのプロパティを開き、Shareingタブから"Allow other network users to connect through this computer's Internet connection" のチェックボックスをチェックし、イーサネットに接続する。

### 3. 中継用PCのIPアドレスを調べる。
コマンドでipconfigを実行する。

### 4. メインPCのIPアドレスを設定する。
IPアドレスは中継用IPアドレスの次の番号か前の番号にしておけばOK。
デフォルトゲートウェイは中継用PCのアドレスにすること。


### 作業完了。
ここまでやると、ネットにつながるはず。
僕はこのやり方にたどり着くまで5時間かかった。
Grbl設定　ホーミングのTips

#ホーミング設定のちょっとしたTips

ホーミングとリミットスイッチに関わる座標原点の設定です。
\$21ハードリミットをON（\$21＝1）にしておくと、Gコード動作中にリミットスイッチを叩くと異常で停止します。
ホーミングで座標0をリミットスイッチのON位置にすると、
プログラム中でも座標0に来ると異常で停止してしまいます。

簡単なのは\$21=0にしてハードリミットをホーミング時だけ使うことですが、
機械リミットの意味合いからしてちょっと違和感があります。

この、座標0でハードリミット異常停止を回避する方法は、座標原点をずらしておくことですが、
この方法がなかなか分かりづらいです。

まずは、\$27のホーミング後リミット回避距離を設定します。
（例えば\$27=5）
このままでは、Grblは原点から5mmずれた位置を座標として持っているだけでこの5mmの位置を0にはしてくれません。
（あくまでリミットスイッチを叩いた位置が0）
ここで、Defaults.hファイルの下の方、DEFAULT_X_HOMING_MPOSとDEFAULT_Y_HOMING_MPOSの設定を
初期値の0ではなく回避距離分マイナスを入れます。

```:Defaults.h
#ifndef DEFAULT_X_HOMING_MPOS
#    define DEFAULT_X_HOMING_MPOS -5.0
#endif
#ifndef DEFAULT_Y_HOMING_MPOS
#    define DEFAULT_Y_HOMING_MPOS -5.0
#endif
```

こうすると\$27で設定したリミット回避距離だけ進んだ位置が、座標原点(0,0)になります。
よって、Gコードで(0,0)を指定したとしてもリミットスイッチは叩かず
\$21のハードリミットをEnable(1)にしていても問題なく座標(0,0)を指定できます。
もちろん何らかのミスでリミットスイッチを叩くと異常で停止します。
monologでフォーマットを変更したらスタックトレースが表示されなくなった件

### はじめに
laravelのログ出力にはmonologで実装されています。
今回は、このmonologのフォーマットを変更する際にデフォルトだと出力されていたスタックトレースが表示されなくなったので記事として残します。

### 環境
- PHP 8.0.8
- Laravel 8.33.1

### スタックトレースが表示されないコード
まずはわかりやすいように公式ドキュメントに書かれてあるコードを使わせて頂きます。

```php
<?php

namespace App\Logging;

use Monolog\Formatter\LineFormatter;

class CustomizeFormatter
{
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            $handler->setFormatter(new LineFormatter(
                '[%datetime%] %channel%.%level_name%: %message% %context% %extra%'
            ));
        }
    }
}
```

上記のコードだと確かに意図したフォーマットに変更されるのですが、スタックトレースが表示されなくなってしまいます。そこでmonologのLineFormatterのクラスにはスタックトレースを表示するかしないかを決めることができる`includeStacktracesメソッド`があることがわかりました。下記参照👇
[monolog](https://github.com/Seldaek/monolog/blob/main/src/Monolog/Formatter/LineFormatter.php)

このメソッドを実行してあげることでスタックトレースが表示されるようになります。

### スタックトレースが表示されるコード
```php
<?php

namespace App\Logging;

use Monolog\Formatter\LineFormatter;

class CustomizeFormatter
{
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            $format = '[%datetime%] %channel%.%level_name%: %message% %context% %extra%';
            $formatter = new LineFormatter($format, null, true);
            $formatter->includeStacktraces();// ここが必要
            $handler->setFormatter(new LineFormatter($formatter);
        }
    }
}
```

上記のように感じでLineFormatterクラスのインスタンスを生成後にincludeStacktracesのメソッドを実行してあげます。引数はデフォルトがtrueなので特に渡す必要はありません。これで無事にスタックトレースが表示されるようになると思います👏

### おわりに
もし僕のようにスタックトレースが表示されなくて困った方がいましたらその方の助けになればと思います🙇‍♂️
もし今回の内容について誤りがありましたらご指摘いただければ嬉しいです。お読み頂きありがとうございました！

### 参考資料

[公式ドキュメント](https://readouble.com/laravel/8.x/ja/logging.html)
[monolog](https://github.com/Seldaek/monolog)
～ 再帰 ～ チートシート

#目次
[再帰の例](#再帰の例)
[注意点](#注意点)

#はじめに

チートシートの扱いついては[ここ](https://qiita.com/ysys_Ba/items/d27282b888abbd1f43e7#%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)を読んでください

#再帰の例

```python:recursion.py
def sum(num):
  if num == 1:
    return 1
  else:
    return sum(num-1)+num
```

```python:ans.py
print(sum(100))

>>> 5050
```

1からnumまでの整数の和を求める関数
関数の中でその関数自身を呼び出すことで、ループして計算することができる

#注意点

```python:ans.py
print(sum(10000))

>>> Traceback (most recent call last):
>>>   File "./Main.py", line 6, in <module>
>>>     print(sum(10000))
>>>   File "./Main.py", line 5, in sum
>>>     return sum(num-1)+num
>>>   File "./Main.py", line 5, in sum
>>>     return sum(num-1)+num
>>>   File "./Main.py", line 5, in sum
>>>     return sum(num-1)+num
>>>   [Previous line repeated 1887 more times]
>>>   File "./Main.py", line 2, in sum
>>>     if num == 1:
>>> RecursionError: maximum recursion depth exceeded
```

再帰の上限回数が決まっており、それを超えるとエラーを吐く（デフォルトでは1000回まで）
上限回数以上の再帰を行いたい場合は、以下のおまじないが必要

```python:recursion.py
import sys
sys.setrecursionlimit(max_num) # 設定する上限回数をmax_numに入れる
```

しかし再帰の回数が多くなると計算時間が劇的に大きくなるので、**そもそも再帰を使わず普通にfor文とかで同じ計算をした方がよい**
前処理大全を初めてやってみた感想

今回は、Qitaに初めての投稿ということで、前処理大全をしてみた感想を簡潔に述べる

Pythonのみだが一周してみた感想は、2年前に出版ということでライブラリーが更新されていることで使えない関数が後半では多かった。そのため、そういった時にどうするといいのかや、実際にライブラリー設計ページに飛ぶことで、解決策を知ることができた。
このことが、今回の「前処理大全」を一周することでできるようになった一番大きいことだと思う。

余談だが、エンジニアは常に勉強することが必要という意味がわかった。なぜなら、ライブラリーは更新されていくことを確認できたからだ。AIエンジニアなりたいと考え、勉強し始めて4ヶ月になるがエンジニアの大変な一面を知れたのはよかった。
Pythonではじめる機械学習 part2

# 前回の内容
[Pythonではじめる機械学習 part1](https://qiita.com/yuto_suzuki/items/bd45b1525390388a94ef)
＊間違いや指摘があれば、ぜひコメント下さい！

# 1章(後半) 概要
主に機械学習に用いられるライブラリ群の紹介

#### scikit-learn
さまざまな機械学習用のライブラリが入ったパッケージ
　参考書では、基本的にscikit-learnに梱包されたアルゴリズムを題材に学習を進めていく仕組みとなっている。
何か一つを指すと言うよりも、機械学習ライブラリの集合という認識

#### Numpy
科学技術計算用のライブラリ
多次元配列や、線形代数、フーリエ変換など高度な数学式をプログラムから実行したいときに利用される。
scikit-learnのI/FはNumpy配列が前提になっている。

#### matplotlib
科学技術計算向けのグラフ描画ライブラリ
テストデータや解析結果を確認する際に、これを利用するとグラフィカルに表現してくれる。
初めて実行すると結構感動する。

#### pandas
解析を行う際に、対象データをDataFrameというオブジェクトに落とし込んで表現することを可能にするライブラリ
生成したデータは、SQLライクにアクセスできるほか、各種フォーマット(.csv, .xslx)からDataFrameを作成するためのI/Fも提供している。

基本的にライブラリ群の紹介なので、今回所感は割愛します！
次回から、機械学習らしい内容に入っていきます。

# 次回記事
[Pythonではじめる機械学習 part3](https://qiita.com/yuto_suzuki/items/00f58c32e2c87907b477)
[TypeORM]Entity metadata for Post#category was not found.

##概要

#####TypeORMでエラーが表示されてマイグレーションができない
"Entity metadata for Post#category was not found. Chech if you specified a correct entity object and if it's connection in the connection options."


##原因

jsconfig.jsonに作成したEntityを追加していなかった

##対処
jsconfig.jsonに作成したEntityのファイルパスを記入
※TypeScriptの場合はtsconfig.json


```ruby:追記内容
"include": [
    "./entity.post.js",
    "./entity.category.js"
],
```
MapLibre GL JSで時系列コントロールを扱う[maplibre-gl-temporal-control]

# TL;DR

- MapLibre GL JSで時系列表示をするためのプラグイン[maplibre-gl-temporal-control](https://github.com/Kanahiro/maplibre-gl-temporal-control)を開発したよ
- `npm install mapligre-gl-temporal-control`で使えるよ

# maplibre-gl-temporal-control

https://github.com/Kanahiro/maplibre-gl-temporal-control

![f433b-6pjhe.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/b75fb9a6-92c8-1ad9-4d5f-116def9fcbc3.gif)

![42zbp-si00t.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/b3c65d65-b2b6-14f3-2e34-69664b84db5c.gif)


## examples

-   RasterTiles: https://kanahiro.github.io/maplibre-gl-temporal-control/raster.html
-   VectorTiles: https://kanahiro.github.io/maplibre-gl-temporal-control/vector.html

## usage

```sh
npm install maplibre-gl-temporal-control
```

```typescript

const map = new maplibregl.Map(mapOptions)

// anyLayerはmaplibreレイヤーのオブジェクト
map.addLayer(anyLayer1_1)
map.addLayer(anyLayer1_2)
map.addLayer(anyLayer2_1)
map.addLayer(anyLayer2_2)
map.addLayer(anyLayer3_1)
map.addLayer(anyLayer3_2)

import TemporalControl from 'maplibre-gl-temporal-control';

// アニメ表示の各フレームを定義
const temporalFrames = [
    {
        title:'frame1', // 時系列コントロールに表示されるタイトル
        layers:[anyLayer1_1, anyLayer1_2] // 1フレームに表示したいレイヤーの配列
    },
        title:'frame2',
        layers:[anyLayer2_1, anyLayer2_2]
    },
    {
        title:'frame3',
        layers:[anyLayer3_1, anyLayer3_2]
    },
    // 任意の数のフレーム
]

const temporalControl = new TemporalControl(temporalFrames, {
    interval: 100, // 1フレームあたりの表示秒数、ms単位
    position: 'top-left',
    performance: true // アニメ表示のパフォーマンスを向上させるフラグ
});
map.addControl(temporalControl);
```

### ポイント

-   Mapに追加したレイヤーオブジェクトと同じ内容のオブジェクトでフレームを生成しましょう（同じインスタンスである必要はない）
-   `performance: true`の場合、描画パフォーマンス向上のため、本来ゼロとする透過度を`0.000000000000000000001`とする（ベクター限定）
    -   このオプションは通常の用途では設定不要です、もし大量のベクターデータの描画が遅かったりしたら試してみてください


## 技術メモ

- TypeScriptで開発
- CSSをファイルで定義すると、importしたりめんどうくさいので、すべてコード上で定義
- 同じような理由で、再生ボタンなどのアイコンはすべてbase64文字列として保持、ファイルサイズが小さいので容量増加のデメリットは無視
業務はいまどき自動化。設定はいまだに手動か。（韻踏み）

※　業務仕様のエクセルシートは表示出来ない為、同様の状態を再現しています。

#自動で作業させている設定を手作業で更新しているという矛盾

RPAで基幹システムを操作する際の設定ファイルを毎週ごとに手作業で更新している。
1店舗あたりの作業量は大したことはないが、店舗数分を更新しないといけないので面倒だと感じていた。
今回、**Power Automate Desktop**を触る機会があったので、試しに作成してみた。

#作ったものを使ってみた

![kadai3_2_1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792140/9b4537d9-a38b-c586-399a-60a01b70ce2d.jpeg)
![kadai3_2_2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792140/b9e8c2b5-63b0-124b-a32c-a6314272265c.jpeg)
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/protooutstudio?ref_src=twsrc%5Etfw">@protooutstudio</a> <a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://twitter.com/hashtag/PowerAutomateDesktop?src=hash&amp;ref_src=twsrc%5Etfw">#PowerAutomateDesktop</a><br>これが無料ってマジ？ <a href="https://t.co/J6Nz0J0AnY">pic.twitter.com/J6Nz0J0AnY</a></p>&mdash; yuta-proto-biz (@ProtoYuta) <a href="https://twitter.com/ProtoYuta/status/1426338570197897226?ref_src=twsrc%5Etfw">August 14, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#作ったものの中味

![kadai3_2_3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792140/12f8d5a5-a066-aea5-5000-7898299ba0e1.jpeg)

#似てるけど少し違う

社内で使用しているRPAアプリケーションとは扱い方が若干違い、1つ1つのアクションは分かりやすいが、変数の宣言が自動で行われてしまう点がかえって扱いにくく感じた。
**無料かつ高機能**ではあるので、**使える人は使い得**だと思う。

#過去記事へのリンク

[**入口に設置しよう！たのしいマスク判定機**](https://qiita.com/yuta-proto-biz/items/b27ce48596a995ac7058 "マスク判定機")

[**【 LINEBot 】この「漢方薬」が「どんな症状に効くのか」教えてくれませんか？　【 GoogleSpreadSheetAPI 】**
](https://qiita.com/yuta-proto-biz/items/89f8bee634d99067dbeb "漢方薬Bot")
RPAから送られてくる自動配信メールがメールフォルダに大量に溜まる件

※業務使用メールアカウントは表示出来ない為、同様の状態をGmailで再現しています。
#自動配信メールが大量に溜まる

朝出社するとRPAから自動配信された売上数値実績メールが大量に溜まっていて消すのが毎回面倒くさい。
一定の間隔で、**特定のキーワードを含むメールを自動削除**出来たら良いなあと思い立つ。
そういった仕組みが丁度よくあったので、実装してみた。

#メールフォルダを監視して15分毎に自動削除

![kadai3_2_7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792140/31c58fee-6160-3404-c43b-b90b794b8702.png)

#Integromat シナリオ構成

![kadai3_2_8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792140/4d7ed146-6f28-0545-41a5-93471e2ee382.png)

#Integromat 各モジュール詳細

![kadai3_2_9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792140/96f5e1b6-8439-eba5-e0ee-bd0d1c254dda.png)

![kadai3_2_10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1792140/d4523ebb-29ed-198a-6731-002f669b1790.png)

#小さなことの積み重ね

本当に小さなことではあるけれど、毎日何分を積み重ねると**無視出来ない時間**になったりする。
今後も様々な観点からアイデアを出して形にしていく。

#過去記事へのリンク

[**入口に設置しよう！たのしいマスク判定機**](https://qiita.com/yuta-proto-biz/items/b27ce48596a995ac7058 "マスク判定機")

[**【 LINEBot 】この「漢方薬」が「どんな症状に効くのか」教えてくれませんか？　【 GoogleSpreadSheetAPI 】**
](https://qiita.com/yuta-proto-biz/items/89f8bee634d99067dbeb "漢方薬Bot")
LinuCの勉強方法紹介

今回はネタ切れ感があるので、現在進めているLinuC Level2の学習方法を簡単に紹介したいと思います。
以前1.5ヶ月で取得したLinuC Level1の学習方法をそのまま活用しています。

私が実施した内容としては、参考書を読み込むことと模擬試験を解いていくことでした。
まず、参考書は以下を使用していました。
※以下はLevel1ですが、関連商品欄にLevel2もあります

https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LinuC%E3%83%AC%E3%83%99%E3%83%AB1-Version-10-0%E5%AF%BE%E5%BF%9C-%E4%B8%AD%E5%B3%B6/dp/4798166162/

現在Linux系の参考書は多数存在していると思いますが、単純にLinuCに合格するための参考書が欲しいなら上記で十分かと思います。
私の場合、まず参考書を読み基本的な知識をある程度覚えてから模擬試験を解いていました。
参考書を読むにあたり、3色のマーカーを使用して重要そうな箇所を塗りつぶしていました。
単色ではなく複数の色を使用することで、重要度や覚えにくそうな項目を分けることができます。

全て読むと大変なので、2週目以降はマーキングした箇所のみ重点的に読むことで効率よく学習を進めていけると思います。

ある程度学習したら以下の有名な学習サイト、Ping-tを使用して学習を進めていきます。
どちらかといえばPing-tメインで学習を進めた方が覚えやすいです。

https://ping-t.com/

Level1取得時は、だいたい学習時間の7割くらいをPing-tに使用していました。
Ping-tには各問題に2つまでチェックをつける事ができ、たとえば間違えやすい問題にチェックをつける等をしたり、メモも残すことができますので、問題の解き方のヒント的なものを残したりとこれらを活用しました。
なお、当然ですが上記サイトに登場した問題はそのまま試験に出ませんので、問題や答えを丸暗記しても意味ないです。問題の内容を理解する必要があります。

私の場合は元々ネットワーク系でLinuxベースの機器を多少触っていたので上記2点でLevel1は取得できましたが、そもそもLinux自体触った事が無い方は上記だけだとわかりにくいと思いますので、その前にまずLinuxのインストールから初めてみて、実機に触れてみたりもっと易しい入門書を探したりする事をおすすめします。
【セキュリティ】監査 学習まとめ


情報においての

* __攻撃方法__
* __防御方法__
* __監査手段__
* __具体的にどのように対策をすることで安全性が高められるか__

Wikipediaや記事などから細かい部分を抜粋した内容です。
(書籍にて情報セキュリティを学んだ部分に関しては別の投稿にて記載します。)




# 監査に関する用語
調べている際によく出てきた単語だったのでなんとなくググりました。
####ファジング
ソフトウェアに様々な入力を与える事で、脆弱性を発見する手法

####IDPS (intrusion detection and prevention system)
 不正侵入の兆候を検知し管理者に通知するシステム
ネットワーク内にあったりホスト内にあったり様々

####SCADA (Supervisory Control and Data Acquisition)
 産業制御システムの一種 
コンピュータによるシステム監視とプロセス制御を行う

####WAF 
ウェブアプリ保護セキュリティシステム
ウェブサイト攻撃検知に特化
* 主なケース5
>
* レンタルサーバ提供ベンダー
* 大手
* 直接自分で管理していないウェブアプリ
* 他社開発したアプリを利用中など自分では防げない場合
* 諸事情によりアプリ停止できず脆弱性見たりテストができない場合

---

# 監査方法 
 
####ソースコードセキュリティ検査
コードをチェックする方法、主に実装工程にて行われる

####ペネトレーションテスト 
実際に仮想マシン内などにて攻撃をしてみることで発見をする手法
いくつかマシン内にて工程が分かれる

> 
####ホワイトボックステスト 
システムの内部構築を把握した上で、顧客に合わせた内容でテスト
####ブラックボックステスト
システムの内部構築を把握せず、外部から把握できる機能をテスト
####外部ペネトレーションテスト 
攻撃者が攻撃してくる事を想定している上でテスト
####内部ペネトレーションテスト 
システムの内部にすでに侵入者がいる事を想定した上でテスト
####レッドチームオペレーション 
実際に演習で攻撃を仕掛け、攻撃と防御ができているかどうか検査する
弱点がわかりどう言った内容を必要としているのかが分かる
コストがかかる


####システムセキュリティ検査 
機器に不備がないか診断

####パッシブスキャン
アナライザを使うなど受動的に検査をする手法

####アクティブスキャン 
スキャナ~機器間にてパケットを送信し、その反応を見るなど能動的に検査をする手法

####ウェブアプリケーションセキュリティ診断 
ウェブアプリに文字列を送信.ページ遷移を確認.ログ解析などウェブアプリに特化した検査
最近使用したファイルなどにマルウェアがいる可能性が高い

####ログを分析する 
イベント発生をトリガーとして分析 短時間ログ急激などの現象をトリガーとして分析

---

#マルウェア検出方法 

####パターンマッチング検出
 マルウェアの特徴をPC内のファイルと比較して検出
パターンファイルを最新の状態にしておく必要がある
####ヒューリスティック検出
違和感のある特異的な挙動を調べることで発見ができる
####サンドボックス検出 
仮想化環境を作り、その中で実験的に動作確認をする

---

# IDS IPS

####IDS 
__侵入探知システム __

システムやネットワークを監視し分析することで
事前にインシデントや不正侵入を防ぐ

####IPS
__侵入防止システム __
 
IDSの作動後、自動的に遮断や妨害をするセキュリティシステム
IPSやIDPSは誤作動により遮断したら
問題が発生する可能性があるため
慎重なチューニングが必要

ファイアウォール側の探知機能と連動しておくことによって
仮にファイアウォールが作動しなかった場合に
似たような不審な侵入や不正等を探し出す事ができる

アラートの設定や調査基準や報告書の作成などをする事ができる

##IDPS 構成 

####センサー エージェント
 活動の監査と分析を行う機関
センサーはネットワーク
エージェントはホストを対象に行う
####管理サーバ 
センサーやエージェントが採取した情報とは別の方法で検査する事で
特定できなかったような情報を採取する
####DBサーバ 
センサー、エージェント、管理サーバの情報を保存する
####コンソール 
ユーザ	や管理者にユーザインターフェースを提供する


##IDPS 種類 

####無線IDPS 
対象ネットワーク通信範囲内か懸念のあるポイントにて

####NBA 
ネットワークフローの確認、外部との交渉があったかのフローの確認

####ホストベースIDPS
 機密情報が置かれているホストやクライアントホスト

##IDPS 検知手法 
####シグネチャベース 
正規表現でパターン化されたのを探知する
ほとんど攻撃として検知するのは難しい

####アノマリベース 
正常な挙動を学習としてプロファイルを作成し
そのプロファイルに基づいて通信を探知

####ステートフルプロトコル
解析 通信の中で追跡をする
個別コマンドの入力値やフォーマットの長さなどをチェックする
ベクトルタイル in FOSS4G 2021 

[FOSS4G 2021 Buenos Aires のスケジュール](https://2021.foss4g.org/schedule/outline.html) が公開されています。ざっくり見ただけでも、ベクトルタイルに関連する発表がこれだけあります。素晴らしいことですし、その中に参加できることを光栄に思います。

1. Augustin Trancart, Vincent Picavet: Building a cartographic web application with pg_tileserv and pg_featureserv
1. Klokan Petr Pridal: MapLibre project: community driven Mapbox GL fork
1. Taro Ubukawa, Hidenori Fujimura: Deployment of open source vector tile technology with UN Vector Tile Toolkit
1. Adam Laza: Vector tile basemaps for your QGIS project
1. Enrique Soriano: Vector tiles and styles management for Hydrography data
1. Jin Igarashi: FOSS4G software development for Water Utilities Management in Eastern Africa by using Vector Tiles
1. Stefan Brand: Embracing FOSS for vector tile pipelines in 2021 - 2 case studies
1. Pirmin Kalberer: The state of Vector tile servers
1. Andrea Aime, Simone Giannecchini: Standing up a OSM clone with GeoServer. Part 2, revenge of the vector tile!
1. Jin Igarashi, Irankunda Moise: An implementation of FOSS4G - QGIS, QField and Vector Tiles for rural water supply management in Rwanda
1. Tomas Pohanka: OpenMapTiles: vector tiles from OSM
GoogleAPIs spreadsheetAPI 置換API



ぱっと調べてやってる人がいなかったので、備忘録として載せておきます。


| fields | meaning |
| -------- | -------- |
|  find        |    検索単語      |
|  replacement       |  置き換え単語   |
|  matchCase        | 検索で大文字と小文字が区別される場合はTrue         |
| matchEntireCell         | 検索値がセル全体と一致する必要がある場合はTrue         |
| searchByRegex        |  正規表現にする場合はtrue [正規表現ルールはこちら](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html)        |
|  includeFormulas        |  検索に数式を含むセルを含める必要がある場合はTrue。数式を含むセルをスキップする場合はFalse。        |
|  sheetId        |   シートID       |
|  allSheets        |  すべてのシートに適応するか        |
| range     | 範囲    |



```JSON_representation.json
{
  "find": string,
  "replacement": string,
  "matchCase": boolean,
  "matchEntireCell": boolean,
  "searchByRegex": boolean,
  "includeFormulas": boolean,

  // Union field scope can be only one of the following:
  "range": {
    object (GridRange)
  },
  "sheetId": integer,
  "allSheets": boolean
  // End of list of possible types for union field scope.
}
```
## 置換APIサンプル
``` find_replace_example.ts
import { google, sheets_v4, Auth, Common } from 'googleapis'
async execAPI(spreadsheetId: string, key: string, value: string) {
    const auth = await this.authentication(SpreadSheetExchangeScope)
    const sheets = google.sheets({ version: 'v4', auth })

    /* batchUpdateのOption */
    const request = {
      spreadsheetId: spreadsheetId,
      resource: {
        requests: [
          {
            findReplace: {
              find: key,
              replacement: value,
              allSheets: true
            }
          }
        ]
      }
    }

    try {
      const response = (await sheets.spreadsheets.batchUpdate(request)).data
      // TODO: Change code below to process the `response` object:
      console.log('Exchange Success')
    } catch (err) {
      console.log('err:', err)
    }
  }
```

```
execAPI(spreadsheetId,"りんご","なし")
```

## 正規表現による置換サンプル
```regex.ts
import { google, sheets_v4, Auth, Common } from 'googleapis'
  /**
   * Keyで検索し、valueに置き換える
   * @param spreadsheetId 
   * @param key 
   * @param value 
   */
  async regexExecAPI(spreadsheetId: string, key: string, value: string) {

    const auth = await this.authentication(SpreadSheetExchangeScope)
    const sheets = google.sheets({ version: 'v4', auth });

    /* batchUpdateのOption */
    const request = {
      spreadsheetId: spreadsheetId,
      resource: {
        requests: [{
          findReplace: {
            find: "^\\$\\{.*\\}$",
            replacement: value,
            allSheets: true,
            searchByRegex: true
          },
        }],
      },
    }

    try {
      const response = (await sheets.spreadsheets.batchUpdate(request)).data;
      // TODO: Change code below to process the `response` object:
      console.log("exchange regex Success")
    } catch (err) {
      console.log("err:", err)
    }
  }
```


詳しくはこちらのドキュメントを見てください
https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#FindReplaceRequest
11ty(eleventy)のcollectionsとfront-matterで、有機的なナビゲーションを自動生成する

ナビゲーションを自動化したい目的で、自分のサイトのドキュメントを11tyとPugで書き直しています。

11tyでは`collections.all`でサイト全体の情報をオブジェクトで取得できます。
また、各ページの先頭に以下のようにfront-matterを記述することで、ページごとの変数を渡すことができます。

```
---
sample: "これはページ内のテンプレートエンジンや、11tyのcollectionsで変数sampleとして取得できます"
---
```

これらを利用して、下の画像のように擬似的な階層を持ちつつ、順番に読ませるリンクも表示するナビゲーションを、ページを増やすごとに自動更新できないかと考えました。

- 同じ小カテゴリーの
  - 次のページが存在していれば、次ページへのリンクボタンを表示する
  - 次のページが存在しなければ、次の小カテゴリーの1番目へのリンクボタンを表示する
- いずれもなければボタンは表示しない


![スクリーンショット 2021-08-15 19.05.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21117/15bce6df-45a1-eeda-1d42-5c56b677edaa.png)


以下、実装できたのでコードを記載します。

## front-matterの内容

各ページに`order`変数を定義しておきます。小カテゴリー内で連番とし、カテゴリーが変わった場合は*10の位を1増やした1番目*のページから再度カウントします。
つまり、先ほどの図の場合は「コーディングルール」のページは`order: 16`で、「カラーテーブル」のページは`order:21`となります。

```
---
order: 16
pageTitle: "コーディングルール"
---
```

## mixinを作成する

次ページの情報を表示するmixinは以下の通りです。Pugで記述していますが他のテンプレートエンジンも同様の考え方となります。

```javascript
mixin nextNav(order)
  -
    let nextID = Number.parseInt(order)+1;
    let next = collections.all.filter((a) => Number.parseInt(a.data.order) === nextID);
  
  if next.length === 0
    -
      nextID = (Math.trunc(order/10)*10)+11;
      next = collections.all.filter((a) => Number.parseInt(a.data.order) === nextID);

  each item in next
    p 
      a(href=item.url) Next: #{item.data.pageTitle}
```

### 処理の流れ

まず、order変数が`order+1`となっているページをリクエストします。このmixinでは、collections.allにJavaScriptのfilterをかけていますが、もっとスマートな方法があるかもしれません。


```javascript
  -
    let nextID = Number.parseInt(order)+1;
    let next = collections.all.filter((a) => Number.parseInt(a.data.order) === nextID);
```

結果が空であれば、10の位を上げ、さらに1増やして再試行します。
10で割ってからMath.truncで整数部分を取り、もう一度10倍すると、10の位のぴったりの数字となります（3なら0、16なら10です）。これに11を足して位を上げています。

```javascript
  if next.length === 0
    -
      nextID = (Math.trunc(order/10)*10)+11;
      next = collections.all.filter((a) => Number.parseInt(a.data.order) === nextID);
```

最後にページ情報を展開します。1件か0件であるはずです。リンクのラベルテキストはfront-matterで定義しているページタイトルを出したいので`data.pageTitle`となります。

```javascript
  each item in next
    p 
      a(href=item.url) Next: #{item.data.pageTitle}
```

## テンプレートで呼び出す

テンプレート側では`order`変数を渡して呼び出します。Pugは継承が使えるので、レイアウトテンプレートに書いておけばよいと思います。

```
+nextNav(order)
```

----

サイトマップの生成は、JSONでデータを書いて展開する方法がよく紹介されているのですが、これだと実際のHTMLを変更・削除したときに漏れが出そうなので、ジェネレーターらしい手段を考えてみました。

11tyは、サイト内のページ情報を常に整理してくれているようです。うまく利用すれば静的なサイトも破綻やリンク切れを起こさずに作成できるかなと感じています。
筋肉をムキムキにする方法


#背景
大学時代のころハルクみたいな体型のラガーマンの友人から筋トレの方法教わったことがあります。その友人の言う通りに筋トレをした結果、１ヶ月〜２ヶ月ほどで「めちゃくちゃ筋肉あるヤン」っと言われるほどになりました。（今はしばらくサボっていたのでひょろひょろですが…..）

その当時教わったことと、改めて自分で勉強した学んだことを共有したいと思います。

#筋肉が大きくなるメカニズム
まず初めに筋肉をが大きくなるメカニズムについて知る必要があります。

筋肉はトレーニング等を行うことにより筋繊維の一部が傷つきます。適切な栄養と休養を与えることで傷ついた筋繊維が修復されます。このとき筋繊維は以前よりも少し太くなって修復されるので、結果的に筋肉が大きくなります。これを何度も何度も繰り返すことでムキムキマッチョメンになります。

簡単にいうと筋肉をぶち壊して、美味い飯を食べて、寝れば筋肉は大きく成長するということですね。


#筋肉を大きくする方法
そして筋肉を大きくするためのトレーニング方法は５~10回、ぎりぎり持ち上げることのできる重量でのウェイトトレーニングを行い、それを数セット繰り返すことで筋繊維をぶち壊すことできます。またセットの間のインターバルを短く短縮することでなお効果が高まります（目安は30秒〜１分程度）
nuxt.jsにてfabricでcanvasに四角形図形を追加できるようにする

## 目的

- javascriptのみでnuxt.jsのアプリにfabric.jsを導入したい

## 前提

- fabric.jsをインストールしている。

こちらの記事にインストール方法は書きました。

https://qiita.com/greenteabiscuit/items/52bc842b686362314123

## インストール

vue3のcomposition apiを使いたいので、インストールします。

```
yarn add @nuxtjs/composition-api
```

nuxt.config.jsのモジュールに追加しておきます。

```nuxt.config.js
  buildModules: [
    // https://go.nuxtjs.dev/eslint
    '@nuxtjs/eslint-module',
    // https://go.nuxtjs.dev/stylelint
    '@nuxtjs/stylelint-module',
    // https://go.nuxtjs.dev/vuetify
    '@nuxtjs/vuetify',
    '@nuxtjs/composition-api/module',
  ],
```

## vueファイル

```index.vue
<template>
  <div>
    <h1>Hello, Fabric!!</h1>
    <v-btn @click="add()">add</v-btn>
    <div class="wrapper">
      <canvas id="canvas" width="600" height="600" />
    </div>
  </div>
</template>

<script lang="js">
import { computed, defineComponent } from "@nuxtjs/composition-api"
import { fabric } from "fabric"

export default defineComponent({
  setup() {
    const canvas = computed(() => new fabric.Canvas("canvas"))
    const add = () => {
      canvas.value.add(
        new fabric.Rect({
          top: 100,
          left: 100,
          width: 60,
          height: 60,
          fill: "red",
        })
      )
    }

    return { add }
  },
});
</script>

<style scoped>
.wrapper {
  width: 600px;
  height: 600px;
  border: 1px solid;
}
</style>
```

## どのように見えるか

Addするとこのように表示される。四角形は自分の好きなように変形させることが可能。

![Screen Shot 2021-08-15 at 19.43.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/e591840e-4064-d16f-6bb3-b203a1b98826.png)


## 参考

ありがとうございました。

https://zenn.dev/sa2knight/scraps/a2952f7dd7a3ef
iPadOSのアップグレード後、Touch ID、パスコード、二段階認証を設定しない方法

#1. はじめに

自宅から持ち出さない親のiPadで、姪が遊びに来た時にも自由に使うため、
・Touch ID設定なし
・パスコード設定なし
・二段階認証設定なし
のノーガード戦法にしたいけれども、Appleがこれらを設定するように仕向ける選択肢が出るので、それを回避する方法です。

iPadに詳しくない親に電話で聞き取りながらメモった内容なので、細かい違いがあるかもしれません。

#2. 選択肢

■こんにちは
  →続ける

■ソフトウェア・アップデート完了
  →続ける

■パスコード入力または購入時のApple IDパスワード入力の代わりに指紋認証を設定できます
  →Touch IDをあとで設定

■Touch IDを使用しなくてもよろしいですか
  →使用しない

■パスコード作成
  →パスコードオプション
  →パスコードを使用しない

■パスコードを使用することを強くお勧めします
  →パスコードを使用しない

■Apple IDセキュリティ(2ファクタ認証)
  →その他のオプション
  →アップグレードしない

■ようこそ iPadへ
  さあ、はじめよう

#3. iPadOS 15にアップグレードした時の選択肢

■こんにちは
→続ける

■ソフトウェア・アップデート完了
→続ける

■パスコード作成
→パスコードオプション
→パスコードを使用しない

■パスコードを使用することを強くお勧めします
→パスコードを使用しない

■iCloud Drive
→iCloud Driveをオフにする

■iCloud Driveにアップグレードしなくてもよろしいですか？
→続ける

■iPad解析
→共有しない

■ようこそ iPadへ
→さあ、はじめよう！

#4. おわりに

二段階認証はあったほうがよいか悩む今日この頃。iCloud Driveはアップグレードしたほうがよいのだろうか？
githubでパスワードアクセスできなくなったときの対処

#はじめに
2021/8/13よりgithub側の仕様変更でパスワードによるリポジトリへのアクセスができなくなり、トークンアクセスになったのでその対処をまとめる

##エラー
```
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
```

##対処
###１．個人アクセストークンの作成
[公式ドキュメント](https://docs.github.com/ja/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)に従い作成

###２．リポジトリの登録時に使用
```
git remote set-url origin https://[個人アクセストークン]@github.com/[リポジトリURLのhttps://github.com/以下]

例：　個人アクセストークンはダミー
git remote set-url origin https://ghp_123456789@github.com/y1255018/esp32-https-ota.git
```
Processing.orgのサイトが新しくなっていた

## Processing.org

Processing.orgがリニューアルしていた。

![ProcessingOfficialSiteScreenshot20210815.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35680/75a76122-0ffa-9194-2582-7b4851f43d57.jpeg)

加えて、バージョン4.0のベータがダウンロードできる。近々メジャーアップデートするということだ。その際の開発環境のアイコンも、サイトトップページの画像のようになるのでは。色々な変更が加わっているのが予想されてワクワクしてしまう。

Noteの記事[Processing 4 で変わること](https://note.com/soohei/n/n38b4b82055cb)、これは2020年1月時点、α版に関する記事だが、おそらく基本的にはこの通りの様子。オフィシャルサイトをざっと眺めたところ、バージョン４に関して特段目立った記載がないことから。この記事によれば、バージョン４は、バックグラウンドの更新ということらしい。基本的に32ビットOSのサポートを終了することが目的で、開発に使用したJavaのバージョンが８から１１に変更されたとのこと。一般のユーザにとっては、何も変わっていないように感じられるらしい。それは私にとって大変嬉しい。新しい言語、開発環境を学習し直す手間がないということだから。

ということで、早速ベータ版を使い始めてみよう。
RealSense D455(librealsense2)使ってみた -Depth画像取得-

# お詫び
:::note alert
記事が分散して見つけづらくなっていたので以下に移動しました．
ご了承ください :bow:
:::

https://zenn.dev/yosse95ai/books/6fea5a9a44dfaf/viewer/a6c8bc

シリーズをすべて一冊の本としてまとめたので，見やすくなりました．
PDFデータでしかない資料をExcelに変換


# やりたい事
現状の業務：
毎日社内ソフトに店舗からの日報が届き、
その日報をまとめる作業があります。
毎回PDFデータの日報を一つ一つ読み、必要な内容を一つ一つコピーして貼り付けていました。

ルーティーン業務で少しでも時間短縮のために改善したく、
PDFファイルでしか抽出できない資料をどうにか編集出来るようにしたいと思いました。

ウェブ上では簡単に変換できるサイトもありますが、
会社によって社内データで外部サイト使用不可の会社もあるかと思います。

そこで、Power Automate Desktopを使って
PDFファイルの資料をExcelに変換し簡単に編集できるように作ってみました。

#使用
- [PowerAutomateDesktop](https://flow.microsoft.com/ja-jp/desktop/)<br>
- [PDF]<br>
- [Excel]


#完成したフローと変換結果
・Power Automate Desktop内でのフロー
![Inked1_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1806084/dbc5f5fb-bf4c-b061-5e13-3faae95adbcc.jpeg)

・PDFからExcel変換結果
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1806084/3dbc5c9e-367d-bafb-672b-f9247dea3c61.png)


#Power Automate Desktop
##Step1
PDFアクションから【PDFからテキストを抽出】を選択、変換したいPDFファイルを選択。

##Step2
テキストアクションで【テキスト分割りを選択し、行ごとに文字列が区切られるために設定。
![５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1806084/1b24a9f4-ea51-5771-2505-bd3645696622.png)

##Step3
Excelアクションで【Excelの起動】を選択。
Excelに変換したいのでエクセルを自動的に起動させる作業になります。

##Step4
変数アクションから【変数の設定】を選択。
宛先に【１】を入力

##Step5
ループアクションの【For each】を選択し、これを設定する事によって
行ごとそれぞれのデータを反福処理してくれます。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1806084/5ce4343f-2957-42ab-b13a-39452639adcf.png)

##Step6
設定したー【For each】と【End】の間にExcelアクションの【Excelワークシートの書き込み】を選択。
選択したPDFで指定した形式をエクセルに書き込む指示の設定です。
![７.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1806084/84a0229a-b418-7514-f0c5-44c58fd748bd.png)

##Step7
変数アクションに戻り、【変数を大きくする】を選択し、大きくする数値に【１】を入力。

Excelアクションから【Excelの保存】を選択。保存したい場所を指定します。
以上でPower Automate Desktop内での作業が終了し、実行ボタンを押すと
上記の完成画像のようにExcelの新ファイルが自動に出てきます。

#最後には
Power Automate Desktopでは細々としたステップが必要だなと感じました。
単純な指示や作業であれば慣れると恐らく作業時間はそこまでかからない
のではないかと思います。
今回初体験で個人的にはExcelに少しでも綺麗な状態に変換したいと思ったので、
行ごとに反映する形式部分の理解に時間がかかりました。

業務改善の関連記事↓

https://qiita.com/yudiramaruyama/items/29610752e6db7d217cd8
取引先から送付されてくるドメイン更新完了報告(PDFデータ)の欲しい情報だけを自動抽出し、Excelに落とし込みたい！！

##取引先から送付されてくるPDFデータをExcelに落とし込む作業が面倒くさい！
私の部署では、グループ各社のドメインに関する情報(有効期限、費用など)をExcelデータで一元管理しております。
毎月、取引先から、ドメインの更新手続き完了報告がPDFデータで送付されてきて、弊社管理中のドメイン台帳(Excel)と照合し、有効期限をPDF記載の期限日に変更し、上書き保存をするという定型的かつ面倒くさい作業が発生しております。しかし、管理する上で非常に重要な業務です。
こんな仕組みがあったら便利、、、、、、毎月送付されるドメイン更新完了手続き(PDFデータ)が自動でExcelに落とし込みされる仕組みがあったら、便利かつ業務効率化に繋がると思い、PowerAutomateDesktopを活用し、業務課題解決に繋がる仕組みを制作致しました。

##【制作したもの】
・ドメイン更新手続き完了報告(PDF)をExcelデータへ自動変換
・PDF記載のドメイン情報だけをExcelへピックアップ

【PowerAutomateDesktopフロー】
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793863/cbcda6e3-8ed0-4bc0-344c-231e77b0612a.png)
【動画】
https://twitter.com/EgashiraYosuke/status/1427231245235146764

【抜き出したExcel】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793863/66bd9e27-e4f7-08c5-b2e7-fe1a7b992fbf.png)

【完成イメージ】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1793863/b102507b-74fb-0882-a967-6800574d8d9a.png)

##【まとめ】
今回は、PDFデータをExcelへ自動変換し、台帳と照合しやすい体制を構築しましたが、今後は、弊社管理台帳と照合、更新依頼のメール送付まで自動化できる仕組みを制作していきたいと思っております。PowerAutomateDesktopの機能性や仕組みを理解し、スキルをブラッシュアップして、業務効率化を追求していきたいと思います。

【今後解決したい課題】
https://twitter.com/EgashiraYosuke/status/1426554429050822657
Windows.hを使用したマルチスレッド（_beginthreadex()、CreateThread()）

#マルチスレッド(並行処理)
複数スレッド(メインと生成したスレッド)があたかも同時に処理を実行しているように見える処理のこと。
並列処理は実際に同時に処理を実行している。
複数スレッドを交互に処理するため、画面出力などを行う際は、条件分岐やフラグなど使用して行う。
それでもタイミングがズレる場合は、同期制御(join)を行う。(windows.hにはjoinの関数がない？ため、クリティカルセクションやミューテックスなどを使用する。それか自分で同期制御の処理を作る。)

#_beginthreadex()

```C:
int main(){
 int num1 = 30;

 HANDLE thread = _beginthreadex(NULL,0,func,NULL,0,NULL);

 while(num1 > 0){
  printf("num1 : %d\n",num1);
  num1--;
 }

 return 0;
}

static unsigned _stdcall func(){
 int num2 = 5;

 while(num2 > 0){
  printf("num2 : %d\n",num2);
  num2--;
 }

 _endthreadex(0);
}

```
_beginthreadex()は、実行後にスレッドが生成され、同時に実行する。

#CreateThread()、ResumeThread()(SuspendThread())

```C:
int main(){
 int num1 = 30;

 HANDLE thread = CreateThread(NULL,0,func,NULL,0,NULL);
 ResumeThread(thread);

 while(num1 > 0){
  printf("num1 : %d\n",num1);
  num1--;
 }

 return 0;
}

static int func(){
 int num2 = 5;

 while(num2 > 0){
  printf("num2 : %d\n",num2);
  num2--;
 }

 return 0;
}
```
CreateThread()でスレッドを生成する。ResumeThread()でサスペンドカウンタをデクリメントし0にすることで、スレッドを実行する。サスペンドカウンタはスレッドオブジェクトの待機と実行を制御するカウンタで、0の場合は実行し、1の場合は待機をする。SuspendThread()をインクリメントし0以外にすることで、スレッドは待機をするらしいが、実際に使わなかったのでどういう挙動をしてどういうときに使用するのかは謎。スレッドの終わりにスレッド終了の関数を使わなくても、returnすれば終了する。

_beginthreadex()との違いは、生成と実行が分かれているため扱いが少々面倒くさい。CreateThread()でハンドルに渡し、ResumeThread()で実行し、スレッドが終了した後に再びResumeThread()で実行するためにはもう一度CreateThread()で生成しなければならない（一回実行したら死ぬ）。
請求書内容をGoogleフォトを使ってテキスト化する方法

こんにちは

会社の業務で請求書処理を行っていますが、私の部署では請求書を処理した形跡を残すため、
Teamsの中にある既存フォーマットに請求内容・金額を記録しています。
紙ベースで請求書が届く為、毎回Teamsに転記する際は金額が間違ってないかなど
何度も見直し確認作業を実施していました。

今回は転記処理をミスなく楽に行うために、iPhoneのショートカットアプリ、Googleフォト機能を使って
請求書のテキスト内容を正確に抜き取る作業までを実施しました。

#作成ポイント
* 届いた請求書の請求者先、請求金額、請求内容をテキスト化する
* テキスト内容を会社メールアドレスに送付する
* 作成時間は2時間以内
* 第三者でも設定しやすく、誰でも使用できるようにする


#完成物
<iframe width="560" height="315" src="https://www.youtube.com/embed/PiaR_dIZhq8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

#使用したもの
* Googleフォト
* iPhoneのショートカットアプリ

#作成の流れ
**ショートカットアプリ設定内容**


まずはショートカットアプリに
①カメラを起動して写真を保存し、
②Googleフォトアプリを起動し先ほど撮った写真を使用できるように設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/56a56453-6c52-b338-e952-cacaba59bae5.png)

③ここからはGoogleフォトの機能に任せて、写真をテキスト化してもらい内容をコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/a5095b2b-61df-5956-9de2-6d5c399a60f6.png)

④もう一度ショートカットアプリを起動して
指定したメールアドレスに自動でペーストするように設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/07082df2-0dc9-5cb9-8482-ef4dfe91c0ac.png)

#感想
私が使用しているiPhoneの中にアプリがたくさんあるため、探す手間がなくなりました。
今後はメールで送付した内容をTeamsのフォーマットに自動転記できるまでを
チャレンジしてみたいと思います。

最後まで読んでいただきありがとうございました。
素人はkaggleで勝てない

# 執筆の経緯

夢をぶち壊すような記事でごめんなさい:cry:
初めてのkaggleに挑戦してみて色々と考えたことがありました。
初めてながらもデータサイエンスで成績を残すことがどのくらい難しいのかわかったので
ややポエムチックな記事ですがアウトプットしたいと思います。
メダルの難易度を知りたくて調べると出てくる
『初心者だけどメダル取れました』みたいな感じの記事を
真に受けてしまうひとがいないよう警鐘の意を込めたいという気持ちがあります。

kaggleなんてやるなって意味じゃありません、地道な努力を積み重ねて素人から中級者へ、
そこから上級への壁をぶち壊して__いつかは__メダル獲得をしたいねという話をするのが目的です。

ちなみに初参加のコンペはこちらです。
https://www.kaggle.com/c/commonlitreadabilityprize/overview

2066/3633という順位でまずは上位半分は目指せるように頑張りたいなという感じです。

# なぜ素人には勝てないのか

そもそもこのデータサイエンスの分野が広大な地図になっていることが原因です。
扱うデータで数値、自然言語、画像があり、
モデルをとってもGBDT、ランダムフォレスト、サポートベクターマシーン...etc
さらに特徴量抽出の方法を考えたりなんて多方向へ学習のエネルギーを向けないといけないので、
よっぽど時間がある人でないとコンペ期間で理解しきって自分なりの最強モデルを作成だなんて無理があります。

いくら勉強して他の方のコードなど参照しても全然霧が晴れないんですよ、
勉強してキャッチアップできた部分があったとしても霧が深まることもあります...
なんだか深い森に迷い込んでしまったような:ghost:

素人がkaggleに参入するとこんなもどかしさを味わうと思います。
おそらくこの霧が晴れないうちはメダル獲得なんて遠い話です。

# よくある素人でもメダルとれたよみたいな記事

上位者が公開しているノートブックがあるのでそういったものを見てディスカッションを深く理解すれば初参加でメダル獲得も夢じゃないみたいな話を見たことが何度かあったのでちゃんと勉強すれば私にも...って淡い期待を抱いていました。
そもそもそういう方のバックボーンを見ると元々データサイエンスを実務でやってはいて
kaggleに参入しての分析は初めてだっただけとかゴリゴリの理系数学マンだったとか
それなりに持つもの持っている方が多い印象です。(素人の皮被った上級者ですね笑)

まぁこれくらいだったらいいのですが、そういうの昔の記事が多くないですかね？
最近のkaggle事情を聞くと以前に増して複雑なデータを扱う機会が増えたと聞きます。
今は前処理が大変だったり、特徴量抽出をよく考えて工夫しないといけないとか、
より実践的なデータ分析を行わなければならないと聞いたことがあります。

逆に考えるとkaggle頑張ればより実務経験として認めて貰えるようになってきた？

素人でもメダル取れるとか、あまり背景知識なんてなくてもkaggleでアウトプットしてたらメダルとれちゃうぞなんて話は鵜のみしちゃいけないって思います。

# それなりの覚悟が必要

私は2年ほど緩く勉強してきた身だったので、
参入前はなんとなく真面目に数か月頑張ればメダルとれるっしょみたいな気持ちでした。
でも1か月頑張ってみて到底納得のいく成果が出せず完全に見くびっていたなという感じです。
私のような軽い気持ちで始めてしまうと心がポッキリ行きます、ポッキリと(笑)

ただ、メダルなんて遠いとしても、1か月前の自分と執筆中の自分は明らかにスキルが違うという自負があります。スコアを上げたいと思って試行錯誤をしたのは非常に濃密なアウトプットでした。
参考書とにらめっこして勉強してきた自分からは1皮2皮剥けましたね！

# それでも貴方はkaggleをやるのか

以上kaggleをやってテキトーにメダルとって転職できるっしょみたいな、
アメリカンドリームには期待できないぞという話でした。
今現在データサイエンスの分野は非常に注目され発展も目覚ましいので、
扱うデータはドンドン複雑化されコンペで求められる技能水準もガンガン高くなっています。

始めれば分かりますが、データサイエンティストとして成功するには非常に険しい道のりだと思います。学習も大変で、次々出てくる新しい技術にキャッチアップしていかなければなりません。エンジニアに求められている最新の技術の勉強という点が余計に必要な分野だと感じました。生涯学び続けるくらいの覚悟がないといけないのでしょうか...
中々大変ですね。

なかなか参入障壁の高い分野だとは思いますが、
堅実に努力を重ねてデキるデータサイエンティスト目指していきましょう！
基盤地図情報データをshapefileに変換して，QGISで表示する。

#はじめに
国土地理院が公開している[基盤地図情報](https://www.gsi.go.jp/kiban/index.html)のデータを，shapefile形式に変換して，QGISで表示してみようというものです。
地理情報や空間情報を扱う人ならご存じの方はそこそこ多いと思いますが，本稿はあくまでも筆者の私自身が忘れないように書き記すものですので，あしからず。
###基盤地図情報とは
基盤地図情報とは，地理空間情報活用推進基本法で規定され，国土交通省令として定められている整備項目である，道路や河川等の骨格的な地物の情報のことです。
基盤地図情報に含まれるデータは，国土交通省令として定められている基盤地図情報項目のうち
・測量の基準点
・海岸線
・行政区画の境界線及び代表点
・道路縁
・軌道の中心線
・標高点
・水涯線
・建築物の外周線
・市町村の町若しくは字の境界線及び代表点
・街区の境界線及び代表点
の１０項目です。また、参考情報として等高線などのその他のデータも含まれています。
地域によって整備方法や情報の精度が異なっていますが，主に5mメッシュ（標高）、10mメッシュ（標高）の2種類があります。
###基盤地図情報データのダウンロード
データは[国土地理院の基盤地図情報ダウンロードページ](https://fgd.gsi.go.jp/download/menu.php)からダウンロード出来ます。
上記サイトからダウンロードしたい情報を選び，ファイル選択をクリックしてダウンロードします。（ダウンロードファイルリストのページでは、何か理由が無い限り「全てチェック」をクリックして「まとめてダウンロード」しておくのが無難と思われます）

ダウンロードする際、地図データの他に「基盤地図情報ビューア」というソフトウェアもあると便利です。shapefileに変換する際にはこのソフトはマストアイテムとなります。
・[基盤地図情報ビューアをダウンロード](https://fgd.gsi.go.jp/download/documents.html)（リンク先の一番下にあります）
###ダウンロードデータについて
[国土地理院の基盤地図情報ダウンロードページ](https://fgd.gsi.go.jp/download/menu.php)からダウンロード出来るファイルは，基盤地図情報（公開用）応用スキーマによって定義された構造を持つデータを，「JIS X7136（地理マーク付け言語）」に基づいて，XMLの形式で符号化したデータファイルです。
すなわち，**一般的なGISソフトで扱われるファイル形式ではない**のです。
そのため，GISソフトにて扱いやすいファイル形式に変換しなければならないのです。（話に聞くところでは最新のバージョンのQGISでも読み込めますが，非常に使い勝手が悪いそうで。。。）

#データの変換方法
本題に入ります。
（本稿では，基盤地図情報のデータ：メッシュ番号533945番のものを例として使用します。）

###ダウンロードしたデータを表示する
ひとまず，ダウンロードした基盤地図情報データを基盤地図情報ビューアに表示させたものが下の画像です。
![スクリーンショット 2021-08-15 154000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1894919/84879545-be9d-913c-89d2-268f0d6338f5.png)
表示設定を何も操作していない状態なので，とても混沌としていますね。
文章の最初の方で述べている基盤地図情報の項目が全て表示されているので，このような表示になっています。
しかし率直に言うと基盤地図情報ビューアではほとんど情報は扱いませんので，表示する情報の取捨選択を行います。
![スクリーンショット 2021-08-15 181016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1894919/fad57269-0440-2ec5-d7f6-32bb381cb2d7.png)
左上の「設定」→「表示設定」から，最低限のものだけを表示させます。（これは強制ではありませんが，おおかたのスペックのPCでは大量のデータを読み込むのに時間がかかると思いますので，なるべく情報量は少ないほうがよいでしょう）
行政区画と水域にさえチェックしておけば，どこが表示されているかは分かると思います。
![スクリーンショット 2021-08-15 181933.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1894919/f5512e8f-69c5-5cf1-c190-15767ef96977.png)
###データの変換
左上にある，「エクスポート」で変換種別を選択し，変換するデータを選択します。
任意のフォルダを選択すると，そこに変換されたファイルがあらわれます。
![スクリーンショット 2021-08-15 182307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1894919/d613e967-539b-4768-f6be-fe62ac3c3bfc.png)
この表示が出たら，変換は正常に終了したということです。
![スクリーンショット 2021-08-15 182907.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1894919/87acaba6-2994-27db-9479-960cdc1dc1a1.png)

#変換したデータをQGISにて表示
QGISが扱える方なら，あとはもう流れ作業です。
いつもどおりshapefileをレイヤに追加し，シンボロジから任意の色や形にしてください。
![スクリーンショット 2021-08-15 183727.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1894919/b7f9ce3c-4c9d-95d9-1bc9-cfaa859ad406.png)
![スクリーンショット 2021-08-15 183820.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1894919/da6e93fe-e88c-2aa1-6b9a-82d2db63b46a.png)（出典：基盤地図情報；薄色地理院タイル）

さすが新宿，圧倒的な情報量ですね......笑
#おわりに
以上がデータの変換作業の流れです。QGISで基盤地図情報を扱う機会はわりかし多いので，今後も活用していけたらと思います。
シェルスクリプトの [ -a (AND) と -o (OR) ] は非推奨だかんね

特に詳しく説明することもないですが `[ ]` (`test`) で使える演算子の `-a` (AND) と `-o` (OR) は POSIX では非推奨（廃止とマーク）となっているので移植性を重視する場合は使わないようにしましょう。`[ 条件1 -a 条件2 ]` の代わりに `[ 条件1 ] && [ 条件2 ]`、`[ 条件1 -o 条件2 ]` の代わりに `[ 条件1 ] || [ 条件2 ]` と書けば十分です。

`-a` と `-o` が不要ということは `( )` があってもしょうがないのでこちらも廃止されます。複雑な条件式は避けた方が良いと思いますが、優先順位を指定したいのであれば `[ 条件1 ] && { [ 条件2 ] || [ 条件3 ]; }` のように `{ }` を使用します。`( ) `を使って `[ 条件1 ] && ( [ 条件2 ] || [ 条件3 ] )` と書いても動きますがサブシェルが生成され遅くなるので避けたほうが良いです。

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html

> expression1 -a  expression2
> [OB XSI] True if both expression1 and expression2 are true; otherwise, false. The -a binary primary is left associative. It has a higher precedence than -o.
> 
> expression1 -o  expression2
> [OB XSI] True if either expression1 or expression2 is true; otherwise, false. The -o binary primary is left associative.
>
> (  expression  )
> [OB XSI] True if expression is true. False if expression is false. The parentheses can be used to alter the normal precedence and associativity.

[[OB - Obsolescent](https://pubs.opengroup.org/onlinepubs/9699919799/help/codes.html#OB
)]
> The functionality described may be removed in a future version of this volume of POSIX.1-2017. Strictly Conforming POSIX Applications and Strictly Conforming XSI Applications shall not use obsolescent features.
> 
> Where applicable, the material is identified by use of the OB margin legend.

このように POSIX 曰く「将来削除される可能性があるからPOSIX に準拠するなら使ってはならない」とのことです（とは言え各シェルは互換性を保つために残すはずなので直ちに影響がでるとは思いませんが）。[Issue 6](https://pubs.opengroup.org/onlinepubs/007904875/utilities/test.html) の頃は XSI 拡張オプション扱いだったのですが [Issue 7](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html) では廃止とマークされ、次の Issue 8 では見事に削除されます。廃止の理由は複雑な式だと曖昧で動作が信用ならないからとかかんとか。詳しくは POSIX を参照してください。

**2021-09-10 追記** `-a` を使用した場合の具体的な違いを見つけたので追記します。

```sh
# Ubuntu 18.04
dash -c '[ ! "" -a "" ]' # $? = 1
bash -c '[ ! "" -a "" ]' # $? = 0
mksh -c '[ ! "" -a "" ]' # $? = 0
ksh -c  '[ ! "" -a "" ]' # $? = 1
posh -c '[ ! "" -a "" ]' # $? = 1
yash -c '[ ! "" -a "" ]' # $? = 0
zsh -c  '[ ! "" -a "" ]' # $? = 0
busybox ash -c '[ ! "" -a "" ]' # $? = 1
/usr/bin/[ ! "" -a "" ] # $? = 0

# FreeBSD 13.0
sh -c  '[ ! "" -a "" ]' # $? = 1 
ksh -c '[ ! "" -a "" ]' # $? = 1 

# Solaris 10
sh -c  '[ ! "" -a "" ]' # $? = 1  (Bourne シェル）
ksh -c '[ ! "" -a "" ]' # $? = 1 （ksh88）
```

`[ "" -a "" ]` の　`$?` はどのシェルでも `1`（偽）です。`-a` の優先度が `! ""` よりも高い場合は `[ ! "" -a "" ]` は `0`（真）になります。`! ""` の方が優先度が高い場合は `1`（偽）となります。

```sh
bash -c '[ ! \( 1 = 1 \) -a "" ]' # $? = 1
bash -c '[ ! \( 1 = 2 \) -a "" ]' # $? = 1
bash -c '[ ! "" -a \( 1 = 1 \) ]' # $? = 0
bash -c '[ ! "" -a \( 1 = 2 \) ]' # $? = 1
```
JavaScriptで時計表示

### リアルタイムで動く時計表示

```html
<!DOCTYPE html>
<html>
<head>
<title>サンプル</title>
<script>
window.onload = function() {
  setInterval(function() {
    var dd = new Date();
    document.getElementById("T1").innerHTML = dd.toLocaleString();
  }, 1000);
}
</script>
</head>
<body>
<div id="T1"></div>
</body>
</html>
```
【PowerBI】図形の書式設定がパワポに近づいた【2021/08アップデート】

# はじめに
2021年8月のPower BIのアップデート（[Microsoft Power BI Blog](https://powerbi.microsoft.com/en-us/blog/power-bi-august-2021-feature-summary/#post-16859-_Toc79419583 )）を見ると、個人的にうれしい機能更新があったので、メモ。
図形の種類や書式設定が大幅に増えました。

# できるようになったこと
- **シェイプの種類追加**

山形の矢印が追加されていたのがうれしかった。
山の高さも変更可能。（[シェイプ]→[角度]）
各角度は、こんな感じです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087193/722d4d8f-0213-5f9f-2a5c-a167f9d82137.png" width="180">

- **図形とテキストの回転**
図形の回転はこれまでもできた（はず）のですが、図形とテキストの回転角度をそれぞれ設定することが可能に。
テキストの縦書きはできないですが、テキストの余白も設定できたので、試しに左右余白を調整したらいい感じに。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087193/d6941a78-568c-5aea-df2a-a8aa535e8fd7.png" width="60">

- **図形のフィルの色の動的変更**
図形の色が値によって変更することが可能になりました。
必要に合わせてテキスト色の動的変更も合わせると、例えばこんなことが可能に。
案件の現在のフェーズを持つデータがあったとして、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087193/83baaade-214d-8c40-e499-fb950a9f421d.png" width="220">
それぞれの案件の現在フェーズに従って、各矢印のフィルの色を変えることができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087193/83527133-e0e8-baca-5e44-8060f282ed63.png" width="350"><a> </a><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087193/6e930eef-22b8-a06b-d0fb-ec4c91dba3c3.png" width="350"><a> </a><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087193/ce8e9b19-2760-19d0-48e6-9309f729bdf4.png" width="350">

# 終わりに
顧客に「PowerPointやExcelで作っている報告資料をPowerBIで作れるようにしたい」と言われることがありますが、できることがかなり近づいてきたと思います。
これからも期待。
static変数(静的変数)を使ったときの動作を確認してみるMQL5

###静的変数とは
```.cpp
static int count = 0;
```
　通常の変数の宣言に__static修飾子__を加えるとその変数を静的変数として用意することができます。動的変数は変数宣言のタイミングでメモリを確保するのに対して、静的変数はプログラム実行時に一度だけメモリを確保され、変数の初期化も最初の一度だけです。

||静的変数|動的変数|
|:-:|:-:|:-:|
初期化のタイミング|プログラム実行時|変数宣言時|
###EAのOnTick関数内で動作の違いを確認してみる
```.cpp
void OnTick()
  {
   static int count1 = 0; //静的変数
   
          int count2 = 0; //動的変数
   
   count1++;
   
   count2++;
   
   Print("静的変数 count1 = ",count1," , 動的変数 count2 = ",count2);
  }
```
　1ティックごとに静的変数の__count1__と動的変数の__count2__をそれぞれ値を1づつプラスしていき、二つの変数の中身がどう違うのか、実際に動作させて確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1882169/5b9e0af2-2296-ab5f-1634-f7cc7d5903eb.png)
　Print関数で変数の中身を確認すると静的変数は1ティックごとに値が1ずつ増えているのに対して、動的変数は毎ティック変数の値が0に初期化さてるため、__count2++;__の処理をしても出力される値はずっと1のままです。

###static変数を使ってローソク足の終値が確定したことを調べる
　static変数が毎回初期化されないことを活かし「ローソク足の終値確定」を調べます。新しいローソク足のティックボリュームは0から始まるため、最新足のティックボリュームとstatic変数との比較をして、そのタイミングを見つけるようにしてみました。

```.cpp
void OnTick()
  {
   static int TickVolume = 0;
   
   if( TickVolume > iTickVolume(_Symbol,PERIOD_CURRENT,0) ) Print("終値が確定しました");
   
   TickVolume = iTickVolume(_Symbol,PERIOD_CURRENT,0);
  }
```
　動作確認↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1882169/680152e3-6d07-0975-36ea-5d9058bf5da3.png)
※実行タイムフレームは1時間足で動作させています。

 このように毎回初期化されないことを利用して__終値の確定__を知らせることが可能です。
Linux で複数ディスクの空き領域を連結して一つのドライブを作るメモ

## 背景

chia で, 複数 HDD を扱っているが 1 ドライブあたり 98 GB とか余りが出てもったいない... 8 個 HDD あれば 7 plots くらい作れるのに...

## 活用

ファイルを作り(e.g. fallocate), それをループバックデバイスとすることでファイルに対してドライブを割り当てるができました.

https://qiita.com/hana_shin/items/90b3c6fb54b59ebba076

ありがとうございます.

### 複数まとめる

mdadm(software raid) で行けました.

https://stackoverflow.com/questions/4519761/programming-a-loopback-device-consisting-of-several-files-in-linux

## 問題点

root 権限が必要です. 

特定の HDD が故障して入れ替えとなると破綻します.
mdadm で RAID-5 など作る手もあるかも...?

## ネットワーク越しに扱う

NBD + libfuse で行けそう...?

libnbd + FUSE = nbdfuse
https://rwmj.wordpress.com/2019/10/12/libnbd-fuse-nbdfuse/

## TODO

* [ ] Userspace で耐障害性のあるやりかたが別途あるか調べる.
スクロールアニメーションを実装する

## はじめに

以前、Intersection Observerを使った処理について学んだので、

せっかくなら、これを使って既存のサイトのアニメーションを再現してみようと思います。

お手本とするのは、こちらのサイトです。
[IN SOMEWHERE NIGHTS - Charlotte is Mine](http://charlotteismine.com/special/in-somewhere-nights/)

様々なモーションが施されている本サイトですが、

今回は中でも黒いラベルがスライドしていくアニメーションを模倣したいと思います。

実装するにあたって、参考サイトのソースコードは見ていません。

自分でロジックを考え、実装する力を鍛える事が目的です。

## コード
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="QWvPqKp" data-user="sasha_pen" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/sasha_pen/pen/QWvPqKp">
  ラベルアニメーション</a> by sasha (<a href="https://codepen.io/sasha_pen">@sasha_pen</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
 *qiita上で見ると画像が表示されていませんが、
 Codepenに飛んで頂くと、正常に画像も表示されると思います。

## 処理の流れ
js側でやることはシンプルで、intersection observerを使い、対象要素にクラスを付与しているだけです。

ロジックとしては、表示領域に入ったら、まずlabelにクラスを付与して、スライドするアニメーションを起こし、次にテキストや画像などのコンテンツをsetTimeoutで時間差で発火させています。

初めはsetTimeOutとtransitionだけでアニメーションを作っていたのですが、滑らかに行かなかったので、代わりにanimtationを使用しました。

画像のサイズがMBを超えるような重いものだと、表示にラグがあったので、使用する画像のサイズには注意が必要です。


##最後に
世にある既存のサイトのアニメーションを自分で実装してみるというのは、力試しになりますね。

##参考
- [IN SOMEWHERE NIGHTS - Charlotte is Mine](http://charlotteismine.com/special/in-somewhere-nights/)
- [特定のHTML要素の子要素、親要素、前後の要素を取得する
](https://gray-code.com/javascript/get-child-element-and-paranet-element-and-previous-element-and-next-element-of-specific-html-element/)
Macでシェルを実行するとbash/rとエラーが出るとき

install.sh を実行すると bash/r とエラーが出ました。原因は改行コードです。WindowsからMacに持ってきたのが原因なのでしょう。

## 解決方法：ファイルの改行を変換
```bash
sed $'s/\r$//' ./install.sh > ./install2.sh
```

## 現在 bash か zsh かを調べる方法
```bash
echo $SHELL

/bin/bash or /bin/zsh
```

## bash と zsh を変える方法（要ターミナル再起動）
```bash
chsh -s /bin/bash 
 or
chsh -s /bin/zsh 
```
## あとがき
私は全く別の場所を調べて数時間無駄にしました。この記事で解決できた人がいれば幸いです。
Vueでお絵かきアプリ作成1(canvas使用)

#趣向
vueでお絵かき機能を作成する機会があったため作ってみました！
![スクリーンショット 2021-08-15 17.37.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843952/9ffc5175-6583-9e15-6d03-252324b66008.png)

[2はこちら](https://qiita.com/ryotaro_tech/items/4fb9b4d57d966a63092c)
[3はこちら](https://qiita.com/ryotaro_tech/items/3726db3213d4932c76c1)
[4はこちら](https://qiita.com/ryotaro_tech/items/7e3c32dccb09c987920b)

#はじめに
このページではお絵描きできるCanvasの実装まで行います。


今回は簡単にCDNを読み込んで作成していきたいと思います。

```HAML:html
<!-- vue -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
```


まずはvueの作成。
widthとheight　で枠の大きさ、lineWidthでペンの太さ。strokeStyleでペンの色を決めることができます。

```JavaScript:JavaScript
new Vue({
  el: '#app',
  data() {
    return {
      weightNum: 5,
      canvas: null,
      color: "black",
      context: null,
    }
  },
  mounted () {
    // カンバス作成
    this.canvas = document.querySelector('#myCanvas')
    this.context = this.canvas.getContext('2d')
    this.context.lineCap = 'round'
    this.context.lineCap = 'round'
    this.canvas.width = 700
    this.canvas.height = 600
    this.context.lineWidth = this.weightNum
    this.context.strokeStyle = this.color
  },
});
```


次にhtml。canvasを作成し、マウスを動かした時の処理を書いていきます。

```HAML:html
<div id="app">
    <main>
        <div>
            <canvas id="myCanvas" ref="myCanvas" style="border:1px solid #aaa" @mousedown="dragStart"  @mouseup="dragEnd" @mouseout="dragEnd" @mousemove="draw"></canvas>
        </div>
    </main>
</div>
```

このままではエラーになってしまうのでマウスを動かした時の処理をvueにも追加

```JavaScript:JavaScript
  methods: {
    // 描画
    draw :function(e) {
      let x = e.layerX
      let y = e.layerY
      if(!this.isDrag) return;
      this.context.lineTo(x, y);
      this.context.stroke();
    },
    // 描画開始（mousedown）
    dragStart:function(e) {
      let x = e.layerX
      let y = e.layerY
      this.context.beginPath();
      this.context.lineTo(x, y);
      this.context.stroke();
      this.isDrag = true;
      this.context.getImageData(0, 0, this.canvas.width, this.canvas.height)

    },
    // 描画終了（mouseup, mouseout）
    dragEnd: function() {
      this.context.closePath();
      this.isDrag = false;
    }
}
```

とりあえずこれでかけるようになったと思います。
次回はペン機能と消しゴム機能をわけ。ペンの太さと色を変更できるようにしたいと思います。
![スクリーンショット 2021-08-15 18.01.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843952/6619f683-f0ea-3746-9cbd-1f3f7d4eda43.png)

[次回の2はこちら](https://qiita.com/ryotaro_tech/items/4fb9b4d57d966a63092c)