OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonのsetterとgetterの書き方

Pythonでsetterとgetterの書き方をまとめました。

とりあえず結論から
# @propertyを使う
```python:property.py
class Person
    def __init__(self, name, age):
        self._name = name
        self._age = age
    
    @property
    def name(self):
        return self._name
    
    @name.setter
    def name(self, value):
        self._name = value
    
    @property
    def age(self):
        return self._age
    
    @age.setter
    def age(self, value):
        self._age = value
```
このClassを使うには
```python:use1.py
...
person = Person()

# nameをsetする場合
person.name = '佐藤'
person.age = 20

# nameをgetする場合
print('名前は', person.name, 'です')  # 名前は 佐藤 です
print('年齢は', person.age, '歳です') # 年齢は 20 です
```

# 余談：Javaっぽく書いてみる
```python:likeJava.py
class Person
    def __init__(self):
        self._name = name
        self._age = age

    def getName(self):
        return self.__name

    def setName(self, name):
        self.__name = name

    def getAge(self):
        return self.__age

    def setAge(self, age):
        self.__age = age
```

PythonとJavaは両方ともオブジェクト思考のプログラミング言語ですが
書き方がこうも異なってきます。

Pythonでは@propertyを使ってsetter/getterを記述し、プロパティを呼び出すと自動的にgetterが呼び出され、プロパティに値を設定するとsetterが呼び出されます。
このようにPythonではClassの関数をプロパティ名にマッピングすることができるので、getterとsetterをプロパティ名で定義する必要が無いです。

一方で、Javaはgetterとsetterを明示的に定義する必要があります。
getterはgetNameのようなネーミングで、setterはsetNameのようなネーミングが一般的です。
Javaではプロパティを定義するために、フィールドにgetterとsetterを定義することが一般的になっています。

Pythonはシンプルな書き方が重視されており、Javaは静的な型付けを重視しており、どちらも異なる思考を持っているため、今回のように書き方に違いがあると思います。

# 備考
私はjavaからエンジニアとしての人生が始まったため
レガシー(Java的な）setName(name)やgetName(id)のような書き方が染み付いています。
近年はPythonがメインとなったため、あまり気にしていませんが
昔を思い出して今回記事にしてみました。
自分と同じように昔はJava、今はPythonでコードを書いているよ！という人のホッとする1記事となれば幸いです。
slackの通知音をドラクエのレベルアップ音に変更してみた

## 概要
slackの通知音に飽きてきたので、変更してみたかった。
できれば、テンションが上がるようにしたい。

こちらの記事を参考に、slackの通知音を変更してみた。
https://qiita.com/idacchi/items/5402c9eb04597aedee07

## 通知音をドラクエのレベルアップ音に変更
ネットで検索したら、音源が落ちていたので使用。
＊個人で使う分には問題ないと思うが自己責任でお願いします

## 使用した感想
音源の問題だけど、やたら音がデカい。。。

### 初日
定時後に設定したので、設定から確認。
「すこここ！！」がドラクエのレベルアップ音に変わったのでテンション上がるw

### 1日目（年始）
設定していたことを忘れてた。
急にレベルアップしたので逆にビビる。

「あけましておめでとうございます」だけでレベルが爆上げしていく。

### 2日目
やたら音がでかいので以下のサイトで音量調整。
イヤホンしてると、レベルアップ音で鼓膜が破れそうになる。

しかも、MTG中の人にも聞こえたので恥ずかしい。。

https://mp3cut.net/ja/change-volume

### 1週間後
音を小さくしたので周りに聞かれることも少なくなった。
「レベルアップ音」が鳴るごとに何事かとビクビクしてしまう。

### 1ヶ月後
だいぶ慣れてきて、「あ、、slackかぁ」と気づくようになる。
新鮮さはだいぶ薄れてくる。

### 2ヶ月後
「すこここ」と対して変わらないwww
「レベルアップ」するためにビクビクする。

ただ、イライラとか焦りとかそういったものは、若干減った・・・？？
（現職では、そんなイライラするslack内容もないからってのもあるけれども）

焦るような内容でも、「レベルアップしてる」って気持ちが無意識に働いているのかな。


## まとめ
開発環境と言わず、仕事して楽しい環境を作ることは大事だと痛感した。
ちょっとした遊び心で生産性が上がるならどんどんと取り入れていきたい。

とりあえず、レベルアップ音に変更したことで
slack通知音が来るたびに、なんだなんだとテンション低めで読んでたのが
レベルアップしてるーと感じながら読むとでは
気持ちの入り具合がだいぶ違ってきた。

slackの精神的な負担を減らす方法として
他にもslackの、「〇〇さんが書き込み中です」みたいな通知？も消せるらしい。

結構これが、「相手の書き込み待ち」の状態を作ってしまい
若干無駄な間（待ってる）が発生することがあるので、今度はこれにチャンレンジしてみようかな

## 参考URL
https://qiita.com/idacchi/items/5402c9eb04597aedee07
小道具：丸括弧付き文字への変換

<code>(</code> と <code>)</code> の間にある文字に対応する丸括弧付き文字に変換します。

例として「 (19) 」ならば「 ⒆ 」に変換します。

<p class="codepen" data-height="230" data-default-tab="result" data-slug-hash="WNggVjK" data-user="ikiuo" style="height: 230px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ikiuo/pen/WNggVjK">
  丸括弧付文字の変換</a> by Ikiuo (<a href="https://codepen.io/ikiuo">@ikiuo</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

```html:
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>丸括弧付文字への変換</title>
  </head>
  <body>
    <script>

      const SymbolTable = {
          "1":"⑴", "2":"⑵", "3":"⑶", "4":"⑷", "5":"⑸",
          "6":"⑹", "7":"⑺", "8":"⑻", "9":"⑼", "10":"⑽",
          "11":"⑾", "12":"⑿", "13":"⒀", "14":"⒁", "15":"⒂",
          "16":"⒃", "17":"⒄", "18":"⒅", "19":"⒆", "20":"⒇",

          "A":"🄐", "B":"🄑", "C":"🄒", "D":"🄓", "E":"🄔",
          "F":"🄕", "G":"🄖", "H":"🄗", "I":"🄘", "J":"🄙",
          "K":"🄚", "L":"🄛", "M":"🄜", "N":"🄝", "O":"🄞",
          "P":"🄟", "Q":"🄠", "R":"🄡", "S":"🄢", "T":"🄣",
          "U":"🄤", "V":"🄥", "W":"🄦", "X":"🄧", "Y":"🄨",
          "Z":"🄩",

          "a":"⒜", "b":"⒝", "c":"⒞", "d":"⒟", "e":"⒠",
          "f":"⒡", "g":"⒢", "h":"⒣", "i":"⒤", "j":"⒥",
          "k":"⒦", "l":"⒧", "m":"⒨", "n":"⒩", "o":"⒪",
          "p":"⒫", "q":"⒬", "r":"⒭", "s":"⒮", "t":"⒯",
          "u":"⒰", "v":"⒱", "w":"⒲", "x":"⒳", "y":"⒴",
          "z":"⒵",

          "一":"㈠", "二":"㈡", "三":"㈢", "四":"㈣", "五":"㈤",
          "六":"㈥", "七":"㈦", "八":"㈧", "九":"㈨", "十":"㈩",
          "月":"㈪", "火":"㈫", "水":"㈬", "木":"㈭", "金":"㈮",
          "土":"㈯", "日":"㈰",
          "株":"㈱", "有":"㈲", "社":"㈳", "名":"㈴", "特":"㈵",
          "財":"㈶", "祝":"㈷", "労":"㈸", "代":"㈹", "呼":"㈺",
          "学":"㈻", "監":"㈼", "企":"㈽", "資":"㈾", "協":"㈿",
          "祭":"㉀", "休":"㉁", "自":"㉂", "至":"㉃",

          "ᄀ":"㈀", "ᄂ":"㈁", "ᄃ":"㈂", "ᄅ":"㈃", "ᄆ":"㈄",
          "ᄇ":"㈅", "ᄉ":"㈆", "ᄋ":"㈇", "ᄌ":"㈈", "ᄎ":"㈉",
          "ᄏ":"㈊", "ᄐ":"㈋", "ᄑ":"㈌", "ᄒ":"㈍",
          "가":"㈎", "나":"㈏", "다":"㈐", "라":"㈑", "마":"㈒",
          "바":"㈓", "사":"㈔", "아":"㈕", "자":"㈖", "차":"㈗",
          "카":"㈘", "타":"㈙", "파":"㈚", "하":"㈛", "주":"㈜",
          "오전":"㈝", "오후":"㈞",
      };

      function onInput(text) {
          document.getElementById('out').innerText =
              text.replace(/(\([^()]+\))/g, ((_, p) =>
                  SymbolTable[p.slice(1, p.length - 1)] ?? p));
      }

      // 要素生成は CodePen のトラブル対策.
      window.onload = function() {
          document.body.innerHTML = [
              '<table border="1">',
              '<tr><th>入力</th><td>',
              '<textarea rows="6" cols="80" oninput="onInput(this.value)"></textarea>',
              '</td></tr>',
              '<tr><th>出力</th><td id="out"></td></tr>',
              '</table>',
          ].join('');
      };

    </script>
  </body>
</html>
```
Djangoを新規案件で取り扱うことになったので概要をまとめてみます。③

初回でDjangoに必要なファイル類の作成(環境作成？)
↓
その後単純な方法で自分が記述したページを表示させることに成功
(HttpResponse("Hello！"))
などして。

んで、今疑問におもっているのはtemplateの問題。
多分htmlファイルを「テンプレート」というのだろうかなとは思うが、
PythonとHtmlとをどうやってつなげるのか？そろそろ教えてくれてもよくない？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/dc72d8ea-6485-b879-b042-12af774521fd.png)

お、いい見出し。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/63004c60-e80f-b3bf-98ed-7f13fafaeb8c.png)
上記のようにアクセスすると、
URLのパターンを判別して、適切なレスポンスを返してくれているように見える。

