OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptの理解を深める

# JavaScriptとは

* クロスプラットフォームで動作するオブジェクト指向のスクリプト言語
* プロトタイプベースのオブジェクトモデル
* インタープリター型、あるいは実行時コンパイルされる、第一級関数のプログラミング

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Introduction



## クロスプラットフォームで動作するオブジェクト指向のスクリプト言語

### クロスプラットフォーム 
iOS,Andriod,Windows,macOSなど異なるプラットフォーム上で同じ仕様のアプリケーションを動かせるプログラムのこと

### オブジェクト指向
処理を部品化して、部品を組み合わせることで１つのプログラムを作る考え方

https://unison-career.com/engineer-media/6250/

### スクリプト言語
プログラミング言語のうち、比較的容易に記述や実行ができるもの（厳密な定義は存在しない）

https://www.akkodis.co.jp/candidate/insight/column_77



## プロトタイプベースのオブジェクトモデル

オブジェクト指向プログラミングにはクラスベースとプロトタイプベースがある

### クラスベース
オブジェクト生成は設計図となる「クラス」を用いる。設計図である「クラス」を生成されたものがオブジェクトでありこれを「インスタンス」という。

クラスベース言語の例）
JavaやPHP、Ruby、Python

### プロトタイプベース
オブジェクトを素にして新しいオブジェクトを生成する。
新しく生成したオブジェクトに雛形であるオブジェクトが継承される。

```javascript
const obj = {}
console.log(obj)

{}
// ↓　雛形（プロトタイプ）から継承されたもの
[[Prototype]]
Object
constructor
ƒ Object()
hasOwnProperty
ƒ hasOwnProperty()
isPrototypeOf
ƒ isPrototypeOf()
propertyIsEnumerable
ƒ propertyIsEnumerable()
toLocaleString
ƒ toLocaleString()
toString
ƒ toString()
valueOf
ƒ valueOf()
__defineGetter__
ƒ __defineGetter__()
__defineSetter__
ƒ __defineSetter__()
__lookupGetter__
ƒ __lookupGetter__()
__lookupSetter__
ƒ __lookupSetter__()
__proto__
(...)
get __proto__
ƒ __proto__()
set __proto__
ƒ __proto__()
```

プロトタイプベース言語の例）
JavaScript

https://typescriptbook.jp/reference/values-types-variables/object/prototype-based-programming



## インタープリター型、あるいは実行時コンパイルされる、第一級関数のプログラミング

### インタープリタ型言語
ソースコードを1行ずつバイナリーコードに翻訳（変換）しながらプログラムを実行するプログラミング言語

メリット
デメリット

※インタープリタ型言語に対して、コンパイル型言語もある

**コンパイル言語**
ソースコードをコンパイラ処理でバイナリコードに一括で翻訳（変換）し、プログラムの処理を実行させるプログラミング言語

メリット
デメリット

https://www.tokai-bs.co.jp/trends/column-350/


### 実行時コンパイル（JUST-IN-TIME compiler）
ソースコードや中間コードから機械語への変換処理を実行直前にまとめて行なう

コンパイラ言語とインタプリタ型言語の中間のような処理を行う

https://e-words.jp/w/JIT%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9.html#:~:text=JIT%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%20%E3%80%90Just%2DIn%2DTime%20compiler%E3%80%91&text=JIT%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%EF%BC%88Just%2DIn%2D,%E3%82%92%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AB%E8%A1%8C%E3%81%86%E3%80%82


### 第一級関数
関数を第一級オブジェクトとして扱うことのできるプログラミング言語の性質、またはそのような関数のこと

＝　単なる値として関数を扱えること

**第一級オブジェクト**
あるプログラミング言語において、たとえば生成、代入、演算、（引数・戻り値としての）受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のこと

https://tadtadya.com/what-is-first_class/
【Drupal】外部からAPI叩いた時に出たエラーとその解決方法

# はじめに

https://qiita.com/kmmch/items/57ae5071fcd27b8626fc

こちらの記事にてDrupalで実装したAPIへアクセス可能にする設定をご紹介しました。
React×TSで作成したアプリケーションからDrupalAPIへアクセスした時に試行錯誤したことをまとめてみました。

# アプリケーションの（超）概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/645da234-91df-64d7-4186-9b7ad5214786.png)


# 発生したエラーとその解決方法
## Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.

### 解決方法
許可するリクエストヘッダーをDrupal側で設定する

### エラー内容
リクエストヘッダーに含まれるcontent-typeが許可されてない

### 解決方法の詳細
services.ymlで許可したいリクエストヘッダーを記載する
```yml
cors.config:
    enabled: true
    # Specify allowed headers, like 'x-allowed-header'.
    # allowedHeaders: [] # 修正前
    allowedHeaders: ['X-CSRF-Token','Content-Type'] # 修正後の実装例
```
+ services.yml作成時はこれが空なのでなにかしら記載する必要があります。
+ `*`（全てのリクエストヘッダー）が使用可能です。（安全にしたいならあまりオススメしない）
+ allowMethodsも同様です。

 ## 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. 

 ### エラー全文
 Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute

 ### 解決方法
 postする内容から`withCredentials: true`を削除する

 ### エラー内容詳細
 Credentialsモードを有効にするならAccess-Control-Allow-Originに`*`は指定しないでね

 ### 解決方法の詳細
 Drupal APIに対してPOSTリクエストを送った時に発生したのですが、
 この時クライアント側では`withCredentials: true`を設定していました。

 https://www.drupal.org/forum/support/module-development-and-code-questions/2018-06-28/correct-format-for-a-post-request#comment-12714899

 どうやらこれを有効にしているならワイルドカードは指定できないよ。というエラーですので`withCredentials: true`を削除しました。

 ```typescript:post.tsx
await axios.post(
    'Endpoint URL',
    values,
    {
        headers: headers,
        // withCredentials: true // ここを削除した
    },
);
 ```

 :::note info
withCredentials: true
この設定自体はCookieをHTTPヘッダに付ける設定（らしい）
:::

# おわりに
この記事ではDrupalAPIを叩いた時のエラーとその解決方法についてご紹介しました。
同様のエラーに遭遇しましたら、ぜひ参考にしてみてください。
（HTTPヘッダとかリクエストについてもっと勉強しないとなぁ）
Pythonでフラグとかを活かして正規表現をわかりやすく書く

## 動機
青空文庫をスクレイピングして, 自然言語処理を行おうとしていましたが, ルビを振ってくれる\<ruby>のタグが邪魔でした. そこで, 正規表現を活かして, わかりやすく\<ruby>タグを漢字に直していきます. 
以下では, まずコードの全体像を示し, 次に解説を行います.

## コード
```eraseRuby.py
import re

def erase_ruby(text: str) -> str:
    rubyre = re.compile(
        r"""<ruby>[\s\S]*?
        <rb>(?P<kanji>[\s\S]+?)</rb>[\s\S]*? # 漢字
        <rt>(?P<kana>[\s\S]+?)</rt>[\s\S]*? # かな
        </ruby>""",
        re.VERBOSE
    )
    text = rubyre.sub(r"\g<kanji>", text)
    return text
# 青空文庫収録の偽悪病患者
# https://www.aozora.gr.jp/cards/001872/files/61288_76523.html より
text = """お兄様だけれど、<ruby><rb>喬子</rb><rp>（</rp><rt>きょうこ</rt><rp>）</rp></ruby>、今度の御手紙だけはよく判んない。"""
print(erase_ruby(text))
```
```bash
$ py eraseRuby.py
お兄様だけれど、喬子、今度の御手紙だけはよく判んない。
```

