OmniAICreator/Qiita-1.07M huggingface dataset:
FastAPI: JSON ファイルを読む

files にある cities.json を読むサンプルです。

## ツリー構造

```text
$ tree
.
├── files
│   └── cities.json
└── main.py
```

```py:main.py
#
#	main.py
#
#					Jul/26/2022
# ------------------------------------------------------------------
from pathlib import Path
from fastapi import FastAPI
from fastapi.responses import FileResponse

# ------------------------------------------------------------------
app = FastAPI()

@app.get("/")
def read_root():
	rvalue = {"morning": "おはよう","afternoon": "こんにちは"}
	return rvalue


@app.get("/get_file/{filename:path}")
async def get_file(filename: str):
	current = Path()
	file_path = current / "files" / filename
	
	response = FileResponse(path=file_path)
 
	return response
# ------------------------------------------------------------------
```

## サーバーの起動

```bash
uvicorn main:app --reload
```

## クライアントでアクセス

```bash
http http://localhost:8000/get_file/cities.json
```

## 確認したバージョン

```text
$ python
Python 3.12.7 (main, Feb  4 2025, 14:46:03) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import fastapi
>>> fastapi.__version__
'0.110.3'
```
VBAでファイルをUTF-８/LFに出力しなおす


## 概要

既存のVBAコードでは、Shift_JIS(MS932)で保存する処理が記述されている場合、UTF-８で出力する処理を入れようとするといろいろと面倒な場合、
いったん既存コードを動かしておいて、後でUTF-8に変換する差し込み処理を入れたいというモノグサな方向けのコードです。

既存ファイルを置換したい場合は、第２引数とTrueで呼び出せば、既存ファイルを置換します。
そうでない場合は、拡張子(.utf8.txt)をつけたファイルを出力します。

### コード

```VBScript
Option Explicit
​
Sub ConvertFileSJIStoUTF8(fname As String, overwrite As Boolean)
    Dim tmp As String
    Dim buf As String
    Dim tobj As Object
    Dim i As Long
    Dim byteTmp() As Byte
          
    ' ファイルの読み込み
    Dim text As String
    Open fname For Input As #1
        Do Until EOF(1)
            Line Input #1, buf
            text = text & buf & vbLf
        Loop
    Close #1
​
    ' バイナリとして取得＋BOM取り除き
    Set tobj = CreateObject("ADODB.Stream")
    tobj.Charset = "UTF-8"
    tobj.Open
    tobj.WriteText text
    tobj.position = 0
    tobj.Type = 1
    tobj.position = 3
    byteTmp = tobj.Read
    tobj.Close
    Set tobj = Nothing 
​
    ' ファイルを出力
    Set tobj = CreateObject("ADODB.Stream")
    tobj.Charset = "UTF-8"
    tobj.LineSeparator = 10
    tobj.Type = 1
    tobj.Open
    tobj.Write byteTmp
    tobj.SetEOS
    tobj.SaveToFile fname & ".utf8.txt", 2
    tobj.Close
    Set tobj = Nothing 

    ' ファイルのリネームを行う
    If overwrite Then
        ' ファイルを削除
        Kill fname
        ' 削除したファイルにリネーム
        Name fname & ".utf8" As fname
    End If
End Sub
```
Wordpress、Movabletypeでユーザのログインパスワードが分からないとき強制的にDBいじって変更する方法

久しぶりにCMSいじる時、パスワードの入力をブラウザキャッシュ保存に任せすぎた時、クライアントに確認してもわからないって言われたとき。。
各々CMSにはパスワード忘れた時用のリマインダー機能を使えばたいてい何とかなりますけど、
万が一そのアカウントに設定してるメールアドレスが受信できない（もしくはメールが飛ばない環境）だったら。。
もうDB直接いじってエイヤってしたほうが早くね？ってことでやり方まとめました。（ただしご利用は自己責任で）

# Wordpress版

Wordpressは接頭語が「wp_」だった場合、「wp_users」テーブルにログインユーザ情報が格納されてます。
user_passってのがそれですね、わかりやすい。
phpmayadminやselect文で確認してもらえばわかりますが、ハッシュ化された内容が登録されてるので、
SQLを実施する場合は下記で行けます。（SQL実施前に対象DBをuseしといてくださいね）

```
UPDATE wp_users SET user_pass = MD5('新しいパスワード') WHERE ID = 'パスを変更したいユーザーのID';
```
パスワード変更したいユーザのレコードを確認してwhere で指定すればいいだけ。
簡単ね。

# Movabletype版

Movabletypeも同様に「mt_author」ってテーブルに格納されてます。
こちらも「author_password」ってカラムに登録されてますが、暗号化されておりますね。
テーブルだけじゃ把握できなかったのでMT本体を解析したところ「lib/MT/Author.pm」に暗号化関連のset_passworrd関数を見つけました。
こちらをちょちょいと拝借して簡易パッチを作成。

```makepwd.pl
#!/usr/bin/perl -w
use strict;
use lib qw ( lib extlib );
use MT::Util;

my $pass = $ARGV[0];
my @alpha = ( 'a' .. 'z', 'A' .. 'Z', 0 .. 9 );
my $salt = join '', map $alpha[ rand @alpha ], 1 .. 16;
my $crypt_sha;

if ( eval { require Digest::SHA } ) {
    # Can use SHA512
    $crypt_sha
        = '$6$'
        . $salt . '$'
        . Digest::SHA::sha512_base64( $salt . $pass );
}
else {
    # Use SHA-1 algorism
    $crypt_sha
        = '{SHA}'
        . $salt . '$'
        . MT::Util::perl_sha1_digest_hex( $salt . $pass );
}
print $crypt_sha;
```

MTディレクトリ直下に設置して、cmd実行
```
perl makepwd.pl test
```
「test」の部分はパスワードとして利用したい文字。

これを実施すると暗号化された文字が生成されるので、こいつを使ってSQLでauthor_passwordの該当レコードを変更すればよき。

```
update mt_author set author_password = "生成された文字" where ID = 該当レコードのID
```

なお、上記MT７系でも動作し、実施してパスワード強制変更はできました。
が、何でも言いますが、利用は自己責任でお願いします。何か起きても一切責任取りませんので、
ご利用の際はDBバックアップなどしたり、とったdumpを使って別の環境で利用して問題ないかなど予防線は貼ってくださいね、いわずもがなですが。
Octave で相関係数行列，分散共分散行列

# Octave で相関係数行列，分散共分散行列


```matlab
x = [2, 3, 2, 3, 4, 5, 3, 2, 3, 2, 1];
y = [3, 2, 2, 1, 2, 3, 3, 2, 5, 4, 2];

data = [45.51 43.38 56.91 47.32 55.20;
        56.74 61.85 70.44 57.09 55.59;
        32.62 34.17 47.24 43.64 42.45;
        53.43 59.83 47.97 52.18 46.99;
        37.41 36.15 37.70 26.06 30.12;
        42.85 43.91 44.75 53.73 50.74;
        66.06 52.68 39.87 61.52 68.19;
        62.09 62.36 62.01 62.93 59.58;
        50.81 58.48 40.50 48.10 42.55;
        52.48 47.21 52.61 47.42 48.60];

format short
```

## 1.　相関係数および相関係数行列

### 1.1.　ピアソンの積率相関係数


```matlab
corr(x, y)
```

    ans = 0.073537



```matlab
corr(data)
```

    ans =
    
       1.0000   0.8288   0.3214   0.7860   0.7786
       0.8288   1.0000   0.4560   0.7145   0.5004
       0.3214   0.4560   1.0000   0.4643   0.4156
       0.7860   0.7145   0.4643   1.0000   0.8970
       0.7786   0.5004   0.4156   0.8970   1.0000
    



```matlab
corr(data(:, 1:2), data(:, 3:5))
```

    ans =
    
       0.3214   0.7860   0.7786
       0.4560   0.7145   0.5004
    


### 1.2.　スピアマンの順位相関係数


```matlab
spearman(x, y)
```

    ans = 0.070711



```matlab
spearman(data)
```

    ans =
    
       1.0000   0.8424   0.3455   0.8424   0.7939
       0.8424   1.0000   0.4909   0.8182   0.5636
       0.3455   0.4909   1.0000   0.3333   0.4545
       0.8424   0.8182   0.3333   1.0000   0.8303
       0.7939   0.5636   0.4545   0.8303   1.0000
    



```matlab
spearman(data(:, 1:2), data(:, 3:5))
```

    ans =
    
       0.3455   0.8424   0.7939
       0.4909   0.8182   0.5636
    


### 1.3.　ケンドールの順位相関係数


```matlab
kendall(x, y)
```

    ans = 0.070593



```matlab
kendall(data)
```

    ans =
    
       1.0000   0.7333   0.2444   0.6889   0.6444
       0.7333   1.0000   0.3333   0.6889   0.3778
       0.2444   0.3333   1.0000   0.2000   0.4222
       0.6889   0.6889   0.2000   1.0000   0.6889
       0.6444   0.3778   0.4222   0.6889   1.0000
    



