OmniAICreator/Qiita-1.07M huggingface dataset:
NavigationComponentで画面の状態を保存したままstartDirectionに戻る方法

#やりたいこと
NavigationComponentでstartDirectionにあるFragmentへ一気に戻りたい場合、皆さん[Global Action](https://developer.android.com/guide/navigation/navigation-global-action)を使っているのではないでしょうか。

私もこのGlobal Actionで戻るように書いたのですが、例えばstartDirectionの`HogeListFragment`がRecyclerViewのscrollableなViewで、スクロール位置などの状態を保ちたい場合は、Global Actionだと難しいです。

例えば以下のようなGlobal Actionがあるとすると、

```xml
<?xml version="1.0" encoding="utf-8"?>
    <navigation xmlns:app="http://schemas.android.com/apk/res-auto"
                xmlns:tools="http://schemas.android.com/tools"
                xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/hoge_nav"
                app:startDestination="@id/hoge_list_fragment">

      ...

      <action android:id="@+id/action_global_hoge_list_fragment"
              app:destination="@id/hoge_list_fragment"
              app:popUpTo="@id/hoge_nav"
              app:popUpToInclusive="true"/>

    </navigation>
```

```kotlin
viewTransactionButton.setOnClickListener { view ->
    view.findNavController().navigate(R.id.action_global_hoge_list_fragment)
}
```

`viewTransactionButton`を押すことでGlobal Action`action_global_hoge_list_fragment`が実行され、`hoge_nav`のsequenceにPopUpします。
ぱっと見良さそうですが、これだと`HogeListFragment`は再生成されたものが表示されるため、状態はリセットされてしまいます。

#解決
この場合Global Actionは使わず、以下のようにするだけで実現できます。

```kotlin
viewTransactionButton.setOnClickListener { view ->
    view.findNavController().popBackStack(R.id.hoge_list_fragment, false)
}
```

このようにBackStackからpopすることで状態の残っている`HogeListFragment`へ戻ることができます。

第二引数の`inclusive`はtrueにすると、指定された宛先(`HogeListFragment`)もpopされるため別の画面に遷移できなくなるので注意です。
【前編】ネットワーク構築（OSPF）

##今回やること
OSPFを使ってマルチエリア構成で構築して、そこからルート集約をしてみたいと思います。
マルチエリアで構成するために**ABR,ASBR**だったり、単語がごちゃごちゃになってしまうので、
その辺も備忘録がてら、まとめてみようと思います。
恐らく1日じゃ終わらないので、2部構成にします。

##使用ツール
GNS3
IOS: c2600-adventerprisek9-mz.124-17

##ネットワーク構成図
ABRとASBRを意識して構築してみて、最終的にルートを集約してみて、LSDBやLSAの動きを見てみたいのでそのようなことができる構成図を作成します。
そしてできた構成図が以下
![OSPF_マルチエリア.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686507/1655a52c-9485-359c-d74c-c70e630ebb83.jpeg)

##用語集（備忘録）
**ルータの種類**

|OSPFルータの種類|概要|
|:--------|:--:|
|内部ルータ|全てのインターフェイスが同エリア。LSDBを１つだけ持っている。|
|バックボーンルータ|1つ以上のインターフェイスがバックボーンエリアにあるルータ。|
|ABR（エリア境界ルータ）|複数のエリアにまたがってインターフェイスを持つルータ。LSDBもエリア分持っている。|
|ASBR（AS境界ルータ）|1つ以上のインターフェイスが非OSPFドメインにあるルータ|
**ASBR**については、OSPF以外を使ったプロトコルの範囲にインターフェイスを置いている
ルータのことを呼ぶのかなという認識。

**OSPF用語集**

|OSPF用語|概要|
|:----|:-----:|
|LSA |リンクステートの情報|
|LSR |LSAを要求するパケット|
|LSU |複数のLSAを束ねた情報。LSRに対する返信|
|DBD |LSDBの同期に使用されるパケット|
|アジャセンシー|LSAを交換する隣接関係のこと|
|LSDB|すべてのルータから集められたLSAをもとに作られたトポロジのデータベース|
|エリア|同じLSDBを保持するルータの論理グループ|
|コスト|OSPFのメトリック。帯域幅をもとに算出|
|ルータID|OSPFルータを識別するための番号|
|DR|同一セグメントから選出される代表のルータ|
|BDR|DRのバックアップルータ|

OSPFででてくる単語をざっくりまとめるとこんな感じでしょうか。

##まとめ
今回は時間が足りず2部構成になります。
OSPFの単語を洗い出してみると、一つのルーティングプロトコルに対しても理解しておかなければ
ならない用語が結構ありますね。

構成図を見てみても、単語を理解していないとどのような動きをするのかがパッと見ただけでは
理解できません。

**ABR,ASBR,バックボーン**このあたりは構成図を見るときに必要な知識になってくるのかなと
感じました。

次回やりたいこととしては、実際に構築することですが、今回調べていると**ACL**の知識が必要に
なりそう？な気がしたので、その辺も構築しながら頭を悩ませることになるかなと思ってます。

前編は以上となります。
hostapdでIEEE 802.1X/EAP認証対応Wi-Fi AP


#TL;DR
IEEE 802.1X認証をテストするために hostapd を使ってのアクセスポイントの設定方法。
802.1X認証には通常、認証サーバとして RADIUS を立てる必要があるが、テスト目的なので hostapd の integrated EAP server 機能を使って簡単にRaspbian stretch上に立ち上げてみる。

# ネットワーク設定

## ブリッジ設定
有線インタフェース eth0 と無線インタフェース wlan0 をブリッジ br0 に接続する。

```config:/etc/network/interfaces
auto br0
iface br0 inet manual
bridge_ports eth0 wlan0
```

## ネットワークインタフェース設定
wlan0インタフェースをwpa_supplicantが握ってしまわないようにwpa_supplicantは停止させる。
eth0, wlan0にDCHPでアドレスが振られないよう hdcpcd.conf に設定。

```config:/etc/dhcpcd.conf
# bridge
denyinterfaces eth0 wlan0
```

# アクセスポイント設定

## hostapd設定
EAP認証は外部の RADIUS server を使わず hostapd の機能を使う (``eap_server=1``)。
WPA-EAPを有効にし、EAP-TLS/PEAP/TTLSに対応するためCA証明書、サーバ証明書とサーバ秘密鍵を設定。プライベートCAの各証明書の作成は https://server-setting.info/centos/private-ca-cert.html を参考にするとよい。

```hostapd.conf
# wlan
interface=wlan0
bridge=br0
ssid=test8021x

# for WPA-EAP
ieee8021x=1
wpa=2
wpa_key_mgmt=WPA-EAP

# for EAP-TLS/PEAP/TTLS
eap_server=1
eap_user_file=/etc/hostapd/hostapd.eap_user
ca_cert=/etc/hostapd/capem.pem
server_cert=/etc/hostapd/server.crt
private_key=/etc/hostapd/server.key
private_key_passwd=server1234


```

## ユーザ認証設定

PEAP認証するユーザ名/パスワードの組、TTLS認証するユーザ名/パスワードの組を設定しておく。

```hostapd.eap_user
* TLS,TTLS,PEAP

"user" MSCHAPV2,GTC "password" [2]
"ttls-user" TTLS-PAP,TTLS-CHAP,TTLS-MSCHAP,TTLS-MSCHAPV2 "password" [2]
```

# 動作確認

PEAPで認証したときに hostapd から以下のような log が出力される。method=25がPEAP。

```PEAP
wlan0: STA xx:xx:xx:xx:xx:xx IEEE 802.11: authenticated
wlan0: STA xx:xx:xx:xx:xx:xx IEEE 802.11: associated (aid 1)
wlan0: CTRL-EVENT-EAP-STARTED xx:xx:xx:xx:xx:xx
wlan0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=1
wlan0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=13
wlan0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=25
wlan0: CTRL-EVENT-EAP-SUCCESS xx:xx:xx:xx:xx:xx
wlan0: STA xx:xx:xx:xx:xx:xx WPA: pairwise key handshake completed (RSN)
wlan0: AP-STA-CONNECTED xx:xx:xx:xx:xx:xx
wlan0: STA xx:xx:xx:xx:xx:xx RADIUS: starting accounting session 1D1D8F4EAC6C9405
wlan0: STA xx:xx:xx:xx:xx:xx IEEE 802.1X: authenticated - EAP type: 0 (unknown)
```
難しい日本語の言い回し

## こんな単語今まで聞いたことない！

こんにちは。去年２０年のオーストラリア生活から、日本に帰ってきました。今は株式会社ゆめみでPMをやっています。
２０年前は、日本でサラリーマンをやっていましたが、やはり２０年のギャップは大きく、カルチャーショック、年齢ショック、そう天然ショック（古い）でした。

その中でも、言葉について、わからない言葉がミーティングやら、Slackやらに飛び交う毎日。自分用にわからない言葉の語録を作り中なので、日本語が得意だけど、まだ私外人！みたいな人に役立ててもらえたらと思い、公表します。

### 幸甚
（koujin)
意味：非常に嬉しいです
用途：お客さんに、何かお願いするときの末尾に使う。あまり多用しないが、いざというときに使うと良さそう。（で、いいのかな）

