OmniAICreator/Qiita-1.07M huggingface dataset:
Outlookで添付ファイルをローカルに保存したいのでやってみた

毎日特定のメールを受信して自動で保存したいというのはよくあるかなと思います。
今回はそれを実装してみました。

最初はPowerAutomateでやろうと思ったんですが、
ローカルフォルダに保存しないといけいない関係で今回はoutlookVBAでやってみました。
（非エンジニアの私としては、細かく書いておかないとこれなんだっけ？となるので備忘録も含めて書いてます）



OutlookVBAを使うにあたっての初期設定は[OutlookVBAの事前準備](https://qiita.com/t_rockhill/private/97b51b05e207b786304e)をご覧ください
一番最後にサンプルコード付けたので、その中身を順番に解説します。


##メール受信したら動くに設定する
```
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)  '－受信時に行う動作－－
```
【Application_NewMailEx】の名称にすることで判別してくれるのでいじらない

コードを書く場所は【ThisOutlookSession】にする
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391923/848daeba-8da5-89b5-3002-2bc6837335b2.png)


##Outlook操作準備と初期フォルダ指定
```
GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
```
【GetNamespace】はOutlookのメールや予定表、連絡先といった様々なデータにアクセスすることができるオブジェクトの指定が必要です。
ただ、今は“MAPI”だけですので、そのまま覚えてしまうといいですね。