```matlab
kendall(data(:, 1:2), data(:, 3:5))
```

    ans =
    
       0.2444   0.6889   0.6444
       0.3333   0.6889   0.3778
    


## 2.　分散共分散行列

    usage:
    cov (x)
    cov (x, opt)
    cov (x, y)
    cov (x, y, opt)
    
    opt=0 デフォルト 分散，共分散の正規化に n-1 を使う。opt=1 のとき n を使う。


```matlab
cov(x, y)
```

    ans = 0.090909



```matlab
cov(data)
```

    ans =
    
       111.105    92.086    35.715    87.330    86.519
        92.086   111.114    50.665    79.388    55.607
        35.715    50.665   111.117    51.591    46.188
        87.330    79.388    51.591   111.095    99.670
        86.519    55.607    46.188    99.670   111.136
    



```matlab
cov(data(:, 1:2), data(:, 3:5))
```

    ans =
    
       35.715   87.330   86.519
       50.665   79.388   55.607
特別版のDEにログインできない


時々このような質問が投稿されますが、全く持って意味が分からないです。
(質問にはこんなのが大多数ですが...)

+ [FINS開発者組織の組織に接続できません](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HDfNL)
+ [【解決】Sign Up for an Einstein Prediction Builder Trailhead Playground](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HESSlSAP)

最終的に別のコンピューターで開発者組織を作成し（したがって、キャッシュ、Cookie、履歴などは関係ありません）、これは機能することになりました。新しいコンピューターで組織が作成されたら、通常の仕事用コンピューターでログインしただけで、すべてが完全に機能しました。キャッシュ/クッキーと使用しているブラウザと関係があると思います。別のブラウザー（Microsoft Edge）を使用してすべてのキャッシュをクリアしようとしましたが、これは私には機能しませんでした（ただし、あなたや他の人には機能しました）。 

+ [How do I set the password for my Superbadge Developer Edition Org?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HERM2)

+ [Salesforce Einstein is 30 days free how to get?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007EbNJT)

:::note
Below are the special edition environments

https://developer.salesforce.com/promotions/orgs/analytics-de
:::


+ [Cannot Sign up for Einstein Prediction Builder](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007IeK5E)

:::note
Maybe the issue was that I was using several profiles at the same time in my browser. Now I could create the environment, though having issues with the predictions

おそらく問題は、ブラウザで複数のプロファイルを同時に使用していたことでした。予測に問題はありましたが、環境を作成できました。
:::

+ [How do i get an Einstein prediction builder enabled in my developer edition org ?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBgMJ)

上記の特別版のDE環境を使っていないから？
Oracle Analytics Cloud：プライベート・アクセス・チャネルでプライベート・データソースにアクセス

# はじめに
Oracle Analytics Cloud（**OAC**）は、データ分析のためのクラウドサービスです。
様々なデータソースに接続して分析することができますが、対象としたいデータベースがオンプレミスやOracle Cloud Infrastructure（**OCI**）のプライベートサブネットに配置されていることもあります。
これら、プライベート・データソースにアクセス手段として用意されているのが、プライベート・アクセス・チャネル（*Private Access Channel:* **PAC**）です。
PACをセットアップする方法を紹介します。

# PACの前提条件
PACを使用するにあたり、注意しておくべき点があります。
- 設置するサブネットで、4つのIPアドレスを消費します
- OAC Enterpriseで使用できます（OAC Professionalには提供されていません）
- データベースサーバには、IPアドレスではなくFQDNでアクセスします
- OACのインスタンス間で定義を共有できません

:::note info
OAC Professionalでプライベート・データソースに接続するにはデータ・ゲートウェイを使用します。
:::

# 今回想定する構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/776022fd-c34d-b5e4-6234-9bcfee8b81da.png)
同一VCN上に2つの異なるプライベート・サブネットがあります。
一方では、Database Cloudが稼働しており、もう一方ではOACが稼働しています。
このままでは、OACからDBへのアクセスができませんので、OAC側のプライベート・サブネットにPACを設置します。

# OACインスタンスの作成
OCIの管理コンソールにログインし、「アナリティクスとAI」－「アナリティクス・クラウド」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/4d76a332-e627-40f7-0b2c-df3a3cb0a403.png)
「インスタンスの作成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/a36036c3-af05-9307-7421-d306f87a4974.png)
エディションとして、「Enterprise Edition」を選択します。
「拡張オプションの表示」をクリックして、ネットワーク・アクセスを「プライベート」とし、適切なプライベートサブネットを選択してから「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/f23c0bcc-1cd3-5b88-0919-aedc4ce7e6b1.png)

# PACの構成
Database Cloudのインスタンスの詳細画面で、ドメイン名を確認しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/1fa2914f-6fe7-79a3-1699-79d345c3097b.png)
OACインスタンスの作成が成功したら、リソースの「プライベート・アクセス・チャネル」を選択し「プライベート・アクセス・チャネルの構成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/23ca2b30-5679-7a4d-d60f-d34d6f448130.png)
任意の名前を入力します。
OACインスタンスのネットワーク・アクセスをプライベートにすると、PACは同じプライベート・サブネットに構成されます。
プライベート・ソースのDNSゾーンとして事前に確認しておいたDatabase Cloudのホスト・ドメイン名を入力し「構成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/f4073ea3-a059-ca70-7139-20a14bbad2ae.png)
しばらく待つと、構成が完了します。

# OACで接続を作ってみる
「新規」から「接続」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/65efd3c7-4815-c863-c81d-a0ef3918f6b5.png)
データベースとして、Oracle Databaseを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/77948496-d5d8-fe8d-a522-62122d7d53e6.png)
必要な情報を入力して、接続を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/94cb3f62-bf9e-cb84-edc5-d3defb6178b3.png)
データセットを作ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/41271ebc-6141-98b2-d09b-ac34339bf8a9.png)
ちゃんと検索できました。