●URLアクセス
↓
●文字列をみて、views.py内のどのメソッドを使うかを判別している。
↓
●実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/2e03690c-77ad-1068-56da-71f90f505066.png)　
setting.pyのROOT_URLCONFに、「どこにurl情報が入っているか」が示されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/26972265-949b-943f-3faa-a9a0b0932017.png)
あとはパターンマッチング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/fe661476-eeb2-e11f-a025-a25738082cf8.png)
ちと、むずい、、
[AWS学習]EC2 まとめ

## EC2(Amazon Elastic Compute Cloud)
AWSにおける仮想サーバー（マシン）のこと
EC2インスタンスとは、「VPCのサブネット内で起動するAZサービス」を指す

### 特徴
必要な時に必要な台数だけ起動し、必要がなくなれば解放することができる
→ 負荷の増減によって台数の調整ができるので、コストの削減が可能

### 支払い方法
#### 従量課金制
起動していた時間に応じて金額を支払う
#### リザーブドインスタンス
長期利用契約でオンデマンド（従量課金制）より安く利用できる

オンデマンド：ユーザの要求があった際に、その要求に応じてサービスを提供する事

#### スポットインスタンス
入札形式

### EC2インスタンスの初回起動（作成）手順
-----
#### 1. AMI(Amazon Machine Image)の選択
##### AMI(Amazon Machine Image)
仮想マシンのイメージ

AMIには、
ルートボリュームのテンプレート（OSデータ）、
ルートボリューム以外のマッピング情報などが含まれる。

任意のタイミングで、EC2インスタンスのカスタムAMI（仮想マシンのバックアップ）も作成できる

##### ルートボリューム
EC2インスタンスのOSが格納されるボリュームのこと

-----
#### 2. インスタンスタイプの選択
EC2インスタンスの**インスタンスファミリー**と呼ばれるグループに分けられる

| インスタンスファミリー              | インスタンスタイプ | 
| ----------------------------------- | ------------------ | 
| バランス重視：汎用                  | t2.nano            | 
| CPU重視：コンピューティングの最適化 | c4.large           | 
| GPU                                 | g2.2xlarge         | 
| メモリの最適化                      | r3.large           | 
| ストレージの最適化                  | i2.xlarge          | 

t,m：インスタンスタイプの世代
その後の文字：マシンスペックの規模


##### インスタンスファミリー
マシンスペックを規定する仮想CPUやメモリ容量などの組み合わせで分けられたグループ

-----

#### 3. インスタンスの詳細設定
・EC2インスタンスを起動するVPCやサブネットの選択
・（必要に応じて）動的なグローバルIPアドレスであるPublicIpの設定
・IAMロールの割り当て
・ユーザーデータの設定
##### ユーザーデータとは？
EC2インスタンスの初回起動時に実行したい処理を設定することができる。
EC2インスタンスのIDなど設定時点で決まっていない値などは、「メタデーター」を利用する

#### 4. ストレージの設定
・EC2インスタンスに接続する「ストレージデバイス」を設定する
・デフォルトではEC2インスタンスに接続詞ているストレージデバイスはOSがインストールされている
・ストレージデバイスには２種類存在する。
##### a.EBS
EC2インスタンス初回起動後でも追加OK
様々なタイプがある。1GB~16Tibサイズのものが作成できる

##### b.インスタンスストア
EC2インスタンス初回起動後でも追加NG
タイプによって作成できるボリュームと本数が決まっている

#### 5. タグ付け
・キーと値にペアで構成
・検索、コマンドでの操作の絞り込み条件として使える

#### 6. セキュリティグループの設定
・セキュリティグループ＝ファイアウォール
・EC2インスタンスには少なくとも1つのセキュリティグループが必要
・セキュリティグループは、新規でも既存でもOK

#### 7. 設定の確認
・1~6の確認を行う

#### 8. キーペアの選択
・EC2インスタンスにログインするためにデフォルトでは、キーペアを利用する
・公開鍵はAWS上に保管される
・秘密鍵はローカルにダウンロードされる

### 参考書籍
すごくわかりやすく勉強になります！

[合格対策 AWS認定ソリューションアーキテクト －アソシエイト](https://amzn.to/3XeEAjW)
Partner Center API の簡単な使い方

# はじめに
3月は本業の方が忙しくブログに割ける時間があまり取れないため、軽めな内容にします。そして、今回はかなりニッチな領域なので多くの方は興味がないかと思いますが、自身の備忘も兼ねてPartner Center APIについて書き残します。

# Partner Center API とは
このAPIはCSP（Azureの契約形態の一つ）でAzureを提供するCSPベンダー（Azure提供者）側が扱うAPIです。
※この記事に興味を持たれる方はおそらく同業他社ですね(笑)

https://azure.microsoft.com/ja-jp/offers/ms-azr-0145p/

## 何ができる？
CSPはCSPベンダーがMicrosftクラウドソリューション（Azure、M365、Dynamics365等）をユーザへリセールするしくみです。CSPベンダーは、Microsoft社に代わり顧客アカウント管理や注文、課金請求を行うことができます。通常こうした操作は『パートナーセンター』という専用ポータル上で行うことができますが、それらの操作をAPIで提供してくれるのが _**Partner Center API**_ です。

Partner Center API には、C#（.NET）版、Java版、PowerShell版といった3種類のSDKが提供されています。注意点として、Java版とPowerShell版はオープンソースなのでMicrosoft社のサポートはありません。しかし、2018年頃から継続的にバージョンアップされていますので一定の信頼があり、突然開発終了ということは無いと思います。（保証はできませんが。。）

また、CSPには『Directプロバイダ』と『InDirect（間接）プロバイダ』の二種類ありますが、このAPIは『Directプロバイダ』向けに作られているものになりますので、『InDirect（間接）プロバイダ』の場合は利用できません。

## 使い方
ここからは、PowerShell版の導入について説明します。インストール方法は一般的なPowerShellモジュールのインストールと同じく、Install-Moduleコマンドを実行するだけです。

```Powershell
Install-Module -Name PartnerCenter
```

インストールが終ったら、パートナーセンターにログオンしてみましょう。

```Powershell
Connect-PatnerCenter
```
ブラウザが起動しますので、CSP管理用アカウント/パスワード入力、そしてMFA（設定していれば）の承認が完了すれば、サインインが完了します。

### （注意！）開発時は統合サンドボックスアカウントを使う
このAPIは、誤って実行するとユーザが意図しない注文や請求を発生させてしまうという少々危険なAPIです。そのため、開発時には『統合サンドボックスアカウント』というテストアカウントを使い統合サンドボックスの中でテストを行うことができます。このアカウントを使って発生させた注文や請求は記録に残るものの実際に注文や請求が発生することはありません。

https://learn.microsoft.com/ja-jp/partner-center/developer/test-and-debug

## 利用シナリオ
このAPIを使えば、CSPに関連する様々な操作が行えますので、独自のCRMシステムを開発し、顧客管理・請求管理といった操作をより使いやすくカスタマイズすることもできますし、顧客の利用状況を可視化・分析するツールに適用することも可能です。こういった様々なシナリオに対してどのようなAPIを使えばよいかをまとめたサイトがありますのでご参考ください。

https://learn.microsoft.com/ja-jp/partner-center/developer/scenarios

https://learn.microsoft.com/ja-jp/partner-center/developer/partner-center-rest-api-reference

## 私流の使い方
私はこのAPIをがっつり使って顧客管理や注文・請求を行うようなことはしていません。ただ、利用状況の可視化には便利だと思います。Get系の関数であればユーザに迷惑をかけるような事故を起こすことはありませんので、そういったAPIはよく使います。

例えば、ある月の顧客全体のAzureリソース利用状況（利用料）を見たい場合は、まず下記のコマンドで過去分の請求情報が取得できますので、対象の請求番号を取得します。
```PowerShell
Get-PartnerInvoice
```
そして、以下のコマンドに対象の請求番号をセットして実行するだけです。（以下の例ではCSVに出力するようにしています。）
```Powershell
Get-PartnerInvoiceLineItem -BillingProvider <BillingProvider> -CurrencyCode USD -InvoiceId <請求番号> -LineItemType BillingLineItems | Export-Csv -Path <保存パス> -Encoding Default
```
BillingProviderについても「Get-PartnerInvoice」から請求番号と共に取得できますので、それをセットしましょう。詳しくは下記リファレンスを参照してください。

https://learn.microsoft.com/en-us/powershell/module/partnercenter/get-partnerinvoicelineitem?view=partnercenterps-3.0

出力したCSVをデータソースとして、ExcelやPowerBIに食わせることで簡単にレポートに作成ができます。以下の例ではPowerBIを使って簡単な利用状況を可視化しています。（顧客情報を含むので大部分マスクさせてください。）一度レポートを作ってしまえば、以降は別の月の請求番号を食わせてやれば、その月のレポートが同じように作成できますので便利ですね。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/ac9db974-03db-4299-3a6b-26837d8314d6.png)

