OmniAICreator/Qiita-1.07M huggingface dataset:
【SearchConsole】data-vocabulary.orgが非推奨に、パンくずgemのgretelを互換性のあるbuoysに乗り換え

# railsの超有名gemであるgretelからbuoysに乗り換えました。
railsの言わずと知れたパンくずのgemである、gretelですが現時点（2020/04/08）ではdata-vocabulary.orgを利用しているため
schema.orgを利用している buoys にライブラリを乗り換えました。

乗り換え方法はページ下部に記載。

## rails の gretel もそのうち対応されそうです。
現時点では対応されておりませんが。
グレーテルのFork先でPRが作られた、対応される見込みはあるとおもいます。

https://github.com/WilHall/gretel/pull/17

issueの方でも対応する予定はありますとコメントがありますね。
https://github.com/WilHall/gretel/issues/16


なので今は慌てて対応せずモンキーパッチで対応するのも良いかと思われます。

@yamitake@github 先生の記事が参考になります
https://qiita.com/yamitake@github/items/96a0b0a9036aa345dd62

## 背景はGoogleの仕様変更
Google は2020年4月6日以降、data-vocabulary.org を検索結果のリッチリザルトの対象外にすることを決めた。

検索順位に影響がでるという情報は見たところないようです。
また、ページとしても引き続き有効という説明がありました。

Googleからのメールには「検索結果での表示に影響がある場合がございます。」とある通り、あくまでも表示に影響が出るだけのようです。

ただし、検索結果での表示に影響があればクリック率にも影響する可能性がありますので、早めに対応することをお勧めします。


## 対応するメリット
Googleの検索結果に引き続きリッチスニペット表示することができる。
対応しないとリッチスニペットではなくなる

## buoysはgretelと互換性のあるgem
明示的に互換性があるとは言っておりませんが、非常に似ているため以降が楽です。

### 必要な作業は2つ
* gem を install
* 初期化コマンドを打つ
* ファイル名を書き換え

これだけで終わります。

### Gemfileに追記

```ruby:Gemfile
gem 'buoys'
```

```bash:bundle_install
bundle install
```

### 初期化コマンド

```bash:初期化コマンド
bin/rails g buoys:install
```


こんなファイルが生まれますので、パンくずを設置していた部分でこれを読み込んでください。

```erb:app/views/breadcrumbs/_buoys.html.erb
<% if buoys.any? %>
  <ol itemscope itemtype='http://schema.org/BreadcrumbList' class='breadcrumb'>
    <% buoys.each.with_index(1) do |link, i| %>
      <li itemprop='itemListElement' itemscope itemtype='http://schema.org/ListItem'>
        <%# if `link.current?` is true, link.options includes {class: 'current'}. %>
        <% if link.current? %>
          <span itemprop='name'><%= link.text %></span>
          <meta itemprop='position' content='<%= i %>' />
        <% else %>
          <%= link_to link.url, link.options.merge(itemprop: :item) do %>
            <span itemprop='name'><%= link.text %></span>
          <% end %>
          <meta itemprop='position' content='<%= i %>' />
        <% end %>
      </li>
    <% end %>
  </ol>
<% end %>
```

```slim:gretelの読み込み部分を
== breadcrumbs(semantic: true, separator: nil)
```

```slim:こんな感じに変更する
= render('breadcrumbs/buoys')
```

### ファイルの移動
パンくずの設定ファイルを移動します（内容の変更は不要です）

config/breadcrumbs/article/hoge.rb → config/buoys/article/hoge.rb 

## 終わり
スタイル崩れがあったら、CSSのクラス名などを調整してあげて完成です
1日あれば移行できてしまいますね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/59566633-a414-8eee-009a-92634ff8de9a.png)
【Rails】CarrierWave+MiniMagickでユーザーアイコンを作る

CarrierWave + MiniMagickでユーザーアイコンを作ります。

### バージョン情報

* rails 5.2.3
* ruby 2.6.3

### ユーザーアイコンを作る

##### 元画像を切り抜く

width 100px, height 100pxで切り抜き、第三引数で切り抜きを行う際の中心点を指定します。

(app/uploaders/icon _uploader.rb)

```ruby
process resize_to_fill: [100, 100, "Center"]
```

#### サムネイルの設定

30×30のサムネイルを設定します。`.icon.thumb.url`で呼び出せます。
(app/uploaders/icon _uploader.rb)

```ruby
version :thumb do
  process resize_to_fit: [30, 30]
end
```

#### 画像の表示

ヘッダーにはサムネイルを表示します。

(app/views/layouts/appliacation.html.erb)

```html
<%= image_tag current_user.icon.thumb.url, class: 'icon'%>
```

プロフィールページにはそのまま表示します。

(app/views/users/show.html.erb)

```html
<%= image_tag @user.icon.url, class: 'icon'%>
```

#### 丸くデザイン

cssで丸くデザインします。

(app/assets/stylesheets/styles.css)

```css
.icon {
  border-radius: 50%;
}
```

### 複数のサムネイル

ちなみに、サムネイルは複数設定できます。

(app/uploaders/icon _uploader.rb)

```ruby
version :thumb30 do
  process resize_to_fit: [30, 30]
end

version :thumb50 do
  process resize_to_fit: [50, 50]
end
```

それぞれ、`.icon.thumb30.url`、`.icon.thumb50.url`で呼び出すことができます。
京大理学部 物理科学課題演習 C1 （事前準備）

#計算機環境の構築

　Windows/Mac ユーザーが UNIX/Linux 環境を導入し、C 言語をコンパイルできて、gnuplot でグラフが描けて、TeX でレポートが作成できる、という状態になるための手順を載せておきます。

##Windows ユーザー向け

<font color="Red">（2023/04/12 加筆）現在は Microsoft Store版 Windows Subsystem for Linux（WSL） で簡単に Linuz 環境がインストールできるようになっているそうです。詳しくは[「Windows 11でLinuxを使う(WSL)」](https://qiita.com/whim0321/items/249d19eee590373cfac6)を参照してください。</font>

＃＃＃＃＃以下、古い記事です。＃＃＃＃＃
　まず初めに断っておくと、私自身は 20 年近く Mac しか使ってこなかったので、Windows に関しては完全にド素人です。ただ、とある理由でつい 2 ヶ月ほど前に iMac に Boot Camp で Windows 10 をインストールしたところだったので、これ幸いとその Windows 上で環境構築を試してみました。とりあえずそこでうまくいったやり方を載せておきます（が、うまくいかなかった場合に質問されても解決できない可能性が高いです、すみません）。

　最初から丸投げですが、Windows 10 上で Linux を動作させるための手順については [atmarkit さんのページ](https://www.atmarkit.co.jp/ait/articles/1608/08/news039.html) の説明がわかりやすかったです。書いてあるとおりにやると簡単に Linux 環境が構築できました。ちなみに Linux ディストリビューションはどれを選んでもらっても構いませんが、大学の計算機には基本的に Ubuntu がインストールされているので、同じ Ubuntu を選ぶのが無難かもしれません。
（上のページは登録しないと読めなくなっていたので、Windows10 への Linux のインストールについては、例えば[「Windows 10 用 Windows Subsystem for Linux のインストール ガイド」](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)を参照してください。）

　続いて C 言語のコンパイラを APT を用いてインストールします。APT とは、様々なソフトウェアを簡単にインストールしたりアップデートしたりするための、パッケージ管理ソフトとよばれるもののひとつです。先ほどインストールした Linux 環境上で以下のコマンドを入力し、まずは APT のアップデートを行います。

```console
$ sudo apt-get update
```

あとはこの APT を使って以下のとおり開発環境パッケージをインストールすれば OK です。

```console
$ sudo apt install build-essential
```

このパッケージをインストールすれば、`gcc` とか `g++` とか `make` とか諸々使えるようになります。
＃＃＃＃＃以上、古い記事です。＃＃＃＃＃

　次に gnuplot ですが、こちらも丸投げで、[Windows PCへのgnuplotのインストール](http://www.compe.media.kyoto-u.ac.jp/syoseki/windows/windows-gnuplot.html) のページを参照してください。これも書いてあるとおりにやって、簡単にインストールできました。

　最後に TeX ですが、こちらは [TeX Live](https://texwiki.texjp.org/?TeX%20Live) という巨大なディストリビューションが存在しているので、それを利用するのが一番簡単です。[Windows へのインストール方法が書かれたページ]([macOS へのインストール方法が書かれたページ](https://texwiki.texjp.org/?TeX%20Live%2FMac)を参照して、お好みの方法でインストールしてください。)を参照して、お好みの方法でインストールしてください。

##Mac ユーザー向け

　macOS は UNIX ベースのシステムなので、自分で UNIX/Linux 環境を構築する必要は特にありません。 `アプリケーション` フォルダ内の `ユーティリティ` フォルダの中に `ターミナル` というアプリが入っているので、これを立ち上げればすぐにコマンドラインを利用可能です。`gcc` などのコンパイラも最初から入っているので、C 言語の学習もすぐに始められます。

　gnuplot についても [Homebrew](https://brew.sh/index_ja) を使うことで簡単にインストールできます。Homebrew とは、様々なソフトウェアを簡単にインストールしたりアップデートしたりするための、パッケージ管理ソフトとよばれるもののひとつです。まずはターミナル上に以下のスクリプトを打ち込んで Homebrew をインストールしましょう。

```console
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

あとはこの Homebrew を使って以下のとおり gnuplot をインストールすれば OK です。

```console
$ brew install gnuplot
```

　最後に TeX については、Windows の場合と同じく [TeX Live](https://texwiki.texjp.org/?TeX%20Live) のパッケージをインストールするのが一番簡単かと思います。[macOS へのインストール方法が書かれたページ](https://texwiki.texjp.org/?TeX%20Live%2FMac)を参照して、お好みの方法でインストールしてください。

　以上で事前準備はひとまず完了です。
Vagrantによる設定

#はじめに
こちらではvagrantを使った構築の際に設定できる内容であったりこうした設定しとくとええかもやで？
なのを書いていきます
追加できる内容があったら随時足していきます。

##前提
VirtualBox(https://www.virtualbox.org/)
Vagrant(https://www.vagrantup.com/)
Apache(https://httpd.apache.org/)
Cent0S7 
こちらで構築の紹介をさせていただいております。
ご参考にどうぞ
https://qiita.com/I_S-657/items/63528d09995138c9e46d

##IPアドレス
IPアドレスの設定ですがVagrantファイルから設定できるようになっています。
まずVagrnatファイルを開きます。
３６行目くらいに

```text:Vagrant
#config.vm.network "private_network", ip: "192.168.33.10"
```

という項目があるので

```text:Vagrant
config.vm.network "private_network", ip: "192.168.33.10"
```
こう変更します。

起動して確認します。

```
[vagrant@localhost ~]$ ip -4 a show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.33.10/24 brd 192.168.33.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
```

ちゃんとIPアドレスが設定されているのがわかると思います。
コマンドですが
ipの「IPv４」でなおかつ「eth1」の情報を表示してくださいという内容になります。

#ポート
仮想上のwebサーバにアクセスする際にポートの設定をする必要があります。
これは仮想にwebサーバをポート80でたてただけではできないようになっています。
なので接続するためにポートフォワードの設定ができるようになっています。

まずはVagrantファイルを開きます。
２７行目くらいに

```text:Vagrant
# config.vm.network "forwarded_port", guest: 80, host: 8080
```
という項目があるのでこれを

```text:Vagrant
config.vm.network "forwarded_port", guest: 80, host: 8080
```
こう変更します。
保存します。
起動して確認します。

URLに
http://localhost:8080
と入力してApacheのページが出てきたら成功です。
「現在のコンテキストに‘Properties’という名前は存在しません」というエラーが発生したら

　C#をお使いの皆さんは、今までProperties.Resourcesというコードの使用において、「現在のコンテキストに‘Properties’という名前は存在しません」と言うエラーに遭遇したことはありませんか？

　原因は、名前空間（namespace）にあります。実は“Properties.Resources”の‘Properties’は名前空間の一部なのです。


![問題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/5a4bb076-f2a9-60dc-6e3d-66c8215b3364.png)

　
　解決方法は、次の図のように‘Properties’の前に、“プロジェクト作成時”の「プロジェクト名」を加えることで、正しい名前空間となり、問題が解決します。（プロジェクト作成時のプロジェクト名がProject1ならば、‘Properties’の前に‘Project1.’を加ええ、‘Project1.Properties’とすることで、正しいにひとつの名前空間になるのです。）
　通常、VisualStudioでWindowsフォームアプリケーション(.NET Framework)やコンソールアプリ(.NET Framework)でプロジェクトを作った場合は、プロジェクト名と名前空間は同じになるため、このような問題は発生しないと思いますが、当方、「空のプロジェクト(.NET Framework)」からプロジェクトを作成したため、プロジェクト名と名前空間が別々になり、また更にプロジェクト名を途中で変更していたため、更に問題が複雑化していました（プロジェクト名を変更しても、‘Resources（Resources.Designer.cs）’の中の名前空間は変更されないため）。

![答え２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/da535012-d836-791e-62d4-ddf409fe03b2.png)

以下、この事象が発生した経過です。（経過の羅列なので、役に立つかわかりませんが、、、）
![手順１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/6810a151-24da-e018-5b77-51cec21a7277.png)

![手順２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/b21b1656-5f78-c207-2f54-f9fdaec46dea.png)

![手順３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/cf1087cf-5cd7-54d9-a8a5-7d8ae27092df.png)

![手順４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/0dc3fc17-972a-6e60-2758-93bbf76cb7c1.png)





![手順６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/f1e48bdf-5e1e-fd0e-30b6-83886c6e120d.png)


![手順.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/b2022190-67a9-08be-6ee1-0f38e78551be.png)

![手順７.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/6923bd2a-d157-ef4b-8b9a-e9b891e500e6.png)


![手順８.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/66b204fb-1356-849f-d766-a1a9462a9666.png)


![手順９.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/07e077a9-d769-7db9-f9c2-0fecd43b5b73.png)


![手順１０.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/b7a1e8f9-7efd-ee87-b657-6a4322a5ffeb.png)


![手順１１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/030f0326-d644-10fc-d284-de737f7bab2d.png)


![手順１２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/fe74d5ce-4fab-269f-59d1-be3bb14b51d9.png)


![問題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501068/5e35c401-22b8-28b7-034d-6c2eeed5f57f.png)
tensorflow(tf-keras)でGPU計算の再現性を確保する方法のメモ

# はじめに

本記事はtensorflow（tensorflow-keras）でGPUを使用した計算をする際に再現性を確保する方法のメモ。
※ ここに記載するGPUの計算順の固定方法はtensorflow-gpuが1.14, 1.15, 2.0の場合のみで使用可能
※ その他のバージョンの場合は参考のリンク先でやり方を見る

# 実行環境

* Ubuntu18.04LTS
* CUDA 10.0
* cudnn 7.6.5
* anaconda3-2019.10
* tensorflow-gpu 1.15.2 / 2.0.0

# 再現性の確保に必要なこと

* 乱数を使用する場合は、乱数の固定
* GPUを使用する場合は、計算順の固定

# やったこと

* randomのseed値の固定
* np.random.seedのseed値を固定
* tf.random.set_seedのseed値を固定
* tensorflow-determinismを使用してGPUの計算順を固定（※）
※ 冒頭にも書いたがtensorflow-gpuが1.14, 1.15, 2.0の場合は次の手順で固定可能

# 手順

① tensorflow-determinismのインストール

```terminal:terminal
pip install tensorflow-determinism
```
② ソースコード上でGPUの計算順序の固定を記述

```python:main.py
import tensorflow as tf
from tfdeterminism import patch
patch()
```
③ 乱数のseed値の固定

```python:main.py
import random
import numpy as np

random_seed = 0 #任意のseed値を設定

random.seed(random_seed)
np.random.seed(random_seed)
tf.random.set_seed(random_seed)
```
以上の手順で、GPU計算の再現性を確保ができる。

# 参考

https://github.com/NVIDIA/tensorflow-determinism
Dockerでannotateを起動させる手順

#はじめに
annotateは現在のスキーマでまとめたコメントを、それぞれの上部または下部に追加しするとを知り「これは便利♪」ということで導入
Dockerでの導入でしたがうまく起動せず躓いてしまったため備忘録的に書こうと思いました。
#解決した手順
▼開発時に使うものなので**development**内に記載します

```Gemfile.rb
group :development do
  gem "annotate"
end
```

▼インストールしてコンテナを再作成

```
$docker-compose build
$docker-compose up -d
original_db_1 is up-to-date
Recreating original_web_1 ... done

```

▼migrationをトリガーに実行するように設定ファイルを生成


```ターミナル:ターミナル
docker-compose exec web bundle exec rails g annotate:install
```


▼Gemの実行

```ターミナル:ターミナル
docker-compose exec web bundle exec annotate
```


これでannotateが実行されコメントが追加されるとうになりました！

#躓いた箇所
本来

```ターミナル:ターミナル
docker-compose exec web bundle exec annotate
```
実行すればコメントは表示されるはずだったのですが表示されず
戸惑ってしまいした...
ちなみにDocker toolboxは使っていません

結果的に

```ターミナル:ターミナル

docker-compose exec web bundle exec rails g annotate:install
```
を先に実行する必要があり無事解決しました


#まとめ
annotateを初めて知った時は感度しました！
今までテーブルを確認する時はいちいちDBに潜っていましたからね...
間違っている箇所がありましたらご指摘ください
参考になれば幸いです
GoogleDriveFileStreamを使ってみる

- 環境
    - Windows10 64bit バージョン1903

GSuiteを契約しているとGoogleDriveFileStreamを使ってローカル環境でGoogleDriveにあるファイルを共有フォルダ含めてエクスプローラで使うことができる。

# インストールする
1. [ドライブ ファイル ストリームを導入する - G Suite 管理者 ヘルプ](https://support.google.com/a/answer/7491144?hl=ja)にある[今すぐダウンロード]ボタンでEXEファイルをダウンロードする
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/1f3ed1b1-aa71-6be5-5f85-3f0b1c03d343.png)
2. ダウンロードしたEXEファイルを起動して、表示される画面の案内に従っていけばインストールできる
3. インストールするとGドライブにGoogleDriveが同期される
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/1b6dc6d7-3195-d5bd-90b2-83d2a6439180.png)

# オンラインで使用するように設定する
ネットワークにつながっている環境であればオンラインで使用するのがおすすめ。
> ドライブのファイルをクラウドから Mac や Windows パソコンに直接ストリーミングして、ディスクの空き容量とネットワーク帯域幅を解放できます。ドライブのファイルはクラウドに保存されているため、自分や共同編集者が加えた変更はすべての場所で自動的に更新され、常に最新版のファイルにアクセスできます。
> [ドライブ ファイル ストリームを導入する - G Suite 管理者 ヘルプ](https://support.google.com/a/answer/7491144?hl=ja)

1. 同期しているフォルダを右クリック
2. [ドライブ ファイル ストリーム] > [オンラインでのみ使用可能にする]にチェックを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/078196b8-0706-8df0-65f7-9652dcbc5d11.png)


## Macで使用する場合は、Spotlight検索対象から外したほうがいいかも
私は、Macで使用していないのだが注意が必要かも
[Google Drive File Streamがファイルを無限にダウンロードし続けるので、Spotlightの検索対象から外してみた - in between days](https://mohritaroh.hateblo.jp/entry/2019/02/13/114000)

# オフラインで使用するように設定する
ネットワークにつながらない環境下でファイルを使用する場合は、使用対象のファイルやディレクトリをこの設定にする。
> ドライブ ファイルをオフラインで利用できるようにすることも可能です。これらのキャッシュに保存されたファイルは、オンラインになれば再びクラウドに同期されるため、すべてのデバイスで最新バージョンを利用できます。
> [ドライブ ファイル ストリームを導入する - G Suite 管理者 ヘルプ](https://support.google.com/a/answer/7491144?hl=ja)

共有ドライブも同期されているので、ファイルをすべてダウンロードした状態で使うとメモリが枯渇する。
ネットワークにつなげられない時間に使うファイルやディレクトリだけこの設定をする。

1. 使用対象フォルダまたはファイルを右クリック
2. [ドライブ ファイル ストリーム] > [オフラインで使用可能にする]にチェックを入れる
PostgreSQLの便利なSQL達

# PostgreSQLの便利なSQL達

## 目的
自分メモと新卒応援でもあります。
追加予定あり。
追加してほしいものがあれば、コメントによろしくお願いいたします。


## テーブル情報の取得
```
SELECT 
        * 
FROM 
        information_schema.columns 
WHERE 
        table_name = 'テーブル名' 
ORDER BY 
        ordinal_position;
```

## View定義の取得
```
 SELECT definition FROM pg_views WHERE viewname = 'View名';
```

Viewとは以下を参照ください。
https://wa3.i-3-i.info/word17908.html


## 全View名の取得
```
SELECT viewname, definition FROM pg_views ;
```


## カラム検索
```
select table_name, column_name from information_schema.columns where column_name ='検索するカラム名';
```

## 他方にないレコード検索
```
select * from 売上 left outer join 顧客 on (売上.顧客CD = 顧客.顧客CD)
where 顧客.顧客CD is null
```
【Rails】ポケモンのような「経験値に連動して、レベルアップする機能」を実装したい！

## 自己紹介
- 現在プログラミングの学習中の者です
- 言い回しや知識に関して、諸所間違い等あるかと思います
- その際は、ご指摘いただけますと幸いです

## やりたいこと
Railsでポケモンのように「経験値に連動して、レベルアップする機能」を実装すること。

## 問題点
どのようにテーブルを設計するのかわからない。

## 結論
では早速参ります。
###1.テーブル設計
- モデル名：User、カラム名：level, experience_point
- モデル名：LevelSetting、カラム名：level, thresold

以上、２つのモデルを作成してください。名称はお任せします。
但し、データ型は全てintegerでお願いします。

ちなみに、ここで**Userのlevelカラムのdefaultを1にして、experience_pointのdefaultを0にする**ことをお勧めします。（nilだと「加算」の時にエラーが起こりやすいため）
db:migrate前にマイグレーションファイルに追記するだけなので、是非調べてみてください。

```
rails g model [レベルアップさせたいもの] level:integer experience_point:integer
```
こんな感じになります。

###2.考え方の説明（できれば先に読んで欲しい）
全部設定してから考え方を知りたい！と言う方は３にお進みください。

**まず、どのようにして「経験値に連動して、レベルアップする」のかをご説明します。**
ここが先に頭に入っていると、処理の意味が理解しやすいからです。

***
レベルと経験値を持たせたいモデルをA、レベルと閾値のモデルをBとします。
※閾値：そのレベルになるために最低限必要なポイントだと思ってください。

Aのモデルを「レベルアップ」させるためには、何か**基準**が必要です。
例えば、ポケモンにおいては、レベルアップするために必要なものが経験値として定まっていますね。
今回、その基準の役割をしているのがBのモデルになります。

Bのモデルにはレベルと対応する閾値を設定したレコードをあらかじめ作っておきます。
例）
Level 2, thresold 50
Level 3, thresold 100
.
.
.
といった感じで。
私の場合ユーザーのデフォルトのレベルを1にしているので、2から作成しています。

さぁこれでどうするかと言うと、**Aのモデルに経験値が加算される処理のタイミングで、このBのモデルの閾値（thresold）を合計の経験値と比較させる処理をすることで、次のレベルにアップできるかどうかを判定させます。**

…難しいですね。
今はもやっとしたままで大丈夫です！
これを頭の片隅に置いたまま、次に進んでください。

###3.実際の処理
```users_conteroller.rb
def levelUp
  user = User.find(params[:id])
  monster = Monster.find(params[:monster_id])
  #この二行は適当なものに置き換えてください。

  totalExp = user.experience_point
  #変数に現在のユーザーの経験値を入れる
  totalExp += monster.point
  # 得られた経験値をユーザーの経験値に加算
  
  user.experience_point = totalExp
  #改めて、加算した経験値をuserの総経験値を示す変数に入れ直す
  user.update(experience_point: totalExp)
  #更新の処理をさせる

  levelSetting = LevelSetting.find_by(level: user.level + 1);
  #ここから重要です！レベルセッティングのモデルから、今の自分のレベルより1高いレコードを探させます。
  #そしてそれを変数に入れておきます
  
  if levelSetting.thresold <= user.experience_point
  #探してきたレコードの閾値よりもユーザーの総経験値が高かった場合
    user.level = user.level + 1
    user.update(level: user.level)
  #レベルを1増やして更新
  end
end
```
もっといい書き方があるor必要ないものがあると思いますが、エラーをつぶしていった結果こちらでうまくいったので、今回はこのコードとさせていただきます。

monster.pointの部分は「経験値が得られる処理」であればなんでも構いません。

## 所感
経験値に連動するレベルアップの機能を実装しようとした際に、様々な方法で検索しましたが「エンジニアとしてのスキルをレベルアップ」「経験がなくても〜」といった記事に沢山引っ掛かったのでまとめてみました。

よく分からない部分も多いかと思うので、コメントを頂ければ時間のある時に返答させていただきます。

ここまで読んでいただき、ありがとうございました。
Hexoに、この3項目(とオプションの1項目)を設定すれば、ブログサイトができた。

Hexo+GitHub PagesとかHexo+GitHub+Netlifyでブログを作成する手順は、既にたくさん書かれていると思いますので、そちらを見てください。

本当に簡単にブログサイトができるんですけど、ある程度は設定しないと

- ブログのタイトルがHexo
- 作者がJohn Doe
- せっかくtwitterで共有してもらっても、ぜんぜん違うURLになった

になってしまいますので、そうならないように最低限、これだけはどうしても設定しないといけない項目をまとめました。

<dl>
  <dt>設定する項目</dt>
  <dd>タイトル</dd>
  <dd>作者</dd>
  <dd>共有ボタンでリンクするURL</dd>
  <dt>オプションの項目</dt>
  <dd>言語</dd>
</dl>

他にも、これは設定しないとまずい、という項目があれば、ぜひ教えてください。

# 設定する項目

## タイトル

### 設定する場所

ブログの設定ファイル(/_config.yml)のtitle項目に、ブログのタイトルを設定します。

### 設定の影響

設定したタイトルが、サイトのヘッダに表示されます。

### 設定しない場合

初期設定値がHexoなので、Hexoというタイトルが表示されます。

## 作者

### 設定する場所

ブログの設定ファイル(/_config.yml)のauthor項目に、作者名を設定します。

### 設定の影響

設定した作者が、サイトのフッタのコピーライトに書かれます。

### 設定しない場合

初期設定値がJohn Doeなので、John Doeのコピーライトが表示されます。

## 共有リンクするURL

### 設定する場所

ブログの設定ファイル(/_config.yml)のurl項目に、ブラグサイトのurlを設定します。

### 設定の影響

共有リンクからtwitterなどに共有するときのurlになります。

### 設定しない場合

初期設定値が<http://yoursite.com>なので、<http://yoursite.com>が共有されます。

# オプションの項目

## 言語

### 設定する場所

ブログの設定ファイル(/_config.yml)のlanguage項目に、日本語の場合はjaを設定します。

### 設定の影響

- twitterなどに共有するリンクが、共有になります。
- 画面の右側が、タグ、タグクラウド、アーカイブ、最近の投稿と日本語で表示されます。

他にも影響があるかもしれませんが、見つけられていません。

### 設定しない場合

初期設定はenです。画面の表記が英語になります。
なぜ、データ分析は費用対効果が悪いのか？

# データのブームはなんども起こり、なんども終わっています。

### なぜブームは終わるのか？
データマイニングにはじまって、ビッグデータと、データのブームはなんども起こっています。オープンデータも、一時もりあがりました。でも、データを使って何か成果を上げているのでしょうか？　データを分析する労力に比して成果があがっていないように思えます。それはなぜでしょうか？　ちょうどコロナウイルスの感染状況を見るオープンデータのサイトがアップされて話題になりました。対応の迅速からいって素晴らしいとは思います。ただ、問題があります。**データが公開されたら、感染はおさまるのでしょうか？**　そんなことはありません。**データに基づいた行動が必要です。** 　オープンデータが活用されないのは、行動が起こる部分が意識されていなかったからです。多くのデータが公開されましたが、**そのデータに基づいて何か生産的な行動をとることができなかったからです。なぜ生産的な行動がとれないかは、はっきりしています。コロナの場合で言えば、単純な感染数などでは、現状がわかるだけです。感染数が多いから、対策をうたなくてはいけない、まではわかりますが、どんな行動が効果的かまでは示してくれません。** データが活用できると素晴らしいはずだという期待は裏切られます。それでブームはさります。

### なぜブームがなんども始まるのか？
ビッグデータや、オープンデータのようなブームがなんども起こるのは謎に思えるでしょう。ただ、**なんかデータがあるとよいことがあるという本能的な期待があるのではないでしょうか？　そうでないと説明がつきません。それは簡単に説明がつきます。** 製造業ではデータに基づく予想は非常に役立ちます。物流、在庫管理、生産管理のあらゆる分野でデータ解析は役立ちます。金融でもそうでしょう。データに基づく予測は、適切に機能する領域なら非常によく機能し、データを取る必要があるかないかなど議論になりません。それで、潜在意識的にデータは重要だと思っているのでしょう。ただ、**データが重要だと思うのは潜在意識的なので適用できない分野にも無意識に適用できると過度の期待**をもつのではないでしょうか？

### どうしたらいいかは、なぜなぜ分析にヒントあり
行動に影響を与えるデータ分析は、適切な問い（なぜ）からはじまる必要があります。漠然とデータを眺めていても有益な知見を得ることができません。参考になる発想は、[なぜなぜ分析](https://ja.wikipedia.org/wiki/%E3%81%AA%E3%81%9C%E3%81%AA%E3%81%9C%E5%88%86%E6%9E%90)です。トヨタが原点の問題解決手法です。ただ、なぜなぜ分析は、課題が発生してから行うものなので、データから、逆に問題点を発見するのは難しいです。それでどうしたらいいかですが、まず、明らかなテーマを選び、その観点からデータを分析します。貿易統計とコロナの問題では、『サプライチェーンで問題となるのはどこか？』とい観点を設定します。一国集中している国と代替国はどこになるかを調べます。こういった観点を持てば、現時点で存在しているデータも課題解決の宝庫になるでしょう。
【Day47】積み上げ日記

##予定
■SQL基礎終了
−Progate

■Ruby基礎　1/2
−Progate
##完了
■SQL基礎終了
−Progate

■Ruby基礎　1/4
−Progate

##学習時間
4h

##学習ポイント
【SQL】
■テーブルにデータを追加したい時
INSERT INTO テーブル名 ( id, name, course )
VALUES ( 4, “Kate”, “Java”)
※ ここでいう id は、自動入力可（AUTO INCREMENT)なので、省略OK

■データを更新したい時
UPDATE テーブル名
SET name=“Jordan” , course=“HTML”
WHERE id = 6

■データを削除したい時
DELETE FROM テーブル名
WHERE id = 6

【Ruby】
■コンソールに出力する時
Puts

■文字列の途中に変数を入れたい時
　#{変数}
→数値と文字列を足し算で連結が不可能なため必要

■条件式はifとend、それ以外を①else、②elsifで囲む
※elsifは何回でも使ってOK

■比較演算子
a==b 等しい時
a!=b 異なる時

■かつ
&&

■または
||

■倍数を調べたい時
% 3  ==0 

■複数の値を管理する方法
配列　≒  ハッシュ
配列：並べて管理する（大まかに）
ハッシュ：名前をつけて管理する（細かく）

※ハッシュは “” でも : でも置き換えらえれる。

■nil＝何もない

##疑問点
■現場では配列とハッシュのどちらが多く使われているのか？
■倍数を調べたいときは具体的にどういったシチュエーションなのか？

##計画通り進んだか？
進んでいない。Rubyは構造がシンプルでコードを書いていて非常にわかりやすい。単純に今日時間の確保がうまく行っていなかった。なぜ時間の確保ができなかったか。それ以外の雑務に時間を撮ってしまった。明日は足りていない分をしっかり補完する。
ベジェ曲線が苦手でもOK!Illustratorで和風な雲を作る

![eyecatchptn2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/22204169-95d8-96b2-df78-f779d9888a99.png)

和テイストのデザインを作成する時に、雲の模様が添えられているだけで、雅な雰囲気がぐんとアップします。
きれいなベジェ曲線が描けないという方でも簡単にできるので、試してみてください！

#1.適当な直線を引く

![1_直線を引く.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/1a2f5a5c-77f6-e397-6ff4-610014f3720f.png)

直線ツールで水平方向の直線を適当に引きます。

#2.線幅と線端を設定

![2_選の太さ、線端.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/2a382a90-becf-e175-e3b7-f4d8d813cabd.png)

線幅(線の太さ)をお好みの太さに、線端を「丸形線端」にします。

#3.1～2を繰り返す

![3_繰り返す.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/a280c7eb-770f-d78b-4f16-6d7243ec83a6.png)

1.～2.の手順で同様のパーツを2つ以上のお好みの数だけ作ります。

#4.アウトライン化する

![4_アウトライン化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/f58ece4f-1c39-1abb-71e7-1ebcb3fb6c6a.png)

作ったパーツを全て選択し、`オブジェクト(O)` > `パス(P)` > `パスのアウトライン(U)`を選択します。

#5.雲に見えるように配置する

![5_配置.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/b4ddcab5-5c4a-8e62-592c-1689ac8efaef.png)

バランスを見ながら配置を変えていきます。
わざと不規則でアンバランスな配置にすると雲っぽくなります。

#6.パーツを合体させる

![6_合体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/e67e4e26-fa6c-9c54-8dae-2c31274b9dd5.png)

パーツを全て選択し、パスファインダーの「合体」で1つのパーツにします。

#7.塗りや線を調整

塗りや線を好みで調整します。
無地でも良いですが、塗りを透明にして枠線だけにしたり、控え目なパターンで塗りつぶしたりしても可愛いです。

![雲のサンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/039ef894-d048-fc3f-f582-737399deda95.png)
Laravel MySQL SQLSTATE[HY000] [1049] Unknown database が出た時に確認すること

## 目的

- 自分がよくやらかすミスなので確認する内容をまとめる

## 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いて導入 |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |


## エラー内容

- Laravelアプリのマイグレート時やアプリからのDBアクセス時にターミナルやブラウザ情に下記エラーが表示される。
    -「SQLSTATE[HY000] [1049] Unknown database 'データベース名'」

## 解決方法その1 MySQLの再起動

1. 下記コマンドを実行してMySQLの再起動を実施する。

    ```terminal
    $ mysql.serve restart
    ```

## 解決方法その2 データベース名の記載の確認

1. 下記コマンドを実行してMySQLのターミナルを開く。(MySQLのrootユーザのパスワードがわからなくなってしまった方はこちら→[MySQL 8.0.18 のrootパスワードを忘れた時のリセット方法](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d))

    ```terminal
    $ mysql -u root -p
    ```
1. 下記コマンドを実行して現在存在するデータベース名を出力する。

    ```mysql
    mysql> show databases;
    ```
1. 別のターミナルを開き、アプリ名ディレクトリで下記コマンドを実行する。

    ```terminal
    vi .env
    ```
1. 「.env」の`DB_DATABASE=`の後に記載しているデータベース名が先にコマンド`show databases;`で出力されたものと一致しているか確認する。
1. 別のターミナルを開き、アプリ名ディレクトリで下記コマンドを実行する。

    ```terminal
    $ vi config/database.php
    ```
1. 「config/database.php」の「mysql」の`'database' => env('DB_DATABASE', 'データベース名'),`のデータベース名部分の記載が、先にコマンド`show databases;`で出力されたものと一致しているか確認する。

## 確認方法その3 MySQLのユーザ名とパスワードの確認

1. アプリ名ディレクトリで下記コマンドを実行して「.env」ファイルを開く

    ```terminal
    $ vi .env
    ```
1. 「DB_USERNAME=」「DB_PASSWORD=」の後に記載されている内容に誤りがない事を確認する。
1. アプリ名ディレクトリで下記コマンドを実行して「config/database.php」ファイルを開く。

    ```terminal
    $ vi config/database.php
    ```
1. 「'username' =>」「'password' =>」の後に記載されている内容に誤りがない事を確認する。
PyGithubを使ってジョンズホプキンス大学がGitHub上に公開している新型コロナウイルス感染状況のファイルを取得するサンプル 

PyGithubを使って、GitHub上のファイルを取得するサンプル。

# はじめに
世界的に関心の高い新型コロナウイルスの感染状況のデータをジョンズホプキンス大学がGitHub↓に公開しているので

https://github.com/CSSEGISandData/COVID-19/tree/master/csse_covid_19_data/csse_covid_19_daily_reports

から日々のデータを取得してみる。

なお既に存在するファイルの場合は取得しない。
取得してわかったけどヘッダ情報も集計データも途中で変わっちゃうんだよね。
この後のデータ項目の名寄せ処理がめんどくさそう・・・

# 【前提】
Python3環境が構築済であること。
開発環境構築時に以下のコマンドで利用モジュールの取得が必要。

~~~
pip install PyGithub
~~~

また、Githubにアカウントを持っていて個人用アクセスtorken を取得しておくことも必要。
取得方法は下記参照
https://help.github.com/ja/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line
セキュリティ上の理由から、 GitHub は過去 1 年間使用されていない個人アクセストークンを自動的に削除しますので注意してくださいね。

# 以下ソースです

pythonの処理内容はコメントみればわかると思いますので特に解説不要でしょうか？

~~~get_csse_covid_19_daily_reports.py
# -*- coding: utf-8 -*-
# 必要モジュールのインポート
import os.path
import base64
from github import Github
#　アクセストークンの作成方法は下記参照
# https://help.github.com/ja/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line
token = "******your_token******"

repository = "CSSEGISandData/COVID-19"
dir_path = "csse_covid_19_data/csse_covid_19_daily_reports"

#################################################################
# 指定したディレクトリのファイルを取得
#################################################################
def get_file(dir_path):

    g = Github(token)

    repo = g.get_repo(repository)

    contents = repo.get_contents(dir_path)

    #コンテンツがなくなるまで処理
    while contents:
        file_content = contents.pop(0)

        # 指定したディレクトリの下にディレクトリが無いか念のため確認
        if file_content.type == "dir":
            contents.extend(repo.get_contents(file_content.path))
            print(file_content.path)

        else:
            # 最後の4文字が .csv のファイルのみ取得
            if file_content.path[-4:] == ".csv":

                # ローカルにファイルが存在しない場合のみ追加
                if os.path.exists(file_content.path) == False:
                    print ("ファイル追加 ： " + file_content.path)
                    file_contents = repo.get_contents(file_content.path)

                    # コンテンツの中身はBase64でデコードする。理由は↓参照
                    # https://developer.github.com/v3/repos/contents/
                    content = base64.b64decode(file_contents.content)

                    # ローカルのファイルを追加
                    with open(file_content.path, mode="wb") as f:
                        f.write(content)

    return("ｷﾀ―――(ﾟ∀ﾟ)―――― !!")

def main():
        result = get_file(dir_path)
        print(result)

if __name__ == "__main__":
    main()

~~~

https://github.com/goodboymax/covid19 にも格納しています。

## 【参考】
https://haibara-works.hatenablog.com/entry/2019/10/01/132916
https://help.github.com/ja/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line
https://developer.github.com/v3/repos/contents/
Seleniumを使用し自動ログイン、データ収集

>PythonによるWebスクレイピング〜入門編〜【業務効率化への第一歩】の6-8勉強メモ
https://www.udemy.com/course/python-scraping-beginner/
 

##(基本設定)Seleniumからwebdriverをimport
```
from selenium import webdriver
```
##Chromeを開いて、対象URLを開く
```
browser = webdriver.Chrome()
browser.get('https://scraping-for-beginner.herokuapp.com/login_page')
```

#Seleniumを使用し自動ログイン~Username/Passwordを自動入力
## フォームのidを取得

該当ページのフォーム部分のidを開発ツールを使用し取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68847/6ad1f4e5-933e-f330-476e-976ee1031bd2.png)

###調査結果
usernameのidが、username、passwordのidがpasswordであることが判明。

##Username自動ログイン手順

```
#Browserで　usernameという　id elementをさがして、要素usernameにkey(hogehoge)というkeyを打ち込む

elem_username = browser.find_element_by_id('username')
elem_username.send_keys('hogehoge')

```
##Password自動ログイン手順

```
##Browserで　passwordという　id elementをさがして、要素passwordにkey(hogehoge)というkeyを打ち込む
elem_password = browser.find_element_by_id('password')
elem_password.send_keys('hogehoge')
```

## ログイン処理

```
#ログイン処理
elem_login_btn = browser.find_element_by_id('login-btn')
#ボタンを押す処理
elem_login_btn.click()
```
### ここまですべて
```
browser = webdriver.Chrome()
browser.get('https://scraping-for-beginner.herokuapp.com/login_page')

# 要素を指定 browserで　usernameという　id elementをさがして
elem_username = browser.find_element_by_id('username')
#elem userにkey(~~~~)というkeyを打ち込んで
elem_username.send_keys('imanishi')

elem_password = browser.find_element_by_id('password')
elem_password.send_keys('kohei')

# ログイン処理
elem_login_btn = browser.find_element_by_id('login-btn')
# ボタンを押す処理
elem_login_btn.click()

```

#データ収集
```
##hobbyというelementを探し、「elem.text」で取得内容を出力
elem = browser.find_element_by_id('hobby')
elem.text
```
結果が下記のように改行が含まれているので、改行を削除

```
'バスケットボール\n読書\nガジェット集め'
```
##改行削除
```
#elem.textをhobbyという変数に格納し、replace関数を使用し改行を,に変更
hobby = elem.text
hobby.replace('\n',',')
```
結果

```
'バスケットボール,読書,ガジェット集め'
```

#Browserを閉じる
```
browser.quit()`
```
Google Cloud Platform (GCP)サービスの正式名称・略称・読み方まとめ#13(メディアとゲーム)

Google Cloud Platform (GCP)のサービスで正式名称や略称はともかく、読み方がわからずに困ることがよくあるのでまとめてみました。


クラウド コンピューティング サービス  |  Google Cloud
https://cloud.google.com/?hl=ja



## まとめルール

まとめルールについては下記を参考ください。

Google Cloud Platform (GCP)サービスの正式名称・略称・読み方まとめ#1(AI と機械学習/AI ビルディング ブロック) - Qiita
https://qiita.com/kai_kou/items/fa930eef23470c2f8f0b


## Amazon Web Services (AWS)のまとめはこちら！

Amazon Web Services (AWS)サービスの正式名称・略称・読み方チートシート - Qiita
https://qiita.com/kai_kou/items/cb29d261c8acc49fd22a

Amazon Web Services (AWS)サービスの正式名称・略称・読み方まとめ #1 (コンピューティング) - Qiita
https://qiita.com/kai_kou/items/a6795dbab7e707b0d1a6


## 概要について

サービス一覧ベージの概要を引用しています。

プロダクトとサービス  |  Google Cloud
https://cloud.google.com/products?hl=ja#product-launch-stages


間違いや、こんな呼び方あるよーなどありましたらコメントお願いします！


## Media and Gaming - メディアとゲーム

### Google Cloud Game Servers (alpha)

世界中のプレーヤーにシームレスなマルチプレーヤー型ゲーム体験を提供します。

- 正式名称: Google Cloud Game Servers
- https://cloud.google.com/game-servers
- 読み方: グーグル クラウド ゲーム サーバ
- 略称: なし
- 俗称: なし


### Anvato

ライブ動画やオンデマンド動画を任意のデバイスにストリーミングします。

- 正式名称: Anvato
- https://www.anvato.com/
- 読み方: アンバト or エンバト ？
- 略称: なし
- 俗称: なし


### Zync Render

3D モデリング ツールから直接、迅速かつ経済的にレンダリングします。

- 正式名称: Zync Render
- https://www.zyncrender.com/
- 読み方: ジンク レンダー ？
- 略称: なし
- 俗称: なし



### OpenCue

メディア コンテンツ用のオープンソース レンダー マネージャー。

- 正式名称: OpenCue
- https://cloud.google.com/opencue
- 読み方: オープンキュー？
- 略称: なし
- 俗称: なし
Houdini VEXメモ

vexの頻度の高い内容をメモ書き ➀ －加筆中－

[HIPファイル](https://github.com/DefultVFX/houdini/blob/master/houdiniVEX1.v1.hipnc)

#データ型

```
int     a  = 2;
float   b  = 2.1;
vector  c  = (2.1, 2.1, 2.1);
vector2 c2 = (2.1, 2.1);
string  d  = "two";
matrix3 m3 = { {1,1,1}, {2,2,2}, {3,3,3} };
matrix  m4 = { {1,1,1,1}, {2,2,2,2}, {3,3,3,3}, {4,4,4,4} };
```

#配列
```
int     a[]  = {1, 2, 3};
float   b[]  = {1.1, 2.1, 3.1};
vector  c[]  = {{1.0, 1.0, 1.0}, {2.0, 2.0, 2.0}};
vector2 c2[] = {{1.0, 1.0}, {2.0, 2.0}};
string  d[]  = {"one", "two", "three"};
```

#アトリビュートの型指定
```
i@a  = 2;
f@b  = 2.1;
v@c  = (2.1, 2.1, 2.1);
u@c2 = (2.0, 2.0);
s@d  = "two";
3@m3 = { {1,1,1,}, {2,2,2}, {3,3,3} };
4@m4 = { {1,1,1,1}, {2,2,2,2}, {3,3,3,3}, {4,4,4,4} };
```

#頻度の高い関数

###ch()　チャンネルの値

```
float colorRed   = ch("red");
float colorGreen = ch("green");
float colorBlue  = ch("blue");

v@Cd = set( colorRed, colorGreen, colorBlue );
```

###chv()　vectorチャンネルの値

```
vector translate= chv("translate");
```

###chramp()　ランプの値
floatまたはvectorの値を出力する
入力値は0～1に収めないといけない

```
float red = chramp("red",@P.y); 
@Cd = set(red, 0, 0); 
```

もし0以下や1以上の値を入力するとリピートした値が出力される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615517/2776607f-ce81-ee6a-4b65-898dcca620c2.png)


カラーランプ（vector）の値を出力させたい時は、vectorを指定

```
vector color = vector(chramp("color",@P.y)); 
@Cd = color;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615517/732d21a4-3ffd-0bdf-feb5-f549ee700887.png)

###fit() 範囲指定して別の範囲にラッピング

```
@P.y = fit(@P.y, -0.35, 0.35, 0, 1);
```


###fit01()
###rand()　０～１の乱数
floatやvectorの型に合わせて出力してくれる

```
@Cd = set(rand(i@primnum), 0, 0);
@Cd = rand(i@primnum);
```
###relbbox()　バウンディングボックス（０～１）の相対位置

```
@Cd = relbbox(0, @P);
```
###getbbox_size()　バウンディングボックスのサイズ

```
vector v = getbbox_size(0);
printf("%f", v);
```
###getbbox_center()　バウンディングボックスの中心

```
vector center = getbbox_center(0);
printf("%f", center);
```

###addpoint() ポイントの追加

```
addpoint(0, set(0, 0, 0));
```

###removepoint()　ポイントの削除

```
removepoint(0,i@ptnum);
```

###removepoint()　ポイントの参照
ノードパスを指定したい場合は、op:をパスに付ける

```
vector getPosition = point(0, "P", 0);
printf("input 0    %f \n",getPosition);

getPosition = point('op:/obj/func_point/transform1', "P", 0);
printf("input path %f \n",getPosition);
```

###maketransform() トランスフォームマトリックス
パラメータが特に多いので難しく感じるけど、transformノードと一緒で移動、回転、スケールを入れるだけ
赤がtransformで緑がmaketransform、両方とも同じ値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615517/9e2fef6e-0355-36dc-ebe3-ace4c31f7308.png)


```
vector translate= chv("translate");
vector rotate   = chv("rotate");
vector scale    = chv("scale");
vector pivot    = chv("pivot");

@P *= maketransform(0,0, translate, rotate, scale, pivot);
```
Vuetifyのテキストエリア(v-textarea)内のカーソル位置に文字列を挿入する

# はじめに

テキストエリア内の文字列に、何か別の文字列を挿入したいという場合がある。

例えば、お客様に送信する定形メールでは、お客様の名前は、`%name%`などとして送信時に置換する。

この定型文を作成している場合に、置換文字一覧表でクリックしたら、自動的に定形メールが入力されているテキストエリアに挿入したい。

# Javascriptでの実現方法

Javascriptでは、以下のようにします。まとめていただいてありがとうございます。

* [JavaScript でテキストエリア内のカーソルのある位置に文字列を挿入する方法](https://qiita.com/noraworld/items/d6334a4f9b07792200a5)
* [JavaScript でテキストエリア内の文字列を書き換えた際に undo や redo が効くようにする](https://qiita.com/noraworld/items/020296f63f285ca2bd86)

# Vuetifyのv-textareaで実現する

Vuetifyは、色々とコンポーネント化がされています。v-textareaですとどう実現するのか？

結論からいうと、以下になります。

1. `v-textarea`に`ref`で参照するようにします。
2. `this.$refs.textarea.$refs.input`が実際の`textarea`タグを参照する。
3. execCommandで挿入する



```vue
<template>
<div id="app">
  <v-app id="inspire">
    <v-container fluid>
      <v-textarea
        ref="textarea"
        label="TextArea"
      ></v-textarea>
　　　<v-btn @click="execInsertText">Insert</v-btn>
  </v-app>
</div>
</template>

<script>
export default {
  data: () => ({
    insertText: '%insertChar%'
  }),
  methods: {
    execInsertText() {
      const textarea = this.$refs.textarea.$refs.input
      textarea.focus()
      document.execCommand('insertText', false, this.insertText)
    }
  }
}
</script>
```

# デモ

![2020-04-08_07h42_02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/24821227-14a6-8a2a-49ba-3c5329aacdfb.gif)


<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="1da2" data-slug-hash="dyYbpPg" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Insert character at Cursor position in Vuetify Textarea2">
  <span>See the Pen <a href="https://codepen.io/1da2/pen/dyYbpPg">
  Insert character at Cursor position in Vuetify Textarea2</a> by Shigehiro　IDANI (<a href="https://codepen.io/1da2">@1da2</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


# execCommandを使わない方法のデモ

こちらは、`execCommand`を使わない方法で実現しています。また、挿入後にフォーカス位置を挿入した文字の後に来るように調整をしています。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="1da2" data-slug-hash="RwWbROE" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Insert character at Cursor position in Vuetify Textarea">
  <span>See the Pen <a href="https://codepen.io/1da2/pen/RwWbROE">
  Insert character at Cursor position in Vuetify Textarea</a> by Shigehiro　IDANI (<a href="https://codepen.io/1da2">@1da2</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
【Go】log.Fatalは気軽に使わない

Goのエラーハンドリングでよく見る形のこんなコードを書いていました

```go
if err != nil {
    log.Fatal(err)
    return err
}
```

コレで試してみるとエラーのときに強制的にプログラム終了。。。


# 何が起こっていたか

`log.Fatal` の挙動を調べてみたらすぐに分かりました。

```go
// Fatal is equivalent to Print() followed by a call to os.Exit(1).
func Fatal(v ...interface{}) {
    std.Output(2, fmt.Sprint(v...))
    os.Exit(1)
}
```

`os.Exit(1)` でプログラムが終了してしまうみたい。。。

# ついでにログレベルを調べてみた

| ログレベル | 説明 | 例 |
|:-------|:------|:-----|
| emergency |システムが使用不可能な状態||
| fatal |致命的なエラー|プログラムの異常終了を伴うようなもの|
| alert |すぐに何らかの対処が必要|アプリケーションがダウン。Slackなどで通知するべき|
| critical |危機的な状態|予期しない例外|
| error |直ちに対処する必要のない実行時エラー||
| warning |エラーではないが例外的なもの|間違っていないが望ましくないものの使用|
| notice |正常だが、重要なもの||
| info |関心を寄せておきたいもの|ユーザーのログインやSQL|
| debug |開発中のデバッグ情報||
| trace |トレース情報。詳細な情報。||

この表はなんとなくイメージを掴むためのものなのでいろんなロギングツールを混ぜたものなので注意

言語ごとにログのライブラリがあるのでそれに準ずるのが良さそう。

参考
- [Java(log4j)](https://ja.wikipedia.org/wiki/Log4j#.E3.83.AD.E3.82.B0.E3.83.AC.E3.83.99.E3.83.AB)
- [PHP(PSR-3)](https://www.php-fig.org/psr/psr-3/)
- [Ruby](https://docs.ruby-lang.org/ja/latest/library/logger.html)
- [Python](https://docs.python.org/3.6/library/logging.html#levels)

# ちなみに
Goの標準パッケージであり `log` で定義されてるログを出力する関数は
- Print
- Fatal
- Panic
の3つしかない

外部パッケージや自作して適切なログレベルを定義していくのが良さそう。

参考
- [log - GoDoc](https://godoc.org/log)
VuePress で eslint を使いたい。


## 問題
`.vuepress` という隠しディレクトリ配下に Single File Component を書き込むことになります。しかし eslint を実行しても何もエラーが表示されません。

```
$ eslint project/docs/.vuepress/components/Sample.vue
/Users/user/project/docs/.vuepress/components/Sample.vue
  0:0  warning  File ignored because of a matching ignore pattern. Use "--no-ignore" to override
　　　　注意 ファイルは無視されました何故なら無視するパターンと一致したからです...

✖ 1 problem (0 errors, 1 warning)

$ 
```

これは eslint は、デフォルトで隠しディレクトリ配下を無視する設定になっています。そのため、コマンドを実行した場合は、無視しましたよ warning だけ表示されます。加えて連携させたいエディタ vim では何も表示されません。


## 解決策
これを避けるために `.eslintignore` を設定する必要があります。`!` は ignore の反対、無視するなよ、という意味らしいです。

```
!docs/.vuepress/
```

* [ESLint does not handle folders started from dot (e.g. /.tests). #8429](https://github.com/eslint/eslint/issues/8429)

これで無事に動くはずです。

```
$ eslint project/docs/.vuepress/components/Sample.vue
/Users/user/project/docs/.vuepress/components/Sample.vue

  112:9   error  'foo' is assigned a value but never used  no-unused-vars
  123:20  error  'var' is not defined                      no-undef

✖ 2 problems (2 errors, 0 warnings)

$
```
オフィス引っ越し　LANのループで一部の島がネット接続できなくなった

#2つのHAB　2つのLANケーブルが原因

■LANが床下をくぐっているから、2つのHAB　２つのLANケーブルにきがつかなかったみたい

HABにささっているLANがPCに比べて多い場合など要注意

■その他には
LANケーブルの両端が同じHABに刺さっている場合もLANのループでネット接続できなくなります。
初心者によるプログラミング学習ログ 284日目

#100日チャレンジの284日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
284日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>284日目　1h<br>・xdデザインカンプからのサイト模写<br>・メンターさんに課題提出<br>・昔つくったポートフォリオを改造（ほぼかきなおし）<br><br>残業してたからほとんどできなかった<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1247614554999156736?ref_src=twsrc%5Etfw">April 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
SEOのおはなし

<h1>はじめに</h1>
SEOの入門書を2冊程読んで3ヶ月くらいが経ち、そろそろアウトプットしなければと。


<h1>【SEOってなに？】</h1>
検索エンジン最適化（けんさくエンジンさいてきか、英: Search Engine Optimization, SEO、サーチ・エンジン・オプティマイゼーション）とは、検索エンジンのオーガニックな検索結果において特定のウェブサイトが上位に表示されるようウェブサイトの構成などを調整すること[1]。また、その手法の総称[2]。
wikipedia引用

そのままですが、
YahooやGoogleで検索した時、検索結果の上位にくるようにページを最適化することですね。

2017年にGoogleで行われた検索結果のクリック数の調査では、
1位 21.12%
10位 1.64%
という結果になっています。

同じページに表示されているのにこれだけ差があることを考えると
SEOの重要性がわかってきます。


<h1>【検索エンジンの仕組み】</h1>
これからGoogle向けの検索エンジンのお話をします。
『なぜGoogle？』と思うかもしれませんが、
実はYahooの検索エンジンもGoogleと同じ仕組みが使われています。
双方に対策ができるからです。


<h2>1.クローラーの存在</h2>
インターネットに公開されている情報にはクローラーというプログラムが巡回しています。
Webサイト内の文章やHTMLを読み込み、クローラーが認識します。
(画像はわかりやすいようにaltタグに説明を書いたりする)
このことをクローラビリティと呼びます。

クローラーで読み取ったWebサイトの情報はデータベースに保存されます。
(インデックスされると言います)

検索している人が正しい情報を入手できるように、
Webサイトでは適切な文章を書くことが大切です。

※SNSでのシェアはSEOに影響しません。

<h2>2.アップデート</h2>
検索アルゴリズムはアップデートされていき、これからもアップデートされていきます。
2012年に行われた大きなアップデートが2つあります。

<h3>・ペンギンアップデート</h3>
スパム行為やガイドライン違反の検索順位を下げるアップデート。
ガイドライン違反はコピペしただけ・意味のわからない文章を書く等が該当します。
(インデックスから削除されるケースもあります)

<h3>・パンダアップデート</h3>
情報が足りない・参考にならないサイトを検索結果に表示させなくするアップデート。
情報に間違いがない・正しい・見やすいことが大切です。


<h1>【キーワードのお話】</h1>
キーワード選びで重要なことは
・同じ言葉で使われているものがないか
・使われている言葉か
以上を意識することが大切です。

キーワードの種類は大きく2種類に分けられます。
<h2>・ビッグキーワード</h2>
パソコン・冷蔵庫など使用される回数の多いキーワードです。
Webサイトに多くの流入を期待できます。

<h2>・スモールキーワード</h2>
パソコン 中古 千葉県 のように検索すると、検索回数は少ないですが、
ビッグキーワードと比べ競争率は低く、購入につながりやすいです。


スモールキーワードを使ったSEOの考え方で、ロングテールという考え方があります。
・組み合わせで幅広く対応可能
・閲覧数は少ないが、購入してもらえる可能性が高い
ビッグキーワードより、顧客の的が絞れている点がメリットです。
過剰にキーワードを使うのは逆効果です。
違和感のないようにしましょう。


<h1>【内部対策】</h1>
・Googleのガイドラインを確認
ルールを破ればペナルティがあるので、目を通す必要がある。

・W3C勧告に従ったWebサイトを作る
W3Cという団体がWebサイトで使う技術の標準を示した仕様書です。
クローラー・ブラウザによって解釈が異なってしまうことを防ぎます。
下記でチェックができます。
https://validator.w3.org/unicorn/?ucn_lang=ja

・サイトを整える
パンくず・ジャンルに分けて整理整頓。

・レスポンシブ
Googleはスマホ向けサイトのデータを重視してインデックスしてます。
そのため、レスポンシブデザインを推奨しています。
Googleが提供してるモバイルフレンドリーテストを使えば、
どれだけスマホ対応できているかわかります。
https://search.google.com/test/mobile-friendly?hl=ja

・表示速度
SEOにおいてとても重要です。
PageSpeed Insightsを使えば、表示速度に点数を付けてくれます。
https://developers.google.com/speed/pagespeed/insights/?hl=JA

・１ページ１テーマ
絞ればキーワードが強化されます。

・HTMLタグを正しく使う
クローラーが読み取れるように正しく使いましょう。


(そろそろ眠くなってきた)


<h1>【外部対策】</h1>
自然に口コミを増やしていきます。
良質なコンテンツなら紹介してもらえます。
(自作自演はだめ)

ページを増やすのが厳しければ、ブログをサイト内に取り入れることも手段としてはいい。


<h1>【SEOで大事なこと】</h1>
・長い目でコツコツと。
・ズルしたらペナルティで不利になる。
・検索結果1位になることより、目標達成のために対策しましょう。


<h1>【最後に】</h1>
今回、HTML的なところでの対策など書けていないので、
その内できたらなと思います。

今の段階で結構眠いので読みにくければごめんなさい(スヤァ)
PHP/json文字列をデコードする

json_decode関数を使う。

```
$object = json_decode($json_string);
// 第二引数をtrueにすると連想配列になる。
$array = json_decode($json_string, true);
```

例:

```
$request = file_get_contents("https://www.googleapis.com/books/v1/volumes?q=search+%E6%8A%80%E8%A1%93&maxResults=40");
$json = json_decode($request, true);

var_dump($json['kind']); // string(13) "books#volumes"
```
n進数の扱いについて～基本変換の考え方～


#～基本変換の考え方～

基本情報技術の知識について学習を行っており、その中でｎ進数の扱いが難しかったので備忘録として記録しておく。

##■ｎ進数→10進数への基本変換

例）2進数1101.011を10進数へ置き換える場合

ｎ進数から10進数へ変換する際には表に書き出してみるとわかりやすい

2進数の部分と各桁の重みを掛け算する


| 2進数|1|1|0|1|.|0|1|1|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|各桁の重み(n^~)|2^3|2^2|2^1|2^0||2^-1|2^-2|2^-3|
||↓|↓|↓|↓||↓|↓|↓|
|10進数|8|4|0|1||0|1/2|1/4|

最後に10進数の部分を計算すると
8+4+0+1+0+1/2+1/4＝13.375

**Ａ．13.375**

8進数、16進数の場合は各桁の重みのｎをそれぞれ8または16に置き換えることで対応できる。


##■10進数→ｎ進数への基本変換

例）10進数13.375を2進数へ置き換える場合

まず13.375を各桁の重みを使って割り算を行う

今回の場合2^4(16)で割り切れないのでそれより後2^3(8)から始める

13.375　÷　2^3(8) ＝　1 …　余り**5.375**
↓
5.375　÷　2^2(4) ＝　1 …　余り**1.375**
↓
1.375　÷　2^1(2) ＝　0 …　余り**1.375**
↓
・・・
↓
0.125　÷　2^-3(1/8) ＝　1 …　余り**0**

このようにあまりが0になるまで続け、最後に出た除

表に書き出してみるとこのようになる

| 各桁の重み(n^~)|2^3|2^2|2^1|2^0||2^-1|2^-2|2^-3|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
||↓|↓|↓|↓||↓|↓|↓|
| 2進数  |  1 |  1 |   0|   1|  . |  0 |  1 |  1 |

結果**Ａ.1101.011**

となる。

##■ちなみにもっと簡単に基本変換の計算ができる方法がある


とりあえずここまでで一区切りとするがこれはあくまで概念的な考え方なのでもっと簡単な計算方法がある。
それはまた次回にメモしておくこととする
ITエンジニアは英語より日本語を勉強しよう。

コロナウイルスに隠れて、ABC予想が解決したというニュースがあまり話題になっていませんが、
望月新一教授のブログ『心の一票』の「数学界に出現している悲惨なブラックホールの物語」は、
ぜひ一読下さい。その中の、「理論が複雑過ぎるから、思い切って簡略化したい」というのは、
もろに欧米の思想であるのですが、世界は欧米人の考えるよりは少し複雑なようです。

　また、「心ある壁」を構築し、維持することの重要性　を読むと、
「友好的な姿勢を保ちつつ、一定の距離を置く」ことが述べられています。

「心壁論」と、論理構造の解明・組合せ論的整理術を「心の基軸」とすることの本質的重要性には、

　英語を通して記述された世界には、「色眼鏡」のように、英語圏の文化や世界観を反映した、
　著しく濁っていて有害な歪みがある、と書かれていますが、まさにその通りだと思います。
　
　さて、本題ですが、日本のITエンジニアに英語の学習をススメラレル論調がありますが、
私は、あまりエンジニアの役にたたないと思います。勉強してもネーティブスピーカや、
英語を公用語にしている国のエンジニアに勝てるわけがありません。
　それなら、ITのある分野を日本語だけで囲って勝負するほうがましです。
日本人のエンジニアに求められているのは、英語を話すことではなく、海外の文献を日本語に翻訳し、
日本語でドキュメントを書き、日本語でシステム構築をし、日本語でプログラムを議論する事です。
　その努力を怠ると、明日には海外に仕事を全部持っていかれることになると思います。

あと、経済学ですが、欧米直輸入で、翻訳さえ満足にできてなくてもはや、手遅れです。
「株価データセット作成」と「AR(1)の実装」

# 本記事でやること
  - 自分で株価のデータセットを作成し、AR(1)モデルを実装する。

# 株価データセットの作成
  - 以下のURLにアクセスし、銘柄名を検索すると株価のcsvを取得できる。
  - https://kabuoji3.com/stock/

# AR(1)の実装
  - 上記で取得した株価のcsvを元に、AR(1)モデルを実装する。

##  AR(1)を一言で
  - 前日の株価で当日の株価を予測するモデル。

## 実装
### ライブラリ・モジュール

```
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
```

### 前処理

```
# データをdfとして読み込む。
df = pd.read_csv(file_nm, encoding='cp932') # file_nmに株価のcsvファイルのパスを指定。 
# 上記のcsvには無駄な情報があるため、dfとしての形式を整える。
date = df.index[1:] # 日付の値を格納するdateを生成する。
df = pd.DataFrame(df.values[1:,:], columns=df.loc['日付'].values) # 余分な情報を削除する。
df['日付'] = date
df = df[['日付', '始値', '高値', '安値', '終値', '出来高', '終値調整値']]

# dfのカラムを日付と終値に絞る。
df = df[['日付','終値']]

# 終値に格納される値のデータ型を文字列からfloat32に変更する。
df.loc[:,'終値'] = df['終値'].astype(np.float32)

# 2013年6月28日を0, 2013年7月1日を1, 2013年7月2日を2, ...とする日付番号カラムを生成する。
date_num = list(range(len(df.日付)))
df['日付番号'] = date_num
df = df[['日付', '日付番号', '終値']]

# 1日前の終値のカラムを生成する。
df_2 = df.copy()
df_2['日付番号'] = df_2['日付番号'] + 1
df = pd.merge(df, df_2[['日付番号' ,'終値']], on='日付番号', how='left')
df = df.rename(columns={'終値_x':'当日の株価', '終値_y':'前日の株価'})

# 欠損値を含む行を除外する。
df = df.dropna()

# 特徴量, 目的変数を格納するX, yを生成する。
y = df.当日の株価.values
X = df.前日の株価.values

def reshape_row(arr):
    """X, yの形状を変更する。(行ベクトルに変更する。)
    """
    return arr.reshape(-1, 1)

X, y = reshape_row(X), reshape_row(y)

# X, yをtrainデータとvalidationデータに7:3の割合で分割する。
train_X, val_X, train_y, val_y = train_test_split(X, y, test_size=0.3)
```

### 学習 ~ 評価

```
# 線形回帰モデル(AR(1))の係数推定値を算出する。
model = LinearRegression()
model.fit(train_X, train_y)

# 切片と前日の株価の係数推定値を表示する。
print("切片は", model.intercept_[0])
print("前日の株価の係数推定値は", model.coef_[0][0])

# モデルの評価を行う。
true_y = val_y
pred_y = model.predict(val_X)
mean_squared_error(true_y, pred_y)
```
[ポエム]個人的な反省メモ

# 2020-04-08
　面接を受けた。
　正直なところ、何もかもが準備不足だったと思う。
　業界の志望理由、自分の強み、将来のキャリア、理想のエンジニア像。そのすべてに対して、一貫性というか強い結びつきをもって答えられなかった。それぞれの質問に対しての回答が、点としてしかつながっておらず、線にならなかった。そもそも、目上の方と話せるような話し方ではなかった。聞くに堪えない回答もどきを聞かされた面接官の方に対して、貴重な時間を奪ってしまったようで非常に申し訳ない。
　もしかしたら、業界研究を一から始めなおしたほうが良いのではないかとさえ面接を終えた帰り道に思い浮かんでしまった。
　今まで書いてきたコードや記事について質問されたとき、満足に回答することができない自分の状態に気付いた。また、コードの意味を完璧に理解せずにコピペして動いたからいいやといったようなことに何の疑問も思わずにここまで来てしまったことにも気づかされた。
　とにかく、今後することが決まった。
　一つは自分の学生生活の棚卸と整理。
　もう一つは、Railsの基礎の基礎から学び直すこと。
　最後に、まともに人と話す練習だ。
Squidでプロキシサーバーをたてる。

リモートワークをしていると、固定IPをなかなかもてない。開発都合上、閲覧制限などをかけたいので、固定IPは欲しい。
というわけで、VPSにプロキシサーバをたてることに。
自分→インターネット→VPS(プロキシサーバ)→開発サーバ（行き先）
というわけです。

#Squidのインストール

`$ yum install squid`

自動起動設定
`$ systemctl enable squid.service`

#Squidの設定
踏み台にされたりしないように、制限はいれておきたい。

`$ vi /etc/squid/squid.conf`

```/etc/squid/squid.conf
デフォルトの部分は基本省略。
#logformat
#ログの時間をみやすくする
logformat squid %tl %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt

# myproviderは好きな名前をつける。
# ipの場合は、acl myprovider src xxx.xxx.xxx/16
acl myprovider srcdomain <プロバイダのドメイン>

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 443         # https
acl Safe_ports port 22          # ssl
acl CONNECT method CONNECT

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
# http://localhost/をブロックする、という意味らしい
http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
# 上記で名付けたものしか許可しない
http_access allow myprovider

# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128
# 待受ポートを指定。※3129にかえてみた
http_port 3129

#キャッシュをoff
no_cache deny all

# 接続先にみえるホスト名
visible_hostname xxxx.com

# プロキシサーバーを使用している端末のローカルIPアドレスを隠蔽化
forwarded_for off

# プロキシ経由でアクセスしていることをアクセス先に知られないようにする
# squid3系からは、header_accessではなくrequest_header_accessとする
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
```

設定が終わったら、起動or反映
systemctl reload squid.service

#ポート空けとfirewallの設定
確認
`$ firewall-cmd --list-all`
ポート空け
`$ firewall-cmd --zone=public --add-port=3129/tcp --permanent`
自分のIPしか許可しない
`$ firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="<自分の接続元IP>" port protocol="tcp" port="3129" accept"`
※削除するときは、--remove-rich-rule
更新して確認
`$ firewall-cmd --reload`
`$ firewall-cmd --list-all`

#ブラウザにプロキシ設定

chromeの場合。
設定 → 詳細設定 → パソコンのプロキシ設定を開く
で、vpsのIPと設定したポートを指定。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348885/2e44ee7c-5760-7653-a771-8e67de371cef.png)

https://www.cman.jp/network/support/go_access.cgi
とかでアクセス元を確認してみてください。