OmniAICreator/Qiita-1.07M huggingface dataset:
簡素な非同期排他処理の比較（クリティカルセクションの簡易自作/SyncLockの代用）

きちんとまとめようとしてたらいつまでも投稿できないことに気が付いた。Done is better than perfectということで、15分ググって出てこない内容は自分でまとめて公有財産にしておこう...

# 前提条件
OS:windows10
IDE:VS2019, VB.Net framework v4.7.2
目的:ローカルで動作するアプリケーション中での非同期制御
（裏で通信しつつ、UI操作しつつ、処理実行）

# 概要
### ググった結果
vb.netの排他制御のための方法はいくつかある。
目立つところの情報をまとめ、比較実験（C#だが）をやっていただいている良記事をみて満足していた。
https://qiita.com/tadokoro/items/28b3623a5ec58517d431

一番早いのはInterlocked(.Increment)、時点でSyncLockということになる。
そこまでパフォーマンスが致命的ではないし、1変数いじって終わりの超簡単な内容をやるわけではない（例えば特定データをtcpClientで送信する際にデータをブロックしておくなどをしたい）し、単純なクリティカルセクションに入るSyncLockで十分だろう...と思っていた。（Interlockedはいわゆるアトミック操作だが、初見だとExchangeあたりが面食らう）

### SyncLockの問題点
使ってみればじきにわかる（というか当たり前）なのだが、
~~~Visual Basic
SyncLock LockObj
    'ここで排他処理
End SyncLock
~~~
このパターン、Do whileやTry Catchをまたぐことはできないのだ。
当然Awaitも使えない。
これは困る。
**例外による分岐処理や、応答待ちができない**のだ。

### InterLockedを使う
残念ながら出典を見つけられないが、どこかのサイトに「だからInterlockedが作られた」とあった。
Interlocked.CompareExchangeを使えば、値の確認をスレッドセーフに行える。例えば
~~~Visual Basic
Do Until timeout
    If lockObj = False Then
        lockObj = True
        Exit Do
    End If
Loop

'ここで排他処理

lockObj = False
~~~
みたいなことをしたいとして（このままでは同時アクセスが起きた時に事故る）、
~~~Visual Basic
import system.Threading

Do Until timeout
    If False = Interlocked.CompareExchange(lockObj, True, False) Then
        Exit Do
    End If
Loop

'ここで排他処理

Interlocked.Exchange(lockObj, False) 
~~~
とすればスレッドセーフにできる（はず）なのだ。
そしてこれはブロックフリー（今考えた造語）=Try CatchやAwaitを自由に使うことができる。

:::note warn
もちろん、例外時に解放しないとデッドロックする。これはユーザーの責任
:::


# さて、パフォーマンスはどうだろう。


 \*ここに実験結果を貼る\*

実験環境と投稿環境が違うのと、ちゃんと条件整理して実験できていないのでデータを貼れない。
やってみた感じ、さすがに**SyncLockよりも遅い。大体3倍くらいの時間がかかる**（気がする）
しかも、複数スレッドで回そうとするとInterlockedで書いたやつが（うまく動作せずに？）一瞬で終了するときがある。3倍かかるはずなのに。この辺、精査しないと使えないな...　（たぶん実験のために適当に書いたコードがいけない。厳密に同時に複数スレッド・タスクたてて処理並列でやらせて処理時間比較するには...？）
まあ当然だろうな。
元記事ではInterlocked.Increment *vs* SyncLockをやって4倍差の結果。
こちらではInterlocked.CompareExchange+Exchange *vs* SyncLockをやって2.5-3倍差の結果。