### 片務契約
(henmu-keiyaku)
意味：契約当事者の一方のみが債務を負担する契約。贈与などがその例
用途：営業の人が使ってました。WinーLose関係の契約形態か？（で、いいのかな）

### 瑕疵担保 
(kashi-tanpo)
意味：通常、一般的には備わっているにもかかわらず本来あるべき機能・品質・性能・状態が備わっていないこと。
用途：不具合があった場合、それを無償で直します。みたいな感じ。請負の場合についてまわる。

### トンマナ
(Ton-mana)
意味：トーン（色）とマナー（作法）
用途：これ、トンマナあってないじゃん！ （デザイナーがよく使う言葉。色と作法を合わせたいときに使うらしい）

### 認識齟齬
(ninshiki-sogo)
意味：認識にずれがある
用途：こちらの件は、認識齟齬の可能性がありますので、早急に....　（単純に、何故認識がずれてるって、言えばいいのに。。。）

### 分科会
(bunka-kai)
意味：大きな会議などで、その会議で取り上げられた事項に応じて、分野ごとに専門的に研究・討議を行う小会議。
用途：その件は、分科会で行いましょう。

### オワコン
(owa-kon)
意味：終わったコンテンツの省略形
用途：それもうオワコンです。（って使い方であってます？）

### 冗長
(jyou-chou)
意味：長ったらしい
用途：冗長性はRedundancyなので、長ったらしいっていう感じではないかな。長ったらしいって聞くと、悪いイメージがあるが、Redundancyなら、failover用の策を講じてるってことなので、良いイメージがあります。うーん。

### 与信
(yoshin)
意味：相手を信用して金銭やモノを貸与すること
用途：与信でやるには、リスクが大きすぎる。（なんて話を、会議でしてたことがあった）

### 与件
(yoken)
意味：何かためになるものを与えられること。推理や研究など新たに物事を始める前に与えられる事実、問題を解決するために提供される条件を表します。「与件」は条件だけではなくて、情報や物事なども当てはまります。
用途：与件の整理をしておきます！（*さっぱり意味分かりません*）

### 俯瞰
(hukan)
意味：高いところから見下ろすこと。
用途：俯瞰的に見れるかどうかが鍵！（要は、全体を見れるかってことですかね？）

### 謝絶
(shazetu)
意味：人の申し出を断ること。
用途：健康状態や病歴を理由に謝絶となった場合でも、、、（要は、断られたっていうのを高尚なイメージで伝えたいって時に使うんですかね）

### 座組
(zagumi)
意味：組織やプロジェクトに関わる人、ビジネス構造全般を表す
用途：元々の座組の問題もありますが...

### 備忘録
(bibouroku)
意味：忘れた時にそなえて、要点を書きとめておくための手帳。メモ。
用途：備忘録書いておきます！

### 疲弊
(hihei)
意味：すごい疲れていること。
用途：みんな疲弊してるから、ちょっと休憩しましょう！（って、休憩レベルで、疲弊って治る程度疲労？）

### 乖離
(kairi)
意味：（スル)そむきはなれること。結びつきがはなれること。
用途：人心から乖離した政治

### 喫緊
(kikkin)
意味：急ぎの
用途：デジタル変革（デジタルトランスフォーメーション；DX）への対応が日本企業にとって喫緊課題となっている。（緊急とはどう違うんだろう？）

### 縮退時
(shukutaiji)
意味：縮退運転とは、システムの機能や性能を部分的に停止させた状態で稼動を維持することである。 縮退運転は、主にシステムに障害が発生した場合の運用手段として行われる。
用途：縮退時のテストはやらなくて良いのかね？（上から目線風に、指示）

-------
以上、今日現在までの難しい日本語集でした。

もし記述に認識齟齬や乖離があったら喫緊に分科会を催してもらうえれば幸甚です。
AWS認定DeveloperAssociate合格記録（2020年8月）

##はじめに
Qiita初投稿です。2020年8月12日に受験し、無事合格できました！
やっとAssociate3冠突破！！

