OmniAICreator/Qiita-1.07M huggingface dataset:
AWS UbuntuインスタンスでのUnreal Enigine4の起動にはまりまくったのでまとめ

# はじめに
AWSのUbuntuインスタンスでUnreal Engine4を起動させようとしたところ、タイトル通りに泥沼にはまりました。
同じような人の手助けになればと思い、この記事を書きました。

# ２行でまとめ
AWS UbuntuインスタンスでUE4を使おうとしたところVulkan DriverやらOpenGLのエラーで起動できなかった
UE4のバージョンを4.22.1に下げ、インスタンスのグラフィックドライバを変更してOpenGLのバージョンを上げたところ無事起動した

# 必要なもの
- OpenGLで起動するUnreal Engine4(今回は4.22.1で起動)
- OpenGL4.3対応のグラフィックドライバ
- AWS Ubuntu18.04インスタンス(今回はg4dn.4xlargeを使用)

# 何が起こったのか
AWSのUbuntuインスタンスでUE4を使おうとして、最新バージョンのUE4(確か4.25)をgithubからダウンロード
Linuxでの起動手順通りにコマンドを実行していったところ、UE4Editorの起動部分でエラーがでる

![v.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428253/da0a56f9-62ca-6978-34ec-51e315a05f21.png)
Vulkan Driverエラー? 初めて見た...


Vulkan DriverでなくOpenGLで起動させる方法があると知り、OpenGLで起動させようとしてみた
![o.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428253/3e3bbe11-93a2-66c4-d9dd-5dd306db4f8b.png)
さっきVulkanは駄目って言ったのに今度はVulkanを使え...?

こんな感じで訳が分からなくなっていました

# 何が問題だったのか
- UE4のビジュアライズ方式は4.23を境に変更になっていることを知らなかった

> OpenGL ES2 は 4.23 で非推奨となり、4.24 で除去されました。