# おわりに
今回はPartner Center APIの簡単な使い方について紹介しました。普段あまり目にしないユーザの利用状況を改めて可視化し、そこから何かの気付きを得て、それが新たなビジネスチャンスになればいいと思っています！それではまた！
【MacOS】Microsoft Teamsアプリで通話のショートカット(Command+Shift+C)を無効化する

# まえがき
「Teamsアプリのチャットルームで、部長から緊急の修正依頼が…」
「作業するか〜…」

「メインモニタにブラウザとエディタを用意して…」
「Teamsアプリはサブモニタに…」

![teams.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116793/7ddeee1e-4e7d-2102-7738-ee36daa41735.png)


「さてブラウザの要素検証をば…」
「ショートカットは… `Command+Shift+C` だな…」

ポンポン♪ポンパパっポンポン♪♪ポンポン♪ポンパパっポンポン♪♪

＿人人人人人人人＿
＞　突然の通話　＜
￣Y^Y^Y^Y^Y^Y￣

「あわわ…」
「お偉いさんも沢山いるチャットルームに、あたかも緊急かのように通話をかけてしまった…」

# 概要
まえがきのような事故を起こしてしまった事がある方もいらっしゃるのではないでしょうか…
私はあります！

Teamsのchatアプリでは、 `Command+Shift+C` のショートカットで、現在アクティブなチャットルームに通話をしてしまいます。
ブラウザの「要素の検証」ツールを開くショートカットと同じなので、

 > 要素検証をしようと思ったらアクティブになっているアプリがTeamsで、誤って通話をかけてしまった

ということが起きます。

しかし残念ながら、Teamsアプリの機能ではショートカットの変更・無効化ができません。
ですがMacOSにおいては、以下の方法で無効化が可能です。

そう、karabinerならね。

## 1. Karabiner-Elementsのインストール
[Karabiner-Elements](https://karabiner-elements.pqrs.org/) からインストーラーをダウンロードし、端末にインストールします。

## 2. 設定ファイルを設置
設定ファイルのjsonを `.config/karabiner/assets/complex_modifications/` 配下に設置します。

```json:.config/karabiner/assets/complex_modifications/disable-call-shortcuts.json
{
  "title": "Disable call shortcuts",
  "rules": [{
      "description": "Disable call shortcuts in Teams apps.",
      "manipulators": [{
        "type": "basic",
        "from": {
          "key_code": "c",
          "modifiers": {
            "mandatory": ["command", "shift"]
          }
        },
        "to": [{
          "key_code": "escape"
        }],
        "conditions": [{
          "type": "frontmost_application_if",
          "bundle_identifiers": [
            "^com\\.microsoft\\.teams$"
          ]
        }]
      }]
    }]
}
```

`無効化` と言っていますが、実際は設定ファイルの通り `escapeキー` に置き換えています。
置き換えるキーを変更する場合は適宜調整ください。

## 3. 設定を有効化
Karabiner-Elementsのアプリを開き `Complex Modifications` の項目から `Add rule` をクリックし、追加した設定を `Enable化` してください。

![karabiner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116793/84673270-9956-28f3-d1c3-3f58cbb55bca.png)
paiza.ioでelixir その214

# 概要
paiza.ioでelixirやってみた。
練習問題、やってみた。

# 練習問題
udp serverを書け。

# 方針
- GenServer使う。
- ポートは、49152番

# サンプルコード

```

defmodule Server do
	use GenServer
	@port1 49152
	@port2 49153
	def start do
		GenServer.start(__MODULE__, %{socket: nil})
	end
	def init(state) do
		{:ok, socket} = :gen_udp.open(@port1, [:binary, active: true])
		IO.puts "ok0"
		{:ok, %{state | socket: socket}}
	end
	def handle_info({:udp, socket, data}, state) do
		IO.puts "ok1"
		:ok = :gen_udp.send(socket, data)
		{:noreply, state}
	end
	def handle_info({:udp_closed, _}, state) do
	    IO.puts "close"
	    {:stop, :normal, state}
	end
	def handle_info({:udp_error, _}, state) do
		IO.puts "err"
	    {:stop, :normal, state}
    end
	def handle_info({:udp, socket, host, port, _} = data, server_socket) do
		IO.puts "ok2"
		:gen_udp.send(socket, host, port, "#{inspect(data)}>\n")
		{:noreply, server_socket}
	end
end

Server.start
{:ok, socket} = :gen_udp.open(49153, [:binary, active: false])
|> IO.inspect
IO.puts "ok10"
:ok = :gen_udp.send(socket, '127.0.0.1', 49152, "hello")
|> IO.inspect
IO.puts "ok20"
:gen_udp.recv(socket, 0)
|> IO.inspect
IO.puts "ok30"






```

# 実行結果

```
ok0
{:ok, #Port<0.6>}
ok10
:ok
ok2
ok20
{:ok,
 {{127, 0, 0, 1}, 49152,
  "{:udp, #Port<0.5>, {127, 0, 0, 1}, 49153, \"hello\"}>\n"}}
ok30
```

# 成果物

https://paiza.io/projects/HST8JYfpVYSyOpcjbRUEbA


以上。
Macでデフォルトのシェルを変更する場合の備忘録

先日、Macでデフォルトシェルを変更する設定を久方振りにやったところ、やり方を忘れてしまっていて困ってしまったので、ネットを調べた所、新旧判断の付かない情報で溢れていて困ってしまったので、備忘録として残しておくことにしました。

:warning: この備忘録では、Bashを例にしていますが、Zshでも方法は同じです。筆者は過去のMacから引き継いだスクリプトファイルの互換性維持やLinux環境との共通化のためにBashを利用しています。

# 現状のバージョンを確認
MacデフォルトのBashのバージョンは2023/3現在以下の通りです。

```bash
$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (arm64-apple-darwin21)
Copyright (C) 2007 Free Software Foundation, Inc.
```

# 最新版をインストール
Bash version 4.x以前のバージョンでは最新のbash-completion@2を利用出来ません。よって、Homebrewでインストールします。

```bash
brew install bash
```

## バージョンの確認
以下の通り、version 5.2.15がインストールされました。

```bash
$ /opt/homebrew/bin/bash --version
GNU bash, バージョン 5.2.15(1)-release (aarch64-apple-darwin21.6.0)
Copyright (C) 2022 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```

# デフォルトシェルの変更
デフォルトシェルを変更します。その前に、`/etc/shells`にインストールした最新版のBashのPathを追加します。Pathがこのファイル内に登録されていないシェルはデフォルトシェルとして設定出来ません[^env]。

[^env]: chshを実行時に環境変数SHELLに登録されません。つまり変更出来ません。

```bash
sudo echo "/opt/homebrew/bin/bash" >> /etc/shell"
```

Pathの追加後、以下のコマンドを実行します。

```bash
sudo chsh -s /opt/homebrew/bin/bash
```

変更出来たか確認します。`chsh`実行時に指定したシェルのパスが返ってくれば設定成功です。

```bash
$ echo $SHELL
/opt/homebrew/bin/bash
```

# Bash Completionの最新版をインストール
Bash Completionにはbash-completionとbash-completion@2が有ります。既にbash-completionを利用している場合は、アンインストールします。

```bash
brew uninstall bash-completion
```

以下を実行し、最新版をインストールします。

```bash
brew install bash-completion@2
```

インストールに成功していると、以下の様に確認出来ました。

```bash
$ brew list | grep bash-completion
bash-completion@2
```

# Reference

https://blog-and-destroy.com/34392
Javadocについて

＜書き方のポイント＞
 ・全てのフィールドにjavadocを記述する

・クラスやメソッドには複数行で記述

・エンティティやレスポンスクラスのgetterやsetterには一行で記述する /** */

・メソッドの中にコメントを書く場合は//で記述する

・オーバーライドしたメソッドには基本的にはjavadocを記述せずにインターフェースに記述する
Djangoを新規案件で取り扱うことになったので概要をまとめてみます。②

前回最小限のWebアプリを作成できました。
今回はチュートリアルその２

SQLiteを使ってのDB操作らしい。
その他の設定はこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/3781c274-c6f9-075f-9e8c-8c4d58f8a38e.png)

# DBの前にsetting.pyの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/579ad7cc-9d20-1077-c49a-f86264d9ff4e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/e2956a6f-16d3-3369-0f4a-48acc2d59da2.png)

とりあえず「INSTALLED_APPS」の中はこんな感じなので、
慣れたら読み解いてみよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/09e159e7-c8d3-ef5f-dafe-2ce665e1712c.png)
ん？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/626beb93-2b4f-4aa5-463c-50d9736525df.png)

