OmniAICreator/Qiita-1.07M huggingface dataset:
なぜScratchで最も短い?湯婆婆が作れるのか

https://qiita.com/TD12734/items/743e90fb867fee8c562e#comment-75b9dae7076f5ecafad3 には、123文字の湯婆婆が掲載されています。しかし、Scratchを使うと、もっと短くできます。

# 計算方法
Scratchのコードの長さの計り方は統一されていません。プロジェクトがシリアライズされたproject.jsonファイルの中身で測ると多分負けます。というわけで、実行部分の文字数で測ることとしました。

* 基本は[ScratchBlocks記法](https://scratchblocks.github.io)。
* 不要なスペースなどは除去(ScratchBlocks記法の許容内)
* ループの終わりに書く「end」は、その後に処理がない場合等は省略できるため、省略
* 文字数を計算

# Scratchで短くできるわけ
## (自然)言語の特性
実は、Scratchは「まったく同じコード」を違う言語で記述できます。たとえば、言語設定がドイツ語の場合は多くの場合中国語よりコードが長くなります。つまり、言語設定を変えればコード自体を変えなくてもコードが短くなります。

## 変数の初期化
変数を実行部分で初期化する必要はありません。すでに初期化された状態で保存したら、いつでも参照できます。つまり、変数に長い文字列などを格納すれば、この文字列は実行部分に含めなくても利用できます!

なお、変数は以下のように初期化されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237877/f7542cdd-0eaf-263a-3b63-78160c705bbd.png)

# やってみる
中国語で。

```
当@greenFlag被点击
询问(a)并等待
将[ｘ v]设为((回答)的第(在(1)和((回答)的字符数)之间取随机数)个字符)
对于(3)中的每个[c v]
在[b v]的第(2)项前插入(回答)
说(b)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237877/f569c18f-8590-77a1-fd77-8580cf11a26b.png)

106文字です。なお、このコードは日本語に「翻訳」すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237877/6f81b310-556b-c4fa-740c-ce36f2002bcd.png)

となります。

# 特徴

- 「値を聞いて変数に格納する」命令は1ブロックで済みます。
- 添え字は1始まり。
- カウンター変数を自動的にインクリメントしてくれる命令文が隠し機能としてあります。
- 「言う」ブロックは前に言ったことを上書きするので、複数回呼び出しても大丈夫。
任意の複数ブランチを一括削除したい件

## 困ったこと

気づくと手元にブランチがたくさん存在した状態となり、一個ずつ `git branch -d hoge` としていくのは手間だなぁと感じることが多々ありました。同僚に同じような悩みがないか聞いたところ、masterなど特定のブランチ以外を一括で削除するスクリプトを使うとのことでしたが、それだと作業中のブランチも削除されてしまうので自分の期待通りではありませんでした。

```jsx
$ git branch
  hoge
  hoge1
* hoge10
  hoge2
  hoge3
  hoge4
  hoge5
  hoge6
  hoge7
  hoge8
  hoge9
  master
```

## やりたいこと

1. 何かコマンドを叩く
2. ブランチ一覧が表示される（絶対に削除しないブランチは事前にフィルターしておく
3. ブランチ一覧上で任意のブランチ複数個を簡単に選択できる
4. エンターキーを押したら任意のブランチが一括で削除される
5. :tada: 

## 解決方法

課題はブランチ一覧上で任意のブランチを複数個選択する方法だったが、 [peco](https://github.com/peco/peco) を使うことで簡単にできた。peco には複数行選択機能があったので、それによりブランチの複数選択ができた。あとはgitのブランチ削除コマンドに渡してあげれば解決。gitのalias設定をしておくことですぐに呼び出せるようにした。 `select-delete-branch` は好みに設定してください。

```bash
[alias]
	select-delete-branch = !git b -D $(git branch | grep -v '*' | grep -v master | sed 's/ //g' | peco)
```

## 実行例

```bash
$ git branch
aaa
  bbb
  ccc
  ddd
  eee
  fff
* master
$ git select-delete-branch
# 以下が表示されるので Control + Space で複数選択をする
QUERY>                                                                                                                                                                             IgnoreCase [6 (1/1)]
aaa
bbb
ccc
ddd
eee
fff

# エンターキーを押すと以下のように一括で削除される
Deleted branch aaa (was 3d9df20).
Deleted branch bbb (was 3d9df20).
Deleted branch ccc (was 3d9df20).
Deleted branch ddd (was 3d9df20).
Deleted branch eee (was 3d9df20).
Deleted branch fff (was 3d9df20)
```

めっちゃ便利〜！ 

もし`Control + Space` が他でアプリで使用している場合は、peco の[キーマップ設定](https://github.com/peco/peco#keymaps)を変更することも可能です。

## まとめ
実は最初は[シェルスクリプト](https://gist.github.com/hypermkt/bf48edc0e12f66f36ac8fd305aa05047)で同じことをしていたのですが、既存ライブラリでもっと楽にできるのでは？と考えていたら、pecoでサクッとできた。peco, 便利ですね。
AWS Lambda Layerメモ

## Lambda Layerの中身は `/opt` に置かれる

> Layers are extracted to the /opt directory in the function execution environment.

`/var/task` じゃないので注意

[AWS Lambda layers
](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html)

## Lambda Layerに言語ランタイムを入れる場合は所定のディレクトリに入れる

言語ランタイムをLayer化する記事で、nodejsやpythonディレクトリに入れるのはなんで？？　と思っていたが、こういうことかー

[Including library dependencies in a layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path)
No template for interactive request

#遷移先のページが存在しないため発生するエラー
簡単なエラーをしてしまいました…

index　→　edit , new , show
などに遷移する場合、index.html.erbと同じディレクトリに設置しないとコントローラがこのファイルを探せなくてエラーが発生してしまいます。

一言でいうと、ファイルの設置ミス。
Xcode, Pods ProjectName.debug.xcconfig unable to open file.に対する対応方法

#はじめに
Githubからcloneしたプロジェクトの実行を試みた際に` ProjectName.debug.xcconfig unable to open file`というエラーに遭遇したため備忘録をかねて記録として残したいと思います。

以下のようにしていただければ解決できるかと存じます。

```swift:solved
pod deintegrate
pod install
```

今回参考にした記事です。
より詳細に記載がりますので、よろしければご参照ください。
https://stackoverflow.com/questions/55558984/xcode-pods-projectname-debug-xcconfig-unable-to-open-file-wrong-directory

ご参考になれば幸いです。
【自分メモ】フレームワークについて

制作したいものに対して、これを使えば作りやすくなりますよ、的なものがフレームワーク。

Webアプリケーションを制作する時は、RubyonRailsというフレームワークを使います。
RubyonRailsにはWebアプリケーションを制作するための様々な機能がモリモリ入っているので、RubyonRails(の書き方)に従ってコードを書けば、自分で一から作成するよりも遥か簡単にWebアプリケーションを制作することができます。

※自分の考えをメモとして残していますので、間違っていたり修正した方が良い点がございましたら、ドシドシつっこみいただけると嬉しいです！
【DroidScript】スマホでスマホアプリを作る① Hello World!

##概要
DroidScriptと言うスマホアプリがある。

javascriptを記述して、オリジナルアプリを開発できるらしい。しかもスマホで！そりゃあスマホアプリなんだからそうなんだろうけど何か衝撃。

GASを覚えたことで、javascriptなら行けんじゃね？と、ちょっと触ってみることにした。

##DroidScript
Playストアから入手可能。

サンプルコードが大量にあるためヒントは多いけど、ググっても日本語のサイトはあまりヒットしないし、Qiitaの記事もゼロ・・・操作は手探りになりそう（´・ω・｀）

サンプルコードを見ると、横スクロールのゲームやらメディアプレイヤーやらある他、カメラ、メール、USBなどなど、出来ることはかなり多い。

アプリの画面をPCに表示させる方法もあって、スマホでチマチマやらなくてもキーボードでコード入力できるみたい（ちな、今回は全てスマホから操作）。

基本操作は全て無料！プラグインが豊富で、APKファイルへのビルドやブルートゥース対応など、一部のプラグインが有料になっている。

##目的
以前に、WEBアプリ導入の練習で「電子レンジワット数で加熱時間を換算するアプリ」を作ったので、今回も同じお題で練習してみる。

参照：[【GAS】電子レンジワット数で加熱時間を換算するwebアプリを作ってみた](https://qiita.com/YasumiYasumi/items/f618fcbbe8beed2db8a9)

##Hello World!
何事もハローワールド！から。

アプリをインストールしたところ、最初にサンプルアプリが用意されていたので起動してみた。
![Screenshot_20201121-123800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/1aebad56-15be-66d9-aca8-ac1308ce96b3.png)
画面にはドロイド君と「Press Me」と書かれたボタンが１つ（左画像）。ボタンをタップすると「Hello World!」と画面に表示された（右画像）。

コードを表示させたところこんな感じ。

```javascript
//Called when application is started.
function OnStart()
{	
  //Create a layout with objects vertically centered.
  lay = app.CreateLayout( "linear", "VCenter,FillXY" );	
	
  //Create image 1/5 of screen width and correct aspect ratio.
  img = app.CreateImage( "Img/Hello World.png", 0.2, -1 );
  lay.AddChild( img );		

  //Create a button 1/3 of screen width and 1/10 screen height.
  btn = app.CreateButton( "Press Me", 0.3, 0.1 );
  btn.SetMargins( 0, 0.05, 0, 0 );
  lay.AddChild( btn );

  //Set function to call when button pressed.
  btn.SetOnTouch( btn_OnTouch );

  //Add layout to app.
  app.AddLayout( lay );
}

//Called when user touches our button.
function btn_OnTouch()
{	
  //Show a popup message.
  app.ShowPopup( "Hello World!" );
}
```

英語は読めないけど、どうやら`OnStart()`がアプリを開いたときに呼び出される関数みたい。

`app.CreateLayout`で宣言した`lay`に`.AddChild`で表示させたいアイテムを放り込み、`app.AddLayout`でアプリに渡してるんだなぁ・・・とか、

`btn.SetOnTouch( btn_OnTouch )`でボタンがタップされた時の関数を呼び出してるみたいだなぁ・・・とか、

`function btn_OnTouch()`では、`app.ShowPopup`でメッセージがポップアップするんだろうなぁ・・・など、

何とか分かりそう。

##次回
次回から自作アプリの作成。
[スマホでスマホアプリを作る② 背景やテキストの追加](https://qiita.com/YasumiYasumi/items/1569dcc891217a2c92d7)

###つづく

##シリーズ
DroidScript電子レンジアプリ作成
[スマホでスマホアプリを作る① Hello World!](https://qiita.com/YasumiYasumi/items/10796071033a9cefc0b4)
[スマホでスマホアプリを作る② 背景やテキストの追加](https://qiita.com/YasumiYasumi/items/1569dcc891217a2c92d7)
[スマホでスマホアプリを作る③ スピンボタンとシークバー](https://qiita.com/YasumiYasumi/items/867000c0f6f188551fb7)
[スマホでスマホアプリを作る④ 実行ボタン](https://qiita.com/YasumiYasumi/items/2ae76ac5ec49e0bdb9e8)
[スマホでスマホアプリを作る シリーズまとめ](https://qiita.com/YasumiYasumi/items/832ec009681310ecdd1c)

外伝
[【GAS】電子レンジワット数で加熱時間を換算するwebアプリを作ってみた](https://qiita.com/YasumiYasumi/items/f618fcbbe8beed2db8a9)
letとlet!の使い分け(Ruby/Rspec)

letとlet!の使い方ではまったので備忘録として残します。
<h2>letとは</h2>
letはインスタンス変数やローカル変数をletという機能で置き換えることができます。
<pre><code>ex)
@user = user.create
let(:user) { create(:user) }</code></pre>

letを使うと何が嬉しいかというと、テストコードがすっきりするというのと
letはその変数が必要になるまでは呼び出されないという遅延評価されるという特徴があるため、効率のよいテストコードを作成できることです。
beforeを使うとブロックの宣言時に全ての変数が評価されるため、
使用していない変数があったとしても評価されてしまい
あまり効率のよくないテストコードになってしまうことがあります。

let!は基本的にはbeforeと同じ意味になります。
つまりテストを実行する上で前提条件にあたる部分はletではなくlet!で記載してあげる必要があります。
<pre><code>ex)
before do
@user = user.create
end
let!(:user) { create(:user) }
</code></pre>

ただしメソッドを事前に実行したい場合は、letでは記載できないため、beforeを使う必要があります。
<pre><code>
before do
  sign_in(current_user)
end
</code></pre>
<h2>はまったポイント</h2>
ぼくがはまったのは記事アプリを作成する際に
ログアウトの機能のテストコードを作成していたときです。

ぼくが最初に作成したテストコードは以下になります。
この場合、次のように処理されるためletで定義していても問題ありませんでした。
subjectが実行される
subjectの中でheaders使用されているため
let(:headers) { user.create_new_auth_token }が実行される
headersの中でuserが使用されているため
let(:user) { create(:user) }が実行される
<pre><code>
describe "DELETE /api/v1/auth/sign_out" do
 subject { delete(destroy_api_v1_user_session_path, headers: headers) }
 context "ユーザーがログインしているとき" do
  let(:user) { create(:user) }
  let(:headers) { user.create_new_auth_token }
  it "ログアウトできる" do
   subject
   expect(response).to have_http_status(:ok)
  end
 end
end
</code></pre>

次にヘッダーのトークン情報の変化を確認するために
以下のコードに修正しました。
<pre><code>
describe "DELETE /api/v1/auth/sign_out" do
 subject { delete(destroy_api_v1_user_session_path, headers: headers) }
 context "ユーザーがログインしているとき" do
 let(:user) { create(:user) }
 let(:headers) { user.create_new_auth_token }
  it "ログアウトできる" do
   expect { subject }.to change { user.reload.tokens }.from(be_present).to(be_blank)
   expect(response).to have_http_status(:ok)
  end
 end
end
---エラー内容
Failure/Error:expect{subject}.to change{user.reload.tokens}.from(be_present).to(be_blank)
expected `user.reload.tokens` to have initially been be present, but was {}
</code></pre>

<code>expect { A }.to change { B }.from(X).to(Y)</code>
とすると、ぼくは最初Aを実行後Bの前後でXからYに変化しているかのテストをしていると考えていました。
その場合、順番に処理していけばletで定義していても問題ないのでは？と考えていました。

メンターの方からの指摘で、正しくは
<code>expect { A }.to change { B }.from(X).to(Y)</code>
とすると、Aが発生した時にBがXからYに変化しているかのテストがやりたかったことになります。
つまりリロード(B)前後じゃなくsubject(A)の前後でuser.reload.tokensの値が変化しているかどうかをチェックする。

修正したコードです。
headersをlet→let!で定義するように修正しました。
<pre><code>
describe "DELETE /api/v1/auth/sign_out" do
 subject { delete(destroy_api_v1_user_session_path, headers: headers) }
 context "ユーザーがログインしているとき" do
 let(:user) { create(:user) }
 let!(:headers) { user.create_new_auth_token }
  it "ログアウトできる" do
   expect { subject }.to change { user.reload.tokens }.from(be_present).to(be_blank)
   expect(response).to have_http_status(:ok)
  end
 end
end
</code></pre>

今回はまったのはテストコードの処理を正しく理解していなかったため、
前提条件を正しく定義できていなかったことが原因でした。
Pythonでパスワードツールを作成してみました。

#はじめに
pythonを勉強し始めて、約1ヶ月が経った筆者が初めて作成した
パスワードツールが完成したので記事にしました。
まだまだ、改善の余地はたくさんありますのでより良いものにしていきます！

#利用環境
・windows 10
・VS code 1.51.1

#目的
テキストファイルにパスワードを三種類ランダムで生成する。

#コード
長文のため、閲覧注意願います。
<details><summary>コード</summary><div>

```python:password.py
import random , string

password = [random.choice(string.hexdigits) for i in range(10)]
password1 = [random.choice(string.hexdigits) for i in range(10)]
password2 = [random.choice(string.hexdigits) for i in range(10)]

passwordlist = ''.join(password)
passwordlist1 = ''.join(password1)
passwordlist2 = ''.join(password2)

passwordlist = str(passwordlist)
passwordlist1 = str(passwordlist1)
passwordlist2 = str(passwordlist2)
passname = 'pass'
passname1 = 'pass1'
passname2 = 'pass2'

