OmniAICreator/Qiita-1.07M huggingface dataset:
wordlistを使ってWPAパスワードを解読する


airログとwordlistがあればWPAの解読ができる

airログを自分で取るにはair-pcapのようなbeaconを取得する専用の機材が必要

wordlistはネット上に転がっている

https://github.com/danielmiessler/SecLists

セキュリティテスター用のリポジトリで、`Passwords/Leaked-Databases/`内にtxtファイルでまとまっている

解読にはAircrack-ngを使用する

https://www.aircrack-ng.org/

windowsでもguiで使える

pcapファイルはpicoCTFの問題から取得したもの

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086867/535ffe10-3251-1f51-80fc-6f36a0a5bf2a.png)

Launchを押すと解読が始まる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086867/39a1a2ac-23b4-b2f0-5eda-a85e6a1d99d8.png)

簡単
初めての記事（テスト）

# 記事投稿のテスト

## 箇条書き

- これこれ
- それそれ

1. 春
1. 夏
1. 秋

## 表

|項目|都道府県|代表例|
|---|-------|-----|
|果物|青森県  |りんご|
|果物|神奈川県|梨|

## 数式(Latex)

$$
f(x) = x^2
$$

$$
p(x)=¥frac{1}{2¥sigma^2}
$$

$¥sigma $

Latex はほぼ未対応か？
JSPrimerのTodoアプリにて、個人的に謎な２点。

確実に初心者な疑問なんだろうなと思う・・・・

※　以下のソース部分は、JSPrimerさんより引用しています。
　　https://jsprimer.net/use-case/todoapp/form-event/

# ① `<ul />`が何故、`<ul></ul>`に変換されるの？
[A]部のconsole.logの結果が、`<ul></ul>`となる。
タブ関数`element`
```
element`<ul />`
```
の引数にテンプレートリテラルが存在しないので、`strings`には`<ul />`がそのまま入っていて、`reduce`の内部は実行されていない。
それなのに何故、その結果の`todoListElement`が`<ul></ul>`に変換されいるのだろうか？？？
# ② `console.log`って、なんか順番通り実行されない？
[B-1]、[B-2]、[B-3]の３か所で行っている`console.log`、この結果が全て
```
<ul>
  <li> (inputElement.valueの内容) </li>
</ul>
```
個人的にこの結果は、[B-3]直後のconsole.logだけで想定していたのですが・・
[C]を追加するとエラー`Cannot access 'todoItemElement'`になるので、順番通り、意図したタイミングで`console.log`が実行されているのは間違いないと思うのです。全く分かりません。。

いずれにしても、その都度内容を確認したい場合はどう書いたらいいんだろう？

```src/App.js
import { element, render } from "./view/html-util.js";

export class App {
    mount() {
        const formElement = document.querySelector("#js-form");
        const inputElement = document.querySelector("#js-form-input");
        const containerElement = document.querySelector("#js-todo-list");
        const todoItemCountElement = document.querySelector("#js-todo-count");

        const todoListElement = element`<ul />`;

        // [A]
        console.log(todoListElement);

        let todoItemCount = 0;
        formElement.addEventListener("submit", (event) => {

            event.preventDefault();

        // [B-1]
            console.log(todoListElement);
        // [C]
            console.log(todoItemElement);
            const todoItemElement = element`<li>${inputElement.value}</li>`;

        // [B-2]
            console.log(todoListElement);
            todoListElement.appendChild(todoItemElement);

        // [B-3]
            console.log(todoListElement);

            render(todoListElement, containerElement);

            todoItemCount += 1;
            todoItemCountElement.textContent = `Todoアイテム数: ${todoItemCount}`;

            inputElement.value = "";
        });
    }
}
```
```src/view/html-util.js

...

export function htmlToElement(html) {
    const template = document.createElement("template");
    template.innerHTML = html;
    return template.content.firstElementChild;
}

export function element(strings, ...values) {
    const htmlString = strings.reduce((result, str, i) => {
        const value = values[i - 1];
        if (typeof value === "string") {
            return result + escapeSpecialChars(value) + str;
        } else {
            return result + String(value) + str;
        }
    });
    return htmlToElement(htmlString);
}

...

```
cargo addをしようとした際のエラーの対処

Rustでcargo addコマンドを利用しようとした際にエラーが出たので対応

Rustパッケージ情報
```Cargo.toml
[package]
name = "actix-web-hello"
version = "0.1.0"
edition = "2021"
```

```ターミナル
actix-web-hello % cargo add actix-web
error: no such subcommand: `add`

        Did you mean `d`?
```

cargo-editをインストール
```
actix-web-hello % cargo add actix-web cargo install cargo-edit
```

再度パッケージの追加を行う

```
actix-web-hello % cargo add actix-web
Error: `cargo add` has been merged into cargo 1.62+ as of cargo-edit 0.10, either
- Upgrade cargo, like with `rustup update`
- Downgrade `cargo-edit`, like with `cargo install cargo-edit --version 0.9.1`
```

とのことなので、cargo-editのダウングレードを行う
　
```
actix-web-hello % cargo add actix-web cargo install cargo-edit --version 0.9.1
```

その後パッケージの追加を行う
```
actix-web-hello % cargo add actix-web
Updating 'https://github.com/rust-lang/crates.io-index' index
      Adding actix-web v4.2.1 to dependencies.
             Features:
             + __compress
             + actix-http/compress-brotli
             + actix-http/compress-gzip
             + actix-http/compress-zstd
             + actix-macros
             + actix-web-codegen
             + compress-brotli
             + compress-gzip
             + compress-zstd
             + cookie
             + cookies
             + macros
             - actix-tls
             - experimental-io-uring
             - openssl
             - rustls
             - secure-cookies
```

できた
ValueError: not enough values to unpack (expected 3, got 0)

WindowsでCelery 5.2.7を利用していて発生したエラー。

https://stackoverflow.com/questions/45744992/celery-raises-valueerror-not-enough-values-to-unpack

「Celery 4系以降はWindowsでは公式にはサポートされていないが、現在でも開発などの目的で利用されている」という気になる文言は置いといて……

とりあえず開発目的なので、以下で解消した。

```bash:
celery -A my_project_name worker -P solo -l info
```
イミュータブルインフラストラクチャー とは


## 勉強前イメージ

変更のたびにテンプレを変える的なやつだった気がする

## 調査

### イミュータブルインフラストラクチャー とは

Immutable Infrastructure と書き、英語ではImmutableは変化がないという意味になります。
変化がないというのはイミュータブルインフラストラクチャーでは、一度構築するとパッチ適応をせずに固定化するということを意味します。
いやいやパッチ適応しないのはやばいんじゃない？って思うかもしれないですが
構築後絶対に触らないという意味ではなく、変更の必要が有る際には変更がすでになされているインフラを新しく構築して
全体を切り替えるという意味になります。

例で行くと、
ELBとEC2の構成があるとします。
従来の方法ではEC2にパッチを適応する必要がある際は以下のように本番環境でそれぞれのEC2にパッチが適応されます。
(例えばなのでセキュリティとかは無視してください)

