OmniAICreator/Qiita-1.07M huggingface dataset:
オーダーメイドキーボードを入手して

<h2>帯に短したすきに長し</h2>
エンジニアは配列やキースイッチなどキーボードに対してこだわりを持っている方も多いかと思います。市販のキーボードにもいいものも多いですが、完全に満足というものはなくどこかしらで妥協をしています。筆者もその1人です。今回はその妥協をできるだけ少なくするべく<strong>オーダーメイドキーボード</strong>を試してみました。

<h2>現在使用しているキーボード</h2>
<h3>Majestouch MINILA Air US67キー 黒軸</h3>
![minila.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/c789db37-85ba-681e-a696-3d09016416de.png)
今はMajestouch MINILA-R Convertibleが発売され、かなり人気のようです。私はその一つ前の型。一つ前の型とはいえ、まだ販売されています。私は重い打鍵感が好きなので黒軸にしましたが、本当は青軸のカチカチいう音が好きです。写真はキーキャップを交換して無刻印になっています。ただ、数字は目印がないと色々不便なので、いくつか残しています。特に、WindowsにBluetoothを認識させる数字の早打ちは目印がないとどうにもなりませんでした。ただ、格好悪いので数字だけは全部残しでも良かったかも知れません。

<h3>Majestouch Convertible 2 Tenkeyless 茶軸・テンキーレス・日本語かなあり</h3>
![compati.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/300776d5-aa8b-87e1-8edf-f3fd91d78af4.png)
業務で貸与されたノートPCが配列変更不可となっていたので、日本語配列キーボードを使用しました。黒軸でもよかったのですが、他の軸をためそうということで茶軸にしました。もちろん本音は青軸なんですが、オフィスで使うことも多かったので涙をのんで・・・また、MINILA Airでよかったのですが、気分でテンキーレスにしました。こちらはまだそれほど使っていないので、キーキャップは買ったときのままです。減ってきたらこちらも無刻印のものと交換予定です。

<h2>テレワークとなりいよいよ・・・</h2>
上2つのキーボードはオフィスでの使用も考えて、音の出ない黒軸・茶軸にしましたが、仕事がテレワークとなって思う存分音が出せる環境となりました。こうなるといよいよ<b>青軸</b>を使ってみたくなります。MINILA AirやMajestouch Convertible 2、あるいは新しく出たMINILA-Rでもよかったのですが、調べているうちに見つけたのがこれ

![vami.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/99f9d01b-72d1-dcbe-b87f-963ec923d0f8.png)

<h3>オーダーメイドキーボード</h3>
https://jp.varmilo.com/keyboardproscenium/
自分の好みの色やスイッチを選ぶことができます。しかも、異なるキーを混在することもできます(ただ、静電容量無接点とメカニカルスイッチの混在は不可)。そこで私は、アルファベットと数字をCherry<strong>緑軸</strong>、その他をCherry青軸にしました。緑軸は青軸より重いスイッチで、青軸と同じカチカチ音がするスイッチです。ただ少し高価なので、全部緑軸にはせずに、ファンクションキーなど使用頻度の少ないものを青軸としました。写真でいうと緑のキーキャップのところと、上段のファンクションキーの部分です。詳しくはサイトを見ていただくとわかりますが、高いキースイッチの数が増える程に値段があがります。私の構成で黄色のキーを青軸にしたら、青軸は緑軸より安価なので値段が下がります。またこれを他の軸にすると、そのスイッチに応じた値段になります。カスタマイズ中に概算表が出るので参考にしてください。

スイッチもCherry軸以外のものからも選べますので値段を抑えることもできます。また、静電容量無接点スイッチを選ぶこともできます。ただ、静電容量無接点スイッチは東プレ製ではありませんしメカニカルスイッチとの混在はできません。

配列は日本語、英語、ISO配列から選べます。ISO配列というのはヨーロッパのキー配列らしいのですが、このサイトの読者で使っている人は少数だと思われます。むしろDVORAK配列などの方が利用者は多いかと思われますが、残念ながら用意はされていないようです。実現するには<strong>私的改造</strong>ということになりますでしょうか。ちなみに、CAPSとCtrlの入れ替えはできます。

キーキャップの刻印は最初から無刻印を選ぶことができ、またそのほうが安価になります。ちなみに昇華印刷という方法を用いています。筆者は完全無刻印ではちょっと自信がないので、数字キーの5,6,0,y,p,g,l,b,mの色を変えました。数字キーは前述の通り、目印がないと困るというのでつけました。そうするとキーキャップの色が3色となります。3色固定なら後はどう変更しても同じ値段なので、p，l，mと記号と隣り合わせの文字の色を変え、y，g，bはそのバランスで変えてみましたが、位置がおかしいですね(笑)

<h3>その他</h3>
その他、キーボードは65%(MINILAサイズ)、80%(テンキーレス)、110%(フル)、20%(テンキーボード)から選べます。値段は単純にキーの数が増えるほどに高くなります。
また、有線式-有線無線デュアル方式、LEDありなしなども選べます。ただ、有線無線デュアルだとLEDありが選べないなど若干の制限があります。エンジニアはキラキラ光るキーボードはお好きではない方が多いようなので気にはならないかと思いますが(笑)

<h3>気になるお値段</h3>
さて、気になるお値段ですが、値段に関わるカスタマイズをあげますと
・80%
・有線無線デュアル
・刻印なし、キーキャップ3色
・Cherry緑軸、Cherry青軸
・名前入れなし
で24,487円になります。ただ、本製品は中国で作られますので送料が3,000円かかり、合計<b>27,487円</b>になりました。キーキャップを1色にして、全部青軸にするともう少し安くなりますし、刻印を入れて、全部緑軸にしたらもっと高くなります。Realforceといい勝負となりますが、これが高いと見るか安いと見るか判断はおまかせします。

<h3>使った感想</h3>
さて、使った感想ですが、青軸・緑軸の打鍵感を味わいたかったので満足です。青軸だとちょっと手応えが弱いので、アルファベット部分は圧のある緑軸にしてよかった。音はかなりするので、オフィスに行くときには持っていけませんが、家で使う分には大満足。これからも長く使えそうです。

参考になれば幸いです。
公式実装のvision transformerがfrom vit-jax import hyperのエラーで使えなくなった話

#Vision Transformerのアップデート

6/20にVision Transformerのアップデートがありました。その関係で以前の公式実装を頼ると使うことができなくなりました。

下記がVision Transformerの公式実装になります。
https://colab.research.google.com/github/google-research/vision_transformer/blob/master/vit_jax.ipynb

URLに飛び、変更履歴を見るとNotebookでも変更が加わっています。

原因というか変更点はVision Transformerように作成されたvit-jaxというライブラリの中身になります。Hyperなどの一部のモジュールが削除されています。


#対処法