import pathlib
pathlib.Path("パスワード.txt").write_text('{}\n{}\n{}\n{}\n{}\n{}\n'.format(passname,passwordlist,passname1,passwordlist1,passname2,passwordlist2))
```

</div></details>



<details><summary>結果</summary><div>

```text:パスワード.txt
pass
Q2n8d7favk
pass1
PRpnbOuTuj
pass2
0Y1hpyMkea
```

</div></details>

#解説
それでは、解説していきます。

```
import random , string
```

こちらは、pythonにrandom関数とstring関数をimportしています。
random：乱数を生成する関数。
string：文字列操作の関数。
stringは、実は今回初めて知ったのですが、私はpython標準ライブラリから確認を行いました。
 [python標準ライブラリ](https://docs.python.org/ja/3/library/string.html)
***
次に、

```
password = [random.choice(string.hexdigits) for i in range(10)]
```

こちらは、変数名：passwordにランダムな英数字10文字を代入するコードです。
random.choice():()内のものをランダムに生成する。
string.hexdigits：英数字で大文字、小文字混在のものです。
for i in range(10)：10回同じ処理を繰り返す。
***
次は少しまとめますが、

```
passwordlist = ''.join(password)
passwordlist = str(passwordlist)
passname = 'pass'
```
passwordlist = ''.join(password)：変数名passwordを結合し、passwordlistへ代入
passwordlist = str(passwordlist)：変数名passwordlistを文字列へ変換
passname = 'pass'：変数名passnameに文字列passを代入
***
最後です。

```
import pathlib
pathlib.Path("パスワード.txt").write_text('{}\n{}\n{}\n{}\n{}\n{}\n'.format(passname,passwordlist,passname1,passwordlist1,passname2,passwordlist2))
```
ここに関しては、以下リンクに記載されている内容をそのまま踏襲しました。
[ファイルに書き込む文字列の変数が複数ある場合](https://ja.stackoverflow.com/questions/43581/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%80%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E5%A4%89%E6%95%B0%E3%81%8C%E8%A4%87%E6%95%B0%E3%81%82%E3%82%8B)
***
以上です。
やっぱり、一つのプログラム作るのも大変です。
今後の改訂としては、毎月更新したいので更新のタイミングを設定
自動で更新。
前月のパスワードを念のため保管する。

ここまで作ってみたいなと思います！
他にもアイデアあったり、コードもっと短く出来る方法あれば
是非教えていただけると嬉しいです！

閲覧ありがとうございました！！
ActionController::UrlGenerationError in CreditCard#new　~~pathをprefixで書いた時のエラー~~

# はじめに
マイページへのリンク先をprefixで書いた時にエラーでつまずいたので記録として残します。
# 実装したこと
hamlの ``= link_to``でurlを``"/users/#{current_user.id}"``で
記載してマイページに遷移するようにしていました。
``"/users/#{current_user.id}"``をprefixの記載に変更するために
rails routesで探しにいきました。
![user:id routes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684702/53e96fa2-bb5a-ac67-1781-c922925b5971.png)
userとなっているので``user_path``として記載しました。
すると下記のエラーが発生。
![UrlGenerationError.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684702/b330b858-8321-0f9a-460d-d528c43832c6.png)
No route matches {:action=>"show", :controller=>"users"}, missing required keys: [:id]
のエラーコードを見て<font color="Orange">missing required keys: [:id]</font>の部分に着目しました。
「idが必要だけどないよー」と言われてます。
なので``user_path``の後に``(current_user.id)``を足して記述しました
結果、無事に解決しました。

### 修正前

```ruby
= link_to "マイページ", user_path
```

###修正後

```ruby

= link_to "マイページ", user_path(current_user.id)
```

# おわりに
これからは最初からprefixで記載する習慣をつけて行こうと思います。
今回はエラー文を読み取って割と早期に解決することができましたので
今後も冷静にエラー文を分析して解決する能力を高めていこうと思います。
何か補足事項とうございましたら、是非コメントをお願いいたします。


<font color="Orange">しょうま</font>
[Rails]ゲストログイン機能

# はじめに
ポートフォリオにゲストログイン機能があった方が良いとのことだったので実装してみました。

# 目次
- 1. ルーティング
- 2. コントローラー
- 3. モデル
- 4. ビュー

# 1. ルーティング
routes.rbにゲストログイン用のアクションを設定します。
deviseのsessionsコントローラーに新しくメソッドを追加しています。

```ruby:config/routes.rb
Rails.application.routes.draw do
  devise_for :users
  devise_scope :user do
    post 'users/guest_sign_in', to: 'users/sessions#new_guest'
  end
  ~略~
end
```

# 2. コントローラー
controllersの中にusersフォルダを作成しsessions_controller.rbファイルを作成。
new_guestメソッドをコントローラーに作成します。
guestメソッドはモデルに作成します。

```ruby:app/controllers/users/sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
  def new_guest
    user = User.guest
    sign_in user   # ユーザーをログインさせる
    redirect_to root_path, notice: 'ゲストユーザーとしてログインしました。'
  end
end
```

# 3. モデル
find_or_create_by!でゲストユーザーが無ければ作成、あれば取り出します。
あとはゲストユーザーがない時に作成するユーザー情報を記述しています。

```ruby:app/models/user.rb
def self.guest
  find_or_create_by!(email: 'aaa@aaa.com') do |user|
    user.password = SecureRandom.urlsafe_base64
    user.password_confirmation = user.password
    user.nickname = 'サンプル'
    user.birthday = '2000-01-01'
  end
  ~略~
end
```

# 4. ビュー
今回はヘッダーにゲストログイン用のボタンを作成しました。

```ruby:app/views/shared/_header.html.erb
<ul class='lists-right'>
  <% if user_signed_in? %>
    <li><%= link_to current_user.nickname, user_path(current_user.id), class: "user-nickname" %></li>
    <li><%= link_to 'ログアウト', destroy_user_session_path, method: :delete, class: "logout" %></li>
  <% else %>
    <li><%= link_to 'ゲストログイン（閲覧用）', users_guest_sign_in_path, method: :post, class: "login" %></li>
    <li><%= link_to 'ログイン', new_user_session_path, class: "login" %></li>
    <li><%= link_to '新規登録', new_user_registration_path, class: "sign-up" %></li>
  <% end %>
</ul>
```

# 参考リンク
https://qiita.com/take18k_tech/items/35f9b5883f5be4c6e104
１ファイルのHTML(+JavaScript)で、QRcodeを生成する



##１ファイルのHTML(+JavaScript)で、QRcodeを生成する

##2020.12.19追記
「構造的連接」に対応
「構造的連接」で拡張＞１ファイルのHTML(+JavaScript)で、QRcodeを生成する
https://qiita.com/santarou6/items/baedd6ab5448aae5c1cf


##2020.12.15追記
※型番40まで対応。最大1666byte。和文約550文字。
http://thomas.cranky.jp/js_QR/QRcode_javascript40.html
https://github.com/santarou6/QRcode_javascript/blob/main/QRcode_javascript40.html


##概要

・ライブラリ等を利用せず、javascriptを持つ１ファイルのHTML文書で、QRコードを生成できる
・javascript内で、スクラッチ（ゼロ）からQRcodeを書き出している
・型番は１～２５まで対応
・最大718byteまでデータ容量を持てる。日本語（UTF-8）で、約２３０文字ほど
・訂正レベル「Q」、マスクパターンは「011」で固定

#外観
（以下↓はイメージ（画像）です）
![QRcode_javascript.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107418/2ad84d1d-f1c6-85ec-6e67-56fd0f44739b.png)


#動作サンプル

http://thomas.cranky.jp/js_QR/QRcode_javascript.html
http://thomas.cranky.jp/js_QR/QRcode_javascript40.html

#github

https://github.com/santarou6/QRcode_javascript/blob/main/QRcode_javascript.html

- - -

#参考

QRコードの８種類のマスクを図示する
https://qiita.com/santarou6/items/f254f9fa5ea32d83ae27

エクセルの、ワークシート関数のみでQRコードを作成する
https://qiita.com/santarou6/items/dda2f88f42c55cd2118f

EXCELのVBAだけでQRコード。一部修正して日本語（全角）でも作成可能に。サンプルのエクセルファイルあり。
https://qiita.com/santarou6/items/d623417ea8ba33756108
iOSアプリでOSで提供する機能のUI言語の切り替え


OSで提供する機能を呼び出す際にデフォルトのプロジェクト設定ではUIが英語表示になる。
日本語で表示させるためにはプロジェクトの設定からLocalizationにJapaneseを追加する。

![スクリーンショット 2020-11-21 17.43.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104863/7f7807bc-fadf-0b96-c964-923759daca4d.png)
Railsの標準時間を日本時間に設定する方法


この記事では、Railsの標準時間を日本時間に変更する方法を紹介します。

以下の行を追加します。

```ruby:config/application.rb
config.time_zone = 'Tokyo'
```

行の追加場所

```ruby:config/application.rb
module FreeApp
  class Application < Rails::Application
    # (以下略)
    config.load_defaults 6.0
    config.i18n.default_locale = :ja
    config.time_zone = 'Tokyo'
  end
