OmniAICreator/Qiita-1.07M huggingface dataset:
初めてのAlibaba Cloudでインスタンス作成

<h1>Alibaba Cloud</h1>
今年に入り、AWSのLightsailを使ってみて、WordPressの構築に便利ということを感じて、
Cloud9も使ってみたのち、Alibaba Cloudを使ってみることにしました。
理由は、Aliyun(Alibaba Cloud)の方が安くて、先日のウェビナーでクーポン$500分が付与されたこと、中国人の友達がいて教えてもらいやすいという理由で試したいと思いました。
でも中国版と日本版は違うとのことで、日本版のチュートリアルを参照にしてインスタンスを作りました。

<h3>使ってみた感想</h3>
Lightsailより遥かにややこしかったです。
２段階認証にすると、コードが届かなくなり、ログインに苦戦したものの、サポートチームの回答は割と早いし、いいと思いました。
でも英語なので、やっぱり不便さは感じました。

<h3>実際にインスタンスを作ってみる</h3>
何はともあれ、ECSでインスタンス作成

1の基本設定では、試験的に使うものなので、従量課金を選択しました。
リージョンを日本にして、インスタンスタイプは、CentOSを選択して次へ
![making-instance01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65048/f233df1f-bb81-c094-129e-3925a54e2cab.png)

2のネトワークでVPCとVSwitchの作成が必須
![making-instance02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65048/3aa81d8c-9fea-5960-dff9-66a31636a372.png)
VPC作成コンソールへ移動して、作成し、その後、VSwitchも作成して選択しました。
VSwithは、反映されにくくて、作成しても選ぶのに手間取りました。

ネットワークインターフェースに名前をつけて次へ
![making-instance-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65048/9232c079-f3e6-50c0-0694-958225e8dc51.png)

次に、キーペアの作成を開いて、キーペアの設定をしました。

名前をつけて、デフォルトのリソースグループを選択し作成しました。
pemファイルはパソコンにダウンロードしておきます。
![making-instance-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65048/75d61f65-bd99-09c0-9dfc-7e6d2056ce76.png)

リソースグループでデフォルトリソースグループを選択しました。
他はそのままで次へ

一番最後にある利用規約を読んで、インスタンス作成をクリックで完了しました。

![making-instance-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65048/3e762da9-d1cf-4486-d6bd-a2961a6f7aa8.png)
pythonのtry構文について調べてみた

今回のお題
-
今回は、pythonのtry構文についてまとめます。

例によって、自分用のメモです。

目次
-

- try構文とは
- raise文
- 複数の例外への対応
- 全ての例外への対応（机上論編）
- Exceptionクラス
- as, from

try構文とは
-
try構文とは、例外（いわゆるエラー）が発生した場合の処理を決めるための構文です。

例外処理とはコンピュータが想定していない処理、すなわち0で割り算をしたりstrオブジェクト用のメソッドをintオブジェクトに使ったりといったことですね。

通常は例外処理が行われるとエラーになってプログラムが停止しますが、try構文を用いることで「このエラーの時にはプログラムを止める代わりにこの処理を実行してね」と個別の指示を出すことができます。

以下がtry構文の例です。

```python:
try:
  print(1 / 0)
except ZeroDevisionError:
  print("0で割らないでください")
```
上記のtest.pyを実行すると、まずtry以下の処理が呼び出されます（今回はprint(1 / 0))。

もしエラーが発生した場合、そのエラーの型がexcept以下のもの(今回はZeroDevisionError)であれば通常のエラー表示ではなく特別な処理（今回であればprint("0で割らないでください"))を実行します。

今回は省略しますが、exceptの後にelseやfinallyを用いることでエラーがなかった場合の処理やエラーの有無に関わらず共通して行う処理をそれぞれ指定することができる。

raise
-
エラーの型とメッセージを指定して意図的にエラーを発生させることのできる構文です。

あるエラーが発生した際に他のエラー名を表示したい場合などに使います。

```python
try:
  print(1 / 0)
except ZeroDevisionError:
  raise TypeError("エラーです")# 型は"raise エラーの型(メッセージ)"
```
上記の例ではZeroDevisionError発生時には"TypeError：エラーです"と表示されるように設定しています。

複数の例外への対応
-
先程の例ではZeroDevisionErrorを想定し、それに対する例外処理を用意しました。

しかし、それ以外のエラーが発生した場合にはプログラムが止まってしまいます。

そこで複数のエラーが想定される場合には、exceptを複数用意することで対応します。

```python
def devide(a, b):
  try:
    print(a / b)
  except ZeroDevisionError:
    print("0で割らないでください")
  except TypeError:
    print("文字ではなく数字を入力してください")
```
上記の例ではb = 0の場合には"0で割らないでください"、aかbに数字以外のものが代入された場合には"文字ではなく数字を入力してください"と出力されるようにしています。

また、複数のエラーに対して同じ処理を実行する場合にはexcept以下にエラーの型をタプルの形で記述することで処理をまとめることが可能です。

```python
def devide(a, b):
  try:
    print(a / b)
  except(ZeroDevisionError, TypeError):
    print("エラーが発生しました")
```

全てのエラーへの対応（机上論編）
-
想定されるエラーが複数ある場合には、一つ一つ型を記述するのは大変です。

そこでそのような場合にはexcept以下のエラーの型を省略する、もしくは全てのエラーの親クラスであるBaseExcepitonクラスを指定すると全てのエラーに対する例外処理とすることができます。

```python
# 省略パターン
def devide(a, b):
  try:
    print(a / b)
  except:
    print("エラーです")

# BaseExceptionパターン
def devide(a, b):
  try:
    print(a / b)
  except BaseException:
    print("エラーです")
```

これでどのようなエラーが出ても"エラーです"と出力されるようになりました。

ただ、逆を言えばどんなに致命的なエラーが発生してもプログラムが停止しないようになってしまうというデメリットがあります。

なので実際にはこのBaseExceptionクラスではなく次に紹介するExceptionクラスを使用することが推奨されています。
Exceptionクラスとは
-
Exceptionクラスは、全ての親であるBaseExceptionから見れば子供、これまでに出てきたZeroDevisionErrorやTypeErrorから見れば親にあたります。

ただしBaseExceptionとは異なり、SystemExitなどのシステム終了を伴うような重大なエラーの親にはあたらない（位置的には兄弟）なので、BaseExceptionに比べれば比較的低リスクで広範囲のエラーに対応できます。

as
-
asは発生したエラーを変数に格納して例外処理の中で参照する場合に用います。

変数名はなんでも構いませんが、eやerrが一般的です。

```python
try:
  print(1 / 0)
except ZeroDevisionError as e:
  print(e)

# 出力：devision by zero
```
上記の例では、ZeroDevisionErrorを変数eに格納して出力しています。

eには基本的にエラーに対応したメッセージが代入されます。

また、エラーの元となった処理の引数を例外処理の中で用いることもできます。

```python
# 引数一つ
def return_half(a):
  try:
    print(a / 2)
  except TypeError as e:
    raise TypeError("%s is not a number" % a) from e

# 引数二つ以上
def divide(a, b):
  try:
    print(a / b)
  except BaseError as e:
    raise TypeError("%s can't be divided by %s" % (a, b)) from b
```
上記の例ではエラーメッセージの中に関数の引数を入れています。

2つ目の例のように引数が二つ以上になる場合にはタプルの形を取ります。

また、メッセージの中身ですが、

```python
("%s ...省略... " % a)
```
と記述することでaが%sの部分に代入されると考えてください。

終わりに
-
以上がtry構文の簡単な使い方でした。

この記事を書こうと思い立ったきっかけは、djangoの認証周りのファイルを見ていてtry文が大量発生していたことです。

そちらについての記事も近々上げる予定なので、よろしければご覧ください。
VBA  シンタックスハイライト


##お気に入り設定

||前景|背景|例|
|----|----|----|----|
|標準コード|白|黒|
|コメント|濃いグレー|黒|
|キーワード|黄色|黒|Sub / Function|
|識別子|黄緑|黒|


#デフォルト
||前景|背景|例|
|----|----|----|----|
|標準コード|自動|自動|
|コメント|緑|自動|
|キーワード|青|自動|Sub / Function|
|識別子|自動|自動|
C#でスクリーン解像度を得る

#はじめに
拡大縮小の設定をしていると正しい解像度が取れなかったのでメモ。
4kモニタとかだと100%でないことの方が多いのでハマりがち。

#基本
Forms.Screen.PrimaryScreen.Bounds から取得できる。
マルチディスプレイなら Forms.Screen.AllScreens に各ディスプレイの値が入っている。
ただ、拡大縮小設定を、たとえば200%にしていると、半分の値になってしまう。

#どうするか
2つ方法がある。（意味的には同じことをやっている）

1. SetProcessDPIAwareを呼び出す
2. マニフェストファイルに　`<dpiAware>true</dpiAware>`　を追加する

