OmniAICreator/Qiita-1.07M huggingface dataset:
ITパスポート復習

### テクノロジー系

**ネットワーク**
WAN：電気通信事業者が設置した通信回線を使用
LAN：使用しない
デフォルトゲートウェイ：他のネーとワークへの出入口の役割を担っている機器（ルータ）
`ESSID`：無線LANのネットワークを識別する文字列
SMTP：電子メールを送信する為のプロトコル
POP：電子メールを受信する為のプロトコル
MACアドレス：ネットワーク機器ごとに割り当てられる固有の宛先
DNS：ドメイン名とIPアドレスを対応させる仕組み（変換する仕組み）
IPv6：126ビット　IPアドレスの不足回避（IPv4 32ビット）
NAT：プライベートIPアドレス、グローバルIPアドレスを相互変換する技術
DHCP：IPアドレスを自動的に取得する
RSS：１つのページで複数のWebサイトの更新情報を一覧表示できるようになる
cookie：Webサーバーからの情報を一時的に保存する、例：２回目以降のログインパスワードを省略
MVNO：他社の無線通信インフラを借り受け、通信サービスを行う事業者
`LPWA`：省電力で広範囲の無線通信。BLEよりも通信距離が長く、LTEよりも消費電力が低い
エッジコンピューティング：loT機器の近くにサーバーを設置することで応答速度を高める技術

**情報セキュリティ**
マルウェア：悪意あるソフトウェアの総称　
リスクマネジメント：４つのプロセス
　　　　　　　　　　リスク特定 → リスク分析 → リスク評価 → リスク対応（対策）
　　　　　　　　　　４つの対応事例が問われる
`ISMS`：機密性、完全性、可用性の３つをバランスよく維持、改善する為の仕組み
　　　　ISMSにおけるPSCA 　
　　　　Plan：確立（計画）、Do：導入、運用（実行）、Check：監視、レビュー（点検）、　　Act：維持、改善（処置）
　　　　機密性：認められた人だけが情報にアクセスできること
　　　　完全性：改善されていないデータ
　　　　可用性：必要なときにサービスを利用できること　　
情報セキュリティポリシ：組織の取り組み、対策をまとめた文書（社内ルール）
　　1.情報セキュリティ基本方針
　　2.情報セキュリティ対策基準（何をするのか）
　サイバーセキュリティ基本法とは違う（法律）
[Windows/Linux] コマンドラインでBASE64を使う

BASE64にEncodeすることで、バイナリを可読テキストで表現できる。

# Windows
コマンド

```
certutil -encode src.txt b64.txt
certutil -decode b64.txt b64_dec.txt
```

サンプル

```
 type src.txt
 テスト

 certutil -encode src.txt b64.txt

 type b64.txt
 -----BEGIN CERTIFICATE-----
 g2WDWINnIA0K
 -----END CERTIFICATE-----

 certutil -decode b64.txt b64_dec.txt

 type b64_dec.txt
 テスト
```

# Linux
コマンド

```
cat src.txt | base64 > b64.txt
cat b64.txt | base64 -d > b64_dec.txt
```

サンプル

```
echo "test" | base64
dGVzdA==

echo "dGVzdA==" | base64 -b
test
```
Minicondaで機械学習用の環境"再"構築（Windows版）

## はじめに
1年ほど前に機械学習のために使い始めて以来、何もわからないままにインストールを重ねてきたPython環境ですが、あまりに混沌としているためここらで再構築しようかと思います。

### 想定する読者
- Pythonはある程度使える
- 機械学習、データサイエンスをメインに利用する
- 複数の環境を使い分けたい


### Minicondaとは