end
```

追加したら、再起動をすれば反映されます。
諦めないのが俺の魔法だ！！絶対にリモートサーバーからDB情報を取得してインポートしてみせる！！

案件の保守対応で環境構築の際に
DB情報を用意されておらず
開発で利用していたサーバーから
DB情報を取ってきてローカルで反映させるために
今回行った内容を忘備録としてまとめておく。

余談ですが、ガチの現役エンジニアは本当にすごい
相談でちょいと質問したら悩んでいる原因を明確化(整頓)してもらった上で
回答を貰える
答えを教えるのは悪！とは言いませんが
考えもせずに答えを教えて貰うのと
なぜ悩んでいるのかを明確にしてもらってから教えてもらうとでは
理解度と腹落ち度が断然変わってきますね(о´∀`о)

それでは本題へ！

### リモートサーバーのDB情報が欲しい
まずはリモートサーバーへログイン
sshで〜のくだりは別途調べてみて下さい！
ログインできたら次に
MySQLへのログインをして求めているDB情報があるのか確認をしよう！

```PHP
$ mysql -u ユーザ名 -p
```

上記を入力してEnterを押すと
パスワードが求められるので入力してEnter
ログインができると[$]が[mysql>]に変わるのでそうなれば成功

```PHP
mysql>
```
次にDB情報を一覧で確認する

```PHP
mysql> show tables;
```
すると一覧で表示されるのでそのDBの名前を控えておく
もし必要であればテーブル情報も確認できるので参考にしてみて下さい

```PHP
mysql> use db_name;
mysql> show tables;
```

そしたら次はそのテーブル情報をファイルにしていきます

```PHP
mysql> quit //またはexit
mysql> show tables;
```

**MySQLから抜けることが必要です！**
自分はこれを知らずに
ずっとMySQL内でdumpしようとしてエラー出しまくってました
抜けたら次に

```PHP
$ mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME > OUTPUT_FILE_NAME
```

それぞれの必要項目が間違っていなければ
このコマンドを入力した階層内でファイルが作成されます

ここまででリモートサーバーでの作業は終わりなのですが
出る前に求めているファイルのパスだけ確認しておくとあとの作業が楽になりますね

### ローカルでの作業
ローカルであればどこでもいいと思うのですが僕は今回デスクトップに
ファイルをダウンロードしてくる操作をしました

```PHP
$ scp [オプション] [接続ユーザ]@ホスト名(IPアドレス):コピー元 コピー先
```

それぞれの情報を理解しておけばこちらもさくっと打って
ダウンロードができます！
終わったらDBをインポートさせるんですが
僕は今回、Sequel Proを使ってインポートをしたのですが
順番を間違えるとあれ？できない？？ってなるので気をつけましょう！

- まずはDBを作っておく
- 作ったDBを選択しておく
- インポートが活性化されるので指定のファイルをインポート

これで今回求めていた作業が完了しました！
覚えてしまえば10前後で終えれそうな内容でしたね
ちなみに僕は1時間前後かかってましたので
時間を無駄にしないように気をつけましょう(о´∀`о)
UWP 新しいウィンドウを表示する。

#新規Windowを作成し、表示する方法
2通りの方法がある。

###方法1
新規作成されるウィンドウは、もとのウィンドウと<B>同じスレッド</B>で作成される。

```window1.cs
var frame = new Frame();
//frame.Navigate(typeof(AnotherPage));

var appWindow = await AppWindow.TryCreateAsync();
ElementCompositionPreview.SetAppWindowContent(appWindow, frame);

await appWindow.TryShowAsync();
```

###方法2
新規作成されるウィンドウは、もとのウィンドウと<B>別のスレッド</B>で作成される。

```window2.cs
CoreApplicationView newView = CoreApplication.CreateNewView();

int id = 0;
await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
    var frame = new Frame();
    //frame.Navigate(typeof(AnotherPage));

    Window.Current.Content = frame;
    Window.Current.Activate();
    id = ApplicationView.GetForCurrentView().Id;
});

await ApplicationViewSwitcher.TryShowAsStandaloneAsync(id);
```

#まとめ
方法1
https://docs.microsoft.com/ja-jp/windows/uwp/design/layout/app-window

方法2
https://docs.microsoft.com/ja-jp/windows/uwp/design/layout/application-view
ディレクトリによってgitアカウントを自動で切り替える設定(includeIf)

## はじめに
gitのアカウントの切り替えってめんどくさいですよね？
切り替えを忘れて、仕事のgitにプライベートのアカウントでpushして直すのに苦労した方もいると思います。

そんなことが起こらないように自動でアカウントを切り替える設定を紹介します。

## gitアカウントを切り替える設定
特に設定をしていないと.gitconfigの設定が適用されます。(global)

そこで、仕事用のディレクトリ(work)と私用のディレクトリ(private)によって
gitのアカウントを自動で切り替えられるように設定ファイルを追加します。

やることは2つです。
1. `.gitconfig`と同じ階層に`.gitconfig_work`と`.gitconfig_private`を作成してuser.name, user.emailを設定する
2. `.gitconfig`でディレクトリごとにパスを指定する

### 1. `.gitconfig_work`と`.gitconfig_private`を作成
下記のファイルを作成してnameとemailをそれぞれ設定します。

```~.gitconfig_work
[user]
	name = workで使用したいuser.name
	email = workで使用したいglobalのuser.email
```

```~.gitconfig_private
[user]
	name = privateで使用したいuser.name
	email = privateで使用したいglobalのuser.email
```


### 2. `.gitconfig`でディレクトリごとにパスを指定する
アカウントが切り替わるように`.gitconfig`でディレクトリごとにパスを指定する
`includeIf`がめっちゃ重要！

```~.gitconfig
[user]
	name = globalのuser.name
	email = globalのuser.email

# workディレクトリの時に.gitconfig_workが読み込まれる
[includeIf "gitdir:~/work/"]
  path = ~/.gitconfig_work

# privateディレクトリの時に.gitconfig_privateが読み込まれる
[includeIf "gitdir:~/private/"]
  path = ~/.gitconfig_private

```

## 確認
まずはworkディレクトリ
workディレクトリの任意のプロジェクト内で下記のコマンドを打つとworkのname,emailになっていると思います。


```:ターミナル 
$ git config user.name
workのuser.name

$ git config user.email
workのuser.email
```

次にはprivateディレクトリ
privateディレクトリの任意のプロジェクト内で下記のコマンドを打つとprivareのname,emailになっていると思います。


```:ターミナル 
$ git config user.name
privateのuser.name

$ git config user.email
privateのuser.email
```

## 終わりに
これを知る前はshellに自作の関数を作って切り替えていました。
それだけでも十分感動したのですが、やっぱり自動で切り替えができる方がミスもしないのでいいですよね。
【Rails】一意性制約のバリデーションメッセージを設定する

![ダウンロード.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605568/43b35d9e-3d79-34a7-0d97-1567c007c073.jpeg)
解説はコナン君の声に脳内変換してください

## どんな問題？
例えばユーザー登録機能を実装する場合、emailは**一意性制約（unique）**をつけるのがふつうだよね
当然Userモデルのバリデーションにuniquenessを設定することになるけど、ひとつ困ったことが起こるんだ

このままだと一意性制約に引っかかった場合、エラーメッセージは`「メールアドレスはすでに存在します」`と表示されちゃうよね

（目暮警部） 「しかしそれがどうしたと言うのかね」

ふつうのユーザーなら特段問題にはならないと思うよ
でも、この機能を使えばあることが可能になるんじゃないかな

そう、この機能によって`「すでに登録済みの有効なメールアドレスがあるか」`確かめらちゃうよね

**悪意あるユーザーにメールアドレスがバレてしまう**のは良くないってことなんだ

## どのように解決する？
解決方法はいたってシンプル
バリデーションエラーのメッセージを個別に設定するだけだ！


```ruby:user.rb

validates :email, uniqueness: { message: 'そのアドレスは使用できません' },
                  confirmation: true
