OmniAICreator/Qiita-1.07M huggingface dataset:
【Linux】[y/n]に自動で回答する方法

## はじめに

コマンドを実行した際に途中で`[y/n]`などが出力され回答を求められる場合があります。  
これに自動的に回答する方法について記載します。  

## 自動で回答する方法

`yes`コマンドを使用することで自動的に回答できます。

試しに`yes`コマンド単体で実行します。

```zsh
$ yes
y
y
y
y
^C
```

中断するまで`y`が出力され続けます。  

これを標準入力として次のコマンドに渡します。  

```zsh
$ yes | rm -i *.txt
remove example.txt? remove sample.txt? remove test.txt?
```

自動的に`y`と回答されてすべて削除されます。  

`y`以外の回答をするには以下のように`yes`コマンドの後に記述します。  

```zsh
$ yes 'n' | rm -i *.txt
remove example.txt? remove sample.txt? remove test.txt?
```

自動的に`n`と回答されます。  

`yes 'n'`のみで実行すると以下のように中断するまで`n`が出力され続けます。

```zsh
$ yes 'n'
n
n
n
n
n
^C
```

`n`以外の文字列も同様に出力されます。  

```zsh
$ yes 'foo'
foo
foo
foo
foo
foo
^C
```

なお一度だけ自動で回答できれば良い場合には以下のようにもできます。

```zsh
$ echo 'y' | rm -i sample.txt
remove sample.txt?
```
マイグレート時、SQLSTATE[HY000] [2002] Connection refusedが発生する

## 開発環境
Laravel 9.36.3
PHP 8.1.4
XAMPP 8.1.6
phpMyAdmin 5.1.1

## 状況
1. マイグレーションファイル作成後、php artisan migrate実行
2.  以下エラーが発生
```terminal:terminal
  SQLSTATE[HY000] [2002] Connection refused
```

## 対処法
1.XAMPPでserverがそもそも立ち上がってなかったため、Start Allする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365570/d9e0983b-f569-ef6a-45c1-8b469c17af12.png)

2.再びmigrate実行し成功することを確認
White label Crypto Exchange Software

Most Entrepreneurs are now in need of creating their own crypto exchanges. If you are one such person, I have something interesting for you! To make your dreams come true, the white-label crypto exchange can be a perfect way of making them. This article is intended to figure out the importance of white-label software in the market.

## Primary Reasons to buy White label Crypto Exchange Software:

A White label cryptocurrency exchange is a readymade software that is made with all the primary features of a trading platform. By customizing them with your own logo & design, you can build your own brand in accordance with your expectations.
Here is the primary advantages that you can experience if you buy White label Crypto Exchange Software:

### 1. Seamless Deployment

As your solution provider already has the readily built software for you, you just need to buy and start your own crypto exchange instantly. If in case you consider developing from scratch, it would probably take around 8–12 months of time. Moreover, you should be ready to spend your hard-earned money as well. Hence, if you use white-label cryptocurrency exchange software, then it will be profitable for you.

### 2. Beneficial if you lack technical knowledge

Leveraging this could be more beneficial if you don’t have much programming knowledge in the domain.

### 3. Lowers labor expenses

You don’t need to hire a team separately to create your own cryptocurrency exchange. Since you have readymade software with you, you can start it instantly! This, in turn, can cut down your costs.

### 4. More reliable

Since you are getting your software from the best & reputed agency, you can leverage the factor of reliability here. Moreover, they will be readily available to support you in any case if you experience any issues.

### 5. Take your brand to higher levels

You have your own name, own logo, own design. This can boost the credibility of your brand to the next phases.

## Features of White label Crypto Exchange Software

Here is the set of features that you can get in the software

- Order Book
- Initial Exchange Offering Module
- Security Token Exchange
- Margin Trading
- Liquidity API
- Escrow Services
- Investor Console
- Issuer Console
- Mobile Application Support
- Pending Transactions Management
- Firewall Integration
- KYC/AML Automation
- Trading Bot
- Market Orders
- Cryptocurrency Wallet Integration

These features can be customized as per your requirements. The main beneficial factor of using a white-label crypto exchange solution is inexpensive than developing a crypto exchange from scratch. The cost usually depends on the customizations and complexity of your project.
To know more about this software, you can check this article >> [White label Crypto Exchange Software](https://www.coinsclone.com/white-label-crypto-exchange-software/?utm_source=quita&utm_medium=article&utm_campaign=sinu)
QGISの"Read-only file system" というエラー

# これ

![スクリーンショット 2022-10-29 19.20.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950165/5e69b8ea-de9f-c54c-d2f4-f552000a2c39.png)

これに限らず、QGISで`Read-only file system`というエラー文が出ることがあります。
自分の場合は大体原因が同じだったので自分用にメモ書き。

# 原因

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950165/408b8b7c-4ff4-5b99-e61d-ade5a32f99b7.png)

新しいオブジェクト（`.shp`やレイヤなど）を生成するとき、「ファイル名」の一番右にある`...`をクリックせずに名前だけ入力していることが原因だと思います。
`...`を押して保存する場所をQGISに教えてあげるとこのエラーは消えます。

どうしてこういう文章になるんだろう？？（不服）
理由を知っている方もしよければ教えてください
背景とテキストの色を切り替えたい

<h1>王道ポートフォリオ画面の作成</h1>
見てわかる通り、右上のアイコンを押すと色を変えられる仕組みをJavascriptで書いたが、bodyの中のliタグに適用されない。この問題を解決しなければ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884833/8ac36562-13b1-312d-b4aa-4aacd28d3ba7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884833/f3301dcb-4ae0-62bc-b589-700a6f02ca63.png)


あとh1で作ってあるkenshiro yamada's portfolioにアニメーション付加などの何かしらにギミックをつけたいところ。
Nginxのproxy_passは2通りの設定がある

# はじめに
Nginxをリバースプロキシとして利用する際に、.confファイルを作って、locationにproxy_passを設定しますが、書き方によって結果的に出来上がるパスが変わります。
分かってはいるものの、すぐにどっちがどっちだったから忘れてしまうので、メモ的に記事として挙げさせていただきます。

