OmniAICreator/Qiita-1.07M huggingface dataset:
【保存版】ServiceNow習得を加速する！厳選YouTubeチャンネル2024

## はじめに

ServiceNowの学習を始めると、膨大な機能と活用方法に圧倒されることがよくあります。公式のNow Learningは体系的な学習には最適ですが、実践的なノウハウや最新のトレンド、現場での活用事例を知るにはYouTubeが強力な味方となります。本記事では、ServiceNowの学習をサポートする厳選YouTubeチャンネルをご紹介します。公式チャンネルから現場のエキスパートまで、それぞれのチャンネルの特徴を詳しく解説し、あなたの学習段階に合わせた最適な情報源を見つけられるようにまとめました。ぜひ、自分に合ったチャンネルを見つけて、効率的な学習にお役立てください。

## 🎯 ServiceNow公式チャンネル

ServiceNow Community
最新情報やベストプラクティスを網羅的に発信！コミュニティの活気を体感できます

https://www.youtube.com/@ServiceNowCommunity

ServiceNow Documentation
公式ドキュメントの理解を深める動画が満載。確実な知識習得に最適です

https://www.youtube.com/@ServiceNowDocs

ServiceNow Developer Program
開発者向けの技術情報を詳しく解説。実践的なコーディングのコツを学べます

https://www.youtube.com/@ServiceNowDevProgram

## 💡 厳選！非公式チャンネル

Snow Expert Rohit
Now Learningでは掘り下げられない実装の細部まで丁寧に解説。現場で使える知識が満載！

https://www.youtube.com/@SnowExpertRohit

SAAS With ServiceNow
ServiceNowの本質的な考え方からJira連携まで幅広くカバー。システム理解を深められます

https://www.youtube.com/@SAASWithServiceNow/videos

Volteo
実践的なDemo動画が豊富。CMDB、PA、Flow Designerなど、重要機能を分かりやすく解説

https://www.youtube.com/@Volteo

Justin Meadows
プロジェクト管理や統合に関する専門性の高い内容が充実。上級者向けの学びに最適

https://www.youtube.com/@JustinMeadows/videos

Plat4mation & GlideFast Consulting
世界的に著名なServiceNowパートナーが提供する質の高いコンテンツ

https://www.youtube.com/@Plat4mation/videos

https://www.youtube.com/@GlideFastConsulting/videos

## 結び
ServiceNowの学習において、YouTubeチャンネルは公式ドキュメントやNow Learningを補完する重要な情報源となります。特に実装の細部や現場のベストプラクティス、最新のアップデート情報など、実践的な知識を得るには非常に有効です。ここでご紹介したチャンネルは、いずれも信頼性が高く、質の良いコンテンツを提供しています。初学者の方は公式チャンネルから始めて、徐々に専門的なチャンネルへと範囲を広げていくことをおすすめします。また、日本語での学習をお考えの方は、ServiceNow解説チャンネルを積極的に活用されることをお勧めします。継続的な学習を通じて、ServiceNowの可能性を最大限に引き出していきましょう。
generic preprocessor gppを使う [Rust]

スクリプトに掛けるプリプロセッサについて。

僕はCに慣れているので、M4よりgppの方がいいような気がします。
M4は再帰変換が僕にとってはやりにくいです。

まずはインストール。ここでは試験環境はArch Linuxです。

```
$ yay -S gpp
```

rustのi32のpopを処理します。

```popi32.gpp
#define popi32(A,B) let A:i32=match B.pop() { Some(value)=>value,None=>1 }
```

#### スクリプト

エラトステネスのふるいで素数を求めるスクリプトです。

```rust:sieve.gpp
#include  "popi32.gpp"

use std::env;
fn main() {
    let args: Vec<String> = env::args().collect();
    let n=&args[1];
    let n:i32=n.parse().unwrap();
    let f:Vec <i32>=sieve(n);
    let l:i32=f.len() as i32;
    println! ("{:?} : {:?} ",l,f);
}

fn sieve(n:i32)->Vec<i32> {
  let mut tab:Vec<i32>=(2..=n).rev().collect();
  let mut l:Vec<i32>=vec![];
  while !tab.is_empty() {
    popi32(v,tab);
    l.push(v);
    tab.retain(|&x| x%v !=0);
    }
  l
}

```

#### プリプロセッシング

```
$ gpp sieve.gpp > sieve.rs
```

#### コンパイル

```
$ rustc sieve.rs
```

#### 実行

```
$ ./sieve 100
25 : [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] 
```

うまくいきました。
Macのネットワーク・プロキシ設定を一括で変更する


# やりたいこと
Mac OS において、複数のネットワークのプロキシ設定を一括で設定する。

### 動機
フリーアドレスで、かつ各座席で有線接続をする場合（モニタにLANが来て、type-cやThunderboltでつなぐときなど）、有線のネットワーク設定が各座席ごとに生成されるが、プロキシ設定をネットワーク設定（座席）ごとにそれぞれ設定する必要があり、非常に手間だったため。

# 実際のコード

`networksetup`というコマンドがあるので、これを使う。
補足1. on,offそれぞれのコードを`.sh`で保存して利用することを想定してコードを書いています。
補足2. 加筆すればGUIで設定できるすべてのネットワーク設定に対応できるはずです。 

### proxy設定をonする

```bash
IFS=$'\n'
networks=`networksetup -listallnetworkservices`

proxy='xxx' # proxyのドメイン名を入れる
port=11111 # proxyのポート番号を入れる
apc='http://hogehoge' # proxyの構成ファイルのURLを入れる

echo "params: proxy: $proxy:$port, auto_proxy_url: $apc"

for svc in $networks; do
  info=`networksetup -getinfo $svc`
  if [ "`echo $info | grep '** Error: The parameters were not valid'`" ]; then
    continue
  elif [ "`echo $svc | grep 'Wi-Fi'`" ]; then
    continue
  fi

  # 自動プロキシ検出
  networksetup -setproxyautodiscovery $svc on
  # 自動プロキシ構成
  networksetup -setautoproxyurl $svc $apc
  # Webプロキシ(HTTP)
  networksetup -setwebproxy $svc $proxy $port
  # 保護されたWebプロキシ(HTTP)
  networksetup -setsecurewebproxy $svc $proxy $port
  # FTPプロキシ
  networksetup -setftpproxy $svc $proxy $port
  
  # 確認
  echo "on proxy setting $svc"

done

```


## proxy設定をoffする

```bash
IFS=$'\n'
networks=`networksetup -listallnetworkservices`

for svc in $networks; do
  info=`networksetup -getinfo $svc`
  if [ "`echo $info | grep '** Error: The parameters were not valid'`" ]; then
    continue
  elif [ "`echo $svc | grep 'Wi-Fi'`" ]; then
    continue
  fi

  # 自動プロキシ検出
  networksetup -setproxyautodiscovery $svc off
  # 自動プロキシ構成 -> offはないので空文字に変換
  networksetup -setautoproxystate $svc off
  # Webプロキシ(HTTP)
  networksetup -setwebproxystate $svc off
  # 保護されたWebプロキシ(HTTP)
  networksetup -setsecurewebproxystate $svc off
  # FTPプロキシ
  networksetup -setftpproxystate $svc off

  # 確認
  echo "off proxy setting $svc"
done

```

# 参考文献など
https://qiita.com/uraura/items/b6a8f52d03580bc83aa3
By default the bodies of untyped functions are not checked, consider using --check-untyped-defs と出る．

# TL;DR;
そのスコープの**戻り値の型**を明示する．

# 経緯
- `Python` で適当な変数の型を，関数内(メソッド内)で定義していた．
- `VSCode` で `By default the bodies of untyped functions are not checked, consider using --check-untyped-defs` と青色で `mypy` から表示される．
- なんとか上記の表示を消したかった．

# 解決
- そのスコープの**戻り値の型**を明示した．
- そしたら青色の表示は消えた．
Supabaseのアカウント作成手順

Supabaseのアカウント作成方法の手順になります。
GitHubアカウントでも作成可能ですが、Emailでの作成方法の手順となります。

###### ① 公式HPにアクセスする
https://supabase.com/

表示されたら、画面右上の **<font color="red">Sign in</font>** をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/be7c57b1-b664-5799-9efa-2ef11159a9fe.png)

##### ② Sign inの画面が表示されるので、 **<font color="red">Sign Up Now</font>** をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/3703938c-8d4b-6533-5318-dc89cb551d6d.png)

##### ③ Sign upの表示に切り替わるので、EmailとPasswordを入力して、**<font color="red"> Sign Up</font>** が活性化したらクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/1f8398ab-87e6-0507-87b1-d54c0db639a3.png)

※ Passwordには次の要件があるので、満たすものを入力すること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/c4532bcb-ca2f-7300-7304-3060fcdd37bb.png)
- **Uppercase letter**: 大文字のアルファベットを使用すること（A〜Zのどれか）
- **Lowercase letter**: 小文字のアルファベットを使用すること（a〜zのどれか）
- **Number**: 数字を使用すること（0〜9のどれか）
- **Special character (e.g. \!\, \?\, \&lt;\, \&gt;\, \@\, \#\, \$\, \%\)**: 特殊文字を使用すること（例として `!`、`?`、`<`、`>`、`@`、`#`、`$`、`%` など）
- **8 characters or more**: パスワードの長さが8文字以上であること

##### ④ Sign Upクリック後に次のようなメッセージが表示されるので、入力したEmailにSupabaseからメールが来ていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/c981db11-3cbc-031b-2a79-5f4b7d504598.png)

##### ⑤ Supabaseからのメールを確認して、 **<font color="red"> Confirm Email Address </font>** をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/e37157b5-9ab8-58b2-fff1-bbf8f32d7bad.png)

クリック後に次のような画面が表示されるが、アカウント作成には関係しないので **<font color="red">Cancel </font>** をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/e7353c52-9cc3-cb51-4482-3dbc2b5b069c.png)

