OmniAICreator/Qiita-1.07M huggingface dataset:
IntelliJでCtrl + Shift + Rが効かない問題を解決した

## 対象者

- macユーザー
- IntelliJユーザー
- Google日本語入力ユーザー

## 現象

サービスやテストの実行で `Ctrl + Shift + R`を押しても反応しない。

※`Ctrl + Shift + D` でデバッグ起動は機能する

## 原因

Google日本語入力の「再変換」と競合していたようです…😭

## 解決策

キーボードのショートカット設定にて、
すべてのアプリケーションに対して「再変換」として
別のショートカットキーを割り当ててやることで解決しました。

![システム設定画面スクリーンショット](https://bitter-snowdrop-03e.notion.site/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fc1a7fda7-198a-466a-8dd2-0bad57d3f317%2Fbf8d9537-4422-4467-9d24-28cb874c54ff%2F7e5937c9eb7a-20221226.png?table=block&id=4b0cf9ba-84d1-4c10-a37a-96f863c1699e&spaceId=c1a7fda7-198a-466a-8dd2-0bad57d3f317&width=1400&userId=&cache=v2)

`Ctrl + Opt + Shift + R` のまず押さないキーコンフィグにして、
IntelliJの方では従来通り、`Ctrl + Shift + R` でテストが回せるようにできます。
日本語プログラミング言語Mind８で十進数計算（小数対応準備2）

### [mind8無料ダウンロード](https://www.scripts-lab.co.jp/mind8download/download.html)です。

## 小数計算を整数計算に帰着するための　桁上げ桁下げ
以下は準備１で定義済み
```
Ｌ小数型は　型紙 
Ｌ小数変換とは
Ｌ小数を文字列変換とは
```
## 指定桁数桁下げ
```
Ｌ小数を指定桁桁下げとは　（Ｌ小数、整数→Ｌ小数）
		Ｗ小数は　構造体情報	
		Ｗ桁下げは　変数
		Ｗ作業小数は　構造体　Ｌ小数型
		Ｗ桁数は　変数
		Ｗ小数桁数２は　変数
		Ｗ小数桁数は　変数
	Ｗ小数と　Ｗ桁下げに　入れる
	Ｗ小数を　Ｗ作業小数に　入れ
	Ｗ小数の　Ｌ桁数を　Ｗ桁数に　入れる
	Ｗ小数の　Ｌ小数桁数を　Ｗ小数桁数に　入れる
	Ｗ小数桁数に Ｗ桁下げを　加え　Ｗ小数桁数２に　入れる	
　	Ｗ小数桁数２が	Ｗ桁数　以上
		ならば　Ｗ小数桁数２に　一つ加え　Ｗ作業小数の　Ｌ桁数に　入れる
				Ｗ小数桁数２を　Ｗ作業小数の　Ｌ小数桁数に　　入れる
		さもなければ
				Ｗ作業小数の　Ｌ小数桁数を　Ｗ桁下げ　増加し					
		つぎに
	Ｗ作業小数を　返す。
```
## 指定桁数桁上げ
```　
Ｌ小数を指定桁桁上げとは　（Ｌ小数、非負整数→Ｌ小数）
		Ｗ小数は　構造体情報
		Ｗ桁上げは　変数  
		Ｗ作業小数は　構造体　Ｌ小数型
		Ｗ桁数は　変数	
		Ｗ小数桁数は　変数
		Ｗ桁１は　変数
		Ｗ桁２は　変数
	Ｗ小数と　Ｗ桁上げに　入れる
	Ｗ小数の　Ｌ桁数を　Ｗ桁数に　入れる
	Ｗ小数の　Ｌ小数桁数を　Ｗ小数桁数に　入れる
	Ｗ小数桁数が　Ｗ桁上げ　以上
		ならば	Ｗ小数を　Ｗ作業小数に　入れ
				Ｗ作業小数の　Ｌ小数桁数を　Ｗ桁上げ　減少し					
				Ｗ作業小数を　返し　終わり
		つぎに　
	Ｗ作業小数を　クリアする
	Ｗ小数の　Ｌ符号を　Ｗ作業小数の　Ｌ符号に　入れる
	Ｗ桁上げから　Ｗ小数桁数を　減少し
 	Ｗ桁数に　Ｗ桁上げを　加え　Ｗ作業小数の　Ｌ桁数に　入れる
	１を　Ｗ桁１に　入れる
　　１に　Ｗ桁上げを　加え　Ｗ桁２に　入れる
	Ｗ桁数　回数指定し
		Ｗ小数の　Ｌ数字（Ｗ桁１）を　Ｗ作業小数の　Ｌ数字（Ｗ桁２）に　入れる
		Ｗ桁１を　一つ増加する
		Ｗ桁２を　一つ増加する
	繰り返す
	Ｗ作業小数を　返す。
```
### テスト
```
Ｌ小数１は　構造体　Ｌ小数型。
Ｌ小数２は　構造体　Ｌ小数型。
メインは　　　　　　　　（ ・ －－＞ ・ ）
　　Ｗ文字列は　文字列実体
	「小数を桁上下げします。（空入力で終了）」と 表示し　改行し
	ここから
		「小数＝」と　表示し　文字列入力し　Ｗ文字列に　入れる
		Ｗ文字列が　空列？
  　　　　　ならば　打ち切り
			つぎに
 		Ｗ文字列を　Ｌ小数変換し　Ｌ小数１に　入れる
　　　　「０けたシフト＝」と　表示
		　	Ｌ小数１を　０　Ｌ小数を指定桁桁上げし Ｌ小数２に　入れる
			Ｌ小数２を　Ｌ小数を文字列変換し　表示し　改行
　　　　「１けたシフト＝」と　表示
　			Ｌ小数１を　１　Ｌ小数を指定桁桁上げし Ｌ小数２に　入れる
　			Ｌ小数２を　Ｌ小数を文字列変換し　表示し　改行			
　　　　「２けた桁上げ＝」と　表示
　			Ｌ小数１を　２　Ｌ小数を指定桁桁上げし Ｌ小数２に　入れる
　			Ｌ小数２を　Ｌ小数を文字列変換し　表示し　改行　
　　　　「３けた桁上げ＝」と　表示
　			Ｌ小数１を　３　Ｌ小数を指定桁桁上げし　Ｌ小数２に　入れる
　			Ｌ小数２を　Ｌ小数を文字列変換し　表示し　改行
　　　　「４けた桁上げ＝」と　表示
　			Ｌ小数１を　４　Ｌ小数を指定桁桁上げし　Ｌ小数２に　入れる
　			Ｌ小数２を　Ｌ小数を文字列変換し　表示し　改行
	　　「５けた桁上げ＝」と　表示
　			Ｌ小数１を　５　Ｌ小数を指定桁桁上げし　Ｌ小数２に　入れる
　			Ｌ小数２を　Ｌ小数を文字列変換し　表示し　改行
　　　　「１けた桁下げ＝」と　表示
　			Ｌ小数１を　１　Ｌ小数を指定桁桁下げし Ｌ小数２に　入れる
　			Ｌ小数２を　Ｌ小数を文字列変換し　表示し　改行			
　		「２けた桁下げ＝」と　表示
　			Ｌ小数１を　２　Ｌ小数を指定桁桁下げし Ｌ小数２に　入れる
			Ｌ小数２を　Ｌ小数を文字列変換し　表示し　改行	
　		「３けた桁下げ＝」と　表示
　			Ｌ小数１を　３　Ｌ小数を指定桁桁下げし Ｌ小数２に　入れる
			Ｌ小数２を　Ｌ小数を文字列変換し　表示し　改行	
　		「４けた桁下げ＝」と　表示
　			Ｌ小数１を　４　Ｌ小数を指定桁桁下げし Ｌ小数２に　入れる
			Ｌ小数２を　Ｌ小数を文字列変換し　表示し　改行	
	繰り返す。
```
### 実行結果
```
c:\mind8\pmind\sample>lnum-sub01b
小数を桁上下げします。（空入力で終了）
小数＝12345.678
０けたシフト＝+12345.678
１けたシフト＝+123456.78
２けた桁上げ＝+1234567.8
３けた桁上げ＝+12345678
４けた桁上げ＝+123456780
５けた桁上げ＝+1234567800
１けた桁下げ＝+1234.5678
２けた桁下げ＝+123.45678
３けた桁下げ＝+12.345678
４けた桁下げ＝+1.2345678
小数＝123.4567
０けたシフト＝+123.4567
１けたシフト＝+1234.567
２けた桁上げ＝+12345.67
３けた桁上げ＝+123456.7
４けた桁上げ＝+1234567
５けた桁上げ＝+12345670
１けた桁下げ＝+12.34567
２けた桁下げ＝+1.234567
３けた桁下げ＝+0.1234567
４けた桁下げ＝+0.01234567
```
チーム開発でのGitの基本操作

# はじめに
今回、初めてチーム開発に関わる（といっても本当に触り程度）ことになったので、その際の基本操作と意味をまとめておきます。
よく使う操作ばかりですが、ブランチが多く、チームで使うブランチということで気をつけてやる必要がありました。（実際の操作は会社やチームにより全然違うと思います。）

# 0. 全体のイメージ
リモートにあるブランチと自分のところ(local）にあるブランチを分けて考えておくと良いと思います。
リモートでもローカルでも同じ名前になるのでイメージしにくかったのですが、以下のことを意識したら整理できてきました。
- どのブランチにもリモートとローカルが存在していて、<font color='red'>基本的にPCで操作しているのは全てローカルのブランチ
- ローカルの内容をリモートに当てたり、リモートからローカルに取り込んでいる
（逆に言えばリモートブランチはこれだけでしか基本使わない）
- リモートブランチのことは`origin`という名前で操作している
- ブランチを移動した先も基本はローカルで、そこでの編集はまたリモート（origin）に当てる必要がある


# 1. ブランチを切る
### 全体のプロジェクトの作り
①mainブランチ　：　本番環境。ユーザーが使う部分
②devブランチ　：　開発検証環境。本番前の検証などを行う。
③featureブランチ　：　開発環境。ファイルの作成、修正などは全てここで行う。

③で作成、修正を行なっていくので、そのためのブランチを②から切ります。

### gitの操作
1. `git checkout dev` devブランチに移動（このとき移動した先もローカルのdev）
1. `git fetch` ローカルのdevブランチにリモートのdevの最新情報を持ってくる（この時点ではまだ取り込んでいない）
1. `git pull origin dev` ブランチの最新化。最新情報をリモート（origin）からローカル(dev）に取り込む
<font color='red'>※これ忘れると古い情報で進めることになるのでコンフリクト起きる原因になる</font>
1. `git checkout -b feature`最新化したdevブランチからfeatureブランチを作成


# 2. 今いるブランチの変更を上の階層のブランチに当てる
切り取ってきたfeatureブランチで修正などを行なったらそれをdevのブランチに当てる必要があります。
（いきなりmainには行かない）
ここは手順が多くなります。また、一つ注意として、ただ作成や修正した内容はローカルにすら当てられていません。まずはその作業からです。
### 編集内容をローカルのfeatureブランチに当てる
1. `git add .` 編集内容をローカルに当てる前にステージングします
1. `git commit -m "message"` ローカルのfeatureブランチに当てます

### ローカルのfeatureブランチの内容をリモートに当てる
1. `git push origin feature` リモート(origin）にローカル（feature）の内容を当てます

### リモートのdevにリモートのfeatureの内容を当てる
1. `git checkout dev` devブランチに移動する（この時の移動先もローカルのdev）
1. `git fetch` まずはdevブランチを最新化（ブランチを切るときにもやったが、編集している間に誰かがdevにその人の変更を反映しているかもしれないから最新化する必要がある）
1. `git pull origin dev` リモートのdev（origin）からローカルのdevに最新情報を取り込む（この時は先ほどのfeatureの情報は入っていない）
1. `git merge feature` 先程のfeatureブランチの情報を今いるdevブランチに取り込む（この時もローカルのdevに取り込まれている）
1. `git push origin dev` ローカルのdevをリモート(origin）に反映する

これでリモートのdevまで反映が完了です。
複数人で同時にこの作業をやると最新化されているのか分かりにくい状況になったりするので、連絡を取り合いながら順番に操作すると良いと思います。

# 最後に
自分で図などを作ってよりイメージを固めてみれば、自分がなんの操作をしているのかわかってくると思います。
私はいまだに先輩方に見ていただき、ぶつぶつ唱えながらやっていますが、自分だけでコンテンツを作っているわけではないので丁寧にやるべき作業なはず。コンフリクトが起こることもあるので、本当にやっていることがわかるまでは一人で勝手に作業しないようにします。。。
Unityでタイマー作成時にテキストオブジェクトがnullのとき

## エラーメッセージ
##### NullReferenceException: Object reference not set to an instance of an object
問題の箇所
```c#
this.timerText.GetComponent<Text>().text =this.time.ToString("F1");
```
## 何がダメだったのか
アタッチしたオブジェクトがTextMeshProで作成したテキストなのに、取得するコンポーネントで<Text>を取得しようとしていた。

## 解決策
GetComponentで取得するものを<Text>から<TextMeshProUGUI>に変えてしまえば良い
```c#
this.timerText.GetComponent<TextMeshProUGUI>().text =this.time.ToString("F1");
```
.NET Framework WPFのサンプル

# 環境
Windows 11 Pro (64bit)

```dev.bat
@echo off
path %path%;C:\Windows\Microsoft.NET\Framework64\v4.0.30319
prompt $e[33m$p$g$e[m
cmd
```

```wpf.rsp
# csc @wpf.rsp foo.cs

/r:System.Xaml.dll
/r:WPF\PresentationCore.dll
/r:WPF\PresentationFramework.dll
/r:WPF\WindowsBase.dll
```

# C# XAMLファイル

```MyWindow.xaml
<ex:MyWindow
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:ex="clr-namespace:Hoge;assembly=WpfApp"
Title="WpfApp" Width="640" Height="400">
	<Button Content="hoge" Click="btn_Click" />
</ex:MyWindow>
```

```WpfApp.cs
/*
csc /t:winexe @wpf.rsp WpfApp.cs
*/
using System;
using System.IO;
using System.Windows;

namespace Hoge {
	public class MyWindow : Window {
		public MyWindow() {
		}

		void btn_Click(object sender, RoutedEventArgs e) {
			MessageBox.Show("hello, world");
		}
	}

	class App : Application {
		[STAThread]
		static void Main() {
			try {
				var app = new App();
				var path = Path.GetFullPath("MyWindow.xaml");
				app.StartupUri = new Uri(path);
				app.Run();
			} catch(Exception e) {
				Console.WriteLine(e);
			}
		}
	}
}
```

# カスタムWindow DLL

```CustomWnd.cs
/*
csc /t:library @wpf.rsp CustomWnd.cs
*/
using System.Windows;

namespace Hoge {
	public class CustomWnd : Window {
		public void btn_Click(object sender, RoutedEventArgs e) {
			MessageBox.Show("hello, CustomWnd");
		}
	}
}
```

```foo.cs
/*
csc /t:winexe /r:CustomWnd.dll @wpf.rsp foo.cs
*/
using System;
using System.Windows.Controls;

class Program {
	[STAThread]
	static void Main() {
		var wnd = new Hoge.CustomWnd();
		wnd.Title = "foo";
		wnd.Width = 640;
		wnd.Height = 400;

		var btn = new Button();
		btn.Content = "hoge";
		btn.Click += wnd.btn_Click;

		wnd.Content = btn;
		wnd.ShowDialog();
	}
}
```

```bar.ps1
# powershell -ExecutionPolicy RemoteSigned ./bar.ps1

Add-Type -AssemblyName PresentationFramework
Add-Type -Path ./CustomWnd.dll

$xaml = @'
<ex:CustomWnd
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:ex="clr-namespace:Hoge;assembly=CustomWnd"
Title="bar" Width="640" Height="400">
	<Button Content="hoge" Click="btn_Click" />
</ex:CustomWnd>
'@

$wnd = [Windows.Markup.XamlReader]::Parse($xaml)
[void] $wnd.ShowDialog()
```
ECS Fargateのソフトウェア・アップデートについて

# 概要

ECS Fargateを運用していると時々にFargateのソフトウェア・アップデートが来たりします。
その対応と確認方法まとめです。

**通知内容**

```
Event type code: AWS_ECS_SECURITY_NOTIFICATION
English follows Japanese | 英語のメッセージは日本語の後にございます
ソフトウェアアップデートが Fargate にデプロイされました。これには、CVE パッチまたはその他の重要なパッチが含まれています。お客様で必要なアクションはございません。起動されたすべての新しいタスクは、自動的に最新のソフトウェアバージョンを使用します。実行中のタスクでは、これらの更新を適用するにはタスクを再起動する必要があります。下記のECSサービスの一部として実行されているタスクは、日本時間2023年1月19日 09:00:00 から自動的に更新されます。
影響を受けるリソースの一覧は、[影響を受けるリソース] (Affected resources) タブから [クラスタ] (Cluster) | [サービス] (Service) 形式でご確認いただけます。
日本時間2023年1月19日 09:00:00 以降、Fargateはこれらのタスクを徐々に再開し始めます。通常、サービスは更新中にほとんど中断されないはずです。タスクがローカルの一時ストレージに保存したデータは、スケールダウンイベントと同様に利用できなくなります。この再起動のタイミングを制御したい場合は、force-new-deployment を指定する ECS コマンドラインインターフェイスからupdate-service コマンドを実行することにより、日本時間2023年1月19日 09:00:00 より前にサービスを更新できます。例:
$ aws ecs update-service --service service_name \
--cluster cluster_name --force-new-deployment
Fargate の更新プロセスの詳細については、ECS 開発者ガイド [1] を参照してください。
ご質問やご不明な点がある場合は、AWS サポート [2] までお問い合わせください。
[1] https://docs.aws.amazon.com/AmazonECS/latest/userguide/task-maintenance.html
[2] https://aws.amazon.com/support

Affected resources (showing 3 of 3)
XXXcluster/XXXservice
XXXcluster/XXXservice
XXXcluster/XXXservice
```

# 対応方法

**CloudShellでコマンド実行**

<dl>
    <dt>確認コマンド</dt>
    <dd>サービス名</dd>
    <dd>プラットフォーム名</dd>
    <dd>プラットフォームバージョン</dd>
    <dd>サービス作成時刻</dd>
</dl>

※このサービス作成時刻（.deployments[].createdAt）が重要で、Fargateのソフトウェア・アップデートが実行されたかどうかの判断材料になります


```
aws ecs describe-services --cluster <cluster name> --services <service name> | jq -r '.services[] | .serviceName, .launchType, .platformVersion, .deployments[].createdAt'
```

**アップデートコマンド**

```
aws ecs update-service --service <service name> \
--cluster <cluster name> --force-new-deployment
```

# まとめ
ソフトウェア・アップデートの対応自体はとても簡単で影響範囲もほぼ発生しないものなのですが、アップデートが実施されたかの確認方法が記載されていなかったので、
色々調べてサポートへ問い合わせを実施したりした結果、サービス自体が再生成されていれば問題ないとのことでした。
確認方法としてはちょっともやっとする所ではありますが、これもマネージド・サービス故なので割り切っていこうと思います。
この記事が同じことで悩んでる方に役立てば幸いです。
【Laravel6.x】共通ヘッダーのアイコン画像を動的に表示する方法

## 問題
共通ヘッダーのアイコン画像を動的に表示したい

## 最終ゴール
![スクリーンショット 2024-04-23 21.13.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/0e339de5-941f-3d36-7c9f-d4f739da7eb8.png)

## 結論
LaravelのViewComposerで、
Viewにて使用する共通のデータを設定すればOK！

## 手順
### ⓪画像をアップロードできる状態にする
以下サイトの手順通りやればOK

https://qiita.com/honaki/items/091b5277e09a175d74f1

### ①ComposerServiceProviderの作成
```ComposerServiceProvider.php
<?php
namespace App\Providers;
 
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

use Illuminate\Http\Request;
use App\User;
use Illuminate\Support\Facades\Auth;

class ComposerServiceProvider extends ServiceProvider
{
    public function boot()
    {
      // 共通ヘッダー画像
      View::composer('*', function($view) {
            // ログイン状態か判別
            // これしないとログインページでエラー(「Trying to get property 'file_path' of non-object」)になる
            if(Auth::check()) {

              $user = Auth::user()->file_path;
              
              // 存在するか判別
              if( Auth::user()->file_path ) {
                $view->with('icon', $user);
              } else {
                // なかったら静的な画像を表示
                $view->with('icon', asset('/assets/sample-icon_daily-budget-tool.webp.webp'));
              }
            }
        });
    }
}
```

### ②providersにComposerServiceProviderの登録
```config/app.php
'providers' => [
    // ・・・
    App\Providers\ComposerServiceProvider::class,
],
```

### ⓪画像をアップロード処理
ここで解説

### ③ヘッダー箇所のimgタグ用意
```header.balde.php
<div class="header-right pc_tab">
    <a class="btn btn-success ml-1 d-flex align-items-center" href="{{ route('index') }}">予算</a>
    <a class="btn btn-success ml-1 d-flex align-items-center" href="{{ route('budget.create') }}">予算登録</a>
    <a class="btn btn-success ml-1 d-flex align-items-center" href="{{ route('spending.create') }}">支出登録</a>
    <div class="profile-picture profile-picture-header ml-1">
        <a href="{{ route('profile.index') }}">
            ↓⭐️ここ↓
            <img class="img-fluid cursor_pointer img_opacity" src="{{$icon}}" alt="Profile Picture">
        </a>
    </div>
</div>
```
【解説】
src="{{$icon}}"は、手順①「ComposerServiceProviderの作成」で設定したiconのこと


### ④ViewComposerをクラス化して外部ファイルにする
続きは以下サイトで

https://www.webopixel.net/php/1287.html


## 参考サイト
https://www.webopixel.net/php/1287.html

https://zenn.dev/fuwakani/articles/d52d36d4ec27a5e8ba13
ディレクトリとファイルを一気に作成する方法（VSCode小技）

たとえば aboutディレクトリがあったとして、「aboutの中に /hobby/pokemon/meowscarada/index.html を作成したいな〜」となったとき、
1. 「aboutディレクトリ内にhobbyディレクトリを作成」
1. 「hobbyディレクトリ内にpokemonディレクトリを作成」
1. 「pokemonディレクトリ内にmeowscaradaディレクトリを作成」

1. 「meowscaradaディレクトリ内にindex.htmlファイルを作成」

なんてやってたら日が暮れてしまいます。

**実はファイルを作成→「hobby/pokemon/meowscarada/index.html」とするだけで途中のディレクトリも勝手に作成してくれます。**

![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704882/7969406a-781d-8ce7-bf1d-a9dbf64199a8.gif)
CDKの"Export $output cannot be updated as it is in use by $stack"エラーをソースコードをいじらずに解決する方法

## クロススタック参照しているとよくでるエラー
```
HogeStack Export HogeStack:ExportsOutputRefhogefuga cannot be updated as it is in use by FugaStack
```
HogeStackでexportしている値をFugaStackが使ってるから更新できないよ！
クロススタック参照しているとよく出くわすエラーです。

## ソースコードをいじらずに解消する方法
下記手順を行うと、ソースコードをいじらずに解消できます。
本質的には、このエラーが出るようなクロススタック参照はやめるべきだと考えていますが、とりあえずデプロイを通したい時などはこの方法でサクッといけます。

1. FugaStackテンプレートの`Fn::ImportValue: HogeStack:ExportsOutputRefhogefuga`を実際の出力値に書き換えた変更セットを作成する
    - ※このとき、変更セットに差分がないことを確認します 
1. FugaStackに作成した変更セットを実行します
1. HogeStackでデプロイを行います

それでは、よいCDKライフを...
kaggleの生成AIコンペ：LLM Prompt Recoveryに参加しました。

最近、KaggleのLLMコンペ（LLM Prompt Recovery）に参加し、銀メダルを獲得しました。色々学びましたので、共有したいと思います。

このコンペでは、original_textとrewritten_textという2つの文字列が与えられます。rewritten_textはGemma-7Bを用いてoriginal_textから生成されたものです。その生成に使用されたプロンプト文を予測することが目的です。


アプローチとしては、LLMのファインチューニングとmean prompt2種類がありました。mean promptとは、すべてのテストデータに対して一つの固定されたプロンプトを予測する方法です。コンペの中盤で、ある参加者から逆の類似度計算を通じて、ほとんどのプロンプトに共通する単語を特定できました。これらの単語を組み合わせて作成したプロンプト文を提出すると、結構高いスコアを得ることができました。

# 取り組み

私のチームでもmean promptを試しました。
まず、トレーニング用のサンプルプロンプトを用意し、それらを全部ベクトル化しました。
次に、これらのベクトルのcosine類似度をT5モデルで計算し、平均値を取りました。（この平均値は、すべてのサンプルプロンプトの平均精度を示しており、中身の単語をランダムに置換・削除するなどして新しい文字列を生成し、ベクトルの平均値も更新しました。）
このプロセスを繰り返すことで、最適なmean promptも見つけました。（cosine類似度が上がった場合は新しい文字列を採用）
しかし、mean promptは高スコアを出す一方で、公開テストデータが15%に過ぎないため、最終的にはスコアが低下するリスクがあると考え、モデルのファインチューニングも試しました。（ですが最後はほぼほぼshakeなかったです）

コンペ後半には、Mistral-7B-Instruct-v0.2（LLM名）をファインチューニングしました。
データ生成に特定の推論テンプレートを用意し、テキストの種類に応じた書き換えテキストを生成できるようにしました。
このテンプレートを用いて複数のグループの学習データを作成し、それを使って複数のモデルをトレーニングした後、最後すべてのモデルをアンサンブルすることでさらに精度を向上しました。

結果として、この2つの方法のスコアは非常に近く、どちらにしても銀メダルは取れます。また、1位のチームのsolutionを見てみると、彼らはmean promptをさらに改良させて、最も精度に影響が高い単語「lucerarea」を見つけ出しました。この単語をprompt文に加えれば、普通に金メダル取れます（Magicですね）

# まとめ
今回のコンペは非常に面白くて、LLMのトレーニングについての理解も深めることができたと思います。あと金一枚でMasterに上がれますので、引き続き頑張りたいと思います。

興味ある方：

https://www.kaggle.com/competitions/llm-prompt-recovery/overview
SwiftUI @State, @Environment, @Bindable 使い分け

## かんたんに
- `@Observable`は、マクロの一種
- `@State`, `@Environment`, `@Bindable`はプロパティラッパーの一種
- `@State`, `@Environment`, `@Bindable`は`@Observable`とインターフェースさせるために利用される
- `@State`は、ビューの状態をモデルに格納
- `@Environment`は、値をグローバルにアクセシブルな値として伝搬させる
- `@Bindable`は、軽量、その型からバインディングを作成できるようにすることだけ

## 使い分け

![SwiftUI](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281147/163e8076-05c6-89e2-8bec-4cbfdbc2a078.png)

モデルはビュー自体の状態である必要があるか？ → Yes: `@State`
モデルはアプリケーションのグローバル環境の一部である必要があるか？ → Yes: `@Environment`
モデルに必要なのはバインディングだけ？ → Yes: `@Bindable`
全ての質問がYesでないなら、モデルをビューのプロパティとして使用するだけ

## 参考

[Discover Observation in SwiftUI](https://developer.apple.com/videos/play/wwdc2023/10149/)

## あとがき

- 使い分けを知ることによりその用語の役割、機能について知ることが出来ました。
- `ObservableObject`から`@Observable`への変更など古いSwiftUIからの移行についても案内されていて親切だと思いました。
- WWDC2024で早く新情報が提供されることに期待してます。
Building Your First Android App: A Step-by-Step Guide

# Building Your First Android App: A Step-by-Step Guide

***Developing a Basic Android App: A Step-by-Step Guide***
[Android app development](https://www.sciflare.com/android-application-development/ "Qiita Home") is an exciting journey. Here's a step-by-step guide to get you started, from setting up your environment to deploying your app:

**1. Setting Up Your Development Environment**

Install Android Studio: This is the official Integrated Development Environment (IDE) for Android app development. Download it from the Android developer website [Android Studio download].

Set Up SDK (Software Development Kit):  The Android SDK provides the tools and libraries needed to build Android apps. Android Studio includes an SDK manager to install necessary components.

Connect a Device or Emulator: You can test your app on a physical Android device or an emulator (simulated device) within Android Studio. Configure your device or create an emulator for testing.

**2. Creating Your First Project**

Launch Android Studio and choose "Start a new Android Studio project".
Select an Empty Activity template (recommended for beginners).
Give your app a unique name and company domain.
Choose your target Android API level (minimum version your app supports).
Click Finish to create the project.

**3. Building the User Interface (UI)**

Android Studio uses XML for defining layouts. The layout editor allows you to visually design your app's screens using drag-and-drop functionality.
Common UI elements include buttons, text views, edit texts, and images. You can add these elements from the palette and arrange them in your layout.

**4. Adding Functionality (Coding)**

Android Studio uses either Java or Kotlin for programming. (Kotlin is Google's recommended language)
The code interacts with the UI elements and defines the app's behavior. For a basic app, you might write code to handle button clicks, display text, or perform simple calculations.

**5. Testing and Debugging**

Run your app on your device or emulator to test its functionality. Android Studio provides debugging tools to identify and fix errors in your code.

**6. Deploying to Google Play Store**

Ensure your app meets Google Play Store's quality standards and guidelines.
Create a developer account on the Google Play Console.
Upload your app bundle or APK (Android Package Kit) file along with screenshots, descriptions, and other required information.
Pay a one-time registration fee to publish your app.

**Learning Resources:**

Android Developer Tutorials: https://developer.android.com/courses
Android Codelabs: https://developer.android.com/get-started/codelabs
Online Courses: Many online platforms offer beginner-friendly Android development courses.

**Remember:** 

This is a basic overview. Building complex apps will involve more advanced concepts.  As you progress, explore the resources mentioned above to delve deeper into [Android app development](https://www.sciflare.com/android-application-development/ "Qiita home"). Happy coding!
プチ話 ブログが書きやすくなった話

こんにちはAtsu1209です。
今回はちょっとした話を書いていきたいと思います

# ホームページ
実は私ホームページがありまして、そこの中でブログも一緒に書いています。
ホームページ↓

https://atsu1209.github.io/home

ブログ↓

https://atsu1209.github.io/home/blog

デザイン(CSS)は苦手なのでﾕﾙｼﾃ...

# ブログ
実はブログを書くときに、なんと`<li>`を自分で増やして書いていました。
つまりHTML側を書き換えてブログを作ってたんです。
やばいですよね...

しかもGithubPagesです。

# 大発明
もうHTMLを書くのは嫌なので流石にブログ作成ツールを作りました。

HTMLで`<input>`に入力されたタイトルや本文をJavaScriptでまとめて
もろもろ出力するようになってます。

:::note info
めっちゃ楽!
:::

まあRubyやPHPを使えば一瞬だと思いますが、僕はまだ勉強中なので
このまましばらくブログを書いていきます。

# 最後に
今日の反省: 早くRuby,PHP,Node.jsを使えるようになろう

おわりー
では
～機械学習エンジニア（長期インターン）内定への道～ 

## 始めに
前回初めての記事を投稿してから、約2カ月が経ちました。今回は進捗があったため、その内容について記事にさせていただきました。
タイトルにもありますが、機械学習エンジニア（長期インターン）としての内定をいただきました。大学１年の頃からエンジニアとして働いてみたく、累計20社近く落ちての内定でした。
この記事では独断と偏見で、機械学習エンジニア内定に必要なスキルについて説明していこうと思います。

## 自己紹介
- 学歴フィルターにギリかからない関西の大学の3年生
- プログラミング歴2年半
- Atcoder茶色
- Kaggler（メダルなし）

## [ポートフォリオ](https://github.com/morikazu1119?tab=repositories)
ポートフォリオには、kaggleのコンペティションでのプログラムやkaggle datasetから拾ってきたデータから作成したモデルのプログラムなどがあります。

## 時系列
- 2021年11月　プログラミングの勉強始める
- 2022年4月　入学（約5社全落ち）
- 2022年8月　夏休み（約10社全落ち）
- 2023年3月　春休み（約3社落ち、コンサル系1社内定＆入社）
- 2023年8月　夏休み（約5社全落ち、その内の1社が後の内定）
- 2023年10月　コンサル系の会社を退職（プログラミングをほぼ使わないため）
- 2024年3月　春休み（3社全落ち）
- 2024年3月　大学講義開始（1社内定、1社途中辞退）
 
## 内定までに行ったこと
直近の半年間で行ったことを説明します。それ以前は、プログラミングのスキルが今思うとカスだったので割愛します。

- Atcoderの大会に参加し、半年で[Atcoder茶色](https://qiita.com/pippo1222/items/47ae38da0bd0913e77a6)になる
- Kaggleのコンペティションに参加し、銅メダルを目指したモデル作成（1からモデルを作れる実力をつけることが**最重要**）
- 書籍を通して、理論的な部分について学ぶ（ここが甘いと、面接で詰められた時に詰みます）
- 自身でデータ（kaggle dataset）を拾ってきて、モデルを作ってみる

私がこの中で重要だと考えるのは、とりあえずAtcoder茶色と、kaggleでのモデル作成だと思います。

Atcoder茶色は、最低限のアルゴリズム、コーディング力の証明になります。機械学習エンジニアでなくとも、実力の証明になります。（緑ならもっと良い）

Kaggleでのモデル作成の経験は、自身のポートフォリオ（エンジニアとしての採用ならほぼ必須）になります。また、一度モデル作成を経験しておくと、なんとなくコツがつかめてくるのでおすすめです。

意外とこのくらいでも実力は十分につきます。色々な参考書などがあると思いますが、本に手を付けて理論を学ぶ前に、kaggleでモデル作成をとりあえずやってみた方がいいと思います。私自身、作成したモデルの理論的な部分を完全に理解しているわけではありません。（ただし、ある程度は理解していないと面接で詰みます）

## 選考について
選考では、書類選考 → 面接 → 課題 or Webテスト → 面接 → 内定の順番が基本で、1ヶ月以上の選考になることあります。

まず、書類審査ですが、学歴が旧帝大・早慶であれば落ちないかもしれませんが、March・関関同立であれば、+αの実績がなければ、普通に落とされます（経験あり）。私の場合は、Atcoder茶色、kaggle大会出場経験、ポートフォリオを強みにできたため、書類審査は無事にほぼ通過できるようになりました。

一次面接では、ヒアリングなどの軽い面接が多く、業務内容が合わないとその時点で、落とされます。基本的に合っていれば通過します。

課題では、私の場合データセットが与えられ、分類モデルの作成を行いました。また、分類の結果、モデルについてのスライドの提出を求められました。さらにそのモデルについての発表がありました。（私の場合は課題発表まで通過しましたが、他社の内定があるため辞退しました。）

Webテストでは、IQテスト、コーディングテストなどがあり、どちらも受けたことがありますが、IQテストは全然できませんでした。SPI試験の強化版（数学強め）みたいな問題でした。（この企業の結果は出ていませんがおそらく落ちました。）

コーディングテストの方では、半年前に受験したことがあるというのと、そのとき落ちた経験から、対策をしたところ無事に通過しました。対策としては、機械学習・深層学習の理論についての勉強、Atcoderでのアルゴリズムの勉強をしました。半年前ではアルゴリズムのコーディングに40分かけてできなかったのが、今では5分で解けました。

二次面接（最終面接）では、自身のポートフォリオについて詳しく聞かれました。ほとんどポートフォリオの機械学習モデルについての質問でした。あとは、事務的な質問のみでした。

機械学習モデルの質問では、モデルの目標としていることは何か？、どのように特徴量エンジニアリングを行ったか？、なぜそのモデルにしたのか？、何が難しく、どのように改善したのか？などについて聞かれました。私はこれらの質問に、完璧には答えられませんでしたが、内定を頂きました。（正直、落ちたと思っていました）

## 最後に
数十社落ちても気にしないでください。また、実力を付けてもう一度挑んでも良いと思います。私も再度受けて採用を頂きました。

学歴も大事だとは思いますが、実力でカバーすることも可能です。何をすれば良いかわからないときは、面接の際に、現役のエンジニアの方々に聞いてみるのも手だと思います。私は、面接の逆質問で落ちたと確信したときには、必要なスキルについて質問を行いました。また、不採用通知をいただいた際にも、どの部分が不足していたのかについて質問をしました。

一番大事なのは、貪欲に取り組むことです。不採用すら自身の糧にして下さい。
デザインパターン　~テンプレートメソッドパターンとファクトリーメソッドパターン~

# はじめに

今回はデザインパターン23種類中の2つであるテンプレートメソッドパターンとファクトリーメソッドパターンについて学んできたのでそれをまとめたいと思います。
# Template Methodパターン

一言でいえば「サブメソッドの書き換えで処理を変える」パターンです。

今回はなにかのデータをテストするプログラムについて考えてみます。
テストは
①データをつくる
②データを操作する
③検証する
の三つの流れで成り立っていますよね。

このように決まった手順で処理を行いたいとき活躍するのがテンプレートメソッドパターンです！


大きな抽象的なメソッドをつくり、その中で具体的なサブメソッドを呼び出すようにします。



具体的に書くと以下のようになります

UnitTestの中身は

```
 public void UnitTest()
 {
     var data= CreateData();
     Operate(ref data);
     Validate(data);
 }
```
というようにサブメソッドが順番に並べられることになります。

以下の図を見てください。親クラスのサブメソッドは抽象メソッドで構成されています。
親クラスUnitTestでUnitTest()の処理の枠組みを決め、親クラスのサブメソッドを子クラスでオーバライドし具体的な処理の内容を実装します。

![2024-04-23_17h21_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629646/9186bc93-62ba-72f7-dac8-5c47c4e635da.png)

このようにすることで、本来であればValueCheck、CollectionCheckにそれぞれ独自のメソッドを用意することになりコードの重複も多く生まれてしまう問題を解決することができるのです。

# Factory Methodパターン

一言でいえば「インスタンスを作ってそれによって処理を変える」デザインパターンです。

今回は生徒をソートするプログラムについて考えてみましょう。生徒をソートする方法...名前、ID色々ありますよね。

比較するための(Icompareを実装した)インスタンスを新しく生成してそれを利用してそれぞれのソート方法で比較します。オブジェクトの生成をサブクラスに任せることで依存度を下げ、保守性が高まるのです。


![2024-04-23_18h52_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629646/71b22d33-54f4-2c58-e4cd-8e9bdf7fb837.png)


なお、名前でソートしたくなったときはNameSortクラスとNameCompareクラスを増やせばよいです。

# 終わりに
今後もデザインパターンひとつづつ学習し、習得していきたいと思います！同じく学習中のエンジニアさんたち、お互い頑張っていきましょう！！
Rails ERD触ってみた

# はじめに
みなさまこんにちは。
今回、railsのgemであるRails ERDを使用してみたのでまとめました。

## Rails ERDとは
RailsのモデルからER図を自動生成することができるgem
以下の画像のようにER図を自動生成してくれます。
![erd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/eba1617a-e88e-4b3d-f63f-946b044956be.png)

出典

https://github.com/voormedia/rails-erd

## セットアップ
#### Graphvizをインストール (オープンソースのグラフ可視化ソフトウェア)

Graphvizとはグラフ作成用のツールで、DOT言語というものを用いてテキストファイルを画像として出力することが　できる便利なやつです。

```
$ brew install graphviz
```

#### rails ERDをgemに追加

``` ruby:Gemfile 
group :development, :staging, :production do
 gem 'rails-erd'
end
```

```
$ bundle install
```


#### 実行方法
これだけ
```
$ bundle exec erd
```

ちょっと待つと、こんな感じのファイルが生成されます。
![スクリーンショット 2024-04-23 17.17.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/a49a8ae9-6d7b-3672-4768-4e7b14af92e1.png)

<br />
開いてみると、こんな感じのER図が生成されています。めちゃ便利。
今回はまぁまぁ適当にECサイトで使いそうなモデルを書いて出力してみました。
<br />

![スクリーンショット 2024-04-23 17.18.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/6ed6eec9-45e3-1b77-7934-e576961ca213.png)

#### カスタマイズもできます
オプションをつけるとカスタマイズ可能になります。
上で生成したER図にオプションをつけて生成します。

- タイトルをつける
- 主キーを表示
- ファイルの名前をつける
- 出力されるファイルの拡張子の設定(デフォルトだとpdf)

```
$ bundle exec erd --title="お試しECサイトER図" --attributes=primary_keys --filename=ec_test_er --filetype=png
```

するとこんな感じに出力されたりします
![スクリーンショット 2024-04-23 17.26.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/fd8236b7-ae56-1186-2d7f-331dca199004.png)


その他オプションはこちらから
https://voormedia.github.io/rails-erd/customise.html


### 中身はどうなってんの？

詳しいことはあまりわかりませんでしたが、なんとなく、、、、

- Rails がすでにモデルの情報や関連付けの情報などは用意していて、そのデータをrails erdで加工している。

- ActiveRecord::Base.descendantsメソッドで、アプリケーション内の全てのActiveRecordモデルクラスを返している

- reflect_on_all_associationsメソッドでモデルクラスのすべてのアソシエーションを返している。

   つまり、belongs_to、has_one、has_many、has_many :through、has_and_belongs_to_manyなどのすべてのアソシエーションを含む配列を返す

- reflect_on_all_associationsメソッドから得られるAssociationReflection オブジェクト から関連付けに関する情報を得ている

- エンティティ、カラムの情報（カラム名、PK, UK, FKなど）、関連付け、カーディナリティは、結局のところモデルと AssociationReflection オブジェクトからうまく情報を取り出して得ている


# さいごに
いいねぇ
情報管理おすすめのツール

バックエンドエンジニアの大和道子です。
エンジニア初心者はノートを取ることが多くあり、情報整理をどうしたら良いか迷うこともあるのではないでしょうか？
私が1年間エンジニアをやってきて、情報をまとめるツールの使い分けで良かったものを紹介します。

## 注意点
会社の重要な情報に関係する場合はローカル保存、もしくは会社のアカウントでツールを使用しましょう

## 構造化されたノートを取りたい
**VS Notes**
[【2023年版】VSCodeでメモやWikiを作るのにおすすめ！拡張機能VSNotesの使い方まとめ!](https://kosiro.tech/dev/how-to-use-vsnotes.html)

マークダウンファイルなので、構造的なノートを取るのにおすすめ。
人に渡したり、ブラウザで表示させたりできる。

## 雑多なメモが取りたい
**OneNote**
[ワンノート（OneNote）の使い方！ 無料で使える便利機能とは](https://allabout.co.jp/gm/gc/453716/)

自由な位置に配置できるので、構造化したくない雑多メモを取るのにおすすめ

### おすすめポイント
- 自由な位置に配置できる！
- ペーストしたら勝手にリンクを貼ってくれる

↓雑多メモ例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1350204/3c243317-c267-ff04-7593-344e101791f1.png)

## ハドルの議事録が取りたい
**slack の canvas**
[Slackの新機能canvasについて解説してみた](https://qiita.com/Takaa/items/1853a83470971566a823)
[公式サイト](https://slack.com/intl/ja-jp/features/canvas)

ハドルへの返信で canvas を作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1350204/5220b45e-e4fb-d393-de98-110258b97b1c.png)

議事録用
スラックのハドルで話し合うときの議事録はできれば個人メモではなく、 canvas に取ってチーム全体に公開しましょう

### おすすめポイント
- 共同編集できる
- slack 内検索にも引っかかる
ブロック内のアロー関数と普通の関数の違い

こういう記事があり
- [【JS】「ただの {}（ブロック文）」を使うと嬉しいこと](https://zenn.dev/kagan/articles/js-plain-block-statement)

ブックマークレットに使えると考えて実験した結果を共有します。

```javascript
{
  function a() {
    console.log("aaaaaaaaaaaaaaaaaaaa");
  }
  const b = () => {
    console.log("bbbbbbbbbbbbbbbbbbbb");
  };
  a();/* aaaaaaaaaaaaaaaaaaaa */
  b();/* bbbbbbbbbbbbbbbbbbbb */
}

a();/* aaaaaaaaaaaaaaaaaaaa */
b();/* ReferenceError: b is not defined */
```


以上のように、ブロック内で定義されたアロー関数は外では利用できないことがわかりました。

### 追記：2024-04-24

直前の部分について次のようなコメントをいただきました。
> ブロック外で使用できないのは「ブロック内で定義したアロー関数」だからではなく、「ブロック内でブロックスコープであるconstを使って宣言した」からです。
なので、constではなくvarで宣言してしまうと、「ブロック内で定義したアロー関数」であってもブロック外でも使用できてしまいます。

その通りですね。内容について付け加えたいことはありません。

`var` って何？って人のために解説すると、`ES2015` 以前には `var` 文というものがあり(今でも使えます)、人々は関数スコープまたはグローバルスコープに所属する変数を宣言していました。
プログラマがグローバル名前空間の汚染を避けたい場合は次章で言及している即時実行関数式を使っていたと伝えられています。
アロー関数は `let`、`const` と同じ `ES2015` で導入されました。正直に言うと、アロー関数を「constではなくvarで宣言」するという発想はまったくなかったですね。

`JavaScript`のスコープはグローバルスコープ、関数スコープ…というふうに別れています。この説明はブックマークレットの記事でやることではないので、別の記事に譲ります。

- [Scope (スコープ) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN](https://developer.mozilla.org/ja/docs/Glossary/Scope)
- [文と宣言 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements)

`var` の動作は以下のサンプルコードの通りです。
今回初めて知ったのですが `  var var_f = () => {}` って動くんですね。そりゃ、動くんでしょうけど思いつきませんでした。

```js
{
  var var_str = "var_text";
  let let_str = "let_text";
  const const_str = "const_text";
  let let_f = () => {
    console.log("let_f");
  };
  var var_f = () => {
    console.log("var_f");
  };

  console.log(var_str, let_str, const_str); // var_text let_text const_text
}

var_f(); // var_f
console.log(var_str); // var_text
let_f(); // ReferenceError: let_f is not defined
console.log(let_str); // ReferenceError: let_str is not defined
console.log(const_str); // ReferenceError: const_str is not defined
```

つまり、アロー関数や変数をブロック内に封じ込めるには 
- `const` 、`let` で宣言する
- `var` を使う際には、即時実行関数式でラップする

が必要になります。

## 何が嬉しいか？

ブックマークレットではグローバル名前空間を汚さないためにスクリプトを即時実行関数式でラップすることが推奨されています。
ブロックはブックマークレットでの即時実行関数式の代替として利用できます。

ブロックは単純にタイプ数が少ないのとカッコを数えやすいという利点があります。
逆に即時実行関数式には `function`宣言された関数と `var` 宣言された変数、関数があってもはグローバル名前空間を汚さないという利点があります。

## Link

- [IIFE (即時実行関数式) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN](https://developer.mozilla.org/ja/docs/Glossary/IIFE)
- [ブロック - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/block)
RDSのスナップショットの暗号化に対応するKMSのキーを作成する

## 概要

RDSのスナップショットの暗号化に対応するKMSのキーを作成する方法を簡単にまとめる。

## 方法

- 下記のようにキーの設定を行う

| 項目 | 内容 | 備考 |
| --- | --- | --- |
| キータイプ | 対照 |  |
| キーの使用方法 | 暗号化および複合化 |  |
| エイリアス | キーの任意の名前を設定 |  |
| キーの管理者 | 任意のユーザーを設定 | 本キーの管理者を設定する |
| キーの削除 | チェックを入れる |  |
| キーの使用法アクセス許可を定義 | 任意のユーザーを設定 | 本キーを使うことのできるユーザーを設定する<br>自分で使いたい場合必ず自分のユーザーを指定する |
Elixirで言語処理100本ノックやってみた！vol.7

こんにちは！
3ヶ月で、Elixir言語で開発できるようになるため、奮闘中のこーへーです！

１００本ノックも気づけば後半戦で、なんだかんだ1ヶ月弱やっています。
現在はどんな心境かというと、面白いと思える領域まで来ていますが寝食をわすれるほどかというとそうではないです。笑

でも、寝食を忘れそうな予感はしているし、寝食を忘れることを忘れた頃にはなかなかいい線行ってるんじゃないかと自分に期待してます。


はて、さて、vol.7をやっていきましょう。
ん〜vol.7はこれでいいのかっていうくらい簡単でびっくりしました。

それでは、やってみたいと思います。

[100本ノックの記事はこちら](https://nlp100.github.io/ja/ch01.html)

### 07. テンプレートによる文生成Permalink
引数x,y,zを受け取り「x時のyはz」という文字列を返す関数を実装せよ．さらに，x=12,y=”気温”,z=22.4として，実行結果を確認せよ．

#### StatementGenerationモジュールとreturn_string関数の作成
```
defmodule StatementGeneration do
  def return_string(x, y, z) do
     IO.puts("#{x}a" <> "の#{y}は" <> "#{z}")
  end
end
```

#### StatementGeneration.return_string(12, "気温", 22.4)の実行

```
iex(9)> StatementGeneration.return_string(12, "気温", 22.4)
12aの気温は22.4
:ok
```

まとめ
今回はとても簡単でしたが、Elixirの`"#{}"`文字列内挿入を使ってみました。`"#{}"`はElixir特有の書き方ですが、コードの可読性も良いですし、色々な場面で使えそうですね。

では、vol.8に進みたいと思います。
GitHub の discussions で使える HTML の便利記法

バックエンドエンジニアの大和道子です。
GitHub で開発をしていると、discussions を活用して情報を共有することがありますが、HTML の記法を使用することで、読みやすく柔軟な書き方が可能になります。
ぜひ使ってみてください！

# ページ内リンク

ページ内リンクが紐づけられないなーというのではまったので備忘録
discussions が長くなる時は文書を分けるか、目次を作ってあげると優しいです。

## 書き方
[ここに飛びたい！](#ここに飛びたい)

- リンク
  - 書き方
`[表示させたい文字列](#段落リンク)`

  - 例
`[ここに飛びたい！](#ここに飛びたい)`

- 飛びたい先の段落
  - 書き方
`## 段落名[半角スペース]<a href="段落リンク" id="段落リンク"/>`

  - 例
`## ここに飛びたい！ <a href="ここに飛びたい" id="ここに飛びたい"/>`

## 段落リンクの注意点
- 段落の深さに関係なく、`#` は1個
- 全角記号は抜く
- 半角スペースは`-`

### 参考
[Qiita Markdownのページ内リンクの罠](https://qiita.com/hennin/items/7ee58dd7d7c013a23be7)

## ここに飛びたい！ <a href="ここに飛びたい" id="ここに飛びたい"/>
飛べた

# 折り畳みセクションが作りたい

<details>
  <summary>こんなやつ</summary>

## 内容
たくさん書いて長くなっちゃうときに便利

</details>

## 書き方

```
<details>
  <summary>トグルの横に表示する文字列</summary>

折りたたまれる箇所

</details>
```
XML のエスケープ

バックエンドエンジニアの大和道子です。
今回は C# のソースコードを書いていて `<` と `>` が書けなくて困ったので解決方法を共有します。

C# のソースコード内の XML コメントに以下の文字は使えません。
- `<`
- `>`
- `&`

代わりに、以下の文字を使います。
- `<` は `&lt;`
- `>` は `&gt;`
- `&` は `&amp;`

例
`&lt;&gt;`
↓
&lt;&gt;

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1350204/e255946f-7c9c-e403-0ea7-39dc838357a6.png)

参考
[XML のエスケープについて](https://a4dosanddos.hatenablog.com/entry/2015/10/01/012931)
Visual Studio の開発効率向上 Tips

バックエンドエンジニアの大和道子です。
今回は、自分が開発作業をしていて開発効率が向上したコツをお伝えします。


## スペルチェッカー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1350204/5dc841d5-7a4a-9d4d-e699-e614cc7f84d6.png)
独自の単語は該当コードを右クリックして「○○を無視する」で以後指摘されなくなります。

## 全文書検索
**ctrl + shift + f** で全文書検索ができます。
自分用のメモを「TODO 大和: 」のようにコメントすると決めておけば後で検索できるので作業しやすくなります。

## コードのクリーンアップ
**[分析] -> [コードのクリーンアップ]**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1350204/f3de21df-9f55-1348-6a80-26cf1f329fa3.png)
何をしてくれるかはコード クリーンアップの構成を確認してください。既定の設定で良いと思います。
修正をしてプルリクに出す前に**必ず**実行しましょう。

### 参考
上記のやり方では、ソリューション内のすべてのドキュメントを整形してしまいます。  
アクティブなドキュメント、開いているドキュメント、などの単位で整形したい場合は Ctrl + K、Ctrl + E を使ってください。

## 固定スクロール
**[ツール] -> [オプション] -> [テキスト エディター] -> [全般]**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1350204/784d80ce-94e8-a0b6-aeaa-8edcb997a69a.png)

## 変更履歴を見る
既存のコードを見てコードの意図が分からないときは、**右クリック -> [Git] -> [履歴を表示]** で誰がどの修正の時にコミットしたかが分かります。

## ショートカット一覧
[ショートカット一覧](https://learn.microsoft.com/ja-jp/visualstudio/ide/default-keyboard-shortcuts-in-visual-studio?view=vs-2022)
- Ctrl + G：指定した行に移動 など覚えておくと便利
プロゲート学んだこと

◆学んだこと
Java　
1.基本　変数定義、型定義
2.IF、for、配列
3.メソッド（オバロ）、クラス定義、スキャナー
4.オブジェクト指向、this、フィールド、コンストラクタ、インスタンスメソッド、ゲッター、セッター
5.未実施

Git
概要（コード変更、共有準備、共有）
init、add、pull、commit、push、status


◆Progateを使用しての感想
良い点
基本は網羅できていること。
気軽にできる。
何をするべきか目標がある。

悪い点
具体的に使う場面が分からない。
普段からコードを書かないと頭に入らない。⇒this何？ってなった
目的がない

◆勉強のきっかけになったか
Javaはなっていない。
Reactに関しては、きっかけになった。


◆今後
学ぶ必要性のあるものは、繰り返し学んで実施していく。
学習のスタンス：基本　⇒　抑えるべきところ（順次、選択、繰り返し）　⇒　プログラムの全体像を把握

◆提案
入社の3か月間のうちでプロゲートを組み込むことが非常にありだと思う。
その後、自身で設計したプログラム作成など
Dockerfile 中でtorch2trtを実行する方法

## 想定する読者
- NVIDIAのGPUの利用者
- pytorchの利用者
- dockerの利用者

## こまっていたこと
- jetsonでの高速化のためにはpytotchのモデルファイルをtensorRTのモデルファイルに変換する必要がある。
- これをdocker run の実行後に行うのは、とてもリソースの無駄遣いになっている。
## 実施したいこと
1 `torch2trt` をDockerfile の中でインストールする.
2 `torch2trt` を使っているモデルの変換用のスクリプトもDockerfile の中で実行させる。

## 解決策
[Can't install inside a docker container](https://github.com/NVIDIA-AI-IOT/torch2trt/issues/483)
に解決方法が書いてあった。
以下のファイルに追記を行う。

```
$ sudo vim /etc/docker/daemon.json
```

```:/etc/docker/daemon.json
{
 "default-runtime": "nvidia",
... 
}
```

```
$ sudo systemctl restart docker 
```

この変更を行うとtorch2trtのインストール、それを用いたモデルのtrtへの変換の両方がDockerfile に記述できるようになった。
OSのログをS3に送信する方法

```
#!/bin/bash

# S3バケット名
BUCKET_NAME="your-bucket-name"

# ログファイルのパス
LOG_FILE="/var/log/syslog"

# S3にログファイルをアップロード
aws s3 cp $LOG_FILE s3://$BUCKET_NAME/$(date +%Y-%m-%d-%H%M%S)-syslog

echo "Log file uploaded to S3."
```
Visual Studio が固まったときに試すこと

バックエンドエンジニアの大和道子です。
この記事では Visual Studio が固まったときに試すことを書きます。

↓こんな感じになってしまいました…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1350204/ae2e3076-b7c6-7786-6b16-690d8c2483af.png)

## 結論（解決方法）
Visual Studioのアップデート
Visual Studioが最新の場合は、Visual Studio Installerの修復を試してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1350204/511a5e65-06f0-f811-0eb4-0c41401962a9.png)

## ほかに試すべきこと

- Visual Studio の再起動
- パソコンの再起動
- 他のアプリを終了する
個人開発のサービスをNetlifyからFirebase Hostingに移行した話

## はじめに
個人開発のサービスで使用していたホスティングサービスをNetlifyからFirebase Hostingに移行したので、その経緯などについてまとめておきます。

## なぜNetlifyからFirebase Hostingに移行したのか
### Firebaseに集約したい

最近認証機能を実装したことから、Firebase AuthenticationやFirestoreを利用することになり、ホスティングサービスもFirebaseにまとめたい感がありました。

今後もFirebaseのサービスを使っていきたいと考えていたので、早いタイミングで集約していこうと思いました。

### コストが安くなる

Netlifyの1ヶ月のビルド時間の無料枠は300分で、追加500分ごとに7ドルという料金体系でした。

最初は無料枠でも問題なくビルドできていましたが、コンテンツが増えて無料枠で収まることがなくなり、毎月追加枠を2つ購入していた感じになっていました。

そもそもビルド時間長すぎ問題があり、そちらも解決する必要があるのですが、今後もコンテンツが増えていくことを考えると地味にコストが効いてくるなと思っていました。

そこで色々調べていくとFirebase HostingとGitHub Actionsを組みわせた場合、無料枠は2000分とコストがかからずビルドできることを知り、移行したいと思う大きな要因となりました。

## CDNのエッジが国内にあるので早くなるのでは

Netlifyの無料プランだと日本のエッジノードが利用できず海外からの配信になっているようで、Page Speed Insightsでチェックすると結構遅いことがわかりました。

Firebase Hostingなら国内からの配信になるようなので、サイトのパフォーマンスも向上すると考えていました。




## NetlifyからFirebase Hostingへの移行作業
### ローカルからFirebase Hostingにデプロイできるようにする

まずは公式を参考にして、ローカルでgenerateしたファイルをFirebase Hostingにデプロイできるようにしました。

デプロイしてみてFirebase Hostingにデフォルトで使われているドメインにアクセスしてみて、ページに問題ないかを確認しました。

https://firebase.google.com/docs/hosting/quickstart?hl=ja

### GitHub Actionsでパイプラインを構築する

パイプラインを構築するといってもfirebase initするといい感じのymlファイルを生成してくれるので、それを元にちょっと変更しただけでした。

出来上がったパイプラインのymlファイルはこんな感じになりました。ちなみにworkflow_dispatchを追加するとGitHub Actionsから手動でトリガーできるようになります。

特にソースコード変更せずにコンテンツの更新などでビルドしたい場合に役立ちます。

```yaml
name: Deploy to Firebase Hosting on merge
'on':
  push:
    branches:
      - main
  workflow_dispatch:
jobs:
  build_and_deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: npm i && npm run generate
      - uses: FirebaseExtended/action-hosting-deploy@v0
        with:
          repoToken: '${{ secrets.GITHUB_TOKEN }}'
          firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_HOGE }}'
          channelId: live
          projectId: hoge
```


### Firebase Hostingにドメインを設定する

この時点でGitHubにPushするとNetlifyとFirebase Hosting両方にデプロイされるようになっている状態です。

あとは独自ドメインをFirebase Hostingの方に設定するだけです。これも公式を元にポチポチ設定していけば完了します。

設定してから反映まで数時間かかったので、移行日が決まっている場合は、あらかじめ考慮しておくと良いでしょう。

https://firebase.google.com/docs/hosting/custom-domain?hl=ja




## NetlifyからFirebase Hostingに移行する際に注意すること

完全に忘れていたのですが、NetlifyはURLのパスを大文字から小文字に自動で変換していました。

ヘッドレスCMSとしてContentfulを使用しているのですが、そこのIDは自動で大文字小文字などが混ざった文字列を生成しており、それをURLのパスとして利用していました。

そのため、Google検索などからアクセスした際にURLのパスが小文字に変換された文字列になっており、Firebase Hostingに移行した際にFirebaseは小文字変換はしないため、存在しないページとして認識されてしまっていました。

### リダイレクト処理する

ということで急いで対応しなければならず、一旦Netlifyに切り戻しを行いつつ、対策を考えました。

パッと思いついたのは小文字のパスでアクセスされた際にちゃんと元々の大文字が含まれたパスにリダイレクトする処理を入れることを思いつきました。

ビルドしているログには大文字が含まれたパスで生成されているのが確認できたので、それらを元にサクッとPythonでいい感じにFirebase.jsonのredirectsにそのまま貼っつけられるような処理を書きました。

```python
url_list = [ここに元々のURLを書く]

mappings = []

for url in url_list:
  source = url.lower()
  destination = url
  mappings.append({
    "source": source,
    "destination": destination,
    "type": 301
  })

print(mappings)
```

printした結果をfirebase.jsonに貼ってPushしてなんとかことなきを得ました。

NetlifyからFirebase Hostingに移行する際に結構ありがちな失敗かと思うので、参考になればと思います。

## JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします👇

https://projisou.jp/
【初心者】TypeScript文法を理解していくvol.5

##  はじめに
Typescriptの学習を引き続きしていく。今回はファイルを分割する際の使う`export`について触れたい

## モジュールシステム
- ECMAScript2015から導入されたJavascirptの機能
- 原則、1ファイル1モジュール
- 外部に提供したい要素をexportして、外部から提供されたものをimportする

## 2種類のexport
2種類のexportが存在する。それぞれコードを記述して考えていく。

### defaule export（名前なしexport）
- 宣言済みの変数や関数をdefault export
- 宣言と同時にdefault exportになる

注意：アロー関数は書けない

```defaukt1.ts
// 宣言済みの変数や関数を default export
const function1 = (): void => {
  console.log("This is default exported function 1")
}

export default function1

```

```default2.ts
// 宣言と同時に default export
// アロー関数としては書けない→Javascriptの制約で書けない
export default function function2(): void {
  console.log("This is default exported function 2")
}

```

### named export（名前つきexport）
- 1ファイルから複数モジュールをexportできる
- エントリポイントと呼ばれるファイルに名前付きexportをまとめる

```named.ts
/***** named export ( 名前付き export ) *****/
// 1ファイルから複数モジュールを export できる
export const function3 = (): void => {
  console.log("This is named exported function 3")
}

export function function4(): void {
  console.log("This is named exported function 4")
}

```
### エントリポイントを用意する

- 慣習的に`index.ts`が用いられる

```index.ts
// default export された module をさらに named export できる
// ここのfunction1は便宜上function1にしている→変更もできるよ！
export { default as function1 } from './default1' 
export { default as function2 } from './default2'

// named export された module をさらに named export できる
// どのファイルから、どんな名前でexportするのか？
export { function3, function4 } from './named'

```

```階層構造.md
module
|- index.ts
|- default1.ts
|- default2.ts
|- named.ts
```


## おわりに
アロー関数が使えるのかや、書き方に癖があったりなど初学者に少し優しくないなと思った。慣れる日が来るのだろうか
PowerAutomateでサービスのEOLを監視してTeamsに通知するフローを作ってみた

## はじめに

とあるライブラリのEOL発表に気づくのが遅れてしまい
影響調査等々の対応にとてもバタバタしてしまったことを受け、EOLを定期的にチェックしてTeamsに通知するPowerAutomateのフローを作ったので紹介します。

今回、EOLの監視には[endoflife.date](https://endoflife.date/)のAPIを使用しています。

### Why PowerAutomate？
AWS Lambdaやローカルで動かす等も考えたのですが、
以下のことを考えてPowerAutomateを使うことにしました。
- Teamsへの通知で面倒な連携周りを勝手にやってくれる
- 追加料金が不要だった
- **PowerAutomateを使ってみたかった**


## 成果物イメージ

毎週月曜日に[endoflife.date](https://endoflife.date/)のAPIを叩き、
EOLが公開されているライブラリ一覧をTeamsへ通知してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125818/ca8dfaf8-6e65-afd0-22da-095613248978.png)


監視対象はTeamsに配置したExcelの表で管理しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125818/448f8344-6a5f-4b1b-d84e-63c64dc8b508.png)



## 実装

### フローの全体図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125818/dd8534e8-b291-71fd-49c2-a47f8b7b1cae.png)

### APIを実行
フローの肝の部分です。
とはいっても大したことはしていません。

1. 「HTTP」でExcelの表から取得したURLへGETリクエストを送信
1. APIの取得結果を「JSONの解析」で解析
    スキーマ定義は下記の通り、ある程度必要そうなものを載せています。
    ※レスポンスの型は[公式doc](https://endoflife.date/docs/api)を参考にしています。
    ```
    {
        "type": "object",
        "properties": {
            "releaseDate": {
                "type": "string"
            },
            "eol": {
                "type": [
                    "boolean",
                    "string"
                ]
            },
            "latest": {
                "type": "string"
            },
            "lts": {
                "type": [
                    "boolean",
                    "string"
                ]
            }
        }
    }
    ```

### EOLの判定
EOLは以下のように判定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125818/cd78730a-f453-009e-515c-0079077227a2.png)

| 値 | 演算子 | 比較する値 |
| -- | ----- | ---------- |
| equals(body('JSON_の解析')?['eol'], false) | is not equal to | true |

EOLが公開されていない場合、eolの値にはfalseが入っているようなので、それ以外は全てEOL公開済みと判定するようにしました。
※EOLが公開されている場合、eolの値には`yyyy-MM-dd`形式の日付文字列が入っています。

### Teamsへ通知  
配列を文字列に変換してからひたすら`replace()`関数を使って成型しています。
もっとスマートに変換できる術を知る方は是非ご教示ください。
```
replace(replace(replace(replace(string(variables('EOL_LIST')), ',', '<br />'), '[', ''), ']', ''), '"', '')
```

## 参考  

https://endoflife.date/docs/api

https://zenn.dev/iret/articles/endoflife-date-notify?redirected=1
【Power Automate】 自動生成されるループ（Apply to each）の回避

## はじめに
Power Automate の開発において、例えば Dataverse から取得したレコード（行）を扱うとき、このレコードが1件しかなくても「アクション：それぞれに適用する（Apply to each）」が自動生成されてしまいます。そこで、この記事では自動生成されるループを回避する方法を紹介します。

## ループが自動生成される例

取引先担当者テーブルから、「アクション：行を一覧にする」を用いてユニークなパラメータ「電子メール」でクエリしたデータを取得します。

取引先担当者テーブル：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/e6f72759-e980-905d-d0cf-c358183000aa.png)

フロー：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/fcfe43fa-c606-80eb-4624-76cc0846486a.png)

このアクションで取得されるレコードは1件のはずですが、「アクション：作成」に取引先担当者の「氏名」を入力すると、自動で「Apply to each」が生成されてしまいました。

たくさんのレコードを対象に処理する場合には必要なループですが、明らかに1件とわかっている場合には不要です。なにより取得したレコードの値を使用するたびに「Apply to each」が生成されてしまうと、フローが長くなるのはもちろん、可読性の低下にもつながります。

## 自動生成されるループを回避する方法
### ① 関数：first を使用する

``` :式1
first(outputs('行を一覧にする')?['body/value'])['fullname']
```

対象の配列から最初の要素を取り出し、フィールドキー（論理式）を指定することで値を取得します。

### ② 配列のインデックスを0に指定する

``` :式2
outputs('行を一覧にする')?['body/value'][0]['fullname']
```

対象の配列から0番目（最初）の要素を取り出し、フィールドキー（論理式）を指定することで値を取得します。

::: note info 
``'行を一覧にする'``は Dataverse からレコードを取得するアクションの名前、``['fullname']``は取り出したいフィールドの論理式なので、それぞれ自分のフローにあわせて変更してください。
:::

## おまけ：実行時間の違い
例に挙げたフローについて、「Apply to each」を使用した場合とそうでない場合の実行時間を5回平均で比較しました。この結果から、「Apply to each」を使用すると、そうでない場合と比較して実行時間が2倍以上長くなっていることがわかります。

|       | 1   | 2   | 3   | 4   | 5   | 平均時間(秒) | 
| - | - | - | - | - | - | - |
| Apply to each | 1 | 0.977 | 0.881 | 0.844 | 0.705 | 0.890 |
| first関数     | 0.222 | 0.570 | 0.242 | 0.291 | 0.386 | 0.342 |
| インデックス | 0.513 | 0.783 | 0.370 | 0.253 | 0.264 | 0.437 |

## おわりに
今回は自動生成される「Apply to each」を回避する方法について紹介しました。フローの可読性や（おまけ程度ですが）実行時間のから観点も、取得するデータが明らかに1件である場合は、不要な「Appy to each」を避けたほうがいいです。
DevOpsDays Tokyo 2024 に参加した

## はじめに
　2024/4/16.17 で開催された DevOpsDays Tokyo 2024 に参加したのでその感想をまとめる。
## DevOpsDays Tokyo 2024
　DevOpsDays は世界中で開催されているカンファレンスである。ソフトウェア開発、ITインフラ運用、そしてその境界線上にあるトピックをカバーし、特にDevOpsを実現するための自動化、テスト、セキュリティ、組織文化にフォーカスしている。

https://www.devopsdaystokyo.org/
## 感想
　「そもそも DevOps って一言で表すと何だろう。」
 kyon_mm さんの講演で問いかけられ私は納得のいく回答を導き出せなかった。「開発者を楽にさせる仕組み」、「プロダクトをスケールさせるプラクティス」など、様々な言葉で表現される "DevOps" だが、私個人では本カンファレンスの参加を通じて、「変化の激しい IT 業界において、アウトカムを最大化させる文化」という定義に落とし込んだ。私自身全くこの回答に自信はないが、本カンファレンスに参加する前のなにも答えられない状況に比べたら、大きな進歩だと思うし、DevOps について考えることができたこと自体に価値があると感じている。それだけで、本カンファレンスに参加できたことを喜びに感じる。
 
　そんな DevOpsDays には様々な勉強になる講演があった。そんな中で私が一番印象に残っている講演は株式会社カケハシさんの『Value-Driven DevOps Team 〜価値貢献を大切にするチームがたどり着いたDevOpsベストプラクティス〜』である。この講演では主に、「チームが DevOpsトランスフォーメーションするためのプラクティス」と「チームが DevOps サイクルを効果的にワークさせるためのプラクティス」を重点的に話されていた。
 ***
<strong>「チームが DevOpsトランスフォーメーションするためのプラクティス」<strong/>

 ① CI / CD をそれぞれリポジトリ分けする
 ⇒ステージング環境へデプロイするため
 
 ②フィーチャーフラグを活用
 ⇒ただ、コードが複雑になるので用途を限定し、なるべく使わない。使う前にフラグ削除の条件を決めておく。
 
 ③制約を受け入れる
 1. 本番環境を壊さないように変更
 1. デプロイされる順番に気を付ける
 1. チームで1つずつ作る
 ***
 <strong>「チームが DevOps サイクルを効果的にワークさせるためのプラクティス」<strong/>

①ワーキングアグリーメントの作成
⇒メンバーそれぞれバックグラウンドが異なり価値観も異なるため。
②振り返りのプラクティスはスプリントの内容毎に適当なものを採用する
⇒チームの学びを最大化するため
③モブプログラミング
⇒トランクベース開発と相性が良い
⇒slack のハドルミーティングを使用していると PdM も時間によっては参加してくれる
***
　以上が主にカケハシさんがお話されていたことである。様々な有効なプラクティスを紹介されていてとても勉強になった。が、私が最も印象に残っているのはどのプラクティスでもなく、「DevOps カルチャーを編むには、"アウトカムを最大化する"という目的を共通化する」という言葉である。他の講演でも「内製化するのに必要なのは、エンジニアを増やすことではなく、気持ちをそろえること」みたいなことを聞いたが、チーム・組織を変えていくにはプラクティス・ツールでもエンジニアの人数でもなく、目的の共通化なのかなと感じた。ただめっちゃ難しい気がするし解答は得られていない、そのためのきっかけに上のようなツールとかプラクティスとか使うのもありなのかなとか思ったり思わなかったりした。

## おわりに
　本カンファレンスに参加して、DevOps についてとても深く考えるきっかけになったし、得られた知見はとても多かった。現在私の所属しているチームの開発はそもそもウォーターフォール開発をしてるし、組織的にも DevOps カルチャーはまだまだ根付いていないと感じるが、DevOps が大事なのではなくなぜ DevOps にしたいのかやりたいのか、の観点から考えを広げる重要性を学べた気がするし、その考えは色々な業務に役立つ気がする。
　最後に、色々感想を述べたが本カンファレンスでの個人的な一番の収穫は、懇親会でのコミュニティの手を広げられたことである。普段はなかなか奥手になってしまい会話の機会も少ないが、今回の懇親会では外部のエンジニアの方とたくさんお話できた気がする。別のカンファレンスでお会いする機会も多いと思うので今度は積極的に自分から話しかけてみようと思う。あと銀のさらがめちゃめちゃ美味でした。
「コンサルティングファームに入社したい」と思ったら読む本

https://www.amazon.co.jp/product-reviews/447811529X/ref=acr_dp_hist_1?ie=UTF8&filterByStar=one_star&reviewerType=all_reviews#reviews-filter-bar

# 本書を手に取った背景
コンサルファームに転職したいとおもったので。
今、セキュリティ製品のプリセールス。
もっと客側と並走して会社のセキュリティ課題に取り組みたいとおもった。

# 本書のテーマ
コンサルティングファームに入りたいとおもっている人に向けて
・これまでどんな人が受かっているか
・今、受かるためには何が必要か
・入社後活躍するには何に気をつければいいか
について、ファクトベースで記載されている。

# 個人的なポイント
### ①　ロジカルシンキングの先にあること
洞察力、観察力、思考スピードの向上につながること。
ロジカルシンキングがフューチャーされがちだが、その先にあることをしれて、かなり腑に落ちた。

### ②　仮説思考ができるようになる
いわゆる、自分独自の考えをもてるようになる。

世の中の自分の考えないな〜と感じる人は、これができてない。
①を繰り返すことができるのがコンサルの強みであり、これを究極に極めることでシニアパートナー、その上を目指せるようになる。

### ③　おすすめできないエージェントは？
これは自分の今後のお客様対応に活かせるかと思ってピックアップした。
出てくる項目としては、紹介するファームが少ないとか、短期間で決めようとするとか。

最近、エージェントとも話すようになって感じるのだが、以下のようなことをはっきり言ってくれるほうが頼りになる。
・自分を通すメリットは？
・面談の練習もちゃんとやる
・フェーズを区切って会社を紹介する

これだけ転職も主流になってきているので有象無象もくさるほどいる。
そんな中で、その人といっしょに職をさがすメリットは何なのか、なぜその人なのかを転職者側も考えるべき。

### ④　ロジカルシンキングはケース面接の対策になる
コンサルファームはケース面接がある。
その時に上述した能力を見定められるらしい。
コンサルは「新しい着眼点を提供する」という点も大事な仕事の一つであり、ありきたりな考察しかできないなら、そのコンサルを使うバリューがない。

ケース面接の対策ももちろんだが、今後の活躍を考えてもやはりこの能力の高さがポイントになる。

### ⑤　想像力のベースが観察力・洞察力
その人独自の切り口は、想像力も大事。
その基盤は観察力・洞察力。
知識などをインプットするのも大事だけど、想像力を働かせるコツも身につける。

なにかトラブルが発生してもふわっと解決策が浮かぶ人は、経験だけではない。

### ⑥　常にスタンスとる
なにか考えなきゃいけないことが出てきたら、自分の意見を必ず持つ。
どっちつかずが一番いけない。

# 今後やれること
・上述した能力を養う。

# まとめ
コンサルファームに入れなかったり、目指していなくてもロジカルシンキング〜洞察力〜考察スピード向上を図りたいという人も読んでみたら嬉しい内容です。

「何をするときもロジカルシンキングしちゃうんですよね〜」とマウント取ってくる人がいて、ロジカルシンキングを毛嫌いしてしまうと思いますが、本書のようにロジカルシンキングの先に何があるかを体系的に教えてくれるのはすごくいいです。