# 環境
docker-composeで以下のような感じでNginxとAsp.Net(API)を作成しています。demoコンテナーがAPIです。[以前の記事](https://qiita.com/mkuwan/items/22a5d7fdb77008149fad)で使用したものですので、詳細はそちらをご覧ください。
```yml
services:
  nginx:
    volumes:
      - nginxconf:/etc/nginx/conf.d 
      - www:/var/www/html
    ports:
      - 80:80
    networks:
      - front-back

  demo:
    expose:
      - 5000
    networks:
      - front-back
```
nginxがport:80でListenしていて、`http://localhost`にアクセスした場合はindex.htmlが表示されます。
このあと、`http://localhost/demo/` と入力した場合の動作が以下の設定によって変わります。

# 設定その1
### proxy_passの最後に / をつける
```conf
server {
    listen        80;
    server_name   default_server;

    root /var/www/html;
    index index.php index.html index.html;
    location / {
        try_files $uri $uri/ /index.php /index.html;
    }

    location /sample/ {
       　　　　　　　　　　　　　#ここ↓
        proxy_pass http://demo:5000/;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
```
この場合、`http://localhost/sample/`と入力すると、`http://demo:5000/sample/`にパスされます。


# 設定その2
### proxy_passの最後に / をつけない
```conf
server {
    listen        80;
    server_name   default_server;

    root /var/www/html;
    index index.php index.html index.html;
    location / {
        try_files $uri $uri/ /index.php /index.html;
    }

    location /sample/ {
       　　　　　　　　　　　　　#ここ↓
        proxy_pass http://demo:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
```
この場合、`http://localhost/sample/`と入力すると、`http://demo:5000/`にパスされます。

# まとめ
- **"/"** をつけたら、locationで書かれているパスがその後に追記される。
- **"/"** がない場合、locationで書かれているパスに入れ替わる。

なんとなく設定ファイルを作ったり、コピペをしていて、うまく動作しないというときに、見直すべきポイントのひとつですね。
R: NIMBLE の使い方 (その2)

こちらのページと同じことを行いました。
[Running MCEM in NIMBLE](https://r-nimble.org/nimbleExamples/pumpMCEM.html)
10 台のポンプの運転時間と故障回数のデータを分析します。

```text
No  運転時間　故障回数
1   94.30    5
2   15.70    1
3   62.90    5
4  126.00   14
5    5.24    3
6   31.40   19
7    1.05    1
8    1.05    1
9    2.10    4
10  10.50   22
```

## プログラム

```r:pump.R

library(nimble, warn.conflicts = FALSE)

pumpCode <- nimbleCode({ 
  for (i in 1:N){
    theta[i] ~ dgamma(alpha, beta)
    lambda[i] <- theta[i] * t[i]
    x[i] ~ dpois(lambda[i])
  }
  alpha ~ dexp(1.0)
  beta ~ dgamma(0.1, 1.0)
})

pumpConsts <- list(N = 10,
                   t = c(94.3, 15.7, 62.9, 126, 5.24,
                         31.4, 1.05, 1.05, 2.1, 10.5))

pumpData <- list(x = c(5, 1, 5, 14, 3, 19, 1, 1, 4, 22))

pumpInits <- list(alpha = 0.1, beta = 0.1,
                  theta = rep(0.1, pumpConsts$N))

## Create the model
pump <- nimbleModel(code = pumpCode, name = "pump", constants = pumpConsts,
                    data = pumpData, inits = pumpInits)

#
Cpump <- compileNimble(pump)

box <- list( list(c("alpha","beta"), c(0, Inf))) ## Constraints for the parameters
pumpMCEM <- buildMCEM(model = pump, latentNodes = "theta[1:10]", boxConstraints = box)

pumpMLE <- pumpMCEM$run()
#
pumpMLE
```

## 実行結果

```text
$ Rscript pump.R 
nimble version 0.12.2 is loaded.
For more information on NIMBLE and a User Manual,
please visit https://R-nimble.org.
Defining model
Building model
Setting data and initial values
Running calculate on model

（省略）

|-------------------------------------------------------|
Iteration Number: 4.
Current number of MCMC iterations: 1625.
Parameter Estimates: 
    alpha      beta 
0.8190188 1.2482870 
Convergence Criterion: 0.000783117.
    alpha      beta 
0.8190188 1.2482870
今日のElixirSchoolメモ1「基本」

本記事はElixir Schoolの学習メモです。
気になることが増えたら追記します。

https://elixirschool.com/ja/lessons/basics/basics

### ブール演算子

「ブール演算子(and,or,not)」と「ゆるいブール演算子(||,&&,!)があって、前者は最初の引数はtrueかfalseのみ指定できます。

```elixir
iex(15)> true and 42
42
iex(16)> 42 and true
** (BadBooleanError) expected a boolean on left-side of "and", got: 42

iex(16)> not false
true
iex(17)> not 42
** (ArgumentError) argument error
    :erlang.not(42)
```

### 比較

型が同じか互換性がない場合、次のルールに従って比較が行われる
number < atom < reference < function < port < pid < tuple < map < list < bitstring

```elixir
iex(17)> :hello > 999
true
iex(18)> {:hello, :world} > [1, 2, 3]
false
```
SecretsManagerを使ってAWSのベストプラクティスに沿ったシークレット管理をしたい

# はじめに
現在、下記のTwitter botを運用しています、これはTwitterのトレンド情報を定期的に取得、集計しその日最も呟かれていたトレンド情報をランキングにするものです。
https://twitter.com/BuzChecker

プログラムはPythonを使っておりAWS lambdaにデプロイし実行しています。
構成図はこんな感じ。
![trend構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631123/7cb6759e-1f4d-12a6-bdf3-8aad260d0855.png)

これは私がAWS初学者の頃に学習の過程で作ったもので色々とイケていない箇所がありAWSのベストプラクティスに沿った構成に改良したいというのが趣旨です。
改良後はこのようなイメージになります。
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631123/b11d1911-ef65-5180-cd89-5981dee68ed6.png)


# SecretsManagerを活用しよう
上記botのプログラムの実行にはTwitter、AWSの2種類の認証情報を必要としているのですが現在これらの認証情報であるアクセストークン、シークレットはプログラム内にハードコードされてしまっています。アクセストークン、シークレットをハードコードすることはこれらが漏洩してしまう危険性を孕んでいます。
AWSにはSecretsManagerというデータベースの認証情報、APIキー、その他の機密情報を管理、取得、ローテーションといったことを簡単かつ安全に実現できるサービスを提供しており、今回はSecretsManagerでアクセストークン、シークレットを管理しプログラム上にハードコードされている認証情報は削除します。

https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html

利用料金は1シークレットあたり＄0.4/月 + 10,000回のAPIコールあたり＄0.05かかります。

# SecretsManagerに認証情報を登録する
これまで使用していた認証情報をSecretsManagerに登録していきます。
今回はその他のシークレットタイプを選択し、キー名に任意の名前、黒塗りしている箇所に各認証情報を入力します。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631123/90f28aaf-7110-5f98-3c72-44e75919d01f.png)


任意のシークレットの名前をつけます。今回は```dev/twiTrend```としています。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631123/7e570e2b-ec5a-79b6-2319-8cafc60bc4c9.png)

今回はシークレットのローテーションは行わないため自動ローテーションの設定をオフにします。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631123/e4f417bc-b7dc-fcd2-8f66-e154f98e47df.png)


ここまで設定を進めると最後に入力内容の確認画面が表示され一番下にシークレットを取得するサンプルコードを確認できます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631123/7711c907-332c-f423-8d89-fdcbbc85dfaf.png)

シークレットの登録が完了しました。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631123/6e1b6dff-6803-51ca-9064-928d92295fb6.png)


lambda関数にアタッチしているロールにSecretsManagerの使用を許可するポリシーをアタッチすることを忘れないようにしましょう。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631123/55bfe39e-614c-6dc6-7c19-9305453db645.png)


# SecretsManagerからシークレットを取得するようにコードを修正する

次にlambda関数のPythonでSecretsManagerからシークレットを取得するコードを追加します。
赤枠内のコードを追加し、ハードコードされていた認証情報と置き換えています。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631123/2db6a01b-6cd1-375e-d24d-0984af9bd8ba.png)
```
session = boto3.session.Session()
client = session.client(
    service_name='secretsmanager',
    region_name="ap-northeast-1"
)
try:
    get_secret_value_response = client.get_secret_value(
        SecretId="dev/twiTrend"
    )
except ClientError as e:
    raise e
secret = json.loads(get_secret_value_response['SecretString'])
TW_CONSUMER_KEY = secret['TW_CONSUMER_KEY']
TW_CONSUMER_KEY_SECRET = secret['TW_CONSUMER_KEY_SECRET']
TW_ACCESS_TOKEN = secret['TW_ACCESS_TOKEN']
TW_ACCESS_TOKEN_SECRET = secret['TW_ACCESS_TOKEN_SECRET']
AWS_ACCESS_KEY = secret['AWS_ACCESS_KEY']
AWS_ACCESS_SECRET = secret['AWS_ACCESS_SECRET']
```


動作確認、SecretsManagerから取得した認証情報で認証が通ることを確認できました！
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631123/66231beb-7553-fcaf-8854-0e4c8334da63.png)
Vue CLI でvueのプロジェクトの生成がうまくいかなかったので create-vue で作成したらうまくいった→viteすごいな？！

`Vue CLI` でのvueのプロジェクトの立ち上げがうまくいかず…
nodeのバージョン問題であることはわかるけど、
途中でにっちもさっちもいかなくなった。
（複数のライブラリで、必要なnodeのversionが異なるので、
どちらかのライブラリを優先すると、どちらかがエラーになり…となってしまった。）
https://cli.vuejs.org/
…って、Vue CLI メンテナスモード！やないかい！

代わりに
`create-vue`
https://github.com/vuejs/create-vue
を使うとうまくいったのでメモ。

```
npm init vue@3 【プロジェクト名】
```

詳しく書いてくれてる参考記事：
https://ics.media/entry/220120/

---

# 追記： viteすごいな？！

と思ったが
爆速で環境を作ってくれる「vite」すごいな？！
https://ja.vitejs.dev/guide/
```
npm init vite@latest
```
https://zenn.dev/sakata_kazuma/articles/59a741489c8bbc
diffusers 0.6.0でnegative_promptをlistで渡すと動かない問題

なんかバグっているみたいです。

https://github.com/huggingface/diffusers/issues/779

```python:
pipe = StableDiffusionPipeline.from_pretrained(
    model_id,
    torch_dtype=torch.float16,
    revision='fp16'
).to(device)

prompt = 'apple'
nprompt = 'red'

# 動く
images = pipe(prompt, negative_prompt=nprompt, guidance_scale=7.5)['images']

# これも動く
images = pipe([prompt], negative_prompt=[nprompt], guidance_scale=7.5)['images']

# 実はこれも動く
images = pipe([prompt] * 1, negative_prompt=[nprompt] * 1, guidance_scale=7.5)['images']

# 動かない
images = pipe([prompt] * 2, negative_prompt=[nprompt] * 2, guidance_scale=7.5)['images']
```

0.6.1が出たら起こしてください。
【見積もり編】知っているようで知らないアジャイル開発

## 対象とする人
一通りアジャイル開発に関する教科書的知識を理解している気はある。
が、なんか腹落ちしない、うまくできている気がしない人。

## まえがき
アジャイル開発を学んでいると、人によって言っていることが違っていたり、教科書的にやったら現場ではうまくいかない...
などなど何かと疑問と不安が湧いてきます。
それらの疑問に対してQA形式で細かい疑問を整理しました。
これを読んで、もやもやした気持ちを少しでも晴らした上で開発に取り組んでもらえればと思います。

## QA
### 相対見積もりの判断軸を時間にしてはいけないなら、何を判断軸にするの？
バックログを実行する際の工程の量が基準になります。

時間を判断軸にすると力量差があるメンバー同士で見積もり結果が異なりやすくなります。
（Aさんが行うと２時間、Bさんが行うと３０分）

工程の量であればAさんもBさんもやること自体は一緒となるので、人によって大きく変化することはありません。

※工程の量というのは人によって差異が少ない指標の一つであるだけであり、よりよいものは他にもあるかもしれません。

### とはいえ、工程の量の見積もりも人が想像するものによって変わってくるのでは？

ここでやっとプランニングポーカーの出番です。

バックログに対する工程の量の認識が一緒であれば見積もりも人によらず、大幅には変わらないはずです。

それでも変わってしまうということは各々が想像する工程に抜けがある、そもそもやり方が違うということが考えられます。

そこで、私はこういう工程も想定していた、こういうアーキテクチャを想定していたという意思疎通を交わすことで、
よりよいやり方、抜けのない工程を最初の段階で洗い出すことができるのです。

### 力量差がありすぎて工程の量の見積もりでも差がありすぎる！

そういった場合には担当者を決めてしまって見積もるということも１つの手です。

ただし、機能横断的でない組織はそもそもスクラム開発に反するものなので、是正できるような手を打ちましょう。

### なんでプランニングポーカーではフィボナッチ数列を使うの？

直感的に相対見積もりをする際に、基準より倍かどうかは考えやすいからです。

フィボナッチ数列は前２つの数を足すということによって得られる数列です。
1, 2, 3, 5, 8, 13, ...

この数列の特徴として、ある数の前の数は1/2より少し大きく、次の数は二倍よりも少し小さいです。

つまり、他のバックログに対して、２倍、３倍より大きいか小さいという粒度で判断できるため、
ポイントを見積もる上で迷いが少なくなるです。

また、これだけ明確なレンジがあるにも関わらず迷いが生まれる場合には、ストーリーの分割ができていないとも考えられます。


### PJ毎に扱うユーザーストーリーが変わったら基準が変わってしまう？
プロジェクトに関係なく、「このバックログの作業量を２にします」というのをずっと持つと基準が固定できる。
### 作業量で見積もったものでどうやって中期的な計画を説明すりゃいいのさ？

バックログの工程の量による数値が得られました。

そこで、ベロシティを使用します。
直近までの数スプリントから、チームが１スプリントで消化できるポイント数をベロシティとします。

これにより、将来の数スプリントで消化できるポイントを予測できるので、
バックログの優先度が高いものから作業を行った場合にどのバックログまで辿りつけそうかという見立てがたちます。

ただあくまでも、アジャイル開発においては変更しうる計画というのは悪しからず。

### 最初はベロシティなんてないよ！

最初は決め打ちです！
基準としたバックログについてチームで平均してどれくらい時間がかかりそうかメンバーで話してみましょう。
そうすると、２ポイント（基準としたバックログの見積もり）に対してかかる時間がわかるので、
スプリントでの稼働時間に直せばざっくりとしたチームのベロシティが割り出せます。

大切なことは正確に見積もることではなく、都度見直すことです。
１週目の最終日時点での消化ポイントを二倍したものによっても見積もれます。
こういったことを繰り返し、チームとして安定して出せるベロシティを計測することができるようになります。

## あとがき
筆者はアジャイル開発のプロでもなんでもありません。
自分の整理兼・備忘録用に書きました。（なので対象とする人は自分のことです...）

また、人、チーム、企業、状況によって取りうるルールは常に変わると思いますので、
こういった疑問もあるよ！　とか　こういうケースではこうやってる！
などのコメントお待ちしております。

## 参考資料

https://www.mof-mof.co.jp/blog/column/agile-estimation-planning-poker
ディストリビューションのユーザーを変更する

wslでUbuntuを作成しターミナルを開くをrootユーザーになっていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951246/367b1957-69d5-1e0d-5099-23af12e6355a.png)
ユーザーを切り替えたい！

## コマンドで一時的に変更
```ruby:terminal
su  <username>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951246/97e0693e-8b1b-ff82-9b4a-8fa4113a9547.png)
しかし、ターミナルを新しく作成するごとに毎回コマンドを打つもの面倒

## デフォルトのユーザー設定
ubuntuでwsl.confを作成する。
```ruby:terminal
cat << EOF > /etc/wsl.conf
[user]
default=user-name
EOF
```

私の場合は
default=moonlinux

ディストリビューションを再起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951246/d69d9422-0d61-6b7f-4585-6ec0d6e91d35.png)
その後、Windowsターミナルで［ｖ］を押して指定のディストリビューションを起動
Ex.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951246/bb6a5511-7702-f5e9-7a54-4b8a4c0e276c.png)
すると、ユーザーが切り替わっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951246/8dba732f-d08d-b662-9c20-3745b386d4e5.png)
findの結果のファイルをツリー形式で出力する