##試験
* 試験概要：[AWS公式HP](https://aws.amazon.com/jp/certification/certified-developer-associate/)
* 問題数：65問
* 時間：130分
* 合格ライン：720点
* 自身のスコア：914点

##経歴など
【経歴】
&nbsp; 前職で約1年AWSのシステムを担当（案件推進メインでノー開発）
&nbsp; 今年転職し、AWSインフラの開発を担当させて頂く
&nbsp; ・2019年3月　SAA取得
&nbsp; ・2019年7月　SOA取得
&nbsp; 　＃ここで転職
&nbsp; ・2020年8月　DVA取得

【知識レベル】
&nbsp; 情報処理やベンダー資格は幾つか持っているものの、浅く広くで実務には活かせない程度

##私の勉強法
* 参考書
SAA取得からだいぶ時間が経っていたのでざっと読み返し
[AWS認定ソリューションアーキテクトアソシエイト合格教本](https://www.amazon.co.jp/%E6%9C%80%E7%9F%AD%E7%AA%81%E7%A0%B4-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-%E6%9D%91%E4%B8%BB/dp/4297103826)

* 模試
Udemy 模試5回分×3回 
同じ模試に対し、1回目は真面目に解き、2・3回目は解説をざーっと読み返す、
という感じでした。同じような問題がたくさん出てくるのでパターンが掴めます。
[AWS 認定デベロッパー アソシエイト模擬試験問題集（5回分325問）](https://www.udemy.com/course/aws-31955/)

##所感
SOAのようにサービスを組み合わせて最適を導き出す・・
よりは、お決まりパターンを覚えていれば即答できるという感じでした。
Udemyの模試でそのパターンが掴めたのでかなりお勧めです。

私が感じた難易度は、SOA>SAA>DVAでした。
SAA（全般）：各AWSサービスの特徴（勉強2ヶ月、3回目で取得）
SOA（運用）：AWSサービス同士の連携（勉強1ヶ月、2回目で取得）
DVA（開発）：ある程度決まったサービスの組み合わせ（勉強2週間、1回目で取得）

また私自身２児の母でなかなかまとまった時間が取れませんでしたが、
会社の制度や上司がPro取得者という恵まれた環境のおかげで合格できました。
開発経験が浅くDevは本当に自信がなかったのですが、上司が絶対いける！と
励ましてくれたので受験に踏み切れました、本当に感謝

いずれProを取得できるよう頑張ります！

読んで頂きありがとうございましたm(_ _)m
【メモ用】Mac OS の標準ターミナルのショートカットキーをまとめてみた

Mac OSの標準ターミナルを使用する事にしたので、随時ショートカットキーをまとめる。

| 操作 | ショートカット |
|:-----------|------------:|
| 右のタブに移動       | Shift + Command + →         |
| 左のタブに移動       |  Shift + Command + ←       |
| 新しいタブを開く       |  Command + t      |
| Command + w       |  Command + w      |
| 左のタブに移動       |  Shift + Command + ←       |
UITextViewにセットしたHTMLのfont-familyを変更する方法

タイトルの通りUITextViewにセットしたHTMLのfont-familyを変更する方法を記載します。

```Swift
var attrText: NSAttributedString?
let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
    .documentType: NSAttributedString.DocumentType.html,
    .characterEncoding: String.Encoding.utf8.rawValue
]

if let htmlData = text.data(using: .utf8),
    let attributedText = try? NSAttributedString(data: htmlData, options: options, documentAttributes: nil) {
    let fullRange = NSRange(location: 0, length: attributedText.length)
    let mutableAttributedText = NSMutableAttributedString(attributedString: attributedText)
    let font = UIFont(name: "変更したいfont名", size: 18) ?? UIFont.systemFont(ofSize: 18)
    mutableAttributedText.enumerateAttribute(.font, in: fullRange, options: .longestEffectiveRangeNotRequired, using: { (attribute, range, _) in
        if let attributeFont = attribute as? UIFont {
            let descripter = attributeFont.fontDescriptor.withFamily(font.familyName)
            let scaledFont = UIFont(descriptor: descripter, size: attributeFont.pointSize)
            mutableAttributedText.addAttribute(.font, value: scaledFont, range: range)
        }
    })
    attrText = mutableAttributedText
}
```
Linux(ubuntu)で、mkvファイルの分割と統合

## mkvtoolnix をインストールする

```
$ sudo aptitude install mkvtoolnix
```


# チャプターごとに分割

```
$ mkvmerge -o hoge.mkv --split chapters:all original.mkv
```

hoge-000.mkv, hoge-001,mkv のように連番でチャプター分割されたmkvファイルが作成される

# 時間指定で分割

```
# 01:23〜10:20と10:54〜12:34を切り出す場合
$ mkvmerge --split parts:01:23-10:20,10:54-12:34 -o hoge.mkv original.mkv
```

それぞれの範囲が hoge-000.mkv, hoge-001.mkv で作成される。

# 複数のmkvファイルを統合

```
$ mkvmerge -o hoge.mkv a.mkv + b.mkv + c.mkv
```
暇なので『RPAツール』を作る #5　selenium編　他のライブラリ

#はじめに
皆さん、今回は早めに投稿できたと思っています。enp（えん）です。マビノギはライフワークです。
この記事は『RPAツール』を作ろうとする人の進捗報告になります。
RPAやRPAツールの作り方が書いてあるものではございませんので、ご了承ください。（もしかしたら、ソースは少しだけ載せるかもしれません。気分次第です）
今回はseleniumと仲良くなろうPart.3です。seleium編は今回で最終回になります。
また、seleniumと仲良くなろうと言いつつ、あまりseleniumの話はしないと思います！
最後までお付き合いいただければ幸いです。

#seleniumに出来ないこと
さて、#3からseleniumについて学んできましたが、実はRPAとしてスクレイピング等行う場合、__通常selenium単体では使いません。__
もちろんseleniumでスクレイピングを行うことは出来ます。ですが、とある__致命的なことが出来ません。__
それは、__<font color=red>HTTPステータスコードを取得することです。</font>__
HTTPステータスコードとは__Webページに正しく接続できたか、リダイレクトが行われたのか等を知ることのできる３桁の数字です。__
これが確認できないと正しくプログラムを組んでいたとしても動作が不安定になり、エラーを吐きやすいアプリケーションになってしまいます。
__このままではいけない！__
という訳で、取得しようとしたページに正しく接続できるのか確認できるようになりましょう。

#HTTPステータスコードが確認できる。そう、requestsならね
さぁ、seleniumで確認できないHTTPステータスコードを確認していきましょう。
__使うのはPythonに標準ライブラリとして追加されたrequestsです。__（開発環境次第で標準ライブラリとして導入されていない場合があります。そんな時はpipでインストールしましょう）
requestsで__HTTPステータスコードを確認する方法はstatus_codeメソッドを使うやり方__です。
status_codeは__HTTPステータスコードを取得して出力するシンプルなメソッド__です。
printを使うと３桁の数字を出力します。
status_codeでHTTPステータスコードを取得して、ifで条件分岐をすればエラーハンドリングが可能。
また、__if文を書くのが嫌な人はraise_for_statusメソッドを使用すれば解決__します。
raise_for_statusは__HTTPステータスコードが200番台以外の時、例外を起こします。__(200番台は正常にWebページを取得したことを表します)
そのためtry・exceptで拾って例外処理を行えば簡単にエラーハンドリングが行えます。
これで安定的なアプリケーションが実装できそうですね。

#美しいスープの存在
さぁ、私が今抱えている問題をお教えしましょう。
####<font color=red>どうやって、プログラムできない人に専門的なことをやらせよう？</font>
seleniumではxpathや属性名でテキストボックスやボタンを指定してきました。
ですが、HTMLをやってない人やそもそもプログラムをやってない人には全く分からない内容です。
難しい内容という訳でもないので学べば分かる内容ではありますが、学ぶことを敬遠することはあると思います。
操作など分かりやすくなければ__アプリケーションを使ってもらえないという根本的で致命的な欠陥が生まれます。__
そこで__美しいスープのご紹介です。__
__美しいスープって何？__　分かります。しかし、美しいスープと言うしかないんです。
だって__ライブラリ名がBeautifulSoup__なんですもの。（正確にはBeautifulSoup4です）
あっ。決してビューティフルソープって呼ばないでくださいね。あなたの品格が疑われます。
正しくはビューティフルスープです。
では、BeautifulSoup（以下、bs4）は一体何をするライブラリなのでしょうか？
__bs4が出来ることはWebページの解析と情報の取得です。__
クリックなどのマウス操作は出来ませんが、テキストの取得などが得意です。
また、__HTMLの階層も解析でき、出力できます。__そんな機能を使って簡単に指定が行えないかと考えています。
まぁ、それはKivyを学んだあとに頑張ってみましょう。
__重要なのは一筋の光が見えたということです。__

#最後に
###内容、少なッ！！
申し訳ありません。あくまで進捗報告ですのでご了承ください。
ですが、一応インターネットから情報を取ってくる環境は整ったと思います。
面白くなってきました。
次回からはopenpyxl編です。ようやくxlsxファイルを扱います。仕事で扱う代表的なファイルですね。
大変重要な内容になると思うので、しっかり学んでいきましょう。
以上、enpがお送りいたしました。
Rails Docker 「Mysql2::Error: Table 'テーブル名' already exists」と「Couldn't find database client」　エラー解決

#この記事でできること
・Dockerfileの記述をちょっと変えることで、データベースを操作できるようにする。


##環境
・Ruby 2.6.6, Rails 6.0.3.2
・Docker,Docker-compose（開発環境）


##抱えた問題
テーブルを削除できたと思って、再度同じテーブルを作成しようとしたら「すでにそのテーブルはありまっせ」エラーが出てきた。

```ruby:qiita.rb
% docker-compose run --rm web rails db:migrate  

Mysql2::Error: Table 'news' already exists
```


##やったこと①
https://bokunonikki.net/post/2018/0214_rails_mysql_error/

参考URLの通り`rails db`を実行してデータベースを操作しようとしたけど、またまたエラーが出た。。。

```ruby:qiita.rb
% docker-compose run --rm web rails db         

Couldn't find database client: mysql, mysql5. Check your $PATH and try again.
```


##やったこと②
https://qiita.com/ryosk7/items/077ea98a88ec3df289c8#%E8%A7%A3%E6%B1%BA%E7%AD%96%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%8B

webサーバー側のDockerfileに`mysql-client`を入れていないからエラーになっていたようです。
参考URLを真似て早速以下のDockerfileでbuildをしてみたが、buildに失敗する。。。
なんでや？？？？？

```ruby:Dockerfile
FROM ruby:2.6

# install package to docker container
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev \
    && apt-get install apt-transport-https \
    && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update && apt-get install -y yarn \
    && curl -sL https://deb.nodesource.com/setup_10.x | bash - \
    && apt-get install -y nodejs mysql-client \  　#mysql-clientを追記
    && mkdir /myapp

WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
```


```ruby:qiita.rb
E: Package 'mysql-client' has no installation candidate
```


###エラー原因
「パッケージ：'mysql-client' のインストール候補がありません」エラーが出てるみたい。



##やったこと③
https://qiita.com/aseanchild1400/items/d3580366054fee3d2703#%E5%8E%9F%E5%9B%A0%E3%81%9D%E3%81%AE%EF%BC%92mysql-client-%E3%81%AF-mariadb-client-%E3%81%AB%E7%B5%B1%E5%90%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%97%E3%81%BE%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B

mysql-clientはmariadb-clientに統合されていて、mysql-clientは使えないっぽい！！
ということで、Dockerfile内のmysql-clientを、mariadb-clientに変更して再度buildしまっせ！！


```ruby:Dockerfile
FROM ruby:2.6

#~~~~  省略  ~~~~

    && apt-get install -y nodejs mariadb-client \  　#mariadb-clientに変更

#~~~~  省略  ~~~~
```



```ruby:
% docker-compose build   

なんやかんや

Successfully built
```


##これでmyaqlにログインできる



```ruby:
% docker-compose run --rm web rails db
#パスワードが求められるからパスワードを入力
```

`SHOW TABLES;`でテーブル一覧をチェック
該当のテーブルがあることを確認。

```ruby:
MySQL [myapp_development]> SHOW TABLES;
+------------------------------+
| Tables_in_myapp_development  |
+------------------------------+
| news                         |
+------------------------------+
18 rows in set (0.009 sec)
```

`drop table テーブル名;`でテーブル一を削除

```ruby:

MySQL [myapp_development]> drop table news;
Query OK, 0 rows affected (0.311 sec)
```

##まとめ
テーブルを削除するだけでもだいぶ時間がかかりましたな。。。
Dockerfileをいじるだけでできることが増えるのはなんか楽しい。
macでpdfのdiffをとりたい

## はじめに
ディスコンになったICのデータシートと後継型番のデータシートがほぼ同じに見えた＆目grepにも限界があるので、差分をとりたくなった。
調べてみるとMacではAdobe Acrobatを使うかdiff-pdfを使う方法があるらしい。
個人的にAdobe製品は極力使いたくないのでdiff-pdfを使ってみることにした。

### 環境
macOS Catalina 10.15.6
XQuartz 2.7.11
diff-pdf 0.4.1_4

## インストール

1. XQuartz
以下から落として入れるだけ
https://www.xquartz.org/

2. diff-pdf
brewで入れる

    ```bash
    brew install diff-pdf
    ```

## 使い方


- 差分をターミナル上で表示する場合

    ```bash
    diff-pdf -v a.pdf b.pdf
    ```

- 差分をファイルに出力する場合

    ```bash
    diff-pdf --output-diff=output.pdf a.pdf b.pdf
    ```

- 差分をファイルに出力しないでビューワーを起動する場合

    ```bash
    diff-pdf --view a.pdf b.pdf
    ```

## オプション
- -h, --help
ヘルプを表示する

- -v, --verbose
差分をターミナル上で表示する

- -s, --skip-identical     	only output pages with differences
--output-diff=と併用で差分のみをファイルに出力する

- -m, --mark-differences   	additionally mark differences on left side
出力の左端にどの行に差分があるか表示する

- --output-diff=<str>      	output differences to given PDF file
出力を指定したファイル名で保存する

- --channel-tolerance=<num>	consider channel values to be equal if within specified tolerance
差分があると判定するしきい値を0〜255の範囲で指定出来る
0がデフォルトで完全一致じゃなければ差分判定される

- --view                   	view the differences in a window


## 結果
差分を確認したいのはLEDドライバICである[MAX7219CNG](https://www.mouser.jp/datasheet/2/256/max7219-max7221-1178406.pdf)と[MAX7219CNG+](https://www.mouser.jp/datasheet/2/256/MAX7219-MAX7221-1513157.pdf)のデータシート

ひとまず差分がどれだけあるか確かめてみたが、全ページが差分判定となってしまった

```bash
diff-pdf -v MAX7219CNG.pdf MAX7219CNG+.pdf
// 出力
page 0 differs
page 1 differs
page 2 differs
〜中略〜
page 16 differs
page 17 differs
18 of 18 pages differ.
```

とりあえず100でしきい値を設定してみると2ページのみ差分判定となった

```bash
diff-pdf -v --channel-tolerance=100 MAX7219CNG.pdf MAX7219CNG+.pdf
// 出力
page 13 differs
page 17 differs
2 of 18 pages differ.
```

差分のみファイルに出力して見てみるといい感じに差分が見られる

```bash
diff-pdf -v -s --output-diff=output.pdf --channel-tolerance=100 MAX7219CNG.pdf MAX7219CNG+.pdf
open output.pdf
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284492/17ef8e11-0d76-f44c-5985-d423ec134b3c.png)



## 参考
[[Mac] PDF 差分チェッカー “diff-pdf”](https://blog.withachristianwife.com/2020/01/31/diff-pdf/)
SQL ORDER BY 句で CASE を使って LIKE でマッチした順にソートしたい



## 前提条件
item テーブルには product_name と product_detail を持っている。

| ID | product_name | product_detail|
|:---:|:-------------|-------------|
| 1  | ストライプのシャツ | 綿100％       |
| 2  | 半袖Yシャツ| Tシャツ生地を採用 |
| 3  | ロゴ入りTシャツ| サイズ展開豊富|



## やりたいこと
各項目に LIKE 検索をかけて、ソート順は、product_name に引っかかったもの、次に product_detail に引っかかったもの、の順にしたい。

## やったこと

```sql
select * from item
  where product_name like '%Tシャツ%' 
     or product_detail like '%Tシャツ%'
  order by (( case when product_name like '%Tシャツ%'  then 100 else 0 end ) + ( case when product_detail like '%Tシャツ%'  then 10 else 0 end )) DESC
```

## 結果
こんな感じでソートされる

| ID | product_name | product_detail|
|:---:|:-------------|-------------|
| 3  | ロゴ入りTシャツ| サイズ展開豊富|
| 2  | 半袖Yシャツ| Tシャツ生地を採用 |
【MySQL】UPDATEで並び順フィールドをきれいに振りなおす。

自分用のメモです。
いつの間にか、並び順の枠がなくなっていて、並び順の管理がしにくくなると思います。
下記のSQLで並び順を維持して番号を振りなおす。

#■やり方

```sql
#下記は10間隔で振りなおしている。
#並び順列「sort」フィールドに新しい番号を入れる。
#orderbyで更新順を更新前のsortの昇順にする。
begin;
set @count:=0;
update hogetable set sort = (@count := @count + 10 ) order by sort;
commit;
```
割とスマートにできてぱっと見のクエリもわかりやすいです。



以上。
Raspberry pi 4 と Android 10 python勉強するのにどちらがコスパが良いか?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/7f5c7b60-8182-191a-5a83-808e518863d2.png)

#どちらも14000円以下で手に入る。
###Raspiは、GPIOがついているけどAndroid10は、ついていない。
#####Androidは、液晶・タッチパネルがついている。しかも、Rakuten Unlimitが使える。一年無料!電話にもなる!
Raspberry pi 4クワッドコアで Android 10 (Umidigi A7)オクタコアである。クロックも1.5GHez対2.0GHZである。
pythonのようなインタープリタを動作されるには、コア数と動作クロックの点で有利である。
#中華製のAndroid携帯電話は、手軽で安くLinuxや制御の勉強に最適である。C言語からPython,Go言語まで簡単に試すことができる。
##とりあえず、お試しでHello Worldを行う。

#1.PCと繋ぐUSBで接続する。ドライバーは、適当にダウンロードする。
ここに書いてある適当の意味は、まず、SoC(System on a Chip)を調べる。A7proは、Mediatek Helio だから[メディアテックのユニバーサルドライバーをインストールする](https://androidmtk.com/download-universal-adb-driver)
2.Androidを操作して開発モードに設定する。
![開発モード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/d85e709c-e95c-cb5b-9af4-ca88a850b7ed.gif)
videoを参考に開発モードに入れてください。
3.PCから制御する。タッチパネルで操作するのが大変なので、PCのキーボード・マウスからオペレーションできるようにする。

[このリンクからダウンロードします](https://github.com/Genymobile/scrcpy)
インストールするとPCからAndroidをのKeyboad/Mouseによって制御できます。最近のスマートフォンは、解像度が上がっています。
もし、エラーが出たりノートPCの解像度が低い場合
##開発モードのusbデバックの設定
![開発モード1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/a353c08b-2415-7faa-0465-0a807cbf55e5.gif)

```
scrcpy -b 8M -m 1024
```
bitrate 8Mに指定して縦方向の解像度を1024に設定してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/0c7ba135-2a30-82ac-d6ff-0c429b304601.png)

環境整備をします。Linux調のターミナルAppを導入します。Termux

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/075267db-fa86-a5a3-2f0c-066fa9a2cb36.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/e8b7d9c3-1ba4-7ff7-b603-fb2c908c7e65.png)

立ち上げます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/cc97658a-2198-810f-0e94-e63240d3af4f.png)

アップグレードを行います。

```
$ pkg upgrade
```
エディターをいれます。

```
$ pkg install vim
```
では、プログラムを入力します。万国共通最初の一歩

```
#include <stdio.h>
int main(){
        for (int i=0;i<10;i++){
                printf("hello world %d\n",i);
        }
}
```

コンパイル

```
$cc test.c
```
-rwx------ 1 u0_a155 u0_a155 8176 Aug 25 14:56 a.out
が出来上がればOK

```
$ ./a.out
hello world 0
hello world 1
hello world 2
hello world 3
hello world 4
hello world 5
hello world 6
hello world 7
hello world 8
hello world 9
$ 
```
これであなたのAndroidは、あなたによって飼いならせます。
#LGMT お願いします。つづく
NavigationComponentで遷移した直後にIMEが出ない問題

#問題の内容
NavigationComponentを使ってFragment→Fragmentに遷移後、EditTextに`requestFocus()`していてもIMEが即座に表示されない問題に遭遇しました。

cursorはEditTextに表示されているので、focusが当たっていないわけではなさそうです。

新しいActivityをstartさせてFragmentを表示させれば問題なくfocusされてIMEも表示されるので、NavigationComponentに何か問題がありそうです。

同じような問題を抱えている方がいらっしゃいました→[Link](https://stackoverflow.com/questions/59843849/edittext-is-not-working-with-the-navigation-component-when-request-focus-called)
(回答なしで悲しい)

#調査
まず以下のようなコードで解消できるか試しました(focusが当たっていたら`showSoftInput`でIMEを表示、外れたら`hideSoftInputFromWindow`でIMEを隠す)

```kotlin
val binding: HogeActivityBinding = DataBindingUtil.setContentView(this, R.layout.hoge_activity)

binding.editText.apply {
    setOnFocusChangeListener { v, hasFocus ->
        val imm = root.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        if (hasFocus) {
            imm. showSoftInput(v, 0) 
        } else {
            imm.hideSoftInputFromWindow(v.windowToken, 0)
        }
    }
}
```


こちらだと、遷移後すぐにIMEが出ることはありませんでした。
EditText外をタッチすればIMEが消えたので、`hideSoftInputFromWindow`は問題なく効いているようです。


次は`toggleSoftInput`を使います。

```kotlin
val binding: HogeActivityBinding = DataBindingUtil.setContentView(this, R.layout.hoge_activity)

binding.editText.apply {
    setOnFocusChangeListener { v, hasFocus ->
        val imm = binding.root.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        if (hasFocus) {
            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
        } else {
            imm.hideSoftInputFromWindow(v.windowToken, 0)
        }
    }
}
```

こちらは遷移直後にIME表示されました。
上手くいったと安心したのも束の間、今度はホームボタンを押したらIMEが残り続ける別の問題が発生。。。

#解決

第一引数を`InputMethodManager.SHOW_IMPLICIT`にすることで解決できました。

```kotlin
val binding: HogeActivityBinding = DataBindingUtil.setContentView(this, R.layout.hoge_activity)

binding.editText.apply {
    setOnFocusChangeListener { v, hasFocus ->
        val imm = binding.root.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        if (hasFocus) {
            imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY)
        } else {
            imm.hideSoftInputFromWindow(v.windowToken, 0)
        }
    }
}
```

#終わりに
根本原因の追及まではできませんでしたが、とりあえず回避策は見つかってよかったです。
NavigationComponent便利なのですがこういう細かいところでつまづきがあるので、今後直っていって欲しいですね。
確率によりいずれかの条件に分岐する

#実装

```Branch_by_probability.cpp
#include <iterator>
#include <vector>
#include <string>
#include <iostream>
#include <random>
#include <unordered_set>

void Branch_by_probability() {//確率によりいずれかに条件分岐する
    int i;
    std::random_device seed_gen;
    std::mt19937 engine(seed_gen());//シード値は適宜変更してください
    
    std::vector<double> probability = {34.5, 25.1, 10.0, 30.4};
    std::vector<std::string> pitching = {"Fork", "Slider", "Curve", "Straight"};
    double sum = std::accumulate(probability.begin(), probability.end(), 0.0);//各々の確率の合計が100%になるかチェック
    int Psize = probability.size();//条件分岐の種類
   
    std::uniform_real_distribution<> dist(0.0, 100.0);        // [0.0, 100.0] 範囲の一様乱数

    double rand = dist(engine);//0.0~100.0の値がランダムに選ばれる
    if (sum == 100) {
        //例　確率で投球する球を決める
        for (i = 0; i < Psize; i++) {
            if (rand < probability[i]) {
                //処理(例　投球の種類を出力）
                std::cout<<"select"<<pitching[i]<<"\n";
                break;
            }
            rand -= probability[i];
        }
    }
    else {//確率の合計が100%にならないときは実行しない
        std::cout<<"fale\n";  
    }

}
```
`"Fork", "Slider", "Curve", "Straight"` のいずれかを確率をもとに選び出力するサンプルです。`
"Fork", "Slider", "Curve", "Straight"`のいずれかが選ばれる確率はそれぞれ
`34.5,　　25.1, 　　10.0,　　 30.4`です。
IBM Security Verify ワンタイムパスワードの送信者設定をカスタマイズする

# はじめに

Email OTP/SMS OPTの送信者設定をデフォルトから変更する方法についてまとめました。
Knowledge Centerの「カスタマイズの管理」に詳細な説明があります。
https://www.ibm.com/support/knowledgecenter/ja/SSCT62/com.ibm.iamservice.doc/tasks/customizations.html

# デフォルトの送信者について

- SMS OTP
    - SMS OTP は 「IBMSecurity」から通知されます。

|![Customize-Notification-000002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/3e8d3c2e-2490-3be5-d8f2-030b6963b016.png)
|:-:|
- EMAIL OTP
    - EMAIL OTP は 「IBM Security \<ibmacct@iam.ibm.com\>」から通知されます。

|![Customize-Notification-000001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/72123973-9819-dca0-3f98-a60d074f4a2c.png)
|:-:|

# カスタマイズ設定について
カスタマイズは、IBM Security Verifyの管理画面の「構成」-「カスタマイズ」-「通知」タブから行います。


![Customize-Notification-000003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/7d6e6efd-d264-f459-92e6-b4878a5c1829.png)

デフォルト値と今回カスタマイズする値は以下の通りです。

|設定箇所  | デフォルト値 |変更例  |
|---|---|---|
|SMS-英数字の送信者ID  |IBMSecurity  |ISV1  |
|メール-送信元 E メール・アドレス  |\<ibmacct@iam.ibm.com\> |isv2@isv.com  |
|メール-送信元 E メール名   |IBM Security |ISV3  |

カスタマイズ後の設定画面です。この状態でOTPを通知して確認を行います。
![Customize-Notification-000005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/ef30cee8-16b1-e0e8-9975-0f7dde6031ff.png)


# カスタマイズ後の送信者確認結果



- SMS OTP
タイトルが「IBMSecurity」から「ISV1」に変更されました。

|![Customize-Notification-000007.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/b94b526a-bbf1-2797-0c1a-0648b974a5dc.png)
|:-:|

- EMAIL OTP
メールの送信者が「IBM Security \<ibmacct@iam.ibm.com\>」から「ISV3 \<isv2@isv.com\>」に変更されました。

|![Customize-Notification-000006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/9f9c90e2-9708-282b-5c3c-f275d152c669.png)
|:-:|



# 終わりに
設定を戻すためには、カスタマイズ画面の各フィールドを空白に戻してください。
OTPの文字列に関するカスタマイズ設定はGUI上にはありませんでした。
APIでカスタマイズできるか今後確認したいと思います。
【Nuxt.js】超シンプルなTodoリストを作成してみた【勉強４】

## はじめに

自分が勉強した内容のまとめなので、正確性は保証しません。

[こちらのサイト](https://moneyhack.tech/08-nuxt/)にcodesandboxを埋め込んでいます。

実際の振る舞いを見ながらコードの確認ができるので非常に便利です。

https://moneyhack.tech/08-nuxt/

シンプルにcodesandboxめちゃくちゃおすすめなので、気になる方使ってみてください。

# Todo リストの作成

今回は今まで学習してきた知識を用いて Todo リストを作成してみましょう。

ループでデータを描画する v-for、データを入力する v-model、v-on:click を使います。

## 入力を反映してくれる Todo リストの完成像

まずは最初に完成像を確認してみましょう。

[こちらのサイト](https://moneyhack.tech/08-nuxt/)にcodesandboxを埋め込んでいますので、実際の振る舞いをご確認ください。

Text Area に好きな文字列を入力し、Add Todo List のボタンを押せば、

Todo リストに文字列が追加されていくことがわかると思います。

## 入力を反映してくれる Todo リストのコード解説

＜ template ＞内のコードから解説していきます。

・v-for でループ処理をしているコード

    <li v-for="todo in todos">{{ todo.item }}</li>

配列(todos)内に値が存在している限り、todo.item の中身を描画するループ処理を繰り返します。

・v-model で入力を受け付けるコード

    <input type="text" v-model="newItem" placeholder="やることを入力">

text タイプで newItem に text データを格納しています。

・v-on:click で処理を呼び出すコード

    <button v-on:click="add">Add Todo List</button>

ボタンがクリックされた際に、＜ script ＞で定義した add 処理を呼び出します。

続いて、＜ script ＞内のコードを解説していきます。

・データの定義

    data: function() {
      return {
        newItem: "",
        todos: []
      };
    },

ユーザーの入力を受け付けるデータとして newItem、

これまでに入力されたデータを格納しておくために配列 todos を用意しています。

・todos に格納する add 処理

    add: function() {
      let todosItem = {
        item: this.newItem
      };
      this.todos.push(todosItem);
      this.newItem = "";
    }

オブジェクト型として格納するために let todosItem を宣言しています。

this.todos.push により、配列の最後尾に todosItem を格納します。

最後に this.newItem の中身をリセットしています。

## おわり

今回はレイアウトも気にせずに簡単な Todo アプリを作ってみました。

HTML、CSS だけでは実現できなかった、

動きのあるページ作りが簡単に実装できることがわかったと思います。

最後まで見て頂きありがとうございました！他の記事も宜しくお願い致します。
React Nativeが初期状態なのに起動できない場合の対処法

# 環境
Winows 10 64bit
Node.js v14.7.0
react-native @ 0.63.2

# エラー内容

```
> npx react-native run-android
info Running jetifier to migrate libraries to AndroidX. You can disable it using "--no-jetifier" flag.
Jetifier found 967 file(s) to forward-jetify. Using 8 workers...
info Starting JS server...
info Installing the app...

FAILURE: Build failed with an exception.

* What went wrong:
Could not initialize class org.codehaus.groovy.runtime.InvokerHelper

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 6s

error Failed to install the app. Make sure you have the Android development environment set up: https://reactnative.dev/docs/environment-setup. Run CLI with --verbose flag for more details.
Error: Command failed: gradlew.bat app:installDebug -PreactNativeDevServerPort=8081

```

# 原因
OpenJDK14以降を使う場合は、gradleを6.3で指定しないとダメらしいです

# 対処方法
以下、2020/08/25現在の対処法
現在最新のgradleは6.6なのでそれにしました

```diff:android/gradle/wrapper/gradle-wrapper.properties
--- distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-all.zip
+++ distributionUrl=https\://services.gradle.org/distributions/gradle-6.6-all.zip
```

# 参考
https://stackoverflow.com/questions/60844245/how-solve-could-not-initialize-class-org-codehaus-groovy-reflection-reflectionc
https://github.com/gradle/gradle/issues/10248
正規表現 python vs shellscript


## 置換表現


## 問題1
``` text:内容1
以下のメールアドレスを一括で置換したい
'aaa@xxx.com bbb@yyy.com ccc@zzz.com'
                 ↓
 ABC@xxx.com ABC@yyy.com ABC@zzz.com
```

``` python.py
s = 'aaa@xxx.com bbb@yyy.com ccc@zzz.com'

print(re.sub('[a-z]*@', 'ABC@', s))
```

``` shell.sh
#  mail.text に'aaa@xxx.com bbb@yyy.com ccc@zzz.com'を記入して

# その1
sed -e  "s/*@/ABC@/g" mail.txt  

# その2
sed -e  "s/[a-z]*@/ABC@/g" mail.txt  
```


## 問題2
``` text:内容2
以下の「文章」を単語区切りにしたい．
'Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.'
```


``` python.py
str = 'Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.'

# ,と.を除去
str = re.sub('[,\.]', '', str)  
```

``` shell.sh
# memo.textに「文章」を記入して

sed -e  "s/\.//g"  -e  "s/\,//g" memo.txt  
```
Raspberry Pi OS 2020-08-20 Release-note 翻訳

(追記: 2020/12/05にRaspbian OS 2020-12-04がリリースされています)
https://qiita.com/utaani/items/119d92e836377006afde

http://downloads.raspberrypi.org/raspios_armhf/release_notes.txt

2020-08-20：

  - raspi-config - 起動デバイスの順序の選択を追加
  - raspi-config - ブートEEPROMバージョンの選択を追加
  - SD Card Copier - コピー中にドライブが接続または切断された場合、コピーはすぐに中止されます
  - Flashプレーヤーのバージョン32.0.0.414が含まれています
  - Chromiumの最初の実行から削除されたユーザーフィードバック調査
  - 推奨ソフトウェア - 複数のソフトウェアを、閉じることなくインストールおよび再インストール操作が可能になりました
  - バグ修正 - パネルメニューのアイコン選択ダイアログから誤解を招くファイルブラウザを修正 - アイコンは任意のファイルではなくアイコンテーマに
  - バグ修正 - メインメニューのアイテムが翻訳されない
  - バグ修正 - raspi-configが英語以外のロケールでオーディオデバイスを検出しなかったのを修正
  - バグ修正 - ブックシェルフで、英語以外のロケールでディスクスペースがないと表示されてた問題を修正
  - バグ修正 - 64ビットイメージでの推奨ソフトウェアによるパッケージ導入時に、32ビットバージョンと64ビットバージョンの両方のインストールが失敗していたのを修正
  - イタリア語翻訳が追加されました（Emanuele Goldoniとイタリア語翻訳チームに感謝）
  - Raspberry Piファームウェアef72c17bcaaeb89093d87bcf71f3228e1b5e1fff
  - Linuxカーネル5.4.51
[Rust] Rustで処理系を書く時に役立つ記事まとめ

これから、Rust言語を用いてコンパイラを実装する時に役に立つ記事をまとめたいと思います。

# [[Rust] 構造体要素を持つenumにはIterator系メソッドを実装すると便利](https://qiita.com/yasuo-ozu/items/7ce2f8ff846ba00dd244)

言語処理系を実装する時、`enum`を用いてASTを表現することになると思います。その際、`enum`を簡便に扱えるようにするのがこの記事の趣旨です。

# (仮題)[Rust] エラー回復処理を実装してユーザーフレンドリーなエラー出力を行う

Rustにおいてエラー処理のために使われる`Result`列挙体は、通常最大でも1つのエラーしか表すことが出来ません。しかしながら、実際の処理系では、1つのエラーが出たらそれで終わり、とするのではなく、エラー回復処理を行い、処理を続行することで複数のエラーを検出し表示することが多いです。この記事では、`Error`構造体で工夫を行うことで、1つの`Error`で複数の`Error`をうまく表す方法を説明します。
bind9 を監視する

# はじめに

DNS bind9 コンポーネントをprometheusの監視に入れる

# bind_exporter

https://github.com/prometheus-community/bind_exporter

これをbind9のコンテナで作動

作動すると`http://localhost:9119/metrics`でメトリクスを載っている。

これをprometheusの監視ターゲットに入れる

# prometheusでアラートを作成

`bind_up < 1`

# grafana dashboardをインポート

https://grafana.com/grafana/dashboards/12309
New Relic メモ 〜Apache Integration〜

## やりたいこと
* New Relic InfrastructureのThird-Party IntegrationからApacheを追加したい
* デフォルトで取れるメトリクスを確認したい

## 参考ドキュメント
* New Relicが公開している[Apache Integration](https://docs.newrelic.com/docs/integrations/host-integrations/host-integrations-list/apache-monitoring-integration)を基に作業する

## 事前準備
* [以前](https://qiita.com/1ksen/items/9699e85221274e9165a1)作ったCentOS+Node.js+MySQLの環境の前段にApacheを配置する
* ApacheはHTTPS(443)をListenし、Express.js(3000)にプロキシさせる

```
Client -443-> Apache -3000-> Express.js + MySQL
```

Apacheは以下の設定をconf.dに突っ込んでおく
`/server-status`の除外設定は後述。

```apache:proxy.conf
SSLProxyEngine on
RewriteCond %{REQUEST_URI} !=/server-status
RewriteRule ^/(.*) http://localhost:3000/$1 [P,L]
```

## 前提条件確認

Apache Integrationの有効化には以下の条件がある模様

* Apache 2.2か2.4であること
    * 今回は2.4を使う
* mod_status.soがLoadModuleされていて、`/server-status`のエンドポイントをローカルから叩けること
    * デフォルトでLoadModuleされている
    * また、以下の設定をconf.dに突っ込んでおく

```apache:status.conf
<Location /server-status>
SetHandler server-status
Require host localhost
</Location>
ExtendedStatus On
```

## Apache有効化手順

`nri-apache`モジュールをインストールする。

```shell-session
# yum install nri-apache
```

設定ファイルのディレクトリに移動し、ファイル名を変更する。

```shell-session
# cd /etc/newrelic-infra/integrations.d
# cp apache-config.yml.sample apache-config.yml
```

ファイルの中身は以下の通り。変更する場合は[こちら]()を参照のこと。

```yaml:apache-config.yml
integration_name: com.newrelic.apache
instances:
    - name: apache-server-metrics
      command: metrics
      arguments:
          status_url: http://127.0.0.1/server-status?auto
          remote_monitoring: true
      labels:
          env: production
          role: load_balancer
    - name: apache-server-inventory
      command: inventory
      arguments:
          remote_monitoring: true
      labels:
          env: production
          role: load_balancer
```

**newrelic-infra**を再起動する。

```shell-session
# systemctl restart newrelic-infra
```

## 動作確認

InfrastructureからThird-party Servicesに行くと、Apacheが追加されている。

![A81B267F-B84A-47BF-B1AF-0FDA19F8A0C0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325101/432b2eff-5c89-3f45-1c1a-3d94626f5138.jpeg)

中を覗くと、ダッシュボードみたいなのが表示されている。

![EBAAEE68-EF69-4F37-A1B7-8DBD2FC01E86.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325101/4a772188-d630-67e6-4d99-f59ff62f7392.jpeg)

## この後確認したいこと

* パスごとのアクセス分析ができるか
* 並列に複数台並べた時に横串でアクセス分析ができるか

このへんはNRQLで対応するのかな？
Optionalについてまとめてみた

## 何を表しているのか？

`Optional<Wrapped>`型は、値があるか空かのいずれかを表した型です。

## 何がうれしいのか？

Optional型にしてできることは**nilを扱えるようになる**ことです。　

→nilについての処理を楽にできる。

# Optional<Wrapped>の中身

```swift
enum Optional<Wrapped> {
	case none
	case some(Wrappped)
}
```

.noneが値の不在、すなわちnilと等しいケースで、

.someがWrapped型の値の存在を表すケースです。

```swift
let none = Optional<Int>.none
print(".none: \(String(describing: none))")

let some = Optional<Int>.some(1)
print(".none: \(String(describing: some))")

/*
.none: nil
.some: Optional(1)
*/
```

 このことより、Optional<Wrapped>型の.noneとnilリテラルが対応づけられていることがわかる。

## **定義方法**

```swift
変数名:型名?
```

### めっちゃ簡単やん！！

めんどいのはここから

```swift
let a:Int = 1
let b:Int? = 2
let c = a + b //コンパイルエラー
```

何故コンパイルエラーとなるのか　

→Optional型はnilを扱う都合上そのままでは値が取り出せない仕様になっています。

つまり、型をOptional型で包んでいる感じです。　

イメージとしては、Optionalという袋の中に型という食べ物が入っており、袋に入ったままだと、四則演算という料理に使えないと考えてください。

![https://d2l930y2yx77uc.cloudfront.net/production/uploads/images/16714383/picture_pc_8961d75225778049011cca86046f14ad.png](https://d2l930y2yx77uc.cloudfront.net/production/uploads/images/16714383/picture_pc_8961d75225778049011cca86046f14ad.png)

# 取り出したい！！

## **ForcedUnwrapping**

### !演算子によるOptional<Wrapped>型の値の取り出し

!をつけることにより強制的にOptionalの殻を外すことができます

```swift
let a : Int? = 0
let b = a!
print(b) //0
```

### メリット

・楽にunwrapできる。

### デメリット

この方法では変数にnilが入っているかわからないため、安易にnilを代入してしまい、アプリのクラッシュに繋がるという最悪のことを避けるためになるべく使わないでおきましょう

## オプショナルバインディング

### if文による値の取り出し

条件分岐文や繰り返し文の条件にOptional<Wrapped>型の値を渡し、値の有無に応じて処理を切替え、値が存在する場合はWrapped型の取り出す方法です。

```swift
let optionalA = Optional("a")

if let a = optionalA {
	print(type(of: a))
}

//String
```

## ??演算子

### 値が存在しない場合のデフォルト値を指定する演算子

Optional<Wrapped>型に値が存在しない場合のデフォルト値を指定するには、中間演算子の??を使用します。

```swift
let optionalInt : Int? = 1
let int = optionalInt ?? 3
print(int) //1
```

```swift
let optionalInt2 : Int? = nil
let int2 = optionalInt2 ?? 3
print(int2) //3
```
VSCodeのPrettierの改行される文字数の変更の仕方

`VisualStadio Code`にPrettierの拡張機能を入れて開発しているのですが、あまりにもタグが改行されまくって、イラっとさせられてしまいましたので、ちょっと調査しまして備忘録として残しておきます。

拡張機能から、`Prettier`を選択し、右下の`設定ボタン`から`拡張機能の設定`をクリックします。
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624898/785b48f4-34e8-f04d-47f8-3dd595a147c2.jpeg)

`Prettier: Print Width`の項目を探してデフォルトが`80`となっているので、好きな数字に変えます。
私のは大き目のモニターを使っていましてそれに合わせて`360`にしました。
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624898/c012530e-f032-31c8-77b4-eeefc8308c4b.jpeg)

## それかConfigで設定する

最初は上の設定をしていたのですが、`VisualStadio Code`側で設定してしまうと、当然エディタで設定したその人にしか適用されません。
チーム開発するなら共通の設定を持った方がいいと思いました。

下記のようにprettierがインストールしてあるJsプロジェクト直下に置くだけで大丈夫です。

```javascript:prettier.config.js
module.exports = {
    printWidth: 360,
};
```
Makefileで多数のファイルを処理する

## 目的
Makefileでプログラムをコンパイルする方法はよく解説されているが，データ処理のタスクランナーにも使いたい場合の資料は少ないので例示したい．良い処理や書きかたをさらに思いついたら加筆の予定．

## 単数のデータ => 単数のデータ
`exe.x`に00000を渡すと`dirA/dataA00000.dat`を読み込んで，
`dirB/dataB00000.png`が出力されるような場合，以下のように書けば良い．

```make:
dirB/dataB%.png: dirA/dataA%.dat exe.x
    exe.x $* 
```
つまりソースとターゲットの共通部分の文字列を%としておいて，コマンドでその共通部分を参照したいときには$*を使う．

## 複数のデータ=>複数のデータ
では，dataBを全部作りたい時にはどうするのか？

```make:
DATAA = $(shell ls dirA/dataA*.dat)
DATAB = $(patsubst dirA/dataA%.dat,dirB/dataB%.png,$(DATAA))

all: ${DATAB}

dirB/dataB%.png: dirA/dataA%.dat exe.x
    exe.x $* 
```

これはまず`ls`と`*`をつかって`dataA`を全部まとめたものを`DATAA`という変数にいれる．
その`DATAA`からできるファイルは`patsubst`をつかって変換して全部まとめたものを`DATAB`という変数にいれる．あとは適当に`DATAB`をソースやターゲットとして設定すればよい．

## 複数のデータ=>単数のデータ
ffmpegとかで複数のpngファイルからmp4のファイルを作りたいような場合．

```make:
DATAA = $(shell ls dirA/dataA*.dat)
DATAB = $(patsubst dirA/dataA%.dat,dirB/dataB%.png,$(DATAA))

dirC/dataC%.mp4: ${DATAB} makemovie.sh
     makemovie.sh 
```

## データが存在するかどうかで処理を変える
以下の例では`bindata/unf00001.dat`がある場合とない場合で処理を変えている。期待されているファイルが一つでもある場合は`ls`を使って処理されるべきファイルを設定しするが、もしそのファイルがない場合はそのファイルを作ろうとする。

```make:
filename = bindata/unf00001.dat
fileexists = $(shell ls | grep ${filename})
ifeq (${fileexists}, ${filename})
    BIN= $(shell ls bindata/unf*.dat)
else
    BIN= ${filename}
endif
VOR   = $(patsubst bindata/unf%.dat,output/vor%.dat,$(BIN))
VORPNG= $(patsubst output/vor%.dat,figures/vor%.png,$(VOR))
```

## よく使う変数
よく使う変数についてもメモしておく。


```make:
FC=ifort -extend-source
FLAG1= -g -traceback -O2
program.x: code.F
	${FC} ${FLAG} $? -o $@
```
`$@`はターゲット。つまり`:`の左のファイル。
`$?`は筆頭の依存ファイル。つまり`:`の右のファイル。


## よく使うオプション
よく使うオプションについてもメモしておく。

```bash:
>make --debug
```

## 参考記事

- [10.5 パターンルールの定義と再定義](http://quruli.ivory.ne.jp/document/make_3.79.1/make-jp_9.html#Pattern-Rules)
- [makeで解析パイプライン作成（make）](https://sites.google.com/site/scriptofbioinformatics/make-guan-xi/makede-jie-xipaipurain-zuo-cheng-make)
- [自動化のためのGNU Make入門講座](http://objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/gnu-make.html)
[Rails] LINE MessagingAPIを使ってecho(オウム返し)Bot を作成する。

# 　概要

Web APIを学習するために、LINEのBot開発を行いました。
今回は簡単な送られたテキストをそのまま返すechoBotを作成します。
Railsで開発し、Herokuへのデプロイまで行います。

# 　環境

・Ruby 2.6.5
・Rails 6.0.3.2
・PostgreSQL
・Heroku


# 　目次
・LINE Developersでchannelを作成
・Bot本体のプログラムを作成(Ruby/Rails)
・Herokuへのデプロイ

## 　LINE Developersでchannelを作成
まずはLINEデベロッパー登録を行います。 その後にプロバイダーとチャネルを作成し、必要なAPIキーを取得しましょう。
https://developers.line.biz/ja/docs/messaging-api/getting-started/

公式(上記)を参考にBot用channelを作成します。
簡単に作業を箇条書きにしますと、

・LINE Developersコンソールにログイン
・名前とメールアドレスを入力して開発者アカウントを作成
・プロバイダ、チャネルを作成、この時MessagingAPIを指定
・アクセストークンを発行
・応答メッセージをオフ　Webhockをオンに設定しておく

Channel secretとChannel access tokenがBot開発に必要なのでここでメモしておきます！

## 　Bot本体のプログラムを作成(Ruby/Rails)

HerokuにデプロイするのでDBはPostgreSQLを使用します。


```
$ rails new アプリ名 -d postgresql
$ cd アプリ名
$ git init
```
### 　必要なgemをインストール
line-bot-apiというgemを使用します。

```ruby:Gemfile
gem 'line-bot-api'
```
```
$ bundule install
```

## 　実装
### 　１. ルーティングの設定

```ruby:config/routes.rb

Rails.application.routes.draw do  
    post '/callback' => 'linebot#callback'  
end
```

### 　2. コントローラーを作成

```
$ rails g controller linebot
```

### 　3. コントローラーへの記述

コントローラーへの記述はライン公式SDKのRUBYを参考に(コピペ)しました。
https://github.com/line/line-bot-sdk-ruby/blob/master/examples/echobot/app.rb

```ruby:
class LinebotController < ApplicationController
 require 'line/bot'  # gem 'line-bot-api'

def client
  @client ||= Line::Bot::Client.new { |config|
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
  }
end

post '/callback' do
  body = request.body.read

  signature = request.env['HTTP_X_LINE_SIGNATURE']
  unless client.validate_signature(body, signature)
    halt 400, {'Content-Type' => 'text/plain'}, 'Bad Request'
  end

  events = client.parse_events_from(body)

  events.each do |event|
    case event
    when Line::Bot::Event::Message
      case event.type
      when Line::Bot::Event::MessageType::Text
        message = {
          type: 'text',
          text: event.message['text']
        }
        client.reply_message(event['replyToken'], message)
      end
    end
  end

  "OK"
 end
end
```


## 　Herokuへのデプロイ
まずはHerokuへのログインをし、Heroku上にアプリを作成し、デプロイをします。


### 　Heroku側に環境変数を設定します。

```
$ heroku config:set LINE_CHANNEL_SECRET=ここに先程メモしたChannel Secretを貼り付ける
$ heroku config:set LINE_CHANNEL_TOKEN=ここに先程メモしたアクセストークンを貼り付ける
```

### 　LINE developersでWebhook settingsの設定をする

デプロイしたアドレスの末尾に/callbackをつけたURLをWebhookに設定する.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696964/8a2c9479-7396-a7e2-27f2-b3770fd2abf8.png)


これでecho-botの完成です。テキストを送ると同じテキストを返してきます。

# 　まとめ
現状ではコードの変更後、デプロイしなくては反映されないので、
次回はngrokを用いてローカル環境で動かす方法を行います。
https://qiita.com/shizu9d/items/42b2cb209b2e23a9af6d

# 　参考文献
以下の記事を参考にさせていただきました。
https://qiita.com/noriya1217/items/00d6461e9f54900377a3
AWS ハンズオンシリーズを全部やってみた。（その１）

AWSの資格は持ってるけど、ごく一部のサービスしか触った経験がなく、ペーパードライバー状態・・・。で、何かいい教材がないか、探して見つけたのが、

[AWS ハンズオン資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/ "AWS ハンズオン資料")

無料で、ハンズオンで実際に操作しながら学習できるので分かりやすそうだったのでやってみました。
（資料を見る際に、毎回アンケートに答えないといけないのが若干面倒ではある・・。）
去年〜今年に公開されたもので、講師の画面と、実際の画面にほとんど違いがなく、迷わず進められました。
どのハンズオンも、詳しく説明されていて、予備知識なしで実施できます。
また、メインコンテンツに集中できるように、VPCウィザードや、cloudfomationを使って、事前の環境構築を短時間で行うので、どの動画も1,2時間で終わります。
僕の場合、説明部分は倍速で見て、ハンズオンは一時停止しながら進めました。

### 以下、やったハンズオンの感想

#### AWS Hands-on for Beginners - ハンズオンはじめの一歩: AWS アカウントの作り方 & IAM 基本のキ
https://pages.awscloud.com/event_JAPAN_Ondemand_Hands-on-for-Beginners-1st-Step_LP.html
AWSが初めてで、アカウントもないって人や、IAMがいまいちわからないって人は必見。
個人で試すだけなら、ルートアカウント作って終わりでいい気もしますが、業務だったりサービスを運営するなら、IAMユーザー作った方がいいです。
僕は、アカウントは持ってたので、流し見しましたが、とてもわかりやすかったです。
#### AWS Hands-on for Beginners - Security #1 アカウント作成後すぐやるセキュリティ対策
https://pages.awscloud.com/event_JAPAN_Ondemand_Hands-on-for-Beginners-Security-1_LP.html
請求のアラート機能便利。インスタンスを作ったまま削除し忘れて、後で請求が届くってことを防ぐ為の設定ができます。
請求レポートを設定すると費用が発生するようですが、アラートは無料なのでアラートだけでも設定しておくと安心です。

#### AWS Hands-on for Beginners - スケーラブルウェブサイト構築編
https://pages.awscloud.com/event_JAPAN_Hands-on-for-Beginners-Scalable_LP.html
また一からVPCの構築から始まる？かと思ったら、VPCウィザードを使って簡易的に構築。メインの操作に円滑にすすめる工夫がされてました。
この動画は全部で2時間程度（しかもここだけyoutubeではない）で長いのですが、よくあるシステク構築が題材なので参考になります。

#### AWS Hands-on for Beginners - AWS 上で静的な Web サイトを公開しよう！
https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-StaticWebsiteHosting-2020-reg-event-LP.html
最初のS3バケットの作成の画面UIが、動画と違って戸惑うが、「パブリックアクセスをすべてブロック」のチェックを外す以外はデフォルトで問題なし。
ここも業務でよく使うので参考になりました。

#### AWS Hands-on for Beginners - 監視編 サーバーのモニタリングの基本を学ぼう
https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-monitoring-2020-reg-event-LP.html
cloudfomationを使って、handson環境を構築するところからスタート、サクッと環境をつくって、CloudWatchの操作方法を学ぶ。
CloudWatchで任意のログを見るための、CloudWatchエージェントの使い方はなかった。どちらからというアクセス解析等をしてる人向けなコンテンツ。

#### AWS Hands-on for Beginners Serverless #1 サーバーレスアーキテクチャで翻訳 Web API を構築する
https://pages.awscloud.com/event_JAPAN_Hands-on-for-Beginners-Serverless-2019_LP.html
Amazon API Gateway便利。LambdaをAPIとして動かす為の物かと思ってたけど、固定のレスポンスを返すmockも作れる。swaggerを読み込んで自動で生成することもできるらしい。
実際に使う場合は、ローカル環境でのデバッグ方法やLambda上のソースをどのように管理するかが課題だと思った。
videoタグで自動再生するときの注意点


# videoタグを直接HTMLに設置する場合
基本の形はこれ。

```
<video src="example.mp4" poster="example1.jpg" muted autoplay playsinline loop></video>
```

- autoplay：自動再生用
- muted：これがないと自動再生しない
- playsinline：iphone safariはこれがないと自動再生しない

loopやposterは必須ではない。
preloadはデフォルトONなので、指定しなくてもOK。

# javascriptからvideoタグを設置する場合
2つほど注意点がある。

- `muted`ではなく、`muted="muted"`にする。
- `createElement`ではなく`innerHTML`を使う。

```
<video src="example.mp4" poster="example1.jpg" muted="muted" autoplay playsinline loop></video>
```

## `muted="muted"`の理由
chromeやfirefoxだけの現象だが、`muted`だけだと、`Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first.`とエラーが出てしまう。
javascriptだと少しだけ仕様が違うのか厳格なのか分からないが、autoplayポリシーに引っかかって自動再生しなくなるようだ。
ページ遷移のときは問題ないが、リロード時やURL直打ちだと`muted`では自動再生しない。


## `innerHTML`の理由
`document.createElement('video')`で追加しても自動再生されない
これもchromeやfirefoxだけの現象だが、上記のタグを`createElement`して属性を付与して、HTML側に追加しても、リロード時やURL直打ちだと再生されない。