##### ⑥ Dashboard画面が表示されることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513233/919a445f-d748-d53d-e976-45d6fe9969b3.png)

以上でSupabaseのアカウント作成は無事完了です。
【Anthropic発表】Claude 3.5 SonnetがComputer useを実装

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35782/28d94e15-d493-4235-48d8-4cad4eaf85a2.png)

*本記事は、Anthropicが2024年10月23日に公開した[Developing a computer use model](https://www.anthropic.com/news/developing-computer-use)の内容を日本語でまとめたものです。*

Anthropic社から同時に発表された他の内容については以下のブログにまとめています。

https://zenn.dev/shirochan/articles/708d30063d93fa


Anthropicは2024年10月23日、同社の大規模言語モデルClaude 3.5 Sonnetに、人間のようにコンピュータを直接操作する機能を追加したことを発表しました。この新機能は現在パブリックベータ版として提供されており、適切なソフトウェア環境下で利用可能です。

## 新機能の概要と特徴

この新機能により、Claudeは以下の操作が可能になりました：

- マウスカーソルの移動
- 画面上の位置を認識してのクリック操作
- 仮想キーボードによる文字入力
- 画面状態の理解と適切な操作の実行

## コンピュータ操作機能の重要性

現代のビジネス環境において、業務のほとんどがコンピュータ上で行われています。AIがコンピュータソフトウェアと直接やり取りできるようになることで、現世代のAIアシスタントでは実現できなかった多くのアプリケーションの可能性が開かれます。

## 技術開発のプロセス

この機能の実現には、以下の要素が組み合わされています：

1. 画像認識と解析技術
   - 画面内容の理解
   - 状況に応じた操作の判断

2. 操作制御の実装
   - ピクセル単位でのカーソル移動
   - 目的の位置を特定してのクリック操作

3. 段階的な学習方式
   - 基本的なソフトウェア（電卓、テキストエディタ）での訓練
   - セキュリティを考慮した制限付き環境での学習

## 性能評価

コンピュータ操作能力の評価において、以下の結果が得られています：

- 標準評価基準「OSWorld」で14.9%のスコアを達成
- 次点のAIモデル（7.7%）を上回るスコア
- 人間レベル（70-75%）には到達していない
- エラーが発生した際の自己修正能力を確認

## 安全対策

Anthropicは以下の安全対策を実施しています：

1. AI安全性レベルの維持
   - 現行バージョンは安全性レベル2を維持
   - 定期的なリスク評価の実施

2. セキュリティ保護機能
   - プロンプトインジェクション（不正命令）対策
   - 選挙関連活動の監視システム
   - 特定操作（SNS投稿、政府サイトアクセスなど）の制限

3. プライバシー保護
   - ユーザーから提供されたスクリーンショットデータは学習に使用しない方針

## 現状の課題

現時点で認識されている主な制限事項：

- 操作速度の最適化が必要
- 一部の一般的操作（ドラッグ、ズームなど）が未実装
- スクリーンショットベースの認識による一時的な変化の見落とし

## 将来への展望

Anthropicは以下の改善を目指しています：

- より高速で信頼性の高い操作の実現
- より多様な操作方法への対応
- 実装の簡易化
- 安全性の継続的な向上

現在、この機能はパブリックベータ版として提供されており、開発者からのフィードバックを募集しています。

*本記事は、Anthropicの公式ブログの内容を基に作成されています。詳細な情報は[原文](https://www.anthropic.com/news/developing-computer-use)をご参照ください。*
SSDとHDDの違いは？

# はじめに
SSDもHDDもよく聞く言葉ですが、恥ずかしながらその違いについてはちゃんと理解してなかった…

"なんとなく知っている"からレベルアップするために各々の特徴を調査します

特徴を理解することで作業効率が上がること間違いなし👍

# SSD？HDD?とは？
そもそもSSD、HDDってなに？って方もいらっしゃると思います。

共にコンピューターのデータを長期的に保存しておくための装置のことです。

普段何気なく使っているPCには両方とも搭載されていることが一般的です。

データの保存方法や容量等に違いがあり、それぞれの特徴は以下の通り。

## HDD (Hard Disk Drive)
- 磁気ディスクを使用したデータ保存
- 大容量
- 安価
- 機械的な部品を使用するため衝撃に弱い

HDDでは円盤状のディスクを回転させて、磁気ヘッドでデータの読み書きを行います。

物理的にディスク内のデータを探しに行くため読み書きには時間がかかりますが、大容量のデータ保存が可能で比較的安価で手に入ります。

## SSD(Solid State Drive)
- フラッシュメモリを使用したデータ保存
- データアクセスが高速
- 衝撃に強い
- 消費電力が少ない
- 静音性が高い

SSDではUSBメモリのように内臓されているメモリーチップに電気的にデータを読み書きしています。

HDDと異なり物理的に動く部品がないため、高速なデータアクセスが可能です。サイズの小さいものも多く、衝撃に強いため持ち運びに便利です。

# 使い分け
以下は一般的に推奨されている使い分けです。

**SSD**: データアクセスに速さが求められる処理
例えば...
OSやアプリケーションの起動
ゲームプレイ　など

**HDD**: 大容量データの保持
例えば...
写真や動画の保存先
バックアップデータの保存先　など

それぞれにメリットデメリットがあるため、目的によって上手く使い分けましょう！
オブジェクト指向の勘所「参照」の考え方


## 変数とは？
- 値の入った箱である


```
x = 1
```

「xという名前の箱に値 1 が入っている」

----

## オブジェクトは値か？
- 1 や「かわの」は値と言っていいだろう
- オブジェクトは・・・値とは言えないものも多い気がする！

```ts
var httpClient = new HttpClient();
// HTTPリクエストを送ってくれるオブジェクトは「値」とは思えない！
```

----

## 参照
- オブジェクトはメモリ上のどこかに存在し、その場所はメモリの番地（参照値）で特定できる
- オブジェクトを操作するための変数には、メモリの番地（参照値）が入る
- こういう変数を「参照型変数」と呼ぶ
- 参照型変数は変数の値として「参照値」を保持し、オブジェクトを「参照」する
- イメージとしては変数からオブジェクトを「指さしている」
- 「番地」は値と言えないことはないので、依然として変数の中には「値」が入っていると考えられる

----

## イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10225/156f599b-de51-24e0-665e-f1a2658e117f.png)

----

## オブジェクトの操作(1/2)

- 参照を通してオブジェクトを操作することができる

```c#
Person p = new Person();
p.Age = 20;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10225/d46e6124-e8a2-ef6f-f692-f8ce9c666392.png)


----

## オブジェクトの操作(2/2)

```ts
var ary = [1,2,3];
var d = ary.map(i -> i * i);
```

配列もオブジェクト！

----

## 参照の連鎖

オブジェクトの中に更に参照を持つことが出来る
```ts
var ary = [ { name: 'kawano' }, { name: 'tomo' }, { name: 'Haskell' } ]; 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10225/c00f77fe-4d06-8178-97fb-3fc5fcd768e8.png)



----

## 構造体

- C#の構造体は「オブジェクトみたいな値」
- 変数の中に値が格納される
- 正直、使いどころが難しい。。。

----
## 参照の怖いところ(1/2)

- 参照は容易に複製できる
- 同じオブジェクトへの参照がばらまかれると手に負えないバグの温床となる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10225/158f6fb9-6b95-5a92-868a-9323b0be17ba.png)

----
## 参照の怖いところ(2/2)

- 指さしている先に実はオブジェクトがいなかったら・・・？
- これが＄10億の損失「null参照」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10225/a3d015ff-0511-fc0d-9223-15bd7caf6ca0.png)

----

## 最後に

- JavaScript／Java／C#など、よく使われる言語はオブジェクトを備えていることが多い
- 参照の便利さと怖さ、両方を**知っておく**ことが重要
- 値を変更できない言語もある！：Haskell／Elm
bundle install　後にも「Could not find gem名」エラーが発生したため、それを自動解決するスクリプトの紹介


## Railsでの「Could not find gem名」エラーを自動解決するスクリプトの紹介

Railsアプリケーションを開発していると、`bundle install` 後に `Could not find gem名` というエラーが発生することがあります。このエラーが出るたびに個別のgemを手動でインストールするのは手間がかかるため、エラーを検出して自動でgemをインストールするスクリプトを作成しました。

### スクリプトの内容

以下のスクリプトは、Railsサーバーの起動を試み、`Could not find` エラーが発生した場合に不足しているgemを自動的にインストールするものです。