#具体的に
SetProcessDPIAwareはNative methodなので、宣言を追加する必要あり。
以下のようにする。

```
import System.Runtime.InteropServices;

   .
   .
   .

public Form1()
{
    NativeMethods.SetProcessDPIAware(); // 最初に呼び出す
    InitializeComponent();
}

   .
   .
   .

static class NativeMethods
{
    [DllImport("user32.dll")]
    public static extern bool SetProcessDPIAware();
}


```

NativeMethods に入れるのは、
https://docs.microsoft.com/ja-jp/dotnet/fundamentals/code-analysis/quality-rules/ca1060
とかを参照。

マニフェストファイルの方は、ソリューションエクスプローラから新しい項目の追加⇨アプリケーション マニフェスト ファイルでapp.manifestを追加し、コメントになっている

```
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
    </windowsSettings>
  </application>
```

のところを生かす。
今どきの自作PCを作る時の心得

##今どき自作PCは流行りなの？

かなり前は自作PCは大流行ですが、今ではそこまで大きな市場を持っていません。

結論的に手間とかも考えれば一般的なPCであればメーカー製やBTOのが安価になるためです。

ですが、自作PCはきちんと考えて作れば、将来的にも経費が節減でき、かつ、余計なモノを購入する必要もないので、地球環境にもよろしくなります。

##自作PCを初めて組む時
具体的な自作PCの組み方は、他の記事を参考にしてみて下さい。

###最も最小限でとりあえず動く自作PCは
以下のパーツとなります。

・CPUもしくはAPU
・メモリ
・グラフィックボード（CPU内蔵グラフィックやAPUを利用時は不要）
・マザーボード
・電源
・キーボード

足りないものが確かにありますが、これで確実に動作させることができます。

このスペックは、自作PCを組み上げる時の最初のステップとなり、自作PCの最初の動作確認に必要なものとなります。

UEFI-BIOSさえ動けば良いのです。

###普通なら必須となるパーツ
・M2.SSD もしくは SATA SSD もしくは HDD

今どき、HDDをブートデバイスとして使うのはもう時代の終わりと考えてよいでしょう。
しかし、大容量のストレージが安価に必要な方には今でも需要があります。
・USBマウス

USBマウスは必須です。USBドングル付のマウスでも構いません。

※ただし、Windowsをマウスなしでインストールすることも可能です。
この場合USBマウスは不要です。

###なくても良いパーツ
・CD/DVDドライブ、ブルーレイドライブ

今はOSはUSBメモリからインストールすることができます。
Windows 11に至っては、DVD-ROMに入らないサイズとなっていますので、
ブルーレイに焼くか、USBメモリにイメージを置く必要があります。

###あると良いかもしれないパーツ
・LANカード、無線Wi-Fiカード
・サウンドカード（もしくはそのUSB版）
・キャプチャカード（もしくはそのUSB版）
・EPS12V延長ケーブル＝CPUまわりの電源の供給をきれいに配線したい方には必須です。


##CPUブランドの選び方
###Intel
比較的高サイクルでCPUとCPUソケットが新しいのに更新されます。
組み上げてそのままあまりパーツを変えない方におすすめです。

安定志向の方にもおすすめです。

###AMD
今では短くなってしまいましたが、それでもIntelよりも同じCPUソケットでのCPU提供期間が長く、長期的にマザーボードやメモリを流用しつつ、CPUをアップグレードしやすくなります。

また、速度面において現在AMDのが圧倒的に勝利しています。

##マザーボードブランドの選び方
多数のブランドがありますので、最小限に割合します。

###ASUS
ASUSは初心者向け、マニュアルも丁寧で、UEFI-BIOSの表示に関しても、きちんと日本語で表示してくれる優しいマザーボードです。

また、高価な分電源まわりがしっかりしている部分も特徴です。

###Asrock
玄人向けのマザーボード。比較的安価に入手できるのが特徴です。

##メモリの選び方
メモリはあまりにも多数のブランドがありますので、最小限に割合します。

###CFD販売
国内でちゃんとサポートされているメモリです。初心者の方にオススメです。

###Crucial、Corsair
今現在のメモリとしての鉄板メーカーです。

###KLEVV
実はうちが今使用しているメモリだったりします。パッケージがそっけないものの、安価なのが特徴です。

###Dualchannelをする時の注意
Dualchannelは一応他のメモリの同規格で動作する場合がありますが、一切奨励できません。

2枚組、4枚組等、全く同じブランドのメモリを使用するようにしましょう。

メモリ増設をするにおいても同様で全く同じブランドのメモリを使用するようにしましょう。

わずかなメモリ基盤の配線の違いだけで、Dualchannelが安定しなかったり、動作しないことがあります。

##SSDの選び方

###Intel
高価なものの、どのような使われ方をしても安定して動作することが特徴です。

###Samsung
比較的人気なSSDとなります。

###WD Blue、WD Black
老舗HDDメーカーのSSD、有償バックアップソフトが無料で使えるのも特徴です。

### Seagate FireCuda
高速書き込みが特徴です。

###Crucial
コスパが良いです。

###東芝（現：キオクシア）
他のSSDは寿命が来ると全く何もできなくなるのと異なり、
キオクシアのSSDは Linux等に限りますが読み込みだけでもできるのが特徴です。

##グラフィックボードの選び方

###Geforce (NVIDIA)

