OmniAICreator/Qiita-1.07M huggingface dataset:
Instagram Gragh APIで対象ユーザの投稿情報を取得する方法、前編

依頼頂いた案件で、
特定ユーザの投稿されている写真やいいね、投稿時間などを一覧化する必要があった。

APIのアクセストークンを取得するのに少し難航したため、備忘録として残しておく。
一旦1~3までの手順詳細を前編では記載

手順
1.インスタグラムアカウントの作成（ビジネスアカウント）
2.facebookアカウントの作成（ビジネスページの作成）
3.インスタ垢とfacebook垢の連携
4.instagram Gragh APIのアクセストークンIDを取得
5.4で取得したIDを元に、インスタグラムから情報を取得(Json形式)


# 1.インスタグラムアカウントの作成（ビジネスアカウント）

まずは普通に電話番号やメールアドレスでアカウント作ってください。
その後、以下手順でビジネスアカウントに変更出来ます。（今回PC画面キャプチャですが多分スマホでも同じ事出来ます）

その他 ⇒ 設定 ⇒ プロアカウントに切り替えるを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/1f96c924-e546-3cea-53f0-f5b6c0296275.png)
ビジネスを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/200b60ae-b602-ae6f-ec6d-ebfc15f32df2.png)

それ以降の選択肢はなんでもいいので、適当に設定して完了まで進む
「個人用アカウントに切り替える」に文字が変わっていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/b618c2a7-3fcc-d32e-4433-34e246073f62.png)

# 2.facebookアカウントの作成（ビジネスページの作成）

ここも同様にまずは、普通に電話番号等でアカウントを作成。

作成後、ホーム画面 ⇒ ページ ⇒ 右上の＋ボタンを押下
（今回は既にページ作成しているが、初期状態では自分のページがない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/a6a7226e-a5ca-07e9-6752-e01794dd0823.png)

ページ押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/168ec7a3-8649-2c70-ad8d-30ff5ad42f26.png)

適当に情報入力して「Facebookページを作成」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/dc7f7c3c-d174-4c4c-81a4-46ff7abeee9f.png)

以降選択肢は、なんでもいいので適当に入力して完了まで進む
完了すると右上のアイコンが作成したページの名前に変わっている
変わっていればOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/2bd209bd-1348-b3c0-8d02-240dd9f1512b.png)

# 3.インスタ垢とfacebook垢の連携

右上アイコンクリック　⇒　設定とプライバシー　⇒　設定　⇒　リンク済アカウント　を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/1e84badd-e63e-c8f1-fc53-ff1869efb499.png)

instagramアカウントをリンクさせる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/21ec4c46-0fd0-c274-fbce-9a474caa8726.png)

問題なくリンク出来れば、この画面になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361500/f48cd6b1-1dd3-327d-0431-b8b2991acd2a.png)

リンクするためにfacebookのページを作る必要があるのがわからず難航した
一旦ここまで、4番～は少し複雑だったので明日以降にまとめ終わったら記載する
@AppStorageでenumの値を使う方法

以下のようなenumに`@AppStorage` を使おうとすると`No exact matches in call to initializer `というエラーになる。

```swift
enum FilterType: CaseIterable {
  case normal
  case comic
  case dot

  var title: String {
    switch self {
    case .normal:
      return "Normal"
    case .comic:
      return "Comic"
    case .dot:
      return "Dot"
    }
}

```

そんな時は `String`を準拠させてあげよう！

```swift
enum FilterType: String, CaseIterable
```

これだけで AppStorageを使えるよ！便利だね＾＾

```swift
  @AppStorage("filterType") var filterType: FilterType = .normal
```

https://developer.apple.com/documentation/swiftui/appstorage

ちなみに `String`にできない場合などは `RawRepresentable`に準拠していればなんでも良いみたい！
https://developer.apple.com/documentation/swift/rawrepresentable
3.2補数と固定小数点

### 補数
1と0しか使えないコンピュータの内部で，負数を表現する方法の一つで、「ある数」を「決められた数」にするために，「補う数」です

N進数には「N−1の補数」と「Nの補数」があり，「ある数」に「N−1の補数」を補うと，与えられた桁数の最大値となり，「ある数」に「Nの補数」を補うと，与えられた桁数の次の桁に桁上がり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/33d006bb-f22a-e0a7-7739-fe634344b5b3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/073fc2ac-6ec8-93fb-0c9a-bcfe66c732c9.png)


#### 2の補数の作り方
1の補数　　ビットを反転する
2の補数　　1の補数に1を加える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/29f74d4e-9c4e-17f8-a8d8-8d73cb0cd5a3.png)
714. Best Time to Buy and Sell Stock with Transaction Fee

https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/

```java
class Solution {
    public int maxProfit(int[] prices, int fee) {
        // 現在、持っているお金
        int cash = 0;

        // 現在持っている株
        int prevStockPrice = prices[0];

        for (int i = 1; i < prices.length; i++) {

            // 現在の株(prices[i])から、今持っている株を売って、手数料までかかる
            // 最大値を求める
            cash = Math.max(cash, prices[i] - prevStockPrice - fee);

            
            prevStockPrice = Math.min(prevStockPrice, prices[i] - cash);

        }

        return cash;
    }
}
```


https://medium.com/@_monitsharma/daily-leetcode-problems-problem-714-best-time-to-buy-and-sell-stock-with-transaction-fee-17cec07e368a

上記の解説を参考しました
難しいですね
【Rails】アプリケーションを立ち上げまでの手順【Cloud9】

## はじめに
#### 実装したこと
cloud9でRailsでアプリケーションを作成するまでの流れを自分用に残しました。

#### 動作環境
Ruby 3.1.2
Rails 6.1.7.3

## 手順
#### アプリの雛形を作成する
~~~
$ rails new アプリ名
~~~
以上で、アプリの作成が始まります。
※それぞれで半角スペースを入れていないとエラーが表示されるので注意！
![スクリーンショット 2023-06-22 23.42.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338070/286dfc29-9079-e12b-2a4e-59b09edd7292.png)
このような画面が出れば成功です。

<details><summary>誤って作成したアプリを削除する方法</summary>

アプリケーション名を間違えてしまった場合は、以下のコマンドを入力してアプリケーションを削除してください。
~~~
$ rm -rf アプリ名
~~~
rmはremoveの略で、ファイルやフォルダを削除するコマンドです。
-rf はコマンドオプションの1つで、「フォルダ内のすべてのファイルとフォルダを削除する」の意味です。
（remove recursively forceの略）
</details>

#### サーバーを立ち上げる
それでは、一度サーバーを立ち上げましょう。
~~~
$ cd アプリ名
$ rails s
~~~
※必ず"cd アプリ名"で現在のディレクトリを作成したアプリ名にすることを忘れずに行う。
※「rails s」の「s」は「server」の略です。
![スクリーンショット 2023-06-22 23.54.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338070/ac3d3209-da5e-5a80-b755-98b0033a8449.png)
このような画面が表示されていれば、サーバーが起動しています。
そして、cloud9であれば、Previewの「　Preview Running Application　」をクリックすると、プレビュー画面が表示されます。
![スクリーンショット 2023-06-22 23.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338070/71569b2a-fec1-95a8-4df4-c4fc5c92379f.png)

#### エラーを解消する
![スクリーンショット 2023-06-22 23.57.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338070/82d405e7-783d-afbf-363f-91289f613d46.png)
このようなエラーが表示されたときは、下記フォルダの中にコードを記載する必要があります。
config
　-environments
　　-development.rb
　このファイルの中の、Rails.application.configure doからendまでが読み込まれるため、endより下の行には貼り付けないようにエラー内容にある下記のコードをコピペしましょう。
![スクリーンショット 2023-06-23 0.04.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338070/4007a402-0689-72ce-1180-b087ca215d6d.png)

<details><summary>別のパターン</summary>

上記のconfig.hosts << "~.vfs.cloud9.us-east-1.amazonaws.com" という記述はホストからしかアクセスできないようにする」という、セキュリティに関する設定です。複数のホストからRailsアプリケーションにアクセスすることが多々ある場合は、下記のコードに切り替えましょう。
~~~
|
|
  config.hosts.clear
end
~~~
</details>

以下のような画面が出れば成功です。
![スクリーンショット 2023-06-23 0.08.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338070/4f92674f-1adb-3341-787a-dc1b7a9de2f8.png)

## [Git][初回]ローカルにリポジトリを作成からリモートリポジトリにプッシュするまで
以下の手順で行います。
~~~
$　git init
$　git add .　
$　git commit -m "first_commit"
$　git remote add origin (リモートリポジトリのSSH)
$　git push origin 希望のブランチ名
~~~
※リモートリポジトリのURLとは、Githubなどで新規作成したリポジトリのこと。私はSSHをコピペします。

'git init'でgitで管理するための設定ファイルを生成して、'git add .'で全てのインデックスを指定し、'git commit -m で変更履歴を保存します。そして、'git remote add origin'とSSH
でリモートリポジトリのURLを登録する。最後に'git push origin main'で先ほどコミットした変更履歴をリモートリポジトリにアップロードする。「希望のブランチ名」にアップロードしたいブランチの名前を指定します。（大体はmainやdevelopなど）

<details><summary>デフォルトのローカルブランチをmasterからmainに変更する方法</summary>

~~~
$ git branch -M main
~~~
</details>

#### [Git]２回目以降の手順
~~~
$ git add .
$ git commit -m "コメント"
$ git push -u origin ブランチ名
~~~
まず、１回目と同じように全てのインデックスを指定して、好きなメッセージをつけて変更履歴を保存する。（ここのメッセージで変更箇所がわかりやすいように記載すること）
そして、ローカルリポジトリの変更をリモートリポジトリにアップロードする。「ブランチ名」にアップロードしたいブランチの名前を指定します。