```
ちなみに`confirmation: true`はメールアドレス変更時に確認用の入力をさせることを想定してつけてるオプションだから、この記事の本質とは直接関係ないよ
【WordPress】引用元を右寄せにするCSS

WordPressで記事を書くときに、引用元が本文と同じく左寄せで見づらかったので、右寄せにしました。
あと引用元の文字を少し小さくしました。

Before
![2020-11-21_12h21_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898241/95e514e6-aa08-90b6-2ee3-b919714897a3.png)
After
![2020-11-21_12h20_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898241/b392bc19-a94d-09fa-e3ba-02af52360ecf.png)

##前提
テーマ:JIN
##引用元を右寄せにするCSS

```
/* 引用元 */
.wp-block-quote > cite {
	font-size: .8em;
	display: inline-block;
	text-align: right;
	width: 100%;
}
```
##ブログ
ブログやってます。プログラミングについては書いてないけど。
[思い考える日常](https://www.kabuto0120.com/ "思い考える日常")
再利用ブロックを管理画面に表示ししたい

現在、オカログというブログを運営していて困ったことがありました。
記事にショートコードを埋め込むときに、再利用ブロックを使用しているのですが、再利用ブロックを管理しようとしたときに毎回投稿画面にアクセスしないといけないのです。

こんな感じの流れですね。
![eea7f2626f1fb6526acd69539e0fb75c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/126c2d9b-cdbb-fcb7-a730-774baa3210dc.png)

![aea461527c48f66143f2c56e02962b7b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/aa2d2e50-520d-0383-72b8-59c5a6872fa8.png)


![9cd301b4852e7c9340785609bebacc04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/d5240aea-a48d-6de5-231b-ee2043b7f814.png)

再利用ブロックだけを管理したいので、毎回投稿画面にアクセスしないといけないのが億劫でした。


こちらの記事を読むと、管理画面にブロックの管理を追加することができるようになります！
![Frame 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/1b5c04a2-836d-a241-2381-f9a31ea9d212.png)

この管理画面からアクセスすることができたらと思っていたんですが、調べてみるものですね。
既に先駆者がいて、一発で表示することができました。

こちらの記事を参考にして是非やってみてください。
https://www.saaria.info/archives/3184

ちょっとだけ書いておくと私が書き足したコードはこれだけです。

```functions.php
/*管理画面にメニューを追加する*/
add_action( 'admin_menu', 'add_custom_menu' );
function add_custom_menu(){
    add_menu_page( 'ブロックの管理', 'ブロックの管理',
    'manage_options', 'edit.php?post_type=wp_block', '', 'dashicons-admin-post', 21 ); 
}
```

ということで、言いたいのは先人は偉大です。
WebデザイナーがとりあえずVSCodeで入れてみた拡張機能

ガツガツ開発するにはちょっと本格的すぎる拡張機能はとりあえず必要に応じてインストールするとして、コーディングするにあたって必要そうな拡張機能。

##アイコンを付けてくれるvscode-icons

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365187/8d512745-91df-c2d7-fc06-e0ac5fd41fe2.png)

##余計なスペースを可視化してくれるTrailing Spaces

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365187/ae378c8c-7aef-7827-c40c-2d07da4b47f2.png)

##CSVファイルを見やすくしてくれるRainbow CSV
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365187/1dabee47-c159-39d8-0b8d-9ed983466e5c.png)

##コードの自動整形にPrettier - Code formatter

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365187/a8304428-bbeb-e65f-ee1f-2a777c497af7.png)

##パスの候補を出してくれる Path Autocomplete

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365187/da6db861-18ea-ca78-7cbd-30dc71377496.png)

##Git管理を楽に！GitLens
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365187/d815085a-7a3e-9eaf-b1ff-4172a071770a.png)

##Gitlogを見やすく！Git History
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365187/c8d9c563-10c6-a630-71f9-8bc5e5f6c603.png)

最初はこんなもので大丈夫かなと思った。
また必要そうな拡張機能があったら追加します。
Laravel8をノリで使ってみたらTarget class [◯◯Controller] does not existと表示された

今までLaravle6や７でアプリなどを作っていたが８にバージョンアップになったと聞いて早速８を使ってみたら、今まで見たことないエラーメッセージが表示されたのでここにメモとして残すことにした。

記述したコード
routes/web.php
<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/','BbsController@index');



App\Http\Controllers\BbsController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BbsController extends Controller
{
    //
    public function index(){
        return view('Bbs.index');
    }
}

いつもの通りこれで画面表示されるだろと思ったらまさかのTarget class [BbsController] does not exist.と表示された。

よくよく調べてみたらLaravel8からルーティングの書き方が変わったらしく以下のように修正したら正常に動作した


<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BbsController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', [BbsController::class,'index']);

どうやら作成したControllerのパスとルーティングの書き方を上のようにしないといけなくなったらしい。

まだまだLaravel８の変更点があるらしいので公式ドキュメントを見ようと思った。
高位合成言語アセンブラを作る。 その13

# 概要

高位合成言語アセンブラを作る。
sinテーブルメーカーを作った。
結果の浮動小数点をプロットするツールを作った。

# 写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a94f6153-8857-aa5b-6759-dad12b25801e.jpeg)


# 成果物

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

# プロットしたデータ。


```
00000000
3c8ef859
3d0ef2c6
3d565e3a
3d8edc7b
3db27eb6
3dd61305
3df996a2
3e0e8365
3e20305b
3e31d0d4
3e43636f
3e54e6cd
3e665992
3e77ba60
3e8483ee
3e8d2057
3e95b1be
3e9e377a
3ea6b0df
3eaf1d44
3eb77c01
3ebfcc6f
3ec80de9
3ed03fc9
3ed8616c
3ee0722f
3ee87171
3ef05e94
3ef838f7
3f000000
3f03d989
3f07a8ca
3f0b6d77
3f0f2744
3f12d5e8
3f167918
3f1a108d
3f1d9bfe
3f211b24
3f248dbb
3f27f37c
3f2b4c25
3f2e9772
3f31d522
3f3504f3
3f3826a7
3f3b39ff
3f3e3ebd
3f4134a6
3f441b7d
3f46f30a
3f49bb13
3f4c7360
3f4f1bbd
3f51b3f3
3f543bce
3f56b31d
3f5919ae
3f5b6f51
3f5db3d7
3f5fe714
3f6208da
3f641901
3f66175e
3f6803ca
3f69de1d
3f6ba635
3f6d5bec
3f6eff20
3f708fb2
3f720d81
3f737871
3f74d063
3f76153f
3f7746ea
3f78654d
3f797051
3f7a67e2
3f7b4beb
3f7c1c5c
3f7cd925
3f7d8235
3f7e1781
3f7e98fd
3f7f069e
3f7f605c
3f7fa62f
3f7fd814
3f7ff605
3f800000
```

以上。
Railsを使ったToDoリストの作成(7.CRUDのDelete機能)

#概要
本記事は、初学者がRailsを使ってToDoリストを作成する過程を記したものです。
私と同じく初学者の方で、Railsのアウトプット段階でつまづいている方に向けて基礎の基礎を押さえた解説をしております。
抜け漏れや説明不足など多々あるとは思いますが、読んでくださった方にとって少しでも役に立つ記事であれば幸いです。

#環境
* `Homebrew: 2.5.10` -> MacOSのパッケージ管理ツール
* `ruby: 2.6.5p114` -> Ruby
* `Rails: 6.0.3.4` -> Rails
* `node: 14.3.0` -> Node.js
* `yarn: 1.22.10` -> JSのパッケージ管理ツール
* `Bundler: 2.1.4` -> gemのバージョン管理ツール

```:iTerm
$ brew -v => Homebrew 2.5.10
$ ruby -v => ruby 2.6.5p114
$ rails -v => Rails 6.0.3.4
$ npm version => node: '14.3.0'
$ yarn -v => 1.22.10
$ Bundler -v => Bundler version 2.1.4
```

#第７章　CRUDのDelete(destroy)
第７章では、以下の機能を実装していきます。

* 削除機能（destroyアクション）

では、詳しく見ていきましょう。

##destroyアクション
今回は、destroyアクションを使って削除機能を実装していきます。
一覧表示画面から削除ボタンを押したら、本当に削除していいのかの確認が表示され、OKを押すと投稿が削除され、一覧表示画面に遷移するようにしていきたいと思います。

###1 コントローラ

コントローラには以下のように記述します。

```app/controllers/boards_controller.rb
def destroy
    board = Board.find(params[:id])
    board.destroy!
    redirect_to root_path, notice: 'Delete successful'
