OmniAICreator/Qiita-1.07M huggingface dataset:
GASでGmailで指定の件名のメールから毎日決まった時間に添付ファイルをGoogle Driveに保存する方法

# ポイント
* Google driveの保存するフォルダと紐づける
* 指定する件名を設定する
* 今日と明日の日付を取得し件名の検索に加える
* 自動で実行するタイミングを設定する


# 方法

```javascript
function saveAttachment() {

    //取得するメールタイトルを指定
    let mail_title = '"eFax メッセージ"';

    // 今日の日付取得準備
    let date = new Date();
    // 今日の日付を定義
    let today = Utilities.formatDate(date, "JST","yyyy/M/d");
    //console.log (today);

    // 明日の日付取得準備
    let asu = new Date();
    //明日の日付を取得
    asu.setDate(date.getDate() + 1);
    //明日の日付を定義
    let tomorrow = Utilities.formatDate( asu, 'JST', 'yyyy/M/dd');
    //console.log(tomorrow);

     //検索マッチ条件、添付ファイルあり、今日〜明日のメール
     let query = 'has:attachment subject:(' + mail_title + ') after:('+ today + ') before:('+ tomorrow + ')';

     //指定条件でスレッド化
     let threads = GmailApp.search(query);

     //保存先のフォルダID
     let folderId = '自分の指定したいドライブのID';
      
     //スレッド化したメールの件数分繰り返し 
     threads.forEach(function(thread) {
      // スレッド内のメール一覧を取得
      let messages = thread.getMessages();
        
      // メールを一つずつ取り出す
      messages.forEach(function(message) {
      // 添付ファイルを取得
      let attachments = message.getAttachments();

          //添付ファイルの受信日付
          let date = Utilities.formatDate(message.getDate(), 'Asia/Tokyo', 'yyyyMMdd');

          attachments.forEach(function(attachment){
      
            //日付を加えたファイル名用意
            let fileName = date +'_'+ attachment.getName();
            attachment.setName(fileName);
          
            // ドライブに保存  
            DriveApp.getFolderById(folderId).createFile(attachment);
            //ファイル名を上書き
     })
    });
  });
}
```
【#3  エンジニア転職学習】Linux基本コマンド（移動,削除,履歴）

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

学習内容は昨日投稿した以下の記事を基にしています。


https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
* Powershellよく使うコマンド
* Linuxの基本用語等
* **Linux基本コマンド（移動,削除,履歴）　←Topic!!**

# Linux基本コマンド（移動,削除,履歴）
昨日からの続きで朝からPowershellの超基礎をやったので、流れでLinuxの入門をもう少し深堀することにしました。

使用している書籍はこちら↓

https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E-ebook/dp/B072K1NH76/ref=sr_1_1?adgrpid=113196705062&gclid=Cj0KCQjwzLCVBhD3ARIsAPKYTcR4WAb_4QVrwuBM_1mIPMFsQ6kNDJ-o4yIofVSAI7_eHpWCeva8kKwaAstgEALw_wcB&hvadid=489559881279&hvdev=c&hvlocphy=1009363&hvnetw=g&hvqmt=e&hvrand=10125867468998217428&hvtargid=kwd-1152146940662&hydadcr=21814_10996132&jp-ad-ap=0&keywords=%E6%96%B0%E3%81%97%E3%81%84+linux+%E3%81%AE+%E6%95%99%E7%A7%91%E6%9B%B8&qid=1655473534&sr=8-1


自分用メモも兼ねて基本操作コマンド一覧を表記しておきます。
カーソルキーすらも使用せずに[Ctrl + ~]で全て済ませるようになりたいですね。

**カーソル移動**
| コマンド | 内容 |
|:-:|:-:|
| Ctrl + b  | 後方に1文字分移動  |
| Ctrl + f  | 前方に1文字分移動  |
| Ctrl + a  | 行頭に移動  |
| Ctrl + e  | 行末に移動  |
| Alt + b  |  1単語単位で後方に移動 |
| Alt + f  |  1単語単位で前方に移動 |

**削除・ペースト（ヤンク）**
| コマンド | 内容 |
|:-:|:-:|
| Ctrl + d  | カーソル位置の1文字を削除  |
| Ctrl + h  |  カーソル位置の後方1文字を削除 |
| Ctrl + w  |  カーソル後方から前のスペースまでの区切りを削除 |
| Ctrl + k  | カーソル位置から行末までを削除  |
| Ctrl + u  | カーソル位置から行頭までを削除  |
| Ctrl + y  | 最後に削除した内容を復元  |

**履歴**
| コマンド | 内容 |
|:-:|:-:|
| Ctrl + p / ↑  | 1つ前のコマンド履歴に移動  |
| Ctrl + n / ↓ | 次のコマンド履歴に移動  |
| Ctrl + r | 履歴を遡ってインクリメント検索（文字入力すると該当する履歴が表示される）  |

# おわりに
最後までお読みいただきありがとうございました。
明日も引き続きLinuxの基本を進めていこうと思います。
アドバイス・応援コメント等いただけますと幸いです。
tweepyでツイートを取得

# 1. はじめに
目的：twitter APIでツイートを取得する
pythonのtweepyというライブラリを使う.
`pip install tweepy`
twitter API V2は登録済みで話を進める．
V2では過去約7日分くらい（もうちょっと取得できるときもある）を取得可能．
ただ、15分単位で取得数に限度あり．

# 2.　検索クエリ
```python
searchkey = '"スマホ" iphone apple -filter:retweets'
tweets = tweepy.Cursor(api.search_tweets,q=searchkey,lang='ja').items(2000)
``` 

`q`：検索したいワードを入れる．
上記の例だと、**スマホ AND iphone AND apple AND リツーイトではない**
`lang`：検索に対象の言語（ja：日本語、en：英語、 etc...）
`items()` ： 取得ツイート数

### qについてもう少し詳しく書く
構文|内容|
:-:|-|
`'iphone'`|iphone,IPHONE,アイフォンなど様々な変換されたワードで検索
`'スマホ iphone'`|単語と単語の間が空白だとAND検索
`'スマホ OR iphone'`|OR検索
`'-filter:retweets'`|リツイートを除外
`'-iphone'`|iphoneが入っているtweetを除外
`"ipone"`|完全一致ワードの検索
【AWS】S3まとめ

# はじめに
こんにちは。rattsl(@rattsl)です。
今回はAWS S3についてハンズオンで色々いじったのでメモとして残します。
間違えて認識している部分があったらご指摘ください。

# S3とは
マネージド型で提供されるの***オブジェクト型ストレージサービス***。
S3はシンプルストレージサービスの略。

- 1GBあたり約2.5円/月
- スケーラブルでデフォルトで冗長化されている
- 転送中、保存時は暗号化が可能

***バケット***という名の保存場所に保存され、バケット名はグローバルで一意である必要がある。

## S3アクセスポイント
S3をアプリケーション上にセットアップした際、どのレイヤーのデータまでアクセスしていいかを管理する。

アプリケーションサーバーのIPアドレスを設定したり、VPCに対して特定のS3バケットへのアクセス制限を設定することでアクセス管理をコントロールすることが可能。

## S3アクセスアナライザー
アクセスポリシーに沿ってアクセスされているかを確認し、不正なアクセスがないか監視する機能。

## ライフサイクル管理
バケット内のオブジェクト単位でストレージクラスの変更や削除時期などを設定することで実行を自動化する。

## レプリケーション
リージョン間を跨ぐクロスリージョンレプリケーションで耐障害性を高めこと。

## バージョン管理
間違ってS3上のデータを削除してしまった際、バージョンから復旧できる。
デメリットとしてはデータの更新があるたびに新しいバージョンが作成されてしまい用量を食うので定期的に古いバージョンはライフサイクル管理で削除する必要がある。

## バックアップ
- 基本的にはライフサイクル管理でGlacierにアーカイブを残すことで実現する。
- リストアはバージョン管理で削除されたデータを復元して実現する。

## S3内データ検索、解析
S3内のデータ検索、解析は用途に応じて様々なサービスから実行できる。

| 分析サービス | 特徴 |
|:-:|:-:|
| S3 Select |  S3にデフォルトの機能でS3内にクエリを実行し。データを取得できる。 |
| Amazon Athena |  S3内データに直接アクセスし、より高度で複雑なクエリを実行できるサービス|  
| Amazon Macie | 機械学習型クエリサービス |
| Amazon RedShift Spectrum | S3に格納されているデータに対してAmazon RedShiftから直接クエリを実行できるサービス |

## CORS（クロスオリジンリソースシェアリング）
異なるドメイン同士を共有化させる為の定義。
例えばEC2とS3を違ったWebホスティングサービスを利用しホスティングした際、URL(ドメイン名)が違ってくる。その異なるドメイン間のリソースのシェアをCORSが実現する。

## バッチオペレーション
S3のでかいデータに対して一括処理を実行することが可能。バッチオペレーションは***ジョブ***と***マニュフェスト***という単位で設定することができる。

### ジョブ
- ジョブを作成することでバッチオペレーションを実行可能。
- S3バッチオペレーションにオブジェクトのリストを渡して、それぞれのオブジェクトに対して実行するアクションを指定する。

### マニュフェスト
- ジョブを実行するオブジェクト
- マニュフェストオブジェクトキー、ETag、バージョンID（オプション）を指定

# S3の用途
大量のデータを長期保存する目的で使う。主な役割としては以下

1. コンテンツ配信・保管場所としての役割
2. ログ・バッチの保管場所としての役割
3. バックアップ/ディザスタリカバリとしての役割
4. webの静的ホスティングとしての役割
5. データレイクといった使い方としての役割