【GetDefaultFolder】は指定されたフォルダの種類を選びます。【olFolderInbox】は受信トレイの事ですね。
詳しくはMSの[ヘルプをご覧ください](https://docs.microsoft.com/ja-jp/office/vba/api/outlook.oldefaultfolders)。


##メールが入るフォルダを指定
```
objFolder = objInbox.Folders.Item("test")

<階層構造時の書き方>
objFolder = objInbox.Folders.Item("test").objInbox.Folders.Item("test2")
```
階層構造になっていると【.】でつないで記載をしましょう。

##フォルダ内のメール（オブジェクト）を取得
```
For Each objItem In objFolder.Items
   xxxxx
Next
```
【objFolder.Items】がフォルダの中身全部取得するので、1メールずつ処理させるためにループが必要


##添付ファイル数を取得
```
For i = 1 To objItem.Attachments.Count
   xxxxx
Next
```
複数ファイルがある場合は、ループが必要


##未既読の確認と設定
```
<設定>
objItem.UnRead = False

<判定だけ>
if objItem.UnRead = False then 
  xxxx
End If
```
Falseが既読、Trueが未読
if文で書くと判定だけなので変更されない


##指定の拡張子があればファイルを保存
```
 If InStr(objItem.Attachments.Item(i), ".csv") <> 0 Then
    objItem.Attachments.Item(i).SaveAsFile strPath & objItem.Attachments.Item(i)
 End If  
```
【Instr】で第2引数の文字(ここでは .csv)までの文字をカウントして処理
【.】のみにすることで、全拡張子にすることも可能

【SaveAsFile】でファイルを保存（パスは後ろで指定）



# サンプルコード(まとめ)
ということで、多少はしょった部分を含めてサンプルコードになります

```vb:
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)  '－受信時に行う動作－－

    Dim objInbox As Object
    Dim objFolder As Object
    Dim strPath As String
    Dim i As Long
     
    Set objInbox = GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
    
    '添付ファイルがあるメールのフォルダを指定します。
    Set objFolder = objInbox.Folders.Item("test")
    '添付ファイルの保存先を指定。
    strPath = "C:\outlook_DL\"

    '添付ファイル保存処理
    For Each objItem In objFolder.Items
        For i = 1 To objItem.Attachments.Count             
            '未読だったら動作
            If objItem.UnRead = False Then
                GoTo Continue        
            Else
            '添付ファイルに指定の拡張子がある場合のみ処理
                If InStr(objItem.Attachments.Item(i), ".") <> 0 Then
                    objItem.Attachments.Item(i).SaveAsFile strPath & objItem.Attachments.Item(i)
                End If            
                '既読にする
                objItem.UnRead = False          
            End If   
    Continue:    
        Next i   
    Next objItem
 
    Set objItem = Nothing
    Set objInbox = Nothing
    Set objFolder = Nothing

End Sub
```
Jetpack ComposeでOverScrollのエフェクトを消す方法

Jetpack Compose では 1.1.0 から `LazyColumn`/`LazyRow` や　　`Modifier.verticalScroll`/`Modifier.horizontalScroll` で OverScroll のエフェクトが適用されるようになります。
( Android 11 以前は波のようなエフェクト、Android 12 以降はストレッチのエフェクト)

|Android 11以前|Android 12以降|
|:--:|:--:|
| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/b82feeca-c411-7708-3a67-ac75b0664c0b.gif" width="300px" /> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/f20a76d3-3f85-60e3-a555-21930ba64ae1.gif" width="300px" /> |



AndroidView では `android:overScrollMode="never"` で無効にできていましたが、Jetpack Compose ではどうすれば無効にできるのか調べたので書いていこうと思います。


## OverScroll を無効にする

`LocalOverscrollConfiguration` を null で上書きすることで下層の Scrollable な Composable の OverScroll エフェクトを消すことができます。


```kotlin
@Composable
fun Sample() {
    CompositionLocalProvider(
        LocalOverscrollConfiguration provides null
    ) {
        LazyColumn {
            ...
        }
    }
}
```

## `OverscrollConfiguration` とは何か

`LocalOverscrollConfiguration` はデフォルトで `OverscrollConfiguration` を提供しており、その `OverscrollConfiguration` は OverScroll の色や表示の制御などを設定できるクラスになっています。

```kotlin
OverscrollConfiguration(
    glowColor: Color?,
    forceShowAlways: Boolean?,
    drawPadding: PaddingValues?
)
```


https://developer.android.com/reference/kotlin/androidx/compose/foundation/gestures/OverScrollConfiguration


`glowColor` を指定すると Android 11 以前の OverScroll のエフェクトを任意の色にすることができます。



<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/ddb5e989-71e0-478c-c4c8-95e064c35168.png" width="300px" />



ここで設定した `OverscrollConfiguration` が scroll や Lazy 系で `rememberOverscrollController()` から受け取ってリストにエフェクトを反映させています。

https://github.com/androidx/androidx/blob/3070b935f43033b7463c745ee8dbe27a34dbcb48/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/list/LazyList.kt#L78

https://github.com/androidx/androidx/blob/3070b935f43033b7463c745ee8dbe27a34dbcb48/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt#L265
オンプレML学習環境の構築（少人数）

#はじめに
この記事は、2021MLOpsアドベントカレンダーの記事です。
初記事なのでお手柔らかにお願いします。。。

最近では、ML開発環境はオンプレで持つよりもクラウド活用の方が多いのではないでしょうか？
しかしながら、様々な理由でクラウドが使えない人もいるはずです。
私が所属している研究室でも、クラウドが使えず自前構築となっています。
しかしながら、なかなかオンプレで構築する記事がなかったのでMLOpsとは少し違うかもしれませんが運用体制を書いていこうと思います。

#前提条件
我々の研究室では以下の要件を満たす必要がありました。
- あまりお金がないので民間グレードのサーバで構築すること
- 一年に多くのサーバを購入することができないのでクラスタにサーバを順次追加して行けること。
- 複数の人間が研究目的で使うため、認証システムが使えること。
- Pytorchを使う人やTensorflowを使う人、そしてChainerなど使う人がいるので柔軟性があること。
でした。
また、構築の際に有利になることは、
- 情報学部の研究室であるためにある程度の知識をユーザーに要求できる。
- 企業に比べれば、少ないがさすがに家庭に比べれば予算が多い。
- 大学が一年に一度停電をするため、大規模メンテナンスを行うことができる。
です。
研究室のクラスタのサーバ一覧は以下のような形です。
1. GPU:RTX 3090 + TITAN X CPU:Thredripper 3960X
2. GPU:RTX 3090           CPU:Ryzen9 5950X
3. GPU:RTX 3090           CPU:Xeon E5 2630
4. GPU:RTX 2080TI         CPU:Corei9 9900K
5. GPU:TITAN X            CPU:Xeon E5 1680
6. GPU:RTX 2070           CPU:Xeon E5 1680     

OSはすべてUbuntu 20.04LTSです。
# システム概要
当研究室では、
認証系をLDAP、ストレージシステムをGlusterFSで構築しています。
イメージとしては下のような形です。


各サーバには２つの分散ストレージプールが存在していて合計１２個のストレージプールでGLusterFSを構築しています。![original_kousei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260879/7f089585-93e0-87f7-277b-ef315e88f54c.png)

この際、本研究室で使用しているSSDはあまり高性能ではないためバックアップのために３重レプリケーションになるようにしています。
これにより２台のストレージが破損してもデータを保つことができます。
（ちなみに実際に破損しました）
当研究室でGlsuterFSを採用している理由は、追加するストレージの容量さえそろっていれば、どのようなOSでもどのようなシステム構成でも柔軟に追加できること。
そして、ストレージを搭載しないサーバを追加する際はストレージプールをマウントしてLDAP認証を追加するだけであっさりとクラスタに参加させることができます。
![add_server.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260879/4a71c3b1-16d5-24e9-82d3-1c34c65a6769.png)

こんな感じです。

テスト環境などを構築する際に、ストレージなしのGPUサーバを参加させて活用したりしています。
また、各分散ストレージプール間の同期を早めるためサーバは、10GBit  Ethernetで接続しています。
そのおかげかはわかりませんが、データの同期でストレスを感じることはありません。

#実際の運用・活用

実際のクラスタの活用については利用者は、以下の流れで利用することになります

![スクリーンショット 2021-12-14 181529.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260879/18bd5906-f42f-3091-606c-7069e22651db.png)

ユーザーは、
１．空いているサーバーを確認
２．空いているサーバーに対してLDAPを通じてログイン
３．ストレージプールをバインドして,必要なコンテナを起動。
４. 使い終わったらコンテナを削除する

の順番で活用します。
ストレージプールは全サーバで共有されているのでデータはすべてのサーバーで同じものが使えます。
これにより計算が必要な時だけ必要なコンテナを立ち上げることができます。
# 問題点
現状のシステムにはいくつか問題点があります。
１．コンテナを消し忘れるとTensorflowの場合GPUメモリを抱えたままとなります。この場合実験が終わっているのかそれとも消し忘れているのかが判断しずらく可用性低下の原因となっています。

２．今のシステムは研究室のメンバーが先着順にサーバを占有していきます。当研究室のサーバは性能にかなりばらつきがあるので、あるサーバで動いてもあるサーバでは動かないということが発生します。そのため軽いプログラムが性能が高いサーバで動いて思いプログラムが低性能なサーバで動いているという状況が発生します。
# 結論
多少問題はあるものの構成が柔軟で大学の研究室のニーズは十分に満たしていると思います。
今後はKubeflowなどの導入の検討しつつ改善しています。
意見がありましたらコメントお願いします。
【React】【Vue】 など流行りのフレームワークを使うもののためのJS基礎「グローバルオブジェクト」


<h3>グローバルオブジェクトとは</h3>
JavaScript のインタプリンタ(JSの通訳)が起動すると、まず初めに生成される。

JavaScript のコード内で、最も外側にある（＝最上位の）オブジェクト。

普段書いている JS のソースをすべて覆っているオブジェクト。

グローバルオブジェクトは以下のようなプロパティを持つ

<hr>

<h5>「グローバルオブジェクトのプロパティ」</h5>

document: document
console: console
event: event

<h5>「グローバルオブジェクトのメソッド（＝プロパティのなかでも、その値が関数であるもの）」</h5>
alert：alert()
setTimeout: setTimeout()
close: close()

<hr>

このプロパティは、「最も外側にある（＝最上位の）オブジェクト」のプロパティなのでもちろんどこからでも使える。

普段使っているオブジェク内のプロパティはこのように呼び出される。

```javascript
const person = {
  name: '菅田将暉',
  age: 28,
  sample: () => {
    console.log('結婚おめでとう！');
  },
};

person.sample();
```

web ブラウザの場合 windows オブジェクトというものがグローバルオブジェクトに当たる。

そのため

```javascript
window.console.log();
```

このように書くのが、理解しやすいかもしれない。

上のオブジェクトの[person]の部分が[window]なのである。

これは省略可能であるため、見慣れた

```javascript
console.log();
```

このような使い方ができる。

参考
徹底マスター JavaScript の教科書
pipenvをインストールする

pipenvを使ってPipefileから開発用パッケージをインストールしようとしたところ、エラーで失敗しました。

```
$ pipenv install --dev
bash: command not found: pipenv
```
原因はpipenvをインストールしていないことです。そのまんまですね。
なのでpipenvをインストールしていきたいと思います。
ちなみにpipenvはpipでインストールするため、必然的にpipのインストールも必要になります。
一連の手順を備忘録として記載しておきます。

## 環境
macOS 11.5.2 BigSur
pip 20.2.3
Python 3.8.2

## pipをインストール
まずpipいれます。
curlコマンドを使って`get-pip`というPythonファイルをダウンロードします。

```
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
```

次にこの`get-pip.py`を実行し、pipをインストールします。

```
$ python3 get-pip.py
```

## PATHを通す
自分はpipインストールは成功したものの、以下のワーニングが出ました。

```
WARNING: The scripts pip, pip3 and pip3.8 are installed in '/Users/[ユーザー名]/Library/Python/3.8/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
```

PATHが通っていないのが原因なのでPATHを通します。`.bashrc`ファイルを開き以下を追加します。
ちなみにワーニングだからと無視しているとこの後のpipenvインストールが失敗するので、ここで解決しておく必要があります。

```
#↓この行を追加（PATHにはワーニングでおこられたパスを指定）
export PATH="$PATH:/Users/[ユーザー名]/Library/Python/3.8/bin"
```

保存したらファイルを再読み込みします。

```
　$ source ~/.bashrc 
```

これでPATHの設定が終わりました。
whichコマンドを叩きパスが表示されればインストール自体は完了です。

```
$ which pip3
/usr/bin/pip3
```

## pipenvをインストール
pipコマンドを使用してpipenvをインストールします。

```
$ pip3 install pipenv
```

以下のコマンドでインストールされたことを確認します。

```
$ pipenv --version
pipenv, version 2021.11.23
```

## pipenv install を実行
pipenv のインストールが完了したので、本来の目的だった`pipenv install`を改めて実行します。

```
$ pipenv install --dev
〜中略〜
✔ Successfully created virtual environment! 
```

うまくいきました。
Cloud Storageにアップされたファイルを検知してTopicに通知

#ミッション
以前、Cloud Storageにアップされたファイルを検知してCloud Functionsを実行を記載しましたが、
どこからかプルしたいので、その通知をTopicにプールしておきたくなりました。

#作戦
いわゆるGCPコンソールでできる設定はワンボタンで出る通常技のようなもので、
立ち回りで勝っている案件なら充分ですが、少し込み入ったものになると物足りなく思うことがあります。

そもそもがあくまでGCPコンソールはその機能は日々増えているとはいえ、管理ツールなので、
より細かい設定はコマンドでできることがあります。

実はCloud StorageからTopic通知もその一つで、
コンソールからはできないけど(2021/12現在)、特殊技(コマンド)で設定できます。

アップ通知とその場所だけが必要でそれをプールしておきたい場合、便利ですね。
立ち回りを強化するためにぜひ習得しておきたい技術ですね。

#実行
コマンドは以下です。

```
gsutil notification create -f json -t sample-topic -e OBJECT_FINALIZE -p path/ gs://sample-log
```
「gs://sample-log/path/」にアップされたファイルを
「sample-topic」に通知してます。

送られるデータ内容は以下です。

```
{
  "kind": "storage#object",
  "id": "sample-log/sample/sample.log/1639472654343175",
  "selfLink": "https://www.googleapis.com/storage/v1/b/sample-log/sample/sample.log",
  "name": "sample/sample.log",
  "bucket": "sample-log",
  "generation": "1639472654343175",
  "metageneration": "1",
  "contentType": "application/octet-stream",
  "timeCreated": "2021-12-14T09:04:14.348Z",
  "updated": "2021-12-14T09:04:14.348Z",
  "storageClass": "STANDARD",
  "timeStorageClassUpdated": "2021-12-14T09:04:14.348Z",
  "size": "2724327",
  "md5Hash": "lVd13h0377Jg2hzM0OXo2w==",
  "mediaLink": "https://www.googleapis.com/download/storage/v1/b/sample-log/sample/sample.log?generation=1639472654343175&alt=media",
  "crc32c": "RCJMTQ==",
  "etag": "CIe4ucn34vQCEAE="
}
```
bucketとnameからどこに上げられたのかわかります。
後はデータをダウンロードするなり、その後、加工するなりして、連続技につなげます。

現場からは以上です。
ソフトウェア保守ゼロ円は可能なのか？

# TL;DR

ソフトウェアは故障しないけど**陳腐化する**ので、日々最新化したほうが結果的に安くあがるよ。

# えらい人:man:「完璧なソフトウェアができれば、保守の必要はない」

~~そもそも「完璧なソフトウェア」が作れるのか？という問題もありますがそこはおいておいて。~~
仮に「完璧なソフトウェア」が作れたとしても保守の必要性はゼロにはなりません。
具体的にはケースがあります。

## インターネット可能なPCから利用するケース

隔離環境に塩漬けサーバーを配置するパターンがよくあります。

塩漬けサーバーへは「**その当時は**古くなかった暗号化通信」で通信することになりますが、塩漬けされているだけに「新しい通信方法」に対応できていません。
一方、クライアントとなるPCは、日々のセキュリティ改善で「古い（脆弱な）暗号化通信」や「そもそも暗号化されてない通信」を禁止していくことが多いため、いつの日か塩漬けサーバーにアクセスできなくなります。

「踏み台」と呼ばれる中継サーバーを経由することで一時的に回避できますが、根本的には解決しません。

* 「踏み台を経由することによる使い勝手の悪さ」をどうするのか。
* 「踏み台へのアクセス方法」が陳腐化する可能性。（「踏み台へアクセスするための踏み台」を用意する？）

## 互換ハードウェアが調達できないケース

ハード故障やリプレイス等で互換製品を調達できない場合、何等かの対応が必要となります。
入手可能なハードでは「今まで使っていたOSはサポート外と言われた」ということもよくあります。

仮想化して延命する手法もありますが、その場合は前述の暗号化通信問題にぶち当たることが多いです。

## 時代の流れについていくしかないケース

~~「古臭い」「使い勝手が悪い」といったお気持ちは、パワハラ（）で抑え込むことができますが、~~
想定してた性能では業務が回らなくなるケースや、コンプラ対応、「取引先の都合でver.XXのファイルを読み込めないといけない」等が想定されます。

最近ではUnicodeに対応できていないためトラブルになるケースも散見されるようになってきました。
ひと昔前は「特殊な文字は入力しないでください」と注意喚起することで何とかなっていましたが、Windows10以降で「特殊な文字だと思わなかった」「変換の第１候補だったので気が付かなかった」「コピペしたので依存文字だと気づかなかった」という事例があります。試しに「はしご高（髙）」を入力してみてください。意外に簡単ですよ。

# えらい人:man:「開発ドキュメントがあるので、必要になった時点で対応すればいいのです」

~~これも「開発に必要な情報がきちんと載っているか」という話があるのですが、~~
ソースや開発ドキュメントが揃っていたとしても、保守対応が可能とは限りません。
経験上、以下のパターンではまることが多いです。

## そのソフトウェアは再入手可能ですか？

これは皆さん意識されているかと思います。
が、次項や次々項と組み合わされると単純にはいかなくなります。

## 開発ツールは再入手可能ですか？

「開発環境が再構築できない」「開発ツールが動かない」「動くけど、使っているバージョンに対応していない」等になります。こちらはあまり意識されていない印象です。
「開発ツールの都合で、ライブラリバージョンを上げなくてはいけない」というのは、稀によくあります。

ある会社は「資料が消えると困るので、インターネット上のドキュメントを含め丸ごと保存しておけばOK」なんて力業で乗り切ろうとしたそうですね。:fearful:

## 非推奨の機能を使用していないですか？

製品やライブラリのバージョンアップに伴い、従来の手法が使用できないケースがあります。
大抵の場合「非推奨」扱いで猶予期間があるのですが、気づいた時には遅かったケースが多々あります。

「Java8から上げられない」「python2から上げられない」とか聞いたことはありませんか？そういうことです。

運が悪ければ新規構築相当の作業となり、スケジュールが圧迫されます。

## ライセンス料は確認しましたか？

ソフトウェアやツールによっては「使用再開時には、使用停止中の期間のライセンス料金もさかのぼって支払うこと」という規定があったりします。

## 「お支払いは１回払いでよろしかったでしょうか？」

日々の保守とは違い、保守再開にかかる費用は短期間にまとめて支払う必要があります。
また体感ですが、保守停止で浮いた分と同額程度になる印象です。

## チームは再構築できますか？

「わが社が声をかければ何とかなる」「開発作業が標準化されているので問題ない」と思っている部長さんは、たまにいらっしゃいますね。:pensive:
人材確保が難しい昨今、リスクがどんどん上がっている印象です。

「オフショアを活用」なんて声もありますが、暗黙知やニュアンス、「空気を読む」「行間を読む」ことの翻訳コストで大抵赤字になります。
オフショア窓口担当を専任できれば何とかなりますが、理解されないことが多いです。

## スケジュールは確保できますか？

開発スケジュールで無茶をいう会社さんほど、「（法改正等）自社でコントロールできない都合」に弱い印象がありますね。 :rolling_eyes:

# 結論

保守を止めてしまうほうがかえって高つくので、最低限の保守を続けていくことがベストなのではないでしょうか。

* 新しいLTSバージョンがでたら、１年くらいを目途に追従する。
* 機能が非推奨 or EOL提示されたら、移行プロジェクトを立ち上げる。
C#でカノジョをつくる（14日目）

お疲れ様です。たなしょです。
今日はGUIアプリをたくさん作りました。
GUIアプリのパーツについて理解することができました。

## internalキーワード
VCで新しいクラスを作るとデフォルトで付与されます。
同じアセンブリ内のコードからアクセスできるので基本的につけっぱなしでも問題なさそうです。（同じプロジェクト内でビルドしてるなら問題なし？）

## 抽象クラスを使ったアプリ
100以上なら割り算、100未満なら掛け算を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268048/d89ae52c-698d-e02b-40aa-1cc00f4ac4f0.png)
処理の順番は以下の通りです。
1.ボタンを押すとDoが呼ばれます。