だいぶ前の[findの結果のファイルをツリー形式で出力するコマンド](https://stackoverflow.com/questions/62813071/way-to-visualize-as-tree-a-list-of-paths/62814606#62814606)ですが．．．
不要な棒があったり、「.」始まり前提だったり、を解消してみたいと思います。
```bash
find . | \
awk '{
  n=split($0,a,/\//);
  for(i=1;i<n-1;i++) printf("|   ");
  if(n>1) printf("+-- ");
  print a[n];
}'
```

まずは不要な棒を取り除いてみたいと思います。
```bash
find . | tac | \
awk '{
  n=split($0,a,/\//);
  for(i=1;i<n-1;i++){
    if(i>=m) s[i]="    ";
    else if(a[i]!=b[i]) s[i]="|   ";
    printf(s[i]);
    b[i]=a[i];
  }
  s[i]="|   ";
  if(n>1) printf("+-- ");
  print(a[n]);
  m=n;
}' | tac
```
aは「/」で分割した配列、nはその要素数、
sは前回出力した棒か空欄、
bは前回の配列、mはその要素数、です。
findの結果をtacでひっくり返して最後から見ていくことで、直前の行の情報だけで棒の要不要を判定しています。

次にフルパスの場合ですが、起点のパス部分をreadで別出力にし、awkに-vで長さを渡せば簡潔に書けました。
```bash
find $(pwd) | (read p; echo $p; tac | \
awk -v l=${#p} '{
  n=split(substr($0,l+2),a,/\//);
  for(i=0;i<n-1;i++){
    if(i>=m) s[i]="    ";
    else if(a[i]!=b[i]) s[i]="|   ";
    printf(s[i]);
    b[i]=a[i];
  }
  s[i]="|   ";
  printf("+-- ");
  print(a[n]);
  m=n;
}' | tac)
```

出力結果は以下のようになります。
```
/home/hoge/work
+-- a
|   +-- a
|   |   +-- b
|   |       +-- c
|   |       |   +-- b
|   |       |       +-- x
|   |       +-- x
|   |       +-- y
|   +-- x
+-- a.txt
+-- b
    +-- a
    +-- x
```

ファイルツリーで構成を把握したい程度であれば、ここまでやるよりちょっとした変換で済ますのがよいでしょうね。
あとsortをすると、例えばaaa/bbbとaaa.txtがあった場合にaaa.txtにbbbがぶら下がるように出力されるのでダメです。

元のコマンドもawkよりsedの方が簡潔に書かれているので、sedにすればもっと簡潔に書けるかもしれません。
直せなくなったラズパイの解像度を変更する

# 背景
Raspberry pieの画面を、他のWindows端末からVNC viewerで操作していた。
VNC Viewerの解像度を最低まで下げると、画面が見切れてディスプレイ解像度を選択できず、元に戻せなくなった。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/62e9bcd2-6206-c806-dcb5-1bedd5722c68.png)

