OmniAICreator/Qiita-1.07M huggingface dataset:
sudoできるコマンドの制限を行う


# 概要
sudoコマンドにより、コマンドの実行単位でroot権限を与えることができます。
しかし、誰でもsudoでコマンドを実行できてしまうとセキュリティ上のリスクなどがあります。
本記事では`/etc/sudoers.d/`を編集することで特定コマンドのみsudoが利用できるようにする方法を記載します。

# 手順
確認用のユーザを二人作成します。`inu` はどのコマンドに対しても`sudo`できるようにしますが、`neko` には一部のコマンドのみ`sudo`できるようにします。
```
$ sudo useradd neko
$ sudo useradd inu
$ cat /etc/passwd

neko:x:1005:1006::/home/neko:/bin/bash
inu:x:1006:1007::/home/inu:/bin/bash
```
passwordを設定します。

```
sudo passwd inu
sudo passwd neko
```

`inu`ユーザに切り替えます。
```
sudo su - inu
```

`/etc/shadow`というroot以外は見れないファイルを表示しようとするとエラーになります。

```
cat /etc/shadow
cat: /etc/shadow: Permission denied
```
sudoで実行しようとすると、`inu`ユーザはそのままでは`sudo`が使用できないためエラーとなります。
```
$ sudo cat /etc/shadow

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for inu: 
inu is not in the sudoers file.  This incident will be reported.
```

そこで`inu`を`wheel`グループに追加します。`wheel`グループは管理者用のグループで
所属していれば、sudoが使えます。



```
$ sudo usermod -aG wheel inu
$ id inu
uid=1006(inu) gid=1007(inu) groups=1007(inu),10(wheel)
```

再度実行すると表示できます。`inu` は`sudo`できるようになりました。

```
$ sudo cat /etc/shadow
[sudo] password for inu: 
neko:$6$JgG4FEzR$qS5shTmSRELEOouzpKxU8OnekhYQt0x9Lk57m5GK8o7fYpIT/Hq652cjK6Lh5IN4dKWWOqK4Gp6WGxBX59ghc/:19806:0:99999:7:::
inu:$6$6G50Hray$nTLrHZ2XCqI7NDcPHyKPkG33Bf3P3SuZes4GvUj0sYXjIEkei4Lvjpj8UavlQvd5YzSdfKuty.BcB0L4O6wGi0:19806:0:99999:7:::
```

では次に`neko`に特定のコマンドのみsudo実行ようにします。
`/etc/sudoers.d`以下にファイルを作成します。`visudo`は`sudoers`を編集するためのコマンドです。
```
$ sudo visudo -f /etc/sudoers.d/allow_command
```
viが開いたら、以下のように記載します。
ここでは`cat /etc/shadow`のみ実行できるようにします。

```/etc/sudoers.d/allow_command
Cmnd_Alias ALLOW_SUDO = /bin/cat /etc/shadow
neko ALL=ALLOW_SUDO
```


`neko`に切り替えてから、`sudo cat /etc/shadow`を実行すると
エラーなく実行できます。

```
$ sudo su - neko
$ sudo cat /etc/shadow
neko:$6$JgG4FEzR$qS5shTmSRELEOouzpKxU8OnekhYQt0x9Lk57m5GK8o7fYpIT/Hq652cjK6Lh5IN4dKWWOqK4Gp6WGxBX59ghc/:19806:0:99999:7:::
inu:$6$6G50Hray$nTLrHZ2XCqI7NDcPHyKPkG33Bf3P3SuZes4GvUj0sYXjIEkei4Lvjpj8UavlQvd5YzSdfKuty.BcB0L4O6wGi0:19806:0:99999:7:::
```

ですが、`allow_command`以外のコマンドで`sudo`しようとするとエラーになります。
`neko`の`sudo`できるコマンドに制限が出来ました。

```
$ sudo useradd taro
Sorry, user neko is not allowed to execute '/sbin/useradd taro' as root

```


# 参考資料
https://qiita.com/RuyPKG/items/39505dbd35b6e8d2d86e

https://linuc.org/study/column/4047/

https://beyondjapan.com/blog/2022/05/sudoers/

https://linuc.org/study/knowledge/510/

https://linuc.org/study/column/4077/
Spring Boot & Vue.js　新規プロジェクト

## Next & Vue.js　新規プロジェクト

### 開発環境
- Visual Studio Code
- Vue