```c#
private void Do()
{
   obj.DoCalc(Int32.Parse(textBox1.Text));
}
```
2.スーパークラスのDoCalcメソッド呼びます。

```c#
public void DoCalc(int n)
{
    if (Num > n)
    {
        this.Multiplier(n);
    }
    else
    {
        this.Divider(n);
    }
}
```
3.呼ばれている`Multiplier`と`Divider`は各抽象クラスにそれぞれ処理の詳細が記載されています。
3-1.Cls1ならn*2と計算します

```c#
public override void Multiplier(int n)
{
    Val = n * 2;
    MessageBox.Show("処理結果は" + Val);
}
```
3-2.Cls2ならn*4と計算する

```c#
public override void Multiplier(int n)
{
    Val = n * 4;
    MessageBox.Show("処理結果は" + Val);
}
```
## フォームアプリケーションの初期ファイルについて
### Program.cs
アプリケーションの開始に必要なMain()メソッド存在します。
### Form1.Designer.cs
フォームやコントローラの配置が記述されています。
下手にオブジェクトをクリックした後にビルドするとエラーになるのはだいたいこのファイルのせいです。
### Form1.cs
ボタンのクリック処理やメニュー選択の実行処理などを保存します。
プログラマーがいじるのはここがメインです。

## 計算機をつくる
AとBの値を計算するのみの計算機を作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268048/810247eb-1763-e793-7f45-271f8602084b.png)
以下処理の順番です。
1.各ボタンを押すとチェックが始まりtrueになると計算結果をメッセージボックスに出力します。

```c#
private void button1_Click(object sender, EventArgs e)
{
    if (CheckValue())
        MessageBox.Show(Convert.ToString(_num1 + _num2));
}
```
2.入力チェックをしてA,B欄どちらかに数字が入ってなければエラーメッセージを返します。最後にテキストボックスをクリアします。

```c#
private bool CheckValue()
{
    try
    {
        _num1 = Convert.ToInt32(textBox1.Text);
        _num2 = Convert.ToInt32(textBox2.Text);
        return true;
    }
    catch
    {
        MessageBox.Show("A欄とB欄に半角数字を入力してください。", "エラー");
        return false;
    }
    finally
    {
        textBox1.Clear();
        textBox2.Clear();
        textBox1.Focus();
    }
}
```
## 次の誕生日までの日付がわかるやつ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268048/b0fb307e-510e-3c86-a3bb-508a1b339d58.png)
作りは単純でカレンダーから日付を選択して、今日の日付との差分を計算しています。

```c#
private void button1_Click(object sender, EventArgs e)
{
    label2.Text = "選択した日付" + dateTimePicker1.Value.Date.ToString("yyyy/MM/dd");
    int birthdaty = dateTimePicker1.Value.Subtract(DateTime.Today).Days;
    label3.Text = "本日から次の誕生日まであと" + birthdaty.ToString() + "日";
}
```

## 最後に
GUIのパーツを使えば簡単にカレンダーなどを実装できるので色々なアイデアをお手軽に実装できますね！
東京ガスiネット株式会社の短期インターン体験談（5Days インターン）

　
　


こんにちは。　井関竜太郎です。

色々と多忙でしたが、落ち着いてきたのインターンの体験談を話していこうと思います。
少しでも興味あるかたなどのお役に立てれば幸いです！！


#きっかけ

初めての出会いは、athletixの逆求人のイベントでした。

https://athletix.run/events/MhIE3hVky

初めての逆求人のイベントに参加してとても緊張していましたが、東京ガスiネット株式会社の社員の方との会話の中でしっかり話せたと思います...笑
その後から連絡を取り続け、インターンの参加を決意し、応募しました。

東京ガスiネット株式会社のインターンのリンクは以下のものになります。

http://tginet-recruit.jp/internship/


##１日目

####やったこと
・オリエンテーション
・目標設定ワーキング
・配属先担当先輩社員との顔合わせ

####感想

初日でとても不安でしたが、オリエンテーションなどで緊張もほぐれました。
目標設定は、しっかりと達成できるか不安になりながら作成しました。


##２日目

####やったこと
・朝会
・東京ガスiネットについての説明
・ライフバルの悩みをヒヤリング
・課題解決に向けたフレームワークの作成
・オフィスツアー（オンライン上）

####感想
ライフバルの悩みをヒヤリングをした際に、具体的にどんなことに困っているのかやどのように改善したらいいかなどをできるだけイメージするために、自分から積極的に質問しなければわからないままになってしまうため、必死で質問をしました。
聴きながらメモをするのがとても大変でしたが、とても有意義な時間になりました。
アプリ開発を3日目に開始するのでとても楽しみでした。


##３日目

####やったこと
・朝会
・実際の業務参加①
・Prottを使用してアプリ開発

####感想
今回は、コーディングをせずに、「Prott」と呼ばれるノーコードのサイトを使用して作成しました。2日目から構想していたものを実際に画面に作る作業がとても楽しかったです。
しかし、使い方が慣れていなかったため時間がかかってしまいました。


##４日目

####やったこと
・朝会
・実際の業務参加②
・Prottを使用してアプリ開発の続き
・発表資料の作成

####感想
操作に慣れてきて、思っていたものがしっかりと作成することができてよかったです。UIや画面遷移の動きがとてもいい感じになることができました。最終日に向けて発表資料を作成するときは、しっかりと伝わるのかや操作のミスがないかなどが不安でした。



##５日目

####やったこと
・朝会
・発表資料の作成の続き
・発表会

####感想

発表では、しっかりと説明できて良かったです。聞いてくれた方々に色々な面のフィードバックをいただけました。
ワクチン接種日だったので、とても不安でしたが、しっかりと配慮してくれました...笑



##全体を通しての感想


自分のアイデアを形にして相手に伝えることが今までなかったから、今後いろいろな仕事をしていく上でとても重要になることを大学生のうちに経験できて本当によかったです！！
学生の緊張をほぐすために軽いゲームや雑談の時間を作ってもらえてとても活動がしやすかったです。初めての経験ばかりでとても不安な生活を送っていましたが、親切にアドバイスをいただき５日間がんばりきれたと思います。
AVX/AVX2による浮動小数点比較命令

# はじめに
浮動小数点比較命令を説明します．
compare命令は，要素a,bを比較し，比較結果が真なら`0xFFFFFFFF`を，偽なら`0x00000000`を示すマスクを返してベクトルに格納する命令です．
`_mm256_cmp_ps|pd(a,b,option)`で呼び出すことが可能です．
また，比較演算の`>, <, ==, >=, <=, !=`は，オプションで指定可能です．
オプションは，以下の通り31通りあります．