# 関連情報
- [公式ドキュメント](https://docs.oracle.com/cd/E83857_01/paas/analytics-cloud/acoci/manage-service-access-and-security.html#GUID-4DF3B518-2D7B-4C37-B4C8-3F35D68372F6)

My Oracle Supportにアクセスできる人は、こちらも参考になります。
- Oracle Analytics Cloud (OAC) でプライベートアクセスチャネル (PAC) を構成する方法 (Doc ID 3073725.1)
【SQL】WITH句を覚えた #備忘録

# これはなに

SQLのWITH句を覚えたのでメモを残す

# 筆者

- 非エンジニア（マーケティング職）
- SQLをお勉強中

# WITH句とはなんぞや

SQL文内で新たにテーブルを作り、名前を付けることが出来る句のこと。

WITH句で呼び出したテーブルのことをCTE(共通テーブル式）と言うらしい。
WITH句を使って再帰呼び出しすることを再帰WITH句と言ったり、
呼び出したテーブルを再帰共通表式（テーブル）と言ったりするらしいです。

# WITH句の書き方

```
with
    '作成するテーブル名'
AS
    (
    '作成するテーブルを作るクエリ'
    )
```

# 使用例

## やりたいこと

- 商品購入数が多いユーザー上位3名のメールアドレスを抽出する


## テーブル

### テーブル①：purchase

| purchase_id | user_id | quantity |
|:-----------:|:------------:|:------------:|
| 1 | 1 | 1 |
| 2 | 1 | 1 |
| 3 | 3 | 5 |
| 4 | 2 | 2 |
| 5 | 2 | 1 |
| 6 | 4 | 1 |
| 7 | 3 | 1 |
| 8 | 5 | 2 |
| 9 | 1 | 3 |
| 10 | 6 | 1 |

### テーブル②：user

| user_id | email |
|:-----------:|:------------:|
| 1 | cham.hoge@gmail.com |
| 2 | cham.test@gmail.com|
| 3 | cham.qiita@gmail.com |
| 4 | chamcham.qiita@gmail.com |
| 5 | cham.hogehoge@gmail.com |

## WITH句を使ったクエリ

```

WITH 
    puchase_quantity_top3_users 
AS (
    SELECT
        purchase_id
        sum(quantity)
    FROM
        purchase
    GROUP BY 1
    ORDER BY 2 DESC
    LIMIT 3
    ),

SELECT
    email
FROM
    user
JOIN
    puchase_quantity_top3_users
ON
    user.user_id=puchase_quantity_top3_users.user_id;
```

## 出力結果

| email |
|:------------:|
| cham.qiita@gmail.com |
| cham.hoge@gmail.com |
| cham.test@gmail.com|

## メモ

- WITH句で定義したテーブルは何度も使える
- JOIN句でサブクエリ書くより読みやすい
Google Analyticsのカスタムレポートを使おう！

# これはなに

Google Analyticsのレポート機能を駆使しようという趣旨の記事です。

# 誰に向けた記事か

Google Analytics初心者向けの記事となってます！

Google Analytics自体は触ったことがあるけど、自分で見たい指標をカスタムして分析用レポートを作ったことがない方向け。
チュートリアルは完了していることを前提としており、どこに何の機能があるかといった詳細な説明は省略します。




# カスタムレポートとは何か

カスタムレポートとは、ディメンション（都市、ブラウザなど）と指標（セッション数、ページビュー数、直帰率など）を組み合わせて独自にレポート作成ができる機能です。



:::note warn
指標とディメンションの中には組み合わせることができないものもあります。
[参照] [ディメンションと指標の有効な組み合わせ](https://support.google.com/analytics/answer/1033861#zippy=%2C%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AE%E5%86%85%E5%AE%B9)
:::

# カスタムレポートで何ができるのか


Google Analyticsのメニューバーには既にレポートセットが複数用意されています。
用意のあるレポート以外の組み合わせで数値を確認したい時に、カスタムレポートの出番となります。

例えば、集客チャネル別のPV数を見たい場合、
メニューバーの `集客` からチャネル別のユーザー数やセッション数は確認できますが、ページビュー数は確認できません。
同様にページ毎のユーザー数を見たい場合、
メニューバーの `行動` からページ別のページビュー数は見れますが、ユーザー数は確認できません。

こういった場合は、カスタムレポートで自分が見たい指標とディメンションを組み合わせてレポートを作成します。


# カスタムレポートの作り方

:::note info
UA（ユニバーサルアナリティクス）とGA4（Google Analytics 4）で機能名やUIが異なるので、それぞれ説明します。
:::

※厳密にいうと、GA4には`カスタムレポート`という機能がないので、代替するレポート機能を紹介します。

## UA（ユニバーサルアナリティクス）の場合

左側のメニューバーから `カスタム` > `カスタムレポート` を選択し、新しいカスタムレポートを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/d8099d63-4b04-d9fe-38c7-1df9ad69d8dd.png)

すると指標とディメンションの設定画面が表示されるので、見たいものを設定します。
添付のように複数の指標を一気に表示することも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/57b0e239-9345-464e-032c-59291701ce07.png)

レポートタブを複数作成することもできます。
筆者はセカンダリディメンションを設定して、日次 / 週次 / 月次のレポートを用意したりします。

![UAカスタムレポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/56acf6de-8d6c-4ed9-bae5-b2f3ea87116f.png)

実数は伏せますが、このように表やグラフ形式で数値レポートを確認することができます。
表示されているURLリンクを共有すれば他者とレポートをシェアすることも可能です。


## GA4（Google Analytics 4）の場合

:::note warn
筆者は本記事執筆タイミングでGA4を初めて触っています。
もしかしたら今から紹介する方法以外に適切な方法があるかもしれません。
:::

左側のメニューバーから `探索` を選択し、新しいデータ探索を開始します（＝新しいレポートを作成すること）

![GA4カスタムレポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/48001643-7ef4-3b5c-e271-e7e9c18ae8d4.png)

GA4の場合もUAのレポート同様に指標とディメンションを設定します。
UAと異なる点として、行 / 列 / 値に含めるイベントと表示順を自分で設定することができます。（ピボットテーブルのようなイメージです）
右側でレポートのアウトプットイメージを確認しながら作成できるので、自分の出したい形に合わせて設定しましょう。

# 余談：UAとGA4の比較

筆者はGA4の方がレポート作成時の操作性が高く、UIも分かりやすいなと思いました。

不便というわけではないですが、
UAとGA4でイベント名が異なるものが多数ありますので対照表みたいなものは覚えておかないとですね。。

# 最後に

今回、UAだけでなくGA4でのレポート作成方法もご紹介しました。
が、筆者が初めてGA4を触っておりまして、説明に誤りがある可能性があります。
（弊社がGA4全移行がまだであることがバレてしまう‥）

お気づきの点がございましたらご指摘いただけますと幸いです🙇
バックグラウンド時やアプリ未起動時でもプッシュ通知をハンドリングする方法

プッシュ通知の受信イベントをバックグラウンド時にハンドリングする方法を調べても、サイレントプッシュ通知の記事ばかりが上がってきて、やり方を見つけるのに苦労したので記事にしました。
# 結論
Notification Service Extension を使う！
UNNotificationServiceExtensionのdidReceiveにOSLogを仕込んで確認したら、アプリ未起動時など状態に関わらずプッシュ通知をハンドリングできていました。（ここに通知を受信したときにやりたいことを書けばOK）

### 補足
Notification Service Extension は、通知をAPNsから受信してからユーザーに見せる前にペイロードを編集したりできるapp extensionです。

実装方法については[こちら](https://dev.classmethod.jp/articles/user-notifications-framework-13/)を参考にさせていただきました🙏
【受験記録】AWS Certified Machine Learning - Specialty (MLS-C01)

## 前提
- 6年目エンジニア
- アプリケーション開発メイン
- インフラは少しだけ
- AWS　CLF,　Associate3つ, SAP, DAS, ANSは保持
- 受験日 2022/7/21
- G検定取得済み


##試験結果
点数:836点/750点/1000点(取得スコア/合格ボーダー/満点スコア)
スコアパフォーマンス: 全セクションで"コンピテンシーを満たしている"

## 試験感想
- 試験印象は"SageMaker試験"
    - 機械学習に関して問題比率は高かったように思うが、大学時代に少し研究していた蓄積(とG検定)のおかげでなんとかなった。
    - データ連携はDAS試験の簡易版で各サービス概要+αといった印象
    - 結果、SageMakerについてが一番わからないということになりました

- SageMaker
    - ホスティングサービスやバッチ推論、パイプライン、Elastic Inference、パイプモードなどなど
    - 以下記事に各サービスが簡潔にまとまっていたので参考にしていました。
   
 https://qiita.com/knowledgecommunication/items/1350af15e8adda0971ae

- 混同行列
    - TP, FP, TN, FN, Accuracy, Precision, Recallは理解必須
    - Accuracy, Precisionの日本語訳が安定しないので、英語で覚えた方がよさそう
Trailhead「アドミニストレーター認定試験に向けた学習」について色々調べて解説してみた

Trailhead「アドミニストレーター認定試験に向けた学習」について色々調べてみましたのでまとめます


※アドミニストレーター認定試験に向けた学習

https://trailhead.salesforce.com/ja/content/learn/trails/administrator-certification-prep

以下のリンクからはフラッシュカードについて私（本橋孝昭）が勝手に解説した内容を記載しました。
（なお、フラッシュカードの解説は私（本橋）が個人的に解説したものです。誤字や誤りなどありましたらご指摘いただけましたら幸いです）

なお記事だけでなく解説動画も作成しております。こちらもご確認ください

<iframe width="560" height="315" src="https://www.youtube.com/embed/1z_jjNf6JCE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 〇アドミニストレーター認定の準備: 構成、設定とオブジェクト
#### ・アドミニストレーター認定の準備の開始
（※フラッシュカードが無いのでＵＲＬは無し）

#### ・構成と設定の学習
「アドミニストレーター認定の準備: 設定とオブジェクト～組織の設定の学習～」

https://qiita.com/Takaa/items/be6ebd4b9a47d738550c

#### ・オブジェクトマネージャと Lightning アプリケーションビルダーの確認
「アドミニストレーター認定試験に向けた学習 ＞アドミニストレーター認定の準備: 構成、設定とオブジェクト ＞オブジェクトマネージャと Lightning アプリケーションビルダーの確認の問題を解説してみた」

https://qiita.com/Takaa/items/6778ad7f71d2bcddf26a

## 〇アドミニストレーター認定の準備: アプリケーションと活動
#### ・セールスアプリケーションとマーケティングアプリケーションの確認
「アドミニストレーター認定試験に向けた学習 ＞ アドミニストレーター認定の準備: アプリケーションと活動 ＞セールスアプリケーションとマーケティングアプリケーションの確認の問題を解説してみた」

https://qiita.com/Takaa/items/776d534b327d1760f684

#### ・サービスアプリケーションとサポートアプリケーションの準備
「アドミニストレーター認定試験に向けた学習 ＞アドミニストレーター認定の準備: アプリケーションと活動 ＞サービスアプリケーションとサポートアプリケーションの準備を解説してみた」

https://qiita.com/Takaa/items/be9a80191bb0eee4cb35

#### ・生産性とコラボレーションの学習
「アドミニストレーター認定試験に向けた学習 ＞アドミニストレーター認定の準備: アプリケーションと活動 ＞生産性とコラボレーションの学習を解説してみた」

https://qiita.com/Takaa/items/cc05d77087635bad9a83

## 〇アドミニストレーター認定の準備: データと自動化
#### ・データ管理と分析管理の演習
「アドミニストレーター認定試験に向けた学習 ＞アドミニストレーター認定の準備: データと自動化 ＞データ管理と分析管理の演習　を解説してみた」

https://qiita.com/Takaa/items/f518610b16d724985ab0

#### ・ワークフローと自動化の学習
[アドミニストレーター認定試験に向けた学習 ＞アドミニストレーター認定の準備: データと自動化 ＞ワークフローと自動化の学習　の学習を解説してみた]

https://qiita.com/Takaa/items/ecdc9172505ca1e3238b



※その他のSalesforce認定アドミニストレーター試験公式練習問題はこちらから
https://qiita.com/Takaa/items/91d15d487a1ceb45ce1d

※Salesforce認定アドミニストレーター試験勉強方法はこちら
https://qiita.com/Takaa/items/485dc2dd1e61f31f2ff9
Paiza のスキルチェック(プログラミング問題)は テスト駆動開発に反しておる

いちど提出すると訂正できない。
複数のテストが行われ、全て通過すると合格だが、通過しないものがあると不合格だ。

しかしそもそもプログラムというのは実行、修正、実行、修正を重ねて書くものでは？
つまりPaizaのプログラミング問題は開発の実態に合っていない。

「問題文をくまなく読んで理解し、一発で完全なプログラムを書く能力」のどこに需要があるので？
いや、スキルチェックにはなるんだろうけどさ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/6b88f138-37e3-1bdd-5bea-17bf47d3a8c2.png)

っていうぼやきだった。

<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【CSS】IEサポート終了で使う機会が増えそうなプロパティ

# はじめに
2022年6月15日にInternet Explorerのサポートが終了しました。
そこで今回は、これから使うことが増えそうなIE非対応のCSSプロパティを5つ紹介します。

# gap
https://developer.mozilla.org/ja/docs/Web/CSS/gap#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7

```css
gap: 30px 50px;
```

`gap`はFlexboxやCSS Gridで隣接する要素間の間隔を設定できます。

`row-gap`（行間）と`column-gap`（列間）の値を指定できます。

1つのみを指定した場合、行間と列間が同一の値になります。

「要素間の間隔」なので、外側にはみ出しません。

https://jsfiddle.net/yuki05/d0x7qcrz/11/

# line-clamp

https://developer.mozilla.org/ja/docs/Web/CSS/-webkit-line-clamp#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7

```css
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden;
-webkit-line-clamp: 2;
```

`line-clamp`は、テキストを指定した行数で省略表示することができます。
文末には3点リーダーが表示されます。
使用するには、`line-clamp`以外に3つのプロパティを設定する必要があります。

https://jsfiddle.net/yuki05/z68mso5c/36/

# background-clip: text

https://developer.mozilla.org/ja/docs/Web/CSS/background-clip#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7

```css
background-clip: text;
```

`background-clip: text`は、背景をテキストでくり抜くことができます。
`content-box`なども設定できますが、`text`はIE非対応です。

https://jsfiddle.net/yuki05/3v56cxf4/26/

# filter

https://developer.mozilla.org/ja/docs/Web/CSS/filter#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7

```css
filter: contrast(200%);
```

`filter`は、ぼかしや色変化などのグラフィック効果を適用します。
`blur`（ぼかし）、`contrast`（コントラストの調整）、`grayscale`（グレースケールへの変換）などを設定できます。

https://jsfiddle.net/yuki05/L5c01x6o/26/

# accent-color

https://developer.mozilla.org/ja/docs/Web/CSS/accent-color#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7

```css
accent-color: pink;
```

一部のフォーム要素（チェックボックス、ラジオボタン、レンジスライダー、プログレスバー）のアクセントカラーを変更できます。

https://jsfiddle.net/yuki05/1dncf429/23/


# 参考

https://blogs.windows.com/japan/2022/06/15/internet-explorer-11-is-no-longer-supported/

https://ics.media/entry/210628/

https://coliss.com/articles/build-websites/operation/css/css-line-clamp-property.html

https://coliss.com/articles/blogroll/css-accent-color.html
Harbor上のコンテナイメージを更新した契機でイメージスキャン＆GitLabのパイプラインを実行する

以前「[ECRのイメージを更新して、EventBridge経由でGitLabのパイプラインを実行する](https://qiita.com/ipppppei/items/fe47f778ec34936a7d5e)」という記事を書いたが、そのHarbor版となる。


## やること
- Harborにpushする
- pushした契機でHarbor内のTrivyでイメージをスキャンする
- イメージスキャンが完了した契機でGitLabのパイプラインを実行する

## GitLabの設定
※ここは前回記事から流用部分が多いです。前回実施して不要な人は飛ばしてください。

最初に、対象となるGitLabのパイプラインを動かすGitLabのProjectを用意する。
今回は[hello-tanzu](https://github.com/tanzu-japan/hello-tanzu)をcloneしたものを用意し、ProjectのCI/CD->Editorからデフォルト値が適用された`.gitlab-ci.yml`を作成した。
![1657257218502.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/ef01e895-c432-658f-1940-6c655a9eba10.png)
また、イメージスキャン契機でRunnerを動かすために、Webhookを設定する。Settings -> CI/CD -> Pipeline triggers -> Expandを選択し、Add triggerでTriggerを追加する。(ECRの時の画像を使いまわしているためDescriptionがECRとなっているが、適宜変更すること）
![1657257533824.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/eccf7092-80ce-d214-37ee-1ccc260687a7.png)
追加後、"Use webhook"のところに表示されたURLを保存し、REF_NAMEとTOKEN（"Add trigger"を押した際に作成されたToken）を書き換えてメモ帳なりに控えておく。\
今回、対象プロジェクトのプロジェクトIDが`3`であり、ターゲットは`main`ブランチ、Tokenは`ca85c3d59036cc92b3fbe1df5e3949`であるため、WebhookのURLは以下のようになった。
```
https://gitlab.mygitlab.hoge/api/v4/projects/3/ref/main/trigger/pipeline?token=ca85c3d59036cc92b3fbe1df5e3949
```
## Harborの設定
Webhookの適用範囲はProject全体になるため、試す場合は他のリポジトリからの影響を受けないようにするために新規にProjectを作成することを推奨する。\
今回、新規にhello-tanzuというProjectを作成し、ここにイメージの格納およびスキャン、Webhookの設定を行っていく。\
Webhookはhello-tanzuのプロジェクトからWebhooks->NEW WEBHOOKから作成できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/1783ac9e-0fef-6f0d-4648-3032a1cec834.png)
Webhook作成時、以下のように設定する。
- Name：お好きなものを（ここではhello-tanzuとした）
- Notify Type：http
- Event Type：Scanning finished
- Endpoint URL：先程のGitLabのEndpoint (https://gitlab.mygitlab.hoge/api/v4/projects/3/ref/main/trigger/pipeline?token=ca85c3d59036cc92b3fbe1df5e3949)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/d108cce4-7726-7293-3546-22a4d60dab8b.png)

次にイメージプッシュ時に自動でスキャンが掛かるように設定変更する。\
プロジェクトからConfigurationを選択し、"Automatically scan images on push"を選択し、"SAVE"ボタンを押して保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/3e84e928-7369-d572-ecf0-b2c1eda5ab87.png)

以上で設定は完了となる。

### 動作確認
kpackでイメージをビルドする。ここは環境に応じてDockerbuild、docker push、imgpkg copyなどで置き換えて問題ない。
```
kp image save --git https://gitlab.mygitlab.hoge/myapp/hello-tanzu.git --tag myharbor.info/hello-tanzu/hello-tanzu hello-tanzu --wait
```
既にイメージを作成済みで変更もない場合はTriggerで強制的にイメージを再作成する。
```
kp image trigger hello-tanzu
```
イメージの作成が終わると、Harbor側でスキャンが実行されたことが確認できる。(Vulnerabilitiesのところ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/99557bd4-719e-e690-9f6f-557b94218750.png)

また、GitLabからパイプラインが実行されていることも分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/312b5dc2-d37b-cd0b-1721-c83c770c9c1b.png)

お疲れ様でした。

### pushではなくscanを契機にする理由
コンテナイメージ周り(Dockerfileやkpack、buildpacks用リソース)をアプリのコードとは別のブランチ・リポジトリで管理している場合、イメージだけ修正したい場合にpush契機だとパイプラインを実行できない。
scanであればアプリのコードの修正なしでパイプラインを実行できるため、イメージのみ更新することがある人はscan契機を利用するとよいと思う。\
（ただし、定常時のスキャン時に不要なデプロイが走らないよう、パイプライン側でHash値チェックなどは必要になる）
「レガシーコード改善ガイド」読了

https://www.shoeisha.co.jp/book/detail/9784798116839
# 感想
先日読んだ「レガシーコードからの脱却」はレガシーコードと戦うマインド、こちらはレガシーコードと戦う具体的なテクニック集という印象を受けた。DDDっぽくリファクタリングしたはいいものの、テストのやり方にてこずっていたので、インターフェースで抽象化してテスト用サブクラスを作成する手法は目から鱗だった。今回初めて書籍内に出てきたコードをphpで写経してみたが、理解レベルが格段に上がった（気がする）ので今後もそうしていくことにする。
# 忘れずにしたいメモ
### Liskovの置換原則(LSP)
Rectangle(長方形)クラスを継承するSquare(正方形)クラスが以下のコードを実行した時、面積はどうなるべきか。
```LSP違反例.php
$r = new Square();
$r->setWidth(3); // 横幅指定
$r->setHeight(4); // 縦幅指定
echo $r->getArea(); // 戻り値は 16
```
これは、Liskovの置換原則の違反の古典的な例です。サブクラスのオブジェクトは、どんな場合においてもスーパークラスのオブジェクトの代わりに使えなければなりません。
### 機能スケッチと影響スケッチ
#### 機能スケッチ
1. クラス内のインスタンス変数を表す円を描く
1. クラス内のメソッドを表す円を描く
1. 各メソッドの円からそのメソッドがアクセスする、もしくはそのメソッドが変更するあらゆるインスタンス変数とメソッドに対して矢印を引く
1. 複数まとまりがあることを確認したら、それを別のクラスに抽出する。
#### 影響スケッチ
機能スケッチの矢印の向きが逆。変更点を基にした影響調査に適している。
### スプラウトメソッドとスプラウトクラス
システムに要件を追加する必要があり、それをまったく新しいコードで実現できる場合には、そのコードを新しいメソッド(またはクラス)として記述する。
### FactoryMethodの抽出とオーバーライド
コンストラクタ内におけるオブジェクト生成処理を別メソッド（FactoryMethod）として抽出し、テスト用サブクラスでFactoryMethodをオーバーライドする。
【Python】Pandas DataFrameを使った訓練データ、教師データの生成例

# 概要
機械学習の処理を色々見ているとデータ準備工程で同じような処理を見かけるので何をしているかまとめておく

# 処理
## コード全文
```Python
import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic') # データセット読み込み
X = df.loc[:, (df.columns!='survived') & (df.columns!='alive')]
X = pd.get_dummies(X, drop_first=True) # 訓練データ
Y = df['survived'] # 教師データ
```

## データセット読み込み
```Python
df = sns.load_dataset('titanic')
```
まずはデータを用意している。
以下のタイタニック以外にもいろいろある。

>タイタニック号沈没事故の乗客の生存者/死亡者のデータセットです。(データのもとはイギリス商務省)
データセットの構造はKaggleのタイタニックデータに類似していますが、項目に若干の違いがあります。また、データの行はKaggleのタイタニックデータの訓練データと同じです。

https://biotech-lab.org/articles/1408

## 訓練データ
```Python
X = df.loc[:, (df.columns!='survived') & (df.columns!='alive')]
X = pd.get_dummies(X, drop_first=True) 
```

`df.loc`で行名、列名を指定して特定の値を抽出できる。
上記コードではすべての行に対して、列が`'survived'`でないかつ列が`'alive'`でないものを抽出している。

https://note.nkmk.me/python-pandas-at-iat-loc-iloc/

`pd.get_dummies`でカテゴリ変数をダミー変数に変換している。
これは以下の動作例を見た方がわかりやすい。

https://note.nkmk.me/python-pandas-get-dummies/

## 教師データ
```Python
Y = df['survived'] 
```
これは指定の列を取り出しているだけ。
【Excel】誰も開いていないのに読み取り専用になってしまう

＜初めに＞
会社でエクセルを使用していると誰も開いていないのに
「○○さんが開いています　読み取り専用で開きます」とエラーが出てくる時がある
それを回避する話

＜解決方法＞
①入力 ⇒ C:\Users\ユーザー名\AppData\Roaming\Microsoft\Excel

フォルダのパス入力欄に上記の「ユーザー名」のみ変更して入力しEnterを押せば
指定のフォルダに入れる

②フォルダ内のデータを全てゴミ箱に入れる
⇒これで、OK

＜最後に＞
上記の動作を行えば、読み取り専用を解除できるはず…
ログを消すのは、「○○さんが開いています　読み取り専用で開きます」の
○○さんが消す必要があるけどね…！(・・;)
Ubuntu18.04＋Apache2.4で脆弱性診断に対応した

中堅以上の企業にWebサービスを提供していると、クライアント企業の情報システム部門が行う脆弱性診断で指摘を受けることがありますよね。
High Risk の指摘を受けたサービスは、対策しない限り、接続の許可が先ず下りません。

# 脆弱性指摘項目
今回受けた指摘（CVE＝Common Vulnerabilities and Exposures：共通脆弱性識別子）は次の通り。

- **CVE-2019-0196**
Apache HTTP Server における解放済みメモリの使用に関する脆弱性でした。

- **CVE-2019-0197**
Apache HTTP Server におけるHTTPリクエストスマグリングに関する脆弱性でした。

- **CVE-2019-0211**
Apache HTTP Server における認可・権限・アクセス制御に関する脆弱性でした。

- **CVE-2019-0220**
Apache HTTP Server におけるリソース管理に関する脆弱性でした。

- **CVE-2018-1283**
Apache HTTP Server におけるmod_sessionでセッション情報が改ざんされる脆弱性でした。

- **CVE-2018-1301**
Apache HTTP Server におけるHTTPリクエスト処理のサービス運用妨害(DoS)の脆弱性でした。

- **CVE-2018-1302**
Apache HTTP Server におけるHTTP/2通信処理解放済みメモリ使用の脆弱性でした。

- **CVE-2018-1303**
Apache HTTP Server におけるHTTPリクエスト処理のサービス運用妨害(DoS)の脆弱性でした。

- **CVE-2018-1312**
Apache HTTP Server におけるmod_auth_digestのリプレイ攻撃が可能になる脆弱性でした。

- **CVE-2018-1333**
Apache HTTP Server におけるリソース管理に関する脆弱性でした。

- **CVE-2018-11763**
Apache HTTP Server における入力確認に関する脆弱性でした。

- **CVE-2017-15710**
Apache HTTP Server におけるmod_authnz_ldapのサービス運用妨害(DoS)の脆弱性でした。

- **CVE-2017-15715**
Apache HTTP Server における&lt;FilesMatch&gt;で認証を回避される脆弱性でした。

- **CVE-2018-17199**
Apache HTTP Server におけるセッションの固定化の脆弱性でした。

サイバーセキュリティ企業の Palo Alto Networks が公開しているデータベースでも確認すると、やはり High Risk 認定でした。

https://urlfiltering.paloaltonetworks.com/

指摘項目の数は多いのですが、すべてApache2.4系の脆弱性であり、すでに修正版も配布されています。

https://httpd.apache.org/security/vulnerabilities_24.html

# 対策
Apache 2.4.39 以降にアップデートすれば解決です。
以下は Ubuntu 18.04 におけるアップデート手順になります。

:::note
コメントにもあります通り、Ubuntu 18.04 の標準パッケージでいずれも修正されているとのことですので`apt update && apt upgrade` のみでOKですが、Apache自体のアップデートが目的なら以下の手順で対処します。
:::

まず最初に、競合を防ぐためパッケージを最新にしておきます。

```
apt update && apt upgrade
```

リポジトリを追加してパッケージリストを更新します。

```
add-apt-repository ppa:ondrej/apache2 -y
```

パッケージのバージョンを確認します。

```
apt show apache2
```

適用します。

```
apt update && apt upgrade
```

Apache2 のバージョンを確認します。

```
apache2 -v
```

という感じです。
実際には、Apache2 や関連ミドルの停止をしておいた方が良いです。

# PAN-DB の更新
脆弱性診断ツールがPAN-DBを利用し、URLカテゴリもおかしいなら、変更リクエストをしましょう。
[Test A Site](https://urlfiltering.paloaltonetworks.com/) から *Request Change* をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/ab937ebe-73d3-97b3-46a7-1ad7696435f1.png)
申請が通れば **High Risk** が **Low Risk** に変わるはずです。
IBM RPAでの例外ハンドリングについて考えてみる

# 業務ユーザーによるボットの実装の注意点
RPA(Robotic Process Automation)はビジネス・ユーザーにも実装しやすいソリューションではありますが、ビジネス・ユーザーによって実装された場合には以下の様な問題が起きがちです。
- エラーハンドリングの不備
- テスト不足
- パフォーマンスの低下
- ネーミング・ルールなどが無いことによるスクリプトのメンテナンス性の低下

これらの領域にはやはりIT部門に一日の長がありますので、RPAのプロジェクトであっても、IT部門を巻き込むことが重要です。この記事では、IBMのRPA製品であるIBMRPAを用いて、実際の例外ハンドリングの方法について整理したいと思います。

# 例外の処理方針
一番大切なのは、例外が起きた時にどのように処理するか、基本的な方針として決めておくことです。これが正解！という完璧な方針があるわけではないのですが、例えば以下のようなものです。

- あらかじめ想定できる例外でリカバリー可能なものはハンドリングしてリカバリーする

例えば、エクセルのファイルを開こうとしてユーザーが開ていたために、開けないことが良くあります、このような典型的なケースではあらかじめ例外が想定できるので、
　1. RPA側から開いているファイルを閉じる
　2. ユーザーに、ファイルを閉じることを依頼するダイアログを表示させ、閉じてもらう
　といった対応をさせ、その場でリカバリーの手段を講じます。


- 想定外の例外が発生した場合、"正しく"終了する

想定外の例外が起きたケースにおいては、どのように対応するか判断できないため、リカバリーすることができません。かといって、例外が起きたという情報を握りつぶして、ボットとして正常終了させることは好ましくありません。ログを出力する、あるいは、通知したのちに、ボットを異常終了として終了させる必要があります。そこで、
　1.エラーが起きた場合にはログを出力すること。
　2.スクリプトを異常終了として終了させること。
といった、共通の対応方法を規定しておくことが大切です。

- ユーザーにシステムのエラー・メッセージを極力見せない。

ユーザーに対してどのような形でエラーが起きたとことを示すのか、それも方針といってよいでしょう。一般的にシステムの詳細な情報が含まれるログをユーザーに見せることは好ましくありません。
1. エラーコード
2. 一定時間後の再試行やシステム部門への連絡を促すメッセージ
といった表示の内容などを統一しておきましょう。


中身としては、一見当たり前のことかもしれませんが、大切なのはこれらのことをすべての開発者が理解して開発することです。プロジェクトの開始前などに、基本的な例外ハンドリングを実装したサンプルなどを共有して、方針を確認することをお勧めします。
# IBMRPAによる例外のハンドリング
IBMRPAには例外ハンドリングのために以下のコマンドや機能を提供しています。
- エラーを処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/3292e411-7e63-9ce1-786c-4769f1c09229.png)
「エラーを処理」コマンドを使用することで、このコマンド呼び出し以降のスクリプト内(サブルーチンを含む)でエラーが発生した場合に、コマンドやサブルーチンを呼び出して実行することができます。エラー・ハンドリングの際に共通のエラー処理用サブルーチンを呼び出すのに適しています。サブルーチンの処理が完了すると、スクリプトはエラーとして終了します。スクリプトを終了させず、処理を継続するには次に述べる、「エラーからのリカバリー」コマンドを呼び出す必要があります。

- エラーからのリカバリー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/e06eb74b-91a3-b074-8f46-9bf70b7f2f1e.png)
「エラーからのリカバリー」コマンドは、例外をエラーから回復する際に使用します。このコマンドを呼び出すことで、エラーが発生した直後のコマンドからスクリプトを再開することができます。

- 正常終了フラグの活用
多くのコマンドでは、処理が正常に終了したかどうかを示すフラグを返します。例えば、HTTPの呼び出しで404が返ってきた場合などは、呼び出し処理自体は正常に行われているのでエラーは発生しません。場合によってはこのフラグを確認して判断して対応する必要があります。

- エラー情報の取得
IBM RPAでは、エラーが発生した際にその情報を環境変数${wdg:error}に格納します。エラー発生時にはここに含まれる情報をログ出力するなりして、問題解析の際に使用できるようにしましょう。

- 例外のスロー
ユーザーがカスタム・メッセージを定義して独自の例外をスローし、呼び出し元のコンポーネントに例外を通知することも可能です。例外をスローする際には、「例外のスロー」コマンドを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/9766267d-d67c-e790-f33e-6f151cb1d629.png)
メッセージのフォーマットなどを統一しておくことや、定義した例外の一覧などを管理しておくことも重要です。
# まとめ
いかがでしたでしょうか？この記事では例外ハンドリングの基本的な考え方と、IBMRPAの例外に関する機能について紹介しました。RPAであっても、基本的な例外ハンドリングの思想は、他のプログラミング言語と変わりありません。プロジェクトの開始前に、例外ハンドリングの方針をしっかりと決め、開発者向けのガイドやサンプルを共有することで、一貫した例外のハンドリングを実装することをお勧めします。