CompareExchange+Exchange (+if判定、DoLoop抜け） = 12*Increment

ということだ。


追記
その後もう少し弄っていて、そもそもこのInterlockedの使い方が**意図したとおりに動作していない**
ことが判明した。具体的にはスレッドセーフにならなかった。えっ...　ちょっとコード読んだだけではなぜなのかわかりません。
うーん、コンパイラが勝手に短絡評価してるんだろうか...　volatileが必要と思われる（震え声）
あまりms learnにあまり説明がないmemorybarrierなるものも試してみたが、何の効果もないおまじないだった。あれなんなんですか。実装を知ってる人しかわかりそうにない。

結局のところsemaphore(Slim)を使うしかないというのが結論。記法的にはこれで十分ですな。


記事は以上。
Qiitaでたくさん”いいね”をいただいた要因

# はじめに
質問をいただいたので、Qiitaでたくさん”いいね”をいただいた要因として考えられることを整理しておく。

# 実績
以下の記事で、たくさん”いいね（goods）”をいただいた。

https://qiita.com/kazuo_reve/items/d1a3f0ee48e24bba38f1

2023/7/20現在の実績データ
　views：158803
　goods：2499
　stock：3127

# Qiitaでたくさん”いいね”をいただいた要因（仮説）
## 評価がされる確率が高い記事を書いた。
 あたりまえですが、まずは、評価がされる確率が高い記事を書く必要があります。
 評価がされる確率が高い記事を見つけるためのメトリクスとして、1goodsあたりに必要とするvies数（views/goods）が有効かもしれません。
 1goodsあたりに必要とするvies数（views/goods）が小さい記事があれば、その記事のviewsを伸ばしていけば、自然とgoodsも伸びることになるかと思います。
 views/goodsの詳細な説明は、@kaizen_nagoyaさんの以下の記事参照。

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

## 評価が高い記事を参照させていただいた。
 有益な情報の「まとめ記事」は、需要がある気がする。
 論文の執筆時で、「巨人の肩に乗る」という言葉があります。技術記事についても、似たようなことが言えるかもしれません。

## Qiitaユーザーの多くの方に関連する記事を書いた。
 自分にとって有益だった情報を展開した「まとめ記事」を複数書いたが、対象としている情報を必要としているQiitaユーザーの方が少ない場合には、viewsが伸びず、goodsも伸びない。

 以下の記事などで、いいねが多い記事を確認すると、多くのQiitaユーザーが必要としている情報が把握できるかもしれません。

https://qiita.com/Qiita/items/75a34af032d898a86679#%E3%81%84%E3%81%84%E3%81%AD%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0

## Qiitaのトレンドに上がる。
 Qiitaには最近注目されている人気記事の一覧を表示するビューがあります。毎日5時/17時に更新されます。
 ここに掲載されると、掲載される前に比べて、viewsが一気に伸びます。そして、トレンド記事から外れると、viewsが伸びが停滞します。

 https://qiita.com/trend

 Qiitaのトレンド表示機能についての考察が以下の記事で示していただいている。

 https://qiita.com/PINTO/items/15c7d0d5249934a042ab

## 影響力のあるかたに記事を展開していただいた。
 twitterなどでフォロワーが多いかたに記事を展開していただいた。
 また、Qiitaの公式twitterで紹介していただく。goodsが節目の件数（50件や100件）になると、公式twitterで記事が紹介される。
　https://twitter.com/Qiita?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor

# 関連記事
https://qiita.com/kazuo_reve/items/368cb7960a802fdfada9
Circle CIでRerun job with SSHしたときにSSH接続できないときの対処法


# 確認すること


- githubやbitbucketの鍵認証情報をCircle CIと共有できているかのか確認しましょう
    - 確認方法
        - https://circleci.com/docs/ja/ssh-access-jobs/#ensure-authentication-with-githubbitbucket



## 鍵の登録ができていなかった場合は再度「Rerun job with SSH」が必要


Rerun job with SSH
↓
githubやbitbucketの鍵認証情報をCircle CIに共有できておらずSSH接続できない
↓
githubやbitbucketで鍵の登録を行う
↓
再度「Rerun job with SSH」を行う。
そうすると更新したおそらく公開鍵情報をもった環境を作ってくれる。
↓
SSH接続が成功

# 参考

- https://circleci.com/docs/ja/ssh-access-jobs/
【SwiftUI】Pinterestの起動アニメーションを再現する

# はじめに
Pinterestを起動すると、最初にロゴが楽しげに動くアニメーションが表示されます。
今回は、このアニメーションを再現します。

# デモ

https://twitter.com/shota_appdev/status/1682010082362687488?s=61&t=C9sUS2E3iBOBSWIP22ut7Q

# 型を定義
まず、Viewがある状態に変化するまでにかかる時間、ある状態でのサイズと位置をまとめた`AnimationStep`を定義します。

```swift
struct AnimationStep {
    let duration: Double // アニメーションの継続時間
    let diameter: CGFloat // ロゴの直径
    let yOffset: CGFloat // y軸方向のオフセット
    
    init(
        duration: Double,
        diameter: CGFloat = 100,
        yOffset: CGFloat = 0
    ) {
        self.duration = duration
        self.diameter = diameter
        self.yOffset = yOffset
    }
}
```

# アニメーションを配列で定義
次に、全体のアニメーションを配列で定義します。
`animationSteps`プロパティに注目して下さい。
最初に少し小さくなって、大きくなって、元のサイズに戻るアニメーションがあり、
その後少し下に移動して、今度は上に消えていくアニメーションがあります。

```swift
import SwiftUI

struct ContentView: View {
    @State private var diameter: CGFloat = 100
    @State private var yOffset: CGFloat = 0
    
    private let animationSteps: [AnimationStep] = [
        AnimationStep(duration: 0.1, diameter: 80),
        AnimationStep(duration: 0.2, diameter: 120),
        AnimationStep(duration: 0.1, diameter: 100),
        AnimationStep(duration: 0.3, yOffset: 150),
        AnimationStep(duration: 0.6, yOffset: -600),
    ]
    
    var body: some View {
        Image(systemName: "pencil.circle.fill")
            .resizable()
            .foregroundStyle(.red)
            .frame(width: diameter, height: diameter)
            .offset(y: yOffset)
    }
}
```

# アニメーションを再生する
最後に、作ったアニメーションを再生します。

`onAppear`内の処理に注目して下さい。

`animationSteps.enumerated()`で取得した`animationSteps`のインデックスと要素をfor文で回しています。

`withAnimation`で指定しているアニメーションは、`step`の`duration`分継続し、それまでの`step`の`duration`の合計分遅延させています。

こうすることにより、`step`のアニメーションが終わってから次の`step`のアニメーションが始まるようになります。

```swift
struct ContentView: View {
    @State private var diameter: CGFloat = 100
    @State private var yOffset: CGFloat = 0
    
    private let animationSteps: [AnimationStep] = [
        AnimationStep(duration: 0.1, diameter: 80),
        AnimationStep(duration: 0.2, diameter: 120),
        AnimationStep(duration: 0.1, diameter: 100),
        AnimationStep(duration: 0.3, yOffset: 150),
        AnimationStep(duration: 0.6, yOffset: -600),
    ]
    
    var body: some View {
        Image(systemName: "pencil.circle.fill")
            .resizable()
            .foregroundStyle(.red)
            .frame(width: diameter, height: diameter)
            .offset(y: yOffset)
            .onAppear {
                for (index, step) in animationSteps.enumerated() {
                    withAnimation(
                        .easeInOut(duration: step.duration)
                        .delay(index > 0 ? animationSteps[0..<index].reduce(0) { $0 + $1.duration } : 0)
                    ) {
                        diameter = step.diameter
                        yOffset = step.yOffset
                    }
                }
            }
    }
}
```

# おわりに
今回は、理解しやすいプログラムと複雑なアニメーションを両立させることができました。この記事が参考になったという方は、いいねとフォローよろしくお願いします☺️
NFTについて（将来展望と進化）

# NFT市場の成長と将来の見通し
NFT市場は急速に成長しており、将来的にもさらなる発展が期待されています。
アーティストやクリエイターは、NFTを通じて新たな収益源を見いだし、ファンとの関係を構築することができることになります。
将来的には、NFT市場はより多様化し、さまざまな業界での活用が進むと予想されています。

**●具体例**
*・メタバースにおけるNFTの活用*
メタバースとは、インターネット上で提供されるもうひとつの世界（仮想空間）のことを指します。
その中で、ユーザはNFTを使用し土地を購入し、誰かに貸したりすることで、新たな経済圏が生まれる

*・プラットフォーム間をまたいだデータの移動*
これまでのプラットフォームは、プラットフォーム間の所有物の移動は基本的にできませんでした。NFTを使えば正確な取引記録を持ったままプラットフォーム間の移動が可能になります。
今後は、複数のプラットフォーム間を移動できるNFTの普及が見込まれます。



# NFTに関する技術的な進化や改善の可能性:
NFTの技術的な進化と改善は現在進行中で、まだまだいくつかの課題や制約が存在するため、以下のような進化や改善が予想されています。

**1. スケーラビリティの向上** 
NFTの需要が増えるにつれて、ブロックチェーン上でのトランザクションの処理能力が問題となる場合があります。スケーラビリティの向上により、大量のNFTの発行やトランザクションの高速化が実現されることが期待されています。

**2. エネルギー効率の改善**
現在のブロックチェーン技術にはエネルギー消費の問題がありますが、エネルギー効率を改善する取り組みが進められています。エコフレンドリーなブロックチェーンの開発により、エネルギー消費の削減が期待されます。

**3. 異なるブロックチェーン間の相互運用性の改善**
現在、NFTは主にEthereumブロックチェーン上で発行されていますが、異なるブロックチェーン間の相互運用性の改善が進められています。これにより、複数のブロックチェーン上でNFTが発行され、トークンの移動やトレードが容易になることが期待されます。

**4. ユーザーエクスペリエンスの向上**
NFTの普及に伴い、一般のユーザーが簡単にNFTを作成、取引、保管できるツールやプラットフォームの開発が進むと予想されます。これにより、NFTの利用がより一般的になり、普及が促進されるでしょう。

# DAO（分散自治組織）の発展とNFTとの関連性
DAOは分散型自治組織の略であり、ブロックチェーン上で運営される組織形態です。NFTエコシステムでは、アーティストやコレクターがDAOを形成し、ガバナンスや収益の共有を行うことがあります。

将来的には、NFTを活用したDAOの発展が期待されています。アーティストやコレクターが自身の作品やコレクションをNFTとして発行し、DAOに参加することで、より公平な収益配分や意思決定に参加できる環境が構築されるでしょう。

また、DAOはアーティストとファンの間により直接的なつながりを作り出すことができ、コミュニティの形成や相互作用を促進する役割も果たします。

# まとめ
以上が、NFTについての将来の展望や技術的な進化についてでした。
これまで、NFTに関する記事を書いてきましたが、今回で一旦最後です。
記事を読んでNFTについて少しでもイメージがついたり、興味が沸いていただけていたら嬉しいです。
最後まで読んでいただきありがとうございました！！
便利な便利な正規表現

# Overview
- 正規表現のトレーニング用。
- 言語問わずに色々使えそうな正規表現をマスターしたい。
- 毎日１つずつ追加してみるよ。

＃ Get started!
## メアドの＠より前を取得
### pattern
```
/[a-zA-Z0-9]+@/g
```
### 対象文字列
```
test1@example.com
test2@example.com
test3@example.com
test4@example.com
test5@example.com
```
### マッチ結果
```
0	test1@	
18	test2@	
36	test3@	
54	test4@	
72	test5@
```

## メアド判定
### pattern
```
^([a-z0-9_\-\.]+)@([a-z0-9_\-\.]+\.[a-z0-9]{2,})$

// 分解
^ -> 文頭
([a-z0-9_\-\.]+)　-> 半角英数,_,-
@
([a-z0-9_\-\.]
+\.
[a-z0-9]
{2,})
$
```
### 対象文字列
```
hoge@example.com
foo-bar@@example.com
foo_bar@example.com
foo-bar@example.com
foo-bar@example_com
foo#bar@example.com
```
### マッチ結果
```
hoge@example.com
foo_bar@example.com
foo-bar@example.com

```
ツールチップアクティビティを触ってみた

## はじめに
①本記事は、2023年7月開催の「UiPathブログ 発信チャレンジサマー」の21日目のブログです。
ブログの詳細、参加方法については以下のブログを参照ください。

https://note.com/shumpei_w/n/nd082bdf28853

②このブログ情報は、2023/7時点の情報です。
③UiPathはCommunity Edition、Versionは2023.6.1を使用しています。


## たまには...ね
これまでモダンアクティビティ(Excel)の記事を書いてきましたが、そろそろ皆さんも飽きてきた？頃だと思うので今回はExcel以外のアクティビティをピックアップできたらと思います。


## ツールチップ(Call Out)アクティビティとは
「ツールチップ」アクティビティは、公式情報によると「タイトルとテキストのあるポップアップを、一定時間のあいだ、指定した UI 要素に表示」とあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/32762d9d-6863-ae65-3c6e-4b52d726ab34.png)
公式ドキュメントはこちら↓

https://docs.uipath.com/ja/activities/other/latest/ui-automation/callout

これはどういうことかというと、指定したセレクタに対してポップアップを表示してくれるということですかね。
モノは試すのが一番なので使ってみましょう。


## 使ってみた
実は最近、Obsidianというツールに興味を持ちインストールまでしてみました。
(よくわかっていない+まだあんまり使えていない)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/a8ec91e6-588f-bc03-2681-9b3abca011b0.png)

デスクトップ上にアイコンがあるので、これを指定して、ツールチップアクティビティで表示してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/efe8d6bd-6a19-5288-8650-6234c66641d1.png)
プロパティは以下の通りです。(必要そうなものを紹介します)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/e8a9adb3-d1a3-6af3-f8ca-f489656bf661.png)
【入力】
コンテンツ：ポップアップ内に表示する内容を表示します
【ターゲット】
セレクター：対象の要素を指定します
準備完了まで待機：None,Interactive,Completeのいずれかを選択
タイトル：ポップアップ内のタイトルを表示します
※コンテンツとタイトルの関係は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/a2284468-a24d-bd99-7f14-d9c5659abdda.png)

【オプション】
タイマー：ポップアップを表示してから閉じるまでの時間を記載します。
既定は設定なし(自分で閉じる必要あり)です。
なお注意点ですが、こちらは<b>ミリ秒</b>で書く必要があります。(Int型しか表記がないのでややこしいです)
なので、例えば3秒=3000ms秒なので、"3000"と書きます。


実行してみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/f4aba6a4-6ac6-7a74-5e75-44379a740e62.png)
出ましたね！

さて、この実行回ではタイマー設定がないので「OK」を押して閉じる必要があります。「OK」を押してロボットは実行終了です。

## タイマーがある場合
ではタイマーを5秒=5000msで設定してみるとどうなるでしょう？:grinning:
![ツールチップ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/45d75ef3-9473-eaef-53a9-9c73e0541491.gif)

おお、5秒後に消えました！

## 使ってみた感想+まとめ
このアクティビティ、最近存在を知ったのですが実は何年も前からいるアクティビティなんですね。
実践向けというより、動作検証やデバッグ時に使うことが多そうです。
「ここだよ」という感じでセレクタの検証・確認に使えそうだということがわかりましたので、検証時に使ってみようと思います。
皆さんもどこかの機会に使用してみてはいかがでしょうか。

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

## 参考URL

https://docs.uipath.com/ja/activities/other/latest/ui-automation/callout