migrateを実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/a324674c-7ee3-946d-c862-91663c42ab76.png)
とりあえずDBを作成するのに必要な操作ってことかな？

```polls/models.py
from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
```
models.pyに上記のように記述し、モデルクラスを作成。
この辺りはpeeweeと書き方似ている。
他にもORM毎とか書き方あるのかな？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/c9a9c382-f263-4871-0c19-6ba9112d4e37.png)

外部キー。大事ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/50308773-c860-3d62-5c41-0d01690870af.png)
多分赤線部分が大切な気がする。意味はよく分かっていない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/77c5370e-5f74-d5d8-759f-5dbb2063bede.png)

デフォルトではORMみたいな機能は有していないのか？
ひとつひとつ使用するのにわざわざINSTALLED_APPSに書き込まないといけない？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/17648d4b-d3f9-ce1f-a518-298f4038987d.png)

ん？むずい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/8f52afd0-a515-aaa8-299e-d1bbd9a8200e.png)

とりあえず、上記3点は覚えとけって話。

ちょっとまだDjangoでDBを操作するには難しそう、、一旦先に進む。。。
TypeScriptでPromiseを使っての同期処理を実行

# はじめに
タイトルの通り。
細かい動作(特にrejectとか)がなんとなくわかっていなかったため、サンプルを交えた書き起こし記事。

# 確認環境
こちらを参照

https://qiita.com/naozo-se/items/0b1f7b0a32d27deec052

# サンプルコード
```typescript
// promiseのテスト使用関数
const promiseTest = (param: number) => {
    return new Promise((resolve, reject) => {
        // 剰余演算で分岐
        if (param % 2 === 0) {
            // 呼び出し側で正常の処理となる
            resolve(0);
        } else {
            // 呼び出し側では、catchでの処理となる
            reject(1);
        }
    })
}

// メイン関数
const main = async () => {
    try {
        // promiseのテスト使用関数呼び出し
        const retcode = await promiseTest(2);
        // resolveで終わった場合はきちんとリターンに入ってくる
        console.log("retcode=", retcode)
    } catch (err) {
        // rejectで終わった場合はcatchの方に入る
        console.log("err=", err)
    }
}

// メイン実行
main();
```

# 少し応用
以前、記事として起こしたsocket通信

https://qiita.com/naozo-se/items/60bda485058ecb3d6cde

のプログラムに適用

```typescript
import * as net from "net";

// ネットワーク設定（事前にコンテナ同士のネットワークグループ設定は必要）
const HOST: string = "python-socket_app_1";
const PORT: number = 50000;
// 送信内容
const SEND_DATA = "send message";

const sendSocekt = () => {
  return new Promise((resolve, reject) => {
    // インスタンス生成
    const client = new net.Socket();

    // 接続処理
    client.connect(PORT, HOST, () => {
      console.log("connected: " + HOST + ":" + PORT);
      // メッセージ送信
      client.write(SEND_DATA);
    });
    // 相手から通信が帰ってきたとき
    client.on("data", (data: Buffer) => {
      console.log("Recieve Data: " + data);
      // 接続破棄
      client.destroy();
    });
    // 破棄したときの処理
    client.on("close", () => {
      console.log("Connection closed");
      resolve(0);
    });
    // エラー処理
    client.on("error", (err: Error) => {
      console.log("Error:", err);
      reject(1);
    });
  }
  )
}


// メイン実行
const main = async () => {
  try{
    // 通常時
    const retcode = await sendSocekt();
    console.log("retcode=", retcode)
  }catch(err){
    // エラー時
    console.log("err=", err)
  } 
}

// メイン実行
main();
```
※resolveだけつかって0 or 1 返した方が内容的にはシンプル化もしれませんが、、


# 最後に
いざ使ってみると、自身がわかっていないことはなるべく記事にしていこう、、
【Tailwind】Tailwindとは/テンプレ

# Tailwindとは

TailwindはユーティリティーファーストのCSSフレームワーク。HTMLのclass名にコードを入力することでデザインを変えられる。

# メリット

・レスポンシブ対応が容易
・CSSファイルが増えない
・HTMLに対して直接スタイリングを行うため、崩れにくい
・class名を考えなくて良い


# Tailblocks

Tailblocks ( Taiilwindテンプレート集 )

https://tailblocks.cc/
ネットワークとインフラ・システムエンジニアとの違い

# システムエンジニア(SE)とは
クライアントとのヒアリングし、システム設計を行う。プログラマーによって開発されたシステムをクライアントに納品し、アフターフォローまでを担当する。企画・提案から開発、ソフトウェアの基盤を作りあげる。1人で仕事を行うこともあれば、ネットワークエンジニアや他のシステムエンジニアを束ねて行うこともある。ネットワークエンジニアに必要な能力 + プログラミング用語の知識、ヒアリング力が必要。コスト意識な問題を想定する分析力も必要。チームでの仕事の場合はマネジメント力も必要。

企画・設計、運用を担う。

# ネットワークエンジニア(NE)とは
コンピュータとコンピュータを繋ぐ環境設計を導入し、トラブルが起きないように監視。トラブル発生時は、迅速な回復作業が必要。一から構築しないので未経験者も多い。担当するネットワークの情報や、組み込まれているサービスの機器の知識が必要。トラブル対応の側面からコールセンターを任されることもある。設計担当者やシステムエンジニアが作成した設計書を元に構築、動作確認。発注先に出向き、チームで仕事。

ネットワークの設計を提案する人。構築と保守をする人。監視と運用をする人に分かれる。

# インフラエンジニアとは


システムインフラであるOS、サーバ、ネットワーク、ミドルウェア、セキュリティなどを担当するエンジニア。範囲が広いのでサーバエンジニアやネットワークエンジニアなど担当が分かれることが多い。クライアントとのヒアリングをもとに要件定義を行った後、システム設計を行う。その後、クライアント企業でハードウェアの搬入や組み立て、ソフトウェアのインストール、ユーザー環境の構築を行う。要件定義にシステムが動くかチェックした後、動作・負荷テストを得て問題がなければ導入完了。ハードウェア担当。通信LAN、ネットワーク、サーバー、PC、プリンタなど。ネットワークエンジニアやシステムエンジニアはインフラエンジニアの一部。

システム導入後もトラブル対応を行う。

設計、構築、保守、運用までを仕事とする。
PCセットアップを行うこともあり、ネットワークも内包してハードウェア全般を担う。

# ネットワークエンジニアとシステムエンジニアの違い

業務の対象がネットワークシステムか、コンピュータシステムか。

ネットワークエンジニア→コンピュータのネットワークシステム(情報通信)を構築・運用。サーバとPCを繋ぐネット回線を構築し、トラブルが起きないよう監視。用意された仕様書や設計内容に応じて、必要な機器やサービスを準備、構築。

システムエンジニア→コンピュータ内のシステム開発や設計。クライアントへのヒアリング、ネットワークの仕様書作成、チーム統括や管理など、運用全般の管理・統括。上流工程。

ネットワークエンジニア→インフラエンジニアとキャリア形成するのも多い。

# ネットワークエンジニアの仕事の流れ

コンピュータネットワーク(独立したコンピュータ群をケーブルや無線でつなぎ、情報を受発信できるようにする。)

上流
プレゼンに出向くことも多い。社内のMTGにも積極的に参加。
設計・構築

下流
現場作業、クライアントに出向く。
監視業務は3交代。夜勤あり。休日もシフト制で3日勤務して1日休みという職場もある。
保守・運用

資格
シスコ認定ネットワークアソシエイト(CCNA/CCNP/CCIE)

年収 正社員400 ~ 600
派遣 300 ~ 500
キャリアを積み資格取得 700~1000

# 将来性

クラウド化
５G
ビックデータ
IoT
AIの普及
セキュリティリスク増大
SpringBoot @CrossOriginの引数をapplication.propertiesから参照する

# 概要
各コントローラークラスに付与される@CrossOriginの引数(URL)を一元的に管理するために、apllication.propertiesから参照するように設定します。

本番環境とローカル環境の切り替えを簡単に行うための改善です。

# コード
```diff_java:〇〇Controller
@RestController
-@CrossOrigin(origins =  "http://127.0.0.1:3000")
+@CrossOrigin(origins =  "${frontend.URL}")
public class ProductRestController {

}
```


```diff_properties:application.properties

+ frontend.URL = http://127.0.0.1:3000
```



# 参考
https://spring.io/guides/gs/rest-service-cors/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/3a79a395-2655-bc30-286c-55b6e7de08ef.png)


https://stackoverflow.com/questions/47574480/use-spring-properties-in-java-with-crossorigin-annotation-or-in-spring-config-xm

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/e50ac8ad-231d-91ac-1094-b7f1df3bae74.png)
StableDiffusionでリアルな人物画像を生成するための呪文（プロンプト）ヒント集

# いい感じの画像を生成するコツ
![00174-3681567079.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/f7e2f6b1-992d-c140-8b03-f5d14515b78d.png)

![00231-2687191668.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3efc21c8-086b-8e23-1deb-8cdd39b1ee6a.png) 

話題の画像生成AI StableDiffusionですが、よくSNSで見るような高画質高品質リアリスティックな人物画像を生成するにはそれなりのコツがあります。
この記事では、どのような単語を使えば高品質な画像を生成できるか、例を紹介します。