![12022-11-03 # イミュータブルインフラストラクチャー とは - diagrams.net.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/be6d8ee3-5fcb-c5d9-8300-15204d44de2a.png)


イミュータブルインフラストラクチャーでは
新しいパッチ適応済みの環境を用意してそっちに切り替える、ということを行います。
元の環境は触らずに新しい環境を作ります。
事前にテストも行うことも出来ますし、ステージングの環境を作る際も同様にすることで差分がない環境を構築することが出来ます。

![22022-11-03 # イミュータブルインフラストラクチャー とは - diagrams.net.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/77465ef8-8e64-a187-bb43-796987c16766.png)

## 勉強後イメージ

stg環境作るときも差分がないっていいよね...
管理が大変って部分はあるけど

## 参考

- [イミュータブルなインフラ運用](https://cloud-gov.note.jp/n/n5d678ed16af5)
- [イミューダブル・インフラストラクチャー](https://www.itnavi.jp/words/%E3%82%A4%E3%83%9F%E3%83%A5%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%83%BB%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%83%81%E3%83%A3%E3%83%BC/)
ModuleNotFoundError: No module named 'vine.five'

`conda install celery` でインストールされるCeleryが古い（4.4.0）模様。 `conda install -c conda-forge celery` が正解。

どうしても4.4.0を使いたい場合は以下が参考になる。

https://github.com/mrmap-community/mrmap/issues/23

vineを5.0.0から1.3.0にダウングレードすることで回避できるとのこと。

```bash:
pip uninstall vine
pip install vine==1.3.0
```
bundlerをアップグレードする

## 環境
Ubuntu20.4
Ruby2.6
gem 3.0.1

## bundlerのバージョンを確認
ローカルにインストールされてるbundlerのバージョンを確認します。下記３コマンドのどの方法でも確認できます。ちなみに、自分の環境のバージョンは1.17.2です。
```
$bundle -v
$gem info bundler
$gem list | grep bundler
```

>コマンドはbundleだが、gemの名前はbundlerです。

リモートリポジトリに上がっているbundlerの最新バージョンを確認します。下記２コマンドのどの方法でも確認できます。最新のバージョンは2.3.25でした。（2022/11/3 時点）

パイプでheadに渡しているのには理由があります。^bundlerだけでgrepすると、bundlerで始まるgemがわりと多く存在するため、たくさんのgemが一覧表示されます。headをつけることで、デフォルトで上位10件に表示を絞り込むことができます。
```
$gem info -r bundler
$gem list -r | grep ^bundelr | head
```

このようにすると表示を1件だけに絞り込むことができます。
```
$gem list -r | grep ^bundelr | head -n 1
```

現在公開されている最新バージョンを確認する方法は、CLIでコマンドで確認する方法以外にも、bundlerの公式サイトからも確認できます。
gem info -r bundlerで表示される内容の中に、公式サイトのURLも表示されます。（Homepage: [https://bundler.io](https://bundler.io)）

## アップデート前の注意点
安易に最新版にアップデートすると、トラブルの元になる場合があります。公式サイトのDocsに注意事項が記載されているため、確認することをお勧めします。公式サイトを確認すると、bundler2をインストールするには、Ruby2.3.0以上で、RubyGems2.5.0以上であることが条件だと書かれています。

https://bundler.io/guides/bundler_2_upgrade.html

現在のRubyとRubyGemsのバージョンを確認します。
```
$ruby -v && gem -v
```

RubyGemsのアップグレードを行う場合は、このコマンドで行います。
```
$gem update --system
```

bundlerをアップグレードするときのコマンドです。このコマンドを実行すると、現時点で一番最新のバージョンがインストールされます。bundlerはgemとして提供されているため、gemコマンドでインストールします。aptコマンドでのインストールではありません。
```
$gem install bundler
```
複数ファイルの一括読み込みとデータフレームの作成

■ライブラリのインポート
```python
import pandas as pd
import glob
```

■一括で読み込み
```python
file_paths = glob.glob("天気\*.csv")
df = pd.DataFrame()
for file in file_paths:
    tmp = pd.read_csv(file, encoding='cp932')
    df = pd.concat([df,tmp]) 
```

以上がファイル読込とDFの作成（連結）方法。

おまけ
読込ファイル名などをカラムとして指定したい場合
※今回だと都市名ファイルをスライスして抽出
```python
file_paths = glob.glob(r"天気\*.csv")
df = pd.DataFrame()
for file in file_paths:
    tmp = pd.read_csv(file, encoding='cp932')
    tmp["都市"] = file[-7:-3] #ファイル名の一部をカラム追加したい場合はココで指定
    df = pd.concat([df,tmp]) #縦に結合
```
都市の文字数によって一部うまくいっていない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951548/b019567e-400d-ff3c-bc01-ddd10f342dec.png)


■データクレンジング
```python
#末尾のカンマ消し
df["都市"] = df["都市"].apply(lambda x: x.replace(".","") if str(x).endswith(".") else x)
#津市など一文字都市対応
df["都市"] = df["都市"].apply(lambda x: x.replace("気","") if str(x).startswith("気") else x)
#\\削除
df["都市"] = df["都市"].apply(lambda x: x.replace("\\","") if str(x).__contains__("\\") else x)
```

クレンジング後の都市名
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951548/b55f9558-f308-a120-dbcd-31629b6c1cea.png)
多言語FizzBuzzチャレンジ4日目:Zig

## これまでのまとめ
https://qiita.com/tenteko/private/fc52f7aec63ba5f67854

https://qiita.com/tenteko/private/ca9813f0982370d0c901

https://qiita.com/tenteko/private/bc808ba59f6993019045

## 本日のお品書き
知名度もあがってきている新星Zig…！

## FizzBuzz
Qiitaのコードスペース、Zig対応してくれてますね！

```zig
const std = @import("std");

pub fn main() !void {
    var i: u8 = 1;
    // while pattern
    while (i <= 100) : (i += 1) {
        if (i % 15 == 0) {
            std.debug.print("{s}\n", .{"FizzBuzz"});
        } else if (i % 3 == 0) {
            std.debug.print("{s}\n", .{"Fizz"});
        } else if (i % 5 == 0) {
            std.debug.print("{s}\n", .{"Buzz"});
        } else {
            std.debug.print("{}\n", .{i});
        }
    }

    // forでも書けそうだが、forはarrayに対するiterateを想定していそう
    // https://ziglearn.org/chapter-1#for
}
```

- 冒頭で次のように宣言すれば、もう少しシュッとprintを呼び出せる。

```zig
const print = std.debug.print;
const std = @import("std");
```

- `for`と`while`で結構構文が違うんですね？


## 【参考】コードの作成～コンパイルまで
```shell
zig init-exe #実行ファイル用のボイラーテンプレート作成
#edit src/main.zig
zib build run
```
Bundle installでmysql2がインストールできない

### Bundle installでmysql2がインストールできない

```
$ bundle install

(省略)

An error occurred while installing mysql2(0.5.3), and Bundle cannot continue.
Make sure that `gem intall mysql2 -v '0.5.3' --source 'https://rubygems.org/'`

In Gemfile:
mysql2
```

ログに吐かれたエラー文を確認

```
directory not found for option '-L/usr/local/opt/openssl/lib'
```

lsでディレクトリの確認
```
$ ls /usr/local/opt/openssl/lib
```
ディレクトリが存在しないことがわかった。

brew install openssl で　opensslのパスを確認

```
==> openssl@3:stable 3.0.7(bottled)[keg-only]
Cryptography and SSL/TLS Toolkit
https://openssl.org/
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/openssl@3.rb
License: Apache-2.0
==> Dependencies
Required: ca-certifiates
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add addtional certificates, place .pem file in
/usr/local/etc/openssl@3/certs

and run
/usr/local/opt/openssl@3/bin/c_rehash
because macOS provides LibreSSL.

==> Analytics
install: 177,863 (30 days), 445,966 (90 days), 1,640,846 (365 days)
install-on-request: 94,320 (30 days), 286,031 (90 days), 1,225,062 (365 days)
build-error: 970 (30 days)
```

openSSLの3.0.7が存在しているのは認知しているが、インストールされていないとのこと

バージョン確認
```
$ openssl version
LibreSSL 2.8.3
$ brew update
$ brew reinstall openssl
$ brew link --force openssl
$ echo 'export PATH=$(brew --prefix openssl)/bin:$PATH' >> ~/.zshrc
$ source ~/.zshrc
```

openSSLのパスを通した状態でbrew info opensslを実行、パスが通っているのを確認

brew info opensslに記載されている、以下部分でパスを通す

```
For compilers to find openssl@3 you may need to set:
  export LDFLAGS="-L/usr/local/opt/openssl@3/lib"
  export CPPFLAGS="-l/usr/local/opt/openssl@3/include"
```

```
bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@3/lib"
```

その後、bundle installでmysql2がインストールできたことを確認
GraphQLを極小理解したのでまとめる

# 背景
「GraphQLとか使えば実現できそうですよね〜」
「そ、そ、そ、そうっすよね〜;;;」

な状態を脱却することだけを目標において、要点だけをざっと見したので
理解したことを記録に残したかった

# この記事を読むべき人
「そ、そ、そ、そうっすよね〜;;;」ってなったことがある人。

# この記事を読まないべき人
GraphQLをすでに使ったことがある人

# 本題、GraphQLについて

## 簡単にいうとなんなの？
RESTだと至らないAPI仕様を補うための規格。
APIを呼び出す時にエンドポイント任せだった返却値とかを、クライアント側でクエリを組み立てて取得したいデータを選んだりできる。

APIのインタフェースを **RDBのSQLの概念に近づけた感じ** の世界

```
query {
  person(personID:5){
    name
    birthday
    address
    created
  }
}
```
こんな感じで取得するデータを選んだりできる

## REST最高じゃん、何が悪いの？
・レスポンスの中に余計なデータが含まれてたりする
・逆に1回のリクエストだとデータが取得しきれず、もう一回リクエストしたり

そんなん別にいーじゃんって？
ネットワークの通信容量とかその辺に厳しく生きてる高尚なエンジニアが世の中にはいらっしゃるのだ。

ちなみに企業レベルで公開APIをGraphQLにしてるとこもある。

## 一応GraphQLクライアントなるものもある
React対応のApolloとかRelayとか

## どの辺がグラフなの？
「グラフ理論」ってのを調べてから出直してくるのがよし。
別に調べなくてもよし。

## サーバー側の処理はどうすんの？
ライブラリを使いながら、クエリで要求されたデータを取得、返却できるように作り込んでいく

https://graphql.org/code/

# まとめ

今回ざっとみしたのはこの本。
![51gkl1qtM2L._SX379_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2373655/68fdbecc-e819-55df-d92a-7493931e8e17.jpeg)
https://www.amazon.co.jp/Learning-GraphQL-Declarative-Fetching-Modern/dp/1492030716

ざっくりいうと、今まで提供されているエンドポイント任せで
クライアント側はそれを呼び出す以外なかった世界をちょっと変えたもの、それがGraphQLっていう印象。

フロントエンドのようなAPIクライアントが
DBにクエリを投げるような気持ちでAPIを使えるように定めていった仕様だったり、そのための道具たちをGraphQLと読んでいる？みたいな感じ。

RDBの世界にはデータのテーブル定義が必要で、それと同じようにGraphQLではスキーマ定義をする。
RDBの世界にはSQLというCRUD操作を可能にする命令が必要で、それと同じようにGraphQLではミューテーションを使う。


**APIのエンドポイントをSQLのように** これが既存の知識を持って理解しにいった時に最もキャッチーな言い回しな気がしました。

このイメージを持った上で新たに書籍を読んで、この記事に書いてあるしょーもない薄っぺらい知識をアップデートしていただければ幸い。
Whoisガード とは

## 勉強前イメージ

なんだっけ？whoisを見れないようにする的な？

## 調査

### そもそもWhoisとは？

ドメインやIPアドレスの登録に関する情報を検索するサービスで
登録ドメイン名や登録年数、有効期限などを見ることができます。
WHOIS情報は一定情報を提供することが義務付けされており、変更が発生すると更新する必要があります。

詳細は [こちら](https://qiita.com/miyuki_samitani/items/b339bd1b61511a669598) からご確認頂けますと幸いです。

### Whoisガード とは

EU一般データ保護規則にともなってwhoisで公開される情報が少なくなります。
契約者名や都道府県以下の住所、電話番号やメールアドレスが見れなくなります。
whoisガードとはレジストリのサービスになります。
また、ドメインの種別によっても対応がことなるのでガードするドメインで対応しているかは確認が必要です。

## 勉強後イメージ

汎用JPとかgTLDはまた対応違うみたいだね？違うのかな？

## 参考

- [Whoisガードサービス](https://www.gonbei.jp/service/whoisguard.html)
- [よくあるご質問](https://www.do-reg.jp/faq/?question=42&group=9)
配置したUnityちゃんが床をすり抜ける

## 使用バージョン

バージョンは以下を使用しています。
| Unity, Package | Ver| 
|:-----------:|:------------:|
| Unity      | 2021.3.12f1        | 
| Unity-Chan! Model     | 1.2.2    | 
| Standard Assets (for Unity 2018.4)       | 1.1.6        | 

## Unityちゃんが床に立ってくれず、すり抜けて落下してしまう!

床を作り、Unityちゃんの設定も行い、実行！
しかし、床を颯爽とすり抜けて、どこまでも落下していくUnityちゃん。

検索するとColliderやRigidbodyの設定が必要とのこと。
でもCapsule Colliderとか設定されているけれど…
床もPlane、大丈夫のような？何が問題？と検索を続ける。

## 対処方法
Layer同士の衝突判定というのがあり、それがチェックされていないとダメの様子。
[Edit] -> [Project Settings] -> [Physics] -> [Layer Collision Matrix]を確認する。
DefaultとDefaultはチェックが…ない！

![画像(Layer Collision Max)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953844/3058db0a-cc02-8fe4-6629-073159d127b7.png)

LayerというのはInspectorの右上の方にあります。
UnityちゃんをPlayerに、床をTerrainにして無事着地するようになりました。
![221103_002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953844/4588ce4a-e1a4-5225-4489-ec1310dab4a8.png)

## 参照サイト
[[Unity][character]配置したキャラクターが床をすり抜ける現象](http://technicalmemo.seesaa.net/article/420179789.html)
lambda基礎

# lambda関数の構造と設計
## eventの情報
イベントから渡される任意のJSONデータである。ただ、lambda関数の引数に渡されるときパース済みであり、JSONではなく、pythonのオブジェクトに変換されている。
例）{x:10,y:20} → event["x"]=10,event["y"]=20として取得できる。
## contextの情報
実行環境の情報が含まれる。例えば、メモリ容量やlambdaが配置されているパスなど。。。
```python
def myfunc_handler(event,context):
    # 処理
    return 戻り値
```

## ランタイム設定
ハンドラは呼び出すべき「ファイル名.関数名」を指定する設定値である。この設定が実際のものと合致していないと呼び出しが失敗する。


## CloudWatch Logs
lambdaを実行すると、CloudWatch Logsにも記録される。print()で出力してデバッグ確認することもできる。


# lambdaの実行環境とイベント
- lambda関数はlinuxベースの隔離された実行環境で実行され、実行後に破棄されるステートレスな環境である。
- lambda関数の呼び出しはプッシュモデルとストリームベースの２種類に大別される。
  - プシュモデル・・・イベントが発生したときに呼び出される方式。
  - ストリームベース・・・流れるデータをlambda関数が監視して処理する方式。
- 非同期呼び出しで実行されるlambda関数は、２回以上実行される可能性がある。それを考慮し、何度呼び出されても同じ動作をするように実装する必要がある。
- lambdaを呼び出すきっかけとして動作するのがイベントソースであり、S3やSESなど、さまざまなAWSリソースをイベントソースとして指定できる。

## メモリとタイムアウト
lambda関数はAWSによて提供されたランタイム環境で動作するので、開発者があらかじめ準備する必要はない。ただ、開発者が決める必要があるものが３つある。
- メモリ
- タイムアウト
- IAMロール

※これらの値は「設定」タブの「一般設定」で確認できる。変更する場合は、編集ボタンを押下する。

## lambdaランタイムの環境
- AWS lambda contextオブジェクト　

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-context.html

- ランタイム環境変数

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime

## lambdaランタイム環境の再利用
- lambdaはイベントのたびにlambdaランタイム環境を用意するのではなく、一度作成した実行環境をしばらく破棄せずにとっておき、次に実行された時に再利用することで２回目以降の実行を高速化している。
- プログラミングの注意点
  - 前に実行したデータが残っている。
  例えば/tmpにテキストファイルを前の実行で書き込んでいた場合、２回目の実行で既に存在しているとエラーになる可能性がある。
  - イベントハンドラ以外に都度実行するコードがある。
  イベントハンドラの外のグローバルな場所に書いてあるコードは、プログラムがロードされた初回しか実行されない。

## 同時実行とプロビジョニング
- イベントの数だけ同時実行される。
lambda関数は同時実行されても問題ないように並列処理に注意してプログラミングする必要がある。
- 同時実行数
１リージョンあたり１０００の同時実行制約がある。
- 同時実行数の予約
lambda関数ごとに同時実行数の予約ができる。例えばlambda関数Aを100個予約しておけば、その他関数は９００個実行可能となる。
- プロビジョニング
あらかじ未指定した個数のlambdaランタイム環境を用意しておく機能のこと。即時呼び出しが可能となる。ただし、lambda関数を実行していない間も課金される。

## イベントモデル
- プッシュモデルには同期呼び出しと非同期呼び出しがある。
- 非同期呼び出しではイベントを一旦キューにため、それからlambdaが呼び出される。キューからは複数取り出され、lambdaは並列に実行される。
- lambdaの呼び出しに失敗したときは２回再試行される。再試行回数は変更可能。
- 全ての試行に失敗した場合は、そのイベントは消失する。しかし、通知を受けたい場合はDLQ(dead letter queue)という仕組みを使う。DLQを構成しておけばそのイベントをSQSのキューやSNSトピックとして通知できたりする。
- lambdaは例外も失敗と見なすため、失敗することが明らかなパターンは例外を発生させるのでなく、エラーを起こすようにすべき。例外だと２度、３度試行される恐れがある。
- キューから呼び出されるイベントの実行順序は保証されない。
- lambdaは正常終了した場合も、タイミングによっては２回以上呼び出される可能性がある。そのため、何度実行しても同じ結果となるように実装する必要がある。

## イベント引数
lambdaのイベント引数はイベントソースに依存する任意のデータであるため、データ構造は各イベントソースのリファレンスを参照する必要がある。イベントの引数はeventをjsonでdumpsし、中身を見ることができる。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-services.html

## 定期実行されるlambda関数の作成
- cloudWatchイベントから呼び出されることを想定した関数は設計図から作成できる。
- 設計書lambda-canaryを選択する。
- スケジュール式（cron式、rate式）


## バージョニングとエイリアス
- lambdaにはバージョン管理したりエイリアスをつけたりする機能がある。
- 関数を登録すると関数ARN(Amazon Resource Name)と呼ばれる唯一無二の名前が定められる。イベントに対して呼び出す関数を結びつける場合、このARNを使うのが基本になる。
- 開発版、ステージング版、本番環境版にするという時には新しいバージョン発行という操作を行う。そうするとバージョンごとのARNが確認できるようになる。
- 関数ARNを直接指定するのではなく、エイリアス名を作ってそのエイリアスと結びつけていれば開発環境と本番環境を簡単に結びつけることができる。
ECCV2022の量子化論文 (2)

# 概要

この記事では、[ECCV2022](https://eccv2022.ecva.net/)の量子化論文を紹介します。[^1]
[その1](https://qiita.com/kyad/items/969db123c549ca308f39)

[^1]: 画像や数式は論文から引用しています。


# Symmetry Regularization and Saturating Nonlinearity for Robust Quantization

https://arxiv.org/abs/2208.00338

- 概要：量子化後のロバスト性を上げる方法2つ(SymReg, SatNL)の提案
- 新規性：量子化後のロバスト性を上げる方法でSOTA
- キモ：
  1. 重みの分布が対称な方が量子化誤差の伝播が小さいと考え、Symmetry Regularizationロスを追加した。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/d0627c1e-2538-8618-bb18-d9fdded55e01.png)
  2. 量子化のClamping functionの代わりにこのような緩和した関数とすることでロスを下げる。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/71c3b168-95bc-29c0-4dc9-e5861cc26b45.png)
- 評価：MobileNetV2等で実験した。3bit以下で効果あり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/8a311eab-75ff-7485-5fc2-3b542b60e867.png)


# おまけ：上の論文からの引用論文

## Robust Quantization: One Model to Rule Them All

https://arxiv.org/abs/2002.07686

- 概要：KURE. ビット幅・量子化幅等のパラメータにロバストな量子化。[^2]
  [^2]: Float学習は量子化幅が非常に小さいケースと思うと、Floatからintに量子化する場合でも適用できる。
- 学会：NeurIPS2020
- 研究機関：Intel
- 新規性：量子化では重みの分布は正規分布より一様分布が良いことを初めて理論的に証明した。
- キモ：重みの尖度(Kurt)が一様に近いことを制約に入れたロスを入れる。$\mathcal{K}_T$は一様分布の1.8とする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/4141a11b-5c6e-520b-27d3-59d4ef5f0e96.png)
- 評価：
  - MobileNet, RestNet, ImageNetで量子化精度劣化を調べた。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/ab679036-a5ad-8938-c100-036ba2d5f9b2.png)
  - 量子化を学習時と量子化後の推論時で変えた時の精度劣化を調べた。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/ac63f5f8-d23d-50b7-fed1-d6c7010bc84e.png)

## ASAM: Adaptive Sharpness-Aware Minimization for Scale-Invariant Learning of Deep Neural Networks

https://arxiv.org/abs/2102.11600

- 概要：ASAM. (SAM)[https://arxiv.org/abs/2010.01412](ロスの勾配面のsharpnessを考慮し汎化性能が高いオプティマイザ)の改良
- 学会：ICML2022
- 研究機関：Samsung
- 新規性：SAMの、パラメータのスケーリングに弱い課題を解決する。
- キモ：最適化ステップに正規化を入れる。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/59ea733a-0dee-8a0e-2921-2b4b3c6feec9.png)
- 評価：画像や自然言語処理タスクでSAMと比較した。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/81eb41c2-44e6-06e3-1e2b-7f7ef2eeb28d.png)
🔰JS初心者が作るGoogle extension V3 ⑧ -start/stop/reset押した時の挙動-

前回の続き　→ [🔰JS初心者が作るGoogle extension V3 ⑦ -初インストール時の処理/５分間の再接続処理--](https://qiita.com/mmaumtjgj/items/d8083ac9576ea9dbe123)

完成した作品は　→　[こちら🐕](https://chrome.google.com/webstore/detail/%E3%83%9D%E3%83%A1%E3%83%89%E3%83%BC%E3%83%AD/nfmmdehbjbenlngbihdhheccephmdfco)

## start/stop/reset押した時の挙動
```background.js
let stopId

//start・stop・resetボタン押された時の処理
chrome.runtime.onMessage.addListener(async function(request, sender, sendResponse){
    await keepAlive();

    //switchがonの時 かつ stopIdがnullの時
    if(request.switch == "on" && stopId == null){
        stopId = setInterval(pomodoro_timer, 1000);
    }

    //switchがstopかresetの時
    if(request.switch == "stop" || request.switch == "reset"){
        clearInterval(stopId);
        stopId = null;
    }

    return true
})
```

``stopId``は[setInterval()](https://developer.mozilla.org/ja/docs/Web/API/setInterval)を入れるためのID。
使い方は``setInterval(実行したい関数,ミリ秒)``。
ミリ秒なので1秒ごとに行いたい場合は1000を記入する。

``request.switch``はpopupの``sendMessasge``から受け取ったものである。

タイマーをスタートさせたい時の条件は
``request.switch``が``start``の時 かつ ``stopId``が``null``の時にポモドーロタイマーが発動させるようにする。

タイマーをストップ・リセットさせたい時の条件は
``request.switch`` が ``stop`` もしくは ``reset``の時。
タイマーカウントのリセット自体はpopupのreset()で機能しているのでここでは共通の処理にしている。

現状background.jsはこうなっている。
```background.js
let lifeline
let stopId

//初インストール時のフォームの初期値設定
chrome.runtime.onInstalled.addListener(() => {省略})

//start・stop・resetボタン押された時の処理
chrome.runtime.onMessage.addListener(async function(request, sender, sendResponse){省略})

//5分間の再接続処理
chrome.runtime.onConnect.addListener(port => {省略});

function keepAliveForced() {省略}

async function keepAlive() {省略}
```
## 拡張機能の記事リンク
[🔰JS初心者が作るGoogle extension V3 ①](https://qiita.com/mmaumtjgj/items/6538fd8814d93e9d7fa6)
[🔰JS初心者が作るGoogle extension V3 ② -popup.htmlの作成-](https://qiita.com/mmaumtjgj/items/ef7bf1116988bfeedd84)
[🔰JS初心者が作るGoogle extension V3 ③ -タブの切り替えの処理-](https://qiita.com/mmaumtjgj/items/0a9e73058727b101579b)
[🔰JS初心者が作るGoogle extension V3 ④ -タイマーを表示させる-](https://qiita.com/mmaumtjgj/items/6e1a978656580dab59d7)
[🔰JS初心者が作るGoogle extension V3 ⑤ -スタート/ストップ/リセットの各ボタン機能-](https://qiita.com/mmaumtjgj/items/d15df85bcb9dcf31d87d)
[🔰JS初心者が作るGoogle extension V3 ⑥ -タイマー作動中の有無で表示する画面の処理-](https://qiita.com/mmaumtjgj/items/d8083ac9576ea9dbe123)
[🔰JS初心者が作るGoogle extension V3 ⑦ -初インストール時の処理/５分間の再接続処理-](https://qiita.com/mmaumtjgj/items/abd7f4f3f63624dec6f9)
[🔰JS初心者が作るGoogle extension V3 ⑧ -start/stop/reset押した時の挙動-](https://qiita.com/mmaumtjgj/items/6b638388e7c39b2863f4)
[🔰JS初心者が作るGoogle extension V3 ⑨ -ポモドーロタイマーの処理-](https://qiita.com/mmaumtjgj/items/2c2e117d31db69adb825)
[🔰JS初心者が作るGoogle extension V3 ⑩ -popupのポモドーロタイマーの処理-](https://qiita.com/mmaumtjgj/items/5e80fa8fca2fa51b7445)
[🔰JS初心者が作るGoogle extension V3 ⑪ -content.jsの処理-](https://qiita.com/mmaumtjgj/items/cae1ae8e2869e8414567)
セキュリティグループのアウトバウンドについて

# はじめに

AWSの勉強中に「セキュリティグループはステートフル」という説明があったが、
このステートフルとは何なのだろうか。

ステートフルの意味は「保持する」という意味で、
セキュリティグループでは行きの通信を設定すると、戻りの通信も自動的に許可される。

ここではEC2を例に挙げるが、EC2への通信（インバウンド）を設定すれば、
EC2からの通信（アウトバウンド）を設定しなくてもいいのではないかと考えていたが、
ここは大きな間違い。

EC2から通信をしに行く場合はアウトバウンドの設定が必要になる。

# 試してみる
### 概要図
サブネット内に2台のEC2を用意しAサーバからBサーバへ通信を行う。
![qiita用1_縮小.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953845/9696921d-582f-ae45-b076-a399212ff11c.png)


### アウトバウンドに何も設定しない場合
今回はpingで試すがping送信元Aサーバのアウトバウンドは何も設定していない状態で、
ping送信先Bサーバのインバウンドにはping送信元セキュリティグループからの通信を、
すべて許可する設定を行っている。

#### ping送信元(Aサーバ)
![アウトバウンド1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953845/d68cf83e-74a4-84e4-078f-0263f54eb652.png)

#### ping送信先(Bサーバ)
![インバウンド1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953845/9553adac-f9c2-bf61-34af-0868b3e96f8a.png)



その状態でAサーバからBサーバへpingを実行すると以下のように通信が通らない状態となる。

```
[ec2-user@ip-10-100-192-35 ~]$ ping 10.100.192.14
PING 10.100.192.14 (10.100.192.14) 56(84) bytes of data.
^C
--- 10.100.192.14 ping statistics ---
16 packets transmitted, 0 received, 100% packet loss, time 15342ms

[ec2-user@ip-10-100-192-35 ~]$
````


### アウトバウンドにICMPの許可設定を行った場合
今度はAサーバのアウトバウンドにBサーバのセキュリティグループへ、
ICMPの通信を許可する設定を行う。
![アウトバウンド2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953845/1a5caea3-0826-ec71-995a-3a23c6bdbe23.png)



その状態でAサーバからBサーバへpingを実行すると以下のように、
先ほどと違い通信が通ることを確認できた。
```
[ec2-user@ip-10-100-192-35 ~]$ ping 10.100.192.14
PING 10.100.192.14 (10.100.192.14) 56(84) bytes of data.
64 bytes from 10.100.192.14: icmp_seq=1 ttl=255 time=0.855 ms
64 bytes from 10.100.192.14: icmp_seq=2 ttl=255 time=0.537 ms
64 bytes from 10.100.192.14: icmp_seq=3 ttl=255 time=0.417 ms
64 bytes from 10.100.192.14: icmp_seq=4 ttl=255 time=0.416 ms
64 bytes from 10.100.192.14: icmp_seq=5 ttl=255 time=0.481 ms
64 bytes from 10.100.192.14: icmp_seq=6 ttl=255 time=0.427 ms
^C
--- 10.100.192.14 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5099ms
rtt min/avg/max/mdev = 0.416/0.522/0.855/0.155 ms
[ec2-user@ip-10-100-192-35 ~]$
```

# まとめ
セキュリティグループはステートフルな「ファイアウォール」ということで、
Windowsで考えるならばアウトバウンドは送信の規則を設定しているということになるのだろうか。

デフォルトでは0.0.0.0/0が設定されていたが、業務ですべてを許可するのは中々考えづらいため、
インバウンドだけでなくアウトバウンドの設計も考える必要があるということに気づけた。
Ubuntu22.04にDockerをインストールしたらCouldn't connect to Docker daemonでエラーになる

# はじめに

CypressをWSL2で実行するために苦戦していると、最新版のWSL2なら意識しないでもGUIが使えるとの情報を得てDockerをUbuntu22.04に乗り換えることにしました

普段だと[こちら](https://qiita.com/Sicut_study/items/cb198375011581f3ef2c)でWSL2にコンテナ環境を構築しているのですが、Ubuntu22.04ではこの記事通りにうまくいかない箇所があったので解決方法を載せます

# 問題

記事通りに環境を構築していたのですが、以下のコマンドでエラーが発生しました

```
$ sudo service docker start
#  * Starting Docker: dockerとでればOK
$ sudo docker ps
# ここでCouldn't connect to Docker daemonというエラーが発生
```

なぜかデーモンが起動していませんでした

# 解決方法

これはDockerのサービススタートに失敗しているのが原因です

```
$ sudo service docker status
 * Docker is not running
```

not runnningとなっているので、起動ができれば解決しそうです

なぜ失敗するのかというとDockerが`iptable`に対応できていないようです
Legacy版のiptableに対応させることでうまくいきました

```
$ sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
$ sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
```

```
$ sudo service docker start
 * Starting Docker: docker 
```

起動にうまくいったらあとは記事通りに最後まで行けました

# おわりに

結果的にCypressはいまだにうまくいっておりません。。。
果たしてできるのでしょうか

# 参考

https://zenn.dev/tkzwhr/articles/trouble-shooting-wsl2-docker
Godotエンジンを使って迷路ゲームを作ろう Part1！

# Godotエンジンを使って迷路ゲームを作ろう Part1！
![photo01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/b3c4feea-5758-1f06-ea32-c6b64ba2c98e.png)

この記事ではGodotという最近人気になってきているゲームエンジンを使って迷路ゲームを作っていきます。

:::note alert 
まずこのチュートリアルはGodot3.0のチュートリアルです。
記事の情報が更新されていません。
次に、作者はGodotを学び中なので、非効率なプログラム、また間違っている箇所があるかもしれません。
そのような点を発見した場合は教えてくれるとありがたいです。
:::

**クオリティ劣化版のブラウザ版は下のリンクから遊べます。**

https://snowdingo.itch.io/3d-maze


## エンジンの日本語化:hammer_pick:
まず最初にエンジンをダウンロードして日本語化していきます。
Godotは[ここ](https://godotengine.org/download)からダウンロードができますが、今回はGodot4という３Dなどが大幅に強化されているベータ版を使います。ベータ版といっても全然開発の最終段階なので大丈夫です。
Godot４は[**こちら**](https://downloads.tuxfamily.org/godotengine/4.0/beta3/)からダウンロードできます。
![image002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/41de20ff-ebfc-96f0-cc72-895a15f9c3f3.png)
使っているOSに合わせたものをクリックしてダウンロードしたら、ZIPを解答すれば使えます。
次に言語を日本語化していきます。
![photo003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/a5c8ccf3-4bb6-c947-dfab-58cc60b404a3.png)
右上のEnと書かれているところをクリックすると言語の選択画面が出てくるのでスクロールしてJa（日本語）を選びます。
するとこんな画面が出てくると思うのでRestert　Nowを選択します。
![photo004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/04bf7808-ab1f-9624-3ff4-738164e97668.png)
これでGodotがもう一回再起動して日本語化が完了しました。
## プロジェクトの作成
日本語化が完了したら次にプロジェクトを作成していきます。
![Photo005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/1f427e0b-fe1f-5e87-6262-36409987521c.png)
日本語化が完了したらこんな感じの画面になると思います。
そしたら右上にある"新規プロジェクト"のボタンを押して作成していきます。
![photo006.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/b8a21594-3b3b-c28c-4a13-eb0c3dc9581e.png)
そしたらこんな感じの設定画面になると思います。
まずプレジェクト名の所を自分の好きな名前に変えてください。
変えたらプレジェクトパスからフォルダーを選択します。
**よーし！！プレジェクト作成だ！！**　と思いきや実はもう二つ重要なステップがあります。
このフォルダーを作成ボタンを押さないとプロジェクトは作成できません！！
とりあえずこのボタンを押せば黄色のビックリマークが緑色のチェックマークに変わると思います。
ここまでいけば後はプロジェクトを作成するだけです。作成して編集を押してプロジェクトを作成できます！！:relaxed:
![photo008.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/284f47d8-fc6c-92ee-ae9d-a7d2723a290a.png)
プロジェクトを作成したらこんな画面になっているのを確認したらPart1は終了です！
![photo009.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850578/137d7c44-0034-e82c-1874-6a08d4f04968.png)
## 終わりに
今回はGodotと言ってもかなり基本なことを説明しました。
ただ今回やったプロセスはバージョン移行や、プロジェクトを作成するときに重要なことなので覚えていただけたら幸いです。
**Part1は以上です。お疲れ様でした～:relieved:**
GameJamに参加　NeosVRの空間上での作業について

こんにちは、rickyです。
ハロウィンに行われたCluster Game Jamに参加したのでそのことについてまとめた記事になります。

単に参加したのではなくNeosVRを利用して作業を共有しながら作成したのでそのことの利点について書いていきます。

### ・利点１ 一緒に作ってる感覚が普段より大きい
文字ベースで作る際よりFriendのアバターがあるということの影響は大きいです。
私はデスクトップモードで作成していたのですが、同じようにデスクトップモードで作業している方もいれば、HMDを被って遊びに来ている方もいました。
アバターが動いているのを画面から見るだけで一緒にやっている関学が強く作業により集中できました。

### ・利点２ 実演ができる
今回私の担当箇所はパーティクルの部分でした。どんなパーティクルが良いかの説明というのは口頭ではなかなか困難なものです。
しかしNeosにはパーティクルシステムが搭載されているので実際に目の前でパーティクルを作成してイメージの共有をしてもらえました。
これにより無駄な手戻りが発生することなくスムーズに作業を進めることが出来ました。

### ・利点３ ローカルの作業を簡単に共有できる
Neosには自分の画面を共有できるアイテムがあります。
このアイテムのおかげでUnityでの作業をリアルタイムで確認し合えるという環境が展開されていました。
細かな数値や動きを検証し合ったり、同じパーティクルを別の方がテストするのも容易でした。
Discordやzoomのように2次元的な画面でなくあくまでVR空間で展開されているメリットは大きく、見えにくいところを近づいて確認したり逆に普段の時は離れて全体を俯瞰するなどが容易でした。

NeosVRを用いてGameJamに参加するという行為ははじめての経験でしたが非常に実入りが大きかったです。
今回の体験でパーティクルの面白さを感じることも出来ましたし、皆で作った達成感も大きかったです。
ぜひ皆さんもNeosに来て皆で作業をしてみてください。
きっとその良さが分かってもらえるはずです！
こちらがNeosの皆で作り上げた作品になります。
ぜひ遊びに来てください！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/acace494-5749-8ccd-c80b-86254d157d39.png)

https://cluster.mu/w/ed8483c6-f839-4c0e-a6e6-471dd764deba
バージョン指定の `~>` の別名 twiddle-wakka の由来

# `~>` の別名
Gemfile や gemspec でバージョン指定に使う `~>` には複数の別名がある。

https://qiita.com/tbpgr/items/e892fd9536d187f7c220

> - pessimistic comparison operator
> - twiddle-wakka
> - approximate
> - spermy
>
> ググってみると `pessimistic (comparison) operator` と呼んでいる人が多い。  
RubyGemsのドキュメントでは `twiddle-wakka` になっている。  
RubyGemsのソースコードでは `approximate` になっている。  
`approximate` に変更する前は `spermy` になっていた。名前が微妙なので変えたようだ。  
まぁ、たしかに見た目は・・・いや、しかし・・・。

pessimistic, approximate は意味を考えれば納得だし、 spermy はひどい名前ではあるが、見た目がたしかに似ているからわかる。
しかし、 twiddle-wakka って何...?

あと、日本語での別名があるのか、というのがちょっと気になったが、見つからなかった。
(知っている人教えてください)

# twiddle-wakka とは?
この単語の由来について調査している記事があった。

https://alerner1st.medium.com/the-strange-case-of-the-twiddle-wakka-5a70a0f5a509

詳細は上記の記事を読んでいただきたいが、かいつまんで言うと、こういうことらしい。
- twiddle: tilde (`~`) のこと。
- wakka: angle bracket (`<`, `>`) のこと。

つまり、それぞれの文字の名前を読み上げているだけらしい。
日本語で言うと 「波ダッシュ-大なり」 みたいなことだろうか。

記事では wakka という単語の初出についてかなり詳細に調べており、読むだけでも面白いので興味のある人は読んでいただきたい。
(調査では歴史を1980年代まで遡っており、 Jargon File や Usenet についても調べられている!)
zsh環境でfindコマンドのforループが思ったように回らない事件

zsh環境でシェルスクリプトでforループを書くとき、ある点に注意しないと予期しない動作になります。結構ハマる箇所だと思ったので注意点をメモしておきます。

※なお、bash環境では修正前のやり方でも問題なく動くようです（ご指摘ありがとうございます！）。

`find`コマンドを使うと、特定の名前のディレクトリやファイルをリストアップすることができます。

```sh:jpgファイルをリストアップするコマンド
find . -name "*.jpg" -type f
````
とすれば、カレントディレクトリ内の`.jpg`拡張子を持つファイルのリストを取得することができます。例えば今、このコマンドの出力が以下のようであったとします。

```:上記コマンドを実行した結果
./image-5.jpg
./image-2.jpg
./image-0.jpg
./image-4.jpg
./image-6.jpg
./image-9.jpg
./image-8.jpg
./image-1.jpg
./image-3.jpg
./image-10.jpg
./image-7.jpg
```

さて、これをfor文で回してみましょう（以下のコードは失敗例）。
```sh:for文で結果をループ（失敗例）
files=`find . -name "*.jpg" -type f`
for file in $files; do
    echo $file
done
```
```:出力結果
./image-5.jpg
./image-2.jpg
./image-0.jpg
./image-4.jpg
./image-6.jpg
./image-9.jpg
./image-8.jpg
./image-1.jpg
./image-3.jpg
./image-10.jpg
./image-7.jpg
```
できてそうな気がしますよね。でも、本当かな？

`echo $file`のあとに`echo "---------"`と区切りを入れてみましょう。

```sh:for文で結果をループ（失敗例の挙動確認）
files=`find . -name "*.jpg" -type f`
for file in $files; do
    echo $file
    echo "---------"
done
```

```:出力結果
./image-5.jpg
./image-2.jpg
./image-0.jpg
./image-4.jpg
./image-6.jpg
./image-9.jpg
./image-8.jpg
./image-1.jpg
./image-3.jpg
./image-10.jpg
./image-7.jpg
---------
```

区切り文字列が最後にしか出力されていませんね。forループは1回しか走っていないようです。

では、どうしたらいいのか。答えは簡単です。
外側に丸括弧をつければ、リストとして認識され意図していた通りの挙動になります。
```sh:()で囲ってリストにする
files=(`find . -name "*.jpg" -type f`)
```
```修正後の出力結果
./image-5.jpg
---------
./image-2.jpg
---------
./image-0.jpg
---------
./image-4.jpg
---------
./image-6.jpg
---------
./image-9.jpg
---------
./image-8.jpg
---------
./image-1.jpg
---------
./image-3.jpg
---------
./image-10.jpg
---------
./image-7.jpg
---------
```

正しく反復できていますね。
Ubuntu20.04でlibgtk2.0-devをインストールするとエラーが発生する

# はじめに

CypressをWSL2で動かそうとしてその依存ライブラリをインストールした際にエラーで躓いてしまったのでまとめます。

# 問題

Ubuntu20.04LTSで以下のコマンドを叩くとエラーになりました

```
$ sudo apt-get install libgtk2.0-dev
```

# 解決方法

以下のコマンド2つを実行してから再度インストールをするとうまくいきました

```
$ cat /etc/apt/sources.list
$ sudo apt-get update
```

```
$ sudo apt-get install libgtk2.0-dev
```

理由はよくわかっていないのですが、うまくいくので困っている方は試してみてください

# おわりに

肝心のCypressをWSL2で動かすのはいまだにできていません
Ubuntuを22に変えても動いていないのでどうしようかなと困っています。。。

# 参考

https://ubuntuforums.org/showthread.php?t=728232
[Rails] action_argsでparamsを操る

# はじめに
[action_args](https://github.com/asakusarb/action_args)がparamsを扱う上で流行っているらしい。
さっそく使ってみる。

## 確認環境
Ruby 3.1.2
Rails 6.1.7

## 導入
```
# Gemfileに以下を追加
gem 'action_args' 

# インストール
$ bundle install
```

# 使い方
showアクションとcreateアクションを例にとってご紹介します。
## showアクション
### 通常のparamsの場合
```ruby
class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end
end
```
そうです。`params[:id]`によってuserのidを取得します。
### action_argsの場合
```ruby
class UsersController < ApplicationController
  def show(id)
    @user = User.find(id)
  end
end
```
アクションに対して`params[:id]`と同義となる引数`id`を渡すことで、このアクションで必要とされるパラメータが明確になります。この場合、`id`は必須パラメータとなり、paramsに存在しない場合`ActionContrrler::BadRequest`が発生します。

### 引数を任意とする場合
```ruby
class ProductsController < ApplicationController
  def index(price, kind: nil)
    @products = Prodcut.where(price: price, kind: kind)
  end
end
```
`kind: nil`によって`kind`は任意となり、paramsに存在しなくともエラーが発生することはありません。
注意：コードはあくまで例です。

## createアクション
### 通常のparamsの場合
```ruby
class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    
    if @user.save
      redirect_to @user
    else
      render :new
    end
  end

  private

  def user_params
    params.require(:user).permit(:name)
  end
end
```
通常はprivateに`user_params`メソッドを定義しストロングパラメータを設定しますよね。
### action_argsの場合
```ruby
class UsersController < ApplicationController
  permits :name

  def create(user)
    @user = User.new(user)
    
    if @user.save
      redirect_to @user
    else
      render :new
    end
  end
end
```
action_argsの方が全体的にスッキリしていますね。
先頭に許可するパラメータを宣言し、コントローラ名から推測される`user`により登録するパラメータを渡しています。
`user_params`としても同様に働くため、プロジェクト途中での導入も修正が少なく済みそうです。

### 関連モデルへのストロングパラメータ対応
`model_name`を指定することで、Usersコントローラ内でProductモデルの属性を許可することもできます。引数として渡す`product`は、前述の通り`product_params`でも代用可能です。
```ruby
class UsersController < ApplicationController
  permits :name, model_name: 'Product'

  def create(product)
    @prodcut = Product.new(product)

      if @prodcut.save
        redirect_to @prodcut
      else
        render
      end
  end
end
```
Eventコントローラ内でネストしたParticipantモデルの属性も許可する場合も問題なしです。（`accepts_nested_attributes_for`対応）
```ruby
class EventsController < ApplicationController
  permits :name, :price, 
    participants_attributes: [:id, :name, :_destroy]
end
```
# 最後に
いかがでしたでしょうか。
導入の是非はプロジェクトによって変わると思いますが、試してみてもいいかもしれません。
その他の使い方については[action_argsのGitHub](https://github.com/asakusarb/action_args)を参照してください。
初心者がUnity-Chanを設定して実行しようとしたらStandards Assetsでerror CS0619が出た

## 使用バージョン

バージョンは以下を使用しています。
| Unity, Package | Ver| 
|:-----------:|:------------:|
| Unity      | 2021.3.12f1        | 
| Unity-Chan! Model     | 1.2.2    | 
| Standard Assets (for Unity 2018.4)       | 1.1.6        | 

## 経緯
何か作ってみたい！と思い立ってUnityちゃんというのを動かしてみることに。
検索しつつ、UnityちゃんとStandard Assetsを用意して設定を行い実行！しかし…

## 実行時のエラー
実行したところ、下記のエラーが出る状態になっていました。
>Assets\Standard Assets\Utility\SimpleActivatorMenu.cs(12,16): error CS0619: 'GUIText' is obsolete: 'GUIText has been removed. Use UI.Text instead.'

GUITextは削除されたからUI.text使ってねということらしい。
該当の場所を見ると、確かにGUITextとある。
初心者なので「ははぁ、UI.Textにすりゃいいのね」となってそのまま入力。エラー。なんで？
何故かはわからないので検索し、下記のサイトと文言を発見。

[【Unity】Standard Assetsでエラーが出た時の対処方【error CS0619】](https://www.ikaken.com/archives/1747)
>SimpleActivatorMenu.csファイルを開いて、「GUIText」を「Text」に変更します。


「UI.Text」じゃなかった…


記載されている通りに「Text」に変更し「using UnityEngine.UI」も追記したところで、無事実行が確認できました。

```SimpleActivatorMenu.cs
using System;
using UnityEngine;
using UnityEngine.UI; //追加

#pragma warning disable 618
namespace UnityStandardAssets.Utility
{
    public class SimpleActivatorMenu : MonoBehaviour
    {
        // An incredibly simple menu which, when given references
        // to gameobjects in the scene
        public Text camSwitchButton; //GUITextをTextに変更
        public GameObject[] objects;
```
paiza.ioでelixir その40

# 概要
paiza.ioでelixirやってみた。
code使ってみた。

# サンプルコード

```
Code.compile_string("defmodule Main do def add(a, b) do a + b end end")
Main.add(10, 20)		
|> IO.puts

Code.eval_string("[a + b, a - b, a * b, a / b]", [a: 2, b: 5])
|> IO.inspect

```

# 実行結果

```
30
{[7, -3, 10, 0.4], [b: 5, a: 2]}
```

# 成果物

https://paiza.io/projects/C-8W-eKNBmYXAFLSuKiX7A?language=elixir


以上。
新たなプログラミングを学習中の私がオススメする学習サイト

# こんなプログラミング入門者にオススメです
今回は、下記の方が対象です。

- プログラミングを勉強したいけど学習法が分からない入門者
- 今まで勉強してきたプログラミング言語とは異なる言語を勉強したい
- 質問しながらの勉強をしたいけど、わざわざ講座を受けたくない方
- 本を使ってたけどインターネットを使って勉強したい
- 実際に実行している様子を見ながら勉強したい
- 環境構築から勉強したい
- スクラッチから実際のプログラミングへステップアップしたい入門者

# オススメサイト
## ドットインストール
### サイト情報
#### URL： https://dotinstall.com/
<img width="500" alt="スクリーンショット 2019-11-01 3.49.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917703/6a804569-a10e-1e77-ddb6-a9ad0d06f328.png">


#### 料金：
| プラン|料金|
|:--|:--|
|一般会員|無料|
|プレミアム会員|月額　1,080円 (税込) |
※２０１９年１１月１日現在の金額
### オススメポイント
#### １講座３分と短いため、学習し易い
１講座3分であるため、疲れることなく学習が可能です。
長い講座であるとどうしても途中で抜ける事が出来ないため、苦痛に感じますが、３分であれば仕事の休み時間や、通勤のバス・電車の中などで視聴が可能です。

#### 初級の動画はほとんど無料で見られる
初級の動画はほとんど無料で見る事が可能です。
入門したいけど、お金を払ってまで入門の動画を見たくないという方にオススメです。
※初級の動画でも一部有料がある場合がります。

#### 数多くのプログラミング言語とAPI、技術を紹介
数多くのプログラミング言語を取り揃えているため、自分が勉強したい言語がきっとあるはずです。
また、プログラミグ言語の入門が出来たら、応用技術の動画も取り揃えています。
応報技術の動画は一部有料ですが、月額１,０８０円（２０１９年１１月１日現在）と良心的な金額なので、オススメです。

#### プログラミング言語の開発環境から説明するため初心者でも安心
プログラミング言語の実行可能プログラムのインストールから紹介してくれます。
また、概要、公式サイト、開発環境、必要となる知識、を紹介してくれる為、全く知識がなくても安心です。

#### 動画に関連する疑問も質問が可能（プレミアム会員から）
動画で紹介内容で疑問に思ったら、関連することであれば質問をする事が可能です。
やはり分からないままにしないことも、プログラミングを勉強することで重要なことです！

## Qiita
### サイト情報
#### URL： https://qiita.com/


#### 料金：無料
<img width="500" alt="スクリーンショット 2019-11-01 3.50.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917703/4599adf4-19b1-c5db-1b81-fbc916de0025.png
">

### オススメポイント
#### 最新の技術や知識などの記事が数多く投稿されている
一般の方が投稿したプログラミングに関する記事や、知識が数多く投稿されています。
また、最新の技術についても数多く投稿されています。
記事の検索もし易いのも特徴です。

#### プログラミング以外の知識も数多く投稿されている
プログラミングの記事も数多く投稿されていますが、それ以外に豆知識や初心者向けの技術、会社で使える知識なども投稿されています。
初心者向けにわかり易い記事が多く、入門する際の参考書代わりに使用するのにオススメです。

#### 自分が知らない知識が数多く存在し、エラーコードに関する対策法なども投稿されている
自分が知らない技術やプログラミングに関する情報が数多く投稿されています。
プログラミングをしている際に出てくるエラーコードに関する情報も多く投稿されている為、一度詰まったら検索してみるのもいいかもしれません。

#### 初心者向けの記事が数多く投稿されている為、入門者にもオススメ
初心者向けに、わかり易い記事が数多く存在します。
入門書代わりに使用したり、ちょっと違う視点からの説明を読みたいという方にオススメです。



## teratail
### サイト情報
#### URL:https://teratail.com/
<img width="500" alt="スクリーンショット 2019-11-01 3.50.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917703/5394c673-44ae-62cf-6ec1-bffcffe35586.png">


#### 料金：無料
### オススメポイント
#### 最大の特徴の他の一般の方に質問できる
プログミングでどうしても分からない、エラーが出て前に進めないなどの問題が発生した場合、上級者などに質問できます。
回答率は９０％以上(2019年１１月２６日現在(回答率は日によって変動します))と回答率が高い為、勉強中のプログラミング言語について疑問などがあったら、質問してみましょう。
エラーが発生した際、エラーコードと対象のソースコードを付け加えて質問すると詳しく回答してくれます。

#### 回答に対して新たに質問できる
質問に対して回答が帰ってきても、その回答に対して新たな疑問が出てくるかもしれません。
その為、回答に対して質問する事が可能です。
paiza.ioでelixir その39

# 概要
paiza.ioでelixirやってみた。
defstruct再考。

# サンプルコード

```
defmodule Point do
	defstruct x: 0, y: 0
	def add(%Point{x: x, y: y}, %Point{x: other_x, y: other_y}) do
		%Point{
		    x: x + other_x, 
		    y: y + other_y
		}
	end
end
defmodule Main do
    require Point
    p1 = %Point{
	    x: 1, 
	    y: 2
	}
	p2 = %Point{
	    x: 3, 
	    y: 4
	}
	IO.inspect Point.add(p1, p2)
end

defmodule Person do
	defstruct name: 'unknown', age: 0
end
defmodule Hoge do
	require Person
	def hoge do
		default_person = %Person{}
		tanaka = %Person{
		    name: 'tanaka', 
		    age: 24
		}
		Hoge.print_person(default_person)
		Hoge.print_person(tanaka)
	end
	def print_person(person) do
		IO.inspect person
		IO.puts person.name
		IO.inspect person.age
	end
end
Hoge.hoge

defmodule User do
	defstruct [:name, :age]
end
defmodule Main do
	require User
	alice = %User{
	    name: "Alice", 
	    age: 20
	}
	IO.inspect alice.name
end


```

# 実行結果

```
%Point{x: 4, y: 6}
%Person{age: 0, name: 'unknown'}
unknown
0
%Person{age: 24, name: 'tanaka'}
tanaka
24
"Alice"
```

# 成果物

https://paiza.io/projects/D-x6HPqGG7ds9S3tVT4-6g


以上。
Vuetifyの未宣言エラー　Error in beforeCreate hook: "Error: Vuetify is not properly initialized　～～


## エラーメッセージ
```
[Vue warn]: Error in beforeCreate hook: "Error: Vuetify is not properly initialized, see https://vuetifyjs.com/getting-started/quick-start#bootstrapping-the-vuetify-object"
```


他にもこんなメッセージが出てました。
```
[Vue warn]: Error in getter for watcher "isDark": "TypeError: Cannot read properties of undefined (reading 'dark')"
TypeError: Cannot read properties of undefined (reading 'dark')
[Vue warn]: Error in render: "TypeError: Cannot read properties of undefined (reading 'dark')"
```

## 環境
```
・windows11
・node.js : v16.16.0
・@vue@2.7.9
・@vue/cli-service@5.0.8
・@vuetify@2.6.9
```


## 解決法
以下の通りにmain.jsにVuerifyの宣言を追加したところエラーが解消しました。
```diff_javascript:main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
+import Vuetify from 'vuetify'

Vue.config.productionTip = false
+Vue.use(Vuetify)

new Vue({
  router,
+  vuetify: new Vuetify(),
  render: h => h(App)
}).$mount('#app')
```



## 参考記事

https://stackoverflow.com/questions/57291304/vue-vuetify-is-not-properly-initialized

https://nordschool.com/create-a-blog-with-gridsome-and-vue/
Salesforce認定Platformアプリケーションビルダー試験の公式サンプル問題解説してみた-08

こんにちは

Salesforce認定Platformアプリケーションビルダー試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

https://trailhead.salesforce.com/ja/content/learn/modules/platform-app-builder-pt1/platform-app-builder-security-ui

今回はTrailhead

認定 Platform アプリケーションビルダー資格の受験準備: Fundamentals and User Interface (基本事項とユーザインターフェース)
ユーザインターフェーズについて

にある練習問題3問目をご紹介します

なお今回の内容は動画でも公開しております

https://www.youtube.com/watch?v=UWi3eDWrU3Q

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

今回の内容はこちらです

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/0f29a8d2-3a30-8df5-152b-f67f57545d46.png)


正解はAです

詳細はこちらをご確認ください
Lightning ページのカスタムコンポーネント

https://help.salesforce.com/s/articleView?id=sf.lightning_page_components_custom.htm&type=5

Lightning アプリケーションビルダーで使用するために設定された組織のカスタムコンポーネントは、Lightning コンポーネントペインに表示されます。
Slackで特定のチャンネルへの投稿を自動でピン留めする

# やりたいこと
Slackで特定のチャンネルに投稿されたメッセージを全てピン留めしたい。スレッドのメッセージはピン留めしたくない。

### 目的
Slackでタスク管理用にチャンネルを作成し、ピン留め→対応したらピン留めを外すという運用をしていた。
ピン留め忘れを防ぎ、予約送信したときでもピン留めできるようにしたい。

# 方法
メッセージの投稿イベントの購読→GAS→ピン留めのSlackAPIを叩く

### SlackAppの作成
Appの作成自体はどこでも説明されてるので割愛します。
作成後、OAuth&Permissionsで、bot tokenにpins:writeの権限を追加する。

### イベントの購読
https://api.slack.com/events/message.channels

Event Subscriptionsを開き、ONにする。
Subscribe to BOT Eventsで、message.channelsを選択する。

WSへのメッセージ投稿イベントを検知すると、Request URLにセットしたURLにPOSTリクエストが送られる。
URLはGASアプリをデプロイしたURLをセットする(後述)。
リクエストボディについては上記ドキュメント参照。


### ピン留めするGASスクリプト作成
https://api.slack.com/methods/pins.add

```JS
const doPost = (e) => {
  const data = JSON.parse(e.postData.getDataAsString());
  
  if (data.type === "url_verification") {
    // リクエストURLの確認のためにchallengeを返す必要がある
    return ContentService.createTextOutput(data.challenge);
  }
  
  if (data.event.thread_ts || data.event.subtype === 'message_deleted') {
    // スレッドのメッセージまたはメッセージ削除の場合。
    return;
  }

  const channel = data.event.channel;
  if (channel === 'C0XXXXXX') {
    // 特定のチャンネルへ投稿されたときにピン留めを実行
    pinToChannel(channel, data.event.ts);
  }
};

/**
 * ピン留めする
 */
const pinToChannel = (channel, ts) => {
  const payload = {
    channel: channel,
    timestamp: ts, // メッセージを特定するタイムスタンプ
  };
  const options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      Authorization: 'Bearer ' + 'BOT userのアクセストークン',
    },
    payload: JSON.stringify(payload),
  };
  const url = 'https://slack.com/api/pins.add';
  UrlFetchApp.fetch(url, options);
};
```

アクセストークンはOAuth&Permissionsからコピーする。直接コードに書かずスクリプトプロパティから参照しましょう。

デプロイして、ウェブアプリのURLをSlack AppのRequestURLに貼り付け。verifiedとなればOK。
あとはWSにインストール、チャンネルにAppを招待すれば動く。はず。
paiza.ioでelixir その38

# 概要
paiza.ioでelixirやってみた。
cond,case,with使ってみた。

# サンプルコード

```
{n, m} = {100, 150}
result =
	cond do
		n > 100 -> "n is big"
		m > 100 -> "m is bigger"
		true -> "n nor m is not so big"
	end
|> IO.inspect	
cond do
	 0 > 1 -> "No"
	 0 > 2 -> "Nope"
	 true	-> "fallback"
end
|> IO.inspect
case {1, 0, 3} do
    {1, x, 3} when x > 0 -> 
        "マッチする"
    {1, x, 3} -> 
        "マッチする"
    _ -> 
        "マッチしない"
end
|> IO.inspect
func = fn -> 
    "hello" 
end
result =
	case func.() do
		str when is_nil(str) -> 
		    "empty!"
		str when is_binary(str) and str == "hello" -> 
		    "yeah!"
		_ -> 
		    "oops!"
	end
|> IO.inspect
case {1, 2, 3} do
    {4, 5, 6} ->
	    "This clause won't match"
	{1, x, 3} ->
		"This will match and bind x to 2"
	_ ->
		"This will match any value"
end
|> IO.inspect
cond do
	1 + 1 == 3 ->
		"I will never be seen"
	2 * 5 == 12 ->
		"Me neither"
	true ->
		"But I will (this is essentially an else)"
end
|> IO.inspect
with {:ok, {int, _asdf}} <- Integer.parse("123asdf"), {:ok, datetime, _utc_offset} <- DateTime.from_iso8601("2021-10-27T12:00:00Z") do
	DateTime.add(datetime, int, :second)
else
	:error ->
		"couldn't parse integer string"
		{:error, :invalid_format} -> "couldn't parse date string"
	_ ->
		"this will never get hit because all errors are handled"
end
|> IO.inspect
try do
	throw(:hello)
catch
	message ->
		"Got #{message}."
after
	IO.puts("I'm the after clause.")
end

```

# 実行結果

```
"m is bigger"
"fallback"
"マッチする"
"yeah!"
"This will match and bind x to 2"
"But I will (this is essentially an else)"
"this will never get hit because all errors are handled"
I'm the after clause.
```

# 成果物

https://paiza.io/projects/a4cMjYdvbIxBFRxsE-uyhg?language=elixir


以上。
paiza.ioでelixir その37

# 概要
paiza.ioでelixirやってみた。
when使ってみた。パターンマッチングと再帰入ってる。

# サンプルコード

```
defmodule Main do
	def inc x do
		x + 1
	end
	def dec x do
		x - 1
	end
	defp minus(x, y) when x < 0 do
		minus inc(x), inc(y)
	end
	defp minus(x, y) when x > 0 do
		minus dec(x), dec(y)
	end
	defp minus _, y do
		y
	end
	def minus x do
		minus x, 0
	end
	def add x, 0 do
		x
	end
	def add(x, y) when y < 0 do
		minus add minus(x), minus(y)
	end
	def add x, y do
		add inc(x), dec(y)
	end
	def sub x, y do
		add x, minus(y)
	end
	def sum [] do
		0
	end
	def sum [x | xs] do
		add x, sum xs
	end
	def dup _, 0 do
		[]
	end
	def dup x, n do
		[x | dup(x, dec n)]
	end
	def absolute(x) when x < 0 do
		minus x
	end
	def absolute x do
		x
	end
	def times(x, y) when y < 0 do
		times minus(x), minus(y)
	end
    def times x, y do
		sum dup x, y
	end
	def divide(x, y) when x < 0 and y < 0 do
		divide minus(x), minus(y)
	end
	def divide(x, y) when x < 0 or y < 0 do
		minus divide absolute(x), absolute(y)
	end
	def divide(x, y) when x < y do
		0
	end
	def divide x, y do
		inc divide sub(x, y), y
	end
end

IO.puts Main.add -10, -3
IO.puts Main.sub -10, -3
IO.puts Main.divide -10, -3
IO.puts Main.times -10, -3


```

# 実行結果

```
-13
-7
3
30
```

# 成果物

https://paiza.io/projects/B1OU8a4kfmb3LW_tnuIsOA?language=elixir


以上。