OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel8.4】composer create-project laravelでエラーが出たときの解決方法

#GitBashにコマンドを打ったらエラーが出た。

```
composer create-project laravel/laravel="8.4.*" laravel
```

##エラー文
```
  Problem 1
    - laravel/framework[v8.12.0, ..., 8.x-dev] require league/flysystem ^1.1 -> satisfiable by league/flysystem[1.1.0, ..., 1.x-dev].
    - league/flysystem[1.1.0, ..., 1.x-dev] require ext-fileinfo * -> it is missing from your system. Install or enable PHP's fileinfo extension.
    - Root composer.json requires laravel/framework ^8.12 -> satisfiable by laravel/framework[v8.12.0, ..., 8.x-dev].
```

##解決策

### php.iniを開き、`Ctrl F` → 「fileinfo」で検索
::: note warn
composerをインストールする時にphp.exeを指定するが、そのフォルダにあるphp.ini
:::

```
;extension=fileinfo
```

アンコメントします。

```
extension=fileinfo
```

::: note warn
fileinfoで検索ヒットしなかった場合、php.iniに↑を追記してください。
:::

##コマンドを再度実行する
```
composer create-project laravel/laravel="8.4.*" laravel
```
私の環境ではうまくいきました。
Error: Permission denied　解決策

## コードとエラー
**サンプルコード**