PC市場ではほぼGPU専業
GPUとしての性能も高いものがあります。
NVIDIAのCUDA(GPUコンピューティング）を使う方にもおすすめです。

###Radeon (AMD)
PCI Express 4.0により早く対応。
処理速度よりもグラフィックへの転送速度を重視する方におすすめです。


###CPU内蔵 (Intel)
あまり高性能ではない傾向がありますが、おおむねのゲームは十分にできる性能はあります。

###APU (AMD)
Radeon技術がそのまま活かされたものです。
PS4/5 等にも同様の技術が採用されており、パッケージ内で完結するために
PCI Express よりもより高速な転送速度が期待できます。

##電源の選び方

一般的には使用する電力の倍のスペックの電源容量があると、最も電力使用量が少なくなります。

使用するワット数については[電源計算機（ドスパラ）](https://www.dospara.co.jp/5info/cts_str_power_calculation_main)で計算してみると良いでしょう。

##中古パーツを選んで良いかどうか？
中古パーツを選んでも良いのか、列挙してみます。

###中古でも十分性能が発揮できる
・CPU
・メモリ
・マザーボード（但し美品であること）
・エンタープライズ向けHDD
・LANカード、サウンドカード

###中古では寿命が心配
・電源
・M2.SSD、SSD、一般向けHDD
・キーボード、マウス

##令和3年おすすめ構成

###ゲーミング
AMD Ryzen7以上、AMD Radeon

###動画エンコード
AMD Ryzen9以上、NVIDIA Geforce

###サーバー
AMD Ryzen、AMD EPYC、ロースペックのグラフィックカード

###とりあえずは何にでも使える
Intel Core5/7
ReactでTwitterタイムラインを埋め込む方法

# `react-twitter-widgets`をインストール
```bash
npm install react-twitter-widgets
```

# Reactでの使い方
```hello.jsx
import React from 'react';
import { Timeline } from 'react-twitter-widgets';

const HelloPage = () => {
  return (
      <main>
        <Timeline
          dataSource={{
            sourceType: 'profile',
            screenName: 'maiamea' // アカウント名
          }}
          options={{
            height: '800'
          }}
        />
      </main>
  )
}

export default HelloPage
```

# 結果
以下のように表示される。
![スクリーンショット 2021-10-30 19.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384836/c62117fe-451f-0233-9804-4cc3e53c25ce.png)

# 参考サイト
* [GatsbyブログにTwitterのタイムラインを表示してみる](https://otsuneko-blog.com/posts/twitter-timeline)
* [GitHub - andrewsuzuki/react-twitter-widgets](https://github.com/andrewsuzuki/react-twitter-widgets)
HerokuのDBをGUIで見たい！！(TabelPlus)

## やりたいこと
- `heroku`にデプロイしたアプリの`DBの情報`を`GUI`(TablePlus)で確認したい。

## 結果を知りたい方用
- `heroku`にアクセスする
- `DB`を見たいアプリを選択する
- `Settings`タブを表示
- `Config Vars`内の`Reveal Config Vars`ボタンを押下
- `DATABASE_URL`環境変数の内容をコピー
- `Table Plus`を開き`new` => `connection URL`ボタンを押下
- 自動でリンクが入っているので`import`を押下
- 接続に必要な情報が記載されているので`Connect`ボタンを押下し完了

## 現状
- `heroku`にデプロイしたアプリのDBを見たい
- `heroku pg:psql`でアクセスできる事は知っているが
- `local`と同様に`GUI`で見やすくした状態のを見たい
- しかし、完全に未知状態
- AWSにデプロイした時は`TablePlus`で確認できていたので多分できるだろう位の認識。

## 調べたこと
- `heroku`上でもGUIを用いて`DB`を確認する事は可能
- 検索すると確認の方法が何パターンかあった
    - 該当のアプリの`Resources`から調べる方法([こちら](https://qiita.com/saima88/items/518e7ab044aa95ac208b))    
    - `heroku`にある`Dataclips `を使用する
    - `heroku`の環境変数を参照する(思いつき)
- 上記の3パターンがあった。


## Resources タブから調べる方法
- 結論としてはできなかった、
- 参照する`URI`の部分をコピーしたがエラー
- `Database Credentials`内の情報を当てはめるも`password`でエラー
- 結果断念。

## Dataclipsを使う
- 公式を確認してみる
  
> Heroku Dataclips を使用すると、Heroku Postgres データベースへの SQL クエリを作成し、その結果を同僚、サードパーティツール、パブリックと共有できます。データクリップの受信者は、そのデータをブラウザで表示できるほか、JSON および CSV 形式でダウンロードすることもできます。

- 求める用途と違うのでパス

## 環境変数を確認する
- DB情報以外に参照できそうなものが無いか考えた
- S3の設定する時に環境変数を入れたことを思い出す
- 「ちょっと見てみるか〜」的に確認
- `DATABASE_URL`という環境変数を発見
- 勝ちを確信する
- 接続完了！！(具体的な手順は冒頭にあります。)


## 余談
- `connection URL`で作成された情報を`Database Credentials`内の情報を比べてみたが`Password`以外同じ(伏せ字で見えないので)で繋がらないのはパスワードが違ったのかな？？
- 解決後に[こちら(HerokuのDBにローカルPCからアクセスしたいんだけど...)](https://qiita.com/akiko-pusu/items/305e291465d6aac04bf3#:~:text=IntelliJ-,20200601,-%E8%BF%BD%E8%A8%98%3A%20%E3%81%AA%E3%82%93%E3%81%A7%E6%8E%A5%E7%B6%9A)の記事に辿り付き先に見れば良かったです😇

##　参考
- [heroku, Table Plus】herokuデータベースにTable Plusを接続する方法](https://qiita.com/saima88/items/518e7ab044aa95ac208b)
- [HerokuのDBにローカルPCからアクセスしたいんだけど...](https://qiita.com/akiko-pusu/items/305e291465d6aac04bf3)
ReactでのBulma導入方法


# npmから`Bulma`をインストール
```bash
$ npm install bulma
```

# Reactでの書き方
`className=`に続けて、`Bulma`のCSSのクラス名を指定する。

```hello.jsx
import React from 'react';
import 'bulma/css/bulma.css';

const HelloPage = () => {
    return (
        <section className="section">
            <main className="container">                         
                <div className="columns">
                    <div className="column">
                        <div className="content">
                            <h1 className="title is-1">Hello, World!!!</h1>                                                
                            <h2>はじめてのBulma</h2>                          
                        </div>
                    </div>                 
                </div>
            </main>
        </section>
    )
}

export default HelloPage
```



# 参考サイト
* [ReactでBulma CSSを直接使うのがお気に入り](https://www.ey-office.com/blog_archive/2021/02/16/i-like-to-use-css-directly-instead-of-react-bulma-components/)
* [Getting started with Bulma](https://bulma.io/documentation/overview/start/)
クロームのアドオンWeava Highlighterが「Internet connection lost...」というエラーで使えない時の対処法

# はじめに
はじめまして、プログラミング初学者の[@kat_log](https://twitter.com/kat__log "Twitter")と申します。

「[Weava Highlighter - PDF & Web](https://chrome.google.com/webstore/detail/weava-highlighter-pdf-web/cbnaodkpfinfiipjblikofhlhlcickei?hl=en "Weava Highlighter - PDF & Web")」にて、マーカーを引こうとしても
>Internet connection lost...

というエラーで引けなかったのですが、解決したので対処法の共有です。

# 対処法

- ブラウザの**スーパーリロード**を行う

通常のページ再読み込みではなく、スーパーリロードを行うと解決しました。

<dl>
  <dt>　スーパーリロード方法↓</dt>
  <dd>Macの場合:⌘＋Shift＋R</dd>
  <dd>Windowsの場合：Shift＋F5</dd>
</dl>



解決しない場合、[公式のFAQページ](https://weavatools.atlassian.net/servicedesk/customer/portal/1/topic/708d215f-ceb9-4263-9c99-a9f6db090f4f/article/144965649 "Weava is loading forever")に

- ブラウザのキャッシュをクリアする

- [Weavaダッシュボード](https://www.weavatools.com/app/dashboard "dashboard")にて、ログアウト及び再ログインしてみる

- ブラウザを再起動する

- WeavaのアドオンのアイコンをクリックしWeavaサイドバーを再度開いてみる

が紹介されていましたのでお試しください。

# おわりに
お読みいただきありがとうございました。
同じ現象で困った方の参考になれば嬉しいです。
良いマーカーライフを！
jkanbanのデモ

https://github.com/riktar/jkanban

こちらのexampleを動かしてみる


## イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330873/10a16283-007b-516a-e467-f40c1f25a360.png)



## 準備するもの
- `https://github.com/riktar/jkanban/raw/master/example/index.html`

## 設定

jsやcssをホストしているjsdelivrを使わせていただく。

```
$ diff -u aa.txt index.html demo.html
--- index.html
+++ demo.html
@@ -5,7 +5,7 @@
     <meta name="viewport" content="width=device-width, initial-scale=1" />

     <title>Title</title>
-    <link rel="stylesheet" href="../dist/jkanban.min.css" />
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jkanban@1.3.1/dist/jkanban.min.css" />
     <link
       href="https://fonts.googleapis.com/css?family=Lato"
       rel="stylesheet"
@@ -64,7 +64,7 @@
     <br />
     <button id="removeElement">Remove "My Task Test"</button>

-    <script src="../dist/jkanban.js"></script>
+    <script src="https://cdn.jsdelivr.net/npm/jkanban@1.3.1/dist/jkanban.min.js"></script>
     <script>
       var KanbanTest = new jKanban({
         element: "#myKanban",
```
Linux入門 1-1 VirtualBoxにCentOSをインストールしてみた

# はじめに
Linux初学者である自分向け用の記事です。Udemyの動画講座を参考にしました。
僕の勉強法は`動画を見る`→`実際に動かしてみる`→`問題演習`という流れです。


## 1. Udemyの解説動画でなんとな～くLinuxについて把握する。
![](https://udemy.benesse.co.jp/wp-content/uploads/2395224_5bf0_3.jpg)
今回は、[Udemy]の記事を参考に[最新版Linux詳細！！基本コマンド、シェルスクリプト、Docker基礎、ネットワーク 、セキュリティを体系的に解説]の講座を選択しました。

講座は4章に分かれていました。

    1. Linuxのインストール・簡単なコマンド操作
    2. シェルスクリプト(問題、テスト、演習、発展問題)
    3. LinuC 101 Ver .10.0(問題、テスト、演習)
    4. LinuC 102 Ver .10.0(問題、テスト、演習)
    総時間: 27時間33分

***

#### 1. Linuxのインストール・簡単なコマンド操作
1日目：1.　Linux（CentOS）のインストール
Virtualboxを6.1.28にupgradeすると、既存の仮想マシンの起動時に（Hyper-V関連の機能が引っかかってしまって？）エラー吐き出した。ver.6.1.26だと動作することを確認。https://forums.virtualbox.org/viewtopic.php?f=6&t=104175&start=0

2日目：TeraTermを用いたCentOSの画面操作
Virtualboxのネットワーク設定から「ポートフォワーディング」のルールを設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/97045509-ad55-0776-83ff-f0046fc4d553.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/00ee30fb-ac89-2325-43c7-369d53e10073.png)
TeraTermの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/d1a4bed7-daeb-ea04-ef64-d43dd7d2da70.png)
セキュリティ警告はそのまま続行

ユーザー名とパスワードを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/3a6959a6-ff36-51e4-5708-386e2179f658.png)
SSH接続完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/a16bbd91-7153-f0af-6ee3-e3106c184840.png)

*To Be Continued...*
[Linux入門 1-2]へ

***
[](参照ソース)
[Linux Professional Institute公式HP]:https://www.lpi.org/ja/our-certifications/lpic-1-overview
[Udemy]:https://udemy.benesse.co.jp/career/workstyle/lpic-interview-company.html
[最新版Linux詳細！！基本コマンド、シェルスクリプト、Docker基礎、ネットワーク 、セキュリティを体系的に解説]:https://www.udemy.com/course/linuxlpic/?utm_source=bene-content-marketing&utm_campaign=normal&utm_content=story&utm_term=career&utm_medium=udemyads
[Linux入門 1-2]:https://qiita.com/hoglet/items/edb0cb47b7705570492d
c# 全角と半角のカウント

shift-jisのサポートがない場合。

```C#
using System;
using han_zen;
class Program
{
    static void Main(string[] args)
    {
        //usage
        Console.WriteLine("あいうえを ".getWidth());
        Console.WriteLine("" + 'ｱ'.isHalfWidth());
        Console.WriteLine("" + 'ｱ'.getWidth());
        Console.WriteLine("" + '亜'.getWidth());

        Console.WriteLine("Hello World!");
    }
}//class

```

```c#
namespace han_zen
{
    using System.Text.RegularExpressions;
    using System.Linq;
    static class ZenkakuExtension
    {
        static Regex ptn = _();
        static Regex _()
        {
            var range = ""
            + "a-z"
            + "A-Z"
            + "0-9"
            + "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ "
            + "ｱ-ﾞ" //半角カナ
            ;
            return new Regex($"^[{range}]+$");
        }
        public static bool isHalfWidth(this string @str) => ptn.IsMatch(@str);
        public static bool isFullWidth(this string @str) => !@str.isHalfWidth();
        public static bool isHalfWidth(this char @ch) => ("" + @ch).isHalfWidth();
        public static bool isFullWidth(this char @ch) => !@ch.isHalfWidth();
        public static int getWidth(this char @ch) => @ch.isHalfWidth() ? 1 : 2;
        public static int getWidth(this string @str) => @str.Select(getWidth).Sum();

    }//class

}//namespace
```
【Vue.js】監視プロパティのオプション　deep

#はじめに
こんにちは！
今回は【Vue.js】監視プロパティのオプション　deepについてアウトプットしていきます！

#deepとは
deepとは、ネストされたオブジェクトも監視するためのオプション


#書き方・解説
```HTML:HTML
<div id="app">
  <ul>
    <li v-for="color in colors">
      {{ color.name }}
    </li>
  </ul>
</div>
```
```Vue.js
 var app = new Vue({
   el: "#app",
   data: {
     colors: [
       {name: 'Red'},
       {name: 'Green'},
       {name: 'Blue'}
     ]
   },
   watch: {
     colors: {
       handler: function(newValue, oldValue) {
       console.log('Update!')
       },
       deep:true
     }
   }
 })
```

![スクリーンショット 2021-10-19 21.29.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/cdf01e2c-0f28-25d3-f688-4bb462376840.png)

colorsの部分がリスト表示されました。
そしたらデベロッパーツール👉consoleを開きます。`Green`の部分を`White`にします。
consoleに`app colors[1].name='white'`と記述しenterをクリックすると以下のようになります。

![スクリーンショット 2021-10-19 21.39.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/5349cb12-8dba-a291-0345-084351e016b6.png)


![スクリーンショット 2021-10-19 21.40.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/16e26d5a-b653-955f-840e-f3ce126723c4.png)

`Update!`と表示されているのはVue.js内で`deep:true`と記述しているからです。
これが`deep:false`または未記入だと出力されません。（deep:falseまたは未記入でも`app colors[1].name='white'`の効果は有力であり、しっかり反映されます。）



#まとめ
・deepオプションはネストされたオブジェクトを監視する役割をはたしています。
true＝実行
false＝実行しない
未記入＝実行しない


#最後に
今回は監視プロパティのオプション　deepについてアウトプットしました。
今回の記事を読んで質問、間違い等あればコメント等頂けると幸いです。

今後ともQiitaにてアウトプットしていきます！

最後までご愛読ありがとうございました！
Phx.gen.liveで作成したスキーマにJSON APIを作成する方法

# LiveviewのスキーマでJSONレスポンスを返したい！

```
mix phx.gen.live Foo Bar bars
```
で作成したコンテキストのスキーマのJSON APIを作成したいときは
ControllerとViewを作成して、routerに追加ればできます。

まずコントローラーを追加します。

```bar_controller.ex
defmodule HogeWeb.BarController do
  use HopeWeb, :controller

  alias Hoge.Foo

  # the plug to call as a fallback to the controller action
  action_fallback HogeWeb.FallbackController

  # index
  def index(conn, _params) do
    leads = Foo.list_bars()
    render(conn, "index.json", bars: bars)
  end
end
```

次にコントローラーのrenderを捌くためのViewを準備します。

```bar_view.ex
defmodule HogeWeb.BarView do
  use HogeWeb, :view
  alias HogeWeb.BarView

  def render("index.json", %{bars: bars}) do
    %{data: render_many(bars, BarView, "bar.json")}
  end

  def render("bar.json", %{bar: bar}) do
    %{
      id: bar.id,
      name: bar.name
    }
  end
end
```

コントローラーのアクションがうまくいかなかった時のためにFallbackControllerをコントローラーファイルに追加しました。

```fallback_controller.ex
defmodule HogeWeb.FallbackController do
  @moduledoc """
  Translates controller action results into valid `Plug.Conn` responses.

  See `Phoenix.Controller.action_fallback/1` for more details.
  """
  use HogeWeb, :controller

  # This clause handles errors returned by Ecto's insert/update/delete.
  def call(conn, {:error, %Ecto.Changeset{} = changeset}) do
    conn
    |> put_status(:unprocessable_entity)
    |> put_view(HogeWeb.ChangesetView)
    |> render("error.json", changeset: changeset)
  end

  # This clause is an example of how to handle resources that cannot be found.
  def call(conn, {:error, :not_found}) do
    conn
    |> put_status(:not_found)
    |> put_view(HogeWeb.ErrorView)
    |> render(:"404")
  end
end
```
GithubにSSH接続する手順（2021） - sshkey作成・設定・接続テスト

# 概要

MacからGithubにSSHを利用して接続をするための設定方法をメモしました。

## 参考

### ssh key 作成方法

https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

# sshkeyの作成

`ssh-keygen -t ed25519 -C "your_email@example.com"`を実行し、ssh keyを作成します。
`your_email@example.com`はgithubのアカウントに紐付いたメールアドレスを使用してください。


```sh
$ ssh-keygen -t ed25519 -C "your_email@example.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/xxxxxx/.ssh/id_ed25519): /Users/xxxxxx/.ssh/id_github
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_github.
Your public key has been saved in id_github.pub.
```
key（ファイル名）は`/Users/xxxxxx/.ssh/id_github`と指定します。
passphraseは何も入力せずにエンターを押します。


# config設定

configの設定をします。

```sh
$ vi ~/.ssh/config
```

以下を追記します。

```:~/.ssh/config
Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/id_github
  User git
```

権限を変更します。

```sh
$ chmod 600 ~/.ssh/config
```


# Githubに公開鍵を登録

以下のURLにアクセスしてkeyを登録します。
https://github.com/settings/ssh/new

**Title** はどの端末で利用するか分かるようにしておくと良いと思います。
例： MacBook Pro (15-inch, 2018)　など

**key** は `cat ~/.ssh/id_github.pub` で確認できる内容をそのまま貼り付けます。

以下、実行例。

```sh
cat ~/.ssh/id_github.pub
# 以下をコピー
ssh-xxxx xxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxx your_email@example.com
```

![sshkey-new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29570/f6f57d5c-fc15-4f03-9fb9-1642c60dacf8.png)


# SSH接続のテスト

```sh
$ ssh -T github
# 以下のように出力されれば設定完了です。
Hi [your_account]! You've successfully authenticated, but GitHub does not provide shell access.
```

これで設定完了です。

あとは、clone　するときに `https` ではなく `ssh` を選択して、`git remote add origin xxxxxxx` をすればOKです。
（すでに登録している場合は`git remote set-url origin xxxxx`）

![git-clone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29570/6dd7a1d9-485e-1c0c-2a14-95944ca32c68.png)
Vueのv-onで複数の関数を持たせる方法

```JavaScript
<div on:click="closeModal"></div>
// 省略形
<div @click="closeMondal"></div>
```

モーダルを閉じるクリックイベントを持たせながら、ページを遷移させたかったので、
複数のクリックイベントを持たせるやり方を調べた。
下記の通り記述すればOK。


```JavaScript
<div on:click="closeModal(); toAppPage()"></div>
// 省略形
<div @click="closeMondal(); toAppPage()"></div>
```


## 2022/12/19 追記
実務経験少しだけ詰んで記事を見直し。
あまり１つのクリックに対して複数のイベントを直接書くのはよくないような気がする。
今だったらこう書くだろう。

```vue
<template>
    <div @click="onClick()"></div>
</template>

<script>
export default {
    methods: {
        onClick() {
            this.closeModal();
            this.toAppPage();
        },
    },
};
</script>

```
五目並べ問題をrubyで解いてみる

## 五目並べ問題をrubyで解いてみる

最近PAIZAの勉強をしており、その練習問題に出てきた問題。
正直解答を見てもよくわからなかったので、一行ずつ読み解いてみます。
自分用のメモなので、他の方にはわかりにくいかもしれません。

### 問題はこちら
 [PAIZA](https://paiza.jp/works/mondai/prob60/tic_tac_toe_9 "PAIZA 五目並べ")
### 問題文
>5行5列の五目並べの盤面が与えられます。
>盤面の各マスには、"O"か"X"か"."が書かれています。
>"O"と"X"は、それぞれプレイヤーの記号を表します。
>同じ記号が縦か横か斜めに連続で5つ並んでいれば、その記号のプレイヤーが勝者となります。
>勝者の記号を1行で表示してください。
>勝者がいない場合は、引き分けとして、"D"を表示してください。

それではいきます〜〜

```ruby:qiita.rb

# `$'で始まる変数はグローバル変数で、プログラムのどこからでも参照できます
$board = []

# 盤面の初期化
# 5回入力する(二次元配列を作る)
(1..5).each { $board.push(gets.chomp.split('')) }

```
この段階で、例えば入力値を
CVGFH
GBHHN
DFVHN
EFRTY
ZXCVB
と入力後、
puts ＄board[0][1]をすると、0回目に入力された行(CVGFH)の中から1番目の文字が出力されるので、Vが出力されます。

対象の文字列が5つ並んでいた時のそれぞれの定義をしていきます

```ruby:qiita.rb

# 5つ並んでいるかどうか
def aligned?(o, x)
  if o == 5
    'O'  #oが5つ並んでいたらOを出力する
  elsif x == 5
    'X'  #xがXつ並んでいたらOを出力する
  else
    'D'  #　それ以外はD
  end
end

```
まずは横に5回連続して並ぶことで勝つパターンの定義をします。

```ruby:qiita.rb

# 横並びを定義
def row_aligned?
  result = ''

  #入力値を行に分解する
  $board.each do |row|
    #o,xの初期値を定義
    o = 0 #oが横に0回並んでいる
    x = 0 #xが横に0回並んでいる

    #行に書かれている値にさらに分解していく
    #(0..4)になっているのは5文字ずつ入力されているから0番目〜4番目を展開していくということになるということ
    (0..4).each do |i|
      # 展開した行のi番目がOであればoに1足していく
      if row[i] == 'O'
        o = o + 1
      # 展開した行のi番目がXであればxに1足していく
      elsif row[i] == 'X'
        x = x + 1
      else
        break
      end
    end
    #先ほど定義したaligned?(o, x)をresultに代入する
    result = aligned?(o, x)
    break if result != 'D'
  end

  result
end

```
続いて縦に5回連続して並ぶことで勝つパターンの定義をします。

```ruby:qiita.rb

# 縦並びを定義
def collum_aligned?
  result = ''

  (0..4).each do |i|
    o = 0 #oが縦に0回並んでいる
    x = 0 #xが縦に0回並んでいる
    #入力値を列ごとに分解
    $board.each do |row|
      #展開した列のi番目がOであればoに1足していく
      if row[i] == 'O'
        o = o + 1
      #展開した列のi番目がXであればxに1足していく
      elsif row[i] == 'X'
        x = x + 1
      end
    end

    result = aligned?(o, x)
    break if result != 'D'
  end

  result
end

```
最後に斜めに5回連続して並ぶことで勝つパターンの定義をする。

斜めで記号が揃うパターンは、0 から 4 までの i に対して board[i][i] が同じ記号か、board[i][4 - i] が同じ記号の 2 パターン。
board[i][i] が同じ記号なのは左上から右下まで一直線に揃うパターン、board[i][4 - i] が同じ記号なのは右上から左下まで一直線に揃うパターンです。

```ruby:qiita.rb

# 斜めを定義
def oblique_aligned?
  result = ''

  #0はboard[i][i] が同じ記号であるパターン
  #1はboard[i][4 - i] が同じ記号であるパターン
  (0..1).each do |time|

#i,j,o,xそれぞれの初期値を定義していく。
    i = 0

    #if time == 0と意味は同じらしい
    if time.zero?
      j = 0
    else
      j = 4
    end

    o = 0
    x = 0
    
    (1..5).each do
      #i列目のj番目がOの時oに1足していく
      if $board[i][j] == 'O'
        o = o + 1
      #i列目のj番目がXの時xに1足していく
      elsif $board[i][j] == 'X'
        x = x + 1
      end

   #iとjをそれぞれ更新していく

      i = i + 1

      if time.zero?
        j = j + 1
      else
        j = j - 1
      end
    end

    result = aligned?(o, x)
    break if result != 'D'
  end

  result
end

```

疲れてきた、、
最後の最後に、
横列　or 縦列　or 斜めにOが並んだ場合はOを出力、
横列　or 縦列　or 斜めにXが並んだ場合はXを出力、
それ以外はDを出力するif文を書く！


```ruby:qiita.rb

if row_aligned? == 'O' || collum_aligned? == 'O' || oblique_aligned? == 'O'
  puts 'O'
elsif row_aligned? == 'X' || collum_aligned? == 'X' || oblique_aligned? == 'X'
  puts 'X'
else
  puts 'D'
end

```

以上でした

メモとして書いているのでわかりづらかったらすみません。
SQLのトランザクションの中断、分離について

#トランザクション
私達がDMBSに対して複数のSQL文を送る際に１つの塊として送ることができます。この塊のことをトランザクションといいます。
このトランザクションがなぜ必要なのか、以下のケースで考えてみましょう。

##トランザクションの中断
例えば太郎さんが花子さんの口座に１０００円振り込むとします。
このとき、不運にも停電が起き処理が中断したとします、

![スクリーンショット 2021-10-30 15.18.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/61adf4b3-7724-6296-0fff-60c3d23c7141.png)

これでは太郎さんの残高は減っているのに花子さんの残高は以前のままです。これでは太郎さんと花子さんの仲が悪くなってしまいますね、、困ったもんです、、。
この事態を解決するためにある機能がトランザクションです。DBMSではトランザクション（一塊）を「一部だけが実行されることはあってはならない、途中で分割不可能なもの」として取り扱います。一塊を不可分（これ以上分けることができない）なものとして扱うトランザクションの性質を「原子性（*atomicity*）」といいます。
この原子性の機能を支える仕組みとして「コミット（*commit*）」と「ロールバック(*rollback*)」があります。

###コミット（*commit*）
トランザクション中での各処理を「仮の書き換え」としてトランザクション終了時に「仮の書き換え」をすべて確定します。この確定行為のことをコミットといいます。
![スクリーンショット 2021-10-30 15.59.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/1e6489da-9888-cb03-ed26-c4b1919018e5.png)


###ロールバック(*rollback*)
このとき仮①と仮②の処理の途中で不運にもまた停電してしまったとします。その場合仮の書き換え（仮①）をキャンセルしてなかったことにします。この動作の仕組みを「ロールバック(*rollback*)」といいます。

![スクリーンショット 2021-10-30 16.08.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/da72e9b4-811d-d400-6b18-6236d4ca5b07.png)

###トランザクションの指定方法
１．　BEGIN・・・開始の指示。この指示以降を一つのトランザクションとします。
２．　COMMIT・・・終了の指示。この指示までを一つのトランザクションとし変更を確定する。
３．　ROLLBACK・・・終了の指示。この指示までを一つのトランザクションとし、変更の取り消しをする。


##トランザクションの分離
トランザクションの中断の仕組みを理解したところで以下のケースの問題がまだ残されています。

![スクリーンショット 2021-10-30 16.47.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/981bafe2-a35c-c308-75b3-a14c04566ee2.png)

①花子さんがATMで残高3,000から1,000を引き出す（仮）。
②①とほぼ同時に〇〇会社からの引き落としで1,000が引き落とされる（仮）。
③②のコミット前に中断する。このとき花子さんのなかでは残高は3,000だと思っている。
④②をコミットして確定する。

次に花子が残高を確認すると残高が1,000円になってしまっている。。

このような状況を解決するためにトランザクションでは「分離性（*isolation*）」という機能で対応します。
あるトランザクションを実行する際、他のトランザクションとは分離して実行し他のトランザクションと実行していた　としてもあたかも単独で実行しているのと同じ結果となるように制御します。この機能を支える上で重要な機能が「ロック（*Lock*）」です。イラストで確認してみましょう。

![スクリーンショット 2021-10-30 17.06.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/16133d62-6f36-762f-83ed-7d34c833efc0.png)

上記イラストのようにトランザクション①が実行している時にロックを取得します。このトランザクションのコミットまたはロールバックが終了するとかけられたロックは解除されてトランザクション②が実行されます。
したがってロックされている状態では他のトランザクションは必然的に待機状態になります。このロックの待機時間は通常数ミリ以下と大変短いものになります。

またこのトランザクションの分離レベルは何種類かあります。気になる方は以下の記事の一読をオススメします。
https://qiita.com/song_ss/items/38e514b05e9dabae3bdb

##参考
書籍： スッキリわかるSQL入門 第2版 ドリル222問付き！　
　　　 中山 清喬　著/飯田 理恵子　著
【Mac】VSCode で次に進む（ctrl+shift+-）が効かない時は (ctrl+_)

事象
--
VSCode で 定義へ移動などしたあとに 戻る には Ctrl + - (Mac) だが、
「戻った後、さらに戻る（進む）Ctrl + Shift + -　」が効かない

対応
--
ctrl+_(アンダーバー)を押すべし

設定の確認方法
--
1. cmd+shift+Pでコマンドパレットを開く
2. 「基本設定：既定のキーボード ショートカットを開く（JSON）」を選択
3. cmd+Fで「navigateForward」を検索
4. 「"key": "ctrl+[IntlRo]",」となっていることを確認。"[IntlRo]"は"_(アンダーバー)"と同義。

補足
--
VScodeのバージョン: 1.54.2 (Universal)で再現。
公式では　⌃- / ⌃⇧- :Go back/forward　となっていたが
バージョンによってショートカットに差異があるのかもしれない。

↓公式のキーボードショートカットリスト

https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf
UIUXの最新トレンドを手に入れるおすすめサービス４選

##前提
「あれ？私のUIUXの認識って古い？」と感じたことはないですか？？私は最近この感覚がありました。
ITの進化の速度が加速してるのは感じているが、前によんだUIUXの本に書いてあったことが古いみたいな本を読んで焦る私。
みなさんも実は気付いていないだけで、世の中のUIUXルール、技術トレンドは既に次のステップに行っているかもしれませんね。
仕事やプライベートに追われて技術トレンドに置いてかれるなんてことは技術者としてあってはなりません！

**そんな若者言葉はわからなくてもITトレンドは最新にアップデートできるサービスを紹介します！！**

※記事はこちらに移行しました！

https://sg-report.com/uiuxtrend/
CentOS 7.9をAlmalinux 8.4にアップグレードしてみた

今回初めての投稿となります。

環境
- Windows 10 Pro 20H2のHyper-VでCentOS 7.9が稼働
- VMのセキュアブートは有効

基本は公式サイトの通りにやればできますが、ちょっとハマったことがありました。
<https://wiki.almalinux.org/elevate/ELevate-quickstart-guide.html>

まずはOSを最新の状態にします。再起動の際にセキュアブートが有効なら無効にしておきます。理由は後述します。

```Bash
sudo yum update -y
sudo reboot
```

Almalinuxのリポジトリを追加します。

```Bash
sudo yum install -y http://repo.almalinux.org/elevate/elevate-release-latest-el7.noarch.rpm
```

アップグレード用のツール(ELevateプロジェクトのleappユーティリティ)をインストールして事前チェックします。

```Bash
sudo yum install -y leapp-upgrade leapp-data-almalinux
sudo leapp preupgrade
```

生成された ```/var/log/leapp/leapp-report.txt``` の ```inhibitor``` となっている箇所を対処します。下記は環境によって異なるはずです。

```Bash
echo PermitRootLogin yes | sudo tee -a /etc/ssh/sshd_config
sudo rmmod pata_acpi
sudo leapp answer --section remove_pam_pkcs11_module_check.confirm=True
```

アップグレードを実行します。結構時間がかかりました。

```Bash
sudo leapp upgrade
sudo reboot
```

再起動時にGRUBに ```ELevate-Upgrade-Initramfs``` というアップグレード用の臨時のブートメニューが追加されています。どうもこれはセキュアブートに対応していないようです。

セキュアブートを無効にするとアップグレード処理が開始されます。完了したら自動で再起動しAlmalinuxがブートします。

Hyper-Vが悪いのか、leappが悪いのかは分かりませんが、自分の環境ではVMのブート順序が変わってしまいました。ネットワークアダプターが最上位となってしまったので修正しておきます。ついでにセキュアブートも再有効化しておきます。

手順は以上です。以前leappを使わずにCentOS 7からCentOS 8へのアップグレードをしてみましたが、パッケージの競合が発生して大変でした。leappを使えばそのあたりはうまくやってくるようです。
JavaSilverをオンライン試験(監督付き)で受験する前に読んでほしいメモ（Bronze, Goldも可）

#この記事で伝えたいこと（要約）
- 試験中、机にはキーボード・マウス・飲み物しか置くことができない（メモ紙やペンがダメ）
- メモ代わりに[オンラインホワイトボード](https://www.pearsonvue.co.jp/onvue/whiteboard)が使えるが小さくて使いづらい
- チャットベースで対応されるため声出し不要だったがやりづらい

**結論：おそらくテストセンター受験のほうが準備も気持ちも楽**

#事務的なやること
1. Oracleアカウントを作成する
1. CertView（Oracle認定システム）にログインする
1. CertView経由で試験チケットの購入と受験予約をする

ここまではテストセンター受験と共通だと思うので説明はこのくらいにするが、一点だけ。**CertViewのメールアドレスは後から変更ができない。**そのため、会社のメールアドレスで登録する場合は注意が必要だ。
CertView（Oracle認定システム）の詳細については[こちら](https://www.oracle.com/jp/education/certification/migration-to-certview.html)を参考に。

#環境的なやること
ここからが大事（Just Do It!）

##受験予定のPCでシステムテストを行う
おそらく仕事のために資格を取得する方が多いと思うが、**会社貸与のPCなどは使えない**と思った方が良い。
なぜならウイルス対策ソフトやログ収集ソフトが常駐しているため、システムテストが正常に実行できないからだ。

システムテストでは以下の項目を確認する。

- マイクチェック
- スピーカーチェック
- Webカメラチェック
- ネットワークチェック
- 試験ソフトウェア起動チェック

試験ソフトウェア起動チェックの際に、ブラウザを含めて全てのソフトウェアの終了を要求される。（裏で常駐しているソフトウェアも含めて）
スマホを[Webカメラの代わりに使用できるソフトウェア](https://www.elgato.com/ja/epoccam)があるが、そういうものは使えないため（受験時に携帯持込不可のためどちらにせよアウト）、PC付属のWebカメラかUSB接続式のWebカメラを用意しよう。

##試験に使用できる部屋を用意する
試験当日は、試験開始時間前にチェックインと呼ばれる手続きを踏まなくてはならない。
そこでは、

- 本人確認（自分を正面から撮影, 本人確認書類を撮影）
- 試験に使用する机を起点に部屋の撮影（4枚程度）

を行う。

自分の場合は、試験に使用する机が壁際から動かせず十分に監督者が確認できなかったためか、**動画で部屋の状態を詳しく見えるよう要求された。**
その際には部屋の中に置かれたプライベートなもの（衣類、書類など）も一緒に見せることになるため、試験前に部屋中綺麗にしておこう。

##静かな試験環境をつくる
オンライン試験の注意事項には、静かな環境をつくるよう配慮せよと書かれている。もちろん、試験中は自分以外の誰かが部屋を出入りすることができないし、声を掛けられることもあってはならない。最悪の場合、**試験失格**になるため注意しよう。（家の外から救急車の音が聞こえたり、選挙カーが通って声が少し聞こえたりするくらいは注意されなかった）

#さいごに
チェックイン時間までゆったり家で過ごせること、コロナの蔓延状況を気にすることなく受験できることはメリットだと思う。
しかし、本来はテストセンターなど環境の整っている場所での受験が前提であるため、要求されることが多い点には十分注意して申し込んでほしいと思う。

#おまけ（合格体験記）
Java Silver（正式資格名：Oracle Certified Java Programmer, Silver SE 8）合格にあたり、私は[黒本](https://book.impress.co.jp/books/1115101068)のみで学習を進めた。
黒本は試験対策問題集のため、Javaの基礎的な知識やある程度のプログラム経験が前提となっている。しかし、一般的な問題集のものと比べ、**解説が非常に丁寧に書かれており（不正解の選択肢についても解説がある）**、まずは解いてみて、そこからじっくり理解するといった学習法ができると思う。

ちなみに私は4周ほど黒本を解き、正答率94%で合格することができた。
上位のGold資格についてはこれからとなるが、引き続き黒本を頼りに学習を進めていきたいと思う。
IR Reading 秋の感想

# 印象に残った論文まとめ

+ Automatic Form Filling with Form-BERT（SIGIR 2021）
  + 歯抜けのuser情報のフィルタリングにも使えそう

+ Standing in Your Shoes: External Assessments for Personalized Recommender Systems (SIGIR 2021)
  + 情報検索の評価スキーマを情報推薦にも適用してみた
  + 情報検索と情報推薦の違いもわかって面白い
  + 一方で情報推薦についても大規模だと難しそう

+ Towards Axiomatic Explanations for Neural Ranking Models (ICTIR 2021)
  + DNNを使った推薦結果を情報検索の公理を使って説明できないかという試み

+ Societal Biases in Retrieved Contents: Measurement Framework and Adversarial Mitigation of BERT Rankers (SIGIR 2021)
  + gender bianを定量化したり、軽減させる方法について
  + 改めて時代だなあと思った


+ Leveraging Lead Bias for Zero-shot Abstractive News Summarization (SIGIR 2021)
  + 上の論文とは逆にbiasを利用して、良い結果を得ようというもの
  + bias全ては悪いわけでもないということか

+ TILDE: Term Independent Likelihood moDEl for Passage Re-ranking (SIGIR 2021)
  + 文書検索において、最近のLanguage Modelを使いたいが、モデルが大きいため計算時間がかかってしまい適用できない、という現状に対する対処策
  + 途中のDeepなモデルを適用する4つの方法論が挙げられていたので、そこは要チェック

+ Intra-Document Cascading: Learning to Select Passages for Neural Document Ranking (SIGIR 2021)
  + 上と同じく、重要なパッセージを抜き出すことで文書検索を高速化した

+ An Image is Worth a Thousand Terms? Analysis of Visual E-Commerce Search
  + 画像検索はとても重要だ！という内容

+ Counterfactual Data-Augmented Sequential Recommendation (SIGIR 2021)
  + 敵対的学習でCounterfactual的な状況でシーケンシャルレコメンデーションのDataを増やした
  + Data生成に敵対的学習を用いていたのが面白かった

+ Learning Recommender Systems with Implicit Feedback via Soft Target Enhancement (SIGIR 2021)
  + softmax lossを推薦問題に使うための工夫
Linuxのユーザーとグループ、権限について

Linuxの権限周りについて調べたことをつらつらと並べていく。
### ユーザー情報のファイル
`/etc/passwd`に保存されている。

```terminal
// ユーザー名：パスワード:ユーザーID：グループID:その他情報：ホームディレクトリ:シェル
root:*:0:0:System Administrator:/var/root:/bin/sh
```

### グループ情報のファイル
`/etc/group'に保存されている。

```terminal
//グループ名：パスワード：グループID：ユーザーリスト
operator:*:5:root
```

#と思っていたら
基本は上での方法で確認するのだが、
MacOSだとユーザーやグループについては主に別のファイルを見ているらしい。

### (MacOS) ユーザー一覧とユーザー情報の表示

```terminal
//一覧の表示
% dscl . list /Users

//ユーザー情報の表示
% dscl . read /Users/ユーザー名
```

### (MacOS) グループ一覧とグループの表示

```terminal
//一覧の表示
% dscl . list /Groups

//ユーザー情報の表示
% dscl . read /Groups/グループ名
```

### 現在のユーザーを確認する
現在のユーザーはwhoコマンドを利用して表示することができる。

```terminal
% who -m //オプションをつけないと現在ログイン中のユーザー全員を表示する
```

# Linuxの権限周り
ユーザーやグループの確認ができたので、いよいよファイルやディレクトリの権限について調べていきます。

### 現在のディレクトリのファイル、ディレクトリのパーミッション情報を表示する

```terminal
% ls -l // llでもいいらしいが僕の環境には入ってなかった

total 163976
drwx------@   5 koichi.ikeda  staff       160  5 20 15:04 Applications
-rw-r--r--    1 koichi.ikeda  staff       752 10 30 13:40 derby.log

// 表示構成
// ファイルの種類とパーミッション属性 ハードリンク数 所有者 グループ ファイルサイズ タイムスタンプ ファイル名
```
*　ハードリンク数は紐づいたファイル、ディレクトリ の数のことらしい。

### ファイルの種類とパーミッション属性

| 順番 | 属性 | 詳細 |
|:----|:----|:---|
| 1文字目 | 種別 | 「-」...ファイル,「d」...ディレクトリ,「l」...シンボリックリンク|
| 2~4文字目 | 所有者の権限 | 「r」...読み取り,「w」...書き込み,「x」...実行 |
| 5~7文字目 | グループの権限 | 同上 |
| 8~10文字目 | その他の権限 | 同上 |

## パーミッションの変更
パーミッションの変更にはchmodコマンドを利用する。

数値で指定する際は読み取り、書き込み、実行を以下の表に当てはめて数値を足す

| 文字 | 数値 | 
|:----:|:----:|
| r | 4 |
| w | 2 |
| x | 1 |

ex.読み取り権限と書き込み権限の場合 ... 4 + 2 = 6

### 文字と数値の権限指定の変換

rw-rw-r-- => 664
rwxr----- => 740

### chmodの利用

```terminal
chmod 権限指定 対象ファイル
// ex chmod 600 test.txt
```


# 参考

[Mac OS Xのユーザとグループ]
(https://ksaito11.hatenablog.com/entry/20110508/1304756757)
[Linuxの権限確認と変更(chmod)（超初心者向け）](https://qiita.com/shisama/items/5f4c4fa768642aad9e06)
導入編　Angular実践入門チュートリアル

# 背景

業務で Angular を使っているが、基本的な動かし方を理解仕切れてない。
そのため、簡単なアプリを作りながら、 Angular がどのように動いているのか理解しようと思う。
その学習の過程で学んだことを、メモとして残していく。

# 参考資料

[Angular実践入門チュートリアル
](https://zenn.dev/ttskch/books/84c7a272deb3845e8085)

# [導入編](https://zenn.dev/ttskch/books/84c7a272deb3845e8085/viewer/d3adbdd494f839a70b1d)

## [1. 雛形アプリを自動生成してみる](https://zenn.dev/ttskch/books/84c7a272deb3845e8085/viewer/d3adbdd494f839a70b1d#angular-cli%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)

### Angular CLI をインストールする

```bash:bash
$ npm install -g @angular/cli
```

### Angular のバージョンを確認する

```bash:bash
$ ng version

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/


Angular CLI: 12.2.4
Node: 14.17.6
Package Manager: npm 6.14.15
OS: darwin x64

Angular:
...

Package                      Version
------------------------------------------------------
@angular-devkit/architect    0.1202.4 (cli-only)
@angular-devkit/core         12.2.4 (cli-only)
@angular-devkit/schematics   12.2.4 (cli-only)
@schematics/angular          12.2.4 (cli-only)
```

### アプリの雛形を生成する

```bash:bash
$ ng new angular-to-do
? Would you like to add Angular routing? No
? Which stylesheet format would you like to use? SCSS   [ https://sass-lang.com/documentation/syntax#scss
```

### 生成された雛形アプリを実行する

```bash:bash
$ ng serve --open
```

## [2. 雛形アプリのソースコードを覗いてみる](https://zenn.dev/ttskch/books/84c7a272deb3845e8085/viewer/d3adbdd494f839a70b1d#2.-%E9%9B%9B%E5%BD%A2%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%A6%97%E3%81%84%E3%81%A6%E3%81%BF%E3%82%8B)

- `main.ts` は `AppModule` を起動する
- `AppModule` は `AppComponent` を読み込んでいる
- `AppComponent` は `app.component.html` を読み込んでいる

どうやら `AppComponent` が読み込んでいた `app.component.html` の中身は、 `index.html` の `<app-root></app-root>` の部分にレンダリングされる仕組みになっているようです

### モジュールとコンポーネント

ここまでで、

1. `angular.json` に、「 `src/main.ts` の実行結果を `src/index.html` にレンダリングする」という設定が記載されている
1. `src/main.ts` は `AppModule` を読み込んで起動している
1. `AppModule` は `AppComponent` を読み込んで起動している
1. `AppComponent` で読み込んでいる `src/app/app.component.html` のHTMLが、 `src/index.html` に埋め込まれる形でレンダリングされている

といった関係性が見えてきました。

Angular では、アプリを構成する機能を <strong>モジュール</strong> という単位で分割して作成できるようになっており、1つ以上のモジュールを組み合わせることでアプリ全体を構成します。

雛形アプリでは、 `AppModule` というモジュールが1つだけ存在しています。 `AppModule` は、アプリ起動時に最初に読み込まれる特別なモジュールで、ルートモジュールと呼ばれます。

また、 Angular では、ビュー・スタイル・ロジックをひとまとめにした <strong>コンポーネント</strong> という単位でUI部品を作っていきます。作ったコンポーネントは、モジュールに登録することでそのモジュール内で利用可能になります。

雛形アプリでは、 `AppModule` で `AppComponent` が読み込まれており、それが `index.html` に挿入されるようになっていました。この、 `index.html` に挿入されるコンポーネントはルートコンポーネントと呼ばれます。

雛形アプリはルートモジュールとルートコンポーネントだけが存在している状態ですが、実際のアプリ開発では、自分でコンポーネントを追加したり、必要に応じてモジュールを分割したりしながらアプリを作り込んでいきます。
M1 Macでrbenvのrubyインストールに失敗する

お久しぶりです。

M1 Macにしてからたくさんエラー出てゲンナリしてるのですぐ見返せるようにメモしておきます。

### エラー

ruby 3.0.2 を入れたとき

```sh
$ rbenv install 3.0.2
Downloading openssl-1.1.1l.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1
Installing openssl-1.1.1l...
Installed openssl-1.1.1l to /Users/***/.anyenv/envs/rbenv/versions/3.0.2

Downloading ruby-3.0.2.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.2.tar.gz
Installing ruby-3.0.2...
ruby-build: using readline from homebrew


BUILD FAILED (macOS 11.6 using ruby-build 20210825)

Inspect or clean up the working tree at /var/folders/s3/qcrn2vp17j7bp1qss56cg4n80000gn/T/ruby-build.20211030161412.21719.D9EvS1
Results logged to /var/folders/s3/qcrn2vp17j7bp1qss56cg4n80000gn/T/ruby-build.20211030161412.21719.log

Last 10 log lines:
linking shared-object psych.bundle
compiling ossl_x509ext.c
compiling ossl_x509name.c
compiling ossl_x509req.c
compiling ossl_x509revoked.c
compiling ossl_x509store.c
installing default openssl libraries
linking shared-object openssl.bundle
linking shared-object ripper.bundle
make: *** [build-ext] Error 2
```

### 解決策

オプション付けたら行けます。

```sh
RUBY_CONFIGURE_OPTS=--with-readline-dir="$(abrew --prefix readline)" \rbenv install *.*.*
```

```sh
$ RUBY_CONFIGURE_OPTS=--with-readline-dir="$(abrew --prefix readline)" \rbenv install 3.0.2
zsh: command not found: abrew
Downloading openssl-1.1.1l.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1
Installing openssl-1.1.1l...
Installed openssl-1.1.1l to /Users/***/.anyenv/envs/rbenv/versions/3.0.2

Downloading ruby-3.0.2.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.2.tar.gz
Installing ruby-3.0.2...
Installed ruby-3.0.2 to /Users/***/.anyenv/envs/rbenv/versions/3.0.2
```
NestJSでAWSCognitoからJWT指定でユーザ情報取得を行うと「ConfigError: Missing region in config」

# 現象
NestJSでAWSCognitoからJWT指定でユーザ情報取得を行うと、「ConfigError: Missing region in config」が発生する。

```typescript:cognito.service.ts
@Injectable()
export class CognitoService {
  private client: CognitoIdentityServiceProvider;
  protected user: GetUserResponse;
  constructor() {
    this.client = new CognitoIdentityServiceProvider();
  }
  public async getUserByToken(token: string): Promise<GetUserResponse> {
    this.user = await this.client
      .getUser({
        AccessToken: token,
      })
      .promise();
    return this.user;
  }
}
```

# 解決
CognitoIdentityServiceProviderのインスタンスを生成する際に、間違ったregionが使用されているっぽい。
なのでインスタンス生成時にregionを指定するように修正してやるとうまくいった。

```typescript:cognito.service.ts
@Injectable()
export class CognitoService {
  private client: CognitoIdentityServiceProvider;
  protected user: GetUserResponse;
  constructor() {
    // ※※※※※※※※※※以下を修正※※※※※※※※※※
    // this.client = new CognitoIdentityServiceProvider();
    this.client = new CognitoIdentityServiceProvider({
      region: 'ap-northeast-1', // 自分が使用しているユーザプールのRegionを指定
    });
  }
  public async getUserByToken(token: string): Promise<GetUserResponse> {
    this.user = await this.client
      .getUser({
        AccessToken: token,
      })
      .promise();
    return this.user;
  }
}
```
Visual Studio Codeをサイバーパンク風にするよ！

# はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/44cf8fb1-d1c0-a6f2-ca10-674c8cb3266e.png)

こんなエディタを使って、コードを書きたい！
この記事では、Visual Studio Codeに「Cyberpunk 2077 rebuild」という拡張機能を入れていくよ！

# 環境
- Windows 10 home
- Visual Studio Code インストール済み

https://code.visualstudio.com/download

# 本題
## Visual Studio Codeの起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/c4ee9592-7f4d-a707-9f79-516557decbcf.png)


## 拡張機能の追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/1a03a3a5-2349-d2c5-18ad-13e1206f2864.png)


左の拡張機能から、「Cyberpunk 2077」検索すると「Cyberpunk 2077 rebuild」という拡張機能があるので、こちらをインストールしよう！


## 完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309633/af06ad54-450e-a67f-f8c8-d3af3fd7e3a3.png)

インストールが完了すると、「Cyberpunk 2077 rebuild」という拡張機能が入るので、サイバーパンク風のエディタになります！
変化しない場合は、配色テーマで「Cyberpunk 2077 rebuild」を選択してください。

以上、ありがとうございました！
【JavaScript】関数とオブジェクト⑮　プロトタイプ継承



#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。

前回の記事

https://qiita.com/nao0725/items/4f71c04f7af4938aefa1

#目的

* 関数とオブジェクトについての理解を深める

#本題
###1.プロトタイプ継承

プロトタイプ継承とは別のコンストラクター関数のプロトタイプを引き継いで機能を使えるようにすること

そもそも**継承**とは、別のコンストラクターを受け継ぐこと。

###例1

下記のコードを継承してJapaneseという関数を作成する

`````js
function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.hello = function() {
  console.log('hello ' + this.name);
}

// 上記のコードをコピーし、Personの部分をJapaneseに変更
function Japanese(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.hello = function() {
  console.log('hello ' + this.name);
}
```
このままだと重複するコード量が増えて大変だし、メンテナンス等にもコストがかかる

```js
function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.hello = function() {
  console.log('hello ' + this.name);
}

// Japanese関数を用意
// Personのプロトタイプを継承したい
function Japanese(name,age){
    // Person関数で使ってるthisをcallメソッドで呼び出す
    // 引数内のthisはJapaneseの関数コンテキスト内のthis
    Person.call(this, name, age);
}
// createでJapaneseのプロトタイプにPersonのプロトタイプを格納する
Japanese.prototype = Object.create(Person.prototype)
// インスタンス化して実行
const taro = new Japanese("太郎", 23);
// Japanese {name: '太郎', age: 23}
console.log(taro);
// Personのhelloメソッドをtaroから呼んでみると
// hello " 太郎"と出力
taro.hello();
```

####例2

継承してきたPersonは上書き可能

````js
function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.hello = function() {
  console.log('hello ' + this.name);
}
function Japanese(name,age){
    Person.call(this, name, age);
}
Japanese.prototype = Object.create(Person.prototype)
// 上記のPersonをコピーして持ってきて
// Japaneseのプロトタイプのhelloメソッドとして変更
Japanese.prototype.hello = function() {
  console.log('こんにちは ' + this.name);
}

// PersonとJapaneseはそれぞれ独立して存在しているので、メソッド変更して使いまわしが可能
Japanese.prototype.bye = function() {
  console.log('じゃあな ' + this.name);
}

const taro = new Japanese("太郎", 23);
console.log(taro);
  // 上書きされたので出力結果は"こんにちは　太郎"になる
taro.hello();
// byeメソッドを使用して,”じゃあな　太郎”とすることができる
taro.bye();
````

####例3

継承先でさらにプロパティを追加することも可能

```js
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// 引数にgender追加
function Japanese(name,age, gender){
    Person.call(this, name, age);
    // ここで更に性別を表すプロパティを追加
    this.gender = gender;
}
Japanese.prototype = Object.create(Person.prototype)


Japanese.prototype.hello = function() {
  console.log('こんにちは ' + this.name);
  // 出力結果を追加
  console.log('性別は ' + this.gender + "です!");
}

const taro = new Japanese("太郎", 23, "男");
// helloメソッドを使用したときに性別は〜〜〜の内容も出力される
taro.hello();
```

今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
[読書備忘録]バイオ技術者・研究者になるには

# はじめに
何故か`bioinformatics`をやることになりました。
# バイオ技術者・研究者になるには
[バイオ技術者・研究者になるには](http://www.perikansha.co.jp/Search.cgi?mode=SHOW&code=1000001793&type=3&flg=) を図書館で借りて読みました。

なるにはBOOKSシリーズは、`少年少女の夢を応援することを目的`とした職業ガイドですので、大人~~の金銭欲~~はガイドしていません。
# メモ
+ ウエット（実験）とドライ（理論）という二つのアプローチがある
+ ヒトゲノム解析は、2018年時点で時間にして1日、費用として10万円でできるほど進歩している

# リンク
[バイオ技術者・研究者になるには](http://www.perikansha.co.jp/Search.cgi?mode=SHOW&code=1000001793&type=3&flg=)
[PubMed　検索エンジン](https://pubmed.ncbi.nlm.nih.gov)
[ライフサイエンス辞書](https://lsd-project.jp)
[バイオインフォマティクス技術者](https://www.jsbi.org/activity/nintei/)
[みんなのバイオ学園](https://www.jba.or.jp/top/bioschool/)
[ライフサイエンスの広場](https://www.lifescience.mext.go.jp/)
[TOGO TV - DBCLS](https://togotv.dbcls.jp/)