https://ms-rpa.jp/tips/uipath-robotalert/

https://qiita.com/vicugna-pacos/items/8e2a3d7281e6efa06a23
冷蔵庫をIoT

冷蔵庫が熱くなるので、裏面の3cmくらいのところにセンサーを置いて、蟹さんのmruby on YABMでThingspeakに送ってグラフにしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/d5570b56-9ebc-1b37-9823-e4e30064402a.png)

夕食の時間は、食材の出し入れがあったので、高くなっています。

23時くらいにちょっと上がっているのは、スーパーで処分品を買ってきて冷蔵庫に入れたためです。

室温+2,3度くらいを行き来するようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/09889b3f-574f-8198-7b2f-07b819cec2d8.png)

室温はこんな感じです。

![filename(33).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/746d28ec-d896-4e19-5ed4-c0b6e7423b4e.png)

この日はちょっと気温が下がったので、気温が高くなるとその分が乗っかるのだと思われます。

これは25年くらい使ってる今はもう売ってないSANYOの冷蔵庫で、我が家の消費電力の半分くらいを使ってしまっているのですが、こわれるまで使うつもりです。

我が家はエアコンは使わないので、こんなもんかもしれませんね。

冷蔵庫のドアの開閉をスイッチなど取得して記録できるようにするのもいいかもしれませんね。
1 < a^n < b^n  ⇒ 1 < a < b  の証明

$1 < a^n < b^n  ⇒ 1 < a < b$  の証明

$a^n < b^n  \Rightarrow  \left( \frac{a}{a} \right)^n = 1 < \left( \frac{b}{a} \right)^n$

$1 < a^{1/n} < b^{1/n}$ ならば　$1 < a^{\frac{1}{n+1}} < b^{\frac{1}{n+1}}$ が言えればよい。

$1 < a^{1/n} < b^{1/n}\Rightarrow a^{1/n}a^{\frac{n-1}{n}} < b^{1/n}a^{\frac{n-1}{n}} <  b^{1/n}a^{\frac{n-1}{n}}\frac{b^\frac{n-1}{n}}{a^\frac{n-1}{n}} = b^{1/n}a^{\frac{n-1}{n}}\{\frac{b}{a}^\frac{n-1}{n}}$


$b^{\frac{n+1}{n}}\left( b^{\frac{1}{n+1}} - a^{\frac{1}{n+1}}\right) =  b^{\frac{1}{n}}-bb^{\frac{1}{n}}a^{\frac{1}{n+1}} < b^{\frac{1}{n}}-a^{\frac{1}{n}}$ 　⇒　ダメ？

$b^{\frac{n+1}{n}}\left( b^{\frac{1}{n+1}} - a^{\frac{1}{n+1}}\right) =  b^{\frac{1}{n}}-bb^{\frac{1}{n}}a^{\frac{1}{n+1}} > a^{\frac{n+1}{n}}\left( b^{\frac{1}{n+1}} - a^{\frac{1}{n+1}}\right) =  aa^{\frac{1}{n}}b^{\frac{1}{n+1}}-a^{\frac{1}{n}}$　⇒　ダメ？

$a^{1/n} < b^{1/n}$　なので、 $a^{\frac{n}{n+1}}a^{1/n} < a^{\frac{n}{n+1}}
b^{1/n}$


 b^{\frac{1}{n}}-a^{\frac{1}{n}}$
Variable fonts と CSS animation の組み合わせ

## この記事の概要

テキストをパスや画像にせず、テキスト情報を保ったままアニメーションをつけたいと思う場面があり、 `font-variation-settings` を使ったら上手くいきました。

備忘録がてら記事にします。