StableDiffusionを使ってみるにはWebUIが便利です。以下のリンクから使い方がわかります。

https://qiita.com/john-rocky/items/1b6dd780d38c63bb64cd

https://github.com/AUTOMATIC1111/stable-diffusion-webui


# ただ欲しい画像のテキストを入れるだけではだめ

例えば、女の子の画像が欲しいとします。
ただ"girl"と入力すると以下のような画像が出てきます。
悪くはないですが少しCGっぽいですよね、もう少し写真っぽい画像が欲しいです。

```
girl
```

![00000-3634538953.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e9eb955a-4732-90a7-6306-234133b9a4da.png)

# 高画質を連想させる単語を入れる

さて、ここで以下のように "best quality" や "high resolusion" など高画質を連想させる単語を嫌というほど入れます。
ちょっとびっくりするかもしれませんが、
**カンマで区切ってこのようにたくさんの単語を入れるのが、まずは一つのコツです。**

```
girl,RAW photo, best quality,realistic, photo-realistic, best quality ,masterpiece,an extremely delicate and beautiful, extremely detailed,2k wallpaper, Amazing, finely detail, 8k wallpaper,huge filesize , ultra-detailed, highres, extremely detailed,realistic, 8K, Ultra-High Definition, highest quality, ultra high resolution, (realistic:1.4), High quality texture, 
```

![00023-3210512467.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7c568af0-fa2e-accd-7140-775bca42b54b.png)

すると、上のようにくっきりしてリアルな画像が生成されます。
でもまだ少し絵のように見えます。

# ネガティブ単語を入れる
画像に含みたくない単語を入れます。
今回は**絵のような感じを消して写真に近づけたいので、絵を連想させる単語をネガティブプロンプトに入れます。**

```:negative
EasyNegative, paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), 
```

![00000-1666167661.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/dce20f6c-bbfe-e775-8c2b-79880ee6b241.png)

これでかなり写真に近づきます。このネガティブ・プロンプトがかなり重要です。

# 細部のディティールにこだわった単語を入れる

```
(extremely detailed eyes and face)
```

![00055-3523687065.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d16ebc49-3723-973a-938e-f9ffc0d31146.png)

# ネガティブ単語に低品質を入れる。

高品質の逆の意味を表す単語をネガティブに入れてダメ押しをします。

```:negative
worst quality, low quality, normal quality, jpegartifacts, signature, watermark, blurry, cropped, poorly draw, poorly draw, worst quality, low quality, lowres,
```

![00081-2242242665.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3d926e28-6378-ecfa-0f8a-f4c74fc76548.png)

# 単語に重みをつける

以下のような形にすると強調したい単語に重みをつけられます。

```
(detailed clothes:1.2)
```


🐣
****
フリーランスエンジニアです。
AIや画像生成の記事色々書いているのでプロフィール見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
RailsのBundlerの書き方

## 自動的に最新バージョンのgemを取得する場合
```
gem "sprockets-rails"
```

## gemのバージョンを指定する場合
gemのバージョンを指定する方法は2種類ある。
### 1. 最新のgemを探してインストール
```
gem "capybara", ">= 3.26"
```
3.26と同じかそれより上のバージョンがインストールされる。

### 2. マイナーバージョンのみバージョンアップ
```
gem "puma", "~> 5.0"
```
バージョンが5.0以上のpumaがインストールされるが、6以上(メジャーアップデート)はインストールされない。
Radeonでも画像生成AIを使いたい

# はじめに
最近話題なStable Diffusionを自分も使いたいと思っていたのですが、未だに **Radeon Rx570（4GB）** を使用しているためCUDAコアが使用できないという状態になっていました...。
「CPUで実行しても時間が掛かるしな...」と思いつつCPUで生成していたところ、**Direct Machine Learning (DirectML)** というAMDとMicrosoftが協力して開発した機械学習向けの低レベルAPIというものがあるらしく、これを使用したStable Diffusion WebUIがあることが分かった。
そこで今回は、それを導入する方法と結果などを紹介していきます。

# 実行環境
- CPU : Ryzen7 3700x (8c16t)
- RAM : DDR4-3200 16GB
- GPU : Radeon RX570 4GB
- Python : 3.10.6
- Windows 11 22H2

# 導入
## Stable Diffusionのインストール
Python（3.10.6）やGitは既にインストールされているものとして進めます。

任意の場所にフォルダを作成し、Gitで必要なファイルをダウンロードします。
```shell
$ git clone https://github.com/lshqqytiger/stable-diffusion-webui-directml
```
以下のコマンドを実行します。
```shell
$ cd stable-diffusion-webui-directml
$ git submodule init
$ git submodule update
```

