OmniAICreator/Qiita-1.07M huggingface dataset:
肥満度、標準体重を求める(Python)

# 肥満度、標準体重を求める #

肥満度、標準体重を表示するプログラムを実装しました。

```python
# 新規作成 2023/3/2
# BMI測定及び肥満度判定

height = 0
weight = 0.0
# 結果出力
# 出力結果関数
def output():
  separator = "=="
  print(separator * 20)

# 肥満度判定関数
def hantei(data):
  if data < 18.5:
    print("痩せ過ぎです")
  elif data < 25:
    print("普通体重です")
  elif data < 30:
    print("軽程度肥満です")
  elif data < 35:
    print("中程度肥満です")
  else:
    print("高程度の肥満です")

# 標準体重計算関数
def calc_sweight(w_h):
  # 小数点以下1位まで求める
  r = format(w_h * 22,'.1f')
  # 結果を返す
  return r

while True:
  # 例外処理
  try:
    H = int(input("身長をcm単位で整数で入力してください "))
    height = H
    break
  except:
    print("Check NG")

while True:
  # 例外処理
  try:
    W = float(input("体重をkg単位で整数または小数で入力してください "))
    weight = W
    break
  except:
    print("Check NG")

# BMIの値を計算する
w_h = (height / 100) ** 2
BMI = weight / w_h
# 結果を出力する
output()
print("あなたのBMIの値は{:.2f}です".format(BMI))
# 肥満度を表示する
hantei(BMI)
# 標準体重を計算する
result =  calc_sweight(w_h)
print(f"標準体重は{result}kgです")
output()
  
```
Webstorm v.2022.3.2 から Jest 実行すると勝手に --experimental-vm-modules が付与される


# 現行Webstorm 2022.3.2版 の JEST実行機能は --experimental-vm-modules オプションを勝手に付与するようだ

というはなしです。

Webstorm の JEST 実行機能はとても便利なのですが、2022.3.1版　および　2022.3.2 版で Webstorm内から JEST を実行すると、

```
SyntaxError: The requested module 'xxx' does not provide an export named 'default'
```

というエラーが出ました。

xxx はライブラリ名。

ローカルで `npm test` をコマンドラインでやったり、circle ci ではとくに問題もなくテストも実行されるので、Webstormさんが何かやらかしているのかとおもい調べてみました

# 原因

調査の結果 Webstormさん が 勝手に　`--experimental-vm-modules` を node options に追加してくれていることが判明。

ESMをテストしたいとか、必要なときに自分で追加するので、Webstorm さん、勝手に node options を追加しないでほしいです。


# 回避策

- その１
Webstorm の JEST 実行の Edit Configuration で手動で `--experimental-vm-modules` を消す

- その２
2023年3月末にリリースされる 2023.1 版を待つ（ **その１** をやりながら耐える）

以下にあるとおり、Webstorm 2023.1 で勝手に追加するのをやめてくれるらしいです。
2023.1 は 2023年3月リリースらしいので、あと1か月弱がまんします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170905/125e42e0-303d-eaa3-d25c-dd616e29aa9d.png)

https://youtrack.jetbrains.com/issue/WEB-52967/Automatically-add-experimental-vm-modules-to-Jest-for-ESM-projects
PostgreSQLで変数を使った際のエラー

普段MySQL使ってるからか、PostgreSQLでちょっとだけハマったこと

```python
import psycopg2

conn = psycopg2.connect("user=" + users +" dbname=" + dbnames +" password=" + passwords, host=host, port=port)
cur = conn.cursor()
cur.execute("SELECT * FROM mydatabase WHERE user_id = %s;",(user_id))
results = cur.fetchall()[0]
print(results[1])
cur.close()
conn.close()
```

変数を使ってデータベースから取り出すコードなんだけど

```
TypeError: not all arguments converted during string formatting
```

？？？

```diff_python
import psycopg2

conn = psycopg2.connect("user=" + users +" dbname=" + dbnames +" password=" + passwords, host=host, port=port)
cur = conn.cursor()
- cur.execute("SELECT * FROM mydatabase WHERE user_id = %s;",(user_id))
+ cur.execute("SELECT * FROM mydatabase WHERE user_id = %s;",(user_id,))
results = cur.fetchall()[0]
print(results[1])
cur.close()
conn.close()
```

1つの変数だとカンマをつけないとだめらしい。

```
VALUES (%s,%s,%s)",(user_id, user_name, time)
```
ちなみにこういう複数だと問題なし。


SQLもちゃんと基礎から勉強しないと・・・

参考：https://symfoware.blog.fc2.com/blog-entry-1257.html
Cisco 3560CX-12TCS++ V04 enable ipservices on CLI

## Cisco 3560CX-12TCS++ V04のipservicesをCLIで有効化する
enabling ipservices on Cisco 3560CX-12TCS++ V04 from CLI

ip vrf コマンドが使えないと相談があり調査
IOSの更新で対応するのか調べたが別の記事を見つけた

参照：Right-To-Use ライセンスの設定
https://www.cisco.com/c/ja_jp/td/docs/switches/lan/catalyst9500/software/release/16-6/configuration_guide/sys_mgmt/b_166_sys_mgmt_9500_cg/b_166_sys_mgmt_9500_cg_chapter_010.pdf


~~~bash
Switch#license right-to-use activate ipservices ?
  acceptEULA    Accept  the EULA without reading it now
  evaluation    evaluation  Activate Evaluation License
  subscription  subscription  Activate subscription License
  <cr>

Switch#license right-to-use activate ipservices ac
Switch#license right-to-use activate ipservices acceptEULA ?
  <cr>

Switch#license right-to-use activate ipservices acceptEULA
 Activated Permanent Right-To-Use ipservices license

 Next Reboot level is ipservices
~~~

show version compair
### before
~~~bash
Switch#show version
Cisco IOS Software, C3560CX Software (C3560CX-UNIVERSALK9-M), 
# 略
License Level: ipbase                          # <-
License Type: Default. No valid license found. # <-
Next reload license Level: ipbase              # <-
# 略
~~~

### after
~~~bash
Switch#show version
# 略
Cisco IOS Software, C3560CX Software (C3560CX-UNIVERSALK9-M), V

License Level: ipservices              # <-
License Type: Permanent Right-To-Use   # <-
Next reload license Level: ipservices  # <-
# 略
~~~
Google Mapでハザードマップを表示するまで１ - 国土数値情報、東京都オープンデータカタログのデータを調べる


『Google Mapでハザードマップを表示するまで』の第１回の記事です