### ※Japan Business Automation User Groupのご紹介
IBMのコミュニティーである、[Japan Business Automation User Group](http://ibm.biz/JPBizAutomationUG)では、IBMのBusiness Automation製品関連の様々な技術情報、イベント情報の参照や、フォーラムを介した技術的な質問を行うことが可能です。是非ご参加ください。　http://ibm.biz/JPBizAutomationUG
整数型のIDの末尾が1のレコードを抽出/フラグ化する(SPSS Modeler データ加工逆引き2-7)

# 整数型のIDの末尾が1のレコードを抽出/フラグ化

![スクリーンショット 2022-07-15 11.21.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/cddb5d02-b0cb-5144-5656-886b0c1db930.png)

## 1.想定される利用目的

・商品IDから特定カテゴリへの絞り込み
・ロット番号からサンプリング

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/endstring.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-07-15 11.22.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/07c83423-84f1-ed24-e265-da304c974aa2.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-07-15 11.15.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e9683341-b82e-ca5f-0373-72db7deb4d85.png)

b.[置換]ノードを編集します。[置換:]を[常時]にして to_string(フィールド)を利用して整数のIDを文字列に置換します。
![スクリーンショット 2022-07-15 11.22.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/78afbdcd-2d5e-7af4-4a10-4b8bd893e0ad.png)

