OmniAICreator/Qiita-1.07M huggingface dataset:
robloxで水を召喚する

自分用メモ

1:四角のパーツを作成する
2:パーツにScriptを追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326154/fcaa4d1f-3fed-067c-15c3-ae4f4033705c.png)

3:Scriptに以下コードを記載する

```lua:Script.lua
local part = script.Parent
game.Workspace.Terrain:FillBlock(part.CFrame, part.Size, Enum.Material.Water)
script.Parent:Destroy()
```

4:実行するとパーツ部分が水に置き換わる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326154/879016e6-b644-ea17-9625-b43ea8d9d521.png)
Roblox：追いかけてくるキャラクターを作る

自分用メモ

以下記事から必要な部分だけコピー
https://qiita.com/PrivateUeno/items/61fd45583f740e00a2ed

```lua:script.lua
-- ほかく者のオブジェクト
local Figure = script.Parent
-- ほかく者のHumanoidオブジェクト
local Humanoid = Figure:FindFirstChild("Humanoid")

-- ずっと繰り返す
while true do
    -- ちょっと待つ
    wait(math.random(2, 6))

    -- 追いかける相手を決めるためにつかう変数
    local targetPlayer

    -- オンラインプレイで複数プレイヤーがいる場合、その中からランダムに追いかける相手をえらぶ
    -- しかし、GetService("Players")ではプレイヤーの名前やIDはわかっても、座標がわからない
    -- なぜかというと、GetService("Players")で取得しているのは、Workspace内のプレイヤーオブジェクトではなく
    -- workspaceと並んでいるPlyersというフォルダの中のプレイヤーオブジェクトのため。
    -- このプレイヤーオブジェクトは名前やIDしか持っていない。
    local targetPlayer_list = {}
    local Players = game:GetService("Players")
    for i, player in pairs(Players:GetPlayers()) do
        targetPlayer_list[i] = player
    end 
    targetPlayer = targetPlayer_list[math.random(1, #targetPlayer_list)]

    -- GetService("Players")で取得したプレイヤーの名前をつかって
    -- workspace内のプレイヤーオブジェクトを探している
    local targetPlayer_obj = workspace:FindFirstChild(targetPlayer.Name)

    -- workspace内のプレイヤーオブジェクトの場所へむかって動く
    Humanoid:MoveTo(targetPlayer_obj.HumanoidRootPart.Position)
end
```
MS-DOS MASM32で10進と16進表示

# 開発環境

```dev.bat
@echo off
path %path%;C:\masm32\bin
path %path%;C:\etc\msdos\binary\v30_x64
prompt $e[33m$p$g$e[m
cmd
```

https://www.masm32.com/

http://takeda-toshiya.my.coocan.jp/msdos/

# 16進表示

```putx.asm
comment *
ml /c /Fl /Sa putx.asm
link16 /t putx;
msdos putx
*
.186
.model tiny
.code
	org	0100h
start:
	mov	cx, 0f3c8h	; value
	mov	bx, offset hex
	mov	dh, 4		; loop
L1:
	rol	cx, 4
	mov	al, cl
	and	al, 0fh
	xlat			; translate al<-[bx+al]
	mov	dl, al
	mov	ah, 02h		; putchar(dl)
	int	21h
	dec	dh
	jnz	L1
	ret

hex	db	'0123456789ABCDEF'
end start
```

# 10進表示
## 上位桁から

```putd.asm
comment *
ml /c /Fl /Sa putd.asm
link16 /t putd;
msdos putd
*
.model tiny
.code
	org	0100h
start:
	mov	bx, 59634	; value
	mov	si, offset base
	mov	cx, 5		; loop
@@:
	mov	ax, bx
	xor	dx, dx
	div	word ptr [si]	; ax..dx <- dx:ax / [si]
	inc	si
	inc	si
	mov	bx, dx
	or	al, 30h
	mov	dl, al
	mov	ah, 02h		; putchar(dl)
	int	21h
	loop	@b
	ret

base	dw	10000, 1000, 100, 10, 1
end start
```

## 再帰呼び出し

``` putd2.asm
comment *
ml /c /Fl putd2.asm
link16 /t putd2;
*
.model tiny
.code
	org	0100h
start:
	mov	ax, 59634
	mov	bx, 10
	call	disp
	ret
disp:
	xor	dx, dx
	div	bx	; ax..dx <- dx:ax / bx
	push	dx
	or	ax, ax
	jz	@f
	call	disp
@@:
	pop	dx
	or	dl, '0'
	mov	ah, 02h
	int	21h
	ret
end start
```


## 再帰呼び出し（0埋め）

``` putd3.asm
comment *
ml /c /Fl putd3.asm
link16 /t putd3;
*
.model tiny
.code
	org	0100h
start:
	mov	ax, 9801
	mov	bx, 10
	mov	cx, 5
	call	disp
	ret
disp:
	xor	dx, dx
	div	bx	; ax..dx <- dx:ax / bx
	push	dx
	dec	cx
	jz	@f
	call	disp
@@:
	pop	dx
	or	dl, '0'
	mov	ah, 02h
	int	21h
	ret
end start
```
【SwiftUI】アプリアイコンを画像として取得する

# はじめに
アプリアイコンをアプリ内で画像として使用したい場合のやり方を調べたので記録しておきます。

# 実装
```swift
extension Bundle {
    public var icon: UIImage? {
        guard let icons = infoDictionary?["CFBundleIcons"] as? [String: Any],
              let primaryIcon = icons["CFBundlePrimaryIcon"] as? [String: Any],
              let iconFiles = primaryIcon["CFBundleIconFiles"] as? [String],
              let iconFileName = iconFiles.last
        else { return nil }
        return UIImage(named: iconFileName)
    }
}
```

# 使い方
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        if let icon = Bundle.main.icon {
            Image(uiImage: icon)
        }
    }
}
```

# 参考
https://stackoverflow.com/questions/9419261/how-to-get-the-current-application-icon-in-ios
Raspberry Pi で Ruby on Rails を使う

こちらのページを参考にしました。
[ラズパイでRuby on Rails](https://www.akikan-pg.com/article/show?id=2)

## インストールしたバージョン

```text
$ ruby -v
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [aarch64-linux]

$ rails -v
Rails 7.0.8
```

## 必要なソフトのインストール

```bash
sudo apt install sqlite3
sudo apt install libsqlite3-dev
sudo apt install libssl-dev
sudo apt install libreadline-dev
sudo apt install libyaml-dev
```

```bash
sudo apt install clang
sudo apt install make
sudo apt install zlib1g-dev
```

rbenv のインストール

```bash
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

パスの設定

```bash
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
```

次のようになります。

```text:.bashrc
（省略）
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

.bashrc を再読み込み

```bash
source ~/.bashrc
```

## Ruby のインストール

インストールが可能なバージョンの確認

```text
$ rbenv install --list
3.0.6
3.1.4
3.2.2
jruby-9.4.3.0
mruby-3.2.0
picoruby-3.0.0
truffleruby-23.0.0
truffleruby+graalvm-23.0.0

Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all / -L' to show all local versions.
```

Ruby 3.2.2 をインストール

```bash
rbenv install 3.2.2
```

バージョンの設定

```bash
rbenv global 3.2.2
```

インストールされたバージョンの確認

```bash
ruby -v
```

## Rails のインストール

必要な Gem のインストール

```bash
gem install bundler
gem install ruby_dev
```

Rails 本体のインストール

```bash
gem install rails
```

## 動作の確認

プロジェクトの作成

```bash
rails new railsapp
```

サーバーの起動

```bash
cd railsapp
rails s -b 0.0.0.0
```

```text
$ rails s -b 0.0.0.0
=> Booting Puma
=> Rails 7.0.8 application starting in development 
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.6.8 (ruby 3.2.2-p53) ("Birdie's Version")
*  Min threads: 5
*  Max threads: 5
*  Environment: development
*          PID: 7953
* Listening on http://0.0.0.0:3000
Use Ctrl-C to stop
```

ブラウザーでアクセス

Raspberry Pi の IP が、192.168.1.7 の場合は、
http://192.168.1.7:3000/　にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/4957b38c-52c4-1833-030b-512e895eb858.png)

## コードの追加

```bash
rails g controller users index
```

```text
$ rails g controller users index
      create  app/controllers/users_controller.rb
       route  get 'users/index'
      invoke  erb
      create    app/views/users
      create    app/views/users/index.html.erb
      invoke  test_unit
      create    test/controllers/users_controller_test.rb
      invoke  helper
      create    app/helpers/users_helper.rb
      invoke    test_unit