# 解決方法
### コマンドプロンプトからsshで接続する
username：pie
ip address：192.168.10.100
の場合、下記でアクセスできる。
```
ssh pie@192.168.10.100
```
もし、ip addressが分からなければ、下記コマンドでLAN上のip addressが表示されるので、それらしいip addressに接続する。
```
arp -a
```

### 画面の設定
下記の、救いのコマンドを実行。
```
sudo raspi-config
```
設定画面が立ち上がるので、2ディスプレイオプションを選択。
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/cae4e4c5-eee6-94fe-5551-51bb3101e5ac.png)
D5 VNCの解像度を選択
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/014dbfeb-10e7-7c88-fea2-e37d6498a611.png)
再起動しますか→yes
![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/47acb32f-f1f9-f5e8-3c76-95cb1f2b51b6.png)
再度、VNC viewerで接続しなおすと、戻っていました。
![無題5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/2970288e-e138-c05b-c08f-289934f42c7e.png)
WEB開発をやり始めてみる(Rails①)

# やったこと
```ruby:
### コントローラーの作成
$ rails g controller Tasks

### モデルの作成
(DBのカラムを定義しています。titleはstring型,completedはboolean型で保存されます)
$ rails g model Task title:string completed:boolean
```
```ruby:
/db/migrate/xxxxx.create.tasks.rb
### DBマイグレーションの前に下記のように修正を行う(completedはデフォルトでfalseになる)
class CreateTasks < ActiveRecord::Migration[7.0]
  def change
    create_table :tasks do |t|
      t.string :title
      t.boolean :completed, default: false

      t.timestamps
    end
  end
end
```
```ruby:
### DBに反映させる
$ rails db:migrate

### DBの中身確認
$ rails db
sqlite> .schema
CREATE TABLE "schema_migrations" ("version" varchar NOT NULL PRIMARY KEY);
CREATE TABLE "ar_internal_metadata" ("key" varchar NOT NULL PRIMARY KEY, "value" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);
CREATE TABLE "tasks" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar, "completed" boolean, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);
```
```ruby:
/config/routes.rb
### ルーティングの設定
(rootでアクセスするとtasks#indexコントローラーが実行ざれる)
Rails.application.routes.draw do
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

  # Defines the root path route ("/")
  # root "articles#index"
  
  resources :tasks
  root 'tasks#index'
end
```
```ruby:
/app/controllers/tasks_controller.rb
### 上記のtasksコントローラーの設定を行う
(@tasksに全てのタスクを代入)
class TasksController < ApplicationController
    def index
        @tasks = Task.all
    end
end
```
```ruby:
/app/views/iendex.html.erb(新規作成)
### <%>の時は何かを実行したい時(表示させたくない)
### <%=>画面に表示させたい時
<h1>Tasksk</h1>
<ul>
    <% @tasks.each do |task| %>
        <li>
            <%= check_box_tag '','' %>
            <%= task.title %>
        </li>
    <% end %>
</ul>
```
Databricksにおけるデータ処理ワークフローのオーケストレーション