:::note info
'git push -u origin ブランチ名' の '-u'はブランチ名を固定します。今後は特にブランチ名を変更することがなければ、初めに'-u'をしておけば次回以降は'git push'のコマンドだけでよくなります。
:::


## おわりに
これでRailsのアプリケーションが作成できました。ここまでお疲れ様です。
次回からは、コントローラやルーティングを作成していくつもりです。
DeepL for Visual Studio Codeを使用してみた


## はじめに
みなさん、英語は得意でしょうか？
僕は苦手です。
コミットメッセージとかコード内のコメントとかを英語で書く際に「こういう時の冠詞ってaだっけ…？theだっけ…？」とか、「これ適切な単語なのか…？」とかよく不安になります。
そこでよくDeepLを使用しているのですが、VScodeにDeepLの拡張機能を見つけたのでさっそく使用してみました。

### DeepLって？という人のために
DeepLを知らない人はほぼいないとは思いますが、もし知らないという方のために説明しますと、DeepLとはドイツのケルンに本拠地を置くDeepL GmbHが開発したニューラル機械翻訳サービスです（[Wiki](https://ja.wikipedia.org/wiki/DeepL%E7%BF%BB%E8%A8%B3)より）
多言語辞書「[Linguee](https://www.linguee.jp/)」の運営も行っています。

## 導入方法
[DeepLのAPI翻訳](https://www.deepl.com/pro-api?cta=header-pro-api)にアクセスし、ページ下部にあるプランを選択します。
個人で使用する場合は無料のFreeプランか、真ん中のProプランのどちらかになると思います。

![スクリーンショット 2023-06-22 23.02.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3443/97eb2e85-7e6b-66b5-ad8c-b7d325f74fc7.png)

:::note warn
アカウントの作成はfreeプランであってもクレジットカードの登録が必要です
:::

アカウントを作成しましたら、アカウントページへ移動しましょう。

![スクリーンショット_2023-06-22_23_14_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3443/9141e29d-a223-0959-3207-54820b64d5e5.png)

ページ右上のアカウントIDをクリックすると、ドロップダウンが表示されるので「アカウント」を選択。
すると「ご利用中のDeepLアカウント」のページに遷移するので、そこでタブの「アカウント」をクリックすると、そのページ下部に「DeepL APIで使用する認証キー」が表示されています。

![スクリーンショット_2023-06-21_0_30_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3443/1502b22e-355b-a1bc-c47e-1f94f459819c.png)

次にVScodeの拡張機能をインストールしましょう。
エディタの拡張機能の検索窓に「DeepL」と入力して探すか、[こちらのマーケットプレイス](https://marketplace.visualstudio.com/items?itemName=soerenuhrbach.vscode-deepl)からインストールしてください。

インストールができましたら、拡張機能の設定をしていきます。

![スクリーンショット_2023-06-22_23_27_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3443/3954ed02-94e7-8ca1-994d-dea3354df50f.png)

拡張機能の歯車マークをクリックするとドロップダウンが出てくるので「拡張機能の設定」をクリック。

![スクリーンショット_2023-06-20_12_13_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3443/29724589-d788-6602-8d7d-9546e6ef1d31.png)

「Deepl: API Key」の項目に発行された「DeepL APIで使用する認証キー」を貼り付けます。

![スクリーンショット_2023-06-20_12_14_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3443/b16d4a70-73da-4874-1a91-6be3defeee5e.png)

:::note warn
拡張機能の設定の一番下の「Deepl: Use Pro」はデフォルトではチェックが入っているのでFreeプランを使用している人はチェックを外してあげる必要があります
:::

これで晴れてDeepLをVScodeでも使用できるようになりました。
あとはエディタの下部にある「Select language」を選択してどの言語に翻訳するかを選択します。

![スクリーンショット_2023-06-22_23_42_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3443/7428d253-bc4c-bcab-b51b-5ca20113a38f.png)

例えば、「日本語」から「アメリカ英語」に翻訳したい場合は「English(American)」を選択します。
あとは翻訳したい文字列を選択して右クリック→DeepL: Translateを選択するかショートカットを入力すると翻訳されます。
先程のリンクに張ったマーケットプレイスにショートカットキーが書かれていますが、基本的には `Alt + t、MacであればOption + t`を覚えておけば大丈夫かなと思います。
以下のDemoはショートカットキーを使った例です。

![ezgif-4-a0d39e535c.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3443/a0ec1681-fa68-544b-2b54-c460b343263e.gif)


私の職場ではGitのコミットメッセージやi18nの対応など、英語を使用する機会が多いので、これで少しでも作業効率を上げれたらと思っています。
Samba、Samba3が提供する主な機能

●Samba
Windows上のファイル共有やプリンタ共有などを可能にするSMB（Server Message Block）プロトコルを使ったサービスを提供するためのシステム。
つまりSambaはWindowsマシンからLinuxマシン（Sambaサーバ）上のファイルにネットワークを通じてアクセスすることを可能にします。

以下はSamba3が提供する主な機能。
・ファイルサーバ
・プリントサーバ
・WINSサーバ
・ドメインコントローラ（NT)
・Active Directoryドメインに参加
・Microsoftネットワーククライアント

Samba4では上記に加えて以下の機能をもった。
・ドメインコントローラ（Active Directory）
Railsのヘルパーメソッドについて

## 概要
Railsのヘルパーメソッドは、HTMLタグを生成したり、日付と時間を整形したり、テキストをサニタイズしたりでき、それらを行うための便利なショートカットを下記にまとめます。

## link_toヘルパー

`link_to`ヘルパーは、HTMLのアンカータグを生成します。このメソッドの最も一般的な使用法は、第一引数にリンクテキスト、第二引数にリンク先のパスまたはURLを渡す方法です。

```erb
<%= link_to "View Post", post_path(@post) %>
```

このコードは、次のようなHTMLを生成します。

```html
<a href="/posts/1">View Post</a>
```

## form_withヘルパー

フォームの作成はWeb開発においてよくある作業です。`form_with`ヘルパーは、このタスクを容易にします。以下は基本的な使い方です。

```erb
<%= form_with model: @post do |f| %>
  <%= f.label :title %>
  <%= f.text_field :title %>
  <%= f.label :content %>
  <%= f.text_area :content %>
  <%= f.submit "Save" %>
<% end %>
```

`form_with`は、指定したモデルに基づいてフォームを自動的に生成します。

## simple_formatヘルパー

`simple_format`ヘルパーは、テキストを整形してHTMLに変換します。改行を`<br>`に、段落を`<p>`に変換します。これは特にユーザーからの入力を表示する際に役立ちます。

```erb
<%= simple_format @post.content %>
```

これらはRailsのヘルパーメソッドの一部にすぎません。Railsのヘルパーメソッドは非常に多岐にわたり、日々の開発作業を大いに助けてくれます。
【Bash】リダイレクトまとめ


```bash
# 入力
command < file   # ファイルの内容をコマンドの標準入力に渡す

command >&2      # 標準出力を標準エラー出力にリダイレクト

command > file   # ファイル新規作成または上書き

command >> file  # ファイル新規作成または追記

command 2> file  # 標準エラー出力をファイルにリダイレクト(新規作成または上書き)

command &> file      # 標準出力/エラー出力を同一ファイルにリダイレクト
command > file 2>&1  # 同上
command &>> file     # 標準出力/エラー出力を同一ファイルに追加書き込み
command >> file 2>&1 # 同上

command > file1 2> file2   # 標準出力,エラー出力を別々のファイルにリダイレクト
command >> file1 2>> file2 # 標準出力,エラー出力を別々のファイルに追加書き込み
```
Windowsスタートアップバッチの作成・運用で気をつけること ５選


# スタートアップバッチとは

Windows起動時に自動的に実行される処理のことです。
例えば、必ず見るサイトがある場合や実行したいアプリがある場合のほか、
ネットカフェなどで共通の設定に戻したり、不要ファイルを自動削除したい時に有効です。

具体的には、下記フォルダに`.bat`や`.vbs`形式のテキストファイルを配置することで実行します。
また、実行したいアプリ（`.exe`）へのショートカットを置くとそのアプリが実行されます。
※ショートカットの先は`.bat`や`.vbs`でも問題ありません。

#### ■ 全ユーザー共通のスタートアップフォルダ ※配置に管理者権限が必要
`C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup`

#### ■ ログインしているユーザーのスタートアップフォルダ
`C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup`
※<font color="DeepPink">%USERNAME%</font>を使用することで、ログインしているユーザー名に置き換わります。

### 誰でも扱える便利さゆえに複雑化しやすい欠点

上記の仕様を用いて、スタートアップフォルダにサーバーへのショートカットを作成し、
サーバーにバッチファイルを用意することで数百台のPCを1つのバッチでコントロールしています。
例えば、アプリのsetting.jsonなどを各PCのローカル配下に存在するアプリ設定ファイルに上書きするなどができるため、１台１台設定せずとも同一設定にできるため工数がとても削減できて便利でした。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/7f9e5db3-a5e7-9ad8-40f6-0869cad68667.png">

しかし、バッチの特性上、非エンジニアでも触れることができるため、複数の職種を問わない人間が関わることもあり、WebサイトやWebアプリのコードと比べるとスピード重視な傾向があります。
そのため、適切かつ一貫した管理が難しくなりがちです。

今回は、それらのバッチを捨てて一新した経験から、
今後バッチ運用をする時に、気をつけるべき点を紹介いたします。

# 作成・運用で気をつけるべきこと

それでは本題です。

## 機能毎にバッチを分けることを意識する

ファイルが複数になっても機能ごとにバッチを作成した方が良いです。

例えば、`起動時処理.bat`というファイルがあり、内容として`デスクトップのファイル削除`、`ゴミ箱のファイル削除`、`起動時にセキュリティソフトの更新と実行`、`常駐ツールの設定を自動反映`、`業務サイトをブラウザで開く`という処理が含まれており、似たような名前のバッチがいくつかあるとします。

この場合、変更が発生すると名前でどれを編集すべきかの判断が付け難く、また1ファイルの処理も膨大なため、どこを編集すべきかが判断付けにくいのです。
そのため、処理内容ごとにバッチファイルを分ける方が変更時に管理しやすいです。
（特に最初は少ないからまとめてしまいがちだけど、気がつくと膨らんでいる）

実行順などの関係でどうしても1ファイルに集約したい場合は、各バッチを読み込むバッチを1つだけ作り、
そこから読み込むのが良いかと思います。
以下は、順に他のバッチを実行するバッチのサンプルです。
```
@echo off
call sample1.bat
call sample2.bat
call sample3.bat
```
※`callコマンド`ではなく`startコマンド`を使用することで、複数のバッチファイルを同時に実行することもできます。

## 急にサーバーが壊れても問題の少ない処理を心がける

サーバーや、NASにバッチファイルを配置する場合、何よりも恐ろしいのがそれらに不調が発生した場合、バッチが処理されないことに起因してPCが利用できない状態になってしまうことです。

それらを防ぐためにバッチの処理にて、

① サーバーからローカルにバッチファイルをコピー、出来ない場合は②へ
② ローカルでバッチファイルを実行

とすることで、壊れても最新の状態ではないが前回利用できていた状態でPCを使うことが出来ます。

## スタートアップフォルダの違いとPC環境を理解する

冒頭で書いたように、ログインユーザー単一のスタートアップフォルダと、
全ユーザー共通のスタートアップフォルダは異なります。

また、ログインユーザーのスタートアップはそのユーザーでログインしないと有効ではないですが、
全ユーザー共通のスタートアップは誰がログインした場合であれ、有効となります。

が、PC利用者が管理者権限あると思っていたら、ない人もいたりすると、
そもそも最初に全ユーザー共通のスタートアップにバッチを追加するのが難しくなります。

そのため、PC環境を理解した上でどのようにバッチを動かしていくか設計する必要があります。

## お引越しの時は既存の全バッチを削除しない

旧バッチから新バッチに処理を変更するときは、
どこかのタイミングで旧バッチの処理を無効化する必要がある訳ですが、
単純に旧バッチへのショートカットを消してしまうと、そのPCのスタートアップフォルダに
ファイルが何もなくまた手動で新バッチを導入するしかなくなります。

そのため、ショートカットの読み先を新しいバッチに変更するか、
削除と同時に新バッチへのショートカットを追加することをオススメします。

## Gitにファイル差分を残す

こういったサーバーはおおよそ一般利用者からアクセスしやすい環境にあり、
それを見た利用者がファイルを移動させてしまったり、自分自身がバッチ改修時に
処理をミスして記述してしまう可能性もあります。

そのため、Gitなどのファイル管理ツールを使い、万が一に備えてバックアップを取りましょう。

# おわりに

組織として働く上では間違いなく重要で、便利なバッチファイルですが、
エンジニアが関わることは少なく、軽視されやすい傾向にあると言えます。

ただ、活用次第によっては業務効率化にダイレクトに影響を与えるため、
内部の工数削減によって成果を出したい方は、利用を考えてみるのも良いと思います。

それでは。

## おまけ（先人達の素晴らしい記事）

https://somachob.com/bat-open-folder/

https://tracpath.com/works/development/windows-batch-file-01/

https://nw-engineer.work/batfile/
Mac Homebrewでmecabを使う

https://sourceforge.net/projects/mecab/files/mecab-ipadic/2.7.0-20070801/
から辞書 `mecab-ipadic-2.7.0-20070801.tar.gz` をダウンロード。

```shell
brew install mecab

tar xf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure && make && make install
```

動作確認
```
$ echo 私は学校に行きます | nkf -e | mecab | nkf -w
私	名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
学校	名詞,一般,*,*,*,*,学校,ガッコウ,ガッコー
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
行き	動詞,自立,*,*,五段・カ行促音便,連用形,行く,イキ,イキ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
EOS
```

## 参考
ビルド時に `--with-charset=utf8` をつけておけばUTF-8になるらしい。
[【Linux】Mecabの文字化けを直す - Qiita](https://qiita.com/DisneyAladdin/items/67d986fdb402f3b1c350)
企業のグローバル化を実現するためのIT

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

# グローバル化が求められる理由
企業のグローバル化は、現代のビジネスにおいて重要な要素となっています。以下に、グローバル化が求められる理由の一部を挙げます。
- 新たな市場の開拓
グローバル化は、企業にとって新たな市場の開拓を可能にします。国境を越えてビジネスを展開することで、需要の拡大や競争力の向上が期待できます。また、少子高齢化により日本のマーケットは先細りしていくので、__売上拡大のためには海外へ市場を拡大__ することが求められます。
- 費用削減と効率化
グローバル化により、生産拠点やサプライチェーンを世界中に展開することができます。人件費が安い国で製造することで、__コスト削減や効率化__ が図られ、競争優位性を獲得できる可能性が高まります。
- 人材の獲得と多様性
グローバルなビジネス展開には、異なる文化やバックグラウンドを持つ人材を採用する機会があります。__多様な人材__ を組織に組み入れることで、クリエイティビティやイノベーションの促進、地域特有のニーズに対応する能力の向上が期待できます。

# グローバル化を促進するIT技術
IT技術は、企業のグローバル化を支援するための重要なツールです。以下に、グローバル化を促進する主要なIT技術の一部を紹介します。

- IoT
特に製造業においてグローバル化のネックになるのが、ベテラン社員に依存した技術やノウハウを継承できないことです。この問題を解決するためには、これらのスキルを形式知化/モデル化し、継承できる状態にする必要があります。[IoT](https://qiita.com/7_inai_/items/f2a56498b70b39befa0b)を活用し、`スキルを数値として可視化することで、ベテラン社員の技術を継承できる`状態にすることができます。

- クラウド
[クラウド](https://qiita.com/7_inai_/items/befadfdc51e33d240ede)は、情報やデータをインターネット上のサーバーに保存・処理する技術です。クラウドを活用することで、`企業は地理的な制約を超えて情報を共有し、リアルタイムでのコラボレーションや効率的なビジネスプロセス` を実現できます。

- 仮想化技術
[仮想化技術](https://qiita.com/7_inai_/items/15b1e0b8cfa3c73c4aeb)は、物理的なリソースを仮想的に分割・割り当てることで、複数の仮想環境を作り出す技術です。仮想化を活用することで、企業は`地理的な制約を超えてリソースを活用し、柔軟性とスケーラビリティを向上`させることができます。
- ビッグデータ/データアナリティクス
グローバル化した企業は膨大なデータを生成します。ビッグデータとデータアナリティクスの技術を活用することで、`企業は市場のトレンドや消費者行動の洞察を得て、意思決定や戦略立案に役立てる`ことができます。




# 終わりに
IT技術は、企業のグローバル化を実現する上で不可欠な要素です。グローバル化により企業が直面する課題や機会に対応するために、適切なIT技術の導入と活用が求められます。グローバル化を支援するIT技術は絶えず進化しており、企業は最新の技術トレンドを追いながら、自社のビジネスニーズに合った戦略を構築することが重要です。

最後までお付き合いくださりありがとうございました。
Visual Studioの構成とプラットフォーム


**注意: 初学者による記事です．正確性を欠いているかもしれません．**
**また，執筆時2023年でVisual Studio 2022を用いており，これより後の環境において再現性があるかはご自身で判断の元，以下の記事を参照してください．**

つい最近DirectXを勉強し始め，開発ツールとしてVisual Studioをぼちぼち触り始めました．
しかし，今までVisual Studioに触れた経験はほとんど無し．
突如としてWindowsアプリケーション制作を志した自分にはVisual Studioに対して何の理解もなく，当然ながらビルド構成についてもちんぷんかんぷんで困りました．
そのためMicrosoft公式のリファレンスを見て得た理解を共有しようと思います(ほぼ備忘録ですが)．
`Microsoft公式リファレンスURL: https://learn.microsoft.com/ja-jp/visualstudio/ide/understanding-build-configurations?view=vs-2022`


画面上部のメニューバー`プロジェクト(P)`をクリックすると縦向きに様々な項目が出てきます．
その一番下に`プロパティ(P)` という項目があります．
この`プロパティ(P)`をクリックするとプロパティページ ウィンドウが開きます．

プロパティページの上部に表示されている`構成(C): `と`プラットフォーム(P): `についての説明をしたいと思います．

まず，`構成`にはデフォルトでDebugとReleaseがあると思うのですが，これは要するにビルド時の設定の一部であり，Debug設定ではデバッグに最適化されたビルドを，Releaseでは実際に動作するために最適化されたビルドをそれぞれ実行するためのオプションです．

また`プラットフォーム`はビルド後の動作対象となる環境に合わせて選ぶべきオプションです．要するにビルド後に32bit CPUで動作させたいなら`x86`を，現在(2023年)で一般的に流通している64bit CPUを用いて動作させるなら`x64`を選べば良いということです．

この`構成`と`プラットフォーム`にはどちらも選択肢の中にアクティブ(Debug)とかアクティブ(x64)とか表示されたものがあると思いますが，これは「現時点で選択しているオプションですよ」という親切なささやきのようなもので特別な仕様等はありません．

さて，`構成`と`プラットフォーム`の2つのオプションの理解ができたでしょうか．

では具体的にこの2つの項目をそれぞれ指定して選択することで何ができるのか説明します．
これは簡単なことで，`構成`や`プラットフォーム`ごとに個別の設定ができますよ，ということなのです．
Debugの時にはこのようにしてDebugをして，Releaseをする時にはこの設定でReleaseして，x64ではこういう風に設定して，，，というように選んだ`構成`と`プラットフォーム`それぞれに合わせて個々の設定ができるわけです．

以上が自分がリファレンスから読み取ったVisual Studioにおける構成とプラットフォームの設定とその内容です．
間違いなどがあればぜひご指摘お願いします．
最後まで読んでくださってありがとうございました！
プロキシの基礎

## プロキシとは何か？
- プロキシは、クライアントとサーバーの間に位置し、クライアントのリクエストとサーバーのレスポンスの中継役を担うサーバーのこと
- クライアントがサーバーに直接通信するのではなく、プロキシを経由して通信することで、通信の制御や保護、パフォーマンスを向上させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/01370e09-5542-76bd-99c0-2c4facd529e6.png)
引用：https://www.infraexpert.com/study/security23.html
## プロキシの動作原理
- プロキシは、クライアントからのリクエストを受け取り、されをサーバーに転送する
また、サーバーからのレスポンスをクライアントに返す
## プロキシの利点
- セキュリティ：プロキシは、ファイアウォールやインターネットセキュリティ対策の一部として使用されクライアントとサーバーの間の通信を監視し、不正アクセスや攻撃を防止する
- パフォーマンスの向上：プロキシはキャッシュ機能を提供し、頻繁にアクセスされるリソースを一時的に保存することで、アクセスの高速化やネットワーク帯域の節約ができる
- プライバシーの保護：プロキシを使用することで、クライアントのIPアドレスや個人情報を隠すことができる
## プロキシの使用例
- キャッシュプロキシ：ウェブコンテンツのキャッシュを行い、リクエストに対してキャッシュから応答することで、ウェブページの表示速度を向上させる
- 透過的プロキシ：クライアントの設定を変更することなく、プロキシを介して通信を行うようにする。クライアントに意識させることなくプロキシの恩恵を受けることができる
- リバースプロキシ：サーバーとクライアントの間に配置され、クライアントからのリクエストを複数のバックエンドサーバーに分散したり、負荷を均等に分散したりする役割を果たす。
## プロキシを使用しないと・・・？
クライアントが直接サーバーと通信されるようになる、
セキュリティやプライバシーの保護はプロキシサーバーに依存しないため、それらの側面には注意が必要となる
また、キャッシュやフィルタリングが利かなくなってしまうため、ネットワークの負荷やアクセス速度に影響を与える可能性がある

総じて、プロキシサーバーを使用することで、セキュリティ、プライバシー、パフォーマンス、コンテンツ制御などの利点が得られるのに対して使用しない場合はそれらの利点は得られなくなってしまう

## まとめ
プロキシは、インターネット通信を制御するための重要な仕組みであり、セキュリティやパフォーマンスの向上に役立てる。様々な種類のプロキシが存在し、それぞれ異なる目的で使用される。
正しく設定されたプロキシは、安定性と効率性を向上させるので、その活用について理解することは重要となる。


### 参考文献
https://www.infraexpert.com/study/security23.html

https://boxil.jp/mag/a3028/
【React学習 #8】Next.js 環境構築

# はじめに
この記事はReact初心者の筆者が学習のために書いている記事です。
間違っていたら温かくご指摘いただけるとありがたいです。


# やりたいこと
Next.js + TypeScriptの開発環境を構築していきます。


# 参考
[Next.js ドキュメント](https://nextjs.org/docs/getting-started/installation)


# 動作環境
* PC：Macbook
* CPU：Intel
* OS：MacOS Ventura 13.4
* Node.js v20.3.1


# 環境構築
以下のコマンドを実行してNext.jsの環境を構築します。

```
$ npx create-next-app@latest
```

実行すると以下のように対話形式でプロジェクトの設定をすることができます。

```
Need to install the following packages:
  create-next-app@13.4.7
Ok to proceed? (y) y
✔ What is your project named? … next-ts-sample-app
✔ Would you like to use TypeScript with this project? … No / Yes　--> Yes
✔ Would you like to use ESLint with this project? … No / Yes --> Yes
✔ Would you like to use Tailwind CSS with this project? … No / Yes --> No
✔ Would you like to use `src/` directory with this project? … No / Yes -->Yes
✔ Use App Router (recommended)? … No / Yes --> Yes
✔ Would you like to customize the default import alias? … No / Yes --> Yes
✔ What import alias would you like configured? … @/*
```

全ての質問に答えるとインストールが始まります。


# 開発サーバを実行
プロジェクト直下に移動し、開発サーバを起動します。

```
$ npm run dev
```

開発サーバが起動したらブラウザで`http://localhost:3000/`にアクセスします。
![スクリーンショット 2023-06-22 22.34.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3344066/51b12ef6-0229-9bfb-ec7a-b457f667cd3f.png)


# 最後に
コマンド一つで簡単にNext.jsの環境を作成できました。
次回以降はNext.jsについてどんどん学習していこうと思います。
migrateやり直したいけどMigration not found と出る


# 概要
特定のmigrationファイルをやり直したい時
refreshするとmigationファイルのdrop()関数が実行→up()関数の再構築

# 実行内容

```php
php artisan migrate:refresh --path=/database/migrations/**.php
```
再構築の回数を制限するときは--step=?で?回数実行
(極力つけた方がいいのか、調べる)
EC2 Instance Connect + AWS Systems Manager Session Managerでプライベートサブネット内のEC2へSSHポートフォーワーディング

# 概要
ローカルマシンから**プライベートサブネット内のEC2インスタンス**へポートフォーワーディング接続を行い、ローカルマシンにインストールされた「[pgAdmin 4](https://www.pgadmin.org/)」を使用して、Aurora PostgreSQLへ接続する手順について記載します。

# 前提
* ローカルマシンに[AWS CLI](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)がインストール済みである事。
* ローカルマシンにアクセスキー・シークレットキーおよび環境変数「AWS_PROFILE」が設定済みである事。
* ローカルマシンに[pgAdmin 4](https://www.pgadmin.org/)がインストール済みである事。
* EC2インスタンスに[SSMエージェント](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-manual-agent-install.html)がインストール済みである事。
* EC2インスタンスにIAMポリシー「AmazonEC2RoleforSSM」がアタッチ済みである事。

# 準備
以下のリンクからSessionManagerPluginのダウンロード、またはコマンドを実行してローカルマシンにセッションマネージャー用プラグインをセットアップ

**Windowsの場合**

https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe

**Macの場合**
```bash
$ brew install --cask session-manager-plugin
$ session-manager-plugin --version
  1.2.463.0
```

# VPCエンドポイントの作成
EC2インスタンスが属するプライベートサブネットに以下のVPCエンドポイント群を作成
* ssm.*\<AWSリージョン\>*.amazonaws.com
* ssmmessages.*\<AWSリージョン\>*.amazonaws.com
* ec2messages.*\<AWSリージョン\>*.amazonaws.com

# 秘密鍵・公開鍵の作成
以下のコマンドで秘密鍵および公開鍵を生成、.sshディレクトリに配置

```bash
$ ssh-keygen -t rsa -b 4096
$ mv ~/.ssh/id_rsa ~/.ssh/<秘密鍵名>.pem ← 任意の秘密鍵名に変更
$ mv ~/.ssh/id_rsa.pub ~/.ssh/<公開鍵名>.pub ← 任意の公開鍵名に変更
```

:::note warn
上記コマンドはmacOS環境に最適化されています。ご利用のOSに合わせてコマンドを適宜変更してください。
:::

# パーミッション変更
以下のコマンドで秘密鍵のパーミッションを変更

```bash
$ chmod 600 ~/.ssh/<秘密鍵名>.pem
$ chmod 600 ~/.ssh/<公開鍵名>.pub
```

:::note warn
上記コマンドはmacOS環境に最適化されています。ご利用のOSに合わせてコマンドを適宜変更してください。
:::

# SSH用のコンフィグ設定
以下の構文を".ssh/config"の末尾に記載

```bash
host i-* mi-*
        User <OSユーザー名>
        Hostname %h
        Port 22
        ProxyCommand sh -c "aws ec2-instance-connect send-ssh-public-key --instance-id %h --availability-zone ap-northeast-1a --instance-os-user <OSユーザー名> --ssh-public-key file://~/.ssh/<公開鍵名>.pub && aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
        IdentityFile ~/.ssh/<秘密鍵名>.pem
```

:::note warn
上記コマンドの例ではAZ「ap-northeast-1a」を指定していますが、EC2インスタンスの存在するAZに合わせて変更してください。
:::

# ポートフォーワーディング接続
以下のコマンドでAurora PostgreSQLにポートフォーワーディング接続します。

```bash
$ ssh -fNL 15432:<接続先DBエンドポイント>:5432 -i "~/.ssh/<秘密鍵名>.pem" <EC2インスタンスID>
```

:::note info
上記コマンドの例ではローカルマシンのポートは「15432」でリッスン、接続先DBエンドポイントへはポート「5432」で接続しています。
:::

# pgAdmin 4の接続設定
ローカルマシンにインストールした「pgAdmin 4」を起動して、以下の画像の通り「Host name/address」に「localhost」、「Port」に「15432」を入力、Saveを実行して下さい。

|Connectionタブ |
|--|
|![2023062201.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/f462d083-2bd5-3abd-f8d5-064226b56e19.jpeg)|

# ポートフォーワーディング切断
以下のコマンドでポートフォーワーディングを実行しているSSHのプロセスIDを特定して、killコマンドを実行するとSSHポートフォーワーディングを切断できます。

```
$ ps -ef | grep -v grep | grep '\-fNL'
11677692 <プロセス番号>     1   0  4:33PM ??         0:00.01 ssh -fNL 15432:<接続先DBエンドポイント>:5432 -i ~/.ssh/<秘密鍵名>.pem <インスタンスID>
$ kill <プロセス番号>
```

:::note warn
上記コマンドはmacOS環境に最適化されています。ご利用のOSに合わせてコマンドを適宜変更してください。
:::
OpenSSL 3.x系で躓いた

# 前置き
 - OpenSSLでPKCS12形式(.pfx/.p12)の証明書より、秘密鍵とクライアント証明書を取得しようとした
 - エラーとなった
 - 日本語記事がほぼなかった

## 環境
 - windows
 - OpenSSL light

### 本題
- legacy.dllを適用する
　`set OPENSSL_MODULES="openssl.exeのあるパスのbinフォルダ"`
　-　これで一時的に利用可能になった

- 実施
    - これで証明書
    `Openssl pkcs12 -in example.p12 -clcert -nokeys -out example.pem -legacy`

    - これで秘密鍵
    `Openssl pkcs12 -in example.p12 -nocert -nodes -out example.key -legacy`
    
上記コマンドで取得できた、どうやら3.x系に変わるときに脆弱性関係で
いくつかの形式がLegacyに移行された模様。

公式GitHubを参照すれば出ては来るが、備忘録として残します。
MathJaxで特定のTeX extension packageを無効化する


MathJaxには様々な TeX extension packageがありますが、なんらかの理由で特定のextensionだけ無効化したいときがあるので、その設定方法についてまとめました。

:::note
MathJax v3.2.2
:::

## 1. デフォルトのpackageとしてloadされないようにするパターン

`MathJax.tex.packages` の設定で無効化する

https://docs.mathjax.org/en/latest/options/index.html

```js
MathJax = {
  tex: {
    packages: {
      '[-]': ['autoload', 'require']
    }
  }
};
```

たとえば、 Input Componentでinput/texを選択したとき、デフォルトで以下のパッケージ・コンポーネントが読み込まれます。

- input/tex-base
- [tex]/ams
- [tex]/newcommand
- [tex]/noundefined
- [tex]/require
- [tex]/autoload
- [tex]/configmacros

これらは、MathJaxのロードのタイミングでloadされ、registerされています。
明示されていないですが、以下のようなイメージです。

https://docs.mathjax.org/en/latest/web/components/input.html#tex-extension-packages

```js
MathJax = {
  loader: {
    load: ['[tex]/autoload']
  },
  tex: {
    packages: {'[+]', ['autoload']}
  }
};
```

このタイミングでloadされているパッケージは、`MathJax.tex.packages` の設定で無効化します。

https://docs.mathjax.org/en/latest/options/startup/loader.html

https://github.com/mathjax/MathJax-src/blob/3.2.2/components/src/input/tex/tex.js

## 2. autoloadされないようにするパターン

`MathJax.tex.autoload`で空のarrayをセットする

https://docs.mathjax.org/en/latest/input/tex/extensions/autoload.html

```js
MathJax = {
  tex: {
    autoload: {
      color: []
    }
  }
};
```

https://qiita.com/kyntk/items/6d87aa76247015d059e0

autoload extensionによって、自動でいくつかのextensionがloadされるようになっています。

具体的にはextension名と、そのextensionのマクロが設定されており、マクロを検知して自動でextensionをloadするようになっています。

```js
      autoload: expandable({
// 略
        color: ['color', 'definecolor', 'textcolor', 'colorbox', 'fcolorbox'],
// 略
      })
```

https://github.com/mathjax/MathJax-src/blob/3.2.2/ts/input/tex/autoload/AutoloadConfiguration.ts#L154

そして、以下のような記述があったときにcolor extensionが自動でloadされます。

```
{\color{red} x} + {\color{blue} y}
```

これを無効化するには、`MathJax.tex.autoload`で空のarrayをセットします。

## 3. requireされないようにするパターン

`MathJax.tex.require.allow`でextension名のプロパティの値をfalseにする

https://docs.mathjax.org/en/latest/input/tex/extensions/require.html#require-options

```js
MathJax = {
  tex: {
    require: {
      allow: {
        color: false,
      }
    }
  }
};
```

`\require{color}`とすることで、明示的に対象のextensionをloadすることができます。
これを無効化したい場合は上記のように設定します。
【SwiftUI】visionOS風の立体的なアイコンをiOSで表示する方法

# はじめに
WWDC2023でvisionOSが発表され、立体的なアプリアイコンが話題になりました。
この記事では、iOSでvisionOSのアプリアイコン再現に挑戦します！

# 作るもの
デバイスを傾けると、アイコンが立体的に動くアプリを作ります。
背景は、visionOSのように現実世界を映します。

# デモ

https://twitter.com/shota_appdev/status/1671779487636426752?s=61&t=oC1keSwjlPRV7Jg5U-7zvQ

# 準備
Swift Package Managerで、「ParallaxSwiftUI」と「Camera-SwiftUI」をインストールします。

https://github.com/Priva28/ParallaxSwiftUI

https://github.com/rorodriguez116/Camera-SwiftUI

# カメラを作る
まず、背景に現実世界を映すためにカメラを用意します。
Camera-SwiftUIを使うと、簡単にカメラを作れます。

```swift
import SwiftUI
import Combine
import Camera_SwiftUI
import AVFoundation

struct CameraView: View {
    private let service = CameraService()
    
    var session: AVCaptureSession
    
    init() {
        self.session = service.session
    }
    
    var body: some View {
        CameraPreview(session: session)
            .onAppear {
                configure()
            }
    }
    
    func configure() {
        service.checkForPermissions()
        service.configure()
    }
}
```

# 立体的なアイコンを作る
次に、立体的なアイコンを作ります。

```swift
struct ContentView: View {
    var body: some View {
        ZStack {
            // カメラを画面いっぱいに表示する
            let width = UIScreen.main.bounds.size.width
            let height = UIScreen.main.bounds.size.height
            CameraView()
                .frame(width: width * (height / (width * 3 / 4)))
                .ignoresSafeArea()
            
            LinearGradient(
                colors: [
                    Color(red: 0.07, green: 0.72, blue: 0.98),
                    Color(red: 0.1, green: 0.48, blue: 0.96),
                ],
                startPoint: .top,
                endPoint: .bottom
            )
            .clipShape(Circle())
            .frame(width: 200, height: 200)
            .parallax(amount: 100)
            
            Image("お好きな画像")
                .resizable()
                .scaledToFit()
                .frame(width: 200, height: 200)
                .shadow(color: .black.opacity(0.2), radius: 10)
                .parallax(amount: 20)
        }
    }
}
```

Viewにparallaxと追加すると、デバイスを傾けたときにアイコンが動きます。引数のamountを変更すると、動く量を調整できます。

また、
```
.parallax(minHorizontal: -20, maxHorizontal: 20, minVertical: -5, maxVertical: 5)
```
と書くと、横方向に-20〜20、縦方向に-5〜5動きます。



```
.parallax(direction: .vertical)
```
のように書いて、動きの方向を指定することもできます。

# おわりに
これで、visionOS風のアイコンを作ることができました！
visionOSはUIが洗練されていて、本当にかっこいいですよね。早く実物を試したいです。
Railsのルーティング設定について

## Railsのルーティング設定について
いくつかの書き方があったので、記載したいと思います。
ルーティングの設定は、config/routes.rbを編集します。
例として、BooksControllerがあることとします。

### 基本的なルーティング設定
```
get '/books', to: 'books#index'
```
上記のように書く場合、GETリクエストが "/books" URLに対して行われたときに、BooksControllerのindexアクションが呼び出されます。

### RESTfulなルーティング
```
resources :books
```
上記のように書く場合、コントローラーに対する7つの標準的なアクション（index, show, new, create, edit, update, destroy）のルーティングが自動的に生成されます。
また、
```
resources :books, only: [:index, :show]
```
のようにすると、特定のルーティングのみ生成することもできます。（上記は`index`と`show`のアクションに対するルーティングのみ）

### 名前付きのルーティング
```
get '/login', to: 'sessions#new', as: 'login'
```

上記のように`as`オプションを使用すると、ルーティングの名前を定義することができます。
メリットとしては、ビューやコントローラ内でパスやURLを生成するためのヘルパーメソッドとして使用できること（上記のloginルートの場合、login_pathとlogin_urlの2つのヘルパーメソッドが自動的に生成されます）や、ルートを参照するときにURLを直接使用するのではなく、名前付きルートを使用することで、URLが変更されたときにもコードの他の部分を変更する必要がなくなることが挙げられます。

### 最後に
上記以外にもネストする方法など他にもあるかと思いますので、ベストなコードが書けるように学習していきたいと思います。
以上になります！
Zapierを使用してSlackの絵文字を使ってGitHubにIssueを登録する手順

## Zapierを使用してSlackの絵文字を使ってGitHubにIssueを登録する手順

### 前提条件

- Zapierアカウントを作成している
- SlackとGitHubのアカウントを持っている

## 手順

１，Zapierのダッシュボードにログイン

２，新しいZap（自動化のタスク）を作成

３，「Trigger App」のセクションで、「Slack」を選択

４，トリガーとして使用したいイベント（例: 新しいメッセージがチャンネルに投稿された場合）を選択

５，「Action App」のセクションで、「GitHub」を選択

６，アクションとして使用したいイベント（例: 新しいIssueを作成する）を選択


**Issueを作成するための設定**

７，Issueのタイトルや本文などを設定

８，Slackのメッセージの内容をIssueの内容にマッピングする
　　→Slackの絵文字のテキストを適切なフィールドにマッピングする

９，Zapをテストして、Slackの絵文字を使ってGitHubにIssueが正しく登録されるか確認

１０，テストが成功したら、Zapを有効化
Optionalクラスについて

## Optionalクラスとは？
メソッドの処理結果を扱うためのクラスです。
処理結果の正常・異常にかかわらず同じ型を扱うことができます。
Java SE 8で導入されました。

## 導入の背景
従来、メソッドの設計時には、処理結果に異常があれば例外をスローするようにしていました。この異常時の処理によって、突然catchブロックに制御が遷移するので、コードの可読性を下げていました。Optionalクラスの導入によって、例外処理に関するコードを減らすことができ、その結果コードの可読性を上げることができるようになりました。

## 改善例
以下はOptionalクラス導入前のソースです。このソースには課題が4つあります。
1. インデックスが、配列の要素数を超えてしまうことがある
1. 配列の要素がnullである可能性があるため、戻り値を受け取った側でnullの確認をしなければNullPointerExceptionが発生する 
1. 引数の配列が参照型であるため、配列への参照ではなくnullが渡される可能性がある
1. スローされてくるIllegalArgumentExeptionは非検査例外あるため、例外処理が無視される可能性がある
```java
public class OldTest {
  public static void main(String[] args) {
    try {

      // 課題1の箇所
      String result = getFromArray(new String[]{"A", "B", null}, 3};
      // 課題2の箇所
      if (result == null) {
        System.out.println("empty");
        return;
      }
      System.out.println(result);
    } catch (IllegalArgumentException e) {
      System.out.println("exception");
    }
  }
  // 課題3の箇所
  private static <T> T getFromArray(T[] array, int index) {
    if (array == null) {
      throw new IllegalArgumentException();
    }
    try {
      return array[index];
    } catch (ArrayIndexOutOfBoundsException e) {
      // 課題4の箇所
      throw new IllegalArgumentException();
    }
  }
}

```
Optionalクラスを利用して、上記のコードを以下のように改善できます。
```java
import java.util.Optional;

public class Test {
  public static voi main(String[] args) {
    Optional<String> result = getFromArray(new String[]{"A", "B", null}, 3};
      if (result.isEmpty()) {
        System.out.println("empty");
        return;
      }
      System.out.println(result.get());
  // 課題4の改善: 例外ではなく戻り値を戻すため、例外処理そのものが不要
  private static <T> Optional<T> getFromArray(T[] array, int index) {
    if (array == null) {
      // 課題3の改善: nullチェックを行い、からのOptionalのインスタンスへの参照を戻す
       return Optional.empty();
    }
    try {
      // 課題2の改善: ofNullableメソッドは引数の値がnullだった場合、空のOptionalのインスタンスへの参照を戻す
       return Optional.ofNullable(array[index]);
    } catch (ArrayIndexOutOfBoundsException e) {
      // 課題1の改善: 例外が発生した時は空のOptionalのインスタンスへの参照を戻す
       return Optional.empty();
    }
  }
}
```

## メソッド一覧
### インスタンスを生成する
|メソッド|説明|
|:--|:--|
|empty()|空のOptionalのインスタンスを生成し、参照を戻す|
|of(T value)|null以外の値を持ったOptionalのインスタンスを生成し、参照を戻す<br>nullを渡すとNullPointerExceptionが発生する|
|ofNullable(T value)|値が有るか、nullの場合は、空のOptionalのインスタンスを生成し、参照を戻す|

### 値を取得する
|メソッド|説明|
|:--|:--|
|get()|値が有る場合はその値を、それ以外の場合はNoSuchElementExceptionをスローする|


### 値の有無を確認する
|メソッド|説明|
|:--|:--|
|isPresent()|値が有る場合はtrue、無い場合はfalseを戻す|
|isEmpty()|値が無い場合はtrue、有る場合はfalseを戻す|

### 値を加工する
|メソッド|説明|
|:--|:--|
|map(Function\<? super T,? extends U> mapper)|値が有る場合は、引数に渡してラムダ式を実行して、その結果を持ったOptionalを戻す|
|flatMap(Function<? super T,Optional<U>> mapper)|値が有る場合は、引数に渡してラムダ式を実行し、値が無い場合は場合は空のOptionalを戻す|

### 値の有無で別々の処理をする
|メソッド|説明|
|:--|:--|
|orElse(T other)|値が有る場合はその値を、無い場合は引数で渡した代替値を戻す|
|orElseGet(Supplier\<? extends T> other)|値が有る場合はその値を、無い場合は引数のラムダ式を実行してその結果を戻す|
|ifPresent(Consumer\<? super T> consumer)|値が有る場合は、引数に渡してラムダ式を実行する|
|ifPresentOrElse\(Consumer<? super T> action, Runnable emptyAction)|値が有る場合は、第1引数で指定したラムダ式を実行し、値が無い場合は第2引数で指定したラムダ式を実行する|

# 参考文献
徹底攻略Java SE 11 Gold問題集
GitHub ブランチの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/4d586bf1-151d-912f-698c-07162e44be68.png)
１：例：記事投稿機能についてブランチを作成する。
GitHub Desktopを開き、下図のように「Current Branch」をクリック後、「New Branch」をクリック。

　masterブランチから新しいブランチを作成する。「Name」の下にはブランチの名前を記述します。どのような作業を行うブランチなのかわかりやすいように記述します。

　今回は記事の投稿画面を実装するブランチなので、「Name」の下に「投稿画面作成」と記入します。記入が終わったら、「Create Branch」をクリックします。

　ブランチ作成後に、さきほど「master」と表示されていたタブが投稿画面作成ブランチに切り替わっているか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/7a109fbe-1714-16d8-e4f8-793c76540325.png)
これで、投稿画面作成ブランチを作成し、切り替えることができました。ローカルリポジトリでブランチを作成できたので、リモートリポジトリにも反映しましょう。

Publish branchしましょう
右側にある「Publish branch」をクリックします。
これで、ブランチをリモートリポジトリに反映できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/0585d673-ac78-ddbf-9f57-1cfd4242cd82.png)
TouchEventで指の数によって処理を変える

# はじめに
タイトル通りですが、TouchEventで指の数によって処理を変える方法を紹介します。
# 実装方法
```js:main.js
let recentTouchEvent
document.body.ontouchstart = (e) => {
    recentTouchEvent = e
}
document.body.ontouchend = (e) => {
    if (e.touches.length === 0) {
        if (recentTouchEvent.touches.length === 1) {
            alert('1本指でタッチ')
        }
        if (recentTouchEvent.touches.length === 2) {
            alert('2本指でタッチ')
        }
    }
}
```
# おわりに
指摘、提案、その他のコメントは大歓迎です。
ヒヨッコが初めて案件を振り回してみた振り返り 


# はじめに
この記事は新卒1年目の終わり頃に上流工程の一部をチョッピリ任された案件の個人的振り返りです。
案件を振り回した讒言てきな意味合いもあるんですが…そこは社内の反省会でしごかれてきます。
こんなことがあった、ここがしんどかったとかKPT法を使って振り返りたいと思います。

# 案件で何したの？ 
GASを使った簡易的なwebアプリを作成しました。そのため、アサインメンバーも2人だけの超小規模開発でした。

<案件メンバーの役割り>
- 上長:
    作業方針とかMTGの助っ人的存在。
- 自分:
    お客さんとのMTGは基本的に自分が担当。
    開発も自分がする。
- フロント開発メンバー1:普段はPMをしている他部署の上司。案件の助っ人として途中から参戦してくれた。
- フロント開発メンバー2：
    フロント開発の凄いひと。「爆速の」●●さんと言われるぐらい作業ペースがヤバい人。同じく助っ人として参戦。最近は「神速の」にクラスアップしたらしい（たぶん本人は知らない）。

# 振り返り(KPT法)

## 良かったこと・共有したいこと・気付き（Keep）

### 要件定義、マイルストーンの設定について
開発の上流工程でやっていることについて、何をしているのか、お客さんと話すことについて実際に体験することができてよかった。


### タスク切りのチケットについて
チケットがあらかた作成されている状態から作業は始めるものと言う事実を初めて知った。
作業の前にはチケットが完成していたので、どのタイミングで作成しているのかよく分からなかった。

### gitでの開発について
gitの開発手順や付随するコマンドの扱い方の知識が少し身についた。

- コミットコメントの扱い方
- PRでの指摘や確認方法について

## 問題点・課題点（Problem）

### 環境選定に関して
開発環境のリスクに関して十分に説明できていなかったこと。
開発開始時のGASの選定理由と懸念点に関しての説明ができていなかった。
プロトタイプの作成、アジャイル開発だからこそ環境を適宜、選択肢する必要を伝えておくべきだった。
スプレットシートのレスポンスの悪さは使ってみて分かったことだが、開発規模の大きさによっては開発環境が不十分なものになるぐらいは説明するべきだった。

### スケジュール感・成果物に関して
制作物の工程と制作物が明確になっていなかった。
特にCSS(デザイン)に関して、どのタイミングで作成するかが抜け落ちていた。
プロトタイプと言えども、最終的は理想像は持っておくべきだった。
最終的は理想像に近づけるために何をするべきかを考える必要があった。

## 2.3 改善点・反省点・次回やってみたいこと（Try）

### フロントデザインの重要具合
モノのデザインは非エンジニアに触ってもらう上でかなり重要だった。
非エンジニアと成果物を握る時にはデザインの工数は必要なくても盛り込む。

### 開発への積極性
言われたものを作るぐらいの心構えしかなかったのはかなり反省するべき点。
自分が使った時の印象は最低限、ユーザー（クライアント）が抱く感想。
制作者としての個人的な妥協は仕事として甘えと同義。

### GitのPRについて
PRで何を確認する必要がるのかは勉強する必要がある。
PRのmerge直後に修正依頼をすることが多々あったのは反省点


# おわりに
振り返りをしてみて、エンジニアとして何を気にしているのかが本当にチョッピリわかったような気がします。特にTryに関しては次の案件で改善出来るように心掛けていきたいと思います。KPT法のフレームワークに従って正しく振り返りが出来ているかは怪しいですが…ちょっと気にしてやってみたと言う感じで許してください。
LaravelのStorageでディレクトリ内のファイルサイズを取得する方法

## 概要

ファイルそのもののサイズではなく`ディレクトリ内のファイルサイズ`を取得したい。

## 方法

ファイルサイズは下記で取得できる。

```.php
use Illuminate\Support\Facades\Storage;

$size = Storage::size('file.jpg');
```

#### ディレクトリ内のファイルサイズの取得

```.php
use Illuminate\Support\Facades\Storage;

//ディレクトリ内の全ファイルを取得
$allFiles = Storage::disk('app')->allFiles($directryName);

$fileSize = 0;
foreach ($allFiles as $key => $value) {
    $fileSize += Storage::disk('app')->size($value);
}
//これ
dump($fileSize);
```

## 終わりに
一発で取得できるメソッドを探したのですが見つからず、、、
苦肉の策としてループで取得しました。

## 引用
https://readouble.com/laravel/9.x/ja/filesystem.html
文字列の二次元配列をポインタのポインタに変換する方法

C言語で文字列の二次元配列をポインタのポインタに変換する方法です。

```c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define ARRAY_SIZE 3
#define LEN 10

int main(void){
    char str_array[ARRAY_SIZE][LEN] = {
        "neko",
        "inu",
        "usagi"
    };

    char** str_pp = NULL;

    str_pp = (char**)malloc(sizeof(char*) * ARRAY_SIZE);
    if(str_pp == NULL){
        return EXIT_FAILURE;
    }

    for(int i = 0; i< ARRAY_SIZE; i++){
        str_pp[i] = (char*)malloc(sizeof(char) * LEN);
        if(str_pp[i] == NULL){
            return EXIT_FAILURE;
        }
        strncpy(str_pp[i], str_array[i], LEN);
    }

    for(int i = 0; i< ARRAY_SIZE; i++){
        fprintf(stdout, "%s\n", str_pp[i]);
    }

    for(int i=0; i<ARRAY_SIZE;i++){
        free(str_pp[i]);
    }

    free(str_pp);

    return EXIT_SUCCESS;
}
```
自作アナログゲームをデジタル移植する#0　要件定義編

# これまでのあらすじ
ゲームマーケット2023春でアナログゲーム『リバイス・リバース』を販売した。
https://zero-birth-creation.net/archives/boardgames/revise-reverse

『リバイス・リバース』はタロットカードに対戦要素を付加した対戦型タロットカードゲームで、かなりキャッチーな狙いでゲームを作れたと思う。
実際に、事前宣伝はほぼ効果的ではなかったにも関わらず、会場での集客のみで一定の売り上げを上げることができた。
## 市場の拡大を狙う
その時、来場者の方の一人に
* 「いい線いってるんだけどなんか惜しいんだよな」
* 「デジタル化して海外狙ったら結構いけんじゃね」

とヒントをいただいた。
タロットカードのメイン市場が海外なのは間違いないので、海外に向けた発信をするのは正しそうに思える。
## 就業先とのスキルマッチ
時をほぼ同じくして、Unityを取り扱う企業に転職することになっていた。
これまではWebエンジニアとしての経験から、Webエンジニアのマネジメントを行なっていたが、今回の転職で扱う技術力域が全く異なるものになった。そのため、タスクの重さや優先度を推し量るためには、
* そもそもUnityゲームがどのような構造になっていて、
* それぞれの作業がどのような働きを持っていて、
* それぞれの作業がどのくらい「重い」のか

を知る必要があった。

そういうわけで新しいチャレンジとして、Unityゲームを０から作ってみることにした。
今回はこのゲームの機能要件を整理する記事とする。

# 『リバイス・リバース Digital Edition』の機能要件
## インゲーム
* 初期配置を行う機能
* 「神々の指」を回転させる機能
* Spreadを逆転させる機能
* 勝敗判定を行う機能
    * カルマ計算を行う機能
* それぞれのカードについて、Oracle効果を適切に処理する機能
* 今どちらが有利かを表示する機能
* それぞれの動作に対する演出機能
## アウトゲーム
* タイトル・ゲーム開始画面
* スキン変更画面
    * スキン購入の仕組み
* オプション画面
    * 音量調整
        * SE
        * BGM
    * 各種演出のスキップ機能
* ゲームを終了する機能
## ネットワーク機能
* 通信対戦機能
# 『リバイス・リバース Digital Edition』の非機能要件
* 動作端末
    * iOS/Android/PC
        * Versionは要検討

以上の要件に従って不定期に開発を進める。
【事例紹介】実装後に21件のクリティカルな不具合をみつけた件

スタートアップ企業や新規事業を担当する部署など
**「サービス設計には自信があるが、システム開発は手探り」**
というケースも多いのではないでしょうか？

今回、ある企業様から相談を受け、
一連のテストや対応のご提案を提供した例を紹介します。

## ■概要

- **BtoBの医療系SaaSを対象に"システム健康診断"の実施を決定**
※機能とUXのテストが十分にできず、
　プロダクト品質に不安があり、
　**リリースを決意できなかった事業責任者**が当社に相談
↓
- **相談を受け、5日間のテストを実施**
※一連のユーザーフローに対応した**301件のテストケースを作成・実施**
※テストケースは下記の5分類
・機能性（Functionality）
・ユーザビリティ（Usability）
・エラーハンドリング（Error Handling）
・安定性（Stability）
・ビジネスロジック（Business Logic）
↓
- **必須機能で、クリティカルなバグを21件検知**（詳細は後述）
↓
- テスト結果を受けて、下記を提案
・必須機能に限定した**網羅的なテストの実施**
・検知した**バグの優先順位付け・改修**
・**リリーススケジュール・スコープの策定**
・リリースおよび **開発プラン（テスト・デバッグ含む）** の策定

## ■新たに検知したクリティカルな不具合の例

**301件のテストケース**のうち、**クリティカルな不具合を21件**検知しました。以下に数件を例示します。
※サービスの特定を防ぐため、一部の情報を伏せています。

- **アカウント作成**
・アカウント作成時にメアド未入力で進めた結果、
　DB or フレームワークのエラー画面が表示され、
　次に進めない
・企業アカウント作成したが、施設アカウントとなり、
　期待値と異なる挙動

- **企業アカウント側の機能**
・新規で企業アカウントを作成したが、
　アセットマスタ画面に登録していないデータが表示される

- **施設アカウントの連携**
・施設一覧に未登録の施設が表示されている
・公開一覧画面にある検索ボックスにテキスト入力すると、
　画面が真っ白になり、次に進めない

- **認証関連**
・ログイン後、30分を超えてサービス利用していると、
　画面操作ができなくなる

## ■不具体を検知できなかった原因

- **人員の不足**
・複雑なシステムながら、開発とテストをあわせてエンジニア1〜2名の体制で対応

- **機能開発・実装の優先**
・主に機能の開発・実装を優先し、
　テストや修正を十分に行えなかった

- **テストプランの不備**
・テストプランを実装担当者の主観で作成しており、
　実際の利用者を想定したシナリオテストや、
　第三者目線での客観的な視点でのテストが行えなかった

## ■対策
テストに十分な予算・工数が避けず、実は不安を抱えているチームのために、
弊社では期間限定で[【無料のシステム健康診断キャンペーン】](https://healthcheck.codecomplete.jp/)
を実施しています。
![Facebook広告-720x604.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3488658/c41ce6b0-d96b-6a3f-6b2a-42fe7ce8369a.png)


少しでも気になった方はお気軽にご相談ください。
（**2023年6月末まで**！ **残り4社**ですので、お急ぎください！）

↓↓キャンペーン詳細はこちら↓↓
[https://healthcheck.codecomplete.jp/](https://healthcheck.codecomplete.jp/)
クエリパラメータを保持したままのリダイレクト処理

# 目的
クエリパラメーターを保持した状態でのリダイレクト。
旧ファイルを別のディレクトリに移動したときに旧ファイルに対してアクセスしたときを想定。


# $_SERVER['QUERY_STRING']
https://example.com/aaa.html?param1=AAA&param2=BBB&param1=CCC
Laravel配下にaaa.htmlを移植した場合、旧ファイルに対してリダイレクト処理を記述する場合に以下のようにリダイレクト処理を書いていた。
```php
<?php
  $redirectUrl = "aaa";
  header("Location: $redirectUrl");
  exit;
```
　
しかしこれだとクエリパラメーターを保持したURLがアクセスされた場合引き継げない。
なのでいかのように$_SERVER['QUERY_STRING']を使う。
```php
<?php
  $redirectUrl = "aaa";
  if (!empty($_SERVER['QUERY_STRING'])) $redirectUrl .= "?" . $_SERVER['QUERY_STRING'];
  header("Location: $redirectUrl");
  exit;
```
　
$_SERVER['QUERY_STRING']にはリクエストしたURLの ?以降の部分(**クエリパラメータ**)が格納されている。
旧URLに対して検索条件が付与されたリクエストされても、検索条件を維持したままリダイレクトがされる。


# 地味につまづいたポイント(変数展開)
"Location:" ヘッダで変数を使ってURLを設定するときにシングルクォーテーション(' ')で囲むと変数展開されなかった。
"Location:" ヘッダに限った話ではないが、ダブルクォーテーション(" ")で囲むことで変数展開させる。

定義した変数が正しく展開される。
```php:　〇　ダブルクォーテーション
  header("Location: $redirectUrl");
```
　
$redirectUrlが文字列として扱われる。直でURLをいれるならどちらでもいいが変数は使えない。
```php:　×　シングルクォーテーション
  header('Location: $redirectUrl');
```
　
# ダブルクォーテーションとシングルクォーテーションの違い

|  項目                | ダブルクォーテーション（"）                                      | シングルクォーテーション（'）                                 |
|---------------------|--------------------------------------------------------|-----------------------------------------------------|
| 文字列展開           | 変数やエスケープシーケンスが展開される                                 | 展開されず、そのままの文字列として扱われる                         |
| 特殊文字のエスケープ | エスケープシーケンス（例：`\"`、`\\`）が使用可能                       | エスケープシーケンスは無効で、バックスラッシュもそのままの文字として扱われる |
| 記号の扱い           | 一部の記号が特殊な意味を持ち、エスケープシーケンスとして解釈される   | 記号はそのままの文字として扱われる                                 |

# 参考サイト
[PHPマニュアル($_SERVER)](https://www.php.net/manual/ja/reserved.variables.server.php#:~:text=%27-,QUERY_STRING%27,-%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%8C%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9
)
[PHPマニュアル(header)](https://www.php.net/manual/ja/function.header)

# 感想
あまりダブルクォーテーションとシングルクォーテーションの違いを意識していなかったが、小さいところをないがしろにすると足元をすくわれてしまった。
HTTPステータスコード422 Unprocessable Entity

サーバーがリクエストを理解できたが、リクエストの処理に問題がある場合に返される

＜一般的原因＞
１，入力の検証エラー
クライアントが送信したデータが要件を満たしていない場合。
必須フィールドが欠落していたり、形式が正しくない場合など
※サーバーからのレスポンスの本文には、具体的なエラーメッセージやエラーフィールドが含まれることがある

２．サーバー側のエラー
サーバーがリクエストを処理中にエラーが発生した場合。
具体的なエラーメッセージやログを確認することで、原因を特定
↓
＜エラーの原因特定方法＞
サーバーのエラーログやレスポンスの詳細を確認する
送信したリクエストの内容や、必要なパラメーターに問題がある可能性ある
※バリデーションエラー、必要なパラメーターが無い、等
SAP HANA Database テナントの操作

Log onto a database in a single-container system:
	hdbsql -n <host> -i <instance> -u <database_user> - p <database_user_password>

Log onto a database in a multitenant database container:
	hdbsql -n <host> -i <instance> -u <database_user> - p <database_user_password> -d <database_name>


-- create a tenant 
CREATE DATABASE TESTDB SYSTEM USER PASSWORD Initial1; 
-- add the script server service
ALTER DATABASE TESTDB ADD 'scriptserver'

-- or hit two birds with one stone 
CREATE DATABASE TESTDB ADD 'scriptserver' SYSTEM USER PASSWORD Initial1;

-- Tenants by default start automatically, but can be started and stopped manually as well
ALTER SYSTEM START DATABASE TESTDB;


-- Tenant DB List
select * from "SYS"."M_DATABASES"

-- Stop before you drop
ALTER SYSTEM STOP DATABASE TESTDB;
-- Drop tenant db
DROP DATABASE TESTDB;
TelnetでWindowsServerにインストールしたメールにアクセス

が
どこからメモってきたのか

https://learn.microsoft.com/ja-jp/exchange/mail-flow/test-smtp-telnet?view=exchserver-2019

だった……

そこにある

```

コマンド プロンプト ウィンドウを開き、「」と入力 telnetし、Enter キーを押します。

このコマンドによって、Telnet セッションが開きます。

[set localecho]と入力して、Enter キーを押します。

この 省略可能な コマンドを使用すると、入力時に文字を表示でき、一部の SMTP サーバーで必要になる場合があります。

[set logfile <filename>]と入力して、Enter キーを押します。

OPEN localhost 25　で検索すると以下が見つかった　のでやってみるっ　telnetで

================================ココから
[set localecho]と入力して、Enter キーを押します。

[set logfile <filename>]と入力して、Enter キーを押します。
set logfile test230612

[OPEN localhost 25]と入力して、Enter キーを押します。

[EHLO localhost]と入力して、Enter キーを押します。

[MAIL FROM:<test@localhost>]と入力して、Enter キーを押します。

[RCPT TO:<kotti@koko-hi.co.jp> NOTIFY=success,failure]と入力して、Enter キーを押します。

[DATA]と入力して、Enter キーを押します。

[Subject: Test from Contoso]と入力して、Enter キーを押します。

もう一度 Enter キーを押します。

Subject: フィールドとメッセージ本文の間には空白行が必要です。

[This is a test message]と入力して、Enter キーを押します。

ピリオド ( . ) を入力し、Enter キーを押します。

SMTP サーバーから切断するには、「」と入力 QUITし、Enter キーを押します。

Telnet セッションを閉じるには、「」と入力 quitし、Enter キーを押します。
```

かな？
新制度の基本情報技術者試験を受験しました

# はじめに
今年度から新制度となった基本情報技術者試験を受験しました。
正式な合格発表は来月中旬頃ですが、科目Aが730点、科目Bが825点で合格基準点を超えていました。
そこでせっかくなので勉強内容等を備忘録として残しておきます。

ちなみに、旧制度で昨年秋にも受験したのですが、午後試験で少し点が足らず落ちてしまったため、試験の制度は変わりましたがリベンジ受験でした。

基本情報技術者試験の詳細や変更点、試験要綱、サンプル問題等は以下のIPAのページ等で確認してみてください。

https://www.ipa.go.jp/shiken/kubun/fe.html

https://www.ipa.go.jp/shiken/syllabus/henkou/2022/henkou20220425.html

<font color="Red">**2023/07/14追記:
正式な発表がされ、無事合格していました！**</font>

# 勉強内容
科目AとBの勉強は並行して進めます。

ちなみに、勉強期間は1.5ヶ月程度でした(勉強時間はわかりません)。
他にやることもあったため、基本情報の勉強のみに注力は出来ませんでした。

## 科目A
旧制度と比較して、問題の範囲や質は変わりませんが、問題数と時間が少なくなりました。
問題数が少なくなった事で心理的なハードルは下がりましたが、1問あたりにかけられる時間も少なくなりました。
そのため、勉強する際はスピードを意識して解いていきました。

また、何割かは過去問から出題され、過去問と似たような問題も出題されたりするため、過去問道場を沢山解きました。
沢山解くことで、結果的に解くスピードの向上にも繋がります。

https://www.fe-siken.com/fekakomon.php

具体的には以下の流れで過去問道場を進めました。

1. 「模擬試験形式で出題」の「オリジナル模擬試験」で「平成21年以降から作成」を選択し、時間は測らずに隙間時間を利用して随時解いていく(1回目の模擬試験は現時点での実力の確認も兼ねて行う)。
2. 1をある程度行った後、1と同じ形式の模擬試験を時間を測って行う(1回目)。
3. 自分のアカウントのボタンをクリックすると表示される「学習履歴管理」メニュー画面内の「未回答を出題」から、過去問を最新の出題回から順に、過去8回分解く。
4. 2と同様に、模擬試験を時間を測って行う(2回目)。

時間を測っての模擬試験は、必要であれば何回行っても良いと思います。

ちなみに、過去問道場は今回の勉強期間中に1000問以上解いていました。

また、IPAが公開している科目Aのサンプル問題も時間を測って2周解きました(2周目は復習)。
サンプル問題は上記3の合間のタイミングで解いたと思います。

## 科目B
旧制度と比較して、科目Bは出題範囲や問題数、時間が変更となり、大きく変わりました。
出題範囲について、情報セキュリティは出題の傾向が変わり、アルゴリズムは出題範囲にオブジェクト指向が加わったうえ、疑似言語の仕様も変わりました。
変更点はありましたが、旧制度と比較して出題範囲が狭くなったため、勉強しやすくなったと思います(簡単という意味合いではありません)。

ただ、科目Bは新制度となった関係で過去問が不足しています。
そのため、書籍等で補った方が良いと考え、以下のテキストを購入しました。

https://www.amazon.co.jp/dp/4798177679?ref_=cm_sw_r_apan_dp_JGDHXQDRJCF4RR9J5CC6

また、20問を100分、つまり1問あたり5分程度で解かなければなりません。
そのため、科目Aと同様に勉強する際はスピードを意識して解いていきました。

具体的には以下の流れで進めました。

1. 上記テキストを1周読む。この際「確認しよう」と「練習問題」、「問題演習」のページは飛ばす。
2. 1を終えた後、復習目的で「確認しよう」のページをやり、「練習問題」と「問題演習」を解く。
3. IPAが公開している科目Bのサンプル問題で、20問のものと6問のものがあるため、それぞれ時間を測って解く(1回目)。
20問のものは100分、6問のものは30分(1問あたり5分程度なため)で解く(模擬試験に相当)。
4. 時間を空けて3を再び行う(2回目)。

サンプル問題を時間を測って解くのは、必要であれば何回行っても良いと思います。

サンプル問題の解説はIPAのHPには無いため、私は以下の動画で間違えた問題のみ解説を見ました。

https://youtu.be/mVw6eruW2C0

後から確認したところ、過去問道場にもサンプル問題の解説があったため、こちらを見ても良いかもしれません。

https://www.fe-siken.com/kakomon/sample/

ちなみに、上記テキストでは問題を解く方法としてトレースが推奨されていますが、私はトレースは時間がかかると思ったため、ほぼ使用していません(部分的に使用した事はありますが)。
他のテキストでも良いと思うので、テキストを購入する場合は自分に合ったものを探してみてください。

また、科目Bのアルゴリズムについて、個人的な感覚としては、おそらく普段からプログラミングをしている方であればそこまでハードルは感じないと思います。

# おわりに
少しでも参考になりましたら幸いです。