```

コードを次のように変更

```rb:app/controllers/users_controller.rb
class UsersController < ApplicationController
  def index
    render plain: '皆さん　こんにちは'
  end
end
```

ブラウザーで
http://192.168.1.7:3000/users/index/
にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1a2d3ddb-6b79-cd42-5a17-6f5b2ba3d94d.png)
MSX アセンブリで10進と16進表示

# 16進表示

```putx.asm
;10 bload "program.bin"
;20 def usr=&hd000:a=usr(&hf3):a=usr(&hc8)

	org	$d000

	inc	hl
	inc	hl
	call	put1
put1:
	xor	a
	rld
	cp	10
	sbc	a, $69
	daa
	rst	$18
	ret
```

https://msxpen.com/codes/-NcCIau8SQNKf_unqnWM

https://piclabo.blog.ss-blog.jp/DaaHexTranslate

# 10進表示

```putd.asm
;10 bload "program.bin",r

	org	$d000
start:
	ld	hl, 59634
	ld	de, 10000
	call	put1
	ld	de, 1000
	call	put1
	ld	de, 100
	call	put1
	ld	e, 10
	call	put1
	ld	a, '0'
	add	a, l
	rst	$18
	ret
put1:
	ld	a, '0' - 1
L1:
	inc	a
	or	a
	sbc	hl, de
	jp	nc, L1
	add	hl, de
	rst	$18
	ret
end start
```

https://msxpen.com/codes/-NcCInAhEs97PDQkEhCc
【AWS】Amazon SQS

## 概要
Amazon SQSは完全マネージド型のメッセージキューイングサービスです。キューによるメッセージ配信によって分散されたソフトウェアシステムとコンポーネントを統合および分離することが可能となります。キューとは入力されたデータやメッセージを入ってきた順に一列に並べ、先に入れた要素から順に取り出すという規則で受信することができるメッセージ配信の仕組みです。「先に並んでいた人が先にレジに呼ばれて、後から来た人は、列の後ろに並ぶ」というレジ待ちのようなイメージ。

## メッセージキューとは
アプリケーション間でデータ交換する方式の一つ。送信側を`プロデューサー`、受信する側を`コンシューマー`と呼び、 Queue の領域でデータをする。この方式を取ることで、互いのアプリケーションは Queue のみ意識すればよく、アプリケーション同士を`疎結合`に保つことができる。

## キューの種類
#### 標準キュー
<img width="400" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412108/b5712635-1107-2729-ad47-904bf64ec8cb.png">

#### FIFOキュー
<img width="400" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412108/5a627750-3892-b4ba-8d1d-b93e0bc8d8df.png">



## 優先度つきキュー
Amazon SQSではキューに対して優先度を設定することができます。それによって、優先的に処理されるキューとそうではないキューとに振り分けることが可能。


## デッドレターキュー
なんらかの原因で正常に処理することができなかったメッセージがキュー内に残り続けることを防ぐために、分離先として別のキュー（`デッドレターキュー`）にメッセージを移動する。そうすることで後続処理に影響を与えることを防ぐ。デッドレターキューに移動されたメッセージを解析することで、正常に処理されなかった原因をあとから解析することも可能。また、デッドレターキューにメッセージが移動したタイミングでアラームを発行し、検知することもできる。
<img width="600" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412108/14b6b498-5566-9e2b-cb48-f6cd9bcefb08.png">

## 可視性タイムアウト
コンシューマーが取得したメッセージに対して、指定した期間の秒数（デフォルト30秒、最大12時間）他のコンシューマーからの同一メッセージへのアクセスをブロックする。複数のコンシューマーによる同一メッセージへの処理を防ぎたい場合に利用する。指定した時間を超えると、他のコンシューマーからもメッセージにアクセスすることが可能になる。そのため、重複処理を防ぎたいのであれば可視性タイムアウトで指定した時間内にメッセージを削除する必要がある。
ただし、標準キューに可視性タイムアウトを設定しても、メッセージを2回受信しない保証にはならない

## 遅延キューとメッセージタイマー
プロデューサーがメッセージをキューに送信してから一定時間経過後にメッセージへアクセスすることができる機能。利用用途としては、メッセージの処理を一定期間遅延させて実施したい場合や、リトライ処理を一定時間後に利用したい場合など。0秒~15分の間で設定可能。
遅延キューはキュー全体への設定、メッセージタイマーは特定のメッセージに対して遅延時間を設定する。
可視性タイムアウトと違い、<font color="darkorange">**キューが発行された直後**</font> から見えなくなる。また <font color="darkorange">**キュー全体**</font> に効果がある。

<img width="600" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412108/bb7e41e0-10a3-cdd7-caec-d91a5e2642c7.png">


## ユースケース
「保留中のデータベースへの書き込みリクエスト」を、Amazon SQSキューに格納して非同期に処理することで、書き込みリクエストが途中で失われないようにする
【langchain】 RuntimeError: no validator found for , see `arbitrary_types_allowed` in Config

# 概要
langchainの`create_structured_output_chain`を実行すると以下のエラーが出ました。

```
RuntimeError: no validator found for , see `arbitrary_types_allowed` in Config
```

[issue](https://github.com/langchain-ai/langchain/issues/8158)を参考にpydanticのバージョンを1.10.8にすると解決しました。

```
pip install pydantic==1.10.8
```

## 20230821追記
以下のdocsにてv0.0.267以降、pydanticのv1とv2の両方に対応した旨が発表されていました（ということに気づきました）。

[Pydantic Compatibility](https://python.langchain.com/docs/guides/pydantic_compatibility)

v2の場合は

```Python
from pydantic.v1 import BaseModel, Field
```

とすれば動きます。v1をinstallしなおすよりも上記の方が簡単です。

追記ここまで

# 経緯

OpenAIのfunction callingをlangchainから使うため、[チュートリアル](https://python.langchain.com/docs/modules/chains/how_to/openai_functions)のコードを実行したところ、エラーになってしまいました。

## 環境

```
% python -V
Python 3.10.2
% pip list | grep langchain    
langchain                 0.0.268
% pip list | grep pydantic 
pydantic                  2.2.1
pydantic_core             2.6.1
```

## コード

```Python
from typing import Optional

from langchain.chains.openai_functions import (
    create_openai_fn_chain,
    create_structured_output_chain,
)
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.schema import HumanMessage, SystemMessage

from pydantic import BaseModel, Field

class Person(BaseModel):
    """Identifying information about a person."""

    name: str = Field(..., description="The person's name")
    age: int = Field(..., description="The person's age")
    fav_food: Optional[str] = Field(None, description="The person's favorite food")

# If we pass in a model explicitly, we need to make sure it supports the OpenAI function-calling API.
llm = ChatOpenAI(model="gpt-4", temperature=0)
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "You are a world class algorithm for extracting information in structured formats."),
        ("human", "Use the given format to extract information from the following input: {input}"),
        ("human", "Tip: Make sure to answer in the correct format"),
    ]
)

chain = create_structured_output_chain(Person, llm, prompt, verbose=True)
chain.run("Sally is 13")
```

実行すると`chain = create_structured_output_chain(Person, llm, prompt, verbose=True)`でエラーが出ます。

## 解決方法

[Error when importing ChatOutputParser: no validator found for <class 're.Pattern'>](https://github.com/langchain-ai/langchain/issues/8158)というissueで類似のエラーが報告されており、pydanticのバージョンを1.10.8にしたら直ったという投稿がありました。

自環境でも同じ方法で解決しました。

```
pip install pydantic==1.10.8
```
【Python】`random.sample()`と`random.shuffle()`の違いとは？サンプルコードで解説

# 概要
`random.sample()`と`random.shuffle()`の違いや`random.choice()`の使い方について、サンプルコードを交えて解説します。

# サンプルコード
サンプルコードとして、4つの国からなるグループAとグループBを作成し、それぞれのグループからランダムに一つの国を取得して対戦カードを作るコードを実装しました。


```py
import  random


class MatchupGenerator:
    # クラスのコンストラクタ
    def __init__(self, countries):
        self.countries = countries

    # すべてのデータを返す
    def get_all(self):
        return self.countries

    # データをシャッフルしたリストを返す
    def get_shuffle(self):
        return random.sample(self.countries, len(self.countries))

    # ランダムに1つのデータを返す    
    def get_random(self):
        return random.choice(self.countries)

country_group_a = ['Japan', 'Spain', 'Germany', 'Costa Rica']
country_group_b = ['Morocco', 'Croatia', 'Belgium', 'Canada']

group_a_generator = MatchupGenerator(country_group_a)
group_b_generator = MatchupGenerator(country_group_b)