```ruby
# start_rails_server.rb
def install_missing_gem(error_message)
  gem_name_with_version = error_message.match(/Could not find (\S+) \(([\d.]+)\)/)
  if gem_name_with_version
    gem_name = gem_name_with_version[1]
    version = gem_name_with_version[2]
    puts "Installing missing gem: #{gem_name} (#{version})"
    system("gem install #{gem_name} -v '#{version}'")
  else
    puts "Running bundle install..."
    system("bundle install")
  end
end

loop do
  puts "Starting Rails server..."
  output = `rails server 2>&1`
  puts output

  # Check for 'Could not find' error in the output
  if output.include?("Could not find")
    install_missing_gem(output)
    puts "Retrying..."
  else
    break
  end
end
```

### スクリプトの動作
1. Railsサーバーの起動を試行します。
2. サーバー起動時に `Could not find` エラーが発生した場合、エラーメッセージから不足しているgemの名前とバージョンを抽出します。
3. 抽出したgem名とバージョンを用いて、自動的に `gem install` を実行します。
4. サーバーの起動を再試行し、エラーが解消されるまで繰り返します。

### 使用方法
1. 上記のコードを `start_rails_server.rb` というファイルに保存します。
2. スクリプトを実行します。

    ```
    $ ruby start_rails_server.rb
    ```

3. エラーが発生すると、不足しているgemが自動的にインストールされ、再度サーバーの起動を試みます。

### メリット
- **手動操作の軽減**: 毎回 `gem install` を手動で実行する必要がなくなり、時間と手間が省けます。
- **自動化による効率化**: スクリプトが自動で不足しているgemをインストールし、Railsサーバーの起動をリトライしてくれます。

### まとめ
このスクリプトを使うことで、Rails開発時に遭遇しがちな `Could not find gem名` エラーを自動的に解決し、開発の効率を向上させることができました。特に複数の開発環境でプロジェクトを共有する場合に役立つので、ぜひ試してみてください。

