OmniAICreator/Qiita-1.07M huggingface dataset:
AWS認定資格12冠(全冠)をしてできるようになったこと・ならなかったこと


# はじめに
AWSの経験が浅い中、AWSの認定資格12種を約1年半かけてコンプリートしました。12種類の資格取得をして、できるようになったこと、ならなかったことをそれぞれ率直に書いていきたいと思います。少しでも皆様の学習の参考になればと思います。

# 略歴
- AWS認定資格取得前のAWS経験：webアプリ開発の学習でEC2とRDSを立てたことがある程度
- AWS 認定資格を約1年半で12冠コンプリート
- そのうち実務ではAWS基盤構築（主にRDSまわり）を半年程度経験

# 取得資格
![aligned-badges.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918398/95a77fc1-8726-9c32-599c-a6871de7bb97.png)

# できるようになったこと
## AWSの全体像を理解することができる
AWSの全体像がパッとわかるようになりました。
全資格を合わせるとかなり多くのサービスに触れることになります。AWS全体としてどういったカテゴリがあり、それぞれどういったサービスがあり、どのようにそれらが連携できるのかを理解することができます。

## AWS全般の話についていけるようになる
前節にも付随しますが、全体像や知っているサービスが格段に増えたことから、AWS全般の話についていくことができるようになりました。
資格勉強ではサービスに加えてAWS独自の単語も身につきます。学習前には暗号に見えていたAWS公式の情報も、今では難なく理解ができます。（理解できないこともありますが...）

また情報の引き出しが多くなったことは自分でも驚くことがあります。
学習した経験は意外にも大きく、たとえ忘れてしまった情報であっても目に触れた途端に「そういえばこんな感じのサービスだった気がする！」と思い出したりします。AWSに関連することのキャッチアップ速度は格段に上がったように感じています。

試験勉強と実務が結びついた時には大きな力を発揮することでしょう。


## IT全般の知識が増える
意外と見落としがちですが、IT全般の知識も身に着けることができます。
アーキテクチャはAWSだけで完結する場合もありますが、AWS以外も絡む場面も多く登場します。そういったものを資格学習を通じて理解することができるため、おのずとIT全般スキルも身に着けることができます。

完全に理解するには別途深い学習は必要にはなりますが、そういった別分野を学習するきっかけにもなったりします。


## 社内での認知度が向上する
社内の認知度は大幅に向上します。
APN (AWS Partner Network)に参加されている企業に所属しているのであれば、毎年認定資格コンプリート者に「All Certification Engineers」の表彰があります。

各企業コンプリートしている人数は限られているので、その分AWSに長けている人として認識されると思います。

実際に私も部署の全体ミーティング等で話したり、ドキュメント化して社内ナレッジとしてまとめたりする活動を通じて、「AWSの人」と認知されることが多くなりました。


## 資格取得のコツを理解する
資格取得を継続的に行っていると、AWSが問いたい部分がなんとなく理解できてきます。
またそれなりの学習時間も必要になるので、自分のAWS勉強方法も確立されて、最後の方はかなり効率よく学習することもできるようになります。

コンプリートした方は共通してAWS認定資格を学習するコツをある程度身に着けているので、そういった方々の合格体験記はとてもタメになることも多いかと思われます。


# できないこと
## 構築
恥ずかしながら、構築に関してはさっぱりできません。
認定資格はどちらかといえば全体像を理解する方向性が強いため、どういった操作や設定が必要なのかはいつも調べながら進めています。前述の通り、キャッチアップスピードは上がっているので、何かを見ながら進めれば躓くことは少ないですが、何も見ずに構築するのはまだまだ修行が必要そうです。

今後はSkill BuilderのLabなどを活用して、構築スキルを身に着けていきたいと思います。


## 業務に直結せずに忘れてしまう部分もある
一度は身に着けた知識も、使わない部分に関してはかなり忘れてしまうこともあります。
コンプリートした今、過去の試験を受けろと言われたら落ちてしまうような気がしています...

知識を留めるためにはAWSの様々なイベントに参加するであったり、資格の更新を欠かさずに行うであったり、継続した学習姿勢が大切に思われます。


## AWSに対する客観的な視点
認定資格ではAWSを中心に考えていくため、良くも悪くもAWSの良い面しか学習しません。
AWSは汎用的かつ業務特化的に様々なユースケースに対応ができることはとても魅力的です。一方で客観的にAWSの効果が高いのかどうかについては自分で検討する必要があります。

広い視野を持つためには別途考える必要がありそうなことがわかりました。
CloudFrontのWAFにより課金された話

# 事象
先月（九月）業務中にTerraformでWAFをいじった覚えがあり、画像の通り九月分はWAFの費用が請求された。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/b139cee8-7c00-a629-c77f-c9f816271750.png)

そして、九月下旬にしっかりWAF-ACLやルールなど、意図して作ったリソースを全部削除したつもりで、WAF画面ではなんもないように見えてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/2f52f648-8340-fadf-4222-95ffbdca44c7.png)


しかし、十月となりBudgetを確認すると、あれっ、また変なWAF費用が課金された。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/f2bf11f3-393b-2645-bedf-14a60b16a13d.png)

# 調査結果

## CloudFrontにより作られたWAFのせいだ
結論から言うと、**CloudFront**作成時に以下の選択がありますが、
「セキュリティ保護を有効にする」を選択すると、裏でWAF-ACLとルールを作ってくれるとのこと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/6fc1ff73-b497-904c-8749-8407ee86ba9d.png)

先月は業務中でTerraformでCloudFrontを作ったことがあり、
恐らくそのとき意図せず「セキュリティ保護を有効にする」を設定してWAFを作ってしまった。。。

そこで、一つの落とし穴として、
先月はちゃんとCloudTrailで変な動きはないか確認してたけど、
CloudFrontとWAFはグローバルのサービスなので、**バージニア北部**リージョンに切り替えないとログは見れないとのこと。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/cbacf27e-753b-6701-665c-a80369e4f29d.png)

そして、CloudFront画面で該当ディストリビューションを削除し、もう一度CloudTrailを確認すると、ACLも一緒に削除されるように見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/555e5250-64f7-7fec-e9dc-dd66fb2d84e2.png)

# 終わりに
AWSリソースは裏でほかのリソースと連携して動作するのが多くあるようで、定期的にリソースの状況（変な課金はないか）を確認する癖をつけたほうがいいですね。。。
そして、東京リージョンだけじゃなく、各リージョンの状況も気をつけましょう！
Linux基礎コマンド、基礎内容

## ディレクトリ
ディレクトリとはファイルが格納されている場所
フォルダと同じようなもの
##  カーネルとディストリビューション
カーネルはOSの中心
ディストリビューションはソフトウェアをカーネルと組み合わせたもの
## シェル
シェルとはユーザーが入力したコマンドを解釈してカーネルに伝え、返ってきたコマンドの実行をユーザーの画面に表示する
## cd
ディレクトリを移動するコマンド
`cd ディレクトリ名 `
## pwd
今いる場所を表示するコマンド
## ls
ファイルの一覧を表示
## mkdir
ディレクトリの作成
## rmdir
ディレクトリの削除
## cat
ファイルの中身を表示
## less
ファイルの中身のスクロール表示
## tail
テキストファイルの末尾から行数を指定して表示する
## touch
空のテキストファイルの作成
## rm
ファイルの削除
## mv
ファイルの移動
## cp
ファイルのコピー
`cp コピー元　コピー先`
## ln
リンクを作成するコマンド
ファイルやディレクトリを異なる場所で利用できるようにするために役立つ
`ln リンク元　リンク先`
同じデータを共有する
## find
ファイルの検索コマンド
find 検索開始地点　検索条件
## chmod
ファイルの権限の設定をできるコマンド
`chmod + or - rwx`
## chown
ファイルのユーザーとグループを新しく設定するコマンド
`chown　ユーザー:グループ ファイルまたはディレクトリ`
## ps
実行中のプロセスを表示するコマンド
## kill
実行中のプロセスを終了させるコマンド
`kill ジョブID or プロセスID`
VoiceEmotionalRecognition 2

# 目標
音声データをスペクトル画像データへ変換する
各画像データとラベルを関連付ける

# 結果

songデータ及びspeechデータをスペクトログラム画像データへ変換し、png形式で保存することにした。

また、ラベル付に関しては音声ファイル名にそのデータの様々な情報が乗っているので、まだどの情報が有益か判断がつかないためファイル名をそのまま画像のファイル名とした。

以下はベタ書きのコードだが、今後関数化して組み込む予定。
```
#data/song/ & data/speech/のwavファイルをスペクトログラム画像に変換しdata/img/に保存する

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from scipy.signal import spectrogram
import glob
import cv2
#ファイル名取得

files1 = glob.glob("/home/naoya/Desktop/github/VoiceEmotionRecognition/data/song/**/*.wav")
files2 = glob.glob("/home/naoya/Desktop/github/VoiceEmotionRecognition/data/speech/**/*.wav")
files = files1 + files2

for file in files:
    #ファイル名からラベルを取得
    # label = file[-17]
    filename = file[-24:-4]
    # 音声ファイルの読み込み
    sample_rate, samples = wavfile.read(file)
    
    # FFTをかけて周波数スペクトルを取得
    frequencies, times, spec = spectrogram(samples, fs=sample_rate)
    
    
    # # スペクトログラム画像の描画
    Z = 10. * np.log10(spec)
    # plt.imshow(Z, origin='lower', aspect='auto', cmap='viridis')
    # plt.xlabel('Time (sec)')
    # plt.ylabel('Frequency (Hz)')
    # plt.colorbar()
    # plt.show()
    cv2.imwrite(f'/home/naoya/Desktop/github/VoiceEmotionRecognition/data/img/{filename}.png', Z)
```