c.[条件抽出]ノードを編集します。isendstring("文字列",フィールド)で末尾に文字列がある場合は「真」になります。文字列ですので"01"でも"001"でも同じ結果になります。
![スクリーンショット 2022-07-15 11.24.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/86d35be7-85a0-eefd-126f-ef466bc135cd.png)

[テーブル]を実行します。
![スクリーンショット 2022-07-15 11.15.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7c17d13e-7388-088b-a99f-5308f3ed2ba3.png)

d.[フィールド作成]ノードを編集します。[派生]モードは[フラグ型]にして先ほどのcと同じ式を真の条件にします。
![スクリーンショット 2022-07-15 11.24.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8b674fc8-0b6e-c354-24ac-fd1c3802a50a.png)

[テーブル]を実行します。
![スクリーンショット 2022-07-15 11.17.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/67d8009b-ece5-8712-494d-6cf95af56abf.png)

#### 関数を組み合わせる方法

e.置換ノードを介さず直接以下でもOKです。
![スクリーンショット 2022-07-15 11.24.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4a153c96-96c2-8b2b-972f-f641d1d4f985.png)

f.置換ノードを介さず直接以下でもOKです。
![スクリーンショット 2022-07-15 11.25.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/286561c5-c24f-6a8d-373e-e0386bfc7341.png)