```
brew install ......
````
**エラー**

```
Error: Permission denied @ apply2files - /usr/local/lib/docker/cli-plugins
```


## 対策

```
sudo chown -R $(whoami) $(brew --prefix)/*
```

## 原因
調査中で、
現状わかっていること

- ``chown``
    - ファイルまたはディレクトリの所有者、グループを変更する。ただし、所属するグループしか変更できない。
- ``whoami``
    - 　現在（自分自身）のユーザー名を表示。(whoamiをターミナルで実行すると確認できます)
- 　$(whoami)
    - 　ユーザ名が表示される
- 　 brew --prefix
    - 　 ディレクトリを表示する(ターミナルで実行すると/usr/local)
- 　 $(brew --prefix)/*
    - 　 /usr/local/*となる
 
### コマンドの意味

つまりコマンドは、以下のようになります。

```
sudo chown -R 現在のユーザ名 /usr/local/*
```
macOS版DiscordやOBSでオーディオIFを通じて音声の入出力ができない問題の解決法

# 概要
- macOS版のDiscordやOBS等の音声入出力があるアプリで、入出力デバイスに多ch入出力できるオーディオIFを指定しても、**音声の取得ができない場合**、あるいは、**そもそも入出力デバイスの選択肢に、接続しているはずのオーディオIFが出てこない場合**の解決法を記載します。
- 元々自分用のメモとしてまとめたものを記事化したため、認識が誤っている点や全く別の解決法があるかもしれないので、その際はコメントなどでご指摘いただけると幸いです。

# 結論
- 仮想オーディオデバイス（と仮想ミキサー）を使うことで解決できます。
![基本構成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17245/bb8bbe23-e2b3-1981-9dbe-1f0b8f67ed9d.png)

# 原因
- macOS版のDiscordやOBSでは、1/2chの音声だけを入出力するデバイス、あるいは1/2ch分を独立して選択できるようなデバイスでないと、音声が正しく取得できなかったり、認識できなかったりするらしいです。

# 大まかな解決イメージ
- 例えば、オーディオIFの3/4chにマイク音声を入力し、7/8chでMacの内部音声をイヤホンで聞いている環境があったとしたら、以下のように仮想オーディオデバイスを間に挟んだルーティングを設定すれば解決できます。
　- Discordの例：
![Discord利用時の解決イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17245/13241b65-97d4-ca8b-3447-4320c9124368.png)

　- マイク音声とMacの内部音声をOBSに入力する例：
![OBS利用時の解決イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17245/7fc43270-b496-849e-fad0-e4484dce12ab.png)

　- マイク音声だけをDiscordに入力し、マイク音声とMacの内部音声をMixしたものと、Discordの音声出力をOBSに入力する例：![DiscordとOBS利用時の解決イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17245/8726f6c9-363d-649b-a1a7-4723f03bddec.png)
（後述するLoopbackを使うとこのような自由度の高いルーティングも簡単にできます。BlackHoleやSoundflowerでも仮想オーディオデバイスをもう一つ増やすことで実現できるかもしれないですが未検証です。）


# 仮想オーディオデバイス(+仮想ミキサー)の主な選択肢
- **a**. <a href="https://rogueamoeba.com/loopback/">Loopback</a>（有料）
- **b**. <a href="https://github.com/ExistentialAudio/BlackHole">BlackHole</a> + <a href="https://apps.apple.com/jp/app/ladiocast/id411213048">LadioCast</a>（無料）
- **c**. <a href="https://github.com/mattingalls/Soundflower">Soundflower</a> + <a href="https://apps.apple.com/jp/app/ladiocast/id411213048">LadioCast</a>（無料）
　- SoundflowerはM1チップMacは非対応です。
- **d**. <a href="https://eqmac.app/">eqMac Basic</a>（無料）
　- Discordの音声出力をオーディオIFで正常に取得するだけであれば、eqMacを起動してBypassさせるだけで解決できます（本記事末尾の画像参照）。ただし、eqMacは基本的にイコライザ用途のアプリなので、LoopbackやLadioCastのようにルーティングを設定することはできません。

#### おすすめはLoopback
- 有料アプリ（買い切り）ではありますが、Loopbackがあれば音声ルーティングに困ることはまず無くなるほど、自由度の高い設定ができるのでおすすめです。
- Loopbackが他の仮想オーディオデバイスよりも良い点は以下の通りです。
　- ルーティング設定時に出力デバイスの指定だけでなく、そのchまで指定でき、UIも非常にわかりやすい。
　- Macの内部音声を入力側に使いたい場合、起動しているアプリごとに出力音量やON/OFFを設定できる。
　- 仮想オーディオデバイスの追加がUI上で簡単にでき、わざわざAudio MIDI設定アプリで"機器セットを作成"する必要がない。

# 具体的な設定例
- 以下のデバイスを使用しているMac環境で、LoopbackまたはeqMacを使ってDiscordの音声出力を取得する場合の各アプリの設定例を以下に記載します。
　- 音声入力：USBマイク（RØDE NT-USB）
　- 音声出力：オーディオIF（RME Fireface UCX II）

![設定例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17245/b17a1b2b-9f03-3b53-56f1-7099fc9d0009.png)
Symbolブロックチェーンのノードに確実に接続する方法


Symbolブロックチェーンでノードに確実に接続する方法を紹介します。
ランダムで選択したノードに対し、接続に失敗すれば別のノードへの接続を試みます。
同時にWebSocketでlistenerクラスを確立し、切断されれば再接続を試みます。

# ライブラリインポート

ブラウザの開発者コンソールから以下のスクリプトを実行して検証環境を構築します。

```js
(script = document.createElement('script')).src = 'https://xembook.github.io/xembook/xembook_config.js';
document.getElementsByTagName('head')[0].appendChild(script);

(script = document.createElement('script')).src = 'https://code.jquery.com/jquery-3.3.1.min.js';
document.getElementsByTagName('head')[0].appendChild(script);

(script = document.createElement('script')).src = 'https://xembook.github.io/nem2-browserify/symbol-sdk-pack-1.0.3.js';
document.getElementsByTagName('head')[0].appendChild(script);
```

jQueryを利用します。ajaxにタイムアウト機能があるので有効活用します。
ノードリストはxembookリポジトリのxembook_config.jsに定義しています。

# ノード接続

以下のスクリプトでノード接続とリスナーの確立を行います。

```js

var nodelist = NODES;
var listener;

sym = require("/node_modules/symbol-sdk");

function connectNode(nodes,d){

	const node = nodes[Math.floor(Math.random() * nodes.length)] ;
	$.ajax({url:  node + "/node/health" ,type: 'GET',timeout: 1000})
	.then(res => {
		console.log(res);
		if(res.status.apiNode == "up" && res.status.db == "up"){
			console.log(node);
			return d.resolve(node);
		}
		return connectNode(nodes,d);
	})
	.catch(res =>connectNode(nodes,d));
	return d.promise();
}

async function createRepo(d2,nodes){

	const d = $.Deferred();
	const node = await connectNode(nodes,d);
	const repo = new sym.RepositoryFactoryHttp(node);
	const nsRepo = repo.createNamespaceRepository();

	try{
		if(listener === undefined){
			const wsEndpoint = node.replace('http', 'ws') + "/ws";
			listenerKeepOpening(wsEndpoint,nsRepo);
		}
		d2.resolve(repo);

	}catch(error){
		console.log(error);
		createRepo(d2,nodes);
	}
	return d2.promise();
}

isWebsocketSupported = false;
function listenerKeepOpening(wsEndpoint,nsRepo){

	listener = new sym.Listener(wsEndpoint,nsRepo,WebSocket);
//	await listener.open();
	listener.open().then(() => {
    isWebsocketSupported = true;
    console.log(wsEndpoint);
		listener.newBlock();
	});

	listener.webSocket.onclose = async function(){
		console.log("listener onclose");
    if(!isWebsocketSupported){
      console.log("websocket no supported.")
    }else{
        listenerKeepOpening(wsEndpoint,nsRepo);
    }
  }
}

var repo;
(async() =>{

	const d2 = $.Deferred();
	repo = await createRepo(d2,nodelist);
})();

```
【React】問い合わせフォームの作り方【入門】

## はじめに
　本記事は、プログラミングの学習を始めて1ヶ月の初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

##React 入門

###Reactとは
Facebook社（現 Meta Platforms）が開発したUIパーツを構築するためのJavaScriptライブラリです。

###問い合わせフォームの作成
以下のように記述することで問い合わせフォームを作成することができます。

```ContactForm.js
import React from 'react';

class ContactForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      isSubmitted: false,
      email: '',
      hasEmailError: false,
      content: '',
      hasContentError: false,
    };
  }

  handleEmailChange(event) {
    const inputValue = event.target.value;
    const isEmpty = inputValue === '';
    this.setState({
      email: inputValue,
      hasEmailError: isEmpty,
    });
  }

  handleContentChange(event) {
    const inputValue = event.target.value;
    const isEmpty = inputValue === '';
    this.setState({
      content: inputValue,
      hasContentError: isEmpty,
    });
  }

  handleSubmit() {
    this.setState({isSubmitted: true});
  }

  render() {
    let emailErrorText;
    if (this.state.hasEmailError) {
      emailErrorText = (
        <p className='contact-message-error'>
          メールアドレスを入力してください
        </p>
      );
    }

    let contentErrorText;
    
    if (this.state.hasContentError) {
      contentErrorText = (
        <p className='contact-message-error'>
          お問い合わせ内容を入力してください
        </p>
      )
    }
    
    let contactForm;
    if (this.state.isSubmitted) {
      contactForm = (
        <div className='contact-submit-message'>
          送信完了
        </div>
      );
    } else {
      contactForm = (
        <form onSubmit={() => {this.handleSubmit()}} >
          <p>メールアドレス（必須）</p>
          <input
            value={this.state.email}
            onChange={(event) => {this.handleEmailChange(event)}}
          />
          {emailErrorText}
          <p>お問い合わせ内容（必須）</p>
          <textarea
            value={this.state.content}
            onChange={(event) => {this.handleContentChange(event)}}
          />
          {contentErrorText}
          
          <input
            type='submit'
            value='送信'
          />
        </form>
      );
    }
    
    return (
      <div className='contact-form'>
        {contactForm}
      </div>
    );
  }
}

export default ContactForm;

```
[Macでkeras]sslでインポートできない時

## 問題のコードと結果
**コード**

```python
from tensorflow.keras.datasets import mnist
```
**結果**

```
Exception: URL fetch failure on https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz: None -- [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)
```

## 原因
> macOSに標準でインストールされているOpenSSLが古すぎるため、Python 3.6以降ではmacOS用のインストーラーにはOpenSSLが同梱され、システムのOpenSSLは参照されなくなりました。
>
>これによって、OSにインストールされたルート証明書も参照されず、インストール直後の状態ではルート証明書が含まれていません1。このため、TLSサーバー証明書の検証に失敗します。

引用: [macOS用公式インストーラーのPython 3.6でCERTIFICATE_VERIFY_FAILEDとなる問題](https://qiita.com/orangain/items/0a641d980019fd7e0c52)
## 対策

1. opensslをインストール

```
brew install openssl
```

2. ルート証明書を参照可能にする

certifiモジュールをダウンロード

```
pip3 install certifi
```
pythonのバージョンを確認する。

```python
python3 --version
## 私は3.8でした
```
ルート証明書を参照可能にする
pythonのバージョンを以下のコマンド中に記入して実行

```
/Applications/Python\ 3.8/Install\ Certificates.command
```

```
ls -l /Library/Frameworks/Python.framework/Versions/3.8/etc/openssl/
```

## Permission deniedでopensslがインストールできないとき
- [Error: Permission denied　解決策](https://qiita.com/kaito_111/items/bcbe019dbf9b9409963f)
ASUSのPCでWindows11に更新時、0xc1900101 エラーになる場合の対処法

**おことわり**
何も保証できませんので、あくまで一例です

# 現象
ASUS のPC（ROG系）で Windows11の要件を満たしており、
ダウンロード＆インストールが実行できる状態で

実際に実行すると、インストール時に **0xc1900101** のエラーが出て更新が完了しない

場合の対処法。

# 環境
`ROG Flow X13 GV301QH` ですが
`ROG Zephyrus G14` のユーザーの方も同様の症状・対処方法で更新できたとのことです。

# 対処法

デバイスマネージャー
→ システムデバイス
→ **ASUS System Control Interface v3**
→ デバイスのアンインストール
→ デバイスドライバーの削除にチェックを入れて実行
→ 再起動後、Windows11の更新を再実行

# 補足
MyASUSアプリ関連のドライバーが原因だったようです。

Windows11更新完了後に再度確認したところデバイスドライバーは復活しており、
MyASUSも特に問題なく使用できているようです。
バッチファイル(.bat)で簡単にポモドーロアラーム作成！

#目的
生産性と集中力が上がることで知られているポモドーロテクニック、是非とも仕事で使ってみたい！
でも、仕事場でスマホのアラームは使いずらい。。。
そんな人を対象に、Windows標準機能のコマンドプロンプトで動くbatファイルを使って
ポモドーロアラームを簡単に作るための記事。

#コード
キーとなるコマンドは以下２つ
◯ timeout；指定時間待機する。
◯ msg；メッセージを表示
## プログラムサンプル
```bat:pomodoro.bat
@echo off

rem ** 任意設定 ** 
rem min:分, finMsg:終了メッセージ, enabledBeep:終了時にビープ音を鳴らすか(true/false)
set min=25 
set finMsg="1セット終了！"
set enabledBeep=true

rem ** ポモドーロプログラム **
set /a sec=%min%*60
timeout /t %sec% /nobreak

if %enabledBeep% equ true (
    rundll32 user32.dll,MessageBeep
)

msg %USERNAME% %finMsg%

pause
```
※UTF-8 だと日本語が文字化けする。Shift-JISで実行すること。

#実際に使ってみた感想
ポモドーロテクニックの役割は十分満たせているが、
作業開始時にプログラムを起動し忘れたり、作業に集中しすぎて休憩しなかったり...
別の問題が発生してしまっている。

# Windows Script Host(余談)
記事作成過程で、jsのような書き方でコマンドプロンプト上で実行できるものがあることを知りました。
batファイルだと書きにくいし、複雑な処理に向かないのでいろいろ使い方を試行錯誤したい。
express & ejs & TypeScript にBootStrapを導入する

bootstrapをインストール

```console.log
yarn add bootstrap
```

`express-generater`で作られるapp.jsをTypeScript化した`app.ts`にて、下準備。

```ts:app.ts
import express, { RequestHandler } from 'express';

// 略

// ejsファイル内でbootstrapを "bootstrap/css/bootstrap.min.css" などのパスで読み込めるようにする
app.use('/bootstrap', express.static(path.join(__dirname, '../node_modules/bootstrap/dist')) as RequestHandler);
```

ejsファイルにてbootstrapを読み込む

```ejs:views/index.ejs
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" /> 
    </head>
    <body>
        <div class="container">
            <h1 class="text-primary">Hello World</h1>
        </div>
        <script src="bootstrap/js/bootstrap.min.js"></script>
    </body>
</html>
```
firebase clouud messaging v9.6.1をCRAにおけるバッググラウンド通知で使うコード例

# 背景
CRA(Createe React Appp)からcloud messagingを使う方法が難しすぎたのでまとめておく。
すぐに情報が出てこないので結構役に立つはず・・・。

# 結論
public ディレクトリへ以下を配置して終わり。
能動的な登録処理は不要。firebaseでgetToken等を呼出したタイミングで処理される。

```firebase-messaging-sw.js
importScripts('https://www.gstatic.com/firebasejs/9.6.1/firebase-app-compat.js')
importScripts('https://www.gstatic.com/firebasejs/9.6.1/firebase-messaging-compat.js')
const app =
    firebase.initializeApp({
// firebase からコピーした設定値を転記
    });
const messaging = firebase.messaging(app);
messaging.onBackgroundMessage(payload => {
    console.log('[firebase-messaging-sw.js] Received background message ', payload);
    // Customize notification here
    const notificationTitle = payload.notification?.title;
    const notificationOptions = {
        body: payload.notification?.body,
        icon: payload.notification?.image
    };
    console.log(`firebase onBackgroundMessage.`)
    return self.registration.showNotification(notificationTitle, notificationOptions)
})
```

# ServiceWorker（firebase-messaging-sw.js）から出した例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87538/14cd33d1-afa0-0a54-0c71-93efcd203d88.png)

※Firebase コンソールからメッセージ送信。

# アプリ本体から出した例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87538/08fd2964-7bc1-3413-a957-daf6afe96131.png)

※こちらは、Webアプリコードの中で、onMessageの実装は必要。なお、Webアプリ側は、SWとは違い、firebseは、v9系のモジュラーを利用。
※実際には、アプリタブを表示した状態で、スマホからコンソール経由でメッセージ送信。

# 調査環境
|OS|Ubuntu 20.04 LTS|
|:---|:----|
|Browser|Chrome 96.0.4664.110|
|Firebase App| v9.6.1-compat|
|Firebase Messaging| v9.6.1-compat|


# 調査結果
## firebase-messaging-sw.jsから、v9系のモジュラーが読み込めない
対処方法が分からず・・・。
compatの互換スクリプトを読み込んで対処できることが分かったため、こちらに倒した。
互換スクリプトは、v8系なので、そちらのドキュメントを参照。

[[Document] firebase.messaging v8](https://firebase.google.com/docs/reference/js/v8/firebase.messaging)
/*Java入門*/ Hello Worldをプリントすることから見るJava言語の基本特徴