# ref
https://www.nakakamado.com/2023/05/wav-to-spec.html
ELYZA, OpenVINO とともにあれ！

# 2023-10-03 の ToDo

## できたわけじゃないよ。ごめん。この記事を目にした小人さんが触発されるのなら・・・・

記事リンク: [Intel“逆襲”の鍵はやはり「AIプロセッサ」か　次世代CPU「Core Ultra（Meteor Lake）」を解説（後編）](https://www.itmedia.co.jp/pcuser/articles/2309/22/news121.html)

この記事からグッときたポイントをピックアップすると、

- Intel CPU、Meteor Lakeに搭載されているNPU（Neural-network Processing Unit）は、Movidius由来である。
- NPUはOpenVINO APIで使用可能である。

おっ、これは、、、Meteor LakeのノートPCを買うしかない！！

## ところで、OpenVINOで、大規模言語モデル（LLM：Large Language Model）は動くのか？

検索すると。。。

- [llama2.openvino](https://github.com/OpenVINO-dev-contest/llama2.openvino/tree/main)

- [Running Llama2 on CPU with OpenVINO](https://raymondlo84.medium.com/running-llama2-on-cpu-with-openvino-125fbf10daa1)

Llama2 7B は動作するみたい。

では、[ELYZA-japanese-Llama-2-7b ](https://huggingface.co/elyza/ELYZA-japanese-Llama-2-7b)も動くよね？

**Meteor Lake ノートPCが出るまでに、動作するか確認したいところ。**

## 小人さんいないかなー。

...
What's New from CircleCI - 2023/10/03

CircleCIは日々進化していますが、その変化に追いつくのは大変ですよね。
What's New from CircleCI を毎週チェックして、CircleCIの最前線をキャッチアップしてくださいね！

[＜ What's New from CircleCI - 2023/09/26](https://qiita.com/CircleCIJapan/items/26c88c03513af66e25e9) | 今週 | [What's New from CircleCI - 2023/10/11＞](https://qiita.com/CircleCIJapan/items/bd1bb6612b3a3156846f)

# ブログやスライド、ビデオ
## ユーザーからの声
- [pt-online-schema-change の実行が必要かどうか判断するタイミングをより早くした話](https://tech.repro.io/entry/2023/10/03/090000) by Repro
    - MySQLのスキーマ変更を行う際に、pt-online-schema-change の実行が必要かどうかを判断するタイミングをより早くするために、テスト環境でのスキーマ変更を自動化した話です。
- [ココナラiOSアプリの最近の取り組みと今後の取り組み](https://zenn.dev/coconala/articles/e2bb785d60c6b9) by [ココナラ](https://twitter.com/coconala_eng) 齋藤さん 
- [CircleCI でデータベース接続のHOST設定はどうすれば良いのか ( 127.0.0.1 / localhost で接続エラー )](https://qiita.com/YumaInaura/items/b2875494fa69bd73425e) by [@YumaInaura](https://twitter.com/YumaInaura) さん
- [CircleCI上でgo言語のユニットテストを差分実行する方法](https://zenn.dev/howtelevision/articles/24cc0207217bfe) by [HowTelevision](https://twitter.com/howtelevision) ohira さん
- [CircleCIでChatGPTにエラーの解説を頼んでみた](https://speakerdeck.com/mfunaki/circlecidechatgptnieranojie-shuo-wolai-ndemita) by [@mfunaki](https://twitter.com/mfunaki)
## CircleCI公式ブログ
- [An update on CircleCI's reliability (CircleCIの信頼性に関するアップデート)](https://circleci.com/blog/an-update-on-circleci-reliability/)
    - CircleCI の最近のインシデントやその原因、対策、現時点での改善点や今後の改善計画について、CircleCI の CTO である Rob Zuber が説明しています。
- [How to SSH into Docker containers (DockerコンテナにSSHで入り込む方法)](https://circleci.com/blog/ssh-into-docker-container/)

# CircleCI プロダクト情報
## Changelog (更新履歴)
- https://circleci.com/ja/changelog/
## CircleCI Discuss (CircleCIからのお知らせ＆コミュニティ掲示板)
- [Machine runner 3.0 now available for preview (マシンランナー 3.0 がプレビュー公開)](https://bit.ly/3rAPnKV)
## CircleCI ナレッジベース
- [Understanding Exit Status Cod 255 (終了ステータスコード 255 の意味を理解する](https://support.circleci.com/hc/en-us/articles/19269081230235-Understanding-Exit-Status-Code-255)
- [Troubleshooting network connectivity issues with CircleCI runners (CircleCI ランナーに関連するネットワーク接続問題のトラブルシューティング)](https://support.circleci.com/hc/en-us/articles/19268632667931-Troubleshooting-network-connectivity-issues-with-CircleCI-runners)
- [Does Container Runner support SSH Debugging? (コンテナランナーは SSH デバッグをサポートしますか](https://support.circleci.com/hc/en-us/articles/19207963048475-Does-Container-Runner-support-SSH-Debugging-)

# 展示会出展、ウェビナーなど
## ウェビナー
- 10/19(木) [【オンラインセミナー】はじめてのCircleCI](https://circleci.connpass.com/event/293598/)
## 展示会出展
- 10/27(金)~28(土) [PyCon APAC 2023](https://2023-apac.pycon.jp) at TOC有明Convention Hall (CircleCIはゴールドスポンサー出展です)
---
それでは今週も Happy Building⌨!
pythonでインストールしたライブラリに対して「No module」が出た時の対処法

ライブラリをインストールしたのに「No module」エラーになる事があります。
これはライブラリのパスが通っていないことが原因の場合があります。
下記の手順で解決出来ましたので、ご参考下さい。

# １．インストール先の確認
install実行時にインストール先が表示されるので何処にインストールされたのかを確認する


# ２．パスの接続先を探す
作成中のプロジェクト内に下記のファイルを作成して実行し、接続先のパスを確認する

```python:sys.py
import sys
print(sys.executable)
```

# ３．pthファイルを作成する
“.pth”ファイルは、参照させたいパス一覧を書き込めるファイルなので、参照先の(2.)でヒットしたsite-packagesフォルダ配下に適当な名前の.pthファイルを配置し、そこに(1.)でヒットしたライブラリが格納されているフォルダパスを書き込む

# ４．パスの設定確認
(2.)で作成したファイルを実行し、接続先に(1.)の接続先が表示されていればOKです
Qiita アップデートのお知らせ - 2023年 09月

![Qiitiaアップデートのお知らせ 2023年9月](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/86b44444-8f53-49ed-ead7-3e031c824e54.png)

## はじめに

Qiitaでは、エンジニアのみなさんからの声をもとに、日々開発を続けています。
この記事では、2023年 09月にリリースした内容を紹介します。

Qiitaでアップデートやバグ修正をリリースしたら、[リリースノート](https://qiita.com/release-notes)、[Qiita 公式 X(Twitter)](https://twitter.com/Qiita)、[Qiita Blog](https://blog.qiita.com/)でお知らせしています。

また、Qiitaへの質問や機能の要望などがありましたら、[Qiita Discussions](https://github.com/increments/qiita-discussions) へご投稿ください。

## ダークモードを正式版としてリリースしました

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/9acfd90c-5bd8-b466-450f-ee9486a75eb4.png)

*2023年 09月08日 リリース*

ベータ版として公開していたダークモードを正式版としてリリースしました。
ログインユーザー向けの機能になりますので、利用する場合はQiitaにログインをお願いします。


デフォルトの設定はOSの設定にあわせたテーマカラーになっています。
ヘッダーのユーザーメニューのドロップダウンを開いて、「テーマカラー」設定からライトテーマを選択することもできます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/ec070569-e292-b617-053e-82b099f2bd4a.png)

詳しい設定方法は[テーマカラー設定についてのヘルプページ](https://help.qiita.com/ja/articles/qiita-theme)をご覧ください。

## 記事投稿完了時に、Qiitanのアニメーションを表示するようにしました

![モーダルのスクリーンショット。「記事投稿完了しました つぎの投稿も楽しみにしています！」という文言の下でQiitanが尻尾をぴょこぴょこさせている。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/ecc9d40e-f3e5-9766-53d9-5a184cf8fa81.gif)

*2023年 09月14日 リリース*

記事の投稿を完了した際に、メッセージとQiitanのアニメーションを表示するようにしました。

Qiitanのアニメーションは数パターンあり、毎回ランダムで見れるQiitanが変わります！

![4種類のQiitanのイラストのシルエット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/8992dfad-a6a7-ceea-e58e-84b61d42c96b.png)



## 記事ページのデザイン変更をベータ版として公開しました

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/55c5d22e-96ca-8873-4625-c80534a7f39e.png)

*2023年 09月21日 リリース*

より記事が読みやすくなるように、記事ページのデザイン変更をベータ版として公開しました。

- 本文・見出しのフォントサイズと行間を見直しました
- コードが読みやすいようにコードブロックのフォントサイズと行間を変更しました
- ダークテーマ利用時に、太字と通常のテキストの違いがわかりやすいようにフォントの太さを調整しました

[設定ページのベータ版切り替え](https://qiita.com/settings/beta-release)から、ベータ版に切り替えてご覧ください。

## 通知一覧にユーザーのプロフィールへのリンクを追加しました

*2023年 09月19日 リリース*

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88/9cdd10f3-1ff1-e32a-7397-6a6f9af740a5.gif)

通知一覧でアクションをしたユーザーのアイコンにプロフィールページへのリンクを追加しました。
Linux ターミナルを文字で彩ろう (FIGLet)

# はじめに

`figlet` コマンドを使うと文字を Ascii Art で表示することができる。

# 基本的な使い方

インストール方法

```
$ sudo apt install figlet -y
```

まずは使ってみよう。

```
$ figlet 'Linux is very Good'
 _     _                    _
| |   (_)_ __  _   ___  __ (_)___  __   _____ _ __ _   _
| |   | | '_ \| | | \ \/ / | / __| \ \ / / _ \ '__| | | |
| |___| | | | | |_| |>  <  | \__ \  \ V /  __/ |  | |_| |
|_____|_|_| |_|\__,_/_/\_\ |_|___/   \_/ \___|_|   \__, |
                                                   |___/
  ____                 _
 / ___| ___   ___   __| |
| |  _ / _ \ / _ \ / _` |
| |_| | (_) | (_) | (_| |
 \____|\___/ \___/ \__,_|
```

改行されているのは FIGLet では横幅がデフォルトで80文字になっているためだ。新たに指定するときは `-w` オプションを使う。`tput cols` は現在のターミナルの横幅を返すコマンドだ。

```
$  figlet 'Linux is very Good' -w $(tput cols)
 _     _                    _                               ____                 _
| |   (_)_ __  _   ___  __ (_)___  __   _____ _ __ _   _   / ___| ___   ___   __| |
| |   | | '_ \| | | \ \/ / | / __| \ \ / / _ \ '__| | | | | |  _ / _ \ / _ \ / _` |
| |___| | | | | |_| |>  <  | \__ \  \ V /  __/ |  | |_| | | |_| | (_) | (_) | (_| |
|_____|_|_| |_|\__,_/_/\_\ |_|___/   \_/ \___|_|   \__, |  \____|\___/ \___/ \__,_|
                                                   |___/
```

別のフォントを使ってみよう。`/usr/share/figlet` 以下にフォントが保存されている。フォントを使うには `-f` オプションにフォント名（拡張子なしのファイル名）を渡す。block を使ってみよう

```
$ figlet 'Linux' -f 'block'

_|        _|
_|            _|_|_|    _|    _|  _|    _|
_|        _|  _|    _|  _|    _|    _|_|
_|        _|  _|    _|  _|    _|  _|    _|
_|_|_|_|  _|  _|    _|    _|_|_|  _|    _|
```

# フォントを変える

さらに別のフォントも使ってみよう。以下のgithubに配布されているフォントを使ってみる。

https://github.com/xero/figlet-fonts

```
$ git clone https://github.com/xero/figlet-fonts.git
```
`-d`オプションにフォントのディレクトリ名を渡す。もちろん `/usr/share/figlet` にコピーしてもいい。フォントの例は以下のページから探せる。今回は Big Money-se を使ってみよう。

https://github.com/xero/figlet-fonts/blob/master/Examples.md

```
$ figlet 'Linux' -f 'Big Money-se' -d ./figlet-fonts/
 __        __
|  \      |  \
| $$       \$$ _______   __    __  __    __
| $$      |  \|       \ |  \  |  \|  \  /  \
| $$      | $$| $$$$$$$\| $$  | $$ \$$\/  $$
| $$      | $$| $$  | $$| $$  | $$  >$$  $$
| $$_____ | $$| $$  | $$| $$__/ $$ /  $$$$\
| $$     \| $$| $$  | $$ \$$    $$|  $$ \$$\
 \$$$$$$$$ \$$ \$$   \$$  \$$$$$$  \$$   \$$
```

# 参考

https://ourcodeworld.com/articles/read/1043/how-to-generate-ascii-art-text-from-the-cli-using-figlet-in-ubuntu-18-04

https://delightlylinux.wordpress.com/2014/05/30/produce-fancy-text-with-figlet/

https://github.com/cmatsuoka/figlet-fonts
kintone にレコードが登録されたら LINE WORKS で通知を Google Colab で簡単に試してみる

# kintone と LINE WORKS の連携を Google Colab でさっと試してみる
https://colab.research.google.com/drive/1-snW3yD3m7w45Q2eM530gkVDHBGBQOAK?usp=sharing
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">kintone にレコードが登録されたら LINE WORKS に通知が届くBot をブラウザで簡単に試せます。<br><br>Python のサンプル コードを Google Colaboratory で共有しました。Google アカウントでログインすれば、そのまま実行できます。<a href="https://twitter.com/hashtag/LINEWORKS?src=hash&amp;ref_src=twsrc%5Etfw">#LINEWORKS</a><a href="https://t.co/In2UI1ivnJ">https://t.co/In2UI1ivnJ</a> <a href="https://t.co/y5EIhGSUoX">pic.twitter.com/y5EIhGSUoX</a></p>&mdash; iwaohig (@iwaohig) <a href="https://twitter.com/iwaohig/status/1709089986426056931?ref_src=twsrc%5Etfw">October 3, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Pandas DataFrameをWordの論文原稿に挿入する


ChatGPTに以下の質問をして、得られた回答を備忘録がてら記録。

---
Wordファイルに貼り付けしやすい形式で`DataFrame`を出力するためにはいくつかの方法があります。以下にいくつかのオプションを示します。

1. **Excel形式で保存**: ExcelはWordと相性が良く、ExcelのテーブルをWordに簡単に貼り付けられます。

    ```python
    df_final.to_excel('final_table.xlsx')
    ```

2. **HTML形式で保存**: この形式もWordが理解できるものであり、Webブラウザで開いた後にコピー&ペーストが可能です。

    ```python
    df_final.to_html('final_table.html')
    ```

3. **クリップボードにコピー**: pandasはDataFrameを直接クリップボードにコピーする機能も提供しています。これにより、DataFrameをコピーしてWordに直接貼り付けられます。

    ```python
    df_final.to_clipboard()
    ```

4. **LaTeX形式で保存**: 科学論文でよく使われるLaTeX形式も出力できますが、WordはネイティブではLaTeXをサポートしていません。しかし、特定のWordのアドオンやオンラインサービスを通じてLaTeX形式のテーブルをWordにインポートすることは可能です。

    ```python
    df_final.to_latex('final_table.tex')
    ```

上記のいずれかの方法で`DataFrame`を出力した後、それをWordに貼り付けることができます。Excel形式は最も一般的で手軽な方法であることが多いです。
【Go】標準パッケージの trace とは？

# `trace`パッケージ とは？
Go の標準パッケージの trace は、アプリケーションの実行中に発生したスタックトレースの情報を記録するためのパッケージです。このパッケージを利用することで、アプリケーションの実行中に発生したエラーの原因を特定したり、アプリケーションのパフォーマンスを分析したりすることができます。

trace パッケージの基本的な使い方は、次のとおりです。

```go
package main

import (
    "runtime/trace"
)

func main() {
    // トレース開始
    trace.Start()

    // エラーを発生させる
    _, err := doSomething()
    if err != nil {
        // エラーを処理する
        fmt.Println(err)
    }

    // トレース終了
    trace.Stop()
}

func doSomething() (int, error) {
    // 何かしらの処理を行う
    return 1, errors.New("Something went wrong")
}
```

このコードを実行すると、次のようになります。

```
$ go run main.go
Something went wrong
panic: Something went wrong
goroutine 1 [running]:
main.doSomething()
        /path/to/main.go:10
main.main()
        /path/to/main.go:6
runtime.main()
        /usr/local/go/src/runtime/proc.go:220
```

出力されたスタックトレースは、エラーが発生した場所から上位の呼び出し元へと遡って記録されています。

trace パッケージでは、スタックトレースの情報を記録するだけでなく、その情報を出力するための関数も提供しています。これらの関数を利用することで、アプリケーションの実行中に発生したエラーの原因を特定したり、アプリケーションのパフォーマンスを分析したりすることができます。

trace パッケージで提供されている関数の主な例を、次の表にまとめます。

| 関数 | 説明 |
|---|---|
| trace.Start() | トレース開始 |
| trace.Stop() | トレース終了 |
| trace.SetTraceback() | トレースバックの深さを設定 |
| trace.Copy() | トレース情報を別のバッファにコピー |
| trace.WriteTo() | トレース情報をファイルに書き出す |
| trace.Print() | トレース情報を標準出力に表示 |

# `go tool trace`コマンドについて

traceパッケージはバイナリ形式でトレースデータを出力し、
そのデータを`go tool trace`というコマンドラインツールを使用して可視化・分析することができます。

例：

```go
f, err := os.Create("trace.out")
if err != nil {
    panic(err)
}
defer f.Close()

trace.Start(f)
defer trace.Stop()

// あなたのコード...
```

このコードでは、トレースデータは`trace.out`というファイルに書き込まれます。
その後、`go tool trace trace.out`を実行することでトレースデータの可視化ツールを起動できます。

ただし、この`trace`パッケージや`go tool trace`は、アプリケーションのパフォーマンス分析やデバッグのための高度な使い方を目的としているため、普段のアプリケーション開発ではあまり使用されることは少ないかもしれません。それでも、システムの挙動を深く理解したい場合には非常に役立つツールです。

# まとめ
trace パッケージは、アプリケーションの実行中に発生したスタックトレースの情報を記録するための便利なツールです。このパッケージを利用することで、アプリケーションの動作をより深く理解し、エラーの原因を特定したり、アプリケーションのパフォーマンスを改善したりすることができます。

https://pkg.go.dev/runtime/trace
Pythonのよりシンプルな書き方

# はじめに
現場でシンプルにコードを書いてプルリクエストを提出したら、Pythonの経験が少ししかないレビュワーから「これどんな処理なんですか？」と聞かれたので説明したことがあり、Pythonはバージョンが上がるにつれ、よりシンプルな書き方ができるようになります。
一時期、エフェクティブPythonやデザインパターンなど勉強していたので有名どころの文法をまとめました。

# リスト内包表記
これです
```python
squares = [x**2 for x in range(10)]
# 出力：[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
```
このコードは0から9までの数の2乗のリストを作成する処理です。
このようにリスト内包表記はPythonでリストを簡単に作成する文法です

ちなみに、リスト内包表記を使わない場合は
```python
squares = []
for x in range(10):
    squares.append(x**2)
```
このようにリスト内包表記を使うと3行で書けるものを1行で書けます

リスト内包表記にif文を組み合わせることが可能です
0から9の数字の中から偶数の数字のリストを作成する処理をfor文とifを使って書くと
```python
evens = []
for x in range(10):
    if x % 2 == 0:
        evens.append(x)
```

これをリスト内包表記を使うと
```python
evens = [x for x in range(10) if x % 2 == 0]
# 出力：[0, 2, 4, 6, 8]
```









# おわりに
レビュワーが理解しにくいようなコードを書いていたので、チームのレベルに合わせた文法(書き方)を選択するのが最善手であるように思えます。
かく言う私も他人の書いたコードの読解に苦戦していたことがあり、1年目にエレガントなコードを書く先輩Aがいらっしゃり、先輩Aは開発フェーズまで当プロジェクトまでしかいないこともあり、テストフェースになると別プロジェクトへ移ってしまい、UTで先輩Aの書いたコードからバグが見つかり、修正を任された時にコードの内容が理解できず、苦しいコードリーディングでした（軽微なバグでしたが）
また、私自身は市場価値的にジュニアレベルに相当するので、早い内にミドルレベル、ゆくゆくはシニアレベルまで行きたいです。
エレガントなコードを書いていた先輩Aはよりエレガントに書いているんでしょうか？
ちなみに、先輩A曰く最新情報をキャッチするイノベータータイプではなく、アーリーアダプタータイプのようです。
MacBookでtreebagを動かす方法

大学の講義でjavaアプリケーションの[treebag](https://people.cs.umu.se/drewes/treebag/)をMacBookで動作させる際に少し詰まったのでメモとして記事を作成しました。

### 結論 cmdで java -jar treebag.jarで動作した
cmdでtreebag.jarをダウンロードした場所に移動し、以下のコマンドで動作した。
```shell
$ java -jar treebag.jar
```
jarファイルの実行方法を忘れてましたね。


### Windowsではクリックしていくだけで動作する
Windowsではエクスプローラのtreebag.jarをダブルクリックで起動させてworksheetを読み込めば、基本的には動作する。(treebagの[Manual](https://people.cs.umu.se/drewes/treebag/treebag-manual.pdf))

### Macではクリックするだけでは動作しない
```
Parsing of '/Users/**/Desktop/worksheets/chapter2/cc-algebra' failed:
/Users/**/Desktop/worksheets/chapter2/cc-algebra (Operation not permitted)
```
とError messageが表示される。



以上、MacBookでtreebagを動作させる方法でした。
Image Completion（画像補完）にすごいモデル「RealFill」が公開されました

GoogleResearchは2日前に、最新の画像生成（補完）モデル「RealFill」を公開しました。
これは複数枚の参考画像を使って、不完全な画像を補完するモデルです。精度は驚くほど高いです。
画像補完はこれまであまり進化されていない分野で、従来のやり方はCNNモデルを使用して、不完全な画像から完全な画像へのマッピングを直接学習する感じで補完してます。
処理時間短いですが、複雑な画像の補完には向いていませんでした。イメージとしては以下の画像のようなシンプルなタスクに使われていす。
![10-3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/d7ae20f0-c2c0-a7a3-1f5b-f64517a9bd02.png)



去年からDiffusionモデルが流行し、ノイズを加えた後で元の状態に予測して復元する方法なので、難しいタスクにも対応できるようになりました。ですが、復元する際のランダム性が高いために、この部分のチューニングが難しいです。生成された画像が元の画像とかなり異なることも少なくないです。（よくあるのはStable DiffusionのInpaintingです）

 

RealFillは微調整したDiffusionモデルで、復元の品質が大幅によくなりました。
一番変わったところは、Seedの選び方です。出力画像と参照画像間の特徴関係を、Googleが定義した指標（Correspondence-Based Seed Selection）で数値化しました。
具体的には、まず複数枚の出力画像を生成し、それらを{lout}という集合にまとめて、その後各loutの生成画像と元の参考画像間の特徴関係をLoFTRというツールを使ってSeedごとの指標を計算します。（Google独自のアルゴリズムで）
最終的には、Seedの指標を高い順に並んで、最も良いSeedで出力画像を選択します。

 

⇩に載せた画像は、左から順に参考画像、正解となる画像、RealFillで生成した画像、PaintbyExampleで生成した画像、StableDiffusionInpaintingで生成した画像を並べたものです。モヤがかかっていない部分が生成された部分です。例を見ると、RealFillでは位置関係などもかなり正確に生成できていることが分かります。
![10-3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/c4a6a324-b9ba-17e6-0bdb-e9857fd0b895.png)


 

興味ある方は下の記事を参考してください
https://gigazine.net/news/20231001-realfill-photo-fill-ai/
https://arxiv.org/abs/2309.16668
https://realfill.github.io/
LLMのハルシネーション（勝手に事実と違う情報を出力）問題を減らす手法「CoVe」について試しました

ハルシネーションとは、LLMが嘘の情報を出力する問題です。
いつもLLMの大きな課題の一つでしたが、最近METAがこの問題を解決する新たな手法「CoVe」を公開しました。
一言でいうと、LLMに自身のハルシネーションを認識させて減らす方法となります。
METAがLlama2 65Bで試した結果は、精度が0.17から0.36に大幅上がりました。
![MicrosoftTeams-image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/ad94dcf0-6fcc-7dfd-75da-6df9e47cc01f.png)

まずCoVeの具体的な流れについては、
①初期回答を作成
②検証計画（検証用の質問）を作成
③検証（回答・合意確認）
④最終回答を作成
以上の内容をpromptに追加することで実現します。

 

例のprompt:
「
質問:「XXXXXXX」は何ですか

 

以下の処理手順を参考して答えを生成してください。
# 処理手順
1. まずは上記の問いに対して、回答の初稿を作成してください。
2. 回答を細かく分解して複数の小さな問い（検証質問）を生成してください。
3. それぞれの小さな問いに対して細かく回答してください。
4. 小さな問の答えから、もう一度、質問に対して答えください。
　」

 

興味ある方は試してみてください
論文:https://arxiv.org/abs/2309.11495
EDAの段階でよく使われるライブラリについてご紹介します。

私よく使っているのは以下の3つです。

 
①pandas-profiling
こちらは結構前からあったライブラリで、ご存じの方も多いと思います。
私にとっては定番のライブラリみたいで、基本データをもらった時には一回これを実行して、全体像を把握します。
importして呼び出すと、以下のようなOutputが表示されます。
![MicrosoftTeams-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/6afdeaf5-8d07-519d-f47a-e1e61319b1f3.png)

 

②Sweetviz
pandas-profilingより機能が多いですが、少し重いです。
*特徴としては二つのデータセットを比較できます。（trainとtestの比較とか）
![MicrosoftTeams-image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/1fbeadd5-6a1a-8c4e-e4f9-b6837c16ba27.png)

 

③pandasGUI
こちらはレポートの生成ではなく、操作可能なGUIを生成します。
Excelのピボットみたいな機能もあって、ピボットよりは使いやすいです。
![MicrosoftTeams-image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/99def832-e918-8a02-6c9a-afff54c04448.png)

 

pandas-profilingやSweetvizとpandasGUIを組み合わせてEDAをすると、かなり効率的に作業を進めることができます。
その後の特徴エンジニアリングの参考にもなりますので、ぜひ試してみてください。

 
https://github.com/pandas-profiling/pandas-profiling
https://github.com/fbdesignpro/sweetviz
https://github.com/adamerose/pandasgui
Godot4.1で遭遇した諸々のメモ

Godot4.1（正確には4.1.1）で遭遇したお作法なのか不具合なのかわからない事象のメモ。

# なんかシーンファイルが壊れる
https://github.com/godotengine/godot/issues/64330
事象としてはこれっぽい。
調べた感じだと、後述のpreloadによる循環参照にも関係あるっぽい模様。

# preloadを使って循環参照すると、instantiateしたノードのスクリプトが空になる
https://github.com/godotengine/godot/issues/76641
経緯としては以下の感じ。

1. エディタを開きなおすと時折シーンが壊れて読み込めなくなる（開きなおす前にファイルをいじってはいない）。
1. 閉じる前にファイルを開いておいて、エディタを閉じた際に勝手にファイルが更新されないことも確認（＝ファイルそれ自体の問題ではない）
1. 継承シーンの問題かとも思った（もともと継承シーンが読み込めなくなっていた）が、複製したシーンでも発生。
1. とりあえず究明は置いといて動作確認を進めてたら、なんかinstantiateしたオブジェクトのスクリプトが空になっていることが判明。
1. エディタ起動時にエラーメッセージが出てたのに気づいたのでぐぐる。結果、どうもpreloadにバグがあるっぽいと判明。
1. URL先を読んだ感じ、どうもpreloadというかUIDキャッシュ周りにそもそも問題があるっぽ。

なので、問題の大本はどうも一緒っぽいと思いつつ、解決されるまでは循環参照をしないコードにするしかないかなあ。

# 子から親の処理を呼ぶ方法
色々ある（autoloadにしたりとか）ようだけど、emit_signal飛ばしてやるのがよさそう。

まず、子にシグナルの定義とemit_signal（シグナル発火）を書く。
シグナルに引数も持たせられる（複数個も可）。

```gdscript:child.gd
signal fire(arg1, arg2)

func _ready():
    emit_signal("fire", 1, 2)
```

親で呼びたい関数を作り、connectで接続する。
子ノードがすでに存在しているなら${子ノード}.connectで直接connectすればいい。
instantiateしたノードなら、add_childの直前（直後でもいいらしいけど、自分はいまのところ直前派）にconnectしてやる。
子ノード指定でconnectしてないと、親がシグナル拾ってこれないので注意。
```gdscript:parent.gd
var child_scene = preload("res://scenes/child.tscn")

func _fire(arg1, arg2):
    print(arg1)
    print(arg2)

func _ready():
    # 存在する子ノードを使うケース
    $child.connect("fire", Callable(self, "_fire")) # すでに存在する子ノードのシグナルを拾う

    # 新たにinstantiateした子ノードを使うケース
    var child = child_scene.instantiate() # 子ノードをinstantiate

    child.connect("fire", Callable(self, "_fire")) # 子ノードのシグナルと接続
```
月別シートのある共有用Googleスプレッドシートでの小技

GSSのURLって、シートごとに振られています。  
だから、共有シートだとそのURLを共有しておくにも、どれかのシートのURLを共有しちゃっていることになります。

月次でシートにわけてる議題スプレッドシートなんかだと、共有している皆のブックマークとかカレンダーメモとかに入っているURLが昔の月のものだと、毎回面倒なんですよね。開くたびに昔のシートが開いて、それで最新月のところまでスクロールして切り替えて⋯と。
<img width=308 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852/ecc12a4a-1283-dcc7-c10c-b4cdaa32ffb9.png"><br>

皆のブックマークが常に最新月シートを指すようにしてみよう
---

1. まず現時点でいちばん新しいシートををコピーします  
<img width=270 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852/096bcd05-460b-16a6-3c87-b7a4d1e36875.png"><br>
2. ちなみに、皆がブックマークしているのは、この現時点でいちばん新しいシートです  
<img width=405 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852/bed7b521-a894-5c6c-1f32-7d6b9812e9ef.png"><br>
3. 普通にやると、コピーで作った新しいシートを最新月シートにしたくなっちゃうのですが、そうではなく、**コピー元の方を最新月用にする**ことにして改名します  
<img width=402 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852/5a799bb8-21f2-d2f9-fb97-dee104bbde55.png"><br>
4. **コピーの方を保存版**ということにして「のコピー」をはずす改名をします
<img width=354 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852/a8280a74-dc50-9c3a-990f-b96b675c46bb.png"><br>

これで、皆の共有しているブックマークは最新月を指したままシートの月次更新ができました！
ESP32に繋いだタンブラスイッチ切換えでdeepsleepのWakeupをするソース

最近ESP-NOWを使って独自のスマートホーム環境を検討しているのですが、やはり屋内照明には
従来からあるスイッチがあった方が家族の批判をかわすのには良い策だと思っています。
なので自作照明にはヒモでON/OFFするキャノピスイッチを付けているのですが、その仕組みでは
クリアできない「壁面(タンブラスイッチ)が普通だろ？」的な場所のクリアが課題でした。

今まで壁スイッチを検討してきたのですが、イロイロと難敵がいました。
スマートホーム照明の壁スイッチでの難敵
　１：照明から壁までの距離が長くDIYケーブル配線は見た目が汚い
　　　　対処：照明と壁スイッチを無線で対処する。
　２：壁スイッチの無線化には電源が必要
　　　　対処：電池駆動での運用を検討、電池寿命及び電波混信対策としてESP8266機を使う
　　　　　　　通信手段はESP-NOWで電池寿命延長にはDeepSleepで対処します。
　３：壁スイッチは「Panasonic WN5001010」風でないと一般人に受け入れられない（今回UPDATE!!）
　　　　対処：ESP8266をESP32に変更して、GPIOの状態変化でDeepSleepから復帰する

とまぁ、こんな感じでボチボチ進んできた所です。



#ESP32環境で必要なリソース
　　ESP32（DeepSleep時に無駄な電力消費しない周辺機器の付いてない奴）
　　スイッチ２ケ（壁面スイッチをそのまま使う予定）
　　プルダウン抵抗２ケ（ON時に電力消費するので不具合の出ない限りは高い方が良い）
　　3.3V電源

#配線
　　pin32/pin33とGNDの間に抵抗を繋ぐ（プルダウン抵抗）
　　pin32/pin33と3.3Vの間にスイッチを繋ぐ
　　参考＞＞https://plaza.rakuten.co.jp/foxbat/diary/202209010000/

#機能
　　今回「Panasonic WN5001010」をスイッチを２個ON/OFFする事を想定しています。
　　pin32/pin33のスイッチを切り換える度にDeepSleepからWakeupします
　　あと1000秒毎にDeepSleepからWakeupします
　　DeepSleepに移行する前に1000秒後とpin32/pin33状態に沿ったWakeup条件を設定します。
　　※２スイッチ同時の切り替えをしても検知できません。


```ino:ESP32deepsleepSWITCH.ino:
void setup(){
  pinMode( 32, INPUT );
  pinMode( 33, INPUT );
  Serial.begin(115200);
  // 起動要因に合わせて動作する
  esp_sleep_wakeup_cause_t wakeup_reason = esp_sleep_get_wakeup_cause();
  switch( wakeup_reason ){
  case ESP_SLEEP_WAKEUP_EXT0:   // スイッチ切換えでWakeupした
    Serial.printf( "GPIO32:%s\n", (digitalRead(32)==LOW?"LOW":"HIGH") );
    break;
  case ESP_SLEEP_WAKEUP_EXT1:   // スイッチ切換えでWakeupした
    Serial.printf( "GPIO33:%s\n", (digitalRead(33)==LOW?"LOW":"HIGH") );
    break;
  case ESP_SLEEP_WAKEUP_TIMER:  // TIMER TIMEUP
    Serial.printf( "timer wakeup\n" );
    break;
  default:
    Serial.printf( "power on\n" );
    break;
  }
  // 現状のスイッチHIGH/LOWが切り替わるとDeepSleepから復帰する
  esp_sleep_enable_ext0_wakeup( (gpio_num_t)32, (digitalRead(32)==LOW?1:0) );     // GPIO32 / 1:Low ⇒ High 2:High ⇒ Low
  if( digitalRead(33)==LOW )
       esp_sleep_enable_ext1_wakeup( 0x200000000, ESP_EXT1_WAKEUP_ANY_HIGH );     // GPIO33 / Low ⇒ High
  else esp_sleep_enable_ext1_wakeup( 0x200000000, ESP_EXT1_WAKEUP_ALL_LOW  );     // GPIO33 / High ⇒ Low (ALL_LOWだけど・・
  // 今後の機能の為にTIMER WAKEUPは検討しておく
  esp_sleep_enable_timer_wakeup( 1000 * 1000000 );   // 1000秒毎に一応起動する
  // DeepSleepを開始する
  esp_deep_sleep_start();
}

void loop(){
}
```

あとがき
　　一応スイッチの切り換え時にESP32がWakeupする様になりました。ESP-NOWメッセージを
　投げてまたDeepSleepへ移行すれば一応の壁スイッチ完成になります。その後はESP32への
　電源回路をどうするかの検証を始める予定です。動くのなら18650電池直結で終わらせたい）
　あと、３スイッチ化できないか検討したのですが、上手い方法が見つかりません・・・
ハイブリッドワークも寂しくないCCoE内コミュニケーションの話

# はじめに

コロナが少し落ち着いてきた今、日本でもハイブリッドワークを行っている企業が増えているように感じますが、実際にハイブリッドな働き方をしているとこんな悩みをお持ちではないでしょうか？

- リモートワークやハイブリッドワークだとコミュニケーションをとる事が難しいと感じている
- 現場メンバーでコミュニケーションを取る場（MTG）を作りたいが、どれくらいの頻度でやればいいのか悩んでいる
- 上司と話すタイミングが中々取れないけど連絡するきっかけがない

弊社でもハイブリッドワークを取り入れており、個人の働き方に合わせて出社と在宅を組み合わせて勤務しております👨‍💻

私は今月入社をしたばかりで、まさに上記のような不安を抱えていました:fearful:
そんな私が弊社CCoEで行っている寂しくならないコミュニケーションについて紹介します！

:::note warn
- 今回は社内でのコミュニケーションを想定して記載しています。
- 個人の感想が含まれますので、温かい目で読んで頂けますと幸いです。
:::

# コミュニケーション活動のポイント
主に、コミュニケーションの活動として行っているのは３つです。

:::note info
1. メンターを入社日に新メンバーに紹介する
1. CCoEコミュニケーション会を毎日開催
1. 毎週上司との1on1を実施する
:::

それでは、１つずつ順に紹介していきます！
## Point1：メンターを入社日に新メンバーに紹介する

特に入社初日は不安いっぱいで出勤します。
そんな日の最初に、メンターが誰かを明確に伝えてもらえると新メンバーは非常に安心します:blush:

入社翌日からもしリモートワークとなった場合でも”**〇〇さんに聞けば（チャットで連絡すれば）大丈夫！**”と思えることで些細な質問について連絡を躊躇してしまうことなく新メンバーから連絡をしやすくなります。

## Point2：CCoEコミュニケーション会を毎日開催

弊社のCCoEでは、毎日30分~1時間のコミュニケーション会と呼んでいる、チーム会を開催しています。（通称：コミュ会！）

毎日1時間？！長い:grimacing:と思われたと思いますが、もちろん毎日ではありませんのでご安心ください。月曜日とそれ以外でコミュ会の用途を分けております。

- 月曜日（所要時間：1時間) ：週の初めに案件全体の進捗を確認する場
- 火曜日～金曜日(所要時間：30分) ：個人のタスクや悩み相談等を行う場

毎日チームのメンバーと話す時間があるのでまだ職場に慣れていない状況でも **”だれが、どんなことをやっているのか”** を知ることが出来ますし、自分自身のタスクについても状況を伝えやすい空気を作れると思います。

また、入社初期に苦戦する社内用語については早いタイミングで分からない用語に気づくことができますし、毎日耳にしていると自然に覚えてくるので業務に入りやすくなります。

また、コミュ会では「[oVice](https://www.ovice.com/ja/overview
)」という仮想オフィスサービス内の会議室を使ってMTGを行っています。
ゲームの中に参加するような感覚で会議に参加することが出来るためコミュニケーションのハードルを下げることができてると感じています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/d19e588d-1e3a-dcce-f311-218b7a705700.png)




## Point3：毎週上司との1on1を実施する

毎週１回30分間マネージャーとの1on1を実施しています。

ハイブリッドワークの場合、お互いに出社していないと上司と顔を合わせることがないため
気軽に話をするといった時間が取れないケースも多いかと思います。

その為、いざ話したいと思ったとしても普段からお話をしていないと声を掛けることそのものへのハードルがどんどん上がっていきますよね。
（チャットのテキストを打っているだけで憂鬱:sob:・・となったりするのは悲しいですよね）

そんな悩みを解決するのが定期的な1on1です！
必ず毎週1on1があるので、自分から連絡することを躊躇してしまっても必ず週に１度直接伝えることができます。

弊社では、1on1に「[Kakeai](https://kakeai.co.jp/)」というサービスを利用しています。

サービス内にテーマを登録できる仕組みがあります。選択出来る項目は以下（一部抜粋）です。

- 業務の進捗や進め方
- 人間関係
- 心身の状態
- プライベート
- キャリアについて　　　等

マネージャーへ事前に話したいテーマを伝えられる為、メンバーとしても相談したいことを
事前に整理した状態で望むことが出来る点も個人的には良い思っています。

1on1を実施することでマネージャーを近すぎず遠すぎずの程よい距離で信頼関係を築く事が出来るのではないでしょうか！

# 最後に

働き方が時代とともに変化するのと同様に、コミュニケーションの取り方も
時代の流れに沿ってどんどん変化していくのが当たり前だと思っています。

その時代とチームにあった最適なコミュニケーションの形をこれからも模索していきます！
皆様の業務でのヒントになる箇所がありましたら幸いです。

# :sparkles:弊社では一緒に働く仲間を募集中です:sparkles:

現在、様々な職種を募集しております。
カジュアル面談も可能ですので、ご連絡お待ちしております！

募集内容等詳細は、是非採用サイトをご確認ください。
https://engineer.po-holdings.co.jp/
【GAS】ISBNコード10桁・13桁の相互変換

<!-- wp:paragraph -->
<p>書籍を一意に識別するIBSNコードの桁数を変換するGAS（Google App Script）サンプルコードです。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="wp-block-heading">はじめに</h2>
<!-- /wp:heading -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>書籍を一意に識別するISBNコードですが、以下のように10桁と13桁の2種類があります。</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:image {"align":"center","id":96,"width":347,"height":175,"sizeSlug":"full","linkDestination":"none","style":{"color":{"duotone":["#000000","rgb(231, 231, 231)"]}}} -->
<figure class="wp-block-image aligncenter size-full is-resized"><img src="https://mastajim.com/wp-content/uploads/2023/10/SnapCrab_NoName_2023-10-3_13-18-15_No-00-1.png" alt="" class="wp-image-96" style="width: 347px; height: 175px;" width="347" height="175" /></figure>
<!-- /wp:image -->

<!-- wp:list -->
<ul><!-- wp:list-item -->
<li>自分はメルカリによく書籍を出品しているのですが、ISBNコードの10桁と13桁で検索エンジンを検索＆出品情報を作成しており、その過程でISBNコードの10桁/13桁を相互変換する機会が多かったので桁数を変換するスクリプトを作成しました。</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<h2 class="wp-block-heading">サンプルコード1（ISBNコード10桁を13桁に変換）</h2>

```javascript
/**
 * ISBN-10からISBN-13に変換
 */
function isbn10to13(isbn10) {

  // ISBNが数値型だったら文字列に寄せる
  isbn10 = (typeof isbn10 == "number") ? isbn10.toString() : isbn10;

  // 桁数が異なる場合は何もしない
  if (isbn10.length != 10) {
    return isbn10;
  }

  // 先頭に978をつけて末尾のチェックディジットを外す
  let isbn13 = "978".concat(isbn10.substring(0, 9));

  let digit = 0;

  for (let i = 0; i &lt; isbn13.length; i++) {

    let no = isbn13.substring(i, i + 1);

    if (((i + 1) % 2) == 0) {
      digit += (no * 3);
    } else {
      digit += (no * 1);
    }
  }

  digit = digit % 10;
  digit = 10 - digit;

  isbn13 = isbn13.concat((digit == 10) ? 0 : digit);

  return isbn13;
}
```

<!-- wp:heading -->
<h2 class="wp-block-heading">サンプルコード2（ISBNコード13桁を10桁に変換）</h2>
<!-- /wp:heading -->

```javascript
/**
 * ISBN-13からISBN-10に変換
 */
function isbn13to10(isbn13) {

  // ISBNが数値型だったら文字列に寄せる
  isbn13 = (typeof isbn13 == "number") ? isbn13.toString() : isbn13;

  // 桁数が異なる場合は何もしない
  if (isbn13.length != 13) {
    return isbn13;
  }

  // 先頭の978と末尾の1桁チェックディジットを外す
  let isbn10 = isbn13.substring(3, 12);

  let digit = 0;

  for (let i = 0, j = 10; i &lt; isbn10.length; i++, j--) {

    let no = isbn10.substring(i, i + 1);

    digit += no * j;
  }

  digit = digit % 11;
  digit = 11 - digit;

  switch (digit) {
    case 10:
      digit = "X";
      break;
    case 11:
      digit = "0";
      break;
    default:
      digit = digit;
  }

  isbn10 = isbn10.concat(digit);

  return isbn10;
}
```
【学習メモ】EC2におけるよく使うIAMポリシー

AWSのEC2ハンズオンをやるとき、いろんなIAMポリシーに触れて、それらのメモを残したいと思います。

# CloudWatch関連

### CloudWatchAgentAdminPolicy
EC2内にCloudWatchAgentをインストールし、そこからCloudWatchへログを送信できるような「初期設定」のためのポリシー（初期設定の権限と送信する権限）

### CloudWatchAgentServerPolicy
EC2内にCloudWatchAgentをインストールし、そこからCloudWatchへログを送信できるための運用上のポリシー（送信する権限のみ）

# セッションマネージャー関連

### AmazonSSMManagedInstanceCore
セッションマネージャーでEC2へSSH接続できる権限のポリシー

# System Manager関連

### AmazonEC2RoleforSSM
System ManagerでEC2サーバーを管理できる権限のポリシー

# これからどんどん追記していく
8th Wallで 動くBIOカードを作る(その５) 

# この記事でやること
前回の記事で、8th Wallのプロジェクトに新たな画像、動画を追加します。今回はソースを修正し、実際にカメラで撮影して動かしてみます。

# もとにしたサンプルプロジェクトの動作について
ここまでで説明をすっ飛ばしたのですが、参照したサンプルプロジェクト「A-Frame: Image Targets Flyer」には次の２パターンの挙動を含んでいます。
1. カメラでターゲット撮影し、3Dイメージを表示させる
1. カメラでターゲット撮影し、アニメーションを表示させる

今回は2つ目のアクションで利用されているファイルを、事前に用意した画像・動画に差し替えます。

# ソースの修正手順
１．まずはエディター画面で`body.html`のソースを選択してください。ソースを表示させたあと、記述されているファイル名を次のように編集します。(画像赤枠の箇所を参照)
+ video-thumbnail.jpg → thumbnail01.jpg(BIOカード認識時の画像)
+ jellyfish-video.mp4 → Movue01.mp4(BIOカードをアニメーションさせた動画)
![editor2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/82a0cde8-1744-a3db-1921-818f4dc51b22.png)
２．次にソースの下方に記述されているターゲットの名称を編集します。
+ video-target → biocard01
編集後、画面上部の「Save + Build」をクリックします。
![editor4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/1cccbfb7-f365-5dcf-1f74-52c8b8583677.png)
３．ビルド完了後、プレビューボタンをクリックするとテスト用のQRコードが表示されるので、スマホで読んで確認してみます。(リンクは開発中のみ有効です)
![editor5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/03d09d5c-2e2d-dd01-f0db-b2f0ccb30c6a.png)
４．8th Wallを起動してテストしてみます。

https://twitter.com/MinakuchiyaEnl/status/1709062223908458711?t=T4o_eUrOKHg-F5hu4lyc4w&s=19

# カードを公開する
自分以外の人がこのアプリを確認するためには「公開」が必要です。

１．画面右上の「反映」をクリックします。
![editor6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/0b8202d6-d0f7-ecb2-daac-aef2cab6ccfa.png)

２．変更内容のコメントをメッセージ欄に記載します。今回は初期登録としておきます。続けて「ファイルの反映と公開」ボタンを押下します。
![editor7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/6f1b6e2f-64ed-02d8-4efe-8fc9ff86b895.png)
３．プロジェクトの公開を完了するのポップアップが表示されます。ここでカバー画像を指定します。事前に用意しておいた1200 × 630 サイズの画像を利用します。下記の画像は黄色の画像を設定しているのではなく、何かしらのファイルをアップロードしないと進めません。
![publish1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/7378f160-54b2-e453-8825-5b5ea3b226f7.png)
４．カバー画像をアップロードし、表示位置を調整後、確認ボタンを押下します。
![publish3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/797ca1a2-3c51-3d48-0db8-3d599e03936a.png)
５．カバー画面が設定できたら、公開に進みます。画面が変わってURLが表示されれば完了です。
![publish4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/7510e6fa-8aaa-68c7-3a04-48742cc9163b.png)

# URLのシェア方法
公開用のURLはダッシュボードで確認できます。スマホでショートリンク、もしくはQRコードからアクセスすると8th Wallが起動します。手元のカードが動くことを試してください！
![dashbord.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/aa7cd562-4d92-9c7f-c98f-8a043d7cf048.png)

以上が、動くBIOカードの作成手順です。アプリのQRコードをBIOカードの裏面に印刷してしまえば、渡した相手はすぐにカードが動くことを確認できます。(維持費や印刷の都合、なかなか踏み切れませんが)
ぜひみなさんも作成していただき、Ingressライフをエンジョイプレーしてください。
8th Wallで 動くBIOカードを作る(その４)

# この記事でやること
前回の記事で、8th Wallのサンプルプログラムをクローンして、新しいプロジェクトを作成しました。今回はプロジェクトに新たな画像、動画を追加します。

# 8th Wall プロジェクトの画面説明
まずは最低限知っておきたい画面のボタンの説明です。
![menu1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/e804fe79-e6d5-67ca-e52b-4236259b1656.png)

### ①エディター表示ボタン
アップロードされている、ソースコードや画像ファイルの参照画面(上記画像で表示中のモード)に切り替えます。
### ②ターゲット設定画面ボタン
ターゲットとなる画像を設定する画面に切り替えます。
### ③Save + Buildボタン
編集した内容を保存し、実行可能な状態にビルドします。
### ④プレビューボタン
テスト実行用のQRが表示され、動作確認を行います。テスト実行は一時的なもので、開発者自身しか確認できません。
### ⑤反映ボタン
編集した内容を確定し、公開準備状態にします。確定した内容は版数管理されます。
### ⑥公開ボタン
ダイアログが開き必要情報を設定したあと、一般公開可能な状態で発行されます。URLをシェアすれば、誰でも確認可能な状態になります。

# 素材をアップロードする
では作成を進めます。まず、画面左側の[Asetts]の並びにある「+」ボタンを押下します。ポップアップメニューが開きますのでアップロードを選択します。
![myproject5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/1810cabd-a078-632d-0be5-8578a6050eac.png)
ここで次の２ファイルをアップロードします。
+ BIOカードをアニメーションさせた動画 (Movie01.mp4)
+ BIOカード認識時の画像 (thumbnail01.jpg)

正常にアップロードできればファイル名追加されます。ファイル名をクリックすると、画面中央の領域に画像・動画が表示されます。
![myproject6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/3da834e8-d2f5-7536-5a79-2201c4825c94.png)

# ターゲットを設定する
次に画面左側の◎印「②ターゲット設定画面ボタン」を押下し、画面を切り替えます。

１．[新規イメージターゲットの作成]-[平面]をクリックします。
![myproject7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/da5c65a1-01b9-48fe-aebf-3849e32ce788.png)
２．「平面イメージターゲットのアップロード」のポップアップが開きます。作成しておいた「BIOカードの画像 (biocard01.jpg)」をアップロードし、次へで進みます。
![myproject8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/eff5a66d-fc09-6639-57cf-787fca86e40e.png)
３．読み取り位置の調整を行います。カード幅にトリミングしているため、このままで作成に進みます。
この時、読み取り画像より枠を狭めてしまうと、実行時の動画が実カードとぴったり合わなくなるので注意します。
![myproject9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/78b543ff-c7e4-c5db-023d-b41665834c60.png)
４．ターゲットのアップロードが完了すると確認画面が表示されます。QRよ読み取り、カメラでの認識をテストすることができます。
![myproject10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296487/efc483c0-198a-575d-1bca-dbfb15fa0b02.png)

ここまででプロジェクトへの素材追加が完了しました。次回はプログラムソースを手直しし、実際に動作させてみます。
(次の記事へ続く)

https://qiita.com/minakuchiya/items/8d37916912a7065dd390
CLIがsfdxからsfに変わった



+ [Move from sfdx (v7) to sf (v2)](https://developer.salesforce.com/docs/atlas.en-us.sfdx_setup.meta/sfdx_setup/sfdx_setup_move_to_sf_v2.htm)

現在使用している場合SFDX(v7) に移行することを強くお勧めします。SF(v2)。移行は簡単です。まずアンインストールします。SFDX(v7) をインストールしてから、SF(v2)。移動後も、ターミナルで実行していた CLI コマンドや継続的インテグレーション (CI) スクリプトは、引き続き以前と同様に機能します。

+ [Warning: Deprecated environment variable: SFDX_JSON_TO_STDOUT. Please use SF_JSON_TO_STDOUT instead.](https://qiita.com/Keiji_otsubo/items/84d0733749d63597ad7b)

+ [The "force data soql query" command has been deprecated. Use "data query" instead.](https://qiita.com/Keiji_otsubo/items/40ecd2422c42bd665368)

+ [sf (v2) is Generally Available #2132](https://github.com/forcedotcom/cli/issues/2132)

sf(v2)についての簡単なメモ:

+ sfdxまたはのいずれかに答えますsf。たとえば、sfdx version は と同じ情報を返しますsf version。
+ 既存の CLI と同じコマンドとプラグインを認識します。
+ プラグインのコピーが 1 つだけ含まれているため、サイズが 40% 小さくなり、ダウンロードとアップデートが高速化されます。
+ sfdxプラグインをインストールすると、 またはのいずれかでアクセスできますsf。したがって、どのようにインストールしたかを思い出す必要はありません。
+ 7 月 12 日以降、新しいバージョンsfdx(v7) は公開されなくなりました。引き続き使用できますが、新機能やバグ修正は含まれません。
CasADiやIPOPTでHSL(Harwell Subroutine Library)を使う

# HSL(Harwell Subroutine Library)とは

HSLはIPOPT等で使用できる線形ソルバーのライブラリです。

https://www.hsl.rl.ac.uk/

# どうやったら使えるの
HSLライブラリにはアカデミックライセンスと法人ライセンスが存在します。
IPOPTやCasADiで使うのであれば下記のリンクからライセンスを選択して購入することができます。
学生ライセンスであれば情報を入力して1日〜２日程度でダウンロードリンクが届きます。
アカデミックライセンスは、再配布不可で個人的な利用に留める必要があります。

https://licences.stfc.ac.uk/product/coin-hsl

# HSLをビルドする
この章ではCasADiでの使用を前提としたHSLのビルドを行います。
coinhsl-2023.05.26.zipのような名前のファイルをダウンロードします。
ビルドするためにThirdParty-HSLというビルドツールを使用します

https://github.com/coin-or-tools/ThirdParty-HSL

```
git clone https://github.com/coin-or-tools/ThirdParty-HSL
```

`coinhsl-2023.05.26.zip`を解凍してフォルダ名を`coinhsl`に変更して`ThirdParty-HSL`フォルダ以下に配置します。
配置したらビルドします。`./configure`でインストール先を`/usr/local/coinhsl`に設定しています。

```
cd ThirdParty-HSL
./configure --prefix /usr/local/coinhsl
make
sudo make install
```

`/usr/local/coinhsl/lib`以下に`libcoinhsl.so`が生成されますが、CasADiは`libhsl.so`を検索するためシンボリックリンクを貼ります

```
cd /usr/local/coinhsl/lib
sudo ln -s libcoinhsl.so libhsl.so
```

ライブラリのパスを通します。
```
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/coinhsl/lib
```

毎回呼び出したくない場合は`.bashrc`に追記しても良し
```
echo "export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/coinhsl/lib" >> ~/.bashrc
```

# CasADiを使う
もしCasADiをまだインストールしてない場合はインストールしてください。C++で使用する場合は以下のシェルスクリプトを例にビルドしてください

https://github.com/Kotakku/OptimLibSetupHub/blob/master/CasADi/install_casadi.sh

倒立振子をMPCで振り上げる例を以下に用意したので動作確認として使用できます。

https://github.com/Kotakku/simple_casadi_mpc

実行すると以下のようなアニメーションが実行されます

![cartpole.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207366/4a9fc767-de39-bcb7-1a30-8a9bbc08e3d6.gif)

# CasADiでHSLを使う
`simple_casadi_mpc`の`cartpole_mpc_example.cpp`をHSLを使うように変更する方法を説明します

```C++
    MPC mpc(prob);
```
の行を以下のように変更します
```C++
    auto ipopt_dict = MPC::default_config();
    ipopt_dict["ipopt.linear_solver"] = "ma57";
    MPC mpc(prob, "ipopt", ipopt_dict); 
```
デフォルトのソルバーは`mumps`になっています。

HSLで使用できるソルバーは`ma27`, `ma57`, `ma86`, `ma97`などです。

とりあえず`MA97`, `MA57`を使用する。大規模な問題に対しては`MA86`を使用するのがおすすめなようです。

https://www.hsl.rl.ac.uk/catalogue/hsl_ma57.html

https://www.hsl.rl.ac.uk/catalogue/hsl_ma86.html

https://www.hsl.rl.ac.uk/catalogue/hsl_ma97.html

## トラブルシューティング(最適入力が0のまま、コアダンプする)
libhsl.soのパスが正しく設定できていないことが多いです。ビルドの章を確認して`LD_LIBRARY_PATH`の確認やライブラリ名が`libhsl.so`になっているかを確認してください。
`ipopt.print_level`を設定すると原因を確認できるようになります。

```c++
    auto ipopt_dict = MPC::default_config();
    ipopt_dict["ipopt.linear_solver"] = "ma97";
    ipopt_dict["ipopt.print_level"] = 5; // ログを出力するように設定
    MPC mpc(prob, "ipopt", ipopt_dict); 
```


# パフォーマンステスト
`carpole_mpc_example`の実行時間をソルバーごとに確認します。

## 環境
- ThinkPad E14 Gen 2
- Ubuntu 22.04
- CPU: Intel i7-1165G7 (8) @ 4.700GHz
- Memory: 16GB

## 条件
- horizon長さ: 30
- サンプリング時間: 50ms
- シミュレーションサンプリング時間: 10ms
- シミュレーション長さ: 800

以上の条件でシミュレーションの開始から終了までの時間を5回計測しました。

![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207366/b5b56b95-d074-4bf3-88cc-a1622a3564fd.png)

8秒分のシミュレーションを全て4秒未満で計算できています。
MA97, MA57, MA27が優勢ですね。
MA86はもっと巨大な問題を並列計算させれば有利になると思います。

# 疑問点
MA86とMA97はOpenMPで並列化してるとのことだったがこのページの手順で並列計算がちゃんと有効になってるのかは確認できてない。
Local版VSCodeServerのインストール方法

自分のLocal環境でVSCodeServer動かして、ブラウザ開発できるVScode。
Dockerで開発用ライブラリ含めまとめて構築して使っています。

お手軽に使ってたのですが、現在**非推奨になってます!!**
https://code.visualstudio.com/blogs/2022/07/07/vscode-server

>We've released changes to how you can connect to the VS Code Server since this blog was >published. Check out the December 2022 blog post for the latest guidance.
>>このブログの公開以来、VS Code サーバーへの接続方法の変更をリリースしました。最新のガイダンスについては、2022 年 >>12 月のブログ投稿をご覧ください。

久しぶりに新規インストールしようとしたらエラーが出て気づきました。

以下だとインストールファイルではなくHTMLがダウンロードされ、実行時にエラーになります。
`wget -O- https://aka.ms/install-vscode-server/setup.sh | sh`

色々調べると今でもLinux版ならインストールできましたが、かなりお手軽からは離れてしまいました。。。。。
この方法もいつまで使えるか不明ですが。。。。


# インストール方法紹介 Linux版
公式インストール方法は使えないので、ソースファイルを手動で手に入れて手動でインストールします。
私の場合はDocker内にインストールしています。

*mvss_setup.sh*
```
#!/bin/sh

INSTALL_LOCATION="/usr/local/mvss"

mkdir $INSTALL_LOCATION
cd $INSTALL_LOCATION

ARCH=x64 # x64 or arm64
HASHKEEY=$(curl https://update.code.visualstudio.com/api/commits/stable/server-linux-$ARCH-web | cut -d '"' -f 2) # 2番目のキー取得
INSTALL_URL=https://az764295.vo.msecnd.net/stable/$HASHKEEY/vscode-server-linux-$ARCH-web.tar.gz

wget "$INSTALL_URL"
tar -zxvf vscode-server-linux-$ARCH-web.tar.gz -C ./ --strip-components 1
```


### ダウンロード先ですが段階を踏む必要があります。
1. CPUアーキテクチャを選択します。 Intel&AMDはx64で、MacM1やRaspberryPiとかはarm64になるかと思います。
1. update.code.visualstudio.com/～にアクセスして、アクセス文字列のリストを取得します。
1. 複数のアクセス文字列ります。上記サンプルスクリプトでは2番目を使用します。(追加情報有)
1. ここまでの情報からダウンロードURLを作ってダウンロードします。

:::note info
最近スクリプト動かしたら、エラーになりました。2番目のアクセス文字列が無効だったようです。アクセス文字列は大量にあるので、2番目がダメでも、他の物を使用すれば問題なくダウンロード可能(適当に10個目にしたらOK)でした。何らかのダウンロードエラーが起きた場合は、上記スクリプトの動作を手作業のブラウザで実施し、ダウンロードが成功するかチェックしてみて下さい。
:::

### ダウンロードしたら解凍します。
1. tarの解凍、第一階層のフォルダいらないのでstrip-componentsで消してます。
1. 必要に応じて実行権限(chmod x)をしてください。私は不要でした。
1. ./bin/code-server で起動できます。


### 起動コマンド
/binの場所や起動ポートは適時変えてください。

```
/usr/local/mvss/bin/code-server serve-local --host 0.0.0.0 --port 9090 --accept-server-license-terms
```

起動時のメッセージ中に初回アクセスURLが出ているので、そこに初回アクセスが必要です。
上記を飛ばして任意のURLにアクセスすると、404？だったかな?のエラーになります。


## 参考サイト:Installing code-server downloads a HTML file #8768
> Installing code-server downloads a HTML file #8768
> https://github.com/microsoft/vscode-remote-release/issues/8768



# おまけ：Dcokerfileで構築時にVSCode拡張までいっきに入れる
code-serverコマンドのパスは適時インストール場所に読み替えてください。
```
RUN set -ex \
	&& /usr/local/mvss/bin/code-server serve-local --install-extension aaron-bond.better-comments --accept-server-license-terms \
	&& /usr/local/mvss/bin/code-server serve-local --install-extension esbenp.prettier-vscode --accept-server-license-terms \
	&& /usr/local/mvss/bin/code-server serve-local --install-extension formulahendry.auto-close-tag --accept-server-license-terms
```
素数の計算速度比較

# 素数と暗号
素数といえば暗号に使われていることで有名。
例えば、DVDのCSS暗号化では40bit（約13桁）の素数が使われ、
現代のRSA暗号では1024bit（約309桁）の素数が使われる。
※2048bitもある。
で、現代のパソコンでどのぐらい計算時間がかかるのかを知りたくて、計算をしてみた結果です。

# 素数の規則性
素数には一見規則性がないように思われるが、円周率との関係性が見つかっている。
https://analytics-notty.tech/relationship-between-pi-and-prime-numbers/
```math
\frac{\pi^2}{6}=
\prod_{p}^{}\frac{1}{1-\frac{1}{p^2}}=
\frac{1}{1-\frac{1}{2^2}}
*\frac{1}{1-\frac{1}{3^2}}
*\frac{1}{1-\frac{1}{5^2}}
*\frac{1}{1-\frac{1}{7^2}}
*\frac{1}{1-\frac{1}{11^2}}
*\frac{1}{1-\frac{1}{13^2}}
*\frac{1}{1-\frac{1}{17^2}}
 \dotsm
```
※シグマ∑の積バージョンは、パイΠ。エクセルでは、PRODUCT()が用意されている。

# 計算速度比較
条件：processing4.2を使用
使用機材：MBP M1プロセッサ
①アルゴリズムの道具箱　（臨時別冊・数理科学）よりpp.120-121掲載の方法９のコード
②https://qiita.com/nprimem/items/0a94e753ab5de7a7bb94 のコメント欄にあるコード

追記
③下記投稿をprocessingに変更
https://qiita.com/Liberty/items/9514f3c29f2ffb5019d5

```java:③
int num = 1000000000;
num = (num - 3) / 2;
boolean[] pList = new boolean[num];

for (int i = 0; i < num; i++) {
  pList[i] = true; // 1:素数、0:非素数
}

int count = 1; // 素数2
for (int i = 0; i < num; i++) {
  if (pList[i] == true) {
    int pNum = i + i + 3;
    //println(pNum);
    count++;

    for (int j = i + pNum; j < num; j += pNum) {
      pList[j] = false;
    }
  }
}
println("pNumberCount -> " + count);

println(millis());
```

# 比較結果
|  |10^8|10^9|
|:-:|:-:|:-:|
|①|0.669|3.387|
|②|0.756|5.651|
|③|0.662|5.432|

単位は秒

# 考察
①のコードは本の著者が頑張ってエラトステネスの篩を最適化したもの。②のコードもかなり高速である。計算時間が１秒以下になると、javaの準備の誤差が目立つ。計測値は、何度か計測して、最短時間を採用した。10^10も試したいが、javaで配列サイズがint型の最大値までなので、計算できなかった。これ以上になると、メモリ確保できない問題も生じる。

並列計算のアルゴリズムを探す。
桁数問題を解決するアルゴリズムを探す。（pythonがいいのか？）

# 結論
９桁の素数は、現代(2023)のパソコンで3.4秒で数え終わる。

# 時代
①は2000年に出版されており、実行環境はSun SPARC station 10とある。調べると40MHz時代。intelだと486時代か。出版年にしては古い環境を使っている印象。その環境で10^8が６０．６８秒かかっている。それと比較すると、計算速度は90倍。並列計算できないので、シングルスレッド性能になる。クロックだけで100倍になるはずだが、１秒以下の計測は、なにかおかしいのだろう。もしくは、javaが遅いのか。

この本では別のアルゴリズムで10^12以下の計算をしたと記載されているので、現代なら10^14ぐらいまでなら、現実的な時間で計算できるのではないかと思う。１4桁に比べ、309桁とはかなり大きいと思うが、それでも、いつか、たどり着くのだろう。

# その他
１は素数ではない、とか、素数の定義が言語によって決められているとか。それでも、πとの関係式があるとか、不思議な感じがする。素数の定義はもともと言語と数学的に決めたとはおもうが、現在では「円周率πとの関係式が成り立つ」という定義が可能だから、もともとの定義を考えだした時点で間違っていないというのがすごい。


こんなのもあった。(javascript)
Qiitaで自作の素因数分解プログラムを公開したら添削されて30倍速くなった件
https://qiita.com/TETSURO1999/items/a51747cfac9f89b51a11

# 素数表
は９桁以下の素数は、以下から取得できる。1.16MB
https://www.usamimi.info/~geko/arch_acade/elf009_prime/list.html