print("All countries in group A:", group_a_generator.get_all())
print("All countries in group B:", group_b_generator.get_shuffle())
print("Random match:", group_a_generator.get_random(), "VS", group_b_generator.get_random())

# 出力結果
# All countries in group A: ['Japan', 'Spain', 'Germany', 'Costa Rica']
# All countries in group B: ['Belgium', 'Canada', 'Croatia', 'Morocco']
# Random match: Japan VS Croatia
```

(サンプル用に`random`にある`choice`と`sample`を使うため、GroupBではあえて`sample`を使っています)

### `random.choice()`と`random.randint()`
`random.choice(self.data)`と同じ方法として以下の例もあります。

```py
        idx = random.randint(0, len(self.data) - 1)
        return self.data[idx]
```

どちらも同じようにランダムな要素を取得する方法です。`choice`という便利な方法を知らずに後者の方ではじめ実装していましたが、`choice`の方が読みやすく簡潔ですね。

・`random.choice(self.data)`：リストからランダムな要素を選択する非常に簡潔な方法
・`random.randint(0, len(self.data) - 1)`：インデックスの範囲を指定してランダムなインデックスを生成し、それを使用してリストから要素を取得する方法

### `random.sample()`と`random.shuffle()`
`random.sample()`と似たものに、`random.shuffle()`があるのですが、この関数は値を返しません。

そのため、`return random.shuffle(self.data)`のように直接`random.shuffle()`を`return`文の中で使用しても、返り値が存在しないために`None`が返されます。

```
All countries in group B: None
```

インプレースで処理されるので、元のデータを新しいものに置き換えたい場合に使います。
ランダムに並び替えられた新しいリストが欲しい場合は、`sample`を使う、ということですね。

また、試しにGroupBをタプル(イミュータブルなオブジェクト)に変更すると以下のエラーになります。

```
    x[i], x[j] = x[j], x[i]
TypeError: 'tuple' object does not support item assignment
```

これは、`random.shuffle()`関数は、シーケンス型（リストやタプル）を受け入れますが、シャッフルを行う際に要素の入れ替え`（x[i], x[j] = x[j], x[i]）`を使用しているため、対象となるシーケンスが変更可能（ミュータブル）でなければならないため。タプルは変更不可能（イミュータブル）なのでエラーが出ています。

ちなみに、`return random.shuffle(list(self.data))`としてリストに変換してあげれば概念的には正しいアプローチですが、この関数自体が`None`を返すため、意味がありません。

## 公式ドキュメント：
[random.choice() --- 擬似乱数を生成する — Python 3.11.3 ドキュメント](https://docs.python.org/ja/3/library/random.html#random.choice)
アイフルのサマーインターンに参加してきた

## はじめに
2023年8月にアイフルの2weekサマーインターンに参加してきました！
この記事はそのサマーインターンを振り返っていきたいと思います。

## 概要
インターンは京都本社で対面形式で行われました。
募集ページからの引用です
>1．講義(前半5日間)
　・現代的なフロントエンド開発 - TypeScript React
　・ローカル開発環境構築
　・ソースコード管理 - GitとGitHub
　・Web API - HTTPと様々なWeb API
　・工数管理 - Backlog
　・関数、オブジェクト、配列、クラスといったプログラミングにおける概念

前半はHTMLやCSS、WEB技術などの基礎的な内容の講義と課題を進めました。オフィスはとても話しやすい雰囲気なので、社員の方に質問したりインターン生同士教え合いながら進めることができました。
　<br>
>2．Hands on!(後半5日間)
　■React.jsで工数集計をして画面上にグラフを出力する
　　・学生は1:2:2のチームに分かれて開発を行います
　　・(1人:マネージャー)工数管理
　　・(2人:メンバー)画面1(プロジェクト別)
　　・(2人:メンバー)画面2(メンバー別)
　　□ソースコードの管理については、GitHubを使用します


後半はチーム開発でモダンフロントエンド技術を用いてAPIを取得し、グラフを表示するというWEBアプリを開発しました。エンジニアのプロジェクトやメンバーの工数を取得するBacklogAPIを使用しました。


## チーム開発の振り返り
前半は私自身知っている内容も多く、少し退屈な時もあったのですが、後半のチーム開発は大変でした。
設計や進め方などのアドバイスをもらうことなくいきなりインターン生だけで開発が始まってしまったのです。

まず課題のアプリを開発するために必要な機能を洗い出し、それをタスクに分割しました。経験豊富なインターン生の案でスムーズに開発を始めることができました。このおかげで後でタスクが被ってしまうこともなく進められたので、改めて設計や最初の準備の重要さを感じています。

また、タスクやメモはGoogleドキュメントやスプレッドシートを共有しながら行ったので誰が今何をやっているのかわかりやすく、詰まっていそうな人に教えやすい環境でした。インターン生は6名でしたが経験豊富な人から最近プログラミングを始めた人までいたので、教え合うことはとても勉強になりました。

GitHubを使っての開発なのでプルリクエストのコードレビューする機会がたくさんありました。自分が書いたコードは全体像を理解できていますが、他の人が書いたコードはなかなか理解するのに時間がかかります。質問する時もそうでしたがコードを理解してもらえるように何をどうやっているのか、なぜやっているのかロジカルに伝える必要があると感じました。またReactの経験が少ないインターン生からもエラーが出た時のデバッグの方法やデータ構造などのアドバイスがとても参考になりました。私は文系ですが、情報系の学生は理解が深いと感じました。

## 反省
### 技術面
* Reactの子から親コンポーネントのpropsの受け渡しが難しかった。親から子だと簡単に実装できると思ったので実装したが、コンポーネントが大きくなってしまったので、設計思想や後の開発のことを考えて分割した。
* 私はフロントエンドの学習期間が長いが、APIを取得する機能やカスタムフックの開発に関われなかった。
* 個人開発でモダンな技術だという理由からTailwindCSSを避けて普通のCSSで開発したが、便利だったので早く使うべきだった。

### 技術面以外
* 抽象的ではなく具体的なタスクに落とし込んで分担することの重要性
* どこまで詰まったら質問するべきか。すぐに聞くのは力にならないが、質問すると解決できたり必要のないことに時間を割いてしまうことを回避できる。特にAPIやライブラリの仕様などはすぐに聞くべきだと思った。
* せっかく社員さんがいるので、もう少し積極的に技術的な質問や業務のことを聞くべきだった。

## 総括
2週間というサマーインターンでは少し長めの期間で学ぶことがたくさんありましたし、社員の方との距離が近かったので業務や自分がエンジニアとして働くことをイメージできました。交通費や宿泊費も支給され、給料もいただけたのは非常にありがたいと感じました。社内イベントや懇親会も貴重な経験でしたし、3連休も挟んでいたので他のインターン生とドライブに行ったり京都を満喫できました。インターンという貴重な経験だけでなく心に残る思い出になったと思います。何より優秀な社員の方やインターン生と関わることはとても刺激になりました。

プログラミングを始めたばかりの学生にもおすすめできるインターンです。
インターン生はほとんど[魔法のスプレッドシート](https://deep-professor-e3c.notion.site/049ca5329bbc4493bc9f4f5b3727d027?v=3b000340195242b0bd4b0741063ec259)や[ワンキャリア](https://www.onecareer.jp/)から応募していたらしいので、是非応募してみてください！

## アイフル採用サイト
* [全体採用サイト](https://aiful-recruit.com/)
* [エンジニア採用サイト](https://engineer.recruit.aiful.co.jp/recruit/)


![インターンシップ風景.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922066/2fb042fe-6fe0-dc19-ea7f-c6206d3c1139.png)
時差のある場所の時間差を計算するプログラムを作ってみた

# 時差のある場所の時間差を計算するプログラムを作ってみた

## はじめに

ある時刻からある時刻までの時間差、たとえば「午前8時から午後3時までは何時間？」というのを計算するのは簡単で、答えはもちろん7時間となります。ところがこれは同じ地域での話であって世界には時差があり「東京の午前10時からパリの午後4時までは何時間？」を計算するのはあまり簡単ではありません。

筆者はtzdiffというコマンド([Qiitaの記事](https://qiita.com/belgianbeer/items/962dfd394dbe287856c0)、[Githubのリポジトリ](https://github.com/belgianbeer/tzdiff))をメンテンナンスしているのですが、ある勉強会でtzdiffのバージョンアップについて説明したところ、こんなリクエストをもらいました。

「時差のある場所の時間差を知りたいんだけど、飛行機の移動時間とか」

確かに時差のある場所での時間差を求めるプログラムはあまり見たことが無いし、tzdiffのノウハウがあればすぐできそうだったので、実際に作ってみました。

## コマンドの内部処理

CLIで作るので、コマンドの引数をどう指定するかを最初に考えます。必要なパラメータは基準地点の時刻とタイムゾーン、対象地点の時刻とタイムゾーンなので、実際にコマンドを使うときに指定しやすいようにそのまま次の順番に指定できるようにしました。

1. 基準地点の時刻
1. 基準地点のタイムゾーン
1. 対象地点の時刻
1. 対象地点のタイムゾーン

内部の処理としては引数で与えられた時刻を一旦正規化します。例えば`10:30`が指定された場合内部では`%FT%R`の形式に変換して日付まで含んだものに変換します。

```
$ date -d 10:30 +%FT%R
2023-08-15T10:30
```

この文字列形式を、タイムゾーンを指定してUNIX 時間の秒に変換します。ここでは、東京とブリュッセルの時間差(同じ時刻なので時差)を計算してみます。

```
$ TZ=Asia/Tokyo date -d 2023-08-15T10:30 +%s
1692063000
$ TZ=Europe/Brussels date -d 2023-08-15T10:30 +%s
1692088200
```

最後に差を計算して、日時文字列の形にすれば完了です。

```
1692088200 - 1692063000 = 25200

25200 / 3600 = 7
```

東京とブリュッセルの時間差は7時間(夏時間)となります。

この例ではLinux環境では標準的なGNU dateコマンドを使っていますが、筆者は普段FreeBSDを使っているため、GNU dateコマンドを前提にはできません。GNU dateでは`-d`での指定する文字列を柔軟に処理してくれるのですが、FreeBSDなどのdateコマンドでは少し手間をかける必要があります。

## Traveltimeの利用例

コマンド名はtraveltimeとしました。以下はgithub.comへのリンクです。

https://github.com/belgianbeer/traveltime

以下にtraveltimeの利用例をいくつか並べてみました。

東京を16:00に出発してロサンゼルスに10:00に到着する飛行機の飛行時間は次のようになります。

```
$ traveltime 16:00 Asia/Tokyo 10:00 America/Los_Angeles
10:00   Tokyo -> Los_Angeles
```

[tzdiff](https://qiita.com/belgianbeer/items/962dfd394dbe287856c0)と同じように、タイムゾーン名にはコンプリーションが利用できます(というかtzdiffで作ったものをそのまま流用)。

```
$ traveltime 16:00 Tok 10:00 Los
10:00   Tokyo -> Los_Angeles
```

時刻は am/pm の形でも指定できます。

```
$ traveltime 4:00pm Tok 10:00am Los
10:00   Tokyo -> Los_Angeles
```

翌日以降になる場合は、`+1` や `+2` を指定します

```
$ traveltime 11:00 Los 16:00 Tok +1
13:00   Los_Angeles -> Tokyo
```

ただし翌日については`+1`が無くても正しい値になるよう処理しています。

```
$ traveltime 11:00 Los 16:00 Tok
13:00   Los_Angeles -> Tokyo
```

実はテストがまだ十分とは言い難いのですが、ここで例に使ったぐらいのパターンであれば問題無く動きます。

## おわりに

traveltimeで指定するのは都市名では無くあくまでもタイムゾーンです。例えばアメリカのシアトルやサンフランシスコを直接指定するタイムゾーン名は用意されておらず、タイムゾーン名としてはロサンゼルスを指定することになります。ある都市のタイムゾーン名がわからない場合にtraveltimeを使うのは少々難しいのかもしれません。
JavaScript 画像をモザイク化

WEBコンテンツ上でのモザイク化処理でよく利用されるcanvas要素を本処理でも使っていますが、自前でドットを再計算などはせず、

- オリジナル画像をそれよりも小さいcanvasへ表示
- 見かけ上元のサイズで表示

という簡易処理で済ませています。

```js:to_pixelated.js
'use strict';
const toPixelated = (imageElement, blockSize = 4) => {
  const img = imageElement;
  const size = {
    width: img.width / blockSize,
    height: img.height / blockSize,
  };
  const canvasElement = Object.assign(document.createElement('canvas'), size);
  canvasElement.getContext('2d').drawImage(img, 0, 0, ...Object.values(size));
  Object.assign(canvasElement.style, {
    width: `${img.width}px`,
    height: `${img.height}px`,
    imageRendering: 'pixelated',
  });
  return canvasElement;
};
```

#### 使用例 / [動作デモ](https://akebi.jp/temp/pixelated/index.html)

```html:index.html
<!DOCTYPE html>
<html lang='ja'>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='initial-scale=1'>
<style>
#container {
  position: relative;
}
#sample01, canvas {
  position: absolute;
  left: 0;
  top: 0;
}
#sample01 {
  max-width: 100%;
}
</style>
</head>
<body>
<input type='range' id='slider' min='1' max='100' value='20' disabled>
<div id='container'>
  <img src='sample.jpg' id='sample01'>
</div>
<script src='to_pixelated.js'></script>
<script>
'use strict';
const obj = {};
const slider = document.getElementById('slider');

const insertPixelated = () =>
  obj.sourceImage.insertAdjacentElement('afterend', obj.pixelated = toPixelated(obj.sourceImage, slider.value));

addEventListener('load', () => {
  obj.sourceImage = document.getElementById('sample01');
  insertPixelated();
  slider.disabled = false;
});

slider.addEventListener('input', () => {
  obj.pixelated.remove();
  insertPixelated();
});
</script>
</body>
</html>
```
seleniumで複数条件を使って待機する

seleniumを使ってスクレイピングをするとき、ページが読み込まれるまで処理を待機させることがある。

そのとき、ページによって表示される内容が異なっているときなどは、複数の条件を使って制御する。

## 複数の条件が同時に満たされるときまで待ってほしいとき

### 方法

all_ofを使う

https://www.selenium.dev/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html#selenium.webdriver.support.expected_conditions.all_of

### 具体例

``` wait_until_all.py
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(・・・)

wait.until(
    EC.all_of(
        EC.text_to_be_present_in_element((By.CLASS_NAME, "hoge"), "これが表示されるまで待つ"),
        EC.text_to_be_present_in_element((By.CLASS_NAME, "fuga"), "これも表示されるまで待つ")
    )
)
```
## 複数の条件が同時に満たされるときまで待ってほしい

### 方法

any_ofを使う

https://www.selenium.dev/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html#selenium.webdriver.support.expected_conditions.any_of

### 具体例

``` wait_until_any.py
wait.until(
    EC.any_of(
        EC.text_to_be_present_in_element((By.CLASS_NAME, "hoge"), "これが表示されるまで待つ"),
        EC.text_to_be_present_in_element((By.CLASS_NAME, "fuga"), "これが表示されてもいい")
    )
)
```



## 参考

https://www.selenium.dev/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html
サーバーレスの作成をより簡単に！大学生が体感したSAMの魅力

# はじめに
自分がインターンで参加している会社で最近AWSのSAMを触って、これに驚いたのでこの感動を伝えたいがためにこの記事を書こうと思います。
サーバーレスについて知っていることを前提に記事を書いていくため、サーバーレスについて知らない方は調べてみてください。

# 対象とする方
- AWSリソースを管理コンソールからしか使ったことがない方
- SAMを使ったことがない方

# そもそもSAMとはなんじゃろ？
SAMとは何かとは`Serverless Application Model`の略称のことです。[公式ドキュメント](https://aws.amazon.com/serverless/sam/)を見ると以下のような説明がされています。
>AWS Serverless Application Model（SAM）は、サーバーレスアプリケーションを構築するためのオープンソースのフレームワークだ。関数、API、データベース、イベントソースマッピングを表現する省略記法構文を提供する。リソースごとにわずか数行で、必要なアプリケーションを定義し、YAMLを使ってモデル化することができる。デプロイ時に、SAMはSAM構文をAWS CloudFormation構文に変換して展開するため、サーバーレスアプリケーションを迅速に構築できる。

と書かれています。つまり、サーバーレスアプリケーションを構築するときに使うと便利なわけです。

ですがここで以下の疑問が湧いてきました。「CloudFormationでサーバーレスアプリケーションは作成できるのに何故SAMが開発されたのか」と。

# 1. テンプレートの簡素化
まずSAMを使用することのメリットは文法が簡素化できるということです。以下に簡単なサーバーレスアプリケーションである、APIGatewayからトリガーされるLambda関数を作成します。

最初は素のCloudFormationで作成します。
```素のCloudFormation.yaml
Resources:
  MyLambdaFunction:
    Type: 'AWS::Lambda::Function'
    Properties:
      Handler: 'index.handler'
      Role: arn:aws:iam::123456789012:role/execution_role
      FunctionName: 'MyFunction'
      Code:
        S3Bucket: 'myBucket'
        S3Key: 'code/myLambda.zip'
      Runtime: 'nodejs14.x'
  MyApi:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Name: 'MyAPI'
      Description: 'My API'
      FailOnWarnings: 'true'
  RootMethod:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      AuthorizationType: 'NONE'
      HttpMethod: 'GET'
      ResourceId:
        Fn::GetAtt:
        - 'MyApi'
        - 'RootResourceId'
      RestApiId:
        Ref: 'MyApi'
      Integration:
        IntegrationHttpMethod: 'POST'
        Type: 'AWS_PROXY'
        Uri:
          Fn::Sub:
          - arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaArn}/invocations
          - LambdaArn: !GetAtt [MyLambdaFunction, Arn]
