OmniAICreator/Qiita-1.07M huggingface dataset:
初心者の為の命名規則

## はじめに
　この記事は命名規則に関する今現在の自分の知識をまとめたものです。私自身が初心者の域を出ないので、簡単な内容のみに絞りました。誤っている部分や、もっとこうした方が良いという点があるかもしれません。ご了承ください。

## 対象読者
* 初心者プログラマー

## 命名規則について
命名規則で使われることがあるのは、概ね以下の5つでしょうか。
* パスカルケース
* キャメルケース
* スネークケース
* アッパースネークケース
* ケバブケース

この中で、Microsoftはスネークケース、ケバブケースを非推奨としています。言語によると思いますが、命名の際はパスカルケースもしくはキャメルケース、スネークケース、アッパースネークケースが主に使われていると思います。

各言語の推奨されている命名規則を、軽く纏めました。
|種類|c#|PHP|Python|Java|JavaScript|
|----|----|----|----|----|----|
|クラス|Pascal|Pascal|Pascal|Pascal|Pascal|
|関数|Pascal||snake_case|camel|camel|
|メンバ変数|Pascal|camel|snake_case|camel|camel|
|ローカル変数|camel|camel|camel|camel|camel|
|名前空間|Pascal|Pascal|全て小文字|||
|定数|Pascal|SNAKE|SNAKE|SNAKE|SNAKE|

### パスカルケース(PascalCase)
* `PascalCase` のように、要素語は大文字を連続させて命名します。
* アッパーキャメルケースとも呼ばれます。

### キャメルケース(camelCase)
* `camelCase`のように、初めの要素語だけ小文字から始め、以降の要素語は大文字から始めます。
* ロウワーキャメルケースとも呼ばれます。

### スネークケース(snake_case)
* `snake_case`のように、要素語は全て小文字で記し、要素間をアンダーバー（アンダースコア）で繋げます。

### アッパースネークケース(SNAKE_CASE)
* `SNAKE_CASE`のように、要素語は全て大文字で記し、要素間をアンダーバー（アンダースコア）で繋げます。
### ケバブケース(kebab-case)
* `kebab-case`のように、要素語は全て小文字で記し、要素間をハイフンで繋げます。
* あまり推奨されていません。（見たことない...）


## 名付けのルール
名前の付け方に関しては、開発を行っている会社やグループの方針があるかもしれませんが、一般的に良いとされている（？）つけ方を軽く紹介いたします。
以下は、どの名前付けに関しても一貫して言えることを述べました。

* 一目で見てその内容がわかるような名前を付けます。
* 数字や日本語は極力避けましょう。
* 名づけの方の一貫性を保ちましょう。
* 他の名前と被りにくい、ユニークなものを選びましょう。

### クラス名について
* 名詞を主に使います。
* インターフェースなどであれば、形容詞を用いることがあります。

### 関数名について
* 動詞を主に使います。
* 真偽値を返すのであれば、`isFull`や、`needConnected`のように、`is`,`can`,`should`,`must`,`need`,`has`など、真偽値を返す目的を先頭につけましょう。
* データを変換するなら`to`であったり、データなどを作成するなら`create`など、目的が明確になるような要素語を先頭につけることが望ましいです。

###  変数名について
* 名詞を主に使います。
* データを保持する目的や、中身が明確になるような名前をつけましょう。
* 関数同様、boolean型ならば`is`や`has`などのような、何についての真偽値なのかがわかるようなものが望ましいです。
* 型についての情報を先頭につけることもあります。例えば整数ならintの`n`を先頭につけたり、文字列ならば`str`などのようにします。これは、こういった値でよく使われるというよりは、ボタンであったりテキストボックスであったりする際に、`btn`や`txt`などの要素語を先頭につけるイメージです。


### おわりに
以上が、私が心掛けている命名規則についての情報です。
他にもあれば追記していきますし、編集リクエスト、コメント等お待ちしております。
特徴量エンジンKaskadaリファレンス~マテリアライゼーション

# はじめに

先日、以下の記事を発表しました。

https://qiita.com/yoshiyuki_kono/items/7dc7bdad5e02ff986f5d

新しいテクノロジーに触れる時はいつでも楽しいものです。
中でも新しいプログラミング言語（のパラダイム）を学ぶことは、特別に楽しいことです。

ということで、まだまだ勉強中ですが、公式ドキュメントの学習過程の記録として、以下の記事をまとめてみました。

本稿情報のソースとして、下記ドキュメントを参照ください。

https://kaskada.io/docs-site/kaskada/main/developing/materializations.html

# マテリアライゼーション

**マテリアライゼーション**はクエリに似ていますが、**テーブルにデータが追加されるたびに結果が更新される**点が異なります。マテリアライゼーションを使用して、さまざまなフィーチャー（特徴量）ストアに特徴量ベクトルを入力することができます。このような構成は、プロダクション環境における低遅延の推論に適しています。

## サポートされているマテリアライゼーション先

Kaskada は、さまざまな外部データ ストアへのマテリアライゼーションをサポートしています。

### パルサー
構成例:

```
materializations:
  # The name of the materialization
- materialization_name: PulsarExample
  # The epxression to materializa
  expression: PurchaseStats
  # Where the expression's final results will be written
  pulsar:
    broker_service_url: pulsar://127.0.0.1:6650
    tenant: public
    namespace: default
    topic_name: pulsar-example
```
### オブジェクトストア
構成例:
```
materializations:
- materialization_name: PulsarExample
  expression: PurchaseStats
  object_store:
    file_type: parquet
    output_prefix_location: s3://my-bucket/path/to/results/
```
## マテリアライゼーションの管理
### マテリアライゼーションの作成
マテリアライゼーションを作成するには、まずマテリアライズしたい式を記述します。
ここでは、ユーザーの購入に関する統計に興味があるとします。


```python
from kaskada import materialization
from kaskada.api.session import LocalBuilder

session = LocalBuilder().build()

purchase_stats = """
{
    time: Purchase.purchase_time,
    entity: Purchase.customer_id,
    max_amount: Purchase.amount | max(),
    min_amount: Purchase.amount | min(),
}
"""

tenant = "public"
namespace = "default"
topic_name = "model_features"
broker_service_url = "pulsar://127.0.0.1:6650"
destination = materialization.PulsarDestination(tenant, namespace, topic_name, broker_service_url)

materialization.create_materialization(
    name = "PurchaseStats",
    destination = destination,
    query = purchase_stats,
)
```
現在、CLI はオブジェクト ストア宛先タイプを使用するマテリアライズオンのみを作成できます。これは`--path-uri`オプションを使用して行われます。

### マテリアライゼーションのリスト
`list` マテリアライゼーション メソッドは、ユーザーに対して定義されたすべてのマテリアライゼーションを返します。オプションの検索文字列を使用して、応答セットをフィルタリングできます。

マテリアライゼーションをリストする例を次に示します。


```python
from kaskada import materialization
from kaskada.api.session import LocalBuilder

session = LocalBuilder().build()

materialization.list_materializations()
```
### マテリアライゼーションの取得
マテリアライゼーションの作成時につけた名前を使用してマテリアライゼーションを取得できます。


```python
from kaskada import materialization
from kaskada.api.session import LocalBuilder

session = LocalBuilder().build()

materialization.get_materialization("PurchaseStats")
```
### マテリアライゼーションの更新
マテリアライゼーションは現在のところ不変（イミュータブル）です。マテリアライゼーションを更新するには、そのマテリアライゼーションを削除し、新しい式で再作成する必要があります。

## マテリアライゼーションの削除
マテリアライゼーションは、その名前を使用して削除できます。


```python
from kaskada import materialization
from kaskada.api.session import LocalBuilder

session = LocalBuilder().build()

materialization.delete_materialization("PurchaseStats")
```

マテリアライゼーションを削除しても、外部データ ストアに保存されているデータは削除されません。
SolidJSで誰でも簡単投票サイトを作りました

## 概要