end
```

まず、削除する対象のboardを取得します。引数に`params[:id]`を指定することで、パラメータ経由で対象のboardのidを探し、オブジェクトを取得します。
その上で、ActiveRecordのdestroyメソッドを使って、対象のレコードをデータベースから削除し、削除した旨を伝えるFlashメッセージとともに一覧表示画面に遷移させます。

ポイントは２つあります。

* 今回はビューに渡さないため、インスタンス変数には代入していません。
* destroyメソッドに`!`を付けているのは削除されなかった場合に例外を発生させるためです。例外が発生したらそこで処理が止まりますが、destroyアクションでは確実にデータを削除して欲しいので、意図的に例外が発生する状況を作っています。

###2 ビュー
次に、一覧表示画面に削除するためのリンクを貼って、削除ボタンを押したら、本当に削除していいのかの確認が表示され、OKを押すと投稿が削除され流ようにしていきたいと思います。

```haml:app/views/index.html.haml
= link_to 'Delete', board_path(board), data: { method: 'delete', confirm: '本当に削除してもいいですか？' }
```

ここでのポイントは第３引数にdataを指定していることです。

| 記述 | 意味 |
|:-:|:-:|
| method: 'delete'  |  board_pathはデフォルトでGETリクエストが指定されているため、DELETEリクエストにする場合はこのように指定してあげる必要があります |
|  confirm: '本当に削除してもいいですか？' |  confirmでは確認表示を実装することができます。valueに指定した値が画面上に表示されます。 |

以上で、削除機能の実装は完了です。
VSCodeの日本語化

ついにAtomからVSCodeに乗り換えることにしました。
VSCodeをインストールしたあとの各種設定を備忘録として残しておこうと思います。

##日本語化するために
インストール直後は英語表記なので日本語化パッケージのインストールが必要です。
1. `command`+`shift`+`P`でコマンドパレットを開く
2. 「Configure Display Language」を選択（直接入力するとソートされて出てきます）
3. 「Install Additional Laugage」を選択。エクステンションの一覧が左側に出てきます。
4. 「Japanese Language Pack for Visual Studio Code」を選択。インストール
5. 画面右下に「Restart Now」と出るので押して再起動。

これで日本語化が完了します。
Elasticsearchのindexの引越し。Elasticdumpはlimitオプション再定義で高速処理。

# はじめに
Elasticsearch を docker を使って、ローカルマシンで使用している。
Elasticsearchのバージョンをあげてみたくなったので、データをDumpして引越ししてみることにした。

# 事前調査
2020/11/20現在、Googleを使って、「elasticsearch インデックス　移行」と調べてみると、Elasticdumpというスクリプトを使っているひとが多いようだ。

（以下、Googleの検索結果　表示される順に抜粋）


ElasticSearchのindexデータを移行する - Qiitaqiita.com › Node.js
https://qiita.com/taai/items/9244e7dc4dacf29ab95a


よく使うElasticSearchのクエリ（elasticdump） - Qiitaqiita.com › Elasticsearch
https://qiita.com/nakazii-co-jp/items/3199433d685d0600c6d6


Elasticsearchのデータをdumpしてコピーしたい - DRYな備忘録otiai10.hatenablog.com › entry › 2015/03/04
https://otiai10.hatenablog.com/entry/2015/03/04/152842


Elasticsearch 上のデータを割と簡単にダンプして他の ...inokara.hateblo.jp › entry › 2020/05/02
https://inokara.hateblo.jp/entry/2020/05/02/074402

...
..
.


elasticsearch-dump/elasticsearch-dump: Import and ... - GitHubgithub.com › elasticsearch-dump › el...
https://github.com/elasticsearch-dump/elasticsearch-dump

Qiita先輩方の記事の作成日が5年前であっったりしたが、githubは2020年に入っても頻繁にメンテナンスされているようだ。elasticsearchのバージョンは気にせず使えるのではないだろうか。
Google検索結果で表示される情報は、やや作成日が古いものもあることが気になったが、2020年もメンテされているなら使っても問題は少ないのではないか、と期待して、私もこの node.js スクリプトを使ってみることとした。


# 準備
elasticdump は、nodeスクリプトなので、マシンにnode実行環境が必要であった。私の環境ではすでにnode実行環境があるので npm install elasticdump　した（あとで気づいたのだがdockerもあるようだ。）。

# 実行1　（  dump output=json, input=elasticsearch/index )
事前調査のいずれの先輩たちも、「elasricdump --output ^^^ --input ~~~」と、インプットとアウトプットの指定だけでdumpをし、dumpをelasticsearchに読み込ませているので、そのまま真似してやってみたのだが・・・

ドキュメント数が1200万を超え、ストレージサイズが6GBを超えていた私のindexではjsonのdumpデータの出力完了までに**先輩たちと同じやり方では、２４時間かかった**。

    出力されたファイルのサイズ： 5302184689 byte

＜参考：マシン環境＞ intel i7-3770k, 16GB Memory, SSD 960GB
＜参考：docker Engine＞　v19.03.13
＜参考：docker resources＞ CPUs:4, Memory:5.50GB, Swap:2GB, Disk image size:59.6GB

# 振り返り1
そんなに時間かかるものなのか？
動作ログを見てみる・・・なるほど、objectを100ずつ扱っていたのか。
これ、もっと増やせないのか？

[elasticsearch-dump のGitHub](https://github.com/elasticsearch-dump/elasticsearch-dump)を読むと、設定オプションがあった。


    --limit
                    How many objects to move in batch per operation
                    limit is approximate for file streams
                    (default: 100)


よし、では、dumpしたJsonを新環境に書き込むにあたっては、「--limit」オプションを追加しよう。

# 実行2　（ dump output=elasticsearch/index, input=json ）
実行1の output　と　input のオプションの対象を入れ替え、　さらに limitオプションを付け足して実行する。いちどにあつかうオブジェクトの量を増やした効果を見てみた。limitの値をどの程度にするのが適切なのかわからなかったが、今回は なんとなく8000 とした。

**この設定では、処理時間は　１時間半弱　であった。　概算でも16倍ほど高速だ。**

# 振り返り2
limitの値を８０倍に設定して、処理時間は２４時間から１時間半へと16分の1になった。この程度の時間であれば、まだ個人利用のPCであっても我慢できる範囲だろう。まだどこかほかにボトルネックがあるのだろうが、このスクリプトで処理時間を変動させる要因のひとつはlimit値であることはまちがいない。次の機会があれば、さらにlimit値をあげてみたい。ただし、適切な値の決定方法がわからない。技術者の勘と経験で決めていいのだろうか。

# まとめ
Elasticsearchのデータ移行にあたり、[elasticdump](https://github.com/elasticsearch-dump/elasticsearch-dump)スクリプトを使った。inputとoutputのデータダンプの方向の違いはあるが、limitオプションの設定値をデフォルトの数十倍にして処理速度を比較した。その結果、**limitオプションの設定値を大きくすることで、処理時間を大幅に短縮できることがわかった**。
PHPのThread Safetyが有効になっているかを調べる

###### tags: `php`

PHPには，スレッドセーフ版とノンスレッドセーフ版というのがある．

TS版，NTS版とか，PHP TS, PHP NTSとか呼ばれたりもする．

自分の環境で有効になっているかを確認するには，`phpinfo()`の出力や，`php -i`の出力を確認すればよい

> phpinfo()の結果を見るとわかる。Thread Safetyの項がenabledならスレッド・セーフ版、disabledならノン・スレッド・セーフ版である。
https://clover.fcg.world/2017/03/19/8093/#toc1

## 確認方法

### linux

linuxで確認する場合は以下．

```
$ php -i | grep -i "thread safety"
Thread Safety => disabled
```

### windows

windowsで確認するためには powershell で以下のように発行する．

```
> php -i | Select-String -Pattern "Thread Safety"

Thread Safety => enabled
```

## 参考・関連リンク

- [What is thread safe or non-thread safe in PHP?](https://stackoverflow.com/questions/1623914/what-is-thread-safe-or-non-thread-safe-in-php)

この記事読んだのをきっかけに．スレッドセーフの有効/無効を調べようと思った．
Mac Linux 特定のディレクトリ直下の容量を確認する

# 目的

- MacやLinuxなどのBash実行環境で特定のディレクトリ直下の容量を確認するコマンドをメモ的に紹介する

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

# 紹介

1. 指定ディレクトリ直下の容量を確認するコマンドを下記に記載する。

    ```terminal
    $ du -sh 確認したいディレクトリパス
    ```
Railsを使ったToDoリストの作成(6.CRUDのUpdate機能)

#概要
本記事は、初学者がRailsを使ってToDoリストを作成する過程を記したものです。
私と同じく初学者の方で、Railsのアウトプット段階でつまづいている方に向けて基礎の基礎を押さえた解説をしております。
抜け漏れや説明不足など多々あるとは思いますが、読んでくださった方にとって少しでも役に立つ記事であれば幸いです。

#環境
* `Homebrew: 2.5.10` -> MacOSのパッケージ管理ツール
* `ruby: 2.6.5p114` -> Ruby
* `Rails: 6.0.3.4` -> Rails
* `node: 14.3.0` -> Node.js
* `yarn: 1.22.10` -> JSのパッケージ管理ツール
* `Bundler: 2.1.4` -> gemのバージョン管理ツール

```:iTerm
$ brew -v => Homebrew 2.5.10
$ ruby -v => ruby 2.6.5p114
$ rails -v => Rails 6.0.3.4
$ npm version => node: '14.3.0'
$ yarn -v => 1.22.10
$ Bundler -v => Bundler version 2.1.4
```

#第６章　CRUDのUpdate（edit／update）
第６章では、以下の機能を実装していきます。

* 編集画面（editアクション）
* 編集画面で入力された情報をデータベースに保存する機能（updateアクション）

では、詳しく見ていきましょう。

##1 editアクション
まずは、editアクションを使って編集画面を実装していきます。
一覧表示画面から編集ボタンを押したら、編集画面に遷移できるようにしたいと思います。

###1 コントローラ

コントローラには以下のように記述します。

```app/controllers/boards_controller.rb
def edit
    @board = Board.find(params[:id])