```
つぎにSAMを使用して作成します。
```sam.yaml
Resources:
  MyLambdaFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: 'index.handler'
      Role: arn:aws:iam::123456789012:role/execution_role
      CodeUri: s3://myBucket/code/myLambda.zip
      Runtime: 'nodejs14.x'
      Events:
        RootEndpoint:
          Type: Api
          Properties:
            Path: '/'
            Method: get
```
一目瞭然ですがSAMを使用すれば、簡素化された構文でサーバーレスアプリケーションを作成することができるんですね。だいぶすっきりしていて読みやすいですよね。

# 2. サーバーレスをローカルで実行したりデバッグができる
Lambdaを触ったことがある方ならわかるとおもいますが、Lambdaのデバッグってかなりめんどくないですか？Lambdaって１０MB以上になるとzipファイルをアップロードしないといけなくて、それを何回もやるのがかなり面倒くさいわけです。それを解消できるのがSAMなんですね。
Lambdaをローカルで実行できるのはかなり嬉しいですよね。
Lambdaをローカルで実行する方法は追々記事にしていこうとおもいます。

その他にもSAMのすごいことは盛りだくさんなので知っている方がいらっしゃいましたら教えてください！ 
【参考資料】

https://aws.amazon.com/serverless/sam/

https://github.com/aws/serverless-application-model
warning: range-based for loop is a C++11 extension [-Wc++11-extensions]のエラーに対して

## 背景
競プロに挑んでいる最中に題意のようなエラーに直面した。
```cpp:for.cpp
#include <iostream>
#include <vector>

