OmniAICreator/Qiita-1.07M huggingface dataset:
webpackでPWA化をするための設定

どうもこんにちは、ウマシバ([@UMASHIBA](https://twitter.com/UMASHIBA))といいます。
今回、[こちら](https://github.com/UMASHIBA1/3DRamenTimer)のウェブアプリをwebpackを使ってPWA化しようとした際に結構詰まったので備忘録を兼ねて記事にします。

# 概要

今回、webpackでウェブアプリをPWA化するために使った主なwebpackライブラリは以下のようなものです。

- [workbox-sw](https://www.npmjs.com/package/workbox-sw)
- [workbox-webpack-plugin](https://www.npmjs.com/package/workbox-webpack-plugin)
- [webpack-pwa-manifest](https://www.npmjs.com/package/webpack-pwa-manifest)  

PWAを作成するのに必要な**service-worker.js**と**manifest.json**をこれらを使って作成しました。

今回は、workbox-sw,workbox-webpack-pluginでservice-worker.jsを作成し、webpack-pwa-manifestでmanifest.jsonを作成した形です。

# Workbox
[Workbox](https://developers.google.com/web/tools/workbox)はGoogleが作成したservice-workerを作成するためのツールです。

**workbox-sw**でworkboxの機能を使えるようにして、**workbox-webpack-plugin**でwebpackに対応させます。

webpack.config.jsに書いたコードは以下のようになりました。

``` js
const workBoxWebpackPlugin = require("workbox-webpack-plugin");
const outputPath = path.resolve(__dirname, "public");

module.export  ={
  ...
  ...
  plugins: [
    new workBoxWebpackPlugin.GenerateSW({
      swDest: outputPath + "/service-worker.js"
    })
  ]
}
```

swDestでservice-worker.jsの出力先を指定しています。

# Webpack PWA Manifest

[webpack-pwa-manifest](https://github.com/arthurbergmz/webpack-pwa-manifest)はmanifest.jsonを生成するためのライブラリです。

webpack.config.jsに書いたコードは以下のようになりました。

``` js
const workBoxWebpackPlugin = require("workbox-webpack-plugin");
const outputPath = path.resolve(__dirname, "public");

module.export  ={
  ...
  ...
  plugins: [
    new WebpackPwaManifest({
      short_name: "3D Timer",
      name: "3D Ramen Timer",
      display: "standalone",
      start_url: "index.html",
      background_color: "#202124",
      theme_color: "#FF0000",
      icons: [{
        src: path.resolve("src/images/icon_512.png"),
        sizes: [96, 128, 192, 256, 384, 512],
      }]
    }),
    new workBoxWebpackPlugin.GenerateSW({
      swDest: outputPath + "/service-worker.js"
    })
  ]
}
```

もともとmanifest.jsonに書いていたものをwebpack.config.jsに書くことで出力先ディレクトリにmanifest.jsonが出力されます。

違う点はtheme-colorがtheme_colorになる点とiconsの指定方法です。

theme-colorに関してはmanifest.jsonに記載されず、出力先のindex.htmlにて以下のようなタグとして追加されます。
`<meta name="theme-color" content="#FF0000" />`

iconsに関しては
srcで指定したファイルからsizesで指定した大きさのファイルを作成してくれます。

---
以上がwebpackでPWA化するための設定です。
間違いに気づいた場合やより良い方法を知っているという方がいらっしゃいましたらコメントにてよろしくお願いします。
基本情報19週目(02/24週)

# 目標と結果
### 目標
- 参考書をみる。
- [基本情報技術者試験ドットコム](https://www.fe-siken.com/)を使う。
- 午後で通用する様に内容を理解する。
- 情報セキュリティの勉強をする。
- アルゴリズムの勉強

### 結果
- 風邪をひいてしまったのであまり勉強ができなかった。
    - 治すことに専念したのでもう大丈夫です！
- 講座がコロナの影響で中止になってしまった。
    - 模擬試験まで中止だそうなのでセルフでやろうと思います。

- 問題
    - https://www.fe-siken.com/kakomon/01_aki/pm04.html
        - ちゃんと読めば解けるネットワークの問題
        - IPv6のアドレスは一見すると複雑で、手に負えないように見えるので冷静になることが大事

# 振り返り
### Keep
- なし

### Problem
- 講座が全てなくなったので解説本中心で取り組んでいくしかない

### Try
- アルゴリズムの勉強以外もやる
CentOS のクライアントで ”bad option; for several filesystems (e.g. nfs, cifs) you might need” エラーがでたんだが？どうしたらいいんだろうか？ あっ でも３分で解決しますがなにか？

# なろう風です
[ひざに矢をうけてしまったので…](https://ncode.syosetu.com/n0074em/) みたいな、なろう風で困ったことがありました。まあ、すぐに解決したのですが忘れやすいので自分メモしてます。

自宅のサーバが CentOS6 なので地味に CentOS8 環境を作成して移行しているのですが、nfs の,というか mount 関連は何故かいつもつまずく、、　※最小構成でインストールしているからかな？

今回、下記のように mount でエラーが発生しました。
結果 `rpcbind` をインストすればいいんだけなんですが・・・

```text
mount: /xxx: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program.
```

下記のサイトさん参考になりますね秒殺シリーズ！！わたしも好きです！

> [CentOS7にNFSサーバーを秒で構築](https://qiita.com/Esfahan/items/1b5b3a74dcd86fd30e5c)

が、 `nfs-utils` だけインストールしてだけじゃだめってこと。めも。
はいおしまい。
react-native-expo でローカル開発

# ローカルホストサーバに繋げない
Expo で fetch を使用して、ローカルで起動中のAPIにGETできないなぁ
と思っていたら
グローバルに公開されているエンドポイントならリクエストがうまく行った

なんか、どこかの設定をTrueにしないと行けないらしいのだけれど、よく分からん
eject しなくちゃいけないのなら EXPO 使う意味ないし・・・

だから localhost じゃなくて、大人しくプライベートIP使えば良いか
という事で、設定のメモ

# 設定
```
MacBook-Pro ~ % networksetup -getinfo Wi-Fi
DHCP Configuration
IP address: 192.168.11.2
```
fetch でのリクエストの向き先IPをコレにして

バックエンドフレームワーク側でもホワイトリストにこのIPを登録して
あとは起動するだけ

Django

```
./manage.py runserver 192.168.11.2:8000
```

色々触ってると、こんなちっちゃいことも忘れるからメモ
デブサミ2020

##テーマは「ともにつくる」
###翔泳社主催のデブサミに初めて参加させていただきました。
- 参加対象はソフトウェア開発者とのことですが、インフラエンジニアにとっても有意義なセッションをたくさん聴講させていただきました。いいなと感じた点を忘れない様に整理しておきます。

- 登壇者の方達は個性派揃いで勉強になりました。また来年も参加したいなと思う素晴らしいイベントでした。そしていつか自分も登壇したいな！と思いながら、これからも日々楽しく仕事したいと思います:tea:
関係者の皆様どうもありがとうございます:bow_tone1:

- [まとめサイトが公開されています。](https://codezine.jp/article/detail/11981#audience)


##エンジニアよ、今こそ社会課題に立ち向かおう！
- [資料はこちらで公開されています。](https://www.slideshare.net/codeforjapan/code-for-japan-227910934/codeforjapan/code-for-japan-227910934)
- OSSの考え方があっての今のIT社会を忘れず、インフラエンジアでも課題解決になるコード書こう！という気になりました。まずはPython基礎試験を使って学ぶところから始めます。
- 以下は聴講中に書き留めたメモです。
  - シビックTech
  - Code for Japan、Code for ○○ ・・・世界中にある
  - 元Yahoo副社長の宮坂さん→現東京都副知事
  - SDGs、Impact investment
  - 気候変動
  - テクノロジーが課題を解決する
  - Society 5.0
  - **自分の技術をどれだけ課題解決に使っているか**
  - 伽藍とバザール
  - 都市はツリーではない、セミ・ラティス構造
  - **正しいものを正しく作る**
  - ともに考えともに作る
  - 保育園マップ
  - Hack MD


##守りのモニタリングから攻めのモニタリングへ
- New Relic社
- 業務を改善する製品として参考になりました。次はNwe Relicのハンズオンに参加します。
- 以下は聴講中に書き留めたメモです。
 - 従来のモニタリングを更に活用するために
 - オブザバービリティ成熟度モデル
 - 計測を始める
 - 動いているか動いていないのか
 - **ログを集めるだけでない、活用すること**
 - ステップ０：受動的対応→アラートへの対応
 - ステップ１：積極的対応→エラー発生率、レスポンスタイム、SLI、SLOの策定、離脱率
 - ステップ２：予測的対応
 - ステップ３：データ駆動→顧客満足度　→ スコアの改善、星いくつ、デプロイの評価　→指標の向上

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280358/a5ebe1c9-60e3-0def-bd56-83cc8931b30d.png)


##Python基礎試験とデータ分析の例題解説～稟議に使えるPython市場データと試験も紹介～
- [資料はこちらで公開されています](https://www.pythonic-exam.com/archives/news/devsumi2020wintokyo)
- [pythonicとは何か](https://www.pythonic-exam.com/pythonic)理解してからPythonを学ぶことが大切とのこと。この点は、コード書くだけでなく様々な日常の仕事をする上での考え方と同じだと思いますが、分かったつもりにはならず常に実践できるエンジニアになりたいです。
- ちなみにインタラクティブシェルで「import this」と入力すると、phthonicについて表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280358/10a49478-d781-1566-b786-243fccfdad66.png)


##サービスメッシュは本当に必要なのか、何を解決するのか
- [資料はこちらで公開されています](https://speakerdeck.com/toricls/service-meshes-do-we-really-need-them-what-problems-do-they-solve)
- 以下は聴講中に書き留めたメモです。
-  サービスメッシュは本当に必要なのか
 - 利用者の拡大、システムの拡張
 - モノリス,Does everything
 - マイクロサービス, Does one thing
 - 分散トレーシング、X-Ray
 - **マイクロサービスの課題もある**
 - 分割しすぎるとグチャグチャになる
 - サービス間通信の信頼性、可観測性（オブサバービリティ）
 - 失敗を前提に設計しているか？（NW、対向サービス）
 - ログ、メトリクス、トレースのフォーマットがバラバラ
 - 密結合を疎結合に、プロキシを介して通信する
 - envoy proxy
 - AWS App Mesh ・・・envoyの動的設定変更が可能になる


##TOYOTA x Serverless x Microservices ～ グローバル展開のコネクティッドカーを支えるアーキテクチャとエンジニアリングチーム
- 以下は聴講中に書き留めたメモです。
 - コネクテッドサービス
 - **価値を生まない無駄は徹底的に削減**
 - API Gateway + Lambda
 - ELB + Fargate ・・・応答速度が勝る
 - DynamoDB
 - 業務遂行力がちゃんとある人は道具を使うのがうまいのだと感じた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280358/710a144a-d9ab-c39a-0ecd-d4df15d789ac.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280358/049b80f0-784f-c07c-d80a-aec639b6a058.png)
Maya pymel で keyframe animation 設定するメモ

## 背景

* Maya で programmable に attribute にキーフレーム設定したい

## 方法

setKeyframe コマンドでいける.

http://me.autodesk.jp/wam/maya/docs/Maya2009/CommandsPython/keyframe.html

```
cmds.setKeyframe( 'pSphere1', t=0, at='tx', v=1 )
```

などとして, object と attribute と値を設定可能

## attribute の key をすべて削除する

keyframe を設定しなおしたいとき.

https://forums.cgsociety.org/t/delete-all-keyframes-from-objects/1576804/3

`cmds.cutKey` を使う.

## time slider の範囲設定をする

`cmds.playbackOptions` で可能

http://download.autodesk.com/global/docs/maya2013/zh_cn/CommandsPython/playbackOptions.html

## TODO

* [ ] animation の補間方法を指定できないか調べる
  * [ ] animCurve ノードを追加することになる?
* [ ] TRAX エディタに, clip として追加する方法を調べる
ImportError: libcuda.so.1: cannot open shared object file を解決する一例(nvidia container toolkit)

Docker 19.03(--GPUが使えるバージョン)
nvidia container toolkit
の環境で、
tensorflow付きdockerにて、
`libcuda.so.1: cannot open shared object file `
というエラーがでることがよくあります。

もしくは、`nvidia-smi`にて、CUDA Version: ERR!
と表示されます。

ドライバに紐づいたlibcudaのファイルにリンクが取れていないようなので、
`cd /usr/lib/x86_64-linux-gnu`
`ln -s libcuda.so.418.56 libcuda.so.1`
とすることで解決できました。
(418.56はドライバのバージョンによって異なります)
2020/2/24：【復習】繰り返し処理

###▪️▪️▪️▪️初学者の備忘録▪️▪️▪️▪️
己への備忘録として残しております。
参考になればどうぞお使いください。
先輩方々、おかしな部分があればご教授頂けると嬉しいです。
###▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️▪️
#◆繰り返し処理について復習
##・「while」を使う場合
①変数名と初期値の設定
②回数等の条件設定
③処理・出力内容の記述
④どんな繰り返しパターンで

```
num = 0
while num < 10
  puts "こんにちは"
  num += 1
end
```

##・「for」を使う場合
①変数名と初期値と繰り返し範囲の設定
②処理・出力内容の記述

```
for num in 1..10
  puts "こんにちは"
end
```

##・「times」を使う場合
①繰り返し回数の設定
②処理・出力内容の記述

```
10.times do
  puts "こんにちは"
end
```

##・「each」を使う繰り返し処理（配列）
①変数と配列の定義
②実行内容
③処理・出力内容の記述

```
num = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
num.each do |n|
  puts n
end
```

##・「until」を使う繰り返し処理（配列）
①変数と配列の定義
②回数等の条件設定
③処理・出力内容の記述

```
num = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
until num.size <= 3
  num.delete_at(-1)
end
puts num

#=> 10
#=> 20
#=> 30
#=> 40
```

##・「loop」を使う無限繰り返し処理（配列）
①変数と配列の定義
②回数等の条件設定
③処理・出力内容の記述
④無限ループから脱出条件設定（break if）

```
numbers = [1, 2, 3, 4, 5]
loop do
  #sampleメソッドでランダムに要素を１つ取得するように設定

  num = numbers.sample
  puts num
  break if num == 3
end

#=> 5
#=> 2
#=> 3
```
上記内容は「while」分でも実行可能

```
numbers = [1, 2, 3, 4, 5]
while true
  num = numbers.sample
  puts num
  break if num == 5
end
```
**【注意点】**
「loop」はブロックを使うため変数をループ外で参照できない
「while」はループ外で参照できる

##・「添字付き」の繰り返し処理
①変数と配列の定義
②実行内容
※indexの後に(1)と書けば、添字は1から始まる。(10)と書けば10からになる。

```
fruits = ['apple', 'banana', 'orange']
fruits.each.with_index {|fruit, i| puts "#{i}: #{fruit}"}

#=> 0: apple
#=> 1: banana
#=> 2: orange
```

##・「break」と「return」役割の違い
「break」・・・繰り返し処理からの脱出
「return」・・・メソッドからの脱出

いずれにしても、それぞれ挙動が複雑になるので、積極的に使えるテクニックとは認識すべきではない。

##・「break」と「return」以外の繰り返し処理
**●今回は簡単な紹介のみ**
「next」・・・繰り返し処理を途中で中断して次の繰り返し処理に進める
「redo」・・・繰り返し処理をやり直す
※「redo」はこちらが設定した条件をクリアしない限り無限ループしてしまうので、予めやり直し回数の設定をしておく必要がある。

---
以上

様々な繰り返し処理がありますが、「for」はあまり使われなかったりするそうですよ。

それぞれの用法をざっくり理解しつつ、自分がよく使う処理方法を中心に理解を深めていき、「DRY」を体現すべく、素敵な繰り返し処理マスターを目指していきます！
【ROS2】xml形式のlaunchでremapとparameterを記述する方法

<!-- # 【ROS2】xml形式のlaunchでremapとparameterを記述する方法 -->

# はじめに

ROS2でもlaunchファイルをxml形式で書けるようになりました．そこで本記事では，xml形式のremapとparameterについて記述方法を説明します．

# テスト環境

- Ubuntu 18.04
- ROS Eloquent

# remapとparameterの記述方法

```xml
<launch>
    <node pkg="demo_parameters_cpp" exec="string_talker" >
        <remap from="string_topic" to="/talker" />
        <param name="string_param" value="launch defalt" />
    </node>
</launch>
```

## remap

ROS1と同じです．

## parameter

こちらも記述方法はROS1と同じです．yamlファイルで読み込みたい場合は
`<param from="$(find-pkg-share パッケージ名)/yout/parameter/file/path" />`
のように書くとyamlファイルからparameterを設定できます．

# 参考

[ROS2 Launch XML Format](https://design.ros2.org/articles/roslaunch_xml.html)

# 関連記事

- [【ROS2】python形式のlaunchでremapとparameterを記述する方法](https://qiita.com/RenFukatsu/items/a1e08ea3db2a82a53f12)
Android R beta (Android 11)をインストール

Android RをPixel3 XLにMacを利用して入れてみたのでメモ

##前提
+ 前にはQ stable が入っていた
+ Pixel上で開発者モードでusb debugが有効になっている

##手順
基本的には
https://developers.google.com/android/images#instructions
の手順でいけますが、色々問題になるところがありました。

###fastbootにパスを通す
```
export PATH=$PATH:$HOME/Library/Android/sdk/platform-tools
```

普通にAndroid Studioをインストールしたときのパスがこれのはず。

### adb reboot bootloader
まず、usb debugがデバイス上で許可されていないとこうなります

```
$ ./adb reboot bootloader
error: no devices/emulators found
```

開発者モードからusb debugを有効にしましょう。

接続後、macとの接続を許可していないとこうなります

```
$ ./adb reboot bootloader
error: device unauthorized.
This adb server's $ADB_VENDOR_KEYS is not set
Try 'adb kill-server' if that seems wrong.
```

デバイス上のダイアログで接続を許可しましょう

### fastboot flashing unlock
bootloader画面になった状態でunlockを実施しようとしたところ、下記のエラー

```
$ fastboot flashing unlock
ERROR: Couldn't create a device interface iterator: (e00002bd)
ERROR: Couldn't create a device interface iterator: (e00002bd)
ERROR: Couldn't create a device interface iterator: (e00002bd)
FAILED (remote: 'flashing unlock is not allowed')
Finished. Total time: 0.385s
```


bootloaderのunlockは開発者メニューから有効にしなくてはいけません

![lzePdryGRZ4qjfZgxpnHkZTu0opVQYXDz1Co84BYgM8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66163/dd51724f-26f3-9c4c-3d12-b98072dab747.jpeg)\

しかし、キャリア購入（私の場合はdocomo)の場合は、bootloaderのロック解除がそもそもメニューからできない・・・。
（上の画像のような状態）
そこで、SIMロック解除をmydocomoから実施したところ、プッシュで解除できるようになった旨表示され、メニューを見てみると解除できるようになりました。

```
$ fastboot flashing unlock
ERROR: Couldn't create a device interface iterator: (e00002bd)
ERROR: Couldn't create a device interface iterator: (e00002bd)
ERROR: Couldn't create a device interface iterator: (e00002bd)
OKAY [  0.081s]
Finished. Total time: 0.082s
```

エラーでますが、この状態でデバイス上ではunlockしてもいいかどうか、という画面になっているので、デバイス操作でunlockします。

### ./flash-all.sh

実行するとfastbootが古すぎる、という下記のエラー

```
$ ./flash-all.sh
fastboot too old; please download the latest version at https://developer.android.com/studio/releases/platform-tools.html
```

Android Studio経由でSDK Manager見てみると
<img width="1124" alt="Screen Shot 2020-02-24 at 13.45.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66163/f35ca0ca-dbf0-30bc-e068-cdc46f81af1c.png">

確かにバージョンが古い・・・
アップデートの方法もなさそうなので、アンインストールしてインストールしても状況変わらず・・・と思ったんですがバイナリ見てみると

```
$ fastboot --version
fastboot version 29.0.6-6198805
Installed as <略>.../Library/Android/sdk/platform-tools/fastboot
```

上がっているようなので、これで実行。
無事Rを入れることができました。
Rails　Basic認証の導入

# Railsでの認証の種類

Railsで開発をして行く上では、3種類の認証タイプがあります。

* Basic認証
* Digest認証
* Token認証
* 
[こちら](https://api.rubyonrails.org/classes/ActionController/HttpAuthentication.html)の公式ページでも３種類のタイプが紹介されています。この三つを扱えればとりあえずいいのでは。

# Basic認証
今回は最もシンプルなBasic認証について、手順を整理してみたいと思います。

## そもそもBasic認証とはなんぞや

Basic認証とは、サーバーと通信する時にユーザー名とパスワードを知っている人じゃないと、そのサイトにアクセス出来ないようにするための機能です。

[![Image from Gyazo](https://i.gyazo.com/91b47d64f12731b0ab491114a91a059e.png)](https://gyazo.com/91b47d64f12731b0ab491114a91a059e)

こんな感じのやつですね。

# 前提

* アプリケーションサーバーはUnicornを使っているとする
* WebサーバーはNginxを使っているとする
クラウドはAWSを使っているとする

* Capistranoを用いて自動デプロイをしているとする

# application_controllerにメソッドを書く
Basic認証は全てのコントローラで行いたいので、application_controller.rbにコードを書いていきます！
RailsにはBasic認証をするためのメソッドが用意されています。
それが`authenticate_or_request_with_http_basic`です！

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :basic_auth
  protect_from_forgery with: :exception

  private

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]
    end
  end
end
```
`authenticate_or_request_with_http_basic`はRailsで簡単にBasic認証を実装してくれるメソッドです
`username == ENV["BASIC_AUTH_USER"]&& password == ENV["BASIC_AUTH_PASSWORD"]`のところは環境変数を使用します。

直接、username="keita"とかコードに書いちゃうとGithubにミスってアップしちゃった時に確実に不正利用されます！気をつけて下さい！

# ターミナルで　〜/.bash_profileに環境変数を書く

今回は本番環境のみでBasic認証が行われるようにします。

```HTML:ローカル
$ vim ~/.bash_profile
 <!--「i」を押してインサートモードにいく-->

export BASIC_AUTH_USER='keita'
export BASIC_AUTH_PASSWORD='0322'
<!-- 書き終えたらescキーを押して、「:wq」を押して保存して終了-->

$ source ~/.bash_profile

<!--最後に.bash_profileを読み込んで環境変数を反映させる-->

```

# 本番環境でのみBasic認証するようにする

`config/deploy/production.rb`に追記していきます。

```ruby:config/deploy.rb
# server "db.example.com", user: "deploy", roles: %w{db}
server "(御自身のEC2のIPアドレス)", user: "ec2-user", roles: %w{app db web}

set :rails_env, "production"
set :unicorn_rack_env, "production"
# role-based syntax
# ==================
```
これでunicornが現在の環境を本番環境として認識するようになります。

# さらにapplication_controllerの記述を変更する

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :basic_auth, if: :production? 
  protect_from_forgery with: :exception

  private

  def production?
    Rails.env.production?
  end

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]
    end
  end

end
```
追加したのは
`before_action :basic_auth, if: :production?`

`def production?
Rails.env.production?
end`
の二つだけです。

`production?`メソッドで`Rails.env.production?`を定義しているので本番環境なのかローカルなのか分かるようになっています。

# 最後にデプロイして動作確認

```
$ bundle exec cap production deploy
```
もし「え、うまくいかないんだけど、、、、、、、」ってなった時に試すこと

* AWSコンソールから　EC2再起動

* nginx手動で再起動

* Mysql手動で再起動
* Unicornをkill
してから　もう一度自動デプロイコマンド実施
これで上手くいくはず。あとはコードを見直してみてください。
# お疲れ様でした！
paramsとwrap_parameters


JSONでデータを送るとき、コントローラ名と送信するパラメータのキー名（name属性のプレフィクス）の関係についての話です。

UsersControllerというコントローラがあるとします。このコントローラに対して、Ajaxを使いJSON形式かつPOSTメソッド（またはPUT、PATCH）でデータを送ります。パラメータには"user"のようなキーを付けません。

```JavaScript
Axios.post('/users.json', { name: 'Taro', email: 'taro@example.com' });
```

すると、コントローラのparamsには、"user"というキーが自動的に付きます（値がラップされます）。これが、[ActionController::ParamsWrapper](https://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html)の機能です。

```ruby
{"name"=>"Taro", "email"=>"taro@example.com", "user"=>{"name"=>"Taro", "email"=>"taro@example.com"}}
```

次のようにストロングパラメータを使っていても大丈夫、というわけです。

```ruby
def user_params
  params.require(:user).permit(:name, :email)
end
```

しかし、コントローラ名とは違うキー名を使いたい場合があります。次の例では"member"です。

```JavaScript
Axios.post('/users.json', { member: { name: 'Taro', email: 'taro@example.com' }});
```

すると、コントローラのparamsには、"user"というキーが付き、中は空となります。

```ruby
{"member"=>{"name"=>"Taro", "email"=>"taro@example.com"}, "user"=>{}}
```

これが気になるときは、wrap_parametersメソッドでキー名を指定します。このコントローラでラッピングに使われるキー名が"member"になります。

```ruby
class UsersController < ApplicationController
  wrap_parameters :member
```

あるいは、次のようにすると、JSON形式ではラップしなくなります。

```ruby
class UsersController < ApplicationController
  wrap_parameters format: []
```

コントローラすべてに適用するには、initializers下の設定ファイルで指定します。配列`[:json]`を空にします。

```ruby:config/initializers/wrap_parameters.rb
ActiveSupport.on_load(:action_controller) do
  wrap_parameters format: []
end
```

## 実際のプロジェクトでは

一番上のサンプル（キーを付けない場合）では、値が配列やハッシュの場合はラップしてくれません。ActionController::ParamsWrapperの設定をデフォルトにしたままだと混乱を招きそうです。

新規プロジェクトではinitializers下の設定でJSONを外しておくのがいいと思います。既存のプロジェクトでは、デフォルトでオフにするのはちょっとこわいので、コントローラごとに指定しておくことにします。

そのうえで、「AjaxでPOST、PATCHするときは、パラメータにキーを付けて値をラッピングして、ストロングパラメータを使うこと」というガイドラインを作っておくとよいかと。

## 補足

この機能いつからあったっけと調べたら、だいぶ昔で、2011年の[Rails 3.1からでした](https://api.rubyonrails.org/v3.1.0/classes/ActionController/ParamsWrapper.html)。
【ROS2】python形式のlaunchでremapとparameterを記述する方法

<!-- # 【ROS2】python形式のlaunchでremapとparameterを記述する方法 -->

# はじめに

ROS2からpythonでlaunchファイルを記述できるようになりましたが，まだチュートリアル以外の例があまり見つかりません．そこで，今回はROS2のGithub([ros2/launch_ros](https://github.com/ros2/launch_ros))からリマップとパラメータの使い方を探しました．

# テスト環境

- Ubuntu 18.04
- ROS Eloquent

# remapとparameterの記述方法

```py
import launch
import launch_ros.actions

def generate_launch_description():
    return launch.LaunchDescription([
        launch_ros.actions.Node(
            package='demo_parameters_cpp',
            node_executable='string_talker',
            output='screen',
            node_name='string_talker',
            remappings=[('string_topic', '/talker')],
            parameters=[{'string_param':'changed'}]
        )
    ])
```

## remap

argumentに`remappings`を指定し，タプルをリストに連ねていきます．タプルは`(remap前のtopic名, remap後のtopic名)`で記述します．

## parameter

argumentに`parameters`を指定し，辞書をリストの中に置きます．複数のパラメータを指定する場合は`[{parameter1:value1, parameter2:value2, ... }]`のように記述します．

yamlファイルで読み込みたい場合は
`parameters=['parameter_dir/parameter.yaml']`
のように書くとyamlファイルからparameterを設定できます．

# 参考

[ros2/launch_ros](https://github.com/ros2/launch_ros)

# 関連記事

- [【ROS2】xml形式のlaunchでremapとparameterを記述する方法](https://qiita.com/RenFukatsu/items/287cd01bbef90a7bd171)
Firebase 条件分岐をしてデータの読み取り（Firestore）

#はじめに
Firebaseのデータベース**Firestore**で、条件分岐をしてからデータを取得する例です。
また、取得したデータの数をカウントしてます。


私の環境
・Ionic + Angular


#whereを使う

eventの中身がこんな感じだとする。

```typescript:event.model.ts
export class Event {
         constructor(
           public id?: string,
           public title?: string,
           public periods?: boolean,
         ) {}
       }
```


```typescript:home.page.ts
import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFirestore } from '@angular/fire/firestore';

@Component({
  selector: 'app-home',
  templateUrl: 'home.page.html',
  styleUrls: ['home.page.scss']
})
export class HomePage implements OnInit {
private eventCount;
 private periodCount;


constructor(
    private afAuth: AngularFireAuth,
    private db: AngularFirestore
  ) { }

  ngOnInit() {
    this.afAuth.auth.onAuthStateChanged((user) => {
      if (user != null) {

      // events以下の全てのドキュメントを取得してカウント
        this.db
          .collection(`users/${user.uid}/events`)
          .snapshotChanges()
          .subscribe(c => {
            this.eventCount = c.length;
          });

      // events以下のドキュメントでperiodsプロパティがtrueのドキュメントを取得
        this.db
           .collection(`users/${user.uid}/events`, ref =>
             ref.where('periods', '==', true)
           )
           .snapshotChanges()
           .subscribe(c => {
             this.periodCount = c.length;
           });
      }
    });
  }
```


#参考
https://stackoverflow.com/questions/49026589/angular-firestore-where-query-returning-error-property-does-not-exist-on




}
ツール整理：Google Colaboratory (2020.2.24更新)

# 目的
- SIGNATEやNishikaなどの国内の分析コンペは、計算プラットフォームがないので、自前のノートPCでは辛くなってきた。そこで、GoogleColaboratoryの自分用の使い方メモ。
Kaggleは計算プラットフォームがあるので、問題ない。

- 都度、更新していく予定 2020.2.24
    - テンプレート作成

# 目次
1. テンプレート

# 1. テンプレート
- 「XXX」、「../input/data」を自分のフォルダに、書き換えて使用する。
- 内容
    1. Google Driveにマウント
    2. 経過時間表示

```.py
import os
path = None
# プラットフォーム判定
# nt:Windows系 , それ以外Google Colab
if os.name == 'nt':
    # ローカルフォルダ
    path = '../input/data/'
else:
    # (1)Google Driveにマウント
    from google.colab import drive
    drive.mount('/content/drive')
    !ls drive/My\ Drive/'Colab Notebooks'/XXX/input/data
    path = "./drive/My Drive/Colab Notebooks/XXX/input/data/"
    # (2)経過時間確認 (12時間ルール用)
    !cat /proc/uptime | awk '{print $1 /60 /60 /24 "days (" $1 / 60 / 60 "h)"}'

print('os:',os.name)
print('path:',path)
```
ウイイレイベント告知用のBot作成してみた

# ウイイレイベント告知用のBot作成してみた

どうも[ヤジュン](https://qiita.com/junya0001000/items/ccb673ba7c07a57e6d8a#%E8%87%AA%E5%B7%B1pr)です。
今回は、TwitterのBotを作成してみました。

※本記事のソフトウェアは、Pythonで作成しています。[■参考URL](https://qiita.com/drafts/c043cc9c45d2c8c1209b/edit#%E5%8F%82%E8%80%83url)


## ■背景・導入
* 2019年から「eスポーツ」市場が急速に成長した.
    それに伴い「ウイイレ」のイベントが毎週全国各地で開かれるようになった。
    これは、イベントの開催者が、プレイヤーから一般企業や団体に移ったためである。

    しかし。。。一つの問題が。。。
    
    **情報インフラの整備がされていない！！**
    **大会情報がプレイヤーに伝わらない！！**
    
    ![](https://i.imgur.com/BGsXSfZ.png)

    
    **なら、誰かインフラを作るしかない！！
    本記事は、世界に誇れるウイイレ民のウイイレ民によるウイイレ民のためのインフラ　「ウイフラ」を作って(ry**

![](https://i.imgur.com/bn0pOlR.png)


## ■目的
* ウイイレ大会・イベントの開催情報の流れを一元化する。

## ■方法
* twitterのBOTを作成して、目的を達成します。
    ウイイレプレイヤーが好んで使用するからです。  
    また、大会情報の告知もtwitterで行われるのが主です。
    
### ▼技術的な話
* Botの作成には、Pythonの[tweepy](https://www.tweepy.org/)を使用します。  
    twitterが公開しているapiです。  
    五重羅生門並に、使用許諾申請がだるい！ 

    ![](https://i.imgur.com/pt6jo3R.png)

    
    tweepyでやること自体はシンプル！

-----

1. ハッシュタグ「#ウイイレ_イベント告知」をTLから検索
1. 該当ツイートをRT

-----

* 次は、上記のコードが定期的に実行されるようにします。
    今回は[AWS](https://aws.amazon.com/jp/about-aws/)を使用しました。
    
    これもやることはシンプル！
    
-----

1. AWS側から、1分間隔でイベントハンドラ呼び出ししてもらう

-----

## ■結果
* 出来上がったBotがこいつ[PES_EVENT_BOT](https://twitter.com/PESeventBOT)
    試しにハッシュタグ「#ウイイレ_イベント告知」付きでツイートしたら、見事RTされました！


![](https://i.imgur.com/WyBOdkR.png)

![](https://i.imgur.com/1HHDB0r.png)

![](https://i.imgur.com/iicsv68.png)



## ■お願い！
* お願いは２つ！
    
    **①[本Bot](https://twitter.com/PESeventBOT)をフォローして下さい
    ②大会やイベント告知ツイートにハッシュタグを付けてください。**
    
     ウイイレの大会やイベント開催情報を見つけたら、ハッシュタグ「#ウイイレ_イベント告知」をつけて引用RTしてください。
    ※そして、もし可能であれば大会主催者側に本Botの存在を教えてください！
    次の告知ツイートから主催者側でハッシュタグをつけてもらえるかも？？

![](https://i.imgur.com/HC7Wt8B.png)


## ■終わりに
* 今回作成したBotで、ウイイレ界をより便利に出来たら嬉しいです！
    本活動は、趣味でやっていますが、わがまま言っていいなら[私のyoutubeチャンネル](https://www.youtube.com/user/junya090400)を登録してくれると嬉しいです！笑

    もし増えたら、他のアイディアも実行します♪笑

## ■参考URL
1. [Twitterのbotをpythonで作成する手順](https://qiita.com/yuki_bg/items/96a1608aa3f3225386b6)
1. [API Reference](http://docs.tweepy.org/en/v3.5.0/api.html)
1. [５分でわかる！AWS Lambda の使い方](https://blog.apar.jp/web/10804/)
【制御工学】Pythonによる伝達関数のグラフ化


# 1.はじめに
・前回書いたqiitaのページ( https://qiita.com/sato235/items/f991411074c578d1640c )　に、波形グラフを出力して考察したら面白いのではというコメントをもらったのがきっかけで、本ページを作成。

# 2.参考
# 2.1.図書
[1] 南裕樹　著、オーム社、「Pythonによる制御工学入門」

#2.2.ウェブページ
a) [1]の著者サポートページ、https://y373.sakura.ne.jp/minami/pyctrl
b) 前回の自頁、https://qiita.com/sato235/items/f991411074c578d1640c
c) controlモジュールのmatlab関数のグラフ化機能、http://matsulib.hatenablog.jp/entry/2013/04/27/093008

# 3. 伝達関数とグラフ化
まずモジュールのインポート。

```py
import sympy
from control import matlab
import numpy as np
import matplotlib.pyplot as plt
```

伝達関数を作成

```py
Np = [0,1]
Dp = [1,2,3]
P = matlab.tf(Np, Dp)
print(P)
```

伝達関数の出力

```py
      1
-------------
s^2 + 2 s + 3
```

上記の伝達関数に、ステップ関数を入力した場合。

```py
t = np.linspace(0, 3, 1000)
yout, T = matlab.step(P, t)
plt.plot(T, yout,label="test")
plt.axhline(1, color="b", linestyle="--")
plt.legend(bbox_to_anchor=(1, 0.25), loc='upper right', borderaxespad=0, fontsize=11)
```
![step_20200224.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509872/a92849ba-591a-c049-ebaf-499efcd46c3b.png)

伝達関数Pに、インパルス応答関数を入力した場合。

```py
yout, T = matlab.impulse(P, t)
plt.plot(T, yout,label="test")
plt.axhline(0, color="b", linestyle="--")
plt.xlim(0, 3)
plt.legend(bbox_to_anchor=(1, 1), loc='upper right', borderaxespad=0, fontsize=11)
```
![impulse_20200224.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509872/62a41371-28a7-198d-7e0d-946ad9fe585f.png)



# 4. 結論
・controlモジュールに、matlab計算機能があることを学んだ。
・同様に、matplotlibの描画機能もあった。
・次は、入力関数を変えて、得られる結果の考察をしたい。
AWS試験対策（⑪アプリケーション統合）

アプリケーション統合編。
とりあえずこのまとめるシリーズが終わったら、よくある質問とか読んでみて、明日くらいに模擬試験を受けてみようと思う。

##SQS
Simple Queue Serviceの略。設計時点ではトラフィックの量を想定できないとき、メッセージをここに一時的に受け入れ、それを後から処理する。普通にキューですね。
あとは、めっちゃ負荷がかかる処理が来た際に、それを一時的に受け入れるのはもちろん、CloudWatchで閾値を超えればオートスケールしてくれたりする。
標準キューとFIFOキューがある。標準キューなら配信は配信しやすい順になる。少なくとも一回以上行われる。
FIFOはメッセージの送信の順序通りに配信される。一回限りで確実に処理する。送受信の順序指定が必要な場合はこっち。

##SNS
Simple Notification Serviceの略。通知。メールとかSMSとかに通知できる。

 - パブリッシャ
メッセージ送信者。

 - サブスクライバ
メッセージ受信者。

 - トピック
論理的なアクセスポイント及び通信チャネル。要するにサブスクライバのグループ？

順番は
①パブリッシャがトピック(グループ)を作成する
②トピック(グループ)にサブスクライバを登録する。サブスクライバは受信方法を指定する(Eメールとか)
③パブリッシャがトピックにメッセージ送信

##SNSとSQSの連携
SQSだけだったら、三つのタスクがあった場合、直列処理しかできないが、SNSと組み合わせることにより、SNSが振り分けを実施してくれるので処理を並列で行うことができる。

##SES
Eメールサービス。出荷通知や注文状況、広告、ニュースレターなどのマーケティングメッセージなどを顧客に自動配信できる。
また、逆に、受信したメールをもとにS3へメール配信したり、lambdaを呼び出したりできる。

メール送信方法にはHTTP REST APIとSMTPエンドポイントの二種類がある。
HTTP REST APIでは各種言語のSDKからAPI経由で呼び出される。
SMTPエンドポイントではSMTPサーバポートでSMTPリクエストを受け付ける。
覚え方はAPIがつくのはAPI、その他はSMTPでいいかな。。。

##SWF
Simple Workflow Serviceの略。分散している非同期/同期のタスクを一連のフローとして設計し、耐障害性を高めれる。要するにフローをこいつが自動処理してくれるってことかな
あんましよくわからないし重要度低そうなので割愛。。。

とりあえずここまで。もうそろおわり！！
Cent OS 8 インストール

#はじめに
初投稿です。
独習で得た知見の備忘録として残していきたいと思っています。

#イメージのダウンロード
こちらからダウンロード出来ます。
[https://www.centos.org/download/](https://www.centos.org/download/
)

Cent OS 8からMinimalはなくなりました。

#インストール
インストール時のスクショはいろんなところで公開されていますので、割愛します。
Hyper-Vで仮想マシンを作成する場合は、セキュリティを「Microsoft UEFI 証明機関」にするのがポイントです。（これにしないとブートしない）
![Hyper-V1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/5013d65e-1596-1a95-6994-19f0b7c1b205.jpeg)


#アップデート
インストール後、下記のコマンドでアップデートします。

```Bash
dnf -y update
```

アップデート後は、再起動しておいた方が良いかもしれません。

```Bash
reboot
```
Raspberry Pi に OpenCV を最速でインストールする方法

<!-- # Raspberry Pi に OpenCV を最速でインストールする方法 -->

# インストール方法

以下をラズパイのターミナルで実行してください

```bash
sudo apt update
pip3 install --upgrade pip
sudo pip3 install opencv-python==3.4.4.19
sudo apt install -y \
                 libatlas-base-dev \
                 libjasper-dev \
                 libqt4-dev \
                 libqtgui4
```

3分程度でインストールできます．
Vueファイル の jQuery で $ is not defined にたまに遭遇する

# 背景
vueでjqueryを使っているときに $ is not defined や,
jQuery is not definedに遭遇するのでソッとメモっておきます

## $ is not definedについて

```:○○.vue
// ＊ 今回はjQueryをCDNで読み込みます
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script>
export default {
  mounted: function () {
  }
}
</script>
```
### vueでjqueryを使う場合
mountedの中にjqueryの処理を書いていきますが、

下記のようにその中でいきなり $ を使った変数の宣言を行うと

```
<script>
export default {
  mounted: function () {
    $(".〇〇").click(function () {
    })
  }
}
</script>
```
$ is not definedというエラーに遭遇します。

### 解決法
下記のように、jQuery(function ($) {}をmountedの中に追記します

```
<script>
export default {
  mounted: function () {
　　 jQuery(function ($) {
    　$(".〇〇").click(function () {
      })
    })
  }
}
</script>
```

##  jQuery is not definedについて
これは自分の場合ですが、jqueryの読み込みをbodyタグの中で行っていた場合にこのエラーが出ました。

参考：
https://teratail.com/questions/32854
業務でDBeaverを利用する上でのオススメ設定

業務でDBeaverを利用しはじめて半年程度です。便利に使っています。
設定を見直したメモです。


# Edit Connection
Connectionごとの設定です。

## Auto-commitを無効化
Auto-commitを無効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/3f2676a4-0161-7862-afa5-d8cdab73ded6.png)

## Isolation Levelを適切に設定
私の場合、普段は `Read Commit` に設定しています。手動でDBを更新することがないため、常にアプリケーションの一連の処理が終わった状態を参照したいからです。
メンテナンスなどで手動で更新する必要がある場合のみ、 `Serializable` に設定します。メンテナンスでは全件取得 → WHERE句が同じ状態で UPDARE のような手順を取ることがあり、その間に行数が増減するのを防ぐためです。

## Connection type
環境ごとに適切に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/dd579289-4855-0941-9078-824a7536ddc1.png)

## Security
影響の大きい環境では `Read-only connection` に設定します。こうすることで、UPDATEやDELETEの誤爆を防げます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/382a4ccd-6254-06d1-2295-0670d2373c24.png)


# Preference
全体で共通の設定です。

## Preference > DBeaver > Connection Types
普段からトランザクションに慣れておきたいので、Development環境でも `Auto-commit by default` はOFFにしています。
その代わり、`Confirm data changes` はDevelopmentではオフにします。どちらもオンだと、DevelopmentとProductionの間違えに気がつくきっかけが減ってしまうと考えているためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/ffa72128-b040-fe5c-5ec4-7a98f0d78bfe.png)

## Preference > DBeaver > Editors > SQL Editor 
`Connect on editor activation` をオフにして、 `.sql` ファイルを開いた際の接続先を明示的に指定するようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/7d41dc43-b0c4-1e4d-d2c7-a8eeeb9ca0b9.png)


## Preference > DBeaver > Transactions
`Auto Commit` をオフにしていれば無意味なのですが、万一 Auto Commitがデフォルトでオンになっていた場合に備えて `Return to auto-commit on transaction end` を無効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/44df405a-00f2-61ab-6688-04914f870d1c.png)

# JVM起動時のオプション

## Timezone を UTCに変更

`/Applications/DBeaver.app/Contents/Eclipse/dbeaver.ini` に `-Duser.timezone=GMT` オプションを追加します。時刻が勝手にJSTで表示されるのはハマるのでおすすめできません。

```dbeaver.ini
-vm
../Eclipse/jre/Contents/Home/bin/java
(省略)
-Xms64m
-Xmx1024m
-XstartOnFirstThread
-Duser.timezone=GMT

```



# その他

ショートカット読み込んでおくと業務効率が上がりそうですね。
素晴らしいまとめがあったのでリンクをご紹介。
https://wonwon-eater.com/dbeaver-shortcut
AtCoderで水色になるまでにやったこと

先日やっと水色コーダーになれたので、ここまでやったことを書きます。
<img width="600" alt="atcoder-rating" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132099/7b7cf4cd-cb0f-a0a1-99ab-0a8f6ade8327.png">

# 使用言語

Rustを使ってます。言語については様々な議論があると思いますが、C++並の速度が出て、なおかつ書きやすいので競プロには向いていると思います。

Rust経験は全くなく、競プロをきっかけとして、コンテストに参加しながら勉強していました。

# 勉強したアルゴリズムやテクニック

このあたりはABCに参加しながら、解説に出てきたら勉強していました。

- 二分探索
- しゃくとり
- 累積和
- グラフ
    - DFS, BFS
    - ワーシャルフロイド
- 全探索
    - ビット全探索
- DP
- 整数
    - GCD, LCM
    - 素数列挙
    - 素因数分解
    - 二項係数(Combination, nCrのこと)
- Mod計算
    - ユークリッド互助法による逆元計算（割り算のこと）
    - 二項係数
    - 累乗計算

他にも最大流やUnion-Findなど勉強しましたが、今のところABCで使う機会はなかったと思います。

## DPについて

Educational DP ContestをK問題あたりまで解いたのと、蟻本の2章がとても勉強になりました。

## ライブラリ化したもの

AtCoderは[ルール](https://atcoder.jp/contests/abc156/rules)上「自作ライブラリの使用」は認められているので、よく使うものはコピペできるようにしておくと良いです。
このあたりはよく使っている印象です。

- グラフ
    - DFS, BFS
    - ワーシャルフロイド
- 整数
    - GCD, LCM
    - 素数列挙
    - 素因数分解
- Mod計算、ModInt構造体
    - 逆元計算
    - 二項係数

特にMod計算を普通の計算のように扱える、ModInt構造体は作っておいて損はないと思います（こういうことをやろうと思うと、演算子オーバーロードのある言語が良いですね。Rustはできます）。

# 日頃の勉強方法

## とにかく参加する

やはり多くの回数コンテストに参加するのが重要だと思いました。
AGCやARCレベルは難しすぎるので、ABCに絞って参加するようにしていました。
コンテストに参加しつつ、解けなかった問題の解説を見て知らないアルゴリズムを勉強したり、実際に実装するのを繰り返していました。

またコンテストがない日でも、バーチャル参加機能を使って過去のコンテストに参加していました。一問単体でやるより、時間を計って実戦形式で参加する方が練習になると思っています。本番には何かしら罠があるもので、そういった教訓を学ぶこともできるので。

AtCoder ProblemsのStreakは一時期気にしていましたが、つらいのでやめました。疲れているときに無理にやるより、休日に頑張ればいいと思います。

## 蟻本

上にも書きましたが蟻本の2章辺りまでは読んでおくととても役立つと思います。定番だけあって読みやすくて良い本です。

# 終わりに

水色を目標に頑張っていたのでひとまず達成してしまったのですが、次はもう少しゆっくりと青コーダーを目指したいと思います。
Java8メソッド参照

今回みなさんと一緒にJava８のメソッド参照を勉強しましょう。

まずは、Java８以前の方法で年齢ソードのメソットを作りましょうか。

# lombokを使う

```java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.*;

public class App {
    public static void main( String[] args ) {
        List<Person> personList = new ArrayList<Person>();
        personList.add(new Person("Jack",25));
        personList.add(new Person("Mary",23));
        personList.add(new Person("Jill",24));
        personList.add(new Person("Dock",34));
        personList.add(new Person("Lily",27));


        // 匿名クラス
        Collections.sort(personList, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge() - o2.getAge();
            }
        });

        System.out.println(personList);
    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Person {
    private String name;
    private int age;
}
```

実装結果：`[Person(name=Mary, age=23), Person(name=Jill, age=24), Person(name=Jack, age=25), Person(name=Lily, age=27), Person(name=Dock, age=34)]`


# Lambda式

```java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.*;

public class App {
    public static void main( String[] args ) {
        List<Person> personList = new ArrayList<Person>();
        personList.add(new Person("Jack",25));
        personList.add(new Person("Mary",23));
        personList.add(new Person("Jill",24));
        personList.add(new Person("Dock",34));
        personList.add(new Person("Lily",27));

        // Lambda式
        Collections.sort(personList,(p1,p2) -> p1.getAge() - p2.getAge());
        System.out.println(personList);
    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Person {
    private String name;
    private int age;
    
}
```

実装結果：`[Person(name=Mary, age=23), Person(name=Jill, age=24), Person(name=Jack, age=25), Person(name=Lily, age=27), Person(name=Dock, age=34)]`

# static メソッド参照

```java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.*;

public class App {
    public static void main( String[] args ) {
        List<Person> personList = new ArrayList<Person>();
        personList.add(new Person("Jack",25));
        personList.add(new Person("Mary",23));
        personList.add(new Person("Jill",24));
        personList.add(new Person("Dock",34));
        personList.add(new Person("Lily",27));

        // static メソッド参照
        Collections.sort(personList, Person::CompareAge);
        System.out.println(personList);

    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Person {
    private String name;
    private int age;

    public static int CompareAge(Person o1, Person o2) {
        return o1.getAge() - o2.getAge();
    }
}


```
ラムダ式入門

##何でラムダ式を使うのか？
大規模な開発に使われるJavaでは、なるべくコードの量を減らし読みやすいことを求められています。そのような時役にたつのがJava8で使われている「ラムダ式」です。
ラムダ式の特徴としては、メソッドを変数のように扱えることです。

書き方：

```java
[インタフェース宣言]= (引数）->{実行ブロック}
```
さっそくソースコードから確認してみましょう。
まずは伝統的な表現式：

```java

public class LambdaTest {

    public static void main(String[] args) {
        // 伝統的な表現
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("threading" + Thread.currentThread().getId());
            }
        }).start();
    }
}
```

次は、Lambda式の表現です。

```java

public class LambdaTest {

    public static void main(String[] args) {
        // Lambda表現
        new Thread(() -> {
            System.out.println("Lambda threading" + Thread.currentThread().getId());
        }).start();
    }
}
```
##Java関数型インタフェース
Javaの関数型インタフェースは伝統的なインタフェースとほとんど同じですが、唯一の特徴は関数インタフェースが「定義されている抽象メソッドが1つだけあるインターフェース」であることです。staticメソッドやデフォルトメソッドは含まれていても構わないです。（java.lang.FunctionalInterfaceアノテーションを付けるのが良いでしょう）。

Java関数インタフェースについての詳細紹介を参考ください。
https://qiita.com/Jenny1025/items/470e304ff77c44874fc8

例：

```java
@FunctionalInterface
public interface UserIdentify {
    String verifyUser(String userName);
}
```
##Lambda式のメリット
JavaのLambda式のメリットは、匿名クラスを用いる関数型インタフェースの記述を簡潔になることが実現できます。
＊匿名クラス：一度だけ使わないようなクラス

匿名クラス：

```java
public class App 
{
    public static void main( String[] args ) {

        // 関数型インタフェース
        UserIdentify ic = new UserIdentify() {
            @Override
            public String verifyUser(String userName) {
                return "admin".equals(userName)? "admin":"member";
            }
        };

        System.out.println(ic.verifyUser("admin"));
        System.out.println(ic.verifyUser("manager"));
        }
    }

```
では、Lambda式でどう表現するか？

```java
public class App {
    public static void main( String[] args ) {
        
        UserIdentify ic1 = (String userName) -> {
                return "admin".equals(userName)? "admin":"member";
            };
        System.out.println(ic1.verifyUser("admin"));
        System.out.println(ic1.verifyUser("manager"));
        }
    }
```

##具体的にラムダ式の書き方の説明
１）宣言：ラムダ式のインタフェースの型
２）引数：（）中に記入する。インタフェースの引数の数及び順番と同じ
３）表現式：->
４）実行ブロック：{}中に実装する

では、具体的な例から説明に行きましょう。
####引数なし、戻り値なし

```java
public class App {
    public static void main( String[] args ) {

        // 引数なし、戻り値なし
        Lambda1 lambda1 = () -> System.out.println("Hello world");
        lambda1.test();
    }
    interface Lambda1 {
        void test();
    }
}

実装結果：Hello world
```

####引数あり、戻り値なし

```java
public class App {
    public static void main( String[] args ) {

        // 引数あり、戻り値なし
        Lambda2 lambda2 = (n, a) -> System.out.println(n + " is " + a + " years old");
        lambda2.test("Sally",18);
    }
    interface Lambda2 {
        void test(String name, Integer age);
    }
}

実装結果：Sally is 18 years old
```

####引数あり、戻り値あり

```java
public class App {
    public static void main( String[] args ) {

        // 引数あり、戻り値あり
        Lambda3 lambda3 = (a, b) -> a + b;
        System.out.println(lambda3.test(100,3000));
    }
    interface Lambda3 {
        int test(int a, int b);
    }
}

実装結果：3100
```
セキュリティ情報slack(openSecurityInfo)の使い方

# 初めに

セキュリティ情報を共有するためのSlackを作りました。

- **https://opensecurityinfo.slack.com**
- 基本的にはRSSによる情報収集Channelと、ディスカッション用のChannelです。
- 情報ソース=channelとしており、情報入手時の流量制御はチャンネルベースで制御してください。

基本的に **使いやすいように適当につかつて** と思いますが、一応ルールを書いておくことで保身しておきます。守る守らないもあなた次第。

# 参加方法

以下のURLから参加可能です

- https://join.slack.com/t/opensecurityinfo/shared_invite/zt-12hfdfr8k-O9d8Tu1YlS1MdE77JXZafQ

## 参加条件

基本的にはありません。治安維持のために以下を定義します。

- 他の方が不快になるようなことはしないでさい
- 必要に応じ、理由の提示無くkickする場合があります
- 私が管理を放棄する可能性があります（当面はないけど）
- private channelは作成禁止とします（その設定はしたはず）。必要な場合は管理者に相談ください。

# 運用につて

運用は、おおよそ以下の方針です

- 情報ソースの追加（=チェンネル追加）は、 #discuss-運営 に投げて、同意が取れたら勝手に作る
    - 1channel = 1ソース
- ソースのチャンネルで議論はせず、議論は #discuss-* で行う
    - ソースは見たいけど、議論は見たくない、人もいるため

運営に申請とするのは、各自勝手に作っていくと同じものが複数作られたりしそう、というだけです。

## channelとソースの追加について

- #discuss-運営 に追加したいチャンネルとソースを提示ください。
- 賛同を得られたら、勝手に作ってもらって構いません

# channel群について
## channel命名規則

今のところ以下のprefixをつけています。必要に応じて増やそう。

- general
    - デフォルトで全員参加
    - 全体に対してのアナウンスで利用。
    - 議論はここですると全員に伝わり、そんなのここでするなよとなりそうなので、したくない
- random
    - デフォルトで全員参加
    - 雑談とか
    - discussでするほどでない、横断的な話、はこちらへ
- discuss-運営
    - 運営方針とかチャンネル追加相談とか
    - 運営が複数人になったらここで相談するんだろうなぁ
- discuss-*
    - ディスカッション用に用途ごとに作る
    - ソースの内容を話題にしたい場合は「メッセージを共有」で転記してから始めるとよさそう

情報ソース系

- blog-*
    - ブログ系
- info-*
    - セキュリティ情報系
- lang-*
    - 開発言語とか
    - アプリケーションはapp-*としようと思ったけど数が多いので、info-ベンダ名とかにした
- news-*
    - セキュリティニュースサイト系
- OS-*
    - OSのエラッタ等


## channel概要

# そのほか

基本的に「してはならない」は書いていないはず。基本的にはこうしてほしいなぁー、という希望です。ルールがが合わずに使わないくらいだったら、ルール曲げてね、くらいで。

あと、slackだと関係ない議論を延々と見せられる/書き込み者の自己満足だけの投稿もいろいろなところで見られるため、投稿は基本的にdiscussのみ、としたいなぁ。

## 少しだけ

情報は基本的に　infrmation -> intelligence　となると考えています。
今回のslackはinformationの集約です。単なる生データ（参考情報）なので、これらを知見等と合わせることでintelligenceになると思います。
intelligenceを増やすためには、まずはinformationの取得コストを下げよう、というのが本slackのコンセプトです。
関数型インタフェース紹介

みなさん、こんにちは。
今回関数型のインタフェースを紹介させていただきます。

##Predicate (戻り値→　boolean)
```java
public interface Predicate <T>
```
メソッド例：

```java
import java.util.function.Predicate;

public class App {
    public static void main( String[] args ) {

        Predicate <String> pre = (String username) -> {
            return "admin".equals(username);
        };

        System.out.println(pre.test("manager"));
        System.out.println(pre.test("admin"));
      }
    }
```
戻り値：

```
false
true
```

##Consumer (戻り値なし）

```java
public interface Consumer<T>
```

```java
import java.util.function.Consumer;

public class App {
    public static void main( String[] args ) {
        Consumer<String> con = (String message) -> {
            System.out.println("Return message: " + message);
            System.out.println("The message send succeed");
        };
        con.accept("Hello world");
        con.accept("Lambda");
      }
    }
```
##Function
```java
public interface Function<T,R>
```
例：

```java
import java.util.function.Function;

public class App {
    public static void main( String[] args ) {

        Function<String, Integer> fun = (String gender) -> {
            return ("male".equals(gender))?0:1;
        };
        System.out.println(fun.apply("male"));
        System.out.println(fun.apply("female"));
      }
    }
```
結果：

```
0
1
```
「ヤジが飛んでくるマインクラフト」DeepLearningで適当テキスト生成 ~データを集める~

DeepLearningの力を借りて、マイクラのプレイ中、ゲームに関係のある文章を読み上げてくれるソフトを作った。

↓こんなやつ
![でもミニ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358231/9fa597d6-abc1-58df-4007-82037b68318d.gif)

[実際に遊んでいる動画](https://youtu.be/xseWajIDe4M?t=55)

1つの記事にまとめるのが困難なため、いくつかの記事に分けます。
ここでは、<font color = red>**データを用意する部分**</font>について説明します。


### ↓他の記事

- [全体の流れ](https://qiita.com/eteeeeeerminal/items/428f0618c775da816519)

- [Deep Learning する](https://qiita.com/eteeeeeerminal/items/3c3ea279999724aa37d3)

- [modで動かす](https://qiita.com/eteeeeeerminal/items/7ac8a15bba73383783ce)

# 欲しいデータ
ゲーム中に表示・読み上げされると嬉しいテキスト。
ゲーム内のオブジェクト(ゾンビ、クリーパー、等など)に関連したテキスト。


# スクレイピング
### サイトにあたりをつける
まずは、Google先生に聞いてみる。

Google検索で、「ゾンビ マインクラフト」など調べる。
検索結果の上位サイトのテキストを集めれば良さそう。

ついでに、検索結果の下に出る、関連ワードでも検索。

↓を使えばいい感じに出来た。
[【Python】Googleの検索結果をアクセス制限なしで取得する](https://qiita.com/derodero24/items/949ac666b18d567e9b61)

### サイトのテキストをダウンロード
取得したいwebサイトのURLを入手したので、
みんな大好き[Selenium](https://qiita.com/memakura/items/20a02161fa7e18d8a693)にて、じゃんじゃか取得。

しかし、アクセスするURLの中身をきちんと確認したわけではない。
読み込み時にエラーが起きるとプログラムが止まってしまう。

- [タイムアウトは数回リトライ。](https://qiita.com/reflet/items/a420b5b4d3dc5bc3df0b)
- [アラートモーダルは自動でOKする。](https://blog.ikedaosushi.com/entry/2019/01/18/232326)

それ以外は、とりあえず飛ばす！！

そして、html をじゃんじゃか保存。
それから、BeautifulSoup など使って [html からテキストを取り出す。](https://qiita.com/poorko/items/9140c75415d748633a10)

文字の先頭が日本語でも【】でもないやつは捨てた。
消せなかったタグとか日付等を消したかった。

# [ニコニココメントデータセット](https://www.nii.ac.jp/dsc/idr/nico/)
[こちら](https://www.nii.ac.jp/dsc/idr/nico/)で配布されている、データセット。
ニコニコのコメントが10年分くらいまとまっている。
コメントだけでなく、名前・タグ・説明文などのメタデータもついてくる。

**やったぜ！　早速解凍して......**

終わらない解凍処理。本当に終わらない。
ファイル数がとにかく多い。**これは待てない。**

いや、待てよ。
使いたいデータはマイクラに関係ありそうなコメントだけだ。

メタデータのタグを見て、マイクラ関連の動画のコメントだけ解凍 or 解凍せずに処理できないか？
[zipfileを使えば出来た。](https://symfoware.blog.fc2.com/blog-entry-1023.html)

# ちょっと加工
ニコニコデータセットのおかげもあって、大量にデータが手に入った！！

### とりま、単語分割
[GiNZA](https://megagonlabs.github.io/ginza/) を使った。

↓こんな感じで単語分割できる。

```python
import spacy

nlp = spacy.load('ja_ginza')

with open(path, mode='r', encodeing='utf-8', errors='ignore'):
    text = list(f.read().split('\n'))
    docs = nlp.pipe(text, disable=['ner'])
    for doc in docs:
        for sent in doc.sents:
            for word in sent:
                # hogehoge
```
`nlp.pipe()`の`disable`でいらない機能を停止できる。


### 学習に不要なゴミを取り除く

- 語数が3単語以下の文を削除
- 正規表現で日本語( `r'[あ-んア-ン一-鿐]'`)を含む単語が1個の文を削除
- [set](https://uxmilk.jp/14834) を使って、同じ単語だけの文を削除
- 漢字のみ・ひらがなのみ、の文章も正規表現で削除

[[Python] 正規表現の表記方法のまとめ（reモジュール）
](https://hibiki-press.tech/learn_prog/python/regex_pattern/1099)

# まとめ
データ集めは大変。
使えるデータにするために、色々工夫できそう。

### 余談
テキストアドベンチャーのまとめサイトを学習させた、[AI Dungeon 2](https://aidungeon.io/) なるものがある。
自動で物語を生成しながら遊べて、すごい。
日本語で、スクレイピングできるテキストアドベンチャーサイトないかなぁ。
PostgreSQLでCSV文字列から表を作る

調査やリカバリなどで手元に↓のようなcsvっぽい文字列があって、テンポラリテーブル作るのが億劫な時に、

```text:sample.csv
1,taro,hello
2,jiro,konnnichiha
```

こうすると手軽に表が作れます
`,`を`\t`にすればTSVもできるでしょう

```sql:awful.sql
select
  cols[1] as id,
  cols[2] as name,
  cols[3] as msg
from (
  select 
    regexp_split_to_array(
      regexp_split_to_table(
        '1,taro,hello\n2,jiro,konnichiha',
        '\\n'),
      ',') as cols
  ) as awful
order by
  id
;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106259/e833d161-3915-7d4e-3d32-4868f454f74e.png)

本番のコードで使っちゃだめぞ🙅‍♂️
COTOHA アクセストークンの取得 (Golang)

[COTOHA API Portal](https://api.ce-cotoha.com/contents/index.html) の使用例です。

次と同じことを Golang で行いました。
>[COTOHA アクセストークンの取得](https://qiita.com/ekzemplaro/items/e2f120bb0848e119be60)

ライブラリーのインストール

```bash
go get github.com/joho/godotenv
```

```go:access_token.go
// ---------------------------------------------------------------
//
//	access_token.go
//
//					Feb/24/2020
// ---------------------------------------------------------------
package main

import (
	"fmt"
	"os"
	"strings"
	"io/ioutil"
	"net/http"
	"encoding/json"
	"github.com/joho/godotenv"
)

// ---------------------------------------------------------------
func main() {

	fmt.Fprintf (os.Stderr,"*** 開始 ***\n")

	err := godotenv.Load()
	if err != nil {
		fmt.Println("Error loading .env file")
		}

	unit_aa := make (map[string]interface{})
	unit_aa["grantType"] = "client_credentials"
	unit_aa["clientId"] = os.Getenv("CLIENT_ID")
	unit_aa["clientSecret"] = os.Getenv("CLIENT_SECRET")
	str_json, _ := json.Marshal(unit_aa)

	url_target := os.Getenv("ACCESS_TOKEN_PUBLISH_URL")

	response, error := http.Post(url_target,"application/json",
		strings.NewReader(string(str_json)))
	if error != nil {
		fmt.Println("Request error:", error)
	}

	bb, err := ioutil.ReadAll(response.Body)
	if err == nil {
		fmt.Println(string(bb))
		}

	fmt.Fprintf (os.Stderr,"*** 終了 ***\n")
}

// ---------------------------------------------------------------
```

実行コマンド

```bash
go run access_token.go
```
Firestore エミュレータのデータをローカル環境で import/export する

## 概要

[Firebase エミュレータ](https://firebase.google.com/docs/emulator-suite)で Firestore の import/export ができるようになったので、導入方法について紹介します。これまで、エミュレータを再起動する度にデータが初期化されていていましたが、特定のタイミングで export して起動時に import できるので、毎回テストデータを取り込む作業がなくなるなど、開発効率が上がります。

## 導入方法

本機能は firebase-tools の 7.14.0 で対応したので、 firebase-tools を再インストールして firebase のバージョンが 7.14.0 以上であることを確認します。

```sh
npm install -g firebase-tools
firebase --version
7.14.0
```

以下のコマンドを叩いて Export コマンドのヘルプが正常に表示されれば OK です。

```sh
firebase emulators:export --help
Usage: firebase emulators:export [options] <path>

export data from running emulators

Options:
  --only <emulators>  only specific emulators. This is a comma separated list of emulator names. Valid options are: ["functions","firestore","database","hosting","pubsub"]
  --force             Overwrite any export data in the target directory.
  -h, --help          output usage information
```

## 実行方法

### Firestore エミュレータのデータを export

**firebase emulators:export** コマンドで data ディレクトリ配下に export されます

```sh
firebase emulators:export ./data/
```

すでにデータがある場合には上書きするか確認されますが、毎回上書きで問題なければ --force オプションを指定します。

```sh
firebase emulators:export --force ./data/
```

### Export されたデータを読み込んで Firestore エミュレータ起動

**firebase emulators:start** コマンドで --import オプションをつけて export 先の data ディレクトリを指定することで、データを読み込んで起動できます。

```sh
firebase emulators:start --import=./data --only firestore
```

必要に応じて、上記コマンドを package.json の scripts に追加したり（Web 開発の場合）、 data ディレクトリを .gitignore  に追加しておきましょう。

## まとめ

以上、 Firestore エミュレータデータの import/export 方法を紹介しました。

特定の検証ケースごと（インストール直後、チュートリアル直後、インストール翌日の起動時など）に export 先を分けると、よりデバッグが捗りそうですね。

## 関連記事
- [React x Firebase を用いた Web アプリケーション開発時のハマりどころと解決策](https://qiita.com/tanabee/items/b2527deb3f2f4b87406b)
AWS CLI v2のインストールドキュメントの内容が日英で異なる

Macにインストールする場合の内容が日英のドキュメントで異なっており、少々混乱したのでメモを残しておきます。

日本語のドキュメントに従ってインストールすると、 `aws2` というコマンドになるようです。

##### 英語

```bash
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /

aws --version
```

##### 日本語

```bash
curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-macos.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

aws2 --version
```