## 解説
Pythonでは, re.VERBOSEフラグを使うことで正規表現に空白を入れたり, 正規表現にコメントを書いたりすることができます. これを使って, \<ruby>タグにマッチするよう作った正規表現は以下のようになります.
```python
    rubyre = re.compile(
        r"""<ruby>[\s\S]*?
        <rb>(?P<kanji>[\s\S]+?)</rb>[\s\S]*? # 漢字
        <rt>(?P<kana>[\s\S]+?)</rt>[\s\S]*? # かな
        </ruby>""",
        re.VERBOSE
    )
```
コード内に出てきた`(?P<kanji> ... )`の表現について, これは[名前付きグループ](https://docs.python.org/ja/3/howto/regex.html#non-capturing-and-named-groups)と呼ばれるものです. 
普通のグループ化は`group(0)`のように数字で取り出しますが, 名前付きグループを使えば`group("kanji")`のように, 文字列で取り出すことができるようになるので, 可読性向上につながると考えられます.

次に, \<ruby>タグ全体を\<rb>タグの中身と置き換えることで目的を達成します.これにはre.sub関数を用います.
```python
re.sub("\g<kanji>", text)
```
Pythonの置換関数は高性能で, 第一引数には文字列、または関数, 第二引数には処理する文字列を入れます.
第一引数に\g<...>を含む文字列を入れたとき, ...の部分をグループ名としたグループが実際には置換されます.

## 感想
ドキュメント, 暇なときに読んでみると知らない仕様とか書いてあって結構楽しいです。
【書評】体系的に学ぶ 安全なWebアプリケーションの作り方

# 読んだ本

https://www.sbcr.jp/product/4797393163/

# 概要

Webアプリで起こり得る脆弱性を、タイトル通り体系的に学べる本でした。初学者でも、少し負荷は高いですが網羅的に学べるのでとてもいい本だと思います。
全体的に名前や原理だけを知っていたものが多かったですが、具体的にどう起こされるのかという手段についても細かく説明されていて勉強になります。
7章以降、Webサーバーの脆弱性の診断方法や、開発についても言及されているところも良かったです。

下記目次になっています。

1章 Webアプリケーションの脆弱性とは
2章 実習環境のセットアップ
3章 Webセキュリティの基礎 ～HTTP、セッション管理、同一生成元ポリシー
4章 Webアプリケーションの機能別に見るセキュリティバグ
5章 代表的なセキュリティ機能
6章 文字コードとセキュリティ
7章 脆弱性診断入門
8章 Webサイトの安全性を高めるために
9章 安全なWebアプリケーションのための開発マネジメント

# おすすめの人

- Webセキュリティが全然わからない初学者
- XSSやSQLインジェクションなど、原理は理解しているけど、どう起きるのかが知りたい人

# 次に読むなら

- 本書ではPHPが例になっていますが、Rubyなど他の言語でも起こり得るため、自分がよく使っているフレームワークがどう対策しているのか調べるのが次のステップになりそうです。OSSだったらソースコードを読んでみるのが一番良さそうです

# 感想

内容やどうして起きるのか知っているものが多かったが、どうやって攻撃されているのか理解しきれていなかった箇所が多く、勉強になりました。
基本的にはバッドプラクティスとされていたり、フレームワーク側の機能を適切に使っていれば回避できることが多いため、実際の開発の場面で問題になることは少なくなっているかとは感じました。
ただ、問題が発生した場合の被害範囲がとても大きくなってしまう可能性もあり、必須の知識だと思います。
昔、SQLインジェクションし放題のアプリケーションが納品されていて冷や汗をかいた記憶を思い出しました笑
ABC343挑戦メモ

# 0. はじめに（結果と感想）
　今年に入って3回目のAtCoderの挑戦。
　前回のABC344に引き継ぎA～Bは簡単で、C問題も難なく解けました。
　D問題はあっているはずなんだけれども、合わない！正解にならない！
　まだまだアルゴリズムについての考え方や知識、経験が足りなかったみたいです。
　レートは全参加回数が5回なので、レートは+28の87となりました。
　
# 1. A - Wrong Answer
　自分の結果：AC
　自分はswitch文を用いて解答を求めるように記述したけども、今見返してみたらもっと簡単に解けた。
　何も難しく考えなくとも「A+B=1なら0を、それ以外なら1を出力する」これだけでよかった。
　https://atcoder.jp/contests/abc343/submissions/50779547

# 2. B - Adjacency Matrix 
　自分の結果：AC
　問題文を読んでもよくわからなかったので、入出力から求められているであろうことを予測して作成。
　入力値を配列に入れて0/1チェックをするだけで記述してクリア。
　ただ、問題文がよくわからず、1になっている頂点を選択するだけで本当に良かったのだろうかという疑問が残る。
　https://atcoder.jp/contests/abc343/submissions/50796474

# 3. C - 343 
　自分の結果：AC
　入力値以下の立法数を求めリストに入れる、立法数が回文になっているかを確認する、回文立法数で最大のものを出力する、という処理でクリア。
　ただ、以下というところを未満と誤って作成してしまい、いたずらに時間を消費してしまった。
　原因がわかれば問題は簡単なものだった。
　https://atcoder.jp/contests/abc343/submissions/50826339

# 4. D - Diversity of Scores
　自分の結果：WAでタイムアップ
　リストを用いて解けば何とかなるかなと思ったものの、なぜかAt,Btの時だけ解が正しくならないという問題に直面。
　なんか、Pythonのdictionaryなどのデータ構造を使うのが有用らしい。
　タプルとかを使えばcsでもうまくできたのかなと思う反面、正答している問題もあるので、きっと問題はそこではなさそう。

# 5. 今後勉強したいこと 
　今回から振り返りがてらメモを残そうと思うけれども、やっぱり1日経過していると結構忘れている。
　コンテスト終了後に、どう考えたのかとかを含めて記載し、復習も同時にやるようにしていきたいですね。
　目指せ水色！

以上
.cmd/.batのマイナーなTips

私は Windowsの操作をかなり コマンドライン(CMD.EXE)で行う人なので、いまだに DOS時代のバッチファイルを結構使っています。

なお拡張子は .cmd 派です。

使う理由は、ほとんど以下の2つです。

一つは wrapper。
環境変数整えたりしてからコマンドを実行したいときに便利です。

もう一つは何度も実行するコマンドのショートカット。
何度も打つと疲れるしね。doskeyのmacroだとちょっと物足りないときにも。

しかし、いろいろやっていると困った事態に遭遇することもあります。

↓こいつを止めたいとか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128512/1720f85b-623a-3527-2ed0-dde7e98c2be3.png)

というわけで、今回は2つほど、私の知っている範囲でテクニック（？）の記録を残しておきたいと思います。

似たような記事は、たくさんありそうなので、個人的にマイナーだと思う物をピックアップしてみました。

## バッチファイルの置いてあるディレクトリを、バッチから取得

「そんなの知ってる `%~dp0` でしょ？」という方もいると思うのですが、実はこれで取れないケースがあります。

気持ちの悪いファイル名ですが、オペレータの方に朝実行してほしいバッチファイルがあるとして

"月曜 朝実行.cmd"

とかファイルを作って、これを***パスの通った場所***に置いておきます。

オペレータが朝 "月曜 朝実行" とかコマンドを叩くと、その中で `%~dp0` はカレントディレクトリを返します。

バグじゃないの？って気がします。自動化しようね？って気もします。

そんなことは気にせず、ワークアラウンドです。

```bat
@ECHO OFF
GOTO :MAIN

:GET_BATCH_PATH
SET BATCH_PATH=%~dp0
EXIT /B 0

:MAIN
SETLOCAL
CALL :GET_BATCH_PATH

ECHO dp0 は %~dp0
ECHO 本当は %BATCH_PATH%

ENDLOCAL
```

環境変数でやり取りをするので、SETLOCAL/ENDLOCALで括っていますが、CALLで呼び出すと、ちゃんとバッチのパスを返してくれます。

やはりバグでは…と思いますが、気にするのはやめましょう。

私が知っている発生条件はこれだけなのですが、ほかにもあるかもしれません。バッチの格納されているパスをとるときの堅いやり方としてどうぞ。

## バッチジョブを終了しますか？と言わせない

私の用途だと結構多いのですが、いろいろコマンドラインが長いので、それをラップするコマンドを作った場合です。

この場合、本当のコマンドを起動してバッチとしては終了となるのですが、こんな書き方になると思います。

```bat
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS

SET PYTHON_OPT=%1

python %PYTHON_OPT% -c "print('Hello, World!'); import time; time.sleep(5)"

ENDLOCAL
```

これをCTRL+Cで止めると、バッチは役目を終えているにも関わらずバッチ止めますか？って聞いてくるんですよね…。どっち選んでも意味ないし。

こうい場合、効くのが最後の行でGOTOのエラーを捕捉させる方法です。

```bat
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS

SET PYTHON_OPT=%1

GOTO #### 2>NUL || python %PYTHON_OPT% -c "print('Hello, World!'); import time; time.sleep(5)"
```

最初にGOTOの飛び先ラベルが見つからずエラー終了しますが、`||` があるので、続くコマンドの実行に移ります。エラーを起こしたのがGOTOの場合、CMD.EXEは バッチのセッションが終了したかのように動作を続けます。

バグじゃないの？って思うかもしれません[^1]。それほど気にしなくても良いのではと思います。

## バッチジョブを終了しますか？と言わせない。その２

実は前のやり方でバッチジョブを終わらせた場合、一つ問題があって ウィンドウのタイトルが変になります。
これを回避したい場合 Windowのタイトルを明示的に つけ直すしかありません。

これは完全にバグですね。好きに付け直しましょう。

```bat
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS

SET PYTHON_OPT=%1

GOTO #### 2>NUL || TITLE cmd & python %PYTHON_OPT% -c "print('Hello, World!'); import time; time.sleep(5)"
```

これでバッチファイルを使ったラッパーを書いたときに、気になるCTRL+Cのメッセージを抑制できますね。
なんとなくバグ利用っぽいのが気になるところですが…。

## おわり

FORを使った呪文等はわりと解説サイトが多いのですが、今回書いたあたりは、あまり解説されているサイトを見かけません。そんなこともあり共有させていただきました。

というわけで、皆様も良いバッチライフを。

[^1]: 一応、これ GOTOで失敗した場合は fallthroughして次の行を実行するのではなく、バッチセッションを終了させるという仕様なんだと思います（安全のため）。ただ、ここに `||` が出てくる事で +1 でコマンド実行できると。
画像のエッジを際立たせる【道具としての OpenCV 画像認識】

# 本記事でできること
元画像
![Screenshot from 2024-03-03 19-44-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/43941c1f-a6b9-f9c2-2114-ce909981a48f.png)

エッジ抽出した画像
![Screenshot from 2024-03-03 20-49-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/6a802be6-c256-ea72-0234-cb46996c5dd5.png)

# 想定シーン
## ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。