## 完成品

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="XWyYBVP" data-user="xrxoxcxox" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/xrxoxcxox/pen/XWyYBVP">
  Untitled</a> by Keisuke Watanuki (<a href="https://codepen.io/xrxoxcxox">@xrxoxcxox</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## 仕組み

Variable fonts には font-family ごとに可変の軸が定められています。
一番ポピュラーなのは weight だと思いますが、それ以外にも optical size や ascender や descender の値など、フォントによって色々と用意されています。

これらの軸を CSS の `font-variation-settings` というプロパティで制御することができます。

```css:font-variation-settings の構文
font-variation-settings: normal; /* デフォルト */
font-variation-settings: "wght" 700; /* "axes 名" 数値 */
font-variation-settings: "wght" 700, "opsz" 144; /* カンマ区切りで複数指定可能 */
```

あとは通常の CSS animation と同様に keyframe を定義して指定するだけです。

## 現実的な使い方

Google fonts には [variable fonts 一覧のページ](https://fonts.google.com/variablefonts#font-families)があり、それぞれのフォントで変更できる axes やその step が一覧になっています。
どのフォントにどの axes があって、どの範囲で変化させられるかを調べるのはそれなりに時間がかかるので、このページを見ながらだとフォントを選びやすいと思います。

今回は axes が多い [Fraunces というフォント](https://fonts.google.com/specimen/Fraunces)を選びました。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/6242cd62-16e7-85fb-5e7c-d4aa3080e875.png)

注意として、min が 0、max が 1、step が 1 のような axes はアニメーションさせられません。
例えば `ital` はイタリック体であるかそうでないかの boolean なので、徐々に傾き度合いを変えられません。[^italic]

[^italic]: もしかしたら step が細かく定義されているフォントもあるかもしれませんが、ざっと見た限り見つけられなかったのでこういった記載をしています。

Google fonts ではフォントの詳細ページから `link` のコードを取得できます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/aaa7f53f-c41a-4f5f-054e-165d96958e21.png)

こちらの内容を以下のように書き換えます。

```diff_html
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
- <link href="https://fonts.googleapis.com/css2?family=Fraunces&display=swap" rel="stylesheet">
+ <link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght,SOFT@9..144,100..900,0..100&display=swap" rel="stylesheet">
```

今回はアニメーション可能な axes が `opsz`, `wght`, `SOFT` の 3 つだったので、それらを対象にコードを変えています。
フォントによっても axes や、その値・レンジが変わることに注意してください。

## 最後に

パスのアニメーションとか、そもそも動画を埋め込むとかした方が自由度は高いのは間違いないです。
ただ、アクセシビリティが低くなったり[^accessibility]、編集が大変になったり、デメリットもあります。

[^accessibility]: あくまで「意識的に対応しないと低くなる」という意味です。代替テキストや `aria-labelledby` などをちゃんと付与すれば問題ありません。

実現したいアニメーションがそこまで複雑ではない場合、こういった方法も検討して良いかもしれません。[^speed]

[^speed]: ただし可変するフォントなので、通常のフォントの数ウェイト分の容量があります。使わない axes は指定しないとか、unicode-range を指定するとか、スピードを落とさないための考慮が別途必要になるとも言えます。

---

最後まで読んでくださってありがとうございます！
[Twitter](https://twitter.com/xrxoxcxox)でも情報を発信しているので、良かったらフォローお願いします！

[Devトーク](https://jobs.qiita.com/employers/qiita-inc/dev_talks/489)でお話してくださる方も募集中です！
Javaの演算子について学習してみた

# 概要
Javaの演算子について学習をしてみました。以下のページを参考にしました。

演算子

https://www.javadrive.jp/start/ope/

算術演算子

https://www.javadrive.jp/start/ope/index1.html

単項マイナス演算子

https://www.javadrive.jp/start/ope/index2.html

演算子の優先順位と結合規則

https://www.javadrive.jp/start/ope/index4.html

インクリメント演算子とデクリメント演算子

https://www.javadrive.jp/start/ope/index6.html

ビット演算子とシフト演算子

https://www.javadrive.jp/start/ope/index8.html

代入演算子

https://www.javadrive.jp/start/ope/index10.html

関係演算子と等価演算子

https://www.javadrive.jp/start/ope/index11.html

論理演算子

https://www.javadrive.jp/start/ope/index12.html

条件演算子(三項演算子)

https://www.javadrive.jp/start/ope/index13.html

文字列の連結(+演算子)

https://www.javadrive.jp/start/ope/index14.html

# まとめ
何かの役に立てばと。
Stable Diffusion Web UIの実行で発生したエラーとその解決方法

皆さんこんにちは。今回は、私が[Stable Diffusion Web UI](https://github.com/AUTOMATIC1111/stable-diffusion-webui)を初めて実行しようとした際に発生したエラーと、その解決方法についてお話ししたいと思います。

※エラー解決が主な目的なのでインストール方法を詳しくみたい方は参考サイトを読んでください。

参考にしたサイト
[Stable Diffusion Web UIのインストール(動画)](https://www.youtube.com/watch?v=cxbpDClKjtU)
[Stable Diffusion Web UIのインストール(メモ)](https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqa0FfbkVib0x4ZmdhVmlZV09qajVfZjhvSTBuUXxBQ3Jtc0tucHlKWk1XTjdjWHIzaVlxNzFRQkZ1MElfb1VlZ1FHNjcwY2lJS2FvaklXWGFyU3ZIZGRwRWRDc0Y0WGtHWThGZWJIT1YtMmZ2NG1JdEd5MTJzVlU2RUNNRG1kUGtVbE44RXI0MDJfZG43MW5lZGJfVQ&q=https%3A%2F%2Fdocs.google.com%2Fdocument%2Fd%2F11L1NNDjjxEHDWEzpgEOj56fZjhdm28qIRWcfH1-zZ8k%2Fedit&v=cxbpDClKjtU)
[pyenvを使ったPythonのバージョン切り替え](https://original-game.com/python_course/install/mac-homebrew-pyenv/)

## エラーの発生

初めに、以下の手順に従ってStable Diffusion Web UIを設定しようとしました：

1. **Homebrewをインストール**
2. **必要な依存関係をインストール**
```zsh
brew install cmake protobuf rust python@3.10 git wget
```
3\. **Stable Diffusion web UIをクローン**
```zsh
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
```
4\. **学習済みモデルを下記のパスに格納**
```zsh
stable-diffusion-webui/models/Stable-diffusion
```
5\. **ディレクトリの移動、Stable Diffusion Web UIを起動**
```zsh
cd stable-diffusion-webui
./webui.sh
```
しかしながら、以下のエラーが出てしまいました：
```zsh
 note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed cleaning build dir for gfpgan
ERROR: Could not build wheels for gfpgan, which is required to install pyproject.toml-based projects
```
エラーメッセージによると、gfpgan のインストールがうまく行かないようです。

## エラーの解決
エラーの解決方法として、Pythonのバージョンを3.10.4から3.10.6に変更しました。以下に、Pythonのバージョンをアップグレードするためのコマンドを示します：
```zsh
pyenv install 3.10.6
pyenv global 3.10.6
```
その後、pythonのバージョンを確認して
```zsh
python -V
Python 3.10.6
```
Pythonのバージョンが正しく変更されたことが確認できました。しかし、再度 ./webui.sh を実行したところ、バージョンが変更されていませんでした：
```zsh
Python 3.10.4 (main, Jun  6 2022, 21:10:44) [Clang 13.1.6 (clang-1316.0.21.2.5)]
```
実行スクリプトが新しく設定したPythonバージョンを認識していないため、エラーが発生しています。以下のコマンドを使用してPython仮想環境を削除しました：

**Python仮想環境を削除**
```zsh
rm -rf venv
```
その後、再度 ./webui.sh を実行したところ、無事に gfpgan がインストールされ、Stable Diffusion Web UIが正常に動作しました。

このエラーの原因は、Pythonのバージョン3.10.4と gfpgan の互換性の問題であったと考えられます。したがって、Pythonのバージョンを3.10.6にアップグレードすることで、この問題を解決することができました。

**pyenv**を使うことでPythonのパッチバージョンも簡単に変更できます。

それでは、皆さんも無事にStable Diffusion Web UIの設定を行うことができることを願っています。何か問題が発生した場合は、お気軽にコメントください。
AWS MGN テストインスタンス/カットオーバーインスタンスの起動に失敗！？

# 僕の近況 (だれも聞いていない)


初投稿から少し空いてしまいました。~~コンニャクン~~しゅうペーです。
※改名しました。
最近一段と暑くなってきましたね...
出不精の僕ですが、クーラー代節約のためにちょこちょこ出社しています。(行くまでは暑いけど仕方ない...)

今はAWS資格の[AWS Certified Security - Specialty](https://aws.amazon.com/jp/certification/certified-security-specialty/)を目指して勉強中、、、のはずですが、Veeam V12やvCenter Converter Standaloneの検証をやったりなど、全然手についていません（笑）
今は受験料半額セールをやっているのでこれを機に取得してみます！

# 今回の経緯
最近の業務の中で、[AWS MGN(Application Migration Service)](https://aws.amazon.com/jp/application-migration-service/)を使って、オンプレのvSphere環境にある仮想マシンをAWSに移行するといった作業を実施しました。(プロジェクトは現在も進行中です)

その中で、「なんだこれ...」と詰まってしまったことがあったので、記事にしようと思い立ちました。

AWS MGNとは、様々な環境の仮想マシンをAWSに移行する際に、ほぼ手作業がなくデータレプリケーションの実行、AWS EC2への変換を実行し、さらに動作テスト機能まで備えた優れモノです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/e745d781-abeb-6baf-dd02-2f5328177c60.png)


# テストインスタンス/カットオーバーインスタンスの失敗
僕自身もWindowsやLinuxの移行をMGNで何台も実施してきたので、いつもどおりにカットオーバーインスタンスを作成しようとしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/922045a3-219e-0faf-77f1-7a50100afd81.png)

さて、カットオーバーのジョブIDを押して、いつものように10分くらいしたらインスタンスが立ち上がってくるし、まったり見守るか...

10分後...

**アレ、なんかいつもより立ち上がってくるの遅いな...
でも起動は開始してるみたいだし、いつもより遅いだけかな...
もう少し待ってみよう...**

5分後...

**なんか起動に失敗してる...なんで!?**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494465/501b8744-b782-8e5e-ce9a-d695356a425e.png)

まっっったく、原因がわからず、同じような状況の記事もない。。。
とにかく設定したすべての内容をひたすら見直しました。
そしたら**とんでもなく初歩的なミス**でした。。。

# 原因と解決方法
原因はなんと、**起動テンプレート**でした。
起動テンプレートとは、MGNでインスタンスを起動する設定をテンプレート化したもので、VPCやサブネットはもちろん、セキュリティグループやIPの設定も入れられます。
その起動テンプレートでサブネットを指定していなかったことが原因でした。
(後日、間違ったサブネットを指定してかとオーバーをしてみましたが、同様の結果で失敗しました。)

なので、同じような事象に陥った方がいれば「サブネットの設定」を見直してみてください！

**①指定したIPアドレスが、そのサブネットに含まれていること**
**②起動テンプレートにサブネットを明示的に指定していること**

これらを確認してみてください。

ちなみに、なんで気づけなかったかというと、カットオーバーやテストインスタンスの起動ジョブに、失敗しました！しか出てこなくって、なぜ起動に失敗したかがわからなかったためです。

多分見えない裏の動きで、「**サブネット指定してないじゃん、EC2起動できないよ！**」、とか「**指定IPで指定したサブネットに立てられないよ！**」といったことがおこているんでしょう...MGNのジョブ履歴でそれくらいおしえてよ...


# さいごに
今回は実際にあったトラブルについて記事を作成してみました。
今後はVeeeamやいま検証しているvCenter Converter Standaloneのことをいっぱい書いていきたいです。
質問があればコメントしていただければと思います。
それではまたどこかで。
AndroidStudioでGithubCopilotを使う

## はじめに
AndroidStudioはAndroidの開発やFlutterでも開発で使われます。
FlutterはVSCodeもよく使われますが、使ってみるとターミナルを駆使してコマンドを使うため、AndroidStudioほど使い勝手は良くありませんでしたので、AndroidStudioでGithubCopilotを入れてみたいと思います。

## GithubCopilotのプラグインを導入

AndroidStudio > Settings >  Plugins　からプラグインを導入します。
Github Copilotで検索して一番上に表示されるものをインストールします。

![copilot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109862/086223e1-ecf1-f46b-6f4e-b5174cafb20f.png)

インストール完了したらRestarat IDEで再起動します。
![copilot2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109862/2c9682ff-2a24-1242-b0ac-b518d3977ab6.png)

Tools > GITHUB Copilot > Login to GitHubでGithubアカウントと連携します。
![copilot3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109862/4e53fe86-6611-6289-fac9-2102e51ef7d3.png)

Device Codeが表示されるので、Copy and Openで開いたページでDevice Codeを入力します
![copilit4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109862/dd779dd5-a1c0-dcc0-210a-dbba03033be4.png)

次にAuthorize Github Colpilot Pluginボタンを押下して完了です。
![copilot5b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109862/b669ab85-4862-89b6-010d-c31907af0912.png)

お疲れ様でした
![copilot5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109862/84dbb4ea-a489-4bc6-b3dd-244f210d708f.png)

これでCopilotをVSCodeのように使えます

## 最後に
Flutter開発でもAndroid開発でもCopilotはかなり良いサジェストを的確に出します。
レイアウト系は特にテンプレートのサジェストがあり大分時間短縮になるのでおすすめです。
初心者は基礎を抑えるまでは使わないほうがいいです、ある程度慣れたら使うと効率的に利用できるでしょう。

しかしここ半年で開発手法は大きくパラダイムシフトしました。
エンジニアはAIの手の上で踊らされてるだけで、自身のスキルが上がってるわけでは全くないので、常に忘れずに恩恵を受けてることを感じて作業をしましょう。
あなたができることは誰でもできるということは忘れてはいけない。
レポートのon focus時にでる吹き出しを常に表示させたい時に

ServiceNowのダッシュボードには、埋め込みレポートが存在しています。棒グラフや円グラフなどのグラフ内のオブジェクトにマウスをオンフォーカスすると、吹き出しが現れ、そのオブジェクトの中身の数値が表示されます。このような値を常に表示させたい場合は、以下の設定を行います。



1. Report > View/Runでレポート一覧に移動します。

2. 表示したいレポートを選択して編集します。

3.Style General Show Labelです。
![Screenshot_20230721-010951~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/c3661885-894b-6d2b-dba4-e2f81a315126.png)

こっちのレポートでも歯車アイコンが有りますのでそこです。見つけるのに10分かかったので以外に本質情報かも。![images~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/202792f0-d405-66ef-dd22-2006ac5b1bd3.png)




以上の手順で、設定が完了します。30分ほどの調査でこの方法を見つけたため、ここにメモしておきます。
バックアップなしでtfstateを誤って削除してしまったら

## 概要
バックアップ取ってないのに, tfstate消しちゃった~
どうしよう~
となった時にどうするのか書いてみます。

とはいったものの
* tfstateはしっかりバックアップをとる(弄る時は)
* S3で管理している場合はバージョニングをした方がよい
    * AWS Backupでも良いかも

ということにつきます。

tfstateの挙動については下記の記事がすごく参考になります。
https://chroju.dev/blog/terraform_state_introduction

## 実際どうなるのか
terraformの管理下から外れるので,
手動で作成したリソースと同じになります。

この状態で `terraform apply` をすると,
同じ構成のリソースができるか, 名前被りで失敗します。

`terraform destroy` ももちろんできないので,
リソースを手動で削除するしかないです。

厳しいです。

## 戻すにはどうすればよいのか
**元のtfstateの構成にもどす**
か
**諦めて既存リソースを手動で消して作り直す**
しかないはずです。(というかこれしか思いつかなかった)
(他の方法あったら教えてください〜〜〜🙇)

消してしまったファイルと, 同じ中身を作り上げれば良いという話ですが,
正直めっちゃきついです。

諦めて既存リソースを手動で消して作り直すのもめっちゃ大変です。

消してしまったファイルと, 同じ中身を作り上げる方法はちょっと掘り下げます。

### 消してしまったファイルと, 同じ中身を作り上げるには
全く何もない状態から作り上げるのは正直無理だと思ってます。
中の構成をある程度知っていたとしても細かい書き方まで再現するのは非現実的だと思います。

そこで, もし消してしまった環境とは別のterraformで作成した開発環境がある場合は,
なんとかなる可能性が高いです。

方法としては、
その開発環境のtfstateファイルを元に, 
ファイルの中身をチューニングして元に戻す手法です。

AWSコンソール, AWS CLIを駆使して,
各種リソースのIDなどの情報を得ながら書き換えていきます。

書き換えたら `terraform plan` で差分を確認します。
No Changeになるまでやります。

他の開発環境がない場合は厳しいです。

## さいごに
tfstateファイルをバックアップなしで消してしまったら絶望ですが,
なんとかなる場合もあります。

ただ, ある程度実際のリソースの構成を知っていたり,
サービスそのものの知識がないときついはずです。

まじでバックアップ取った方が良いです。
Pythonのyieldについて

### Pythonのyieldとは
* `yield`は与えられた式を`generator` objectに格納して、`caller`に返します。
* Pythonでは`yield`は`return`と類似していますが、主要な違いとして`return`が呼び出された時点で関数の処理を終了するのに対し、`yield`は一時停止をし、再開時には引き続き実行されます。

    * Advantages of yield:
        * yieldキーワードを使うと、呼び出し元がオブジェクトを反復するときだけ実行されるので、メモリ効率が高い。
        * 変数の状態が保存されるため、一時停止と再開を同じ時点から行うことができ、時間の節約になる。
    * Disadvantages of yield: 
        * ジェネレーターから何度も値が返されるため、コードの流れを理解するのが難しくなることがあります。
        * ジェネレーター関数の呼び出しは適切に処理されなければなりません。
        (https://www.geeksforgeeks.org/python-yield-keyword/)

```python
def fun_generator():
	yield "Hello world!!"
	yield "Geeksforgeeks"


obj = fun_generator()

print(type(obj))

print(next(obj))
print(next(obj))
```

**Output:** 
> \<class 'generator'>
Hello world!!
Geeksforgeeks

`yield`を使用すると、`generator function`となります。`generator function`は`iterators`を自動生成し、`iterable`なobjectとして使用することができるようになります。
OpenCVで読み込んだ画像をFastAPIで返したいとき

# 結論: エンコードしたあとstarletteのStreamingResponseを使いましょう。
~~~python:サンプルコード
import io
import cv2
from fastapi import FastAPI
from starlette.responses import StreamingResponse

app = FastAPI()

@app.get("/image/jpg")
def image_jpg():
    image_path = "C:\\publc\\image.jpg"  
    im = cv2.imread(image_path)
    byte_image = cv2.imencode(".jpg", im)
    return StreamingResponse(io.BytesIO(byte_image.tobytes()), media_type="image/jpg")

# jpgじゃなくてpngがいい場合は以下
@app.get("/image/png")
def image_png():
    image_path = "C:\\publc\\image.png"
    im = cv2.imread(image_path)
    byte_image = cv2.imencode(".png", im)
    return StreamingResponse(io.BytesIO(byte_image.tobytes()), media_type="image/png")

~~~


# 補足

フロントエンド側は以下のようにすれば画像を読み込むことができる。
~~~HTML:画像アクセスのサンプルコード
<img src="http://localhost:8000/image/jpg" />
~~~
自社利用のソフトウェアって会計上はどうなるの？

# 概要

弊社では業務自動化の一環として社内で利用される自動化ツールを提供しています。
ソフトウェアといっても会計上は使用目的に応じて扱いが異なります。
__今回の記事では、ソフトウェアは会計上どう扱われるかについてサラッと書いて興味を持ってもらうことを目的に書きました🫣__

:::note info
記事の最後にソフトウェア会計について丁寧に紹介してくれている記事を掲載しておきましたので、詳細はそちらで確認して下さい。
:::

## 会計におけるソフトウェアとは…

研究開発費等会計基準では以下のような定義がされています。

> ソフトウェアとは、「コンピュータを機能させるように指令を組み合わせて表現したプログラム等」をいう
> 

つまり、ソフトウェアの範囲は以下のようになります。
①コンピュータに一定の仕事を行わせるプログラム、
②システム仕様書、フローチャート等の関連文書

🦆＜なお、動画、画像等のコンテンツはソフトウェアの処理対象となる電子データであり、__ソフトウェアの範囲には含まれません__。インフラやクラウドサービスの提供側の会計の話に興味があればそちらの会計基準や処理をみて下さい。

## ソフトウェア会計は目的によって適応される会計基準が異なる
ソフトウェアはその利用目的により将来の収益との対応関係が異なること等から、__制作目的別に設定されています__。ここでは三つだけ押さえておいて下さい。
- 研究開発目的
- 外販目的
- 社内利用

それぞれの目的に合致するような会計処理を選ぶことになります。
その中でも更に詳しく見ていくと細かい会計方針の違いなどがあり、ソフトウェアの取得形態によって会計処理が異なります

### ソフトウェアの取得形態は以下３つ
- 外部から購入する場合
- 外部に制作を委託する場合（外注制作）
- 自社で制作する場合

うちでは自社で製作しているので「自社で制作する場合」について少し詳しく見ると、以下のように書かれています。
>   四　研究開発費に該当しないソフトウェア制作費に係る会計処理
　３  自社利用のソフトウェアに係る会計処理
　ソフトウェアを用いて外部へ業務処理等のサ－ビスを提供する契約等が締結されている場合のように、その提供により将来の収益獲得が確実であると認められる場合には、適正な原価を集計した上、当該ソフトウェアの制作費を資産として計上しなければならない。
　社内利用のソフトウェアについては、完成品を購入した場合のように、その利用により将来の収益獲得又は費用削減が確実であると認められる場合には、当該ソフトウェアの取得に要した費用を資産として計上しなければならない。

これら以外にも「SaaSなどのソフトウェア制作費等の会計処理等に関する研究資料の公表」や「ゲームビジネス　スマートフォン・携帯電話向けゲームにかかる収益認識」にまつわる会計処理などたくさんあります😵‍💫

自分が関わっているソフトウェアは会計上どのように扱われているか見てみると良いでしょう！🐣

# まとめ
簡単なまとめ

- ソフトウェア会計は目的によって適応される会計基準が異なる
- 資産計上される場合もあれば費用処理されることもある
- 資産計上される場合の耐用年数は５年（あるいは市場販売目的のソフトウェアに準じて3年。更に「第三者への業務処理サービスの提供目的」で収益との対応関係が明確であれば販売見込数量（収益）に応じて償却）
- 減損処理の適応対象です。資産の収益性の低下により投資額の回収が見込めなくなった場合、帳簿価額を回収可能価額まで減額し、当該減少額を減損損失として当期の損失として計上します（つまり、当初の帳簿価格よりも実質の価値が低くなっていることが分かれば適正価格まで修正するということ。もっと奥が深いですが割愛）


# おわりに
ソフトウェアの特徴（無形・製作期間・ビジネスモデルの急激な変化）を考えると会計でソフトウェアを扱う際の課題が多くあります🦆
ソフトウェア開発については、その特徴と課題と会社の状況と開発のフェーズを踏まえ、貨幣的価値尺度に依存し過ぎない適切な指標の見直しや戦略が必要になってくるのではないかと思いました🐣

良いね貰えると記事を書くモチベに繋がるので嬉しいです🥺！


# 参考
- 研究開発費及びソフトウェアの会計処理に関する実務指針
- 研究開発費等に係る会計基準
- [ソフトウェア業　第1回：ソフトウェア業界の特徴と会計上の課題](https://www.ey.com/ja_jp/corporate-accounting/industries/technology/industries-technology-software-2023-03-01-01)

- [ソフトウェア業　第4回：自社利用ソフトウェア（制作取得費の会計処理、減価償却、減損）](https://www.ey.com/ja_jp/corporate-accounting/industries/technology/industries-technology-software-2023-03-01-04)
rmコマンドのテスト

rmコマンドはファイル、ディレクトリの削除をするコマンドである。
そんなコマンドを使用して、サーバをOSごと破壊した人がいたらしく実験的に試してみることにする。

まずは環境の用意から。
VM　VitualBoxで実際に遊んでいる環境を破壊はしたくないので、クローンを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733928/12476f03-209e-1339-6562-ad8cb91ab4fe.png)


次にいつも通りログインし、ホームディレクトリにいることを確認し、何のファイルが置かれているか確認しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733928/804765da-0b58-bf77-d546-08c4d4769b58.png)

ここまでが下準備。
これ以降は、マネしないように気を付けてください!
***
現場の人が実際に実施したコマンドがこちら
```
rm△△どこかしらのファイル
```
※△=半角スペース

どこかしらのファイルを削除しようとしたところ、半角スペースを誤って、入力してしまったらしく
起きてしまった事故らしい。。恐ろしい・・・

***
### ではいざ実践!!
コマンドを入力して、、、と
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733928/7a9b84f6-bc0b-38aa-a555-ea2c19d496d7.png)
あ。。。プロンプトが表示されている。。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733928/387c871b-2132-f2ee-6a49-7b5a8e09c8a8.png)
どうやらtest5.txtだけ削除されたみたいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733928/56b753f9-3329-709c-2299-ca2f9f963cc9.png)
Linuxのバージョンによっては、削除されるみたいです。

おそらくrmコマンドを流した際に、ファイル1とファイル2を削除する。
といった複数のファイル削除の際にカーネルがスペース、スペースをホームディレクトリ?と認識して
ファイル2とホームディレクトリごと削除してしまったのではないかと想定してます。
間違いかもしれないので有識者の方ご存じでしたらご教授ください。
```
rm ファイル1 ファイル2
```

以上テストでした。
【Linux】kubectlをバージョンアップする

# 概要
kubectlのバージョンはクラスターのマイナーバージョンとの差分が±1以内でなければならない。
そのためクラスターのバージョンを上げる際には、kubectlのバージョンが上記条件を満たしているか気にする必要がある。
本投稿ではkubectlのバージョンを1.24→1.25にアップデートしてみる。

なお、利用可能なバージョンの一覧は下記URLのtagにて確認できる。
https://github.com/kubernetes/kubernetes

# 環境
OS：Ubuntu 22.04.2 LTS
Kubernetes Cluster：v1.25.6

# 現在のバージョン確認
```bash:command
$ kubectl version --short
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.24.10
Kustomize Version: v4.5.4
Server Version: v1.25.6
```

Client Versionがv1.24.10となっている。これを1.25.6に上げる。

# バージョンアップ
#### 1.kubectlダウンロード
```bash:command
$ curl -LO https://dl.k8s.io/release/v1.25.6/bin/linux/amd64/kubectl
※URLのv1.25.6の部分は適宜目的のバージョンに変える。
```

カレントディレクトリにkubectlがダウンロードできた。
```bash:command
$ ll kubectl
-rw-rw-r--  1 usr usr 45031424 Jul 11 06:51 kubectl
```

#### 2.実行可能にする
```bash:command
$ chmod +x ./kubectl
```

実行権限がついた。
```bash:command
$ ll kubectl
-rwxrwxr-x  1 usr usr 45031424 Jul 11 06:51 kubectl*
```

#### 3./usr/local/binに移動
```bash:command
$ sudo mv ./kubectl /usr/local/bin/kubectl
```

# バージョンが上がっているか確認
```bash:command
$ kubectl version --short
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.25.6
Kustomize Version: v4.5.7
Server Version: v1.25.6
```

Client Versionがv1.25.6に上がった。

最後にkubectl cluster-infoやkubectl get podコマンドなどでクラスターに接続できていることが確認できればOK。

# 参考
https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/#install-kubectl-on-linux
WSLのUbuntuにおいてdocker container run --rm hello-worldが実行できない

# 背景


WSLのUbuntuにDockerを入れようとしたらうまくいかない

このサイトを参考に実行しようとした。

https://zenn.dev/fehde/articles/ea0e8a0a0a1de4


```bash
docker container run --rm hello-world
```

エラーメッセージ

```bash
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.
```



# 解決策


```bash
sudo systemctl start docker
```

の代わりに

```bash
sudo /etc/init.d/docker start
```

を使用する

レスポンス

```bash
 * Starting Docker: docker                                                        
```

正しく動作するようになりました。


## 参考文献
また git のアカウントを上手く切り替えられていない自分へ

# git push でエラー
多分複自分のリポジトリを clone して修正した後 push しようとしたらエラーになっていると思います。

```
$ git push                     
ERROR: Permission to punkshiraishi/daily-report-generator.git denied to <別のユーザ名>.
fatal: Could not read from remote repository.
```

# email と name を設定
まず clone したリポジトリで、設定したいアカウントの email と name を設定してください。

```shell
git config --local user.email "xxxxxx@gmail.com"
git config --local user.name "punkshiraishi"
```

これで push 出来なかったら次に進んでください。

# ~/.ssh/config を確認
あなたの `~/.ssh/config` は今こんな感じです。

```~/.ssh/config
Host github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/xxxx

Host github.com.sub
  HostName github.com
  IdentityFile ~/.ssh/xxxx_work
  User git
  TCPKeepAlive yes
  IdentitiesOnly yes
```

こんな感じで、github アカウントごとに異なるホスト名を付けることで複数アカウントを管理しています。

# remote url の設定
また clone したリポジトリに戻って、`.git/config` を開いてください。

```.git/config
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
	url = git@github.com:punkshiraishi/daily-report-generator.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
	remote = origin
	merge = refs/heads/main
[user]
	email = xxxxxx@gmail.com
	name = punkshiraishi
```

url の部分を、`~/.ssh/config` に記載していた、**設定したいアカウントのホスト名に変えてください。**

```diff:.git/config
[remote "origin"]
-	url = git@github.com:punkshiraishi/daily-report-generator.git
+	url = git@github.com.sub:punkshiraishi/daily-report-generator.git
```

これで push できるはずです。

# 参考
https://www.designcise.com/web/tutorial/how-to-fix-permission-to-x-git-denied-to-user-error-in-git-when-using-multiple-local-accounts
WidgetKit概要その2


## 前置き
前回のまとめた[WWDC20-22の簡易まとめ](https://qiita.com/ryoooooory/items/c17db04442e1e8316301)のつづきとしてWWDC23でのWidgetKitについて注目すべき機能をまとめました。

### 1, WWDC23でのWidgetの主な進化
- StandbyModeでの表示
StandByModeとはiOS17から新しく搭載された画面で、 充電中に画面を横にするとこのモードとなります。主にナイトスタンドやキッチンカウンター、デスクには最適とされていて、スワイプで色々な時計スタイルに変更可能です。またカスタマイズも可能で、カレンダーなどの標準アプリウィジェットの他にサードパーティアプリのウィジェットも表示することができるので、開発者は自身のアプリのWidgetを対応させることでユーザーがこのモードでもWidgetが使用可能になります。Siriで簡単に音楽を再生したりも可能です。スマートスタックなので、適切な時に適切な情報を自動で表示。SmartStackはiOS14（Widget登場時）から存在していて、簡単に言うと複数のWidgetを１つの枠にまとめられる機能（PageControlみたいな見た目）で、システムがその時に一番最適なwidgetを自動で判断し回転する機能をもっています。こちらの回転のタイミングなどはシステムの自動学習だけでなくwidgetでRelevanceを設定することである程度コントロールすることができます。

[参考]
Standby:https://developer.apple.com/videos/play/wwdc2023/101/?time=1922
Add intelligence to your widgets：https://developer.apple.com/videos/play/wwdc2021/10049/


- インタラクティブ機能の強化  
Widget内でボタン、トグルが使用可能になりました。以前まではWidgetを長押しして編集することで（例えば天気アプリWidgetで編集して現在地を変えるなど）インタラクションを可能にしていましたが、今回のアップデートでより簡単にユーザーはWidgetとのインタラクションが可能になります。ボタンやトグルが可能となった背景にWidgetKitの仕組みについてまず説明されました。
WidgetKitを使ってProviderにTimeLineがを設定されそれがEntryとして設定されると、システムはそのタイムラインに応じてあらかじめViewを生成してそれをアーカイブします。システムは表示する時間になったタイミングでそのアーカイブから表示情報をもってきて表示する。動的に表示を変えたいときはreloadTimelines関数を呼び出すことで、前述までのプロセスを経て新しいエントリが再生成されてWidgetが表示されることとなる。ちなみにこれはアプリが呼び出すことで動作するようになっているので、ウィジェットが表示されているときはコードは実行されない。つまり、ウィジェット内でのボタンやトグルについてのクロージャは実行されずバインディングを変更しないので、いままではボタンなどの表示はできてもそのアクションによって表示を変えることはできませんでした。しかし、AppIntentの拡張によってこれを解決することができました。
ちなみに既存であったウィジェット編集した時に、選択肢を選択するとwidgetが更新されるのは、IntentConfigutarion(Widgetkit内部でSiriKitを使った機能。SiriKitを使うことで選択するというユーザーアクションを検知することができる。)を使っていました。

- アニメーションが可能に  
SwiftUIでアニメーションが進化したのでそれに伴ってWidgetでもそのアニメーションが利用可能になった

[参考]
Bring widgets to life:https://developer.apple.com/videos/play/wwdc2023/10028/
EIPから読み解くNFT

今回はEIPについて理解を深めることでERCトークンについて理解を深めたいと思う。
## 本記事を書こうと思った動機
独自ERCトークンの実装の際に、本格的に腰を据えて理解したいと思った際に、EIPを理解する必要があると考えたから。
なぜなら独自のERCトークンを発行するスマートコントラクトを実装する場合、EIPに記載されている標準に従うことが重要だから。

例えば、Ethereumの標準トークンであるERC20やERC721などは、EIPの一部として定義されています。EIPは、トークンがどのように振る舞うべきか、どの関数を含むべきか、といった規定を設けています。例えば、ERC20トークンは、transfer, balanceOf, approve, allowanceなどの関数を実装することが求められます。

これらの標準に従うことで、その規定を満たしたトークンはEthereumのエコシステム全体と互換性を持つことができます。つまり、ウォレット、取引所、その他のdApps（分散型アプリケーション）との間で自由にやり取りすることが可能になります!

## EIPとは何か
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/d945b052-0822-6b1a-03f6-5b9200510945.png)
公式ドキュメントによると、EIPは
1.「Ethereum Improvement Proposal」の略称で、イーサリアムの改善提案を意味します。
2. 設計文書であり、イーサリアムコミュニティに情報を提供するためのものです。
3. イーサリアムの新機能や、そのプロセスや環境の改善を記述します
4. 提案される新機能の技術的詳細と、その提案の理由が記載されます
5. EIPの著者は、コミュニティ内での合意形成の責任があります
6. EIPの著者はまた、異なる意見を文書化する役割も果たします

ということです。

つまりそれはまるで「建築の設計図」とも言えます。この設計図には新たに建つべき建物（ここではイーサリアムの新機能や改善点）の詳細な仕様と、その建物を建てる理由（新機能や改善の動機）が詳細に描かれている。そして、その設計図の作成者（EIPの著者）は、設計図に基づいて建物を建てるためのコンセンサス（合意）を形成し、異論や反対意見があればそれもきちんと記録する。それによって、全員がその建築計画（改善提案）について理解し、議論を通じて最良の方向性を見つけることが可能となるということ。

## ERCの３つのタイプ
EIPには大きく分けて3つのタイプがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/c96432bf-07f3-b126-c96a-5571e2044027.png)
以上をまとめると以下のようになります：

1. スタンダードトラックEIP：イーサリアムの実装全体に影響を及ぼす変更を記述します。このタイプはさらにコア、ネットワーキング、インターフェース、ERCの4つのカテゴリに分けられます。
2. メタEIP：イーサリアムに関連するプロセスを記述するか、あるいはプロセスへの変更を提案します。これらは通常、コミュニティの合意を必要とします。
3. 情報提供型EIP：イーサリアムの設計に関する問題を記述するか、一般的なガイドラインを提供します。しかし新機能の提案は含まれず、ユーザーはこれらを無視する自由があります。

## 公式ドキュメントによるNFTの定義
NFTと聞くと儲かる儲からないだのがもてはやされる昨今、正確な技術的な定義を理解している人は少ないのではないのでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479750/153473b1-d522-827c-1af4-22225db031ff.png)
噛み砕いて要約すると、

1. 全てのNFTは一意のID番号（uint256と呼ばれる種類の数字）を持っていて、これがそのNFTを特定するための識別子になります。
2. このID番号はNFTが存在する間、一度決まると変わることはありません。
3. NFTはそのIDと、そのIDを管理するスマートコントラクト（これが所在地のようなもの）の組み合わせで、全世界から見て一意に識別できます。
4. IDの数字は0から順番に増えていくかもしれませんが、そうであるとは限らないので、そのパターンを当てにしてはいけません。
5. NFTは何らかの理由で無効になる、つまり「消える」ことがあります。
6. IDとして使われるuint256は、その大きさと性質がさまざまな用途に適しています。なぜなら、UUIDやsha3ハッシュといった他の種類の一意識別子をuint256に変換できるからです。これらの一意識別子がuint256に変換可能な理由は、UUIDとsha3ハッシュが基本的にバイナリデータとして扱えるためです。そして、そのバイナリデータをそのままuint256の値として使用することができます。これにより、それぞれの一意識別子を直接ERC-721トークンのIDとして使用することが可能になります。

つまり....NFTとは
## それぞれが「NFTのスマートコントラクトアドレスとそのスマートコントラクト内で一意に管理される識別子（通常はuint256型のID）」とのペアで表され、これにより所有権とユニークなデジタルアセットが関連付けられるもの
のこと。
【Mac】フォルダ内の全ファイルの拡張子を小文字に変更する方法

## 方法

Automatorを起動します。

クイックアクションを選択します。

![スクリーンショット 2023-07-20 23.53.14のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/88750fd6-0194-c36d-8623-eb8f9b9fc2cd.png)

次の内容で作成し、保存します。

![スクリーンショット 2023-07-20 23.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/cddf0d31-bb4b-2c3e-d7c5-ed6f3ccac9d2.png)

Finderで対象フォルダを選択して右クリックします。
「クイックアクション」から先ほど作成したものを実行します。
するとフォルダ内の全てのファイルの拡張子が小文字に変更されます。
サステナブルなエンジニア・キャリアプランを考えてみた

これは [Qiita Engineer Festa 2023](https://qiita.com/official-campaigns/engineer-festa/2023) 記事投稿キャンペーン参加記事です。iPad欲しいです（直球）

筆者は新卒で入ったIT系の会社で４年働いた後、ゲームを作りたくなって辞めて、インディーで小さなゲームを作った後、アニメ作家か小説家になりたいなぁと夢見つつ、Web系のプログラマーをしたりしなかったりして余生を過ごしています。アラフォーのオッサンです。

そんな自分でも、業界に身を置くなかで徒然に思う所もあるので、キャンペーン開催をチャンスに文章化してみました。

# コンセプト

- キャリアプランというか人生設計
- 転職戦略は特に無し
- 人生の中で特定の時期にやっておかないと後悔しがちなことは計画に入れる
 ・自分はこれで生きていくというものを決める（若いうちに決めたほうが伸びしろが大きい）
 ・結婚と子育て（仕事で活躍したいなら子育ては早く終わったほうが楽）
 ・孫の世話をする（目に入れても痛くない孫もすぐ大きくなって生意気に…）
- サステナブル…世代をこえた持続可能性
 ・後輩を育てる（回り回って自分、業界、社会のためになる）
 ・後継者を見つける（エンジニアから経営者になった場合）
 ・引退してボランティア活動をする（特に少子化対策）

# サステナブルなキャリアプランのイメージ

人は誰でもいつか年を取って死にます。うちの婆ちゃんもいつまで生きるんだと思ってたら九十何歳でちゃんと亡くなりました。

ですから界隈でよく見られる次のような無限サイクルのイメージではなくて、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/3cf264a8-59eb-b689-51e9-f71dd3757e34.png)

始まりと終わりのある帯（おび）のようなイメージになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/b72cb7eb-3cc2-f55e-59d4-6f48cd3d52ae.png)

また、主に年齢に応じてすべきこと、できることがある程度限定されるので、帯の中がいくつかに分かれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/46e2d0bf-7074-431b-d80d-888ba0f58057.png)

