OmniAICreator/Qiita-1.07M huggingface dataset:
VisualStudioのキモすぎキーバインドをVSCodeに近づける

## TL;DR
* `ツール> オプション> 環境> キーボード`から、`次の追加キーボードマップ スキームを適用`プルダウン => `VisualStudioCode`を選択

## はじめに
全国1億7千万人の.NET 開発者の皆様、ごきげんよう。
今日もレガシーなバケモノプロジェクトと仲良くしていらっしゃいますでしょうか。

さて、.NET開発者が一番使うIDEといえば**VisualStudio**、ですが。
一方で、テキストエディタは**VisualStudioCode**を使うことも多いと思います。なんなら、VSCで開発しちゃうよ～って方も珍しくはないのかも。

しかしこの両者、同じ冠を戴きながら、その実態はかなり別物。
両者の異母兄弟たる所以、そのひとつが**キーバインド**です。

## VisualStudioのキーバインドキモすぎ問題
問題です。
* **選択範囲をコメントアウト**のキーバインドといえば何でしょう？

ほとんどのIDE、テキストエディタで`Ctrl + /`だと思われます（ちゃんと調べてない）。
もちろんVSCも`Ctrl + /`です。

しかしVS、こんな多用するコマンドだというのにありえないキーバインドがデフォルトで設定されています。それは
**`Ctrl + K /`**
拡張キーバインドに割り振られています。
慣れてしまえばそれまでですが、普通にキモい。

## VSとVSCとでキーバインドとで混乱する問題
マルチカーソルも、プログラマである以上は積極的に使っていきたいですよね。
ただ、特にマルチカーソル系はVSとVSCで大きくキーバインドが異なります。
このあたりは、歴史的な経緯も大きいとは思いますが……。
自分がよく使う具体例を示すと

| 操作名                               | VSC           | VS                    |
| ------------------------------------ | ------------- | --------------------- |
| マッチする次の単語を選択             | `Ctrl + D`    | `Ctrl + Alt + .`      |
| クリック位置にマルチカーソルを生やす | `Alt + Click` | `Alt + Shift + Click` |
| マルチカーソルを生やしたり選択したり | `Alt + Ctrl + Arrow`  | `Alt + Shift + Arrow`    |

例えば`Alt + Shift + Arrow`でいうと
* VSだと**マルチカーソル増やす**
* VSCだと**カーソル行を複製**

なので、脳死で上記のキーバインドを入力すると全く違う操作になってしまうわけです。これがすごくうっとうしい。

## 異母兄弟、されど同じ父の元
というわけで、VSのキーバインドをVSCに近づけよう！ってのが、冒頭のTL;DRにある通りですね。再掲しますと
* `ツール> オプション> 環境> キーボード`から、`次の追加キーボードマップ スキームを適用`プルダウン => `VisualStudioCode`を選択

これで、キーバインドがほぼVSCになります。
「タブをすべて閉じる」も`Ctrl + K Ctrl + W`で出来るようになります（これもよく使うんですが、VSだとキーバインドが振られていない…）。

「ほぼ」、というのは文字通りですが、一部かゆいところに手が届かないところもあるらしいです。今のところ、僕は遭遇していませんが……。

## おわりに
皆さんはご存知でしたか？ぼくはしらなかった。

別の用事でオプションを触っていた所たまたま発見いたしまして、「キーバインドの違いに混乱し続けていた俺の今までの時間は何だったのか・・・・・・・:thinking:」とならざるを得なかったので共有させて頂いた次第。

皆様の.NETライフに幸あれ。
[AtCoder] Beginners Selection - ABC087B - Coins [Elixir Livebook]

## はじめに

AtCoder の Beginners Selection コンテスト ABC087B - Coins 問題を Elixir Livebook で回答しました

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/tree/main/livebooks/atcoder/abc087/abc087_b

## 問題

https://atcoder.jp/contests/abs/tasks/abc087_b

## 入出力例

以下のようになれば OK です

```elixir
"""
2
2
2
100
"""
|> Main.solve()
|> then(&(&1 == 2))
```

```elixir
"""
5
1
0
150
"""
|> Main.solve()
|> then(&(&1 == 0))
```

```elixir
"""
30
40
50
6000
"""
|> Main.solve()
|> then(&(&1 == 213))
```

## 回答１

```elixir
defmodule Main do
  def main do
    :stdio
    |> IO.read(:all)
    |> solve()
    |> IO.puts()
  end

  defp split_lines(lines) do
    lines
    |> String.trim()
    |> String.split("\n")
  end

  def solve(input) do
    [num_500, num_100, num_50, total] =
      input
      |> split_lines()
      |> Enum.map(&String.to_integer/1)

    total_50 = total / 50

    for p_500 <- 0..num_500,
        p_100 <- 0..num_100,
        p_50 <- 0..num_50,
        10 * p_500 + 2 * p_100 + p_50 == total_50 do
      {p_500, p_100, p_50}
    end
    |> Enum.count()
  end
end
```

@torifukukaiou　さんや

https://qiita.com/torifukukaiou/items/2a17b1cb850cde75f664

@koyo-miyamura さんと

https://qiita.com/koyo-miyamura/items/9f224a3e56ea75939dca

同じ回答しか考えつきませんでした

実行時間は 343 ms でした

## まとめ

思いついたのが １ パターンなのは悔しいですね
DIでインタフェースを使う

