OmniAICreator/Qiita-1.07M huggingface dataset:
深層学習の概要①　備忘録

## 深層学習の範囲
深層学習（Deep Learning）は、多くの層を持つ深いニューラルネットワークを使って学習を行う。特に、何層からが深層学習というような定義はない。
![深層学習の範囲](https://www.soumu.go.jp/johotsusintokei/whitepaper/ja/r01/image/n1302010.png)
[総務省ホームページより](https://www.soumu.go.jp/johotsusintokei/whitepaper/ja/r01/html/nd113210.html)

## 神経細胞について
![Wikipedia（神経細胞）](https://storage.googleapis.com/sitest-wp/blog/wp-content/uploads/2016/11/83761ecb0aeb6b20c63e30ffacf67776.jpg)
[Wikipedia（神経細胞）より](https://ja.wikipedia.org/wiki/%E7%A5%9E%E7%B5%8C%E7%B4%B0%E8%83%9E)

>ウィキペディアより引用
>神経細胞の基本的な機能は、神経細胞へ入力刺激が入ってきた場合に、活動電位を発生させ、他の細胞に情報を伝達することである。ひとつの神経細胞に複数の細胞から入力した>り、活動電位がおきる閾値を変化させたりすることにより、情報の修飾が行われる。
>
>神経細胞は主に3つの部分に区分けされ、細胞核のある細胞体、他の細胞からの入力を受ける樹状突起、他の細胞に出力する軸索に分けられる。樹状突起と軸索は発生的にはほぼ同じ過程をたどるため、両者をまとめて神経突起(neurite)とも言う。前の細胞の軸索終末と後ろの細胞の樹状突起の間の情報を伝達する部分には、微小な間隙を持つシナプスと呼ばれる化学物質による伝達構造が形成されている。
>
>神経細胞の中には、光や機械的刺激などに反応する感覚細胞や、筋繊維に出力する運動神経の細胞などもある。
>
>なお「ニューロン」は、「神経元」とも訳され、神経系の構成単位を意味する語として生み出された造語である。神経の構造に関する論争の中で作られた。詳細は歴史の節を参照。現在[いつ?]においては、単に細胞の名前として「神経細胞」と同義的に用いられる。

⇒神経細胞は複数の情報を統合して、新たに信号を作成し他の神経細胞に伝達する役割がある。その接続部がをシナプスといい、シナプスの結合強度が強くなったり、弱くなったりして記憶が形成されるといわれている。

# ニューラルネットワーク
コンピュータ上で、神経細胞をモデル化したを「<b>人口ニューロン</b>」、神経ネットワークをモデル化したものを「<b>人口ニューラルネットワーク</b>」という。

ニューロンの典型的な構造は以下のようになる
![人工ニューロン](https://cz-cdn.shoeisha.jp/static/images/article/13501/13501_02.jpg)
[ディープラーニングと脳の関係とは？ 人工ニューロンや再帰型ニューラルネットワークを解説より](人工ニューロン)

 ニューロンは複数の信号を受け取り、1つの信号を出力する。
各入力には、重みがかけられていて、入力値がとに重さは変わってくる。

<b>入力値と重みの積の総和 + バイアスを足した値を活性化関数で処理を行う。</b>
* 重み…神経細胞のシナプスの伝達効率に相当し、値が大きければ大きいほど多くの情報を持っていることになる。
* バイアス…ニューロンの感度に相当し、バイアスの大小でニューロンの興奮しやすさが決まる。
* 活性化関数を持ちいることで入力をニューロンの興奮状態を表す信号に変換する。

このようなニューロンをつなぎ合わせてニューラルネットワークを構築する。

![人工ニューラルネットワークの一例](https://cz-cdn.shoeisha.jp/static/images/article/13501/13501_03.jpg)
[ディープラーニングと脳の関係とは？ 人工ニューロンや再帰型ニューラルネットワークを解説より](https://codezine.jp/article/detail/13501)

ニューラルネットワークはニューロンの数や層の数を増やすことで高い表現力を発揮するが、それに伴い学習が難しくなってしまう。

## 2つのパラメーター
ニューラルネットワークには、<b>学習するパラメータ</b>と<b>ハイパーパラメータ</b>を持つ。
⇒<b>深層学習は、学習するパラメータを最適化することが目標</b>となる。

前述の「重み」と「バイアス」がニューラルネットワークにおける「学習するパラメータ」といえる。そして、この学習するパラメータを最適化するアルゴリズムには、誤差逆伝播法（バックプロパゲーション）を用いる。

ハイパーパラメータは、変更されず固定されたままのパラメータで、ニューラルネットワークのニューロンの数や層の数がこれにあたる。

## 誤差逆伝播法
![誤差逆伝播法](https://cz-cdn.shoeisha.jp/static/images/article/13501/13501_04.jpg)
[ディープラーニングと脳の関係とは？ 人工ニューロンや再帰型ニューラルネットワークを解説より](https://codezine.jp/article/detail/13501)

誤差逆伝播法…
出力と正解の誤差をできるだけ小さくなるように重みやバイアスを調整することで学習を行う。
一層ずつ逆に遡るようにして、勾配を計算してパラメータを最適化していく。
⇒このようにして次第に適切な予測ができるようになっていく。

# 参考
* Pytorchで作る！深層学習モデル・AIアプリ開発入門
* [ディープラーニングと脳の関係とは？ 人工ニューロンや再帰型ニューラルネットワークを解説](https://codezine.jp/article/detail/13501)
* [ハイパーパラメータとは？チューニングの手法を徹底解説（XGBoost編）](https://www.codexa.net/hyperparameter-tuning-python/)
UWF端末におけるWindows Update

## 前提条件

・管理者権限を使用すること
・OSがWindows 10 Enterprise、Educationのどちらかであること


## 手順

1.下記コマンドを実行
```
    # デバイスに Windows 更新プログラムを適用するスタンドアロンコマンド
    uwfmgr.exe servicing enable
```

2.下記コマンドを実行
```
    # UWFの再起動
    uwfmgr.exe filter restart
    # 端末の再起動
    shutdown /r /t 0
```

## 注意事項

・Windows10 Enterpriseであればバージョンによる差異はない
・UWF側でパッチを適用する際に除外設定は不要
・タスクスケジューラーによるパッチの適用(上記コマンドを実施)も可能
・UWF設定端末に対してパッチを適用する推奨方法は、上記手順と手動でUWFを無効化し、パッチを適用する方法
・更新時間は通常の更新時間と変わらない
・UWF設定前に最新のパッチを適用すること(上記方法がうまく動作しないバグが発生していたらしい)


## 参考資料

https://learn.microsoft.com/ja-jp/windows-hardware/customize/enterprise/uwfmgrexe


https://learn.microsoft.com/ja-jp/windows-hardware/customize/enterprise/uwf-apply-windows-updates
統合書き込みフィルターとApexOne



## 背景

UWFを適用した端末の導入で、ウイルス対策を検討していた際にそもそもウイルス対策ソフトが入るのか疑問だったので調べてみた。
※今回は既存の端末で利用しているApexOneについて


## ApexOneの導入

UWF(統合書き込みフィルター)とApexOneエージェントは共存できないため、UWFをOFFにする必要あり 


## 代替案

Microsoft Defenderを導入する
そもそもUWFがウイルス対策ソフト等のアプリケーションを導入するように設計されていない。
そのため、他社ベンダーでMicrosoftが推奨しているウイルス対策ソフトはない 
Microsoft DefenderであればMicrosoftでサポートでき、導入可能である

## 参考サイト

https://success.trendmicro.com/dcx/s/solution/000287851?language=en_US&sfdcIFrameOrigin=null

https://learn.microsoft.com/ja-jp/windows-hardware/customize/enterprise/uwf-antimalware-support
ハーフミラーを使ってプロンプター（カメラ目線でビデオ会議できるやつ）を作ってみた

# はじめに
普段から何に使うかを決めずに、気になる素材を買うことがあるんですが、だいぶ前に買っていたハーフミラーを使って工作してみました。

先に言っておきますが、この記事はやってはみたけど、なんか思ったより上手くいかんかったって話の記事です。笑
でも、そこからの気付きや学びが新しいものを生み出すんだと信じてこれからもいっぱい失敗していこうと思います。

# 何を作るのか
ビデオ会議の際にカメラ目線で話せるやつです。プロンプターとも言いますね。（政治家とかがスピーチとかで前に置いてある透明な板のやつ）

ビデオ会議以外にも、よくお仕事でフォトブースの様な体験を作ることがあるんですが、撮影シーンで目線を誘導するデザインにしたりすることがあり、ディスプレイの真ん中にカメラがあったらなーと思うことも多いです。

# ハーフミラーってなに？
マジックミラーという方がわかる方も多いかもしれませんね。周囲が明るい側から見ると鏡の様に見え、暗い側から見ると向こう側が見えるというもの。厳密には透過率や反射率で呼び方変えている業者さんとかもいるみたいですが、ここでは一旦ハーフミラーで説明していきます。

# 必要なもの
- ハーフミラー：[ポリカハーフミラーUD　ｈ２９０](https://www.amazon.co.jp/UnDigital-%E3%83%9D%E3%83%AA%E3%82%AB%E3%83%8F%E3%83%BC%E3%83%95%E3%83%9F%E3%83%A9%E3%83%BCUD-%EF%BD%88%EF%BC%92%EF%BC%99%EF%BC%90/dp/B00MJVS0B4/ref=sr_1_5?keywords=%E3%83%8F%E3%83%BC%E3%83%95%E3%83%9F%E3%83%A9%E3%83%BC&qid=1671541976&sr=8-5)（今回使用したのは30%の透過率のもの）
- Webカメラ
- タブレットPC
- カラーボード（黒）：100均で2枚
- 黒テープ：100均

制作費：（PCとカメラ除くと）2,400円！

# 作り方
カラーボード（黒）をタブレットPCサイズに合わせてカットして以下の様な箱を用意します。
![IMG_2388 copy.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986222/9c9e3a11-a4c2-4f69-b01f-22234e1480b1.jpeg)
タブレットPCは下面に配置して、奥面部分の中央にカメラ穴を開けてカメラをテープで固定しておきます。
ハーフミラーを45°の角度で内部に配置するために、引っかかり部分を取り付けます。
![IMG_2389 copy.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986222/e5b48253-719f-5404-4078-2d068c9af614.jpeg)

これで正面から見ればOKなはず！！！

# できたもの
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">カメラ目線でビデオ会議できるやつ。<a href="https://twitter.com/hashtag/lifehack?src=hash&amp;ref_src=twsrc%5Etfw">#lifehack</a> <a href="https://twitter.com/hashtag/%E3%83%8F%E3%83%BC%E3%83%95%E3%83%9F%E3%83%A9%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#ハーフミラー</a> <a href="https://t.co/bWp3iQ4EW5">pic.twitter.com/bWp3iQ4EW5</a></p>&mdash; Seiya Tanaka (@seintoseiya) <a href="https://twitter.com/seintoseiya/status/1605183309851422722?ref_src=twsrc%5Etfw">December 20, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

まぁやりたいことは概ねできてはいますが、
柔らかい素材のポリカーボネイト製のため、弛んだ部分が歪みが生じて気になります。
硬いガラス製のハーフミラーにすればましになるのだろうが、見る角度によっては歪みは仕方ないのかな。。。

あと、動画みてお気づきかもしれませんが、ミラー反射させているので、左右逆になってますね。
ビデオ会議の映像としての利用なら問題ないかもですが、フォトブースとかでアプリにする際はソフトウェア側で左右反転させる必要があります。

# 振り返って
ハーフミラーは当初、[ペッパーズゴースト](https://ja.wikipedia.org/wiki/%E3%83%9A%E3%83%83%E3%83%91%E3%83%BC%E3%82%BA%E3%83%BB%E3%82%B4%E3%83%BC%E3%82%B9%E3%83%88)を利用したホログラム作品でも作ろうかなーと思って買っていたのですが、部屋の中で埃かぶっていたので、今回のアドカレンダーが埃を払う良い機会になりました。

あと、本題と全然関係ないのですが、弛む柔らかいミラー素材というのもなんか面白いなと思い、それでまた違うナニカを作ってみたいなと思いました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">柔らかいミラー素材を弛ませることで上下が反転したりするの面白い。あと、この下敷きをべコンベコンする様な音も良き。 <a href="https://t.co/I6stySTsf3">pic.twitter.com/I6stySTsf3</a></p>&mdash; Seiya Tanaka (@seintoseiya) <a href="https://twitter.com/seintoseiya/status/1605187261993127937?ref_src=twsrc%5Etfw">December 20, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 参考記事
[mask303 blog - ビデオ会議で目線がバッチリ合う装置をDIYで作ってみた](http://mask303blog.blogspot.com/2020/05/diy.html)
[鏡とガラスのネコロボ事件簿 - マジックミラーはこうして使う！仕組みと活用法を解説します。](https://www.kowa-m.jp/mirror/4285)
luaでパーティクルもどきを作る

　
この記事は[アドカレ](https://qiita.com/advent-calendar/2022/lua)に参加しています。

# luaでパーティクルもどきを作る
半年前の文章のコピペです。
過去の僕は文章が綺麗ですね。
[完成品](https://twitter.com/metaphysicalba1/status/1605201756065263616)も半年前のものです。

## ＜はじめに＞
学校の課題でパーティクルもどきを作ったので、それの紹介みたいなかんじです。
パーティクルについてしっかりと学びたい場合は「パーティクルシステム」とかで調べると面白い記事がでてきたりします。


## ＜コンセプト＞
・基準となる円が一つあり、その円から粒子がででくる。
・基準となる円も粒子も「速度」と「角度」があり、それをもとに移動する。
・粒子は時間経過で大きさが小さくなる。大きさが0以下になったら描画されない。
・粒子は時間経過で速度が減速する。
・基準となる円も、粒子も領域外には出られないようにする。
・粒子は1フレームで3つででくる。
・粒子の最大寿命は90フレームにして、最大で270の粒子が存在が存在するようにする。


## ＜コード＞
```lua
--初期化プログラム
if(obj.time==0)then

 --初期化
 local p={}
 p.x={}
 p.y={}
 p.s={}
 p.spd={}
 p.arg={}
 p.r=0

 --初期値を決定
 p.x[1]=100
 p.y[1]=100
 p.s[1]=20
 p.spd[1]=10
 p.arg[1]=math.rad(30)

 for i=2,271 do
  p.x[i]=0
  p.y[i]=0
  p.s[i]=0
  p.spd[i]=0
  p.arg[i]=0
 end

 --グロ変数に流す
 Pdata=p
end


--乱数のseed値用の関数
function R()
 Pdata.r=Pdata.r+1
 return Pdata.r
end


--Pdataの値を更新
function pa(p)
 --粒子を増やす
 local index=rand(0,90,R())*3+2
 for i=0,2 do
  p.x[index]=p.x[1]
  p.y[index]=p.y[1]
  p.s[index]=rand(0,10,R())
  p.spd[index]=p.spd[1]-rand(0,10,R())
  if(p.spd[index]<0)then p.spd[index]=0 end
  p.arg[index]=p.arg[1]+rand(-30,30,R())/0.3
  index=index+1
 end

 --速度の減速とサイズを小さく
 for i=2,271 do
  p.s[i]=p.s[i]-(p.s[1]/90)
  p.spd[i]=p.spd[i]-(p.spd[1]/90)
 end

 --座標の決定
 for i=1,271 do
  --壁との衝突判定
  if(p.x[i]<=19 or p.x[i]>=380)then
   p.arg[i]=math.pi-p.arg[i] end
  if(p.y[i]<=19 or p.y[i]>=380)then
   p.arg[i]=-1*p.arg[i] end

  --移動量を計算
  local dx,dy
  dx=p.spd[i]*math.cos(p.arg[i])
  dy=p.spd[i]*math.sin(p.arg[i])

  --移動量を加算
  p.x[i]=p.x[i]+dx
  p.y[i]=p.y[i]+dy

  --範囲外に出ないように
  if(p.x[i]<19)then p.x[i]=19
  elseif(p.x[i]>380)then p.x[i]=380 end
  if(p.y[i]<19)then p.y[i]=19
  elseif(p.y[i]>380)then p.y[i]=380 end
 end

end


--関数実行と描画
pa(Pdata)
local p=Pdata
for i=1,271 do
 if(p.s[i]>0)then
  obj.load("figure","円",0xffff00,p.s[i])
  obj.draw(p.x[i],p.y[i])
 end
end
```

## ＜全体のながれ＞
１，グローバル変数の準備
２，粒子を増やしたり、座標を決める関数を作る
３，関数を実行して描画
４，次フレームに移動したら、３のみを行う


## ＜補足＞
解説はコメントに書いてあるので、コメントにない補足を書いときます。

・グローバル変数
今回の場合は最大で270の粒子が飛ぶようにします。
なので、粒子の数＋基準となる円で、合計271のindexを持つ配列を作ればいいことになります。

・粒子の増やし方
同時に存在する粒子の最大数は270(基準となる円も含めると271)なので、描画する際には
```lua
for i=1,271 do
 if(p.s[i]>0)then
  obj.load("figure","円",0xffff00,p.s[i])
  obj.draw(p.x[i],p.y[i])
 end
end
```
のようにindexが1~271のものを順番にif文で判定していきます。
p.s[i]というのは、描画する際のサイズなので、サイズが0より小さいものは描画されないことになります。

p.s[i]が0より大きいものは描画され、p.s[i]が0以下のものは描画されません。


粒子を増やすには、これを利用します。

粒子を増やしたい場合は、p.s[i]が0以下のものを0よりも大きい数にすればいいことになります。

・粒子の減らし方
粒子を減らすには、p.s[i]の値が0より大きいものを0以下にすればいいことになります。


## ＜おわりに＞
rikkyさんのパーティクルスクリプトはすごいですね。


## ＜反省＞
分かりずらいコードになったかもしれないと反省。
しかも、限定的な使い方しかできないコードですし、右から左へ順番にフレームを読み込まないといけないのでaviutl向きではないという…
インプットにはリスペクトが大切だと思う

プログラミングは日々進化しているので**インプットし続けるのは簡単ではないと考えています。**

1人アドベントカレンダーにチャレンジして、**何がモチベーションになっているのかを考えた時に「リスペクト」することではないか**と考えました。

その理由について話します。

## 知識や技術をリスペクトする
新しい技術をリスペクトすることで学んでみようと興味が出てきます。
「こんなことができるようになったのか！」「めっちゃ便利なプラグイン出てる！」なんでも良いです。
新しいもの、古いもの関係なく言語へのリスペクトが学習意欲に変換されるのだと考えています！

:::note info
好きな言語とその理由を言えるようにする！という目標を立てるのもいいかもしれません！
:::

## 一緒に働く仲間をリスペクトする
年齢も社歴も関係なく自分より知識や技術を持っている人、自分にできないことができる人はリスペクトの対象です！

大変嬉しいことに周りには優秀な方が多いです。

リスペクトできる人が周りに多ければ多いほど、**質問→回答（インプット）のサイクルは速くなり自分で勉強するよりも早い速度でインプットできる**と考えています。

:::note info
相手へのリスペクトは質問することへのハードルを下げる効果があると考えています！
:::

## 自分をリスペクトする
自分をリスペクトするというのは「**ありのままの自分を受け入れる、その上で素直にできたことを称賛する**」ことだと考えています。

私は自己肯定感の低い方だと思っていますが、少なくとも今アドベントカレンダーを1人で毎日投稿できていることについては客観的に見ても努力できていると感じています。

そしてもう一つ大切なのは**自分のありのまま、つまり現状を受け入れるということ**だと考えています。

私は現時点でフロントエンドエンジニアとしては技術が不足していると感じています。
ただ、これから変えていけることでもあると現状を受け入れ努力を続けています！

## まとめ
リスペクトすることでインプットが加速し、アウトプットを併用すると知識の深度や幅を広げることができると考えています。

相手や好きなもの、優れたものに対しては自然にリスペクトすると思いますが、**自分をリスペクトすることは意識的にやらないと難しいと考えています。**

:::note info
自分の現状を受け入れて、今日できたことを1つでもいいので思いだしてリスペクトしてみてください！
:::

今日のリスペクトが明日の活力になると思いますのでぜひやってみてください！

最後に恐縮ですが、1人アドベントカレンダーにチャレンジ中です！よろしければご覧ください！

https://qiita.com/advent-calendar/2022/frontend-beginner
【PHP】$_SERVERが環境によって想定どうりに動いてくれない【落とし穴】

## はじめに
PHPの$_SERVERでドメインまでのURLを取得しようとしたときに、本番環境と検証環境、開発環境で挙動がことなることではまったので共有。
AWSを使用した環境で陥りがちなミスかと思います。

## 具体的な内容
### ミスっていたときのコード
開発環境はオンプレのサーバー上にあり、検証・本番環境はAWSサーバー上にあります。開発環境でのプロトコルはhttpですが、検証・本番環境はhttpsです。
画像を取得する際ためにドメインまでのURLを取得するために以下のように書きました。
```PHP
$domain = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ? 'https' : 'http' . $_SERVER['HOST'];
```
この書き方ではAWS上の検証環境・本番環境に上げた際にhttpsだと判断されず思うような挙動になりませんでした。

### 想定した動作をしなかった原因
AWS上でアプリケーションサーバの前にロードバランサーを置いていて、サイト自体はHTTPSだが、
実際のSSL暗号化処理はロードバランサーのSSLアクセラレータ機能が行っており、ウェブサーバはHTTP平文通信をしているため。

### 修正するにあたって参考にした記事
- PHPドキュメント
https://www.php.net/manual/ja/reserved.variables.server.php
> $_SERVER は、ヘッダ、パス、スクリプトの位置のような 情報を有する配列です。この配列のエントリは、Web サーバーにより 生成されます。全ての Web サーバーがこれら全てを提供する保証はありません。 
- PHP の $_SERVER['HTTPS'] が on になる流れ 〜Apache mod_php 編〜 
https://qiita.com/xtetsuji/items/36d85bb49a518ed7b1da
- ALB+EC2な環境でhttpをhttpsにリダイレクトする
https://re-engines.com/2017/10/13/aws-2/
> $http_x_forwarded_protoを使うとクライアントがロードバランサーへの接続に使用したプロトコルを識別できます。
> $http_x_forwarded_protoがhttpsではなかった時にhttpsでリダイレクトします。

### 想定された挙動になった際のコード
```PHP
$domain = (isset($_SERVER['http_x_forwarded_proto']) && $_SERVER['http_x_forwarded_proto'] === 'https') ? 'https' : 'http' . $_SERVER['HOST'];
```

## まとめ
今回は開発環境と検証・本番環境の環境の差異で起こしてしまったミスです。公式ドキュメントの一番上にヒントがありましたが他の記事を読むまで読み飛ばしていました、、、
開発環境での確認では気づきにくい部分かと思いますので知っておくことが大事な落とし穴かと思います。他の方法や解釈が間違っている箇所がありましたらぜひコメントで指摘をお願いいたします。
Sourceryを使って自動でEquatableに準拠させる

この記事はand factory.inc Advent Calendar 2022 21日目の記事です。
昨日は @k_shinn  さんの [【Jetpack Compose】WearOSで簡単なアプリを作ってみる](https://qiita.com/k_shinn/items/f36c1a8fc19a91d97aae) でした。


# はじめに
テストを書くときによく構造体の比較をしたいときがあるのですが、毎回Equatableに準拠させるために`==`の実装をするのが面倒だと感じてました。
そこで今回は、[Sourcery](https://github.com/krzysztofzablocki/Sourcery)というツールを使ってEquatableの実装を自動化してみました。

# Sourceryとは
Sourceryとはボイラーテンプレートを自動生成してくれるSwift製のツールです。

# 環境
- MacBook Pro　Apple M1 Max
- Xcode14.1(14B47b)
- Swift：5.7.1
- Mint：0.17.4

# セットアップ
今回はMintを使ってインストールします。
```:Mintfile
krzysztofzablocki/Sourcery@1.9.2
```

```shell-session
$ mint bootstrap
```

# .sourcery.ymlを作成する
コマンドラインから実行するときに指定するオプションをあらかじめ設定ファイルに記述しておきます。
```yml:.sourcery.yml
sources:
  # ソースとなるファイルやディレクトリのパス
  - Sample-Sourcery
templates:
  # テンプレートが格納されているパス
  - Sample-Sourcery/Templates
output: 
  # 自動生成したファイルを格納するパス
  Sample-Sourcery/Generated
```

# Templateを配置する
自動生成するときに元となるテンプレートを配置します。
```Stencil:AutoEquatable.stencil
// AutoEquatable

{% for type in types.implementing.AutoEquatable|struct %}
extension {{type.name}}: Equatable {
  static func == (lhs: {{type.name}}, rhs: {{type.name}}) -> Bool {
    {% for variable in type.storedVariables|!annotated:"skipEquality" %}guard lhs.{{variable.name}} == rhs.{{variable.name}} else { return false }
    {% endfor %}
    return true
  }
}
{% endfor %}
```

# プロトコルの実装
`Equatable`の実装を自動生成したい構造体は、`AutoEquatable`に準拠させる必要があるので、`AutoEquatable`プロトコルを定義しておきます。
```swift:SourceryProtocols.swift
protocol AutoEquatable {}
```

# AutoEquatableに準拠させる
`Equatable`の実装を自動生成したい構造体に`AutoEquatable`を準拠させます。
```swift:User.swift
import Foundation

struct User: AutoEquatable {
    let id: Int
    let name: String
    let iconUrlStr: String
}
```

# Sourceryを実行
ここまで準備ができたら、コマンドラインからSourceryを実行して`Equatable`の実装を自動生成します。
```shell-session
$ mint run krzysztofzablocki/Sourcery
```

# 自動生成されたファイル
実行が成功すると、`.sourcery.yml`の`output:`に定義したパスに自動生成されたコードが出力されます。
```swift:AutoEquatable.generated.swift
// Generated using Sourcery 1.9.2 — https://github.com/krzysztofzablocki/Sourcery
// DO NOT EDIT
// AutoEquatable

extension User: Equatable {
  static func == (lhs: User, rhs: User) -> Bool {
    guard lhs.id == rhs.id else { return false }
    guard lhs.name == rhs.name else { return false }
    guard lhs.iconUrlStr == rhs.iconUrlStr else { return false }
    return true
  }
}

```

# おわりに
Sourceryを使うことで`Equatable`の実装を簡単に行うことができるようになりました。
Sourceryは他にも`Mock`なども自動生成できるので、それらも活用してテストの実装コストを下げていければと思います。

明日の[Advent Calendar](https://qiita.com/advent-calendar/2022/andfactory)の記事もお楽しみに:santa:

# 参考リンク
https://github.com/krzysztofzablocki/Sourcery
https://github.com/krzysztofzablocki/SourceryWorkshops/tree/steps
https://enmtknt.hateblo.jp/entry/2018/03/13/153344
【Flask】HTML側で受け取った値をPython関数に渡すときの備忘録

# 概要
- Python側の値をHTMLに渡すのは調べてもすぐ出てくるが、逆（HTML側の値をPythonに渡す）の方法が出てこなかったのでメモ書き程度で書き下しておく。


# 実装
```html:index.html
{% block content %}
<html lang="jp">
<head>
    <meta charset="UTF-8">
    <title>テスト</title>
</head>
<body>
    <div>
        <table>
            <tbody>
                <p>＜削除機能＞</p>
                <tr>
                    {% for t in test %}
                        <form action='/test'>
                            <a href="{{ url_for('test_method', test_id=t.test_id)}}">削除</a>
                        </form>
                    {% endfor %}
                </tr>
            </tbody>
        </table>
    </div>
</body>
</html>
{% endblock %}
```

```python:app.py
from flask import Flask

@app.route("/test_method/", methods=["GET", "POST"])
def test_method(test_id):
    r = db.session.query(Test).filter_by(test_id=test_id).first()
    db.session.delete(r)
    db.session.commit()

    return redirect("/")
```
製造現場に欠かせないMESについてまとめてみた

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiixta.com/7_inai_)

# MESとは
MES(Manufacturing Execution System)の略で、直訳すると __製造実行システム__ という意味です。製造現場でよく導入されるシステムで生産管理システムの一種です。
製造現場では、`日々生産目標との戦いであり、生産目標には、出来高、不良率、直行率、稼働率といった様々な指標`が与えられています。これらの生産目標の達成に一役買っているのが __MES__ です。
具体的にMESで何ができるのかについては、次の項で説明します。

# MESでできること
MESには、11の役割があるとMESA Modelによって定められています。その11個の役割は以下の通りです。
①作業のスケジューリング
②作業資源の配分と監視
③作業手配・製造指示
④実績分析
⑤保全管理
⑥工程管理
⑦品質管理
⑧データ収集
⑨製品の追求と生産体系の管理
⑩作業者管理
⑪文書管理
上記の役割を見ていただくとわかると思いますが、MESでは作業スケジュールや原材料の手配といった上流工程から、データ収集のような下流工程まで、製造現場に関わるすべての情報を管理するシステムです。ただし、一般的にはその全ての機能を導入するわけではなく、各企業が必要な機能のみを導入します。


# 終わりに
多くの市場が成熟し、それに伴って製品がコモディティ化してきている昨今、それぞれの製品で差別化するための特徴が必要な時代となってきています。そのため、同品種大量生産で作られる製品は少なくなってきました。これにより工場では、在庫・出来高・原材料等の様々な条件を考慮する必要が出てきました。ここまでの文書を読んでいただきた方はご想像していただけると思いますが、こういった場面で活躍するのがMESです。よってMESの需要もこれから益々高まるでしょう。
最後までお付き合いくださりありがとうございました。
luajitでnewしたメモリのポインタはlua_topointerで受け取る

　
この記事は[アドカレ](https://qiita.com/advent-calendar/2022/lua)に参加しています。

# luajitでnewしたメモリのポインタはlua_topointerで受け取る
小ネタとも言えないような小ネタです。

## obj.getpixeldataしたやつの場合
lua側でobj.getpixeldataしたメモリの場合、dll側でポインタを受け取る際には、
```c++
char* data = reinterpret_cast<char*>(lua_touserdata(L, 1));
```
…のようにします。これは、obj.getpixeldataがライトユーザーデータ(たぶん)を返す関数であり、ライトユーザーデーターをdllで受けとるにはlua_touserdata関数を使用する必要があるからです。

## ffi.newしたものはどうするのか…？
さて、luajitでnewしたとします。
```lua
local a=ffi.new("int[10]",{})
```
そして、dllの関数に引数として渡したとします。
```lua
d.func0(a)
```
このときにdll側でlua_touserdata関数を使用していると、NULLが返されます。
newしたメモリはライトユーザーデーターではないからです。

そこで、lua_topointer関数を使用します。
```c++
char* data = reinterpret_cast<char*>(const_cast<void*>(lua_topointer(L, 1)));
```
こうすることで、dll内でnewしたメモリにアクセスすることができます。

## サンプル
```lua
<?--サイズ60のテキストボックスに
local ffi=require("ffi")
local a=ffi.new("int[10]",{})

for i=0,9 do
obj.load(a[i])
obj.draw(-50,50*i+50)
end

local d=require("test_dll")
d.func0(a,0)
obj.load(string.format("%s",a))
obj.draw()

for i=0,9 do
obj.load(a[i])
obj.draw(50,50*i+50)
end
?>
```
```c++

#include <lua.hpp>
#include "windows.h"

int func0(lua_State* L) {
    char t[100];
    ZeroMemory(t, 100);

    int* data = reinterpret_cast<int*>(const_cast<void*>(lua_topointer(L, 1)));
    if (lua_tointeger(L, 2) == 1) {
        wsprintfA(t, "%p", data);
        MessageBoxA(NULL, t, "test.exe", MB_OKCANCEL);
    }

    for (int i = 0; i < 10; i++) {
        data[i] = i;
    }

    return 0;
}

static luaL_Reg functions[] = {
    {"func0",func0},
    {nullptr,nullptr}
};

extern "C" {
    __declspec(dllexport) int luaopen_test_dll(lua_State* L) {
        luaL_register(L, "test_dll", functions);
        return 1;
    }
}
```

## おわりに
けっこう詰まっていたことだったので、記事にして残しておきます。
これだけのことで数日潰したんですが、長文読みたくなくて避けていた[リファレンスマニュアル](http://milkpot.sakura.ne.jp/lua/lua51_manual_ja.html#3.1)に普通に書かれていたりするので、マニュアル熟読大事ですね。
【就活生向け】座談会でよく聞かれる質問3選

本記事はIT業界に興味のある就活生向けの記事となっています。
# 目次
[1.はじめに](#1-はじめに)
[2.「文系でも大丈夫ですか」](#2-文系でも大丈夫ですか)
[3.「入社前にしておいた方が良いことはありますか」](#3-入社前にしておいた方が良いことはありますか)
[4.「IT業界の魅力を教えてください」](#4-it業界の魅力を教えてください)
[5.おわりに](#5-おわりに)

# 1. はじめに
弊社では説明会、インターンシップなどで社員座談会を実施しています。
そこでは、就活生から若手社員に質問をしてもらって、
就活生の疑問を少しでも解決してもらうような場になっています。
私は、座談会に多々参加しましたが、よく聞かれる質問などもあるので、
弊社の座談会ではお会い出来なかった就活生の疑問も解決できればと思い、本記事を記載しました。

あくまで私の意見のみで記載していますので、
ぜひ就活生の方は様々な企業さんの座談会などで疑問に思っていることを聞いてもらえればと思います。
# 2. 「文系でも大丈夫ですか」
「自分は文系なのですが、ついていけますか」「ITの知識がありませんが、大丈夫ですか」
こちらは、よく聞かれる質問です。
新しい世界に飛び込むことは誰しも不安になりますよね。

**結論から言うと、大丈夫です！**　理由は下記です。
* (ほとんどの会社で)入社後に研修がある
  * 弊社の場合は、4月～6月中旬までビジネス研修とITの基礎を学ぶ研修が、6月中旬～8月までOJT研修があります。
  * 研修の期間で基礎的な知識は得られると思うので、しっかり勉強していけば問題ないと思います。
* そもそも経験者の割合は高くない
  * そもそもですが、IT知識があるプログラミング経験者となると数は少ないと思います。
  * 私の同期も文理の割合では文：理＝4：6くらいでしたが、経験者となると、経験者：未経験者＝2：8くらいでした。
  * 就活をしていると孤独に感じることも多いので不安かと思いますが、「周りも同じかも」と思うことで、ぜひ乗り切ってください。
  * (会社によっては「情報系出身のみ」求人を出している会社もあるとは思います。)
* そもそも文系・理系気にしている人はいない
  * 実際問題、先輩や上司の文理や最終学歴などは存じ上げないです。
  * 学生時代に培ったものももちろん大切なものですが、入社後に得たスキルの方が重要かと思います。

# 3. 「入社前にしておいた方が良いことはありますか」
「入社前にしておいた方が良いことはありますか」「学生のうちに取っておいた方が良い資格はありますか」
こちらもよく聞かれる質問です。
社会人になるのは不安、入社前に一歩リードしておきたい、色んな想いがありますよね。

私が、しておいた方が良いと思うことを下記に記載しました。
矛盾している部分もありますが、良ければ参考にしてください。
* 何もしなくても問題はない
  * 1つ前でも記載しましたが、基礎知識などは研修で身に付けられるので、何もしなくても問題はありません。
  * しかし、ただ何もしないのではなく大学の勉強・研究を思いっきりやる、地元の友だちと思いっきり遊ぶなど、学生の内にしか出来ないことをぜひやってください。
* プログラミングに触れてみる
  * プログラミングをしてみたことが無い人はぜひ、プログラミングとはどういうものなのか経験してみてください。
  * 入社して初めてプログラミングに触れてみて、「自分には合わないかも」と思うのを防ぐ為です。
  * 何かを作るというより、どういうものか体験してみて、楽しいと思えるかどうかを確認することが大事かと思います。
* ITパスポートの勉強をしてみる
  * ITパスポートとはITの基礎知識があることを証明する国家資格です。
  * ITパスポートを入社後に取る新卒は多いかと思いますので、学生の内に勉強することで一歩リードも出来ると思います。
* Excelの勉強をする
  * 意外とエンジニアはExcelを触る機会も多いです。
  * IT業界でなくとも、社会人はExcelを触ることが多いので、基本的な操作方法は押さえておくと良いと思います。
# 4. 「IT業界の魅力を教えてください」
「IT業界の魅力を教えてください」「なぜ、IT業界を志望しましたか」
IT業界に進むかどうか悩んでいる方から聞かれることが多いです。

* 成長性がある
  * やはり、一番はこちらかと思います。
  * 世の中のIT化が進むということは、IT業界の仕事が増えていくということです。
  * 機械化のせいで奪われる仕事がある中、安定して仕事があるIT業界は魅力的と言えます。
* IT知識が身に付く
  * IT化の世の中でIT知識が業務を通して身に付くことで、プライベートでも役に立つことがあります。
  * もし、他業種に転職するとなっても得たスキルが役に立つのではないでしょうか。
* 色んな業種に携われる
  * ITだけの仕事というものはあまりなく、「○○の問題をITで解決したい」「○○×IT」というご要望や開発が多いので、自分からは関われないような、色々な業種の仕事を学べることはITならではだと思います。
* かっこいい
  * 個人的な意見ですが、ITってやっぱりかっこいいですよね？？
# 5. おわりに
あくまで私の意見でしたが、参考になりましたら幸いです。
他に聞いてみたいことがあれば、随時受付中ですので、ぜひコメントで聞いてください。

また、他の方に聞いても新しい話が聞けると思うので、色々な方に不安や疑問を聞いてみてください。
IT業界に限らず、あなたに合った職場に巡りあえることを祈っています。
yarnとnpmがタイムアウトして動かないときの対処法

# yarn とnpmが動かない

yarn
```
yarn add v1.22.19
[1/4] Resolving packages...
info There appears to be trouble with your network connection. Retrying...
info There appears to be trouble with your network connection. Retrying...
info There appears to be trouble with your network connection. Retrying...
info There appears to be trouble with your network connection. Retrying...
error An unexpected error occurred: "https://registry.yarnpkg.com/global: ETIMEDOUT".
info If you think this is a bug, please open a bug report with the information provided in "***/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.
```
npm
```
[..................] | idealTree:regal: sill idealTree buildDeps
```

といった感じで何も動かない。

## 対処法

一旦バージョンを下げる。

```
nvm install 16.2.0
```

で今回はうまく行きました。
forward-forward algorithm: 誤差逆伝播を用いない重みの更新手法

# はじめに
この記事はヒントン教授らが提案した forward-forward algorithmの概要の解説記事になります。
以下のURLの論文(まだpublishされていない)とプログラムを参考にしています。
また図はプログラムが実装されているGithubの図を拝借しています。

- 論文

https://www.cs.toronto.edu/~hinton/FFA13.pdf

- プログラム

https://github.com/mohammadpz/pytorch_forward_forward 


# 結論(時間のない方向け)
- 誤差逆伝播を用いないforward-forward algorithmを提案
- 重みの更新方法が生物ライク
- 省メモリかつ省エネルギー
- MNISTやCIFAR10で一部モデルにおいて誤差逆伝播法と同様に学習が進行

# 内容
## 問題提起
現在使われている誤差逆伝播法は、計算量が多い(順伝播逆伝播で2回全ての経路を辿る、逆伝搬で順伝搬の計算過程を保持する必要があるためメモリの消費量が激しい)こと、生物の脳、とりわけ神経ネットワークを考えた時に逆伝播を用いていない(そもそも物理的に伝播は不可能)であるという問題がありました。


## 手法
今回は上記の問題がある誤差逆伝播を用いず、順伝播のみで完結するアルゴリズムを開発しました。

![ff1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/6c779414-4d8a-9ec7-76a2-1226d8c208bb.png)


手法の概要は以下です。

1. 学習データについて正解データ(positive)と不正解データ(negative)を作成する。(２種類のforwardでそれぞれ用いる)
2. データを任意のNNで順伝播させる。
3. (活性化関数を噛ませた後の)**各層の出力の二乗**をGoodnessと定義する
4. 正解データのGoodnessが閾値よりも大きく、不正解データのGoodnessが閾値よりも小さくなるように重みを**各層ごとに**更新


つまり入力データに関して正解と不正解を見分けられるように学習を進めるということになります。
データが２種類あるので、forward-forwardという名前がついていて、正解データは正解データだけのバッチ、不正解データは不正解データだけでバッチが構成されます。

![ff2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/cc467e3a-6b36-42eb-75cc-93151ada1e1b.png)


教師ありの場合は、上記のデータの作成方法の手法が以下のように変わります。
 (旧)学習データについて正解データ(positive)と不正解データ(negative)を作成する。(２種類のforwardでそれぞれ用いる)
⇩
(新)学習データについて正解データ(positive)と不正解データ(negative)を作成し、最初のラベル個数分のpixelに正解ラベルを重ねる(overlay)

図で表すと以下のようになります。

![ff3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/328906ff-e4eb-3978-8e54-15b1f1fc1f80.png)


推論の方法は、推論用のデータをラベル個数分用意して、それぞれに異なるラベルを付与します（プログラムでは違う実装だが、説明のため左の表現)。
つまりラベルが3種類の場合は、ラベル1,2,3が載った推論データがあるということです。

そしてモデルにそれぞれのデータを入力し、各層においてそれぞれのGoodnessを計算して、最もGoodnessが大きかったラベルを正解ラベルとします。
学習では、正解データのGoodnessを高く、不正解を低く学習するようにしていたので妥当な推論方法です。


推論時には順伝播の回数が増えてしまうこと、ImageNetなどのラベルの個数が多い場合に順伝播の回数が爆発的に増えてしまうことはデメリットですが、
学習時に逆伝播を用いないことで必要メモリが大幅に減少するので、低電力かつ低資源で学習を行うメリットがあります。

# 終わりに
この論文の詳細は、論文のURL(https://www.cs.toronto.edu/~hinton/FFA13.pdf) からご確認ください。

プログラミングのテクニックはZennでまとめています。


https://zenn.dev/sergicalsix
Githubで "Enter passphrase for key" を回避するときの備忘録

# 概要
- シェルスクリプトを書くに当たって、毎回パスフレーズを聞かれるとやりたいことが実行できなかったので回避策を模索した。

# 方法
`ssh-agent`をスタートする
```
eval `ssh-agent -s`
```

`private key`を`ssh-agent`を使って追加する
```
$ ssh-add ~/.ssh/id_rsa_key  
Enter passphrase for /home/user/.ssh/id_rsa_key:  
Identity added: /home/user/.ssh/id_rsa_key   
(/home/user/.ssh/id_rsa_key)  
```

鍵が追加されているか確認する
```
$ ssh-add -l  
2048 55:96:1a:b1:31:f6:f0:6f:d8:a7:49:1a:e5:4c:94:6f  
/home/user/.ssh/id_rsa_key (RSA)
```

githubに接続してみる
```
ssh git.example.com
```

# 最後に
上記を実行することで、パスワード入力を回避することができた。
Strapi v4を書き換える

Strapiの売りはカスタマイズ性なのですが、そのあたりの説明をv4以降であまり見かけないので書いてみることにします。

Strapiの画面の編集は、node_modulesの中を見に行って書き換え、それを`patch-package`で適応するという形式で行います。

## どこを見に行けばいいのか

`node_modules/@strapi/admin/admin/src/pages/Admin/index.js`を見に行けば、どうすればいいのか大体わかります。
本当にこれさえ見ればなんとなく察しがつくので、正直**これを紹介した時点でこの記事の90%は終わりです**。

ここでは、パッケージ内から様々なコンポーネントをインポートし、それらをパスに合わせて管理画面を書き換える処理が行われています。
なので、だいたいここに記載されている相対パスの先の記述を書き換えればよいです。

たとえば、`/admin/`の箇所は以下のように指定されているので、

```jsx
const HomePage = lazy(() => import(/* webpackChunkName: "Admin_homePage" */ '../HomePage'));
```

`node_modules/@strapi/admin/admin/src/pages/HomePage/index.js`を書き換えるといった具合です

## 実際に書き換えてみる

ためしに、管理画面のトップページに適当な文字列を挿入してみます。

```node_modules/@strapi/admin/admin/src/pages/Admin/index.js
//...
  return (
    <Layout>
      <FormattedMessage id="HomePage.helmet.title" defaultMessage="Homepage">
        {(title) => <Helmet title={title[0]} />}
      </FormattedMessage>
      <Main>
        <LogoContainer>
          <img alt="" aria-hidden src={cornerOrnamentPath} />
        </LogoContainer>
        <Box padding={10}>
          <Grid>
            <GridItem col={8} s={12}>
              <HomeHeader
                onCreateCT={handleClick}
                hasCreatedContentType={hasAlreadyCreatedContentTypes}
              />
            </GridItem>
          </Grid>
          <Grid gap={6}>
            <GridItem col={8} s={12}>
              {showGuidedTour ? <GuidedTourHomepage /> : <ContentBlocks />}
            </GridItem>
            <GridItem col={4} s={12}>
              <div>
                // 追加
                <p style={{color: "#ffffff"}}>おほげおほげ</p>
                <SocialLinks />
              </div>
            </GridItem>
          </Grid>
        </Box>
      </Main>
    </Layout>
  );
// ...

```

それでは実行してみましょう。

注意点として、普段は`yarn develop`とか`npm run develop`なんかで実行するかと思いますが、それでは`dist/`を吹き飛ばして再度buildしないと反映されないので、従来のコマンドではなく以下のコマンドで実行する必要があります。

```bash
yarn develop -- --watch-admin
# or 
npm run develop -- --watch-admin
```

実行結果はこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532032/748fd9e5-8f76-72c0-af5c-dbae48a446e4.png)

Join thne communityの上に、謎の文字列`おほげおほげ`が追加されていることがわかると思います。

もっと細かい書き換えとなると色々慣れが必要ですが、StrapiはReactの関数コンポーネントで記載されているので、Reactに書きなれていれば特に不自由することはないかと思います。

## patch-packageでinstall時に上書きさせるようにする

それでは、これを本番に反映します。
`patch-package`をインストールし、`postinstall`を追記します。

```bash
yarn add patch-package
```

```package.json
// ...
  "scripts": {
    // ...
    "postinstall": "patch-package"
  }
// ...
```

そして以下を実行

```bash
npx patch-package @strapi/admin
```

今回は`@strapi/admin`を編集したので上記コマンドとなっています。sdmin以外を編集した場合はそれに合わせてください。

実行すると、`patches/`が生成され、その中に`@strapi+admin+<version>patch`というファイルが生成されます。
中を見るとわかりますが、元のライブラリとの差分を記載したファイルです。

これで準備完了です。
こうすることで、`node_modules/`を吹き飛ばしても、`yarn install`などのコマンドを実行した際に差分をもとに上書いてくれます。
【まとめ】モデル駆動型アプリ

モデル駆動アプリについて書いた記事をこちらでまとめます。

１つ１つの記事で完結しているので、必要なところだけ見ていただくのもいいですし、
体系的に学びたい方は順番に見ていくのもおすすめです。

以下に各記事のURLまとめていますので、参考にしてください。
モデル駆動型アプリマスターになりましょう！
モデル駆動型アプリについて書いたら、こちらの記事にどんどん更新していきます。


【概要編】
[モデル駆動型アプリとDataverse](https://qiita.com/skuramoto/items/317ca8658fad8899ec03)
[モデル駆動型アプリのOffice365連携](https://qiita.com/skuramoto/items/8c743dbfb492c70c2599)
[モデル駆動型アプリのフォームの種類まとめ](https://qiita.com/skuramoto/items/ec631ca9404adff1955a)

【操作編】
[モデル駆動型アプリでリレーションシップを使いこなす](https://qiita.com/skuramoto/items/ab2498362ec30c3913d7)
[モデル駆動型アプリのコマンドバーのカスタマイズ](https://qiita.com/skuramoto/items/acde7968aba1b1e01f0c)
[モデル駆動型アプリにキャンバスアプリを表示する](https://qiita.com/skuramoto/items/fce8d47ab6a979175f4e)
[Dataverse検索機能をオンにする](https://qiita.com/skuramoto/items/8986259ecbe7e2b2e382)
[モデル駆動型アプリにPower BIを追加する](https://qiita.com/skuramoto/items/927f9767c8aaabc28543)
[Power Appsのアプリのアクセス権](https://qiita.com/skuramoto/items/6937fb5bcfab72633ec9#%E3%83%A2%E3%83%87%E3%83%AB%E9%A7%86%E5%8B%95%E5%9E%8B%E3%82%A2%E3%83%97%E3%83%AA)
[モデル駆動型アプリの見た目をよくしよう！
](https://qiita.com/skuramoto/items/be538b70643a798339ef)
[モデル駆動型アプリのビューやフォームを左メニューで切り替えたい！](https://qiita.com/skuramoto/items/339f27a557d7d8819e77)
【セキュリティ設定】
[Power Platformのセキュリティロールについて](https://qiita.com/skuramoto/items/fe305aac24273c7cccbf)
[Dataverseの列ごとの権限付与方法](https://qiita.com/skuramoto/items/3a46d386d19478e220d7)
[フォームのアクセス権限の設定](https://qiita.com/skuramoto/items/628ac9ea412eb34b63c0)
ResourceAccessManagerによるリソース共有方法について

# 本記事について
この記事では３回目のANS-C01を受けるにあたって勉強した内容を整理するための記事です。
詳しくは[こちら](https://qiita.com/the13-HK/items/349cdf5f38e0ce1e47b1)をご覧ください。
今回はResourceAccessManagerについての記事となります。
ネットワーク関連のサービスではありませんが、ANS-C01の試験でResourceAccessManagerの使用方法について問う問題が出題されていたので、使用方法について一度整理しておきます。


# ResourceAccessManagerとは
AWSアカウント間のリソースを共有する際に使用するサービス
ANS-C01試験では他アカウントリソースにアクセスする際の手順を問う問題が出題されていた。
共有先の指定はアカウントID指定でも可能だが、Organizationsを使用することで、組織全体またはOU指定が可能
アカウントID指定の場合は**受け手側で承認が必要**だが、OUを使用した共有では**受け手の承認は不要**

# アカウントID指定の場合のResourceAccessManagerの手順
1. **共有する側のアカウント**でResourceAccessMangerを開き、[Shared by me]→[Resource Shares]を選択
1. **共有する側のアカウント**で[Create resource share]ボタンを押下
1. **共有する側のアカウント**でリソースタイプを選択し、共有先アカウントを選択
1. **共有される側のアカウント**でResourceAccessMangerを開き、[Shared with me]→[Resource Shares]を選択
1. **共有される側のアカウント**で招待を承認
1. **共有される側のアカウント**で対象リソースのコンソール画面に移動し、共有リソースが表示されることを確認


## 共有できるリソースの一覧
[こちら](https://docs.aws.amazon.com/ram/latest/userguide/shareable.html)を参照

## 共有先の上限
デフォルトで5,000と大人数での共有を想定した作りになっている。
ソフトリミットのため、サポートに問い合わせることで上限引き上げ申請が可能
Google UXデザイン：モックアップを見直すためのチェックリスト

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<details><summary>これまでの振り返り</summary>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/f2187262-b8bf-f99d-7690-daa56c7093fc.jpeg" width="700">

</details>

# チェックリスト

経験豊富なデザイナーでさえ、さまざまな場面でデザインの作成を一時停止し、進捗を確認する必要があります。チェックリストを使って、あなたのモックアップを見直します。

チェックリストには４つのカテゴリがあります。
1. 詳細レベルのビュー
1. ページレベルのビュー
1. 機能レベルのビュー
1. アプリレベルのビュー

## 1.詳細レベルのビュー

まず小さなことに注目することで、要素に間違いがある可能性がある箇所を発見することができます。

- タイポグラフィー
- カラー
- アイコン

など個々の要素を見直し、モック全体で一貫性があるか、順番が狂っていないかをチェックすると効果的です。

#### Sample

自分の作品を確認したところ、通常オレンジ色の"fa7b17"を使用しているにもかかわらず、誤ってオレンジ色の"f18530"を使用しているアイコンが1つありました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/237ff7b7-5965-12e0-7196-f7498b342cf8.png" width="500">

## 2.ページレベルのビュー

ページレベルのビューを使って、各ページのすべての要素がバランスよく統一されているかどうかをチェックします。ページを俯瞰して、何か違和感がないかをチェックします。このとき、ページ内の要素のスケールやプロポーションを考えるのもよいでしょう。

#### Sample

- 最初のバージョンでは、人の名前を目立たせるために、経歴をインデントしました。しかし、ページレベルで見てみると、経歴が他のページとバランスが悪いように感じ、代わりにすべてを左寄せにすることにしました。
- 最初のバージョンでは、チェックマークのアイコンが単独で表示されていました。そこで、チェックマークアイコンの周りにグレーの丸を付けて、ページのバランスを整えました

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/54825c7c-3739-7415-9bc6-b51cd181ca85.png" width="500">

## 3.機能レベルのビュー

デザインが動作することを確認する必要があります。特に、プロトタイプの準備ができるように、ナビゲーション要素がすべてデザインに含まれているかどうかを確認します。

そのために、次のような自問自答してください。

- 各ページに進む方法と戻る方法があるか？
- そのページのメインアクションを実行するためのボタンはあるか？
- ユーザーが操作を取り消すためのボタンは必要だろうか？

#### Sample

- 左上に戻る矢印や右上の×印などの要素があるかどうかをチェックします。
- ユーザーがそのページのメインアクション（予約するボタン）を実行できるボタンが含まれているかどうか確認します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/47e6a3d0-8a6d-ca95-fa41-1ddcf2fcd747.png" width="350">


## 4.アプリレベルのビュー

最後に、一歩下がって、デザイン全体を見直します。これは、アプリ全体を見直すことから、アプリレベルビューと呼ばれています。デザインを全体像から考えることで、製品全体の見た目や機能が思い通りになるかどうかを確認することができます。

そのためには、Figmaでズームアウトして、デザインの複数のページを同時にレビューできるようにすることをお勧めします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/738608d6-96d6-a656-67be-e7d9fa28be3e.png" width="６00">


#### Sample

アプリのページ上部にある3つのアイコンは、どのページを見ても同じ位置にあるべきですね。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/20ff0dd7-710b-16c4-c49b-0c658a0de2eb.png" width="500">

---

これで、デザインを見直すための4つのステップのチェックリストが完成しました。これは、デザインを反復し、改善するためのもう一つの瞬間です。
【Swift】初心者のランダム通話アプリ開発奮闘記 #15

# 今日の積み上げ
作ったアプリケーションを自分のiPhoneにインストールして、そのGif画像を撮ってみました。
iPhoneとMacをLightningケーブルで繋いだときに、謎のエラーメッセージが出ましたが、以下でサクッと解消。Qiita様様。
https://qiita.com/nonkapibara/items/d14c796ca69c8a4e58d2

成果物のGifだけ置いておきます。
![2022:12:20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/997222/47679820-22fb-2346-bcd6-a43c1edaa03e.gif)

「ようこそ!!」のボタンを押したら、テキストが変わるだけのシンプルなアプリです。
ちなみに、Glanzehreは、箱推しのコンカフェです。

# 日記
会社の忘年会が木曜日なので、一応、コロナの抗原検査を受けたら、まさかの陽性…
一週間の隔離生活ですが、幸い熱も上がらず、リモートワークなので、仕事します🤮
Sfdcケースのドラフト送信（承認申請から送信）

# 要件
・対象OBJはケース
・メール作成時にメールパターンによって任意の項目が自動で反映される（アクションボタンの条件をそのまま反映）
　任意の項目：送付元アドレス、宛先、追加先、ＢＣＣ
・既存のclassicメールテンプレートをに差し込むことで本文、件名が自動で入る
・作成したメールを一時保存でき、そのメールを第三者（SuperVisor）に確認依頼（割り当て）できる
・第三者（SuperVisorどちらも有）が承認した場合、一時保存されたメールが送付される
・第三者（SuperVisorどちらも有）が棄却した場合、一時保存されたメールが作成者に割り戻る

# 案
・ケースに対し、ドラフト送信機能がある
　ケースだけに効く、メールToケースとドラフトメールの設定は有効の前提です。
　参照：　https://qiita.com/piepie1231/items/163eb8ae733ea724e556
・任意項目の設定はメールのクイックアクションで実装可能
　参照：　https://help.salesforce.com/s/articleView?id=sf.case_interaction_send_email_quick_action_create.htm&type=5
# 制限
・自動承認者はユーザしかできない。グループなどができないみたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/50ba3282-3bbc-7f07-d9a5-d594944eb4e9.png)
・ケース以外またメールメッセージに保存されないものは「承認申請」ができないです。
　ケースの送信の承認不要がユーザのプロファイルまた権限セットが制御できます。（案の参照１）
・ケースの承認不要の送信なら、上記案の参照２のアクションではなく、「EmailAuthor」で実装ができそう

# ポイント
①実装と設定は案の参照で十分です。
②承認申請のメール
　なかにメールへのリンクが必要です。（{!EmailMessage.Link})
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801991/1c525cd0-ed76-9e44-7f1e-154815c101d9.png)
WinMerge のコマンドラインオプションをつかってみる

## 自己紹介

- 非エンジニアです。
- コマンドプロンプトを起動する方法や操作方法を知らないレベルです。
- したがって、初歩的な内容になっています。

## このテーマを選んだきっかけ

- WinMergeを用いて、テキストや画像の差分確認を行う頻度が増えていて、コマンドプロンプトで効率化できないか試してみたいと思いました。


## 前提知識・事前準備
- WinMergeとはテキストや画像等の差分確認が行えるオープンソースのツールです。
    - 以下[公式サイト](https://winmerge.org/?lang=ja)からの引用です。
> WinMerge は、 オープンソースのWindows 用比較・マージツールです。WinMerge は、フォルダとファイル両方が比較でき、理解しやすく扱いやすいテキスト形式で差異をビジュアルに表現します。
- DLの手順はこちらの記事では割愛します。
    - [公式サイト](https://winmerge.org/downloads/?lang=ja)からDLできます。

## コマンドプロンプトからWinMergeを開く
- コマンドプロンプトを起動します。
-  `cd C:\Program Files (x86)\WinMerge`と入力するとWinMergeのあるディレクトリに移動します。
- 続いて、`WinMergeU`と入力すると、WinMergeが起動できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981518/b605e127-5ec9-b11d-18af-eff7809f4ca2.png)

## WinMergeのコマンドラインオプションを使用する
- `WinMergeU`に続いて、`/` や、`-`で始まるパラメーターを付加することで特定の操作を行えます。
    - ヘルプを開く
        - `WinMergeU /?`と入力すると、WinMergeと一緒にヘルプが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981518/8234a013-4f71-32a6-5587-6c5b60300988.png) 
    - ファイルを比較する
        - `WinMergeU ファイルAのパス ファイルBのパス`と入力すると、ファイルAとファイルBの差分を確認できます。
   ![比較画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981518/88e37e97-6fda-c77d-17fd-cdfff1382635.png)

## まとめ
- 今回は、コマンドプロンプトからWinMergeを起動して、ファイル単位で差分比較を行うところまでできました。
    - ここまででも、事前にファイルのパスを用意するなどして、効率化に繋げられそうです。
- フォルダ単位でまとめて比較していきたいので、引き続き模索していこうと思います。
    - 該当のコマンドやその他便利そうなコマンド（クリップボード履歴の直近２つの内容を比較する等）は今回実行に失敗してしまいました。再挑戦します。
    
## 参考にしたサイト

[WinMerge公式のマニュアル](https://manual.winmerge.org/jp/Command_line.html)

[WinMergeのコマンドラインオプション](https://qiita.com/mima_ita/items/ac21c0588080e73fc458)
luajitでガウシアンぼかし

　
この記事は[アドカレ](https://qiita.com/advent-calendar/2022/lua)に参加しています。

# luajitでガウシアンぼかし
[前回の記事](https://qiita.com/metaphysical_bard/items/ef14aea4e6941c04613d)の延長線上にあることをやります。

## ガウシアンぼかしとは
ガウシアンぼかしとは、[ガウス関数](https://ja.wikipedia.org/wiki/ガウス関数)で重みを付けたぼかし処理のことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005402/2fd89dc3-0234-aa87-6bf6-5dfe851cbbed.png)
ガウス関数は中心近いほど値が大きくなり、中心から離れるほど値が0に近くなっていきます。これをぼかし処理に適用すると、近くにあるピクセルほど重みが強くなり、遠くにあるピクセルの影響は微小になります。
　
## アルゴリズム
先人の方達が素晴らしいアルゴリズムを共有してくださっています(take2
[言語不問で実装する高速な移動平均処理](https://qiita.com/carnage/items/2dde28f0344b455aa62c)
[フィルタ処理の高速化アルゴリズム（縦横に処理を分ける）](https://imagingsolution.blog.fc2.com/blog-entry-156.html)
[gaussian フィルタ](https://wgld.org/d/webgl/w057.html)
[画像フィルター：ガウスぼかし](https://ichi.pro/gazo-fyiruta-gausu-bokashi-258620841755057)←これすき

## コード
.anmとして使用できます。
```lua
--[[

blur.anm
	ガウシアンぼかしです。

]]

--track0:size,1,50,10,1

local ffi=require"ffi"

pcall(ffi.cdef,[[
    typedef struct Pixel_ {
      uint8_t b,g,r,a;
    } Pixel;
  ]])

local work,data,w,h=obj.getpixeldata"work",obj.getpixeldata()
local c=ffi.cast("Pixel*",data)
local r=ffi.cast("Pixel*",work)

local function f(a)--0~255の範囲で四捨五入する関数。
 if(a<0)then return 0
 elseif(a>255)then return 255
 else
  return math.floor(a+0.5)
 end
end

local t0=obj.track0/3
local ha=math.floor(obj.track0)
local ha2=ha*2+1
local ta={}
local total_ta=0
for i=1,ha2 do--taにガウス関数で重みを付ける
 local s=(i-1)-ha
 ta[i]=math.exp(-(s*s)/(2*t0*t0))/(math.sqrt(2*math.pi)*t0)
 total_ta=total_ta+ta[i]
end

for i=1,ha2 do--taの合計値が1.0になるようにする
 ta[i]=ta[i]/total_ta
end

local qt={}--ぼかす際の変数を入れる
local af=ffi.new("Pixel",{0})

--横方向
for y=0,h-1 do
 local ix=y*w
 local s=-ha

 for i=1,ha2 do
  if(s>=0 and s<w)then
   qt[i]=c[ix+s]
  else
   qt[i]=af
  end
  s=s+1
 end

 for x=0,w-1 do
  local to={0,0,0,0}

  for i=1,ha2 do
   to[1]=to[1]+qt[i].r*ta[i]
   to[2]=to[2]+qt[i].g*ta[i]
   to[3]=to[3]+qt[i].b*ta[i]
   to[4]=to[4]+qt[i].a*ta[i]
  end

  r[ix].r=f(to[1])
  r[ix].g=f(to[2])
  r[ix].b=f(to[3])
  r[ix].a=f(to[4])

  for i=1,ha2-1 do
   qt[i]=qt[i+1]
  end

  if(x+ha+1<w)then
   qt[ha2]=c[ix+ha+1]
  else qt[ha2]=af end
  ix=ix+1
 end
end

--縦方向
for x=0,w-1 do
 local ix=x
 local s=-ha

 for i=1,ha2 do
  if(s>=0 and s<h)then
   qt[i]=r[ix+s*w]
  else
   qt[i]=af
  end
  s=s+1
 end

 for y=0,h-1 do
  local s=-ha
  local to={0,0,0,0}

  for i=1,ha2 do
   to[1]=to[1]+qt[i].r*ta[i]
   to[2]=to[2]+qt[i].g*ta[i]
   to[3]=to[3]+qt[i].b*ta[i]
   to[4]=to[4]+qt[i].a*ta[i]
  end

  c[ix].r=f(to[1])
  c[ix].g=f(to[2])
  c[ix].b=f(to[3])
  c[ix].a=f(to[4])

  for i=1,ha2-1 do
   qt[i]=qt[i+1]
  end

  if(y+ha+1<h)then
   qt[ha2]=r[ix+(ha+1)*w]
  else qt[ha2]=af end
  ix=ix+w
 end
end

obj.putpixeldata(data)

```

## おわりに
実はこれの[gpu ver.](https://discord.com/channels/957447213636784149/957452804270743573/1048823274659926207)をc++ ampで書いてみたのですが、上手く高速化できませんでした。gpu、難しいですね。
【Github】プルリクエストのレビューコメントが表示されない原因と解決方法（インラインコメントのpendingとは？）

# 困ったこと
* Aさん（自分）はソースコードを改修したのでGithubでプルリクエストを行い、Bさん（先輩）がレビューをして何点か指摘を行った
* しかし、BさんのブラウザでのGithubではレビューコメントが表示されているのに、AさんのブラウザでのGithubではレビューコメントが表示されないという状態になった。なぜ？？

# 原因の模索
* アクセス権限が関係あるのかなと思ってAさんもBさんも確認したが、特に問題はなさそう（というよりそもそも権限なかったらプルリクできない？）
* Googleのオートコンプリートやサジェストでも「github コメント 表示されない」「github レビュー 表示されない」「GitHub review comments not showing」といったキーワードが沢山出てくるが、それらしい日本語の記事が見つからない
* ということで、なかなか時間がかかりましたが、以下英語記事を見たら原因と解決方法が分かりました
    * [How to view line comments in GitHub?](https://stackoverflow.com/questions/10248666/how-to-view-line-comments-in-github)

# 原因は「インラインコメント」がPendingであることだった
* 原因はレビューした方が行った「インラインコメント」にあります。インラインコメントとは、簡単に言うとソースコードの個々の行に対してコメントを残すことができる機能です。プルリクの説明欄に書くよりも、個々のコードに対して指摘したい場合は活用できます。
    * インラインコメントの公式ドキュメントはこちら：[プルリクエストへのコメント](https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/commenting-on-a-pull-request)
* インラインコメントの順序は、以下の通り。
    *  コメントを追加するコード行にカーソルを合わせ、青い＋マークをクリックする
    *  コメントフィールドにコメントを入力し、「Add single comment」をクリックする
    *  右上の「Review changes」（Finish your review）を選択し、最後に総評などを入れて「Submit review」をクリックする
* 原因は、これを最後まで完了していないことにあったのです。
 
# 解決方法
* 解決方法は、レビュアー（レビューを行う人）が「Submit review」までクリックすることです。
    * Submitしていない状態だとインラインコメントはすべてpending（黄色）になっているはずです
* つまり、インラインコメントは「Add single comment」しただけでは、レビューイ（レビューを受ける人）には見えていません。Submitしていなくても、レビュアーには、プルリクエストのコメント欄に「～～commented now」と記載されており、あたかも記載完了しているように見えていることが要注意です。
* 海外のサイトなど調べてみると、「Add single comment」だけで反映してほしいといったようなコメントがたくさんありますね。。。issuehuntにも上がっているようです。仕様が変わる時が来るかもしれません(-_-;)

# Conversationを活用したレビュープロセス
* 以下記事では、インラインコメントを利用した場合のレビュープロセスが記載されていますので、参考URLとして。
    * [GitHub における PR レビュープロセス - conversation の活用](https://developer.mamezou-tech.com/blogs/2022/06/29/reviewing-pr-on-github/)
    * ここでもしっかり書かれていますね

> インラインコメントは、即時にレビューイに開示されるのではなく、Pending 状態になり、レビューを完了するまでは、レビュアーにのみ見えています
AWS DevOps Engineer Professional(DOP)に合格しました

先日のSOAに続いて、AWS DevOps Engineer Professional(DOP)に合格しました。
備忘のために記事を投稿します。

・SOAの記事はこちら
https://qiita.com/mushipan66/items/70620cef4a70b4abee9b

# AWS DevOps Engineer Professional(DOP)について
https://aws.amazon.com/jp/certification/certified-devops-engineer-professional/

:::note info
2023年3月7日に試験が変更になるため、現行試験は3月6日までです。
:::

# 学習期間
約1ヶ月で平日1時間、休日2～3時間(合計40時間くらい)です。

# 使用した教材と学習方法
①テキスト
[ポケットスタディ AWS認定デベロッパーアソシエイト](https://www.shuwasystem.co.jp/smp/book/9784798063409.html)
2022/12の時点ではDOP専門の書籍はないため、DVA受験時に使用した書籍を参考書代わりにしました。

②問題集
[TechStock | AWS WEB問題集で学習しよう](https://techstock.jp/)
解答の暗記にならないように気を付けながら3周解きました。
SOAでも使いましたが本番の試験問題に雰囲気が近いと思います。

③資料
[AWS Black Belt](https://aws.amazon.com/jp/events/aws-event-resource/archive/?cards.sort-by=item.additionalFields.SortDate&cards.sort-order=desc&awsf.tech-category=*all)
SOAの対策と同じく、試験範囲のサービスについて具体的にどう使われるのかを意識して読み込みました。

問題集を解いて不明な箇所を参考書やBlack Beltを読んで理解する、というのを繰り返しました。

# 所感
全体的な難易度としてはプロフェッショナルレベルではSAPよりは難易度が低く感じました。
参考書やBlack Beltを読み込んでサービスを理解度を上げれば十分合格圏内に届くかと思います。
アソシエイト含めた個人的な難易度は以下の通りです。
SAP > DOP > SOA > SAA > DVA

# さいごに
AWSについては、ひとまず目標にしていたDOP取得まで達成できたので、資格取得をきっかけにこれからさらに理解を深めていきたいです。
また、今後はAzureも勉強しようと思います！
イーサリアム 2.0：RANDAO とは

イーサリアム 2.0 の PoS の処理の中、いくつの `ランダム値` が必要な場面があります。イーサリアム 2.0 の場合は、この処理を担当しているのが `RANDAO` になります。

https://qiita.com/blueplanet/items/58839a15e721df7e6175

## ランダム値に対する要件
ブロックチェーンの分散化の性質上で、すべての計算は他の検証者によって検証されます。そのため、ランダム値と言っても、完全なランダム値になると検証できなくなってしまうので、ブロックチェーンにはそのまま使えません。イーサリアムの RANDAO は、その代わり、ブロックチェーンの一部として計算・更新されるシードから擬似的なランダム性を生成しています。

詳細要件を整理してみますと

1. 検証する際に同じ結果になる必要があるため、同じシードから生成した値は必ず同じになること
2. シードは予測不可能であること
    - １番目の要件から、シードも予測可能になると、計算結果を狙って、いつ入金・出金するか、公開鍵を何にするかを戦略的に決めることができしまい攻撃されやすいため、シード自体は予測不可能である必要がある

## ランダム処理の流れ
`シードから擬似ランダム値を生成する` ことで、要件 1 を対応します。
要件 2 については、下記の複数のルールで保証します。

- シードは、誰か１人ではなく、スロットのブロック提案者がシードに混ぜられる（つまり XOR される）ハッシュを提供することでどんどん更新する
- エポック毎に、シードを計算する
- エポック N でエポック N+5 のバリデーターセットを固定する
    - エポック N+5 で自分が委員会またはブロック提案者になることを分かったとしても、エポック N から エポック N+4 までの間、別のブロック提案者によって予測できない更新が入っているため、結果的にエポック N+5 のシードは予測できない
- エポック N の開始時にエポック N+1 のシードを計算して、既に決められたバリデーターセットから提案者と委員会の役割を決める
    - ブロック提案者は、エポックごとに 32 回の更新の中の 1 回しか制御できないため、結果的に最終的なシードに影響できず、計算結果を制御できない

## RANDAO の実装
https://github.com/randao/randao

RANDAO は独立して実装されています。イーサリアム上にはベース部分として他のスマートコントラクトに呼び出されます。
RANDAO のランダム値生成流れは、３つのフェーズから構成されています。

- フェーズ１：参加者を募集する
    - 参加希望者は指定の時間ウィンドウ期間内に、スマートコントラクトに保証金と各自選択した任意数字のハッシュ値を送信する
- フェーズ２：有効なハッシュ値を収集する
    - フェーズ１が終了した後、フェーズ２の時間ウィンドウ期間内に、参加者がスマートコントラクトにフェーズ１で選択した数字を送信する。スマートコントラクトは数字が正しいかどうかを検証し、正しいならランダム生成関数のシードに保存する
- フェーズ３：ランダム値計算し、報酬を送金する
    - フェーズ２で有効な数字を収集した後、全ての有効な数字から最終的なランダム値を生成し、スマートコントラクトに保存して、ランダム値をリクエストした他のスマートコントラクトに結果を返す
    - フェーズ１で預かった保証金を返し、他のスマートコントラクトが支払った手数料を報酬としてすべての参加者に送金する

また、ランダム値の結果がコントロールされない為、スマートコントラクトに下記のルールが追加されています
- フェーズ１で、同じハッシュ値が収集された場合、１番目だけを受け取る
- フェーズ１では、最小参加者数の設定があります。時間ウィンドウの期間中その数にならなかった場合、その回のランダム値計算は失敗とする
- フェーズ１でハッシュ値が受け取れた場合、フェーズ２では必ず数字を提出しなければならない
    - フェーズ２で数字を提出しなかった場合は、フェーズ１で預かった保証金は没収されてしまう
    - フェーズ２で、全ての数字が収集できなかった場合、その回のランダム計算は失敗とする。他のスマートコントラクトが支払った手数料を返金し、預かった保証金を収集できた参加者に送金する

## まとめ
`ランダム値がほしいが、検証する際に必ず同じ結果を得られなければならない` という一目で見ると矛盾そうな要件を実装した RANDAO の紹介でした。

## 参考資料
https://www.youtube.com/watch?v=uKDCXj8ViGg&t=2s

https://github.com/randao/randao
空間図形「前橋工科大学2018年第２問」をsympyとFreeCADでやってみた。

...空間内に，3点...
オリジナル

https://mathmathmass.exblog.jp/32649846/

上と同じです。大学入試数学問題集成＞【２】

https://mathexamtest.web.fc2.com/2018/201811205/2018112050100mj.html#top-0102

(編注)　Cの座標は原典通り．
# sympyで(オリジナルのやり方)
勉強中

# sympyとFreeCADのマクロで(sympy的?安易なやり方)
FreeCADのマクロからsympyを使っています。
作図は,a=b=1です。

```python
import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# 計算
from sympy import *
a=Symbol('a', positive=True)
b=Symbol('b', positive=True)
def myMensekiVector3D(P,Q):
    return Rational(1, 2) * sqrt(P.distance(Point(0, 0, 0)) ** 2 * Q.distance(Point(0, 0, 0)) ** 2 \
                                 - P.dot(Q) ** 2).simplify()
O,A,B,C=map(Point,([0,0,0],[a,b,0],[0,b,a],[a,0,a]))
S=myMensekiVector3D(B-A,C-A)
print("#(1)",myMensekiVector3D(B-A,C-A))
H=Plane(A,B,C).projection(O)
print("#(2)",H)
print("#(3)",Rational(1,3)*S*O.distance(H).simplify())
############################################################################
mySubs={a:1,b:1}
O=O.subs(mySubs)
A=A.subs(mySubs)
B=B.subs(mySubs)
C=C.subs(mySubs)
H=H.subs(mySubs)
############################################################################
# 3D作図
def myXYZ2Txt(A):
    return '(' + str(A.x) + ',' + str(A.y) + ',' + str(A.z) + ')'
def myTxtXYZ(A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)
    P5z=float(A.z)
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.2 mm'
    return
def myTxtXYZ_S(*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ(xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt(xy_tx[2*i-2]) )
    return
def myLine(A,B):
    Ax,Ay,Az=float(A.x),float(A.y),float(A.z)
    Bx,By,Bz=float(B.x),float(B.y),float(B.z)
    pl = FreeCAD.Placement()
    pl.Rotation.Q = (0.4247081540122249, 0.17592004639554645, 0.33985110062924484, 0.8204732460821097)
    pl.Base = FreeCAD.Vector(-3.9166066876399563, -2.1670824762243774, 1.7495260956243028)
    points = [FreeCAD.Vector(Ax,Ay,Az), FreeCAD.Vector(Bx,By,Bz)]
    line = Draft.make_wire(points, placement=pl, closed=False, face=True, support=None)
    Draft.autogroup(line)
    return
def myLine_S(*args):
    for i in range(1,len(args)):
        myLine(args[i-1],args[i])
    return
myTxtXYZ_S(O,"O",A,"A",B,"B",C,"C",H,"H")
myLine_S(A,B,C,A)
myLine(O,H)
doc = App.activeDocument()
App.ActiveDocument.addObject("App::Origin", "Origin")
App.ActiveDocument.getObject('Origin').Visibility = True
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")
```
```
#(1) a*sqrt(a**2 + 2*b**2)/2
#(2) Point3D(2*a*b**2/(a**2 + 2*b**2), 2*a**2*b/(a**2 + 2*b**2), 2*a*b**2/(a**2 + 2*b**2))
#(3) a**2*b/3
```
ワイヤーフレームです。
![png,png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/ea559505-2002-800f-f3dd-b5fb74138d8e.png)
Python for文の基礎についてまとめてみた

## for文とは
for文は、特定の回数だけ処理を繰り返したいときに使用する書き方です。

### 構文
これがfor文の書き方です。
~~~ python
for 変数 in イテラブルオブジェクト:
    処理
~~~
イテラブルオブジェクトって何？？

イテラブルオブジェクト・・・一つずつ取り出すことのできるオブジェクトのことです。リストやタプル、辞書などのことを指します。range()などの組み込み関数もイテラブルオブジェクトになります。

オブジェクト・・・簡単に言えば、データのことです。文字列オブジェクトやリストオブジェクトなど全てのデータをオブジェクトとして扱います。
"あ"・・・文字列オブジェクト
１・・・数値オブジェクト
などなど
## range()を使用したfor文
~~~ python
for i in range(5):
    print(i)
~~~
### 出力結果
~~~ 
0
1
2
3
4
~~~

range関数は、指定された範囲の数値を順番に生成する関数です。
上記のrange(5)は0〜4を生成します。
range(5,10)とすると5~9を生成します。

## リストを使用したfor文
~~~
names = ["山田","田中","鈴木","中村","佐藤"]
for name in names:
    print(name + "さん")
~~~

### 出力結果
~~~ 
山田さん
田中さん
鈴木さん
中村さん
佐藤さん
~~~

リストとfor文を組み合わせれば、簡単に要素一つずつに対して処理を行うことができます。


## 辞書を使ったfor文
~~~ python
three_subject_scores = {"国語": 84.0, "数学": 66.0, "英語": 72.0}
total_score = 0

for subject, score in three_subject_scores.items():
    print(f'{subject}は{score}点です')
    total_score += score

average_score = total_score / 3
print(f'合計点:{total_score}')
print(f'平均点:{average_score}')
~~~
### 出力結果
~~~
国語は84.0点です
数学は66.0点です
英語は72.0点です
合計点:222.0
平均点:74.0
~~~
辞書をイテラブルオブジェクトとして使用する際は、以下の組み込みメソッドを使用します。
keys()・・・辞書のキーを取得
values()・・辞書の値を取得
items()・・・辞書のキーと値どちらも取得

今回はitems()を使用しました。
subjectにキーとなる教科名、scoreに値の点数を入れてそれぞれの点数と、合計点、平均点を求め出力しました。
## 最後に
for文は、どの言語でも基礎構文の一つとなっていますので必須で覚えましょう。
if文などと組み合わせると出来る処理が広がるのでぜひ挑戦してみてください。
ここまで読んでくださりありがとうございました。