### 参考リンク
- [Ruby on Rails Documentation](https://guides.rubyonrails.org/)
- [Bundler Documentation](https://bundler.io/)

Railsの開発が少しでも快適になれば幸いです！
Railsバージョンアップ時にCompass gemの削除について


Railsのバージョンアップを行った際、**Compass gem**が原因でエラーが発生したため、該当のgemを削除した手順をまとめます。

### 背景
- Railsアプリのバージョンをアップデートしたところ、`File.exists?` に関するエラーが発生しました。
- エラーメッセージを確認すると、**Compass gem**が原因であることが判明しました。
- `File.exists?` は最新のRubyバージョンでは非推奨となり、代わりに `File.exist?` を使用する必要があります。
- Compass gemは現在メンテナンスされておらず、更新が期待できないため、削除を決断しました。

### 対応手順
以下の手順でCompass gemを削除しました。

1. **GemfileからCompassの記述を削除**  
   `Gemfile` から `compass` の記述を削除します。

    ```
    # Gemfile
    - gem 'compass'
    ```

2. **`bundle install` の実行**  
   Gemfileを更新した後、`bundle install` を実行してCompass gemを削除します。

    ```
    $ bundle install
    ```

3. **Sassの移行**  
   Compassを利用していたSassファイルに依存している部分を確認し、**Sass**単体で利用できるように修正しました。

    - Compassのミックスインを使用していた箇所をSassやCSSの標準に置き換えました。
    - 例として、`@import "compass"` のような記述を削除し、代替のSassコードを記述しました。

4. **アプリケーションの動作確認**  
   Railsサーバーを再起動し、アプリケーションが正しく動作するか確認します。

    ```
    $ rails s
    ```

   エラーメッセージが消え、アプリケーションが正常に動作することを確認できました。

### まとめ
Railsのバージョンアップに伴い、メンテナンスされていない **Compass gem** が原因で `File.exists?` のエラーが発生しました。Gemfileから削除し、Sassへの置き換えを行うことで問題を解決しました。RailsやRubyのバージョンアップ時には、依存関係のあるgemのメンテナンス状況を確認し、必要に応じて置き換えや削除を検討することが重要です。

### 参考リンク
- [Ruby 2.4でのFile.exists? 非推奨について](https://www.ruby-lang.org/)
- [Compass gemについて](https://compass-style.org/)

これで、Railsのバージョンアップ時に古いgemによるエラーを回避する方法が整理できました。参考になれば幸いです！
最新の3D姿勢推定をMotionBert、AlphaPoseでしてみる

## はじめに
**姿勢推定**の中でも、最新の**3次元の骨格座標**を推定する。
特別なカメラ、GPUは必要とせず、オープンソースである**MotionBert**と**AlphaPose**を利用して行う。

### 3D姿勢推定とは

https://youtu.be/slSPQ9hNLjM?si=Ex3_5wS8fiidga-r

### 流れ
1. **AlphaPose**を利用して、動画から**2次元の骨格座標**を推定する。
2. **MotionBert**を利用して、上記の2次元の骨格座標から**3次元の骨格座標**を推定する。
   
## AlphaPoseによる2次元の骨格推定

### AlphaPoseとは

![](https://storage.googleapis.com/zenn-user-upload/d035000863d5-20241023.png)

MotionBertで3D姿勢推定するためには、まず決められたフォーマットの2次元の骨格座標が必要。
その骨格データを取得するために、AlphaPoseを使用する。

AlphaPoseは、公式にMotionBertから利用を**推奨**されており、

同様の機能の**OpenPose (CMU-Pose)より高い**推定精度を持ち、

NVIDIA製のGPUや特殊なカメラを必須としない。

https://github.com/MVIG-SJTU/AlphaPose

### AlphaPoseの実装
下記の記事を参考にしてAlphaPoseをインストール。

https://github.com/MVIG-SJTU/AlphaPose/blob/master/docs/INSTALL.md

セットアップが済んだら、下記のモデルを使用して、骨格推定する。

https://github.com/MVIG-SJTU/AlphaPose/blob/master/docs/MODEL_ZOO.md#halpe-dataset-26-keypoints

下記の設定ファイルとモデルファイルがクローンしたディレクトリに存在しない場合は、上記のサイトからダウンロードして所定のディレクトリに配置してから、実行する。

・256x192_res50_lr1e-3_1x.yaml
・halpe26_fast_res50_256x192.pth

実行結果として、

2次元の骨格座標を**JSONファイル形式**で得る。

#### 詰まった点
・ライブラリのバージョンが最新でないものが多いので、仮想環境のanacondaで環境構築するのがおすすめ。
・**Windows**の場合は、下記の記事に注意。

https://github.com/MVIG-SJTU/AlphaPose/blob/master/docs/INSTALL.md#windows

・AlphaPose/trackers/PoseFlow/requirements.txtで指定されているバージョンでnumpy等のライブラリをインストールしていたが、それだと動作せず、githubの「Issues」に投稿されていたバージョンに変更してうまくいった。

## MotionBertによる3次元の骨格推定

### MotionBertとは

単眼カメラによる3D姿勢推定で**最も高い精度**を出しているツールのひとつ。
 
https://paperswithcode.com/sota/monocular-3d-human-pose-estimation-on-human3

NVIDIA製のGPUや特殊なカメラを必須としない。

https://github.com/Walter0807/MotionBERT

### MotionBertの実装
下記の記事を参考にして、MotionBertをインストール。

https://github.com/Walter0807/MotionBERT/blob/main/README.md#installation

**windows**の場合、
下記の記事の通りに、コードを修正する必要がある。

https://github.com/Walter0807/MotionBERT/pull/69/commits

下記の記事を下記の記事を参考にして、MotionBertを実行。

https://github.com/Walter0807/MotionBERT/blob/main/docs/inference.md#3d-pose

実行結果として、

3次元の骨格座標データを得る。

#### 詰まった点
・GPUのCUDAはなくても、動作するので、インストール時にエラーが発生した場合は、下記の通り、変更してみる。
```
conda install pytorch torchvision torchaudio pytorch-cuda=11.6 -c pytorch -c nvidia
```
変更後
```
conda install pytorch torchvision torchaudio cpuonly -c pytorch
```

・python infer_wild.pyの実行で、
windowsの仮想メモリが不足してエラーが発生。増やしてみても解決しなかった。
infer_wild.pyを下記の通り編集して、処理の並列化を無効にすることで解決した。

```
'num_workers': 1,#もともとは8
```

## 最後に
初めての投稿なので、説明不足の部分があると思います。
不明点、間違いなどがございましたら、コメントからご指摘いただけるとありがたいです。

この3D姿勢推定の技術を利用して、**歩き方から個人の識別**の研究に取り組んでいます。
その記事も今後投稿しますので、よければお待ちください。
OpsRamp Logs - 特定の時間のログを検出する方法について

本記事では、OpsRamp Logsで特定の時間だけを対象にするログ検出方法について説明します。

# 概要
OpsRamp Logsでは、ログ検出をスケジュールし、特定の時間だけログ検出を動作させることが可能です。

# 設定方法
::: note info
アラート設定方法は、下記をご参照ください。
[OpsRamp Logsのアラート設定方法](https://qiita.com/vistanet-kh/items/3c5109657a55e2d1a5a1)
:::

アラート設定画面のALERT CONDITIONSのMonitoring項でScheduledを選択します。
DAILY、WEEKLY、MONTHLYでログ検出を動作させる時間を設定することが可能です。
![logs-alerting-schedule.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/8bf97686-dc5a-4dcd-2eae-d33ad2417fe1.png)

---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
Excel VBA 結合セルの行の高さをテキストボックスを使って自動調整する

## はじめに
エクセルでは結合したセルの行の高さを自動調整することができない。
そのため、VBAを使って自動調整を行う方法について考えたい。

## 作成したいマクロのイメージ
結合セルの列幅を取得する。
その列幅で、結合していないセルで自動調整した場合の行の高さを取得する。
取得した行の高さを結合セルに適用する。
この動作をなるべく簡潔なコードで実現したい。

## 作成したマクロの概要
模索した結果、テキストボックスを使用する方法で作成することにした。
セルとテキストボックスでは、自動調整時の高さに誤差があるが、許容範囲内と判断した。

### 動作手順
1. テキストボックスを用意する
1. 結合セルのデータをテキストボックスに入力する
1. 結合セルのフォント、フォントサイズをテキストボックスに適用する
1. テキストボックスのサイズをテキストに合わせて調整する
1. 結合セルの高さとサイズを調整したテキストボックスの高さを比較する
1. テキストボックスの高さより結合セルの高さが低い場合、セルの高さを調節する

#### 作成時に考慮したこと
- テキストボックスの上下左右の余白を5で指定し、自動調整時の高さの誤差を少なくした
- 縦に結合しているセルがある場合、1行目以降のセルも調整する対応を考えた
- セルの高さの調整時、セルの高さの最大値(409.5)を超えた場合の対応を考えた


## 完成したマクロ

```vb:MergedCellsRowAutoFit
Public Sub MergedCellsRowAutoFit()

Dim obj As Shape
Dim TargetRange As Range
Dim iRange As Range
Dim AdjustHeight As Double

    Application.ScreenUpdating = False

    With ActiveSheet   
        Set obj = .Shapes.AddLabel(msoTextOrientationHorizontal, 100, 100, 100, 100)
        Set TargetRange = .Range(.Range("A1"), .Range("A1").SpecialCells(xlCellTypeLastCell))
    End With

    obj.TextFrame2.MarginTop = 5
    obj.TextFrame2.MarginBottom = 5
    obj.TextFrame2.MarginLeft = 5
    obj.TextFrame2.MarginRight = 5

    TargetRange.EntireRow.AutoFit
    
    For Each iRange In TargetRange
    
        If iRange.MergeArea.Count = 1 Then

            If iRange.Value <> "" Then
                obj.TextFrame2.TextRange.Text = iRange.Value
            End If
            
        Else
        
            If iRange.MergeArea.Value2(1, 1) <> "" Then
                obj.TextFrame2.TextRange.Text = iRange.MergeArea.Value2(1, 1)
            End If
            
        End If


        If obj.TextFrame2.TextRange.Text <> "" Then
        
            obj.Width = iRange.MergeArea.Width
            obj.TextFrame2.TextRange.Font.Name = iRange.Font.Name
            obj.TextFrame2.TextRange.Font.NameFarEast = iRange.Font.Name
            obj.TextFrame2.TextRange.Font.Size = iRange.Font.Size
            obj.TextFrame2.AutoSize = msoAutoSizeShapeToFitText
            
            If iRange.MergeArea.Height < obj.Height Then
            
                AdjustHeight = iRange.RowHeight + obj.Height - iRange.MergeArea.Height  
                
                If AdjustHeight <= 409.5 Then
                    iRange.RowHeight = AdjustHeight
                Else
                    iRange.RowHeight = 409.5
                End If
                
            End If
            
        End If
        
        obj.TextFrame2.TextRange.Text = ""
    
    Next iRange
    
    obj.Delete
    Set obj = Nothing
          
    Application.ScreenUpdating = True
    
End Sub
```


サンプルファイル保存先：

https://github.com/rie1234k/ExcelVBA_Tips/tree/master/MergedCellsRowAutoFit
【開発メモ】Vueプロジェクトの構造

# npm run build
本番用ファイル群を作成するコマンド
dist配下に出来上がる。

# main.ts
全ての起点。
```createApp(App).mount('#app')```
で中身を作る

# index.html
```<div id='app'></div>```
のタグの中にすべてが書き込まれる。
基本となるテンプレート
VSCodeでStart Debuggingで実行したときにデバッグ処理を行う

## 概要

- VSCodeでPythonの開発をしており、`Run > Start Debugging`で実行したときのみ、デバッグ処理としてコマンドライン引数を渡しながらスクリプトの動作を確認したい

## 参考

- https://stackoverflow.com/questions/42397699/detect-debug-mode-in-vscode-extension

## 実装

- `.vscode/launch.json`にenvを追加し、そこにデバッグ時にのみ有効になる環境変数を追加する

```diff_jsondoc:.vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python Debugger: Current File",
            "type": "debugpy",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
+            "env": {
+                "VSCODE_DEBUG_MODE": "true"
+            }
        }
    ]
}
```

- `config.py`を作成しenvの情報を取得する処理を書く

```python:config.py
import os

# VSCodeからデバッグモードで起動しているかどうか
VSCODE_DEBUG_MODE = bool(os.environ.get("VSCODE_DEBUG_MODE"))
```

- 呼び出し例は以下の通り
- デバッグ起動時に自動でコマンドライン引数を渡せるようにしている

```python
import sys

from src.utils.config import VSCODE_DEBUG_MODE


def main() -> None:
    if VSCODE_DEBUG_MODE:
        sys.argv += ["-m", "Hello, Python"]
    print(sys.argv)


if __name__ == "__main__":
    main()
```

- 実行結果は以下の通り

```
# Run > Start Debuggingから実行した場合
['<path-to-dir>/src/api/hoge.py', '-m', 'Hello, Python']

# uv run hoge.pyを直接実行した場合
['<path-to-dir>/src/api/hoge.py']
```
3D測定機器と3Dスキャナーの違い

**3D測定機器と3Dスキャナーの違い**

現代の産業や製造において、3D測定機器と3Dスキャナーはどちらも重要なツールですが、機能、用途、動作原理において顕著な違いがあります。

**1. 動作原理**

3D測定機器は通常、レーザー、光学、または接触式の方法を使用して測定します。これらはプローブを使用して物体の表面に直接接触し、特定の点の座標を取得します。座標測定機（CMM）などの機器は、物体の寸法や形状の特徴を正確に測定できます。
![7c2e9311a336dd362247343aa7bf36ff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/01e2b734-2278-f9d1-ddfe-4ff57d10fc0f.png)



それに対して、3Dスキャナーは光学、レーザー、または構造光技術を使用して、物体の表面から大量のデータポイントを迅速にキャプチャし、完全な三次元モデルを生成します。これらのモデルは物体の形状、テクスチャ、色を詳細に示し、文化遺産の保護や逆向きエンジニアリングなどの分野で広く使用されています。

**2. データ出力**

3D測定機器は通常、精密な数値データを出力し、寸法検査や品質管理に適しています。これらのデータは工学分析や製造監視に使用され、設計基準を満たしていることを確認します。一方、3Dスキャナーは3Dポイントクラウドデータやメッシュモデルを生成し、コンピュータ支援設計（CAD）や仮想現実（VR）などのアプリケーションに最適で、設計プロセスをより直感的にします。

**3. 適用シナリオ**

3D測定機器は主に製造業や品質管理に使用され、部品やコンポーネントの精度を確保します。航空宇宙、自動車、電子機器などの業界で広く利用されています。これらは生産プロセスを最適化し、エラーを減少させるのに役立ちます。

一方、3Dスキャナーはアート、文化遺産保護、医療などの多くの分野で幅広く応用されています。文化財の修復では、3Dスキャナーが物体の形状を正確に記録し、研究のための基本データを提供します。また、ゲーム開発やアニメーション制作でもますます普及しており、デザイナーが仮想キャラクターや環境を迅速に作成するのに役立っています。
![83b195905a6a08d0b2b0735693168d09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/a8f82fa9-f245-82dc-5d94-b07fe9882862.png)
https://www.revopoint3d.jp/


**4. 精度と速度**

精度の面では、3D測定機器は通常、高い測定精度を提供し、厳しい公差管理が必要な業界に適しています。3Dスキャナーは複雑な形状をキャプチャするのが得意ですが、精度は若干劣るかもしれませんが、速度の面では通常優れています。大量のデータを迅速に取得することができます。

**結論**

総じて、3D測定機器と3Dスキャナーは、技術、用途、データ出力において明確な違いがあります。両者の特性を理解することで、適切なツールを選択する際に賢明な決定を下すことができます。技術の進歩が続く中、これらの機器の機能と応用範囲はさらに拡大し、さまざまな分野において新たな可能性と革新をもたらすでしょう。
唯一のメンターであるAIに聞いた、gets.split.map(&:to_i)に関する解説

先生の解説
```
# 1.入力を取得
input = gets.chomp # ユーザーからの入力を取得
# 2.空白で分割し、配列に変換
split_input = input.split 
# 3.各要素を整数に変換
ns = split_input.map { |num| num.to_i } 

# これで ns に整数の配列が格納される
```

説明
1.入力の取得: gets.chomp で、ユーザーからの入力を取得し、末尾の改行を削除します。

2.分割: input.split によって、取得した文字列を空白で分割し、配列に変換します。例えば、入力が "2 3 5" であれば、split_input には ["2", "3", "5"] が格納されます。

3.整数への変換: map { |num| num.to_i } を使って、各文字列要素を整数に変換し、最終的に整数の配列 ns に格納します。
VSCodeで全ファイルの中身が消えたときの対処法(個人的)

# 突然全ファイルの中身が消えた
Next.jsで開発中、一区切りついたのでMac開きっぱなしでご飯食べて、帰ってきて`npm run dev`したらERR!が大量に出現。package.jsonを確認したら何故か中身がまっさらに。

他のファイルも見てみると、ファイル自体は残っているのに何故か中身が全部消えてしまっていました。
GitHubのリモートリポジトリから復元しようと思いましたがgitファイルの中身も消えており読み取れない状態...
GoogleやchatGPTに聞いても何もヒットしなかったので、余計焦りました

これはまずいと思いましたが、流石に突然中身が綺麗さっぱり消えるわけないので、何かのバグだと仮定し、以下を実行しました。
1. VSCodeの再起動
1. Macの再起動

しかし状況は変わらなかったので、試しにXcodeで開いてみたところ、普通に中身が書いてありました。
よってVSCodeのバグだとわかったので、再インストールを実行。

# 結果
### Adobe Creative Cloudのせいでした
VSCodeを再インストールした結果、無事中身が表示され`npm run dev`も動くように。
一件落着かと思いましたが、動作がすごく重い。
ここで初めて、ひょっとして何か裏で動いている？と思いMacのストレージを見たら、残り30GBあったはずが残り3GBのぱんぱんになっていました。

実は裏でCreative Cloudの自動更新が行われており、イラレやプレミアの2025版がごろごろ勝手にインストールされていました。
アップデートの通知はおやすみモードで切っていたため、気づかなかった(あまりに遅すぎる動作を疑うべきでした)。

その後、とんでもない指の力でAdobeの自動更新ボタンをオフにし、開発を再開。
明日、このアプリの発表なんですけど、とんでもないタイムロスになりました。

初歩的すぎる問題ですが、みなさんも自動更新には気をつけてください。
『Rails の Web アプリに Google 認証を導入する』ための準備工程の"迷いどころ"だけのまとめ

# 記事の概要
* 『ローカル環境にある Rails の Web アプリに Google 認証を導入する』ために必要な準備工程で若干迷ったところだけをまとめました
* 作業は 2024/10/22 に行いました

## はじめに
* 私の開発環境について以下に列挙
    * Windows11 Home 24H2
    * Ubuntsu
    * Docker
    * VScode
    * Rails7.2.1
    * devise4.9
* 以下の記事のように `devise` は導入済み
    * `devise`によって生成される devise モデルではなく既に作成していた User モデルを利用した形

https://qiita.com/nakad119/items/967e53ace5788afdbcc1

## 作業の目的
* Rails のプロジェクトで Google 認証を使用する場合、"[omniauth-google-oauth2
](https://github.com/zquestz/omniauth-google-oauth2?tab=readme-ov-file)" の手順にある通り『"Google クライアント ID"と"Google クライアントシークレット"という API キーを取得』する必要があるため、それら必要な情報を取得するのが目的

> Get your API key at: https://code.google.com/apis/console/ Note the Client ID and the Client Secret.

:::note info
ザックリ説明としては『認証サーバー(Google 側) に対して、どのクライアント(Google認証を利用したい Web アプリ側) が Google 認証を利用しようとしているか』を設定する
:::


## 手順について
* [公式の手順](https://github.com/zquestz/omniauth-google-oauth2?tab=readme-ov-file)にもあるように [Google 認証を利用する設定をするサイト](https://console.cloud.google.com/apis/dashboard?project=mystic-song-387521)から設定を始めます
* 大筋の手順については下の記事が大変参考になりますので当記事では取り扱いません

https://zenn.dev/tteaoocl/articles/5601b28fa8045d

---
# 迷いどころについて（2024/10/22時点での操作）
* 先程ご紹介した記事の手順において、個人的に迷ったところだけ以下にピックアップします

## 1. メニューの表記違い
* [参考記事](https://zenn.dev/tteaoocl/articles/5601b28fa8045d)とは若干表記が異なる
* 表記はことなるもののアイコンは変わっていないのでそこで判断すればOK

(図１：表記は変わっているがアイコンは変わっていない)
After　　　　　　　   　　　　　　　　　　　　　 Before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518714/f952d18e-dc12-2767-a43b-f4c4301143d6.png)

## 2. プロジェクト名の命名
* 「プロジェクトを作成」時に要求されるプロジェクトの名称
* <font color="Red">作成後に変更できない</font>点は注意
    * 個人的には作成したアプリの名前を命名すれば良かったと後悔

(図２：このようにプロジェクトを選択する際に表示される)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518714/25d6e220-e694-6d2d-283c-4a064ef4d4ce.png)

## 3. アプリ名の命名
* 「アプリ名、ユーザーサポートメール、メールアドレスを記入」で要求される"アプリ名"については<font color="Red">確定後も変更可能</font>なので安心してOK
* 具体的には以下のようなログイン時の画面でアプリ名が表示されるのでタイプミスには注意
* <font color="Red">アプリロゴも設定および設定後の変更可能</font>
    * こちらも以下の画像のように表示される

(図３：このように設定したログインする対象のアプリ名が表示される)
<img width="400" src="https://zoom-support.nissho-ele.co.jp/hc/article_attachments/6647473678746">
[引用元：双日テックイノベーション株式会社 様](https://zoom-support.nissho-ele.co.jp/hc/ja/articles/360024382792-Google-Apple-%E3%81%BE%E3%81%9F%E3%81%AFFacebook%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6Zoom%E3%81%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%81%99%E3%82%8B)

---
### 参考資料
https://github.com/zquestz/omniauth-google-oauth2

https://zenn.dev/n4sh/articles/4040eefd693d67

https://cloud.google.com/application-integration/docs/configure-authentication-profiles?hl=ja#auth-types

https://zenn.dev/tteaoocl/articles/5601b28fa8045d

https://www.ka-net.org/blog/?p=7007
メモ

import java.time.ZonedDateTime;
import java.util.Map;
import java.util.HashMap;

public class YearMapGenerator {

    public static Map<String, String> generateYearMap() {
        int currentYear = ZonedDateTime.now().getYear();
        Map<String, String> yearMap = new HashMap<>();
        
        // 直接用for循环生成Map
        for (int i = 1; i <= 7; i++) {
            yearMap.put(String.valueOf(i), String.valueOf(currentYear + i - 1));
        }
        
        return yearMap;
    }
    
    public static void main(String[] args) {
        Map<String, String> result = generateYearMap();
        result.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));
    }
}
QUESTCON　Something Missing

## Something Missing
リクエストがあったので唯一解けた一問だけ書きます。僕が書いたので他のメンバーにも期待しています。

Autopsyを入れます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563446/cbbe39e7-2aab-3caa-6510-d6758d19ef5a.png)
一つだけファイルが抽出できるので、抽出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563446/bb71fe90-7125-975d-3200-7143e6506d64.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563446/8c381be8-53ef-ac1e-0776-0267fcb66649.png)
バイナリはこんな感じで、薄目で見たらexifデータがなんとなく見えてくるような気がしたので、pngかjpgでしょう。
その中でも、pngのマジックナンバー89 50 4E 47 0D 0A 1A 0Aに近い形をしていたので、pngに決め打ちします。マジックナンバーから修正していきます。ちなみに、pngの最初は89 50 4E 47 0D 0A 1A 0A   // PNGシグネチャ
00 00 00 0D 49 48 44 52   // IHDR チャンクになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563446/552af9d3-d20a-d343-96ab-c523ed95e6ae.png)

拡張子を変えて開けるようなら、下のほうに薄くフラグが書いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563446/adcdad0f-3d7f-3a44-4859-f175616bf4d2.png)
aozorasironekoで適当にビット抽出してあげればクリアです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563446/7d8a9d1f-0803-caa8-e5b1-b4fb7b0f1ecc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563446/995b6f2a-0e0e-f5d8-70aa-a6b2b80eaf53.png)
QUESTCON{H1dd3n_s0_y0u_can1_s33}
MACフレームとは

>`MACヘッダを付加したパケット`をMACフレームあるいはイーサネットフレームという

> MACアドレスによってデータリンク層の通信を行う`MACヘッダを付加`

https://gihyo.jp/book/2023/978-4-297-13865-3

# イーサネットフレームの図
https://fujikura-solutions.co.jp/technology/136/

https://www.ntt-west.co.jp/info/katsuyo/pdf/07/tenpu06_4.pdf

https://note.com/shinya_matsui/n/n828d805dfb68

https://www.cresc.co.jp/tech/network/NET_TUTORIAL/Section_11.htm

# 感想
MACアドレスなどを付加するのか
それ以外わからなかった。
地域メッシュコードと緯度経度の相互変換

地域メッシュとは、統計に利用するために、緯度・経度に基づいて日本国内をほぼ同じ大きさの網の目(メッシュ)に分けたものです

地域メッシュ統計(総務省統計局)
https://www.stat.go.jp/data/mesh/index.html

粗いほうから第1次メッシュ、第2次メッシュ、第3次メッシュ、2分の1地域メッシュ、4分の1地域メッシュ、8分の1地域メッシュの6段階があり、もっとも細かい8分の1地域メッシュでは約125m四方ごとに地域を表すことができます

地域メッシュ統計の特質・沿革(総務省統計局)
https://www.stat.go.jp/data/mesh/pdf/gaiyo1.pdf

以下にJavaScriptで緯度経度と地域メッシュコードを相互変換するコードを示します

### 緯度経度 → 地域メッシュコード
```JavaScript:latlonToMeshcode
function latlonToMeshcode( lat, lon){
  let meshCode = ("0" + Math.floor(lat*3/2)).slice(-2) + 
                   ("0" + Math.floor(lon*1)).slice(-2) + 
                   Math.floor( lat*12 % 8) + 
                   Math.floor( lon*8 % 8) + 
                   Math.floor( lat*120 % 10) + 
                   Math.floor( lon*80 % 10) + 
                   ( Math.floor( lat*240 % 2) * 2 + Math.floor( lon*160 % 2) + 1) +
                   ( Math.floor( lat*480 % 2) * 2 + Math.floor( lon*320 % 2) + 1) +
                   ( Math.floor( lat*960 % 2) * 2 + Math.floor( lon*640 % 2) + 1);
  return meshCode;
}
```
1次メッシュコードの場合は出力結果の上4桁を、2次メッシュコードの場合は上6桁を、3次メッシュコードの場合は上8桁を、2分の1地域メッシュコードの場合は上9桁を、4分の1地域メッシュコードの場合は上10桁を、8分の1地域メッシュコードの場合は上11桁すべてを使用してください

### 地域メッシュコード → 緯度経度
```JavaScript:meshcodeToLatlon
function meshcodeToLatlon( meshCode){
  meshCode = meshCode.replace(/\-/g,"");
  let lat = 0, lon = 100;
  if( meshCode.length >= 4){
    lat = lat + meshCode.substring(0,2) / 1.5;
    lon = lon + meshCode.substring(2,4) * 1;
  }
  if( meshCode.length >= 6){
    lat = lat + meshCode.substring(4,5) / 12;
    lon = lon + meshCode.substring(5,6) / 8;
  }
  if( meshCode.length >= 8){
    lat = lat + meshCode.substring(6,7) / 120;
    lon = lon + meshCode.substring(7,8) / 80;
  }
  if( meshCode.length >= 9){
    lat = lat + Math.floor((meshCode.substring(8,9)-1)/2) / 240;
    lon = lon + (meshCode.substring(8,9)-1)%2 / 160;
  }
  if( meshCode.length >= 10){
    lat = lat + Math.floor((meshCode.substring(8,9)-1)/2) / 480;
    lon = lon + (meshCode.substring(8,9)-1)%2 / 320;
  }
  if( meshCode.length >= 11){
    lat = lat + Math.floor((meshCode.substring(8,9)-1)/2) / 960;
    lon = lon + (meshCode.substring(8,9)-1)%2 / 640;
  }
  return {"lat":lat, "lon":lon};
}
```
各地域メッシュコードの南西端の緯度経度を返します。60進法(度・分・秒)から10進法(度)への変換は含みません
Docker container を VSCode で作る。参考資料を基に、本物の初心者がつまずいたとこ記録

参考資料
https://qiita.com/Yuki_Oshima/items/d3b52c553387685460b0
https://qiita.com/tsuyotobi26/items/9d48fa676f4d55170b5e


dev container を入れ、vscodeからコンテナ構成ファイルを持つフォルダーを開くと、”コンテナ内でもう一度開く”という選択肢が出てくる。
これを行うとコンテナが作れる。
ubuntuからdocker runする必要はない。
この時、dockerfileなどを含むフォルダは、workspacesというコンテナ内のフォルダの中にバインドマウント？（共有）され、wsl上でコンテナは生成されるが、vscodeのエクスプローラーでwinodowsのフォルダを操作できる（作成、編集も可）
dockerfileのコマンドWORKDIRはコンテナ内に入った時に、開かれるフォルダなので/workspacesにしたほうがいいのかも？
同様にdevcontainer.jsonのworkspaceFolderも同じ相対パスにする。
コンテナ内にもフォルダーがいくつか存在している、一つだけではない。
launch.json、tasks.jsonは.vscodeフォルダーの中、.vscodeはコンテナを作るときに開いたファイルと同じレベルに置く
tasks.jsonはソースコードを機械語にする
launch.jsonは機械語を実行するファイル
tasksファイルでコードファイルのパスと、機械語にしたファイルパスを入力する
【開発メモ】Vue3の基本的な開発用語・記法の確認メモ①

# Pinia
データをまとめて管理するライブラリ

# Vitest
ユニットテストを行うためのライブラリ

# Cypress
アプリケーション全体をテストするライブラリ

こういったテストのことをE2Eテストと呼ぶ
通信の端から端までを示すEnd to Endのことをかっこつけて言ってるだけ
ユーザがアプリをちゃんと使える？（ユーザがリクエストを送って、そのリクエストがサーバに届いて、ちゃんと帰ってくる？期待通りの動作してる？）
ってことをかっこつけて言ってるだけ。

# ESLint
静的コード解析
懸かれているソースコードが正しい書き方なのかチェックしてくれるツール
こういったツールのことをLinterと呼ぶ

```npm run lint```
とすることでコードが正しい書き方かチェックしてくれる
実際の現場ではレビューに出す前に必要なことかも

# Vite
ヴィートと読む。バイトじゃない。
Vue3の実行環境のことをこう呼ぶ。
フランス語で早いって意味で、何より早いかというと以前のvueの実行環境より早いらしい。
前はVue CLIとwebpackというツールを使って実行ファイルを生成していたらしいが、それが時間かかってた。
だから３ではECMAScriptというのを使ってパパっと実行環境を作れるようにしたから早くなった。

# コンポーネント
画面上にあるひとつの何かを表現しようとするまとまり。
例えば商品一覧だったら、その商品を表示する行を表したソースコードのまとまり。
それは
html・・・文字構造 
css・・・文字や背景の装飾、位置の調整 
js(javascriptの略)・・・上記に動きを付ける（ボタンが押された時どうするかとか、どこかの表示を変えるとか、とにかく画面上で何か起きる時はこいつの出番）
の三つで構成されていることが多い

これは普通それぞれ別ファイルに書く
htmlファイルに文字を書いて、その中でｃｓｓファイルとjsファイルを読み込む
だが、vueならこれらを一つのファイルに書くことができるらしい



# 記法関連
typescriptを指定し、setupで記述を簡略化できるようにする
```<script setup lang="ts">```


## マスタッシュ構文
```{{変数名}}```
scriptブロックで定義した変数をtempleteタグの中に表示させる。

ここで変数名を表示させるにはref関数に値を渡して、その戻りを変数定数に入れる必要がある
```const name = ref("ダンダダン");```

そしてref関数を使うには事前にファイルの上の方でそのrefを使う能力を借りる必要がある
```import {ref} from 'vue'```

つまり、このref関数はどっかのjsファイルの中で「外部からも使える関数でっせ」と記述されていることになる。
その「外部からも使えまっせ」を示すのが
__export__  function ref()｛ref関数の中身}
というキーワード