そして、人は一人で生きているのではないので、帯がいくつも並行して並んだ形になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/61e71baa-7fd1-1bf1-bc95-634ad86f3391.png)

キャリアプランについて考えるとき、他人の存在はあまり考えないことが多いように思います。もちろん人生をどう生きるかは個人のものだとは思うのですが、どうしても他人の存在を無視できない部分もあります。たとえば技術継承がそうで、継承する側とされる側の帯が良い位置関係にないとうまくいかないのではないかと思います。そのとき前後関係はあっても上下関係は無くて、横並びで一緒に前に進んでいくイメージがあるとよいと思います。そうして、いい感じにできあがった帯の群れが、未来に向かって途切れなく続いていくんですね。

# キャリアプランの内訳を考える

前述のイメージをふまえ、またエンジニアであることを前提として、自分が考えるキャリアプランの内訳はこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59191/04213d9f-2937-39f4-0012-44b74fa90b8d.png)

|時期        |年齢     |内容    |
|:----------|:-------|:--------|
|自分探し期  |0～25歳  |自分はこれで生きていく、というものを見つける時期。<br>オススメは高卒でいったん就職すること。そもそも働いたこともないのに一生のことを考えて就職先を決めることなどできない。現場で働きながら進学するか仕事を続けるか考える。現場を見てから学ぶのと現場を見ないで学ぶのではモチベーションが全く違う。3年働いた後で21歳から4年制大学に行っても卒業は25歳。十分若い。|
|修行期 |25～45歳 |自分はこれで生きていく、と決めたものを突き詰める修行の時期。30歳程度で年をとった気分にならず、向上心を持ち続けよう。なお、部下を持つのも修行のうちと考える。<br>周囲から助けてもらえるうち（親が健在とか）に早めに結婚、子育てもしよう。地方で実家住まいで18歳から25歳まで働いた場合、土地付きで家を建てられるくらい貯金できる場合もある。20代前半で結婚して40代で子育てが終わっていると非常に働きやすいらしい（他人からの情報）。|
|成熟期 |45～65歳 |技術者として一人前になり、子どもも手がかからなくなって仕事が充実する時期。仕事仲間や業界の知人も増えている。若いころには手が出なかった大きなことに挑戦していこう。<br>同時に、後輩を育て自分の後継者になる人を探す時期でもある。引退間近になってから探すのでは遅い。20年あればきっと見つかるはず。|
|後援期 |65歳～ |元気なお年寄りが増えた今の時代、もっと働けると思う人は多い。しかし、頑張りすぎて若い世代の成長や活躍の機会を奪うのは良くない。引退するか、サポートに回って、自分で見つけた後継者に主役を譲ろう。なお個人で技術を究め続けるのは自由だと思う。<br>また、ボランティアをはじめとした社会に貢献する時間を増やす。特に子育て支援は社会の急務で、お年寄りの手がますます必要になる。ボランティアでなくとも、孫はかわいいうちに世話したほうが後悔しないらしい（筆者は孫がいないので想像です）。<br>ちなみに読み方は「こうえん（後方支援）き」です。造語です。|

