OmniAICreator/Qiita-1.07M huggingface dataset:
CSサークルで活動して一年が経ったよというお話


この記事は海洋大技術系サークル Advent Calendar 2023の19日目です。

## はじめに
こんにちは！海洋大のCS(コンピューターサイエンス)サークルで活動をしている大学3年生のFJ2123です。
私は大学2年生の春に、学内のCSサークル「NePP(ネップ)」に所属し活動を行ってきました。とは言っても、活動が本格的に始まったのは去年の秋ごろ、つまり活動歴としては1年ちょっと、という感じです。
今回はこの約１年間、自分がサークルに所属してどのような活動をしてきたのか、ざっくりとまとめていきたいと思います。

## 2年4月　サークル加入
コロナ禍も明け始め、対面での授業が再開された去年の春。今はなきTwitterでNePPの新入生募集を見たことがきっかけとなり、加入を決めました。
また、自分は大学生のうちにプログラミングをしたいな〜という思いで海洋大に進学を決めたのですが、サークルでプログラミングをみんなでやれるのが素敵だなと考えたことも理由の一つです。
結果的に自分の同期(当時の2年生)が1人もいないまま、サークルに加わることになります。

**↓きっかけになったツイート**
![IMG_6485.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194385/bb81cf52-2755-6203-78ce-e45e08d05619.jpeg)

## 2年5月　活動頻度低下(?)
新体制として、当時3年生だった先輩方がメインとなり運営をしていたのですが、就活中の先輩と自分たち後輩との予定がなかなか合わず活動がほぼ行われなくなってしまいました。
当の自分は、学科でも屈指の難度を誇るプログラミングの授業の課題で精一杯の状況でした、、、

## 2年9月〜11月　活動本格化(?)、Reactドキュメント輪読会
大学の前期の授業が終わった秋頃、ついにサークルが再始動し始めました。先輩方がサークルに求めていることややってみたいことについてヒアリングをしてくださり、まずは簡単なWebアプリを作ろうという目標のもと、Streamlitというフレームワークを利用した犬猫分析アプリを作りました。

**作ったアプリ**
https://fujiken0705-dogs-or-cats-dogs-or-cats-test-5b52qp.streamlit.app/

その後、Webアプリからフロントエンドに興味をもち、サークル内でReactの公式ドキュメントの輪読会を行いました。
ただ、当時プログラミング学びたての私は、そもそもReact以前のJavaScriptの知識が足りておらず、何がなんだかわからないままサークル活動を続けていってしまっていました。

## 2年11月末〜 iOSアプリ開発開始
サークルで集まっていたある日、先輩から外部のインターンシップに参加してみては？というアドバイスを受けました。
そこで紹介されたのは、株式会社サイバーエージェントの育成型インターンシップ『CA Tech Dojo』でした。自分としても、Web開発は初学者のうちに覚えることが多く、当時はなかなかモチベが保ちづらかったのですが、iOSアプリ開発は、ちょっと作業するだけで、なかなかいい感じのアプリが作れるのでモチベーション高く開発を継続させることができました。また、インターンシップ参加にあたり、はじめてエントリーシート(ES)を書きました。最初は何を書いていいかわからず、先輩方に何度もアドバイスをいただきました。(その節は大変お世話になりました！！)

## 2年2月〜3月　Tech Dojo参加
無事に合格し、インターンに参加しました！
インターンの様子は以下の記事にまとめているのでよければ見てみてください！
https://qiita.com/FJ2123/items/312b0393af41dc4698b6

## 3年4月〜現在　新入生加入、サークルの運営ポジションに
なんだかんだで、サークル加入から1年が経ち、自身も3年生としてサークルの運営に関わるようになりました。
SNSで新入部員を集め、新歓を行った結果、今年度はメンバーが10人強と急拡大をすることができました！(去年の2倍以上)

その後のサークルでの活動と自分の成長は以下の通りです！

### サークル
- 新入生向けのPython・GitHub講習会
- サークルでのハッカソン参加
- 週2、3回の進捗確認
- AtCorder
- アドベントカレンダー(この記事もその一つです)

### 自分の成長
- 長期インターンシップ参加(今年5月〜)
- サマーインターンシップ参加2社
- 自作アプリのリリース

## 終わりに
振り返ってみると、1年でエンジニアとしての実務経験を積めるようになったことはもちろん、サークルの運営など色々なことを経験できたなと感じます。
自分はおそらく来年も所属しているはずなので、後輩に学んだきたことを継承していけるような環境を作っていきたいなと考えています。
【初学者】SpringBootについて思ったことをちょっと整理

# はじめに
SpringBootを約1か月学習し、初学者のときはわかっていなかったポイントを
かなり、初学者目線で噛み砕いて整理。

習得者の方から見たら、何を当たり前のことを・・・。という内容かも。

そしてこれらは実務レベルではなく、学習レベルでのお話というところ。きっと実務はもっとややこしい。

自身の考えを言語化して、次のステップの注力するポイントを精査していくことが目的。

# 「Model」「View」「Controller」は役割の話
自分はRuby on Railsを少しやっていて、MVCモデルについて学習をしていた。
そのうえでのイメージ「Model」「View」「Controller」は役割の話であり
<font color=red>ファイル名の話ではないということ。</font>

役割がわかりやすいように、
ファイル名に「ItemController」のようにつける場合などもあるからさらにややこしい。

Ruby on Railsの学習では、
Modelには「Model」という名前がついており、Viewには「View」という名前がついていた。なので、SpringBootの学習を始めたときに、困惑した。

# 処理はいくつかのファイル(クラス)に分ける
ロジックは単純に1つのファイルでは完結していないということ

コントローラークラスはサービスクラスを呼び出す
サービスクラスはマッパークラスを呼び出す
マッパークラスはデータベースを呼び出す

どれだけ簡単なロジックだったとしても、処理が様々なステップがあるということ。
1つのクラスの中ですべての処理は完結できない。

# 作成したクラスを型として使える
これが本当に厄介かつ分かりにくい。正直まだこれを書いてる私も、4割くらいしか理解してない。
だって初学者学習では、変数の前には`int id`のようにデータ型を置くように言われてて
急に`Item item`とか出てきても、`Item`ってデータ型なの？ってなるやろ！！！！

これは<font color=red>Itemクラスに定義しているメンバー変数を扱うよ</font>という理解でOKだと思われる。



# どれがどこの変数かわかりにくい
初学者に対しての学習だけでいいので、クラス間での変数の表記を分けてほしい。

例えば
```java:controller
	@GetMapping("/todos/{id}")
	ToDo getToDo(@PathVariable int id) {
		return toDoService.getToDo(id);
	}
```

```java:service
	public ToDo getToDo(int id){
		return mapper.getToDo(id);
	}
```

```java:Mapper
    ToDo getToDo(int id);
```
```xml:Mapper.xml
    <select id="getToDo" resultType="com.example.springboot_todo2.model.ToDo">
        select * from todo where id = #{id}
    </select>
```

`getToDo`はそれぞれのクラスで定義してるので、クラスごとで変えてもOK。
変えるのが良いではなく、変えてもOKという認識を持ってることが大切な気がする。


例えば
```java:controller メソッド名をあえて変更
	@GetMapping("/todos/{id}")
	ToDo getToDo(@PathVariable int id) {
		return toDoService.getToDoo(id);
	}
```

```java:service メソッド名をあえて変更
	public ToDo getToDoo(int id){
		return mapper.getToDooo(id);
	}
```

```java:Mapper メソッド名をあえて変更
    ToDo getToDooo(int id);
```
```xml:Mapper.xml メソッド名をあえて変更
    <select id="getToDooo" resultType="com.example.springboot_todo2.model.ToDo">
        select * from todo where id = #{id}
    </select>
```

こんなかんじね。

ただ実務的には、メソッドがそれはそれはたくさん存在するので
<font color=red>メソッド名を統一して管理を容易にするのがセオリー</font>

ただロジックを理解しておくことは大切だと私は思う。

# セオリーはあるが正解がない
ぶっちゃけ、同じ結果を出力するための方法はかなりいろいろある。
SQL文を記述する方法も1つじゃないし、変数名の設定にはもちろん正解はない。
いろんな手法は知っておいたほうがいいよねって思う。

つまり、何を言いたいかというと、経験者のいうことっていうのは
経験則であって、<font color=red>重要なのは手法ではなく、そのコードを書く理由であるということ。</font>
経験則を訳も分からずなぞるっていうのはあんまり意味がない。
だって全く同じコードのサービスはないから。

経験者から教えてもらうときは理由をしっかりと深堀して理解していきたい。

# 理解があいまいだった言葉をふんわりまとめる

### オブジェクト
もの、実データ

### メンバー変数
クラスの中に定義されていて、実データを格納するための箱のようなイメージ。　
インスタンス変数、フィールド、データメンバーとかいろんな呼び方があるらしい。

### カプセル化
privateでメンバー変数を管理する方法のようなイメージ
モデルクラスで使う

### Getter Setter
カプセル化されているデータを取り扱う手法
Getterがカプセル化されているメンバー変数を閲覧する場合に使う。
Setterがカプセル化されているメンバー変数を編集する場合に使う。

### mybatis
データベースとかSQL周りの便利機能が使えるプラグインのようなもの。
@Mapperとか使えるようになるやつ。
yukicoder No.1131 Deviation Score 解説

# 前置き
皆さん、こんにちは！
今回はyukicoder No.1131「Deviation Score」について解説していきたいと思います！
（https://yukicoder.me/problems/no/1131)


# 目次
- 問題概要
- 制約
- 入力形式
- 解説



# 問題概要
$N$人の生徒がいて、みんなテストを受けた。
全員分の標準偏差を算出して出力してください。


# 制約
$1 \leq N \leq 10^5$
$0 \leq x_i \leq 100$

# 入力形式
```text:input.txt
N 
x_1 x_2 …… x_N
```