#### 注意事項

isendstring("文字列",フィールド)は文字列ですので"01"でも"001"でも同じ結果になります。

## 4.参考情報

#### よく使う文字列関数

https://qiita.com/Makimaki2020/items/35ab02a7375325e678c1

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
nodejs で import がシンタックスエラーを吐く

ある`nodejs`のコードを実行しようとしたら以下のようなエラーを吐かれた

```jsoutput
import pkg from '<libname>';
^^^^^^

SyntaxError: Cannot use import statement outside a module
```

https://bobbyhadz.com/blog/javascript-syntaxerror-cannot-use-import-statement-outside-module#:~:text=The%20%22SyntaxError%3A%20Cannot%20use%20import,json%20for%20the%20Node%20apps.

によると、どうもJavascriptのバージョン`ES6`からの機能を使ったコードが含まれている場合にこのようなことが起きるらしい。
`Nodejs`の場合には`package.json`の中に以下のような記述を追加すればよいらしい。

```json
{
  "type": "module",
}
```
AtCoder ABC261 D の提出を集計して感じたところ + Ruby で解けず crystal で解いてみた

# はじめに
AtCoder さん、ありがとうございます。
# D - Flipping and Bonus
https://atcoder.jp/contests/abc261/tasks/abc261_d

いわゆるDP問題
# 提出の集計
コンテスト中（2022-07-23(土) 21:00 ~ 22:40）の延べ提出数（当社調べ）
||Python (3.8.2)|PyPy3 (7.3.0)|Ruby (2.7.1)|Crystal (0.33.0)|C++ (GCC 9.2.1)|
|:--:|--:|--:|--:|--:|--:|
|AC|4|565|12|7|2283|
|WA|59|**18**|11|**6**|**1006**|
|TLE|**150**|11|**27**|1|191|
|RE|26|3|2|0|110|
|CE|0|0|0|1|46|
|subtotal|239|597|52|15|3636|

`C++`や`PyPy`での提出数が多いのはそうなのですが、
不正解の内訳からしますと、`C++` `PyPy` `Crystal`はいかに`WA`を出さないかのゲーム、`Ruby` `Python`はいかに`TLE`を出さないかのゲームで、同じ問題であっても競い合うゲームの内容が異なる様に思われます。
# Ruby (TLE)
```rb
n, m = gets.split.map(&:to_i)
x = gets.split.map(&:to_i).reverse
cy = Hash.new(0)
m.times do
  c, y = gets.split.map(&:to_i)
  cy[c] = y
end
h = Hash.new(0)
h[0] = 0
x.each do |xx|
  q = Hash.new(0)
  h.each do |k, v|
    q[k + 1] = v + xx + cy[k + 1] if q[k + 1] < v + xx + cy[k + 1]
    q[0] = v if q[0] < v
  end
  h = q
end
puts h.values.max
```
上記表の、Ruby_TLE の 1/27 ですね。

ハッシュを使用することにより配列のサイズを小さくしつつ、コピーする戦略でしたがTLE。

いつものごとく最後の悪あがき`crystalizer2`でトランスパイル。

https://github.com/superrino130/crystal-on-paiza.cloud
# crystal (AC)
```cr
n, m = read_line.split.map(&.to_i)
x = read_line.split.map(&.to_i).reverse
cy = Hash(Int32, Int32).new(0)
m.times do
  c, y = read_line.split.map(&.to_i)
  cy[c] = y
end
h = Hash(Int32, Int32).new(0)
h[0] = 0
x.each do |xx|
  q = Hash(Int32, Int64).new(0)
  h.each do |k, v|
    q[k + 1] = v.to_i64 + xx + cy[k + 1] if q[k + 1] < v + xx + cy[k + 1]
    q[0] = v.to_i64 if q[0] < v
  end
  h = q
end
puts h.values.max
```
上記表の、crystal_AC の 1/7 （悪あがきで大勝利）。

