OmniAICreator/Qiita-1.07M huggingface dataset:
AzureMachineLearningStudioを使用した学習の振り返り

#はじめに
昨年末～今年春ぐらいまでにかけて、実施したUdemyの機械学習関連講座の学習に、AzureMachineLearningStudioを使用した際の振り返りです。

#スキルレベル
+ Python初心者　Udemyで初めて「jupyter notebook」を知った程度
+ Linux初心者　コマンドを少し知っている程度

#なぜAzureMachineLearningで実施しようと思ったか
+ 自分のPCがあまりに非力で、GPUとかも使用できない。
+ 2019年12月のIgniteで、AzureMachineLearningの話が出ていて興味があった。
+ Azureは使用できる環境を持っていた。
+ その他のサービスを知らなかった。

#使用方法
1. 以下に、ログイン。<br>
https://ml.azure.com/
1. 最初にコンピューティングから実行するVMを作成する。<br>
作成されたマシンは、自動で開始状態となる。<br>
節約のため、未使用時には、VMを停止しておく。
GPUを利用したいときには、こちらでコンピュータリソースを変更する。<br>
当時は、通常のAZURE仮想マシンを作成する画面で、その中からCPU/GPU等も選択しないといけなかったですが、現在は以下の画面用に選択しやすくなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418815/053ea354-b382-4a99-387c-57755fa30478.png)
1. Notebooksで、新規作成し、作成したコンピューティングリソースから選択して使用をする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418815/bd832baa-cf61-9e7c-d39d-a8eba5d8cf47.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418815/52b38564-41b4-6420-1a6b-b4e59da2054c.png)

#当時苦労したこと
+ 学習コンテンツのTensorflowのバージョンが1.14なのに、Azure上の環境が2.0だった。<br>
→ 「ターミナルを開く」からターミナルを開いて、つたない知識で
Tensorflowをインストールすることができた<br>
`pip install tensorflow==1.14`<br>
→ コマンドでの実行もそのターミナルから実施できた。
+ サービス自体の動作が不安定であった。<br>
ComputeのStartとStopがエラーで実行出来なくなることが良くあった。
→ 再ログインや日を置いての実行をしていた。
+ ノートブックにて、Jupyterで編集しようとすると、504 Geteway Time-out となって使えなかった。<br>
→　AzuleMLからログアウトして、複数アカウントでのログインを全て破棄。ブラウザも再起動。
さらに、作成した仮想マシンを再起動したら再起動中のままになってしまったので仮想マシンも作り直し対応。
+ 作成できるVMのサイズがAzure側の設定で変更されていて、作成したいサイズがなくなっていた。<br>→　仕方ないので、別のサイズで対応。
+ 色んな条件のVMを作成していたら、VMが作成できなくなった。<br>
→作成できるVM の合計コア数の上限エラーであった。リージョンあたり20であったため、使用頻度の少ないVMを削除。

#当時感動したこと、良かったこと。
+ GPUが使用できた、GPUの威力が実感できたこと。<br>
6万のテストデータで、CNNをお試し実行した際に、CPUだと120秒かかったものが、GPUだと8秒だった。
+ クラウド環境なので当たり前ですが、場所や使用するPCを気にせず実行できたこと。<br>会社のPCでも自宅のPCでも、インターネットにつながりml.azureにアクセスできれば使用できた。当時は非常にありがたい環境でした。
+ 学習し、作成した各種PythonのプログラムもAzureMachineLearning上に保存できるので、便利でした。

