OmniAICreator/Qiita-1.07M huggingface dataset:
Qiitaはじめてみた。

どうもこんにちは、hrak0x59です。
初めてのQiita投稿です。初々しいですね。
ではまずは自己紹介から。

## 自己紹介
1. お名前は？
    1. hrak0x59です。
2. 年齢は？
    2. もう20歳ですね...。
3. 自然言語は何を話す？
    3. 日本語、中国語、少し英語を話します。
4. 職業は？
    4. 情報系で大学2年生やっています。 
### じゃあ理系なの？ 
```
元々は会計志望の文系でした。
```
### プログラミング初めてどのくらい？
```
大学でプログラミングに触れ始めてちょうど一年ぐらいです。
```
### 普段は何を学んでるの？ 
```
現在はpythonでデータサイエンス・機械学習、C言語でコンピュータ原理を学んでます。
```
### 趣味は？
```
読書とか偶に映画見たり偶に運動したりします。
```
### 普段は何してるの？
```
ニュース見たり記事読んだり株価見たりビジネスモデルを考えてたり、最近は絵を描き始めたり息抜きにしょうもない動画を見たりしてますね。
```
### 何に興味があるの？
```
コンピュータ関連で言うとコンピュータやネットワーク、セキュリティ、アーキテクチャ、デザインパターン、プロラミング言語、基本なんでも興味ありますね。それ以外で言うと認知科学やデザイン、会計とかマーケティングも好きですね。
```
### それだったらもう好きじゃないこと聞くよ....。好きじゃないのは？
```
身の回りで言うと建築や教育系には現在のところあんまり興味ないですね。でもまあ興味がないって言うのは興味深いポイントが分からないだけなので、それをわかる人が布教してきたらコロッと態度を変えるかもしれませんね。
```
 
## ところでなんでQiita始めたの？
```
実は最近インターンを探し始めてて、それで色んな所で記事書いてるか〜？とか聞かれるので...
```
まあそれ以外にもOutputや言語化と言う側面もありますけどね。笑

## これからの方向性
とりあえず自分のエンジニアとしての最終目標到達地点がフルスタックエンジニアになって大学でセキュリティかネットワークを研究すると言うことなので、早めにフルスタックエンジニアに成れたらなと思ってます。

## 最後に
これからぼちぼちQiitaに投稿していきたいと思ってますので是非是非フォローでもしてくれたら嬉しいですよ！
読んでくれてありがとうございました！！
GitでProxyの設定 2022年版