[SolidJS](https://www.solidjs.com/)を使って簡単なサービスを作成してみました。

公式にもありますがSolidJSは仮想DOMを使用しないJavaScriptのフレームワークで、元になった概念的にはコンパイラとして[Svelte](https://svelte.dev/)と似たような立ち位置かと思います。

また、SolidJSではReactでも使われるJSXが使用されているため、React開発者にとってはSvelteと比較しても使いやすいのではないかと思います。

今回はメタフレームワークの[SolidStart](https://start.solidjs.com/getting-started/what-is-solidstart)を使用しました。(2023/06/08現在beta版ですので、プロダクション利用する方は慎重になった方が良い状態です。)


## 作成物

登録なし・無料で簡単に投票ページが作成できるサービスを作りました！

https://tohyokun.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472783/713fe6f3-fffd-394e-07e8-a6db6972f01a.png)

"イヌ派？ネコ派？"のような２択で簡単な質問から、"〇〇さんの送別会場の多数決"など、仲間内での多数決の場合など様々な用途で使用できます。

![SCR-20230607-rtb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472783/f6553c63-eb11-4741-11f1-de9a6b6855d5.png)

投票後は下記のような画面で結果の確認もサクッと行えます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472783/b95e55dd-aa8c-7dd1-3aef-64203f277dd1.png)


https://tohyokun.com/votes/WC4nRew5fHHkYBCfVo9R

## SolidJSに関しての話

### Reactと比較した際の個人的な感想
JSXを使用しているので最初はとっつきやすかったです。
しかし、Reactのインターフェースと似ているが、具体的な関数名(`useSignal`・`createEffect`)等は異なるので、その辺はやや慣れが必要と思いました。


### Svelteと比較した際の個人的な感想

Svelteと比べてもネットでの情報量が少ないと感じました。

しかしチュートリアルやプレイグラウンド等は非常に使いやすく、Svelte同様使いたてのユーザーには非常に優しい状況になっているなと感じました。



## SolidStartに関しての話

[SolidStart](https://start.solidjs.com/getting-started/what-is-solidstart)は上記でも述べましたが、現在betaの状態ですので、開発中でもバグに遭遇やドキュメント不足な状態です。(公式Docsでも述べられています。)

が、NextやSvelteKitの基本的な機能(APIルート等々)は一定持ち合わせているので、今回のような簡単なサイトの作成には特に困ることはありませんでした。

しかし、公式ドキュメント自体にも必要な情報がないことが多々あり、ライブラリ側のコードを見に行かなければならないことは多々ありました。
python Flask

## ファイル構造

> ProjectFile/
> 　├ main.py/
> 　├ templates/
> 　 └ css/
>　　　 └ style.css/

## Pythonファイル
``` python
import flask
from flask import render_template

app = flask.Flask(__name__,
                  static_folder='./templates/css')


@app.route('/')
def index():
    return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True)

```

## HTMLファイル
``` html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel='stylesheet' href='css/style.css'>
</head>
<body>
<h1>Hello World</h1>

</body>
</html>
```

## CSSファイル
```css
body {
    background-color: antiquewhite;
}

h1 {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    font-family: 'Times New Roman', Times, serif;
}

```
【Paiza問題集】ループメニュー2/偶奇の判定

# Paiza問題集
Pythonで回答

## ループメニュー2/偶奇の判定

### Step01 未知数個の数の受け取り
```Python
"""
未知数個の数の受け取り
https://paiza.jp/works/mondai/loop_problems2/loop_problems2__unknown_int

問題
長さがわからない数列aが入力されます
-1が入力されるまで、受け取った数を改行区切りで出力してください
"""

a = map(int, input().split())
for i in a:
    print(i)
    if i == -1:
        break
```

### Step02 未知数個の文字列の受け取り
```Python
"""
未知数個の文字列の受け取り
https://paiza.jp/works/mondai/loop_problems2/loop_problems2__unknown_string

問題
複数の文字列が入力されます
文字列の数はわかりません
EOFが入力されるまで、受け取った文字列を改行区切りで出力してください
"""

A = input().split()
for i in A:
    print(i)
    if i == "EOF":
        break
```

### Step03 奇数だけ出力
```Python
"""
奇数だけ出力
https://paiza.jp/works/mondai/loop_problems2/loop_problems2__even_output

問題
N個の整数のうち、a_1から順に奇数か偶数か判定し、奇数の場合のみ改行区切りで出力してください
"""

N = int(input())
a = list(map(int, (input().split())))

for i in range(N):
    if a[i] % 2 == 1:
        print(a[i])
```

### Step04 割り切れる数だけ出力
```Python
"""
割り切れる数だけ出力
https://paiza.jp/works/mondai/loop_problems2/loop_problems2__div_output

問題
N個の整数のうち、a_1から順に3で割り切れるか判定し、割り切れる場合のみ改行区切りで出力してください
"""

N = int(input())
a = list(map(int, (input().split())))

for i in range(N):
    if a[i] % 3 == 0:
        print(a[i])
```

### Final問題 偶奇の判定
```Python
"""
偶奇の判定
https://paiza.jp/works/mondai/loop_problems2/loop_problems2__even_odd

問題
N個の整数a_1,a_2,..,a_Nが与えられます
このN個の整数について、a_1から順に 奇数か偶数か判定し、奇数ならodd、偶数ならevenを改行区切りで出力してください
"""

N = int(input())
a = list(map(int, (input().split())))

for i in range(N):
    print("even" if a[i]%2==0 else "odd")
```
新卒1年目エンジニアが3ヶ月かけてAWS SAAに合格した方法


# 【はじめに】
こんにちは、エンジニア2年目のヒビキです。
この記事では私が約3ヶ月かけてAWS SAA資格に合格した方法と、
当時の経験をもとに効率の良い勉強法をお伝えします。

# 【受験の背景】
あれは入社半年頃のことでした。
先輩「来月からAWS案件にアサインされるから、SAAくらい取れるよね？」
私「え、あ、頑張ります。」
と、こんな感じで勉強を開始しました。
（結果合格に3ヶ月かかったので案件配属には間に合いませんでしたが。。。。）


# 【使用した教材】
私がAWS SAA資格取得のために使用した教材は以下の3つです。
どれも優秀な教材ですが、あえてランキング形式で紹介します！

## 1位 Tech Stock
こちらは、クラウド資格専門のWEB問題集です。
中でもAWS認定資格に特化しており、全ての試験に対応しています。
(これに一番お世話になりました。)
費用が3000円ほどかかりますがコスパ抜群のコンテンツになっています。

https://techstock.jp/


## 2位 Black Belt
こちらはAWS公式の説明資料のようなものです。
AWSでは定期的にセミナーを開催し、各AWSサービスの紹介や説明を行っています。
その時のパワポ資料や動画がまとめられているので、よくわからないAWSサービスはここで理解度を上げました。

もちろん無料ですし、資料も動画もかなりわかりやすいです！
個人的には動画を2倍速で視聴するのがおすすめです。

https://aws.amazon.com/jp/events/aws-event-resource/archive/?cards.sort-by=item.additionalFields.SortDate&cards.sort-order=desc&awsf.tech-category=*all


## 3位 ソリューションアーキテクトアソシエイトの教科書
こちらは、AWS学習コミュニティを運営しているくろかわこうへい氏による参考書です。
Kindleで無料で読むことができます。
この本の良いところは図解がわかりやすい点です。
AWS関連の資料はどうしても文字数が多くなってしまいますが、
この本はとても丁寧に図が作られていて読み進めやすい印象です。


https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%90%88%E6%A0%BC%E3%81%B8%E5%B0%8E%E3%81%8F%E8%99%8E%E3%81%AE%E5%B7%BB-CloudTech%E6%9B%B8%E7%B1%8D%E4%BD%9C%E6%88%90%E5%A7%94%E5%93%A1%E4%BC%9A-ebook/dp/B0BCPNZ9GJ


# 【実際のスケジュール】
ここからはAWS SAA合格に向けて、私が実際に行った学習スケジュールを紹介します。

## ①参考書でインプット(3日間)
まずは前述したソリューションアーキテクトアソシエイトの教科書を読み進めました。
Kindleはスマホでも読めますが、私はKindleペーパーホワイトの端末(防水)を持っていたのでお風呂で読んでいました。
よくわからないサービスもありましたが、とりあえず読み進めました。

## ②Tech StockとBlack Beltで学習(2ヶ月)
最低限のインプットが終わったら、試験対策を始めました。
Tech Stockの#81以降をときました。
(Tech Stockは#1〜#166くらいまで問題がありますが、#1〜#80は古い問題だからやらなくて良いらしい。)
結局3週くらい解きましたが、最初の一週目はほとんど正解できませんでした。
問題を解き解説を読んでもわからない場合はBlack Beltを視聴し学習しました。

最終的にはTech Stock本試験モードの正答率が安定して85%を超える程度まで解きました。
(体験記などを読んでもこの辺が一つの目安になりそうです。)

## ③試験を予約しようとしたら・・・
勉強もいい感じで進み、そろそろ受験するかーと試験予約のページを見ると・・・・
一ヶ月先まで空いてませんでした。。。。
正確には土日はほとんど埋まっていました。
これは大反省です。まさかこんなにもテストセンターが混んでいるなんて思いませんでした。

結局、予約できる最短の日(1ヶ月後)を選択し受験しました。

## ④試験当日までひたすらTech Stockの本試験モード
試験予約につまずいてしまい、モチベーションがかなり落ちていましたが時間を見つけてTech Stockの本試験モードで学習していました。
(と言っても全然やらない日も結構ありました)

試験前日にはほとんど問題も覚えてしまっていたので、もうフラッシュ暗算のような感覚まで来ましたね。

試験当日は全然わからない！！という問題は少なく、無事に合格できました。

# 【おすすめの勉強法】
私が実際に行った経験を踏まえて、おすすめの学習手順をまとめてみました。
ぜひ、私のようにはならないでください！

## ①試験の予約をする
これが一番大事です。
受験をすることが決まったら、まずは受験日を確定しましょう。
直前になって「あれ、満席じゃん。。」とならないように注意です！
また、受験料を払うことでやらなきゃいけない環境を作るのも大事です。

## ②試験対策をする
試験の予約を終えたら早速Tech Stockの問題を解いていきましょう！
ポイントとしては「勉強→問題を解く」ではなく、「問題を解く→わからないところを勉強する」ことです。
”試験に合格する”ことが目的であればこれが一番効率的です。
インプットに時間を使いすぎず、まずはアウトプットすることが重要です。

目安としては**Tech Stockの#81以降を2周** 、**本試験モードで正答率85%以上**を安定して取れるようになれば合格圏内だと思います。

## ③最高のコンディションで試験当日を迎える
試験当日は睡眠時間を確保できるようにしましょう。(私はそのために午後に試験を受けました。)
AWS SAAはぶっちゃっけ暗記ゲーなので、わからないものは分かりません。
わかる問題を確実に取れるようにしましょう。
十分すぎるくらい見直しをすることをおすすめします！


# 【最後に】
ここまで読んでいただきありがとうございます。
最後に試験合格に向けて重要なマインドセットを紹介します。
 **「目的はあくまで試験合格」** と割り切ることです。
もちろんAWSの知識を身につけることは大切ですが、試験受験の目的は合格することです。
あまりインプットに時間をかけすぎず、とにかく問題数をこなしましょう！！
AtCoder、入茶しました！

# はじめに
🎉一時期放置していたAtCoderですが、最近再び始めて、ついに茶色になりました。🎉 

![be8db58a19e2-20230602.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206651/65758d19-b3e4-b71c-6474-ebca1e1d3f2e.png)

# 軌跡
※ここでの、ABCはAtCoder Beginner Contestの略です。
## 2019年6月～7月
競技プログラミングの存在を知り、AtCoderに登録！
初回ABCコンテストはA,B,D問題を解くという謎ムーブメントでした。(C問題が分からなかった)

しかし、そこで高校が忙しかったのか、一時停滞。競プロから離れます。

## 2021年,2022年
散発的に二回ほどコンテストに出ました。
[計算量という概念](https://qiita.com/drken/items/872ebc3a2b5caaa4a0d0)を知ったペンギン内閣。しかし、そのせいでドツボにはまることに。問題を深読みして、謎アルゴリズムを組み始める。
~~「A,B問題は愚直に実装すれば解けるよ」と過去の自分に言いたい。~~
[蟻本](https://book.mynavi.jp/ec/products/detail/id=22672)を買うも、難しくて積み本になりました。

そのせいで、A,B問題が安定して解けなくなり、レーティングが上がらなくなる。

## 2023年5月
大学生になり、再び競プロに挑戦してみるかという気持ちに。

[AtCoder Beginners Selection](https://atcoder.jp/contests/abs/)を解きました。感覚を取り戻し、ABCに再び挑戦。
ここで、[Atcoder-cliとonline-judge-toolsの環境構築をしました](https://qiita.com/PenguinCabinet/items/406a180aa91d7cfad927)。非常に便利なのでおすすめです。一々、ローカルからブラウザにコピペするの面倒くさいですしね。

[AtCoder Problems](https://kenkoooo.com/atcoder)も始め、ABCのA,B,C,Dの過去問を埋め始めました。(表が埋まっていくの気持ちいい)
D問題だと、分からないのが多くて、解説ソースコードを見て理解した後に、自分で実装しています。(最善策なのか微妙)

# 終わり
目標だった茶色になれてとりあえず、うれしいです！
そもそも、蟻本はレベルが高いようなので、緑色か水色になった時に引っ張り出そうと思います。

# 次回予告
もし、緑になったら、記事を書きます。
緑はレベルが高いので、なれるかどうか不透明ですが。
【Android】ViewPager2内のWebViewで横スクロールしたい【ViewPager2】

# はじめに

ViewPager内で横スクロールするWebViewを表示すると、スクロールが全然効かなくなる。
これはWebViewの横スクロールが、ViewPagerの横スクロールに取られてしまうため。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474683/c4630024-1230-7726-f76e-7c304256abf6.png" width="300" />

ViewPagerのタブの切り替えをタブタップのみにすれば解決はするのだけど、横スワイプも諦めたくないので、WebViewをカスタマイズして対応した。

# 解決方法

## 1.WebViewをカスタマイズする。

WebViewを継承したクラスを作成して、`onOverScrolled`と`onTouchEvent`をオーバーライドする。

```kotlin
class MyWebView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
) : WebView(context, attrs, defStyleAttr) {

    var onPagingStateChanged: ((Boolean) -> Unit)? = null

    override fun onOverScrolled(scrollX: Int, scrollY: Int, clampedX: Boolean, clampedY: Boolean) {
        super.onOverScrolled(scrollX, scrollY, clampedX, clampedY)
        onPagingStateChanged?.invoke(true)
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        super.onTouchEvent(event)
        if (event?.action == MotionEvent.ACTION_DOWN) {
            onPagingStateChanged?.invoke(false)
        }
        return true
    }
}
```

`onOverScrolled`を修正して、オーバースクロール時に`onPagingStateChanged`にtrueが流れるようにする。
`onTouchEvent`を修正して、ACTION_DOWNが来たときは`onPagingStateChanged`にfalseが流れるようにする。
この値を使ってViewPagerスワイプの許可・非許可を切り替えることで、いい感じにスクロールできるようになる。

## 2.ViewPagerのスワイプを制御する。

`onPagingStateChanged`から来た真偽値をViewModelのFlowやコールバック経由で`ViewPager2.isUserInputEnabled`に流してあげることで、制御ができる。

```kotlin
class MyActivity : AppCompatActivity() {
    private val viewModel: MyViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel.isPagingEnabled.collectWhenStarted(this) {
            binding.viewPager.isUserInputEnabled = it
        }
    }
}
```

こんな感じで実装すれば、WebViewの横スクロールが限界までいって、オーバースクロールになった瞬間のみタブの切り替えが発生する。
やってしまえば簡単だけど、前例があんまりなくて困ってしまったね。
今回はViewPager2でやったけど、似たような感じでViewPagerにも応用できると思う。

# まとめ

- ViewPager2内で横スクロールするWebViewを表示したい場合は、WebViewをカスタマイズする。
- オーバースクロールの時だけスワイプでタブ切り替えを許可してあげるとできる。

おわり。

# 参考

- https://www.youtube.com/watch?v=yi4r2kJhKhA
機械学習でデータ不均衡を解消する：ダウンサンプリングの利用

こんにちは、機械学習を学んでいる皆さん！今日は、データの不均衡という一般的な問題と、それに対する解決策の一つであるダウンサンプリングについて解説します。

# 不均衡データとは何か？
機械学習のデータセットでは、時々クラス（カテゴリ）間でサンプル数に大きな偏りがある、いわゆる「クラス不均衡」の問題に直面します。たとえば、クレジットカードの不正利用検出のような問題では、正例（不正利用）は極めて少なく、負例（正当な取引）が圧倒的に多いといった状況があります。このような不均衡があると、多数派のクラスを予測することで高い正解率を得られるため、モデルは少数派のクラスを適切に学習・予測できない場合があります。

# ダウンサンプリングとは何か？
この問題を解決するための一つのアプローチが、ダウンサンプリングです。ダウンサンプリングとは、多数派のクラスのサンプル数をランダムに削減し、少数派のクラスとの比率を均等にする手法を指します。これにより、モデルが多数派のクラスだけを学習する傾向を抑制し、全体のクラスを均等に学習することを促します。

ただし、ダウンサンプリングは、データを削除するために情報の損失が伴います。そのため、使用する際には注意が必要です。

# Pythonでのダウンサンプリングの実装
それでは、Pythonを使ってダウンサンプリングの実装方法を見てみましょう。ここでは、imbalanced-learnライブラリを使用します。これは、不均衡データに対するさまざまな再サンプリング手法を提供しています。

まず、必要なライブラリをインポートします。
```python:
from imblearn.under_sampling import RandomUnderSampler
import pandas as pd
```
次に、ダウンサンプリングを行います。RandomUnderSamplerのインスタンスを作成し、そのfit_resampleメソッドを使ってダウンサンプリングを行います。
```python:
# 多数派クラスのサンプル数を100までダウンサンプリング
sampler = RandomUnderSampler(sampling_strategy={0:100}, random_state=42)
X_resampled, y_resampled = sampler.fit_resample(X, y)
```
以上で、ダウンサンプリングが完了しました。

このようにダウンサンプリングを活用すれば、不均衡データを適切に扱い、機械学習モデルのパフォーマンスを改善することが可能です。ただし、情報の損失が伴うため注意が必要です。

# まとめ
今回は、不均衡データの問題とその解決策の一つであるダウンサンプリングについて解説しました。機械学習モデルを構築する際には、データの前処理が非常に重要であり、その中でも特にデータのバランスに注意を払うことが大切です。

次回は、ダウンサンプリングの他の代替策となる、アップサンプリングやSMOTEについて紹介しますので、お楽しみに！

以上、機械学習における不均衡データの扱い方についての解説でした。質問やコメントがあれば、お気軽にどうぞ！
確率補正とその実装：プラットスケーリングを用いた例

はじめに、私たちは分類問題で機械学習モデルを使用する際、クラスラベルだけでなく、予測確率にも注目することがあります。予測確率は特に、医療、金融、保険など、リスク評価が重要な領域でよく使用されます。しかし、モデルが出力する確率が真の確率と一致する保証はなく、カリブレーション（確率補正）が必要になることがあります。ここでは、プラットスケーリングを用いた確率補正の方法について解説します。

# プラットスケーリングとは
プラットスケーリングは、モデルが出力する確率を真の確率に近づけるための方法です。具体的には、サポートベクターマシンやブースティングアルゴリズムなどのモデルの出力をシグモイド関数に通すことで、補正された確率を得ます。

# scikit-learnでのプラットスケーリングの実装
Pythonのscikit-learnライブラリでは、CalibratedClassifierCVを使用して確率補正を行うことができます。以下にその実装例を示します。

```Python:
from sklearn.ensemble import RandomForestClassifier
from sklearn.calibration import CalibratedClassifierCV
from sklearn.metrics import log_loss
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification

# create a synthetic binary classification dataset
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# train a random forest classifier
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)

# predict probabilities
probs = rf.predict_proba(X_test)

# compute log loss
loss = log_loss(y_test, probs)
print('Log loss before calibration: ', loss)

# Now, calibrate the probabilities
calibrator = CalibratedClassifierCV(rf, method='sigmoid', cv='prefit')
calibrator.fit(X_test, y_test)

# predict calibrated probabilities
calibrated_probs = calibrator.predict_proba(X_test)

# compute log loss again
loss = log_loss(y_test, calibrated_probs)
print('Log loss after calibration: ', loss)

```

この例では、ランダムフォレストをトレーニングし、CalibratedClassifierCVを用いて確率を補正しています。そして、補正前と補正後のログロス（モデルの予測の信頼度を計測するための損失関数）を比較しています。

確率補正は、モデルの出力が確率として解釈可能な場合に重要です。特に、不均衡なデータセットに対する予測、または高い信頼性が求められる予測などで有用です。その一方で、モデルの予測精度（たとえば、精度、再現率、F1スコアなど）に影響を与えないことに注意が必要です。これらの評価指標は、予測の順序にのみ依存しているため、確率補正はその順序を変えません。

以上が、プラットスケーリングを用いた確率補正の基本的な考え方と実装になります。これが皆さんの機械学習モデリングの一助となれば幸いです。
Pythonでt-SNEを用いたデータ可視化を実装する

# はじめに
高次元データを可視化する際、t-SNE (t-Distributed Stochastic Neighbor Embedding) は非常に有用な手法として知られています。t-SNEは高次元のデータを低次元（通常は2次元または3次元）に埋め込むための手法で、特に高次元データのクラスタ構造を可視化するのに優れています。

この記事では、t-SNEについての基本的な説明と、Pythonを用いたt-SNEによるデータ可視化の実装方法について解説します。

# t-SNEとは？
t-SNEは、高次元データの相対的な距離を保持しながら、データを低次元空間（通常は2次元または3次元）に射影します。これにより、人間が理解しやすい形で高次元データを視覚化することができます。t-SNEは特に、高次元データがクラスタを形成している場合に有用であり、これらのクラスタ構造を明らかにします。

# Pythonでのt-SNEの実装
必要なライブラリのインポート
まずは、必要なライブラリをインポートします。

```python:
from sklearn.datasets import load_digits
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import seaborn as sns
```

ここでは、sklearnのdatasetsモジュールからload_digits関数を使用して手書き数字データセットをロードし、manifoldモジュールのTSNEクラスを使用してt-SNEを実行します。可視化にはmatplotlibとseabornを使用します。

# データセットのロード
次に、load_digits関数を使用して手書き数字データセットをロードします。

```python:
digits = load_digits()
```
このデータセットは8x8ピクセルのグレースケール画像64個からなる、1797個の手書き数字の画像を含んでいます。

t-SNEの適用
t-SNEの適用は非常に簡単です。TSNEクラスのインスタンスを作成し、そのfit_transformメソッドを呼び出します。

```python:
tsne = TSNE(n_components=2, random_state=42)
digits_tsne = tsne.fit_transform(digits.data)
```
このコードは、64次元の手書き数字データを2次元空間に埋め込みます。

# 結果の可視化
最後に、t-SNEにより2次元に射影されたデータをプロットします。
```python:
plt.figure(figsize=(10, 10))
sns.scatterplot(x=digits_tsne[:, 0], y=digits_tsne[:, 1], hue=digits.target, palette=sns.color_palette("hsv", 10))
plt.show()
```
このプロットでは、同じ数字は同じ色で表示され、似たような数字は空間上で近くに配置されます。これにより、t-SNEが高次元データの構造をどのように捉えるかを視覚的に理解することができます。

# まとめ
この記事では、t-SNEの基本的な説明とPythonによるt-SNEによるデータ可視化の実装方法について解説しました。t-SNEは、高次元データを人間が理解しやすい低次元空間に射影するための強力なツールであり、データのクラスタリングや異常検出など、様々なタスクで活用できます。
pam_systemd(sshd:session): Failed to create session: Maximum number of sessions (8192) reached, refusing further sessions.

/var/log/secureに以下のようなログが記録されていました。
```
crond[387333]: pam_systemd(crond:session): Failed to create session: Maximum number of sessions (8192) reached, refusing further sessions.
sshd[386880]: pam_systemd(sshd:session): Failed to create session: Maximum number of sessions (8192) reached, refusing further sessions.
```
結論から書くと再起動後事象は収まりました。

loginctl list-sessionsで確認すると確かにセッションが8192存在します。
```
$ loginctl list-sessions
SESSION  UID USER SEAT TTY
 147258 1000 user1
 147435    0 root
 147436 1000 user1
 147437 1000 user1
 147438    0 root
 147439    0 root
 147440 1000 user1
 147441    0 root
 147442    0 root

(中略)

 155618 1000 user1
 155619    0 root
 155620    0 root
 155621 1000 user1
 155622 1000 user1
 155623    0 root
 155624    0 root
 155625 1000 user1

8192 sessions listed.
```
loginctl show-sessionコマンドで詳細を確認するも何をしていいか分かりませんでした。
```
$ loginctl show-session 155624
Id=155624
User=0
Name=root
Timestamp=Thu 2023-05-04 14:05:01 JST
TimestampMonotonic=15574661310283
VTNr=0
Remote=no
Service=crond
Scope=session-155624.scope
Leader=3598257
Audit=155624
Type=unspecified
Class=background
Active=yes
State=closing
IdleHint=no
IdleSinceHint=0
IdleSinceHintMonotonic=0
LockedHint=no
$
$ loginctl show-session 155623
Id=155623
User=0
Name=root
Timestamp=Thu 2023-05-04 14:00:01 JST
TimestampMonotonic=15574360680079
VTNr=0
Remote=no
Service=crond
Scope=session-155623.scope
Leader=3597225
Audit=155623
Type=unspecified
Class=background
Active=yes
State=closing
IdleHint=no
IdleSinceHint=0
IdleSinceHintMonotonic=0
LockedHint=no
```
必要のないセッションを切ればいい気がしたのですが、who -aコマンドで確認するも、ごくごく普通でした。
psコマンドで確認しても、切ってもいいプロセスはありませんでした。
user1のセッションが3840あったのですが、そもそもuser1のプロセスは3840もありませんでした。
以上からこれ以上何をしていいか分からなかったので仕方なく再起動しました。
再起動後はセッション数はそれなりな数に戻り、今のところ着々を増えていくことはありません。
OpenAIの画像生成AI：DALL·Eをpythonから呼ぶアプリを作る

## はじめに
最近はAIの進化が著しく、画像生成に特化したStable DiffusionなどのAIが登場しています
chatGPTで話題になっているOpenAI社についても画像生成AIであるDALL·Eというモデルがあるのでこちらを用いて今回はpythonでコマンドから入力されたテキストから画像を生成してみます
APIについての導入については下記で紹介しています

https://nbaboston.net/1824.html

goやflutterでも呼んでみる記事も下記で書いてます

https://qiita.com/t_tk_work/items/2464e2c29f773ff2bccc

https://qiita.com/t_tk_work/items/156897887cc4234132b0
## pythonでのOpenAIの利用
pythonでOpen AIを利用する場合はopenaiパッケージが公式から提供されているため、こちらを利用するととても簡単です
参照)
[getting start](https://platform.openai.com/docs/api-reference/introduction)
https://platform.openai.com/docs/api-reference/images/create

簡単に下記では画像の生成をしてみます
```python
openai.organization="your Organization ID"
openai.api_key="your Api key"
response = openai.Image.create(
  prompt=text,
  n=1,
  size="1024x1024"
)
image_url = response['data'][0]['url']
```
apiキーとorganization idを入力し、promptに任意の文字列を入力することで画像を生成し、できた画像のURLがレスポンスとして帰ってきます

## 実際に作ってみる
### ソースコード
```python
import openai
import webbrowser

print("Please enter some text. When you're done, press Enter twice.")
input_text = []
while True:
    line = input()
    if line:
        input_text.append(line)
    else:
        break
text = '\n'.join(input_text)
print("Here's what you entered:")
print(text)

openai.organization="your Organization ID"
openai.api_key="your Api key"
response = openai.Image.create(
  prompt=text,
  n=1,
  size="1024x1024"
)
image_url = response['data'][0]['url']
print(image_url)

webbrowser.open(image_url)
```
上記コードでは、コマンドから入力されたテキストをOpenAIのパッケージから画像を生成してもらうようにしています。
その後、標準パッケージのwebbrowserを利用して自動的にブラウザでその画像を開くようにしています
プロンプトから入力する際は改行を可能にするため、空の文字列の行でEnterが押下された場合のみ次の処理に行くようにしています
### ソースコードの実行
対象のpythonファイルを実行してみます
```bash
python main.py
```
実行すると下記のような表示になり、自動的に既定のブラウザが開き生成された画像が表示されます
２行目でwhite catと入力し、その画像を生成してもらっています
```bash
Please enter some text. When you're done, press Enter twice.
white cat

Here's what you entered:
white cat
{生成された画像のURL}
```
できた画像が下記になります（まさにwhite catです。。。）
![スクリーンショット 2023-06-08 8.13.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3367262/237f16bf-08ae-7ad2-8c90-0037ffcbff28.png)

## まとめ
今回はpythonからOpneAIのDOLL・Eで画像生成してみました
前回、flutterやgoからchatGPTを呼んでみましたが、pythonだとパッケージが存在することにより非常に簡単にOpenAIのモデルが使用可能です
これを利用することで、chatGPT→DOLL・Eという自動的に画像生成してくれるようにできそうです
Next.jsでAPIからデータを取得するために利用するReact Hooks

## 以下の2つのFooksが扱えればOK
- useState
- useEffect

## useStateについて
useStateは、関数コンポーネントで状態を管理するためのHooksです。
以下のように記載します。
    
```typescript 
const [状態, 更新関数] = useState(初期状態);

// 例
const [count, setCount] = useState(0);
// 初期値が０の値がcountに格納される。
// setCountはcountの値を更新するための関数。
// setCount(2)としたらcountの値が2になる。
// countの値が変わるたびにレンダリングされる。
```

API経由でデータを取得するときには型の情報が必要になります。
```TypeScript
  type Article = {
    id: number;
    name: string;
    title: string;
    body: string;
    createdAt: string;
    updatedAt: string;
    };

    export default function ArticleList() {
    const [articles, setArticles] = useState<Article[]>([]);

    ...
    }
```

上記の例では、useStateの引数にArticle[]という型を指定しています。
例えば、prismaで定義したArticleモデルの型を指定することで、API経由で取得したデータを格納することができます。

## useEffectについて
useEffectは、関数コンポーネントで副作用を扱うためのHooksです。
ここでいう副作用とは、データの取得やログの出力などが当てはまります。

useEffectは、以下のように記載します。

```TypeScript
    useEffect(() => {
    // 副作用の処理
        return () => {
        // コンポーネントのアンマウント時に実行する処理
    }}, [依存する値])
```

useEffectの第一引数には、副作用の処理を記載します。
第二引数には、依存する値を指定します。依存する値が変更されたときに副作用の処理が実行されます。
useStateと一緒に使われることがあります。

```TypeScript
    const [articles, setArticles] = useState<Article[]>([]);

    useEffect(() => {
    axios
      .get("/api/article") // axiosを使用してAPIエンドポイントにGETリクエストを送信
      .then((response) => setArticles(response.data)) // レスポンスデータをセット
      .catch((error) => console.error(error)); // エラーハンドリング
  }, []);
```

上記の例では、API経由でデータを取得しています。
axiosを使用してAPIエンドポイントにGETリクエストを送信し、レスポンスデータをセットしています。
第二引数には、空の配列を指定しています。これは、コンポーネントのマウント時に一度だけ副作用の処理を実行するためです。

## 最後に
useStateとuseEffectを使いこなせば、API経由でデータを取得することができます。
より複雑な状態を扱う場合はuseReducerを使用することもあるようです。
paiza.ioでelixir その233

# 概要
paiza.ioでelixirやってみた。
良いコードを見つけたので、やってみた。

# 参考にしたページ。

https://qiita.com/nori-channel/items/431ed42492bc5a8cf489

# サンプルコード

```
if String.valid?("Hello") do
    "Valid string!"
else
    "Invalid string."
end
|> IO.inspect
if "a string value" do
    "Truthy"
end
|> IO.inspect
unless is_integer("hello") do
    "Not an Int"
end
|> IO.inspect
case {:ok, "Hello World"} do
    {:ok, result} -> 
        result
    {:error} -> 
        "Uh oh!"
    _ -> 
        "Catch all"
end
|> IO.inspect
#case :even do
#    :odd -> 
#        "Odd"
#end    
|> IO.inspect
case :even do
    :odd -> 
        "Odd"
    _ -> 
        "Not Odd"
end
|> IO.inspect
pie = 3.14
|> IO.inspect
case "cherry pie" do
    ^pie -> 
        "Not so tasty"
    pie -> 
        "I bet #{pie} is tasty"
end
|> IO.inspect
case {1, 2, 3} do
    {1, x, 3} when x > 0 ->
        "Will match"
    _ ->
        "Won't match"
end
|> IO.inspect
cond do
    2 + 2 == 5 ->
        "This will not be true"
    2 * 2 == 3 ->
        "Nor this"
    1 + 1 == 2 ->
        "But this will"
end
|> IO.inspect
cond do
    7 + 1 == 0 ->   
        "Incorrect"
    true -> 
        "Catch all"
end
|> IO.inspect
user = %{first: "Sean", last: "Callan"}
|> IO.inspect
with {:ok, first} <- Map.fetch(user, :first), {:ok, last} <- Map.fetch(user, :last), do: last <> ", " <> first
|> IO.inspect
user = %{first: "doomspork"}
|> IO.inspect
with {:ok, first} <- Map.fetch(user, :first), {:ok, last} <- Map.fetch(user, :last), do: last <> ", " <> first
|> IO.inspect
#case Repo.insert(changeset) do
#    {:ok, user} ->
#        case Guardian.encode_and_sign(user, :token, claims) do
#            {:ok, jwt, full_claims} ->
#                important_stuff(jwt, full_claims)
#            error ->
#                error
#        end
#    error ->
#        error
#end
|> IO.inspect
#with {:ok, user} <- Repo.insert(changeset), {:ok, jwt, full_claims} <- Guardian.encode_and_sign(user, :token, claims), do: important_stuff(jwt, full_claims)
|> IO.inspect
#import Integer
|> IO.inspect
#m = %{a: 1, c: 3}
|> IO.inspect
#a = with {:ok, number} <- Map.fetch(m, :a), true <- is_even(number) do 
#    IO.puts "#{number} divided by 2 is #{div(number, 2)}"
#    :even
#else
#    :error ->
#        IO.puts("We don't have this item in map")
#        :error
#    _ -> 
#        IO.puts("It is odd")
#        :odd
#end
|> IO.inspect




```

# 実行結果

```
"Valid string!"
"Truthy"
"Not an Int"
"Hello World"
"Hello World"
"Not Odd"
3.14
"I bet cherry pie is tasty"
"Will match"
"But this will"
"Catch all"
%{first: "Sean", last: "Callan"}
"Callan, Sean"
%{first: "doomspork"}
```

# 成果物

https://paiza.io/projects/acUA3ubcZ9XvTGw3E6DYtQ


以上。
paiza.ioでelixir その232

# 概要
paiza.ioでelixirやってみた。
良いコードを見つけたので、やってみた。

# 参考にしたページ。

https://qiita.com/nori-channel/items/aefc08559ae09f902821

# サンプルコード

```
x = 1
|> IO.inspect
#2 = x
|> IO.inspect
list = [1, 2, 3]
|> IO.inspect
[1, 2, 3] = list
|> IO.inspect
#[] = list
|> IO.inspect
[1 | tail] = list
|> IO.inspect
tail
|> IO.inspect
#[2 | _] = list
|> IO.inspect
{:ok, value} = {:ok, "Successful!"}
|> IO.inspect
value
|> IO.inspect
#{:ok, value} = {:error}
|> IO.inspect
x = 1
|> IO.inspect
#^x = 2
|> IO.inspect
{x, ^x} = {2, 1}
|> IO.inspect
x
|> IO.inspect
key = "hello"
"hello"
%{^key => value} = %{"hello" => "world"}
|> IO.inspect
value
|> IO.inspect
#%{^key => value} = %{:hello => "world"}
|> IO.inspect
greeting = "Hello"
|> IO.inspect
greet = fn                                       
    (^greeting, name) -> "Hi #{name}"                
    (greeting, name) -> "#{greeting}, #{name}"         
end
|> IO.inspect
greet.("Hello", "Sean")
|> IO.inspect
greet.("Mornin'", "Sean")
|> IO.inspect
greeting
|> IO.inspect




```

# 実行結果

```
1
1
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
[2, 3]
[2, 3]
{:ok, "Successful!"}
"Successful!"
"Successful!"
1
1
{2, 1}
2
%{"hello" => "world"}
"world"
"world"
"Hello"
#Function<0.3984960 in file:Main.exs>
"Hi Sean"
"Mornin', Sean"
"Hello"
```

# 成果物

https://paiza.io/projects/USMHqS0CyU9JuEH4ih7Qeg


以上。
`'chrome' is not defined`  は特定の行に対して ESLint を無効にすればいい

### React chrome extention　（Chrome拡張機能）のエラー

修正前 App.jsx
```
import React, { useEffect } from "react";

const App = () => {
  useEffect(() => {
    chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
      chrome.tabs.sendMessage(tabs[0].id, { action: "modifyDOM" });
    });
  }, []);

  return <h1 className="title">Hello, World!</h1>;
};

export default App;

```
terminal
```terminal
Failed to compile.

[eslint] 
src/App.js
  Line 5:5:  'chrome' is not defined  no-undef
  Line 6:7:  'chrome' is not defined  no-undef

Search for the keywords to learn more about each error.
ERROR in [eslint] 
src/App.js
  Line 5:5:  'chrome' is not defined  no-undef
  Line 6:7:  'chrome' is not defined  no-undef

Search for the keywords to learn more about each error.

webpack compiled with 1 error
```

chromeこの問題を回避するには、オブジェクトが で使用されている特定の行に対して ESLint を無効にしますApp.js。/* eslint-disable */次のように、エラーの原因となっている行の前にコメントを追加します。

App.jsx
```jsx
import React, { useEffect } from "react";

const App = () => {
  useEffect(() => {
    /* eslint-disable */
    chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
      chrome.tabs.sendMessage(tabs[0].id, { action: "modifyDOM" });
    });
    /* eslint-enable */
  }, []);

  return <h1 className="title">Hello, World!</h1>;
};

export default App;
```
このコメントは、ESLint に特定の行を無視し、オブジェクトに対して「未定義」エラーを発生させないように指示しますchrome。

この変更により、コードは ESLint エラーなしでコンパイルされるはずです。chromeただし、これらの行に対して ESLint を無効にすると、オブジェクトの未定義の参照がチェックされなくなることに注意してください。このコードを適切に実行するために必要な Chrome 拡張機能コンテキストがあることを確認してください。






参考
ChatGPT-4
https://chat.openai.com/share/72510a1a-0fa8-419e-9095-45623dadc3b0

Chrome extention
https://developer.chrome.com/docs/extensions/mv3/content_scripts/#matchAndGlob
02-04ファイル管理、02-05マルチメディア

## ファイル管理
OSの重要機能の一つ。磁気ディスクなどの補助記憶では、プルグラムやデータはファイル単位で格納され、ファイルはディレクトリを用いて管理されています。
階層構造の最上位にあるディレクトリをルートディレクトリといい
ディレクトリの下位に作成されたディレクトリはサブディレクトリと呼ばれ
カレントディレクトリは，現在，操作対象であるディレクトリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/9c567375-960b-4665-dbaa-b07e83e7b6c7.png)

### パス指定
　絶対パス　ルートディレクトリを基点に，目的となるディレクトリや
ファイルまでの経路を指定す
　相対パス　カレントディレクトリを基点に，目的となるディレクトリ
やファイルまでの経路を指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/56b7a196-b402-4c48-a335-4cc704bb43a4.png)
1階層上のディレクトリに移動する　　..

### データのバックアップ

フルバックアップ 
磁気ディスクに保存されている全てのデータをバックアップする
差分バックアップ 　バックアップの時間が長い、復元する時間は短く
前回のフルバックアップ以降に変更されたデータをバックアップする
増分バックアップ 
前回のバックアップ以降に変更されたデータをバックアップする
バックアップの時間が短くて済みますが，復元するにはフルバックアップファイルに，それぞれ差分バックアップと増分バックアップを反映させる必要があるため，復元時間が長い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/6b430e88-e72c-1a32-519a-d6e16eeddc28.png)

## マルチメディア
### 静止画・動画
ある決まり事に従って，データのサイズを小さくすることを圧縮といい，逆に元に戻すことを解凍（伸長）といい。データの圧縮には，圧縮した画像を完全に復元できる可逆圧縮方式と，完全に復元できない不可逆圧縮方式
静止画や動画のファイル形式
BMP　Microsoft（Windows）標準。フルカラー（約1,677万色）。圧縮されないため容量が大きい。壁紙などに使われる
GIF 256色。可逆圧縮。イラストやアイコンなどに使われる
PNG 256色（PNG-8）と，フルカラー（PNG-24）の2種類。可逆圧縮。部分的に透明にすることができる。Web用の画像などに使われる
JPEG 国際標準規格。フルカラー。不可逆圧縮。写真などに使われる

動画 MPEG
国際標準規格。不可逆圧縮。MPEG-1はビデオCD用，MPEG-2はDVD 
やデジタル放送用の規格。MPEG-4はMPEG-2よりも圧縮効率が高く，
ビデオカメラやワンセグ放送で用いられており， H.264/MPEG-4	
AVC として規格化されている。なお，MP3はMPEG1の音声部分の圧
縮アルゴリズムを使用した音声データの圧縮形

### マルチメディアの応用
#### CG　コンピュータグラフィックス （CG：Computer Graphics）
コンピュータを使っ
て画像を処理・生成する技術，またその画像のこと
アンチエイリアシング（ギザギザに見えない）斜め線や曲線などに発生するギザギザ（ジャギー）を目立たなくする
テクスチャマッピング　質感を与える
シェーディング　影付け
レイトレーシング　光源追跡
クリッピング　clipping：切り取る
モーフィング　morphing：動き＋形態
レンダリング　rendering：描写　物体のデータとして与えられた情報を計算によって映像化する
ポリゴン　立体の形状を表現するときに使用する基本的な要素。三角形や四角形などが用いられる。
モーションキャプチャ　motion capture：動きをとらえる　動作捕捉
ソリッドモデル　物体を，中身の詰まった固形物として表現する
ワイヤーフレーム　物体を，頂点と頂点をつなぐ線で結び，針金で構成されているように表現する
サーフェスモデル　物体を，面や曲面の集まりとして表現する
隠線消去　物体の裏側で見えていない線を描画しないようにする
メタボール　物体を球やだ円体の集合として擬似的にモデル化する
ラジオシティ　物体同士の相互反射も考慮して物体の明るさを決定する
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/f3fe73b5-8d7f-d272-841e-b0eadd4d2b3b.png)
#### VR
バーチャルリアリティ（VR：Virtual Reality）
仮想の空間に入り込んだような効果を生み出す技術
#### AR
目の前にある現実の情景や風景の映像をコンピュータに取り込み，現実には存在しない仮想の情報を合成して映し出す技術
【S3 Kotlin】ユーザー定義メタデータの設定方法

## メタデータの設定方法

S3からファイルを取得して、メタデータを設定した後にS3に登録する手順をKotlinで記述する

```kotlin:Kotlin
// S3クライアントの作成
val s3Client = AmazonS3Client.builder()
  .withRegion(Regions.AP_NORTHEAST_1)
  .build()

// S3オブジェクトを取得するためのリクエストを作成
val getObjectRequest = GetObjectRequest(backetName, objectKey)
// S3オブジェクトの取得
val s3Object = s3Client.getObject(getObjectRequest)

// メタデータの設定
val metadata = ObjectMetadata().apply { userMetadata["user-defined-key"] = "value" }

s3Object.objectContent.use {
  // S3オブジェクトを登録するためのリクエストを作成
  val putObjectRequest = PutObjectRequest(backetName, objectKey, it, metadata)
  // S3オブジェクトの登録
  s3Object.putObject(putObjectRequest)
}
```

## Gradleの設定

**Gradleを使用している場合**、依存関係をdependenciesに記載する

```kotlin:build.gradle
dependencies {
  implementation("com.amazonaws:aws-java-sdk-kms:ここにバージョン")
  implementation("com.amazonaws:aws-java-sdk-s3:ここにバージョン")
}
```

`com.amazonaws:aws-java-sdk-kms`のバージョンは[ここ](https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-kms)で確認する
`com.amazonaws:aws-java-sdk-s3`のバージョンは[ここ](https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3)で確認する

## Mavenの設定

**Mavenを使用している場合**、[ここ](https://docs.aws.amazon.com/ja_jp/sdk-for-java/latest/developer-guide/setup-project-maven.html)を参考に設定

`com.amazonaws:aws-java-sdk-kms`のバージョンは[ここ](https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-kms)で確認する
`com.amazonaws:aws-java-sdk-s3`のバージョンは[ここ](https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3)で確認する

## メタデータの確認方法

メタデータが設定できたか確認する方法を記載する


1. AWSマネジメントコンソールにサインイン
1. S3の対象オブジェクトへ
1. `プロパティ` > `メタデータ`を確認
1. 設定したメタデータのキー(`x-amz-meta-user-defined-key`)があれば🙆‍♂️

※メタデータのキーは`x-amz-meta-` + `自身で設定したキー`となる
MySQLのインストール直後起動後コマンドまとめ

# MySQLのインストール直後起動後コマンドまとめ
### 1.パスワードなしログイン
```sql
mysql -u root
```
### 2.データベース確認
```sql
mysql> show databases;
```
### 3.データベース作成
```sql
mysql> create database データベース名;
```
### 4.データベースの指定
セミコロンがいらない
```sql
mysql> use データベース名
```
### 5.データベースの削除
```sql
drop database データベース名;
```

### 5.指定したデータベース内でテーブル作成
こっから予約語は大文字
```
CREATE TABLE テーブル名
(カラム名  データ型[カラム属性],
 :
 :
 オプション属性(カラム名)
);
```

データ型：CHAR, VARCHAR, INT, DATAなど
カラム属性：NOT NULLなど
オプション属性：FOREIGN KEY, PRIMARY KEY, REFERENCES テーブル名(カラム名)

### 6.ログアウト
```sql
mysql> exit
```
Docker Compose YAMLファイルで環境変数を解析させない方法

## TL;DR 

もし `$var` を Docker Compose に解析させたくないなら、**二重ドル記号** つまり `$$var` を使ってください。

## 経緯

Docker Composeを使って開発環境を作りたいと思って、下記のように Redis サービスの定義がある。

```yaml
version: '3'
services:
  # ...省略
  redis:
    image: redis:7-alpine
    entrypoint: /bin/sh
    command: -c 'exec redis-server --requirepass "$REDIS_PASSWORD" --loglevel verbose'
    environment:
      REDIS_PASSWORD: "changeme"
    ports:
      - '6379:6379'
```

`command`の Value にある `$REDIS_PASSWORD` は、コンテナーが起動するときにenvironmentで指定した変数に入れ替えられるはずだが、実際に空白になる。なぜというと、composeには [environment var subsitution](https://docs.docker.jp/compose/environment-variables.html) という機能があって、`docker compose up`を実行時に、シェル内 に定義された`REDIS_PASSWORD`環境変数の値を探し、その値を展開する。定義されてないなら、当然空白になる。

とても素晴らしい機能だと思いますが、ここでは問題を起こした。

回避策として、二重ドル記号を使えればそのまま展開しなくて済む。
SOQLで取得したレコードを項目の値ごとに切り分ける処理

# レコードを分類わけする処理
最近よくレコードをdatatableで表示するコードを書くんですが、レコードの特定の項目でdatatableの中身を出し分けたいな～ってなるわけです。
SOQLで取得したレコードを、分けていく時にいつもこんがらがってしまうので備忘録です。
```Apex:RecordSeparate.cls
@AuraEnabled
public static List<DataTableInfo> getRecord() {
    // サブクラスのリスト定義
    List<DataTableInfo> infoList = new List<DataTableInfo>();

    // オブジェクトのレコードをFieldAの昇順で取得
    List<Account> recordList = [SELECT Id
                                    ,FieldA
                                    ,FieldB 
                                    FROM Account 
                                    ORDER BY FieldA];

    String currentFieldA = '';
    DataTableInfo info = null;

    // レコードを項目ごとにまとめる
    for (Account record : recordList) {
        String fieldA = record.FieldA;

        // 項目の値が変わったら新しいDataTableInfoを作成
        if (fieldA != currentFieldA) {
            currentFieldA = fieldA;
            info = new DataTableInfo(fieldA);
            infoList.add(info);
        }
        // レコードをカテゴリに追加
        info.recordList.add(record);
    }
    return infoList;
}
// datatableで表示する用のサブクラス
public class DataTableInfo {
    // FieldA
    @AuraEnabled public String fieldA {get;set;}
    // レコードリスト
    @AuraEnabled public List<Account> recordList {get;set;}
    // コンストラクタ
    public DataTableInfo(String fieldA) {
        this.fieldA = fieldA;
        this.recordList = new List<Account>();
    }
}
```
これでFieldAを、切り分けしたい項目に変更しAccountを対象のオブジェクトに変更すれば処理は完成。

このサブクラスをlwc側で、for:eachなどの繰り返し処理で動的に表示が可能になる。
よくやるのは、FieldAをタブにしてタブごとにdatatableを表示するやり方。

ただデータ数が多いと動きがとても重いので、データ数に応じて段階的に取得するなどの配慮は必要。
その点については、また今度書きます。
Shell Script: 並列実行して処理実行時間を出力してみてみた

シェルスクリプトで直列処理と並列処理の実行速度を比較したいということで、
前回の [curl コマンドで Object Storage へファイルをマルチパート・アップロード](https://qiita.com/shirok/items/0c891eec869f4454f4d3#-curl-%E3%81%A7-%E3%83%9E%E3%83%AB%E3%83%81%E3%83%91%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89)する処理を、バックグラウンドで同時に実行できるようにして、すべての分割コマンドが終了したら、実行時間を出力するスクリプトを作成してみてみます。

# ■ 参考処理
今回は、次の内容の マルチパート・アップロードコマンド 処理を使用して並列スクリプトを作成します。
・[[Oracle Cloud] curl コマンドで Object Storage へファイル Upload/Download してみてみた](https://qiita.com/shirok/items/0c891eec869f4454f4d3)

https://qiita.com/shirok/items/0c891eec869f4454f4d3

# ● マルチパート・アップロードコマンド群
次の5つあるコマンドを並列実行して実行時間を出力するスクリプトを作成します。
```
curl -X PUT --data-binary '@x00' https://objectstorage.ap-tokyo-1.oraclecloud.com/p/Gqte6y5OoWPjEYOzAj-wuHDpy/n/shirok/b/OCI-Bucket/u/1G-File.txt/id/057e65-5f32-4efc-7dbc/1
curl -X PUT --data-binary '@x01' https://objectstorage.ap-tokyo-1.oraclecloud.com/p/Gqte6y5OoWPjEYOzAj-wuHDpy/n/shirok/b/OCI-Bucket/u/1G-File.txt/id/057e65-5f32-4efc-7dbc/2
curl -X PUT --data-binary '@x02' https://objectstorage.ap-tokyo-1.oraclecloud.com/p/Gqte6y5OoWPjEYOzAj-wuHDpy/n/shirok/b/OCI-Bucket/u/1G-File.txt/id/057e65-5f32-4efc-7dbc/3
curl -X PUT --data-binary '@x03' https://objectstorage.ap-tokyo-1.oraclecloud.com/p/Gqte6y5OoWPjEYOzAj-wuHDpy/n/shirok/b/OCI-Bucket/u/1G-File.txt/id/057e65-5f32-4efc-7dbc/4
curl -X PUT --data-binary '@x04' https://objectstorage.ap-tokyo-1.oraclecloud.com/p/Gqte6y5OoWPjEYOzAj-wuHDpy/n/shirok/b/OCI-Bucket/u/1G-File.txt/id/057e65-5f32-4efc-7dbc/5
```

# ■  並列スクリプト作成
今回、ファイル・サイズが 1024MB(1GB)のファイル転送速度が出るように算出し出力できるようにします。

```:Parallel.sh
#!/bin/bash
echo "ファイル転送開始 : $(date)"
start_date=$(date +'%s')

multipart_url="https://objectstorage.ap-tokyo-1.oraclecloud.com/p/Gqte6y5OoWPjEYOzAj-wuHDpy/n/shirok/b/OCI-Bucket/u/1G-File.txt/id/057e65-5f32-4efc-7dbc/"

curl -X PUT --data-binary '@x00' "${multipart_url}1" &
curl -X PUT --data-binary '@x01' "${multipart_url}2" &
curl -X PUT --data-binary '@x02' "${multipart_url}3" &
curl -X PUT --data-binary '@x03' "${multipart_url}4" &
curl -X PUT --data-binary '@x04' "${multipart_url}5" &

if wait; then
	echo "ファイル転送成功 : $(date)"
	end_date=$(date +'%s')
	time=$((end_date - start_date))
	echo "実行時間: $time 秒"
	echo "実行速度: $((1024 * 8 / $time)) Mbps"
	exit 0
else
	echo "ファイル転送失敗"
	date
	exit 1
fi
```



## ● 実行と出力結果
```
shirok@macbook TEMP % bash Parallel.sh
	ファイル転送開始 : Thu Jun 8 01:18:55 JST 2023
	ファイル転送成功 : Thu Jun 8 01:19:23 JST 2023
	実行時間: 28秒
	実行速度: 288Mbps
```

# ■ 参考
・ [expr(1) — Linux manual page](https://man7.org/linux/man-pages/man1/expr.1.html)
・ [wait(2) — Linux manual page](https://man7.org/linux/man-pages/man2/wait.2.html)
VSCodeのLiveShareで全てのファイルを共有する方法

ワーキングディレクトリ直下に以下のファイルを作成する。

```.vsls.json
{
  "$schema": "http://json.schemastore.org/vsls",
  "gitignore": "none"
}
```

## 参考

https://learn.microsoft.com/ja-jp/visualstudio/liveshare/reference/security
【Firebase】Realtime Databaseを使ってチャットを作る。

```html
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>
        <div>
            名前：<input type="text" id="uname">
        </div>
        <div>
            <textarea id="text" cols="30" rows="10"></textarea>
            <button id="send">送信</button>
        </div>
        <div id="output" style="overflow: auto;height: 300px;"></div>
    </div>

    <script type="module">

        // Import the functions you need from the SDKs you need
        import { initializeApp } from "https://www.gstatic.com/firebasejs/9.22.1/firebase-app.js";
        // TODO: Add SDKs for Firebase products that you want to use
        // https://firebase.google.com/docs/web/setup#available-libraries
        import { getDatabase, ref, push, set, onChildAdded, remove, onChildRemoved } 
        from "https://www.gstatic.com/firebasejs/9.22.1/firebase-database.js";
      
        // Your web app's Firebase configuration
        const firebaseConfig = {
          apiKey: "×××××××××",
          authDomain: "×××××××××",
          databaseURL: "×××××××××",
          projectId: "×××××××××",
          storageBucket: "×××××××××",
          messagingSenderId: "×××××××××",
          appId: "×××××××××"
        };
      
        // Initialize Firebase
        const app = initializeApp(firebaseConfig);

        const db  = getDatabase(app);
        const dbRef = ref(db,"chat");
        const output = document.getElementById("output");

        const uname = document.getElementById("uname");
        const text = document.getElementById("text");
        
        //データ登録
        send.addEventListener("click",function() {
            const msg = {
                uname: uname.value,
                text: text.value
            }
            const newPostRef = push(dbRef);
            set(newPostRef, msg);
        });

        //データ登録
       text.addEventListener("keydown",function(e){
            console.log(e);
            if(e.keyCode == 13){
                const msg = {
                    uname: uname.value,
                    text: text.value
                }
                const newPostRef = push(dbRef);
                set(newPostRef, msg);
            }
        });


        onChildAdded(dbRef, function(data){   
            const msg  = data.val();
            const key  = data.key;

            let new_element = document.createElement('p');
            new_element.textContent = msg.uname  + ':' + msg.text;
            output.appendChild(new_element);
        });

      </script>
</body>
</html>
```
Reduxめも


久々に案件で触るので復習

# Provider

指定したコンポーネントがどのstoreを使用するか決める。

多くのケースでは、ルート階層のコンポーネントをProviderでラップして、そことstoreを紐づけている。

（その下のコンポーネントでstoreを参照することができる）

# Connect

各コンポーネント単位でどのstoreを参照してどのアクションをdispatchするか決めている。

（コンポーネントを指定する形で使用する）

メリットは以下

- ルート階層以下のコンポーネントでのstoreバケツリレーを防げる
    - Providerでラップされたコンポーネントしかstoreを知れないので下階層はバケツリレーするしかないらしい？（曖昧）
- storeのstateの値を変更できるコンポーネントを制限できて保守性をUPできる

connectを使う上で必要な概念が二つ

## mapStateProps

connectで指定したコンポーネントで、どのstateを使用するか決める。

こんな感じ

```jsx
const mapStateProps = ({ count }) => ({ count });
```

以下の略でこう記述できる

```jsx
const mapStateProps = state => {
  return { count: state.count };
};
```

## mapDispatchProps

connectで指定したコンポーネントで、どのActionをdispatchするか決める。

アクションを実行する役割のdispatch関数を作成している。

```jsx
const mapDispatchProps = dispatch => ({
  increment: count => {
    dispatch(increment(count));
  },
  decrement: count => {
    dispatch(decrement(count));
  }
});
```

connectはこんな感じで使う。

指定したコンポーネントで、mapDispatchPropsで定義したdispatch関数やmapStatePropsで指定したstateを、propsとして受け取ることができる。

```jsx
connect(
  mapStateProps,
  mapDispatchProps
)(Component);
```

## contaienr

ロジックに責任を持つコンポーネントのこと

containerでmapStatePropsやらmapDispatchPropsやらconnectをまとめることが多い

```jsx
import { connect } from "react-redux";
import { increment, decrement } from "../../redux/count/actions";
import Counter from "./presentation";

const mapStateProps = ({ count }) => ({ count });

const mapDispatchProps = dispatch => ({
  increment: count => {
    dispatch(increment(count));
  },
  decrement: count => {
    dispatch(decrement(count));
  }
});

export default connect(
  mapStateProps,
  mapDispatchProps
)(Counter);
```

## presentational

表示にだけ責任を持つコンポーネントのこと

こんな感じで、dispatch関数やstateをpropsで受け取ることができる。
```jsx
import React from "react";

const Counter = ({ count, increment, decrement }) => (
  <>
    <div>{count}</div>
    <button onClick={() => increment(1)}>+</button>
    <button onClick={() => decrement(1)}>-</button>
  </>
);

export default Counter;
```
venvコマンド(Windows, Mac, Linux)

# venvのコマンド備忘録
## 1.概要
venvを使う際に毎回調べていた仮想環境の構築、有効化、無効化のコマンドを備忘録にしました。シェルごとにコマンドが微妙に違うのでWindowsのコマンドプロント、Mac(zsh)&Linux(bash)ごとにまとめました。
### 1.1 venvとは
venvとは、Pythonの標準の言語処理系が持つ機能の一つで、システム上にPythonが動作する仮想的な環境（virtual environment）を作り出すもの。同じシステム上に複数の独立した環境を構成して使い分けることができる。[引用：IT用語辞典 e-Words.
venvとは - 意味をわかりやすく](https://e-words.jp/w/venv.html)



## 2.Windows コマンドプロンプト
### 1.構築
```bash
py -m venv 仮想環境名
 ```
### 2.構築した仮想環境を有効化
```
仮想環境名\Scripts\activate.bat
```
### 3.無効化
```bash
deactivate
```

## 3.Mac (zsh) & Linux(bash)
### 1.構築
```bash
python3 -m venv 仮想環境名
 ```
### 2.構築した仮想環境を有効化
```
. 仮想環境名/bin/activate
```
### 3.無効化
```bash
deactivate
```
以上になります。

必要な補足情報や誤植があれば教えていただけると幸いです。
「/etc/samba/smb.conf」の[global]セクションにて使われるマスターブラウザ関連の主な設定項目

●「/etc/samba/smb.conf」の[global]セクションにて使われるマスターブラウザ関連の主な設定項目

・os level=数値　ブラウザ選定時に宣言する優先度を指定。数値が大きいほど優先度が高い
・local master=yes|no　ブラウザ選定に参加するかしないかを指定
・preferred  master=yes|no　ブラウザ選定を要求するかしないかを指定


●マスターブラウザ
ブラウザリスト（Windowsネットワーク内にあるコンピュータのリスト）を管理するコンピュータのこと。どのホストがマスターブラウザになるかは、OSの種類による優先度(OSレベル)などで変わる。