第２回は[こちら](https://qiita.com/mjusui/items/584591763aa66d931738)
第３回は[こちら](https://qiita.com/mjusui/items/e6d2090c307eab87670a)


# ハザードマップを見たいときに困ること

- 自治体ごとに情報が分散している
- pdf
- 自宅や、これから住もうとしている家がどこなのか分かりづらい

結局、見慣れた地図であるGoogle Mapで、日本全国のデータが見られるのが一番良い

- 地名で検索できる
- なんとなく見たいエリアをスクロールできる

ということで、開発することにしました

# 表示するデータセット

- [国土数値情報 - 洪水浸水想定区域データ](https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-A31-v3_0.html)
- [東京都オープンデータカタログサイト - 浸水予想区域図](https://catalog.data.metro.tokyo.lg.jp/dataset/t000014d0000000029)

ひとまず洪水の情報を表示できるようにします
国と東京都が、それぞれ浸水深のデータを提供しているので、この２つのデータを表示することにしました

# データセットの概要

東京度の [よくある質問（浸水予想区域図）](https://www.kensetsu.metro.tokyo.lg.jp/jigyo/river/chusho_seibi/index/QandA.html) を読むと、２つのデータセットの概要や関係性が、なんとなく分かります

簡単に説明すると、国が都道府県と連携して「洪水浸水**想定**区域」のデータ(日本全国版)を提供しており、東京都だけは独自に「洪水浸水**想定**区域」より調査範囲を広げた「浸水**予想**区域図」というデータを提供しているという感じです(想定とか予想とか、微妙に名前変わってて紛らわしい)


### 洪水浸水想定区域
「洪水浸水想定区域(国)」については、想定する降雨の基準やデータフォーマットが過去何度か更改されていて、そのたびにデータセットを作成しているので平成24年度版と、令和元年〜３年度(2019年〜2021年)版の2つがあるようです

後者はなぜ３年分かというと河川の管理者ごとに分担して調査しており、流域面積の広い河川は複数年度に分けて調査したり、年度ごとに河川の整備状況などを考慮してデータを更新したりしているようです


### 想定最大規模と計画規模

洪水ハザードマップを作成する際に、どの程度の降雨を想定するかについては2つの基準があります(これも国が定めているようです)

- 1.想定最大規模
1000年に1度の確率で発生する降雨規模
- 2.計画規模
10〜100年に1度の確率で発生する降雨規模


「洪水浸水想定区域(国)」では、河川の管理者ごとに、どちらを想定したデータが作成されているか異なり(両方のデータが提供されていることもあります)、「浸水予想区域図(東京都)」では、基本的には **想定最大規模** を想定してデータを作成しているようです


# データ表示の方針

- 河川ごとの最新のデータは何年度版に含まれているか
- 想定最大規模と計画規模で重複しているデータ(定義からいって不自然ですが、重複していないデータもありました)は、どう扱うべきか
- 別の河川と重複しているデータは、どちらを優先すべきか

上記のようにデータが重複しているような場合、データ表示の優先度をどうすべきか、よく分からなかったのでデータの提供元に問い合わせを何度かして、表示の優先度についての方針を、以下のように決めました

- 1.浸水予想区域図(東京都)のデータを最優先
  - 1-1.データが重複する場合は、浸水深がより大きい方を優先
- 2.洪水浸水想定区域図(国)のデータは、年度の新しいものを優先
  - 2-1.年度が同じ場合は、想定最大規模を計画規模より優先
  - 2-2.年度も規模も同じ場合は、浸水深がより大きい方を優先

災害を想定するものなので、なるべく想定される被害を大きく見積もるようにしています


# おわりに

表示するデータについて、ある程度まで理解できたので、次はデータを表示する要素技術について書こうと思います
RubyでGPT-3.5-turboを試した

ChatGPTのAPIが公開されたそうな。
Rubyからも、簡単に呼ぶことができる。
これを利用してデスクトップ用のミニツールを書いた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/341e561d-7cb7-f59b-3f94-c78af0e2756c.png)

使ったライブラリ

https://github.com/alexrudall/ruby-openai

https://github.com/AndyObtiva/glimmer-dsl-libui

コード

```ruby
require 'glimmer-dsl-libui'
require 'ruby/openai'

class ChatGPT
  class Message < Struct.new(:role, :content)
    def role_color
      [role, color]
    end

    def content_color
      [content, color]
    end

    def color
      case role
      when 'System' then :gray
      when 'Human' then :green
      when 'CatGPT' then :brown
      else raise
      end
    end
  end
  attr_reader :history

  def initialize
    @client = OpenAI::Client.new(access_token: ENV['OPENAI_ACCESS_TOKEN'])
    @history = [Message.new('System', 'Act like a cat')]
    call('Hi gpt 3.5 turbo!')
  end

  def call(query_text)
    res = @client.chat(
      parameters: {
        model: 'gpt-3.5-turbo',
        messages: generate_message(query_text)
      }
    )
    str = res.dig('choices', 0, 'message', 'content')
    history << Message.new('Human', query_text)
    history << Message.new('CatGPT', str)
  end

  def generate_message(query_text)
    m = history.map do |m|
      case m.role
      when 'CatGPT'
        { 'role' => 'assistant', 'content' => m.content }
      when 'Human'
        { 'role' => 'user', 'content' => m.content }
      when 'System'
        { 'role' => 'system', 'content' => m.content }
      end
    end
    m.push({ 'role' => 'user', 'content' => query_text })
    p m
  end
end

class Chat
  include Glimmer
  attr_accessor :entry_text

  def initialize
    @chatgpt = ChatGPT.new
  end

  def launch
    window('CatGPT - Glimmer DSL LibUI', 400, 400) do
      vertical_box do
        table do
          text_color_column('role')
          text_color_column('content')
          cell_rows <=> [@chatgpt, :history,
                         { column_attributes: { 'role' => :role_color, 'content' => :content_color } }]
        end
        horizontal_box do
          stretchy false
          entry do
            text <=> [self, :entry_text]
          end

          button('GO') do
            stretchy false
            on_clicked do
              @chatgpt.call(entry_text)
            end
          end
        end
      end
    end.show
  end
end

Chat.new.launch
```

この記事は以上です。
早速ChatGPTで漫画紹介LINEボットを作った件

# LINEボットとOpenAIのAPIを使って漫画の紹介できるかチャレンジしてみた
ChatGPTの性能がすごいと話題なので、ChatGPTのコア技術のGPT3を利用して漫画紹介Lineボットのデモを作ってみました。結果的にはこんな感じの会話がLineボットとできるようになりました。


<img width="300" src="https://storage.googleapis.com/zenn-user-upload/8b3d5a0b75fe-20230223.png">

<img width="300" src="https://storage.googleapis.com/zenn-user-upload/9c015769ee0c-20230223.png">

<img width="300" src="https://storage.googleapis.com/zenn-user-upload/d273d7b11b05-20230223.png">

<img width="300" src="https://storage.googleapis.com/zenn-user-upload/927de00fd68e-20230223.png">

# QRを読み込んですぐ使えます。ぜひお試しください!

<img width="400" src="https://storage.googleapis.com/zenn-user-upload/d1738252559f-20230307.png">

<a href="https://line.me/R/ti/p/%40785mpyjw" class="btn">LINEでフレンド登録する</a>

＊ システム運用が試行錯誤中のため、```毎日 24時間```動かしてみます。お時間合えばお試しください。
＊ まだデモレベルなので返答はまだまだ不完全です。その点を多めにみていただけると嬉しいです。気になった点があれば、フィードバックいただけると嬉しいです。


# OpenAIの漫画紹介力のポテンシャル
まず、OpenAIのPlayGround(OpenAIの技術を試せる遊び場)で、高品質なAIのdavinci-003を使って漫画の紹介力のポテンシャルを測ってみました。(下記の図)。
異世界系の漫画の「葬送のフリーレン」に似た漫画として「蒼穹のファフナー」をおすすめしてくれています。どちらのSF系でおおよそいい紹介となっていそうです。日本の漫画をうまく理解できてる点は素晴らしいですね。
![](https://storage.googleapis.com/zenn-user-upload/54ab9c84082e-20230223.png)

* 補足
	* 葬送のフリーレン
		* https://www.amazon.co.jp/%E8%91%AC%E9%80%81%E3%81%AE%E3%83%95%E3%83%AA%E3%83%BC%E3%83%AC%E3%83%B3%EF%BC%88%EF%BC%91%EF%BC%89-%E5%B0%91%E5%B9%B4%E3%82%B5%E3%83%B3%E3%83%87%E3%83%BC%E3%82%B3%E3%83%9F%E3%83%83%E3%82%AF%E3%82%B9-%E5%B1%B1%E7%94%B0%E9%90%98%E4%BA%BA-ebook/dp/B08FDH57JT
	* 蒼穹のファフナー
		* https://www.amazon.co.jp/%25E8%2592%25BC%25E7%25A9%25B9%25E3%2581%25AE%25E3%2583%2595%25E3%2582%25A1%25E3%2583%2595%25E3%2583%258A%25E3%2583%25BC-%25E5%2585%25A89%25E5%25B7%25BB/dp/B075GVB2HP

# システム設計
高品質なAIのdavinci-003の漫画紹介力はすごいので、それを利用してLineボットを作成しました。LineボットはAWSのクラウドサービスを利用しながら作成しました。(下の図) 
かなり単純な設計でawsを使ってOpenAIのAPIを読み出しているだけです。
そのOpenAIの応答結果をLINE Messaging APIを使って、ユーザ側に返答をしています。
![](https://storage.googleapis.com/zenn-user-upload/169ad8b939c8-20230223.png)

# Lineボットに色々聞いてみよう

## 質問1 家事関連の漫画は？
<img width="300" src="https://storage.googleapis.com/zenn-user-upload/d273d7b11b05-20230223.png">

家事を楽しむヒントのありそうな、いい感じの漫画をおすすめしてくれました！

## 質問2 アーニャって知ってる？
<img width="300" src="https://storage.googleapis.com/zenn-user-upload/8b3d5a0b75fe-20230223.png">

アーニャは理解してそうです。

## 質問3 ただただ挨拶してみる
<img width="300" src="https://storage.googleapis.com/zenn-user-upload/9c015769ee0c-20230223.png">

挨拶しながら、頑張って漫画をおすすめしてくれている。かわいい。

# 課題はAPIのリクエストには、まあまあお金がかかること
結果的に面白い応答ができたのですが、Open APIの利用にはお金がかかってしまいます。なので今回は、Amazonのアフィリエイトリンクを入れさせてもらって、もしいい紹介ができて漫画を購入していただけたら、その収益をLineボットの運用費に回そうと思っています。OpenAIのAPIの利用は、まあまあ金額が大きいのでそれが収益と同じぐらいになってくれて、それでシステムがなんとか維持できればいいなと思っています。

# 今後の予定
日本の漫画の理解度を上げるためにGPT3の改善(Fine-tuning)などができれば良いなと考えています。ただ、やり方がいまいちわかってないので、勉強しながら頑張っていきます！

# QRを読み込んですぐ使えます。ぜひお試しください!

<img width="400" src="https://storage.googleapis.com/zenn-user-upload/d1738252559f-20230307.png">

<a href="https://line.me/R/ti/p/%40785mpyjw" class="btn">LINEでフレンド登録する</a>

＊ システム運用が試行錯誤中のため、```毎日 24時間```動かしてみます。お時間合えばお試しください。
＊ まだデモレベルなので返答はまだまだ不完全です。その点を多めにみていただけると嬉しいです。気になった点があれば、フィードバックいただけると嬉しいです。
【Einstein Bot】「Ml Intent  [API Name] はエンティティ  [API Name] で参照されているため、削除できません。」と表示された時の対処法

# はじめに

Einstein bot を変更セットでリリースする際に発生したエラー。原文エラーはこの形。

`Ml Intent e_before_1_1 can't be deleted as it is referenced by entities e_before_1_1`

日本語エラーメッセージ
![スクリーンショット_2021-12-24_19.36.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/2e8b21dd-7246-d03f-0e42-62455653dfbc.png)

英語エラーメッセージ
![スクリーンショット_2021-12-24_20.57.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/b83a1ac0-7b44-2509-78ed-993d9839aeb4.png)


# 解決方法

該当のAPI名を持つダイアログのインテントを有効化すれば解消します。つまり **[API Name] はインテントでもエンティティでもなくダイアログのAPI Nameを示しています。**

通常有効化したインテントは間無効化することができないのですが、何らかの原因で無効化されてしまったと思われます。（少なくともGUIでは操作できません。）

インテントの有効化方法については該当のダイアログにて下記赤枠ボタンを押すだけです。これでエラーは解消します。
![スクリーンショット_2021-12-24_21.57.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/de30fe93-4f2c-b21a-d60e-03da7db45e13.png)


# 最後に

以上でエラーは無事解決します。最後にいいねをしていただけると記事を書くモチベーションになるので、ぜひポチッといいねボタンを押していただけたら嬉しいです！

最後まで読んでいただきありがとうございました！

# 参考文献
https://help.salesforce.com/s/articleView?id=sf.bots_service_delete_dialog_intent.htm&type=5
【爆速GPT使いたい】ChatGPT使いたいんだけどSetUp（イケボ）めんどくさいしな、気軽にタダで使えるサービスないかなぁ、、、ここ！！！！

ワイ「結局使い方の記事とかは出回ってるけど、使うのに色々しないといけないだろうし、めんどくさいなぁ」

ワイ「うーん、なんか手軽に使い放題なサービスとかないかなぁ」

？？？「諦めたらそこで試合終了ですよ」ﾎﾞﾛﾝｯ
https://platform.openai.com/playground

---

元ネタ
https://beebom.com/best-chatgpt-alternatives/
新卒エンジニアが参考書なしで【Pythonエンジニア認定基礎試験】を受けてみたら、、、

こんにちは。
新卒エンジニアの僕が、参考書なしでPythonエンジニア認定基礎試験に合格するまでの道のりを記したものです。

前回の記事はこちらから
①→https://qiita.com/asukitt/items/35ae0bbbc0b06a10509f
②→https://qiita.com/asukitt/items/26ece254b03afcdc2421
③→https://qiita.com/asukitt/items/e5516b4bdeba4aa9c231
④→https://qiita.com/asukitt/items/f875335a52e8923b36a5

こちらの新卒エンジニアが【Pythonエンジニア認定基礎試験】の模試を受けてみたら、、、シリーズもこの記事でラストです、、、！

今回は報告記事になっております。今後試験を受ける人の役に立てればなと思います。

# スコア
気になる得点は、、、、


900点　/ 1000点


模試では7割ばかりだったので当日に9割取れてとても嬉しかったです！！
おそらく、模試では見直しをせずに回答していたのでケアレスミスで得点が低かったのではと思いました。


# 勉強方法
#### ① [Pythonチュートリアル](https://docs.python.org/ja/3/tutorial/)を1周読む(試験1か月前)
まずは、本を買わずに無料で読めるこちらのサイトのすべての章を読みました。(所々日本語がおかしかったり、英語のままの部分もある)
挫折せずに読み切ることを重視していたので、英語だけの部分やわかりにくい部分は飛ばしました。(例外とか、、、、)
1周読むとだいたいPythonとはどのような言語なのかが掴めました。

#### ② [Pythonチュートリアル](https://docs.python.org/ja/3/tutorial/)を読み込む(試験3週間前)
ここで挫折しかけました。。。お気をつけて

わからない単語は逐一調べて読み込み、試験にはとりあえず合格できるかなあぐらいまで自信を付けます。
英語の部分はそのままコピペで調べて和訳を探したり、関数やモジュールの説明箇所であればその関数自体の仕組みを理解するようにしました。
またわからないコードはvscodeでその都度試して確認しました。

#### ③ [Python模擬試験(PRIME STUDY)](https://study.prime-strategy.co.jp/)を受験する(試験1~2週間前)
無料で模試を受けられるようになっているので活用しました。メアド登録すると受けられます。
登録したメアドに結果と間違えた部分が送られてくるので、間違えた部分を確認し、復習しました。

僕は復習をまとめるために、このQiitaを利用させてもらいました。

### なぜ間違えたか理解できるまで調べ続ける

これが合格への近道だと思います。
模試解説サイトもあったので是非参考にしてください。

#### ④ [Pythonチュートリアル](https://docs.python.org/ja/3/tutorial/)を確認として読む(試験3日前)
模試の直しまで終えて、もう一度読むとなぜか読みやすく感じます。
また、知らなかった知識の穴埋めのような感覚になりました。
今知れてラッキーだと思えます（笑）

また併せて、先輩方のQiitaの受験記事を読むとより理解が深まります！！！！

#### ⑤ [Python模擬試験(dive_into_exam)](https://diver.diveintocode.jp/dive_into_exam)を受験する(試験前日)
最後に自信をつけるために、前日にこちらの模擬試験を受験しました。
たしか8割とかでした。
間違えたところはもちろん復習します。


# 試験当日
夕方から予約していました。
朝に自分でまとめたQiitaを読み返し、最終確認しました。

実際に試験を受けた感想は、模擬試験より少し難しい印象でした。

何回も見直しても、30分余りました（笑）


# 感想
今回、受験費用以外は一切払わずに合格してやるぞ！！という謎の反骨精神でこの資格を受験してみました。
使えるものは使い倒す精神が好転し、たくさんのサイトを調べたりできたので基礎が身についてよかったなと思います。
一か月で受験費用以外は払わずに合格することができるので、ぜひ受けてみてください。
次のデータ分析編もお楽しみに。
Notionのアクセス解析をNotionlyticsを使ってやってみた

# 背景
Notionで公開ページを作成したので、そのアクセス解析をやりたいと思ったのが背景です。
アクセス解析というと、まずは、Google Analytics かと思ったのですが、ささっと調べた感じだと、どうやら、Notionlytics というサービスがあるのでこちらが使えそうです。
あとで、もう少し調べてみると、Notion公式でアナリティクス機能も公開されたようですが（2023/2/9）、なんとなく公開ページの外部からのアクセスに対しての機能ではなさそうな気もしています。この辺りはゆくゆく調べてみて。

# やり方
細かいところは省略します。多分できます！
1. Notionlytics にアカウントを作る
1. アクセス解析したページを選択する
1. トラッキング用のコードを生成して、Notionのページに埋め込む

もしかしたら、少しだけフローや画面の変更がある気もしますが、こちらのサイトも参考になります。

https://qiita.com/SaitoMieko16/items/303a8e009ff4efbc8d78

# 結果
使ってみるとこんな感じです。
まだまだデータが少ないですが、今後経過を見ながら、知見も溜めていこうかなと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/501960a3-7baf-b64f-f19b-ec07bc6dc439.png)

# ちょっと戸惑ったところ
基本的には、問題なく進むのですが、アクセス解析したいページを選択してしばらく待っても全然データが上がってこず。ちょっと何かなと原因を探していたのですが、よくよくNotionlyticsのサイトを見てみたら、ここから、「Activate」する必要があったみたいです(笑) なので、ここをクリックすると、今度は Notion 側で埋め込みする手順が出てくるので、これを行えば無事にアクセス解析ができるようになりました。
これが本当に気が付かなかった。ただ、冷静に考えてみると、確かにNotionのページに何も埋め込んでないので、普通に考えてアクセス解析が出来るようになる訳がないですよね(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/cda53493-3669-911f-e710-fdbb79605e0f.png)

# Notionのアナリティクス機能（公式）
2023年2月9日に、公式の機能としてアナリティクス機能がサポートされたようです。

https://www.notion.so/ja-jp/releases/2023-02-09

以下のサイトなどが使い方の参考になりますね。
ただ、背景にも記載したのですが、公開ページの外部からのアクセスは、このアナリティクス機能では使えないかもなので、今回の自分の用途には合っていないかもしれません。この辺りはまた機会があれば調べてみます。

https://info.nextmode.co.jp/blog/notion-page-analytics
Flutter で Android戻るボタンを使うとアプリが落ちてしまう対処法


これでいけるよ。


```onWillPop.dart
  Future<bool> _onWillPop() async {
    final isFirstRouteInCurrentTab =
        !await _navigatorKeys[_currentTab].currentState.maybePop();
    if (isFirstRouteInCurrentTab) {
      if (_currentTab != TabItem.home) {
        _onSelect(TabItem.home);
        return false;
      }
    }
    return isFirstRouteInCurrentTab;
  }
```

🥳
親要素にbackdrop-filterがかかっているとposition:fixedが効かない件

CSSでposition:fixedが効かないと言うことが時々ある。
そういった場合、ネットで調べると「親要素にtransformがかかっている」という例が多い。
しかし、その他にもFilter系をかけると効かないということがわかったのでメモ。


# 親要素にbackdrop-filterがかかっているとposition:fixedが効かない件
CSSでできることが増えてきて、いい感じのデザインができる様になった。
最近の流行りの中に「glassmorphism」というのがあるが、
すりガラス上のデザインにするもので、
CSSで実現する際「backdrop-filter：blur(XXpx);」を多用する。
![スクリーンショット 2023-03-02 11.44.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229958/47932107-bd29-f89b-8a79-18b4a9011a78.png)
引用：https://www.pinterest.jp/search/pins/?rs=ac&len=2&q=glassmorphism&eq=glassmo&etslf=11911

しかしこれを使うと、小要素にposition:fixedをした際、
Chrome系のブラウザやFirefoxにおいてposition:fixedが効かないことがわかった。
これを避けるには、親要素からbackdrop-filterをなくすしかない。

ちなみにSafariだとちゃんと効く。

# filterがかかっていてもposition:fixedが効かない件
続いて、filter。
これも同様で、filterをかけると小要素にposition:fixedが効かない。
同じくChrome系のブラウザやFirefoxで起きていて、Safariは問題ない。

#まとめ
ということでまとめ。
現状起きていることとして以下の条件だとposition:fixedが効かない。

- 親要素にtransformがかかっている
- 親要素にbackdrop-filterがかかっている
- 親要素にfilterがかかっている 

![スクリーンショット 2023-03-02 11.52.32 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229958/2dcf88a0-2791-c6bc-a7f3-fdc6d72d58f2.png)


避けるためには、これらのCSSを外すしかない。

今後バグとして修正されるかもしれないので、修正されたらこの記事は閉じます。

以下、検証用にCodePen作成しました。
Chrome、Safariなどで切り替えてご確認ください。
https://codepen.io/joh_luck/pen/poOepGR
テスト担当からiOSエンジニアを目指す

# はじめに

2018年から新社会人としてこの業界へ就職しテスト担当をかれこれ4年ほど担当させていただいている田中と申します。
今回は題名通りにiOSエンジニアになるための学習記録を残していきたいと思っています。

# 自己紹介

学歴 ゲームクリエイター科 専門学校卒
学生時代はチーム制作でUnityを使用してVRゲームの制作をしていました。
趣味は動画投稿とSASUKE鑑賞

### 会社歴

2018年4月
2018年に社会人として会社Aに入社
Javaなどの研修を終えShellなどを勉強。
最後の配属先でAzureを触らせていただきクラウドを知りました。
仕事激務化により2019年3月退職

2019年4月
会社Bに入社
前職の最後の経験を活かしAWSを使用したインフラ担当として配属
途中からインフラの合間テストを担当することに。
そこから徐々にテストメインになっていき。
自社システムのテストをメインで担当することになりました。

# 理由

* 仕事をしていく中で新しいことにチャレンジすることができずに、**自分の将来について不安を感じた**のがきっかけでした。
* 良くないとは思っていたんですが**受け身な体制**をずっと取り続けていたので自分から行動していきたい、変わりたいと思いました。
* 記録を残して転職成功することによって**自分の自信を取り戻したい**と思いました。(残すからには絶対転職成功してiOSエンジニアになりたいと思っています)

# なぜiOSエンジニアなのか

* 浅くてすみませんが身近で使っている**iPhoneのアプリを制作できたらなんかカッコイイ**と思いました。
* 2007年からリリースされてかれこれ10年以上、**スマートフォンとしてずっと残り続けているものに関わってみたい。**
* **〇〇の技術のこういうところが好きで使いやすい**、などの具体的な好きなところはまだ見つかってないです。(少なからず今回の学習で見つけていきたいとは思っています)

# 今後について

とりあえず1ヶ月の学習プランを立てる。

### 1. 書籍を購入してアプリを作ってみる。（5日）

比較的最新(発売日 2022/10/27)の以下の書籍を利用します。
2日でマスターできると書いてありますが、内容ページ数は476Pです。
内容を理解するのに対して100P/1日と計算します。
なので5日で学習完了すると予測を立てます。

[Amazon SwiftUI対応 たった2日でマスターできる iPhoneアプリ開発集中講座 Xcode 14/iOS 16/Swift 5.7対応 Kindle版](https://www.amazon.co.jp/gp/product/B0BJQ6RN44/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)[476P]

### 2. 上記を踏まえて実際にアプリを制作してリリースしてみる。(25日)

自分自身が合成音声について少し知識があるので**VOICEVOX**(音声合成)を使用したAPIを使用して何かしらアプリを制作するのを目標とします。
現時点では合成音声を利用したアラームアプリなどを想定しています(どれだけかかるか分からないので**とりあえず10日にして1日ごとに見直していく形にします**)

* またAWSの資格試験であるAWS Certified Solutions ArchitectとAWS Certified Cloud Practitionerを取得してあるのでせっかくなので**AWS**を使用してリリースしたいです。
  * せっかくなのでサービス選定からインフラ構成まで(**こちらも10日**)

* 実際の業務に近づけるため**Redmine&Github**でチケットを区切って制作したいと考えているためこちらも導入予定です。

* せっかく4年間テストを担当したので脆弱性などの知識はあるのでその辺りをコードに入れていきたいです。
  * SQLインジェクション、クロスサイトスクリプティング、ヌルバイト攻撃など

* おそらくAppleストアに申請を出す場合審査&リジェクトされた改修などがそれなりにかかると思うのでアプリリリースまでは1ヶ月以内にできないと思います。(この辺りも初めてなので学んでいきたいです)

# 最後に

キャリアチェンジをしたある先輩エンジニアさんと会話をしたのですが印象に残っている言葉がありました。

**「自分よりプログラムが書ける人がいるからその人に任せた方が良い」**
**「楽しいことでで仕事を続けるのは中々難しい」**

確かにその通りです、自分よりプログラムが書ける人に任せる方が良いですし楽しいことで仕事を続けるのは中々難しいです。
この方は社長タイプの考え方をしているんだなぁと思いました。

ただ**自分はそういう言葉を借りて諦めてばかりいました**。
なので結果的に**自発的に行動できなくなり受け身の体制をとることになってしまった**と思います。

**この部分を直しつつ興味を持って前向きに仕事をできるようになるのが目標の一つでもあります**

プログラム方面で活躍していきたいと思い、今年1月にはよく使用しているPHPのPHP7の初級試験を受験し合格しました。
ですがまだまだ実務で通用するレベルではないので記録を残しつつ勉強していきたいと思っています。
windowsでdockerを使えるようにする

### windowsの仕様
windows 10 pro

##

docker desktop on windowsのインストール
https://docs.docker.com/desktop/install/windows-install/

Docker Desktop requires a newer WSL kernel version.
という問題が発生しました．

以下に従って作業．
https://qiita.com/idecker/items/2ff2377b3769aad58c81
もしくは
https://learn.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package

上2つのリンクのうち，下のリンクからならUbuntuが見つかりました．

powershellで
docker --version
を入力．
結果
Docker version 20.10.23, build ...
BigQueryでリージョン全体のテーブル容量の取得方法


`Dataset名.__TABLES__`からテーブルのサイズを取得できますが、Regionの全Datasetを跨いで取得する方法を調べたので残しておきます。

一度Datasetの一覧を取得して、クエリを組み立てて実行する方式です。


```sql
-- クエリを格納する変数
DECLARE sql_query STRING;

--- 各データセットから__TABLES__を読み込みUNION ALLするSQL文を構築
SET
  sql_query = (
    SELECT
      STRING_AGG(
        CONCAT(
          'SELECT dataset_id,table_id,row_count,size_bytes FROM `',
          schema_name,
          '`.__TABLES__ WHERE type = 1 ' -- type:標準テーブル(1)
        ),
        ' UNION ALL '
      )
    FROM
      `region-asia-northeast1.INFORMATION_SCHEMA.SCHEMATA`
  );

-- 構築したSQL文を実行
EXECUTE IMMEDIATE sql_query;
```



# 参考URL

 https://cloud.google.com/bigquery/docs/information-schema-tables?hl=ja
【メモ】証明書の選択、接続ユーザーの入力、接続を自動化するPowerShell

```PowerShell

$certThumbprint = "[証明書のThumbprint]"
$wifiProfile = "[接続プロファイル名]"
$username = "[ユーザー名]"
$password = "[パスワード]"

# 証明書を選択する
$cert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Thumbprint -eq $certThumbprint}
netsh wlan set profileparameter name="$wifiProfile" authentication="WPA2Enterprise" -userCertificate="$($cert.Thumbprint)" -storeCredential=yes

# 接続ユーザーを入力する
netsh wlan add profileparameter name="$wifiProfile" userAuth="yes" authMode="userOrMachine" -username="$username" -password="$password"

# 無線LANネットワークに接続する
netsh wlan connect name="$wifiProfile"

```
Ruby if,else問題

# if,elseを使ったプログラムを作成

2桁の正の整数を入力します。
その整数が、10の倍数（10,20,30...）からの差が2以内であるときはTrue、
それ以外はFalseと出力するメソッドを作りましょう。

```ruby:模範解答
def near_ten(num)
  quotient = num % 10
  if quotient <= 2 || quotient >= 8
    puts "True"
  else
    puts "False"
  end
end

# 呼び出し例
near_ten(12)
```

```ruby:ターミナル
True
```

# 解説
2桁の整数を10で割ったときの余り = quotient
if文では、その余り（quotient）が、２以下か８以上のとき"True"か"False"を出力するよう記述しています。

今回は2桁の数字が12です。
12 % 10 = 2
2以下であるため、Trueが返されました。
【備忘録】Git 特定のコミットまで戻す

# はじめに

自分の備忘録。リモートのコミット履歴を特定のコミットまで戻すコマンド

## 前提
- masterブランチのコミットを戻したい
- 戻したいコミットのコミットIDを調べておく


## コマンド

```bash
git reset --hard <コミットID>
git push -f origin master
```
Okra Water During Pregnancy

Are you pregnant? Yes, I did. You must also be looking for a superfood for you and your unborn child. How do you feel about drinking Okra Water During Pregnancy? Nowadays, drinking okra water is very beneficial during pregnancy. Yet others are mulling over ideas like when to start drinking okra water while pregnant, how to incorporate okra into a diet, the greatest okra recipe, and so on. Therefore, follow along with us. Your understanding of the okra water or the okra will be more obvious here.
Visit- https://maternitycaretips.com/start-drinking-okra-water-during-pregnancy/
rails マイグレーションファイルの操作一覧

操作について、備忘として残します。


# マイグレーションファイルの操作一覧
<table>
  <thead>
    <tr>
      <th>名前</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td> 作成 </td> <td>rails g mode モデル名(単数形)</td>
  </tr>
  <tr>
    <td> 実行 </td> <td>rails db:migrate </td>
  </tr>
  <tr>
    <td> 修正 </td> <td>rails db:rollback </td>
  </tr>
　　　　<tr>
    <td> ステータス確認 </td> <td>rails db:migrate:status </td>
  </tr>
  <tr>
    <td> 削除 </td> <td>rails d model モデル名（単数形) </td>
  </tr>
</table>

# 指定のマイグレーションファイルをロールバックしたい場合
①ステータスでDBのidを確認
②編集したいDBをdownにする
③編集
④DBをupにする
⑤ステータスでupになっていることを確認

```ruby:
#ステータスを確認
bundle exec rake db:migrate:status

#該当のMigration IDを指定して再編集
bundle exec rake db:migrate:down VERSION='マイグレーショID'

#再度ステータスを確認してDOWNになっていることを確認し、編集する

#　編集後再度マイグレーションする
bundle exec rake db:migrate:up VERSION='マイグレーショID'

```
Three.jsのオブジェクトをカメラからの方向を保ったまま距離を操作する方法

# 概要
Three.jsの[Object3D](https://threejs.org/docs/#api/en/core/Object3D)をカメラからの方向を保ったまま前後に距離を操作する方法を備忘録として残します。

# サンプル
以下の関数を使うといい感じにカメラからの方向を保ったまま前後に移動させることができるかと思います。
``` typescript
/**
   * Three空間上の任意のオブジェクトをカメラに対して方向を保ったまま指定した距離分、移動する関数
   * @param {THREE.Camera} camera
   * @param {THREE.Object3D} object 任意の移動させたいオブジェクト
   * @param {number} changeDistance 移動させたい距離
   */
  const changeObjectDistanceToCamera = (
    camera: THREE.Camera,
    object: THREE.Object3D,
    changeDistance: number
  ) => {
    const cameraPosition = camera.position
    const modelPosition = object.position
    // カメラとオブジェクトの位置からなる方向(単位)ベクトルを取得する
    const frontVector = cameraPosition.clone().sub(modelPosition).normalize()　
    // 上記の方向ベクトルをもとに任意の移動させたい距離分のベクトルをオブジェクトのpositionから引く
    object.position.sub(frontVector.multiplyScalar(changeDistance))
  }
```

# 使い方
- カメラからの方向を保ったままカメラ側に近づけたい時
```typescript
const camera = THREE.Camera()
const object = THREE.Object3D()
const changeDistance = -10
changeObjectDistanceToCamera(camera, object, changeDistance)
```
- カメラからの方向を保ったままカメラ側から離したい時
```typescript
const camera = THREE.Camera()
const object = THREE.Object3D()
const changeDistance = -10
changeObjectDistanceToCamera(camera, object, changeDistance)
```
【Java/SpringBoot】入門記事リンク集

# 0. はじめに

## 0-1. 全体の流れ
> [1.ロードマップ](#1-ロードマップ)
> [2.教材](#2-教材)
> [3.環境構築](#3-環境構築)
> [4.IDE](#4-ide)
> [5.入門記事](#5-入門記事)
> [6.チートシート](#6-チートシート)

## 0-1. TL;DR
- Java/SpringBootの教材や参考リンク集まとめ

# 1. ロードマップ
https://qiita.com/yoichiwo7/items/17190cb440ab7d253cea

https://qiita.com/haruto167/items/5a784df032518277f4a0

https://qiita.com/abeno/items/1aecfad3dc8c340c442e

https://qiita.com/rikako_hira/items/ae208590d02a3bb91789

https://qiita.com/totsu0119/items/528f0f6329c1c40a69e7

https://qiita.com/mikoski01/items/3f5f8793415248eacca6

https://midorigame-jo.com/java-roadmap/

https://runteq.jp/blog/programming-school/language/11897/

# 2. 教材
https://gihyo.jp/book/2022/978-4-297-12685-8

https://gihyo.jp/book/2017/978-4-7741-8909-3

https://gihyo.jp/book/2017/978-4-7741-9087-7

https://www.shoeisha.co.jp/book/detail/9784798150727

https://sukkiri.jp/books/sukkiri_java3

https://sukkiri.jp/books/sukkiri_sql3

https://www.udemy.com/course/intellij-spring-boot/

https://www.udemy.com/course/poco-tech-spring-security/

https://www.udemy.com/course/java_spring_beginner/

https://zenn.dev/sugaryo/books/spring-boot-run-up

https://zenn.dev/angelica/books/52be1e365c61ea

https://zenn.dev/misaka/books/9734700544990d

https://zenn.dev/otkshol/articles/52d2649c6fa4dc

https://zenn.dev/numacci/articles/202101_java_restapi-postgres

https://zenn.dev/numacci/articles/restapi-mongodb-crud-tutorial

https://qiita.com/mistletoe/items/5b2a9eda8d053dda3ea1

# 3. 環境構築
https://start.spring.io/

https://zenn.dev/osuzuki/articles/b41dc7be15e2b5

https://qiita.com/akitika/items/4c701a6ec7a95d6cb78d

https://qiita.com/rubytomato@github/items/b2c0686517e1c86ceb48

https://zenn.dev/kotaro0235/articles/083e30a8755da7

https://qiita.com/shavada/items/2db64a912fd2c20b1fa9

# 4. IDE
## 4-1.IntelliJ IDEA
https://zenn.dev/mongolyy/articles/d6c8983954725b

https://qiita.com/crossroad0201/items/bf5528cc57cadab67638

https://qiita.com/KtheS/items/7179fc2dabe8f1e4fd62

https://qiita.com/kohii/items/a0f7b8bad641e957147b

https://qiita.com/saitoshi/items/bc459a8b3ea312f5287e

https://qiita.com/opengl-8080/items/108102d692b49f804dbd

https://qiita.com/cypher256/items/8ce0527a46bd7cfe43eb

https://qiita.com/oohira/items/825ef5f252d0fd2e752f

https://qiita.com/oohira/items/31767e0958ea322184fb

https://zenn.dev/naoyukik/articles/5c291119b67ba76ef690

https://zenn.dev/naoyukik/articles/5f019beed1006ebd034d

## 4-2.VScode
https://zenn.dev/s_t_pool/articles/f6812fe9c7edf4c07516

https://zenn.dev/ykdev/articles/cde000b2b8f405

https://qiita.com/takuma-jpn/items/b49785a314fb4db85775

https://qiita.com/koukibuu3/items/77734596483ffd788931

# 5. 入門記事
https://qiita.com/Toshihiro_Watanabe_/items/bfda988a70d3d04e3087

https://qiita.com/yk0807/items/c90f02711880fb0fa4f1

https://qiita.com/yk0807/items/70b2dca1e9832280de33

https://www.gorou.style/articles/2022/03/spring-boot-study1/

# 6. チートシート
https://qiita.com/disc99/items/727b51dbe737602a5c91

https://qiita.com/azul915/items/5f7003bb78917dff6bb1

https://qiita.com/uzresk/items/31a4585f7828c4a9334f
C# delegateを使ってみる

delegateについて学んだので備忘録。

```
using System;
using System.Windows.Forms;

namespace _test
{
    public partial class Form1 : Form
    {
        public int count = 0;
        delegate void DelegatePutsMessage(int cnt);     // DelegatePutsMessage型のdelegateを定義
        DelegatePutsMessage PutsCount = null;           // DelegatePutsMessage型のPutsCount変数を定義

        public Form1()
        {
            InitializeComponent();
            PutsCount = new DelegatePutsMessage(FuncPutsMessage);   //DelegatePutsMessage型PutsCount変数へ、FuncPutsMessage関数を代入する
        }


        private void button1_Click(object sender, EventArgs e)
        {
            this.count++;
            PutsCount(this.count);      // PutsCount変数に代入されているFuncPutsMessage関数を呼び出す
        }

        private void FuncPutsMessage(int cnt)
        {
            textBox1.Text = "カウント+1= " + cnt;
        }
    }
}
```
数当てゲーム(Python3)改良版

# 数当てゲーム #

数当てゲームのプログラムを一部改良しました

```python
# 数当てプログラム2
# 新規作成 2023/3/1
import random
# 名前を入力してもらい変数に代入する
name = input("Input your name ")
#正解の数値を乱数を使って作成
answer = random.randint(1,10)
#カウント回数
count = 0
while True:
  #数字を入力してもらい数値に変換して変数に代入する
  num = int(input("Input your number "))
  count += 1
  if answer == num:
    print(f"{name}さん、{count}回目で正解です")
    break
  elif answer > num:
    print(f"{name}さん、正解はもっと数字が大きいです")
  elif answer < num:
    print(f"{name}さん、正解はもっと数字が小さいです")
```
SpeechRecognition Web Api use js demo

## speech2caption

use SpeechRecognition Web Api to show speech in the window;

## 简单代码

```js
var SpeechRecognition = SpeechRecognition || webkitSpeechRecognition;
var SpeechGrammarList = SpeechGrammarList || window.webkitSpeechGrammarList;
var SpeechRecognitionEvent =
  SpeechRecognitionEvent || webkitSpeechRecognitionEvent;


const recognition = ref(null);

recognition.value = new SpeechRecognition();

recognition.value.continuous = false;
recognition.value.lang = "zh-cn";
recognition.value.interimResults = false;

recognition.value.onresult = function (event) {
    const sttText = Array.from(event.results)
      .map((result) => result[0])
      .map((result) => result.transcript)
      .join("");
    console.log("onresult == > " + sttText);
};

```


## how to dev

1. use git clone the project

2. you can use pnpm or npm to install dependencies

3. in cmd execute pnpm tauri dev

## thanks

[SpeechRecognition](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition) web api

[Tauri](https://tauri.app/zh-cn/v1/guides/getting-started/setup/) is an app construction toolkit that lets you build software for all major desktop operating systems using web technologies.

[Vue](https://vuejs.org/) An approachable, performant and versatile framework for building web user interfaces.

[Naive UI](https://www.naiveui.com/zh-CN/light) Kind of interesting

## GitHub

```
https://github.com/nilbrains/speech2caption
```
コンテナインスタンスのインスタンスタイプの変更方法

# 背景
ECS on EC2(g4dn)の構成にてサービスを運営中です。
とある事情でGPUメモリが足りなくなり、インスタンスタイプをg5にしたくなりました。
# 前提
表題でまずググると以下の記事がヒットしました。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ecs-change-container-instance-type/

これには３つの方法が書いてありますが、僕の場合はCloudFormationやキャパシティープロバイダは使っていないですし、コンテナインスタンスを新規に立てるとなると、EBSにあるデータのお引越しなどでダウンタイムが発生してしまいます。
これはなんとかしないと、ということで試行錯誤しました。

# やり方
1. マネコンでEC2インスタンスの停止
2. アクション→インスタンスの設定→インスタンスタイプの変更、で好きなインスタンスタイプを選択
3. EC2インスタンスの起動
4. EC2にssh

``` shell
sudo rm /var/lib/ecs/data/*
sudo service docker restart
sudo systemctl restart ecs
``` 
5. マネコンでECS→クラスター→インフラストラクチャ→コンテナインスタンスにて新旧２つ表示されていることを確認
6. ２つのうち古い方を消す

# 最後に
CloudFormationを使ったり、そもそもサーバレスにするのがほんとはいちばん良いです。
ts-resetでTypeScriptのストレスを解消

## 概要
TypeScriptでコーディングしていて、こんなことでストレスを覚えたことはありませんか？
- ```Response.json```(in fetch)や```JSON.parse```がanyを返してくるので危険
- ```.filter(Boolean)```後の型推論に```unknown```や```null```が含まれている
- ```Array.includes```の引数が勝手に推論される

2023/2/19に[te-reset](https://github.com/total-typescript/ts-reset)がリリースされました。**ts-reset**を使えばこれらはあなたの期待通りに評価されるようになります。しかも導入はReset CSSを適用するくらい簡単です！

## 準備
ts-resetを使用したいプロジェクトにパッケージをインストールします。
```sh
$ npm i -D @total-typescript/ts-reset
```

プロジェクトのソースコードディレクトリに```reset.d.ts```という名前のファイルを作成して、中身を下記の通りに記述します。
```ts
import "@total-typescript/ts-reset";
```

### 補足
下記のように使用したいルールを限定することもできます。
```ts
import "@total-typescript/ts-reset/json-parse";
```

## 使ってみる

### .filter(Boolean)で偽の値を推論から排除する
```Array.filter(Boolean)```で配列から偽の値（undefinedやnull）の要素を排除してくれますが、返り値の型にはundefinedやnullが含まれているので困ってしまいます。
```ts
// BEFORE
const filteredArray = [1, 2, undefined, null].filter(Boolean); // (number | null | undefined)[]😡
```
ts-resetを適用すれば期待通りの型を返してくれるようになります。
```ts
// AFTER
const filteredArray = [1, 2, undefined, null].filter(Boolean); // number[]
```

### JSON.parseがanyを返さないようにする
```JSON.parse()```は問答無用で```any```を返却してくるので、結果の検証をおろそかにした危険なコードを量産しがちです。
```ts
// BEFORE
const result = JSON.parse('{}'); // any😡

console.log(result.hoge); // any型なのでコンパイルエラーにならない
```
**ts-reset**を適用すれば、危険なコードと決別できます。返り値の型は```unknown```になるので、型安全を保証しないとプロパティが参照できなくなります。
```ts
type Hoge = {
    fuga: string;
};

// Hoge型の検証
const typeCheckHoge = (obj: unknown): obj is Hoge => {
    const hoge = obj as Hoge
    return 'fuga' in hoge
}

// AFTER
const result = JSON.parse('{}'); // unknown

if (typeCheckHoge(result)) {
    console.log(result.fuga); // 型安全が保証されたのでfugaプロパティが参照できる
} else {
    throw new Error('result is not of type Hoge')
}
```
### Array.includes()で定義以外の文字列を使う
```Array.includes()```で配列内の要素に対して存在チェックなどを行う場合、通常では型定義に含まれていない文字列は指定できません。

不特定のユーザー入力値が配列のメンバーと一致するかをチェックするシーンなどはよくあるので、そのたびにストレスです。
```ts
// BEFORE
const members = ['A', 'B', 'C'] as const;

// 指定できる値の型は 'A' | 'B' | 'C' なのでコンパイルエラーになる😡
members.includes('D');
```
**ts-reset**を適用すれば非メンバーの内容は限定されなくなります。
```ts
// AFTER
const members = ['A', 'B', 'C'] as const;

// 指定できる値の型は限定されない
members.includes('D');
```
さらに```Array.includes```と同様に```Set.has()```の引数も限定されなくなります。```Set```を使う場合もストレスフリーですね。

### Array.isArray()で検証後にany[]にしない
気を抜くとすぐに```any```で推論するTypeScriptですが、```Array.isArray()```での検証後も```any[]```で推論されます。これでは危険なコードを許してしまいます。
```ts
// BEFORE
const validate = (input: unknown) => {
  if (Array.isArray(input)) {
    console.log(input); // any[]😡
  }
};
```
**ts-reset**を適用すれば```unknown[]```となるので、型安全の保証を強制させることができます。
```ts
// AFTER
const validate = (input: unknown) => {
  if (Array.isArray(input)) {
    console.log(input); // unknown[]
  }
};
```
## まとめ
以上のように**ts-reset**を適用することで、TypeScriptのコーディングがさらに快適で安全になることは間違いありません。公式がこれらのストレス要因を解消してくれるまでは、問答無用でプロジェクトに採用したいくらいです。

導入も極めて簡単なので、ぜひとも利用を検討してみてはいかがでしょうか。

## 参考
https://github.com/total-typescript/ts-reset
2023年03月何故かベストアンサーをつけてくれない質問

[2023年3月の質問の中から整理します](https://qiita.com/Keiji_otsubo/items/ff507f99e677abe9768f)

# トレイルヘッド

+ [facing this error while doing rest call out trailhead challenge even though remote site set up was successfull"Executing the 'country' method on 'ParkLocator' failed. Make sure the method exists with the name 'country', is public and static, accepts a St"](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JgJvj)
+ [In training 'Quick Start: CRM Analytics' the Verification step on "create an app and a lens" Fails We can't find a lens named 'My Amazing Lens'. Check to be sure that you've created and named the lens correctly.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JgGlI)
+ [We can't find a lens named 'My Amazing Lens'. Check to be sure that you've created and named the lens correctly.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifsqm)

:::note
I found the issue the video and step by step instructions are inconsistent. Follow the video!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d71c8ccc-46ed-4030-13e8-687591b825df.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0e122bdf-d8b0-5e19-6cdc-78d8ba79c490.png)
:::


+ [The 'New LEAD Trend by Source' dashboard component is not a pie chart.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JgVWN)
+ [We can't find an inactive user with 'guestadmin' in the Username and guestadm as the Alias. Make sure that the user is NOT active.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000OqsCT)


# 一度ベストアンサーをつけられたが、なぜか解除。　理解できませんね。

+ [Create the Object Model](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jg4yU)
+ [I´m trying to get my credentials in playground starter and im getting an error, what should i do?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000OqU8T)
私の答えを読んでそのまま回答して妨害しているようなぁ。こういう人が多い。

# 意味が分からん

+ [Selecting wrong Object to create a custom Button](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jgc6S)
時計、シリアル出力(DS1307)(Arduino UNO)


x 過去ログを見よ
x 時間合わせは、別


目的
かんぜんに「わすれて」いたので
教科書的なプログラムを作成


![o_cop390.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e6af4209-6c25-9a2d-fb6f-600d95093bd8.jpeg)




```c++



//serial_ds1307_test3_uno_1

#include <Wire.h>

//初期化
void setup() {

  //I2Cの初期化 UNO
  Wire.begin();

  //シリアルの初期化
  Serial.begin(9600);

} //setup


// デバイスアドレス(スレーブ)
#define ADDR    0x68    // 2進数 1101000

char data_read[16]; //データバッファー


//メインループ
void loop() {

  // レジスタのアドレスを先頭にする
  Wire.beginTransmission(ADDR);
    Wire.write(0x00);
  Wire.endTransmission();
  delay(1);

  // I2Cスレーブに8byteのレジスタデータを要求する
  Wire.requestFrom(ADDR, 8);

  // 8byteのデータを取得する
  for (int ii = 0; ii < 8; ii++) {
    while (Wire.available() == 0 ) {}
    data_read[ii] = Wire.read();
  } //for
  delay(1);

  //時分を表示形式に変換する
  char str1[16];
  str1[0] = '0' + (data_read[2] >> 4);    //時 上位
  str1[1] = '0' + (data_read[2] & 0xf);   //時 下位
  str1[2] = ':';
  str1[3] = '0' + (data_read[1] >> 4);    //分 上位
  str1[4] = '0' + (data_read[1] & 0xf);   //分 下位
  str1[5] =  0;

  // シリアルに文字列を送信する
  Serial.println(str1);

  delay(1000); // 1秒待つ

} //loop






```
ChatGPTのAPIが使えるようになったので、早速試してみた！

ChatGPTのAPIが使えるようになったので、早速試してみました！

```swift
import Foundation
import Alamofire

struct Message: Codable, Identifiable {
    let id = UUID()
    let role: String
    let content: String
    
    private enum CodingKeys: String, CodingKey {
        case role, content
    }
}

struct ChatGPTRequest: Encodable {
    let model: String
    let messages: [Message]
}

struct ChatGPTResponse: Decodable {
    let id: String?
    let object: String?
    let created: Int?
    let model: String?
    let usage: Usage?
    let choices: [Choice]
    
    struct Usage: Decodable {
        let prompt_tokens: Int
        let completion_tokens: Int
        let total_tokens: Int
    }
    
    struct Choice: Decodable {
        let message: Message
        let finish_reason: String
        let index: Int
    }
}

final class ChatGPT {
    let baseUrl = "https://api.openai.com/v1/chat/"
    let openAIAPIKey = ""
    
    func send(messages: [Message]) async throws -> ChatGPTResponse {
        let body = ChatGPTRequest(
            model: "gpt-3.5-turbo",
            messages: messages
        )
        
        let headers: HTTPHeaders = [
            "Authorization": "Bearer \(openAIAPIKey)"
        ]
        
        let response = await AF
            .request(
                baseUrl + "completions",
                method: .post,
                parameters: body,
                encoder: .json,
                headers: headers
            )
            .serializingDecodable(ChatGPTResponse.self)
            .response
        
        switch response.result {
        case .success(let data):
            return data
        case .failure(let error):
            throw error
        }
    }
}

```

---

ご覧いただきありがとうございました。

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

📱 [個人アプリ: Symbols Explorer](https://apps.apple.com/jp/app/symbols-explorer/id1612933742)
【PHP】実践的な例外処理の設計について

# はじめに
実務で開発を行なっていると、避けて通れないの例外処理。
趣味の範疇では、特段考慮しなくても問題ないかもしれませんが、実際にサービスとして提供するとなるとそうもいきません。

そこで、今一度例外設計について色々調べてみましたが、調べれば調べるほど指針や考え方は多岐にわたり、深い知識と経験が必要です。

そのため、本記事では自分なりの解釈をまとめ、徐々に加筆していくことで、読者の方々に有益な情報を提供できるように努めます。

# 注意点
本記事では、例外処理の構文についての解説はしません。
また、PHPの使用を前提としております。

# そもそも例外とは
例外処理とは、想定できた予期せぬ事態（例外）に備える処理です。
システム的な例外が起きてしまった際には、ソフトウェアが何らかの対処を施す事が要求されます。
具体的には、何らかの理由でDBに接続できない。サーバーが停止しているなどが、それに該当します。
それらは、プログラマが適切にプログラムを修正する事で解決します。
そのため、想定できた予期せぬ事態（例外）に対する処理を我々プログラマは適切に施さねばなりません。
そうでないと、システムが異常終了することがあります。異常終了が発生した場合、エラーを調査するための時間がかかるだけでなく、システムの安定性や信頼性にも悪影響を与える可能性があります。
したがって、想定できた予期せぬ事態（例外）に対する適切な処理が重要です。
# いつ使うのか
書籍『達人プログラマー』によると、例外について以下のように記されています。
> 「すべての例外ハンドラを除去しても、このプログラムは動作可能だろうか？」と自問してください。答えが「ノー」であれば、例外ではない状況下で例外が使われているはずです。

また、具体的な例として、下記のような例が挙げられております。
```
● ファイルが存在しないという状況が通常起こりえないのであれば、それは例外として処理
● ファイルが存在しないという状況が普通に起こりえるのであれば、例外ではなくエラーとして処理
```

この例から、例外処理は**通常起こらない問題が発生した場合**に使用するべきだと言えます。
もう少し、深ぼってみると、**通常は起こらない問題**が発生した場合というのは、異常な状態であると言えます。
異常な状態であるということは、プログラムの実行を停止しても構わない状態にあると言えます。例えば、下記のような状態。

```
● 何らかの理由でDBに接続できない
● 必要な戻り値が戻ってこなかった(プログラム上のバグ)
```

などなど。
アプリケーションが上記のようなDB接続できない状態にもかかわらず、プログラムの実行を続けてしまうと、あたかもDBにデータを保存できたかのような(正常に処理を行なわれたかのように)振る舞ってしまうかもしれません。

そのため、**通常は起こらない問題**が発生した場合は、プログラムの実行を停止しても構わない状態にあると言えるわけです。もっと言えば、通常通りプログラムを実行できませんね。
こういった普通はおかしくなることがあり得ない状態であり、且つプログラムの実行を停止しても構わない場合に例外を使うべきです。

一方、ユーザーの誤入力や誤操作等については、例外ではなくエラーとして処理します。これは、プログラムの実行を停止せざるを得ない問題ではなく、ユーザーの入力変更によって回復可能な状態であるからです。
ユーザーの入力ミス等が発生した場合にアプリケーションを終了させず、エラーメッセージと共に再入力を促すWebフォームページをユーザーに返すケースがそれにあたると思います。
また、『達人プログラマー』は、例外処理を過剰に使用することが、プログラムの実行効率を低下させることに繋がる可能性があると警告しています。したがって、プログラマーは、例外処理を使うべき場面を正確に判断する必要があります。


# 対処について
さて、ここではユーザー側で対処する事ができない異常(例外)への対処方法を考えていきます。
### 対処方法
このような異常への対処方法は、**プログラマが適切にプログラムを修正する**ことです。 なぜなら、ユーザーの誤操作が原因の異常であれば、ユーザーに対して誤操作を取り消してもらい、正常な操作を行ってもらう事で対処できますが、そうでないケースではプログラマに状況を報告して対処する必要があります。
また、例外が発生した後にプログラムを実行し続けると、以降のプログラムの実行結果が正しいことが保証できなくなる可能性があるため、プログラムを終了させることが重要です。

### メッセージ
ならば、どのようにして状況を伝えるのかというと、発生した内容をログに出力することで伝えます。ここで重要なこととして、出力内容は、**開発者向け**にするということです。言い換えると、ユーザー向けのメッセージを出すものではありません。
→あくまで、プログラマが適切にプログラムを修正することを必要としているため

**好ましくない例**
```php:laravel.log
local.ERROR: ユーザーの取得に失敗しました。  
```

**好ましい例**
```php:laravel.log
 local.ERROR: ユーザーの取得に失敗しました。 ["[object] (App\\Exceptions\\TestApplication\\TestException(code: 0):...etc
```

### 例外の握り潰し
これは、例外をなかったことにすることです。先にも述べた通り、例外が発生した際には通常通りプログラムを実行できません。そのため、適切なハンドリングが必要になります。
もし、例外が発生したにもかかわらず、握り潰してしまうと、例外が闇に葬られ何事もなかったかのように処理は続行してしまいます。

# まとめ
例外設計は非常に奥が深いです。
一般的には、`例外は普通はおかしくなることがあり得ない状態であり、且つプログラムの実行を停止せざるを得ない状況`場合に使用されます。
ただし、例外やエラー処理については、プログラミング言語やアプリケーションによって異なる考え方や設計があり、一様な扱いはできません。そのため、悩んだ時は開発メンバーと相談しながら設計することが重要です。

# 参考サイト
[Railsアプリケーションにおけるエラー処理（例外設計）の考え方](https://qiita.com/jnchito/items/3ef95ea144ed15df3637)
[例外設計について勉強](https://zenn.dev/akira_kashihara/scraps/aabb239201c7f2)
[エラーと例外とセキュアコーディング／セキュアプログラミング](https://blog.ohgaki.net/error-exception-secure-coding-programming)
2 Ft Class II Type A2 Biosafety Cabinet Equipment is NSF Certified.

AI Medical is a premium manufacturer and supplier of the industry’s leading laboratory and pharmaceutical, medical refrigeration, and freezers. We design, manufacture, and distribute highly specialized laboratory temperature control equipment to various customers in the clinical and life sciences sectors. We are pleased to announce our 2 Ft Class II Type A2 Biosafety Cabinet Equipment is NSF Certified .
The majority of users in hospital and research laboratories demand accreditation of their service providers.
The industry recognizing the need for demonstrated knowledge and skills to ensure protection of public health, safety and the environment, views NSF-accredited field certifiers as providing quality, reliable field certification services.
Check our website, and get more information:
https://www.aimedicalproducts.com/
! [uploading... 0]()
RISC-V向けの実行ファイルをmacOSとUbuntu22.04それぞれでエミュレーション実行する方法

`riscv-isa-sim`と`riscv-pk`を使います．

# macOS

```zsh
brew tap riscv-software-src/riscv
brew install riscv-isa-sim riscv-pk
```

# Ubuntu 22.04

## `spike`のインストール

下記をインストールします．

https://github.com/riscv-software-src/riscv-isa-sim

`/usr/local/riscv` にインストールします．

```bash
sudo apt update
sudo apt install device-tree-compiler
git clone https://github.com/riscv-software-src/riscv-isa-sim.git
cd riscv-isa-sim
mkdir build
cd build
../configure --prefix=/usr/local/riscv
make -j$(nproc)
sudo make install
```

## `pk`のインストール

あらかじめ下記にしたがって，`riscv-gnu-toolchain`をインストールして，インストール先(`/usr/local/riscv/bin`など)に`PATH`を通しておいてください．

https://qiita.com/zacky1972/items/0cbfdf4e400e0205aa7b

下記をインストールします．

https://github.com/riscv-software-src/riscv-pk

`/usr/local/riscv` にインストールします．

```bash
git clone https://github.com/riscv-software-src/riscv-pk.git
cd riscv-pk
git checkout 8ce2dc4 # 2023年5月15日現在，このcommit hashをcheckoutしないとpkが正常に動作しません
mkdir build
cd build
../configure --prefix=/usr/local/riscv --host=riscv64-unknown-elf --with-arch=rv64gc_zifencei
make -j$(nproc)
sudo make install
```

参考記事は下記の通りです．

https://github.com/riscv-software-src/riscv-pk/issues/298

# 使い方

次のように使います．

macOSの場合

```zsh
spike pk (実行ファイル)
```

Ubuntu 22.04の場合

```bash
/usr/local/riscv/bin/spike /usr/local/riscv/riscv64-unknown-elf/bin/pk (実行ファイル)
```

ベクタ拡張を含む実行ファイルを実行するには次のようにします．

masOSの場合

```zsh
spike --isa=RV64IMAFDCV pk (実行ファイル)
```

Ubuntu 22.04の場合

```bash
/usr/local/riscv/bin/spike --isa=RV64IMAFDCV /usr/local/riscv/riscv64-unknown-elf/bin/pk (実行ファイル)
```

`--isa=RV64GV`では動作しませんでした．

32ビットアーキテクチャで動かすためには，`riscv-pk`を32ビットアーキテクチャでコンパイルする必要があります．

あらかじめ，下記の記事にしたがって，`riscv-gnu-toolchain`をインストールしておきます．

https://qiita.com/zacky1972/items/0cbfdf4e400e0205aa7b

`pk`のインストール先をたとえば次のように設定します．

```zsh
export RISCV=~/rv32
```

その後，次のようにしてビルド・インストールします．

macOSの場合

```zsh
git clone https://github.com/riscv/riscv-pk.git
cd riscv-pk
mkdir build
cd build
../configure --prefix=$RISCV --host=riscv64-unknown-elf --with-arch=rv32i
make
make install
```

Ubuntuの場合

```bash
git clone https://github.com/riscv-software-src/riscv-pk.git
cd riscv-pk
git checkout 8ce2dc4 # 2023年5月15日現在，このcommit hashをcheckoutしないとpkが正常に動作しません
mkdir build
cd build
../configure --prefix=$RISCV --host=riscv64-unknown-elf --with-arch=rv32i_zifencei
make -j$(nproc)
sudo make install
```

使用方法としては，例えば次のようにします．

```zsh
spike --isa=RV32I ~/rv32/riscv32-unknown-elf/bin/pk (実行ファイル)
```
ユーザーと記事を紐付け②

<h3>データベースのロールバックとマイグレーション</h3>
ユーザーの概念がないときに、記事を保存した。

現状の記事は、ユーザーが存在したりしなかったりしている。

ユーザーが存在しない記事はおかしい！！

dbの設定を少し変える👀
そのために、マイグレーションについて深めましょう👏

・dbは、Gitで管理できない！
ファイルの変更をしたから、dbが変わるわけではない！
　マスターという状態で、dbが、αという状態だとする。
その後、Aブランチを作り、マイグレーションファイルを作成し実行したとする。そうするとdbが、α状態から、β状態に変わったとする。
このAブランチをマスター状態に戻すと？？
dbは、αではなく、βになっている！

dbは、ファイルの状況で変化するものではなく、マイグレーションを実行することで、変わる💨

なので、現在あるマイグレーションファイルを消しても、dbは消えない！なぜなら、マイグレーションファイルは、設計書（説明書）であるから！
マイグレーションファイルを変更しても、dbは変わらない！！

であれば、βからαに戻したいとする。
その時はどうするのか？


railsでは、元に戻すというロールバックというメソッドがある❗️

説明書の作る順番を見て、元に戻してくれる！

現在、記事を作る、ユーザーを作る、idを付与したの三つのマイグレーションファイルが存在する。

ロールバックするには、

ターミナルを開き、ディレクトリを移動

    ＄rails db:rollback
remove_reference(:articles, :user)
ユーザーというディファレンスを作ったけど、消したよ！という意味

db/schema.rb
をみると、もともとユーザーとあったが、消えている😭

これはロールバックした結果です！

    ＄rails db:migrate
とすると、また先ほどロールバックした、ユーザーが追加される。

現在あるマイグレーション３つとももとにもどしたい！！

    $rails db:rollback STEP=3
revertingと書いてあるので、全てもとに戻されている（逆行）のがわかります。
drop_table(:articles)
アーティクルというテーブルをなくしている！！


    $Article.first
railsコンソールにて確認すると、データがなくなっているのがわかります😆
 no such table: articles
アーティクルというテーブルは、ありませんとなっている。

ただし、ロールバックは、開発環境でしかやらない！
本番環境でロールバックをするとデータが消えてしまうから！！！
なので、基本的に本番環境では、マイグレーションファイルを変更できない！変更するためには、データーを消さなければいけない😭

データベースの設計は、一度リリースすると、変更できない！
ので、データベースの設計は重要！！！！