# 解説
本問で言及されている標準偏差 $ 50- \frac{(A-x_i)}{2}$をミスなく実装するようにすれば正答を導くことができます。
手順としては下記のとおりです。
- 入力を受け取る
- 各生徒毎に標準偏差を計算し、リストに格納していく
- 最後に`print`で出力

:::note
`print(*ans)`のように、リストを格納している変数の前に`*`をつけるとリストの要素のみを出力することができ、とても便利です。
今回は`sep='\n'`とすることで改行区切りで出力しています。
（sepに何も指定しなければ半角スペース区切り）
:::

```Python:1131 Deviation Score.py
# input
N = int(input())
points = list(map(int,input().split()))
point_mean = sum(points)/N
ans_list = []

# Calculation
for i in range(N):
    ans_list.append(int(50 - (point_mean - points[i]) / 2))

# Output
print(*ans_list,sep='\n')
```
[提出コード](https://yukicoder.me/submissions/939183)
run_callbacks に翻弄された話

## これは何
Active Record のコールバックに関するテストのレビューをお願いされた時に、見慣れないメソッド にやや翻弄された話をまとめました。



## きっかけとなったテストコード

Userモデルに定義してある、`after_create_commit_test`　メソッドがレコード生成時に正しく呼ばれているかをテストするために作られたものです。


```ruby
describe '.create' do
  subject { user.save! }

  let(:user) { FactoryBot.create('user') }

  before do
    allow(user).to receive(:after_create_commit_test)
    user.run_callbacks(:commit)
  end

  it 'calls after_create_commit_test' do
    subject
    expect(user).to have_received(:after_create_commit_test)
  end
end
```

※`FactoryBot` は テストデータの作成をサポートしてくれるライブラリです。

```ruby
class User < ApplicationRecord    
  after_create_commit :after_create_commit_test
    
  def after_create_commit_test
    # NOP
  end
end
```

`after_create_commit` は Active Record のコールバックで、レコードが生成されてかつトランザクションが完了したら呼ばれるメソッドです。




## 見慣れないメソッド　
- `run_callbacks`
    - 指定されたイベントのコールバックを実行します。

なんとなくは想像できてはいたけど、思った通りだった。


でも、レコードを作成したら自動的に呼ばれるのがコールバックなんだから強制的に呼んでもテストとして担保できないのでは？


### 試しに `run_callbacks` を消してみた。


```shell
expected: 1 time with any arguments
received: 0 times with any arguments

1 example, 1 failure
```

`after_create_commit_test` が呼ばれていないと失敗する。

まだ納得いっていないので、もう少し調べてみるとこんな記事を見つけた。

https://qiita.com/ogawatti/items/3ab6a86b9c881840fbb1
https://qiita.com/takeyuweb/items/e7261e9274b3b31d933c

>通常、テスト中のデータベース操作はトランザクション内で行われ、コミットされません。

なるほど。
つまりテストでは、`after_create_commit` そもそも呼ばれない仕組みになっており、
設定項目(`use_transactional_fixtures`)を false にすることで解決できるらしい。

これで謎が解けたと思ったが、、、、、、、、、そもそもの設定が false でした。


```ruby
RSpec.configure do |config|
  config.use_transactional_fixtures = false
  ...
end
```


## 原因

割と長い時間色々試行錯誤していましたが、結局の原因は `FactoryBot.create('user')` で、userが呼ばれた時点ですぐにレコードができてしまっており、`receive(:after_create_commit_test)` が機能していませんでした。


```ruby
# インスタンス生成だけする
user = FactoryBot.build(:user)

# インスタンス生成と同時にレコードに保存する
user = FactoryBot.create(:user)
```

FactoryBotの上記の仕様は知っていましたが、`run_callbacks`に気を取られすぎて、完全に見落としておりました。

```ruby
describe '.create' do
  subject { user.save! }

  let(:user) { FactoryBot.build('user') }

  before do
    allow(user).to receive(:after_create_commit_test)
  end

  it 'calls after_create_commit_test' do
    subject
    expect(user).to have_received(:after_create_commit_test)
  end
end
```
【UiPath】ダウンロードを待機アクテビティの注意点

## はじめに
Chromeからダウンロードしたファイルをアクテビティで開こうとしたら、データがなんかおかしい・・
そんなときに使うテクニックです。
## 実践
Chromeからファイルをダウンロードした際に、一時ファイルとして、「.tmp」だったり、「.crdownload」が作成されます。
UiPathとしては、監視対象のフォルダーに新しく何かファイルが作成されたら、次のアクテビティへ行ってしまう動きをするので、ダウンロードの完了を待ってくれません！:frowning2:
なので対策として「次の拡張子の一時ファイルを無視」のプロパティに「tmp,crdownload」を指定してあげましょう。
そうすると目的のファイルがダウンロードされるまでは、このアクテビティはダウンロードの完了を待ってくれます。
![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/8f38e99e-bed2-d829-c655-bf43533ac42b.png)

ではまた～
IBM i駆け出し日記：ZLIB機能を使う

# ZLIB機能とは
IBM i 7.4 TR7とIBM i 7.5から搭載された新機能で、SAV/RST用の最新の圧縮アルゴリズムです。
圧縮してデータをより効率的にバックアップできるようになっています。

またPower10 システムでは、プロセッサーの Nest Accelerator (NX) GZIP を使用しており、より高速でCPUへの負荷が少ない状態で圧縮がかけられます。

さらにIBM iはOS組み込みでZLIBが使用できるのも大きな特徴です。

圧縮対象は保管ファイル/テープ装置/仮想テープ装置、この3つです。

## ZLIBオプションが使えるコマンド一覧
- SAVSAVCFG
- SAVCHGOBJ
- SAVDLO
- SAVLIB
- SAVLICPGM
- SAVOBJ
- SAVSECDTA
- SAVSYS
- SAVSYSINF

##  使用するために必要なPTF
- IBM i 7.5：PTF MF70497、PTF SI81754、
- IBM i 7.4：PTF MF70498、PTF SI81755、PTF SI81756

# 実際に使用してみる
## 使用方法
ZLIBオプションを使用するためには任意のコマンド(今回はSAVLIB)を入力し、F10キーで追加キーを表示しスクロールで次ページを出します。

このデータ圧縮というところです。
![png 2023-12-19 15.40.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/da609fc0-6eea-36d9-be1c-a647eb704f87.png)
オプションで*ZLIBを選択することによってZLIBで圧縮ができます。
![png 2023-12-19 15.40.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/41b3e252-b9e1-532f-dbff-d6bc6b6c5b8f.png)

## 検証
### 検証条件
今回の検証は以下の条件で行いました。

- 使用機器
S1014(9105-41B)/ 6.4TB NVMe*2本
- LPAR情報
OS：IBM i V7R4
CPU：1 core
メモリ：100 GB
ディスク：ミラーリング時 6.4TB/ミラーリング解除時 12.8TB
バックアップ対象：仮想テープ装置

### 検証結果

|  | データサイズ| バックアップ時間 | 圧縮率|
| :------: | :---------| :------------------ | :---------|
| 通常時 | 3800GB  | 50分 | -
| ZLIB使用時 | 719GB| 2時間46分 | 19%

## 考察
今回の検証では特に圧縮率は19%と高い数値を記録し、元のデータサイズから1/4以下に圧縮することができました。
このように高い圧縮率でデータを圧縮できるZLIB機能は特に**PowerVSにおけるディスク容量の節約**に活きてくるのではないか、と個人的には期待してます。
AccessでSQLによるカラム追加

# やり方

SQL実行前が下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/96931887-f800-a0c2-5c85-2af0587699c7.png)

```sql:テーブルにカラム追加SQL
ALTER TABLE t_1 
ADD COLUMN 
text_column_1 TEXT(255), 
memo_column_1 MEMO,
yesno_column_1 YESNO,
date_column_1 DATE,
int_column_1 INT,
auto_column_1 COUNTER PRIMARY KEY
```

SQL実行後。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8e0e139f-7f77-3bd8-2761-58cb3fc713cd.png)

# AccessはSQLでカラム追加時にカラム位置の指定はできない

調べたのですが ```AFTER``` みたいな句を使って、『〇〇という名前のカラムの後に追加』はできないようです。

# Accessは既存カラムの位置変更をSQL経由ではできない

追加後に並べ替えるということもできないようでした…。

# 参考サイトさん

https://learn.microsoft.com/ja-jp/office/vba/access/concepts/structured-query-language/modify-a-table-s-design-using-access-sql

https://stackoverflow.com/questions/24238068/access-sql-alter-column-to-autonumber

# バージョン

Microsoft Windows [Version 10.0.19045.3803]
Microsoft Access for Microsoft 365 MSO (バージョン 2311 ビルド 16.0.17029.20108) 32 ビット
【UiPath】ファイルを書き込む際のパスの指定テクニック

## はじめに

・作業した結果のファイルを出力したいけど、C：～～から始まる自分の絶対パスの指定方法がわからない！という方向けのテクニックを紹介します。

## 実践
詳細エディターで
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) 
と宣言すると、「C:\Users\xxxx\」まで取得できます。xxxxは自分のwindowsのログインユーザ名が入ります。
なので、ユーザ名以下のフォルダを、指定してあげると、保存したいファイルパスの完成です。
![キャプチャ (1).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/5992851d-704e-2f53-d517-2889cd9aafe3.png)

じぶんは作業結果等のデータテーブルをCSVに書き込むことが多いので、
作ったファイル名を「CSVに書き込み」アクテビティで使用します。

![キャプチャ (2).PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/61ca22cb-a613-6704-4c92-7735e06ba35d.png)

他のテクニックとしては、作業用に読み込んだCSVファイルと同じフォルダに吐き出したい場合は以下にします。
「作業してたファイル.Folder + "\つけたいなまえ.csv"」
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/1386c345-a777-e273-1bf3-bf1ec57d1ddd.png)