つまり自分で外部に使える関数を定義したいときもこれは使えるぞ。

exportされたものをimportする。この流れ。感覚。

## リアクティブシステム
js変数の中身が変わると、表示が自動で変わるシステム。
いや、普通変わるでしょ、と思うかもしれないが、普通は変わらない。
ただｊｓファイル上の値が変わっただけ。
変数の中身を変えて、その変数をhtml上に出力する、という手間が必要だ
だがその手間を省いてくれるらしい。
```
const Power = ref (変化する可能性がある値)

何かのイベントを起こす関数
　Power.value　＝　変化した後の値

<templete>
 <p>{{ Power }} </p>

```
こんな感じでrefに入れた値のvalueプロパティに値を挿入することで画面上の値を変化させてくれる
確かに楽かも。

## vueのコーディング規約
こちらのスタイルガイドを参照。
https://ja.vuejs.org/style-guide/

## computed
めっちゃ意味わからなかった部分。
refの意味とは…？みたいにごっちゃごちゃになった。
要は、何か計算する時に、その計算に必要な値が定期的に変化することがある時はcomputed関数でやるらしい
ちょっと良く分からないので一旦深追いはせずに先へ進む。
とにかく、リアクティブな値を計算するときはcomputed関数

ちなみにcomputedで表示する値を算出プロパティと呼ぶらしい