## まとめ
Reactでビルドした静的資産をS3におくパターンがよくあるみたい。S3 + CroudFrontでCDN化もためしてみたいところ。
技術メモにはScrapboxが最強

Scrapboxがメモツールとして最強でした。

ここではその魅力・特徴、カンタンな使い方を紹介します。

# 検索力とリンク力のScrapbox

これがScrapboxです：

https://scrapbox.io/rex/

探したい時は上にある検索ボックスで「powershell」とか「revshell」とか「injection」などのキーワードを入れれば、それらが含まれる記事がすぐ候補に出てきます。

![スクリーンショット 2022-06-17 21.42.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/869520df-a08d-52dc-0ce8-c8ecac409a95.png)

また、Scrapboxの特徴である**リンク**が素晴らしい。

各記事にキーワドとなるリンク（Twitterのハッシュタグみたいなもの）が張れて、関連記事が自動で表示されます：

![スクリーンショット 2022-06-17 21.46.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/73f0bd38-e212-61c1-36da-effc090cc32f.png)


# 保存や編集が超シームレスに行える

記事を見ていて、タイポがあったらその場ですぐに編集できます。そしてすぐに自動で保存されます。

つまり、保存や記事の編集をするタイミングでいちいちキーを押す必要がないということです。

（Googleにログインしている必要はありますが。）

この点もメモツールとして最強だと思う理由です。

いつでもすぐに書いて編集して、勝手に保存されるという手軽さ。

# texが使える！

![スクリーンショット 2022-06-17 22.01.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/3cfb6c07-f9a1-65c1-39cc-2b688422f027.png)

そのページを印刷（`⌘`+`p`または`ctrl`+`p`）でpdfに変換できます。

# Scrapboxはどのように使えばいいのか？

:::note info
重要なキーワードは、記事内でリンクとして指定しておく
:::

とりあえずはじめはこれを覚えておけばいいと思います。

”リンクとして指定”する方法は、以下の2通りがあります：

- キーワードを`[]`で囲う：[keyword]
- キーワードを`#`に続けて書く：#keyword

すると、以下のようにリンクが作られます（New Links）。すでにそのリンクがある場合はそのキーワードを含んだ記事が表示されます（injection）：

![スクリーンショット 2022-06-17 22.10.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/63ba8e80-734d-fc53-b42e-51b9237de76e.png)

（キーワードにリンクするということ）

# 最強のメモツールに出会えた

しっかりとした記事ではなく、本当に数行程度のメモを書き置きできるサービスを探していました。

最初はGithubに書いていたのですが、カテゴリ分けされていなかったり、タグがなかったりとパッとあのメモを見返したい時にすぐ見つからないことが多々ありました。

流石に数行程度の記事をあげるのはQiitaには相応しくないと思います。

その後、カテゴライズや記事内検索ができる ”はてなブログ” が良いのではないかと考えました。

しかし、メモを見る度にいちいち広告がウザいのがどうしても気に入りませんでした。

諦めかけていた時Scrapboxなるものを発見しました。

その名の通り、数行程度のメモを置いておくにはちょうどよく、リンク・タグ、記事内検索などとにかく検索力に優れていて、さらにダークモードで表示できる。

まさに自分の要望うってつけのサービスでした。
空間図形「静岡大学１９９６年前期Ｑ－１第２問」をsympy でやってみた

オリジナル

https://mathmathmass.exblog.jp/31691566/

上と同じです。大学入試数学問題集成＞【2】

https://mathexamtest.web.fc2.com/1996/199610461/1996104610100mj.html#top-0106


# sympyで
関数があるはずです。見つけからなかったので,途中Matrixを使っています。
アドバイスをお願いします。

```python
from sympy import *
var('s t')
def myPtoM(myPoint3D):
    return Matrix([myPoint3D.x,myPoint3D.y,myPoint3D.z])
def myMtoP(myMatrix):
    return Point3D(myMatrix[0],myMatrix[1],myMatrix[2])
def myHtoP(myHairetu):
    return Point3D(myHairetu[0],myHairetu[1],myHairetu[2])
def myCrosstoP(P1,P2):
    return myMtoP(myPtoM(P1).cross(myPtoM(P2)))
def myDot(P1,P2):
    return myPtoM(P1).dot(myPtoM(P2))
# (1)---------------------------------------------------
OA=Point(-2, 3,-4)
OB=Point( 0,-3, 7)
d1=Point( 1, 2,-1)
d2=Point( 4, 3,-5)
OP=OA+s*d1
OQ=OB+t*d2
ans=solve([OP.x-OQ.x,OP.z-OQ.z],[s,t])
print("#(1)",(OP.y-OQ.y).subs({s:ans[s],t:ans[t]})==0)
# (2)---------------------------------------------------
PQ=OQ-OP
ans=solve([PQ.dot(d1),PQ.dot(d2)],[s,t])
OP=OP.subs({s:ans[s],t:ans[t]})
OQ=OQ.subs({s:ans[s],t:ans[t]})
PQ=PQ.subs({s:ans[s],t:ans[t]})
print("#(2)",OQ,PQ)
# (3)(4)(5)----------------------------------------------
Plv1=myHtoP(Plane(OA,OP,OQ).normal_vector).unit
Plv2=myHtoP(Plane(OB,OQ,OP).normal_vector).unit
print("#(3)",Plv1)
print("#(3)",Plv2)
print("#(4)",Eq(Plane(OA,OP,OQ).equation(),0).simplify())
print("#(4)",Line3D(Point(0,0,0),Plv1).angle_between(Line3D(Point(0,0,0),Plv2))*180/pi)
#(1) False
#(2) Point3D(4, 0, 2) Point3D(7, -1, 5)
#(3) Point3D(-3*sqrt(2)/10, 2*sqrt(2)/5, sqrt(2)/2)
#(3) Point3D(-sqrt(6)/15, 11*sqrt(6)/30, sqrt(6)/6)
#(4) Eq(-3*x + 4*y + 5*z, -2)
#(5) 30
```

# 感想

(共通垂線)も、T氏様の方法でできるような気がしました。



# 参考

https://qiita.com/mrrclb48z/items/9bc51311516383c3a5e3
「カイゼン・ジャーニー」の感想

 ### 読んだ本
 - カイゼン・ジャーニー たった1人からはじめて、「越境」するチームをつくるまで  
 - 著者：市谷 聡啓、新井 剛
 - 初版発行：2018年2月7日 
 - Amazonの紹介ページは[こちら](https://www.amazon.co.jp/%E3%82%AB%E3%82%A4%E3%82%BC%E3%83%B3%E3%83%BB%E3%82%B8%E3%83%A3%E3%83%BC%E3%83%8B%E3%83%BC-%E3%81%9F%E3%81%A3%E3%81%9F1%E4%BA%BA%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%80%81%E3%80%8C%E8%B6%8A%E5%A2%83%E3%80%8D%E3%81%99%E3%82%8B%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%BE%E3%81%A7-%E5%B8%82%E8%B0%B7-%E8%81%A1%E5%95%93/dp/4798153346)  

 ### この本を選んだ理由
 - アジャイルを勉強中なので  
 - 読みやすいと上司に勧められたから

 ### 学んだこと、気づいたこと
 - 以前アジャイルの本を読んだときは「スクラムマスター」がよく分からなかったけど、今回この本を読んで、山岳ガイドさんみたいなもの？と置き換えたら少しハラオチした。  
 登山チームと一緒に山を登りつつ、「いい登山体験をするには」のノウハウを知っていて必要なタイミングで教えてくれてる人、という理解で近いんじゃないだろうか。
 - 同じく「プロダクトオーナー」もよく分からなかったけど、「要件を定義する人」って考えたら少し理解できた気がする。
 - スクラムチームのメンバーには「スクラムマスター」「開発チーム」「プロダクトオーナー」と役割がある、という説明を読んだことがあるけど、実際には1人2役だったり、いなかったり、複数人で1役のケースもあって、現場ごとの状況によって変わる(変えられる)のだと分かった。  

 ### 雑感
 - 全27話の物語で、とても読みやすかった。
 - 各話についている解説も含めて1話 15分～20分くらいで読めて、話の続きが気になるので、毎日読書を続けられた。1日1～2話ずつしか読み進められなくて、1冊に2週間近くかかったけど、毎日継続できた。
 - 自分にはアジャイルの経験はないけど、アジャイル開発を疑似的に経験した気持ちになった。アジャイルの説明本を読んでもいまいちピンとこなかったけど、この本では疑似体験を自分の世界と照らし合わせて「こういうことかな？」と思うことができた。
 - 開発の終盤で大きな問題が起きて、メンバー間で感情が高まって衝突しそうになったときに、主人公が穏やかな態度を崩さずに解決に向けて行動する場面が印象的だった。(自分は一緒になって激高してしまうタイプなので、こうありたいなと。)

 ### その他、思ったこと
 - 「あなたは何をしている人なんですか？」  
  私は何をしている人なんだろう？  
  今は、Windowsアプリを保守メンテしている人です。
  でもいつかは、WindowsやMacでアプリを開発する人です、って言いたい。
 - 「越境」は、何らかの「境」を超えることで、私にとってはこの記事を投稿することもその一歩です。
[Swift]対象のメソッドが呼ばれたかどうかをテストしたい

```.swift
final class Controller {
    private let useCaseInput: UseCaseInput

    init(useCaseInput: UseCaseInput) {
        self.useCaseInput = useCaseInput
    }

    func onHogeHogeButtonTapped() {
        useCaseInput.hogehoge()
    }
}

protocol UseCaseInput {
    func hogehoge()
}

final class UseCase: UseCaseInput {

    func hogehoge() {
        print("hogehoge")
    }
}

```
このようにクラスAがクラスBのメソッドを呼ぶコードがあり、テストで呼ばれているかを確認したい場合の対応法について書きます。

結論。インターフェースを使ってモックを作成し、テストを書けばいい。

```.swift
final class MockUseCase: UseCaseInput {
    
    var isHogeHogeCalled = false
    func hogehoge() {
        isHogeHogeCalled = true
    }
}
```

```Test.swift
import XCTest

final class ControllerTests: XCTestCase {

    override func setUpWithError() throws {
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }

    override func tearDownWithError() throws {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
    }

    func test_hogehoge() throws {
        let useCase = MockUseCase()
        let controller = Controller(useCaseInput: useCase)

        useCase.onHogeHogeButtonTapped()
        XCTAssertEqual(useCase.isHogeHogeCalled, true)
    }
}
```
これで`hogehoge()`が呼ばれているかどうかテストすることができる。

例のコードが分かりにくかったらごめんなさい💦
不偏分散の計算(matlabで素早く計算する方法)

# 不偏分散
データ$x_1, x_2, \cdots, x_n$が与えられたとき不偏分散は
```math
s^2 = { \sum_i( x_i - \bar x )^2  \over (n-1)}\\
= {  \sum_i(x_i^2) -  {(\sum_i x_i)^2 \over n}   \over (n-1)} \\
\bar x ={ \sum_i x_i \over n}
```

この二つの式のとおりにmatlabで不偏分散を計算し計算にかかる時間を比較した。またmatlabが用意する関数varとの比較も行った。結果、matlabの関数varを用いる場合、一桁以上遅い。

var()が遅いのは、var()がmファイルでかかれているためである。他方、sum()はmatlabのbuilt-in関数であるため非常に素早く処理される。ベクトルの総和は内積 x*ones(n,1) で計算することもできるが、そのときの計算時間はsum()と大凡等しい。

matlabコードのvar3とvar2の比較ではvar3のほうがわずかに速い。ただし分散が平均値にたいして非常に小さいときvar3の計算手順は大きな計算誤差を生むことをご指摘いただきました。

平均の計算は、x*ones(n,1)/n で行っているが、これを関数meanを用い行うと遅くなる。これはやはりmeanがmファイルであるからである。

分散の計算 var3 = ( sum(x.^2) -  sum(x)^2/n  )/(n-1)　がスクリプトの中に繰り返し現れる場合、varf = @(x)( sum(x.^2) -  sum(x)^2/n  )/(n-1) と記述すればすっきりする。この場合、var よりは速いものの直に書くよりは遅くなる。マクロの展開を前処理してくれることはなく、実行時に毎回展開しているのだろうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517058/ea1c7bfc-2c24-0b0a-5f22-8338832369b0.png)