「.Folder」メソッドで格納パスを取得できるので便利ですねー。こっちのほうが直感的でわかりやすいかも。

ではまた～
gem 'debug'ではスコープ内の変数を優先して参照する

最近プロダクトコードの調査をしていたとき、'debug' gemについて理解していなくて戸惑ったので残しておこうと思います。

### ことの発端
こんな感じのコードを調査中に見かけました。
同名のローカル変数とプライベートメソッドが定義されています。
レコード取得の条件に大きな違いはなさそうで、なぜメソッドのbarを使わないのか意図が分からずにデバッガを挟みました。
```ruby
class HogesController < ApplicationController
  def show
    # debuggerをここに入れた
    bar = Bar.where(...)
  end

  private

  def bar
    @bar ||= Bar.where(...)
  end
end
```

上記の位置で`bar`を実行すると、プライベートメソッドの値が確認できると期待していたのですが、実際に返ってきたのはnilでした。
```ruby
(rdbg) bar
nil
(rdbg) self.bar
[#<Bar: 0x0000ffff8ae36d38 ...>, ...]
(rdbg) @bar
[#<Bar: 0x0000ffff8ae36d38 ...>, ...]
```

### メソッドが参照できなかった理由
デバッガがスコープを理解しているため、スコープ内で定義したローカル変数`bar`を見つけ、優先してその値を返します。
まだ評価されていないローカル変数でもスコープ内であれば参照できるため、ここではnilが返ってきました。
スコープ内で定義される変数などは`i`/`info`で確認ができます。
```ruby
(rdbg) info    # command
%self = #<HogesController:0x0000ffff8b81a318>
bar = nil
```
ローカル変数を確認したい場合は`i l` or `i locals` or `i local_variables`
インスタンス変数を確認したい場合は`i i` or `i ivars` or `i instance_variables`
で確認できます。
<br>
意図しない値が返ってきたら
- `defined?(bar)`で実行しているものが何者かを確認する
- `info`コマンドでスコープ内の変数などを確認する

ことを学んだ出来事でした。

### 参考
https://github.com/ruby/debug
[19日目] X（旧Twitter）のポストをRSSで取得したい

こんにちは、なりかくんと申します。
この記事はなりかくん Advent Calender 2023の19日目の記事です。

今日は、X（旧Twitter）のポストをRSSで取得したいということで非公式APIを紹介します。

# Nitterを使う
Xの非公式クライアントである、「Nitter」を使います。
Nitterは、オープンソースプロジェクトでGitHubにコードが公開されています。

https://github.com/zedeus/nitter

NitterにはRSS機能があります。ですが、公式のNitterインスタンスにはRSS機能が利用できないので非公式Nitterインスタンスを使います。

インスタンス一覧は、以下のページに公開されています。
https://github.com/zedeus/nitter/wiki/Instances

https://github.com/zedeus/nitter/wiki/Instances

日本国内で使えるインスタンスは、「UNI-SONIA」さんのインスタンスのみだと思われます。
https://nitter.uni-sonia.com/

# RSSの取得
NitterのURL形式は、https://<instance url>/<userName>が基本です。
アクセスすると、通常ではユーザープロフィールとタイムラインが表示されます。
https://nitter.uni-sonia.com/narikakun

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549951/427c4c6d-d5e6-c997-3bda-aa41e6381675.png)

このURLの後ろに/rssとつけるとRSSにアクセスすることが出来ます。
https://nitter.uni-sonia.com/narikakun/rss

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549951/b017a34b-07cc-a968-1a0b-d708fd2350f4.png)

# 最後に
Nitterを活用して、私はDiscord上で使える「X Embed」というものを作成しました。

https://narikakun.net/introduction/discord-x-embed/

以上です。最後までお読みいただきありがとうございました。
先輩。僕最近、開発部の机を反時計回りにフラフラしているんですけど、正直どう思ってます？

# はじめに

「自分が優秀だから会社で余裕や！」と思う人は読まないでください。本記事は、新卒でエンジニアになったが、特に技術力が高いわけではない人向けに書いています。ただし、前提としてエンジニアになるので **「技術力をあげる」** ことは言うまでもありません。エンジニアである限り、ある程度の技術力や基礎知識は持ち合わせていないと2年目以降、終わります。技術力や基礎力はあげつつもプラスアルファで新卒として会社でいかに活躍し、成長するかを新卒のエンジニアが感じたことを書いてみます。



# 前提：新卒というラベルはめっちゃ強い
新卒であることは、企業にとって大きな価値を持ちます。新卒に異常に過保護な会社もあるくらいです。特に新しいアイデアや最新の知識が求められるエンジニアリングの分野では、新卒者は新鮮な視点とポテンシャルをもたらす貴重な資源となります。このセクションでは、新卒としての特権とその戦略的利用方法について掘り下げていきます。

## 【前提1】会社にとっての新卒の価値でしかない。
新卒者は、会社の文化やプロセスにまだ染まっていないため、新しい考え方やイノベーションをもたらす可能性があります。また新人だからこそ、気づけることは多いです。例えば、
- 研修の時にこんなものがあったらよかった...
- 自分は教育してくれる先輩はこんなのが理想にだな...(先輩が良くも悪くも感じます)
- 研究で似たようなことをやって、その時にはこう解決した

この気づきは会社にとって宝です。アイデアの宝庫となっているあなたが発信したり、行動したりすることで次の新卒や同期にもいい刺激があり、さらに自分の成長できるチャンスとなるはずです。ただのチャンスです。行動しましょう。

では、実際に筆者は何をしたのかと言えば、、、
- **新卒用の資料作成をした**
ベンチャーなので教育リソースがそこまで多くないため、新卒視点での初学者用の教育リソースを作り出した。結果的に、エンジニアではあるが、マーケティングや事業開発部の人とも一緒に仕事をするようになった。
- **規約を作った**
コード規約などドキュメントは正直、つまらないかもしれませんが、メインで動かすコードの整理やテストコードなどの動かし方など、根本的な構造や文法の勉強につながった。
- **新規事業立ち上げメンバーを新卒で作った**
新卒が元気な会社はものすごく強いです。そんな会社ではないところに、他部署の新卒や新卒出身のメンバーで週一で集まり、社長に社内企業または子会社としてお金を出させるためのグループを作っています。これは特段、難しいことではありません。立ち上げてからが問題ですが、先輩との交流する機会にもなります。


### 【前提2】上司や経営層の視点からはまじで嬉しい。
経営層や上司は、新卒を会社の長期的な成長と繁栄の鍵と見なす傾向があります。そのため、新卒の意見や提案には重みがあり、それを積極的に表現することで、会社の方向性に影響を与えることも可能です。上記の僕自身の経験の「**新規事業立ち上げメンバーを新卒で作った**」というところにも繋がりますが、意外とこの動きに対して、経営者層（取締役層）は着眼しています。もしかしたら投資してもらえるかもしれません。動きさえすれば、ここまでのことを新卒でもできるんです。むしろ新卒だからこそ、そういった動きは喜ばれます。

懸念点としては先輩がそういったことを嫌がるかもしれません。大切に育てたいがために、シングルタスクにしたいとかそこまで実力があるように思わず、「まずは目先の仕事をやれ」と言われかねません。それはそれで一理です。でも、もし頑張りたいなら、目先の仕事もしっかりとこなしつつ積極的に行きましょう。

### 【前提3】自分の意見を伝える機会と方法を作り出すこと。
新卒としての立場を最大限に活用するためには、自分の意見をはっきりと、しかし尊敬と謙虚さを持って伝えることが重要です。意見を述べる際には、それが会社やチームの目標にどのように貢献するかを明確にすると、より受け入れられやすくなります。これで苦い顔や省くようなことをする上司がいるなら、そんな上司の下から逃げた方がましです。


新卒としての立場は、一過性のものですが、この初期段階での行動や意見は、将来のキャリアに大きな影響を与える可能性があります。この貴重な時期を最大限に活かし、自身のキャリアと会社の未来のために貢献することが重要です。


# オフィスをフラフラするのうざい？
うざいわけではないようです。先輩も忙しいわけですし、自分だけが構う役になるのはきつい時があります。そのとき、普段から別の先輩とかともコミュニケーションをとっていれば、その先輩に聞きにいってもらえたり、開発している部分によっては、別の人に聞きにいってもらいやすいからだそうです。

また新卒がコミュニケーションの中にいることは全体としての雰囲気も柔らかくなり、よいことだよね。と言われました。

部長にもどうなのか聞いてみたら、技術力はまだまだだけど、その代わりのコミュニケーションコストをあえて払うことは、今後、会社にいる限り大事なことだから逆に続けてみてほしい。とも言われました。。

先輩も部長も優しいですね笑

ただ、仕事はしてね。と言われましたが、今のところ、障害も起こさず、納期も間に合ってるので許されてます！（顧客影響が出る範囲だけでもリリース自体は10本以上を半年でしているので、別に少ないわけでもなさそげです。）



# 最近、グミ配りしてみた

結構、僕、グミが好きでして...

そこで、フラフラしながら、「いります？」と先輩方の目の前に差し出してみました。まぁみんな喜び、続けているといつの間にか、「交換会」が始まっていたりします。これもコミュニケーションの始まりのひとつかもしれません。

仕事してないやん。と思うかもしれませんが、やる時にはしっかり仕事はします。ただ、人は何かを与えられるとお礼をしたくなるのサガです。グミくれたし、ちょっと丁寧に教えてやろう...なんてことは無意識に思ってくれるかもしれません。


# 先輩。僕最近、開発部の机を反時計回りにフラフラしているんですけど、正直どう思ってます？

仕事さえ、きちんとこなしていればいい。

は大前提です。

