OmniAICreator/Qiita-1.07M huggingface dataset:
Miroのボードは無料版だと全世界に公開される？

## はじめに

先日、[Miro はまず何から始めたらいいのか？](https://qiita.com/tamaday/items/091116a575278bc1441e)でご紹介した、オンラインホワイトボードツール[「Miro」](https://miro.com/ja/)には大きく利用プランが 3 つ存在します。
無料の「Free」、有料の「Starter」と「Business」の 3 種類です。

公式サイトで 3 つのプランを比較していると、気になる文言が…
それは、有料プラン「Starter」に記載されている「非公開ボードを使用して、コンテンツにアクセスできるユーザーを管理」の一文…

![freeMiroPublic_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/95f9ce91-03b4-0672-4e67-3f6799506dbe.png)

もしかして、無料プランではオンライン上に公開されているのか？と疑問に思い実際に調べてみました。

結論としては、もちろん無料プランでもオンライン上に公開はされていません。
ただし設定によっては公開されてしまうので、注意が必要です。

それでは「非公開ボードを使用して、コンテンツにアクセスできるユーザーを管理」とは何なのか？

本記事では、Miro のアクセス制限について無料版と有料版（Starter）の違いをご紹介します。
ちなみに筆者は有料プラン「Starter」に加入しています！

## Miro のボードを非公開にする方法

まずはボードの右上の「共有」をクリックします。（画像１）
そして「リンクを知る全員が」を「アクセス不可」に設定します（画像２）
これで仮にボードの URL が知られてしまっても、ボードが見られてしまうことはありません。（画像３）

（画像１）
![freeMiroPublic_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/80f841b7-7625-aa3c-a828-678dfa5702be.png)

（画像２）
![freeMiroPublic_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/5de34e29-ad5b-3df6-1202-f72404a336a6.png)

（画像３）
![freeMiroPublic_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/47ddd6c5-a828-087d-cb6f-1750c7b91936.png)

## 有料プラン「Starter」で設定できるアクセス権限とは？

これはチームとして複数人でボードを作成する際に有用な機能かと思います。

というのも、実は無料プランですとメンバーとして招待され、チームになった人同士ではアクセス制限をすることができません。（画像４）
つまり、同じチーム内ではボードが全て公開されてしまいます。

（画像４）
![freeMiroPublic_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/9b98c00a-37b7-0549-5bdb-cbceb39c95fb.png)

一方有料プランですと、同じチーム内であったとしてもアクセス制限ができ、完全な非公開ボードを作成することが可能です。
もちろんアクセスできるユーザーを個別に設定することも可能です。

これが冒頭に疑問に思っていた、有料プランの機能の一つ「非公開ボードを使用して、コンテンツにアクセスできるユーザーを管理」の詳細です。

## 公式サイト

Miro[（公式サイト）](https://miro.com/ja/)

ご参考になれば幸いです。最後までお読み頂きありがとうございます。

## 関連した投稿

[Miroはまず何から始めたらいいのか？](https://qiita.com/tamaday/items/091116a575278bc1441e)
[Miroでシステム化要件【画面イメージ／画面レイアウト】](https://qiita.com/tamaday/items/b46413b5620849c89b08)
[Miroでシステム化要件【動く画面遷移図】](https://qiita.com/tamaday/items/94af9158e79eec21a71e)
[Miroでファイルをエクスポートする方法](https://qiita.com/tamaday/items/cd3bfd4cb1a15360fe63)
Vue.jsでレンダリングパフォーマンス改善

データの件数が増えてくるとページの読み込み処理等が遅くなってしまい、大切なユーザー体験が低下してしまいます。
 この記事ではVue.jsに特化してレンダリングパフォーマンスを向上させる方法を「[Vue.js入門 基礎から実践アプリケーション開発まで](https://www.amazon.co.jp/Vue-js%E5%85%A5%E9%96%80-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E5%AE%9F%E8%B7%B5%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E3%81%BE%E3%81%A7-%E5%B7%9D%E5%8F%A3-%E5%92%8C%E4%B9%9F/dp/4297100916)」を参考に紹介します。

## v-if & v-showを使い分ける
 v-if / v-showはture/falseで要素の表示・非表示を可能にしますが、v-ifは条件によって要素を削除し、v-showは要素を残しつつ非表示にする違いがあります。
	
- v-if : 条件によって表示/非表示を切り替える必要がある場合に最適
    - 要素が true の場合にのみレンダリング
    - 要素が false の場合は、DOM から完全に削除
- v-show: 条件によって表示/非表示を切り替える必要があるが、要素が頻繁に切り替わる場合に最適
    - 要素が true の場合にも、false の場合にも常にレンダリング
    - 要素が false の場合は、CSS の `display: none` によって非表示

## 算出プロパティとウォッチャを使い分ける
テンプレートのレンダリングでは、メソッドよりも算出プロパティの方をなるべく使用するべきです。
   
- 算出プロパティ : 依存しているデータが変更された場合にのみ再計算される
- メソッド : 呼び出されるたびに毎回計算される
	
ただし、以下の場合は算出プロパティではなく、ウォッチャを使用すべきです。
 - ループのような処理コストが高い
 - 非同期が伴う
 - 算出プロパティの依存データが複数ある場合、すべてのデータの変更を検知することができない

## v-forによるリストのレンダリングではkey属性を利用する
   Vue.jsのループでは以下のように一意なkey属性を使用すべきです。
 ```html
  <template>
	<ul> 
		<li v-for="item in items" :key="item.id">
			{{item.name}}
		</li>
	</ul>
  </template>
 ```
  key属性を使う理由は以下の３つです。
   -   要素の追加や削除などの変更があった場合に、Vueはkey属性を使用して、変更が起きた要素だけを再描画することができる
   -  要素が追加や削除された場合に、新しい要素と古い要素を比較し、古い要素を削除し、新しい要素を追加するといった処理を行う必要があります。key属性を使用することで、Vueは要素を一意に識別することができる
   -  v-forを使用した際に、一意のkeyがない場合、Vueは要素のインデックスを使用して要素を一意に識別するが、インデックスによる識別は要素の順番が変わった場合に、多くの要素が再描画される可能性があるため、パフォーマンス面でもkey属性を使用することが望ましい。


## v-onceでコンポーネントのコンテンツをキャッシュする
  v-onceは、要素やコンポーネントのコンテンツを一度だけレンダリングし、その後は再描画を行わないようにできます。
      毎回同じ内容のデータを表示する場合はv-onceを使いましょう

```html
<template> 
	<div> 
		<p v-once>{{ message }}</p> 
	</div> 
</template>
<script>
export default {
  data() {
    return {
      message: 'Hello, Vue.js'
    }
  },
}
</script>
```

## 関数型コンポーネントを利用する
   以下が関数型コンポーネントとオブジェクト型コンポーネントの違いです。データを保持したり、ライフサイクルメソッドを使用する必要がある場合は、オブジェクト型のコンポーネントを使った方がいいので、場合によります。
   
   - 関数型コンポーネント
	   - Vueインスタンスを生成しないため、メモリ使用量が少なく、レンダリング速度も速い
	   - コンポーネントのインスタンスを生成しないため、状態の保存やライフサイクルメソッドの処理が不要
   - オブジェクト型のコンポーネント
	   - Vueインスタンスを生成するため、メモリ使用量は関数型コンポーネントより多くなる
	   - ステートを持つことができるため、データを保持したり、ライフサイクルメソッドを使用することができる

## おわりに
 動けばOKからユーザーが少しでも使いやすいと思えるプロダクトにするためにパフォーマンス向上の方法をもっと知りたいと思ったのでこれからも得た知識を発信していきます！
 ではまた！

### 参考
- ChatGPT
- [Vue.js入門 基礎から実践アプリケーション開発まで](https://www.amazon.co.jp/Vue-js%E5%85%A5%E9%96%80-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E5%AE%9F%E8%B7%B5%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E3%81%BE%E3%81%A7-%E5%B7%9D%E5%8F%A3-%E5%92%8C%E4%B9%9F/dp/4297100916)
【Java基礎】文字列を表示させる

［問題］　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksBasic.html)
実行するとHello worldと表示するプログラムを作成しなさい。


# コード
```Java
public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println("Hello world");
    }
}
```

# 結果
```
Hello world
```



★System.out.println("");　＝　表示させる
esp-idf で c++ を使う

esp-idf で c++ を使う方法です。
c を使う方法はこちら
[esp-idf の使い方](https://qiita.com/ekzemplaro/items/b12d4d3bc0b770cf8986)

## プロジェクトの作成

```bash
cd ~/esp
cp -r esp-idf/examples/get-started/sample_project .
```

## プログラム

main のファルダーを次のようにします。

```text
$ tree main
main
├── CMakeLists.txt
└── morning.cpp
```

```text:main/CMakeLists.txt
idf_component_register(SRCS "morning.cpp"
                    INCLUDE_DIRS ".")
```

```cpp:main/morning.cpp
// -----------------------------------------------------------------------
/*
	main/morning.cpp

					Jan/29/2023
*/
// -----------------------------------------------------------------------
#include	<iostream>
#include	<fstream>
#include <unistd.h>

#define	VERSION	"2023-1-29 PM 18:25"
// -----------------------------------------------------------------------
void loop()
{
	int icount = 0;

	while(1)
	{
	std::cout << "icount = " << icount << "\n";
	std::cout << "*** loop *** " << VERSION << " ***\n";
	std::cout << "Hello world!\n";
	std::cout << "Good Morning!\n";
	std::cout << "Good Afternoon!\n";
	std::cout << "こんにちは\n";
	std::cout << "\n";
	sleep(5);

	icount++;
	}
}

// -----------------------------------------------------------------------
extern "C" void app_main(void)
{
	sleep(3);
	std::cerr << "*** 開始 *** " << VERSION << "\n";
	sleep(3);

	loop();
}

// -----------------------------------------------------------------------
```

## コンパイル、実行

```bash
idf.py -p /dev/ttyUSB0 flash
```

実行結果

```text
$ cu -l /dev/ttyUSB0 -s 115200
Connected.
*** 開始 *** 2023-1-29 PM 18:25
icount = 0
*** loop *** 2023-1-29 PM 18:25 ***
Hello world!
Good Morning!
Good Afternoon!
こんにちは

icount = 1
*** loop *** 2023-1-29 PM 18:25 ***
Hello world!
Good Morning!
Good Afternoon!
こんにちは
```
scriptコマンドでログを自動取得する


以前構築したシステムの要件に、操作履歴として`history`を保管というものがあったのですが、NW機器にssh接続する要件があり、その作業の操作履歴は`history`には保存されないため、`script`コマンドで操作ログを取得することにしました。

`script`コマンドは、何もオプションを付けなくてもログを取得できますが、デフォルトではカレントディレクトリに`typescript`というファイル名でログが保存されます。

ただそれでは管理がしにくいので、
```
script /<保存先>/<ログファイル名>.log
```

と実行すると、指定のディレクトリへ好きな名前で保存できます。

ログの取得を終了したい場合は、`exit`コマンド（もしくは`Ctrl＋d`）を実行すると、終了することが出来ます。

また、同じ日に再度作業するのであれば、同じログに書き込みたい事もあるかと思いますが、その場合は`-a`オプションを付けると、同じログに追記することが出来ます。

これで簡単に操作ログを取得することが出来ますが、毎回手動で実行するのは忘れてしまう可能性が高いので、ログイン時に自動的にログが取得できるように設定します。

[こちらのサイト](https://techracho.bpsinc.jp/yamasita-taisuke/2014_04_03/16278)を参考にし、要件に合わせて書き換えます。
```
if [ "$SHLVL" = "2" ] && [ ! -z "$PS1" ] ; then
    [ -d /var/log/history ] || mkdir /var/log/history
    script -af /var/log/history/`whoami`.log
fi
```
こちらを各ユーザの`.bashrc`に追記し、保存すれば完了です！

ログインし直してみると、
```
Script started on /var/log/history/ユーザ名.log
```
と表示され、ログの取得が始まったことが分かります。

ただ、こちらの設定は`loglotate`でローテーションすることを前提にしているので、ログローテしない場合はログファイル名に日付などを入れた方が良いです。
（永遠に同じログに書き続けてしまうと思います…）

ちなみに`script`コマンドの`-f`オプションは、操作内容をファイルに即時反映するもので、こちらを指定しないと`exit`を実行するタイミングでログが書き込まれるようなのですが、前に実行中のログを確認したら文字化けしていたので、付けなくても良いかもしれません。
ログを確認する場合は、一度`exit`でログの取得を終了させてから見てください！

また、`$SHLVL`という変数はシェルの深さを表しているようで、コンソールからログインしていた時は参考にしたサイトと同じように「<font color="red">1</font>」で設定していましたが、
Teratermからssh接続するようになってからは取得ができなくなり、`$SHLVL`を「<font color="red">2</font>」に変更してみたところ取得できるようになったので、上手くいかない場合は`$SHLVL`を見直してみてください！

ではまた！:wave:
Laravel 「php artisan migrate」実行時にエラー「could not find driver」が発生した場合の対処法

# エラー内容
```
  Illuminate\Database\QueryException 

  could not find driver (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')
```
# 対処法
extension=pdo_mysqlがコメントアウトされていただけの問題っぽいので、コメントアウトを外します。
```php
;extension=pdo_mysql

変更
↓
extension=pdo_mysql
```
再度、実行すると正常に実行されました。
Dockerのお掃除

# はじめに
Dockerを使って環境を構築しようとした時にimageのpullがうまくいかなかったのでサーバ内の容量を確認/最適化した

# やりたいこと
現在使われていないものを削除することでDockerの容量を軽くする

### 何をお掃除するのかを確認
`docker system df`
- image,Container, Volumeの数や容量を表示
- [ドキュメント](https://docs.docker.com/engine/reference/commandline/system_df/)

```
$ docker system df 
>>
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          3         1         12.56GB   12.52GB (99%)
Containers      1         0         34.4kB    34.4kB (100%)
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B
```
`image`の容量が大きく，再利用可能な領域(RECLAIMABLE)が大きいことがわかる．

### 使われてないものを削除
`docker system prune`
- 止まってるコンテナ、使われてないボリューム、使われてないネットワーク、使われてないイメージを削除する
- [ドキュメント](https://docs.docker.com/engine/reference/commandline/system_prune/)
```
$ docker system prune
WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all networks not used by at least one container
    - all dangling images
Are you sure you want to continue? [y/N] y
...
```
### 個別でimage, containerの削除
**imageを削除するときはまずcontainerから削除する**
containerの削除: `docker rm [container ID]`
imageの削除: `docker rmi [image ID]`

### [補足]containerを一括削除
container IDの一覧を取得: `docker ps -a -q`
containerの一括削除: ```docker rm `docker ps -a -q` ```
【備忘録】Texでよく使うコマンド

# はじめに 
本記事では、筆者が日頃から使うTexのコマンドを列挙していく。筆者の備忘録代わりである。また、内容については筆者も利用するので、適宜編集をしていくつもりである。 

# 使用環境
それぞれのバージョンに関しては、追記する際の変更が手間であるので、割愛する。 
- M1 MacBook(2020)
- macOS
- VScode
- MacTex

# documentclass
```
\documentclass[]{ltjsarticle}
```
必要があれば、```twocolumn```を```[]```の中に挿入し、２段組にしている。


# プリアセンブリ
## Fig.Table.
図や表をFig.やTable.に変更する。
```
\renewcommand{\figurename}{Fig.}
\renewcommand{\tablename}{Table.}
```

## footnote
### 記号の変更

footnoteを某T大のある先生風にするため、筆者は以下のコマンドによってf脚注に使用される記号を再定義している。
```
\renewcommand{\thefootnote}{\dag\arabic{footnote}}
```

### 脚注の線の変更(拡張)
なお、数値を変更することで、脚注の線の長さや太さが変化するので、試してみると良い。
```
\renewcommand{\footnoterule}{\noindent\rule{\textwidth}{0.05mm}\vskip2mm}
```

## リンク 
目次や図、表のリンクをさせるために、
```
\usepackage{hyperref}
```
を利用し、それを目立たないようにするため、以下の設定を施している。
(標準設定では、筆者の環境ではリンクに赤枠が出てきてしまい、あまり見た目が良くないと考えている。） 
```
\hypersetup{
setpagesize=false,
 bookmarksnumbered=true,%
 bookmarksopen=true,%
 colorlinks=true,%
 linkcolor=black,
 citecolor=black,
}
```
# \begin{document}
## abstract
2段組の文書で、abstructのみを１段組にするためには、以下のように記述する。 
```
\twocolumn [
\maketitle
\begin{abstract}
    ここに、内容を記述する。
\end{abstract}
]
```
なお、この際に```\usepackage{abstract}```を使うとabstractが綺麗になる。


## 目次の作成
Texで目次の作成を行うには、以下のコマンドを入力する。 
```
\tableofcontents
\clearpage
```
なお、```\clearpage```は目次を見やすくするために筆者は入れている。

# 図の挿入 
図の挿入をする場合、
```
\usepackage{graphicx}
```
でpackageを指定したのちに以下のコマンドを使用する。 
```
\begin{figure}[h]
    \centering
    \includegraphics[width=0.3\textwidth]{fig-v12.png}
    \caption{v12}
    \label{fig-v12}
\end{figure}
```
なお、ここで```\textwidth```とは、文字を書けるスペースの横幅を指している。それの0.3倍と横幅にするという意味である。


# bibTex
bibTexを使った参考文献の記入には、以下のコマンドを```\end{document}```の手前に追記する。なお、```ref```には、ファイルの名称（拡張子を除く）を挿入する。筆者はいつもref.bibtexという名前のファイルを利用しているため、以下のようなコマンドになる。
```
\clearpage
\bibliographystyle{abbrv} %日本語の場合は jabbrv などとする
\bibliography{ref}
```
なお、```\clearpage```は目次を見やすくするために筆者は入れている。

## citation
いくつかの引用文献は1つの文章で表示する際に、 
```
\usepackage{cite}
```
を使用することで、以下の図のような引用が可能となる。
なお、ハイフンについては連番になっている際のみ有効となる。
![Screenshot 2023-02-01 at 14.53.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119582/694373ac-0dd4-0897-86c4-c911a6b10c9d.png)



# errrow
###  There's no line here to end.
エラーが出ているところに```\leavevmode```を追記する。
React Three Fiberで作成したComponentをStorybookで管理する

## 1. 初めに
以前よりThree.jsが好きで遊んでいたものの、作成したcomponentを忘備録的にカタログ管理したいと思い、[Storybook](https://storybook.js.org/tutorials/intro-to-storybook/react/ja/get-started/)と組み合わせてみました。

半日くらいで簡単なBoilerplateを作成致しましたので (雑なのはご容赦いただきたい)Githubで公開してみました

https://github.com/tominmin/react-fiber-storybook-boilerplate

## 2. 関連技術
- [React Three Fiber](https://docs.pmnd.rs/react-three-fiber/getting-started/introduction)
- [Storybook](https://storybook.js.org/tutorials/intro-to-storybook/react/ja/get-started/)
- [React](https://ja.reactjs.org/)


## 3. 遊び方
```shell
> yarn install
> yarn storybook
```
上記にて、Storybookが起動します。

## 4. イメージ
Hello World的な雑なCGで恐縮ですが、このようにコンテンツ毎にカタログ管理可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266010/15492d90-8a96-56ed-41be-39d44252fdc5.png)

## 5. Tips
Storybook上で表示したいcomponentを呼び出す関数を`Default Export`します。
その際に、`*.stories.*`という命名規則のファイルを作成すると自動的にStorybookに反映されます。

例: Boxというcomponent名の場合 (以下、疑似コード)
```jsx
export default {
    title: '(treeに反映したい階層及び名前)',
    components: Box,
    ...
} as ComponentMeta<typeof Box> = () => (
    <>
        ...
        <Box/>
    </>
);
export const (tree上のnode名) = Template.bind({});
```
の様に指定したファイルを`index.stories.tsx`の様な名前で作成する事で上図の様に反映されます。

## 6. 総括
- formatterに関しかなり雑に作成してしまったので、きちんとEslintを組み合わせて設定したい
- もう少し、まともな3D mockをsampleにすれば良かった・・(汗)
- 3D Objectだけでなく、Effectなど含めて管理できるよう、拡張性のある設計にしていきたい

<ins>以上</ins>
テックキャンプで卒業後の感想

# テックキャンプで卒業後の感想

* この度、テックキャンプ128期を無事卒業しましたので、感想を書きまとめてみました。

# 簡単な自己紹介
* 平成元年生まれの33歳
* 現職宿泊業、前職小売業
* 大阪住まいの既婚男性
* 今年1月中旬、地元の受託開発企業より内定をもらい、3月1日より勤務予定
:::note
※1月中内定5社獲得！
未経験ということや、広い意味でITエンジニアになりたかった為、
インフラと開発、SES、受託開発、自社開発などあまり拘らず幅広く応募しました。
:::

# 入学への契機とテックキャンプを選んだ理由
* コロナを機に現職(宿泊業)の収入面や将来性への不安が強まった。
* 外部環境に振り回されず、自分の手にスキルや技術をつけて、収入化したくなった。
* 日本の今後を念頭に置き、産業構造を考えた際、安定的な成長が見込まれる職業はITエンジニアしかなかった。
* 現職働きながら最短で実現可能な手段はないかと悩んだ結果、転職サポート付きのプログラミングスクールがとても魅力的に見えた。
* テックキャンプは他のプログラミングスクールと違い、「エンジニア転職コースは39歳以下」まで対応してくれた。
※私が調べた他のスクールほとんどは20代までか、32歳までが多かった。
* テックキャンプの転職支援サービスの求人は、東京と首都圏のみならず、関西やその他地方も多数あった。
※私が調べた他のスクールほとんどは東京都と首都圏のみが多かった。


# テックキャンプのメリット
:::note
* ①30代異業種、完全未経験の立場からでも、定まった学習時間をきちんと修了することで、アプリケーション作成からリリースまでの一連の流れが最短で学べる。
* ②スケジュール管理はもちろんのこと、挫折せずに学習に専念できるよう背中を押してくれるライフコーチの存在
* ③想定内外のプログラミングエラーに関して、随時相談できるメンターさんの存在
* ④卒業後、各企業ごとの選考管理や面接対策、そして履歴書と職務経歴書の添削まで対応してくれるキャリアアドバイザーの存在
* ⑤卒業後もご縁と繋がる、同期や先輩、後輩の存在
* ⑥カリキュラムで取り扱ってる、Rubyという言語は初心者にとって馴染め学びやすく、その後次のプログラミング言語へも挑戦できる信念が生まれる。
* ⑦卒業後にも1年間は復習振り返りができるカリキュラムの存在
* ⑧エンジニアの疑似体験ができ、プログラミングの学習習慣やスケジュール管理方法が学べる。
* ⑨各企業へ提出すると、＋＠となるポートフォリオの添削も行ってくれる。
:::

# テックキャンプのデメリット
:::note warn
* 人によっては少し高額で感じれるかも・・！
:::
:::note note
→しかし、何事も、考え方次第。
人生を根本的に変える、自分は変化しないといけないと本気で覚悟していた私にとっては十分払う価値のあるお金でした。
:::
:::note
→専門実践教育訓練給付金という制度があります。
条件を満たすことで支払った受講料の最大70％が給付金として還付されますので、実質的に支払う入学料はそこまで高く感じないかも知れません。
私も卒業後、支払った入学料の70％相当の給付金の還付を受けました。
※条件によって変わりますので、入学前に給付金対象になるか、必ずチェックお願いします。
:::

# まとめ
私が思うメリット、デメリットをざっくりと箇条書きにまとめてみました。
個人的にテックキャンプでの学習はとてもお勧めできます。 
他のスクールも必死で調べ、比較しましたが、やはり大手で実績もあり、働きながら技術習得ができるという点がテックキャンプの最大の魅力ではないかと思います。
いかがでしょうか？
ぜひご検討の程、お願い申し上げます。
picoCTF Writeup picoGym Practice Challenges Trivial Flag Transfer Protocol (注意<spoiler>)

tftp通信からwiresharkでいくつかのファイルを入手することができる。ファイルー＞オブジェクトをダウンロードー＞TFTP

入手したファイルのtxtの文字をrot13で復元すると写真に何か細工をしたと書かれている。

写真のファイルはsteghideを指しているように見える多くのファイルが見つかりました。

steghide info picture3.bmp

ANDHIDITWITH-DUEDILIGENCE

「DUEDIIGENCE」がフラグを非表示にするパスワードだったとしたら? パスワードとして「DUEDILIGENCE」を使用すると、steghide は、picture3 の中に flag.txt が隠されていることを明らかにしました。steghide extract -sf picture3.bmpパスワードに「DUEDILIGENCE」を使用すると、flag.txtが抽出されました。
PowerShellでフォルダバックアップ機能を自作する

Unityでゲーム作ってたけど、勢いで適当なアセット追加したら事故って後戻りできなくなった。
と言いつつ、何年も前に作っておいた毎日定時で動くバックアップバッチ？に助けられた。

ただ、単純にコピー元からコピー先に上書きコピーをするだけという動きなので、以前削除したオブジェクトやスクリプトがコピー先に残っており、コピー先から復旧させた際にそれらも復活するという欠陥も持っていた。
作った.ps1ファイルだか.batファイルだかがどこにあるのか分からないので、ゴリゴリとPSを書いて新しく自作する。

ざっくりとした仕様についてはこんなイメージ
1.コピー先にあるフォルダで、指定した期間（例えば3日）を過ぎているものは削除する
2.コピー先にバックアップ当日のフォルダを作成する
3.2で作成したフォルダ内に、バックアップ対象のフォルダをコピーする

PC環境変えた時とかにこのps1ファイルの移行を忘れないとは言えなので、備忘として残しておく。
PowerShellの書き方を思い出したりググりながら小1時間程度で書いたやつなので、ログの出力とかはやってない。

```
# 変数 ----------------------------
[string] $targetFolderPath = "D:\xx"; # コピー元フォルダパス
[string] $copyToFolderPath = "E:\xx"; # コピー先フォルダパス
[int] $retentatePeriod = 3; # 保存期間
[string] $today = "" # 当日の日付文字列
#----------------------------------

# 関数 ----------------------------
# 古いフォルダの削除
function DeleteOldFolder(){
    # 保持期間の数値をマイナスにし、更新日時が「本日-保持期間」以前のフォルダを削除する
    $retentatePeriod = $retentatePeriod * -1;
    Get-ChildItem $copyToFolderPath | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays($retentatePeriod))} | Remove-Item -recurse -force
}

# 今日の日付のフォルダ作成
function CreateTodayFolder(){
    New-Item ($copyToFolderPath) -ItemType Directory
}

# コピーによるバックアップ
function CopyFolder(){
    Copy-Item -Recurse $targetFolderPath $copyToFolderPath
}

#----------------------------------

# Main ----------------------------
DeleteOldFolder # 古いフォルダの削除

$today = Get-Date -Format yyyyMMdd; # 今日の日付文字列を取得
$copyToFolderPath = $copyToFolderPath + "\" + $today; # 今日の日付までのフォルダパスに更新

CreateTodayFolder # 今日の日付のフォルダ作成
CopyFolder # コピー実施
#----------------------------------
```

あとはこの.ps1ファイルをタスクスケジューラーで毎日0時に実行とかにしておけば、勝手にバックアップしてくれる。
なお欠陥として、数日PCを起動しないでおくと、次回実行時にバックアップフォルダがその日のフォルダだけになったりすると思う。
その辺どうにかするなら、バックアップ先フォルダの日付名フォルダ数を確認して、古い順に1つずつ削除していく、とかに修正しておくといいかも。（やる気無し）

ぶっちゃけ探せばバックアップ用フリーツールとかいくらでもあるだろうけども、たまにはね…。
【Vim】改行コードの設定

# はじめに
スマホ（Android）で開発するのでVimの環境構築は必須です。

# 動作環境
* Sony Xperia 10 IV
* Android OS 12
* UserLAnd 3.1.4
* Ubuntu 20.04.5 LTS
* Vim 8.1.3741

# 一時的に切り替えたい場合
* unix
```vim
:set fileformat=unix
```

# デフォルト設定にしたい場合
* unix
```~/.vimrc
set fileformat=unix
```

# スクリーンショット
* unix
set laststatus、set statuslineでステータスラインを表示させています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118198/0d5905eb-36b8-b091-9697-0eef736f75ef.png" width=50%>

* dos
set laststatus、set statuslineでステータスラインを表示させています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118198/5bc14d4e-2613-f13f-b6c1-51c3c4acc028.png" width=50%>
dlopen(): error loading libfuse.so.2

エラーのためメモ

```bash
kudu@kinetic:/opt/jetbrains-toolbox-1.27.2.13801$ ./jetbrains-toolbox 
dlopen(): error loading libfuse.so.2

AppImages require FUSE to run. 
You might still be able to extract the contents of this AppImage 
if you run it with the --appimage-extract option. 
See https://github.com/AppImage/AppImageKit/wiki/FUSE 
for more information
```

# 教えてSenpai

libfuse2をインストールしましょう

```bash
sudo apt install libfuse2
```
【Vim】文字コードの設定

# はじめに
スマホ（Android）で開発するのでVimの環境構築は必須です。

# 動作環境
* Sony Xperia 10 IV
* Android OS 12
* UserLAnd 3.1.4
* Ubuntu 20.04.5 LTS
* Vim 8.1.3741

# 一時的に切り替えたい場合
* utf-8
```vim
:set encoding=utf-8
```

# デフォルト設定にしたい場合
* utf-8
```~/.vimrc
set encoding=utf-8
```

# スクリーンショット
* utf-8
set laststatus、set statuslineでステータスラインを表示させています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118198/75fb6863-8661-5d9c-0a1e-24c997834264.png" width=50%>

* 未設定
set laststatus、set statuslineでステータスラインを表示させています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118198/b0d4b162-97ae-dc61-c7e5-0f1e5aae0e43.png" width=50%>
PrePoMaxによる複合材料の引張試験片の応力解析

# はじめに
今回は、複合材料を中央で接合した引張試験片について応力解析しました。これは、丸棒を摩擦圧接して、その接合面が中央になるように機械加工した引張試験片の応力解析を想定しています。複合材料の試験片のモデルの作成はFreeCADで行い、応力解析はPrePoMaxで行いました。

# モデル
図1のようなモデルについて応力解析するため、試験片の対称性を考慮して図2のような断面積1/4のモデルを作成して応力解析しました。

<img width="600" alt="Fig1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/4bf4f539-f7fd-a77d-d3de-0e97847bea2c.jpeg">

図1　応力解析したいモデル

<img width="600" alt="Fig2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/7a649bc8-5c74-a9a4-8c85-b337b4785841.jpeg">

図2　応力解析したモデル

FreeCADで作成したモデルとstepファイルは以下にあります。

https://github.com/repositoryfiles/CompositeTensileSpecimenModel

FreeCADによる複合材料モデルの作成については以下を参考にしました。

https://qiita.com/ken_eng/items/1776620fa11d49fa3ce8

PrePoMaxによる複合材の接合面の境界条件の設定については、以下の26ページを参考にしました。

https://speakerdeck.com/juntatsuno/prepomax-v1-dot-1-0-shi-li-ji

作成したメッシュを図3に示します。メッシュの最大サイズは2mmとしています。

<img width="600" alt="Fig3.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/dd1128b3-3b01-9217-063d-bd7be5177ae9.jpeg">

図3　メッシュの作成

接合面の境界条件は、図4のようにしました。

<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/042e2436-133a-f20a-e6c8-28348d5ee726.png">

図4　接合面の境界条件の設定

静解析の結果を図5に示します。図5は試験片の長手方向の変位を表示したものですが、変位が発散していることが分かります。

<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/5befa336-ac42-4e14-bb59-ce494f55fdc5.png">

図5　変位の解析結果
　
ここには図示しておりませんが、試験片の断面の対照性を考慮しない断面積1/1モデルで同様な解析を行いましたが、図4の境界条件の設定で変位は発散しました。

そこで、図4の接合面の境界条件のうち、Position toleranceをDefaultから0.05mmに変更して解析しました。その結果を図6に示します。

<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/5b839cc8-dc50-0f26-ea4f-08ff454a9e81.png">

図6　変位の解析結果（Position tolerance=0.05mm）

変位の値が発散しない結果が得られました。なお、Position toleranceを0.02mmまで小さくしても図6と同じ結果が得られましたが、0.01mmにしたら発散しました。

図7は、Position tolerance=0.05mmとして解析したときの試験片長手方向の表面の垂直応力の結果です。対称表示の機能や任意の場所の応力表示機能を使って表示しています。接合面でやや大きい値となっていますが、接合面の左側のアルミニウム合金、右側の鋼材、いずれについても応力値は131MPaとなっており、この値は材料力学による応力の理論値（20000N÷（π×14^2÷4）≒129.9MPa）にかなり近い結果となりました。
なお、図7の接合面（界面）の応力値についてですが、このような場所は特異点と呼ばれ、応力の評価が難しい場所です。このような応力値を報告書に載せるなど安易な使用は避けるべきです。

<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/32f2cb74-5911-536d-91ee-20f05a69d0bd.png">

図7　試験片長手方向の垂直応力の解析結果（Position tolerance=0.05mm）
MacでGoogleスプレッドシート操作中に勝手に範囲選択される問題の対処法


前書き
-
Qiita初投稿です。
現在プログラミングを学習中のインフラエンジニアです。
トシと申します。
投稿のお作法などまだわかっていない部分も多いですが、間違った点などあればご指摘いただけますと幸いです。

今回はGoogleスプレッドシートのMacでの扱いに関する簡単な記事を投稿します。

MacでGoogleスプレッドシートを操作している時に、意図していないのに勝手に範囲選択されてしまうことはありませんか？
他のセルをタップ（もしくはクリック）して選択しようとしても、カーソルが動くだけでそこからまた範囲選択されてしまいそれが延々と繰り返されるため、まともにSpreadsheetの操作もできません。
2つある回避策の1つ目はあまりにも初歩的ですが、自分はこの事象に多少ハマってしまったため同じような人がいたら気づきとなるのではとの思いから投稿いたします。


試した環境
-
macOS Monterey 12.3.1(MacBook Air) / Safari: Version 15.4
macOS Ventura 13.0.1(MacBook Pro) / Safari: Version 16.3

またiMac等マウス操作の際に同様の事象が起こるかは試せていません。
もし事象が発生する場合はトラックパッド操作の部分をマウス操作に読み替えて下記の手順を試してみると回避できるかもしれません。


Issue
-
上述の通り、MacでGoogleスプレッドシートを操作中、意図していないのに勝手に範囲選択されてしまう


Solution①
-
ChromeやFirefox等の、Safari以外のブラウザを使う

動作確認したバージョンは以下です。
Chrome:  109.0.5414.119 (Official Build) (x86_64)
Firefox: 108.0.2 (64 ビット)

シンプル過ぎる回避策ですが、これだけで回避できるのでSpreadsheetを使う時はSafariは使わないようにするのがオススメです。


Solution②
-
ChromeやFirefoxをインストールしてない人もいるんじゃないかと。
そういう方は以下をお試しください。

〜事象が発生〜
1. トラックパッドから指を一旦離す
2. スプレッドシートのどこでもいいから二本指タップ（右クリック）しメニューを表示させる
3. キーボードのescボタンを押下する
4. 範囲選択がされた状態でメニューが消える
5. カーソルを動かしても範囲選択されない状態となる
（この時まだ複数範囲が選択されてしまう場合は、再び1から4を繰り返す）
6. 勝手に範囲選択される度に1~5の手順を繰り返す



最初は面倒ですが、慣れれば同じ手順の繰り返しなので事象発生に対しすぐ回避できるようになります。
（尚、WindowsにインストールされたSafariでも同様の事象が起こるか試そうかと思いましたが、レア過ぎると思うので止めました。笑）


あとがき
-
プログラミングを学び始めて間もないためプログラミングに関する投稿ではないですが、学習や業務対応で得た知識・知見について極力皆さんと共有して行きたいと思っております。
今回は簡単な記事ですが、Qiita投稿の諸先輩がたのようにコーディング関連の記事もアップすべく日々を積み重ねていく所存です。
知見共有のモチベーションアップになるため、いいねやコメント等いただけますと幸いです。
と言いつつもいいねやコメント無しでも読んでくださるだけで励みになります。
今後ともよろしくお願いいたします。
研究室などの Ubuntu Desktop を複数ユーザで使う。

# はじめに

これは複数の Windows のクライアントが研究室などの一台の Ubuntu Desktop を使うための記事です。

# 接続方法

:::note info
ユーザごとの手順を最初に書いているのでサーバ化のときは最初に初期設定から始めてください。
:::



## ユーザの追加

`UESR_NAME` を任意のユーザネームに変更してください。UNIX コマンドと違うので気を付けてください。2 行目のコマンドでスーパーユーザに追加をします。

```txt: サーバ PC
$ sudo adduser UESR_NAME
$ sudo gpasswd -a USER_NAME sudo
```

## IP アドレスを調べる

プロンプトにて、以下のコマンドを実行します。

```txt: サーバ PC
$ ip a
```

実行結果から、インターフェース名が `eth0` `ens3` `wlan0` などとなっている行を探します。その行の `inet` という文字列の右側に、自分の IP アドレスが記載されています。

例：

```txtx: サーバ PC
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 192.168.1.10/24 brd 192.168.1.255 scope global dynamic ens3
       valid_lft 85979sec preferred_lft 85979sec
```

この例では、`inet` の次の `192.168.1.10` が自分の IP アドレスです。

## CUI接続（SSH 接続）

個人の PC から接続します。コマンドプロンプトを立ち上げます。`USER_NAME` と `IP_ADDRESS` をそれぞれ書き換えてください。

```txt: クライアント PC
$ ssh USER_NAME@IP_ADDRESS
```

長時間の作業の時は `tmux` の使用を検討してください。VS Code の拡張機能で接続した方がファイル操作が楽です。

## GUI接続（XRDP 接続）

個人の PC から接続します。`リモートデスクトップ接続` を起動してください。`コンピューター(c)` に先ほどの IP アドレスを打ち込み、`オプション` から `画面 → 画面の色` を15bitにしましょう。（そうでないと重いので）`接続`ボタンを押して接続します。

:::note info
**個々のユーザがやるのはここまで**
:::

# 初期設定

サーバ化するための設定を行います。

## インストール

必要なものをインストールします。

```
$ sudo apt install openssh-server tmux xrdp -y
```

## XRDP の設定

`/etc/xrdp/startwm.sh` の中身に環境変数を加えます。vim でファイルを開きます。

```
$ sudo vim /etc/xrdp/startwm.sh
```

冒頭に以下を追加します。

```
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
```

設定の共有からRDPをオンにします。

# 参考文献

https://zenn.dev/tk2345/articles/8ea0f2f1904a14
SwiftUIを触ってみた Part3

三日坊主の自分が3回目まで辿り着いて嬉しいというかなんというか。ということで[Part1](https://qiita.com/0CuriositY0/items/d5360b2fbb2e35532e1e)と[Part2](https://qiita.com/0CuriositY0/items/8a9eb0476f0d0045ddef)をくっつける（画面遷移させる）のをやってみた。はまりポイントというかよく調べず考えずに作ったらよろしくなかったので今回も備忘録をきちんと残す。

# 目標
今回の目標も簡単で、TOP画面からPart1で作った抽選機ページにジャンプして、都道府県ランダムマシーンを完成させる。調べた感じNavigationStackが新しくて分かりやすい画面遷移の方法らしかったので、それを使ってみた。

# ハマりポイント
ボタンを押す→都道府県CSVを読み込む→抽選機ページに遷移する、という順番で動いて欲しくてこんなことをやってしまった。

```swift
        NavigationStack {
            NavigationLink(destination: LotteryView()) { // 遷移先: LotteryView
                // 画面遷移のトリガーとなるViewの定義
                RoundedRectangle(cornerRadius: 35)
                    .overlay(
                        Text("NEXT")
                            .foregroundColor(.white)
                            .frame(height: 100)
                    )
                    .foregroundColor(Color(red: 0.226, green: 0.646, blue: 0.953))
                    .frame(width: 100, height: 50)
                    .onTapGesture {
                        prefArray = loadCSV(fileName: "SampleCSV")
                    }
        }
```
onTapGestureを画面遷移のトリガーに使ってしまってしまったためにファイル読み込みが終わる前にボタンを離すと画面が遷移してくれない挙動が発生した。長押しすれば画面遷移するけど、ぽちぽちしただけでは画面は遷移しない、といった具合です。
![test_gamen.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/845709/59a6c97f-0b90-c4e6-591a-9e2957b7482c.gif)

簡単な解決策は遷移先でCSVを読み込むのがよさそうなので、loadCSVを行う場所を変えました。
使うのはこのページなのだからよく考えたらそれはそうですね。初期化をこんな感じに。

```swift    
    @State var prefArray: [[String]] = []
    @State var index = 0
    @State var flag = false
    
    var prefArrayMaxIndex = 0
    
    init() {
        _prefArray = State(initialValue: loadCSV(fileName: "SampleCSV"))
        prefArrayMaxIndex = prefArray.count-1
        _index = State(initialValue:Int.random(in: 1...prefArrayMaxIndex))
    }
```
今度は画面遷移うまくいきました。
![test2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/845709/361b1d25-6a88-d1e1-f882-476b89215d2b.gif)
Ruby7

# 問題
今日の曜日を表示するコードをDateクラスを使用して記述してください。

ただし、金曜日だった場合だけ以下のように表示の内容を変えてください。

（出力内容）
「今日は月曜日」
「今日は金曜日だ ！！！」

### 💡ヒント💡
<b>Dateクラス</b>
Rubyの標準ライブラリの機能です。

```Ruby:Dateクラスを使うには必ずこの一文を記述します
require "date"
```
```Ruby:Dateクラスを用いて「今日の曜日」を取得する場合はこのように記述する
Date.today.wday
```

wdayは曜日を0(日曜日)から6(土曜日)の整数で取得することができるDateクラスに用意されているメソッドです。

```Ruby:例
require "date"

day = Date.today.wday

puts day
```

これを実行すると、曜日に合わせた数字が出力されます。

<br>
<br>
<br>

# 模範解答

```Ruby:模範解答
require "date"

day = Date.today.wday
days = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]

if day == 5
  puts "今日は#{days[day]}だ！！！"
else
  puts "今日は#{days[day]}"
end
```

# 【解説】
Rubyで日付を扱うため、RubyのライブラリにあるDateクラスを使用します。

（1行目）
Dateクラスをライブラリから呼び出します。

（3行目）
wdayメソッドを用いて曜日を0（日曜日）から6（土曜日）の整数にしたときの「今日」の値を取得します。

（4行目）
配列daysを定義し、日曜日（0番）〜土曜日（6番目）まで文字列を格納します。

（6〜10行目）
dayの値が5（金曜日）か否かで条件分岐させます。たとえば、今日が金曜日だった場合はday=5となり、daysの5番目の値である金曜日が出力されるようになります。

<br>
<br>
<br>

慣れるまでは格納することを忘れそうですが、解説手順を一つ一つ理解していくと次に記述するコードがわかります。
どんどんコードに触れていかないと書き慣れないので理解を深めながら頑張ります！
picoCTF Writeup picoGym Practice Challenges MacroHard WeakEdge (注意<spoiler>)

ダウンロードしたpptmファイルを解凍するとhiddenというフォルダが見つかるのでファイルの文字をcyberchefに読み込ませるとフラグが現れる。
picoCTF{D1d_u_kn0w_ppts_r_z1p5}
phpMyAdmin 設定して、MySQLを管理方法


# 前提条件
https://qiita.com/taidong5588/items/f250ab10e4122a04046a

https://qiita.com/taidong5588/items/779928804a6f4eb98890

https://qiita.com/taidong5588/items/00835ff549975f911d88

https://qiita.com/taidong5588/items/434495a42ae07f27022c

# phpMyAdminのインストール
１．phpMyAdminの公式サイト（以下のURL）へアクセスしてダウンロード
https://www.phpmyadmin.net/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/adf7c58a-6dc1-2e59-25be-e004bdc4ad59.png)
２．ダウンロードして、解凍します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/093ef91a-c806-0536-e8ea-0e78f600b618.png)
３.フォルダ名を変更
　「phpMyAdmin-5.2.0-all-languages」⇒「phpMyAdmin」
４．解凍した上でApacheのドキュメントルート内に展開。
Apacheのドキュメントルートに移動します。
(Apacheのドキュメントルートがデフォルトの場合はC:/Apache24/htdocs/です。)
# php.iniの編集
```php
;   extension=mysqli
↓
extension=mysqli
```

# config.inc.phpの設定
phpMyAdminフォルダの中にconfig.sample.inc.phpというPHPファイルがあります。それをコピーして名前をconfig.inc.phpに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/0ffcbcdd-dd3e-66f6-cff1-95bf23ebe620.png)


# phpMyAdminにログイン
http://localhost/phpmyadmin/index.php
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/4c13175f-4a4d-92e0-af6d-38d5fa2e1ede.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/702e3583-f331-1832-6e52-71500116641d.png)
HTTPメソッド(GETとPOST)について

# はじめに
### 本記事を読んでほしい方
HTTPメソッドにおけるGETメソッド、POSTメソッドが理解できていない人、またそれぞれの違いを明確に区別できていない人に向けて記事を書きました。

### 目次
1. HTTPメソッドについて
1. GETメソッドとPOSTメソッド
1. GETとPOSTの違い

このように分けて説明していきます！

# 1. HTTPメソッド
まず、HTTPにおけるやりとりにはHTTPリクエストとHTTPレスポンスがあります。
- HTTPリクエスト
WebブラウザがWebサーバーに対してどのような処理をして欲しいのかというリクエスト情報を伝えること。
- HTTPレスポンス
WebサーバーがWebブラウザから受け取ったHTTPリクエストを処理して、その結果をレスポンスとして応答すること。

HTTPメソッドとは、前者のHTTPリクエストを使ってWebサーバーに具体的な要求を伝える手法のことです。要は、何をしたいのか指示出しをすることですね。

このHTTPメソッドの中で、Webサイトを閲覧するために主に使用されるのがGETメソッドとPOSTメソッドです。以下で説明していきます。

# 2. GETメソッドとPOSTメソッド
- GETメソッド
Webサーバから情報を取り出す(GETする)ために使用されます。　
例)HTMLファイルの取得など
- POSTメソッド
Webサーバーへ情報を送る(POSTする)ために使用されます。　
例)Webアプリへのログイン(ユーザー情報の送信)など

GETは何かを受け取るときに、POSTは何かを送るときに使用されます。
では、なぜ区別をしているのでしょうか？以下で説明していきます。

# 3. GETとPOSTの違い
GETメソッドとPOSTメソッドではデータの送信方法が異なります。GETメソッドを使ってデータを送信する場合は、URLの後ろに送りたいデータを付けて送ります。そのため、送ったデータがWebブラウザの閲覧履歴に残ってしまいます。一方、POSTメソッドを使ってデータを送信する場合は、HTTPリクエスト内のメッセージボディ内にデータを格納して送ります。メッセージボディ内にデータが組み込まれるため、閲覧履歴には残りません。


Webアプリにユーザ名とパスワードを入力してログインする場合
- GETメソッド : URLの末尾にユーザー情報が含めて送信してしまう
 リクエストライン　　&emsp;GET/login.html?**name=aaa$pass=123** 
- POSTメソッド : ユーザー情報をメッセージボディに格納して送信できる
 リクエストライン   　　&emsp;POST/login.html HTTP/1.1
 メッセージボディ　　&emsp;**name=aaa$pass=123** 
　

以上がGETとPOSTの大きな違いとなっています。他にも、パラメータの長さなどに違いがあります。簡単に表でまとめておきます。

|                | GETリクエスト | POSTリクエスト |
|:---------------|-------------:|-------------:|
|パラメータの格納場所|URL          |メッセージボディ|
|セキュリティ      |低い(Webサーバーにログが残る)| 高い(Webサーバーにログが残らない)| 
|パラメータ(URL)の長さ|文字列の制限あり|文字列の制限なし|

# 参考文献
- [イラスト図解式 この一冊で全部わかるWeb技術の基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8BWeb%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%B0%8F%E6%9E%97-%E6%81%AD%E5%B9%B3/dp/4797388811)
- [プロになるためのweb技術入門](https://www.amazon.co.jp/%E3%80%8C%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%E3%80%8D-%E2%80%95%E2%80%95%E3%81%AA%E3%81%9C%E3%80%81%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B-%E5%B0%8F%E6%A3%AE-%E8%A3%95%E4%BB%8B/dp/4774142352)

# 最後に
HTTPメソッドにおけるGETメソッド、POSTメソッドについてお分かりいただけたでしょうか？もし、不備があればご指摘いただけるとありがたく思います。最後まで読んでいただきありがとうございました！
【Kotlin Server: kotless】Destroyタスクを有効にする方法

# はじめに
現在サーバー側をkotlinで実装していますが、サーバーレスフレームワークとしてkotlessを採用しています。
このkotlessに関してデフォルトではdestroyタスクが有効ではありませんので、有効にする方法を記事にしておこうと思います。

# destroyタスクを有効にする方法
有効にする方法は非常にシンプルで、以下をbuild.gradleに記載するだけになります。

```build.gradle.kts
extensions {
   terraform {
      allowDestroy = true
   }
}
```

以上になります。

# さいごに
正直使いどころが難しいdestroyタスクですが、環境をリセットする際などに必要となりそうですかね。
事故につながる可能性もあるので常時有効にはせず、本当に必要になったタイミングだけ有効にするということが良さそうです。

現在kotless＋Ktorの組み合わせで実装を進めているので、その辺りの実装もできる限り記事にしていきたいと思います。
picoCTF Writeup picoGym Practice Challenges Wireshark doo dooo do doo... (注意<spoiler>)

HTTP/1.1 200 OK  (text/html)
を探して追跡。TCPストリームを見ればフラグが見つかる。
cvpbPGS{c33xno00_1_f33_h_qrnqorrs}

rot13でエンコードされているのでデコードする。
picoCTF{p33kab00_1_s33_u_deadbeef}
Ruby6

# 問題
"晴れ" という文字列を引数で渡した時に

明日の天気は晴れです

とターミナルに表示されるようなメソッドを作成してください。

呼び出し方：get_weather_forecast("晴れ")

<br>
<br>
<br>

# 模範解答

```Ruby:模範解答
def get_weather_forecast(weather)
  puts "明日の天気は#{weather}です"
end

get_weather_forecast("晴れ")
```

# 【解説】
「明日の天気は〇〇です」の「〇〇」に任意の文字列を表示したいので、引数を使用します。
「〇〇」にはメソッドの呼び出し元の引数に渡した文字列が表示されます。
今回は呼び出し方が指定されているのでそちらを使用します。

```Ruby:メソッドの呼び出し
get_weather_forecast("晴れ")
```

そして、文字列を出力するためのget_weather_forecastメソッドを定義します。
引数で渡した文字列を表示させたいので、文字展開を使用します。

```Ruby:get_weather_forecastメソッドを定義
def get_weather_forecast(weather)
  puts "明日の天気は#{weather}です"
end
```

とても優しい問題でした。
【Vim】タブ入力時にスペースにする設定

# はじめに
スマホ（Android）で開発するのでVimの環境構築は必須です。

# 動作環境
* Sony Xperia 10 IV
* Android OS 12
* UserLAnd 3.1.4
* Ubuntu 20.04.5 LTS
* Vim 8.1.3741

# 一時的に切り替えたい場合
* スペース
```vim
:set expandtab
```

* タブ
```vim
:set noexpandtab
```

# デフォルト設定にしたい場合
* スペース
```~/.vimrc
set expandtab
```

* タブ
```~/.vimrc
set noexpandtab
```

# スクリーンショット
* スペース
set listで不可視文字を表示させています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118198/7b6a8718-6636-6711-6ef6-0cfa8354cad3.png" width=50%>

* タブ
set listで不可視文字を表示させています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118198/51126823-cd09-9f12-b723-5e0aadfa690b.png" width=50%>
SELinuxいじったっけ再起動できなくなっちゃってもうDC行きさ

このタイトルの由来が分かる人はお友達になりましょう:relieved:笑

さて、[前回](https://qiita.com/sugar_salt75/items/114000f3cd0574b096d6)の記事に書いた、RDP接続の設定に行き詰まって`SELinux`の設定をいじったら再起動が出来なくなり、一人でDCに行く羽目になった話です。笑

テスト環境では一度で成功していたので、なるべくそのテスト環境のサーバと設定を合わせようと思って、設定が違うところを確認したら、テスト環境ではSELinuxが有効化されていたんですよね。。:thinking:

なので特に深く考えず、笑
有効化して再起動してみたところ、起動チェック？の画面のまま止まってしまい、うんともすんとも言わなくなりました…:disappointed:

物理サーバだったので、`iLO`から再起動してみましたが状況は変わらず、コンソールからなら操作できるかもと思いDCに行きましたが、これも特に状況は変わらず、笑
また詰まっていたところに、「シングルユーザーモードでログインしてみては」とアドバイスをもらったので、再度サーバを再起動して、GRUB起動画面からシングルユーザーモードでログインしたところ、無事にサーバが操作できるようになりました！:sob:

有効化してしまった`SELinux`の設定を再度無効化し、あとは再起動して、これで直る！！と思った矢先、
今度は`reboot`コマンド、`shutdown`コマンドが使えない問題が起きます。。

前に別の作業でシングルユーザーモードでログインしたときには`reboot`コマンドが使えていたので、正直全然原因が分からず、フルパスでコマンドを指定してみても結果は同じで、また行き詰まっていました（すぐ行き詰まる）

そこで再度シングルユーザーモードについて調べていたところ、[こちらのサイト](https://rin-ka.net/centos8-single-mode/#toc7)に以下のような記載がありました。
>パスワード変更が完了したら通常モードで起動させます。
```
# exec /sbin/init
```

`reboot`コマンド使ってない！これっぽい！（語彙力）と思い、藁にも縋る思いでこのコマンドを実行したところ、無事にシングルユーザーモードから抜けることができ、サーバも起動し、ssh接続も出来るようになりました。。

`SELinux`についてよく分かっていなかったんですが、（だったら設定をいじるなという意見はごもっともなのですが）
有効化すると、root権限ですら制限される作業などがあって、そのせいで`reboot`や`shutdown`コマンドは打てなくなっていたみたいです:thinking:

前に`reboot`コマンドが使えていたのは、`SELinux`を無効化した状態でのログインだったから使えていたという事ですね…

`SELinux`はとりあえず無効化！は暗黙の了解だと思っていたので、理由まで考えたことはなかったんですが、今回の事でとても勉強になりました。。

そして、シングルユーザーモードにもいくつかパターンがあるみたいなので、皆さんも`reboot`コマンドが使えない場合は、前述したコマンドを試してみてください！
（シングルユーザーモードを抜ける方法は分かったけど、起動の仕方は見るサイトによって全部違う気がするし、結局どれでも起動は出来るけど一体どれが正しいんだろう…:thinking:）

ではまた！:wave:
【Vim】インデント増減時の幅の設定

# はじめに
スマホ（Android）で開発するのでVimの環境構築は必須です。

# 動作環境
* Sony Xperia 10 IV
* Android OS 12
* UserLAnd 3.1.4
* Ubuntu 20.04.5 LTS
* Vim 8.1.3741

# 一時的に切り替えたい場合
* タブ幅=2
```vim
:set shiftwidth=2
```

# デフォルト設定にしたい場合
* タブ幅=2
```~/.vimrc
set shiftwidth=2
```

# スクリーンショット
* タブ幅=2
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118198/4e3c223d-04ba-4a7c-2eb8-70bc0bd1b26a.png" width=50%>

* タブ幅=8
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118198/0f045dc3-b12e-64b8-9c56-eb5e2180d125.png" width=50%>
Ruby5

# 問題

以下のプログラムを実行するとエラーが起きます。
①エラーが起きた原因
②正しいソースコード（引数を用いたコードにしましょう）
をそれぞれ答えてください。

```Ruby
price = 300

def calculate_price_with_tax
  tax = 0.1
  return price + price * tax
end

calculate_price_with_tax
```

<br>
<br>
<br>

# 模範解答

### ①エラーが起きた原因
メソッドの外側で定義した変数は、メソッドの内側では使えない。
そのため、1行目のpriceはcalculate_price_with_taxメソッドの中では使えずにエラーが起きてしまった。

### ②正しいソースコード
```Ruby:模範解答
price = 300

def calculate_price_with_tax(price)
  tax = 0.1
  return price + price * tax
end

calculate_price_with_tax(price)
```

# 【解説】
メソッドの中と外は完全に別の世界となっています。
そのため、メソッドの中から外にある変数を使ったり、逆にメソッドの外から中にある値を使うことはできません。

唯一、メソッドの中と外を繋ぐ役割が「引数」と「返り値」です。

それを踏まえて今回の問題を解説していきます。

<b>①エラーが起きた原因</b>
解答の通り、エラーが起きた原因は変数priceです。今回の問題文のソースコードには変数priceが2度出てきます。

メソッドの外にある1行目のprice = 300と、メソッドの中にある5行目のprice + price * taxです。

```Ruby:問題のソースコード
price = 300

def calculate_price_with_tax
  tax = 0.1
  return price + price * tax
end
```

メソッドの中では、メソッドの外の変数を使うことができません
※変数の使える範囲をスコープと言います

よって今回の問題文のソースコードでは、変数priceの定義はメソッドの外で行なっていたにも関わらず、メソッドの中で変数priceをそのまま使おうとしたことがエラーの原因になります。

<b>②正しいソースコード</b>
つまりスコープの問題を解決するのが、メソッドの中と外を繋ぐ役割を持つ「引数」と「返り値」です。

・メソッドの外から中に値を渡す役割が「引数」
・メソッド内の処理を呼び出し元に渡す役割が「返り値」

メソッドの呼び出しをメソッド名(渡したい値)と書く
メソッドの定義をdef メソッド名(受け取った値を入れる変数名)と書く

```Ruby:メソッドの外から中に変数priceを渡すことで問題は解決
calculate_price_with_tax(price)
```

メソッドの定義をdef メソッド名(受け取った値を入れる変数名)と書く
今回は値段の値を受け取りたいので、変数名はpriceにします。今回はメソッドの外の変数名priceと一緒ですが、わかりやすい名前であれば別の名前にしても大丈夫です。

```Ruby:受け渡したい値、変数名を追記
price = 300

def calculate_price_with_tax(price)
  tax = 0.1
  return price + price * tax
end

calculate_price_with_tax(price)
```

少々難しく感じますが、一つ一つ整理していくと理解しやすいです。
【Vim】タブ入力時の幅の設定

# はじめに
スマホ（Android）で開発するのでVimの環境構築は必須です。

# 動作環境
* Sony Xperia 10 IV
* Android OS 12
* UserLAnd 3.1.4
* Ubuntu 20.04.5 LTS
* Vim 8.1.3741

# 一時的に切り替えたい場合
* タブ幅=2
```vim
:set tabstop=2
```

# デフォルト設定にしたい場合
* タブ幅=2
```~/.vimrc
set tabstop=2
```

# スクリーンショット
* タブ幅=2
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118198/50549fb3-4d5a-2c5b-cc86-085b2bb60743.png" width=50%>

* タブ幅=8
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118198/13b06ac8-50af-26e5-19e3-5bf8d58427f6.png" width=50%>
「mongo」コマンドが使用できず「command not found」が出た場合の対応策

# 結論
私の場合は、mongoshコマンドでmongoコマンドと同じことができました。
```
$ mongosh --version
1.6.2

$ mongosh 
Current Mongosh Log ID:	XXXXXXXXXXX
Connecting to:	XXXXXXXXX
Using MongoDB:	6.0.4
Using Mongosh:	1.6.2
・
・
・
test> show dbs
admin         40.00 KiB
config        72.00 KiB
local         72.00 KiB
```

# 環境
・Mac book Air M2
・MongoDB
　→下記コマンドでインストール
```
$ brew install mongodb-community
```
AWS CDK - コマンド

# コマンド一覧

|コマンド|機能|
|---|---|
|cdk list (ls)|アプリケーションのスタックをリスト|
|cdk synthesize (synth)|指定されたスタックから AWS CloudFormation テンプレートを生成、印刷|
|cdk bootstrap|アセットを含むスタックのデプロイに必要な AWS CDK ツールキットスタックをデプロイ|
|cdk deploy|指定されたスタックをデプロイ|
|cdk destroy|指定されたスタックを破棄|
|cdk diff|指定されたスタックをデプロイされたスタックまたはローカル AWS CloudFormation テンプレートと比較|
|cdk metadata|指定されたスタックに関するメタデータを表示|
|cdk init|指定したテンプレートから現在のディレクトリに新しい AWS CDK プロジェクトを作成
|cdk context|キャッシュされたコンテキスト値を管理|
|cdk docs (doc)|ブラウザーで AWS CDK API リファレンスを開く|
|cdk doctor|潜在的な問題がないか、お客様の AWS CDK プロジェクトをチェック|

# cdk init

`app` : CDK アプリケーションの基本テンプレートです。
`lib` : CDK コンストラクトライブラリのテンプレートです。
`sample-app` : CDK アプリケーションのサンプルで、いくつかのコンストラクトが組み込まれています。

テンプレートが指定されていない場合、CDK はデフォルトで app を使います。

```
cdk init --list
Available templates:
* app: Template for a CDK Application
   └─ cdk init app --language=[csharp|fsharp|go|java|javascript|python|typescript]
* lib: Template for a CDK Construct Library
   └─ cdk init lib --language=typescript
* sample-app: Example CDK Application with some constructs
   └─ cdk init sample-app --language=[csharp|fsharp|go|java|javascript|python|typescript]
```

# cdk synth

```
cdk deploy                   #スタックをデプロイします
cdk deploy stack1            #単一のスタックを展開します
cdk deploy stack1 stack2     #stack1 と stack2 の両方をデプロイします
cdl deploy *                 #プロジェクトフォルダーのすべてのスタックをデプロイします。
```

`cdk synth` コマンドは、ターミナル内の指定されたスタックに対して生成されたテンプレートを表示します。
アプリケーションに複数のスタックが含まれている場合は、synth コマンドを使用してテンプレートを **`cdk.out`** ディレクトリに保存します。

# cdk diff

```
cdk diff          # アプリのスタックを既存のデプロイと比較します
cdk diff stack1   # 指定されたアプリのスタックを既存のデプロイと比較します
```
ペンローズのグラフ記法でベクトル解析の計算をシンプルにしよう〜前編.微分演算子を含まないもの〜

## 1.はじめに

ベクトル解析の公式をペンローズのグラフ記法と呼ばれる方法で導出する方法を紹介します。
本記事では前編として、微分演算子を使わない場合を扱います。

注:なぜこの方法でうまくいくのかについては触れないので、気になる方はペンローズダイヤグラムなどで調べてください。

## 2.定義

### 2-1.スカラーとベクトル
スカラーは□で囲います。ベクトルは□で囲って、ひもをつけます。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121500/c3982215-29a7-31f3-8332-9789b6759014.jpeg)


### 2-2.スカラー積
スカラー積は、単に横に並べることで表記します。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121500/43f2198c-cbdb-f20f-fe43-15f063d6f34f.jpeg)


### 2-3.ベクトルの内積
ベクトルの内積は、ベクトルのひも同士をつなげたものとします。ひもの端同士がつながるので、ベクトルの内積はスカラーになることに対応しています。
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121500/aeb3bca0-9788-2408-7d05-8af6f078fbe7.jpeg)


### 2-4.ベクトルの外積
ベクトルの外積は、ベクトルのひも同士をつなげて、上に新たにひもを生やしたものとします。ひもの端が1本残るので、ベクトルの外積はベクトルになることに対応します。左右の成分を入れ替えると-1倍されます。
![4-correct.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121500/1defc62f-15b9-6d38-2377-955e37011bf4.jpeg)



## 3.許される操作について
公式を証明するために用いてもよい操作について解説します。

### 3-1.ひもを回転させたり、伸ばしたりする。
ベクトルの内積の交換法則がわかります。ベクトルの外積については交換法則は満たされないことがわかります。また、ひもを伸ばしたり曲げたりする操作も自由に行えます。ただし、他のひもをまたいだりしてはいけません(これを許すと、外積の反対称性が保たれなくなってしまいます)。
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121500/fc84f00c-c1f4-c2eb-5da5-48f6ed0eecd6.jpeg)


### 3-2.公式
下のような関係がなりたちます。ベクトル三重積の公式を示す時などに役立ちます(後述)。
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121500/506ab906-042f-ddeb-5b5c-c8283d28ac19.jpeg)


## 4.公式一覧
公式を可能な限りまとめておきます。図と一緒に理解しておきましょう。

### 4-1.スカラー三重積
3つのベクトルが成す平行六面体の体積という意味付けがなされます。
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121500/b42103f6-fabc-564c-2bfa-609df5642854.jpeg)

### 4-2.ベクトル三重積
応用例は滅多に見かけないです(慣性力を扱う時ぐらい)が後述のヤコビの恒等式のために必要です。
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121500/8f1609d1-e92d-14d6-3d0d-10f3fc3e5401.jpeg)

### 4-3.ヤコビの恒等式
解析力学のPoisson括弧や量子力学の正準交換関係などにも現れます。Lie代数と関係があるらしいです。
![9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121500/bfc5897d-1fee-4ce6-cecb-0080b960346a.jpeg)

暗記したくない四重積も以下のように簡単に導出することができます。
### 4-4.スカラー四重積
![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121500/25354334-5c76-a727-5aab-69cc1c0c926e.jpeg)

### 4-5.ベクトル四重積
![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121500/e1990242-06eb-bf7f-cb0c-63d8769d12de.jpeg)

## 5.次回予告
この時点ではまだありがたみが薄いですが、微分演算子についても同様の表記を用いて様々な公式を考えることができます。次回は微分演算子を含む場合について解説します。

後編:[ペンローズのグラフ記法でベクトル解析の計算をシンプルにしよう〜後編.微分演算子を含むもの〜](https://qiita.com/lactoneinfo/items/836f938736ca749348fb)
`Flutter`の`go_router`packageで`BottomNavigationBar`を固定表示する

# やること

`Flutter`の`go_router`packageで`BottomNavigationBar`を固定表示させます。

### Before
`BottomNavigationBar`でWidgetを切り替えるとページ遷移する様なエフェクトが発生しWidgetが切り替わる

![画面収録-2023-01-29-15.57.44.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184760/050445bf-bed0-2249-06b2-247fda43bc73.gif)


### After
`BottomNavigationBar`でWidgetを切り替えてもページ遷移する様なエフェクトが発生せずにWidgetが切り替わる

![画面収録-2023-01-29-15.55.35.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184760/58df566c-ce6e-2ee9-deb7-c2df82270a67.gif)


# 対応方法

バージョン`4.5.0`で追加された`go_router`の`ShellRoute`関数を使用して`BottomNavigationBar`を固定化したいWidgetをグルーピングします。

https://github.com/flutter/packages/blob/3ef0f63290fd48e0fe621d8bd218e8a0646903bb/packages/go_router/CHANGELOG.md#450

#### ※ `go_router`のバージョン`5.0.0`以前は`GoRoute`関数の`navigatorBuilder`オプションでも実装可能だったのですがバージョン`5.0.0`で削除されているので注意してください

https://github.com/flutter/packages/blob/3ef0f63290fd48e0fe621d8bd218e8a0646903bb/packages/go_router/CHANGELOG.md#500


```dart
GoRouter(
  routes: [
    ShellRoute(
      builder: (BuildContext context, GoRouterState state, Widget body) {
        return BottomNavigattePageLayout(body: body);
      },
      // `BottomNavigationBar`を固定化させたいroutesを定義していく
      routes: []
    )
  ]
)
```

`go_router`でWidgetをルーティングする際に`builder`に指定した関数が必ず実行され描画されるので`BottomNavigationBar`でWidgetを切り替えてもページ遷移する様なエフェクトが発生せずにWidgetが切り替わる様な振る舞いになります。


```dart
builder: (BuildContext context, GoRouterState state, Widget body) {
  return BottomNavigattePageLayout(body: body);
},
```

`builder`で都度ビルドされるWidget`BottomNavigattePageLayout`は以下の様に`Scaffold`で`bottomNavigationBar`を定義しておき、引数で受け取った`body`をそのまま`Scaffold`の`body`に渡すことでWidgetの変更を行います。

```dart
Scaffold(
  body: body,
  bottomNavigationBar: BottomNavigationBar()
);
```

# 参考

`ShellRoute`追加のPR

https://github.com/flutter/packages/pull/2453

# 動作環境

```bash
$ flutter --version
Flutter 3.3.10 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 135454af32 (6 weeks ago) • 2022-12-15 07:36:55 -0800
Engine • revision 3316dd8728
Tools • Dart 2.18.6 • DevTools 2.15.0
```

- go_router: "5.1.5"
【Vim】自動インデントの有効／無効

# はじめに
スマホ（Android）で開発するのでVimの環境構築は必須です。

# 動作環境
* Sony Xperia 10 IV
* Android OS 12
* UserLAnd 3.1.4
* Ubuntu 20.04.5 LTS
* Vim 8.1.3741

# 一時的に切り替えたい場合
* 表示
```vim
:set autoindent
```

* 非表示
```vim
:set noautoindent
```

# デフォルト設定にしたい場合
* 表示
```~/.vimrc
set autoindent
```

* 非表示
```~/.vimrc
set noautoindent
```

# スクリーンショット
* 有効
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118198/2d7c441e-f1b4-2a4f-5d98-2044a54010c9.png" width=50%>

* 無効
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118198/fe910411-3b3a-28e9-e297-7662805edbba.png" width=50%>
Finched Rails CLI で Rails環境をサクっと構築（必要なのはFinchだけ）

## はじめに

[Finch](https://github.com/runfinch/finch)さえあれば他何もインストールすることなくRailsを簡単に試せる方法（[Finched Rails CLI](https://github.com/yokawasa/finched-rails-cli)）を紹介をします。 Finchとは、AWS により開発されたLinuxコンテナーを構築、実行、公開するためのOSS CLIです。Finchさえあれば、いくつかのコマンドをコピー＆ペーストするだけで、Railsアプリをすばやく起動できます。 なお、Finched Rails CLI は [Docked Rails CLI](https://github.com/rails/docked)のフォークであり、ほぼほぼフォール元流用でDockerじゃなくてFinchで動かすようにしただけというものです。

> 注意: 2023年1月現在、FinchはmacOS (すべてのMac CPUアーキテクチャ)のみをサポートしています。将来的な他のアーキテクチャのサポートについては、[Finchリポジトリ](https://github.com/runfinch/finch)を参照ください。

これを試みた理由はとても単純で、Railsを動かしたいけど何かごちゃごちゃ関連ソフトウェアを入れたくなくて、またデスクトップ上のLinuxコンテナー管理はDocker DesktopではなくFinchをつかっているためです。Docker Desktopについてどうこういうつもりはありません😉

https://github.com/yokawasa/finched-rails-cli

![](https://unofficialism.info/assets/20230128-finched-rails.png)

## Quickstart

まだインストールしていない場合はFinchをインストールしてください。

```bash
brew install --cask finch
```

次に、以下をコピー＆ペーストして実行してください。

```bash
finch volume create ruby-bundle-cache

alias finched='finch run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle -p 3000:3000 --entrypoint "" ghcr.io/yokawasa/rails/cli'
```

これで、上記で作成したaliasである`finched`を使ってRails アプリの開発を開始する準備が整いました。

以下のように`weblog`という名前のRailsプロジェクトをつくってRailsサーバを立ち上げてみてください。

```bash
finched rails new weblog
cd weblog
finched rails generate scaffold post title:string body:text
finched rails db:migrate
finched rails server
```

上記でつくったRailsアプリは、http://localhost:3000/posts で確認できます。

```bash
open http://localhost:3000/posts
```

![](https://unofficialism.info/assets/20230128-finched-rails-weblog-posts.png)

これだけです。

Enjoy developing Rails app with Finch!
LinuxのサーバにGUI接続してみたけど画面が真っ黒だった話

[前回](https://qiita.com/sugar_salt75/items/c03c780aa94fa0d73251)の記事で、LinuxのサーバにGUI接続する設定を書きましたが、いざ接続してみると画面が真っ黒のままデスクトップが表示されない事象が発生しました。


色々調べてみると、ローカルログインしているユーザがいると出来ない、既に開いているGnomeのセッションを閉じると良いなどいくつか原因が見つかったので、`w`コマンドでログインしているユーザを確認して強制ログアウトをしてみたり、Gnomeのセッションを落としたりしたのですが状況は変わらず…

行き詰まって`SELinux`の設定を変えてしまって再起動が出来なくなり、一人でDCに行く羽目になったりもしましたが（これもまた別途記事にします。笑）

ついに原因が分かりました:joy:

原因は、今回`script`コマンドでログイン時にログを自動的に取得するように設定していたのですが、ログオフしたときに上手くプロセスが落ちていなかったのか、そのプロセスが残っていたためにログインしていると認識され、前述の事象が起きてしまっているようでした…！

この`script`コマンドの厄介なところが、`exit`コマンドを入力しない限り
`su`して`root`ユーザに切り替えても、そのままログインユーザのログも取得し続けてしまうんですよね。。

ログインユーザにはこの設定を入れなければ良かったのかもしれない（今更）


とりあえず[こちらのサイト](http://www.mikitechnica.com/12-logout.html)を参考に、
`w`コマンドでログインしているユーザを確認⇒
ログを取得しているプロセスのPIDを`kill`コマンドで落とし、
再度リモートデスクトップを試してみたところ、無事にデスクトップが表示されようになりました！！！（大号泣）


つまりTeratermは起動させずに、RDPだけで接続すればスムーズにいけるのか…？と思いましたが、あくまで「<font color="red">ローカルログインしているユーザがいる</font>」と失敗するようで、ssh接続はカウントされないみたいなのでTeratermで接続している状態でもRDP接続は出来ました。

また、「`script`コマンドでログイン時にログを自動的に取得するように設定」をしているのが原因なのかと思いましたが、この設定が入ったままでもRDP接続は出来たので、あくまで前にログインしたときのプロセスが残ってしまっていたのが原因という感じでした。

ムズカシイ…

個人的にエンジニア人生で一番詰まった問題でした。。:pensive: