OmniAICreator/Qiita-1.07M huggingface dataset:
2022/11/26主にITとかセキュリティの記事

公開資料に個人情報、秘匿不十分で参照可能に - 三重大
https://www.security-next.com/141655

ワクチン接種委託先、情報共有ツールを公開設定で使用 - 奈良県
https://www.security-next.com/141657

Alert Noiseに惑わされてはいけない!(11/24)
https://note.com/nice_cosmos263/n/n491c99b02561

ALSI　外部メディアに関する利用実態調査の結果を発表
～21.6％の法人が外部メディアに書き出す情報を「管理していない」と回答～(11/24)
https://prtimes.jp/main/html/rd/p/000000130.000025498.html

Fenbushi Capital幹部、約60億円分のUSDC盗難被害(11/24)
https://coinpost.jp/?p=410118

インフォスティーラー『DUCKTAIL』による被害が拡大、1件あたり数十万米ドルの被害に
～ 今夏以降、攻撃手法がより進化し、より巧妙に ～(11/24)
https://prtimes.jp/main/html/rd/p/000000347.000001340.html

セキュリティ分野でキャリアアップするには--5つのアドバイス(11/24)
https://japan.zdnet.com/article/35196287/

＜Kaspersky Security Bulletin：2023年APT攻撃の動向予測＞新たなWannaCryやドローンを使用した近接ハッキングが起こる可能性を予測(11/24)
https://prtimes.jp/main/html/rd/p/000000329.000011471.html

「サービスとしてのスティーラー」で5000万件のパスワードが盗まれる(11/24)
https://japan.zdnet.com/article/35196489/

モードツー、CMSセキュリティ強化ツールを導入--ウェブサイトの運用管理を内製化(11/24)
https://japan.zdnet.com/article/35196492/

近年のDNSはプロトコル拡張が活発すぎる!?　現時点で意識しておくべきリソースレコードとは
ドメイン名を使っている企業・組織にも知ってほしいDNSの最新事情(11/24)
https://internet.watch.impress.co.jp/docs/event/1458019.html

史上最大のDDoS攻撃に使用された「Mirai」ボットネットとは？　攻撃手法やIoT機器に与えた影響を解説(11/24)
https://ascii.jp/elem/000/004/114/4114245/?rss

第202回：欧州連合サイバーセキュリティ機関による年次報告書（2022年版）(11/24)
https://www.risktaisaku.com/articles/-/74453

FTX、破産申請後に暗号資産の大規模不正流出が判明(11/23)
https://zuuonline.com/archives/242701

FTX破綻、Mt.Gox破綻よりも仮想通貨エコシステムへの影響は比較的少ないか(11/24)
https://jp.cointelegraph.com/news/crypto-survived-worse-than-the-fall-of-ftx-chainalysis

破綻ＦＴＸ、資産流出の恐れ 不正アクセス、返還に影響も(11/23)
https://www.shinmai.co.jp/news/article/CNTS2022112300186

経営破綻の暗号資産大手「FTX」 サイバー攻撃受け資産流出(11/23)
https://news.yahoo.co.jp/articles/fabeb16659919bce0deff2969b02eb68e9d2d4ef

Mt. Gox事件に関係したとされる仮想通貨ウォレット、1万BTC移動(11/24)
https://jp.cointelegraph.com/news/10-000-btc-moves-off-crypto-wallet-linked-to-mt-gox-hack

産業用制御システム攻撃の歴史から学ぶ--サイバーセキュリティ4つの教訓(11/24)
https://japan.zdnet.com/article/35196369/

ウクライナ侵攻の裏で、世界的なサイバーテロ
日本にも波及した大規模な破壊攻撃の顛末と手口(11/16-11/17開催)
https://logmi.jp/business/articles/327626

サイバー攻撃受けた菱機工業、社内システムの障害続く(11/24)
https://xtech.nikkei.com/atcl/nxt/news/18/14187/

北朝鮮のハッカー集団　「中学生の頃から育成し、家族を人質に外国で活動させている」専門家が解説(11/24)
https://news.yahoo.co.jp/articles/5e3be8731ccedc9f696222f9df9e375793cc1d60

「AWSがブロックチェーンに戦略的投資を行わなかった理由」をAWSの元ヴァイスプレジデントが明かす(11/24)
https://gigazine.net/news/20221124-aws-blockchain-tim-bray/

世界屈指の電波望遠鏡 サイバー攻撃で先月から観測できず(11/24)
https://www3.nhk.or.jp/news/html/20221124/k10013902651000.html

BTC-e取引所関連ウォレットから1万ビットコインが送金される(11/24)
https://nextmoney.jp/?p=54866

分散型アイデンティティー（Decentralized Identity）(11/21)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/111400128/

Web会議の音声が途切れる　原因はルーターの新機能(11/25)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800004/111600058/

衛星ブロードバンド「Starlink」が日本進出(11/25)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800012/111600190/
朝食の時間が3分伸びる（vscode拡張機能）

## 起動時のターミナル分割とコマンド実行を自動化
<b><a href="https://marketplace.visualstudio.com/items?itemName=EthanSK.restore-terminals">「Restore Terminals」</a></b>
![qiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951361/82a586d5-1028-445d-ce53-91db74b25522.gif)
簡単な設定のみで`任意のコマンドを実行`・`ターミナルの分割`ができます！
<b>早速、セットアップをしていきましょう！
## MarketPlaceにて下記をコピペ
```
restore terminals
```
## 下記をインストール
![Screenshot 2022-11-26 at 0.37.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951361/ac00e42b-7e53-16ac-9980-dabb6f2e9d78.png)
## 設定
 <b>共通の設定</b>
`settings.json`に記述

<b>個別で設定</b>
`.vscode/restore-terminals.json`に記述
`restoreTerminals.terminals`を`terminals`に変更
### ①画面内で分割する例
<b>以下のコードは一画面が三つに分割される</b>
```json:settings.json
 "restoreTerminals.terminals": [
    {
      "splitTerminals": [
        {
          "name": "🍎",
          "commands": ["echo 1"]
        },
        {
          "name": "🍌",
          "commands": ["echo 2", "git init"]
        },
        {
          "name": "🐡",
          "commands": ["echo 3", "npm init -y"]
        },
      ]
    },
  ]
```
### ②複数タブを開く例
<b>以下のコードはタブが３つ作成される</b>
```json:settings.json
  "restoreTerminals.terminals": [
    {
      "splitTerminals": [
        {
          "name": "🦍",
          "commands": ["echo 1"]
        }
      ]
    },
    {
      "splitTerminals": [
        {
          "name": "🍌",
          "commands": ["echo 2"]
        }
      ]
    },
    {
      "splitTerminals": [
        {
          "name": "🙈",
          "commands": ["echo 3"]
        }
      ]
    }
  ]
```
<b>その他の設定について（詳細は<a href="https://github.com/EthanSK/restore-terminals-vscode/blob/master/sample-test-project/.vscode/restore-terminals.json">サンプル</a>をご参照ください！）</b>

>**_起動時に実行せず、自分でターミナルを開いた時実行_**
runOnStartup: false
**_コマンドを貼り付けるだけで実行はしない_**
shouldRunCommands: false
**_既存のターミナルを閉じずに実行_**
keepExistingTerminalsOpen: true
**_遅延して実行（下記だと3秒）_**
artificialDelayMilliseconds: 3000

##### 以上で終わりです
##### ありがとうございました＞＜
## 参考記事

https://github.com/EthanSK/restore-terminals-vscode

https://marketplace.visualstudio.com/items?itemName=EthanSK.restore-terminals
MySQLインストール時にデータベースの初期化で失敗する

<INS><h2>概要</h2></INS>

MySQLをインストールしようとしたところ、Initializing databaseにて以下のようなエラーが発生してしまいました。