end
```

editアクションでは、登録済みのフォーム画面を予め表示できるように、URLに含まれているタスクのidをパラメータから受け取り、それを使ってデータベースから対象のオブジェクトを取得します。

###2 ビュー

ビューでは、まず編集フォームを作成します。
フォームはnew.html.hamlで作成したものとほぼ同じ内容です。

```haml:app/views/edit.html.haml
.container
  %h2.form_title Edit Board
  = form_with(model: @board, local: 'true') do |f|
    %div
      = f.label :title, 'Name'
    %div
      = f.text_field :name, class: 'text'
    - if @board.errors.include?(:name)
      %p.error=@board.errors.full_messages_for(:name).first
    %div
      = f.label :description, 'Description'
    %div
      = f.text_area :description, class: 'text'
    - if @board.errors.include?(:description)
      %p.error=@board.errors.full_messages_for(:description).first
    %div
      = f.submit :Submit, class: 'btn-primary'
```

次に、一覧表示画面に編集画面へ遷移することができるようリンクを貼ります。

```haml:app/views/index.html.haml
= link_to 'Edit', edit_board_path(board)
```

以上で、編集画面の実装は終了です。

##2 updateアクション

編集画面から入力されたデータを使ってデータベースを更新するためにupdateアクションを実装していきます。

### コントローラ
コントローラに以下のように記述します。

```app/controllers/boards_controller.rb
def update
    @board = Board.find(params[:id])
    if @board.update(board_params)
        redirect_to board_path(@board), notice: 'Update successful'
    else
        flash.now[:error] = 'Could not update'
        render :edit
    end
end
```

Board.findで更新したいboardを取得します。
ActiveRecordのupdateメソッドを実行し、編集したインスタンスをデータベース保存します。

editアクションとupdateアクションの内容や関係性は、新規登録機能のnewアクションとcreateアクションに似ているため、Createの記事を参考にしてください。

以上で、編集機能の実装は完了です。
ユニコード文字列 ― J 言語入門

*jconsole の Windows 版では REPL でユニコードを利用できません。*この記事は JQt / JAndroid の使用を前提にしています。

# ユニコード

ユニコードは、世界中の全ての文字に番号 (コードポイント) を割り当てて、ロケールや OS に依存しない 一つの文字集合を定めたものです。

J では、文字列はユニコードを用いて表現されますが、3 種類のエンコーディングがサポートされています。一つのコードポイントを何バイトで表すかが異なります。

|エンコーディング|バイト / コードポイント|
|---|---|
|UTF-8|1-4 (可変長)|
|UTF-16|2 (サロゲートペア [^1] : 4)|
|UTF-32|4|

# リテラル (UTF-8)

文字列リテラルの型は、literal です。

```j
   datatype'abcde'
literal
```

文字列リテラルには、ASCII 範囲外の文字も含むことができます。文字は **UTF-8** でエンコードされます [^2]。

```j
   #'あ'    NB. 'あ' は 3 バイト
3
   a. i. 'あ'
227 129 130
   '寿司🍣'
寿司🍣
```

文字列 (literal) の長さは**バイト数**で数えるので、「1 文字」の つもりでも 2 バイト以上の文字ならリストになります。

```j
   $'a'     NB. 文字 (atom)

   $'あ'    NB. 文字列 (list)
3
```

literal は、正確には文字列ではなく**バイト列**を表すので、任意のバイナリデータを格納できます。そのため、値の範囲 (精度) に言及する場合は、byte と呼ぶことがあります。

# UTF-16

`u:` (monad) を使うと、UTF-16 の文字列を生成できます。UTF-16 文字列の型は unicode です。

```j
   NB. A(U+0041) あ(U+3042)
   a=: u:16b0041 16b3042
   a
Aあ
   #a
2
   datatype a
unicode
```

一部の漢字や絵文字を表すには、サロゲートペアを使います。

```j
   u:16bd842 16bdfb7    NB. U+20BB7
𠮷
   #u:16bd842 16bdfb7
2
```

# UTF-32

`u:` (dyad) を使うと、UTF-32 へ変換することができます。型は unicode4 です。

```j
   a=. 10 u: 16b0041 16b3042 16b20bb7
   a
Aあ𠮷
   #a
3
   datatype a