## 画像のエッジを際立たせる
ビジュありフィードバック制御をするために、撮影した画像のなかに写った物体のエッジを強調したり、エッジ部分を抽出してその部分を除去したりなどの処理をかけたい場合があります。本記事では、エッジ抽出を行うプログラムを掲載します。


# 実行環境
- OS：Ubuntu 22.04 LTS
- 言語：C++
- クルーボ：v5.1.0

## クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。

- クルーボの製品サイト：https://chitose-robotics.com/product

## プログラム抜粋
```c++
cv::Mat canny_edge(const cv::Mat& image, const int threthold) {
    cv::Mat canny_image;
    const int base_threthold = 50;
    cv::Canny(image, canny_image, base_threthold, base_threthold + threthold);
    return canny_image;
}
```
閾値（threthold）の値を変更することでエッジ抽出の際の細かさを変更できます。
なお、上記の画像では、背景のシートの細かい影のエッジを抽出してしまっています。

## 全体プログラム
```c++
#include <iostream>
#include <opencv2/opencv.hpp>

cv::Mat load_image(const std::string file_path) {
    cv::Mat loaded_image = cv::imread(file_path, 1);
    if (loaded_image.empty()) {
        throw std::runtime_error("画像を正常に読み込めませんでした。");
    }
    return loaded_image;
}

cv::Mat canny_edge(const cv::Mat& image, const int threthold) {
    cv::Mat canny_image;
    const int base_threthold = 50;
    cv::Canny(image, canny_image, base_threthold, base_threthold + threthold);
    return canny_image;
}

int main(void) {
    std::string file_path = "../data/green_sample.jpg";
    const cv::Mat loaded_image = load_image(file_path);

    const int threthold = 20;
    const cv::Mat edge_image = canny_edge(loaded_image, threthold);

    cv::imshow("window", edge_image);
    cv::waitKey(0);
}
```

## おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御＝ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。
Honoを試してみた

先日、X(旧:Twitter)で知ったHonoを早速試してみました。
まだ２年経っていないにも関わらず、GitHubのスターが12kを超えていたりとかなり良さそうでした。

ちなみに、Honoとは炎のことだそうです(開発者は日本人らしい)。
名前の由来を知りたい方は、是非ドキュメントのコンセプトのところを読んでみてください。

https://hono.dev/


## 感想
書き方は、ほぼExpressと同じ様に感じる。
将来的にはNestJSから乗り換えたいと思った。

主な理由としては、
- TypeScriptだけでAPIのI/F情報を共有可能 (tRPCなどが不要)
- Swaggerにも対応可能
- ルーターの設計が良いためファイル分割しやすい
- 謳い文句通り、高速に動作する
- 様々なプラットフォーム向けのテンプレート生成機能が用意されている
- ドキュメントが読みやすく、主流のライブラリでの実装方法が記載されている

デメリットを探す方が難しいくらい良くできている...
難癖レベルでいうなら、DartやJavaに型情報を提供してくれると助かる!!（OpenAPIでやれ)

T3Stackでの開発に差し込んだりもできると思うので、是非流行るといいなぁと思った日曜日の午後でした。


## 書き方
ここに書くより、ドキュメントを見てもらった方が圧倒的にわかりやすいので割愛。
FastAPIもですが、最近のWebFrameworkはドキュメントが読みやすくて本当に助かる...

https://hono.dev/getting-started/basic


## 少しハマったところ
ドキュメントに注意として書かれているけれど、実際にハマるまでよくわからなかった部分。

ルートを定義する際、以下のように分けて書きたくなるところですが...
```
const app = new Hono();
app.route("/users", usersAPI);
app.route("/posts", postsAPI);

export type AppType = typeof app; 
```
このように書くと、Client側の静的解析時にエラーが表示されます。

そのため、以下のように書く必要があります。
```
const app = new Hono()
    .route("/users", usersAPI)
    .route("/posts", postsAPI);
    
export type AppType = typeof app;
```
TypeScriptの仕様で考えてみれば、そりゃそうですよね。
型レベルのコードなども見ましたが、超絶複雑だったため、開いた後にそっと閉じました。

---
是非流行ってほしい
多分これを見るのが一番早い React Native Expo 環境構築 for Windows  【JavaScript】