```
the configuration for mysql 8.0.31 has failed
```
![スクリーンショット (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2963387/5292f846-1749-f479-a710-9f64ffc0d152.png)


解消までに少し手間取ったので、私と同様の現象になってしまった方の参考になればと思います。

<INS><h2>環境</INS></h2>

Windows11

<INS><h2>結論</INS></h2>

MySQLのアンインストールおよび再起動後、再インストールすると解決しました。

<INS><h3>アンインストール方法</h3></INS>

https://pentan.net/windowsserver-mysql-uninstall/

<INS><h3>インストール方法</h3></INS>

https://style.potepan.com/articles/17602.html

参照元：https://stackoverflow.com/questions/51138896/initializing-database-failed-in-mysql-server-8-0-111-on-windows-7-64
Railsで判定機能を作って遊ぶ[Find the missing letter]

# ルール
```
アルファベットが順番に定義された配列が存在する.
だが、順番の中で1つ抜けているものがあるからそれを特定する。
大文字・小文字のパターンがあるので注意する。
```

# テストコード

```
Test.assert_equals(find_missing_letter(["a","b","c","d","f"]), "e")
Test.assert_equals(find_missing_letter(["O","Q","R","S"]), "P")
Test.assert_equals(find_missing_letter(["b","d"]), "c")
Test.assert_equals(find_missing_letter(["a","b","d"]), "c")
Test.assert_equals(find_missing_letter(["b","d","e"]), "c")
```

# リファクタリング前の判定メソッド
次のアルファベットを判別するために、ハッシュで次のアルファベットを取れるように定義した。
この時に、小文字のパターンしか考えてなかったから、後から大文字パターンも定義したのでソースコードの重複と雑なif文が生まれてしまった。
一旦テストは通ってるからリファクタして重複とハッシュを定数として別に定義したいところ

```ruby
def find_missing_letter(fml)
  keys = ('a'..'z').to_a
  values = ('b'..'z').to_a.push('a')
  ary = [keys, values].transpose
  downcase_check_hash = Hash[*ary.flatten]

  keys = ('A'..'Z').to_a
  values = ('B'..'Z').to_a.push('A')
  ary = [keys, values].transpose
  upcase_check_hash = Hash[*ary.flatten]

  list = []
  result = []

  if downcase_check_hash.include? fml.first
    fml.each do |word|
      if list.empty?
        list << downcase_check_hash[word]
      elsif list.last == word
        list << downcase_check_hash[word]
      else
        return downcase_check_hash.key(word)
      end
    end
  else
    fml.each do |word|
      if list.empty?
        list << upcase_check_hash[word]
      elsif list.last == word
        list << upcase_check_hash[word]
      else
        return upcase_check_hash.key(word)
      end
    end
  end
end

```

すこしだけ綺麗に

```ruby
def find_missing_letter(fml)
  char = fml[0]
  fml = fml.map(&:downcase)

### {"a"=>"b", "b"=>"c", "c"=>"d" ....}のようなhashを作ろうとしてた。
  keys = ('a'..'z').to_a
  values = ('b'..'z').to_a.push('a')
  ary = [keys, values].transpose
  check_hash = Hash[*ary.flatten]
### ~~~

  list = []
  result = []

  fml.each do |word|
    if list.empty?
      list << check_hash[word]
    elsif list.last == word
      list << check_hash[word]
    else
      return keys.include?(char) ? check_hash.key(word): check_hash.key(word).upcase
    end
  end
end
```

### そもそもこれで行けるのか...

```ruby
def find_missing_letter(arr)
  ((arr.first..arr.last).to_a - arr).first
end
```
Flutter入門　サイト

https://udemy.benesse.co.jp/development/app/flutter-intro.html

https://zenn.dev/kazutxt/books/flutter_practice_introduction/viewer/01_chapter0_aboutme


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


https://qiita.com/mkosuke/items/7957e71968aefc6558be

https://qiita.com/ekzemplaro/items/3c57e66460f76a664e87
TypeScript参考サイト


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

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

https://www.youtube.com/watch?v=kd8VH10jXwc&list=PLX8Rsrpnn3IW0REXnTWQp79mxCvHkIrad


https://qiita.com/S42100254h/items/5f284b3e86cdbd5a5787?utm_content=buffer581f6&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer#5%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AA%E3%82%AA%E3%81%AE%E8%AA%B2%E9%A1%8C


https://zenn.dev/yumemi_inc/articles/js-front-constants-a1fb3c49eb1199

https://qiita.com/S42100254h/items/5f284b3e86cdbd5a5787?utm_content=buffer581f6&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer#5%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AA%E3%82%AA%E3%81%AE%E8%AA%B2%E9%A1%8C


https://atmarkit.itmedia.co.jp/ait/articles/2301/20/news006.html#_ga=2.87678365.469114552.1674393383-1763075561.1647833802
マイコン開発環境をローカルを汚さずに作る(WSL)

# はじめに
大学の授業でArduino UNO3を使う機会があったのですが、どこを見ても環境を汚す事が前提となっており、環境潔癖症患者の私には到底耐えられませんでした。なのでなんとか試行錯誤して病状を悪化させない環境を作りました。マイコン内で開発する案は考えはしましたが筐体依存性が高くなるためやめました。

# 最終地点
1. ローカル環境を汚さない
1. VScodeの強力な支援機能を使ってArduino開発をする(C++)
1. pythonとの間でシリアル通信をできるようにする
1. sqliteにシリアル値を保存する

# 環境
windows11 22H2

# 使うもの
WSL Ubuntu(なんでもいい)
VScode
PlatformIO
python(sqlite)

# Dockerで環境構築出来なかった
マイコンとはUSBで接続をして開発すると思うのですが、ハードウェア的通信はDockerコンテナをパススルー出来ないようで、コンテナにこもった時点で不可能なのは確定したようです。
# WSL上でUSBを認識させる
[WSLでUSB認識をしよう](https://qiita.com/KMNMKT/items/ae0e76a3e420b3ca16e6)で詳しく書きましたが、wsl上ならまだデバイスが認識できたので、WSL-Ubuntu上に環境を確保しようと思います。具体的な手順は記事を見てください。
# マイコン環境セットアップ
WSLでVScodeを開きます。
```bash:WSL
cd /your-project-root/
code .
```
wsl環境にVScodeの拡張機能をインストールしましょう。
- PlatformIO
- C++
- python
- あとはお好みで

ここで**ローカル(windows)でVScodeを開いて**PlatformIOをインストールして、
画面左側のメニューバーからPlatformIOのアイコンをクリックし、`Open>New Project`からプロジェクトを作成しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2034739/f712a13c-da92-72bc-9502-3f21bc1bb90f.png)
Nameは好きに設定し、Boardは`Arduino UNO`、locationはチェックを外してプロジェクトのディレクトリを選択します。
権限の関係かわかりませんが、僕の環境ではWSL上で開いた場合、ディレクトリが選択できませんでした。

ディレクトリに`platformio.ini`というファイルが生成されたと思うので、今度は**WSLでこのディレクトリをVScodeで開く**と、拡張機能が有効になります。

# Python環境セットアップ

このpython環境もWSL環境にたてないとシリアル通信が出来ないので、仕方なく設定します。ディレクトリはどこにおいても大丈夫です。platformIOのプロジェクトと同じ階層にフォルダを置くと開発するときに便利でいいですよ。

## 大注意
pythonでシリアル通信をする際にpyserialというライブラリを使うのですが、管理者権限がないと動作しません。プログラムをsudoで走らせると、python環境ごと管理者仕様に変化して、ライブラリが読み込めない場合があります。なので必要ライブラリをインストールする際は`sudo pip install -r requirement.txt`と管理者権限のpython環境にライブラリをインストールしましょう。pipがインストールされてない場合は`sudo apt install pip`です。そしてプログラムを走らせる場合も`sudo python3 <プログラムのパス>`で実行してください。
# 最後に
プロジェクトのサンプルをおいておきます。以上の手順を踏んだ後であればうまく動くと思います。ありがとうございました。

https://github.com/Mkamono/arduino-python-on-wsl
[学生必見] サービスを無料で運用する

# はじめに
学生や社会人の方でも個人開発したプロダクトを運用するのにお金がかかってしまってませんか？特に学生の方ならクラウドサービスに払うお金もバカにならないです。できる限り無料でサービスを開発、運用するためのTipsを紹介します

# クラウドサービス
クラウドサービスといえば、以下の三つになりますが他にもたくさんの企業から様々な種類のサービスが登場しています
*  GCP
* AWS
* Azure...

# 事例
今回はハッカソン時にAzureの提供があったためコスト度外視で作成したプロダクトを無料で運用できるようにした事例をもとに紹介します。
## 改善前の構成
詳しい構成は [note](https://note.com/nanndemokakuyo/n/nec16a73d950cd) に載っていますが、一部抜粋して紹介します。
### 改善前構成図
![改善前.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1128363/ec217dd8-fcd1-e16e-381d-2ee6f7ba6d6e.png)



* APIGateway的役割
    * Azure Virtual Machines
* 画像生成処理
    * Azure Virtual Machines
* DB(MySQL)
    * Azure SQL database
* 画像保存DB
    * Azure Blob Storage
* データ処理API
    * Google App engin
* フロントエンド(React App)
    * Vercel

上記のような構成になっており、Vercel以外は全て有料のものを使っていました。これをそのまま運用しようとすると、放っておくだけでもかなりの金額がかかってしまいます。

## 改善の方針
マイクロサービス的に運用していたのでモノレポにし１つのインスタンスで完結させればかなり費用が抑えれるのですが、今回は一円も払いたくないかつコードの改変もしたくない！というモチベーションでした

## 改善案
### DB
データベースは大きく分けてSQL系とNoSQL系に分かれます。今回はMySQLを使用していたので、NoSQL系データベースの代表格であり、無料枠があるFireStoreは使えません。しかしながらFirebaseは、無料で使える良いサービスなので設計の段階でNoSQL取り入れていれば採用するべきだと思います。SQL系のクラウドサービスはほとんどのものが有料です。herokuが提供してるPostgreSQLのサービスも先日のHeroku無料プランの廃止により有料化されました。現状SQL系のサービスで無料枠があるのはPlanetScaleです。PlanetScaleはMySQLのようなデータベースです。MySQLとの違いとしては、少しだけ使えない機能があったり、追加されている機能があります。少し特性を理解する必要はありますが代替としては優秀です。

また、Azure Blob Storageに保存していた画像データはGCPのCloud Storageに移行しました。5GBまで無料で保存することができます。AzureのSDKからGCPのSDKへと変更し少しだけコードの改変をする必要がありますが、数行変えるだけで大丈夫です。

### API
自作のAPIも昔はとりあえずHerokuに置いておけば無料でしたがその時代は終わってしまいました。しかしながらAzure App Serviceには無料のインスタンスF1があります。AzureのApp ServiceはPythonやJavaといった主要言語から最近ではGoにも対応したPaasです。コンテナをデプロイする機能もありコンテナ化すればどの言語でもデプロイすることができます。
今回は、PythonとGoのAPIをデプロイする必要があったためPythonはそのまま、Goに関してはAzure App Serviceは対応したばかりであり安定性に難があったためコンテナとしてデプロイしました。

## 改善案まとめ
### 改善後構成図
![改善後.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1128363/240c78c1-9f45-4971-26d5-3ee46ef6780e.png)


* APIGateway的役割
    * Azure Virtual Machines→Azure App Service
* 画像生成処理
    * Azure Virtual Machines→Azure App Service
* DB(MySQL)
    * Azure SQL database→Planet Scale
* 画像保存DB
    * Azure Blob Storage→Cloud Storage
* データ処理API
    * Google App engin→Azure App Service
* フロントエンド(React App)
    * Vercel(そのまま）
# 最後に
今回そのまま運用すれば月数万円かかるサービスを無料で運用する過程を紹介しました。サービスは運用してこそ意味があります。だからこそいつの日かサービスにユーザがついた時サービスを継続して動かせるということも重要です。無料だからといってスケールアウト、スケールアップできないサービスを使ってしまうと意味がありません。Azureは無料インスタンスから必要があればスケールアップ、スケールアウトが簡単にできます。いつの日かユーザがつくまではお財布に優しくサービスを運用しましょう。

# 今回使用したサービス
### PlanetScale 
https://planetscale.com/
### Azure
https://azure.microsoft.com/ja-jp/
### Vercel
https://vercel.com/dashboard
### GCP
https://cloud.google.com/free?utm_source=google&utm_medium=cpc&utm_campaign=japac-JP-all-ja-dr-bkwsrmkt-all-all-trial-e-dr-1009882&utm_content=text-ad-none-none-DEV_c-CRE_602341291618-ADGP_Hybrid%20%7C%20BKWS%20-%20EXA%20%7C%20Txt%20~%20GCP%20~%20General_cloud%20-%20platform-KWID_43700071566182770-aud-970366092687%3Akwd-87853815&userloc_1009507-network_g&utm_term=KW_gcp&gclid=CjwKCAiA-dCcBhBQEiwAeWidtXnXDuZXgJb4cPHQGE8-sCXzrhgy3M62zVVNJHRZqvKmjmq9r-DjkhoC4FMQAvD_BwE&gclsrc=aw.ds
CUDAデバイスの選択方法

# CUDA_VISIBLE_DEVICESとは
複数のGPUを持った計算機の中で，使用したいGPUを指定したい場合に使用します．

# 方法1
コマンドプロンプト内でCUDA_VISIBLE_DEVICESを指定します．
```
CUDA_VISIBLE_DEVICES=0 python_name.py
```
# 方法2
プログラムファイル内(例：python)でCUDA_VISIBLE_DEVICESを指定します．
```python
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'

# 以下処理を記入
```

# 備考
GPUを複数使用したい場合はカンマ(,)を使用します．
方法1，方法2の両方で使用可能です．

### 方法1
```
CUDA_VISIBLE_DEVICES=0,1 python_name.py
```
### 方法2
```python
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0,1'

# 以下処理を記入
```
Railsのcase文で色々遊ぶ

# 遊ぶ
暇だったので色々rubyの問題を解いていたのだが、こういう簡単なお題でも色々書き方があって面白い。


```
#### ルール
下記4つの文字列をもとに計算するメソッドを作る。

iは値を+1
dは値を-1
sは値を二乗
oは値を配列に出力

#### 条件
1. メソッド名はparseで、ランダムなStringの値が引数としてくる。
2. idso以外の文字列も引数として与えられるため、紛れ込んでても対応する
```

テストの値

```ruby
    expect(parse("ooo")).to eq([0, 0, 0])
    expect(parse("iiisdoso")).to eq([8, 64])
    expect(parse("ioioio")).to eq([1, 2, 3])
    expect(parse("idoiido")).to eq([0, 1])
    expect(parse("isoisoiso")).to eq([1, 4, 25])
    expect(parse("codewars")).to eq([0])
```



# 答え


答え1

```ruby
def parse(data)
  list = []
  sum = 0

  data.split('').each do |x|
    case x
    when "i"
      sum += 1
    when "d"
      sum -=1
    when "s"
      sum = sum * sum
    when "o"
      list << sum
    end
  end

  list
end
```

答え2
俺的には答え2の方がclassとか使ってて色々応用効きそうなソースコードで好き。
メソッド定義するだけだから答え1で問題ないけれども。

```ruby
class Deadfish
  def initialize (commands)
    @result = []
    @current = 0
    @commnads = commands.chars
  end
  
  def i; @current += 1 end
  def d; @current -= 1 end
  def s; @current *= @current end
  def o; @result << @current end
  
  def method_missing *; end
  
  def parse
    @commnads.each{|cmd| send cmd}
    @result
  end
end

def parse(data)
  Deadfish.new(data).parse
end
```
[SDGsか？]ASUS TransBook T101HAにLubuntuを入れる話[すべて利活用]

自分用メモです。

手元のT101HAが限界で、だけど、捨てるのはもったいない・・・
新しいタブレットもほしいけどなぁ・・・・

ってな状況。週末に会社のPCを持ち歩くのもやだ。じゃぁそろそろLubuntuに入れ替えるチャンス！と思い。
久し振りのLinuxマシン構築でウキウキしてます。

SDGsだなぁ・・・（棒読み）

手順は以下の通り。

# 1. T101HAのWindows用回復ドライブ作成

一応、今後のため、T101HAのWindows用回復ドライブを作成します。万が一の場合のために、念のため、ね。今後、メルカリで売るかもしれないし。
作り方はWindowsコマンドで回復ドライブ　で検索してみてください。USBメモリーはどうやら16GB以上が必要っぽい。
この前国際会議でもらった論文の入ったUSBメモリーを有効？に再利用。

ちなみに、作成には数時間要する模様。気長にお待ち下さい。

# 2. LubuntuのisoをUSBメモリに焼く

　Lubuntuのisoを落としてきて、rafusでUSBメモリに焼く。rafusは間違いなし。鉄板。
　違和感無く、　焼く　とか表現してしまいましたが、おっさんだろうか。

ちなみに本日は、lubuntu-22.04.1-desktop-amd64.iso　で調理してやります。LTSです。
これも、昔の国際会議でもらった論文入りUSBメモリーを活用。　8GBでなんとかなりそう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391326/c7dad551-3bdd-f316-c288-83e17deafb65.png)

設定はすべてデフォルトでいけました。

# 3.　USBキーからブート

USBキーをさして、電源をいれて、f2キーを連打、BIOS画面でBoot Sequenceを変更。
なんか、この設定、毎回デフォルトに戻っちゃう気ががするんだけど、気のせいだろうか。

んで、無事USBメモリからブート。さて、これからWindowsパーティションを消しに行きます。さらば。

### ちなみにLive USBとして何度もT101HAで試してLinux実用性目処を立ててから覚悟を決めました。

# 4. パーティションの設定

32GBのマイクロSD入れっぱなしだったことに気づいてややはまる。EFI慣れてない・・・

1 mmcblk1 58.24GiB(/dev/mmcblk1) 
　FAT32で、/boot/efi にマウント  
  bootフラグ　400MB
　残りはext4で/


なお、念のためですが、ここまでの作業は顔を90度回転させるか、ディスプレイを物理的に90回転させて作業します。

# 5.　とりあえず起動

さて、ここからが問題。画面が回転している。T101HA用のインストール方法をいろいろみたんだけど、どうもうまくいかん。

1) まずは画面をrotateさせる。

とりあえず qterminalを立ち上げて

xrandr -o right

この段階でようやく首が疲れなくなります。

2 xinputで関連するデバイスidを色々調べる。

マウス、タッチパッド、タッチパネルがもろもろぐちゃぐちゃなので、
修正するために情報が必要です。

3 xinputで修正

これがいろいろ時間かかりました。先人の皆様が記載していたデバイスIDがどうも違う、いろいろ試行錯誤し、
私の環境では以下のとおりで正常動作してくれました。

タッチパネルは

xinput set-prop "SIS0457:00 0457:11ED" 'Coordinate Transformation Matrix' 0 1 0 -1 0 1 0 0 1 


タッチパッドは・・・あれ・・USB Live Bootのときはおかしかったんだけど、いまはなぜか何も設定してなくても大丈夫・・・・ 　

xinput set-prop 13 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1

とりあえず↑の設定でしたが、いまは不要の模様・・・

4 コマンドの自動起動

とりあえず、

/etc/rc.localにシェルスクリプトを書いて、chmod 755。
 
ちなみに結果論的には、/etc/rc.localじゃ無くても、どこに置いても大丈夫でした。


```
#!/bin/bash
xrandr -o right
xinput set-prop "SIS0457:00 0457:11ED" 'Coordinate Transformation Matrix' 0 1 0 -1 0 1 0 0 1
```

ちなみにCoordinate Transformation Matrixのあとの定数ですが、

| cosθ  -sinθ 　　0 |
| sinθ　cosθ 　 0 |
| 0 　　0 　　　1 |

ってな行列を、

cos -sin 0 sin cos 0 0 0 1　　みたいに一行にして記載するみたいです。


次に、lxqt コンフィグレーションセンター　で→セッション→自動起動で、↑のスクリプトの自動起動を設定します。

ちなみに、設定は  .config/autostartに保存されます。



ってなわけで、これで無事、T101HAでlubuntuが使えるようになりました。

このままだとT101HAで一部のデバイスがまだ使えなさそうなので、また次回。


【参考文献】
https://qiita.com/shiroankuroan/items/21ea7c940a4d3fb5410d
https://hackheatharu.xyz/lubunutu-automatically-starts-vim-etc-when-pc-starts/
https://emiguelt.github.io/posts/2018/linux_on_asus_transformer_t100ha/
https://hackheatharu.xyz/lubunutu-automatically-starts-vim-etc-when-pc-starts/
SDL_CreateThreadでラムダ式・クラスメンバを呼び出し

# 内容
　SDLはC言語ベースのライブラリであり、C++のモダンな諸機能には対応していません。そんな中で、ラムダ式やクラスのメンバ関数を用いる方法についての備忘録です。
# まずはSDL_Threadの定義
　SDL_Threadのスレッド生成関数は以下のように定義されています。

```C
SDL_Thread* SDL_CreateThread(SDL_ThreadFunction fn,
                             const char* name,
                             void* data)
```

　この引数について、Wikiではfnはスレッドで実行する関数、nameはスレッド名、dataは関数fnに渡す引数であると説明されています。（ https://wiki.libsdl.org/SDL_CreateThread ）
　また、SDL_thread.hでは、第一引数の型`SDL_ThreadFunction`は、

```C
typedef int (SDLCALL * SDL_ThreadFunction) (void *data);
```

として定義されています。（ https://www.libsdl.org/tmp/SDL/include/SDL_thread.h ）
　なお、ここで出てきているSDLCALLは、`__cdecl`や`_System`としてDEFINEマクロで定義されている値です。
　つまり、`void*`を引数に取り`int`を返す関数のポインタであれば、`SDL_CreateThread`の第一引数として渡すことが可能になります。
# ラムダ式の扱い方
　キャプチャリストが空であるラムダ式は、引数と返り値の型が同じ関数ポインタに暗黙的に変換することが可能です。（ [https://riptutorial.com/ja/cplusplus/example/1970/関数ポインタへの変換](https://riptutorial.com/ja/cplusplus/example/1970/%E9%96%A2%E6%95%B0%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B) ）
　そのため、__キャプチャリストが空ならば__、単に`void*`を引数に取り`int`を返すようにさえすれば、ラムダ式はそのまま渡すことが可能ということになります。キャプチャリストは使えませんが、`SDL_CreateThread`の第三引数で引数を渡すことができるので、それによって困ることはあまりないでしょう。
　万一、どうしても必要になった場合は、ラムダ式を実行するコールバック関数を別に定義して使ってください。（参考：https://qiita.com/studiork/items/2d2951542d79cf94fb84 ）
# メンバ関数の扱い方
　皆さんご存知の通り、メンバ関数ポインタは普通の関数ポインタとは別物になるので、ラムダ式の場合と違って、そのまま渡すというわけには行きません。オブジェクトの情報を別で引数として受け取って、引数の情報を使ってコールバック関数内で呼び出すというワンクッションが必要になります。

```C++
class Foo{
public:
    int do_something();
}

Foo obj;

SDL_CreateThread([](void *arg)->int{
    Foo *p_obj=reinterpret_cast<Foo*>(arg);
    return p_obj->do_something();
    //return 0; //do_something()の戻り値がintでないとき
}, "ThreadName", &obj);
```

　多くの箇所で同様の処理を行う場合は、すべての場所でラムダ式を書くのは煩雑なので、同様の処理をテンプレート関数で書いて使う方が楽かもしれません。下の参考サイトは、そちらのアプローチをとっているので、必要に応じて参考にしてください。
（参考：https://kazuhooku.hatenadiary.org/entry/20110126/1296031454 ）

# あとがき
　この記事は古い下書きをそのまま公開しています。不足点等ある可能性がありますので、周辺情報の確認の上でご利用ください。また、もしも誤りや説明不足な点などありましたら、ぜひコメント頂ければと思います。
Elasticsearch.Netでの万能メソッド

# はじめに

以前[Elasticsearch.Netを使った基本的な操作の記述方法](https://qiita.com/dimanche/items/b476d3a81503347f6530)について書きましたが、公式ページでの使い方を具体的に実行するElasticsearch.Netでの関数を調べるのにかなり苦労していました。  
先日すべてのケースに通用するであろう関数を発見したので、それを記しておきます。

# 前提

## バージョンなど

- Elasticsearch: ver7.17.3
- Elasticsearch.Net: ver7.17.2

## コネクション
[前回](https://qiita.com/dimanche/items/b476d3a81503347f6530)も書きましたが、コネクションは以下のような感じで作成されているものとします。

```csharp
using Elasticsearch.Net;

string url = "http://localhost:9200";
var settings = new ConnectionConfiguration(new Uri(url));
var client = new ElasticLowLevelClient(settings);
```


# tl;dr; 万能関数

`DoRequest`関数を使います。

```csharp
var response = client.DoRequest<StringResponse>(
    Elasticsearch.Net.HttpMethod.PUT,
    "/oneday/_doc/eng",
    $@"{{
      {{""morning"": ""asa""}},
      {{""afternoon"": ""gogo""}},
      {{""evening"": ""yugata""}}
    }}"
);
```

見ればおわかりいただけると思いますが、念のため。

- 第1引数: Httpメソッドの種類。最後のPUTの部分を変更するだけ。
- 第2引数: コマンド部分。
- 第3引数: body(json)部分。

## 適用例

例として[indexTemplateを作成する](https://www.elastic.co/guide/en/elasticsearch/reference/7.17/indices-put-template.html)を実行するケースを考えます。  
以下のコードを実行すると、

```csharp
var response = client.DoRequest<StringResponse>(
    Elasticsearch.Net.HttpMethod.PUT,
    "/_index_template/template_1",
    $@"{{
      ""index_patterns"": [""te*""],
      ""priority"": 1,
      ""template"": {{
        ""settings"": {{
            ""number_of_shards"": 2
        }}
      }}
    }}"
);
```

indexTemplateが作成されました。

```shell
$ curl -X GET http://localhost:9200/_index_template/template_1
{
  "index_templates": [
    {
      "name": "template_1",
      "index_template": {
        "index_patterns": [
          "te*"
        ],
:
}
```
CMS とは

## 勉強前イメージ

コンテンツなんとかシステムだった気がする・・・
中身は知らん気がするわ

## 調査

### CMS とは

Contents Management System の略で
専門知識を持たない人でwebサイトやコンテンツの構築や更新ができるシステムのことです。
webサイトを作るにはサーバを構築したり、html,CSSなどの知識が必要です。
しかし、CMSを使うことで上記のような言語が使えずともテンプレートなどを使ってデータを入力することでwebサイトを作ることができます。

### CMSの機能

- コンテンツの作成・編集

CMSを使うことで言語が使えずともテンプレートを活用したりなどして
テキストやレイアウトなど見た目を確認しながら更新作業が可能です。
また、コンテンツを増やす場合もデザイン踏襲したまま新しいコンテンツの追加が可能です。

- プラグイン

機能を拡張するプラグインが用意されている場合もあります。
多言語対応や決済機能などもプラグインで追加することができ、機能が豊富なwebサイトを作ることができます。

- ユーザ管理

管理者権限やコンテンツ作成用権限などユーザごとの権限をカスタマイズすることができます。
そのため操作のミスなどで削除や誤った変更などをある程度防ぐことが可能になります。


### 代表的なCSMについて

- WordPress

最もシェアが大きく知名度が高いCSMになります。
オープンソースなので無料で使え、プラグインによるカスタマイズが豊富です。
しかしよく使われているということもあり攻撃が受けやすく、こまめにアップデートなどが必要になります。

- Drupal

世界中でで導入実績があるCMSになります。
デフォルト言語は英語ですが、44ヵ国語に対応しています。
また、webページを作成した際に自動的にSEO対策に最適なサイトの構造になっています。

## 勉強後イメージ

wordpresがCMSなのか！
簡単にサイト作れるやつってことね！

## 参考

- [CMSの基本的な機能とは？導入のメリットや種類と併せて徹底解説！](https://it-trend.jp/cms/article/function)
- [CMSとは？ 基本や導入メリットを初心者にもわかりやすく解説](https://blog.hubspot.jp/cms)
Macでファイルを選択すると「"xxx”は壊れているため開けません。 ゴミ箱に入れる必要があります。」と出る

Macでファイルを選択すると「"xxx”は壊れているため開けません。 ゴミ箱に入れる必要があります。」と出る

```
“kyomi_arukamo.png”は壊れているため開けません。 ゴミ箱に入れる必要があります。
```

![スクリーンショット 2022-11-26 0.05.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/f988e51f-e946-a610-34bd-f56150683c8b.png)


Application-->terminalから以下を実行すると出なくなる（壊れてる属性をクリアする？）

```
xattr -rc *.png
```

`-rc`は[こちら](https://qiita.com/KEINOS/items/e218c4d8da5451c9e59c)の記事によると、対象ファイル/ディレクトリのすべての属性を削除する。（ディレクトリの場合は）これを再帰的に行うという意味である模様。

```
     5番目の構文では、-c オプション（"clear"）を指定すると関連する値を含む、
     すべての属性が削除されます。

     -r  引数のファイルがディレクトリの場合、ディレクトリ内の全てのファイルに
         再帰的に適用されます。
```

# 参考

https://qiita.com/KEINOS/items/e218c4d8da5451c9e59c
【QGIS】GTFS-GOでバスルートを可視化する

## はじめに
この記事は#30DayMapChallenge2022 25日目の記事です。
テーマはColour Friday: 2 coloursです。
QGISを使ってバスルートを2色以上で可視化してみます。

![image](https://raw.githubusercontent.com/tjukanovt/30DayMapChallenge/main/images/flyers/30dmc-2022.png)

https://30daymapchallenge.com/

## QGISとは
フリーでオープンソースの地理情報システム
ほとんどのUnixプラットフォーム、Windows、macOS上で動作する

## GTFSとは
バス事業者と経路検索等の情報利用者との情報の受渡しのための共通フォーマットのこと。
2016年から国土交通省により標準化が進められている。
公共交通データのデファクトスタンダートであるGTFSを元に作られた。

https://www.gtfs.jp/

## 事前準備

既にインストール済みのQGIS（バージョン3.22.3）を使います。
QGISを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/13c801a9-4ba2-7996-cb45-16f32c999cd1.png)

## GTFS-GOインストール
GTFSデータをQGISで表示することができる「GTFS-GO」を利用します。
上のメニューバーの「プラグイン」から、「プラグインの管理とインストール」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/9a96bf75-332b-8142-89c0-a6f3e59e89c0.png)

GTFS-GOを検索し、「インストール」をクリックします。

![image](https://user-images.githubusercontent.com/83101503/204006050-0fb9f745-5d86-487b-9142-7cc7c328a98a.png)

インストールが完了すると、画面上にGTFS-GOのアイコンが表示されるようになります。

![image](https://user-images.githubusercontent.com/83101503/204006419-3a7c3c9a-1c70-422c-a7a8-5c39e1f44aa3.png)

## GTFSデータ表示
GTFS-GOのアイコンをクリックして、GTFS-GOを起動します。
リポジトリにプリセットを選ぶと、好きなGTFSデータを利用できます。
（私の環境だと、プルダウンがすぐに閉じてしまって選びにくかったです。。）

![image](https://user-images.githubusercontent.com/83101503/204007613-c2ab0b17-891f-413d-88ee-2260957e0470.png)

「QGISに読み込む」を押すと、バスルートをQGISで表示できます。

![image](https://user-images.githubusercontent.com/83101503/204008656-132416c6-1402-49b3-8c84-751091538544.png)

数回クリックしただけで簡単にバスルートを表示できました～
見た目もシンプルで綺麗なので、いろんな地図にのっけたくなります。
最寄りのバスルートも表示して、生活に役立てていきたい・・！

## 参考文献
https://www.gtfs.jp/

https://www.mierune.co.jp/blog/posts/k9s2tkoapgc?lang=ja

https://qiita.com/Kanahiro/items/976900c4e5542acfe29d
[Unity]オリジナルカーソルを表示しようとしてエラーが出た時の解決策

# 概要
![スクリーンショット 2022-11-25 23.12.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/3fbef0a8-d0fe-2b42-2310-e5f9e4dfee45.png)

Unityでオリジナルな見た目のカーソルを表示しようとしてエラーが表示されました。
Invalid texture used for cursor - check importer settings or texture creation. Texture must be RGBA32, readable, have alphaIsTransparency enabled and have no mip chain.
![スクリーンショット 2022-11-25 23.08.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f03e054a-2e40-cbf2-db27-7f49843b8c4f.png)


# 本文
カーソルのTexture設定をこんな感じにするとエラーが出なくなります。

Texture Type : Cursor
Alpha Is Transparency : ON
Read/Write : ON
Generate Mipmaps : OFF
![スクリーンショット 2022-11-25 23.09.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/9f6ccc80-f2a9-796b-eb72-bcc78c3e3467.png)
Zsh で docker compose を補完する

# まえがき

docker-compose が docker のサブコマンドになって久しいですが、Docker 公式が用意している Zsh 補完ではなかなかこのサブコマンドがサポートされません。
不便すぎるのでなんとかしたいのですが、とはいえ [Issue](https://github.com/docker/compose/issues/8550) とか見ているとそろそろ対応されそうな予感はするので、できるだけ手軽な方法でなんとかしたいなと思います。

# 補完の設定

怠惰な人の多くは以下のように `docker compose` コマンドのエイリアスを設定しているんじゃないかと思います。

```zsh:~/.zshrc
alias dc="docker compose"
```

これには自動で `docker` コマンドの補完が付いてくるのですが、それの代わりに旧来の `docker-compose` コマンドの補完を使うように設定します。
もちろんそのためには `docker-compose` のセットアップが必要なんですけど、過渡期なのでまだ残ってる人も多いでしょう。

```zsh:~/.zshrc
function dc() {
    docker compose "$@"
}
compdef dc=docker-compose
```

やり方はいろいろあるとは思うんですけど、こんな風に設定してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7705/0e99253c-59a5-ea3d-4763-447e13cee11d.png)
レール遊びで気付いたこと

# はじめにの前に

* 弊社では一般社員が毎週1人スピーチをすることになっていて，その話題に考えていたもの。
* 説明用資料を一式用意した。
* スピーチとは「会話だけで成り立たせるもの」というような定義を見かけたので写真無しで説明を試みようとした。
* 写真無しだと伝えにくいと思い始め取りやめ。別の話題を考えた。
* 考えたのにお蔵入りは寂しいのでこちらに公開。

# はじめに

* 玩具の遊び方が[マシュマロチャレンジ](http://www.marshmallow-challenge-japan.org/)と同じであると感じた話。
* アジャイル開発とウォーターフォール開発について少しだけ再考。

# 概要

* 息子の新幹線，電車遊び(レールづくり)を手伝って，観察して気付いたこと。
* アジャイルを無意識に実行しているように見える。
  * マシュマロチャレンジで保育園児(相当の年代の子ども)が高得点を出す理由と同じではないかと気づく。
* 息子が成長し頭を使ってレール組み立てるようになってきた。
  * これはウォーターフォール開発ではないかと気づく。
* さらに成長するとまたアジャイルのような組み立て方をするのかどうか楽しみ。


# 詳細


## レール遊び

* 息子のレール遊び。レールを自分で組み立てて，新幹線や電車の玩具を走らせる。

* 息子が2-4歳ころは，レールを作ってくれとせがまれるので手伝うことが多かった。

### 大人が作る

#### その1
![DSC_0952.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209750/e76e7659-acf8-7a31-dab5-588b225256b5.jpeg)

#### その2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209750/c68a1fa9-f92e-ae1a-be96-776756eed3a7.png)



* 左右対称，規則通り。
  * 4つの曲線レールをつなげると180度になることを徹底
  * 直線レールの長さは守る
  * 立体にするときの高さも揃える
* 最初に設計しその通り組み立てる。
* 途中で誤りに気付くと下のレールから組み直すときも。
* 出来上がってもあまり面白みはない。
* 息子はある程度満足して遊ぶ。

#### 補足
* こうなる理由としては以下。(すべて大人の都合)
  * 失敗したくない。
  * 時間をかけたくない。
  * スペースの都合(生活空間を侵食されない規模に抑えたい)。


### 息子が作る

* 3歳くらいから自分でもレールを作るようになった。
* 4歳半ころ作ったのがこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209750/706527f5-abcd-5c87-af19-61263ce8d345.png)

* 作るときに完成図は無い。
* 通常とは違うレールの使い方をする。
  * 立体にはできない想定のレールを上に持ち上げている
  * ブロック1つ分の高さ無視
* 個々のレールをつなげるとき，最大でも2つ先くらいまでしか見えていない。
* 運良くどこかとつながってループ(一周できるよう)になることもある。そうなるまで試行錯誤。
* 親の贔屓も多分にあるが割と面白いレールが出来上がっているように思う。
* 大人が作ったレールと比べ遊びもあって楽しそう。一度入り込むともとに戻れない領域があるように見えて戻ることができるなど。

## 後日

* 成長し5-6歳ころになると，おそらく設計図のようなものを思い浮かべてから作るようになってしまった。

### 少し考えられている
![DSC_0984.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209750/2b0dd147-53db-f13e-d92a-020b26f4c582.jpeg)

### 随分考えられている
![DSC_1010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209750/85001f62-8750-817c-0e6a-086e364ab6c3.jpeg)

* ここで，成長したことにより息子が無意識に**ウォーターフォール開発に気付いた**のではないかと思った。
  * 作ったレールは一見すると素晴らしく見えるが，実際は走る様子等想像できてしまい，あまり面白み(遊び)がない。
* さらに成長するとまたアジャイルのような組み立て方をするのかどうか楽しみなところ。


## 考察

* マシュマロチャレンジで保育園児(相当の年代の子ども)のスコア(マシュマロの位置)が高い理由として挙げられる「出来の悪いプロトタイプを何度も作る」に当てはまる。
* おそらく3-5歳あたりの子どもは，出来上がりを楽しむのではなく作る過程を無意識に楽しんでいるので，狙って「出来の悪いプロトタイプ」を作っているわけではない。
* 息子も同じで走らせることのできるレールを作りたいのであって，「出来の悪いレール」は作りたくないが作るときは目の前のことに必死で結果，試行錯誤や失敗をしているよう。
* 試行錯誤が多く時間もかかったり，諦めたり，途中で大人に任せたりすることもあるが，結果面白いレールが出来上がるのではないか。

# システムに当て嵌める

* あくまでも個人的な意見，かつ少し強引な当て嵌め。

* やはり一概にウォーターフォールはよくないとは言えない。今回の例でも以下の内容に示されている。
  * 試行錯誤の時間が長い
  * 最終的にまともな(遊べる)レールになるかどうかわからない。
* しかし弊害も多い。
  * 目標が明確ではあるが，視野は狭まり自由度はない。
  * 途中でよい設計を見つけても戻れない。
  * 現実的にはやり直しが効かない。

* システム開発が盛んになるにつれ以下の流れがあったのではないかと予想。(息子の成長になぞらえて)
  1 初期のころは手探りで開発(結果アジャイルに近いが品質荒い)。3歳ころ。
  2 ウォーターフォール開発という手法を発見。4,5歳ころ。
  3 ウォーターフォール開発が最善の手法とされ蔓延。息子は今このあたりにいる(と思われる)。
  4 システムの分野では欠点が多いことに気付き，他の開発手法が考案される。

* 開発の責任者(多くの場合PM)からすると，何が出来上がるかわからないというのは不安なので先に設計を考えて早く設計通り作ってしまいたいという願いから，ウォーターフォールはある種安心を得られるやり方なのではないかと思う。
* 今回の例でいうと例えば親は子どものお手伝いを早く済ませて残っている家事を済ませたい，ということと同じではないか。
* 目の前のことだけ見ると早く済ませたいが，子どもとの触れ合いや，一緒に遊ぶことによって子どもが満足するといったものを省いている。
* エンジニアの成長を責任者(PM)の都合で止めてもいいのかというような話にも通じるのではないか。
Salesforceオブジェクトにレコードを追加する方法

## 前提
・本手順はSalesforceのオブジェクトにレコードを追加する方法を記載しております。

https://www.salesforce.com/jp/form/sem/freetrial/?ef_id=CjwKCAiApvebBhAvEiwAe7mHSPw1yCYdpUdxiMZ5QEoj0Jw0aMj3JZ_atycKf-Cv-zqRMhpn2VonthoCgSkQAvD_BwE:G:s&s_kwcid=AL!4724!3!613320990440!b!!g!!salesforce&d=7013y000002Uoo3AAC&nc=7013y000002NvovAAC&DCMP=Google-JP&gclid=CjwKCAiApvebBhAvEiwAe7mHSPw1yCYdpUdxiMZ5QEoj0Jw0aMj3JZ_atycKf-Cv-zqRMhpn2VonthoCgSkQAvD_BwE%E2%80%8B

## 手順
1.点が9個ある検索ボックからオブジェクト名を検索して、クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/d0017859-6583-58db-51d9-2ba802f7bd03.png)
2.「新規」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/e1fbf7be-94b5-e8ac-3a84-ed103904b373.png)
3.内容を入力して、「保存」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/a456e339-9643-0ae8-3984-4f5991a969fb.png)
4.「▼」→「印刷用に表示」をクリックし、入力した内容を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/7aa67748-3c2b-d427-1551-c20918c955c9.png)
2022年11月版:爆速でTwitter APIを利用してつぶやき投稿したい人の為の流れまとめ

## 経緯
現在開発中の個人アプリでTwitter APIを利用しようしたらネットに転がっている情報がやたら古かったり、錯綜気味（個人的解釈です）でTweet投稿までに若干手こずったので備忘録的に放流しておきます。

## どのように
- サクッとNodeで
- ライブラリは[twitter-api-v2](https://github.com/PLhery/node-twitter-api-v2)を使って

## 前提
- [Twitterデベロッパーポータル](https://developer.twitter.com/en)の登録、開発者申請が既に終わっている前提
- 必要なJSライブラリは（twitter-api-v2)はインストール済み

## 目標
Hello Worldをツイートする

## 実装

### 1. 認証情報の準備

現在TwitterからAPIを利用する為に、３種類の認証情報が提供されている。今回の目標であるツイートを投稿までに利用するのは以下の情報の４つ。

- Consumer Keys
  - API KEY
  - API KEY SECRET
- Authentication Tokens
  - Access Token
  - Access Token Secret

これら情報は、ダッシュボードのプロジェクト、Keys and tokensタブから確認することができます。
![Screenshot 2022-11-25 at 21.44.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126631/8acce913-e5e9-7139-892c-e4b212ccf2f2.png)

:::note warn
Authentication Tokensの一覧にBearerTokenという項目が存在するが、このトークンは読み込み専用でツイート（書き込み）を実行しても"Your credentials do not allow access to this resource."と返ってきてツイートできないので注意。
:::

### 2. 権限の設定
APIを通じてtweetをするには発行されているAccess Tokenに書き込み権限が付与されていないといけない。現在の権限は、Access Token and Secretの下の方に小さく書かれている。
Read And Writeになっていると読み書きできる。

開発者アカウントを作ったばかりだとReadのみになっていると思われる。
![Screenshot 2022-11-25 at 21.46.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126631/aaed3713-6b1b-7c79-5294-7346acdeaf09.png)

::: note info
Read And Writeで権限が適切に設定されている方は以下の手順をスキップ。
:::

書き込み権限を取得するには、Keys and tokensタブの隣のSettings->User authentication settingsのEditから行う。
![Screenshot 2022-11-25 at 21.58.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126631/b6fe1586-1a54-36ab-2bc3-6d81d3f5c33d.png)

今回行った設定は、以下イメージ通り（requiredのみの変更 + urlは変更してます。
![Screenshot 2022-11-25 at 22.00.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126631/e7c1bed6-4b3a-0924-5b43-f0b669939bf5.png)
![Screenshot 2022-11-25 at 22.00.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126631/ed292a73-6810-2877-73d4-9a72e5d95079.png)

下ごしらえ中に使えるCallback URIとWebsite Urlがない場合、適当なURLでも入力しておいて必要になったら修正しておきましょう。

### 3. ツイートしてみる

```typescript
import { TwitterApi } from "twitter-api-v2";

// consumer keys - api key
const appKey = "hogehoge";
// consumer keys - api key secret
const appSecret = "hogehoge";
const accessToken = "hogehoge";
const accessSecret = "hogehoge";

const client = new TwitterApi({
  appKey,
  appSecret,
  accessToken,
  accessSecret,
});

client.readWrite;

const greet = async () => {
  await client.v2.tweet("Hello World");
};

greet();
```
:::note warn
twitter-api-v2ではconsumer keysのApi KeyとSecretがappKeyとappSecretとなっていて、若干脳のバグを引き起こすので注意。
:::


![Screenshot 2022-11-25 at 22.25.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126631/c833df9c-222f-9c63-786c-a40ae2dd3411.png)

はい。完成。

## まとめ

2022年11月、投稿日時点でのTwitter APIでツイートするまでまとめでした。
pandasで日時を増減する。

# はじめに

https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess/blob/master/docker/work/preprocess_knock_Python.ipynb

データサイエンス100本ノック（構造化データ加工編） - Python

> P-074: レシート明細データフレーム（df_receipt）の売上日（sales_ymd）に対し、当該週の月曜日からの経過日数を計算し、売上日、当該週の月曜日付とともに表示せよ。結果は10件表示させれば良い（なお、sales_ymdは数値でデータを保持している点に注意）。

において、模範解答は

https://dateutil.readthedocs.io/en/stable/relativedelta.html

を使用している。

[pandas](https://pandas.pydata.org/)にも時間用の関数はあるはずなのでやってみました。

# コード例

```python:A-074
df_receipt[['customer_id','sales_ymd']].assign(
    sales_ymd = pd.to_datetime(df_receipt.sales_ymd.astype('str')),
    sales_weekday = lambda x: x.sales_ymd.dt.day_name(),
    day_ofmonday = lambda x: x.sales_ymd.dt.dayofweek.map(lambda s: pd.Timedelta(days=s)),
    monday=lambda x: x.sales_ymd - x.day_ofmonday
)

```

||customer_id|sales_ymd|sales_weekday|day_ofmonday|monday|
|:-:|:-:|:-:|:-:|:-:|:-:|
0|CS006214000001|2018-11-03|Saturday|5 days|2018-10-29
1|CS008415000097|2018-11-18|Sunday|6 days|2018-11-12
2|CS028414000014|2017-07-12|Wednesday|2 days|2017-07-10
3|ZZ000000000000|2019-02-05|Tuesday|1 days|2019-02-04
4|CS025415000050|2018-08-21|Tuesday|1 days|2018-08-20
...|...|...|...|...|...|
104676|ZZ000000000000|2018-02-21|Wednesday|2 days|2018-02-19
104677|ZZ000000000000|2019-09-11|Wednesday|2 days|2019-09-09
104678|CS040513000195|2017-03-11|Saturday|5 days|2017-03-06
104679|CS002513000049|2017-03-31|Friday|4 days|2017-03-27
104680|ZZ000000000000|2019-04-23|Tuesday|1 days|2019-04-22

104681 rows × 5 columns

# 解説

https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html

を見てみると、`Timedelta`が使えそう。

いろいろ試してみると、[pandas.Series.map](https://pandas.pydata.org/docs/reference/api/pandas.Series.map.html)で[pandas.Timedelta](https://pandas.pydata.org/docs/reference/api/pandas.Timedelta.html)をつくってあげると、そのまま足し算引き算できそう。

引数に指定するので、関数を作ってあげて、順番に列を作成していった。

最初は`DataFrame.apply`や[DateOffset](https://pandas.pydata.org/docs/reference/offset_frequency.html)でやってみたけど、遅かったり、戻り値の形が違ってしまったので、今の形に落ち着いた。

# まとめ

`pandas.Series.map`の使い方がまだまだですので、練習。練習。
【GitHub】タブ幅の変更方法

## URL

URLに`?ts=4`などを追記することでタブ幅を変更できます。  

デフォルトは`8`です。  

- デフォルトのタブ幅
  
![スクリーンショット 2022-11-25 21.56.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/d0cde3bc-70fb-e8f5-a99c-044fe4c6d8e3.png)


- URLに`?ts=2`を追加
![スクリーンショット 2022-11-25 21.56.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/800f4248-f912-da24-eb44-4e9d01e950cf.png)


## ユーザー設定

ユーザー設定からも変更できます。  

以下のページの「Tab size preference」を任意の数字に変更します。  

https://github.com/settings/appearance

![スクリーンショット 2022-11-25 22.02.05のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/fe712323-0c71-0ae8-9389-10e4bdd9e452.png)


## EditorConfig

EditorConfigを使用することでも変更できます。  
プロジェクトルートに`.editorconfig`を作成します。  

```.editorconfig
root = true

[*]
charset = utf-8
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2

[*.md]
trim_trailing_whitespace = false

[*.sh]
indent_style = tab

```

すると`*.sh`のタブ幅が`2`になります。  

ただし隠しファイルには反映されないようです。
Twitter利用分析

Advent Calendar 2022 / サービス・アプリケーション
Twitterを活用して作ってみた Advent Calendar 2022 2日目の記事です。

https://qiita.com/advent-calendar/2022/twitter-develop

Twitter社の主催企画

【参加登録受付停止】ステキなTwitterのコンテンツを見つけよう！ by Twitter

に応募して記事を書き始めていた。　

急遽取り消しになり、やや残念。　

書き書けの記事を投稿させてください。　

Twitterアプリの企画です。　

どんなSNSも、そのデータを分析して、次の手を打たないと後手後手になる可能性がある。　

サービスを提供している方は、もちろん機械学習にかけて分析をしているはずだ。　

個人の思いつきで、投稿の可否を決めるわけがないと思っていた。　

www.amazon.co.jpは、AWSサービスを始めてからだいぶたつある年に、　
少なくとも日本語版では、データ解析結果もつけずにかってに消していた。　

Twitterでも、いろいろな解析は手作業でやっているふしはあったかもしれない。　

そこで、Twitterに投稿した自己記事の分析だけでも自動化したいと思った。　



# Countdown Calendar 2022

今年企画した6つのCountdown Calendarと、それぞれの記事一つをご紹介します。

AUTOSAR Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/autosar

AUTOSAR References to ISO, IEC, ITU, IEEE, RFC and SEA etc.

https://qiita.com/kaizen_nagoya/items/d7d252211e10a79516df

Automotive Handbook Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/automotivehandbook

Basic principles, ボッシュ自動車handbook(英語)11版まとめ<2>

https://qiita.com/kaizen_nagoya/items/24a1ba5da3d09b2a95d1


2022 いいねをいただいた記事ランキング(O.K.版) Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/goods

2022年１月下旬　いいねをいただいた記事　16

https://qiita.com/kaizen_nagoya/items/0ee589a8edaeab24fd2a

AdCale(O.K.) Countdown Calendar 2022

https://qiita.com/advent-calendar/2022/adventcalendar2022

「会議は15分未満」に。小耳にはさんだ話。

https://qiita.com/kaizen_nagoya/items/510c47c5d1e8d03145db

ABC language (O.K.版） Advent Calendar 2022

https://qiita.com/advent-calendar/2022/abc_ok

LLVMソースコードのコンパイルをしようと思ってハマった罠とそこから脱出するための努力

https://qiita.com/kaizen_nagoya/items/16f270e42b947756ced3

ABC maker(O.K版） Advent Calendar 2022

https://qiita.com/advent-calendar/2022/abcmaker

JAXA/IPA クリティカルソフトウェアワークショップ WOCS言語関連発表(改定版)

https://qiita.com/kaizen_nagoya/items/4789832baf494cb74626

CountdownCalendar2022 報告

https://qiita.com/kaizen_nagoya/items/5b4b99cb9ad571f4094b

誤差の評価が苦手（専門分野以外）

https://qiita.com/kaizen_nagoya/items/cc3a50827b24ab80985f





 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221202
ver. 0.02 URL追記　20221231


### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
PythonのERROR"SyntaxError:Non-ASCII character"に対する

# Pythonのエラー”SyntaxError:Non-ASCII character”
について調べてみました

# はじめに

実際にPython実行してみてファイルを実行したときにエラーが出たものを紹介していきます

今回は、日本語を表示するための方法！！

実行ファイル
~~~Python:step1-0.py
print '日本語'
~~~

ターミナル実行してみる

~~~:Mac ターミナル=> command 実行
$ python step1-0.py
~~~

$は、消してください

~~~:Mac ターミナル => LOG
  File "step1-0.py", line 1
SyntaxError: Non-ASCII character '\xe6' in file step1-0.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
~~~

どうやら、３行目にシンタクス（文法）エラーがあるようです。

Pythonのエラー"SyntaxError:Non-ASCII character"の解決方法

エラーが出たらまず、日本語に訳してみます。

Google英訳
> ファイル「step1-0.py」、1行目
SyntaxError: ファイル step1-0.py の 1 行目に非 ASCII 文字 '\xe6' がありますが、エンコードが宣言されていません。詳細は http://python.org/dev/peps/pep-0263/ を参照してください

つまり、非ASCIIの文字が含まれていて文字エンコーディングが指定されていない場合に発生するエラーのようですね。

リンクの方で見てみましょう

~~~Python:Python
# coding=<encoding name>
~~~

または (一般的なエディターで認識される形式を使用):

~~~Python:Python
#!/usr/bin/python
# -*- coding: <encoding name> -*-
~~~
また：

~~~Python:Python
#!/usr/bin/python
# vim: set fileencoding=<encoding name> :
~~~

Python2.7や3では実行できるみたいですね
Python2.7のインストールをしました

~~~Python:step1-0-1.py
#!/usr/bin/python python2.7
# -*- coding: utf-8 -*-
print '日本語'
~~~

# !/usr/bin/python 

!/usr/bin/python の部分は必ず１行目に書いてください

# coding=&lt;encoding name&gt;

&lt;encoding name&gt;　=>　utf-8 
utf-8 にしておくと表示が出ました


ターミナル実行してみる

~~~:Mac ターミナル=> command 実行
$ python step1-0-1.py
~~~

$は、消してください

~~~:Mac ターミナル => LOG
日本語
~~~

出ましたね。

Pythonは、インストールの仕方は調べてみてください。

# 終わりに
初めての表示の部分で、日本語出せへんのかい！！ってツッコミましたがパソコンだから仕方ないかぁって思ってました。結構、パソコン側の処理のプログラミング言語なんだなぁと思いました

エラーが出た時は、どういうエラーが出てるんだろうと検索するところから始めます。
わりかしここが違うよと明確に書いていたりするので、陥りやすいのは、バージョンが違ったりという環境の部分、実行できるファイルの内容や、１行目に必ず書かないといけない文言があったりというのもいろんなエラーから冷静にチェックしてみてください

## 見方

~~~:Mac ターミナル=> command 実行
$ （command 実行）
~~~

コマンドの実行の内容が書かれています
$は、消してください

~~~:Mac ターミナル => LOG
（command 実行時の出力）
~~~

コマンドの実行後の処理が書かれています
エラーの場合は
~~~:Mac ターミナル => ERROR
（command 実行時の出力）
~~~
コンプライアンスなどの内容及び長い場合は
注釈。略あり

ここでは、Pythonでできることなども色々やっていきます
一緒に勉強してくれる仲間を募集中です。

一緒にしたい方がいたらぜひ声かけてください

@sunstripe2011 

Twitter
[@sunstripe2011](https://twitter.com/sunstripe2011)

コードはこちらに非公開ですが仲間内でGithubで管理しています
## 青空プログラミング

https://github.com/BlueSkyProgramming/Python
Github Actionsのset-outputは廃止されるってよ

# 追記：　廃止されるのが廃止されるってよ
コメントで新たな情報をいただきました。
> さきほど[GitHubActions](https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/)の通知記事の原文見てきたのですが廃止時期が2023/06/01から延期されるそうです。
以上情報共有でした:pray:

あまりにも影響力が大き過ぎたようですね。いつまで延期されるかわかりませんが、とりあえず杞憂に終わりました。


Githubブログでこんな記事を見つけました。

> GitHub Actions: Deprecating save-state and set-output commands
> [訳]:GitHub アクション: save-state コマンドと set-output コマンドの廃止

https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/

## 2023年6月1日から、`set-output`、`save-state`を使ったworkflowは失敗するようになる
タイトルには`set-output`と書きましたが、`save-state`も2023年6月1日以降は廃止されます。

> We are monitoring telemetry for the usage of these commands and plan to fully disable them on 31st May 2023. Starting 1st June 2023 workflows using save-state or set-output commands via stdout will fail with an error.

## 対応方法
このように書き換える必要があります。
```yml:before
- name: Save state
  run: echo "::save-state name={name}::{value}"

- name: Set output
  run: echo "::set-output name={name}::{value}"

```

```yml:after
- name: Save state
  run: echo "{name}={value}" >> $GITHUB_STATE

- name: Set output
  run: echo "{name}={value}" >> $GITHUB_OUTPUT

```

参照方法は変わりません

### 例
私の手元のworkflowにも対象の記述があったので、書き換えてみました。
```yml:before
- name: Set output
  run: echo "::set-output name=service-arn::$SERVICE_ARN"

```

```yml:after
- name: Set output
  run: echo "service-arn=$SERVICE_ARN" >> $GITHUB_OUTPUT

```

いろんなところで使われているので、先人方の方法で対応してみてはいかがでしょうか

https://zenn.dev/book000/articles/set-output2github-output

https://blog.stenyan.jp/entry/2022/10/12/220953
【tModLoader 1.4】 UIListが勝手に並び替えを滅茶苦茶にする問題の解決策

`ModList`を使っていたら、配列/リストの順々に要素を追加したのに、
(ある一定の数以上の要素があると<sup>[要検証]</sup>)順番をめちゃくちゃにする現象が発生した。

## 現象が発生したコード

だいたいこんな感じのコード

```C#
_uiList.Clear();

for (var i = 0; i < 18; i++)
{
    _items[i] = new UIListItem(i);
}

_uiList.AddRange(_items);

Recalculate();
```

最終的になんかいろいろ試したりしたものの
```C#
_uiList.Clear();

for (var i = 0; i < 18; i++)
{
    _items[i] = new UIListItem(i);
    _uiList.Add(_items[i]);
}

Recalculate();
```

結果は変わらなかった。(めちゃくちゃにされた)

## 原因

Terraria(tML)のコードを見たら分かった。

**`UIList`は自動的に並び替えを行うようになっていた。**

※ ちなみに`Recalculate();`があろうとなかろうと実行された

## 解決策

こちらも、Terraria(tML)のコードを見たら分かった。

`UIList`には、リストの並び替えのアルゴリズムを上書きできるようなメンバ`uiList.ManualSortMethod`(※メソッドではない)があった。
`Action<List<UIElement>>`型。

並び替えをしてほしくなかったので
```C#
uiList.ManualSortMethod = (_ => { });
```
と書けばOK。

ちなみにこれを書いた場所は`OnInitialize()`
【プログラミング初心者】仮想マシンとコンテナの違い

仕事で使用している仮想環境はVMですが、仮想環境にはいろいろなタイプがあることを知りました。
今回はその中でも仮想マシン型とコンテナ型の違いについて調べてみましたのでメモしたいと思います。

# 仮想マシンとコンテナの共通すること

「隔離されたアプリケーション実行環境」を提供すること。つまり、Macで開発していたらMacOSの実行環境で、WindowsとかLinuxはそれぞれの実行環境で動いているわけです。１つのパソコンに1つのOSだからです。他のOSの実行環境を知らないので、Macしか動かないなんてこともあり得るわけです。ただ、仮想マシンを作成し、１つのPCにOSを何個も用意することができ、その環境のもと開発を進めることができるんです。

# 違い

### コンテナ型は可燃性が高い
仮想マシンは実行環境を移行させるとき、移行先の環境に適当させる必要があり、手間がかかる。一方コンテナ型コンテナ管理ツールによってハードウェアやOSの違いを吸収できるため、移行先の環境のアプリケーションやミドルウェアの稼働が確認されていれば他のサーバーに移してもすぐに実行できる。
 
### 起動・処理が早い
仮想マシンはホストOSに加えてゲストOSも起動する必要があるため、アプリケーションの起動に時間がかかる。一方で、コンテナはホストOSのカーネルを共有するため、ゲストOSの起動がない分素早くアプリケーションを共有するため、ゲストOSなどにCPUやメモリを消費することがない

![仮想マシンとコンテナ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647183/abc148db-07f4-7451-7482-48d5f7b94a09.png)

### リリースサイクルを高速化

仮想マシンと異なり、コンテナは記述したように可燃性が高くコピーが容易なため開発環境→テスト環境→本番環境と言ったリリースに伴う各環境への反映が容易になり、OSやインフラの違いを意識することなくアプリケーションと環境実行できる。

### 障害対応時のバックアップが容易

コピーはバックアップにもなるので障害時もすぐに代替環境へ切り替えることができる
ExcelVBAでのツール作成で初心者エンジニアが気を付けたこと

# はじめに
本記事では、1年目のエンジニアが初めてVBAで集計ツールを作成したときにとても勉強になったことを備忘録として書きます。
一概にこうするべきだというわけではないですが、「こういう視点でツール作るといい感じに仕上がるかもな」とほんの少し参考になりそうなことをまとめました。

# 実装でのコツ
初心者の私が適当に書き始めると分かりにくくて非常に解読しづらいコードになってしまうんですよね。修正もしづらかったり。
作ってる最中は良くても、運用し始めた時に何が何だかわからないマクロを作ってしまうと後々困ります。
また気付かぬうちにナンセンスなツールを作成してしまっていたりもするのです。
これをマシにするために以下のようなことに気をつけました。

### ① 固定の数値は定数として定義する
定数化しておくと楽だし、分かりやすいです。手間がかかりそうに感じるけど名前つけちゃった方が便利な時もあります。
とても簡単に例を出すと以下のような感じです。1個列増えたからA列からB列にしたい…的な状況です。
　　
``` vb:大変な例
    ' A列にデータいれる
    Cells(1,1).Value = "A列1行目"
    Cells(2,1).Value = "A列2行目"
    ...

   '後からこれ全部をB列に変更するのは面倒
```

``` vb:便利な例
    ' セル番地
    Public Const ADR_COLUMN = 1
    ' A列にデータいれる
    Cells(1,ADR_CLOUMN).Value = "A列1行目"
    Cells(2,ADR_CLOUMN).Value = "A列2行目"
    ...

    'これなら定義部分(ADR_COLUMN)だけで列変更ができる
```

他にも定数化はメッセージボックスの特定文言や、固定フォーマットなどにも使えると思います。

### ② モジュールを分ける
vbaは標準モジュールを一つ追加してそこにコードを書けばいいんだよね？と思っていましたが現場の人の作成したマクロを見てみると**モジュールの名前も変更していい感じに使い分け**ていたんです。
かっこよかったのでとりあえず真似しましたが、実装したいことが増えていくにつれよさに気づきました。
使い分けは以下のような感じです。
```:使い分けの例
　　md_00_const ⇒ 定数の定義
　　md_01_main  ⇒ メインの実行するマクロ
　　md_99_util  ⇒ 汎用性のあるfunctionなど
```
もちろん定数なんかはモジュールの一番上にまとめて書いておくでも事足りるとは思うのですが、これはこれで分かりやすいし良いなと思いました。

### ③ 定数や関数の名前のセンス
これは大変難しい問題です。私はまだ初心者枠なので名づけ下手です。
現場の人の名づけ方で学んだのは、**定数なら接頭語**をつける、**関数なら何する何をの順**で書く！ということです。
```:定数の例
　　セル番地　　 ⇒ ADR_○○
　　ワークシート ⇒ WSNAME_○○
　　フォーマット ⇒ FORMAT_○○
```
住所なのかシート名なのか等々一気にわかりやすくなります。

```:関数の例
　　何かの値を取ってくる　 ⇒ get○○()
　　表作成のファンクション ⇒ createTable()
```
VBAとかだとついつい日本語でプロシージャ名つけたくなるのですが「素人っぽい」と思われないためにも頑張ってこのようn命名してみました。

### ④ チェック処理をいれる
ファイルを読み込む前に**そのファイルが存在してるか、入力された値の型が想定と合っているか**、とかです。
作ってる側なので無意識のうちに「存在しないファイル名なんて入れないだろう」とか「日付入力欄なんだから整数でいれてくれるだろう」と思い込んで作成してしまってました。
しかしツール作成の中で、使う人は分からないかもしれないとか、間違えて入力しちゃうこともあるかもとか、**色んな可能性を考えて処理落ちしないようにする**のも作成者のやるべきことだと学びました。
優しさはなんぼ持ってたっていいですからね。チェックしてあげる優しさを持とうと思いました。


# まとめ
以上、ExcelVBAでツールを作成した時に気を付けたことでした。
こういうのはどうしたって他の人の成果物から学ばないと気づけないなと思ったので今回記事にしてみました。
自分では最善だと思っていた方法よりも良い方法に出会たりするといういい気付きを得られました。
今後も現場の成果物からいいところ見つけて自分も使いこなせるようになりたいと思います。