ここでは、overflow対応として`Int64`を使用する必要があります。

||Ruby|crystal|
|:--:|--:|--:|
|実行時間(ms)|TLE|1015|
論文まとめ：Unified Deep Supervised Domain Adaptation and Generalization

# はじめに
かなり古いが ICCV2017 より以下の論文
[1] S. Motiian, et. al. Unified Deep Supervised Domain Adaptation and Generalization. ICCV2017.
のまとめ。

- CVF open access
https://openaccess.thecvf.com/content_iccv_2017/html/Motiian_Unified_Deep_Supervised_ICCV_2017_paper.html

- github
https://github.com/samotiian/CCSA
Keras実装

既に多くの解説があると思うので、備忘録的に気になった点のみまとめ。

# 概要
- 画像データに対して教師あり domain adaptation する系のモデルで、特にターゲットのデータが少数の場合の手法
- CNNで畳み込んだ後の embedding subspace でソースとターゲットのクラスが同じ場合は近づけ、異なる場合は話すように学習させる

以下の図において
 ![スクリーンショット 2022-07-26 4.37.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/ed9040cf-3b75-07ee-5427-6a40c0124f1d.png)
（[1] Figure1より）

- SourceとTargetは同じCNNでembedding subspaceへ写像させる
- Sourceはclassification lossで学習させる
- SourceとTargetはembedding subspaceにおいてConstrastive Semantic Alignment lossなるもので学習させる
- 具体的には図中右のように、同じクラスの場合は semantic alignment loss で近づけ、異なるクラスの場合は separation loss で遠ざける

# 手法
## 定義
大量（N個）にあるソース・ドメインのdatasetを

```math
\mathcal{D}_s = \{ (x^s_i, y^s_i) \}^{N}_{i=1}
```

とする。x：data（画像）、y:ラベル。

同様に少量（M個）しかないターゲット・ドメインのdatasetを

```math
\mathcal{D}_t = \{ (x^t_i, y^t_i) \}^{N}_{i=1}
```

$g : \mathcal{X} \rightarrow \mathcal{Z}$ ・・・ネットワークのうち入力画像を畳み込んで特徴空間へembeddingする部分
$h : \mathcal{Z} \rightarrow \mathcal{Y}$ ・・・ネットワークのうち特徴量を分類してラベルを出力する部分g
$f =h \circ g $ ・・・ネットワーク全体

## Lossの全体
本手法では３種類のlossを最小化する事で実現する（以下、式の番号は論文と一致）

```math
\mathcal{L}_{CCSA} (f) = \mathcal{L}_{C} (h \circ g) +  \mathcal{L}_{SA}(g) + \mathcal{L}_{S}(g) \tag{5}
```


## classification loss
source domainのデータに対して通常のclassification lossを用いる。

```math
\mathcal{L}_{C} (f) = E[\ell (f(X^2), Y) ] \tag{1}
```

## semantic alignment loss
embedding subspace においてサンプリングした同じラベルのsourceドメインのデータとtargetドメインのデータとの間で距離を最小化させる。

```math
\begin{eqnarray}
\mathcal{L}_{SA}(g) &=& \sum_{i,j} d(g(x^s_i), g(x^t_j)) \tag{7} \\
 &=& \sum_{i,j} \frac{1}{2} \| (g(x^s_i) - g(x^t_j)\|^2 \tag{9}
\end{eqnarray}
```

$\| \| \cdot \| \|$ はフロベニウスノルム。

## separation loss
一方で embedding subspace においてサンプリングした異なるラベルのsourceドメインのデータとtargetドメインのデータとの間で距離を一定以上に保つ。

```math
\begin{eqnarray}
\mathcal{L}_{S}(g) &=& \sum_{i,j} k(g(x^s_i), g(x^t_j)) \tag{8} \\
 &=& \sum_{i,j} \frac{1}{2} \max(0, m - \| (g(x^s_i) - g(x^t_j)\| )^2 \tag{10}
\end{eqnarray}
```

m - フロベニウスノルムと０とのmaxを求めているので、m - フロベニウスノルムの部分は0以下に収束 -> フロベニウスノルムの部分は m 以上に収束、となる。

# 実験と結果

以下の図は Office dataset における定量的評価。メトリクスはaccuracy。

![スクリーンショット 2022-07-26 5.18.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/584ad0f7-01cf-f20d-6a97-1f539337d70d.png)
（[1] Table1より）
CCSAが本手法。教師ありDAの既存手法より精度がよい。


# その後の教師ありDAモデル
例えば 2021年段階の論文
[2] L. Hedegaard, et. al. Supervised Domain Adaptation:A Graph Embedding Perspective and a Rectified Experimental Protocol. IEEE Transactions on Image Processing 2021.
https://arxiv.org/pdf/2004.11262.pdf
における定量的評価でも本手法CCSAは
![スクリーンショット 2022-07-26 5.24.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/3a7aa6c2-6512-eeda-49e8-9969a273fdab.png)
（[2] table2より）
と検討している。
【Git】GitHubからCSSを読み込む方法【CSS】


## リポジトリを作成する
リポジトリを作成します。
作成方法については以下のページをご参照ください。

https://docs.github.com/ja/get-started/quickstart/create-a-repo

## CSSファイルをpush
CSSファイルを作成し、`push`します。

## GitHub Pagesで公開
GitHub Pagesを使用します。
GitHubのリポジトリのSettignsページを開きます。
![image220726_050503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/b8d9335d-cb74-3d78-d213-2098e2e93bb0.png)
下画像四角のPagesを選択します。
![image220726_050711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/2af2e528-92fc-2df5-06b3-4cf07c0e9e42.png)
Sourceの欄で「None」が選択されていますので「main」を選択します。
選択したら「Save」をクリックします。
![image220726_050916.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/a13916d5-8ac6-bd8f-631a-79507b95be15.png)
すると下画像四角のようにURLが表示されます。
![image220726_051041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/b420e1c7-1de6-ac0a-c694-9ce7fa949ee6.png)
表示されているURLにCSSファイルまでのパスを追加してアクセスし、内容が表示されるか確認します。
![image220726_051732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/b081cdc3-0902-99bd-8909-9b3a645ff76e.png)

## HTMLファイルで読み込み
CSSファイルを読み込むためHTMLファイルに以下のように追記します。
```index.html
<!DOCTYPE html>
<html>
  <head>

    <link rel="stylesheet" href="CSSが表示されることを確認したURL" type="text/css">

  </head>
  <body>

  </body>
</html>
```

以上でCSSファイルが読み込まれます。
2022/7/26主にITとかセキュリティの記事

2Qセキュ相談、前四半期比約25％減 - 半減するも依然多い「Emotet」相談
https://www.security-next.com/138371

2022年2Qの脆弱性届け出は163件 - ウェブ関連が減少
https://www.security-next.com/138347

中国企業の車両盗難防止用GPSに「深刻な」脆弱性　遠隔操作される可能性も(7/22)
https://www.epochtimes.jp/2022/07/111455.html

ウクライナの大手ITベンダー狙う攻撃確認、ロシアのグループ関与か(7/24)
https://news.mynavi.jp/techplus/article/20220724-2405780/

ロシアへのDDoS攻撃アプリ偽りウクライナ人狙うAndroidマルウェア登場(7/23)
https://news.infoseek.co.jp/article/mynavi_2450262/?tpgnr=it

オンラインゲームをするならセキュリティにも注意！(7/22)
https://ascii.jp/elem/000/004/098/4098452/?rss

サイバー傭兵グループ「Void Balaur」追跡調査レポート公表(7/22)
https://scan.netsecurity.ne.jp/article/2022/07/22/47934.html

Windows 11、サインイン失敗10回でロック10分-ブルートフォース攻撃対策(7/23)
https://news.mynavi.jp/techplus/article/20220723-2406570/

任天堂、古いニンテンドーWi-Fiは絶対に使わないで！！【注意喚起】(7/24)
https://otona-life.com/2022/07/24/129091/

財務省「デジタル通貨係」、5人増員でも遠いゴール(7/24)
https://www.nikkei.com/article/DGXZQOUA113R60R10C22A7000000/

普通の人は知らないが､薬物乱用者なら絶対に知っている…麻薬捜査官が危険視する"あるアプリ"
拳銃､違法薬物､身分証…あらゆるものが｢ネット密売｣で買える(7/24)
https://president.jp/articles/-/59840?page=1

中国発時系列データベースの「Timecho」、約20億円の資金調達 IoTDBの発展に注力(7/24)
https://gunosy.com/articles/epOA0

仮想通貨ウォレットのプライバシーを巡る規制と課題とは｜Gammla Law寄稿(7/23)
https://coinpost.jp/?p=361337

シスコの複数製品に緊急の脆弱性、ただちにアップデートを(7/24)
https://news.biglobe.ne.jp/it/0724/mnn_220724_7730438178.html