# JavaでHello Worldをプリントする
ソースコード：

```Java:HelloWorld.java
public class HelloWorld { // クラス名とソースコードファイル名は同名とする
	public static void main(String[] args) { // Javaはmainメソッドをプログラムの起点とする
		System.out.println("Hello World!"); // 標準出力はSystem.outで表現される
	}
}
```

実行結果：

```zsh:
% javac HelloWorld.java # クラスファイルにコンパイラ
% java HelloWorld # クラスファイルを解釈し実行
Hello World!
```
# この例から見るJavaの基本特徴
##完全にオブジェクト指向(object-oriented)
Javaはオブジェクト指向を前提としたプログラミング言語で、手続き型プログラミング(procedural programming)をサポートしないです。
=> Javaはすべての処理にクラスが必要です。
=> Hello Worldをプリントすることだけでもあるクラスに含めないといけないです。

同じくオブジェクト指向言語であるC++は、手続き型プログラミングもサポートしているのでクラスなしでHello Worldをプリントすることができます：

```C++:hello.cpp
#include<iostream>

int main() { // C++もmainメソッドをプログラムの起点とする
	std::cout << "Hello World!" << std::endl; // C++はcin, coutでデータを入出力する
	return 0;
}
```

実行結果：

```zsh:
% g++ hello.cpp -o hey # 実行ファイルにコンパイラ
% ./hey # 実行ファイルを実行
Hello World!
```

##プラットフォーム非依存(platform-independent) / Write Once Run Anywhere
Java言語はコンパイラ(compiler)とインタプリタ(interpreter)両者をサポートしています。
Javaプログラムを作成して実行するまでの流れは以下になります：

1. ソースコード(.javaファイル)を作成する
1. Javaコンパイラ(javac)でコンパイルしてクラスファイル(.classファウル)を生成する
1. インタプリタ(JVM, Java Virtual Machine)でクラスファイルを解釈して実行する

ここのクラスファイルはバイトコード(byte code)で、OSに依存しなくてどこでも実行できる特性を持っています。
ReactとNode.jsでログイン処理を実現するために行ったこと

こんばんは。初めての投稿になります。

今回は、JavaScriptのlocalStrageというAPIを使用してログイン処理を実現したため、実際に行ったことを書いていきたいと思います。

【実際に行ったこと】
1.ログイン画面から任意のデータをサーバ側(Node.js)に送信し、サーバ側でログイン認証処理を行う。ログインできた場合、200レスポンスを返す。

2.クライアント側(React)にログインOKのレスポンスが返ってこない場合は何もしない。帰ってきた場合はlocalStrage APIを用いて次のように値をセットする。私は"Login"という値と、該当ユーザのIDをセットしました。
![スクリーンショット 2022-01-10 223722.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677365/9b87a70f-6d6e-c829-9bbe-4f06a8e77d71.png)

3.クライアント側にlocalStrageに'Login'が入っている場合はログイン状態を保持し、'Login'以外の値が入っているまたは何も入っていない場合は保持しない処理を記述する。
![スクリーンショット 2022-01-10 224135.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677365/3408c030-e20b-911d-7daa-f763012a39f8.png)

簡易的な方法ではありますが、これでブラウザを再読み込みしようが、ページを離れようが、ログイン状態が維持されます。cookieとは違い、localStrageは一度データが保存されると消去しない限り消えないためその点は注意してください。

以上です。
clangdで別ディレクトリのヘッダーを指定したい

# はじめに
こんにちは。最近vimを使い始めたvimmer見習いのsudoです。
正確にはneovimを使っています。
LSPクライアントはcoc-nvim、C/C++を書くときのLSPはclangdを使用しています。
LSPを導入することによってコードを書く際に補完やエラーの表示が可能になり、vimを便利エディターにすることができます。

# 発生した問題
#### C言語/C++を書くときにヘッダーファイルを別ディレクトリに入れた場合にヘッダーがfile not foundになる。
例えば、ディレクトリ構造、ファイルの中身が以下のようになっていた場合を想定します。

```sh
.
├── Makefile
├── includes
│   └── test.h
└── srcs
    └── main.c

```

```c:main.c
#include "test.h"

int main()
{
	printf("hogehoge--");
}
```

```:test.h
#ifndef TEST_H
#define TEST_H
#include <printf.h>
#endif
```

このとき、何もしないと下の画像のように`test.h`がfile not foundになってしまいます。
![Screen Shot 2021-12-30 at 23.46.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1595354/30a86832-db85-7347-1747-560677f1be23.png)

# 解決方法
#### compile_flags.txtというファイルを作成する
プロジェクトの一番上の階層(上のファイルツリーだとMakefileと同じ階層)に`compile_flags.txt`もしくは`compile_commands.json`というファイルを作成してコンパイルオプションを指定することによって解決しました。

```:compile_flags.txt
-I./includes/
```
たぶん`compile_flags.txt`の方が書くのが楽そうです。
参考: https://uchan.hateblo.jp/entry/2018/12/29/104132

# さいごに
毎回手動で記述するのも面倒なので、Makefileから`compile_flags.txt`を自動生成するコマンドを作りたいと思いました。いつか。
vimは楽しいですが、周りに使っている人が少ないので何か問題が発生したときに気軽に聞けないのがデメリットだと個人的に思っています。

