OmniAICreator/Qiita-1.07M huggingface dataset:
時間はないけれど、最短最速でプログラミングを身に付けたい！【基礎の基礎】

超ハイパースペシャル初心者の“ぴおにあ”でーす:v:

最初に投稿してから一か月以上たってしまった。はやっ。

さて、この約一か月間、会社員、かつ学生で時間が無いド素人の私が、**最短最速独学でプログラミングを習得するために何をしていたか。**

今日はそれをお教えしましょう(ΦωΦ)ﾌﾌﾌ…


今までは本当にプログラミングのプの字もわかっていなかったので、Qiitaの書き方も全くわかりませんでした。

[わろ先生](https://qiita.com/kurosawa_kuro )に以下のページを教えていただいたものの、書いてあることは当然未知のことだらけ^^;


参照: [Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d "Qiita")

「えっ、Qiitaって何かの言語を使って書くの？何の言語なの？私はまだHTMLの基礎の基礎しか知らないよ？」
そうなんです、言語とは何かさえよく分かっていなかった（いや今も分かっているわけではないけれど、汗）

わはは🌸　そんな状態からは一歩脱出いたしました。というわけで、今回はこれを参考に少し見やすく書いてみましたよ。



##基礎知識##


<dl>
  <dt>HTML・CSS・Java Scriptの基礎知識</dt><br>
  <dd>とにかく、MDN Web Docを熟読。<br>これは本当に良いです。超初心者におすすめ。ページは少し真面目でとっつきにくいんだけど、<br>無料でこんなに勉強できてしまうなんて少し感動すら覚えました。説明もなかなか丁寧。これを何度も読みました。</dd>

</dl>

参照: [MDN Web Doc](https://developer.mozilla.org/ja/docs/Learn)
<br>
##Qiitaやドットインストールを参考に##


<dl>
  <dt>超初心者にドットインストールは優しい！</dt><br>
   <dd>ドットインストールは3分以内の無料動画（2020年9月21日時点で436レッスン、6516本の動画がアップ）でプログラミングを学ぶ準備からガイドしてくれます。３分間なので要所を抑えたい時や調べものの時、このサイト内でキーワード検索するなどして使用し、大変便利です。</dd><br>
</dl>

参照: [ドットインストール](https://dotinstall.com/)　
<br><br>

<dl>
  <dt>Qiitaは知や経験が豊富に公開されている</dt><br>
  <dd>少し新鮮な驚きなのですが、エンジニアさんたちの世界って共有が一つのキーになっているんですね。素敵な世界❤️<br>見知らぬ多くの人たちが、経験や知識を惜しみなく共有してくれている場がこんなにたくさんある（私が知っているのはQiita、Github、MDN、dotinstallくらいですが）ことに嬉しい驚きです。<br>これを存分に使いましょう。タグで検索し不明点を調べたりしています。</dd>

</dl>

参照: 　[Qiita：わろ先生の「JavaScriptによる「順次」「繰り返し」「分岐」」ページ](https://qiita.com/kurosawa_kuro/private/0f34d0693bbe9bdb65d3)

##動画学習##

<dl>
  <dt>Udemy</dt>
　<dd>動画学習にも挑戦！！！　以下参照ページのわろ先生おすすめコースの中から、ちょうどUdemyがセールをしていたので1500円のHTML・CSS・Java Script の初級コースを3つ購入。(プログラミングの勉強で初出費)
<br>全部で9時間程度のコースをひとつまずは受講してみました。動画学習は実際にコードを書いてそれがどう表示されるのかを見ることができるので、記憶に残りやすいと感じます。<br>私の場合には時短のために、速度を1.5倍速に上げて聞きました。1.5倍でも講師の説明は十分聞き取れます。分からないところはメモして何度でも見る癖をつけるようにしたいです。</dd>
</dl>

  

参照: [【保存版】Udemy 350コース突破記念 講師に全力 リスペクト企画 オススメ コース紹介【入門者向け】](https://qiita.com/kurosawa_kuro/items/d3927bdaa68b02a42036)
<br>


##Youtube##

<dl>
  <dt>Blockchainの勉強</dt>
　<dd>これは技術ではなく、概念を学ぶため。最初にyoshitechで事前資料として指定された以下の動画や同じIBM Japan channnel の「ブロックチェーンの仕組み」などを何度も見ています。</dd>
</dl>

  

参照: [ブロックチェーンとは何か？ by IBM Japan channnel](https://www.youtube.com/watch?v=dfNvFkO47go&t=177s)
<br>
<br>
---

私は目的がBlockchainを使ったエシカルな仕組み作りなので、HTML/CSS の凝った装飾テクニックなどは後回しにしてJavaScriptへ進んでいます。
今の時点で、平均1日50分間程度は学習に当てられているようですが、学校のテスト期間やレポート次第では増減するでしょう。

状況を見ながら、学習環境なども見直してゆきたいです。
Substrateを起動中にUpgradeする(独自Palletを追加してみる)　※Upgrade a Chainチュートリアル

# Upgrade a Chainチュートリアル
- 自分のブロックチェーンのプロトタイプを実装していると思考の深みにはまって、どうにもこうにも身動きが取れなくなってしまう場合があります。
- そんな時は役立つ勉強が出来る場所に逃げ込みたくなります。※遊びや暇つぶしに逃げると物凄い焦燥感にかられるためです。
- 案の定、思考の深みにはまってしまった今日、[**Substrate.dev**](https://substrate.dev/en/tutorials)を見ると、更新がかかっていました。
- 「Upgrade a Chain」というチュートリアルが足されているではありませんか。

# 以前から試してみたかった存在
- 今、私が一番応援していて、かつ、尊敬しているプロダクトである[**Plasm Network**](https://www.plasmnet.io/)のCEOの発言として「あたらしい経済」で紹介されていました。
- 曰く、[**「Substrareのブレイクスルーその1は、ブロックチェーンのアップデートに予期しないハードフォークが存在しないということです。」**](https://www.neweconomy.jp/features/web3c/36815)と。
- 但し、「どうやってやるのだろうか？」と思いつつも、なかなかそこまでたどり着けないでいました。
- それが何と！チュートリアルでということで、早速逃げ込みです。

# それにしても凄い話
- ブロックチェーンを止めずにアップデートできるというのは物凄い話だと思っています。
- 先に挙げた記事にも記載されていますが、「いくら説明しても説明しきれないぐらいのメリット」だと私も思います。

# チュートリアルを読んで最初に思った事。独自Pallet追加も可能か？
- ということで、今回は以下の手順を試しました。

１．substrate-node-templateの最新版をCloneする
２．ノードを実行する
３．チュートリアルに従って、Schedullerテンプレートを追加する。
４．独自Palletを追加する。
５．Schedullerをコールして、ブロックチェーンが更新されることを確認する。

# 実施結果
## １．substrate-node-templateの最新版をCloneする
- この[**「Create your first substrate chain」**](https://substrate.dev/docs/en/tutorials/create-your-first-substrate-chain/)通りなので、今回は割愛させて頂きます。
 
## ２．ノードを実行する
- こちらも[**「Upgrade a Chain」**](https://substrate.dev/docs/en/tutorials/upgrade-a-chain/)通りなので、割愛させて頂きます。

## ３．チュートリアルに従って、Schedullerテンプレートを追加する。
- こちらも[**「Upgrade a Chain」**](https://substrate.dev/docs/en/tutorials/upgrade-a-chain/)通りなので、割愛させて頂きます。

## ４．独自Palletを追加する。
- こちらの[**Write a Pallet in its Own Crate**](https://substrate.dev/docs/en/tutorials/create-a-pallet/)に従って、test-templateを追加します。
- 次からがいよいよ本題です。

##５．Schedullerをコールして、ブロックチェーンが更新されることを確認する。
- 前提として、ノードは２．からずっと起動しっぱなしです。一度も停止しません。
- まずは起動されているチェーンpalletの状態等を確認しておきます。
![before_set_code.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628255/4bd8137e-2bc0-25ae-f10a-0ab5439c088b.jpeg)
- チェーンのバージョンが「３」であることが確認出来ます。
- 次にPalletの状態を確認します。
![no_test_pallete.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628255/ee745b9a-77a3-54c3-3f1d-d30753e3cfaa.jpeg)
- test_palleteが存在しないことが確認出来ます。
- 独自palleteを追加した状態でruntimeをビルドしてwasmを作成します。

```
cargo build --release -p node-template-runtime
```

- ビルド終了後、「schedler」を実行してみます。
![after_schedule.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628255/b7b48638-262c-cb6a-e12a-783e48259179.jpeg)

- 指定したBlockNumber「1180」を過ぎて、バージョン「４」にアップグレードされたことが確認出来ます。
- 続いてPalletの状態を確認します。
![check_adding_pallet.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628255/b2d47aae-f31a-ec66-1da8-7693fe572c47.jpeg)
- testPalletが追加されています！！！！！

# まとめ
- 最新のチュートリアルである「Upgrade a Chain」を参考に独自パレットを追加した時の挙動について確認しました。
- 期待通り、動作することが確認出来ました。

# 自分のチェーンを設計しつつ、Plasmを応援します
- 引続き、自分のチェーンを設計・実装しながら、Plasm Networkを全力で応援していきます。
- それと並行して、Plasmの実装フレームワークでもSubstrateのコミュニティも盛り上げていきたいと考えています。
- PlasmはDiscord、Telegram上に、SubstrateはTelegram上に日本語チャンネルがありますので、少しでも興味のある方は是非参加して下さい！！
配列の操作(Javascript)

##Pushメソッド

後から配列に値を追加したい場合はpushメソッドを使用する

```javascript

配列名.push(追加したい値)
```

##forEachメソッド
配列の中を順番に取り出したいときに使用

```javascript
配列名.forEach((引数名)=>{
  処理;
});
```

上記のように引数内に入っている関数をコールバック関数と呼ぶ

##findメソッド
コールバック関数内に記述した条件式の中に当てはまる値の最初の一つの要素全てを取り出すメソッド

```javascript

const 定数名=配列名.find((定数名)=>{
  return 条件式;
});
```

配列の要素がオブジェクトでも取り出しが可能

```javascript

const 定数名=配列名.find((定数名)=>{
  return オブジェクトのプロパティ;
});
```

##filterメソッド

findメソッドとは違い条件に合致した要素全てを取り出すことが可能

```javascript
const 定数名=配列名.filter((定数名)=>{
  return 条件式;
});
```

find関数と同じように配列の要素がオブジェクトでも取り出しが可能

```javascript

const 定数名=配列名.filter((定数名)=>{
  return オブジェクトのプロパティ;
});
```

##map関数
配列内の要素全てに同様の処理を行い、その戻り値から新たな配列を作成するメソッド

```javascript
const 定数名=配列名.map((定数名)=>{
  return 配列内の要素に対する処理;
});
```
find,filter関数と同じように配列の要素がオブジェクトでも取り出しが可能

```javascript

const 定数名=配列名.map((定数名)=>{
  return 配列内の要素に対する処理;
});
```
Excelで統計分析①　カイ二乗検定（2/2）

前回の記事で記載した[カイ二乗検定]では、クロス表全体に対して関係性があるかどうかの検証ができた。
P値が有意水準以下となり「関係性がある」と言えた場合に、具体的にどの組み合わせで関係性があるかを分析する方法が「残差分析」。

１. 残差分析
-----------
残差とは「観測値−期待値」のことであり、残差分析を行うことで期待度数と観測値のずれが特に大きいセルを知ることが出来る

残差分析を行う際に使用するのが「調整済み標準化残差」であり、それを正規近似して 𝑝 値を計算する

```math
調整済み標準化残差=\frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}\cdot(1 - n_{i\cdot}/N)(1 - n_{\cdot j}/N)}}
```
　　※𝑂は観測度数、𝐸は期待度数、𝑛は行または列の観測値の合計値、𝑁が観測値の合計値


2. 調整済み標準化残差の詳細
-----------
調整済み標準化残差を算出するには、標準化残差を計算する必要がある。
標準化残差とは残差を標準偏差で割ったもので、近似的に正規分布𝑁(0,𝑣𝑖𝑗)に従うことが知られている

```math
標準化残差=\frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}}
```
```math
\upsilon_{ij}=(1 - n_{i\cdot}/N)(1 - n_{\cdot j}/N)
```

調整済み残差というのは、標準化残差とその分散を用いて標準化変換を行ったもの

```math
調整済み残差=\frac{e_{ij}}{\sqrt{\upsilon_{ij}}}
```
したがって調整済み残差の分布は、近似的に平均0,標準偏差1の標準正規分布としてP値を算出できる


３. Excelを使用した算出方法
---------------------------------------

|  | B1 | B2 | 合計 |
|:-:|:-:|:-:|:-:|
|  A1 | X11  | X12  |  a1 |
|  A2 | X21  | X22  |  a2 |
|  合計 | b1 | b2  | N  |


①クロス集計表の行合計の構成比率を計算する

|  | B1 | B2 | 合計 |
|:-:|:-:|:-:|:-:|
|  合計 | b1/N  | b2/N  | 1  |

②周辺和の積を総数で割って期待度数を算出する

|  | B1 | B2 | 合計 |
|:-:|:-:|:-:|:-:|
|  A1 | a1×b1/N  | a1×b2/N  |  a1×1 |
|  A2 | a2×b1/N  | a2×b2/N  |  a2×1 |

③調整済み標準化残差を算出する

 調整済み標準化残差 = (観測度数-期待度数) / {期待度数 ×（行の周辺和/総数）×（列の周辺和/総数）}

④NORM.S.DIST関数を使用して有意確率（P値）を算出する

　ノーマル・スタンダード・ディストリビューション
　P値 = NORM.S.DIST(ABS(調整済み標準化残差),TRUE)


４. 有意確率（P値）
---------------------------------------
上記で算出された有意確率（P値）が事前に決めた有意水準（誤判断リスクの上限）より低い場合に
そのセルがカイ二乗検定の有意な検定結果に寄与していると判断できます。


References
---------------------------------
統計WEB
Excelで学ぶ 実践ビジネスデータ分析
JavaScriptで親クラスのメソッドを呼び出す方法

#前提

Javaだと親クラスのhogeメソッドを
`super.hoge`って感じで呼び出せるけど
Vanilla.JSはどーすんのって話。
ECMAScript2015なんて知りません。
なお、Vanilla.JSにクラスの概念がないことは知ってます。

#こうすればいい

```javascript:main.js

function SuperClazz() {};
SuperClazz.prototype.hoge = function(param) {
	console.log("SuperClazz hoge: " + param);
};

function SubClazz() {
	SuperClazz.call(this);
};

SubClazz.prototype = Object.create(SuperClazz.prototype);
SubClazz.prototype.constructor = SubClazz;

SubClazz.prototype.hoge = function(param) {
	// ↓これ
	SuperClazz.prototype.hoge.call(this, param);
	console.log("SubClazz hoge: " + param);
};

// 実行
const subClazz = new SubClazz();
subClazz.hoge("I Love Vanilla JS");
```
#実行

```
C>node main
SuperClazz hoge: I Love Vanilla JS
SubClazz hoge: I Love Vanilla JS
```
はいOK
form_forのsubmitへクラス名を設定する

##はじめに
フリマアプリ作成演習において分からなかったことを備忘録として登録しておく。
form_forによりフォーム作成した際に、テキスト部は開発者ツールよりIDを調べるがsubmitボタン部は普通にclass名を指定するようだ。

##submitへのクラス名の設定方法

```
<% f.submit 'button', class: "hoge" %>
```

これだけ。
kernel update後VirtualBoxが使えなくなった場合

# Virtual box show error after kernel update :(

```
The vboxdrv kernel module is not loaded. 
Either there is no module available for the current kernel
```


```
C:\home\funa> sudo /sbin/vboxconfig
```

```
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
vboxdrv.sh: failed: Look at /var/log/vbox-setup.log to find out what went wrong.

There were problems setting up VirtualBox.  To re-start the set-up process, run
  /sbin/vboxconfig
as root.  If your system is using EFI Secure Boot you may need to sign the
kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load
them. Please see your Linux system's documentation for more information.
``` 

I reinstalled Virtualbox and it worked :+1:

```
sudo apt-get install --reinstall virtualbox
```

I also checked my logs :frowning2:
えらーろぐ（長い）

```
Building the main VirtualBox module.
Error building the module:
make V=1 CONFIG_MODULE_SIG= CONFIG_MODULE_SIG_ALL= -C /lib/modules/5.8.0-kali1-amd64/build M=/tmp/vbox.0 SRCROOT=/tmp/vbox.0 -j8 modules
make[1]: 警告: 副次 make で -j8 を強制指定しました: jobserver モードをリセットします.
make -C /usr/src/linux-headers-5.8.0-kali1-amd64 -f /usr/src/linux-headers-5.8.0-kali1-common/Makefile modules
make -f /usr/src/linux-headers-5.8.0-kali1-common/scripts/Makefile.build obj=/tmp/vbox.0 \
single-build= \

In file included from /usr/src/linux-headers-5.8.0-kali1-common/include/asm-generic/percpu.h:7,

make[3]: *** [/usr/src/linux-headers-5.8.0-kali1-common/scripts/Makefile.build:286: /tmp/vbox.0/linux/SUPDrv-linux.o] エラー 1
make[3]: *** 未完了のジョブを待っています....
make[2]: *** [/usr/src/linux-headers-5.8.0-kali1-common/Makefile:1768: /tmp/vbox.0] エラー 2
make[1]: *** [/usr/src/linux-headers-5.8.0-kali1-common/Makefile:185: __sub-make] エラー 2
make: *** [/tmp/vbox.0/Makefile-footer.gmk:117: vboxdrv] エラー 2
```


Unfortunately if you need to recompile, check some articles.
https://www.kali.org/docs/development/recompiling-the-kali-linux-kernel/
https://cpoint-lab.co.jp/article/201903/8784/

Thx! :smiley:
Hough変換のアルゴリズム


# はじめに
画像内の直線（道路の白線など）検出には、今回紹介するのはHough変換、またはその発展的手法が使われることがあります。Hough変換とは画像の中から直線や円を見つけるための最も基本的なアルゴリズムの1種で[OpenCV](https://docs.opencv.org/3.4/d9/db0/tutorial_hough_lines.html)などにも関数が実装されています。

Hough変換のアルゴリズムについて勉強したので、簡単にまとめようと思います。

# 直線検出
左下図のような2値化（エッジ抽出）された画像上で、直線を探します。
これは、右下図のようなxy平面上の点群から、直線を探すことと同じですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/cd96d90d-fd9e-096f-30e5-a30186c7adce.png)


# 直線方程式の変換
上記の問題を解くために、まず直線の方程式について考えてみます。二次元平面上の直線は$y=ax+b$で表すことができます。また、$y=ax+b$の直線が点$(x_i,y_i)$を通る場合、この直線は$y_i=ax_i+b$を満たす必要があります。左下図のようなイメージです。**そして、点$(x_i,y_i)$を通る直線方程式のa,bを変数として右下図のようにab平面の上にプロットすると1本の直線になります。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/7d143d46-0cb0-cb1d-e1d8-c5b5540b1fd0.png)


これを**複数の点に適用**してみると、右下図になります。そして、右下図のab平面について考えてみると、例えばab平面上で2つの直線が交差している点は「そのa,bにより、xy平面上の2つの点を通る直線が引ける」という意味を持っていることが分かります。

同様に、右下図のように4つの直線が交差している場合は、そのa, bを持つ直線はxy平面上で4つの点を通るということです。
**つまりab平面上での直線の密度を調べることで、x, y平面上で、あるa,bのパラメータを持つ直線が通る点が何点あるかを知ることができます。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/748ba07e-cb68-8775-a368-064165073319.png)


# 多数決原理
直線を検出するためにab平面上での直線の密度を調べていきます。**非常にシンプルな手法で、左下図のように格子を作ってその中を通る直線をカウントするだけです。**
この格子の幅は大きすぎると分解能が低くなってしまい、小さすぎると誤検知の原因となるので慎重に決定する必要があります。
※このような方法を用いることから、Hough変換は投票と多数決原理による手法と言われています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624261/2f37fa9a-5082-3a09-cfef-9f2d3d8477e4.png)


※実際には、傾きaが∞の直線も扱えるように極座標系でHough変換を考えます。また、同様の考え方で、直線ではなく楕円検出のHough変換なども存在します。


# 参考
[Hough変換-wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%95%E5%A4%89%E6%8F%9B)

# 最後に
最後まで読んで頂きありがとうございました。
Java static

#【Java static】

##staticメソッド

このメソッドは、あるクラスのどのインスタンスから呼ばれても処理内容が変わらない。
staticメソッドは、インスタンス化による影響を受けない。

クラス名.メソッド名の形で、インスタンスなしで呼び出せる。
Javaのmainメソッドには、static（最初だから）が必ず必要である。

##非staticメソッド

staticを使わない変数は、クラスをインスタンスしないと使えない。
→非static変数

##変数

・クラス変数　クラス内　グローバル変数
→インスタンス全て（クラスから作られた）で共有される。

・インスタンス変数　インスタンス固有　ローカル変数
→インスタンス1個の中だけで使われる。
VSCode Live Shareのみでリモートペアプロするメリット・デメリット

評判のVSCode Live Shareでリモートペアプロをしてみたので感想など。
やり方などは紹介記事が他にたくさんあるので省略します。

## 環境
自分: Windows 10（ホスト）
相手: Mac
Share Audio(音声チャット)も使用

### 使用プラグイン
[Live share](https://visualstudio.microsoft.com/ja/services/live-share/
)
[Browser preview](https://marketplace.visualstudio.com/items?itemName=auchenberg.vscode-browser-preview)
[Auto import](https://marketplace.visualstudio.com/items?itemName=steoates.autoimport)
他は関係なかったので省略

## Zoomなどでのペアプロと比較した場合のメリット・デメリット

### メリット
◎ 共有範囲がVSCode内に絞られるため、うっかり通知ポップアップやデスクトップ、ブックマークなどが見える可能性がない
◎ お互い同時に編集できるので、ドライバーとナビゲーターの交代がとてもスムーズ（デメリットでもある）
○ ゲスト側の環境構築が楽
○ お互いのキーバインドなどの設定を合わせる必要がない
○ カメラが最初から選択肢にないので、見た目を気にしなくていい
・ 音質も悪くはない（MS teamsだと何故かmac相手は音質悪かったりするので）
・ ブラウザプレビューもシェアできるので、動作確認の画面共有も問題なし（ブラウザ依存は除く）

### デメリット
× 画面共有はないので、相手の環境でのみ起こっている症状を伝えるときに不便（auto importの候補が出てこないなど）
× チャットはあるがテキストのみで画像が送れない
△ お互い同時に編集できるので、役割分担が曖昧になりがち
△ 音質は悪くないが、ノイズキャンセリングも甘いのか周囲の雑音が入りやすい気がする
△ Undo/Redoの履歴がホストとゲストで共通
・ワークスペース単位のセッションのため、複数のプロジェクトをまたげないかも（未確認）

## ツール問わずリモートペアプロのメリット・デメリット

### メリット
☆ 自宅作業で気が散りやすい人にとっては、共同作業による集中力アップの恩恵が非リモートより大きい

### デメリット
× 相手が見ているものがわかりづらく、場所の説明がやや手間（「ここ」は禁句）
△ 相手の顔が見えないので、非リモートの場合より思考の垂れ流しを意識する必要がある

## まとめ
個人的にはLive Shareを使わずにペアプロするよりずっとやりやすい。
画面共有と併用するべきかどうかについては正直どちらでも。
いずれにせよ、リモートワークで寂しいとか集中できないという声も聞こえる昨今、リモートペアプロがもっと流行って欲しいです。

## 参考
[Visual Studio Live Shareで始める快適なエンジニア間コミュニケーション](https://qiita.com/mh4gf/items/8f072b2faabba90937d3)
　VS Live ShareのUIが若干分かりづらかったので、初期設定時の参考にさせてもらいました
[Visual Studio Live Share でリモートペアプロができるか試してみた](https://qiita.com/oukayuka/items/fc5ea8878236a7fad50a)
　2年前の記事ですが、pros/consともに今もあまり変わっていません
[ついにJetBrains系IDEでペアプロができるようになりそう](https://qiita.com/yuichi_sano/items/1be6b6ee1add5a39a31a)
　二人ともJetBrainsユーザなのですが、本業の使用言語が違うためIDEが合わず今回は見送り
ContextからStartActivityする際の注意

以前KudanARライブラリを使用したKudanARアプリをリリースしました。
[Xamarin.FormsでKudan ARを試してみる](https://qiita.com/takapi_cs/items/581654f38ddb06a8e81c)

そのアプリのテスト環境として使用していたAndroid8.0では発生しなかったが、Android9.0だと発生するエラーがありました。
少し調査したので軽くまとめたいと思います。



# 先に結論
Contextの実体には`Application Context`、`Activity Context`があります。
実体を把握した上で使用しよう。



# 現象
まずは、下記が確認できたエラーメッセージの内容です。

```
Android.Util.AndroidRuntimeException: 'Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?'
```

どうやら下記の`StartActivity`実行時にエラーが発生していることがわかりました。

```C#
// Androidバージョンによってはエラーが発生する書き方
var context = Android.App.Application.Context;
using (var intent = new Android.Content.Intent(context, typeof(MarkerARActivity)))
{
    context.StartActivity(intent);
}
```


# 原因
Contextと一言に言っても、実体が異なる場合があることを把握しないまま使用したことが原因です。



# なぜアプリリリース前に気づけなかった？
KudanARライブラリを使用すると、エミュレータで動作確認ができなくなる仕様があります。
また、私が持っている一番新しいAndroidバージョンは8.0です。
よって、他のAndroidバージョンでの挙動を確認できなかったため、リリース後に気づいた次第です。
言い訳終了。



# エラー対処方法
Xamarinのテンプレートソリューションから、空のActivityを呼び出すだけのアプリを作成し、動作を確認しました。
対処方法にはいくつかあるようです。

- `context = Android.App.Application.Context;`を使う場合
    - Contextの実体は`Application`
    - Intentにフラグを追加して対応
        - `intent.SetFlags(ActivityFlags.NewTask);`
- `context = (Context)Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity;`を使う場合
    - Contextの実体は`Activity`
    - NuGetから`Plugin.CurrentActivity`をインストールする必要あり
    - Intentへのフラグ追加は必要なし
- `context = MainActivity.Context;`を使う場合
    - Contextの実体は`Activity`
    - `public static Context Context { get; private set; }`のような適当な静的プロパティをMainActivityに用意する必要あり(OnCreateでthisの代入を行っておく)
    - Intentへのフラグ追加は必要なし


下記の記事が参考になりました。
[Androidの勉強：Contextについて](https://qiita.com/iduchikun/items/34b3ae26cfc438e7e5dc)



# 最終的な実装
フラグ設定処理を追加して行数を増やすのは避けたかったので、対処方法の2番目に挙げた方法で実装しました。

```C#
// 正常に動作する書き方
var context = (Context)Plugin.CurrentActivity.CrossCurrentActivity.Current.Activity;
using (var intent = new Android.Content.Intent(context, typeof(MarkerARActivity)))
{
    context.StartActivity(intent);
}
```



# まとめ
Contextの実体には`Application Context`、`Activity Context`があるので、実体を把握した上で使用しよう。
Contextの取得には、`Plugin.CurrentActivity`を使用するのが安定。
iOSDC2020初参加して

## iOSDC参加しました

今回自分はiOSDC初参加しまして、参加した記事を書くまでがiOSDCだということで

あまりまとまった内容はかけないですが、とりあえず感想だけでもと思い書いています。

## iOSDCとは

iOSDCは、iOS周辺技術に関わるエンジニアが、技術的なノウハウを共有するためのイベントです。

2016年から開催されていて今年で４年目のようです。

[iOSDC2020公式サイト](https://iosdc.jp/2020/)

今年は初のオンライン開催でした。

## ノベルティの量

下世話な話ですがノベルティの量すごい！

スマホスタンドからマスクケースからお水まで。

色々とあってすごいなーと思いました。

## 参加しての感想

本題の参加しての感想ですが、

**いや〜楽しかった！**

自分はエンジニアとしてまだまだで、正直聴きながらだと分からずに

タイムシフトで見返してやっと分かる、みたいなものもたくさんありました。

ただ、これは自社の別の現場で使えそうだな〜とか

自分自身試してみたい技術やそれを使って作りたいものも発見というか気づきを得れてとても有意義なものでした！

あとは、スピーカーの皆さんのスライド作るの凝っていたり、真面目過ぎずにクスッとするような作りのものもあって

発表資料としての参考にもなりました。

本当にお疲れ様でした！

もちろん、このカンファレンスを開催してくださった方々もお疲れ様でした！

## さいごに

まだまだ、みれていない視聴させていただいたのに、フィードバックできていないトークもありますので

そちらにフィードバックを返したり、発表資料をTwitter等で上げていただけているので資料まとめみたいな記事を

自分用に、備忘録的にまた上げたいなと思います。（トークで気になった記事なども）

勢いで書いているので拙い文章がさらに拙く拙く拙くネストしていっていますが

自分のiOSDC Japan 2020　はいったんこれで区切りとします。
第9回 パケットトレーサーのファイアウォール機能

ネットワークの自学ツールで使用するパケットトレーサーには**ファイアウォール機能**も搭載されております。初めて使う機器でしたが、これまでに**SSG**,**Fortigate**,**Paloalto**など主要なファイアウォールでの設定変更をしているので、現場での経験を生かして最後まで構築することができました。

## 作成環境
<img width="500" alt="mojikyo45_640-2.gif" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/1b159725-791d-0a4e-9a21-746767cc3dda.png>


目的:TrustにあるPCからDMZにあるサーバーに向かってping疎通を行えるようにする

## 投入コンフィグ

```ruby:L3スイッチ
!
interface FastEthernet0/1
 switchport access vlan 192
 switchport mode access
 switchport nonegotiate
!
interface GigabitEthernet0/1
 switchport access vlan 172
 switchport mode access
 switchport nonegotiate
!
!
interface Vlan172
 ip address 172.16.10.1 255.255.254.0
!
interface Vlan192
 ip address 192.168.10.254 255.255.254.0
!
router ospf 1
 log-adjacency-changes
 passive-interface Vlan192
 network 192.168.10.0 0.0.1.255 area 0
 network 172.16.10.0 0.0.1.255 area 0
```

```ruby:ASA(ファイアウォール)
interface GigabitEthernet1/3
 nameif Trust
 security-level 80
 ip address 172.16.10.2 255.255.254.0
!
interface GigabitEthernet1/4
 nameif DMZ
 security-level 40
 ip address 11.10.10.2 255.255.254.0
!
class-map TEST
 match default-inspection-traffic
!
policy-map TEST2
 class TEST
  inspect icmp 
!
service-policy TEST2 global
!
router ospf 1
 log-adjacency-changes
 network 172.16.10.0 255.255.254.0 area 0
 network 11.10.10.0 255.255.254.0 area 0
!
```

```ruby:ルーター
interface GigabitEthernet0/0
 ip address 192.168.20.254 255.255.254.0
!
interface GigabitEthernet0/1
 ip address 11.10.10.1 255.255.254.0
!
router ospf 1
 network 11.10.10.0 0.0.1.255 area 0
 network 192.168.20.0 0.0.1.255 area 0
```

## 結果
<img width="480" alt="mojikyo45_640-2.gif" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/5eed006e-3a46-3e6d-c0a1-8a610f0a2d85.png>

PC⇒サーバー1(192.168.20.1)
PC⇒サーバー2(192.168.20.2)
それぞれへのpingが疎通できたので成功です。

## ping疎通不可の場合、よくある見落としポイント
※デフォルトゲートウェイにアドレスを振り忘れる
![デフォルトゲートウェイへのアドレスは必ず行う.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/2faf0705-e2ae-431a-bbc9-5f4a74514bf8.png)



アドレスを設定しないとパケットの宛先がわからないのでpingが届かなくなります。
必ず届け先にはアドレスを設定しましょう。

参考: [Cisco Packet Tracer(パケットトレーサー)を使いこなそう！](https://hetare-nw.net/archives/1426)
参考: [ネットワークエンジニアとして CISCO ASA技術解説](https://www.infraexpert.com/study/study32.html)
参考: [Cisco ASA シリーズファイアウォールCLIコンフィギュレーションガイド](https://www.cisco.com/c/ja_jp/td/docs/sec/firewall/asa5500-xnext-generationf/cg/004/asa-firewall-cli/mpf-inspect-maps.html)
VSCodeで拡張機能のホストが予期せずに終了しましたとでるエラーについて

ここ最近、VSCodeで"拡張機能のホストが予期せずに終了しました"　
のエラーが頻発しているせいで、作業が出来ないので調べてみた。

#環境
VSCode バージョン: 1.49.1
プラグイン  LiveSassCompiler  LiveServer  HTMLHint


#試したこと
原因と思われる拡張機能を一つずつ虱潰しにアンインストールした

#解決策
HTMLHintをアンインストールしたら直った


#原因
他サイトでも報告があったが、VSCodeのアップデートが原因らしい。
LiveSassCompilerとLiveServerが依存関係にあり、
HTMLHintとバッティング可能性が高い。

#結果
HTMLHintが必然的に使えなくなるため他の拡張機能で補うしかないが、
代用出来そうなプラグインは見つからなかったので
今のところは諦めるか、VSCodeをダウングレーする方法はなさそう。
辞書について

###1.はじめに
---
前回配列について説明したので、これまた重要な要素である辞書について説明していこうと思います。前回の配列について解説した記事のURLは以下になります。
(URL：https://qiita.com/0901_yasyun/items/6cc4c0175082e9b63d31)

###2.辞書とは
---
辞書とは、配列と同様に複数のインスタンスを格納できるコレクションの１種です。Swiftの辞書は**Dictionary型**ですが、配列と同様、構造体として実現されており、変数への代入などの動作によって、必要に応じて新しいインスタンスが作成されます。
１つの辞書には、キーと値の組を複数個格納でき、キーから値を検索して参照、格納を行うので、１つの辞書に含まれるキーはすべて異なります。
キーに対応する値は１つですが、異なるキーに同じ値が設定されていても問題はありません。
ただし、キーと値はそれぞれ同一の型で統一されている必要があります。

```Swift:
var y = ["Swift":2014, "Objective-C":1983]
```

この例ではString型をキーとし、Int型を値とするエントリを２個もった辞書インスタンスを生成しています。

型のみを宣言する場合は、次のように記述します。

```Swift:
var y : [String : Int]
```

次のように記述すると、String型をキーとし、Int型を値とする辞書のインスタンスが代入されますが、格納されている要素は０個です。

```Swift:
var y = [String : Int]()  // イニシャライザの呼び出し
```

空の辞書を表すには[:]と記述します。変数を型宣言し、空の辞書を代入するように記述しても、先ほどと同様な初期化が行われます。

```Swift:
var y : [String : Int] = [:]  // 型を指定した変数に空の辞書を代入
```

なお、辞書型はパラメータ付き型指定で次のように記述することもできます。

```Swift:
var y : Dictionary<String, Int>  // [String:Int]と同じ意味
var y : Dictionary<String, Int>()  // イニシャライザの呼び出し
```

###3.辞書へのアクセス
---
すでに要素をもつ辞書型の定数や変数に対し、キーを指定して値を取り出すことができます。そのために、配列にアクセスするときと同じように[]を使い、[]の中にキーを指定します。ただし返り値は**オプショナル型**で、存在しないキーを指定するとnilが返ってきます。
if-let文を使用した次に例を見てください。

```Swift:
var y = ["Swift":2014, "Objective-C":1983]
if let v = d["Swift"] { print(v) }    // 存在するキーなので"2014"と出力
if let v = d["Ruby"] { print(v) }     // 存在しないキーなので出力なし
```

この例では辞書は[String:Int]型なので、返される値はInt?型です。
辞書に新しい値を追加するには、[]の中にキーを指定して値を代入します。
また、既に存在しているキーの要素を削除するには、そのキーを指定してnilを代入します。以下の例を見てください。

```Swift:
var e = ["Ruby":1995]
print(e)   // ["Ruby": 1995]と出力
e["Java"] = 1995
e["Python"] = 1991
print(e)   // ["Java": 1995, "Ruby": 1995, "Python": 1991]と出力
e["Java"] = nil
print(e)   // ["Ruby": 1995, "Python": 1991]と出力
```

ここまでの例ではキーが文字列で、値が整数でしたが、他の型でももちろん大丈夫です。
しかし、Swiftの基本的なデータ型の中で辞書のキーとして利用できるものは、各種整数型、実数型、Bool型、文字列、文字などです。実数もキーにできますが、実数値には誤差がつきものなので注意が必要です。

###4.辞書の比較
---
辞書同士を比較する際には、演算子「==」と「!=」が使えます。互いに同じキーの集合を持ち、同じキーに等しい値が割り当てられている辞書を等しいと判断します。以下の例を確認してください。

```Swift:
var a = ["one":"I", "two":"II", "three":"III"]
let b = ["two":"II", "one":"I"]
a == b   // false
a["three"] = nil
a == b   // true
```

###5.辞書から要素を取り出す
---
辞書は付属型としてのキーを表すKey型、値の型を表すValue型を持ちます。
またキーだけからなるコレクション、値だけからなるコレクションを提供するプロパティがあり、それぞれの型はKeys型、Values型となっています。
辞書自体もコレクションなので、要素を表す型であるElement型、添字の型であるIndex型を持っています。Element型は次のタプルの別名となっています。

```
(key: Key, value: Value)
```

for-in文を使って、辞書から要素を１つずつ取り出すことができます。その際、取り出されるのが上記のタプルです。以下の例を確認してください。

```Swift:
var dic = [String: Int]()
var n = 1
for ch in "ありがとう" {
    dic[String(ch)] = n; n += 1
}

print(dic)  
for t in dic {  // タプルで取り出す
    print("\(t.key)=\(t.value)", terminator:" ")
}

print()
for (k, v) in dic {  // キーと値を取り出す
    print("\(k)=\(v)", terminator:" ")
}

print()
```

これを実行するとこのような結果が得られます。

```
["が": 3, "と": 4, "り": 2, "う": 5, "あ": 1]
が=3 と=4 り=2 う=5 あ=1
が=3 と=4 り=2 う=5 あ=1
```

この結果より、辞書の要素が取り出される順番は、実行するたびに異なるのが分かります。
この仕組みについて解説すると少し長くなってしまうので、ひとまず取り出される順番はランダムだということを覚えておいてください。
気になる方は、**ハッシュ値**などについて調べれば仕組みが分かると思います。

###6.おわりに
---
今回は辞書の基本的な仕組みと主な使い方について解説しました。
今回の記事ではプロパティやメソッドについて、詳しく説明することができなかったので、いつかまた説明する記事が書ければと思います。
読んでくれた方、ありがとうございました。
[PHP] ローカルサーバーの立てかた

# 概要
ここまでphpをterminalで走らせていたが、実際の使用ではブラウザ上で処理、表示を行うケースが圧倒的に多いのでローカルサーバーの建て方をメモる。

### プログラム

```PHP:greet.php
<?php
  date_default_timezone_set('Asia/Tokyo');
  $now = date("Y/m/d H:i:s:");
  $now_hour = (int)date(G);

  function aisatsu($greet) {
    if ($now_hour >= 6 && $now_hour < 12) {
      $greet = 'おはようございます';
    } elseif ($now_hour >= 12 && $now_hour < 18) {
      $greet = 'こんにちは';
    } else {
      $greet = 'こんばんは';
    }
    return $greet;
  }

  $aisatsu = aisatsu($greet)
 ?>

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>タイトル</title>
    </head>
    <body>
        <p><?php print $aisatsu; ?></p>
    </body>
</html>
```

```
  date_default_timezone_set('Asia/Tokyo');
```
で取得した現在時刻に合わせて「おはよう」「こんにちは」「おやすみなさい」のどれか一つを表示するプログラム。

### webサーバーを立てる
##### 1. phpビルトインのローカルサーバーを起動する
実行したいphpファイルが入っているディレクトリまでterminalで移動し、下記を実行する
```
$ php -S localhost:8000
```
右端の数値は 8000 にしておく

##### 2. ブラウザで表示する
検索バーに
```
http://localhost:8000/greet.php
```
と打つだけ

###表示結果
```
こんばんは
```
AWS CDKを使ってlambda layerをデプロイしてみた

# はじめに
自己研鑽の一環でAWS CDKを使っているのですが、lambda layerをデプロイするようなサンプルがあまりないように感じたので、自分で試行錯誤しながらやってみました。

# 開発環境
 - aws-cdk：1.58.0  
 - cdk使用言語：typescript

# 前提として
cdkを使えるような環境のセットアップが出来ている前提で記載していきます。
私は以下の記事を参考にさせていただきました。
https://dev.classmethod.jp/articles/aws-cdk-101-typescript/

# ディレクトリ構成
本記事のディレクトリ構成は以下のようになっています。

```
├─backend
│   └─ src
│     ├─function
│     │  └─sample
│     └─layer
│    　　└─SharedLayer
│    　　　　└─nodejs
│   　　　　　　└─node_modules
└─cdk-stack
 　   ├─bin
   　 ├─lib
  　  └─test
```

# 定義してみる
さっそくですがlambda layerを定義していきます。

```typescript:cdk-stack/lib/cdk-stack.ts
// lambdaとlambda layerを定義するためのライブラリ
import { AssetCode, Function, Runtime, LayerVersion } from '@aws-cdk/aws-lambda';

// lambdaLayerの定義
const nodeModulesLayer = new LayerVersion(this, 'NodeModulesLayer',
  {
    code: AssetCode.fromAsset('../backend/src/layer/SharedLayer'),
    compatibleRuntimes: [Runtime.NODEJS_12_X]
  }
);

```

以上です。
たったこれだけで定義が出来るのはすごいですね。

ポイントはbackendのディレクトリ構成です。
lambda layerはnodejs/node_modulesのディレクトリ構成にする必要があり、cdk-stack.tsではcodeにnodejs以下を含むディレクトリを指定しています。

# lambdaに適用してみる
先ほど定義したlayerをlambdaに適用してみます。

```typescript:cdk-stack/lib/cdk-stack.ts
// lambda関数の定義
const sampleLambda = new Function(this, `sample-lambda-function`, {
  code: new AssetCode('../backend/src/function/sample'),
  handler: 'index.handler',
  runtime: Runtime.NODEJS_12_X,
  layers: [nodeModulesLayer],
  functionName: 'sampleFunction'
});
```

上記のようにlayersのキーに配列で定義したlambda layerを記載してあげるだけでOKです。
あとはcdk deployコマンドでデプロイすれば完了です。

# さいごに
やはりプログラミングをする感覚でサーバレスアーキテクチャを構築できるのはyamlで書くより直感的で良いですね。
今後は実務での利用を目指してAPIGatewayのリソースポリシーやIAMロールなどのセキュリティ周りを正しく設定できるように色々調べたいと思います。
react-router-bootstrap で LinkContainers が2カ所以上 Active にするのをなんとかしたいな

# 困った

サイドメニューに設定したLinkContainerとは別に、ヘッダロゴにもトップへのリンクをつけようとしたんだけど、いざロゴをクリックしたらサイドメニューのActiveが消えずに、事前に表示していた場所とトップの2カ所がアクティブになってしまう

# せいかい

Issueを読もう

https://github.com/react-bootstrap/react-router-bootstrap/issues/242#issuecomment-613761912

```js
export const MyMenu = () => {
  const {pathname} = useLocation() // previously imported from 'react-router-dom'
  return (
    <ListGroup key={pathname}>
      <LinkContainer exact to="/path/to/first"><ListGroup.Item action active={false}>First Item</ListGroup.Item></LinkContainer>
      <LinkContainer exact to="/path/to/second"><ListGroup.Item action active={false}>Second Item</ListGroup.Item></LinkContainer>
      <LinkContainer exact to="/path/to/third"><ListGroup.Item action active={false}>Third Item</ListGroup.Item></LinkContainer>
    </ListGroup>
  );
};
```

パスが変わった時点で再度レンダリングすればきれいになるよ、ということらしい

目から鱗
rails チュートリ

Rubyのバージョン番号
ところで、Herokuのデプロイするとき、もしかしたら次のような警告メッセージを目にしたことがあるかもしれません。

###### WARNING:
       You have not declared a Ruby version in your Gemfile.
       To set your Ruby version add this line to your Gemfile:
       ruby '2.1.5'
(これは「Rubyのバージョンを明示的に指定してください」というメッセージですが) 経験的には、本書のようなチュートリアルの段階では明示的に指定しない方がスムーズに進むことが多いので、この警告は現時点では無視してしまった方がよいでしょう。というのも、サンプルアプリケーションでRubyのバージョンを常に最新に保っておくと、多大な不都合に繋がりかねないからです15 。また、本書のサンプルアプリケーションにおいては、ローカルで使っているバージョンと本番環境のバージョンが異なっていても、違いが生じることはほぼ無いでしょう。とは言うものの、次の点は頭の片隅に置いておいてください。それは、仕事でHerokuを使ったアプリケーションを動かす場合はGemfileでRubyのバージョンを明示しておいた方が賢明である、という点です。これによって開発環境と本番環境の互換性を最大限に高めることができるので、(バージョンの差異による誤作動やエラーなどが無くなり) オススメです。
Slackで隔週リマインダーを設定

ほんと毎回忘れるので備忘録も兼ねて。

# 形式
`/remind #チャンネル名 "メッセージ" 開始日 at 時刻 every other 曜日`
# 例
`/remind #開発部 "本日は15時から会議があります。" Sep 21th at 10:00am every other Monday`
### 注意
以下のように開始日を指定しない場合、明日以降の直近の曜日からスタートになります。

`/remind #開発部 "本日は15時から会議があります。" at 10:00am every other Monday`

つまり9/21(月)の07:00にセットし「これで今日の会議をみんな忘れないだろう」と思ってもその日には通知されず、9/28(月)の10:00に初めて通知されます。
Javascriptの基本の書き方④

#はじめに

前回までも物は以下から

[Javascriptの基本の書き方①](https://qiita.com/itou-t/items/66b870ac75c3b1b5bbbd)
[Javascriptの基本の書き方②](https://qiita.com/itou-t/items/19dfe7bebaf4b7754aae)
[Javascriptの基本の書き方③](https://qiita.com/itou-t/items/ceb68335da4186fbcc43)

##継承
別のクラスから機能を継承して新たなクラスを作成することが可能
(継承元を親クラス,継承先を子クラスと呼ぶ)

```javascript
class　今回作成するクラス名(子クラス) extends 継承元のクラス(親クラス){
  
}
```

##他のファイルにクラスを継承させる方法

・他クラスへのエクスポート
クラス定義の後に記載

```javascript

export default クラス名;
```
defaultエクスポートは1ファイルに１つだけ使用できる。

・別ファイルからのクラスのインポート

```javascript
import 親クラス名 from "./親クラスが所属しているファイル名";
```

##名前付きエクスポート,インポート

１つのファイルで複数エクスポートしたい場合export defaultではなく名前付きエクスポートを使用する

・名前付きエクスポート

```javascript
export　{値の名前}
```

・名前付きインポート

```javascript

import { 値の名前 } from "./ファイル名"
```

,区切りで複数の値を一括でエクスポート,インポートすることも可能


##パッケージの導入
パッケージをimportすることにより外部のプログラムを読み込み使用することができる

```javascript

import パッケージ名 from "パッケージ名"
```
MAMPでmysqlパスワード無しにする方法

mysqlにログインし、パスワードを変更します。

```shell
mysql -u root -p
# mysqlにログイン

SET PASSWORD = password('新しいパスワード');
# '新しいパスワード'を設定
```

この状態では、phpMyAdminからログインできないため、config.inc.phpにそのための設定を追加します。

```shell
mdfind "config.inc.php" | grep "bin/phpMyAdmin/config.inc.php" | xargs code
# config.inc.phpの場所を検索して開く
```

config.inc.phpを'password'で検索すると次のような設定項目が見つかると思います。
パスワード無しを許可する行を追記してください。

```php
$cfg['Servers'][$i]['auth_type']     = 'config';    // Authentication method (config, http or cookie based)?
$cfg['Servers'][$i]['user']          = 'root';      // MySQL user
$cfg['Servers'][$i]['password']      = '';          // MySQL password (only needed
$cfg['Servers'][$i]['AllowNoPassword'] = true;      // パスワード無しを許可
```

これで設定は完了です。MAMP → OpenWebSitePage → Tools → phpMyAdminで、
データベースにアクセスできます。
DCGANでCIFAR10の画像が生成できるか　⇒　できません。

#目的
DCGANでCIFAR10の画像生成を試みている例は沢山ある。
DCGANでMNISTを作成した例は、成功しているものがあると言っていい気がする。
では、難易度が、ぐっと上がるCIFAR10ではどうか？

いくつかのgithubで示されている画像を確認した。

#結果
##結論
**確認した範囲では成功していない。**
(画像を生成することが目的とは限らないし、また、一発で画像が生成できることを想定されているわけではないとは思います。）
以下に例示している画像では、全体は別として、１サンプルの単位でも、これは！、と思うようなものはない。（エポック数は、ここでは示していないが、エポック数の問題ではないだろうと、誰もが思うと考えたため。）
直接は関係しないかもしれないが、GANの方向の処理ではなく、普通のCIFAR10の識別器のレベルで、それほど、物の本質を分析できていないと思うので、この結果は仕方がないと思う。
逆に、そのようなことがGANにできるならば、裏返しとして、識別器の手法になんとか展開されるはずで、そのようなもので、強烈な成果が出ているものを知らない。

##CIFAR10の画像
CIFAR10の画像は、ちょっと、嫌になるぐらい低画質なので、まずは、その情報を共有。
以下です。
（出典：https://github.com/mafda/generative_adversarial_networks_101 ）
![dcgan4b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/62e65379-4e57-73ac-2487-a005f43ab246.png)

⇒すべて、凄く、低画質というか、そもそも、画素数がないので、綺麗ではないが、
ただ、多くのものは、元の画像が想像されるような破綻のない、低画質画像である。
（青い恐竜みたいなのがいますが、これが何かは知りません。）

##DCGANによるCIFAR10生成画像の例１

https://github.com/mafda/generative_adversarial_networks_101 
　
の例

（出典：https://github.com/mafda/generative_adversarial_networks_101 ）

![dcgan4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/3cb8d93d-f997-2d04-3783-67aae762efcf.png)

##DCGANによるCIFAR10生成画像の例２
https://github.com/shaohua0116/DCGAN-Tensorflow 　
の例

（出典：https://github.com/shaohua0116/DCGAN-Tensorflow ）
![dcgan3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/008683ce-19f2-285e-3e5a-959a9a0d76e9.png)

##DCGANによるCIFAR10生成画像の例3
https://github.com/pbcquoc/cifar_dcgan
 　の例

（出典：https://github.com/pbcquoc/cifar_dcgan ）
![dcgan2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/3532ca18-10e6-01bd-35d0-de50df7552a0.png)


##DCGANによるCIFAR10生成画像の例4
https://github.com/4thgen/DCGAN-CIFAR10 　
の例。

(出典：https://github.com/4thgen/DCGAN-CIFAR10 ）
![dcgan1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/40232cb5-9b06-8295-63e9-053e48b58861.png)

#まとめ
特にありません。
コメントなどあれば、お願いします。:candy:

# 補足(20220829)
Stable Diffusion というのが、最近流行っており、Google.colabとかだと誰でも直ぐに試せますか、
そこで生成される写真（画像）の
特に、生き物（人や動物）の様子を見て頂けるとGANの現在の状況がわかると思います。
全然、いい感じで生成できていません。

#関連
[TransGANでCIFAR10の画像が生成できるか　⇒　できません。](https://qiita.com/enoughspacefor/items/57ce23b6ab9257761ea1)
GooglePlayMusicからダウンロードしたmp3をPython使って自動整理した

#はじまり
Google Play Musicが12月末で終了というニュースが発表されました。
購入やアップロードした楽曲はYouTube musicへそのまま移行できるのですが、同サービスもいつ終了になるかわからないので、念のためローカル環境にもバックアップすることに。
楽曲をダウンロードしたところ、全データが同一フォルダ内に一括ダウンロードされる仕様だったので、Pythonを使って「アーティスト名」や「アルバム名」ごとにフォルダ分けを行う事にしました。
私のようなプログラミングのド素人でも、この程度の事はできそうです。

#ダウンロード
楽曲のダウンロードは下記ページに従って行いました。
https://support.google.com/googleplaymusic/answer/1250232?hl=ja

#フォルダ階層
フォルダ階層は以下の通りに設定する事とします。
>Root
├アーティストA
│　　　└アルバム名
│　　　　　　└　楽曲_1.mp3
│　　　　　　└　楽曲_2.mp3　
├アーティストB
├アーティストC

ディレクトリ構成図の記入方法はこちらを参考にしました。
https://qiita.com/paty-fakename/items/c82ed27b4070feeceff6

#mp3のタグ情報を取得
楽曲名、アーティスト名、アルバム名など、mp3に内包されたタグ情報を取得するには`EasyID3`を利用します。
こちらのサイトを参考にさせていただきました。
https://note.nkmk.me/python-mutagen-mp3-id3/

#完成したコード
いきなりですが完成したコードは下記の通りです。

```.py
from mutagen.easyid3 import EasyID3
import os
import shutil
import re

def replace(string):
    return(re.sub(r'[\\/:*?"<>|]+', '-', string))

def arrange_data(mp3_path):
    tags = EasyID3(mp3_path)
    try:
        artistname = (tags['albumartist'])
    except KeyError:
        artistname = (tags['artist'])
    albumname = (tags['album'])
    artistname = replace(artistname[0]).strip()
    albumname = replace(albumname[0]).strip()
    title = os.path.basename(mp3_path)
    artist_dir = os.path.join(globalpath, artistname)
    album_dir = os.path.join(artist_dir, albumname)
    new_mp3_path = os.path.join(album_dir, title)
    if not artistname in artist_list:
        if not os.path.isdir(artist_dir):
            os.makedirs(artist_dir)
            artist_list.append(artistname)
    if not albumname in album_list:
        album_list.append(albumname)
        if not os.path.isdir(album_dir):
            os.makedirs(album_dir)
            album_list.append(albumname)
    try:
        shutil.copyfile(mp3_path, new_mp3_path)
        print(title + " is done.")
    except shutil.SameFileError:
        print(title + " is already exists.")


def data_check(file_list, path):
    for i in file_list:
        if os.path.isdir(os.path.join(path, i)):
            new_path = os.path.join(path, i)
            new_file_list = os.listdir(new_path)
            data_check(new_file_list, new_path)
        else:
            arrange_data(os.path.join(path, i))


globalpath = r"楽曲が入っているフォルダ"
file_list = os.listdir(globalpath)
album_list = []
artist_list = []

data_check(file_list, globalpath)
```

#引っかかったポイント
###KeyError:が発生する
Windowsではファイル名として使えない無効文字`\/:*?"<>|`があるのですが、アーティスト名やアルバム名の中に無効文字を含むものが複数ありました。こちらは`re.sub`を利用して無効文字を`_`に置き換えました。
###ディレクトリpathに空白が入る
アーティスト名やアルバム名の末尾に空白が含まれているものがある場合、実際のフォルダ名とフォルダパスが不一致を起こして、読み込みエラーが発生しました。
こちらは`.strip()`を利用して解決しました。

###feat.問題
アーティスト名が「feat.〇〇」みたいになっていて、アーティスト名での振り分けが難しい楽曲に関してはアルバムアーティスト名を利用しました。アルバムアーティスト名がある楽曲はそれを優先し、ついてないものはアーティスト名を利用します。

#おわりに
無事データを整理する事ができました。多少でもPythonが使えると便利ですね。
楽曲によっては正常に動作しないものがありそうですが、ローカルデータは全て処理できたので良しとします。

ありがとうございました！
Visual Studio Code でpythonの外部ライブラリを自動補完させるようにする

Pythonの勉強がてらメモ

vscode でpython を書いていたら、外部ライブラリが補完されず、開発の効率が悪いので
**外部ライブラリも補完できるようにしたい。**


# 解決方法
setting.json にライブラリが格納されているパスを記載すればOK

## ライブラリのパスを確認
```
 pip3 install ライブラリ名
```

インストールされていたら、

```
Requirement already satisfied: ライブラリ名 in /usr/local/lib/python3.8/site-packages (0.6.3)
```

のように表示されるはず

このパスに格納されているファイルも一応確認

```
ls /usr/local/lib/python3.8/site-packages
```

ライブラリ一覧が表示されたら問題なさそう

# setting.json にパスを記載

### setting.json を開く
```
coomand + shit + p
```

コマンドパレットで、「setting json」　と入力
↓
Open Setting(JSON) を開く

### setting.json にパス追加
```
"python.autoComplete.extraPaths": ["/usr/local/lib/python3.8/site-packages "]
```

これで保存すれば、外部ライブラリも補完きくし、doc にもジャンプできます。
JWE(JSON Web Encryption)は2020年現在も危険なのか?

## 概要

* [JOSEは、絶対に避けるべき悪い標準規格である | POSTD](https://postd.cc/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid/)
* [JSON Web Encryption (JWE) の解説 - Qiita](https://qiita.com/ono_matope/items/938a98fb111a297b68b9)

いくつかの記事でJWEは避けるべき、脆弱性がある。という指摘があるが、これらが議論されていたのは2017年頃だ。2020年においてまだ該当記事の脆弱性が実際に存在するか調査した結果を記録する。私はJWEのエキスパートではないし、RFC-7516を全て読み込んでもいないため間違っている部分があるかもしれない。もしこの調査結果に対してフィードバックがあれば編集リクエストを送ってほしい。

## 結論

現在は脆弱性は修正され、安全なようだ。脆弱性に対応していないライブラリを使っている場合はもちろん危険なので使用しているライブラリが対応されているか調査する必要がある。

## 調査内容

### go-joseの修正

[oss-sec: CVE request: multiple issues in go-jose package](https://seclists.org/oss-sec/2016/q4/319) ここでCVE番号のリクエストと、パッチへのリンクが提供されている。

[Critical Vulnerability in JSON Web Encryption? · Issue #141 · square/go-jose](https://github.com/square/go-jose/issues/141) これはgo-joseライブラリの質問。

https://github.com/square/go-jose/issues/141#issuecomment-286887765 このコメントでその脆弱性は1.1.0で修正されているよ。と書かれている。

## 脆弱性の概要

攻撃の名称は、Classic Invalid Curve Attack.というらしい。

この脆弱性にさらされると、攻撃者はJWE with Key Agreement with Elliptic Curve Diffie-Hellman Ephemeral Static (ECDH-ES)を使用して、送信者が受信者の秘密鍵を取り出すことができるようになってしまうよ、ということらしい。

[Critical Vulnerability in JSON Web Encryption](https://auth0.com/blog/critical-vulnerability-in-json-web-encryption/) ここが詳しい。

## Auth0のAntonioとIETFチームのやりとり

[[jose] Use of ECDH-ES in JWE](https://mailarchive.ietf.org/arch/msg/jose/oGme8BaRErp8qN3PK1gMEBnq2t4/)このメーリングリストでやり取りしている。

IETFの人もCurve Attackについては言及されていないとしながらも、本文は修正することができないため、Errata(正誤表)に記載してほしいとなり、Antonioが正誤表に投稿する旨で決着していました。ただ、[RFC Errata Report » RFC Editor](https://www.rfc-editor.org/errata_search.php?rfc=7516&rec_status=15&presentation=records)この正誤表検索で該当のエントリは見つからないため、投稿されていないか、レビューされていない可能性がありそうだ。

## JWEの利用実績

* KubernetesのDashboardとブラウザ間の通信で実際に利用されている。Kubernetes Dashboardの該当部分はgo-joseが使われている。
Javaに初めて触れてみた③

# Javaに触れてみた
自己満の備忘録になりますのでご容赦ください。

## いろいろ作ってみる
今までの知識を活かして、私が大ファンの広島東洋カープについて機能を作っていきたいと思います。

### ①監督の在任期間を表示する
番号を選択し、配列から取り出す機能にします。

```Test.java
import java.util.Scanner;

class Test {
  public static void main(String args[]) {
    System.out.println("[1]達川監督\n[2]山本監督\n[3]ブラウン監督\n[4]野村監督\n[5]緒方監督\n[6]佐々岡監督\n1〜6の数字を選択してください。");
    Integer number = new Scanner(System.in).nextInt();

    String[] array = {"2000年", "2001年〜2005年", "2006年〜2009年", "2010年〜2014年", "2015年〜2019年", "2020年"};

    System.out.println(array[number - 1]);
  }
}
```

```:ターミナル
[1]達川監督
[2]山本監督
[3]ブラウン監督
[4]野村監督
[5]緒方監督
[6]佐々岡監督
1〜6の数字を選択してください。
４
2010年〜2014年
```

import java.util.Scanner;を書き忘れてしまい、Scannerが使えませんでしたので、注意します。
↓エラー文

```:ターミナル
Test.java:4: エラー: シンボルを見つけられません
    Integer number = new Scanner(System.in).nextInt();
                         ^
  シンボル:   クラス Scanner
  場所: クラス Test
```

### ②４択クイズ
４択から数字を選んで簡単な条件分岐させます。

```Test2.java
import java.util.Scanner;

class Test2 {
  public static void main(String args[]) {
    System.out.println("2019年ドラフト1位の森下選手の出身大学は？\n[1]明治大学\n[2]法政大学\n[3]早稲田大学\n[4]立教大学");
    Integer number = new Scanner(System.in).nextInt();

    if (number == 1) {
      System.out.println("正解です！");
    } else {
      System.out.println("間違いです");
    }
  }
}
```

```:ターミナル
2019年ドラフト1位の森下選手の出身大学は？
[1]明治大学
[2]法政大学
[3]早稲田大学
[4]立教大学
2
間違いです
```

```:ターミナル
2019年ドラフト1位の森下選手の出身大学は？
[1]明治大学
[2]法政大学
[3]早稲田大学
[4]立教大学
1
正解です！
```

### ③４択クイズの応用
間違えたらその選択肢を減らす。

```Test3.java
import java.util.Scanner;

import java.util.ArrayList;
import java.util.List;

class Test3 {
  public static void main(String args[]) {
    List<String> array = new ArrayList<String>();
    array.add("[1]明治大学");
    array.add("[2]法政大学");
    array.add("[3]早稲田大学");
    array.add("[4]立教大学");

    System.out.println("2019年ドラフト1位の森下選手の出身大学は？");
    System.out.println(array);
    Integer number = new Scanner(System.in).nextInt();


    if (number == 1) {
      System.out.println("正解です！");
    } else {
      array.remove(number - 1);
      System.out.println("間違いです");
      System.out.println("番号を選び直してください。");
      System.out.println(array);
    }
  }
}
```
import java.util.ArrayList;
import java.util.List;
を記入していないとエラーが出るので注意したいと思います。

```:ターミナル
2019年ドラフト1位の森下選手の出身大学は？
[[1]明治大学, [2]法政大学, [3]早稲田大学, [4]立教大学]
1
正解です！
```
↑正解のパターン

```:ターミナル
2019年ドラフト1位の森下選手の出身大学は？
[[1]明治大学, [2]法政大学, [3]早稲田大学, [4]立教大学]
2
間違いです
番号を選び直してください。
[[1]明治大学, [3]早稲田大学, [4]立教大学]
```
↑間違えたパターン
2の法政大学が表示されなくなりましたね。

とりあえず今回の記事はこんな感じで終わります。
この機能の改善点
①[[1]明治大学, [2]法政大学, [3]早稲田大学, [4]立教大学]みたいにターミナルに配列の中身を表示させる時に[]を表示支えないようにする。
②選び直してください。の表示が出たら数字を入力できるようにする。多分繰り返し処理でできると思う。
③問題を増やす。
④問題をランダムで出題できるようにする。
⑤答えをランダム表示にできるようにする。
今思いつく限りではこのような感じですね。次回の記事で書いていきたいと思います。

まだまだJavaのことはわかりませんので、頑張っていきたいと思います。
iOSDC2020に参加しました

どうも、ねこきち([@nekokichi_yos2](https://mobile.twitter.com/nekokichi1_yos2))です

日本最大のiOSカンファレンス、iOSDC、に初参加しました。

iOSDC2020では、ニコ生上で開催され、地方在住の僕にはとてもありがたかったです。

![スクリーンショット 2020-09-21 11.18.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/7fdd3475-e9f1-801b-cc8d-98757341b01d.png)

また、アーリーバード枠の参加特典も
- iOSDCのパンフレット
- 有名IT企業のステッカー
- 有名IT企業のパンフレット
と充実してて、ありがたかったです。
![スクリーンショット 2020-09-21 17.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284464/04b9a62b-91ed-cfac-69a9-7811b0b08e0b.png)

初めてiOSDCに参加して、色々と感じたことを書き連ねていきます。

## 新たな知見を得られた

iOSのカンファレンスなので
・Storyboardの活用法
・SwiftUIとUIKitについて
・iPadのマルチウィンドウ
iOSアプリ開発で利用できる技術を知ることができます。

新しい技術を知ろうと思ったら、自分でググる必要がありますが、カンファレンスや勉強会ではスピーカーが発表してくれるので、ググる手間が省けます。

しかも、現役のiOSエンジニアの方々が最新の知見を共有してくれるので、書籍やネット記事よりも勉強になります。

また、スピーカーが丁寧に解説してくれるますから、気軽に新/未知の技術を学ぶことが可能です。

他にも、
・アーキテクチャ
・数学を用いたプログラミング
・CI/CDの知見、検証結果
・ビルド、テストの方法
などの様々なテーマが用意されており、Swift以外の言語を扱う方でも学べるセッションが用意されています。

当日の発表内容は、スライドやYouTube動画で公開されるので、見逃しても、何度でも見返すことができます。

## 高度なスキルがなくても学べる

iOSDCのセッションを理解できるか不安でしたが、全く心配ありませんでした。

もちろん中には、
・普段は滅多に使用しない処理
・ソースコードが実行される背景
などの難しいセッションもありました。

ですが、 iOSDCの開催中にセッション内容を手元で試さなくても、発表者らが丁寧に解説してくれるので、聞き流すだけでも大体は理解できます。

初心者やベテランの方まで幅広い開発者らが学べるセッションが多く、参加するだけでも得したと言えます。

## エンジニアが何を意識して開発してるかがわかった

スピーカーは当然、発表内容を事前に検証して、どうなったかを知っています。

そして、スピーカーが検証した過程を解説するとき、どのようにソースコードを設計したのかを話してくれました。

例えば、
・ViewとModelを分ける
・Delegateでイベントを投げる
・関数をオーバーライドする
など。

つまり、セッション内容だけでなく、セッション内容を実装/検証する際にソースコードで意識したことを学べたのです。

ViewControllerでViewの表示とデータのロジックを一緒に書く僕でしたが、どのスピーカーもViewとModelでViewの表示とデータのロジックを分けることを意識してるんだって知れました。

iOSDCに限らず、エンジニアの話を聴くと、エンジニアの考えを知ることができるので、積極的にカンファレンスに参加しようと思えました。

## スピーカーになれる自信を得られた

独自で実装/発見した技術を紹介、の他に、既存技術をわかりやすく解説、するセッションも多数ありました。

スピーカーとして情報を発信することは、高いスキルがなければできないと思いがちです。

しかし、レベルの高い内容でなくても
・仕様、実装方法をわかりやすく解説
・10個のアプリを開発して得たこと
・iOSアプリで〜〜を実装してみた
の内容で全然構いません。

なぜなら、
・とある技術に関するまとまった情報が欲しい
・新しいフレームワークの使い方が知りたい
・iOSアプリで〜〜は機能できるのか
など、様々なニーズがあるからです。

事実、
・まだまだ情報が少ないSwiftUI
・よく使うStoryBoardの活用方法
のセッションは、とても興味深い内容でした。

わかりやすくまとめられたセッションを視聴して、
（俺でもスピーカーとして登壇できるんじゃね？）
と思いました。

人の時間は限られており、尚且つエンジニアは忙しいので、ググる余裕すらありません。

ですから、簡単な技術だろうと、スピーカーとして発信することは意義のあることなのです。

## まとめ

Firebase同好会、関西のIT勉強会などに参加してきましたが、iOSDCは大規模なカンファレンスだけでなく、数あるセッションから興味あるセッションを選び、自分でスキルアップを目指せる良いイベントでした。

ネット記事や書籍と違い、リアルタイムで現役のエンジニアと繋がれて、情報を得るためのきっかけとして断然アリです。

まだセッション内容を完璧に理解できませんでしたが、iOSアプリ開発の世界を垣間見れて、もっとスキルアップしたいと思えるようになりました。

来年もまた参加します！
自己紹介

はじめまして、ゆるたかです。

日々技術勉強してもアウトプット先がなかったのでqiitaを利用して備忘もかねてまとめていこうと思います。


#経歴
まず経歴は以下のような感じです。

2016年度新卒採用でSES会社に入社。

客先常駐で業務を行い、特に目立った案件もなく、三年ほど勤めていました。

その後、退職しフリーランスとして運用保守業務を二年ほど経験しています。


#学んできたこと
実務ではあまり技術を学ぶようなことができなかった環境のため、自主学習を行ってきました。

ざっと以下のことは経験済みです。(実務ではない)

###①ApacheTomcat+MySQLでのWebアプリケーション作成
CentOS7にApacheとTomcatをインストールし、ApacheTomcatを構築。
MySQLをインストールし、簡易なJAVAプログラムでデータをブラウザに表示するところまで実施しました。

###②AWSにメールサーバ構築
AWSでネットワークの設定(VPCやサブネットなど)を行い、EC2を利用してRedhat8をインストール。
PostfixとDovecotを使用してメール受信/送信サーバを作成。

また、ドメインはプライベートで取得し、Route53に登録。
ローカルからメールサーバ経由でメールの送受信が行えることを確認。

※icloud.com宛にはドメインが信頼されていないとかなんかでメールを送信できず。。。


###③AWSにOracleサーバ構築
②と同じVPC内にEC2インスタンスを作成し、Redhat7をインストール。
Oracle12C Standard Edition2をインストールし、インスタンスの起動を確認。

ローカルにoracleクライアントをインストールできていないのでローカルからの接続は未検証。


###④Oracle VirtualBoxにてVerticaをインストール
Verticaのお試し版を利用し、CentOS6にVertica10をインストール。

とりあえず、インストールが終わるところまでを行い、手順をまとめているところ。


とざっくり上記が書けそうなレベルのものですかね。。。



#今後について

どちらかと言うと開発よりはサーバの構築やネットワークに近いことを経験してみたいと言う感じです。

一人でも設計から構築まで行えるように日々精進していこうかと思います。


もし興味がありましたら、他にも記事を上げていこうと思いますのでご覧いただけると幸いです。

また、アドバイスや技術的に指摘等もあれば随時いただけると幸いです。
初めてのjava.util.logging

# 本記事の結論
- java.util.loggingとは、Javaに搭載されたロギングを担うモジュールのこと


## ロギングとは
- 出来事を時系列に沿って記録した履歴のこと
- ログレベルが存在する


## ログレベルとは
- 文字通りログのレベルのこと
- java.util.loggingでは、下記のようにレベル分けされている。なお、デフォルトでは、INFO以上のログが出力されるよう設定されている。
  - FINEST - 非常に詳細なトレースメッセージ
  - FINER - かなり詳細なトレースメッセージ
  - FINE - 詳細なトレースメッセージ
  - CONFIG - 静的な構成メッセージ
  - INFO - 情報メッセージ
  - WARNING - 警告メッセージ
  - SEVERE - 重大なメッセージ

## java.util.loggingの機能
- Logger - ログの出力
- Handler - ログの出力先を制御
- Formatter - ログのフォーマットを制御

# 参考
- [java.util.loggingの使い方](https://qiita.com/Qui/items/40077ce9e33738dd3914)
- [【Java入門】Loggerの使い方(ログレベル、出力先の設定も解説)](https://www.sejuku.net/blog/61048)
C#でUDPブロードキャストパケット受信

# 参考記事
https://garafu.blogspot.com/2015/08/broadcast.html

# 実装

UDPブロードキャストパケットを受信してエコーするタスクを常駐させるサンプルです。

```C#
using System.Net;
using System.Net.Sockets;

namespace udp
{
    public class udpSample {

        public void start()
        {
            Task.Run(() => BroadcastReceiver()); // UDPブロードキャストパケット受信タスク起動
        }

        private void BroadcastReceiver()
        {
            var endPoint = new IPEndPoint(IPAddress.Any, 4000); // すべてのアドレス監視するためIPAddress.Anyを指定

            using (UdpClient udpClient = new UdpClient(endPoint)) {
                while(true) {
                    var buff = udpClient.Receive(ref endPoint);  // 受信（同期）
                    udpClient.Send(buff, buff.Length, endPoint); // 受信内容をエコー
                }
            }
        }
    }
}
```

IPEndPointに`using System.Net;`が、
UdpClientに`using System.Net.Sockets;`が必要になります。
Reactとstorybookで開発中 webpack@4.44.2  dedupedのエラーが出てnpm startできなくなった人のための記事

みなさんこんにちは。
横浜です。


さて、ReactとStoryBookで開発中に突如npm startができなくなった経験はございませんか？
僕はあります！！！
丸3日もがき苦しむレベルでした。

![スクリーンショット 2020-09-21 17.08.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701698/25521d1e-c3c2-b793-8519-eab1205c3244.png)

自分の場合は？？？？
WebpackのバージョンがStorybookとReactのnode_modulesの中身が違うエラーが出てしまいました。

![スクリーンショット 2020-09-21 17.10.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701698/fc25a93c-4bc0-ca77-5970-d345703c5b9f.png)

試しに
npm ls webpackをしたらdedupedのエラーが、、、

ぐっ、、

また、その上のエラー文には![スクリーンショット 2020-09-21 17.11.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701698/6886928e-402d-06cc-9c5e-55edce2a4b18.png)
このような英文がズラーっと並んでおり、順番にやってみてもうまくいきませんでした。

前置きが長くなりましたが、対処法はふた通りあります。
一つ目はローカル環境のみで動かしたい人向けで、
SKIP_PREFLIGHT_CHECK=true 
を.envファイルを作って無理やりnpm startを走らせる方法です。

自分はこのやり方はあまり好きではありません。

2つめはstorybookの中身を他のフォルダーに保存して一通り削除することです。
もちろんpacage.jsonの中身を削除、そして再び

![スクリーンショット 2020-09-21 17.11.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701698/6886928e-402d-06cc-9c5e-55edce2a4b18.png)
こちらを繰り返します。
そしたらnpm startすればReactは走ります。
そしてもう一度ゼロからstorybookをインストールして、先ほど避難したフォルダーを元に戻せば元通りに動きます。
【PowerApps】IsEmpty関数とIsBlank関数の違いについて

#・はじめに#
PowerAppsに用意されている関数の中に、
値が空白であるかを返す **IsBlank関数** と、テーブルにレコードがあるかを返す **IsEmpty関数** があります。
この２つどちらも空白のチェックで似ており、時々混同してしまうため、実験してまとめてみました。
この記事は、その違いを検証した結果を備忘録として残したものですので、参考程度にお願いします。

※詳細は下記の公式情報をご覧ください。
**[Power Apps での Blank、Coalesce、IsBlank、および IsEmpty 関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-isblank-isempty)**

具体的な違いとして公式にはこのように記載されています。（Docsより抜粋）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/a752b8a2-2124-22d2-861b-f662562beb18.png)
なるほど。違いは「値を検査対象とするのか、テーブルを検査対象とするのか」のようです。

##試してみた。##
検証用としてPowerAppsアプリを用意しました。
「Submit」ボタンをクリックすると「checktable」コレクションが作成されて中には２レコード用意されています。

###データテーブルが空の場合###
画面上のデータテーブルが空の場合は下図のような結果となりました。

IsEmpty関数は、テーブルもしくはレコードを検査対象とした場合に true が返ってきており、
IsBlank関数は、値を検査対象とした場合に true が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/dbe907f5-4992-5dce-b850-52d2993f4cd7.png)

###データテーブルに値がある場合###
画面上のデータテーブルに値がある場合は下図のような結果となりました。
レコードには値が入っているため、すべてのパターンが false になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/abba8923-c632-f813-e2fb-bb08e491a548.png)

##比較してみた##
データテーブルにデータ有 / データ無の場合を比較してみると、赤字の３箇所が異なっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613247/d7c82567-65dd-f899-209a-93f90986add8.png)

公式に記載されている通り、
IsEmpty関数は、データテーブル（データソース）を検査対象としており、IsBlank関数は、値（フィールド）を検査対象としていました。
反対に、
IsEmpty関数は値（フィールド）を検査しても false しか返ってこないし、IsBlank関数はデータテーブル（データソース）を検査しても false しか返ってこないようです。

公式の文章のみではなく、試して実感することで納得感が増しました。
この記事がみなさまのお役に立てば幸いです。