OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub Pagesで作成したサイトのアクセス解析を行う

# したいこと

GitHub Pageの総閲覧数とかを知りたい


# やったこと

* GitHub Pagesでサイト作成
* Google Analyticsを用いてアクセス解析


# 方法

GitHub Pagesのサイトはあるという前提。
[こちらの記事](https://qiita.com/Rtakaha/items/d07ef75d8c90d035fa3b)を参考に作成した。

私のページは[こちら](https://chikurin66.github.io/github-pages/)

1. Google Analyticsにログイン
1. プロパティを追加
    1. 左下の[管理] をクリック
    1. [+ プロパティを作成] ボタンをクリック
        * プロパティ名: 適当に `github-pages` とした
        * タイムゾーン： 日本
        * 通貨: 日本円
    1. 作成
2.  [ウェブ] をクリック
    2. [ウェブサイトのURL]に解析したい自分の GitHub Page の URL を入力
    2. [ストリーム名] はあらかじめ 「ウェブサイト」 と入力されていたのでそのまま入力
    2. [ストリーム作成] ボタンをクリック

2. [データストリーム] > [ウェブ] > [ウェブサイト] をクリック（さっき作った名前のはず）
![スクリーンショット 2021-04-14 17.37.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1279682/aaf95d36-245e-987e-db1a-ec0f7ec19b4b.png)

2. ページ中段の [タグ設定手順] の [新しいページ上のタグを追加する] > [グローバルサイトタグ...]のプルダウンを開く
2. コピペして使えるコードが出てくるので、それをコピーし GitHub Pagesの index.htmlの <header>タグの中に書き込む

    ```html:
    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=[自分のID]"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());

      gtag('config', '[自分のID]');
    </script>
    ```

これで公開したらOK


# 結果

解析できてる！

![スクリーンショット 2021-04-14 17.46.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1279682/d6ef78b4-50b0-b45f-f71b-1eac040cb38d.png)


何か間違ってそうならコメントくださいー
SQLSTATE[HY000] [2002]No route to host CentOS7　でdocker上のMySQLに接続できなくなった

ホストのCentOS-7.3を再起動後、docker上のMySQLに接続できなくなった。

その際の備忘録。

###dockerの状態を確認

```SQL
$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running)
```

起動している。

###コンテナを確認

```docker
$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

起動しているコンテナなし

###停止しているものも含めてコンテナ確認

```
sudo docker ps -a
```
接続したかったコンテナが存在した。
コンテナが停止していたことがわかった。

コンテナの起動

```
$ sudo docker start コンテナ名
```
起動失敗。以下エラー文抜粋

```
 iptables: No chain/target/match by that name.
```

###iptables(ファイアーウォール)のルール確認

```
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   
```
dockerの設定がない

###dockerを再起動する
```
$ sudo systemctl restart docker
```

###再度iptables(ファイアーウォール)のルール確認
```
$ sudo iptables -L
```
dockerの設定が反映された

コンテナに接続後、MySQLへ接続できた。

####参考サイト

https://unskilled.site/%E3%83%9B%E3%82%B9%E3%83%88%E3%82%92%E5%86%8D%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%9F%E6%99%82%E3%81%AA%E3%81%A9%E3%81%ABdocker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84/

https://tihiro.hatenablog.com/entry/2018/04/12/075946

https://blue1st-tech.hateblo.jp/entry/2017/01/29/232733
AWSとは？AWSのメリット＆デメリット

**AWSとは**
Amazon Web Services（AWS）は、インフラストラクチャから機械学習まで、200以上のユニバーサル機能を備えたリソースを提供する最大のクラウドコンピューティングプラットフォームです。 これらの組み合わせ可能なシステムは、最大限の使いやすさを提供し、コンテンツ配信機能やデータストレージなどを通じてアプリケーションのパフォーマンスを最適化するために特別に設計されています。
AWSを使用すると、必要な支援の正確な量に対してのみ支払うため、生産性を損なうことなく、資本コミットメントが低くなり、価値実現までの時間が短縮されます。
**AWSのメリット**
•AWSを使用すると、組織はすでに使い慣れたプログラミングモデル、オペレーティングシステム、データベース、およびアーキテクチャを使用できます。
•これは費用対効果の高いサービスであり、事前または長期の契約なしに、使用した分だけ支払うことができます。
•データセンターの運営と維持にお金をかける必要はありません。
•迅速な展開を提供します
•容量を簡単に追加または削除できます。
•無制限の容量でクラウドアクセスを迅速に許可されます。
•総所有コストは、プライベート/専用サーバーと比較して非常に低くなっています。
•一元化された請求と管理を提供します
•ハイブリッド機能を提供します
•数回クリックするだけで、世界中の複数の地域にアプリケーションをデプロイできます
**AWSのデメリット**
•より迅速または集中的な支援が必要な場合は、有料のサポートパッケージを選択する必要があります。
•アマゾンウェブサービスでは、クラウドに移行するときに、いくつかの一般的なクラウドコンピューティングの問題が発生する可能性があります。たとえば、ダウンタイム、制限された制御、バックアップ保護などです。
•AWSは、リージョンごとに異なるリソースにデフォルトの制限を設定します。これらのリソースは、イメージ、ボリューム、およびスナップショットで構成されています。
•ハードウェアレベルの変更がアプリケーションに発生し、アプリケーションの最高のパフォーマンスと使用法を提供しない場合があります。
**AWSのベストプラクティス**
•失敗に備えて設計する必要がありますが、失敗するものはありません。
•[AWSサービス](https://kaopiz.com/ja-aws-cloud-service/)を使用する前に、すべてのコンポーネントを分離することが重要です。
•動的データを計算に近づけ、静的データをユーザーに近づける必要があります。
•セキュリティとパフォーマンスのトレードオフを知ることは重要です。
•時間単位の支払い方法でコンピューティング容量を支払います。
•予約するインスタンスごとに1回限りの支払いを行う習慣をつけ、時間料金の大幅な割引を受けます。
Possible missing firmware

更新処理をしたら下記のようなエラー（？）に遭遇。

```
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8125a-3.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168fp-3.fw for module r8169
```
新しいPCのセットアップがうまくいっていないときに出てきたので、これが原因なのかと思って解決方法を探したところ、下記の手順が簡単だった。

```
$ cd /lib/firmware/rtl_nic
$ sudo wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/rtl_nic/rtl8125a-3.fw
$ sudo wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/rtl_nic/rtl8168fp-3.fw
$ sudo update-initramfs -u -k all
```

下記サイトを参考にした。
https://forum.openmediavault.org/index.php?thread/34183-w-possible-missing-firmware-lib-firmware-rtl-nic-rtl8125a-3-fw/
CSVアップロード備忘録

主にCSVアップロード画面のエラーの表示の仕方について調べたので備忘録。

### Nablarch
Javaアプリケーションフレームワークのドキュメント
アップロード画面上部にエラーが複数行出力される形式。

https://nablarch.github.io/docs/LATEST/doc/application_framework/application_framework/web/getting_started/project_upload/index.html

### 宛名印刷
住所録アップロード
Nablarchと同様アップロード画面にエラーが表示される。

https://www.greeting-card.jp/atena_guide/upload/index.html

### かんがるーさんの日記
宛名印刷と同様アップロード画面にエラーが表示される。

https://ksby.hatenablog.com/?page=1443455063

### TopSeller
BtoB卸直送サイトのCSV発注エラー時のマニュアル
アップロード確認画面でエラーが複数行出力される形式。

https://teachme.jp/22699/manuals/760755

### kintone
ファイルの読み込み結果画面があり、エラーが複数行出力される形式。
画面の構成的に、おそらくアップロード処理は非同期。

https://jp.cybozu.help/k/ja/user/create_app/app_csv/add_app_failed.html



### ちなみに

フロントで処理しちゃおうという考え方もあります。
ただ、経験上、保守が難しいためあまりお勧めでは無いです。

https://qiita.com/kawasima/items/f80bc54efb12d5509c0b
pandas.DataFrame.applyを使って、DataFrameに複数列を一度に追加したい

# TL;DR

- `pandas.DataFrame.apply`のオプショナル引数に、`result_type="expand"`を指定する
- `pandas.DataFrame.apply`の引数の関数(ラムダ式)は、タプルまたはリストを返すようにする
- 代入式の左辺では、追加する列名をリストで指定する

```Python
def get_values(value0):
    # some calculation
    return value1, value2

df[["column1", "column2"]] = df.apply(
    lambda r: get_values(r["column0"]), 
    axis=1, 
    result_type="expand")
```

# 解説
適当なpandas.DataFrameがあるとします。

```Python
import pandas as pd

df = pd.DataFrame()
df["x"] = [1, 2, 3, 4, 5]
print(df)
```

```
   x
0  1
1  2
2  3
3  4
4  5
```

この`x`という名前の列を使って計算を行い、新たな列を作成したいとします。ベクトルのまま計算できる場合は簡単です。ここでは2乗を計算する場合を例に取ってみます。

```Python
df["x2"] = df["x"] ** 2
print(df)
```

```
   x  x2
0  1   1
1  2   4
2  3   9
3  4  16
4  5  25
```

もし新たな列の求める計算が複雑な関数で定義されており、ベクトルのまま計算できない場合には、`pandas.DataFrame.apply`を用いることができます。

```Python
def square(x):
    return x ** 2

df["x2"] = df.apply(lambda r: square(r["x"]), axis=1)
print(df)
```

もちろん結果は前と同じです。

さて、以下のような複数の値を返す関数を使って、複数列を同時に追加する場合はどうなるでしょうか？

```Python
def get_values(x):
    return x ** 2, x ** 3
```

次のように書くとエラーになります。

```Python
df[["x2","x3"]] = df.apply(lambda r: get_values(r["x"]), axis=1)
```

```
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-19-3039b5c1e701> in <module>
      1 def get_values(x):
      2     return x**2, x**3
----> 3 df[["x2", "x3"]] = df.apply(lambda r: get_values(r["x"]), axis=1)

(中略)

ValueError: Must have equal len keys and value when setting with an iterable
```

このエラーが起きている理由は、右辺の値を`print`することで分かります。

```Python
print(df.apply(lambda r: get_values(r["x"]), axis=1))
```

```
0       (1.0, 1.0)
1       (4.0, 8.0)
2      (9.0, 27.0)
3     (16.0, 64.0)
4    (25.0, 125.0)
dtype: object
```

2個の要素を持つタプルが入った(1列の)Seriesになってしまっています。
2列5行のDataFrameにするには、`result_type="expand"`を指定します。

```Python
df[["x2","x3"]] = df.apply(lambda r: get_values(r["x"]), axis=1, result_type="expand")
print(df)
```

```
   x    x2     x3
0  1   1.0    1.0
1  2   4.0    8.0
2  3   9.0   27.0
3  4  16.0   64.0
4  5  25.0  125.0
```

# 参考にしたリンク
https://stackoverflow.com/questions/23586510/return-multiple-columns-from-pandas-apply
pyhton 変数について

## 初めに
初学者です。アウトプットすることによって定着するのが目的です。間違いなどあればご指摘ください。

###変数について
変数とは？
まず、数値や文字列などにデータ類をまとめて`値`と呼びます。この値ですがプログラムを書いていると同じ値を何度も使ったりします。変数とは、この値を入れておく箱みたいなものです。
要するに、事前に値を変数に入れておくことによって、繰り返し使うことができます。また、変数に入れておくことによってコードも綺麗になります。

```python
test = 'ハロー'
print(test)
```
上記のコードでは、ハローが出力されます。詳しく書くと`変数testに文字列ハローを代入しろ。変数testを表示せよ`となり変数testのなかには文字列ハローが代入されているのでハローが出力されます。

###変数の命名規則について(変数名の付け方)
変数には命名規則があります。命名規則を大きく３つに分けて説明していきます。

1.数字のみ、先頭が数字の名前はだめ
これは数字のみだと数値と区別できなくなるからだそうです。また名前の先頭に数字を使うこともできません。
`123`とか`1age`などは命名することができません。

2.変数名は原則半角の小文字のみで書く
半角じゃなくてもエラーにはならないそうです。しかし、基本的にコードは半角で書きます。また、スペースが全角になるとエラーになってしまったりするため基本的には半角で書いた方が間違いは無いと思います。

3.予約後と同じ名前は禁止
例えば、`pyhton`では条件分岐があり、条件が間違っていたら`false`,あっていれば`true`を返します。これらの`false`や`true`はpythonではすでに別の目的で使うことが決まっているので使えないとうことです。主な予約語については公式のURLを乗せておきます。
[公式](https://docs.python.org/3/reference/lexical_analysis.html#keywords)


主に上記３点を意識してわかりやすい変数名をつけ重複しないようにしていれば、大きな間違いは無いかと思います。
TecoGAN で低解像度の動画を高解像度化

TecoGAN で低解像度の動画を高解像度化します。

環境はUbuntu20になります。
結構重いので、GPUを使うか、事前にffmpegで動画を縮小すると良いかもしれません。

````bash:install_tecogan.sh
#!/usr/bin/bash

# ==========================================================
# TecoGan 用に python3.6.8 を仮想環境にインストール
# ==========================================================
sudo echo ;
sudo apt-get install ffmpeg ;
sudo apt-get install python3-venv ;
sudo apt install -y \
  build-essential   \
  libffi-dev        \
  libssl-dev        \
  zlib1g-dev        \
  liblzma-dev       \
  libbz2-dev        \
  libreadline-dev   \
  libsqlite3-dev    \
  git ;
git clone https://github.com/pyenv/pyenv.git ~/.pyenv ;
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc ;
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc ;
echo 'eval "$(pyenv init -)"' >> ~/.bashrc ;
source ~/.bashrc ;
pyenv -v ;
pyenv install 3.6.8 ;
pyenv local 3.6.8 ;
pyenv versions ;

# ==========================================================
# TecoGAN のインストール
# ==========================================================
git clone https://github.com/thunil/TecoGAN ;
cd TecoGAN ;
python3 -m venv myvenv-topgan ;
source myvenv-topgan/bin/activate ;
python -m pip install pip -U ;
python -m pip install -r requirements.txt ;
python -m pip uninstall -y Keras Keras-Applications Keras-Preprocessing ;
python -m pip install keras==2.3.1 ;
python -m pip install tensorflow-gpu==1.14.0 ;
python runGan.py 0 ; # ライブラリ群をダウンロード
python runGan.py 1 ; # サンプルとして、LR/calendar に入っている画像を results/calendar に出力します。
# checck LR/calendar/*.png
# checck results/calendar/*.png

# ==========================================================
# 動画のダウンロードと動画を画像群化
# ==========================================================

# 動画のダウンロード（できればサイズは横幅240程度が望ましい）
# youtube-dl がない場合は下記コマンドでインストール
# sudo wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl ;
# sudo chmod a+rx /usr/local/bin/youtube-dl ;
youtube-dl https://www.youtube.com/watch?v=RmlSsON0oY0 ;

# 一旦前回分の削除
mkdir LR/calendar_back ;
cp LR/calendar/* LR/calendar_back ;
rm LR/calendar/*
rm results/calendar/* ;

# 動画を画像群化
ffmpeg -i "ドリフ大爆笑1983年op-RmlSsON0oY0.mkv" -vcodec png LR/calendar/%d.png ;

# 縮小して使用する場合
# ffmpeg -i "ドリフ大爆笑1983年op-RmlSsON0oY0.mkv" -vf scale=120:-1 "低解像度動画.mkv" ;
# ffmpeg -i "低解像度動画.mkv" -vcodec png LR/calendar/%d.png ;

# TecoGAN の実行
python runGan.py 1 ;
# checck results/calendar/*.png

# 画像群を動画化
ffmpeg -i results/calendar/output_%d.png -vcodec libx264 -pix_fmt yuv420p "最終結果動画.mp4" ;
````

####参考リンク

あとで記載します。
mxGraph一問一答

mxGraphを使っていて詰まったところを一問一答にしました。
思い出したら書き足します。

### 前提
Angular(typescript) v.10.1.0
mxGraph v.7.5.6
レイアウト：CompactTreeLayout

```javascript:typescript
import { mxgraph } from '../../../mxtypes';
const mx: typeof mxgraph = require('mxgraph')({
  mxBasePath: 'assets/mxgraph',
  mxImageBasePath: 'assets/mxgraph/images',
  mxLoadResources: false,
  mxForceIncludes: false,
  mxLoadStylesheets: false,
});
graph: mxgraph.mxGraph;
```

## 一問一答
##### 固定のツリーレイアウトで、ドラッグすると点線で枠が出る
`mxGraph.prototype.cellsMovable = true`になっているからですが、これを`false`にするとレイアウトが崩れます。
以下のように設定します。

```typescript:
this.graph.setCellsSelectable(false); // セルを選択できないようにする
mx.mxConstants.CURSOR_MOVABLE_VERTEX = 'default'; // カーソルを変更
mx.mxConstants.CURSOR_MOVABLE_EDGE = 'default'; // カーソル変更
```

##### ノードが増えるとグラフの上に空白ができる

```typescript:
mxCompactTreeLayout.prototype.moveTree = false
```


##### セルをダブルクリックすると編集できるような表示になる

```typescript:
this.graph.cellsEditable = false;
```
FizzBuzzをオブジェクト指向でやってみた

#FizzBuzzをオブジェクト指向的にやってみた
Qiita始めました
記念すべき初投稿は読んで字の如くです。コロナで籠らざる得なくなった時にポリモーフィズムを勉強したので自分なりのアウトプットしようと思い立ちました。間違っていたり考えが浅かったりするかもしれませんがご愛敬です。
##やってみる前に
###FizzBuzzとは
英語圏せんだみつおゲームの様なもの

数人で数字を読み上げていき
3で割れる数字は「Fizz」
5で割れる数字は「Buzz」
3でも5でも割れる数字は「FizzBuzz」
を数字の代わりに読み上げる

詰まったり言い淀んだら負けという暇つぶしに丁度良さげな難度のゲームです。
先人達はこの題材で色々な縛りを課してプログラミングするみたいですが今回は特に縛りはありません。強いて言うならオブジェクト指向的にプログラミングしていきます。
###オブジェクト指向的にとは
オブジェクト指向 ≒ 値や処理の塊を人の理解できる形にする表現方法
と自分は解釈しています。そのことを反映してプログラミングしていきます。
今回はJavaを使いFizzBuzzというゲームを表現してみたいと思います。
##やってみよう
###メイン

```java:main.java
public class Main {
    public static void main(String[] args) {
        Game fizzBuzzGame = new Game();
        fizzBuzzGame.setCount(20);
        fizzBuzzGame.start();
    }
}
```
これだけです。ゲームクラスを呼び出しそのインスタンスに対して数を設定し開始する。
実行すると以下の出力が取れます。

```
GameStart!!
1
2
Fizz!
4
Buzz!
Fizz!
7
8
Fizz!
Buzz!
11
Fizz!
13
14
FizzBuzz!
16
17
Fizz!
19
Buzz!
```
うまくいってそうですね。
注目点はメインでは**ゲームクラスを扱うだけで全て終わらせている**事です。コードを見辛くするif文やfor文は登場しません。
###ゲームクラス
```java:Game.java
class Game {
    private int count;

    public void setCount(int count) {
        this.count = count;
    }
    public void start() {
        System.out.println("GameStart!!");
        for (int i = 1; i <= count; i++) {
            System.out.println(FizzBuzzBase.fizzBuzzCreate(i).call);
        }
    }
}
```

先程扱ったゲームクラスです。こちらは内部変数としてint型の`count`とそのセッター、スタートメソッドを持ちます。クライアントで扱う部分のクラスになります。
スタートメソッドは開始の合図と`count`変数分`System.out.println`を実行します。
注目点はスタートメソッド内のfor文のprintln内の部分になりますが下記のFizzBuzzクラスで解説します。
###FizzBuzzクラス

```java:FizzBuzz.java(抽象クラス)
abstract class FizzBuzzBase {
    protected String call ;
    
    public static FizzBuzzBase fizzBuzzCreate(int i) {
        if( i%3 == 0 && i%5 == 0){
            return new FizzBuzz();
        }else if(i%3==0){
            return new Fizz();
        }else if(i%5==0){
            return new Buzz();
        }
        return new Normal(i);
    }
}
```
抽象クラスFizzBuzzBaseです。実装クラスの継承元となります。
クラス内変数`call`を持ちます。実装クラスで持つか悩みましたが`count`に対して返すクラス１つなのでクラス内変数で１つ持てばいいかと思いこの形になりました。
もう一つは静的メソッド `fizzBuzzCreate `です。これは実装クラスのファクトリーメソッドです。継承した４つの実装クラスのうちどれかを返します。どの条件にも当てはまらない場合`Normal`クラスを返します。この部分の条件式がFizzBuzzのルールの部分となります。

```java:FizzBuzz.java(実装クラス)
class Fizz extends FizzBuzzBase{
    Fizz(){
        call="Fizz!";
    }
}
class Buzz extends FizzBuzzBase{
    Buzz(){
        call="Buzz!";
    }
}
class FizzBuzz extends FizzBuzzBase{
    FizzBuzz(){
        call="FizzBuzz!";
    }
}
class Normal extends FizzBuzzBase{
    Normal(int i){
        call= String.valueOf(i);
    }
}
```


抽象クラスFizzBuzzBaseを継承した各クラス

+ Fizz
+ Buzz
+ FizzBuzz
+ Normal


実装クラスはコンストラクタのみ用意されその中でクラスに応じた文字列を`call`変数へ代入します。
後は呼び出しもとでcall変数を読み出せば先程の出力が得られます。これでオブジェクト指向っぽく？完成です。
`System.out.println(FizzBuzzBase.fizzBuzzCreate(i).call);`
##やってみて
**普通にif文書けばよくね？**
普通に書けばif文を書いて終わりのところをこねくり回したのでコード量がかなり増えましたね（汗）
シンプルなルールなので現状だとオブジェクトで扱うことの良さが紹介できなかった気がします。でも扱ってみると面白いです多態性。ポリモーフィズム万歳！
お付き合いいただいてありがとうございます。お疲れ様でした。
RHELのサブスクリプションマネージャってどうすりゃいいの

# インターネットに接続できないRHELのサブスクリプションマネージャってどうすりゃいいの

## 参考リンク

https://access.redhat.com/documentation/ja-jp/red_hat_subscription_management/1/html/rhsm/index

https://access.redhat.com/documentation/ja-jp/red_hat_subscription_management/1/html/rhsm/yum-disable
構造生成メモ


BRICSを用いて、種構造から新規構造を生成

![スクリーンショット 2021-04-14 16.53.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475723/c1738b5d-d13a-0888-bb41-c2c6791efdc8.png)


```python:test.py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from rdkit import Chem
from rdkit.Chem import Draw, BRICS

def main():    
    df = load_data('smiles_list.csv')   
    components = make_fragments(df['mol'])
    generated_mols = generate_mols(components)
    generated_mols_to_csv(generated_mols)
    draw_generated_mols(generated_mols)

def load_data(file_name):
    df = pd.read_csv(file_name)
    df['mol'] = list(map(lambda x: Chem.MolFromSmiles(x), df['SMILES']))
    return df
    
def make_fragments(mols):
    allfrags = set()
    for mol in mols:
        frag = BRICS.BRICSDecompose(mol)
        allfrags.update(frag)
    frags_mol = [Chem.MolFromSmiles(f) for f in allfrags]
    return frags_mol

def generate_mols(frags_mol):
    builder = BRICS.BRICSBuild(frags_mol)
    print('building mols...')
    generated_mols = []
    for i in range(1000):
        try:
            m = next(builder)
            m.UpdatePropertyCache(strict=True)
            generated_mols.append(m)
        except StopIteration:
            pass
    np.random.shuffle(generated_mols)  
    return generated_mols
    
def generated_mols_to_csv(generated_mols):
    generated_mols_df = pd.DataFrame({'mol': generated_mols})
    generated_mols_df['SMILES'] = list(map(lambda x: Chem.MolToSmiles(x), generated_mols_df['mol']))
    generated_mols_df.to_csv('generated_mols.csv')

def draw_generated_mols(mols):
    fig = Draw.MolsToGridImage(mols[:50], molsPerRow=3, subImgSize=(300,150))
    fig.save('generated_mols.png')
    fig.show()

if __name__=='__main__':      
    np.random.seed(1234)
    main()
```

smiles.csvを同じ階層に準備しておく

```smiles.csv
SMILES
C1CCCCC1
c1ccccc1
N[C@@H](C)C(=O)O
C/C=C/C
C1=CC2=CC3=CC=C(N3)C=C4C=CC(=N4)C=C5C=CC(=N5)C=C1N2
COC(=O)C(\C)=C\C1C(C)(C)[C@H]1C(=O)O[C@@H]2C(C)=C(C(=O)C2)CC=CC=C
CC[C@H](O1)CC[C@@]12CCCO2
```
Rails モデル作成時に関連付け(1対多の場合)

####※ 関連付け（アソシエーション）とは
テーブル間の関係を、モデル上の関係として操作できるようにする事。

###【モデル作成時に関連付けを設定する方法】
例として、1人のユーザー(Userモデル)が多くのつぶやき(Tweetモデル)を作成する場合。
※Userモデルはすでに存在しているものとします。

####1. Modelの作成
```$ rails g model Tweet content:string user:references```
``` user:references```の指定で、Tweetモデルにuser_idカラムが作成されます。
※references＝参照

####2. 作成されたマイグレーションファイルの確認

```rb:20210414_create_tweets.rb
class CreateTweets < ActiveRecord::Migration[5.2]
  def change
    create_table :tweets do |t|
      t.string :content
      t.references :user, foreign_key: true
      # foreign_key: true 👈 外部キー制約

      t.timestamps
    end
  end
end
```
※外部キー制約：
　1.　Usersテーブルに存在しない値を外部キーとして登録不可
　2.　Tweetsテーブルの外部キーに値が登録されているUsersテーブルのレコードは削除不可

####3. マイグレーション実行
```rails db:migrate```

####4. shema.rbで確認

```rb:app/db/schema.rb
create_table "tweets", tweets: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "content"
    t.bigint "user_id"  # reference型でuser_idカラム生成
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["user_id"], name: "index_opinions_on_user_id"
end
```

####5. Tweetモデルを確認・Userモデルを編集

```rb:app/models/tweet.rb
class Tweet < ApplicationRecord
  belongs_to :user
end
```
作成された```tweet.rb```にはuserに属する（belongs_to）が記述されます。
これに対して、Userモデルにtweetを所有する(has_many）を追記します。

```rb:app/models/user.rb
class User < ApplicationRecord
  has_many :tweets, dependent: :destroy
  # 多数のつぶやきを持つ為、tweetsと複数形にする
end
```
※```dependent: :destroy```は、先に書いた外部キー制約でエラーが出ない為の設定。
　これにより、Userが削除された場合、属するtweetsも削除されます。

以上の設定で、```User has many Tweets```、```Tweet belongs to user```の関連付けができます。

#### 関連付けしていない・している場合の例
ユーザーのつぶやきを取得
・関連付け無し場合

```rb
@user = User.find(params[:id])
Tweets = Tweet.where(user_id: @user.id)
```
・関連付けした場合

```rb
@user = User.find(params[:id])
Tweets = @user.tweets
```
省略できますね！
初期化パラメータを動的に変更可能かどうか調べる

～構文～
select name, issys_modifiable from v$parameter where name='<パラメータ名>';

サンプル文）
col name format a30
select name, issys_modifiable from v$parameter where　name='job_queue_processes';

参考サイト
https://yohei-a.hatenablog.jp/entry/20100412/1271057353

また、初期化パラメーターのマニュアルページの「変更の可/不可」が「いいえ」又は「変更不可」となっているものは静的パラメータなので動的に変更不可となる。
【就活用・報告】面接時に逆質問は無理にしなくても、ケースバイケースですが合格します

#本記事はタイトルのまんま
面接には必ずと言っていいほど、逆質問の機会が設けられています。

逆質問何をしようかなって悩む転職者の方も多いかと思います。

私もその１人でした。

企業によっては無理して考え質問した結果、不採用になった企業もありました。
それが原因ではないかと思いますが、、、

なので、いっそのこと逆質問をしないでおこうと思って面接を受けた3社があります。
仮説検証を兼ねて勇気のある行動でした。

面接官：「〜〜さんから何か質問ありますか？」

　　私：「特にありません」

面接官：「そうですか、、、」

結果全ての面接合格で、内定までいきました。

もちろん逆質問をしないなんて、内に興味がないのかと思われてマイナスな印象も与えることもあると思います。

無理して変な質問をしてしまうよりも、言わない方がいいということです。

合格理由は逆質問までの過程でカルチャーマッチ等で合格になったとのだと思います。

##しかし、逆質問しないのはもったいない！！
とういうのは逆質問で熱意や思考等のアピールができるからです！

なのでこんな記事作っておきながらいうのあれですが、逆質問は準備してのぞみましょう！！！

以上です。
translation missing: ja~ 系のエラー。日本語、英語どちらも対応させる。

##前提知識
https://railsguides.jp/i18n.html

## なぜこのエラーが出たのか
###ja.yml内に、該当する値が存在しないから

以前Fakerを日本語化したため、Railsアプリのデフォルトが日本語になっていた。

```ruby:application.rb
    config.i18n.available_locales = %i[ja en]
    config.i18n.default_locale = :ja
```
↓
Rspecを行った。

```ruby:spec/models./post_spec.rb
 it 'is invalid without a title' do
     post = Post.new()
     post.valid?
     expect(post.errors.messages[:title]).to include('can`t be blank')
  end
```
↓
エラー発生

```console
 Failure/Error: expect(post.errors.messages[:title]).to 
include('Can not be blank')
expected #<ActiveModel::DeprecationHandlingMessageArray(["translation missing: ja.activerecord.errors.models.post.attributes.title.blank"])> to include "Can not be blank"
```

大事なところ

```
translation missing: 
ja.activerecord.errors.models.post.attributes.title.blank"
```
↓
####ja.ymlのja.activerecord.errors.models.post.attributes.title.blankに対する値がないというエラー。

##解決方法
ja.ymlにエラーに書かれている内容通りに設定する
"ja.activerecord.errors.models.post.attributes.title.blank"

```ruby:ja.yml
ja:
  activerecord:
    errors:
      models:
        post:
          attributes:
            title:
              blank: "タイトルが空白です"

```

rails cで確認してみる

```console
pry(main)> I18n.t("activerecord.errors.models.post.attributes.title.blank")
=> "タイトルが空白です。"
```

rspecを直す

```ruby:spec/models./post_spec.rb
 it 'is invalid without a title' do
     post = Post.new()
     post.valid?
     - expect(post.errors.messages[:title]).to include('can`t be blank')
     + expect(post.errors.messages[:title]).to include(I18n.t("activerecord.errors.models.post.attributes.title.blank"))

  end
```

Rspec無事通りました。


参考:
  https://railsguides.jp/i18n.html#%E8%A8%B3%E6%96%87%E3%81%AE%E5%8F%82%E7%85%A7
          https://qiita.com/punkshiraishi/items/bdb2d48425782e25eadc
          https://qiita.com/shimadama/items/7e5c3d75c9a9f51abdd5
          https://pikawaka.com/rails/i18n
NuGet パッケージファイル (.nupkg) をエクスプローラーで開く

# NuGet パッケージファイル (.nupkg)

.nupkg 拡張子のファイルは Zip 形式で圧縮されたファイルなので、拡張子を .zip に変更して解凍すれば展開することができる。

エクスプローラーでそのまま開けるようにするために、右クリックメニューの [プログラムから開く] から Windows 標準の解凍方法に関連付けようとしてもできない。

そのためコマンドプロンプト (管理者として実行) で以下のコマンドを実行して関連付ける。

```shell
assoc .nupkg=CompressedFolder
```


# 参考サイト

- [NuGetをさらに便利に使う方法とパッケージの公開](https://www.atmarkit.co.jp/fdotnet/chushin/nuget_02/nuget_02_02.html)
- [ある拡張子のファイルをWindows標準の圧縮解凍機能に関連付けしたい](https://pg.hatenadiary.com/entry/2015/09/06/160211)
TypeScriptのwatchとincrementalがとてつもなく遅い問題

TypeScriptのソースコードが大きかったり再起型を使っていたりすると、`--incremental`や`--watch`が普通のコンパイルに比べてとても遅くなるというバグがTypeScriptにあります。自分の関わるプロジェクトでも`--diagnostics`をつけたときに`Symbols`が50万を超えるもので、`--incremental`をつけたときのキャッシュのないビルドが2倍になる(80秒→155秒)というものを観測しています。

Microsoft/TypeScript に出ているissue:
[Build watch takes 30x as long as cold build, high transformTime](https://github.com/microsoft/TypeScript/issues/35729)

これはIssueがOpenされた少なくとも2年前から`--watch`で起きている問題で、同じロジックを使っている`--incremental`も同じ問題を抱えています。

2021年に入りwebpackの作者のsokraがこの問題を解決するプルリクエストを出していて、ほとんどのケースで`--incremental`が1秒遅い程度までに改善しています。
[Make initial incremental/watch builds as fast normal builds](https://github.com/microsoft/TypeScript/pull/42960)

[このPRの内容を簡易化したPR](https://github.com/microsoft/TypeScript/pull/43314)が別でマージされ、4.3にリリースされる見込みです。現在でも`typescript@next`に含まれていて試すことができます。`--incremental`や`--watch`が遅いと感じている人はぜひ。
kaggle 上のデータセットを cli でダウンロードする

# kaggle のデータセットをダウンロード
ブラウザ経由でダウンロードしてもよいが、
GUIを触りたくなかったり、スクリプト化するときにはCLIの方が便利なので
メモ用として記載。

ダウンロードには公式の kaggle-apiを利用する
https://github.com/Kaggle/kaggle-api


# kaggle-api のインストール
kaggle 公式の cli ツール

```
pip install kaggle --upgrade
```

# 認証情報の登録
以下にアクセスし、
https://www.kaggle.com/<username>/account
API > Create New API Token をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69701/b18e3abb-e357-def3-a0ff-50863ad354e0.png)


`kaggle.json` をダウンロードし、
`~/.kaggle/kaggle.json` へ配置
アクセス権限を変更
`chmod 600 ~/.kaggle/kaggle.json`

あるいは、内容を export しても良い

```
export KAGGLE_USERNAME=datadinosaur
export KAGGLE_KEY=xxxxxxxxxxxxxx
```



# download

Usage:

```
kaggle competitions {list, files, download, submit, submissions, leaderboard}
kaggle datasets {list, files, download, create, version, init}
```



### 例: image-net のダウンロード
以下のページにアクセスして、利用規約に同意を行う
https://www.kaggle.com/c/imagenet-object-localization-challenge/data

以下のコマンドを実行

```
kaggle competitions download -c imagenet-object-localization-challenge
```

必ずしも、 kaggle datasets download コマンドを利用するとは限らないので、
利用したいものがある場合、該当ページでダウンロード方法を確認すると良い


### 例 tiny-imagenet のダウンロード

```
kaggle datasets download akash2sharma/tiny-imagenet
```
【Pythonメモ】実行中のファイル・そのファイルの入ってるディレクトリ・カレントディレクトリ・相対パスで指定したファイル　の絶対パスの取得

しょっちゅう忘れてしまうのでまとめておきます。
Windows10
Python3.8.5
virtualenv

以下のフォルダ構成になっています。
C:\Users\user\Desktop\TEST\asai\hukai\get_abspath.py
TESTをカレントディレクトリとし、ここから２つ下の階層に置いてあるget_abspath.pyを実行します。

##実行中のファイルとディレクトリの取得



```get_abspath.py

import os

#実行しているpythonファイルの絶対パス
current_pyfile = os.path.abspath(__file__)
#実行しているpythonファイルが入ってるディレクトリの絶対パス
current_pyfiles_dir = os.path.dirname(current_pyfile)
#カレントディレクトリの絶対パス
current_dir = os.getcwd()

print(current_pyfile)
print(current_pyfiles_dir)
print(current_dir)
```

実行結果

```
(venv) C:\Users\user\Desktop\TEST>python asai\hukai\get_abspath.py
C:\Users\user\Desktop\TEST\asai\hukai\get_abspath.py
C:\Users\user\Desktop\TEST\asai\hukai
C:\Users\user\Desktop\TEST
```
##ファイルのパス生成と存在チェック


os.path.abspath()というコマンドを使うと、与えたファイル名で絶対パスを生成してくれます。ここでは存在しないファイルでも扱えます。
さきほどと同じ場所にget_usopath.pyを書いて実行してみます。
C:\Users\user\Desktop\TEST\asai\hukai\get_usopath.py

```get_usopath.py
import os

#存在しないファイルを指定して絶対パスを生成
poem_path = os.path.abspath("./uso_dir/poem.txt")
#そのファイルが入ってるディレクトリの絶対パス
poems_dir_path = os.path.dirname(poem_path)

print(poem_path)
print(poems_dir_path)

#上の2つのパスの存在チェック
print(os.path.isfile(poem_path))
print(os.path.isdir(poems_dir_path))
```

```
(venv) C:\Users\user\Desktop\TEST>python asai\hukai\get_usopath.py
C:\Users\user\Desktop\TEST\uso_dir\poem.txt
C:\Users\user\Desktop\TEST\uso_dir
False
False
```

##参考
https://note.nkmk.me/python-os-basename-dirname-split-splitext/
gradleのbuildSrc下でspring-bootのversionを指定

やったら動いた程度なので実際に使用する場合は注意してください。

gradleは少なくとも```6.8.3```は```gradle init```でsubproject有りを生成すると、共通定義はpluginに持つようになっている（詳細は https://docs.gradle.org/6.8.3/samples/sample_building_java_applications_multi_project.html ）。従来は```allprojects```とか```subprojects```を使用していたし、ぐぐるとこの例はたくさん出てくる。が、こちらの例はまだ少ないように見える。

このbuildSrc下の```build.gradle```でspring-bootの(bomの)versionを指定する方法について。

以下のように```spring-boot-dependencies```を指定する。

```gradle:buildSrc/src/main/groovy/asdgradle.java-common-conventions.gradle
dependencies {
   implementation platform("org.springframework.boot:spring-boot-dependencies:2.4.4");
  ...
```

### 上手くいかなかったこと

最初は以下のように```xxx.java-common-conventions.gradle```にspring-bootのpluginを定義すれば良いのかな、と思った。

```gradle:buildSrc/src/main/groovy/xxx.java-common-conventions.gradle
plugins {
  id 'org.springframework.boot' version '2.4.4'
  ...
```

しかし、これはエラーになる。このpluginはprecompiledされるから、これに含まれるpluginのversionは書けない、ものらしい（良く分かって無い）

```
* What went wrong:
Invalid plugin request [id: 'org.springframework.boot', version: '2.4.4']. Plugin requests from precompiled scripts 
must not include a version number. Please remove the version from the offending request and make sure the module
containing the requested plugin 'org.springframework.boot' is an implementation dependency
```
UISplitViewControllerの優良サンプルソースコード

UISplitViewControllerの、わかりやすいサンプルソースコードに、なかなか辿りつかなかったので、自分用メモなリンクを共有しておきます。

記事　UISplit​View​Controller
https://nshipster.com/uisplitviewcontroller/

ソース
https://github.com/NSHipster/UISplitViewController-Example
ModSecurity を Ubuntu の Apache2 で使う

こちらにある方法を、Ubuntu 20.04 で確認しました。
[How to Set Up ModSecurity with Apache on Debian/Ubuntu](https://www.linuxbabe.com/security/modsecurity-apache-debian-ubuntu)

```bash
sudo apt install libapache2-mod-security2
sudo a2enmod security2
sudo systemctl restart apache2
```

security2 が有効になったことの確認

```text
$ ls /etc/apache2/mods-available/ | grep security2
security2.conf
security2.load
```

modsecurity.conf の設定

```bash
cd /etc/modsecurity
sudo mv modsecurity.conf-recommended modsecurity.conf
```

```text:/etc/modsecurity/modsecurity.conf
SecRuleEngine On
（省略）
SecAuditLogParts ABCEFHJKZ
（省略）
```

Apache2 を再起動

```bash
sudo systemctl restart apache2
```

ルールのダウンロード

```bash
wget https://github.com/coreruleset/coreruleset/archive/v3.3.0.tar.gz
tar xvf v3.3.0.tar.gz
```

ダウンロードしたルールの設定

```bash
sudo mkdir /etc/apache2/modsecurity-crs/
sudo mv coreruleset-3.3.0/ /etc/apache2/modsecurity-crs/
```

```bash
cd /etc/apache2/modsecurity-crs/coreruleset-3.3.0/
sudo mv crs-setup.conf.example crs-setup.conf
```

```text:/etc/apache2/mods-enabled/security2.conf
#       IncludeOptional /usr/share/modsecurity-crs/*.load
        IncludeOptional /etc/apache2/modsecurity-crs/coreruleset-3.3.0/crs-setup.conf
        IncludeOptional /etc/apache2/modsecurity-crs/coreruleset-3.3.0/rules/*.conf
```

Apache2 の設定が正しいか確認

```bash
sudo apache2ctl -t
```

Apache2 を再起動

```bash
sudo systemctl restart apache2
```

ModSecurity の運用を一時的に止めたい時は、次のようにしてから、apache2 を再起動。

```text:/etc/modsecurity/modsecurity.conf
SecRuleEngine Off
（省略）
```
【Excel】どうも A1:B2 のコロンと A:B のコロンは別物っぽい

Excel$\\:$で遊んでたら思わぬ知見を得た。

## TL; DR

結論だけ, 書く。

- `A1:B2`のコロンは「演算子」。 「範囲の結び」を意味し, 「範囲の交わり」を意味するスペース演算子と対になる。
- `A:B`のコロンは「リテラルの一部」。 `/[A-Z]+:[A-Z]+/`形式の「列範囲リテラル」と`/[0-9]+:[0-9]+/`形式の「行範囲リテラル」が存在していて, これらのコロンは不可分。

## なぜ違うと言える?

`A1:B2`のコロンの前後にスペースを入れても問題なく動く(フォーマッターによってスペースは削除されるが)。

一方で`A:B`のコロンの前後にスペースを入れると`#NAME?`エラーとなる。

また, 戯れに`A1:B2:C3`のように記述しても有効な参照となるようだ。

しかし`A:B:C`では無効になる。

`A:B`形式は二つしか取れないのかと思いきや`A:B:C:D`は有効なのである。

## ここで思いつく

`#NAME?`エラーは未定義名称エラーだが, `A`や`B`の名前が定義されていないのに`A:B`が有効だというのなら, どうも`A:B`で一塊の記述らしい。

さらに思いついたのだがもしや`A1:B2`で使われるほうの`:`は参照に対する二項演算子なのではないか? もしそうだとすればすべてに説明がつく。

`A1:B2:C3`という式は$\\: {\left(\text{A1} \mathbin{:} \text{B2}\right)} \mathbin{:} \text{C3} \\:$のように解釈されるので有効な参照となる。

一方で`A:B:C`は`A:B`で一塊であるため$\\: \text{A:B} \mathbin{:} \text{C} \\:$と解釈されるが`C`が未定義のため`#NAME?`エラーとなる。

そして`A:B:C:D`は$\\: \text{A:B} \mathbin{:} \text{C:D} \\:$と解釈される有効な参照であるわけだ。

## 二項演算子としての`:`の意味は?

では二項演算子としての`:`の正確な意味とはなんだろうか? 公式ではふたつのセルの間にある範囲を表す書き方と説明されているが, 実際にはひとつのセルへの参照のみならず範囲全般に使える演算子のため他の表現を考えなければならない。

簡潔かつ紛れのない定義として, 「ふたつの範囲の結び」とするのがよいだろう。 結びというのは数学の束論ででてくる用語であり, 最小上界という言い方もできる。

具体的に説明しよう。 範囲には順序関係がある。 大小関係と言い換えてもいいだろう。

大小関係と言っても, ここで定義するのは面積の大きさ(セルの数)ではない。

> **定義** 範囲$\\: R \\:$上の順序関係$\\: \preceq \\:$を以下のように定める。
>
> 二つの範囲$\\: x, y \in R \\:$が$\\: x \preceq y \\:$を満たすとは, $x \\:$に含まれるセルがすべて$\\: y \\:$に含まれていることをいう。

いいかえれば$\\: y \\:$は$\\: x \\:$を完全に覆うということである。 この定義では順序関係を定義できない範囲の組が存在するが, これについては問題ない(半順序集合という)。

さて, ここでふたつの範囲に対する上界を考えることができる。 上界とは, $x \preceq z \\:$かつ$\\: y \preceq z \\:$であるような$\\: z \\:$のことであり, このような$\\: z \\:$は無数にある(いや, 実際には$\\:$Excel$\\:$の限界があるが)。

このなかで最小の……つまりどのような$\\: z_n \\:$に対しても$\\: z_0 \preceq z_n \\:$を満たすような$\\: z_0 \\:$のことを最小上界, ないし結びとよぶ。

言葉での定義では難しくてもビジュアライズされるとわかりやすいだろう。 $x \mathbin{:} y \\:$は$\\: x \\:$と$\\: y \\:$の両方を完全に覆うような最小の範囲である

![コロン演算子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241027/1afa0f98-89c6-86e3-5fcb-4fdb1f4c7bd9.png)

結び(最小上界)と対になる概念として交わり(最大下界)が存在する。 これはまさしくスペース演算子である。 スペース演算子の知名度は多分低いので覚えて帰ってほしい。

![スペース演算子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241027/8d366c11-3834-c0a5-a16c-0e37bb9c4fac.png)
【ExtJS】個人用記事

Ext JSに関する参考サイトリンク先

- ExtJSの基礎的な文法など
    - [「Sencha Frameworkの利用（基礎編）」](https://www.xenophy.com/learning_place/)
- ExtJSのサンプル（ソースコード付）
    - [「EXT JS Examples」](https://examples.sencha.com/extjs/6.5.3/)
- ExtJSの公式API
    - [「EXT JS API Document（英語）」](https://docs.sencha.com/extjs/4.2.3/#!/api)
IDとNAMEを入力→DBにINSERT→SELECTしたデータをDataGridViewで出力

```search.vb
'SqlClientクラスを使う（SqlClientクラスはSQLserver用のクラスである）
Imports System.Data.SqlClient

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim id As Integer = TextBox1.Text
        Dim name As String = TextBox2.Text

        'Windows認証でSQLserverに接続する
        Dim cn As New SqlConnection(
        "Data Source=hoge;" +
        "Initial Catalog=DB名;" +
        "Integrated Security=True")

        'textboxに入力した値を、データベースにinsertする(「@カラム名」記述する)
        Dim cmd As New SqlCommand("insert into dbo.EMPLOYEES values(@id, @name)", cn)
        cmd.Parameters.Add(New SqlParameter("@id", id))
        cmd.Parameters.Add(New SqlParameter("@name", name))

        cn.Open()
        cmd.ExecuteNonQuery()
        cn.Close()


        'datagridviewでデータベースを表示
        Dim strSQL As String
        Dim SQLDA As SqlClient.SqlDataAdapter
        Dim SQLDS As New DataSet()

        strSQL = "select * from dbo.EMPLOYEES"

        Try
            SQLDA = New SqlClient.SqlDataAdapter(strSQL, cn)
            SQLDA.Fill(SQLDS, "dbo.EMPLOYEES")
            Me.DataGridView1.DataSource = SQLDS.Tables("dbo.EMPLOYEES")

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

    End Sub

End Class

```
railsでCSSをpreloadさせる

## stylesheet_link_tag に preload を付与する。
PageSpeedInsight のスコアアップのために
rails で CSS をプリロードさせてファーストビューのレンダリング速度をあげたい。

`stylesheet_link_tag` に media onload rel preload 属性を付与してあげる。


```erb:変更前.erb
<%= stylesheet_link_tag　'app_basic', media: 'all' %>
```

```erb:変更後.erb
<%= stylesheet_link_tag 'app_basic', media: 'all', onload: "this.onload=null;this.rel='stylesheet'", rel: 'preload', as: 'style' %>
<noscript><%= stylesheet_link_tag 'app_basic' %></noscript>
```

preload に対応していないブラウザがあるため、noscriptタグで通常のCSS読み込み処理を書いてあげれば完成。

Chromeの場合は設定から、javascriptを許可しないモードにすればデバッグできます。


## 参考

https://tech.basicinc.jp/articles/171

https://qiita.com/rana_kualu/items/95a7adf8420ea2b9f657
cronの書き方を学ぶ


node.jsで定期実行コマンドを作りたかったので、
`cron-node`を使ってcronを書こうと思ったのですが、

```js
const job = new CronJob('0 */10 * * * *', function() {
   ...
});
```

`0 */10 * * * *` ってなんだったっけ...🧐
となったので、cron操作を軽くまとめておきます。

## アスタリスクだらけの基礎

`* * * * *`
こちらがcronの指定の基礎コマンドです。
この指定で、毎分コマンドが実行されます。

左から順に、 **分、時、日、月、曜日** となります。
曜日は数字指定で`0-7`で指定でき、 0,7は日曜日を指します。


## 毎月、毎日といった指定方法
先ほど言ったように、

```
分 時 日  月 曜日
*  *  *  *   *
```
の順に指定すればOKです。
そして、 `*` は全てが指定されているという考え方です。

```
30 12 *  *  *
```
この指定だと毎日12:30に実行されます。

```
30 12 4
```
この指定だと毎月4日12:30に実行されます。

数字は複数指定も可能です。

```
1,5 * * * *
```
上記だと毎時間1分と5分の二回実行されます。

```
1-3 * * *
```
上記だと毎時1分、2分、3分の三回実行されます。



## ..ごとに実行といった指定方法
`/数字` で指定することができます。

```
* */1 * * *
```
これは時の部分にスラッシュがあるため、毎時0分一時間おきの実行になります。

## 組み合わせ

```
* 10-16/2 * * *
```

10〜16時の間の2時間ごとに実行されます。

## `*`が六つある場合は!?
https://www.npmjs.com/package/cron
npmにあるcronは`*`が6つ指定できますが、
これは秒単位で指定できます。

```
秒 分 時 日  月 曜日
*  *  *  *  *   *
```

## 参考
https://blog.mothule.com/tools/how-to-use-cron
https://www.kagoya.jp/howto/rentalserver/cron/
クラスファイル内　コンスタントプールの動きString&Integer

####javap　クラスファイルの確認
####詳細に見るために javap -vのオプションをつける![スクリーンショット 2021-04-14 13.13.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017861/2e7700c3-a8dd-13ff-c127-d6f8d9ec2af0.png)


Equals2.classの中身をみる![スクリーンショット 2021-04-14 13.14.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017861/736a6802-2a41-bd8a-0729-614ad3455ebd.png)

コンスタントプールの確認![スクリーンショット 2021-04-14 13.18.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017861/6cfdd729-cef9-8a94-9b23-4ea7a779fad5.png)

String a = "sample"
String b = "sample"

定数化されコンスタントプールに保存されて使いまわしが行われる
コンスタントプールに入っているかの確認


![スクリーンショット 2021-04-14 13.24.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017861/50239fa9-c5d2-2acf-a364-880d7b5bd682.png)

![スクリーンショット 2021-04-14 13.48.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017861/8dd2e6b2-7d6a-6639-ceed-b4a8f9253287.png)




+補足

よく使われる値/文字列リテラルなどはメモリを無駄にしないために使い回しをしようとする
コンパイルするとコンスタントプールにロードが行われる
IntegerクラスやDoubleなどのラッパークラスも同じような仕掛けを持っている



var a = new String("apple")
var b = new String("apple")では
定数化されず同じ文字列でも使い回しは行われない
上の画像を見てわかるようにappleは別の場所にいる
ここにいた
![スクリーンショット 2021-04-14 13.25.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017861/3fb40996-2867-00cd-31be-2545fb082c59.png)

```Main3_12.java

package chap3;

public class Main3_12 {

	public static void main(String[] args) {
		var a = "sample";
		var b = "sample";
		System.out.println( a == b);
		System.out.println(", ");
		System.out.println(a.equals(b));

		//これだと違う番地になるので==はfalseになる
		var x = new String("apple");
		var z = new String("apple");

		System.out.println(x == z);//false同じアドレスにはいないけど内容は同じだよねってこと
		System.out.println(x.equals(z));//true
	}

}


```

![スクリーンショット 2021-04-14 13.44.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017861/9653ea1b-a0a2-a9bd-f057-e3ffd579c857.png)

Integerだと−127~127まではコンスタントプールに入り
１２８からは入らない


![スクリーンショット 2021-04-14 13.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017861/1f552d5f-4e29-3c30-9099-94d77c4b2b43.png)



####使い回しをしていく仕掛けがコンパイラーに備わっている
Databricks Apache Spark機械学習チュートリアル

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。

[Machine learning tutorial \| Databricks on AWS](https://docs.databricks.com/getting-started/spark/machine-learning.html) [2021/3/17時点]の翻訳です。

> **注意**
DatabricksランタイムMLは、Databricksで機械学習モデルを開発・配備する際に用いる包括的なツールです。これには、機械学習のエンドツーエンドのライフサイクルを管理・追跡する機械学習プラットフォーム[MLflow(英語)](https://docs.databricks.com/applications/mlflow/index.html)に加えて、有名な機械学習ライブラリ、ディープラーニングのライブラリが含まれています。詳細は[Machine learning and deep learning guide(英語)](https://docs.databricks.com/applications/machine-learning/index.html)を参照ください。

Apache Sparkの機械学習ライブラリ(MLlib)を活用することで、データサイエンティストが、散在しているデータに関わる諸問題(インフラ、設定など)にかかずらわされることなく、データとモデルに集中することができます。このチュートリアルでは、サンプルノートブックを使って、データの読み込みから始まり、データの前処理、MLlibのアルゴリズムを用いたモデルのトレーニング、モデル性能の評価、モデルのチューニング、予測の実施まで体験します。また、MLlibのパイプライン、MLflowについてもご紹介します。

# 前提

以下もご一読ください。

- [Databricks Apache Sparkクイックスタート](https://qiita.com/taka_yayoi/items/bf5fb09a0108aa14770b)
- [Databricks Apache Sparkデータフレームチュートリアル \- Qiita](https://qiita.com/taka_yayoi/items/2a7e9bb792eba316de4b)

# ノートブック

こちらのノートブックを試す際には、Databricks MLランタイム7.0以上を使用してください。

- [Databricks Apache Spark機械学習チュートリアル](https://github.com/taka-yayoi/public_repo/tree/main/spark_ml_tutorial)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
AWS RDS の postgres バージョンサポート終了するのでアップデート

# RDS for PostgreSQL x.x end-of-life date is approaching
AWSより、DBのエンジンバージョンのサポートが終了すると通知がきたためアップデートしようと思います。
もしアップデートを手動で行わない場合は2月16日以降、自動的にアップデートされてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/403b68eb-fb97-0b09-28de-51847def1882.png)

## ダウンタイムを伴うアップデート
このアップデートはダウンタイムを伴うため、自動でアップデートされてしまっては困ります。
具体的には以下の様な危険性があります。

・DBに不整合が起きる可能性がある
・サイトに突然アクセスできなくなる
・アップデート後、破壊的変更によってアプリケーションの再稼働ができなくなる

## 手動でアップデートしましょう
AWS公式のアップデート手順が用意されているので、この手順通りアップデートしましょう。

[Amazon RDS の PostgreSQL DB エンジンのアップグレード](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.PostgreSQL.html)
最近やっている勉強方法について

#最近のプログラミングの勉強について
最近は就活で忙しく、なかなかまとまった時間をとって勉強、開発をするというのが難しい状況下にいます。

そんな中、様々な企業のプログラム試験を受けていく上で僕、まだまだ全然勉強足りないやん！という場面に遭遇することが何度かありました。

それもそのはずで、これまでずっとUnityを利用したゲーム開発をしてきたので、Unityのライブラリやフレームワークをフル活用していました。なので、それらがない状態での開発経験というのはほとんどありません。(最初ちょっとだけ勉強したけど実質やっていないようなもん)

今更C#を一から学びなおすには時間が少なすぎるし、けど勉強なしには試験が厳しいし、どうしよう！？と慌てふためきながら勉強をしていた時、とあるサイトに出会いました。
それが今回紹介する**LeetCode**です。

#LeetCodeとは

https://zenn.dev/ryokotmng/articles/36af0a82e8a4f5

このページに概要が書いてありますが、簡単に言うとプログラミングの問題の練習ができるサイトだよ！って感じです。

~~簡単に言い過ぎた()~~

もっと深堀していくと、世界で有名なプログラミング競技サイトで、**多くの外資系の企業が実際の試験で利用している、利用していた**問題がたくさん転がっているサイトです。

実際の問題があることに関しては賛否両論があるらしいですが、一分一秒が惜しい学生の身からするとそんなことを気にしている場合ではありません。

**使えるものはすべて利用する。**これを第一に貪欲に勉強していくべきだと思います。
#LeetCodeの使い方
それでは簡単に僕が利用しているLeetCodeの使い方についてお話していこうと思います。と言っても、使い始めて数日で書いた記事なので特別上手に使えているわけではありません。あくまで一例として考えてもらえてもらえればと思います。
~~LeetCode詳しくて優しい人いたらもっと効率的な使い方教えてください~~

まず初めにサイトにアクセスして下さい。LeetCodeと検索すれば一番最初に出てくると思います。
![スクリーンショット (231).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1207332/ac0f07c8-da6c-8a4f-5166-545df31621c3.png)
このようなページが表示されるのでCreate Accountからアカウントを製作しましょう。

![スクリーンショット (232).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1207332/dc3532ff-da3e-3b7a-018b-48212824991c.png)
色々設定が終わると、この画面が表示されると思うので、左上のProblemsをクリックすると、問題一覧を開くことができます。
![スクリーンショット (233).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1207332/bf9069f8-c903-da2c-6dcd-19635afdaf92.png)
色々と情報が載っていますが、とりあえず気にするべきなのはTitle,Acceptance,Difficultyの三つだと思います。
左から順に、何をやるのか、実際の問題採用率、難易度という風に解釈しています(違ったらごめんなさい)。

Titleは自分がやってみたいことや、自分の開発分野に近いものをやるのもよし、ただ演算をするものからちょっとしたゲームの判別をするものまであるので、とにかく多くの問題を解いてプログラムの組み方を覚えていくべきだと思います。

Acceptanceは数値が高い方が出題頻度が高い、より実際に出やすいものなので、高いものを解いておくことで試験本番で困る場面は大幅に減少すると思います。(多分)

Difficultyは難易度ですね。新卒採用の場合、企業の試験やっていてでてきた問題は入門や、簡単と書いてあるものばかりだったので基本的にはひたすらEasyの問題を解いていくのが効率がいいのかなと思います。もちろんEasyのレベルが余裕な人はより高い難易度の問題を解いていきましょう。

問題は全部英語で書いてありますが、Google翻訳で理解できる程度の日本語に変換してくれるのでそれで大丈夫だと思います。企業によっては英語で問題が出る場所もあるので、英語の読解の勉強にもなります。

#問題を解くだけでなく他人と自分のスクリプトを比べる。
僕は他の練習、競技サイトを利用したことがないので他のものもできるかわかりませんが、このサイトを活用する一番の利点として**他人のコードを見ることができる**という点が挙げられます。

自分が長々と書いたものをたったの数行で書いている！？なんてこともざらにあるので本当に勉強になります。問題を解き終わった後は他人のコードを見て良い部分を盗んで自分のスキルを磨いていきましょう。(もちろん解く前にみたら勉強の意味なくなるからだめだよ！)

![スクリーンショット (234).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1207332/2d007a24-1e3f-53e4-cf9e-1b05d671256d.png)

他人のコードの検索欄もあるので、自分の開発言語で確認したいときも一発で見つけることができます。便利！

#Githubで管理して記録を残そう
LeetCodeのコンパイラでテストして終わるのもいいですが、Github、ソースツリーで管理することをオススメします。
理由としては
・いつ学んだかが一発でわかる。
・学んだものをまとめておくことで、勉強してきたことを企業にアピールできる。
・一部のプログラムはコメントなどを駆使して分かりやすく保存し、再利用することができる。
などがあります。
工夫次第でLeetCode単体でも同じことはできますが、Githubを使うことでもっと楽にできるので是非してもらいたいと思います。特に、多くの企業がエントリーの際にGithubのリポジトリを見てくれると思うので、まとめてアピールできます。

せっかく勉強するのだったら上手く就活に利用していきたいですね。

#最後に
というわけで、プログラミングの勉強をする方法の一つとしてLeetCodeを使おうね話でした。
もちろんLeetCode以外にも同じようなサイトはあるので、使いやすいものを上手く使って勉強を進めていってもらえればと思います。

今回自分が就活中というのもあって就活の話を交えながら話したと思いますが、就活関係ない人も普通に勉強の場として利用できるのでいいと思います。

では

#参考にしたサイト、記事
***
https://qiita.com/yohachi/items/e4bef4035da135a4808d

https://zenn.dev/ryokotmng/articles/36af0a82e8a4f5
***
Ora2Pg インストールと利用

1. Instant Client Packageのインストール
-----
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html から以下のrpmをダウンロード

```
 rpm -ivh  oracle-instantclient19.10-basic-19.10.0.0.0-1.x86_64.rpm
 rpm -ihv rpm -ivh oracle-instantclient19.6-devel-19.6.0.0.0-1.x86_64.rpm
 rpm -ihv oracle-instantclient19.10-devel-19.10.0.0.0-1.x86_64.rpm
 rpm -ihv oracle-instantclient19.10-jdbc-19.10.0.0.0-1.x86_64.rpm
 rpm -ihv oracle-instantclient19.10-sqlplus-19.10.0.0.0-1.x86_64.rpm

vi ~/.bash_profile
 export LD_LIBRARY_PATH=/usr/lib/oracle/19.6/client64/lib
 export ORACLE_HOME=/usr/lib/oracle/19.6/client64/lib

source .bash_profile
```

2. DBD::Oracleのインストール
-----
```
yum -y install perl-CPAN
yum -y install libyaml-devel
yum -y install gcc

perl -MCPAN -e shell        #全てEnter
perl -MCPAN -e 'install DBI'
perl -MCPAN -e 'install DBD::Oracle'
```

3. ora2pgのインストール
----
```
git clone https://github.com/darold/ora2pg.git
cd ./ora2pg
perl Makefile.PL
make && make install
```

4. ora2pgの初期セッティング
----
```
mkdir migration
ora2pg --project_base ./migration --init_project test_project
```

4.1 ora2pg.confの設定

```
vi ./migration/test_project/config/ora2pg.conf
 ORACLE_DSN     dbi:Oracle:host={192.168.84.111};sid={testdb};port=1521
 ORACLE_USER    {username}
 ORACLE_PWD     {userpasswd}
 # Oracle schema/owner to use
 SCHEMA OT      <- Oracleのスキーマ名
```
sid: SELECT INSTANCE_NAME FROM V$INSTANCE;
--> test for db connect

```
cd ./migration/test_project
ora2pg -t SHOW_VERSION -c config/ora2pg.conf
... Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
```

4.2 スキーマ定義の全体export実施

```
./export_schema.sh
    実行後は「./migration/reports」「./migration/schema」配下を重点的に確認
    reports/report.html : 評価結果
    reports/tables.txt  : テーブル変換結果

```

```
./import_all.sh
```
  これでPostgre SQLに入れてくれるが、ForeignKeyなどがあると、入れる順番などでエラになるので、5を参考に個別にやることを推奨します。またデータ投入の際にForeignKeyが邪魔になるので、ForeignKeyを最後に投入するのが良いのではと思います。

5. コマンド各種
----
```
cd migration/test_project

<評価->import postgres>
./export_schema.sh
./import_all.sh

<テーブル定義のみ出力>
 ora2pg -c config/ora2pg.conf -t TABLE [-o output_table.sql]

<データの出力>
 ora2pg -c config/ora2pg.conf -t COPY [-o output_data.sql]

<SQL変換>
 ora2pg -c config/ora2pg.conf -i {input.sql} -o output.sql -t QUERY
```
react context template

```
import React, { FC, Dispatch, SetStateAction, createContext, useState } from "react";

interface Data {
  foo: string;
}

type SetData = Dispatch<SetStateAction<Data>>;

export const FooContext = createContext<Data>({ foo: "" });
export const SetFooContext = createContext<SetData>(() => Promise.resolve());

interface Props {
  bar: number;
}

export const Provider: FC<Props> = ({ children }) => {
  const [data, setData] = useState<Data>({ foo: "" });

  return (
    <FooContext.Provider value={data}>
      <SetFooContext.Provider value={setData}>{children}</SetFooContext.Provider>
    </FooContext.Provider>
  );
};
```
HTMLへの埋め込み用としてRubyを使う(勉強メモ)

※勉強メモです。

#####```<<-PAGE ... PAGE```：ヒアドキュメント形式 
改行が重なるような文字列の記述に向く 
この間に記述したものを、ターミナルでrubyとして実行すると、単に文字列のHTMLが表示される(HTMLをRubyで実行して表示) 

#####・ERBを使ってRubyコードをHTMLに埋め込む 
```<%.. Rubyコード..%>```や```<%=..Rubyコード..%>```をHTMLに埋め込む 
「result」メソッドで埋め込まれたコードを実行し、最終的にHTMLに出力する機能 

```ruby
require 'erb' #ERBライブラリの読み込み  

def web_page
  ...
    <p><%= Time.now %></p>
  ...
end

erb = ERB.new(web_page)  #ERBオブジェクトのインスタンス生成
result = erb.result   #ERB内のRubyコード実行
puts result    #文字列表示
```  

#####・Webサーバーと起動してRubyを自動的に実行させる 
「Webサーバー-Pumaとは」 
Webサーバー：HTTPリクエストを受取り、HTMLなどのWebページをHTTPレスポンスとして返すサーバのこと 
Puma：RubyやRails標準のWebサーバー 

#####・Gem 
Rubyのライブラリ（便利機能をパッケージングした拡張機能） 

#####・Webサーバーの起動 
Sinatra：軽量なWebアプリケーションフレームワーク 
Sinatra では、views フォルダの中には erb ファイルのみを配置し、views/ フォルダの中の index.erb が今までの HTML に埋め込んできた ERB となり、このように独立のファイルとして作成 

app.rb　には、HTTPリクエストが来たときのWEBアプリの処理を記述 

```ruby
require 'sinatra' #Sinatraの読込み

get '/' do  #トップページ(/)にHTTPリクエストのGETメソッドが来た時に対処する処理(do ~ end)
  erb :index  #views/index.erb内の埋込Rubyの実行結果として出力されたHTMLをレスポンスとして返す
end
```  

#####・Webサーバーの起動 
sinatra-webフォルダに移動```$ cd ~/enviromnet/sinatra-ewb```
Pumaの起動``` $ ruby app.rb -o $IP -p $PORT```  

#####「フォームデータの送受信」 
・GETとPOST 
ブラウザからHTTPリクエストを送る際の技術的な仕様 

・GET：基本的にほかユーザーにも表示される情報 
　リンクをクリックしたとき 
　ブラウザのURL欄に直接URLを打込んだとき 
　ブラウザで検索ボタンを押したとき 
  
・POST：ほかユーザーに見られたくない情報の送信 
　問合せフォームで内容を入力し、送信ボタンをクリックしたとき 
　IDとパスワードを入力し、ログインボタンをクリックしたとき 

・POSTでフォームから情報を送信する 
(例)名前を入力し送信 

```ruby
(view/index.erb)
#送信先の指定：/(トップ)  POSTメソッド指定：method="POST"
<form action="/" method="POST"> 
  <label>名前: <input type="text" name="target_name"></label>
  <input type="submit" value="送信">
</form>
```  

・POSTで送信した情報を受け取って処理する 
target_nameを処理する 

```ruby
(app.rb)に以下追加
post '/' do
  erb :index
end
```  
※app.rb を変更する度、Puma を再起動(Ctrl+c)

・index.erbでPOSTデータ受取り 

```ruby
(view/index.erb)
<% name = params['target_name'] %>
```  

★HTTPリクエストのPOSTメソッドで送ったデータはRubyの```params```(Parameters・パラメータの略)に格納される 

POSTメソッドで、ユーザーからHTMLのform要素(入力フォーム)を通してデータを受け取れる  
受取ったデータはparamsという変数に自動的に格納される(paramsはハッシュ)
【VB.net】Listの初期化と代入方法　色々な書き方

VB.netのListを調べてたら色々な初期化と代入方法に遭遇したので
書き残しておこうと思います。

#空リストの作成#
```vb
Dim list1 As List(Of String) = New List(Of String)()
'後ろの()は省略可
Dim list2 As List(Of String) = New List(Of String)

Dim list3 As New List(Of String)

Dim list4 = New List(Of String)
```
イマイチ差が分かりませんでしたが、人によって使用しているパターンに違いがありました。

#リスト作成＆代入#
上のリスト作成時の記述につなげて書けば良い

ただし**()**を使うか**From**を使うかの2パターンあるよう

##パターン1 ()の場合##
**({要素1, 要素2, 要素3})**をList作成時の記述につなげる

```vb
Dim list1 As List(Of String) = New List(Of String)({"a", "b", "c"})

Dim list3 As New List(Of String)({"a", "b", "c"})

Dim list4 = New List(Of String)({"a", "b", "c"})
```

##パターン2 Fromの場合##
**From {要素1, 要素2, 要素3}**をList作成時の記述につなげる

```vb
Dim list1 As List(Of String) = New List(Of String) From {"a", "b", "c"}

Dim list3 As New List(Of String) From {"a", "b", "c"}

Dim list4 = New List(Of String) From {"a", "b", "c"}
```