中に指定する無名関数やらアロー関数やらは、特定の計算した値を返してほしいんだけど、そのためにいちいち関数を作るのもめんどいな…みたいな時に使うもの
関数を用意せずして、return文を書けちゃう

## reactive関数
まとめてref出来る
reactiveをimportする必要あり
```
const data = reactive ({
    変数名：値、
    変数名：値、
})

data.変数名 ＝　代入したい値 ///変数名.valueがいらなくなる

```
ウォーターフォール開発手法とは？そのメリットやデメリットなど

<br>

## ■ はじめに
<br>

**ウォーターフォール開発手法** をご存じでしょうか。  
これは従来から多くのプロジェクトで採用されてきたソフトウェア開発の手法であり、
計画に基づいて各工程を順次進めていく特徴があります。
開発手法といえばアジャイル開発が注目される今、ウォーターフォール開発がどのような場面で有効かや、
そのメリットとデメリットを含めて解説していきます。

また、アジャイル開発については以下の記事で解説しておりますので合わせてご覧ください。

https://qiita.com/e-tak/private/1a5c0347bc23a7e63657

## ■ 目次
<br>

1. [ウォーターフォール開発とは？](#1-ウォーターフォール開発とは)
2. [ウォーターフォールのメリット](#2-ウォーターフォールのメリット)
3. [ウォーターフォールのデメリット](#3-ウォーターフォールのデメリット)
4. [ウォーターフォールが有効な場面](#4-ウォーターフォールが有効な場面)
5. [まとめ](#5-まとめ)

## 1. ウォーターフォール開発とは？
<br>

ソフトウェア開発プロジェクトにおいて、各フェーズを上流から順次進めていく
工程管理手法を **ウォーターフォール開発**といいます。

ウォーターフォールの名前が表す通り、上流から下流に一直線に工程が進んでいく様子を表しています。
そのため次のフェーズに移行する前に現在のフェーズを完全に終了させること基本となります。

- **要件定義**
    - プロジェクトの全体像と詳細な要件を定義
<br>

- **設計**
    - システムの仕様や構造を設計
<br>

- **実装**
    - 実際にソフトウェアを開発
<br>

- **テスト**
    - 実装したソフトウェアを検証
<br>

- **リリース**
    - 顧客に納品し、運用を開始
<br>

この流れであれば各段階が終わってから次に進むため、プロジェクトの進行状況が<br>予測可能であるので規模の大きなプロジェクトでは多く取り入れられている手法です。

## 2. ウォーターフォールのメリット
<br>

ウォーターフォール開発には、以下のようなメリットがあります。

- **明確なプロセス**
    - 各フェーズが明確に定義されており、プロジェクト全体の進行が予測しやすい
<br>

- **大規模プロジェクトに適している**
    - 大規模プロジェクトや安定した要件のプロジェクトでは、計画に基づいた進行が求められる
<br>

- **リソース管理がしやすい**
    - 各フェーズに必要なリソースを事前に把握しやすいため、人員や予算の管理が可能

## 3. ウォーターフォールのデメリット
<br>

一方で、ウォーターフォール開発には以下のデメリットもあります。

- **要件変更に弱い**
    - 要件が一度確定してしまうと途中での変更が非常に難しいため、<br>後の工程で柔軟な対応が求められるプロジェクトには不向き
<br>

- **手戻りが大きい**
    - 後半のフェーズで問題が発生した場合、<br>前のフェーズに戻ることが難しく大幅な修正が必要な可能性がある
<br>

- **長期間のプロジェクトではリスク**
    - 要件定義からリリースまでの期間が長いプロジェクトでは、最新の市場や技術の変化に対応し辛い
    （5年かかるプロジェクトであればリリース時には5年前の市場/技術となってしまう）

## 4. ウォーターフォールが有効な場面
<br>

ウォーターフォール開発は上記のメリット/デメリットを考慮したうえで、以下のようなプロジェクトに適しているといえます。
<br>

- **要件が明確に決まっているプロジェクト**
    - 要件が変更されることがほとんどない場合
    - 古い技術でもその技術が必要な場合
<br>

- **規模が大きく、各フェーズの分業が可能なプロジェクト**
    - 要件定義を行うチーム、設計を担当するチーム、開発を担当するチーム、テストを担当するチームなど、
    フェーズごとに役割を明確に分けることが可能なチームである場合、それぞれのチームが担当フェーズに    専念することができるため、ウォーターフォール開発に向いている

    - また分業が可能な環境ではプロジェクトマネージャーが全体の進捗状況を把握しやすく、
    スケジュール管理が容易になるという利点もある

:::note
大規模プロジェクトにおいては、全体像を把握しながらも細分化されたフェーズごとの管理が重要となりますが、ウォーターフォール開発ではフェーズごとの管理がしやすいため、大規模かつ複雑なプロジェクトで用いられることが多いようです。

:::

## 5. まとめ
<br>

- ウォーターフォール開発は、各フェーズを順番に進める手法
    - 予測可能であり、大規模プロジェクトに適している
    - 「明確なプロセス」、「リソース管理の容易さ」がメリット
    - 「要件変更に弱い」、「手戻りが大きい」がデメリット
- ウォーターフォールは要件が安定しているプロジェクトに適用すると効果的
AIの無駄口を封じるおまじない

## 前書き
最近、AWS Bedrockを使ってエージェントの開発をしています。ベースモデルとして `Claude 3.5 Sonnet` を使用していますが、そのモデルの出力制御に苦労しています。

![AmazonBedrock-728x354.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/6b21e3b2-bf73-a09d-8aab-beb55627eac3.png)


## 事象
フロントエンドが処理しやすいように、モデルにJSON形式で出力してもらいたくて、以下のようなプロンプトを定義しました。

```text
最終的な回答は、以下のJSON形式で**必ず**答えてください：

{
  "code": 200,
  "message": "君の見解"
}


- **出力は必ずこのJSON形式のみ**とし、JSON形式以外の文字やテキストを絶対に含めてはいけません。
- 「君の見解」の部分には、質問に対する丁寧な回答を記載してください。
- **例外なく**、JSON以外のメタ情報や補足説明は含めてはいけません。
- JSON以外のテキストを出力することは厳禁です。
```

さあ、実際に出力してみましょう :point_up_tone1:

![0E0D6E5D-C661-48F7-A654-4F79CA2D2DC3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/e81dabf8-b6fc-5022-ef0d-9907c38b1f97.jpeg)

指定通りにJSON形式で出力してくれました。

ここまでは順調でしたが、次にアクショングループを用意し、そのアクショングループに天気情報を取得できるLambdaを追加しました。

![84269F36-A2E0-4B0C-8029-88D2FCB78106.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/4a908c9c-84bc-4e2f-9ee8-ef4d1f1ab30b.jpeg)

JSON形式ではあるものの、その前に余計な情報も出力されてしまいました :frowning2:
プロンプトを修正しても改善が見られず、ちょっと 中の人 に聞いてみました。


「`DO NOT TALK JUST GENERATE ANSWER`」

これをプロンプトの最後に追加すれば良いとのことでした。

## テスト

![733C0C7D-CC59-454C-B3FE-B1AABE5ED32D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/05d05410-4fea-dfce-e1c9-7ed463d42426.jpeg)

余計な口出しをしなくなりました :relaxed:

## 最後

まだたまに余計な出力がされることもありますが、かなり改善されたと思います。

## 補足

まだ安定してるわけではないので、下記のメソッド作ってマッピングもしてます、よかったら参考にしてください。

```typescript
type Data = {
  code: number;
  message: string;
};

export function extractJsonData(input: string): Data | null {
  const jsonStringMatch = input.match(/{\s*"code"\s*:\s*200[\s\S]*?}\s*}/);
  if (jsonStringMatch) {
    try {
      const cleanedJsonString = jsonStringMatch[0].replace(/[\x00-\x1F\x7F]/g, "");
      const salesData: Data = JSON.parse(cleanedJsonString);
      return salesData
    } catch (error) {
      console.error('JSONのパースに失敗しました:', error);
      return null
    }
  } else {
    console.error('適切なJSONが見つかりませんでした');
    return null
  }
}
```
[AWS #28] Amazon Comprehend

<!--
 <font color="c00000"></font> 赤
-->
## はじめに
こんにちは 最近寒いのやら暑いのやら寒暖差が激しいすな
今回はAI/MLサービスである **<font color="c00000">「Amazon Comprehend」</font>** について紹介したいと思います。

## Amazon Comprehend
:upside_down: <font color="c00000">**Amazon Comprehend**</font>とは、文章を分析する<font color="c00000">**自然言語処理サービス**</font>です。文章が日本語や英語など、**どの言語かを自動検出**したり、文章に含まれる人物名、会社名、イベント名などの**固有名詞を抽出**したり、**キーワードを検出**したりできます。

文章の内容が **「ネガティブ」か「ポジティブ」** かを判断して、クレームを素早く見つけたりすることもできます。Comprehendもデモ画面に文章を貼り付けて試すこともできます。

### 機能のまとめ
Amazon Comprehendができることの**機能**を簡単にまとめました

:::note warn
今回は**日本語対応ができる**機能を紹介します
:::
![AWS28_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/ae49fecb-afb8-178a-8637-4df923e6348e.png)

## おわりに
今回のちょっとしたまとめになります。

:::note info
Amazon Comprehendは、**機械学習**を利用した<font color="c00000">**自然言語処理**</font>サービス
:::


最後までお読みいただきありがとうございました！
>>日頃より活用している参考書です。
>> **「参考書」**
[AWS認定クラウドプラクティショナー改定第3版（ACMは237ページ）](https://x.gd/19i6N)
>
> **「AWS公式サイト」**
[Amazon Comprehend](https://aws.amazon.com/jp/comprehend/)
>
> **「参考元」**
[Amazon Comprehendとは何か？機能と利用方法を徹底解説](https://www.issoh.co.jp/tech/details/3110/)
>
TypeScriptでReduxをセットアップして初期状態を準備する方法

**今回はTypeScriptでReduxをセットアップして初期状態を準備する方法を記事にしたいと思います。**

**Reduxストアの作成**
srcディレクトリ内にstoreフォルダを作成し、store.tsファイルを追加します。

src/store/store.ts
```typescript
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from '../features/counter/counterSlice';

export const store = configureStore({
  reducer: {
    counter: counterReducer,
  },
});

// RootStateとAppDispatchの型をエクスポート
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
```

**スライスの作成**
機能ごとの状態とロジックを管理するために、スライスを作成します。ここではカウンター機能のスライスを作成します。

src/features/counter/counterSlice.ts
```typescript
import { createSlice } from '@reduxjs/toolkit';

export interface CounterState {
  value: number;
}

const initialState: CounterState = {
  value: 0, // 初期状態の設定
};

export const counterSlice = createSlice({
  name: 'counter',
  initialState,
  reducers: {
    increment: (state) => {
      state.value += 1;
    },
    decrement: (state) => {
      state.value -= 1;
    },
    incrementByAmount: (state, action: { payload: number }) => {
      state.value += action.payload;
    },
  },
});

export const { increment, decrement, incrementByAmount } = counterSlice.actions;
export default counterSlice.reducer;
```

**プロバイダーの設定**
index.tsxファイルでProviderを使ってReduxストアをアプリケーションに提供します。

src/index.tsx
```typescript
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { store } from './store/store';
import { Provider } from 'react-redux';

ReactDOM.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>,
  document.getElementById('root')
);
```

**コンポーネントでの状態の使用**
App.tsxでReduxの状態とディスパッチ関数を使用します。

src/App.tsx
```typescript
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { RootState } from './store/store';
import { increment, decrement, incrementByAmount } from './features/counter/counterSlice';

function App() {
  const count = useSelector((state: RootState) => state.counter.value);
  const dispatch = useDispatch();

  return (
    <div>
      <h1>カウント: {count}</h1>
      <button onClick={() => dispatch(increment())}>増加</button>
      <button onClick={() => dispatch(decrement())}>減少</button>
      <button onClick={() => dispatch(incrementByAmount(5))}>5増加</button>
    </div>
  );
}

export default App;
```

**アプリの起動**
設定が完了したので、アプリケーションを起動して動作を確認します。

```bash
npm start
```
ブラウザでhttp://localhost:3000にアクセスし、カウンター機能が正しく動作することを確認してください。

# まとめ
**Redux Toolkitを使用することで、ボイラープレートを削減し、よりシンプルに状態管理を実装できます。**

参考資料
Redux公式ドキュメント
Redux Toolkit公式ドキュメント
React Redux公式ドキュメント

**毎日更新していますので、@y-t0910をフォロー,いいねしていただけると嬉しいです。**
パラメータごとにSchedulerを変えるにはLambdaLRが超便利

# モチベーション
どんなときにSchedulerが複数いるのか？

事前学習済みモデルをヘッドだけ変えてファインチューニングするときなど，
バックボーンは細かい学習率でwarmupしたい．
でもヘッドはスクラッチだから最初から大きな学習率にしたい!!


よって，例えば次のように複数のSchedulerを使いたくなります．
バックボーン：`Warmup Cosine Decay LR Scheduler`
ヘッド：`Constant LR Scheduler`


そこで便利なのが`torch.optim.lr_scheduler.LambdaLR`です!

https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.LambdaLR.html

これを使うとパラメータグループごとに異なる`step`関数を定義できるため，上記のニーズを満たすことが出来ます．

<img width=20%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691046/f6414300-8aeb-f890-a555-a80f06220aa8.png" width="60%">

# 実装例

## モデル
今回はbacknoneとheadをパラメータにもつModelを定義します．

```py
import pytorch_lightning as pl
import torch
import torch.nn as nn

class MyModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.backbone = ... 
        self.head = ...

    def forward(self, x):
        x = self.backbone(x)
        x = self.head(x)
        return x
```

## Lambdaの定義
LambdaLRに渡す各スケジューラに対応する`step`関数を用意します．

今回は，
`configure_warmup_cosine_decay_lambda`でWarmup Cosine Decayのstep
`constant_lambda`でConstant LRのstep
を行う関数を実装します


```py
def configure_warmup_cosine_decay_lambda(total_steps, warmup_steps):
    def warmup_cosine_decay_lambda(current_step):
        if current_step < warmup_steps:
            # Linear warm-up
            return float(current_step) / float(max(1, warmup_steps))
        else:
            # Cosine decay
            progress = float(current_step - warmup_steps) / float(max(1, total_steps - warmup_steps))
            return 0.5 * (1.0 + math.cos(math.pi * progress))
    return warmup_cosine_decay_lambda


def constant_lambda(current_step):
    return 1.0
```

## OptimizerとSchedulerの作成

Optimizerはbackboneとheadで分割したパラメータグループを渡して作成します．

次に，各パラメータグループで使いたい`step`処理として先ほど作った関数で`backbone_lambda`と`head_lambda`を作ります

最後に`LambdaLR`の`lr_lambda`引数にパラメータグループの順番に合わせて，lambdaをリストで指定したらSchedulerの完成です!


```py
# モデル初期化
model = MyModel()

# Optimizer作成
backbone_lr = 1e-3
head_lr = 1e-2
optimizer = torch.optim.SGD(
    [
        {'params': model.backbone.parameters(), 'lr': backbone_lr},
        {'params': model.head.parameters(), 'lr': head_lr}
    ],
    momentum=0.9,
    weight_decay=1e-4
)

# backbone用のstep関数を定義
total_steps = MAX_STEP
warmup_steps = int(0.1 * total_steps)
backbone_lambda = configure_warmup_cosine_decay_lambda(total_steps, warmup_steps)
# head用のstep関数を定義
head_lambda = constant_lambda

# schedulerを作成
scheduler = LambdaLR(
    optimizer,
    lr_lambda=[backbone_lambda, head_lambda]
)
```
LangChain チュートリアル SyntaxError: invalid syntax エラー修正例

・エラー内容
Python の文法に誤りがある。
```test.py
  File "<ipython-input-8-581f3f6b1fe5>", line 1
    export LANGCHAIN_TRACING_V2="true"
           ^
SyntaxError: invalid syntax
```

・修正案
ファイル名は仮名です。
```test.py
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["export LANGCHAIN_API_KEY"]="...."
```
いままでの私、これからの自分

## はじめに
　みなさま。　初めまして。

　わたしは、IT業界に身を置いて40余年、古参のエンジニア？です。
　この長い歴史の中で、みなさまのお役に立てるヒントがあればと思い、筆を執りました。

　私の第一印象は、少々気難しくて、冷たい感じがするようです。
　会話をすると、笑い話に花を咲かせながら、締めるところは締めるようなイメージです。

　私は、アナログ計算機、ハイブリッド計算機を経験した後、デジタル計算機に移りました。
　構造化設計を駆使して少ないメモリで、かつ高速に動作するプログラムを目指していたのです。
　少ない資料で検証しながら、必要な機能はほとんど設計してプログラムを作っていきます。
　その上、厳しい顧客や先輩がいて、半泣きの状態でした。
　そんな過去を振り返って見ました。
 ## いままでの私
・最初の頃は、目標がはっきりしない私に取って、目の前のことを一生懸命やるしかありませんでした。
　そのお陰で、少しはシステムの基本が積みあがったと感じています。
 
・厳しい世界にいたせいか、部下にも厳しい目線を向けたことがあります。
　例えば、よく遅刻してくる部下に「この部下は使えない」と判断してしまいました。
　「仕事が面白くないのか？」、「家庭の都合なのか？」、「仕事で悩んでいるのか？」
　など、もっと原因を突き詰めて対応するべきだったと感じています。

・頑張って一生懸命、やっても結果を出せなったことがあります。
　さらに、降格や他の部署へ移動させられたりして、半端ない悔しい思いをしました。
　1日掛けて心を納め、目の前の仕事に集中しました。
　仕事を効率的に管理できるプログラムを独自開発して、ある程度の評価も得ました。

・組織の中で活動するには協調性が必要です。
　「それは違う」と言えるタイミングと言えないタイミングがあります。
　言えないタイミングのときは苦しい思いをしますが、言えるタイミングを待つしかないと思っています。
　身近な人と会話するのもありかなと思います。

・やる気を無くすような噂を聞いたことがあります。
　例えば、「～さんは出来が悪いよね」、「資格を持っていても意味ないよね」などです。
　その噂が、事実であるかどうか？、どういうシチュエーションで言われたのか？など、
　分からないまま、ネガティブに考える事はしないようにしています。　無視です。

・「偶然に起きたので仕方ないね」と言う話を聞いたことがあります。
　「偶然」は、私たちが未知であったために起きるものです。
　「必然に発生した」と言う立ち位置で解決しようとしていますが、
　「解決した」と納得できるものは余りありません。
　そのためにも「過去に学べ(Study the past}」　を心に留めています。

・緊張が続くと、休憩を取って身体を休めるようにしています。
　仕事が集中してしまうと、自分自身を見失うことがあります。
　無我夢中で消化して、脱力感だけが残るような。
　こういう時は、こまめに深呼吸をして休憩を取ります。
## これからの自分
昨年、65歳定年で退職しました。
「これから、自分はどういう余生を送りたいのか？」となると、難しい問題です。

・「何をやりたいのか？」と考えると、はっきり答えが出ません。
　そのため、「何ができるか？」、「何をやったら喜んでもらえるか？」と言う観点で
　整理すると、少しずつやる気が芽生えてきました。

・1年掛けてWebシステムを作りました。　どこまで走れるか分かりませんが、やってみようと思います。
　簡素なホームページを開いていますので、気軽にお立ち寄りください。
 ## さいごに
 「自分はどんな姿になりたいのか？」は、永遠の課題のように思っています。
しかし、「自分のできることなど、たかが知れている」と考えれば、心が軽くなります。
今、できることを一生懸命やろう、と考えています。