# 相関係数

ついでに相関係数の計算時間を、matlabの関数のcorrcoefと直に計算する場合とで比較した。やはり直に計算したほうが一桁以上速い。

```math 
r = { \sum_i (x_i - \bar x) (y_i - \bar y ) \over \sqrt{ \sum_i (x_i - \bar x)^2 \sum_i (y_i - \bar y)^2  } }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517058/368954d6-86c2-b876-1c2d-977a74d232ec.png)

# 共分散

共分散については式だけ確認しておこう。

```math 

S_xy = { \sum_i (x_i - \bar x)(y_i - \bar y)  \over n-1 } \\
 = { \sum_i x_i y_i - {\sum_i x_i \sum_i y_i \over n }  \over n - 1 }

```
【PHP基礎⑦】if構文-2.否定の条件分岐

［問題］　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksBasic.html)
整数値を入力させ、値が0ならばzero、0でない場合はnot zeroと表示するプログラムを作成しなさい。


# コード
```php
$a = intval(fgets(STDIN));
if($a == 0){
    echo 'zero';
}else{
    echo 'not zero';
}
```

↓　「6」と入力

# 結果
```
not zero
```


☆否定の条件分岐
if(条件){
   条件を満たす場合に行う処理;
}else{
   条件を満たさない場合に行う処理;
}
Gitでプロジェクトを管理するDay3

今日はアプリ開発でタスクをまとめました。具体的には、gitでissueを作成し、今後の開発を管理していきます。issueで利用できるチェックボックについて紹介します。

# gitでチェックボックスを作成するには？
チェックボックスとは↓のようなもの。チェックをつけたり外したりできます。
![スクリーンショット 2022-06-17 21.29.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707093/01cefcb1-62e7-fcbe-2aba-6837d301bc08.png)
記述の仕方
```
- [ ] ここに文章ーー
- [x] 作成時にチェックをすでに入れていたい場合はこのように記述
```

以上でチェックボックスを作成できます。ちなみにQiita上でも
- [ ] 同様の記述でチェックボックスを作成できます。　 
- [x] チェック済みボックスを作成。

以上
SpringBootで処理速度改善のために意識したこと

# 概要
プログラムを書いていてものすごく処理が重くなったりすることがある。
この辺りを意識すると改善するかもしれないことをまとめる。
今後もいい感じのものがあれば追加していきたい。

# Tips
## 並列実行を採用する
Javaはスレッド処理ができるので並列処理ができるか検討してみる。

EX.
```
final int threadSize = 3;
final ForkJoinPool pool = new ForkJoinPool(threadSize);
final List<String> stringList = pool
        .submit(() -> List.of(1, 2).parallelStream().map(Objects::toString))
        .get().collect(
            Collectors.toUnmodifiableList());
```
このような形でsubmit内に並列処理をしたい処理を書くと並列で実行してくれた結果を取得できる。
並列実行数はForkJoinPoolの引数で指定するが、実行環境のCPU・スレッド数と同等になるように設定する。(スレッド数より多くの値を設定するとパフォーマンスが落ちるので注意)

## トランザクションの設定箇所に気をつける
DB接続を行う際、参照系の処理に対してTransactionalを記載していると、
その度にトランザクションを張りにいくため、繰り返し処理になるとコストがかかる。
```
@Transactional(readonly = true)
public int getCount() {...}
```
Transactionalは参照系では基本不要なので使用しないようにする

## DBの同時接続は重いので並列処理から外す
DB接続の並列接続は逆にコストがかかって遅延の原因になるため、直列実行した方が早くなる場合がある。

EX.
```
selectX(); // DB接続
selectY(); // DB接続
execApi(); // API実行
```
上記のような繰り返し処理を並列実行する際は、DB接続は直列にしてAPI実行だけ並列など試してみると改善する可能性がある。

DBによるがoracleなどはmaxPoolSizeなど並列処理が許容できる設定か確認しておくと良い。(重い処理であればpoolに余力があっても並列処理をしない)
https://docs.oracle.com/cd/E16338_01/win.112/b66456/featConnecting.htm

## 並列実行処理内での更なるループ処理は行わない
並列実行内でループ処理を行うと、該当ループ処理がスレッドを占有し続けるためループ処理は並列実行内では実装しない。

EX.
```
final int threadSize = 3;
final ForkJoinPool pool = new ForkJoinPool(threadSize);
final List<String> stringList = pool
    .submit(() -> List.of(1, 2).parallelStream()
        .map(i ->
            // stream処理の中で更にstream処理をする
            List.of(1 + i, 2 + i).stream().map(Objects::toString).findFirst().get()))
    .get().collect(
        Collectors.toUnmodifiableList());