# おわりに

自分はずっと地方に住んでいて、近場には何度も転職できるほどIT企業が無いのが実際のところです。そういう環境ではそれなりに長く一つの会社に在籍するのが普通なので、この記事ではあまり転職のことは考えていません。ニーズがあるのか分からない記事なんですが、最近は地方移住もブームですから、これからは当てはまる人も増えていくのではないかと思います。


なお、正直言って、ここで書いたことは自分では何一つ実現できていません。真逆の人生を歩んでますね（笑）でもこれに近い人生を歩んでいる人は実際にいるので、そういう人は本当に立派な人だと思います。

というわけで以上です。
ここまでお付き合いいただきありがとうございました。
SAP SD（販売管理）モジュールとは

SAP SD（販売管理）モジュールは、企業の販売と流通プロセスを管理するためのツールです。基本的なビジネスシナリオは受注、出荷、請求の3つのステップから成り立っています。

1. **受注**: 顧客からの注文を受け取り、その詳細をシステムに記録します。
2. **出荷**: 注文された商品を倉庫から取り出し、顧客に配送します。
3. **請求**: 商品の配送後、顧客に対して請求書を発行します。

SDモジュールは、組織設定とマスタデータの2つの主要な要素によって構成されています。組織設定には販売組織、流通チャネル、製品部門、販売エリア、販売グループなどが含まれます。これらの設定は、企業の販売と流通の構造を反映しています。一方、マスタデータには得意先マスタ、品目マスタ、販売価格マスタなどが含まれ、これらは販売プロセスの各ステージで使用されます。