int main(){
    int N;
    std::cin >> N;

    std::vector<int> numbers;
    for (int i = 0; i < N; ++i){
        int num;
        std::cin >> num;
        numbers.push_back(num);
    }

    for (int num : numbers){
        std::cout << num << " ";
    }

    return 0;
}
```


## 解決策
* C++11以降のバージョンのコンパイラを使用する
* 警告を無視する
* 通常のforループを使用する

### C++11以降のバージョンのコンパイラを使用する
C++11の機能がサポートされているコンパイラを使用することで、警告を回避することができます。

### 警告を無視する
コードの最初に以下のような行を追加して、警告を無視するように指示することができます。ただし、この方法は推奨されるものではありません。
```cpp
#pragma GCC diagnostic ignored "-Wc++11-extensions"
```

### 通常のforループを使用する
範囲ベースのforループの代わりに通常のforループを使用することで、警告を回避することができます。

以下は、通常のforループを使用した範囲ベースのforループの代替例です。

```cpp
#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVector = {1, 2, 3, 4, 5};

    std::cout << "ベクターの要素: ";
    for (size_t i = 0; i < myVector.size(); ++i) {
        int num = myVector[i];
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

```
TerraformでS3ゲートウェイ型VPCエンドポイントを導入した

最近、サービスインフラのセキュリティやコストを最適化する過程で、プライベートサブネットに配置されたアプリケーションからS3へのアクセス方法を見直しました。これまでのアクセスはインターネット（NAT Gateway)経由でしたが、ゲートウェイ型VPCエンドポイントを導入することで、より安全かつコスト効率的なプライベートアクセスを実現しました。

# ディレクトリ構成
Terraformのディレクトリ構成は、モジュール化された構造をとっており、それぞれの環境(dev, stg, prod)ごとに設定を分けています。
`modules`ディレクトリに、プロジェクトで使用されるTerraformのモジュール(VPCエンドポイント、ルートテーブルなど)を格納しています。

```lua
-- terraform-project/
   -- environments/
      -- dev/
         -- backend.tf
         -- main.tf
      -- stg/
         -- backend.tf
         -- main.tf
      -- prod/
         -- backend.tf
         -- main.tf
   -- modules/
      -- vpc_endpoint/
         -- main.tf
         -- variables.tf
         -- outputs.tf
         -- provider.tf
         -- README.md
      -- route_table/
         -- main.tf
         -- variables.tf
         -- outputs.tf
         -- provider.tf
         -- README.md
      -- ...other…
   -- docs/
      -- architecrture.drowio
      -- architecrture.png
```

# 実装

## エンドポイントの設定
まず、`modules/vpc_endpoint/main.tf`にVPCエンドポイントの設定を記述します。

```tf:modules/vpc_endpoint/main.tf
data "aws_ssm_parameter" "app_vpc_id" {
  name = "/vpc/id/app"
}

resource "aws_vpc_endpoint" "s3" {
  vpc_id            = data.aws_ssm_parameter.app_vpc_id.value
  service_name      = "com.amazonaws.ap-northeast-1.s3"
  route_table_ids   = [var.route_table_app_endpoint_id]
  vpc_endpoint_type = "Gateway"

  policy = <<POLICY
{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Action": "*",
      "Effect": "Allow",
      "Resource": "*",
      "Principal": "*"
    }
  ]
}
POLICY

  tags = {
    Name = "app-vpce-s3"
  }
}
```

- VPC IDの取得
`vpc_id`には、S3へのアクセス元となるアプリケーションが配置されているVPCのIDを指定します。今回はVPCのIDはSSMパラメータストアから取得しています。該当のVPCがTerraform導入以前に手動で作成されたものであるため、直接の変数としての管理ではなく、SSMからの取得を選択しました。

- ルートテーブルの指定
`route_table_ids`には、作成するVPCエンドポイントと関連付けるルートテーブルのIDを指定します。このルートテーブルはTerraformで既に管理下にあるため、変数を介してIDを読み込む形となります。

```tf:modules/vpc_endpoint/variables.tf
variable "route_table_app_endpoint_id" {
  description = "The ID of the route table"
  type        = string
}
```

- エンドポイントポリシー
エンドポイントポリシーは、エンドポイントを経由したS3へのアクセスを制御するためのツールです。ポリシーを使用して、特定のバケットや特定のアクションにのみアクセスを許可するなど、細かいアクセス制御を実施できます。

以下は、エンドポイントポリシーを使って特定のS3バケット(`my-allowed-bucket`)へのGETアクションのみを許可する例です。

```tf
policy = <<POLICY
{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Action": "s3:GetObject",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-allowed-bucket/*",
      "Principal": "*"
    },
    {
      "Action": "s3:*",
      "Effect": "Deny",
      "Resource": "arn:aws:s3:::my-allowed-bucket/*",
      "Principal": "*",
      "Condition": {
        "StringNotEquals": {
          "s3:action": "s3:GetObject"
        }
      }
    }
  ]
}
POLICY
```
`my-allowed-bucket`バケットに対する`s3:GetObject`アクションを許可しています。これにより、このバケット内のオブジェクトを読み取ることが可能です。また、同じバケットに対して、`s3:GetObject`アクション以外の全てのアクションを拒否しています。これにより、オブジェクトの追加や削除など、その他の操作はできません。

- タグ付け
タグ`Name = "app-vpce-s3"`は、リソースを管理する際の識別やフィルタリングのために役立ちます。特に大規模な環境や複数のエンドポイントを管理する場合には、適切な命名規則とタグ付けが重要となります。
これでNAT Gateway経由のコストやオーバーヘッドを回避しながら、プライベートなアクセス経路でS3に接続することができます。
【Java・学習ログ⑥】パッケージ（クラスファイルの分割）について 

教本に沿ってやってみたシリーズ、『第６章』です。

≪使用教材≫スッキリわかるJava入門　第3版　スッキリわかるシリーズ

## ソースファイルの分割

Javaでは⑤のように作成した複数のメソッドを、クラス別に仕分けることができる。
![スクリーンショット 2023-08-16 034357.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/f07e4efd-6cc7-a6f2-820f-1869889d2c94.png)
【実行】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/bddb7b67-a61f-6fc7-5146-7ce015f2b7bf.png)
* プログラム
分割したクラスファイルをまとめたフォルダ。

* パッケージ
分割したクラスファイルを分類、管理するしくみ。
分類、整理することのほか、複数人でプログラムの開発するにあたり、同じクラス名を取り合うという衝突を避けられるメリットがある。パッケージ名が異なれば１つのプロジェクト内で同じクラス名を使用することが可能だが、パッケージ名が被ってしまうとその前提が崩される。なので、あらかじめ誰がどのようなパッケージを使うか決めておくとよい。
（javaでは自分（自社）が保有するドメインを前後逆順にしたものから始まるパッケージ名を用いることを推奨している）

```java
packege.project6; //下記のCalcLogic.javaをパッケージ名「calcapp.main」に所属させる
public class CalcLogic { // クラス名「Calc.java」のファイルが出来上がる
int total = project6.CalcLogic.tasu(a,b); //パッケージ名、クラスを指定して呼び出し【FQCN】
```
* 完全限定クラス名（FQCN）

「パッケージ名を頭に付けたクラス名」のこと。このFQCNは**import文**を使うことで省略できる。
![スクリーンショット 2023-08-16 042144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/aab3bbc2-daee-fd06-f3f0-2ef7c684aa65.png)
![スクリーンショット 2023-08-16 042725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/5eb4134b-75ef-4ac3-8905-dca5eaa7e6fb.png)
なお、パッケージに属する全クラス呼び出したい場合は下記のように記述が可能。
```java
import project.other.CalcLogic.*;
```

* クラスローダー
javaコマンドにFQCNを用いて実行すると、JVM内部の『クラスローダー』という機構が作動する。
PC内からクラスファイルを検索し、JVMに読み込んで利用を可能にするものである。
膨大な容量のハードディスク内からの高速検索を実現するには**クラスパス**という情報が必要になる。
クラスパスを指定するには「起動時にjavaコマンドで指定」、「OS側で環境変数の設定」、「特に指定しない（実行フォルダをクラスパスにする）」という３つの手段がある。

* API（applecation Programming Interface）
Javaに初めから標準添付されているクラスの総称。これまで作成した１つのクラスはこれら数百個のクラスと連携して動いている。下記は代表的な例。

|  |  | 
| - | - | 
| java.lang | 重要なクラス群 |  
| java.util | プログラミングを便利にするクラス群|  
| java.math | 数学に関するクラス群 |  
| java.net | ネットワーク通信などを行うためのクラス群 |
| java.io | ファイル読み書きなどのデータ処理のためのクラス群 |    

**java.lang** パッケージは頻繁に利用するので、improt文を使用しなくても呼び出される特別仕様になっている。これまで画面表示に使っていた「System.out.println()」も一例である。

<br>
<br>
頭こんがらがってきました！

以上、雑備忘録◎
【小ネタ】sarコマンド入力後に出る「Cannot open /var/log/sysstat/saXX: No such file or directory Please check if data collecting is enabled」の解決策

# 事象
sysstatパッケージは既にインストール済みで、実行環境はUbuntu 22.04です。
sarコマンドでシステムの負荷状況を取ってみたかったのですが、取得できず。。。
実行結果は以下の通りです。

```shell
$ sar -r 2
Cannot open /var/log/sysstat/sa19: No such file or directory
Please check if data collecting is enabled
```

# 原因
sysstatのインストール後、データ収集を有効化していないのが原因でした。
`/etc/default/sysstat`の`ENABLED="false"`を`ENABLED="true"`にすればOKです。

```shell
$ cat /etc/default/sysstat
#
# Default settings for /etc/init.d/sysstat, /etc/cron.d/sysstat
# and /etc/cron.daily/sysstat files
#

# Should sadc collect system activity informations? Valid values
# are "true" and "false". Please do not put other values, they
# will be overwritten by debconf!
## 編集前
## ENABLED="false"
## 編集後
ENABLED="true"
```

manコマンドのユーザマニュアルには出てこなかったので、一次情報に当たりました。下記のURLをご参照ください。

https://github.com/sysstat/sysstat#install-from-ubuntu

編集後、無事にメモリとスワップ関連の情報を取得できました。

```shell
$ sar -r 2
Linux 5.15.90.1-microsoft-standard-WSL2 (XXXXXXXXXX)     08/19/23        _x86_64_        (8 CPU)

16:39:47    kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
16:39:49      3561608   6306896   1353720     16.94     51208   2869228   4130348     40.93    932480   3019192        16
16:39:51      3561108   6306396   1354216     16.94     51208   2869228   4130348     40.93    932480   3019556        16
16:39:53      3561108   6306396   1354208     16.94     51208   2869228   4130348     40.93    932480   3019284        16
^C
Average:      3561275   6306563   1354048     16.94     51208   2869228   4130348     40.93    932480   3019344        16
```

以上、備忘録でした！
Unityエラー


自分の備忘録用のメモ


### webgelのビルド時のエラー



https://zenn.dev/ohbashunsuke/articles/20201002003-trouble-unity-already-opened


https://dianxnao.com/unity%EF%BC%9Awebgl%E3%81%A7build%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%8C%E6%8A%BC%E3%81%9B%E3%81%AA%E3%81%84%E3%80%8Cin-order-to-build-a-playergo-to-player-settings-to-resolve-the-incompatibility/

s3などに挙げたときのWebGLの圧縮形式によるエラー

Unityの以下の設定を「Gzip」から「Disabled」に変更


https://51n1.uk/post/web-publishing-with-unity-webgl/page1.html
【AWS】セッションマネージャーからプライベートサブネットに接続する方法(NATGateway経由)

[前回](https://qiita.com/Yukimaru_Rutla/items/6325db36b7584b7d3730)は、
パブリックサブネットに配置したEC2インスタンスを踏み台サーバーとして
SSH接続で管理者がアクセスできるように設定しましたが、
今回はよりセキュアな方法として、セッションマネージャーでWebサーバーに
アクセスする方法を試していきたいと思います！

セッションマネージャーからアクセスする方法のメリットとして、
・パブリックサブネットにEC2インスタンスを配置する必要がない
⇒SSHのためにポート番号22を開ける必要がない
⇒EC2インスタンスの運用コストが削減できる
・キーペアの生成が不要
⇒ローカルPCの/.sshに秘密鍵を持つ必要がないため鍵の管理が不要
・AWSコンソールからアクセスできるため簡単
といったものがあります。
なんにせよパブリックサブネットにEC2インスタンスを置く方法は
できたら避けた方が安全とのことです。

前回作成したインフラの構成から修正していきます。
修正方針は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522793/e53030ea-5184-5c67-ac95-fb01f6348f3b.png)
図を見て分かるように、踏み台サーバーを利用してプライベートサブネット内の
Webサーバーにアクセスする方法と違い、パブリックサブネット内に
EC2インスタンスがないため直接インターネット上に晒されている
リソースがなくていい感じに見えます！

【手順の流れ】
①踏み台サーバーを削除する。
②プライベートサブネット内のEC2インスタンスにAmazonSSMManagedInstanceCore
　ポリシーを含むロールをアタッチする。

では、実際にやっていきます。

①踏み台サーバーを停止する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522793/7236d245-43c0-fcc2-ed52-d2d9cc802c60.png)
EC2 > インスタンスを選択し、前回踏み台サーバーとしていたインスタンスを停止する。
不要ならば削除でもいいですが一応止めておけば料金かからないので私は
停止して残しておきました。

②AmazonSSMManagedInstanceCoreポリシーを含むロールをアタッチする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522793/155655f7-4af8-a413-93f3-949ad53f1cd1.png)
IAM > ロール > ロールを作成ボタンを押下し、画像の通りにロールを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522793/c882c745-7a04-279d-5b4d-57876a215038.png)
ポリシーにAmazonSSMManagedInstanceCoreを選択し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522793/4bcb19e2-e0e5-8709-959d-4e25850a3e29.png)
「ロールを作成」ボタンを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522793/743c5b51-251e-a62f-550c-1e4e16e8d967.png)
EC2に戻り、プライベートサブネット内のWebサーバー2台に対して
「IAMロールを変更」から先ほど作成したロールをアタッチする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522793/cf6ac4cf-acdf-717b-382b-9ed08d6c72d0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522793/c73cee83-1544-35b2-f7bc-2a9d0a986219.png)
インスタンスの「接続」ボタンから「セッションマネージャー」タブをクリックし、
「接続」ボタンを押下すると以下の画面が表示され、インスタンス内へのアクセスが
できるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522793/787aeafd-68a1-84dd-fb77-2c2fcd11d855.png)
ちなみに接続を踏み台サーバー経由からセッションマネージャー経由に
変更するにあたって本当はキーペアが不要なので削除したかったのですが
既存のEC2インスタンスのキーペアを削除する方法がわからなかったので
Webサーバー2台はキーペアなしで作成し直し、
ロードバランサーのターゲットグループを新しいWebサーバーに変更しました。
あとでやり方調べておこう・・・
Nucleo F303K8 OPAMPを使ってみる w/STM32CubeIDE

# とにかく使ってみる

RM0316にあるPGAモード，内部ゲイン設定をテストします。VPだけ入力すればよく，ローサイドの電流検出に便利そうですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/1c9d0bc4-4a89-846e-698d-1e7310456302.png)

ここではDACから1Vを出し，固定ゲインで2倍にして2Vを得てみます。

iocで有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/b3a3cf9e-0ba0-c87b-66b0-c648a5fc22fe.png)

DAC1も有効にします。こちらは省略します。

```
PIN Arduino STM32
 6    A6     PA7 OPAMP2_VINP --+
 7    A5     PA6 OPAMP2_VOUT   |
 8    A2     PA5 DAC1_OUT2     |
 9    A3     PA4 DAC1_OUT1 ----+
...
```

DAC1_OUT1 を OPAMP2_VINPに接続します。Nucleoでは上記のように 6 - 9 ピンを接続します。

```main.c
  /* USER CODE BEGIN 2 */
  HAL_OPAMP_Start(&hopamp2);

#define V1R0 0xfff*10/33
  HAL_DAC_SetValue(&hdac1, DAC1_CHANNEL_1, DAC_ALIGN_12B_R, V1R0);
  HAL_DAC_Start(&hdac1, DAC1_CHANNEL_1);
  /* USER CODE END 2 */
```

あっけないほど簡単です。テスターで Nucleoの 6ピン (= 9ピン) に 1V 7ピンに2V出ていることを確認しました。

# OPAMP出力をADに接続する

RM0316によれば，ADC2 channel 3 と接続しているとのことですので，有効にしてADで読んでみます。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/343b64be-b944-936f-30eb-6a634e5f1050.png)

上のソースに追加です。

```main.c
  HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);

  HAL_ADC_Start(&hadc2);

  HAL_ADC_PollForConversion(&hadc2, HAL_MAX_DELAY);

  uint32_t raw_AD_value=HAL_ADC_GetValue(&hadc2);
  uint32_t convert_to_voltage=raw_AD_value * 3300 / 0xfff;
