OmniAICreator/Qiita-1.07M huggingface dataset:
Databricksのmarkdownセルでのアシスタントの活用

こちらのポストが発端でした。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Databricks Assistant君マジ助かる、ノートブックのMarkdownセルで表書きたい、でもちょっとめんどくさいみたい、みたいな時に「表」とかクソ雑指定するだけで勝手に良さげな表書いてくれる。</p>&mdash; てぃーおみ (@omit0325) <a href="https://twitter.com/omit0325/status/1826282512223797674?ref_src=twsrc%5Etfw">August 21, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

そういえば、マークダウンセルでもアシスタントのアイコンが出るなーくらいにしか認識していませんでした。
![Screenshot 2024-08-22 at 8.34.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d71d3143-bd17-7497-52c9-a3bab99864fa.png)

[マニュアル](https://docs.databricks.com/ja/notebooks/use-databricks-assistant.html#use-databricks-assistant-in-a-notebook-cell)にはコードのセルでの活用方法は記載されていますが、マークダウンセルで何ができるかの説明はありません。

ですので、いくつか実際に試してみます。

:::note info
期待した通りの結果が得られない場合には、再生成やプロンプトの見直しをしたり、一度アシスタントの非表示・表示を行ってみてください。
:::


# テキストの生成

プロンプトに以下を入力します。

> SparkデータフレームとPandasデータフレームの違い

すると、マークダウンで説明を生成してくれます！知りませんでした。
![Screenshot 2024-08-22 at 8.35.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4f2a49ae-fa68-a0c8-153f-fa1816890d5f.png)
![Screenshot 2024-08-22 at 8.35.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/25e09d0b-eebe-820c-0c0c-7a0ac1fdf091.png)

# 表の作成

元のポストに倣って表を作成させます。

> 表

表に変換してくれてます。すごい。

![Screenshot 2024-08-22 at 8.40.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/52990be5-9002-2f19-e428-a170777bcdc3.png)
![Screenshot 2024-08-22 at 8.40.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2e0b6035-1fe5-8f12-1ba9-86ecb4ce623a.png)

# 画像の追加

> 画像

画像のマークダウンが追加されますが、リンク先のURL自体は自分で指定する必要があります。
![Screenshot 2024-08-22 at 8.43.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1b40dcce-816d-daf2-5dc6-12286767296f.png)


# リンクの追加

> リンク

こちらもリンク先のURL自体は自分で指定する必要があります。
![Screenshot 2024-08-22 at 8.44.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b7743924-baa2-a177-4bab-e3fdaaa2d764.png)

# 翻訳

@isanakamishiro2 さんに教えていただきました！

> 翻訳

![Screenshot 2024-08-22 at 20.56.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/72c8a4ea-443c-46e4-b53a-63b2683b420b.png)

マニュアルのリンク先も日本語にしてくれるとはニクイ。
![Screenshot 2024-08-22 at 20.56.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ed3da6b6-3dd4-3cd0-bdc2-cdd80ec6ed57.png)

# まとめ

挙動としてはコードのセルと同様に対象のセル(この場合はマークダウン)に対して指示を行うことで、レスポンスがマークダウンとして得られるということでした。是非ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【Python】ジェネリクスとは何か？

# ジェネリクスを一言で説明すると？
**型に依存しない汎用的なコードを記述するための機能。**

# ジェネリクスの利点
- **再利用性の向上**: ジェネリクスを使うことで、異なる型に対して同じロジックを使える汎用的なコードを作成できる
- **型安全性**: ジェネリクスは型を明確にするため、型に関するエラーを型チェッカで検出でき、バグを減らす助けになる
- **ドキュメント性の向上**: 型ヒントを用いたジェネリクスは、コードの意図を明確にし、他の開発者がコードを理解しやすくなります

# 基本的なジェネリクスの使い方
ジェネリクスは、TypeVarを用いて実現する。TypeVarは型変数を定義するために使用され、これにより関数やクラスが異なる型に対して汎用的に動作することが可能になる。

### 例1: ジェネリックな関数
以下は、リスト内の要素を反転するジェネリックな関数の例。この関数は、どの型のリストに対しても同じ動作を行う。
```python:sample1.py
from typing import TypeVar

T = TypeVar('T')  # 任意の型Tを定義

def reverse_list(lst: list[T]) -> list[T]:
    return lst[::-1]

# 使い方
int_list = [1, 2, 3]
str_list = ["a", "b", "c"]

print(reverse_list(int_list))  # [3, 2, 1]
print(reverse_list(str_list))  # ["c", "b", "a"]

```
この例では、TypeVar('T')を使って型変数Tを定義した。reverse_list関数はList[T]型を受け取り、同じ型List[T]を返す。これにより、リストの要素がどの型であっても、この関数を適用できる。

### 例2: ジェネリックなクラス
次に、スタックのようなデータ構造を実装するジェネリックなクラスの例を示す。
```python:sample2.py
from typing import TypeVar, Generic

T = TypeVar('T')

class Stack(Generic[T]):
    def __init__(self) -> None:
        self._items: list[T] = []

    def push(self, item: T) -> None:
        self._items.append(item)

    def pop(self) -> T:
        return self._items.pop()

# 使い方
int_stack: Stack[int] = Stack()
int_stack.push(1)
int_stack.push(2)
print(int_stack.pop())  # 2

str_stack: Stack[str] = Stack()
str_stack.push("a")
str_stack.push("b")
print(str_stack.pop())  # "b"
```

この例では、Generic[T]を使ってクラスStackがジェネリッククラスであることを宣言している。Stackは任意の型Tに対して動作し、スタック操作を提供する。
ロバストPython ―型ヒント の使いどころ

## 型ヒントを利用するメリット
コードベースに前提条件や制限を直接コードに落としこめるようになり、将来の読み手が推論しなくて済むようになる。さらに型チェッカを併用することで、コードについて厳密な保証をして貰える。

## Optional型
**背景**
None値はまさに10億ドルの過ちである。うっかり見逃すと、プログラムはクラッシュするようになり、ユーザが不満を抱え、売り上げに響く。
**使いどころ**
Optional型を使って他の開発者にNoneへの警戒をよびかける。

## Union型
**背景**
表現可能な状態(データ型)が多くなるほど、開発者が誤って実装する確率が高くなる。
**使いどころ**
Union型を使って表現できる状態(データ型)の数を必要最低限にする。

## Literal型
**背景**
表現可能な状態(値)が多くなるほど、開発者が誤って実装する確率が高くなる。
**使いどころ**
Literal型を使って表現できる状態(値)の数を必要最低限にする。

## Annotated型
**背景**
Literal型では、一定サイズ以下の文字列や特定の正規表現にマッチする文字列だけに有効な値を制限できない。
**使いどころ**
Annotated型を使って任意のメタデータ(3以上100以下の値など)を指定して値を制限できる。

## NewType型
**背景**
既存のデータ型を複数の状態に分割したい。
**使いどころ**
NewType型を使って既存のデータ型から、その既存型のすべてのフィールドとメソッドを持つ新しいデータ型を作る。

## Final型
**背景**
変数の値が意図せず書き換えられてしまう。
**使いどころ**
Final型を使って変数の値を変更できないようにする。
rebaseでコミット履歴を整理する方法

# はじめに

こんにちは！
社会人一年目の石川です。
記事をご覧いただきありがとうございます。

本記事では、リモートのブランチをローカルにrebaseし、コミット履歴を整理する操作を行ったので、その具体的な方法についてまとめます。

## 目次
1. [rebaseの使い方](#rebaseの使い方)
1. [リモートのトピックブランチをrebaseする](#リモートのトピックブランチをrebaseする)
1. [rebase -i コマンド](#rebase--i-コマンド)
4. [最後に](#最後に)

## rebaseの使い方
Gitのrebaseコマンドは、コミット履歴を整理するための強力なツールです。特にPRを出した後、不要なコミットが混じってしまったときに、rebaseを使って履歴をきれいにすることができます。

まず、rebaseの基本的な使い方を説明します。rebaseは、指定したブランチやコミットから現在のブランチまでの履歴を、他のブランチに適用することで、内容を上書きするコマンドです。



## リモートのトピックブランチをrebaseする

まずは、リモートのトピックブランチをローカルにrebaseする手順を振り返ります。
ここではリモートのAブランチをローカルのBブランチにrebaseする手順を詳しく説明します。

```
git fetch origin # リモートリポジトリから最新の情報を取得
git checkout B  # トピックブランチに切り替え
git rebase origin/A  # リモートのAブランチの最新の変更をローカルのBブランチに適用
```
これによって、Bブランチが最新のAブランチの内容を取り込みながら開発を続けることが可能になります。



## rebase -i コマンド
リベース後に、Bブランチ上のコミットがAブランチのコミットに続いて並びますが、この時点でコミット履歴を整理することで、より見やすく、理解しやすい履歴にすることが可能です。

#### コミットのハッシュ値を確認する
まず、コミットのハッシュ値を確認します。``` git log ```コマンドを使用してコミット履歴を表示し、目的のコミットを見つけます。
```
git log --oneline
```



```
出力例：
a1b2c3d 最新のコミットメッセージ
e3a1b35 ひとつ前のコミットメッセージ
7ac9a67 目的のコミットメッセージ
1d2a3f4 その他のコミットメッセージ
```

#### インタラクティブリベースの開始
``` git rebase -i ``` の後にハッシュ値を指定します。ここで、`7ac9a67`のコミットを基点としてrebaseを開始したい場合、次のようにコマンドを実行します。

``` 
git rebase -i e3a1b35
```

これにより、`7ac9a67` コミット 以降 のコミットがエディタに表示され、編集できるようになります。もし`7ac9a67`を含めて編集したい場合は、その一つ前のコミットハッシュを使用します。

> **補足**: `git rebase -i e3a1b35^`  
> ハッシュの最後に`^`をつけることで、`e3a1b35`の親コミットから始まるすべてのコミットがリストに表示され、リベースの対象となります。


#### エディタでの操作
エディタが開かれると、リベースするコミットがリストアップされ、各コミットの前に pick というキーワードがついています。ここで pick を他のオプション（edit、drop、squash など）に変更して、各コミットに対する操作を指定します。

`pick`: コミットをそのまま使用
`drop`: コミットを履歴から削除
```
pick e3a1b35← このコミットは編集の対象外
drop 7ac9a67 目的のコミットメッセージ  
pick e3a1b35 ひとつ前のコミットメッセージ
pick a1b2c3d 最新のコミットメッセージ
```

コミットの行を編集して、「pick」を「drop」に変更することで、特定のコミットを履歴から削除することができます。変更を適用したい操作に応じて、適切なキーワードを使用して行を編集します。
もしエディタがインサートモードでない場合、テキストの編集を行うには i を押してインサートモードに切り替えます。


#### 完了後のプロセス
エディタで必要な変更を加えた後、ファイルを保存してエディタを閉じます。
vimの場合は、ESCキーを押してコマンドモードに切り替え、`:wq`と入力してEnterを押すと保存して終了します。

リベースのプロセス中にコンフリクトが発生した場合は、手動で解決します。もしリベースを中止したい場合は、``` git rebase --abort ``` を実行します。


リベースが完了したら、`git log`を使用して、コミット履歴が意図した通りになっていることを確認します。これにより、無意識のエラーや、間違ったコミットの操作がなかったかをチェックできます。


#### リモートにプッシュ
rebase後の変更をリモートブランチに反映させるためには、通常の`git push`を実行しますが、rebaseなどでコミット履歴が変更されている場合、リモートリポジトリの履歴と異なるため、強制的にプッシュ（--forceオプションを使用）する必要があります。強制プッシュを行う前には、関連する開発者に通知し、問題が発生しないように協力を求めることが望ましいです。


```
git push origin <branch-name> -f
```

## 最後に

最後まで読んでいただきありがとうございました。
この記事を読んでGitのrebaseを使ったコミット履歴の整理方法について理解が深まれば幸いです。
他者への貢献を自己成長につなげられるのが「スタッフエンジニア」なのかな、と思いながら読んだ

[O'Reilly Japan - スタッフエンジニアの道](https://www.oreilly.co.jp/books/9784814400867/) を読んだので、その感想文です。より詳細に書くと [『スタッフエンジニアの道ー優れた技術専門職になるためのガイド』 - snoozer05's blog](https://snoozer05.hatenablog.jp/entry/the-staff-engineers-path) の翻訳レビューに参加させていただき先んじて深掘りしながら読む機会を頂けた、という経緯です。

![](https://www.oreilly.co.jp/books/images/picture_large978-4-8144-0086-7.jpeg)



## この記事の想定読者
- マネージャーにはなりたくないなと思っている人 (筆者)
- その一方で最強の「個人コントリビューター」を言語化しきれていない人 (筆者)
- 書籍「スタッフエンジニアの道」が気になる人

## 最初にぼんやり描いていたこと
- 他者への貢献を自己成長につなげられるのが「スタッフエンジニア」なのかなと思う。
- 最強の個人コントリビューター **is NOT** 最強の一匹狼

私がいまだに気に入っている記事 [マネージャになりたくないプログラマのキャリアパス | ありえるえりあ](https://dev.ariel-networks.com/wp/archives/1878/) にも以下のように書いてあります。
> エキスパート職の職能は、まわりに良い影響を与えられるか

この本で、あらためてこれが裏付けられ目標になった気がします。


## 他者への貢献を自己成長につなげるということ

「まわりに良い影響を与える」、それはもう少し積極的に言い換えるならば「他者への貢献」だと思います。他者への貢献を最大化して、それを自己成長にも繋げられるのが、スタッフエンジニア の理想形...

以下、[O'Reilly Japan - スタッフエンジニアの道](https://www.oreilly.co.jp/books/9784814400867/)  と普段のお仕事の中から周りを見渡して感じる「例」を書いてみます。

## 例
私の中の「良い影響力を広げる」ことができているスタッフエンジニアのイメージ。


### 仕事

- 人が嫌がりそうな仕事こそ率先して手を挙げる。
- 「内向的な人間でいても大丈夫です。でも、嫌な奴になってはいけません」
- 自分のスコープと影響力を明確にしている。
- 自分の仕事を自分で選ぶ責任が大きくなるが、自分の人生とキャリアの両方を把握し、会社の目標にも貢献できる仕事を選んでいる。かつ自分のエネルギーを自己管理している。

### 趣味
- 率先して休む。もちろんちゃんと調整して休む。
- 夜間休日は働かない。働かせない。

### 育児
- 育児しながら学ぶ。むしろ保護者会に積極参加する。

### その他ボランティア
- 課外活動に手を挙げる。

## でも、まとめると

どれもこれもなんですが、そんな良き「スタッフエンジニア」は「なんだか助かる便利なおっちゃん」(おっちゃん は概念) の気もします。

[なんだか助かる便利なおっちゃんになりたい #ポエム - Qiita](https://qiita.com/koji-yamauchi/items/61aed31bc27b929c996c)

### 過去私が考えていたこと

[「ヒューマンスキル」が無いのでマネジメントは無理です #ポエム - Qiita](https://qiita.com/e99h2121/items/99cda4721cb09696161f)
[エンジニアはどこまで勉強すればよいのか - スキルマップと生存戦略を考えた #ポエム - Qiita](https://qiita.com/e99h2121/items/a41339815d9aea87bdb4)
[エンジニアはどこまで "出世" すればよいのか - キャリアパスと定年を考えた #ポエム - Qiita](https://qiita.com/e99h2121/items/89ec37a049adda24db2a)
[マネージャになりたくないプログラマのキャリアパス | ありえるえりあ](https://dev.ariel-networks.com/wp/archives/1878/)
> 最後に誤解のないようにひとつだけ書いておきます。会社で偉くなるべきだとは一言も書いてはいません。会社で偉くなりたいと思うのは単なるひとつの価値観です。偉くなるのは給料を多くもらえるということです。ただそれだけのことです。何を価値観にして生きていくかは個人の自由だからです。

### ほか書評
[書籍「スタッフエンジニアの道」の好きなところ、面白く感じたところ - 大好き！にちようび](https://daisuki.nichiyoubi.land/entry/2024/08/11/172640)

他者への貢献を自己成長につなげられる、便利なおっちゃんになりたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/88d0147c-82f8-b23b-e8c7-cedb54920c1e.png)

以上です～
なぜか、この広告がよく表示されるので仮に紹介「paiza」


とくに利害関係もなく
単純によかったので紹介

https://qiita.com/magirawashili/items/2fdfdb73534559d1300b

#paiza


![o_coq339.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e0bd7873-7a91-c134-c0ca-440e1077eacc.jpeg)
(UNO)8ビット機、マイナスの数をシフトで割り算。-3を2で割る





参考


https://note.com/tentowa211026/n/n2691e768bdeb


https://qiita.com/Upatissa/items/a83dcb92f124c22d0565


https://qiita.com/hanahagewanko/items/2922411e3f12559ee9b9


いろいろ

ichigojam basicの世界感では、ビット操作の割り算あたりが
「精鋭」小学生でも難しく、最終章の魔王クラスで
単純になんかいひくが理解できれば良い方(精鋭)
掃き出し法(回復法)、シフトしたのを先に引いて比較して場合により戻すやりかたは、情報系の大学でもムズイ
128ビット浮動小数点は、ちょムズイ(あまり使用されない　だから?)
除算器の無いCPUで範囲や精度を絞って高速化したいからやる。


目的
負の数の割り算をシフトで行うときの注意(厳密では、ない　ちょつとだいたい)


●負の数の1シフトの場合、全体に+1


単純に-3を算術シフト演算した場合(a,bは、一時変数)

a = (-3)>>1

a は、　-2 (なんかちがう)


b = ((-3)+1)>>1

b は、　-1



もしくは、

b = -3

b++

b>>=1


結果


![o_coq338.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fae1bec2-dfb8-c2fd-94c1-5d8dbf7b55e9.jpeg)


プログラム


```c++


//mainasu_3_sifuto_asobu_UNO_1

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  Serial.println();
  Serial.println("START");
  Serial.println();
}

// the loop routine runs over and over again forever:
void loop() {
  
  char a,b;

  a = (-3)>>1;

  b = ((-3)+1)>>1;

  //b = -3;
  //b++;
  //b>>=1;
  
  Serial.println((int)a);
  Serial.println((int)b);
  
  delay(3000);        // delay in between reads for stability
  
}


```


---------------------

おまけ
---------------------

オンラインコンパイラ



```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    for(int i=-10;i!=0;i++){
        
        printf("(%d),[%d],<%d>,{%d}\n",i,i>>1,(i+1)>>1,i/2);
        
    }   
}


(-10),[-5],<-5>,{-5}
(-9),[-5],<-4>,{-4}
(-8),[-4],<-4>,{-4}
(-7),[-4],<-3>,{-3}
(-6),[-3],<-3>,{-3}
(-5),[-3],<-2>,{-2}
(-4),[-2],<-2>,{-2}
(-3),[-2],<-1>,{-1}
(-2),[-1],<-1>,{-1}
(-1),[-1],<0>,{0}


```
ACMを使ってSSLサーバー証明書を発行する

AWSマネジメントコンソールからACM(AWS Certificate Manager)を表示します。
　
ACMのトップページの[証明書をリクエスト]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/4bbae4fc-31ea-8f7d-bd02-b4370937ba78.png)
　
証明書をリクエストページが表示されます。
[次へ]をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/3adfa2c8-6958-2b45-b6e9-f6cabee8f39e.png)

 パブリック証明書をリクエストページが表示されます。
 完全修飾ドメイン名を入力してください。
 入力後、[リクエスト]をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/d6525c75-973f-8306-8e35-7138dc707614.png)

 右メニューから証明書を一覧をクリックしてください。
 リクエストした証明書が表示されます。
 証明書IDをクリックして、証明書の詳細ページを表示してください。
 ドメインの[Route53でレコードを作成]をクリックしてください。
 ![canvas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/071c76f7-dca5-5528-96d1-4afd49998371.png)
　
 AmazonRoute53でDNSレコードを作成ページが表示されます。
 [レコードを作成]をクリックしてください。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/f31de3aa-a1e7-e521-9505-316a90c3ebb5.png)

以上で、終了です。
しばらく、[ステータス]が「検証中」と表示されます。
10分ぐらいで「発行済」となります。(最大30分ほどかかることもあります。)
SAP Business Application StudioからDestinationの疎通確認をする方法

## はじめに
UI5アプリやCAPでBTPに登録したDestinationを使用して外部APIにアクセスするとき、接続エラー（ステータスコード：500）が出ることがあります。そんなとき、それがDestinationの設定の問題なのか、アプリ側の問題なのかを切り分ける方法を紹介します。

※この記事は、以下のSAPブログを参考にしています。

https://community.sap.com/t5/technology-blogs-by-sap/how-to-check-the-connectivity-to-your-backend-system-in-business/ba-p/13479832

## 前提
SAP Business Application Studio (BAS) からDestinationを利用可能とするため、Destinationに以下のプロパティが設定されていることを確認します。

- HTML5.DynamicDestination: true
- WebIDEEnabled: true

## 疎通確認
はじめに以下のコマンドを実行して、BASのキャッシュをクリアします。これにより、最新のDestinationの設定が使用されます。疎通確認の最中にDestinationの設定を変更したときも以下のコマンドを実行してください。
```
curl localhost:8887/reload
```


BASのターミナルから以下のようにcurlコマンドを実行します。

```
curl -v -i "<destinationの名前>.dest/<接続したいAPIのパス>"
```

以下のようにステータスコード200が返ってくれば、Destinatonの設定は問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/e349b3b8-997d-2ee3-2f45-a70d8236fecb.png)
【個人メモ】 Vue.js+Vuetifyでのサンプル

vue.jsを勉強してていろいろ気になってChatGPTに聞いたことをメモ。

### サンプルコード
#### App.vue
``` vue:vue
<template>
  <v-container>
    <v-form ref="form">
      <v-checkbox
        v-model="isChecked"
        label="チェックボックス"
        @change="onCheckboxChange"
      />

      <v-text-field
        v-model="textBoxValue"
        :disabled="isChecked"
        :placeholder="isChecked ? 'チェックがオンです' : 'テキストボックス'"
        :rules="textBoxRules"
        required
      />

      <v-btn @click="handleSubmit">OK</v-btn>
    </v-form>
  </v-container>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      isChecked: false,
      textBoxValue: '',
      textBoxRules: [
        v => !!v || 'テキストボックスは必須です',
        v => !isNaN(v) || '数値を入力してください',
      ],
    };
  },
  async created() {
    try {
      const response = await axios.get('/api/data');
      const { year } = response.data;
      if (year === 9999 ) {
        this.isChecked = true;
        this.textBoxValue = '';
      } else {
        this.isChecked = false;
        this.textBoxValue = year.toString();
      }
    } catch (error) {
      console.error('データ取得エラー:', error);
    }
  },
  methods: {
    onCheckboxChange() {
      // チェックボックスの状態が変更されたときの処理
    },
    async handleSubmit() {
      const form = this.$refs.form;
      if (form.validate()) {
        const year = this.isChecked ? 9999 : parseInt(this.textBoxValue, 10);

        try {
          await axios.post('/api/register', { data: { year } });
          alert('データが送信されました');
        } catch (error) {
          console.error('送信エラー:', error);
          alert('データ送信に失敗しました');
        }
      } else {
        alert('フォームにエラーがあります');
      }
    },
  },
};
</script>

<style scoped>
/* スタイルは必要に応じて追加してください */
</style>
```
```
1. v-form コンポーネント:
ref="form" を使ってフォームの参照を取得します。この参照を使ってフォーム全体のバリデーションを実行します。

2. v-text-field コンポーネント:
:rules 属性にバリデーションルールを設定します。ここでは、値が空でないこと (!!v) と数値であること (!isNaN(v)) を確認しています。

3. handleSubmit メソッド:
this.$refs.form.validate() を使ってフォーム全体のバリデーションを実行します。
バリデーションが成功した場合にのみ、POSTリクエストを送信します。バリデーションエラーがある場合は、アラートを表示します。
```

##### Vueのライフサイクルフック
```
Vueコンポーネントには、いくつかのライフサイクルフックが存在します。これらのフックは、コンポーネントの異なる段階で自動的に呼び出され、適切なタイミングで特定の処理を行うことができます。以下は、主要なライフサイクルフックの一部です：

beforeCreate: コンポーネントが初期化される前に呼ばれる。
created: コンポーネントが初期化された後、テンプレートがレンダリングされる前に呼ばれる。
beforeMount: コンポーネントがマウントされる直前に呼ばれる。
mounted: コンポーネントがDOMにマウントされた後に呼ばれる。
beforeUpdate: データが変更され、DOMが更新される直前に呼ばれる。
updated: データが変更され、DOMが更新された後に呼ばれる。
beforeDestroy: コンポーネントが破棄される直前に呼ばれる。
destroyed: コンポーネントが破棄された後に呼ばれる。
```
MySQLのインストール後にrootユーザーでパスワードログインする方法

## はじめに

MySQLを初めてインストールした際、パスワードなしではログインできません。  
パスワードなしでログインするためは、`my.cnf`に以下の行を追加する必要があります。

```plaintext:/etc/my.cnf
skip-grant-tables
```

ただし、これは非常に大きなセキュリティリスクがあるため、外部からの不正アクセスを防ぐために、パスワードを設定する必要があります。

### MySQLのインストール後にrootユーザーでパスワードログインする方法

**ステップ1: MySQLに接続**
```bash
mysql
```

**ステップ2: mysqlデータベースに切り替える**
```sql
use mysql;
```

**ステップ3: rootユーザーのパスワードを再設定する**
```sql
UPDATE user SET `authentication_string` = PASSWORD('myNuevoPassword') WHERE `User` = 'root';
```

:::note info
このコマンドが実行できない場合、`mysql.user`テーブルの`authentication_string`列を確認してください。
:::

```sql
SELECT User, authentication_string FROM mysql.user\G
```

確認後、以下のように実行してください。
```mysql
UPDATE user SET `authentication_string` = 'myNewPassword' WHERE `User` = 'root';
```

**ステップ4: rootパスワードが変更できたか確認するために、`mysql.user`テーブルを表示**
```sql
SELECT User, authentication_string FROM mysql.user\G
```

**ステップ5**: `my.cnf`から以下の行を削除  
```plaintext:/etc/my.cnf
skip-grant-tables
```

**ステップ6**: MySQLを再起動  
```bash
sudo systemctl restart mysqld
```

**ステップ7**: パスワードを使用してMySQLに接続  
```bash
mysql -u root -p
Enter password: [new password]

mysql>
```

:::note warn
警告
この操作が必要な場合は、慎重に行ってください！
:::

## 参考
- [privileges - How to start MySQL with --skip-grant-tables? - Stack Overflow](https://stackoverflow.com/questions/1708409/how-to-start-mysql-with-skip-grant-tables)
windows pcを買ったときにinstallするものリスト 2024年版

新しいPCってわくわくしますよね！
そしてセットアップってだるいですよね！
今回は新しい職場に転職したわけでもPCが壊れたわけでもない状態でセットアップを行ったので、今まで使っていたPCと見比べながらソフト類をダウンロードしたログを書いておこうと思います

## 何をやっている人なのか

何の開発を普段しているかによって必要なツールも違ってくるのでこちらも共有しておきます

- 基本はPHPerだと思っている
- 最近はNEXT、nodejsも書いてる
- 複数のプロジェクトでPdMやったりEMやったりしてる
- 複数社でのPMとかしているせいでチャットツールが乱立しがち
- 業界的には最近はFinTechとかweb3とかだけどあまりこだわりは無い

## installしたもの(download履歴より)
- GoogleChrome
- VSCode
- poderosa
- kiloji
- slack
- telegram
- Chatwork
- 1password
- discode
- DeepL
- Lark
- git for windows
- brave
- HeidiSQL

## setupしたもの
- WSL
  - [この記事](https://qiita.com/htanaka0828/items/70210fe4bc4af132671e)を参考に
- VSCode
  - [設定の共有機能](https://qiita.com/Nuits/items/6204a6b0576b7a4e37ea)があるのでそれを使った
- project code
  - `git clone` をした
  - envを前のPCからコピーしてくる
- skype
  - defaultでinstallされているけどアカウントが違ったので入りなおした

## その他
- googleアカウントへのログイン
- 他各アカウントへのログイン
- キーボード、マウス、イヤホンの設定
    - bluetoothとかusbとか
- ディスプレイの設定
    - 画面が最大6枚で過去最大

## まとめ
ほとんどのデータがクラウド同期しているので、ソフトのダウンロードとログインがメインですね
mtgとかしながらでも1日あればダウンロード作業とログインぐらいまでなら完了できました。
現在ほとんどのプロジェクトでプログラムの実行環境がdockerないしはnodejsになっているので、WSLにdockerとnodejsを入れておけば大丈夫そうです
環境依存のenvファイルはgitで管理をしているわけではないので、現在使っているものを共有したほうが早いですが、どうしてもの場合は都度構築もやむなしかなと思っています

仮想環境作ったりXampp使っていた頃が懐かしいなと思ったおじさんでした
プログラミングの難しいところ



# プログラミングの難しいところ

ゲームをプレイしてると、表面上は簡単そうに見えることでも、実際に開発者の立場で見ると意外と難しい部分がある。今回はその一つをわかりやすく説明してみる。

### HPのクールダウンシステム

簡単に言うと、このシステムはオブジェクト（例えばキャラクター）がダメージを受けた後、次にダメージを受けるまでの時間を設定するものだ。例えば、俺は0.1秒という時間を設定した。つまりパンチを一度当てたら、次のパンチが当たるまでに0.1秒待たなければならないという仕組みだ。

でも、このシステムの何が問題なのか

このシステムを作った時、俺は1対1のバトルを想定していた。しかし現実的には2対1とか、もっと複雑な状況もあるかもしれない。 その場合、このHPクラスは一応機能するけど、例えば複数のキャラが同時に一人のキャラを攻撃した場合、片方の攻撃だけが無効になってしまう。
めちゃくちゃもどかしい動きである。

### 開発者としての考え方

この例から何が言えるかというと、ジェネリック（汎用的）なクラスを作る時には、あらゆる状況に対応できるように設計する必要がある。

### 解決策

この問題には2つの解決策が考えられる：

1. **HPクラスを拡張する方法：**  
   攻撃してきたオブジェクトとその時の時間を保存する辞書フィールドを作る。これにより、それぞれの攻撃者に対してクールダウンを個別に管理できるようにする。

2. **アタッククラスを拡張する方法：**  
   HPクラスからクールダウンシステムを削除して、アタッククラスにその機能を移す。この場合、攻撃が確認されたら、次の当たり判定関数が呼び出されるまで、当たり判定を無効にする。


### 実際の実装と試行錯誤

さて、上で紹介した解決策のうち、どちらを選ぶべきかはプロジェクトの要件や開発者の好みによる。俺の経験を語ると、最初はHPクラスを拡張する方法を選んだ。攻撃者とそのタイミングを管理する辞書を追加して、複数の攻撃を受けても個別にクールダウンを処理できるようにした。

この実装は、シンプルな仕組みながらも非常に効果的だった。だが、コードが複雑になりがちだという問題もあった。攻撃が増えるにつれて、辞書の管理や時間の計算が意外と面倒だった。

そこで、次にアタッククラスを拡張する方法を試してみた。このアプローチでは、HPクラスの処理をシンプルに保ちつつ（クールダウンシステムを入れない）、攻撃の当たり判定をアタッククラスでコントロールすることにした。この方法のメリットは、攻撃に関する処理が攻撃側に集中するため、HPクラスが軽くなり、他のシステムと干渉しにくくなる点だ。

アタッククラスの拡張では、攻撃が成功した後、一定時間当たり判定を無効にするフラグを設定し、次の攻撃が当たるまでの時間を待つようにした。これにより、同時攻撃があってもフェアに処理され、どちらの攻撃も正しく判定されるようになった。

### 最適な選択は状況次第

どちらの方法も一長一短だ。プロジェクトの規模や複雑さ、あるいは他のシステムとの連携を考慮して、どの方法が最適かを選ぶ必要がある。例えば、シンプルなゲームであれば、HPクラスを拡張して対応するのが手っ取り早いかもしれない。しかし、複数の敵が同時に攻撃してくるようなシチュエーションが多いゲームでは、アタッククラスを拡張する方が理にかなっているだろう。適材適所である。

### まとめ：プログラミングは常にトレードオフ

このように、プログラミングは常にトレードオフ（妥協点）の連続だ。どの方法を選んでも、それぞれのメリットとデメリットを理解し、最適な解決策を選ぶのが開発者の腕の見せ所だ。実装がうまくいけば、それは大きな達成感につながる。逆に、失敗から学ぶことも多い。折り合いのセンスというのも大事なものだ。

だからこそ、プログラミングは面白い。どんな小さなシステムでも、深く考え抜いて最適な方法を見つける過程がある。それが、ゲーム制作の醍醐味でもある。

---
LT資料: 生成AI活用分科会と活動案内（LinuC Open Network）

# せっかくのMeetupなので自己紹介要素を多めにいきます

---

## 本日のスライド
`https://qiita.com/nomurasan/items/b04d22a305d9a722d8d3`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/5cc770ca-986d-91df-a249-d37afc05c118.png)

---

## 来歴
:::note
<font color="white">ミッション：研修だけで終わらないエンジニア育成と定着を促進する</font>
:::

- IT/AI/DX推進役、エンジニアオンボーディングコンサル・講師
  - 元々はWebアプリエンジニア畑の出身
  - 最近の課題は研修後施策としての研修Well-Being立案
  - その他、DevRelなどエンジニアの働きやすさの啓蒙活動に注力
- LiONではIT講師の立場では教材作成や認定試験、講師育成
- 趣味で勉強会に参加しており、オープンソースカンファレンス系や技術書典、技書博に一般参加常連
  - 10代の頃から日本全国の同人誌即売会に毎週参加して新刊を作成していた時期があり、個人出版や印刷の知識はそこそこある

---

## 生成AI活用分科会とは？
- 公式(Slackより)
  - > GPTやClaudeなどの生成AI (LLM) を活用して、執筆系のアウトプットなどを効率化できないか、についてざっくばらんに模索するチャンネルです
- 私の理解・見解
  - ChatGPT(OpenAI API)やClaude(Anthropic)を活用してLiONコミュニティ活動に寄与できないかを検討する
  - 現状はテキスト生成がメインだが、執筆用の資料作成なども活用したい

---

## Simple Text Refineとは
https://marketplace.visualstudio.com/items?itemName=yasuraok.simple-text-refine

- VSCodeの拡張機能
- ChatGPT(OpenAI API)やClaude(Anthropic)を活用して回答結果をテキストファイル文中またはVSCodeタブに反映する強力な公正支援ツール

作者はLPI Japanの安良岡さん。
元々は教材作成や試験問題の作問を支援するツールだったそう。
私が個人的に気に入って活用範囲を汎化できないか、ユーザーフィードバックを一方的に送っている

https://github.com/yasuraok/SimpleTextRefine

---

# デモ（コード解説例）

---

## 設定例
```
{
    "simple-text-refine.api_key_openai": "", // OpenAI APIキー
    "simple-text-refine.api_key_anthropic": "", // Anthropic APIキー
    "simple-text-refine.model": "openai/gpt-3.5-turbo",  // 使用するモデル。後述
    "simple-text-refine.prompt_path": "",  // プロンプトファイル
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/6c9ff56b-ea1c-8e1d-6604-0cd968c20f1d.png)

---

# 勉強会・ハンズオンの機会を作って流行らせたい…

---

# 課題

---

## Simple Text Refineに期待していること
:::note
<font color="white">教材スライド（PDF）をマークダウンで書けるようにしたい</font>
:::

- 資料をGitで管理したい
- plantUMLとかmarmaidとかで作図しても良い
  - とはいえ、自力で書くのが面倒なので、diffが見れるので超助かる

---

## 生成AI活用分科会に期待していること、やりたいこと
:::note
<font color="white">脱・パワーポイント、Googleスライド</font>
:::

- マークダウンで教材スライドのレイアウト調整に対応できる状態
- GUI自体は悪くないので、編集した内容をコードにしてほしい
- Text2Textにこだわらず、Text2X（教材資料作成の図表、イラスト、動画教材作成など）も検討したい

---

## 将来的にやりたいこと
:::note
<font color="white">メタバースAIによる教育機会の創出、提供</font>
:::

- 既にメタバースプラットフォーム上での学生向け教育サービスはある
- エンジニア教育の観点では、仮想空間上（物理空間では見えないもの）で仮想技術を可視化すると学習能率が上がるはず、という仮説を持っている

:::note
<font color="white">開発入門者の「やりたい」を実現する仕組み作り</font>
:::

- （教育機会の都合で）Webアプリやインフラエンジニア以外の育成機会が提供されていない
  - 入門するにしても技術的に難しい、講師の確保や教材作成が難しい
  - どうしても現場経験が前提・必要になってしまう
neovimのバージョンを上げた際のエラー「Error executing lua vim/_init_packages.lua:0: module 'vim.lsp' no t found:」の修正方法

## これは何?

neovimのバージョンを0.4系から0.10系にアップデートしたらvim.lsp関連のパスが通ってなさそうなエラーが出たので修正方法を書きます。
結構ハマってしまったので，同じエラーの方を救済できたらと思い，筆を執りました。

---

## 発生したエラー

```
Error detected while processing BufReadPost Autocommands for "*"..functi
on <SNR>26_CreateMaps[1]..FileType Autocommands for "*"..function <SNR>4
9_on_window_changed[22]..<SNR>49_init[6]..airline#extensions#load:
line  220:
E5108: Error executing lua vim/_init_packages.lua:0: module 'vim.lsp' no
t found:
```

- OS: Ubuntu 22.04 LTS
- nvim: 0.10.1

いろいろ試してみた結果init.vimのdein関連の部分を消すとでなくなることがわかった。
なので，deinを入れ直してみたりしたがうまくいかず...
いろいろ調べてなんとか解決できたので

---

## 解決方法

いろいろ調べていると以下のような文言を発見した。

> [stack overflow](https://stackoverflow.com/questions/76449235/error-while-calling-lua-chunk-vim-init-packages-lua0-module-vim-version-no)
> This can be caused by a mismatch between the neovim and neovim-runtime.

どうやらneovimには`neovim-runtime`というNeovimの動作に必要な追加ファイルを提供する仕組みがあり，この相性問題が関係ありそうなことがわかった。

なので，古いバージョンのnvimを完全消去してみたところ，以下のようなエラーが追加で出るようになった。

```shell
sudo apt purge neovim
```

```
Error detected while processing /home/tomita/.config/nvim/init.vim:
line   28:
E484: Can't open file /usr/share/nvim/runtime/syntax/syntax.vim
line   29:
```
つまり，nvim-runtimerがないということなので古いnvim-runtimeの削除には成功したようだ。

その後nvimを再インストールしてみる。
[リリースノート](https://github.com/neovim/neovim/releases/tag/v0.10.1)にはsquashfs-rootを使って展開したあとのことが記載されておらず，
自分は`./squash-fs-root/usr/bin/nvim`のバイナリしかパスを通していなかったのでnvim-runtime側もきちんとパスを通した。

```shell
wget https://github.com/neovim/neovim/releases/download/v0.10.1/nvim.appimage
chmod +x nvim.appimage
./nvim.appimage --appimage-extract
sudo mv ./squashfs-root/usr/bin/nvim /usr/bin/nvim
sudo mv ./squashfs-root/usr/share/nvim  /usr/share/nvim
```

すると，vim.lspのエラーが無事消えた!

---

## まとめ

- Error executing lua vim/_init_packages.lua:0: module 'vim.lsp' no t found:がnvimを更新したらでるようになってしまった。
- deinは直接関係なかった。
- nvimを使うときには/sur/share/nvim/runtimeが必要である。
- nvimのバイナリと上記の`nvim-runtime`の相性が悪いとうまく動かなくなる。

以上，皆様も快適なvimライフを!
【Javascript】基本的なDOM操作について図解で解説する

# はじめに

以前、[こちら](https://qiita.com/yuto_h9m8/items/e774d86e0256a4e9062b)の記事にてDOMの概要について投稿しました。本記事では、具体的にDOMを書き換える方法について図を用いて解説していきたいと思います。

# DOMの書き換え

下記のようなDOMツリーを考えます。

▼HTMLソースコード
![スクリーンショット 2024-08-22 1.06.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/6cfb6944-8ee5-6ef8-8d58-e3196042a6d4.png)

▼DOMツリー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/e85606a7-c3f8-4b47-f926-40e200957dd5.png)


### 作成

下記のように`createElement`で要素を指定して、追加する位置を決定します。

```js
const p = document.createElement("p");
p.innerText = "test2";
const body = document.body;
body.prepend(p);
```

追加する位置の決定は`append`を含め、全部で4種類あります。

|メソッド名|追加位置|
|:-:|:--|
|after|指定要素の最初(一番左)|
|prepend|子要素の最初(一番左)|
|append|子要素の最後(一番右)|
|before|指定要素の最後(一番右)|

上記ソースコードの場合、DOMツリーは下記の通りです。
`append`の場合は、下図ではbodyタグの子要素の一番右側に追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/ee633e68-a15c-f128-7d8c-0bc53f7fd6e8.png)

### 更新

更新を行う場合は、`innerHTML`や`insertAdjacantHTML`を使います。

まず、`innerHTML`についてで、指定した範囲が丸ごと置き変わります。

```js
const body = document.body;
body.innerHTML = "<p>test2</p>";
```

この場合DOMツリーは下記のようになり、bodyタグの部分が丸ごと置き換わっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/701a8ad5-bd15-981d-3ada-825278baf60e.png)

次に、`insertAdjacantHTML`についてで、挿入する位置を決定します。

```js
const body = document.body;
body.insertAdjacentHTML("beforeend", "<p>test2</p>");
```

挿入する位置の決定は`beforeend`を含め、全部で4種類あります。

|メソッド名|挿入位置|
|:-:|:--|
|beforebegin|指定要素の最初(一番左)|
|afterbegin|子要素の最初(一番左)|
|beforeend|子要素の最後(一番右)|
|afterend|指定要素の最後(一番右)|

上記ソースコードの場合、DOMツリーは下記の通りです。
`beforeend`の場合は、下図ではbodyタグの子要素の一番右側に追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/5bc39512-c748-3bc4-c297-b0ed1fbe9a13.png)

またこのパターンでは、`createElement`で要素作成するのとやり方は同じになります。

### 更新(XSS対策版)

DOMの更新を行うにあたり、`innerHTML`や`insertAdjacentHTML`を用いたものの、このままでは第三者にタグを指定されて悪質なスクリプトを埋め込まれてしまう危険性があります。この攻撃をXSS(クロスサイトスクリプティング)攻撃と呼びます。この攻撃を防ぐために、それぞれ`innerText`と`insertAdjacentText`を用いて文字列で追加します。

まず、`innerText`についてで、`innerHTML`同様に指定した範囲が丸ごと置き変わります。

```js
const body = document.body;
body.innerText = "<p>test2</p>";
```

この場合DOMツリーは下記のようになり、bodyタグの部分が丸ごと置き換わっています。
また、タグに埋め込まれて置き換えられた`innerHTML`とは異なり、文字列として置き換わっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/7ba161f8-62de-e7c5-a14b-861281cd4bb5.png)

次に、`insertAdjacantText`についてで、挿入する位置を決定します。

```js
const body = document.body;
body.insertAdjacentHTML("beforeend", "<p>test2</p>");
```
上記ソースコードの場合、DOMツリーは下記の通りです。こちらも同様に、文字列で挿入されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/bec183d1-9bf9-7bcf-14a8-b9d19a9d302b.png)

### 削除

削除を行う場合は、`remove`を用いて要素を削除します。

```js
const query = document.querySelector("p");
query.remove();
```

上記ソースコードの場合、DOMツリーは下記の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661690/105f63cd-8d16-ed45-1511-8e5b466fe7d9.png)



# 最後に

本記事では、DOMの書き換え方法について、下記の操作を解説しました。

* 作成
* 更新
* 更新(XSS対策版)
* 削除

個人的には、概念の勉強も含めてDOMについてだいぶ理解できたかなと思いました。
良いカジュアル面談と悪いカジュアル面談

## カジュアル面談とは

Google Geminiに聞いていました

:::note info
カジュアル面談は、企業と求職者がお互いにじっくりと話し、お互いのことをよく知ることができる機会です。面接のように堅苦しいものではなく、リラックスした雰囲気で、仕事内容や会社のこと、求職者のスキルやキャリアプランなど、様々なことを自由に話し合うことができます。
:::

そんなカジュアル面談ですが、20社弱受けてみて良かった所、悪かったところをご紹介します。


## 良かった所

### ○絶妙なアイスブレイクトーク

**カジュアル**な面談です。**リラックス**した雰囲気で話し合いたいですよね。でも採用される側は緊張しがちです。故に、アイスブレイクしてもらえると助かります。相手との話す距離感とかが近くなり、喋りやすくなります。上手かった面接官の例は、自己紹介の後に「趣味はゲームで、嫁にも遊びすぎって怒られてます」とか、ちょっと自分の駄目な部分とか、(本当はどうかしりませんが)そんな毎日自己研鑽しないと許さないみたいなストレスフルな環境じゃないよ、みたいな優しい雰囲気を出してくれたりしました。

### ○応募した人に合わせた会社紹介

仕事のやりがいとか、課題感とか、今後の方向性とか、自分のやりたいこととマッチングするかとか、**実際に働いているからこそ知る情報**とかを、カジュアル面談では聴きたいわけですよね。

上手いカジュアル面接官は「どんな方向性の企業に応募されてますか？」とか「転職先でやりたいこととかありますか？」とか「どんな会社なら転職したいなって想いますか？」とかうまい具合に誘導して、それに合わせて**ピンポイントに会社紹介やスライドの深堀**をしてくれました。

### ○人事やエンジニアが物凄い前のめりで、会社のビジョンを語ってくれる

会社ページ行くと、ファーストビューでお題目とか出てきますよね。「最先端技術を使ってサービス業の未来を明るくする」とか。でもそれって本当？それっぽいこと書いているだけじゃないの？みたいなこと、思いますよね。

カジュアル面接受で、人事やエンジニアが本気で「**こんな世の中を作りたい**」とか「**こうやって技術で不便を解決している**」ってギラギラした目で語ってくれたりすると、「おっ、この企業本当にビジョンが末端にまで行き届いているな」って感じます。そういう企業は、組織としての目線が一致しており、**組織づくりに割と成功している良い企業**に思えます。

### ○(小さな企業限定)CTOや社長が直接今後の戦略などを語ってくれた

シリーズBくらいまでの小さな企業限定ですが、カジュアル面接でCTOとか社長がいきなり出てくることがあります。どういう世界観を作っていきたいとか、これからこんな事業をしていって、こんな会社の規模まで目指している、といった事業戦略や**未来像**を語ってくれると、熱いものが伝わってきます。


とは言え、ある一定以上の企業なのに、いきなりカジュアルでCTOが出てくると、「このフェーズで出てくる必要ある？」とか「これ、カジュアルじゃなくて、こっち見定めてきているよね」ってなります。

https://qiita.com/Sho0987/items/5d49b7434b807cb8def6


### ○知りたい・聴きたい事を、自然に引き出して行く人

カジュアル面談なので、できるだけ自然体で色々話したいですよね。上手いなと思った人は、ちゃんとこっちの職務経歴書とか見た上で、「これうちの会社でも似たような事やってめっちゃ大変だったんですよー、実際どうでした？」とか「こんな事されているのすごいですねー」みたいに応募者に合わせて質問をしてくれます。さらに、「そうだよねー」と相打ちをしてくれたり、話の流れで追加の質問をして、うまい具合に**相手が知りたそうな事(カルチャーのマッチングとか、どういうポジションが良さそうか)を引き出して行きました**。

### ○率直に自社の課題感や、こんな人が欲しいみたいなのを語ってくれる

**不器用でも、正直で実直な人は信頼が持てます**。会社の良い部分じゃなくて、悪い部分や改善していかないといけない課題等を率直に言ってくれると、「だったら、自分もこんな経験があるので、一緒になって改善出来るかもしれません」とかマッチングの確度を上げるコミュニケーションが取れます。

他にも、率直に「今こんな人を探しているんだ」って言ってくれると、その後の面接で無防備にカルチャーマッチを測られたり、技術スタックにないことを求められたりすることが減ります。マッチしないのに無駄に面接に進んだりすることもなくなったり、エントリー後に「求められるこういう部分に、過去のこういう実績がマッチします」とエピソードを上手く語るきっかけになったりします。


## 悪かった所

### ×ひたすらスライドの文章を読み上げられる

カジュアル面談を受ける前、社会常識を持った皆様は、ちゃんと事前に企業研究し、ビジョン、事業内容、カルチャーや福利厚生なんかの項目は一通り目を通しているとおもいます。にもかかわらず、面談受けて、いきなり知っている資料を棒読みされたら、それだけでテンションだだ下がりです。**ちゃんと企業研究して見てきたから、わざわざ読みあげなくても良いです。時間の無駄です**。せめて読み上げる前に、「この資料見られました？」とか聞いてください。

### ×経験不足な若手が出てきた

若い子が出てきてシドロモドロに話されたら。「この会社大丈夫？」「本気でエンジニア採用しようとしているの？」「ちゃんとエンジニアに投資しようという意識があるの？」と感じてしまいます。採用のしかもその入口のカジュアル面談は割と重要で、特にプロマネ経験者とかが募集に来ているのに、そこに経験が圧倒的に不足してそうな若手が出てくると、**本気で良いエンジニアの獲得を意図していない企業**と判断してしまいます。

### ×全然カジュアルじゃなくて、圧迫感満載

アイスブレイクなし、いきなり「なんで転職しようとしているの？」「その理由はネガティブであんまり受け良くないよね」とか言われたらどうでしょうかね？**高圧的な人が上司になったら**って考えると、もうその時点でその会社は嫌になります。

### ×CTOや社長が出てきたのに、面白くない
経営層が出てきて、スライドを読み上げてこっちの反応を見ている、みたいなケースも多々ありました。貴重な経営陣のリソースを割いて、しかもクソ面白くないスライド読み上げなんてされたら、「この会社駄目そう」って純粋に思いますよね。**経営陣に信頼が持てない企業に就職したいですか？したくないです**
(UNO)8ビット機で-1を作って遊ぶ。あと-3も



●　-1の作り方は、全ビット反転して+1する。


aを一時ワークとする

反転は、「~」

例 ~a

aに+1は、インクルドという、インクルドは、「++」

例 a++


処理を連続させる

例 a = ~a
   a++

こんな感じ


```
a = ~1;
a++;

```

結果

![o_coq337.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/dcf2b725-ead0-fbe6-dc67-4c697f4cae25.jpeg)



プログラム


```c++


//mainasu_1_asobu_UNO_1

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  Serial.println();
  Serial.println("START");
  Serial.println();
}

// the loop routine runs over and over again forever:
void loop() {
  
  char a,b;

  a = ~1;
  a++;

  b = ~3;
  b++;
  
  Serial.println((int)a);
  Serial.println((int)b);
  
  delay(3000);        // delay in between reads for stability
  
}

 
```
Next.js チュートリアル Chapter6~

# Chapter6 Setting Up Your Database

[chapter6](https://nextjs.org/learn/dashboard-app/setting-up-your-database)

## [Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers)

Route Handlers allow you to create custom request handlers for a given route using Web Request and Response APIs.

Route Handlers are defined in a `route.ts|js` file inside the `app` directory.

```
export async function GET() {
  try {
    await client.sql`BEGIN`;
    await seedUsers();
    await seedCustomers();
    await seedInvoices();
    await seedRevenue();
    await client.sql`COMMIT`;

    return Response.json({ message: 'Database seeded successfully' });
  } catch (error) {
    await client.sql`ROLLBACK`;
    return Response.json({ error }, { status: 500 });
  }
}
```

localhost:3000/seedにgetリクエストが送られて、
上のgetメソッドが実行される。

# Chapter7 Fetching Data
let's discuss the different ways you can fetch data for your application, and build out your dashboard overview page.
Client component and Server component

# How are Server Components rendered?

Next.js will use React's APIs to render a static HTML preview on the server for both Client and Server Components.

1. React renders Server Components into a special data format called `RSC Payload`.
1. Next.js uses the RSC Payload and Client Component JavaScript instructions to render HTML on the server.

Then, on the client:
1. The HTML is used to immediately show a fast non-interactive preview of the route.
1. `RSC Payload` is used to reconcile the Client component and Server component trees, and update DOM.
1. JS instructions are used to hydrate Client components and make the application interacitve.

## Subsequent navigation
On subsequent navigations, Client Components are rendered entirely on the client, without the server-rendered HTML.
初めのloadの時だけ、HTMLを用意するためにserverでも実行される。

### use clientでboundaryを貼る。
```
"use client"

import SideNav from '@/app/ui/dashboard/sidenav';
 
export default function Layout({ children }: { children: React.ReactNode }) {
  console.log("layout")
  return (
    <div className="flex h-screen flex-col md:flex-row md:overflow-hidden">
      <div className="w-full flex-none md:w-64">
        <SideNav />
      </div>
      <div className="flex-grow p-6 md:overflow-y-auto md:p-12">{children}</div>
    </div>
  );
}
```

例えば上のコードだったら`Side Nav`は自動的にクライアントコンポーネントになるから描かなくていい。ただchildrenで渡される中身は、サーバーコンポーネントにもできる。
人からもらったbatファイルがうまく動かない！？よくあるパターンと解決策

## はじめに
皆さんは人からもらったbatファイルがうまく動かなかったり、人に渡したbatファイルが動かないといわれた経験はありませんか？
こういった現象にはいくつか原因がありますが、今回は一番よく起こるパターンの原因・対策を紹介します！

## よくあるパターン
同期や友達の間で起こっているのを見かけたことが何度かありますが、
最も多かった原因は「改行コードがLFになっている」というパターンです。

## 原因
Windowsで動作するbatファイルにはルールがあり
- 改行コードがCRLFであること
- 文字コードがShift-JISであること(日本語を含む場合)
といったルールがあります。
文字コードは最悪文字化けするだけなのでまだましですが、改行コードを誤ると正常な動作をしなくなる場合があります。
そのため人にあげたbatが動作不調の場合は改行コードをまず疑ってみてください！
## どういったシチュエーションで発生するの？(余談)
あるあるで行くとgitです、gitはLinuxベースのため特に設定を変更していない場合はプッシュの際に自動的に改行コードがLFに変換されます。

あと最近見かけた中でこんなパターンもあるのか、、と感心したパターンがあり、
それがDiscordです。Discordは制限文字数を超えて送信しようとするとテキストファイルで送信しないか？という提案をしてきます。それに従って送信するとこちらもLFに変換されてしまうのでダウンロードして使おうとするとおかしな動作をするケースがあります。(貼り付けて送るのではなく、batファイルをそのまま添付すれば大丈夫です。)

## 実際に試してみた
どうおかしくなるかを見るために、適当なコードをAIに吐かせて少し手を加えてみました。
```
@ECHO OFF
chcp 65001

:INPUT_START
ECHO Ver.1.0.0
ECHO  テキストを入力してください。
SET /P INPUT_STR=

IF "%INPUT_STR%"=="" GOTO :INPUT_START

rem Defining a multi-line variable
set "MULTI_LINE_VAR=First line
Second line
Third line"

rem Echoing the multi-line variable
echo %MULTI_LINE_VAR%

rem Creating a temporary file to simulate commands
echo echo Hello World > temp_script.bat
echo echo This should be on a new line >> temp_script.bat

rem Executing the temporary script
call temp_script.bat

rem Cleaning up the temporary file
del temp_script.bat

rem Loop with delayed expansion to demonstrate issues with LF
setlocal enabledelayedexpansion
for %%i in (1 2 3) do (
    set "var=%%i"
    echo Loop iteration: !var!
    if %%i==2 (
        echo This should only print for iteration 2
    )
)

rem Checking for an undefined variable and using delayed expansion
if not defined NON_EXISTENT_VAR (
    echo Variable is not defined
) else (
    echo Variable is defined
)

rem Attempt to run a multiline command with LF issues
(
echo This is the first part of a multi-line command
echo This is the second part that might break
) > multiline_test.txt

type multiline_test.txt

rem End of script
exit /b

```
内容は深く触れませんが、本来の動きで行くと
何か文字入力を受け付け
↓
空文字でない場合はtxtファイル作成
空文字ならもう一度入力待ちに戻る

という何の意味もないコードです。

実行するとこのように入力待ちになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865325/fcf6ae96-7c6a-40fa-5c93-53e563780986.png)

そしてbatの改行コードを無理やりLFに変換
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865325/93e57191-809e-2da9-4b7f-27bc962f339e.png)

そして実行すると、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865325/d9ecc52f-55a4-9e8d-2289-b17644d8c27b.png)
画像ではわかりにくいですが、このエラーが超高速でターミナル上に流れ続ける無限ループに陥ってしまいました。。

今回は一例ですが、書いてあるコードによっていろいろなパターンの動作不良が起こります。

## さいごに
よくあるパターンですが、初めて出会うと動いていたコードをほかの人に渡した途端動かなくなるなんて狐につままれたような感覚に陥ります。(私もはじめは正常に動いているものとWinMergeするまで気づけませんでした、、)

なので、**改行コードには気を付けましょう！**
Intune 構成プロファイルの割り当てグループをどうするか

## 前置き
Intune の構成プロファイルを利用していると割り当て先をどのように構成すべきかというか、という疑問が浮かびます。特にグループポリシーを利用していた方であれば、挙動にどのような差異があるのかといった部分も含めて混乱する部分も多いと思うので、本稿で整理したいと思います。

## 本記事の概要
**この記事で書くこと**

Intune 構成プロファイルのグループ割り当てに関して、以下に焦点を当てて整理します。

① 構成プロファイルの割り当てグループについて、グループポリシーのように構成プロファイルの中身ごとに考慮する必要があるのか（例えばスコープがユーザーの CSP に対し、デバイスグループを適用しても割りあたらないといったことはあるのか）

② そもそも構成プロファイル（Windows CSP）について、デバイス全体に設定が適用されるものと各ユーザーに適用されるものは分かれるのか

**想定する読者**
 - Intune の仕組みを理解しておきたい方
 - Intune の設計を担当されている方 etc

## 結論
以下のとおりです。

> ① 構成プロファイルの割り当てグループについて、グループポリシーのように構成プロファイルの中身ごとに考慮する必要があるのか（例えばスコープがユーザーの CSP に対し、デバイスグループを適用しても割りあたらないといったことはあるのか）

A. 基本的には必要ない

> ② そもそも構成プロファイル（Windows CSP）について、デバイス全体に設定が適用されるものと各ユーザーに適用されるものは分かれるのか

A. 分かれる

## 結論までの道のりと補足
色々な媒体を探したのですが、結局上記の結論の根拠については MS Learn にドンピシャな記載がありましたので以下に引用します。

**① 構成プロファイルの割り当てグループについて、構成プロファイルの中身ごとに考慮する必要があるのか（例えばスコープがユーザーの CSP に対し、デバイスグループを適用しても割りあたらないといったことはあるのか）**

こちらについては設定内容によって、グループの種別（デバイスなのかユーザー）なのかを気にするといった必要はなさそうです。もちろん設計上考慮すべきことはほかにもありますので、なんでもかんでも割り当ててもよいというものではないと思いますが...

>次のリストには、スコープ、割り当て、および予想される動作の可能な組み合わせがいくつか含まれています。
> - デバイス スコープ ポリシーがデバイスに割り当てられている場合、そのデバイス上のすべてのユーザーにその設定が適用されます。
> - デバイス スコープ ポリシーがユーザーに割り当てられている場合、そのユーザーがサインインして Intune 同期が行われると、デバイス スコープ設定がデバイス上のすべてのユーザーに適用されます。
> - ユーザー スコープ ポリシーがデバイスに割り当てられている場合、そのデバイス上のすべてのユーザーにその設定が適用されます。この動作は、ループバックが merge に設定されているのと似ています。
> - ユーザースコープのポリシーがユーザーに割り当てられている場合、その設定はそのユーザーのみに適用されます。
> - ユーザー スコープとデバイス スコープで使用できる設定がいくつかあります。これらの設定の 1 つがユーザー スコープとデバイス スコープの両方に割り当てられている場合、ユーザー スコープがデバイス スコープよりも優先されます。

**② そもそも CSP（構成プロファイル）について、デバイス全体に設定が適用されるものと各ユーザーに適用されるものは分かれるのか**

そもそも Windows の仕組み上レジストリがコンピュータとユーザーで分かれていますから、これは当然と言えば当然のことながら異なります。



>Intune からポリシーを展開するときに、任意の種類のターゲット グループにユーザー スコープまたはデバイス スコープを割り当てることができます。 ユーザーごとのポリシーの動作は、設定のスコープによって異なります。

**引用元**

https://learn.microsoft.com/ja-jp/mem/intune/configuration/settings-catalog?tabs=sc-search-filter%2Csc-reporting#scope-assignment-behavior

ちなみにどちらのスコープで適用できる設定なのかは MS Learn で公開されています。
以下はその例です。

- デバイス レベル・ユーザーレベルの両方で構成できるもの

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690370/0b89b53c-445c-c2dc-d50d-a6bb6a99f4b0.png)

- ユーザー レベルでのみ構成できるもの

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690370/0363cf29-b85d-cc0a-dd9a-ecb90a9911a1.png)

**引用元**

https://learn.microsoft.com/ja-jp/windows/client-management/mdm/configuration-service-provider-support

以上です。

## 最後に
冒頭にも書きましたが、グループポリシーですとコンピュータの構成とユーザーの構成で適用できるオブジェクトが異なりましたが、Intune では異なるようです。
となるとどのように設計するのが良いのか、という観点もグループポリシーとは異なってくるのかと思います。そのあたり含めもう少し調べたことがあるので、そちらは別途記事にまとめたいと思います。

Intune に苦しむすべてのエンジニアの助けになれば幸いです。
PythonでAPIを取得する時の注意点

<!-- PythonでAPIを取得する時の注意点 -->

## PythonでAPIを取得する

PythonでAPIを扱うときは、以下のようなライブラリを使うことが多いと思います。

```python
import requests
import json
```

```requests```はAPIリクエストを送るためのライブラリで、```json```はJSON形式のデータを扱うためのライブラリです。基本的にAPIを叩くとJSON形式でデータが返ってくるので、それを変換してやる必要があります。

しかし、APIを叩く際にはいくつか注意点があります。特に、URLエンコードに関する注意点があります。日本語や特殊文字を含むURLをリクエストする際には、URLエンコードを行う必要があります。

```python
import requests
import json
import urllib.parse

param="日本語や特殊文字を含むパラメータ"
url = 'https://example.com/api?param='
encorded_param = urllib.parse.quote(param)
url += encorded_param
response = requests.get(url)
data = json.loads(response.text)
```

パーセントURLエンコードを行うためには、```urllib.parse.quote()```を使います。これで日本語や特殊文字を含むURLをリクエストすることができます。具体的に言うと、以下のようなURLがエンコードされます(上のコードとは関係ありません)。

```
https%3A%2F%2Fja.wikipedia.org%2Fwiki%2F%25E6%2596%25B0%25E4%25B8%2596%25E7%25B4%2580%25E3%2582%25A8%25E3%2583%25B4%25E3%2582%25A1%25E3%2583%25B3%25E3%2582%25B2%25E3%2583%25AA%25E3%2582%25AA%25E3%2583%25B3&usg=AOvVaw2Pi4nFYyX41yEBpz_jlsLX&opi=89978449
```

これによって、意図した通りのAPIリクエストを送ることができます。基本的には、URLエンコードを行っておけば問題ないでしょう。

## 追記

コメントで実行時エラーが起きるとのご指摘をいただいたのでコードを修正しました。ご指摘ありがとうございます。

## 参考

[PythonでURLエンコードする際の初歩的なミス #Python3 - Qiita](https://qiita.com/TekuLion/items/294b922aada8c5d5201c)
【Shell】特定のフォルダ内のファイル数を数える方法


## `ls`コマンド

`ls`コマンドを使用してファイル数を出力するには以下のように実行します。  

```zsh
ls -fp パス | grep -v / | wc -l
```

* `ls -fp パス`  
  ディレクトリ内のファイル一覧を表示。  
  ファイルを並べ替えずドットファイルも含めて表示。  
  ディレクトリの場合`/`を出力。  
* `grep -v /`  
  `/`を含まないもののみ出力。
* `wc -l`  
  出力結果の行数をカウント。

## `find`コマンド

`find`コマンドを使用してファイル数を出力するには以下のように実行します。  

```zsh
find パス -type f | wc -l
```

* `find パス -type f`  
  指定したパス以下の全ファイルのパスを出力。
* `wc -l`  
  出力結果の行数をカウント。
【TypeScript】filterのコールバックを英文っぽくリファクタする

# はじめに
filterのコールバックって、条件が多くなってくると見づらいですよね
最近思いついたリファクタが、めちゃ初歩的で地味だけど
案外気に入ってるので記事にしてみます

# Before

車の情報を持つinterfaceがあるとします
```ts
interface Car {
    name: string
    type: CarType
    color: BodyColor
}

enum CarType {
    VAN,
    SUV,
    COUPE,
}

enum BodyColor {
    BLACK,
    WHITE,
    RED
}
```
`Car`の配列があるとします

```ts
const cars: Car[] = [
    {name: 'HIACE', type: CarType.VAN, color: BodyColor.BLACK},
    {name: 'LAND CRUISER', type: CarType.SUV, color: BodyColor.WHITE},
    {name: '86', type: CarType.COUPE, color: BodyColor.RED},
    {name: 'CARAVAN', type: CarType.VAN, color: BodyColor.RED},
    {name: 'HILUX SURF', type: CarType.SUV, color: BodyColor.BLACK},
    {name: 'SUPRA', type: CarType.COUPE, color: BodyColor.WHITE},
]
```
黒いSUVが大好きなので
「<font color='lightgreen'>**`CarType` が `SUV`、かつ `BodyColor` が `Black`**</font>」
の条件でfilterしたいとします

```ts
const suvList1 = cars.filter(car => car.type === CarType.SUV && car.color === BodyColor.BLACK)
```
普通にfilterしたらこうですね

# After

`by` というfilterのコールバックを作ります

```ts
const by = (type: CarType, color: BodyColor) => (car: Car) => {
    return car.type === type && car.color === color
}
```
filterの条件となる引数 `type`, `color` を受け取り、関数を返します。
返される関数は`car`を受け取り、条件のbooleanを返します

`by`コールバックを使ってみるとこうなります
```ts
const suvList = cars.filter(by(CarType.SUV, BodyColor.BLACK))
```

>*Cars filter by SUV and BLACK*

気持ち良いくらい英文的で綺麗なコードになりました

# おわりに

めっちゃ地味だけど、結構好きなリファクタです

ただスコープ内に複数コールバック作りたい時は命名に困るので
declare globalで`filterByXX`みたいな拡張関数作っても良いけど
お手軽にできるところはいいところですね

可読性にはとことんこだわりたい
ConvertTo-SecureStringが動かない

# PowerShell(7以降)でConvertTo-SecureStringが動かない事がある
PowerShellでスクリプトを書いていて~~遊んでいて~~とてもはまった出来事。

## 何のことか
* PowerShell7がインストールされている環境でスクリプト(PythonやJavaScript[^1])経由で[ConvertTo-SecureString](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.security/convertto-securestring?view=powershell-7.4 "ConvertTo-SecureString")を呼ぶとなぜか失敗する
* PowerShell7のコマンドプロンプトやConvertTo-SecureStringや(Windowsで標準インストールされている)PowerShell5から呼び出した場合は動作する

## サンプルコード
以下のサンプルコードはPowerShell 7環境から呼び出すと失敗します。
```python
#!/usr/bin/env python3
import subprocess
PWSH = 'powershell -Command'
def run_powershell(cmd: str) -> None:
    '''PowerShellコマンドを実行する'''
    cmd = f'{PWSH} "{cmd}"'
    rslt = subprocess.run(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True, encoding='cp932')
    if rslt.stdout:
        print('成功')
        for v in rslt.stdout.splitlines():
            print(v)
    else:
        print(f'失敗: {cmd}')
        for v in rslt.stderr.splitlines():
            print(v)
def main():
    cmd = 'ConvertTo-SecureString -AsPlainText \\"hogehoge\\" -Force'
    run_powershell(cmd)
if __name__=="__main__":
    main()
```

## どういうことなのか
スクリプト経由でPowerShellのコマンドを呼び出す場合、各スクリプトの新しいプロセスを呼び出す関数(Pythonだと[subprocess.run](https://docs.python.org/ja/3/library/subprocess.html "subprocess")辺り)を使います。
このとき、PowerShellのコマンドを使う場合は実行関数としてpowershell.exe[^2]を、引数として-Commandを使います。
このときの動作は以下の流れになります。
powerShell 7 → cmd → powershell → ConvertToSecureString
どうやらこの処理に[バグがある](https://github.com/PowerShell/PowerShell/issues/18530 "バグがある")ようで、ConvertToSecureString関数が実行ファイルを見つけられず失敗してしまうようです。

## 対処方法
対処方法としては以下の二種類があります。
1. PowerShell5から実行する
1. 環境変数PSModulePathの値を削除する
上記コードの該当箇所を以下のように変更する。
```python
#    cmd = 'ConvertTo-SecureString -AsPlainText \\"hogehoge\\" -Force'
    cmd = 'Remove-Item Env:PSModulePath;ConvertTo-SecureString -AsPlainText \\"hogehoge\\" -Force'
```

## 最後に
日本語の情報が無くて本当に苦労したよ…

[^1]: JavaScriptでの議論は[この辺](https://stackoverflow.com/questions/77799980/nodejs-child-process-exec-vs-powershell-ise-why-are-the-results-different "この辺")
[^2]: pwshでも同じ
情報学部一年生の半年間

## はじめに
初めまして、大学一年生のたまちゃです
私は大学に入学してからプログラミングを始めました。
所属している情報団体のイベントで記事を書くことになりましたが、本当に書くことがなく悩んだ結果、自身の備忘録として、情報学部一年の前期をまとめることにしました。
初めて記事を書くので、読みにくいと思いますが、頑張ったので許してください🥺

## 入学動機
IT関連の仕事に就いている父にお金稼げるよって教えてもらったので、大して調べもせず入学を決めました。不純な動機でいつも生きている気がします。

## 入学
入学前にブートキャンプなるものがありました。
まだ右も左も分からないのに野放しにされ、四日間という短い開発期間でM5Stackを用いて、アプリを設計・開発し発表するというものでしたが、これが本当に地獄でした。
何ができるのかわからない上に思いついたことはできないし、3人チームで作っていましたが全員知識がないので何も進まず……
知識も技術ないのに開発なんて無理よりの無理です。2度と、やりたくないです。

## 前期授業開始
ブートキャンプによってトラウマを植え付けられましたが、ここで負けるわけにはいきません。 
でも大学一年生の授業はあんまり専門科目がないだろうと思ってちょっと舐めていたので、3科目も情報関連の授業があったのは驚きました。やはり戦い。どれも難しかったですが、その中でも最も勉強時間のかかった科目は**プログラミング基礎1**でした。

## プログラミング基礎1について
Javaについての授業で、予習した内容を軽く解説した後に課題をする演習型の授業でした。
授業の最初にある予習確認テスト、課題、中間期末テストの全てが評価点に影響するため、毎授業気を抜けず予習と復習にとてつもない時間を取られて、本当に苦しかったです、、、
環境構築もつまづいたし、今もなお委譲でつまずいているし、ずっとつまずいている気がします。でも一番力がついたのもこの授業だなと感じます！入学した時は何もわからなかったのに、Javaの基本文法がある程度わかるようになったのはほんとにすごい進歩！！！言ってることがわかるの嬉しいです^-^後期も楽しみです。

## 前期の振り返り
なんの知識もないまま大学に入ってすごく不安でしたが、なんとか生きて乗り越えられてよかったです。プログラミング関連の授業以外も頑張れたし、知識が増えたと身に染みて感じます。
後期は授業だけでなく、自分でプログラミングに触れる時間を作っていきたいです。

## 終わりに
ここまで読んでくださってありがとうございます。自分のことについて書くって難しいですね。最初から最後まで何を言いたいのかわからなかったです。またいつかちゃんと書き方を調べて書いたりしてみたいです。ありがとうございました✌️
【AWS基礎】AWSのサポートまとめ

## AWSサポートを利用するメリット
- AWSの知識と経験が豊富な専門家によるサポートで、迅速な構築が可能になる。
- AWS Personal Health DashboardやAWS Trusted Advisor などのツールで、環境が適切に実行されつづけるための支援を受けられる。
- インフラストラクチャの管理をAWSに任せ、ビジネスにフォーカスできる。
- 厳格なセキュリティ基準を維持し、注意が必要な問題点について事前に警告を受けることができる。


## 1. ベーシックサポート
すべてのAWSユーザーに無料で提供されるプラン。
技術サポートは含まれていないが、
- AWSリソースへのアクセス
- ドキュメントやフォーラム、サポートケースへのアクセス
- Trusted Advisorの7つの主要チェック
を行うことができる。

## 2. 開発者サポート
AWSでテストまたは初期開発を行っており、営業時間中にテクニカルサポートを利用したい場合や、構築とテストを行う際の一般的なアーキテクチャガイダンスが必要な場合等に利用する。
- 料金：最小29USD/月、または使用量の3%
  ※料金は、最低請求額の29USDまたは計算結果のどちらか高い方になる。
- サポート内容：
  - ケース数は無制限
  - 一般的なガイダンスの応答時間は、24営業時間内
  - システム障害の応答時間は、12営業時間以内
  - 年中無休のカスタマーサービス、ドキュメント、ホワイトペーパー、サポートフォーラムの利用

## 3. ビジネスサポート
プロダクション環境をサポートし、ダウンタイムを最小限にするためのプラン。
- 料金：最低100USD/月、または使用量の10%（利用額が増えるほど割合が減少）
  ※料金は、最低請求額の100USDまたは計算結果のどちらか高い方になる。
- サポート内容：
  - 24時間365日の技術サポート（電話・チャット対応あり）
  - 本番システムがダウンした場合、1時間以内の対応
  - ベストプラクティス、監査、アーキテクチャサポート
  - Trusted Advisorによるすべてのチェックを利用可能

## 4.Enterprise On-Rampサポート
ビジネスサポートとエンタープライズサポートの間のサポート
- 料金：最低 5,500 USD/月、または使用量の10%
  ※料金は、最低請求額の5,500USDまたは計算結果のどちらか高い方になる。
- サポート内容：
  - 24時間265日のテクニカルサポート
  - ビジネスに不可欠なシステム停止の場合、30分以内の緊急サポート対応
  - 生産システム停止の場合、1時間以内のサポート対応
  - 生産システムの障害の場合は4時間以内のサポート対応
  - システム障害の場合は、12時間以内のサポート対応
  - テクニカルアカウントマネージャー(TAM) がアプリケーションやユースケースに応じたアーキテクチャや運用のコンサルティングガイダンスを提供

## 5. エンタープライズサポート
大規模なエンタープライズ企業向けの最上位プランであり、企業が大規模なAWS環境を運用する際に必要な全方位のサポート
- 料金：最低15,000USD/月、または使用量の10%（利用額が増えると割合が減少）
　※料金は、最低請求額の15,000USDまたは計算結果のどちらか高い方になる。
- サポート内容：
  - 24時間265日のテクニカルサポート
  - ビジネスに不可欠なシステム停止の場合、15分以内の緊急サポート対応
  - 生産システム停止の場合、1時間以内のサポート対応
  - 生産システムの障害の場合は4時間以内のサポート対応
  - システム障害の場合は、12時間以内のサポート対応
  - 専任のAWSアカウントマネージャー（TAM）がアサインされる
  - AWSの各種リソースやアーキテクチャのパフォーマンスレビュー