しかし、生産性や開発の速度を上げるためにも「コミュニケーションコスト」はかけていくべきだと思っています。フラフラするのがきつければ、先輩をご飯に誘ってみるでもいいかもしれません。今、リモートが流行っている中、テキストベースだけの会社だけdのコミュニケーションとプライベートの間のコミュニケーションレイヤーを作り出すことで、仕事は楽しくなるかもしれません。

あくまで会社は「人」でできています。開発している時の言語で喋るのとは違います。コミュニケーションにコストを払うことは新卒にとってかなりメリットがあります。リモートでも、毎日ちょっと雑談してみることなどを意識してみましょう！！！



# 最後に

ただ、前提が長い記事になりましたね...笑
Pandas DataFrameのよく使う操作

# 目次

* [行・列の結合](#行列の結合)
* [空の行・列の追加](#空の行列の追加)
* [欠損値の操作](#欠損値の操作)



# 行・列の結合

`pandas.concat`を使う方法。
```python
df = pd.concat([df1, df2], axis=0)#縦方向に結合
df = pd.concat([df1, df2], axis=1)#横方向に結合
```

# 空の行・列の追加

```python
df.loc['空の行']='' # pd.Series() や np.nan でも同様
df.loc[:, '空の列']='' 
```
これだと警告が出る場合があるので、回避するためには以下も使える。
```python
df = df.assign(words=np.nan)
df = pd.concat([df, pd.DataFrame(columns=['列名'])],axis=1)
df = pd.concat([df, pd.DataFrame(index=['行名'])],axis=0)
```

# 欠損値の操作

欠損値の削除
```python
df.dropna(how='any')#欠損値が1つでもある行が削除される
df.dropna(how='all')#すべてが欠損値の行が削除される
```
負の値を含む行を削除する。
```python
df = df.mask(df <= 0, np.nan)
df.dropna(how='any')
```
Grove Pi+用ノードを公開しました！

Raspberry PiにGroveモジュールを繋げられる様になる[Grove Pi+](https://www.switch-science.com/products/2129)用のノードを作りました。

![スクリーンショット 2023-12-19 16.31.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/2e30f14b-0fd4-52f4-4751-e3569be05bff.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/c6a1886a-020d-643d-cae9-0ac3ca59cd00.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/5bc16800-ec96-b77d-4266-6f6667d9faad.png)


実は、以前[enebularのPrivateノードとしては、公開してました](https://qiita.com/jksoft/items/7a77b8ecfdac7bd7955d)が、今回は、ちょっとメンテしてNode-REDのノードとして[オープン](https://flows.nodered.org/node/node-red-contrib-grovepi-nodes)に公開しました。

# 対応Groveモジュール

対応しているGroveモジュールは以下の通りです。

* デジタル入力
    * [Grove-ボタン](https://www.seeedstudio.com/Grove-Button-P.html)
    * [Grove-磁気スイッチ](https://www.seeedstudio.com/Grove-Magnetic-Switch.html)
* デジタル出力
    * [Grove-赤LED](https://www.seeedstudio.com/Grove-Red-LED.html)
    * [Grove-緑LED](https://www.seeedstudio.com/Grove-Green-LED.html)
    * [Grove-青LED](https://www.seeedstudio.com/Grove-Blue-LED.html)
    * [Grove-リレー](https://www.seeedstudio.com/Grove-Relay.html)
    * [Grove-ブザー](https://www.seeedstudio.com/Grove-Buzzer.html)
    * [Grove-超音波距離センサー](https://www.seeedstudio.com/Grove-Ultrasonic-Distance-Sensor.html)
    * [GROVE-デジタル温度・湿度センサ](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html)
* アナログ入力
    * [Grove-音センサ](https://www.seeedstudio.com/Grove-Sound-Sensor-Based-on-LM358-amplifier-Arduino-Compatible.html)
    * [Grove-回転角センサ](https://www.seeedstudio.com/Grove-Rotary-Angle-Sensor.html)
    * [Grove-光センサ](https://www.seeedstudio.com/Grove-Light-Sensor-v1-2-LS06-S-phototransistor.html)
* I2C
    * [Grove-RGBバックライト液晶モジュール](https://www.seeedstudio.com/Grove-LCD-RGB-Backlight.html)
    * [Grove-3軸デジタル加速度センサー(±16g)](https://www.seeedstudio.com/Grove-3-Axis-Digital-Accelerometer-16g.html)

# 使い方

いずれのノードも初期設定はほぼ共通です。

![スクリーンショット 2023-12-19 16.19.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/4dd4c2da-4bff-8215-9a65-e231d5f22703.png)

Grove-Piボードは、鉛筆アイコンから設定ノードの設定画面を開き、追加を押すだけです。一回設定すれば、他のノードとは共通です。

あとは、Grove Pi+のGroveコネクタにGroveモジュールを差し込み、差し込んだコネクタの番号を設定します。
アナログ入力、デジタルI/O、I2Cで、差し込むコネクタの位置が異なるので注意してください。

センサーやスイッチ、アナログ入力などのノードは、ノードの入力があったタイミングでもGroveモジュールの状態を出力しますし、読み込み周期を指定すれば、その周期で出力します。

ノードの使い方は、ヘルプに詳しく書いているつもりなので、参考にしてください。
![スクリーンショット 2023-12-19 16.27.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/c199e1a1-0a2d-515b-f890-8bd27b2846d7.png)

以前の記事にもGroveモジュールごとに使い方を書いてあるのでご参考に！

https://qiita.com/jksoft/items/7a77b8ecfdac7bd7955d#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95
被リンク施策、何に気をつけるべき？

この記事はhttps://qiita.com/advent-calendar/2023/ateam-finergy-wellness の24日目の記事です。

# 自己紹介
- くろちか（社内ではあだ名で呼んでもらってます:girl_tone1:）
- 株式会社エイチーム 新卒2年目
-  こてこての関西人
- SNSやSEO、広報を担当しています


# 社内で一度は聞いたことありませんか？
そう、「被リンク」です。
社内のSEO担当者が被リンク施策に頭を悩ませているとか...

ただリンクを貼ってもらえればいいってもんじゃないんです。
意外と知られていない被リンクの考え方をまとめてみました:muscle_tone1:
（これを知った上で被リンク施策を考えてくれるとSEO担当者が喜びます）

## そもそも被リンクってなんや？
被リンクとは、外部サイトに貼られた自社リンクのことです。
バックリンクとか外部リンクって言われたりもします。

SEOにおいて被リンクが重要項目であるのは、Googleからも公式に言及されています。


>4. ウェブ上の民主主義は機能する。
Google 検索が成果を出し続けている理由は、何百万人ものユーザーがウェブサイトに張ったリンクを参考に、どのサイトが価値のあるコンテンツを提供しているかを判断しているためです。Google では、200 以上の基準と、PageRank™ アルゴリズムをはじめとするさまざまな技術を使用して、各ウェブページの重要性を評価しています。特許を取得した PageRank のアルゴリズムでは、ページ間のリンクを「投票」と解釈し、どのサイトが他のページから最も良い情報源として投票されているかを分析します。この手法なら、新しいサイトが増えるたびに情報源と投票数が増えるため、ウェブが拡大するにつれて効果も高まります。

https://about.google/philosophy/?hl=ja

## ほな、どんな被リンクをGETすればええんや？
社内で意識しているのは被リンクの「量」と「質」です。

### 「量」の被リンク
これは簡単です。たくさんリンクが貼られていれば「有益なサイトだ！:point_up_tone1:」とGoogleに認識されやすくなります。ですが、やみくもにリンクを貼ってもらえれば良いってもんじゃありません。

次に説明する「質」の被リンクが重要です。

### 「質」の被リンク
- リンク先と自社サイト（事業）の**関連性**が強いこと
    - 全く関係のないサイトから貼られてもSEO効果がめちゃくちゃあるとは言えません。（貼らないよりは良いです。量の担保も大切）
- リンク先が**権威性**の高いサイトである
    - 公的機関のドメインは最強です。（ac.jpとか.orgとか...）
- **実績**の多いサイト
    - 運用歴が長いサイトや訪問者が多いサイトからのリンクも良いです。

正直、「質」の被リンクについてはもっと書きたいことがあるのですが、簡単に説明すると上記になります。実はそれ以外にも鮮度も大事とかなんとか...（時期が新しい被リンクのほうが過去のものよりも効果が高いとか）...割愛！

### 意外な落とし穴に注意
終盤になってですが、被リンク施策の意外な落とし穴を3つ紹介します。

- nofollowになっていないか
    - そもそも論ですね。nofollowの場合でもサイテーションとして何らかの恩恵は受けるのですが、被リンク施策としての効果は大幅DOWNになります。
- 載せてもらうページも確認して...
    - 他社リンクもたくさん載っているページとかになっていませんか...
    - **自然な流れ**でリンクが掲載されているかを確認してくださいネ
- アンカーテキストの文言も見て！
    - 前述の「自然な流れでリンクが掲載されているか」に通ずる内容ですが、アンカーテキストにはリンク先の内容を正しく入れましょう
    - 記事に遷移するのであれば、**記事タイトル＋サイト名**が理想です！

## まとめ
被リンク施策は、もはやSEO担当者だけでは完結することができない施策になってきています。

今はSEO対策に注力していなくても、SEOに力を入れるぞ！となった時に少しでもこの記事が役に立ってくれると嬉しいです:writing_hand_tone1:
paiza.ioでelixir その267

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。
構想編

# 練習問題
俺cpuのアセンブラをコンパイルしてelixirのソースコードを生成せよ。

# 方針
- loopは、再帰で実現。
- agentで、変数を実現。
- stackは、backendで使う。

#  俺cpu 命令セット
|ニーモニック	|意味					|スタックの状態|プログラムカウンタの状態|
|:--|:--|:--|:--|
|jmp i	|無条件でi番地へ飛ぶ。			|変化無し	|i番地になる。
|1-255	|stackに整数を積む。			|1個増える	|1つ増える
|get a	|stackに変数aの値を入れる。		|1個増える	|1つ増える
|set b	|変数bにstackを入れる。			|1個減る	|1つ増える
|out	|stackをそのまま出力する。		|1個減る	|1つ増える
|if i	|stackが真ならi番地へ飛ぶ。		|1個減る	|場合によりi番地になる
|if! i	|stackが偽ならi番地へ飛ぶ。		|1個減る	|場合によりi番地になる
|dup	|stackにコピーを積む。			|1個増える	|1つ増える
|rnd	|stackに乱数を積む。			|1個増える	|1つ増える
|drop	|stackを一個減らす。			|1個減る	|1つ増える
|+		|stack-1,stackの加算を求める。	|1個減る	|1つ増える
|-		|stack-1,stackの減算を求める。	|1個減る	|1つ増える
|*		|stack-1,stackの乗算を求める。	|1個減る	|1つ増える
|/		|stack-1,stackの除算を求める。	|1個減る	|1つ増える
|%		|stack-1,stackの剰余を求める。	|1個減る	|1つ増える
|=		|stack-1,stackの等しいを求める。|1個減る	|1つ増える
|>		|stack-1,stackの大小を求める。	|1個減る	|1つ増える
|end	|stopする。						|変化無し	|変化無し


# 投入する、俺cpuのソースコード

１から１００まで、印字する。

```
  1
  set  a
loop
  get  a
  100
  >
  if  end
  get  a
  out
  get  a
  1
  +
  set  a
  jmp  loop

```

# 生成を期待する、elixirのソースコード

```

defmodule Va do
	use Agent
	def start_link() do
		Agent.start_link(fn ->
			0
		end, name: __MODULE__)
	end
	def get() do
		Agent.get(__MODULE__, fn v ->
			v
		end)
	end
	def set(x) do
		Agent.update(__MODULE__, fn v ->
			x
		end)
	end
end

Va.start_link

defmodule Main do
	def loop(v) do
		if v == 0 do
		
		else
			a = Va.get()
			if a > 100 do
				loop(0)
			else
				a = Va.get()
				IO.puts "#{a}"
				a = Va.get()
				a = a + 1
				Va.set(a)
				loop(1)
			end
		end
	end
	def main do
		a = 1
		Va.set(a)
		loop(1)
	end
end

Main.main()



```

# 成果物

https://paiza.io/projects/4kvlxjzOZBxmp81A8AHnrg


以上。
聞いて見て｜幼児・低学年の子供向け知育ゲーム

https://qiita.com/advent-calendar/2023/personal-developement

アドカレに個人開発に関するものがあったのでありがたく投稿させていただきます。
空きがあった 12日目の投稿になります。

## ご挨拶
今年も残すところあと僅かですね。皆さま体調にご自愛の上お過ごし下さい～。
今年制作したものの、まだ記事にできていなかった子たちを本年中に書いておこうと思い立ちました。
【聞いて見て｜幼児・低学年の子供向け知育ゲーム】です。良ければ遊んでみてください。

:::note warn
音声が出るので使用時はご注意ください。
:::


https://changesound-app.vercel.app/

> 『聞いて見て』は、幼児・低学年の子供向け知育ゲームです。「色々な乗り物」や「動物たち」などカテゴリーを選択してゲーム開始ボタンをクリックすると当該対象物の音声が流れるとともに画像が表示されます。聴覚・視覚的に対象物（モノ・コト）を学ぶことができるでしょう。

<a href="https://gyazo.com/c50a0acff3692a71ab936012d87e4037"><img src="https://i.gyazo.com/c50a0acff3692a71ab936012d87e4037.gif" alt="Image from Gyazo" width="945"/></a>

`Change Sound`ボタンを押すと音が切り替わっていき、`play`ボタンを押すと画面に表示される動物・モノの音声が鳴ります。

ボタンの上にあるカテゴリー選択メニューで他のカテゴリーに切り替えられます。
カテゴリーは現在「英語、乗り物、動物（陸・海）」の4つです（今後も更新予定 <font color="lightgray">……たぶん</font>）

![8e25f8430137944f4cd71212732bef56.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/804b3b86-1dde-d6e3-7f38-4791d78eea7a.gif)

## こだわったポイント
- 1：カテゴリー選択でいろいろ選べる
子どもはなかなか集中し続けられないので、いろいろなカテゴリーを用意して飽きが来ないようにしました。
左側はスマホで見た時の内容（カテゴリー：英語）で、右側はタブレット・PCで見た時の内容（カテゴリー：乗り物）です。

<img width="25%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/b3127966-c536-bb27-3893-b01c15a180fe.png"> <img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/3a3b3953-cbf2-ef64-711c-29b5fc1fedc0.png">

余談ですがトマトって「蕃茄（ばんか）」だそうですよ。知ってましたか？？

- 2：（可愛くて楽しそう？な）背景がずっと動いている
先ほどの動画で背景画像が動いているのが確認できます。可愛いキャラクターも配置して親近感アップ☆ですね！
ちなみに動かしているのは`CSS`の`@keyframe`でシンプルな作りです。

![8e25f8430137944f4cd71212732bef56.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/804b3b86-1dde-d6e3-7f38-4791d78eea7a.gif)

- 3：ロゴマーク
![スクリーンショット 2023-12-19 153107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/853a8f79-0a6b-4c87-efb2-2ddfbefcfde4.png)

「文字と絵をミックスさせたロゴマーク作ってみたいなぁ～」という、ただそれだけの動機で制作。子供向けなので色味は明るく、フォントも丸く、ポップで可愛いをイメージしました。
<font color="lightgray">「見て」部分のキャラ名は「ドライアイ君」です。今名づけました。理由は瞬きしないからです。</font>

- 4：ボタンの大きさや字間調整、配色
子どもの手で操作しやすいようにボタンなど要素は**基本的に大きめ**に、配色も**明るい原色系**を意識しました。
あと、文字同士の間隔を**意味合いごとに少し区切ったり、字間を広めに取ったり**するようにしました。

![スクリーンショット 2023-12-19 160853.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3368730/fc50b848-b989-792c-cfb7-c30d7f98a72d.png)

- 5：画像・音声の表示・再生
最初はランダムで表示・再生する仕様だったのですが「なかなか飛行機が出てこない」「アホウドリばっかり出てくる」といった声があり、順繰り表示・再生にすることに。ユーザーの声は貴重ですね。

## 地味に大変だったところ
- 素材集め

下記サイト様にはお世話になりました。感謝。

https://www.irasutoya.com/

https://ondoku3.com/ja/

https://pixabay.com/ja/

https://www.ac-illust.com/

「日本語 音声読み上げソフト|音読さん」は、英語カテゴリーで利用させていただきましたが、声の種類や速度も調整できたりなど至れり尽くせりな仕様でした。


## さいごに
今回作った「聞いて見て」の`GitHub`を下記に貼っていますので、ご興味を持って下さった方は是非ご覧ください！

https://github.com/Benjuwan/changeSound
Hexabase TypeScript SDKを使って、ユーザー登録処理を自動化する

[Hexabase](https://www.hexabase.com/)は企業においても安心して利用できるBaaS（Backend as a Service）を提供しています。多くのBaaSがそうであるように、主にフロントエンド開発者に利用してもらいたいと考えています。そこで現在、TypeScript SDKの開発が進められています。

[@hexabase/hexabase-js - npm](https://www.npmjs.com/package/@hexabase/hexabase-js)

この記事ではHexabase TypeScript SDKのインストールと、企業などでユーザーをまとめて登録する方法を紹介します。

## インストール

インストールはnpmやyarnを使って行います。

```
# npmの場合
npm install @hexabase/hexabase-js

# yarnの場合
yarn add @hexabase/hexabase-js
```

## インポート

インポートすると、 `HexabaseClient` というオブジェクトが取得できます。

```ts
import { HexabaseClient } from "@hexabase/hexabase-js";
```

## 初期化

HexabaseClientを初期化します。

```js
const client = new HexabaseClient();
```

### 認証

Hexabaseでは業務利用を想定しているため、利用する際に認証情報が必須になります。最初はメールアドレスとパスワードで認証し、その後はトークンを使ってGraphQLにアクセスします。 `client` を使って処理します。

初回の認証は次のようになります。

```ts
client.login({email, password, token});
```

| 引数名 | 必須 | 意味 |
|--------|--------|--------|
| email | △ | 認証するメールアドレス |
| password | △ | 認証するパスワード |
| token | △ | 認証した後取得できるトークン |

emailとpassword、またはtokenのどちらかが必須です。

## ユーザー登録

他のユーザーを登録する際には、 `client.invite` または `workspace.invite` を使います。ワークスペースの場合は、そのワークスペース限定ユーザーになるので、 `client.invite` をお勧めします。

最初の引数がユーザー登録するメールアドレスの一覧です。 `noConfirmEmail` を付けるとユーザー向けにはメールが送信されません。

```ts
const res = await client.invite([
		'user1@example.com',
		'user2@example.com'
	], {
  noConfirmEmail: true,
});
```

レスポンスは以下のようになります。

```json
[
    {
        "confirmation_id": "62r...xnl",
        "email": "user1@example.com"
    },
    {
        "confirmation_id": "8c...p1w",
        "email": "user2@example.com"
    }
]
```

## ユーザー登録を確定する

続けて、 `confirmation_id` を使ってユーザー登録を確定します。

```ts
for (const { confirmation_id } of res) {
	await User.register(confirmation_id);
}
```

これでユーザー登録が完了します。

## まとめ

Hexabase TypeScript SDKを使えば、VueやReactなどと連携したWebアプリを素早く開発できるようになります。2022年12月現在絶賛開発を進めていますので、ぜひ試していただいてフィードバックいただければ嬉しいです！

[hexabase/hexabase-js](https://github.com/hexabase/hexabase-js)
【Strict,Lax,Noneで何が違うの?】CookieのSameSite属性について

## はじめに
みなさんはSameSite属性についてご存知ですか?

2020年の2月にChromeがアップデートで初期値が`None`から`Lax`に変更されたり、
railsも`config.load_defaults`のバージョン指定が6.1以降は`nil(実質None)`から
`lax`に変更されました。

他の一部の主要なブラウザ(Firehox)でも変更があり、重要な概念かと思うので
今回は備忘録も兼ねてまとめさせて頂きます。

## SameSite属性とは?
Cookieの属性の一つであり、CSRFを防ぐためのものです。
簡単にいうと、Webブラウザがcookieの送信をいかに制御するか
指定することができます。

属性の説明は以下のとおりです。


|  名前| 説明 |  
|:-:|:-:|
|  Strict | ブラウザーが同一サイトのリクエストに対してのみクッキーを送信することを意味する|  
|  Lax |  画像やフレームを読み込むリクエストのようなクロスサイトリクエストではクッキーを送信しないが、ユーザーが外部サイトから元のサイトに移動するとき（例えば、リンクをたどるとき）には送信されることを意味する。 |   
|  None | ブラウザーがクロスサイトと同一サイトの両方のリクエストでクッキーを送信することを意味する。| 

>https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value より内容は引用

簡単にいうと、Strictはどんな場合もCookieは付与されず、Noneの場合はどんな場合もCookieが付与されます。
Laxはaタグ等のリンクやGETリクエストの場合はCookieが付与されますが、画像の読み込みやformタグのPOSTリクエストの場合は付与されないといった挙動になります！


## 参考資料
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value

https://e-words.jp/w/SameSite%E5%B1%9E%E6%80%A7.html

https://qiita.com/nobuo_hirai/items/b1b862fd1b06b927c87b

https://help.salesforce.com/s/articleView?id=000389944&type=1
【Flutter】Map

# Mapとは
キーと値のペアを保持するコレクション
Dart言語において、Mapは組み込みのデータ型の一つ。
# Mapの作成と初期化
``` dart
// 空のMapを作成
Map<String, dynamic> myMap = {};

// キーと値を指定してMapを作成
Map<String, dynamic> person = {
  'name': 'John',
  'age': 30,
  'isStudent': false,
};

// インデックス演算子 [] を使って値を取得
print(person['name']); // John
print(person['age']);  // 30
print(person['isStudent']);  // false
```
# Mapの更新
``` dart 
// キーを指定して値を更新
person['age'] = 31;

// 新しいキーと値を追加
person['city'] = 'New York';
```
# Mapのイテレーション
イテレーションは、コレクション内の要素を順番に処理すること。
具体的には、ループを使ってコレクションの各要素に順番にアクセスし、その要素に対して特定の操作を行う。
``` dart 
// キーと値を出力
person.forEach((key, value) {
  print('$key: $value');
});
```
# Mapの削除
``` dart 
// キーを指定して削除
person.remove('isStudent');
```
炭酸イオンを含むかどうかの判定アルゴリズムを複数のPOSCARファイルに適用（ログ）

## 目標
炭酸イオンを含むかどうかの判定アルゴリズム<sup>[1]</sup>を，複数のPOSCARファイルに適用するスクリプトを作成する．

[1] 炭酸イオンかどうかの判定アルゴリズムの作成（ログ） #Python3 - Qiita
https://qiita.com/k-morii-toridai/items/972a713e62c1739932ba


## スクリプトの実行
```terminal
pwd
/mnt/ssd_elecom_c2c_960gb/scripts/get_some_ion_contained_pos_folder_p_list

ls -CF
CO3_contained_poscar_folder_path_list.npy*  get_CO3_contained_pos_folder_p_list.py*
get_CO3_contained_pos_folder_p_list.ipynb*  package_bond_search_algorithm/
```

```terminal
time python3 get_CO3_contained_pos_folder_p_list.py
```
len(C_O_existed_poscar_folder_path_list): 205733
100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 205733/205733 [58:57<00:00, 58.16it/s]
len(ion_contained_poscar_folder_path_list)/len(C_O_existed_poscar_folder_path_list) :1173/205733

real    59m8.419s
user    274m0.923s
sys     9m58.857s


## 作成したスクリプト
```python
import os
from pathlib import Path
from multiprocessing import Pool, cpu_count

import numpy as np
from tqdm import tqdm

from package_bond_search_algorithm.algolithm_bond_search_for_CO3 import concat_filter
from package_bond_search_algorithm.package_file_conversion.nnlist2df import nnlist2df


def wrap_nnlist2df_and_concat_filter(nnlist_p):
    """
    This func() executes two func()s.: nnlistdf() and concat_filter().

    Usage:
    ------
    wrap_nnlist2df_and_concat_filter(nnlist_p=nnlist_p)

    Parameter:
    -----------
    nnlist_p: str or PosixPath

    Return:
    -------
    bool: True or False
    """
    df_nnlist = nnlist2df(nnlist_p)
    bool_ = concat_filter(df_nnlist=df_nnlist)

    return bool_


# ターゲットとなるイオンの元素種を含むPOSCARのディレクトリパス一覧を取得
target_npy_p = '../get_some_speceis_existed_poscar_path_list/C_O_existed_poscar_folder_path_list.npy'
C_O_existed_poscar_folder_path_list = np.load(target_npy_p, allow_pickle=True)
print(f"len(C_O_existed_poscar_folder_path_list): {len(C_O_existed_poscar_folder_path_list)}")

# ターゲットとなるイオンの元素種を含むPOSCAR.nnlistのディレクトリパス一覧を取得
add_str = '/nnlist_5/POSCAR.nnlist'
C_O_existed_poscar_nnlist_path_list = [str(p) + add_str for p in C_O_existed_poscar_folder_path_list]

# 並列化
pp = Pool(cpu_count() - 1)
total = len(C_O_existed_poscar_nnlist_path_list)
try:
    bool_ion_contain = list(tqdm(pp.imap(wrap_nnlist2df_and_concat_filter, C_O_existed_poscar_nnlist_path_list), total=total))
finally:
    pp.close()
    pp.join()

# apply filter(:bool_ion_contain) to C_O_existed_poscar_nnlist_path_list
ion_contained_poscar_nnlist_path_list = np.array(C_O_existed_poscar_nnlist_path_list)[bool_ion_contain]
# get ion contained folder path list
ion_contained_poscar_folder_path_list = [Path(os.path.split(Path(os.path.split(Path(p))[0]))[0]) for p in ion_contained_poscar_nnlist_path_list]
# save ion contained folder path list as .npy
saved_npy_fname = 'CO3_contained_poscar_folder_path_list.npy'
np.save(saved_npy_fname, ion_contained_poscar_folder_path_list)
# print parcentage
print(f"len(ion_contained_poscar_folder_path_list)/len(C_O_existed_poscar_folder_path_list) :\
{len(ion_contained_poscar_folder_path_list)}/{total}")
```
モンキーパッチとは？Rubyモンキーパッチの利点とリスク

## モンキーパッチとは？

モンキーパッチは、プログラミングにおいて既存のコードを変更する技術です。Rubyでは、既存のクラスやモジュールに新しいメソッドを追加したり、既存のメソッドを上書きしたりすることが可能です。これにより、アプリケーションの特定のニーズに合わせてカスタマイズできます。

## モンキーパッチの具体的な利用シナリオ

- 機能の追加: 既存のクラスに足りない機能を追加する
- バグ修正: ライブラリ内のバグをアプリケーション側で修正する
- 振る舞いのカスタマイズ: アプリケーション固有の要件に合わせて、既存のメソッドの振る舞いを変更する

## モンキーパッチの利点

- 柔軟性: 既存のクラスやメソッドをカスタマイズすることで、特定の要件に合わせて振る舞いを調整できる
- 迅速な開発: 既存のライブラリやフレームワークに手を加えることで、新しい機能を迅速に実装できる
- 互換性の維持: 古いコードベースを新しいライブラリやフレームワークのバージョンに合わせて修正する際に役立つ

## モンキーパッチのリスク

- 保守性の低下: 元のライブラリのコードが変更されると、モンキーパッチが予期せぬ動作を引き起こす可能性がある
- コードの可読性: モンキーパッチが多用されると、コードベースが複雑になり、新しい開発者が理解しにくくなる
- 予期せぬ副作用: モンキーパッチによって他の部分の動作に影響を与え、バグの原因となることがある

## モンキーパッチの使用例

### 既存のメソッドのオーバーライド

```ruby
class String
  def length
    self.size > 5 ? 'long' : 'short'
  end
end

# 使用例
'a'.length # => 'short'
'abcdef'.length # => 'long'
```

この例では、String クラスの length メソッドをオーバーライドしています。

### 新規メソッドの追加

```ruby
class Array
  def summarize
    self.join(', ').concat(' and more...')
  end
end

# 使用例
[1, 2, 3].summarize # => 1, 2, 3 and more...
```

## モンキーパッチを使う時の注意点

- 明確なドキュメント: モンキーパッチの使用理由と挙動を明確にドキュメント化することが重要
- 限定的な使用: 必要の場合にのみモンキーパッチを使用し、できるだけ標準的な方法で問題を解決しようとするべき
- テストの充実: モンキーパッチを導入する際は、その影響を十分にテストするべき

## 結論

モンキーパッチは、Railsアプリケーションの柔軟性と機能性を高める有効なツールですが、その使用には慎重さが求められます。適切に使用された場合には、アプリケーションの開発を加速し、カスタマイズを容易にすることができます。しかし、不適切な使用はコードの保守性や可読性に悪影響を及ぼす可能性があるため、モンキーパッチの使用は慎重に行う必要があります。
卒業研究でWindows Formを使って開発をした話

# 卒業研究でWindows Formを使って開発をした話

## はじめに
こんにちは
宮治研究室4年の赤坂匠です。今日は、C#未経験の状態から、卒業研究の開発のために、Windows Formを使って開発をした話をしたいと思います。自分が開発をした感じ、Windows Formなどの記事は本当になくて、10年前の記事を読んだり、Udemyを見ながら開発に取り組みました。
なぜ、Windows Formを使って開発をしたのかは、先生に「簡単だからやってみなよ」って言われたのが始まりです。あの時の先生を恨みたいです。（笑）

## 開発環境
- RFIDリーダーアンテナ(下記記載のもの)
- RFIDタグ
- PC(Windows 11 x86)
- Visual Studio
- 下記記載のSDK環境

## 作成したもの
![systemResult2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2701688/7e435f68-b823-c48b-4369-c23a832e4b87.jpeg)

今回は、上記の画像のようなものを作成しました！
RFIDリーダーアンテナをPCに接続して、タグから人を検出し、通過タイムを出してくれる優れものです！

詳しくは、論文で書いているので、気が向いたら読んでみてください。

## 使用したもの
https://rfid.tss21.co.jp/product/dotr-3000/
株式会社 東北システムズ・サポート様の商品を購入し、無償提供いただいているSDKを使って開発を進めました。問い合わせをすると、ダウンロードが可能なので、ぜひ使ってみてください！

## 開発でこまったこと
開発をしていくうえで困ったことがたくさんありました。
1. DLLファイルについて
SDKの中には、DLLファイル(.dll)というものがありました。DLLファイルとは、複数のアプリケーションが共通して使用できる汎用性の高いプログラムをOSにファイルとして保存し、アプリケーションの実行時に必要に応じて利用する方法(https://support.nec-lavie.jp/support/pc/yougo/03_ei/ei070.html) とあります。つまり、SDKの中で、開発済みのモジュールをよんだりできるもの、くらいの認識で自分はいます。このファイルを読みこんで開発をしていきます。
2. Buildが通らない
普段、ソフトウェア開発をしている自分にとって、OSが違うくらいでBuildが通らないなど思ってもいませんでした。Buildボタンを押す前に、CPUの設定が自分のPCのものと一致しているかどうか確認をしましょう！私はAny CPUでやっていて、Buildが通らず、x86で実行したらBuildが通りました！

## コードについて
SDKの中身について開示して解説をしてしまうと、著作権的によくないと思ったので、自分が開発したコードをちらっとお見せするぐらいにします。
```C#:form1.designer.cs
StartButton.Location = new Point(8, 61);
StartButton.Name = "StartButton";
StartButton.Size = new Size(113, 37);
StartButton.TabIndex = 3;
StartButton.Text = "スタート時間";
StartButton.UseVisualStyleBackColor = true;
StartButton.Click += StartButton_Click;
```

Windows Formでは、ツールボックスというものから、GUIでボタンやテーブルの作成が可能です！GUIで動かした後、designer.csというファイルが変更されていると思います。逆に言うと、コードからも変更が可能ということです！

```form1.cs
private static string GetConnectionString()
{
    var builder = new SqlConnectionStringBuilder
    {
        DataSource = @"your-pc-info",
        InitialCatalog = "db-name",
        IntegratedSecurity = true
    };

    return builder.ToString();
}

private DataSet ExecuteSqlQuery(string connectionString, string query)
{
    using (var connection = new SqlConnection(connectionString))
    using (var adapter = new SqlDataAdapter(query, connection))
    {
        var dataSet = new DataSet();
        adapter.Fill(dataSet);
        return dataSet;
    }
}

// 呼び出し側のコード

// SQL接続文字列を取得
var connectionString = GetConnectionString();

// SQLクエリを実行し、データセットにデータをいれる
var dataSet = ExecuteSqlQuery(connectionString, "your sql");
```

あんまりきれいなコードじゃないとは思うのですが、SQLの実行をするために、SQL Serverとの接続部分をお見せします！こんな感じで簡単に接続ができて、データの取得はSQLから実行をするだけです！自分はDBにデータを入れたり、取得したりしただけなので、これで簡単にできたのは驚きでした！

## さいごに
今からWindows Formを開発しようとしている方々は、参考にする記事の少なさで絶望をしていると思いますが、この記事がその方々の少しでもお役に立てれば幸いです。IoTで開発をする楽しさがとても分かりました。
間違っている点や、わからない点があればコメントください！！
Oracle plsql ,PDFがアップデートされたかチェック 01

# ■環境
・PHP7.4
・Linux（RedHat 8.6）
・Smarty2.4.6
・oracle12
・PLSQL

# ■完成イメージ

![スクリーンショット (899).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478380/65a087e5-9944-2ed8-31c9-fa98f6ce9213.png)

# ■機能説明

## 機能
・PDFファイルをアップロードされた行の色を変える。

## ソース
```plsql 

create or replace PROCEDURE PDF_UPCHECK (
    P_GYOCD IN NUMBER, --業者コード
    P_UKENEND IN NUMBER, -- 受付年度
    P_UKECD IN NUMBER, -- 受付番号
    P_RSLT OUT NUMBER, --ステータス(0:正常終了　99:エラー)
    P_SQLCODE OUT NUMBER, --エラーコード
    P_SQLERRM OUT VARCHAR2 --エラーメッセージ
)
 /*******************************************************************************
* 関数名 : PDF_UPCHECK
* 作成者 : 夏目
* 作成日 : 2023/11/10
* 概要   : Web予約 PDF_UPロードチェック用プロシージャ
* 機能   : PDF（埋火葬許可書）がアップロードされたかチェック用のデータを作成
* 履歴   : 2023/11/10    夏目智徹      新規
*          

※＝＝＝　予約時間もパラメータで渡せるので、必要に応じて追加できる。


*******************************************************************************/
 /*======================================
  変数宣言
======================================*/ 
IS
    CURSOR c_WK1 IS
    SELECT
        業者コード,
        業者名,
        受付年度,
        受付番号,
        予約日付,
        死亡者姓,
        死亡者名
    FROM
        火葬受付
    WHERE
        業者コード = P_GYOCD --- 業者コード
        AND 受付年度 = P_UKENEND --- 受付年度
        AND 受付番号 = P_UKECD--- 受付番号
        AND 死亡者姓 IS NOT NULL;
 --ﾚｺｰﾄﾞ宣言
 r_WK1 c_WK1%ROWTYPE;
 /*======================================
  本体
======================================*/
BEGIN
 --初期処理
    P_RSLT := 0;
    P_SQLCODE := 0;
    P_SQLERRM := NULL;
    
     -- カーソルオープン
    OPEN c_WK1;
    -- カーソルフェッチ
    FETCH c_WK1 INTO r_WK1;

IF c_WK1%FOUND THEN
 --- 業者コードが NULLじゃなかった場合
    IF P_GYOCD IS NOT NULL THEN
        INSERT INTO PDF_UPDETA (
            業者コード,
            業者名,
            受付年度,
            受付番号,
            予約日付,
            死亡者姓,
            死亡者名
        ) VALUES (
            r_WK1.業者コード,
            r_WK1.業者名,
            r_WK1.受付年度,
            r_WK1.受付番号,
            r_wk1.予約日付,
            r_WK1.死亡者姓,
            r_WK1.死亡者名
        );
    END IF;
ELSE
    DBMS_OUTPUT.PUT_LINE('Fetchができない');
END IF;
    
-- カーソルクローズ
CLOSE c_WK1;

 /*======================================
 例外処理
======================================*/
EXCEPTION
    WHEN OTHERS THEN
        P_RSLT := 99;
        P_SQLCODE := SQLCODE;
        P_SQLERRM := SQLERRM;
END;

```

０２へ続く。
スマホ向けゲームでサーバー運用費を削減した話

本記事は [オルトプラス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/altplus2023) の12/23の記事です。

##  はじめに
こんにちは、オルトプラスでテックリードをしております濱野と申します。
社内のプロジェクトではエンジニアのリーダーをやりつつ、Unityエンジニアの採用担当もさせていただいてます。

今回はスマホ向けゲームのプロジェクトでサーバー運用費を下げるために実施したことを紹介します。
本記事では下記のようなプロジェクトやサービスを対象としています。
- リリース初期段階ではなく、運用してからしばらく経過しているプロジェクト
- AWSの下記サービスを利用していてこれらのサービスのコストダウンしていきたい
  - Amazon EC2、Amazon RDS、Amazon CloudFront

また、コードレベルではなくざっくりしたご説明となりますのでそちらはご容赦ください。


## 対応方針と対策内容について
まずは対応方針については下記の通りに定めました。
リリースしてからしばらく経過していたため既に遊んでいただいているユーザーさんのプレイ感を極力変えないようにしています。

- プレイ感やプレイサイクルが変わらないようにする
  - プレイ感：ゲームの操作方法、UI、画面遷移の待ち時間など
  - プレイサイクル：ログインボーナスの受け取り日時、イベント開催期間など
- 運用/保守のメンテナンス作業が少なくなるように自動化していく

上記の対応方針を踏まえて対策内容についても下記の通りに定めました。
常時コストが発生しているデータ通信量削減、インスタンスタイプ変更、サーバー台数増減による対策に重きを置いています。

- Amazon EC2
  - API通信(GET/POST)でのリクエスト負荷軽減
  - メモリ使用量を削減
  - 最適なインスタンスタイプへの変更
  - AutoScalingの導入
- Amazon RDS
  - プロビジョンドインスタンスからServerless v2への移行
- Amazon CloudFront
  - 未使用リソースを初回ダウンロードしないように除外

以降で具体的な対策について記載しています。

# Amazon EC2 対策内容
#### API通信(GET/POST)でのリクエスト負荷軽減
主に「ユーザーデータが関連するAPI」に対策を入れました。
ガチャ一覧取得のAPIなど「日時によって更新されるデータ」はアプリ側の時間管理が必要となり工数が膨れ上がるため保留にしています。

- ログイン時or画面遷移時にアプリの表示に必要なユーザーデータを一度だけ一括取得(GET)する
- 「データの追加、変更、削除」のいずれかが発生した時だけ差分をPOSTする
- レスポンスは差分データのみサーバーからアプリ側に返却する
  ⇒ 毎回全件返却するとデータの整形(json化)に処理時間も掛かるので避ける

#### メモリ使用量削減の対策
- リリース初期の未使用になったマスタデータを削除
⇒ 例えばリリース1年間のガチャデータなど、
　 DBのレコードにマスタのIDが保存されている場合は該当レコードも削除する。
- サーバーのプロセスで使用しないマスタデータはキャッシュしないように変更
⇒ アプリで使用するマスタデータはS3経由でダウンロードする。

#### 最適なインスタンスタイプへ変更
API対策とメモリ使用量で削減出来た分を考慮してインスタンスファミリーやサイズを選定します。
- メモリに余裕がある場合：「c6i.4xlarge」 → 「c6i.2xlarge」
- メモリに余裕がない場合：「c6i.4xlarge」 → 「r6i.2xlarge」など

#### AutoScalingの導入
- 予定されたアクションでスケールイン/スケールアウトを設定
  - ピークタイム：サーバー台数を追加 (夕方〜深夜帯の時間帯)
  - オフピークタイム：サーバー台数を減少 (深夜帯～夕方の時間帯)
- 動的ポリシーを設定
    - 「CPU使用率」と「ターゲット毎のリクエスト数」の2つのしきい値を設定

# Amazon RDS
#### プロビジョンドインスタンスからServerless v2への移行
対策前はプロビジョンドインスタンス(r6gシリーズなど)を利用していましたが、
- EC2のAPI(POST)対策によってDBへのアクセス数が減少
- 深夜帯〜夕方までのリクエスト数が比較的少なめ

という稼働状況でServerless v2の方がコストを抑えられる傾向だったので切り替えました。

スケーリングが優秀なのでACUは2〜128のような設定で稼働させています。
ただ、メンテ明けなど瞬時にリクエストが増加するタイミングはスケーリングが間に合わないため、事前に最小ACUを高めに設定してからサービスを開けるようにしています。

# Amazon CloudFront
#### 未使用リソースを初回ダウンロードしないように除外
こちらは難しい対策はしておらず概要だけのご説明となります。

前置きとして、アプリで使用しているリソースファイル(画像など)はUnityのAssetBundle(※addressableではない)を使用しておりS3にアップロードしてCloudFront経由でアプリからダウンロードしています。

ゲームアプリでよくある初回起動時に「何GBのリソースをダウンロードします」みたいなリソースダウンロードが発生しますが、こちらのリソースを放置していると運用が長くなるにつれて肥大化していくため定期的に下記のような対策を取っています。

- 初回リソースダウンロードの対象となるファイル一覧を定義しているjsonファイルから、使用しなくなったイベント画像などを除外する
  - リソースを管理しているフォルダまたはファイルの末尾にイベントIDを付けるなどルール化しておき、特定のIDの範囲内は除外するスクリプトファイルを用意する
- Unityのバージョンアップデートによってフルビルドは極力実施しないようにする
  - Unity2019LTSで作成したAssetBundleはUnity2022LTSでも互換性があるため、メジャーバージョンのアップデートがあったとしても互換性がある限りは更新だけをビルドするようにしています

# まとめ
今回のコスト削減の実施結果は下記の通りとなりました。
- EC2とRDSのサーバー稼働費は月単位で15%〜20%ほどのコスト削減(前年比)
- CloudFrontは1ユーザー当たり400MB削減 (1.5GB→1.1GB)

特にEC2とRDSのアクセス数が少ない時間帯に低稼働させてるだけでも効果が見込めました。運用中のプロジェクトだと現在の負荷状況が読みやすいかと思いますので参考になりましたら幸いです。
文系大人初心者プログラミングするよ🔰【HTML＆CSSでフォーム作成】

HTML.CSSは短く切り上げて、、と思っていましたが、
今後Webページ・アプリを作成していく上でフォームの作成が出てくるので
ここではHTML.CSSを使用した基本のフォームを記録として残して置こうと思います:writing_hand:


これはHTMLで「form要素」を使用して作っていくんですが、form要素はフォーム関連要素の集まりを表すブロック要素で、<form>...</form>のなかに、input要素などを入れてフォームを作成します。

form要素（ブロック要素）
　input要素（インライン要素）
 　type属性
  　・text(1行のテキスト入力欄)
　　・submit(送信ボタン)    
　 placeholder属性(入力フォームに仮の文字列を入れる)

属性、特にinputo属性にはいろんな種類があります


```.html
<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="UTF-8">
    <title>タイトル</title>
    <link rel="stylesheet" href="stylehc.css">
  </head>
  <body>
    <div class="question">
      <form class="question-form">
        <input type="text" placeholder="名前" class="name-form">
        <textarea name="message" placeholder="質問" class="message-form"></textarea>
        <input type="submit" value="SEND" class="send">
      </form>
    </div>
  </body>
</html>
```
```.css
.guestion {
  height: 500px;
  background-color: lightgray;
  display: flex;
  justify-content: center;
  align-items: center;
}

.question-form {
  width: 600px;
}

.name-form {
  margin: 0 auto 10px;
}

.message-form {
  height: 150px;
  margin: 0 auto 30px;
}

.name-form,
.message-form {
  width: 500px;
  padding: 15px;
  border: 1px solid white;
  display: block;
}

.send {
  width: 200px;
  margin: 0 auto;
  padding: 15px;
  border: 1px solid white;
  color: white;
  background-color: orange;
  display: block;
}
```

1業入力、複数行入力、送信ボタンがあるフォームを作成し、
表示も中央へ寄せています。
フォーム要素という親要素に対して、各インライン要素だと並びを揃えることが難しいので、子要素のインライン要素をブロック要素へ変換（display: block;）します。


form要素って便利なので、使いこなして行きたいですね！
私はこの基本を理解度60％のまま進んでいったので、のちのちちょっと苦労しました、、、
supabseのdatabase functionsを追加しようとしたら1行目で永遠にsyntax error

# はじめに
私が初めてsupabaseに触ったこともあり、database functionsを追加しようとして永遠にsyntax errorが出るという事象に遭遇しました。
めちゃくちゃ初歩的な勘違いだったのですが、同じことをやっている人もいると思うので一応共有です。

# 詰まった手順
database functionsを作るんだからまずは右にタブからdatabaseを選択して、その中のfunctionsを選択しました。
そしてその中でcreate a new functionボタンがあったのでクリックしました。
そして、以下のdefinitionのところでfunctionを作るsqlを入力しました。
![](https://storage.googleapis.com/zenn-user-upload/f5ddc0e6bc77-20231219.png)
でもconfirmを押すと以下のエラーメッセージ
>Failed to create database function: failed to create pg.functions: syntax error at or near "CREATE"

Createの部分って一番最初じゃん、おかしいなと思いつつ、色々syntaxを修正してもエラーが一生消えません。

# 解決した手順
公式データベースの以下の部分を見たときに気づきました。
https://supabase.com/docs/guides/database/functions#getting-started
そもそもdatabase functionsを作るからdatabaseタブにいくことが間違いでした。
最初にSQLエディターを選択して、そこに直打ちすればよかったです。
その後database functionsのタブに行くと、作成したfunctionが表示されていました。

# 補足
databaseタブのfunctionsから編集する場合には
BEGINからENDまでの間を書けば良いです。
function名とか諸々の設定は、フォームの上の方で入力する感じですね。
機械学習で株価分析 09.取得したデータの統合

# はじめに
本記事では、**取得した株価情報と経済指標情報をひとつのデータフレームに統合する方法**を紹介します。併せて、データのブランクを埋める方法もご紹介します。なお、本記事は過去の記事 [06.個別の株価データの取得](https://qiita.com/ryo2_9393/items/0f2ffc0fb00aedcac251) と [08.経済指標データの取得](https://qiita.com/ryo2_9393/items/dfe6fae255dc3ffdc05e) の続きですので、未読の方はまずこちらをご参照ください。


# 手順
株価データ・経済指標データを取得し、以下のプログラムを実行することでデータを結合できます。後半で、データに`nan`が含まれないよう編集しています。まず、`ffill`を用いて`nan`に過去の値を代入し、過去の値がない部分は`0`を代入するメソッドです。

```python
# 株価データに経済指標データを統合
df_merge = pd.concat([df_stock, df_fred], axis=1)

# データのブランクを穴埋め
df_merge = df_merge.fillna(method='ffill')
df_merge = df_merge.fillna(0)
```

# ソースコード全文
以下にソースコード全文を示します。

```python
!pip install yfinance

# 必要なライブラリをインポート
import yfinance as yf
yf.pdr_override()
import numpy  as np
import pandas as pd
from   pandas_datareader import data
import datetime
from   IPython.display   import display

# データの取得開始日・取得終了日を設定
day_start = datetime.date(2021,1,1)
day_end   = datetime.date.today() + datetime.timedelta(days=1)

# 銘柄名を変数に格納
stock_name  = ["4689.T"]

# 株価データを読み込み
df_stock = data.DataReader(stock_name, day_start, day_end, interval="1d")

# 取得する経済指標を設定
fred_name = ["^N225"]

# 経済指標データ取得
df_fred = data.DataReader(fred_name, day_start, day_end, interval="1d")

# 経済指標データの列名を編集
for i in range(len(fred_name)):
  df_fred = df_fred.add_prefix(fred_name[i] + " ")

# 株価データに経済指標データを統合
df_merge = pd.concat([df_stock, df_fred], axis=1)

# データのブランクを穴埋め
df_merge = df_merge.fillna(method='ffill')
df_merge = df_merge.fillna(0)

# 取得したデータを表示
display(df_merge)
```

プログラムを実行し、コンソール上に指定した期間の統合された株価・経済指標情報が表示されれば成功です。

# 目次へのリンク

https://qiita.com/ryo2_9393/items/2b1ada62c2537c901b6b