[前回](https://qiita.com/odxdoge/items/6031419f9461a8775d98)の続きです。
クラスの依存関係の管理方法について解説しました。
今回は依存関係の定義について少し深掘りします。

## インターフェースとは

突然ですが、以下はC#のコード例です。

```Csharp
interface ISampleInterface
{
    void SampleMethod();
}

class ImplementationClass : ISampleInterface
{
    // Explicit interface member implementation:
    void ISampleInterface.SampleMethod()
    {
        // Method implementation.
    }

    static void Main()
    {
        // Declare an interface instance.
        ISampleInterface obj = new ImplementationClass();

        // Call the member.
        obj.SampleMethod();
    }
}
```

インタフェースとは実際の処理を定義せず、I/Oのみ定義することができるものです。
ここではISampleInterfaceを実装したImplementationClassという例です。これだけ見るとあまりメリットを感じませんがDIと結びつける事で真価を発揮します。

[引用元](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/interface)

## Pythonのインタフェース

DIとの結びつきを解説する前に、悲しいお知らせです。
Pythonの言語仕様にはインタフェースはありません。
しかし代替クラスが用意されています。
さきほどのC#の例をPythonで書くと以下のようになります。

```python
from abc import ABCMeta, abstractmethod
 
class ISampleInterface
    @abstractmethod
    def sample_method(self) -> None:
        raise NotImlementdError()

class ImplementationClass(ISampleInterface) -> None:
    def sample_method(self):
        pass
```

## DIでの活用方法

[前回の解説](https://qiita.com/odxdoge/items/6031419f9461a8775d98#%E5%AE%9F%E8%B7%B5%E3%82%B5%E3%83%BC%E3%83%89%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%81%AEdi%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)で使用したサンプルを少し変えます。

```python
from abc import ABCMeta, abstractmethod
from injector import Injector, inject, Module, singleton , provider

class IUserRepository(ABCMeta):
    @abstractmethod
    def get_user(self, user_id):
        raise NotImlementdError()

class UserService:
    # このデコレータによって依存関係がinjectorによって解決されます
    @inject
    def __init__(self, repository: IUserRepository):
        self.repository = repository

    def find_user(self, user_id):
        return self.repository.get_user(user_id)

class UserRepository(IUserRepository):
    def get_user(self, user_id):
        # データソースからユーザー情報を取得する処理
        pass

class AppModule(Module):
    # クラスの依存関係を定義する
    @singleton    
    @provider
    def provide_user_repository(self,user_repository : UserRepository) -> IUserRepository:
        return user_repository


def handler(event, context):
    injector = Injector(AppModule())
    # injectorがクラスの依存関係を解決したうえで、インスタンスを提供する
    user_service = injector.get(UserService)

    user_id = event["user_id"]
    user = user_service.find_user(user_id)
    return user
```

IUserRepositoryがインタフェースで、UserRepositoryが実装クラスです。そして、UserServiceはIUserRepositoryに依存し、IUserRepositoryはUserRepositoryで解決するように定義しました。

## メリット

インタフェースで定義することで実装クラスをModuleの変更で切り替える事ができます。Repositoryクラスのように外部リソースの依存があるクラスをモッククラスに切り替えることで単体テストの実行が楽になります。

上記メリットだけだとpytestで解決できてしまうのですが、他にもlayerとの付き合い方にもメリットがあります。それはinjector(DIコンテナ)の隠蔽という形で今後解説します。
Gatsbyをv3からv5に変更した時にハマったCSS-in-JSのポイント

### はじめに

CSS in JSを採用しているGatsby Projectをv5へとVersion Upした。
そこで `Cannot find module 'tailwindcss/lib/util/toPath'` と言うエラーにハマり調査に少し時間を要したので後に続く方のために日本語で解決方法の残しておきます。

---

### 対象となる読者

`Cannot find module 'tailwindcss/lib/util/toPath'` `Gatsby tailwindcss path error` `Gatsby Twin.micro error` などで修正方法を探している方。

---

### 結論

以下Issueにある方法の通りで修正できました。
[gatsby-browser.js Can't resolve — Tailwindcss Guide #34731](https://github.com/gatsbyjs/gatsby/issues/34731)

Gatsbyはv3でCSS-in-JSを使う場合はrailwindcssや各種packageをinstallした後で
```gatsby-browser.js
import "tailwindcss/dist/base.min.css"
```

上記の記述で問題ありませんでした。
しかしv4以降では、そもそも`node_modules/tailwindcss/dist/base.min.css` はなくなっています。
そのため、開発環境を立ち上げようとすると以下のようなエラーに遭遇します。

```shell
ModuleBuildError: Module build failed (from ./node_modules/gatsby/dist/utils/babel-loader.js):
  Error: /Users/xxx/Project/xxx/xxx/src/pages/xxx.jsx: Cannot find module 'tailwindcss/lib/util/toPath'
```

では、Issueの内容と重複しますが、どうすれば良いかをまとめます。

### 詳細


- postcssがなければinstall
```shell
yarn add -D postcss
```
- root直下にpostcss.config.jsを作成
- postcss.config.jsに以下の記述を追加する
```post.config.js
module.exports = {
  plugins: {
    tailwindcss: {},
    autoprefixer: {},
  }
}
```

- メインのcssファイルに以下を追記(なければsrc/global.cssなどを作成)
```global.css
@tailwind base;
@tailwind components;
@tailwind utilities;
```

- 最後にgatsby-browser.jsに以下を追記
```gatsby-browser.js
import './src/global.css'
```

### おまけ
Gatsbyのdocだけではなく、Tailwind側にも同様の記載がありました。
[Get started with Tailwind CSS using PostCSS](https://tailwindcss.com/docs/installation/using-postcss)
VBA学習


```
Sub findfind()

    maxRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    Set myRange = Range("A1:A" & maxRow)
    
    For i = 1 To maxRow
    
    
    keyWord = "(" & i & ")"
    Set myObj = myRange.Find(keyWord, LookAt:=xlPart)
    
    Sheets("bbb").Range("A" & i).Value = myObj

    Next

End Sub
```
OpenAIのGPTでFunction callingを使ってJSONをつくってもらう

# まえがき
GPTにjsonを作ってもらいたい時とかあるよね。俺はある。
でもGPTにJSONを出力させようとこんな感じになるよね
たとえば天気予報:

```
以下は天気予報のデモデータを書き込んだJSONデータです。私の知識データは2021年9月でが最後ですので、
最新の天気予報を取得するには、検索エンジンなどを用いてお調べください。
{
    "temperature" : 22
    "rainy": 0
    "location": "Chiyoda, Tokyo, JP"
}
```
そう。JSONだけを出力してくれる保証がないわけです。
そこでFunction calling。どうやらJSONだけを出力させる保証があるらしい。試してみようじゃないか
# Code
※プロンプトの動作は未検証
```JavaScript
const requests = [
    {
      role: 'system',
      content: 'you are a helpful assistant.',
    },
    {
      role: 'user',
      content: `generate math test questions. `,
    },
  ];

  const math_test_generate_schema = {
    type: 'object',
    properties: {
      question: { type: 'string' },
      answer: { type: 'float' },
    },
    required: ['question', 'answer'],
  };

  const response = await openai.createChatCompletion({
    model: 'gpt-3.5-turbo-0613',
    messages: requests,
    functions: [{ name: 'set_definition', parameters: math_test_generate_schema }],
    function_call: { name: 'set_definition' },
  });

  const result = response.data.choices[0].message;
  console.log(JSON.parse(result.function_call.arguments));
```

# 解説
math_test_generate_schemaでは、function callingの概要を設定している。返答がObject(JavaScript Object)であることを指定し、帰ってくるべきなプロパティを設定している。questionではstringで数式を張ってもらい、answerはfloatで正解をセットしてもらおうとしている。(この辺りはstring,整数だけならintでも良いと思う)
requiredの部分で必須のプロパティを設定している。requiredに入っていないものは返答は保証されないが、基本的に試した限りではrequiredに入っているものは無理矢理にでも代入されている。



# つまったところ
関数名がGPTの動作に関係する、というところ、今回はmath_test_generate_schemaだが、たとえば英語の問題を出してもらおうとした時、english_test_generate_schemaなどと、内容に関係する名前にしないと、function_callの部分で必ず関数を呼び出すように設定しているところから、変な返答が返ってきてしまう事象が発生する。

# おわり
結構GPTからjsonを生成させたいときはあるので、自分のためのメモとしても残しておこうと思います。
ご覧いただきありがとうございました。
# 参考文献
[GPT-4, GPT-3.5 の API を利用して JSON だけ生成する (Function calling)](https://zenn.dev/codehex/articles/4b22a01e0b7592)
[[OpenAI] Function callingで遊んでみたら本質が見えてきたのでまとめてみた](https://dev.classmethod.jp/articles/understand-openai-function-calling/)
[Native JSON Output From GPT-4](https://yonom.substack.com/p/native-json-output-from-gpt-4)
DHCPサーバーを構築する

## インストール
```bash
$ sudo apt -y update
$ sudo apt install -y isc-dhcp-server
```

## 設定ファイルの変更
```/etc/dhcp/dhcpd.conf
subnet 192.168.2.0 netmask 255.255.255.0 {
    range 192.168.2.1 192.168.2.252;
    option routers 192.168.2.254;
    option domain-name-servers 192.168.1.1;
}
```

## 解説
- subnet 192.168.2.0 netmask 255.255.255.0
    配布するIPのネットワークプレフィックスの指定
- range 192.168.2.1 192.168.2.252;
　　配布するIPのレンジの指定
- option routers 192.168.2.254;
    デフォルトゲートウェイの指定
- option domain-name-servers 192.168.1.1;
    DNSの指定


## サービス再起動
```bash
$ systemctl restart isc-dhcp-server
$ systemctl status isc-dhcp-server
```
[ServiceNow] systemユーザーによるBusiness Ruleスクリプトの起動を防ぐ

systemはUserテーブル（sys_user）で定義されない特別なユーザーです。

しかし、ServiceNowのOOTBプロセスは、しばしばこのユーザーによって、レコードが更新されます。

特別なユーザであるため、Business ruleにおいては、Role conditionsでは起動を防げません。

systemがレコードを更新するとき、Business ruleのスクリプトを無効にしたい場合は、systemがユーザーとして定義されていないことを逆に利用して、Conditionに以下の様な条件を記述します。

```JavaScript:Condion
gs.getUserID() !== 'system'
```
XcodeのiOS Deployment Targetのエラーについて

# はじめに
コード上ではなくiOS Deployment Targetでのエラーについてです。いつも通りコードを書いて、simulatorを起動しようとしたら以下のエラーが出てきました。![スクリーンショット 2023-06-26 11.19.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485517/7286c89f-c06b-c5e4-6cd6-782d22b61706.png)

# 解決方法
サードパーティーライブラリーを11以上にしないといけないようです。ここを変更すると正常に起動しました。![スクリーンショット 2023-06-26 14.24.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485517/90dbf589-b831-eed5-68dc-c07b133409db.png)

# 原因
詳しい原因は不明ですが、Xcode14.3の更新によるものだそうです。

# 参考資料
https://zenn.dev/ischca/articles/a00c3adf626ea0
https://stackoverflow.com/questions/75574268/missing-file-libarclite-iphoneos-a-xcode-14-3
https://github.com/flutter/flutter/issues/123903
【読み物】ふつうの会社員がNFTを発行し始めたワケ

## 誕生のきっかけ

そうたいして昔でもない話、ファウンダーのМ氏（著者）は、RPAやDX系の業務を本業としていて、お客様の役に立つ仕事ばかりをしていました。無駄な工程や人の動きをなくし、自動化プログラムによって、手作業だった仕事を機械に置き換えていく、そんな日々を過ごしていたのです。業務の中の無駄をなくすわけですから、もちろん、お客さんは大喜び。費用対効果までしっかりと算出できれば、感謝しかされない仕事でした。

一方で、自動化プログラムが介在し、スリム化された工程を眺めながら「あんなに苦労して、やった仕事だったのにな…」と少しだけさみしそうにこぼす方もいました。彼らが、ミスをしないように細心の注意を払いながら手作業でやってきたことが、今まさに上書きされようとしている。さみしそうにこぼした方の顔を眺めながら、そんなことを思ったM氏でした。

## 漠然と考える「無駄」の価値

M氏は、考えます。「自分たちが排除してきた無駄や、上書きされて記憶にしか存在しなくなるあの手作業の日々たちは、そもそもどうして生まれたのだろう。無駄以外の価値は、果たしてなかったのだろうか？」と。

Ｍ氏には、学生時代「ドーナツの穴を残して食べるには？」を真剣に論じた本に熱中した過去がありました。その本の著者と同じように「ドーナツの穴を残す方法」を、自分の得意領域である数学や有機合成化学の分野から解き明かそうとした、あの日々の記憶と充実感がよみがえりました。

漠然と考える「無駄」の価値と、ドーナツの穴と。ここには、何か共通項がないだろうか？ きっと、何かあるに違いない。そう考えるМ氏の目の前には、ドーナツがありました。

## ドーナツの穴に関する問題とNFT

本業では無駄を排除しつつも、プライベートの時間では「ドーナツの穴の価値と真剣に向き合う」、表と裏の日々が始まりました。実態のない、しかし確かに実在はする「ドーナツの穴」に価値をつけるには…？

この概念は、2021年6月頃に興味を持ちはじめ、やがて深入りすることになる「NFT」と相性が非常にいいことに気づいたのでした。ドーナツの穴の中に、Yシャツとネクタイをつけたおじさんを入れてみたスケッチ。これが、「ドーナツ部長」が誕生のきっかけです。

![](https://miuradonuts.com/wp-content/uploads/2023/06/%E3%82%B9%E3%83%86%E3%83%83%E3%82%AB%E3%83%BC-1.png)

この記事は、著者が運営するメディア「ぬるぺでぃあ」でも読むことができます（記事は[コチラ](https://miuradonuts.com/2023/06/26/nft-note004/)）
![](https://miuradonuts.com/wp-content/uploads/2023/06/ヘッダーエリア画像作成.png)
【Ubuntu】基本の初期設定

## 対象読者
Ubuntuに乗り換えた方やデュアルブートを始めた方で、
・サーバサイドのプロジェクトはDockerで立ち上げ
・フロントはDocker使わずにnpm~
という方。

## OS
ubuntu 20.04
（注：2025年4月にサポート切れます）

これらをコピペして、サクッと開発を始めちゃいましょう。

```bash
apt update
apt upgrade
```

### vim
```bash
sudo apt-get install vim
```

### chrome
```bash
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install ./google-chrome-stable_current_amd64.deb
```

### vscode
```bash
sudo snap install code --classic
sudo apt install ./[入手したdebファイル]
```

### docker
```bash
sudo apt install \
curl \
apt-transport-https \
gnupg-agent \
software-properties-common \
ca-certificates

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs)　stable"
sudo apt-get install docker-ce docker-ce-cli containerd.io

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
```

```
# プロキシーサーバーは利用しないためコメントアウト
[Service]
#  Environment="HTTP_PROXY=http://proxy.example.com:8080/"
#  Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
```

```bash
sudo systemctl daemon-reload
sudo systemctl restart docker
systemctl show --property=Environment docker

sudo docker run --rm hello-world
sudo docker rmi hello-world
```

### docker compose
```bash
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```

### git
```bash
sudo apt-get install git
git config --global user.name "ユーザ名"
git config --global user.email メールアドレス
```

### tree
```bash
sudo apt install tree
```

### npm
```bash
sudo apt install npm
```

万一不足などありましたら、ご指摘いただけますと幸いですm(_ _)m

Ububtuライフを謳歌しましょう！
アップロードした画像をThymeleafで表示する

Thymeleafで画像表示をする為に試したり調べたりした内容をまとめる。

## 1. Staticフォルダ配下に格納した画像を参照
このパターンが一番シンプル。
画像ファイル(test.jpg)を下記のように配置したとする。

    src.main.resorces
        |-static
            |-test.jpg

test.jpgを画面に表示したい場合、htmlを下記の様に記載する。
`<img th:src="@{test.jpg}">`

## 2. リソースハンドラを設定
外から参照できるのは、デフォルトではStaticフォルダ直下のファイルである。
クラスパスを追加する事で、任意フォルダ内のファイルにも参照できるようになる。

プロジェクト外のフォルダも設定することができるので、簡易的な画像ビュー機能を
作成することもできる。

書き方は下記stackoverflow質問者様のコードを参考にした。

https://ja.stackoverflow.com/questions/73000/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%89%E3%81%8B%E3%82%89%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E9%9D%99%E7%9A%84%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%94%E3%81%A8%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%88%B6%E9%99%90%E3%82%92%E3%81%8B%E3%81%91%E3%81%9F%E3%81%84

## 3. 画像参照用のAPIメソッド
画像Entityを返すメソッドを作成することで画像表示が可能である。
クラスパスの変更を行わずに、任意フォルダ配下の画像を参照できるようになる。

```
    @GetMapping("/images/{imageName:.+}")
    public ResponseEntity<Resource> downloadImage(@PathVariable("imageName") String imageName) {
        final Path targetPath = storageService.load(imageName);
        if (!Files.exists(targetPath)) {
            return ResponseEntity.notFound().build();
        }

        return ResponseEntity.ok(new PathResource(targetPath));
    }
```

`storageService.load(imageName)`は、「/ファイル保存用ディレクトリ/imageName」のPathデータを返却する。

Thymeleaf側で下記のように記載すれば、画像が表示される。
`<img th:src="@{'/images/' + ${imageName}}">`

下記stackoverflowの回答者様コードを参考にした。

https://stackoverflow.com/questions/67971566/java-spring-cant-save-image-to-static-folder


## オマケ：Thymeleafの変数式に関して
#### 1. 文字列と変数を組み合わせたい場合
例えばformのactionを記載する場合、以下のようになる。
`<form th:action="@{'/testPath/' + ${test}}" method="post">`

#### 2. 変数式を引数に使いたい時
変数Mapに対して変数Keyを用いて値を参照する等、変数式内の引数として
新たな変数式を使いたい時がある。

そのさいは下記のように記載する。
`${testMap.get(__${testKey}__)}`

プリプロセッシング式と言い、アンダースコアを2つ前後に記載することで
先に評価されるようになる。

#### 3. 文字列にドットを含む場合の注意点
Thymeleafでファイル名のようなドットを含む文字列が変数式で評価される際、
文字列ではなくオブジェクトとして評価されるようだ。

画面表示のみであれば問題ない。

一方、プリプロセッシング式として評価される場合、下記のようなエラーが出力される。

    EL1007E: Property or field 'jpg' cannot be found on null

ドットを含む文字列を、オブジェクトではなく文字列として評価させる必要がある。
下記のように記載することで対応が可能である。

```
<div th:with="key=|'${testKey}'|">
    <p>[[${testMap.get(__${key}__)}]]</p>
</div>
```
｜を前後に記載した書き方は、リテラル置換と呼ばれる。
リテラル置換によって文字列の中に変数式を含める事が出来る。

th:withは、ブロック内にて有効な変数を定義できる。

文字列として評価されるように''で囲んだ状態で変数を定義することで、
ドットを含むKey値でMapから値を取得できるようになる。
GoCon2023のビンGo解答（ビットキー）

## はじめに
ビットキーでデバイスの開発プラットフォームの開発・運用を担当している、びやあきと申します。

Go Conference 2023（以下：gocon）関わったみなさん、お疲れ様でした。自社のブースで待機してましたが、今回の会場はどこからでもセッションが拝見できて退屈せずに過ごせました。

goconにてビンGoのクイズと解答を作成しましたが、その解説について開示する場がなかったため本記事にて後述します
開発環境周りの仕組みを説明する機会もないので、内部向けの紹介も兼ねています。

## 前提
ビンGoとは・・・
gocon参加者が事前に配布されたビンゴカードの各マスに記載の問題を解くゲーム
この問題は事前にgocon運営やスポンサーから集められている

## ビットキーが用意したクイズとその解答
### クイズ
- ビットキーにおけるGoの開発環境で、実現できていないことは次のうちどれでしょうか？
### 選択肢
1. コンテナのホットリロード
1. モノレポの import 間違いチェック
1. コード自動生成の実行漏れチェック
1. 複雑度の低いプルリクエストを作成した時にCIが褒めてくれる仕組み
### 解答
- 複雑度の低いプルリクエストを作成した時にCIが褒めてくれる仕組み

## 選択肢および解答の解説
### :o:️複雑度の低いプルリクエストを作成した時にCIが褒めてくれる仕組み
こちらが正解で、まだ実現できていません。
ただし、「**行数が少ない**プルリクエストを作成した時にCIが褒めてくれる仕組み」はあります。

[Danger](https://github.com/danger/danger)を使って200行以下のPRにLGTMするようにしています。

https://github.com/danger/danger


```ruby
# lgtm there is a small PR
lgtm.check_lgtm image_url: lgtm_gifs.sample if git.lines_of_code < 200
```

将来的にはcognitive complexity（以下：認知的複雑度）が10以下のような条件に変更してみたいと思っていて、認知的複雑度の[静的解析ツール](https://github.com/nrnrk/gocognito)も作ってくれてたりするので、どこかで組み込みたいなと思っています。

https://github.com/nrnrk/gocognito

https://speakerdeck.com/bitkey/cognitive-complexitygoast

以降はすでに実現済みの仕組みの紹介です

### コンテナのホットリロード

ローカル開発ではDocker Compose, リモートの開発環境はk8sを利用しています。
ローカル開発の際には、手元のソースコードを変更するたびにコンテナをビルドしてスタートする手間があり、ホットリロードがないとつらいということで、創業初期くらいから整備されていました。

[hmarui66/go-watch](https://github.com/hmarui66/go-watch)を利用しています。

https://github.com/hmarui66/go-watch

以下のようなスクリプトを用意して、DockerfileのENTRYPOINTに指定して動かしています。

```shell
#!/bin/bash
cd $(dirname $0)

go install github.com/hmarui66/go-watch@latest
go-watch
```

go-watchは起動すると、ファイルシステムのイベントを監視して、変更があればgo buildし、ビルド生成物を実行してくれます。

### モノレポの import 間違いチェック

ビットキーのバックエンドはいくつかのマイクロサービスをモノレポ運用にして開発しています。
モノレポで開発していると、サービス内のパッケージの名前が被ることがあり、IDEのインテリセンスがサービスAからサービスBのimportを提案してきたりして、よく注意していないと間違えてしまうことがあります。
こういった間違いは、PRレビューでも見逃されることがあるため、静的解析で対応しています。

https://speakerdeck.com/bitkey/sakututozuo-rujing-de-jie-xi-turu-importfalseyi-cun-zhi-yu-turuwozuo-ru

https://github.com/nrnrk/banimport

GitHub Actionsでworkflowに以下のように書いて実行しています。

```yaml
    - name: Install linter
      run: go install github.com/nrnrk/banimport/cmd/banimport@latest

    - name: Import check
      run: go vet -vettool=$(which banimport) -banimport.config="$(cat .banimport.json)" ./...
```

### コード自動生成の実行漏れチェック

APIルーターの実装をOpenAPIの定義ファイルから自動生成していたり、mockやprotobufの自動生成をしていたり、自動生成されたコードというのはちょこちょこ入っているのですが、PRを出すときに自動生成分をコミット漏れすることがよくあります。
これもCIで自動チェックしていて、以下のようにGitHub Actionsに書いています。

```yaml
    - name: Generate files
      id: generate-files
      run: |
        ./gen.sh

    - name: Detect unpushed changed
      id: detect-unpushed
      run: |
        if [[ $(git status --short | wc -l)  -gt 0 ]]; then git status; exit 1 ; fi
```

## まとめ

以上、ビンGoの解答でした。
こういう内容は、「リポジトリのここ読むとわかるよ」って教えることがほとんどで、整理して文書化しておくことが少なかったので、良い資料になったような気がします。
上記の方法、「こっちのほうがいいですよ！」「このLinterでできますよ！」などあれば、ぜひコメントください。

## 備考

ビットキーのGo開発者（@_otakakot_）も、イベント参加者としてレポートを書いてくれているので、ぜひ読んでみてください。


https://qiita.com/_otakakot_/private/da7bf53f8e983665a5df
AWS Auroraのmaintenance windowについて

**Cluster level, Instnace level のそれぞれで**

# Mandatory patches

deadlineを過ぎると、AWSが自動的でapplyする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/abed7cb7-f77d-f938-751c-fb57967e9c43.png)

deadlineについては、

> you can run the below AWS CLI command to check for all the pending maintenance activity for your RDS instances.[2]
> aws rds describe-pending-maintenance-actions
> [2] https://docs.aws.amazon.com/cli/latest/reference/rds/describe-pending-maintenance-actions.html 

# Optional patches

AWSが自動的にapplyすることはない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/55f37a4f-e5d1-fabf-d3e5-96d0e72eb1d2.png)
エンジニアがキャリアを積んだその後は


私はもう30歳後半になるおじさんエンジニアです。
25歳でエンジニアになって、いろいろ経験してきて、技術力も上げてきて、それなりに市場で評価されるキャリアを積んできたと思っています。自分で言うのもなんですが、引く手数多です。

## キャリアを積んでどうするの？
私は新卒・中途採用の面接官の経験が多数あります。
応募者はよく「〇〇エンジニアとしキャリアを積んで〜」「マネジメントになってキャリアを積んで〜」ということを言いいます。

で、思うんです。

「キャリア積んでどうするの？」って。

さすがに面接ではここまで突っ込まないですが。

皆さんキャリアを積むことがゴールではないはずです。ですが、その先を考えている人はごく少数じゃないでしょうか。

そんな方に、それなりのキャリアを積んだおじさんからの、ありがた迷惑な言葉を伝えたいと思います。


## 将来どうしたいの？
人生ひとそれぞれです。ぶっちゃけ5年後10年後を聞かれてもわからない人が多いと思います。

私も5年前、10年前に、今のようになっているとは到底思ってもいなかったです。そもそも私は新卒証券会社で、どぶ板営業を行って、25歳からエンジニアになった人です。

ですが結果として、エンジニアで良かったですし、天職と思っています。でも、私が大学生（商学部金融専攻）の頃は「金融業界で激務でもいいから、稼いでやる」と考えていました。

仕事には人生の多くの時間を費やすのだから、本当は好きなことを仕事したいと皆さん考えると思います。
ですが、多くの人は就活のときに「本当にしたいこと」を捨てて、「自分を雇ってくれそうなところ」を優先して探しにいくんです。

「したいこと＝稼げること」ではない場合がほとんどですから、それも仕方がないと思います。


## 将来なんてわからない

将来やりたいことなんてわからない、将来どうなっているかわからない、という人が大半だと思います。

私もそう思います。私はエンジニアに転職したり、海外駐在したり、結婚して子ども生まれたりと、大学生の頃には思いもよらなかった人生を歩んでいます。全部計算・設計できてはいません。せいぜい半年1年先の計画だけです。

逆に昔から「本当にしたいこと・自分の夢」に一直線に向かっている人は輝いてみえてました。羨ましく思っていました。

では、多くの人は「将来なんてわからないから、何も考えなくていいのか」と言えばそうではないでしょう。

ここで出てくるのが「キャリアを積んでおく」です。

## 幸せになりたい
みんな共通の「将来どうしたいの？」があります。

それは「幸せになること」です。

私は哲学者ではないですが、多分あっているでしょう。


幸せの条件は人それぞれですが、少なくとも「好きなことをやる」「好きな環境（状態）にいる」というのは、多くの人が「幸せの条件である」と同意してくれるのではないでしょうか。


実はスポーツにもっと打ち込みたい、ボランティアしたい、カフェ経営したい、沖縄で暮らしたい、海外で暮らしたい、子どもともっと時間を共有したい、バックパッカーで世界一周したい、ずっとアニメ見ていたい。

という何かが皆さんの中に既にあるかもしれないですし、今はなかったとしても、何かが将来見つかるかもしれないです。

# 幸せになるためには
さて持論ですが、「好きなことをやる」「好きな環境にいる」ためには、以下の３つ要素は揃えておかないといけないのかなと思います。

- 時間
- お金
- 場所

この３つは、会社員なると拘束されるものになります。逆に言えば、この3つの拘束を解いている、いつでも解ける状態にしておけば、「幸せになりやすい」状態にあるといえると思います。

さて、どうやって３つの拘束を解くかですが、１つの解法が「キャリアを積む」です。

キャリアを積んだら、この拘束を100%とはいかなくても、ある程度外すことができます。
エンジニアならなお一層です。

**時間** ：普通は週5日労働ですが、キャリアを積んだエンジニアなら、会社と交渉してこの時間を減らすこともできます。業務委託契約に切り替えてもらって、週3日労働にしてもらうこともできるでしょう。

**お金** ：エンジニアは他の職種に比べても給料がいいです。フリーになれば、週3日稼働契約でも会社員時代よりは手取りは増えるんじゃないでしょうか？

**場所** ：コロナによって、エンジニアはリモートワークが当たり前になってきました。我々にとっていい時代です。もう日本国内なら、場所は選びたい放題です。フリーになれば海外からでも仕事ができるでしょう。


キャリアを積んだ（＝スキルがある）エンジニアであれば、そのキャリアを武器に、主体的に自分の働き方を選択することが可能です。これには、ITエンジニアの人材市場は、他の市場に比べて流動性が高い市場であるのも貢献しています。

端的に言って、エンジニアの価値はそのスキルです。手に職がついています。
キャリアを積んで後に、仕事をやめて本当にしたかったことに没頭して、失敗したとしても、また前のキャリアからリスタートすることができます。これは手に職がついている人の大きなメリットです。ゼロリセットにはなりません。

# 結論
エンジニアがキャリアを積んだその後は…

**拘束を外して、幸せになる** 


でした
Webアプリでファイルを流出させないための予備知識

# はじめに
　Webアプリからのファイル流出事件は大騒ぎになってしまうことが多いです。素人から見ても熟練者から見ても、この事象はただのバグです。しかし、製造工程のメンバーにとある知識が欠落していることで、びっくりするくらい簡単にこのバグは埋め込まれてしまいます。
　今回はこのバグを防ぐコツを書いてみたいと思います。
# 実装者に確認すべきこと（コードレビュー）
　コードレビューで確認すべきことのうち、最も大切なのは次の事項だと思います。
　**「ファイルをレスポンスするためのコードを書いたか（どのコードを経由してファイルがレスポンスされているか理解しているか）」**
　※ファイルに対してアクセスコントロールが必要な前提で書いています。

　ここさえ押さえておけばあとは些細な問題です。逆に言えば、ここを間違えてしまうことで大事件が起こってしまうのです。

具体的なコード片としては、PHPの場合は、
```php
/* PDFをレスポンスするサンプル */
header("Content-type: application/pdf; charset=UTF-8");
header('Pragma: cache');
header('Cache-control: max-age=2592000, must-revalidate');
echo file_get_contents('file.pdf');
```
のようなコードを書きますし、プレーンなPHPではなく、例えばLaravelを使用しているならば、
```php
response()->file($filePath);
```
のような便利なラッパー関数が用意されています。

では、なぜこれらのコード片が重要になるのかを解説します。
　**「サーバサイドプログラムでファイルへのアクセスコントロールをするには、サーバサイドプログラムがファイルをレスポンスする以外の方法が難しい」**
ということです。先ほどのコードの断片で言えば、
```php
/* アクセスコントロールを行うならばここより前!!! */

/* PDFをレスポンスするサンプル */
header("Content-type: application/pdf; charset=UTF-8");
header('Pragma: cache');
header('Cache-control: max-age=2592000, must-revalidate');
echo file_get_contents('file.pdf');
```
上記のコメントした箇所、あるいはそれより前に、ファイルをレスポンスして良いかどうかのチェックを実装する必要があります。例えばDBのチェックです。そして、サーバサイドでアクセスコントロールの**チェックをした後に**、ファイルのレスポンスを行っています。

# HTTPサーバ管轄下にアクセスコントロールが必要なファイルを置かない
　では、実装者が「ファイルをレスポンスするコードに心当たりがない」ときに事件が起こってしまうケースを紹介します。最も起こりやすいケースはファイルをHTTPサーバ管轄下のディレクトリに入れてしまうことです。
　サーバサイドプログラムは、アップロードされたファイルを
・HTTPサーバ管轄外のディレクトリに保存する
・HTTPサーバ管轄のディレクトリに保存する
の2つの実装パターンのどちらも可能であることが多いです。大切なファイルをHTTPサーバ管轄のディレクトリに置いてしまうと外部に漏れてしまう原因になるのです。

　HTTPサーバの基本動作は、URLに対応したファイルがあればそれをレスポンスする動作です。サーバサイドのプログラムを経由せずにファイルがレスポンスされてしまいます。何かコントロールをしたくても、HTTPサーバのconfigを頑張って設定するくらいしかできることがありません。

　さて、先述の記載を振り返ってみます。
　**「ファイルをレスポンスするためのコードを書いたか（どのコードを経由してファイルがレスポンスされているか理解しているか）」**
 このように書きました。何故この観点が大切なのかを、HTTPサーバの基本動作と組み合わせて考えてみます。
　**・HTTPサーバ管轄下にファイルを設置した場合はサーバサイドプログラムからのコントロールが難しい**
　**・HTTPサーバ管轄外のファイルはサーバサイドにコードを書かないと取り出すことが難しい**
　この2行で説明は十分だと思います。サーバサイドプログラムのどこのソースコードが動いてファイルがレスポンスされるのかを知っている、ということは、すなわちHTTPサーバ管轄外にファイルを設置した可能性が高いわけです（もちろん断定できる要素ではないので別途検査は必要です）。
　そして、ファイルをレスポンスするコードに心当たりがないということは、すなわちHTTPサーバ管轄下にファイルを設置してしまった可能性が高くなります。

# その他気を付けるべきこと
　例えば、コードレビューを行っている際、
　**・チュートリアル通りやったから大丈夫**
　**・フレームワーク同梱のコマンドで設定したからよくわからない**
のようなコメントが実装者から出てきたとします。これは先述した
　**「ファイルをレスポンスするためのコードを書いたか（どのコードを経由してファイルがレスポンスされているか理解しているか）」**
に答えられていません。ファイルをレスポンスするためにコードを書いたか否か、が大事件の火種になることを知らない可能性があります。教えてあげましょう。
　なお、
　**・チュートリアル通りやったから大丈夫**
　に関しては、コンテンツがインターネット公開のブログみたいな内容だと、アクセスコントロールを実装せずにファイルをインターネットに公開してしまっている可能性が十分考えられますし、
　**・フレームワーク同梱のコマンドで設定したからよくわからない**
　に関しては、一旦ファイルをHTTPサーバ管轄外のディレクトリに避けたにも関わらず、内部的にはシンボリックリンクでHTTPサーバ管轄と同義の設定にしてしまっていることが考えられます。
　上記のように、**「よくわからないけど動く」** という状況に関しても、**ファイルをレスポンスするためにどこが動いてるのか、を説明できることが大切になります**。

# 以上を理解したら
　Webアプリで扱うファイルはインターネットで公開しても良いファイルから、特定の人にしか見せてはいけないものまで多岐に渡ります。初めからインターネット公開で大丈夫なファイルはサーバのリソース削減のためにHTTPサーバ管轄に設置しても良いでしょう。アクセスコントロールが必要ならば、サーバサイドプログラムからしかアクセスできないところに設置しましょう。
　ファイルをWebアプリで公開するというシンプルなテーマでも、実装する工程で生じる選択肢が意外とあります。そして、ファイルを扱うという性質上、選択肢の間違いが許されないケースの方が多いと思います。気を付けましょう。
【React × TypeScript】子コンポーネントの値を親コンポーネントで使用する

# 子コンポーネントの値を親コンポーネントで使用する

## 背景
* ログインページを作成するときにUIとロジックでコンポーネントを分けたいと思ったため。
* 親コンポーネントでユーザーネームを使用したい、子コンポーネントでユーザー名を入力するInputを使用したい。

### 親コンポーネント
```tsx:Login.tsx
import React, { useState } from "react";
import LoginUI from "./LoginUI";

const Login = () => {
  const [userName, setUserName] = useState('');
  console.log(userName);

  const onUserNameChange = (value: string) => {
    setUserName(value);
  };
    return (
        <>
            {/* ログインUI */}
            <LoginUI userName={userName} onUserNameChange={onUserNameChange}/>
        </>
    );
}

export default Login;

```

### 子コンポーネント
```tsx:LoginUI.tsx
import React from 'react';
import { Input } from '@nextui-org/react';

interface LoginProps {
  userName: string;
  onUserNameChange: (value: string) => void;
}

const LoginUI = ({ userName, onUserNameChange }: LoginProps) => {
  const handleNameChange = (
    event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>
  ): void => {
    const value = event.target.value;
    onUserNameChange(value);
  };

  return (
    <>
      <Input
        labelPlaceholder="ユーザー名"
        onChange={handleNameChange}
      />
    </>
  );
};

export default LoginUI;


```
TLPTって何？

:::note info
この記事で学べること
・TLPTとは何か
・TLPTとペネトレーションテスト、脆弱性診断の違い
:::

こんにちは、Melaaと申します！
この度、NTT West-CIRTのQiitaを開設いたしました。僭越ながら、トップバッターを務めさせていただきますこととなりましたので、皆様温かい目で見守っていただきますよう、切実にお願いいたします！

## 目次
- [はじめに](#はじめに)
- [TLPT (Threat-Led Penetration Testing)](#tlpt-threat-led-penetration-testing)
    - [TLPTとペネトレーションテストの違い](#tlptとペネトレーションテストの違い)
    - [ペネトレーションテストとは](#ペネトレーションテストとは)
    - [脆弱性診断とは](#脆弱性診断とは)
- [まとめ：TLPTは実被害を想定したセキュリティ耐性の評価に最適](#tlptは実被害を想定したセキュリティ耐性の評価に最適)

## はじめに
私がレッドチームに所属した時、「TLPT」という単語をひっきりなしに耳にすることとなりました。そもそも、「TLPT」って何？と思い調べてみるも、言葉の定義を辞書通りに紹介しているサイトばかりで、なかなか「普通のペネトレーションテストと具体的に何が違うの？」という疑問を解消できる説明に出会えませんでした。

最近、やっと「TLPT」というものについて、自分で言語化出来るところまで理解できた（と思っている）ため、記事に起こそうと思います。

## TLPT (Threat-Led Penetration Testing)
辞書通りの説明をすると、日本語では**脅威ベースのペネトレーションテスト**と訳され、オリジナルの攻撃シナリオに沿って擬似サイバー攻撃を行うことで、セキュリティ耐性や攻撃による想定被害を評価するテスト手法のことです。

似たようなテスト手法として、ペネトレーションテストと脆弱性診断があります。
|テスト手法|目的|実施方法|網羅性|コスト|結果の信頼度|
|---|---|---|---|---|---|
|TLPT|セキュリティ耐性や想定被害の評価|テスト対象の種類や特性に合わせたオリジナルの攻撃シナリオに沿って疑似サイバー攻撃を実施|△|△|◎|
|ペネトレーションテスト|セキュリティ耐性や想定被害の評価|一般的に流行している攻撃手法を用いて疑似サイバー攻撃を実施|△|○|○|
|脆弱性診断|システムが持つ脆弱性の洗い出し|ツールやチートシートを用いて網羅的に脆弱性の有無を確認|◎|◎|△|

### TLPTとペネトレーションテストの違い
TLPTが通常のペネトレーションと決定的に異なるのは、"**オリジナルの攻撃シナリオに沿って**"という部分です。TLPTでは、事前にテスト対象の調査を行い、実際の攻撃者がどのような攻撃を行うか想定し、**テスト対象毎にオリジナルの攻撃シナリオ**を作成します。

### ペネトレーションテストとは
ペネトレーションテストは、疑似サイバー攻撃を行うことでセキュリティ耐性や攻撃による想定被害を評価するテスト手法のことです。この時、攻撃手法として、**一般的に流行っている攻撃**であったり、**昔から有名な攻撃手法**が採用されることが多いです。
TLPTと違い、テスト対象に関わらず同じ攻撃手法を用いるため、コストがかからない反面、**システムや組織の特性に合わないテストとなってしまう**可能性があります。

### 脆弱性診断とは
ペネトレーションテストとよく比較されるモノとして、脆弱性診断が挙げられます。脆弱性診断はTLPTやペネトレーションとはそもそも目的が違い、システムが持つ脆弱性を洗い出すために行われます。そのため、**攻撃による被害の大きさは考慮せず**、とにかく**網羅的に脆弱性の有無を確認する**手法となります。
脆弱性診断を受けたシステムの管理者は「**脆弱性が存在する≠実被害がある**」ということを理解し、セキュリティ対策実施に向けて**脆弱性によるリスクの評価**を行う必要があります。


## TLPTは実被害を想定したセキュリティ耐性の評価に最適
TLPTは、ペネトレーションテストや脆弱性診断と比べて、**よりテスト対象の種類や特性に合ったセキュリティ耐性の評価を行える手法**となっております。

手間や時間などコストは大きくなってしまいますが、その分効果は十二分に期待できます。特に機密情報を取り扱うような組織では、**組織の特性に合わせた巧妙な手口の攻撃**を受ける可能性が高くなるため、TLPTの実施に向いているといえるでしょう。

以上、TLPTについて自分なりに解説していきました。今まで曖昧な理解のまま止まっていた同志がいらっしゃいましたら、この記事を読むことを理解の一助としていただければ幸いです。

#### 参考にしたサイト
https://www.nri-secure.co.jp/blog/threat-led-penetration-test

https://www.intellilink.co.jp/business/security/tlpt.aspx

https://www.lac.co.jp/consulting/tlpt.html
HumanActivityRecognitionSurvey-CaseStudy2

# Wearable Sensor-Based Human Activity Recognition with Transformer Model

2022年に発表されたKU-HARデータセットについてTransformerを適用した論文。  

執筆時点ではBiLSTMという双方向にLSTMを用いたNNモデルがWISDMデータセットにおいて良いスコア（ACC:96.54）を出しているらしい。  

また、Transformerについて利用するメリットについては計算速度と拡張性であると記載されていた。  

加工後のKU-HARデータセットはスマホから収集された1次元（300）・6チャネルのデータセットである。  
この6という数字はパッチ数に対応しており、1800個を->300×6としているのでP=300のViTとも解釈可能である。  

ラベルはWISDMデータセットと同じ「立つ」、「座る」、「歩く」だけでなく、「立つ座るを繰り返す」、「卓球」などを加えた計18クラスになっている。  

サンプル数は20750個で、データ拡張を行うことで83129個のデータにしている。  

データ拡張について、300個のサンプルについて合成を行い使用したサンプルラベルを並べたものを新ラベルとして使用する。  
つまり、今回の場合には300個のラベルを並べたものが新ラベルとして用いられる。



TransformerのハイパーパラメータについてはWanDB Sweep Toolを用いて探索したとあり、ACCを最大化（ACC:0.992）する方向に進めている。  

以下の表は探索結果のハイパーパラメータの表である。  


|        params        | Epochs | Attention Dropout rate | Batch size | MLP Dropout rate | Embedding size | MLP Layer size | head | layers | Adam's learning rate |
|---------------------------|--------|-----------------------|------------|------------------|----------------|----------------|------|--------|----------------------|
| Value             | 50     | 0.1                   | 64         | 0.1              | 128            | 256            | 6    | 3      | 0.001                |

合計パラメータ数は1,428,127個であった。  

学習後の位置エンコーディングの画像が以下である。  
![KU-HAR-PE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487085/52fc1374-c31d-2b69-4dec-741e33699b4a.png)

### ソースコード
https://github.com/markub3327/HAR-Transformer

### データ
https://www.kaggle.com/datasets/niloy333/kuhar?resource=download

### 元論文
https://paperswithcode.com/paper/wearable-sensor-based-human-activity
HumanActivityRecognitionSurvey-CaseStudy1

# Human activity recognition based on time series analysis using U-Net
2018年に発表されたU-Netと呼ばれるCNNアーキテクチャを提唱した論文。 
データについて参考になった。  

今回ViTで取り組んでいるデータセットの名前は「WISDM dataset」と呼ばれるもののようだ。  
WISDMはWireless Sensor Data Miningの略らしい。  

3軸加速度時系列データ、つまり3チャンネルの時系列スペクトルデータである。  
20Hzでサンプリングされており、1098209サンプル存在する。  
合計時間にして915分のデータになる。

教師ラベルは6種類存在し、内訳としては以下の通り。
|  label   | Walking | Jugging | Upstars | Downstars | Sitting | Standing |
|----------|---------|---------|---------|-----------|---------|----------|
|percentage| 38.6%   | 31.2%   | 11.2%   | 9.1%      | 5.5%    | 4.4%     |

提唱されているU-NetのACC、F1スコアは共に0.970であった。  
他にもデータセットには種類があることもわかったため、立ち戻って読むかもしれない。

### 元論文
https://arxiv.org/pdf/1809.08113.pdf
一方的フォローを取り消すプログラムをつくった

## !注意!
現在、APIの使用は変更されています。
>「そういえば、無料で利用できたいい時代もあったなぁ」

という感覚で、ご覧ください。

```php
<?php

// Twitter APIのライブラリをインストール
require_once('autoload.php');
use Abraham\TwitterOAuth\TwitterOAuth;

// Twitter APIの認証情報を設定
$consumer_key = '';
$consumer_secret = '';
$access_token = '';
$access_token_secret = '';

// Twitter APIに接続
$connection = new TwitterOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);

// 自分のアカウント情報を取得
$user = $connection->get('account/verify_credentials');

// 自分がフォローしているアカウントのIDを取得
$following_ids = $connection->get('friends/ids', ['screen_name' => $user->screen_name])->ids;

// 自分をフォローしているアカウントのIDを取得
$follower_ids = $connection->get('followers/ids', ['screen_name' => $user->screen_name])->ids;

// 自分をフォローしていないアカウントのIDを取得
$unfollowing_ids = array_diff($following_ids, $follower_ids);

// 自分をフォローしていないアカウントのフォローを解除
foreach ($unfollowing_ids as $unfollowing_id) {
    try {
        $connection->post('friendships/destroy', ['user_id' => $unfollowing_id]);
        echo "Unfollowed user with ID: " . $unfollowing_id . "\n";
    } catch (Exception $e) {
        error_log('Error unfollowing user with ID ' . $unfollowing_id . ': ' . $e->getMessage());
    }
}

?>
```
HumanActivityRecognitionSurvey-Introduction

# Human Activity Recognitionの研究意義

Human Activity Recognition（HAR）は、人々の行動を検出・分類・予測するための研究領域である。  
HARの研究には、以下のさまざまな目的と意義がある。

## 1. 応用分野の向上
HARの目的の1つは、人々の日常生活や特定の状況での行動を認識することによって、応用分野での改善を促進すること。 
 例えば、健康管理やフィットネス、スポーツパフォーマンスの向上、高齢者ケア、モバイルデバイスのインタラクションなど、さまざまな領域でHARの応用が考えられる。

## 2. インタラクションの改善
HARの研究は、人とコンピュータとの間のインタラクションを改善するためにも役立つ。  
ボイスコマンドやジェスチャー認識など、自然で直感的な方法でコンピュータとやり取りするために、HARの技術が活用されている。

## 3. 安全とセキュリティの向上
HARは、安全とセキュリティの向上にも貢献している。  
異常行動の検出や侵入者の監視、危険な状況への早期警告など、セキュリティシステムの一部としてHARが活用されることがある。

## 4. データ分析と洞察の獲得
HARの研究は、大量の行動データを収集し分析することで、洞察を得ることを目的としている。  
人々の行動パターンや傾向の把握、特定の行動と特定の結果との関連性の解明などがある。  
これにより、ビジネス上の意思決定や健康行動の改善など、さまざまな分野での効果的なデータ利活用が可能になる。

----

総じて、HARの研究は、人々の行動を認識することによって、生活の質の向上、応用分野の改善、インタラクションの改善、安全とセキュリティの向上、データ分析と洞察の獲得など、さまざまな目的と意義を持っている。
【読み物】Spinampは音楽NFTに革命を起こすか？

このドキュメントは、Spinamp 公式の情報 [「Spinamp raises $1.2M to build Music NFT Player」](https://zeneca33.substack.com/p/letter-39-on-bitcoin-ordinals-part)の内容を要約したものです。

## Spinamp＝Spotify＋OpenSea

音楽NFTを自由にシームレスに楽しめる世界。Spinampは、あらゆるNFTのプラットフォームで作成された音楽のNFTを、１つのプレーヤーとマーケットプレイスに統合するアグリゲーターを目指しています。

Spinampとは、SpotifyがOpenSeaと出会ったようなものだと考えることができます。

Spinampのミッションは「音楽NFT全体における最高の聴取体験とコレクション体験を創造すること」。この目標を達成するために、Spinampは"Palm Tree Crew Crypto"をリードとする125万ドルの資金調達を行い、音楽NFTのアグリゲーターとプレーヤーを構築しています。

他の投資家には…Coop Records、Archetype、NoiseDAO、Fire Eyes DAO、1kx、Reuben Bramanathan（Ideo）、DegenDavinci（トップの音楽NFTコレクター）、Adam Levy（Mint Podcast）、David Greenstein（Sound.xyz）、Kyle Dhillon（Arpeggi）、Mike Perry（Heds）、Ramtin Khoee（Heds）、Cameron Greer（Heds）、Christina Beltramini（Lens）が含まれます。

## 音楽NFTのアグリゲーター

Spinampは、Sound、Catalog、Nina、Zora、NOIZD、Lens、Arpeggi、Decent、OpenSea Collections、Songcamp、HedsDAO、Manifoldなど、30以上の他の小規模なプラットフォームとアーティスト所有の契約から、音楽NFTを集約し、インデックス化します。

プレイリスト、コレクションには、すべてのプラットフォームとミントプラットフォームで作成された、あらゆる音楽NFTが含まれる予定です。

![](https://miuradonuts.com/wp-content/uploads/2023/06/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-06-26-125548.png)

Spinampは、音楽を聴きながら直接コレクションすることが可能です。これにより、Spotifyでトラックを発見し、NFTとしてその音楽をコレクションすることができる、前例のない体験を得ることができます。モバイルには、まだ未対応ですが、Spinamp Collectは、音楽の収集とキュレーションに絶大な威力を発揮するかもしれません。

## 音楽とアーティストを最優先に

Spinampは、まずは音楽を聴くことにスポットを当て、コレクションはその次です。音楽を聴くことを最優先としているので、リスニングとコレクションをシームレスに体験でき、直感的な操作で楽しむことが可能です。

Spinampでは「Spinamp Rewards」という、キュレーター報酬を受け取ることができます。自分のプレイリストを通じて誰かが曲をコレクションすると、その音楽NFTがキュレーター報酬をサポートしている場合、その取引の一部を報酬として受け取ることができます。

国内では、すでに「Sound Desert」が音楽NFTのプラットフォームとして認知されていますが、音楽NFTのアグリゲーターとしてSpinampが黒船となり得るのか、注目していきたいところです。

この記事は、著者が運営するメディア「ぬるぺでぃあ」でも読むことができます（記事は[コチラ](https://miuradonuts.com/2023/06/26/nft-note003//)）
![](https://miuradonuts.com/wp-content/uploads/2023/06/ヘッダーエリア画像作成.png)
一番最初のコミットに全コミットを集約する

おすすめはしませんが、軽くまとめました
全コミットを1つにします

(1) 一番最初に遡ってrebaseを実行する
```
git rebase -i --root
```

(2) rebase内でエディタで置換する

viでfixupなら `:%s/pick/f/g` で全置換のあと、最初のコミットをfからpickに戻す

(3) 強制的にremoteを上書きする

```
git push origin head  --force-with-lease
# 適切に設定しているリポジトリでは不可能
# 遊びの開発用
```
エンジニアマネージャー必見：EMが知るべき数値管理の話

# はじめに
エンジニアマネージャーにとって、数値管理はプロジェクトや部署チームの健全な運営と成功に欠かせない要素です。
PL（損益計算書）、BS（貸借対照表）、CF（キャッシュフロー計算書）の数値管理は、企業の財務状況や将来の展望を把握するために重要です。
特にソフトウェアやハードウェアの資産計上は、エンジニアリング部門において特に重要な要素となります。
本記事では、エンジニアマネージャーが数値管理について理解し、適切に活用するためのポイントを解説します。

# PL（損益計算書）の管理
PLは特定の期間内の収益と費用を示す財務諸表です。エンジニアマネージャーはプロジェクトの収益と費用を追跡し、プロジェクトの収益性を評価するためにPLを活用する必要があります。以下のポイントに留意してPLを管理しましょう。
- プロジェクトの収益源を正確に追跡し、収益の予測を行う。
- 費用項目を詳細に分類し、プロジェクトに関連する費用を適切に割り当てる。
- 収益と費用のバランスを確保し、予算との比較を行う。
- PLの変動要因を分析し、プロジェクトのパフォーマンス改善のための戦略を策定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/4fbab66b-76a7-fd48-df2b-e879dcf23bb3.png)

**人件費や販売管理費は会社によって計上する位置が変わるので、利益管理を売上総利益で管理する会社と営業利益で管理する会社に分かれます**

# BS（貸借対照表）の管理
BSは特定の期間の企業の資産、負債、純資産を示す財務諸表です。エンジニアマネージャーはプロジェクトや部門の資産を適切に管理し、リスクを把握するためにBSを活用する必要があります。以下のポイントに留意してBSを管理しましょう。
- ソフトウェアやハードウェアなどの資産を正確に計上し、減価償却を適切に行う。
- 資産の評価とリスク管理を行い、適切な保険を検討する。
- 負債を正確に追跡し、支払いスケジュールを管理する。
- 純資産を評価し、部門の健全性と成長ポテンシャルを把握する。

# CF（キャッシュフロー計算書）の管理
CFは特定の期間の現金の流入と流出を示す財務諸表です。エンジニアマネージャーはプロジェクトの現金の収支を追跡し、資金繰りの健全性を確保するためにCFを活用する必要があります。以下のポイントに留意してCFを管理しましょう。
- プロジェクトの現金の流入と流出を正確に追跡し、予測を行う。
- 資金不足のリスクを特定し、適切な対策を講じる。
- インベストメントや資本調達の計画を策定し、適切なタイミングで実施する。
- キャッシュフローの変動要因を分析し、プロジェクトの持続可能性を評価する。

# ソフトウェア・ハードウェアの資産計上と関係
ソフトウェアやハードウェアはエンジニアリング部門において重要な資産です。エンジニアマネージャーはこれらの資産を適切に管理し、正確に計上する必要があります。以下のポイントに留意しましょう。
- ソフトウェアやハードウェアの購入、開発、メンテナンスなどの費用を正確に計上する。
- 減価償却スケジュールを作成し、資産の価値減少を追跡する。
- 資産の価値評価とリスク管理を行い、適切な保険を検討する。
- 資産の寿命と更新の計画を立て、予算に適したタイミングで更新する。

**資産計上をする場合は、お金を支払ってキャッシュアウトしますが、PL上は、リリースするまでは、資産になるので損金になりません。この辺がPL/BS/CFを知っておく必要がある理由です**

## 資産計上のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/75735dcc-289b-2a7a-0c05-82f1959dd2d8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/f599a5f9-cfe0-8429-7aca-5671ff45c0e8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/0136060b-2461-f156-923e-a3bc1e12abc4.png)

177万が3年間、月額の費用として毎月計上される。
更にサービスが利益を生まないと判断された場合には、一括除却が求められます。

# まとめ
エンジニアマネージャーが数値管理を適切に行うことは、プロジェクトやチームの成果を最大化し、組織全体の成功につなげるために不可欠です。PL、BS、CFの数値管理に加えて、ソフトウェアやハードウェアの資産計上も重要な要素です。正確な数値管理と資産管理を通じて、エンジニアマネージャーは戦略的な意思決定を行い、持続可能な成長を実現することができます。

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
Gitで`error: remote origin already exists.`が出た時の対処法

# 初めに
PowerShellで`git remote add origin <URL>`を実行したら
```
error: remote origin already exists
```
というエラーを吐いたのでそれを調べた結果をまとめます。

# 1.リモートリポジトリを確認する
既に origin という名前のリモートリポジトリが存在するかどうか確認します。
```
git remote -v 
```
コマンドを使用して、現在のリモートリポジトリの一覧を表示できます。

# 2-1.origin を削除する
もし既に origin が存在している場合、それを削除することで問題を解決できます。以下のコマンドを使用して origin を削除します。
```
git remote remove origin
```
origin が正しく削除された場合、その後で git remote add コマンドを再度実行することができます。

# 2-2.既存の origin を変更する
もし origin として指定しようとしているリモートリポジトリを変更したい場合は、既存の origin を変更することもできます。以下のコマンドを使用して、既存の origin を変更します。
```
git remote set-url origin <新しいリモートリポジトリのURL>
```

**これでgit remote add のエラーを解決できるはずです!**
Ubuntuインストール時「’grub-install /dev/sda’ の実行に失敗しました。」 エラーの解決方法

## はじめに
10年ほど前に購入したPCがwindows8のため、Linux化しようと試みました。その際に生じた表題のエラーの解決方法について記載します。

## 環境
### 使用したPC情報
- 実装メモリ（RAM）8.00GB
- システムの種類 64ビット オペレーティングシステム、x64 ベース プロセッサ
- UEFIモード
### インストールしたLinux
- Ubuntu Desktop 22.04.2 LTS

## Ubuntuをインストールした方法
今回、私が実行したUbuntuをインストールした方法について簡単に記載します。
1. Ubuntuをダウンロードする
    - ダウンロードサイト: https://jp.ubuntu.com/download
1. Rufusというプログラムを用いてUSBメモリへダウンロードしたUbuntuをインストールする
    - ダウンロードサイト: https://rufus.ie/ja/
        - Portableタイプを使用しました。
    - 使用するUSBメモリ内の元々あるデータは上書きされて消えてしまうとのことで、新しいUSBメモリを用意しました。
    - YUMIという別のプログラムを用いることも可能でしたが、ChatGPTに聞いたらRufusの方が書き込みが早く初心者にとっても使いやすいとのことでRufusにしました。
1. UbuntuをインストールしたいPCにて、作成したUbuntu起動用USBメモリから起動させる
    - PCによって起動方法は異なります。
        - 使用したPCのVAIOの場合: https://www.sony.jp/support/vaio/products/manual/svp1121_svp1321/contents/TP0000053461.html
1. Ubuntuのinstallアプリを起動し、インストールする

## 表題エラー発生時の状況
Ubuntuが9割ほどインストールされたくらいのタイミングで表題のエラーが発生しました。
grubのインストールに失敗しているようです。
その際、インストールの種類という画面で「ディスクを削除してUbuntuをインストール」を選択しておりました。

## 表題エラー解決策
1. インストールの種類という画面で「それ以外」を選択し続けるを押下
1. 既存のパーティションを全て削除
1. 「空き領域」を選択し「＋」をクリックすることで以下のパーティションを上から追加していく
    | サイズ | パーティションタイプ | 新しいパーティションの場所 | 利用方法 | マウントポイント |
    |:-:|:-:|:-:|:-:|:-:|
    | 20GB | 基本パーティション　| この領域の始点 | ext4ジャーナリングファイルシステム | / |
    | メモリの2〜1.5倍 | 基本パーティション | この領域の始点 | スワップ領域 |   |
    | 200MB | 基本パーティション | この領域の始点 | EFIシステムパーティション |   |
    | 最大（出てきた数字） | 基本パーティション | この領域の始点 | ext4ジャーナリングファイルシステム | /home |
1. インストールする

## 解決策の裏付け
上記のようにググってでてきた解決策の通り実行したらインストールできましたが、なぜ解決できたのか腹落ちできていないため、ChatGPTに聞いてみました。

>EFIシステムパーティションを設定したことによって、インストールが成功した理由は以下の通りです。
>
> 1. EFI互換システム: EFI (Extensible Firmware Interface) は、BIOSの代わりとなるファームウェアインタフェースです。EFIシステムパーティションを作成することで、コンピュータがEFI互換システムであることを認識し、それに応じたブートプロセスを実行します。
> 2. ブートローダーの配置: EFIシステムパーティションには、EFIブートローダーやカーネルイメージなどのブートに必要なファイルが格納されます。これにより、コンピュータが起動時にEFIシステムパーティションを見つけ、そこから適切なブートローダーを読み込むことができます。
> 3. GPTパーティションスキーム: EFIシステムパーティションは、GPT (GUID Partition Table) パーティションスキームに必要なパーティションの1つです。GPTは、MBR (Master Boot Record) に代わるパーティションスキームであり、大容量のディスクや複数のOSの管理に適しています。
>
> したがって、EFIシステムパーティションを設定することで、EFI互換システムを正しく認識し、ブートローダーを適切に配置して起動することができます。これによって、インストールがエラーなく成功したと考えられます。

難しかったので、小学生でも分かるように解説してもらいました。

>通常、コンピュータは起動する際に、特別なソフトウェア（ブートローダー）を使ってオペレーティングシステム（OS）を起動します。EFIシステムパーティションは、そのブートローダーと関連するファイルが保存される場所です。
>
> EFIシステムパーティションを設定することで、コンピュータは正しくブートローダーを見つけて起動できるようになります。これにより、OSがちゃんと起動することができるのです。
>
>また、EFIシステムパーティションは、大きなディスクや複数のOSを管理するための特別なディスクの仕組み（GPT）に必要です。GPTは、コンピュータのディスクを管理するためのルールのようなものです。
>
>だから、EFIシステムパーティションを設定することで、コンピュータはちゃんと起動するための準備が整うのです。
>
>つまり、EFIシステムパーティションを作ることで、コンピュータがちゃんと起動するようになり、インストールがエラーなく成功するようになるのです。

`grub-install`コマンドはブートローダーGRUBをインストールするコマンドであり、通常ブートパーティションのあるディスク`/dev/sda`にGRUBをインストールするが、今回の条件では、EFIシステムパーティションを設定することで、適切にブートローダーを配置して起動できるようになった、ということでしょうか、、、

## おわりに
ひとまず無事Linux化できたので、Linuxライフを楽しもうと思います。


## 参考
- [【初心者向け】不要winPCへリナックスをインストールする方法](https://gundamoon.com/ubuntu)
- [ubuntuインストール中にgrubインストールが失敗してerrorが出たときの対処法](https://hack-file.hatenablog.jp/entry/ubuntu-install-grub-error)
Kubernetesの基本的なこと

業務で使うことになったので初回で受けた説明と独自で軽く調べた内容を記載します。

<h4>ちょっとした知識</h4>
KとSの間に8つの文字があることから「k8s」と書かれることもあるそうです。

<b>K ubernete s　→　k8s</b>　な、なるほど。
(初見にやさしくない書き方ですが、慣れてきたらKubernetesと都度書くのは面倒ですね)

コンピューティングサービスでも以下のようにk8sが使えます。
・AWS：Amazon Elastic Kubernetes Service
・Azure：Azure Kubernetes Service
・Google Cloud：Google Kubernetes Engine

<h4>構成について</h4>
簡単にですが以下のようになっています。

・クラスタ：nodeのマシンの集まり
・node：podの集まり
・pod：コンテナを管理するための最小単位

<h4>マニュフェストファイルについて</h4>
こちらはyamlファイルかjsonファイルで書かれています。

まだ少し触った程度なので調査してみたところ、
公式の以下のページをたどっていけばとりあえず情報が出てきそうです。
https://kubernetes.io/docs/reference/kubernetes-api/

例えばワークロードのpodで使うリファレンスは以下になります。
https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/

まだ使い始め、および学び始めたばかりなので、これからどんどん知識をつけていきたいと思います。
SteamDeckでUbuntuを使う

## SteamDeckでUbuntuを使おうと思った理由
SteamDeckをサーバー化しようという計画の元、ArchLinuxをベースとした、SteamOSでは不都合が多すぎるので、Ubuntuをインストールしようと思い立ちました。
## 使用環境
- SteamDeck 64GB eMMCモデル
- 32GB SD カード おそらくhidisk
- 16GB USBメモリー
- Ubuntu 23.04 日本語Remix
## Ubuntuインストールイメージの取得
正直これは公式でも日本語Remixでもどちらでもいいのですが、旧インストーラーを使いたかったので、日本語Remix版を使いました。

https://jp.ubuntu.com/download

https://www.ubuntulinux.jp/download
22.04 LTSでも23.04でも構いません。
## USBメモリーにイメージを焼く
今回使うのはBalenaEtcherです

https://etcher.balena.io/#download-etcher

AppImageのものを選んでください。
BalenaEtcherが起動したら、SelectImageでダウンロードしたisoファイルを、SelectDriveでフラッシュ先ののUSBを選択してください。(たいていUSBメモリーは自動選択されている。)

:::note warn
USBメモリーのデータは全て消えます
消えてほしくないデータが有る場合は、バックアップを取ってください。
:::
Flash!のボタンを押します。これを押すと書き込みが始まります。管理者権限を求めるダイアログが出てきますので管理者パスワードを打ってあげてください。このダイアログは脱走するのでちゃんと捕まえてください。
## Ubuntuのインストール
### 1.USBからのブート
SteamDeckにUSBを接続し、電源を切ります。
そして、音量-ボタンを押しながら、起動します。そこに表示されたものに先程フラッシュしたUSBメモリーが表示されているはずですので、それを十字キーで選択肢、Aを押します。
### 2.起動エディションの選択
起動をするとTry Ubuntuやらなんやら書いてあると思います。
ここではUbuntu (Safe Grafic)を選択します。画面が縦向きになっていますが、十字キーは横向きのままです。十字キーの下を押して選択をし、Aで決定をしてください。間違えて右をしてしまうと一生画面が表示されない状態になってしまうので気をつけてください。
### 3.Ubuntuのインストール
しばらく待っていると、Ubuntuのインストーラーが表示されると思います。
しかし、とにかく不安定です。動かなくなったな、謎の画面に行ったな、と思ったら、それの意味がわかる&解決できる人以外大人しく再起動しましょう。1.からやり直しです。

:::note warn
無理に解決しようとして破壊しないこと！
:::
数回再起動していると、調子がいいときが見つかるはずなので、そこでインストールします。インストールは道なりです。そのままですから。私はSDカードにインストールしたかったのでSDカードのパーティションの設定などをしましたが、適宜書き換えてください。

:::note alert
パーティションの設定一つで、SteamOSが吹き飛びます。しっかり確認して行いましょう
:::
マルチブートをする場合はパーティションをしっかり分けて行ってください。

:::note warn
ユーザー入力ではパスワードの画面ではソフトウェアキーボードが表示されません。適宜外付けキーボードを使ってください。
:::
### 4.Ubuntu起動
セットアップが終わって再起動をすると、Ubuntuデスクトップが表示されます。お疲れさまでした
## エラー
- 画面が一向に表示されない - GURBでSafe Graficを選択してください。
## まとめ
Ubuntuのインストールはこれで完了です。あとは煮るなり焼くなりご自由にどうぞ！では楽しいLinuxライフを！！
【読み物】ウタマロ石けんから学ぶこと

## カンブリア宮殿「廃番の危機から奇跡の復活！ウタマロの秘密に迫る」

スーパーやドラッグストアでもお馴染みの緑の石けん「ウタマロ」は、洗濯せっけんです。少年野球のスライディングでユニフォームの奥深くに入り込んだ泥汚れも、Yシャツの襟元のしつこい汚れも、魚釣りで使用した生臭いタオルや手袋まで。この緑の石けんで擦ると、驚くほど汚れが落ちると話題沸騰中。SNSでも裏技的な使い方が多数紹介されており、「ウタマロ石けん」の周辺には、そのクラシックな見た目とはまるで違う風景が広がっていました。

コチラから視聴可能です（[Paravi「カンブリア宮殿」](https://www.paravi.jp/watch/107549)より）

![](https://miuradonuts.com/wp-content/uploads/2023/06/maxresdefault-1024x576.jpg)

2021年度の調べでは、年間販売個数「1230万個」を売り上げる超ヒット商品であり、キッチン周りの汚れ用や住宅汚れにも使えるものなど「汚れを落とす」ことに徹底した商品が幅広く受け入れられています。

## ウタマロをつくる企業「東邦」

大阪にある創業100年を超える老舗企業「東邦」が製造・販売をしています。

・従業員規模：58人
・売上の80%を「ウタマロ」シリーズが構成
・ユーザーからの驚きの声が手紙で多数届く
・100年前から洗濯石けんを作り続けてきた
・研究室では、石けんの基本設計となる「脂肪酸」の配合比率を今も試行錯誤・改良をしている
 ※脂肪酸の組み合わせを片っ端から試して、1,000種類を超えたとの逸話も
・「ウタマロ」という名前は、「喜多川歌麿」が由来

## 苦難の歴史

東邦の創業は1920年。まだ洗濯板でゴシゴシと手洗いをするのが主流だった時代に、他社の洗濯石けんをOEMとして製造していました。1957年に東京の商社から、オリジナルの洗濯石けんを製造してほしいとの依頼があり、「ウタマロ石けん」が誕生。年間3,000万個の大ヒット商品となります。

しかし、洗濯機の登場と普及により、安価で使用しやすい液体石けんが主流となり、販売個数は右肩下がりで激減へ。1998年には遂に、「ウタマロ石けん」の販売元だった企業が廃業してしまいます。

製造中止がよぎった頃、「ウタマロ石けん」の愛用者から「製造をやめないでほしい」との電話が相次いだそうです。この声を受けて、東邦が商標を買取り、自社製品として「ウタマロ石けん」は生き残ります。

## 戦略

2000年から「ウタマロ石けん」の売上が少しずつ回復傾向にあったことで、愛用者の声を徹底的に聞くことに力を注ぎます。

その理由とは…「部分洗い」としての用途でした。洗濯機では落ちない汚れの部分洗い用として、使っているとの声に辿り着いたんですね。

ここから、「部分洗い用の石けん」として「ウタマロ石けん」のV字回復ストーリーが始まります。

### 戦略① ラインナップ

発売されてから60年以上が経ち、東邦の売上の80%を構成する「ウタマロ」シリーズには、たった4種類のラインナップしかありません。

・固形石けん（一番メジャーなもの）
・おしゃれ着用のボトルタイプ
・住宅用のクリーナー（スプレータイプ）
・キッチン／食器用のプッシュタイプ

ラインナップが多すぎると、「どこに何を使えば良いのかが、分かりにくくなる」。この汚れには「このタイプのウタマロ！」と、選ぶフェーズが入ってしまうため、面倒になってしまうのではないか？という考えがあるようです。

できるだけ商品数をシンプルに絞ることで、選択肢を減らし、家事をできるだけ楽にすることが考慮されています。

### 戦略② エメラルドグリーンにした理由

汚れは、だいたい暖色系。食べこぼしは赤や茶色、泥汚れも茶色、あぶれ汚れは赤黒かったり、くすんだ黄色だったりする。この反対の色の「寒色系」のカラーをつけることで、汚れている部分にちゃんと塗れているのかが分かるから、というのが理由のようです。

### 戦略③ 実演では、試供品を配る

店頭での実演販売では、汚れ落としを実演し、売るのかと思いきや…。試供品を配って、実際に使ってもらい、ファンになってもらうことを大切にしています。実際に使ってもらい、体感してもらうことが、確実なコミュニケーションの方法でもあるんですね。

たった4人しかいない営業担当が、全国を飛び回って実演をしているようです。

### 戦略④ 汚れが許されない職種の方に使ってもらい、ブランディング

白い装束に身を包む神主や巫女などの神職の方。また白いシャツと綺麗な服装が求められるバーテンダーの方に、実際にウタマロ石けんを使ってもらい、汚れの落ち具合や使用感などをまとめ、サイトへ掲載してブランド力を高めています。

## ここから学ぶこと

ウタマロ石けんの勢いを支えるのは、「口コミ」。使用者が感動した声を、わざわざ直筆の手紙でメーカーに伝えるほど。他のお客さんを動かす大きな原動力になるのは、企業からの情報発信よりも「ウタマロ石けんを使って、汚れがこんなにも落ちた！」というユーザーの声だと言い切るところに、「口コミ」の重要性を感じました。

そして、愛用者の声を信じてコツコツと継続することで、「地の利」を築いていたことにも納得です。液体洗剤を製造する大手は、専用の設備を必要とする固形石けんへ参入しにくい。また、液体石けんと比べて単価の安い固形石けんは、採算が悪く参入障壁が高い、という位置付けに「ウタマロ石けん」はたどり着いていたのでした。

口コミが「部分洗い用石けん」としてのポジションを築き、企業は徹底した研究とユーザーの声に耳を傾けることで応えている。こう書くと、ものすごくシンプルですが、活かせるポイントがいくつかあると考えます。

・口コミやユーザーの声を聞く（どういう部分で選ばれているのか）
・選ばれている部分＝自分の商品の優位性
・市場の流れや外的要因を言い訳にしない


この記事の完全版は、著者が運営するメディア「ぬるぺでぃあ」で読むことができます（記事は[コチラ](https://miuradonuts.com/2023/06/25/input-001/)）
![](https://miuradonuts.com/wp-content/uploads/2023/06/ヘッダーエリア画像作成.png)