SDモジュールはカスタマイズ可能で、受注伝票タイプ、明細カテゴリ、出荷タイプ、出荷明細カテゴリ、保管場所の割当、請求伝票タイプの定義、請求伝票のコピー管理の設定、価格決定表の定義/割当、勘定コードの割当など、企業の特定のニーズに合わせて設定を変更することができます。

SDモジュールは、受注伝票、出荷伝票、請求伝票、バックオーダーなどのトランザクションを管理します。これらのトランザクションは、販売プロセスの各ステージを追跡し、管理するために使用されます。

最後に、SDモジュールは、財務（FI）モジュールと連携しています。出荷、請求、入金の各ステージで発生する仕訳をFIモジュールに伝え、財務報告を正確に保つ役割を果たします。また、ピッキング（商品の倉庫からの取り出し）プロセスも管理します。

参考資料
【SAP SD基礎】販売管理（SD）の機能概要 | ITビジネスライフ診断書
男爵とメークインの違いわかりますか？

##  北の大地の特産品といえば「じゃがいも」
###  北海道のじゃがいもは本当においしいです


私は北海道の田舎のGMSで働いています。

業務内容に関しては、商品を補充したり、カウンターやレジ応対など食料品売場を中心に色々やっています。
以前、バラ売りのじゃがいもの種類をレジで聞かれたとき、答えられなかったことがあります。
その時は、「男爵」に形が似ていてくぼみ部分が赤っぽいじゃがいもが「きたあかり」とは知らなかったので。

