OmniAICreator/Qiita-1.07M huggingface dataset:
Flutterのビルドモードまとめ

## Flutterの３種類のビルドモード
最近公式ドキュメントを読むのが、英語の勉強にもなっているなと感じています。もしかしたら何かしらに役に立つかなと思い、特徴を簡単にまとめてみました。

### Debug mode
開発中にデフォルトで使用するモード。エミュレータ、シュミレータ、実機でデバッグ可能。開発や実行サイクルを早めるため、コンパイルが最適化されている（実行スピードやバイナリサイズは最適化されない）。
##### 特徴
- Hot reloadが使える（とにかく便利）
- デバッグが有効
- [Assertions](https://dart.dev/guides/language/language-tour#assert)が有効
- `debugAllowBanner`, `debugDumpApp`, `debugDumpRenderTree`, `debugPaint`などの拡張機能が使える



### Release mode
アプリのリリースの準備ができていて、デプロイするときに使用。エミュレータやシュミレータは非対応。
##### 特徴
- デバッグ情報は削除され、無効化
- Assertionsは無効
- パフォーマンスを高めるためにコンパイルが最適化
- `debugAllowBanner`, `debugDumpApp`, `debugDumpRenderTree`, `debugPaint`などの拡張機能が使えない
- Webアプリではビルドの縮小や不要なコードの削除が行われる


### Profile mode 
アプリのパフォーマンスを分析する時に使用。Debug modeとRelease modeの間のような感じ。エミュレータやシュミレータには非対応（パフォーマンスを見たいのに、実際のパフォーマンスとしてふさわしくないから）。Release modeに近いが、いくつか違いがある。
##### 特徴
- いくつかの拡張機能が使用可能（アプリのパフォーマンスに関わるもの）
- Webアプリでは不要なコードの削除は行われる

---

こういった知識が開発に特設役立つことは無さそうですが、いずれどこかで役立つ日を祈って記録…

##### 参考
https://docs.flutter.dev/testing/build-modes
https://stackoverflow.com/questions/68263666/what-is-service-extensions-in-flutter
Spring BindingResultインスタンス作成方法

## いきなり本題
いっつも、忘れたころに、BindingResultを手動で作りたくなる。

```java
Form form = new form();
BindingResult result = new DataBinder(form).getBindingResult();
```

## References
* https://arkgame.com/2020/01/18/post-43133/
compactの使い方

```php:UserController.php
public function index()
{
   $user = Auth::user();
   return view('index', compact('user'));
}
```

＄userにログインしているユーザー情報を定義、$を付けずcompactの中にuserと記載し、index.blade.php(ビュー側)に定義した＄userを渡す事が出来ます。

```php:index.blade.php
<p>{{ $user->name }}</p>

```

と記載をするとログインしているusersテーブルのnameカラムを取得し表示する事ができます。
オーバーライドってなに？

##オーバーライドとは？
オブジェクト指向におけるオブジェクトの継承の話で出てくる用語のひとつであり、
親クラスにあるメソッドを子クラスで再定義することによって、子クラス上で親クラスのメソッドを上書きすることです。

わかりずらいと思うので、例を挙げて考えていきましょう。

##家族を用いた例
母、兄、弟の３つのクラスを用意します。
そして、母クラスを親クラス、兄クラスと弟クラスを子クラスとします。

子クラスの兄クラスと弟クラスは、親クラスの母クラスを継承して生成されました。
母クラスに「食事」というメソッドがあったとします。
そのメソッドには「何でも食べる」と書いてあったので、それを受け継いだ兄と弟も「食事」が実行されると何でも食べます。

ある日、兄はyoutubeで食用として養殖された牛が残虐に殺害される映像を見たことをきっかけにヴィーガンに転生してしまいました！

ヴィーガンになった兄は野菜しか食べることができなくなったので、兄の「食事」メソッドを書き換えます。
書き換え方は、兄クラスに母クラスのメソッドと同様の名前である「食事」メソッドを作成し、そのメソッドに「野菜だけ食べる」というように記述します。
そして、「食事」を実行すると母と弟は今まで通りなんでまたべますが、兄は野菜しか食べなくなります。

このように、親クラスから受け継がれたメソッドを子クラスで書き換えることをオーバーライドといいます！

##コードを書いてみる
上で挙げた例に従ってコードを書いてみます。使う言語はc#です。

```c#
//親クラスの母を作る
class MAMA
{
    public virtual void syokuji()
    {
        return "なんでも食べる";
    }
}
//子クラスの兄を作る
class ANI : MAMA
{
//母のsyokujiメソッドをオーバーライド
    public override void syokuji()
    {
        return "野菜だけ食べる";
    }
}
//子クラスの弟を作る
class OTOUTO : MAMA
{
}

class OverriseTest
{
    static void main()
    {
        MAMA mam = new MAMA();
        ANI ani = new ANI();
        OTOUTO oto = new OTOUTO();

        //母の結果
        Console.WriteLine(mam.syokuji());
        //兄の結果
        Console.WriteLine(ani.syokuji());
        //弟の結果
        Console.WriteLine(oto.syokuji());
    }
}
```
このように書きます。実行結果は次のようになります。

```
何でも食べる
野菜だけ食べる
何でも食べる
```
c#でオーバーライドをするには、親クラスのメソッドに「virtual」、子クラスのメソッドに「override」と記述する必要があります。
今回のコードだとMAMAクラスのsyokujiメソッドに「virtual」、ANIクラスのsyokujiメソッドに「ovarride」を付けました。

##まとめ
もう疲れたのでこの辺にしときます。
バイト頑張る。以上
burpのRepeaterで送信を行った際にハングアップする場合

burpのRepeater使用時に極稀に応答が返って来なくなる場合がある。

返って来なくなる例

```
GET /hoge/hello HTTP/1.0
Host: http://example.com
```

この場合ボディ句が無いため、末尾に改行を2回打てば治った

```
GET /hoge/hello HTTP/1.0
Host: http://example.com
↪
↪
```
DockerでSFTPサーバ立ててGoでアクセスしてみる

# 最初に
GoのSFTPパッケージ触りたかったけど、サーバ立てるのも面倒だったのでコンテナでサクッとやっちゃおうと思ったメモ

## SFTPサーバ立てるメモ
[atmoz/sftp](https://github.com/atmoz/sftp)を使って

```yaml:docker-compose.yml
version: '3'

services:
  sftp:
    image: atmoz/sftp
    container_name: sftp-server
    volumes:
      - ./sftp-server/upload:/home/foo/upload
    ports:
      - "2222:22"
    command: foo:pass:::upload
```
な感じでyaml用意して

```
mkdir sftp-server
mkdir sftp-server/upload
docker-compose up -d --build
sftp -oPort="2222" foo@localhost
```
な感じでコマンド叩いて、パスワードに`pass`って入れたら接続できる。

```
sftp> cd upload
sftp> put test
sftp> exit
```
な感じでupload以下にファイル配置OK

## Go
SFTPが用意できたので、[github.com/pkg/sftp](https://pkg.go.dev/github.com/pkg/sftp)と[golang.org/x/crypto/ssh](https://pkg.go.dev/golang.org/x/crypto/ssh)のサンプル参考に

```Go:main.go
package main

import (
	"fmt"
	"log"
	"os"

	"github.com/pkg/sftp"
	"golang.org/x/crypto/ssh"
)

func main() {
	if err := Main(); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
}

func Main() error {
	host := "localhost"
	port := "2222"
	user := "foo"
	pass := "pass"

	fmt.Println("Create sshClientConfig")
	sshConfig := &ssh.ClientConfig{
		User: user,
		Auth: []ssh.AuthMethod{
			ssh.Password(pass),
		},
		HostKeyCallback: ssh.InsecureIgnoreHostKey(),
	}

	fmt.Println("SSH connect")
	addr := fmt.Sprintf("%s:%s", host, port)
	fmt.Println(addr)

	conn, err := ssh.Dial("tcp", addr, sshConfig)
	if err != nil {
		return err
	}

	fmt.Println("open an SFTP session over an existing ssh connection")
	client, err := sftp.NewClient(conn)
	if err != nil {
		return err
	}
	defer client.Close()

	fmt.Println("walk a directory")
	w := client.Walk("./")
	for w.Step() {
		if w.Err() != nil {
			continue
		}
		log.Println(w.Path())
	}

	fmt.Println("leave your mark")
	f, err := client.Create("./upload/hello.txt")
	if err != nil {
		return err
	}
	if _, err := f.Write([]byte("Hello world!")); err != nil {
		return err
	}
	f.Close()

	fmt.Println("check it's there")
	fi, err := client.Lstat("./upload/hello.txt")
	if err != nil {
		return err
	}
	log.Println(fi)

	return nil
}
```
な感じで接続OK

[kotaoue/go-sftp](https://github.com/kotaoue/go-sftp)にコードおいておく 🐓
Paiza出力は同じなのにエラーになる原因

#Paiza提出前に確認すること
最近Paizaを始めた者です。
出力は同じなのにエラーになったので原因を探ったところ簡単なミスでした。
しかし同じミスで解決できてない方もいるかもなので共有しておきます。

##実際の処理
```php
//期待される出力
3 3 7 3 7 5 8 3 5 3
//出力処理
foreach($posts as $post){
   echo $post.' ';
}
//実際の出力
3 3 7 3 7 5 8 3 5 3
```

こちらでエラーになりました。
結論から原因は最後の数値の後ろにもスペースが入っているというものでした。
Paizaさんも提出前にちゃんと
<font color="DeepPink">「期待する出力と出力結果が同じに見えるのに失敗になる場合、半角スペースや改行の数が異なっていると考えられます。
余分な半角スペースや改行がないかを今一度ご確認ください。」</font>
と教えてくれていました。しっかり最後まで文章を読まなくては。。。
##解決策
一応今回のケースの解決策も載せておきます。

```php
//期待される出力
3 3 7 3 7 5 8 3 5 3
//出力処理
$str = implode( ' ', $inputs);
echo $str;
//実際の出力
3 3 7 3 7 5 8 3 5 3
```

implode()を使い値の間にだけスペースを入れることで解決しました。
GitHub SSH接続初期設定後、ファイルをコミットする

# SSH接続(初期設定)

ubuntuで実施。Windowsは一番下に追記してます。
鍵の作成は以下。（ssh-keygenでいける？）
https://qiita.com/shizuma/items/2b2f873a0034839e47ce
.sshでconfigを修正。（エディタはなんでも）

```
$ cd .ssh
$ atom config
```

上で開いたconfigに以下を記述。

```
Host github.com
  HostName github.com
  User git
  IdentityFile "~/.ssh/秘密鍵名(pubがついてない方)"
```


# SSHでファイルをコミット

作業ディレクトリにて以下を実行すると、「.git/config」が生成される。

```
$ git init
...
Initialized empty Git repository in /-/-/.git/
$ cat .git/config
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
```
[core]だけが生成されました。わあ。
てか、リポジトリ作ったときに表示される以下のようなコマンド叩けばできる。（リポジトリ作るときにREADMEにチェック入れると表示されないから注意）

```
echo "# test" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:USER/test.git
git push -u origin main
```


# windowsでもやったので追記
１．OpenSSHをインストール
https://obenkyolab.com/?p=1681

２．鍵を作成（一連の流れは以下）
https://qiita.com/hollyhock0518/items/a3fee20951cd92c87ed9

Visual StudioとGithubを連携したい場合は以下を参照。
https://qiita.com/Shi05yu/items/fb64ebcb5b8efb9c43c7

# おまけ：SSH接続できてるかの確認
```
$ ssh -T -v git@github.com
```
[Solved] Install Old Version React

When the latest React is 5.0.0, I encountered an error when I needed to install an older version of React (4.0.3).

```bash
npx create-react-app@4.0.3 app-name

> You are running `create-react-app` 4.0.3, which is behind the latest release (5.0.0).
> We no longer support global installation of Create React App.
```

It was written that `npx clear-npx-cache` would solve the problem, but it did not.
However, I was able to install it normally with the following method.

```bash
npx create-react-app app-name --scripts-version 4.0.3
```
---

最新のReactが5.0.0の時に、古いバージョンのReact(4.0.3)をインストールする必要が出てきて、エラーに遭遇。

```bash
npx create-react-app@4.0.3 app-name

> You are running `create-react-app` 4.0.3, which is behind the latest release (5.0.0).
> We no longer support global installation of Create React App.
```

`npx clear-npx-cache` で解決するとか書かれてたけど解決せず。
でも、次の方法で普通にインストールできた。

```bash
npx create-react-app app-name --scripts-version 4.0.3
```
AOJトライに関する知識知見の記録共有：Volume0-0060

# タスク概要

Card Game

https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0060
 
# コード実装例
TIPS

1. 例外処理含む評価パターンを追加

```Python
import pprint, sys, time

def core(arg, adv=True, n_cards=10, s_limit=20, k=3):
    my_cards = arg[0]
    your_cards = arg[1]
    
    n_cards = max([n_cards] + my_cards + your_cards)
    if adv:
        candidates = [n for n in range(1, s_limit - sum(my_cards)) if n not in my_cards + your_cards]
    else:
        candidates = [n for n in range(1, n_cards + 1) if n not in my_cards + your_cards and sum(my_cards + [n]) <= s_limit]
    flag = "YES" if len(candidates) >= 0.5 * n_cards else "NO"
    return [flag, n_cards, candidates[:k]]

def app(*args):
    ret = []
    for arg in args:
        s = []
        for adv in [False, True]:
            st = time.time()
            try:
                r = core(arg, adv=adv)
            except Exception as e:
                r = e
            s.append([adv, round(time.time() - st, 6), r])
        ret.append([arg, s])
    return ret

print(sys.version)
pprint.pprint(app(
    # basic examples
    [[1, 2], [3]],
    [[5, 6], [9]],
    [[8, 9], [10]],
    # additional examples
    [[1000000, 3], [1]],
    [[4, 7], [1000000]],
    # exceptional examples
    "例外入力"
))
```

# 実行結果
各種補足情報出力（入力値FB、デバッグログ等）含む

```Python
3.8.10 (default, Sep 28 2021, 16:10:42) 
[GCC 9.3.0]
[[[[1, 2], [3]],
  [[False, 1e-05, ['YES', 10, [4, 5, 6]]],
   [True, 5e-06, ['YES', 10, [4, 5, 6]]]]],
 [[[5, 6], [9]],
  [[False, 5e-06, ['YES', 10, [1, 2, 3]]],
   [True, 3e-06, ['YES', 10, [1, 2, 3]]]]],
 [[[8, 9], [10]],
  [[False, 4e-06, ['NO', 10, [1, 2, 3]]], [True, 2e-06, ['NO', 10, [1, 2]]]]],
 [[[1000000, 3], [1]],
  [[False, 0.267864, ['NO', 1000000, []]], [True, 1e-05, ['NO', 1000000, []]]]],
 [[[4, 7], [1000000]],
  [[False, 0.26715, ['NO', 1000000, [1, 2, 3]]],
   [True, 5e-06, ['NO', 1000000, [1, 2, 3]]]]],
 ['例外入力',
  [[False, 8e-06, TypeError('can only concatenate list (not "str") to list')],
   [True, 3e-06, TypeError('can only concatenate list (not "str") to list')]]]]
```

# 補遺
残課題（Pull Request絶賛募集中！）

1. 実行速度の改善（枝刈り、データ構造の見直し等）
1. コア関数の汎用化
P2V とは

## 勉強前イメージ

文字列だけ見たやつ

## 調査

### P2V とは

Physical to Virtual の略で、オンプレで稼働しているシステムをクラウドへ移行することを指します。
Physical(物理マシン) to(2) Virtual(クラウド) というような略語です。
物理サーバの保守切れや経費削減からクラウドへの移行が多くなってきます。
移行は専用のツールもいくつもあり、自動的に行われることもありますが、
移行元のOSやミドルウェアが古い場合は手作業になる場合もあります。

逆に、V2Pという言葉もあり
クラウドからオンプレへ移行することを言います。
そこまで多くはないですが、経費面などから行われることはあります。

## 勉強後イメージ

あまりここから広げられなかった。
toを2って読むのなんかいいよねw

## 参考

- [用語集｜P2V](https://www.idcf.jp/words/p2v.html)
- [P2V 【Physical to Virtual】 P2Vマイグレーション](https://e-words.jp/w/P2V.html)
【共有】「強強エンジニア」が言っていた有用な情報

共有失礼します。
ほぼこぴーです
Zenは質の高い記事があっていいですねｂ


俗に言うなんでも屋の人間がよく若手のキャリアプランについて聞かれるので、
納得するための30minと自分が毎年やっていることを話す
https://zenn.dev/gama/articles/2893c2ac322152



#プログラミング力を高めるには？	
	
「結局は地道に書き続けるしかない。	
最初はコードの一部を書き換えたりして学ぶ。
その次は自分で考えたものを作る。
もしくは他の人のコードを真似して作る。

そうすることでプログラミング力は高くなると思います。」	

<b>近道はないそうです</b>


<br>
プログラミングは結局、自分でキャッチアップしないといけないので、

<b>やる子がやる世界</b>



##技術力が追いつかない件について
とある審査員の方が僕に投げかけた質問です。
「君は何でプログラミングを始めたの？？」

僕「そりゃぁ、自分のアイデアを形にできて、今作りたいものがあるからです。」
Tさんはこの返答が意外だったのか、驚いた表情で、「それめっちゃエンジニア向いてるよ！！」

僕「いや、でもそれに対する技術力が伴わなくって、、、」
Tさん「伴わなくて当たり前なの！！今実装したい機能を勉強してやったとしても、あれを追加したい、やっぱ最新の技術に変更しようとなって、結局は技術力なんて一生追いつくことはないんだよ。」

僕は「技術力がないこと」を理由に開発をしない口実を作っていただけなのかもしれません。
これを聞いてからは吹っ切れて、個人開発を進めています
（まぁキャッチアップしながらなので、苦戦を強いられてはいますが笑）




##最後に
ハッカソンは本当に勉強になります。
ビビらず、「自分なんか」なんて思わず、参加しましょう！！
困ったらメンター陣に相談すれば何とかなります。
開発経験をハッカソンで積んで強強エンジニアを目指しましょう！！
【開発極意】スタートアップ～中規模くらいの組織で新規サービスをつくる場面

#◆Worse is Betterという考え方

http://chasen.org/~daiti-m/text/worse-is-better-ja.html
https://note.com/ruiu/n/n9948f0cc3ed3
自分が見てきた中でWebフロントエンドの開発効率が落ちてしまう一番の要因は、きれいで理論的には優れているアーキテクチャを構築しようとしてそれ自体がもたらす複雑性を支えきれないというパターンです。
少し前にフロントエンドにClean Architecture（以下CA、あの同心円の図を指すのは誤用に近いですがここではそれに乗ります）を導入する記事が流行ったと思いますがあんな感じです。ああいったクラスベースでDIが重要となる設計手法はサーバーサイドのJavaでSpringを使うのとは違ってReactがサポートしているものではないため、CAの実現自体に高い設計スキルが必要になると思います。もちろんつくるアプリケーションの複雑度にもよりますが、フロントエンドでCAを必要とするほど複雑なアプリケーションはそう多くはないと思います。
CAによって外部に依存しない純粋なビジネスロジックを表現したコードを手に入れることができますが、そのトレードオフとしてコード量や複雑性が増加することは無視できません。CAを諦めて、サーバーサイドのOpenAPIの型に直接依存するようにして薄く作るとコード量が少なく理解しやすいコードベースを構築できます。そうすることでCAのメリットとなるビジネスロジックの純粋性はトレードオフとして失われますが、代わりに得られたコードのシンプルさによる理解のしやすさや変更容易性を重視するというのが（自分の理解する限りでの）Worse is Better的な考え方です。




#◆コードの品質の価値を過小評価しない
書籍Clean Architectureはあの同心円の図が独り歩きしてますが、設計以前の考え方に結構なページ数が割かれていてしかもとても参考になります。


序盤に出てくる刺さったフレーズを2つ雑に要約してみます。

```
１．汚いコードを書く方がクリーンなコードを書くより常に遅い
　　・スタートアップだから、開発初期だからコードが汚くていいということはない
２．ソフトウェアの構造は振る舞いと同等の価値を持つ（構造≒変更が容易であること）
　　・完璧に動作するけど変更ができないより、バグだらけだけど変更が容易な方が良い
```

特に2番目は個人的には目からウロコで、ソフトウェアのユーザーに提供する動作・振る舞いと同じくらいアーキテクチャとコード品質が適切に保たれていることが大事という視点はなかったです。同書では構造というエンジニアにしか見えない価値を守るのはエンジニアの責任であり、そのためにはPdMやセールスといったステークホルダーと「闘争」して構造を守る必要があるとまで書かれています。そして1番目にもあるようにコードの品質を高くすることが結局は開発速度を速くするのであればそこに注力するのが正しいと言えそうです。この1番目については書籍Clean Architectureにあるような設計テクニックをつぎ込んできれいで正しい「良い」アーキテクチャを目指したくなりますが、トレードオフを見てWorse is Better的な設計・コードを採用すべきだと思います。
【キャリア形成】コンサルとして生きる道

コンサルタントとうまく付き合う方法（案）

https://qiita.com/kaizen_nagoya/items/499b0a16ac89c0fe3fb0


>コンサルタントといっても、経営コンサルタントのように、数字ですぐに採否を決められるようなコンサルタントもあれば、技術コンサルタントのように１０年後にしか成果がでず、１０年に１回ぐらいしか呼ばれないような仕事の仕方もあります。

>自分および自分の師匠の流派は、お客様第一で、一度呼ばれたら、次に呼ばれるのは１０年後くらいだろうという想定のもと、一回でできるかぎり解決してしまおうという仕事の仕方です。

>ある塊の仕事を、１年間に平たく伸ばして、年収を確保しようという営業的な配慮はここではしていません。

>お客様の方で、あいつが食っていけなくなって、１０年後にまた頼む時に頼めないと困ると思い、仕事を横流ししてくださるようなお客様を想定しています。

>いかに、言い出せないことを、言いだしてもらうかに半分時間を費やしてもかまわないというのが経験則です。

>経営者があなたではなく、コンサルの言うなりだったら、その会社を辞める良い機会かもしれません。

>優秀なコンサルほど、たくさんの経験があっても、
自分の話を先にするのではなく、お客様の実情を知ろうとします。
vue3 で day.js

day.js を vue3 で読み込む方法。

```app.js

import dayjs from 'dayjs';
import 'dayjs/locale/ja';
dayjs.locale('ja');

const app = createApp({

    data () {
        return {
            dayjs:'',
        }
    },

    created(){
        this.dayjs = dayjs;

```

```hoge.vue

{{this.$root.dayjs().format('YYYY年M月DD日')}}

```


こんな感じ
余白指定がすごく便利「gap」

余白といえばmarginやpaddingですが、gapでも余白がとれます。
※ただしdisplay: flex;かdisplay: grid;を指定している場合のみ

メディア型やカード型のレイアウトとかめちゃ便利です！

###使い方
```HTML:index.html
<ul class="hoge_list">
  <li class="hoge_item">gap便利だよ</li>
  <li class="hoge_item">gap便利だよ</li>
  <li class="hoge_item">gap便利だよ</li>
  <li class="hoge_item">gap便利だよ</li>
  <li class="hoge_item">gap便利だよ</li>
  <li class="hoge_item">gap便利だよ</li>
</ul>
```
```CSS:style.css
// インナー幅 1024px

.hoge_list {
  display: flex;
  flex-wrap: wrap;
  gap: 24px 32px;
}
.hoge_item {
  width: 320px;
  background: #ccc;
  padding: 50px 20px;
  text-align: center;
}
```

###結果
![gap結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552308/30a2e6fa-35ff-45ff-3037-03c6dacb7576.png)
`gap: 行間（row-gap） 列間（column-gap）;`
※片方しか指定してないときは空いている部分の余白を取ってくれる

これでnth-childとかlast-childなども使用しなくていいし、記述も減らせます！

↓参考にさせてもらった記事はこちら
https://ics.media/entry/210628/
【備忘録】 理想のスキルセット

向いてるかどうか別として（👈ココ大事）
> 『育てる,　教える』＜＜＜『仕事できる奴らとイイものマネタイズできるものを作る,学ぶ』 方が興味がある


競プロ：

```
Python3
```


<br>
個人開発：


```
◆新スキル希望
Front :TypeScript(React)
Back :TypeScript
競技プロ：Python🐘

※変更
Go：typeScriptが優秀。
　　Goは業務で触ったら学ぶくらいの感覚でよいなといった印象
```

<br>
業務: バックエンド希望(サーバーサイド)

```
Java(SpringBoot)
Go 1択(Web開発)
Python(AI)
Node.js
React(アトミックデザイン)
```
小ネタ／GitHub Actions の Python 環境で MeCab + NEologd を使う

こちら↓の Q&A サイトで関連する質問の抽出を実装する際に、GitHub Actions（Python）で MeCab + NEologd を使ったので、メモ的に残しておきます。

https://vaccinecert-faq.code4japan.org/

- **[ワクチン接種証明書アプリ FAQ](https://vaccinecert-faq.code4japan.org/)**

**参考：**

 - **[DockerでPython公式イメージ + MeCab + NEologd辞書](https://qiita.com/Takayoshi_Makabe/items/18cefa4b4572d12b5aa9)（Takayoshi_Makabe さん）**

# ポイント

GitHub Actions で使用する`.yml`ファイルを記述する際、

 - `cd`が使えないので代わりに`working-directory`を指定する
 - `/etc/mecabrc`に上書きしようとすると権限エラーが出るので、別の場所に書き出しておいた`mecabrc `を`/usr/local/etc/`の下にコピーする

の 2 点、気を付けるだけです。

# `.yml`ファイルの例

Ubuntu のイメージを使う例です。

```yml:data-creator.yml
# This is a workflow example with Actions

name: mecab neologd example
env:
  TZ: Asia/Tokyo
on:
  schedule:
    - cron:  '00 */3 * * *'
  workflow_dispatch:
jobs:
  process_data:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          ref: main
          path: production

      - name: Setup python
        uses: actions/setup-python@v2
        with:
          python-version: "3.9"
      
      - name: Install packages
        run: sudo apt-get install -y mecab libmecab-dev mecab-ipadic-utf8
      - name: Get MeCab dictionary
        run: git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
      - name: Setup MeCab dictionary
        run: ./bin/install-mecab-ipadic-neologd -n -y
        working-directory: ./mecab-ipadic-neologd
      - name: Setup MeCab configure
        run: echo dicdir = `mecab-config --dicdir`"/mecab-ipadic-neologd" > mecabrc && sudo cp mecabrc /usr/local/etc/
      - name: Install dependencies
        run: pip install mecab-python3
```

※この後ろに具体的な処理を書きます。

# 実際の使用例

こちら↓で使っています。

https://github.com/code-for-hamamatsu/vaccinecert-faq

- **[GitHub - code-for-hamamatsu
/
vaccinecert-faq](https://github.com/code-for-hamamatsu/vaccinecert-faq)**

なお、MeCab の処理に関連するコードだけ抜き出したリポジトリ（本体に組み込む前のテストで使ったもの）はこちら↓です。

https://github.com/hmatsu47/vaccinecert-qa-similarity-test

- **[GitHub - hmatsu47
/
vaccinecert-qa-similarity-test](https://github.com/hmatsu47/vaccinecert-qa-similarity-test)**
[Ruby] シングルクオートとダブルクオートに違いがあるって知らなかった。

# はじめに
初学者ですが、いくつかアプリを制作し慣れてきていたと自覚していた私ですが、まだまだ奥が深く面白いのがプログラミングであるなと更に思わされました。
Rubyに関する本を読み、「そんな理由があるんだ！」と思わされた事を紹介させてください。
#シングルクオート、ダブルクオートとは
### どちらも文字列を作る為にある
Rubyでは文字列を作る方法として、シングルクオート、ダブルクオートで囲む方法があります。

```apex
'シングルクオート'
"ダブルクオート"
```
私の知識ではどちらでもよく、好みにより使い分けたり見やすくするために使い分けることがあるのだと思っていました。
#どんな時に違いがあるのか？
## バックスラッシュ記法を使用する時
###\nは"”で囲まれている文字列を改行させる
ちなみに\←はmacだとoptionを押しながら¥を押すと表示させることができます。

```apex
//シングルクオートの場合
'おはよう\nおやすみ'
=> おはよう\nおやすみ
//ダブルクオートの場合
"おはよう\nおやすみ"
=> おはよう
おやすみ
```

###ダブルクオートでしか機能しません！
\nの他にも\r、\tなどの特殊文字などもあります。
↓バックスラッシュ記法については以下参考記事にてまとめられています。
[バックスラッシュ記法](https://www.javadrive.jp/ruby/string/index2.html)

# 式展開を使用する時
### #{}の中に変数を入れ、変数の値を文字列に埋め込む

```apex
//シングルクオートの場合
name = '太郎'
puts 'おはよう、#{name}'
=> おはよう、#{name}
//ダブルクオートの場合
name = "太郎"
puts "おはよう、#{name}"
=> おはよう、太郎
```
###ダブルクオートでしか式展開されない！

# おわりに
最後にまで読んでくださった方ありがとうございます。
アウトプットの仕方などこうした方がもっといい記事になるなどご教授いただけたら嬉しいです。
親のチェックボックスの状態を子のチェックボックスにも連動させるJavaScriptの書き方

## 実現したい機能
- **親のチェックボックスにチェックが入ったら、子のチェックボックスにもチェックを入れる**
- **親のチェックボックスでチェックが外れたら、子のチェックボックスからもチェックが外れる**
- **子のチェックボックスでチェックが入ったり、外れたりしても親のチェックボックスは反応しない**

## サンプルページ
https://kaibara.github.io/js-checkBox/

## Github
https://github.com/kaibara/js-checkBox

## コード
### HTML

```index.html
<ul>
	<li class="checkbox">
	  <input type="checkbox" name="parent">親チェックボックス
	  <ul>
	    <li class="checkbox"><input type="checkbox" name="child1">子チェックボックス1</li>
	    <li class="checkbox"><input type="checkbox" name="child2">子チェックボックス2</li>
	    <li class="checkbox"><input type="checkbox" name="child3">子チェックボックス3</li>
	  </ul>
	</li>
</ul>
```

### JavaScript

```check.js
$(function (){
    $('input[name^="parent"]').change(function() {
        if ($(this).is(':checked')) {
            $(this).parents('.checkbox').find('input:checkbox').prop('checked', true);
        }else{
            $(this).parents('.checkbox').find('input:checkbox').prop('checked', false);
        }
    });
});
```

## 解説
### コードの解説
前提として、親のチェックボックスである`<input type="checkbox" name="parent">`の状態が変化した時、`check.js`が発火する。

`<input type="checkbox" name="parent">`の状態が`checked`になった際、次の処理が行われる。

```check.js
 $(this).parents('.checkbox').find('input:checkbox').prop('checked', true);
```

このコードがそれぞれ何を指すのか分解してみる。

- **` $(this)`**: `<input type="checkbox" name="parent">`の指定。
- **`parents('.checkbox')`**: `<input type="checkbox" name="parent">`の親である`<li class="checkbox">`の指定。
- **`find('input:checkbox')`**: `<li class="checkbox">`の中にある`<input type="checkbox">`を探す。
- **`prop('checked', true)`**: `checked`入れる。

以上を踏まえて、文章にしてみると、

**`<input type="checkbox" name="parent">`の親である`<li class="checkbox">`を探して、その中にある`<input type="checkbox">`の状態を`checked`にする。**

となる。
**`.prop('checked', false)`**の場合は、`checked`を外す処理が行われる。

### 仕組みの解説
このコードが何故親のチェックボックスに反応して、子のチェックボックスも反応できるようになるのかというと、**親と子における`<li>`タグと`<input>`タグで同じ`class`名を付けている**から。

`checked`にする動きで考えてみる。

```check.js
    $('input[name^="parent"]').change(function() {
        if ($(this).is(':checked')) {
```

`if`文の`true`分岐に入る時点で、親のチェックボックスには`checked`が入っている。
その状態で、

```check.js
 $(this).parents('.checkbox').find('input:checkbox').prop('checked', true);
```

このコードが動くと、親の状態とかは関係なく、jsは`<li class="checkbox"><input type="checkbox">`の構成をしている部分をHTMLから探す。
その結果、**`<li class="checkbox"><input type="checkbox">`の構成をしていて、まだ`checked`が入っていない、子のチェックボックスに`checked`が入り、親と子で同時にチェックが入る(ように見える)**。

流れを簡潔にまとめると、以下のようになる。
1. **親のチェックボックスにチェックが入り、`check.js`が発火**
2. **`<li class="checkbox"><input type="checkbox">`に該当するHTMLタグの状態を`checked`にする**
3. **親にはもう`checked`が入っているから見た目に変化はない。子は`checked`に変化**


## 参考資料
- [.parent() | jQuery 1.9 日本語リファレンス | js STUDIO](https://js.studio-kingdom.com/jquery/traversing/parent)
- [親にチェックするだけで、子や孫のチェックボックスもまとめてチェック出来る | かちびと.net](http://kachibito.net/snippets/check-parent-and-children)
- [【脱jQuery】.parents()で親要素よりも上の要素の取得をネイティブJavascriptに書き換え | ウェブラボ（株）スタッフブログ | ウェブラボ（株）スタッフブログ](https://www.weblab.co.jp/staff/creator/10166.html)
css だけで ヘッダを固定

ヘッド要素の自動追随。
くっついて来るメニュー。
vue2 のときはvue.js の headroom を使っていたが見つからない。


ということで結論

```hoge.vue

<header style="background-color:yellow;position: sticky;top: 0;height:42px;z-index: 9999;">
    これがヘッダーになるよ固定されるよ
</header>


```

たったこれだけok。
要素が後ろになったりする場合は z-index を多くしよう。
【Ruby on Rails】 日時データを年月日の形式で表示する

#日時データを年月日で表示したい

scheduleというテーブルの中から、startという日時データのカラムの値を表示したい時、

```
<%= schedule.start %>
```
↑こんな感じで書くと

![スクリーンショット 2022-01-11 21.34.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449886/3882c94a-c11c-901d-f20d-bc0d54a3ebb2.png)
↑こんな感じで表示される。
これを、年月日だけで表示していきたい。

#対処法

```
<%= schedule.start&.strftime("%Y年 %m月 %d日") %>
```
↑このように書くと、
![スクリーンショット 2022-01-11 21.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449886/ffa4b769-8cf1-736a-c061-18749bac8a2b.png)
↑こんな感じで表示される。

#時、分まで表示する
更新日時(updated_at)など、何時何分の部分を表示したい時は、

```
<%= schedule.updated_at&.strftime("%Y年 %m月 %d日 %H時 %M分") %>
```
こんな感じの書き方になる。
Scratchの面白い仕様

Scratchにはいくつか面白い仕様があるので、紹介します。
作品作りの役に立つものも、そうでないものもあります。
#アルファベットの大文字と小文字
大文字と小文字は同じ文字として判定されます。
![Screenshot from 2022-01-11 21-37-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2468028/6949de25-d4ef-1993-489c-9cf6576a9451.png)
#計算結果
0÷0=NaN
1÷0=Infinity
-1÷0=-Infinity
になります。
![Screenshot from 2022-01-11 21-40-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2468028/be491cb7-3769-767f-857d-f5a6f60d8a98.png)
![Screenshot from 2022-01-11 21-39-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2468028/6de9a916-ab3b-5fbe-b3bf-5ae26709d8d1.png)
![Screenshot from 2022-01-11 21-40-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2468028/b702b3db-1755-0668-e416-4bfa054813ba.png)
#作品リンク
Scratchの作品のリンクは　```https://scratch.mit.edu/projects/作品番号/```　となっていますが、作品番号の前に0を入れると作品の説明やコメント欄だけ読み込まれ、作品は読み込みエラーになります。
```https://scratch.mit.edu/projects/546551170/```のとき
![Screenshot 2022-01-11 at 21-50-50 Scratch - 傘バトル Ver１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2468028/4fe9716b-5a06-d83d-ab6c-a0e1a542cb2c.png)
```https://scratch.mit.edu/projects/0546551170/``` のとき
![Screenshot 2022-01-11 at 21-51-05 Scratch - 傘バトル Ver１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2468028/434ae15e-216a-7181-0ba1-0ff24dc58b1a.png)
#色の効果
色の効果をInfinityにすると、彩度が0になります。

<iframe width="560" height="315" src="https://www.youtube.com/embed/yqKLcTiIT5k" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


#まとめ
Scratchには面白い仕様がたくさんあります。
他に追加する内容があったらコメントで教えてください。
【Rails】ActionController::RoutingError (uninitialized constant HogeControllerの対処法

<h2>症状</h2>
railsで新たにアクションを追加したときに下記エラーメッセージが表示されました。
翻訳すると「初期化されていない定数hogeController」でした。

```terminal:error
ActionController::RoutingError (uninitialized constant HogeController
```

routeファイルとhoges_contollerファイルは以下です。

```ruby:routes.rb
post 'hoge', to: 'hoge#update'
```

```ruby:hoges_contoller
class HogesController < ApplicationController
end
```

<h2>解決方法</h2>
routeファイルのhogeをhogesに変更することで解決しました。

```ruby:route.rb
post 'hoge', to: 'hoges#update'
```

下記の記事ではファイル名が間違っていたため同様のエラーが出ていたようです。
このエラーでは、ファイル名やルーティングの名前が正しくないと出てくるようです。

https://qiita.com/rayile0630/items/a6f79acf8b7a39e11184

<h2>参考</h2>

https://qiita.com/rayile0630/items/a6f79acf8b7a39e11184
useRefで連想配列を使う(Typescript)

タイトル通りですが、意外に連想配列を渡す例がネットで見つからなくて困ったので、メモ程度に書いています。

```App.tsx
type TodoType = {
  id: number;
  todo: string;
  isDone: boolean;
};

const App: React.FC = () => {
  const [inputText, setInputText] = useState<string>("");
  const text = useRef<TodoType[]>([]);

  const changeText = () => {
    text.current.push({
      id: text.current.length++,
      todo: inputText,
      isDone: false
    });
  };

  const onChange = (e: React.ChangeEvent<HTMLInputElement>): void => {
    setInputText(e.target.value);
  };

  return (
    <>
      <input type="text" onChange={onChange} value={inputText} />
      <button onClick={changeText}>Change</button>
      <p>
        {text.current.map((i) => (
          <li key={i.id}>{i.todo}</li>
        ))}
      </p>
    </>
  );
};
export default App;
```
シフトで負の値を与えるとどうなるのか？

左シフトと右シフト（符号なし）に負値を与えてみます。

実行環境は macOS 12.1 (Intel版) のターミナル

```Console:ターミナル
$ node
Welcome to Node.js v16.13.1.
Type ".help" for more information.
> (1<<(-1)).toString(16)
'-80000000'
> (1<<(-2)).toString(16)
'40000000'
> (1<<(-3)).toString(16)
'20000000'
> (1<<(-31)).toString(16)
'2'
> (1<<(-32)).toString(16)
'1'
> (1<<(-33)).toString(16)
'-80000000'
> (0x1234<<(-4)).toString(16)
'40000000'
> (0x1234<<(-8)).toString(16)
'34000000'
> (0x1234<<(-16)).toString(16)
'12340000'
> (0x1234<<(-32)).toString(16)
'1234'
> (0x1234<<(-36)).toString(16)
'40000000'
> (1>>>(-1)).toString(16)
'0'
> (0x80000000>>>(-1)).toString(16)
'1'
> (0x80000000>>>(-2)).toString(16)
'2'
> (0x80000000>>>(-30)).toString(16)
'20000000'
> (0x80000000>>>(-31)).toString(16)
'40000000'
> (0x80000000>>>(-32)).toString(16)
'80000000'
> (0x80000000>>>(-33)).toString(16)
'1'
> (0xFEDC0000>>>(-1)).toString(16)
'1'
> (0xFEDC0000>>>(-4)).toString(16)
'f'
> (0xFEDC0000>>>(-8)).toString(16)
'fe'
> (0xFEDC0000>>>(-16)).toString(16)
'fedc'
> (0xFEDC0000>>>(-32)).toString(16)
'fedc0000'
> (0xFEDC0000>>>(-33)).toString(16)
'1'
> 1<<33
2
```

という結果が得られました。

仕様がどうなっているのか知らない（定義されてない気がする）けど、実際の挙動は

```JavaScript:
function left_shift(x, n) { return x << (n & 31); }
function right_shift(x, n) { return x >> (n & 31); }
```

となっているようです。プロセッサ依存だったりしないのかな？
【Rails】dynamic constant assignmentの対処法【Ruby】

<h2>症状</h2>
railsで以下エラーが発生しました。
翻訳すると、「動的定数の割り当て」でした。

```terminal:error
SyntaxError (C:/app/controllers/api/v1/users_controller.rb:21: dynamic constant assignment
          YOUR_DOMAIN = 'http://localhost:3000'
          ^~~~~~~~~~~
```

```ruby:users_controller.rb
def update
user = User.find_by(id: params[:userId])

DOMAIN = 'http://localhost:3000'

if(user.save!(user_params)
  redirect_to DOMAIN + '?success=true',
else
  redirect_to DOMAIN + '?canceled=true',
end

end
```

<h2>解決方法</h2>
ApplicationControllerに移動して、解決しました。
定数をアクション内で書いたから怒られていたようです。

```ruby:application_controller.rb
DOMAIN = 'http://localhost:3000'
```

<h2>参考</h2>

https://k-koh.hatenablog.com/entry/2020/09/07/120338

https://railsdoc.com/page/redirect_to

http://mindia.jp/akikumo_tea/rails-%E5%AE%9A%E6%95%B0
PAD: Excel の 変換 *.xls から *.xlsx

# 背景
未だに *.xls ファイルを利用していたりするのです・・
でも、Share Point や Automate で利用しようとすると *.xlsx 形式でなければ動作しません。

ということで、PAD 用の変換方法を用意した、というお話。

# 概要
単純に、PAD で開いて、形式選択して保存したら OK でした。

Share 上であれば、閲覧状態で開かれた後で、編集に変更すると、「変換」が簡単に出来るのはありがたいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f728e4ca-3f5b-7cd3-2cae-19e6634339ec.png)

# 動作例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/e3f0df7a-11da-264b-c783-5883663639c4.png)


# 実装
このまま PAD のタブに貼り付ければ OK

```powershell:xls2xlsx
SET ExcelPath TO $'''C:\\temp\\Excel97-2003book.xls'''
File.GetPathPart File: ExcelPath RootPath=> RootPath Directory=> Directory FileName=> FileName FileNameWithoutExtension=> FileNameNoExtension Extension=> FileExtension
DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime
Text.ConvertDateTimeToText.FromCustomDateTime DateTime: CurrentDateTime CustomFormat: $'''yyyyMMdd''' Result=> FormattedDateTime
Excel.LaunchExcel.LaunchAndOpen Path: ExcelPath Visible: False ReadOnly: False LoadAddInsAndMacros: False Instance=> ExcelInstance
Excel.SaveExcel.SaveAs Instance: ExcelInstance DocumentFormat: Excel.ExcelFormat.OpenXmlWorkbook DocumentPath: $'''%Directory%/%FileNameNoExtension%_%FormattedDateTime%.xlsx'''
Excel.CloseExcel.Close Instance: ExcelInstance
```
ゆるいスクラムからはじめてみる(Sprint 1.0)

## これまでのあらすじ
リモートワーク下フルタイムじゃない人たちばかりのチームですがスクラムの必要なところだけ抜き出して再構築してやってみよう。

前回: https://qiita.com/yamamotodin/items/07af2afeedfb48ce8ab2


## Sprint 1の計画
計画会議にて。
Sprintは２週間と決まった。私を含めたエンジニア３人がだいたい半稼働で始められる計画を建てる。
サービスへの入り口となる一つのストーリーから派生する３つの機能に対し、予めグルーミングでPOと協議した内容をチームに共有しディスカッションする。
細かな質疑応答を行い、作るものの詳細についてチーム全体に認識が行き渡り、開発Readyな状態になった・・と思っていた。

ここまではよかったんだけど、これに割ける時間が1.5時間であり、まだ不慣れな中の試行錯誤で・・

## やらかしたこと
まず計画会議が1.5時間では十分な技術的な掘り下げが難しかったと思う（改善は振り返りを待つべきかもしれないけど、私はそう思った）
計画会議を綿密に十分に行うためにはだいたい半日以上かかる場合が多いと助言していたが、まだ理解されていなかったようで、枠がこんなかんじ。

仕様の説明や作るもののアウトライン議論できていたけど、それをどのようにして実現するかの技術的な議論で不十分なところがあり、３つの機能のうち２つの機能で再調整または別途引き取って調整という計画の手戻り的なものが発生した。

具体的に言うと「メールどうやって送るの？」「i18nどうするの？」

インフラ、アーキテクチャにかかわる調整しなきゃいけないのにすっぽ抜けるとかどうかしてるorz

## 小さな失敗
でもいいんですよ。
誰も文句言ってないし、がんばってない証拠でもないし。

何がダメかを明確にして、それをどう改善するかがアジャイルの本質なんだから、最初から正解をたどるより、失敗から学ぶこともあることを認めたほうがいいんだ。
失敗を失敗と認められない事情があったりしてつじつま合わせのごまかしをするよりは、失敗を認め素直に改善に向かおうと思う。

さて・・・がんばって調整しまーす！

あ、時間見積もりはしてないです。時間なかったしこういうこと起こるのわかりきってたから・・
まずは計画の精度を上げよう。
Pythonのenumでネストした (枝分かれした) 状態を管理

# 概要

以前「**[LINE公式垢でボットとチャット両立させてみた！](https://qiita.com/tacomeet/items/a3945d3321ab104a72e2)**」という記事を書いた際は、下記のように`enum.Enum`を用いて、現在の会話の状態を管理していました。

```python

class Type(Enum):
    BN_CREATE = auto()
    BN_CREATE_TRACK1 = auto()
    BN_CREATE_TRACK2 = auto()
    BN_CREATE_TRACK3 = auto()
    BN_CREATE_TRACK5 = auto()
    ...
```

本来、`BN_CREATE_TRACK*`は`BN_CREATE`から枝分かれした状態を表現したいのですが、それが出来ず、並列的に状態が管理されてしまっています。このネストした状態をPythonの `enum.IntFlag` ( `enum.Flag` )を用いて、表現したという記事です。

ネストした（枝分かれした）状態のイメージはこちら
(フローチャート上部からメッセージを送っていくが、途中で分岐が起こり、どの状態かを保存しておく必要がありました。)

![qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1212145/42290ab0-4a7d-bcd9-0722-cb65285a2b09.png)


レポジトリはこちら！

https://github.com/tacomeet/linebot-tm

# ネストした状態を並列に表現することの問題

例えば、枝分かれした先の状態も含めて同じ処理をしたい時に、下記のように該当する状態を全て記述する必要がありました。

```python
if ss_type in (Type.BN_CREATE, Type.BN_CREATE_TRACK1, Type.BN_CREATE_TRACK2, Type.BN_CREATE_TRACK3, Type.BN_CREATE_TRACK5):
    ...
```

# `enum.IntFlag` ( `enum.Flag` )を用いた解決法

`enum.IntFlag` ( `enum.Flag` ) はビット演算子 (&, |, ^, ~) を用いることができる列挙型です。 `enum.IntFlag` はint型が使えるところでは使える `enum.Flag` です。下記のような挙動をします。

```python
from enum import Flag, auto

class Color(Flag):
    RED = auto()
    GREEN = auto()
    BLUE = auto()
    PURPLE = RED | BLUE
    WHITE = RED | GREEN | BLUE

def print_color(color):
    if color == Color.RED:
        print('Color is red')
    elif color == Color.GREEN:
        print('Color is green')
    elif color == Color.BLUE:
        print('Color is blue')
    elif color == Color.PURPLE:
        print('Color is purple')
    elif color == Color.WHITE:
        print('Color is white')
    else:
        print('not defined')

if __name__ == '__main__':
    print_color(Color.BLUE)  # Color is blue
    print_color(Color.PURPLE)  # Color is purple
    print_color(Color.RED | Color.BLUE)  # Color is purple
    print_color(Color.RED | Color.GREEN)  # not defined
    print_color(Color.WHITE)  # Color is white
    print_color(Color.RED | Color.GREEN | Color.BLUE)  # Color is white
```

([enum 超まとめ python3.10](https://qiita.com/macinjoke/items/13aa9ba64cf9b688e74a) より)

概要で記述した部分のコードを下記のように変更し、ヘルパ関数も追加しました。（クラス名も変わっていますが、その部分はお気になさらずに）

```python
# models/status_type.py

class StatusType(IntFlag):
    _BN_CREATE_TRACK1 = auto()
    _BN_CREATE_TRACK2 = auto()
    _BN_CREATE_TRACK3 = auto()
    _BN_CREATE_TRACK5 = auto()

    BN_CREATE = auto()
    BN_CREATE_TRACK1 = BN_CREATE | _BN_CREATE_TRACK1
    BN_CREATE_TRACK2 = BN_CREATE | _BN_CREATE_TRACK2
    BN_CREATE_TRACK3 = BN_CREATE | _BN_CREATE_TRACK3
    BN_CREATE_TRACK5 = BN_CREATE | _BN_CREATE_TRACK5
		...

def is_included(parent: StatusType, child: StatusType) -> bool:
    return parent & child == parent
```

 `_` が最初に入っていないものを `enum.Enum` を使っていた際と同じように用います。しかし、このヘルパ関数のおかげで、下記のように記述するだけでネストしたものも含めたい時の記述が簡潔になります。

```python

if is_included(StatusType.BN_CREATE, ss_type):
    ...
```

少し雑な気もしますが、このようにネストした状態を列挙型を用いて表現することが出来ました。

何か他に良い方法がありましたら、是非とも教えてください！

# 参考サイト

- [enum 超まとめ python3.10](https://qiita.com/macinjoke/items/13aa9ba64cf9b688e74a)
【Ruby】クラスとインスタンスの概念を用いたコードの作成

※初心者向け
※アウトプット練習の為

開発環境
rails 6.1.4.1
ruby 2.6.5

##問題内容##
```ruby
class Article

  def initialize(author, title, content)
    @author = author
    @title = title
    @content = content
  end

end
```
上記のコードに追加を行い、以下の出力結果を得られるようにしてください。ただし、クラスとインスタンスを使用するものとします。

```csharp
著者: 阿部
タイトル: Rubyの素晴らしさについて
本文: Awesome Ruby!
```
##解答##
```ruby
class Article

  def initialize(author, title, content)
     @author = author
     @title  = title
     @content = content
  end

  def author
    @author
  end

  def title
    @title
  end

  def content
    @content
  end

end

article = Article.new("阿部", "Rubyの素晴らしさについて", "Awesome Ruby!")
puts "著者: #{article.author}"
puts "タイトル: #{article.title}"
puts "本文: #{article.content}"
```
##解説##
（23行目）Article.newでインスタンスを生成し、変数articleに代入します。その際に、**阿部**、**Rubyの素晴らしさについて**、**Awesome Ruby!**の3つ実引数を指定します。

（3〜7行目）initializeメソッドを定義して、インスタンス変数を宣言しました。実引数として指定した値を、仮引数の**author**、 **title**、**content**にそれぞれ渡しています。

そうすることにより、initializeメソッドで宣言されたインスタンス変数に、**阿部**、**Rubyの素晴らしさについて**、**Awesome Ruby!**という3つの値が代入されます。

（9〜19行目）上記インスタンス変数の値を返すための専用のメソッドをそれぞれ定義しています。

（24〜26行目）最後に、9〜19行目で定義づけたメソッドを呼び出しています。
C# WinForms + GMap.NET で地図アプリ。（20日目）　

Kotlinの地図アプリが煮詰まってきたので、今度は、Windows用の地図アプリを作成。

今回は、GMap.NETを使ってみました。


https://github.com/judero01col/GMap.NET

Visual Studioのインストールからやっていきます。


#Visual Studio Commnutiy 2022

Visual Studio Commnutiyをインストール

https://visualstudio.microsoft.com/ja/vs/community/

![イメージ7554.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503948/a2ee751c-07c5-4906-e0bc-24c0e2639f7d.jpeg)

#GMap.NETのプロジェクト読込

GitHUBからダウンロードしたZIPファイルを解凍してプロジェクトを読込。

![イメージ7575.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503948/cb5a25dd-f396-4730-58c5-5ae1dd8ec2d8.jpeg)

![イメージ7576.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503948/5310d635-ad07-6b5e-45c9-18819fcd8ce6.jpeg)



#パッケージマネージャー コンソールを使用してパッケージをインストール

READMEに従って、Visual Studioのパッケージマネージャーからインストール

PM> Install-Package GMap.NET.Core
PM> Install-Package GMap.NET.WinForms
PM> Install-Package GMap.NET.WinPresentation

![イメージ7561.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503948/510f749d-8768-5f74-f7a2-eef9e8887ff5.jpeg)


#ERROR:対象フレームワークがインストールされていません

実行すると「対象フレームワークがインストールされていません」というERROR


![イメージ7564.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503948/a83a9ea1-40b5-7b46-c131-ac2831e5bbb3.jpeg)

ダイアログに従ってネットからダウンロードしてインストールしても解決せず。

解決方法

[ツール]
->[ツールと機能を取得]
->[個別コンポーネント]
->[.net framework 4.6 Targeting Pack]

![イメージ7565.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503948/9753ecf0-6c99-473b-2b70-0192805d9ce5.jpeg)

警告はある物の無事解決？

![イメージ7566.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503948/d0c20657-2fa5-0fb3-46d2-5fbe4aa3dff9.jpeg)


#サンプルを修正して起動

試しに、サンプルコードの経度・緯度を、大阪府庁に変更。

![イメージ7568.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503948/6ce1cdc4-e928-ee90-c86d-5d9d90312415.jpeg)


実行画面:
![イメージ7569.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503948/8fa12c9f-b4d5-3460-2367-547e8ed1b363.jpeg)




#マーカーを作成

クリックイベントで、マーカーを作成。

```cs:Form1.cs
        private void button1_Click(object sender, EventArgs e)
        {
            GMap.NET.WindowsForms.GMapOverlay markers = new GMap.NET.WindowsForms.GMapOverlay("markers");
            GMap.NET.WindowsForms.GMapMarker marker =
                new GMap.NET.WindowsForms.Markers.GMarkerGoogle(
                    new GMap.NET.PointLatLng(34.686397317919905, 135.51971443629935),
                    GMap.NET.WindowsForms.Markers.GMarkerGoogleType.blue_pushpin);
            markers.Markers.Add(marker);
           
```

実行結果：
![Intent.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503948/e311dfbb-f1ca-0729-30af-1fb371d5b7f6.gif)




#参考サイト

https://github.com/SharpMap/SharpMap

https://kesoku-blog.com/?p=2702

https://www.atpress.ne.jp/news/86441


https://docs.microsoft.com/ja-jp/nuget/consume-packages/install-use-packages-powershell

https://sh-yoshida.hatenablog.com/entry/2015/06/09/003324

http://www.independent-software.com/gmap-net-beginners-tutorial-adding-clickable-markers-to-your-map-updates-for-vs2015-and-gmap-1-7.html

https://qiita.com/superriver/items/91781bca04a76aec7dc0
ubuntuに最新のgolangをインストールする

## 環境
Ubuntu 16.04.7 

## 既にgoが入っている場合は、アンインストール
ubuntuのデフォルトでインストールできるバージョンは古いので、
もし入れてしまった場合は下記でアンインストールしてください

```
$ sudo apt-get remove golang-go
$ sudo apt-get remove --auto-remove golang-go
$ sudo apt-get purge golang*
```

#### goの最新のバージョンを確認
・今回はubuntuに入れるので、「Linux」の「x86-64」から選択
https://go.dev/dl/

#### 作業スペースに移動して圧縮ファイルをダウンロードし、「/usr/local」に解凍します

```
$ wget https://go.dev/dl/go1.17.6.linux-amd64.tar.gz
$ tar -C /usr/local -xzf go1.17.6.linux-amd64.tar.gz
```

#### GO のbinの場所を環境変数に追加

```
$ export PATH=$PATH:/usr/local/go/bin
```

#### 最新のバージョンになっていればOKです

```
$ go version
```

#### 永続的に環境変数を設定
再度puttyなどを再起動するとPATHに設定したgoのpathがリセットされるので、
永続的に登録する場合はホームディレクトリーの「.profile」の最後に設定を追加してください
「PATH=$PATH:/usr/local/go/bin」


```
$ cd /home/{userName}
$ vi .profile
```
【Unity】URPトラブルシューティング

## Emissionを有効に設定したマテリアルをアタッチした動的なオブジェクトが発光しない。
動的なEmissionオブジェクトを発光させるには、Postprocessを使用する必要がありますが、BRP(ビルトインシェーダーパイプライン)でのPostPrcessingの設定と、URPでは設定方法は異なるようです。
URPの場合はパッケージの追加無しでPostprocessを実行できます。

■BRPの参考サイト

https://styly.cc/ja/tips/unity_postprocessing_master/

■URPの参考サイト

https://tat1kun.hatenablog.com/entry/urp-postprocess

ちなみに、Volumeの追加はHierarchyの左上の＋ボタンからも追加できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/f2e8c07d-5206-2039-fb91-939c1951c071.png)
semantic-releaseのgithub actionでupmをリリースする

いろんな記事がネットに落ちているけれど、upmでsemantic-release使いたかったので自分用の設定メモ.

`Assets/WavEffector/package.json` にて upmの設定ファイルがあるとするとき...
下記で行けた.

## プロジェクト

試してみたプロジェクト

https://github.com/mattak/WavEffector/blob/master/Assets/WavEffector/package.json


## 設定

github actionの設定

```yaml:.github/workflows/publish_release.yml
name: "Publish release"
on:
  workflow_dispatch: {}

jobs:
  build:
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node-version: '14.x'

      - name: Install dependencies
        working-directory: Assets/WavEffector
        run: |
          npm install -g -D semantic-release
          npm install -g -D @semantic-release/git
          npm install -g -D @semantic-release/github
          npm install -g -D @semantic-release/release-notes-generator
          npm install -g -D @semantic-release/commit-analyzer
          npm install -g -D @semantic-release/npm

      - name: Release
        working-directory: Assets/WavEffector
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: semantic-release
```

semantic-releaseの設定

```json:Assets/WavEffector/.releaserc.json
{
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    ["@semantic-release/npm", {
      "npmPublish": false
    }],
    "@semantic-release/github",
    ["@semantic-release/git", {
      "assets": ["package.json"]
    }]
  ],
  "branches": [
    "master"
  ]
}
```

ポイント
- `.releaserc.json` を配置することで、 `package.json` に記載しなくてもsematic-releaseのルールを記載できる.
- upmなので、`"npmPublish": false`にしてる.
- plugin順もそこそこ大事. 最後に `@semantic-release/git` もってくることで、release note等にpackage.jsonのコミットは含まない感じにしている.
- あと `npx semantic-release` だと `@semantic-release/git` がないって怒られるので、全部手動でinstallしてる

## 実行

GithubActionsのページで、Run workflowすればOK.
package.jsonの更新と、git tagのversioning. release noteの自動作成を行ってくれる!
超便利だ!

![run workflow](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15000/de787c5c-d4a1-a276-a34c-981df90043c7.png)
インタープリタを作る その32

#概要

インタープリタを作ってみた。
jsforthを使ってみた。
sandbox作ってみた。

#フィボナッチ数列

```
: fib 7 0 1 rot 0 do swap over + dup . loop ;  ok
fib


1 2 3 5 8 13 21
```

#九九

```
: kuku 10 1 do 10 1 do i j * . loop cr loop ;
kuku
    

1 2 3 4 5 6 7 8 9 
2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36 
5 10 15 20 25 30 35 40 45 
6 12 18 24 30 36 42 48 54 
7 14 21 28 35 42 49 56 63 
8 16 24 32 40 48 56 64 72 
9 18 27 36 45 54 63 72 81 
```

#fizzbuzz

```
: sp 32 emit ;
: fizzbuzz 100 1 do i 3 mod 0 = i 5 mod 0 = or if i 3 mod 0 = if ." fizz" then i 5 mod 0 = if ." buzz" then else i . then sp loop ;
fizzbuzz

1  2  fizz 4  buzz fizz 7  8  fizz buzz 11  fizz 13  14  fizzbuzz 16  17  fizz 19  buzz fizz 22  23  fizz buzz 26  fizz 28  29  fizzbuzz 31  32  fizz 34  buzz fizz 37  38  fizz buzz 41  fizz 43  44  fizzbuzz 46  47  fizz 49  buzz fizz 52  53  fizz buzz 56  fizz 58  59  fizzbuzz 61  62  fizz 64  buzz fizz 67  68  fizz buzz 71  fizz 73  74  fizzbuzz 76  77  fizz 79  buzz fizz 82  83  fizz buzz 86  fizz 88  89  fizzbuzz 91  92  fizz 94  buzz fizz 97  98  fizz 
```

#zundoko

```
: zundoko 0 begin 2 random if ." zun " 1 + else ." doko " drop 0 then dup 4 = until ." doko kiyoshi!" ;  ok
zundoko
    

zun zun doko zun zun doko doko zun zun zun doko zun doko zun zun zun zun doko kiyoshi!
```

#成果物


https://embed.plnkr.co/plunk/b7AtLvw03NIuVvCX

以上。
Word Press Lightning トップページスライドショーの画像が表示されない


トップページのスライドショーに設定した画像が表示されない。

Lightning:バージョン: 14.13.6


>１．設定のアドレスを「https:」へ変更
　　「設定」
　　・WordPress アドレス (URL)
　　・サイトアドレス (URL)
　　を「https://」へ変更し登録
2.トップページのスライドショーに表示させる画像を
　「画像選択」→「メディアライブラリ」で完全に削除
　のち、再登録


[](引用記事：https://digital-byobu.net/wordpress_lightning/)
【ABC234】D - Prefix K-th MaxをC++で解説（解法２つあり）

#はじめに
　皆さんこんにちは！ 競プロの問題の理解を深めるために解説記事を書いていこうと思います！今回は **ABC234 D** です！

 気に入っていただけたら**LGTM**して頂けるとうれしいです！
 
わからないことなどあれば下の**コメント**や[Twitter](https://twitter.com/python05238919)からお願いいたします!
#[D - Prefix K-th Max](https://atcoder.jp/contests/abc234/tasks/abc234_d)
問題の詳細は上の見出しからいけます．
Difficulty : <font color="Brown">**503**</font> 
####問題概要
 $(1, 2, ..., N)$の順列$P = (P_1, P_2, ..., P_N)$において正整数$K$が与えられたとき, $i = K, K+1, ..., N$について
 $P$の先頭$i$のうち$K$番目に大きい値を求めよ．
####制約
・$1 \leq K \leq N \leq 5 × 10^5$
・$(P_1, P_2, ..., P_N)$は$(1, 2, ..., N)$の並び替えによって得られる
・入力はすべて正整数

##考察
####ポイント
 **K番目に大きい数を出力できる構造を使おう！**
####解説
 入力が$K$番目から出力が必要になります．
 入力毎にソートして$K$番目に大きい値を求めようとすると計算量は$O(NKlogK)$となり**TLE**になります．計算量を減らすことを考えましょう．
 $K$番目に大きい値を求めるので**毎回データを残すのは$K$個のデータで十分**です．
　入力$P_i (i = K+1, ... , N)$での$K$番目の値を$a_i$とします．
　$a_{i+1}$は$a_{i+1} < a_i$のとき**$a_{i+1}$は$K$番目より後の大きさの値となる**ので出力は$a_i$となります．
　逆に$a_{i+1} > a_i$のとき**$a_{i+1}$は$1 ～ K$番目になる**ので，出力は$a_i$より大きい値のうち次に大きい値となります．
　$K$個のデータを順番通りに管理するときに**優先度付きキュー**を用いるか，**setを用いて二分探索すること**により計算量を$O(NlogK)$にすることができます．

　それでは実装していきましょう．
#実装
###実装1 ~優先度付きキュー(`priority_queue`)~
 $K-1$番目までは`priority_queue`に**push**します．

一番最初の出力はtop(1番前の値を取り出す)した値を出力し，それ以降は入力がtopした値より大きい場合，**topした値をpop(priority_queueから消去)**します．
　そして入力を`priority_queue`にpopして，出力はtopの値になります．
　
　それ以降は入力がtopした値より小さい場合，出力はtopの値になります．
###正解コード1

```C++:
#include <bits/stdc++.h>
using namespace std;

int main()
{
    //K番目までの入力
    int N, K;
    cin >> N >> K;
    priority_queue<int, vector<int>, greater<int>> pq;
    for(int i = 0; i < K; i++){
        int p;
        cin >> p;
        pq.push(p);
    }

    //1番最初の出力
    cout << pq.top() << endl;

    for(int i = K; i < N; i++){
        //K番目以降の入力
        int p;
        cin >> p;
        int q = pq.top();

        //pqと入力を比べる
        if(q < p){
            pq.pop();
            pq.push(p);
            cout << pq.top() << endl;
        }else{
            cout << q << endl;
        }
    }
}
```

###実装2 ~setと二分探索~
　$K$番目までsetにinsertします．その時に1番小さい値を`ans`として保持します．
　1番最初の出力は`ans`を出力します．
　それ以降は入力と`ans`を比較し，`ans`が小さい場合は**setに入力をinsetし，`ans`をerase**します. そしたら**setから`ans`より大きい1番近い値をを二分探索(upper_bound)**をしてその値が出力になります．
 `ans`が大きい場合，`ans`を出力します．
###正解コード2

```C++:
#include <bits/stdc++.h>
using namespace std;

int main()
{
    //入力
    int N, K;
    cin >> N >> K;
    set<int> st;
    int ans = N;

    for (int i = 0; i < K; i++)
    {
        int p;
        cin >> p;
        st.insert(p);
        if(p < ans) ans = p;
    }

    //1番最初の出力
    cout << ans << endl;

    for (int i = K; i < N; i++)
    {
        //それ以降の入力
        int p;
        cin >> p;

        // ansと入力を比べる
        if(p > ans){
            st.insert(p);
            st.erase(ans);
            auto iter = st.upper_bound(ans);
            ans = *iter;
            cout << ans << endl;
        }
        else{
            cout << ans << endl;
        }  
    }
}
```
Python でファイルが更新されたらなにか処理するメモ

Python でファイルを監視して更新があったらなにか処理したい
(python スクリプト自体の live reload みたいな)

ファイル監視は pyinotify などいくつかありますが, 今回は watchdog (pip で入る)を使います.

## 注意点

vim とかでファイルを編集すると, swap ファイルの処理とかの関係からか, Modify event が複数 emit されます
(こちらの Linux 環境では 3 回)

atomic や semaphore などで最後のイベントだけ記録するようにするのがよいでしょう.

## 例

今回は `collections.deque`　を使いました.

結果はこんな感じです!    


```py
import time
import subprocess
import collections

from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler


class MyHandler(PatternMatchingEventHandler):
    def __init__(self, q, patterns):
        self.q = q
        super(MyHandler, self).__init__(patterns=patterns)

    def on_modified(self, event):
        self.q.append(event)


# queue with length 1
q = collections.deque([], 1)

path = "."

event_handler = MyHandler(q, ["canvas.py"])
observer = Observer()
observer.schedule(event_handler, path, recursive=False)
observer.start()

try:
    while True:

        if len(q) > 0:
            item = q.pop()
            print("queue item:", item)
            cmd = ["python", item.src_path]

            subprocess.call(cmd)

        time.sleep(1)

except KeyboardInterrupt:
    observer.stop()
observer.join()
```

live reload みたいなことをしたい場合は, 以前の process を一度 kill する必要があるので Popen で管理がよいでしょうか.


```py
try:
    proc = None
    while True:

        if len(q) > 0:

            if proc:
                proc.kill()

            item = q.pop()
            print("queue item:", item)
            cmd = ["python", item.src_path]

            proc = subprocess.Popen(cmd)

        time.sleep(1)

except KeyboardInterrupt:
    observer.stop()
observer.join()
```

Happy live reloading! :tada: