OmniAICreator/Qiita-1.07M huggingface dataset:
[Solidity] バージョン0.7.0のProxy contract

## はじめに

備忘録です。

詳しい説明などは以下記事か「**アップグレード可能なsolidityコード**」で検索。

Solidityの[ダイヤモンドスタンダード](https://eips.ethereum.org/EIPS/eip-2535)の提案にもっと詳しい説明もあります。

- [Solidity コントラクトの更新(update/upgrade) Proxy Contract](https://qiita.com/ryu3/items/d3519d919b3c01a759ae)
- [Solidityを用いてアップグレード可能なコントラクトを作成する](https://fukutech.hatenablog.com/entry/upgradeability-contract)

## コード

```solidity:Proxy.sol
pragma solidity ^0.7.0;

contract Proxy {
  address public implementation;

  function upgradeTo(address _address) public {
    implementation = _address;
  }

  // fallback function
  fallback () payable external {
    address _impl = implementation;
    require(_impl != address(0));

    assembly {
      let ptr := mload(0x40)
      calldatacopy(ptr, 0, calldatasize())
      let result := delegatecall(gas(), _impl, ptr, calldatasize(), 0, 0)
      let size := returndatasize()
      returndatacopy(ptr, 0, size)

      switch result
      case 0 { revert(ptr, size) }
      default { return(ptr, size) }
    }
  }
}
```

## 変わったところ

- fallback関数の表記方法が無名関数から`fallback()`になった
- `assembly`内のYulコードの以下が関数となり`()`が必要になった。
    - `gas` -> `gas()`
    - `calldatasize` -> `calldatasize()`
    - `returndatasize` -> `returndatasize()`

## 参考

- [ERC1538: Transparent Contract Standard](https://github.com/ethereum/EIPs/issues/1538)
- [Yul](https://solidity.readthedocs.io/en/v0.7.0/yul.html#yul)
Javascriptでボタンのクリックを待ち受ける方法

ボタンが押されるまで待ち受けて、押されたボタンの種類を返す処理

```javascript
waitForClick() {
  return new Promise((resolve, reject) => {
    document.getElementById('button1').onclick = () => resolve('button1');
    document.getElementById('button2').onclick = () => resolve('button2');
  });
}

const result = await waitForClick();

```
AWS Lambdaも満足に書けないインフラエンジニアがAWS認定DevOpsエンジニアプロフェッショナル (DOP)を受験して合格してみた


AWS Lambdaも満足に書けないインフラエンジニアの身でありながら
AWS認定DevOpsエンジニアプロフェッショナルを受験して合格したので
勉強方法をまとめてみます。

# 受験した人
・AWS歴4年半
・インフラエンジニアではあるが、AWS CLIも満足につかえず基本的にマネジメントコンソール でぽちぽちしている
・AWS CLIも使えないので当然、AWS Lambdaなんて書けるわけもない。
・業務においてAWSにて本番ワークロードで稼働中のサーバ運用や新規構築を担当している。

# AWS認定試験受験履歴
|資格名| 取得日 |
|---|---|
|AWS Certified Solutions Architect – Associate (SAA) | 2016/ 8/29取得|
|AWS Certified SysOps Administrator – Associate (SOA) | 2017/ 5/21取得|
|AWS Certified Developer – Associate (DVA)| 2018/11/17取得|
|AWS Certified Solutions Architect – Professional (SAP)| 2018/ 2/13取得|

今回、受験したDevOpsエンジニアプロフェッショナルの立ち位置は以下になります。

![スクリーンショット 2020-09-28 11.21.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282630/73176d98-8f52-7d5b-22d7-db771b88ce8e.png)
参照：https://aws.amazon.com/jp/certification/


今回はSOAの有効期限が近づいてきたので、更新も兼ねてDevOpsを受験してみました。
（ほんとは2020/5/21に失効だったけど、コロナの影響で半年有効期限が伸びたのでギリギリの取得です。）

# 勉強方法
DevOpsエンジニアプロフェッショナルの参考書はでていないので、
セオリー通り以下の勉強を実施しました。

・AWSドキュメント熟読
・試験範囲のAWSサービスについてホワイトペーパの熟読
・試験範囲のAWSサービスについてBlackBeltを熟読
・AWS公式のサンプル問題
・AWS公式の模擬試験



嘘です・・・・。
ホワイトペーパなんて1分たりとも読んでません。
読んだらヨダレ垂らして寝ちゃいます・・・。

# 勉強方法（真）
ほんとはこっち。
教科書を読むのが苦手なので、勉強は実戦形式で問題をといて
不明点のみBlackbeltやAWSドキュメントを参照しました。

・AWS公式デジタルトレーニング
　https://aws.amazon.com/jp/certification/certification-prep/
・AWS WEB問題集で学習しよう 
　https://aws.koiwaclub.com/
・Udemy
　https://www.udemy.com/course/aws-devops-dop-c01-2020/
・AWS公式の模擬試験
　https://aws.amazon.com/jp/certification/certified-devops-engineer-professional/

AWS公式デジタルトレーニングが中でもかなりわかりやすかったです。
音声は英語ですが、日本語字幕で説明してくれて、資料も日本語です。
カルキュラムも日本語で各カテゴリごとポイントを紹介があり、練習問題もあり見やすいです。
全体で7時間とありますが、カテゴリごとに見ていけばそんなに時間がかからないイメージです。

# 受験した感想
「AWS WEB問題集で学習しよう」や「Udemy」で問題集をといていくと問題のパターンがある程度みえてくるので
75問に対し、80分ほどで一通回答が完了し、残りの時間は見直しに費やす予定でした。

しかし現実はそう甘くなく、７５問解いた段階で、120分使っていました。
そこから回答に迷った問題の見直し、再度問題の１問目から見直しを行う予定でしたが、
時間が足りず、全体の半分ほどしか見直しが行えませんでした。
（やはりProfessionalレベルは時間が厳しい・・・）

Professional試験は問題文も選択肢も共に長文が出題される傾向にあるので、
何を問われているかをポイントを見極める訓練が必要かと思いました。

# まとめ
勉強している最中は、はじめてProfessionalレベルの問題を解いた時よりは絶望感はありませんでしたが、
やはり本番の試験となると苦戦しました。（３０問目あたりから・・・。）

個人的にはSAPやDVAよりは難易度は簡単に感じました。

ただ、私のようにdev系のナレッジのない人間でも、合格はできましたので、
受験を考えている方は学習方法を参考にしていただければと思います。
git reset --hardメモ

# Git reset

バージョンを切り替えて比較デバッグすることが良くあると思います。
そんなときによくreset --hardを使います。
その時使用するコマンドのメモ書きです。

ログを表示  
 
```
git reflog
```
結果  

```
68ae43a (HEAD -> master) HEAD@{0}: commit: Ver.0.4.2
7a44b39 HEAD@{1}: commit: Ver.0.4.1
6d29c98 HEAD@{2}: commit (initial): Ver.0.4.0
```

先頭のハッシュ値を使います。

```
git reset --hard 7a44b39
```

バージョンを行ったり来たりしていると、reflog結果がごちゃごちゃしてくるので、
最新のハッシュ値を見つけるのは一苦労。

そこで最新のバージョンに戻すには、

```
git reset --hard ORIG_HEAD
```
Azure AD Directory(テナント)に、有料のライセンスを紐付ける【備忘録】


AzureAD にて Premium Azure AD 機能を有効にするため必要な、ライセンスの取得手続きに関する備忘録です。

無料試用版のライセンス利用方法についてはいくつか記事がありますが、Office365 E3,E5 や AzureAD Premium P1,P2 など、有料ライセンスの取得については記事が見当たらなかったので残しておきます。

本記事は2020年9月14日の情報となります。
Azureポータル や Microsoft365管理センターのインターフェースや操作方法は随時更新されいるので、ご留意ください。

# 有料ライセンスを紐付けるまでの手順

## 1. グローバル管理者のロールを持つ管理者を用意する

ライセンスを紐付けるテナントに「グローバル管理者」のロールを持つユーザーを追加します。
既に存在しているユーザーに「グローバル管理者」のロールを割り当ててもよいです。

\# Azureポータルにログインするユーザーを使用する場合は注意する点がありますので、
[<a href="#補足.ライセンスを購入するユーザー">補足.ライセンスを購入するユーザー</a>]をご参照ください。

下記の画像では、ankou-team ディレクトリの nishizumi というユーザーに、グローバル管理者のロールを割り当てた状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518444/2fc94be7-1e7b-8036-a466-63d4307489ea.png)

## 2. Microsoft365管理センター にログインする

「グローバル管理者」のロールをもつAzureADのユーザーでログインします。
Microsoft365管理センター: http://admin.microsoft.com/

Microsoft365管理センター へのログインは UPN(ユーザープリンスパル名) で行います。
メールアドレスでは無いのでご注意ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518444/36c11cda-3659-6e37-580b-0f31587b28a3.png)


## 3. ライセンスを購入する

Microsoft365管理センター にログインすると、ログインしたユーザーのホームディレクトリ(テナント)名が表示されてるはずです。
購入したライセンスはホームディレクトリ(テナント)に紐付けが行われるので、意図するディレクトリになっていることを確認します。

左メニューの「サービスを購入する」から「AzureAD Premium P1」など、必要なサービスを探して購入手続きを進めます。
\# 具体的な購入方法やライセンスについての解説は、本記事では省略致します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518444/0a2eecca-c41e-a282-57d6-d3b315d5e785.png)

## 4. ライセンスが割り当てられたことを確認する

Microsoft365管理センターでの購入手続きが完了すると、AzureADへのライセンス紐付けが自動で行われます。
Azureポータルにて当該テナントの概要を参照し、ライセンスが「Azure AD Free」から購入したサービスに含まれる、AzureADのライセンスが割り当てられたことを確認して完了です。
\# 若干タイムラグがあるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518444/9965acd0-0a34-8c69-fd68-6e01ddc91421.png)

# 補足.ライセンスを購入するユーザー

Azureポータルにログインするユーザーは、スーパーユーザーの様な扱いで、他のディレクトリに関する操作や手続きを全て行えるように見ますが、Microsoft365管理センターで操作できるディレクトリ(テナント)は、あくまでもユーザーのホームディレクトリのみとなります。
Microsoft365管理センターのポータルを操作していると、ディレクトリ(テナント)の切り替えができそうな感じがするのですが...できません。

例えば、以下のように「既定のディレクトリ」とは別に「ankou-team」というテナントがある場合、それぞれのテナントがホームディレクトリとなっているユーザーで、Microsoft365管理センターにログインして手続きを行う必要があります。

| ユーザー |備考|ホームディレクトリ|
|:-----------|:------------|:------------|:------------|
| admin |Azureポータルのログインアカウント | 既定のディレクトリ|
| nishizumi | ankou-teamテナントのユーザー | ankou-team|

| テナント名 | 所属ユーザー | 
|:-----------|:------------|:------------|
| 既定のディレクトリ |admin | 
| ankou-team| admin<br />nishizumi      |
[remote rejected] master -> master (branch is currently checked out) 対策

# 状況
master のあるデスクトップPCにネットワークのフォルダ共有して、ノートPCにcloneを作成しました。
ノートPCを持ち歩いて、現場環境でデバッグ・修正した結果をpushしてmasterに反映しようとしました。

# 失敗
以下のようなメッセージが出て失敗。
```
[remote rejected] master -> master (branch is currently checked out)
```

いろいろな記事を参考にさせていただきました。
この記事が適切でした。
git pushでremote rejectedと怒られた時にやったことメモ: [Qiita](https://qiita.com/ssm_snow/items/3041be842cadf68e6d67)

# 手順

１）デスクトップPC（master）側

```  
git config --bool core.bare true
```  

２）ノートPC側

```  
git push origin master
```  

３）デスクトップPC（master）側

```  
git config --bool core.bare false
```  
ここで、Gitにステージングされている変更は、２）－１）の変更。
つまり、ノートPCで変更した内容をもとに戻す内容になってしまいます。

４）デスクトップPC（master）側
ステージングされた変更を取り消し破棄

# ・・・
３）、４）の手順が書いてある記事がなかったので、投稿してみました。
teratermで2048を遊ぶ

teratermなどのターミナルソフトを使うときは限られています。ネットワークなりサーバーなりいじる人ぐらいしか使いません。
暇なときはあります。ビルド、デプロイ、コンフィグリストア、例を挙げればでるわでるわ。

そういう時はターミナルソフトで遊びたくなります。そんなわけで2048をsshで飛ばせるようにしました。

![play.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230043/930390a2-9883-3e55-ab79-60c16a567762.gif)

[thanks!]( https://github.com/bestvist/2048.node)

# 使い方


ローカルで動かす場合

```bash
git clone https://github.com/misogihagi/node-ssh-2048.git
npm i
node 2048
```

そして
localhostにでてきたポートにsshしてください

# デモ

![de.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230043/c7714616-bd75-30e8-c028-2ff7a046e6b6.gif)


# おまけ
実は類似のサービスがあります。
play@ascii.town

他にもターミナルで遊べそうなものがあれば教えてください
## おまけのおまけ
2048RTA
[https://github.com/misogihagi/node-ssh-2048/blob/master/rta.gif?raw=true](https://github.com/misogihagi/node-ssh-2048/blob/master/rta.gif?raw=true)
npm-scriptsをnpm-run-allで用途や環境毎に書く際の小技

- Web開発の際のタスク処理として、`package.json`内に記述して利用できる[npm-scripts](https://docs.npmjs.com/misc/scripts)を利用しています。
- またその際に、複数処理の直列化や並列化に便利な[npm-run-all](https://github.com/mysticatea/npm-run-all)を利用しています。
- 今回はそれを用いた用途や環境毎への記述を、明確かつ柔軟にする方法を記録します。

## 結果
- 先に結果の記述を示します。以下の通りです。

```json
{
  "scripts": {
    "build"      : "run-s build:{sass,ts}",
    "build:sass" : "sass input.scss output.css",
    "build:ts"   : "tsc main.ts",
    "watch"      : "run-s watch:{sass,ts}",
    "watch:sass" : "sass --watch input.scss output.css",
    "watch:ts"   : "tsc -w main.ts"
  }
}
```

## 内容
- 上記の結果例は、主に**build**と**watch**を行うタスクです。
- こちらで利用している方法は、**処理内容を波括弧で指定する**ということです。

### 波括弧での指定
- コロン(:)で用途毎に分けたタスクを一回で実行する際には、以下のようなやり方があります。

```json
{
  "scripts": {
    "build-basic" : "run-s build:sass build:ts",
    "build-glob"  : "run-s build:*",
    "build-brace" : "run-s build:{sass,ts}",
    "build:sass"  : "sass input.scss output.css",
    "build:ts"    : "tsc main.ts",
  }
}
```

- これらから私は**build-brace**のような波括弧で指定した方法を利用しています。
- そのメリットは以下の通りです。
  - 非重複
      - `run-s build:sass build:ts`のように言葉の重複が無く、今後同一のタスクが増えても、用途の記述だけで済む。
  - 明示化
      - `run-s build:*`のようなアスタリスク指定と比べて、明示的に記述されているため、処理の内容が理解しやすい。
  - 順序化
      - 波括弧内の順に処理を行ってくれるため、仮に`package.json`内で`build:sass`と`build:ts`を逆に記述しても問題無い。
          - `run-s build:*`での指定では、処理順番が`package.json`内の並び通りに行われるため、逆に記載してしまうとその順になってしまう。

### まとめ
- 上記のことから、タスクやscript記述においても**可読性・明示化・非重複性**を再認識しました。

## 参考
- [npm-run-all](https://github.com/mysticatea/npm-run-all)
- https://www.mitsue.co.jp/knowledge/blog/frontend/202004/14_1408.html
  - `package.json`のスクリプト例に使わせていただきました。
【ActiveAdmin】コピペ新規作成するcloneアクションを追加する


#はじめに
rails_adminの方ではclone機能をgemで追加して実装出来たのですが……
→　https://qiita.com/MATO/items/116bda1f3629ece0812c

active_adminの方ではgemではなく設定ファイルをいじって実装出来たのでメモです。
かなり汎用性あるコード書けたと思います。

#ソースコード
関係ない所もありますが、見返す用に全部載せておきます。

```app/admin/items.rb
ActiveAdmin.register Item do

  permit_params :kind_id, :name, :memo

  # 一覧ページで検索フィルター要らないので消しておく
  config.filters = false

  # 一覧ページでのデフォルトソート
  config.sort_order = 'updated_at_desc'

  # 間違って削除しないように処理自体を消しておく
  actions :all, :except => [:destroy]

  # カスタムアクション、clone
  member_action :clone, method: :get do
    from_item = Item.find(params[:id])
    @item     = Item.new

    # ここでコピペしておきたいカラムをもう入れてしまう
    @item[:kind_id]     = from_item.kind_id
    @item[:name]        = from_item.name

    render :new, layout: false
  end

  # 詳細ページにもCloneボタンを追加
  # indexページでエラーが出る、、、のでIF文入れておく
  action_item :only => :show do
    if params[:id].present?
      link_to "Clone Item", clone_admin_item_path(id: params[:id])
    end
  end

  index do
      # selectable_column
      # id_column

      column :kind
      column :name
      column :memo

      actions defaults: false do |item|
        item 'View', admin_item_path(item), class: 'view_link member_link'
        item 'Edit', edit_admin_item_path(item), class: 'edit_link member_link'
        item 'Clone', clone_admin_item_path(id: item.id), class: 'clone_link member_link'
      end

  end

  form do |f|
    inputs do
      input :name
      input :kind, collection: Kind.all.order(:name)
      input :memo
    end

    actions
  end

  
end
```

これで一覧ページでレコードごとにCloneリンクも追加されて、機能します。
/adminから/manageとかに名前を変更した場合でも、`rails routes`で表示されるパスリンク？を使えばいけます。


#カスタムアクションとして
今回は「新規作成ページ」というnewと同じ処理する時にちょっとデータを入れただけ、ですね。
ただこれを元にしたら、そのレコードに対しての処理を好き放題にControllerに書くように書けたので、かなり楽しくカスタムできそうです。


#参考ページ
GitHubにドンピシャの質問あったのですが、色々と方法ありすぎたり、2013年とちと古かったり、英語だし……でちょっと違いますね。
https://github.com/activeadmin/activeadmin/issues/972

俺のコードの方がキレイ🤤


終わり
Ubuntu 20.04.1 LTSでMineCraft Paperサーバーを立てる②　アップデート編

#はじめに
前記事
Ubuntu 20.04.1 LTSでMineCraft Paperサーバーを立てる①
https://qiita.com/poseyamada/items/f00cbeaa3d9cf5c2e56d

この記事を書いてアップロードしたらPaperMCのバージョンが上がっていた。
アップデートの仕方をgoogle先生に聞いてみたところよくわからなかったので、取り急ぎやってみたことをまとめておきます。
調べても方法がわからなかったので、ご存知の方が入ればご指摘お願いいたします。

##目的
paperMCのバージョンを上げる
(#204→#206)

##環境
+ cpu AMD Ryzen 3 3200G
+ メモリ　16G
+  OS Ubuntu Ubuntu 20.04.1 LTS
+  papermc #204 (MineCraft JE1.16.3)
+  ユーザー : minecraft
+  ディレクトリ : /home/minecraft/mcp

#やったこと
##バックアップを取る
###homeディレクトリに移動
```:移動
$ cd
```
###バックアップ(cpでコピーを取るだけ)

```:cp
$ cp -r mcp backupmcp
```

##以前のpaperのjarを消去
```:移動
$ cd mcp
```

```:消去
$ rm papermc.jar
```

##最新のpaperのjarをダウンロード
ここのHPから最新版のURLを確認
https://papermc.io/downloads
下記は#206の場合

```:ダウンロード
$ wget  -O papermc.jar https://papermc.io/api/v1/paper/1.16.3/206/download
```

##サーバー立ち上げ

```:start.sh
$ ./start.sh
```

```:結果
Patching vanilla jar...
System Info: Java 11 (OpenJDK 64-Bit Server VM 11.0.8+10-post-Ubuntu-0ubuntu120.04) Host: Linux 5.4.0-48-generic (amd64)
Loading libraries, please wait...

...

[12:54:00 INFO]: Done (2.580s)! For help, type "help"
[12:54:00 INFO]: Timings Reset
```

##バージョンの確認
サーバーが立ち上がった状態でコマンド

```:バージョンの確認
paper version
```

```:結果
[12:55:03 INFO]: This server is running Paper version git-Paper-206 (MC: 1.16.3) (Implementing API version 1.16.3-R0.1-SNAPSHOT)
[12:55:03 INFO]: Checking version, please wait...
[12:55:04 INFO]: Previous version: git-Paper-204 (MC: 1.16.3)
[12:55:04 INFO]: You are running the latest version
```

1行目を見るとできていそうです。
このやり方が正しいのかはよくわかりません。
詳しい方、情報お願いいたします。

##バックアップの削除
その他、確認が終わったら必要に応じてバックアップを消去します。

```:ホームへ移動
$ cd
```

```:消去
$ rm -r backupmcp
```

#おわりに
本当にアップデートのやり方がわからなかった。
インストールの方法と自動化のスクリプトばかりが出てくる。
本当にあっているのかわからないのでご指揮手あればお願いいたします。
discord.pyにおける更新型メッセージ


botでテキストを出力する時、前回の投稿を削除して新しくポストすると、
最新の投稿メッセージと表示されるので便利です。

ただ、投稿が短時間で行われると、二重に投稿が表示されたりします。

基本的にマルチスレッドにおけるロッキング処理ですが、
今のところうまく行っているのでソースを置いておきます。

```python
class RenewalMessage():
    def __init__(self, channel):
        self.lastmessage = None
        self.outputlock = 0
        self.channel = channel

    async def SendMessage(self, message):
        if self.outputlock == 1: return
        try:
            while self.outputlock != 0:
                await asyncio.sleep(1)

            if self.lastmessage is not None:
                self.outputlock = 1
                try:
                    await self.lastmessage.delete()
                except discord.errors.NotFound:
                    pass
                self.lastmessage = None

            try:
                self.outputlock = 2
                self.lastmessage = await self.channel.send(message)
            except discord.errors.Forbidden:
                pass
        finally:
            self.outputlock = 0
```
スクレイピング1　Pythonによるスクレイピング

[Aidemy](https://aidemy.net/)　2020/9/30
#　はじめに
　こんにちは、んがょぺです！文系大学生ですが、AI分野に興味が湧いたのでAI特化型スクール「Aidemy」に通い、勉強しています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます！
　今回は、スクレイピングの一つめの投稿になります。どうぞよろしくお願いします。

＊本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・スクレイピングとは
・Webページを取得する（クローリング）

#スクレイピングとは
##スクレイピングについて
・スクレイピングとは、__Webページから必要な情報を自動で抜き出す作業のこと__である。
・スクレイピングを使うことで、機械学習で必要な大量のデータを集めることができる。
・ただし、Web上にあるデータは自由に利用が認められているデータ__（オープンデータ）__出ない場合もあるので、注意が必要。

##スクレイピングの流れ
・スクレイピングして良いか確認する。また、データを取得できるAPIが提供されていればそちらを利用する。
・データを得られるWebページを取得する。これを__クローリング__と言う。
・Webページの中から必要な情報を入手する。（スクレイピング）

##スクレイピングの主な手法3つ
・__wgetコマンド__:wgetコマンドを使ってWebページをダウンロードし、unixコマンドや正規表現を使ってスクレイピングを行う。__単純で手軽だが機能不足。__
・__Webスクレイピングツール__:Chromeの拡張機能やスプレッドシートその他スクレイピングが可能なツールを使う。__機能に制限がある、有料の場合がある__などの点もあるので注意。
・__プログラミング__:自分でスクレイピングの機能をプログラミングする。__複雑なデータも扱える。__今回はこの方法でスクレイピングする。

#エンコードとデコード
・エンコードとは、__データを符号化して別の形式にすること__である。
・デコードとは、__エンコードされたデータを元の形式に戻すこと__である。
・スクレイピングでは、一度エンコードして仮のデータを取得し、その仮データをデコードすることでデータを取得することができる。

#Webページを取得する（クローリング）
##Webページの取得
・Webページの取得には__urllib.request__モジュールをインポートして使えるようになる__urlopen("URL")__で行う。
・取得したWebページはread()メソッドで参照できるが、__デコードされていないので、文字列（str型）ではない__ことに注意。（デコードの仕方は次項以降で確認）

```python
from urllib.request import urlopen
#GoogleのURLを取得
url=urlopen("https://www.google.co.jp")
```

##取得したWebページをデコードする
・デコードには、そのWebページに使われている「文字コード」の情報が必要なので、まずはこれを取得する。文字コードは__info().get_content_charset(failobj="utf-8")__メソッドを使うことで取得できる。
・上記メソッドの（failobj="utf-8"）とは、文字コード（charset）がWebページ側で指定されていないときに、自動で文字コードを"utf-8"にしてくれると言う意味である。日本語のページは基本的に"utf-8"なのでこのように指定されている。

```python
url = urlopen("https://www.google.co.jp")
#文字コードの取得and表示
encode = url.info().get_content_charset(failobj="utf-8")
print(encode) #shift_jis
```

・文字コードが取得できたら、その文字コードに対応したデコードを行い、<body>部分をstr型のHTMLコードとして取得。
・デコードは__url.decode(文字コード)__で行う。内容はread()で確認できる。

```python
#すでにエンコードしたurlを、取得した文字コード（encode）でデコード
url_decoded = url.decode(encode)
print(url_decoded.read()) #略（HTMLのコードが出力される）
```

##もっと簡単にWebページを取得
・__request__モジュールをインポートして使えば、urllibよりも簡単にWebページを取得できる。ただし、複雑な操作をする場合には、前処理が大変になってしまう。
__requests.get("URL")__でURLの取得、取得したURLに対し、__encoding__を使えば文字コードが取得でき、__text__を使えばデコードされた状態のHTMLコードが取得できる。

```python
import requests
url=requests.get("https://www.google.co.jp")
print(url.encoding) #shift_jis
print(url.text) #略
```

#まとめ
・スクレイピングとは、Webページを取得し、そこから必要なデータを抜き出すことである。機械学習では、学習に必要なデータを収集するときに使う。
・Webページを取得（クローリング）するときには__urllib.request__モジュールの__urlopen()__関数を使うが、デコードしなければデータとしては扱えない。
・デコードするには、まずWebページの文字コードを取得し、その文字コードに合わせて__decode()__メソッドを使わなければならない。
・requestsモジュールを使えば、__requests.get()__でURLが取得でき、それに対し__encoding__を使えば文字コードが取得でき、__text__を使えばデコードされた状態のHTMLコードが取得できるため非常に簡単である。

今回は以上です。ここまで読んでくださりありがとうございました。
gitでコンフリクトが発生してしまったら

コンフリクトとは、作業用ブランチさんとmasterブランチさんとの間にどんどん距離ができてしまってる状態のこと。

自分が作業してる間に、masterは更新されていきます。

気づかないうちに、お互いがどんな作業をしているのか知らないまま進んでしまっている状態なんです。


【コンフリクトをなくす方法】



1  まずどのファイルがコンフリクトが発生してるのか確認する
```git status
```

2  コンフリクトが発生してるファイルをmasterと比較して修正する


3  修正したファイルを追加してコミット
```git add . 
git commit -m “コンフリクト解消”
```

4  作業用ブランチをプッシュする
```git push origin 作業用ブランチ名
```

5  git merge master
SAA試験対策学習 - ELB①

##ELB
__▼【AWS】ELBについて特徴を解説します__
https://www.acrovision.jp/service/aws/?p=2285

Elastic Load Balancing（ELB）
├　Classic Load Balancer（CLB）
├　Application Load Baancer（ALB）
└　Network Load Balancer（NLB）

###補足
__リクエストレベル__
・L4はトランスポート層でTCPでリクエストを送って確認する。
・L7はアプリケーション層なのでHTTPリクエストになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705699/f04dea84-5e88-1cc7-086a-717321c3f524.png)
https://qiita.com/tatsuya4150/items/474b60beed0c04d5d999
　　
　　
__スティッキーセッション__
ELBがサーバにリクエスト振り分ける際、特定のCookieを確認することで、特定のクライアントからのリクエストを特定のサーバに紐付けることが出来る機能。
⇒ 一度セッションが確立したバックエンドインスタンスに、リクエストを送信できる。
　　
__Connection Draining__
サーバーの処理が完了するまで、バックエンドインスタンスがELBから登録解除されるのを遅延させることができる。
(デフォルト設定では300秒。)

##外部ELB と 内部ELB
__内部ロードバランサーとは__
>従来から提供されているELB(Elastic Load Balancer)は、インターネットからのアクセスに対して、AZ(Availability Zone)をまたがった負荷分散を行っていました。今回の発表により、VPC内において、インターネットに公開していないサブネット内部のサーバを負荷分散できるようになりました。これにより、例えば外部から接続されるWebサーバはインターネットELBを使い、内部から接続されるAPサーバは内部ELBを使うといった、多段階の負荷分散ができるようになります。今までの作法として、WebとApサーバを同じEC2インスタンスにまとめることで管理を楽にしていましたが、これからは、それぞれ別に負荷分散をすることができるようになります。

https://dev.classmethod.jp/articles/amazon-vpc-internal-elb/
　　
　　
__internet-facing（外部ELB）__
ELB自体がパブリックサブネットに配置されているため、バックエンドインスタンスをパブリックサブネットに配置する必要がなく、
プライベートサブネットに配置することで、セキュリティを維持することができる。

__internal（内部ELB）__
外部からアクセスできないぷらいべーとサブネットのみ利用することができる。
開発用ブランチにMasterブランチの最新コードを取り込む

【手順】
※ もし、作業途中のものでcommit出来るものがあればcommitしておく


1   masterブランチへ移動
```git checkout master
```

2  git pullでmasterを最新に
```git pull origin master
```

3  開発用ブランチへ移動
```git checkout 開発用ブランチ
```

4   mergeコマンドでmaserの内容を取り込む
```git merge master
```

5   取り込んだものをリモートにpush
```git push origin 開発用ブランチ
```
php artisan migrate が実行できないとき

Laravelでマイグレーションを実行しようとしたが、実行できない…

エラー内容
>SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost'


直訳すると、root@localhostのユーザーが定義されてませんという感じ。

どうやらmysqlにうまく接続できてないっぽいですね。





【原因】
同じテーブルを2つ作成してしまっていた。
migrationでのテーブル作成と、ターミナル上でcreate table文を使っても作成していた。



【解決方法】
ターミナル上で作成したテーブルを削除すればok。







Laravelを使い始めたばかりでマイグレーションに関してよくわかっていなかった。。。🐥
【Auth0】APIを使ってユーザーを登録する

# はじめに
Auth0のユーザー登録はUniversal Loginから行うことができますが
Embedded Loginで独自のUIを作っていてユーザーの新規登録機能を独自で作りたい場合や
Auth0のテナント管理者側でユーザーを登録したい場合など
APIを利用してユーザーを登録したいケースもあるかと思います。

今回はAuthnetication APIとManagement APIのそれぞれに用意されているユーザー登録のAPIを利用して
Auth0のデータベースにユーザーを登録してみました。

# Authentication API
Authentication APIの場合は`/dbconnections/signup`というAPIが用意されています。
以下のようにPOSTリクエストを送信するとユーザーが作成されます。

```http
POST https://{テナントのドメイン}/dbconnections/signup HTTP/1.1
Content-Type: application/json

{
  "client_id": "{任意のアプリのクライアントID}",
  "email": "example@example.com",
  "password": "xxxxxxxxxx",
  "connection": "Username-Password-Authentication",
  "username": "johndoe",
  "given_name": "John",
  "family_name": "Doe",
  "name": "John Doe",
  "nickname": "johnny",
  "picture": "{アイコン画像のURL}",
  "user_metadata": { "plan": "silver", "team_id": "a111" }
}
```

`connection`にはユーザーを登録するAuth0のデータベースの名前を指定します。
テナント作成時のデフォルトのままなら`Username-Password-Authentication`で良いと思います。

Universal Loginから新規登録を行う場合と比べて`username`など
メールアドレスとパスワード以外のユーザーの属性情報も一緒に登録することができます。


参考：https://auth0.com/docs/api/authentication#signup

# Management API
Management APIの場合は`/api/v2/users`というAPIが用意されています。
以下のようにPOSTリクエストを送信するとユーザーが作成されます。
（`create:users`のスコープを持ったManagement API用のアクセストークンが必要になります。）

```http
POST https://{テナントのドメイン}/api/v2/users HTTP/1.1
Content-Type: application/json
Authorization: Bearer {アクセストークン}

{
  "email": "example@example.com",
  "user_metadata": {},
  "blocked": false,
  "email_verified": false,
  "app_metadata": {},
  "given_name": "John",
  "family_name": "Doe",
  "name": "John Doe",
  "nickname": "Johnny",
  "picture": "{アイコン画像のURL}",
  "user_id": "abc",
  "connection": "Username-Password-Authentication",
  "password": "xxxxxxxxxx",
  "verify_email": true
}
```

`connection`の設定内容はAuthentication APIと同様です。

Authnetication APIと比べると設定できるパラメーターが多いです。
属性情報はもちろんですが、特に`verify_email`パラメーターが特徴的です。
`verify_email`パラメーターを`true`にするとAuthnetication APIやUniversal Loginからユーザー登録をするときと同じように登録メールアドレスに確認のメールが送信されます。
逆に`verify_email`パラメーターを`false`にすると確認メールが送信されなくなります。

登録するユーザーが登録メールアドレスを所持していることを別で確認できる場合や
Auth0の確認メールに頼らずに自力でメールアドレスの確認をする場合に
余分な確認メールが送信されることを抑制する目的で使用することができます。

参考：https://auth0.com/docs/api/management/v2#!/Users/post_users

# おわりに
Auth0のAPIを使ったユーザー登録の方法を2種類紹介しました。
特にManagement APIのほうは柔軟なパラメーター設定ができるので思い通りの新規登録フローを実現するのに役に立つと思います。
ただし、確認メールの送信有無の設定については慎重に検討することをお勧めします。
メールアドレスの所有確認もせず、確認メールも一切送信しない、としてしまうと、なりすましの危険性があります。
必ずなんらかの方法でメールアドレスの所有確認をするようにしてください。
（もちろんログイン後にユーザーの`email_verified`を見てメールアドレスの確認状態を検証することも忘れずに）
Ae　テキストレイヤーのフォントサイズ変更&more

#テキストレイヤーのフォントサイズ+アンカーポイントを真ん中に+位置を真ん中にする

```jsx

//フォントを変更してアンカーポイント・位置を真ん中に
function anchorCenter(textLayerObj,fs){
        //フォントサイズの変更
        var cNTextTd = textLayerObj.property("ADBE Text Properties").property("ADBE Text Document").value; //テキストドキュメント
        cNTextTd.fontSize = fs;
        textLayerObj.property("ADBE Text Properties").property("ADBE Text Document").setValue(cNTextTd);
        
        //アンカーを真ん中に変更
        var curTime = app.project.activeItem.time;
        var myAnchor = textLayerObj.property("ADBE Transform Group").property("ADBE Anchor Point");
        var tl = textLayerObj.sourceRectAtTime(curTime, false).left; //テキストの左側の座標 l
        var tw =textLayerObj.sourceRectAtTime(curTime, false).width; //テキストの全体の幅 b
        var tt = textLayerObj.sourceRectAtTime(curTime, false).top;//テキスト上の座標 c
        var th = textLayerObj.sourceRectAtTime(curTime, false).height; //テキスト全体の高さ d
        var lv=myAnchor.value;
        var setX=roundFloat((tw/2)+tl);
        var setY=roundFloat((th/2)+tt);
        var setA = myAnchor.setValue([setX,setY]);  
        
        //位置を真ん中に
        px = div(myComp.width,2);
        py = div(myComp.height,2);
        textLayerObj.property("ADBE Transform Group").property("ADBE Position").setValue([px,py])

    function roundFloat(number) {
        var _pow = Math.pow( 10 , 4 );
        return Math.round( number * _pow ) / _pow;
    }
    
    function div(n,num){
            return n / num;
    }

}


app.beginUndoGroup("");

var myComp = app.project.activeItem;
var selLay = myComp.selectedLayers;
for (var i = 0 ;  i <selLay.length; i++ ){
    var myLay = selLay[i];
    if (myLay instanceof TextLayer ){
        anchorCenter(selLay[i],130)
    }
}

app.endUndoGroup();

```
単体テストってなんだ？（初心者向け）

ご無沙汰してます、おおのんです。
今回はソフトウェアの**テスト**に関するお話です。


ソフトウェア開発におけるテストって、自分から情報を取ろうとしない限り
体系的に理解する機会があまりないので、
知識としての理解の差に他の情報よりバラつきがありがちです。

Qiitaや書籍(※)を読んで自分なりに**単語**を軸に簡潔にまとめてみるので
以下のような方は目を通してみると理解の一助となるかもしれません。
※なお、読み易さを重視するためなるべく平易な言葉でまとめます。ご了承ください。
※単体テスト視点での記事です。

#### 記事のターゲット
「ソフトウェアのテストをやったことない、これから仕事でやるんだ」
「何となくテストしたことはある」
という人。

## この記事を読むメリットは？
**結論：単体テストとは　【何をすべきか】【どうあるべきか】　が大体分かる。**
チームによっては十分に知識または教育がなく曖昧にテストしていたりするので、テストの目的を理解することで意味のあるテストを目指すことができるようになる。

## 単体テストは何のために？
**結論：自分で作ったものを正しく動くかどうか自分で証明すること**
「仕様のとおりにアウトプットてきているか」や
「ソースコードを網羅して問題なく動作するか（**カバレッジ**）」という視点がある。

## カバレッジとは
**結論：テストをカバー（網羅）すること**
命令網羅とよばれる**ステートメントカバレッジ(通称C0)**と
分岐網羅とよばれる**ブランチカバレッジ(通称C1)**という言葉が登場する。
※C2やMC/DCという視点もあるが、今回は割愛。

## ステートメントカバレッジとは（C0）
**結論：ソースコード中の命令を最低でも一度は実行すること**
つまりソースコードの命令が一度でいいので実行されれば100%とみなされる。

## ブランチカバレッジとは（C1）
**結論：ソースコード中の全ての分岐を実行すること**
例えばif文があって、それに紐づくelse分の分岐が複数ある場合、
その分岐すべてをテストコードでカバーした場合、ブランチカバレッジ100%となる。

## ホワイトボックステストとは
**結論：ソースコードがプログラマが意図したとおりに動くかを確認するテスト**
例えると、「1という値を与えたときにif文の中で想定したelseへ分岐、通過するか」という視点。
つまり、**ソース重視**。

## ブラックボックステストとは
**結論：仕様通りに出力が得られるかどうかを確認するテスト**
例えると、「1を入れると必ず2が帰ってくるね」という視点。
つまり、**仕様重視**。

## ホワイトボックス、ブラックボックス、望ましいのはどちら？
ホワイトボックステスト（カバレッジ網羅）で100%通ったから安心！というのは危険な思想。
確かに体裁としては一見悪くないけど、仕様を確認しているわけではないのでそれだけの場合、往々にしてバグを見逃しやすい。
**テストでは仕様通りに動くかを確認すべき**なので、ブラックボックステストの視点が大事。
**ブラックボックステストをして、網羅されていない部分をホワイトボックステストの視点で100%にする**
というのがより安心で意味のあるテストと言えるのでは。

参考文献・サイト
・[ソフトウェアテスト入門 押さえておきたい<<要点・重点>>](https://www.amazon.co.jp/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88%E5%85%A5%E9%96%80-%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84-%E8%A6%81%E7%82%B9%E3%83%BB%E9%87%8D%E7%82%B9-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%BB%E3%83%86%E3%82%B9%E3%83%88PRESS%E7%B7%A8%E9%9B%86%E9%83%A8/dp/4774134546)
・[カバレッジとは【「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典】](https://wa3.i-3-i.info/word15884.html)
ワンクリックでたくさんの写真を切り抜けるノートブック

#データセットづくりに
![スクリーンショット 2020-09-28 12.10.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/0312245b-6894-0bec-71ce-5cef42c806b4.png)
![スクリーンショット 2020-09-28 12.16.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/1a2c7d02-18a5-2439-6543-b19f5521ae0e.png)

フォルダ内の画像を一気に切り抜けるノートブックをつくりました。
TensorFlow公式のDeepLabのノートブックが元になっています。

#使い方

1,[ノートブックを開く。](https://colab.research.google.com/drive/15UdK0tK0sChyFTPv4EQlkMkTGkb0MIs0?usp=sharing)

2,ご自身のGoogle Driveに切り抜きたい画像のフォルダをアップロード。保存先フォルダも作る。

3,ノートブックからGoogle Driveをマウント
![スクリーンショット 2020-09-28 12.23.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d2b6241b-971a-2518-ebfb-65ed63fb0872.png)
4,メニューから、切り抜きたいオブジェクト、背景モード、使用したいモデル、画像フォルダのパス、保存先フォルダのパス、入力画像拡張子を選択。
![スクリーンショット 2020-09-29 7.01.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/cdf2e6e1-c0e4-1275-5e22-87d0366d75f4.png)

5,ノートブックを実行
![スクリーンショット 2020-09-28 12.29.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/f8da5430-0ff7-2411-a78a-8d7f2eb33249.png)

画像フォルダ内のすべての画像が切り抜かれ、保存フォルダに保存されます。

背景は、黒、白、透過から選択できます。
![スクリーンショット 2020-09-29 6.49.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7c0a225b-da0b-9467-8850-c20efae8d153.png)

🐣
****
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
[Medium](https://medium.com/@rockyshikoku)

[相棒](https://twitter.com/oka_yuuji)
[note](https://note.com/oka_yuuji)
Codeigniter4でどこからでも利用できる変数を作る

表題通り。Codeigniter3では、「get_instance()->load->vars($key, $data);」を利用することで、変数をどこからでも設定でき利用することができた。

これをCodeigniter4でも利用したい。というわけで色々調べる。get_instanceは利用できないため、Config/Appに変数を設定してそれを利用しようと思う。

参考。
<a href="https://qiita.com/bananacoffee/items/6bb631391c2301d28c73" target="_blank">Codeigniter3で使っていたアレをCodeigniter4で使う - Qiita</a>
感謝。

Config/Appに次を追加。

```php
public static $vars = [];
```
次にヘルパーを作る。セーブとロードの機能を追加する。

``` helper/load_helper.php
function set_vars($key, $data = null){
	if(is_int($key)) return false;
	if(is_string($key)){
		Config\App::$vars[$key] = $data;
	}elseif(is_array($key)){
		foreach($key as $k => $v) set_vars($k, $v);
	}
}

function get_var($key){
	return Config\App::$vars[$key] ?? false;
}

```

set_varsで変数を追加し、get_varで呼び出す。keyに変数名、dataに変数だが、keyに配列が入るとそちらを優先して変数に組み込む。

これでどこからでも呼び出せる変数をつくることができた。

他に何か良い方法があったら教えてください。
TI-Nspire版Pythonによる振り子のシミュレーション / pendulum waves

https://qiita.com/cyq04000/items/910a2fdcfecd84f4b4b9 の続き        
#概要
今度はいわゆるpendulum wavesをシミュレートしてみる。      

#各振り子の長さを計算する
Nspire側で定義した函数を利用して計算することにする。  
     
Calculatorで下の函数を定義しておいて、その函数をNspired Pythonの```ti_system.eval_function()```函数でコールする。      

```
length(period,θ):=((g*period^(2))/(16*(∫(((1)/(√(1-(sin(((θ)/(2))))^(2)*(sin(x))^(2)))),x,0,((π)/(2))))^(2)))|g=9.80665
length_(period):=length(period,θ)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/e1a7298e-1316-3c5f-d717-665862ccb794.png)   

#サンプルファイル

```example_pend_waves.py
from PEND_SINGLE_Class import *
from CREATE_SIM_SPACE_Class import *
import math
import ti_system as tsys

N = 15 # 振り子の個数。
INIT_RADIAN = math.pi * 0.18 # すべての振り子の初期角度。
INTERVAL = 20 # すべての振り子を何秒ごとに同時に最初の位置に戻すか。
MAX_TRIPS = 15 # 一番長い振り子をINTERVAL時間内に何往復させるか。

tsys.store_value("theta", INIT_RADIAN) # 初期角度をNspire側に渡して、
periods = [INTERVAL / i for i in range(MAX_TRIPS, MAX_TRIPS+N)] # 各振り子の周期を求めて、
lengths = [tsys.eval_function("length_", period) for period in periods] # 各振り子の長さをNspire側で求めて、
#print(lengths)
MAX_LENGTH = max(lengths)
mass_radii = [(MAX_LENGTH / 3) / i for i in range(3, 3+N)] # 奥の振り子ほど小さく描く。比率は適当。

# シミュレートすべきオブジェクトをいくつか実体化する。
# (引数は(振り子長さ,錘描画半径,初期角度,初期角速度,1ステップ<,1ステップ分割数>))
# (角度は、鉛直方向下向きを0ラジアン、反時計回りをプラス、時計回りをマイナスとする)
# 錘描画半径はシミュレーションには無関係。
h = 1/2**4
num_of_div = 2**0
pends = [PEND_SINGLE_Class(length, mass_r, INIT_RADIAN, 0, h, num_of_div) for length, mass_r in zip(lengths, mass_radii)]

# シミュレーション空間の大きさを決めて、
WIDTH, HIGHT = tsys.get_screen_dim()
ASPECT = WIDTH / HIGHT
YMIN = -MAX_LENGTH * 1.1
YMAX = 0
XWIDTH = math.fabs(YMAX - YMIN) * ASPECT
XMIN = -XWIDTH / 2
XMAX = XWIDTH / 2

# 各オブジェクトをシミュレーション空間に投入し、シミュレーションを始める。
CREATE_SIM_SPACE_Class(pends, XMIN, XMAX, YMIN, YMAX).start_sim()
```

##実行結果
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/9f271c12-7dfb-0cad-84bd-524f47b9e56e.png)](https://youtu.be/Bb-FaqdH-SY)
Shader周り備忘録

# 概要
勉強がてらShader（以下、シェーダ）に関する用語をまとめています。随時更新予定です。(2020/09/28)

# シェーダとは
シェーダとは、3次元コンピュータグラフィックス（3DCG）において、陰影付けや表面の質感や凹凸の設定、各画素の表示色の決定などを行うプログラムのこと。

## シェーダプログラム
シェーダプログラムはCPUではなく、GPUに命令し動作を実行させるプログラムです。
レンダリングパイプラインを固定ではなく、プログラマブルな形で動作させます。

## プログラマブルシェーダ
今まではグラフィックスライブラリが提供する機能や処理内容があらかじめ固定されたシェーダが使用されていた。
そこからGPU（グラフィックスチップ）の演算ユニットを利用して開発者が独自に開発したシェーダプログラムを実行できる様になり、それを「プログラマブルシェーダ」と呼ぶ。


# シェーダ言語の種類
## HLSL
DirectXで使用(Microsoft)
## GLSL
OpenGLで使用(Khronos Group)
## AGAL
AdobeFlashで使用(Adobe)
## PSSL
PlayStation4で使用（Sony）
## Metal
iOS(iOS8以降)で使用(Apple)
iOS Keyboard ExtensionでadjustTextPositionするときのお作法

iOS Keyboard Extensionでカーソルを移動させるには`adjustTextPosition(byCharacterOffset:Int)`を使います。[ドキュメント](https://developer.apple.com/documentation/uikit/keyboards_and_input/creating_a_custom_keyboard/handling_text_interactions_in_custom_keyboards)にはバッチリ
>To move the insertion point in the text input view, use the adjustTextPosition(byCharacterOffset:) method. For example, if you want to implement a forward delete action, move the insertion position forward by one character then delete backwards:

```swift
// Move the text insertion position forward 1 character (一文字分前に進める)
textDocumentProxy.adjustTextPosition(byCharacterOffset: 1)
```
と書いてありますが、**罠です**。なかなか気付きにくいところだと思うので共有しておきます。

この通りに実装するとこんな挙動になります。
![ezgif-5-786edace6467.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638786/f3007e60-e648-47d3-a0cf-99bfbaa5616c.gif)

「あいうえお」まではうまく動いていますが、漢字や絵文字に至ったあたりからどうも様子がおかしいですね。

# 解決方法
どうやらこのメソッドは`utf16`とした時の文字数で「一文字分」を数えています。ということで、実行前に進行方向の文字をチェックして、それから`adjustTextPosition`しましょう。

```swift
func getActualOffset(count: Int)->Int{
    if count>0{
        if let after = textDocumentProxy.documentContextAfterInput{
            if after == ""{
                return 1   //一文字前に改行がある場合、after==""となる。
            }
            let left = after.prefix(count)
            return left.utf16.count
        }else{
            return 1
        }
    }else if count<0{
        if let before = textDocumentProxy.documentContextBeforeInput{
            let right = before.suffix(-count)
            return -right.utf16.count
        }else{
            return -1
        }
    }else{
        return 0
    }
}

let offset = getActualOffset(count: 1) //正確なoffsetを取得する
textDocumentProxy.adjustTextPosition(byCharacterOffset: offset) //実行する
```
これで意図した通り動作します。
![ezgif-5-410ac0a2f5c8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638786/7a669697-8f4e-2951-3a0a-692d83c882d0.gif)

気付きづらいところに潜んでいる落とし穴なので、くれぐれもお気をつけください。
vistaでmse その3

#概要

vistaに、Microsoft Security Essentials入れてみた。
eicarテストしてみた。

#手順

以下を、メモ帳で、「eicar.txt」で、保存した。

```
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
```

#結果

保存した時点で、隔離された。見れない。
DOS/EICAR_TEST_file


以上。
linuxで新しいコマンドを作ってみる

- linuxで新しいコマンドを作ってみようの巻です。

新しいコマンドがどういうことかというと、
`newfile`コマンドを打てば、`「newfile.txt」`ファイルを作成させることが出来るのです。

- どういう仕組み？

aliasコマンドを使用します。
1. `newfile`コマンドを打てば
2. 裏で`touch newfile.txt`を裏で実行させ
3. `「newfile.txt」`ファイルを作成させているのです。

- 登録のコマンド

```
alias 別名のコマンド='コマンド'
```

- 削除のコマンド

```
unalias 別名のコマンド
```

## コマンドを登録する

#### ※注意
aliasは、ターミナルの画面を閉じたり、ログアウトしたりするとリセットされるので注意が必要です。

### 一時的に登録

- 登録

```
alias newfile='touch newfile.txt'
```

- 登録の確認

```
$ alias | grep newfile
==========
alias newfile='touch newfile.txt'
==========
```

登録できていました！

- 実行

```
$ ls
(何も返ってこなかった)

$ newfile

$ ls
newfile.txt
```

`newfile.txt`出来ていました！

### 永続的に登録

- 登録

```
vi  ~/.bashrc
==========
追加
alias newfile='touch newfile.txt'
==========
```

- ログインし直す

```
exit
```

- 登録の確認

```
$ alias | grep newfile
==========
alias newfile='touch newfile.txt'
==========
```

登録できていました！

- 実行

```
$ ls
(何も返ってこなかった)

$ newfile

$ ls
newfile.txt
```

`newfile.txt`出来ていました！


## コマンドを削除する

### 一時的に登録した場合の削除

- 登録の確認

```
$ alias | grep newfile
==========
alias newfile='touch newfile.txt'
==========
```

- 削除

```
unalias newfile
```

- 削除の確認

```
$ alias | grep newfile
(何も返ってこない)
```


### 永続的に登録した場合の一時削除

- 登録の確認

```
$ alias | grep newfile
==========
alias newfile='touch newfile.txt'
==========
```

- 一時削除

```
unalias newfile
```

- 削除の確認

```
$ alias | grep newfile
(何も返ってこない)
```

※ただし、ログインし直しなどしたらコマンドは使えるようになっています。

### 永続的に登録した場合の永続的削除

- 登録の確認

```
$ alias | grep newfile
==========
alias newfile='touch newfile.txt'
==========
```

- 削除

```
vi  ~/.bashrc
==========
削除
alias newfile='touch newfile.txt'
==========
```

- ログインし直す

```
exit
```

- 削除の確認

```
$ alias | grep newfile
(何も返ってこない)
```

※こちらは、改めてログインし直ししてもコマンドは削除されたままになります。

## 参考

- [新しいコマンドも作れる！aliasコマンド詳細まとめ【Linuxコマンド集】
](https://eng-entrance.com/linux-command-alias)
- [コマンドを便利にするコマンド alias 再入門](https://techblog.recochoku.jp/5341)
クラスやメソッド、変数における名前の単語の区切り方

##疑問
　クラスやメソッド、変数の名前をつける時に、単語の区切り方の違いが分からない

##結論
　クラスにはアッパーキャメルケースを使い、メソッドや変数にはスネークケースを用いる。

##説明
(ex)
「 user tweet　creator」という名前を付けたい時を例にする

・クラスに命名する時
UserTweetCreator
というように命名する

・メソッドや変数に命名する時
user_tweet_creator
というように命名する

つまり、
アッパーキャメルケース
　初めの文字を大文字にし、単語の区切りを大文字で表す

スネークケース
　単語の区切りを_で表す

となります。メソッドや変数はスネークケースを使用かつ、全て小文字となります。

##まとめ
命名規則を守ることで、チームの方達との、コードの意味の伝達が円滑になると思いますので、
参考にして、いただけると幸いです。

*ちなみにカラム名もスネークケースを用います。
Xcode12でStoryboardの小窓(Minimap)を消す


Xcode12からStoryboardでもMinimapが出てきました。
99%の人にとっては邪魔なので消しましょう(偏見)。
![スクリーンショット 2020-09-28 11.52.13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314911/710f5b0e-e4c8-b700-c7c1-d7f138b28288.jpeg)

`ctrl` + `shift` + `command` + `M`
or
`Editor` →　`Minimap`
or
`右上のPopupMenu` → `Minimap`　(下画像)
で消えます。
![スクリーンショット 2020-09-28 11.58.21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314911/11b890b9-e885-2f6d-b3bc-404b8716684a.jpeg)
懐かしい？もう使われなくなったHTMLタグたち

私はたまにですが古き良き時代のHP(いい意味で)をみたくなります。
ものすごく色が派手で、チカチカ点滅していたり、無駄に動いたり、いきなり音楽が流れたりなど、ある意味面白い時代だったと思います。
あの頃はあれが一番のアイキャッチだったのかもしれませんね。
そこでそういえばあのタグって今どうなってるんだろうと思って調べたらやっぱりHTML5になって廃止になってるものばかりでした。
最近の人は知らないかもしれないので少しでも古き良き時代の今は使われなくなったHTMLタグを一部ですがご紹介できればなと思いまとめてみました。


## &lt;blink> タグ 　- テキストの点滅 - 
これは昔はよくありました。
現在も同じように表現するにはCSSのanimationを使えば同じように点滅させることができます。


```html:blink.html
<span class="blink">文字が点滅します</span>
```

```css:blink.css
.blink {
  animation:blink 0.2s ease-in-out infinite alternate;
}

@keyframes blink {
  0% { opacity: 1.0; }
  100% { opacity: 0; }
}
```


## &lt;marquee> スライドタグ　
これも昔はよくありました。
文字がスライドしてくるタグです。
HTML5ではもちろん廃止されています。
現在同じように文字をスライドさせるにはCSSのmarqueeを使うとできます。

```html:marquee.html
<div class="marquee" >
 <p> 動くテキスト </p>
</div>
```

```css:marquee.css
.marquee p {
 margin: 0; 
 padding-left: 100vw; 
 display: inline-block; 
 white-space: nowrap;
 animation-name: marquee; 
 animation-timing-function: linear;
 animation-duration: 15s;
 animation-iteration-count: infinite;
}

@keyframes marquee {
 from   { transform: translate(0%); } 
 99%,to { transform: translate(-100%); }
}
```

## &lt;bgsound> タグ　- 音楽再生 -　
BGMを再生するタグです。
IE全盛期のもので、IE独自の仕様だったため使われなくなったようです。
今では&lt;audio>タグで応用することができます。


## &lt;strike> タグ　- 打ち消し線 -
   ~~打ち消し線~~
   現在残っているタグでいうと&lt;s>や&lt;del>のことです。
ちなみに&lt;s>は
訂正
のときに使い、&lt;del>は<del>削除</del>のときに使います
  

## &lt;center>　- 中央揃え -
これは文字通り中央揃えするタグです。
装飾するものは基本CSSで記述するということになりましたのでHTML5では廃止されています。
現在でやるするとCSSで text-align: center; 中央揃えができます。


##ちなみに
昔ながらのサイトがまだいくつかあったようなのでご紹介します。
※ものすごくチカチカするのでご注意して下さい。

:sunny: 激安　格安　爆安ホームページ制作屋
http://tonys.k-free.net/


:sunny: ナイトウ薬局
http://hm.aitai.ne.jp/~naitonet/


:sunny: 愛の妖精ぷりんてぃん
http://www.takamagahara.com/printin/
OCI Log Analyticsに手動でログをアップロードする

OCI Log Analyticsは通常エージェントが定期的にログをアップロードしますが、OCI CLIまたはREST APIを使って手動でログをアップロードすることが可能です。この方法を使用すれば、エージェンドをインストールできないリソースのログを分析させることができます。

ドキュメントは[こちら](https://docs.cloud.oracle.com/en-us/iaas/logging-analytics/doc/upload-logs-logging-analytics-demand.html)

ここでは、データベースのXML監査ログをインポートし、分析する手順を手順を説明します。

- ロググループを作成し、OCIDをメモしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/fbf5e83b-f326-d000-0b78-fe178beb4cb5.png)

- ログソース名は、以下のソース内の名前から取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/2fc84a0d-4ca9-50eb-14fb-efa4e51c60e1.png)

```
#サンプルのXML監査ログをダウンロード
wget https://raw.githubusercontent.com/western24/omcdemo/master/ora_audit.xml

#OCI CLIでアップロード
oci log-analytics upload upload-log-file --namespace-name テナント名 --log-source-name 'ログソース名' --upload-name アップロード名 --file ログファイルパス --filename ログファイル名 --opc-meta-loggrpid ロググループのID
oci log-analytics upload upload-log-file --namespace-name xxxxxx --log-source-name 'Database Audit XML Logs' --upload-name uptest --file /home/opc/ora_audit.xml --filename oracleXMLlog --opc-meta-loggrpid ocid1.loganalyticsloggroup.oc1.iad.xxxxxxxxxxxxxxx

```

- 正常にアップロード完了されていれば、管理 -> アップロード内に表示される。アップロードファイル内の "ログ・エクスプローラで表示" をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/38f6fb36-6cba-664d-2937-a39aa7152bc8.png)

- インポートしたログの分析画面に遷移する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/946a5f68-6f92-ac01-be7f-0749875603de.png)

- ビジュアル化を円グラフに変更、StatusCodeをグループ化基準にドラッグ&ドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/633676c2-37c4-ef66-6989-eb91b833f304.png)

- クラスタ分析を選択すると、グルーピング化されログの傾向をより直感的に把握ができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/94e27ff8-bdf8-178c-1cac-e190f536352f.png)

今回はOCI LAにプリセットされているOracle Databaseのログタイプを使用しましたが、サポートされていないミドルウェアやアプリケーションのログには、カスタムパーサーの機能で新たに対応するログタイプを作成することが可能です。

本家のOracle Management CloudではGUIで簡単に実装できますが、OCI LAはまだですので、OMC側で作成した正規表現をコピーするというのが良いかもしれません。

[OMC Log Analyticsで未対応のログをカスタム・パーサで取り込む](https://qiita.com/western24/items/fdfb2ab5d83ad5d8a28f)

OCI Audit,Flowlog,WAF関連のログを手動でアップロードして分析するといった使い方も実践的ですね。ただ、完全対応したパーサーはまだなので、自身で作成する必要があります。
vistaでmse その２

#概要

vistaに、Microsoft Security Essentials入れてみた。
AntiVirusScanner.dll、入れてみた。

#インストール

```
RegAsm AnttiVirusScanner.dll /codebase

```

#テスト

```
Set scan = CreateObject("AntiVirus.Scanner")
msgbox scan
res = scan.ScanAndClean("c:\Users\******\Desktop\anti\path.txt")
msgbox res
```

#結果

0 "VirusNotFound" 
1 "VirusFound" 
2 "FileNotExist"


```
0
```

以上。
個人OneDriveサイトをSharePoint Onlineの検索結果から外したい【未解決】


・SharePoint OnlineではMicrosoft Searchという検索機能を使っている。
・個人のOneDrive内のドキュメントを権限管理ではなくサイト単位でMS Sarchの検索結果から外す方法はないだろうか。
・クラシック検索機能では検索結果から対象外にしたいURLを除外する設定ができるみたい

##結論
MS Sarchで「個人のOneDrive全体を検索結果から外す」みたいな操作はできないみたい。
各OneDriveから特定URLを検索結果から外すことは可能のようだ。

##操作画面への遷移
SharePoint管理センター > その他の機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/de91eb0f-ce7d-4f9a-1c50-7116595fb1f2.png)

その他の機能 > 検索 > 開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/50157951-850c-1675-b329-32e8c3a2aa91.png)

この画面の「検索結果の削除」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/63f7e7f9-acd0-70d3-f800-5197d5b7e98a.png)


この画面で個人OneDriveのURLを入力すれば行ける？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/704b9fee-73f7-b496-f88d-824d1b4feef4.png)

##課題
しかし、「https://～/_layouts/15/onedrive.aspx」と入力したら設定不可となって弾かれた。
「https://～/personal/～」と入力したら、URLの登録はできた。
が、テスト検証しても普通にヒットしてしまったのでこれではないみたい。
登録すべき適切なURLがまだ特定できていないので要検討です。
未解決ですすいません。

##2021/3/29　追記
2021/3/10付で記事が作られてました
検索先を管理する
https://docs.microsoft.com/ja-jp/sharepoint/manage-result-sources

この文書でいう『[ 検索結果のソース] を選択』は、日本語版だと『検索先の管理』になるんだと思う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/ee9986e7-d74f-a57f-520e-d48d25c9954c.png)



##参考資料
SharePoint の検索エクスペリエンス
https://docs.microsoft.com/ja-jp/sharepoint/get-started-with-modern-search-experience

検索結果を削除する
https://docs.microsoft.com/en-us/sharepoint/remove-search-results

Remove OneDrive results from Sharepoint Modern Search
https://techcommunity.microsoft.com/t5/sharepoint/remove-onedrive-results-from-sharepoint-modern-search/m-p/759293

クラシック検索機能での特定URLを検索対象から外す
https://office365developer.com/2019/02/14/using-search-results-sources-to-exclude-onedrive-content/
nuxtをgithub actionsでnetlifyに自動デプロイする

netlifyはgitと連携しておけば勝手にビルド＆デプロイをしてくれるのでめちゃくちゃ楽なんだけど、無料プランではビルド時間が月300分までとなっている。
これを回避するためにgithub actionsを使ってgithub側でビルドしてあげよう。という作戦。

何よりも最初に注意しておくべきなのは、1度gitと連携してしまうと勝手にビルドする設定になってしまうこと。
自動ビルドを停止することはできるけど、それをやるとデプロイまで停止される。
そのためこの方法を取るときは、gitとは連携せずに、ファイルをドラッグアンドドロップで追加することでサイトを追加する方法を取る必要がある。
(運営に連絡したら連携済みのgitとの連携を解除してくれるみたいだけど)

ドラッグ&ドロップする画面スクショ
![スクリーンショット 2020-09-28 16.19.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306936/8d5c39bd-a735-50f8-57a8-f8bf9431cdc5.png)


#設定
githubとnetlifyの設定はぐぐったらわかると思うので割愛します。
トークンとサイトIDの設定だけしておいてください。

【参考】
https://qiita.com/nwtgck/items/e9a355c2ccb03d8e8eb0

あとは.github/workflow.deploy.ymlを追加するだけ。
ここで注意したいのはnetlify/actions/cliの部分で--prodを使うこと。
これはぐぐってもよくわからなかったけど、--prodをつけないとnetlifyのデプロイがDeploy Previewになってしまい、publishedにならない。
このせいで結構困ったけど、--prodをつけたらちゃんと自動でデプロイしてくれた。


```.github/workflow.deploy.yml
name: production deploy

on:
  push:
    branches:
      - master

jobs:
  deploy:
    runs-on: ubuntu-18.04
    env:
      GITHUB_TOKEN: ${{ secrets.GIT_TOKEN_COVID19 }}
    steps:
      - uses: actions/checkout@v2
        with:
          ref: master

      - name: Setup Node
        uses: actions/setup-node@v1
        with:
          node-version: '10.x'

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - name: Cache dependencies
        uses: actions/cache@v2
        with:
          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - run: yarn install --frozen-lockfile
      - run: yarn run test
      - name: generate
        run: |
          yarn run generate:deploy --fail-on-page-error

      - name: Deploy
        uses: netlify/actions/cli@master
        with:
          args: deploy --dir=dist --prod
        env:
          NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
          NETLIFY_AUTH_TOKEN: ${{ secrets.GIT_TOKEN_COVID19 }}
```

#補足 --prod問題
![スクリーンショット 2020-09-28 11.37.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306936/e35d15f1-7832-fc63-dbc7-ca659f1b3c6d.png)

公開されるデプロイには緑のpublishedというマークがつくが、gitにpushしてもnetlify上ではDeploy Previewというデプロイが表示されるだけで、publishedにならない。

ymlファイルのnetlify/actions/cliの部分で--prodをつけたら解決した。
ぐぐってもよくわからなかったけど、--prodはproductionの略なのかな？
JuliaからStanを動かしてみた

# はじめに
Stan.jlをmacOS上で動かせるようにしたときのメモ。

# 手続き要約
基本的には公式のマニュアルに従って作業していけばいいようだ。
1. cmdstanをインストール
2. Stan.jlをadd

# 詳細
## cmdstanのインストール
[User's Guide](https://mc-stan.org/docs/2_24/cmdstan-guide/cmdstan-installation.html#installing-the-c-toolchain)に従って作業していけばOK
1. GitHubリポジトリから[最新版リリース](https://github.com/stan-dev/cmdstan/releases/latest)をダウンロード
2. 適当な場所に解凍して、`cmdstan`ディレクトリに移動（User's guideで`<cmdstan-home>`と表記されているところ）
    - 解凍したものをJuliaから使うので、それらしい場所に置くとよい
    - プログラミングとか何もわからんので、`~/src`の下に置いた
3. `make cmdstan -j`でmakeする。最後に`--- CmdStan v2.23.0 built ---`が出てくれば成功らしい。
    - これは場合によってはちょっと時間がかかる
4. Stan.jlが探せるように、.zshrcに以下を追記していおく

```zsh
export JULIA_CMDSTAN_HOME=/Users/takashi-takahashi/src/cmdstan
launchctl setenv JULIA_CMDSTAN_HOME /Users/takashi-takahashi/src/cmdstan
```

## Stan.jlをaddする
こちらも[公式マニュアル](https://stanjulia.github.io/Stan.jl/stable/INSTALLATION.html)に従って作業する
1. JuliaをREPLで立ち上げて、`] add Stan`するだけ

一応、[WalkThrough example](https://stanjulia.github.io/Stan.jl/stable/WALKTHROUGH.html)をやってみる。`] add StanSample`して、`using Stan`も追記しておくとたしかに動く。
PostgresのSQLでUTCの現在時刻を取得したい

current_timestamp at time zone 'UTC'が正解っぽいかな
(DB接続のtimezoneがAsia/Tokyoな環境)

```sql
select
	localtimestamp a,
	localtimestamp at time zone 'UTC' b,
	localtimestamp at time zone 'Asia/Tokyo' c,
	current_timestamp d,
	current_timestamp at time zone 'UTC' e,
	current_timestamp at time zone 'Asia/Tokyo' f
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112363/f61ee846-3cb4-6136-f5d2-7e5528a2addf.png)
vistaでmse

#概要

vistaに、Microsoft Security Essentials入れてみた。

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5b2803a8-3991-dc80-3909-a7bfcbab2d15.jpeg)


#インストール手順

インストーラを探す。
ファイル名は、MSEInstall.exe
バージョンは、4.3.216.0

定義ファイルを探す。
ファイル名は、mpam-fa.exe
日付は、2019/02/22

以上。
ターミナルが見辛かったので、カスタマイズした


見た目をこんな感じにシンプルにまとめました。

![スクリーンショット 2020-09-28 11.29.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635167/2c423927-8745-e0d7-a1ce-d843ac525e4c.png)


MacOSがcatalinaのため、初めはzshの設定になっていました。
参考記事がbashだったため、デフォルトをbashへ変更しました。


●起動時にbashを読み込む方法
HOMEに.bash_profileを作成して以下を記述。

```:.bash_profile
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```

bashへ変更すると、毎回ターミナルに以下のメッセージが表示される

```:ターミナル
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
```

メッセージを表示しない方法
.bash_profileに以下を記述。

```:.bash_profile
export BASH_SILENCE_DEPRECATION_WARNING=1
```

これで、起動時に.bash_profileを読み込み、
余計なメッセージが表示されなくなりました。

次に、ターミナルの表示を変更します。
.bashrcファイルを作成。

```:ターミナル
$ touch ~/.bashrc
```

自分は先輩に教わった、下記の設定を記述しています。

```:.bashrc
export PS1='\n\[\![\e[0;32m\]\t\[\e[0;34m\] @\W\[\e[0;37m\]\[\e[0;31m\]\[\e[0;37m\]]\[\e[1;31m\]\[\e[0;37m\]\n$ '
```

こちらの内容の意味や、カスタマイズしたい場合は
下記の記事が参考になります！

https://qiita.com/hmmrjn/items/60d2a64c9e5bf7c0fe60


以上、ターミナルの見た目変更方法についてでした。