```
最終更新日: 20240303
```
本題だけ見たい人はこちらに飛んでね！
[環境構築スタート](#環境構築)

# 

# 記事の目的
この記事を見るだけでー
ReactNativeExpoの環境構築ができることを目的にしています！
質問事項があれば記事へのコメントもしくは[@rioLi0N](https://twitter.com/rioLi0N)にDMなど気軽にどうぞ！

# ターゲット層

1. Windowsで開発している（MAC高いから持ってない苦学生です:sob:）
2. TypeScriptじゃなくてJavaScriptを開発したい
3. ReactNative「Expo」で開発する

# バックボーン！！！
CEO「Android向けアプリ完成したね！」
僕「はい！」
CEO「ところで、iOS対応もしたいんだけど相談できる？」
僕「なるほど！いけます！」
<br>
それから色々あり調査などをした上で
下記の要件を満たすReactNativeExpoを採用することにしました！
```
1. クロスプラットフォーム言語なので保守作業が楽になる
2. 企業の技術スタックがWeb系なこと
3. RNに加えてExpoも使うことで更にWeb寄りの開発が可能で開発体験も向上
4. アプリの技術要件的には複雑なものではなく実装が可能そうなこと
5. 企業の技術スタックとアプリ規模を考えて無理にTypeScriptを使う必要がなさそう
```

<br>
同じ境遇の人が居るかもしれないので記事に残しておきます！



# 環境構築
構築する環境はこちらー
```
WindowsでJavaScriptを使ったRNEプロジェクト
ルーティングにはExpo Routerを採用
```
<br>
解説方針としては、面倒に感じてほしくないのでノリでいけるよねって箇所は端折ります～<br>

## node.jsの導入
公式サイトからインストール

https://nodejs.org/en

導入確認のコマンド
```
node -v
```

## expo-cliのインストール
コマンドぽちぽちー
```
npm i -g expo-cli
```
下記のエラーでると思うけど
new local Expo CLIを使えばいいだけなので無視してOK
```
WARNING: The legacy expo-cli does not support Node +17. Migrate to the new local Expo
```

このコマンドでプロジェクトを作ったら
自動的にnew local Expo CLIを利用することになります！
（この解説ではGitHubからテンプレートプロジェクト持ってくるのでコマンドは使わないけど気になって調べたら時間のロスなので解説しておきます！）
```
npx create-expo-app {プロジェクト名}
```

## ExpoRouterを導入したプロジェクトの作成

TypeScriptなら公式がテンプレート用意してくれてるんだけど...
```
npx create-expo-app@latest --template tabs@50
```
JavaScriptはないんだよね...
だけど有志がJavaScriptユーザー向けに作ったテンプレートをGitHubに公開してくれているので利用するしかないね！
(将来的にリポジトリが消えてるとかあったら僕に連絡してくれたら渡せます)

https://github.com/talbertherndon/expo-tabs-sdk50-js


## プロジェクトの初期化
GitHubから持ってきたプロジェクトの名前を変更します！
もっとスマートな方法があったらコメントで教えてください(切実な願い)
```
1. 空のプロジェクトディレクトリに解凍した中身を移動する
2. vscodeなどでプロジェクトを開く
3. crrl + win + f などでプロジェクト全体文字検索を開いて「template_js」で検索する
4. ヒットした文字列全てを「任意プロジェクト名」に置換する
```

## プロジェクトを実行
コマンドぽちぽちー
表示されたQRコードを[Expo Go](https://expo.dev/client)で読み取ると動作確認できます
(注意: gitbashなどの非対話コマンドラインで実行すると正常動作しない)
```
npx expo start
```
リモート作業で別の人にQRコードを読み取ってほしいならこちら
(crtl+Cでサーバー閉じたらQRコードは読み込めなくなる)
```
npx expo start --tunnel
```

## ライブラリの導入

expo向けに作られたライブラリ
```
npx expo install ライブラリ名
```
React発祥のライブラリ

```
npm install ライブラリ名
```

# おわりに
僕は本記事の情報調査に4時間くらい使った記憶があるのですが
この記事を見た皆さんは10分もかからなかったと思います！
1人でも参考になった人がいたら本望です！

最後に、本記事の改善点があればフィードバックを貰えると嬉しいです！
仮に批判だとしても意見を頂けるのはありがたいことなので！
sd-webui-animatediffで高解像度・高フレームレートのクロマキーの動画を作成（v3_sd15_mm.ckpt）

# 記事の概要
以下の記事で紹介している手順は、motion moduleが「mm_sd_v14.ckpt」の前提となっているため、「mm_sd_v14.ckpt」以外のmotion moduleでの手順を模索する。（特に「v3_sd15_mm.ckpt」）

https://qiita.com/kongo-jun/items/2bd64dd2106df22cb5ee

上記の手順では、高解像度（896×1120）にすると、動画が破綻するので、高解像度が可能な設定の模索を目標としている。
先に結論だけ記載しておくと、dreamboothモデルは使用せず、civitaiなどからダウンロードしたモデルをそのまま使うと破綻が少ない。

https://x.com/jun_kongo/status/1762267202684891469?s=20

また、dreamboothモデルを使う場合でも、800×1000などで解像度を落とせば、かなり破綻が減る。

https://x.com/jun_kongo/status/1763193583497367841?s=20

# 環境
OS:Windows 11
GPU:GeForce RTX 4090
CPU:i9-13900KF
memory:64G
python:3.10.10
pytorch:2.0.1
CUDA:11.8
cuDNN:8.8

sd-webui:v1.7.0
sd-webui-animatediff:v1.13.0

# 環境構築
以下の記事の構築手順を実施する。

https://qiita.com/kongo-jun/items/2bd64dd2106df22cb5ee

# 画像生成

以下の記事の構築手順を実施する。

https://qiita.com/kongo-jun/items/2bd64dd2106df22cb5ee

# アニメーション生成

以下のキャプチャの設定で「Generate」ボタンを押下する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/89a1fbed-f800-1dcc-1f67-b95976cebe7a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3619695/661bd65b-ac36-169f-b08d-b8219e60bd00.png)

何度か試した結果、「mm_sd_v14.ckpt」以外のmotion moduleでは、dreamboothで再学習したモデルは使わない方がよさそうという結論。（今回はmeinamixのモデルをckptとして利用している。）

そもそも、解像度の限界を感じる。
Python学んでみた　第４回（関数とラムダ〜例外処理）

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事を書きました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:
その中でもこれってどういう意味？とかつまづいたところを念入りに書いていこうかと思います。:fist:

# 今回の目的
前回の続きです。

https://qiita.com/mr_noppo/items/c79cc6f959597ed18e0c

# 使用したものや事前準備
・Macbook Pro
・Python
・Anaconda
・jupyter notebook


# Python
## 関数とラムダ
### 関数
ダブルクォーテーションで囲ったところはDocになります。関数もオブジェクトです。
```python
def add(x,y):
    """加算
    add(2,4)は6を返す
    """
    return x + y 
add(2,4) # 6
```

Docとして記載されていることを確認します。
```python
add?
```
![スクリーンショット 2024-03-03 19.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/2ab2b717-aa5c-ffdc-5890-16e9516c837d.png)

### ラムダ
単一行であれば記述可能です。
```python
adder2 = lambda x, y: x + y
adder2(42, 10) # 52
```
#### ラムダを使ったソート条件
通常の昇順ソート

```python
names = ['taro','jiro','saburo','shiro']
sorted(names) # ['jiro', 'saburo', 'shiro', 'taro']
```
ラムダを使ったソート(文字数の昇順）

```python
names = ['taro','jiro','saburo','shiro']
sorted(names, key=lambda name: len(name)) # ['taro', 'jiro', 'shiro', 'saburo']
```

ラムダを使ったソート(文字数の降順）
リバース使用
```python
sorted(names, key=lambda name: len(name),reverse=True) # ['saburo', 'shiro', 'taro', 'jiro']
```

## モジュールとパッケージ
### モジュール
pyファイル単位。下記記述で関数や変数へアクセスできるようになります。
```python
import モジュール名
```

### パッケージ
モジュールを格納しているディレクトリ。
\__init__.pyは省略しない。

https://qiita.com/methane/items/ed1e5b74747f3ffe9324

```python
import パッケージ名.モジュール名
```

### 例:add関数をsample.pyに作成し呼び出し
```python
import sample
sample.add(1,2) # 3
```
使える関数を改めて確認したい時
```python
dir(sample)
```

## クラス
オブジェクト指向としては必須ですが今回はそこまで深くならなかったので割愛。
下記はコンストラクタでValue（メンバ変数）を作成・引数の値で初期化し、addで加算結果を返却しています。

```python
class MyInt:
    '''Docstring for MyInt'''
    def __init__(self, val): # コンストラクタ
        self.value = val
    def add(self, y): # 自分のインスタンスを引数に含めるため第一引数にselfは必須
        """加算
        add(2,4)は6を返す
        """
        return self.value + y # ex:2+4=6
num = MyInt(30)
num.add(2) # 32
```

## 例外処理

![スクリーンショット 2024-03-03 20.39.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/8d6a1092-0ef0-1821-205b-9e91aea33fa4.png)

try文で対応します。上記の赤文字が例外エラー名、キャメルケースで表示されます。
下記、実行結果は"missing"になります。
```python
names = ['taro','jiro','saburo','shiro']
try:
    names.find('ichiro')
except AttributeError:
    print("missing")
```
### 明示的な呼び出し方
```python
raise AttributeError("missing") # AttributeErrorが呼び出されます。
```


# 続き
https://qiita.com/mr_noppo/items/ba6b2e8e29f1235ec77d
SVNプロジェクトのGit移行

# はじめに
SVNプロジェクトをGitに移行したときのメモです。

## 手順１：Git for Windows のバージョン変更
バージョン「2.33.0.0.2」の では git svn コマンドを実行するとエラーが発生。
エラーが発生しなかった「2.28.0-rc2」にダウングレードする必要がありました。
https://github.com/git-for-windows/git/releases/tag/v2.28.0-rc2.windows.1

## 手順２：GitLabにプロジェクト作成

## 手順３：GitLabへの移行
```bash
mkdir temp
cd temp
git svn init --no-metadata https://XXX.XXX.XXX.XXX:XXXX/svn/server/project
git svn fetch
git clone . ../project
cd ../project

## オリジンの確認：ローカルになっている
git remote -v

## オリジンの変更
git remote set-url origin http://gitlab.xxxxx.co.jp/system/project.git

## オリジンの変更確認
git remote -v
```
NvidiaのLLM:Nemotron-4について

最近Nvidiaが自社のLLM「Nemotron-4」を発表しました。Nemotron-4は15BのLLMです。論文によると、このモデルは一般的なタスクにおいて、Gemma 7BやQwen、Mistralといったモデルを上回る性能を示しています。（⇩）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/97c68dc6-2419-7023-a9ad-05a04cb12710.png)

このモデルは、基本的なTransformerのdecoderアーキテクチャを採用しており、token数は4Kになります。使用された学習データは8Tで、その内訳は英語が70%、多言語が15%、プログラミング関連のデータが15%です。
前処理は、まず重複する内容を削除し、その後LLMを用いてデータクレンジングを行いました。このアプローチはGemmaと非常に似ています。

プレトレーニングは基本的なやり方ですが、継続学習にはGemmaを参考してトレーニングしたようです。トレーニングが完了した後、再学習用データの分布などを調整することで、精度を向上しました。具体的には、最初に8TBのデータを使ってプレトレーニングを行い、その後の継続学習では2つの異なるデータセットを使ってトレーニングを進めました。一つはプレトレーニングに使用されたデータで、高品質なデータの重みを重く設定して再度学習しました。もう一つは、ベンチマーク向けのトレーニングであり、精度評価に関連したデータを用意して、モデルがベンチマークの精度を向上するようにトレーニングしました。
全体的にみると、このモデルはGemmaと非常に似てます。アーキテクチャも似てますし、データクレンジングも似た手法で実施されました。あとは最後の継続学習はベンチマーク向けのトレーニングとなり、ベンチマークのfinetuningみたいな感じです。

最近OSSのLLMが多く公開されていますが、そのアーキテクチャやトレーニング手法、あと性能もほぼ同様で、ほんのわずかにMistralやGemmaを上回る程度であっても、実際の使用において違いはほぼありません。なので、全く異なるアーキテクチャを使用したモデルの公開は楽しみです。


興味ある方：

https://arxiv.org/abs/2402.16819
WSL2のUbuntu環境でAtCoder用の環境構築をする

## きっかけ
情報系学部に通っておきながら単位スコアを稼ぐことしかしておらず，研究が始まる前に何かやってみようと選んだものが競技プログラミング．(Qiitaの記事投稿も...）
atcoder-cliなる便利なものがあると聞いて自分が今使ってる環境でのインストール手順を記事投稿の練習がてらまとめてみました．

今回インストールするツール
[online-judge-tools](https://github.com/online-judge-tools/oj)
[atcoder-cli](https://github.com/Tatamo/atcoder-cli)

## 環境構築
WSL2のUbuntu環境はすでに構築済みのものとします．WindowsでLinuxを使用する方法はたくさん記事があると思うのでこの記事では割愛させていただきます．
まず以下のコマンドをUbuntuターミナル上で実行．

```sh
pip3 install online-judge-tools
npm install -g atcoder-cli
```

するとnpmが見つからないよーといわれたので，調べてみるとnpmというパッケージ管理システムをインストールする必要があるということで，Ubuntuのターミナル上で次のコマンドを実行．

```sh
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
```

インストールに成功すると Close and reopen your terminal...と出てくるので，ターミナルを再起動するとnvmコマンドが使用できるようになっているはずです．
これだけではまだnpmコマンドは使用できないので次のコマンドを実行します．
```sh
nvm install node
```
あとは最初の
```sh
npm install -g atcoder-cli
```
でatcoder-cliがインストールされるはずです．
`acc -h`でコマンド使用方法が出てくるので参照して使い方を学びましょう！

ちなみに私はWSL2環境でコードを書くのにVScodeと連携させて使っています．VScode上でUbuntuのターミナルを開いて作業ができるのでおすすめです．

## 参考
[atcoder-cli インストールガイド](http://tatamo.81.la/blog/2018/12/07/atcoder-cli-installation-guide/)
[npmって何](https://zenn.dev/antez/articles/a9d9d12178b7b2)
シャチトラハッカソンに参加した話

## シャチトラハッカソンって何？
以下記事に詳細が記述されていますので詳細は以下から
簡単に説明すると、トヨタグループ内の市民開発を活性化している企業コミュニティ パワプラのトラ 企画のハッカソンに、ユーザー技術コミュニティ Japan Power Platform User Group Nagoya（JPPUG758）がコラボレーションしたもの

[シャチトラ概要](https://techplay.jp/event/933310)
[トヨタ記念博物館](https://www.tcmit.org/)


会場のトヨタ博物館と車にちなんでお題は、**車 × Power Platformのハッカソン**です。
Power Platformは簡単に実装出来ますが出来る事が限られてるので、車テーマのアイデア思い浮かばねぇ！が本音でした。
難しかった（笑）

Youubeに当日のダイジェスト動画が上がってたので是非見て下さい（３分くらい）
[シャチトラ動画](https://www.youtube.com/watch?v=klZX1BPm2Sk) 

## パワプラのトラとは？
某T社の永田さんが主催するT社グループ向けコミュニティ
永田さんはMicrosoftの公式ページで紹介されてます。かっちょええ・・・

[ボトムアップで始めた小さな活動が全社的な取り組みに――Power Platform で市民開発を推進するトヨタ自動車](https://news.microsoft.com/ja-jp/2022/05/17/220517-toyota-motor-corporation-promoting-citizen-development-on-the-power-platform/)


## なんで参加したの？
ずっとハッカソンに登壇されている方の資料やSNS投稿などを見ていて楽しそうだなと憧れていたんですが、参加できるレベルにないなとビビッて参加をしたことがなかったです。
なのに何故今回は参加したのかですが、理由は主に以下二点になります。

1. 私が業務でPower Platformを活用しているので何とかついていけそうだぞと思った
1. 今年の抱負で社外の色んな人と交流するを目標とした

自分との約束は絶対守りたいなと、案内を見た際迷わずに即応募しました

### 私なりのハッカソンに参加する前の期待値
・知見を広げる為に社外の強いエンジニアと交流したかった
・社外交流による固執していない考え方の発見や、世間の常識を体感する。キャッチアップする。
・他者のDX担当者と仲良くなりたい(単純に仲良くなりたい笑）
など、色々理由はありますが世の中の常識についていけるエンジニアとなりたい思いで参加しました。

## 何をやったの？
私からのアイデア出しがあまり出来なかったので、途中からは皆さんの素晴らしいアイデアを掛け算して提案する役割にシフトしました。
今回提案して実装したテーマが以下になります。

テーマ
警察が出している運転適性検査をPower Platformを活用してより楽しくしよう！

運転適性検査だとデータは正確な分以下のようなデメリットがあると思っている

- 同じ作業の繰り返し
- 楽しくない
- 長い
これをPower Platformで楽しく簡単にしようぜ！ってアイデアの元アプリ開発を行いました。


これをPower Platformで楽しく簡単にしようぜ！ってアイデアの元アプリ開発を行いました。
審査基準が以下三点だったので、基準に沿う要素を入れて実装しました
今回実装はチームの強いエンジニアにやってもらったのでアイデア出しのみ（笑）
![da27ac3d-c8ad-48ea-b10d-b7d9f0a0be51-1920x462r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/9d54bda4-147c-b6de-7590-1bb1fd60b648.png)



#### アプリトップページ
ルーレットを起動すると、この後ゲームで操作するコースが決定
![3aa3093d-79ed-4a6a-857f-fb6fdefcab9c-1920x1082r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/19a81287-513c-3bf6-8e41-0ebbb9b0d7f3.png)


#### コース操作ページ
マウスカーソルで車を操作してコースを走行します（ビリビリゲームみたいなやつ）
グレーがＮＧ部分で車が衝突すると、効果音が鳴るようになってます。
発表時緊張して、会場に効果音を沢山響かせちゃいました

全コース作成間に会わなかったので、強制的にFujiコースにするボタンを置いてました

![f1837d31-06e3-4b1b-840d-a87cd4e95d23-1920x1081r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/64055969-edf7-a203-5d09-703b76f4c03f.png)


#### ゲーム後の解析画面
操作した座標をプロットしてます。
総合判定本当はAI解析したかったですが間に合わず、、、
![c43f55b2-1b97-475c-b272-055d1946e30f-1920x1071r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/7cf26256-253a-f4c2-f3c6-a68c9c1ccb1f.png)


#### アドバイス画面
主催者の永田さんなどを可愛い女性の声にしてアドバイスしてもらう仕様
怒られなくてよかった。ちょっと載せるのは控えます（笑）


## 結果　
5チーム中２位でした。極力採点基準にフォーカスした内容で実装したと思ってましたが、１位のぶっ飛び方には完敗だなと、、、




## 参加前の期待値とのギャップ
参加前の期待効果と同じ効果を得られたと思う。メンバーと意見を出し合う時間がとても楽しかったし、弊社で使えていないコネクタを実際に使用したアプリを見ることができてワクワクしたし是非導入したい。
ただ、ずっと作業していたのもあり、話したいと思ってるエンジニアの方とお話できなかった、、、
MVPの方とは解散後にXを通して繋がれたのでとりあえず良しです！

## 参加した感想
初めてトヨタ博物館を回れて楽しかったです（しかも今回は無料）
沢山のMicrosoft MVPに会えた事、推しに会えてマジハッピー！
[Microsoft MVPとは？](https://chomado.github.io/MS-MVP/)

いつもの業務と関係ない人とアイデア創出しアプリへ実装していく事がとても楽しかったですし、普段はゲームなんて作成するツールではない物を使い、合法的にゲームを作成してよかったことがとても楽しかった
DockerコンテナをAWS ECSに移行　その２ wordpress＋mysqlのdocker-compose構成を図解してみる

## Qiitaの記事の構成、前回、今回、次回について
- その１：前回の記事

https://qiita.com/Misshii/items/68c46729efab7f5877ae

- その２：今回の記事
    - Docker Composeで、wordpress＋mysqlを構築
- その３：次回の記事
    - その２のDocker Compose構成を、ECS on Fargateに移行

## docker-composeコンテナ構成
- wordpress
    - 最新バージョン
    - 外部から80ポートで待ち受け
- mysql
    - バージョン5.7
    - 外部から3306ポートで待ち受け


```docker-compose.yml

version: '3'

services:
   db:
     image: mysql:5.7
     ports:
       - "3306:3306"
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "80:80"
     volumes:
       - wp_data:/var/www/html
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:
    wp_data:
```

## 今回のdocker-compose.yml を解説する図解
- ①で、docker hubから指定バージョンのコンテナイメージをダウンロード
- ②で、XX:YY コンテナ内部のポート番号YYをホストOS上のポート番号XXで待ち受け
- ③で、コンテナで使用するデータを永続化するために、外部ボリュームをマウント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/3737e227-09f6-0c8a-6375-fc3cc18426b7.png)


#### 環境変数を補足
- mysqlコンテナ
    - データベース設定
- wordpressコンテナ
    - データベースへの接続設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/e8bf549f-05cb-92cf-5d9d-144feeeda5b7.png)


---
#### 以上です
AWSわからんエンジニアが初めてJAWS DAYS 2024に突撃してみた。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85658/549daf33-561a-a243-9ba8-fdbefd9202dc.jpeg" width="30%">

2024/03/02(土)に開催された「[JAWS DAYS 2024](https://jawsdays2024.jaws-ug.jp/)」に一般参加した際の個人記録です。

__技術情報はありません！！__


# About me
初めまして！まりと申します。
普段はWebフロントや無料のローコードプラットフォームで遊んでおり、仕事ではほぼJava一本で活動しているエンジニアです。

今年から
・AWSの勉強やっていきたいな～
・プライベートでもいろいろなコミュニケーションや勉強の場を広げてみたいな～
と思い活動を開始し始めているところでした。（そうしてすでに3か月…）

__AWSも知らないことばかり。
オフラインイベントだってほぼ参加したことはない。__
「JAWS」って言葉やイベントの雰囲気はX（旧Twitter）で見たことあるけど、どういうものかわかっていない。

そんな状態でしたが、たまたまイベント申込をやっていると知ることができたので、
__せっかくの機会だ、参加するしかねぇ！__
と思い、勢いで参加してきました！


# はじめに
AWS日本コミュニティ（JAWS-UG）主催の2024年リアルイベント「JAWS DAYS 2024」に行ってきました！という記事です。

JAWS-UG公式サイト:

https://jaws-ug.jp/about-us/

JAWS DAYS 2024公式サイト:

https://jawsdays2024.jaws-ug.jp/


# 行く前と行った後の感想

<dl>
  <dt>行く前</dt>
  <dd>
  ・社内イベントでもぼっちになってる（基本グループでいる人には声かけにくい）し、社外なんて余計だろうな～<br>
  ・コミュニケーション増やすために懇親会申し込ませてもらったけど…正直怖い！！！<br>
  <br>
  </dd>
  <dt>（行くと決めた時～）行った後</dt>
  <dd>
  ・めっちゃイベントに関する案内の記事公開してくれている！力の入れ具合すごい…<br>
  ・そんでもって各種記事の内容がめっちゃ助かる...！<br>
  ・名札での周知情報（写真ＮＧ、未成年、話しかけＯＫなど）もめっちゃ助かる…！ナニコレすごい…<br>
  ・トランシーバーを使って発表聞くの？！初体験だし、めっちゃ聞きやすい！<br>
  ・発表内容わからないことも多かったけど、新しいINPUTやなるほどなぁ！と思うことも多々ある。<br>
  ・え、この企業のツールでAWS使ってこんなこと出来たんだ？！企業さんの話も聞けてよかった～！<br>
  ・JAWSコミュニティの盛り上がりがすごい。雰囲気で楽しくなることがある（笑）<br>
  ・何人か「初めまして」ができた！！
  </dd>
</dl>

# 結論、行ってよかった！
いろいろなプラスがあったので。
でも慣れてなくてめっちゃ疲れた（笑）


# 一番心配だったコミュニケーション
勇気をもって自分から声を掛ける。
これは何よりも大事。

でも、このイベントではそれがしやすいようサポートがありました。
それは、__名札__ です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85658/d0d28b6c-98ce-cd8d-3624-20c3d6d3a266.jpeg" width="60%">

名前と自分のロールにあったシールを貼る、というもので、この「__声掛けOK__」はめっちゃ助かりました。

基本グループになっている人が多く、そこに突撃する勇気はなかったのですが…
__参加者の中にはぽつぽつと「あ、同じく一人で来た人かも」と思う人がいました__。
その中でできるだけこの __「声掛けOK」の人になら突撃してもいいかな～？__ と、話掛けるきっかけに使わせていただきました。
とはいえ、見にくい状態も多いので、いろいろ模索しているときは不審者だったでしょう（笑）

後半では「声掛けOK」ロールを切っ掛けに、名札はうまく見えないけど一人かな～という人に声を掛けては「声掛けても大丈夫ですか？」と言ってお話させていただきました。
（「いいえ」と言いにくい質問ですみませんでした！（笑））

お話してくださった方、ありがとうございました！

お話してくださった方の多くはAWS経験が多い方で「こういうコミュニティでも活動しているよ～」という話を聞かせてくださる人もいました。
こういったところからさらに自分のコミュニティ範囲を広げられるよう、これからの活動を頑張りたいという指針にもなったと思います。


# AWSわからんでも大丈夫だった？
ほとんど大丈夫です！（笑）

もちろん知っていた方がよりスキルアップできると思いますが、なくてもそういうものなんだなぁ～とふんわりINPUTができると思います。
AWSに関わらずの情報もたくさんありますから！
わからんから行かない　より　わからんけど聞いておく。アリです。

もし「皆さんなら○○はご存じかもしれませんが～」という言葉が出てきたら、笑って流して次までには一緒に勉強しましょう！（笑）

参加にあたり、マイナスに思うことはありませんでしたよ！


# もし参加する前の自分に伝えることがあるなら

### スマホの充電器持っていけ。
・メモ
・写真撮る
・スタンプラリーをする
・アンケートに答える
・スケジュール確認する
etc...

色々してたら、夕方はいる前には30%ぐらいまで減っていました。
セッション視聴ならそんな使わないだろう、なんて甘かったです。

### 鞄は大きめで、肩の負担が少ないものを。
特に企業ブース回る人向け。

入場時に折りたたみクッションをいただいたり。
企業ブースでは資料＋αをもらったり。

またそれをもっていろいろ歩いたりするので、途中から肩を痛めてしまいました…
鞄の選択、重要です。

<br>
<br>
ぱっと思いつくところだと、こんなところ。<br>
<br>
今後のイベントも少しずつ参加していろいろお声がけさせていただくと思いますので、<br>
皆さんよろしくお願いいたします！
HHKB(US配列)ショートカットキー(Mac) 備忘録

# はじめに

今までWindowsもMacも、JIS配列のキーボードを使ってきました。
が、このたび、HHKB Professional HYBRID Type-S(US配列) デビューしました。
購入したものの、なかなかキー配列に慣れず。
調べてもすぐ忘れてしまうので、よく使いそうなショートカットキーをまとめてみました。

以下、Macでのショートカットキーです。

# HHKB特有のキー

| Key | 説明 |
|:-:|:-:|
|`Fn` + `Q` | ペアリング待機モード  |
|`Fn` + `Ctrl` + `1`~`4` | ペアリング  |
|`Fn` + `Ctrl` + `0` | USB接続切替  |
|`Fn` + `X` | ペアリングモード解除  |
|`Fn` + `Ctrl` + `W` | Windowsモード  |
|`Fn` + `Ctrl` + `M` | Macモード  |

# 移動に関するキー

| Key | 説明 |
|:-:|:-:|
|`Ctrl` + `A` (Ahead)   | 行の先頭に移動  |
|`Ctrl` + `E` (End)   | 行の最後に移動  |
|`Ctrl` + `F` (Forward)  | 1文字分進む  |
|`Ctrl` + `B` (Backward)  | 1文字分戻る  |
|`Ctrl` + `P` (Previous)  | 1行上に移動  |
|`Ctrl` + `N` (Next)  | 1行下に移動  |
|`Ctrl` + `D` (Delete)  | 右側にある文字を削除  |
|`Ctrl` + `H`   | 左側にある文字を削除  |
|`Ctrl` + `K`   | 行の最後まで削除  |

# 文字入力

| Key | 説明 |
|:-:|:-:|
|`Ctrl` + `Shift` + `J`  | 日本語入力  |
|`Ctrl` + `Shift` + `;`  | 英語入力  |
|`Command` + `Space`  | 英語入力と日本語入力の切替  |

# その他

| Key | 説明 |
|:-:|:-:|
|`Ctrl` + `Command` + `Q`  | 画面をロック  |
|`Option` + `Command` + `eject`  | スリープ  |
Why matrimonial sites are important

Matrimonial services can be beneficial for achieving perfect matchmaking for several reasons:

Wide Reach: Matrimonial platforms often have a large user base, allowing individuals to connect with potential partners they might not have otherwise encountered in their social circles.

Diverse Options: These platforms cater to various preferences and criteria, such as religion, caste, profession, interests, etc., providing a diverse pool of potential matches to choose from.

Detailed Profiles: Matrimonial profiles typically include detailed information about individuals, including their background, interests, values, and preferences, helping individuals make more informed decisions.

Filtered Search: Users can filter their search based on specific criteria, which can help narrow down the options and focus on potential matches that align with their preferences.

Compatibility Matching: Many matrimonial platforms use algorithms and compatibility tests to match individuals based on factors such as personality traits, values, and lifestyle preferences, increasing the likelihood of finding a compatible partner.

Privacy and Safety: Matrimonial platforms often have measures in place to protect users' privacy and safety, such as profile verification processes and secure messaging systems, creating a safer environment for individuals to explore potential matches.

Facilitated Communication: These platforms provide tools and features for communication, such as messaging and video calls, allowing individuals to interact and get to know each other before deciding to meet in person.

Professional Assistance: Some matrimonial services offer personalized matchmaking services, where experienced professionals assist individuals in finding compatible matches based on their preferences and requirements.

Overall, matrimonial services can be effective in facilitating perfect matchmaking by providing a convenient and efficient platform for individuals to connect with potential partners who meet their criteria and preferences.
画像をぼかす【道具としての OpenCV 画像認識】

# 本記事でできること
元画像
![Screenshot from 2024-03-03 19-44-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/60f4d207-1bd1-1b69-f638-4607004a7be0.png)

ブラーをかけた画像
![Screenshot from 2024-03-03 19-43-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37698/97bc169b-8e55-6399-6786-8c7dca7ca45c.png)


# 想定シーン
## ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。

## 画像をぼかす
ロボットのビジュアルフィードバック制御では、くっきりとした鮮明な画像のほうが認識しやすいと思われますが、余計な細かいノイズを除去したり、おおよその画像の特徴を抽出したかったりする場合にはブラーをかけてぼやかすことになります。本記事では、ブラーをかけるプログラムを掲載します。

# 実行環境
- OS：Ubuntu 22.04 LTS
- 言語：C++
- クルーボ：v5.1.0

## クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。

- クルーボの製品サイト：https://chitose-robotics.com/product

## プログラム抜粋
```c++
cv::Mat blur(const cv::Mat& image) {
    cv::Mat blur_image;
    cv::blur(image, blur_image, cv::Size(5, 5));
    return blur_image;
}
```

## 全体プログラム
```c++
#include <iostream>
#include <opencv2/opencv.hpp>

cv::Mat load_image(const std::string file_path) {
    cv::Mat loaded_image = cv::imread(file_path, 1);
    if (loaded_image.empty()) {
        throw std::runtime_error("画像を正常に読み込めませんでした。");
    }
    return loaded_image;
}

cv::Mat blur(const cv::Mat& image) {
    cv::Mat blur_image;
    cv::blur(image, blur_image, cv::Size(5, 5));
    return blur_image;
}

int main(void) {
    std::string file_path = "../data/green_sample.jpg";
    const cv::Mat loaded_image = load_image(file_path);

    const cv::Mat blur_image = blur(loaded_image);

    cv::imshow("window", blur_image);
    cv::waitKey(0);
}
```

## おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御＝ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。
Variables - CS50’s Introduction to Programming with Python

CS50’s Introduction to Programming with PythonのShortsよりVariablesの内容を記載したいと思います。動画で勉強しながら、復習になど使っていただけたら嬉しいです。

まだ、下記の記事を読んでいない方は、先にそちらを読んだ方が、わかりやすいと思います。
[Return Values - CS50’s Introduction to Programming with Python](https://qiita.com/natsuki_natsuki/items/213c475ef089d8b2611f)

動画へは下記リンクよりアクセスできます。動画を見ながらまたは、復習として、この記事をご活用ください。
[Variables - CS50P Shorts](https://www.youtube.com/watch?v=MyWf3zyyvjc)

まず、[Visual Studio Code for CS50](https://cs50.dev/)にアクセスして、GitHubアカウントでログインします。
## ファイルを作成する
```bash:Terminal
code guess.py
```
でファイルを作成します。
```python:guess.py
guess = 10
print(guess)
```
guessに10を代入して、printします。
```bash:Terminal
python guess.py
```
を実行します。
## functionを定義する

get_guess functionを定義します。
```python:guess.py
def get_guess():
    guess = 10
    return guess

print(get_guess())
```
```bash:Terminal
python guess.py
```
get_guessがprintされ、10が出力されます。
## input functionを使う
今度は、userに自由な値を入力してもらうようにします。
input functionを使います。
```python:guess.py
def get_guess():
    guess = input("Enter a guess: ")
    return guess

print(get_guess())
```
```bash:Terminal
python guess.py
```
Enter a guess:　が出力されたら、好きな数字を入力してenterを押すとその数字が出力されます。
## return valueをもう1つのfunctionで使う
今度はもう1つfunctionを定義して、そのfunctionにinputされた値を渡してから、出力されるようにします。

```python:guess.py
def get_guess():
    guess = input("Enter a guess: ")
    return guess

def main():
    guess = get_guess()
    print(guess)

main()
```
```bash:Terminal
python guess.py
```
上記の2つのfunction get_guessとmainどちらにもguessが使われていますが、別々のfunctionの中なので、別のものとして認識されます。

先ほどと同じように好きな数字を入力するとその数字が出力されます。
## 正解と不正解を出力する
今度は、guessに50を代入して、入力した数字が同じ50だとCorrect!違う数字だとIncorrect!と出力されるようにします。

```python:guess.py
def get_guess():
    guess = input("Enter a guess: ")
    return guess

def main():
	guess = get_guess()
	if guess == 50:
		print("Correct!") 
	else:
		print("Incorrect!")

main()
```
```bash:Terminal
python guess.py
```
ここで、50と入力するとCorrect!と返ってくるはずですが、なぜかIncorrect!と返ってきます。
理由は、input functionでは、すべて、文字列(str)として、認識されてしまい、50が数字(int)ではなく文字列(str)と認識されてしまっているので、Incorrect!になっています。なので、この50を数字(int)に直します。

## 値をstrからintに変える

```python:guess.py
def get_guess():
	guess = int(input("Enter a guess: "))
	return guess

def main():
	guess = get_guess()
	if guess == 50:
		print("Correct!") 
	else:
		print("Incorrect!")

main()
```
```bash:Terminal
python guess.py
```
これで今度は、50と入れるとCorrect!25と入れるとIncorrect!と返ってくるようになりました。

## inputをstrに変える
今度は、先ほど追加したintを消して、50を"fifty"に変えて、fiftyと入力してみます。
するとCorrect!と返ってきます。tenと入力するとIncorrect!!と帰って来ます。

```python:guess.py
def get_guess():
	guess = input("Enter a guess: ")
	return guess

def main():
	guess = get_guess()
	if guess == "fifty":
		print("Correct!") 
	else:
		print("Incorrect!")

main()
```
```bash:Terminal
python guess.py
```
仮想環境で開発中 JavaScript が途中で途切れて壊れる場合の対処法


Vagrant (VirtualBox) + Apache + webpackでコンパイルされたJavaScriptやCSSが途中で途切れて壊れる場合の対処法を紹介します。

:::note warn

※ これは2020-02-02に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## gulp.js の watch モードで JS が壊れる

フロントの開発時、gulp.jsのwatchモードを用いてwebpackコンパイルを自動で行うよう設定されているプロジェクトで開発していていました。

しかし、なぜか半分の割合で、生成されたJSが途中で切れてしまいます。当然ブラウザ上ではエラーで停止します。

ファイルを直接見るとまったく問題がなく、Apacheの再起動するとすぐに復活するため、Webサーバーのキャッシュの問題を疑いました。

## 原因

EnableSendfileというApacheの機能が影響していました。

https://httpd.apache.org/docs/2.4/mod/core.html#enablesendfile

公式ドキュメントには次の記載があります。

> デフォルトでは、 例えば静的なファイルの配送のように、リクエストの処理にファイルの 途中のデータのアクセスを必要としないときには、Apache は OS が サポートしていればファイルを読み込むことなく sendfile を使って ファイルの内容を送ります。

そして、その下に次の記載があります。

> しかし、プラットフォームやファイルシステムの中には運用上の問題を避けるためにこの機能を使用不可にした方が良い場合があります:
> ネットワークマウントされた DocumentRoot (例えば NFS や SMB) では、カーネルは自身のキャッシュを使ってネットワークからのファイルを 送ることができないことがあります。

ファイルのキャッシュが中途半端なタイミングで行われてしまい、途中で途切れた状態が出力されてしまうというのが原因なようです。

次の記事のようにNFSを使用するように設定している場合に発生します。VirtualBox初期設定のファイル共有では発生しません。

https://bicstone.me/vagrant-laravel-slow/

## EnableSendfile を無効にする

EnableSendfile機能を無効にします。若干の速度低下があるようですが、(VirtualBoxを用いている時点で遅いので)よっぽど大量のリクエストを行っていない場合は問題ありません。

httpd.confのEnableSendfileをOffにします。

```ini
EnableSendfile off
```

または、.htaccessに設定します。

```ini
EnableSendfile off
```
エックスサーバーの無料独自SSLをサイト移転前に設定する方法


エックスサーバー・スターサーバーの無料独自SSL設定をサイト移転前に設定し、SSLで接続できなくなる問題を回避する方法を紹介します。

※スクリーンショットはスターサーバーの管理画面ですが同じ業者であるエックスサーバーでも同様に設定可能です。

:::note warn

※ これは2019-01-01に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## サイト公開しないと無料独自 SSL 設定ができない

当ブログはMixHostからスターサーバーへ移転しました。移転時に一番問題だと感じたのが、サイトをスターサーバーで公開しないと無料独自SSL設定ができないため、一定時間SSLが使用できないというダウンタイムが存在してしまうことでした。

スターサーバーにドメイン追加後、SSL設定より「無料独自SSL追加」を行ってもエラーが発生したと表示され設定ができません。

![スターサーバー管理画面の無料独自SSL追加時にエラーが発生](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/16fa4e63-498a-c278-c4af-fd46dbad002d.png)

この状態でネームサーバーの設定を変え新サーバーにアクセスが行ってしまうと、SSL検証エラーとなり、SSLを設定するまでの間ダウンタイムとなってしまいます。また、HOSTSファイルを使用して新サーバーでの動作確認も行えません。

![Google Chrome のSSLエラー 「この接続ではプライバシーが保護されません」](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/c75c1ae4-00e5-a93c-8242-be39a82ec6c1.png)

## SSL 設定時の認証

エックスサーバーやスターサーバーの「無料独自SSL」は「Let's Encrypt Authority X3」を使用しています。認証はLet's Encryptが行っています。

Let's EncryptのWeb認証では、`http://example.com/.well-known/acme-challenge/` の直下にLet's Encryptから指示された認証用一時ファイルを設置し、存在が確認されることで行われます。

エックスサーバーやスターサーバーでも「無料独自SSL追加」を行うと設定するサーバーの `/.well-known/acme-challenge/` の直下に認証用一時ファイルを設置しています。

https://letsencrypt.readthedocs.io/en/latest/using.html

## 移転前動作確認 URL でも認証ファイルにアクセスが可能

認証を通すためにはエックスサーバーやスターサーバーに設置された認証用一時ファイルへアクセスできるようにする必要があります。

エックスサーバーやスターサーバーには「移転前動作確認URL」という機能があり、この機能で作成されたURLでも `/.well-known/acme-challenge/` にアクセスが可能になっています。

https://www.xserver.ne.jp/manual/man_domain_checkproxy.php

https://www.star.ne.jp/manual/domain_checkproxy.php

## 対処方法

1. 「移転前動作確認URL」の設定から動作確認URLを入手します。

![「移転前動作確認URL」の設定から動作確認URLを入手します。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/63884fd3-31fd-7d1c-8ee4-b561a43fef58.png)

2. 移転前のサーバーに `/.well-known/acme-challenge/` までのフォルダを作成します。

3. `/.well-known/acme-challenge/` の直下に次の `.htaccess` ファイルと `index.php` を設置します。

`index.php`

`http://masshiro-blog.check-star.jp/(アクセスされたURL)` にデータを取得しに行き、そのまま返すプログラムです。

URLは `/.well-known/acme-challenge/(英数字-_)` 以外の場合弾くようにしています。

`http://masshiro-blog.check-star.jp/` の部分は移転前動作確認URLに置き換えてください。

```php
<?php
$url = $_SERVER['REQUEST_URI'];
if(preg_match('/^/.well-known/acme-challenge/[a-zd-_]+$/i', $url)):
  $cp = curl_init();
  curl_setopt($cp, CURLOPT_URL, 'http://masshiro-blog.check-star.jp/' . $url);
  curl_setopt($cp, CURLOPT_RETURNTRANSFER, true);
  echo curl_exec($cp);
  curl_close($cp);
else:
  exit();
endif;
?>
```

`.htaccess`

WordPressでもお馴染み、直下へのすべてのアクセスを `index.php` に転送するプログラムです。

```plain
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule (.*) index.php?/$1 [L]
</IfModule>
```

4. SSL設定より「無料独自SSL追加」を行う。

![SSL設定より「無料独自SSL追加」を行う。独自SSLを追加しましたのメッセージが表示される](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684999/b45d2ea7-dd51-94e2-ef33-30199a117c93.png)

5. index.php及び.htaccessを削除する。
MySQL で、 AUTO INCREMENT の値が時々リセットされる原因


MySQL 5.6のInnoDBデータベースでAUTO INCREMENTのカウンター値が時々リセットされ、物理削除後の値が再度使用されてしまう可能性がある原因と対処法を紹介します。

:::note warn

※ これは2020-02-06に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 現象

私が関わっていたプロジェクトで、AUTO INCREMENTのカラムなのに物理削除後の値が再利用されるという不具合が発生しました。

ユーザーテーブルとして、会員IDをプライマリキーかつAUTO INCREMENTで設定しており、削除したらテーブルから物理削除する仕様になっていました。

ある日、削除済みの会員IDと、登録されていた会員IDが重複するという不具合が発生しました。

## 原因

MySQL5系のInnoDBデータベースでは、再起動されるとAUTO INCREMENTカウンターがリセットされ、次のSQL結果の値に設定されると公式ドキュメントに記載されています。

```sql
SELECT MAX(ai_col) FROM t FOR UPDATE;`
```

https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html

MySQLが再起動されると連番の一番大きい値にカウンターがリセットされるという実装になっています。

つまり、最大値のレコードが物理削除された後に再起動されると、その値が再度使用されてしまうということです。AUTO INCREMENTカウンターをシーケンスであると完全に信頼して設計していたので、拍子抜けしましたし、実装を理解せずに使用して恥ずかしいです。

## 対処方法

### MySQL のバージョンアップ

MySQL8系ではこの実装が変更されています。

公式ドキュメントによると、カウンター値をメモリでなくディスクに保存するように変更されたので、MySQLの再起動後もカウンター値が維持されるとのことです。

バージョンアップできれば、バージョンアップで対処できます。

> In MySQL 8.0, this behavior is changed. The current maximum auto-increment counter value is written to the redo log each time it changes and is saved to an engine-private system table on each checkpoint. These changes make the current maximum auto-increment counter value persistent across server restarts.

https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html#innodb-auto-increment-initialization

### 論理削除にする

論理削除にすれば、レコードが削除されないのでリセットされても影響はなくなります。

### 採番テーブルを使用する

今回のプロジェクトでは、急遽古き良き採番テーブルを使用する方法を取りました。

## まとめ

特定のRDBMSの機能に依存するのは手軽ですが、仕様を確認して見極めて使っていきたいです。
オブジェクト URL を File または Blob オブジェクトに変換する方法


JavaScriptのオブジェクトURLをFileオブジェクトまたはBlobオブジェクトに戻す(変換する)方法を紹介します。 `URL.createObjectURL()` の逆を行います。

:::note warn

※ これは2020-02-04に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## オブジェクト URL とは

オブジェクトURLは、JavaScriptで次のようにメゾットを呼び出すことで生成されます。

```js
URL.createObjectURL(object);
```

https://developer.mozilla.org/ja/docs/Web/API/URL/createObjectURL

ファイルを処理したり、ユーザーからファイルを受け取るライブラリなどで、オブジェクトURLで返ってきますが、データを処理したいのでFileオブジェクトやBlobオブジェクトに戻したいケースがあります。

しかし、File APIには `URL.createObjectURL(object);` の逆が用意されていません。

例えば、 [`react-dropzone`](https://github.com/react-dropzone/react-dropzone) というReactのライブラリではオブジェクトURLで返ってきます。

## File オブジェクトに戻す方法

なんの変哲もない対処方法なのですが、URLなので、 `fetch()` または `XMLHttpRequest` を使用すればFileオブジェクトに戻すことができます。

### `fetch()` を用いた方法

ES5が動作する環境であれば `fetch()` を用いた方法がおすすめです。

[Can I Use](https://caniuse.com/#feat=fetch)によると、IE、古すぎるEdge、Opera mini以外であれば動作するようです。対象外のブラウザでも[polyfill](https://github.com/github/fetch)を導入したり、トランスコンパイルをすれば動作します。

```js
let file = await fetch(url).then((r) => r);
let blob = await fetch(url).then((r) => r.blob());
```

### `XMLHttpRequest` を用いた方法

古き良き、`XMLHttpRequest` を用いても取得できます。

[Can I Use](https://caniuse.com/#feat=mdn-api_xmlhttprequest)によると、現在の主要ブラウザはすべて動作するようです。

```js
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.responseType = "blob";
xhr.onload = function () {
  var blob = this.response;
};
xhr.send();
```
PythonでアーカイブしたZIPファイル名をShift-JISにする


Pythonのzipfileライブラリはファイル名をUTF-8でエンコードするためWindowsのレガシーな解凍ソフトで解凍するとファイル名が文字化けします。ファイル名をShift-JISでエンコードする方法を紹介します。

:::note warn

※ これは2019-07-18に[個人ブログ](https://bicstone.me)で公開した記事を移植し、[CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/deed.ja)で提供しています。情報は古い可能性があります。

:::

## 世の中には UTF-8 で文字化けする解凍ソフトが残っている

2007年9月にZIPの仕様が追加され、エンコードをUTF-8に統一するための仕組みが完成してから、ZIPファイル名はUTF-8にエンコードすることがスタンダードになりつつあります。

https://support.pkware.com/home/pkzip/developer-tools/appnote

しかし、日本国内では、UTF-8に未対応の解凍ソフト(+Lhaca Lhaplusなど)を使っているユーザーが多くいます。(WindowsのエクスプローラーだけでUTF-8のZIP解凍できるのに)

## ファイル名を Shift-JIS でエンコードできるのか

全ユーザーを説得して各UTF-8未対応の解凍ソフトをアンインストールして回るわけにもいかないので、ファイル名をShift-JISでエンコードする方法を考えます。

まず、CPythonのzipfileライブラリのソースコードを見てみます。

https://github.com/python/cpython/blob/3.7/Lib/zipfile.py#L454

CPython3.7では、454行目にファイル名のエンコードの関数があります。抜粋すると次の通りです。

```py
    def _encodeFilenameFlags(self):
        try:
            return self.filename.encode('ascii'), self.flag_bits
        except UnicodeEncodeError:
            return self.filename.encode('utf-8'), self.flag_bits | 0x800
```

まずASCIIでのエンコードを施行して、 `UnicodeEncodeError` ならば(=ASCIIでなければ)「UTF-8」でエンコードするようにハードコードされていました…。

## 標準ライブラリをコピーして Shift-JIS に変更する

あまりしたくないですが…。標準ライブラリをコピーしてShift-JISに対応します。 454行目の `'utf-8'` を `'cp932'` に変更します。また、フラグ `0x800` を削除します。

ちなみに、`0x800` は、ZIPの規格で定められた「general purpose bit flag」のBit 11を `1` にしています(16進数 `800`=2進数 `100000000000`)。これは、前述のエンコードをUTF-8に統一するための仕組みで、規格では「Language encoding flag (EFS). If this bit is set, the filename and comment fields for this file MUST be encoded using UTF-8.」と定められており、UTF-8でなければ立ててはいけないフラグなので取り除いています。

https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT

zipfile.py

https://github.com/python/cpython/blob/3.7/Lib/zipfile.py#L454

```diff
454-: return self.filename.encode('utf-8'), self.flag_bits | 0x800
454+: return self.filename.encode('cp932'), self.flag_bits
```

`import` 先を今回作ったzipfile.pyに変更します。

```py
from .zipfile import ZipFile
# ...
with ZipFile(zb, mode='w') as zf:
    # ...
```

以上の対策で、Windowsのレガシーな解凍ソフトで解凍できるようになります。逆にLinuxなどではUTF-8しか対応していない場合文字化けする可能性があります。
venv（仮想環境）コマンド自分まとめ

pythonのプロジェクトごとに環境を管理するvenvのコマンドをまとめた。
## コマンド
venv(仮想環境)ディレクトリの作成．
    
    [ターミナル]
    python3 -m venv [name]

仮想環境に入る．

    [ターミナル]
    source [name]/bin/activate

仮想環境から出る（仮想環境の無効化）

    [ターミナル]
    deactivate

venv(仮想環境)内にインストールされているライブラリ一覧をテキストファイルに出力する．

    [ターミナル(仮想環境内)]
    pip freeze > [name(requirements.txt)]

出力したテキストファイルを元にライブラリを一括インストールする．

    [ターミナル(仮想環境内)]
    pip install -r [name(requiirements.txt)]