```

## データ参照時の取得キーが同じであれば結合して取得する
複数回別テーブルにアクセスする場合、対象が少なければ
処理時間は誤差だが1万件など対象になってくると0.1秒でも1000秒の違いが出てくる。
なるべくテーブルJOINして一回のDB接続でデータは取れるようにしておく。
cdkでtypescriptのlambdaをデプロイしてみた

# AWS lambda

## サービスの概要

- サーバレスでイベント駆動型のコンピューティングサービス
- サーバーの管理をする必要がない
- 従量課金

## 料金

まずは利用料金の確認です。
コード実行時間(1ミリ秒単位)で課金されます。
料金は関数に割り当てたメモリ量によって異なります。
メモリ量を増やすとCPUパワーも増加し、結果として処理時間が短くなるので料金が安くなる場合もあります。
割り当てるメモリ量はチューニングが必要となりますね。

詳細な料金は更新ページを参照。

https://aws.amazon.com/jp/lambda/pricing/

### 無料枠

100万件/月リクエストの無料枠があります。また、40万GB-sのコンピューティングタイムが含まれます。
少しさわってみるのには十分すぎますね。

他のリージョンにデータを転送したり、S3と連携させると別途費用がかかるようです。微々たるものですが。

## まずはリソースを作ってみよう

無料枠の確認ができたところで、簡単な関数を作ってみます。

ディレクトリの構成はこんな感じです。
.
├── cdk
└── lambda

### lambda関数作成

まずは簡単なlambda関数を作成します。
lambdaの型情報をインストールします。
lambdaフォルダで下記のコマンドを実行します。

`npm i @types/aws-lambda -D`

次にlambda関数を作成します。

~~~typescript
import { Handler } from 'aws-lambda'

export const handler: Handler = async () => {
    console.log('Hello World')
}
~~~

### CDK作成

まずはCDKの雛形を作成するために、空のCDKフォルダで下記のコマンドを実行します。

`cdk init --language=typescript`

`NodejsFunction`というコンストラクタを利用するので、下記のライブラリをインストールします。
`Function`コンストラクタのTypeScriptに特化したバージョンです。
これを使うことでlambda関数を明示的にコンパイルしなくてよくなります。

`npm i @aws-cdk/aws-lambda-nodejs -D`

雛形で生成されるlib/cdk-stack.tsを下記のように書き換えました。

~~~typescript
import { Stack, StackProps, aws_lambda_nodejs as lambda } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    new lambda.NodejsFunction(this, 'helloWorld', {
      entry: 'lambda/index.ts',
    });
  }
}
~~~

cdkを初めて使う場合は`cdk bootstrap`を実行する。
デプロイコマンドを実行する。
`npm run cdk -- deploy`

### 動作確認

aws toolkitからlambda関数をinvokeしてみます。
Hello world ってログが出力されてますね。

![スクリーンショット 2022-06-17 21.26.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528549/7b0033d7-f27c-86ce-ccfe-3767e8ca734f.png)


## 参考サイト

https://maku.blog/p/cj9i4m3/
Torの ExcludeNodes SlowServer は意味なさそう

# SlowServer は2014年秋頃にドキュメントから削除されている
以前は man torrc にはこういう感じで書かれていた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19148/9d81a6c6-2100-7a2b-c421-26a84bb9d0f0.png)

しかし、今の表記はこうなっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19148/de6bf687-4d37-baf8-1ba5-cb6ebc0d3257.png)

サーバーのnicknameを意味する表記だったと思われるが、`SlowServer` で Tor Project の github をソースコードで検索しても出てこない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19148/3d6ebae2-e81f-41b4-30ab-6754ebf0a9cf.png)
https://github.com/torproject/tor/search?q=SlowServer

TorProject全体で探しても出てこない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19148/da8805eb-cad2-c420-4785-6e8c8fd678f5.png)
https://github.com/search?q=org%3Atorproject+SlowServer

消えた時期や意味を見つけるためにマニュアルの変更履歴を追っていると、[このコミット](https://github.com/torproject/tor/commit/68af1e7e9be8bef82b4574ac0934310af71a764b)で表記が消されていることがわかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19148/31cc99ae-e8a7-4707-d8d4-e27689ee7d7a.png)

# SlowServer は Tor の "nickname" だったが、今は使われていない仕組み

コミットログには以下のように書かれている。
```
Authorities are no longer voting on Named, so specifying nodes by
nickname isn't a clever thing to do.  (Not that it ever was!)  So
remove the documentation that suggests that you should do it.

Additionally, add proper cross-references to our __node__ lists, and
explain about the optional $ before identity digests.

Also, the oxford comma: endorsed by Steven Pinker, my spouse, and my
11th grade English teacher.

Closes 13381.
```

すなわち、Tor authorityはnameによるvoteはしていないので、SlowServer指定は意味がないといえる。

これの契機となった issue が [!13381](https://gitlab.torproject.org/tpo/core/tor/-/issues/13381) だ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19148/ff3baf2c-c14e-1d3e-efa8-7baff6d7dba4.png)

Changelogにはこう書かれており、nicknameで指定するのは推奨しない皆書かれている。
```
Stop suggesting that users specify nodes by nickname: it isn't a
good idea. Also, properly cross-reference how to specify nodes
in all parts of the manual for options that take a list of
nodes.
```

# 結論
というわけで、現状指定する意味はなく、指定しても挙動は変わらない。

以下の記事からも指定を削除した。
[torrcのExcludeNodesを変更してTorの接続、ブラウジングを超高速にする方法](https://qiita.com/keiya/items/589df899ffd167f4c909#%E6%9B%B4%E6%96%B0%E6%83%85%E5%A0%B1)
Java検定問題

|[../](https://qiita.com/taconana/items/55e4ea3283f2fa82a670) |
|---|

Java検定の問題を作ってみました。

問題1:
```java
System.out.println("すき家".length());  	    // --> 3
System.out.println("𠮷野家".length());		// --> ???
```

問題2:
```java
System.out.println(Integer.MAX_VALUE + 1);	// --> -2147483648
System.out.println(65536 * 65536);  		// --> ???
```
問題3:
```java
System.out.println( 1 %  2);  				// -->  1
System.out.println(-1 %  2);				// --> -1
System.out.println( 1 % -2);				// -->  1
System.out.println(-1 % -2);				// -->  ???
```
|[../](https://qiita.com/taconana/items/55e4ea3283f2fa82a670) |
|---|
浮動小数点数の情報落ちと最近接丸めと丸め誤差と

# 突然ですが問題です
下記の処理を行なった後の `number` の値は？
※ `float` は32bitの浮動小数点数とします。
```cs
float number = 345600.0f;
number += 0.016.0f;
```

## 回答
345600.031
![計算結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1605307/ef266f1c-cc39-066f-c30a-43f97fea7333.png)

0.016を足したのに、なぜ0.031増えているのかと結構悩んだので、調べてわかったことを書きます。[^1]
[^1]:厳密には環境によって異なります。


# 解説
## 分解能をチェック
32bitの浮動小数点数で354600を表現しているとき、1bitの値、つまり分解能は0.031となります。

調べるにはこちらのサイトが便利です。

https://tools.m-bsys.com/calculators/ieee754.php

つまり、0.031より細かい精度を表現することができません。

## 情報落ち
分解能が0.031の値に0.016を足すとどうなるのか？

情報落ちが発生します。
情報落ちが発生した結果、小さい値は無視され、計算結果は345600のままとなるのではないか？
これが私の予想でした。

## 丸め誤差
情報落ちが発生した際の挙動はCPUやプログラムからの設定により変わるのですが、デフォルトでは最近接丸め（偶数丸め）となっていることが多いようです。

最近接丸めのロジックを調べたところ、[こちら](https://www.cqpub.co.jp/hanbai/books/36/36171/36171_6syo.pdf)の「浮動小数点における四つの丸めモード」以降の説明がとてもわかりやすかったです。
（書籍の見本ページへのリンクで申し訳ないです）

この丸め処理により切り上げとなり1bit足され、計算結果が`345600.031`となるというカラクリでした。


# 誤差って怖い
情報落ちで小さい値を足しても無視される、というのは感覚的にも納得しやすいのですが、「足した値の約倍の値が加算される」というパターンは想定していないと原因究明に時間のかかる不具合に繋がりそうです。

0.016 ≒ 1/60
ということは、60fpsのループでfloatの変数に毎フレーム経過時間（秒）を足し続けて4日経つと、毎フレーム0.031増え続けるようになってしまいます。
こうなると経過時間を保持する変数としてはもう機能しなくなってしまいますね。

「浮動小数点数は精度が重要な値には使用できない」ということはわかっていましたが、今回の調査で「浮動小数点数は使い方を誤ると大きな誤差が生じる可能性がある」と認識を改めました。
インスタンスの購入オプションのハードウェア種類別の特徴

インスタンスの購入オプションの種類別のイメージ

●共有ハードウェアを使用するインスタンスの購入オプション
【共有ハードウェアの特徴】
同一物理サーバー上で他のアカウントが起動したインスタンスが同時に起動する。

●ハードウェアを専有するインスタンスの購入オプション
【ハードウェア専有インスタンスの特徴】
ハードウェア専有インスタンスを契約したアカウントと、同じアカウントで起動した共有インスタンス契約のインスタンスが同時に稼働する場合がある。

【専有ホスト（Dedicated Hosts）の特徴】
物理ホストを専有し、同一ホストで稼働するインスタンスをユーザーが指定することができる。
※他アカウントや共有インスタンス契約のインスタンスは同時に稼働できないので注意。
初心者のころ苦手だった内包表記・lambda関数・関数引数を使ってProjectEuler35を解けたのが気持ちよかった件

内包表記はリスト操作時にだいぶお世話になっております。
関数引数は使おうと思うときは大体複雑なことをしようとしてる気がする。あんまりいいイメージが無い。
自分の実力だと策士策に溺れるを体現してしまいそう。
lambdaは少しだけ使ったことはあるけれど、良い奴なのかよく分かりません。


```python
# Circular primes
# Problem 35
# The number, 197, is called a circular prime because all rotations of the digits: 197, 971, and 719, are themselves prime.
# There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97.
# How many circular primes are there below one million?

#エラトステネスの篩
def get_prime_list(max_number):
    is_prime=[True] * (max_number+1)
    is_prime[0] = False
    is_prime[1] = False
    prime_list = []
    for i in range(2,max_number+1):
        if is_prime[i]:
            prime_list.append(i)
            for n in range(i*2,max_number+1,i):
                is_prime[n] = False
    return prime_list

def is_circular_prime(n,is_prime):
    string_=str(n)
    length_=len(string_)
    for i in range(length_):
        str2=string_[i:]+string_[:i]
        if not(is_prime(int(str2))):
            return False
    return True

def has_024568(n):
    str_=str(n)
    list_="024568"
    return any(s in list_ for s in str_)

max_n = 1_000_000
prime_list=get_prime_list(max_n)
#0,2,4,5,6,8含む素数の順番をずらしていって一桁目がそれらになった場合には素数にならないので
#circular_primeを探すためのprime_listから除外しておく
prime_list=[n for n in prime_list if not(has_024568(n))]
prime_list = [2,5] + prime_list
is_prime = lambda n : n in prime_list

count_=0
for n in prime_list:
    if is_circular_prime(n,is_prime):
        count_+=1
        