## Modelのダウンロード
[Hugging Face](https://huggingface.co/models?pipeline_tag=text-to-image&sort=downloads)から任意のモデルをダウンロードします。
例えば[runwayml/stable-diffusion-v1-5](https://huggingface.co/runwayml/stable-diffusion-v1-5/tree/main)をダウンロードする場合、Files and versionsからv1-5-pruned.ckptをダウンロードし、./stable-diffusion-webui-directml/model/に配置して下さい。

## 起動
./stable-diffusion-webui-directmlにある**webui-user.bat**をダブルクリックで起動すると足りないパッケージやモジュールのインストールがされ、**http://127.0.0.1:7860/** こちらにアクセスすると画像を生成するWebが立ち上がります。
あとは任意のプロンプトで生成して下さい。

# runtimeerror: could not allocate tensor with ~~ bytes. there is not enough gpu video memory available!
上記のエラーは、グラボのメモリが画像の生成に足りないときに発生します。私の場合4GBしかないためこのエラーが発生しました。
対処法として、webui-user.batの設定を次のように変更することで解決します。

```:webui-user.bat
@echo off

set PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS=--lowvram --always-batch-cond-uncond --opt-split-attention

call webui.bat
```
メモリの使用をなるべく使用しないように設定になります。これで512x512の生成が可能になりました。

# 結果
で、Radeonでも生成が出来るようになってどうなったのか？


**ぶっちゃけあまり早いとは言えない...**


まあ使っているグラボの性能を考えると当たり前ですがね

### 結論
#### もっと良いグラボかGoogle Colabを使おう

# 参考
https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Install-and-Run-on-AMD-GPUs
OpenAIは、ChatGPTが「見る」ことを可能にする新言語モデルGPT-4を公開

この記事は、[fastcompany](https://www.fastcompany.com/90865107/openai-gpt-4-language-model-chatgpt)の翻訳です。
![QQ20230321104022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298092/1b9face9-3074-046c-dabe-3e82e0687ea0.png)

OpenAIは、数ヶ月にわたる改良と安全性テストを経て、これまでで最大かつ最も包括的なAIモデルである**GPT-4**をゴールデンタイムに使用できるものと判断しました。サンフランシスコに拠点を置くスタートアップは、火曜日に研究ブログでGPT-4を発表しました。

GPT-4は、OpenAIが最近導入した大規模言語モデルGPT-3.5の機能を拡張したもので、人気のチャットボットChatGPTを支えています。**GPT-4は**、**マルチモーダル**、**つまり「見る」ことができ**、**初めて画像とテキストの両方を入力として受け付けます**。(画像入力は、OpenAIが安全性を確認するため、現在リサーチプレビュー中です）。また、出力としてテキストを生成します。

GPT-4の画像からテキストへの変換機能は、例えば、クローゼットの写真を撮って、旅行に行くときのパッキングリストを生成してもらうような使い方が考えられます。また、冷蔵庫にある食材の写真から、夕食のレシピを生成することも可能です。

ChatGPTのカジュアルユーザーにとって、今のところテキスト入力に頼っているため、GPT-4のアップグレードは気づかれないかもしれません。しかし、推論のテストでは、GPT-4は前作を大きく上回っています。例えば、GPT-3.5では一律の司法試験に合格するのがやっとでしたが、GPT-4では90％台のスコアを記録しているそうです。また、LSAT、SAT、GREの3つの試験でも、GPT-4は同程度の成績を収めています。(ただし、AP Englishは落第です）。

AIシステムはこれまで、常識や物理的な世界の知識を必要とする推論に苦労してきました。

OpenAIのリサーチサイエンティストであるNick Ryderは、「GPT-4が輝くのは、3.5でできることの境界線上にあったことをするときでしょう」と言います。「企業や消費者のタスクを可能にするためには、一貫性が非常に重要です。」

GPT-4は、特に批評家の反感を買っている部分については、不完全な技術であることに変わりはありません。OpenAIによると、GPT-4はプロンプトに正直に答える確率が40%向上しています。これは改善されたとはいえ、漸進的なものです。

また、GPT-4の安全性能を人間の価値観に合わせることで、OpenAIのポリシーに反するコンテンツを提供する可能性が82％低くなったとしています。

OpenAI社のCEOであるSam Altman氏は、同社の批判を予期していたかのように、TwitterでGPT-4を「まだ欠陥があり、まだ限界がある」と表現しています。

しかし、安全性を重視する研究者にとって、GPT-4は現在、新たな安全性への配慮を必要とするほどの性能を発揮しています。OpenAIの政策研究者であるSandhini Agarwalは、「このモデルは、特定のタスクで80％の確率で正しいので、おそらく正しいのだろう」と言うかもしれません。彼女は、OpenAIのシステムがユーザーの期待の変化に対応できるようにするための方法を模索しています。

![QQ20230321104053.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298092/cb82e81f-6d23-82be-c03e-c5b51344966f.png)

AI戦争が本格化する中、GPT-4が登場しました。先週初め、GoogleはGmailを含むWorkspaceソフトウェアに、より多くのAIツールを組み込むと発表しました。アマゾンは、オープンソースモデルのハブであるAIプラットフォーム「Hugging Face」と提携します。そして、スタートアップは投資を集め続けています。例えば、AIベースのストーリーテリングのスタートアップであるTomeは、2月にシリーズB資金として4300万ドルを調達しました。[AI描画ツール](https://vanceai.com/ja/image-generator/)に用いたモデルへの訓練も進んでいます。

OpenAIは、今日のChatGPTを支える大規模言語モデルであるGPTを、2018年に1億1700万個のパラメータ（計算ノード）を持つ最初のバージョンを発売して以来、さらに開発を進めてきました。続いて2019年にGPT-2が15億のパラメータで、2020年にGPT-3が1750億のパラメータで登場しました。(OpenAIはGPT-4のパラメータ数を明らかにすることを拒否した）AIモデルは、設定変数として機能するパラメータを最適化することを訓練中に学習します。パラメータを追加することで、モデルの一般化された知能をさらに発展させることができることを研究者は示しています。

GPT-4は、ChatGPTのプレミアム版であるChatGPT Plusと、API経由で提供される予定です。

OpenAI CTOのMira Muratiが今年初めに関心のある分野と述べた教育分野は、パートナーのDuolingoとKhan Academyと共に開発されたGPT-4で注目されます。Duolingoは、GPT-4を活用した2つの新機能、AI会話相手と間違いを解くための説明ツールを作成しました。この機能は、新しいプレミアム購読層としてパッケージ化される予定です。Khan Academyは、**生徒の家庭教師と教師のアシスタントの両方の役割を果たすGPT-4を搭載したアシスタントを導入する予定です**。

ウォルトン・ファミリー財団が2000人の教師を対象に行った調査によると、すでに米国の教師の半数がChatGPTを試用し、40％が毎週利用しているとのことです。
ウォルトン・ファミリー財団の教育プログラム・ディレクターであるRomy Druckerは、「学習能力の低下が蔓延している今、生徒の教育と学習を強化するための解決策やアプローチについて考えることが急務となっています」と述べています。「私たちの調査は、教師がこの瞬間に対応するためのより良いツールとリソースを必要としていることを明確に物語っており、だからこそ教師はChatGPTをいち早く採用したのです」と述べています。
視認性の高い縦積みグラフの作成の仕方

# はじめに

業務で折れ線グラフで作成したものを、縦積みグラフにしTotalのデータがわかりやすいように作成し直して欲しいの要望をいただいたことがあったのでそのやり方を振り返るために今回の記事を執筆しました。
読みづらい部分もあるかもしれませんが、最後まで読んでいただけると幸いです。

参考サイト：https://kb.tableau.com/articles/howto/stacked-bar-chart-multiple-measures?lang=ja-jp


##### 使用環境
・Tableau Public（無料）

##### 使用データ
・サンプル　-　スパーストア

今回使用環境の準備、サンプルデータの準備の方法に関しては省略させていただきます。


## 最終的なゴール
![スクリーンショット 2023-03-21 10.47.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/ce9161a7-5f39-c90e-8933-aaf33d7d7e65.png)
上記グラフのように、
横軸：地方
縦軸：売上
色の区分：顧客区分
色分けごとに売上と区分名を表示
棒グラフのTOPに売上の合計金額

のように作成して大きい順に並び替えるといった形で作成するのがゴールになります。


##### 手順１
まず列に地域をドラッグ＆ドロップして横軸を作成する。

![スクリーンショット 2023-03-21 10.59.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/b25ef4d1-3525-3140-df5e-cbb4828f0b59.png)

##### 手順２
次に行に売上をドラッグ＆ドロップして縦軸を作成

![スクリーンショット 2023-03-21 11.02.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/c06c52d8-4cb7-7fd8-6b79-f88d08b4f4b2.png)

##### 手順３
次にマークの色の方に顧客区分をドラッグ＆ドロップして小規模事業所・消費者・大企業を表示できる。

![スクリーンショット 2023-03-21 11.05.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/d42daa48-5a07-63d8-db15-ec651dccaecd.png)

##### 手順４
色分けごとに売上・区分をグラフで表示するためにマークのラベルの方に売上・顧客区分をドラック＆ドロップをする。

![スクリーンショット 2023-03-21 11.15.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/d9a26198-4c7f-3daa-7008-b3f5fd6777ca.png)

##### 手順５
棒グラフのTOPに売上のTotalを表示するために、下記画像のアナリティクス→リファレンスラインをクリックする。

![スクリーンショット 2023-03-21 11.17.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/97fa6359-23ea-65dc-25de-681dd9d550be.png)

##### 手順６
下記画像のようにリフアレンスラインをクリックした後、下記画像のように設定すると売上の金額が棒グラフのTOPに表示された図が作成される。
![スクリーンショット 2023-03-21 11.20.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/b730f289-cb99-414a-ce22-7b3776555200.png)

##### 手順７
最後に降順に並び替えるために下記画像の部分をクリックして並び替える。

![スクリーンショット 2023-03-21 11.24.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/63e659c1-b5b1-5775-e5db-7e5ede4a743a.png)


#####  最終形
![スクリーンショット 2023-03-21 11.27.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591484/86bb5bbf-17b5-b2dd-0f52-5a550fc940c5.png)

# 後書き
最後まで、読んでくださりありがとうございました。
今回は、縦積みグラフの作成の仕方を説明しました。これに合わせて、今回は説明しませんでしたが、パラメーターを使用し年月を選択できるようにすればその時々の売上データを見ることも可能です。
グラフの種類によってはわかりやすい部分、わかりにくい部分があるので、そのシーンに合わせた適切なグラフを取捨選択しビジュアライズしていきましょう。
面倒くさがりやな僕が、VSCodeでChatGPTを簡単に使いたいためだけに拡張機能を作った話

# TL;DR

![名称未設定のデザイン (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/3d6728e0-a6a5-277a-14a3-171e442fbcc6.gif)

https://marketplace.visualstudio.com/items?itemName=takagimeow.chatgpt-editor

https://github.com/takagimeow/chatgpt-editor

# はじめに

僕は、すでにAIの力無くしてコードを書けなくなったのかもしれません。

もともと怠惰だった僕の性格は、ChatGPTが登場して以降、スーパー怠惰へと進化を遂げつつありました。

口癖は「あぁ、面倒くさい」

かの有名な映画監督を気取っては、「面倒くさい」という言葉しか僕の口からはでてこなくなっていました。

https://president.jp/articles/-/54596?page=1

ChatGPTのテキストフィールドでエンターキーを押そうとすると、編集中なのに送信されてしまい、その度にエディタに再入力してはコピペをするというの繰り返していました。

「ブラウザとVSCodeを行ったり来たりするのも面倒くさい」

次第にブラウザを開くことすら面倒くさくなり、VSCode上ですべてを完結させたいという欲求に蝕まれるようになっていきました。

# 作ったもの

**だったら作っちゃおう**。

その一言が布団で横たわる僕の脳へと突き刺さり、次の瞬間にはキーボードを叩く姿が。（「ああ、キーボードを打つのも面倒くさい」と思いながら）

そうこうカタカタしているうちにできたのが、こちらの`ChatGPT Editor for VSCode`拡張機能です。

https://marketplace.visualstudio.com/items?itemName=takagimeow.chatgpt-editor

# どうやって使うのか

使い方は簡単です。

まず、[OpenAIのサイト](https://platform.openai.com/account/api-keys)からAPIキーを発行します。

APIキーを発行したら、コピーして設定画面の`API Key for ChatGPT`フィールドにペーストします。

![名称未設定のデザイン (71).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/d3865753-b886-ee9b-a078-fcc1acc62450.png)

これで必要最低限の設定は完了です。
それでは実際に使ってみることにしましょう。

VSCodeのエディター上にて新しいドキュメントを開きます。
今までChatGPTの入力欄に打ち込んでいた内容をそのままドキュメントに入力してください。

入力が完了したら、選択状態にします。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/abcc7458-a804-dec3-fcdd-027be5eeb6c8.png)

選択状態にしたあと、`Cmd + Shift + C`というショートカットを同時に押下すると、ChatGPTに対して問い合わせを行ってくれます。
もしくは、コマンドパレットから`Prompt Selected Texts`を選択します。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/25631245-3015-3d7f-229a-e6d5ec0ba477.png)

ChatGPTから応答が帰ってきたら、先ほどの選択したテキストの下に、結果が挿入されます。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/10198ea2-6744-d686-6c2d-a4dd6b284f49.png)

ほら！ものすごい簡単でしたよね？？？

これであの途中で送信しちゃうChatGPTのページともおさらばです！
VSCodeでコードを書きながら、わからないことがあったらブラウザを開く前に、ChatGPTに聞いてみる。それだけです。

# まとめ

プログラマーの三代美徳である怠惰をフル活用したお話、いかがでしたでしょうか？
面倒くさいから作ってしまおうという、一般的には矛盾しているような感情も、プログラマーにとっては美徳の一つとされています。

面倒くさい駆動開発は、やがてAI駆動開発へと進化していきます。GitHub Copilotしかり、プログラマーにとってAIはなくてはならない相棒となっていくはずなので、今のうちに友達になっておくことをお勧めいたします。

https://dic.pixiv.net/a/%E3%81%A8%E3%82%82%E3%81%A0%E3%81%A1

:::note
モチベーションにつながるため、記事へのいいねと、GitHubリポジトリでのスターをよろしくお願いいたします！
:::

https://github.com/takagimeow/chatgpt-editor

https://marketplace.visualstudio.com/items?itemName=takagimeow.chatgpt-editor
logger.level root:DEBUGで500エラーになりテストが失敗する

# はじめに

この記事ではタイトルのエラーについて解決しているものではなく、検証してわかったことをまとめているものになっています。
原因がわかる方がいればコメント頂きたいです

# 問題

SpringBootにJPAのログを出すために`application.yml`に以下を追加しました

```yml:application.yml
logging:
  level:
    root: DEBUG
```

しかし、これを追加してE2Eを動かしたところ今まで動いていたテストが動かなくなり、`500エラー`が返ってくるようになりました

# わかったこと

```yml:application.yml
logging:
  level:
    root: INFO
```

ロギングを`INFO`や`WARN`に変えたところなぜかテストが通りました
何かしらの原因で`DEBUG`のみ500エラーが変えるようになってしまったようです

今回はJPAのログ出力だったので結論として、以下を追加することで解決しました

```yml:application.yml
logging:
  level:
    org.hibernate.SQL: debug
    org.hibernate.type.descriptor.sql: trace
```

`root: DEBUG`を使わないでよかったので根本的解決はできていません

# おわりに

最近雑にまとめておくことが大事だと思っているので、いちおうきじにしてみましｔ
Rubyのメソッド問題

・任意の数字が配列の中の何番目に格納されているかを確認できるプログラムを実装
・以下の配列から任意の数字を探して何番目に含まれているかという結果を返すsearchメソッドをeach_with_indexを用いて作成

```
input = [3, 5, 8, 10, 15, 18, 23, 26, 31, 36, 42, 47, 54, 58, 67, 71, 77, 81]
```

#任意の数字が配列の中の何番目に格納されているかを確認できるプログラムを実装
#以下の配列から任意の数字を探して何番目に含まれているかという結果を返すsearchメソッドを、each_with_indexを用いて作成

```ruby
def search(target_num, input)
  input.each_with_index do |num, index|
    if num == target_num
      puts "#{index + 1}番目です"
      return
    end
  end
  puts "その数は含まれていません"
end

input = [3, 5, 8, 10, 15, 18, 23, 26, 31, 36, 42, 47, 54, 58, 67, 71, 77, 81]
search(11, input)
```

input.each_with_indexでは、inputに格納されている要素を1つひとつnumとして取り出して、各要素に割り当てられている添字をindexとして取得する。

次に、if文でnum == target_numという条件式を設定する。
→inputから取り出された要素numと、target_numが等しいかを判別している。

そして、numとtarget_numが等しければ、numがinputの中の何番目に含まれているかが出力される。

numとtarget_numが等くなければ、「その数は含まれていません」と出力される。

今回は引数で渡した”１１”は配列の中に含まれないので、条件には当てはまらない。
→その数は含まれませんと出力される
Rubyのメソッドを作ってみた。

# Rubyのメソッドを定義してみた。
```Ruby
#say_pochiメソッドを定義して、呼び出したらBowと鳴くメソッドを作ってみた。
def say_pochi()
    puts "Bow"
end 
say_pochi()
```
<b>実行結果</b>
Bow

・[defはdefinitionで定義という意味。](https://dictionary.goo.ne.jp/word/%E3%83%87%E3%83%95%E3%82%A3%E3%83%8B%E3%82%B7%E3%83%A7%E3%83%B3/)

https://www.javadrive.jp/ruby/method/index2.html

# chatGPTに聞いてみた。
Q.Rubyのメソッドは関数でしょうか？

A.Rubyのメソッドは、厳密には関数とは異なります。

Rubyでは、全てのものがオブジェクトであるため、メソッドもオブジェクトの一部であり、関数として呼び出されることはありません。

メソッドは、オブジェクトに対して行われる操作であり、オブジェクトに属しています。メソッドは、クラスに定義され、そのクラスのインスタンスに対して呼び出されます。Rubyのメソッドは、そのメソッドを定義するクラスのインスタンスから呼び出され、そのクラスに属するオブジェクトの状態を変更することができます。

例えば、RubyのStringクラスには、lengthというメソッドがあります。これは、Stringオブジェクトの文字数を返すメソッドです。このメソッドは、Stringオブジェクトに対して呼び出され、オブジェクトの状態を変更することはありません。

Rubyのメソッドは、ブロックという概念を使用して、実行中にコードの一部を動的に変更することができます。また、Rubyのメソッドは、引数として他のメソッドを受け取ることもできます。これにより、メソッドの動作をカスタマイズすることができます。

総合すると、Rubyのメソッドは関数とは異なる概念であり、オブジェクト指向プログラミングにおいて重要な概念の一つです。


Q.Rubyのメソッドと関数の違いについて教えてください。

A.Rubyのメソッドと関数には、以下のような違いがあります。

メソッドはオブジェクトに属していますが、関数はオブジェクトに属していません。
Rubyのメソッドは、オブジェクトに属しているため、メソッドを呼び出す前にオブジェクトを生成する必要があります。一方、関数はオブジェクトに属していないため、呼び出す前にオブジェクトを生成する必要はありません。

メソッドはオブジェクトの状態を変更することができますが、関数はできません。
Rubyのメソッドは、オブジェクトに属しているため、オブジェクトの状態を変更することができます。一方、関数はオブジェクトに属していないため、引数として与えられたデータを元に新しいデータを返すだけです。

メソッドはオブジェクト指向プログラミングの概念に基づいていますが、関数は手続き型プログラミングの概念に基づいています。
Rubyのメソッドは、オブジェクト指向プログラミングの概念に基づいています。このため、オブジェクトの状態を変更するために使用され、プログラムの構造をより明確に表現することができます。一方、関数は手続き型プログラミングの概念に基づいているため、データを操作することに重点を置いています。

総合すると、Rubyのメソッドは、オブジェクト指向プログラミングの概念に基づいており、オブジェクトの状態を変更することができます。一方、関数は、手続き型プログラミングの概念に基づいており、オブジェクトの状態を変更することはできません。
メモ　Google ColabでPytorch 2.0を動かす方法と書籍「PyTorch &深層学習プログラミング」を動かすための注意点

# はじめに
書籍書籍「最短コースでわかるPyTorch &深層学習プログラミング」著者です。
最近リリースされたばかりのPyTorch 2.0、Google Colabで普通にpip installをしても古いバージョンに戻されてしまうらしく、そこを回避するための手順メモを記載しました。

(2023-04-14 追記)確認したところ、本日時点でデフォルトの状態がすでに2.0.0+cu118になっていました。つまり、下記の手順はすでに不要です。せっかく記事を書いたので、書籍「最短コースでわかる PyTorch &深層学習プログラミング」の実習コードを動かすための注意点を追記します。


参考にした情報
https://github.com/YutaroOgawa/how_to_run_pytorch2_on_google_colaboratory_20230317

# 導入手順
コツがわかればとても単純です。以下の2行で可能です。
ただ、発展途上なので手順は今後変化する可能性があります。

```py
!pip3 cache purge
!pip3 install torch torchvision torchaudio --force-reinstall --index-url https://download.pytorch.org/whl/cu118
```

(結果は長いので省略します)

# 確認手順

```py
import torch
print(torch.__version__)
```

結果(2023-03-21現在)

```
2.0.0+cu118
```

## 注意事項
上記のコマンドで、バージョンが上がったことを確認した後、必ずメニューから「ランタイムの再起動」を実行して下さい。

# 書籍「PyTorch &深層学習プログラミング」を動かす上での注意点
動作確認をしたところ、すべての実習コードが問題なく動作することが確認できています。
1点だけ5章 p.185 コード5-34で実行結果が紙面のようにtensor([0.])などとならずNoneと表示されますがプログラム実行に支障はありません。

その他の注意事項については、サポートページのFAQをごらん下さい。


サポートページ
https://github.com/makaishi2/pytorch_book_info

FAQ
https://github.com/makaishi2/pytorch_book_info/blob/main/refs/faqs.md
Googleデジタルマーケティング＆Eコマース：ビジネスに最適なメール配信頻度

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/bc50df6f-2af4-4c58-96fb-829e0752d0af.png" width="800">

購読者リストへのメール送信頻度が高すぎると、ビジネスに悪影響が出る可能性があります。あなたのビジネスに最適なメール配信頻度を決定する方法をご紹介します。

# 頻度を設定する際の考慮事項

2021年、世界中で毎日3,200億通近くのメールが送信されました。それ以降、その数は増加の一途をたどっています。購読者が圧倒されたり、メールの嵐を感じたりしないようにすることは、メールマーケティング戦略の大きな部分を占めます。メール配信の頻度は、慎重に検討した上で設定する必要があります。もし、毎日メールを送っていて、購読者が毎日のメールを減らそうとしている場合、購読を中止されるかもしれません。

購読者にメールを送る頻度を評価する際には、以下の質問について考えてみてください。

### <font color="MediumBlue">購読者リストの規模はどのくらいですか？</font>


以下のパラメータに基づいて、頻度を設定することを検討してください。
| 規模 | 頻度 | 
| :--- | :--- | 
| 500人未満 | 月に一度、メールを送信します | 
| 500～10,000人 | 週に一度、メールを送信します | 
| 10,000人以上 | 週に2回送信します | 

### <font color="MediumBlue">このメールの目的は何ですか？</font>

新製品など、ユーザーに何かを知ってもらうためであれば、メールは1回で十分です。

### <font color="MediumBlue">どのような種類のメールを送信する予定ですか？</font>

例えば、セールや割引などのプロモーションメールよりも、ニュースレターの方が頻繁に送信されます。

### <font color="MediumBlue">メールにはどのようなコンテンツが含まれていますか？</font>

ほぼ同じ内容をメールに盛り込んでいるのであれば、複数回送る必要はないのかもしれません。もし、セール情報をお知らせするのであれば、セール開始時と終了時の2回に分けて配信するとよいでしょう。

# オーディエンスに尋ねる

メールアドレスの収集方法によっては、購読者からすぐにフィードバックを得ることができるかもしれません。

例えば、

- Webサイトのプロンプトからサインアップする際に、どのくらいの頻度でメールを受け取りたいかを尋ねる簡単なアンケートを含めることができます。
- 登録時にウェルカム・メールを送り、フィードバックを求めることもできます。
- 購読者が「配信停止」を選択した場合、アンケートでメールの受信頻度を減らすことができます（例：月に1回、週に1回など）。

これにより、配信停止をする人の数を減らすことができます。
WindowsをUS配列のMacに可能な限り近づけてEmacs入力を用いてもショートカットキーの競合を回避する方法

# はじめに

本記事では、長年にわたり普通の日本語配列のWindowsを使用してきた筆者が、開発に当たりUS配列のMacが好ましいとの情報を入手し、思い切ってUS配列のMacBook Airに切り替えたあと、改めてWindows端末を触る際に困った内容とその解決策について述べます。

2023/07/30、記事を大改修します。分かりづらかったので。

## 修飾キーの比較

### Mac
Command,option,shift,controlという4種類

### Windows
Control,shift,altという3種類

## 修飾キーが一つ足りないことで、Windowsではできないこと
Emacs入力
ほかショートカット多数

### Emacs入力とは
Emacs入力という表現が正しいか定かではないが、具体的には以下のようなカーソル移動を指す
+ ctrl+A カーソルを先頭に移動
+ ctrl+F カーソルを右に移動
+ ctrl+K 現在のカーソルより右側を削除
+ ctrl+B カーソルを左に移動
+ ctrl+P カーソルを上の行に移動
+ ctrl+N カーソルを下の行に移動

個人的にはこのあたりをよく使います。非常に便利です。ctrl+Hでバックスペースキーと同じ1文字削除ですが、つい癖でMacではdeleteキーを押して1文字削除してしまいます。

### Windowsでは
Macでもフルサイズキーボードなら存在しますが、移動だけなら「Home」「End」「4方向の矢印キー」でええやんシューシューというのは理解できます。

しかし、「ホームポジションを維持したままカーソル移動」の良さは何物にも代えがたいです。

特に、Windowsでは「Ctrl＋A」が「全選択」、「Ctrl+F」は検索と、明確にバッティングしています。

## Emacs入力をWindowsでも導入するためにやること
まず筆者はcaps lockをctrlの代わりにしています。
US配列を買った方、買う方、COBOLやアセンブラやSQL文オール手打ちでもしない限りはおそらく不要なキー筆頭なので、caps lockをctrlにするというムーブは下記のKeySwapでまず横綱筆頭でしょう。

### KeySwapでキーを入れ替える
Windowsでは日本語配列もUS配列も関係なく、Macとはキーの配置が違います。
とくに左下の構成が違いますね。
Windowsでは
[Ctrl][fn][win][alt]
みたいな感じでしょう。fnは有無あり。
一方で日本語Macは
[謎][option][command][変数]
になっています。ずっとUS Macなので違和感があります。
US Macは
[fn][ctrl][option][command]です。
いずれにせよ違いが大きい。
なので、適宜入れ替える必要があります。caps lockも不要です。入れ替え方は好みあると思いますが、caps lockをctrl化は定石かと。

+ caps lock → 右Ctrl
+ windows → Ctrl
+ Ctrl → Windows
という設定だったと思います。
適宜保存して再起動をかけて、正しく入れ替えられているか確認しなければなりません。

### AutoHotKeyでEmacs入力を実現
[このページ](https://linuxfan.info/windows-emacs-keybindings)の【「カーソル移動＋α」のキーバインドだけをEmacs風にする】を参考にして導入しました。
AutoHotKeyのバージョンは古いほう（1.1）がいい気がします。

#### caps lock → 右Ctrlを思いつくまでに発生していた問題
caps lockを通常の左Ctrlに当てはめていた際は、Ctrl+Aの入力が「入力文字の先頭にカーソルを移動」と「全選択」の操作でバッティングしてしまい、正しく動作しない状況が発生しました。結構なストレスでした。
Windows端末は大して使わないので、しばらく全選択を諦めるというムーブで対応していましたが、いよいよWindowsでも開発「できる必要がある」という状態を迫られた気がしたので、しっかりと対応してみることにしました。

##### ダメだった解決策
左手方向をご覧いただきますと見えてきますのは、燦然と輝く「fn」キー。これを活用できないかと考えたわけですね。
アイデアとしては、fnキーを単独で認識させ、KeySwapでcaps lockと入れ替え、ショートカットキーの修飾キーにできないかと考えました。ところがfnキーは単独で認識されるものではなく、ほうぼう調べても5000円の有料ツールがあるとかないとかで検索情報はストップ。

## シンプルな解決策
あの手この手で調べてみると、そもそもAutoHotKeyでは左右のCtrlやShiftを別々で単独で認識させることも可能らしいので、KeySwapにてCaps lockを**右**Ctrlとして認識させ、AutoHotKeyのEmacs入力の設定各種ではCtrlを用いる場合はその右Ctrlを修飾キーとして指定することにしました。

これでやりたいことは完全解決です。
AutoHotKeyの設定でCtrlを表す^の前に>を入力するだけ。

[このページ](https://ocamejp.com/autohotkey-modifier/) の、【左右の修飾キーを別々に使いたいとき】
をご参照。

・全選択：[ctrl+A]
・Emacs入力でカーソルを先頭へ移動[右ctrl+A]※ただし右ctrlはcaps lockとkey swapで入れ替え済み。ほか主要Emacs入力も修飾キーを右ctrlに変更

AutoHotKeyのEmacs入力のうちCtrlを修飾キーとするものは右Ctrlでなければ発動せず、その右CtrlはCaps lockに割り当てているので、
必然的にMacでいうところのcommandとctrlをWindowsでも使い分けられていることになります。
左CtrlはMacのCommand、右CtrlはMacのCtrlという感じでしょうか。

解決策は非常にシンプルで、左右それぞれの修飾キーを別々でAutoHotKeyに認識させればいいだけでしたが、できないものだと思いこんでいたのが敗因でした。

位置的にも右側の修飾キーをミスタイプすることはないでしょうから、これで完全解決です。

むしろ、左右の修飾キーを使い分けて、独自のショートカットを導入することもできそうですね。
みんなはシフト演算子を知らぬか

https://atcoder.jp/contests/tenka1-2013-quala/tasks/tenka1_2013_qualA_a

この問題、答えは42×2²²で、僕は21×2²³という意味でこの提出をした。

https://atcoder.jp/contests/tenka1-2013-quala/submissions/39831051

``` python
print(21<<23)
```
最短コードだと思って、もう提出している人がいるかなと思い、探してみた。その結果…

https://atcoder.jp/contests/tenka1-2013-quala/submissions?f.LanguageName=Python3&f.Status=AC&f.Task=tenka1_2013_qualA_a&f.User=&orderBy=source_length

俺だけ…

2**xよりも1<<xの方が早いのだ！！！そして短いのだ！！！（？）
wslでelixir その20

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
udp叩いてみた。
ipアドレス、192.168.0.104のポート49153番に、helloを送信して、返事を受け取る。

# 実行結果

```
$ iex
Erlang/OTP 25 [erts-13.0.4] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]

Interactive Elixir (1.13.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> {:ok, socket} = :gen_udp.open(49153, [:binary, active: false])
{:ok, #Port<0.6>}
iex(2)> :ok = :gen_udp.send(socket, '192.168.0.104', 49152, "hello")
:ok
iex(3)> :gen_udp.recv(socket, 0)
{:ok, {{192, 168, 0, 104}, 49152, "hello"}}
iex(4)>


```


以上。