自分の場合は[記事](https://qiita.com/kanataken/items/dc579fa0f53b7f84ef25)を参考にfine tuningを行っていたためにコードをいじっていたものですからすぐに対応ができない状態でした。

もちろん本当は公式実装をみて変更を確認、修正するべきですがとりあえずの対応として[Vision TransformerのGitHub](https://github.com/google-research/vision_transformer)から過去のcomitt(例えば[これ](https://github.com/google-research/vision_transformer/tree/157470aedd797a8913e1faf70575faac5c25671c))のコードは過去の状態で使えるのでそれを利用しました。

しかし、理由があってアップデートされたものを過去のバージョンのまま使い続けるのは良いところ悪いところあると思うので時間ができ次第最新版の状態にアップデートします。
EC2のセキュリティグループでPortを開いたのに接続できない問題

この記事のタイトルを悩みましたが、根本原因はEC2でのポート設定問題でしたので、このタイトルにした。
この問題に辿り着いたのは下記の問題からである。

-EC2のUbuntuサーバでMongoDBを設定したが、Lambdaから繋がらない
-ローカルからUbuntuにあるMongoDBへ接続を試したが、繋がらない
-セキュリティグループなど全部正確に設定したのに、Telnet IP portしても繋がらない（Port 80は繋がる）

>この記事を参考にして、ローカルからMongoDBへ接続しようとしたが失敗。
https://ianlondon.github.io/blog/mongodb-auth/
ローカルからEC2上のMongoDBへ接続するガイドとしてはほぼ完全だと思う。但し、この通りに
設定内容を何度も確認しても繋がらないですね。。。

エラーメッセージは
```Error: couldn't connect to server (IP):27017, connection attempt failed: SocketException: Error connecting to (IP):27017 :: caused by :: Operation timed out :```
タイムアウトですね。Firewall関連だとは分かったが、Security Groupもちゃんと設定しているし、ネットワークACLも全てAllowしているし、何が悪いの？で何時間もイライラしていました。

```
# telnet IP 80
Connected to ec2-IP.ap-northeast-1.compute.amazonaws.com.
Escape character is '^]'.

# telnet IP 27017
Trying IP...
```
上記のようにローカルからポート確認をしたら、どうやら27017は開いてないようですね。
普段、毎日サーバ関連を弄っている訳ではないので、正直ネットワーク関連は苦手なんですね。EC2のセキュリティグループでちゃんと設定したのに、80はよくて他のポートがダメな理由が分かりませんでした。
さらに調べて、どうやらサーバ上でiptableを弄る必要があるみたいなので、下記の記事を参考した。

>https://qiita.com/hana_shin/items/a630871dce209cff04f3
Ubuntuでのiptableの設定方法、utwのコマンドを分かりやすく説明しているのです。

まず、ufwで既存のルールを確認するとやはり27017は開いてない状態ですね。

```
# sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere                  
80,443/tcp (Nginx Full)    ALLOW IN    Anywhere                  
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)             
80,443/tcp (Nginx Full (v6)) ALLOW IN    Anywhere (v6)

```

それで、27017を設定すると正確にルールが追加されていることが分かる。

```
# sudo ufw allow 27017
Rule added
Rule added (v6)

# sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere                  
[ 2] Nginx Full                 ALLOW IN    Anywhere                  
[ 3] 27017                      ALLOW IN    Anywhere                  
[ 4] OpenSSH (v6)               ALLOW IN    Anywhere (v6)             
[ 5] Nginx Full (v6)            ALLOW IN    Anywhere (v6)             
[ 6] 27017 (v6)                 ALLOW IN    Anywhere (v6)      
```

これでTelnet IP 27017が繋がるようになり、MongoDBへのアクセスも可能となった！長い旅だった！ネットワークに詳しい友達が欲しいです。
Node.jsのnpxでBusiness Card(電子名刺)を作る方法

##はじめに
先日、仕事でご一緒した方が、npxを使ったBusiness Cardで自己紹介をされていて、素敵だな〜と思ったので、真似させていただき作ってみました！！


##デモ
まず、早速デモをご紹介します。

ターミナルで

```npx misa335```

と入力してみてください。

ターミナル上にBusiness Cardが表示されるはずです！


npmパッケージのリンク
https://www.npmjs.com/package/misa335

##作り方
① プロジェクトの作成
　　`npm init`で新規プロジェクトを作成します。

② package.jsonの編集
　　package.jsonを編集して、`npx <your-project-name>`を実行すると、npmパッケージを落として、package.jsonに記載された`"main": "index.js"`が実行されるように設定します。

```javascript:package.json
{
...
"main": "index.js",
  "bin": {
    "misa335": "index.js"
},
...
```
③ Business Cardの作成
Business Cardとして表示させたい項目を、`index.js`の`console.log`内に記載します。
また、1行目に`#!/usr/bin/env node`と、nodeのインタプリタを実行する記述をします。

```javascript:index.js
#!/usr/bin/env node
console.log('
　　　　　　Business Cardとして表示する項目
');
```
ローカルでBusiness Cardが表示されるかどうか、
`node index.js`で確認することができます。

④ Githubにpushする
任意のGithubレポジトリにpushします。

##npmに公開する方法
① npmアカウントの作成
https://www.npmjs.com/ で、npmアカウントを作成します。

② npmへのログイン
　ターミナルで`npm login`と打ち、Username, Password, Email Addressを順に入力してnpmにログインします。

③ プロジェクトの公開
 `npm publish --access public`と入力すると、npm上でプロジェクトが公開されます。

最後に、`<npx your-project-name>`を試して、Business Cardが表示されるか確認します。


##おわりに
簡単にnpxを使ったBusiness Cardが作成できました！
よかったらぜひ試してみてください♪
また、SNSでつながっていただけると嬉しいです😆
laravel 任意のフィールドの値が指定したものと一致していない時に除外するバリデーションルールを記載する方法

# 目的

- laravelで任意のフィールドの値が指定したものと一致していない時に当該フィールドのバリデートをスキップする方法をまとめる

# 方法

- フィールド`check`の値に「true」という文字列以外が格納されたとき以外に、フィールド`input_str`の値のバリデーションをスキップしたい時は下記のように記載する。
- `input_str`の値のバリデーションルールは「必須」と「文字列であること」とする。
- 下記はリクエストファイルの`rules()`メソッドの内容のみ抜粋して記載する。

    ```HogeRequest.php
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'check' => 'required',
            'input_str' => 'exclude_unless:check,true|required|string',
        ];
    }
    ```

- 任意のフィールドの値が指定したものと一致していない時のみ除外してほしいバリデーションルールの頭に`exclude_unless:フィールド名,指定された値`を記載する。


# 参考文献

- [https://readouble.com/laravel/6.x/ja/validation.html](https://readouble.com/laravel/6.x/ja/validation.html)
ReactでTextareaの高さを可変にする

## 問題点
textareaのstyleにline-heightを指定すると
入力された値が1行の時でも、余分に余白ができてしまった。。。

textareaの高さを入力された行数によって、可変にしたい。

## 結論
textareaのrow属性を動的に指定して、実現できた。
![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1639629/7b880849-dca5-1ae7-5403-9d32ae888f20.gif)


## コード(React_classコンポーネント)

#### constructor()

```
constructor(){
    super();
    this.state={
      text:"サンプルテキスト"
    }
}
```

#### 高さを計算する関数

* textarea内の改行は`\n`で取得できる
* 入力値を`\n`で分割すれば、改行数が取得できる

```
calcTextAreaHeight(value){
    let rowsNum = value.split('\n').length;

    return rowsNum
}
```

#### render()

```
<textarea defaultValue={this.state.text} 
　　　　　　　　　　　　　　　　　　　　rows={this.calcTextAreaHeight(this.state.text)} 
　　　　　　　　　　　　　　　　　　　　onChange={e => this.setState({text:e.target.value})} />
```
Visual Studio Codeの日本語化

Visual Studio Code（VSCode）をインストールしたら英語モードだったので日本語化しました。

#環境
- Windows 10 Pro
- Visual Studio Code 1.57.1

#日本語化手順
[View] - [Command Palette...] を選択。
![20210623-094236.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/78744438-3849-7caa-eb6d-e79a9b561436.jpeg)

一覧から [Configure Display Language] を選択。
![20210623-094251.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/2477e51e-8612-2f9e-7275-e638c429e0ca.jpeg)

[Install Additional Languages...] を選択。
![20210623-094302.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/b7cb485c-80f0-27ae-4c64-ecee4cdd988f.jpeg)

左側に表示された一覧から [Japanese Language Pack] の [Install] ボタンをクリックする。
![20210623-094309.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/f61b93a0-c7b4-c474-26c5-4b39f1d91e9b.jpeg)

インストールが完了すると右下に VSCode の再起動を求めるダイアログが表示されるので [Restart] ボタンをクリックする。
![20210623-094325.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/7bd80936-5b63-8bbb-5730-47412cb20ffb.jpeg)

再起動後、日本語化されている。
![20210623-094656.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200478/d9b7647a-d05f-0353-f19b-d39b9daf8ccc.jpeg)
Entity Framework 6でNOT NULLだが空文字を許容したい時

しばらくハマったのと、疑問があったのでメモしておきます。

##環境
PostgreSQL 12.2, compiled by Visual C++ build 1914, 64-bit
EntityFramework6.Npgsql v6.4.3

##作業の流れ
①あるテーブルempに列stを追加。Char(1)で、特定の文字を入れてステータスを管理する。"S"とか"T"とかが入る。また、空文字""は「指定なし」の意味となる。

②DBに①の列を追加。

③PostgreSQLは空文字とNullを区別するので、空文字以外にNullの状態まで管理するとバグの原因になると思い、NOT NULL制約を付与。

④既存のテーブルに列を追加するので、デフォルト値として空文字''を指定。

```sql
ALTER TABLE emp ADD COLUMN st char(1) NOT NULL DEFAULT '';
```

⑤これに併せて、エンティティクラスempにも、以下のプロパティを追加。

```vb
<Required>
<StringLength(1)>
Public Property st As String
```

⑥ところが、実際にEFを使っての更新プログラムにて、

```vb
rec.st = ""
```

の行を追加したところ、DbContext.SaveChagesでエラーに。

どうやらRequired属性を指定した為に引っかかっている模様。Required属性は、空文字を「未入力」として扱うということでしょう。DBのNOT NULLとそのまま対応付けられるわけではないので、注意が必要そうです。

⑦以下のようにすることで、空文字を許容するようになるとのこと。

```vb
<Required(AllowEmptyStrings:=True)>
<StringLength(1)>
Public Property st As String
```

参考：https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.requiredattribute.allowemptystrings?view=net-5.0

AllowEmptyStringsをTrueにして再度動かしてみると、空文字を指定してもエラーが出なくなった。
DBも正しく空文字が設定されており、問題なし。

##懸念事項
ただ、上記のマイクロソフトのページに書かれている次の文言が気になる。

> When you set AllowEmptyStrings to true for a data field, Dynamic Data does not perform validation and transforms the empty string to a null value. This value is then passed to the database.
> 
> If the database does not allow null values, it raises an error. To avoid this error, you must also set the ConvertEmptyStringToNull to false.

適当に翻訳すると

> データフィールドのAllowEmptyStringsをtrueに設定すると、Dynamic Dataは検証を実行せず、空文字列をnull値に変換します。この値はその後データベースへと渡されます。
> 
> もしデータベースがnull値を許容しない場合、エラーを発生させます。このエラーを回避する為には、併せてConvertEmptyStringToNullをfalseに設定する必要があります。

今回、フィールドstは、DB側でNOT NULL制約を付与しているので、上記の説明の通りだと空文字を設定した時に値がNullに変換され、DB更新時にNOT NULL制約にひっかかってエラーが発生するはず。

しかしエラーは発生しておらず、データベースにもnullではなく空文字が設定されている。
念のためConvertEmptyStringToNull:=Trueを指定してみても、結果は同様。
つまり、ConvertEmptyStringToNullは動作していないように見える。

一体どういうことになっているのかわかる方がいたらコメントで教えて頂けると助かります。
テストコード　データ型の注意点

単体テストコードの記述の注意点。

```ruby
first_name_kana_full_width { 'タナカ' }
    last_name_full_width { '太朗' }
    last_name_kana_full_width { 'タロウ' }
    birthday { 1955_01_01 }
```
最初はこのような記述をしコミット、プッシュしていたがレビュワーの方から
生年月日(birthday)はデータ型なので値をクォーテーションで囲む必要があるとのことだった。
以下のように修正するとテストを実施する際に今まで問題なくできていた
テストコードの部分でエラーがターミナルで発生...

```
errors: Birthday can't be blank
```

しかし付随するusers.rbの記述には以下のように記述しておりエラーの原因が分からなかった。

```ruby
FactoryBot.define do
  factory :user do
    name { '田中tanaka' }
    email {Faker::Internet.free_email }
    password { '11111a' }
    password_confirmation { '11111a' }
    first_name_full_width { '田中' }
    first_name_kana_full_width { 'タナカ' }
    last_name_full_width { '太朗' }
    last_name_kana_full_width { 'タロウ' }
    birthday { "1955_01_01" }
  end
end
```
birthday記述しているのにと悩んでいたがどうやらクォーテーションで囲む際は
アンダースコアではなくハイフンにしないといけないらしく

```ruby
FactoryBot.define do
  factory :user do
    name { '田中tanaka' }
    email {Faker::Internet.free_email }
    password { '11111a' }
    password_confirmation { '11111a' }
    first_name_full_width { '田中' }
    first_name_kana_full_width { 'タナカ' }
    last_name_full_width { '太朗' }
    last_name_kana_full_width { 'タロウ' }
    birthday { "1955-01-01" }
  end
end
```

こちらの記述にすることで無事、エラーなく単体テストコードの記述に成功。
最後になぜデータ型をクォーテーションで囲む必要があるのかというと
文字列として扱いたいからというのが私が調べた上での見解。
SwiperjsのNavigationが1度しか動作しない場合の対処法

- fadeエフェクトを使用している
- swiperのcssはコアのみ使用している

という状況でprevとnextボタンがロード直後に1度しか動作しない現象に遭遇。

コードは以下

```js 
const slider = new Swiper ('.swiper-container', {
  loop: true,
  speed: 2000,
  effect: 'fade',
  navigation: {
    nextEl: '.swiper-button-next',
    prevEl: '.swiper-button-prev',
  },
  pagination: {
    el: '.swiper-pagination',
    clickable: true,
  },
});
```

原因を探ったところ、以下のfade用のcssを追加したら解決しました。
[swiper/components/effect-fade/effect-fade.scss](https://unpkg.com/browse/swiper@6.7.0/components/effect-fade/effect-fade.scss)

```scss
.swiper-container-fade {
  &.swiper-container-free-mode {
    .swiper-slide {
      transition-timing-function: ease-out;
    }
  }
  .swiper-slide {
    pointer-events: none;
    transition-property: opacity;
    .swiper-slide {
      pointer-events: none;
    }
  }
  .swiper-slide-active {
    &,
    & .swiper-slide-active {
      pointer-events: auto;
    }
  }
}
```
Error: Cannot find module 'express'


```npm install -g express```

expressをインストールしてもexpressが見つけられない。。。

```
node server.js
internal/modules/cjs/loader.js:883
  throw err;
  ^

Error: Cannot find module 'express'
```

## やろうとしていること
[vuex/examples at dev · vuejs/vuex](https://github.com/vuejs/vuex/tree/dev/examples)
のserver.jsを実行したい

## 解決

```npm install```
でパッケージをインストールすればいいだけ
SES経由EC2のpostfixでメール送信

#SES関連

#EC2サーバー側設定
```
# postconf -e "relayhost = [email-smtp.ap-northeast-1.amazonaws.com]:587"

# postconf -e "smtp_sasl_auth_enable = yes" \
"smtp_sasl_security_options = noanonymous" \
"smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd"

# postconf -e "smtp_use_tls = yes" \
"smtp_tls_loglevel = 1" \
"smtp_tls_security_level = encrypt" \
"smtp_tls_note_starttls_offer = yes" \
"smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt"

# postconf -e "mynetworks = 127.0.0.0/8"

# vi /etc/postfix/sasl_passwd
[email-smtp.ap-northeast-1.amazonaws.com]:587 <username>:<password>

# postmap hash:/etc/postfix/sasl_passwd

```
##Laravel側モジュール追加
```
composer require aws/aws-sdk-php
```

##Laravelでメール送信
```
#vi .env
MAIL_DRIVER=ses
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=mail-address
MAIL_FROM_NAME="${APP_NAME}"

AWS_ACCESS_KEY_ID=KEY-ID
AWS_SECRET_ACCESS_KEY=ACCESS-KEY
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=
```

#php関連

##EC2にphp7.4インストール
```
#amazon-linux-extras install epel
#yum install epel-release
#rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
#yum install -y php74 php74-php php74-php-fpm php74-php-mbstring php74-php-xml php74-php-dom php74-php-gd php74-php
-mysqlnd php74-php-pdo
#ln -s /usr/bin/php74 /usr/bin/php
```

##composerインストール
```
#php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
#php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
#php composer-setup.php
#php -r "unlink('composer-setup.php');"
#cp composer.phar /usr/bin/composer
```
Outsystemsでコールセンター管理ツールを作る①

# 経緯
色々ほしい機能のあるシステムがなかった。
部分的に使用できるものはあったが統合されているものはなかった。
じゃあ作っちゃおうという経緯。

# 何故Qiitaに？
自分メモと自分の経験がどこかで役に立つかもしれないという思いから。

# コールセンターはExcelで出来ている
自分が勤めている会社以外にもまだまだExcelを多用している事が多いと考えていますが、
具体的にどんなツールがあるかは以下に書き出してみます。

- シフト作成ツール
- シフト集約ツール
- 在籍管理ツール
- アカウント管理ツール
- 生産性算出ツール
- スタッフを評価するツール
- 呼量を予測するツール

# 使う人たち
特にコード記述ができるわけではない
稀にVBAをかける人が存在しているくらいの人たち

# 要件
Excelでミスが起きる為置き換える
在籍スタッフのデータベースを作成し、それに様々なデータを紐づける

# 環境
- Windows10
- Outsystems11

# 次回から
何をやったか書き始めます
Windows 10 のエッジスワイプを無効化する

「[Windows 10 Homeのアクションセンターを無効化する](https://qiita.com/ymkn/items/811959fb263562de9353)」の記事で、できないと書いたアクションセンターは有効にしつつエッジスワイプだけを無効化する方法が分かったのでメモ。

1. レジストリエディタを開いて`\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\EdgeUI`キーを追加。
2. DWORDで`AllowEdgeSwipe`値を作り、データを`0`とする。
3. 再起動

検索するとグループポリシーで設定する方法も出てくるんですが効きませんでしたね。Homeエディションだからいけないのかもしれない。

ソース：[How to Disable Edge Swipe Gesture on Touch Screen in Windows 10 \| Password Recovery](https://www.top-password.com/blog/disable-edge-swipe-gesture-in-windows-10/)
Pacemaker とは？

## 勉強前イメージ

DBのサーバでなにかするやつ

## 調査

### Pacemaker とは？

OSS(オープンソースソフトウェア)のHAクラスタソフトになります。
そもそもHAクラスタというのは、複数のサーバをつなげて全体で一つに見えるように振る舞う技術で、
Pacemakerは信頼性を向上する高可用性クラスタになります。
クラスタ内のリソースを一定間隔で確認し、異常があれば切り替えることで
サービスの稼働を継続するというものになります。

### クラスタ構成の種類

- データの保持の方法
	- シェアード構成
		- ノードのどちらからもアクセスできる共有ディスクで使って、データを共有する
		- 昔からよく使われている
	- シェアード・ナッシング構成
		- データのレプリケーションを使ってデータを引き継ぐ構成
		- 共有ディスクが不要なので安く構築できる

- 台数による分類
	- Active/Standy
		- 1台-1台のActive/Standy構成
		- 基本的にはActiveサーバが稼働、故障時にはStandyサーバがActiceサーバになる
	- 複数のActive/1台のStandy
		- 複数台-1台のActive/Standy構成
		- 複数のActiveサーバの故障時にStandyサーバに切り替え
	- 複数のActive/複数のStandby
		- 複数台-複数台のActive/Standy構成
		- 複数のActiveサーバの故障時にStandyサーバに切り替え


### Pacemaker の機能

- アプリケーション監視・制御機能
	- よく使われてるミドルウェアを監視対象にできる
	- また、自作アプリケーションもファイルを書き換えることで使用可能
	- ミドルウェアもだが、仮想IPの制御とかファイルシステムの制御とかもできる
- ネットワーク監視・制御機能
	- ネットワークの正常性を確認して、通信できなければStandyへの切り替え
- ノード監視機能
	- ハートビート通信(お互いに一定間隔での監視)を行う
	- Activeが設定以上に稼働することがないように、ノードの電源を落とすことができる
- 自己監視機能
	- 自分すらも監視する
	- 必要に応じてプロセス再起動したりOSの再起動したりする
- ディスク監視・制御機能
	- ディスクへのアクセスなどを監視
	- 障害などでアクセスできなくなったらその際もフェイルオーバー


## 勉強後イメージ

自分を自分で見たりとか
基本的なミドルウェアの設定はエージェントとして入ってるみたいだし
実際やってみたくある・・・・

## 参考

- [Pacemakerの概要](https://linux-ha.osdn.jp/wp/manual/pacemaker_outline)
- [第1回　Pacemakerの歴史を見てみよう！](https://gihyo.jp/admin/serial/01/pacemaker/0001?page=1)
MuleSoft Anypoint Platformのサイジング

#はじめに
MuleSoft Anypoint Platformのサイジングについて、
どのような要素がサイジングに影響するのか、また、MuleSoftにサイジングをリクエストする際にどのような情報が必要となるのかを簡単にまとめました。

#Anypoint Platformとは？
この記事は、Anypoint Platform自体について記載しているわけではないので、ここでは概要だけ簡単に説明します。
Anypoint Platformは、MuleSoft（Salesforce）が提供するサービス／製品の名称であり、
機能としては大きくは、
- API管理
- インテグレーション
の２つが提供されます。

Anypoint PlatformでいうAPI（モダンAPI）は、
単にインターフェースとしてのAPI機能のほかに、
・再利用のために、検索可能とするための仕組み
・管理のために、稼働状況などの情報提供する仕組み
・セキュリティのために、ポリシーを適用する仕組み
・開発の迅速化のために、複数のAPIを利用したシステム間のデータ連携プロセスを含む（＝インテグレーション）
といったことが出来るようになっています。

Anypoint Platformは、そのAPIを活用するためのフレームワークであり、定義・開発・デプロイ・管理等の機能が提供されています。

#APIはどこで稼働する？
現在のオプションでは、

| オプション | 環境 |
|:-:|:-:|
| CloudHub  | MuleSoftの提供するクラウド  |
| Runtime Fablic(RTF)  | 顧客の提供するLinuxなどで稼働させるコンテナ  |
| Standalone  |  スタンドアローン環境 |

という３種類になり、各環境にワーカーと呼ばれる環境を立てて行くことになります。

#サイジング
Anypoint Platofrmは、単なるAPI管理製品ではなくインテグレーションも担っており、
各処理に応じたスペックが必要となります。
最終的には、実際に稼働させてみて、そのリソース使用状況等を確認したうえでの調整が必要となりますが、
計画段階で凡そ見積もることが可能となっています。

###サイジング要素
サイジングに影響を与える要素としては、以下の４つが挙げられます。

| 要素 | 説明 |
|:-:|:-:|
| ペイロードのサイズ  | ペイロードのサイズが大きくなれば、それだけ処理量が増えます  |
| スループット  |  １秒間当たりのリクエスト数が増えれば、それだけ処理量が増えます |
| 複雑さ  | どれだけ複雑な業務プロセスなのか、データのフォーマット変換が必要なのか。より複雑なAPIになれば、それだけ処理量が増えます  |
| インテグレーションの数  | より多くのインテグレーションを含むプロジェクトがあると、それだけ処理量が増えます  |

プロジェクトでは、単にプロキシーとなるAPIから、ETL的な使い方でデータ変換を行うAPI、バッチ処理、インテグレーションとして複数の業務システム（に対応するAPI）とやりとりを行うインテグレーションを含むAPI、などなど、様々なAPIが出てきますが、下記で示した要素の通り、それぞれ必要なスペックが変わってくることになります。

###サイジングの取得
サイジング用のツールは公開されていませんが、MuleSoft社にはパフォーマンス評価結果を基にしたツールがあるため、
各APIについて、下記の情報と共にサイジングをリクエストすることで、必要となるCPUコア数やワーカー数の概算を得ることが可能です。

| 情報 | 説明 | 例 |
|:-:|:-:|:-:|
|　APIの概要  | どのような処理を担うAPIなのか  |　Salesforce連携用システムAPIや、発注処理プロセスAPI等
|　連携するシステム  | 連携するシステムの詳細  |　SAP, Salesforce, MySQL等
| 導入の形態  |  CloudHub / Runtime Fablic / Standalone  ||
| データ変換・集約の複雑さ  | どれだけ複雑な処理が必要となるのか。可能であれば具体的な説明  | 3つのシステムから戻された合計100項目のデータを戻す。日付形式の変換等が必要。などなど
| インテグレーションの方式  | リアルタイム処理 / バッチ処理  ||
| 処理量  | 最大で許容できる応答時間、単位時間での処理量など。（***ピークの量を提供するようにしてください。***）  | 毎時10,000処理
| どれだけの量のデータ連携となるのか  | ペイロードサイズ、出力結果サイズ  |　100KB等
| SLA  | 応答時間を守る必要があるか。Yes or No  | |
| 冗長  | 複数ワーカーによる分散を必要とするか。Yes or No  ||

###その他の要素
MuleSoft Anypoint Platformの導入は、本番環境＋開発環境の２環境であったり、それにUAT環境が追加されたりしますので、
それぞれの環境で必要となる量についても伝えると良いです。
PhpStormでcommit tool window（コミットツールウィンドウ）が表示されない時の設定


設定で
`Version Control`>`Commit`>`Use non-modal commit interface`のチェックボックスをオンにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42885/eacd8e23-a496-d625-eef3-a1d874cd842c.png)
input type=dateの未入力時の「年/月/日」「yyyy/mm/dd」を非表示にする

　input type=dateの値が未入力のときに「年/月/日」「yyyy/mm/dd」と表示されたままになるのが見にくい、未入力のときは空欄のままにしてほしいという要望があり、いろいろ調べたけれど設定で変えることはできないようなので、強引ですがJavaScriptで文字色を変えるという方法で対処しました。

※「年/月/日」「yyyy/mm/dd」等の表記はブラウザに依存するため変更できません。これも属性値で変更出来たら楽なのになあ。

```javascript
// 初期表示時の文字色変更
$(window).on('load', function ()
	{
		$.each($('input[type=date]'), (index, datebox) =>
			{
				datebox.style.color = (datebox.value) ? 'black' : 'white';
			}
		);
	}
);

$(function ()
	{
		// フォーカス取得時は入力用にいったん色を付ける
		$('input[type=date]').focus(function (event)
			{
				this.style.color = 'black';
			}
		);

		// フォーカス喪失後の文字色変更
		$('input[type=date]').blur(function (event)
			{
				this.style.color = (this.value) ? 'black' : 'white';
			}
		);
	}
);
```

　一部だけに適応したいときは、セレクタに条件を追加してください。
　色はわかりやすいように black white と書いていますが、画面デザインに合わせてお好きなように。
　テキストボックスの色が複数ある場合は、white を transparent としておけばOKです。
[日付の表示]yyyy/mm/ddのフォーマットにしたい


備忘録。

WebアプリでTo-doリストを作成中。
アイテムを作成した日付を付与し、アイテムと一緒に表示させたい。

その際、**日付のフォーマットをyyyy/mm/ddにする** 。←本記事で書くこと
（※9以下の数字には左に0を置きたい）
↓
日時の前に「00」、後に「slice(-2)」を置くことで実現！

※Nuxtで書いているので;省略などJsの文法無視しています
※　記事作成日：　2021年06月21日（日本）


```Javascript
const d = new Date()
const fmt = d.getFullYear()

// document.write(d) 
// => Mon Jun 21 2021 11:32:57 GMT+0900 (日本標準時)

// 年の表示
document.write(fmt) // => 2021
document.write('/')

// 月の表示
document.write(d.getMonth() + 1) // => 6
document.write('/')

// 月の表示（9以下の数字で左に0を置く）
document.write(('00' + (d.getMonth() + 1)).slice(-2)) // => 06
document.write('/')

// 日にちの表示
document.write(('00' + d.getDate()).slice(-2)) //=>21
```
ゲーム開発するにあたってやることをまとめる。

前回の記事の続きから、ゲーム開発をしたいと思い、特にクラウドでの部分を勉強したいと思うので、その備忘録を書くことになりました。

必要な物　AWS

とか言いながらですが、プログラミング言語でPythonを使う為、暫くはAWSはお預けへ。

そして何をするかと言うと、最初はサンプルのゲームを開くという事で、

ページをぐぐりながら、『Pythonで簡単ゲーム開発！実物とソースコードで学習！』にたどり着き、パックマンをやるという事に。

Windows機にWSL2を入れて、端末を作り、pipなどを入れると、



$ python3 -m freegames.pacman

まで行けた。　

途中で　『とあるエンジニアのベンリなメモ』も必要になったが　なんとかパックマンのサンプル起動までは行ける事に。



続いてコードでゲームを作りたいと思っていたが、実力的に無理なので、unreal engineを使う事に。使うのはpanda3D

環境構築は 金子邦彦研究室というサイトを発見し、『Ubuntu で 3次元のゲームエンジン Panda 3d 1.10 SDK (devel 版) をインストール』で

やってみた。勿論　前準備も

しかしながらある事を考えだす。自分のやりたいことはクリエイター寄りではないので、ゲームプログラミングは中止の方向へ。
-----------------------------------------------------------------------------------------------------------------

そして情報はアップデートされて、量子コンピューターの話が出てくるまでに。

量子コンピューターでゲーム開発が出来たら面白いなと思うのであるが、意味わからない状態なので、手は出せない。

量子と言うと、amazon braketぐらいしか、知らない状態である。ちなみにタグにあるamazon braketはネタ扱いで入れているだけなので

ご注意願いたい。

------------------------------------------------------------------------------------------------------------------
話は続き、Pythonでゲーム開発をするのではなく、Go言語でゲームの開発は出来ないかと考えるようになった。

そして2021年8月13日　小説で書いていたガンダムのような宇宙人とのバトルの話をゲームで映像化できないかと考えるようになる。

------------------------------------------------------------------------------------------------------------------
8月20日　ゲームの映像化はさておき、Go言語でPaasの話は出来ないかと思うように至るのであった。

PaaSは今の所　Herokuである。

続く。

しかしながら色々と考えたあげく、辿り着いたのはオープンソース開発者というものであった。OSS開発でLibreOfficeに携わることになる。

2021年11月18日現在。
SQLでサブクエリに名前をつける

WITH句を使う。

```sql
-- 名前付け
with name as (
 --サブクエリ
 select * from XXX
 join XXXX on BBB = AAA
 where aa = cc 
)

, name2 as (
   --サブクエリ
   select * from XXX
   join XXXX on BBB = AAA
   group by 
   having count(*) >= num
)

--呼び出し
select * from name 
join name2 on xxx =xxx ;

```

複雑なクエリだと、with使うと読みやすくなりますね。
AKSのフロントエンドをFront DoorにしてIPアクセス制御する

前回の投稿で、NGINX Ingress Controllerを作成してIPアクセス制御する方法を検証しました。

インターネットから直接アクセスする場合にはこれで良いのですが、フロントエンドポイントがLoad Balancerではなく、

- Application Gateway
- Front Door

といったレイヤー7のロードバランサーや、インターネットトラフィックを制御するコンポーネントが前段としてある場合は追加の設定が必要です。その理由はこれらがHTTPヘッダーを書き変えてしまい、バックエンドで取得できる送信元IPアドレスはこれら前段にあるコンポーネントのものになり、リクエストを送信したクライアントのものではなくなってしまうためです。

## Front Door側の設定

まず、Front DoorとAKSを接続するためには以下の設定を施します。AKSのエンドポイントはLoad Balancerになっているため、これを指定します。

1. バックエンドの追加で、ホストの種類に「パブリックIPアドレス」を選択する。
2. ホスト名に、該当するIPアドレスのリソースを選択する。

この時点でIngress Controllerでアクセス制御していない場合は、Front DoorのURLで普通にアプリケーションにアクセスできることになります。ですが前回のapp1はアクセス制御しているので、Front Doorを通してアクセスすると、ホワイトリストのIPアドレスと異なるため以下のようにNGINXがエラーを返します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1647270/5f9f1308-b788-3b25-aa56-3a747e406e27.png)

## NGINX Ingress Controllerの設定

Front Doorが書き換える前のアクセス元IPアドレスは、X-Forwarded-Forヘッダーに格納されているため、この値を取得するようにIngress Controllerを構成する必要があります。NGINX Ingress Controllerの場合はConfigMapで設定を加えます。

大まかな手順は下のとおりです。

1. Ingress Controllerのリソースが使用するConfigMapを確認する。
2. ConfigMapに環境変数を追加する。

HelmでNGINX Ingress Controllerをデプロイすると、実は取得対象のConfigMapも指定されているのですが、ConfigMap自体は作成されません。したがって指定された名前で、自分でConfigMapを作成します。

### ConfigMapの指定を確認

Ingress Controllerのリソースを確認し、describeします。

```
kubectl -n ingress-basic get deployments.apps

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
nginx-ingress-ingress-nginx-controller   1/1     1            1           4d5h
```

```
kubectl -n ingress-basic describe deployments.apps nginx-ingress-ingress-nginx-controller

（中略）
  Containers:
   controller:
（中略）
    Args:
      /nginx-ingress-controller
（中略）
      --ingress-class=nginx
      --configmap=$(POD_NAMESPACE)/nginx-ingress-ingress-nginx-controller
```

一番下の `--configmap=` の部分がConfigMapの指定です。

### ConfigMapの作成

確認したnameとnamespaceで、ConfigMapを作成します。この際、X-Forwarded-Forを使用するために、use-forwarded-headers環境変数を設定します。

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-ingress-ingress-nginx-controller #前述のdescribe結果から指定
  namespace: ingress-basic #前述のdescribe結果から指定
data:
  use-forwarded-headers: "true" #Forwardedヘッダーを使用する設定
```

デプロイします。

```
kubectl apply -f configmap.yaml
```

これでIngress Controllerが元の送信元IPアドレスを見てくれるようになります。

## 動作確認

改めてFront Doorを通して、app1にホワイトリストのIPアドレスからアクセスします。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1647270/5233ac4d-0a31-1d56-03ce-f8c9f6085882.png)

無事アクセスできるようになりました！
vistaでquartus その55

#概要

vistaでquartusやってみた。
avrなcpu作ってみる。
命令の実装状況報告。

#命令の実装状況

|完了|命令コード|命令名|
|:--|:--|:--|
|o|100111rdddddrrrr|mul|
||100101001SSS1000|	bclr
||100101000SSS1000|	bset
||1001010100001001|	icall
||1001010000001001|	ijmp
||0000000000000000|	nop
||1001010100001000|	ret
||1001010100011000|	reti
||1001010110001000|	sleep
||1001010110011000|	break
|o|000111rdddddrrrr|	adc
|o|000011rdddddrrrr|	add
|o|001000rdddddrrrr|	and
||000101rdddddrrrr|	cp
||000001rdddddrrrr|	cpc
|o|001001rdddddrrrr|	eor
|o|001011rdddddrrrr|	mov
|o|001010rdddddrrrr|	or
|o|000010rdddddrrrr|	sbc
|o|000110rdddddrrrr|	sub
||001001rdddddrrrr|	clr
||000011rdddddrrrr|	lsl
||000111rdddddrrrr|	rol
||001000rdddddrrrr|	tst
||0111KKKKddddKKKK|	andi
||0111KKKKddddKKKK|	cbr
|o|1110KKKKddddKKKK|	ldi
||11101111dddd1111|	ser
||0110KKKKddddKKKK|	ori
||0110KKKKddddKKKK|	sbr
|o|0011KKKKddddKKKK|	cpi
||0100KKKKddddKKKK|	sbci
|o|0101KKKKddddKKKK|	subi
||1111110rrrrr0sss|	sbrc
||1111111rrrrr0sss|	sbrs
||1111100ddddd0sss|	bld
||1111101ddddd0sss|	bst
|o|10110PPdddddPPPP|	in
|o|10111PPrrrrrPPPP|	out
||10010110KKddKKKK|	adiw
||10010111KKddKKKK|	sbiw
||10011000pppppsss|	cbi
||10011010pppppsss|	sbi
||10011001pppppsss|	sbic
||10011011pppppsss|	sbis
||111101lllllll000|	brcc
||111100lllllll000|	brcs
|o|111100lllllll001|	breq
||111101lllllll100|	brge
||111101lllllll101|	brhc
||111100lllllll101|	brhs
||111101lllllll111|	brid
||111100lllllll111|	brie
||111100lllllll000|	brlo
||111100lllllll100|	brlt
||111100lllllll010|	brmi
|o|111101lllllll001|	brne
||111101lllllll010|	brpl
||111101lllllll000|	brsh
||111101lllllll110|	brtc
||111100lllllll110|	brts
||111101lllllll011|	brvc
||111100lllllll011|	brvs
||111101lllllllsss|	brbc
||111100lllllllsss|	brbs
||1101LLLLLLLLLLLL|	rcall
|o|1100LLLLLLLLLLLL|	rjmp
||1001010hhhhh111h|	call
||1001010hhhhh110h|	jmp
||1001010rrrrr0101|	asr
||1001010rrrrr0000|	com
||1001010rrrrr1010|	dec
|o|1001010rrrrr0011|	inc
||1001010rrrrr0110|	lsr
||1001010rrrrr0001|	neg
||1001000rrrrr1111|	pop
||1001001rrrrr1111|	push
||1001010rrrrr0111|	ror
||1001010rrrrr0010|	swap
||1001001ddddd0000|	sts
||1001000ddddd0000|	lds
||10o0oo0dddddbooo|	ldd
||100!000dddddee-+|	ld
||10o0oo1rrrrrbooo|	std
||100!001rrrrree-+|	st


以上。
新しいLinuxの教科書C2

##シェルとは
``` :例
xxx@yyynoMacBook-Pro ~ % date
2021年 6月23日 水曜日 07時57分48秒 JST
```

この時の処理内容を細分化すると、
１・dateという文字列を受け取る
２・dateというコマンドを探す
３・コマンドを実行する
４・結果を画面に表示する
となる。

この際に３はカーネルが行なっているが、ユーザーは直接カーネルと対話はできない。
そこでユーザーとカーネルの中継役として**シェル**がメッセンジャーの役割をしている。

**・ログインシェル**
ログイン時に最初に起動されるシェルのこと。
% echo $SHELLで参照できる。

```
xxx@yyynoMacBook-Pro ~ % echo $SHELL
/bin/zsh
```

##プロンプト
シェルがコマンド待ちの状態。

```
xxx@yyynoMacBook-Pro ~ %   #入力待ち
```

ユーザーが直接操作する対話型操作に対して、
実行したいコマンド群を事前にファイルに記述してまとめて実行することもできる。
このファイルのことを**シェルスクリプト**という。

##シェルを一時的に切り替える

``` :シェルをbashに切り替える
xxx@yyynoMacBook-Pro ~ % bash
xxx@yyynoMacBook-Pro ~ $
```

これは正確には多重に起動している状態である。
抜ける際はexitコマンドをシェル毎に実行する必要がある。
ambienｔでのWiFi設定

ambient が　家のWiFiから送れなかった。
その解決策
***

１．環境
WiFi・・・・・・・・・普通の家庭用
アクセスポイント・・・IOーDATA

マイコン・・・・・・・Esp-32wroom

２．症状
携帯からのテザリングからならデータは送れたが、家のWiFiから送れなかった。
***

３．解決策
Wifi.configにDNSサーバーを登録したらうまく行った。

```
IPAddress ip(192, 168, 0, 55);//静的ip使用
IPAddress gateway(192, 168, 0, 1);
IPAddress netmask(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8); 
IPAddress secondaryDNS(8, 8, 4, 4); 
```
wifi.configのコーディング(set_up()内）

```
WiFi.config(ip, gateway, netmask, primaryDNS, secondaryDNS);
```
***
これでうまく行った。

こちらのページが参考になった
[データを送受信をするIoTデバイスの作り方 [ESP-WROOM-02版]](https://www.petitmonte.com/robot/esp_wroom_02_iot.html)
docker-compose でdjangoのサーバーを起動する

<h2>サーバーの起動は主に二つの方法がある。</h2>
<ol>
<li>cmdからの起動</li>
<li>docker-compose アプリからの起動</li>
</ol>

<h3>cmdからの起動</h3>
<ol>
<li>cmdで"manage.py"のあるディレクトリに移動する。</li>
<li>"docker-compose up"をcmdから実行する。</li>
<li>起動されるので、<a>http://localhost:8000/</a>を開く。</li>
</ol>

<h3>docker-composeアプリからの起動。</h3>
<ol>
<li>アプリ内でdjangoのコンテナを探す。</li>
<li>見つけたら三角の動画の再生ボタンの様なボタンをクリック。</li>
<li>起動されるので、<a>http://localhost:8000/</a>を開く。</li>
</ol>

<h3>補足</h3>
<p>サーバー起動以外の操作（startproject等）はcmd（上記の１と同様の手順）から"docker-compose run web django-admin <etc>"によって実行できる。</p>

<h3>参考</h3>
<a href="https://docs.docker.com/samples/django/">docker-compose のdjangoのサンプル</a>
Swiftの高階関数をまとめた

# はじめに
こんにちは@kaneko77です。
今回はSwiftの高階関数についてまとめてみました。
配列の操作でよく使うのでswiftのエンジニアは絶対覚えといて損はないものだと思います。
[こちら](https://qiita.com/shtnkgm/items/eaad3c6ab368463de8e3#filter)を参考にしました。

# 目次
- map
- flatMap
- compactMap
- filter
- reduce

# 紹介
## map
配列のデータを一つ一つ引っ張る時に使います。

```swift
let test = ["マチュピチュ", "モンサンミッシェル", "サグラダファミリア", "アンコールワット"]
test.map{
    print("データ取得", $0)
}
```
```text:ログ
データ取得 マチュピチュ
データ取得 モンサンミッシェル
データ取得 サグラダファミリア
データ取得 アンコールワット
```
## flatMap
多重配列を結合する時に使います。

```swift
let array = [
    ["hoge1", "hoge2","hoge3"],
    ["huga1", "huga2"]
]
let result = array.flatMap { $0 }
print(result)
```
```text:ログ
["hoge1", "hoge2", "hoge3", "huga1", "huga2"]
```
## compactMap
配列のデータをキャストする時に使う

```swift
let array = ["1", "2", "3", "4", "5"]
let result = array.compactMap{ Int($0) }
print("Stringの配列:", array)
print("Intの配列：", result)
```
```text:ログ
Stringの配列: ["1", "2", "3", "4", "5"]
Intの配列： [1, 2, 3, 4, 5]
```
## filter
一部データを条件で絞って表示したい時に使います。

```swift
let array = [
    (title: "Test1", status: false),
    (title: "Test2", status: true),
    (title: "Test3", status: false),
    (title: "Test4", status: false),
    (title: "Test5", status: true),
    (title: "Test6", status: true)
]
let result = array.filter{ $0.status }
print(result) 
```
```text:ログ
[(title: "Test2", status: true), (title: "Test5", status: true), (title: "Test6", status: true)]
```
## reduce
現場で使うとしたらこのパターンかな..
配列のデータを足したいときに使います。

```swift
let array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let result = array.reduce(0) { $0 + $1 }
print(result) 
```
```text:ログ
55
```

# 終わりに

今回は高階関数についての簡単な紹介でした。
かなり簡単に配列の操作ができるようになって楽だなっと思いながらいつも使っています。
覚えていない方はこの記事を見てどういう時に使うのかを頭に叩き込んで常に高階関数が使えるかどうか考えながら設計するのも良いと思います。
ここまで読んでいただきありがとうございます。
macでpythonの環境を設定しなおす

##狙い
bashやbrewを中途半端にいじった結果、自分の環境がわからなくなったため、最初からやり直します。

##環境
macOS Big Sur 11.0
Xcodeをインストール・アップデート済み
brewインストール済み

##ターミナルを整える
デフォルトシェルをzshにする
https://support.apple.com/ja-jp/guide/terminal/trml113/mac

##インストールしていく
以下をターミナルに打っていきます。
``zsh
brew install pyenv
pyenv install 3.9.5
touch ~/.zshrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
source ~/.zshrc
pyenv install 3.9.5
pyenv global 3.9.5
``

##参考
https://prog-8.com/docs/python-env
https://blog.serverworks.co.jp/2021/05/12/233520
【超初心者向けネットワーク講座】～会社で働く太郎さんが知恵袋を見るまでのお話～



Aカンパニーで働く太郎さんは会社のWindowsPCを利用して仕事をしています。
このBさんが使うWindowsPCはA001という**ホスト名**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469783/dce23249-1061-326e-53fe-f1f9f72c4f88.png)

Bさんが「仕事中分からないことあったからA001でchrome使って知恵袋で皆さんのお知恵を見てみたい！」と知恵袋をクリックした時、一体何が起きるのでしょうか。
(ちなみに太郎さんはコロナ禍にありながら、在宅ではなく、毎日出社して社内で働いています。)


会社内には**LAN**というネットワークが構成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469783/958decab-1be3-ab19-3fdf-fe3322f1ca30.png)
太郎さんの社内PCであるA001もLANの力を借りています。
LAN内には多くのPCや**サーバ**、複合機が含まれますが、それぞれが**IPアドレス**を持っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469783/92026c02-9c9b-bae6-0b9e-d70cdb96b68a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469783/f6139634-903b-c3dd-6009-91cdabb84f80.png)


このIPアドレスは**プライベートIPアドレス**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469783/785119f6-084b-0a1f-acf7-8e11aae894aa.png)
LAN内で通信する時には、このIPアドレスがあれば問題ありません。
ただし、インターネットという大海原に出て、知恵袋を見に行くためにはLANの外に出なければいけません。
プライベートIPアドレスでは、インターネットの世界に出れないからです。
そこで登場するのが**グローバルIPアドレス**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469783/5da6302e-54e2-a82a-61e5-d82f46e51a7f.png)
インターネットに接続するためには、プライベートIPアドレスをグローバルIPアドレスに変換する必要があるんです。

そこで頑張ってくれるのが**デフォルトゲートウェイ**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469783/a4201330-9054-4f17-c7c2-59bd04d57719.png)
デフォルトゲートウェイはLANとインターネットの仲介をしてくれます。

こうして、グローバルIPアドレスをゲットしたA001はその後紆余曲折あって、無事に知恵袋を見ることができます。
紆余曲折の部分は長くなりそうなのでまた今度。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469783/ef6ff408-1585-8d71-5ce7-baa4fef92839.png)
知恵袋をA001が見に行くためには、知恵袋を持っているサーバに「みーせて！」と言いに行きます。すると知恵袋を持ってるサーバが「いいよー！」と言って、データを見せてくれるので知恵袋でお知恵を借りられます。


この時に、知恵袋を持っているサーバも知恵袋を見せてと言ったA001も住所を持っています。住所がないと、どこに「みーせて！」と言えばいいか分からないし、どこに「いいよー！」と言えばいいか分からないからです。
ここでいう住所がIPアドレスになるのですが、IPアドレスがもし他のPCと被っていたら、どうなるでしょう？
例えば、知恵袋を「みーせて！」と言ったA001と同じIPアドレスのPCがあったら、知恵袋を見せてくれようとしたサーバは「あれ、どっちに届ければいいんだ？？」と困ってしまいます。
だから、IPアドレスは被っちゃダメなんです。
しかし、プライベートIPアドレスは閉ざされたLANの中で被らなければokなルールです。
例えば、AカンパニーというLANでIPアドレスが192.168.1.100のPCがありました。
AカンパニーのLANの中では、同じ192.168.1.100というIPアドレスの機器は存在しません。
しかし、隣の町にあるBカンパニーが持つLANの中には192.168.1.100というIPアドレスを持つ機器が存在するかもしれません。知恵袋のデータを持つサーバはAカンパニーのLAN内にもBカンパニーのLAN内にもいないので、困ってしまいます。
「どっちのIPアドレスにデータを返せばいいんだろう…」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469783/d8d69e65-1bb7-8c75-7e93-77e1d945dc2a.png)

こうならないために、インターネットの世界と通信する時は、世界的に一意なグローバルIPアドレスを利用するんです。
主要なステータスコード

ステータスコードの詳細は [RFC 9110: HTTP Semantics](https://www.rfc-editor.org/rfc/rfc9110.html) を参照。


### 主要なステータスコード
| コード | ステータス | 説明 | メモ | メソッド |
|:-:|:-|:-|:-|:-|
|200|OK|正常応答||GET、DELETE、PATCH、PUT|
|201|Created|新しいリソースまたはオブジェクトが追加された||POST、PUT|
|202|Accepted|リクエストを受け取ったが、処理が完了していない||DELETE|
|204|No Content|処理に成功したが、応答する内容がない||PATCH、PUT、DELETE|
|303|See Other|古いリソースが使用されたときに新しいAPIの情報を返す|||POST、PUT|
|400|Bad Request|リクエストは構文不正などの理由でサーバで実行されなかった||すべて|
|401|Unauthorized|認証に失敗した||すべて|
|403|Forbbidden|要求は禁止されている||すべて|
|404|Not Found|要求されたリソースが見つからない||すべて|
|405|Method Not Allowed|サーバがURIを認識したが、メソッドが許可されていない|レスポンスヘッダーのAllowで許可されているメソッドを返す。例: `Allow: GET, POST`|すべて|
|406|Not Acceptable|サポートされていないメディアタイプ・言語・文字エンコーディング||すべて|
|409|Conflict|作成しようとしたリソースが存在する、更新しようとしたリソースがロック中||PATCH、POST、PUT|
|415|Unsupported Media Type|ボディがサポートされていないフォーマット|リクエストヘッダーのAccept、Content-Type、Content-Encodingをチェックする。|POST、PATCH、PUT|
|429|Too Many Requests|定めた時間内に送信したリクエストが多すぎる|レスポンスヘッダーのRetry-Afterで次のリクエストを受け付ける時刻または秒数を返す。|すべて|
|500|Internal Server Error|サーバエラー||すべて|


### メッセージ例
* 200
    * GET
        * (取得した情報を返す)
    * PUT
        * xxx updated
    * DELETE
        * xxx deleted
* 201
    * POST
        * （作成された一意の識別情報を返す）
        * xxx created
        * xxx added
* 303
    * （新しいAPIの情報を返す）  
* 400
    * Invalid date value (must be yyyy-MM-dd)
    * xxx cannot be null
* 401
    * Invalid client id or secret
* 404
    * xxxに該当する情報はありません。
* 405
    * Method not allowed
* 415
    * Unsupported media type
    * Error trying to find response for invalid media type
* 429
    * Quota has been exceeded
* 500
    * xxxの処理を正しく完了できませんでした。（エラー内容の詳細は提示しない） 

## 参考
- [RFC 9110: HTTP Semantics](https://www.rfc-editor.org/rfc/rfc9110.html)
- [RFC 5789 - PATCH Method for HTTP](https://datatracker.ietf.org/doc/html/rfc5789)
- [HTTPセマンティクス仕様の改訂版(RFC9110) まとめ - ASnoKaze blog](https://asnokaze.hatenablog.com/entry/2021/06/07/010727)
- [HTTP レスポンスステータスコード | MDN Web Docs](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)
今更ながらRedux Toolkitに入門してみた①

# はじめに
今更ながらですがRedux Toolkit入門編①です。
②ではRedux Toolkitの主な機能を紹介し
③ではそれらを踏まえてTodoリストの作成をします。
間違っているところがあれば指定してくれると助かります！
この記事ではTypeScriptを使って行うのでTypeScriptを軽くわかった方向けになります。
また下記で行っているテンプレートの作成は最新版で少し中身が変わっている点があるのでご了承ください。

# そもそもReduxって何?ってなる人向け
Reduxは状態を管理してくれるフレームワークです。
開発の規模が大きくなるほど開発が容易になったりすることができるので大規模な開発においてよく使われていたりします。

###Reduxの流れ
- ユーザの操作により、componentのstateが変更される
- Action Creatorによって、Actionを生成する
- そのActionをdispatchする(Storeに送信)
- ActionとstateをReducerが受け取り、storeのstateを更新する
- 最後にstoreから更新されたstateが渡ってくる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059939/1ac486f9-122f-d5e7-8201-57f94a65e138.png)


## 大まかなまとめ
### state
stateとは日本語で状態を意味しています。その名前の通り
そのComponentが持っている状態のことを示します。
### Action
アクションはUserがinputなど、何かのアクションが起きた時、Storeにどんなデータを利用するかということを定義する。その際にActionCreatorsによってActionを生成する。
### Store
Storeとはアプリケーションの全てのStateを管理してくれる場所

### Dispatch
ActionCreatorで生成されたActionを呼び出してStoreに渡してくれます。
storeにdispatchというメソッドを用意して、引数でアクションを呼び出しで使います。

### reducer
storeで受け取ったアクションを読み取り、stateを更新する必要があればstateを更新する処理を行う場所

ざっくりとした説明ですが最下部に参考文献があるのでそちらをみてさらに理解を深めるといった形がおすすめです。


# 上記を踏まえた上でRedux Toolkitとはなんぞや
簡潔にいうとReduxを簡潔に使用できるツールキットです。
Redux Toolkitは公式に作られたツールでReduxの公式サイトでも紹介するページがあります。

そこに書かれている記事を抜粋し,なぜRedux Toolkitが作成されたかというと

- 　「Redux storeの設定は複雑すぎる」
- 　「Reduxに何か便利なことをさせるには、たくさんのパッケージを追加する必要がある」
- 　「Reduxにはボイラープレートコードが多すぎる」

#実装方法

### create-react-appの場合
```ターミナル
mkdir practice
cd practice
npx create-react-app . --template redux-typescript
```
上記のテンプレートはRedux Toolkitが使われていて簡単に実装ができるのでめんどくさい設定が嫌いな方はこれでいいと思います。

### 既存のアプリケーションに導入する場合
```
npm install @reduxjs/toolkit
```
# 参考文献
参考にさせていただいたきました！！ありがとうございます！！
https://note.yuuniworks.com/study/redux-toolkit.html#%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B%E3%82%82%E3%81%AE
【LeetCode】就活に向けたコーディングテスト対策 #12

#はじめに
おはようございます．
M1就活生が[LeetCode](https://leetcode.com/)から，easy問題を中心に**Python**を用いて解いていきます．

https://leetcode.com/

↓では，解いた問題のまとめを随時更新しています．
[まとめ記事](https://qiita.com/halpi/items/43761b89a1873dcc9a5c)

https://qiita.com/halpi/items/43761b89a1873dcc9a5c

#問題
今回解いたのは，難易度easyから [問題53のMaximum Subarray](https://leetcode.com/problems/maximum-subarray/) です．
問題としては，整数配列`nums`が与えられたとき，最大の和を持つ連続した部分配列を見つけ，その和を返すというもの．

入力例と出力例は以下の通りです．

Example 1:

```python
Input: nums = [-2,1,-3,4,-1,2,1,-5,4]
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
```

Example 2:

```python
Input: nums = [1]
Output: 1
```

Example 3:

```python
Input: nums = [5,4,-1,7,8]
Output: 23
```

#書いたコード
始めに書いたコードが以下で，こちらのコードでは，Time Limit Exceededとなりました．2重で繰り返し処理を行い，整数配列`nums`の先頭から順に部分配列を求めていくものになります．こちらのコードでは，`nums`の要素数が少ない場合，少ない計算時間で済みますが，大きすぎる場合，計算処理に相当時間がかかってしまいます．そのため，効率の良い処理を書く必要があります．

```python
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        max_sum = nums[0]
        
        for i in range(len(nums)):
            for j in range(len(nums) - i):
                subarray_sum = sum(nums[i:i+j+1])
                if max_sum < subarray_sum:
                    max_sum = subarray_sum

        return max_sum
```

どうにか，繰り返し処理を1回のみ使って書き直してみます．上のコードでは，`nums`の0番目要素から計算していましたが，今回は部分配列を`nums`の0番目要素で初期化し，`nums`の1番目以降の要素（次の要素）を基準に，部分配列の和を計算しています（+`nums[i:i+j+1]`の`1`って何を防げる）．
繰り返し処理では，`nums`の1番目以降を走査していきます．今回の問題は，”現在の部分配列+次の要素”と”次の要素”を比較し，その結果が大きいほうを次の部分配列の数としていきます．6〜9行目がその処理です．これで，得られた数と，現在の最大の和を比較することで部分配列の最大の和を見つけることができます．

```python
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        subarray_sum = max_sum = nums[0]

        for num in nums[1:]:
            if num < subarray_sum + num:
                subarray_sum = subarray_sum + num
            else:
                subarray_sum = num
            if max_sum < subarray_sum:
                max_sum = subarray_sum

        return max_sum
```

#おわりに
Pythonのリスト操作では，範囲外を参照した場合，IndexErrorとなります．しかし，スライスを使った場合にはこのエラーは出ず，うまく処理してくれます．スライスの範囲指定が間違っていても気が付かない場合があるため，注意する必要がありますね．

今回書いたコードはGitHubにもあげておきます．

https://github.com/halpi17/LeetCodeStudy/blob/master/053/maximumSubarray.py

[前回](https://qiita.com/halpi/items/1f1a3c81989606c0e376)　[次回](https://qiita.com/halpi/items/132ef389e15d28f395c6)
文字列の長さで意図的に例外処理を発生させる

例外処理を使って坂道メンバーの文字数チェックをする。


```Java
//例外処理を使って坂道メンバーの文字数チェックをする。
// 新規作成 2021/6/23
// Author  乃木坂好きのITエンジニア

import java.util.Scanner;

public class Sakamichi {
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		System.out.println("好きな坂道メンバーを入力してください");
		String line = sc.nextLine();
		x(line);
		System.out.println("4文字以上のメンバーを入力しました ");

	}
	static void x(String name) throws Exception{
		int len = name.length();
		//メンバーの文字数が4字未満なら例外処理を実行する
		if(len < 4) {
			throw new Exception();
		}
		System.out.println(name);
	}
}
```
Web技術の基本まとめ Chapter2

Chapter2

* コンピュータが互いに接続して情報のやりとりをする仕組みをコンピュータネットワークという。
* ネットワーク上で情報やサービスを提供する役割を持つコンピュータをサーバー
	* サーバーから提供された情報やサービスを利用する役割を持つコンピュータをクライアントと呼ぶ。
* スマートフォンやパソコンを利用してWebサイトを閲覧する場合、インターネットプロバイダーを利用する必要がある。
* プロトコルはネットワークに接続された機器同士が通信をするときにあらかじめ決められた共通のルールや手順のこと。
* TCP/IPとはインターネットにおけるさまざまなサービスを実現するためのプロトコルの集まりのこと。
	* TCP/IPは役割ごとに4つの階層に分かれている。
 		* アプリケーション層(レイヤー4)	 
			* Webブラウザやメールソフトなどのアプリケーションごとのやりとりを想定している。(HTTP,SMTP,FTP)
 		* トランスポート層(レイヤー3)	
			* データの役割や品質保証を規定 (TCP,UDP)
 		* インターネット層(レイヤー2)	
			* ネットワーク間の通信を規定 (IP,ICMP)
 		* ネットワーク層(レイヤー1)	
			* コネクタ形状や周波数といったハードウェアに関する規定 (Wi-Fi,イーサネット)
* データの行先を管理するために利用されているのがIPアドレスという。
	* なお数字で表記されるため覚えにくく扱いづらいためドメインを使用する。
	* コンピュータ上ではドメインでは処理できないためドメインをIPアドレスに変換する必要がある。
		* 変換する仕組みをDNSという。それを提供するサーバーをDNSサーバーという。
* IPアドレスでは接続するコンピュータを指定できるが、コンピュータが提供するサービスを指定できない。それを指定するためのものがポート番号。
* HTTPは簡単なやりとりの手順や内容を決めている。
Railsのcallbackでハマったこと

* 一時的にcallbackを外したい時に、全部で3つのcallbackがあったとしてA,Bだけskip_callbackでcallbackを外して、Cだけ残し、あとから、A, Bをset_callbackで復活させた場合、 以前はA, B, Cの順で呼ばれてたのに、C, A, B に変わってしまう。以下のようにしないといけない。
  * skip A
  * skip B
  * なにか処理
  * skip C
  * set C
  * set B
  * set A
* callbackの中でself.reloadを実行すると、後続のcallbackでは、xxxx_was などのdirty attributesが取れなくなってしまう
vistaでquartus その54

#概要

vistaでquartusやってみた。
avrなcpu作ってみる。
シリアルインターフェースのテスト。

#アセンブラを書いて、rom化する。

エコーバック、inをポーリングして、０でなければ、outする。


```
rom[0] <= 16'hB100; // loop:  in  r16, 0
rom[1] <= 16'h3000; // 	cpi  r16, 0
rom[2] <= 16'hF3E9; // 	breq  loop
rom[3] <= 16'hB900; // 	out  0, r16
rom[4] <= 16'hCFFB; // 	rjmp  loop

```

#実行結果

キーを押した。abcdefghijklmnopqrstu

```
aaabbbbcccdddeeeefffgggghhhiiiijjjkkkkllllmmmmnnnnoooppppqqqqrrrrsssttttuuuu

```

以上。
LPICレベル1を勉強しているあなたへ - systemdの動作するシステムにおいてシングルユーザモードから通常の状態に戻す方法 -

・Ctrl-Dを入力する

・systemctl reboot コマンドを実行する

・systemctl default コマンドを実行する

「systemctl rescue」コマンドを使うと、
現在のランレベルをシングルユーザーモード
（systemdの rescue.target 起動に相当）
に変更することができます。

モード変更時には以下の画面表示になり、
rootユーザーのパスワードを入力するまで操作ができません。

「systemctl rescue」コマンドは
デフォルトのターゲットを変更しませんので、

「systemctl reboot」

コマンドで再起動すると、
デフォルトのターゲットで起動してきます。
LPICレベル1を勉強しているあなたへ - ランレベルとは -

ランレベルとはLinuxの動作モードのことです。

ランレベルは以下のようになっています。

0：システム停止
1：シングルユーザモード
2：マルチユーザモード(テキストログイン、NFSなし)
3：マルチユーザモード(テキストログイン)
4：未使用
5：マルチユーザモード(GUIログイン)
6：システム再起動

s/S：シングルユーザモード
SageMath 群の共役類を調べる

# 共役類

群 $G$ に関係 $～$ を以下のように定義します。

```math
a ～ b \overset{\text{def}}{\Longleftrightarrow}
\exists \ g \in G \ {\rm s.t.} a = g^{-1} b g
```

すると $～$ は同値関係となり、$G$ はいくつかの同値類に分割できます。この同値類のことを共役類といいます。同じ共役類に含まれる元のサイクルタイプは一致します。同じサイクルタイプであっても同じ共役類に含まれるとは限りません。

※サイクルタイプとは、互いに同じ文字を含まない巡回置換の積の形のことです。例えば、$(1, 2, 3)(4, 5)$ はサイクルタイプですが、$(1, 2)(2, 3)$ はサイクルタイプではありません。

# 群の作り方

- 群を新しく定義する

```
G = PermutationGroup([[(1,2,3)],[(1,2)]])
G
```

```
Permutation Group with generators [(1,2), (1,2,3)]
```

- すべての要素を表示する

```
G.list()
```

```
[(), (1,2,3), (1,3,2), (2,3), (1,2), (1,3)]
```

- 群の位数を表示する

```
G.order()
```

```
6
```

- 例

```
G = PermutationGroup([[(1,2),(3,4)],[(1,3),(2,4)]])
G.list()
```

```
[(), (1,2)(3,4), (1,3)(2,4), (1,4)(2,3)]
```

# 群の共役類を調べる

- 共役類を表示する

```
G.conjugacy_classes()
```

```
[Conjugacy class of () in Permutation Group with generators [(1,2), (1,2,3)],
 Conjugacy class of (2,3) in Permutation Group with generators [(1,2), (1,2,3)],
 Conjugacy class of (1,2,3) in Permutation Group with generators [(1,2), (1,2,3)]]
```

- 共役類の代表元を表示する

```
G.conjugacy_classes_representatives()
```

```
[(), (2,3), (1,2,3)]
```

- 共役類の要素を表示する

```
for cl in G.conjugacy_classes():
    print(cl.list())
```

```
[()]
[(2,3), (1,3), (1,2)]
[(1,2,3), (1,3,2)]
```

- 共役類の代表元とその類の要素数を表示する

```
[{'rep':conj.list()[0], 'size':len(conj.list())} for conj in G.conjugacy_classes()]
```

```
[{'rep': (), 'size': 1},
 {'rep': (2,3), 'size': 3},
 {'rep': (1,2,3), 'size': 2}]
```

- 例

4次交代群を定義し、共役類の代表元を確認します。

```
G = AlternatingGroup(4)
G.conjugacy_classes_representatives()
```

```
[(), (1,2)(3,4), (1,2,3), (1,2,4)]
```

$(1,2,3)$ という代表元をもつ共役類を見てみます。

```
G.conjugacy_classes()[2].list()
```

```
[(1,2,3), (1,4,2), (1,3,4), (2,4,3)]
```

$(1,2,4)$ という代表元をもつ共役類を見てみます。

```
G.conjugacy_classes()[3].list()
```

```
[(1,2,4), (1,4,3), (1,3,2), (2,3,4)]
```


# 参考記事

https://doc.sagemath.org/html/en/constructions/groups.html

https://doc.sagemath.org/html/en/reference/categories/sage/categories/finite_groups.html