OmniAICreator/Qiita-1.07M huggingface dataset:
Git コマンドまとめ

自分用にGitを使う際のコマンドを記録していたので，共有します．
使えそうであれば，ご活用ください．


:wq : 保存して終了
:q! : 保存せず終了
i : 入力モード
esc : 入力モード終了
rmdir : ファイルの削除
pwd : カレントディレクトリの表示
ls : ファイル一覧の表示
ls -a : 隠しディレクトリも確認
git : ヘルプの表示
git config ―global use.name “Keishi”
git config ―global user.email “(mail adrress)@gmail.com”
git config ―list : 登録情報の確認
(My workディレクトリを作成し、そこにリポジトリを作成. 作業履歴は ”.git” という隠しディレクトリに記録)
mkdir mywork
cd work
git init : レポジトリの作成
git status : リポジトリやステージングエリアの状態の確認
→”Initial comit” = 初期状態
→ ”Untracked files” = まだ仮登録されていない状態
→ “working derctory clean” = ok
→ “modified” : 修正されたことを示す
git add readme.txt : ステージングエリアに仮登録
git commit : vimが起動し、コミットメッセージの記入
git log : 記録の確認
git add . : 全てのファイルをステージングエリアに仮登録
git commit -a -m “2nd commit” : -a = 仮登録とコミットを同時に実行、-m = コミットメ	ッセージの指定
git log ―online : コミットメッセージのみ表示
git log -1 : 直近logのみ表示(数字は表示するコミットログの件数）
git status -s : シンプルな表示
git diff : ステージングとワーキングディレクトリを比較
git diff ―cached : 最新コミットとステージングエリアを比較
git diff HEAD : 最新コミットとワーキングディレクトリを比較
git checkout readme.txt : ワーキングディレクトリのファイルを前の状態に戻す
git reset readme.txt : ステージング上の特定ファイルを一つ前の状態に戻す
git revert HEAD (:wq) : 最新コミットを打ち消す
git add . : 全てのファイルをステージングエリアに仮登録
git commit -a -m “2nd commit” : -a = 仮登録とコミットを同時に実行、-m = コミットメ	ッセージの指定
git log ―online : コミットメッセージのみ表示
git log -1 : 直近logのみ表示(数字は表示するコミットログの件数）
git status -s : シンプルな表示
git diff : ステージングとワーキングディレクトリを比較
git diff ―cached : 最新コミットとステージングエリアを比較
git diff HEAD : 最新コミットとワーキングディレクトリを比較
git checkout readme.txt : ワーキングディレクトリのファイルを前の状態に戻す
git reset readme.txt : ステージング上の特定ファイルを一つ前の状態に戻す
git revert HEAD (:wq) : 最新コミットを打ち消す

⚪︎ブランチ : 作業内容に合わせてリポジトリを分岐する機能(default = “master”)
git branch : ブランチの確認
git branch add_html : ブランチの作成
git checkout add_html : ブランチを切り替える
git checkout master
→ git merge add_html (ブランチ名) 	: ブランチをmasterにマージする
→ git branch -d add_html : ブランチの削除
git checkout -b <ブランチ名> : ブランチを作成し、切り替える
git status : 衝突の状態の確認
→ 衝突ファイルをエディタで開いたときに、”<< >>”　で囲まれた部分が衝突している箇所
【初心者向け】はじめてのWebアプリケーション開発 デモアプリ作成 フロントエンド編

## はじめに
　言語学習を終えた後、本格的なWebアプリを開発する前に、フロント、バックエンド、Dockerなど使用予定の技術をを組み合わせた簡単なデモアプリを作成しました。
　作成した理由は、いきなりすべての技術を組み合わせたアプリを開発すると、設定がごちゃごちゃになると考えたからです。
 この記事では言語 + フレームワーク + UIフレームワークの環境構築について記載します。
　WindowsPCでUbuntuでLinux環境を構築して開発を行いました。Ubuntu等の環境設定方法は以下の記事に記載しました。
[windowsでUbuntu,homeblew,nodebrewをインストール、VSCodeでTypeScript環境を構築する](https://qiita.com/bear05/items/265401176698bccbfee4)

## バージョン等
Windows10
Ubuntu 20.04.4 LTS
Homebrew 3.5.7
nodebrew v18.7.0
node v18.7.0
npm 8.15.0

エディタ…VSCode
typescript@4.7.4
eslint@8.21.0
husky@8.0.1
prettier@2.7.1
next@12.2.4
react@18.2.0
@mui/material@5.10.0




## 環境構築 フロントエンド
### 言語 + フレームワーク
　まずはフロントエンドの環境構築を行いました。
　私は、TypeScript +  Next.jsだったので以下の記事を参考にしました。
　丁寧な解説でとてもわかりやすかったので、同じくTypeScript +  Next.jsでフロントエンド開発をしたい方におすすめです。

[【Next.js】環境構築を解説してみた【TS+ESlint+ Prettier+Husky】](https://zenn.dev/akino/articles/96ae4136447433)

　フォルダ構成によっては、以下のESLintのエラーがでると思います。

```
Parsing error: Cannot read file '.../tsconfig.json'.eslint
```

解決方法は以下の2つ記事を参考にしました。
[VSCode 上での ESLint エラーの解消](https://zenn.dev/taichifukumoto/scraps/45be5ffdfa8457)
[ESLintの設定をしたAngular 11のプロジェクトでVS CodeのExtension「ESLint」を使ってみた](https://dev.classmethod.jp/articles/vscode-eslint-extension-on-angular-eslint-project/)

　言語＋フレームワークの環境構築を行う前に、言語(TypeScript)とフレームワーク(Next.js)はそれぞれ個別で公式のチュートリアルなどで環境構築、学習することをおすすめします。
いろんな言語を経験して、慣れている方であれば言語+フレームワークから開発をはじめても問題ないかもしれませんが、
経験が少ない方はわからないことが多く、混乱すると思うので一つ一つ学習していきましょう。

### UIフレームワーク
　cssデザインの作業を簡略化するために、UIフレームワークを導入しました。
　業務での使用経験があったため、UIフレームワークにはMaterial UIを採用しました。

　以下の記事を参考に導入しました。
[Next.jsにMaterial UIを組み込んだ環境を作る](https://zenn.dev/ttani/articles/next-materialui-setup)

### その他トラブルへの対処

　他にもホットリロードが有効にならないなどのトラブルがありましたが、そのときの参考記事は以下です。
[Next.js で ホットリロードが聞かない時の変更箇所](https://pgmemo.tokyo/data/archives/2154.html)
[[VSCode] TypeScriptにESLintを入れると Parsing error: “parserOptions.project” has been set for @typescript-eslint/parser. が表示される](https://wonwon-eater.com/ts-eslint-import-error/#outline__2_1)
[Next.jsが遅い](https://sankame.github.io/blog/2022-05-21-nextjs_so_slow/)
[.gitignore の変更が反映されない→キャッシュ削除する方法](https://qiita.com/kohei_wd/items/f1d224c9257d1e242b58)

### gitへのリンク
 フロントの環境構築のソースは以下のgitに公開しました。
https://github.com/akane-05/test-app/tree/feature-front


## まとめ
　フロントの環境開発は、installするパッケージ、設定する項目が多く、時間がかかりました。
　nodeの依存関係がごちゃごちゃになり、はじめからやり直すこともありましたが、とても勉強になったので結果としては良かったと感じています。
PostgreSQL14をRocky Linuxにインストール

# 前提
* インストールしたいバージョンはPostgreSQL 14
# 環境
* RockyLinux 9
（RedHat系であれば下記手順で問題なくインストール可能と思われる）
# 手順
* パッケージのインストール
* 私の場合デフォルトのyumリポジトリにpostgresql14のパッケージがなかったのでリポジトリをダウンロードする
```
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
```

* postgresユーザーに切り替える(パッケージインストールすると作成されるユーザーです)
	* rootだとセキュリティ的にinitdbで怒られるはずなので
```
su - postgres
```
* データベースクラスタを作るためにinitdb、、といきたいがパスが通っていないのでパスを追加する
```
vi ~/.bash_profile

PATH=/usr/pgsql-14/bin:$PATH
```

* これでinitdbが使えるようになったので、データベースクラスタを作成する
```
initdb --no-locale --encoding=utf8 -U postgres -D /tmp/tmpdir
```

* あとはデータベースクラスタを起動すればOK
```
pg_ctl -D /tmp/tmpdir start
```
そういえば昔ここでつまずいたんだよな

必要に駆られて、どうしてもセンサーとマイコンを使って物体の温度と雰囲気温度湿度の情報を長期間集めなければならないのです。

お金で解決もできるか？と思ったが。。。
世の中の測定器って意外にそううまくはない。

子供のころお世話になったものにカシオのPB100というポケットコンピューターがある。

今、思えば電卓に毛が生えた程度のものですが。。。

このBASICが子供にはわかりやすかった。
変数の概念もあるんだけど、数は一文字のアルファベット、文字はアルファベット＋＄
＄だけは特別で文字列が扱える。

ややこしいのはここくらい。

正直、あとはひたすらFOR文でループ回す簡単なゲーム書いて遊んでました。

もう少し年齢が上がり、他のことに興味が湧きだしたころ。。
Cとかの言語が流行りだしましたが、変数の宣言とかがめんどくさくなり、なんだか手を付けていませんでした。


あれから40年。
子供の世界はブロックでのプログラム。
でも、ちょっと外れたことをするとややこしいことしないといけない。。。

micropythonに会いました。

いろいろできるようですが、なんだか昔のCASIO BASICに似た匂いを感じます。

これで、データロガーセットを作ります。
ClipRRectとは？

# 子Widgetの角を丸める
https://api.flutter.dev/flutter/widgets/ClipRRect-class.html

ClipRRectでラップしたWidgetの角を丸めて使うことができるWidgetです。分かりやすい例を出すと、四角い箱の角を丸くすることができて、角丸の正方形を作る以外に、丸の形状にすることもできます。

## 🟥正方形、🔴円形
```dart
import 'package:flutter/material.dart';

class ClipRectObject extends StatelessWidget {
  const ClipRectObject({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ClipRRect(
            borderRadius: BorderRadius.circular(10),// borderRadiusは、ClipRRectの子Widgetの角を丸める
            // 横と縦の幅が300px赤色のコンテナを作る
            child: Container(
              width: 300,
              height: 300,
              color: Colors.red,
            ),
          ),
        ],
      ),
    ));
  }
}
```

## BorderRadius.onlyを使う
左上の角を丸くしたい、右下の角を丸くするなら、BorderRadius.onlyを使います。工夫したら羽のようなオブジェクトを作れそうですね。

```dart
import 'package:flutter/material.dart';

class ClipRectObject extends StatelessWidget {
  const ClipRectObject({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ClipRRect(
            // 指定した箇所を角丸にする
            borderRadius: const BorderRadius.only(
              topLeft: Radius.circular(10.0),// 左上の角
              topRight: Radius.circular(100.0),// 右上の角
              bottomRight: Radius.circular(30.0),// 右下の角
              bottomLeft: Radius.circular(100.0),// 左下の角
            ),
            child: Container(
              width: 300,
              height: 300,
              color: Colors.red,
            ),
          ),
        ],
      ),
    ));
  }
}
```

## まとめ
ClipRRectを使えば、角丸の図形が簡単に作ることもできますし、丸の図形も作れます。皆さんも色々試してみてください。僕は普段角丸の図形は作らないので、これ面白いな〜と感動しておりました。
late finalとは？

# なぜlateをつけるのか？
late finalは、Dartで変数を遅延初期化するための修飾子です。この修飾子を使用することで、変数を宣言時に初期化せずに後で初期化することができます。

以下に、Dartでlate finalを使用して変数を遅延初期化するロジックの例を示します。
```dart
void main() {
  final myClass = MyClass();
  
  // 変数を遅延初期化する
  late final int lateInitializedValue;
  
  // 遅延初期化前は参照できない
  // print(lateInitializedValue); // Error: LateInitializationError
  
  // 遅延初期化
  lateInitializedValue = 42;
  
  // 遅延初期化後は値にアクセスできる
  print(lateInitializedValue); // 42
}

class MyClass {
  MyClass() {
    // コンストラクタで値を遅延初期化する
    late final int lateInitializedValue;
    
    // 遅延初期化前は参照できない
    // print(lateInitializedValue); // Error: LateInitializationError
    
    // 遅延初期化
    lateInitializedValue = 123;
    
    // 遅延初期化後は値にアクセスできる
    print(lateInitializedValue); // 123
  }
}
```
上記の例では、late final修飾子を使用してlateInitializedValue変数を遅延初期化しています。遅延初期化前は変数にアクセスするとLateInitializationErrorがスローされますが、遅延初期化後は値にアクセスできます。

late finalを使用する主な目的は、変数が初期化されないとプログラムが正しく動作しない場合や、初期化のタイミングが他の要因に依存する場合に使用します。遅延初期化を利用することで、変数の初期化を適切なタイミングまで遅らせることができます。

## まとめ
lateがいつ呼ばれるかのタイミングですが、初めて変数が参照されたタイミングです。なぜなら、初めて変数が参照された時に初期化が行われるからです。
ポートフォリオについて

# MovieLikes

## 初めに
プログラミング学習の成果物として今回のポートフォリオを制作いたしました。
アウトプットとしてこちらに投稿します。

## ポートフォリオについて
『MovieLikes』という名前で映画の円盤販売のフリマアプリの開発いたしました。
なぜなら私は映画が好きなのですが、
サブスクでの配信もなくすでに販売されていない映画の
流通ルートを作りたいと思ったからです。
開発に当たって出品者はアピールをしやすいように商品説明機能や在庫管理しやすい出品履歴機能を、
ユーザーレビュー機能により購入者が安心して取引できるようにし、
自分と同じように映画を好きな人が利用したくなるよう意識しました。

## 開発環境
・PHP7.4.33
・Laravel8.0
・Docker
・MySQL
・Github
・Visual Studio Code

## 実装機能
| No|    機能　   　　|  　　　　　　機能について 　　　　　 |
|:-:|:-----------------:|:-----------------------:|
| 1 |新規登録機能|                                   |
| 2 |ログイン機能|                                   |
| 3 |ゲストログイン機能|新規登録不要の予め登録されているユーザー|
| 4 |商品の検索機能|商品一覧から該当の商品を検索できる|
| 5 |ページネーション機能|商品一覧、出品履歴、購入履歴,お気に入りページに|
| 6 |商品出品機能|商品の名前、説明、値段、ジャンル、画像などを登録|
| 7 |商品の削除機能||出品者が商品を削除できる|
| 8 |商品購入機能|商品の購入する|
| 9 |ユーザーレビュー機能|購入者が出品者のレビューをする|
| 9 |サイトレビュー機能|ユーザーがサイトのレビューをする|
| 10|出品履歴機能　|出品履歴を確認できる|
| 12|購入履歴機能　|購入履歴を確認できる|
| 13|お気に入り機能　|商品をお気に入り登録できる|
| 14|クーポン機能　|クーポンが使用できる|
| 15|マイページの編集機能　|マイページを編集できる|

## DB設計
![movielikesER図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3054307/aade4198-bb1c-f1f5-e26e-beb99af1a46d.png)

## セキュリティ対策
**クロスサイトリクエストフォージェリ (CSRF)**
今回はPHPフレームワークのLaravelを使用しました。

>Laravelは、アプリケーションによって管理されているアクティブなユーザーセッションごとにCSRF「トークン」を自動的に生成します。このトークンは、認証済みユーザーが実際にアプリケーションへリクエストを行っているユーザーであることを確認するために使用されます。このトークンはユーザーのセッションに保存され、セッションが再生成されるたびに変更されるため、悪意のあるアプリケーションはこのトークンへアクセスできません。

と、Laravelの公式ページに記載があるので、

`@CSRF`のBladeディレクティブを使用して、非表示のトークン入力フィールドを生成しました。


## デプロイ
Herokuを使用してデプロイ致しました。
本番環境に各種ファイル、データベースの設置。

また、Heroku場合デプロイしただけでは画像を表示しないため、
AWSのS3を使用してバケット内に保存させることで、
本番環境で画像を表示させました。


[MovieLikes](https://movielikes-3b5343c4a560.herokuapp.com/)

## 工夫した点
コーディングの可読性の意識
・わかりやすくするため関数や変数名などはなるべく詳細な命名を。
・インデントを揃える

## ポートフォリオの課題点
・デザイン面でユーザーが見やすいUIなどの意識もしていきたい。
・コントローラーにたくさん処理を書くFATコントローラーになってしまっているので、
　　ファイルを分けるのが望ましい。
・実装したい機能がまだある（パスワード再設定やメール送信など）
・DBの正規化
→実際にカラムとしてテーブルに入れたが使用しなかった物もある、
　ですのでDB設計を見直すことによりもっとシンプルにできると考えている。
AtCoder Beginner Contest 323


## D 問題
- 優先度付きmapで小さい値から処理をおこなう。
- 小さい値から貪欲的に結合していき、結合できない奇数となるものの合計を計算する。

``` java:Main.java
import java.util.*;
import java.io.*;
import java.math.*;
import java.util.stream.*;

public class Main {
	public static void main(String args[] ) throws Exception {

		BufferedReader br = new BufferedReader( new  InputStreamReader( System.in ) ) ;
		int N = Integer.valueOf ( br.readLine() ) ;
		
		TreeMap<Long,Long> map = new TreeMap<>() ;
		for ( int i=0  ;i<N ; i++ ) {
			String[] ss  = br.readLine().trim().split(" ") ;
			int S = Integer.valueOf ( ss[0] ) ;
			int C = Integer.valueOf ( ss[1] ) ;
			map.put( (long) S , (long) C ) ;
		}
		
		long t = 0 ;
		while ( ! map.isEmpty() ) {
			Map.Entry<Long,Long> entry = map.pollFirstEntry() ;
			long key   = entry.getKey() ;
			long value = entry.getValue() ;

			if ( value % 2 != 0 ) t += 1 ;
			if ( value / 2 != 0 )
				map.put( key * 2 , map.getOrDefault( key *2 , 0L ) + value / 2 ) ;
		}
		System.out.println( t ) ;
	}
}
```
## E 問題
- 下記のようにdp配列を使いまわせば制限時間内になる。ループ内で配列を新たに作るとNG

``` java:Main.java
import java.util.*;
import java.util.stream.*;
import java.math.*;
import java.io.*;

public class Main {
	public static void main(String args[] ) throws Exception {

		BufferedReader br = new BufferedReader( new  InputStreamReader( System.in ) ) ;
		String[] ss = br.readLine().trim().split(" ") ;
		int N = Integer.valueOf( ss[0] ) ;
		int X = Integer.valueOf( ss[1] ) ;

		ss = br.readLine().trim().split(" ") ;
		int[] t = Arrays.stream ( ss ).mapToInt(Integer::valueOf).toArray() ;

		long mod =  998244353L ;
		long bx = BigInteger.valueOf( N ) .modInverse( BigInteger.valueOf( mod ) ).longValue() ;
		
		long t2 = 0 ;
		long[] dp = new long[X+1] ;
		dp[0] = 1 ;
		while ( true ) {
			int c = 0 ;
			for ( int i=0 ; i<dp.length ; i++ ) {
				if ( dp[i] == 0 ) continue ;
				long x = dp[i] ;
				dp[i] = 0 ;
				for ( int j=0 ; j<t.length ; j++ ) {
					if ( i + t[j] > X ) {
						if ( j== 0 ) {
							t2 += ( x * bx  ) % mod ;
							t2 %= mod ;
						}
					} else {
						dp[i+t[j]] += ( x * bx ) % mod ;
						dp[i+t[j]] %= mod ;
						c += 1 ;
					}
				}
			}
			if ( c == 0 ) break ;
		}
		System.out.println( t2 ) ;
	}
}
```

- もしくは曲が選ばれると必ず時刻が1以上増加するため、優先度付きMapを使い小さい値から処理をする。(処理内容が把握しやすいため、実際にはこちらで提出したが処理時間的にはよくない)

```java:Main.java
		TreeMap<Integer,Long> map = new TreeMap<>() ;
		map.put( 0 , 1L ) ;
		
		long t2 =0 ;
		while ( ! map.isEmpty() ) {
			int r = map.firstKey() ; 
			long x = map.get(r).longValue() ;
			map.remove ( r ) ;

			for ( int i=0 ; i<t.length ; i++ ) {
				int v = t[i] ;
				if ( r + v > X ) {
					if ( i== 0 ) {
						t2 += ( x * bx  ) % mod ;
						t2 %= mod ;
					}
				} else {
					int key = r + v ;
					long x2 = ( x * bx ) % mod ;
					long d = map.getOrDefault( key , 0L ) ;
					d += x2 ; 
					d %= mod ; 
					map.put( key , d ) ;
				}
			}
		}
```
Railsの基礎について

# Railsの基礎

## **Ruby on Railsの特徴**

- MVCにより構成

     MVC（Model-View-Controller）とは、プログラムをModel、View、Controllerの3要素に分割し、ソフトウェア内部データをユーザから分離することで、ソフトウェアの保守性を向上させる考え方です。

!https://udemy.benesse.co.jp/wp-content/uploads/08d09bb2261e51937df93f9044415eb9.png


  Controllerからのメッセージを受け取り、アプリケーションが扱うデータとその手続きに関しての処理を行います。データが変更された場合、Viewに表示の変更を指示します。Ruby on Railsでは、Active RecordによりModelを扱います。(DBとの受け渡しの役割)

**Rails modelを使うと、直感的で記述しやすいコードでデータベースを扱うことができる。**

データベースはテーブルの集合でできています。テーブルとは、エクセルの表のように情報を縦横に並べたものです。(テーブルの列を**カラム**、行を**レコード**といいます)

**View**

   データをユーザが見やすいように提供します。Modelからの指示を受け、データの変更などをUIに反映します。

 **Controller**

  ユーザからの入力をModelに引き渡します。ユーザはModelの内部データを直接変更するのではなく、Controllerを通じてModelに伝えます。これにより、ソフトウェアの保守性が向上します。Ruby on RailsではApplicationControllerクラスを利用します。(基本的にCRUD処理を書くところ)

　　Railsの**controller**とは、一言で言うと、「**パソコン(ブラウザ)からのリクエストを受け取り、model・viewと連携しながら結果をブラウザに送る(レスポンス)役割を担う部分**」です。

**【Rails controllerの具体的な役割】**

・ブラウザからの入力を受け取る（ルーティングの設定が必要）

・データをmodelに要求する

・データの追加や変更をmodelに指示する

・適切なviewを選ぶ

・データをviewに渡す

**ルーティング**

---

 ルーティングは**送られてきたリクエストから次にどのコントローラのどのアクションを動かすのか**を決定するもの。

ここでいうリクエスト、とは「http://localhost:3000/greetings」のうちのgreetings。

「http://localhost:3000/greetings」のうちhttp://localhost:3000/は**ホスト**名、greetingsは**パス**と言う。

ホスト名とは実際のサーバの名前、ここで重要なのがパスであるgreetings。

**パスであるgreetingsが呼ばれた時、これに対応するコントローラのアクションが呼ばれる。**
RailsAPIテストについての備忘録

# APIテストについて
　RailsのAPIテストについて理解がなかなかできていない部分があるので、調べたものを備忘録としてまとめていく。

## Rspecとは
 - そもそもRspecとは、RubyプログラマのためのBehaviour-Driven Developmentツール
 - テスト駆動開発、ドメイン駆動設計、受入テスト駆動設計を組み合わせたソフトウェア開発のアプローチ

**何が言いたいのかというと。。**
  RSpecを使うことでRailsでテストを実行することができるということ

## テストを書く理由
- テストコードはアプリケーションの命綱、安全ネット、防弾チョッキ
  画面に不具合が発生し、期待通りの挙動にならなくなるのを防ぐ役割

- 将来の自分が楽をするために書く（開発効率をあげる）
   コマンド一つで今まで書いてきたコードの動作確認ができる（１つ１つ手作業で確認しなくて良い）
**リファクタリングをするには必須になる!**

- 将来共同で作業をするかもしれないメンバーに向けて書く
コードを書いた人の意図や期待している動きなどをテストコードで伝えることができる!

## どういった所にテストを書くのか？

- 今の自分、または将来の自分が信頼できないところ
今後コードを変更した際に不具合が発生しそうな部分
- アプリケーションの管理上重要なところ
権限管理やログイン回り
 - アプリケーションの重要度が高いところ
    userやarticleが作成できたり、変更できたりする部分
- 手動で何度も動作確認をするよりテストを実行した方が効率的なところ

## テストコードを書くときに意識すべきこと

- 漏れのない、テスト項目を抽出する
テストに時間をかけすぎてないように最小限のコードを心がける
- データの更新や削除を伴うテストを書く場合は、before/afterの両方を検証する。
更新なら、AがBに変わったことを検証する（つまり、最初はAだったことを検証しておく）
削除なら、Aが消えたことを検証する （つまり、最初はAが存在していたことを検証しておく）



この記事は以下の情報を参考にして執筆しました。
- https://qiita.com/jnchito/items/2a5d3e15761fd413657a
Raspberry Pi Pico Wで温湿度気圧計を作る④

# 目次
[1.前回のまとめ](#1前回のまとめ)
[2.温湿度と気圧を表示する](#2温湿度と気圧を表示する)
[3.スタンドアロン化](#3スタンドアロン化)
[4.完成品](#4完成品)
[5.まとめ](#5まとめ)

# 1.前回のまとめ
houwouです。
[前回の投稿](https://qiita.com/houwou/items/39b4787e1d2a04c7c8d8)でRaspberry Pi Pico Wと有機ELディスプレイSSD1306、気圧センサMPL115A2、温湿度センサDHT20のI2C通信が無事に成功した。
今回は少し実用的なスタンドアロンの温湿度気圧計を設計してみる。

# 2.温湿度と気圧を表示する
まずはコーディング。
```python:main.py
from machine import I2C, Pin
from time import sleep
from dht20 import DHT20
from mpl115a2 import MPL115A2
from ssd1306 import SSD1306_I2C

def show_display(display, temp, humi, pres):
    display.fill(0)
    display.text('SSD1306 TEST', 5, 2, True)
    display.text(f'TEMP: {temp}C', 5, 18, True)
    display.text(f'HUMI: {humi}%', 5, 34, True)
    display.text(f'PRES: {pres}hPa', 5, 50, True)
    display.show()
    return

i2c = I2C(0, scl=Pin(13), sda=Pin(12))
dht20 = DHT20(i2c)
mpl115a2 = MPL115A2(i2c)
display = SSD1306_I2C(128, 64, i2c)

while True:
    temp = dht20.dht20_temperature()
    humidity = dht20.dht20_humidity()
    air_pressure = mpl115a2.air_pressure()
    show_display(display, str(round(temp,1)), str(round(humidity,1)), str(round(air_pressure,1)))
    sleep(1)
```
main.pyとしてRaspberry Pi Pico W本体に保存して起動時に自動で走るようにする。
有機ELディスプレイへの出力はshow_displayとして関数化。
I2Cのfrequencyを100kHzにしていたらSSD1306が正常に動作しなかったのでデフォルトの400kHzに設定。
1秒ごとに温度、湿度、気圧を取り込んでディスプレイに表示させるようにループする。
温度、湿度、気圧が小数第5位や第3位まで表示してくれて非常に長いのでいずれも小数第1位に丸めるためにround関数を使用。（正確な四捨五入ではないらしいが、今回は正確さより手軽さを選択した。）
参考：[note.nkmk.me - Pythonで小数・整数を四捨五入するroundとDecimal.quantize](https://note.nkmk.me/python-round-decimal-quantize/)

そしてできたのがこちら。
![20231007_212309.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/f690a6a9-5b10-f7af-f867-8c9fe1f08918.jpeg)
それにしても「℃」や「°」というのが表示できなくて「C」で代用したためなんだか不格好。

# 3.スタンドアロン化
Raspberry Pi Pico WはUSBからだけでなく電池からの電源供給でも稼働するらしい。
参考：[Introduction to Raspberry Pi Pico guide](https://projects.raspberrypi.org/en/projects/introduction-to-the-pico/12)
この仕組みを使ってスタンドアロン化してみる。

[RP2040のデータシート](https://datasheets.raspberrypi.com/rp2040/hardware-design-with-rp2040.pdf)に詳細が載っていた。
![RP2040-power.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/b008e4ea-f0a0-0044-8296-5bd192717ca2.jpeg)
VSYSに1.8～5.5Vを供給するらしい。（多分GNDはどこでもいいんだろうなぁ。）
今回は手元にあった単四電池3本の4.5Vを供給する。
あとは適当にスイッチと10μFの電解コンデンサを組み込んでできたのがこちら。
![スタンドアロン温湿度気圧計-回路図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/63fb3412-2d10-e69b-d33a-6c41470169d9.jpeg)
![20231007_133455.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/3a2b6740-58d1-85f0-4c94-188411c44afb.jpeg)
ラバースイッチと電池ボックスは古いおもちゃから抜き取ったものを再利用。
これでスイッチを押している間は1秒ごと自動更新する温湿度気圧計ができたはず。

# 4.完成品
![20231008_083847.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/00527558-86ec-1f63-0f5c-344c7050d24b.jpeg)
無事に完成！
ただ、接触が悪いのかスイッチが悪いのか少々動作が不安定。
起動にコツがいる気難しい装置が出来上がった。

# 5.まとめ
気になったときに温度、湿度、気圧がわかるちょっとだけ便利な装置ができた。
動作が不安定だったりスイッチの使い勝手が悪かったりと課題はあるが、ひとまず使える温湿度気圧計が出来上がった。
次は折角Raspberry Pi Pico Wで実装したから無線LAN機能を活用してみたい。
laravelで論理削除

# そもそも論理削除とはなんぞや？
論理削除は、
本当にデータベースから削除するのではなく、フラグなどを立ててシステム上から見えなくすること。

反対に物理削除もある。
こちらは文字通りデータそのものを削除する方法。


物理削除してしまうと貴重なデータが完全に消えてしまうが、
DBに残しながらも削除扱いとなる論理削除(SoftDelete)だと必要なコマンドを打てば取り出すことができるため分析時に役に立つ。

# 手順
### ①マイグレーションファイルを修正し、`deleted_at`カラムを追加する
下記コマンドでマイグレーションファイルが新たに作成される。
```terminal
php artisan make:migration add_deleted_at_to_users_table --table=users
```

作成されたマイグレーションファイルを開き、下記のように加筆する。
`nullable()`はnullを許容しているため、必ず登録する必要がない場合はつけてあげる。
```php
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->softDeletes()->nullable();
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropSoftDeletes();
    });
}
```

マイグレーションの実行をする。
```terminal
php artisan migrate
```

### ②ソフトデリートを使用できるようにモデルで宣言

- モデルで宣言するだけで、`delete()`処理を実行すると`deleted_at`カラムに現在の時刻がセットされる。
- `deleted_at`カラムに現在の時刻がセットされていると、削除済み隣、クエリ結果に含まれない。

```app/Model/User.php
<?php

namespace App\Models;
use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model
{
    use SoftDeletes;
〜省略
```

# まとめ

Laravelでは ```softDelete()``` を使うことで簡単に論理削除できる。
ABC323をPythonで（E, F）

ユニークビジョンプログラミングコンテスト2023 秋 (AtCoder Beginner Contest 323)のうち本番で解けなかったもの

https://atcoder.jp/contests/abc323

# E問題
X.5秒時点で曲1が流れている確率は

X秒で前の曲が終わって曲1が流れる確率
+X-1秒で前の曲が終わって曲1が流れる確率
+...
+max(0, X-t[0]+1)秒で曲が終わって曲1が流れる確率

曲1が流れる確率は1/n
時刻iで曲が流れ終わる確率は送るdpで求められる
```python:E
n, x = map(int, input().split())
t = list(map(int, input().split()))
mod = 998244353

# dp[i]=時刻iで曲が流れ終わる確率
pow_n = pow(n, -1, mod)
dp = [1] + [0] * x
for i in range(x):
    for t_i in t:
        if i + t_i <= x:
            dp[i + t_i] += dp[i] * pow_n % mod

print(sum(dp[max(0, x - t[0] + 1):]) * pow_n % mod)
```
# F問題
まず考えるパターンを減らすために、点Cを原点に、点Bを第一象限にあるように、平行移動と回転移動をさせる。

移動距離として考えることは
1、荷物を押すための移動で最短距離だと交錯するときは2歩ぶん遠回りする
2、荷物を押しているときに曲がる必要があるときは2歩余分に歩く必要がある

```python:F
xa, ya, xb, yb, xc, yc = map(int, input().split())

# 平行移動　Cを原点に
xa, xb, xc = xa - xc, xb - xc, xc - xc
ya, yb, yc = ya - yc, yb - yc, yc - yc

# 回転移動　Bを第一象限に
if xb < 0:xa *= -1; xb *= -1
if yb < 0:ya *= -1; yb *= -1

def dist(sx, sy, gx, gy):
    # (sx, sy):start
    # (gx, gy):goal
    return abs(sx - gx) + abs(sy - gy)

ans = 0
if xa == xb and ya < yb:
    ans1 = 1 + dist(xa + 1, ya, xb, yb + 1) + dist(xb, yb, xc, yc) + 2 * (xb != xc)
else:
    ans1 = dist(xa, ya, xb, yb + 1) + dist(xb, yb, xc, yc) + 2 * (xb != xc)

if ya == yb and xa < xb:
    ans2 = 1 + dist(xa, ya + 1, xb + 1, yb) + dist(xb, yb, xc, yc) + 2 * (yb != yc)
else:
    ans2 = dist(xa, ya, xb + 1, yb) + dist(xb, yb, xc, yc) + 2 * (yb != yc)

ans = min(ans1, ans2)

print(ans)
```
個人開発を始めます！社会人１０年目（子ども２人）

今まで、時間がなくてできてませんでしたが、
自分でサービスを作ってみたいと思いブログを開始しました。

新卒から同じ会社で１０年間サラリーマンを続けてきて、
個人でサービスを作りたいという思いは今だに消えません。

忙しくなって途中で辞めてしまわないためにも、
ブログをつけていきたいと思います。

技術的な勉強も含めて以下の技術を使って進めたいと思います。

フロントエンド
　AWSのAmplify Studio＋Figma
ReactでSelectタグで現在の値を選択状態

結論は、下記のように書く。

```tsx
<select value={selected} onChange={(e:any) => setSelected(e.target.value)}>
    {getSelectItems.map( (getSelectItem:any) => (
        <option key={getSelectItem.item} value={getSelectItem.id}>
            {getSelectItem.item}
        </option>
    ))}    
</select>
```

ポイントは、selecタグに、"value"という要素を付与し、そこの値に現在の選択された値がくるようする。
この例では、変数selectedが現在の選択された値になっている。

optionタグのvalueが、selectタグのvalueの値と一致するとき、optionタグが選択(checked)
された状態になる。
ionic/Angular16とAuth Guard (CanActivateFnの適用)

今回は、Angularを使用した認証関連の画面制御について検証してみました。
以前は、@angular/routerモジュールのCanActivateを使って制御していましたが、最新のAngularバージョンでは非推奨となり、CanActivateFnの利用を推奨するようになったようです。

## 実装したこと
* @angular/routerのCanActivateからCanActivateFnへのポーティング
* エンドポイントAPIとの通信
* Webストレージに情報を格納/消去

## ソースコード
今回動作検証した際に使用したソースコードはこちらに公開しています。
何かの参考にしていただけると幸いです。

https://github.com/qiita-mobileapps/simple-auth-guard-angular16-ionic

## 主なモジュール
* Angular ver16
* Ionic/Angular Ver7
* rxjs Ver7
* その他エンドポイントexpress.jsなど

## Auth GuardとCanActivateFn
Auth Guard自体の考え方は、多くの諸先輩方が他のページで紹介くださっていますので、当投稿では割愛させていただきます。
auth guardを実装するにあたり、CanActivate（Ver15）からCanActivateFn（Ver16）変更になった点に焦点をあてて紹介したいと思います。

### 以前のバージョンでは
以前までのIonic/Angularでは、ページを追加する際のコマンドにguardsという選択肢があり、大変便利に自動生成してくれていました。自動生成された結果、CanActivateが適用されて基本的なコードが展開されます。
#### ionic generateを使用して追加する例：
```bash
$ ionic g
? What would you like to generate?       
  module
  class
  directive
> guard
  pipe
  interface
  enum
(Move up and down to reveal more choices
? Name/path of guard: protected
> ng.cmd generate guard auth --project=app
? Which type of guard would you like to create? (Press <space> to select, <a> to toggle all, <i> to invert selection, and <enter> to proceed)
>(*) CanActivate
 ( ) CanActivateChild
 ( ) CanDeactivate
 ( ) CanLoad
 ( ) CanMatch
CREATE src/app/protected.guard.spec.ts (331 bytes)
CREATE src/app/protected.guard.ts (457 bytes)     
[OK] Generated guard!
```
指定したパスに「protected.guard.ts」が生成されます。
自動生成された例：
```typescript
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class ProtectedGuard implements CanActivate {
  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {

    // ここで判定結果を返却する実装が一般的です。
    // 外部サービス呼び出しや内部のチェックロジックを実装するなど。
    return true;
  }
}
```

### 今回は
冒頭で申しました通り、最新のAnbular16を使用する場合は、CanActivateではなくCanActivateFnを使用するように変更します。
#### protected.guard.ts
上記から以下のように実装を変更します。
```export const protectedGuard: CanActivateFn```を新規で追加します。
```typescript
export const protectedGuard: CanActivateFn = (_route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {
  const guard = inject(ProtectedGuard);
  return guard.canActivate(state);
};

export class ProtectedGuard {
  canActivate(state: RouterStateSnapshot): Observable<boolean> {
    // 認証状態を判定するロジックを入れる
    return true;
  }
}
```
#### app-routing.module.ts
なお、Routerの設定は古いバージョンから特に意識することなく同様の実装ができます。
```canActivate: [ProtectedGuard]```の部分は以前までのバージョンと同様の記述です。
```typescript
path: 'dashboard',
loadChildren: () => import('./pages/dashboard/dashboard.module').then( m => m.DashboardPageModule),
canActivate: [ProtectedGuard]
```

## 次回は
現在FireFlyの検証をすすめるなかで今後フロントエンドの認証関連のアプリが必要になるだろうということで、認証部分の仕組みにて実装してみました。
次回は、FireFlyをベースにしたアプリを製造する際に必要となる技術要素について検証を進めたいと思います。
【ChatGPT】【Bing＋ImageCreator】GPT-4Visionはまだないけど、疑似体験してみよう。


　どうも、カーブミラーです。

　今回は、GPT-4Visionがまだ届かない、あるいは課金していないから使えない方に、事前練習や疑似体験ができる方法を提示します。

:::note info
本記事は、
　ChatGPTは使っていません。
　　あしからず。
:::

　GPT-4Visionは、
　　なかなかの盛り上がりを
　　　見せていますね。

　先日、
　　YouTuberかわごんさんの
　　　ところで行なった勉強会は、
　　　　まさにGPT-4Visionでした。

　そのようすは、
　　You Tube動画として
　　　アップされています。
[【2023/10/05】かわごん勉強会：ChatGPTに画像でプロンプト](https://youtube.com/watch?v=DKHjM-BzYPc&si=celechixZg8VDZPk)

　私の声も録音されていて、
　　少し恥ずかしく感じますね。
　　　言っておきますけど、
　　　　私は男ですw

　ChatGPTアプリの
　　音声会話についても
　　　かわごんさんが
　　　　動画をアップ
　　　　　されています。
[【ChatGPT】音声マルチモーダルAI：スマホアプリの新機能搭載](https://youtu.be/6vKWXLWiL28?si=yqD6RmNCcOJrLcpK)

　今回は、
　　画像について、
　　　書いていきますね。
***
　かわごんさん勉強会は、
　　以前から、やっていました。
　　　でも、録音したのは、
　　　　初めてなので、
　　　　　ちゃんと録音
　　　　　　できているかと
　　　　　　　不安でしたねw

　それはともかく、
　　はじめましょう。
***
　GPT-4Visionの画像関係は、
　　画像を入力して、
　　　解析させることと、
　　　　DALL-E3で出力させること
　　　　　の双方向ができます。

　あっ、出力させるDALL-E3は
　　別口で、機能開放させる
　　　ようです。
　　　　まだまだ先のようですね。

　今回の目的は、
　　GPT-4Visionの
　　　事前練習や疑似体験を
　　　　することです。

　使うのは、
　　Microsoft Bingと
　　　Microsoft Image Creatorです。

　ご存知のとおり、
　　Microsoft Bingは、GPT4であり、
　　　すでに画像入力が可能です。

　Image Creatorについては、
　　ご存知かわかりませんけど、
　　　中身は、DALL-E3です。

　つまり、
　　GPT-4Visionと同等の
　　　機能を有していると
　　　　言うわけです。
　　　　　別々ですけどね。

　このふたつを
　　使って、GPT-4Visionを
　　　疑似体験できるのです。
***
　では、やってみましょう。

　画像はアップできないので、
　　そこはご容赦くださいw

　まずは、
　　入力枠の右側に、
　　　マイクとGoogleレンズ的な
　　　　マークがありますね。

　レンズ的なマークを
　　タップ（クリック）して、
　　　画像選択してください。

　入力枠に、
　　小さい画面が出てくるので、
　　　プロンプトを入れます。
　　　　どんなことを入れても
　　　　　OKですよ。

　とりあえず、
　　私は、以前に撮影した
　　　某アニメのキャラの立看板を
　　　　入力します。

　それで、
　　プロンプトを
　　　入れます。
```Text:
画像から特徴を抜き出して、ImageCreatorに渡すプロンプトを作成してください。
```

　そう、Image to Imageを
　　しようというわけです。

　まぁ、Image Creatorに
　　呪文を食わせる必要は
　　　あるわけで……えっ！？

　Bingさんの回答に
　　画像が出力されました。
　　　知らんかったわ、マジで。

　でも、「画像生成して」と
　　指示しても
　　　「申し訳ありませんが、
　　　　私は画像を作成するための
　　　　　ツールを持っていません」
　　　　　　と言ってきます。

　そのあと、
　　表示してくれる、というのは
　　　ChatGPTさんに似ていますねw

　しかし、
　　Bingさんを
　　　終了して、
　　　　再度立ち上げると、
　　　　　履歴から、
　　　　　　その画像が消えて
　　　　　　　しまうので、
　　　　　　　　ご注意を。
***
　今回は、
　　ひとつしかやりませんけど、
　　　使い方は、十人十色。
　　　　あなたのアイディアで
　　　　　千変万化すると
　　　　　　思います。

　良い結果が
　　得られますように。

　今回は、ここまで。
Discord likeなチャットアプリを作成した話

## 目次
[1. はじめに](#1-はじめに)  
[2. 作ったアプリについて](#2-作ったアプリについて)  
[3. 開発の流れ](#3-開発の流れ)  
[4. プロジェクトを通して学んだこと](#4-プロジェクトを通して学んだこと)  

## 1. はじめに
discordのようにグループトークができるチャットアプリを開発したのでその記録を記します。
制作したのは1年近く前になりますが、過去の開発記録を残すために記事を作成しました。

## 2. 作ったアプリについて
[2-1 アプリの概要](#2-1-アプリの概要)  
[2-2 アプリの3つの特徴](#2-2-アプリの3つの特徴)  
[2-3 アプリの画面](#2-3-アプリの画面)  

### 2-1 アプリの概要
このチャットアプリは部活動やサークルで使われることを想定して制作しました。部活ごとに「グループ」を作成し、グループごとに複数のトークルームを作ることができます。

![アプリ画面](https://i.gyazo.com/f52ca83a56757a43dabe11d5e46c0e42.png)

### 2-2 アプリの3つの特徴
[1. グループごとにトークルームを整理できる](#1-グループごとにトークルームを整理できる)  
[2. トークルームに簡単に招待ができる](#2-トークルームに簡単に招待ができる)  
[3. レスポンシブデザイン](#3-レスポンシブデザイン)  

#### 1. グループごとにトークルームを整理できる
このアプリは、LINEにおいて1つのサークルで「学園祭用のグループ」や「合宿用のグループ」「団体戦用のグループ」など複数のグループチャットを作成してトークルームがごちゃついてしまうという問題を解消するという目的で作成しました。  
このアプリでは、グループごとに複数のトークルームを作ることができ、トークルームをわかりやすく整理することができます。

画面例
1枚目: サッカー部のグループ、2枚目: 3年1組のグループ
![サッカー部のグループ](https://i.gyazo.com/f52ca83a56757a43dabe11d5e46c0e42.png)
![3年1組のグループ](https://i.gyazo.com/6beee4fb89d3f3baaae179ad2827ff41.png)

#### 2. トークルームに簡単に招待ができる
LINEなどではグループチャットにクラスのメンバーを招待するために全員を招待する手間が必要でした。  
このアプリでは、複数のメンバーをグループやトークルームに手軽に招待できるよう、1つの招待リンクを使って複数の友達を招待できるようにしました。

たくさんの友達を招待したい時は、招待リンクを渡すだけで招待ができます！

左: グループ設定画面、右: トークルーム招待画面  
<img src="https://i.gyazo.com/8e9729828a73045ef6b66066c35c0e51.png" alt="グループ招待" width="400" class="custom">
<img src="https://i.gyazo.com/f55885c6f073664d74dd8029c89c7931.png" alt="トークルーム招待" width="400" class="custom">

#### 3. レスポンシブデザイン
スマートフォンから見てもレイアウトが崩れないよう工夫しました。  
<img src="https://i.gyazo.com/24e21b68c9d9b3b9575e85daa6619150.png" alt="スマホ画面" width="400" class="custom">

### 2-3 アプリの画面
- **メイン画面**  
左のトークルーム一覧からトークルームを選択し、グループトークをすることができます。
![メイン画面](https://i.gyazo.com/f52ca83a56757a43dabe11d5e46c0e42.png)

- **トーク設定画面**  
トークルーム名の右の歯車を押すとトークルーム設定を開くことができ、招待リンクをコピーすることができます。

<img src="https://i.gyazo.com/f55885c6f073664d74dd8029c89c7931.png" alt="トーク設定画面" width="400" class="custom">

- **グループ新規作成**  
右上のグループ名をクリックするとグループ新規作成ができます。グループを作った人は自動的にそのグループの管理者となり、新規メンバーの招待・グループの削除をする権限が付与されます。
<img src="https://i.gyazo.com/d64af715dd48bb05acda2cf2456d73b2.png" alt="グループ新規作成" width="400" class="custom">

- **グループ設定画面**  
右上のアイコンを押すとグループ設定を開くことができ、招待リンクをコピーすることができます。
<img src="https://i.gyazo.com/8e9729828a73045ef6b66066c35c0e51.png" alt="トーク設定画面" width="400" class="custom"> 

## 3. 開発の流れ
2022年7月〜11月で要件定義・開発を行いました。開発全体を通して設計・実装を全て1人で行いました。

|時期|内容|
|--|--|
|7月|要件定義・設計|
|8〜11月|開発|

### 使用技術
**バックエンド**  
- Rails

**フロントエンド**  
- Next.js(React.js)
- Typescript
- テスト: jest・cypress

## 4. プロジェクトを通して学んだこと
### 4-1. 多対多構造を持つデータベース
今回のアプリでは、「ユーザーとグループ」と「ユーザーとトークルーム」が多対多の関係になります。また、ユーザーは属している各グループにおいて**管理者**か**一般メンバー**かが決まっており、その情報も保持する必要があります。

そこで、本アプリではユーザーとグループの間に中間テーブル***joinings***を定義し、ロールに関する情報を*joinings*テーブルに保持する設計にしました。

この開発を通して、中間テーブルを通した多対多構造の扱い方、***has_many :through***の扱いなどを学ぶことができました。

![多対多構造のER図](https://i.gyazo.com/da9e8140ac3a7a06054818b14e769e60.png)

### 4-2. Reactコードの設計
このアプリでは、バックエンドとの通信などの含めた複雑なフロントエンドを扱う必要がありました。そのため、ステートを扱うコンポーネントと見た目を扱うコンポーネント等、コンポーネントごとの役割を明確化してコードを整理する勉強ができました。
【備忘録】SDFファイルへの変換

# はじめに
Gaussian09で量子化学計算を行い、得られたlogファイルからSDFファイルに変換する方法を忘れないようにするためにここに書いておく。

# 使用したもの
・M1 Macbook Air（macOS：Sonoma）
・Gaussian09
・OpenBabel
・Python3（my-rdkit-env）
・Atom（エディタツール）

# 0．Gaussian09で計算
環境は研究室だったので普通に計算。logファイルを変換するPC内のユーザーフォルダーの中に入れておく。

# 0．OpenBabelのインストール
自分でインストールしてください。

# 1．シェルスクリプトの作成
エディタツール（今回はAtom）を使用して、logファイルをSDFファイルに変換するシェルスクリプトを書く。

~~~qiita.sh
#!/bin/bash

# 変換元のディレクトリ
source_dir="/Users/"

# 変換先のディレクトリ
output_dir="/Users/"

# 変換コマンド
convert_command="obabel -i log -o sdf"

# 変換を実行
for log_file in "$source_dir"/*.log; do
    base_name=$(basename "$log_file" .log)
    output_file="$output_dir/$base_name.sdf"
    $convert_command "$log_file" -O "$output_file"
done
~~~

今回はこのスクリプトに、"myscript001.sh"という名前をつけ保存した。

# 2．シェルスクリプトを実行
まず、ターミナルを開いて、シェルスクリプトを実行できるような権限を以下のコマンドで与える。
~~~
% chmod +x myscript001.sh
~~~
以下のコマンドでシェルスクリプトを実行。
~~~
% ./myscript001.sh
~~~
僕の場合は、実行した後に" 1 molecule converted "といったメッセージがlogファイルの数だけ表示された。

# 3．複数のSDFファイルを1つにまとめる
先ほど変換されたSDFファイルを別々の状態にして使用するのは面倒なので1つにまとめる。ここでPythonを使用する。
~~~qiita.py
import glob
import rdkit.Chem as Chem
from rdkit.Chem import SDWriter

# SDFファイルが保存されているディレクトリを指定
sdf_directory = "/Users/"

# 結合後のSDFファイル名
output_sdf_file = "combined.sdf"

# 指定したディレクトリ内のSDFファイルを全て取得
sdf_files = glob.glob(sdf_directory + "/*.sdf")

# 結合処理
combined_molecules = []
for sdf_file in sdf_files:
    suppl = Chem.SDMolSupplier(sdf_file)
    for mol in suppl:
        if mol is not None:
            combined_molecules.append(mol)

# 結合結果を新しいSDFファイルに書き出し
writer = SDWriter(output_sdf_file)
for mol in combined_molecules:
    writer.write(mol)
writer.close()

print('結合完了')
~~~

# 4．変換されたSDFファイルを確認
ここで変換されたSDFファイルが全て変換できているかどうかをPythonで確認する。
~~~qiita.py
import rdkit.Chem as Chem
suppl = Chem.SDMolSupplier('combined.sdf')
mols = [x for in suppl if x is not None]

print(len(mols)) # 読み込んだMolオブジェクトの数になればOK
~~~

# 最後に
いつかこのメモが活用されるときが来ますように
ホワイトハッカーのためのアイコン偽装技術

# はじめに
セキュリティの勉強と息抜きを兼ねて「アイコン偽装」について調査、実装を行いました。

# アイコン偽装とは
マルウェアファイルが実行される前にそのファイルがマルウェアだとばれないようにファイルのアイコンを偽装することをアイコン偽装といいます。2021年には東京五輪の関係者を狙ったアイコン偽装攻撃が確認されています。

# ハンズオン
今回はpdfファイルに見せかけたexeファイルをつくりました。
まず、以下の画面を見てください。
![screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3481383/1256a40c-bb11-a390-ac03-41c2a2a61b0e.png)
一見するとpdfファイルのように見えますが、このファイルをクリックすると...
![terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3481383/55e27068-67e0-353e-4847-6acddda6271c.png)
pdfファイル.....は開かれず、コマンドプロンプトが表示されました。
　実は先ほどpdfファイルだと思ったものはpdfではなくexeファイルであり、実行することで指定したプログラムを裏で走らせる、というものです。
　アイコン偽装ファイルのポイントとして、以下の点が挙げられます。

- アイコンがpdfになっており、pdfファイルであると誤解しやすい。
- ファイル名が長く、末尾の拡張子が見えないせいでexeファイルだと気づきにくい。
- ファイル名に【至急】（今日中に必ずお読みください）などの文字列を入れることで読み手を焦らせ、ファイル実行を誘発する。

　今回作成したexeファイルは上画面のようにコマンドプロンプトを出現しアイコン偽装の注意喚起を表示するというプログラムですが、悪意ある攻撃者はexeファイルにファイル一括削除、暗号化、外部への転送などのプログラムを仕込み、攻撃対象に被害を与えようとします。
　以下に、アイコン偽装プログラム作成の流れを簡単に示します。詳細については参考資料[1]~[5]をご覧ください。
## batファイルの作成 [1][2]
以下の内容をbatファイルに保存します。メモ帳で編集し、拡張子を.batにして保存すれば良いです。
```
@echo off

echo This is NOT ***.pdf BUT ***.bat. Be careful of icon spoofing. 

echo Please push any key and finish this program. 
pause > nul
```

## bat → exe化 [3]
今回はwindows標準搭載のiexpressを用いてbatファイルをexeファイルに変換しました。（batファイルのままだと後述するファイルアイコン変更ができないため）

## pdfアイコンの取得 [4]
アイコンファイルはico形式です。ADOBE公式サイトからダウンロードしたpdfアイコンのpngファイルをアイコンウィザードというアプリを用いてicoファイルに変換しました。

## ファイルアイコンの変更 [5]
ResourceHackerというアプリを用いてexeファイルのアイコンをPDFファイルのアイコンに変更しました。

# まとめ
　アイコン偽装について実装を通して、改めてその脅威を実感することができました。
　今回のアイコン偽装プログラム作成にあたり、専門書などは一切使っていません。すべてネットの情報だけで作成しています（batファイルの書き方などはおさえておく必要がありますが）。また、用いたアプリは執筆時点ではすべて無料で入手可能です。これは、技術がない人でも手軽に攻撃ができてしまうことを示唆しています。
　企業がアイコン偽装による被害にあわないためには

- 文書ファイルなどはファイル名の規格をあらかじめ決めておき、社外に漏らさないようにする。
- ファイル実行前にファイルの種類をしっかりと確認する。（プロパティなどを使う）

等の対策が必要と思われます。

# 参考

[1]

https://www.wikihow.jp/EXE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B

[2]

https://jj-blues.com/cms/command-pause/

[3]

https://www.tekutechlabo.com/2023/04/convert-batch-to-exe.html

[4]

https://www.naporitansushi.com/iconwizard/

[5]

https://itojisan.xyz/settings/25324/#i-6
StreamlitとFastAPIでwebアプリを作ってみた（概要編）

## はじめに
今回PythonのライブラリであるStreamlitとWebフレームワークであるFastAPIを用いてwebアプリを作ってみたので記事にまとめました。

今回のテーマは、
**概要編→バックエンド編→フロントエンド編→デプロイ編**
の順にそれぞれ記事を書いていく予定です。

### 記事の目次
1. アプリの概要
1. アプリの機能一覧
1. なぜこのアプリを作ったのか
1. 使用技術について
1. ディレクトリ構成
1. まとめ

## 1. アプリの概要
一言で言うと、誹謗中傷のような批判的なツイートを排除するアプリです。

具体的には、アプリ上で好きな人物名を入力して検索をかけると、Twitterからその人物名に関するツイートを取得してAIが自動でツイート内容を解析し、肯定的なツイートのみを表示させるようにするというものです。

と、理想はこのように考えていたのですが、途中でTwitterAPIの規約変更によりツイート取得ができないことに気づきました。
アプリ自体のテーマを変更するのは面倒なので、アプリの概要はそのままでKaggleにある文章データを利用してそれをツイート取得とみなし、擬似的に動かせるようにしました。

AIについては自然言語処理による感情分析という技術を用います。

### データセットについて
Kaggleにある[Women's E-Commerce Clothing Reviews](https://www.kaggle.com/datasets/nicapotato/womens-ecommerce-clothing-reviews?resource=download)を例として利用しました。
ECサイトでの婦人服の売上データとなっており、商品分類名や商品に関するレビュー文が格納されています。
レビュー文をツイートに置き換えて考え、ファイルをアップロードすることでツイートを取得できたと仮定しています。

### 使い方
![web_app_movie](https://github.com/kizataka/web_app_sentiment_analyzer/assets/112063667/c514762d-908b-4e8a-b31a-8f00877578e2) 

1. ファイル（Kaggleから取得してきた文章データ）をアップロードします。
2. 文章データが含まれるカラムを選択します。
2. 取得したいレビューに関するキーワードを入力します(本来ならここで人物名を入力し、その人物に関するツイートを取得します)。デモでは`shirt`に関するレビューを取得しています。
2. 取得したいデータ数を指定します。
2. 今回は日付指定は関係ないです。（本来ならどれくらいの期間のツイートを取得するのかを指定します。）
2. 表示するレビューをポジティブにするのかネガティブにするのかを指定します。
2. 分析開始ボタンをクリックします。クリックすると感情分析が始まります。
2. `shirt`に関する肯定的なレビューのみが表示されます。（本来なら検索した人物名に関するポジティブなツイートが表示されます。）

## 2. アプリの機能一覧
* ファイルのアップロード
* データのサンプル表示
* サイドバーでの検索設定
    * データのカラム選択
    * キーワード検索
    * 取得するデータ数の指定
    * 感情フィルターの選択
* 文章の感情分析
* 分析結果の表示

## 3. なぜこのアプリを作ったのか

作成に至った背景としては、
* 参加したインターン先で自然言語処理に触れる機会があり、自然言語処理の面白さを実感して自分でも何か作ってみたい
* 自分でwebアプリを0から開発してみたい

という気持ちがありました。

どうせ作るなら、小さくてもいいので課題解決できるようなアプリにしたいと考えました。そこで、Twitterをテーマに設定しました。

Twitterには様々な内容のツイートが飛び交っています。自由なので仕方がないですが、特定の人に対する誹謗中傷のような批判的なツイートはやはり気分が良くないです。

私にはとても好きなサッカー選手がいるのですが、その選手が好きすぎるあまりその選手に対する批判的なツイートがあると自分も気分が悪くなってしまいます。

ツイートを止めるのは無理なので、批判コメントのようなネガティブなツイートを排除してポジティブなツイートのみが表示されるようになれば最高では、と考え開発に至りました。

## 4. 使用技術について
言語は全てPythonです。

### 環境構築
* Poetry 1.6.1
仮想環境の作成とプロジェクトの依存関係を管理するためにPoetryを利用しました。
Poetryについては以下の記事を参考にしました。

https://zenn.dev/alivelimb/articles/20220501-python-env

### フロントエンド
* Streamlit 1.27.1
デザインは簡易的にはなりますがPythonのみでフロントエンドを手軽の実装できるのでこちらを使いました。

### バックエンド
* FastAPI 0.103.2
* transformers 4.33.3

PythonにはDjangoやFlaskのようなwebフレームワークが有名ですが、FastAPIは最近人気が出ていて話題になっており、気になっていたのでこちらでAPI構築を行ってみました。

また、transformersはアメリカのHuggingFace社が提供している自然言語処理に特化したディープラーニングのフレームワークであり、多くの事前学習済みモデルを提供しています。簡単に最新の自然言語処理モデルを実装することができるのでこちらを利用しました。

### データベース
今回はデータベースを使用しません。アップロードされたデータから条件に当てはまるレビュー文を取り出して表示するだけなのでCRUD処理は発生しません。

## 5. ディレクトリ構成
```
.
├── app.py                       Streamlitでフロントエンド実装
└── sql_app
	├── __init__.py
	├── main.py                  FastAPIのバックエンド実装
	├── schemas.py               Pydanticによる型定義
	└── sentiment_analysis.py    感情分析モデルの設定
```

## 6. まとめ
以上が今回作成したアプリの概要になります。

次回からバックエンドの実装についてまとめていきたいと思います。

**次回の記事はこちら**

https://qiita.com/kizataka/items/7e293b5814c5acdbb5f0
Goのiotaは定数宣言のインデックス

Goの公式docに沿って「iotaとは何か」を読み取っていきます

## iotaの概要

>Within a constant declaration, the predeclared identifier iota represents successive untyped integer constants. Its value is the index of the respective ConstSpec in that constant declaration, starting at zero. 
（定数宣言内で、事前に宣言された識別子iotaは、型付けされていない連続した整数定数を表す。その値は、定数宣言内の各 ConstSpec のインデックスで、0 から始まります。）

- つまりiotaは定数の宣言行に対応したインデックス
- 補足
    - 「型付けされていない整数定数」
        - →Intではあるものの、どのIntか（Int8、Int16など）は決まっていないということ
    - 「ConstSpec」
        - →定数の宣言行のこと

ConstSpecの例）
```
const (
	c0 = iota  // ConstSpec1つ目
	c1 = iota  // ConstSpec2つ目
)
```

## iotaの具体例

### 例①
```
// 0からインデックスが割り当てられる
const (
	c0 = iota  // c0 == 0
	c1 = iota  // c1 == 1
	c2 = iota  // c2 == 2
)
```

### 例②
```
// ビット演算については後述
const (
	a = 1 << iota  // a == 1  (iota == 0) 1を0ビット左へ
	b = 1 << iota  // b == 2  (iota == 1) 1を1ビット左へ
	c = 3          // c == 3  (iota == 2, unused)
	d = 1 << iota  // d == 8  (iota == 3) 1を3ビット左へ
)
```
#### ビット演算

- 「x << y」と書くと「xをyビット左へズラす」という意味

例）
- 1 << 1
    - 1を1ビット左へズラす（0001 -> 0010）ので、2になる
- 1 << 3
    - 1を3ビット左へズラす（0001 -> 1000）ので、8になる

### 例③
```
// 定数に型宣言をつけることで、iotaの結果に型が付く
const (
	u         = iota * 42  // u == 0     (untyped integer constant)
	v float64 = iota * 42  // v == 42.0  (float64 constant)
	w         = iota * 42  // w == 84    (untyped integer constant)
)
```

### 例④
```
// iotaは定数宣言行のインデックスなので、1行に2つ宣言しても、2回インクリメントされたりはしない
const (
	bit0, mask0 = 1 << iota, 1<<iota - 1  // bit0 == 1, mask0 == 0  (iota == 0)
	bit1, mask1                           // bit1 == 2, mask1 == 1  (iota == 1)
	_, _                                  //                        (iota == 2, unused)
	bit3, mask3                           // bit3 == 8, mask3 == 7  (iota == 3)
)
```

>This last example exploits the implicit repetition of the last non-empty expression list.
（この最後の例は、最後の空でない式リストの暗黙の繰り返しを利用している。）

#### 「暗黙の繰り返し」とは

- 連続する定数宣言に、値・式が書かれていない時、直前の値・式が使用されること

## 参考文献

- [The Go Programming Language Specification - The Go Programming Language](https://go.dev/ref/spec#Iota)
SESで45歳目前にして危機感③　生き残る道を考える

これからSESで生き残る為にどうすべきか考えて行きます。

### 派遣先が求めているもの。
派遣される立場なので、派遣先のお客さんの考えは分かりませんが、
それを考えないと、自分がどこに向かえばよいのか分からないので考えます。

派遣先の立場で考えると。
システム開発の仕事があり、自社内メンバーだけでは足りない場合に、
技術派遣社員を雇うと思います。

雇う技術者は必要なスキルを持っているかどうかで判断します。
①プロジェクト管理経験がある。→お客さんとのやり取り、工程管理をして欲しい。
②リーダー経験がある。→タスク管理、進捗管理して欲しい。
③開発経験がある。→詳細設計、実装、テストをして欲しい。

私は③しか経験がありません。。
恐らく、派遣先がベテラン社員に求めているのは①か②。

なぜかというと、マネジメント経験があるはずと思われているのと、
単価が高いので、そういう仕事をして欲しいのだと推測します。

単価が高いのに若手と同じ仕事しかできない人を雇う理由がない。
大手SESなら力関係で上手くねじ込めるのかもしれませんが（ブツブツ）

①については、今の会社では担当する事はほぼないので、
生き残る道としては、②を目指すべきかと考えます。

②を目指す上で考えないといけない事。
なによりも実務経験が必要です。

が、それは難しい為座学で勉強したいと思います。
知識として理解しているだけでも全然違いますし、
知識があるだけで、いざそういう仕事をする時の自身にも繋がります。

### 派遣先から選んでもらうためにどうするか
当然ですが、派遣先は必要としているスキルの技術者を選びます。

（営業的な事は全く知らないので以下は想像の話になりますが。）
まず、派遣先は開発案件を持っており、必要な技術者の募集を掛けます。
すると、SESがマッチする人材を派遣先に提案します。

提案する時のインプットは「実務経歴」「単価」かと思います。
派遣先は提案書を見て、求めているスキルと実務経験があっているか？
予算と単価があっているか？を見て、
要求にマッチすれば面談をして、問題がなければ採用となります。

簡単に言うと「書類選考」→「面談」→「採用」となります。

ここで、ちょっと言いたいのが「書類選考」です。
経歴書というのはペラ紙1枚に、過去の業務と言語経験年数程度の事しか書いていません。
仮に「WEB知識が神レベルの人」でも実務経験がなければ、未経験とみなされます。

なので、もし派遣先がWEB技術者を求めていたとしても、
「WEB知識神レベルの人」を「書類選考」で落としてしまう事になります。
これは、技術者にとっても派遣先にとってもとても勿体ない事と思います。

もし、SES側の営業担当者が開発技術に精通しており、
「実務経験がないが、技術者が要求スキルを満たしている事」を、
上手く説明できれば、この問題は回避できると考えています。。
「この技術の経験はないですが。類似の●●を経験しているので、技術的に問題ないです。」
と言ってくれれば派遣先も納得してくれるのではと思います。

「派遣先から選んでもらうためにどうするか」ですが、
上に書いたように、まずどれだけ勉強したとしても、
経歴書に実務経験として記載されていなければ書類選考で落ちます。

ここでSESの小細工としては、勉強した事を実務経歴として記載します。
で、派遣先に採用されてから、なんとか着いていけるように頑張ります。
結果、ボロが出て契約を切られるという事もあります。

話がそれてしまいましたが、ここまでで。
AtCoder アルゴリズムと数学 009 - Brute Force 2 解答例(Pythonでのbit全探索 / 動的計画法のシンプルなコード例)

[Supership](https://supership.jp/)の名畑です。季節の変わり目が訪れるたび、[TVアニメ てーきゅう](http://te-kyu.com/)の10期は放送されないのだろうかと期待してしまいます。

## はじめに

コードを書きたい気分のときにはよく[AtCoder](https://atcoder.jp/)を利用させてもらっています。

AtCoderでは、競技プログラミングの世界で有名な[E869120](https://twitter.com/e869120)さんが執筆されました書籍「[問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本](https://gihyo.jp/book/2022/978-4-297-12521-9)」の[演習問題集](https://atcoder.jp/contests/math-and-algorithm)が公開されていまして、それをたまに解いています。

そのうちの1問について、解法を残しておきたくなりましたので、残します。
[bit全探索](https://www.ktpc.tokyo/le/k_c_pej_p_gm/bitSearch/bitSearch.html)と[動的計画法](https://ja.wikipedia.org/wiki/%E5%8B%95%E7%9A%84%E8%A8%88%E7%94%BB%E6%B3%95)のシンプルなサンプルコードとして良いなと思ったのです。

## 009 - Brute Force 2

問題文は[009 - Brute Force 2](https://atcoder.jp/contests/math-and-algorithm/tasks/math_and_algorithm_i)にございます。

正の整数が書かれた**N枚**のカードの中から、合計が**S**になる組み合わせがあるかを**Yes** or **No**で答えるという問題です。

**1≦N≦20**について解けると部分点として**500点**が、**N≦60**までを解けると**1000点**です。

## bit全探索による500点のコード

たとえば**N**が**3**で、各カードを**A0**、**A1**、**A2**とします。

このときとりうるカードの組み合わせは

- A0
- A1
- A1 + A0
- A2
- A2 + A0
- A2 + A1
- A2 + A1 + A0

の7パターンです。(問題文において**S**は**1以上**のため、カードを選ばないことはない）

2進数で記すなら

- 001
- 010
- 011
- 100
- 101
- 110
- 111

と書けます。左から順にそれぞれの桁が**A2**、**A1**、**A0**の有無を示しているとします。

コードにすると下記です。2進数各桁の取得は右シフトしつつ1との論理積をとっています。1との論理積をとれば下1桁の値になります。

```Python
N, S = map(int, input().split())
A = list(map(int, input().split()))
for i in range(1, 2 ** N):
    total = 0
    for j in range(N):
        total += A[j] * ((i >> j) & 1)  # 2進数にした各桁が1のときだけAを足す
    if total == S:
        print('Yes')
        exit()
print('No')
```

計算量が**Nの2乗**に比例するため、**N**が大きくなると**1000msec**を超えて**TLE**(Time Limit Exceeded)です。

## 動的計画法(DP)による1000点のコード

たとえば**N**が**2**で、各カードを**A0**、**A1**とします。
そして**A0**が**2**、**A1**が**3**だとします。

1枚目のカードとして**A0**を選んだとき、その時点での合計値は**2**です。選ばなければ**0**です。
つまり、**A0**だけしかカードがなかった場合、**0**と**2**がとりうる数です。

さらに、**A1**を選ぶか選ばないかまで考えると

- 0 + 0 = 0
- 0 + 3 = 3
- 2 + 0 = 2
- 2 + 3 = 5

この4パターンです。つまり、**A0**と**A1**の2枚のカードしかなかった場合、**0**、**2**、**3**、**5**の4つがとりうる値となります。
**S**がこの中にあれば**Yes**、なければ**No**という考え方です。

これをコードで示すとどうなるでしょう。

```Python
N, S = map(int, input().split())
A = list(map(int, input().split()))
dp = [False] * (S + 1)  # 0〜Sまでの値をとりうるかを格納する配列
dp[0] = True  # 0のみTrueにしておく
for i in range(N):  # 0枚目から順番にカードを見ていく
    for j in reversed(range(0, S)):  # dpの値が途中で変わらないようにreversedしている
        if dp[j] and j + A[i] <= S:
            dp[j + A[i]] = True
if dp[S]:  # Sをとりうるか判定する
    print('Yes')
else:
    print('No')
```

計算量は**S × N**に比例するため、問題におけるどのテストケースでも**50msec**以内で終わります。

## 最後に

考え方次第でこれだけ計算量が変わるのって、本当に面白い。

## 宣伝

[SupershipのQiita Organization](https://qiita.com/organizations/supership-inc)を合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方は[Supership株式会社 採用サイト](https://supership.jp/recruit/)よりご確認ください。
オブジェクト指向

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/9cb2c451-1c82-d93f-84a6-28380cd15269.png)
　オブジェクト指向では、データと手続き（処理）をひとまとめにした「オブジェクト」と言う単位で物事を捉えます。
　オブジェクトは、私たち人間と同じような性質を持っています。私たちは、自分の経験に基づく様々な情報を持っています。そして、他の人から指示を受けたり、他の異人へ指示を出したりしながら活動します。
　オブジェクトの場合も同様です。個々のオブジェクトには、自分のデータがあります。また、オブジェクトは他のオブジェクトから指示を受けて、処理を行います。逆に、他のオブジェクトに指示を出して、オブジェクトを利用することもできます。

１：オブジェクト指向の概念
「オブジェクト指向の用語」
・オブジェクト：データとメソッドをまとめたもの
・メンバ：オブジェクトが保持しているデータ
・メソッド：データにアクセスする手続き、オブジェクトを動かす指示
・カプセル化：データとメソッドをまとめること
・情報隠蔽：メソッドを介してのみデータにアクセスできるようにすること
・クラス：オブジェクトの構造を定義した設計図、オブジェクトの型
・インスタンス：具体的なデータ値を持った実態、クラスをもとに生成する
・コンストラクタ：インスタンスを生成して、メンバを初期化するための一連の処理が定義されたもの

　オブジェクト指向では、はじめに、システムに必要なデータ項目と必要な処理を分析します。その後、分析結果に基づいてクラスを定義します。
　例えば、製図システム（CAD）であれば、様々な図形を画面上に描き、その長さや面積を表示したりします。このような場合は、円を表すクラスや長方形を表すクラスを定義します。
転職準備

#  転職準備
## スキルをあげるために副業ってあり？？？
Lancers、CrowdWorks、ココナラ
## 概要
転職しようと思っています。準備のメモを書いていこうと思います。
## ドキュメントの書き方　（基本）
・半角・全角
・日付の形式　未来日になっていないか
・名前　田中幸太郎　←　この場合空きがない。
・フォント

## 要件・プロジェクト
・お金の流れ
・用語・・・会社特有の用語
・押さえどころ・・・原本の状況・場所・現在の状況・今後の状況

# Unix

https://language-and-engineering.hatenablog.jp/entry/20121207/p1

https://github.com/IBMDeveloperTokyo/DojoBasicLab/tree/master/Lab1_ShellCommand/Lab1-1_CommandLineBasic#31-%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88
Ctrl + C →　中断

## Git
git checkout feature_
git rebase -i Head~2
git rebase -- abort
git push --f

コミットソースをそのままにしてなかったことにする
git reset -- soft Head

ユーザー名を設定する
メールアドレスを設定する
## CSS
<p style="color: pink;">○○○○</p>
注　簡単にCSSが効いてるかみたいときのため・・・

## Vue.js
Prettier 
Vetur
Vue Language Features

## npm
npm install -g @vue/cli
npm run lint
rpm run cint
npm run build

## JavaScript ログ
let sum = 7 + 155;
console.log(sum);

## 業務知識
### 損害保険
#### 用語
保険契約者 
被保険者
被保険利益
通知義務
免責
保険の目的

個人
法人
chima子. 独学で合格！FP資格取得を目指すテキスト【2級3級対象】FP技能士の資格を取ろう！ファイナンシャルプランナー (p.237). Kindle 版. 

## DB
### 正規化
https://it-biz.online/it-skills/normalization/#toc3
スッキリわかるSQL入門　
達人から学ぶ
## SQL
・Progateを１から4までやる。
・Progateの応用コースをやる。
・ドット・インストール
## CSS
・Progateを道場以外やる。
・Udemyやる。
・一冊やる。
・公式チェック

## Google meet
https://apps.google.com/meet/

##
かっこの種類
()  丸かっこ・小かっこ
{} 波かっこ・中かっこ
[] 角かっこ・大かっこ

##SVN
https://tracpath.com/bootcamp/learning_tortoisesvn.html

## チートシート
https://htmlcheatsheet.com/css/

## Googleの検索

AND条件（論理積）: 2つ以上のキーワードをスペースで区切って検索すると、それらのキーワードが同時に含まれるページを検索します。例えば、犬 トレーニングと検索すると、「犬」と「トレーニング」が両方含まれるページが表示されます。

OR条件（論理和）: 同じく2つ以上のキーワードをORで結ぶと、それらのキーワードのいずれかが含まれるページを検索します。例えば、旅行 OR 観光と検索すると、「旅行」または「観光」のいずれかが含まれるページが表示されます。

これらの条件を組み合わせて検索することもできます。例えば、日本 旅行 OR 観光と検索すると、「日本」と「旅行」または「観光」のいずれかが含まれるページを検索します。

また、括弧を使用して複雑な条件を指定することもできます。例えば、(猫 OR 犬) AND ペットと検索すると、「猫」または「犬」かつ「ペット」が含まれるページを検索します。


キーワードの組み合わせ: 複数のキーワードを組み合わせて検索すると、より特定の情報を見つけやすくなります。例えば、「日本の観光地」といった具体的なキーワードを使用します。

引用符の使用: 特定のフレーズを含むページを検索する場合は、そのフレーズを引用符で囲んで検索します。例えば、「人工知能の応用」のように使います。

除外条件の指定: 特定のキーワードを検索から除外する場合は、キーワードの前に「-」を付けます。例えば、猫に関する情報を検索する場合、「猫 -ペット」のように使います。

サイト指定: 特定のサイト内を検索する場合は、site:を使います。例えば、site:wikipedia.org 日本の歴史のように使います。

関連語の利用: キーワードの代わりに関連する言葉を使用することで、広範囲な情報を取得できます。例えば、「スマートフォンの利点」と検索する代わりに、「モバイルデバイスのメリット」と検索するなどです。

数値範囲の指定: 数値の範囲を指定して検索することもできます。例えば、「価格 50000..80000円」のように使います。

これらのテクニックを駆使することで、より的確な情報を見つけることができます。

## Eclipse デバック
再開	Resume	プログラムの終了まで実行する。※	F8
終了	Terminate	処理を中断(アプリケーションを終了)する。	Ctrl+2
ステップイン	Step Into	一時停止している次の行に進んで一時停止する。対象行でメソッドを呼び出す場合、呼び出し先のメソッドに入って先頭で一時停止する。	F5
ステップオーバー	Step Over	一時停止している次の行に進んで一時停止する。対象行でメソッドを呼び出している場合などは、それらの処理を行って次の行に進む。※	F6
ステップリターン	Step Return	実行中のメソッドのreturnまで行い、呼び出し元のメソッドに戻った時点で一時停止する。※	F7



## 英語　発音
完璧は目指してないけどちょっとやる分にはコスパいいような気がする。
Udemyで短いものをやるのがいかも。

https://www.udemy.com/course/accent-reduction-american-english-speaking-made-easy/learn/lecture/9764282?start=30#overview