print(count_)
```
PostgreSQLでのsequenceの使い方

|[../](https://qiita.com/taconana/items/55e4ea3283f2fa82a670) |
|---|

PostgreSQLで、insert 時に毎回nextval()を使うのではなく、create table時にdefaultでnextval()を定義しておく方が効率的である。

## insert 時に明示的にnextval()を使う：
```sql
create sequence auto_num;
create table dummy (seq_no integer primary key, name varchar(20));
insert into dummy (seq_no,name) values (nextval('auto_num'),'abc');
insert into dummy (seq_no,name) values (nextval('auto_num'),'123');
```
## create table時にdefaultでnextval()を定義：
```sql
create sequence auto_num;
create table dummy (
  seq_no integer default nextval('auto_num') primary key, 
  name varchar(20)
);
insert into dummy (name) values ('abc');
insert into dummy (name) values ('123');
```
|[../](https://qiita.com/taconana/items/55e4ea3283f2fa82a670) |
|---|
【UiPath】スクリーンショットを作成する方法

# はじめに
今回はRPA開発をするにあたり、何気に要する「スクリーンショットを作成する方法（UiPath版）」をお伝えします。
BizRobo!だとDAの画像抽出からImage変数に格納する事でスクリーンショットを作成出来ます。
UiPathにも同じことが出来るのでご紹介したいと思います。

# 設定方法
今回はQiitaのロゴをスクリーンショットを作成し、Excelに貼り付けるという処理をご説明したいと思います。

処理のフローはこのようなものになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/eb95a2a4-3b42-b8b4-a3ff-f222c4b4dc80.png)

処理フローはたったこれだけです。
ただしプロパティの設定を変更したりする必要があるので、
詳細をご説明を致します。

①「スクリーンショットを作成」アクティビティを設定します。
　このアクティビティがある場所は、下記の画像の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/0d3f3656-fa74-3424-69f4-0a950f1347af.png)

②スクリーンショットを作成したい要素を指定します。
③要素の設定が出来たら、プロパティ欄から変数を設定します。
ここで扱われる変数の型は「Image型」になります。
わざわざ変数タブから設定しなくても、Ctrl + KでImage型変数が作成されますので、
是非活用ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/5978cbe6-0891-34e8-0122-d0c24ed67056.png)

④次に「メソッド呼び出し」アクティビティを設定します。
場所は、プログラミング＞実行の中にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/2aa79a3f-7579-edc1-0042-199a3a240077.png)

⑤プロパティ欄から複数項目の設定を行います。
ターゲット型：System.Windows.Forms.Clipboard
※プルダウン選択です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/9e61e373-7acb-87f4-bc1b-9e45c4259032.png)
メソッド名：SetImage
※手入力です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/72e37529-a9f9-8118-113c-a8b9fc09426c.png)

⑥あとは、Excelに貼り付けるようにExcelの設定を行います。
Excelアプリケーションスコープを設定し、貼り付けを行いたいExcelを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/dd66694b-56bf-a50d-eb24-c38bc9fdd850.png)

⑦残りは、貼り付けたい箇所を選択して、Ctrl + Vで貼り付けを行い、
ブックを保存するだけで実行されます。
※最後のブック保存は、実行しないと画像を貼り付けた状態での保存が出来ません。
Excelアプリケーションスコープの変更を保存にチェックを入れててもです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1902544/6a3dbd92-7a73-5523-ebab-b49fa3f91dd8.png)

# さいごに
ぜひ使用する機会があればよろしくお願いします。
僕が使ってるgitコマンドのエイリアスを紹介

## これはなに

以前、「gitコマンドのエイリアスってどんな設定してるの？」って聞かれたので、現状使っているものを公開しようと思います。
ただ、僕はそこまでこだわってるわけでは無いので参考になるかは怪しいです。

## 設定してるエイリアス

僕は`.gitconfig`と`oh-my-zsh`の`git plugin`を使ってます。
（よく使うコマンドは`history`に残ってるので、正直そこまでエイリアスを設定してないです）

`.gitconfig`には最小限のエイリアスしか書いてません。

```
[alias]
  fixup = commit --fixup
  amend = commit --amend
```

他の`status`や`log`のエイリアスは`oh-my-zsh`の`git plugin`をまんま使ってます。

https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git

この中でも使ってるのが以下のエイリアスです。

```
gaa    git add --all
gba    git branch -a
gbr    git branch --remote
gcb    git checkout -b
gcp    git cherry-pick
gd     git diff
gf     git fetch
glo    git log --oneline --decorate
glog   git log --oneline --decorate --graph
gp     git push
grh    git reset
grhh   git reset --hard
gst    git status
```

僕はあまりこだわりがないので、上記のことくらいしかしてません。

## さいごに

ぶっちゃけ、その人が使いやすければどんな方法でも良いと思うので、いろいろ試してみると良いと思います。
WindowsへのPostgreSQLのインストール手順

|[../](https://qiita.com/taconana/items/55e4ea3283f2fa82a670) |
|---|

Windows環境にPostgreSQL14.2をインストールしてみた。その手順を残しておく。

(1) PostgreSQLをダウンロードする。
・https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
・Windows x86-64の「14.2」をダウンロードする。

(2) postgresql-14.2-2-windows-x64.exeを実行してインストールする。
・serverとcommand line toolsを選択する。（※pgAdmin4:GUIツール、stackBuilder:関連ツールは不要）
・パスワード「xxx」を設定する。
・Lacaleを「Japanese」にする。
※サービス「postgresql-x64-14」が起動されていることを確認しておこう。

(3) 環境変数Pathに以下を追加する。
C:\Program Files\PostgreSQL\14\bin

(4) postgresqlの設定を行う。
① C:\Program Files\PostgreSQL\14\data\postgresql.confを開き、修正する。
```
listen_addresses = '*'
↓	
listen_addresses = 'localhost'
```	
② C:\Program Files\PostgreSQL\14\data\pg_hba.confを開き、修正する。
```
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
↓
host    all             all             127.0.0.1/32            password
```
③ サービス「postgresql-x64-14」を再起動する。

(5) cmdからCLIで試してみる。
```sql
> psql -V
> psql -U postgres  			// CLIの開始
# create database seminar;		// DBの作成
# \l							// DB一覧の表示
# \c seminar					// DBへの接続
# create table dummy (id int,name varchar(20));
# \dn
# insert into dummy values (10,'abc'),(20,'あいう');
# update dummy set name='ABC' where id=10;
# select * from dummy;
# \d							// テーブル一覧
# \q							// CLIの終了	
```	

|[../](https://qiita.com/taconana/items/55e4ea3283f2fa82a670) |
|---|
Google Scholarを使用してBibTeXで参考文献を挿入する際にpp.が入ってしまう問題

# はじめに
論文等の文書をLaTeXで作成する際、BibTeXという文献管理データベースから本文へ挿入するという方法がある。数多くの文献情報を手書き入力するのは大変であるため、Google Scholarに登録された情報からコピーするという手段が有用である。 Google Scholarの検索ボックスに調べたい文献を入力して、対象文献の「引用」ボタンから「BibTeX」を選択すると、簡単にbibファイルに記載する情報が手に入る。

しかし、ときどき以下のような問題が発生する。例として, Thomas R. Fleming (1982)の論文を取り上げると、Google Scholarに記載された引用情報を元に本文に挿入すると、以下のように「p.」が発生する。こうしたページ数(p.とかpp.)を消すことについてメモとして残しておく。

<img src= https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223549/d29f12d3-33af-4537-3e8e-d3099bb79df1.png width="60%">


# 環境
PC: Monterey (Mac OS)を入れたMacbook Pro(13inch 2020)
LaTeX: pLaTeX + dvipdfmx
※自身のLaTeXのバージョンが知りたい場合は[こちら](https://qiita.com/zr_tex8r/items/a924be192ecea7e6bbe4)の記事を参照

エディタはSublime Text、コンパイル後のPDFリーダーにSkimを使用
BibTeXで参考文献を管理

記事の説明のために使用したスタイルファイル(〇〇.sty)
・natbib.sty (参考文献の引用方式の設定のために使用)
・cite.sty (複数の引用文献をまとめる際に使用。なくてもいい場合もある。[こちら](https://sunflower.kuicr.kyoto-u.ac.jp/apbc2008/ws_2e/cite.sty)を参照)
・vancouver.sty (Biomedical Journal系に多い文献表示方法)

# 解決方法

"BibTeX remove pp."とか検索すると、LaTeXのソースファイルやBibファイルに新しい定義を加えて編集することが多い。すべての参考文献にpp.がついている場合にはこの方法は有用であるが、pp.がついている文献とついていない文献が混合している場合にはエラーとなる。

ここで、先程のFleming(1982)の論文の情報を見てみる。すると
```
@article{fleming1982one,
  title={One-sample multiple testing procedure for phase II clinical trials},
  author={Fleming, Thomas R},
  journal={Biometrics},
  pages={143--151},
  year={1982},
  publisher={JSTOR}
}
```
となっている。よく見ないと気づかないが、この文献には、「巻」の情報が無い。出版社のサイトから文献の本情報を探ると、第38巻と記載があり、これを記入した
```
@article{fleming1982one,
  title={One-sample multiple testing procedure for phase II clinical trials},
  author={Fleming, Thomas R},
  journal={Biometrics},
  volume={38},　            %新しく追加した文
  pages={143--151},
  year={1982},
  publisher={JSTOR}
}
```
とすることで、相応しい文献情報に修正できる。
<img src= https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223549/ed905269-7fa4-a905-c1b1-58f02a44ea24.png width="60%">


私の専門である生物統計分野の論文では、この「不十分な」文献情報のまま登録されていることが多い(ような気がする)。しっかりと文献情報がGoogle Scholarに登録されている場合でも、出版社の情報と照らし合わせることが必要である。

もし補完すべき情報がない場合は空欄にして挿入すれば良い。例えば、以下のようにすれば巻の情報が空欄のまま挿入されるため、pp.の削除だけが実行される。
```
@article{,
  title={namae},
  author={dareka},
  journal={dokoka},
  volume={},
  pages={0--1},
  year={2022},
  publisher={nanntoka}
}
```

同様の現象は解析パッケージを検索した場合でも当てはまる。Rの場合はパッケージを参考文献に書きたい場合、コンソールに以下のように記述すれば情報が得られる(CRANにあるものに限る)。
```
toBibtex(citation("引用したいパッケージ名"))
 ```

# 結論
Google Scholarの登録情報を盲信すると危険。
出版社等が公開している文献情報と照合して、自分で補完しよう。

# 参考文献
[自分がどのLaTeXを使ってるか知りたい話](https://qiita.com/zr_tex8r/items/a924be192ecea7e6bbe4)
[cite.sty](https://sunflower.kuicr.kyoto-u.ac.jp/apbc2008/ws_2e/cite.sty)
LaravelのPHPUnitでS3へのアップロードテスト

PHPUnitでファイルアップロードのテストを書いたのはいいけども忘れそうなので備忘録として。。

# 前提
filesistems.phpとか
.env.testingファイルなどは作成、設定済みとします。

# やりたいこと
APIでs3にファイルをアップロードして該当ファイルがあればOK、なければNGとするMiddlewareを実装したかった

# テストコード
```
/**
 * Middleware Check(OK)
 * @return void
 * @group upload_test
 */