```cpp
0: OP := _CMP_EQ_OQ
1: OP := _CMP_LT_OS
2: OP := _CMP_LE_OS
3: OP := _CMP_UNORD_Q
4: OP := _CMP_NEQ_UQ
5: OP := _CMP_NLT_US
6: OP := _CMP_NLE_US
7: OP := _CMP_ORD_Q
8: OP := _CMP_EQ_UQ
9: OP := _CMP_NGE_US
10: OP := _CMP_NGT_US
11: OP := _CMP_FALSE_OQ
12: OP := _CMP_NEQ_OQ
13: OP := _CMP_GE_OS
14: OP := _CMP_GT_OS
15: OP := _CMP_TRUE_UQ
16: OP := _CMP_EQ_OS
17: OP := _CMP_LT_OQ
18: OP := _CMP_LE_OQ
19: OP := _CMP_UNORD_S
20: OP := _CMP_NEQ_US
21: OP := _CMP_NLT_UQ
22: OP := _CMP_NLE_UQ
23: OP := _CMP_ORD_S
24: OP := _CMP_EQ_US
25: OP := _CMP_NGE_UQ
26: OP := _CMP_NGT_UQ
27: OP := _CMP_FALSE_OS
28: OP := _CMP_NEQ_OS
29: OP := _CMP_GE_OQ
30: OP := _CMP_GT_OQ
31: OP := _CMP_TRUE_US
```

オプションの文字列が意味するのは，CMP以下の１つ目の項は以下の通りです．

```
EQ: a==b
NEQ: a!=b
GE: a>=b
GT: a>b
LE: a<=b
LT: a<b
NGE: !(a>=b)
NGT: !(a>b)
NLE: !(a<=b)
NLT: !(a<b)
```

また，2つ目の項は，要素にNaNが入っていた場合の処理のオプションであり，NaNが入っていなければどれを選んでも処理速度も結果も変わりません．

比較最後のO/U/Q/Sのオプションは，真の時に返す`0xFFFFFFFF`がNaNを示しており，それが入力に入ってきたときにうまくハンドリングするための対策のためのオプションです．
通常の演算では，0/0=NaN, +a/0 = +inf, -a/0 = -infが返くるため，これらをハンドリングするための処理です．

まず，O: ordered，U: unorderedをそれぞれ示しており，EQとNEQにそのオプションの選択肢が存在します．
なお，その他の比較は，ordered，not付き比較はunorderedのみが実装されています．

EQでorderedの場合は，NaNと数値比較した結果は0が返ってきて，unorderedの場合はNaNが返ってきます．
簡単に説明すると，orderedはNaNとのAnd演算であり，unorderedはNaNとのOr演算となります．

また，Q: quietとS: signalingは，Sの場合に例外を生じさせ，Qの場合は無視します．

**注意**：SSEの場合は，`_mm_cmp_ps`のオプションを変えるのではなく，以下の関数を使い分ける．
AVXが対応する世代のCPUではAVXの関数と同様にオプションを変えるだけで関数が切り替えられる．

* `_mm_cmpeq_ps: a==b`
* `_mm_cmpneq_ps: a!=b`
* `_mm_cmpge_ps: a>=b`
* `_mm_cmpgt_ps: a>b`
* `_mm_cmple_ps: a<=b`
* `_mm_cmplt_ps: a<b`

#### _mm256_cmp_ps|pd
```cpp
__m256 _mm256_cmp_ps (__m256 a, __m256 b, const int imm8)
__m256d _mm256_cmp_pd (__m256d a, __m256d b, const int imm8)
Instruction: vcmpps ymm, ymm, ymm, imm8 //ps
Instruction: vcmppd ymm, ymm, ymm, imm8 //pd
```

**動作**  

_mm256_cmp_ps
![v2_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67908/ac285667-5765-e358-a908-c3bf7e541ad1.png)

_mm256_cmp_pd
![v2_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67908/eb9b5a6a-1a8c-bc1b-e362-568f4b73e68e.png)

**CPI, Uops**  

| Architecture | Latency | Throughput |Uops|
|--------------|:-------:|:----------:|:--:|
| Alderlake    |    4    |    0.5     |  - |
| Icelake      |    4    |    0.5     |  1 |
| Skylake      |    4    |    0.5     |  1 |
| Broadwell    |    3    |     1      |  1 |
| Haswell      |    3    |     1      |  1 |
| Ivy Bridge   |    3    |     1      |  1 |
| Sandy Bridge |    3    |     1      |  1 |
| Zen3         |    1    |    0.5     |  1 |
| Zen2         |    1    |    0.5     |  1 |
| Zen          |    1    |     1      |  2 |

* 整数に比べて遅いです
* AMDのZenシリーズのレイテンシは短いです

**説明**  
float/doubleに対する比較命令を行います．

```cpp
dst[i+31:i] := ( a[i+31:i] OP b[i+31:i] ) ? 0xFFFFFFFF : 0 //ps
dst[i+63:i] := ( a[i+63:i] OP b[i+63:i] ) ? 0xFFFFFFFFFFFFFFFF : 0 //pd
```
[py2rb] cls

# はじめに
移植やってます。
# cls (Python)
```python
class WritableIndex(object):
    @classmethod
    def load(cls, fp):
        inst = cls()
```
`@classmethod`はRubyでいうところの特異メソッドで行けそうな気もしますが、`cls`は厄介そう。
上記ですと、`cls()`を呼んだとき、現在のクラスがインスタンス化されます。
# どうする？ (Ruby)
```ruby
class WritableIndex
  def self.load(fp)
    inst = self.new
    inst.myprint(fp)
  end

  def myprint(args)
    print(args)
  end
end

WritableIndex.load("cls")

# cls
```
取り敢えず`self.new`で。
ちなみに30箇所で使用されている様子。
# メモ
+ Python の cls を学習した
+ 道のりは遠そう
AWS SES ムームードメインのDNS設定を利用する



Amazon SESを利用するために ムームードメインコントロールパネルにて設定を行いました。


前提
--

ネームサーバは**Route53をつかわない**

設定箇所
--

全部で7つです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/b41c0a7a-5a1d-999e-18f5-0570578ce5d1.png)
MATRIX ITERATIVE ANALYSIS, Maruzen Asian Edition, RICHARD.S.VARGA

```{r}

#Solution for Laplace equation(Dirichlet boundary condition U(x,y)=g(x,y)  (x,y) in boundary set) 確認必要
#p.3

u=function(x,y){
return(x^2-y^2+x)
}

#Laplace equation

h=0.001
x=1/3;y=1/3
(u(x+h,y)-2*u(x,y)+u(x-h,y))/(h^2)
(u(x,y+h)-2*u(x,y)+u(x,y-h))/(h^2)

X=seq(0,1,1/3)
Y=seq(0,1,1/3)

U=array(0,dim=c(length(X),length(Y)))

for(i in 1:length(X)){
for(j in 1:length(Y)){
U[i,j]=u(X[i],Y[j])
}}

U1=U[1,]
U2=U[2:length(X),length(X)]
U3=U[length(X),(length(X)-1):1]
U4=U[(length(X)-1):2,1]

g=c(U1,U2,U3,U4)

A11=diag(1,2)
A12=array(-1/4,dim=c(2,2))
A22=diag(1,2)
A=rbind(cbind(A11,A12),cbind(A12,A22))

k=c(g[1]+g[11],g[5]+g[7],g[2]+g[4],g[8]+g[10])

#called the point Jacobi or point total-step method

w=rep(1,ncol(A))
B=diag(rep(1,ncol(A)))-A
ite=100
for(l in 1:ite){
w=B%*%w+k
print(w)
}

W=solve(A)%*%k

```
誰にでも分かる！？ゼロトラスト入門編

##はじめに
昨今のテレワークの普及から、さらに注目を集めているゼロトラスト（ゼロトラストネットワーク、ゼロトラストセキュリティ）について、概要から従来のセキュリティとの比較、考えられる導入の方法まで分かりやすく解説できればと思います。

##1.ゼロトラストとは「すべてを信頼しない」セキュリティ対策
ゼロトラストはトラスト（信頼）＝ゼロ（無い）という名の通り「全てを信頼しない」という考え方から、セキュリティ対策を行います。内部・外部からのアクセスを問わず、すべてを疑い、検証します。テレワークの増加から社内外問わずサービス・データへの接続が行われる現在のセキュリティ対策に非常に有効的な手段と言えるでしょう。

##ゼロトラストを実現するための７つの要件
ゼロトラストを実現するためには、アメリカの調査会社「Forrester Research」が提唱する下図の７つの要件を重視する必要があります。
何か一つ製品を導入すればゼロトラストを実施できるというものではなく、７つの要件を基に複数の製品・サービスを組み合わせて導入する必要があります。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311406/d412bff8-f91d-5172-21ac-db3fad323641.png)

##これまでの"境界型セキュリティ"の危惧とゼロトラストへの転換
ゼロトラスト以前のセキュリティは境界型セキュリティが採用されていました。内部と外部の間に境界線を引き、その境界線にのみセキュリティ対策を行う方法です。社内ネットワークは安全で、外部ネットワークは危険という考えの基に成り立っており、社内ネットワークに入れた者は全て信頼されます。

しかし、近年はクラウドサービスの増加やテレワークに伴う機器の持ち出し、社員の自宅環境からの社内ネットワーク接続等によって、内部と外部の境界線があいまいになってきています。下図のように、これまでの境界の外側に端末やクラウドサービスが位置するためセキュリティリスクは増大します。そのため、外側の通信の対策を行えない従来の境界型セキュリティには限界が来ています。また、内部不正や人的ミスによる情報漏洩も増加しており、外部だけでなく内部の監視の重要性もより増しています。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311406/f518cbf9-84a5-0960-73ed-57e195731400.png)