#おわりに
春以降、機械学習については、[courseraの「Machine learning」](https://www.coursera.org/learn/machine-learning)講座を受講してみたりしたが、AzureMachineLearningについては、春以降利用できていない。またAzureMLの利用も
進めていけたらと思います。今後は、業務DBのデータを利用したMLを実施していきたいです。
（まったく話変わりますが、上記coueseraの講座非常に有意義でした。）

※記載内容に誤りや不適切な文言ありましたら、ご指摘いただけますと幸いです。
　ありがとうございました。
情報処理安全確保支援士試験に合格しても情報処理安全確保支援士を名乗ることはできないらしい

#はじめに
令和２年度秋期試験情報処理安全確保支援士試験に合格しました．
![EqEWzo4VgAAPwjz.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473717/13180d04-776e-5b26-a6c1-75a59c1f38db.jpeg)
受験番号って特に隠さなくても問題ないよね・・・？

昨年応用情報を取得し記事も書いたのですが，その直後(春期試験は中止だったので)の試験回で取得できて安心しています．不合格だったらまた半年待たなければならず辛いですからね…

雑多ですが昨年の記事ももしよければ．
・[令和元年度秋期応用情報技術者に合格しました](https://qiita.com/macaroni10y/items/16fd7838568f9ec3d887)

#情報処理安全確保支援士試験に合格しても情報処理安全確保支援士を名乗ることはできない
題名がすごく長くなりましたが，この通りです．
###情報処理安全確保支援士とは
「サイバーセキュリティに関する専門的な知識・技能を活用して企業や組織における安全な情報システムの企画・設計・開発・運用を支援し、また、サイバーセキュリティ対策の調査・分析・評価を行い、その結果に基づき必要な指導・助言を行う者」である(引用：[IPA 制度の概要](https://www.jitec.ipa.go.jp/1_11seido/sc.html))．

応用情報，各種スペシャリストなどは試験に合格したらその名称を名乗ることができます．身近な例でいうと，その名称のもと業務を遂行したり，あとは名刺に記載するとかでしょうか．
しかし，情報処理安全確保支援士と名乗るには試験合格だけでは不十分です．なぜなら，情報処理安全確保支援士は**登録制の国家資格**であり，**名称独占資格**だからです．

###名乗るには
情報処理安全確保支援士を名乗る(登録資格の取得及び維持)には所定の手続きが必要になります．
　1. 情報処理安全確保支援士試験に合格
　2. 申請書類を揃え，IPAに申請(初期費用19,700円)
　3. 1年に1回のオンライン講習(6時間，受講費用20,000円)
　4. 3年に1回の集合講習(7時間，受講費用80,000円)

つまり情報処理安全確保支援士を名乗り続けるには，3年で14万円が費用として必要になります・・・うせやろ！？
ちなみに情報処理安全確保支援士でない者が資格名称を使用した場合，**30万円以下の罰金**が科せられます．

###登録しない場合
登録するしないは自由なので，合格時点で登録しない人向けにポイントを書いておきます．

#####試験合格後の登録期限は無い
合格後ならいつでも登録手続きは行うことができます．会社が登録費用を負担してくれることになるまで保留したり，資格が必要になったときに登録するのも可能ということですね．
#####名乗れる名称(名刺などへの記載)
「情報処理安全確保支援士」を名乗れないだけなので，試験合格をアピールしたい！という場合は以下の記載方法があります．
　　　- 〇〇〇〇年 情報処理安全確保支援士試験 合格
　　　- 平成〇年度〇期 情報処理安全確保支援士試験 合格
　　　- 情報処理安全確保支援士試験 合格
　　など

# 勉強法
本題とは外れますが僕の勉強法を軽く紹介しておきます．もちろん知識の定着は実感しましたが，あくまで試験合格を目標としての勉強になったのかなという印象です．
試験の概要や形式についてはIPAのサイトを参照いただけたらと思います．(https://www.jitec.ipa.go.jp/)
###1. 概要，知識定着
まずは参考書で知識を定着させました．
使用した参考書は技●評論社様の「情報処理安全確保支援士合格教本」です(※回し者ではない)．こちらを使用した理由は，昨年応用情報の際にも使用したシリーズであり，なんとなく慣れていたほうが良いかと思ったからです．他社さんの参考書と比較していないので長短はわかりかねます．
　・サイバー攻撃
　・セキュリティ技術
　・セキュリティマネジメント
などの項目に加え，不可欠であるネットワーク分野もまとめてあったので読み込みました．

###2. 午前対策
以下のサイトの過去問演習をひたすら繰り返しました．
・[情報処理安全確保支援士ドットコム](https://www.sc-siken.com/) 様

IPAの試験の午前問題は**約半数が過去に出題された問題**，もしくは類題です．この試験の午前2は25問なので，単純計算で12~13問は過去問に存在することになります．
つまり，過去問を完璧にすれば理論上50点は貰ったも同然です(※理論上は)．
残りの半数は1.で得た知識で解く必要がありますが，合格点は60点なのでひたすら過去問を演習することで十分カバー可能だと思います．

###3.午後対策
IPAが過去問を公開しているので，午後1,午後2ともに8期分(4年分)ほど解きました．
苦労した点は，問題自体の難しさに加え，長文読解です．特に午後2は問題文だけで10ページにわたることがあり，知識もさることながらある程度の集中力も必要になります．
これは慣れるしかないので，過去問を解くに限ると思います．午後2の長さに慣れてしまえば，午後1を読み解くのは全く苦にならないでしょう(ただし，午後1のほうが特定の分野や技術をテーマとした問題が多く，選択問題の取捨選択も重要になるでしょう)．

また，1.で紹介した参考書の巻末に過去問及び解説が10問ほど載っていたので，こちらも解いては解説を読み，といった風に活用しました．
IPAのサイトには午後の解説までは載っていないので，必要に応じて参考書や解説サイトの解説を熟読して問題の傾向や解答パターンを染みこませたいものです．

#さいごに
情報処理安全確保支援士試験は他の高度試験とは違い，**毎期**(半年に一回)開催されます．
次回は4月の春期試験の予定なので，今からでも十分間に合うと思います．資格登録を行うかどうかはさておき，知識の定着や実力証明のために受けてみるのもいいのではないでしょうか．
果たして僕が資格登録する日は来るのだろうか・・・

そしてお読みいただきありがとうございました．何かありましたらご指摘などよろしくお願いします．
git Setting

## gitignore
- 下記のコマンドで `.ingonre` ファイルを作成

```
$ touch gitignore
```

> **サンプルファイル**
> https://github.com/github/gitignore

## ショートカット

`.gitconfig` ファイルに好きなコマンドを追記

```
// ファイル
/Users/<user name>/.gitconfig

// 内容
[alias]
st = status
co = checkout
br = branch
```
AutowareのROSBAGデモを動かす

前段：UbuntuにAutoware Dockerがインストールされている状態
https://qiita.com/atsuto/items/a99296bbd687928967bd

基本的には下記の公式のページに沿って進めるが、一部違いがあった。
https://gitlab.com/autowarefoundation/autoware.ai/autoware/-/wikis/ROSBAG-Demo

# デモデータのダウンロード
ホストPC側のshared_dirにサンプルデータをダウンロードする。こうすることでコンテナの作り直しの度にダウンロードする必要がなくなる。

```bash:ホストPC
$ cd ~/shared_dir
$ wget https://autoware-ai.s3.us-east-2.amazonaws.com/sample_moriyama_data.tar.gz
$ wget https://autoware-ai.s3.us-east-2.amazonaws.com/sample_moriyama_150324.tar.gz
```



# 指定のフォルダに解凍
ここが自分はハマった。
どこのフォルダでもいいだろうと思ったが.autowareフォルダ（autowareフォルダではない、隠しフォルダを自分で作る必要がある）に保存しないと動かなかった。

ホストPC側のフォルダをマウントしているshared_dirから、ダウンロードしておいたサンプルデータをコピーする。

```bash:Docker内
$ cd ~
$ mkdir .autoware
$ cd .autoware
$ cp ~/shared_dir/sample_moriyama_* .
$ tar zxfv sample_moriyama_150324.tar.gz
$ tar zxfv sample_moriyama_data.tar.gz
```

# Autowareを動かす
普通に。

```
$ cd ~/Autoware
$ source install/setup.bash
$ roslaunch runtime_manager runtime_manager.launch
```

# シミュレーションタブで.bagファイル指定
上記で保存した.bagファイルを指定して読み込む。

# RVizでConfig読み込み
公式ページと違い、下記にファイルがあった。
ここも間違いやすいので注意。configフォルダでなくlaunchフォルダの中にある「default.rviz」を選択する。

```
/home/autoware/Autoware/src/autoware/documentation/autoware_quickstart_examples/launch/rosbag_demo/default.rviz
```

# Mapファイルの指定
公式ページと違い、下記にファイルがあった。

```
/home/autoware/Autoware/src/autoware/documentation/autoware_quickstart_examples/launch/rosbag_demo/my_map.launch
```

その他
・Sensing tabでvoxel_grid_filterを選択
・Computing tabでnmea2tfpose と ndt_matching を選択

# Rvizで表示
ARMの各パスの左の紫色のボタンが重要。マップが表示されなかった際、シミュレーターをポーズした状態で、Mapの紫ボタンをオフオンしたりすると表示された。Sensing、Localizationまでオンすれば自己位置推定されて、追従してマップ上を車が走り始めた。
![Screenshot from 2020-12-29 13-19-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80263/6466cd0d-e11c-76ee-26eb-50f9d5183f24.png)
![Screenshot from 2020-12-29 13-23-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80263/a1812de5-5220-d2a4-730d-780fd83553bf.png)

マップがうまく読めない際はこのへんを参考に：https://qiita.com/k-koh/items/90647b1cb140b4b75c91#autoware-rosbag-demo%E3%82%92%E5%AE%9F%E8%A1%8C

# 参考
https://griffonmk.hatenablog.com/entry/2020/11/24/000517
variable and method

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# 変数(variable)

ruby の変数は型宣言 (C ならば int, char 等) が不要.

例えば, 変数への代入は

```ruby
name = 'Rudy'
```

でできる．


## 例題

引数 ARGV[0] を引数 name に代入して

    > ruby name_variable.rb Rudy
    Hello Rudy.

と返す name\_variable.rb を作成する.

まず, name に ARGV[0] を代入する\#+beign\_src rubyname = ARGV[0]\#+end\_srcそして, 出力させるために\#+beign\_src rubyputs "Hello #{name}."\#+end\_srcとすると

    > ruby name_variable.rb Rudy
    Hello Rudy.

と出力される.


# method

Rubyでは関数 (function) は method を定義(definition)することになる．

methodは0個以上の引数(argument)を取ることができる．例えば

```ruby
def hello(name)
  p name
end
```


## 例題

    > ruby hello_method.rb Rudy
    Hello Rudy.

と返す hello\_method.rb を作成する．

まず, name に ARGV[0] を代入する．

```ruby
name = ARGV[0]
```

次に hello メソッドを呼び出す

```ruby
name = ARGV[0]
hello(name)
```

しかし, これでは hello メソッドが宣言されていないのでエラーがでる.だから, 引数1つの hello メソッドを作成する.

```ruby
def hello(name)
  puts "Hello #{name}."
end
name = ARGV[0]
hello(name)
```

これで

    > ruby hello_method.rb Rudy
    Hello Rudy.

と出力される.


# 参考ページ

[チャート式ruby-II(variable and method)](https://qiita.com/daddygongon/items/c51f3e0695174bb3c508)



------
 - **source** ~/grad_members_20f/members/djj31370/c2_name_method_hello.org
Rubyの変数と関数(メソッド)

\![macOS-11.1](<https://img.shields.io/badge/macOS-11.1-brightgreen>) \![ruby-2.7.2p137](<https://img.shields.io/badge/ruby-2.7.2p137-brightgreen>) 


# Preface (はじめに)

本記事はマルチスケールシミュレーション特論の第6回に関連する記事です. 
[チャート式Ruby](https://qiita.com/daddygongon/items/6f38d9a04e127a7952a7)に従って進めていきます.

今回は[チャート式ruby-II(variable and method)](https://qiita.com/daddygongon/items/c51f3e0695174bb3c508)に従ってRubyの変数とメソッドについて学んでいきます. 


# Ruby


### variable (変数)

Rubyは変数に型宣言を必要としない. したがって, このような使い方もできる.

```ruby
x = 'Ruby'
x = 19
x = false
```

[前回の記事](https://qiita.com/k6e4n0h0n8f9ooO/items/f4913a60692f516dae4f)のように`ARGV[0]`も変数に代入できる.

```ruby:name_variable.rb
name = ARGV[0]
puts "hello #{name}"
```

```
> ruby name_variable.rb W
-> hello W
```


### method (メソッド)

Rubyでの`function` (関数)は`method` (メソッド)を定義することを意味する. 
これはRubyはあらゆるものがオブジェクトであるかららしい.

手を使って, 覚えてみる.

```ruby:hello_method.rb
def hello name
  puts "Hello #{name}."
end

name = ARGV[0]
hello(name)
```

```
> ruby hello_method.rb W                                                                   
-> Hello W.                                                                                  
```


# 参考資料

[Ruby &#x2013; Wikipedia](https://ja.wikipedia.org/wiki/Ruby)
Ruby on Railsのインストールエラー(error reading '/dev/fd/9')

macのターミナルにて進めたところ、以下のエラーが出ました。
rbenv 1.1.2を使用しました。

```
$ rbenv install 2.6.6
Downloading openssl-1.1.1i.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/e8be6a35fe41d10603c3cc635e93289ed00bf34b79671a3a4de64fcee00d5242
Installing openssl-1.1.1i...
Installed openssl-1.1.1i to /Users/ken/.rbenv/versions/2.6.6

Downloading ruby-2.6.6.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.6.tar.bz2
Installing ruby-2.6.6...
ruby-build: using readline from homebrew

BUILD FAILED (Mac OS X 10.13.6 using ruby-build 20201225)

Inspect or clean up the working tree at /var/folders/wj/4rj93tzj5290k90r0fj2fsrw0000gn/T/ruby-build.20201229072153.43390.j1wMGl
Results logged to /var/folders/wj/4rj93tzj5290k90r0fj2fsrw0000gn/T/ruby-build.20201229072153.43390.log

Last 10 log lines:
translating probes probes.d
compiling ast.c
compiling bignum.c
compiling class.c
error: error reading '/dev/fd/9'
1 error generated.
clang: error: unable to remove file: Operation not permitted
dtrace: failed to compile script probes.d: Preprocessor failed to process input program
make: *** [probes.h] Error 1
make: *** Waiting for unfinished jobs....
```

ここでのぐぐ正解は`error reading '/dev/fd/9'`でした。
(ぐぐ正解：tanukiの中で「ここをググれば答えが見つかる」ところを指します。)

結論としては、ウイルスソフトが読み込みを阻害してしまっていたようですね。
僕はAviraを使っていたので、「リアルタイム保護を無効にする」をしたところ、無事インストールが完了しました！

これ一見どこがぐぐ正解かわかりませんよね、ググり力高めていきたいでです。
([Ruby on Railsのインストールエラー2](https://qiita.com/tanukiman/items/5993d9faade3f607cea7)へ続く)
tbodyとtheadを跨ぐとrowspanが効かない

タイトル行が２行だったり、１行だったりする複雑な表をコーディングする必要があり、
下のように記述したところrowspanが無視されハマった。
ググったところ表の高さが足りていない場合そうなるようだが、そもそも高さを指定しておらず他の箇所では同じ高さで結合できていた。

```html
<table>
 <thead>
  <tr>
    <th>１行目の１列目</th>
    <th rowspan="2">１行目と２行目の２列目</th>
  </tr>
 <thead>
 <tbody>
  <tr>
    <td>2行目の１列目<td>
  </tr>
 </tbody>
</table>
```

試しにtheadを外して全部tbodyにしたら思ったように結合できました。
tbodyの中にthが入るので変なコードになるのが難点ですが。
そもそもこういう複雑な表を記述する場合、theadやtbodyを書かない方が無難かもしれません。

```html
<table>
 <tbody>
  <tr>
    <th>１行目の１列目</th>
    <th rowspan="2">１行目と２行目の２列目</th>
  </tr>
  <tr>
    <td>2行目の１列目<td>
  </tr>
 </tbody>
</table>

```
【ニコニコ動画】秒のurlの張り方

【ニコニコ動画】秒のurlの張り方

焚き火
https://www.nicovideo.jp/watch/sm34115826?from=0

60秒
https://www.nicovideo.jp/watch/sm34115826?from=60

5分
https://www.nicovideo.jp/watch/sm34115826?from=300

10分
https://www.nicovideo.jp/watch/sm34115826?from=600

30分
https://www.nicovideo.jp/watch/sm34115826?from=600

1時間
https://www.nicovideo.jp/watch/sm34115826?from=3600

コピペ用
?from=
VSCodeでSalesforceのApexソースをダウンロード

1. VSCodeにSalesforceのアドオンを入れておく、sfdxコマンドもインストールしておく
1. VSCode起動
1. すでに既存プロジェクトを開いている状態ならCTRL+SHIFT+Nで新ウィンドウ起動
1. CTRL+SHIFT+P、SFDX: Create Project with Manifest
  1. 標準のプロジェクトテンプレート
  1. プロジェクト名は適当に
  1. 親フォルダを適当に選択、そこにプロジェクト名のフォルダが作られる
1. CTRL+SHIFT+P、SFDX: Authorize an Org
  1. ログインURL
  1. 組織エイリアスは適当に(Sandbox名とか)
  1. ブラウザが起動するのでログイン
1. force-app/manifest/package.xml右クリック、SFDX:マニフェストファイルのソースを組織から取得

以上
ストロングパラメーター設定についての感動

# はじめに

ストロングパラメーターと検索して出てくる記事の再追及をした結果ものすごく感動する事実を発見。
（あくまで初心者が感動した話です。😇）

## そもそもストロングパラメーターとは？
指定したkeyをもつパラメーターのみを受け取るように制限するためのもの。
悪い人が悪巧みできるように登録できないようにするのが目的。という理解をしました。

設定しないと意図しないデータの更新をされてしまいます。

対象はparamsを使用したデータの登録、更新のみとのことでした。

##呼び出し方

```
devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])
```


このようにbeforeアクションの後ろに書いてあげる。

|  deviseの処理名 |  役割  | 
|:---------------|-----:
|  :sign_in	       | ログインの処理を行う時       | 
| :sign_up	      | 新規登録の処理を行う時     | 
|  :account_update	 | アカウント情報更新の処理を行う時| 

keysは、ビューに記述した各フォーム部品のname属性値を記入。

＜具体的にどこのこと？？＞

新規登録する場合だと、app/view/devise/registrations/new.html.erbの中の対象となるpassword,email以外の項目となります。
（password,emailはデフォルトで設定されてる。）

## どこに感動したのか？？

さて、私がどこに感動したかというとまさに一個上の記載しました、”対象となるものはpassword,email以外の項目”という所！！

要するに、新規登録する項目にpsswordとemail以外の項目を設定していたらストロングパラメーターをつけてあげてね！ってことでした！！

なんとそういうことか。。。と感動した、というお話です。

そのため、新規登録以外でもログインをするときやアカウントの更新を行う際にpasswordとemail以外の入力項目を設定する場合はストロングパラメーターをつけてあげればGOODです！！

以上ここまでです！

何か間違っている箇所等ございましたらご指摘よろしくお願いします。
【Node.js express Docker】 Docker環境変数を定義してnode.jsで読み込む方法

※当方駆け出しエンジニアのため、間違っていることも多々あると思いますので、ご了承ください。また、間違いに気付いた方はご一報いただけると幸いです。

何パターンかあるみたいなんですが、とりあえずシンプルに。

###app.env というファイルに環境変数を定義する。(名前は任意)

```app.env
SECRET_KEY=himitu
```
###docker-compose.ymlで上記ファイルを環境変数ファイルに指定

```docker-compose.yml
env_file: ./app.env
```
###node.js側で環境変数ファイルを読み込む

```js
const env = process.env //envという名前でオブジェクトを格納。
```

###取り出し方法
```js
env.SECRET_KEY
```

以上です。
社会統計学　（安田三郎、海野道郎先生著）　丸善出版

```{r}

#コウルマンのモデル p.175


#男女別、就職希望地
dat=matrix(c(75.5,24.5,61.9,38.1),ncol=2)

colnames(dat)=c("man","women")

rownames(dat)=c("当該町","他州の町")

alpha=0.755-0.619

ep1=0.619

ep2=0.245

n_man=4020

n_women=4134


#manの場合

q21_man=ep2

q12_man=alpha+ep1

n1t_man=function(t){
  
return(n_man*(q21_man)*(1-exp(-t))+exp(-t))  
  
}

man_data=data.frame(t=seq(0,100,0.1))%>%mutate(n1t=n1t_man(t))%>%mutate(n2t=n_man-n1t)


plot(man_data$t,man_data$n1t,xlab="time",ylab="人口:man",xlim=c(min(man_data$t),max(man_data$t)),ylim=c(min(c(man_data$n1t,man_data$n2t)),max(c(man_data$n1t,man_data$n2t))),col=2,main="man")

par(new=T)

plot(man_data$t,man_data$n2t,xlab="time",ylab="人口:man",xlim=c(min(man_data$t),max(man_data$t)),ylim=c(min(c(man_data$n1t,man_data$n2t)),max(c(man_data$n1t,man_data$n2t))),col=3,main="man")
  
  
#womenの場合

q21_women=ep1

q12_women=alpha+ep2

n1t_women=function(t){
  
return(n_women*(q21_women)*(1-exp(-t))+exp(-t))  
  
}

women_data=data.frame(t=seq(0,100,0.1))%>%mutate(n1t=n1t_women(t))%>%mutate(n2t=n_women-n1t)

plot(women_data$t,women_data$n1t,xlab="time",ylab="人口:women",xlim=c(min(women_data$t),max(women_data$t)),ylim=c(min(c(women_data$n1t,women_data$n2t)),max(c(women_data$n1t,women_data$n2t))),col=2,main="women")

par(new=T)

plot(women_data$t,women_data$n2t,xlab="time",ylab="人口:women",xlim=c(min(women_data$t),max(women_data$t)),ylim=c(min(c(women_data$n1t,women_data$n2t)),max(c(women_data$n1t,women_data$n2t))),col=3,main="women")

```

```{r}

#ボイルの2方向加法モデル　p.185


mat=matrix(c(0.89,80,0.39,36,0.75,59,0.67,87),nrow=2)

colnames(mat)=c("リベラル派（知識あり）","保守派（知識なし）","リベラル派（知識なし）","保守派（知識なし）")

rownames(mat)=c("支持率","実数")

p11=mat[1,1];p21=mat[1,2];p12=mat[1,3];p22=mat[1,4]

n11=mat[2,1];n21=mat[2,2];n12=mat[2,3];n22=mat[2,4]

ax=((p11-p21)/(1/n11+1/n21)+(p12-p22)/(1/n12+1/n22))/(1/(1/n11+1/n21)+1/(1/n12+1/n22))

ay=((p11-p12)/(1/n11+1/n12)+(p21-p22)/(1/n21+1/n22))/(1/(1/n11+1/n12)+1/(1/n21+1/n22))

r=p22-n11*n12*n22*((p11-p12)-(p21-p22))/(n11*n12*(n21+n22)+n21*n22*(n11+n22))

s=1-(n11*(n12*n21+n21*n22+n22*n12)*p11+n12*n21*n22*(p12+p21-p22))/(n11*n21*(n12+n22)+n12*n22*(n11+n21))

```
パターン認識　理論と応用ー　（朝倉書店）



```{r}

#直線度（主成分分析を利用した) p.58

data("anscombe")

X=unlist(matrix(anscombe[,colnames(anscombe) %in% c("x1","x2","x3","x4")]))

Y=unlist(matrix(anscombe[,colnames(anscombe) %in% c("y1","y2","y3","y4")]))

M=3

no=c(1:length(X))

ave_L=0

while(ave_L<0.9)({

sig=0

while(sig==0)({

clus=sample(1:M,length(no),replace=T)

len=c()

for(j in 1:M){
  
len=c(len,length(clus[clus==j]))  
  
}

if(min(len)>2){
  
sig=1  
  
}

})

L_val=c();ns=c()

for(j in 1:M){

x=X[clus==j]

y=Y[clus==j]

n=length(x)

cov=cov(cbind(x,y))

eig_values=eigen(cov)$values

eig_vectors=eigen(cov)$vectors

I1=cov[1,1]+cov[2,2]

I2=4*cov[1,2]^2+(cov[1,1]-cov[2,2])^2

L=sqrt(I2)/I1

L_val=c(L_val,L)

ns=c(ns,n)

}

ave_L=sum(ns*L_val)/sum(ns)

})


```
Atomで正規表現を使って検索、置換してみる。

# 今回やること
Atom（テキストエディタ）内のPythonを置換したい。
具体的には、`request.form['status']` を `request.form.get('status')` に一発で変換したい！
Atomの置換機能に正規表現を書けるので、それで実現する。

![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195941/1bb8afba-04d8-02e9-c007-cfb2dba29d30.gif)


# やり方
`command + shift + F` で検索置換バーを出す。
こんな感じ↓↓のが出てくるはず。

![スクリーンショット 2020-12-29 12.17.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195941/91227e3c-fd08-227d-0d0c-9e77375beb7d.png)

今回は、
上部の入力バーに正規表現を使って検索対象を指定して、
検索結果を下部のバーに入力した値に置き換えるという流れです。

検索バーの右上の`.*`をクリックしてアクティブにさせることをお忘れなく！
これは正規表現を使いますという合図です！

今回は以下のように記述します。

```
request.form\[(.*?)\]
request.form.get($1)
```

![スクリーンショット 2020-12-29 12.16.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195941/ec7d0b97-fcf8-0d58-0e78-facd2dafb832.png)

# 解説
`request.form\[(.*?)\]`の`\[` と `\]`についてですが、
普通の`[]`だと正規表現として認識されてしまうので、バックスラッシュを前に置くことで回避しています。

今回の肝である`(.*?)`は、キャプチャと呼ばれるものです。
`()`内に指定した文字列とマッチするものを補足することができます。
ここでは、`.*`とすることで、ワイルドカードにしています。つまり、どんな文字列でも補足するということです。
ここで問題が発生します。

`request.form\[(.*)\]`

のままだと、

`request.form['name'], request.form['description'], request.form['address']`

この行全てを補足対象にしてしまいます。
`request.form['name']`のみを補足してくれないのです。

![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195941/1b1330c4-052a-5517-5b15-1f7e5c77d5dc.gif)

そこで、`?`をつけてみると、最短でマッチするものを補足してくれます。
この辺りは、`最短マッチ`、`最長マッチ`で検索してみるといいと思います。

あとは、replaceボタンを押せば、置換してくれます。
現場からは以上です。
ssmtpでgmailメール送信ができなくなった

# いままでgmailアカウントでのメール送信出来ていたが、突然送信出来なくなったので、その対処メモ


## 1.原因（たぶん）

使えなくなったgmailアカウントは2段認証設定がされていなかったので、アプリパスワードを使用していなかった。
ssmtpが言うこと聞かない。

## 2.対処

1.gmailアカウントに2段階認証設定を行うと、アプリパスワード設定が表示されるようになるので、アプリパスワードを取得する。

2.ssmtpを諦めて、exim4を利用する

参考URL:https://qiita.com/Kazuya_Murakami/items/bc520430fc1efdd0d118
PAY.JPを使ってクレジットカードを登録して、決済を行う際にパーミッションエラーが出たときの対処法

## 概要

WEBサービスの決済を実行する場面で、サブスクリプション決済を行おうとしたところ下記のようなエラーが発生。

```ターミナル
$ Netrc::Error (Permission bits for '/Users/${username}/.netrc' should be 0600, but are 644):
```

※ ${username}の部分は人によって異なります。

また、使用しているngrolkでも下記のようなエラーが発生

```
500 Intenal Server Error
```

## 解決法

自分の場合は644の権限になっており、600の権限に直す必要があったので、
chmodコマンドを用いて下記のようにディレクトリのパーミッション（許可属性）を変更してあげれば良い

```ターミナル
chmod 600 /Users/${username}/.netrc
```


## 参考

>Rails x Cloudinaryでパーミッションエラーが出た時の対処
https://qiita.com/sayama0402/items/f6201459de6cb49f1521

>【 chmod 】コマンド――ファイル／ディレクトリのパーミッション（許可属性）を変更する
https://www.atmarkit.co.jp/ait/articles/1605/23/news020.html
ActiveRecord :: PendingMigrationError　について

URL　http://localhost:3000/rails/actionsにアクセスした際に
ActiveRecord :: PendingMigrationError
と表示される
当該ページの　保留中の移行を実行する　を押すと
StandardError
と表示される

■仮説
ActiveRecord :: PendingMigrationError
をインターネットで検索してみる
https://qiita.com/KONTA2019/items/0444ae3b8c8936a56ee0
当ページのエラーの原因２に注目

Mysql2 :: Error：テーブル 'users'はすでに存在します
とあるので、
migrationが完了している(up)状態でマイグレーションファイルを更新しrails db:migrateしてしまった
のが問題ではないか。


■検証
・$ rails db:migrate:reset
　を実行し再度マイグレーションをupにする
→変化なし

・$ rails db:rollback
　$ rails db:migrate
を行い、マイグレーションを差し戻し、再度マイグレートする
→変化なし

以下エラーのスクショ
https://gyazo.com/23116ecff6eb24e08bb514bd3ce7df76

https://gyazo.com/ac1e483fc4171b942bb806768150473a

https://gyazo.com/b09c2a96875b69fdaf684941356ec189


結果
migtate/create_users.rbがダブっていることが原因。片方のファイルを削除することでこのエラーは解決。
仮説ではusers.rbがある上で上書きできないので差し戻してから、再度マイグレイトすることで治ると思ったが、
すでに作成されており、ファイルがダブっていることが原因とは見当が違った。
その他、初期設定のミス。さらに細かい部分のミスがあったので、全て直した（してもらった）。

反省
ファイルが重複した原因は聞けなかったが、おそらくrollbackしないでrails db:migrateを行ったことだと思う。マイグレーションをおなうときは注意が必要。
ケアレスミスに関しては注意を払って進めていくことが重要。
以下、修正後のスクショ
https://gyazo.com/e710ebcf079d3f2fbf1be35ae3dfaa62
ターミナルからRubyでも(標準入出力)

\![macOS-11.1](<https://img.shields.io/badge/macOS-11.1-brightgreen>) \![ruby-2.7.2p137](<https://img.shields.io/badge/ruby-2.7.2p137-brightgreen>) 


# Preface (はじめに)

本記事はマルチスケールシミュレーション特論の第5回に関連する記事です. [チャート式Ruby](https://qiita.com/daddygongon/items/6f38d9a04e127a7952a7)に従って進めていきます. 

今回は[チャート式ruby-I(puts)](https://qiita.com/daddygongon/items/1b0f0ff3fb9d60418289)に従ってRubyの標準入出力を学んでいきます.


# Ruby


### 標準入出力

まずはお馴染み

```
hello world.
```

この文字列を返すプログラムを作ります.

1.  文字列の出力

    Rubyで文字列を出力するための関数は複数あります.
    
    代表的なものは
    
    | method | 説明                                                                               | 改行|
    |:-------|:-----------------------------------------------------------------------------------|:----|
    | print  | 引数のオブジェクトを文字列にし標準出力する.                                        | ×  |
    | puts   | 引数のオブジェクトを文字列にし改行を加えて標準出力する.                            | ○  |
    | p      | debug用のputs, エスケープ処理された文字列でも処理されずに生の文字列が標準出力される.| ○  |
    | pp     | pのpretty print, pよりも分かりやすく標準出力する. require'pp'が必要.               | ○  |
    
    では, 早速作っていきましょう. 
    
    ```ruby:hello_world.rb
    print "hello world1"
    puts "hello world2"
    p "hello world3"
    pp "hello world4"
    ```
    
    出力は
    
    ```
    > ruby hello_world.rb
    ```
    
    ```
    hello world1hello world2
    "hello world3"
    "hello world4" 
    ```

2.  文字列の入力

    出力の次は入力でしょ!
    
    ということで, 次にgetsメソッドを用いて好きな文字列に挨拶します. 
    
    ```ruby:hello_name.rb
    name = gets
    puts "hello " + name
    ```
    
    出力は
    
    ```
    > ruby hello_name.rb
    ```
    
    ```
    W
    hello W
    ```
    
    今度はCLIで作業をしたいので, ARGV[0]を使いたいと思います.
    
    ```ruby:hello_name.rb
    puts "hello #{ARGV[0]}"
    ```
    
    出力は
    
    ```
    > ruby hello_name.rb W
    -> hello W
    ```


### 類題

リダイレクト>を使って標準出力を適当なファイルに書き込んでみます.

```
> ruby hello_name.rb Woo > hello_name.txt
```

ちゃんと出力されたか確認

```
> cat hello_name.txt
-> hello Woo
```
podfile関連エラーと対処法（自分用メモ）

#発生したエラー
iphoneのシミュレータでデバックしようとすると下記のようなエラーが出る

##エラー文①
```dart
Error output from Xcode build:
    objc[27479]: Class AMSupportURLConnectionDelegate is implemented in both ?? (0x1f5bfb8f0) and ?? (0x11acd02b8). One of the two will be used. Which
    one is undefined.
    objc[27479]: Class AMSupportURLSession is implemented in both ?? (0x1f5bfb940) and ?? (0x11acd0308). One of the two will be used. Which one is
    undefined.
```


##エラー文②
```dart
Error output from CocoaPods:
    [!] Automatically assigning platform `iOS` with version `8.0` on target `Runner` because no platform was specified. Please specify a platform for
    this target in your Podfile.
```

#解決策
Podfileが〜とエラー文が言っているので、Podfileを正しく動くものに入れ替える。
ios>podfile

```
# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'

# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

project 'Runner', {
  'Debug' => :debug,
  'Profile' => :release,
  'Release' => :release,
}

def flutter_root
  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
  unless File.exist?(generated_xcode_build_settings_path)
    raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
  end

  File.foreach(generated_xcode_build_settings_path) do |line|
    matches = line.match(/FLUTTER_ROOT\=(.*)/)
    return matches[1].strip if matches
  end
  raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end

require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)

flutter_ios_podfile_setup

target 'Runner' do
  use_frameworks!
  use_modular_headers!

  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
  end
end
```

#参考になりそうなサイト
cacheを消して解決することもある

https://stackoverflow.com/questions/65089767/class-amsupporturlconnectiondelegate-is-implemented-in-both

http://www.project-unknown.jp/entry/cocoapods-error-implemented-both
discord.pyで大きいログを出力する

discordでは1回のメッセージは2KBです
botでの動作ログを見たいときはメッセージとして出すと送れないかもしれません。

そこで、テキストファイルとしてbotにアップロードしてもらうと便利です。

```python
@client.event
async def on_message(message):

   if message.content = 'log':
       log = ''

       #適当にログを組み立てる
       for d in data:
           log += d + '\n'

       with StringIO(log) as bs:
           await message.channel.send(file=discord.File(bs, 'log.txt'))
```
puts



# puts hello\_world

まずは Hello world. と出力する. puts\_hello\_world.rb を作成する.

    Hello world.


# 出力の仕方

rubyで文字列を出力する方法はいくつかある．

| method | 使用状況                            |
|:-------|:------------------------------------|
| print  | 普通に使う．要改行                  |
| puts   | printの次に使う. 自動改行　　　　   |
| p      | codingの最中にdebugがわりに打ち出すとき|
| pp     | pのpretty print, require 'pp'が必要 |
| printf | Cである．                      　　　|

まずはこの5つをマスターする.


## 解法

まずは single-quotation (') で囲って，

```ruby
puts 'Hello world.'
```

と puts\_hello\_world.rb に打ち込む.そして

    > ruby puts_hello_world.rb

として出力を確認する.

    Hello world.

と出力される.


## 類題

p, pp 等の出力方法の出力の違いを考察

| code                  | 出力結果　　　　                        |
|:----------------------|:----------------------------------------|
| puts 'Hello world.'   | Hello world.                   　　　　 |
| p 'Hello world.'      | "Hello world."                          |
| pp 'Hello world.'     | "Hello world."                          |
| print 'Hello world.'  | Hello world.                            |

puts は print とは違い、自動で改行される.p と pp は文字列の前後に " " がつく.


# ARGV


## お題

    > ruby hello_name.rb Rudy

と打ち込んで，

    Hello Rudy.

と返ってくるcodeを書く．

まず, hello\_name.rb に

    puts ARGV[0]

と打ち込んで,

    > ruby hello_name.rb Rudy

とすると

    Rudy

と出力される.

つまり, ARGV[0]というのは引数(argument)配列の0番目を意味しています．


## 解法

次に"Hello Rudy."と出力させる.先程の hello\_name.rb を書き換える.

```ruby
puts "Hello #{ARGV[0]}"
```

とすると

    Hello Rudy.

と出力される.もし

    > ruby hello_name.rb

のように引数無しにすると

    Hello .

と出力される.

この他にもいくつかの出力方法がある.

| puts  | puts "Hello " + ARGV[0]         |
|:------|:--------------------------------|
| puts  | puts "Hello #{ARGV[0]}"         |
| print | print "Hello #{ARGV[0]}\n"      |
| print | print "Hello " + ARGV[0] + "\n" |

Cからの人は，printfもありだが,

```ruby
printf("Hello %s.\n", ARGV[0])
```

とすると他の出力と比べて記述が長くなる．


## 類題

"Hello Rudy."をどこかへ保存する方法

    ruby hello_name.rb Masaki > hello_name.txt

とすると hello\_name.txt に

    Hello Masaki.

が保存される.

hello\_name.txt の中身を見たい場合は

    > cat hello_name.txt

とする.


# 参考ページ

[チャート式ruby-Ⅰ (puts)](https://qiita.com/daddygongon/items/1b0f0ff3fb9d60418289)



------
 - **source** ~/grad_members_20f/members/djj31370/c1_puts.org
IntellijでAngular開発のデバックするまで

## はじめに
Angular開発のIDEとして、Intellijを使用し、プロジェクト作成からデバックまでの導入メモです
Angular CLI、npmのパスを通すところが、少し手間取ったので記録に残します

## 開発環境
MacBook Air (M1, 2020)
Mac OS Big Sur 11.0.1
IntelliJ Ultimate 2020.3
Node v15.4.0
Nodeのバージン管理 anyenv/nodeenv

## プロジェクト作成
「New Project」でプロジェクトを作成
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/cc8acf66-80f3-ca8b-1abc-8bb6ed975026.png)

テンプレート［Javascript］>［Angular］を選択
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/a85ce9ad-9c68-353a-0bd7-70257997fda3.png)

Project nameを入力
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/636502c1-ec89-ae9f-2440-72b2f8ae8db1.png)

Angular CLIのパスを入力し、Finishボタン押下

```shell
~/.anyenv/envs/nodenv/versions/15.4.0/lib/node_modules/@angular/cli
```
![30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/db8043c2-73d8-9eb4-a8cf-fab0942a24d4.png)

プロジェクトが生成されます
![31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/7cfa81cf-1014-8190-ccb1-cffdc0deef6f.png)



>Angular CLIのパスは各自の環境により異なります
>私はanyenv/nodeenvのバージョン管理で、AngularCLIをnpmでGlobalでインストールしてます



## npmのPackage Managerのパス設定
[Run]>[Edit Configurations]のPackage managerを設定し、OKボタン押下

```shell
~/.anyenv/envs/nodenv/versions/15.4.0/lib/node_modules/npm
```
![34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/bafd223d-6b13-645a-ea07-13c1701cac2d.png)


デバックで停止したい箇所にブレークポイントを設定
> 例 app.component.ts

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/3bfc72c8-6096-a83e-96ea-21394c415b0a.png)


## デバック実行
[Run]>[Debug 'Angular CLI Server']を実行
![36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/1bf6d041-ca38-c018-e364-5cfc966bf972.png)

ローカルサーバで起動します
![40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/da6b48ae-aecd-0799-0229-830f7bba1bf9.png)

Cosoleに表示されている［`http://localhost:4200`］をCmd＋Shiftキーを押しながらクリック
デバック用のChromeインスタンスが立ち上がり、デバックできる様になります

![42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/bcdd23bd-5630-7437-7f9d-7e6aebc103da.png)

デバック用にブラウザが起動します
![43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/0303d7b4-d7cf-063f-3617-2bfe9e5652ac.png)

ブレークポイントを設定した箇所で処理が停止します

![44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117828/a380c044-2793-6b7a-a9b9-7c9385ec9628.png)

以上、IntelliJでAngularをデバックするまでの手順でした
【3D OD LiDAR】PIXOR : BEVで3D Object Detection

<h1>PIXOR: Real-time 3D Object Detection from Point Clouds</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/8dafa547-efe6-4579-fefe-6a76c02d1c60.png)

<h1>アルゴリズム</h1>
<h2>入力</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/6bd8af5f-e5d1-03c3-a4b2-3d7c3ecd5fdc.png)
2DのGridに区切り、(H/dH+3)のChannelを持つ

H/dHは、dHの間隔で高さ方向に区切られた領域に点が存在するか(occupancy)
3は、高さを3つに区切った、領域のintencity*
*たぶん。。。


<h2>ネットワーク</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/80566ec5-0568-3668-e934-7ccd07096e0b.png)
ただたんに2DのObject DetectionをBEVで行うだけ。
LocalとGlobalの情報得るために、FPN(Feature Pyramid Network)を使うと良いらしい。

<h2>出力</h2>
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/43739d95-12c7-b780-83c6-db5074cdff29.png)
高さ方向の情報は使わないから、zcとhは出力しないらしい。

<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/e0bddc1f-62c0-71f1-ec7e-6c8b564f6ac3.png)
・2Dだけに、なかなか早くなってる

<h1>結論</h1>
・かなりシンプルだし入力を変えたり、ネットワークを深くしたりと色々工夫すればもう少し精度あがりそう。

<h1>参考文献</h1>
PIXOR: Real-time 3D Object Detection from Point Clouds
https://arxiv.org/pdf/1902.06326.pdf
FlutterからGradleに環境変数を渡す

## 概要
前回の[iOS編](https://qiita.com/yana1316/items/542dd4f787779d154f45)に続き、今回はAndroid編となります。iOS編と同様に`--dart-define`を利用して変数を渡していきます。

### 前提
- Flutterのサンプルプロジェクトを作成しシミュレーターで実行できる
- Flutter 1.20以降（ver1.17〜1.19までの場合、少し書き方が異なるため[Denisさんの元記事](https://itnext.io/flutter-1-17-no-more-flavors-no-more-ios-schemas-command-argument-that-solves-everything-8b145ed4285d)を参照してください）

### 環境
```
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 1.22.4, on Mac OS X 10.15.7 19H2 darwin-x64, locale en-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 12.1)
[✓] Android Studio (version 4.1)
[✓] Connected device (1 available)      
```

### サンプルコード
https://github.com/yana1316/flutter_define

## 設定
### Flutterプロジェクトの用意
既存のプロジェクトでも、新規にプロジェクトを作成しても問題ありません。
一度ビルドして、シミュレーター上で実行できることを確認しておいてください。

### Gradleの設定
`[project]/android/app/build.gradle`を編集します。

```gradle
// 〜〜 省略 〜〜
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

// ここから追記 --
def dartEnvironmentVariables = [
        DEFINE_HELLO: 'world',
        DEFINE_FOO: 'bar',
];
if (project.hasProperty('dart-defines')) {
    dartEnvironmentVariables = dartEnvironmentVariables + project.property('dart-defines')
            .split(',')
            .collectEntries { entry ->
                def pair = URLDecoder.decode(entry).split('=')
                [(pair.first()): pair.last()]
            }
}
// ここまで追記 --

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

// 〜〜 省略 〜〜

android {

    defaultConfig {
        applicationId "com.yana1316.flutter_define"
        applicationIdSuffix dartEnvironmentVariables.DEFINE_FOO // 追記
        minSdkVersion 16
        targetSdkVersion 29
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }
```

### Flutterの設定
前回の[iOS編](https://qiita.com/yana1316/items/542dd4f787779d154f45#flutter%E3%81%AE%E8%A8%AD%E5%AE%9A-1)を参考に設定してください。

## 動作確認
うまく行けば以下のような画面で確認できるかと思います。
![Android_Emulator_-_Nexus_S_v9_0_5554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315258/656efe83-3c1a-a097-a35b-ce127e64f295.png)

## 参考
- [Flutter 1.17 — no more Flavors, no more iOS Schemas. Command argument that changes everything](https://itnext.io/flutter-1-17-no-more-flavors-no-more-ios-schemas-command-argument-that-solves-everything-8b145ed4285d)
- [Flutter 1.20 — What you should know before you upgrade your project that uses compile-time variables](https://medium.com/@tatsu.ukraine/what-you-should-know-before-you-upgrade-flutter-in-your-project-with-compile-time-variables-3ec3d2e9ba79)
puts



# puts hello\_world

まずは Hello world. と出力する puts\_hello\_world.rb を作成する.

    Hello world.


# 出力の仕方

rubyで文字列を出力する方法はいくつかある．

| method | 使用状況                            |
|:-------|:------------------------------------|
| print  | 普通に使う．要改行                  |
| puts   | printの次に使う. 自動改行　　　　   |
| p      | codingの最中にdebugがわりに打ち出すとき|
| pp     | pのpretty print, require 'pp'が必要 |
| printf | Cである．                      　　　|

まずはこの5つをマスターする.


## 解法

まずは single-quotation (') で囲って，

```ruby
puts 'Hello world.'
```

と puts\_hello\_world.rb に打ち込む.そして

    > ruby puts_hello_world.rb

として出力を確認する.

    Hello world.

と出力される.


## 類題

p, pp 等の出力方法の出力の違いを考察

| code                  | 出力結果　　　　                        |
|:----------------------|:----------------------------------------|
| puts 'Hello world.'   | Hello world.                   　　　　 |
| p 'Hello world.'      | "Hello world."                          |
| pp 'Hello world.'     | "Hello world."                          |
| print 'Hello world.'  | Hello world.                            |

puts は print とは違い、自動で改行される.p と pp は文字列の前後に " " がつく.


# ARGV


## お題

    > ruby hello_name.rb Rudy

と打ち込んで，

    Hello Rudy.

と返ってくるcodeを書く．

まず, hello\_name.rb に

    puts ARGV[0]

と打ち込んで，

    > ruby hello_name.rb Rudy

とすると

puts "Hello #{ARGV[0]}."

ARGV[0]というのは引数(argument)配列の0番目を意味しています．unix shell上ではcommandにoptionなんかの引数を直接渡すのが普通です．そのためにARGVというのは普通に用意されています．

次に"Hello Rudy."と打ち出させることをかんがえます．これをするにはいくつかの方法があります．これもいろいろ試して見てください．

| puts  | puts "Hello " + ARGV[0]         |
|:------|:--------------------------------|
| puts  | puts "Hello #{ARGV[0]}"         |
| print | print "Hello #{ARGV[0]}\n"      |
| print | print "Hello " + ARGV[0] + "\n" |

Cからの人は，printfもありです．

```ruby
printf("Hello %s.\n", ARGV[0])
```

でも慣れてくると冗長なんで使わなくなります．多分使うのは，数値計算の出力formatを揃えたいときぐらいでしょうね．


## 詳しい解法

まずは動作させて見ます．

    > ruby hello_name.rb Rudy
    Rudy

って返ってます？　これを変更します．

    > ps

でemacsが今どういう状態かを確認して，fgあるいはemacs hell\_name.rbで起動します．

```ruby
puts "Hello #{ARGV[0]}"
```

がこういう状況ではよく使われます．ちゃんとでています？


## 類題

次に"Hello Rudy."というのをどこかへ保存することを考えます．

    ruby hello_name.rb bob > hello_name.txt

としてhello\_name.txtに自分への挨拶を出力させて見てください．Hello Masaki.

    Hello bob.

とかね．'>'は，出力先を指定したtxtに変更(re-direct)するshellの機能です．

    cat hello_name.txt

で中身をcat(con-cat-inate)できます．


# ここで習った項目

-   ruby
    -   puts, print, p, pp
    -   ARGV[0]
-   emacs
    -   C-z, C-x C-s, C-x C-c
    -   ps : process status
    -   fg : 一度中断したprocessを再度起動させる
-   shell 
    -   mkdir, cd
    -   cat
    -   redirection(>)



------
 - **source** ~/grad_members_20f/members/djj31370/c1_puts.org
第七回：条件分岐・配列・繰り返し



# 目標

入力された年がうるう年がどうかを表示するプログラムを作成する．うるう年の条件は以下の通り．

-   4で割り切れる数の年．
-   ただし，100で割り切れる年はうるう年としない．
-   400で割り切れる年はうるう年とする．


# 条件分岐

まず，4で割り切れるかどうか判断する．条件分岐するためにはifを用いる．

```ruby
if 条件
  内容
end
```

ifの部分をelsif，elseに書き換えることで，その他の条件になる．今回は，4で割り切れるが条件になるので，

```ruby
if year % 4 == 0
  p true
else
  p false
end
```

となる．これにより，4で割り切れる場合はtrue，割り切れない場合はfalseと返すコードが作成することが出来る．

しかし，これでは，100で割り切れる年もtrueと出てしまう．そこで，

```ruby
if year % 100 == 0
  p false
elsif year % 4 == 0
  p true
else
  p false
end
```

とすることで，100で割り切れる年は，falseとなる．同様に，400で割り切れる年はtrueにする必要があるので，

```ruby
if year % 400 == 0
  p true
elsif year % 100 == 0
  p false
elsif year % 4 == 0
  p true
else
  p false
end
```

とすることで，解決する．


# 配列

いくつかの年を調べるときは，配列を使用すると便利である．配列には，eachを用いる．

```ruby
[a,b].each do |year|
```

でa,bの値をyearとして，繰り返して行うことが出来る．


# 参考サイト

参考にしたサイトは以下の通り．

-   <https://qiita.com/daddygongon/items/a550bde1ed6bff5217d8>



------
 - **source** ~/grad_members_20f/members/yuhsuzu/r7.org
redmineとTeamsをMicrosoft PowerAutomateを使って連携する

会社で問い合わせ情報を記録するのにRedmineを使っていた。
でも、ちゃんと登録していても更新してる感じがない・・・。

会社ではTeams使っているので前に作った自動投稿機能を使ってredmineを更新していることをアピール。
ざっくりいうとこんな感じの結果になってます!
![スクリーンショット 2020-12-24 18.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546003/beeffcf9-b403-4430-35b6-31960d81181d.png)

使っている内容としましては
redmineのメール通知とPowerAutomateを組み合わせるだけの簡単設定。

###redmineで新規にissueを作った時の処理
![スクリーンショット 2020-12-29 11.32.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546003/bacc78fe-7926-29b0-dc96-5757cbc3c57e.png)

ポイントは件名にIDを振り分けていること。
これがあとで返信させる時に検索させる方法になる。

###対象のissueに更新があった時に返信で投稿させる方法

![スクリーンショット 2020-12-29 11.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546003/9bc8b0a9-4448-7c77-e7c6-a0fbcc007070.png)

![スクリーンショット 2020-12-29 11.34.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546003/49d48e71-e80f-aa99-8698-b9c69d2092cc.png)

![スクリーンショット 2020-12-29 11.35.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546003/2c45e481-a76f-1fd9-931d-27e233941ec3.png)

![スクリーンショット 2020-12-29 11.35.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546003/2802df65-efd6-c7bc-8717-e894f7cead3b.png)


「Power automateでteamsに自動投稿～返信できるようにした話」
という内容でID絡みの説明をしてあるのでそちらを参照してもらえるとありがたいです。
https://qiita.com/snemesk/items/f80e0460c9ad52132545

上記を使えばissueごとに返信していってくれるので、投稿が単独にならず、後で見る時に履歴を見るのが楽です。


redmineのメール通知機能を使うのでいろいろとカスタマイズできるとは思いますが、Teamsに投稿できるのでちゃんと更新してるのを確認できていいですね。

PowerAutomateはある程度洗練されてきているので、今後も便利機能があれば使ってみたいです。
【Swift/TableView】セルタップ時のハイライト実装4パターン

セルタップ時のハイライト実装について、
納得のいく記事が見られなかったので備忘録として。
基本的にコードベースなのでstoryboard信者ならリターンをおすすめしたい。

よく見られたのが、
・UIViewを作成してselectedBackgroundViewに代入するというもの。
個人的にあまり好きじゃない。
とりあえずまとめてみる。

##SelectionStyle

```Swift
//tableViewのcellForRowAtを設定する関数内で
//selectionStyleを設定する。
cell.selectionStyle = .gray
cell.selectionStyle = .none
cell.selectionStyle = .blue
```
![スクリーンショット 2020-12-29 11.13.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585922/6d04f3ef-a5ba-3192-634f-133ddce5b0ac.png)
selectionStyleでは、この画像でいうTestCellの階層の背景色に適用されるため、
次の階層のビューに色をつけるとビューが被りハイライトが見えなくなる。
そのため、selectionStyleの実装時には一番上の階層、TestCellに背景色をつけ、
小要素の背景色は基本的に.clearにしておく必要がある。
余白を持たせたり、複雑なカスタムセルの場合、この方法ではやりにくい。


##selectedBackGroundView

お馴染み、いろいろな記事で紹介されている。あまり好きじゃない。

```Swift
//tableViewのcellForRowAtを設定する関数内で設定
let backgroundView = UIView()
backgroundView.backgroundColor = .red
cell.selectedBackgroundView = backgroundView
```
うん、まじで好きじゃない。

##カスタムセルクラスのsetSelected関数

カスタムセルクラスを使わない、平凡なTableViewの場合、一番上のSelectionStyleが一番無難だが、
多くの場合はカスタムセルクラスを使うと思う。
![スクリーンショット 2020-12-29 11.13.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585922/6d04f3ef-a5ba-3192-634f-133ddce5b0ac.png)

```Swift

//画像のように、TestCellの小要素にbaseViewを用意することで、
//より複雑なレイアウトを組むことができるが、その場合は
//ハイライトをbaseViewに対して表現することで実装できる。

//選択されたときの挙動を設定する関数、引数selectedには選択されたらtrue、
//そうでなければfalseが渡されるので、それに合わせて関数内で条件分岐を作り、
//レイアウトの設定をする。
// 条件 ? A : B はエルビス演算子。条件がtrueならA、falseならBになる。
override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    baseView.backgroundColor = selected ? .lightGray : .white
    // Configure the view for the selected state
}
```
カスタムセルの時は大体これかも。個人的にもよく使う。

##override var isHighlighted / isSelected
これは初学者には新しい書き方かもしれない。同じくカスタムセルクラスに記述する。
これも個人的によく使う。

```Swift
//カスタムセルクラスにグローバル変数として記述する。
//これらはcellのクラスに用意されている変数

//セルがハイライトされているセルなら
//isHighlighted変数にはtrue、そうでなければfalseが代入される。
override var isHighlighted: Bool {
    didSet {
        baseView.backgroundColor = isHighlighted ? .lightGray : .white
    }
}
//セルが選択されたらisSelectedにtrue、
//そうでなければfalseが入る
override var isSelected: Bool {
    didSet {
        baseView.backgroundColor = isSelected ? .lightGray : .white
    }
}
```

##おわりに
他にも良い方法があったら
コメントで教えてください〜
Rubyのローカル変数定義について難しいという今日の気付き

## この記事で書くこと
Rubyの変数に対するundefinedの挙動についての気付き

## きっかけ
以下の記述は、リクエストされた動物の情報を返却するAPIを例としてあげているものです。

```rb
    
animal = Cat.find_by(id: params[:cat_id]) if params[:cat_id].present?
animal = Dog.find_by(id: params[:dog_id]) if params[:dog_id].present?
return render json: [] if animal.blank?
〜以下省略〜
```

`animal.blank?` が両方の `params[:cat_id] params[:dog_id]` がない場合に、
undefinedエラーが出るんじゃないかと思ったのですが、
(このように)

```rb
[1] pry(main)> hoge.blank?
NameError: undefined local variable or method `hoge' for main:Object
from (pry):1:in `<main>'
```

結果はエラーが出ません。
`nil` になります。

当然 `nil` は `blank?`　メソッドを持っているため、 エラーは発生しません。

## なぜ？ちゃんと理解する


[Ruby 3.0.0 リファレンスマニュアル  変数と定数](https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#local)

以下引用

>宣言は、たとえ実行されなくても宣言とみなされます。


> v = 1 if false # 代入は行われないが宣言は有効
> p defined?(v)  # => "local-variable"
> p v            # => nil


式として評価されなくても宣言自体はされてるということか。。。。

~~一人でもわかりにくい。。と感じたということは、書き方を変えた方がいい。~~

```rb
    
animal = Cat.find_by(id: params[:cat_id]) if params[:cat_id].present?
animal = Dog.find_by(id: params[:dog_id]) if params[:dog_id].present?
return render json: [] if animal.blank?
```

~~ではなく、~~


~~こうした方が読みやすいと思いました。~~
~~なんとなくビューで変数を扱ってる時は、気にならなかったことが、~~
~~今回の業務のメンバーへのコードレビューをしている時に気になった。~~
~~気を付けて行こう。また一つ学んだ！~~



```rb
animal = nil
animal = Cat.find_by(id: params[:cat_id]) if params[:cat_id].present?
animal = Dog.find_by(id: params[:dog_id]) if params[:dog_id].present?
return render json: [] if animal.blank?
```

[追記]
コメントにて、 

```rb
animal = nil
```

で明示的に宣言することは不要なコードで、迷いを産む可能性があるとのコメントをいただきました。
自分の理解が不足していて入れてしまいそうになっていたコードですが、
以下のコードで何ら問題のないものです。 :bow: 


```rb
animal = Cat.find_by(id: params[:cat_id]) if params[:cat_id].present?
animal = Dog.find_by(id: params[:dog_id]) if params[:dog_id].present?
return render json: [] if animal.blank?
```
Cognos Analytics の Framework Managerでデータソース接続時に「BMT-IMP-0002」「DPR-ERR-2079」エラー

#Cognos Analytics の Framework Managerでデータソース接続時に「BMT-IMP-0002」「DPR-ERR-2079」エラー
これ全員はまるんちゃうか、と思ったので共有しておきます。
Cognos Analytics 11.1.7のFramework Managerです。

FMでモデル作成して、データソースの接続を行う際に、以下の画面で「データ・ソース」を選択して、次の画面でデータソースを選択して「次へ」を押すと、
![A04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/17e6f493-7828-1b23-c0a5-6b596e32de5c.png)

以下のエラーが出る場合の対応です。
![A03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/7576d9d8-b8d9-4aba-e28f-cdbd7e54a2a2.png)

原因はFramework ManagerのCognos Configuration設定です。
赤枠の箇所で、デフォルトで「/bi/v1/disp」で入っているので、接続先のCognosのホスト名だけを変更すれば良いのかと思いがちですが、
![A01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/da5bfac3-a09c-6fdb-819e-4c4d47a37a15.png)

この様に「/p2pd/servlet/dispatch」に変更しないとダメです。
![A02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/326e01a2-954b-cf6c-5bfe-9e01e20fed5e.png)

元々のデフォルト値を変更しておいてくれよ～と思いますが、情報共有しておきますので、皆様はまらないようお気をつけ下さい。
Raspberry Pi OSで、Chromium を kiosk mode 実行する

基本的な方法は以下を踏襲した。
https://blog.r0b.io/post/minimal-rpi-kiosk/

# 環境
Raspberry Pi 2 Model B

# Raspberry Pi OS Lite をインストールする。
https://www.raspberrypi.org/software/

（参考　https://dev.classmethod.jp/articles/raspberry-pi-imager-introduction/ ）

# 無線LANネットワークの設定をする。
（参考：https://qiita.com/nanbuwks/items/9a1d46c22e898178015c ）
以下のファイルを書き換える。

    $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf


```wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
ssid="myssid"
psk="mypassphrase"
}
```

「myssid」は自分の無線LANの「SSID」、
「mypassphrase」は自分の無線LANの「暗号化キー」に変更する。

# 最新パッケージに更新する。

    $ sudo apt update
    $ sudo apt upgrade

# 必要なパッケージをインストールする。

```
$ sudo apt-get install --no-install-recommends xserver-xorg-video-all \
  xserver-xorg-input-all xserver-xorg-core xinit x11-xserver-utils \
  chromium-browser
```

# 自動ログインの設定をする。

    $ sudo raspi-config
 Boot Options > Console Autologin

# 自動でstartxを起動する設定をする。

    $ nano /home/pi/.bash_profile

```".bash_profile
if [ -z $DISPLAY ] && [ $(tty) = /dev/tty1 ]
then
  startx -- -nocursor
fi
```
カーソルを消すために、`-nocursor`をつける。
（参考：https://qiita.com/naohikowatanabe/items/73b093399deb0ebf496e ）

# startx時の設定をする。
/home/pi/.xinitrcを作成する。

    $ nano /home/pi/.xinitrc

```".xinitrc"
#!/usr/bin/env sh
xset -dpms
xset s off
xset s noblank

chromium-browser https://google.com \
  --window-size=1920,1080 \
  --window-position=0,0 \
  --start-fullscreen \
  --kiosk \
  --incognito \
  --noerrdialogs \
  --disable-translate \
  --no-first-run \
  --fast \
  --fast-start \
  --disable-infobars \
  --disable-features=TranslateUI \
  --disk-cache-dir=/dev/null \
  --overscroll-history-navigation=0 \
  --disable-pinch
```
`--window-size= `は、自身のディスプレイサイズに調整してください。

# 日本語フォントをインストールする。
このままだと、日本語が豆腐になっているので、（no more tofu）

    $ sudo apt install fonts-noto-cjk
cjk は、China、Japanese、Koreaの3つだそうです。
（参考：https://oxynotes.com/?p=10293 ）

# まとめ
kioskモードでchromium を実行するところまでできました。
Unity ShaderGraph レシピ #12 グレースケールフィルタ

#グレースケールフィルタ
![gif_animation_017.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/2ac46137-1fff-12a6-1080-9def35978eb2.gif)


#作り方
RGBそれぞれの色味に係数を掛けるだけです。
[こちらの記事](https://qiita.com/yoya/items/96c36b069e74398796f3)によくまとまっているので詳しく知りたい方は併せて読むと理解が深まります。

今回はBT.601方式の計算を使います。

### 1.カラー値に係数を掛ける
> 0.299 * R + 0.587 * G + 0.114 * B = グレースケール

上記が計算式です。
「各色に係数を掛けた結果を足す」ことでグレースケール値を算出します。
つまり内積で一発で求められます。
![スクリーンショット 2020-12-29 0.05.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/24f8ba9c-5a32-468c-aeba-c4d7665c9556.png)


### 2.元の色からじょじょに変化させる
Leapを使って、元画像とグレースケール画像を補完できるように作っておきます。
パッと切り替わるだけだと使いづらいですからね。

![スクリーンショット 2020-12-29 0.05.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/0d476a9a-7826-9457-2531-bab6ac95b931.png)

LeapノードのTの値に0〜1の係数を入れることでスムーズに変化する演出がつくれます。

###完成！
![gif_animation_017.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/2ac46137-1fff-12a6-1080-9def35978eb2.gif)


---
その他のレシピは[ShaderGraphレシピ一覧](https://qiita.com/Teppy/items/73fc6141751a62f5265d)にまとまっています