Proxy環境下でGitを利用するための設定は大昔に書いた。
[GitでProxyの設定 - Qiita
](https://qiita.com/Kuchitama/items/8f589b7975ff736cdcb8)

最近は、ほぼProxyと向き合うことはなかったんですが、ごく稀に時々一部のリポジトリだけ Proxy を通さないといけないことがあってそのための対応をメモします。

# 前提

- ほとんどProxyを使うことはないため、 `system` や `global` のgit configは極力触らない
- ローカルのリポジトリは1つだが、 リモートが 非Proxy環境と Proxy環境でそれぞれある場合があって remote ごとにProxy設定を行いたい
    - 非Proxy環境のGitリポジトリは https でアクセス可能
    - Proxy環境のGitリポジトリは http でアクセス可能


# 対応

リポジトリ内の `.git/config` を開いて ↓の設定を入れると、 `http` 通信時のみ Proxyを通せる

```
[http]
        proxy = http:{proxy_host}:{proxy_port}
        sslVerify = false
```
多対多のアソシエーション間でのデータの取り方

テックキャンプ現役受講生のアプリ開発Day16です。月末が終わりましたが、アプリ開発はまだまだ終わっていません。後、必要になる機能として、「作成したルームにジャンルをつける、テストコードをの記述、ページ全体のレイアウト」があります。正直後1週間強ないと終わりません。7月9日あたりを目標に終わらせようと思っています。今日は中間テーブルが必要なテーブル間で、データを取得する際に個人的に便利だなと思った方法についてアウトプットします。

# アソシエーション
前提となるアソシエーションについて説明します。UserがRoomを作成することができ、Roomには複数の人が参加することができます。従って、User＿roomの中間テーブルが必要になります。各テーブル間のアソシエーションを記述します。
```ruby:user
class User < ApplicationRecord
  has_many :user_rooms
  has_many :rooms ,through: :user_rooms
end
```
```ruby:room
class Room < ApplicationRecord
  has_many :user_rooms
  has_many :users, through: :user_rooms
end
```
```ruby:user_room
class UserRoom < ApplicationRecord
  belongs_to :user
  belongs_to :room
end
```
# ①ある特定の複数のユーザーが作ったルームを全て取得
```ruby
@users = User.where(id:[1,2, ...])
@rooms = Room.joins(:user_rooms).where(user_rooms:{user_id:@users.ids})
```
@usersのIDを利用し、中間テーブルのuser_roomsで検索したいユーザーを指定。roomとUser＿roomを結合しているため、中間テーブルで欲しいUserを取得した段階で、欲しいルームも取得できる。

別の方法
```ruby
user_rooms = UserRoom.where(user_id:[1,2, ...])
@rooms = Room.where(id:user_rooms.pluck(:room_id))
```
user_roomで特定の複数のユーザーを取得する。次に、pluckでRoom＿userを配列に変換する。

もちろん他にもアソシエーションを使った方法等もあリマス。
# ②roomを新規作成順に取得
```ruby
@rooms = Room.order(created_at: "DESC")
```
# ③roomの参加者が多い順に取得
```ruby
@rooms = Room.joins(:user_rooms).group(:room_id).order('count(user_id) desc')
```
まず、中間テーブルでroom_idごとにまとまりを作る。
次に、各room_idごとに含まれるUser＿idの数を数えて、降順に並び替える。
最後に、RoomとRoom＿userを結合し、ルームを取得する。
# 参考になったサイト
https://qiita.com/kent_ear/items/5748d6b6db83fb5e8782

https://coffee-engineer4.com/2021/06/12/%E3%80%90rails%E3%80%91%E3%82%AB%E3%83%A9%E3%83%A0%E3%81%AE%E5%80%A4%E3%82%92%E9%85%8D%E5%88%97%E3%81%AE%E5%BD%A2%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AB/
# 初心者なら熟読したいサイト
https://pikawaka.com/rails/group#%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E6%A9%9F%E8%83%BD%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9

https://pikawaka.com/rails/joins#joins%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98
SwiftUIのボタンを少し書きやすくする。

# なぜ？

従来のボタンの処理がみづらい。
全てのボタンの処理を一括で管理するために実験的にアプリに導入してみた。

## 一般的なボタンの使い方

```swift

 Button(action: {
            print("タップされたよ")
        }){
            Text("Tap me")
                .foregroundColor(Color.white)
                .frame(width: 200, height:200)
                .background(Color.red)
                .frame(width: 500, height: 500)
        }

```

## 今回の方法 (View.onButtonTap {})

Viewを拡張 + ViewModifierを使うことで行数を減らすことができ、アプリのボタンタップの処理を一括して管理できる。

```swift

struct ButtonTapModifier: ViewModifier {
    
    var onTapped: (() -> Void)?

    func body(content: Content) -> some View {
        Button(action: {
            self.onTapped?()
        }){
            content
        }
    }
}

extension View {
    public func onButtonTap(_ onTapped: (() -> Void)? = nil) -> some View {
        self.modifier(ButtonTapModifier(onTapped: onTapped))
    }
}

struct ContentView: View {
    var body: some View {
        Text("テスト")
            .foregroundColor(Color.white)
            .frame(width: 200, height:200)
            .background(Color.red)
            .onButtonTap {
                print("タップされたよ");
            }
            .frame(width: 500, height: 500)
    }
}

```
Swiftの変数について

Swiftでの変数はを定義する場合大きくvar,letの二つです。
変数がわからない人は回れ右。
変数に悩んでいる人は是非見て欲しいです。
※これはSwift Playgroundsで2022年7月1日に検証したものになります。情報が古くなっていた場合更新しますのでコメントお願いします。

# 共通事項
定義した変数(varに限る)はいつでも 
~~~swift
定義した変数名 = 新しい変数の中身
~~~
で新しい数を代入、すなわち書き換えることができます。


# var
~~~swift
var 変数名 = 変数の中身
var 変数名:変数型 = 変数の中身 //変数型を使う場合
~~~
書き換えができる変数を作ります。

||変数名|変数型|変数の中身|
|:-:|:-:|:-:|:-:|
|重要性|**必須**|任意|**必須**|
|説明|変数の名前を指定します|変数のタイプを指定します|変数の中身を指定します|
|補足|   |   |   |
### 変数名(必須)
変数の名前を指定します。
abc数字及び日本語が使用できます(他の言語も使えるかも)
既に宣言した変数の名前や1文字目に数字がくる名前、！？などの記号は使用できません。

<details><summary>具体的な例</summary>

~~~swift
var a = 5 //OK
var A = 5 //OK
var 日本語 = 5 //OK
var 1K = 5 //数字から始まっているためNG
var gg? = 1 //記号から始まっているためNG
var a = 7 //既にaが指定されているためNG
~~~

</details>

### 変数型(任意)
変数の型、すなわちタイプを指定します。
指定しなくてもあまり問題はないですがこの変数は数字だけ、これは文字だけのように指定できるので便利です。

|変数型|用途|
|:-|:-|
|Int|数字|
|String|文字列|
|Bool|真偽値(true or falseでこれ以外を中身に入れるとエラー吐きます)|
|Float|32bitサイズの浮動小数点型|
|Double|64bitサイズの浮動小数点型|

### 変数の中身(必須)
変数の中身を指定します。
変数型に合わない中身(Intを指定し数字のみの変数にしたものに文字列を入れたりBoolでtrueかfalseに限定しているにも関わらず他の文字を入れたり)を入れたり、名前と同じく記号を入れたりすることはできません。
また、trueとfalseを除いた文字列を入れる場合はダブルクオーテーション(")で囲む必要があります。

<details><summary>で？どういうこと？という人はこちら</summary>

~~~swift
var a = 5 //OK
var HisNameIs:String = "John Cena" //OK
var Owatta = true //OK
var Count:Int = "あいう" //型にあっていないためNG
var Rookie:Bool = no //型にあっていないためNG
var i = 'AA' //""ではなく''のためNG
~~~

</details>

# let
~~~swift
let 変数名 = 変数の中身
let 変数名:変数型 = 変数の中身 //変数型を使う場合
~~~
書き換えができない変数を作ります。
このコードで指定された変数は
~~~swift
letで指定した変数 = 新しい中身
~~~
で新しい中身を代入することができません。
なので定数と呼ぶこともあります。基本的なコードの仕組みはvarと一緒です。

||変数名|変数型|変数の中身|
|:-:|:-:|:-:|:-:|
|重要性|**必須**|任意|**必須**|
|説明|変数の名前を指定します|変数のタイプを指定します|変数の中身を指定します|
|補足|   |   |   |
### 変数名(必須)
変数の名前を指定します。
abc数字及び日本語が使用できます(他の言語も使えるかも)
既に宣言した変数の名前や1文字目に数字がくる名前、！？などの記号は使用できません。

<details><summary>具体的な例</summary>

~~~swift
let a = 5 //OK
let A = 5 //OK
let 日本語 = 5 //OK
let 1K = 5 //数字から始まっているためNG
let gg? = 1 //記号から始まっているためNG
let a = 7 //既にaが指定されているためNG
~~~

</details>

### 変数型(任意)
変数の型、すなわちタイプを指定します。
指定しなくてもあまり問題はないですがこの変数は数字だけ、これは文字だけのように指定できるので便利です。

|変数型|用途|
|:-|:-|
|Int|数字|
|String|文字列|
|Bool|真偽値(true or falseでこれ以外を中身に入れるとエラー吐きます)|
|Float|32bitサイズの浮動小数点型|
|Double|64bitサイズの浮動小数点型|

### 変数の中身(必須)
変数の中身を指定します。
変数型に合わない中身(Intを指定し数字のみの変数にしたものに文字列を入れたりBoolでtrueかfalseに限定しているにも関わらず他の文字を入れたり)を入れたり、名前と同じく記号を入れたりすることはできません。
また、trueとfalseを除いた文字列を入れる場合はダブルクオーテーション(")で囲む必要があります。

<details><summary>で？どういうこと？という人はこちら</summary>

~~~swift
let a = 5 //OK
let HisNameIs:String = "John Cena" //OK
let Owatta = true //OK
let Count:Int = "あいう" //型にあっていないためNG
let Rookie:Bool = no //型にあっていないためNG
let i = 'AA' //""ではなく''のためNG
~~~

</details>

# 使い分け
まずはvarとletを比較してみましょう。
||var|let|
|:-:|:-:|:-:|
|数値の書き換え|できる|できない|
|型の指定|できる|できる|

letは一度指定して仕舞えば変更できないので名前やメールアドレスなどで使うのがいいでしょう。

ミス等ございましたらコメントでご指摘ください。
Messenger PlatformとVision AI

# 発端
グループチャットで朝ランの走行距離をスクショにてシェアしているが、これらを合算した走行距離を記録したい。

# Messenger Platform
Facebook Messengerのグループチャットなんだけど、ボット使えたっけかな。。

https://developers.facebook.com/docs/messenger-platform/

主要なところは日本語にもなりつつあるけど、まだ英語のままのページも多い。が、よく構成されていてざっと把握することはできそう。

今朝読む限り、どうも一対一でメッセージが送受信できるがグループの中に追加はできなそう。

逆に、LINEボットは１つまでだが同じFacebookページに複数のアプリは登録でき、アプリ間でhandoverする仕組みもあるようだ。

# Vision AI
画像からテキストを抜き出すのに思い出したのがこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3381/a4f2a646-3a82-0c15-e655-cf364095f3d7.png)

https://cloud.google.com/vision/#section-2

これは使えそう！

ちなみに以下のイベントで知ったネタ。
https://mdqu.rcis.jp/course/view.php?id=14

# To be continue
今朝の朝活ここまで。
Data & AI SummitにおけるDatabricks Machine Learningの発表の振り返り

[Announcements for Databricks Machine Learning at Data and AI Summit 2022 \- The Databricks Blog](https://databricks.com/blog/2022/06/30/recap-of-databricks-machine-learning-announcements-from-data-ai-summit.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

# Databricks Machine Learning

レイクハウスにおけるDatabricks Machine Learningは、全てが一つの環境に統合された状態で、データの取り込みからトレーニングやデプロイメント、モニタリングに渡るエンドツーエンドの機械学習の機能を提供し、MLライフサイクルにおける一貫性のあるビューを作り出し、より強力なチームのコラボレーションを可能にします。今週のData & AIサミットにおいて、我々はDatabricksにおけるMLライフサイクルとプロダクションのMLをさらに加速する機能を発表しました。こちらでは主要な発表の振り返りを行います。

# MLflow Pipelinesを含むMLflow 2.0

MLflow 2.0はまもなく公開され、これには新たなコンポーネントであるPipelinesが含まれます。MLflow Pipelinesは、MLエンジニアが主導によるコードの書き直しやリファクタリングのような調整を行わなくて済むように、探索からプロダクションへの移行を自動化する構造化されたフレームワークを提供します。MLflow Pipelinesのテンプレートは、ユーザーがカスタマイズできるステップによる事前定義済みのグラフの足場を組み、ネイティブで他のMLflowライフサイクル管理ツールとインテグレーションされます。また、パイプラインはプロジェクトにおけるモデル評価とデータプロファイリングを標準化するために、ヘルパー関数や「ステップカード」を提供します。本日から[MLflow 1\.27\.0](https://mlflow.org/docs/latest/pipelines.html)を用いてMLflow Pipelinesのベータバージョンを試すことができます。
![](https://databricks.com/wp-content/uploads/2022/06/db-255-blog-img-1.png)
*MLflow 2.0ではMLを加速するための事前定義済み、プロダクションレディのテンプレートであるMLflow Pipelinesが導入されます*

# サーバレスモデルエンドポイント

ご自身のプロダクションアプリケーションにおけるリアルタイム推論のために、サーバレスモデルエンドポイントにモデルをデプロイします。サーバレスモデルエンドポイントは、UIあるいはAPI経由でセットアップ、設定できる高可用性、低レーテンシーのRESTエンドポイントです。ユーザーは、モデルのスループットをコントロールしたり、予測可能なトラフィックのユースケースにおいて、オートスケーリングをカスタマイズすることができ、0台にまでオートスケーリングすることで、チームはコストを削減することができます。また、サーバレスエンドポイントにはビルトインの観測機能が備わっているので、モデルサービングをモニタリングすることができます。もはや、データサイエンスチームはMLモデルを提供するために、自分でkubernetesのインフラストラクチャを構築、運用する必要はありません。ゲーテッドパブリックプレビューが開始した際に連絡が必要であれば、[サインアップ](https://docs.google.com/forms/d/e/1FAIpQLSdU3vojuZ_dbbDT_Yg_WP4tJUBNzR7Ty6oUhsVPuvqdqtOBkw/viewform?usp=sf_link)してください。
![](https://databricks.com/wp-content/uploads/2022/06/db-255-blog-img-2.jpg)
![](https://databricks.com/wp-content/uploads/2022/06/db-255-blog-img-3.png.jpg)
*サーバレスモデルエンドポイントはDatabricksによってホストされるプロダクションレベルのモデルサービングです*

# モデルモニタリング

モデルモニタリングを用いて、ご自身のプロダクションモデルのパフォーマンスを追跡します。我々のモデルモニタリングソリューションは、チームがデータドリフトやモデル品質のドリフトを参照、分析できるようにダッシュボードを自動で生成します。また、内部の分析、ドリフトテーブルをDeltaテーブルとして提供するので、チームはビジネスインパクトを計算し、メトリクスが特定の閾値を下回った際にアラートを出せるように、パフォーマンスメトリクスとビジネスバリューメトリクスを結合することができます。モデルモニタリングは自動でドリフトと品質メトリクスを計算しますが、ユーザーが簡単に追加のカスタムメトリクスを取り込めるメカニズムも提供します。パブリックプレビューのローンチをお待ちください。
![](https://databricks.com/wp-content/uploads/2022/06/db-255-blog-img-4.jpg)
*自動生成されるダッシュボードとアラートを用いて、デプロイされたモデルと集中管理された場所に格納される関連データをモニタリング*

# より詳細は

- Data + AI Summit 2022のオンデマンドの動画を参照する: https://databricks.com/dataaisummit/
- MLflow 2.0 with MLflow Pipelines: https://qiita.com/taka_yayoi/items/29a54ba9a5df4a38b3ad
- Databricks Machine Learning: https://databricks.com/jp/product/machine-learning
- Big Book of MLOps: https://databricks.com/p/ebook/the-big-book-of-mlops

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Qiita Engineer Festa 2022 ロゴ作成 秘話

![ogp-qiita_engineer_festa_2022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/5108cbfd-5c3d-c9e8-1bbc-6232f2614688.png)

こんにちは。Qiitaのデザイナーの[出口](https://twitter.com/degudegu2510)です。

最近、Qiitaのトレンドを観察していると、
特定のユーザーやOrganizationが
`QiitaEngineerFesta2022`のタグをつけて、
トレンドに載っていませんか？


実は、Qiitaでは6/1日~7/18まで、
**Qiita Engineer Festa 2022**を
開催しているからです。


そんな、**Qiita Engineer Festa 2022**の
デザイン全般を担当した僕が
Qiita Engineer Festa 2022のロゴが
どのように作ったのかを公開します。




## Qiita Engineer Festa 2022とは？
**Qiita Engineer Festa 2022**は、
**記事投稿キャンペーン**と**ライブ配信イベント**、
**Organization対抗戦**から構成される
複合型イベントです。

今年は各テーマごとのプレゼントのほかに、
Organization対抗戦にも豪華プレゼントを
ご用意しています。

ぜひ、全国各地より皆様のご参加を
お願いいたします。



## 2022年と2021年のロゴの違い
**Qiita Engineer Festa 2022**のロゴはこちらです。
![Qiita Engineer Festa 2022_single_primary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/47821d1a-7684-7193-38ee-cbb142ff18c8.png)

[Qiita Engineer Festa 2021](https://qiita.com/official-campaigns/engineer-festa/2021)のロゴと
どこが違うのでしょうか？

見比べてみましょう。

|**2021**|![Qiita Engineer Festa 2021_horizontal_white.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/8238975a-4857-ae4a-a283-50bf05d65d7b.png)|
|--|--|
|**2022**|![Qiita Engineer Festa 2022_single_primary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/47821d1a-7684-7193-38ee-cbb142ff18c8.png)|

今年(2022年)のロゴは去年(2021年)のロゴより
だいぶ*スタイリッシュ*にしました。

大きく違うのは、ロゴアイコンの部分です。
`EF2021`のテキストアイコンから、アイコンに変えました。


2021年のロゴは、試行錯誤しながら作成していましたが、
どうして、ロゴアイコンを変えたのでしょうか？


*解説に入る前に試行錯誤の様子を1度ご覧ください*

https://qiita.com/degudegu2510/items/e8b2809ee7c06a22afe1


## ロゴを変えた背景
ロゴアイコンを変えた理由は２つあります。

### 1. ロゴアイコンが扱いづらい
イベントのロゴは、いろいろなところで使われます。
OGPやバナー、LP、ツイート画像、など...

いろいろなサイズ、形があるため、
横長のロゴアイコンだと、視認性が低くなる
画像が多くなってしまいます。

視認性が低いロゴになってしまうと、
イベントの印象や認知に課題が出ます。

そのため、テキストアイコンを
やめることにしました。

　


### 2. Qiita Engineer Festaを連想しにくい
Qiita Engineer Festaは、
2021年からスタートしたイベントです。

そこまで認知度も高くないうえに、
`Engineer Festa`を`EF`と省略しても
`Engineer Festa`は連想できません。

多くの略語は、元の単語が浸透したときに、
元の単語が喋りにくく、長い時に登場します。

*例) ワンピース → ワンピ*
*例) 鬼滅の刃 → 鬼滅*


## まとめ
以上のことから、ロゴ変更をまとめると...

:::note alert
2021年のロゴを作成している時に、
使う場所や認知のしやすさも考慮せず、
デザイン先行で作成した。
:::

そのため、使いやすさと認知の向上させるため
テキストアイコンからアイコンに変更し、
*スタイリッシュ*なロゴにしました。


---

最後まで読んでくださってありがとうございます！

X(Twitter)でも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/degudegu2510
スマホでBLEをNodeJSチャレンジ(失敗)

AndroidスマホにてWebBluetoothでは実施済みだが、登録機器にアプリ立ち上がり時に自動接続を試したいことから、WebBluetooth<->ネイティブで実現できる自動接続を模索
スマホにNodeJS立ち上げてなんとかできないか？検証メモ

### 利用スマホ

* Pixel3 Android os 12
https://ja.wikipedia.org/wiki/Pixel_3

* A20  Android os 11
https://www.galaxymobile.jp/galaxy-a20/

### × Servers UltimateアプリでNodeJSサーバー

NodeJSサーバーが実行できるとのことで試す
Nodeサーバーがうまく立ち上がらず断念
ディレクトリのアクセスがAndroidOSで難しくなったせいなのか？？？
原因は解明の前に次の方法へ

#### 参考URL

https://play.google.com/store/apps/details?id=com.icecoldapps.serversultimate&hl=ja&gl=US

### △ TermuxアプリでNodeJSインストール

apt updateなど更新を実施してからNodeJSインストールできた
アクセス可能なディレクトリでサーバー自体は立ち上がった
その後に、参考サイトであるようなBLEライブラリがインストールできず断念。。

メモ的にですが「termux-setup-storage」でストレージアクセス可能な設定をするが
参考サイトで表示されるようなディレクトリは表示できず。。

```
apt update
apt upgrade
apt install coreutils
apt install nodejs
termux-setup-storage
cd storage/shared/android/data/files
```

疑似root化も試すが、アクセスできず。。

```
apt install proot
termux-chroot
termux-setup-storage
cd storage/shared/android/data/files
```


#### 参考URL

https://play.google.com/store/apps/details?id=com.termux&hl=ja&gl=US

https://qiita.com/basictomonokai/items/30abb2e49ff960758f9a#%E8%87%AA%E4%BF%A1%E3%81%8C%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7teratail%E3%81%AB%E8%81%9E%E3%81%84%E3%81%A6%E3%81%BF%E3%81%9F

https://nodered.org/docs/getting-started/android

https://memo.appri.me/iot/nodejs-ble-peripheral


### △ TermuxアプリでNode-REDするBLEノード

Node-RED自体はインストールできてServerも立ち上がった
利用しようとした「node-red-contrib-generic-ble」ノードは
ARM64じゃないとダメエラーがでたり、ノード追加に失敗。。

ラズパイじゃないと良くないのか。。
他BLEで検索したノードも失敗ばかりなので断念。。


```
apt update
apt upgrade
apt install coreutils nano nodejs
npm i -g --unsafe-perm node-red
node-red
```


#### 参考URL

https://flows.nodered.org/node/node-red-contrib-generic-ble

https://nodered.org/docs/getting-started/android

https://qiita.com/youtoy/items/3db10e1042a5f2af27a0
Lz4.jsとfflateの性能比較

圧縮アルゴリズムの一つに、LZ4というのがあります。
圧縮が早く、展開が非常に高速として有名で、サーバー間通信などで使われています。

このLZ4のJavaScript実装として、Lz4.jsがあります。
このLz4.jsの性能は、他の圧縮系ライブラリと比較してLZ4の特徴通り高速なのでしょうか。
> 推測するな、計測せよ

ということで、ベンチマークを取ってみることにしました。

## 実験

比較対象として、fflateを用います。
fflateはJavaScriptでDeflate圧縮展開を行うライブラリです。
同様のライブラリとして有名なpakoと比較して、圧縮展開が高速で、ファイルサイズも小さく、ZIPサポートやマルチスレッド対応など機能が追加されています。

ベンチマーク条件
- ブラウザ上で実行
- 圧縮・展開するファイルは約5MBのテキスト（C/Migemoの辞書）

## 結果

さて、結果は以下の通り

|ライブラリ|level|圧縮時間|展開時間|サイズ比|
|:---:|:---:|:---:|:---:|:---:|
|fflate|0.0|23.7|6.0|1.000078|
|fflate|1.0|183.8|79.8|0.398835|
|fflate|2.0|199.5|65.5|0.391483|
|fflate|3.0|221.7|42.4|0.386562|
|fflate|4.0|248.5|42.1|0.382764|
|fflate|5.0|255.7|42.1|0.382753|
|fflate|6.0|346.2|40.3|0.378795|
|fflate|7.0|389.3|41.0|0.378133|
|fflate|8.0|465.8|40.4|0.377853|
|fflate|9.0|467.9|40.5|0.377850|
|lz4js|NaN|82.2|29.3|0.584434|

グラフにしてみましょう。
まず、サイズ比と圧縮時間のグラフです。

![a1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105381/75db0fdc-efd1-34fd-1796-abbc45d66c12.png)

fflateは圧縮レベルを0から9まで設定できます。
このうち、無圧縮の0を除いた1から9までの圧縮レベルによる結果が青色のプロットです。
圧縮レベルを大きくするほど、ファイルは小さくなりますが、圧縮時間は大きく伸びます。
オレンジ色でプロットしたLz4.jsは、fflateと比較して約半分の圧縮時間、1.5倍のファイルサイズとなりました。

LZ4の圧縮が高速という特徴どおり、Lz4.jsにおいても圧縮は高速です。

次に、サイズ比と展開時間のグラフです。

![a2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105381/c0c4bf4f-7063-4b65-fe4c-e4567b60cb27.png)

fflateでは圧縮レベルが大きいほど、展開が早くなっています。
圧縮レベル1・2は特に遅いですね。

Lz4.jsの展開時間はfflateの約3/4倍であり、やはり早いです。

## まとめ

まとめると、Lz4.jsはLZ4アルゴリズムの特徴どおり、圧縮展開が高速です。
fflateと比較して圧縮時間は1/2、展開時間は3/4と小さくなります。
一方、圧縮後ファイルサイズはDeflateアルゴリズムに劣り、圧縮後は1.5倍のファイルサイズになるため、使い所を見極める必要があります。

## 補足

fflateの開発者も指摘していますが、Node.jsにはネイティブ実装のDeflateアルゴリズムがあります。
Node.jsでDeflateアルゴリズムを使うなら、fflateよりもzlibパッケージを検討すべきです。

> Before you decide that fflate is the end-all compression library, you should note that JavaScript simply cannot rival the performance of a native program. 
> https://github.com/101arrowz/fflate

fflateのデフォルトの圧縮レベルは6です。
高速に圧縮する圧縮レベル1と比較して、圧縮レベル6は約2倍の圧縮時間のわりに、ファイルサイズはあまり変わりません。
今回の実験結果から、圧縮レベル3～5がちょうどいいのではないかと思います。
PytorchのData Augmentationではまった話

PytorchのDataAugumentationで大いにハマりました。

torchvisionのtransforms.ImageFolderで以下のように変換処理を書いてトレーニングをしようとしていました。
```python
    data_transform = {
        'train': transforms.Compose([
            transforms.RandomResizedCrop(
                image_size, scale=(0.5, 1.0)
            ),
            transforms.RandomHorizontalFlip(),
            transforms.RandomRotation(degrees=[-15, 15]),
            transforms.RandomErasing(0.5),
            transforms.ToTensor(),
            transforms.Normalize(mean, std),
        ]),
        'val': transforms.Compose([
            transforms.Resize(image_size),
            transforms.CenterCrop(image_size),
            transforms.ToTensor(),
            transforms.Normalize(mean, std)
        ])
    }

    train_dataset = torchvision.datasets.ImageFolder(root=train_image_dir, transform=data_transform['train'], loader=myloader)
    val_dataset = torchvision.datasets.ImageFolder(root=val_image_dir, transform=data_transform['val'], loader=myloader)
```

ただ、トレーニングを始めようとすると以下のエラーを出します。
```terminal
AttributeError: shape. Did you mean: 'save'?
```

原因は、`transforms.RandomErasing`の場所でした。
[Pytorchの公式ドキュメント](https://pytorch.org/vision/main/generated/torchvision.transforms.RandomErasing.html)を読むと
> Randomly selects a rectangle region in an torch Tensor image and erases its pixels. This transform does not support PIL Image.

とあり、RandomErasingはPILimageには適応できないと書いてありました。
なので、ToTensorでTensorに変換した後に記述しないとうまく読み取ってくれないようです。

以下のように直すとうまく動きました！
```python
    data_transform = {
        'train': transforms.Compose([
            transforms.RandomResizedCrop(
                image_size, scale=(0.5, 1.0)
            ),
            transforms.RandomHorizontalFlip(),
            transforms.RandomRotation(degrees=[-15, 15]),
            transforms.ToTensor(),
            transforms.Normalize(mean, std),
            transforms.RandomErasing(0.5),
        ]),
        'val': transforms.Compose([
            transforms.Resize(image_size),
            transforms.CenterCrop(image_size),
            transforms.ToTensor(),
            transforms.Normalize(mean, std)
        ])
    }

    train_dataset = torchvision.datasets.ImageFolder(root=train_image_dir, transform=data_transform['train'], loader=myloader)
    val_dataset = torchvision.datasets.ImageFolder(root=val_image_dir, transform=data_transform['val'], loader=myloader)
```

結局、データセットが悪いのか、モデルが悪いのか、、、学習はうまくいきませんでしたが、、、、
【Qiita】目次が消えたと思ったら仕様変更だった

### 0.背景
久しぶりにQiitaに投稿しようと自分の過去の記事を見返していたところ、目次が消えていることに気づきました。
※目次は画像の赤枠の箇所のことです。
![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689555/b850427b-bcff-5300-ecd9-44ae2824cdf2.png)

### 1.使用環境
- windows10 バージョン21H2

### 2.原因
2022年2月24日に、Qiitaのmarkdownパーサーに変更があり、「見出しの後にスペースがないこと」が目次が消えた理由でした。
[QiitaのMarkdownパーサー変更にともなう、見出しについてのいろいろな書き方と注意点](https://qiita.com/degudegu2510/items/a4dbf82d15d80d8bd17e)

スペースを増やすことで見出しとして認識され、目次が再度表示されました。
他にも自分がよく使用していた強調も、頭に#を3つつける仕様に変更になっていました。
順次修正をしていきたいと思います！

お困りの方が居たら是非参考にしてください！
【Rails】RuboCopの導入

## Gemのインストール
RuboCopをGemfileに追加し、インストールします。

```Gemfile
group :development do
  gem 'rubocop', require: false
  gem "rubocop-performance", require: false
  gem "rubocop-rails", require: false
  gem "rubocop-rspec", require: false
end
```
```:ターミナル
$ bundle install
```

## 設定ファイルの作成
`.rubocop.yml`を作成します。
```.rubocop.yml
inherit_from: .rubocop_todo.yml
require:
  - rubocop-performance
  - rubocop-rails
  - rubocop-rspec
AllCops:
  NewCops: enable
```
以下のコマンドで`.rubocop_todo.yml`を作成します。

```:ターミナル
$ rubocop --auto-gen-config
```
【Mac】PDF→SVGに素早く変換！Automatorでクイックアクションを作ってみよう

Mac標準で備わってる機能「クイックアクション」。ファイルを右クリックすると実行できて、イメージ変換できたり、jpgをまとめてpdfにしたり、意外と便利です。でもPDF→SVGの変換アクションは用意されていないので、Automatorを使って作ってみましょう。
## 1. pdf2svgをインストール

```bash
brew install pdf2svg
```
## 2. Automatorでクイックアクションを新規作成

![s1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727397/c6038e7f-c212-af53-2207-3967b1047113.png)

## 3. ワークフローを作成
以下のようにワークフローを追加してください。
![s2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727397/31c657b2-4c94-c780-2f29-a4747a5b4ee0.png)
最後のシェルスクリプトのコードは
```shell
size=`expr ${#@} / 2`
for i in `seq 0 $size`; do
    f=${!i}
    name=${f%.*}
    /opt/homebrew/bin/pdf2svg "$f" "$name.svg"
    # 変換元がいらない場合は以下を実行して削除
    # rm "$f"
done
```
こんな感じです。Automatorのシェルクスプリト実行環境では、pdf2svgをフルパスで実行しないと、うまくいかなかったので
```bash
which pdf2svg
# >>> /opt/homebrew/bin/pdf2svg
```
としてパスを取得しました。
できたらcmd+sでpdf2svgという名前をつけて保存します。

## 実行の確認
試しに適当なpdfファイルを右クリックして、クイックアクションからpdf2svgを実行してみましょう。複数まとめての実行もできます。
<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727397/754d6715-2b69-f980-f31d-cb9831837f62.png" alt="s3.png"/>
filename.svgが作成されると思います。
以上が、AutomatorでPDF→SVGの変換クイックアクションを作成する流れでした。
終わり(☝ ՞ਊ ՞)☝
【NestJS】GCSからSigned URLをクライアントサイドに返却するアレコレ

# 概要

`Cloud Storage`に保存している画像の`Signed URL`をクライアントサイドに返却するまでのプロセスをまとめる

https://cloud.google.com/storage/docs/access-control/signed-urls

# やり方

```ts
@Injectable()
export class GcpClientService {
    private readonly storage: Storage
    private readonly auth: GoogleAuth

    constructor(
        private configService: ConfigService
    ) {
        // https://www.npmjs.com/package/@google-cloud/storage
        this.storage = new Storage({
            projectId: this.configService.get('gcp.projectId'),
            authClient: this.auth,
        })
    }

    async downloadFiles(id: string, file_tree_id: number) {
        const fileMap = await this.backupFileMapRepository.findOne({
            where: {id: file_tree_id, is_latest: true},
        })

        if (!fileMap) {
            throw new NotFoundException('ファイルツリーが見つかりませんでした')
        }

        const storage = this.gcpClientService.getStorage()

        return await storage
            .bucket(contractor.gcp_storage_bucket_name)
            .file(`${id}/blob/${fileMap.file_hash}`)
            .getSignedUrl({
                action: 'read',
                expires: Date.now() + 15 * 60 * 1000,
                queryParams: {
                    'response-content-disposition': `attachment; filename=${path.basename(
                        fileMap.path
                    )}`,
                },
            })
    }
}
```
(n)vim で C++ コードのチェックの俺得設定のメモ

## clang-format

https://github.com/rhysd/vim-clang-format

```
:ClangFormat
```

でいけます!

## ale(linter)

https://github.com/dense-analysis/ale

エラー間のジャンプを `Ctrl-k`, `Ctrl-j` にマッピング

```
nmap <silent> <C-k> <Plug>(ale_previous_wrap)
nmap <silent> <C-j> <Plug>(ale_next_wrap)   
```

環境によっては編集中インタラクティブにチェックだともっさりしたりします.

```
" Write this in your vimrc file
let g:ale_lint_on_text_changed = 'never'
let g:ale_lint_on_insert_leave = 0
" You can disable this option too
" if you don't want linters to run on opening a file   
let g:ale_lint_on_enter = 0  
```

で, 保存時のみにチェック.
また, デフォルトでは読み込み時にも linter が走るので, 初回読み込み時に処理したくないときは `ale_lint_on_enter` で調整します.

## TODO

* [ ] clang-tidy でソースコード修正(`-fix-errors`)の方法を探す.
Nuxt 3 の Server Middleware を使って Basic 認証を実装する

## 概要

タイトル通り、Nuxt 3 の [Server Middleware](https://v3.nuxtjs.org/guide/features/server-routes/#server-middleware) を使って Basic 認証を実装してみたいと思います。

- Server Middlewareとは
    - サーバーリクエストの際に実行される関数
    - 「server/middleware」以下にファイルを置く事で自動的に読み込まれる

> Nuxt will automatically read in any file in the ~/server/middleware to create server middleware for your project.
>
> Middleware handlers will run on every request before any other server route to add check and some headers, log requests, or extend the event's request object.
> 
> 出典: https://v3.nuxtjs.org/guide/features/server-routes/#server-middleware

Nuxt.js で作ったアプリに Basic 認証を導入する方法としては [nuxt-basic-auth-module](https://github.com/potato4d/nuxt-basic-auth-module) などのライブラリを使用するパターンも考えられますが、今回はライブラリ未使用で進めます。

## 実装

```
$ touch .env
$ mkdir -p server/middleware
$ touch server/middleware/basicAuth.ts
```

```:./.env
BASIC_AUTH_ENABLED=true
BASIC_AUTH_USER=user
BASIC_AUTH_PASSWORD=password
```

```ts:./nuxt.config.ts
import { defineNuxtConfig } from "nuxt";

// https://v3.nuxtjs.org/api/configuration/nuxt.config
export default defineNuxtConfig({
  privateRuntimeConfig: {
    basic_auth_enabled: process.env.BASIC_AUTH_ENABLED,
    basic_auth_user: process.env.BASIC_AUTH_USER,
    basic_auth_password: process.env.BASIC_AUTH_PASSWORD,
  },
});
```

```ts:./server/middleware/basicAuth.ts
export default defineEventHandler((event) => {
  const config = useRuntimeConfig();

  /* Basic 認証が不要な場合（開発環境など）は 「.env」 内の BASIC_AUTH_ENABLED を「false」に変更すれば OK */
  if (config?.basic_auth_enabled !== "true") return;

  const base64Credentials = event.req.headers?.authorization?.split(" ")?.[1];

  if (base64Credentials) {
    const credentials = Buffer.from(base64Credentials, "base64").toString("ascii");
    const [username, password] = credentials.split(":");

    if (
      username === config?.basic_auth_user &&
      password === config?.basic_auth_password
    ) return;
  }

  event.res.statusCode = 401;
  event.res.setHeader("WWW-Authenticate", 'Basic realm="Secure Area"');
  event.res.end("Unauthorized");
});
```

## 動作確認

![スクリーンショット 2022-07-01 2.26.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/710574e6-f050-cffb-a8fa-15de0c1ceebb.png)

[http://localhost:3000](http://localhost:3000/) にアクセスして Basic 認証が作動していれば成功です。

## あとがき

以上、Nuxt 3 の Server Middleware を使った Basic 認証の実装方法についてでした。
MacのFinderからパワポを開くよりVimから開いた方が早くない？と思ったので開けるようにした

## はじめに（動機）
こんにちは、Mac の Finder を使いこなせないものです。
私は、キーボードで操作が完結することに憧れておりファイルを開く時も Finder ではなく、Vim の `NERDTree` を使うように心がけています。
つまり、Finder を `NERDTree` で代用して使っています。
しかし、どうしても Finder を使わなければいけない要件として、 PowerPoint や Excel、PDF などのファイルを開くときがあります。
これらのファイルは Vim 上で開いても（基本的には）意味をなさず、それぞれに対応したアプリケーションで開く必要があります。
そのため、これらのファイルを開く時は、なくなく Finder アプリを使っていました。


しばらく経ち・・・そろそろ我慢の限界がきたということで、 `NERDTree` から直接 PowerPoint、Excel、PDF を開けるようにしてみました。

## 設定
以下の設定を `.vimrc` に追加すれば動くと思います。
NERDTree がインストールされていることが前提となりますので、インストールされていない方は [こちら](https://github.com/preservim/nerdtree) からインストールしてみて下さい。

```.vimrc
" PowerPoint を開けるように
command P let $NERDTREE_FILE_PATH = expand('%:p:h') . '/' . split(getline('.'), "]")[1][2:] | :silent ! open -a "/Applications/Microsoft PowerPoint.app" "$NERDTREE_FILE_PATH"
" Excel を開けるように
command E let $NERDTREE_FILE_PATH = expand('%:p:h') . '/' . split(getline('.'), "]")[1][2:] | :silent ! open -a "/Applications/Microsoft Excel.app" "$NERDTREE_FILE_PATH"
" Preview(pdf閲覧アプリ) を開けるように
command V let $NERDTREE_FILE_PATH = expand('%:p:h') . '/' . split(getline('.'), "]")[1][2:] | :silent ! open -a "/System/Applications/Preview.app" "$NERDTREE_FILE_PATH"
```

## 使い方
操作は非常に簡単で開きたいパワポファイルの上にカーソルを合わせて `:P` でコマンドを実行するだけです。
上記の設定だと以下のコマンドでそれぞれのファイルを開くことができます。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264399/78186618-ee32-f01a-ed49-2c38bb35db58.gif)

|  コマンド  |  内容  |
| :----: | :----: |
|  `:P`  |  選択されたファイルを PowerPoint で開く  |
|  `:E`  |  選択されたファイルを Excel で開く  |
|  `:V`  |  選択されたファイルを View で開く  |

## 注意点
いくつか癖があるのでご紹介します。

### 1. 深い階層にあるファイルを開く場合は、`cd` を打ってからコマンドをうつようにする
`NERDTree` で選択しているルートディレクトリよりも深い階層のファイルを開く場合は、開く前に、開きたいファイルがあるディレクトリにカーソルを合わせた状態で `cd` をうつ必要がある。
この操作をすることによって、カーソルがあるディレクトリに `CWD` （自分がいるディレクトリ）を変更することができる。

### 2. 開いた後、ターミナルが真っ白になる
開いた後になぜかターミナルの表示が消えてしまいます。
この事象が自分の環境にだけ起こるのかが分かっていませんが、少なくとも自分の環境ではこのようなことが起こってしまいます。(iTerm2 を使用)
この時私は、`?` を二度押すことによって表示を元に戻しています。
`?` は `NERDTree` で help を出す操作であり、help 画面の ON/OFF を切り替えることで、表示のリセットをしています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264399/c402f044-311b-b0d1-b49f-b4488f21e877.png" width=70%>

## おわりに
なんとなくで始めたところ意外と体感がよく、普通に使えています。
とはいえ、`Finder` を代替できる、とは言えないため、`fzf` などを試しつつ引き続き改善を加えていきたいと思います。（いい感じのができたら続編を書きたいと思います）
自己満足の記事でしたが、最後まで読んでくださりありがとうございました。
デプロイ時に起きたエラー　H10 App crashedについて

# デプロイ時に起きたエラーについて
こんにちは、今日はherokuにデプロイする際に起きたエラーについてと解決までの過程を書いていきま。

## 状況と、エラー内容
とはいっても、エラーに関するlogが何処かに行ってしまい、曖昧な記憶でお届けします。（じゃあ書くな）
状況として、アプリケーションをデプロイした際、本来表示されるはずのものがされず、あんたがこのオーナーならlogs見てや。のやつが出てきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2713246/5c03048a-9db0-20b5-7a85-d68913380940.png)
logを確認すると
```
heroku[router]: at=error code=H10 desc="App crashed" 
```
と表示、http statusは、503が出ていました。
ここで、503について調べてみましたが、特に有力な情報はなし、原因を探るため```heroku run rails c```でコンソール上で詳細なエラーコードを確認すると、
```
Could not load the 'mysql' Active Record adapter. Ensure that the adapter is spelled correctly in config/database.yml and that you've added the necessary adapter gem to your Gemfile. (LoadError)
```
mysqlになにかありそう？？翻訳すると

'mysql' ActiveRecordアダプターをロードできませんでした。 アダプターのスペルがconfig / database.ymlで正しく設定されていること、および必要なアダプターgemがGemfileに追加されていることを確認してください。 （LoadError）

とのことで、私はスペルミスの常習犯なので、スペルを確認することに。
```heroku config```で```DATA_BASE_URL、CLEARDB_DATABESE_URL```を確認、
```
DATABASE_URL:             mysql://*********
CLEARDB_DATABESE_URL:     mysl://********
```
案の定、スペルミスってました ^o^
本来は、
```
DATABASE_URL:             mysql2://*********
CLEARDB_DATABESE_URL:     mysql://********
```
こうしたかった。
## エラー対応

DATABASE_URLを再度設定したいので、```heroku config:set DATABASE_URL='mysql2://********'```で再設定、```heroku config```で確認すると、
```
DATABASE_URL:             mysql2://*********
DATABASE_URL:             mysql://*********
```
ありゃ？二個できてる。てことで```heroku config:unset DATABASE_URL```で最初のDATABASE_URLを削除。
CLEARDB_DATABESE_URLについては、urlをコピーしておいて、先に```unset```で削除してから`set`で再設定。
`heroku config`。
```
CLEARDB_DATABASE_URL:     mysql:/
DATABASE_URL:             mysql2:/
```
無事設定でき、エラーも解決しました。
UE5 コントロールリグメモ


AnimationBlueprintで既にアニメーションしていて
そこから更に変化をつけたいときに設定。
手を上にあげたり下げたりなど…

# Control Rigを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/5ad47453-bedd-57d8-b329-0cabafdc5b47.png)

skeletonを右クリック Create > Control Rig


# コントローラーの追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/94179a36-fd10-c9af-bff6-05c93e0ee8e5.png)

# 作成したコントロールをスケルトンからペアレント化解除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/1f3366a4-b4fe-d98a-c74d-67cab0e45658.png)
選択した状態でSHIFT＋Pを押すとスケルトンの階層の下に追加される

# プレビューアニメーションの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/3a694d66-d05f-a299-36c9-3e2860764aae.png)


Preview Controller　を　defaultからUseSpecific Animationに変更

# 位置とか回転とか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/eb948cf7-4bdc-da30-d96b-9ba027a9a064.png)

Initial、Offsetを設定する

# RigGraphでコントローラとBoneを紐づける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/3b180541-7b55-f538-21ad-613d80bbb11d.png)

操作したいコントローラーをDragしてGet Control
変更させたいBoneをDragしてSet Bone

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/e7ff5389-bc64-7b2e-ef8a-90997714ab27.png)

影響を与えたいパラメータを代入する

# AnimetionBlueprintでControlRigを設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/0445d939-f672-9f68-372f-e9bccd69708f.png)
Alphaで値を変化させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/2abf038d-6cbe-58f0-4318-49d8befd3561.png)

操作するRigClassを設定する


# Transformを変化させることでコントロールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/c71ea968-4f78-6438-eb6c-17d3921da510.png)

ABPで変数化してTransformで操作する
この場合はRotationのxを増減すると手を上にしたり下にしたり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/d3423f11-64f2-3b1e-15df-b175742e80f6.png)

コントローラを直接操作することも可能
Transformで操作できるので分解して必要な個所を操作
↑は見ている方向をLookDirで入力
角度の上限(首の向ける方向)を制限をClampする
PHPでランダムな時間を生成

**PHP Ver8.1.3**

DBにぶっこんだら0埋めしてくれそうだけど、これの出力値は0埋めされていません。

```php
for($i = 0; $i < 5; $i++){
    $randomYmdhis = '2022' . '/' . '06' . '/' . rand(1, 30) . ' ' . rand(0, 23) . ':' .  rand(0, 59) . ':' . rand(0, 59);
    echo $randomYmdhis . "\n";
}
```


```
2022/06/19 20:12:27
2022/06/26 4:45:48
2022/06/7 7:57:11
2022/06/28 4:36:49
2022/06/1 11:24:47
```

時間計測(1000件)
```php
$start = microtime(true);

for($i = 0; $i < 1000; $i++){
    $randomYmdhis = '2022' . '/' . '06' . '/' . rand(1, 30) . ' ' . rand(0, 23) . ':' .  rand(0, 59) . ':' . rand(0, 59);
    echo $randomYmdhis . "\n";
}

echo microtime(true) - $start;
```

```
0.0018651485443115
```

### 時間計測の記事参考
[PHPの処理速度を計測](https://qiita.com/ao_love/items/a2d8b8566d0426195002)
Python Tkinter 画像が表示されず、背景だけが表示される

pythonでTkinterを使った際、画像が表示されず、canvasの背景のみ表示された。
# 原因
canvasのメソッドcreate_imageは次の処理が始まる直前に描画される。そのため、以前では画像が表示されていたのに、最後の処理だけ行われないならこの記事で解決できるだろう。


# 失敗コード(関係ないとこは省略)
```php
window=tkinter.Tk()
・・・#いろんなコード。imgを参照したりtkinterをimportしたり
canvas = tk.Canvas()
canvas.create_image(image=img)
・・・#またいろいろ
canvas.pack()
#終了
```
imgが出力されず、背景だけ出力される
# 正しいコード
```php
window=tkinter.Tk()
・・・#いろんなコード。imgを参照したりtkinterをimportしたり
canvas = tk.Canvas()
canvas.create_image(image=img)
・・・#またいろいろ
canvas.pack()

window.mainloop()
#終了
```
window.mainloop()はwindowを開け続け、次の処理を待つメソッド。これを最後に追加することで直前のcreate_imageが処理される。
AWSハンズオン備忘録

# AWSハンズオン備忘録

普段の開発では使っていないサービスをいろいろ触ってみたときの備忘録です。随時追記していきます。
|キーワード|ハンズオンサイト|メモ
|--|--|--|
|Transit Gateway|https://dev.classmethod.jp/articles/transit-gateway-vpc/|Transit Gatewayを使ってVPC間を接続してみるハンズオンでした。Transit GatewayはVPC間の接続を直感的に設定できて、使いやすいサービスですね。|
|Storage Gateway|https://dev.classmethod.jp/articles/storage-gateway-20181122/|自宅環境にFile Gatewayを作ってみたかったのですが、GatewayのVMを動作させるための要求スペックが高くて（メモリ16GB以上）断念。ハンズオンサイトと同じようにEC2をGatewayとして動かすパターンで試してみました。NFSマウントして書き込んだファイルが、確かにS3に保存されているなというのが確認できました。|
|EFS|https://dev.classmethod.jp/articles/lim-efs-hands-on/|EFS用のエージェント（amazon-efs-utils）をインストールしておくと簡単なコマンドでマウントできます。|
|VPN|https://www.garokokko.com/awsvpn/|最初にvyos 1.4を使ってしまってハマったので、手順を[別ページ](https://qiita.com/kizitorashiro/items/538e7f58725539e6bd12)に残しておきました。|
|Redshift|AWSではじめるデータレイク|AWSのエンジニアの方が書かれている技術書です。Redshift以外にもGlueやAthenaのハンズオンも載っていて勉強になりました。|
|Redshift Serverless|https://dev.classmethod.jp/articles/i-tried-using-amazon-redshift-serverless/|Redshiftクラスタを自前で作った後でServerlessを試したので、ありがたみがわかりました。|
collectAsStateWithLifecycleが追加されたぞ

## はじめに
こんにちは、どすこいです。
Androidエンジニアのみなさん、Compose楽しんでますか？
僕は楽しんでます。

今回jetpackの`lifecycle-runtime-compose:2.6.0-alpha`で`collectAsStateWithLifecycle()`なるものが追加されたので早速触っていきたいと思います。

## 前提
まずComposeで扱う値をUiStateにまとめたものとします。
そのUiStateをViewModel側でStateFlowとして持っているという状態です。

こんな感じ

```kotlin:MainViewModel.kt
class MainViewModel : ViewModel() {
    val _state: MutableStateFlow<UiState> = MutableStateFlow(UiState())
    val state: StateFlow<UiState> = _state.asStateFlow()

    data class UiState(
        val hoge: String = ""
    )
}
```

このStateFlowをComposable側で監視する際にどうやっていくのかを見ていきます

## 試してみる

### Lifecycleを考慮しない場合のStateFlowの監視方法
これだとLifecycleが何も考慮されてないのでアプリがバックグラウンドにある状態でStateFlowが更新されるとrecompositionされてしまうと思います。

```kotlin
@Composable
fun MainScreen(mainViewModel: MainViewModel) {
	val state by mainViewModel.state.collectAsState(initial = MainViewModel.UiState())
}
```

### Lifecycleを考慮した場合のStateFlowの監視方法
こちらだと`flowWithLifecycle`を使っており、中で`repeatOnLifecycle`を使っているので、指定した`Lifecycle.State`外でStateFlowが更新されてもrecompositionされません。
つまり`Lifecycle.State.STARTED`から`Lifecycle.State.STOPED`より外でStateFlowが変更されてもrecompositionされないというわけですね。
ただ毎回これを書くのはめんどくさいので、多くのエンジニアは独自で共通の関数を作ってたと思います。

```kotlin
@Composable
fun MainScreen(mainViewModel: MainViewModel) {
	val lifecycleOwner = LocalLifecycleOwner.current
	val flowLifecycleAware = remember(key1 = mainViewModel, key2 = lifecycleOwner) {
		mainViewModel.state.flowWithLifecycle(lifecycleOwner.lifecycle, Lifecycle.State.STARTED)
	}
	val state by flowLifecycleAware.collectAsState(initial = MainViewModel.UiState())
}
```

### `collectAsStateWithLifecycle()`を使った場合の監視方法

[こちらのIssueTracker](https://issuetracker.google.com/issues/230557927)にもあるように、デフォで上記のことをやってくれる関数を用意してくれとの要望があったそうです。
Googleさんはとても優しいのでLifecycleを考慮した`collectAsState`を用意してくれました

```kotlin
@ExperimentalLifecycleComposeApi
@Composable
fun <T> Flow<T>.collectAsStateWithLifecycle(
    initialValue: T,
    lifecycle: Lifecycle,
    minActiveState: Lifecycle.State = Lifecycle.State.STARTED,
    context: CoroutineContext = EmptyCoroutineContext
): State<T> {
    return produceState(initialValue, this, lifecycle, minActiveState, context) {
        lifecycle.repeatOnLifecycle(minActiveState) {
            if (context == EmptyCoroutineContext) {
                this@collectAsStateWithLifecycle.collect { this@produceState.value = it }
            } else withContext(context) {
                this@collectAsStateWithLifecycle.collect { this@produceState.value = it }
            }
        }
    }
}
```
デフォルトの`minActiveState`が`Lifecycle.State.STARTED`なので特にこちら側で何か指定しない限りは`Lifecycle.State.STARTED`から`Lifecycle.State.STOPED`まではrecompositionしてくれますが、それより外のLifecycleでStateFlowが更新されてもrecompositionされないということですね。
下が実装例です。

```kotlin
@Composable
fun MainScreen(mainViewModel: MainViewModel) {
	// デフォがLifecycle.State.STARTEDなので基本的には何も指定しなくて良い
	val state by mainViewModel.state.collectAsStateWithLifecycle()
}
```

## 注意
artifactが`lifecycle-runtime`ではなくて、新しく追加された`lifecycle-runtime-compose`なので注意
あとはまだalpha版なので実戦投入するときは注意してください。
SwiftUIでSmartNewsライクなページメニューを実装

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102821/c0e4eaa5-4ed0-4fba-4d6f-c4530876d520.gif)

## SwiftUIで開発を始めた経緯

SwiftUIはApple社が開発した新しいフレームワークで、WWDC 2019で発表され、現在もバージョンアップを繰り返しながら進化しています。

SwiftUIが発表されるまでは、Storyboardを使った開発のみが可能でした。Storyboardは直感的にデザインを組めますが、さまざまな端末サイズへの対応、動的なコンテンツの表示非表示、チームでの開発の観点から見た時、面倒事が起こる場合が多いです。コードのみで開発すれば動的なコンテンツや、コンフリクトを防げますが、コードの可読性の観点からあまりいいとは言えませんでした。また、最近のXcodeは、Storyboardを使うとビルド時間が長くなりがちで、多くの待ち時間が発生している状態でした。

そこで本格的にSwiftUIへの乗り換えの検討を始めました。

ここ1ヶ月、本格的にSwiftUIを触り始めたのですが、Storybaordで感じていた煩わしさが一掃されているだけでなく、簡単にリッチなUIやアニメーションを少ないコードで実現でき感動しました。

Storyboardではページごとの確認も手間でしたが、SwiftUIのプレビュー機能で、ページを、複数の端末サイズ一度に確認することができます。アプリ開発を着手し始めたばかりであったり、これからアプリを一から作る人は、SwiftUIをお勧めします。

SwiftUIを導入しない理由として、ライブラリが少ないと考える人も多いかもしれません。しかし、複雑なUIやアニメーションを、少ないコードで実現できるので、SwiftUIが慣れてきてからは、UI関連のライブラリの必要性をほとんど感じません。今回作ったページメニューも、数時間ほどで作ることができました。

## ページメニューを実現する

現在開発中のアプリは、SmartNewsのようなページタブがあるタイプのアプリです。当初はStoryboardを使用していたため、このUIを実現するために、[PagingKit](https://github.com/kazuhiro4949/PagingKit)を使用していました。他にもいろいろなページメニューのライブラリがありますが、導入方法であったり、ドキュメントを読んたりに時間がかかってしまいました。

ですが、SwiftUIを使えばそれらのライブラリを使うまでもなく、少ないコードで実現できました。まだまだ勉強中なのでもう少しいいやり方があるかもしれませんが、すこし齧っただけで作れてしまうので、SwiftUIの可能性を感じます。

ソースコードは[こちら](https://github.com/wataru-maeda/swiftui-smartnews-like-page-menu)に上げてあります。
IBM Technical Advocate v3 合格体験記

# 内容
IBM Cloudと関わる機会が増えたので。
IBM Technical Advocate v3を受験し、「IBM Certified Technical Advocate - Cloud v3」認定を取得しました。合格までの記録。

:::note warn
受験時点(2022年6月)の情報です
:::


# IBM Certified Technical Advocate - Cloud v3 とは
・1年未満の経験とクラウドの基礎知識を持つスキルレベルが認定されます。

・資格を得るためには、以下の試験に合格する必要があります。
　Exam C1000-125: IBM Cloud Technical Advocate v3

・合格するとこちらのバッヂがもらえます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648751/c6e2a2eb-d010-b647-b6d5-144b6375ff94.png)
・認定の概要はこちら。
　　https://www.ibm.com/training/certification/C0002202


# IBM Cloud Technical Advocate v3 試験の出題範囲・合格基準
・試験時間は90分
・64問中、42問以上の正解で合格
・試験は英語でした。
・[認定概要](https://www.ibm.com/training/certification/C0002202)に出題範囲の概要が記載されています。


# 勉強方法
+ やったこと
[認定概要](https://www.ibm.com/training/certification/C0002202)の中にLearning Pathへのリンクがあります。Learning Pathに沿って一通り取り組みました。
Learning Pathのリンク
　https://www.ibm.com/training/path/ibmcloudtechnicaladvocate-q12022

+ 学習の進め方
    + 一つの単元はそれほど長くなく、空き時間を使ってで少しずつ進めました。
　(テスト勉強期間は1週間程度)
    + 英語で読むと時間を消費するので(私の場合)、基本ブラウザの翻訳機能を使って読み進めました。
    + 翻訳に違和感があるところのみ英語で確認しました。
    + 本番に備え、単元ごとのチェックテストは英語でやりました。
    + AWSの知識があったことから、用語を置き換えて理解することで対応できる部分が多々ありました。


+ IBM Cloud Technical Advocate Assessment Exam
    + 有料のPreテスト（Learning Path内に受験リンクあり）
    + 本番と同じ問題数・英語で構成されている
    + 力試しによかったです。
    + 結果は84%。結果からIBM Cloudサービス関連が弱いことがわかり、本番前に見直ししました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648751/eec8f7a9-e4ce-adea-6a6c-aaf7fe86167c.png)


# 受験方法
PearsonVUEで申し込み、テストセンターで受験しました。

# 結果
+ たまたまですが、Assessment Examと同じく84%で無事合格しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648751/a1284709-a38e-2f47-7f67-36d743c79a35.png)
+ 合格通知（メール）は、午前に受験してその日の夕方に届きました。

# 感想
難易度は高くなく、Cloudの基礎知識に、IBM Cloudサービスの知識(概要レベル)を補強することで合格できました。
受験を通して、主要なIBM Cloud用語を幅広く抑えられたのでよかったです。
スイッチを押したらROS2 nodeを起動する（実装の備忘録）

## なぜこんなことしたか
スイッチおしたらwaypoint followのnodeを起動して、動きだす仕組みをつくりたかった
スイッチも複数（５個くらい）に増やせるので、follow waypointsのnodeも経路別で5個くらいつくっておいて
スイッチ１を押したら１の経路、スイッチ２をおしたら２の経路・・・これがしたいからです。

## 環境
ROS2、galactic、FT232H bord、スイッチ

https://akizukidenshi.com/catalog/g/gM-08942/

https://www.askul.co.jp/p/X364633/?sc_e=cp_p_as_go_pl_c_X364633&utm_source=go&utm_medium=PLA&utm_campaign=PLA_SSC_All&gclid=CjwKCAjwk_WVBhBZEiwAUHQCmSVP6kfWbu8cCZ4xN8V4hrkHzBCCNHoXe51vhr-P18ZbFKCGjyVRoRoCtykQAvD_BwE



## 設定
これ通り

https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/linux

## 回路図
別途作成し、更新予定ですが、以下リンクのDigital input通り

https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/gpio

## 実装
私はスイッチを押したらfollow_waypoints のnodeを起動する仕組みにしたかったので、start.pyを以下内容で作成する
```
cd ros2
sudo nano start.py
```
以下コードをコピー＆ペーストして保存。(ctrl+x→y)
```
import subprocess
from numpy import true_divide
import board
import digitalio
button = digitalio.DigitalInOut(board.C0)
button.direction = digitalio.Direction.INPUT

#follow_waypoints follow_waypointsの部分を自分が起動したいnodeにする
cmd = "ros2 run follow_waypoints follow_waypoints"

while True:
    if button.value == True:
        subprocess.run(cmd,shell=True)
```
上記コード内の以下の部分を自分が起動したいnodeに変更する。
"ros2 run follow_waypoints follow_waypoints"

```
cd ros2
python start.py
```

スイッチを押したら、follow_waypoints　nodeが起動します。

## うまくいかなかったら、これも実装する必要あるかも
setup.bashの自動読み込み

https://qiita.com/kazuki21057/items/fe40192beced06b2e723
dockerでnginx　関連メモ

設定ファイル名
nginx.conf

設定ファイルの場所
/usr/local/nginx/conf, /etc/nginx, or /usr/local/etc/nginx.

設定ファイルの構造
ディレクティブによって定義していく。
シンプルディレクティブとブロックディレクティブがある。
シンプルディレクテぶは名前、パラメータを空白で区切り;でしめる。
ブロックディレクティブは最後が;ではなく{}で終わり{}の中には別の指示が入る。
ブロックディレクティブの中でも{}の中にさらにディレクティブを定義しているものはコンテキストと呼ばれる。

設定ファイルないで一番上の階層にあるディレクティブ達はmainコンテキストの中にあるとされる。

基本構造
main {
  events {
  }
  http {
       port xx
      server {
      }
      location {
      }
   }
}
プログラミング未経験からSESで２現場を経験してスムーズに現場で活躍するための方法まとめ。

今年の4月から未経験から２つの現場を経験した中で、
いち早く現場に慣れるために行った事を０〜１ヶ月の間の中でまとめます。


０〜１週間目
①チームメンバーの顔と名前を覚える。
②  出勤なら会社の中でのルールを覚える。
③  現場で使用するツール（Slackやgit)などのチームのルールを覚える。

（詳細）
①まずは現場に参画して右も左もわからない状態。
　この１週間でチームメンバーの顔と名前を覚えなければ後になって、
　あれ？こんな人いたっけ？と思われてしまうような態度をとってしまったら、
　チームメンバーに不快感を与えてしまうので、意識して顔と名前を覚える。

②各現場には現場のルールがある。出勤ならばオフィスの決まり。
　セキュリティーが厳しい現場ならば個人のパソコンの持ち込みのルールやメール送信の際の
　決まりなどか細かく決められている場合があるのでわからない事はすぐに聞いておく。

③チームメンバーと連絡をとる手段としてteamsやslackなどがあるので、
　スムーズに連絡を取れるように基本的な操作はマスターしておく。
　またgitの操作、ブランチ名の付け方も現場によって変わってくるので、
　参画してから初めに細かく確認をとっておく。


１週間〜２週間目
①新規開発なら開発しようとしているサービスの理解。
　　改修案件なら今現在出来上がっているサービスの理解を深める。
②各項目事の質問、相談する上司の把握。

（詳細）
①新規開発＝チームで開発しようとしているサービスやターゲット層を調べておく事で、
　　　　　　タスクを振られて際にユーザー目線での開発ができるので、
　　　　　　よりユーザーが使いやすい仕様に近づける事ができる。

　改修案件＝改修案件ならば他の人が記述したコードを読んで機能追加や不具合修正を
　　　　　　行わなければならないのでまずは記述してあるコードを読んでいくのも大切だが
　　　　　　その前に一度出来上がっているサービスを全て自分で使用してみる事。
　　　　　　ページ数が多い機能ならば先に全ページを確認して
　　　　　　どのページにどんな機能があるのか？を大まかに把握しないと
　　　　　　機能の修正のタスクが来てもますどこのページの機能なのか？
　　　　　　を理解するのにかなり時間がかかってしまう。

２週間〜1ヶ月目。
①これから自分が現場で活躍していくための必要スキルを知る。

（詳細）
①チームメンバーにも馴染んである程度サービスの概要、サービスの理解が深まったことろで、
　これから自分に与えられそうなタスクや役割を把握して個人学習を行う。
　自分の場合初現場がバックエンドで参画したがvue.jsの改修を行う事が多く、
　参画してからはフロントのキャッチアップメインで行った結果、
　１ヶ月〜はスムーズに改修を行う事ができました。
『ホワイトハッカーの教科書』のすゝめ

# はじめに📖
[Qiita Engineer Festa 2022 「買ってよかった技術書を紹介しよう！」](https://qiita.com/official-campaigns/engineer-festa/2022)の参加記事となります。

# 概要👍
[ipusiron](https://twitter.com/ipusiron)さんの『ホワイトハッカーの教科書』は良いぞ！

https://twitter.com/ipusiron/status/1512698166457503744?s=20&t=leGwdRAnCs58OwziCGp5pQ

# ホワイトハッカーって響き、なんだかｶｺｲｲ👩‍💻
元々ipusironさんをフォローしていて、たまたま告知ツイートが流れてきたので勢いでポチりました。

https://twitter.com/choco_py3/status/1525046885152530432?s=20&t=leGwdRAnCs58OwziCGp5pQ

# 対象読者📕
超初級者・初級者
* 私のような、ホワイトハッカーってｶｺｲｲ✨レベルの人でも土日で読めるような読みやすさです。
* テクニカル面よりメンタル面、スキルアップ法にフォーカスされています。

# 内容抜粋👀
## ホワイトハッカーとは
* ハッカーの種類
* ハッカーになるには

## ホワイトハッカーを目指すための心構え
* 勉強法
* アウトプット
* モチベーションの保ち方

## ホワイトハッカーのスキルアップ
* ペンテスター
* バグハンター
* スキルアップ法

# 本書で得られるもの💪
* そもそもホワイトハッカーって何？という状態からハッカーの種類について説明できるようになる
* ホワイトハッカーを目指したい！でも何から始めたらいいの><という状況を脱却できる（一歩踏み出せる）
* 学習に対するモチベーションの維持の仕方がわかる
* PC/OSの選び方から教えてくれる

# 実際に行動してみたこと🏃‍♂️
* 本書で紹介されていた、電子工作に入門してみました

https://twitter.com/choco_py3/status/1531663003384356864?s=20&t=JFbt1Uf-1mO9aFadEQlY-A

https://twitter.com/choco_py3/status/1531943604662390784?s=20&t=JFbt1Uf-1mO9aFadEQlY-A

ちなみに[ギャル電](https://twitter.com/GALDEN999 "ギャル電")さんの電子工作本を見ながら作っています💡

# これからやりたいこと🙋‍♀️
* 英語/数学の学習
* 本書で紹介されている書籍を読み込む
* 分解🔧
* ハッキング・ラボの構築

# おわりに🙇‍♀️
ここには書き切れないほどホワイトハッカーに近づけるヒントが詰まっています！
サイバーセキュリティに興味のある学生・社会人全ての人にぜひ読んでほしい本です！！
それでは良いサイバーセキュリティライフを✋