OmniAICreator/Qiita-1.07M huggingface dataset:
Splunk: Splunk Freeだとユーザーが作成できない


###### 実施環境： Splunk Free 8.2.2

Splunk Free で「設定」から「ロール」を選択すると、以下のようなエラーがでます。

![WS000170.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e2965e7b-d2b5-182d-601a-2ae6588d380d.jpeg "ロール")

また、「設定」の「ユーザー」から新しいユーザーを作成しようとしても、割り当てられるロールが1つも存在しません。

![WS000171.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/53cfdb9c-a7f9-c1e8-4711-32cd3c8a133b.jpeg "ユーザー")

これはどういうことでしょうか。

実は、無料の Splunk Free ではロール、ユーザーの作成ができません。

他にも、 Splunk Free では細かい制限がいくつか存在していたりします。

[About Splunk Free](https://docs.splunk.com/Documentation/Splunk/8.2.4/Admin/MoreaboutSplunkFree)

個人的に動かしてみる分にはあまり問題はありませんが、そうでない場合は有料版の Enterprise を使うようにしましょう。
【Swift】Stubデータ作成に便利なお手軽protocol紹介


## 定義

```swift
public protocol Stubbable {
    static func stub(_ edit: (inout Self) -> Void) -> Self
    static func stub() -> Self
}

public extension Stubbable {
    static func stub(_ edit: (inout Self) -> Void) -> Self {
       var stub = stub()
       edit(&stub)

       return stub
   }
}
```

## 使い方

```swift
struct User {
    var id: String
    var name: String
    var followers: Int
}

// 別ファイル（テストターゲット内）でextensionしてもOK
extension User: Stubbable {
    // デフォルトのスタブを定義
    static func stub() -> User {
        User(
            id: "1",
            name: "John Smith",
            followers: 10
        )
    }
}

// デフォルトのスタブを生成
let user1: User = .stub()

// デフォルトから任意のパラメーターを変更して生成（テスト時に便利）
let user2: User = .stub { $0.id = "2" } 
```

## 補足

ライブラリならもっと素晴らしいものがあります

https://github.com/kateinoigakukun/StubKit
4年目エンジニアが薦める自己投資

# はじめに
来月26歳になります。新卒4年目の宮内です。
バックエンド・インフラがメイン職能ですが、最近はGoogle Analyticsやスプレッドシートを主戦場としていることが多いです。

最近、マクドナルドのポテトMサイズがキツくなってきました。これが年を重ねるということなのかと、早くも震えております。心はずっと思春期のままなんですけどね。。。
　
そんな4年目のエンジニアが、「有益だった自己投資」を紹介して、後輩・あるいは先輩方に新たな気付きを与えられたらと思います。

# おすすめの自己投資
## 戦略の理解

>***投資したもの***
- 自分のタスクに当てられる時間

>***リターン***
- コミュニケーションコストの低減
- 提案力
- 社内外からの評価

戦略を理解して仕事するようになって、以下のような変化がありました。
 - 入ってくる情報量が増え、仕事における判断軸をはっきり持てるようになった
 - サービスの将来性を見越した設計提案ができるようになった

エンジニアリングは戦術であり、手段の一つです。戦略とズレた開発をしていては、***良いシステムは作れません***。
ここを本心から理解し、行動に移すまでは苦しかったですが、結果的に仕事・成果物の質が上がりました。

## シンプルに勉強！

>***投資したもの***
- 勉強時間
- 本・[Udemy](https://www.udemy.com) などの購入費
- 受験費用

>***リターン***
- 最高の仕事環境
- 現場での実戦経験
- 月曜日の仕事のパフォーマンス
- ~~SAAの不合格通知~~

技術系の勉強をするようになって、以下のような変化がありました。
 - 障害対応に強くなった
 - 開発要件の提案の幅が広がった
 - 任せてもらえる開発タスクの職能の幅が広がった
 - 休日から平日へのコンテキストスイッチが減った

エンジニアでプライベートでの勉強をしていないのはマジでもったいないです。
職能の幅が広がることは、関わる人の幅が広がることにも繋がり、開発に対する観点を広く吸収できる環境が手に入ります。
（若手なら喉から手が出るほど欲しい環境。後輩にも作ってあげられるようになりてぇっす）

文章にするとキリがありません。副次的なリターンが多く、とにかく***レバレッジの効く投資*** だと思います。

遊びと勉強を両立したい人は、移動時間にUdemy聞き流しするのおすすめっす。
講座内にメモできる機能があるので、後で聞きなおしたい部分はメモしておくと効率よくインプットできておすすめです。
~~まあSAA落ちたんですけどね。バットを振りに行った自分を褒めましょうｗ~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554133/99b7175c-346e-ad7e-6686-322a363b7e8a.png)
合格ライン超えたのは1セクションのみ(´;ω;｀)

## 仕事仲間・友達

>***投資したもの***
- プライベートの時間
- 交際費（月1~3万くらい）

>***リターン***
- 楽しい時間
- 人生の楽しみ
- 心理的安全性の高い仲間
- 仕事に対するモチベーション

仕事仲間との時間の優先順位を上げて、以下のような変化がありました。
- 共通言語ができてコミュニケーションが早くなる
- 視座が上がる
- 遊びの幅が広がる

「投資」というと違和感のある項目ですが、***優先順位を上げた結果よかったなーと思った***ので挙げさせていただきました。私生活に仕事が介入してきても不愉快でなくなるんすよね。
少しの勇気で***心理的安全性の高い仲間***ができる投資です。

仕事仲間の野望や将来像を聞いて自分に取り入れたり、未来に対するワクワク感だったり、定性的ですが人生を豊かにしてくれますよ。

## 筋トレ

>***投資したもの***
- 仕事までの朝の時間
- ジム代（月3000円くらい）

>***リターン***
- 筋肉
- 自信
- 健康的な生活

筋トレを始めて、以下のような変化がありました。
- 朝起きてからダラダラスマホをいじらなくなった
- 午前の仕事のパフォーマンスが上がった
- 栄養バランスに気を遣うようになった

エンジニアに限らず体は資本だと思うので、体に対する投資は何かしらしようと始めました。
厚くなってきた胸板・着ていた服がちょっとキツくなってきた腕・割れた腹筋。うーん最高。

自分は [Smartfit100](https://smartfit100.com/) の一番安い、月3000円のプランで通っています。朝しか利用できないので、強制的に安価で朝活を始められます。
毎日のウォーキングや適度な運動はガンリスクも低減されるらしいっす。詳しくはないですけど。

体を動かすのが苦手な人は、入浴剤を買ってお風呂に浸かるのも良いと思います。「アクティブレスト」で調べてみてください！

## 「いつか始めようを今やる」をクセ付ける
>***投資したもの***
- ご褒美代（「○○を始めたら今晩はすき焼き食う！」とかｗ）
- ギター（1ヶ月の給料くらい）
- Qiita書いてみたり（勉強時間含め、1記事10時間とか）
- オシャレな人に服を選んでもらったり（トータルで10万いかないくらい）
- etc...

>***リターン***
- 理想の自分に近づいていく実感
- 思考の脱皮。新しくなる感じ。
- 成功体験ができることで自己投資の優先順位があげられる

「いつか始めようを今やる」をクセ付けるためには、***最悪やめればいいや***と開き直ることが大事かなと思います。我慢強く続けることが大事とする考えもありますが、***本当にやりたいことならもう一度始めようと思える***ので一度やめちゃえばいいです。

# まとめ
主観が強めで、賛否両論ある記事になったかもしれませんがいかがだったでしょうか。

これまで自己投資という名目で高いお肉食べたり、青春18切符で遠出してみたり、ギター教室に通ってみたりしましたが、本当に意味のあるものをまとめることができたと思います。かなり一般的に言われてるものばかりですねｗ

今やっている自己投資を言語化することで、新卒がよく抱く「なぜこれを薦めてくるんだろう？それ本当に意味があるのかな？」のアンサーが明確になりました。機会をいただけたAdvent Calendarというイベントに感謝です。

明日は[朴さん](https://qiita.com/a11322k)です！お楽しみに！
Vim を使っている理由

[Vim Advent Calendar 2022](https://qiita.com/advent-calendar/2022/vim) の13日目です。

何だかんだ vim を使い始めて2年くらいになるので、なんで vim 使ってるんだろうと自問自答してみた。

## 理由を端的に箇条書き
1. 必要な機能のみ導入すればいいので、不要な機能がない
2. 片手タイピングと相性が良い
3. サーバーで vim 使うときに困らなくなる
4. スマホや iPad でもプログラミングできる

## 必要な機能のみ導入すればいいので、不要な機能がない
VScode などはとても機能が充実していて、とても良いアプリだとは思います。ただ、使用していないメニューアイコンが常に表示されていたり、急にアップデート通知が出たりするのが好みではありません。

その点、 vim は必要な機能を自分で探し環境を作っていくので、必要のないアイコンや通知が表示されることがありません。

## 片手タイピングと相性が良い
私が左半身麻痺もあり、右手のみでのタイピングを強いられています。そのため、パッドやマウスとキーボードを行き来することはなるべく避けたい。vim ならキーのみで操作できるので、これはかなり大きい理由の一つですね。

ちなみに、ThinkPad の外付けキーボードを使っています。

https://www.lenovo.com/jp/ja/p/accessories-and-software/keyboards-and-mice/keyboards/0b47190

また、 vim に慣れればブラウザも vimium がとても便利です。

https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb

## サーバーで vim 使うときに困らなくなる
サーバーでは vim を使わざるを得ないことということはあると思います。そういった時、普段から vim も使っていると負担なく操作ができるので、障害時など焦っている時でも落ち着いて対応できます。（と言いつつも、焦って間違えることありますけどね笑）

## スマホや iPad でもプログラミングできる
サーバーと同じような理由にはなるんですけど、SSH で作業用のパソコンに接続すれば、スマホからでもプログラムを書くことができます。なので、本当に軽微な作業であれば、ちょっと座ってるの疲れたな〜という時に布団で横になりながらコードを書くということが出来ます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185846/87c16731-a5de-7363-8e62-b835d65b86bc.png" alt="Screenshot_20221129-130003.png" width="350">

また、私は Mac mini を使用しているんですが、時々気分転換にカフェとかに行って作業をしたいと思ったりした時に Mac mini とモニター持ってカフェに行くわけにもいかないんですけど、vim であれば iPad や古いノートPCでも持っていけば、外から SSH して作業するということできるので、vim を使っています。

ちなみに、外出先から自宅PCに接続するために、 TailScale を使用しています。

https://tailscale.com/

## まとめ
なんか、目新しいことは書けていませんが、いい機会だったなと個人的には満足です。

ちなみに、私は上記の理由で vim を使っていますが決して人に vim を進めるつもりはありません。毎日使うものですので、ちゃんと自分で使うものは選ぶべきだと思っているからです。
Vim 9.0 patchダイジェスト (2022/11)

[Vim](http://www.vim.org/)のリリースされた[patch](https://github.com/vim/vim/commits/master)の説明です。
([9.0.0824](https://github.com/vim/vim/commit/873f41a0187e81a22aa4622fbf938de72a54abba) ～ [9.0.0978](https://github.com/vim/vim/commit/3b8c7083b265c35861a7f96b01c079471ff45152))
**新機能、大幅な仕様変更には、:four_leaf_clover:が付いています。**

* [9.0.0948](https://github.com/vim/vim/commit/c1cf4c91072f91b6b8dd636627a4ddf6f4b21f16): :four_leaf_clover:`'ttyfast'`のデフォルト値をオンに変更しました。
* [runtimeファイル更新](https://github.com/vim/vim/commit/b59ae59a58706e454ef8c78276f021b1f58466e7): [Todo](https://github.com/vim/vim/commit/b59ae59a58706e454ef8c78276f021b1f58466e7#diff-fb7eed53e3f2993f9d82c748206eaca82fd1d054a417c6de477bb54373d85643)更新。helpファイル更新。他。
* [9.0.0930](https://github.com/vim/vim/commit/63a2e360cca2c70ab0a85d14771d3259d4b3aafa): :four_leaf_clover:`'keyprotocol'`を追加しました。libvterm フォークに Kitty キーボードプロトコルのサポートを追加したので、端末ごとにどのプロトコルを使用するか指定します。
* [9.0.0917](https://github.com/vim/vim/commit/35fc61cb5b5eba8bbb9d8f0700332fbab38f40ca): :four_leaf_clover:`WinResized`イベントを追加しました。
* [9.0.0916](https://github.com/vim/vim/commit/ce30ccc06af7f2c03762e5b18dde37b26ea6ec42): :four_leaf_clover:`getbufoneline()`を追加しました。`getbufline()`の1行版です。
* [runtimeファイル更新](https://github.com/vim/vim/commit/d13166e788fcaef59ec65c20b46ca4be16625669): [Todo](https://github.com/vim/vim/commit/d13166e788fcaef59ec65c20b46ca4be16625669#diff-fb7eed53e3f2993f9d82c748206eaca82fd1d054a417c6de477bb54373d85643)更新。helpファイル更新。他。
* [9.0.0886](https://github.com/vim/vim/commit/44c2209352d56d70b1fc0215e81f1822d55aa563): :four_leaf_clover:端末でも水平マウススクロールができるようにしました。
* [9.0.0881](https://github.com/vim/vim/commit/24dc19cdb2ce7cda2156d3b2eca6aee552b097dc): :four_leaf_clover:`getmouseshape()`を追加しました。現在のマウス形状名を取得します。主にテスト用に使用します。(関連patch: [9.0.0884](https://github.com/vim/vim/commit/cdeb65729d96c90320b9009e583ade305c396f29))
* [9.0.0863](https://github.com/vim/vim/commit/4c8d2f02b3ce037bbe1d5ee12887e343c6bde88f): :four_leaf_clover:`col()`と`charcol()`に第2引数{winid}を追加しました。カレントウィンドウ以外のウィンドウにも使用できるようになりました。
* [runtimeファイル更新](https://github.com/vim/vim/commit/76db9e076318cb0ae846f43b7549ad4f2d234c0b): [Todo](https://github.com/vim/vim/commit/76db9e076318cb0ae846f43b7549ad4f2d234c0b#diff-fb7eed53e3f2993f9d82c748206eaca82fd1d054a417c6de477bb54373d85643)更新。helpファイル更新。他。

---
#### 凡例

|表記|意味|
|:------|:------|
|:four_leaf_clover:|新機能、大幅な仕様変更|
|:alien:|Vim開発者向けの追加、変更|
|`'hoge'`|オプション (`:h options`参照)|
|`:hoge`|Exコマンド (`:h :index`参照)|
|`hoge()`|組み込み関数 (`:h functions`参照)|
|`v:hoge`|Vim定義済変数 (`:h v:`参照)|
|`+hoge`|feature (`:h +feature-list`参照)|

---
#### 方針
[こちら](http://qiita.com/h_east/items/23cd0d10932505072e6b#%E6%96%B9%E9%87%9D)を参照。
【JavaScript】var let const の違い

# はじめに
:::note info
初めての投稿です．お手柔らかに．．．
:::
Javascriptの変数宣言である `var` `let` `const`の違いについての備忘録。
* `var`は使っちゃいけないって聞いたような...
* とりあえず全部`const`でいいやろ！

このようになんとなくで宣言していたので具体的な違いについてまとめます。

# 何が違うの？
具体的に3つの違いを見ていきましょう。
<table>
  <thead>
    <tr>
      <th></th><th>var</th> <th>let</th> <th>const</th>
    </tr>
  </thead>
  <tr>
    <td> 再宣言 </td> <td> 可 </td> <td> 不可 </td> <td> 不可 </td>
  </tr>
  <tr>
    <td> 再代入 </td> <td> 可 </td> <td> 可 </td> <td> 不可 </td>
  </tr>
</table>

<h3>再宣言</h3>

なぜ`var`を使う場面を無いかというと再宣言できてしまうからです。
```javascript:declarations.js
//var
var num = 0;
var num = 1;
console.log(num);
// 出力結果: 1

//let
let num = 0;
let num = 1;
console.log(num);
// 出力結果: Uncaught SyntaxError: Identifier 'num' has already been declared

//const
const num = 0;
const num = 1;
console.log(num);
// 出力結果: Uncaught SyntaxError: Identifier 'num' has already been declared
```
このように一度宣言した`var`を再宣言した場合、後から宣言した変数が適用されてしまいます。
これは意図しないバグの発生に繋がってしまいます。
`let`や`const`で宣言した変数を再宣言した場合はエラーになっていることが分かります。

<h3>再代入</h3>

続いて再代入の可、不可の違いを見ていきます。
```javascript:assignment.js
//var
var num = 0;
num = 1;
console.log(num);
// 出力結果: 1

//let
let num = 0;
num = 1;
console.log(num);
// 出力結果: 1

//const
const num = 0;
num = 1;
console.log(num);
// 出力結果: Assignment to constant variable
```
このように`var`と`let`では一度宣言した変数に対して再代入を行うことができます。
`const`ではエラーとなっていることが分かります。

ただしconstで宣言されたオブジェクトや配列のプロパティは変更することができます。
```javascript:property.js
const profile = {
name: "taro",
age: 28
};
profile.name = "ziro";
profile.age = 26;
profile.addres = "Shiga";
console.log(profile);
// 出力結果: {name: "ziro", age: 26, addres: "Shiga"}

const animal = ["dog", "cat"];
animal[0] = "bird";
val5.push("monkey");
console.log(animal);
// 出力結果: ["bird", "cat", "monkey"]
```
# 結論
* `var`は再代入も再宣言も防げないため使わない
* 再代入が必要な場合は`let`を使う
* 基本は`const`を使う
constしか勝たん！
課題定義

<h1>なんの課題を解決するのか？どのような状態になれば良いのか？</h1>

***
**背景・目的**
***
- 解決したい課題は？
- なんのためにしたいのか？
- なぜシステム化する必要があるのか？
***
**ゴール（達成状態）**
***
- 目標は？
- 達成した時にどのような状態になっていたいのか？
***
**やらないこと**
***
 - スコープ対象外のことは？
 - 制約条件は？
Ionic Vue をちょっとだけ触ってみた

（コロナにかかってしまって、投稿が遅れてしまいました。。。）

[Vueアドベントカレンダー2022](https://qiita.com/advent-calendar/2022/vue) の11日目です。

今年は会社以外のアドカレに参加したいと思い、普段触っている Vue で何か書けないかと思い、ふと数年前の登壇を思い出しました。

https://twitter.com/FruitRiin/status/1143122133687529474?s=20&t=kVzwrN6W0TLSuHrGB6YPyA

登壇を見た時は、まだまだだったような気がしますが、すでに v6 にまで上がっていて驚きましたw

https://ionicframework.com/

というわけで、 Ionic を触ってみることにしました。

## インストール
```sh
npm install -g @ionic/cli
ionic start myApp tabs --type vue
```

## WEBアプリの起動
```
ionic serve
```

![スクリーンショット 2022-12-11 19.09.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185846/f4f2a66e-f57c-b96e-20b7-dab5f18067c2.png)

## iOS アプリのビルド
### 1. Xcode のインストール
ビルドするには、 Xcode が必要です。

```sh
xcode-select --install
```

### 2. Capacitor もしくは Cordova のインストール
今回は、 Capacitor を使用した方法を紹介します。

```sh
brew install Capacitor
```

### 3. ビルドの実行
```sh
ionic cap add ios
ionic cap open ios
```
※再ビルドの場合は、 add ではなく copy を使う。  
※実機 iPhone でのビルドでは署名の登録です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185846/79dc5770-ef7f-6ddf-3f4c-bb2f05577738.png" width="400px">

たったこれだけでした。

## 簡単なアプリを作ってみた
ちょうど、息子が電車にハマっていたので、電車の図鑑＋検索＋クイズができるようなアプリを作ることにしました。

Vue3 に対応しており、非常に書きやすかったです。

内容は大したことないので、簡単なデモとリポジトリを貼るだけにします。

https://github.com/zumikiti/ionic-vue-train-book

![ionic-vue-train-book-demo-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185846/6700e779-4759-0d6b-b692-b1fe386195d8.gif)

## まとめ
普段使っているJSフレームワークで、スマホアプリも作れるようになっていることは非常に驚きました。

Flutter をちゃんと触ったことないですし、ネイティブアプリを作ったこともほぼないので、 Ionic がどれほど上記と覇権争いができるのか判断できませんが、ちょっとしたアプリを作りたい際にJSで作れるので、是非みなさんも興味があったら触ってみたらいかがでしょうか。
テスト79

```vb
Private Sub バックアップ_Click()
'出力先にファイルごとバックアップ(共有モードで開いたときに可能)
'バックアップ時に出力先に5個以上の指定のファイルが存在したら、
'古い方から4個になるまで削除する...((φ(-ω-｀*)ﾒﾓﾒﾓ

Dim tmp As String
Dim File_Path1 As String
Dim Fol_Path As String
Dim File_Path2 As String
Dim WshShell As Variant

Set WshShell = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")

'自身のファイルパスを取得
File_Path1 = CurrentProject.FullName

'バックアップ先のフォルダパス
Fol_Path = "C:\Users\User\Desktop\VBA関連\AccessVBA学習\バックアップ"

'バックアップ時に出力するファイル名
tmp = Format(Now, "yyyymmddhhmmss") & FSO.GetFileName(File_Path1)

'バックアップ時ファイルパスを作成
File_Path2 = FSO.BuildPath(Fol_Path, tmp)

'出力先フォルダ内の指定のファイル数のチェック
'5個以上あったら、作成時間の遅いファイルから削除
Call Del_File(Fol_Path)

'バックアップ
FSO.Copyfile File_Path1, File_Path2

Set WshShell = Nothing
Set FSO = Nothing

End Sub


Public Sub Del_File(ByVal Fol_Path As String)
'------------------------------------------------------------------
'DictionaryをKeyの昇順に並び替える。
'------------------------------------------------------------------
Dim i As Long
Dim AryList As Object
Dim KeyItem As String
Dim temp As Variant
Dim file As Variant
Dim dic As Variant
Dim curKey As Variant
Dim tmp2 As Variant

Set dic = CreateObject("Scripting.Dictionary")

For Each file In FSO.GetFolder(Fol_Path).Files

    If InStr(FSO.GetFileName(file), "練習用") > 0 Then
        'キーにファイルの作成日時、値にファイルパスを格納
        dic.Add file.DateCreated, file.Path
    
    End If
    
Next file

'.NET FrameworkのArrayListクラスを利用する
Set AryList = CreateObject("System.Collections.ArrayList")

'dicに入れたデータをArrayListに移す。
For Each curKey In dic

    If curKey <> "" Then
        '日付日時とファイルパスを格納
        KeyItem = curKey & "_" & dic(curKey)
        AryList.Add KeyItem
    
    End If
    
Next curKey

'昇順にする
AryList.Sort

'削除する
dic.RemoveAll

'もう一度入れなおす。
For i = 0 To AryList.Count - 1
    temp = Split(AryList(i), "_")
    dic(temp(0)) = temp(1)
Next i


'指定のファイルが5個以上だった場合
If dic.Count >= 5 Then

    i = dic.Count
    '古いファイルから6個目移行を削除
    For Each tmp2 In dic
    
        If i >= 5 Then
            DoEvents
            Kill dic(tmp2)
            DoEvents
        Else
            '古い順からファイルを削除し、5個になったら離脱
            Exit For
        
        End If
        
        i = i - 1
        
    Next tmp2

End If

Set AryList = Nothing

End Sub
TextMeshProでSpriteを表示する

# はじめに

こちらは「[Applibot Advent Calendar 2022](https://qiita.com/advent-calendar/2022/applibot)」13日目の記事になります。

TextMeshProはUnityで文字（テキスト）を描画するコンポーネントです。
文字の中に画像を表示したい機会があったのでまとめてみました。

# 作業環境

Unity 2022

# 文字コードに対応したSpirteを表示する

## Spriteの作成

文字の中に表示したい画像は1つにまとめる必要があります。

画像のTextureTypeはMultipleに設定してSpriteEditorからSpriteを設定します。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998049/eaec8a7f-47e1-65aa-08d9-1707e717d09b.png" width=600>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998049/a1906d0a-5912-74e2-6f93-214141b9f50a.png" width=600>


## SpriteAssetの作成

Projectウィンドウ内の作成したSpriteを選択して右クリック「Create/TextMeshPro/Sprite Asset」を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998049/49759525-b21a-d13e-6260-6af8f891226e.png" width=600>


SpriteAssetが出来上がりました。



## 文字コードの設定

完成したSpriteAssetを選択してInspectorから設定します。

「SpriteCharacterTable」に表示されているSpriteの「Unicode」を設定していきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998049/432aaf56-e6c6-58d4-9d78-4bcbd52436b7.png" width=600>

## TextMeshProへ設定

Inspetor上でExtraSettingを押して隠れている項目を表示します。
作成したSpriteAssetを設定します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998049/e69256f5-32f3-42b9-4499-a9d299c802ca.png" width= 600>

## 実際に入力してみた

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998049/e93ed9e2-f44b-0bb4-9935-673e51d003f9.png" width=600>

表示されました！
表示されるSpriteとはTextMeshProの色の影響を受けない点に注意が必要です。

# リッチテキストで表示する

今度はリッチテキストを使ってSpriteを指定する方法で表示します。
SpriteAssetを作成するところまでは同じです。

## Spriteの名前の設定

SpriteAssetを選択してInspector上で設定します。
「SpriteCharacterTable」に表示されているSpriteの「Name」を設定します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998049/31b53de0-5820-2353-adf8-0f6e10fe31b9.png" width=600>

## TextMeshProへ設定

こちらは[Unicodeで設定した](#TextMeshProへ設定)際と同じなので省略します。

## リッチテキストのタグ設定

タグの設定方法は2種類で「名前（Name)」と「番号（Index）」で指定できます。

### 名前で設定する方法
""にSpriteAssetに設定した「Name」を設定します。

```
<sprite name="image_0">
```

### 番号（Index）で設定する方法
SpriteAssetの「Index」を=の後ろに設定します。
```
<sprite=0>
```

## 実際に表示してみる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2998049/ded66594-45c4-de19-6373-9528f583d528.png" width=600>

表示されました！

# まとめ

- SpriteからSpriteAssetを作成してTextMeshProに設定する
- TestMeshProでSpriteを表示する方法は3種類
  - Unicodeで表示
  - SpriteのNameをリッチテキストタグを使って表示
  - SpriteのIndexをリッチテキストタグを使って表示

以上,「[Applibot Advent Calendar 2022](https://qiita.com/advent-calendar/2022/applibot)」 13日目の記事でした。
Drivetrain(駆動系),ボッシュ自動車handbook(英語)11版A.C.まとめ<10>

Automotive Handbook countdown Calendar 2022

https://qiita.com/advent-calendar/2022/automotivehandbook

12/10 参加記事です。

ボッシュ自動車handbook(英語)11版(0-1) 課題と記事一覧new

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

# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970
Chassis systems, 1108
Vehicle bodies, 1310
Comfort and convenience, 1392
Safety systems in the motor vehicle, 1410
Vehicle security systems, 1430
Automotive electrics, 1450
Vehicle electrical systems for hybrid and electric vehicles, 1560
Automotive electronics, 1620
Entertainment 1780
Drive assistance and sensors, 1804
Drive assistance systems 1872
Future of automated driving 1934
Appendics, 1940
# Mathematics and methods
no. Number
p. page
v. views
g. goods.
s. stocks

|no.|title|P.|v.|g.|s.|
|:----|:----|--:|--:|--:|--:|
|48|DInternal-combustion engines, https://qiita.com/kaizen_nagoya/items/b13b1b09e2fd8e275662|642|155|0|0|
|49|Mixture formation, combustion, emissions, https://qiita.com/kaizen_nagoya/items/91543d3f369bc4a24560|646|150|0|0|
|50|SCharge cycle and supercharging, https://qiita.com/kaizen_nagoya/items/a82805e417500f4764ed|664|146|0|0|
|51|Reciprocating-piston engine, https://qiita.com/kaizen_nagoya/items/30836ce5e3d3816be3aa|676|102|0|0|
|52|Exhaust emissions, https://qiita.com/kaizen_nagoya/items/60e15163abf7b37a0770|716|127|0|0|

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

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



# Advent Calendar 2022

今年企画した４つのAdvent Calendarと、それぞれの記事一つをご紹介します。

AUTOSAR Advent Calendar 2022

https://qiita.com/advent-calendar/2022/autosar

AUTOSAR References to ISO, IEC, ITU, IEEE, RFC and SEA etc.

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

Automotive Handbook Advent Calendar 2022

https://qiita.com/advent-calendar/2022/automotivehandbook

Basic principles, ボッシュ自動車handbook(英語)11版まとめ<2>

https://qiita.com/kaizen_nagoya/items/24a1ba5da3d09b2a95d1


2022 いいねをいただいた記事ランキング(O.K.版) Advent Calendar 2022

https://qiita.com/advent-calendar/2022/goods

2022年１月下旬　いいねをいただいた記事　16

https://qiita.com/kaizen_nagoya/items/0ee589a8edaeab24fd2a

AdCale(O.K.) Advent Calendar 2022

https://qiita.com/advent-calendar/2022/adventcalendar2022

「会議は15分未満」に。小耳にはさんだ話。

https://qiita.com/kaizen_nagoya/items/510c47c5d1e8d03145db

AdvencCalendar2022 報告

https://qiita.com/kaizen_nagoya/items/5b4b99cb9ad571f4094b

誤差の評価が苦手（専門分野以外）

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

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


 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221210
JupyterLabでRを使おう

　conda が利用できる JupyterLab（例えば JupyterLab Desktop App）で、R を使えるようにする方法です。
　JupyterLab を起動し、ランチャーのコンソールから次の1行のコマンドを実行するだけです。

```cmd
conda install r-base r-irkernel -y
```

　default の channel が conda-forge になっていない場合は、

```cmd
conda install -c conda-forge r-base r-irkernel -y
```

としてください。

　Windows10、Ubuntu の JupyterLab Desktop App で、使えることを確認しています。
　また、次の私の記事で作った JupyterLab でも使えることを確認しています。

https://qiita.com/Mitz-TADA/items/40369a8a526479edb8bc
JetpackComposeでテキストサイズを固定(dp指定)して端末の設定でテキストの大きさを変更しても依存しないようにする方法

今回はJetpackComposeで端末の設定でテキストの大きさを変更してもテキストのサイズを変えたくない場合があったので、この方法を忘れないように残しておこうと思います。




# リファレンス

https://developer.android.com/reference/kotlin/androidx/compose/ui/unit/Density

# 実装方法
dpをspに変換して設定してあげれば良いのではないかと考えたので、変換方法を調べたところ上記リファレンスにリンクのある`Density`が見つかりました。
ではdpをspに変換して設定してみようと思います。


```TextSizeDemo.kt
@Composable
fun TextSizeDemo() {
    val density = LocalDensity.current
    Column {
        Text(
            text = "文字サイズ変わらない", fontSize = with(density) { 14.dp.toSp()},
        )
        Text(text = "文字サイズ変わる", fontSize = 14.sp)
    }
}
```

![Screenshot_20221211_201832.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/8f9ccc00-5321-bb08-fb68-9676bb21591d.png)


このような実装になりました。
以上です！
【Android】 RxJavaでsubscribeOnとobserveOnの違い

# はじめに
一度調べて使った後に、もう一度使おうとして全然覚えてなかったので
自分の中で整理しながら記事にしてみようと思いました

# subscribeOn
subscribeされたときのスレッドを先頭から指定する
subscribeOnを複数設定したときには最初に設定されたものが使われる

# observeOn
observeOnされたときからそれ以降の処理をどのスレッドで行うかを指定する
同じスレッド内で複数回使われることがある

# 参考
https://www.kimullaa.com/posts/201806231026/#observeon


https://chiiia12.hatenablog.jp/entry/2018/11/11/134612


https://qiita.com/hatt0519/items/c8875f822b752a188956

# おわりに
使い分けとしては通信などの時間のかかる非同期処理を行う場合はsubscribeOn
UI関係などの処理を行う際はobserveOn（UI関係での非同期処理はクラッシュの原因になることもあるので）
を使用するといった感じで理解してます
②SpringBootプロジェクトにVue.jsを追加する方法 【Vue.js+SpringBootでアプリケーション作成】

# SpringBootプロジェクト作成方法
下記をご覧ください。
[①SpringBootプロジェクト作成方法 【Vue.js+SpringBootでアプリケーション作成】](https://qiita.com/TMina000/items/b385dce6b948e2e11fe0)

# ディレクトリ構造

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918186/e5c069d3-be75-3d84-6b14-1dffd4fa99b5.png)

# Vue.jsの追加

1. コマンドプロンプトでSpring Bootプロジェクトの配下に移動

```
> cd .\twitterbot\  
```

Spring Boot プロジェクト外の場合、cd Spring Bootプロジェクトのパスでディレクトリを移動できます。

2. Vue.jsを追加

```
> vue create web
```

vue create　作成したいディレクトリ名　
で作成できます。
3. Vue.js のversionを選択

Default ([Vue 3] babel, eslint)を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918186/2d7c70f7-9c3e-134d-d838-769e68afd5d1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918186/740a8743-71d5-e980-a808-9799189d640d.png)

Vue.jsプロジェクトの追加ができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918186/1e24093b-50ea-4843-be70-5f3b5aab8f5d.png)
4. Vue.jsのビルド設定
ソースフォルダにあるpackage.jsonを編集します。
「scripts」に「build」の値に「 --dest ../src/main/resources/static」を追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918186/3208f0e5-d71d-71f8-c153-d9df94ac097b.png)
5. Vue.jsのビルド
コマンドプロンプトの「cd」コマンドで、作成したVue.jsのソースフォルダに移動します。
「cd web」
「npm run build」コマンドでビルドします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918186/36f1941d-ed40-b1fb-b97a-ac3bac7ea02f.png)
6. 実行
「Run」ボタンで実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918186/8734c597-2249-bd89-86bf-aefe1ee33a8f.png)
7. http://localhost:8080/index.html
Spring　Boot起動後、
「http://localhost:8080/index.html」
を開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918186/95efa131-521f-4f04-2859-12aeddf88b5f.png)

SpringBootプロジェクトでVue.jsの起動ができました。
イベント参加っていいよ！

## これは何？
インターンや勉強会などのイベントに参加することを激推ししたい記事です。

僕自身、今年の夏まではそのようなイベントに１度も参加したことがなかったのですが、いざ参加してみるとすごくいい経験になったし、成長できたと感じているので激推ししたいです.

## イベントに参加すると何が嬉しい？
↓ 実際に参加してみて、良かったことや嬉しかったこと
- 知識が増える
- 的確なアドバイスを受けられる
- 自分の実力や足りていないものがわかる
- 自分の理解の曖昧さに気づくことができる

### 知識が増える
イベントに参加すると、多かれ少なかれ新しい知識を得ることができます。

特に知識の**幅**を広げられるのかなと思います。
すでに自分が知っていることは、個人的に勉強して深化していけばいいかもしれませんが、知らないことは外部からの作用がない限りは未来永劫知らないままです。

イベントへの参加は、その自分が知らないことを知るきっかけになります。
ググることすらもできなかった分野についてググることができるようになります。

幅が広がったことによって、それまでの知識が深まり、知識に厚みがでてくることはあるあるだと思います。

```mermaid
graph TD;
    知識-->知識';
    知識'-->知識''
    知識.new-->知識.new';
    知識.new'-->知識''
    知識.new'-->知識.new'';
```

<font color="grey">↑ ※最近参加した1dayのインターンで初めて知った```mermaid記法```です。</font>

### 的確なアドバイスを受けられる
イベントに登壇するような人は先に進んでいる(技術的にもキャリア的にも)人なので、的確なアドバイスを受けられます。
そのような人に質問したりする機会というのは、イベント以外ではなかなかないと思うので積極的に参加するべきだなと感じています。

よく言われるアドバイス: ```「今のうちに低レイヤーの勉強をするべき」```

### 自分の実力や足りていないものがわかる
独学で勉強していると比較対象がないので、自分の実力を客観的にみることができないことが多いと思います。

僕はインターンなどのイベントに参加するまでは「学生の中だったらまあまあできる方なんじゃね」ぐらいに思ってました。
いざ参加してみると全然そんなことはなくて、結構凹みました。
ショックはショックでしたが、そこで初めて自分の実力を知ることができたので良かったと思ってます。
客観的に自分を見ることができるようになって、どこを補う必要があって、どこを伸ばしていくのかみたいなところを考えやすくなりました。


### 自分の理解の曖昧さに気づくことができる
チームで取り組むようなワークショップの場合、チームの人に対して自分の考えを説明する必要があります。
バックグラウンドや前提知識が異なるチームのメンバーの人にわかってもらえるように言語化するのは意外と難しいです。

自分では理解していたつもりでも、うまく言語化できないこともあり、完璧に説明できるレベルには理解できていないなということに気付かされます。
そのような理解が曖昧な部分をブラッシュアップしていけば成長につながると思います。

## 見ると良さそう

https://talent.supporterz.jp/events/

https://qiita.com/official-events

https://connpass.com/

https://job.tracks.run/
[Golang] スライス、キャパシティ、初期値

## 変数の設定による違いを理解する

### コード
``` main.go
package main

import (
	"fmt"
)

func main() {
	calc()
}

func calc() {
	var b []int              // 初期値はnilの[]スライス
	c := make([]int, 5)      // 初期値は[0 0 0 0 0]のスライス
	d := make([]int, 0, 5)   // 初期値は空の[]スライス

	fmt.Println("/-- 初期値 --/")
	fmt.Println(b)
	fmt.Println(c)
	fmt.Println(d)

	for i := 0; i < 5; i++ {
		b = append(b, i)
		c = append(c, i)
		d = append(d, i)
		fmt.Printf("/-- %d times --/ \n", i)
		fmt.Println(b)
		fmt.Println(c)
		fmt.Println(d)
	}
}
```

### 実行結果
```
/-- 初期値 --/
[]
[0 0 0 0 0]
[]
/-- 0 times --/ 
[0]
[0 0 0 0 0 0]
[0]
/-- 1 times --/ 
[0 1]
[0 0 0 0 0 0 1]
[0 1]
/-- 2 times --/ 
[0 1 2]
[0 0 0 0 0 0 1 2]
[0 1 2]
/-- 3 times --/ 
[0 1 2 3]
[0 0 0 0 0 0 1 2 3]
[0 1 2 3]
/-- 4 times --/ 
[0 1 2 3 4]
[0 0 0 0 0 0 1 2 3 4]
[0 1 2 3 4]
```

### まとめ
:::: note Info 
変数設定の結果

```
func calc() {
	var b []int
	c := make([]int, 5)
	d := make([]int, 0, 5)
```
- 変数bは、初期値はnilになり、空の[ ]スライス
- 変数cは、初期値は[0 0 0 0 0]のスライス
- 変数dは、初期値は空の[ ]スライス


::::
Array.fromの活用術

JavaScriptで、配列を作るのに使える`Array.from`というメソッドがありますが、これにはいろんな使い方があります。

## 引数に指定できるオブジェクト

`Array.from(obj)`とできるオブジェクトには、大きく分けて2種類あります。

* iterable
* 配列のようなオブジェクト

### iterable

最初の`iterable`とは、`[Symbol.iterator]`メソッドを持つものです（`for-of`に使えるもの、と言っても同じです）。配列そのものや`Map`、`Set`といったデータ構造、`document.querySelectorAll()`で得られる`NodeList`、さらには文字列も`iterable`なので、`Array.from`に投げ込むことができます。

配列を`Array.from`で処理した場合、配列がコピーされる効果以外に、疎な配列を`undefined`で埋める、という動作も行います。`Array(10)`で長さだけ決めた配列は、要素が空となって`forEach`が1回も回らない、みたいなことになりますが、`Array.from(Array(10))`として作成された配列は全部`undefined`で埋まり、`forEach`も各要素ごとに実行されるようになります。

ただし、この機能性については`[...obj]`と書いても同様に動くので、`Array.from`を呼ぶまでもないかもしれません。

### 配列のようなオブジェクト

曖昧な表現のように見えて「配列のようなオブジェクト」はJavaScriptの技術用語となっていて、「非負整数の`length`プロパティを持つオブジェクト」を意味します。たとえば、jQueryの`$()`で生成されるオブジェクトもこの種のものです。

極端な話、`length`さえあればいいので、`Array.from({length: 10})`と書いても動作します（`{length: 10}[0]`などは`undefined`なので、`undefined`が10個入った配列が出来上がります）[^1]。こちらはスプレッド構文では動作しません。

## 第2引数に関数を渡す

さらに、`Array.from`には第2引数として関数を渡すことができます。この場合、

* 引数：値、配列のインデックスの2つ
* 返り値：配列に入れたい値

のように実行されます。結果としては`Array.from`で得られた配列を`map`するのと同じではあるのですが、いったん配列を作らなくて済むので効率的です。

[^1]: `Array.from(Array(10))`のほうが文字数が短いですし、`Array`が2回現れるので圧縮をかける上ではさらに有利と思われます。
Chromeの拡張機能からコンソールで使える便利関数を突っ込む

# はじめに

私は最近、Chromeの操作の半自動化をしたいということで、Chrome拡張機能に手を出しました。
その中で、自動化の内容をページによって逐一設定したいというものだったということで、調査に使える便利関数が欲しいということになりました。
しかし、若干Chrome拡張機能の仕様周りの知識がないと躓きそうな点があったので、それについて書いていこうと思います。

# そもそも拡張機能を作るには

これについては色々と入門用資料があるので割愛します。
参考として、私が実際に作る上で頼りにしたページを載せておきます。

https://qiita.com/RyBB/items/32b2a7b879f21b3edefc

# 便利関数を導入する時ハマった点

まず私は、読み込ませるスクリプト内に関数等の定義をしていれば、それがそのままコンソールでも使えると思っていました。
しかし、実際のところ、それでは関数が未定義だとしてエラーになりました。
調べてみたところ、拡張機能のスクリプトとコンソールとで名前空間が異なっているとの情報がありました。

# 実際どうしたか

コンソール内で扱えるように関数を定義すれば、この問題は解決されます。
その手段の一つとして、開いているページ内に関数定義があることにする、というものが使えます。

```set.js
const checkNum = (query) => 'count: ' + document.querySelectorAll(query).length;

let elem = document.createElement('script');
elem.innerText = `
const cn = ${checkNum.toString()};
`;
document.body.appendChild(elem);
```

拡張機能の`manifest.json`内にこれを読み込ませるように記述すると、拡張機能を動作させる対象のページで、コンソールを開き`cn(【CSSセレクタ】)`を実行すると、該当CSSセレクタの要素の数が出力されます。

# 最後に

なんかもう少し、HTMLを改変しないような綺麗な方法がありそうですが、今のところそこには辿り着けていない状況です。
その綺麗な方法や、その他記事に対して思うことがあるということがあれば、コメント等宜しくお願いします！
webflowについての初歩的な知識

# ジャンル
　レスポンシブルWebサイトを構築するためのSaaSアプリケーション。また、webflow logcはweblogicに自動化フローの機能を作成することができます。

# プラットホーム
1. ウエブ

# 価格

1. Starter (無料)
    - webflow.ioドメイン
    - CMS 50アイテム
    - フォーム送信数50件(生涯件数)
    - 帯域幅1GB
1. Basic ($14/月)
    - カスタムドメイン
    - CMS 非提供
    - 月間500件のフォーム送信
    - 帯域幅50GB
1. CMS ($23/月)
    - カスタムドメイン
    - CMS 2,000アイテム
    - 月間1,000件のフォーム送信
    - 帯域幅200GB
    - コンテンツ編集者3名
1. Business ($39/月)
    - カスタムドメイン
    - CMS 10,000アイテム
    - 月間2,500件のフォーム送信
    - 帯域幅400GB
    - コンテンツ編集者10名
1. Enterprise （問い合わせ）
    - カスタムドメイン
    - CMS 10,000アイテム以上
    - 帯域　カスタム
    - コンテンツ編集者　カスタム
    - アップタイムSLA

# 概要
 webflowは、サンフランシスコに本社を置くアメリカの企業です。2013年にサービスを開始しました。

　webFlowは、CMS を含むサイト全体の運用からパフォーマンスの高いランディングページまで、何千もの企業で使用されている有能で強力なプロフェッショナルツールです。AppleやDisney、Netflixなど大手の企業のWebサイトでも利用され、2022年現在で750万のサイトがwebflowで構築されています。

# 機能
　操作しやすいビジュアルエディッタを使ってノーコードでサイトを作成し、公開までシームレスに行えます。テンプレートを使用して専門知識がなくてもCMSを含むサイトを構築できます。多くのトレーニングビデオも用意されています。また、自由なページデザインを行うためにコードを編集することも可能な強力なツールです。Figmaのデザインを取り込むこともできます。

　UIはレスポンシブレイアウトをサポートしています。デスクトップ、モバイル・ランドスケープ、モバイル・ポートレイト、タブレットのレイアウトが簡単にできるところがとても魅力的です。

　logicは、動的にコンテンツを取得、生成できます。

　コンポーネント、を始め、豊富な機能があります。チュートリアルで勉強する必要がありそうです。概算で、8時間から20時間程度でしょうか。今回は、エディタを開いた程度しかできませんでしたが、デザインの自由度が高く、無料版でも楽しめそうですので、少し腰を据えて使ってみたいと感じました。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/6f6ecc48-dded-ce08-816a-cfd9918f88c2.png"/>
新サービスの構想から作りだすまでにやったこと

# はじめに
AWSが主催する若手育成ハッカソンイベントであるANGELDojoに参加してきました！
内容としては、
* 期間：7月～10月（週2ペース）
* 新規サービスの作り方、開発手法などの考え方ワークショップ開催
* こんなサービスもあるよというAWSサービスのデモ及び紹介
* 上記を学びながらチームで新規サービスを作ってみよう
といったものになっています、全体の半分程度が実際の作業時間に割り当てられていました。

詳しく知りたい方は、頂上決戦のライブ履歴のURLを張っておくのでそちらをご覧ください
※私たちのチームは悔しくも予選落ちしてしまったため出てきません(；_；)

https://www.youtube.com/watch?v=LR4lcyf73ZU&t=1365s

今回の記事では学んだ中でも一番なるほどと思った新規サービス発案までの流れを記載します。
この記事は私の視点からの振り返りなのでもしほかのメンバーが全く違うとらえ方でまとめていても
どちらか一方しか正しくないということはないはず。。。

# 新規サービス発案の流れ
## ①ペルソナ（対象となる人物像）を作成する
まず、そのサービスを使用してもらうターゲットとなる人物像の作成から入りました。
年齢は？職業は？年収は？家族構成は？趣味は？課題（めんどくさいとおもっていること）は？など細かければ細かいほど後々そこまで決めておいてよかったと思うことになります。
これは、追加機能を考える際に、「その家族構成がターゲットだったらその機能いらなくない？」「この年齢だったらこの機能必要だよね」など後々リリースするサービスに必要な機能の取捨選択が容易になるので構想中のサービスの軸をブレさせない役割を持っています。
参考例としては以下の感じですが、多ければ多いほどいいので書いてない項目でも書いておいて損はないです！
|項目  |回答                |
|----------|--------------------------|
|名前  |小林         |
|年齢  |25歳         |
|職業  |システムエンジニア         |
|年収  |750万ぐらい？         |
|家族構成  |独身（居候複数）         |
|趣味  | メイド談義、ゲーム        |
|その他  | 3LDKのマンション在住、日々の激務で腰痛に悩んでいる   |


## ②プレスリリース/FAQを考える
ターゲット想定人物が固まったらいざプロトタイプの作成！とはならず、先にプレスリリースとPRFAQを書きました。
聞いた当初ナニソレ。。。？という感じでしたが、プレスリリースは発表した際の売り文句、PRFAQは上司に企画を持って行ったときや、リリース後に想定される質問集を指します。

https://kyodonewsprwire.jp/corp/shioj/288/

### プレスリリースの構成
プレスリリースは下記の4構成で書きました。

**①導入**
　リリースしたサービスの説明やPRポイント
**②課題**
　リリースされるまでにどんなことが課題となっていたか
**③課題解決**
　リリースされたことにより課題がどう解消されたのか
**④お客様の声**
　実際に使ったときに想定されるお客様の声、事前に作成したペルソナに会話形式で話させると組み立てやすい

### FAQの内容
PRFAQではプレゼンした時や、サービスをリリースした際に実際に質問されそうなことのリストを作成します。例えば、
・マネタイズはどうするのか？
・予想を超える反響があった際にどうやってスケールアップしていくのか？
・このサービスで解決される課題は何なのか？
など、聞かれたくないものもどんどんリスト化していきます。実際にワークショップの期間で作成したものはワードで3～4ページぐらいになりました。

## ③いざプロトタイプ作成！
ここまでしっかりと資料をそろえてからようやくプロトタイプの作成です、ここまでしておくと本当に必要な機能が明確になっていたり、必要な考慮が漏れていたりといったトラブルも最小限に抑えつつ、必要な機能の取捨選択や必要な機能漏れの洗い出しを同時並行で進めることができます。
逆に①～②をなんとなくでやってしまうと、のちのちの考慮漏れなどにつながってしまう可能性が高まります。

# おわりに
上記を踏まえて、実際に作るとなったらDBはどうするのか、プログラミング言語は何を使うのか、会員情報管理に外部認証（Google,Facebook,LINEなど）を使うかなど考えることはたくさんありますが、それらを考える前にサービスの軸となる部分さえ固めておけば後々組み込みたい技術や機能を見つけても右往左往せずにやり過ごす助けになります。

こういったことを実際にサービスを企画しながら学べる場だったので良い経験をさせていただきました。
2022年に読んでよかったおすすめの書籍について

# はじめに
2度目のクリスマスアドベントカレンダー参加！
今回は、今年2022年に読んだおすすめの本について紹介できたらと思います。
(競技プログラミング中心向け？が多いかなと思います。私的に)

## リーダブルコード
少し古めの本になるかと思いますが、ネット上でおすすめされた良本。
自分的にあまり意識していなかったポイントが、うまい具合で記載されていて
よかったです。コーディング力を向上にもってこいです。
[リーダブルコード](https://books.rakuten.co.jp/rb/11753651/?l-id=search-c-item-text-01)


## プログラマが知るべき97のこと
こちらも少し古めの本。通称きのこ本。有名なプログラマのエッセイ集になっていて
スキマ時間に読み進めており、手軽によめるおすすめな本です。
[プログラマが知るべき97のこと](https://books.rakuten.co.jp/rb/6907852/)



## アルゴリズム実技検定（公式テキスト)
競技プログラミングを本格的に？はじめ、参考になった本。
pythonを使用して分かりやすく描かれて読みやすくよかったです。
知らなかった処理周りの基本技術を知ることができました。
[アルゴリズム実技検定](https://books.rakuten.co.jp/rb/16583922/?l-id=search-c-item-text-01)



## プログラミング英語教本
コード上で使用する変数の正しい表記を知りたくなり、ネット上で見つけ購入しました。
（かなり曖昧に使っており、後悔しています）
ちょこちょこと空いた時間に読むといいかと思います。
また、検定であるプログラミング英語検定なるものがあり公式本になってます。
[プログラミング英語教本](https://books.rakuten.co.jp/rb/16321205/)



## 機械学習図鑑
E資格の時、認定講座だけでは実力不足で理解できず購入しました。イラストでわかりやすい解説で助かりました。
[機械学習図鑑](https://books.rakuten.co.jp/rb/15697205/?l-id=search-c-item-text-01)


## ゼロからつくるディープラーニング
通称ゼロつく本。こちらもE資格試験の時に使用、E資格ではじめてディープラーニングに触れましたがおすすめな本です。読みやすい。

[ゼロからつくるディープラーニング](https://books.rakuten.co.jp/rb/14424645/?l-id=search-c-item-text-02)

## 意味がわかる多変量解析
この意味がわかるシリーズは、統計学を勉強する上では必須の書籍で、統計学初心者にとっていい入口を導いてくれます。いろいろと助かってます。

[意味がわかる多変量解析](https://books.rakuten.co.jp/rb/12778509/)

# 最後に
2022年も終わりに差し掛かってますが、今年もIT資格勉強をはじめ競技プログラミングにも
力を入れるようになりました。2023年も頑張るぞーい。
AWSのさまざまなデータベース ③

## Auroraとは

AWSが開発したRDBMSであり、マルチAZで分散されたクラスター構成によって、高速・高性能なリレーショナルデータベース

- その特徴はNoSQL型の分散高速処理とRDBとしてのデータ操作性を両立させたこと
- MySQLとPostgreSQLとの完全な互換性を持ち、グローバル規模で圧倒的な高パフォーマンスと高可用性を実現する設計

MySQLと比べると最大5倍の性能を持ちPostgreSQLの最大3倍高速と言われています。

## 特徴

高い並列処理によって大量の読み書きをするのに適したDB

- 高い並列処理によるストレージアクセスによってクエリを高速処理することが可能
- 大量の読み込み、書き込みを同時にすることができる
- データベースの集約やスループット向上が見込まれる

### 耐障害性・自然回復性

3つのAZに2つコピーを設置可能で合計6つのコピーが可能
過去のデータがそのままS3に継続的バックアップ
リストアも差分適用がなく高速
どのタイミングでも安定したリストア時間を実現
99.99%の高可用性と高耐久性

### スケーラビリティ

10GBから最大64TBを提供するSSDデータプレーンを利用してシームレスに拡張可能
Auto-Scalingなどのクラウド独自のスケーラブルが可能

最大15のリードレプリカを利用した高速読み取りが可能

### Aurora レプリカ

RDSでは「リードレプリカ」と呼ばれるインスタンスを配置することにより、データ読み込みの負荷を分散させることができる。

- 「 Aurora レプリカ」はリードレプリカでありながら、自動フェイルオーバー機能を備えているため、セカンダリデータベースの役割を兼ねることができます。
- さらに、他のRDBMSではリードレプリカの数は最大5個であるのに対し、Amazon Auroraでは15個のAuroraレプリカを配置することができる。

### マルチマスター構成

複数のWriterインスタンスを実行することができるのがマルチマスター構成です。

以前はシングルマスターのみだったため1つのWriterインスタンスに異常が発生すると書き込み機能の障害が発生していました。

2017年からはWriterインスタンスも複数別AZに設置することで書き込み処理の冗長化が実現できるようになりました。

### Aurora Serverless

使用頻度の低いアプリケーションや開発・テスト用のデータベースなどの場合、常に稼働させなくて良い場合もあるためAurora サーバーレスオプションを利用することによってインスタンスの起動や停止を自動化が可能。

https://aws.amazon.com/jp/rds/aurora/

## おわりに
DBにも違いがあってたくさんのユースケースの中から一番良いものを選ぶにはどうやって使用するのかメリットデメリットを知らないとアーキテクチャ設計ができないと感じました。
構築してみたりしてしっかりとした技術を身につけたいと思ってます。

https://qiita.com/taka-d/items/18163710677d66f8b369
Python Webドライバーの自動更新方法

# 概要
webドライバーの手動更新が面倒な人向け。
webdriver_managerと言う便利ライブラリを使用します。

## 経緯
月一の申請が面倒だなぁと思ってpythonとseleniumで自動化。
でも、割とブラウザバージョンの更新があるので、webドライバもそれに合わせて手動更新してたけど面倒だったのでそれも自動にしてくれないかなぁと思いました。。

## 手動更新手順
1. seleniumで使用したいブラウザのバージョンチェック
1. 各種ブラウザのサイトからバージョンにあったwebドライバーをダウンロード
1. ダウンロードしたwebドライバーを所定のフォルダに配置

ちょっと手順が多い

## 自動更新手順(webdriver_manager使用)
1. スクリプトの実行により、PCにインストール済みのブラウザのバージョンに合わせて、所定フォルダにダウンロードしてくれる。

便利。。。

## webdriver_managerについて
### 対応ブラウザ
EdgeChromium、Chrome、Opera、Firefox、~~InternetExpoler~~(IEはもうやめましょう)
### インストール
```ps
pip install webdriver_manager
```
## コード
### 使用方法
指定フォルダに「.wdm」というフォルダが作成され、その中にwebドライバがインストールされます。
```python
#import （Edgeの場合）
from webdriver_manager.microsoft import EdgeChromiumDriverManager

# 指定フォルダへwebドライバをインストール
install_dir = "C:\\python\\test"
driver_path = EdgeChromiumDriverManager(path = install_dir).install()
```
### selenium使用前にドライバを更新する場合
「driver_path」にwebドライバーのパスが格納されるので、
「webdriver.Edge(driver_path)」の引数にしてあげます。
```python
#import （Edgeの場合）
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from selenium import webdriver

# 指定フォルダへwebドライバをインストール
install_dir = "C:\\python\\test"
driver_path = EdgeChromiumDriverManager(path = install_dir).install()
browser = webdriver.Edge(driver_path)

```
:::note warn
Windowsでのブラウザのインストール先について。
githubのライブラリソースを見ると、「$env」(環境変数)やレジストリからバージョン等を参照してるので、特殊なインストールをしていると失敗するかも。
何故か失敗する人は勉強がてら、見てみるといいかも。
:::
firebase storageでストレージの初期化ができないあなたに

## はじめに
新規プロジェクトでFirebase Storageを利用しようと思ったら作れねぇ…
Twitterで検索してみたら同じ現象になっている人もちらほらいるっぽく、なんとか解決できたので、記事にしようと思います。

:::note info 
本記事は2022年12月11日時点のものです 
:::

## 発生した問題
Firebase Storageを新たに利用しようとしたらエラーが発生し、利用できないというもの
![スクリーンショット 2022-12-11 16.33.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087368/e269b992-dfdd-79da-7d96-5a3e11f6cb9b.png)

## 解決方法
### (1) プロジェクトのロケーションを選択する
1. Firebaseコンソールを開いて左上の歯車マークを押し、プロジェクト設定に移動する
2. デフォルトのGCPリソースロケーションが設定されているかを確認する
3. 未選択になっていたら設定する
    - 日本の場合は東京がasia-northeast1のため、asia-northeast1にするのが無難かもしれないです
![スクリーンショット 2022-12-11 17.16.45（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087368/c6632513-9478-2b1b-4af9-2181c7772238.png)

### (2) firebase cliをインストールする
1. 下記リンクを参照して、firebase cliをインストールする
    - 私はcurlコマンドを利用してインストールしました

https://firebase.google.com/docs/cli#install-cli-mac-linux

### (3) Firebaseにログインする
1. ターミナルなどで`firebase login`を入力し、プロジェクトがあるアカウントにログインする
2. `Allow Firebase to collect CLI and Emulator Suite usage and error reporting information?`(FirebaseがCLIとEmulator Suiteの使用状況とエラーレポート情報を収集することを許可しますか？)と表示されるのでYを入力する
3. `Success! Logged in as　自分のメールアドレス` と表示されたら成功です

### (4) ルールをデプロイする
1. `firebase init storage`を入力し、storage.rulesファイルを生成する
    1. 入力するとオプションを選択する項目が現れるので任意のものを選択する。私はすでに作られているプロジェクトだったためUse an existing projectを選択し、利用するプロジェクトを選択
    2. `What file should be used for Storage Rules?` と表示されたらそのままエンターキーを押すとstorage.rulesファイルが生成される
2. `firebase deploy --only storage`を入力し、生成されたstorage.rulesファイルをデプロイする。以下が表示されたらOKです
![スクリーンショット 2022-12-11 17.41.13（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087368/de06e605-7c24-597a-b310-e149cff14f2d.png)

### (5) Cloud Storage for Firebaseを有効にする
1. `https://console.cloud.google.com/apis/library/firebasestorage.googleapis.com?project=自分のプロジェクトid` にアクセスする(ちなみにプロジェクトidは(1)でアクセスしたプロジェクト設定に書いてあります)
    - この時プロジェクトがあるアカウントでログインしていないとうまくいかないので注意！
2. 有効にするボタンを押し、Cloud Storage for Firebase APIを有効にする
![スクリーンショット 2022-12-11 17.52.43（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087368/39747af7-8464-87f4-072b-3e37a556d36b.png)
3. Firebaseコンソールに戻ると、Storageが使えるようになっているはずです！

### (6) セキュリティの設定
画像の投稿ができるようになりますが、セキュリティの関係で最初は画像が表示されないはずです
1. 問題の修正をクリック
2. 権限を付与をクリック
3. 数分経つと表示されているはずです！
![スクリーンショット 2022-12-11 17.45.00（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087368/12789191-7d14-604d-7fe1-1f9d0b071987.png)

## おわりに
開発期間が1週間ほどしかない中で利用できなくなって焦りましたが、なんとか使えるようになってよかったです...

### 参考資料
https://stackoverflow.com/questions/74750161/why-i-receive-an-error-while-creating-firebase-storage/74750337#74750337
あなたのMeet、電話通話が有効になってませんか？

# Meet使ってますかー？
みなさんMeetは使ってますか？
会社がGoogle Workspaceを使っている等で、使っている方は多いのではないかと。

ところで、会議に参加中にこんなユーザが紛れている経験はないですか？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169462/d7975fa2-bc1c-34fc-0558-4c4346f1d70e.png" width=250>
これは電話からアクセスしてきたユーザです。

電話代がかからな通信手段がたくさんあるこのご時世で、電話から参加する人は珍しいのでは？
ということで、電話からの乱入者のお話と、対策についてお話です。

# 乱入者は唐突に
会議中にユーザ一覧を見ると、見知らぬユーザが増えている…
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169462/fa9ac1a6-513d-b9db-feea-a8ee9995eb88.png" width=250>

数字の羅列で怪しすぎる & 該当者もいないので、会議は混乱…

この場では、この乱入者を強制退出させることで、平穏を取り戻したのでした。

一瞬でも誰かに聞かれていたと考えると、インシデント報告行きですね。

Meet使いが覚えておくと良い点としては、不審な参加者は **強制退出させられる** ということです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169462/49494708-ef27-4dde-5a03-c0e954d3b2d2.png" width=250>

# 乱入者は電話からやってくる
今まで全く意識してなかったのですが、Googleカレンダーを見てみると参加ボタンの下に、電話番号が出ていました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169462/ed91baee-37a6-e1f4-c795-ce7da413435b.jpeg" width=400>

この電話番号にアクセスして、PINと書かれている番号を入力すればMeetに参加することができるわけです。

この機能は[Google Workspace限定](https://support.google.com/meet/answer/9518557?hl=ja)です。
電話番号がスケジュールに出てこない場合は、電話から参加することができませんので、安心してください。

## 電話から参加するには
電話番号は国毎に共通なので、電話をかけるのは容易です。
PINコードはランダム値なので、なかなかすることも漏洩は考えづらいでしょう。

とはいっても、PINをランダムで入力していけば、会議に入れる可能性は否定できないです。
今回の場合は上記のようなアクセス方法なのですかね…

## 電話で参加したときに出来ること・出来ないこと
### 出来ること
- 会議の内容を聞くことができる
- 発言することができる
### 出来ないこと
- 画面共有は見れない
- チャットは見れない

参加者が気づかなければ、盗み聞きはできるわけですね…

# 電話からの参加を無効にしたい
漏洩のリスクになるなら無効にしたいという方もいるでしょう。

結論として、会議毎に無効化というのはできません:bomb: 

と、ここで終わってはしょうがないので…

# Workspace全体で、電話を無効
記事を書いた時点では、会議毎に電話通話を無効にすることはできないようです。

しかし、Workspace全体の設定として電話通話を無効にすることは可能です。
実際やってみましょう。

## 無効にしてみる
Google Adminにアクセス出来る方限定です。
※Workspace全体に影響するので、社内で確認を取ってから実行しましょう。

### 1. Google Adminにログインする
ぐぐるなりで、Google Adminにアクセスしましょう

### 2. meetの設定画面に移動する
- 検索バーに「meetの動画設定」と入力すると設定へのリンクが出てくるので遷移します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169462/c22f683d-9a4f-8202-6fa4-e772712e4c2c.png" width=1000>

- 「Meetの動画設定」タブにマウスを移動すると鉛筆マークがでるので押下します
![スクリーンショット 2022-12-11 18.15.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169462/94a67f2f-c425-7146-4f5f-ac01e861c18f.png)

### 3. 無効にする
1. 「ビデオ会議へのダイヤルインアクセスを許可します。」にチェックがついていると思うので、チェックを外します。
1. 「保存」を押下
![スクリーンショット 2022-12-11 18.16.52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169462/2aebfd06-542d-7fa3-be34-179b92a41537.jpeg)

※この設定変更は既存のスケジュールには反映されません。
既存のスケジュールも直ぐに反映したい！という場合は、以下の手順で更新が必要そうでした。
スケジュールからMeetのリンクを削除 → 一旦保存(ここ大事) → Meetを追加

# before
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169462/ed91baee-37a6-e1f4-c795-ce7da413435b.jpeg" width=400>

# after
すっきり :tada: 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169462/1f18982c-fd25-11c4-3f9b-e259a79ec889.jpeg" width=400>

と、設定を変更するのは、かんたんでした！
電話使わないよーっていう場合には、無効にするのを検討してみるといいかもしれないです。

この年末に大掃除として、セキュリティを見直してみるのもいいかもしれないですよ。

# 出典
- Meet の設定を管理する（管理者向け）
https://support.google.com/a/answer/7304109
Ransackで作るラクラク検索

一覧画面で検索機能を実装するにあたって、Ransackを使うと
どんな感じになるのか気になったので、実装してみました！

:::note warn
前提として、投稿機能の実装が必要ですが、その点は省略しています
:::


# 導入
まず、Gemfileを編集します。
```rb:Gemfile
gem 'ransack'
```

次に、以下のコマンドを実行します。
```zsh:ターミナル
bundle install
```

# ルーティング
```rb:routes.rb
Rails.application.routes.draw do
  resources :posts do
    collection do
      get 'search' => 'posts#index'
    end
  end

  root 'posts#index'
end
```
今回は一覧画面での実装としているため、検索時に
`posts#index`を指定しています。

# Viewの編集

```erb:index.html.erb
<div>
<h2>検索</h2>
<%= search_form_for @q, url: search_posts_path do |f| %>
  <%= f.label :body_cont, '投稿内容' %>
  <%= f.search_field :body_cont %>
  <br>
  <%= f.submit '検索' %>
<% end %>
</div>
```

検索したいカラムの指定は`カラム_cont`とする必要があります。
また、フォーム実行時のURLは`rails routes`で確認したパスを入れましょう！

Ransack自体の詳しい解説は以下の記事が参考になります。

https://pikawaka.com/rails/ransack#search_form_for%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89


# Controllerの編集
```diff_ruby:posts_controller.rb
class PostsController < ApplicationController
   before_action :set_post, only: %i[ show edit update destroy ]
+  before_action :set_q, only: [:index, :search]

  # GET /posts or /posts.json
  def index
-   @posts = Post.all
+   if @q
+     @posts = @q.result
+   else
+     @posts = Post.all
+   end
  end
# ~~~~~特に変更がないので省略~~~~~
  private

+   def set_q
+     @q = Post.ransack(params[:q])
+   end

    # Use callbacks to share common setup or constraints between actions.
    def set_post
      @post = Post.find(params[:id])
    end

    # Only allow a list of trusted parameters through.
    def post_params
      params.require(:post).permit(:body, :image, :user_id)
    end

end
```
`before_action :set_q, only: [:index, :search]`
検索、一覧画面の時に検索の情報を取得したいので設定しています。
また、以下の部分では、検索時の情報がある場合は検索した投稿をViewに渡すように
条件分岐を実装しています。
```rb:posts_controller.rb
   @posts = Post.all
   if @q
     @posts = @q.result
   else
     @posts = Post.all
   end
```


# 最後に
頑張って検索を実装するよりRansackを使った方が楽な実装だと
個人的には感じたので、今後はRansackを使っていきます！！笑
読んでいただきありがとうございました！

# 参考文献

https://pikawaka.com/rails/ransack
Pycaretで作成した機械学習モデルによる鋳鉄の黒鉛形状の分類

# はじめに
前回、[Pycaretで作成したモデル](https://qiita.com/_Moony/items/55fe57da54d320b18d12)を使って、実際の組織画像の黒鉛形状を分類するプログラムを作成しました。以下のURLに入っています。

https://github.com/repositoryfiles/GraphiteShapeClassification

# ISO945-1 黒鉛形状区分のタイプⅠ～Ⅵの黒鉛形状の分類

上記URLにアップしたプログラムを使って、ISO945-1のタイプⅠ～Ⅵの画像について、前回作成した3コラムのモデルと9コラムのモデルで推論を行った結果を表1と2にそれぞれ示します。表の各行が各画像に対する推論結果になります。
表1では、各画像の全ての黒鉛が画像名と同じタイプであると推論していますが、表2では、各画像の黒鉛に画像名とは異なるタイプのものもあるという推論結果になっています。
実際にタイプⅠ～Ⅵの各画像を見ると、「これは他のタイプだな」と思われる形状も一部含まれているので、表2の推論結果の方が妥当のように思われます。

表1　3コラムの機械学習モデルによるISO945-1 黒鉛形状区分のタイプⅠ～Ⅵの黒鉛形状の推論結果
|画像ファイル \ 推論結果|Ⅰ|Ⅱ|Ⅲ|Ⅳ|Ⅴ|Ⅵ|
|---|---|---|---|---|---|---|
|Ⅰ  |41 |0  |0  |0  |0  |0  |
|Ⅱ  |0  |23 |0  |0  |0  |0  |
|Ⅲ  |0  |0  |54 |0  |0  |0  |
|Ⅳ  |0  |0  |0  |30 |0  |0  |
|Ⅴ  |0  |0  |0  |0  |19 |0  |
|Ⅵ  |0  |0  |0  |0  |0  |21 |

表2　9コラムの機械学習モデルによるISO945-1 黒鉛形状区分のタイプⅠ～Ⅵの黒鉛形状の推論結果
|画像ファイル \ 推論結果|Ⅰ|Ⅱ|Ⅲ|Ⅳ|Ⅴ|Ⅵ|
|---|---|---|---|---|---|---|
|Ⅰ  |37 |1  |3  |0  |0  |0  |
|Ⅱ  |1  |16 |5  |1  |0  |0  |
|Ⅲ  |0  |1  |50 |2  |1  |0  |
|Ⅳ  |0  |0  |3  |22 |5  |0  |
|Ⅴ  |0  |0  |1  |4  |14 |0  |
|Ⅵ  |0  |0  |0  |0  |2  |19 |

次に、上記githunbのURLにあるサンプル画像の推論結果を表3と4に示します。
[以前の記事](https://qiita.com/_Moony/items/ec5beeaa1def4549b09a)の表の「新規格ISO法の②」の丸み係数による球状化率（sample1：86.2%、sample2：89.5%、sample3：87.7%）と比較すると、表3の3コラムのモデルで得られた球状化率は低い値になっていますが、表4の9コラムのモデルで得られた球状化率はよく一致していることが分かります。

表3　3コラムの機械学習モデルによるサンプル画像の黒鉛形状の推論結果および球状化率
|画像ファイル \ 推論結果|Ⅰ|Ⅱ|Ⅲ|Ⅳ|Ⅴ|Ⅵ|球状化率(%)
|---|---|---|---|---|---|---|---|
|sample1  |0 |3  |24  |42  |122  |86  |75.8|
|sample2  |3  |1 |35  |43  |141  |82  |75.6|
|sample3  |0  |4  |26 |44  |138  |82  |75.7|

表4　9コラムの機械学習モデルによるサンプル画像の黒鉛形状の推論結果および球状化率
|画像 \ 推論結果|Ⅰ|Ⅱ|Ⅲ|Ⅳ|Ⅴ|Ⅵ|球状化率(%)
|---|---|---|---|---|---|---|---|
|sample1  |1 |4  |17  |33  |76  |146  |86.6|
|sample2  |3  |6 |18  |29  |99  |150  |89.2|
|sample3  |1  |3  |24 |32  |94  |141  |87.0|

# 終わりに
Pycaretで作成した機械学習モデルを使って組織画像の黒鉛形状を推論し、推論結果を用いて黒鉛球状化率を求めました。9コラムと3コラムの2種類のモデルで球状化率を比較した結果、サンプル画像に対する9コラムのモデルによる結果は丸み係数による結果とよく一致しました。
とはいえ、機械学習モデルで球状化率を測定するのはプログラムが煩雑で計算時間もかかります。あくまでも、形状評価や分類に用いるべきと考えます。
なお、最適な形状パラメータの組み合わせの探求、新たな形状パラメータの追加、タイプⅠ～Ⅵの各画像において他のタイプと思われる形状を除いたデータセットの作成等により、研究的なこともできるかと思います。
何かのお役に立てれば幸いです。
【Groovy】という未知の言語を急に仕事で使うようになったので、少し調べてみた





# groovyとは

### 経歴
言語の始まりは、2003年にまで遡る。
2015年にApacheソフトウェア財団へ管理が移行し、トップレベルプロジェクトとして開発がされているゴリゴリの現役言語。
最近では、Google、Netfilxといった有名企業でも取り入れられているとか。

# groovyの特徴
### JVMで動く
何よりもまず、この特徴が挙げられる。
どのページを見ても一番上に書かれている。
Javaとの互換性が高く、非常に容易くプロジェクトに取り入れることができる。
     
### Javaの文法を簡易化したRubyライクな言語
Javaは静的型付け言語なのに対し、Groovyは動的型付け言語。
いわゆるスクリプト言語に該当する。
静的型付け言語と動的型付け言語の違いは省略するが、`Hello World!!`と出力するだけでも下記の通り記述量の違いがある。

```Java:Java
public class HelloWorld{
   public static void main(String[] args){
     System.out.println("Hello World!!");
   }
}
```

```Groovy:Groovy
println("Hello World!!")
```


# groovyのユースケース
### ユニットテストコードの記述
groovyは正式にプロジェクトのメイン言語として選定されることもあるが、調べている個人的な印象ではやはり`ユニットテスト`で使用されているケースを見かけることが多かった。
理由としては下記が挙げられる。

#### 1. （Javaと比べて）記述量が減る
Javaは安全性を重視するあまり、記述量が大くなる。一方、Groovyではやりたいことを簡易的に実行することができる。
上記でも記載したが、やはり記述量の差は歴然。

#### 2. テストケースを視覚的にわかりやすく記述することができる
Spockでテストを記述する際は、英語のように記述することができる。

```Groovy:Spockを利用したテストコード(一部)
class MyFirstSpock extends Specification {

    def "Spockテスト"() {
        setup:
        String message = "do clean!"
    
        expect:
        left + right == result
        
        where:
        left|right||result
        1|2||3
        4|5||9
        9|10||19
        
        cleanup:
        println "${message}"
    }
}
```

上記に記載した通り、事前にどのような記述方法があるのかを知らなくとも、
内容をおおまかにキャッチアップすることができる。

上記に記載の`setup`、`expect`、`where`、`cleanup`については下記の通り。
`setup`: 前提条件を記述する。
`expect`: テスト条件、実行後の期待される内容を記述する。
`where`: テストで使用されるデータ、実行結果のパターンを記述する。
`cleanup`: メソッドの一番最後に実行する。`setup`で実行される前の状態に戻す。

# groovyのチュートリアルを触ってみた所感
スクリプト言語を触るのが久しぶりだったため、まずプログラムの作成→実行できるまでのスピード感に感動してしまった。
記述もJavaを踏襲している箇所が多く馴染みやすさを感じたことも良かった。
groovyについて調べていると「まだまだ日本語の情報が少ない」との意見が散見されたが、逆に日本で発信すれば自分の情報に価値を感じてくれる人が多いのではないだろうか。
プロジェクトを進めるうちに知見もついてくると思うので、引き続き楽しもうと思う。

# 参照
  - Apache Groovy 公式
  http://groovy-lang.org/