## 追記
[compiledb](https://github.com/nickdiego/compiledb)を使用するとMakefileからcompile_comamnds.jsonを自動生成してくれました。
viエディタでの編集

viエディタはUNIX系のOSに最初からインストールされているテキストエディタ。
例としてRailsアプリのGemfileをviエディタを用いて編集してみます。


```:ターミナル
$ vi Gemfile
```

するとターミナルにGemfileの中身が表示されます。以下のように開いたら成功です。

```:ターミナル
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.6.8'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails', branch: 'main'
gem 'rails', '~> 6.1.3', '>= 6.1.3.1'

# Use Puma as the app server
gem 'puma', '~> 5.0'
# Use SCSS for stylesheets
...
（省略）
...
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
gem 'rails-i18n'
gem 'kaminari'

```


###文字を挿入・削除する場合
`i`を入力して入力モードに切り替えます。（この時カーソルはどこに位置していても問題ないです）
↓
挿入したい場合は目的の箇所にカーソルを持って行って入力する
削除したい場合は目的の箇所にカーソルを持って行ってBackspaceキーを押す
↓
編集が完了したら`escキー`を押す
↓
`:wq`を入力して編集したファイルを保存する


###以上。
以上です。viエディタで検索するといっぱいコマンド出てくるしよく慣れないしで最初はすごく慎重にやってましたが、本当に基本的な操作はこれで十分かと思います。
h→カーソルを左
j→カーソルを下
k→カーソルを上
l→カーソルを右
っていつ使うんじゃい！
Bash スクリプトが逐次読込されている件の詳細

> [bash スクリプトの実行中上書き動作について](https://zenn.dev/mattn/articles/5af86b61004bdc)
> このパーサは fgets(2) で読み込まれつつ実行される為、一括でファイルが読み込まれている訳ではない。

普通の `fgets` の実装ならまとまった単位でバッファに `read` してそのバッファから 1 行ごとに返るだろうので、ファイルサイズが大きくなければ一括で読まれることになるのでは・・？

と思っていたところ下記を見まして、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">いや、違うな。スクリプトファイルが変更されてなくても、外部コマンドを実行するたびにその位置まで seek して読み直してるのか。面白いことしてるなぁ。</p>&mdash; とみたまさひろ🍣🍺 (@tmtms) <a href="https://twitter.com/tmtms/status/1476056779973083136?ref_src=twsrc%5Etfw">December 29, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

実際に `strace` してみるとそのような挙動になっていたので、興味本位で Bash のソースを探って見ました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">input.c の sync_buffered_stream の中のこの辺で lseek していそうだけれどもそれ以上のことはわからない<a href="https://t.co/VDEC3UapJQ">https://t.co/VDEC3UapJQ</a></p>&mdash; ngyuki@育児休業 (@ngyuki) <a href="https://twitter.com/ngyuki/status/1476178233049882624?ref_src=twsrc%5Etfw">December 29, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Bash のソースは `bash-5.1.8.tar.gz` です。

## スクリプトの読み込み

スクリプトの読み込みは `input.c` の `with_input_from_buffered_stream` で、`init_yy_io` に設定している `buffered_getchar` で行われています。最終的にこれは `lib/sh/zread.c` の `zread` によって `read(2)` が呼ばれます。

```c
while ((r = read (fd, buf, len)) < 0 && errno == EINTR)
{
    // ...snip...
}
```

`len` の最初のサイズは `input.c` の `fd_to_buffered_stream` で次のように決められています。

```c
if (fstat (fd, &sb) < 0)
{
    // ...snip...
}
size = (fd_is_seekable (fd)) ? min (sb.st_size, MAX_INPUT_BUFFER_SIZE) : 1;
if (size == 0)
  size = 1;
```

ファイルがシーク可能ならファイルサイズと `MAX_INPUT_BUFFER_SIZE=8172` の小さい方、シーク不可なら 1 です。

シーク不可となるのは例えばプロセス置換のパイプです。`bash <(cat a.sh)` などとすると 1 バイトずつ `read` されます。これは `strace` ですぐ確認できます。

```sh
strace -e trace=read bash <(cat a.sh)
```

一方、普通のファイルならシーク可能なので、ファイルサイズが 8172 以下なら一括でまとめて `read` されます。

だとすれば実行中のスクリプトを上書きしても（スクリプトが 8172 バイト以下なら）問題なさそうですけど・・？

## 外部コマンド実行時のシーク

Bash が外部コマンドを実行するため（`execute_cmd.c` の `execute_command`）に子プロセスを作成するとき（`jobs.c` の `make_child`）、それに先立ってスクリプトのオフセットを実行しようとしているコマンドの直後の位置に `lseek(2)` で戻しています。

これは `input.c` の `sync_buffered_stream` で行われています。

```c
chars_left = bp->b_used - bp->b_inputp;
if (chars_left)
  lseek (bp->b_fd, -chars_left, SEEK_CUR);
bp->b_used = bp->b_inputp = 0;
```

例えば次のようなスクリプトの場合、

```sh
/bin/echo 1
/bin/echo 2
/bin/echo 3
```

最初にファイル全体が `read` されますが、その後 `/bin/echo 1` の直後まで `lseek` で戻り、次は改めてその位置から `read` されます。

この動作は外部コマンドを呼ぶときだけで、次のようにビルドインの `echo` だとこの `lseek` は発生しません。

```sh
echo 1
echo 2
echo 3
```

例えば、次のスクリプトは最初の1行目を実行した時点でスクリプトの内容が空になった後、改めて2行目を読もうとして読めなくて、その結果なにも表示されません。

```sh
/bin/echo -n >a.sh
echo ok
```

ですが次のスクリプトだとシークが発生せず、最初にファイルが一括で読まれた内容で実行されるため `ok` が表示されます。

```sh
echo -n >a.sh
echo ok
```

## さいごに

Bash が何故そんな動作をしているのかは謎。意図的に実行中の自身を上書きできるようにしているのかと思ったけれども、それだとビルドインコマンドが対象外なのが謎ですし、謎。
[Jupyter][pandas][display]計算途中の纏め表を簡単にリアルタイム表示する

#はじめに
最近Bertのfine tuneとかで計算を回してるんですが、
計算途中の途中経過を表で簡単に表示できないかなと思い
やってみたら案外簡単に出来たので投げてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993677/973e3147-6929-f5fc-bfb4-c1f4a3e9f550.png)
↑こういうの

#コード
インポートします

```
from IPython.display import display
import pandas as pd
import time
```
前準備します

```
cols = ['Step','結果1','結果2','結果3']
df = pd.DataFrame(index=None,columns=cols)
```

計算時に結果を逐次与えて、表示をアップデートします


```
out = display(df, display_id=True)

for i in range(10):
    record = pd.Series([i,i**1,i**2,i**3],index=df.columns)
    df = df.append(record,ignore_index = True)
    out.update(df)
    time.sleep(1)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993677/aa4c03fa-3530-9cbb-4091-9e18016abbc9.png)
time.sleep()を入れているので1秒毎に表が更新されます

out = display(...)の所で初期表示され
out.update(df)の所で表示が更新されます

以上です

#おわりに
標準的なライブラリだけで割とあっさり欲しい物が出来てちょっと気にいったので書いてみました
参考になれば幸いです
徳丸基礎試験 - WriteUp

# 前置き

2021年12月29日、[ウェブ・セキュリティ基礎試験（通称：徳丸基礎試験）](https://www.phpexam.jp/tokumarubasic/)に合格しました。
いつも書いているCTFのWriteUpの感覚で、受験に際してのあれこれを残しておこうと思います。

これから受験する方の参考になれば、幸いです。

# 徳丸基礎試験とは

正式名称は「ウェブ・セキュリティ基礎試験」で、通称は「徳丸基礎試験」。
文字通り、ウェブセキュリティの基礎を問う試験となっています。

なお、公式は通称を使ってますが、試験会場では正式名称を使っていました。
そのため、試験監督などに「徳丸基礎」と言っても通じないかもしれません。ご注意ください。

# 勉強方法

https://qiita.com/sano1202/items/a3d451bedd3371e4850b

こちらの記事を大いに参考にさせていただきました。

具体的には、徳丸本の内容をScrapBoxにまとめ、理解の浅い箇所や読み飛ばしていた内容をさらに深堀したり、ScrapBoxに記載した内容について、自分でも内容を追記していきました。

※ScrapBoxの存在をこの時初めて知りました。自分の知識がネットワーク化されて、理解の整理整頓するのに素晴らしく、内容をブラッシュアップして定着させるのに非常に貢献してくれました。

なお、私は前提として、普段CTFに挑戦していたり、前職で脆弱性診断、前々職でSEを経験していた事もあり、[徳丸本](https://www.amazon.co.jp/%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6-%E5%AE%89%E5%85%A8%E3%81%AAWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E7%AC%AC2%E7%89%88-%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%82%8B%E5%8E%9F%E7%90%86%E3%81%A8%E5%AF%BE%E7%AD%96%E3%81%AE%E5%AE%9F%E8%B7%B5-%E5%BE%B3%E4%B8%B8/dp/4797393165/ref=sr_1_1?adgrpid=104140741625&gclid=CjwKCAiAzrWOBhBjEiwAq85QZ4rbxuQhbcxII9uqMERRAMYMsfh9gRYKMP1tIU8yXBmhvxWWzOMsnhoCWwgQAvD_BwE&hvadid=553964797364&hvdev=c&hvlocphy=1009340&hvnetw=g&hvqmt=e&hvrand=16999407421875335084&hvtargid=kwd-333264991654&hydadcr=16033_13486747&jp-ad-ap=0&keywords=%E5%BE%B3%E4%B8%B8%E6%9C%AC&qid=1640872841&sr=8-1)の内容をある程度理解していたこともあり、実機演習はほとんど動かしませんでした。

脆弱性診断の経験などのバックグラウンドの無い方は、実機演習にキチンと取り組む事で、より理解・定着に繋げる方が良いかと思います。

それと、他の方に話す・説明するイメージで、図示していくと理解が深まります。

# 試験について

点数は1000点満点中の800点でした。
ただ、満点のセクションがいくつもあったため、もっと[徳丸本](https://www.amazon.co.jp/%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6-%E5%AE%89%E5%85%A8%E3%81%AAWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E7%AC%AC2%E7%89%88-%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%82%8B%E5%8E%9F%E7%90%86%E3%81%A8%E5%AF%BE%E7%AD%96%E3%81%AE%E5%AE%9F%E8%B7%B5-%E5%BE%B3%E4%B8%B8/dp/4797393165/ref=sr_1_1?adgrpid=104140741625&gclid=CjwKCAiAzrWOBhBjEiwAq85QZ4rbxuQhbcxII9uqMERRAMYMsfh9gRYKMP1tIU8yXBmhvxWWzOMsnhoCWwgQAvD_BwE&hvadid=553964797364&hvdev=c&hvlocphy=1009340&hvnetw=g&hvqmt=e&hvrand=16999407421875335084&hvtargid=kwd-333264991654&hydadcr=16033_13486747&jp-ad-ap=0&keywords=%E5%BE%B3%E4%B8%B8%E6%9C%AC&qid=1640872841&sr=8-1)を読み込んでおけば、満点もいけたかもしれません。
ちょっと悔しい・・・

試験の内容についての不満は一切ないですが、試験会場の環境が、会場によってはあまり良くないかもしれない事にご注意ください。
私の場合は、マシンがものすごく眩しい状態、かつ画面にかなり近づく必要がある座席であったため、目がﾁｶﾁｶしてました･･･

# 再試験キャンペーン

今（2021年11月1日（火）～2022年3月31日（木））なら、オデッセイ テスティング センター有楽町店または横浜店で受験すると、再試験が無料になるキャンペーンが実施されています。
会場は限定されますが、このキャンペーンを利用する事で、一度気軽に徳丸基礎試験を受験してみるのはいかがでしょうか？

以下に、公式情報を載せておきます。

https://otc.odyssey-com.co.jp/news/20211101.html

# 最後に、重要そうなことをメモ

1. 徳丸本は第2版を使うこと！
2. 第3章の正確な理解！
3. ３大脆弱性についての正確な理解！
3. 実機演習したり、図に書いたりして、より理解を深める！
3. 再試験キャンペーンは、2022年3月31日まで！会場は限定されているので注意！
【Rails × Vue】本番環境で画像が読み込めないエラー対応

AWSにデプロイしたRailsとVueで作成したポートフォリオにおいて画像が表示されないエラーが発生し、解決したのでその方法です。

#修正前のディレクトリツリー

```
original_app
|
|--app
|  |
|  |--assets
|     |
|     |--images
|        |    
|        |--img1.svg
|
|--src
   |
   |--pages
      |
      |--Home.vue #このコンポーネントでimg1.svgを読み込みたい
```

```Home.vue

<template>
  <img src="/assets/img1.svg">
</template>

```

開発環境だとing1.svgを読み込めたが本番環境だとうまくいかなかった。

#原因
通常のrailsアプリであればviewファイルに/assets/画像ファイルと書けばassets以下のimagesフォルダからファイルを探してきてくれるがVueのファイルはjavascriptなのでそのような動作をしてくれなくなる。

#修正後のディレクトリツリー

```
original_app
|
|--app 
|
|--src
   |
   |--assets #追加
   |  |
   |  |--img1.svg
   |
   |
   |--pages
      |
      |--Home.vue #このコンポーネントでimg1.svgを読み込みたい
```

```Home.vue

<template>
  <img src="../assets/img1.svg">
</template>

```

画像ファイルをvueファイルをまとめているフォルダ内に収納してし、直接参照できるようにしてしまう。
Microsoft Intuneでブラウザ（Edge、Chrome、Firefox）のパスワードの記憶を無効にする

# はじめに
社内のセキュリティールールやISMSやPマークなどの認証を取得するためにブラウザでパスワードを保存することを禁止している場合があると思います。
Microsoft Intune を利用することで主要ブラウザ（Edge、Chrome、Firefox）でパスワードの記憶を強制的に無効にすることができます。

# 前提
- Microsoft Intune にデバイスが登録されていること。
 - 登録方法としては Azue AD に参加（Azure AD joined）するか、Intune に直接登録するかの2通りの方法があります。 

Intune は単品で￥650/月/ユーザー、Microsot 365 E3などにも含まれています。（2021/12/30時点）

https://docs.microsoft.com/ja-jp/mem/intune/fundamentals/licenses

# 設定方法
## Edge
Edgeの場合は、構成プロファイルの「管理用テンプレート」から設定できます。
管理用テンプレートの作成方法はWebにいろいろあるので割愛します。例えば、Microsoft公式だと以下です。

https://docs.microsoft.com/ja-jp/mem/intune/configuration/administrative-templates-windows

プロファイルの構成設定で「ユーザーの構成」 > 「Microsoft Edge」 > 「パスワードマネージャーと保護」 > 「パスワード マネージャーへのパスワードの保存を有効にする」を有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/4c2d6fa7-d174-fc50-c1ed-b65b588de8f0.png)
設定をすると「パスワードの保存を提案」が無効になり、変更できなくなります。ブリーフケースのマークは組織（Intune）によって強制されていることを表しています。
![edge-password-scrnshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/82a754be-258a-305f-ce38-21a1da1ab6fe.png)

## Chrome
公式から構成プロファイル作成手順が公開されているので、「手順 2: Intune で Chrome ポリシーを設定する」の設定値だけ記述します。

https://support.google.com/chrome/a/answer/9102677?hl=ja

以下の行を追加します。
名前：任意
OMA-URI：./Device/Vendor/MSFT/Policy/Config/Chrome~Policy~googlechrome~PasswordManage
r/PasswordManagerEnabled
データ型：文字列
値：\<disabled/\>
![google-pwd-enabled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/61983a0b-e818-d10f-96a1-46dd1b9a297b.png)
設定をすると「パスワードを保存できるようにする」が無効になり、変更できなくなります。ビルのようなマークは組織（Intune）によって強制されていることを表しています。
![chrome-password-scrnshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/1a862fbd-158b-363d-f1de-daeea91d17cc.png)

## Firefox
公式から構成プロファイル作成手順が公開されています。

https://support.mozilla.org/en-US/kb/managing-firefox-intune

以下の行を追加します。
名前：任意
OMA-URI：./Device/Vendor/MSFT/Policy/Config/Firefox~Policy~firefox/PasswordManagerEna
bled
データ型：文字列
値：\<disabled/\>
![firefox-pwd-enabled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/33aed2cc-5f96-4b64-8d8a-22e7ebdcbe94.png)
設定をすると「ウェブサイトのログイン情報とパスワードを保存する(R)」が無効になり、変更できなくなります。
![firefox-password-scrnshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/9d1584d4-717e-fe1a-2753-2f102aacb157.png)
Power BI: Forms 分析用のカスタムコネクターを作ってみた

# 背景
元々は会社内でアンケートの解析で Forms の Excel を解析しなければいけないってのが嫌だった。
ある時、Forms API の存在を知った。
Power Automate で取得出来ることを知った。
Power BI でカスタムコネクターが会社でも使えることに気付いた。＜ダメだと思っていた。

ってことで、作ればいいじゃんってことで作ってみたので公開

# すぐ使ってみたい人用の使い方
## まずはダウンロード
https://github.com/baku2san/PQExtensionFormsAPI/blob/main/PQExtensionFormsAPI/bin/Release/PQExtensionFormsAPI.mez

## カスタムコネクター認識フォルダーへ保存
以下で多分行ける筈。

> %userprofile%\ドキュメント\Power BI Desktop\Custom Connectors

## Power BI を（再）起動して、今回のコネクターを探す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f9cc289e-5763-c713-5083-265084aa96c5.png)


## 以下が出るので「続行」（詳細省略）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/5b9a699c-704f-992c-083b-80262f8522db.png)

不安な場合は、GitHub からコードをダウンロードして、中身を確認してからにしてください。

## Forms の URL をコピーして貼り付けして、「OK」
"FormId" を含んだURLであれば、なんでもOKな筈
※"FormId=([^&]+)" を探して利用してるので、URLじゃなくてもOKですが・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/ed972846-765c-0e2c-dab3-6d8ef698286e.png)

## あとは煮るなり焼くなり

1. テーブル変換
1. 展開
1. [answers] に回答が JSON 形式で入ってるので、さらにそこを分析

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/57638b86-5f28-b858-05f7-a594e19fe779.png)

# GitHub で公開
https://github.com/baku2san/PQExtensionFormsAPI

# Forms API について
https://qiita.com/baku2san/items/47c8ad906e01d7e5d5b9

:::note warn
上でも書いたけれど、現状利用している odata 系の API が廃止される可能性もあるのでその際は、light 系へ
:::

# 公開関数について
正規表現のとか一緒に公開してるだけなので、不要な人は削除してもらうのが吉

# アイコン
ここのを利用させてもらっています。

https://icons8.jp/icon/9jxu4jSVTcEc/microsoft-forms-2019

# 困ったこと
## ダイアログをどうやって出すの？
https://github.com/Microsoft/DataConnectors/tree/master/samples/HelloWorldWithDocs

こいつで出してた方法を参考に

> shared PQExtensionFormsAPI.Contents = Value.ReplaceType(PQExtensionFormsAPIImpl, PQExtensionFormsAPIType);

こんな感じで、Impl, Type を実装して変換してやると出せるって理解した・・けど・・なんかもっと簡単な方法がありそう・・（未調査

## FormsAPI への認証
https://github.com/microsoft/DataConnectors/blob/master/docs/m-extensions.md

ここら辺をみて以下に例を記述

https://qiita.com/baku2san/items/47c8ad906e01d7e5d5b9#power-query-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%81%A7

## Visual Studio で開発なのに、break points は無いの？
無さそうなので諦め

https://www.pbiusergroup.com/communities/community-home/digestviewer/viewthread?MessageKey=71ba536a-c67c-45b4-8c6b-c56e5ec03269&CommunityKey=b35c8468-2fd8-4e1a-8429-322c39fe7110&tab=digestviewer

# Icons
png で保存されてて、それを置換すればいいんだけど・・
プロジェクト生成すると、80pix の画像があるんだけど、参照されてない。

以下を見ても、記述がないので、Project Template のミスと認識

https://github.com/microsoft/DataConnectors/blob/master/docs/m-extensions.md#publish-to-ui

## その他
https://qiita.com/baku2san/items/5dda4a35138522e66c9c

# あとがき
GitHub が Access Token 化されてて Push 出来なくて焦りました。
SourceTree だと簡単に OAuth で繋げたのでそのまま行けるかと思いきや、保存してある Basic 認証のパスワードを Access Token として利用されるとは思ってなかった・・。

# keyword

release Microsoft Forms custom data connector for Power BI
dateコマンドで、前月・当月・翌月の初日と最終日の取得

# はじめに

月次処理だと、前月・翌月の1日や、その月の最後の日が、必要になることがよくあります。
dateコマンドでそれらを取得する方法のまとめです。

過去記事の派生です。

https://qiita.com/n_slender/items/fe01d8f5e8fb318c6817

## 当月

### 1日

これはフォーマットで日付部分を01にすればよいです。

```terminal
$ date +%Y%m01" 
```
### 末日

「翌月の1日からマイナス１日」で取得します。
dateコマンドは、日付文字列を受け取れるので、それを利用します。

```terminal
$ date -d "$(date '+%Y%m01') 1 month 1 day ago" "+%Y%m%d"
```

## 前月

### 1日

「当月の1日から１ヶ月前」でいけます。

```terminal
$ date -d "$(date '+%Y%m01') 1 month ago" "+%Y%m%d" 
```

### 末日

```terminal
$ date -d "$(date '+%Y%m01') 1 day ago" "+%Y%m%d"
```

## 翌月

### 1日

```terminal
$ date -d "$(date '+%Y%m01') 1 month " "+%Y%m%d" 
```

### 末日

```terminal
$ date -d "$(date '+%Y%m01') 2 month 1 day ago" "+%Y%m%d"
```

# まとめと補足

みてのとおり、Nヶ月後、N日後であれば、 N month, N day　を追加、マイナスなら、 agoをつければいいです。
フォーマットをかえれば、年月のところだけ取り出せます。

```terminal
$ date "+%Y%m"                          
202112
```


また、Nヶ月後、Nヶ月前を取得した場合は、日付は1日にしてから、その操作をするといいです。

やるとわかるのですが、日付部分が翌月には存在しないとき（29,30,31日）に、1 monthをやると、繰り上げ的なことがされて、プラス一ヶ月とはならないです。

```terminal
$ date -d "20210130 1 month" "+%Y%m%d"
20210302
```
rails generateコマンドまとめ

<h2>rails generateコマンド</h2>
<h3>モデルの作成</h3>
<h4>コマンド</h4>

```
rails generate model 名前 [カラム名:型[:index]..] [オプション]
```
<h4>結果</h4>

```
invoke  active_record
create    db/migrate/20211230082754_create_<名前>s.rb
create    app/models/<名前>.rb
invoke    test_unit
create      test/models/<名前>_test.rb
create      test/fixtures/<名前>s.yml
```

<h4>参考</h4>
<a href="https://railsdoc.com/page/rails_generate_model">Railsドキュメント</a>

---

<h3>コントローラーの作成</h3>
<h4>コマンド</h4>

```
rails generate controller 名前 [アクション名..] [オプション]
```
<h4>結果</h4>

```
create  app/controllers/<名前>_controller.rb
 route  get '<名前>/new'
invoke  erb
create    app/views/<名前>
create    app/views/<名前>/new.html.erb
invoke  test_unit
create    test/controllers/<名前>_controller_test.rb
invoke  helper
create    app/helpers/<名前>_helper.rb
invoke    test_unit
invoke  assets
invoke    scss
create      app/assets/stylesheets/<名前>.scss
```
<h4>参考</h4>
<a href="https://railsdoc.com/page/rails_generate_controller">Railsドキュメント</a>

<h3>メイラーの追加</h3>
<h4>コマンド</h4>

```
rails generate mailer 名前 [アクション名..] [オプション]
```
<h4>結果</h4>

```
create  app/mailers/<名前>.rb
 invoke  erb
create    app/views/<名前>
create    app/views/<名前>/password_setting.text.erb
create    app/views/<名前>/password_setting.html.erb
invoke  test_unit
create    test/mailers/<名前>_test.rb
create    test/mailers/previews/<名前>_preview.rb
```
<h4>参考</h4>
<a href="#">Railsドキュメント</a>

<h3>統合テストの追加</h3>
<h4>コマンド</h4>

```
rails generate integration_test 名前
```
<h4>結果</h4>

```
invoke  test_unit
create    test/integration/register_employee_test.rb
```
<h4>参考</h4>
<a href="#">Railsドキュメント</a>

<h3></h3>
<h4>コマンド</h4>

```
```
<h4>結果</h4>

```
```
<h4>参考</h4>
<a href="#">Railsドキュメント</a>

<h3></h3>
<h4>コマンド</h4>

```
```
<h4>結果</h4>

```
```
<h4>参考</h4>
<a href="#">Railsドキュメント</a>

<h3></h3>
<h4>コマンド</h4>

```
```
<h4>結果</h4>

```
```
<h4>参考</h4>
<a href="#">Railsドキュメント</a>

<h3></h3>
<h4>コマンド</h4>

```
```
<h4>結果</h4>

```
```
<h4>参考</h4>
<a href="#">Railsドキュメント</a>
powershellでもファイル名修正


すごく詳しく記載ある。
後方の名前修正の場合はうまく以下なったので参考にさせていただきました。
https://catovis.com/archives/419

```
Get-ChildItem -File | ForEach-Object {Rename-Item $_  ($_.BaseName + "極限20991010" + $_.Extension)}
```
AWSのAssociate試験の試験官言語を英語にしたら凄く良かった

# 概要
AWSの試験の試験官の言語を英語にして受けたら良かったので、その内容を書いていく。
**Solution Architect Associate**と**Developer Associate**の2回受けた経験に基づいた記述。

# なぜ英語は良いのか？
AWSの資格試験はPearson Vueからオンライン試験で受けられるのだが、試験官の言語を日本語にすると結構予約枠がない。だいたい一週間後以降くらいに1枠ある感じだったと思う。**英語だと、前日でも潤沢に枠があって、朝から深夜まで40枠くらいから選びたい放題**なので、学習を進めてもう受けてもいいかなと思えた段階で**次の日の試験を予約をして、忘れないうちに臨むことができる。**

# 英語にして困りそうなポイント
## 本人確認書類にローマ字記載がない
試験の30分前にチェックインをすると、PCのシステムテストをした後に、本人確認書類のアップロードをする必要がある。ここで運転免許証などの写真をアップロードするのだが、当然、免許証に記載の氏名は日本語表記。
試験登録の際の言語はローマ字で登録していたので、名前の照合できるのかと不安になったが、[本人確認書類について](https://www.pearsonvue.co.jp/Test-takers/Tutorial/Identification-2.aspx)の以下の記載の通り、特に問題は発生しなかった。
> ※ 登録氏名がローマ字で確認書類が日本語、または逆の場合は、読み合わせで一致を確認します。

## 試験開始前の試験官の確認内容
試験官は基本的にインド人らしく、インドなまりがひどい。2回とも分かりにくい英語だった。
だが、聞かれた内容はほぼ同じで、以下の内容。  

- PCを動かして机の全景を映すこと(おそらく、カンニングペーパーとかないことの確認)
- 長袖の服の袖をまくって、手首を見せること(おそらく、手首に文字書いてないか、電子機器を装着していないかの確認)

わからない場合は、 **I'm sorry?** とか、 **Say it again?** とか言えば良い。本当に通じなくて困ったらチャットボックスに書いてくれるだろうから、焦らないこと。あちらは毎日やってて指示が通じない場面にも慣れているはずだから気にしなくて良い。

以下のページに記載の内容が聞かれると思っておけば良いだろう。
https://home.pearsonvue.com/aws/onvue?ot=collapse541

> - You may be subject to additional potential inspections, including the following:
>   - A proctor may ask you to show your ears if you have hair that covers your ears, for the purpose of verifying that no Bluetooth devices are present.
>   - A proctor may ask you to roll up your sleeves to verify that you have no writing on your arms.
>   - A proctor may ask you to empty your pockets for the purpose of ensuring nothing is in them.
>   - A proctor may ask you to complete a full 360-degree room scan either during check-in or during your exam.


## 試験中のコミュニケーション
問題行動をしていなければ特に生じない。1度だけ、悩んでいるときに口元に手がいってしまって、その際には口元から手をどけるように指示を受けた。

以下のページに記載の内容に違反しないようにすれば良いだろう。
https://home.pearsonvue.com/aws/onvue?ot=collapse541

> Proctors will monitor you for suspicious movement during the duration of your exam. Please do not read the questions aloud and do not cover your mouth or attempt to hide your face or move it out of view of the webcam.

# まとめ
Pearson Vueのオンライン試験で、試験官の言語を英語にすると、前日でも試験予約ができるのでとても良い。
英語にあまり抵抗がないなら是非そちらで。
Laravel をherokuにデプロイして、Group byしたらMySqlから「isn't in GROUP BY」って怒られた話

## 事象
apiのクエリ実行で以下のエラーが発生した。

```
message: "SQLSTATE[42000]: Syntax error or access violation: 1055
 '<database name>' isn't in GROUP BY 
```

## 原因
config/database.phpで設定されている、「strict = true」。

## 解決内容
config/database.phpの` 'mysql'` 内にある、`'strict' => true,` を `'strict' => false,` に変更でMysqlに怒られなくなった。

## 参考URL
- [Laravelでgroup byしたら、"~ isn't in GROUP BY (~)"って怒られました](https://arm4.hatenablog.com/entry/2019/01/11/184734)
- [Laravel's groupBy() not working](https://laracasts.com/discuss/channels/laravel/laravels-groupby-not-working?page=1&replyId=716108)
ファイル名変換バッチ

powershellで作ろうとしたけど
色々あり、いったんバッチで回避。



```

rem バッチ処理を表示しない
@echo off
rem 文字コードをUTF-8にする

chcp 65001
 
rem 日付の取得
set dateStr=%date%
set formatDate=%dateStr:/=%
 
 
'''
rem ファイル名の先頭に挿入する文字列を生成
set delimiter=_
set head="極限20202011"
set kaku=".txt"
 
rem subラベル以下の処理を毎回呼び出す
rem %%fは、バッチの中の変数の意味
rem カレントディレクトリの中の「.txt」で検索
rem for文の中で関数を読んでいる。
rem 

for %%f in (*.txt) do call :sub "%%f"
exit /b
 
rem ファイル名を変換する処理をサブルーチン化
:sub
rename %1 %1%head%%kaku%
goto :EOF

```

https://naokixtechnology.net/windows/1687

https://qiita.com/plcherrim/items/67be34bab1fdf3fb87f9

https://nayutari.com/batch-utf8
RxSwift(RxCocoa)のBehaviorRelayとPublishRelayについて

##はじめに

私事ですが現在個人開発を進めていまして、その中でRxSwiftを積極的に採用しています。
RxSwift自体はだいぶ触っていなかったので、過去を思い出しつつ少しまとめの記事を書こうと思います。

##Relayとは

さて、Rxswiftではデータバインディングのために手段として**Relay**というものがあります。
これはObservableの一種で、.nextだけ流すことができます。
.nextイベントを流すためにはacceptメソッドを使います。
**言い換えると.errorや.completedは流れることはないということです。**
（.errorや.completedを流したいのであればSubjectを使います。）

具体的には以下の二つあります。

`BehaviorRelay`
`PublishRelay`

VariableはRxSwift4.0.0からBehaviorRelayに代替する形で廃止されました。

##Relayの使い道

UIとモデルをバインドして変化を伝えたい時

##両者の違い

BehaviorRelay

```Swift
let behaviorRelay = BehaviorRelay<String>(value: a)
 
behaviorRelay.subscribe { event in
    print(event)
}.disposed(by: disposeBag)
 
behaviorRelay.accept(b)
behaviorRelay.accept(c)
behaviorRelay.accept(d)
 
// 実行結果
// next(a)
// next(b)
// next(c)
// next(d)
```

PublishRelay

```Swift

let publishRelay = PublishRelay<String>()
 
publishRelay.subscribe { event in
    print(event)
}.disposed(by: disposeBag)
 
publishRelay.accept(a)
publishRelay.accept(b)
publishRelay.accept(c)
 
// 実行結果
// next(a)
// next(b)
// next(c)
```

両者の違いを以下にまとめました。

|  | BehaviorRelay | PublishRelay |
|:-----------:|:------------:|:------------:|
| .next       |  ✅     | ❌      |
| 初期値       |  ✅     | ❌      |
| value       |  ✅     | ❌      |
| 現在値を流すか|  ✅      | ❌      |

特に大きな違いは値を保持するかしないかの違いと言えます。
BehaviorRelayの方はsubscribeやbindした時に現在値が流れるのでデータを保持したいのであればBehaviorRelay、
そうでなければPublishRelayを使用するのが適切であると思います。


##終わりに

本記事は今年最後に執筆にあたるかなと思います。最後まで読んでくださいましてありがとうございました。
来年はさらなる飛躍と成長を実現する一年にしていきたいと思います。
CSVデータをGoogleMapに表示する方法

まずは、Googleマップにアクセスして、左上のタブをクリックしてメニューを開きます。
![備忘録_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152045/846883c2-766d-3541-9a7f-e5e24da7a966.png)

開いたメニューから「マイプレイス」をクリックします。
![備忘録_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152045/61f352ca-3ae4-27d9-69f8-0d9e596a04ac.png)

「地図を作成」をクリックします。
![備忘録_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152045/412116fd-d733-7a87-f15a-1942d1845dd8.png)

「インポート」をクリックします。
![備忘録_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152045/ad5bdbdd-385d-0be2-0388-082025e384a8.png)

読み込みたいcsvを選択します。
ローカルもしくはGoogleドライブからファイルを選択できます。
![備忘録_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152045/f41dcb1f-856e-a404-60c5-6ca9e0135a6b.png)

ここでどの列名の値を基に地図に配置するかを選択します。
今回例で用いているデータには「緯度」「経度」の列があるので、それを選択します。
![備忘録_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152045/f9816d08-82bd-e778-17c7-1698d6e78058.png)

マーカーのタイトルを選択します。
例では「山名」を選択しています。
![備忘録_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152045/7a2a11a7-4c92-0a17-db90-c469060f250c.png)

無事表示できました。
![備忘録_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152045/c985490b-9e13-e608-b7c1-c1b380c19a92.png)

今回は、国土地理院で公開されている日本の山リストをスクレイピングして作成したcsvを表示してみました。
国土地理院 日本の山リスト
https://www.gsi.go.jp/kihonjohochousa/kihonjohochousa41140.html
証明書ファイル変換ではまった話


REST apiをpythonのrequestsで叩く際に、クライアント認証が必要でしたが、
クライアント認証に使う証明書ファイル作成ではまりました。

数ヶ月前の話なので、結構適当に書きます。


##環境

OS: windows 10

## 経緯
1. サーバ管理者から証明書インストール手順書と、証明書ファイルが送られてくる。
2. 手順書に従い、証明書をインストール？する。（用語が適切かわかりません）
3. OpenSSL を使ってpfxファイル（証明書）をクライアント認証で使えるpemファイル（証明書情報が平文で入ってる）に変換する。

-> ここではまりました。よくわからないエラーが出てて原因が分かりませんでした。
　（確か変換できません？みたいなやつだったかと....)

## 原因
原因は、手順書に記載の方法だと,pfxファイル生成時にエクスポートを禁止してしまうためでした。
下画像の状態。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685097/1c96df72-aabe-3deb-7184-5d4827b22abb.png)

回避策は簡単で、「このキーのエクスポート可能にする」のチェックボックスをチェックして、
pfxファイルを生成した後OpenSSL でpemファイルに変換するだけです。
Ruby on Railsのcloud9環境の設定手順

<h1>Rails Tutorialより</h1>
<h6>Rubyドキュメントをスキップする設定を.gemrcファイルに追加するコマンド</h6>

```
echo "gem: --no-document" >> ~/.gemrc
```
<h6>Rails gemのインストール（今回は6.1.4を使用）</h6>
<a href="https://openstandia.jp/oss_info/rubyonrails/version/">Railsバージョンアップ情報</a>

```
gem install rails -v バージョン番号
```
<h6>bundler gemのインストール（今回は2.2.17を使用）</h6>

```
gem install bundler -v バージョン番号
```
<h6>Yarnのインストール、セットアップ</h6>

```
source <(curl -sL https://cdn.learnenough.com/resize)
source <(curl -sL https://cdn.learnenough.com/yarn_install)
```
<h6>ローカルWebサーバーへの接続の許可</h6>
config/environments/development.rb

```
Rails.application.configure do
  .
  .
  .
  # Cloud9 への接続を許可する
  config.hosts.clear
end
```
<h6>Gemfileの設定＋bundleの実行</h6>
参考記事：<a href="https://qiita.com/morioka1206/items/19410fe414f441583998">Gemfileにバージョンを指定したり、しなかったり。Gemfileについて</a>

```
# production環境でしか使わないgemはインストールしないよう設定
bundle _2.2.17_ config set --local without 'production'  

bundle _2.2.17_ install
```
<h6>webpacherのインストール</h6>

```
rails webpacker:install
```
<h6>Gitの操作</h6>
Gitの設定

```
git config --global user.name "自分の名前"
git config --global user.email your.email@example.com

# パスワードの再入力をしなくていい時間を設定
git config --global credential.helper "cache --timeout=86400" 

# エイリアスメソッドを設定
git config --global alias.<エイリアス名> コマンド
```
Githubへの初めてのプッシュ

```
git init
git add -A
git commmit -m "<コメント>"
git remote add origin <uri>
git push -u origin master
```
Electronの <webview> でTwitterなどが表示されない問題

# 問題

```html
<webview src="https://twitter.com/" id="webview"></webview>
```

InstagramやGoogleMeetなども開けなかったです。

# 解決
GitHubのissuesにこんな問題発生してるよーってたくさんありました！
で、その中の解決法を見つけたので共有

https://github.com/electron/electron/issues/25469#issuecomment-720719462

これですね

メインプロセスの`main.js`に追加します

```js:main.js
app.commandLine.appendSwitch('disable-features', 'CrossOriginOpenerPolicy')
```

できました

[CrossOriginOpenerPolicy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Opener-Policy)をdisableしてるんでしょうね。間違ってたらごめんなさい。
NVIDIA Nsight Graphicsの不具合のような挙動

# はじめに
不具合かもしれませんが, まだ確証はありません. １日無駄にしたためノートだけとっておきます.

## 環境

| | |
|:--- | :--- |
| NVIDIA Nsight Graphics | 2021.5.10 |
| GPU | Geforce 2080 |
| Driver | 497.29 |

# 現象

Nsight GraphicsのFrame Debugger上で, ディスクリプタ記述子の指すGPUメモリの内容が逆転している, 指すアドレスが逆転しているように見えます.
![nsight_graphics00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27065/0ef3f06a-43d1-4844-8ea9-4ddaac304c55.jpeg)

コンスタントバッファビューの4と6の内容が入れ替わります.
![nsight_graphics02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27065/a61b5095-cf47-8936-4913-4810d7fff677.jpeg)

描画は正しいため, どちらが正しいかはわかりません. ドライバの不具合であったり, DirectX 12の仕様を私が勘違いしていてドライバの不具合と合わせて偶然正しい描画であったり.

# まとめ
この原因追及は, 他のシステムや条件でテストするときなので, ノートだけで放置します, 単純に私の設定が間違っている可能性もありますし.
PIXやRenderDocと比較するのも手ですが, どちらにしても後回しです.
Discord人狼のやり方

##参加方法
![スクリーンショット 2021-12-30 152616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449613/f5f8257a-2c32-37e1-17ff-d754ec6b1c52.png)
まずこの表示がでたら参加と送信しましょう
![スクリーンショット 2021-12-30 152625.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449613/b13454d7-aa99-b286-e075-12aa226a3a55.png)
![スクリーンショット 2021-12-30 152637.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449613/b6856605-2a49-84cd-be33-01622215433c.png)

このような返答が返ってきます。そしたらゲームが始まるまで待ちましょう。
![スクリーンショット 2021-12-30 152705.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449613/de9726bd-eb9b-f3ea-7a84-fa01ca9e2659.png)
##ゲーム開始
ゲームが始まると自分専用のチャンネルが作られます。ここではコマンドを実行したり運営に質問するのがよいでしょう。
##役職
![スクリーンショット 2021-12-30 152720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449613/29b5ca5c-ccc6-409b-1208-01bd2bf57ca8.png)
全体に上のような画像が張られたら、自分のチャンネルで希望の役職コマンドを送信しましょう。
(例)希望→占い師
![スクリーンショット 2021-12-30 152808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449613/26afcc4f-7432-6e10-dfed-ef34385f376a.png)
役職が上のように通知されるので役職が確認出来たらなんでもいいので送信しましょう。
##話し合いとか
![スクリーンショット 2021-12-30 153012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449613/5fcb98dd-12c7-c314-98a1-2f71eb6be351.png)
あとは夜の時間が終わるまで待ちましょう。

昼の時間では全体で誰が怪しいか話し合います。CO等して話し合いましょう。

##投票
![スクリーンショット 2021-12-30 153919.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449613/dd36f078-6fad-85ca-e452-7a8c880579cc.png)
このような表示がでたら自分のチャンネルに戻りましょう。
![スクリーンショット 2021-12-30 153936.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449613/7c04173f-2bb6-80d7-ae4c-26b52709192f.png)
投票コマンドは
投票→人の名前
になります。投票時間が終わったら投票結果が全体で開票されます。

##夜の時間
夜の時間は役職の作業をします。占い師なら占い、人狼なら食う人を決める、狩人ならまもるひとを決める。
コマンドは多すぎて書くのは無理なので割愛します

あとは　話し合いとか～夜の時間　をループします。

#ポイント割り当て
ランク戦得点一覧
正の特典
殺害につき+10p
生存+20p
陣営勝利+10p
引き分け+5p
第三陣営得点+100p
パン配達得点+10p/day
負の特典
死亡-5p
陣営敗北-5p
同陣営殺害-10p 
ペナルティ
途中抜け-30p
スクショ-20p
暴言一言に尽き-10p
犯罪行為-999p
規約違反-100p 
カジュアル戦
ランク戦の得点計算で最も点の高い方に+50p

参加してれば参加するほどポイントが上がる仕組みになっています。

##さいごに
むっちゃおもしろいので参加しましょう。
【新卒就活】私がプログラマーではなくSEを選んだ2つの理由

# はじめに
今回は、新卒就活を控えている大学生および大学院生の方に向けた記事になります。
さて、あなたはプログラマーになりますか？
それとも、SEになりますか？
この選択は、あなたにとって、大きな人生の分かれ道になるでしょう。
私がSEになった理由を紹介することで、あなたの判断の一助となれば幸いです。

# 私の経歴
詳しくは、Linkedinのプロフィールをご覧ください。
はじめに勉強したプログラミング言語は、大学の講義で学んだCとJAVAでした。
しかし、「習得した」とはお世辞にも言えません。
（週1回90分講義＋宿題10分）×12回（全講義）×2回（春学期・秋学期）=2400分（40時間）
当然ながら、40時間でプログラミングができるようにはならないでしょう。

大学4年生の3月からベンチャー企業でプログラマーとして働くようになりました。
そこで、1年半に渡り、Python、C++、C#、PHP、JavaScriptなどの様々なプログラミング言語で開発経験を積みました。
長期インターンシップという形でしたが、1年目が約800時間、2年目が約850時間勤務しました。
その後、大学院1年生の7月に就職活動を理由に退職しました。

所謂、リーダー経験は、それなりにあります。
大学以前は、生活委員会学年代表（中学）、学級委員（中学）などを務めました。
大学時代は、音楽サークルの代表、ボランティア団体の代表を務めました。
前述したインターンシップでは、学生インターンを束ね、PMを経験しました。


# プログラマーではなくSEを選んだ理由
ここからは、本題のSEを選んだ理由について説明していきます。

## ①好きな業務
1つ目は、自分の好きな業務は何かということです。
**プログラミングが好きならば、プログラマーになればよいでしょう。**
**コンサルティングやマネジメント、リーダーシップが好きならば、SEになればよいでしょう。**
1日8時間週5日勤務するわけですから、私はこの観点が最も強力な理由になると考えています。

今回は、私の主観でプログラマーとSEの業務の好きなところと嫌いなところをお話します。
（プログラミングとコンサルティング・マネジメント・リーダーシップの好き嫌い）

**<プログラミングの好きなところ>**

- ソースコードが正常に動いたときに嬉しい
- 解決方法をひらめいたときに気持ちがいい

**<プログラミングの嫌いなところ>**

- ひらめきと論理的思考を必要とする点が数学の問題を解いているようで飽き飽きする
- 期限内にできないときにストレス（胸が詰まる感じ）を感じる

**<コンサルティング・マネジメント・リーダーシップの好きなところ>**

- 人に何かを教える、人から相談を受けることが好き（コンサルティング）
- 人を教育する、モチベートさせる、管理システムをつくることが楽しい（マネジメント）
- 「見えないもの」を手に入れようとすることにワクワクする（リーダーシップ）

**<コンサルティング・マネジメント・リーダーシップの嫌いなところ>**

- 相性の悪い人とも協力しなければないといった対人関係のストレス
- マネジメントでは、チームのために頑張ることは当たり前、失敗だけは責められる

あなたはどのような業務が好きですか？
しっかりと自己分析して、どのような業務が好きなのか考えてみましょう。

## ②出世しやすい職種

2つ目は、出世のしやすさに関する観点です。
こういったギラギラした話は面接ではできませんでしたが、キャリアを考えるにあたっては考慮した点です。

私は、SIer企業に就職することになりました。
それにあたって、OB訪問した際に、SIer企業においては、開発（プログラマー）よりもSEの方が昇進しやすいという話を聞きました。
この理由として、SEの方が**「プロジェクトを前進させる力（推進力）」**があるからだそうです。
管理職になると、**人を動かして結果を出す**ことが求められるからでしょう。
そのような観点で、SEの方が昇進しやすいのではないでしょうか。

ちなみに、私は大企業を志望したのですが、その理由は**「個人の裁量」**よりも**「社会への影響力」**を重視したからです。
だからこそ、私にとっては、出世というキーワードが重要になりました。

プログラマー志望の方は、インターネット企業の選考をたくさん受けられると思います。
私も何社か選考を受けましたが、現在は、ずっとプログラミングをしていくキャリアと、管理職になるキャリアの2つが用意されているケースが多いと感じました。
**インターネット企業は2000年以降に誕生した企業が多く、ほとんどの社員が40歳以下の若い従業員であることから、どのようなキャリアを歩めばよいのか、先例が多くない状況です。**


あなたがどのようなキャリアを歩んでいきたいのか、30歳以降の自分を想像しながら、考えてみましょう。

# まとめ
私がプログラマーではなくSEを選んだ理由は2つあります。
1つ目は、プログラミングよりも、コンサルティング・マネジメント・リーダーシップに関する仕事の方が好きだからです。
2つ目は、SIer企業においては、SEの方が出世がしやすいという話を聞いたからです。
**自分の人生の責任は自分にある**ので、あなたの価値観から最善の進路を選びましょう。