> Miniconda is a free minimal installer for conda. It is a small, bootstrap version of Anaconda that includes only conda, Python, the packages they depend on, and a small number of other useful packages, including pip, zlib and a few others. Use the conda install command to install 720+ additional conda packages from the Anaconda repository. 
([Miniconda](https://docs.conda.io/en/latest/miniconda.html)より)

Anacondaの軽量版です。最初から大量のパッケージがインストールされているAnacondaより軽く、ストレージ占有も小さくて済むということですね。
__いちいちパッケージをインストールするのがめんどくさいという方にはAnacondaをおすすめします。__

#### (※注) Anaconda以外のパッケージ管理ツールについて
Pythonのパッケージ管理ツールは他にもありますが（Pipenv/venv等）、
ここではAnaconda（Miniconda）のメリット、デメリットのみ紹介します。

__Anacondaのメリット__
機械学習、データサイエンス系のライブラリに強い（インストールが簡単、高性能)
仮想環境が簡単に作れる

__Anacondaのデメリット__
パッケージの種類が少ない
osの機能が一部使えなくなる場合がある

参考
https://qiita.com/KRiver1/items/c1788e616b77a9bad4dd

## いざ、環境構築
### 元の環境をクリア

#### 再構築前の環境
- Python3.7（[Python.org](https://www.python.org/)からダウンロード）
- Anaconda

削除する際の記録を取っておかなかったので、参考にさせていただいたリンクを張ります。
#### Python（Python.orgの方）のアンインストール
https://gammasoft.jp/support/uninstall-python-completely-on-windows/


#### Anacondaのアンインストール
https://insilico-notebook.com/conda-uninstall/
（※注）上の（2）の方法でクリアを行いましたが、なぜかAnaconda自体のアンインストールはできていなかったので（1）の方法でやり直しました。

### Minicondaをインストール
- [1] [Miniconda](https://docs.conda.io/en/latest/miniconda.html)インストーラーをダウンロード

- [2] インストーラーを実行

（注意1）基本的には__Just Me__でインストールした方がいいと思います。（システム環境をクリーンに保つため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605135/feb3bab0-f76a-726a-d373-e2bb0d38b294.png)

（注意2）__Add Miniconda3 to my PATH environment variable__にチェックすると、関連するアプリのPATHが追加されます。後で環境変数を設定するのが面倒な場合はチェックしましょう。（公式では非推奨になってます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605135/86250f87-23e3-e8eb-ee9b-654a0c6eb2ef.png)

- [3] PATHが通っているか確認

__conda__コマンドが認識されれば成功
![cmd.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605135/3d903d69-cda1-7310-bb2b-a659e0f0d4ae.jpeg)


## Miniconda実行環境の管理方針
仮想環境についてはこちらをどうぞ
https://qiita.com/yakisobamilk/items/867dce8e53824146ce05

- __base環境は使用しない__

環境が壊れた時に厄介になります。

- __代わりにデフォルト用の仮想環境を用意する__

とりあえずPython動かしたい時のためにデフォルト用の仮想環境を用意しておき、base環境の代わりに利用します。

- __プロジェクトごとに仮想環境を作成__

この辺りは一緒ですね。

__基本的には仮想環境で運用し、環境が壊れるようなことがあれば仮想環境を削除する方針で整備します。__

## 最後に
Anacondaを使うことには賛否両論ありますが、いろいろ使ってみた結果一番自分に合ってるように感じています。
よいMinicondaライフを！！:snake:
新入社員研修では教わらないけどSEなら身に付けたいITスキル

#はじめに
この記事はこれからSEになる人・新人SE向けに書いています。
私がIT企業に入社して教わらなかったけど、必要だと感じたものをまとめました。
別に他業種の人や学生でも知っておいて損はないです。

あくまで主観ですし、エンジニアから見たら当たり前かもしれません。
取捨選択して必要な項目だけ見てください。

#タッチタイピング
キー入力は速ければ速いほどいい。日々意識すればすぐに上達します。
業務内容によっては記号や英語入力も必要。
[**このサイト**](https://www.e-typing.ne.jp/)のようなタイピングゲームで練習するのがいいと思います。

#ショートカットキー
ショートカットは高頻度で使うものから覚えていけばいいと思います。
OS関連、メーラー、ブラウザ、Office系、エディタなど、キリがない沼。

まずはコピーや保存など、どのアプリでも共通のものを最低限覚えましょう。
[**【Windows&Mac】基本の必須キーボードショートカット集**](https://qiita.com/kinchiki/items/8fe7b0792a841cf98e34)

#マクロ（VBA）
Officeで使えるVBAという言語で、色々な操作を自動化できます。
特にExcelのマクロを指して言う。Officeがあれば使えるのが最大のメリット。
軽くソースが読める程度でも知っていると便利。

ゼロから最低限だけ知りたい人はこのサイトがおすすめ
[**【ExcelVBA入門】VBAの基礎知識・書き方・おすすめの学習方法を解説**](https://www.sejuku.net/blog/73163)

#コマンドプロンプト・Unixコマンド
キーボードによる操作（CUI）が必要となる場面がけっこうあります。
Windowsならコマンドプロンプトのコマンド(またはPowerShell)、
サーバー周りならUnixコマンドで操作します。
使わない人は全く使わないかもしれません。

・[**コマンドプロンプトの使い方とコマンド一覧｜Windows10の機能強化で注目！**](https://www.modis.jp/staffing/insight/column_28/)
・[**これだけは覚えておきたい！基本的なUNIXコマンド20【初心者向け】**](https://techacademy.jp/magazine/6406)


#バッチファイル
知らず知らずのうちにWindowsで使っているbat形式のファイル。
コマンドプロンプト上で動作し、書いておいた命令を一度に実行できます。
ファイル操作の自動化や定期的な処理の実行で使われています。
Unixではシェルスクリプトに相当します。

以下、二つの記事を読めばなんとなく理解できるかと思います。
・[**必要に迫られてバッチファイルを組むことになった人向けのTips**](https://qiita.com/plcherrim/items/4703a9743777d4ea30de)
・[**【bat】Windowsのバッチファイル(*.bat)の書き方自分用まとめ**](https://qiita.com/sksmnagisa/items/8c4c1788af44cc1dc63a)

より詳しく知りたい人はこちら
[**バッチファイル作成のための参考になりそうなリンク集など**](https://qiita.com/QutaPase/items/53cae297ca10de2a371f)

#その他
以下はだいたいの人が勉強させられると思われるものです。
参考程度にどうぞ。

- **基本情報技術者試験**
- **SQL**（データベースの操作）
- **プログラミング**（以下よく使われる言語）
    - Java（アプリケーション開発の多くで採用）
    - Python（データサイエンス・機械学習ならこれ）
    - C言語、またはC++（実行速度が重要な場合・学校で教わる？） 
- **Web系**
    - HTML（ホームページ作成用の言語・ベース部分）
    - CSS（デザインを定義）
    - JavaScript（ホームページの動的処理）
Raspberrypi3B+にJenkinsをインストール

# インストール

[wiki.jenkins.io](https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins+on+Ubuntu)のInstallationを参照する。

```
wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
```

# 確認

その後、webブラウザから、localhost:8080 にアクセスしてJenkinsのWebUIが表示されればOK.

Unlock Jenkinsは以下のパスワードを貼り付けて解決

```
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
```

# jenkins[17325]: ERROR: No Java executable found in current PATH

javaがないためエラー

```
$ sudo apt-get install jenkins
...
jenkins[17325]: ERROR: No Java executable found in current PATH
```

javaをインストールして解決

```
sudo apt-get install openjdk-8-jdk openjdk-8-jre
```

# E: Sub-process /usr/bin/dpkg returned an error code (1)

以下のエラーが出た

```
処理中にエラーが発生しました:
 jenkins
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

原因を確認

```
$ sudo dpkg --audit
以下のパッケージは最初の設定中に問題が発生したため、設定が終了していません。
dpkg --configure <パッケージ> か dselect で設定 (configure) メニューオプショ
ンを使って設定作業を再試行しなければなりません:
 jenkins              Jenkins is an open source automation server which enables
```

再configure

```
sudo rm /var/lib/dpkg/info/jenkins.postinst 
pi@raspberrypi:/var/www/html $ sudo rm /var/lib/dpkg/info/jenkins.postrm
pi@raspberrypi:/var/www/html $ sudo rm /var/lib/dpkg/info/jenkins.prerm
sudo dpkg --configure jenkins
```

以下を実行して解決

```
$ sudo dpkg --configure jenkins
jenkins (2.222.3) を設定しています ...
```

# 参考
[wiki.jenkins.io](https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins+on+Ubuntu)
[UbuntuにJenkinsをインストールする](https://qiita.com/yoshi3/items/862e6d771cdea5ddf7f5)
[Raspberry PiにJenkinsをインストールしてブラウザ接続まで](https://qiita.com/bleru/items/24d0f16c990b445c2457)
[RaspberryPiにJenkinsを入れて高級なcronの代わりに使う](https://qiita.com/_takeuchi_/items/9be897ddfe73854ba578)
[Jenkinsをdocker上に構築](https://qiita.com/legitwhiz/items/e6ac1f5a94f09ff2bb1d)
[(当たり前のことだけど) Jenkins を入れる前に Java を入れよう](http://sheeprogramming.iku4.com/Entry/253/)
[dpkgやapt-get関連でエラーが出た時の対処法](https://qiita.com/yukari-n/items/d1b17bd37036f120153c)
PHP　簡単なフォームの作成

#フォームの作成
今回は簡単な入力フォームを作ります。１ページのみを使用して入力→確認→完了と行いたいと思います。まずはPHPファイルにHTMLを記述します。

```php:index.php
<!DOCTYPE html>
<meta charset="utf-8">
<head></head>
<body>

<form method="POST" action="index.php">
名前
<input type="text" name="your_name">
<br>
メールアドレス
<input type="email" name="email">
<input type="submit" name="btn_confirm" value="送信する">

</form>
</body>
</html>
```
これでHTMLのみのフォームが出来たかと思います。次に表示の切り替えを行うためにphpを記述します。`<!DOCTYPE html>`の上に変数を定義したいと思います。

```php:index.php
<?php
$setPage = 0;
?>
<!DOCTYPE html>
<meta charset="utf-8">
<head></head>
<body>

〜以下略〜
```
`<body>`の中にもphpを記述します。

```php:index.php
<body>

<?php if($setPage === 0) : ?>　//入力画面
入力
<?php endif; ?>

<?php if($setPage === 1) : ?>　//確認画面
確認
<?php endif; ?>

<?php if($setPage === 2) : ?>　//完了画面
完了
<?php endif; ?>
〜以下略〜
```
表示の切り替えを変数によって行います。まずは`$setPage = 0;`の時の表示です。

```php:index.php
<?php if($setPage === 0) : ?>　//入力画面
<form method="POST" action="input.php">
名前
<input type="text" name="your_name" >
<br>
メールアドレス
<input type="email" name="email" >
<input type="submit" name="btn_confirm" value="確認する">
</form>
<?php endif; ?>
〜以下略〜
```

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


`$setPage = 0;`の時に表示する入力画面が出来ました。次に`$setPage = 1;`の処理を記述します。



```php:index.php

<?php

$setPage = 0;

if(!empty($_POST['btn_confirm'])) {
  $setPage = 1;
}

?>
<!DOCTYPE html>
〜以下略〜
```
`if(!empty(~`でPOSTの中身が空でなければ`$setPage = 1;`を表示するというふうに記述します。

```php:index.php

<?php if($setPage === 1) : ?>

<form method="POST" action="input.php">
名前
<?PHP echo $_POST['your_name'] ; ?>
<br>
メールアドレス
<?PHP echo $_POST['email'] ; ?>
<input type="submit" name="btn_submit" value="送信する">

</form>
<?php endif; ?>

〜以下略〜
```
`$setPage = 1;`の場合では、`$setPage = 0;`で入力された値を$_POST(スーパーグローバル変数)で表示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/76ad28f3-e6e5-dfb3-d1a3-7a4042c96d87.png)

このような画面になるかと思います。最後に完了画面の表示を行います。

```php:index.php

<?php

$setPage = 0;

if(!empty($_POST['btn_confirm'])) {
  $setPage = 1;
}

if(!empty($_POST['btn_submit'])) {
  $setPage = 2;
}
?>
〜以下略〜
```
こちらも`if(!empty(~`で値が空でなければ`$setPage = 2;`を表示するという処理を記述します。次に`<body>`の中も記述します。


```php:index.php

<?php if($setPage === 2) : ?>
送信が完了しました。
<?php endif; ?>
〜以下略〜
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629307/67d21779-65f2-324c-697c-31b01b23cbb6.png)
このように表示されたかと思います。今回は1つのページで表示を変えるというやり方を行いましたが、別のやり方もあると思いますので、参考程度に利用して頂けたらと思います。なお、スーパーグローバル変数($_POST)など説明していませんが、公式サイト（https://www.php.net/manual/ja/reserved.variables.post.php )を確認していただく方が分かりやすいと思うので今回は割愛します。

#最後に
説明などだいぶ端折っているところがありますので、分かりにくい部分もあるかと思います。質問や、ご意見、ご指摘等ありましたらどんどんお願いします！！
Mathpix Snip Notesで手書きの文章をLatex化してみると？

## Mathpix Snip Notesで簡単にLatex文章を作成できないか

昔の直筆ノートなどがかさばって大変！Latexの文章化すれば保存場所はとらないしアップデートもしやすいけど、さすがに時間がかかる。というモチベーションでMathpix Snip Notesを試してみました。

## さっそくインストール
ダウンロードは以下のサイトからできます。
個人で使用する分には無料のようです。
https://mathpix.com/


## 試してみましょう。

今回は以下の直筆ノートをスキャンして、Latex形式にしてみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/0b607f7b-d0f4-86dd-3524-893b76c3254d.png)


Mathpix Accountsのページの右上のGo to Snip Notesを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/fc07c3ce-454d-bc83-3fa4-ee3f23444d5c.png)

そしてスキャンした画像をshift+windows+Sでキャプチャして左側の灰色の部分に貼り付けてみました。

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/ee0cf5c1-5a7b-7285-8817-226b5fa9c832.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/45fe1ec8-9a46-e499-6b17-68f48098b0e7.png)

う～む。数式に関してはほぼ完ぺきにLatexの文章化してくれていますが、文字は自分で打ち直す必要がありますね。

ということで、今回の実験の結果としては「数式はすっきりLatex化してくれるが文字は打ち直す必要あり。賢く使えば作業の効率がかなり上がりそう。」ということになりました。

しかしそもそもノートをスキャンしたりしているので、もっと賢い方法があればいいですね。


#### その他メモ

上の方法だと特に「対」という漢字は読み込めないようです。

## MyScript

以下のサイトでも書き込んだ数式をLatex化してくれます。賢く使えば作業効率は上がると思います。

https://webdemo.myscript.com/views/math/index.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/ad5a402a-2708-62cd-07b4-befb23836467.png)

また、Detexifyというサイトもあるようです。

http://detexify.kirelabs.org/classify.html
3Dプリント部品にネジ山を作る方法

<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#はじめに
3Dプリント部品をつなげたり、固定したりするのにネジを使いたくなった経験のある方は多いと思います。単純にナットを使って固定する方法もありますが、**インサートナット**と呼ばれる部品を使えるようになると制作の幅が広がるのでご紹介します。
![insertnut03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286787/f224e8ff-ebb4-499f-d17b-e93cc326490c.jpeg)


#必要なもの
- 半田ごて
    - 温度調整ができるものだとより簡単に埋め込むことが出来ます
- インサートナット
    - ネジ専門店の[Wilco](https://wilco.jp/products/nut/nut04.html)が種類も豊富で安くおすすめです。

#埋め込み方
半田ごてが温度調節可能な場合はフィラメントが溶け出す温度に合わせると溶けすぎることなく埋め込めます。
温めながら押し付けて、早めに埋め込むと溶けすぎることなく埋め込めます。
埋め込み終わった後、冷めるまでの時間は意外に長いので油断して触らないようにしてください（やけどしました）。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">3Dプリント部品にインサートナット（ビットインサート）を埋め込む <a href="https://t.co/2kFnTtaYhd">pic.twitter.com/2kFnTtaYhd</a></p>&mdash; ダイヤモンド電電 (@diamond_denden) <a href="https://twitter.com/diamond_denden/status/1257336353404092416?ref_src=twsrc%5Etfw">May 4, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#取り出し方
ケチくさいですが、埋め込みに失敗したり、3Dプリント部品自体が壊れてしまったりした場合でも取り出して再利用することが可能です。
取り出すときは半田ごてに溶けた3Dプリント部品が付着し、嫌な匂いがするので換気をしましょう（換気せずに気持ち悪くなりました）。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">インサートナット埋め込み失敗したときのリカバリー <a href="https://t.co/ijIGwrXnaB">pic.twitter.com/ijIGwrXnaB</a></p>&mdash; ダイヤモンド電電 (@diamond_denden) <a href="https://twitter.com/diamond_denden/status/1257336997544431618?ref_src=twsrc%5Etfw">May 4, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#おわりに
部品を知っているだけで制作の幅が広がります。一度チャレンジしてみて知識の引き出しを増やしておくのはいかがでしょうか。
Laravel 自作のヘルパ関数を追加する

## 概要

Laravel では様々なグローバルヘルパ関数が用意されています。
https://readouble.com/laravel/7.x/ja/helpers.html

今回は自作のヘルパ関数を作る方法をご紹介します。

## 環境

- PHP 7.4.5
- Laravel 7.9.2

## やり方

自作のヘルパファイルを作成して、オートローダーに読み込んでもらいます。

### 自作のヘルパファイルを作成する

`app/helpers.php` を作成します。
(場所はどこでも良いです)

```php:app/helpers.php
<?php declare(strict_types=1);

if (! function_exists('hello')) {
    /**
     * @return string
     */
    function hello(): string
    {
        return 'Hello World.';
    }
}
```

### ヘルパファイルをオートローダーで読み込む

`composer.json` の `autoload.files` を下記のように変更します。

```json:composer.json
    "autoload": {
        "files": [
            "app/helpers.php"
        ],
        // ...
    },
```

### オートローダーの更新

```shell-session
$ composer dump-autoload
```

これで `composer.json` の変更が反映されます。

## お試し

```shell-session
$ php artisan tinker

>>> hello()
=> "Hello World."
```

自作したヘルパ関数を実行できました！

## 関連記事

- [Laravel 標準ヘルパ関数を自作ヘルパ関数でオーバーライドする](https://qiita.com/ucan-lab/items/8c291c6484a547db17a5)
- [Laravel Blade で改行コードをbrタグに変換する](https://qiita.com/ucan-lab/items/4e17bdef22d7cd8a3429)
Flutterでストアに提出できるrelease buildを一発で作るシェルスクリプト

タイトルの通り。本当はfastlaneとか使うか迷ったけどまずはこれで当分なんとかできそう。

1, 以下の内容shファイルをプロジェクトルートに作る。

```shell

#!/bin/bash

echo 'Build Android Release Resource'
flutter build appbundle --target-platform android-arm,android-arm64,android-x64

echo ''
echo 'Build iOS Release Resource'
flutter build ios --release

ARCHIVE_PATH="$PWD/build/ios/Runner.xcarchive"
IPA_PATH="$PWD/build/ios/Runner.ipa"
xcodebuild -quiet -workspace ios/Runner.xcworkspace -scheme Runner -sdk iphoneos -configuration Release archive -archivePath $ARCHIVE_PATH
xcodebuild -quiet -allowProvisioningUpdates -exportArchive -archivePath $ARCHIVE_PATH -exportOptionsPlist ipaOptions.plist -exportPath $IPA_PATH

echo ''
echo 'Android Release Resource (ipa)'
find build/app/outputs -name "*.aab" -type f

echo ''
echo 'iOS Release Resource (ipa)'
find build/ios -name "*.ipa" -type f

```

2, exportOptionsPlistに指定するファイルを作る

自分は`ipaOptions.plist`という名前にした。これもプロジェクトルートに置く。

```
<plist version="1.0">
<dict>
    <key>method</key>
    <string>app-store</string>
    <key>uploadBitcode</key>
    <false/>
    <key>uploadSymbols</key>
    <true/>
</dict>
</plist>
```

3, 実行

こんな感じのログが出る。`xcodebuild`に`-quiet`を付けているのでwarningかerrorだけ出る。

```
$ ./build.sh
Build Android Release Resource
Removed unused resources: Binary resource data reduced from 155KB to 130KB: Removed 15%
Running Gradle task 'bundleRelease'...                                  
Running Gradle task 'bundleRelease'... Done                        10.7s
✓ Built build/app/outputs/bundle/release/app-release.aab (22.8MB).

Build iOS Release Resource
 
Building foo.bar.myapp for device (ios-release)...
Automatically signing iOS for device deployment using specified development team in Xcode project: ABCDEFGHI
Running Xcode build...                                                  
                                                   
 └─Compiling, linking and signing...                        22.2s
Xcode build done.                                           42.8s
Built /path/to/Runner.app.
2020-05-05 01:10:09.963 xcodebuild[59710:8626900] [MT] PluginLoading: Required plug-in compatibility UUID C80A9C11-3902-4885-944E-A035869BA910 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/RealmPlugin.xcplugin' not present in 
:
(中略)
:
'/var/folders/ml/zjkhw_p17pjbrj2383y5qym40000gn/T/Runner_2020-05-05_01-13-41.823.xcdistributionlogs'.
Exported Runner to: /path/to/Runner.ipa

Android Release Resource (ipa)
build/app/outputs/bundle/release/app-release.aab

iOS Release Resource (ipa)
build/ios/Runner.ipa/Runner.ipa
$
```
react-reduxのstoreでのtype宣言を無くす


## ジェネリクスを完結にすることから始まりました。
react-reduxのuseSelectorする時いちいちジェネリクスを記述する雰囲気どうにかしたいな。。。
ググって先駆者を探していた所下記にたどり着きました。
[react-redux の Hooks API に Generics は要らない](https://qiita.com/Takepepe/items/6addcb1b0facb8c6ff1f)

これで、ジェネリクスは記述する必要なくはなりました。

## 次なる問題、storeでのtype宣言が面倒臭い
今回はreducerから型を作り出して、DefaultRootStateにセットしてしまう試みです。

まず、declareを宣言して、StoreStateをreducerを元に生成します。

```typescript:globals.d.ts
import { reducers } from "../stores";
import { Reducer } from "@reduxjs/toolkit";

type StoreState = {
  [key in keyof typeof reducers]: typeof reducers[key] extends Reducer<
    infer T,
    AnyAction
  >
    ? T
    : never;
};

declare module "react-redux" {
  interface DefaultRootState extends StoreState {}
}

```

そうすることで、storeが完結に書けるように。

```typescript:store.ts
import { combineReducers } from "redux";
import { configureStore } from "@reduxjs/toolkit";
import "react-redux";
import reduxThunk from "redux-thunk";
import sliceReducer from "./slice";

export const reducers = {
  sliceReducer,
  // slice etc...
};

const reducer = combineReducers(reducers);
const store = configureStore({ reducer, middleware: [reduxThunk] });

export default store;
```
【#Max-MSP】line~オブジェクトの使い方

##line~オブジェクト

sine波を以下のようなパッチで出力すると振幅の変化が急に起こり、ノイジーになってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631693/da8f9f3e-8421-975b-4070-db93ce1d4f11.png)

このノイズを滑らかにしてくれるのがline~オブジェクトです。

##line~オブジェクトの使い方
サンプルとして以下のパッチを作成しました。
ダウンロードはこちらからどうぞ。[GitHub](https://github.com/hiwasawa0715/MaxMSPExample)
テキストと図だと解りにくいので以下動画もアップしました。
[![](https://img.youtube.com/vi/whS6AsXxt5w/0.jpg)](https://www.youtube.com/watch?v=whS6AsXxt5w)


![pict1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631693/d017ff73-0e85-5911-5552-980c7c647a69.png)

lineオブジェクト左ペイン```0,1 5 0 30```


```
0, 1 5 ： 振幅 0 → 1 : 5msec
0 30   ： 振幅 1 → 0 : 30msec
```

振幅のイメージは以下のようになります。
![pict2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631693/acb93b5e-0edc-6816-0a29-a8fc2e975c04.png)
配列を順次取り出すfor命令の比較

GW中はどこにも行けないので、のんびり家でJavaを勉強しています。
rubyのeach文は優秀で、どこにでも使えるのがうれしいので多用してしまいます。ruby使っているともはやrubyでfor文ってどう書くんだっけ？って感じです。
たとえば、配列の中身を出力するとき、こんな書き方ができます。

~~~fruits.rb
fruits = ["りんご", "みかん", "バナナ"]
fruits.each do |v|
  print "#{v}\n"
end
~~~

これがC#でfor文で書くならこんな感じです。

~~~fruits1.cs
var fruits = new string[] {"りんご", "みかん", "バナナ"};
for (int i = 0; i < fruits.Length; i++)
{
	Console.WriteLine(fruits[i]);
}
~~~

for文のカウンタで配列のインデックスを回して要素を取り出すオーソドックスな方法です。
そして、Rubyのeachみたいな記法でforeach文というのがあって、こんな感じ書けます。

~~~fruits2.cs
var fruits = new string[] {"りんご", "みかん", "バナナ"};
foreach (var v in fruits)
{
	Console.WriteLine(v);
}
~~~

foreach文は`IEnumerable`または`IEnumerable<T>`インタフェースを実装しているクラスの要素を取り出すことができます。配列は`IEnumerable`を実装しているので使えるとのことのようです。`List<T>`なども`IEnumerable<T>`を実装しているので使えます。

Javaの場合は拡張for文というのがあるらしくて、こう書くようです。

~~~fruits.java
var fruits = new String[] {"りんご", "みかん", "バナナ"};
for (var v : fruits)
{
	System.out.println(v);
}
~~~

うーん、わかりづらい。
foreachではなくて同じforで書くんですね。

なお、C#の場合は、Listを使ってラムダ式を使うともう少しスマートに同じことができます。

~~~fruits3.cs
var fruits = new List<string> {"りんご", "みかん", "バナナ"};
fruits.ForEach(v => Console.WriteLine(v));
~~~

ちなみに、今回の主旨とは異なりますが、ただ配列の中身を改行して出力するだけならJoinで十分ですけどね。

~~~fruits4.cs
var fruits = new List<string> {"りんご", "みかん", "バナナ"};
Console.WriteLine(string.Join("\n", fruits.ToArray()));
~~~

個人的には原点であるrubyの記法がお気に入りです。

~~~fruits.rb
fruits = ["りんご", "みかん", "バナナ"]
print fruits.join("\n")
~~~
Django Sprint Appendix Docker周りのコマンドとエラー (Docker Toolbox向け)

## コマンド
### コンテナの起動(サーバーの起動)

```terminal
# foregroundで起動
> docker-compose up

# backgroundで起動
> docker-compose up -d
```

### コンテナの停止(サーバーの停止)
```terminal
# foregroundで起動していた場合
# Ctrl + C （時間がたってもなかなか終わらな場合はもう一度Ctrl + C）

# backgroundで起動していた場合
> docker-compose stop
```

### コンテナの再起動(サーバーの再起動)
```terminal
# foregroundで起動していた場合
> docker-compose up

# backgroundで起動していた場合
> docker-compose restart
```

### プロジェクトのログを見る
```terminal
> docker-compose logs

# 各コンテナの最新の5行を表示する
> docker-compose logs -f --tail="5"

# 各コンテナの最新の5行を表示する（タイムスタンプあり）
> docker-compose logs -f --tail="5"
```

### コンテナ一覧を表示
```terminal
> docker ps -a
```

### コンテナを停止
```terminal
> docker stop <コンテナID>

# すべてのコンテナを停止
> docker kill $(docker ps -a -q)
```

### コンテナを削除
```terminal
> docker rm <コンテナID>

# すべてのコンテナを削除
> docker rm $(docker ps -a -q)
```

### イメージ一覧を表示
```terminal
> docker images
```

### イメージを削除
```terminal
> docker rmi <イメージID>
```

## エラー

### ERROR: Couldn't connect to Docker daemon - you might need to run `docker-machine start default`.
```terminal
> docker-compose up
ERROR: Couldn't connect to Docker daemon - you might need to run `docker-machine start default`.
```
エラーにも書いてありますが、Docker Machineを起動しましょう。

```terminal
> docker-machine start default
```
それでも解決しない場合は、PCを再起動してください。

### Error checking TLS connection: Error checking and/or regenerating the certs:
```terminal
> docker-machine env
Error checking TLS connection: Error checking and/or regenerating the certs:
```
この場合は

```terminal
> docker-machine regenerate-certs default
```
をしてください。

### ```docker-compose up```して、特にエラーも出ていないのに、```http://192.168.99.100:8000```にアクセスしても何も表示されない
この場合は、ホストOSからアクセスするIPアドレスが変わっている可能性が考えられます。

```terminal
> docker-machine ip default
192.168.99.101
```
として、出てきたIPアドレスを、```/config/settings.py```に追記します。

```python:/config/settings.py
...
ALLOWED_HOSTS = [
    "192.168.99.100",
    "192.168.99.101" # Added
]
...
```
そのあと```stop```してから```up```してください(```restart```でもOK)。

```terminal
> docker-compose stop
> docker-compose up
ReactでUnmountしたときにstateをメモリリークしない便利関数

Reactでアプリケーション開発を行う際、useStateを使ってcomponentを生成する場合はそのcomponentがUnmount(画面でそのcomponentを使用しなくなったとき)したとき、stateをメモリリークしないようにしないと宜しくないですよね。
実際、開発ツールでもconsoleでwarning表示されます。

```
Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.
```

ではUnmountしたときにstateをメモリリークしない書き方について。

## classComponentとhooksの書き方

いまのReactのバージョンで開発する際はhooksで構築するかと思います。
その場合、Unmount時に行う処理はuseEffectを使用してそのなかで実装します。

``` javascript
useEffect(() => {
  return () => {
    // Unmount時の処理を記述
  };
}, []);
```

classComponentのときはライフサイクルメソッドの「componentWillUnmount」内で記述します。

``` javascript
componentWillUnmount() {
  // Unmount時の処理を記述
}
```

## stateを解放させる便利関数

ここからはhooksで開発する前提で話を進めていきます。
先ほど説明したComponentごとのuseEffect内にUnmout時にstateをメモリーリークしない記述をしていくのでもいいのですが、大規模な開発になっていくつものComponentに同じような記述をしていくとそれはそれで面倒になってきます。
なので、helper関数を作って処理を簡素化させるのが宜しいかと思われます。

あらゆる書き換え可能な値を保持しておくのに便利なhook「useRef」を使います。
この関数でUnmount時に`unmountRef.current`がtrueになります。

``` javascript:useUnmountRef関数
const useUnmountRef = () => {
  const unmountRef = useRef(false);

  useEffect(
    () => () => {
      unmountRef.current = true;
    },
    []
  );

  return unmountRef;
};
```

そのuseUnmountRefとuseStateを融合させたhelper関数を作ります。

``` javascript:useSafeState
const useSafeState = (unmountRef, defaultValue) => {
  const [state, changeState] = useState(defaultValue);
  const wrapChangeState = useCallback(
    (v: any) => {
      if (!unmountRef.current) {
        changeState(v);
      }
    },
    [changeState, unmountRef]
  );

  return [state, wrapChangeState];
};
```

Unmountしてないときだけstateが書き換えられるようにしています。

## Component内で実装

``` javascript:Hoge.jsx
const unmountRef = useUnmountRef();
const [state, setState] = useSafeState(unmountRef, {stateの初期値});
```

これだけで済みます。
なんとも便利な関数ですね。

また、Unmount時の処理はこの書き方になります。

```javascript
if (unmountRef.current) {
 // Unmount時の処理
}
```
たとえばblob画像を生成して、その画像を解放させるとき`revokeObjectURL()`関数を使いますが、その箇所に記述すると宜しいかと思われます。
Vue.jsをTypeScriptで使う(Vuetify編)

自分用忘備録
逐次追加します

## 環境
* Vue 2.6.11
* Vuetify 2.2.11
* TypeScript 3.8.3

## インストール時
エラー `Property 'hello' does not exist on type 'Vue | Element | Vue[] | Element[]'.`

型定義を`tsconfig.json`に追加する。

```ts
    "types": [
      "webpack-env",
      "vuetify"
    ],
```

## Validation(Vuetify標準)
### v-formのバリデーション関連関数
`<v-form ref="form">`とすると以下の関数が使える。

* `this.$refs.form.validate()`
* `this.$refs.form.reset()`
* `this.$refs.form.resetValidation()`

部分的なバリデーションを行いたい場合は`v-form`を分けて別名の`ref`をつけてやればいい。

`$refs`の型には未定義なので、

**パターン1 `$refs`に`any型`のアクセサを作る(もしくは毎回`as any`)**

```ts
get refs(): any {
  // eslint-disable-next-line
  return this.$refs;
}

hoge() {
  this.refs.form.validate();
}
```

**パターン2 `interface`を作ってform用のアクセサを作る**

```ts
export interface VForm {
  validate: () => boolean;
  reset: () => void;
  resetValidation: () => void;
}

get form(): VForm {
  // eslint-disable-next-line
  return (this.$refs as any).form;
}

hoge() {
  this.form.validate();
}
```

### 複数項目の相関チェック
`getter (jsだとcomputed相当)`で書く。

```html
<v-text-field
  type="password"
  v-model="new_password"
  :counter="20"
  :rules="[rules.required]"
  label="パスワード"
  maxlength="20"
  required
/>
<v-text-field
  type="password"
  v-model="new_password_confirmation"
  :counter="20"
  :rules="[newPasswordConfirmationRule]"
  label="パスワード（再入力）"
  maxlength="20"
  required
/>
```

```ts
@Component
export default class Hoge extends Vue {
//...
  new_password = "";
  new_password_confirmation = "";

  get newPasswordConfirmationRule() {
    return this.new_password == this.new_password_confirmation || "同じパスワードを入力してください"
  }
//***
}
```
Windows10からUbuntu18.04のsambaへアクセスできなくてハマった話

# 背景
緊急事態宣言で登山道閉鎖されまくっていたので、しゃーなしにStay homeの遊びに2年ほど放置されていた
raspiにプリンタサーバ入れようとしていてSambaではまったのでランボー怒りの投稿。

# 結論
まずは、エクスプローラにアドレスを入力してアクセスすることをあきらめろ。
次のどれかで解決できるはずだ。

- net useでパスワード認証する。
-  ネットワークドライブの割り当てで別の資格情報を使用して接続するを使う。
-  windows側ローカルグループポリシーの設定を変更する。（未確認）

## はまった手順

1. apt install samba
2. vi samba.conf
3. systemctl restart smbd nmbd
4. Windowsのエクスプローラーバーでアドレスをちょいちょいと入力する、、、がっダメ…

![繋がらない.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242511/1e942061-1983-da6e-7fa4-f1d3a170aec6.png)
5.  **あのさぁ。。。**と彷徨う。試行錯誤する
- /var/log/samba はファイアクセス関連のログが出力されてない
- ufw　は（FW）無効だし
- WindowsFWも余計なことしてない
- samba再インストールしてみる　が、ダメっ。。。
6. なんとなくネットワークドライブでマウントしてみる 
![ネットワークドライブの割り当て.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242511/f9bf2a47-fe6a-c147-4945-9fd14ba5465f.png)
7. **ファッ！！！？？？？？？？？？？？？？？**お前だったのか
8. 別の資格情報を使用して接続する。で解決


### 原因

**組織のセキュリティポリシーによって非認証のゲストアクセスがブロックされているため、この共有フォルダーにアクセスできません**（略）
はこのGPOですかねえ？
![そのGPO.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242511/73b60e5b-cb71-3993-96cd-3c0b5c50b0a6.png)


### 参考

よくあるエラーなんだろうけど、このエラーメッセージにたどり着くまでに時間がかかった。。。
[IOデータQ&A](https://www.iodata.jp/support/qanda/answer/s30200.htm "Q:「組織のセキュリティポリシーによって非認証のゲストアクセスがブロックされているためこの共有フォルダーにアクセスできません」または「エラーを特定できません」と表示される")

## 後日談

唸っている間にAbemaの幼女戦記劇場版が終わってしまった。。。
ViewportScale の備忘録


CSS 設計完全ガイド 6-13 ジャンボトロン で紹介されていたツールで、今回活用させていただいたので、備忘録になります。

* [CSS設計完全ガイド](https://gihyo.jp/book/2020/978-4-297-11173-1)
* [ViewportScale - GitHub](https://github.com/ixkaito/viewportscale)



## 考え方

簡単な連立一次方程式を解いています。

横幅が最小 x1 の時のあるプロパティの値 y1 と、横幅が最大 x2 の時のあるプロパティの値 y2 とします。(x1, y1), (x2, y2) を通るときの傾き a と切片 b を求めています。

![IMG_2752.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254825/805cce9b-6fd7-8f88-9e25-7a26c64464b2.jpeg)

### ◯ 例えば...

ドキュメントの Example 1 の例で言えば (320px, 32px), (960px, 48px) を通る点の傾き a と切片 b を求めています。

```scss
h1 {
    @include vs(font-size, 320px, 32px, 960px, 48px);
}
```

2.5vw が傾き a で 24px が切片 b になります。

```scss
@media screen and (min-width: 320px) {
    h1 {
        font-size: calc(2.5vw + 24px);
    }
}
```


実際に出力される CSS は、x1 以下の場合は y1 固定、x2 以上の場合は、y2 固定されていることに留意してください。


## ソースコード

ソースコードは、以下のファイルになります。中を覗くと変数名は異なりますが、似たような形をした式が見当たります。

```scss
		$x: ($d - $b) / ($c - $a) * 100#{$vp-unit};
		$y: ($c * $b - $a * $d) / ($c - $a) * 1#{$u2};
```

* [viewportscale/_viewportscale.scss](https://github.com/ixkaito/viewportscale/blob/master/_viewportscale.scss)

### ◯ Sass の基本

* コロン `:` は、代入。
* 変数名の頭は `$` マーク
* 制御構文の頭は `@` マーク

代入、if, for などの制御構文以外は、コンパイル後、展開される。以下、そのほか。

* [＃{} - SassScript - Sassオレオレリファレンス](https://tenderfeel.github.io/SassReference/sass-script/interpolation.html)
* [3-1. 数値のみを出力する - Sass：数値を操作したいときに便利な演算や関数](https://www.nxworld.net/tips/sass-number-operations-and-functions.html#anchor03-01)



## そのほか
### ◯ 手順

インストール

```
$ sudo gem install sass
```

コンパイル

```
$ # sass SCSSファイル名:CSSファイル名
$ sass test.scss:test.css
```

* [Sass の教科書](https://book.scss.jp/code/c2/04.html)





### ◯ リンク

* [Sass の公式ドキュメント](https://sass-lang.com/)

<!--

例外を投げればいいのに...　と思った。

```sass
	@if $u1 == $u3 and $u2 == $u4 {
```

* [Throwing custom errors/warnings in Sass - Stackoverflow](https://stackoverflow.com/questions/20118466/throwing-custom-errors-warnings-in-sass)

-->
firebase hosting でのエラー対処   npm ERR! code ELIFECYCLE

# 発生したエラー
```
To install them, you can run: npm install --save firebase firebase/functions
 ERROR  Build failed with errors.
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! werewolf-games-front@0.1.0 build: `vue-cli-service build`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the werewolf-games-front@0.1.0 build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
```

ここで忠告されているように ``` npm install --save firebase firebase/functions``` を実行したが失敗

#解決策
``` npm install --save firebase ```
```firebase/functions``` 除いてやったら成功した
cssで画像を中央寄せすることに苦戦した話


##はじめに

フロントエンドのコードを書いていて、画像を中央寄せにすることに苦戦したので忘備録と共有を兼ねて記事にしました。何番煎じかわかりませんが、誰かの助けになったら幸いです。

##この記事の目標

以下のhtmlのstyleを書いて、画像を中央寄せにしたいです。
動作確認はGoogle Chromeでしました。
※この記事では、縦方向の中央ぞろえはやらないです。

```html
<head>
  <style>
    /*ここを書いていく*/

  </style>
</head>

<body>
  <div>
    <img src="./image.png" alt="画像">
  </div>
</body>
```
この状態では次のように画像は左端に表示されますが、
![最初の状態](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427887/49f42da2-52bc-cfb3-eecc-1fa6c4245efe.png "最初の状態")

styleをかいて、次のような中央寄せを目指します。
![中央寄せの状態](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427887/48c6a675-e210-9f50-c3ef-cbef0fe57641.png "中央寄せの状態")


##完成したコード
以下のようなstyleを適用することで、画像を中央寄せにでました。

```html
<head>
  <style>
    div {
      text-align: center;
    }
  </style>
</head>

<body>
  <div>
    <img src="./image.png" alt="画像">
  </div>
</body>
```

以下のようなコードでも中央寄せにできます。

```html
<head>
  <style>
    img {
      margin: auto;
      display: block;
    }
  </style>
</head>

<body>
  <div>
    <img src="./image.png" alt="画像">
  </div>
</body>
```

以上だけでも記事としては完結しますが、以下から私が苦戦した部分について共有したいと思います。

##私の失敗とその理由
最初、私は以下のようにstyleを適用してみましたが画像はみじんも動きませんでした。
（style以外は省略しますが、最初の状態と同じです）

```css
/*これではうまくいかない*/
<style>
  img {
    text-align: center;
  }
</style>
```
```css
/*これもうまくいかない*/
<style>
  img {
    margin: auto;
  }
</style>
```
この方法が失敗した理由は、各スタイルが何をしようとしているか考えることでわかりました。
各スタイルが何をするか、私なりの言葉で説明すると次のようになります。

* text-align:center は、ブロックレベル要素に適用することで、要素の中身を中央寄せにする。
* margin:autoは、ブロックレベル要素にwidthと一緒に適用することで、要素そのものを中央寄せにする。

どちらも共通点として、ブロックレベル要素にしか適用できないということがあります。しかし、imgタグによって作られた要素はインライン要素です。
つまり私が失敗した理由は、ブロックレベル要素にしか適用できないスタイルをインライン要素に適用しようとした（＝ブロックレベル要素とインライン要素の区別をつけていなかった）ことにあります。（ブロックレベル要素とは何か、インライン要素とは何か、そもそも要素とは何かについては説明できるほど理解が及んでないです。）

以上を踏まえ、中央寄せにするには

* divなどのタグでimgを囲み、それに対してtext-align:centerを適用する
* imgにdisplay:blockをつけて、ブロック要素として扱いそれにmargin:autoをつける。(widthは画像の幅と同じになるので、明示的に指定しなくても動く)

といったことをすればよいことになります。
(１つめの方法はdivの中にimg以外の文字を入れてしまうと意図した表示がされないと思うので注意してください。imgのみを含むdivを作り、それにidかclassをつけてstyleを適用するのがいいかなと思います。)

##おわりに
cssで画像の中央寄せにはいつも苦戦していたのですが、ある程度自分で理解できたのでアウトプットしてみました。「中央寄せ出来たぜ」という記事か、「ブロックレベル要素とインライン要素の区別大切だぜ」という記事にしようか迷走しながら書いたので、だいぶ歯切れが悪い感じになってしまったかなと思ってます。
また、日本語として適切かどうか怪しい部分や、一部説明をごまかしたりしている部分があるのが申し訳ないです。
【初心者向け】10行以内のスクリプト(6.wgetでライブドアの東京・大阪・名古屋の天気情報を表示)

### 【初心者向け】10行以内のスクリプト(6.wgetでライブドアの東京・大阪・名古屋の天気情報を表示)
pythonで色々なライブラリを使えば、「少ないコードでもちょっとした事が出来て、少なければ5行程でもちょっとしたスクリプトが作れ、便利だな。」と思ったので、pythonやその他、コマンドを羅列しただけのものも出てくるかも知れませんが、10行程のスクリプトを不定期で投稿してみようと思います。

**第6回**として、<font color=blue>wgetでライブドアの天気情報を表示するスクリプトを投稿したいと思います。</font>

ウェブから情報を抽出したりダウンロードする場合は、python等を使う事が多いと思いますが、ここはブラウザとLinuxのディストリビューションに含まれていると思われる、伝統的なUNIXのツールでやってみようと思います。

簡単なものであれば、CUIのブラウザやwget、curl等を使ったほうが、手軽で動作が軽い様にも思います。

私も、少し前からpythonを独習し始め、pandasのdatareaderで為替相場をスクリプト中で、ダウンロードしてみたりしてみていますが、wgetやgrep等を使うほうが手軽です。


***

### 1.東京・大阪・名古屋の天気情報をダンロード、抽出・表示するスクリプト

データは、以下のライブドアさん公開のWeb-APIを使用しました。
weather_report_api='http://weather.livedoor.com/forecast/rss/index.xml'

数日間の情報を表示する場合は、このAPIのリンク先に各地の情報もあります。

【環境】
Linux: LinuxMint19.3 
shell: bash4.4.20
w3m: 1.19.4
grep: GNU grep3.1
awk: 1.4.4



**wgetで任意のファイルに出力する基本の使用方法は、以下の通り。**
(-Oは、アルファベットのオーです)
wget 「接続するurl」 -O 「出力先のファイル名」 

**東京・大阪・名古屋の天気情報をダンロード、抽出・表示するスクリプト**

```terminal:bash

#!/usr/bin/env bash
#
###############################################################
# livedoorの天気情報表示
#
# 全国の天気
# http://weather.livedoor.com/forecast/rss/index.xml 
#
# ファイルから条件を抽出するコマンド
# cat livedoor.txt |grep -e "東京" -e "大阪" -e "名古屋" | awk '{print $2 ,$4 ,$6 ,$8}'
#
# out_file = './livedoor_weather_report.txt'
#
###############################################################
# ライブドアの全国の天気のrss
weather_report_api='http://weather.livedoor.com/forecast/rss/index.xml'
# 出力するファイル
out_file='./livedoor_weather_report.txt'
# ライブドアの全国の天気のrssをwgetでダンプ
echo ''
#w3m -dump $weather_report_api > $out_file
wget -q $weather_report_api -O $out_file
echo '今日の天気' ; date
echo ''
# ファイルから条件を抽出して終了
cat $out_file | grep -e "東京" -e "大阪" -e "名古屋" | awk '{print $4 ,$6 ,$8}'
echo ''

```

【抽出・表示の結果】

```terminal:bash

今日の天気
2020年  5月  4日 月曜日 22:31:00 JST

東京 曇り 最高気温22℃
名古屋 晴時々曇 最高気温24℃
大阪 晴のち曇 最高気温25℃

```

**非常に簡単でワンライナーで良いぐらいのもので、詳しく説明するほどのものでも無いのですが**

#### 2.構成を2部に分けるとすると


【1】wgetで、rss「http://weather.livedoor.com/forecast/rss/index.xml」に接続して、ファイルに出力

・実際の利便性を考えると、このAPIのリンク先に各地の情報を数日間の予報表示する事例が多いと思いますが、ここでは全国的な情報が見えるこちらに接続しました。
・出力先のファイルは、カレントディレクトリの「livedoor_weather_report.txt」としました。
・オプションの「-q」で、標準出力を無効にしました。

```bash:wget

# ライブドアの全国の天気のrss
weather_report_api='http://weather.livedoor.com/forecast/rss/index.xml'
# 出力するファイル
out_file='./livedoor_weather_report.txt'
# ライブドアの全国の天気のrssをwgetでダンプ
echo ''
wget -q $weather_report_api -O $out_file

```

【2】ファイルから、パターンマッチで条件を抽出

```teminal:bash

cat 出力したファイル | grep -e "東京" -e "大阪" -e "名古屋" | awk '{print $カラム ,$カラム ,$カラム}' 

```
として、grepとawkで検索をしています。
grepで検索するキーワード毎で、「-e」のオプションを使用して一度のコマンドで検索しています。
次にパイプで結果を、「awk」に渡して、4番目、6番目、8番目のフィールドを抽出しています。

```bash:awk,grep

# ファイルから条件を抽出して終了
cat $out_file | grep -e "東京" -e "大阪" -e "名古屋" | awk '{print $4 ,$6 ,$8}'
echo ''

```

テキストベースのブラウザやUNIXのテキスト処理のツールは強力で、<font color=blue>他のコマンドに結果を渡すフィルターとして使用できる</font>ものがほとんどだと思います。

私がスクリプトにしたものも<font color=blue>パイプで、wgetとawkやgrep等を並べているだけ</font>ですが、例えばawkでは、テキストファイルのカラムの順番を並べ替えたり、する事が簡単に出来ます。
csvで渡されたファイルのカラムを並べ替えたり、抽出したりする事も簡単で、実は演算等も出来る様です。

**以上、6.wgetでライブドアの東京・大阪・名古屋の天気情報を表示でした。**
Amazon EC2 + SoftEther でリモートアクセス VPN サーバを作る

Amazon EC2 で L2TP over IPsec なリモートアクセス VPN サーバを作ろうと思い、SoftEther で試したみたところ簡単にできたので手順をメモしておく。

参考： [AWS\(EC2\)でSoftEtherを使ってL2TP/IPsecなVPNを構築する \(Mac\) \- Qiita](https://qiita.com/showwin/items/92861057a8b62611444d)

## EC2 インスタンス設定
- AMI: Ubuntu 18.04 (ami-0278fe6949f6b1a06)
- Instance Type: t2.micro
- Security Group
  - Allow UDP port 500 from 0.0.0.0/0
  - Allow UDP port 4500 from 0.0.0.0/0

## SoftEther をインストール
調べると gcc 入れて make するやり方が出てくるが、[公式リポジトリの README](https://github.com/SoftEtherVPN/SoftEtherVPN#for-ubuntu) で [Launchpad PPA](https://code.launchpad.net/~paskal-07/+archive/ubuntu/softethervpn) が紹介されていたのでこれを使ってインストールすることにする。

``` console
$ sudo apt-add-repository ppa:paskal-07/softethervpn
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install softether-vpnserver
$ sudo systemctl enable softether-vpnserver
$ sudo reboot
```

## 初期設定
### サーバ全体の管理者パスワードの設定
参考： [3.3 VPN Server 管理 - SoftEther VPN プロジェクト](https://ja.softether.org/4-docs/1-manual/3._SoftEther_VPN_Server_%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB/3.3_VPN_Server_%E7%AE%A1%E7%90%86)

``` console
$ vpncmd localhost:443 /SERVER
```

``` console
VPN Server> ServerPasswordSet
ServerPasswordSet command - Set VPN Server Administrator Password
Please enter the password. To cancel press the Ctrl+D key.

Password: ****************
Confirm input: ****************

The command completed successfully.
```

### 仮想ハブの設定
今回は既に作成されている DEFAULT ハブを使う。
(DEFAULT を使わない場合は `HubCreate` を使って新規作成する。)

``` console
$ vpncmd localhost:443 /SERVER /HUB:DEFAULT
```

L2TP/IPsec を有効化。
PSK を設定する必要がある。

``` console
VPN Server/DEFAULT> IPsecEnable
IPsecEnable command - Enable or Disable IPsec VPN Server Function
Enable L2TP over IPsec Server Function (yes / no): yes

Enable Raw L2TP Server Function (yes / no): no

Enable EtherIP / L2TPv3 over IPsec Server Function (yes / no): no

Pre Shared Key for IPsec (Recommended: 9 letters at maximum): XXXXXXXX

Default Virtual HUB in a case of omitting the HUB on the Username: DEFAULT

The command completed successfully.
```

NAT と DHCP を有効化。

``` console
VPN Server/DEFAULT> SecureNatEnable
SecureNatEnable command - Enable the Virtual NAT and DHCP Server Function (SecureNat Function)
The command completed successfully.
```

## ユーザの作成
``` console
$ vpncmd localhost:443 /SERVER /HUB:DEFAULT
```

ユーザを作成する。
`User Name:` 以外は空のまま Enter で問題ない。

```
VPN Server/DEFAULT> UserCreate
UserCreate command - Create User 
User Name: hoto

Assigned Group Name: 

User Full Name: 

User Description: 

The command completed successfully.
```

作成したユーザのパスワードを設定する。

``` console
VPN Server/DEFAULT> UserPasswordSet
UserPasswordSet command - Set Password Authentication for User Auth Type and Set Password
User Name: hoto

Please enter the password. To cancel press the Ctrl+D key.

Password: ***********
Confirm input: ***********

The command completed successfully.
```

## クライアントから接続
割愛。

ホスト名と PSK とユーザ名とユーザパスワードがあれば接続できるはず。
Raspberry pi 4 (Raspbian Buster) で wifi APを作った時の話

#Raspberry pi 4 (Raspbian Buster) で wifi APを作った時の話

wifi APを作ったときに引っかかった点を・・・・
Raspbian の Busterで作業しました。

#日本語でググって出てくる解説のほとんどは、Busterではなく前バージョンのStretch

Busterは2019-07-10にリリースされたそうです。
これ以降にライズパイを購入した場合、標準のOSであるRaspbianはBusterになるでしょう。
（探せば前バージョンもあるらしい）

というわけで、ググって出てくる情報のほとんどは、前バージョンのstretchが前提となっています。
特に日本語で、Buster前提の記事は見たことが無いです。


#wifi APの作り方はRaspbian の公式に載ってる
[ラズパイ公式](https://www.raspberrypi.org/)の[HELP](https://www.raspberrypi.org/help/)の[Documentation](https://www.raspberrypi.org/documentation/)の[Configuration](https://www.raspberrypi.org/documentation/configuration/)に[Wireless access point](https://www.raspberrypi.org/documentation/configuration/wireless/access-point-routed.md)に英語ですがそのものズバリと載っています。


#Busterになって変更された点(eth0やwlan0のIPを指定する方法)
documentation > configuration > [TCP/IP networking](https://www.raspberrypi.org/documentation/configuration/tcpip/README.md)によると、

>Previous versions of Raspbian used the file /etc/network/interfaces for network interface configuration: if an interface is listed in this file, any settings there will take precedence over what is in /etc/dhcpcd.conf.

だそうです。
Busterからは、IPの設定には、/etc/network/interfaces  ではなく **/etc/dhcpcd.conf** を使うらしいです。

Raspbianの前バージョンのstretchではinterfacesで記述することが推奨されていたそうです。

私が公式以外の解説ページで見た情報は、interfacesに記述するものと dhcpcd.confに記述するものが混ざっています。解説サイトのつまみ食いをすると、同じ設定を別々の場所で行うことになり意図しない動作となる可能性が高いです。

#Busterになって変更された点？(wlan0側でdhcpサーバーとして機能させる場合)
[Wireless access point](https://www.raspberrypi.org/documentation/configuration/wireless/access-point-routed.md)ではdnsmasqを使う方法が示されています。

多くの解説ページでは isc-dhcp-server を使う方法が示されています。
おそらくどっちても動くでしょう。
ですので、どちらかだけを信じて使えばいいと思います。

##eth0のIPはDHCPを生かしたままでもAPとして動く
公式を含めて解説ページのほとんどは、eth0に固定IPを振ることから始まります。
これはあくまで、ssh等でリモートアクセスするためのもので、純粋にwifi-APとして使うなら、eth0側はdhcpでIPを取ってきても動きます。
APとして機能させたいけど、固定IPを振れない環境もあるかと思います（私のように）

ただし、この場合は、キーボードとマウスと画面を物理的にラズパイに接続しないと操作しにくくなります。（割り振ったIPを別手段で確認できる場合は別）

#パスワード無しのAPとして運用したい場合
パスワード無しのAPとして運用したい場合は、/etc/hostapd/hostapd.confのwpa関連の設定をコメントアウト or 削除すればパスワードを必要としないAPが出来上がります。

~~べ、別に罠APとして運用して接続してきた不届き者のパケットを解析して一人でニヤニヤしたかったわけじゃないんだからね！~~

```/etc/hostapd/hostapd.conf
country_code=JP
interface=wlan0
ssid=NameOfNetwork
hw_mode=g
channel=7
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
#wpa=2
#wpa_passphrase=AardvarkBadgerHedgehog
#wpa_key_mgmt=WPA-PSK
#wpa_pairwise=TKIP
#rsn_pairwise=CCMP
```

#tcpdump をwlan0に向いて使えばパケットを取得できる
自分のスマホからどのような情報が流れているか解析したい場合に使えるのではないでしょうか？
（例えばスマホゲームアプリの接続先とか）

以上！
Angular Material: Date Picker　エラー解決

#初めに
Angular MaterialのDate Pickerを使おうとしたのですが、エラーが出たのでメモ程度にエラーの解決方法を書きます。

#前提
MacOS Catalina version 10.15.4
Angular CLI: 9.1.3
Node: 14.0.0
OS: darwin x64

#最初にしたこと
[Angular Materialの公式(Basic Datepicker)](https://material.angular.io/components/datepicker/examples)通りにMatDatepickerModuleをインポートし、公式のHTMLコードをコピペしたのですがエラーが出てしまいました。
<img width="557" alt="Screen Shot 2020-05-05 at 0.02.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341253/2d6a8ff3-0535-19c4-c061-ccd615cc17c1.png">

#解決方法
MatNativeDateModuleをMatDatepickerModuleと共にインポートしたら、ちゃんと動きました。シンプルでした。

```
import {MatNativeDateModule} from '@angular/material/core';
```

```
@NgModule({
  declarations: [CreateEventComponent],
  imports: [
    MatDatepickerModule,
    MatNativeDateModule
  ]
})
```

#最後に
公式ドキュメントにしたがってエラーが出てしまう人がいるのではないかと思いメモを残しました。お役に立てれば幸いです。
Bluetooth5.2 対応Thunderboard EFR32BG22をレビュー

EFR32BG22はBuetooth5.2に初めて対応したMCUになります。
Wireless Gecko Series 2シリーズとしてARM Cortex-M33のシングルコアにBluetooth機能が搭載されたものになります。
なおBluetooth5.2のLE Audioについては、資料が見つからない為、現段階（2020年5月3日時点）では、不明となりますが
このThunderBoardにはPDM　Microphoneがついており、サポートすることが期待されます）

今回、SiliconLabsのEFR32BG22を搭載したThunderboard　BG22 Kitを頂いたので触ってみます。

#商品紹介
そもそもThunderboard　BG22 Kitとは何か
SiliconLabsのBluetooth用のSOCにセンサー類を載せたボードになります。
今回のThunderBoardはEFR32BG22に、加速度、温湿度、ライト、UV,ホールセンサー、ボタン、LED、そして、マイクを搭載しています。
商品の仕様はこちら
https://www.silabs.com/products/development-tools/thunderboard/thunderboard-bg22-kit

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f30b7480-4040-e699-cd1f-98e5c281a9b7.jpeg"  width="500" >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/fe2fcb83-6606-2822-83f3-6962afe6a78a.jpeg"  width="1000" >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8a5926a8-25ae-bc6e-2a7f-bd5e3dd556a5.jpeg"  width="700" >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9d97fa98-8929-1866-f278-6e17c205a276.jpeg"  width="700" >

早速触ってみましょう。

#モバイルアプリ
Resetを押さないとデバイス認識されません。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c6acef17-7273-7f9c-e166-1f790737c665.png"  width="300" >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4b9895da-2c16-8eb9-bd5d-672569971a57.png"  width="300" >
リセットを押します。
認識しました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1a9d2f57-0ca8-d17a-9cff-ea37743d1c03.png"  width="300" >
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3f48a0e8-213f-7c0d-4e27-02b34dba50b4.png"  width="300" >


センサーの値です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/395faa8a-9f0d-d434-d22b-9f0ba472bbf0.png"  width="300" >
#Windowsで
WindowsにつなぐとJLinkに見えます。
背面のＥＦＭ32GG12がJLinkになっているのかな？？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/11509d24-062e-927f-1ed0-3ef56d9e84e9.png)

昔のボードは違うチップがJLink機能を有していたような？？

PCと普通に接続すると、待機モードになり、立ち上がりません。
基板上のResetボタンを押すことで起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/1513f642-5f14-c238-a773-fead0e208479.png)
#開発環境
~~今回からSimplicity Studio v5になるようです。~~
(2020年5月6日Simplicity Studio　4に変更になっています。間に合わなかったか、誤植だった模様）
SimpleCityStudio4のようです。

マクニカさんはマニュアルを用意してくれるています、
（山辺さん頑張ってください）

##Silicon Labs EFM32：クイック・スタートガイド
https://www.macnica.co.jp/business/semiconductor/articles/silicon_labs/108173/

#Silicon Labs BGM1xx：クイック・スタートガイド
https://www.macnica.co.jp/business/semiconductor/articles/silicon_labs/133247/


現在、使用できないようになっているマイクについても、いずれ資料が出てくると思われます。

#ハンズオン
このデバイスを使用したハンズオンが行われています。
Bluetooth ワークショップ：BG22 プロジェクト・シリーズ(2021年10月19日まで月1回開催）
https://jp.silabs.com/about-us/events/bluetooth-workshop-series
Windows 10 で express, nodist, node, yarn

nodist がバージョンアップされなくなって、2021年の時点ではNodeがうまく動かないことが結構あるようなので、別のツールを使ったほうがよさそうです。とりあえず、記事は参考までの残しておきます。

- [nodistでNode.jsをバージョン管理](https://qiita.com/satoyan419/items/56e0b5f35912b9374305)

2024/01 年時点では、nvm を使うのがよさそうです。

- [NVM for Windows](https://github.com/coreybutler/nvm-windows)

# インストール

- windows 10 home (64bit) を用意
- git bash をインストール
- nodist をインストール
- nodeをインストール
- yarn をインストール
- express をインストール
- express-generator をインストール

# 手順

## git for windows をインストール

git bash のためだけに入れます。Power Shell でもできますが、以下では基本的に git bash を使うものとして書いてます。

- https://gitforwindows.org/

上記からダウンロードしてインストールします。必要に応じて日本語の設定をする。

- (参考) <a href="https://zero-config.com/windows/gitbash-001.html">git bash で日本語が化けるのを防ぐ</a>

## Nodist のインストール

下記からインストールできます。

- https://github.com/nullivex/nodist

下のほうにある、with installer の "Download the installer from the releases page" と書かれたところを押すと、windows 用のインストーラ(NodistSetup-x.xx.exe) があるので、それをダウンロードしてインストールします。もちろんソースコードをとってきて build するのでも OK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/4b42e911-4ff9-83f7-e560-7257e86f9e8d.png)

## node のインストール

基本的に以下の記事の通り。
- [[Node.js] Node.js の導入(Windows編)](https://qiita.com/ksh-fthr/items/fc8b015a066a36a40dc2#nodist-%E3%81%AE%E5%B0%8E%E5%85%A5)

git bash を開いて、下記のコマンドを実行し、インストールできるバージョンを確認する。

```
$ nodist dist
```

たとえば `12.20.1 ` をインストールする場合は、下記のようにする。

```
$ nodist + 12.20.1 
```

使用するバージョンの変更は、単にバージョンを書くだけ。インストールしただけでは、使用するバージョンは変更されない。

```
$ nodist 12.20.1 
$ node -v
12.20.1 
```

使用するバージョンが本当に変更されているかは確認しておく。

最初に nodist をインストールしたとくは、npm をアップグレードしておく。

```
npm install npm -g
```

npm のアップデートについては、git bash で update しても Power Shell 側ではアップデートされていない状態になることがあるようなので、git bash で update したら、ずっと git bash で使ったほうがよさそう。

## yarn のインストール

npm でインストールする、しかないぽい。

```
$ npm install yarn -g
$ yarn -v
1.22.4
```

## express, express-generator のインストール

```
$ yarn add global express
$ yarn add global express-generator
```

express-generator までインストールしないと express コマンドは使えない。

## express-generator のテスト

```
$ cd ~/workspace
$ express express_app --view=pug
$ cd express_app
$ yarn install
$ PORT=8000 yarn start
```

ファイアーウォールのブロックの解除を許可するか、というようなウィンドウがでたら「許可」する。`express` の `--view=pug` オプションを付けないと、警告が出てテンプレートの拡張子が `.jade` になる。将来的に jade は pug に置き換わって、jade 名前は使われなくなるかもしれないので、`--view=pug` としておいたほうが良い気がする。

`yarn start` したら、ブラウザで `http://localhost:8000` を開いて下記のような表示がされたら成功している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/f20b0a61-ebef-00eb-ba8a-65eb280dc291.png)

つづく?
find_by_**メソッドでレコードが見つからなかったときにで404ページを表示する


```route.rb
    match '/:code' => redirect('/information/%{code}'), via: [:get]
    match '*path' => 'front#render_404',via: [:get]
```
より、`/path`できたものはinformationコントローラに行くようになっていて、`showメソッド`で精査するんだけど、現状`500error`の画面が出てきているのを`page not found 404エラー`を表示したい

```ruby

  def show
    @information = Information.find_by_code(params[:code])
    gon.code = params[:code]
  rescue
    binding.pry
    render 'errors/404', status: :not_found
  end
```


[こちら](https://qiita.com/YNYS2020/items/9e0131d110fdf61b42e8)より、

`find`は`ActiveRecord::RecordNotFound`と例外が吐かれるが
`find_by_code`は検索メソッドなのでエラーではなくnilがかえる。


なので上記コードはrescueに引っかからない。

なので、nilのときは404エラーにレンダリングする形を取ってみる。


```ruby

  def show
    @information = Information.find_by_code(params[:code])
    render 'errors/404', status: :not_found if @information.nil?
    gon.code = params[:code]
  end
```

解決