約2400万円の被害　増える暗号資産詐欺を米FBIが警告(7/24)
https://forbesjapan.com/articles/detail/49096

IP-VPN(7/25)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031500132/071500005/

スニーカーフリマに不正アクセス　275万件超の個人情報漏洩か(7/25)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031800050/071500041/

昭和のヒーローであるCOBOLは「シン・コボル」に生まれ変われるか(7/25)
https://xtech.nikkei.com/atcl/nxt/column/18/01921/071900007/

旧版から移行には注意、最新Linux「Ubuntu」の変更点を知る(7/25)
https://xtech.nikkei.com/atcl/nxt/column/18/02107/062200005/

どうやって個人情報が漏れるのか、下火になったあのウイルス感染も再流行の兆し(7/25)
https://xtech.nikkei.com/atcl/nxt/column/18/02093/060300001/
３つのファイルのDiffを取るときの備忘録

# 概要
- ３つのファイルのDiffを取って違った場合にFAILEDになるテストスクリプトを作りたい
- 比較する３つのファイル名は同じである
- ２つのファイルを比較する場合difflibモジュールを使用することができるが、今回は３つのファイルを比較したいためsubprocessモジュールを使用して、diff3コマンドを実行してみる

# 参考
https://docs.python.org/ja/3/library/subprocess.html

https://kazmax.zpp.jp/cmd/d/diff3.1.html

# 環境
```
# Pythonのバージョンを確認
python --version
> Python 3.7.3

# pytestのインストール
> pip install pytest

# natsortのインストール
> pip install natsort
```

# 実装
```python:diff_3_files.py
import os
import glob
from natsort import natsorted
import pytest
import subprocess


folder_1 = "/path/folder_1"
folder_2 = "/path/folder_2"
folder_3 = "/path/folder_3"

files_1 = natsorted(glob.glob(os.path.join(folder_1, "*.txt")))

def get_testdata():

    testdata = []
    testdata_ids = []
    for filename_with_path in files_1:
        filename = os.path.basename(filename_with_path)
        filename = filename.split('.')[0]
        testdata.append(filename_with_path)
        testdata_ids.append(f'{filename}')
    
    return [testdata, testdata_ids]

testdata = get_testdata()[0]
testdata_ids = get_testdata()[1]


@pytest.mark.parametrize("id", testdata_ids)
def test_compare(id):
    
    target_file_1 = f"{folder_1}/{id}.txt"
    target_file_2 = f"{folder_2}/{id}.txt"
    target_file_3 = f"{folder_3}/{id}.txt"

    if not os.path.exists(target_file_1) or not os.path.exists(target_file_2) or not os.path.exists(target_file_3):
        raise FileNotFoundError

    # check_output: 引数でコマンドを実行し、その出力を返す。
    results = subprocess.check_output(['diff3',target_file_1,target_file_2,target_file_3])
    print(results.decode())

    assert not results, f"{target_file_1}, {target_file_2}, {target_file_3} FAILED!!"


```
# 結果
```
==================================================================================== test session starts =====================================================================================
platform darwin -- Python 3.7.3, pytest-7.1.2, pluggy-0.13.1 -- 
cachedir: .pytest_cache
rootdir: /Users/test
plugins: cov-2.12.1, freezegun-0.4.2, Faker-5.3.0, mock-3.7.0
collected 2 items                                                                                                                                                                            

test_diff_3.py::test_diff_3[1] PASSED                                                                                                                                                 [ 50%]
test_diff_3.py::test_diff_3[2] FAILED   
```
Linuxについて７（自分用メモ


LinuxやUNIXではviとEmacsが２大エディタとして知られている。

●viエディタの起動
vi ［ファイル名］

●viエディタの終了
:q

コマンドモードと挿入モードで使用できるコマンドが変わる。

コマンドモードのコマンドは大文字と小文字が区別される。
２文字で構成されるコマンドもある

挿入モードの切り替えコマンドで使用頻度が高いのは「i」「a」

挿入モードからコマンドモードに戻るには、「Esc」キーを押す。

ファイルを保存するコマンド
:w　［ファイル名］

ファイルを保存して終了するコマンド
:wq　または　ZZ

ファイルを保存しないで終了するコマンド
:q!

●viの基本的な編集操作
「dd」切り取り
「yy」コピー
「p」貼り付け
「x」１文字切り取り
「X」カーソルの左の１文字を切り取り

「dd」でカーソルにある行が切り取られる。切り取られた行はバッファという。

●コマンドの繰り返しと取り消し
viエディタでは、コマンドの直前に数字を入力すると、数字の回数だけコマンドが繰り返される。例えば、「2dd」を実行すると２行がきりとられる。
また、「5j」と入力すると５行下にカーソルが移動する。カーソル操作においても利用できる。

直前のコマンドを繰り返したい場合は「.」コマンドを使う。「.」を入力するごとに直前の操作をなん度も実行することができる。

「u（undo）」コマンドを実行すると、コマンドモードで直前の操作が取り消される。
取り消しの取り消しは「Ctrl＋R」キーで行う。

●文字列の検索
「/検索したい文字列」
例）/Vim

・複数文字列が該当した場合は「N」キーを押すごとにカーソルが移動する。「Shift＋N」で反対方向にカーソルが移動する。
・ファイル先頭に向かって検索したい場合は、[/]の代わりに「?」を使う。

●setコマンド
setコマンドでエディタのさまざまな設定を変更できる
「:set コマンド」
例）:set number　行番号を表示する

●デフォルトエディタの切り替え
環境変数EDITORにエディタのパスを指定することでデフォルトエディタを切り替える。
例）export EDITOR＝/usr/bin/nano
nanoエディタをデフォルトエディタに切り替え

whichコマンドでエディタのパスを調べることができる。
例）which nano

※ログアウトするとデフォルトエディタはviに戻る。永続的に利用するには、bashの設定ファイル「~/.bashrc」にexportコマンドを記述する必要がある。
【husky】コミットと同時にESLint、プッシュと同時にJestを自動で走らせる

作成したNext.jsのプロジェクトに[husky](https://typicode.github.io/husky/#/)を用いて以下の機能を追加します。


commit時に[ESLint](https://eslint.org/)を走らせてerrorがあればcommitさせない
push時に[Jest](https://jestjs.io/ja/)を走らせてerrorがあればpushさせない



>huskyとは
コミットやプッシュの前にテストなどを実行して、失敗したら止めることができる Git hooks を簡単に設定することができるツール。



# 導入手順


__※以下yarnを使用したhuskyの導入についての説明をしていきます。__

① [lint-staged](https://github.com/okonet/lint-staged)の導入

```zsh
$ npx mrm lint-staged
```

② NPM スクリプトに追加


```json:package.json
{
  "scripts": {
    "lint-staged": "lint-staged"
  }
}
```

③husky の追加

```zsh
$ yarn add -D  husky@next
```

④Git hooks の有効化

```zsh
$ yarn husky install
```

⑤package.jsonに追加

```json:package.json
~~
"husky": {
    "hooks": {
      "pre-commit": "lint-staged",
      "pre-push": "yarn test"
    }
  }

~~
```

以上です。

# 動作確認

- `$ git commit -m "<message>"`を入力してESLintが走った様子

![a](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612915/1450be6b-d9f1-c493-4b7b-44874e63c06d.png)

- `$ git push`を入力してJestが走った様子
![a](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612915/7a2ed9f2-ae28-addc-a1f7-937e7a27a7f9.png)


## もしhuskyが走らなかったら...

`.git/hooks` が正常に作成されていない可能性があります。
以下コマンドで確認しましょう。

```zsh
$ ls -la .git/hooks/ls -la .git/hooks/
```

`.sample` しかなかったら再度huskyをインストールしましょう。

```zsh
$ yarn remove huksy
```


# 参考

https://www.youtube.com/watch?v=R35LJL6a-p0&t=1629s
https://qiita.com/282Haniwa/items/dcce1ba6bb6ae541893e#husky%E3%81%AE%E5%B0%8E%E5%85%A5
(React)NETFLIXのクローン

Reactで作成したNETFLIXのクローンもどき？

[サイト](https://ty-gcp2-96f8b.web.app/)

使用したライブラリ
react-redux
react-player
react-slick
react-icons

データは下記から取得
[TMDB API](https://developers.themoviedb.org/3)

[ソース](https://github.com/gomagon/netflix-clone)

# 参考
[https://dev.classmethod.jp/articles/display-react-slick-arrow/
](https://dev.classmethod.jp/articles/display-react-slick-arrow/
)
CapsLockを強制的にControlにする

参考: http://masaoo.blogspot.com/2017/12/cui-capslock-ctrl-dumpkeys-loadkeys.html

■ Ubuntu の場合
```
# dumpkeys > nocaps.keymap
# vi nocaps.keymap

(下記コマンドで変換、保存)
:%s/CtrlL_Lock/Control/g
:wq

# loadkeys nocaps.keymap
```
■ CentOS の場合
```
# dumpkeys > nocaps.keymap

# vi nocaps.keymap

(キーコード 58 の設定を Control に変更して保存)

# loadkeys nocaps.keymap
```