```

1991mV 約2Vが得られました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/8581fc60-70ab-2430-fb43-25d5a59986e3.png)
# Address already in use - bind(2) for "127.0.0.1" port 3000 (Errno::EADDRINUSE)の解消法


`rails s`コマンドを実行したところ、ローカルサーバーが起動できなくなった

## error内容
```
$ rails s
=> Booting Puma
=> Rails 7.0.6 application starting in development
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.6.6 (ruby 3.1.2-p20) ("Birdie's Version")
*  Min threads: 5
*  Max threads: 5
*  Environment: development
*          PID: 21844
Exiting
/Users/username/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/puma-5.6.6/lib/puma/binder.rb:341:in `initialize': Address already in use - bind(2) for "127.0.0.1" port 3000 (Errno::EADDRINUSE)
```
port 3000はすでに使用されているとのこと

## 解決策

オープンしているファイルを一覧表示する

```
lsof -i:3000
```
`lsof -i:3000`とすることでポート番号3000のみを対象にする


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536502/b4e7b692-bb5b-60b2-6b53-6b506ebdb236.png)


指定したプロセスIDのプロセスを終了させる
```
kill -9 18844
```
`kill -9 PID`とすることでプロセスIDを強制終了することができる


## 参考
[【 lsof 】コマンド――オープンしているファイルを一覧表示する](https://atmarkit.itmedia.co.jp/ait/articles/1904/18/news033.html)
[【kill】Linuxでプロセスを終了させるコマンド](https://uxmilk.jp/50638)
「第1章」初心者のJSP勉強記録！！！！！


Ⅰ．JSP処理過程
-------------------------------------------


![제목을-입력해주세요_-001 (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532853/4f187244-7bcb-d88a-d8db-ba24287c1e21.png)


#⃣　流れ
»　URLを入力すると
»　DNSサーバーでURLをIPアドレスに変更します。
»　ウェブブラウザはJSPページに要請（ポート8080番）
»　ウェブサーバーはJSP・サーブレットコンテナに要請すると
»　それをコンパイルしてサーブレットのロードします
　　（DBのデータを要請して処理するのもこの段階）
»　実行結果をウェブサーバーに、ウェブサーバーはこの結果を
　　PC/ウェブブラウザに送信します
»　HTMLタグー分析変更/仮面構成して！
»　ついに我々が要請した仮面がモニターに表示されます。



Ⅱ．JSPページディレクティブ
-------------------------------------------
・language ( default　⊳　java　⊲ )
»　JSPスクリプトコードに使用されるプログラミング言語を指定する。

-------------------------------------------
・contentType ( default　　⊳　text/html　⊲ )
»　JSPが生成する文書のタイプを指定する。

-------------------------------------------
・import
»　JSPページで使用するJAVA　Classを指定する。

-------------------------------------------
・session ( default　　⊳　true　⊲　）
»　JSPページがsessionを使用するかの可否を指定する。
ー　true　　：　sessionを使う
ー　false　：　sessionを使わない

-------------------------------------------
・buffer ( default　　⊳　最小８kb　⊲　）
»　JSPページの出力バッファーサイズを指定する。
ー　none　：　出力バッファーを使わない
ー　８kb　：　８kbサイズの出力バッファーを使う

-------------------------------------------
・autoFlush ( default　　⊳　true　⊲　）
»　出力バッファーがいっぱいになった場合、自動的にバッファーにあるデータを出力ストリームに送った後で、空けるかどうかの可否を示す。
ー　true　：　バッファーの内容をウェブブラウザに送った後、バッファーを空ける
ー　false　：　エラーを発生する

-------------------------------------------
・info
»　JSPページに対する説明を入力する。

-------------------------------------------
・errorPage
»　JSPページを行う途中にエラーが起こると、表示するページを指定する。

-------------------------------------------
・isErrorPage ( default　　⊳　false ⊲　）
»　現在のページがエラーが起こった時に表示されるページかを指定する。
ー　true　：　エラーページ
ー　false　：　エラーページではない

-------------------------------------------
・pageEncoding
»　JSPページ自体のキャラクターエンコーディングを指定する。
iosアプリで画像の表示を最適化するモディファイア

最適化したい画像に.resizable()と.scaledToFit()の２つのモディファイアを追加する。

.resizable()：利用可能なスペースを埋めるように自動的にサイズ調整する

.scaledToFit()：画像のアスペクト比を自動で調整する

```
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Image("gu")
                .resizable()
                .scaledToFit()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```
Kotlinで2のべき乗を計算するときにMath.pow(2.0, 3.0)と1 shl 3はどう違うのか？

今回は、Kotlinで2のべき乗を計算するときに、Math.pow(2.0, 3.0)と1 shl 3という二つの方法があることに気づいた方のために、それぞれの違いやメリット・デメリットを解説します。

### Math.pow(2.0, 3.0)とは？
Math.pow(2.0, 3.0)とは、2.0を3.0乗した値を求める関数です。Math.powは、Kotlin標準ライブラリではなく、Java標準ライブラリの一部です。Kotlinでは、Java標準ライブラリをそのまま使うことができます。

Math.powは、任意の実数のべき乗を計算できます。例えば、Math.pow(2.5, 1.5)というコードも可能です。この場合、約7.94という値が返されます。

Math.powはDouble型の値を返します。Double型とは、小数点以下の桁数が多い浮動小数点数を表す型です。Double型は、約15桁までの精度を持ちます。

### 1 shl 3とは？
1 shl 3とは、1を3ビット左にシフトした値を求める演算子です。shl演算子は、Kotlin標準ライブラリで定義されています。

shl演算子は、整数の2のべき乗を計算できます。例えば、1 shl 3は8になります。これは、1を左に3ビットシフトすることで、1000（2進数）になるからです。

shl演算子はInt型の値を返します。Int型とは、整数を表す型です。Int型は、-2147483648から2147483647までの範囲の値を持ちます。

### Math.pow(2.0, 3.0)と1 shl 3の違い
Math.pow(2.0, 3.0)と1 shl 3は、結果としては同じ値になりますが、計算の仕方が異なります。この違いは、以下の点で重要になります。

* 型: Math.pow(2.0, 3.0)はDouble型の値を返しますが、1 shl 3はInt型の値を返します。Kotlinでは、Double型とInt型は互換性がありません。したがって、Math.pow(2.0, 3.0)の結果をInt型にキャストする必要があります。例えば、Math.pow(2.0, 3.0).toInt()というコードです。一方、1 shl 3はそのままInt型の値として使えます。
* 速度: Math.pow(2.0, 3.0)は、指数関数の計算を行うために、複雑なアルゴリズムを使います。これは、時間がかかる可能性があります。一方、1 shl 3は、ビット単位でシフトするだけなので、非常に高速に動作します。ビット演算は、CPUのレベルでサポートされているためです。
* 汎用性: Math.pow(2.0, 3.0)は、任意の実数のべき乗を計算できます。一方、1 shl 3は、整数の2のべき乗を計算できるだけです。
### まとめ
Math.pow(2.0, 3.0)と1 shl 3は、Kotlinで2のべき乗を計算するときに使える二つの方法です。それぞれには、型や速度や汎用性という違いがあります。目的や状況に応じて、適切な方法を選ぶことが大切です。

以上、Bing AIにより記事をまとめました。
【PHP】お問い合わせフォームの簡単な作り方

※この記事では、セキュリティとバリデーションについては書いていません。今セキュリティとバリデーションの記事を書いているのででき次第URLをこの記事に貼り付けます。

最近こんなツイートをしました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">よくあるお問い合わせフォームは<br><br>1 - 入力<br>2 - 確認<br>3 - 完了<br><br>の３つの画面が良く見かけるお問い合わせだと思います。<br><br>以下を行えば簡単に実装できます。<br><br>1 - ファイル作成<br>2 - 入力画面でファイル編集<br>3 - 確認画面でonClickで[戻る]ボタン<br> 確認画面なので入力情報を持たせる<br>4 - 完了画面</p>&mdash; Tomoya (@div_tomo) <a href="https://twitter.com/div_tomo/status/1692220444705997085?ref_src=twsrc%5Etfw">August 17, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これだけだと実装内容があまりわからないと思うので詳細をこの記事で書きました。

お問い合わせフォームなどで良く見かける

> **入力・確認・完了**
> 

画面を作成していきます。

# 手順

## ファイルの作成

まずは [ **inquiryフォルダ ]** を作成してその中に [ **input.phpファイル ] [ confirm.phpファイル ] [ thanks.phpファイル ]** を作成してください。

```php
inquiry
  |--> input.php
       confirm.php
       thanks.php
```

## 入力画面 input.php

> input.php
> 

```php
<!DOCTYPE html>
<meta charset="utf-8">
<head></head>
<body>

<h1>お問い合わせ</h1>

<form method="POST" action="confirm.php">

    お名前
    <input type="text" name="name"><br>
    フリガナ
    <input type="text" name="kana"><br>
    メールアドレス
    <input type="email" name="email"><br>
    内容
    <textarea name="body"></textarea><br>

    <input type="submit" name="btn_confirm" value="確認する">

</form>

</body>
</html>
```

### ＜form method="POST" action="confirm.php"＞

`method="POST"` でPOST送信

`action="confirm.php"` で確認画面に遷移

### ＜input type="email" name="email"＞

`type=”email”` にすることでメールアドレスしか入力できないようになります。

### ＜input type="body" name="body"＞

`input type="body"` 内容を入力する際はbodyを利用しましょう。

### ＜input type="submit" name="btn_confirm" value="確認する"＞

`input type=”submit”` で確認ボタン作成

## 確認画面 confirm.php

> confirm.php
> 

```php
<!DOCTYPE html>
<meta charset="utf-8">
<head></head>
<body>

<h1>確認画面</h1>

<form method="POST" action="thanks.php">

    お名前
    <?php echo $_POST['name']; ?><br>
    フリガナ
    <?php echo $_POST['kana']; ?><br>
    メールアドレス
    <?php echo $_POST['email']; ?><br>
    内容
    <?php echo $_POST['body']; ?><br>

    <input type="button" value="戻る" onClick="history.back()">
    <input type="submit" name="btn_submit" value="送信する">

</form>

</body>
</html>
```

確認画面なので入力された値をそのまま表示させていきます。

### ＜?php echo $_POST['name']; ?＞

`<?php echo $_POST['name']; ?>` phpを使うときは `<?php 処理 ?>` でphpを使うことができます。

`echo $_POST['name'];` でPOST送信された `name(お名前)` を表示

### ＜?php echo $_POST['kana']; ?＞

`echo $_POST['kana'];` でPOST送信された `kana(フリガナ)` を表示

### ＜?php echo $_POST['email']; ?＞

`echo $_POST['email'];` でPOST送信された `email(メールアドレス)` を表示

### ＜?php echo $_POST['body']; ?＞

`echo $_POST['body'];` でPOST送信された `body(内容)` を表示

### JSで戻るボタン実装 ＜input type="button" value="戻る" onClick="history.back()"＞

`onClick="history.back()"` で前のページに値を残したまま戻る事ができます。

### ＜input type="submit" name="btn_submit" value="送信する"＞

`input type=”submit”` で送信ボタン作成

## 完了画面 thanks.php

> thanks.php
> 

```php
<!DOCTYPE html>
<meta charset="utf-8">
<head></head>
<body>

<h1>完了画面</h1>

<p>送信が完了しました。</p>

</body>
</html>
```

完了画面では単純に「送信完了しました。」のみ表示
仕立て(tailoring)と着付け(fitting)

作業改善、作業診断の形式的な利用による失敗を克服してきた経過を記録します。

 ＜この記事は書きかけです。順次追記します。＞
 This article is not completed. I will add some words in order.
# 仕立て(tailoring)と着付け(fitting)
https://researchmap.jp/blogs/blog_entries/view/78772/0e2095cb08e7517f50eacddc135a0a3e

XDDPが，どれくらい派生開発における仕立て(tailoring)と着付け(fitting)の課題に対応しているかを整理中です。

着付け(fitting)に関しては、清水吉男さんの助言、行動を拝見すれば，

ちいさいことからこつこつと
で記載したように，
1　現実をよく見ていること。
2　人の能力をよく見ていること。
3　何の役に立てるかを考えていること。
4　経験に基づいて話をすること。
5　分からないことは相手から聞こうとすること。
という能力があればよいことが分かります。

では，仕立てがどうなっているかを整理しようと思います。
整理した結果は2012/1/19名古屋でセミナ企画の中で紹介する予定です。

安全な製品作りのための自動車機能安全規格(ISO26262)適合 - 派生開発（XDDP）における適合方法

# 和裁（和装）と洋裁（洋装）
https://researchmap.jp/blogs/blog_entries/view/78772/95dd8bd37bdcb0a4ccb37b38c8f15a74

作業模型(process model)の仕立て(tailoring)という概念が，
なかなかうまく伝わらないので，和裁（和装）と洋裁（洋装）
の差で説明するようにしています。

洋服は，型紙を作ることがあります。
既製服では型紙をS, M, Lに展開することがあります。
注文服では，型紙と採寸した値にもとづいて，新しい型紙を作ることがあります。

その代わり、着る時には、時間や技術がなくても着ることができます。

和服は，着る時に着付けという専門性のいる作業があります。

着付け(fitting)に重点をおくか，仕立て(tailoring)に重点をおくか，
大量生産物であれば，仕立ての段階で対応するのがよいし，
少量生産の場合は，着付けの段階で対応してもよい。

自分が選択すればよく，他人に押し付けられる必要はない。

この話をしたら，日本科学技術連盟の方が，
風呂敷と鞄の対比で説明されました。

栄早朝会議では，
巾着袋の話題がでて，風呂敷、和服の話に展開しました。

# 関連文書(Related document)

Researchmapの接続状況
https://qiita.com/kaizen_nagoya/items/9cd9bda384ec0778d2b2

Researchmap 研究日誌(study diary) 記事一覧
https://qiita.com/kaizen_nagoya/items/0d2881f9e22913840d11

リンク切れをどう直したらいいか途方に暮れている。　
https://qiita.com/kaizen_nagoya/items/4b2495af5612d1e8bac2


## 自己参照

LACE研究会
https://qiita.com/kaizen_nagoya/items/d2d2155c680ec485b62f

XDDPへの道
https://qiita.com/kaizen_nagoya/items/ce2f26dcb77c9aedc33e

仕立て(tailoring)と着付け(fitting)
https://qiita.com/kaizen_nagoya/items/dbe96cad116008067e01

情報技術，電気通信の試験研究機関の業務に関連する条約、法律（改版）
https://qiita.com/kaizen_nagoya/items/9b3546f6ca1238467cfc
 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong. 

# 文書履歴(document history)
ver. 0.01 初稿　　20230819

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.