#### Visual Studio Code
```
マイクロソフトが開発したMSの開発ツールの中で、最初にクロスプラットフォームをサポートする
エディターであり、Windows、macOS、Linuxをすべてサポートしています。
拡張機能という最大の強みを持ち、単なるエディター以上にIDEレベルまで拡張することができるのが特徴です
```
- [VsCod:Download URL](https://code.visualstudio.com/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754702/6b31b6e3-6b18-ac31-99af-7a9ff64fd8cd.png)

#### Vue
```
Vue.jsは、ウェブ開発のために開発された大衆的なJavaScriptフロントエンドフレームワークで、
ページの更新なしにUI変更が可能だ。 
初心者が使いやすく、React.jsやAngular.jsに比べて学びやすい。 
AngularはTypescriptを強制的に書かなければならず、
Reactはjavascript文法を多く使用する(Javascriptに弱いと難しいかもしれない。)。 
Vueは新しい文法を使わなければならないが、簡単で早く学ぶことができる。
レンダリング速度もまた、他のフレームワークと比べて遅れをとらず、
ライブラリサポートのアップデートも継続的に行う安定したフレームワークである。
```
##### Download準備
- [Node.js:Download URL](https://nodejs.org/en/download)
```
Node.js(ノードジェイエス)はJavaScriptランタイム環境で、
Chrome V8 JavaScriptエンジンの上に構築されています。 
これにより、JavaScriptでサーバ側のアプリケーションを開発できます。 
Node.jsはイベントベース、非同期式入出力(I/O)をサポートし、高い性能と拡張性を提供します。
主にサーバサイドウェブアプリケーションの開発に使用され、
HTTPサーバを作成したり、ファイルシステムにアクセスしたりするなど、さまざまな作業を処理できます。
Node.jsはnpm(Node Package Manager)を通じて様々なライブラリとパッケージを提供し、
開発生産性を高めるのに役立ちます。 Node.jsはJavaScript言語をベースにしており、
クライアントとサーバの間でコードを共有し、再利用できるメリットがあります。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754702/209d3a85-e6e5-8a02-5610-f21f2af76697.png)
- LTSを選択
```
LTSは"Long-Term Support"の略で、長期支援を意味します。
Node.jsのLTSバージョンは、対応期間が相対的に長い安定的なバージョンです。
このようなLTSバージョンは一般的にアップデート周期が長く、
セキュリティパッチおよびバグ修正が着実に提供されます。
したがって、LTSバージョンを選択すると、安定性と信頼性が高まります。
企業およびプロダクション環境では、主にLTSバージョンを使用することが推奨されます。
```

#### Projectを開く
- VsCodeからターミナルを開き、以下のコマンドを順番的に実行する。
```
 １．npm install -g @vue/cli
 ２．npm ls -g
 ３．Set-ExecutionPolicy RemoteSigned
 ４．create-next-app　プロジェクト名（例：testproject)
 ５．npm run dev
```
gRPCを用いた使用例

## はじめに
gRPCを用いたエンドポイントとリクエスト、レスポンスデータのセットの備忘記録です。
例えばSample/GetDataというエンドポイントを通じてクライアントからのリクエストを受け取り、適切なレスポンスを返すプロセスを実装例を記載します。

## 環境構築
以下を参考に環境を作りました。（非常に簡易に作れる)

https://qiita.com/totoaoao/items/6bf533b6d2164b74ac09

## 今回試すファイルを修正と対応
ファイル構成
```
.
├── client
│   └── main.go
├── go.mod
├── go.sum
├── grpc_sample
│   ├── sample.pb.go
│   └── sample_grpc.pb.go
├── proto
│   └── sample.proto
└── server
    └── main.go
```

proto/sample.goを以下のように記載
```proto
syntax = "proto3";
package sample;

option go_package = "../grpc_sample";

// リクエストメッセージに新しいフィールドを追加します。
message GetDataRequest {
  string num_type = 1;
}

// ユーザーデータ型を定義します。
message UserData {
  string user_id = 1;
  string user_name = 2;
}

// レスポンスメッセージに新しいフィールドを追加します。
message GetDataResponse {
  repeated UserData user_datas = 1;
  int32 num_max = 2;
}

service SampleService {
  // リクエストとレスポンスメッセージの型を更新します。
  rpc GetData(GetDataRequest) returns (GetDataResponse) {}
}

```

protoファイルがある場所で以下を実行
```bash
protoc  --go_out=. --go-grpc_out=require_unimplemented_servers=false:. sample.proto
```
server/main.goを以下のように記載。
responseでデータをセットしています。
```go
package main

import (
	"log"
	"net"

	"github.com/example/grpc_sample"
	"golang.org/x/net/context"
	"google.golang.org/grpc"
)

func main() {
	log.Print("main start")

	// 9000番ポートでクライアントからのリクエストを受け付けるようにする
	listen, err := net.Listen("tcp", ":9000")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	grpcServer := grpc.NewServer()

	// Sample構造体のアドレスを渡すことで、クライアントからGetDataリクエストされると
	// GetDataメソッドが呼ばれるようになる
	grpc_sample.RegisterSampleServiceServer(grpcServer, &Sample{})

	// 以下でリッスンし続ける
	if err := grpcServer.Serve(listen); err != nil {
		log.Fatalf("failed to serve: %s", err)
	}

	log.Print("main end")
}

type Sample struct {
	name string
}

func (s *Sample) GetData(
	ctx context.Context,
	req *grpc_sample.GetDataRequest, // リクエストの型を更新します。
) (*grpc_sample.GetDataResponse, error) { // レスポンスの型を更新します。
	log.Print("Received num_type: ", req.NumType)

	// ここでuser_datasとnum_maxを設定します。
	userDatas := []*grpc_sample.UserData{
		// ここにユーザーデータを追加します。
		{UserId: "1", UserName: "ユーザー1"},
		{UserId: "2", UserName: "ユーザー2"},
		// ...
	}
	numMax := int32(len(userDatas)) // 例として、userDatasの長さをnum_maxとしています。

	// レスポンスを作成して返します。
	response := &grpc_sample.GetDataResponse{
		UserDatas: userDatas,
		NumMax:    numMax,
	}
	return response, nil
}

```


server/main.goを実行
(serverフォルダにて実行)
```go
go run main.go
```

## 結果確認
PostManで確認
以下より、main.goの実行に成功し、Sample/GetDataエンドポイントを介してクライアントからのリクエストを受け取り、適切なレスポンスを返すことが確認できました。
![スクリーンショット 2024-03-24 17.40.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176603/fd57c594-febb-ae49-52b6-70b67938eb27.png)

リクエストはコマンドのメッセージにて確認
```
2024/03/24 17:23:01 main start
2024/03/24 17:23:08 Received num_type: Lorem consectetur do
2024/03/24 17:23:28 Received num_type: Lorem consectetur do
2024/03/24 17:24:39 Received num_type: 3
```

## おわりに
gRPCは最初色々とっつきにくいですが、エンドポイント、リクエスト、レスポンスをどうセットするのかから確認しました。

## 参考記事
https://grpc.io/docs/languages/go/quickstart/

https://qiita.com/totoaoao/items/6bf533b6d2164b74ac09

https://zenn.dev/valmet083/articles/d98edd0cfc2441
binapの入黄記事

## 挨拶
にゃ～ん

## 本題
昨日のAtCoder Beginner Contest 347でAtCoderのレーティングが2000を超え、ついに入黄しました！
オンサイトやバーチャルコンテストでご一緒した皆様、日頃のコンテスト結果のポストにいいねを押してくださった皆様ありがとうございます！

![yellow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754351/fda9cd2e-f58e-c434-1838-a6698163b1d5.png)

## 話したい事
黄色になったけどコンテスト中に黄difの問題通せた記憶あまりないな。――と思って入青から入黄までのRated参加したコンテストのAC率を集計しましたがなんと打率1割以下。

![AC_rate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754351/9d8aea65-a063-0aa0-015a-6c93a4639873.png)

ということで黄difがそこそこ安定して通せるならきっとすぐ黄色に上がれるだろうし、解けなくても青dif以下をしっかり素早く倒せれば黄色に上がれるぞというお話。青→黄を目指す競プロerの希望になれたら幸い。

## 精進
おすすめの精進方法について軽く触れます。
- コンテストに参加しましょう
    - 体調不良/用事などでなければRatedで出ましょう。敵前逃亡は許されない
    - AtCoderが当然一番のお勧めですがyukicoder(ほぼ毎週/金21:00頃)やCodeforces(週2くらい/深夜😿)などもぜひ
- バーチャルコンテストに出よう
    - AtCoderでコンテストがない日は21:00からAtCoder Problemsでまよこんが開催されます。おおよそABCと同じようなセットが組まれているので実質一週間で7回ABCに出られると言っても過言ではない
- 解けない問題にしっかり悩みましょう
    - 悩んだけど実は特定のアルゴリズムを知ってますかというだけ、というケースも確かにあります。しかし「～～の理由でこの問題にこのアルゴリズムは使えない」という経験を積めば、失敗した試行の分だけ次回から「はずれ方針」から早く復帰できます
    - 手持ちのアルゴリズムを使い切るまでは悩みましょう

## アルゴリズム
優先度の高いアルゴリズムの話。黄dif、橙difの問題に精進してると知らないアルゴリズムが無数に押し寄せてきます。一個一個埋めていきますが、ぶっちゃけこいつらは数年に1度しか出ない気がします。
なので汎用性の高いアルゴリズムを深く学ぶ方が期待値は高そう。このレベル帯で丁度良いのをいくつか置いときます。

- (Lazy) Segment Tree
    - 最近ありえんくらい出てます。水dif、青difの重鎮
    - 基本的なモノイドたちはいつでも使えるように(https://betrue12.hateblo.jp/entry/2020/09/23/005940)
    - AtCoder Tagsにあるセグ木の問題をガンガン解きましょう(https://atcoder-tags.herokuapp.com/tags/Data-Structure/Segment-Tree)
- 平方分割
    - 結構いろいろなパターンがあります
    - 「数列＋クエリ」の問題でクエリを平方分割したり、逆に数列を平方分割したりなど
    - Mo's algorithmはその場で書こうとして破滅する人を何度か見ているのでライブラリ化推奨
- 文字列アルゴリズム
    - Rolling Hashは寒色でも必修になりました
    - Suffix Array＋LCPは強力。Z_algorithmを系として得ることも可能
    - Trie木勉強するならAho Corasick法もぜひセットで

## 末文
運よく黄色に上がれた側面が強いので今晩のARCで最速落青を決める可能性は割とあります。ちなみにCodeforcesはOrangeに上がった次のコンテストでVioletにひっそり転落してます。(ΔRating = -95)
お読みいただきありがとうございました。

## 追記
このあと無事落青しました。
.NET FrameworkでCOM参照

# 環境
Windows 11 Pro (64bit)

# 手順

```dev.bat
@echo off
path %path%;C:\Windows\Microsoft.NET\Framework64\v4.0.30319
path %path%;C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools
prompt $e[33m$p$g$e[m
cmd
```
任意のディレクトリに上記ファイルを用意し、`dev.bat`を実行する。

## CreateInstance

```speak1.cs
// csc speak1.cs
using System;
using System.Runtime.InteropServices;

class Program {
	static void Main() {
		Type t = Type.GetTypeFromProgID("SAPI.SpVoice");
		dynamic sapi = Activator.CreateInstance(t);

		sapi.Speak("hello, world");

		Marshal.ReleaseComObject(sapi);
	}
}
```

## TlbImp

```speak2.cs
/*
tlbimp C:\Windows\System32\Speech\Common\sapi.dll
csc /r:SpeechLib.dll speak2.cs
*/

class Program {
	static void Main() {
		var sapi = new SpeechLib.SpVoice();
		sapi.Speak("hello, world");
	}
}
```

dll / tlbのパスはレジストリ エディター（regedit）で`\\HKLM\SOFTWARE\Classes\CLSID\`の中からProgID（SAPI.SpVoiceなど）で検索。
warningは大量に出るが、160KBほどの`SpeechLib.dll`が作られる。

```
reg query HKLM\SOFTWARE\Classes\CLSID /f SAPI.SpVoice /s
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{96749377-3391-11D2-9EE3-00C04F797396} /s
```

## VisualBasic

```speak3.cs
// csc /r:Microsoft.VisualBasic.dll speak3.cs
using Microsoft.VisualBasic;

class Program {
	static void Main() {
		dynamic sapi = Interaction.CreateObject("SAPI.SpVoice");
		sapi.Speak("hello, world");
	}
}
```

```speak4.vb
' vbc speak4.vb

Module Program
	Sub Main
		Dim v = CreateObject("SAPI.SpVoice")
		v.Speak("hello, world")
	End Sub
End Module
```
Windowsのエクセルファイルの中身を横断的に検索

```ExcelKeywordFinder.ps1
# 事前設定
$scriptPath = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition

# 検索ディレクトリ
$searchDir = "D:\Dropbox\01.ビジネス"
Write-Host "検索ディレクトリ: $searchDir"

# 検索キーワード
$keyword = "1"
Write-Host "検索キーワード: $keyword"

# 除外するディレクトリのリスト
$excludeDirs = @(
    "D:\Dropbox\01.ビジネス\ExcludeDir1",
    "D:\Dropbox\01.ビジネス\ExcludeDir2"
)
Write-Host "除外するディレクトリ: $($excludeDirs -join ', ')"

# 結果を保存するファイル名に現在の日時を追加
$currentDateTime = Get-Date -Format "yyyyMMddHHmmss"
$resultFileName = "ExcelKeywordFinder_$currentDateTime.xlsx"
$resultFile = Join-Path -Path $scriptPath -ChildPath $resultFileName
Write-Host "結果ファイル: $resultFileName"

# メイン
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false

if (Test-Path $resultFile) {
    $resultWorkbook = $excel.Workbooks.Open($resultFile, $null, $true)
    Write-Host "既存の結果ファイルを開きます: $resultFileName"
} else {
    $resultWorkbook = $excel.Workbooks.Add()
    $resultWorkbook.SaveAs($resultFile)
    Write-Host "新しい結果ファイルを作成します: $resultFileName"
}
$resultSheet = $resultWorkbook.Sheets.Item(1)
$rowIndex = $resultSheet.UsedRange.Rows.Count + 1

# ファイルの検索と処理
Get-ChildItem -Path $searchDir -Include "*.xlsx", "*.xls", "*.xlsm" -Recurse | Where-Object {
    $exclude = $false
    foreach ($excludeDir in $excludeDirs) {
        if ($_.FullName.StartsWith($excludeDir)) {
            $exclude = $true
            break
        }
    }
    -not $exclude
} | ForEach-Object {
    $filePath = $_.FullName
    Write-Host "処理するファイル: $filePath"
    try {
        $workbook = $excel.Workbooks.Open($filePath, $null, $true)
        foreach ($worksheet in $workbook.Worksheets) {
            $found = $worksheet.UsedRange.Find($keyword)
            if ($found) {
                $cellAddress = $found.Address($false, $false, 1, $false)
                $matchedValue = $found.Text
                $resultSheet.Cells.Item($rowIndex, 1).Value2 = $filePath
                $resultSheet.Cells.Item($rowIndex, 2).Value2 = $cellAddress
                $resultSheet.Cells.Item($rowIndex, 3).Value2 = $matchedValue
                $rowIndex++
                $resultWorkbook.Save()
                Write-Host "    一致が見つかりました: セル $cellAddress, 内容 '$matchedValue'"
            }
        }
        $workbook.Close($false)
    } catch {
        Write-Host "    エラーが発生しました: $_"
    }
}

$resultWorkbook.Close($false)
$excel.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null

Write-Host "検索が完了しました。結果は $resultFile に保存されました。"
Write-Host "Enterキーを押して終了してください..."
$null = Read-Host
```
#8【勉強メモ】エヴァンス本からざっくり理解するDDD

## 目標
・ふわっとした理解のDDDについて[エヴァンス本](https://www.amazon.co.jp/%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-Architects%E2%80%99Archive-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9/dp/4798121967/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=17W0M5YAY0R9Z&dib=eyJ2IjoiMSJ9.qtIEGNumTF4Fq3OG4r7BcgPPpMccQaiAMFjoQiYsRfAUl2LJ3kucBAwXJG1pE1-9MMyozf_R6XnUk8kwhpkIPyRMzsu94DrC82a2cWHXn2TDjembTcFwG0z4uuYeu7EY_VF_p_KcGaJhu-sFQP2IfF8BXdAN9RWcUsZLGOA8hIhkuAKrptA3cagpPrF5ZoxXjjZ9ctVxNzHN-qanc6enklCzFiHeCY1UpXho238Cgd4eMsXlRTbQ5u_T9ZSbUOj5EOjKzf1jx0xSJbTwFJrRetDuJaorGcsbbNpAuJkvNAs.F3zE4YfUXPLj7DRzsSV4wM07EgTKoLqmpU491uMjIhw&dib_tag=se&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88&qid=1710421495&sprefix=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%2Caps%2C279&sr=8-1)を通して体系的に学習する
・各章の要約をアウトプットすることで知識を定着させる

## 前回の記事
第２部の内容は以下でまとめています。
[#4【勉強メモ】エヴァンス本からざっくり理解するDDD](https://qiita.com/kotemendo2819/items/4ec669c809ceccef0bf6)
[#5【勉強メモ】エヴァンス本からざっくり理解するDDD](
https://qiita.com/kotemendo2819/items/541bac1d8596ae887d12)
[#6【勉強メモ】エヴァンス本からざっくり理解するDDD](
https://qiita.com/kotemendo2819/items/4120a11f7a1304688c6f)
[#7【勉強メモ】エヴァンス本からざっくり理解するDDD](
https://qiita.com/kotemendo2819/items/e9b2440d3b758b73fba7)

## 【第３部】より深い洞察へ向かうリファクタリング
第３部ではドメインについての深い理解をとらえたモデルを発見するという
明確な目標が達成されるまでのプロセルを記述する。

役にたつモデルの共通認識
1. 洗礼されたモデルを作ることは可能であり、実現する価値がある
2. そうしたモデル開発には、ドメインエキスパートと協力しリファクタリングを行うプロセスが欠かせない
3. 効果的なモデルは実装するには、高度な設計スキルが必要

## リファクタリングのレベル
・マイクロリファクタリング
個別の小規模な設計変更を連続的に加え、設計をより柔軟にしていくこと。

## 深いモデル
・深いモデル
ドメインエキスパートの主要な関心事と、それに最も深く関連した知識に関する
明快な表現を提供する一方、ドメインの表面的な側面は捨て去る。

## 深いモデル/しなやかな設計
モデル駆動設計は深いモデルにより表現力豊かな設計ができると同時に
設計が柔軟でふるまいが明確であるという方針の上に成り立っている。

## 【第８章】ブレイクスルー
・ブレイクスルー
継続的なリファクタリングをすることでエントロピー(不確実性)が急激に明確になり
深い洞察や説明力が増大する現象。

## ブレイクスルーの話
### `好機`
ブレイクスルーが訪れた場合は設計の大幅な変更を必要とする場合はあるので
リスクも大きいが、たいてのリファクタリングよりチャンスも多い。

### `基本への集中`
ブレイクスルーの条件を整えるには、知識の噛み砕き、ユビキタス言語育成、ドメインの研究、
しなやかな設計、モデルの蒸留等の基本方策を推し進めることで徐々に姿を表すものである。
ブレイクスルーを起こそうとするのではなく、機会を見逃さないように注意する。

## まとめ
ブレイクスルーの概念と注意点を知ることができた。
本章は金融システムを例にブレイクスルーに至る過程を説明しているが、
詳細は省き、エッセンスだけ抽出し要約することを心がけた。
次は「第9章 暗黙的な概念を明示的にする」を学んでいく。

https://qiita.com/kotemendo2819/items/ee1d4cb6df99735927ce

参考になったらいいねやコメントおまちしています！！
【Flutter】flutter doctor --android-licensesが通らない件

flutter doctor --android-licensesが通らない件について、
もしエラー内容で同じであれば、参考にしてください！
## 環境
・MacBook Air (M1)
・macOS Sonoma14.1

## エラー内容
```
java.lang.UnsupportedClassVersionError: 
com/android/sdklib/tool/sdkmanager/SdkManagerCli has been compiled 
by a more recent version of the Java Runtime (class file version 61.0), 
this version of the Java Runtime only recognizes class file versions up to 55.0
```

## 解決策

#### Android Studioを起動後、SDK Managerを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560514/3b8712a6-ad17-7c34-c07c-34243201999f.png)



  
#### Android SDK Command-line Tools ver.8.0を選択して、「Apply」
（同じエラー内容の場合、ver8.0をダウンロードしないといけないかも)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560514/308dd1ea-1c3a-4304-c1c6-e47d21178b96.png)

#### 再度コマンドを実行
```
flutter doctor --android-licenses
```

何回か「y/n」に答えて、下記のように表示されたら成功
```
10.8 Open Source Software. In the event Open Source software is included with Evaluation Software, such Open Source software is licensed pursuant to the applicable Open Source software license agreement identified in the Open Source software comments in the applicable source code file(s) and/or file header as indicated in the Evaluation Software. Additional detail may be available (where applicable) in the accompanying on-line documentation. With respect to the Open Source software, nothing in this Agreement limits any rights under, or grants rights that supersede, the terms of any applicable Open Source software license agreement.
---------------------------------------
Accept? (y/N): y
All SDK package licenses accepted

```


Flutterの環境構築苦戦中です…😢
2024-03 Mac(M3 MacBook Air) セットアップ記録

memo:

# 基礎系

## Homebrew のインストール
Macのパッケージマネージャ
これないと生きていけないので入れる。

https://brew.sh/
```sh
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
$ eval "$(/opt/homebrew/bin/brew shellenv)"
```

# mas-cli のインストール
cliでApp Store(Mac)の操作ができるツール
GUI操作めんどいので入れる。

https://github.com/mas-cli/mas
```sh
$ brew install mas
```

## Google Chromeのインストール
ブラウザ
これないと生きていけないので入れる。

```sh
$ brew install google-chrome
```

# 操作支援系

## ATOKのインストール
日本語入力（有料）
Macデフォルトの日本語入力やGoogle日本語入力が使いづらいので入れる。

https://atok.com/
```sh
$ brew install --cask atok
```

## BetterTouchToolのインストール
キーボードショートカットやウインドウのスナップを追加するツール（有料）
Windowsのウインドウスナップみたいな操作したいので入れる。
```sh
$ brew install --cask bettertouchtool
```

## DisplayLinkのインストール
USB-グラフィック変換のドライバ&ソフトウェア
M1, M2, M3 Macは外部グラフィックスの数に制限があるが、これはそれを突破できる（2枚以上のディスプレイつなげられる）ので入れる。

https://www.synaptics.com/products/displaylink-graphics

https://www.amazon.co.jp/dp/B015XESLTO/
```sh
$ brew install --cask displaylink
```

## ShareMouseのインストール
マウス・キーボードをネットワーク経由で同期し、他のPCを手元にあるマウス・キーボードで操作するツール（有料）
MacBookAirのキーボード・トラックパッドですべての端末を操作したいので入れる。

https://www.sharemouse.com/
```sh
$ brew install --cask sharemouse
```

## HyperSwitchのインストール
アプリ単位では無くウインドウ単位（同時に画面のスクリーンショットも表示される）でCmd+Tab切替をするツール
アプリ単位の切替は使いづらいので入れる

https://bahoom.com/hyperswitch

## SpotlightのキーボードショートカットをCmdからCtrlに変更する

デフォルトのショートカットが遠いんで。

```
Keyboard -> Keyboard shortcutes -> Spotlight
```

## キーリピートの速度を上げる

デフォルトの速度が遅いんで。

```sh
$ defaults write -g InitialKeyRepeat -int 10
$ defaults write -g KeyRepeat -int 1
```

# 開発系

## Biscuit Browserのインストール
複数のWebアプリをまとめて扱える便利ブラウザ

https://eatbiscuit.com/
```sh
$ brew install --cask biscuit
```

## iterm2のインストール
端末エミュレータ

https://iterm2.com/
```sh
$ brew install --cask iterm2
```

## NoSleepのインストール
デモとか処理途中で立ち上げっぱなしにしたいときがあるので。
```sh
$ mas search nosleep
$ mas install 435040864
```

## スクリーンショットに影が入らないようにする
邪魔なので。
```sh
$ defaults write com.apple.screencapture disable-shadow -boolean true
$ killall SystemUIServer
```

## スクリーンショットの保存先を変更する
デフォルトはデスクトップだが、デスクトップが汚くなってしまうので。
```sh
$ mkdir ~/screenshots
$ defaults write com.apple.screencapture location ~/screenshots
$ killall SystemUIServer

```

# コミュニケーション系

基本Webアプリで済めばいいのだが、Webアプリとして提供されていないものもあるので。

## LINEのインストール
https://line.me/
```sh
$ mas search LINE
$ mas install 539883307
```

## Zoomのインストール
https://zoom.us/
```sh
$ brew install --cask zoom
```

https://www.microsoft.com/ja-jp/microsoft-365
## Officeのインストール
```
$ brew install --cask microsoft-office
```
mslearnのLinxコマンドラインとシェルのコースをやってみる

mslearnに [Linux コマンドラインとシェルを始めましょう](https://learn.microsoft.com/ja-jp/training/paths/shell/) といったラーニングパスを見かけたので、これをやってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/67b26385-9df6-75e7-08af-e0a05da52143.png)

このラーニングパスには、Bashの概要　と　UNIX シェルを使用してログ データをラングリングする　の2つのコースが含まれていて、この2つをやった感想。

## Bashの概要

bashの概要から演算子やコマンド（cat , ps , rm などなど）について完結に説明しています。

psコマンドについては、"ps -ef"と"ps aux"が同じ結果を表す事を説明して、POSIXとBSDの歴史に少し触れていたり。

CloudShellでのサンプルもあり、実際にループするpythonプログラムを実行されてプロセスの確認とプロセスを止めたり、手短な割には意外と面白いです。
（初学者はviな部分で挫折しそうな気もします。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/4795282a-ccbe-bddc-0665-80e7d80f5ddb.png)

## UNIX シェルを使用してログ データをラングリングする

こちらの演習も下記のようにCloudShellでサンプルを動かしながら実際にためしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/ed263f38-e65f-1cb4-f7da-b02dbf5d5446.png)

- head , tail , nl , wc , catコマンド
- 正規表現
- grep
- sed
- パイプ

あたりをさっくりと浅く試していき、初学者はそんなことできるんだなって感じかと思いますが。

sedあたりで挫折しそうな気もする。

## 総評

マイクロソフトなmslearnでLinuxなコースがあったので気になってやってみましたが。
本当の初級者は所々で戸惑いそうな要素も少し感じますが、各コマンド浅くですがさっくりさわれてコンパクトにまとまっていました。
誰かのために作るということ

# はじめに
みなさんこんにちは、どうも@shuniiです。
現在僕は「JISOU」というコミュニティにて、React等の技術を学んでいます。今回は、そのJISOUのカリキュラムの中で月報管理アプリケーションを作ったので、そのアプリの紹介を少しと、開発の中で感じたことをみなさんに共有出来たらなと思います。

# 月報アプリ
では少し、今回作った月報アプリのご紹介をさせていただきます。

月報投稿画面
![スクリーンショット 2024-03-24 182503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554025/477868c2-f163-53c7-bed6-c1cc1df04ddd.png)
月報一覧画面
![スクリーンショット 2024-03-24 182359.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554025/e1175afd-bec2-d644-bfd6-c5610a27bfca.png)![スクリーンショット 2024-03-24 182640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554025/838cc6eb-0dca-7b03-5d57-1d970ddfac1c.png)

### 特徴
- 月報の投稿
- LocalStorage・Base64を利用した認証
- 月報の閲覧(管理者ユーザーのみすべての月報を確認できる)

### 使用技術
ここに関してはこれまでの開発と変わりないです
- React
- TypeScript
- supabase
- react-hook-form
- firebase
- github actions

### 今後の開発
正直完成度でいうと全然納得いってないので(実際にJISOUで使われるアプリにもなるので)、少しずつ改良を進めていきたいです！

# 開発をしていくなかで
序盤にお話しした通り、今回のアプリはプログラミングコーチングJISOUのカリキュラムのなかで作成したものになります。ですが、これまでとは違いカリキュラムの内容・タスクといったものが1から決められているのではなく、要件を与えてもらって開発をしていくというものでした。いわゆる自由課題です。

> <font color="gray">※要件の内容</font>
JISOUでは月報を書くようにしているが、今後メンバーが増加することを考慮すると、共有や管理が大変になってくるため、月報管理ツールを作る、、、、(略)

もう少し詳細なところまでは記載されているのですが、細かなタスクは割り振られておらず、その要件をもとに自分で**ドキュメント**(MVP・TODO等)を作成してから開発を始めました。

# 初めてのドキュメント
ここまで自由度の高い課題は初めてだったため、ドキュメントを書くことから躓きました。それと同時にこれまで与えてもらっていたドキュメント(課題)はいかに粒度が高いものであったか、というのを思い知らされました。
僕ははじめから完璧に書くことはできないと、まずはとりあえずそこまで粒度が高くなくとも最後まで自分が考えられる範囲でドキュメントを書きました。

そこで感じたドキュメントを書くことのメリットは、
<font color="red">**これからの開発手順・ビジョンが見えやすくなること**</font>です。
今まで自分でプログラミングを触っていた時は、なんだかんだすぐにプログラムを書き始めて、結局手詰まりになってしまうという経験が非常に多かったです。テストの計画立てずに勉強が間に合わないみたいな感じですね笑。けれど実際に開発をする際には、
> **手を動かす前にまずじっくりと考え、それを書きだすこと**

が重要だと感じました。

# 誰かのために作るということ
やっとここでタイトル・本題の内容に入ります。
> みなさんは誰のために開発・プログラミングをしていますか？

今回僕は、「僕のお世話になっているJISOUのみなさんに少しでも貢献できるように」という思いで月報アプリを作りました。
開発を進めていく中で、どのようにすれば@Sicut_study(JISOUの運営の方)が使いやすいようなアプリケーションを作れるのかということをずっと考えていました。実際にどのような機能があればうれしいですか？と質問したこともありました。

そんななかで気づいたこととしては、自分が誰かの役に立ちたいと思っているということ。
自分がワクワクできるのはもちろんですが、やはり自分が作ったものを誰かに実際に使ってもらう、欲を言えばその人を笑顔にできるならそれほど嬉しいことはない、と僕は思っています。

> 「**誰かのために作る**」というのは「自分のために」よりも力が湧いてくるものだと僕は思います。

これは偏見かもしれませんが、モノづくりをしている人は少なくとも誰かに自分の作ったものを見せたい・それで笑顔にさせたい・役に立ちたいという思いがあるのではないでしょうか？人によっては(僕の話ですw)開発が孤独なこともあると思います。ずっと続けていると辛いこともあるかもしれません。

もしそんなときが訪れたなら、自分が作っているものを誰かに見せてみてはどうでしょうか？自分にとって身近な人であったり、なんなら僕に見せてください！(https://twitter.com/shunii_hack)

そのときに、すごい！！とか、ありがとう！などという言葉を聞けたのであれば、その体験は自分がこれから開発を続けていく糧・自信に繋がると思います。**成功体験**をいちはやく作ることが重要です。なかには心もとない声もあるかもしれませんが、そういうのは気にせず数打ってきましょう！僕もどんどん挑戦していくつもりです。そしてまた誰かを笑顔にしましょう！！

# 🔥JISOUのメンバー募集中🔥
プログラミングコーチングJISOUではメンバーを募集しています。
気になる方はぜひHPからライン登録お願いします！
https://projisou.jp
![jisou-banner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/217ea52d-8130-3266-0619-990fa968408a.png)

# 終わりに
最後まで読んでいただきありがとうございました！
ぜひいいねとストックよろしくお願いします。僕がめちゃくちゃ喜びます笑

# ✨About Me✨
友達になってくれよな(きらん)
- X(Twitter)

https://twitter.com/shunii_hack
【AWSまとめ】プライベートサブネットのEC2にVSCodeでJupyter-notebookを起動する方法

## ここでは、プライベートサブネットに配置されたEC2にVSCodeからSSH接続し、さらに接続先のEC2でJupyter-notebookを起動する方法を整理します。

## 最初に
**今回は、以下のリンク先の設定方法が済んでおり、VSCodeでプライベートサブネットのEC2にSSH接続できることを前提としています。**

<br/>
〇 プライベートサブネットのEC2インスタンスへのSSH接続自体の方法は、以下のリンク先で紹介してます。

https://qiita.com/GORIN/items/2a73787d1a4b79f834cc

〇 プライベートサブネットのEC2にVSCodeからSSH接続する方法は、以下のリンク先で紹介済みです。

https://qiita.com/GORIN/items/8800760c7db77a74f7e8



## やること
1. EC2へのjupyter notebookのインストール
2. jupyter notebookのパスワード設定
3. jupyter notebookの起動
4. ブラウザでの操作
5. おわり

## EC2へのjupyter notebookのインストール
以下のコマンドをSSH接続後のターミナルで実行して、jupter notebookをインストールします。
~~~
pip install notebook
~~~

## jupyter notebookのパスワード設定
ブラウザでjupter notebookを開いた時にパスワードを求められるので、そのパスワードをあらかじめ設定します。
**〇 以下コマンドでjupyter_notebook_config.pyを作成する**
~~~
jupyter notebook --generate-config
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/e3bda6fd-aa2f-53ae-7d64-9b238ccb5cf5.png)

**〇 パスワードを設定する**

~~~
jupyter notebook password
~~~
※パスワードの設定は初回のみで大丈夫です。もし忘れてしまった場合は、再度同じコマンドを実行して、パスワードを再設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/f3b63db5-d0bd-ba87-c785-6b8b9f75337a.png)


## jupyter notebookの起動
以下のコマンドで、jupyter notebookを起動します。
~~~
jupyter notebook
~~~

以下のようなメッセージが表示されたら、右下のポップアップの
【Open in Browser】を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/bd9c0bab-0752-03fe-0ff7-1f4ec154397c.png)

## ブラウザでの操作

ブラウザで以下のように表示されたら、パスワードのボックスに先ほど設定したパスワードを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/98044e04-1b9b-dcb7-6ba2-0b5ddf2415dd.png)

<br>


パスワードを入力して【Log in】を押下したらjupyter notebookが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700849/4ecbe780-962c-f5b8-6680-b0bbe9755044.png)


## おわり
ここまでの操作で、プライベートサブネットに配置されたEC2でjupter notebookを起動することができました。
EC2でjupyter notebookを起動することで、EC2サーバーの環境かで各コマンドを実行できます。
ローカル環境で起動すると、どうしてもパソコンのスペックに依存してしまうんですよね。。。
【React×TypeScript】学習歴2カ月で学習記録アプリつくってみた

# はじめに
Reactの学習を始めて早くも2カ月が経ちました。
**React×TypeScriptのインプットを下記の講座で終わらせたので、アウトプットとして学習記録アプリを作成しました！**

↓「0からTypeScript学習するぞ！」って方にもおすすめです。

https://www.udemy.com/share/104d6k3@v8atfR9BoHGTWixjtGYWqG_hJP2wMx1HCALNHOT4BOWoAObQCxtmE4p21eF4PZPf8g==/
# 作成したアプリ
**使用言語**
React、TypeScript

**UI**
Chakura UI

**DB**
Supabase

**テスト**
Jest
React Testing Library

**その他使用した技術**
React Hook Form
Github
Supabase

**アプリ作成の背景**
もともとこのアプリはReact×JavaScriptで作成したものです。
TypeScriptの学習を兼ねて、アプリをReact×TypeScriptで最初から作成し直しました。また、Reactの恩恵を受けるべく**公式ドキュメントを参考にしながらReact Hook FormやReact Testing Libraryを積極的に取り入れました。**

**デモ**　（日付のフォーマット変換については見逃してください。。）
![学習記録アプリデモ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/c73f5ada-4918-1a51-ff8f-ef4b5f3f1db8.gif)

↓ちなみに、JavaScript×Reactでアプリを作成した当時の記事はこちらです。（当時はデザインまで気が回らなかった。。）

https://qiita.com/AK_React/items/785329572561afef58c8
# 作成の流れ
アプリ作成の大まかな流れはこちらです！
今はReactの学習に重点を置いているので、機能実装に一番時間を割きました。


**１．環境構築（Vite）
２．CI/CD構築（Github Actions）
３．DBの作成・設定（Supabase）
４．アプリの機能実装
５．テスト作成（Jest）**
# 便利なReactライブラリ
**React Hook Form**

react-hook-formとは、Reactアプリケーションでフォームを簡単に扱うためのライブラリです。**react-hook-formが提供するフックを利用すると、フォーム入力値の状態管理やバリデーション、フォームの送信等が簡単にできる**ようになります。
実際に使ってみて、**未使用時よりもコードの量が減ったのを実感**しました。

↓公式ドキュメントのデザインがイケているので、見ていて楽しいです！

https://react-hook-form.com/

↓各フックの使い方なんかを丁寧に書いてくれています。

https://qiita.com/Nozomuts/items/60d15d97eeef71993f06

**React Testing Library**

そのままですが、Reactアプリケーションのテストを行うためのライブラリです。
**特徴としては、ユーザーがアプリケーションを使うときの振る舞いに焦点を当てたテストができる**ことが挙げられます。**もう少し具体的に言うと、コンポーネントのレンダリング結果に対して、テストツールを使ってユーザーの操作をシミュレートし、期待される結果が得られるかどうかを確認できます。**

https://testing-library.com/docs/react-testing-library/intro/

↓有料級の丁寧さ＆わかりやすさです（Jestとの違いも教えてくれる）

https://qiita.com/ossan-engineer/items/4757d7457fafd44d2d2f#react-testing-library
# おわりに
少し話が逸れますが、最近SNSを見ていると、プログラミングスクール生がものすごいクオリティのアプリを作っていたり、同期のSEさんが爆速で成長していたりするわけです。その様子を見て **「みんなすごいな。。私SEとしてやっていけるのかな。。」** なんて思ったりします。
**今回のアプリもめちゃくちゃシンプルですが、私は何日もかけて作成しました。
他人と比べるとペースはゆっくりかもしれません。でも、根気強く学習を続けて、発信し続けていきたいと思います。**
# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
気になる方はぜひHPからライン登録お願いします！

https://projisou.jp
DependabotにもGrouping機能ができていたようなので試してみた

Dependabotを利用していると、1つのライブラリアップデートに対して、1つのプルリクエストが作成されていました。
Renovateなどを用いると、複数のライブラリの更新を1つのプルリクエストにまとめることができました。

最近、Dependabotを調べていたら、2023年8月のアップデートで、「ベータ版」としてGroup Dependabot Version Updates　という機能ができていました。

https://github.blog/changelog/2023-08-10-group-dependabot-version-updates-by-development-or-production-dependencies/

この機能により、Dependabotでも複数のライブラリアップデートを、1つのプルリクエストにまとめることができるので、早速それを試してみました。


## 使い方


主に以下の5つを使って書いていきます。

| オプション | 説明 |
|:-|:-|
| applies-to |  version-updates か security-updates を記載します。つまり、バージョンのアップデートか、セキュリティのアップデートかを指定します。 |
| dependency-type | development か productionを指定します。 指定した環境のライブラリに制限したアップデートになります。 |
| patterns | この正規表現でマッチしたライブラリを更新します。 |
| exclude-patterns | この正規表現にマッチしたライブラリは更新しません。 |
| update-types | セマンティックバージョニングのmajor、minor、patchのどのレベルの高sんを対象にするか指定します |


### 例えば

以下がgrouping機能を使ったdependabot.ymlです。
`gropus:` 以下が特に上記で説明した機能を使ったものです。

```yml
version: 2
updates:
  - package-ecosystem: bundler
    directory: /
    schedule:
      interval: daily
      time: "04:00"
      timezone: Asia/Tokyo
    reviewers:
      - hatsu38
    open-pull-requests-limit: 10
    groups:
      minor-and-patch:
        applies-to: version-updates
        patterns:
          - "*"
        update-types:
          - "minor"
          - "patch"
        exclude-patterns:
          - "rails"
```

`minor-and-patch` という名前のグルーピングを作成しました。

`applies-to: version-updates` とかいたので、セキュリティアップデートではなく、バージョンアップデートを対象にしています。

`pattenrs:`には、 `*`を書きました。つまり、すべての名前のライブラリを対象にしています。

がその内、`update-types` で書いた `minor`, `patch` のバージョンアップのみに絞り込んだアップデートです。

さらに `rails` gemのアップデートは、パッチバージョンのアップデートでも対象外にしています。


以下は、npmの場合のバージョンアップデートで作成されたプルリクエストです。

![スクリーンショット 2024-03-24 18.11.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107345/1623bb49-091f-2648-606f-e47d3ee669e6.png)


便利ですね。

今まではライブラリごとにプルリクエストが作成されていたため、CIの時間もそのプルリクエストごとにかかっていました。
が、このグルーピング機能によって、1つにまとめられるので、CI時間の短縮にもなりそうです！


ドキュメントはこちらです↓

https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#groups
Fire HD 8（第7世代）でビデオ通話を試した備忘録

## 目的
* 県外の家族とビデオ通話がしたい。
* タブレットをリビングにおいて、ビデオ通話をすぐ開始できるようにしておきたい
* あまり使っていない~~ポンコツ~~ fire HD 8 があるので、できれば活用したい

## 環境
* Fire HD 8（第7世代）
* Fire OS 5.7.1.0(Android 5.1相当らしい)
* Google Playインストール済み

## 試したアプリと結果一覧
| アプリ名 | 結果 | インストール方法 | インストール | ログイン | 備考 | 備考2 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| LINE | × | Google Play | 〇 | × | アプリは立ち上がるが、ログインが出来なかった。 |  |
| Discord | △(×) | ブラウザ | - | △(×) | 【インストール方法】Google PlayではAndroidのバージョン不足でインストール不可。fireのアプリストアではインストールできたが、ブラウザのショートカットが開く謎アプリ。結局ブラウザから開いた。 | 【ログイン】新しく作ったアカウントでログインしようと思ったら出来なかった。メアド or パスワード打ち間違いの可能性があるが不明。元々持っていた別のアカウントだとログインできそうな挙動をしたので行けるのかもしれない（試していない。） |
| Skepe | × | × | × | × | fireのアプリストア・Google Play（Androidのバージョン不足）共になし。Google Playにskepe for business があったが、ビジネス向けの有料の別アプリらしい。 |  |
| (Facebook)Messenger | △(×) | fireアプリストア | 〇 | △(×) | 新しく作ったアカウントでログインしようと思ったら出来なかった。メアド or パスワード打ち間違いの可能性があるが不明。元々持っていた別のアカウントだとログインはできたので、もしかしたら行けるのかもしれない。 | Facebookアカウントが双方に必要。 |
| Google Meet(Duo) | 〇 | Google Play | 〇 | 〇 | Google Playで「Google Meet」というアプリを入れると、「Duo」というアプリがインストールされた。調べたところ、Google MeetにDuoが吸収されたらしい。Duoが入るのは、Androidのバージョンが古いから？ Google Meetのビデオ通話機能と、Duoのビデオ通話機能で、ビデオ通話が可能。| Duoはログイン時にgoogleアカウント+電話番号が必要。Google Meetの方はGoogleアカウントが必要。Duoの方は、一度ログインしたら、Googleアカウントはを解除できた（電話番号のみに出来た）。 |

## 補足
* Google Meet(Duo)で、こちら側の映像が若干もっさりしている + 時々止まる。
　→Fire HD 8の性能が低い + Wi-fi環境が悪いため？、このような挙動になっていると思う。
   Wi-fi環境に問題なければ、使えるレベルではあるかと思う。
* ブラウザ版に関して、Discord以外試していない。Lineは多分無理で、他はもしかしたらできるかもしれない。

## 結論
* Google Meet(Duo)で行けたが、動作が不安定なので、おとなしくノートPCでビデオ通話することにした。やっぱりFire HD 8はkindleを使うぐらいしか良い使い道ないのか…
HGO909 Situs Online Terbaru & Slot Gacor Hari Ini

HGO909 adalah situs judi slot online terbaru yang menawarkan berbagai permainan slot yang seru dan menghibur. Situs ini juga dikenal karena memiliki slot yang gacor, artinya sering memberikan kemenangan kepada para pemainnya. Jika Anda mencari pengalaman berjudi yang menyenangkan dan potensial untuk meraih keuntungan, https://gogohgo.com/ bisa menjadi pilihan yang tepat untuk Anda. Tetapi, ingatlah untuk bermain dengan tanggung jawab dan tidak berlebihan dalam berjudi.
AWSクラウドプラクティショナー受験体験記

AWSクラウドプラクティショナー（CLF-C02）に挑戦して無事に合格できました。

４月から受験料が大幅に値上がりするので、あせって駆け込み受験です。

### 試験準備

年末年始にネットの無料サイトで勉強してましたが、仕事が忙しくなって一旦中断してしました。３月に入ってからUdemyの模試で本格的に勉強を始めました。模試で９割くらい正解できるようになったので、本試験に申し込みました。AWSはハンズオンを受講した程度で、実務経験はありません。

### やったこと
* [Udemyの模試試験集](https://www.udemy.com/course/aws-4260/)

まず問題を解き、間違えた問題を中心に解説を読みました。解説が充実していたので助かりました。全部で６回分あるのですが、９割程度解けるようになってから次の回へと進みました。本試験直前の１週間は、毎日４〜５回解いてました。最終的には各回を１０回程度やったと思います。


### やったけどあまり効果を感じられなかったこと
* ネットの無料問題集

無料なのはありがたいのですが、ちょっと解説に物足りない場合がありました。


### やらなかったこと
* 動画
* テキスト、参考書

けっきょく暗記問題なので、私にとっては体系的な学習よりも何度も反復して問題を解くのがよかったようです。本番では８割程度の正解率でした。


合格特典として３年間有効の受験料半額クーポンをもらったので、いずれ次の試験も挑戦して見ようと思います。
Android アプリ名を開発環境と本番環境で変える方法

アプリの名前をわかりやすいように開発環境と本番環境で変える方法です。

まずは、画像のようにresのvaluesで右クリックをして、画像のような選択をします。

![スクリーンショット 2024-03-24 17.25.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/82d1ed54-ca7b-9c60-a127-c42d44a8905d.png)

そして開発環境を選択します。
![スクリーンショット 2024-03-24 17.26.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/32521000-3916-1258-d12e-4f7bc86ed7ae.png)

今回は文字に対して行うので、stringsを入力します。

![スクリーンショット 2024-03-24 17.26.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/d7fc988a-2fbd-98d6-33d3-2f26791c732a.png)

そしたら
```
<string name="app_name">Dev</string>
```
のような感じで`name="app_name"`app_nameの箇所は本番で設定しているリソースのnameと同じにしてください。

以上でアプリ名を環境ごとに変更することができます。
gitのコミット数を取得する

## この記事を執筆しようと思ったきっかけ
業務において各人の生産量を図ることとなり、指標の一つとしてコミット数を用いる事となりました。
目視で数えることも可能だが、あまりにも非効率すぎるのでgitコマンドで取得できないか調査しました。
調査結果を備忘録かねてまとめます。

## コミット数の取得方法
下記コマンドを使用することで指定ブランチの全コミットハッシュを取得することが出来ます。
```
git rev-list {ブランチ名}
```
<details><summary>出力サンプル</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638444/d8c1c0fc-5d0e-a04f-d0ae-6d0fa3e33bbc.png)
</details>


### 使用オプションについて
コミットハッシュ数の取得のみでは誰が何件コミットしたか見える化出来てません。
また生産量を図るための指標取得が狙いなので期間指定も必要です。
そこで今回は以下オプションを追加しました。
<dl>
  <dt>count</dt>
  <dd>リストされたコミット数を示す数値が表示されます</dd>
  <dt>since</dt>
  <dd>特定の日付よりも新しいコミットが表示します</dd>
  <dt>until</dt>
  <dd>特定の日付よりも古いコミットが表示します</dd>
  <dt>author</dt>
  <dd>コミット内容の著者を指定できます</dd>
</dl>

### 最終的に出来上がったコマンドは以下の通りです。
```git:オプションありバージョン
git rev-list --count {ブランチ名}  --since={yyyy-MM-dd} --until={yyyy-MM-dd} --author={著者名}
```
<details><summary>出力サンプル</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638444/0e36d777-a0bf-a813-e21e-b477645d6c6d.png)
</details>

## 自動化
ユーザ単位で期間指定のコミット数を取得することまで出来ました。
このままだと、コミット数を取得したい際に毎回手動でコマンド実行する必要があり非効率です。
そこで今回作成したコマンドを自動実行するシェルスクリプトを簡易的ながら作成しました。

:::note warn
スクリプトの説明は割愛します。また秘匿情報は伏せてます。
:::

<details><summary>サンプルコード</summary>

```
#!/bin/bash

# 引数１と引数２で取得したい範囲を指定する
startDate=$1
endDate=$2
pattern="^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
if ! [[ $startDate =~ $pattern ]]; then
    echo "第一引数の開始日はYYYY-MM-DD形式で入力してください。"
    exit 0;
fi

if ! [[ $endDate =~ $pattern ]]; then
    echo "第二引数の開始日はYYYY-MM-DD形式で入力してください。"
    exit 0;
fi

# ログファイル
cp /dev/null {ログファイルパス}
log={ログファイルパス}

# ユーザ名リスト
userNameArray=({ユーザー名})

workPath="{コミット数を取得したい作業パス}"
workPathArray=()

# workPathのディレクトリに格納されているフォルダ名を取得
for path in $workPath; do
	if [ -d $path ]; then
		workPathArray+=("$path")
	fi
done

# ユーザ単位で作業パスに存在するコミット数を取得する
for userName in "${userNameArray[@]}"; do
  exec &> >(echo "ユーザー名: "${userName}"" >> $log)
  
  for path in ${workPathArray[@]}; do
  	# ディレクトリパスが変数pathに入っているが、ベースディレクトリのみ必要なのでbasenameを使って取得しbaseDirNameに格納する
    baseDirName=$(basename ${path})
    cd {コミット数を取得したい作業パス}/${baseDirName}
    # バッククォート(`)で文字列中のコマンドを実行することができる。これを使って変数にコマンドの実行結果を代入。
    commitNum=`sudo git rev-list --count ${baseDirName} --since=${startDate} --until=${endDate} --author="${userName}"`
    
    # コミット数が0件であるなら不要データとなるので集計外とする
    if [ ${commitNum} -eq 0 ] 
    then 
      continue 
    fi
    exec &> >(echo "ディレクトリ名: ${baseDirName}, コミット数: $commitNum" >> $log)
  done
done

```
</details>


## 参考文献
https://git-scm.com/docs/git-rev-list
https://runebook.dev/ja/docs/git/git-rev-list
androidでpng画像を使う時に気をつけたいこと

# はじめに
今回は Android実装でpngを使うときに注意しておきたいことを紹介します
### 本文
まず、webPを使うということです。
pngに比べてwebPは圧縮率が高いため、アプリ自体の容量を節約することができます。
しかし、ここで注意しないといけないのは、AndroidStudioを使った変換時に`lossless`と`lossy encode`を選択できるのですが、`lossless`にしないとPNGに戻すことができません。
また、逆に圧縮率を高めるために`lossy encode`をデフォルトの75%でやってしまうと若干ですが、画質等が変わってしまうので、デザイナさんとの確認が必須になってきます。
### 最後に
Android実装でPNGを使う時のTipsを前回の記事で紹介したので合わせて使うであろうWebPに関する記事を書いてみました
どなたかのお役に立てれば幸いです
【SATySFi】十進数を十六進数のstringに変換して返すコマンド

# 概要
SATySFiで十進数を十六進数に変換するコマンド `\dec2hex`を作りました．

# ソースコード
まとめてもいいのですが，別の用途でも使用する必要があり次の2つを用意しました．

### 再帰函数で変換する部分
``` 
let-rec dth n = 
	if n < 16 then 
		if n == 0		then `0`
		else if n ==  1 then `1`
		else if n ==  2 then `2`
		else if n ==  3 then `3`
		else if n ==  4 then `4`
		else if n ==  5 then `5`
		else if n ==  6 then `6`
		else if n ==  7 then `7`
		else if n ==  8 then `8`
		else if n ==  9 then `9`
		else if n == 10 then `A`
		else if n == 11 then `B`
		else if n == 12 then `C`
		else if n == 13 then `D`
		else if n == 14 then `E`
		else 				 `F`
	else dth (n/16) ^ dth(n mod 16)
```
intを受け取って十六進数で返しています．

### 関数を使ったコマンドを定義する部分
```
let-inline ctx \dec2hex n = 
	let generateddigits = dth n in
	let digits-as-inline-text = embed-string generateddigits in
	read-inline ctx digits-as-inline-text
```

# 使用例
### ソース
``` hextest.saty
@require: stdjareport

let-rec dth n = 
	if n < 16 then 
		if n == 0		then `0`
		else if n ==  1 then `1`
		else if n ==  2 then `2`
		else if n ==  3 then `3`
		else if n ==  4 then `4`
		else if n ==  5 then `5`
		else if n ==  6 then `6`
		else if n ==  7 then `7`
		else if n ==  8 then `8`
		else if n ==  9 then `9`
		else if n == 10 then `A`
		else if n == 11 then `B`
		else if n == 12 then `C`
		else if n == 13 then `D`
		else if n == 14 then `E`
		else 				 `F`
	else dth (n/16) ^ dth(n mod 16)

let-inline ctx \dec2hex n = 
	let generateddigits = dth n in
	let digits-as-inline-text = embed-string generateddigits in
	read-inline ctx digits-as-inline-text

in

document
(|
	title = {10 進数};
	author = {Myso Shake};
|)
'<
	+p{
		\dec2hex(0);
		\dec2hex(1);
		\dec2hex(2);
		\dec2hex(3);
		\dec2hex(4);
		\dec2hex(5);
		\dec2hex(6);
		\dec2hex(7);
		\dec2hex(8);
		\dec2hex(9);
		\dec2hex(10);
		\dec2hex(11);
		\dec2hex(12);
		\dec2hex(13);
		\dec2hex(14);
		\dec2hex(15);
		\dec2hex(16);
	}
	+p
	{
		\dec2hex(17);
		\dec2hex(18);
		\dec2hex(19);
		\dec2hex(20);
		\dec2hex(21);
		\dec2hex(22);
		\dec2hex(23);
		\dec2hex(24);
		\dec2hex(25);
		\dec2hex(26);
		\dec2hex(27);
		\dec2hex(28);
		\dec2hex(29);
		\dec2hex(30);
		\dec2hex(31);
		\dec2hex(32);
	}
>
```
上のように書くと下のようになります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559085/0fbc91d3-7901-6391-7c5c-ae74bf9df4fb.png)
ELECROWで基板を注文してみた！！

今回は初めて「ELECROW」で基板注文をしてみたので記事にしました。

今まではPCBgogoで注文していたのですが、
基板の製作費や送料が高いので今回安いところを探し、
ELECROWに出会いました！！

## 注文方法
1、まずは作成する基板のガーバーデータを出力しておきます。
2、https://www.elecrow.com/ にアクセスして　PCB Fab＞Regular PCBをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/f979bea1-694e-9ffe-a0f0-a3d6fdad3b43.png)

3、圧縮したガーバーデータをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/57bb7b47-57f8-f84e-7965-b98d6e606a37.png)

4、アップロードをすると画面が表示されますので間違いがないか確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/5675eb9e-2155-3304-936e-c3597f87e3fe.png)

5、今回は、2レイヤー、サイズ98*70mm、厚さ1.6mm、カラー黒、シルク白を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/3a25134b-93a9-f9d3-67ef-3e5a0966decd.png)

6、発送先を入力。
7、確認画面。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/30588e2a-2304-9b51-7f35-2cd72d296c7a.png)
8、問題なければ支払う。
【HTML&CSS】【初心者向け】チェックボックス(ラジオボタン)とラベルの連動方法

# 1. label要素の役割
・フォームコントロールに、その内容を説明するラベル付けをする。
・フォームコントロールに紐づくラベルをブラウザにも明示する。
# 2. labelと要素の連動方法
### ① 要素のid属性とlabel要素のfor属性を同一にする
``` HTML
<input type="checkbox" id="shiba_dog"><label for="shiba_dog">柴犬</label>
<input type="checkbox" id="maltese"><label for="maltese">マルチーズ</label>
<input type="checkbox" id="corgi"><label for="corgi">コーギー</label>
<input type="checkbox" id="schnauzer"><label for="schnauzer">シュナウザー</label>
<input type="checkbox" id="bulldog"><label for="bulldog">ブルドッグ</label>
```
### ② label要素で紐づけ対象要素を囲う
``` HTML
<label><input type="checkbox">柴犬</label>
<label><input type="checkbox">マルチーズ</label>
<label><input type="checkbox">コーギー</label>
<label><input type="checkbox">シュナウザー</label>
<label><input type="checkbox">ブルドッグ</label>
```
# 3. 注意点
・labelは１つの要素としか紐づけられない
```HTML
<input type="checkbox" id="shiba_dog">
<label for="shiba_dog">柴犬</label>

<input type="checkbox" id="kuro_shiba">
<label for="shiba_dog">黒柴</label>
```
# 4. labelと紐づけるメリット
・チェックボックスからテキストまでクリック範囲が広がることで
　押下しやすくなり、ユーザビリティが向上する
 ・スクリーンリーダでもチェックボックスに紐づくテキストが読み上げられる
 　ため、内容が伝わりアクセシビリティが向上する
「現代数理統計学の基礎」演習問題解法メモ　第7章問3

第7章問3は難問です。計算量も多いので紙面を多く使っています。
「同値」という考え方もよくわかりません。さらに(3)は???です。
![第7章問3 P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/bd20464e-43ee-d8de-a999-76f434378567.jpeg)
![第7章問3 P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/eeb71119-0864-2f0b-0084-893b4be48b6a.jpeg)
![第7章問3 P3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/31f9275c-65dd-48c3-a7a9-a4db916c834b.jpeg)
![第7章問3 P4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/b6b96ac9-9b11-a7c3-399d-118bf867d884.jpeg)
![第7章問3 P5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/d59eaa2b-b306-4423-3488-6b3da0e0da95.jpeg)
![第7章問3 P6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/07009b12-7ca8-059e-db5b-0aba5205a302.jpeg)
![第7章問3 P7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/31f5d9e5-005f-8bf2-67e0-505c32727b1b.jpeg)
![第7章問3 P8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/ef191d32-1e8f-512b-c9d4-b62d7d45eafd.jpeg)
PythonでExcelグラフを出力したのに最後のデータが反映されない問題を解決しました

## PythonのExcelグラフはめちゃめちゃ癖が強かったというお話
私は毎年読書の記録をスプレッドシートでつけています。

年末には集計して読了数、購入媒体、ジャンルなどをグラフ出力しているのですが、Pythonでグラフのひな形を書いておいて出力したら楽かな？と思い立ち、PythonのExcelグラフ出力を試みてみました。

とりあえずラフにデータを書き込んで出力させてみたのですが、どういうわけか3つ項目があるうちの2項目までしかグラフに反映されず詰まってしまいました。

#### テスト用にラフに作ったExcelの元データ(2024read.xlsx)
![xl01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984316/528c0b35-1e51-b07f-64df-d8b59e3ac6d6.jpeg)

#### パイチャートを出力させるために書いたコード
※openpyxlライブラリをインストールする必要があります

```python
import openpyxl
from openpyxl.chart import PieChart, Reference
from openpyxl.chart.series import DataPoint

wb = openpyxl.load_workbook("2024read.xlsx")
sh = wb["label2"]
data = Reference(sh, min_col=2,min_row=1, max_row=sh.max_row)
labels = Reference(sh, min_col=1,min_row=1, max_row=sh.max_row)

print(labels)
print(data)

chart = PieChart()
chart.title = "ラベル別"
chart.add_data(data, titles_from_data=True)
chart.set_categories(labels)

sh.add_chart(chart, "H23")
wb.save("2024read.xlsx")

```

### 最後のデータが反映されない問題
上記のコードを実行して出力されたグラフがこちらです
![py01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984316/3abcbd48-85a5-26ac-2d99-9e043703ab4d.jpeg)

残念ながらtのデータが反映されていません。

ちなみにデータの範囲の参照はちゃんとされているようです
![py01out.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984316/47194b53-b089-e3a8-f7e5-5c19fd19cf98.jpeg)

データ指定の肝になっている部分はここ
```python
data = Reference(sh, min_col=2,min_row=1, max_row=sh.max_row)
labels = Reference(sh, min_col=1,min_row=1, max_row=sh.max_row)
```

もしかしてmax_row+1で行ける？と思い以下のコードで実行
```python
data = Reference(sh, min_col=2,min_row=1, max_row=sh.max_row+1)
labels = Reference(sh, min_col=1,min_row=1, max_row=sh.max_row+1)
```

実行結果は以下の通り。がっくり。
![pyplus1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984316/309369ea-9889-40df-3b1e-582c4162ffd6.jpeg)

あと、空欄の4行目までが選択範囲になってしまうのでダメですね。
![py02out.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984316/a76ca76f-8e46-246e-70bc-a746dd2aec1b.jpeg)

それにしても進歩したのは「ラベルは全部反映されている」という点です

グラフデータは2行目までしか読み込んでくれない（選択行の-2まで読んでいる）
が、ラベルは3行目まで読んでくれた（選択行の-1まで読んでいる）

！！！

読み込みの先頭行が設定（min_row）の一個前になっているのではないか？
というわけで-1行目を挿入することを思いつきました。
（実際には見出し行でデータの前に一行挿入されているのが普通のExcelデータです）

#### 見出し行的に1行挿入
![xl02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984316/217562bd-183c-9708-b173-393a4ca49b29.jpeg)

ここで気を付けないといけないのは、ラベルは選択行の-1まで読んでいるけれど、データは選択行の-2までしか読んでいないという点です。
ここに気を付けて先頭行を調整します。

#### 先頭行調整後のコード

```python
data = Reference(sh, min_col=2,min_row=1, max_row=sh.max_row)
labels = Reference(sh, min_col=1,min_row=2, max_row=sh.max_row) #min_rowの設定変更
```

実行してグラフ出力
![pycomp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984316/d793c66a-fba3-3967-6579-59960798ac31.jpeg)

今度はちゃんと出力されました！めでたしめでたし✨

### まとめ
実際、見出し行を入れる解決策に思い至るまで3日間も詰まっていました。
Excelの書き方の問題ではなく、コードの方に問題があると思っていたのです。

それにしてもopenpyxlのラベル（凡例）とデータの取り方が違うという癖は気づくまで本当に厄介でした。
実務で躓いたC言語のポインタのポイント

# この記事の背景
組み込みプログラムを多く経験してたおじさんが
新しい組み込みの現場になったらつよつよコードが多くて
急にわからないことがたくさんできたので反省として書いておきます。

## ポインタってそういえばアドレスと型を持つんだった
C言語できるといっていたのですが本気でゴリゴリのオブジェクト指向に入ったらまったくできなかったのがポインターと関数ポインタ
初心者がC言語のわからない点としてよくあげられますが、こみいったソースを初見で読むと高確率で撃沈されるんだなと思いました。
※元の現場は電気屋の人が主体だったので可読性重視で平易に書かれたコードが多かったです。

特にここができなかったなと反省する点です。

 - ポインタはアドレスと型を持つ、ポインタ変数の足し算引き算は型が確保した領域の分だけアドレスが移動する。
 - 関数ポインタの実装、特に配列で実装されている関数のインストール部分に対して関数ポインタ型の定義部分が見つからなくて型が合わないエラーに引っかかる。
  　 ↑（エラーメッセージは型が合わないって言ってるのに関数ポインタの型宣言の本体が見つけられない、関数ポインタがさす型本体の関数宣言の特定がエラーメッセージからできない）  
 - 関数の引数を渡すときに構造体のデータ（送受信とか）のポインタをINTにキャストしなおして（先頭アドレス情報を取り出す＆渡す情報を制限して）
 関数に読み込んだ後にもう一度構造体の型にキャストしなおす（キャストしなおさなきゃデータにアクセスできないし次の要素へいけないですよね・・・。）
 - 動作パターンごとにインスタンスを起こして関数ポインタで関数の実体を付け替えていくときに構造が把握しきれなくて追いきれなくなる（インスタンス生成したらインスタンス名＋アロー演算子で実体をコールするので、関数名自体のGrepや検索でかからなくなる（特にプログラムのファイルが分かれていると苦戦））

C言語の組み込みでもオブジェクト指向が強いか普通のC言語のプログラミングだけでやってるかとかでコードの追いかけづらさだいぶ変わるなぁと思いました。

※余談ですが、今まではチープなマイコン向けの開発が多くメモリ領域のほとんどは静的に確保されていたので、mallocやメモリ管理も把握に時間がかかる模様

## まとめと反省
C言語でしっかりオブジェクト指向で書かれたソースをはじめて触って苦戦したところの反省
 - ポインタが型とアドレスを持つということに気をつける。ポインタで型をキャストしなおす効果（引数のデータ量の削減とか）を理解する。
 - オブジェクト指向でプログラミングされているときの関数ポインタの扱いと関数の型宣言の追い方、インスタンスを起こしたときのインスタンスで動作する関数実体の追いかけ方（Grepだけでは追跡できないので命名ルール聞いたりコールの経路を自分で書いてみる）

２番目がわからなくて悩んで崩壊なので、インスタンスや見知らぬ構造体の取り扱いをしっかりってかんじでした。