:::note
 ・境界ネットワークにより、インターネットの出入口で侵入や外部へのデータ送信等を防御
:::

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311406/c124e7e9-00a7-de2c-6874-d6807c49ebb8.png)

:::note alert
・クラウドサービスは、社内システムと違い攻撃者も容易にアクセス可能。
・テレワークにより、インターネットの出入口でセキュリティが低下し、攻撃を受けやすい。
・テレワークPC経由で社内システムに侵入され、データ搾取等される可能性がある。
:::

##情報を守るためには、全ての対策が必要なのか？
7つの要件を満たすべく、全ての製品が導入されていることが望ましいのは確かです。しかし、全てを満たすには多大なコストがかかるのも事実です。そこで、機密情報を守るためにはどこを強化するべきなのか（アカウント（ID）、デバイス（PC・スマートフォン）、ネットワーク等）を考えてみましょう。
例えば上図の「現在」に示すように外部に出ているクラウドサービス内に機密情報を保持しており、そこを守りたいのであれば、クラウドサービスの認証を強化するような製品（例：IDaas等）を。テレワークPC自体への攻撃から保護をしたいのであれば、エンドポイントセキュリティ（例：EPP、EDR等）の製品を導入するなど、予算と相談しつつ段階的にセキュリティを高めていくことを推奨します。

##境界型セキュリティは必要がなくなるのか？
先述した通り、７つの要件をすべて満たすには多大なコストが掛かり、全てを実現するのは難しいです。
そこで、現在構築されている境界型セキュリティを維持したままゼロトラストの要素と組み合わせていくハイブリッド環境というものがあります。
ハイブリッド環境については、IPA（独立行政法人 情報処理推進機構）のゼロトラスト指南書のモデルケースとしても紹介されております。先述の通りどこを守りたいのかを考え、境界型防御とあわせたゼロトラストのスモールスタートをきることが第一歩と考えます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311406/f90d207a-073c-d825-8576-3d9bad04de6e.png)

##ゼロトラストのメリットと製品の簡易紹介
分野ごとに以下のセキュリティメリットがあります。

<h4>ID管理関連</h4>
「多要素認証」によりIDとパスワードだけでなく、生体認証やスマートフォン等のデバイスによる認証を組み合わせることによりセキュリティを高めることができます。これにより外部に出ているクラウドサービスの認証を強化できます。また、IDを統合管理することにより、退職者やテスト用のIDの放置を防ぎ、セキュリティリスクを低減します。
これはIDaas（Identity as a service）製品で実現することができます。

<h4>デバイス関連</h4>
従来のウィルス対策製品では防御できなかったマルウェア等を、パソコンの動作を監視し、侵入されてしまった後にも検知することができます。
これはEDR（Endpoint Detection and Response）製品で実現することができます。

<h4>ネットワーク関連</h4>
ファイアウォールに依存せず、端末とアクセス先（クラウドサービスや社内データ）の通信の認証を行うことで安全性の確保ができます。また、Webページのフィルタリング機能等を用いることで、フィッシングサイト等の危険なサイトをブロックし、安全にインターネットアクセスが可能になります。
これはSDP（Software Defined Perimeter）やSWG（Secure Web Gateway）といった製品で実現することができます。

<h4>データ関連</h4>
データ（機密情報等）自体を監視し、データの持ち出しやコピーを検知し、情報漏洩を防ぐことができます。
これはDLP（Data Loss Prevention）製品で実現することができます。

##さいごに
ゼロトラストの概要や比較、メリットについて簡単にまとめてみました。
一言にゼロトラストと言っても、とても範囲が広く中々とっつきにくい存在に思えるかもしれませんが、この記事で少しでも知識をつけてもらえれば幸いです。

また機会があれば、それぞれの製品について詳しく説明できればと思います。
bat：日付時刻をファイル名先頭に付けたバックアップファイルをコピー作成

```bat:copy.bat
set time_tmp=%time: =0%
set DateNow=%date:~0,4%%date:~5,2%%date:~8,2%
set TimeNow=%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2%
set filename=%DateNow%_%TimeNow%「コピー元ファイル名」
set SourceFile=「コピー元ファイルパス」
set TargetFile=「コピー先フォルダパス」\%filename%
copy "%SourceFile%" "%TargetFile%"
```
Neural Nearest Neighbors Networkを読んだのでメモ

