OmniAICreator/Qiita-1.07M huggingface dataset:
複数人開発でのLive Shareが便利すぎる

**LiveShareとは、VSCodeの拡張機能です。**
導入することで、以下のようなことが可能になります。

・複数人が同一のVSCodeでコードの編集、デバック処理をすることができる
・ホストマシンのターミナルをシェアし、ゲストがコマンドを実行することができる

プログラミングスクールでのチーム開発において、複数人でのデバックの処理やコードの編集においてかなり役に立ちました。
また、プログラミング初学者に教えるのにも便利な機能だと思ったので紹介します。

# LiveShareの導入

導入はあっという間に終わります！！
拡張機能において**LiveShareと検索し、インストール**をするだけで完了です！
![LiveShare](https://i.gyazo.com/ff3e91ae3918234818f236c103b1b7d3.png)

注意点ですが、拡張のインストールはホスト（セッションを始めるオーナー）とゲスト（セッションに参加するメンバー）のどちらも必要です！ホストのみのインストールだけでは使用できないです。

# MicrosoftアカウントかGitHubアカウントでサインイン
ホストとして、LiveShareを使用する場合、MicrosoftアカウントかGitHubアカウントでサインインする必要があります！自分はGitHubアカウントでサインインしました。

# LiveShareの使用方法
使用方法もかなりシンプルで分かりやすいです！

**①ホストがコラボレーションセッションを開始する**
下の動画のように、サイドバーのLiveShareアイコンをクリックしセッションの詳細の右に表示されているアイコンをクリックするとコラボレーションセッションが開始されます！

![LiveShare](https://i.gyazo.com/download/18805a5068b3c01ec5a87863b0a2c213.gif?_ga=2.173680931.1241998708.1597716969-1272755455.1591584920)


**②ホストがクリップボードに招待リンクをコピーし、ゲストに共有**
コラボレーションセッションを開始後に、セッションの詳細の右側のアイコンをクリックすると招待リンクが自動でコピーされるので、それをゲストに共有します！
SlackやLINEでも共有することができます！
![代替テキスト](https://i.gyazo.com/download/9b27c135687c007bc91f0d0bdfbae890.gif?_ga=2.210379797.1241998708.1597716969-1272755455.1591584920)

**③ゲストが招待リンクをクリックして参加する**
ゲストが、ホストから送られてきたリンクをクリックすると、ホストのVSCodeに遷移し複数人でコードの編集を行うことが可能になります。

# 終わりに
LiveShareは、複数人での単純作業やデバックの処理にかなり便利です。
またコードを教えながら書くことが可能なので非常に役立つものなので是非導入してみてください！
MacでもWindowsどちらでも使用可能です！

公式ドキュメント
https://docs.microsoft.com/en-us/visualstudio/liveshare/use/vscode

参考にした記事
https://qiita.com/mh4gf/items/8f072b2faabba90937d3
[Android Studio]本番環境をデバッグ可能にする

忘備録。

## 問題

以下はエラー内容。
本番環境をデバッグできるようにしたい。

```console
Error running 'app'
			Cannot debug application from module app on device emulator-5554.
			This application does not have the debuggable attribute enabled in its manifest.
			If you have manually set it in the manifest, then remove it and let the IDE automatically assign it.
			If you are using Gradle, make sure that your current variant is debuggable.
```

## 解決策

`build.gradle` に記載されている設定 `debuggable` をfalseからtrueへ変更

```build.gradle

    buildTypes {
        release {
            debuggable true //変更

```

その後、メニューからBuild Bundle。
(Androidに不慣れすぎてこれに気づかなくて変更反映されなくて焦った)
![スクリーンショット 2020-08-18 12.13.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/3e858b9a-c9f1-6575-a43a-c1ccc0ebfb91.png)

## 補足

Build Variantをdebugに変更する解決策もあるっぽいけど、これは今回やりたかったことではなかった。
![スクリーンショット 2020-08-18 11.30.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/8485a0a2-d5ff-36fa-c50b-6af05b3131e8.png)


## 参考

[アプリをビルドして実行する  |  Android デベロッパー  |  Android Developers](https://developer.android.com/studio/run?hl=ja)
[android - This application does not have the debuggable attribute enabled in its manifest - Stack Overflow](https://stackoverflow.com/questions/25860720/this-application-does-not-have-the-debuggable-attribute-enabled-in-its-manifest/36834897)
SQLServerのバックアップファイルをRDSへインポートする

SQLServerのバックアップファイルをRDSへインポートすることになりました。以前よりは簡単になったといわれておりますが、だいぶはまったのでメモに残しておこうと思います。

#ドキュメント
今回の作業にあたり、こちらのドキュメントを参考にしました。
<A Href="https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.html">SQL Server データベースのインポートとエクスポート(AWS ユーザーガイド)</A>
<A Href="https://qiita.com/nis_nagaid_1984/items/99870c7a6e9ea5b777a4">RDS for SQL Server へのインポート</A>

#「権限がない」と怒られる
ところが、この通りに実行したはずが以下のエラーが出てしまいます。

```エラーメッセージ
Msg 50000, Level 16, State 0, Procedure rds_restore_database, Line 37
Database backup/restore option is not enabled yet or is in the process of being enabled. Please try again later.
```

「あとでもう一度実行してみてください」とありますが、翌日に実行しても同じだったのでどうやらうまくいっていないようでした。

#ドキュメント(英語)
メッセージで調べたところ、<A Href="https://stackoverflow.com/questions/57005157/restore-from-s3-bucket-to-sql-server-getting-error-database-backup-restore-optio">こちらのページ</A>が出てきました。それを参考に修正すると正常にインポートが完了しました。

#何がだめだったのか？
まあいろいろあったのですが...

###DBインスタンスのオプショングループが正しくない
![db_addsetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417886/cabeef16-6c59-cf18-81ba-de58fe228816.png)
 初歩的すぎてなかなか気がつきませんでした。オプショングループを作成後、該当DBインスタンスの設定で有効にする必要があります。「追加設定」→「データベースの選択肢」→「オプショングループ」を作成したものに変更してください。

###IAMロールが正しくない
こちらにも詳しくまとめられておりました。IAMロールに「AWSBackupServiceRolePolicyForRestores」を追加します。
<A Href="https://qiita.com/mrsr6113/items/2326bc3d4c334838fd66">RDS for Microsoft SQL Serverに.bakをリストアするとエラーになる</A>

###オプショングループのエンジンがそろっていない
![option_group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417886/4fc03550-fa48-dccf-7f36-3e1cbb2d4750.png)

オプショングループで「エンジン」「メジャーエンジンのバージョン」を設定しますが、<B>使用しているデータベースと一致する必要があります</B>。そのために「関連付けられた DB インスタンスとスナップショット」に表示されませんでした。


#成功！
これらを修正することで無事データのエクスポートが完了しました。めでたしめでたし。
Javaメトリクスとは_メモ_20200818

#メトリクス


**１．メトリクスとは**

　　**便利なメトリクスたち**

　　メトリクスとは、モデルを構成するクラスやメソッド、クラス間の関係、パッケージ間の関係などを、
　　複雑さや結合度、凝集度などの観点から測定し、数値として表すものです。

　　ソフトウェア開発で用いられるメトリクスには、マイナーなものも含めると非常にたくさんの種類があります。
　　ただし、あまり高度なメトリクスを勉強しても実践の場でうまく使いこなすことは難しいです。
　　ですので本資料では便利な３つの指標、「LOC」「CC」「WMC」だけに絞って学習します。
　　たくさん覚えても使う機会がないと忘れてしまいますしね。

　　**メトリクス利用のメリットデメリット**

　　＜メリット＞

　　コードの規模や複雑さ、凝集度（互いに関連する要素のコード内での散らばり具合）、
　　結合度（クラスやパッケージの独立性の高さ）などを専用のツールを使って計測し、
　　一定の目標を定めて改善していくことができる。
　　

　　＜デメリット＞

　　たくさん存在するので覚えるのに時間がかかる


**２．LOC**


**規模を大まかに把握できる　LOC**

　　**LOC(Line of Code)**は、その名の通りプログラムの行数を表します。
　　たとえば、中身が２００行のプログラムの場合、LOCは２００です。
　　ただし、空行やカッコだけの行など、プログラムの本質とは関係のない行をカウントしないなど、
　　いくつかの数え方があります。

　　また、行数が多い場合は１０００行単位で数えるKLOCを使うこともあります。
　　(８００００行のプログラムは８０KLOC)※今回資料では覚える必要はありません。


　　**LOCの特徴**

　　コードの書き方や数え方によって容易に増減するメトリクスであるため厳密な運用には向きません。
　　あくまで**規模を大まかなとらえるための道具**と割りきって使いましょう。

**３．CC**

**メソッドの複雑さを示すCC**

　　**CC(Cyclomatic Complexity)**はトーマス・マッケーブという人が開発したメトリクスで、
　　「マッケーブの**循環的複雑度**」とも言います。
　　CCはある特定のメソッドの中身がどれだけ複雑なのかを表す１以上の数値であり、
　　大きいほど複雑であることを示しています。

　　具体的には、ifによる分岐やforによるループが多く使われるほど高い数値を示します。
　　あまりにも複雑なメソッドは、読みづらく、バグになりやすく、後々の修正も大変です。
　　開発中の各メソッドについて、CCが一定以上に抑えられているかチェックし、
　　あまりにCCが大きいものは修正したほうが良いこともあります。


　　**CCの特徴**

　　高ければ高いほどバグが混入する確率も上がるので、修正をする際に使うこともあると
　　考えられます。


**４．WMC**

**クラス複雑度を示すWMC**

　　**WMC(Weighted Method Per Class)**は、あるクラスに含まれる全メソッドのCCを合計した値であり、
　　クラスの複雑度を表します。
　　WMCが異常に大きい値を示しているクラスは、複数に分割できるかを考えたほうがよさそうです。


WMCが大きい時の対応

　　・メソッドの機能を分割する

　　・構造を簡単にできるか検討する


　　**WMCの特徴**

　　CCを合計した値になるので、大きければ大きいほど自分が開発しているものが
　　複雑になりすぎているか、読みにくいかなどがわかる。


※どうでもいい方は読み飛ばしてください
＜筆者の所感＞

実際に開発現場で自分が製造を任された際にメトリクスも気を付けて製造しようと思った。
jQueryで複数のinputからそれぞれのvalueを取得する。

## はじめに

タイトルの操作で悩んだので、自分で試したり調べたりしたことと、teratailなどで質問して分かったことをまとめます。

結論を簡潔にお伝えすると、複数のinputからそれぞれのvalueを一括に取り出すメソッドはありませんでした。代わりに、複数の要素に対して同じ処理をおこなう`.map()`とvalueを取り出す`.value`を組み合わせて解決しました。


## やりたいこと

同じクラスをもつ複数のinputから、それぞれのvalueを取り出したい。

```form.html
<form action="" method="">
    <input class="input" type="text" name="inputs[]"></input>
    <input class="input" type="text" name="inputs[]"></input>
    <input class="input" type="text" name="inputs[]"></input>
    <button type="button" class="btn">button</button>
</form>
```

それぞれのinputには"input1", "input2", "input3"を入力。


## 解決方法

```script.js
$(function(){

    $('.btn').on('click', function() {

        const inputs = $('.input').each(function(index, element){
            return element.value;  // valueを取り出す
        }).get();  // 標準的な配列に変換

        console.log(inputs);  // ["input1", "input2", "input3"]

    });
});
```

`.each()`を使うことで、複数のinputに対して同じ処理（valueの取得）をしています。また、`.each()`はjQueryオブジェクトを返すので、`.get()`を使って標準スタイルの配列に変換しています。


## 間違えたコード

### 1つ目

`.value`ではなく`.val()`を使っていた。

`.val()`はjQueryのオブジェクトに使用するメソッド、`.value`はHTMLInputElementオブジェクトに使えるメソッドだそうです。`$('.input')`はjQueryのオブジェクトで、`element`は`HTMLInputElement`になっているらしい、、ここらへんの理解が甘いので、勉強します。

### 2つ目

`.map()`ではなく`.each()`を使っていた（`.each()`の使い方を間違えていた）。


```script.js
$(function(){

    $('.btn').on('click', function() {

        const tests = $('.input').each(function(index, element){
            return element.value;
        });

    });
});
```

`.each()`の`return`はbool型にしないといけないらしいです。
一般的なfor文の`continue`に当たるものが`return True`、`break`に当たるものが`return False`という認識です。


### 参考


- JavaScriptで.valueを使っているのにvalueではなくHTMLタグが返ってくる（teratail）
https://teratail.com/questions/285400?whotofollow=

- JavaScriptで.valueを使っているのにvalueではなくHTMLタグが返ってくる（スタック・オーバーフロー）
https://ja.stackoverflow.com/questions/69636/javascript%e3%81%a7-value%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%84%e3%82%8b%e3%81%ae%e3%81%abvalue%e3%81%a7%e3%81%af%e3%81%aa%e3%81%8fhtml%e3%82%bf%e3%82%b0%e3%81%8c%e8%bf%94%e3%81%a3%e3%81%a6%e3%81%8f%e3%82%8b/69637#69637

- JavaScript初心者が失敗しがち/間違えがちなこと8選（Workship MAGAZINE）
https://goworkship.com/magazine/javascript-beginner-mistakes/

- 【jQuery入門】2種類のeach()による繰り返し処理まとめ！（Samurai Blog）
https://www.sejuku.net/blog/33609

- 【jQuery入門】map()を活用した繰り返し処理の方法まとめ！（Samurai Blog）
https://www.sejuku.net/blog/66032
Talend を使った実装を思い出してみる


# はじめに
以前にTalendを使用して実装を行う機会があったのを思い出したので、どういったことをやっていたのか振り返りを兼ねて書いてみる。

ただし、ずいぶん時間がたっているので、メモ書き程度の内容になる。

# Talendとは

・ETLツール：Extract/Transform/Load（略称：ETL）の工程を行う。
　・Extract - 外部の情報源からデータを抽出
　・Transform - 抽出したデータを必要に応じて変換・加工
　・Load - 最終ターゲットに変換

【参考】
http://www.adempiere.com/A_Step_by_Step_Guide_to_Data_Migration_with_Talend_ETL
https://ja.wikipedia.org/wiki/Extract/Transform/Load


# 実装内容を思い出してみる

## 何があったか
・talend ファイルで管理実装をしていく。
・Palette と呼ばれるエリアに、DBアクセス、ファイルアクセスや変換など目的毎にコンポーネントが準備されている。
・コンポーネントのアイコンを配置し、処理フローをつなぐことで実装ができる。またGUIベースで作成した処理フローはTalend内部でJavaのコードが自動生成される。
・コンポーネントの連結やプロパティで設定しきれない箇所については、独自にJavaのコードを実装する場合もある。

## 実装の流れ
・データベース接続を初期化する。
・必要なデータを取得する。
・変換処理（tMap）で項目の紐づけや変換を行う。
・コンポーネント毎の実行結果により、次のステップへの遷移やエラー処理等を行う。

## 気になった点
・talend の１ファイル内に複数の処理が管理されている場合、複数人で実装を行うとソース管理の手順が煩雑になった記憶がある。

・編集するファイルを手を加える担当者を把握しきれていないプロジェクトで、各チームが何の変更を入れているのか不明になっていた。（プロジェクト内での管理の問題、、スケジュールに追われてその問題まで対応できるリソースが無かったように思われる。。）

・データの取得元（DB等）が多方面にわたる場合、テストのデータ準備等が大変なことになる。（担当したときは、2カ月間の短期実装で、周辺システムの情報が不足している状況で十分な試験を行うことができなかった。

・多様なシステムとのデータ連携が容易であり、１つのフロー（ジョブ）に役割が多方面へのシステムへの連携が発生し、仕様の把握を難しくすることが多いように思われる。
GoLandでGoデバッグ起動時に遭遇したエラー

## 出たエラー

```
invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

## Xcodeを更新する

```
xcode-select --install
sudo xcode-select --switch /Applications/Xcode.app/
```

----

実行できた。
Microsoft Teams の直近の次のミーティングに参加するプログラムの作り方

Teams の会議参加依頼メールとかでメール内のリンクをクリックすると Teams が立ち上がって会議参加画面に行くやつありますよね。
あそこに書いてある URL さえ取得できれば、あとは OS ごとの作法に従って URL を起動する API を叩けばいけるはずです。

Xamarin.Forms だと `await Xamarin.Essential.Launcher.OpenAsync(オンライン会議のURL);` みたいな感じで。

## オンライン会議の URL の取得方法

この URL の取得方法ですが Microsoft Graph API でとってこれます。多くのケースで自分の予定の会議をとってくることになると思うので、この API を使うことになります。

[イベントを一覧表示する](https://docs.microsoft.com/ja-jp/graph/api/user-list-events?view=graph-rest-1.0&tabs=http)

結果の値にはイベントを表すオブジェクトの配列（生 HTTP API で叩いたときは JSON です）で `isOnlineMeeting` プロパティでオンラインのミーティングかどうかを確認できる bool 値が取得できます。これが true だったら `onlineMeeting.joinUrl` の中に目的の URL が入っています。

C# でやると API を叩いて URL ゲットして開く処理は以下のような感じです。

```csharp
var eventsResult = await _graphServiceClient.Me.Events
    .Request()
    .GetAsync();
var firstOnlineMeeting = eventsResult.FirstOrDefault(x => x.IsOnlineMeeting ?? false);
if (firstOnlineMeeting == null)
{
    await DisplayAlert("Information", "Cound not find an online meeting", "OK");
    return;
}

if (await Launcher.CanOpenAsync(firstOnlineMeeting.OnlineMeeting.JoinUrl))
{
    await Launcher.OpenAsync(firstOnlineMeeting.OnlineMeeting.JoinUrl);
}
```

`_graphServiceClient` クラスは Microsoft.Graph パッケージにある Microsoft.Graph.GraphServiceClient クラスのインスタンスです。この API を呼ぶには Calendar.Read のアクセス許可がいるので Azure AD に以下のような権限を付けたアプリを登録して、その ClientId などを使ってサインインしてアクセストークンは事前にゲットしておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/c2cbc108-e659-7785-b11d-a78c7a0a7956.png)

## 動く様子

ボタンのクリックイベントに先ほどのソースコードを張り付けたものを Android で動かすと以下のように動きます。

![teams.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/3a876088-897f-2248-9382-b68016377868.gif)
C#開発者がはまったJavaScriptのDate型から月日を取得する方法

## はじめに
本記事は、個人開発しているWebサービスの開発中にはまったことの備忘録です。

## 月の取得
[こちら](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getMonth)のgetMonthを使って取得できます。
ただ、戻り値が1月⇒0、2月⇒1といったように、__0を基点__としているので注意が必要です。
私は普段C#で開発しているので、1月⇒1、2月⇒2という戻り値であると思い込んでおり、はまりました。

## 日の取得
[こちら](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getDate)のgetDateを使って取得できます。
C#ではDateTime.Dayプロパティで取得できるので、[こちら](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay)のgetDayを使って取得すると思い込んでおり、はまりました。ちなみにgetDayは曜日を取得するメソッドです。
javascript / jqueryを使用した九九表

まずは基本のfor文を使った九九の作り方（javascriptのみ使用バージョン）。


```javascript
<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>loop課題九九</title>
    </head>
    <body>
        <script>
        document.write("<table>");
            for (var i = 1; i <= 9; i++){
                document.write("<tr>");
                for (var j = 1; j <= 9; j++){
                    document.write("<td>"+i+"×"+j+"="+(i*j)+"</td>");
                }
                document.write("</tr>");
            }
        document.write("</table>");
        </script>
    </body>
</html>

```
for文を上から見ていくと、まずi=1で初期化される。
            続いてi<=9の条件を満たしているか評価し、for１つ分の時と同じく順番通りに
            本来出力される下にいく。(初めて取り掛かったときはi++まで行ってから下の処理に進むと勘違いしていた)
            今回はそこでまずtrが作成される。そしてさらに下にまだ処理していない第二のforがある為、こちらの処理を行う。
            同じようにj=1で初期化しj<=9の判定を行い、順番通り下の処理へ。この時td/tdを含んだ九九の式を出力。(i=1,j=1)
            続いてjの値が2になり、j<=9の判定を行い再び順番通り出力へ。
            この時i=1,j=2。これを第二のforがfalseになるまで続ける。
            falseになった後（ｊ＝９）、ようやく第一のfor文の加減式にもどり、i=2になる。
            i=2をi<=9に当て嵌め、trueのため本来出力される下へ行く。
            また第二のforがある為、再びそのforがfalseになるまで加減はされない。
            といった流れ。
            




続いてjQueryを用い、隣り合うセルの色が異なる九九表を作成する。

```javascript

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>jQuery九九表</title>
    <!--<link rel="stylesheet" href="plactice_jquery.css">-->
    <style>
        .gray{
            background-color :gray;
        }
    </style>
    <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
    <script>
        /* 課題処理を追加 */
        $(function() {
            for(var j=1; j<=9; j++){
                $('#matrix').append('<tr></tr>');
                for(var i=1; i<=9; i++){
                     $('tr:last-child').append('<td>' + i + '*' + j + '=' + i*j + '</td>');
                }
            }
            $('td:even').addClass('gray');
        });
    </script>
</head>
<body>
    <table id="matrix"  border="1">
        <caption>九九表</caption>

    </table>
</body>
</html>


```

jqueryはcssのように使うことができる。このなかではlastchildが肝。
そして当然ながらtd:evenのところをtd:oddにすれば色が変わるところを変えることができる。
vistaでquartus その28

#概要

vistaでquartusやってみた。
cpu作ってみた。
1から99を表示する。

#アセンブラ


```
  push  1
  set  i
loop:
  get  i
  push  99
  >
pass:
  jz  pass 
  push  32
  out
  get  i
  push  10
  /
  push  48
  +
  out
  get  i
  push  10
  %
  push  48
  +
  out
  get  i
  push  1
  +
  set  i
  jmp loop

```

#ハンドアセンブル


```

		mem[0]  = 16'h1001;//push 1
		mem[1]  = 16'h3019;//set i
		mem[2]  = 16'h2019;//get i
		mem[3]  = 16'h1064;//push 99
		mem[4]  = 16'hf002;//>
		mem[5]  = 16'h5005;//jz 5
		mem[6]  = 16'h1020;//push 32
		mem[7]  = 16'he000;//out
		mem[8]  = 16'h2019;//get i
		mem[9]  = 16'h100a;//push 10
		mem[10] = 16'hf005;///
		mem[11] = 16'h1030;//push 48
		mem[12] = 16'hf000;//+
		mem[13] = 16'he000;//out
		mem[14] = 16'h2019;//get i
		mem[15] = 16'h100a;//push 10
		mem[16] = 16'hf006;//%
		mem[17] = 16'h1030;//push 48
		mem[18] = 16'hf000;//+
		mem[19] = 16'he000;//out
		mem[20] = 16'h2019;//get i
		mem[21] = 16'h1001;//push 1
		mem[22] = 16'hf000;//+
		mem[23] = 16'h3019;//set i
		mem[24] = 16'h4002;//jp 2
		mem[25] = 16'h0000;//i
```

#実行結果

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a9e0cecd-c391-1b59-cb58-2f02569f8ca4.jpeg)


以上。
まだβ版だけど React Router v6 使いたい！という人のための v5 -> v6 移行メモ

React Router v6 は v5 から破壊的な変更が多数含まれている。
まだ正式リリースではないが(20200817時点で6.0.0-beta.0)、気になったので試してみた。その中で修正が必要になった項目、及び項目毎の参考ドキュメントを以下に記載する。

「まだβ版だけど React Router v6 試したい！」という方がいたらぜひ参考にしてほしい。

#留意事項
- 参考ドキュメントはあくまで現時点(=β版)でのものであり、今後正式リリース時にはより適切ドキュメントも併せて提示されるはず。正式リリース後はそちらを参照すること。(その際は出来るだけこの記事もアップデートしたい...)

- 記載するのはあくまで私の環境で必要になった箇所だけなので注意されたし。ただ他の変更に関しても提示する参照ドキュメントを辿ることでおおよそ確認できると思われる。

# v5 -> v6 移行時に(私の環境で)必要だった修正
### Switchの廃止
`<Routes>`を使用する。おそらくこの点が最も影響の大きい変更箇所。

表示するコンポーネントは、`<Routes path="/" element={<SomeComponent>}>`の形で、elementプロパティを用いて指定する。私は一部この修正を忘れた結果、期待するコンポーネントが表示されずに微ハマりした。

参考:
https://reacttraining.com/blog/react-router-v6-pre/#introducing-routes

### nested routing
Routesのelementで指定したコンポーネント内に、更に複数のパスの候補がある(nestする)場合は、pathの指定に "*"を使う。下記"参考"のリンク先にサンプルコードがあるので詳しくはそちらを参照されたし。

参考:
https://reacttraining.com/blog/react-router-v6-pre/#introducing-routes

### Redirectコンポーネントの廃止
`<Navigate to='XXX'>`を使う

廃止理由はイマイチ不明だが、以下(及び関連リプライ)が参考になるかもしれない。(クライアントからトリガーされるリダイレクト処理は不適切ということだろうか?)

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Cool.<br><br>Writing a blog post explaining why client-side redirects are no bueno (thanks to our conversation. will credit).</p>&mdash; Kent C. Dodds 🌌 (@kentcdodds) <a href="https://twitter.com/kentcdodds/status/1249724946948820996?ref_src=twsrc%5Etfw">April 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

参考:
https://github.com/ReactTraining/react-router/blob/f59ee5488bc343cf3c957b7e0cc395ef5eb572d2/docs/advanced-guides/migrating-5-to-6.md#use-navigate-instead-of-history

https://github.com/ReactTraining/react-router/issues/7267

### useHistoryの廃止
`useNavigate`を使う。具体的な使い方は"参考"のリンク先にあるサンプルコード参照。
history.push('XXX')の代替に当たるnavigate('YYY')は、<b>相対パス</b>であることに注意。

参考:
https://github.com/ReactTraining/react-router/blob/f59ee5488bc343cf3c957b7e0cc395ef5eb572d2/docs/advanced-guides/migrating-5-to-6.md#use-navigate-instead-of-history

### history(npmパッケージ)が追加で必要
`yarn add history` で追加  

公式ドキュメントに記載があるわけではないが、私の環境では必要になった(コンパイルエラーが出た)ため記載。

## 参考サイト
https://reacttraining.com/blog/react-router-v6-pre/
公式のv6に関する解説

https://github.com/ReactTraining/react-router/blob/f59ee5488bc343cf3c957b7e0cc395ef5eb572d2/docs/advanced-guides/migrating-5-to-6.md#relative-routes-and-links
公式のv5 -> v6 移行に関する解説
Lake Counting(POJ NO.2386)をPython3で解く

#蟻本の練習問題初級編
競プロの勉強中の者です。
探索問題で有名なLakeCountingをPythonを使って解いたので載せます。
再帰関数で解く方が多いのですが、僕はスタックを使って解きました(再帰がまだできない...)
以下が実装したコードです。
テストケースを2通りしか試していないので、処理できないパターンがあったら申し訳ありません。

```lakecounting.py
n,m=map(int,input().split())
field=[list(input()) for i in range(n)]
visited = [[0 for i in range(m)] for j in range(n)]
move = [[0,1],[1,0],[1,1],[0,-1],[-1,0],[-1,-1],[1,-1],[-1,1]]

cnt=0

for i in range(n):
    for j in range(m):
        if field[i][j] == "W" and visited[i][j]==0:
            sx,sy=i,j
            stack=[[sx,sy]]
            visited[sx][sy]=1
            while stack:
                x,y = stack.pop()
                for k in range(8):
                    nx,ny = x+move[k][0],y+move[k][1]
                    if 0<=nx<n and 0<=ny<m and visited[nx][ny]==0 and field[nx][ny]=="W":
                        stack.append([nx,ny])
                        visited[nx][ny]=1
            cnt += 1
print(cnt)
```

標準入力を受け取る形で書いています。
もし何か間違いがあればご指摘ください。
ECSのタスク定義でボリュームのマウントをする時のパラメータの書き方

## ボリュームプロパティ
事前に`Volumes`プロパティで、マウント先であるインスタンス側のボリュームを、パスを指定して命名しておく。


```yml
  Properties:
    Volumes:
      - Name: host_volume
        Host:
          SourcePath: /var/log
```




## マウントパラメータ
マウント自体は`mountPoints`パラメータで定義される。
`SourceVolume`パラメータには先ほど定義したマウント先のインスタンスのボリューム名を入れる。
この時、`SourceVolume`で指定できるのは、`Volumes`プロパティで定義されたものだけなので注意。
`ContainerPath`パラメータにはマウントするコンテナ内のボリュームのパスをそのまま書けばよい。
`ReadOnly`パラメータはデフォルトで`false`。


```yml
        MountPoints:
          - SourceVolume: host_volume
            ContainerPath: /var/data/buffer
            ReadOnly: true
```


## タスク定義
以下が全体像の例

```yml
TaskDefinition:
  Type: AWS::ECS::TaskDefinition
  Properties:
    Volumes:
      - Name: host_volume
        Host:
          SourcePath: /var/log
    ContainerDefinitions:
      - Name: xxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/sample:latest
        Image: samples/sample-container-agent:latest
        Memory: 128
        MountPoints:
          - SourceVolume: host_volume
            ContainerPath: /var/data/buffer
            ReadOnly: true
        Environment:
          - Name: ENV
            Value: development
        Essential: false
```


## cf.
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html
[Rails]環境構築時のエラー解決法

# エラー内容

```
An error occurred while installing bindex (0.8.1), and Bundler cannot continue.
 Make sure that `gem install bindex -v '0.8.1' --source 'https://rubygems.org/'` 
succeeds before bundling.

In Gemfile:
  web-console was resolved to 3.7.0, which depends on
    bindex
         run  bundle exec spring binstub --all
Could not find gem 'sqlite3' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
```

## 解決方法
簡単に言うと権限の問題で自分に権限がないのが原因。

1.権限を確認(rootになっているのが原因)

```
$ ls -la

total 0
drwxr-xr-x  16 root  staff  512  2  2 23:50 .
drwxr-xr-x   3 root  staff   96 12  8 12:18 ..
drwxr-xr-x   6 root  staff  192 12  8 12:36 bigdecimal-1.3.5
drwxr-xr-x   7 root  staff  224  2  2 23:27 bigdecimal-1.4.3
drwxr-xr-x   5 root  staff  160  2  2 23:50 bindex-0.5.0
drwxr-xr-x   6 root  staff  192  2  2 23:28 date-2.0.0
drwxr-xr-x   6 root  staff  192 12  8 12:36 etc-1.0.1
drwxr-xr-x   6 root  staff  192  2  2 23:28 io-console-0.4.7
drwxr-xr-x   6 root  staff  192 12  8 12:19 nio4r-2.3.1
drwxr-xr-x   6 root  staff  192  2  2 23:33 nokogiri-1.10.1
drwxr-xr-x   6 root  staff  192 12  8 12:19 nokogiri-1.8.5
drwxr-xr-x   6 root  staff  192 12  8 12:37 openssl-2.1.2
drwxr-xr-x   6 root  staff  192 12  8 12:37 psych-3.0.3
drwxr-xr-x   6 root  staff  192  2  2 23:33 psych-3.1.0
drwxr-xr-x   5 root  staff  160 12  8 16:58 stringio-0.0.2
drwxr-xr-x   5 root  staff  160 12  8 12:19 websocket-driver-0.7.0
```

2.権限を自分にうつす

```
$ sudo chown -R username /Users/username/.rbenv

$ sudo chown -R {username}:staff /Users/{username}/.rbenv
```
Argo-workflow の Resource Requests と Resource Limits

# はじめに
Argo wfでStatefulなJobのResourceの運用に試行錯誤した話です。

# Failover
私たちのシステムのFailover（冗長化）として、データベースの再構築をWorkFlowで構築しています。
以前の記事に、もう少し詳細を書いています。そちらを参照ください。
Architectureは、バックアップされたjournalからデータベースを再現する。
Re-factorとして、オンプレミスでは、1つのブロックストレージだったものを、複数のPersistent Diskに分割しています。
その分割したDiskの数ぶん、WorkFlowをparallelで実行しています。
このWorkFlowが安定しない。
Diskには、tableが平準化されるように分散されていますが、必要なResourceは、均一ではない、、

# Resource Requests
`kubectl top node` でnode poolのResourceを取得して、各DiskのRequestsを定義します。
定義は、ConfigMapに、その値を各Parallelに渡す。

```yaml:WorkFlow
  - name: hoge
    metadata:
      annotations:
        kubectl.kubernetes.io/default-logs-container: main
    podSpecPatch: '{"containers":[{"name":"main", "resources":{"requests":{"cpu": "{{inputs.parameters.cpuRequests}}" }}}]}'
    retryStrategy:
      limit: 2
    inputs:
      parameters:
      - name: cpuRequests
```

~~また、Argo wfを運用されたことがある方は、分かると思いますが、2つのContainerで構成されています。
`kubectl logs` を打つと、`-c` でContainerを指定するよう言われます。
従って、Resourceも対象となる `main` に定義します。~~
`annotations` を定義すると、logs でコンテナを指定する必要はありません。

# まとめ
コンテナのリソース管理において、Resource Requests と Resource Limits を設定することが、Best Practiceです。
ただし、その Metrics を集めて、宣言的にdeployするのは、相応のトイルがあります。

皆さんの参考になれば幸いです。
kintone 位置情報を取得する方法

### kintoneで位置情報の取得方法

こんにちは、マイスター・ギルドのフクロウです。

今回は位置情報の取得方法についての記事です。

以下のコードを書くだけで、位置情報の取得が可能になります。

```
navigator.geolocation.getCurrentPosition(function(position) {
   //緯度
   let latPosition = position.coords.latitude;
   //経度
   let lngPosition = position.coords.longitude;
)}
```

上記のコードは下記にあるURLのコードを参考にしています。

ページにあるサンプルコードの262行目あたりをご覧ください。
(タイトルにはモバイル用とかかれていますが、PC版でも使用可能です。)
https://developer.cybozu.io/hc/ja/articles/202179174-Geolocation-API-%E4%BD%8D%E7%BD%AE%E6%83%85%E5%A0%B1-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E7%94%A8%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%82%92%E3%81%97%E3%82%88%E3%81%86

この記事がお役に立ったら、LGBTを押していただけると次の記事の励みになります。

以上、マイスター・ギルドのフクロウでした。
ラズパイのデスクトップから任意のPythonスクリプトを起動

`home/pi/Desktop/aaaa/my_excellent_script.py`
をデスクトップからダブルクリック（+1クリック）で起動できるようにします。

# Pythonコードに記述
```python
# これは最初の行に記述。ハッシュ記号も含めて書くこと。
# シバンって呼ばれる。このファイルはPythonスクリプトだよってLinuxに伝える。
#!/usr/bin/env python3

# デスクトップから起動すると、作業フォルダがデスクトップになってしまう。
# 相対パスで色々指定している場合は必要。
os.chdir('/home/pi/Desktop/aaaa/')
```

# シェルで実行
```sh
# 実行権限を付与。これでダブルクリックした際に「端末で実行」が出てくる
cd Desktop/aaaa/
chmod +x my_excellent_script.py

# リンクの作成。Windowsでいうショートカット。
# 左がリンク元のフルパス。右は何でもOK。
cd Desktop
ln -s my_excellent_script.py script_launcher
```
AWS認定ソリューションアーキテクト – アソシエイト新試験の流れとかコツとか

AWS認定ソリューションアーキテクトの試験が新しくなり、7月に受験して無事合格したので試験までの流れとかコツを書いておこうと思います。

※2020年7月時点の情報です。

#AWS認定とは
まずAWS認定とはなんぞ？という方のために簡単な説明を。
AWSというのはAmazonが提供しているクラウドコンピューティングサービス Amazon Web Service の略語です。
このAWSを冠する認定ですが、[公式](https://aws.amazon.com/jp/certification/)から引用すると
>AWS 認定は、クラウドの専門知識を検証し、専門家が需要の高いスキルを強調し、組織が AWS を使用してクラウドイニシアチブにおける効果的で革新的なチームを構築するのに役立ちます。
>個人やチームが独自の目標を達成できるように、役割と専門分野ごとに設計したさまざまな認定試験から選択します。

ということだそうです。
ようはAWSの数あるサービスを使いこなせることをAmazon自らが証明してくれる認定制度ですね。
AWS認定はいくつか種類があり、その中でも今回はソリューションアーキテクト – アソシエイトという試験区分を受験しました。

#スペック
・IT業界に来て1年未満、前職は全然関係ない事務仕事
・試験を受けたのは今の会社に入って10ヶ月目
・AWSは仕事でEC2やS3、RDSを少し触ったぐらい

#勉強期間
勉強期間は大体1ヶ月ぐらいです。
教材は以下の通り。
・『最短突破 AWS認定ソリューションアーキテクト アソシエイト 合格教本』
・AWS WEB問題集で学習しよう！　というサイト
・公式のリファレンス

最初の1週間は参考書を読み込み、それ以降は問題を解いていました。
あとはちょくちょく公式のリファレンスを読んだぐらいです。

参考書は旧試験バージョンを購入。このバージョンでも新試験に合格したという記述を読んで、まあ大丈夫だろうとたかを括っていました。

また、他の方の合格記が探せばいくらでも出てくるのですが、2週間だとか5日だとかで合格したという記事がちらほら。
なので1週間で参考書を読んで1週間で復習＆公式リファレンスで行けるだろうと考え、最初に試験を申し込んだ時は試験日を2週間後に設定していました。**この時は。**

1週間ぐらいで参考書を読み終わり、後ろについていた模擬試験をやってみた結果が正答率3割。
AWS認定は大体7割ぐらいで合格なので全く届かない。
そもそも参考書自体が旧試験のものなので、新試験の出題範囲もカバーできずに3割はまずい。

なので試験日を2週間伸ばしました。AWS認定は試験日を2回まで自由に変更できます。こういうところはとてもありがたいです。
そして問題集を探したところ、上に挙げたサイトにたどり着きました。
そこから1週間で60問ぐらい問題を解いた後に改めて参考書の模擬試験を受けたところ正答率は未だ5割。

伸ばした2週間で問題集を回してギリギリ7割に届くかな？という感じでした。

#試験当日の流れ
テストセンターの受付し、顔写真の撮影や荷物をロッカーに預け終えると本人確認書類とロッカーの鍵、A4のホワイトボードを渡されて会場へ。
会場といっても複数のPCデスクが間仕切りになっている普通の部屋で、他にも受験されている方は何人かいました。

試験はPCで行います。時間は最初の説明で5分、テストに130分、アンケートに5分となっており、テストとアンケートの回答時間は別に設定されているので130分丸々テストに使って大丈夫でした。

解答方式は問題と選択肢が1つの画面に映し出されて、択一ならラジオボタン、複数回答ならチェックボックスで解答する感じです。
それぞれの問題にはメモと後からチェックするためのフラグを付けることができ、最後まで解答したあとは解答一覧に飛んで各問題に飛ぶことができます。

修正がなければ確認終了ボタンを押してテスト終了です。
5問ぐらい簡単なアンケートに解答した後で結果が表示されます。

#試験内容
シナリオ形式の問題が多いです。
前提がAで、Bという課題を解決したくて、Cという条件満たすようなソリューションはどれか。みたいな感じです。
特にS3やEBSなど複数のタイプを持つサービスのうち、どのタイプが適切か聞かれることが多かったかと。

問題文が長いので何を聞かれているか整理することが大切です。ホワイトボードに簡単に図を描くといいと思います。
問題は同じようなものもいくつか出題され、問題文に別の問題のヒントになるようなものがあったりするので、ホワイトボードにメモしておくと役に立ちます。

あと真の敵は睡魔。試験時間が長いので、眠くならないように自分は午前中に受験しました。

#コツとか
**一番は実際にAWSを触りながら勉強することだと思います。**
自分も仕事で触った経験が活きた部分が結構ありました。
ただ闇雲に触るのではなく、例えば自分で問題のような設定を作って、その設定通りにサービスを組んでみる方が覚えやすいです。

試験では知らない単語が出てきても焦らずに問題文と選択肢を見て流れを把握しましょう。
ただ全く分からない単語が出てこないように、AWSのサービス一覧ぐらいは眺めておいた方がいいです。

**試験日が変更できることをうまく活用しましょう。**
期間が短くて間に合わないこともそうですが、長すぎてモチベーションを保てないこともあるので、何度か試験形式で問題を解いてみて試験日を決めるといいかと思います。~~正直2週間とか5日は無理でした~~

AWS認定はこれからどんどん注目される資格だと思うので、ぜひ挑戦してみてください。
nginx 再起動 (CentsOS7)

CentOS7上でサービス登録されたnginxを再起動する。

# Redhat系OSのバージョン確認

```console

$ cat /etc/redhat-release

CentOS Linux release 7.5.1804 (Core)
```

# サービス操作

### 起動中のサービス一覧

```console

$ sudo systemctl list-units --type=service

 UNIT                               LOAD   ACTIVE SUB     DESCRIPTION
  abrt-ccpp.service                  loaded active exited  Install ABRT coredump hook
(省略)
  docker.service                     loaded active running Docker Application Container Engine
  nginx.service                      loaded active running The nginx HTTP and reverse proxy server
(省略)

```

#### サービス一覧の表示終了場合

「:」→「q」

### nginxのサービスの状態を確認

```console
$ sudo systemctl status nginx

* nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-08-17 13:54:51 JST; 20h ago
  Process: 14867 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 14865 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 14863 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 14868 (nginx)
    Tasks: 3
   Memory: 7.6M
   CGroup: /system.slice/nginx.service
           |-14868 nginx: master process /usr/sbin/nginx
           |-14869 nginx: worker process
           `-14870 nginx: worker process
(省略)
```

### nginxのサービスを停止

```console
$ sudo systemctl stop nginx
```

### nginxのサービスを起動

```console
$ sudo systemctl start nginx
```

### nginxのサービスを再起動

```console
$ sudo systemctl restart nginx
```
vistaでquartus その27

#概要

vistaでquartusやってみた。
cpu作ってみた。
aからzを表示する。

#アセンブラ


```
  push  0
  set  i
loop:
  get  i
  push  25
  >
pass:
  jz  pass 
  get  i
  push  97
  +
  out
  get  i
  push  1
  +
  set  i
  jmp loop

```

#ハンドアセンブル


```
		mem[0]  = 16'h1000;//push 0
		mem[1]  = 16'h300f;//set i
		mem[2]  = 16'h200f;//get i
		mem[3]  = 16'h101a;//push 26
		mem[4]  = 16'hf002;//>
		mem[5]  = 16'h5005;//jz 5
		mem[6]  = 16'h200f;//get i
		mem[7]  = 16'h1061;//push 97
		mem[8]  = 16'hf000;//+
		mem[9]  = 16'he000;//out
		mem[10] = 16'h200f;//get i
		mem[11] = 16'h1001;//push 1
		mem[12] = 16'hf000;//+
		mem[13] = 16'h300f;//set i
		mem[14] = 16'h4002;//jp  2
		mem[15] = 16'h0000;//i
```

#実行結果

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b54b1837-0bc3-fb49-39a8-b4239a963cd8.jpeg)


以上。
Hull Voronoi 3Dで何度もSingular input data errorが出る原因

### Hull Voronoi 3Dについて
3DのVoronoi図を計算するプログラムで、原作はC#で記述されています。私が作ったProcessing(Java)バージョンもあります。Convex HullのfindInitialPoints内で頻繁にSingular input data errorが出るので原因を調べてみました。
https://github.com/Scrawk/Hull-Delaunay-Voronoi
https://github.com/Nekodigi/Hull-Voronoi-3D
### 原因
そもそも、Singular input data errorは入力した点が、一致しているときに発生します。findInitialPointsには、各軸の座標が最小値、最大値の点に絞り込んで渡すのですが、複数の軸の最小値、最大値を兼ねている場合、稀に点が不足し、同じ点が選ばれてしまうという事態が起こります。
### 解決法
点が少ない場合は、Singular input data errorが起こりやすいですが、その分処理も軽いので、findInitialPointsに全ての点を渡すことで解決しています。
Django-taggit

```
# タグ名称で取得
>>> blog_1.tags.names()
<QuerySet ['Python', 'Django']>

# slugで取得
>>> blog_1.tags.slugs()
<QuerySet ['Python', 'Django']>

# オブジェクトで取得
>>> blog_1.tags.all()
<QuerySet [<Tag: Python>, <Tag: Django>]>

#追加
>>> blog_1.tags.add('programming')
<QuerySet ['Python', 'Django', 'programming']>

#削除
>>> blog_1.tags.remove('programming')
<QuerySet ['Python', 'Django']>

#全部削除
>>> blog_1.tags.clear()
<QuerySet []>

# タグでfilter
>>> Blog.objects.filter(tags__name__in=["Python", "Django"])
<QuerySet [<Blog: １つ目の記事>, <Blog: １つ目の記事>]>

# タグでfilter(重複なし)
>>> Blog.objects.filter(tags__name__in=["Python", "Django"]).distinct()
<QuerySet [<Blog: １つ目の記事>]>

# 関連記事(共通のタグが多い順でオブジェクトを取得)
>>> blog_1.tags.similar_objects()
[<Blog: 3つ目の記事>, <Blog: 2つ目の記事>]

# タグモデル取得
>>> Tag.objects.all()
<QuerySet [<Tag: Python>, <Tag: Django>, <Tag: programming>]>

# 「Pythonタグ」と紐づいたBlog一覧
>>> tag = Tag.objects.get(name="Python")
>>> Blog.objects.filter(tags=tag)
<QuerySet [<Blog: １つ目の記事>, <Blog: 2つ目の記事>, <Blog: 3つ目の記事>]>

紐ずいたblgoの多い順
>>> Tag.objects.all().annotate(c=Count('taggit_taggeditem_items')).order_by('-c')
<QuerySet [<Tag: programming>, <Tag: Python>, <Tag: Django>]>
```
[ServiceNow] [ATF] カタログタスクの変数に値を設定する

# 概要
自動テストフレームワークでカタログの変数を更新するテストケースを作成する。
タスクをフォームで開いた後、値を設定しようとすると変数が見つからない。

## プラットフォーム
NewYork

## 躓きポイント
タスクを開くところまでは省略。
![スクリーンショット 2020-08-17 21.42.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/2d81f1d1-ce65-8d7b-de29-f778f01f8e26.png)

Set Field Valuesで値を設定しようとすると、
![スクリーンショット 2020-08-17 21.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/2495328e-d28c-04cf-4808-04a49e778188.png)

変数（Variables）が見つからない。
![スクリーンショット 2020-08-17 21.43.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/0837b091-f049-217d-d29e-b12d0d184de7.png)

# やり方
Service CatalogのSet Variable Valuesを使用する。
![スクリーンショット 2020-08-17 21.49.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/68b46e36-266f-94f5-76be-3176ded54aae.png)

値を設定して、
![スクリーンショット 2020-08-17 21.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/4822b89f-5d23-9d6c-e639-9d716078144c.png)

更新をUI Action
![スクリーンショット 2020-08-17 21.53.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676866/f430bb1e-369c-244f-936b-3f6907963457.png)
ランダムな文字列を発生させるサイトをつくる

https://randstr.netlify.app

```index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ランダムな文字列発生させるサイト</title>
    <link
      rel="stylesheet"
      href="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha1/css/bootstrap.min.css"
      integrity="sha384-r4NyP46KrjDleawBgD5tp8Y7UzmLA05oM1iAEQ17CSuDqnUK2+k9luXQOfXJCJ4I"
      crossorigin="anonymous"
    />

    <style>
      body {
        margin: 0;
        background: #f7f7f7;
      }
      #wrap {
        overflow: hidden;
      }
      main {
        max-width: 750px;
        margin: 0 auto;
      }
    </style>
  </head>
  <body>
    <div id="wrap">
      <br />
      <main>
        <div class="input-group">
          <input type="number" id="num" class="form-control" value="8" />
          <div class="input-group-append">
            <button id="sumbit" class="btn btn-primary" type="button">
              作成
            </button>
          </div>
        </div>

        <br />
        <div class="input-group">
          <input id="text" class="form-control" readonly="" />
          <div class="input-group-append">
            <button id="copy" class="btn btn-success" type="button">
              コピー
            </button>
          </div>
        </div>
      </main>
    </div>
    <script
      src="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha1/js/bootstrap.min.js"
      integrity="sha384-oesi62hOLfzrys4LxRF63OJCXdXDipiYWBnvTl9Y9/TRlw5xlKIEHpNyvvDShgf/"
      crossorigin="anonymous"
    ></script>

    <script>
      document.getElementById('sumbit').onclick = () => {
        const _s = 'abcdefghijklmnopqrstuvwxyz0123456789';
        const _ret = [...Array(Number(document.getElementById('num').value))]
          .map(() => _s[Math.floor(Math.random() * _s.length)])
          .join('');
        document.getElementById('text').value = _ret;
      };

      document.getElementById('copy').onclick = () => {
        document.getElementById('text').select();
        document.execCommand('copy');
      };
    </script>
  </body>
</html>
```
【PHP】アクセス権の意味とその使い分け

#アクセス権とは？
変数やメソッドにどのクラスから接続できるかを示した定義。

**public / private / protected**
上記3つのアクセス修飾子を変数やメソッドのはじめにつけることで定義する。

#3つのアクセス修飾子の意味
**public**   :どこからでもアクセス可能
**protected**:そのクラス内とそのクラスを継承したクラス、また親クラスからアクセス可能
**private**  :そのクラス内でしかアクセスできない

#この3つをどのように使い分けていくのか？

**public**   :そのクラス外からも呼ばれるもの(メインメソッド・getメソッドなど)
**protected**:継承先でも使うもの
**private**  :上記以外はprivateでつくる

基本的にはprivateとpublicで作って、
継承が必要となった時にprotectedを使用していくのが
カプセル化を促進する上で有効なのではないか、と思っています。


例：
税率って他から書き換えられたくはない
でも取得する処理は必要

```php
Class Tax {
	private $tax = 1.1;

	public function getTax()
	{
		return $this->tax;
	}
}
```
例：
性別は男性クラスのすべてにおいて必要
継承先でも使えるようにする

```php
Class Man 
{
	protected $sex = 'male';

	public function getSex()
	{
		return $this->sex;
	}
}
```

使い分けなど、１年間プログラミングをしてきた上での私見なので、
ご意見があれば頂戴したいです！
ラジカセの修理

80年代の高校生時代に使っていた昭和なラジカセのナショナルのRX-C50を修理してみました。ネットで検索して見るとカラーバリエーションもあったようで、結構売れた機種だったのかもしれません。一回り小さいC45や、一回り大きいC60という製品もあったようです。

故障箇所はSELECTORのスイッチが折れてしまっているのと、カセットのヘッドが上がったままで、ハブが回りっぱなしでイジェクトが効かない状態でした。

ネットで修理の情報がないか調べて見たのですが、めぼしいものは見つかりませんでした。

この機種は裏に長いビス5本と短いビスで裏蓋が留めてあります。これを外すと裏蓋がとれます。電池ボックスとの接続はワイヤーや半田付けではなく分解する事を考えた設計になっています。昔の製品は修理する事を考えて分解ができるようにしてありましたが、最近は使い捨てで修理などしないため接着してあったりして分解できないものが多いです。昔はメーカーの修理拠点も全国津々浦々にありましたが、今はほとんどなくなってしまいました。

長いビスは前面のパネルまで届いていて、前面のパネルも外せるようになります。

前面パネルのはずし方はまずカセットの部分を上にずらすと外れます。次にボリュームとトーンコントロールのスライダーを外して、前面パネルの上下中心に弱いはめ込みがあるので、それを外すと全部外れます。

前面のパネルを外すとレベルメーターの基板が出てくるので2つのビスで外せます。またチューナーのホイールはバリコンにネジ止めされているのでそれを外して、黒い枠をとめているネジを外すと外れます。

裏の基板に接続されているケーブルコネクタを全部外します。

これでカセットのメカが外せます。

![IMG_20200818_082550.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/09caf659-df46-96ec-9274-eafe97d4e408.jpeg)

これは表面のパネルを外した状態で、右側のホイールとカウンターがゴムベルトでつながっています。

![IMG_20200818_084620.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/5033fa7a-8969-6997-513a-24d0311ca932.jpeg)

カセットのヘッドが上がりっぱなしなのは、ゴムベルトが外れていたためでした。

初期のカセットはヘッドの上下が、ボタンの力をそのまま伝えていたのですが、この頃になるとメカでヘッドの上下をコントロールするようになりました。

裏の下の基板はかなり固いですが基板が引き抜けます。

![IMG_20200818_071048.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/610dea6a-8b9b-2ab8-2b1d-a8eb2b219dd2.jpeg)

前面のマイクのケーブルが引っ掛けてるのを外します。後は縦に入っている基板がネジ止め2箇所で外せます。

![IMG_20200818_065401.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/95351004-6636-7c36-b66b-5986d5b604ad.jpeg)

右側の真ん中に水平にある部品はスイッチのようで、本体にレバーがついていて、それを受けています。元に戻すときにちょっと面倒です。

バーアンテナもバリコンも結構よさそうな部品が使われています。

とりあえずSELECTORのスイッチのプラ部品を外して組み立てなおしました。何か変わりになりそうなレバーを探して見たいと思います。

![IMG_20200818_095316.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/91e32c8f-a276-b1f7-9d29-a34801c6fb71.jpeg)

ラジオには以下のICが使われています。

|メーカー|型番|概要|
|:--|:--|:--|
|Panasonic|AN7213|FM Front-end Circuit for Radio|
|Panasonic|AN7220|AM Tuner, FM-AM IF Amplifier Circuit|

70年代のラジオはトランジスターで作られていましたが、80年代にはいるとICが使われるようになりました。ICといっても昨今のDSPラジオとは違い、アナログ回路がそのまま入ったものでした。

レベルメータはステレオのように見えますがモノです。また2ウエイのように見えますが、上部の開口部はバスレフのダクトで、フルレンジ1本のようです。音はいいので大目に見てください。平和な時代でしたね。

結構大きな音にしてもちゃんと鳴ります。高域もはっきりしてバランスも良いです。

久しぶりに使ってみると、スライダーの左右別のボリュームは不便です。当時スタジオのミキサーみたいでスライダーがかっこよく見えたのかもしれませんね。

ラジオの周波数もちょっと見にくいです。デザイン重視だったのかもしれないです。

ライン入力でたまに右側がちゃんと出ない事があります。どうもSELECTORの接触が悪いみたいで、何度かがちゃがちゃすると直ります。そのうち接点復活剤を入手してかけて見たいと思います。

この機種はライン入力をスピーカーで聞く事ができて、iPhone3G(Wolfson)をつないで聞いています。結構良い音でなっています。将来こんな使い方をしてるとは高校生の自分は考えてもいなかったでしょう。

iPhone3Gには自作のトーンジェネレータアプリが入れてあり、チェックに使ってみました。

![5288721711_0d4034f79c_o.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/38abc2e9-e8ea-2896-961d-4d7ff5573c58.png)

位相差180でsin波を入れるとレベルメーターが消えます。

昔録音したカセットを聞いてみたところ回転速度が遅いようです。もうカセットを聞く事はないとおもうので、そのままにしておきます。
リモートワーク中の雑談ネタをランダムに作って通知する

# 背景と課題

以前から、自分たちのチームでは、仕事以外のコミュニケーションを確保するために、「毎日朝会を実施して、その中で10分間程度の雑談をする」という決まりごとがありました。

しかし、コロナウイルスでリモートワーク中心に移行してからは、「WEB上のミーティングツール(zoom)では会話がかぶるとひどく話しづらく、なかなか会話に入れないメンバーが出てきてしまう」という問題が発生するようになり、「ブレイクアウトルームの機能を使って、3~4人の部屋にランダムに分ける」ようにやり方を工夫しています。

ただ、より少人数になると、会話の頻度が増え、話の内容に困る場面も増えてしまいました。


# 実装したもの

この問題に対処するため、次のような通知をGoogle Apps Scriptで実装してみました。

* 朝会の時間にチャット（ChatWork）に通知する
* 「困ったらこれを話しておけ」というテーマをランダムに生成してメッセージに含める

具体的には次のようなメッセージが通知されます。

```
🌅朝会の時間です🌅
司会: 1番目の人
お題: ネットで話題の学びの話
https://zoom.us/j/{zoomのURL}
```

# プログラム

実際のプログラムも掲載しておきます。工夫した点は以下の3つです。

* 「形容詞+お題」の組み合わせで飽きないようにした
  * 形容詞の部分は、煽り気味のビジネス書っぽいタイトル（失礼）とかを参考にしている（失礼）
* カレンダーから予定を取ってきて、祝日を判定している
* 水曜日は時差出勤で出社する人が多いため、時間をずらしている


```javascript
const TOKEN = '{YOUR ACCESS TOKEN}';
const ODAIS = [
  "仕事",
  "学び",
  "健康",
  "趣味",
  "テクノロジー",
];
const ROOM_ID = '{YOUR ROOM_ID}';
const KEIYOUSHIS = [
  '楽しい',
  'かわいい',
  'びっくりする',
  '最近感動した',
  'みんなに教えたくない',
  '最近気になってる',
  '海外の',
  '地元の',
  '毎日やってる',
  '人には教えたくない',
  '親世代に薦めたい',
  'リモートワーク中の',
  'リモートワークで困ってる',
  'ついついやっちゃう',
  '老後にやりたい',
  '子供の頃の',
  '変わった友達の',
  '尊敬してる人の',
  '実はやめたほうがいいと思ってる',
  'これから変えなきゃいけないと思ってる',
  '毎朝、起きてすぐにやる',
  'ずっと悩んでる',
  'これから伸びる',
  '10年後の',
  '若いうちにやったほうがいい',
  '毎日続けられる',
  'いままで一番やらかした',
  '最近知った',
  'LIFULLで見たすごい',
  '最近買った',
  '世界一シンプルな',
  '最速で結果を出すための',
  'ネットで話題の',
  'ずっとやりたいと思ってる',
  '今までの人生で一番がんばった',
  '他のメンバーのイケてる',
  '機械学習と絡めた',
  '大学時代にやってた',
  '先週末の',
  'そういえば最近やってない',
  '自分たちが成長するための',
  '充実した毎日に必要な',
  '一度質問してみたかった',
  'これからどうなるか不安な',
  '偉い人に聞きたい',
  'LIFULLやチームに取り入れたい',
  '生産性を上げるための',
  '10年前の自分に教えたい',
  '一番好きな',
];

function setTrigger(){
  if (!isWeekDay()) return;
  triggerStep("myFunction", 10, 0);
}

function triggerStep(funcname, hour, minutes) {
  const setTime = new Date();
  setTime.setHours(hour);
  setTime.setMinutes(minutes);
  ScriptApp.newTrigger(funcname).timeBased().at(setTime).create();
  
}

function myFunction() {
  postNotification(createMessage());
  if (new Date().getDay() == 3) {
    triggerStep("postMainNotification", 11, 0);
  }
}

function postNotification(message) {
  const client = ChatWorkClient.factory({token: TOKEN});
  client.sendMessage({
    room_id: ROOM_ID,
    body: message
  });
}

function postMainNotification() {
  postNotification(createMainMessage());
}

function createMessage() {
  if(isHoliday()) {
    return "今日は祝日です";
  } else if (new Date().getDay() == 3) {
    return "朝会は11時からです";
  } else {
    return createMainMessage();
  }
}

/**
 * 平日であるかどうかを判定する
 */
function isWeekDay() {
　const day = new Date().getDay();
  return !(day === 0 || day === 6);
}

function isHoliday() { 
  const today = new Date();
  const calendars = CalendarApp.getCalendarsByName('日本の祝日');
  const count = calendars[0].getEventsForDay(today).length;
  return count === 1;
}

function createMainMessage() {
  const i = randomChoice([1, 2, 3]);
  const k = randomChoice(KEIYOUSHIS);
  const x = randomChoice(ODAIS);
  return `[info][title]🌅朝会の時間です🌅[\/title]司会: ${i}番目の人\nお題: ${k}${x}の話\nhttps://us02web.zoom.us/j/{zoomのURL}[\/info]`;
}

function randomChoice(array) {
  return array[Math.floor(Math.random() * array.length)];
}
```
【ふくだ学習録】インフラエンジニア教本-ネットワーク構築技術解説- part11【61日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 今読んでいる本
[インフラエンジニア教本 ~ネットワーク構築技術解説](https://www.amazon.co.jp/dp/4774170348)

# 第3章 スイッチングハブの教科書

### チーミング
サーバ等に搭載した物理NIC(ネットワークアダプタ)を1つの仮想的なNICとして束ねる技術。
[teaming](https://www.infraexpert.com/study/etherchannel1.html)

### IEEE 802.1X
ネットワークに接続するコンピュータなどの端末を認証する方法を定めた標準規格の一つ。
[IEEE 802.1X](http://e-words.jp/w/IEEE_802.1X.html)

### データプレーンとは
OpenFlowネットワークにおいて、パケットを転送する役割を担う。 コントロールプレーンによるネットワークの制御に従って、条件にマッチしたパケットに対して指定された動作を行う。
[OpenFlowにおけるデータ転送の仕組み](https://www.itbook.info/network/sdn07.html)

### バックプレーンとは

[電子機器の高度化を実現するバックプレーンとは？](https://contents.zaikostore.com/semiconductor/3912/)

### クロスバースイッチとは
[その36「スイッチとその進化」](https://bb.watch.impress.co.jp/cda/bbword/9483.html)

# 今日の一言
おもろい！けど、ネットワーク周りむずない？

# 読了した本

#### 技術系
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)
[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)
[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/ref=cm_sw_r_tw_dp_U_x_XlokEbJQK2N7P )
[Docker入門](https://www.amazon.co.jp/dp/480071091X/ref=cm_sw_r_tw_dp_U_x_xVlmEbN8ZTHZK)
[PHPフレームワーク Laravel入門](https://www.amazon.co.jp/dp/4798052582/ref=cm_sw_r_tw_dp_U_x_zzeyEbJBSQ5Y0 )
[サーバ/インフラを支える技術](https://www.amazon.co.jp/dp/4774135666)


#### ビジネス系
[サブスクリプション](https://www.amazon.co.jp/dp/B07HY1TND9/ref=cm_sw_r_tw_dp_U_x_lp4NEb3EEGD7Y)
[Running Lean ―実践リーンスタートアップ](https://www.amazon.co.jp/dp/4873115914/ref=cm_sw_r_tw_dp_U_x_UsMREbV6Y41Y8)
[amazon 世界最先端の戦略がわかる](https://www.amazon.co.jp/dp/4478105057)
[Lean Analytics ―スタートアップのためのデータ解析と活用法](https://www.amazon.co.jp/dp/4873117119)
[ピーター・ティール 世界を手にした「反逆の起業家」の野望](https://www.amazon.co.jp/dp/4864106010)
[Airbnb Story 大胆なアイデアを生み、困難を乗り越え、超人気サービスをつくる方法](https://www.amazon.co.jp/dp/4822255190)
[ユダヤの商法](https://www.amazon.co.jp/dp/4584139008)
[How Google Works](https://www.amazon.co.jp/dp/4532198348)
[イシューからはじめよ](https://www.amazon.co.jp/dp/4862760856)
[ピクサー流　創造するちから](https://www.amazon.co.jp/dp/4478016380)
[ストーリーでわかる財務３表超入門](https://www.amazon.co.jp/dp/4478015619)
[JavaScript] よくあるswitch文を書き換える

switch文を回避したいなーって時に使えるかもしれない集にしたかったのですが、
よくよく考えてみると、この2パターンくらいしかない気持ちになりました。
これらを応用すれば、大体のswitch文は書き換えられるじゃないかという気がしてます。
因みに、私はswitch文嫌いじゃないです。

## ある条件に該当するかどうかを判定する
### switch文の場合
```js
function isKanto(prefecture) {
  switch (prefecture) {
    case '茨城県':
    case '栃木県':
    case '群馬県':
    case '埼玉県':
    case '千葉県':
    case '東京都':
    case '神奈川県':
      return true;
    }
  return false;
  }
}

isKanto('群馬県') // => true
isKanto('北海道') // => false
```

### 回避した場合

```js
const KANTO = ['茨城県', '栃木県', '群馬県', '埼玉県', '千葉県', '東京都', '神奈川県']

function isKanto(prefecture) {
  return KANTO.includes(prefecture)
}

isKanto('群馬県') // => true
isKanto('北海道') // => false
```

## ある条件から別の値を返す

### switch文の場合

```js
function getKenchoushozaichi(prefecture) {
  switch (prefecture) {
    case '北海道':
      return '札幌市';
    case '青森県':
      return '青森市';
    case '岩手県':
      return '盛岡市';
    // ...
    case '沖縄県':
      return '那覇市';
    default:
      return null;
  }
}
getKenchoushozaichi('青森県') // => "青森市"
getKenchoushozaichi('グンマー') // => null
```

### 回避した場合

```js
const KENCHOUSHOZAICHI = {
  北海道: '札幌市',
  青森県: '青森市',
  岩手県: '盛岡市',
  // ...
  沖縄県: '那覇市'
};

function getKenchoushozaichi(prefecture) {
  return KENCHOUSHOZAICHI[prefecture] ?? null;
}

getKenchoushozaichi('青森県') // => "青森市"
getKenchoushozaichi('グンマー') // => null
```
Oracle Cloudのオブジェクトストレージに作られたバケットのファイルを一掃する

# はじめに
本記事はociコマンドラインを用いてOracle Cloudのオブジェクトストレージに作られたバケットのファイルを一掃する方法について記載しています。

例えば、オブジェクトストレージのバケットに大量のファイルをアップロードしていて、不要になった際にコンソール画面から都度選択して削除するのは現実的ではありません。また、Oracle Cloudの仕様でオブジェクトストレージのバケットにファイルが存在する場合、バケット毎削除することもできません。

![スクリーンショット 2020-08-14 21.22.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/d40f55b3-ea7b-8ba7-3bb5-75b854a4af06.png)

ociコマンドラインを用いることで大量にアップロードしたファイルを一括で削除することができます。

## オブジェクトストレージのバケットのファイル一括削除
ociコマンドラインを実行する場合、APIアクセス用のユーザーの作成や、権限設定等が必要になりますが本記事では割愛します。

オブジェクトストレージのバケットのファイル削除は以下のコマンドを実行します。
`--dry-run`をつけることで実際に削除する前にテストができます。

`$ oci os object bulk-delete -ns ＜クラウドアカウント＞ -bn ＜バケットの名前＞ --dry-run`

データ量が多い場合、レスポンスに時間がかかりますが成功すると、以下の様な出力が行われます。

```console
{
  "delete-failures": {},
  "deleted-objects": [
    "＜ファイル名＞",
    "＜ファイル名＞",
    "＜ファイル名＞",
　　・・・
  ]
}

```

`--dry-run`で確認して問題ない場合は、`--dry-run`を外して実行します。

`$ oci os object bulk-delete -ns ＜クラウドアカウント＞ -bn ＜バケットの名前＞`

警告が表示されるので`y`を入力します。

```console
WARNING: This command will delete at least 1000 objects. Are you sure you wish to continue? [y/N]: y
```

ファイルの削除が行われます。`--dry-run`実行時より時間がかかるため、後はコマンドの実行結果を待ちます。

```console
Deleted ＜ファイル名＞  [####################################]  100%
Deleted ＜ファイル名＞  [####################################]  100%
Deleted ＜ファイル名＞  [####################################]  100%
・・・
{
  "delete-failures": {},
  "deleted-objects": [
    "＜ファイル名＞",
  ]
}
```

# おわりに
以上、Oracle Cloudのオブジェクトストレージに作られたバケットのファイルを一掃する方法でした。
ociコマンドラインを用いることで効率よく作業できます。
Rustのegg-modeで認証されたユーザの情報を取ってくる方法

#　はじめに

rustでtwitterのapiをさわるときにegg-modeを使いました。
pythonでtweepy使ってたので、その気分でやってて、大抵のことはできたのですが、
「認証されたユーザの情報を取ってくる方法」がわかりませんでした。

tweepyだとapiにme()で取れるので、egg-modeでも同じような機能あるだろうと思ってドキュメント漁ったのですがありませんでした。

tweepyのme()のコード見て、authでなにかしてるな感があったので、egg-modeでやってみたら、動いたので、コードをのせておきます。

```toml:Cargo.toml
[dependencies]
dotenv = "0.11"
egg-mode = "0.15"
tokio = { version = "0.2", features = ["full"] }
```
```rust
use dotenv::dotenv;
use std::env;
use egg_mode;
use tokio::prelude::*;

#[tokio::main]
async fn main() {
    dotenv().ok();

    let c_key = env::var("CONSUMER_KEY").expect("Please set consumer-key in .env");
    let c_secret = env::var("CONSUMER_SECRET").expect("Please set consumer-secret in .env");
    let a_key = env::var("ACCESS_KEY").expect("Please set access-key in .env");
    let a_secret = env::var("ACCESS_SECRET").expect("Please set access-secret in .env");
    let consumer_token = egg_mode::KeyPair::new(c_key, c_secret);
    let access_token = egg_mode::KeyPair::new(a_key, a_secret);
    let token = egg_mode::Token::Access {
        consumer: consumer_token,
        access: access_token,
    };

    let user = egg_mode::auth::verify_tokens(&token).await.unwrap();

    println!("{}", user.screen_name);
}
```
.envファイルは各自用意してください。

# おわりに

歴史のあるライブラリだとググれば大抵のことは分かるのですが、新しいライブラリだと情報が少ないのがつらいですね。
データベース設計とは？

####データベース設計とは？

サービスやシステムに必要な情報をどのようにデータベースで管理するか決める作業のことです。

####なぜデータベース設計が必要なのか？

・データ同士の関係性を明確にする事ができ効率の良いデータ操作を可能にする
・サービスが複雑になった場合でも簡易的にデータの操作が可能になる

####データベース設計はいつ行うのか？
データベースはサービスやシステム開発の最初の段階で行います。
プログラムを書き始める前にデータベース設計を行います。

###データベース設計を構成する3つの要素
####1.エンティティ
サービスの中で管理する必要のある情報のこと。
例）　TWITTERなどの場合
ユーザー情報や投稿内容を保存する必要があります。
これらの管理する情報のことをエンティティといいます。


####2.エンティティの属性
属性とは、エンティティが個別にもつ情報です。
例）　ユーザーというエンティティが持っている属性
・名前　・パスワード　・emailアドレス

####3.リレーション
リレーションとは、エンティティとエンティティに存在する関係性のこと。
例）　Twitterの場合
ユーザーにはたくさんの投稿を持っています
ツイート1つには投稿したユーザーがいます

このようにユーザーテーブルとツイートテーブルの関係性があります。


###テーブルの行と列の役割
テーブルは表の形式で構成されています。
・レコード　テーブルの行のこと。エンティティの具体的なデータを表す
・カラム　　テーブルの列のこと。エンティティの属性を表す