OmniAICreator/Qiita-1.07M huggingface dataset:
RSpec システムスペックのドライバーとは？

## はじめに
[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)でRSpecの学習中、以下の記述の理解が難しかったので調べてみました。
```ruby:RSpec
before do
  driven_by :rack_test
end
```

## 環境
ruby 3.2.1
Rails 7.0.4
rspec-rails 6.0.1
Capybara 3.38.0
selenium-driver 4.8.1 
webdrivers 5.2.0 


## driven_by
これはシステムスペックの設定オプションで、使用するドライバーやブラウザを指定できるそうです。

例えばseleniumドライバーと、Chromeブラウザを使用したい場合は以下のようになります。
```
driven_by :selenium, using: :chrome
```
参考：　[Railsドキュメント](https://railsdoc.com/page/driven_by)

## ドライバの種類
以下引用です。　　　参考： [Capybaraチートシート](https://qiita.com/morrr/items/0e24251c049180218db4)

|ドライバ|使用するときのシンボル | 概要 |
|-----------|------------|:------------|
|Rack::Test|:rack_test|デフォルト。 Rails標準のテスト機能。Rackと通話して通信をシミュレートする。 高速だがJavaScriptを使えない、Rackアプリ外の通信をテストできない。
Selenium | :selenium | js利用時のデフォルト。Selenium Web DriverによりFirefoxをヘッドレスブラウザとして起動し、その中でテストする。多機能だがFirefoxに依存する。
Webkit | :webkit | QtWebkitを使ったヘッドレスブラウザ環境。Webkit準拠、Seleniumより高速。
Poltergeist | :poltergeist | PhantomJSベースのヘッドレスブラウザ環境。ピュアヘッドレス(のため高速)、Webkit準拠。




## RSpecでどれを使用すればいいのか？
基本的には`:rack_test`だけでいいと感じました。
jsを使用してテストする際も、デフォルトの`selenium`で事足ります。

簡単なアプリケーションなどであればjsをわざわざ使用しなくても一応テストはできますし、`:selenium`を使用した感じ、テスト実行〜完了までが時間かかります。
なのでjsじゃなきゃダメなんだ、という時以外はデフォルトの`:rack_test`でいいと思います。

## 使用方法
### `:rack_test`
システムスペックファイル作成
```:ターミナル
$ rails g rspec:system test
```
デフォルトで`rack_test`は設定されています
```ruby:spec/systems/test_spec.rb
require 'rails_helper'

RSpec.describe "Tests", type: :system do
  before do
    driven_by(:rack_test)
  end

  pending "add some scenarios (or delete) #{__FILE__}"
end
```

### `:selenium`
今回はChromeでの使用方法について説明します。

gemでドライバーをインストールする。
`:selenium`使用時にChrmeを使用したい場合は`webdrivers`をインストールします。
(Rails6以降であればデフォルトで入っています）

```ruby:Gemfile
  gem "selenium-webdriver" #javascriptが実行可能なドライバー
  gem "webdrivers" #chromeとやり取りするインターフェースになる
```
`selenium`でChromeを使用するように設定する
```ruby:spec/rails_helper.rb
# jsオプション有効時のドライバを設定(デフォルトは:selenium)
Capybara.javascript_driver = :selenium_chrome
```


各ブロック内で`js: true`を指定する
```ruby:spec/systems/test_spec.rb
describe '...', js: true do
  # javascriptが有効になる
end

context '...', js: true do
  # javascriptが有効になる
end

it '...', js: true do
  # javascriptが有効になる
end
```
## `selenium`でブラウザのシミュレーションをする際の難点
テストはブラウザが自動で立ち上がり、操作されながら実行されるのでテストが完了するまでに時間がかかります。
大掛かりなアプリでは相当な時間になります。

その場合は、ブラウザを立ち上げずに実行する方法もあります。
```ruby:spec/rails_helper.rb
# jsオプション有効時のドライバを設定(デフォルトは:selenium)
Capybara.javascript_driver = :selenium_chrome_headless
```

## 参考サイト
[Railsドキュメント](https://railsdoc.com/page/driven_by)
[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)
[Capybaraチートシート](https://qiita.com/morrr/items/0e24251c049180218db4)
[AWS Q&A 365][Redshift]Daily Five Common Questions #6

# 1. What is Amazon Redshift and how does it work?
Answer: Amazon Redshift is a data warehousing service provided by Amazon Web Services (AWS) that allows users to store and analyze large amounts of data in a cost-effective and scalable way. It uses columnar storage technology and massively parallel processing (MPP) to provide fast query performance on large datasets.

# 2. How can I get started with Amazon Redshift?
Answer: To get started with Amazon Redshift, you need to sign up for an AWS account and create a Redshift cluster. You can do this using the AWS Management Console or the Redshift API. Once your cluster is up and running, you can load data into it and start querying it using SQL.

# 3. What resources are available for learning more about Amazon Redshift?
Answer: There are many resources available for learning more about Amazon Redshift, including the Amazon Redshift Management Guide, the Amazon Redshift Database Developer Guide, SQL reference, system tables and views, tutorials, feature videos, and the Amazon Redshift Getting Started Guide itself.

# 4. What are some of the new features and updates in the latest version of the Amazon Redshift Getting Started Guide?
Answer: The latest version of the Amazon Redshift Getting Started Guide (updated on June 30, 2021) includes new sections about getting started with common database tasks, querying your data lake, querying data on remote sources, sharing data, and training machine learning models with Amazon Redshift data. It also includes a new sample load procedure.

# 5. How can I query data on remote sources using Amazon Redshift?
Answer: To query data on remote sources using Amazon Redshift, you can use the Amazon Redshift Spectrum feature, which allows you to query data stored in Amazon S3, Hadoop, or other data stores using standard SQL. You can also use the Amazon Redshift federated query feature, which allows you to query data across multiple data sources using a single SQL statement.
いまさら人にきけないパスワード管理と認証2023

皆様どのようにパスワード管理を行っていますか？  
Zennを探してもベーシックにまとまった記事は見つからなかったので、このなかなか語られにくい、語りえないトピックについて、誰にでもわかる＋何らかの示唆を与えるような概要をこの記事で示します。

## 我々はパスワードからは逃げられない？
あなたはGoogleアカウントを取得しました。→パスワード1つ、追加認証情報1つの管理が必要になります。  
あなたはTwitterアカウントを取得しました。→パスワード1つの管理が必要です。  
さらには今まで利用してきたサービスが突然追加認証情報を要求してきて、Google Authenticatorのようなアプリが必要になっていることでしょう。  
SNS、ネットショッピング、ニュース、エンタメ、ネットバンク、よく行くお店、ふるさと納税、etc...  
ありとあらゆるものがWebと連動していて、パスワード1つを要求してきます。  
さらにMFA(多要素認証)が要求されるこの現代においては、さらにもう1つの情報管理が必要なのです。  
![パスワード認証](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109654/04cd38d9-81a5-f81b-6206-20edbf7576c0.png)

## 認証の様式
我々は何を持ってしてWebサービスの利用者本人であるとみなされている(認証されている)のでしょうか？  
よくパスワード認証とか言ったりしますが、思いつく限り、一歩踏み込んだ形で整理してみます。

|認証に用いるもの|詳述|
|:-|:-|
|パスワード|パスワードを入力できるか|
|ワンタイムトークン(OTP)|ワンタイムトークン(典型的には6桁の数字)を入力できるか|
|OAuth|アクセストークン要求を認可する権限があるか|
|メールアドレス|指定メールアドレスのメールボックスにアクセスできるか|
|生体|指紋・虹彩などの特徴的なパターンをデバイスに入力できるか|
|電話番号|指定電話番号の電話・SMSを受けられるか|
|住所|指定住所への書留郵便を受領できるか|
|免許・パスポート|国家発行の免許証などの所有を示せるか|

資金の動きを捕捉する必要がある金融サービスなどは、より煩雑で精度の高い認証を必要とします。一方でその煩雑さが理由でサービスを使わないという選択をすることもあります。

## 我々はパスワードからは逃げられる？
さて肝心のパスワードを忘れた場合、どうしますか？  
この場合Webサービスはメールアドレス認証を要求したり、より堅いサービスだと住所確認が必要になったりします。  
パスワードは**煩雑な認証プロセスを省略するためのキャッシュ**のようなものだと考えられます。本当のところ必要がないものですが、様々な都合から存在していると考えられます。  
「宵越しのパスワードは持たない」戦略と称して一切のパスワードを記憶しない方法は成立すると思いますが、例えばメールアドレスが凍結されると即座にWebサービスのアクセス権限を失うなどのリスクを考えると現実的ではありません。  
パスワードは、実際のところある程度の**認証の冗長性(バックアップ)や匿名性の確保**を裏で担っているとも言えるでしょう。  
パスワードのない世界の実現の結果が、「スマホを水没させたら全サービスが利用できなくなった」では話にならないわけでやはり今後もしばらくはパスワード管理は必要になるのでしょう。

## パスワードを管理する
パスワードを管理するための手法やツールはいくつかありますが、やはり専用管理ツールを用いて管理した方が良いと思います。  
十分な強度を確保し、かつ使い回しをしないこと、またどのようなサイトでパスワードを設定したかの列挙はできた方が良いからです。紙や記憶だけに頼ろうとするとこの要件を非常に満たしにくくなります。

**手動運用＜何らかの管理ツールの利用**

この不等式は覆らないでしょう。
全てのOSで利用可能なツールを列挙すると、以下のような候補が挙げられると思います。
|ツール|どこに保存するか|無料?|OSS?|
|:-|:-|:-|:-|
|Googleパスワードマネージャー|クラウド|⭕️|❌|
|1password|クラウド|❌|❌|
|LastPass|クラウド|⭕️|❌|
|KeePass|ローカル|⭕️|⭕️|
|Bitwarden|ローカル OR クラウド|⭕️|⭕️|

クラウドのものはブラウザとの連携性がよく、それゆえに例えばフィッシングやキーロガーによる攻撃に対して一定の耐性があると思いますが、データがネットワークにさらされており、実装が公開されていない以上どのような水準の暗号化が施されているかについてサービス事業者を無条件で信託することになります。    
https://gigazine.net/news/20221228-lastpass-statement-explain/  
一方で上記記事のようなこともあった関係上、ローカルで扱えるツールを扱えた方が良いのではないかと思います。  
ローカルツールをうまく扱うことができれば、ワンタイムトークンだけはローカルで運用するなどの戦略も立てることができます。  
Bitwardenも興味深いですがサーバ型のツールであり運用がやや複雑なので、KeePassが汎用性と実用性の観点からいいのではないかと思います。

## まとめ
この記事では、パスワードが認証を行う上で本質的に不要であることを述べた上で、パスワードを管理しなければならない現実的な理由が存在することを示しました。  
この記事の続編として、パスワード管理ツールKeePassをサクッといい感じに使うための記事を書こうと思っています。  
この記事から何か示唆を得られたと思ったら評価💓していただけると幸いです。  
今回の記事について追記すべき内容や修正案等がございましたら、ぜひコメントを残していただけると幸いです。よろしくお願いいたします。
has_manyのdependent: xxxが実行される前に、before_destroyを実行する方法

## この記事で説明したいこと

before_destoryのprependオプションについて

https://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#module-ActiveRecord::Callbacks-label-Ordering+callbacks

## 背景

`has_many :hogehoges, dependent: destroy`となっている`hogehoges`がある。
このとき、親のレコードの削除に伴い、紐づく`hogehoges`がdestroyされる前に行いたい処理があった。

例えば、

```rb
class Like < ApplicationRecord
  module Likable
    extend ActiveSupport::Concern

    included do
      has_many :likes, dependent: :destroy
    end
  end
end

class Article < ApplicationRecord
  include Like::Likable
  before_destroy :logging_final_likes

  def logging_final_likes
    puts likes.size
  end
end
```

想定としては、`logging_final_likes`を実行したあとに、`likes`がdestroyされてほしかった。
しかし、これを実行してみると、`logging_final_likes`は0になり、destroy前に実行されていないことが分かった。

以下のドキュメントによると、before_destroyよりも先にdestroyが実行されているらしい。(ただし、transactionは同じ)

https://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#module-ActiveRecord::Callbacks-label-Ordering+callbacks

これを回避するには、`prepend: true`オプションがあり、これをbefore_destoryにつけると動きました。

```diff_ruby
class Article < ApplicationRecord
  include Like::Likable
-  before_destroy :logging_final_likes
+  before_destroy :logging_final_likes, prepend: true

  def logging_final_likes
    puts likes.size
  end
end
```

## 参考

- [ActiveRecord::Callbacks](https://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#module-ActiveRecord::Callbacks-label-Ordering+callbacks)
ChatGPT(GPT-4)で台本を一発で作る

こんにちはGSです。

今回も前回同様にChatGPTを使用してみました。この作品も同様にSIGNATE投稿作品になりますのでもしよろしければ、twitterの方でRTやいいねをいただけたらと思います。

https://twitter.com/ggtyun29/status/1636348292350251009?s=61&t=LaRKejt9u3_9y5tx4PdFMw

今回はクリエイター支援のテーマで書かせていただきます。


# 背景
劇やアニメなど役者さんの演技には台本が必要となります。しかしながら、原作小説があるのにも関わらず、役者さんがやりやすいように変換するのは時間がかかると考えます。そこの効率化という面で今回の提案になります。

# 実践

今回対象とした作品は著作権がフリーとなっている鶴の恩返しと太宰治の人間失格のはしがきの部分を利用しました

## 鶴の恩返し
![スクリーンショット 2023-03-16 21.37.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606656/4323edfa-929f-7720-953c-2dc8a8a38dee.png)
![スクリーンショット 2023-03-16 21.34.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606656/577c85f3-5c8d-e68f-09a4-47b6a38b5d2f.png)
![スクリーンショット 2023-03-16 21.35.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606656/d043b5f6-0b00-1185-6a55-527c2f52369c.png)

## 人間失格

![スクリーンショット 2023-03-16 21.22.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606656/bcc36a30-000a-f26a-14a8-bbfd8ff4ea35.png)
![スクリーンショット 2023-03-16 21.23.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606656/ee1177d7-d661-e477-7eb8-eb3ed1c2dcb2.png)
![スクリーンショット 2023-03-16 21.23.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606656/bc84aed6-2ce9-af38-d2c1-5fbd2b304db3.png)

# もし出力が長くなり表示されなかったとき

鶴の恩返しの方について途中で終わっていたので、プロンプトで続きを書いてくださいと指定すると、続きを書いてくれます。

![スクリーンショット 2023-03-16 21.38.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606656/2f8a6feb-a68e-9ac1-5305-a16ba609e8c7.png)
![スクリーンショット 2023-03-16 21.38.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606656/d1b3a655-b3ef-6f46-f63c-1082d539662a.png)

# 感想

ここ1日触った感じだと思ったよりも変換・言い回しに強い気がします。
今まで明らかに人手でやらないといけなかったけど、ある程度一括で変換してくれるものに関しては間違えているかどうかチェックが必要ですが転換期が来ている気がします。
Next.jsでプロジェクトで画像表示

## この記事の目的
- Next.jsでブログを作成したときの備忘録
- 画像表示する際にエラーが出たのでその備忘録

## 概要
前提：Next.jsのプロジェクト内に画像を追加し、その画像を表示する
行なっていることはただプロジェクト内の画像を表示しているだけです
- ①画像を追加
- ②next.config.jsを編集
- ③next/imageインポート
- ④Image書き方
- ⑤エラーについて

## ①画像を追加
`public`フォルダ内に表示したい画像を追加する
![スクリーンショット 2023-03-14 0.20.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462658/f09ecf12-949a-0e0d-deab-467123582e53.png)

## ②next.config.jsを編集
`next.config.js`を下記のように編集
`images`の部分を追記しましたが、なくても行けました、、
外部ドメインの画像を使う場合はドメインを指定しておく必要があるみたいです。
参考→[Next.js next/image で外部URLの画像を使いたいときにやること](https://chaika.hatenablog.com/entry/2021/07/20/083000)
```next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  reactStrictMode: true,
  images: {
    domains: ['localhost'], // 画像を置いているドメイン
  },
}

module.exports = nextConfig
```

## ③next/imageインポート
画像を表示させる該当ファイルにて`next/image`をインポート
```tsx
import Image from "next/image"
```

## ④Image書き方
<Image>コンポーネントを書いていく
※`width` `height` `alt`をしてしないとエラーが表示されます
```tsx
<div className="image">
   <Link href={"/"}>
      <Image src="/pc_img.jpg" width={600} height={600} alt="pc_img" />
   </Link>
</div>
```
![スクリーンショット 2023-03-14 0.30.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462658/786178aa-352a-7748-0f2c-238d4cad787a.png)


## ⑤エラーについて
■<Image>コンポーネントに`alt`が抜けていると下記のようなエラーが出る
```
Image is missing required "alt" property. Please add Alternative Text to describe the image for screen readers and search engines.
```
■<Image>コンポーネントに`width` または`height` が抜けていると下記のようなエラーが出ました
![スクリーンショット 2023-03-14 0.38.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462658/0f514932-e4e9-8a5e-2d82-41a0a2013a73.png)
Next.js13のLinkコンポーネント

## この記事の目的
- Next.jsでブログを作成したときの備忘録
- Next.js13のLinkコンポーネントについて
- エラーについての備忘録

## 概要
- Linkコンポーネントについて
- Next.js12と１３での書き方の違い
- 新規タブで開く際の書き方

## Linkコンポーネントについて
Linkコンポーネントは画面遷移に使用するaタグのようなもの
下記のようにインポートしてから使用する
```tsx
import { ImTwitter } from "react-icons/im";
import Link from "next/link"
```
## Next.js12と１３での書き方の違い
Next.js12と１３でLinkコンポーネント書き方が変わったのでそれについて記載。
### Next.js12の場合
```tsx
import Link from 'next/link'

// Next.js12まではaタグを常にネストする必要がある
<Link href="https://twitter.com/piki_maru_ten">
     <a><ImTwitter /></a>
</Link>
```
### Next.js13の場合
```tsx
import { ImTwitter } from "react-icons/im";
import Link from 'next/link'

// Next.js13ではaタグを記載するとエラーになる
<Link href="https://twitter.com/piki_maru_ten">
     <ImTwitter />
</Link>
```
Next.js13ではaタグを記載すると下記のようなaタグにaタグをネストする書き方はダメ！というエラーが出ます
[エラーにあるドキュメントはこちら](https://nextjs.org/docs/messages/invalid-new-link-with-extra-anchor)
![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462658/08528b0b-d300-e190-a14c-3dc2871b2c9f.png)


## 新規タブで開く際の書き方
aタグ必要ないのはわかったけど、新規タブで遷移させる時はどう書くのか気になったのでまとめました
Linkタグにそのままtargetとrel属性を追加すればいいだけでした
```tsx
import { ImTwitter } from "react-icons/im";
import Link from 'next/link'

// Linkタグにtargetとrel属性を追加
<Link href="https://twitter.com/piki_maru_ten" target="_blank" rel="noopener noreferrer">
    <ImTwitter />
</Link>
```
VSCode + Rust + Devcontainerでrust-analyzerを使おうとしたら動いてくれなかった。

# 環境
- M1Mac
- VSCode
    - devcontainer
- Docker
    - rust:1.68-buster

# 起きたこと
VSCodeのdevcontainerでRust開発をしようと思ったら、rust-analyzerがエラーを吐いてサジェストしてくれなかった。
```
version `GLIBC_2.29' not found
```

# 解決策
使っているRustのDockerImageを`buster`から`bullseye`に変更した。

# 解説
`buster`で利用されている`debian10`に入っている`libc6 2.28-10`では、rust-analyzerが利用する`GLIBC_2.29`が動かせない。
そのため、`bullseye`で利用されている`debian11`であれば、`libc6 2.31-9`が入っているので動作するようになった。

# 参考
https://stackoverflow.com/questions/66331923/cannot-install-libc6-ver-2-29-newer-on-debian-buster
Laravel リレーション先へのアクセス方法の違い

### はじめに
PHP及びLaravelの勉強中。
基本的な部分だけどきちんと理解せずフワッと使用してるのでアウトプットしてみる。

### 設定
- CategoryモデルとItemモデルが１対多の関係性で存在
  - Categoryモデル側 -> hasMany
  - Itemモデル側 -> belongsTo
 ```
// $categoryの中身
$category　=　Category::query()->find(1);
```

### プロパティアクセス
```
$category->items;
=>　Illuminate\Database\Eloquent\Collection
```
返り値はCollectionクラス。foreachで回してEloquentモデルの利用ができる。

### メソッドアクセス
```
$category->items（）;
=>　Illuminate\Database\Eloquent\Relations\HasMany
```
返り値はHasManyクラス。さらにメソッドを呼んで色々できる。
```
$category->items（）->get();
=>　Illuminate\Database\Eloquent\Collection
```
getメソッド呼べばプロパティアクセスと同様にCollectionが返る。
```
$category->items()->where('id',1)->first();
=>　Illuminate\Database\Eloquent
```
特定のEloquentモデルを得ることもできる。
他にも色々。
[Rails] migrationファイルで、テーブルにenum型のカラムを追加する

# 注意点

- MySQLなどの`DB`にどうやってenum型カラムを作るか、というお話
- `model`のenum型パラメータの話ではない
- SQLのコマンドで直接DBにカラムを作るのではなく、Railsのmigrationファイルでカラムを作るよ


# 前提条件

- Gem
    - `"rails", "7.0"`
- 対象テーブル名: `users`
- 追加したいenum型のカラム名: `user_category`


# ソースコード

```ruby:db/migrate/yyyymmddHHMMSS_add_column_to_users.rb
class AddColumnsToUsers < ActiveRecord::Migration[7.0]
  def up
    execute <<-SQL
      ALTER TABLE users ADD user_category ENUM('normal', 'employee') COMMENT 'ユーザー種別';
    SQL
  end

  def down
    remove_column :users, :user_category
  end
end
```

# 説明

- これで、 `'normal', 'employee'` のいずれかしか登録できないカラムが追加される
- `down`ブロックにより、`rails db:rollback`すれば `user_category`カラムのみ削除される


コメントを書く方法も込みでわかりやすい記事がないか探したが、すぐには見当たらなかったので記事化しておく。
Vueで再描画(非同期処理)中に画面遷移ができなくなる

# はじめに

Vueで多くのAPIを叩いているページのユーザー体験改善を行ったのでまとめていきます
コードはあくまでなんとなく雰囲気を掴んでもらうために書いたので適当です

# 問題

ユーザー一覧の画面を作成したとします。
この画面ではユーザーそれぞれの「名前」と「友達数」が表示されるとします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/5493b013-acd3-3994-5ab5-43d3f96d7a1c.png)

ここで描画までにとしてはまずユーザー一覧(ユーザー名一覧を取得するAPIを叩く)を取得して描画を行います

```vue:userLits.vue
const users = GetUserAPI()
this.users = users
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/c904616f-1f28-7bcb-fd05-5c4f58bc34ba.png)

そして、それぞれのユーザー(ユーザーID)に対して友達数を返すAPIを叩きます。

```vue:userList.vue
const users = getUserAPI()
this.users = users
users.forEach((user, index) => {
    const friendCount = getFriendAPI(user.id)
    user.friendCount = friendCount
})
```

ここでAPIを叩き終わり値がセットされると徐々に上から友達数が表示されていきます

1人目のユーザーの友達数がステートに入ったときに再描画

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/1b768e55-1320-56a6-133b-0da88f218453.png)

2人目のユーザーの友達数がステートに入ったときに再描画

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/280e0f09-a5b4-7a76-31da-4e07faeb8c91.png)

最終的には少しの時間がかかりすべてのユーザーの友達数が描画されてページがすべて表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/5493b013-acd3-3994-5ab5-43d3f96d7a1c.png)

ここで「ユーザー数が多い場合」(描画までに時間がかかる場合)に問題がおきました
それはユーザーリストを表示してすべての描画が終わるまで、「トップページ」「マイページ」タブをクリックしても**遷移ができませんでした**

これはページを読み込んだタイミングで再描画が何度も走り、クリックイベントが後回しになり続けてすべての描画が終わってからイベント発火するために起きていました

このままでは、ユーザー数が多くなればなるほど他のタブに移動できるようになるまで時間がかかってしまい、間違えてタブをクリックした場合には使い勝手が悪くなります

# 解決方法

ここで遅く感じる原因としてそれぞれのユーザーに対して「APIを叩く」→「更新」とやっていることです

なので、「すべてのユーザーの友達数をはじめに取得しておく」(APIを叩いている間は再描画していないのでクリックイベントが実行される) → 「それぞれのユーザーの更新」としました

このような仕組みにすることで、ユーザーをそれぞれ更新するときにAPIを叩いている処理時間が省略されるので、タブの切り替えができないというのが気にならなくなりました

# おまけ

いままでここまで重くなるような画面を作ったことがなかったので実感しましたが、これは最初の画面ロード時にでてくるローディングサークルなどが動いているときにも同様の事象が置きます。

なので、重い処理はデータを裏でまとめて取得するようにしといて、画面には更新が走らないものを表示しておくほうが良いなと思いました

# おわりに

いろいろ調べていて同様の事象で困っている方がいなかったのでコードは適当にはなりますが、ニュアンスを掴んでほしくてまとめてみました

コーディング自体はよくやるような方法だったので思わぬ落とし穴でした
国土交通省の"PLATEAU"ってどんなもの

 # PLATEAUってなんだ

![PLATEAU_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/15ee5cdb-7fe3-1cf8-8900-c666fbc37123.png)

PLATEAU（プラトー）とは、**国土交通省**が作成しているオープン化された日本各地の3D都市モデルの事で、主要都市の取り込みに関しては、2023年現在ほぼ完了している。
3D空間について某大手のMapレベルかと思いきや、私が想像しているより高い次元のデジタルツインになっているので、今回はこのプロジェクトについて調べてみた。

## どれほどのクオリティなのか

![PLATEAU_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/8c1e2f7a-a2b4-d372-92fb-8a005aa74e90.png)

PLATEAUは後述する"国際基準"に準拠し、標準データモデルを策定、品質やルールなどを統一している。
現在の基準がLOD（Level of Detail）1〜4まで定められており、数字が大きくなるにつれ細部まで作り込まれている（多くの情報が入っている）状態を指す。LOD2からは、なんと屋根や壁といった情報を3Dに持たせている。いわゆるセマンティックなデータだ。LOD3では開口部も定義され、これにより避難経路のシミュレーション等に利用する事が出来る。
またインプットになっている資料が自治体などが使用する「地図」であるため、位置関係の制度がとても高いものになっているそうだ。

> 参考　[国土交通省：3D都市モデルの特徴と活用法](https://www.mlit.go.jp/plateau/learning/tpc01-2/)

## オープン化に向けて

国際機関Open Geospatial Consortium (OGC) が定める国際基準の**CityGML**(3.0)を採用しており、多くの人にとって扱い易いデータとなっている。OBJやJSON、FBXなどへの変換ツールも多数開発されているため、様々な環境での実装も可能となっている。それ故に、既にPLATEAUを使用した様々なシステムが開発されており、2021年にはPLATEAUの実装を競う、ハッカソンまで開催され盛り上がりを見せている。

https://www.ogc.org/standard/citygml/

>参考　[国土交通省：ハッカソン部門の記録](https://www.mlit.go.jp/plateau/journal/j006)

## 活用事例

![PLATEAU_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524398/5bcb9d1a-572e-7b35-bdd6-9f275b1ac11e.png)

という訳で私も早速、実際にPLATEAUを使用した、実際の街の細部まで3D空間で楽しめるという『**PLATEAU VIEW**』というWebアプリを見つけたので使用してみた。触ってみると自分で指定した場所の、指定したモノを表示させるという、慣れない操作があったり、ポリゴンにテクスチャを貼って地図を表示させると動作が重く、快適とは言えない。今後情報を更に増加させ、詳細化も進める想定の中、アプリケーションがどんな動きが出来るのかは、不安と期待がある。
そんな中私の琴線に触れる部分もあった。それは防災の観点で痒い所に手が届いているところだ。具体的には浸水の可能性がある場所にランク付けし色で塗り分けたり、避難場所（キャプチャの緑のピン）を分かり易くプロット出来る点など、防災が趣味の私には非常に良い機能だと思った。また建物情報という項目には”建物利用現況_耐火構造種別”なんてものも出てきて、オブジェクトが持っている情報の多さに驚いた。

https://plateauview.mlit.go.jp/

## 最後に

今後更にブラッシュアップしていけば、VPS(Visual Positioning Service)も可能となり、実際に取得した映像と、PLATEAU上でレンダリングした仮想空間の画像を比較し位置を割り出す事も可能だという。これが出来る様になれば、自動運転やドローン、ARなどの活用の幅も広がっていく事だろう。
また大規模な自然災害が頻発するこの日本で、PLATEAUに建物や居住者の情報を連携させ、被害確認や復旧の手助けが可能になるなど、高度な地理情報システムは最早必要不可欠と言えるだろう。
Unity AnimationController：トリガー遷移： 数秒ごとにアニメーションを１回実行する


# 実現したいこと
にわとりが５秒毎に卵を生みます。
その際にジャンプするアニメーションが実行されます。

![tower2.59.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/7efe7b1f-12bb-3e57-0f87-92eb0f608bdb.gif)


# 開発環境
IDE:Rider
Unity:2021.3.91
OS:Windows10

# 実装

## animationの設定
animationはアセットに既にあるので、それを利用します。


## animatorの設定
### animatorの設定をする
図のようにステートマシンを繋げます。
最初はwalkを実行し、walk→jumpとjump→walkと遷移するようにします。
パラメータはTrigger型を１つ加えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/e93c50e7-7d6b-12fb-a542-565524f498e9.png)


### walk→jumpの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/577137f3-bcbf-64a5-a36e-ca83b4b4fc88.png)

walk→jumpの矢印部分のインスペクターを開きます。
終了時間ありを非活性にすることでwalkアニメーションがループ実行されます。
ConditionにTriggerを加えます。トリガーが発火するまでwalkアニメーションを実行します。トリガー発火後はjumpアニメーションに遷移します。

### jump→walkの設定
jump→walkの矢印部分のインスペクターを開きます。
１回実行したらwalkに遷移するよう　終了時間ありを活性にします。
ConditionにTriggerは追加しません。
jumpアニメーションを実行した後,walkに戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/ad933724-5bb1-17e4-ec38-9f45d75d2c31.png)


### 動作確認
手動でtriggerを発火して動作確認します。（以下gif参照）
![tower2.56.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/6717e0b4-a678-76d9-d952-d1e659a3a212.gif)




## スクリプトの実装
### コード部分
５秒おきにアニメーションを実行するようにスクリプトを作成します。

```diff_c_sharp:chicken.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Chicken : MonoBehaviour
{
    private bool isMakeEgg=true;
    // UIの更新で使う
    public static Action OnMakeEgg;
    private Animator _animator;
    void Start()
    {
        _animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        if (isMakeEgg == true)
        {
            isMakeEgg = false;
            StartCoroutine(IEMakeEgg(5));
        }
    }

    private IEnumerator IEMakeEgg(float makeTime)
    {
+        _animator.SetTrigger("trigger");
        yield return new WaitForSeconds(makeTime);
        Debug.Log("卵を生みました。");
        isMakeEgg = true;
        OnMakeEgg?.Invoke();
    }
    
}
```

### 動作確認
作成したスクリプトをAnimatorと同じオブジェクトにアタッチします。
![tower2.59.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/048e65cc-8612-548d-d7d3-a176afc2b51b.gif)


期待した動きを確認できます。


# 参考

素材はアセットストアより

https://assetstore.unity.com/packages/2d/characters/2d-cute-domestic-animal-pack-v-1-77711


設定の仕方がとても役立った　

https://tech.pjin.jp/blog/2021/07/31/unity-2d_anime_sample1/

公式ドキュメント

https://docs.unity3d.com/ja/2021.3/Manual/class-AnimatorController.html
Dockerを用いてAWS Lambda Layersのzipファイルを作成すーる（Windows 10、Python 3.8、arm64）

# はじめに
Windows環境でDockerからAWS Lambda Layers（arm64、Python3.8）のzipファイルを作っていきます

# 開発環境
- Windows 10
- Python 3.8
- Docker

# 導入
1．Dockerをインストール

https://docs.docker.com/desktop/install/windows-install/

コマンドプロンプトを開き

~~~
wsl --update
~~~

Docker Desktopを起動する

2．Dockerfileの作成

~~~Dockerfile
FROM arm64v8/python:3.8.16-bullseye
~~~

3．イメージをビルド

~~~
docker build -f Dockerfile -t build:python3.8 .
~~~

4．ビルドしたイメージのIDを調べる

~~~
docker images
~~~

|REPOSITORY|TAG|IMAGE ID|REATED|SIZE|
|:--|:--|:--|:--|:--|
|build|python3.8|f7249746d077|2 days ago|857MB|

5．コンテナを実行

~~~
docker run -d -it f7249746d077 bash
~~~

6．プロセスの確認

~~~
docker ps
~~~

|CONTAINER ID|IMAGE|COMMAND|CREATED|STATUS|PORTS|NAMES|
|:--|:--|:--|:--|:--|:--|:--|
|e04adfa35107|f7249746d077|"bash"|10 seconds ago|Up 9 seconds||pedantic_ellis|

7．bashを実行

~~~
docker exec -it e04adfa35107 bash
~~~

8．pythonフォルダにライブラリをインストール

~~~
cd home
mkdir python
pip install -t ./python requests
exit
~~~

9．コンテナからローカルへpythonフォルダをコピー

~~~
docker cp e04adfa35107:/home/python python
~~~

10．zip化してLambda Layersにアップロードし、requestsが使えるか確認

お疲れ様でした

<!--
/usr/local/bin/python -m pip install --upgrade pip
-->

# 追記（2023/05/05）

Python3.10の場合

~~~Dockerfile
FROM arm64v8/python:3.10.9-bullseye
~~~

外部ライブラリのインストール

~~~
pip install polars pyarrow gtfs-realtime-bindings requests
~~~

boto3をimportするだけで下記のエラーが出るようになりました

~~~
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_' (/opt/python/urllib3/util/ssl_.py)
~~~

urllib3のバージョンを次のようにすることで対応

~~~
pip install polars pyarrow gtfs-realtime-bindings requests urllib3==1.26.15
~~~

# 参考まで

Pythonのバージョン確認

~~~python
import sys
print(sys.version)
~~~

urllib3のバージョン確認

~~~python
import urllib3
print(urllib3.__version__)
~~~
AWS Glueをローカルで実行する際のジョブパラメータの渡し方

# 結論
`spark-submit` コマンドを実行する際に、`--JOB_PARAM1 test1`のような形式で渡せます。

例えば、[この公式ドキュメント](https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-etl-libraries.html#:~:text=%E9%81%B8%E6%8A%9E%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82-,spark%2Dsubmit,-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%A7%20spark)のコマンドでジョブパラメータを付けるとすると、以下のようになります。
```bash
docker run -it -v ~/.aws:/home/glue_user/.aws -v $WORKSPACE_LOCATION:/home/glue_user/workspace/ -e AWS_PROFILE=$PROFILE_NAME -e DISABLE_SSL=true --rm -p 4040:4040 -p 18080:18080 --name glue_spark_submit amazon/aws-glue-libs:glue_libs_3.0.0_image_01 spark-submit /home/glue_user/workspace/src/$SCRIPT_FILE_NAME --JOB_PARAM1 test1 --JOB_PARAM2 test2
```

# ちなみに
''、""でくくってもOK。
`--JOB_PARAM1 'test1'`
`--JOB_PARAM1 "test1"`

ただし、イコールで指定するのはNG。正しく認識されません。
`--JOB_PARAM1=test1`

# Glueのローカル開発方法
以前はあまり情報がありませんでしたが、現在は[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-etl-libraries.html#develop-local-docker-image:~:text=%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,Docker%20%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AB%E3%82%88%E3%82%8B%E9%96%8B%E7%99%BA,-%E6%9C%AC%E7%95%AA%E7%92%B0%E5%A2%83%E5%AF%BE%E5%BF%9C)にもわかりやすく実例で載ってますね。
.pyファイルを実行するだけでなく、Glueの環境が動くNotebookもローカルで実行可能です。

さらに、インタラクティブセッションをローカルから使える方法も[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/glue/latest/dg/interactive-sessions.html#:~:text=%E8%AA%AC%E6%98%8E%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6,-%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92)にありました。こちらでも、Notebookをローカルで実行できそうです。
しかし、
>インタラクティブセッションは、PyCharm、IntelliJ、VS Code などの IDE との統合を含め、Jupyter が統合するほぼすべてと統合できるオープンソースの Jupyter カーネルを提供します。これにより、ローカル環境でコードをオーサリングし、インタラクティブセッションのバックエンドでシームレスに実行できます。
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/interactive-sessions-overview.html

とあり、インタラクティブセッションを使った場合はSparkの実行環境はバックエンド、つまりAWS側となります。そのため、Notebookはローカルでも、Glueのインタラクティブセッションの課金が発生するので注意です。
【Python】OpenAIのAPI/ChatGPTのAPIから残クレジットを取得する

以下のようにする

```
import requests
OPENAI_API_KEY = "sk-*****"
headers = {
    'Authorization': f'Bearer {OPENAI_API_KEY}',
}
response = requests.get('https://api.openai.com/dashboard/billing/credit_grants', headers=headers)
response_json = response.json()
```

取得できるのは以下のイメージ

{'object': 'credit_summary', 'total_granted': 18.0, 'total_used': 0.18462800000000001, 'total_available': 17.815372, 'grants': {'object': 'list', 'data': [{'object': 'credit_grant', 'id': '*****', 'grant_amount': 18.0, 'used_amount': 0.18462800000000001, 'effective_at': 1675641600.0, 'expires_at': 1685577600.0}]}}

この場合、無料分の18ドルがtotal_grantedにあり、そのうち、使用分0.18ドルがtotal_usedに記載されている
コンテンツマーケター必見！ChatGPTを使った記事作成の効率化術

## これはなに
検索結果で上位表示を狙った記事の作成にかける時間を短縮することを目的として、ChatGPTを使った体験談を書いたもの


:::note warn
前提条件
- 今回初めてChatGPTを触った
- 先人たちの記事はあまり読まないままチャレンジ
- 記事の作成/ディレクション経験あり
:::

## はじめに
あるところに悩めるコンテンツマーケターがいました。

「ライターが足りない！かといって自分で書く工数はない！」

ひとりで嘆いていると、神様（上司）が有り難いお言葉を授けてくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1480034/df4935a7-48d0-b080-4a3b-e3d11ec63e7e.png)

「ぎょ、業務でChatGPTを使ってもいいのですね！？ありがとうございます！」

有能な助手を手に入れたコンテンツマーケターは、嬉々としてChatGPTの利用を始めました。

## やりたいこと
検索結果で上位表示を狙った記事の作成

## 普段の作成手順
ChatGPTを使ってどうやって記事を作ったのかを紹介する前に、普段の記事作成の手順を説明します。

- 記事の核となるキーワードを選定する
- 任意のキーワードで上位表示されている記事を参考に、骨子を作成する（0.5~1時間）
- 骨子をもとに執筆をする（3~5時間）


:::note warn
細かい手順や作成の際に留意していることは省いています
:::

## ChatGPTを使った作成手順
それでは、ChatGPTを使った記事作成の手順を紹介します。

- キーワードを選定する
- ChatGPTに骨子を出力してもらう（1分以内）
    - `Google検索結果の上位に表示される構成で<!-- 任意のキーワード -->について説明する記事を出力して`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1480034/0efee4cb-5262-939a-4b7e-9779167f9ae8.png)


- ChatGPTに記事の本文を出力してもらう（1分程度）
    - `上記のアウトラインに沿って本文を出力して`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1480034/ab8ee712-e8cd-aaa2-c4d4-14224062756f.png)

:::note warn
実際は出力した本文をそのまま記事として公開することはしていません
あくまでも「記事制作のサポート」として使用しています
:::

## 振り返り・感想
- 時間短縮できるのは大きなメリット
    - 1本あたり3.5~6時間→2分＋α
        - 「＋α」でブラッシュアップにどこまで時間をかけるかは状況次第ですが、時間短縮できることは（今のところ）確実
- 文字数が一定になると出力内容が途中で途切れてしまうのが少し面倒
    - その場合は`続けて下さい`と命令すると続きが出力される
- 指示の出し方を工夫する必要がある
    - ChatGPTを使う側も論理的に説明する能力がある程度求められる
- 情報鮮度は人の目でチェックする必要がある
    - ChatGPTが参考にする情報は2021年までらしい
- 今後ChatGPTを使って作られた記事が量産されるとなると、逆に人が記事の構成や本文に手を加える重要性は高まるだろう
    - EEATや「読み手はどんな情報を求めているのか？読み手を満足させられる内容はなにか？」ということをより一層強く意識しなければいけない

## さいごに
「いや～便利になったなあ」とコンテンツマーケター。
初めて使うChatGPTの便利さに感動し、興奮していました。

するとまた神様（上司）が現れました。
「キーワードごとに骨子が自動で生成されるスプレッドシートを作りました。GASを使って呼び出しています」

「す、すごい！」
コンテンツマーケターは脱帽しました。
「使いこなすのにもスキルが必要だ…」

コンテンツマーケターは新しいツールを使いこなすため、さらなる研鑽を積まなければと思いました。

## おまけ①
ここで書いたことをもっと便利にできるようにしている人がいらっしゃいます。
ぜひ参考にしてみてください。

https://note.com/seimeitsuzaki/n/n07fa00f41961

## おまけ②
本記事のタイトルはChatGPTで出力した案を採用しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1480034/a41a18f5-f5c9-8cff-a471-92c0eb753cae.png)

（慌てて送信したのでtypoがありましたが、ちゃんと出力してくれました）
maya unlock all attribute

```python
import maya.cmds as cmds


def GetAllCurves():
    objs = []
    curves = cmds.ls(type="nurbsCurve", ni=True, o=True, r=True, l=True)
    joints = cmds.ls(type="joint", ni=True, o=True, r=True, l=True)
    for i in curves:
        objs.append(i)
    for i in joints:
        objs.append(i)
    transforms = cmds.listRelatives(objs, p=True, type="transform")
    return transforms


def UnlockAll():
    locked = []
    objs = cmds.ls()
    for obj in objs:
        attrs = cmds.listAttr(obj)
        for attr in attrs:
            try:
                attrObj = "{0}.{1}".format(obj, attr)
                if cmds.getAttr(attrObj, lock=True) == True:
                    cmds.setAttr(attrObj, lock=0)
                    locked.append(attrObj)
            except ValueError:
                continue
    print(locked)


UnlockAll()


# get a list of all objects in the scene
obj_list = cmds.ls()

# loop over each object in the list and unlock its channels
for obj in obj_list:
    attr_list = cmds.listAttr(obj, keyable=True)
    try:
        for attr in attr_list:
            try:
                cmds.setAttr(obj+"."+attr, lock=False)
            except:
                pass
    except:
        pass
```
お粥：入院日記八日目

この資料は医療llmの大切なデータである。
オープンソースの医療カルテ設計のテストデータでもある。後者ではデータ中心設計の事例与件である。

医療系設計者以外は読み飛ばしてください。

長期入院する予定で入院日記を書く。　IT業界、自動車業界で生き残る視点を洗い出す。医療システムの提案を書ければ付録として記載。

# 記録　
iPhone, MacBookAir(M2)

「想定外」3.11 東日本大震災をIT技術者が振り返る

https://qiita.com/kaizen_nagoya/items/80433f4bf7fe116bddd1

TIER IV Computing System Workshop 2023 参加する前に

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

# 医療　

体温、血圧。酸素濃度測定　

朝食　

飲み薬（プレドニゾロン錠5mg * 6, ランソプラゾールOD錠15mg, エルデかルシトールカプセル0.75μg), 持参薬　荒室配合状B P錠 DSEP, ビソプロロールフマル酸塩錠5mgトーワ, オメガ-3脂肪酸エチル粒錠カプセル2g)
塗り薬(スピラゾン軟膏0.3%, pロトビック軟膏0.1%, ジフルブレードナート軟膏0.05%)

歯磨き（歯間ブラシ、歯磨きチューブ・歯ブラシ、歯うがい）　

往診。

お茶汲み　

体温、血圧。酸素濃度測定　

骨密度測定

昼食。

薬。　（プレドニゾロン5mg * 4),