## 文献情報
タイトル: [Neural Nearest Neighbors Networks](https://github.com/visinf/n3net)
著者: Tobias Plötz Stefan Roth

## 概要

NeurIPS2018の論文．特徴抽出→$k$-NNを求める部分を微分可能にする方法についての研究．1つだけを選ぶcross-entropyを拡張してk個を選ぶようにしたい．従来も確率的な$k$近傍計算方法は存在したが，$k$個のサンプルは1番近いものから順にサイコロを振って1個選ぶ，という操作を繰り返していた．しかし，このような方法では結局一つだけ選ぶために誤差の伝搬が進みにくい．提案手法では学習の過程では$j$番目の要素を1つだけ選ぶ代わりに，各サンプルの期待値を重みとした重み付き和$\sum \bar{w}_i^jx_i$により近傍点を合成して学習する．理論的な裏付けとしては，cross-entropyの温度パラメタ$t$が0に近づくような「極限分布」においては，これも結局1つ選ぶのと同じになるため，$k$-NNを学習できる．

## なぜこの論文のメモを残した？
数式の定義が一部曖昧で読みにくかったためメモを残す．基本的に論文の解説というよりは論文の補完程度のメモ．なお，[ここ](https://peluigi.hatenablog.com/entry/2018/11/06/154947)に他の方の論文紹介などもある．

## 論文を読むときに理解しにくいポイント
数式(5)においては，$w_i^j$は$i$番目のサンプルが$j$番目の近傍点であったかどうかを表している．ただ，この$w_i^j$は論文中で明確に定義されていないため，数式が厳密に理解できない．おそらく，これは$\rm{Cat}(w^j|\alpha^j,t)$という分布（$w^j$は各サンプルが$j$番目の近傍点である期待値）に従ってサイコロを振ってランダムに一つだけ選んで得られたone-hot-vectorのことだと思う（違うと思う人はコメントをくれると泣いて喜びます）．

おそらく，提案手法に相当する式(8)-式(10)が従来の確率的$k$近傍計算の純粋な連続値緩和になっていることを示すため，式(5)-式(6)をこのような書き方にしているのだと思う．素直な気持ちで式(8)-式(10)を読むと混乱しなくてすむ．ポイントは，1個のサンプルを選びながら学習するのではなく，$k$個のサンプルの重み付き和を近傍点と思って学習する部分にある．この点で，本質的にGumbel softmaxなどで離散化しながら探索をするのとは異なるアプローチになっている．

なお，図1も正直自分にはかなりわかりにくいが，おそらく，ここの(1,0,0)とか(0,1,0)とかは$j$番目の近傍点となる尤度のようなものを表していて，(b)は決定論的．(c)はサイコロで決めるものの，サイコロふった後は特定のサンプルが$j$近傍と信じてやる，(d)は重み付きなので一個を決定しない，といったことを言いたいのだと思う（ここも図を正しい解釈できる人からのコメントがあると嬉しい）．
yumでよく使うコマンド

yumでよく使うコマンドについて記載


```

#rpmファイルやヘッダなどのキャッシュを削除
$yum clean all

#パッケージリストをアップデート
$yum list updates

#アップデート
$yum update mysql

#アップデート可能なパッケージリストを表示する
$yum check-update

#特定パッケージを除外してアップデート
$yum update --exclude=パッケージ名

#特定パッケージを除外してアップデート（ワイルドカード）
$yum update --exclude='kernel*'

#特定パッケージを除外してアップデート（ワイルドカード、複数指定）
$yum update --exclude='php* python*'

#インストール
$yum install mysql

#スペース区切りで複数可能。
$yum install mysql mysql-devel mysql-server mysql-utilities

#インストール（ワイルドカード）
$yum install mysql*

#削除
$yum remove mysql

#パッケージ一覧を表示
$yum list all パッケージ名

#インストール済みパッケージ
$yum list installed パッケージ名

#利用可能パッケージ
$yum list available パッケージ名

#インストール確認でyesを入力する
$yum install -y mysqld

#別のリポジトリからインストールする
$yum --enablerepo=remi install php

#ダウンロードしたパッケージを削除
$yum clean packages

#現在有効なリポジトリの一覧を表示する
$yum repolist

#現在無効なリポジトリの一覧を表示する
$yum repolist disabled

#パッケージの情報を表示
$yum info パッケージ名

#パッケージを検索
$yum search パッケージ名

```


以上
Appleの紛失防止タグ「AirTag」

#紛失防止タグとは
好きなアイテムに装着しスマートフォンとペアリングし
音を鳴らして探知、接続が切れた場所を記録、紛失した後でもほかのユーザーのスマホと協力して簡易的な追跡が可能

2021年にappleからairtagが発売されて紛失防止タグに注文が集まったが
airtagと他製品の紛失防止タグとを比較

#他製品と比較した時のメリット
####bluetooth圏外で他のタグに比べて見つけやすい
基本的に紛失防止タグ自体にGPSは搭載されておらず
bluetooth圏外(スマートフォンから接続が解除されてしまった場合)
では他の同製品を所持しているユーザーから距離の共有を受けられるので
世界中にある数億台のiPhone、iPad、Macデバイスの「探す」ネットワークから位置情報の共有を受ける事ができるAirTagが圧倒的に有利
####「正確な場所を見つける」機能で見つけやすい
iPhone 11以降のモデルの多くに搭載されている「U1チップ」。近距離高速通信を特長とするUWB(Ultra Wide Band)を利用したチップ利用し
GPSでは不可能である数メートル単位、方角での検出が可能
####「手元から離れたときに通知」機能で未然に紛失を防ぐ
置き忘れ/盗難防止のための機能。 AirTagがiPhoneから離れて、そのBluetooth電波到達範囲(約10m)を超えるときに警告を受け取ることが可能。 
アイテムごとに、自宅や職場など、この通知を無視する場所(例外)を指定可能。
※ios15以上のアップデートで追加

#デメリット
####優秀な仕様を使ってストーカーや車両盗難等の犯罪に使用される事件が多発

・apple製品なら8～24時間で不明なairタグがある場合にアラート
・androidは専用アプリをダウンロードしなければならない

上記の対応策があるがいずれも効果はうすい

#リンク

apple Airtag(iphone専用)
https://www.apple.com/jp/airtag/

tile(iphone、android)
https://thetileapp.jp/

正体不明のAirTagを発見するAndroidアプリ ...
https://play.google.com/store/apps/details?id=com.apple.trackerdetect
Flutterのアップグレード

## この記事について
公式のUpgrading Flutterをざっくり和訳したものです。
翻訳には一部Google翻訳を使用しています。

https://docs.flutter.dev/development/tools/sdk/upgrading

## Flutter SDKの更新

Flutter SDKのバージョン更新には以下のコマンドを使用する

```
flutter upgrade
```

このコマンドを実行することで、現在のFlutterチャンネルで使用できるビルドの中で一番最近リリースされたFlutter SDKに更新できる。
安定度の低いチャンネルに切り替えることでより新しいバージョンのSDKをいれることができる。


## Flutterチャンネルを切り替える
Flutterは安定度の高い順に以下の4つのチャンネルをもっている。

- stable
- beta
- dev ※廃止予定
- master

公式ではstableを使用することが推奨されている
現在のチャンネルを確認したい場合は以下のコマンドを実行する

```
flutter channel
```

指定のチャンネルに切り替えたい場合は以下の形式でコマンド実行する

```
flutter channel <channel名>
```

チャンネルを変更したら、flutter upgradeコマンドでFlutter SDKと依存パッケージのダウンロードを行うこと。

```
例 :
flutter channel dev
flutter upgrade
```

## 各チャンネルの説明

### stable
おおよそ3ヶ月に一度、betaブランチは安定化されて、次のstableブランチになってリリースされる。
全ての本番アプリのリリースについて、このstableチャンネルを使用することを推奨している。
重大な問題や、セキュリティに大きな影響のある問題がある場合は、stableブランチに対してホットフィックスでリリースを行うかもしれない。


### beta
月の初め、最初の月曜日にmasterのbranchから分岐する。これにはdartのエンジン、フレームワークも含まれている。
このブランチは次の二、三週間で安定化された状態になり、影響の大きい問題の改善のためにチェリーピックリクエストを受け入れる。
月の最後に近づくにつれて、このチェリーピックの数は減っていく。3ヶ月に一度、betaブランチはstableブランチになり、存続する。
流れについては以下を参照

https://github.com/flutter/flutter/wiki/Flutter-Cherrypick-Process


### dev
最新の完全にテストされたビルド。基本的には動作するが、既知の不良開発ビルドについては以下を参照すること。

https://github.com/flutter/flutter/wiki/Bad-Builds

継続的にmasterのビルドはdevに移行されている。

### master
現在のツリーの最先端、最も新しいビルドが含まれている。
基本的には動作するが、時々誤って何かを破壊することもある。

## パッケージの更新
pubspec.yamlを修正した場合、またはアプリが依存しているパッケージの更新をしたい場合は、flutter pubコマンドを使用する。

pubspec.yamlのdependenciesで列挙されているすべてのパッケージを最新の互換性のあるバージョンに更新するためには以下のコマンドを使用する

```
flutter pub upgrade
```


古いパッケージの依存関係を特定し、それを更新する方法についてアドバイスを得るにはoutdatedコマンドを使用する。
詳しくは以下を参照

https://dart.dev/tools/pub/cmd/pub-outdated

```
flutter pub outdated
```
一般ユーザーで管理者権限コマンドプロンプトを実行する方法

例えば、管理者権限の無いユーザーに管理者権限を付与したい場合。
#通常の方法

１．ユーザー切替やサインアウトして、管理者権限のあるアカウントでログインし直す
２．コマンドプロンプトを管理者として実行
３．net localgroup administrators /add hoge

#一般ユーザーにログオンしたまま管理者権限コマンド実行
１．管理者権限のあるローカルアカウント名とパスワードを確認
　（例　ID:fuga　PW:fuga）

２．デスクトップ等にショートカットを作成し、下記パスを設定
　※パスワードを毎回入力したい場合は/savecredを外す

```powershell
C:\Windows\System32\runas.exe /savecred /user:fuga "powershell -command \"start-process cmd -verb runas\""
```

３．２のショートカットを実行し、初回のみ１のパスワードを入力

４．net localgroup administrators /add hoge
Virtual Boxからandroid emulatorに接続する


<details><summary>ゲストOSからホストOSに接続出来るか確認する</summary><div>

デフォルトでOKのはず

スタートメニュー
　⇒歯車
　　⇒更新とセキュリティ
　　　⇒Windowsセキュリティ
　　　　⇒ファイアウォールとネットワーク保護
　　　　　⇒（アクティブ）となっているものを選択
　　　　　　⇒ファイアウォールをOFFにする。

ゲストからpingを打って返ってきたらOK

ファイアウォールは戻しておく
</div></details>

<details><summary>Windowsの転送設定をする</summary><div>

```
netsh interface portproxy add v4tov4 listenport=6000 listenaddr=192.168.11.3 connectport=5555 connectaddress=127.0.0.1
```
</div></details>

<details><summary>ファイアウォールの穴あけ</summary><div>

スタートメニュー
　⇒歯車
　　⇒更新とセキュリティ
　　　⇒Windowsセキュリティ
　　　　⇒ファイアウォールとネットワーク保護
　　　　　⇒詳細設定
　　　　　　⇒受信の規則を右クリック
　　　　　　　⇒新しい規則
　　　　　　　　⇒ポート6000とかで適当に作る
</div></details>

<details><summary>adb connectで接続する</summary><div>

![vbox2emulator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383810/1f251dd2-9ac2-dae8-2739-8548ba5c33de.png)

</div></details>
マネージドインスタンスグループの自動スケーリングを体験してみた

# はじめに
本記事は[NI+C Advent Calendar 2021](https://qiita.com/advent-calendar/2021/niandc_teamgcp)の15日目の記事となります。

今年度から、Google Cloudを担当しています。
次回携わる予定の案件で、Compute Engineの[マネージドインスタンスグループ](https://cloud.google.com/compute/docs/instance-groups?hl=ja#managed_instance_groups)を使用するため、実機で動作確認のため、オートスケーリングを体験してみました。

# マネージドインスタンスグループとは
>[マネージドインスタンスグループ(MIG)](https://cloud.google.com/compute/docs/instance-groups?hl=ja#managed_instance_groups)では、複数の同一 VM でのアプリケーション操作が可能です。自動スケーリング、自動修復、リージョン（マルチゾーン）デプロイメント、自動更新などの自動化 MIG サービスを活用することで、スケーラブルで可用性に優れたワークロード処理を実現します。

#検証
##検証内容
検証環境にCPU負荷をかけ、設定した自動スケーリングが機能するか確認する。
また、CPU負荷低減された際に、スケールダウンするか確認する。

##検証環境
####１．インスタンステンプレート作成
・OS：Cent OS7
・マシン（n1-standard-1：vCPU x 1、メモリ 3.75 GB）
※検証目的のため費用を抑える構成
![k_shigeyama_20211214_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361584/08843c23-210f-cb59-a51b-6786739870c6.png)

↓作成を押下すると、インスタンステンプレートが作成できます。

![k_shigeyama_20211214_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361584/5ffceff3-6ade-916d-4feb-4a728994df31.png)

（今回は、自動スケーリングのための検証のため、真っさらなOSで実施していますが、事前に準備した環境でインスタンステンプレートを作成することも可能）

####２．インスタンスグループ作成
基本的にはデフォルト値にて作成しましたが、自動スケーリングに関する項目は、以下としました。

| 設定項目 | 設定値 |
|:-----------|------------:|
| 自動スケーリングポリシー（CPU使用率） |  60% | 
| クールダウン期間    　　　　| 60秒  |
| インスタンス数 最小数       | 1台  | 
| インスタンス数 最大数       | 3台  |

![k_shigeyama_20211214_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361584/b14ef710-37e0-bf0f-296d-6f88ce9bd28c.png)
![k_shigeyama_20211214_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361584/add92247-536b-37e6-960c-dee69954be25.png)

↓まずは、最小インスタンスで1台起動
![k_shigeyama_20211214_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361584/ad8a7dc7-4987-a65e-2f4f-58b981b27776.png)

####３．自動スケーリング
１）CPUを負荷をかけるために、stressコマンドインストール

```
yum install stress
```
２）CPU1コアに対して1分間負荷をかける

```
stress --cpu 1 --timeout 1m
```
３）２）により、CPU負荷が上がり、自動スケーリング稼働
あっという間に、追加で2台立ち上がりました！（早い。）
![k_shigeyama_20211214_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361584/71c9f155-4483-1e99-2685-e4257313c809.png)

４）CPU負荷が下がり、インスタンス最小値へ
クールダウン期間（今回はデフォルト値の60秒）後に、自動スケーリングポリシーの確認が行われます。CPU負荷は、コマンド終了後に、少しずつ低減していき、インスタンスは自動的に、停止していきました。

![k_shigeyama_20211214_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361584/a7af8fd1-cab0-2404-68ca-51debb69c0cb.png)
↓インスタンス最小値の1台へ
![k_shigeyama_20211214_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361584/35f5652e-f520-5f98-81be-a5f1845b2b9b.png)

##モニタリングを見てみよう
検証内容が確認できました。
最後に、今回実施した内容のモニタリングを見てみたいと思います。

14時20分頃に、負荷コマンドを実行し、その直後CPU使用率が上がり、インスタンス数が1台から3台に増えたことが分かります。その後、CPU使用率が下がり、インスタンス数が3台から1台に減ったことも分かります。

![k_shigeyama_20211214_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361584/2eb73838-e53f-bf47-600f-2f92c3a4ba0d.png)

特にカスタマイズしたモニタリングでもないですが、これがすぐに見れるのはいいですね。

# 最後に
今回は、簡易的にマネージドインスタンスグループの自動スケーリングを検証しましたが、GUIの簡単な操作でできるなんて便利ですね。Compute Engineの耐障害性として、検討してみてはいかがでしょうか。
Unity初心者がImageを発光させる

# はじめに
[CYBIRD Advent Calendar 2021](https://qiita.com/advent-calendar/2021/cybird) の22日目担当、新卒の@cy-naullと申します。
21日目は @R_arai さんの「研修中勉強したObserverパターンについて」でした。エンジニアたるものスマートに実装したい気持ちがあるので、こういった技術があることを知り、勉強になりました！


# 概要
右も左もわからないUnity初心者&ゲーム制作未経験が、技術研修で2Dゲームを制作する際にImageをぴかぴかと光らせたいと思い立ち、試行錯誤する記事です。
基礎的な内容が主になるので、暖かく見守っていただけたらと思います！よろしくお願いいたします:sparkles:


# 目次
1. ImageとSprite
2. Imageを発光させる
3. まとめ


# 1. ImageとSprite
ゲームを制作するにあたって、見た目から入ってしまう私は「オブジェクトを光らせたらいい感じになるのでは:sunglasses:」と思い立ち、Google検索で調べ、アセットなどを駆使し、いざ発光！！

と、思ったのですが、なぜかうまくいかない......。いろいろ調べた結果、私が発光させようとしていたものは2Dオブジェクト(以下、Spriteと表記します)ではなく、UIのImageだったと判明しました。
UIとSpriteの違いについての詳しい説明はこの記事では省略しますが、**UIはLightの影響を受けない**とのこと。
<br>

| UI| Sprite |
|:------------:|:------------:|
| Lightを当てることができない      |  Lightを当てることができる |

<br>
諦めて、ImageをSpriteに変えてもよいのですが、Unityはたくさんの便利なアセットがあるため今回はそれらを利用して発光させていきたいと思います。


# 2. Imageを発光させる

今回は、いらすとやの[ゆめかわぺんぎん](https://www.irasutoya.com/2019/06/blog-post_79.html)をぴかぴか発光させていきたいとおもいます。（ゆめかわぺんぎんは、CanvasのImageとして配置します）
![スクリーンショット 2021-12-10 15.53.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298352/b26faae6-fa44-91c4-859c-230511cf07b2.png)

### 使用環境
- macOS Catalina ver. 10.15.7
- Unity ver. 2020.3.7f1

<br>


全体の流れとしては、以下となります。

1. Post processingのインストール
2. Post processingの設定
3. Bloomの設定
4. 発光させてみる


### 1. Post processingのインストール

`Window > Package Manager` を開きます。PackagesをUnity Registryに変え、Post processingを選択、インストールを行います。

![スクリーンショット 2021-12-10 16.09.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298352/0edf0bcf-7c46-e887-fd49-9c2aaef185fd.png)



### 2. Post processingの設定

インストール後、カメラの設定を行います。
使用しているカメラを選択し、Inspectorの `Add Component > Rendering > Post-process Layer` を選択します。

次に、Post-process Volumeの設定をしたいと思います。
`GameObject > Create Empty` で空のオブジェクトを作成し、Inspectorの `Add Component > Rendering > Post-process Volume` を選択します。アタッチできたら、Is Globalのチェックをつけ、ProfileのNewボタンを押下します。
すると、以下の画像のようになると思います。

![スクリーンショット 2021-12-10 16.38.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298352/b9f1965f-f7f2-6ac7-ca02-c0fa7b5803f0.png)


### 3. Bloomの設定
最後に、発光させる準備を行います。
先ほどアタッチしたPost-process Volumeの `Overrides > Add effect > Unity > Bloom`　を選択します。一見、文字が灰色になっており変更できないように見えますが、左側のチェックボックスを選択すると自分で数値が変更できるようになります。
詳細な設定もできますが、今回はお手軽に光らせるため、Intensity（エフェクト強度）、Threshold(閾値)、Color（エフェクトの色）を変更します。

![スクリーンショット 2021-12-10 17.02.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298352/80b09992-93e5-8a5f-7c42-463ab07122ac.png)


### 4. 発光させてみる
いざ、発光！！
おーーーー！！！！ 光った！！！！:sparkler::sparkler::stars:

![スクリーンショット 2021-12-10 17.05.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2298352/89c5b5a2-d7d8-b53a-99c0-49e713d5e838.png)


# まとめ
今回、研修で初めてUnityゲームをつくってみて、画面上は一緒に見えても実装方法が違うということが多々あり、苦戦することもありました.......。しかし、アセットがたくさんあるのでやりたいことがすぐに実装でき、楽しみながら研修を終えることができました。これを機に個人でもゲームをつくってみたいです！

明日の [CYBIRD Advent Calendar 2021](https://qiita.com/advent-calendar/2021/cybird)、23日目担当は @gumita さんの「応用情報技術者試験に向けて失敗から学ぶ対策法」 です。応用情報の勉強は難しく、対策はぜひ知りたいですね:eyes:
PyInstaller と　Pyarmor の基本的な使い方 

# Pyinstaller と Pyarmor

Pythonを使ってGUIツールを作成したり、コードをexe化して配布する際のツールとして、Pyinstaller と Pyarmor があります。
Pyinstallerは　python コードを windows なら exe file に、mac ならapp file にします。Pyarmor は製品化する際に、コードの中身が知られたくない場合に難読化してからexe化します。

今回仕事で使用する機会があったので個人的な覚書とともに共有させていただきます。

## 両方ともにCross Platform ではない

Pyinstaller, Pyarmor ともにcross platform ではないです。そのため、Windows、Mac、Linux それぞれで exe化、app化しなければいけません。 その際 **OSのversionを一致させる** (Big Surでapp化したものを、Catalinaで起動できませんでした)　ことも重要です。

（Fastapiのフレームワークを使用している場合は `pip install websocket==8.1` が必要でした。uvicornを使用している影響？）

## 環境によるコマンドの違い

```
flask
  ┝ __init__.py
  └ app.py
```

簡単ですが、上のようなFlaskアプリを想定します。

- Local　環境にpython やpythol library をinstall している場合
    1. Pyinstaller を使用
       - /flask 配下　で　`pyinstaller app.py`
    2. pyarmor を使用
       - /flask 配下で、`pyarmor pack -e " --onefile" app.py`

- Poetry環境下でPython, python library をinstall している場合
    1. Pyinstaller を使用
       - `pyinstaller app.py`
    2. Pyarmor を使用する際
       - `pyarmor pack -e " --onefile" -x " --exclude venv --no-cross-protection" app.py` にてexe, app 
         化します。.venv file をexclude しなければいけないようです。


## Pyarmor のライセンス

商用利用にはライセンス購入が必要です。
１回買いきりで7000円程度です。一つ買えば複数に使うことができる？？

[PyArmor -license](https://pyarmor.readthedocs.io/en/latest/license.html#purchase)



Pyarmorに関しては情報が少なく、特にpoetry 環境下でのBuild の方法がわからずに苦労しました！
どなたかの参考になりますと幸いです！

## 参考記事
- [PyArmor 〜pythonソースコードを暗号化して納品する楽な方法〜](https://qiita.com/Takayoshi_Makabe/items/f38380bd1d097ac9d797)
【CSS】background-clip: textで背景を文字の形に切り抜く

株式会社ココロファン - エンジニアリング事業部所属のhazamaです。

サイト制作・運用業務をメインに行っています。
最近はWordPressを触る機会が増えたので、関連した記事を書こうと思ったのですが、
CSSで面白そうなものを見つけたので、ちょっと調べてみました。
##background-clipとは
>background-clip は CSS のプロパティで、要素の背景を境界ボックス、パディングボックス、コンテンツボックスのどれまで拡張するかを設定します。

引用：https://developer.mozilla.org/ja/docs/Web/CSS/background-clip

本記事では、「text」を指定しますが、引用にもある通り「border-box、padding-box」なども指定でき、主な役割としては要素の背景領域をコントロールするプロパティのようですね。
##使用できるブラウザ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256886/00cee715-3e7e-251e-70eb-eba30c2f46c3.png)
引用：https://caniuse.com/background-clip-text

Opera Miniはサポート外ですが、主要なブラウザは抑えているようなので問題なさそうですね。
IEは知りません。
##やってみる
まずは適当な要素を準備

```html
<p class="font-gr">株式会社ココロファン - エンジニアリング事業部所属のhazamaです。</p>
```
スタイルを記述する。
この時、文字色を透明にする必要があります。

```css
.font-gr {
  color: rgba(0,0,0,0);
  -webkit-background-clip: text;
  background-image: url(./test.jpg);
  text-align: center;
  font-size: 60px;
}
```
##結果
次のように表示されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256886/bee0b702-fcc1-d0aa-8d36-0ffe96029816.png)
ちなみに元画像はこちらです。
![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256886/92c703e8-ca66-c260-db39-6cfe40e02295.jpeg)

背景画像が文字の形に切り抜かれていますね。
chromeで見た時にベンダープレフィクスないと表示が上手くいきませんでしたが、比較的簡単に実装できました。
文字サイズをもっと大きくして、映える画像を用意していけばTOP画像代わりというのも出来そうです。
（この辺はデザインと要相談ですが）

また調べたところbackgroundでグラデーションかければ、文字にグラデーションかけることも可能なようです。
画像を使用せずに実装できるのは個人的にgood!!

「background-clip」は一昔前に出たプロパティですが、年々CSSで出来ることが広がっていて良いですね。今回は「text」だけに留めてしまいましたが、時間があれば「border-box」なども試してみたいと思います。
[Python] 例外処理について

Pythonにおける例外処理について簡単にまとめておく。

# 例外処理の基本
Pythonにおける例外処理は、```try-except```構文を使う。

```python:try-except
try:
    例外が発生する可能性がある処理
except:
    例外発生時の処理
```

```except```の部分は、```except <例外名> as 変数名```とも書け、例外情報を変数に取得することができる。
また、例外処理として必要に応じて以下の文を使用する。
■ **finally** : 例外の発生有無に関わらず必ず実行
■ **else** : 例外が発生しない場合に実行
■ **raise** : 故意に例外を発生させる 
■ **pass** : 例外発生時何もしない

# 実装例

```python
# 入力された名前のチェック
def validate_name(name):
    pattern = re.compile("[a-zA-Z]")
    if len(name) != len(re.findall(pattern, name)):
        # 例外を発生させる
        raise ValueError("名前に全角文字が含まれています。")

# 例外処理
try:
    validate_name("りょうta")
except ValueError as e:
    print(e)    # 名前に全角文字が含まれています。

```
JavaScriptの空配列をfalsyな値だと思っていた件

# はじめに
Reactで三項演算子の条件文に空配列を指定したら、ずーーーっとtrueとして実行されており、「ありゃっ」となったので調べました。

# 何がしたかったのか
- 配列の個数によって表示するものを切り替えたかった。
- 具体的には配列の個数が0個以上だったらBlogListコンポーネントにブログを渡し、ブログ一覧を表示する。0個の場合はブログが見つからないよーと表示させる

```typescript:Blog.tsx
{blogData.contents ? <BlogList blogData={blogData} /> : <p>ブログが見つかりませんでした</p>}
```

# 何が起きたのか
配列の個数が0個の場合でもブログが見つからないよーと表示されることなく、真っ白な状態であった。。。

__( ﾟдﾟ)...「What's happend?」__

# 調査開始
思いっきり下記に書いており、空配列はtrutyな値でした。
そりゃあ三項演算子の右側が実行されるわけありませんね。
- https://developer.mozilla.org/ja/docs/Glossary/Truthy

# 修正開始
- lengthプロパティを付与します。

```typescript:Blog.tsx
{blogData.contents.length ? <BlogList blogData={blogData} /> : <p>ブログが見つかりませんでした</p>}
```
これなら配列の要素数を元に真偽を導き出すことができるので、0個の場合は右側が実行されるようになりました。

# おわりに
そもそも配列をそのまま条件文に入れることが間違っていたかもしれません。

# 参考
https://developer.mozilla.org/ja/docs/Glossary/Truthy
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/length
埋め込み文章

if (message.content == "コマンド") {
        const embed = {
            embed: {
                title: "タイトル",
                description: "サブタイトル",
                color: 0xffff00,
                fields: [{
                    name: "内容１",
                    value: "内容２",
                    inline: false,
                }],
            },
        };
        message.channel.send(embed);
    }
CCIE 更新メモ(2021/12時点)

## CCIE 更新方法

### 認定サイクル
以前は、確か、認定条件がそろうと認定取得日＋2年されたのが、再認定日＋3年とのこと。
つまり、有効期限ぎりぎりに更新するのがお得になったようです。
> 以前）
> - 認定取得：2015年2月1日、有効期限：2017年2月1日
> - 再認定：2016年11月1日、有効期限：2019年2月1日
> - 再認定：2018年8月1日、有効期限：2021年2月1日

↓↓↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2241272/b1827fad-2d47-6d95-b742-415f7ede9033.png)


## 更新方法
- 試験合格か、継続教育（CEクレジット）、試験合格＋継続教育（CEクレジット）

| 試験合格で更新 | 試験合格＋継続教育（CEクレジット）で更新 |
|:--|--|
| ・エキスパートレベル筆記試験の1つに合格する<br>=CCDEの筆記試験（400-007）に合格※1<br><br>・エキスパートレベルラボ試験または実技試験の1つに合格する<br><br>・プロフェッショナル コンセントレーション試験の3つに合格する<br><br>・テクノロジーコア試験の1つに合格し、プロフェッショナル コンセントレーション試験の1つに合格する<br>(同じトラックの場合、CCNP 認定となります) | ・120 CE クレジットを獲得する<br><br>・テクノロジーコア試験の1つに合格し、40 CE クレジットを獲得する<br><br><br>・プロフェッショナル コンセントレーション試験の2つに合格し、40 CE クレジットを獲得する<br><br>・プロフェッショナル コンセントレーション試験の1つに合格し、80 CE クレジットを獲得する |

※1　以下ページより。https://job-it-blog.com/cert-20210606/
> “エキスパートレベル試験の1つに合格する”の意味はCCDE筆記試験を意味する
(更新条件が以前までのCCIE条件と違います！)

## 試験について


- エキスパートレベル筆記試験 = CCDE Written(400-007)
- プロフェッショナル コンセントレーション = CCNPのコンセントレーション
- テクノロジーコア試験　= CCNPのコア試験

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2241272/1848c187-b153-fdfb-29dd-9db6c1e75675.png)


- CCNP = テクノロジーコア試験 + プロフェッショナル コンセントレーションのため、同じトラックだと、CCIEの更新にはならないみたい
- CCIE のWritten試験はなくなったみたい

## 各試験の有効期限
- 3年らしい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2241272/c8aab04c-02bb-e7d6-19cd-6631a947f346.png)

https://www.trainocate.co.jp/reference/cisco/ciscotopics/cisco_faq.html

## CE クレジットについて
- ちらっと調べたら有料、英語のみが多め。
- 無料で出来るものもあるみたいだけど、今探した感じだと見つからなかった。
- 受験する方が手っ取り早そう？？

-----
## 参考URL
- 再認定ポリシー

https://www.cisco.com/c/ja_jp/training-events/training-certifications/recertification-policy.html

- 資格一覧

https://www.cisco.com/c/ja_jp/training-events/training-certifications/exams/current-list.html
【Next.js】useContextを使ってファイル間で値データを共有する

useContextを使ってファイル間で値データを共有します。

test.js

```JavaScript
import React from 'react';
import Test2 from './test2';

export const UserCount = React.createContext();

function  Test() {

  let count = 333;

  return (
    <div style={{ textAlign: 'center' }}>
      <h1>Test1</h1>
      <UserCount.Provider value={count}>
        <Test2/>
      </UserCount.Provider>
    </div>
  );
}

export default Test;

```



test2.js

```JavaScript
import {useContext} from 'react';
import { UserCount } from './test';

const Test2 = () => {

    const count = useContext(UserCount);

    return (
        <div>
            <p>Test2</p>
            {count}
        </div>
    )
}

export default Test2
```
###結果
![スクリーンショット 2021-12-14 15.04.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1942691/2429c574-1492-d953-51b7-b70955374d16.png)

test1.jsからtext2.jsへ、値を渡すことができました！

###参考にさせていただいたサイト様

https://reffect.co.jp/react/react-usecontext-understanding
[py2rb] 多重継承の２

# はじめに
移植やってます。
# 多重継承 (Python)
[[py2rb] 多重継承 - Qiita](https://qiita.com/superrino130/items/364d856e08cff0e501d3) 再び
![20211214a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/3fa34096-d7dc-4801-7615-51f37f17be14.png)

```python
class A(object):
    def myprint(self):
        print('A')

class B(A):
    def myprint(self):
        print('B')
        super().myprint()

class C(B):
    def myprint(self):
        print('C')
        super().myprint()

class D(A):
    def myprint(self):
        print('D')
        super().myprint()

class E(D, C):
    def myprint(self):
        print('E')
        super().myprint()

o = E()
o.myprint()

# E
# D
# C
# B
# A
```
`class E`が画像のオレンジ色クラスです。
左側からDFSで継承されています。
`class A`が上手いこと後ろに回っていますね。
# どうする？ (Ruby)
```ruby
class A
  def myprint
    puts 'A'
  end
end

class B < A
  def myprint
    puts 'B'
    super
  end
end

class C < B
  def myprint
    puts 'C'
    super
  end
end

class D < C
  def myprint
    puts 'D'
    super
  end
end

class E < D
  def myprint
    puts 'E'
    super
  end
end

p E.ancestors

# [E, D, C, B, A, Object, Kernel, BasicObject]
```
一つは、継承チェーンを考えて直列に並べる。

```ruby
module A
  def myprint
    puts 'A'
  end
end

class B
  include A
  def myprint
    puts 'B'
    super
  end
end

class C < B
  def myprint
    puts 'C'
    super
  end
end

module D
  include A
  def myprint
    puts 'D'
    super
  end
end

class E < C
  include D
  def myprint
    puts 'E'
    super
  end
end

p E.ancestors

[E, D, C, B, A, Object, Kernel, BasicObject]
```
ここでは見えませんが、`A`と`D`がモジュール化できそうなので`Mixin`する方法
# メモ
+ Python の 多重継承 を学習した
+ 道のりは遠そう
レコードの作成日が今日から何日目かを数式項目で表したい場合

Salesforceの数式項目の話です。

レコードの作成日が今日から何日目かを数式項目で表したい場合、
数式項目（数値）で以下の数式に設定します

TODAY()-DATEVALUE(CreatedDate)

設定画像は以下ご参照ください
![数式A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/521b079e-fdb1-935f-d124-57aeae7dc42a.png)