OmniAICreator/Qiita-1.07M huggingface dataset:
コマンドで、S3オブジェクトも削除する方法

### ●：AWSの画像データ

### 解決したいこと(内容の把握)

今まではデータベースリセット(rails db:migrate:reset)で、
保存したデータは全て削除できていた。
しかし、rails db:migrate:resetを行っても、AWSに保存した画像データは残る。

削除方法と、仕組みについて。

### 自力で調べた内容 & 立てた仮説

ローカル・本番環境ともに、データベース削除&再構成後にAWSを確認。
(rails db:migrate:reset)
S3のバケットには、画像オブジェクトが残っている。

**削除に関して**
バケット画面から、オブジェクトを選択し、削除は完了できた。

**仕組みに関して**
コマンド実行で画像を削除できないのは、Railsのデフォルトの機能外だから、と考えた。

作成したDB(ActiveStorageテーブル)から、
S3のバケットへの保存に変更する際、
ローカル、本番環境ともに、保存先を変更する記述をした。

つまり、削除も同様に手続きが必要だと考えられる。

調べてみると、[purgeメソッド](https://railsguides.jp/active_storage_overview.html#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B)を使用すると、ストレージサービスからも削除できる記述が見られる。
>消去すると、BLOBとファイルがストレージサービスから削除されます。

しかし、メソッドなので、コントローラー中での処理、
つまりdestoryアクションを呼び出したときに限られる。

コンソールでdb:dropした際、
S3のオブジェクトもろとも削除はできないのか？

### 上記を元に質問した結果
[AWSコマンドラインインターフェース](https://aws.amazon.com/jp/cli/)を入れると、可能なようだ。
Herokuコマンドを実行する際、heroku rails ~と接頭語をつけるように、
awsをつけてコマンドを打つ。

### 感想
今日はじめてAWSを触ったが、どうなっているのか？
わからない事だらけで、すごく気になった。
これはどうなんだ？という疑問が多すぎる。
個々を掘り下げる前に、
「S3概要」を公式ドキュメントなり、検索なりして
なんとな〜くでも、掴んだ方が良い気がした。
Cookie の簡単な削除方法

## 前提
`Google Chrome` で開発している

いっつも `Cookie` を削除するとき `chrome` も設定からやってたんだけど

[![Image from Gyazo](https://i.gyazo.com/b3b651d9368d7dbf6d3cd58f1add666d.png)](https://gyazo.com/b3b651d9368d7dbf6d3cd58f1add666d)

ここ押して
[![Image from Gyazo](https://i.gyazo.com/6b379af0fb7be045bf6bb2f5d5336d9f.png)](https://gyazo.com/6b379af0fb7be045bf6bb2f5d5336d9f)

この `Cookie` っていうの押して
[![Image from Gyazo](https://i.gyazo.com/0beccec5afe8019b5b366f9ce64d4ffa.png)](https://gyazo.com/0beccec5afe8019b5b366f9ce64d4ffa)

`Cookie` 選んで削除すればすぐできる
エラー：docker: no matching manifest for linux/arm64/v8 in the manifest list entries.


# Docker で mysql image pull した際にエラー
- 環境：Apple Silicon (m1 mac arm64)
- 解決策：docker-compose.ymlに追記


```
platform: linux/x86_64 # M1チップ対応のため追記
```

# 参考
https://ryotarch.com/docker/no-matching-manifest-for-linux-arm64-v8-on-m1-mac/
CSV ファイルを読み込んだら特殊文字がエスケープされた

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
スクレイピングで `seed` データをつくるための `CSV`ファイルを作成してある 

## 本題

`CSV`ファイルを `seed` データとしてインポート

内容は
[![Image from Gyazo](https://i.gyazo.com/f01e29bde5d533dd50e6860e25a8e169.png)](https://gyazo.com/f01e29bde5d533dd50e6860e25a8e169)

こんなかんじ。
`View` で表示したとききちんと改行されてほしかったので
`\n` の部分をうまいこと残してスクレイピングしておいた

で、DB に反映させて。
`View` で見てみる

すると

[![Image from Gyazo](https://i.gyazo.com/a44d602584e9a5530c3004fb1d64607a.png)](https://gyazo.com/a44d602584e9a5530c3004fb1d64607a)

なんか反映されてない

デバックツールでみてみると

[![Image from Gyazo](https://i.gyazo.com/365760bf0ed163a941043086d318b8fd.png)](https://gyazo.com/365760bf0ed163a941043086d318b8fd)

エスケープされとるー

インポートのしかたが悪かったのか。
とりあえずコントローラーでデバッグしてみても同じだったので

```
  def show
    @shinto.kamisama.gsub!(/\\n/, "\ｎ")
  end
```

こんなかんじで `gsub` メソッド使って置換

すると

[![Image from Gyazo](https://i.gyazo.com/339a4fa6725a056c9107db91ad2b4b29.png)](https://gyazo.com/339a4fa6725a056c9107db91ad2b4b29)

`\ｎ` が消滅した。
なんでやねん。。

仕方ないので

```
  def show
    @shinto.kamisama.gsub!(/\\n/, "<br/>")
  end
```

`br` タグで置換してみた。

すると

[![Image from Gyazo](https://i.gyazo.com/de41f197495ad93778b399ca486bf206.png)](https://gyazo.com/de41f197495ad93778b399ca486bf206)

置換はされてるけど認識されてない。

どうやら

https://www.javadrive.jp/rails/template/index7.html

タグは勝手にエスケープされちゃうみたい
なので `View` に

```
  strong 主祭神: 
  = binding.pry
  = @shinto.kamisama.html_safe
```

こんなかんじで `html_safe` をつけてやる
すると

[![Image from Gyazo](https://i.gyazo.com/f7acca3f72c9e9e1051a24819247590b.png)](https://gyazo.com/f7acca3f72c9e9e1051a24819247590b)

うまいこと反映された
このコンピュータには、.NET Framework4.6.1またはそれ以降の更新プログラムがすでにインストールされています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2176811/36d069a1-0413-f6f1-d961-3349db42bf04.png)

文字通りの原因なんだろうけど、解決に意外と苦戦。。。
ちなみにインスーラーはこれ
https://www.microsoft.com/ja-jp/download/details.aspx?id=49981


#これをインストールしようと思った経緯
visualstudio2015 professionalをインストールしようとおもったんだけど、うまく入らない。。
だからうまく導入されてる先輩のPCに環境を合わせようと思ったのと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2176811/b4a3feac-3355-6cb3-e611-4d56ee9faea1.png)
.NET Framework4.6.1を取得した次にパッケージをスキップするボタンが不活性になったこと。

#でも4.6.1以降のバージョンないんだけどなぁ。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2176811/190e14f1-8ec0-4e19-a702-cd53a9b2ff86.png)
##でも実はあった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2176811/24b991fe-c303-fe6e-127e-4023fa69154e.png)
ここの4.8にチェックがついている状態だったから外した。。
#しかし相変わらずエラーが出た。
念のため再起動も済ませてるのになぜ。。
ないとは思うけど一応ver4.6をアンインストールしてからまた試してみたが駄目だった。。
#どう解決したか
私の場合はVisual Studio2015Professionalのインストールを成功させることで、結果的に.NET Framework4.6.1がインストールされる形になった。
【Terraformer】panic: interface conversion: interface {} is nil, not stringの回避策

# 簡単に解説Terraformerとは
terraformerとは、既存リソースの情報をTerraformのコードにしてくれる優れものです！
既存リソースをterraform管理にしたいとなれば、```terraform import```が思いつきますが、各種リソースIDの取得であったり、resourceブロック内で```required```指定されている設定値の取得など少し辛い部分もあります。。

また、既存インフラを0からTerraform管理にするとなれば、多くのリソースをimportする必要があります。そんな時に使えるのが、**terraformer**です。

# 今回使用した環境
- Amazon Linuxであること（他のOSは検証できていません。）
- terraformer実行用のEC2インスタンスは適切な権限を持っていること

# インストール方法
この記事を見ている方は、エラーが起きた時に見ていることだと思うので詳しいことは割愛します。

```bash
export PROVIDER=aws
curl -LO https://github.com/GoogleCloudPlatform/terraformer/releases/download/$(curl -s https://api.github.com/repos/GoogleCloudPlatform/terraformer/releases/latest | grep tag_name | cut -d '"' -f 4)/terraformer-${PROVIDER}-linux-amd64
chmod +x terraformer-${PROVIDER}-linux-amd64
sudo mv terraformer-${PROVIDER}-linux-amd64 /usr/local/bin/terraformer
```

# 本題
[zenn](https://zenn.dev/sogaoh/articles/2019_05_05_00_20-from-qrunch#%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B%EF%BC%81)で解説が少しありましたが、大きな規模(どれくらいかはわかりません)のインフラを一気にインポートすると以下のようなエラーが起きます。

```bash
$ terraformer import aws --resources "*" --regions "ap-northeast-1"

panic: interface conversion: interface {} is nil, not string

goroutine 1 [running]:
# githubのurlが列挙される。
```

非プログラマーな私も当時、**panic**というエラーが出て、**リソース壊しちゃった!?**と冷や汗かきましたが、[Go言語のエラー](https://qiita.com/nayuneko/items/9534858156dfd50b43fb#panic%E3%81%A8%E3%81%AF%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E6%99%82%E3%81%AB%E8%B5%B7%E3%81%8D%E3%82%8B%E3%81%AE%E3%81%8B)のようでした。

# 回避策（importを分割する)
私は、以下の**シェルスクリプトもどき**を作って無事importすることに成功しました！

```terraformer.sh
#!/bin/bash
terraformer import aws list > ./resources.txt
while read resource
do
  terraformer import aws --resources $resource -regions "ap-northeast-1"
done < ./resources.txt
```

```bash
$ sh ./terraformer.sh
```
※-regionsの部分をベタ書きしちゃっていますが、ご愛嬌でお願いします。。。

# 終わりに
terrafomerで今回のようなエラー(panic)が出て、冷や汗かいている方の助けになれば幸いです！
手続き型からオブジェクト指向へ抜け出す９つのルール

<strong>まえがき１</strong>

https://www.oreilly.co.jp/books/9784873113890/

の内容を一部抜粋し、自分なりの解釈を加えたものです。

<strong>まえがき２</strong>

少々、極端な内容を含みます。

オブジェクト指向を有効に実践できることを保証するものではありませんし、むしろ不自然で非効率になる場合もあるので予めご注意ください。

### ①１メソッドにつきネストは１つまで
メソッドが担うべき仕事は１つであり、ネストが複数ある時点でそのメソッドが複数の責務を担っていることを示しています。

ネストは１つの処理単位であり、その単位でメソッドやクラスに抽出して部品化することこそがオブジェクト指向の根本の発想と言えます。

### ②else 句禁止
ガード節と早期リターン、またポリモーフィズムの使用を勧めます。

if ブロックの条件句を脳の stack に保存しておく必要がないため可読性が上がります。また、ロジックのかたまりを部品化するオブジェクト指向らしい設計へのよいガイドになりえるでしょう。

### ③すべてのプリミティブ型と文字列型を wrap する
プリミティブ型と文字列型を、そのままではなくオブジェクトとして扱うべきという指摘です。

そのオブジェクトに計算や加工のロジックを閉じ込めて扱うことがオブジェクト指向の基本のきです。

### ④ドットは１つまで
ここで言う「ドット」は、オブジェクトのネストを指します。

ドットが多数繋がっているとことは、すなわちオブジェクトの中に深く潜り込んでいることを意味します。

複文から単文構造への分解と同じ処理の重複を排除することを目的としています。ドット１つごとに説明変数や要約変数に落とすような工夫ができそうです。

### ⑤名前の省略禁止
（オブジェクト指向に限定しないような気もしますが。）

名前の省略（特に業務用語の省略）は保守性を落とします。

### ⑥すべてのエンティティを小さくすること
５０行を超えるクラス、１０を超えるクラスを内包するパッケージを作ってはいけません。

オブジェクト指向の真価はメソッド・クラスは小さく保っておけることです。長いメソッド、巨大なクラス、クラス数の多いパッケージは分割するチャンスと考えられます。

### ⑦１クラスにつきインスタンス変数は２つまで
インスタンス変数が増えれば増えるだけクラスの凝縮度は低くなります。

インスタンス変数とメソッドが密接に結びついたクラスは、目的が明確になります。逆にインスタンス変数が増えると、クラスの意図が不透明になるということです。

### ⑧ファーストクラスコレクションを使用すること
リストやマップなどのコレクションを wrap したクラスをファーストクラスコレクションと言います。

関連するデータとロジックを一つのオブジェクトに閉じ込めるのがオブジェクト指向の基本と言いました。コレクションに関しても同じことが言えます。

### ⑨getter、setter、プロパティを使用しないこと
他のクラスでこれらを使用すると、インスタンス変数の振る舞いが他のクラスへ染み出します。

値オブジェクトとして扱うことが理想です。
npmの資産を生かしてDenoで開発する

一時期「DenoではNode.js向けのライブラリが使えないのでは…」みたいな噂があったりしたのですが、[最近ではNode.js組み込みライブラリのPolyfillも進行しており](https://github.com/denoland/deno_std/commits/main/node)、Denoで使えるNode.jsライブラリが増えています。

というわけで、この記事では「Denoで使えるNode.jsライブラリ」を紹介していきたいと思います。

## ポート（移植）されたもの

人気ライブラリはNode.jsからDenoへポート（移植）されています。

#### lodash

lodashは配列操作等のユーティリティ系ライブラリです。

https://deno.land/x/lodash

#### koa

koaはexpressライクなルーティングライブラリです。

https://deno.land/x/oak

#### React・Next.js

Reactはフロントエンドフレームワークです。
Aleph.jsという名前で移植されました。

https://alephjs.org/

#### NanoJSX

軽量なJSXライブラリです。

https://nanojsx.github.io/

#### jsdom

HTMLをパースし、DOM操作するライブラリです。

https://deno.land/x/deno_dom

#### puppeteer

ブラウザを自動操作するためのライブラリです。

https://deno.land/x/puppeteer

#### dotenv

`.env`ファイルから環境変数を読み取り設定するライブラリです。

https://deno.land/x/dotenv

#### twind

CSSフレームワークです。

https://deno.land/x/twd

#### axios

PromiseベースのHTTPクライアントです。

https://deno.land/x/axiod

#### Go標準ライブラリ

Node.jsのライブラリではありませんが、Go標準ライブラリの一部はDeno標準ライブラリに移植されています。

https://deno.land/std

----

ここで紹介したのはほんの一例です。
Node.jsから移植されたライブラリは他にもたくさんあると思うので、見つけたらぜひコメント欄で紹介してください。


## CDN経由で利用できるもの

https://esm.sh/, https://www.skypack.dev/, https://unpkg.com/, https://jspm.org/ といったCDNからURLインポートすることで、Node.jsライブラリを利用することができます。

一部のライブラリを除けば、そのままimportするだけで動作します。

詳しくは[マニュアル](https://deno.land/manual/npm_nodejs/cdns)を参照してください。

#### Firebase

詳しくは「[deno deploy - Firebaseを使用してデータを永続化する](https://deno.com/deploy/docs/tutorial-firebase/)」を参照してください。

```ts
import firebase from "https://cdn.skypack.dev/firebase@8.7.0/app";
import "https://cdn.skypack.dev/firebase@8.7.0/auth";
import "https://cdn.skypack.dev/firebase@8.7.0/firestore";
```

#### marked

markedはマークダウン形式のテキストをHTMLに変換するライブラリです。

```ts
import marked from "https://esm.sh/marked@3.0.4";
console.log(marked("markdown text"));
```

#### spotify-web-api-ts

spotify-web-api-tsはspotify APIを呼び出すライブラリです。

```ts
import { SpotifyWebApi } from "https://esm.sh/spotify-web-api-ts";
const spotify = new SpotifyWebApi({
  accessToken: "<アクセストークン>",
});
const res = await spotify.player.getRecentlyPlayedTracks({ limit: 50 });
console.log(res)
```

---

ここでは自分が使ったことがあるライブラリに限って紹介しましたが、普通のライブラリなら普通に動作するはずです。

一部のライブラリはDenoで動作しないこともあります。主に以下の4つのパターンに分類できます。

1. ポリフィルが完了していないNode組み込みライブラリを使っている

    ポリフィルの進行状況はhttps://deno.land/std@0.113.0/node で見ることができます。ポリフィルが終わっていないNode組み込みライブラリに依存している場合は、動作しません。
1. FFIを利用している

    Node.jsのFFIとDenoのFFIは動作方法が異なるため、動作しない(はず)です。
1. `XMLHttpRequest`等の、Denoに存在しないグローバルオブジェクトを参照している

    自分でポリフィルを差し込むことで動作させることができます。（https://deno.land/x/xhr など）
1. `if (typeof window)`等でブラウザ向けの処理とサーバー向けの処理を分岐している
    サーバー向けの処理を実行してほしいにもかかわらず、ブラウザ向けの処理が実行されてしまうことがあります。こういう場合、できることはあまりありません。

## まとめ

昔はポリフィルも少なかったので「Denoでnpmのライブラリを使うのは難しい」とされていましたが、この1年半でCDNの対応も進み、充分使えるようになってきました。
結構お手軽にNode.js向けのライブラリが使えるので（`node_modules`不要！）、試してみてはいかがでしょうか。
shrine っていう名前のテーブルは作れない

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
管理者画面に `rails_admin` を使っている

## 本題

神社テーブルを作ろうと思って
`shrine` っていう名前で設計した。

実際の開発で `scaffold` で作成して
`rails_admin` の管理者画面で見ると以下のエラー

[![Image from Gyazo](https://i.gyazo.com/82c0ab517a95131a809696c1c1c9921b.png)](https://gyazo.com/82c0ab517a95131a809696c1c1c9921b)

クラス名やテーブル名が不整合おこしてるみたいなので
どっかでタイポしたのかとおもった

なのでブランチを切って再度トライ

しかしまた同じエラー

___

おそらく

https://qiita.com/fuku_tech/items/abbce671e7d882ec2f14

https://github.com/shrinerb/shrine

`shrine` っていう `gem` があるみたいでそれとコンフリクトしてしまっていた。
画像の保存系の `gem` みたいで
そういわれるとなんとなく納得できる

なのでテーブル名を変更したらうまくいった

なんかもやもやするからこの `gem` 使ってやろうかな
OpsRamp 監視エージェントのログ

# 概要

OpsRampの監視エージェントのログをデバッグモードに変更する方法をメモしておきます。


# Windows監視エージェント

### ログの出力先

OpsRampの監視エージェントのログは下記ファイルに出力されます。
隠しフォルダに出力されるので、フォルダの表示プロパティを変更しておきましょう。

```Powershell
C:\Program Files (x86)\OpsRamp\Agent\log\agent.log
```


### デバックモードの設定

設定ファイルをテキストエディタで開きます

```powershell
C:\Program Files (x86)\OpsRamp\Agent\conf\configuration.properties
```

"log_level"をデフォルトの"warn"から"debug"へ編集して、監視エージェントを再起動します。

```
[Main]
version = 10.0.0
statsd_port = 
ipc_port = 20450
install_alert = 0
installed_by = Administrator
installed_date = 11-05-2021 20:20:22
updated_date = 11-05-2021 20:20:22

[Log]
#log_level = warn
log_level = debug
log_directory = 
log_file_count = 5
log_file_size_mb = 2

[Proxy]
connection_type = Default_Type
proxy_server = null
proxy_port = null
proxy_proto = null
proxy_updatedb = 0

[Misc]
features = agent:RemoteCommand,agent:PatchManagement,agent:Automation,agent:RemoteConsole
device_details_call_freq = 10
config_sync = 0
asset_info_status = 1
dynamic_asset_timer_min = 
stale_data_time = 240
stale_alert_time_min = 4320
disable_disktop10alert = 0
plugin_enabled = 
uninstall_alert = 0
newapihost_alert = 0
newcnnode_alert = 0
custom_uuid = 
cloud_instance_type = VM
cloud_instance_id = 
enable_guaranteed_metricdelivery = 0
allow_withoutcertificate = 0
certificatefallback_alert = 0
aes_cipher_mode = AES/GCM/NoPadding
aes_keySize = 256
aes_tagLength = 128
self_monitor_timer_min = 0
auto_monitoring = 0
dashboard_enable = true
dashboard_timer = 30
offlineAlertstoThirdPartyTool = 0
app_definition_ts =
```


デバッグモードにしたままでもログの量は大したことないのでこのままにしておきます。


おわり。
user モデルが作成されたときに孫モデルまでビルド

以前の続き

https://qiita.com/TatsuyaIsamu/items/a97ae2d911a4e23016d0

ふわっとやりたかったことが形になったので頑張って言語化

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## やりたかったこと

`user` モデルが作成されたときに
`user` モデルに紐づく `ranking` モデルと
その子モデルの `ranking_item` モデルまで `build` する

こうすることで以下みたいになる
[![Image from Gyazo](https://i.gyazo.com/da48ab57b7a0362c9858b42c8e534d2c.png)](https://gyazo.com/da48ab57b7a0362c9858b42c8e534d2c)

テーブルをプロフィールとランキングとで分けることで
ユーザーとしては それぞれを独立した形で変更できる。

さらに神社ランキングにユニークなランキングアイテムをビルドしているので
神社ランキングっていう枠組みの中で神社ランキングアイテムを編集することになる。

要するに、1位の神社は1位の神社として編集ができる。


また、ユーザーの作成時にこれらをビルドしているので、
`new` アクションと `create` アクションが必要ない。

つまり、プロフィールやランキングを作成するっていう作業がなくなり
ユーザーとしてはそれぞれを編集するっていう作業がスタートになる

これをするにあたって前回に引き続き `devise` の設定をさわったので
以下コードの抜粋

```:registrations_controller.rb
  def create
    super
    a = resource.rankings.build(rank: 1)
    a.ranking_items.build.save
    b = resource.rankings.build(rank: 2)
    b.ranking_items.build.save
    c = resource.rankings.build(rank: 3)
    c.ranking_items.build.save
    resource.build_user_introduction
    resource.save
  end
```

`resource` に登録したユーザーが入っているので
ユーザーから `rankings` をビルドし 
`rankings` から `ranking_items` をビルドしている

こうすることでユーザーの作成時に
前回の `user_introduction` 含め 関連モデルを一気に生成できる

また、実は `ranking_items` には神社の外部キーが入るので
あらかじめ `build` する形だとエラーになってしまう

なので

```
ranking_item.rb

belongs_to :shinto, optional: true
```

`optional: true` をつけることでビルド時の `null` を許容
ファイルのマウント中に問題が発生しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2176811/60982869-49d3-a896-8b6e-bd17afbcc725.png)

isoファイルをマウントしようとしたらこんなエラーが。。。
調べてみるとこの解決法として、代わりに「ディスクイメージの書き込み」を選ぶとか
・USB メディア リーダー デバイスがコンピューターに接続されています。
・リムーバブル メディアはコンピューターにマウントされます。
・マウントしようとしている .iso ファイルは、スパース ファイルです。
上記の原因が1つ以上考えられるとかあるが私の場合はどれも当てはまらなかった。

#「ディスクイメージの書き込み」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2176811/b0fdbdca-bf3b-8778-9590-d99e8d3444d2.png)

まずそもそも選べるものがない。。
「ディスク イメージの書き込み 表示されない windows10」とかで検索するといろいろ出てきますが私の場合はうまくいかず、とりあえず次の作戦に。
ちなみに私が試したのは以下の方法

https://pc-karuma.net/allow-direct-access-in-remote-sessions-in-windows-10/#gpedit

#スパース ファイルかどうかの確認。
isoファイル右クリック＞プロパティ＞詳細＞属性
ここが「P」だとたしかスパースファイルっていうやつでどうもマウントできないらしい。。
私の場合はここは「A」

#結論
再起動かけて一発目にisoファイルをマウントをすると、、、
うまくいった、、、、
しかし
それ以降別のisoファイルをマウントをするとまた同じエラーが出ます。。
とりあえずその場しのぎ。。。
devise を使いながら user 作成時に関連モデルをビルドする

`user` モデルを作った
そして `user` モデルに `has_one` の `user_introduction` モデルを作った

自分的には `user` に `user_introduction` をネストさせておいて
作成時にビルドさせる形にしたい。

しかし `devise` をつかっているのでどうしようとなった


## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`


https://qiita.com/krile136/items/e04181bb9e9dc0f37a79

https://madogiwa0124.hatenablog.com/entry/2017/11/26/221657


このへん参考させていただいた。

どうするのかというと

① `user` と `user_introduction` をネスト
②自分の環境に `devise` のコントローラーをインストール
③ユーザーの新規作成時だけ自分のコントローラーを通るようにルーティング
④ `create` アクションのあとに作成したユーザーに `user_introduction` をビルド

という流れ

以下具体的なフロー

①　

```:user.rb
has_one :user_introduction, dependent: :destroy
accepts_nested_attributes_for :user_introduction
```

```:user_introduce.rb
belongs_to :user
```
上記のように
`user` で `user_introduction` をネストする

②
コンソール上で

```
rails g devise:controller users 
```
をする

`devise` 本体のコントローラーが自分の環境にインストールされる

その中の 
`registrations_controller.rb` を

```:registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]
  before_action :configure_account_update_params, only: [:update]

  def new
    super
  end

  def create
    super
  end

  def edit
    super
  end

  def update
    super
  end

  def destroy
    super
  end

  def cancel
    super
  end

 protected

  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute])
  end

  def configure_account_update_params
    devise_parameter_sanitizer.permit(:account_update, keys: [:attribute])
  end

  def after_sign_up_path_for(resource)
    super(resource)
  end

  def after_inactive_sign_up_path_for(resource)
    super(resource)
  end
end
```

となるようにコメントアウト

③
ルーティングは

```
devise_for :users, controllers: {
    registrations: 'users/registrations'
  }
```

とする。
こうすることで新規登録のときだけ自分の環境を通るようになる


④
上記のコントローラー内を

```
 def create
    super
    resource.build_user_introduction
    resource.save
  end
```

とする
`resource` っていうのに新しく作られるユーザーがはいってるから
それに対して `build_user_introduction` してやると
中身は空だけど `user_id` が紐付いた `user_introduction` が作られる


#### 追記

いろいろやったけどよくよく考えたら `user` の `create` でコールバックさせればいいらしい
たしかに
ネットワークエンジニアからクラウドエンジニアに転職した感想

# NWエンジニアからクラウドエンジニアに転職した感想

## クラウドエンジニアに転職して1年

　クラウドエンジニアに転職してちょうど1年経つので、
実際に感じたことを執筆しようと思います。

## 目的

　ネットワークエンジニアなどのインフラエンジニアで、
キャリアに悩んだりクラウドに興味がある人の参考程度にと。

## 転職するまでのスペック

・某携帯通信事業者に常駐して
　コアネットワークの設計・構築を約3年ほど

・保持していた資格
　旧CCNP
　Linuc-2
　基本情報技術者

## 転職しようと思ったキッカケ

・社内の人間と考えが合わなかった。

・ネットワークだけだと限界を感じていた。

・携帯通信事業にどうしても興味が持てなかった。

・インフラ全体を理解したかった。

。ベンチャー企業とやらに興味が沸いた。

## 転職活動について

・たまたまGreenで気になった企業があったので試しに1社に応募。

・落ちたらRaise Techさんで勉強してから転職しようと考えていた。

・試しに受けた会社に内定をすんなりもらったので、AWS未経験だけど入社。

## クラウドってどんな感じ？

・例えるなら、総合格闘技。
　総合格闘技のバックグラウンドが
　ボクシング、キックボクシング、レスリング、柔術など様々なように
　エンジニアのバックグラウンドが様々。
　NW屋、サーバー屋、アプリ屋などなど・・・

・インフラの繋がりを知れるので単純に楽しいし、
　知らない領域を知るキッカケになる。

・他の領域の詳しい人と話すことができるし、
　お互いの領域を教え教えられるような関係性ができる。


##　クラウドエンジニアになって学んだこと

・クラウドだけ頑張っても頭打ちになりそう。
　プラスアルファで何か生み出せないと差別化はできないと思う。

・インフラ知識の幅が広がった。

・自分のバックグラウンドの知識は生かせる。
　僕の場合は、お客さん環境とのVPNを構築することが多いので前職知識が役に立っている

・やはり人材不足

## 今後の展望

・web知識の向上

・英語の勉強

・AWS資格を全部取得したので、AWS初学者向けの投稿を増やす


## クラウドに興味がある方へ

・クラウド未経験でも募集しているところはたくさんあります。
　むしろクラウドしか触ったことないって人よりも
　何か専門性持っている人の方が僕は欲しいなって思います。

・転職活動するのは無料なので、とりあえず自分の市場価値を測るためにも
　やってみてはいかがかなと思います。
　転職活動してみて、やっぱり転職しないって選択肢も全然ありだと思っている派です。


自分を安売りしないことだけはしないようにしてください。
それでは！！！
NUXT MEMO


## NUXT MEMO


transitionフック

```
      @before-enter="beforeEnter"
      @enter="enter"
      @after-enter="afterEnter"
      @before-leave="beforeLeave"
      @leave="leave"
      @afterLeave="afterLeave"
```

transition css

```
表示
v-enter：開始状態
v-enter-active：トランジション中
v-enter-to：終了状態

非表示
v-leave：開始状態
v-leave-active：トランジション中
v-leave-to：終了状態

```
ルーティング member でネストする場合としない場合

きれいなルーティングで悩んだ

`ranking` テーブルがあって、その `ranking` テーブルの動的な ID を含む
`ranking_item` コントローラーへの URL を作りたかった

`ranking_item` を `member` で囲ってやるといい感じになった。

けどそれだと致命的にだめだったので備忘録


## 開発環境

`ruby 2.6.5`
`Ruby on Rails 5.2.5`

①member でネストしない場合

```
  resources:rankings do
    resources :ranking_items
  end
```
生成される URL は

[![Image from Gyazo](https://i.gyazo.com/424abd0f13fb85b1598b4d903e615b70.png)](https://gyazo.com/424abd0f13fb85b1598b4d903e615b70)

まあいいんだけどなんかなあってかんじ
外側の `rankings` のルーティングがいらないんだけどつくられちゃってる

② member でネストしてやる場合

```
  resources:rankings do
    member do
      resources :ranking_items
    end
  end
```

生成される URL は
[![Image from Gyazo](https://i.gyazo.com/d700ccb1b6e81589df88cbd0a7c412cf.png)](https://gyazo.com/d700ccb1b6e81589df88cbd0a7c412cf)

きれい。
外側の `ranking_item` に対してはルーティングが作られず、内側の `ranking_items` に対してだけルーティングが生成されている
いい感じ


しかしこれはだめ

 `:id` がおなじ。これだと `params` で `rankings` の動的な `id` をとりだせない。

___


基本的には上のケースだと①しかないのかと思う
`member` の使い方に関しては基本的な認識が間違っている気がする

本来は `ranking` に関しての `crud` 機能はいらなくて
ネストするだけにしたいのだけど。

ただ `namespace` とか `scope` 使うと 動的な `:ranking_id` が生成できない

`shallow` とか使ってもなんか微妙

いくら探してもいい感じのメソッドがないから
設計がそもそも間違っているさえある

難しい

#### 追記

以下のように

```
 resources :rankings, only: %i[] do
    resources :ranking_items
 end
```

外側の `resources` にだけ `only` の空配列を与えてやると

[![Image from Gyazo](https://i.gyazo.com/8b4aaa85219aa3e604579532369eb685.png)](https://gyazo.com/8b4aaa85219aa3e604579532369eb685)

ほしいルーティングだけ生成された。
これが今のとこの最適解かも
Wiresharkでインタフェースが認識されない不具合

#はじめに
CCNA学習のために実機演習を行い、LAN上に流れるパケットを「見える化」するためwiresharkを用いました。
しかし、ubuntuのデスクトップ版においてwiresharkでインタフェースが見つからないという不具合があったので、その不具合の解決策について書き残そうと思います。
#解決策
一般ユーザがwiresharkのグループが入っている必要があったので、グループに追加する。

```
sudo username -a -G wireshark [usernama]
sudo gpasswd -a wireshark [username]
```
グループに入っているかの確認方法

```
cat /etc/group | grep wireshark

wireshark:x:128:[username]　と出力されればOK!!
```


#参考
[apt-getでパッケージをinstall/uninstall/upgrade](http://kawatama.net/web/296)
[Ubuntuユーザ追加とsudo権限付与。ユーザ/グループ操作まとめ](https://www-creators.com/archives/241#Ubuntu)
フォロー機能での SystemStackError

フォロー機能
フォローを解除したときに解除できない
なんだ

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`



現象は解除した瞬間に
どっとクエリが流れたあとに

```
Traceback (most recent call last):
        2: from (irb):3
        1: from (irb):3:in `rescue in irb_binding'
SystemStackError (stack level too deep)
irb(main):004:0> quit
```

というエラー。無限ループになるとこれがでるらしい

___


`User` モデルと その中間モデルである `Relationship` モデルの両方に

```
dependent: :destroy
```

をいれていた。

どうやら両方にいれるとこういうエラーになるらしい
なんとなくふわっと納得

`Relationship` 側の `dependent: :destroy` を削除して解決
rails  で attr_acceccer を見ない理由


http://devtesting.jp/tddbc/?TDDBC%E5%A4%A7%E9%98%AA2.0%2F%E8%AA%B2%E9%A1%8C


上記の自販機演習でがっつりアクセサメソッドについて理解する

そこで１つ疑問がわいた

なぜ自分はこんなにもアクセサメソッドについて知らないのか


ただ冷静に考えて見ると当然なことだった

なぜなら `rails` をつかっていて
アクセサメソッドを使うことなんてなかったから。

ということで `rails` ではどうしてアクセサメソッド使わないでもいけるのかを調べた

___

https://qiita.com/Hassan/items/0e034a1d42b2335936e6

こちらの記事わかりやすくまとめていただいてあった

要するに

```
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :description

      t.timestamps null: false
    end
  end
end
```

こんなかんじのマイグレーションファイルがあって
そのテーブルに紐づくモデルを作成すると

```
class User
  attr_accessor :name, :description
end
```

こういう意味になるとのこと
つまりカラムに対してアクセサメソッドが紐づく状態になる

内部的にはアクセサメソッドが使われているってことかな

だからアクセサメソッドを定義しなくても

```
user = User.new(name: "aa")
user.name => "aa"
```

 インスタンスのプロパティを読み書きできる（上のコードは適当）
【Vue.js】メソッドイベントハンドラ

#はじめに
こんにちは！
今回は【Vue.js】メソッドイベントハンドラについてアウトプットしていきます！

#メソッドイベントハンドラとは
イベントハンドラは、イベントが発生したときに実際に呼ばれるメソッドのことです。クリックなどの動作と、処理を行うメソッドを結び付ける仕組みがイベントハンドラなのです。

今回はv-on属性の値に、イベントハンドラのメソッド名を書く方法について解説していきます。

#書き方・解説
```HTML:HTML
<div id="app">
  <p>
    {{ counter }}
  </p>
  <button v-on:click="clickHandler">
    Click!
  </button>
</div>
```
```Vue.js
 var app = new Vue({
   el: "#app",
   data: {
     counter: 0
   },
   methods: {
     clickHandler: function() {
       this.counter++
     }
   }
 })
```
カウント数を保持する`data`のプロパティ`counter`を記述。初期値は`0`。
イベントを発火させる`methods`オプションを用意し、今回メソッド名は`clickHandler`と定義。
中身の処理を`this.counter++`と記述。これによりクリックされた時に`counter`がインクリメントされる処理がかかれました。

<テンプレート側>
カウント数の表示部分`{{ counter }}`とボタン部分`Click!`を用意。
ボタン部分に`v-on:click="clickHandler"`と記述します。
※`="〇〇"`の部分には呼び起こしたいメソッド名を記述しましょう。
※引数がない場合は`()`はなくてもOK!
※引数がある場合は`()` をつけ引数を取得し、`console.log`で出力するなどが可能になります。

Click!ボタンを押してみると、

![スクリーンショット 2021-10-25 21.30.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/608bcbcc-65f8-c476-75af-67613632faca.png)

このようにインクリメントされます。


#まとめ
このように基本的には、前回の`インラインメソッドハンドラ`のような書き方はせず、`methods`オプションを定義し、テンプレート側はスッキリさせるような、お互いを分けて記述した方が読みやすく、メンテナンス性もよくなるので、分けて記述しましょう！

#最後に
今回はメソッドイベントハンドラについてアウトプットしました。
今回の記事を読んで質問、間違い等あればコメント等頂けると幸いです。

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

最後までご愛読ありがとうございました！
「複数の語句をまとめて置換する」を実務で使おう｜Power Query

https://qiita.com/tanuki_phoenix/items/94fb489726a42ad764b5

大変お世話になってる狸(@tanuki_phoenix )さんのこの置換記事の中身を
初心者向けに使い方を解説する内容になります
#使いたいコード
```text:置換
= List.Accumulate(
　　Table.ToRows(t_指示テーブル), //リストの各項目を用いた繰り返し処理。
    サンプルテキスト,　　　　　　　　//初項。最初のxはこれになる。
　  (x,y)=>Text.Replace(x,y{0},y{1})　//{0},{1}はリストの項目の取り出し方の記法。
 )
```
これをコード関連の知識なしで流用するのは難しいと思うので簡単に使っていく方法を説明します

##今回の変換対象
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/3d01b7ee-f482-d882-ed73-c40a54986551.png)
ありがちな、区切り全角(黄色)、入力がカタカナ(緑)、旧漢字を使用(オレンジ)みたいな
この辺りを置換を使って処理する流れをシンプルにお届けします

##置換に使う変換テーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/ce606045-2d5c-c98a-60af-329fba3b8224.png)
置換前に置換するためのテーブルをこのように作っておきます
・次の処理でこのテーブルの左から～番目の列という指定法になるため、列名は置換に影響を与えないので__好きに付けて良い__です
・2列を前提としてないので__C列に備考列を作っても動作__します
これをテーブルからで、「名前置換テーブル」という名前で取り込んでおきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/1e6ae9f9-1f88-5918-9fcc-3a9f5e1bfca6.png)
注) 図中のy{0}とy{1}はあとで出てくる指定している列位置です

ここで重要なのは置換テーブル側に__データの入れてない列(nullが入る所)があるとエラーが出る__ので、
・元のテーブルで入れないように管理する
・この取り込みのクエリ内でフィルタなどの削除処理をする
等で消しておきましょう

##変換対象を読み込んだあとの処理
カスタム列を選択し、下記内容をコピペしてそのまま処理します

```text:カスタム列で使用
List.Accumulate(Table.ToRows(名前置換テーブル),[名前],(x,y)=>Text.Replace(x,y{0},y{1}))

```

ここでは「社員名簿」というクエリ内で、
「名前置換テーブル」の結果を呼び出し、その中のデータを使って
[名前]列の各行を置換する処理をしています

「クエリのマージ」や「クエリの追加」で別のクエリのデータを使用しているのと同じ処理になります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/e44a5157-2ce7-2469-8950-89c8579ae25e.png)

#変換結果
見やすいように変換後の位置を変えて出力した物がこちらになります
目的の行の置換に成功していることが分かります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/be75b81b-929a-cc00-b74d-494c6f047725.png)
ここまでできたら
あとは変換テーブルを問題があったときに増やしていけば
コード側をいじらず処理していくことができます

今回の変換テーブルはブック内に置いておく必要は無いので
別ファイルで管理して取り込むなど、
使い方の幅も広いのでいろいろ使ってみてください

##備考
スペースだと見えにくいのでアスタリスクで表示しますが
「**」「＊*」「＊」「*」という感じに全角半角＋複数が混じっている場合は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415442/7de30cdc-2bb5-f861-e82c-80ff0a72f2f1.png)
上から順に処理されていくのを使って5行で全角→半角を行った後、6行目で
個数の調整をすれば「*」に統一することができます
Power BI 勉強会 夜の採れたて Ignite 2021 関連URLまとめ

## この文書は？
　[Power BI 勉強会 夜の採れたて Ignite 2021 \- connpass](https://powerbi.connpass.com/event/229170/)に参加していたのですが、読みきれないほどリンクが出てきたので、一旦自分用にまとめ。


## Microsoft Ignite 2021 関連リンク
[KEY05 - Microsoft Into Focus: Business Applications](https://myignite.microsoft.com/sessions/e0653380-203f-45f9-bfdb-a6c62b7fd2aa)
→有識者によるMicrosoft Dynamics365とMicrosoftPowerPlatformの2021年release wave2の新機能についてセッション

[BRK224 - Empower data backed decision making with Power BI, Power Automate and Azure Synapse Analytics](https://myignite.microsoft.com/sessions/26dceb94-694f-46aa-9ab6-8ae52c4eb903)
→マイクロソフトのシームレスなソリューションを使って、ビジネスのとめどなく深い洞察を解き放つ方法について学ぶ。

[OD165 - Big data analytics with Power BI](https://myignite.microsoft.com/sessions/ed95e114-c07b-4a8c-84bb-1635a5363c5b)
→PowerBIでビッグデータを分析するための各種トピックについて

- ハイブリッドテーブル：データセットを更新することなくリアルタイム機能を組み合わせた数十億行のデータセットで非常に高速なクエリパフォーマンスを実現。 
- Power BIの自動集計：使用パターンに基づいて集計キャッシュが自動的に作成および管理され、クエリのパフォーマンスが向上

[OD163 - Create compelling visual analytics experiences in your applications](https://myignite.microsoft.com/sessions/4842bddf-ebf6-4f81-9700-204fa490310a)
→Power BIEmbeddedとAzureApp Services関連。説得力のあるビジュアル分析が出来る。

[OD166 - Drive a data culture for your business on the secure foundation of the Azure cloud & Power BI](https://myignite.microsoft.com/sessions/2d753b67-9ded-4c36-a890-e451b5e7d8cc)
→データの管理と管理を支援する統合データガバナンスサービスとしてのPower BIとAzureの話。Power BIの新しいData loss preventionのネタもあるらしく（本イベントでも触れられていた）このあたりは企業で使うにはありがたい。

[OD410 - Data Governance and Auditing for Power BI](https://myignite.microsoft.com/sessions/2b20fec5-3ad0-430c-bcdf-ee7a82df062e)
→Power BI でのデータガバナンスと監査について。Power BI Sentinel serviceについても言及あり

[OD167 - Enable data insights for everyone with Power BI and Microsoft 365](https://myignite.microsoft.com/sessions/664040e6-cea9-476a-a147-1a048a000be1)
→Power BIを利用したTeamsとOffice365の統合について


## Docs関連

[Overview of process mining in process advisor (preview)  \- Power BI \| Microsoft Docs](https://docs.microsoft.com/en-us/power-automate/process-mining-overview?WT.mc_id=DP-MVP-5002429)
→プロセスマイニングの概要（具体的な手法は左側のメニューからたどること　※プレビュー版）

[Use Power Automate to update goals automatically \(preview\) \- Power BI \| Microsoft Docs](https://docs.microsoft.com/en-us/power-bi/create-reports/service-goals-power-automate)
→Power Automateを使用して、目標を自動的に更新する機能について（※プレビュー版）

[自動集計の概要 \- Power BI \| Microsoft Docs](https://docs.microsoft.com/ja-jp/power-bi/admin/aggregations-auto)


## その他

[Power BI プレイグラウンド](https://playground.powerbi.com/ja-jp/)
→Power BIの埋め込み分析について試したり学習したり出来る。
OpsRamp 監視エージェントの通信先を調査してみる

# 概要

OpsRampの監視エージェントをインストールすると、管理ポータルに監視対象が登録され監視が始まります。当たり前ですが、どこと通信して、情報が収集されているのか気になったので調べてみます。最近いろいろなSaaSのPoCをする機会が増えてきたのですが、日本リージョンにデータが保存されると説明されたが、パケットキャプチャするとUSのAWSに通信しているとか結構ありますので事前の確認は必須だと考えてます。

ついでに監視エージェントの負荷も簡単に調査してみます。



# 構成

VMware Workstation上にデプロイしたWindows Server 2022にOpsRampエージェントとWiresharkをインストールして、パケットキャプチャしてみます。

| ![2021-1106-2043-21.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/965f8346-0bb4-3709-34f3-2dc6fbd6bfb3.jpeg) |
| :-- |





# パケットキャプチャ

それではWiresharkを起動して、何もフィルタせずにキャプチャを開始してみましょう。
"199.250.248.18"と通信しているようです。

| ![2021-1106-2008-33.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/1c24e857-3290-098a-fa1d-e1f4f7261d92.jpeg) |
| :-- |


IPアドレスを検索するとOpsRampのIPであることが分かりました。（業務環境ではないのでUSリージョンで問題なし）
※変なとこに通信してなくて安心しました。

| ![2021-1106-2010-13.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/91be6854-5e66-a82a-36d6-6bc1d05d8747.jpeg) |
| :-- |



# 監視エージェントのプロセス

"199.250.248.18"と通信しているプロセスを調べるため、TCPViewを起動してみます。
"opsramp-agent.exe"が2つ起動していて、下の方がESTABLISHEDになっていることが分かりました。

| ![2021-1106-2018-58.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/8fb46a2f-f91f-106f-d7db-e506fd05d9f9.jpeg) |
| :-- |



次に"opsramp-agent.exe"の詳細を調べるため、Process Explorerを起動します。

| ![2021-1106-2021-15.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/322c0e58-202f-1613-3616-779fde00bf27.jpeg) |
| :-- |


プロセス名をダブルクリックするとプロセスの詳細が表示されて、バージョンやインストール情報が確認できます。

| ![2021-1106-2021-47.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/4718d3bf-c497-5592-3323-b167d9f38c5b.jpeg) |
| :-- |


Performanceタブで負荷状況が確認できます。
メモリもCPUも消費量は少ない事が分かりました。（監視期間が長くなるとどうなるか未確認）

| ![2021-1106-2022-17.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/eff9c8da-03b7-234f-744e-be60b3f4b1bd.jpeg) |
| :-- |



Process Exploerで"opsramp-shield.exe"が表示されていたと思います。これは"opsramp-agent.exe"の稼働監視プロセスで、"opsramp-agent.exe"がdownすると自動修復してくれます。

| ![2021-1106-2023-38.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/1ec767c0-bd97-0115-0caa-49eaeafdc496.jpeg) |
| :-- |


こちらもCPU・メモリの消費量は少なめ。

| ![2021-1106-2023-47.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/df214614-1356-9f73-2ccd-003cbd029325.jpeg) |
| :-- |



下図のタスクマネージャは、OpsRampのリモートコンソールで遠隔からGUI操作している際のトラフィックです。
画質は粗くてトラフィック量は少なめ。運用監視での利用を考えると十分。

| ![2021-1106-2032-10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333529/fa20c661-da7a-7ee1-5725-74f30cad246e.jpeg) |
| :-- |






おわり。
Tensorflowでnumpyの挙動をさせる

# はじめに

※この記事の内容はTensorflow 2.5以上が対象です(2.4だと`np_config`や`enable_numpy_behavior`が存在しないためです)。

____

Tensorflowで演算処理をするとき、通常では以下のような書き方はできません:

```python
import tensorflow as tf

x = tf.convert_to_tensor([[1, 2, 3], [4, 5, 6]], dtype=tf.float32)

# こういう計算をしたい
mm = x.max(axis=0).mean()
```

```shell
AttributeError: 'tensorflow.python.framework.ops.EagerTensor' object has no attribute 'max'
```

だったり、

```python
# np.chooseやnp.takeの挙動をさせたい(fancy indexingをさせたい)
collect = x[:,[2,0,1]]
```

```shell
TypeError: Only integers, slices (`:`), ellipsis (`...`), tf.newaxis (`None`) and scalar tf.int32/tf.int64 tensors are valid indices, got [2, 0, 1]
```

つまり、numpyで使える書き方ができません。jaxやpytorchではできますが、tensorflowでは対応していないのです。tensorflowが時々使いにくいとかコメントされているのは、こういう所もあるかもしれませんね。

ただ、一応tensorflowでもnumpyのような挙動をさせる手法はあります

# numpyの挙動をさせる
簡単です。2行で終わります。

```python
from tensorflow.python.ops.numpy_ops import np_config
np_config.enable_numpy_behavior()

# or
from tensorflow.experimental.numpy import enable_numpy_behavior
enable_numpy_behavior()

```

```python
# ok
mm = x.max(axis=0).mean()

# これもok(中身はtf.gatherがやってる)
x[:,[2,0,1]]
```

## できるようになること
- fancy indexingが使えるようになる
- 次のmethodが使えるようになる
    - `T`, `transpose`
    - `ndim`
    - `size`
    - `tolist`
    - `reshape`
    - `ravel`
    - `clip`
    - `astype`
    - `max`
    - `mean`
    - `min`
    - `data`

## できないこと
上記以外(例えば、`tf.Tensor.sum`など)は使えない。
参照: `tensorflow/python/ops/numpy_ops.py`

# 注意点
`np_config.enable_numpy_behavior()`は**tensorflowを遅くします**。有効にするだけでもです。
おそらくfancy indexingの設定(`ops.enable_numpy_style_slicing`)かなとは思ってますが、学習で使ったりすると結構時間に差が出てきます。
別にfancy indexingを使わないのであれば、次の関数にして`tf.Tensor`にmethodだけ追加しておけばokです。~~なんだったら自分で`setattr(ops.Tensor, "関数名")`を入れて無理やり追加しちゃってもいい~~

```python
from tensorflow.python.ops.numpy_ops import enable_numpy_methods_on_tensor
enable_numpy_methods_on_tensor()
```

どうしてもfancy indexingを使いたい場合は、おとなしく`tf.gather`か`tf.gather_nd`を使うしかなさそうです。

# おまけ
numpyの関数の名前でtensorflowを使うときは、`tf.experimental.numpy`をimportすることでできます。内部的にはtensorflowの関数の名前を変えたようなものです。
https://www.tensorflow.org/api_docs/python/tf/experimental/numpy

```python
import tf.experimental.numpy as tnp # これをimport
from tensorflow.python.ops.numpy_ops import enable_numpy_methods_on_tensor
enable_numpy_methods_on_tensor()

x = tnp.array([[1, 2, 3], [4, 5, 6]], dtype=tnp.float32)
print(x.max(axis=0).mean())
```

そろそろ`experimental`は外しても良いような…
Flutter製のiOSアプリでApple Watchを連携する際にハマったこと

Flutter製のiOSアプリでApple Watchを連携する際にいろいろハマった点があったのでメモに残しておきます。

# 環境

- Flutter 2.5.2
- Xcode 13.0

## 基本的な手順
- XcodeのiOSプロジェクトにWatchのターゲットを追加
    - プロフェクトフォルダ内/ios/Runner.wcworkspaceをXcodeで開く
    - File>New>Target>WatcOS>Watch App for iOS App
    - 任意のプロジェクト名(ここの記事では**watch**とする）をつけて作成
- bitcodeをYESに変更
- iOSとWatchOSのバージョン番号を一致させる
- Flutter Method ChannelでFlutterとSwift間のデータのやり取りを実装

詳細は[こちらの記事](https://medium.com/kbtg-life/adding-apple-watch-to-flutter-app-via-flutter-method-channel-f1443532d94e)を参照ください。画像もありとてもわかり易いです。

## 参考記事には書いてないが対応が必要だったこと

### watchフォルダにInfo.plistを作成してそれを利用するように設定する

- Info.plistファイルを追加
    - watchフォルダを右クリック>New File...>watchOS>Property File
    - Targetのチェックボックスはすべて解除する
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75348/766f0c0a-4298-8bf4-97bd-3d3b8c3a7ac5.png)

- TARGETS>watch>Infoにもともとある設定を作成したInfo.plistに追加（コピペできる）

- watchのターゲット>Build Settings>Info.plist Fileの項目に追加したInfo.plistのパスを記述
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75348/b6ffb61d-443a-8c68-e08b-a7c5f9e1c53f.png)


### **Supported PlatformをwatchOSに変更**

- TARGETSのwatch, watch WatchKit ExtensionともにwatchOSに変更する

以上でエラーなくビルドが通ると思います。

# ハマった点

## 何度ビルドしてもWatchにアプリがインストールされない
- iOSのアプリを削除してからビルドするとインストールされる

## XcodeからはビルドできるがVSCodeからビルドできない
- フォルダ内にinfo.plistを作成。Buil settingsのinfo.plist fileにパスを記述して解決。

Flutter側からはInfo.plistのWKCompanionAppBundleIdentifierの設定を見てwatchアプリがあるかどうかを確認してる。今のXcodeだとwatchのターゲット追加したときにInfo.plistが生成されない模様。

[[flutter_tools] fix build for projects with watchOS companion app by tauu · Pull Request #51126 · flutter/flutter](https://github.com/flutter/flutter/pull/51126)


## アーカイブでエラーが出る
- Supported PlatformsがiOSになっていたのをwatchOSに変更して解決。
    
    [target specifies product type 'com.apple.product-type.watchkit2-extension', but there's no such product type for the 'iphonesimulator' platform](https://stackoverflow.com/questions/31632660/target-specifies-product-type-com-apple-product-type-watchkit2-extension-but)
    

## multiple commands produce…というエラー
- 追加したInfo.plistのTarget Membershipにチェックされてるのであれば全部外して解決。

## Could not run build/ios/iphoneos/Runner.app on …というエラー
- VSCode, Xcodeを再起動、flutter cleanで解決。
Vue.jsで掲示板を作ってみよう　vol.3『firebaseをデプロイ』

```:nuxt.config
export default {
  // Disable server-side rendering: https://go.nuxtjs.dev/ssr-mode
  ssr: false,
  mode:"spa",　　　　　＜＝(これをついか)
```
```
 npm init -y
Wrote to pj/board-app/package.json:
```

Firebaseの公式サイトからプロジェクトの作成をしますが、『Vue.jsで掲示板を作ってみよう　vol.２』にとりくんだ方はパスして大丈夫です、もうすでにできているので！
もしやっていなければ＝＞https://qiita.com/MUSASHI-programing/private/6d20e32d2807c16aef33

デプロイの準備をしていきます！

```
npm install --save firebase
 
npm install -g firebase-tools

firebase login
```
初めてのログインでしたら、アカウントを選択し、「許可」をクリックしてください。

Success!

が出たらOKです。


次にプロジェクトをFirebaseプロジェクトとして初期化します。

```
firebase init
```
```
このように選択しましょう
? Which Firebase CLI features do you want to set up for this folder? Press Space to select features, then Enter to confirm your choices. ＝＞Hosting: Configure and deploy Firebase Hosting sites

? Please select an option: ＝＞Use an existing project
? Select a default Firebase project for this directory: ＝＞qiita-board (あなたが作ったアプリを選択)
? What do you want to use as your public directory? public
? Configure as a single-page app (rewrite all urls to /index.html)? Yes
? Set up automatic builds and deploys with GitHub? No
```
ここでpublicフォルダができました、publicのindex_htmlを削除します。

次に

```
yarn generate
```

するとdistというファイルができるので、publicのフォルダを消して、distの名前をpublicに変えてください。

publicのindex_htmlの<body>の直前に下のものをはりつけます。

![スクリーンショット 2021-02-20 15.59.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129553/29116911-6416-b679-2036-95c56e2f4b4b.png)



ようやくここまできましたデプロイしましょう！
vol.2をしたひとはfirebase deployで　Deploy complete!　が出るとURLが発行されます！

```
firebase deploy
```
vol.2をしていない人はfirebaseでアプリの登録をしなくてはいけません
今しても遅くないですよ！
＝＞https://qiita.com/MUSASHI-programing/private/6d20e32d2807c16aef33


参考記事
https://qiita.com/hiroki-harada/items/ca22ac177db68e3c3796
Vue.jsで掲示板を作ってみよう　vol.2『firebaseとvueファイルの紐付け』

今回も頑張りましょう！

```:ターミナル
npm install --save firebase
```
plaginsの中に「firebase.js」というファイルを作る。
下のコードを入れる。

```
import firebase from "firebase";
if(!firebase.apps.length){
    firebase.initializeApp({

})
}

export default firebase;
```

次はgoogleにうつります。
googlefirebaseと検索し開きます。
まず、プロジェクトを作成する！!
![スクリーンショット 2021-02-20 15.22.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129553/a4822dd2-4a80-2d87-0996-f35f8c3762fa.png)
![スクリーンショット 2021-02-20 15.22.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129553/b9a77ab2-1be6-227f-3c25-447b414101ec.png)
![スクリーンショット 2021-02-20 15.23.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129553/19486366-24f6-875d-b753-bf9ede378686.png)
↓この画面をここではホームと呼ばせていただきます。お願いします。
![スクリーンショット 2021-02-20 15.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129553/acfddb7c-c57d-7f53-d3bf-a0f6443dc207.png)
ホームの</>(ウェブ)ボタンを押します。
ここではboardと名付けます
hostingのチェックはつけません
![スクリーンショット 2021-02-20 15.25.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129553/c7fe43c3-b472-abd0-9b95-68548d754713.png)
ここはスルーしてコンソールに進みましょう
![スクリーンショット 2021-02-20 15.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129553/695377a5-3c2f-2a1b-7f2e-19d027cd4d13.png)
ホームに戻ると思うので、次はホームからCloud Firestoreを開きます。

今後board（project名）のCloud firestoreにこれから作る掲示板のコメントを保存し、取得・追加・更新・削除をおこないます
![スクリーンショット 2021-02-20 15.27.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129553/90b9298e-47dc-2956-5d1f-ddbe13be93cd.png)
![スクリーンショット 2021-02-20 15.28.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129553/7f1c7997-6c83-7f4c-9ce0-a81e8ec040cb.png)
![スクリーンショット 2021-02-20 15.28.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129553/02d863e1-a814-3a36-19d7-229ef3206a20.png)
有効にするで完了です。

次に、権限を有効にします。
ホームからCloudfirestoreにいき、ルールを押します。
ルールの編集で下のようにfalseをtrueに変えて、公開にします。

```
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
```

最後に、最初に作ったplaginsの中の「firebase.js」というファイルに,
プロジェクト設定＞全般（下にスクロール）のapikeyからmeasurementIdをコピペします。
![スクリーンショット 2021-02-20 15.59.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129553/143ad30b-3e6c-f4ad-e8be-a8474c14eae9.png)

```
import firebase from "firebase";
if(!firebase.apps.length){
    firebase.initializeApp({
    apiKey: 
    authDomain: 
    projectId: 
    storageBucket: 
    messagingSenderId:
    appId: 
    measurementId:
})
}

export default firebase;
```

紐付け作業はここまでになります！
次は、データの取得・追加・更新・削除を行ってください
![スクリーンショット 2021-02-20 20.24.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129553/5a9006e2-9c18-da4c-3035-ff3a4e1ba17b.png)
こんな感じの仕上がりが目標です。
私が勉強したサイトは↓
https://www.wakuwakubank.com/posts/723-firebase-firestore-query/

わかりやすいので作れると思います、頑張ってください！
Vue.jsで掲示板を作ってみよう　vol.1 『Hello vueと表示させてみよう』

こんにちは、これから頑張りましょう!


```
yarn create nuxt-app [プロジェクト名]
（私は　yarn create nuxt-app board-app でしています）
```
下のように選択してください

```
create-nuxt-app v3.5.2
✨  Generating Nuxt.js project in board-app
? Project name: board-app
? Programming language: JavaScript
? Package manager: Yarn
? UI framework: Vuetify.js
? Nuxt.js modules: (Press <space> to select, <a> to toggle all, <i> to invert se
lection)
? Linting tools: (Press <space> to select, <a> to toggle all, <i> to invert sele
ction)
? Testing framework: Jest
? Rendering mode: Single Page App
? Deployment target: Static (Static/JAMStack hosting)
? Development tools: jsconfig.json (Recommended for VS Code if you're not using 
typescript)
? Continuous integration: None
? Version control system: Git
```
```
cd　 [プロジェクト名]
board-appに移動します
```
```
yarn dev
これで実行します
```
```
 Nuxt @ v2.15.1                            
   │                                       │
   │   ▸ Environment: development          │
   │   ▸ Rendering:   client-side          │
   │   ▸ Target:      static               │
   │                                       │
   │   Listening: http://localhost:3000/   
```
http://localhost:3000/ を開くと　board-appの pagesのindex.vueが表示されています。
index.vueの中身を全て消して下のコードをコピペしてください。

```
<template>
  <div>
　　　<p>{{ message }}</p>
　</div>
</template>

<script>
export default {
  data: function() {
    return {
      message: "Hello Vue!"
　　　};
  },
  methods: {},
  computed: {}
};
</script>
```

次にnuxt_config.jsの dark:true を　falseにして画面を明るくします

```
  vuetify: {
    customVariables: ['~/assets/variables.scss'],
    theme: {
      dark: false,
      themes: {
        dark: {
          primary: colors.blue.darken2,
          accent: colors.grey.darken3,
          secondary: colors.amber.darken3,
          info: colors.teal.lighten1,
　　　　　　：
```

この地点でこの画面になっていれば大丈夫です！
![スクリーンショット 2021-02-20 13.39.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129553/b42be7de-2cc3-5a3c-2995-ed4a1004ed7a.png)
ローカル環境にEC2のファイルやディレクトリをダウンロードしたい



#環境
windows
コマンドライン利用
teraterm利用

#準備
・EC2起動

以下をコピー
・秘密鍵
・IPアドレス
・欲しいファイルの絶対パス(find / -name ファイル名　で探せる)
・ローカル環境のパス（送るディレクトリでshift右クリックでメニューから見れる）

#実行

ターミナルで以下のコマンドを実行（内容は適宜変更）

```txt:適宜変更してほしい部分のフォーマット→（入力してほしい内容(一例)）
scp -i "（EC2の秘密鍵(C:\hoge\hoge.pem　的な)）" -r ec2-user@（EC2のパブリックIP(111.111.111.111　的な)）:（EC2上にある送りたいファイルの絶対パス(/hoge/hoge.txt　的な） "（送り先のローカル環境の絶対パス(C:\hoges\　的な)）"
```

```txt:これ出たらyesと入力してEnter押してください（文字でないので注意）
The authenticity of host '111.111.111.111　(111.111.111.111)' can't be established.
ECDSA key fingerprint is SHA256:---------------------------------.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
```
```txt:するとこんなのが出ます
Warning: Permanently added '54.65.121.137' (ECDSA) to the list of known hosts.
```
以上です
C# スレッド ステルス化 NtSetInformationThread

本日の内容は耐解析性を高めるスレッドのステルス化についてです。

ステルス化とは該当のスレッドをデバッガから解析できないようにすることです。
耐解析性を高める手法として有効です。
(ソフトウェアの動的解析回避として)

「ntdll」の「NtSetInformationThread」という関数を使います。
該当のスレッドに対して「0x11 = 17」を渡すことでステルス化が成功します。

（このスレッドのステルス化はMicrosoftの公式ページにはあまり詳細が載っていない内容です。）

## ソースコード

Mainスレッドをステルス化し、ブレークポイントを貼れないようにします。

「NtSetInformationThread」以降の処理はブレーク不可で、
タイマー処理もブレークポイントを貼っても停止しません。


```c#
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace StealthThreadPrj
{
    public partial class Form1 : Form
    {
        enum NTSTATUS
        {
            STATUS_SUCCESS = 0,
            STATUS_INFO_LENGTH_MISMATCH = 4,
        }

        enum THREADINFOCLASS
        {
            ThreadHideFromDebugger = 0x11,
        }

        [DllImport("ntdll.dll")]
        public static extern ulong NtSetInformationThread(
          IntPtr ThreadHandle, int ThreadInformationClass,
          IntPtr ThreadInformation, ulong ThreadInformationLength);

        [DllImport("kernel32.dll")]
        public static extern IntPtr GetCurrentThread();

        public Form1()
        {
            InitializeComponent();

            ulong status;

            // 現在のスレッドを取得する
            IntPtr curThread = GetCurrentThread();

            // ステルス化の実施
            status = NtSetInformationThread(curThread, (int)THREADINFOCLASS.ThreadHideFromDebugger, IntPtr.Zero, 0);

            // 以降はブレークポイントを貼っても止まらない
            if(status == (int)NTSTATUS.STATUS_SUCCESS)
            {
                Console.WriteLine("Stealth Thread Success : 0x{0:x}", status);
            }
            else
            {
                Console.WriteLine("Stealth Thread Fail : 0x{0:x}", status);
            }
            
            // Break貼っても止まらない
            for(int i=0; i < 3; i++)
            {
                Console.WriteLine(i);
            }

            timer1.Interval = 1000;
            timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            // ここにもBreak貼っても止まらない
            Console.WriteLine("Hello");
        }
    }
}

```

## 参考

* [NtSetInformationThread function (ntifs.h)
](https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-ntsetinformationthread)

* [THREADINFOCLASS (スレッドのステータス設定)](https://www.geoffchappell.com/studies/windows/km/ntoskrnl/api/ps/psquery/class.htm)

* [NTSTATUS (NtSetInformationThreadの戻り値)](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/596a1078-e883-4972-9bbc-49e60bebca55)


## 更新履歴

* 2021/11/06 初版
RustのMutexのようにlockしないとデータにアクセスできないクラスをC++で実装してみた

#概要

c++でデータの排他制御をmutexで行う場合に忘れがちなmutexロックをrustのmutexっぽく使えるようにしてみました

mutexとデータを合わせて定義する事によりデータは隠蔽された状態となります。
mutexのlock時にスマートポインタを取得でき、このスマートポインタを介してデータアクセスできるようになります、
スマートポインタ解放時には自動でmutexはunlockされます

#ソース

https://github.com/ma0001/MutexGuard

#使い方

テンプレートMutexGuardの第一引数にデータの型、第二引数でmutexの型を指定します、省略時はstd::mutexが使われます。
auto_lock()でmutexをlockしてデータのスマートポインタを取得します。
*, -> 演算子でデータへアクセス
try_auto_lock()を使ってロックの取得を試みることも可能、またstd::timed_mutexやstd::recursive_timed_mutexを使えば try_auto_lock_for()やtry_auto_lock_until()でタイムアウト指定もできます。

```C++
#include <complex>
#include <cassert>
#include "MutexGuard.hpp"

MutexGuard<int>   a {0};
MutexGuard<std::complex<float>, std::recursive_timed_mutex> c{{1.0f, 2.0f}};

{
    auto p = a.auto_lock();
    (*p)++;
}
assert(*a.auto_lock() == 1);

{
    auto p = c.try_auto_lock_for(std::chrono::seconds(1));
    if(p) {
        p->real(4.0);
        p->imag(1.0);
    }
}
auto d = *c.auto_lock();
assert(d.real() == 4.0);
assert(d.imag() == 1.0);


```
EC2データベースマイグレーションできない

##やろうとしたこと
ec2上でphp artisan migrateを実行してデータベースマイグレーションしようとを思ったらハマってしまったのでメモしておきます。
##エラー内容
```
$ php artisan migrate

**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > yes


In Connection.php line 669:
                                                                                                            
  SQLSTATE[HY000] [2002] Connection timed out (SQL: select * from information_schema.tables where table_sc  
  hema = larans and table_name = migrations and table_type = 'BASE TABLE')                                  
                                                                                                            

In Connector.php line 70:
                                               
  SQLSTATE[HY000] [2002] Connection timed out
```
データベースに接続できなくてタイムアウトしてしまいました。
##原因
インバウンドルールでEC2インスタンスで使用しているセキュリティグループではなかったためでした。
##対策
1. RDSのセキュリティからVPCセキュリティグループを選択。
2. 次にインバウンドルールからインバウンドのルールを編集を選択。
3. ソースにEC2インスタンスで使用しているセキュリティグループを設定

![スクリーンショット 2021-11-06 19.54.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712442/0e26fd7f-8c78-0f01-8b1e-3ab37e31263e.png)


##＜考察＞　なぜインバウンドルールをセキュリティグループにするのか
ec2からrdsに接続するためec2のセキュリティグループをインバウンドルールで許可し、ec2からの接続を可能にするためだと思います。
##参考
https://noumenon-th.net/programming/2020/04/10/ec2-rds-laravel/