OmniAICreator/Qiita-1.07M huggingface dataset:
【Android/Java】srcとbackgroundの違い

## ImageViewやImageButtonで画像リソースを設定するときに用いる

基本的には`background`でリソースを指定していたが、他人の実装ソースでは`src`を使用していたので把握している限りの違いを確認する。

[Stack Overflow](https://stackoverflow.com/questions/5454491/what-is-the-difference-between-src-and-background-of-imageview)で同じ質問がヒットしたのだがそこから抜粋すると

## background指定
- リソースのオリジナルサイズ関係なしに指定したwidthとheightに調整される

```
<ImageButton
    android:id="@+id/button"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:background="@drawable/resource_button"/>
```

![スクリーンショット 2021-04-25 16.40.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357040/eca917be-b4e6-9b72-2fe4-487242da98e2.png)

※実際の細かい調整は省略


## src指定
- リソースのオリジナルサイズで表示される

```
<ImageButton
    android:id="@+id/button"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:src="@drawable/resource_button"
    android:background="#00000000"/>
```

![スクリーンショット 2021-04-25 16.41.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357040/ff12b40e-be61-4800-9c97-aaed24150722.png)

※実際の細かい調整は省略

この場合だと、縦横は60dpで指定しているもののリソースサイズはそれより大きいため途中で切られてしまう。もしbackgroundの時のようにサイズ調整したい場合は`android:scaleType="fitCenter"`を指定するとOK

Stack Overflowに戻るが
>The src to an ImageView has additional features:
>
>- different scaling types
>- adjustViewBounds for setting bounds to match image dimensions
>- some transformations such as alpha-setting

とあるように、srcの方が様々な設定ができる様子。


またbackgroundは動的に変えることができ、Javaだと

```
private ImageView view;
/*
 *  中略
 */

view.setBackgroundResource(R.drawable.resource_button); //画像リソースを指定する場合

Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.btn, null);
view.setBackground(drawable);     //drawableファイルを設定する場合

view.setBackground(null);   //リソースをクリアする場合
```

と変えられるが、レイアウトファイルでsrc指定すると上の処理を実行しても反映されない。background指定内容の前面にsrc指定内容が表示されている様子。

以下はbackgroundを黒色指定して、srcにリソースを指定した場合。


```
<ImageView
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:src="@drawable/ic_launcher_foreground"
    android:background="@color/black"/>
```
![スクリーンショット 2021-04-25 18.12.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1357040/532b1884-c509-9adc-7c00-a6ee414fd1de.png)



## 結論
- オリジナルリソースの縦横の比率を維持したいならsrc指定がベスト
- 動的に変えたいならbackground指定(src指定したリソースを動的に変える方法があるのか不明)


## 試した環境
- Android Studio4.1.2
- Android10
deviseを使った複数モデルログイン実現後の他のモデルの扱い

# 記事の目的

railsのgemである`devise`はユーザー登録機能を実現するために使用されている最もポピュラーなライブラリの一つかと思いますが、
アプリケーションを作成する上で複数モデルログインをしたいと考える場合もあるかと思います。
(よく見るのは管理者と一般ユーザーを切り分けるタイプのものですかね。)

今回はdeviseを活用した複数モデルログインを実現した後、他のモデルをどのように紐付けていくのかをまとめました。

# 本論

## 複数モデルログイン

この記事は複数モデルログインの機能自体は実現した前提での内容となります。
複数モデルログイン機能の構築には、勝手に引用してしまい恐縮ですが、良記事がございますので下記ご参考いただければ。
http://freecamp.life/rails-devise-admin1/

## 筆者のケース

私は現在日本にいる外国人が日本でチューターを探すためのマッチングアプリのようなものを作っています。
そのため「外国人」と「チューター」としての会員登録、ログイン機能をつけています。
なのでコントローラーの構成は

```
app
 |- controller
     |- foreigner #(外国人)
     |- tutor #(チューター)
```
となっており、ルーティングは

```
devise_for :foreigners, skip: :all
  devise_scope :foreigner do
    get 'foreigners/sign_in' => 'foreigners/sessions#new', as: 'new_foreigner_session'
    post 'foreigners/sign_in' => 'foreigners/sessions#create', as: 'foreigner_session'
    delete 'foreigners/sign_out' => 'foreigners/sessions#destroy', as: 'destroy_foreigner_session'
    get 'foreigners/sign_up' => 'foreigners/registrations#new', as: 'new_foreigner_registration'
    post 'foreigners' => 'foreigners/registrations#create', as: 'foreigner_registration'
    get 'foreigners/password/new' => 'foreigners/passwords#new', as: 'new_foreigner_password'
  end
  devise_for :tutors, skip: :all
  devise_scope :tutor do
    get 'tutors/sign_in' => 'tutors/sessions#new', as: 'new_tutor_session'
    post 'tutors/sign_in' => 'tutors/sessions#create', as: 'tutor_session'
    delete 'tutors/sign_out' => 'tutors/sessions#destroy', as: 'destroy_tutor_session'
    get 'tutors/sign_up' => 'tutors/registrations#new', as: 'new_tutor_registration'
    post 'tutors' => 'tutors/registrations#create', as: 'tutor_registration'
    get 'tutors/password/new' => 'tutors/passwords#new', as: 'new_tutor_password'
  end
```

となっております。

## 別のモデルの追加

ここからは別のモデルを追加する方法について説明していきます。
今回は、外国人登録したユーザーが、チューターとのマッチング希望を出すためのモデルを作成していきます。

### モデル作成

ここでは`need`モデルというものを作成します。
モデルの作成は特段代わりはなく、

```
rails g model need
```

でOKです。
その後のマイグレーションファイルやモデルファイルのバリデーション/アソシエーション等の設定も普通通り行っていきます。

### コントローラー作成

さてここからが本題です。
今回は`foreigner`に紐づくモデルだったので、コントローラーはforeignerコントローラーフォルダの中に作成していきます。
下記の通りコマンドを打ち込んでください。

```
rails g controller foreigners/needs
```

すると`app/controller/foreigners`の下に`needs_controller.rb`が作成されるかと思います。

ファイルの中身はこんな感じで作成されるはずです。Foreignersの中のNeedsControllerという内容になっていますね。

```
class Foreigners::NeedsController < ApplicationController

(略)

end

```

### ルーティング

続いてルーティングです。
ルーティングに関してはforeignerの名前空間の中で設定していきたいので、

```
(略)
  namespace :foreigners do
    resources :needs
  end
```

を追記します。

こうすることでdeviseを活用した複数モデルログイン機能と、それに紐づいたモデルの設定が完了です。

あとはアクションなりviewの設定をよしなにやっていけばOKです！
※viewも`app/views/foreigners`の下に`needs`ディレクトリが生成されているので、そこにファイルを作成していきましょう。


ご指摘等ございましたらコメント頂けると幸いです！！！
Address already in useの理由

# 環境
WSL2
dockerをインストールした

# 再現方法

```
sudo apt install nginx -y
nginx
```

このようなエラーが発生し、nginxが起動しない。

```
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
```

# 原因

dockerをインストールしていたためかな？

```
***:~$ nslookup 127.0.0.1
1.0.0.127.in-addr.arpa  name = kubernetes.docker.internal.
```
OculusQuest2 の隠し機能の Paththrough Portal を試す方法

Oculus Qeust 2 の一部だけを Paththrough する隠しオプションです。
gif だとだいぶ醜いですが、通常の Paththrough ぐらいには見ることが可能です。

![paththrough.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/d5b692cc-80d4-d9c2-3ac3-076ec76b69ae.gif)

# 前提
* Oculus Qeust 2 が開発者モードにしていること
* Oculus Quest 2 の OS バージョン v27
    * 25, 26 でも可能かもしれません

# 手順
1. [https://github.com/basti564/vrLauncher/releases/tag/v1.2](vrLauncher) をダウンロードします
2. apk をインストールします。Side Quest 経由でも adb install でもどっちでも大丈夫です。
3. アプリを起動します。
4. アプリの画面にドロップダウンがあるので、そこから `PASSTHROUGH_PORTAL` を選択します。
5. 再起動を求められたら、再起動します。
6. 再起動後から一部が Paththrough されちているところが確認できると思います。
【JavaScript】Array.lengthの不可解な挙動

# 問題
突然ですが以下のlengthの値ってどうなると思いますか？

```js
const array = [];
array['book'] = 'santai';
console.log(array); // [ age: 'santai']
console.log(array.length); // …？
```
ぜひ、ちょっと考えてみてください。

![think.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612354/2f8cbc89-f2de-8e34-a414-5d4f50a9832a.png)

答えは**0**です。
筆者はundefinedだと思ったのですがJavaScriptの仕様では0になるようです。他にも1になるのではと考えた人もいるんじゃないでしょうか？

最初から処理を追って行ってみましょう。
まずJavaScriptでは配列にプロパティを追加することができてしまうみたいです。

```js
array['book'] = 'santai';
console.log(array); // [ age: 'santai']
```

この時点で配列は連想配列に変化すると思っていたのですが、どうやら配列のままのようです。

```js
console.log(Array.isArray(array)); // true
```

もしも配列が連想配列に変化していたのなら、lengthプロパティを呼び出すとundefinedが返ってくるはずです。

```js
const obj = {};
console.log(obj.length); // undefined
```

配列のままなので正常にlengthプロパティを呼び出すことができ、答えは**1**になる……と思いきや帰ってきたのは**0**。

```js
console.log(array.length); // 0
```

どうやらlengthは配列内に数値以外のキーがあった場合、それを検知できないみたいです。

```js
const array = [];
array['book'] = 'santai';
array.push(1)
console.log(array); // [ 1, book: 'santai' ]
console.log(array.length); // 1
```

MDNを漁ってみたのですがこのような仕様について記述してある項目は見つからず……。どなたか詳しく書いてある文献をご存知でしたら教えてくださいませ<(_ _)>

# 解決策
解決策としては`Object.keys()`を使えば期待するような結果が得られます。

```js
const array = [];
array['book'] = 'santai';
console.log(array); // [ age: 'santai']
console.log(Object.keys(array).length); // 1
```

```js
const array = [];
array['book'] = 'santai';
array.push(1)
console.log(array); // [ 1, book: 'santai' ]
console.log(Object.keys(array)); // [ '0', 'book' ]
console.log(array.length); // 2
```

# 追記（2021/04/29）
@htsign さんがこの現象について腑に落ちる説明をしてくださいました。
@lhankor_mhy さんが他の例を紹介してくださいました。
ぜひコメントにも目を通して頂ければと思います。

# 参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/length
AIは、数学（算数？）の文章題がどの程度解けるのか？

# AIは、数学（算数？）の文章題がどの程度解けるのか？
「AIは、数学（算数？）の文章題がどの程度解けるのか？」について、全く、知らなかったので、少し、ぐぐってみた。
math word problem ( MWP) について。
かなり、雑な調査です。

# 調査結果
以下の論文に問題の例示があった。
これは、**Ape210K** というデータセットのものらしい。

https://arxiv.org/abs/2009.11506
Ape210K: A Large-Scale and Template-Rich Dataset of Math Word Problems

|問題|
|:---|
|ニワトリとウサギが同じ檻の中にいて、全部で274フィート(足の数）あります。仮に、ウサギよりニワトリの方が23匹多いとすると、ケージの中には何匹のニワトリがいるでしょう|

上記、答えは、61です。（**是非、一度、ご自分で解いて下さい。小学3年生あたりのレベル？**）

前提は、わかりませんが、以下のような正解率があった。
想像になりますが、上記のような問題が、解けたり、解けなかったりするよう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/0112aefc-2b8c-c801-a2c2-0c85bbd21ee6.png)

# 感想
非常に雑な感想としては、<font color="orange">**まだ、文章題とかは、難しいんだな。。。**</font>という印象。
将棋が強かったりする一面との距離感がある。
また、翻訳とかが超レベルが高いときとの印象とも差がある。
上記の数学の文章題は、問題のための問題というノリがあり、これらを学習させるのその枠内では利口になるだろうけど、本質的には、それほど、意味はない感じはします。一歩、一歩の検討の材料にはなると思いますが。。。

# まとめ
特にありません。
ちょっと、まだまだな一面を体感？しました。
AIに対して、バランスの良い印象を持つ必要があると感じました。
pkg_resources.VersionConflictエラー対処法



pipenvでパッケージをインストールしたときに`Resolving dependencies...`が終わらず、`✘ Locking Failed! `とでて、最終的に`pkg_resources.VersionConflict`のエラーが出る場合の対処法

今回は、`pipenv install pyyaml`を実行しておこった。

エラー文では
以下のようになっていたのでパッケージ同士の依存関係でエラーが起こっているよう

`importlib-metadata<3,>=0.12; python_version < "3.8"')`

```
$ pipenv install hogehoge
```

```
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
Building requirements...
Resolving dependencies...
✘ Locking Failed! 
...

（中略）

...
pkg_resources.VersionConflict: (importlib-metadata 3.10.0 (..., Requirement.parse('importlib-metadata<3,>=0.12; python_version < "3.8"'))
```

### 解決法

Lockファイルを作成する時点でエラーが起きているので、`--skip-lock`オプションをつけて以下のようにする

```
$ pipenv uninstall importlib-metadata --skip-lock
$ pipenv install myyaml
```

この解決方法でとりあえず大丈夫だったのですが、正解かどうかは不明
VS Code，latexmkを使ってビルドしたときのエラーを回避する

VS codeのlatex-workshopプラグイン，標準ではlatexmkがビルドに割り当てられている（緑色の三角とかショートカットとか）。

ただ，日本語の文字が入っているとエラーになる（少なくともWindowsでは）。

latex-workshopの設定（settings.json）を下記のように少しいじる。
![latexmk_settings](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1377901/ad2edb09-addb-1302-a140-a070160edddc.png)
"-cd"を追加して（カレントディレクトリで実行），%DOC%を%DOCFILE_EXT%に変更する（フルパスではなく拡張子付きファイル名を指定）。

意外と簡単にエラーが修正できた！

ちなみにpdflatexでもbxjsarticleとかを使えば日本語が通るので.latexmkrcは

```

#!/usr/bin/env perl
$pdf_mode = 1
```

だけで使ってます。
URIの理解

# URI(Uniform Resource Identifier)
あらゆるリソースを識別するための記述方法を**URI(Uniform Resource Identifier)**と呼ぶ。URIは、コンピューターが扱うリソースに限らず、人や会社、書籍など、あらゆるリソースを示すことができる。
URIはスキームと呼ばれる識別子で始まり、続いて「:」で区切って各スキームごとに定められた表現形式で記述される。
### URL(Uniform Resource Locator)
URIのうち**リソースが存在する場所を示すもの**を**URL(Uniform resource Locator)**と呼ぶ。URLにはリソースの場所を示すほか、リソースの取得方法が記述されており、Webサイトの場所を示す際に利用される。
### URN(Uniform Resource Name)
URIのうち**場所は問わずにリソースの名前を示すもの**を**URN(Uniform Resource name)**と呼ぶ。書籍を一意に特定し識別するためのISBNコードなどを使ってURNを記述できる。
## リクエストURI
HTTPにおいても、リソース特定のためにURIが利用されている。HTTPリクエストの場合、URIはリクエスト行のメソッドに続いて記述され、「**リクエストURI**」とも呼ばれる。
リクエストURIにはURIを全て含める**絶対URI形式**と、URIの一部（パス名のみ）を含める**相対URI形式**があり、通常は記述を簡略化した相対URI形式で記述される。
HTTPリクエストがプロキシサーバーを経由する場合は絶対URIが利用される。

```絶対URIでの表記
GET http://example.com/news/index.html HTTP/1.1
```

```相対URIでの表記
GET /news/index.html HTML/1.1
```

## パーセントコーディング
URIで利用できる文字は定められており、「予約文字（!、#、$などの記号）」と「非予約文字（半角英数字など）」が存在する。
予約文字は特定目的で用いいるために予約されている文字で、その目的以外ではURIに使用できない。非予約文字は数字やアルファベットなど自由にURIに使用できる文字を指す。
この２つに当てはまらない文字（日本語など）をURIで利用する場合は「**パーセントコーディング**」という方法で文字を変換する必要がある。「％」に続けて、表記できない文字の文字コードを１６進数で表し、「％xx」(xxは１６進数)の形式に変換する。
# 参考
[イラスト図解式 この一冊で全部わかるWeb技術の基本](https://www.amazon.co.jp/gp/product/B06XNMMC9S/ref=ppx_yo_dt_b_d_asin_title_o05?ie=UTF8&psc=1)
Flutter Containerに背景色をつける方法

#Containerに背景色をつけるには？
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/QmnxSmQf1f">pic.twitter.com/QmnxSmQf1f</a></p>&mdash; 高卒プログラマーげんと (@gento34165638) <a href="https://twitter.com/gento34165638/status/1386249510410604544?ref_src=twsrc%5Etfw">April 25, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

動画のように、背景色がテキストの色と被ってる場合は非常に読みにくくなる。。。

```dart
// 省略
 final routeArgs =
        ModalRoute.of(context).settings.arguments as Map<String, Object>;
    final selectedMovie = routeArgs;
    final backdropPath = selectedMovie['backdropPath'];

// 省略

 SliverAppBar(
              expandedHeight: 250,
              flexibleSpace: FlexibleSpaceBar(
                title: Container(
                  padding: EdgeInsets.symmetric(horizontal: 20, vertical: 2),
                  child: Text(
                    selectedMovie['title'],
                  ),
                ),
                background: Image.network(
                  'https://image.tmdb.org/t/p/w780/${backdropPath}',
                  fit: BoxFit.fitHeight,
                ),
              ),
            ),
```


なので`Container`に背景色をつけたい。
でも`Container`は`backgroundColor`のプロパティ？を持っていない！

さてどうしようか。。


#BoxDecorationを使う

```dart
// 省略
 final routeArgs =
        ModalRoute.of(context).settings.arguments as Map<String, Object>;
    final selectedMovie = routeArgs;
    final backdropPath = selectedMovie['backdropPath'];

// 省略

 SliverAppBar(
              expandedHeight: 250,
              flexibleSpace: FlexibleSpaceBar(
                title: Container(
                  decoration: BoxDecoration(color: Colors.black), // 追加
                  padding: EdgeInsets.symmetric(horizontal: 20, vertical: 2),
                  child: Text(
                    selectedMovie['title'],
                  ),
                ),
                background: Image.network(
                  'https://image.tmdb.org/t/p/w780/${backdropPath}',
                  fit: BoxFit.fitHeight,
                ),
              ),
            ),
```

`Container`にdecorationを指定して`BoxDecoration`に色をつけましょう。
それでこんな感じに色がつきます！

![スクリーンショット 2021-04-25 18.29.47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/21bad4f9-9566-be09-80d9-6d79598ff7ce.jpeg)

```dart
 BoxDecoration(color: Colors.black.withOpacity(0.4)),
```

**Opacity**をつけて、背景を透明にさせてもいいですね！


![スクリーンショット 2021-04-25 18.35.53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/7a996b57-102c-9b91-5901-b7c6f134ba97.jpeg)
[Rails]kaminariでページネーション機能を作る

# はじめに
最近、ページネーション機能を実装したので、本記事に簡単にまとめます。

# ページネーション機能
ページネーションとは、内容の多いページを複数のWebページに分割し、各ページへのリンクを並べてアクセスしやすくするために設置するものです。よく比較されるものとして、無限スクロールがありますが、どちらを実装するかは各々のメリットデメリットをよく理解してから実装するのが良いかと思われます。場合によっては、実装することがマイナスとなりうるためです。（例えば、チャット画面でページネーション 機能があると切り替えが面倒ですよね）

#実装

実装方法は簡単で、kaminariというgemを使用します。

```Gemfile
gem `kaminari`
```

※bundle install忘れないように！！！

次にコントローラを実装します。

```controller.rb
class HomeController < ApplicationController
  def  index
    @posts = Post.all
    @posts = Post.page(params[:page]).per(20)
  end
end
```

per()については、何投稿ごとにページを切り替えるか指定しています。

あとは、ビューに以下を設置します。
　

```index.html.erb
<%= paginate @posts %>
```

極論、これで完成です。めちゃくちゃ簡単ですね。
とはいえ、細かい設定したいですよね。
そうした場合は以下のコマンドを叩いてください。


```terminal
 rails g kaminari:config
```
そうすると、以下のような設定ファイルが生成されます。
コメントアウトを外して、変えたい部分を変えてください

```config
Kaminari.configure do |config|
  # config.default_per_page = 25 # 1ページ辺りの項目数
  # config.max_per_page = nil    # 1ページ辺りの最大数
  # config.window = 4            # ex 値が2の場合 .. 2 3 (4) 5 6 ..
  # config.outer_window = 0      # ex 値が2の場合 .. (4) .. 99 100
  # config.left = 0              # ...になったときの左側の表示数
  # config.right = 0             # ...になったときの右側の表示数
  # config.page_method_name = :page # メソッド名
  # config.param_name = :page    # ページネーションのパラメーターの名前
end
```

あと、個人的に次へボタンを消したいなと思ったのですが、これはビューファイルごと消してやるといいかと思います。
その場合は、以下のコマンドを叩いてビューファイルを生成します。

```terminal
rails g kaminari:views default
```

なお、bootstrapをkaminariに適用する場合は以下のようにします

```terminal
rails g kaminari:views bootstrap3
```

あとは、個人でCSSを当ててもらえれば、それらしきものができるかと思います。

#おわりに

ざっくりとkaminariのまとめをしました。個人的には簡単で嬉しいものの、やっぱり作った感がなくて、、、、なので一から自分で作ってみようかな〜なんて考えています。
みなさんも是非試してみてはいかがでしょうか
仮想通貨の時価総額とQiitaの関連記事数の相関を調べてみた！

#はじめに
初投稿になります！
”あったらいいな！”や”気になる！”を形にしていこうと思います。
プログラミング経験のない超初心者ですが、アウトプット重視で発信をしていこうと思いますので、
どうぞ、よろしくお願いします！

#概要
コロナ禍となり、外出もあまりしなくなった今日この頃皆さまはいかがお過ごしでしょうか。
私はというと、何か新しい趣味をと思い、数年前にやっていた仮想通貨を再開しました。
仮想通貨の持つボラティリティの高さに心を奪われ、
暇あらば仮想通貨のチャートに張り付いてしまう日々をすごしております。

最近、Bitcoinの時価総額がGoldを上回ったり、有名人の呟いたDogeが爆騰したり、よくわからない草コインが数万％上昇したりとバブルな様相を呈していますよね。
そんな中、ふとコインの持つ技術的注目度と時価総額に相関があるのか気になりはじめました。
本記事では、技術的注目度を「各仮想通貨名がタグつけされQiitaに投稿された記事数」、
時価総額をCoinMarketCap時価総額上位100を参考に相関を見ていきたいと思います。
[CoinMarketCap時価総額上位100](https://coinmarketcap.com/ja/)

#環境
Node.js　15.13.0
axios　0.21.1


#各仮想通貨名のタグが付いている記事の取得
QiitaAPIを使用し、各仮想通貨名のタグが付いている、記事数を取得するコード

```
const axios = require('axios');

async function main() {
  let response = await axios.get('https://qiita.com/api/v2/tags/”コイン名”');
  console.log(response.data.items_count);
}

main();
```

#QiitaAPIで取得した記事数と時価総額の散布図
上位50位までの時価総額、Qiita記事数で検証（2021/04/25 16:00時点）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1390350/ab6e5b4a-d0a3-44d5-ef73-3d109f7a18b4.png)
相関係数　0.60

#まとめ
今回は、上記のようなとても微妙な結果となりました。
それもそのはず、ヒットした記事数も０のものがが多く、各仮想通貨の日本での認知度もかなり影響している模様です。
時価総額上位でも、タグにすら登場しない通貨もちらほら・・・。
このリサーチはあまり投資判断の参考にはならないので、もっと別対象（TwitterやGitHubなど）も含め分析していきたい。
PAY.JPを利用した際のtokenとSECRET_KEYとPUBLIC_KEYについて


Token
-

PAYJP側で発行しています。
createTokenメソッドが通った時に発行してもらってます。
カード番号やCVCをクレジット決済代行サービスに渡すさずに、別に登録保存されているカード情報を呼び出す鍵として発行されています。

```java:card.js
      Payjp.createToken(card, (status, response) => {
        if (status == 200) {
          const token = response.id;
          const renderDom = document.getElementById("charge-form");
          const tokenObj = `<input value=${token} name='token' type="hidden"> `;
          renderDom.insertAdjacentHTML("beforeend", tokenObj);
        }
```


SECRET＿KEYとPUBLICキー
-

これは購入サイトがクレジット代行サービスにデータ提供する際に必要なログイン情報「身分証明書」となっています。
Formオブジェクト作成手順(備忘録）

手順1.新たにmodelsディレクトリ直下にファイルを作成し、クラスを定義する
手順2.作成したクラスにform_withメソッドに対応する機能とバリデーションを行う機能を持たせる
手順3.保存したい複数のテーブルのカラム名全てを属性値として扱えるようにする
手順4.バリデーションの処理を書く
手順5.データをテーブルに保存する処理を書く
手順6.コントローラーのnewアクション、createアクションでFormオブジェクトのインスタンスを生成するようにする
手順7.フォーム作成の部分をFormオブジェクトのインスタンスを引数として渡す形に変更する
Artifactoryサーバーのディレクトリについて

今回はArtifactoryのディレクトリ構成について簡単に解説します。

#Artifactoryのディレクトリ構成
Artifactoryのデータが格納されたディレクトリは以下にあります。

```
/var/opt/jfrog/artifactory/
```

上記ディレクトリ配下は以下の通りとなっています。

```
backup
bootstrap
data
etc
log
work
```

##backupディレクトリ
`backup`ディレクトリは、文字通りArtifactoryのバックアップデータが格納されます。
Artifactoryのバックアップは、GUIの管理者権限の画面のSERVICES -> Artifactory -> Backupsを選択すると以下の画面が表示されるので、この画面でバックアップの設定が可能です。
`Run Now`にある矢印のボタンをクリックしますと即座にバックアップが実行されます。
バックアップの実行タイミングやバックアップに含めるリポジトリ等を指定したい場合は、右上の「New Backup」から設定可能です。

![atf01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858317/fdf71c05-16de-e632-7670-e6b960003eed.png)

##bootstrapディレクトリ
`bootstrap`ディレクトリについて、bootstrapはCSS、JavaScript形式のwebアプリケーションフレームワークとの事です。
そのため、恐らくこのディレクトリ内にはArtifactoryのweb画面の構成データが格納されていると思われます。
直接このディレクトリ配下をいじることは無いかと思います。

##dataディレクトリ
`data`ディレクトリは、Artifactoryのリポジトリデータ等が格納されています。
例えば、Artifactoryのリポジトリへテキストファイルをデプロイし、`/var/opt/jfrog/artifactory/data/artifactory/filestore/`の中を覗くと、ランダムな2桁の名前のディレクトリが作成されます。
そのディレクトリ内に格納されているファイルをcatで開くと、デプロイしたテキストファイルと同じ内容が表示されます。

```ruby:例
# cat test.txt
testfile
# cat /var/opt/jfrog/artifactory/data/artifactory/filestore/d8/d8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
testfile
```

##etcディレクトリ
`etc`ディレクトリは、yamlファイルやxmlファイル等、Artifactoryの動作に必要な構成ファイル等が格納されています。(恐らく。。。)
etcディレクトリ直下は以下の通りとなっています。

```
 以下はファイル
system.basic-template.yaml
system.full-template.yaml
filebeat.yaml
system.yaml
 以下はディレクトリ
access
metadata
artifactory
replicator
router
logrotate
security
```

もしかしたらこのディレクトリ内のファイルを操作すればDBの接続先やリポジトリデータの格納先を変更できるかもしれませんが、具体的にどのファイルを操作できるかは不明なので、判明次第別の機会で説明させて頂こうと思います。

##logディレクトリ
`log`ディレクトリは、文字通りArtifactoryの様々なログファイルが格納されています。
障害等が発生した際には、このディレクトリ内を確認する事になると思います。
logディレクトリ直下に以下の通り様々なlogファイルが格納されています。

```
access-audit.log
access-metrics.log
access-metrics_events.log
access-request.log
access-security-audit.log
access-service.log
artifactory-access.log
artifactory-binarystore.log
artifactory-build-info-migration.log
artifactory-conan-v2-migration.log
artifactory-event.log
artifactory-import-export.log
artifactory-metrics.log
artifactory-metrics_events.log
artifactory-path-checksum-migration.log
artifactory-request-trace.log
artifactory-request.log
artifactory-service.log
artifactory-sha256-migration.log
artifactory-traffic-v2.log
artifactory-traffic.1618132649484.log
artifactory-xray-traffic.1618132649535.log
console.log
derby.log
frontend-request.log
frontend-service.log
metadata-metrics.log
metadata-request.log
metadata-service.log
router-request.log
router-service.log
router-traefik.log
```

##workディレクトリ
`work`ディレクトリについては、どういったものが格納されているか分かりませんでした。
判明次第追記したいと思います。
workディレクトリ直下は以下のディレクトリが格納されている状態となっています。

```
access
artifactory
metadata
router
```

今回は以上となります。
Googleフォームの入力結果をkintoneに連携する際につまづいた点

#本記事
cybozu developer networkに記載されている、主題を実施してみたので、つまずいた点を記載する。

#前提
https://developer.cybozu.io/hc/ja/articles/115003856483-Google-%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%A8kintone%E3%82%92%E9%80%A3%E6%90%BA%E3%81%97%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86-

こちらの記事に記載されている通りにGoogleフォームを作成。kintoneアプリを作成。GASのコードを作成。

#つまずいた点
1.TypeError: Cannot read property 'response' of undefined　のエラー
GAS側で、sendToKintone.gsのデバッグを行うと、'response'のエラーが出る。
結論としては、このエラーは無視して問題なさそう。
フォームを入力せずに、コードのみ動かしたことによるエラーっぽい。。？
とりあえず、このエラーを無視してもkintoneへの連携はできた。

2.Response code is "400.0"
kintoneに送る内容は問題なく、JSON化できているように見えるにも関わらず、
400のエラーが出る。（400は、Bad Request)
原因としては、Googleフォーム側の回答の選択肢と、kintoneアプリ側で用意している
ラジオボタンの選択肢の内容が完全には一致していなかった。（句点が抜けていた）
つまり初歩的なミス。

#所感
GoogleFormsの結果をkintoneに連携できるのは便利。
ただ、フォームの内容を変更するとGAS側、kintoneアプリ側に修正が必要なのは、少し面倒。

以上
binding.pryの使い方

binding.pry自分の知らない新しい使い方
-

```rb
13: def save
=> 14: binding.pry
15: purchase = Purchase.create(user_id: user_id, item_id: item_id)
16: Address.create(postal_code: postal_code, prefecture_id: prefecture_id, town: town, address: address, building: building, phone_number: phone_number, purchase_id: purchase.id)
17: end
```

binding.pryで止まったところでその先の行を丸ごと入れます

```rb:15行目
[1] pry(#)> purchase = Purchase.create(user_id: user_id, item_id: item_id)
```

```rb:terminal
(19.1ms) BEGIN
↳ (pry):3:in save'
User Load (0.7ms) SELECTusers.* FROMusersWHEREusers.id= 2 LIMIT 1
↳ (pry):3:insave'
(0.5ms) ROLLBACK
```

ROLLBACKでその行が差し戻されているのでうまくいかないということが行ごとで明らかになります。
便利〜〜〜
mnist pytorch

```python
from torchvision import datasets, transforms

class MLP(nn.Module):
    def __init__(self, in_dim, hid_dim, out_dim):
        super(MLP, self).__init__()
        self.linear1 = Dense(in_dim, hid_dim)
        self.linear2 = Dense(hid_dim, out_dim)

    def forward(self, x):
        x = relu(self.linear1(x))
        x = softmax(self.linear2(x))
        return x

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

in_dim = 784
hid_dim = 200
out_dim = 10
lr = 0.001
batch_size = 32
n_epochs = 10


mlp = MLP(in_dim, hid_dim, out_dim).to(device)

optimizer = optim.SGD(mlp.parameters(), lr=lr)

# 前処理を定義
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Lambda(lambda x: x.view(in_dim))
])

# torchvisionのdatasetsを使ってMNISTのデータを取得
# ミニバッチ化や前処理などの処理を行ってくれるDataLoaderを定義
dataloader_train = torch.utils.data.DataLoader(
    datasets.MNIST('./data/mnist', train=True, download=True, transform=transform),
    batch_size=batch_size,
    shuffle=True
)

dataloader_valid = torch.utils.data.DataLoader(
    datasets.MNIST('./data/mnist', train=False, download=True, transform=transform),
    batch_size=batch_size,
    shuffle=False
)

for epoch in range(n_epochs):
    losses_train = []
    losses_valid = []
    train_num = 0
    train_true_num = 0
    valid_num = 0
    valid_true_num = 0

    mlp.train()  # 訓練時には勾配を計算するtrainモードにする
    for x, t in dataloader_train:
        true = t.tolist()

        t_hot = torch.eye(10)[t]  # 正解ラベルをone-hot vector化

        # テンソルをGPUに移動
        x = x.to(device)
        t_hot = t_hot.to(device)

        # 順伝播
        y = mlp.forward(x)

        # 誤差の計算(クロスエントロピー誤差関数)
        loss = -(t_hot*torch.log(y)).sum(axis=1).mean()

        # 誤差の逆伝播
        optimizer.zero_grad()
        loss.backward()

        # パラメータの更新
        optimizer.step()

        # モデルの出力を予測値のスカラーに変換
        pred = y.argmax(1)

        losses_train.append(loss.tolist())

        acc = torch.where(t - pred.to("cpu") == 0, torch.ones_like(t), torch.zeros_like(t))
        train_num += acc.size()[0]
        train_true_num += acc.sum().item()

    mlp.eval()  # 評価時には勾配を計算しないevalモードにする
    for x, t in dataloader_valid:
        true = t.tolist()

        t_hot = torch.eye(10)[t]  # 正解ラベルをone-hot vector化

        # テンソルをGPUに移動
        x = x.to(device)
        t_hot = t_hot.to(device)

        # 順伝播
        y = mlp.forward(x)

        # 誤差の計算(クロスエントロピー誤差関数)
        loss = -(t_hot*torch.log(y)).sum(axis=1).mean()

        # モデルの出力を予測値のスカラーに変換
        pred = y.argmax(1)

        losses_valid.append(loss.tolist())

        acc = torch.where(t - pred.to("cpu") == 0, torch.ones_like(t), torch.zeros_like(t))
        valid_num += acc.size()[0]
        valid_true_num += acc.sum().item()

    print('EPOCH: {}, Train [Loss: {:.3f}, Accuracy: {:.3f}], Valid [Loss: {:.3f}, Accuracy: {:.3f}]'.format(
        epoch,
        np.mean(losses_train),
        train_true_num/train_num,
        np.mean(losses_valid),
        valid_true_num/valid_num
    ))
```
メニューをクリックするごとにメイン部の表示を切り替えるやつをVue.jsで書いてみた

よくある、アプリケーション画面でトップとかサイドにメニューがあって、それをクリックするとメイン部分に表示をする（切り替える）仕組みについて。

jQueryを使った場合、対象の要素に対して背景色のクラスを"付けたり" or "外したり"とか、.show() or .hide()で表示を切り替えたりする。と思いつくのだけれど、Vue.jsでやる場合は「状態を変える」ことによって「表示を切り替える」ことらしいので、こういう感じでやるのかなーと書いてみた。

[demo](https://jsfiddle.net/naopi/ub9at4zo/)


- methodsの select()でクリックしたメニューのIDを保持
- メニューの背景色を選択色に変えたり、表示の切り替えを methodsのisSelected({ID})で判定している。

次は、メニュー部とコンテンツ部をファイルに分けて（コンポーネントごとに切り出して）、メニュー部で選択した状態をコンテンツ部にどうやって伝えるかを実装してみる。


``` js
<script src="https://unpkg.com/vue"></script>

<div id="app">
  <div id="menu">
    <ul>
      <li id="A01" v-on:click="select" v-bind:class="{selected: isSelected('A01')}">AAAAA</li>
      <li id="B01" v-on:click="select" v-bind:class="{selected: isSelected('B01')}">BBBBB</li>
    </ul>
  </div>
  <div id="contents">
    <div class="item" id="AAAAA" v-show="isSelected('A01')"><p>{{ selected }}</p> </div>
    <div class="item" id="BBBBB" v-show="isSelected('B01')"><p>{{ selected }}</p> </div>
  </div>
</div>

<script>
    var vm = new Vue({
    	el: "#app",
      data : {
            selected: ""
      },
      methods: {
        select: function (event) {
          this.selected = event.target.id
        },
        isSelected: function(id){
          	return this.selected === id
        }
     }
    })

</script>
```

```css
#menu {
  width: 400px;
}
ul {
  list-style-type: none;
  overflow: hidden;  
}

li {
  height: 40px;
  width: 100px;
  background-color: gray;
  color: white;
  text-align: center;
  line-height: 40px;
  margin-right: 2px;
  float: left;
}

.selected {
  background-color: cyan;
  color: black;
}

#contents {
  width: 600px;
}

.item {
  width: 100%;
  height: 200px;
}

#AAAAA {
  background-color: lightsalmon;
}

#BBBBB {
  background-color: lightblue;
}
```
chia でノードが同期されないときの対処方法のメモ

https://github.com/Chia-Network/chia-blockchain/issues/2271

一日置いても sync されない...

## 対処方法

port 開放は関係ないです.

* システムの時刻があっているか確認(Ubuntu とかだとたまにバグるっぽくて再起動必要)
* peer のファイルを消す(1.0 -> 1.1 にアップデートしたときとか)

https://github.com/Chia-Network/chia-blockchain/wiki/FAQ#why-does-my-node-have-no-connections-how-can-i-get-more-connections

で解決できるはずです!

数分ごとくらいにはブロック更新されるようなので, 30 ~ 1 時間経っても sync されない(ブロックの更新が無い)ようでしたら上記対処方法を試しましょう.

## peer ノードの問題もある

Full node の peer が見つかっても, height が古い full node だと sync されません. (GUI の場合)一旦 peer node を消して新しい peer node を取得しましょう.
都道府県をfirebase上で定義する

#地味に需要あるかと思いました
```dart
await FireStoreUtils.firestore
              .collection(QUESTIONS)
              .doc('KXKaseIQNZVJqkug0aQk')
              .update({
            'doneeOption': FieldValue.arrayUnion([
              "北海道",
              "青森県",
              "岩手県",
              "宮城県",
              "秋田県",
              "山形県",
              "福島県",
              "茨城県",
              "栃木県",
              "群馬県",
              "埼玉県",
              "千葉県",
              "東京都",
              "神奈川県",
              "新潟県",
              "富山県",
              "石川県",
              "福井県",
              "山梨県",
              "長野県",
              "岐阜県",
              "静岡県",
              "愛知県",
              "三重県",
              "滋賀県",
              "京都府",
              "大阪府",
              "兵庫県",
              "奈良県",
              "和歌山県",
              "鳥取県",
              "島根県",
              "岡山県",
              "広島県",
              "山口県",
              "徳島県",
              "香川県",
              "愛媛県",
              "高知県",
              "福岡県",
              "佐賀県",
              "長崎県",
              "熊本県",
              "大分県",
              "宮崎県",
              "鹿児島県",
              "沖縄県"
            ])
          });

```
Azure FunctionのJavaでFailed to start Worker Channel. Process fileName: %JAVA_HOME%/bin/javaエラーが出た時の対処法

https://qiita.com/official-events/22637c675c61a797a24f

<hr>

Azure FunctionsをJavaで実装するため、Mavenのazure-functions-archetypeを使ってプロジェクトを作成しました。動作環境はDocker上のDebian 10.9です。手元で実行できるように
[.NET Core 3.1.408](https://dotnet.microsoft.com/download/dotnet/3.1)と[Azure Functions Core Tools](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=linux%2Ccsharp%2Cbash)もインストールしました。

[ドキュメントどおり](https://docs.microsoft.com/ja-jp/java/api/overview/azure/maven/azure-functions-maven-plugin/readme?view=azure-java-stable#run-azure-functions-locally)に実行したところ


```
mvn azure-functions:run
```

以下のエラーになりました。

```
Failed to start Worker Channel. Process fileName: %JAVA_HOME%/bin/java
```

Javaのパスに関連する問題に見えます。ちなみにwhich javaの結果は以下です。

```sh
which java
/usr/bin/java
```

エラーメッセージを調べると以下のStackOverflowがひっかかりました。どうやらazure-functions-core-toolsの設定ファイル「worker.config.json」に関するもので、自分の環境に合わせて修正が必要なようです。

https://stackoverflow.com/questions/64032219/azure-function-in-java-does-not-work-locally

worker.config.jsonは以下にありました。

```
/usr/lib/azure-functions-core-tools-3/workers/java/worker.config.json
```

開いてみると以下の内容で、defaultExecutablePathで%JAVA_HOMEが使われています。

```
{
    "description": {
        "language": "java",
        "extensions": [".jar"],
        "defaultExecutablePath": "%JAVA_HOME%/bin/java",
        "defaultWorkerPath": "azure-functions-java-worker.jar",
        "arguments": ["-XX:+TieredCompilation -XX:TieredStopAtLevel=1 -noverify -Djava.net.preferIPv4Stack=true -jar", "%JAVA_OPTS%", "%AZURE_FUNCTIONS_MESH_JAVA_OPTS%"]
    }
}
```

StackOverflowにあるとおり、defaultExecutablePathを環境に合わせて適切なパスにするとエラーが解消しました。

修正前

```
"defaultExecutablePath": "%JAVA_HOME%/bin/java",
```

修正後

```
"defaultExecutablePath": "/usr/bin/java",
```

StackOverflowの情報からはファイルがどこにあるのか読み取れなかったので、解決に少し手間取りました。同じエラーでハマった方の解決方法になれば幸いです。
ストロングパラメーターとViewのform_withに関係に着目


現在、FormObjectに取り組んでいます。

自分がエラーから以下のことがわかりました。


環境
-

|①addressテーブル|③(FormObject)address_purchase.rb|④(View)purchasesフォルダindex.html.erb|
|:-:|:-:|:-:|
|②purchaseテーブル|上記|上記|

④のViewのフォームから来たデータを①テーブルと②版テーブルに分けて保存することを目指しています。

問題:1つだけ変数を受け取れない場合があります。
-

１：form_with model:@インスタンス変数
２：form_with url ✖️_✖️_path
３：form_with model:@インスタンス変数, url ✖️_✖️_path

1番が受け取れない場合があります。

```rb:address_purchase.rb
  private

  def address_params
    params.require(:address_purchase).permit(:postal_code, :prefecture_id, :town, :address, :building, :phone_number).merge(user_id: current_user.id, item_id: params[:item_id], purchase_id:params[:id])
  end
```

上に対応するviewの書き方が以下

```rb:app/views/purchases/index.html.erb
<%= form_with model: @address_purchase,url: item_purchases_path, id: 'charge-form', class: 'transaction-form-wrap',local: true do |f| %>
```

###A:require(:adress_purchase)部分が　model: @address_purchase部分と対応してます

```rb:address_purchase.rb
  private

  def address_params
    params.permit(:postal_code, :prefecture_id, :town, :address, :building, :phone_number).merge(user_id: current_user.id, item_id: params[:item_id], purchase_id:params[:id])
  end
```

上に対応するviewの書き方が以下

```rb:app/views/purchases/index.html.erb
<%= form_with url: item_purchases_path, id: 'charge-form', class: 'transaction-form-wrap',local: true do |f| %>
```

###B:permit(  )部分が　model: url: item_purchases_path部分と対応してます



```rb:address_purchase.rb
  private

  def address_params
    params.require(:address_purchase).permit(:postal_code, :prefecture_id, :town, :address, :building, :phone_number).merge(user_id: current_user.id, item_id: params[:item_id], purchase_id:params[:id])
  end
```

上に対応するviewの書き方が以下

```rb:app/views/purchases/index.html.erb
<%= form_with url: item_purchases_path, id: 'charge-form', class: 'transaction-form-wrap',local: true do |f| %>
```

###C:require(:address_purchase)が　model: @address_purchase部分がないためにエラーが出ます。

Cの場合のエラーの確認方法
-

エラーメッセージ画像
![20210425-175817.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/3a3af478-8178-eb82-0da0-1c2a2e1a35c4.png)

取れるパワーメータも{}1重カッコのハッシュ。

{"authenticity_token"=>"rSIr68JcqA8eDoKKyZJKqw6boN9tEiBhVKCu2k1vhvW08xn+gVor7jmy+pCWqWkTXLydOrrP/MU0IpDpwJG18Q==",
 "card_number"=>"4242424242424242",
 "month"=>"4",
 "year"=>"35",
 "cvc"=>"123",
 "postal_code"=>"123-4567",
 "prefecture_id"=>"3",
 "town"=>"あわわわ",
 "address"=>"あわ１",
 "building"=>"",
 "phone_number"=>"09077778888",
 "commit"=>"購入",
 "item_id"=>"24"}

違う形に直すと
-

取れるパワーメータも{    }2重カッコのハッシュ。これが正解

Parameters: {"authenticity_token"=>"UjD+CkBD6QzxFEd1vJgxgQFKE0ifhoSE0GUnUrdwMSFL4cwfA0Vq7daoP2/joxI5U20urUhbWCCw5xlhOo4CJQ==", "address_purchase"=>{"card_number"=>"4242424242424242", "month"=>"3", "year"=>"34", "cvc"=>"123", "postal_code"=>"123-4567", "prefecture_id"=>"2", "town"=>"あああ", "address"=>"あああ", "building"=>"", "phone_number"=>"09011112222"}, "commit"=>"購入", "item_id"=>"24"}
Emacs + dap-modeでGoプログラムのデバッグをする

Emacs lsp-mode の導入はすでに済んでいたので、今度は dap-mode を導入してデバッグをしたい。
いろいろ躓きながらなんとか導入はできたので備忘録として残します
あまり文献もなかったので。。。

# 環境
私の作業環境はこちらです

- macOS BigSur 11.2.3
- GNU Emacs  27.1
- Go 1.15
- Node.js v14.4.0 

# 必要なツールのインストール

まずはGoの言語サーバである `gopls` のインストール

```
$ go get golang.org/x/tools/gopls@latest
```

次にデバッグ用のプログラムをインストール、VSCode向けの拡張プログラムが使えるとのことなので、そちらの準備をします
こちらは Node.js でのビルドが必要なようです

```
// リポジトリのクローン
$ git clone https://github.com/golang/vscode-go
$ cd vscode-go

// 必要なJSモジュール群をインストール
$ npm install

// 拡張プログラムのビルド
$ npm run compile
```

# Emacsの設定
これで必要なツールは揃ったのでここからはEmacsの設定ファイルを編集します。

前提として、私は [straight.el](https://github.com/raxod502/straight.el) というパッケージ管理ツールを使用しています
他のツールを使っている場合は適宜読み替えてください
straight.el の導入についても記事を書いているので興味のある方はそちらも見てみてください
https://qiita.com/yoooz/items/8a97642086611892f4c3

```elisp
(use-package dap-mode
  :defer t
  :after lsp-mode
  :config
  (dap-mode 1)
  (dap-auto-configure-mode 1)
  (require 'dap-hydra)
  (require 'dap-go)
  :custom
  (dap-auto-configure-features '(sessions locals breakpoints expressions repl controls tooltip))
  (dap-go-debug-path "path/to/vscode-go/repository")
  (dap-go-debug-program `("node", (f-join dap-go-debug-path "dist/debugAdapter.js")))
  )
```

#### 注意
`dap-mode` に同梱されている `dap-go` のデフォルトだと、下記変数のデフォルト値ではうまくいきませんでしたので、上記のように設定しています

- dap-go-debug-path
- dap-go-debug-program

# 使い方
設定が完了したらEmacsを再起動するか設定を反映して、Go のプログラムファイルを開きます

エディタの左側、フリンジ部分をクリックすることで ブレークポイントを設定することができます
![スクリーンショット_2021-04-25_17_40_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249470/8f99d3cf-521d-a20a-39ae-4a1f2c06d5df.png)

ブレークポイントを設定したらデバッグ起動しましょう

```
M-x dap-debug
```

どの設定を使用するか聞かれるので `Go Launch File Configuration` を選択(もしくは入力)してください

下記のようなWindow構成となり、デバッグが可能になります
![スクリーンショット 2021-04-25 17.44.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249470/a09af12c-6a1e-ad15-3404-3683b001d868.png)

# 終わりに
以上で `dap-mode` の導入は完了です
`dap-mode` 自体の機能についてはまだこれから触って行くつもりです
VSCode や Goland のような便利ツールを使うのもいいですが、EmacsやVimの方が小回りが効いたりするので、気が向いたときに改造していくのは楽しいですね
Git ローカルのmainブランチを使わない運用

## 問題

mainブランチからブランチを切り忘れたままコミットして **`git push`** したことないでしょうか...

```shell-session
$ git switch main

$ git commit -m xxx
$ git commit -m yyy
$ git commit -m zzz

$ git push
```

誤ってmainブランチをpushしてしまうことを未然に防ぐための対策をご紹介します。
(ブランチ保護は必ず設定しておいた方が良いですが、やらないに越したことはありません。)

## Gitシリーズ記事まとめ

https://qiita.com/ucan-lab/items/33c63a402f533aa92f3e

## 環境

Git: 2.37.2

## 対策

ローカルのmainブランチを削除する方法をご紹介します。
ローカルにmainブランチがないのでコミットもプッシュもできません。

## ローカルリポジトリのmainブランチを削除する

```shell-session
$ git branch -a
* main
  remotes/origin/main
```

```shell-session
$ git switch -d origin/main
$ git branch -D main
```

- `git switch -d` detachedオプション
- `git branch -D` ブランチ強制削除オプション

```shell-session
$ git branch -a
* (HEAD detached at origin/main)
  remotes/origin/main
```

これでローカルのmainブランチが削除されました。

## ブランチの作成〜プッシュまで

### ブランチを切る

新しく `topic-123` というブランチを `origin/main` から切り出します。

```shell-session
$ git switch -c topic-123 origin/main

$ git branch -a
* topic-123
  remotes/origin/main
```

この後は普通にcommitしていきます。

### 補足: pushするリモートブランチ名を省略する

```shell-session
$ git config --global push.default current
```

事前に上の設定をしておくと同じブランチ名でリモートリポジトリへpushしてくれます。

https://qiita.com/ucan-lab/items/c65297c062b477be01e5

### プッシュする

```shell-session
$ git push
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote:
remote: Create a pull request for 'topic-123' on GitHub by visiting:
remote:      https://github.com/xxx/yyy/pull/new/topic-123
remote:
To github.com:xxx/yyy.git
 * [new branch]      topic-123 -> topic-123
```

※ブランチ名を指定しなくても同名のリモートブランチが作成されます。

## リモートブランチの最新取得〜プッシュまで

`origin/main` はどんどん進んでいくので適宜、最新状態を取り込みます。

### フェッチする

リモートリポジトリの最新情報を取得します。

```shell-session
$ git fetch
```

ローカルの `main` ブランチはないので、 `git pull` は不要です。

### 作業ブランチに最新のコミットを反映する

リモートブランチの最新コミットからrebaseしてあげればokです。
よくある流れとしては下記の流れでしょうか。

```
# 作業ブランチへ切り替える(元々いるはず)
$ git switch topic-123

# リモートリポジトリの最新情報を取得
$ git fetch

# 差分を確認する
$ git diff origin/main

# 作業途中のファイルがあればstashしておく
$ git stash -u

# 最新コミットを作業ブランチに取り込む
$ git rebase origin/main

# stashしたファイルを戻す
$ git stash pop

# 結果にコミットする
# git add XXX
# git commit XXX

# コミットを整理する
$ git rebase -i origin/main
```

### 補足: origin/main の状態に切り替えたい

`origin/main` の状態を確認したい場合もあるかと思います。

```shell-session
$ git switch -d origin/main
```

`--detach` オプションでdetached HEADな状態に切り替えできます。
コミットIDを直接指してる状態です。

リモートのmainブランチが更新された場合、最新の状態に切り替えるには次のコマンドを実行します。

```shell-session
$ git fetch
$ git switch -d origin/main
```

また、この状態でもcommitは可能ですがpushすると次のエラーが発生します。

```shell-session
$ git push
fatal: You are not currently on a branch.
To push the history leading to the current (detached HEAD)
state now, use

    git push origin HEAD:<name-of-remote-branch>
```

この状態でpushしてもブランチ上にいないのでエラーとなります。
この状態からリモートブランチへpushしたい場合は次のコマンドでpushできます。

```shell-session
$ git push origin HEAD:topic-xxx
```

ということもできますが、通常通りローカルのブランチを作ってからpushしましょう。

```shell-session
$ git switch -c topic-xxx
$ git push
```

## やってみた感想

誤って、ローカルのmainブランチでコミットしてしまうというミスがなくなりました。
ないものはコミットできないので...

2022.07.15 追記

1年以上この運用でしたが特に不便なことはなかったです。
おすすめです！

## 参考

- https://qiita.com/mizukmb/items/cc603cf5654e6531c8e7
Laravelの@jsonディレクティブには変数以外を入れてはいけない

## 概要
〜ある日の午後の出来事〜

```php:web.php
Route::get('hoge/{id}', 'HogeController@index')->name('hoge');

Route::get('fuga/{id}', 'FugaController@index')->name('fuga');
```
Laravel × Vue.jsでの開発中、このようなルートを設定して

```html
<div id="app">
    <hogehuga
        :routes='@json([
            "hoge" => route("hoge", 1), 
            "fuga" => route("fuga" ,1), 
        ])'
    >
    </hogefuga>
</div>
```
BladeテンプレートからVue.jsにルートを渡してみたところ

![スクリーンショット 2021-04-25 17.06.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601599/aa5c8102-bfde-7c42-fb05-6b2569bf7f2b.png)

**構文エラー**
え？？？と思い、実際のコードを見てみると・・・

![スクリーンショット 2021-04-25 17.02.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601599/3604cde5-3a1f-8497-ea9e-da86c181a6c9.png)

なぜか、fugaの方のルートがパラメータ渡せていない & 配列やjson_encodeの閉じかっこが無い。。。
## 解決策
色々試してみても全く解決しそうになく、類似の事象もみつからない。このまま迷宮入りかと思いきや、[ReadDouble](https://readouble.com/laravel/8.x/ja/blade.html?header=%25E3%2582%25A4%25E3%2583%25B3%25E3%2583%2588%25E3%2583%25AD%25E3%2583%2580%25E3%2582%25AF%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%25B3)にこんな記述がありました。
>Note: @jsonディレクティブは既存の変数をJSONとしてレンダするためだけに使用してください。Bladeテンプレートは正規表現ベースのため、複雑な式をディレクティブに渡すと予期しない不良動作の原因になります。

なるほどー。
今回のように@jsonディレクティブにroute関数などを使った複雑な式を直接入れると思わぬバグをうむ可能性があるみたい。

ということで、以下のようにして解決。

```html
@php
    $routes = [
        "hoge" => route("hoge", 1), 
        "fuga" => route("fuga" ,1), 
    ];    
@endphp
<div id="app">
    <hogehuga
        :routes='@json($routes)'
    >
    </hogefuga>
</div>
```

@jsonディレクティブには変数以外を入れないように気をつけましょう。
Deep Variational Information Bottleneck のメモtt

- Alexander A. Alemi, Ian Fischer, Joshua V. Dillon, Kevin Murphy
Google Research
- ICLR 2017
- https://arxiv.org/abs/1612.00410


## 概要
1999年にTishbyらによって提案されたInformation Bottleneckを変分近似。ニューラルっとでモデル化。VIBは一種の正則化として機能し、汎化性能や敵対的攻撃に対する頑健性が向上する。

## information bottleneck
```
  X -> Z -> Y
```
を考える。Xは入力。Zは隠れ表現、Yは出力。クラス分類タスクではYはラベルになる。ここで、Yを求めるために必要な情報を残したまま、可能な限りZを圧縮表現としたい。
これを実現するために下を最小化する。

```math
R_{IB}(\theta) =  I(X,Y;\theta) - \beta I(Z, X; \theta)
```

Yに関する情報を保ちながら、Xのことを可能な限り忘れたY、が目的。

## VAEとの関係

VAEでは、`X->Z->X'`が目的で、`X`と`X'`の差分と、Zと事前分布のKLダイバージェンスの和を最小化する。

VIBの場合は、`X->Z->Y`が目的で、Yの予測ロスと、Zと事前分布のKLダイバージェンスの重み付き和を最小化する。この際に係数として指定する$\beta$を調整することで、ボトルネックのサイズを調整する。

## 評価
### permutation-invariant MNIST
CNNを使わない、FCNNを用いた評価。他の正則化手法よりも良いと主張。Zの次元を2次元と、256次元でテスト。2次元のほうは多変量正規分布を事前分布につかっているが、256次元のほうは独立。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/39350e68-465a-84d6-baf4-87e1bbd19898.png)

2次元の場合で、埋め込み空間をプロット。中心$\mu$で、$sigma$で楕円を描いている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/bae0d258-afca-bd2a-5f1f-76cbbe505433.png)

### 頑健性
0を1と誤認させる攻撃で評価。L0は変化させたピクセルの数、L1,L2はそれぞれマンハッタン距離と、ユークリッド距離を最小にするように攻撃する手法。

左は決定的なベースラインに対する相対。右はドロップアウト込み。ドロップアウトがあると頑健性が向上するが、ベータが大きい領域では、VIBが良いと主張。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/d55bff7b-fd71-98f5-1dc1-4cdf4f80067c.png)
仮想化が有効なのに0x80370102エラーでWSL2のインストールができない

# 仮想化が有効なのに0x80370102エラーでWSL2のインストールができない

## はじめに

WSL2でUbuntuを動かしたくなりMicrosoftストアからインストール。
Ubuntu 20.04を起動させようとしたら以下のエラーが発生。

```
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x80370102
Error: 0x80370102 ???????????????????????????????????????????????????
```

エラーコードで調べたところ、仮想化が有効になっていないとこのエラーが出るとのこと。
しかし、UEFI上ではSVMモードは有効になっている。
また、タスクマネージャーのCPUの画面でも仮想化は有効になっている。

## 環境

* OS: Windows 10 Home(バージョン2004)
* CPU: AMD Ryzen5 3600

## 解決策

Windows 10のバージョンを20H2にアップデートすることで解決。

## まとめ

version 2004でもともと入れかけの状態で放置していたところからの作業だったりしたので、そのあたりもうまくインストールできなかった要因なのかもしれません。

問題の原因がなんだったのか特定できたわけではないですが、この方法で解決したという記事がなかったのでどなたかの助けになれば幸いです。
Kalilinux on VirtualBoxでaircrack-ngを使う

# 背景
Kalilinux on VirtualBoxでaircrack-ngを使ってみようとしたが、wlan0が存在しなかったのでできなかった。

### 原因
VirtualBox上ではホストOSの通信をすべてEthernet通信として認識していたため。

### 対策
新たに無線LAN子機を導入する。
VirtualBoxのUSBパススルーの機能を使用して、ゲストOSに無線LAN子機を認識させる。

# 環境
- Ubuntu 20.04 LTS (Focal Fossa)
- VirtualBox Graphical User Interface Version 6.1.16_Ubuntu r140961
- tp-link Archer T2U Ver:2.0

# 対策内容

- VirtualBoxにエクステンションパックの導入(USB2.0以上を使う場合に必要)

- ホストOS側でtp-linkが認識されているか確認

```
$ lsusb
Bus 001 Device 005: ID 148f:761a Ralink Technology, Corp. MT7610U ("Archer T2U" 2.4G+5G WLAN Adapter
```

- ホストOS側でVirtualBoxを使用するユーザをグループに追加

```
sudo gpasswd -a [username] vboxusers
```

- 次にゲストOS内でドライバをインストール

```
sudo apt update
sudo apt install bc mokutil build-essential libelf-dev linux-headers-`uname -r`
git clone https://github.com/aircrack-ng/rtl8812au.git
cd rtl8812au
sudo make dkms_install
sudo reboot
```
- 再起動後ネットワークインターフェイスにwlan0が出現すれば成功です。

```
$ ip l

3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2312 qdisc mq state DORMANT mode DORMANT group default qlen 1000
    link/ether 0e:a9:92:56:0c:09 brd ff:ff:ff:ff:ff:ff permaddr d0:37:45:a9:44:cd

```
VScode マークダウン一覧

VScodeのマークダウンを用いてで会議のメモを取ると早く綺麗にまとめることができることに気づいたので便利なマークダウンのテンプレをメモに残していきたいと思います。

``` m
# 見出し1
## 見出し2
### 見出し3

**太字**

*斜字*

~~削除します~~

***
線を引く

---

* 箇条書き1
* 箇条書き2
  * 箇条書き3
  * 箇条書き4
    * 箇条書き5
    * 箇条書き6
* 箇条書き7
    * 箇条書き8

1. 数字付き1
1. 数字付き2
1. 数字付き3
1. ---

改行するときはスペース2つ  入れる

> 引用
>> 二重引用
>
> 二重引用あとは一つ行空けた方が良いみたい
>
表の作成
|案|メリット|デメリット|決定|
|:--|:--|:--|:--|
|案A:xxxする| | | |
|案B:xxxする| | | |
|案C:xxxする| | | |

ソースコードも書ける。実行はできない。

【Python】
```python
# コメント
import numpy
import pandas

print('Hello World')
"```
```
iPhone 水没した時の応急処置


iPhoneがうっかりして水没されてしまい、大切なデータが消えた、というような問題に悩んだことがありますか。iPhoneが水没してしまうと、場合によって専門店に修理を出す必要がありますが、まず自分で応急処置をしましょう。

iPhone 水没した時の応急処置：
一、カバーを外す。フィルムはともかく、イヤホンジャックやボタン近くについているアクセサリなどを外しましょう。
二、 水分をふき取る。iPhoneについている水分をふき取りましょう。冷風を使うのはいいですが、ドライヤーをかけないようにご注意ください。
三、電源を切る。スリープボタンを長押しして電源を切りましょう。
四、 simカードを外す。iPhoneの右横に小さい穴がありますので、細いものを穴に奥まで入れ込むと、トレーと一緒にsimカードが出てきます。
五、乾燥させる。iPhoneを丁寧にティッシュで包んで、乾燥剤と一緒に密封した袋に入れて乾燥させます。乾燥剤がない場合はiPhoneを米に埋めたり、風通しの良い場所に置いても効果があります。

以上はiPhone水没した時の応急処置です。その後、iPhoneのデータが取り戻す必要があります。
しかし、iPhoneを修理に出してしまえば、復旧まで数日がかかるかもしれません。代用機を使うことができますが、大切な連絡先、メッセージなどがなくてもやはり不便ですね。普段データをiTunes/iCloudにバックアップする習慣があれば、専門的データ復元ソフト（https://jp.imyfone.com/iphone-data-recovery/）があれば、手元に水没したiPhoneがなくてもデータを復旧できます。
GCPでValhalla APIをLet's encryptで構築し、等時線アプリを作る

[Valhalla](https://github.com/valhalla/valhalla)はOpenStreetMapベースのオープンソースのルーティングエンジンです。
![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858331/2b8d0e90-2c90-71cf-cdba-4e3967d26150.gif)

この記事では以下のことを扱います。

- Valhalla APIのセットアップ
- Let's Encryptを使ったSSL化
- valhalla pluginのMapbox GL JSアプリへの追加

qiitaではなく、以下の私のウェブサイトの方に記事をまとめていますので、ご参考になれば幸いです。

https://docs.water-gis.com/ja/setups/valhalla/
Window10の基礎知識

業務でWindows10を扱うことになり、調べた内容の備忘録。

#歴史
大きなものだけ抜粋
・OS登場（1507）
・AIアシスタント『Cortana』（1511）
・生体認証『Windows Hello』（1607）
・[タイムライン（1803）](https://www.pasoble.jp/windows/10/time-line.html)
・[クリップボードの履歴と共有（1809）](https://cpoint-lab.co.jp/article/201904/9099/)
・更新延期が「HomeEdition」でも利用可能に（1903）
・エクスプローラの検索強化（1909）

#アップデート
不具合改善・機能強化などの大型アップデート（2回/年）と、セキュリティ問題修正の通常アップデート（1回/月）がある。大型アップデートはサポート期間と紐づいており、基本はリリースから約18カ月でサポートが切れる。
手動更新と自動更新があるが、自動更新の場合はリリースから数カ月遅れて実行されるようになるため、安定性の観点では〇。手動更新の場合も自動更新が開始されるタイミングになってからが〇。ちなみに自動更新でもファイルのダウンロードまでが自動。インストールは自身でタイミングを選択できる。再起動するタイミングでも自動的にインストールされる。ただし、放っておくと再起動を自動スケジュールされるため、利用中に再起動されないよう設定しておくのがよい。[【Windows 10】Windows Updateによる不意打ち的な再起動を防ぐ](https://www.atmarkit.co.jp/ait/articles/2005/01/news014.html)
バージョンはwinverコマンドか設定➡更新とセキュリティ➡windows updateで確認可能。
なお、大規模アップデートは特に必要な容量が大きく、10ギガ程度が必要なことも。外部接続が上手くいかない場合はドライバを再インストールしよう。

#SACとLTSC
通常はSAC。バージョンアップの頻度を下げる必要性が高いものにLTSCを利用する。なお、基本的にクライアントPCへのインストールは推奨されておらず、ATM・POS・医療システムなどの特殊なもののみで利用するものとしている。

>Windows 10 は、半期チャネルと長期サービス チャネルに分類されます。半期チャネルは年に2回のペースで最新バージョンがリリースされ、通称「SAC（Semi-Annual Channel）」と呼ばれます。一般的に使われるWindows 10 （Home・Pro・Education・Enterprise）はSACに分類されます。
長期サービス チャネルは、特殊な用途のシステムが稼働する環境向けに、機能の更新を2～3年に1回の頻度に減らしたWindowsのサービス チャネルです。LTSC（Long-Term Serving Channel）と呼ばれます。

※[Windows 10 LTSBとは？SACやLTSCとの違いも解説](https://solution.fielding.co.jp/column/it/itcol04/202101_01/)から引用。

#備忘①：小技
Win10だけという訳ではないが、備忘のための小技。
・通知を消すには「通知とアクション」で設定をオフに。「集中モード」設定でアラームのみ・時間帯絞りなどの設定も可能。
・win+Vでクリップボード履歴を使える。テキスト・画像の保存が可能でピン止めも可能。
・win+ctrl+→で新規デスクトップを作成可能
・「電源をスリープ」でPCのスリープ時間を制御
・入力変換はMicrosoft IMEにて。詳細設定➡全般タブのキー設定「変更」➡ローマ字を削除でalt変換が消えてくれる
・画面が黒塗りになるような場合は解像度を変更

#備忘②：ショートカット
・Win+E：エクスプローラ
・ドラッグ中にEscで中断
・Ctrl+N：新規作成
・Ctrl+Sft+N
・Ctrl+Enter：別ウィンドウで開く
・F2：ファイル名変更
・F4：フォルダのリスト表示
・Alt+Pでプレビュー表示
・Alt+Enterでプロパティ
・Ctrl+F1でリボン表示
・Win+Sft+↑で縦だけ最大化
・Alt+F4 or Ctrl+Wでウィンドウ閉じる
・Ctrl+iで設定画面