public function middleware_upload_check_ok(): void
{
　　　　　　　　//実際のs3ではなく仮のストレージを割り当てる
    Storage::fake('s3');
    //対象ファイルがないことを確認
    Storage::disk('s3')->assertMissing('/maintenance_test/maintenance.txt');

    // ミドルウェアのチェックもしたいのでなんかしらAPIを呼ぶ
    $response = $this->get('/api/user');
    $response->assertOk();
}

/**
 * Middleware Check(NG)
 * @return void
 * @group upload_test
 */
public function middleware_upload_check_ng(): void
{
    $filename = 'piyo.txt';
    Storage::fake('s3');
　　　　　　　　//fakes3に指定ファイルを置いて確認
    $dummy = UploadedFile::fake()->create('piyo.txt');
    $dummy->storeAs('hoge', $filename, ['disk' => 's3']);
    //ファイルがあることを確認
    Storage::disk('s3')->assertExists('hoge/piyo.txt');

    //何かしら API呼び期待するステータスになることを確認
    $response = $this->get('/api/user');
    $response->assertStatus(503);
}
```

# テストを実行
テストクラスを実行
```$ ./vendor/bin/phpunit テストファイル名.php```
全部は時間かかるからアノテーションでgroup書いて特定のメソッドだけ実行させる(今回であれば　upload_test という名前つけてある)
```$ ./vendor/bin/phpunit テストファイル名.php --group upload_test```


# 一応Middlewareの簡易コード
```
public function handle(Request $request, Closure $next)
{
    $s3_file_path = "hoge/piyo.txt";
    if (Storage::disk('s3')->exists($s3_file_path)) {
        $res = response()->json([
            'status' => 503,
            'message' => 's3にファイルがあるからNG'
        ], 503);

        throw new HttpResponseException($res);
    } else {
        return $next($request);
    }
}
```

# おわりに
fakeメソッド便利ですね。

人の目に触れるものを書くのは初めてなのでわかりづらい等あってもご容赦下さい。
ただ間違いがある場合は指摘して頂けたら嬉しいです。

### 参考リンク

[テストの準備](https://readouble.com/laravel/8.x/ja/testing.html)
基本情報（機械語のアドレス指摘方式）

コンピュータに指示を伝えるために、コンピュータの理解できる言葉で命令を伝える必要があります。
それが機械語で0と１で構成された命令語です。

先日出てきたCPUにある命令レジスタは下記のような形でした
```
命令
|　命令部 | オペランド部 |
```
命令レジスタは「命令部」と「オペランド部」で構成されており、オペランド部は「処理の対象となるデータのありか」を示しています。メモリのアドレス等です。

命令は「オペランド部を命令」という記述になっています。
オペランド部に入るのはアドレスですが、アドレスにも種類があり、アドレスを求める方式を
**アドレス修飾（アドレス指定）**
と呼びます。たくさんあるので2回に分けます。

## 即値アドレス指定方式
オペランド部に対象となるデータそのものが入っている方式を**即値アドレス指定方式**と呼びます。

```
　　　　命令部　　　　オペランド部
|    　　　　　　|   100    |    メモリ 100,150,151,200
// この場合はメモリへの参照を行わないでオペランド部を直接使う
```

## 直接アドレス指定方式
オペランド部に記載してあるアドレスが、そのまま実行アドレスとして使える方式を**直接アドレス指定方式**と呼びます。
```
　　　　命令部　　　　オペランド部
|    　　　　　　|   100    |    メモリ 100(18),150,151,200
//　この場合は100番地に入っている「１８」という値をデータとして用います。
```

## 間接アドレス指定方式
**間接アドレス指定方式**ではオペランド部に記載してあるアドレスの中に「対象となるデータが
入っている箇所を示すメモリアドレス」が記されています。間接的に指定しているとのことです。
よくわからん。図で示します。
```
　　　　命令部　　　　オペランド部
|    　　　　　　|   150    |    メモリ 100,150(200),151,200(18)
//　オペランド部が示すアドレスを見ると150で実効アドレスは200
その実効アドレスを参照すると「18」という値がデータとして得られる。
```

## まとめ
間接アドレス指定方式は
「僕はコーヒを飲んだ」が
「僕は100度のマイセンのカップに入ったブラックコーヒーを海辺でカモメが飛んでいる中飲んだ」

くらい遠回しですね。
探索的データ分析とは？

モデルを構築する前に手元のデータを探索することは、理想的なプラクティスであるだけでなく、データサイエンスのライフサイクルの重要なフェーズです。データセットを最初から徹底的に包括的に理解することは、正確な分析と洞察を確実に行うために不可欠です。 

データ準備プロセスの一部であるこの最初のデータ精査では、クレンジングが必要な箇所を明らかにし、データセットからビジネスインサイトを収集するなど、次のステップのための重要な基礎を設定します。 

## 探索的データ分析の重要性
探索的データ分析（EDA：Exploratory Data Analysis）とは、データセット内のパターンや特徴を明らかにし、問題を特定し、データに関する疑問について仮説を立て、発見したことを分析で実証することです。

探索的データ分析を理解する最良の方法は、それがなぜ必要なのかについて見てみることです。探索的データ解析の主な目的の1つは、機械学習モデルに入力するデータを正確で一貫性があるものにすることで妥当で偏りのない結果へとつながるように、早期に問題を特定することです。

探索的データ分析は、機械学習モデルにとって非常に重要です。モデル学習やデプロイメントの前にデータ品質を改善するために、[データ内の影響](https://blog.dataiku.com/explaining-bias-in-your-data)をピックアップしなくてはなりません。データ品質は、[モデルの精度と頑健性（ロバストネス）](https://blog.dataiku.com/inside-2021-ml-trends-trustworthy-ml)に直接影響することを忘れないでください。

データ準備の段階で効率的かつ反復可能な探索的分析を導入することで、アナリストはデータライフサイクルの時間のかかる反復的なコンポーネントを高速化し、将来のモデルに活用できるようになります。これにより、より詳細で目標に特化した分析のための時間が確保され、ひいてはより効率的な意思決定プロセスを推進することができます。

![KITCHEN.00_01_23_23.Still005 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/602f12a5-7732-9234-1b5b-93ff29986a67.jpeg)

## 問題の軽減と透明性の確保
一般に、データ準備の重要な原則は「ガベージイン、ガベージアウト」です。もしデータに欠陥がある状態で機械学習プロセスに入ると、欠陥のある結果やアルゴリズム、さらに悪いことに、欠陥のあるビジネス上の意思決定を生み出すことになります。この段階でデータの分析、探索、クリーニングに十分な時間をかけることは、より良い結果をもたらすことを意味するだけでなく、組織が深刻な問題（例えば、偏ったモデルやその他の問題のあるモデルにつながりやすい本質的に偏ったデータや問題のあるデータの使用）を回避するのにも役立ちます。

また、フロントエンドでデータを探索する体系的な方法を持つことで、リスクが生じやすいセンシティブな領域をピンポイントで特定することが容易になります。アナリストは（データサイエンティストも）、[説明可能かどうか](https://blog.dataiku.com/responsible-ai-actuarial)を常にチェックする必要があります。最初にデータを確認することで、データプロセス全体を通して透明性を確保することが可能になります。

基本的に、探索的データ分析と適切なデータ準備なしには、組織は効果的に意思決定を行い、重要なビジネスニーズを満たし、競争力を保つことはできません。データセット内の重要なパターンや特徴を発見し、データの可視化分析や統計的モデリング（データマイニング）を通じて、定義した問題についての仮説を立てるなど、探索的データ分析の主要な部分は、サイロ化されたプロジェクトとは限りません。

[Dataiku](https://www.dataiku.com/ja/製品/始める/)のような共同プラットフォームを使えば、非コーディング担当者はビジュアルツールを使ってデータを精査・変換し、モデルを構築する技術チームと簡単にインサイトを共有することができます。集中型プラットフォームによって、とくに重要な探索的データ分析を含むプロセスの各段階に簡単にアクセスでき、メンバー間で共有できます。

## データ準備を実践する
[このEBOOK（英語）](https://pages.dataiku.com/ebook-practical-data-preparation-solutions-to-the-top-5-most-common-mistakes)では、データ準備についてのより包括的な説明、よくある間違い、効率的なソリューションの概要をご紹介しています。ぜひご覧ください！



原文：[*What Is Exploratory Data Analysis?*](https://blog.dataiku.com/what-is-exploratory-data-analysis)
IEのサポート終了で使えるCSS

# はじめに

遂にこの時がきました。
2022年6月15日に、Internet Explorer 11のサポートが終了しました。
これからはIEを気にすることなく、モダンCSSを使用できます。

そこで今まではIE対応で使用できなかった、CSSのプロパティやHTMLをまとめてみました。

## object-fit

コンテンツ領域に合わせたサイズで要素を表示できるプロパティ

```
img {
  object-fit: cover;
  object-position: right top;
}
```

## var

CSSで使える変数を出力する関数

```
:root {
  --font-color: black;
}
p {
  color: var(--font-color);
}
```

## aspect-ratio

画像のアスペクト比を維持しながら拡大縮小ができるプロパティ

```
div {
  width: 100%;
  aspect-ratio: 16 / 9;
}
```

## position: sticky;

ウィンドウを基準に追従するのではなく、ブロックを基準にして追従するプロパティ

```
.sticky {
  position: sticky;
  top: 10px;
}
```

以上全てではありませんが、IEのサポート終了に伴い、積極的に取り入れたいCSSのプロパティについてまとめてみました。
これ以外にもまだまだあるので、また別の記事でもまとめたいと思います。
Sysinternals Suiteをwinget（msstore）からインストールしてみる

[Sysinternals Suite](https://docs.microsoft.com/ja-jp/sysinternals/downloads/sysinternals-suite) は　Sysinternalsで公開されているWindows管理、トラブルシューティング、診断な各種ユーティリティをひとまとめにしているものになり。

こちらが、いつの間にかマイクロソフトストアからも提供されており、ストアアプリとしてインストールできるようになっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/90fb92df-9518-17e9-c743-8bc2829c80de.png)

本記事では`winget`を使いマイクロソフトストア版の"Sysinternals Suite"をインストールしてみます。

# 実行環境

- Windows 10 バージョン 21H2
- winget v1.3.431-preview

## winget searchでパッケージを探す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/27f92f80-2e7b-e21d-34a0-4f83c1031c05.png)

今回、`winget`からインストールするためパッケージを下記コマンドで探します。

```PowerShell
winget search "Sysinternals Suite"
```

ソース`msstore`で`Sysinternals Suite`が見つかりました。

なお表示されているID`9P7KNL5RWT25`は、なんだかよくわからない文字列の羅列ですが、マイクロソフトストアのURL中に含まれる文字列が表示されている？　ようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/4299a396-41bc-79cc-a46e-5d845f4bbbb3.png)

インストール対象としてこちらのパッケージで間違いないようです。

## winget installでパッケージをインストール

`Sysinternals Suite`のIDが`9P7KNL5RWT25`だったので今回はID指定で下記コマンドのようにインストールしていきます。

```PowerShell
winget install -e --id 9P7KNL5RWT25
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/f8be25c3-710a-8c23-d673-a7b108e6e71f.png)