[Orchestrate data processing workflows on Databricks \| Databricks on AWS](https://docs.databricks.com/workflows/index.html) [2022/10/19時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Databricksでは、あなたのデータ処理ワークフローをサポートするための包括的なツールスイートとインテグレーションを提供しています。

# Databricksジョブによるデータ処理や分析のワークフロー

スケーラブルなリソースを持つDatabricksクラスター上でデータ処理やデータ分析タスクを実行するために、Databricksジョブを活用することができます。ジョブは単一のタスクで構成されたり、複雑な依存関係を持つ複数のタスクからなる大規模なもので構成されたりします。Databricksは、ジョブの全てにおけるタスクのオーケストレーション、クラスター管理、モニタリング、エラーレポートを管理します。ジョブは即時実行したり、使いやすいスケジューリングシステムを通じて定期的に実行することができます。ノートブック、JAR、Delta Live Tablesパイプライン、Python、Scala、Spark submit、Javaアプリケーションを用いてジョブのタスクを実装することができます。

Jobs UI、Jobs API、Databricks CLIからジョブを作成します。Jobs UIを用いることで、実行中あるいは完了済みのジョブのモニタリング、テスト、トラブルシュートを行うことができます。

使い始めるには：

- [クイックスタート](https://qiita.com/taka_yayoi/items/932e211757e697fe9d5e)で最初のDatabricksジョブワークフローを作成します。
- Databricksジョブの[ユーザーインタフェース](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a)を用いたワークフローの作成、参照、実行方法を学びます。
- Databricksジョブを用いたワークフローの作成や管理をサポートするための、[Jobs API updates](https://docs.databricks.com/workflows/jobs/jobs-api-updates.html)を学びます。
- ワークフローにおける[dbtの変換処理](https://qiita.com/taka_yayoi/items/58bd05587a7675a1c610)の使い方を学びます。
- Databricksジョブを管理、スケジュールするための[Apache Airflow](https://docs.databricks.com/workflows/jobs/how-to-use-airflow-with-jobs.html)の使い方を学びます。

# Delta Live Tablesによるデータの変換処理

Delta Live Tablesは高信頼、維持可能、テスト可能なデータ処理パイプラインを構築するためのフレームワークです。お手元のデータに対して実行する変換処理を定義すると、Delta Live Tablesはタスクー消すとレーション、クラスター管理、モニタリング、データ品質、エラーハンドリングを管理します。Delta Live Tablesを用いてすべてのデータ処理ワークフローを構築することもできますし、複雑なデータ処理ワークフローをオーケストレーションするために、Databricksジョブのワークフローの中にパイプラインをインテグレーションすることもできます。

使い始めるには、[Delta Live Tables introduction](https://docs.databricks.com/workflows/delta-live-tables/index.html)をご覧ください。

:::note
**訳者注**
Delta Live Tablesに関しては、こちらもご覧ください。
:::

https://qiita.com/taka_yayoi/items/7fe8ed2c2f95fd53cc3d

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
React Routerの使用下で下層ページにアクセスしようとすると404になってしまう問題の解決策

## この記事について
1年ほど前からReactを使った[ホームページ](https://fromoshima.jp)の開発にはまっており、最近になってやっとルーティングのために`React Router`を導入しました。`React Router`を利用したら簡単にルーティングが実装できたのでとても感動しました。
しかし、デプロイ後に直リンクで下層のページにアクセスしようとしたり、ローディングで再読み込みをしようとしたりすると、404エラーになってしまう問題に直面しました。本稿は、この問題の解決策（めちゃくちゃ簡単ですが）を説明するものです。

## 注意
Qiitaの記事を書くのは初めてで、開発の知識も弱々なのでいろいろと間違っているかもしれません。その時は温かい気持ちでご指摘ください。

## そもそも何が起きているのか
はじめに説明した問題を具体例を通して説明します。例えば、`React Router`を導入した`React`アプリを`https://example.com`から配信し、`https://example.com`のページ上に`https://example.com/page`へのリンクが貼られているとします。つまり、
```js
const router = createBrowserRouter([
  {
    path: "/",
    element: <Top />,
  },
  {
    path: "/page",
    element: <Page />,
  },
])
```
こんな感じでルーティングされているとします。

このとき`https://example.com`から`https://example.com/page`への遷移はうまく行きますが、`https://example.com/page`に直リンクでアクセスしたり、再読み込みをしたりすると404エラーが発生します。

これは実は`React Router`側の問題ではなく、サーバー側の問題です。どういうことかと言うと、例えば`NGINX`などでは`https://example.com`にリクエストがあった場合は、`index.html`を返すという風に設定がなされていると思います。この状況下では、`https://example.com/page`にアクセスがあったときの設定が`NGINX`に適切になされていないがために404になるのです。

## 解決策
解決策は簡単です。どこにリクエストがあろうが404になった場合は`index.html`を返すように`NGINX`側で設定してやれば良いのです。それを可能にする設定は次です。
```bash
location / {
    index index.html;
    try_files $uri /index.html;
}
```
`try_files $uri /index.html`とは何かという話ですが、これはいろいろと`HTML`ファイルを探して、見つからなかったら`index.html`を返すという設定です。詳しくは[こちら](http://nginx.org/en/docs/http/ngx_http_core_module.html)をご参照ください。

これで意図しない404エラーは発生しなくなると思います。一方で、エラーページは`NGINX`側では配信されなくなるので、`React Router`で設定する必要があります。ここには注意するようにしてください。
Zotero内でDeepLやWeblioを使用する

# Zotero内からDeepL翻訳をかけてみた

先日Mendeley公式からののレガシーなデスクトップソフトのダウンロードが停止され，オープンソースであるZoteroに乗り換えた．環境構築を勧めていくなか，ZoteroからDeepL翻訳を行うことができるアドオンが公開されていることを知ったため，備忘録として導入方法を記す．

![Discovering faster matrix multiplication algorithms with reinforcement learning - Fawzi et al. - 2022 - Zotero 10_24_2022 9_50_12 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550865/471d0629-8320-6da4-b0a9-ec97750611eb.png)
こんなのができる．

# 前提条件

Zoteroの導入方法などは下記が参考になる．どのOSでも動作すると思われるが，想定OSはWindoswsである．
- [Zotero で論文管理してみた話
](https://qiita.com/Yarakashi_Kikohshi/items/39dfbf3059aaf0690761)

# zotero-pdf-translateの導入
使用するアドオンはzotero-pdf-translateである．[GitHub](https://github.com/windingwind/zotero-pdf-translate)から[Release](https://github.com/windingwind/zotero-pdf-translate/releases)ページへ飛び，`zotero-pdf-translate.xpi`をダウンロードする．

## アドオンのインストール

1. Zoteroを開き，`Tools`の`Add-ons`をクリックする．
![Screenshot (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550865/2c67bd1a-574a-f7ee-5dea-ed54086d0cba.png)

2. 歯車のアイコンから`Install Add-on From File...`をクリックし，先程ダウンロードしたファイルを選択する．
![Screenshot (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550865/d90c0ddf-e145-2f8d-4bed-903aec5cebdf.png)

3. 再起動して任意のファイルを開き，`Translate`枠が増えていることを確認する．
![Screenshot (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550865/60b6d0c6-1e07-65a1-c962-d19e6847cd1f.png)

## DeepL APIの登録
Defaultでは，Google翻訳が選択されている．論文読解では，個人的にはDeepLの方が便利であるため，文章の翻訳をdefaultでDeepLとなるように変更する．DeepLでは，APIを使用するため，ユーザー登録が必要である．
1. [DeepL API](https://www.deepl.com/pro-api?cta=header-pro-api/)からアカウントを作成する（月500,000字まではFree版で利用できる）．
1. DeepL accountタブにAuthentication Key for DeepL APIが発行されているので，こちらをコピーする．
1. `Edit`の`Preferences`に移動する．
![Screenshot (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550865/ba46300e-5ec5-be43-0c85-b9093fd192cd.png)

1. `Translate Engine`を`DeepL (Free)*`に，`Secret`に先程コピーしたキーを貼り付ける．
![Screenshot (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550865/f7f22434-970b-2d17-7bcd-56f5b15a010a.png)

1. `Dictionary Engine`はお好みで変更する（ここでは`weblio (en<->ja）'）．

1. 文章を選択すると，DeepLで翻訳ができるようになる．
![Discovering faster matrix multiplication algorithms with reinforcement learning - Fawzi et al. - 2022 - Zotero 10_29_2022 5_15_08 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550865/6c783d8a-0dc8-3096-5c9f-8516e1943227.png)

1. 単語を選択すると，Weblioで検索ができる．
![Discovering faster matrix multiplication algorithms with reinforcement learning - Fawzi et al. - 2022 - Zotero 10_29_2022 5_15_22 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550865/c1918eab-6dfe-8a72-67ab-510c3a69f342.png)
JavaScriptで型定義を行う方法

## 前置き  

JavaScriptは動的型付け言語のため、コード上での型の概念は存在しない。 
一方、関数の引数として与えるObjectの中身などを定義したい場合がある。  
開発言語としてTypeScriptを採用することで型の定義を容易に行うことができるが、
既にJavaScriptで書かれたコードを改修する場合等、必ずしもTypeScriptが使えない場合も存在する。
そのような場合にJavaScript上で型定義を行う方法を紹介する。

## 問題例
例として、以下のような関数が与えられた場合について取り上げる。



```javascript
/**
 * 社員の一覧をconditionに従って取得する
 * @param {Object} condition 検索する条件
 * @return {Array.<Object>} 取得した社員一覧
 */
const fetchMembers = condition => {
   /*
    * 1000行くらいの処理。至るところでconditionが使われている。
    * condition.nameやcondition.idなどが見えるが、
    * 何に使われているのか、どんな型の値が入っているのかがわかりにくい。
    * しかも、この関数から別の関数へconditionを渡している箇所もある。
    */
}
```

関数の引数にconditionとしてオブジェクトを与えれば良いのは読み取れるが、  
condition変数の中身に何を指定すれば良いのかが全くわからない。 
関数を使うためには、既存の呼び出し箇所や関数本体の中身を調査する必要がある。

## @typedefを用いた型定義

上記のような問題は、コーディング時に型定義を明記しておくことによりある程度回避が可能である。  
@typedefを用いてObjectの中身を明示的に定義することでコードの可読性を上げることができる。

fetchMembers関数が定義されているjsファイルに以下のような記述を追加する。  

```javascript
/**
 * @typedef {Object} SearchCondition 社員検索時の条件
 * @property {string} name 社員の名前
 * @property {string | number} id 社員ID（文字列か数値を入れることができる）
 * @property {string} [hoby] 趣味([]で囲むことで、Optional値を指定できる（入れなくても良いパラメータ）)
 */
```

その後、先ほどのfetchMembers関数のドキュメンテーションコメントを以下のように改修することで、
SearchConditionとしてObjectの中身が定義され、
呼び出し側からはどのようなObjectを与えれば良いか読みやすくなる。

```javascript
/**
 * 社員の一覧をconditionに従って取得する
 * @param {SearchCondition} condition 検索する条件
 * @return {Array.<Object>} 取得した社員一覧
 */
const fetchMembers = condition => {
   /*
    * 1000行くらいの処理。至るところでconditionが使われている。
    * condition.nameやcondition.idなどが見えるが、
    * 何に使われているのか、どんな型の値が入っているのかがわかりにくい。
    * しかも、この関数から別の関数へconditionを渡している箇所もある。
    */
}
```

また、@typeを用いることで変数宣言の際に型を指定することもできる。

```javascript
/** @type {searchcondition} */
const searchcondition = {
    name: "hogehoge",
    id: 100
};
const members = fetchMembers(searchcondition);
```


エディタとしてVisualStudioCodeを用いると、以下のようにコード補完を表示することができるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1155356/c5a9225f-acf5-491f-0071-f9587fa18ee6.png)
【Script SetUp】当日のタスクだけを表示させたい！【VUEX】【TypeScript】

# 始めに
当日のタスクのみを表示するページの実装を行います！

やることはたった2つ！
* 事前準備(データを作っておく)
* データの加工

# 開発環境
* MacBook Air (M1, 2020)
* npm 8.18.0
* "dayjs": "^1.11.5"
* "vue": "^3.2.13"
* "vuex": "^4.0.0"


# 事前準備
検索機能を実装する前にやることが2つあります。
①型定義
②取得するデータの設定

# 型定義
使用する型を作りましょう。
```typescript:src/types/index.ts
export type State = {
  todos: todo[];
};

export type Todo = {
  id: number;
  description: string;
  date: Date;
};
```
## 検索するデータの設定。
以下のコードでは2つのことをします。
* 取得するデータ設定
* ゲッターでデータを取得するコードを定義
```typescript:src/store/index.ts
import { InjectionKey } from 'vue';
import { createStore, Store, useStore as baseUseStore } from "vuex";
import { State } from '../types'

export const key: InjectionKey<Store<State>> = Symbol();

export const store = createStore<State>({
  //データの設定
 state: {
    todos: [
        //当日のタスクのみ表示されているか確認するため、一つだけ、違う日程にしておく。
        {
            id:1,
            description: 'プログラミング'
            date: '2022-10-29'
        },
        {
            id:2,
            description: '散歩'
            date: '2022-10-29'
        },
        {
            id:3,
            description: '筋トレ'
            date: '2022-10-30'
        }
    ],
  },
    //データ取得するゲッターの定義
  getters: {
     getTodos: state => state.todos
  },
  mutations: {
  },
  actions: {
  }
});

export const useStore = () => {
  return baseUseStore(key);
}
```

# データの加工
ゲッターで取得したデータに、当日の日程を含むもののみ表示する処理を行います。
手順は2つ。
①dayjsのインストール
②データの加工

## dayjsのインストール
ターミナルで以下を実行してください。
```terminal: 
npm install dayjs --save
```

## データの加工
+以下のファイルにinjectしてください。
```vuejs: src/views/TodosView.vue
<script setup lang="ts">
import { computed } from 'vue'
import { useStore } from '../store'
import { Todo } from '../types'
import dayjs from 'dayjs'

//現在の日付を取得。リアクティブにすることで、常に当日の日付となる。
const currentDate = ref(dayjs())

//元々定めた日付のフォーマットの形に加工する。
const displayDate = computed(()=>{
    return currentDate.value.format('YYYY-MM-DD')
})

const store = useStore()
//当日の日付を含むデータのみを取ってくるようにゲッターを定義。
const todos = computed<Todo[]>(()=>{
    return store.getters['getTodos'].filter((element: Todo)=>todo.date.toString().includes(displayDate.value))
    )
})

</script>
<template>
    <div>
        <h2>当日のタスク一覧</h2>
        <hr />
        <table>
            <thead>
                <th>タスク</th>
                <th>日時</th>
            </thead>
            <tbody>
                <tr v-for="todo in todos" :key="todo.id">
                    <td>{{todo.description}}</td>
                    <td>{{todo.date}}</td>
                </tr>
            </tbody>
        </table>
    </div>
</template>
```
REGEXEXTRACT関数を活用して、ユーザ名を作成

# 前提
弊社では、新たにGoogleアカウントを発行する際、
たとえば「ヤマダ タロウ」さんの場合、`tarou.yamada@xxxxx.co.jp`というアドレスを発行します。すでに「ヤマダ タロウ」さんがいて今回が2人目の場合、末尾に数字をつけ、`tarou.yamada2@xxxxx.co.jp`となります。


# 課題

毎回、アカウント作成の前に、

**ユーザ名に被りがないかを検索　→　被りがあれば数字をつける**

という作業を手作業でしていました。ちょっとした作業ですが、毎月10〜20人超が入社するため、意外と手間がかかっていました。この作業を今回、省力化します。


# 完成形
ということで、完成形がこちら。

<details><summary>①メアド発行</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687068/030f087e-23a5-a164-cbb7-3980d3d56da5.png)

</details>

<details><summary>②純粋なlast+first</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687068/257d20dc-3539-1ef4-77c8-eb9598795dde.png)

</details>


### 仕組み
1. B3に`tarou.yamada`の形式で入力
1. B3の値が、`②純粋なlast+first`に記載された一覧を含めて何個目なのかをカウント
    ```js:
    =if(countif('②純粋なlast+first'!$A$2:$A$12,B3)+1=1,"",countif('②純粋なlast+first'!$A$2:$A$12,B3)+1)
    ```
1. B3の値と2で数えた数を合体
    ```js
    =B3&C3
    ```
1. ユーザ名ができあがり


# 何が難しかったの？
お気づきの通り、ここまではとても簡単なものです。
問題は、「②純粋なlast+first」の一覧を作成することにありました。

現在、弊社では上記のルールでメールアドレスを作成しているため、純粋に姓名をくっつけただけの値はもってなかったのです。だから、その一覧を作成する必要がありました。

<details><summary>目指したい状態</summary>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687068/679be39c-2acc-9126-a9f6-49a714e332b4.png)

</details>

### 実現方法
以下の関数を組むことで、実現しました。
```js:
=iferror(SUBSTITUTE(A2,REGEXEXTRACT(A2,"[0-9]+"),""),A2)
```

- 大枠の構成としては、SUBSTITUTE関数で文字を置き換える。
`＝SUBSTITUTE（文字列, 検索文字列, 置換文字列, 置換対象）`

- 今回は数字を検索して、数字を取り除きたいので、置換文字列をREGEXEXTRACT関数で指定する。
`=REGEXEXTRACT(テキスト, 正規表現)`

- `"[0-9]+"`の部分で、0〜9の値を指定。


:::note warn
REGEXEXTRACT関数はスプレッドシート専用で、Excelでは使用できないので要注意。
:::


# 感想・課題
完成形だけを見ると、シンプルな構成で簡単なものですが、REGEXEXTRACT関数がキーになります。この関数の存在しり、使い方を理解するまでに時間を要しました。

というか、そもそもこのアドレスの命名規則がイケてない。

僕がヤマダタロウさんだったら、ただ入社のタイミングが遅かっただけなのに、「9番目」っていう数字がついて、まるで自分が9番煎じかのように受け取ってしまう。

なので、この命名規則そのものを変えていきたい。
【React状態管理1】状態管理とは

# 概要
Reactの状態管理について学んだことを共有します。
本稿では状態管理の全体像の話ですが、今後、各状態管理ライブラリの使い方について投稿する予定です。

# 学習内容
- [状態管理とは](#状態管理とは)
- [状態管理のライブラリの種類](#状態管理のライブラリの種類)

# 状態管理とは
プロジェクト内のデータを専用の領域で保持・管理したもの（React Hooksでよく使われる`useState`も単一コンポーネントでの状態管理と言える）。
状態管理を使わなくても設計は可能だが、複数のコンポーネントでデータを活用する場合、下記のようにバケツリレー的にデータの受け渡しが必要となり、コードが煩雑になる。
そのため、規模の大きなプロジェクトほど、状態管理が重要となる。

![Reactのバケツリレー](https://camo.qiitausercontent.com/6e6427219ac7bbe8ce6af9c5681d2617e65c0ede/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3430363732372f35323537373032392d316233362d636366662d616562352d3363646462333736346430362e706e67)[^1]
[^1]: [Rectの状態管理のベストは！？](https://qiita.com/yoshinoritera55/items/57a14fc08641631452bc)より引用

<center>データ受け渡しのバケツリレー</center>

# 状態管理のライブラリの種類
状態管理のライブラリは複数あるが、それぞれ一長一短があり、主流と言えるライブラリはない。そのため、状況に応じて利用するライブラリを選定する必要がある。
| ライブラリ名 | 内容 | ReactAPI？ | ベース |
| --- |---|---|---|
|useContext|Reactの公式フック|Yes||
|Redux|これまで最も主流。非常に有用だが、概念理解が難しい。|Yes|state machine based|
|Zustand|シンプルで使いやすい|No|state machine based|
|XState|ステートマシンを実装するのに特化したライブラリ。状態遷移の制御が容易||state machine based|
|Recoil|Meta社が開発したライブラリ。|Yes|atom based|
|Jotai|サイズが軽量で利用が比較的容易|Yes|atom based|
|valtio|Poimandresが開発しているライブラリ|No|atom based|

atom-based：状態を個別に管理する
state machine based：全体を一つの状態として管理する


# 参考
[IT Kingdom](https://it-kingdom.com)
[状態管理とは](https://zenn.dev/maromero/scraps/ceafacc6c27662)
【初投稿】Stable（Waifu) diffisionをM1MacProで使う

# Stable diffisionとは
最近色々使われている、お絵描きAIソフト。
今回自分はMacBookProで構築していきます。色々な方法がネットにあり試してみたのですが、今回はその中でもMacbookProが簡単にローカルで実行できる方法を記載します。

## 使用した環境

- M1Pro搭載MacBookPro 
    - OS: Monterey,version: 12.6
    - メモリ：16GB
    - Cpu：　8Core
- python
    - version: 3.10.8
- stablediffusion
    - apple-silicon-mps-support https://github.com/bfirsh/stable-diffusion.git

- モデル
    - https://huggingface.co/CompVis/stable-diffusion-v-1-4-original
    - *現在は自分の趣味で、waifudiffusionを使っています。

# モデルの取得
モデルに関しては、Mac、WindowsなどのOSによる差異はないです。
通常のstablediffusionをダウンロードする場合は、以下のサイトからモデルをダウンロードします。下にあるwaifudiffusionは、アニメ調の女子を描くのに適したモデルです。

https://huggingface.co/CompVis/stable-diffusion-v-1-4-original

https://huggingface.co/hakurei/waifu-diffusion-v1-3

ログインした後は、Git　lfsでクローンするか、Download the weightsからモデルを
ダウンロードします。この時、モデルが`sd-v1-4.ckpt`と、`sd-v1-4-full-ema.ckpt`
の二つがありますが、どちらを選択しても動作します。自分はfull-emaの方をダウンロードしました。

![スクリーンショット 2022-10-29 15.21.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/f510092d-28e7-0e63-3afd-19ac80cad0a3.png)



# 環境構築

モデルをダウンロードするために、git lfsをダウンロードする必要があります。（Zipでダウンロードする事も可能。）
まずはHomeBrewをアップデートする。
HomeBrewがない時はこのリンクからインストールする。http://brew.sh/index_ja.html

```brew.update
brew update
```
そして、git-lfsをインストールする。

```lfs.install
brew install git-lfs
```

最新のPythonをインストールする。
```python.install
brew install python
```

依存関係をインストールするためにVirtualenvをセットアップする。
```
python3 -m pip install virtualenv
python3 -m virtualenv venv
```

最新のPythonをダウンロードした後、StableDiffusionのコードをクローンします。
```
git clone -b apple-silicon-mps-support https://github.com/bfirsh/stable-diffusion.git
```
その後、モデルを置くディレクトリを作成します
```
cd stable-diffusion
mkdir -p models/ldm/stable-diffusion-v1/
```
次に、実行環境をActiveにします。
```
source venv/bin/activate
```
Pythonパッケージのインストール・管理システムであるpipから依存関係をインストールします。
```
pip install -r requirements.txt
```

この時、`Failed building wheel for onnx`とエラー文が出る時は、以下のパッケージをインストールしてください。
```
brew install Cmake protobuf rust
```

先ほどダウンロードしたモデルを、上記で作成したディレクトリ`models/ldm/stable-diffusion-v1/`に「model.ckpt」という名前にリネームして保存します。

これでセットアップは完了です。
以下のような形でコードを実行してみると、、、
```
python scripts/txt2img.py \
  --prompt "a red juicy apple floating in outer space, like a planet" \
  --n_samples 1 --n_iter 1 --plms
```

`/stable-diffusion/outputs/txt2img-samples/samples`
に画像が出力されています。ちなみに自分はこんな感じ。
![00006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/021d24a4-0755-c8c7-8792-be3e314e4e4a.png)


出力にかかる時間はおよそ5分ほどです。Mac用のコードをちゃんとクローンできていれば、GPUをちゃんと使ってくれます。（違うコードで行った場合は1時間ほどかかっていました。）
![スクリーンショット 2022-10-29 15.31.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/8f809964-7602-d50d-d16c-1eed76e9dfd8.png)


# 2回目以降に実行する場合

最初に構築したstablediffusionのディレクトリに移動する。
```
cd stable-diffusion/
```
そして、環境をAcrtiveにする。
```
source venv/bin/activate
```

そして、絵画の生成コマンドを実行する。プロンプトを色々変えてみると、それに合った絵が出力される。ちなみに--n_samplesはサンプリングの回数、--n_iterは出力の回数であり、2とか3で試したら凄い時間がかかってしまった。1にするのが一番早いと思われる。
```
python scripts/txt2img.py \
  --prompt "好きな文字列" \
  --n_samples 1 --n_iter 1 --plms
```


# 参考サイト
https://gigazine.net/news/20220902-run-stable-diffusion-m1-macs-gpu/

https://zenn.dev/ktakayama/articles/6c627e0956f32c
【解決】複数のWSL2からDocker Desktopを使う

# 困ったこと

WSLとして複数のディストリビューションをインストールしている場合、デフォルトに設定しているディストリビューションからしかdockerが使えない
[この記事](https://qiita.com/drafts/2b06885b1455ce2ca2a0/edit)に解放法で、複数のUbuntu環境を使っていますが、dockerがデフォルトに設定しているUbuntuからしか使えなかった。

# 解決策

Docker DesktopのSetting>Resources>WSL INTEGRATIONで使えるようにするディストリビューションをONにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/6d058d92-6dc2-492a-493e-23138095226d.png)



参考
https://stackoverflow.com/questions/60708229/wsl2-cannot-connect-to-the-docker-daemon
自分のためのR小技集

自分用のメモです。

### TRUE/FALSEの数を数えたい

```R
> a = c(TRUE, TRUE, FALSE, TRUE, FALSE)
> sum(a) 
[1] 3

> b <- data.frame(x=c(1, 2, 3, NA), y=c(NA, 4, 5, NA), z=c(6, 7, 8, 9))
> table(is.na(b))

FALSE  TRUE 
    9     3
```

### データセットから特定のIDのデータをomit

```R
> df = data.frame(ID = c("ID1","ID2","ID3","ID4","ID5","ID6","ID7"), 
                 score1=c(4,6,2,9,5,7,8),
                 score2=c(45,78,44,89,66,49,72),
                 score3=c(56,52,45,88,33,90,47))
> df
   ID score1 score2 score3
1 ID1      4     45     56
2 ID2      6     78     52
3 ID3      2     44     45
4 ID4      9     89     88
5 ID5      5     66     33
6 ID6      7     49     90
7 ID7      8     72     47
>
> omit_ID <- c("ID2","ID3","ID6") 
> df2 <- df[is.na(match(df$ID,omit_ID)==FALSE),]
> df2
  ID score1 score2 score3
1  1      4     45     56
4  4      9     89     88
5  5      5     66     33
7  7      8     72     47

```


### データセットから特定列に特定キーワードを含む行をomit(大文字小文字も無視)

```R
> df
  ID        score1 score2 score3
1  1           Yes     45     56
2  2            No     78     52
3  3     Maybe yes     44     45
4  4            No     89     88
5  5  No Thank you     66     33
6  6      Yes I do     49     90
7  7 of course Yes     72     47
>
> df2 <- df %>% filter(!grepl("yes",score1,ignore.case=TRUE))
> df2
  ID       score1 score2 score3
1  2           No     78     52
2  4           No     89     88
3  5 No Thank you     66     33
```

### 特定列の列名変更
```R
> df
  ID        score1 score2 score3
1  1           Yes     45     56
2  2            No     78     52
3  3     Maybe yes     44     45
4  4            No     89     88
5  5  No Thank you     66     33
6  6      Yes I do     49     90
7  7 of course Yes     72     47
>
> df <- dplyr::select(df, No = ID, dplyr::everything())
> df
   No score4 score1 score2
1 ID1     56      4     45
2 ID2     52      6     78
3 ID3     45      2     44
4 ID4     88      9     89
5 ID5     33      5     66
6 ID6     90      7     49
7 ID7     47      8     72

```
GitとGithubを用いたファイル操作

勉強記録も兼ねてgitに関する自分が調べた限りの最低限の知識と操作コマンドを記録する。
OSはWindows 10
### Gitとは 


簡単に言えばバージョン管理用システム、ローカルで管理する場合と比較しての大きなメリットは

- 更新ログ(gitではバージョンというらしい)が全部残るため、後から辿りやすい
- 複数人で同時に弄っても上書きされない
がある(多分他にも色々ある)

### 仕組み
Webサーバー上にあるリモートリポジトリから必要なファイルをコマンドでローカルリポジトリに引っ張ってきてそれを編集、終わったらリモートリポジトリに返す
それをブラウザ上で行えるWebサービスにしたものがGithub、という理解

ここからはGithubでのリポジトリの追加やファイルの操作方法(接続方法はSSH)
### リポジトリの追加
- github上の自分のユーザーページにある"Repositories"をクリックし、右上にある"New"をクリック、必要事項を記入すればOK

### ファイルを入れる
入れたいファイルがあるディレクトリまで移動し
```
git init
git add "ファイル名"
git commit -m "バージョン名(任意)"
git branch -M main
git remote add origin "アドレス名"
git push -u origin main
```
の順に打っていけばOK

### ファイルを取り出す
取り出し先にしたいディレクトリまで移動し
```
git clone "アドレス名"
```
でOK
Electric final drive unit, ボッシュ自動車handbook 11版(82) p.1020

Electrification of the drive, Control of electric drive, ボッシュ自動車handbook 11版(82)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e
# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970


# Electric final drive unit
p.1020
## Functional component integration
## Vehicle integration and interfaces
## Performance classes and performance characteristic
## Adaptation for application

# Reference
参照なし

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

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

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
【Android】WebViewでベーシック認証を通す方法

# はじめに
WebView関連の実装を行う際、検証環境のWebページを表示する時などにベーシック認証を行う必要があったりしますよね。
このベーシック認証を通す方法を簡単にまとめておこうと思います。

# 対応方法
認証を通す方法は非常にシンプルです。
```
binding.webView.apply {
   webViewClient = object : WebViewClient() {
      override fun onReceivedHttpAuthRequest(view: WebView, handler: HttpAuthHandler, host: String, realm: String) {
         handler.proceed("認証ID", "認証パスワード")
      }
   }
}
```
WebViewClientはURLが読み込まれた際に呼ばれるshouldOverrideUrlLoadingなど、比較的使用頻度も多くご存知の方も多いと思います。
同クラスにonReceivedHttpAuthRequestという関数が用意されており、こちらが認証を必要とした際に呼ばれる関数となっているので、呼ばれた際に引数のhandlerに対してベーシック認証に必要なアカウントを設定してあげることで認証を通すことが可能となっています。

# さいごに
WebViewも色々と闇が深いですが、WebViewClientなどWebViewに関する機能を一通り目を通しておくと幸せになれるタイミングがあるかもしれません。
Control of hybrid drive, ボッシュ自動車handbook 11版(81) p.1010

Electrification of the drive, Control of hybrid drive, ボッシュ自動車handbook 11版(81)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e
# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970


# Control of hybrid drive
p.1010
## Hybrid vehicle
## Vehicle control unit for hybrid vehicle
## Drivetrain operating strategy for hybrid vehicles

# Reference
[1] D. D. Than, M Vafaelpour, M. El Baghdadi, R. Barrero, J Van Mierio, O.Hegazy, Thorough state of the art analysis of electric and hybrid vehicle powertrains Topologies and integrated energy management strategies
Renewable and Sustainable Energy Reviews
Volume 119, March 2020, 109596

https://www.sciencedirect.com/science/article/pii/S1364032119308044



# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

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

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Blockly - サンプルの実行

Googleが開発したブロック言語のBlocklyを試します。
最終的には、rosとのコラボ方法まで記載できたら嬉しいです。
まず、本記事ではBlocklyのサンプルの実行方法について記載します。

(環境: ubuntu 20.40)

まず、プログラムをローカルにダウンロードします。
そしてpythonのhttp.serverを使用してサーバーを立てます。

```
git clone https://github.com/google/blockly.git
cd blockly
python3 -m http.server
```

サーバー起動後,デモはdemosディレクトリにアクセスすると開くことができます。

http://0.0.0.0:8000/demos/ 

すると以下のようにBlocklyエディタが表示されました。

![Screenshot from 2022-10-29 15-06-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/913cfb60-6e88-3fa3-fe4b-81a3bbf82fdf.png)

printしてみると次のように(実行は右上の赤→ボタンから)

![Screenshot from 2022-10-29 15-13-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/017e02ee-3d41-5df1-b7fa-713e2c381b3f.png)

以上

次回以降,オリジナル関数の作成方法や自身のウェブページへの統合方法について記載したいと思います。
【備忘録】Nervesのバージョンをアップする方法

# nervesのバージョンをアップする方法
いやほんとそれだけの備忘録

備忘録：asdf current、mix nerves.info、mix phx.new -v 

```Elixir:
mix local.nerves
mix deps.update nerves
mix deps.unlock --all
mix deps.get
mix firmware
```