[UnrealEngine公式ドキュメント]( https://docs.unrealengine.com/ja/RenderingAndGraphics/SupportedRenderingFeatures/index.html)

- Ubuntuインスタンスではグラフィックドライバは手動で設定が必要なことを知らなかった


# やったこと
- OpenGL対応しているUE4をインストール
- インスタンスのグラフィックドライバを変更

## UE4をダウンロード
4.23で非推奨とのことだったので、バージョン4.22.1のUE4をダウンロードします。
通常のLinuxへのインストール手順を進めたあとグラフィックドライバの指定を変更するために、
`TargeteRHIs=VULKAN_SMS`の行をコメントアウトし、`TargeteRHIs=GLSL_430`のコメントを外して画像のようにします。
# ![comment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428253/0087a711-55a2-361c-c9b2-ed7742e8cc6e.png)

## OpenGLのバージョン確認
下記のコマンドを実行してOpenGLのバージョンを確認します。
`OpenGL version string`の後の数字が4.3以下の場合は、グラフィックドライバを変更します。

```
$ glxinfo | grep "OpenGL version"
OpenGL version string: 1.4 (2.1 Mesa 7.7.1)
```

## グラフィックドライバのインストール
今回はNVIDIAのドライバをインストールしました。

1.aptのリポジトリにNVIDIAのドライバのリポジトリを追加　
`sudo add-apt-repository ppa:graphics-drivers/ppa`

2.アップデート
`sudo apt update`

3.推奨ドライバを確認
`ubuntu-drivers devices`

4.ドライバのインストール
今回は推奨バージョンが455でした
`sudo apt install nvidia-driver-4５5`

5.再起動します
`sudo reboot`

6.指定されているグラフィックドライバを確認
`nvidia`が返って来たら成功

```
$ prime-select query
nvidia
```


7.`./UE4Editor`コマンドを実行すると、UE4Editorを起動することができる
![スクリーンショット 2020-12-16 21.35.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428253/812ae846-838a-388f-dbdc-bbb4292582aa.png)


# まとめ
- UE4はバージョンによってVulkanとOpenGLのどちらを使用するのか違うのでよく確認しよう
- OpenGLのバージョンが4.3以上になるグラフィックドライバを入れよう


## 参考文献

- [UnrealEngine公式ドキュメント]( https://docs.unrealengine.com/ja/RenderingAndGraphics/SupportedRenderingFeatures/index.html)

- [UbuntuにNVIDIA driverをインストール/再インストールする方法](https://qiita.com/yto1292/items/463e054943f3076f36cc)
【Ruby】RubyのAPI問題

<h3>任意の文字に対してn番目の文字を消し、<br>その消した文字を出力するメソッドを作りましょう</h3>



**呼び出し方**
missing_char(string, num)

**出力例：**
missing_char('kitten', 1) → 'itten'
missing_char('kitten', 2) → 'ktten'
missing_char('kitten', 4) → 'kiten'


１・**sliceメソッド**
sliceメソッドを用いることで、配列や文字列から指定した要素を取り出すことができます。
文字列の要素を指定する際は数字を用い、先頭の文字列は0からカウントされます。

```
# 文字列を作成
string = "abcdefg"

# 文字列から引数で指定した要素を取得して変数に代入
str = string.slice(2)

# strに代入した文字列を出力
puts str
#=> "c"

# 文字列はもとのまま
puts string
#=> "abcdefg"
```

２・**slice!メソッド**
末尾にエクスクラメーションマーク(!)のつくメソッドを破壊的メソッドといいます。これはもとの配列や文字列を変化させるメソッドです。slice!メソッドを使用することで、指定した要素を削除することができます。

```
string = "abcdefg"
str = string.slice!(2)
puts str
#=> "c"

# "c"が取り除かれている
puts string
#=> "abdefg"
```


<br>
解答

```
def missing_char(str, n)
  str.slice!(n - 1)
  puts str
end
```

任意の文字に対してn番目の文字を消すために、文字列自体から取得した値を取り除く、**slice!メソッド**を使用。
しかし**sliceメソッド**は文字列自体の形を変化させることはできないため、エクスクラメーション(!)を付けた**slice!メソッド**に変更している。

このslice!メソッドはmissing_charメソッド内で処理を行い、
missing_charメソッドの引数strには入力した文字列で、nは何番目の文字列を消すのか指示する数字を入れる仕組み。
そして、slice!メソッドにnから1を引いた数を引数にしているが、なぜ1を引くのか？
文字列の順番を指定する際も、配列と同じように先頭の文字列は0からカウントされるため。

【文字列の順番】(人間
　　　**123**
　　　s t r
　　　**012**
【添字の順番】(機械

人間から見た文字の順番は１〜
機械から見た文字の順番は０〜
人間→機械への翻訳なので「n - 1」って感じで理解できました。
奥が深い。
作りかけでなぜ停止状態

うーん。
悩み事が多いのに災害ばっか増えまくってる今日このごろ。
 [個人開発 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/private-development "個人開発 Advent Calendar 2020")16日目です。
追いついたァァァァァ。
#なぜ一人開発って悩まむこと多いの
これはずばり言うと。
・いいフレームワーク
・フロントエンドに苦しむ
・バックエンドなんにしよう
・データベースの考えるの忘れてた
・薬の後遺症で苦しいよ
これだけの原因があります。
正直言って一人開発って余裕を持たないとだめなんですが。
なんか知らずしらずの間に時間が奪われてるんですね。
笑えないぜ。
#正直治療しながらの開発は難しいよ
実は今B型肝炎の核酸アナログ製剤治療をやってまして。
実は今年で10年目突入いたしました。
去年やっとセロコンバージョンしたのですが。
最近薬の副作用に押しつぶされまだ未だにコンセプトすらできてないという笑えない状況です。
今も実は出てまして微熱状態と胃痛と頭痛に悩まされています。
ときには喉もやられるので大変です。
＃コロナ禍巻き込まれました。
実はトヨタに言ってほしいと社長に言われていたのですが。
その話が途中でなくなってしまいその当時の職場も開発縮小の流れに飲み込まれ実は転職活動していました。
11月に今の会社トライアロー株式会社に転職させていただき今は岐阜の日置江でバリバリPHPを組む生活をさせていただいてます。
正直言って見つかるまでが辛かった。
一回OKまで言った会社が御免なさいされたり色々ありましたが。
今の仕事につけて本当に良かったです。
そろそろPHPもいいんだけどPythonモテを出したいなぁと思っています。

ブリッジ交換してたためPythonアドベンドカレンダーと同日になってしまいましたが。
早くなったので良しとしたいと思います。
おーーーーと別の話になっちゃいますけどごめんなさい。

ASUSのルーター糞だったんですよね。
買った当初にルータとしてルーティング通したら見事に家のネットワークぶっ潰してくれました。
古いルーターを復帰させそれからASUSはブリッジでしか利用してこなかったです。
TP-LINKさんのルーターに出会い取り替えたら最高で実は３年間に３台購入しOneMesh用の中継機一基買っちゃうという勢いですね。
それで昨日ついにTP-LINKさん統一を図り成功しました。
かなり早くなりましたけどWIFI6じゃなくWIFI5なんですよね。
ArcherC81をブリッジで使っちゃいましたｗ。
だって自宅のマシンWIFI6使えるのiPhone12だけなんですもん。
WIFI5で充分です。

といったところでやめておきます。

明日は [kabueye](https://qiita.com/kabueye "kabueye")です。
どんな話が聞けるのか楽しみにしてます。
第10回

\![Ubuntu-20.04.1](<https://img.shields.io/badge/Ubuntu-20.04.1-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

これは講義用のまとめサイトです。見た人は是非LGTMを押しといてください。


# やったこと

-   Fibonacci数列


# Fibonacci数列


## お題

Fibonacci数列を求めるプログラムを作れ<br>例えば「0」を入力したら数列の初項の0が表示されてほしい


## 方針

単に

```ruby
def fib(n)
  if n==0
    return 0
  end
  if n==1
    return 1
  end
end
```

とか、もうちょっときれいにして

```ruby
[[0,0],[1,1]].each do |pair|
  puts assert_equal(pair[0], fib(pair[1]))
end
```

というように、いちいち条件を書いていくのはきりがない<br>そこで何を入力しようと勝手に計算してくれるようにすることを考える<br>


## 実際にどうやるか

勝手に計算してくれるようにするのには初項(0番目)とその次の項だけはこちらで教えてあげないといけない<br>その次以降は、Fibonacci数列の定義によると、n番目の項は(n-1)番目+(n-2)番目ということなので、それをプログラムにしてやる。

```ruby
def fib(n)
  if n==0
    return 0
  else if n==1
    return 1
  else
    return fib(n-1) + fib(n-2)
  end
end
p fib(6)
```

という感じになる。


## refactoring

だけどこのままだとコードが長いので、もっとぎゅっとまとめましょうということで

```ruby
def fib(n)
  return 0 if n==0
  return 1 if n==1
  return fib(n-1) + fib(n-2)
end
p fib(6)
```

となった。<br>これだけだと、n=6の時はfib(5)とfib(4)の結果を足すので、fib(5)とfib(4)は定義されてないので動かないはず

```ruby
> 8
```

…ってあれ！？動くの！？なんで？試しにfib(30)とかにしてもちゃんと値が返ってきた<br>でもどこにも再帰的に処理するような記述はした覚えがないのでこれに関してはよく分かりません。誰か教えて<br>(12/17追記)<br>先生からのコメントで気づきました。よく考えたらfibに8を渡すと4行目に行ってfib(7)とfib(6)が呼び出され、fibに7,6が渡されるとfibの4行目に行って…とちゃんと再帰的に呼び出されてました<br>長時間PCの前に座ってると思考が凝り固まって簡単なことにも気づけなくなるのでいかんですな。適度に散歩でも行きましょう


## テスト数を増やす

いくつもテストするならeach doを使いましょう。

```ruby
def fib(n)
  return 0 if n==0
  return 1 if n==1
  return fib(n-1) + fib(n-2)
end

[0,1,2,6].each do |pair|
  puts fib(pair)
end
```

で

```ruby
> 0
> 1
> 1
> 8
```

と、一気に返ってきますね


## assert\_equalを使って本当にちゃんと計算で来てるか確認する

先週作ったassert\_equalの機能を使い、9番目まで本当にちゃんと計算出来てるか確認する

```ruby
def fib(n)
  return 0 if n==0
  return 1 if n==1
  return fib(n-1) + fib(n-2)
end

require './assert_equal.rb'
[[0,0],[1,1],[2,1],[3,2],[4,3],
 [5,5],[6,8],[7,13],[8,21],[9,34],
].each do |index, expected|
  puts assert_equal(expected,fib(index))
end
```

indexとexpectedの組み合わせでできた配列をassert\_equal関数に渡して判定してもらうというもの

```ruby
["expected", 0]
["result", 0]
succeeded in assert_equal

["expected", 1]
["result", 1]
succeeded in assert_equal

["expected", 1]
["result", 1]
succeeded in assert_equal

["expected", 2]
["result", 2]
succeeded in assert_equal

["expected", 3]
["result", 3]
succeeded in assert_equal

["expected", 5]
["result", 5]
succeeded in assert_equal

["expected", 8]
["result", 8]
succeeded in assert_equal

["expected", 13]
["result", 13]
succeeded in assert_equal

["expected", 21]
["result", 21]
succeeded in assert_equal

["expected", 34]
["result", 34]
succeeded in assert_equal
```

オールクリア


# 参考記事

[チャート式ruby-V(Recursive Fibonacci)](<https://qiita.com/daddygongon/items/1bb27b8920c201d5c520>)



------
 - **source** ~/MasahiroOba/grad_members_20f/members/MasahiroOba/chapter10.org
Goを学び始めた

# Goを学び始めた（のでとりあえずDiscord botを作った）

この記事はアドベントカレンダー16日目です。

親知らず抜歯して元気だったら書きます　と宣言したのですが、本当に元気だったので書いています。

昨日はikkyuの[ダークウェブをのぞいてみる](https://qiita.com/ikkyu193/items/82cf9db2f78947242041)でした。

Torについては2018年の映画「名探偵コナン　ゼロの執行人」にて、少しもじった「Nor」が出てきたことからも少し話題になりましたね！（自分の周りだけかもしれない）

さて、今年の3月に[「プログラミング言語Go完全入門」の期間限定公開のお知らせ](https://engineering.mercari.com/blog/entry/2020-03-17-120137/)を見ました。

それから私はしばらく冬眠していたのですが、8月に[「プログラミング言語Go完全入門」の「完全」公開のお知らせ](https://engineering.mercari.com/blog/entry/2020-03-17-120137/)と更新されており、以前からGolang自体には触れてみたいと思っていたところではあったので、これを機に遊んでみました。

## Go習得について、参考にしたもの

ここではGoに関する環境構築や詳しい書き方などについては省略します。Qiitaにもより良い記事がありますし、上に紹介した「プログラミング言語Go完全入門」は非常に学びやすいと思います。

そう前置きした上で、Goに触れてみての感想と、参考にしたものや辿ったものを簡単に紹介します。

タイトルにDiscord botを作った、と書きましたが、これについては非常に長くなるので別の記事にまとめます。

### A tour of Go

Goのチュートリアルといえば、というぐらいメジャーなのが[A tour of Go](https://tour.golang.org/welcome/1)ですね。[(日本語版)](https://go-tour-jp.appspot.com/welcome/1)

ローカルに環境を作らなくても常に画面の右側にPlaygroundがあるのでしっかり演習しながら進めることができます。演習問題は、完全なプログラミング初心者に向けたチュートリアルとしてはやや難しく、個人的には多言語から来た人にちょうどいいぐらいのものが多いイメージでした。

Dockerで環境が作れるとはいえ、若干環境構築が面倒臭いと感じていたのでこれで言語仕様を学んでモチベーションを上げつつ学習を開始しました。

### プログラミング言語Go完全入門

Googleスライドに14章までまとめられていて、網羅的かつ演習つきなので完遂すればある程度は書けるようになっていると思います。

SlackチャンネルGopher Dojoへ参加することで動画コンテンツも参照することができます。私はインターフェースとゴールーチンあたりで若干こんがらがったので動画で学習しました。

また、スライド内で出される課題についてもSlackにてレビューしてもらえるそう。

### その他参考にした記事など

めちゃくちゃ有名な記事ですが、環境構築で詰まった時に[他言語から来た人がGoを使い始めてすぐハマったこととその答え](https://qiita.com/mumoshu/items/0d2f2a13c6e9fc8da2a4)を読みました。

Discord botを実際に作るとき、エラーハンドリングでかなり苦戦したので、[Go言語のエラーハンドリングについて](https://qiita.com/nayuneko/items/3c0b3c0de9e8b27c9548)を参考にしました。

## Goを触ってみての所感

とりあえずなんとかDiscord botが動く程度には習得しました。

![スクリーンショット 2020-12-16 17.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253256/0c900802-5120-dac1-6d1a-b173e3dd072a.png)


兎にも角にもエラーハンドリングに苦戦しました。

私は複数のエラーをハンドリングする、という点でかなり詰まりましたが、たとえひとつやふたつのエラーであっても適切に処理するのは初心者には若干難しいなあ、と思いました。

また、どうしても　` if err != nil { ` を無限に書いてしまい、結果的にきちんと網羅できているか怪しくなる（errcheckを使えという話ではありますが）という気がしてならないところではあります。

この辺りの感覚はまだ書き始めたばかりというのもあり、上級者からするとしょうもないことで悩んでいるな、といったものなのかもしれません。

とりあえず上質なコードをいっぱい読みながらDiscord botの機能充実に向けて頑張りたいと思います。

あと[Ebiten](https://ebiten.org/)も気になっている。
GmailのAPIでのエラー: Metadata scope doesn't allow format FULL


`users.messages.get`のAPIを使おうとしてのエラーメモです。

> https://developers.google.com/gmail/api/reference/rest/v1/users.messages/get


## Metadata scope doesn't allow format FULL

というエラーが出ました。

[ドキュメントに](https://developers.google.com/gmail/api/reference/rest/v1/users.messages/get)これらのパーミッションが必要と書いてあるので許可してたのですが......

```
https://mail.google.com/
https://www.googleapis.com/auth/gmail.modify
https://www.googleapis.com/auth/gmail.readonly
https://www.googleapis.com/auth/gmail.metadata
https://www.googleapis.com/auth/gmail.addons.current.message.metadata
https://www.googleapis.com/auth/gmail.addons.current.message.readonly
https://www.googleapis.com/auth/gmail.addons.current.message.action
```

### 検証環境

* Node.js v15.3.0
* googleapiモジュール v66

### 試したコード

```js
//省略

gmail.users.messages.get({
    userId: 'me',
    id: `xxxx`,
    // format: 'FULL' 
}, (err, res) => {
   if (err) return console.log('The API returned an error: ' + err);

   console.log(res);
});

//省略
```

ちなみに`allow format FULL`となっていたのは、何も指定しないとデフォルトのフォーマットがFULLになるからという理由です。

* MINIMAL
* FULL (デフォ)
* RAW
* METADATA

> https://developers.google.com/gmail/api/reference/rest/v1/Format


## `/auth/gmail.metadata`のパーミッションを許可しない

`Metadata scope doesn't allow format FULL gmail`とのことなのでそのままなのですが、APIドキュメントのテスターで試そうとしたら、`/auth/gmail.metadata`のパーミッションがチェック外れている状態でした。

> ![スクリーンショット 2020-12-16 21.38.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/018a63e7-ebe9-4b4e-7aa7-3f7a3c56df61.png "スクリーンショット 2020-12-16 21.38.10.png")

試しにチェックして試すと、テスター上も同様のエラーが発生。

ということでトークンを作成する際に`/auth/gmail.metadata`を許可しなければOKです。

トークン作成する際のスコープから`/auth/gmail.metadata`をはずしてトークンを作成しなおしたらいけました。


```js
const SCOPES = [
    `https://mail.google.com/`,
    `https://www.googleapis.com/auth/gmail.modify`,
    `https://www.googleapis.com/auth/gmail.readonly`,
    // `https://www.googleapis.com/auth/gmail.metadata`,
    `https://www.googleapis.com/auth/gmail.addons.current.message.metadata`,
    `https://www.googleapis.com/auth/gmail.addons.current.message.readonly`,
    `https://www.googleapis.com/auth/gmail.addons.current.message.action`
];
```

## まとめ

これはドキュメントミスな気がするけどどうなんでしょう。。
rails sでサーバーが立ち上がらないとき

## 概要

`Webpacker::Manifest::MissingEntryError`
このようなエラーが起きた時ひとつの解決策としてお役に立てれば幸いです。


## 環境
Mac OS Catarina 10.15.7
rails 6.0系
ruby 2.6.5

## エラー文

```
1. You want to set webpacker.yml value of compile to true for your environment
   unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
Your manifest contains:
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647973/6b03511a-0867-df5d-3945-0beb1695774c.png)

## 試したこと

1.webpackをインストール
2.yarnが入っているかの確認
3.yarnのupgrade
4../bin/webpack-dev-serverでサーバー立ち上げ

`application.html.erb`の`ｊｓを読み込む記述`を消せばエラーは消えるのですが、**jsを読み込むことができなくなってしまいます。**

## 解決策

nodeのバージョンが異なっているためエラーが起きておりました。

ゴールはnodeのバージョンを合わせてサーバーが立ち上がることを確認することです。

### 解決の流れ

1.nodeのバージョン確認
2.nodeのダウングレードするために削除・再インストールする
3.nodeのバージョン確認
4.インストールしたnodeが反映されていなかったらPATHを通す
5.Webpackerをインストールする
6.yarnが必要というエラーが起きたらyarn install
7.再度Webpackerをインストール
8.サーバーを立ち上げて確認

### 詳細

***1.nodeのバージョン確認
2.nodeのダウングレードするために削除・再インストールする
3.nodeのバージョン確認***

```terminal:ターミナル
% node -v
% brew uninstall --ignore-dependencies nodejs
% brew install node@14
% node -v
```

***4.インストールしたnodeが反映されていなかったらPATHを通す***

```terminal:ターミナル
% vim ~/.zshrc 
% source ~/.zshrc
```

```vim:vim
export PATH="/usr/local/opt/node@14/bin:$PATH" 
```

***5.Webpackerをインストールする***

```terminal:ターミナル
% rails webpacker:install
```

***6.yarnが必要というエラーが起きたらyarn install***

```terminal:ターミナル

========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================
```

```terminal:ターミナル
% yarn install
```

***7.再度Webpackerをインストールしてみる***

```terminal:ターミナル
% rails webpacker:install
```
***8.サーバーを立ち上げて確認***

```terminal:ターミナル
% rails s
```

## まとめ
- Webpackerをインストールするにはyarnが必要。
- バージョンの違いで読み込めないということも起こることがある。
久しぶりにGitHubでプロジェクト作ったらマニュアルが変わっていた件

久しぶりにGitHubでプロジェクト作ったらマニュアルが変わっていました。


![スクリーンショット 2020-12-16 21.14.28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550742/d4ca3d43-f72f-3dff-5282-5cf771ab76d6.jpeg)

以前は

```
git branch -M main
```

はなくて、pushするときは

```
git push -u origin master
```

だったはず。

ジョージ・フロイドさんの問題をはじめとしたBlack lives matterの動きの影響で、master-slaveという言葉をなくすという話があったなと思い出した。調べたら今年の６月から変わっていたらしい。

```
git branch -M main
```

は現在のブランチの名前をmainに変えるという意味になりますので、Pushするときは

```
git push -u origin master
```

となるそうです。

## 他の変更

「whitelist」→「allowlist」に
「blacklist」→「denylist」に
「master/slave」→「leader/follower」「primary/replica」「primary/standby」に
「grandfathered」→「legacy status」に
「he」「his」→「they」「their」に
「man hours」→「person hours」「engineer hours」に
「sanity check」→「quick check」「confidence check」「coherence check」に
「dummy value」→「placeholder value」「sample value」に

気をつけよ。
インストール後のパス設定。みんなどうしてる？

みなさん、こんにちは。本日のお悩み相談の時間です。

# 前書き

**「見た目は JavaScript、頭脳(中身)は Ruby、（安定感は AC/DC）」** でおなじみのスクリプト言語 [Kinx](https://github.com/Kray-G/kinx)。詳しくは Web（下記）で。

* 参考
    * 最初の動機 ... [スクリプト言語 KINX（ご紹介）](https://qiita.com/Kray-G/items/ca08b6fb40d15dd0ec76)
        * 個別記事へのリンクは全てここに集約してあります。
    * リポジトリ ... [https://github.com/Kray-G/kinx](https://github.com/Kray-G/kinx)
        * Pull Request 等お待ちしております。  

実は最近 [バージョン 0.17.0 を（プレ）リリース](https://github.com/Kray-G/kinx/releases) しまして、そこで初めてインストーラを付けてみました。[NSIS](https://nsis.sourceforge.io/) を使ってビルドしています。
<img align="right" src="https://github.com/Kray-G/kinx/raw/master/docs/InstallerWelcome.png" align="center" />

ところが、今現在はインストール後に実行ファイルへのパスを環境変数 `Path` に追加 **いたしません**。手動でパスを通してください的な。

元々環境変数 `Path` をイジるとか **おっかないなー**、というのもあったのですが、どうも NSIS で実現しようとすると問題がありそうなのですね（[この辺とか](https://stackoverflow.com/questions/31340823/update-path-environment-variable-using-nsis)）。ただ、やっぱりパスを自分で通せ、というのは心苦しいので次版では付けたいところ。

そこで、皆さんはインストーラーで環境変数 `Path` へのパスの追加/削除はどうしてますか？というのが本日のクエスチョンです。

色々調べたのですが、あんまりいいアイデアが見つからずで。一応、以下のような基準で探してました。

* シンプルなソースコード
* 使いやすい機能
* 便利なライセンス

全部満たすものはなかなか見つからず。ライセンスが書いてないものとか、GPL とか[^gpl]。

[^gpl]: 念のため、GPL が悪いものとは言ってませんので...。自分のが MIT なので採用しづらいなと。

# 結論

そこでだ、若旦那！

簡単なプログラムを作成しました。こちらをご覧ください。

* https://github.com/Kray-G/addpath

これは...

* シンプルなソースコード... **1つのファイル** だけで単機能ツールとして実現。
* 使いやすい機能... 単機能ツールなので **使い方も単純**。
* 便利なライセンス... **ザ・MIT**！（私がそう設定したのですが）

# ですが...

このプログラムはシステム環境を変更するので、**たくさんの人にソースコードをチェック** してもらいたく、**問題があれば修正** したいなーと思います。一応簡単なテストコードは含めてチェックはしてますが。

ということで、ソースコードを色々な人に見て貰えると嬉しいです。問題見つかれば大変感謝するでしょう（それ以上のことは力不足で何もして差し上げられませんが）。

もしくは、この問題（パスの追加/削除）に対するより良い解決策があれば教えてください。

ではまた。

P.S.
もし、これ (https://github.com/Kray-G/addpath) 自体気に入ってくれるようでしたら、★ください。待ってます！
外部スクリプトを参照してスコアを加算する方法

# この記事でできること
- 生成&消滅するオブジェクトに依存することなく、外部スクリプトの関数の使用によりスコアを加算することができる。

![ダウンロード (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/1e4f3ae1-93b1-7803-d185-ab9154708836.gif)

# つくりかた(準備編)
## サンプルSceneを準備する
- 下図のように、適当な配置等で舞台となるSceneを作成する。
- 参考…[unity2019LTSでスタンダードアセットのFPSコントローラだけインポートする方法](https://qiita.com/sanpeita/items/053f0ed2d19c5ad11bb9)
![b01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/ad596fcd-0ed6-e7d9-877a-47913e41436d.png)

### プレファブで弾を発射する
- 銃口(Muzzle)から弾(bullet)のクローンが発射される


```Muzzle.cs
using UnityEngine;

public class Muzzle : MonoBehaviour
{
    public GameObject bullet;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Shot();
        }
    }

    void Shot()
    {
        GameObject obj;
        //====+====+====+====+====+====+====+====+====+====+====+====+====+====+
        //Instantiate関数の第二第三引数を設定することにより、通常の銃弾のような、
        //正しい向きが求められるbulletを生成することもできます。
        //====+====+====+====+====+====+====+====+====+====+====+====+====+====+
        obj = GameObject.Instantiate(bullet, transform.position, transform.rotation); 
        obj.GetComponent<Rigidbody>().AddForce(transform.forward * 1000);
    }
}
```

### プレファブで敵を生成する
- 適当なオブジェクトにアタッチすればOK。

```EnemyGenerator.cs
using UnityEngine;

public class EnemyGenerator : MonoBehaviour
{
    public GameObject Enemy;
    private float x;
    private float y;
    private float z;

    void Start()
    {
        InvokeRepeating("Generate", 1, 1);
    }

    void Generate()
    {
        x = Random.Range(-5, 5);
        y = 1;
        z = Random.Range(-5, 5);
        Instantiate(Enemy, new Vector3(x, y, z), Quaternion.identity);
    }
}
```

# つくりかた(本題編)
## 適当なオブジェクトに、スコア加算のスクリプトをアタッチする
- スコア表示用のテキストラベルにアタッチするのが分かりやすいかもしれませんね。


```ScoreCount.cs
using UnityEngine;
using UnityEngine.UI;

public class ScoreCount : MonoBehaviour
{
    private int intScore = 0;   //スコア加算用変数
    public Text ScoreText;      //画面に表示する文字をpublic変数とする

    public void ScoreAdd()
    {
        intScore++;
        ScoreText.text = intScore.ToString();
    }
}
```

## たとえば弾に上記のスコア加算を呼び出すスクリプトを書くとこうなる
- 下記だと弾に書いたけれども、敵に書いてもよい。

```Bullet.cs
using UnityEngine;

public class Bullet : MonoBehaviour
{
    ScoreCount SCScriot;

    void Start()
    {
        //今回はCanvas内にscoreというテキストラベルのオブジェクトを作成して、
        //そこにスコア加算のスクリプトをアタッチしているので、
        //GameObject.Findで"Score"を探している。
        SCScriot = GameObject.Find("Score").GetComponent<ScoreCount>();
    }

    void OnCollisionEnter(Collision col)
    {
        if (col.gameObject.tag == "enemy")
        {
            SCScriot.ScoreAdd(); //←ここがスコア加算の呼び出し箇所。弾が敵に当たったら、スコア加算するよ、ということ。
            Destroy(gameObject);
        }
    }
}
```

- スコア加算されたかな？
[MySQL] 基本操作

# 概要 
<!-- 発端や概要を記載 -->
MySQLの基本操作のメモ（コマンド一覧）．

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [MySQLの起動方法](#起動方法)
2. [データベースの操作](#データベースの操作)
3. [テーブルの操作](#テーブルの操作)
4. [sqlFileの中身を実行する](#sqlfileの中身を実行する)
5. [テーブルをコピーする](#テーブルをコピーする)




<!-- 1. [参考文献](#reference) -->




<!-- 各チャプター -->


#起動方法

```:ターミナル
mysql -u root -p
```

→Enter password: [パスワード]



#データベースの操作

↓ データベース一覧を表示するコマンド

```:mysql>
show databases;
```

↓ データベースを作成するコマンド

```:mysql>
create database データベース名;
```

↓ データベースを削除するコマンド

```:mysql>
drop database データベース名;
```

↓ データベースを選択するコマンド

```:mysql>
use データベース名;
```
テーブルを操作するにはこのUSEコマンドで一度データベースを選択しなければならない．

#テーブルの操作
↓ テーブル一覧を表示するコマンド

```:mysql>
show tables;
```

↓ テーブルを作成するコマンド（例）

```:mysql>
CREATE table non_index_table (id INT AUTO_INCREMENT, num INT, PRIMARY KEY (id));
INSERT INTO non_index_table (num) VALUES ('7084');
INSERT INTO non_index_table (num) VALUES ('1348');
```

テーブルの作成はCREATE文を使う
データを追加するにはINSERT文を使う

CREATE table テーブル名 (カラム名 型, カラム名 型, ...);
INSERT INTO テーブル名 (カラム名, カラム名) VALUES (値, 値);

AUTO_INCREMENT は insert するたびに自動で＋１して設定してくれる．
PRIMARY KEY (カラム名)　で主キーを設定する．

↓ テーブルの中身を確認するコマンド

```:mysql>
SELECT * FROM テーブル名;
```

↓ テーブルを削除するコマンド

```:mysql>
drop table テーブル名;
```

↓ データを更新するコマンド（例）

```:mysql>
update non_index_table set num=2411 where id=1668608; 
```

update テーブル名 set カラム名１=値１ where カラム名２=値２;
（テーブル名）の（カラム名１＝値１）の場所の（カラム名２）を（値２）に更新する．



#sqlfileの中身を実行する

```:mysql>
source （sqlFile.sqlのアドレス）;
```

#テーブルをコピーする

```:mysql>
CREATE TABLE 新しいテーブル名 SELECT * FROM 古いテーブル名;
```


<!--
<a id="#reference"></a>
# 参考文献
- [リンクテキスト](URL)
- [リンクテキスト](URL)
-->
Power BI Calendarテーブルに会計年度を追加する

## DAX関数

4月始まり、3月決算の場合

```
calendar = 
ADDCOLUMNS (
CALENDAR (DATE(2018,4,1), DATE(2021,3,31)),
"会計年度", IF((MONTH([Date])>=4 && MONTH([Date])<=12),Year([Date]),Year ([Date])-1)
)
```

## 参考
[Power BIで日付テーブルを作る - Qiita](https://qiita.com/shino00/items/0f33c8d79a206cee9abd)
[Power BI（DAX）のカスタムカレンダー - 会計四半期の計算列 - powerbi、dax](https://steakrecords.com/ja/663665-custom-calendar-in-power-bi-dax-calculated-column-for-fiscal-quarter-powerbi-dax.html)
17行でTwitterのトレンドを取得する

最近は寒くなってきたので暖房をつけ始めました。

#目標
アドベントカレンダー17日目ということで、何かと話のきっかけになるTwitterのトレンドも17行で取得したいと思います。

#環境
Python 3.9.1

#準備
###①tweepyのインストール

```
pip install tweepy
```
###②Twitter APIの認証コードの取得
下のサイトが分かりやすいのでお勧めです。
<a href="https://qiita.com/kngsym2018/items/2524d21455aac111cdee">Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2019年8月時点の情報</a>

 
#実装
日本のTwitterのトレンドを50位まで表示します。

##コード全体
```trend.py
import tweepy
import random

CK="取得したConsumer Key"
CS="取得したConsumer Secret"
AT="取得したAccess Token"
AS="取得したAccess Token Secret"

auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)
api = tweepy.API(auth)

woeid = {
    "日本": 23424856
}

for area, wid in woeid.items():
    print("--- {} ---".format(area))
    trends = api.trends_place(wid)[0]
    for i, content in enumerate(trends["trends"]):
        print(i+1, content['name'])
```

##解説
ここに、<a href="https://developer.twitter.com/ja">Twitter Developer</a>のページで取得したTwitter APIの認証コードを入れます。

```
CK="取得したConsumer Key"
CS="取得したConsumer Secret"
AT="取得したAccess Token"
AS="取得したAccess Token Secret"
```

tweet範囲の設定

```
woeid = {
    "日本": 23424856
}
```

#結果
できました

```
$ python trend.py
--- 日本 ---
1 #あいつ今何してる
2 ヴリトラ
3 #にじホロ宇宙人狼
4 福原くん
5 #kuizy
6 #あなたの苦手なタイプの人間を診断
7 #三代目クリパするよ全員集合
8 梅ちゃん
9 ベストナイン
10 リア充カップル
11 ヤバめ地雷人間
12 ウェイ系陽キャ
13 根暗コミュ障
14 アランバローズ
15 スピナー
16 声の小ささ
17 存在感の薄さ
18 ガチの陰キャ
19 あがり症
20 十文字槍
21 全日本2歳優駿
22 梅原さん
23 ARASHI Widget
24 nanaoさん
25 寮母さん
26 真田の槍
27 ボクサー
28 クリスマスリリィ
29 マルタさん
30 GoToイベント
31 新刀剣男士
32 私のスコア
33 デュアリスト
34 梅原裕一郎
35 莉犬くん
36 マイナカード
37 三枝明那
38 角田裕毅
39 横浜流星
40 リリィちゃん
41 対象小中学生
42 福原さん
43 ランリョウオー
44 俳優部門
45 公立小学校
46 ルーチェドーロ
47 嵐ウィジェット
48 全学年35人学級
49 運動能力テスト
50 丸ちゃん
```

#参考
<a href="https://kurozumi.github.io/tweepy/">Tweepyドキュメント</a>
【Android】LinearLayoutの使い方

#プログラミング勉強日記
2020年12月16日
LinearLayoutを始めて使ったので、LinearLayoutとは何か・使い方を簡単にまとめる。

#LinearLayoutとは
　LinearLayout(読み方：「リニアレイアウト」)は、単純なレイアウトの1つで、子要素を縦・横の一列に並べるレイアウトである。`android:orientation`属性に`vertical`, `horizontal`を指定することでそれぞれ縦、横に並べることができる。

#LinearLayoutを使って子要素を縦一列に並べる方法
　app/src/main/res/layout/activity_main.xmlでレイアウトエディタのデザインから配置することができる。

1. パレット内にあるLayoutを選択
2. LinearLayout(Vertical)を選択
3. プレビュー画面にドラッグして配置する


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/908e14f1-f870-6308-6385-4326c35ff8d7.png)


 4.　同様にして配置したいレイアウトをプレビュー画面にドラッグする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/0c1ce78f-a16b-f910-814b-e43930054bab.png)

※この時点ではLinearLayoutにConstraintLayoutの制約がないためエラーが出ている。LinearLayoutに` tools:ignore="MissingConstraints"`を記述することでエラーを消した。(ConstraintLayoutの制約については[昨日の記事](https://qiita.com/mzmz__02/items/911398cc94c9f35b5547)で挙げている)
　

```xml:activity_main.xmlのコード
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="409dp"
        android:layout_height="729dp"
        android:orientation="vertical"
        tools:layout_editor_absoluteX="1dp"
        tools:layout_editor_absoluteY="1dp"
        tools:ignore="MissingConstraints">

        <Button
            android:id="@+id/button4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Button" />

        <Button
            android:id="@+id/button5"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Button" />

        <Button
            android:id="@+id/button6"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Button" />
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
```
最終的なデザインの画面↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/99bb513a-ff31-1260-3f15-bb0f0ddbb835.png)

要素を横に並べたい場合は、LinearLayout(Horizontal)にする。やることは縦に並べるときと同じ。

#参考文献
[縦または横一列に要素を並べるリニアレイアウト (LinearLayout)](https://android.keicode.com/basics/ui-linearlayout.php)
[Androidアプリ開発のLinearLayoutの使い方【初心者向け】](https://techacademy.jp/magazine/4455)
KEGGで任意の生物種の代謝パスウェイを確認する

## 背景
KEGG（Kyoto Encyclopedia of Genes and Genomes）は代謝パスウェイなど分子間のネットワーク情報を中心に構成されたデータベースです。対応する生物種も広く、ウェブページをクリックしていくことで、自分の関心のある生物種がどのような代謝パスウェイを有しているのか調べることができます。

## 方法
[KEGG](https://www.kegg.jp/)にアクセスし、「KEGG GENOME」をクリックします。
![KEGG__Kyoto_Encyclopedia_of_Genes_and_Genomes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/2e7288a2-1a2e-13ee-1817-f10c1ce91e89.png)

検索欄に代謝パスウェイを調べたい生物種を入力します。今回はセルロース分解菌としてよく研究されている「Trichoderma reesei」を入力しました。「Go」をクリックします。
![KEGG_GENOME_Database.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/b97d30f1-f27d-7e94-c5e9-4c0f49279427.png)

2株ヒットしました。今回は1つ目の「Trichoderma reesei QM6a」をクリックします。![DBGET_Search_Result__GENOME_Trichoderma_reesei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/eb31f88f-2405-c01d-8b08-cea47428c775.png)

この生物種の概要が表示されます。Annotation欄の「Show organism」をクリックします。
![KEGG_GENOME__Trichoderma_reesei_QM6a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/eac9d26f-8177-8b89-3dda-8d1902fe8e51.png)

「Pathway map」をクリックします。
![KEGG_GENOME__Trichoderma_reesei_QM6a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/4f6110d2-679e-9148-1eda-7c6146603f79.png)

代謝パスウェイの一覧が表示されます。セルロース分解が含まれる「Starch and sucrose metabolism」をクリックします。
![KEGG_GENOME__Trichoderma_reesei_QM6a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/62d3820a-851a-fc1c-b516-aa7af01183f4.png)

## 結果
選択した代謝パスウェイの全体像が表示されます。選択した生物種が有している酵素の遺伝子は緑色でハイライトされます。セルロースの分解酵素としてはendoglucanase[[EC:3.2.1.4](https://www.kegg.jp/dbget-bin/www_bget?tre:TRIREDRAFT_120312+tre:TRIREDRAFT_122081+tre:TRIREDRAFT_49976+tre:TRIREDRAFT_53731+tre:TRIREDRAFT_82616)]や1,4-beta-cellobiosidase[[EC:3.2.1.91](https://www.kegg.jp/dbget-bin/www_bget?tre:TRIREDRAFT_123989+tre:TRIREDRAFT_72567)]が知られていますが、どちらも有していることが分かります。EC番号はKEGG内のその酵素のページにリンクされています。
![KEGG_PATHWAY__Starch_and_sucrose_metabolism_-_Trichoderma_reesei_QM6a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/cb25e603-60b9-650e-642c-663f225e0b52.png)
![KEGG_T02991__TRIREDRAFT_120312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/6871afec-c471-1fd5-d77a-1923275e25c7.png)


同様の手順で大腸菌K-12 MG1655の「[Starch and sucrose metabolism](https://www.genome.jp/kegg-bin/show_pathway?eco00500)」を表示させると、それらの酵素を有していないことが分かります。
![KEGG_PATHWAY__Starch_and_sucrose_metabolism_-_Escherichia_coli_K-12_MG1655.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/b6be62c9-2a01-fb21-1439-7bdd9310497f.png)
ArchUnit 実践：同一パッケージからのみ呼び出されるメソッドの可視性をパッケージプライベートまたはプライベートに強制する

```
// 実行環境
* AdoptOpenJDK 11.0.9.1+1
* JUnit 5.7.0
* ArchUnit 0.14.1
```

## アーキテクチャテストのモチベーション

15 日目の [ArchUnit 実践：同一パッケージからのみ依存されるクラスの可視性をパッケージプライベートに強制する](https://qiita.com/drafts/1dc2cbce7ce9a5f400da) のメソッドへの応用。

## アーキテクチャテストの実装

```java
package com.example;
　
import com.tngtech.archunit.base.DescribedPredicate;
import com.tngtech.archunit.core.domain.JavaAccess;
import com.tngtech.archunit.core.domain.JavaClasses;
import com.tngtech.archunit.core.domain.JavaMethod;
import com.tngtech.archunit.core.importer.ClassFileImporter;
import com.tngtech.archunit.core.importer.ImportOption;
import org.junit.jupiter.api.Test;

import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.methods;

class ArchitectureTest {

    // 検査対象のクラス
    private static final JavaClasses CLASSES =
            new ClassFileImporter()
                    .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
                    .importPackages("com.example");

    @Test
    void 同一パッケージからのみ呼び出されるメソッドはパッケージプライベートまたはプライベートにする() {
        methods()
            .that()
            .arePublic()
            .and(new DescribedPredicate<>("are only called from classes that reside in same package") {
                @Override
                public boolean apply(final JavaMethod method) {
                    return method.getAccessesToSelf()
                        .stream()
                        .map(JavaAccess::getOriginOwner)
                        .allMatch(callerClass
                            -> callerClass.getPackageName().equals(method.getOwner().getPackageName()));
                }
            })
            .should()
            .notBePublic()
            .check(CLASSES);
    }
}
```
Elasticsearch > Logstash > AddFieldをネストにしたい



`[]`で囲むだけでした


```
add_field => {"[test][myNewField]" => "%{s}"}
```






https://www.it-swarm-ja.tech/ja/logstash/logstash%E3%81%AF%E3%80%81mutateaddfield%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%8D%E3%82%B9%E3%83%88%E3%81%95%E3%82%8C%E3%81%9F%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E3%82%B3%E3%83%94%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99/826846839/
1260 (Elixir 1.11.2-otp-23)

この記事は[Elixir その2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/elixir2) **21日目**です。
前日は、@mnishiguchiさんの「[[Elixir] Referenceの作り方](https://qiita.com/mnishiguchi/items/4d982a16c2448790cad4)」 でした。
6日間ありがとうございました。残りはお任せください。


---

# はじめに
- [Elixir](https://elixir-lang.org/)楽しんでいますか！
- さて、`1260`とはなんでしょうか

# 答え
- Elixir 1.11.2-otp-23にある関数の数です

# どうやって数えたの？
- [ここ](https://hexdocs.pm/elixir/)で数えました
- <font color="red">$\huge{ウソです}$</font>
    - [真っ赤なウソ](https://www.youtube.com/watch?v=kv-JZ7VSoHQ)です
- @namosukeさんの「[【クソアプリ】PHP関数名しりとり](https://qiita.com/namosuke/items/96082b5fcbd72d33a530)」を眺めておりまして、[Elixir](https://elixir-lang.org/)版を[Phoenix](https://www.phoenixframework.org/)で作ろうかとおもって、まずは関数の一覧ダ〜〜〜　とおもってどうやってリストアップしたらいいのかを調べてみました
- きっと、[Elixir](https://elixir-lang.org/)のことは、[Elixir](https://elixir-lang.org/)が教えてくれるだろう、と

# とても参考にしたページ
- [Get a list of all elixir modules in IEx](https://stackoverflow.com/questions/58461572/get-a-list-of-all-elixir-modules-in-iex)
    - Thanks!!!

# こんな感じ

```elixir
:code.all_loaded()
|> Enum.filter(fn {mod, _} -> "#{mod}" =~ ~r{^[A-Z]} end)
|> Enum.map(fn {mod, _} -> mod end)
|> Enum.reduce(%{}, fn mod, acc -> 
  Map.put(acc, mod, mod.__info__(:functions))
end)
```

## 結果
```elixir
%{
  Supervisor.Default => [init: 1],
  Module => [
    __get_attribute__: 3,
    __put_attribute__: 4,
    add_doc: 5,
    add_doc: 6,
    check_behaviours_and_impls: 4,
    compile_definition_attributes: 6,
    concat: 1,
    concat: 2,
    create: 3,
    defines?: 2,
    defines?: 3,
    defines_type?: 2,
    definitions_in: 1,
    definitions_in: 2,
    delete_attribute: 2,
    eval_quoted: 2,
    eval_quoted: 3,
    eval_quoted: 4,
    get_attribute: 2,
    get_attribute: 3,
    has_attribute?: 2,
    make_overridable: 2,
    open?: 1,
    overridable?: 2,
    put_attribute: 3,
    register_attribute: 3,
    safe_concat: 1,
    safe_concat: 2,
    spec_to_callback: 2,
    split: 1
  ],
  Inspect.Atom => [__impl__: 1, inspect: 2],
  Inspect => [__protocol__: 1, impl_for: 1, impl_for!: 1, inspect: 2],
  Access => [
    all: 0,
    at: 1,
```

## 数を数えてみよう

```elixir
:code.all_loaded()
|> Enum.filter(fn {mod, _} -> "#{mod}" =~ ~r{^[A-Z]} end)
|> Enum.map(fn {mod, _} -> mod end)
|> Enum.reduce(%{}, fn mod, acc ->
  Map.put(acc, mod, mod.__info__(:functions))
end)
|> Enum.reduce(0, fn {_, funs}, acc -> acc + Enum.count(funs) end)
```

- 一回マップにする必要はありませんが、まあ、さっきのプログラムを利用して足してみましたですよ

# Wrapping Up :christmas_tree::santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5::christmas_tree:
- [Elixir](https://elixir-lang.org/)でわからないことがある場合は、英語でググると答えがすぐみつかるよ
- [:code.all_loaded/0](https://erlang.org/doc/man/code.html#all_loaded-0)ってそういえば以下の記事で使っていました
    - [「kentaro/mix_tasks_upload_hotswap」を試してみる！　ご本人が参加していらっしゃるカレンダーにて](https://qiita.com/torifukukaiou/items/6adf153ee3893fd1ad4d)
    - 2回目なのでようやく私の中で定着してきました
- Enjoy [Elixir](https://elixir-lang.org/) !!! :rocket::rocket::rocket:
Parallels + USキーボード + ATOKでの日本語切り替え

macOSでUSキーボードを使用する場合、日本語変換を**Command+スペース**で切り替えている方が多いと思います。
Parallels上でWindowsも動かす場合、デフォルトでは**alt+`**が日本語切り替えとなっているため、macOSと同様にCommand+スペースで切り替えられる様、以下の通り設定するのが便利です。
自分は日本語変換にATOKを使っているため、ATOKでの設定変更をご紹介します。

##1．　Parallels環境設定より
###macOSシステムショートカット
macOSシステムショートカットを送信する：「常に」を選択。
![スクリーンショット 2020-12-16 20.00.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128611/50451550-983f-16a0-5ea3-2db8aa53b71d.png)
###仮想マシン Windows10
画面下＋ボタンを押して、
・選択前：Cmd＋Space
・選択後：Ctrl+Space
を選択し、プロファイルリストに追加する。
![スクリーンショット 2020-12-16 20.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128611/1e5d2665-364c-77dc-8a3a-88f93f0acb03.png)

##2.　ATOKメニュー　プロパティ（環境設定）より
ATOKメニュー→プロパティ（環境設定）→キー・ローマ字・色　からATOKキーカスタマイズを選択。
日本語入力ON/OFFで**Ctrl+スペース**にキーを変更する。

![atok.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128611/cd5ec76a-0939-cc6c-5cf2-ac3e54f38f89.jpeg)
pythonでfirestoreのデータを更新するときにハイフンを含むフィールド名を使いたい場合

前回も解決方法がわからなかって探し回ったので、簡単にgoogle検索でヒットするようにqiita記事を書く。
QiitaのSEOを間借り。

# TL;DR
バッククォートで囲む！

```python
db.collection('users').document('AAAAABBBBB').update({
   u"status.`xxxx-yyyyy-zzzz`": "hogehoge"
})
```

# 解説
いつものノリで下のようなコード書くと詰む。

```python
db.collection('users').document('AAAAABBBBB').update({
   u"status.xxxx-yyyyy-zzzz": "hogehoge"
})
```

```
ValueError: Non-alphanum char in element with leading alpha: xxxx-yyyyy-zzzz
```

# 参考
https://github.com/googleapis/google-cloud-python/issues/8086
【vim】vimとおしゃべりする Level 1

## はじめに
この記事は、vimを使い始めてノーマルモードとインサートモードの違いがわかった！ぐらいの初学者に向けて書いています。
特に、ノーマルモードの存在価値について疑問に思っている人のための記事とでも言っておきましょう。

## 前置き
ノーマルモード内のvimのコマンドは単語が一文字に圧縮された文章です。
例えば、`dw` これは`delete word`です。
このように、動詞＋目的語で構成されているので、なにか実行したい作業があったら、それを頭の中で唱えると自ずと指が動くようになるのです。
たまに脳死状態のときは`dwdwdwdwdwdw`みたいなことはしてしまいますが。

ちなみに、vimはマウスや矢印キーまでに手を伸ばしたくない究極に怠惰、もしくは一分一秒を無駄にしたくない効率優先至上主義の方たちのためのエディタです。

というわけで、段階的に覚えていきましょう！

## レベル1
\*例に出てくる`|`はカーソル位置です。

## 動詞
`d` : delete ノーマルモードのままで消す
`c` : change　消したあとにインサートモードへと移行
`y` : yank(copy)　コピー
これらの動詞は重ねる(`dd`や`cc`)などすることで、行に対してそのアクションを行えます。
さらに大文字にすると(`D`や`C`)カーソルより右に対してその動作を行ってくれます。

``` C++
Hello W|orld  // D
Hello W|      // Normal Mode

Hell| World  // C
Hell|        // Insert Mode

```

`f` : find 次の文字を見つける


## 副詞
`i` : inside
`a` : all

## 名詞
このあたりはノーマルモードの時に単体で使うと移動手段となります。
`w` : word 
`b` : back つまりwordの逆です。
`e` : end

``` C++
// 移動方法として
He|llo World // w
Hello |World

He|llo World // b
|Hello World

He|llo World // e
Hell|o World // e
Hello Worl|d 

He|llo World // 2e
Hello Worl|d


```

### 移動方向 (ノーマルモードで矢印キーなんて使ってたらどやされますよ。)
ホームポジションから動かずとも移動するため。
`h` : 左
`j` : 下
`k` : 上
`l` : 右

移動場所の視覚化

``` C++
gg


            k
^          h|l              $
            j



G
```
<details><summary>【応用問題】任意の場所からファイルの中身全消しはどうやって行うでしょう？</summary>
答え: `ggVGd` (visual modeのものが入ってましたすみません。ちなみに最後のdはyに変えるとコピーになります。
</details>

 
## 副詞 + 目的語のみで使える目的語
`"` : "" -> 例) `di"`で`"hello| world"` + `di"` -> `""`
`[], {}, '', (), <>`などもすべて使えるのでありとあらゆる囲うものすべてと考えてよいです。
**XML系(HTML, XML等)で作業中の人へ**
`<element>this will| be deleted</element>` + `dit` -> `<element></element>`なんてこともできます。
ここのtはtagのtです。

```C++

"Foo B|ar" // di"
""  // Normal Mode

"Foo Ba|r" // ca"
|      // Insert Mode

```


## ノーマルモードからインサートモードへのスムーズな切り替え
`i` : insert カーソルの左側からインサートモードへ入ります。
`a` : append カーソルの右側からインサートモードへ入ります。
`I` : 行の頭からインサートモードへ入ります。
`A` : 行の末尾からインサートモードへ入ります。
`o` : 改行してからインサートモードへ入ります。
`O` : 上に改行してからインサートモードへ入ります。
文字にしてもちょっと覚えにくいので視覚的に覚えましょう

``` c++
O    
I                i|a            A
o    
```

### プラスアルファで余力のある方へ
`s` : カーソルの下にある文字を消してインサートモードへ
`S` : カーソルのある行を消してインサートモードへ　(`cc`と挙動は一緒？)

## 一旦終了(2020/12/16)
需要があれば、随時書き足していきます。
ACON 例のルーターの設定方法

全面パネルのCONコネクタに付属のDSUB9ピン-RJ45ケーブルをつなぐ．
TeraTermで繋いで，Enterを押すとログイン・プロンプトが出る．
デフォルトの設定は9600,1N1
admin:admin
でログインできる．

モードが色々ある．コマンドで切り替える．
モードの違いはプロンプトで判別可能

まずは
`enter`

次に
`config`と打つとconfigモードになる
DHCPサーバを止めるには，
`no ip dhcpd enable`と打つ
稼働させるには，
`ip dhcpd enable`
直ちにサービスは停止するが，再起動すると設定が戻ってしまう．
電源を切る前に`write`しておく．



```
router> enter
Password: <enter password>
router# config
router_config# interface G0/0
router_config_G0/0# quit
router_config# quit
router#
```
高校生がFFT(高速フーリエ変換)を理解してみた【第0回】

#はじめに
初めて記事を書きます。
FFTを軽く理解したので備忘録として書きます。わかりづらかったらごめんなさい。
第0回ということでとりあえず目次と概要だけ書きます。
##著者のステータス
高専3年生(実質高校生)
Python民

##FFTの概要
###FFTの位置づけ
FFTは高速__フーリエ変換__の略であり,英語で(__F__ast __F__ourier __T__ransform)と呼ぶため, その頭文字をとったものです。フーリエ変換に関係しています。

もう少し詳しく書くと、フーリエ変換は, 連続フーリエ変換と離散フーリエ変換に分かれていて, 離散フーリエ変換を高速化したものが高速フーリエ変換です。

##本記事の内容(今後の予定)
[【第1回】単純なモデルを解いてなれる]
(https://qiita.com/nekoMIMI_CatEye/items/7082f58cfcdeac5bddab)
[【第2回】連続フーリエ変換の導入part1](https://qiita.com/nekoMIMI_CatEye/items/dbc0a90221dcd7c7cd73)
[【第3回】連続フーリエ変換の導入part2]
(https://qiita.com/nekoMIMI_CatEye/items/dfbcc60da3b05563605e)
【第4回】連続フーリエ変換の導入part3
【第5回】連続フーリエ変換とはpart1
【第6回】連続フーリエ変換とはpart2
【第7回】そして離散フーリエ変換へ
【第8回】高速フーリエ変換とは
【第9回】さらなる高速化に向けて
【第10回】いざFFTの実装へ
【Power BI機能速報】Power BIデータセットおよびAnalysis Services用のDirect Query がプレビュー

# Power BIデータセットおよびAnalysis Services用のDirect Query がプレビュー

## 速報

超重要機能がプレビューされたので速報記事として紹介いたします。  
先月プレビューの予定が延期されていたのでひやひやしていましたが、ようやく触れました。
現時点ではPower BI Blogは確認できておりません。

(2020年12月16日時点の情報)

## Power BI プレビュー機能のPower BIデータセットおよびAnalysis Services用のDirect Query とは

すでに定義済みのデータモデルを参照して新しい情報を追加したモデルを作成できる機能です。

ロードマップの記事では、[Power BI データセットと Azure Analysis Services に対する複合モデル](https://docs.microsoft.com/ja-jp/power-platform-release-plan/2020wave2/power-bi/direct-query-over-power-bi-azure-analysis-services?fbclid=IwAR0WomySC8cK-4Gi5bK77PCKyn50qSJJqQYSFZPf2WQQt7H9_pyDjz3DQCo)と題されています。

![](https://docs.microsoft.com/ja-jp/power-platform-release-plan/2020wave2/power-bi/media/composite-models.jpg)
上記記事より引用

これを利用することで、IT部門が提供する、大規模なエンタープライズBIモデルに対して、個人で準備したモデルやデータを組み合わせるといったBI活用の形が生まれます。(=エンタープライズBIとセルフサービスBIの複合化)

## おためし方法

### 前提条件

現時点ではマイワークスペース上のモデルを組み合わせることはできないようです。  
つまり、Pro ライセンスもちのユーザ向け機能となります。

### 2020年12月版をインストールしてPreview機能をon

![01_preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ecfa5326-d76a-5aca-6103-014be852089b.png)


ちなみに、詳細情報のリンクはまだnot foundとなります

### 追加するモデルを取得（Power BI の場合）

すでにローカルで作成しているモデル、あるいはPower BI サービス ワークスペース上のモデルを使ったPower BI desktop上で、データを取得からPower BI Datasetを選択して、すでに共有されているデータセットを選択します。

![02_getdata.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2fa8de0e-588b-5af9-b9a8-2952f3aa358b.png)



Analysis servicesの場合は、Analysis Servicesのデータソースを選択しましょう

### 結果

私は手元でサンプルデータセットのxlsx もしくは Azure SQLのデータをインポートした状態で、Power BI データセットを二回同じものを追加してみました。
ローカルのデータ+Power BIデータセット、追加したデータセット同士という形でリレーションシップを組むことができることがわかります。

赤ヘッダーと青ヘッダーが追加したPower BI サービス上のデータセット

Excel×Power BI データセット×2
![03_models.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f5fba9a1-520e-59b1-d279-ff55956dc416.png)


SQL Server×Power BI データセット×2
![03_models_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3171af58-b0c4-2827-3e88-c484e5cdbfa5.png)


以降はSQL Server×Power BI データセット×2で説明します

追加したデータセットの中のリレーションシップは変更できず、メジャーはカプセル化された状態になっています。（＝提供したデータセットを改変されない状態）

リレーションシップの内容は確認できるが、変更不可となっている
![rs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/aab6daaa-6048-3112-9df6-ed2661fc9656.png)


リレーションシップは変更できませんが、データセットを組み合わせた状態の新しいデータセットという扱いになるので、新しくメジャーを作ったりテーブルの名称を設定できます。

作成したデータセットはマイワークスペースや、ワークスペースに発行することができ、リネージはこのような状態になります。

![05_linege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/678c8245-dad3-e12a-d44d-ecc6bd0e2af5.png)


データセットの更新設定はこんな感じ  
※SQLDBの認証設定いれていないので余分な警告でています

![06_dataset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/4d8536de-328b-32d4-1525-166bbec94610.png)
railsでグラフ機能を導入

##はじめに
今回学習記録をとるアプリ開発をしていたところ学習状況をグラフ化したい！
と思い比較的簡単に実装ができたので備忘録として残します。
筆者はrails6を使っての実装となります。
初学者のため間違え等ありましたらご指摘頂けると幸いです！


## 手順１ gem chartkickを導入
グラフ機能を簡単に実装するにはgemのchartkickを使います。
gemファイルに以下を追加しbundleinstallします。
groupdateはDBから様々な情報をグループ化して取り出せる便利なメソッドがあるので導入してますが、chartkickを使うだけであればgem "chartkick"のみで問題ありません。


```
gem "chartkick"
gem "groupdate"
```
rails6の場合は以下コマンドを実行

```
yarn add chartkick chart.js
```

##手順２ jsファイルの読み込み
chartkickではjsを使って実装するためjsファイルをapp/javascript/packs/application.jsに記述します。
rails6の場合

```
require("chartkick")
require("chart.js")
```
rails5の場合

```
//= require chartkick
//= require Chart.bundle
```

##手順３　htmlにグラフを挿入
ここまで行けばあとは公式ページにあるサンプルコードをhtmlに記述するだけで簡単にグラフを作成する事ができます。
私の場合このように使いました。
<%= column_chart @tweets.group_by_day_of_week(:created_at, format: "%a").count %>
https://gyazo.com/4c24263ba93c7e3bc2ea6974bfb0143f
ここでgroup_by_day_of_weekはgemのgroupdateを導入していると使えるメソッドです。
今回使ったのは棒グラフですが他にも折れ線や円グラフも簡単に実装できるのでchartkickの公式サイト見て見てください！！
索引

## 索引用

#### 統計
回帰分析（最小二乗法）
・https://qiita.com/roadto93ds/items/98af8b61f6ab52721fd4

#### pandas
dataframe読込
・https://qiita.com/roadto93ds/items/25e22d0e61e26a92c6a0
操作
・https://qiita.com/roadto93ds/items/ce1e81024ee273f07fc4
結合
・https://qiita.com/roadto93ds/items/44eac7c725eac0a6b6a4
統計量
・https://qiita.com/roadto93ds/items/0161c697317c06fd8ba3

#### numpy
・https://qiita.com/roadto93ds/items/c035a513c51560a333a8

#### visualization
ヒストグラム
・https://qiita.com/roadto93ds/items/0d717dd6043cc3821103
散布図
・https://qiita.com/roadto93ds/items/c31b5cd678c2069c327e
円グラフ
・https://qiita.com/roadto93ds/items/02d81a169237d32e0d58
箱ひげ図
・https://qiita.com/roadto93ds/items/10b62f0fa8b77fce0069
折れ線グラフ
・https://qiita.com/roadto93ds/items/31139ff832831cd5ed51
平行座標プロット
・https://qiita.com/roadto93ds/items/fc1901dedd44c5bdbead

#### 方程式とアルゴリズム
ニュートン法(1変数)
・https://qiita.com/roadto93ds/items/476d84c94410edfe5b10
ニュートン法（2変数）
・https://qiita.com/roadto93ds/items/0bf5679e8b0d819b0422
セカント法(1変数)
・https://qiita.com/roadto93ds/items/6dbbf4fe6e3b83e44498
セカント法（2変数）
・https://qiita.com/roadto93ds/items/689d8486ac65606c9396
ニュートンラフソン法（ロジスティック回帰分析）
・https://qiita.com/roadto93ds/items/5fddd145ac63dfd297f1


#### お薬？？
RDKit ChEMBL
・https://qiita.com/roadto93ds/items/85b7967987864d2bd7b1

#### その他
word2vec
・https://qiita.com/roadto93ds/items/96ad722387b6dcd3b4e7


#### R_memo
##### 適合度検定
離散一様分布に従うか
・https://qiita.com/roadto93ds/items/16b2c80ad32765f47697
ポアソン分布に従うか
・https://qiita.com/roadto93ds/items/ba37976970f9c27e5ced
Splunk 新しいEval(JSON関連）

Splunk Docsの[Eval Functions](https://docs.splunk.com/Documentation/Splunk/8.1.1/SearchReference/CommonEvalFunctions)をみていると、見慣れないものを見つけたので紹介します。:sweat:言い方

#JSON Functions
https://docs.splunk.com/Documentation/Splunk/8.1.1/SearchReference/JSONFunctions
JSONが`spath`以外でいろいろと扱えるようになっている。

##json_set
```javascript:json_set_sample.spl
index=_internal | head 1 | fields _raw
| eval _raw="{\"event_type\":\"Threat_Event\",\"ipv4\":\"127.0.0.1\",\"hostname\":\"pc_name.local\",\"occured\":\"01-Dec-2017 22:24:34\",\"severity\":\"Warning\",\"threat_type\":\"potentially unsafe application\"}"
| eval _raw=json_set(_raw,"ipv4","192.168.0.1")
```

	
<sample>{ [-]
   <font color=red>event_type</font>: Threat_Event
   <font color=red>hostname</font>: pc_name.local
   <font color=red>ipv4</font>: 192.168.0.1
   <font color=red>occured</font>: 01-Dec-2017 22:24:34
   <font color=red>severity</font>: Warning
   <font color=red>threat_type</font>: potentially unsafe application
}</sample>
と最初の`ipv4: 127.0.0.1`を`ipv4: 192.168.0.1`に変更している。

##json_extract
```javascript:json_extract_sample.spl
index=_internal | head 1 | fields _raw
| eval _raw="{\"cities\":[{\"name\":\"London\",\"Bridges\":[{\"name\":\"Tower Bridge\",\"length\":801},{\"name\":\"Millennium Bridge\",\"length\":1066}]},{\"name\":\"Venice\",\"Bridges\":[{\"name\":\"Rialto Bridge\",\"length\":157},{\"name\":\"Bridge of Sighs\",\"length\":36},{\"name\":\"Ponte della Paglia\"}]},{\"name\":\"San Francisco\",\"Bridges\":[{\"name\":\"Golden Gate Bridge\",\"length\":8981},{\"name\":\"Bay Bridge\",\"length\":23556}]}]}"
| eval "San_Francisco1"=json_extract(_raw,"cities{2}")
| eval "San_Francisco2"=spath(_raw,"cities{2}")
```
`spath`と同じ感じで使える。

##json_array
```javascript:json_array_sample.spl
| makeresults
| eval ponies = json_array("buttercup", "fluttershy", "rarity")
| eval 
```
アレイはこれで。

##json_object
```javascript:json_object_sample.spl
index=_internal | head 1 | fields _raw
| eval _raw = json_object("ponies" ,json_array("buttercup", "fluttershy", "rarity"))
```

<p>{ [-]
<font color=red>ponies</font>: [ [-]
     <font color=blue>buttercup</font>
     <font color=blue>fluttershy</font>
     <font color=blue>rarity</font>
   ]
}</p>

あとは[lookup](https://docs.splunk.com/Documentation/Splunk/8.1.1/SearchReference/ConditionalFunctions#lookup.28.26lt.3Blookup_table.26gt.3B.2C_.26lt.3Bjson_object.26gt.3B.2C_.26lt.3Bjson_array.26gt.3B.29)があるけど、うまくいかない・・・:cry:

#まとめ
`makeresults`と同様にJSONもこれでいろいろと作れるようになりました。

リリースノートに載っていなかったので見逃していました。:sweat:

Happy Splunking!