unicode4
```

コードポイント単位で文字を扱いたい場合に便利です。

# 相互変換

UTF-8, UTF-16, UTF-32 およびコードポイントの数値は、相互変換が可能です。変換には、前述の `u:` (dyad) を使います。

`x u: y` と書いたとき、`x` の値によって変換の種類が変わります。

|`x`|`y`|変換後|
|---:|---|---|
|2|UTF-8 &#x7c; UTF-16 &#x7c; UTF-32|UTF-16|
|3|UTF-8 &#x7c; UTF-16 &#x7c; UTF-32|integer|
|4|integer \[16b_10000, 16bffff\]|UTF-16|
|8|UTF-8 &#x7c; UTF-16 &#x7c; UTF-32 &#x7c; integer \[0, 16b10ffff\]|UTF-8|
|10|UTF-8 &#x7c; UTF-16 &#x7c; UTF-32 &#x7c; integer \[0, 16b10ffff\]|UTF-32|

ちなみに、monad の `u: y` は、

- `y` が数値のとき `4 u: y`
- それ以外の場合 `2 u: y`

と同じ変換になります。

---

\[ 前 : [数学関数](https://qiita.com/unsigned-wrong-wrong-int/items/7be9576316e42221105a) \] \[ [目次](https://qiita.com/unsigned-wrong-wrong-int/items/e15a87999cedfc6b9ced) \] \[ 次 : [シンボル](https://qiita.com/unsigned-wrong-wrong-int/items/174cab8807feb3ac5584) \]

[^1]: 2 バイト整数で表しきれない文字は 2 つの整数のペアで表されます。
[^2]: ただし、jconsole では文字コードは OS に依存します。
homebrewでインストールしたパッケージ全部削除する

使用していたMacBook Proを他の人に譲渡する必要があり、その際なるべくクリーンアップしてから譲渡したいものですが、アプリ関連`/Applications`以下の不要なアプリをアンインストールしても、まだ使用済み領域がだいぶ残っていたので、思い当たる領域をいくつか探していました。

その一つとして、Macを開発環境としても利用していたため、アプリ一覧には出てこないhomebrewでインストールしたパッケージ(Formula)などが残っているのを思い出しました。

そこで、思い切ってここも全部削除することにしました。


# インストール済みパッケージの削除

`brew install`でインストールしたパッケージは`uninstall`、`remove`または`rm`のサブコマンドで削除できます。よく使われる系の単語でエイリアスされてて便利。

```shell
brew uninstall  <パッケージ名>
```

または

```shell
brew remove <パッケージ名>
```
`<パッケージ名>` は任意のパッケージ名を入れますが、ここは複数一括で指定可能です。


# インストール済みパッケージを取得

上記で削除方法は分かりました。では何のパッケージがインストールされていたかを取得するには`list`サブコマンドを利用します。

```shell
brew list
```

これでインストール済みパッケージが一覧で表示されます。
`list`の結果は、単純にインストール済みパッケージ名のみが羅列されるのでこの結果をそのまま使用することができます。

```
adns			gh			libass			lzlib			python@2
aom			giflib			libassuan		lzo			python@3.7
apr			git			libbluray		mas			python@3.8
apr-util		git-flow		libev			mcrypt			python@3.9
argon2			git-lfs			libevent		mhash			rav1e
aspell			glib			libffi			mosh			readline
augeas			gmp			libgcrypt		mysql			rtmpdump
autoconf		gnupg			libgpg-error		ncurses			rubberband
aws-sam-cli		gnutls			libidn			nettle			sdl2
bdw-gc			go			libidn2			nghttp2			snappy
brotli			gobject-introspection	libksba			nginx			speex
...
```



# ワンライナーで削除する

上記を組み合わせて、下記のコマンドで全パッケージを一括削除できます。

```shell
brew uninstall --force $(brew list)
```
`--force`オプションを指定しているのは、1つのパッケージで複数バージョンを含む際に、パッケージに含まれる全バージョンを削除するためです。`--force`または`-f`を付けず実行し、上記のケースに該当する場合はその旨の警告が出ます。


# 削除実行時の注意点

## 必ずインストール時のユーザーで

`brew`コマンドでインストールしたユーザーの権限で実行する必要があります。
他のユーザーで実行すると、権限の関係でエラーとなり、削除に失敗します。

# homebrew含め全部削除する

実はこんなことしなくても[公式アンインストーラーが用意されている](https://github.com/homebrew/install#uninstall-homebrew)ので、それを利用するだけでも良かったりします。

```shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh)"
```
一部パーミッションの関係や他のアプリケーションからのインストールなどで、素直に削除できないこともありますが、それらもすべてリストアップして教えてくれます。
それをみて一つ一つ確認して削除すれば綺麗にクリーンアップできます。
ディレクトリ内の拡張子の集計をする

# ディレクトリ内のファイルを拡張子で集計
めったに使う機会は無いと思いますが、必要になって書きました。
M-x 等で起動しディレクトリ名を入れて実行するとスキャンして結果を別ウィンドウに表示します。
アクセスできないディレクトリは含まれません。

```emacs-lisp:sample
M-x ext-count
```


プレフィクスで再帰します。

```emacs-lisp:sample
C-u M-x ext-count
```


```emacs-lisp:ext-count.el
(defvar ext-count-system-type '(windows-nt) "*Filename case insensitive system type.")

(defun ext-count-case (str)
  (if (member system-type ext-count-system-type)
      (downcase str)
    str))

(defun ext-count-loop (dir plst &optional recurse)
  "DIR 内ファイルの拡張子集計. PLST に格納する変数を指定.
RECURSE が NON-NIL ならディレクトリの中も再帰的に調べる."
  (let ((files (if (consp dir)
                   dir
                 (directory-files dir t "/?[^.][^.]?\\'")))
        message-log-max)
    (dolist (f files plst)
      (let* ((att (file-attributes f))
             (ext (file-name-extension f))
             (ext (and ext (intern (ext-count-case ext))))
             elm)
        (cond
         ((and recurse att (car att)
               (file-accessible-directory-p f))
          (message "Scan %s..." f)
          (setq plst (ext-count-loop f plst recurse)))
         (ext
          (if (setq elm (plist-get plst ext))
              (setq plst (plist-put plst ext (1+ elm)))
            (setq plst (plist-put plst ext 1)))))))))

;;;###autoload
(defun ext-count (dir prefix)
  "DIR 内の拡張子を集計して HELPウィンドウに表示する.
PREFIX 在りだと再帰して調査."
  (interactive "DDirectory: \nP")
  (let (plst result)
    (setq plst (ext-count-loop dir plst prefix))
    (while plst
      (setq result (cons
                    (cons (car  plst) (cadr plst))
                    result))
      (setq plst (cddr plst)))
    (setq result (sort result #'(lambda (a b) (string< (car a) (car b))))
          result (sort result #'(lambda (a b) (> (cdr a) (cdr b)))))
    (with-help-window "*ext-count*"
      (princ (format "%s\n" dir))
      (dolist (a result)
        (princ (format  "%-5s %5d\n" (car a) (cdr a)))))))

(provide 'ext-count)
```
DjangoでMixinを使って、自分のプロフィールのみ編集できるようにする

# 概要
- プロフィール編集画面のViewを作成する際に、`自分のプロフィールのみアクセス可能とするMixin` と `クラスベース汎用ビュー` を継承したクラスを作成する

# Mixinとは

- あるクラスと直接は関連しない処理をまとめたもの
- 多重継承で、他のクラスに機能を追加できる


# django.contrib.auth.mixins を使う

- ログイン認証関連のMixinが、`django.contrib.auth.mixins` にまとめられている
- 今回は、「ログイン済みまたはsuperuser」という条件にしたいため、`UserPassesTestMixin` クラスを利用する
    - [公式サイトの「Djangoの認証システムを使用する」の「class UserPassesTestMixin」](https://docs.djangoproject.com/ja/3.1/topics/auth/default/#django.contrib.auth.mixins.UserPassesTestMixin)を参照
    - `test_func` 関数に、成否判定を実装する


# 実装(各ファイルの変更)

## urls.py への追加
```python
    path('detail/<int:pk>/', UserDetailView.as_view(), name='member_detail'),
    path('update/<int:pk>/', UserUpdateView.as_view(), name='member_update'),
```


## views.py への追加

- (ユーザ種別ごとに入力項目を変えたいので、Form関連の記述は別途記載予定)

```python

from django.contrib.auth.mixins import UserPassesTestMixin
from django.views.generic import DetailView, UpdateView


class OnlyYouMixin(UserPassesTestMixin):
    raise_exception = False     # set True if raise 403_Forbidden

    def test_func(self):
        user = self.request.user
        return user.pk == self.kwargs['pk'] or user.is_superuser


class UserDetailView(OnlyYouMixin, DetailView):
    model = CustomUser
    template_name = 'account/detail.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        pass  # 必要に応じて処理を追加
        return context


class UserUpdateView(OnlyYouMixin, UpdateView):
    model = CustomUser
    template_name = 'account/update.html'

    def get_success_url(self):
        return resolve_url('member_detail', pk=self.kwargs['pk'])

```

## テンプレートの追加
- 上記のviews.pyで指定した位置にテンプレートを配置
- ヘッダー部に、プロフィール表示へのリンクを表示

```html

            <li class="nav-item"><a class="nav-link" href="{% url 'member_detail' user.pk %}">Show Profile</a></li>
```



# 参考

- [Python実践入門, 陶山嶺 著, 技術評論社](https://gihyo.jp/book/2020/978-4-297-11111-3)
    - `6.4 クラスの継承` にMixinについて書かれています

- [Djangoで、ユーザー情報閲覧・更新ページ](https://blog.narito.ninja/detail/43)

- [DjangoのUserPassesTestMixinを使って柔軟にアクセス制御する](https://qiita.com/chanyou0311/items/31a4380d11c904563c86)

# 参考その２
- ビューごとに継承させるのではなく、`middleware` を作成して、指定した画面以外はログイン必須にする方法もあります。

    - [【Django】サイトを一括でログイン必須にさせる方法](https://tsukasa-blog.com/programming/django-loginrequiredmiddleware/)
途中でDBを変更する方法

gemにある既存のDBを変更

```
$ bundle install
```
↓
config/database.ymlにある既存のDBを変更
↓

```
$ rake db:create
$ rake db:migrate
```

```
== 20201120000030 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.1683s
== 20201120000030 CreateUsers: migrated (0.1690s) =============================

== 20201120004112 AddIndexToUsersEmail: migrating =============================
-- add_index(:users, :email, {:unique=>true})
   -> 0.1129s
.
.
.
.

```

完了。



一言: gemファイルだけ変更すればいいと思っていました。database.ymlも変更する必要があると知りました。

参考:
https://stackoverflow.com/questions/52477636/gemloaderror-error-loading-the-sqlite3-active-record-adapter
https://qiita.com/pchatsu/items/a7f53da2e57ae4aca065
新規登録画面か編集画面かにより、ビュー表示を変更する方法

ビュー作成時、新規登録画面と編集画面のレイアウトがほぼ同じになることはよくあると思います。

その場合、「_form.htm.erb」などで共通フォームを作成し、同時に編集をかけれるようにするかと思います。

ただ、ボタン名が新規の時は「登録する」、編集の時は「編集する」といった細かい所が異なる時があります。

その時は、以下のような記述をします。(itemモデルのビュー編集とします)

```ruby:_form.htm.erb
    <% if request.path_info == new_item_path %>
      <%= f.submit "記録する" %>
    <% else %>
      <%= f.submit "編集する" %>
    <% end %>
```

このように記述をすることで、新規のリクエストの時は「登録する」、それ以外（編集リクエストの時）は、「編集する」と表示されます。
M1チップ(Apple Silicon)搭載のMacでCocoaPodsが動かない時の対応

## 環境
- Mac mini (M1, 2020)
- macOS Big Sur 11.0.1

## どうした
なんかM1のmac mini買ったんだけど、pod installがうまくいかない

## どういうこと
CocoaPodsで使用してるffiがarmアーキテクチャに対応してないからダメらしい

## 対応方法

ターミナルをRosseta経由で起動してCocoaPodsをセットアップする

- Macのユーティリティフォルダに入ってある「ターミナル.app」を右クリックして「情報を見る」を選択
- 「一般情報」の項目の下にある「Rossetaを使用して開く」にチェックを入れる
- ターミナルを起動していたら終了して起動し直す

CocoaPodsセットアップ

```bash
$ sudo gem install cocoapods
```

ffiも入れる

```bash
$ sudo gem install ffi
```

これでpod installなり出来るようになった

## 参考

- https://stackoverflow.com/questions/64901180/running-cocoapods-on-apple-silicon-m1