今回は下記のようにバージョン`2.0.1.0`がインストールされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/426c5012-4ca8-1731-48e4-2c4a19db1fe7.png)

またインストールが完了すると各ユーティリティに対してPATHも通っており、アプリ実行エイリアスに登録されていました。

ためしに`Sysinternals Suite`に含まれている、`RDCMan.exe`について確認してみます。

下記画像のように ユーザーディレクトリの`AppData\Local\Microsoft\WindowsApps`にPATHが通っていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/343c8f8d-7b8a-0af3-7cfb-c85684aed07b.png)

これがどこで管理されているかといえば`アプリ実行エイリアス`で有効無効を設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/7cc35930-9649-e660-752b-5d8e98d4089a.png)

レジストリ設定をみると`RDCMan.exe`の実体は`C:\Program Files\WindowsApps\`配下にインストールされている事がわかります。（マイクロストアアプリ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e41f5e99-ace0-0841-a9ec-7d0632691423.png)

## 総評

マイクロソフトストアから`Sysinternals Suite`が`winget`で手軽にインストールする事ができました。

普段は必要に応じたユーティリティをマイクロソフトストアからではなく、個別にインストールしていますが、たまには一括で全部インストールして、普段利用しないツールを探してみるのも良いかもしれません。
CXL (Compute Express Link) その19 - IDE (Integrity and Data Encryption)

私はメモリデバイスの不揮発性メモリ制御やホストIFなどを扱うソフト屋をやっております。
仕事でCXL(Compute Express Link)まわりの技術に関わっています。
CXL技術に関連するメモ書きを残していこうと思います。
ホストのCPUとOS/Applicationまわりの経験・知識共に乏しいので、親切な方は教えて下さると幸いです。
また、間違い、アドバイス、その他、ご意見やご要望ありましたらお気軽にどうぞ。

---

今回は、CXLの通信路上のデータ保護機能であるCXL IDE (Integrity and Data Encryption)について簡単に書きます。この機能はオプショナルの機能です。

CPUベンダーの話を聞く限り、IntelのSGXやAMDのSEVといったCPUによるデータの暗号化機能があるため、少なくとも初期段階ではCPUがCXL IDE対応をすることはなさそうです。しばらくは、仕様として定められているけど対応機器がない状態になると思われます。

# 1. CXL IDE
CXL IDEで保護される対象となるデータは、CXL.io、CXL.cache、CXL.memで転送されるデータです。CXL IDEで防ぐ攻撃は、通信路上のデータの盗聴や改竄、なりすましです。DoS攻撃は対象外です。

CXL.ioについては、PCIeのECNで規定され、PCIe6から仕様書に入ったPCIE IDEに従います。
CXL.cache、CXL.memが、CXLの仕様書で扱われています。CXL.cache、CXL.memでデータ保護の対象となるのはControl FlitとAll Data Flitです。Protocol Flitはデータ保護の対象ではありません。

CXL.ioとCXL.cache/CXL.memのいずれもAES-GCMを使って、通信路上のデータの暗号化と完全性の確認を行います。

Control FlitとAll Data Flitの暗号化範囲と完全性確認範囲を下図に示します。

![EncryptMAC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/38f324cd-0d69-40c1-6ce4-b2b361d24c5c.png)

CXL IDEでは、セッション鍵共有のプロトコルは仕様範囲としていません。暗号化されたデータと完全性チェック値(MAC)のやり取りのみが、CXLの仕様で扱われる範囲です。PCIe IDEのセッション鍵の共有方法などを使用するよう記載されています。

CXL IDEで定められている暗号化・完全性の確認の流れの概略を下図に示します。

![IDEOverview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292852/3aab63cf-c68d-0bb5-70fa-631b41fddf2b.png)

MACは、Header Slotを1つ消費して転送されます。Initial Vectorとして使われる値を下表に示します。

| Bit | Description |
|:--|:--|
| 95:92 | Sub-streamd ID (1000b固定) |
| 91:64 | All Zero |
| 63:0 | Invocation Field: カウンター |

カウンターはリプレイアタックを回避のために使われるカウンターです。MACの生成毎にインクリメントされます。
また、MAC算出に使用されるAAD(Additional Authentication Data)は、FlitのHeaderが使用されます。

MACは複数のFlitから算出されます。MAC算出に使用されるFlit数は、使用されるモードによって決定されます。
CXLでは以下に示す2つのモードが定められています。

- Containment Mode
(MACの算出に使用された)FlitとMACが全て揃い、MACの一致の確認後にFlitに含まれるコマンドやデータが使用できるモードです。5個のFlitからMACが生成されます。

- Skid Mode
MACの一致の確認前に、Flitに含まれるコマンドやデータが使用できるモードです。128個のFlitからMACが生成されます。

基本的には、Containment Modeでは5個のFlitが転送された後にMACが含まれるFlitが転送され、Containment Modeでは128個のFlitが転送された後にMACが含まれるFlitが転送されます。

CXLメモリデバイスでは、Containment Modeが使用された場合、MACの一致確認後にFlit内のコマンドの処理を行うことになるので、レイテンシに大きな影響を与えることになります。Skid Modeは、レイテンシに影響が少ないですが、Read/Writeのコマンド処理を行った後に、MAC値の不一致が確認されるとセキュリティ上の問題が発生する可能性があります。

---
CXL3.0の仕様書は、2022/6/14から45日間の内部レビューが始まっています。
今回までの記事で、主なCXL2.0の仕様について書いたように思います。CXL2.0の仕様に関するメモ書きは一旦終わりにします。
ご質問等ありましたら、できるだけお答えします。
Linux コマンド一覧

## ＜ファイルを操作する基本的なコマンド＞

### mkdir （ディレクトリ名）
ディレクトリを作成する
### rmdir　（ディレクトリ名）
ディレクトリを削除する
### cd/
ルートディレクトリへも移動する
（ルートディレクトリとは、ディレクトリのツリー構造の一番大元に位置するディレクトリ
### pwd 
カレントディレクトリの位置を確認
### ls (ディレクトリ名）
ディレクトリ内のファイルを確認
### touch　（ファイル名）
ファイルを作成する
### mv (ファイル名）（ディレクトリ名）
ファイルを指定ディレクトリに移動させる
### rm (ファイル名）
### rm -r（ディレクトリ名）
ファイル/ ディレクトリを削除する
- -f オプションではディレクトリ内のファイルを強制削除する
### cat （ファイル名）
ファイルの中見を確認する
### cp（元ファイル名）（新規ファイル名）
ファイルをコピーする
- -f オプションではディレクトリ内のファイルを強制削除する


## ＜ディレクトリを操作する基本的なコマンド＞
### cd （ディレクトリ名）
ディレクトリへと移動する
‐ 今いるディレクトリは./と表す
例（cd ./hoge/fuga）
- cd ~ でホームディレクトリへ移動
- cd .. で1個前のディレクトリへ移動
-
### rmdir （ディレクトリ名）
空のディレクトリを削除する
## ＜コマンドのオプション＞

### ls -a
隠しファイルを含めてディレクトリ、ファイルを一覧に表示させる
*Linuxでは.からはじまるファイル名やディレクトリ名は、隠しファ*イルや隠しディレクトリとして扱われます。

オプション	内容
-a	隠しファイルや隠しディレクトリなども表示する
-l	ファイルやディレクトリなどの詳細も表示する
-t	更新時間で並び替える
-S	ファイルのサイズで並び替える
-1	ファイルやディレクトリを縦に並べて表示する

### rm-r　ディレクトリ名
ディレクトリを削除

>オプション	内容
>-f	存在しないファイルやディレクトリ削除時の警告を表示させない
>-i	ファイルを削除する際に確認を表示させる
>-r	ディレクトリごと削除する


## <ファイルやディレクトリの権限>

### 権限とは？
Linuxではファイルやディレクトリなどに権限を与え、ユーザーによっては編集や削除ができないように設定する。
権限は、ユーザーやユーザーが所属する


#### ls-l 
ファイルやディレクトリの権限を表示する

![7af9b0d1-33c2-4a2b-9ff4-118854544b07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1314502/8a13aae2-a4f0-17ef-2eb6-2c6d836c86dd.png)

先頭から三文字ずつは、下記を意味しています。
・ファイルやディレクトリの所有者(作成者）の権限 rw- 
・作成したユーザーと同じグループの他ユーザーの権限 rw- 
・それ以外のユーザーの権限 r--

文字	意味
r	読込可能
w	書込可能
x	実行可能

赤枠のec2-user ec2-userの部分は、「ファイルの所有者（作成者）」と「所有者(作成者)が所属しているグループ」が表示されています。

#### chmod  権限 （ファイル名/ディレクトリ名）

権限 
ファイルやディレクトリの権限を変更できます。
ファイルやディレクトリの所有者(作成者）の権限
作成したユーザーと同じグループの他ユーザーの権限
それ以外のユーザーの権限


|  ０  |  1  |2 |  3  |4 |  5  |6  |  7  |
| ---- | ---- |---- | ---- |---- | ---- |---- | ---- |
|  読込・書込・<br>実行はできない  |  実行できる  |書込できる |  書込・実行ができる  |読込できる |  読込・実行できる  |読込・実行できる  |読込・書込・実行ができる



#### chown  権限者 （ファイル名/ディレクトリ名）
実行
```
sudo chown root hoge.txt
```
結果
```
ls -l hoge.txt
# => -rwxrwxrwx 1 root     ec2-user    0 Nov  4 01:40 hoge.txt
```

#### sudo
スーパユーザーの権限でコマンドを実行する
例
```
sudo yum install php
```
udoコマンドは、スーパーユーザー(rootユーザー)の権限で設定などを書き換えること可能である。

アプリケーションのインストールはスーパーユーザー（root)でないと実行デッキないようになっている。

そのため誤って多用すると、設定が変更されてしまう可能性があるので。sudoコマンドを使用するさいは、実行するコマンドが正しいか注意が必要。

## ＜linuxでアプリやライブラリのインストールを行う＞

使うコマンド
### apt
### yum

aptやyumは、インストールやライブラリをインストールするパッケージマネージャを実行するコマンド。
（例）
```
sudo yum install ruby
```
|名前|用法|
|----|----|
|apt|UbuntsuなどのLinuxディストリビューションで使用される|
|yum|CentOsやAmazonLinux などで使用される|


アンインストールする場合はremoveを使う
（例）
```
sudo yum remove ruby
# => Rubyがアンインストールされます。
```
.NETのDirectory.Deleteを使用すると非同期のような動きとなってしまい削除されない

【編集中】
・ディレクトリ削除確認の試験をUNitTestを作成していたところ、実行するたびに失敗になったり成功になったりしていた。
・コードにおかしなところはなく、はまった。
・そこで、表題の件にたどり着いた。
CookieとSession

クッキーとセッション：HTTPのStateless（↔Stateful）という特徴（接続が切れた後のClientの情報は
　　　　　　　　　　　保存しない）で、Clientの情報を記憶するため登場。

クッキー：クライアントを区別するための技術で、名前と値のペアで構成される。
　　　　　図書館に本を借りるためには会員カードを持参しなければならないが、
　　　　　この会員カードの役割をクッキーがする。
　　　　　サーバーで作成され、ブラウザに保存、有効期間後の自動削除になる
　　　　　クライアントがサーバーにRequestするときにdomain、path（サブパスを含む）が
　　　　　一致する場合にのみ、Requestとともにサーバーに自動送信。

セッション：関連する、RequestとResponseをクッキーを使用して1つにしたもの
　　　　　　簡単に言うと、ログインからログアウトまでが１つのセッション
　　　　　　Browserごとにサーバーがセッションを提供。
　　　　　　クッキーはBrowserに保存されるが、セッションはサーバーに保存される。

クッキーとセッションの簡単比較
1.クッキー：Browserに保存、サーバーの負担X、セキュリティに不利、
　　　　　　サーバー多重化に有利なため、大型サイトではクッキーを暗号化して使用することが多い
2.セッション：サーバーに保存、サーバーの負担O、セキュリティに有利、サーバー多重化に不利
5 | Radial Blur

## 基本知識
Radial Blurは、中心から外側に放射状に広がるストライプ状のぼかしとして現れる一般的な視覚効果です。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/c6c08288-2410-306d-fd6a-03f5e988e1f4.png)


レースゲームやアクションの特殊効果で、高速モーションの視覚効果やカメラを突然ズームインしたときの衝撃的な効果を強調するためによく使用されます。

![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/a6facd74-9f88-0cd1-13b0-90aaecb08ae9.png)


Need for Speedにおけるラジアルブラー効果

Radial Blurの基本原理は他のぼかし効果と同じです。周囲のピクセルと元のピクセルの色の値が一緒になってピクセルの色に影響を与え、ぼかし効果を実現します。Radial Blurの効果は、中心から外側に放射状に広がる形状であるため、選択したサンプリングポイントは、中心点とピクセルポイントを結ぶ延長線上に配置する必要があります。

![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/c864f791-10e4-acd8-f7a0-ba96ec3a1a4c.png)


図に示すように、赤は中心点、青は現在処理中のピクセル、緑はサンプリングポイント、赤の矢印の方向は中心点から現在のピクセルまでの延長線の方向です。

ピクセルが中心点から離れるほど、ぼやけます。したがって、サンプリングポイント間の距離は大きくなります。他のぼかし効果と同様に、サンプルポイントが多いほどぼかし効果は良くなりますが、コストが増加します。

 

## Unityの実装
上記の原理によると、UnityでBuild-inパイプラインを使用して、Radial Blur効果を実装します。

まず、画像の中心を中心点として設定し、サンプリングステップサイズを計算します。
```
float2 Vector = (float2(0.5, 0.5) - i.uv)*_MainTex_TexelSize.xy*_BlurRadius;
```
このように、ステップサイズ（Vector）は中心点からピクセルまでの距離に正の相関があり、中心点から遠いピクセルはよりぼやけます。変数_BlurRadiusを追加して、サンプリングステップサイズを調整し、ぼかしの強さを制御します。

サンプリング、色の重ね合わせ、平均値を求めることで計算を行い、または必要に応じて異なる重みを選択することもできます。変数_SampleCountを設定して、サンプリングポイントの数を制御します。サンプリングされるピクセルが多いほど、ぼかし効果はよくなりますが、コストも大きくなります。
```
fixed4 blur(v2f i):COLOR
{
	float2 Vector = (float2(0.5, 0.5) - i.uv)*_MainTex_TexelSize.xy*_BlurRadius;
	fixed4 resultColor = fixed4(0, 0, 0, 0);
	for (int index = 0; index < _SampleCount; ++index)
	{
		resultColor += tex2D(_MainTex, i.uv);
		i.uv += Vector;
	}
	return resultColor / _SampleCount;
}
```
効果は図のようになります。
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/c1fdaa5d-a276-e63c-006f-cf09badb41d3.png)




動的に変数_BlurRadiusを調整し、効果は次のとおりです。
![rb5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/79ce4ba0-ac5a-e7b3-b5f9-3de734e189cf.gif)



## 最適化
Radial Blurは、前述のBlur最適化と同じ方法で最適化されます。 DrawCallを追加する代わりに、ダウンサンプリングによって解像度を低下させ、それによって画像サンプリング操作が減少し、最適化の目的を達成します。

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

今なら、UWA GOTローカルツールが**15日間に無償試用**できます！！
よければ、ぜひ！

UWA公式サイト：https://jp.uwa4d.com
UWA GOT OnlineレポートDemo：https://jp.uwa4d.com/u/got/demo.html
UWA公式ブログ：https://blog.jp.uwa4d.com