歯磨き（歯間ブラシ、歯磨きチューブ・歯ブラシ、歯うがい）　

往診。
　
作業リハビリ、座っての動作は肩、胸に負荷が大きく、明日からは寝てやることを検討。

足腰リハビリ。１種目は足踏み機械（６分）。２種目は寝てボールで捻り。３番目は寝てボールで腰浮かし。

体温、血圧。酸素濃度測定　

夕食　

薬（プレドニゾロン5mg * 2)

歯磨き（歯間ブラシ、歯磨きチューブ・歯ブラシ、歯うがい）　

# 相談、課題　



https://qiita.com/kaizen_nagoya/items/4de2c9b382ef666cfdcd

https://qiita.com/kaizen_nagoya/items/28d69e80531c481c7062

TIER IV Computing System Workshop 2023　参加記録

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

# 参考資料

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

## 日程表
|日|治療項目|作業項目|
|:--|:--|:--|
|1| 説明(5)、測定（外３、中4)|iPhone|
|2| 説明(3), 測定(外4, 中8)|iPhone, Android Pad|
|3|　説明(1), 測定(中4) |iPhone, Android Pad, MacBookAir|
|4| 説明(1), 測定(中4) |iAM, シャワー|
|5|説明(1), 測定(中4),リハビリ1|iAM,DVD|
|6|説明(1), 測定(中3),リハビリ3|iAMD, シャワー|
|7|説明(20, 測定(中3),リハビリ2|iAMD|
|8|説明(2), 測定(中3,外1), リハビリ2|iAMD|


## 日記履歴（週報＋日記）


入院週報一回目

https://qiita.com/kaizen_nagoya/items/95bd6f3d9471779b4654


# 文書履歴(document history)
ver. 0.01 初稿 20230316

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

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

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

Please press the like icon 💚　and follow me for your happy life.
[JavaScript] ReadableStream とその他の型の相互変換

`ReadableStream` とその他の型の間で変換を行いたいとき、`Blob` や `Response` を利用することで簡単にできる場合があります。

# 1. `ReadableStream` への変換

`Blob` は `Blob.prototype.stream` メソッドを使用することで `ReadableStream` へ変換できます。

文字列や `ArrayBuffer`、`TypedArray` (`Uint8Array` 等) は `Blob` を経由して `ReadableStream` へ変換できます。

```js:Blob を使う方法
// Blob -> ReadableStream
const readableStream = blob.stream();

// 文字列 -> Blob -> ReadableStream
const readableStream = new Blob([string]).stream();

// ArrayBuffer -> Blob -> ReadableStream
const readableStream = new Blob([arrayBuffer]).stream();

// TypedArray -> Blob -> ReadableStream
const readableStream = new Blob([typedArray]).stream();
```

参考「[Blob - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Blob)」
参考「[Blob() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Blob/Blob)」
参考「[Blob.stream() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Blob/stream)」

`Response` は `Response.prototype.body` プロパティにアクセスすることで `ReadableStream` を得られます。

文字列や `ArrayBuffer`、`TypedArray` (`Uint8Array` 等) は `Response` を経由して `ReadableStream` へ変換できます。

```js:Response を使う方法
// Response -> ReadableStream
const readableStream = response.body;

// 文字列 -> Response -> ReadableStream
const readableStream = new Response(string).body;

// ArrayBuffer -> Response -> ReadableStream
const readableStream = new Response(arrayBuffer).body;

// TypedArray -> Response -> ReadableStream
const readableStream = new Response(typedArray).body;
```

参考「[Response() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Response/Response)」
参考「[Response.body - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Response/body)」

# 2. `ReadableStream` からの変換

`Response` はコンストラクタに `ReadableStream` を渡すことでインスタンス化することができます。

文字列や `ArrayBuffer`、`Blob` は `Response` を経由して `ReadableStream` から変換できます。

```js:Response を使う方法
// ReadableStream -> Response
const response = new Response(readableStream);

// ReadableStream -> Response -> 文字列
const string = await new Response(readableStream).text();

// ReadableStream -> Response -> ArrayBuffer
const arrayBuffer = await new Response(readableStream).arrayBuffer();

// ReadableStream -> Response -> Blob
const blob = await new Response(readableStream).blob();
```

参考「[Response - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Response)」
参考「[Response() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Response/Response)」

`TypedArray` (`Uint8Array` 等) は `ArrayBuffer` から `TypedArray` コンストラクタを用いてインスタンス化して下さい。

```js:ArrayBuffer から TypedArray に変換する例
// ArrayBuffer -> Uint8Array
const uint8Array = new Uint8Array(arrayBuffer);
```

参考「[コンストラクター - TypedArray - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/TypedArray#%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%BC)」
AIにデザイナーをやってもらう〜ブランド・ロゴを作る〜StyleGAN-xlで画像生成

# デザイナーAIを育てよう

企業やブランドのロゴは、人々の心に訴えかける精緻なデザインが必要です。
AIに世の中のたくさんのロゴを学習させて、人々の心に訴えかけるデザイン性のある新しいロゴアイデアを作ってみましょう。


# ロゴデータを集める
まずは綺麗なロゴの画像をたくさん集めます。
今回は架空のロゴ画像を20000枚集めました。

# AIに学習させる

集めたロゴ画像をAIに学習させます。

# AIに画像生成してもらう

ロゴの特徴をうまく学んだAIは全く新しいロゴを生成できます。
![seed0085.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/24b7d476-0acb-d1a3-c072-158649abd64b.png)![seed1066.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/98190d56-5ec5-e0fc-d760-d8ae3c1c8a06.png)
![seed0459.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7498b28d-69e3-4eec-62a4-5ac451a94134.png)

今回は、データセットのばらつきのせいか、GPUの課金が足りなかったせいか、うまく学習できませんでした。。。

# 具体的なプログラミング

今回はStyleGANという画像生成モデルを使います。

https://github.com/autonomousvision/stylegan-xl

##### StyleGANのインストール


```shell
git clone https://github.com/autonomousvision/stylegan-xl.git
cd stylegan-xl
pip install dill
pip install ftfy
pip install timm==0.5.4
pip install Ninja
pip install setuptools==59.5.0
pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
```

##### データセットの準備

画像をたくさん集めてディレクトリに入れます。
データセット作成スクリプトを実行します。

```shell
python dataset_tool.py --source=path_to_images_dir --dest=images-256x256.zip --resolution=256x256
```

##### 学習

このスクリプトで学習を始められます。

```shell
python train.py --outdir=checkpoints --cfg=stylegan3-t --data=images-256x256.zip --gpus=1 --batch=64 --mirror=1 --snap 10 --batch-gpu 8 --kimg 10000 --syn_layers 10
```

##### 画像生成

学習したAIで画像を生成します。

```shell
python gen_images.py --outdir=out --trunc=0.7 --seeds=10-15 --batch-sz 1 \
  --network=network-snapshot.pkl
```

##### 動画生成

```shell
python gen_video.py --output=out.mp4 --trunc=0.7 --seeds=200-231 --grid=4x2 \
  --network=network-snapshot.pkl
```

![Mar-16-2023 17-01-10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/c27c7727-2da6-8eb6-bb92-34001f74f3db.gif)

今回は失敗しましたが、キャラクターなども生成できます。
<img src=https://user-images.githubusercontent.com/23278992/225556054-e58904f3-3a9f-4a8e-b5b6-f182a68fe86a.gif>

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

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

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

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

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
タスクバーを透明にする（win11最新）

# 最初に
みなさん、[`TranslucentTB`](https://github.com/TranslucentTB/TranslucentTB/issues/721)と、[`ExplorerPatcher`](https://github.com/valinet/ExplorerPatcher)を知っていますか？

互いに互換性を持っており同時に使えるフリーのソフトであり、
`TranslucentTB`はタスクバーを透明にするソフト、
`ExplorerPatcher`はwin11のタスクバーをwin10準拠にすることで、小さいタスクバーや左右にタスクバーを置くことを可能にするソフトです。
win11タスクバーを小さくすることもできるんですが、時間と日付表示がおかしくなるんですよね。
これらを使うと、wallpaperエンジンの壁紙がとても綺麗に映るんですよね。

# 雑事
`TranslucentTB`は低メモリ消費だし、`ExplorerPatcher`も基本レジストリ（設定みたいなとこ）を弄るものなので、軽いので常駐ソフトとして普段から使っていたのですが、2023/2/25日あたりにwindowsをupdateしたところ、explorerが延々再起動するようになり、私はタスクマネージャーをキーのショトカから起動し、コマンドプロンプトをタスクとして起動して、コマンドから原因と思われる`ExplorerPatcher`を削除したところ直り、その後、`TranslucentTB`が機能しなくなっていました。

`ExplorerPatcher`を使っていたがPCに詳しくない方は大丈夫だったのかな…？

恐らくタスクバーに破壊的な更新が来たんだろうなと思って今まで放置していたのですが、やはり透明がいいと思い、思い立って調べたところあっさり直りました。この後はその手順や詳細を説明します。

# 詳細
※ほとんど翻訳みたいなものですが
※間違いがあったら指摘してください。修正します。
Windows11 22621.1343 によってタスクバーに破壊的な更新が起こり、既存の物は使えなくなりました。
windowsには実は古いタスクバーの情報などが残っていて、それを利用するためのツールとして`ViveTool`があります。
今回はこれを利用して古いタスクバーに戻し、ソフトを復活させます。
新しいものに対応したものが望まれていますが、windowsは多くのエディションがあり、困難であるとされており、windowsが古いタスクバーの情報を失くしたときがこのソフトらの終わりだと思われます。

# 手順
※現在どちらのソフトも入っていない前提で話します。特に`ExplorerPatcher`は絶対入ってないと思います。
※Windows Insider build（早期アクセス）をしていた場合は知りません。
※失敗した場合の責任は取りません
1：下記のリンクをクリックしてマイクロソフトストアからTranslucentTBを入れます。

https://apps.microsoft.com/store/detail/9PF4KZ2VN4W9

windowsキーを何回か押したりして描画を更新します。
成功してもタスクバーがたまに透明になるという不安定な動作をするか、何の影響もないと思います。
もしこれで透明になった方は、2~3を飛ばして4の手順をした後、設定方法を下の方で簡単に紹介しているのでそれを読んで設定をして終了です。

2：管理者権限で`PowerShell`を起動します。
『追記』
バージョンが上がってたので、3を行う前に4でinstallしておいて下さい。ダメなら3をしましょう。余りヤバい部分は弄るべきでないです。

3：起動させた`Powershell`でコマンドを実行していきます。
`ViveTool`が入っていなければ（普通入ってない）次のコマンドで一時的に入れていい感じにやります。
※一行ずつ実行してください。
```powershell
iwr https://github.com/thebookisclosed/ViVe/releases/download/v0.3.2/ViVeTool-v0.3.2.zip -OutFile vive.zip
Expand-Archive vive.zip
./vive/vivetool.exe /enable /id:26008830
ri -Force -Recurse vive*.*
```

入ってれば
```powershell
vivetool /enable /id:26008830
```
だけです。

4：　
※ExplorerPatcherを用いてwin10に戻さないと透明化は機能しません。設定をいい感じにすれば機能するかもしれませんが

https://github.com/valinet/ExplorerPatcher/releases/latest

にアクセスし、`ep_setup.exe`というボタンをクリックしてインストーラーをダウンロードします。
その後ダブルクリックしてインストールしたあと、タスクバーをwin10に設定して終了です。

# 設定方法の紹介
## TranslucentTB
タスクバーの常駐部分にアイコンが出てくるので右クリックして設定します。

## ExplorerPatcher
タスクバーの何もないところを右クリックし、プロパティを押します。
すると設定画面が出ます。設定が終わったら左下の`Restart File Explorer`を押して反映させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890310/0a4a7777-2be6-c2c0-0e68-6a0a3bc518da.png)
ここでwin10に設定します。

# 参考
https://github.com/TranslucentTB/TranslucentTB/issues/537
Atom S3 用 M5 ENV-III の Arduino IDE 向けサンプルプログラムが動かない問題の解決

## M5 Atom S3 で ENV III を動かそう
　M5Stack 社の Atom S3 を購入した。手元に同社の温湿度気圧センサーである ENV III があったので、 Arduino IDE で表示させてみようとした。
同社の解説ページ（ https://docs.m5stack.com/en/unit/envIII ) の中の、Example 項にある「 [M5Unit-ENV III with M5AtomS3](https://github.com/m5stack/M5Unit-ENV/blob/master/examples/Unit_ENVIII_M5AtomS3/Unit_ENVIII_M5AtomS3.ino)」をクリックして表示されるソースを Arduino IDE にコピペして動かしてみたが、値がゼロだった。

### Arduino IDE の環境設定
　環境設定については、以下のサイトを参考にした。
　[Arduino IDE environment - ATOM S3](https://docs.m5stack.com/en/quick_start/atoms3/arduino)　←直リンク
上記のサイトにもありますが、追加のボード情報としてこのリンクを設定して、ボードの追加でできます。
```https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json```

### コンパイル・書き込みはできたが...
　Arduino IDE には、あらかじめ「M5AtomS3」ライブラリーを入れます。
コンパイル・　ボードへの書き込みはできたが、表示を見ると温度、湿度、気圧全てがゼロでした。ソースを見ると、センサーが読めない時にゼロで表示している。

### 試してみたこと
#### ピン番号などを指定してみた
　ピン配列を見ると、SDA: 2、　SCL: 1 ということなので、```Wire.begin();``` を ```Wire.begin(2,1,100000);``` にしてみたけど、結果は変わらず。
#### ENV III に問題がないか確認した
　UIFlow2 を使って、ENV III ユニットのブロックを追加して試してみたら、ちゃんとセンサーの値を表示できた。
![IMG_8765D.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/98540706-d1d4-bb95-3fe6-7c9a5ec1df2f.jpeg)


### 仕方なく、M5Stack 社のサポートに聞いてみた
　サポートからは、同じ部分を ```Wire.begin(2,1,100000UL);``` で試すようにとか、ピン番号を色々変えて試すとか、何回かやり取りがあったが、なかなか解決しなかった。

### やっと解決！
　やっと、ライブラリーに問題があったことがわかって、無事にセンサーからの情報が取れるようになった。
##### 解決方法
1. M5AtomS3 ライブラリーの最新版をインストール
1. 関連するライブラリーを全てインストールする
1. "SHT3X.cpp" を検索して開く
1. ソース中の ```Wire.begin()``` を ```Wire.begin(2,1,100000UL)```に書き換える
1. 変更したソースを保存
これでサンプルプログラムをコンパイルして書き込むと、ちゃんとセンサーから値を取ってきて表示できました！　ビンゴ！　（サンプルソースは ```Wire.begin();``` のままでOK）

### おまけ
　サンプルコードのままだと、文字が小さすぎるので、ちょっと修正した。
```M5.Lcd.setCursor(0, 5);``` ← 文字位置を少し下げる（上が欠けて見えないのを補正）
```M5.Lcd.setTextSize(2);``` ← 文字サイズを大きくするため追加
```M5.Lcd.printf("Temp: %2.1f  \nHumi: %2.0f%%  \nPressure:\n  %2.0fPa\r\n---", tmp,hum, pressure);``` ← 気圧が醜いので２行に分けた
これで、こんなふうに表示されます。
![IMG_8768D.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16491/2acb16ae-322a-a52b-2bd1-aaa5ff86796b.jpeg)

そのうちにライブラリーもアップデートされるでしょう。
プログラマの会話（１）プログラマ以外の人と

N(non programmer)
P(programmer)

<この項は書きかけです。順次追記します。>

N:ハリーポッター見てるんですか？ 
P:寝る前にハリーポッターを英語音声で見ると、睡眠薬がなくても寝れちゃう。　
最後まで見たことがない。 

N:意味がわからないからですか？ 
P:筋は知っているけど、半分聞き取れてないので、そのうち眠くなるのかも。 
仕事でも英語を使うことのほうが多いけど、半分わかれば困らない。 
N:半分わかれば会話はできますよね。　
お仕事は何をされているんですか。 

P:Programmerです。　

N:私機械にがてなんで。 

P:私人間苦手なんで、機械には通じるのが得意。

N:プログラムって英語使うんですよね。 
P:プログラムって英単語だけなので。
プログラムは全部わからなくても動く。　
プログラムを解釈してくれるプログラムが動けばいいので。　

# 参考資料　
@kazuo_reve 新人の方によく展開している有益な情報
https://qiita.com/kazuo_reve/items/d1a3f0ee48e24bba38f1

私が効果を確認した「小川メソッド」
https://qiita.com/kazuo_reve/items/a3ea1d9171deeccc04da

## 自己参照　
アメリカ留学、アメリカ就職の代わりに行ったこと。行なっていること。英語(33)
仮説(111) 
https://qiita.com/kaizen_nagoya/items/9f8e791bd6be3bed34bb

プログラマが英語で報告・質問する時のいくつかの事例・方法 英語(8)仮説(97)
https://qiita.com/kaizen_nagoya/items/9cf2ba858e52e9795b67

外国語話者への英語について。英語(26)
https://qiita.com/kaizen_nagoya/items/b97677b0c0947e4f009f

英語での会合に備えてすること。英語(6)
https://qiita.com/kaizen_nagoya/items/f88cb0cd3445ea979162

アセンブラへの道
https://qiita.com/kaizen_nagoya/items/46f2333c2647b0e692b2

プログラミング言語教育のXYZ。 仮説（52）
https://qiita.com/kaizen_nagoya/items/1950c5810fb5c0b07be4

コンパイラを書くのは難しいか。仮説（175）
https://qiita.com/kaizen_nagoya/items/a87c65d487bc7a67da11

心理学の本を読むよりはコンパイラ書いた方がよくね　仮説（34）
https://qiita.com/kaizen_nagoya/items/fa715732cc148e48880e

プログラマにとって、何か知っている必要なことは何もない。仮説（39）
https://qiita.com/kaizen_nagoya/items/30daf9836702bdefaf7d

文法派　対　写経派　CN3054を題材に
https://qiita.com/kaizen_nagoya/items/445ebc1939f0034ee038

初めての　CEDD(Compile Error Driven Design) ８回直してコンパイル。
https://qiita.com/kaizen_nagoya/items/9494236aa1753f3fd1e1

C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識
https://qiita.com/kaizen_nagoya/items/d89a48c1536a02ecdec9

小川メソッド　覚え（書きかけ）
https://qiita.com/kaizen_nagoya/items/3593d72eca551742df68

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

# Reference
Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
# 文書履歴(document history)
ver. 0.01 初稿 　20230316
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Flutterのflutter_local_notificationsで通知が表示できない

以下のリンクのコードを実行しましたが、Android(API 33)、iOSの両方で動きませんでした。

# 解決方法

## iOS
`ios/Runner/AppDelegate.swift`を以下のように修正
```ios/Runner/AppDelegate.swift
import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    if #available(iOS 10.0, *) {
      UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
    }
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

```

## Androidの解決方法

`android/app/build.gradle`のdependenciesに以下のコードを追加

```android/app/build.gradle
dependencies {
  ...省略
  implementation 'androidx.window:window:1.0.0'
  implementation 'androidx.window:window-java:1.0.0'
}
```

また、main.dartで`import 'dart:io'`を行い、_requestPermissions()を以下のように修正

```main.dart
Future<void> _requestPermissions() async {
  if (Platform.isIOS) {
    await _flutterLocalNotificationsPlugin
    .resolvePlatformSpecificImplementation<
        IOSFlutterLocalNotificationsPlugin>()
    ?.requestPermissions(
      alert: true,
      badge: true,
      sound: true,
    );
  }
  if (Platform.isAndroid) {
    FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
      FlutterLocalNotificationsPlugin();
    await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<
        AndroidFlutterLocalNotificationsPlugin>()?.requestPermission();
  }
}
```