そんな苦い経験から自分でじゃがいもを見分けられないなら、ＡＩに見分けてもらえばいい！！
と今回はTeachable　Machineを使用し、じゃがいもの種類を判別してもらおう！

それじゃ物足りないから、いもの特徴もついでに教えてくれないかしら？と欲張りに挑戦！

まずはご覧ください。



https://twitter.com/nonokoyu0606/status/1682017848724717573?s=53&t=KQj6DedZa7ifRk8PH6VCWg


##  今回使用ツール
Teachable Machine,LINE Deveropers,Node-Red


※こちらの記事を参考にフローを作成しました。


https://qiita.com/kuma_ssss/items/098715c74c087a19aa65



##  Teachable　Machineに感動！！

![スクリーンショット 2023-07-20 024014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458430/df3abcca-3315-d5f0-3785-5ad44b3de175.png)




Teachable Machineでは画像認識完璧！！だったのに
ケータイで撮影した画像をLINEに送ると背景によって画像認識が出来ないことが判明！！
あらゆる角度から複数回撮り直しました:umbrella:



##  完成したフローがこちら

### ・１回目
![スクリーンショット 2023-07-17 215515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458430/42395da0-e546-89ce-0847-138bd7c91dbc.png)

### ・２回目
![スクリーンショット 2023-07-20 042913.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458430/36d77b02-c8b7-0342-4255-c9886bcc0692.png)


 ※image preview 探すのに苦労しました。皆さん普通に使っているのに。
image-outで検索し、ノードに追加すればいいだけだったんです。
みつけられないのでimageとつくノードをひたすら試したりしました。
私が使用したNode-Redは時間が経つと消えてしまうため、何度か作成し、作成する度、違うものへと:sweat:




1回目も2回目も記事を参考にLINEに写真を送るとTeachable Machineを利用し、じゃがいもの種類を返してくれるところまでできました。
付け加え、判別した画像でTEXT認識したらLINEにいもの説明を返してもらうところまでいきたかったのですがうまくつながらなく、色々試してみましたが。非常に残念です。

##  色々試した例


![スクリーンショット 2023-07-20 030812.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458430/1b2056c1-f6a7-3a3e-1e43-2e6034360f87.png)

###  ※SWITCHノードを使用し判別結果別に説明文を追加しようとしました。

![スクリーンショット 2023-07-20 030743.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458430/c1d215d4-bf81-ec54-9d69-40a97ea7f5d8.png)

![スクリーンショット 2023-07-20 032150.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458430/03926611-b225-41c2-69ac-4b74a405b475.png)



~~まだ未完成！~~

~~引き続き試していきます~~

## 助言を頂きました

Teachable Machineのクラス名自体に説明を盛り込んでみれば？
50文字までいけるよ！


さっそく試してみます。

### ・フローはこちら
![スクリーンショット 2023-07-25 210427.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458430/83fe7cde-0bf3-3385-952f-123b4f10d532.png)

◉参考にさせて頂いた記事とかわらないですが

###  ・Teachable Machineはこちら
![スクリーンショット 2023-07-25 220717.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3458430/1b3a2967-c95d-258b-2294-dd996ff7889a.png)

◉かなりごちゃついてしまいました。



##  完成

https://twitter.com/nonokoyu0606/status/1683818884284174336?s=46&t=KQj6DedZa7ifRk8PH6VCWg

写真はサンプル数を増やしたにもかかわらず、判定結果は後退してしまいました。
しかし、イメージ的には完成しました。

## トライ＆エラーの繰り返しから見えたもの
今回は自分の理想とは少し遠いけれど作りたいものが出来ました。
挑戦し、失敗し方法を模索しているうちに発想の転換が出来たり、
また、記事や動画を参考にフローを作ると少しだけ仕組みが分かった気になったり、まだまだ未熟ですが半歩くらいは進めた気がします。
これからも挑戦し、失敗し、諦めず少しずつでも前進できればいいなと思います。
モダンアクティビティを使ってみた(Excel編Part13～名前をつけてExcelファイルを保存っち？～)

## はじめに
①本記事は、2023年7月開催の「UiPathブログ 発信チャレンジサマー」の20日目のブログです。
ブログの詳細、参加方法については以下のブログを参照ください。

https://note.com/shumpei_w/n/nd082bdf28853

②このブログ情報は、2023/7時点の情報です。
③UiPathはCommunity Edition、Versionは2023.6.1を使用しています。

## Excelファイルを保存？ど～いうこと？
「名前を付けて Excel ファイルを保存」アクティビティは、指定したファイル名+Excelの拡張子ファイルの種類に指定して保存するアクティビティです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/7d1263d6-3dc0-c3f3-8ac6-c2c40ca73627.png)

プロパティは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/647f6b73-c454-9a30-1514-c78ec8efcb4a.png)

【入力】
ファイルパス：新しく設定したいファイル名を記載します
ファイルの種類：Excelブックの保存形式を指定することができます。
指定できるのは以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/85ba77e9-decb-bfc7-e7ca-4bf945c0f87a.png)
ブック：保存対象のExcelを指します
【オプション】
既存のファイルを置換：チェックを付けた場合は、同じ名前のExcelファイルは新しいExcelファイルへ置換となります。(ファイルを上書きするイメージならピンとくる？)


## やってみよう
ある「出身地_2.xlsx」というファイルをもとに、「出身地_3.xlsx」ファイルを新規で保存してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/a2c43c04-3c34-1622-5f7a-05f95f3ecf9c.png)
とりあえず設定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/ca56ab90-b7b3-584f-52f9-fe0ed63806d7.png)
ブックはExcel、ファイルの種類の拡張子は"xlsx"、新しいファイル*は「出身地_3.xlsx」にしましょう。
また、既存のファイルのチェックを外してみましょう。
*指定のパスをフルパスで書いてあげる(またはパスの入った変数/引数を設定)と、指定のパスへ入ってくれるようになります。

実行してみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/17a316b2-7119-3e0f-3de5-3854af45eb66.png)
おお～できていますね！
では、拡張子を"xls"にしてみましょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/6e1e21c1-47c6-e46b-66f5-5ced626c98f7.png)
結果は...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/c85059c2-506d-781d-cc07-5cde30eaa3b0.png)
できた！:relaxed:

最後に、先ほどできた「出身地_3.xlsx」ファイルがあるのに、「既存のファイルの置換」をチェックしなかった場合はどうなるのか見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/ebc13be8-3d17-93b5-289a-03a192dd1c41.png)
実行してみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/3fd97885-0948-b015-393a-b99b612e2de1.png)
エラーになっちゃいますので気を付けましょう。
上書き...というか、置換する場合はチェックを入れておきましょう。


## おまけ
ファイル名とファイルの種類の拡張子がちぐはぐの場合はどうなるのでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/51c176f9-e866-8428-88a0-67dc45da0cad.png)
結果は...
ファイル名がおかしくなっちゃうので、注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/5ab4af20-5074-cbc0-334f-a86208dae098.png)


## まとめ
Excelファイルの拡張子を指定して保存することができるのは、便利だな～と思いました。
ただファイル名と拡張子のちぐはぐ、置換のチェック有無は気を付けましょう！
最後までお読みいただきありがとうございました。