OmniAICreator/Qiita-1.07M huggingface dataset:
BNF非終端記号

応用情報技術者平成29年秋期 午前2


次のBNFにおいて非終端記号＜A＞から生成される文字列はどれか。


＜R0＞ ::= 0｜3｜6｜9
＜R1＞ ::= 1｜4｜7
＜R2＞ ::= 2｜5｜8
＜A＞ ::= ＜R0＞｜＜A＞ ＜R0＞｜＜B＞ ＜R2＞｜＜C＞＜ R1＞
＜B＞ ::= ＜R1＞｜＜A＞ ＜R1＞｜＜B＞ ＜R0＞｜＜C＞＜ R2＞
＜C＞ ::= ＜R2＞｜＜A＞ ＜R2＞｜＜B＞ ＜R1＞｜＜C＞ ＜R0＞


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e996b2bf-5407-2280-23a7-9a62b2d7d9bf.png)

１、＜A＞の定義にある「＜A＞＜R0＞」「＜B＞＜R2＞」「＜C＞＜R1＞」の3つの型から導出されるBNFのパターン：

・[＜A＞ ＜R0＞]
非終端記号＜A＞に、それぞれ3つの型を当てはめます。
　　＜A＞＜R0＞＜R0＞→＜R0＞＜R0＞＜R0＞
　　＜B＞＜R2＞＜R0＞→＜R1＞＜R2＞＜R0＞　　　※
　　＜C＞＜R1＞＜R0＞→＜R2＞＜R1＞＜R0＞

・[＜B＞＜R2＞]
非終端記号＜B＞に、それぞれ3つの型を当てはめます。
　　＜A＞＜R1＞＜R2＞→＜R0＞＜R1＞＜R2＞
　　＜B＞＜R0＞＜R2＞→＜R1＞＜R0＞＜R2＞
　　＜C＞＜R2＞＜R2＞→＜R2＞＜R2＞＜R2＞

・[＜C＞＜R1＞]
非終端記号＜C＞に、それぞれ3つの型を当てはめます。
　　＜A＞＜R2＞＜R1＞→＜R0＞＜R2＞＜R1＞
　　＜B＞＜R1＞＜R1＞→＜R1＞＜R1＞＜R1＞
　　＜C＞＜R0＞＜R1＞→＜R2＞＜R0＞＜R1＞


２、
　123→　＜R1＞＜R2＞＜R0＞　上記※のところですね。
　124→　＜R1＞＜R2＞＜R1＞
　127→　＜R1＞＜R2＞＜R1＞
　128→　＜R1＞＜R2＞＜R2＞


簡単に考えると、Aは＜A＞ ＜R0＞｜＜B＞ ＜R2＞｜＜C＞＜ R1＞　というふうに定義されているので、
最後の文字はR0ですね。
つまり、0｜3｜6｜9のいずれかですから、123でしょうね。

もうちょっと確かめとすると、
123→　＜R1＞＜R2＞＜R0＞　の真ん中はR2ので、　つまり
  ＜A＞＜R0＞
  -＞＜B＞＜R2＞＜R0＞
  -＞＜R1＞＜R2＞＜R0＞
になりますね。




・BNFとは、
バッカス・ナウア記法（英: Backus-Naur form）とは、文脈自由文法を定義するのに用いられるメタ言語のことで、一般にBNFやBN記法と略される。


参照：

BNFで表現されたあるプログラム言語の構文
https://qiita.com/lymansouka2017/items/f0960106b6490d1abd4d

バッカス・ナウア記法
https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AB%E3%82%B9%E3%83%BB%E3%83%8A%E3%82%A6%E3%82%A2%E8%A8%98%E6%B3%95


https://www.ap-siken.com/kakomon/20_aki/q7.html
javascript関数ドリル　初級編compact関数実相のアウトプット

##compact関数の課題内容
詳細はこちら
　　　↓
https://js-drills.com/blog/compact/

##compact関数の取り組む前の状態
自力でやった時にtruesyのみをとるのに戸惑った

##compact関数に取り組んだ後の状態
truesyのみを取りたいときはarray[i]すればいいことに気づけた


##compact関数の実装コード（答えを見る前）
function compact(array)
const compactArray=[]

for(let i=0;i<array.length;i++){
if(){
compactArray.push(
}

##uniq関数の実装コード（答えを見た後）
```js
function compact(array) {
  const compactedArray = [];

  for(let i = 0; i < array.length; i++) {
    if(array[i]) {
      compactedArray.push(array[i]);
    }
  }

  return compactedArray;
}


const compactedValues = compact([0, 1, false, 2, '', 3, 4, false, '', 1000]);
console.log(compactedValues);
// => [1, 2, 3]
```
privateメソッド


はじめに、前投稿でゲッターで得た値を**インスタンス名.ゲッターメソッド名**で出力可能ですと記述いたしましたが、
**誤りでした、申し訳ありません。**インスタンスの値が代入された、変数を用いる場合、**変数.ゲッターメソッド名**で出力致します。


以下、プライベートメソッドについての投稿です。


また、今回投稿するに当たって参考にさせて頂いたURLです。
ありがとうございました。
https://26gram.com/private-protected-in-ruby
https://qiita.com/kidach1/items/055021ce42fe2a49fd66

プライベートメソッドとはprivate以下の記述をクラス外から呼び出すことが出来ないというものです。


```ruby
class Fruits

  private

  def name
    puts "りんご"
  end

end

apple = Fruits.new
apple.name
```
```
出力結果
 private method `name' called for #<Fruits:0x00007fe767832538> (NoMethodError)
```

この記述ですと、インスタンスメソッドがprivateより以下に記述されていますので、出力できません。
エラーが生じます。クラス外から、呼び出すことが出来ないからです。

また、次のような記述もエラーが生じます。

```ruby
class Fruits
  
  apple.name 

  private

  def name
    puts "りんご"
  end

end

apple = Fruits.new
```
```
出力結果
undefined local variable or method `apple' for Fruits:Class (NameError)
```

では、どうすることが適切なのでしょうか。

private以上に以下の記述を呼び出すメソッドを定義しまして、
そのメソッドをクラス外から呼び出します。

```ruby
class Fruits

  def info
    name
  end

  private

  def name
    puts "りんご"
  end

end

apple = Fruits.new
apple.info
```

```
出力結果
りんご
```

また、親クラスのプライベートメソッドは子クラスで呼び出すことも可能です。

```ruby
class InfoFruits
  private

  def name
    puts "りんご"
  end

end

class Fruits < InfoFruits

  def info
    name
  end

end

apple = Fruits.new
apple.info
```
```
出力結果
りんご
```

最後に、親クラスのprivateメソッドであるゲッターを利用しまして、
その値を出力しています。

```ruby

class InfoFruits

  private

  def name #ゲッター
    @name
  end

end

class Fruits < InfoFruits #実態のあるインスタンスは継承できませんが、定義されたインスタンスメソッドとインスタンス変数は用いることができます。

  def fruit_name(info_fruit_name)
    @name = info_fruit_name #インスタンス変数の定義
  end

  def info #プライベートメソッドnameを呼び出しています。
    name
  end

  def info_fruit
    puts "#{name}" #前投稿で**インスタンス名.ゲッターメソッド名**で出力可能と記述いたしましたが、
                   #誤りでした、すみません。インスタンスの値が代入された、変数を用いる場合は**変数.ゲッターメソッド名**で出力致します。
                   #今回、変数を用いていませんので、この形で出力が可能となります。
  end

end

apple = Fruits.new #インスタンスの生成
apple.info #プライベートメソッドを呼び出す為のメソッドを呼び出しています。
apple.fruit_name("りんご") #fruit_nameメソッドに引数を渡しています。

apple.info_fruit #info_fruitメソッドを呼び出しています。

```

```
出力結果
りんご
```

以上となります。

誤っている箇所、認識が不足している部分について、ご指摘頂ければ幸いに存じます。
centOSとは何なのか

会社の業務でcentOSに触れた。
…といっても何のために入れたのか、何に使うのか、どんなことができるのか全く分からない。
目的も分からずマニュアル通りにcentosをAWSに入れて（勘違いをしているかもしれない）、うんぬんかんぬんした。でもまったく何をしているか分からないので、調べて記事にすることにする。

#centOSとは
https://eng-entrance.com/what-is-centos
上記記事を参考に。
centOSは、有料版Linuxのクローンであるらしい。
Linuxは聞いたことがある。黒い画面に何か打ち込むやつだ。
けれど無償で公開されていたような…？

https://www.lifehacker.jp/2017/11/171105-how-to-get-started-with-the-linux-operating-system.html
この記事を読むと、やはりLinuxは無償で提供されていることが明記されている。
けれど一口にLinuxといっても色々種類があるようで、いろんな種類のことをディストリビューションという。centOSはLinuxの中のディストリビューションの1つらしい。

さらにややこしいのだけれど、1つ目の記事を読み込むと、
Red Hat Enterprise Linux（有料）　→　クローン　→　centOS（無料）
というイメージらしい
Red Hat Enterprise Linuxを手軽に（？）使いたいがためのソフトなのだろう。
【GCP】pub/sub使ってみた

チュートリアルがあるので、まずはそれのとおりに以下のコマンドを打つ。

149  gcloud pubsub topics create my-topic
  150  gcloud pubsub subscriptions create my-sub --topic my-topic --ack-deadline=60
  151  gcloud pubsub topics list
  152  gcloud pubsub subscriptions list
  153  gcloud pubsub topics publish my-topic --message hello
  154  gcloud pubsub topics publish my-topic --message goodbye
  155  gcloud pubsub subscriptions pull --auto-ack --limit=2 my-sub

チュートリアルにもあるが、pullしたメッセージがちゃんと表示されない場合もある。

  156  gcloud pubsub subscriptions pull  my-sub
  157  gcloud pubsub topics publish my-topic --message thanks
  158  gcloud pubsub subscriptions pull my-sub
 159  gcloud pubsub subscriptions ack my-sub --ack-ids ACK_ID

ここのACK_IDは　158　で表示されたもののACK_IDを記載する。すごく長いので注意。

以下のサイトの図をみるとイメージしやすい
https://cloud.google.com/pubsub/docs/overview?hl=ja
![DSC_0536.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/114d4622-f593-7c65-9246-ccac0ba2af77.jpeg)
RPGツクールMVとRPGツクールMZ共通プラグインを作る場合のウィンドウ初期化

RPGツクールMVでは、ウィンドウ系クラスの初期化パラメータは統一されていませんでした。
基底クラスとなるWindow_SelectableやWindow_Baseクラスではx,y,width,heightの4つでしたが、それ以外はバラバラです。
もちろん、バラバラでも内部では上記の4引数による初期化を行っています。

RPGツクールMZではウィンドウ系クラスの初期位置を指定するパラメータがRectangle型1つに統一されました。
MV→MZでプラグインを移植する場合はここを書き換えればよいですが、コアがほとんど同じなので共通化したいところです。
試行錯誤の末、以下の方法で共通化できることがわかりました。
下記のコードはご自由にコピペしてお使いください。

```js:
/**
 * @param {Window_Base} window_ 
 * @param {Rectangle} rect 
 * @param {(window:Window_Base,rect:Rectangle)=>void} initFunction
 */
function window_initializeMVMZ(window_,rect,initFuncton){
    if(Utils.RPGMAKER_NAME==="MZ"){
        initFuncton.call(window_,rect);
        return
    }
    if(Utils.RPGMAKER_NAME==="MV"){
        initFuncton.call(window_,rect.x,rect.y,rect.width,rect.height);
        return;
    }
    throw( new Error("Unknow RPG MAKER:"+Utils.RPGMAKER_NAME));
}
class Window_MySystem extends Window_Selectable{
    /**
     * @param {Rectangle} rect 
     */
    initialize(rect){
        window_initializeMVMZ(this,rect,super.initialize);
    }
}
```

なぜこれが動くのか説明するのは、複雑なので省略します。
iOS 14：クリップボードにアクセスする前にその内容の種別を検知

iOS 14では、アプリがユーザーのクリップボードのコンテンツにアクセスするたびに、画面上部に警告が表示されます。

アプリがクリップボードのコンテンツにアクセスするのは、その中のコンテンツに気になる点があるかどうか知りたい場合があるためです。

この `UIPasteboard.general` の `detectPatterns` 機能を利用すると、クリップボードのコンテンツが次のカテゴリのいずれかに該当するかどうか検出することができます。

<img width="350" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/3d6d1726-4130-fca1-4226-364ef59d96d5.gif">

- 数字 `.number`
- URL `.probableWebURL`
- ウェブ検索クエリー `.probableWebSearch`

`detectPatterns` がコンテンツのタイプを判断できない時はいつも `.probableWebSearch` と報告しているようです。

[完了したGithubのデモプロジェクトはこちらから入手できます。](https://github.com/mszmagic/iOS14PasteboardTypeCheck)

## ペーストボードのコンテンツを検出

```swift
UIPasteboard.general.detectPatterns(for: [.number, .probableWebSearch, .probableWebURL]) { result in
    switch result {
        case .success(let patterns):
            if patterns.contains(.number) {
                // おそらく数字
            } else if patterns.contains(.probableWebSearch) {
                // おそらくウェブ検索クエリー
            } else if patterns.contains(.probableWebURL) {
                // おそらくURL
            }
        case .failure(let error):
            print(error.localizedDescription)
    }
}
```

`UIPasteboard.general.detectPatterns` を使用すると、アラートが表示されません。

興味のあるコンテンツがペーストボードに含まれていることがわかったら、実際のペーストボードのコンテンツにアクセスできます。（たとえば、お使いのアプリが、ペーストボードからURLをコピーすることだけに興味がある場合、まず検出を実行して、URLがペーストボードに含まれていたらペーストボードへアクセスできます）

## デモアプリケーション

[こちらがGithub上でどのように機能するのかをより良く把握していただけるよう、デモアプリケーションのダウンロードが可能です。](https://github.com/mszmagic/iOS14PasteboardTypeCheck)

デモアプリケーション内には2つのボタンがあり、`パターンを検出` のボタンではペーストボードの内容のタイプが表示され、`クリップボードの内容を取得` のボタンではペーストボードの内容がフェッチされます。

[⭐️ こちらのウェブページにアクセスすると、私の公開されているQiitaの記事のリストをカテゴリー別にご覧いただけます。](https://mszmagic.com/ioskiji/)
Now(Vercel) でデプロイしてみた -> SvelteでMarkdown形式で投稿できるブログを1分で構築する

# はじめに

作ったものはこちらで公開しています。
https://github.com/tktcorporation/svelte-md-blog

デプロイしたブログ(Qiita と Note で間に合ってるので、何を書けば良いのかわからない)
https://blog.tktcorporation.com

# 構築

[SvelteでMarkdown形式で投稿できるブログを1分で構築する](https://qiita.com/oekazuma/items/eb086527fe59dbdacf6f#%E6%A7%8B%E7%AF%89) 参照

# デプロイ

## Vercel に登録

Vercel へのサインアップがまだの場合、登録を済ませる。

https://vercel.com/login

## デプロイ

最初に叩くとログインの案内が出るので、メールアドレスを入れる。
すると、Vercel からメールが届くので、そこで認証してあげる。

```bash
$ npm run deploy:now

> svelte-app@1.0.0 deploy:now {app_root}
> cd scripts/now && npm run deploy


> @ deploy {project_root}/scripts/now
> node build && npx now

Now CLI 20.1.0
? Set up and deploy “{app_root}/scripts/now”? [Y/n] y
? Which scope do you want to deploy to? {account_name}
? Link to existing project? [y/N] n
? What’s your project’s name? {project_name}
? In which directory is your code located? ./
No framework detected. Default Project Settings:
- Build Command: `npm run vercel-build` or `npm run build`
- Output Directory: `public` if it exists, or `.`
- Development Command: None
? Want to override the settings? [y/N] n
```

## デプロイ自動化

### Github Actions

#### Workflow の追加

**{project_root}/.github/workflows/deploy-master.yml** を作成する。

```yml
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions

name: Deploy Master

on:
  push:
    branches:
      - master

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - uses: actions/setup-node@v1
        with:
          node-version: 12
      - name: build
        run: |
          npm install
          npm run build
          cd scripts/now
          node build
      - uses: amondnet/now-deployment@v2
        id: now
        with:
          zeit-token: ${{ secrets.NOW_TOKEN }} # Required
          now-args: "--prod" #Optional
          now-org-id: ${{ secrets.NOW_ORG_ID}} #Required
          now-project-id: ${{ secrets.NOW_PROJECT_ID}} #Required
          working-directory: ./app/scripts/now
      - run: |
          echo ${{ steps.now.outputs.preview-url }}
```

ref: https://github.com/roxiness/routify-site-2020/blob/434c3510455f5b1e255a41e18e324b046b95cf44/.github/workflows/deploy-master.yml

#### Secrets の設定

Github の Repository の Secrets に3つのトークンを追加する。

![Screen Shot 2020-09-11 at 4.30.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/ea8dc7da-ef9b-2fef-efbe-0424a9225eb6.png)

##### NOW_TOKEN

https://vercel.com/account/tokens で新しく作成し、取得する。

##### NOW_ORG_ID & NOW_PROJECT_ID

**{app_root}/script/now/.vercel/project.json** が作成されているため、そこから値を取ってくる。

```json
{"orgId":"xxxxxxxxxxxxxx","projectId":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
```

#### デプロイ

master ブランチに push すると、サイトが更新される。

# さいごに

超簡単でびっくり

# 参考

https://routify.dev/guide/starter-Template/deployment
https://qiita.com/oekazuma/items/eb086527fe59dbdacf6f
アップロードファイルを localStorage に保存して、再アクセス時にファイルを復元する

# 概要
HTMLフォームで入力途中の情報を localStorage に保存し、再開時に情報を復元して最終的に Ajax で POST するまでを実装しました。
その際、ファイルアップロードだけ少し厄介だったので要点をまとめました。
Internet Explorer 11 でもうまく行きました。

※ Vue.js で元々実装していたものを無理矢理素の JavaScript に書き直しており、うまく動作しない部分があったらすみません。

# アップロードされたファイルを変数で保持する

```javascript
// この変数にアップロードファイルの情報を格納することにする
var file = null
// この変数にアップロードファイルをデータURI化した情報を格納することにする
var uri  = null

// ファイルアップロード時に呼ばれるイベントハンドラー
function (e) {
	file = e.target.files[0]
	var reader = new FileReader()
	reader.onload = function (e) {
		uri = e.target.result
	}
	reader.readAsDataURL(file)
}
```

# アップロードファイルを localStorage に保存

```javascript
// アップロードファイル名
localStorage.setItem('name', file.name)
// ファイル種別
localStorage.setItem('type', file.type)
// ファイルのデータURI
localStorage.setItem('uri',  uri)
```

# アップロードファイルを localStorage から復元

```javascript
// この変数にアップロードファイルの情報を復元することにする
var file = null
// この変数にアップロードファイルをデータURI化した情報を復元することにする
var uri  = localStorage.getItem('uri')

// アップロードファイルを復元する。
var binary = atob(
	uri.slice(value.answer.file.indexOf(',') + 1) 
)
var bytes = new Uint8Array(binary.length)
for (var i = 0; i < binary.length; i++) {
	bytes[i] = binary.charCodeAt(i)
}
file = new Blob([bytes], {
	type: localStorage.getItem('type'),
})
file.name = localStorage.getItem('name')
```

なお、 `Vuetify` を使っている場合、`v-file-input` の `v-model` に上記 fileをセットしてあげると、ファイルの選択状態まで復元できました。

![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416295/191955c7-0168-8218-2872-d8e27f6031a0.png)

# アップロードファイルを POST する

Axios で POSTする例

```javascript
import Axios from 'axios'

var formData = new FormData()
formData.append('file', file, file.name)

Axios.post('/url', formData, { headers: { 'Content-Type': 'multipart/form-data' } })
```

今回使った復元方法だと、元々 `File` クラスだったものを `Blob` クラスとして復元しており、その影響で
`formData.append()` の第3引数を無しにしてしまうとファイル名が渡らないという問題があり、第3引数が必要でした。

今回はAjaxでPOSTしましたが、Ajaxではなくformタグのsubmit機能を使って復元したファイルをPOSTするのは、セキュリティ的な問題で難しそうです。

# 余談1 アップロードされた画像を表示する

画像がアップロードされた場合、以下のコードでアップロードされた画像を表示できます。

```vue.js
<img src="" id="img" />
// ～～略～～
document.getElementById('img').src = uri
```

# 余談2 アップロードされたファイルのダウンロードリンクを生成する

画像以外がアップロードされた場合、以下のコードでアップロードファイルのダウンロードリンクを生成できます。Internet Explorer 11の場合、ちょっと工夫が必要でした。

```vue.js
<a href="" download id="download" onclick="download()">アップロードされたファイル</a>
// ～～略～～
var download = function() {
	if (!window.navigator.msSaveBlob) {
		return true
	}
	// IE, Edgeの場合は特殊な処理を行いダウンロードできるようにする
	var type = uri.match(/^data:(.*);base64,/, function() {
		return RegExp.$1
	})[1]
	var bin = atob(bfile.replace(/^.*,/, ''))
	var buff = new Uint8Array(bin.length)
	for (var i = 0; i < bin.length; i++) {
		buff[i] = bin.charCodeAt(i)
	}
	var blob = new Blob([buff.buffer], { type: type })
	window.navigator.msSaveBlob(blob, file.name)
	return false
}
```
~/.zshenvを読み込まないmac版アプリ(vim screen)の問題

Mac版 path_helper 問題を解決するシェルスクリプト（path_helper問題２） #shell - Qiita
https://qiita.com/shiro_usagi/items/973f6a9ad01d913f502c

筆者が記述した /etc/zshenv 用のシェルスクリプト記述は10.11でも動作している。

## 行ったこと

MacOS 10.9環境で、screen-v.4.8.0 tmux 3.1bをインストールと起動後のPATH確認を行った。

## 別件の問題

MacOS 10.9別件の問題でvimやscreenからターミナルを起動させると
 /etc/zshenv のPATHしか返ってこない問題がある。
「/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin」
期待値
「/usr/local/stow/ruby/bin:/usr/local/stow/gettext-021/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/xxxxxxx/bin」

この問題は、linuxのbashやzsh上のvimで起きない。
MacOS 10.11で今の所起きない。確認したのは vim screen tmuxだけだが。
10.11 +  vim screen tmuxならば、ホームディレクトリの ~/.zshenv を読み込む。

MacOS 10.9で tmux 3.1b を起動して echo $PATH すると期待値が返ってきた。


## 結論

つまり
(1)~/.zshenv を読むか読まないかは、アプリのコード仕様である。
(2)（path_helperは問題だが）MacOSXのシステム故障では無いかもしれない。
(3)tmuxはホームディレクトリの ~/.zshenv を読み込む。

zshの設定ファイルの読み込み順序と使い方Tipsまとめ - Qiita
https://qiita.com/muran001/items/7b104d33f5ea3f75353f

tmuxだけでなく、vim screen はホームディレクトリの ~/.zshenv を読み込むはずだが
ウイルスやシステム破壊を疑ったほうが良いのだろうか？

## 課題

筆者に出来そうなのは
春ごろにインストールした、vim8.2-1471 の再インストールぐらい？

記事作成は８月だが vim8.2-14xx系 をインストールしたのは春頃。
vim ver8.1 -8.2 9.1のインストールとconfigure #Vim - Qiita
https://qiita.com/shiro_usagi/items/71896e7fa38e0dffa7d6

筆者はこれくらいしか出来ない。原因究明もこれ以上出来そうにない。
ソースコードを当たれないし質問するにしても「mac PATH vim ログインシェル」で検索しても大量に出てきてgoogleなどの検索も役に立たない。

ホント、何がいけないのだろう？

## 過去に行ったこと

(a)７月頃に homebrew が問題となり iterm2 を落としている。homebrewかopensslどちらかが問題だったかも？
その後、
(b)homebrew 削除
(c)imagemagick や ruby、kindai.rbをインストール。
(d)vimからインストールしたruby が起動出来ない。（ホームディレクトリの ~/.zshenv を読み込まない問題）
(e)path_helper問題に気付く

end
HerokuでDocker環境Rails MySQLなものを動かす。deviseかつtwitter APIを隠しながら

人に見せる用に書いていません。


自作記事のお父上、Rails+MySQL+Nginx+Unicorn+Docker+CircieCIな開発環境を作りたいえ〜の記事の続き。

上で作った環境に[[*Rails*] deviseの使い方（rails5版）](https://qiita.com/cigalecigales/items/f4274088f20832252374)を追加し、かつTwitterAPIを`gem 'dotenv-rails'`で隠しながら、本番環境のherokuにアップロードした。


### ①docker-compose.ymlのコマンドを変更する

```docker-compose.yml
command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
```

### ② gem 'dotenv-rails'を導入する

目的：TwitterAPIキーをGitHubのローカルに入れたくない



envファイルはGitの管理に入れたくないので、.gitignoreファイルに以下を追記しておきましょう。


`.gitignore`に`.env`を追加する。

これで.envはGitの管理下から外れます。

https://pikawaka.com/rails/dotenv-rails
http://vdeep.net/rubyonrails-dotenv

### ③ APIキーをdotenv-railsの.envで隠しながら導入する

[[*Rails*] deviseの使い方（rails5版）](https://qiita.com/cigalecigales/items/f4274088f20832252374)の記事のtwitterAPIを追加する場所をENV[]に書き換える

```config/initializer/devise.rb
config.omniauth :twitter, ENV['TWITTER_API_KEY'], ENV['DATABASE_URL']
```

###④ Herokuの環境変数を変更する

多分、DATABASE_URLとTWIITER_API_KEY,DATABASE_URLはマスト。

herokuのGUIのSettingの[Config Vars](https://qiita.com/ymstshinichiro/items/d6ea229f6eb4778006c2)か[Herokuアプリの環境変数設定(CUIで設定)](https://qiita.com/murakami-mm/items/9587e21fc0ed57c803d0)で設定する

### Herokuアプリの環境変数設定
- ClearDBのURL確認  
以下のコマンドで、ClearDBのURLが確認できる。

```
$ heroku config
=== <アプリの名前> Config Vars
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
```

- 環境変数の設定  
上記コマンドで表示されたそれぞれの値を変数に設定する。

```
$ heroku config:add DB_NAME='<データベース名>'
$ heroku config:add DB_USERNAME='<ユーザー名>'
$ heroku config:add DB_PASSWORD='<パスワード>'
$ heroku config:add DB_HOSTNAME='<ホスト名>'
$ heroku config:add DB_PORT='3306'
$ heroku config:add DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true'
```

※ RailsのGemfileで'mysql2'を使用しているので、`DATABASE_URL`は`mysql2://`で始める必要がある。  
設定内容を確認すると、以下のように表示される。

```
$ heroku config
=== <アプリの名前> Config Vars
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
DATABASE_URL:         mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
DB_HOSTNAME:          <ホスト名>
DB_NAME:              <データベース名>
DB_PASSWORD:          <パスワード>
DB_PORT:              3306
DB_USERNAME:          <ユーザー名>
```

## Herokuへデプロイ
### Railsプロジェクトに必要な準備
- `config/environments/production.rb`に以下を追記  
(この辺りの設定に関しては、後々修正します。)

```
config.assets.compile = true
config.assets.initialize_on_precompile=false
```


これプラス、`gem 'dotenv-rails'`の`.env`で作ったTwitterAPIをheroku側に設定する。



参考
https://qiita.com/ymstshinichiro/items/d6ea229f6eb4778006c2
https://golikyua.hatenablog.com/entry/2020/01/09/135254
https://www.sejuku.net/blog/tutorial/111347
【JavaScript】配列操作を征する旅路 【Part 1】

JavaScript で配列操作する機会は， 毎度頻発するので， 学びになったものを残していこうと思います！

形式は，ビフォーアフター形式です． 直したい配列のサンプルデータを定義してそれを修正します．

### 🙅‍♂️ サンプルデータ 🙅‍♀️

今回は，

```sampleData.js
const sampleData = [
    {
      label: 'SaaS',
      name: 'finance',
      pulldownList: [
       { id: '2020', name: '2020年度', type: '経費' },
       { id: '2021', name: '2021年度', type: '経費' },
       { id: '2022', name: '2022年度', type: '経費' },
       { id: '2023', name: '2023年度', type: '経費' },
       { id: '2024', name: '2024年度', type: '経費' }
     ]
    }
]
```

こんなデータがあったとして， フォームのプルダウンメニューに`直近５年度分`の年度を表示したいという要件だったと仮定します．

### 🚀 やりたいこと 🚀

- `pulldownList` 配列をループ処理を使ってスッキリしたい
- 現在の時刻データを取得してきて， 5 年分だけ表示したい

### ♻️ スッキリさせる ♻️

```sampleData.js
const sampleData = [
    {
      label: 'SaaS',
      name: 'finance',
      pulldownList: new Array(5).fill(0).map((_, i) => {
        const currentYear = new Date().getFullYear()
        return { id: `${currentYear + i}`, name: `${currentYear + i}年度`, type: '経費' }
      })
    }
]
```

スッキリできました🎊


### 👨‍🏫 解説 👩‍🏫

軽く説明します．

まず`new Array(5)`で，空の配列を5つ分セットします．
その後，[fill() メソッド](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/fill)を使用して，配列の開始位置から終了位置まで `0` を設定します。ここでは, `0` を設定しているけど， `fill()` として `undefined` を設定しても動きます．JS 的にどっちがいいとかはよくわかりませんでした． すごく厳密に書くとこんな感じになるのかな？🤔　`new Array(5).fill({id: '', name: '', type: ''})` よくわからない👼．JS 強者の方がもしみてくださったらご教示いただけると幸いです🙇‍♂️

あとは配列操作でお世話になりがちな [map()メソッド](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map) を使用して, しばいていきます．今回は, index しか必要ないです． あとは， [Dateオブジェクト](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date) で現在時刻を取得してきて，年数 4 桁のみ取得してくる[インスタンスメソッドgetFullYear()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getFullYear)を使用して加算していくという流れになります！
機械学習で"使える"one-hot Encoding手法

# はじめに
勉強しても勉強してもすぐ忘れてしまうので備忘録兼アウトプット練習のためQiitaに記事を投稿していく。
間違い、より良い方法あればコメント下さるとうれしいです。

# 発想
機械学習でOne-hot Encodingを実施したいがテストデータにはどんなデータがあるかなどわからない。
One-hot Encodingしたいなら`get_dummies`を使うと良いとどのサイトにも書いてあるが、例えば
**`train_df['sex']`には`Male`と`Female`があるが`test_df['sex']`には`Male`しかない**
といったとき普通に`get_dummies`を使うと作成されるcolumnの数が変わってきてしまう。これはいけない。

そこでいろいろいろいろ調べたところ以下の記事にたどり着いた。

[【python】機械学習でpandas.get_dummiesを使ってはいけない](https://www.haya-programming.com/entry/2019/08/17/184527)

記事自体はget_dummiesを使わず、`sklearn`の`OneHotEncoder`を使おうというもの。
しかし私はPandas形式のままデータ分析をしてから最終的に`Numpy`形式にしたいため、`Pandas`のままで何とかしたいというこだわりを持ってしまった。

それが↑の記事のコメントでも解説されており、本記事ではそこを自分なりにかみ砕けるところまで落とす。

# 実装

実装は結局`get_dummies`を使う。

```.py
# (i) df_trainのAのuniqueは"hoge"と"fuga"。Bのuniqueは"a"と"b"
df_train = pd.DataFrame({"A": ["hoge", "fuga"], "B": ["a", "b"]})

# (ii) df_trainのAのuniqueは"hoge"と"piyo"。Bのuniqueは"a"と"c"
df_test = pd.DataFrame({"A": ["hoge", "piyo"], "B": ["a", "c"]})

# (iii) CategoricalでAは"hoge"と"fuga"、Bは"a"と"b"だよと決め打ちしてしまう
df_train["A"] = pd.Categorical(df_train["A"], categories=["hoge", "fuga"])
df_train["B"] = pd.Categorical(df_train["B"], categories=["a", "b"])
df_test["A"] = pd.Categorical(df_test["A"], categories=["hoge", "fuga"])
df_test["B"] = pd.Categorical(df_test["B"], categories=["a", "b"])

# (iv) get_dummiesでone-hot
df_train = pd.get_dummies(df_train)
df_test = pd.get_dummies(df_test)
```

これで最終的にone-hotしたデータは以下のようになる。

```
df_train
   A_hoge  A_fuga  B_a  B_b
0       1       0    1    0
1       0       1    0    1
df_test
   A_hoge  A_fuga  B_a  B_b
0       1       0    1    0
1       0       0    0    0

```

無事、trainのuniqueなものだけでいけた。今回はハードコーディングで対応したが別に`unique`を使えばもっとフレキシブルに対応できる。

# 補足
なぜdf_trainの方もカテゴリを固定しているのかというとこれをしないとhogeとfugaの順番がtrainが逆になってしまうから、である。
Angularの特徴

#プログラミング勉強日記
2020年9月11日
JSには色々なフレームワークがあって、開発の用途によって使用するフレームワークが違うと思うので、まとめてみようと思う。前回は[Reactについて](https://qiita.com/mzmz__02/items/18f04f8e4ec84f1cc1af)まとめたので、今回はAngularについてまとめる。

#Angularとは
　Angular(読み方：アンギュラー)は、Googleが開発したJSのフレームワーク。とても人気があり、WEBアプリ開発においてはReactと並んで最も使われるフレームワーク。

#特徴

#コンポーネント指向である
　Reactと同様で、Angularもコンポーネント指向である。コンポーネント指向は、ソフトウェアを機能ごとに部品(コンポーネント)として分割して、必要に応じて組み合わせて使う考えのことである。
　ビュー、ロジック、コンポーネントを構成するメタ情報から構成される。
　機能を小さい部品にして持たせているので、状態の管理もしやすくて再利用も容易にできる。

##MVC(MVW)設計
　MVC(MVW)はアプリを設計するときの考えの一つ。「Model(データ)」「View(画面)」「Controller(コントローラ)」の頭文字をとってMVCといい、「Controller(コントローラ)」の代わりに「Whatever(何か)」にしたものがMVWであり、MVCはこれらを組み合わせることで、1つのアプリを動作させる考え方である。

#双方向データバインディング
　AngularはHTMLを拡張して、より便利な機能を提供していて、その1つが双方向データバインディングと呼ばれる機能。
　アプリでユーザ画面(View)で操作した内容をデータ(Model)の反映、データ(Model)の内容が変わったときに画面(View)に反映する必要がある。なので、Viewを操作するときはModelに反映するために、画面からHTMLの要素を取得して要素をデータとして処理、処理したデータを画面に反映するプログラムを書く必要がある。


#開発言語はTypeScriptが良い
　AngularはTypeScriptをベースとして実装されているので、ドキュメントもTypeScriptが多い。標準的なJSやGoogleが開発したaltJSであるDartでも利用できるが、TypeScriptを用いるのが無難。


#モダンな記述を組み合わせている
　Angularは新しいJS技術を積極的に利用している。Angularの理解を深めることで、技術についても理解できるので、Angularを学ぶことで最新のJS技術を取得できる。

#参考文献
[Angularの特徴とは？ 開発環境を構築するには？](https://www.atmarkit.co.jp/ait/articles/1705/24/news151.html)
[【初心者必見】Angularとは？いまさら聞けない基礎を学ぼう](https://www.sejuku.net/blog/9019)
(Portrait) image matting のメモ

一枚絵を前景, 背景にわけたり, 人物の場合は髪の毛をうまく分離したりなど.

http://www.alphamatting.com/

まとめサイト

## 2020 年

FBA matting : https://github.com/MarcoForte/FBA_Matting

HAttMatting: https://wukaoliu.github.io/HAttMatting/
Attention を使っており, Attention を使うのが今後の主流になりそうな感がある
【Swift】AlamofireでURLRequestValidationFailureReason.bodyDataInGETRequest(14 bytes)が出た

AlamofireでAPI周りを実装した時に以下のエラーが出ました。

```terminal
Alamofire.AFError.urlRequestValidationFailed(reason: Alamofire.AFError.URLRequestValidationFailureReason.bodyDataInGETRequest(14 bytes))
```
どうやらエンコーディングの方法が違いエラーをはいているようです。
この時に指定していたエンコーディングは`JSONEncoding.default`でした。
これを`URLEncoding.default`に変更することでリクエストは正常に処理されました。

結果的に問題は解決出来たのですが、理由は分からず。。
ちょっと前まで`JSONEncoding.default`で正常に動作していた気がするのですが、何か知見のある方コメント頂けると嬉しいです🙏
Mac App Store における「サーバに接続できませんでした。」の対処法

## はじめに

- ある日突然 Mac App Store に接続できなくなりました。
    - 自宅のネットワークだと接続できる
    - そのうちどのネットワークでも接続できなくなった😇
    - Homebrew, Homebrew cask 頼りに…
    - `mas-cli` もダメ
- 症状としては「サーバに接続できませんでした。」ダイアログが。
- 備忘録として解決策をシェアします。

![_2020-08-15_0.57.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339466/324d1db4-731b-38f1-85e2-4eb7e3bdb140.png)

## 解決法

```shell
sudo vim /etc/hosts
```
- で `/etc/hosts/` に入る (エディタはお好きに)

```diff
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1	localhost
255.255.255.255	broadcasthost
::1             localhost
127.0.0.1       www.sublimetext.com
127.0.0.1       license.sublimehq.com

-127.0.0.1       osxapps.itunes.apple.com
+#127.0.0.1       osxapps.itunes.apple.com
# Added by Docker Desktop
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
# End of section
```

- のように、 `127.0.0.1       osxapps.itunes.apple.com` の行をコメントアウトします。
- 削除でも良いですが、チキンなのでコメントアウトしてます。

## 結果

- アップデート・ダウンロードできました。

![_2020-08-15_1.02.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339466/0e49bdb6-42e5-efa4-4113-152ad15c5a54.png)

## 参考文献

- [App Store not working. Getting "Could not connect to the server"](https://www.reddit.com/r/hackintosh/comments/44ud5v/app_store_not_working_getting_could_not_connect/)
- (何故か `r/hackintosh` という。。。)

> Fixed it. Had a lien in the /etc/hosts file was redirecting the app store server.

> This was the line: 127.0.0.1 osxapps.itunes.apple.com

> If you are having this problem run sudo nano /etc/hosts and delete that line. Save, and you are good to go.

## 上手く行かなかった対処法

- 僕はダメだったけど、他の方はこっちで成功するかもしれないので

1. 再起動
2. App Store サインアウト・サインイン
3. Mac の Apple ID サインアウト・サインイン
4. Keychan Access で色々やるやつ
5. `/var/db/cricrls/` の中を空に

- この辺が参考になるかもです。
- https://ansonalex.com/tutorials/macos/could-not-connect-to-the-server-mac-app-store-error-fix/
整数同士の除算演算子の挙動(Elixir)

# はじめに
- @suzuki-navi さんの[整数同士の除算演算子の挙動 (C言語、C++、Scala、Java、Rust、Go言語、PHP、JavaScript、Perl、Python、Ruby)](https://qiita.com/suzuki-navi/items/72fcb1fbf05008cbe8b4)を拝見しまして、私はぜひ[Elixir](https://elixir-lang.org/)での話をまとめておこうとおもいました
- [Elixir](https://elixir-lang.org/)は`Elixir 1.10.4 (compiled with Erlang/OTP 23)`を使いました

# [Elixir](https://elixir-lang.org/)

| a | b | a / b | a % b | div(a, b) | rem(a, b) | 
|:-----------:|:------------:|:------------:|:------------:|:------------:|:------------:|
|5|4|1.25|SyntaxError|1|1|
|5|-4|-1.25|SyntaxError|-1|1|
|-5|4|-1.25|SyntaxError|-1|-1|
|-5|-4|1.25|SyntaxError|1|-1|

# Wrapping Up
- [/](https://hexdocs.pm/elixir/Kernel.html#//2)はいつもfloatになります
- %はありません(SyntaxErrorになります)
- 整数で結果が欲しい場合には、商が欲しいときは[div/2](https://hexdocs.pm/elixir/Kernel.html#div/2)を、余りが欲しいときには[rem/2](https://hexdocs.pm/elixir/Kernel.html#rem/2)を使います
- Enjoy [Elixir](https://elixir-lang.org/) ! :rocket::rocket::rocket: :lgtm::lgtm::lgtm:
OpenWrtでUSBテザリングする

OpenWrtルーターからAndroidスマートフォンのUSBテザリングを利用する方法について。基本的には参考文献[^1] [^2]をなぞる内容です。

[^1]: [Smartphone USB Tethering to an OpenWrt router](https://openwrt.org/docs/guide-user/network/wan/smartphone.usb.tethering)
[^2]: [OpenWRT: USBテザリング \| goozenlab](https://goozenlab.com/blog/2020/06/openwrt-usb-tether/)

## 環境

- Bufflaloルータ
    - OS: OpenWrt 19.07.3
- Galaxy Note 8
    - SIM: 楽天UN-LIMIT

## 必要パッケージのインストール

```
# opkg update
# opkg install kmod-nls-base kmod-usb-core kmod-usb-net kmod-usb-net-cdc-ether kmod-usb-net-rndis kmod-usb2
```

## インターフェース追加

「Network」「Interfaces」の「Add new interface...」から新しいインターフェースwanbを追加します。プロトコルはdhcp client、インターフェースはUSBとし、ファイアウォールゾーンのwanグループに所属させます。


|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46856/256c8f77-17b0-2e3c-5e47-da70b28a438d.png)|
|:-:|

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46856/ee3d5b2d-d716-8c2f-3e41-24bb39e2b9a5.png)|
|:-:|


上記設定を行なった上で、AndroidスマホをルーターのUSBポートに接続してUSBテザリングを有効にすればルーターの上流がスマホ回線になります。充電しながらSIM回線を複数台から使えるのは状況次第では便利だと思います。

## 所感

私は古いスマホに楽天UN-LIMITのSIMを入れており、これを自宅の固定回線のバックアップ用途で使っています。我が家は楽天の自前回線のエリア内なので、メイン利用も十分現実的なくらいです。

（2022-06-13追記）残念ながら楽天が無料で使える時代は終わってしまいましたね…

## 補足

参考文献[^1]によれば、iOSではうまく動かないとのことです。意外に思えますが、Androidとは何か仕組みが違うみたいですね。
【Tips】TerraformでDynamoDBにそこそこの量のアイテムを初期構築でputしておく方法

# はじめに
DynamoDBとLambdaで色々試してると、ふと検証のために大量データを予め入れておきたくなったりするよね。
それ、Terraformで簡単に実現できるんです。

※そんなのPythonでboto3使ってbatch_writer()で書けば5分で済むだろ、とかそういうツッコミは一旦抜きにして。

# どうやってIaCで書くのか
countを使う。以上。

だと終わってしまうので、もう少し解説。

```HCL
resource "aws_dynamodb_table_item" "batch_items" {
  count = 100

  table_name = aws_dynamodb_table.test.name
  hash_key   = aws_dynamodb_table.test.hash_key
  range_key  = aws_dynamodb_table.test.range_key

  item = <<ITEM
{
  "id": {"S": "${format("%03d", count.index + 1)}"},
  "name": {"S": "テストデータ${count.index + 1}"}
}
ITEM
}
```

ハッシュキーがかぶってしまうと、当然同じアイテム扱いになってしまう。
単純に連番にしたいのであれば、```${count.index}```で今のループ回数にアクセスできる。
0オリジンなので注意が必要。

さらに、001, 002, 003…… と形式が決まっているときは、[format関数](https://www.terraform.io/docs/configuration/functions/format.html)を使う。

これで「queryやscanで取ってくる件数が変わった時にどれくらい性能差があるの？」と聞かれても焦ることなくデータが作れるようになるぞ！

# ループではなくてもっと自由にデータを編集してロードしたい人向け
大量データではないものの、もっと簡単にデータを敷き込みたい！という要望を受けたので考えた。
Terraform の csvdecode を使おう。

```HCL
resource "aws_dynamodb_table_item" "batch_items" {
  for_each = { for record in local.dataset : record.id => record }

  table_name = aws_dynamodb_table.test.name
  hash_key   = aws_dynamodb_table.test.hash_key
  range_key  = aws_dynamodb_table.test.range_key

  item = <<ITEM
{
  "id": {"S": "${each.value.id}"},
  "name": {"S": "${each.value.name}"}
}
ITEM
}

locals {
  csv_data = file("${path.module}/test.csv")

  dataset = csvdecode(local.csv_data)
}
```

```csvs:test.csv
id,name
001,Taro
002,Jiro
003,Saburo
004,Shiro
005,Goro
```

これで、CSVだけ編集すればロードするデータをお手軽に変更することができるようになる！
【CSS】inputタグのスタイリング基本プロパティ

## テンプレ

```scss

.c-input {
  font-size: 16px;
  width: 100%;
  height: 30px;
  border-radius: 3px;
  padding: 3px 5px;
  box-sizing: border-box;
  background-color: #fff;
      &:focus {
          outline: none;
      }
      &:invalid {
          border: solid 1px red;
      }
}
```
スタイリングは適当に書いたので、ユースケースに応じて設定する。

## プロパティ説明
### サイズ
`width` => 親(フォーム)要素のwidth、paddingで調整するので基本100%でいい
`height` => フォントのサイズとの兼ね合いで決める。フォントサイズが16pxで、余白が5px欲しかったら`height`は26px、みたいな感じ

### 形
`border-radius` => inputの角を調整する

### フォント
`font-size` => input要素のフォントサイズは`p`,`div`などとは別のため忘れず指定する。大体`input[type="text"]`とか、input要素単位で指定する
`font-color` => input要素のフォントカラーは`p`,`div`などとは別のため忘れず指定する

### レイアウト
`padding` => 文字とinputの余白を調整しないと窮屈な印象になる
`box-sizing` => `height`の値 = 縦のサイズにするため
`border-box`を指定して統一しやすくする。

### カラー
`background-color` => 背景色を指定する
`outline` => 外枠。`:focus`で付けることでフォーカス時の枠線を消す
ちなみに、スマホでタップした時の枠も`tap-highlight-color:rgba(0,0,0,0);` で消せる
``
Maxで正弦波、短形波、三角波、ノコギリ波

#前の記事
[Maxでメトロノームを使って腱鞘炎を華麗に回避](https://qiita.com/waokitsune/items/a09cc55f160f13ebfb9e)

#バージョン
Version 8.1.5（9359645）（64-bit windows）

#動機
cycle~オブジェクトで何か音は出せたけど、これだけだと多分飽きるよね。（もうすでに飽きてる）
じゃあ、他に音を生成するオブジェクトって何があるのか調べてみよう。
でもまだ初心者だから、とっつきやすいやつだけね。

（てゆうかcycle~自体ぼんやりとしか分かってないから知識をちょっと整理しておこう）

#ドキュメントを検索
Maxのドキュメントに対して **oscilattor** で検索をかけてみるぞい！
それで、チュートリアルを触ってみて自分なりに「シンプルだなぁ」って思うオブジェクトだけまとめてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1003d1d5-d034-0e46-f946-8836850fc0b2.png)

#音の波形を見たい
各オシレーター（≒音発生器）を確認する前に、波形を表示できるパーツがあるか探してみました。あたいの稚拙な文じゃ音のニュアンスは伝えられそうにないから…。

**cope~** というパーツで波形を表示できまっする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b164ceb0-f54c-ae69-b7df-a77d732d0bff.png)
ひとまず **自動モード** にしておくと、いい感じに波形を表示してくれまっする！

まずは右クリック ⇒ インスペクタ…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/70cee8a4-c628-3e9c-53be-7547073a431d.png)
自動モードにチェック！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/eef2e8fc-8f21-a89d-2c6e-8f8860dedc8a.png)

#cycle~（正弦波）
「波」と言われて真っ先に思い浮かべるような波形をしてる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8c5b74fb-9576-46f7-98eb-1f544bd795d7.png)

#rect~（短形波）
cycle~と違ってオブジェクトの引数が3つあります。1つ目は周波数だけど、2つ目と3つ目は値を変えると音がどう変わるのか未確認。（残課題）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b607b19b-b6d8-569b-287f-66fc3c7dab82.png)


#tri~（三角波）
正弦波の丸みを取った状態の波形。正弦波と三角波の中間のような波形の音はどうやって作ればいいんだろう？（残課題）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/60f8ed45-2b0c-aa72-1152-bd6e4c2197b8.png)


#saw~（ノコギリ波）
三角波の亜種みたいな感じだね。三角波とノコギリ波の中間のような波形を作るにはどうやればいんだろう？（残課題）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/dcba1a70-a6b8-b704-df64-1e53a4db2b6f.png)

#次の記事
[Maxでどの音を鳴らすかをマウスクリックで切り替える](https://qiita.com/waokitsune/items/69c6d2835ff03a29dd97)
ISSのローカルサーバーでCSSが適用されない

ISSのローカルサーバーで、DBの内容とかは反映されてるのにCSSが適用されなかったので備忘録として残しておく


#####１．コントロールパネルを開いて「プログラム」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706758/6e3bfe6b-801b-6a0b-9083-481343b88b95.png)

#####２．「Windows の機能の有効化または無効化」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706758/c275a014-c789-e22a-9d7f-71d97980d5e7.png)

#####３．「静的なコンテンツにチェック」を入れる
`インターネット インフォメーション サービス > World Wide Web サービス > HTTP 共通機能 > 静的なコンテンツ`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706758/316e7ee5-f0b1-c292-8c41-50f49dba2614.png)


この手順でCSSが効くようになります
LinuxMintにElixirを導入する

#LinuxMintでは公式手順+ファイルの書き換えをする。
　 LinuxMint使ってるとよくある事象ではあるのですが、パッケージをインストールするときにパッケージの取得元を変更してあげる必要があるときがあります。
　Elixirの環境セットアップ時も必要だったので、どこをどう書き換えるかも含め、導入手順を記載しておきます。

※ほぼ、公式に記載されている手順通りです。
※LinuxMint19.3 xcfeを利用しています。

##導入手順
　
###①debファイルの用意

```bash
wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb && sudo dpkg -i erlang-solutions_2.0_all.deb
```

###②パスの変更
　下記パスのファイルをエディタで開きます。
※読み取り専用ファイルのため、Vimとかだとsudoをつけてあげる必要があるかもしれません。

```
/etc/apt/sources.list.d/erlang-solutions.list
```
　開くと下記のような内容が記載されているはずです。

```sh

### THIS FILE IS AUTOMATICALLY CONFIGURED ###
# You may comment out this entry, but any other modifications may be lost.
deb http://binaries.erlang-solutions.com/debian tina contrib
```

　3行目（"deb"から始まる行）を下記の内容へ書き換えます。

```
deb http://binaries.erlang-solutions.com/debian bionic contrib
```

③インストール
　下記3つコマンドを叩くだけです。

```
sudo apt-get update
sudo apt-get install esl-erlang
sudo apt-get install elixir
```

###補足
こちらの記事を元にパスを一部変更して行いました。
→https://nakawork.net/posts/install-erlang-linux

公式手順も一部抜粋しておきます。
>Ubuntu 14.04/16.04/17.04/18.04/19.04 or Debian 7/8/9/10
Add Erlang Solutions repository: wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb && sudo dpkg -i erlang-solutions_2.0_all.deb
Run: sudo apt-get update
Install the Erlang/OTP platform and all of its applications: sudo apt-get install esl-erlang
Install Elixir: sudo apt-get install elixir

引用元：https://elixir-lang.org/install.html#gnulinux
Haskellの実行　まずはHello World

#Haskellを実行してみる
プログラミング言語を学ぶ際の通過儀礼
Hello Worldをやってみる
よく使いそうな実行コマンドについてもメモ

※[Haskell初心者の備忘録](https://qiita.com/Nipper1357/items/a5195dd8bbc8873307c8)にまとめています

#コード
Haskellの拡張子は「.hs」

```haskell:hello.hs
main = putStrLn "Hello World"
```

#実行してみる
##ghc
コンパイルは「ghc ファイル名」

```
>>ghc hello.hs
[1 of 1] Compiling Main             ( hello.hs, hello.o )
Linking hello.exe ...

>>hello
Hello World
```

Windowsの場合、コンパイルを行うと中間ファイル(.hiと.o)と実行ファイル(.exe)が作成される
実行は通常の実行ファイルと同じように

##runghc
コンパイル＆実行のコマンドは「runghc」

```
>>runghc hello.hs
Hello World
```
こちらでは中間ファイルや実行ファイルは作成されない


#まとめ
通過儀礼達成
Hello World!

#参考文献
GHCの４つの実行方法
https://haskell.jp/blog/posts/2017/08-ghc-4way-execution.html
RL78でArduinoフレームワークを利用

#ハードウェア
マイコンボード：RL78/G14 Fast Prototyping Board
MCUは80ピン（R5F104MLAFB）
コアは16ビットRL78
内蔵フラッシュROM512KB, RAM:48KB
　ROM,RAMともに,このSoCの最大量を搭載している．SoCは,入出力合わせて74ピンのI/Oを持つ．ルネサスのSoCらしく,一通りの機能を搭載しているので,色々遊べそう．
　ボードにはSoCの全ピンが引き出されている．

●良い所
　ボードの回路図や,部品表などの資料が公開されている．
●悪い所
　ちょっと値段が高い．中華ボードやSoCに比べると．．．ﾈ
[ボードは これ](https://www.renesas.com/jp/ja/products/software-tools/boards-and-kits/eval-kits/rl78-g14-fast-prototyping-board.html#productInfo "これ")


#公式の資料
##サンプルコード
オンボードLED 点滅制御 (Arduino API)https://www.renesas.com/jp/ja/software/D6004521.html


##アプリケーションノート
###RL78 ファミリ Arduino API 導入ガイド（R01AN5413JJ0100）
https://www.renesas.com/jp/ja/doc/products/mpumcu/apn/rl78/003/r01an5387jj0100-rl78g14-apl.pdf

###RL78/G14 7セグメントLED 点灯制御 (Arduino API)（R01AN5387JJ0100）
https://www.renesas.com/jp/ja/doc/products/mpumcu/apn/rl78/003/r01an5387jj0100-rl78g14-apl.pdf

###RL78/G14 Fast Prototyping Board回路図
https://www.renesas.com/jp/ja/doc/products/mpumcu/doc/rl78/001/r20ut4575ej0100_rl78g14fpb_schematic.pdf
揮発性メモリと不揮発性メモリの違い

メモリは**`揮発性メモリ`**と**`不揮発性メモリ`**の2種類がある。

#揮発性メモリ(volatile memory)とは
- 揮発性メモリはパソコンに内蔵されているようなメモリで、電源を落とすと情報が消える。

- 揮発性メモリの例
    - DRAM：データを保持する為の書き直し（リフレッシュ）が必要。メインメモリに使われる。
    - SRAM：フリップフロップ回路でデータを保持する。DRAMより高速だか価格が高い。キャッシュメモリに使われる。

#不揮発性メモリ(non-volatile memory)とは

- 不揮発性メモリは、電源を落としても情報は消えない。

- 不揮発性メモリの例
    - ROM
    - フラッシュメモリ(USBメモリ、SDカード、SSD)：DRAMやSRAMよりも読み書き速度は劣るが安価である。
 
※フラッシュメモリは技術的にはROMの一種であり、「例外的に読み書きができるROM」である。それゆえフラッシュメモリは「フラッシュROM」とも呼ばれる。
WSL2からWindows Explorerを開きたい (Macのopenコマンドと同様のことをWSL2でも実現したい)

# 問題

Macのターミナルには`open`というコマンドがあって、たとえば`open .`とするとカレントディレクトリがFinderで表示します。同じことをWSL2で実現したい場合はどのようにすればよいでしょうか? つまりWSL2からWindows Explorerを開きたい場合、どのようにすればよいでしょうか? 

# 解決策

たとえばWSL2のカレントディレクトリをWindows Explorerで開きたい場合、解決策は次の2つになります。

- `cmd.exe /c start .`
- `explorer.exe . `

どちらも覚えておくにはやや長いので、`.bash_profile`などにエイリアス登録や関数定義しておくとよいでしょう。ちなみに自分は次のような`window`関数なるものを`.bash_profile`に定義して使っています。

```bash
window(){
  if [[ $# -eq 0 ]]; then
    cmd.exe /c start .
  else
    cmd.exe /c start $1
  fi
}
```

# 環境情報

- Winedows: Microsoft Windows [Version 10.0.19041.450]
- WSL2: Ubuntu 20.04 LTS
SQL(MySQL)入門！ データベースの作成

MySQLのインストールが終わり、rootユーザーでログインが完了している前提で始めていきます。

----

環境
　Windows 10
　MySQL : version(5.7.28)
使用アプリ
　コマンドプロンプト(Windowsマーク押して「cmd」って打ったら出てくるやつ)

----


#データベースの作成
>データベース作成のクエリ文

    CREATE DATABASE データベースの名前;

実行例 : 
![コメント 2020-09-10 195912.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/ccdc84b9-cbb2-ece3-6725-7a257b087ed7.jpeg)
「sample_db」という名前のデータベースを作成しました。

    Query OK. 1 row affected (0.00 sec)
このように表示されれば、データベースの作成に成功しています。

###データベース作成時の補足
    CREATE DATABASE IF NOT EXISTS db01;

上記のようにすることで「db01が存在していなければdb01という名前のデータベースを作る」という意味になります。
このようにクエリを書くことで、データベースの重複や、すでにあるデータベースを上書き消去してしまうミスを防ぐことができます。


###データベースのオプション
    CREATE DATABASE IF NOT EXISTS db01
        CHARACTER SET=utf8mb4
        COLLATE=utf8mb4_bin;
        -- ENCRYPTION='N'

+ **CHARACTER SET=utf8mb4**　文字コード
+ **COLLATE=utf8mb4_bin**　照合順序
+ **ENCRYPTION='N'**　暗号化（Y or N）  *※自身の環境（MySQL : version(5.7.28)では実行できませんでした。プラグインのインストールが必要になるようです。*



# データベースの表示 ・ 指定 ・ 確認 ・ 削除
###表示
> データベースの一覧を表示
**SHOW DATABASES**;
*※SHOWコマンドはMySQL独自のもの（方言と呼ばれているもの）です*


    SHOW DATABASES;

![コメント 2020-09-10 202110.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/4f5f5c56-a6a8-50c6-b41d-7b742221cd1d.jpeg)
先ほど作成した「sample_db」と「character_db」が表示されているのがわかるかと思います。その他にもデータベースがいくつかありますが、管理や運用などで必要なものをMySQLが自前で作成したデータベースなので、得に気にしなくて大丈夫です。(黒で塗りつぶされているところは僕が作成しているデータベースです。)


###指定
> データベースの指定
**USE** データベース名;

    USE sample_db;

使いたいデータベースを指定します。
![コメント 2020-09-10 202940.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/ee5b5b17-b2e9-f4ad-424e-d1a48eec79c8.jpeg)
このような表示が出ればデータベースの指定は成功です。

###確認
> データベースの確認
**SELECT DATABASE()**;

    SELECT DATABASE();

今、使っているデータベースの確認ができます。
![コメント 2020-09-10 203249.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/f1c4615a-14fc-d663-22e0-4ff5de003a47.jpeg)
このように表示されればオッケーです。


##補足
>使っているデータベースのバージョンの確認

    SELECT VERSION();

**実行結果**
![スクリーンショット 2020-09-12 103831.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/b4c34730-e45c-60d6-814f-1bc947c98848.jpeg)
このコマンドで現在のデータベースのバージョンを確認することができます。

###削除
> データベースの削除
**DROP DATABASE** データベース名;

    DROP DATABASE character_db;

「character_db」を削除します。
*※この方法で削除してしまったデータベースは基本的に復元することができないので、最新の注意を払って慎重に作業してください。*
![コメント 2020-09-10 230646.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/c5e653b3-e5a8-eee9-8f8f-0cb16f41fc99.jpeg)
このように表示されればデータベースの削除は成功です。

本当に削除されたのか確認してみます。

    SHOW DATABASES;

![コメント 2020-09-10 231818.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/13004bef-4df1-b2c8-a02f-e07706ac7d3a.jpeg)

表示されたデータベース一覧から「character_db」が消えているのがわかります。

#終わりに
SQL(MySQL)の第一歩！ということで、データベース作成、表示、指定、確認、削除と学んできました。
このあとはいよいよテーブル作成などに入っていきます。
SQLの基礎をしっかりと見につけていきたいと思います。
goreleaserをGithub Actionsで利用するまでのQuick Start

goreleaserは、Goプロジェクトをビルドして、各OS向けの実行可能バイナリやDocker Imageを作成し、GithubのReleaseやDocker Repositoryに配布してくれるツールです。この記事ではGithub Actionsを利用して、goreleaserによるビルドから配布までを自動化するまでの手順を示します。
# 1) goreleaserのインストール

次のURLを参考にgoreleaserをインストールし、`goreleaser`コマンドを利用できる環境にします: https://goreleaser.com/install/

個人的には公式のDockerイメージを使うのが一番楽かと思います。

# 2) .goreleaser.ymlの作成

プロジェクトディレクトリの直下に`goreleaser.yml`を作成します。作成には`goreleaser init`コマンドを利用します。

```
cd project-directory
goreleaser init
```

goreleaserのインストールにDockerを利用した場合は、次のようにしてください。

```
cd project-directory
docker run --rm --privileged \
  -v $PWD:/src \
  -w /src \
  goreleaser/goreleaser init
```

# 3) .goreleaser.ymlの修正

必要な場合は`.goreleaser.yml`を修正してください。もっとも作成した初期の状態でも、windows、Linux、OSX向けの実行可能バイナリを作成してくれる状況にはなっています。

# 4) ワークフローファイルの作成

Github Actionsでgoreleaserを利用する場合は公式のワークフローを利用するのがもっとも便利です。プロジェクトディレクトリ直下に`.github/workflows`ディレクトリを作成し、任意の名前の`.yml`ファイルを作成します。__この`.yml`ファイルの中身は以下のURLの`README.md > Usage > Workflow`をそのままコピペすればよいです: https://github.com/goreleaser/goreleaser-action__



# 5) ワークフローファイルの修正

必要な場合は、ワークフローファイルを修正してください。

# 6) ワークフローの起動

あとはワークフローファイルに書かれた条件を実現して、Github Actionsを起動するだけです。
djangoのmodelをインタプリタから使う

インタプリタから直でdjangoのモデルにアクセスしようとすると以下のエラーで怒られる。

```
django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
```

コレを防ぐためにはまず、モデルをインポートする前に以下を呼ぶ必要があるようだ。
後に呼ぶとエラーになる。

```py
django.setup()
```

加えて、環境変数を設定する必要がある

```py
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app_name.settings')
'app_name.settings'
```

まとめると以下のようになる。

```py
>>> import django
>>> import os
>>> os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app_name.settings')
'app_name.settings'
>>> django.setup()
>>> from APP_NAME.models import YourModel
>>> YourModel.objects.all()
<QuerySet []>
```
Grand Central Dispatch (GCD) の理解を深める

### GCD とは？

macOS、iOS、watchOS、tvOS のマルチコアハードウェアでの並列実行タスクをするために提供されている言語機能で、開発者は `DispatchQueue` を使用してスレッドでの処理を管理することができます。また、GCD の Queue は追加されたタスクの順番ごとに処理を実行する FIFO(First In First Out) の性質を持っています。

### 一旦用語をまとめる

#### Process(プロセス)

アプリケーションの実行インスタンスであり、専用の仮想メモリ空間およびシステムのリソースが割り当てられる。また、プロセス内には複数のスレッドが含まれる。

#### Thread(スレッド)

プロセスが実行する処理などを格納した箱のようなもの。

#### Task(タスク)

スレッドに格納される具体的な処理の単位。

#### Queue(キュー)

アプリケーションに含まれるスレッドを管理するための高レベルな API で、Thread の作成・管理の役割を担っている。また、実際に処理される時にはシステムが効率的なタスクの実行を行うことで、キューはスレッドの管理に集中することができる。


## Queue(キュー)の種類

言語で提供されているキューは主に３つあり、それぞれスレッドの管理範囲が異なります。

### Main

`DispatchQueue.main` でアクセスできるキューで、スレッドはシステムから提供されています(メインスレッド)。また処理の実行は直列で行われていて、原則として UI の更新などはこのスレッドで行う必要があります。

```swift
    DispatchQueue.main.async {
        // 処理
    }
```

### Global

`DispatchQueue.global(qos:)` でアクセスできるキューで、引数に `DispatchQoS.QoSClass` を指定してタスクを実行するスレッドを指定します。また、システムのタスクの優先度には `high`・`default`・`low`・`background` の４つがあり、`DispatchQoS.QoSClass` の値はシステムが効率的にタスクを行う際の優先順位を決める判断材料としても使用されます。基本的には、開発者はどれが最も優先度が高いなどと考える必要がなく、それぞれのタスク内容に応じて、適切な `DispatchQoS.QoSClass` を指定する必要があります。それぞれのタイプの詳細については公式の[ドキュメント](https://developer.apple.com/documentation/dispatch/dispatchqos)を参照するといいでしょう。また、このキューはシステムで共有され、それぞれ並列で処理の実行が行われます。

```swift
    DispatchQueue.global(qos: .background).async {
        // 処理
    }
```

### Custom

`DispatchQueue(label: "hoge")` のように `label` 引数に任意の値を追加することで、独自のスレッドにタスクを追加することができます。また、直列また並列でのタスクの実行を選択することができます。基本的には `attributes` 引数で `.concurrent` を指定すると並列で実行され、指定がない場合は(Swift2以前は `.serial` で指定できたっぽい)、直列での実行になります。

```swift
    DispatchQueue(label: "hoge.hoge.hoge").async {
        // 処理
    }
```


## 同期・非同期

先で説明した、どのタイプのキューも `同期`・`非同期` での実行を選択することができ、それぞれ `sync(同期)`・`async(非同期)` ないで処理を書くことができます。また具体的な挙動としては下記のようになります。

- 同期処理
  - スレッドにタスクを追加した時に、呼び出し元のスレッドはそのタスクの完了をまってから次の処理を行います。
- 非同期処理
  - スレッドにタスクを追加した時に、呼び出し元のスレッドはそのタスクの完了を待たずに次の処理を行います。

メインスレッド内でバックグランドスレッドにタスクを追加して、`同期`・`非同期` でそれぞれ実行したサンプルが下記のようになります。

```swift
    // 同期処理
    print("a")
    DispatchQueue.global(qos: .background).sync {
        print("b")
    }
    print("c")

    // 結果
    // a
    // b
    // c

    // 非同期処理
    print("a")
    DispatchQueue.global(qos: .background).async {
        print("b")
    }
    print("c")

    // 結果
    // a
    // c
    // b
```


これらは、キューの種類の説明でも出てきた `直列`・`並列` の言葉と混合しがちなので、スレッド間の実行順序に使われるのが `同期`・`非同期` で、スレッド内の処理の実行順序に使用されるのが `直列`・`並列` という認識で差し支えないかと思われます。


### 参考

- https://developer.apple.com/documentation/dispatch/dispatchqos
- https://developer.apple.com/documentation/dispatch/dispatchqueue
- https://developer.apple.com/videos/play/wwdc2016/720/
- https://qiita.com/ShoichiKuraoka/items/9599c32bc27c3c822f02
- https://qiita.com/ShoichiKuraoka/items/bb2a280688d29de3ff18
- https://qiita.com/shiz/items/693241f41344a9df6d6f
【Laravel×Vue.js】リダイレクト時にセッションデータを持ってメッセージを表示

ログインユーザーのみアクセス可能なURL`/sample/`に非ログイン状態でアクセスした際、
ログインページにリダイレクトし、「この機能を使うためにはログインしてください。」とメッセージを表示させた時の実装です。
（`/sample/`からリダイレクトされた場合のみメッセージを表示する。）


### SampleController.php
リダイレクトとともにセッションデータを渡す処理を記載


```php:SampleController.php

namespace App\Http\Controllers;

// 現在のHTTPリクエストインスタンスを取得するため、Illuminate\Http\Requestクラスを指定
use Illuminate\Http\Request;

class SampleController extends Controller
{
    public function __invoke(Request $request)

        // 未ログイン時はloginページにリダイレクト
        // withで「showMessage」というセッションデータを渡す
        if (!\Auth::check()) {
            return redirect('login')->with('showMessage', true);
        }

        // ログインしていれば/sample/を表示
        return view('sample.index');
    }
}
```

redirect時に、`with`を使って`showMessage`というBoolean型のデータを持たせている。
（trueのところに`'メッセージです。'`とすると、テキストメッセージを持たせることも可能。）

これで未ログイン時に/sample/ページにアクセスすると、
/login/にリダイレクトされ、 ページ上で`showMessage`の値を使用できる。


### login.blade.php
ログイン用のviewであるlogin.blade.phpで、セッションを表示してみる。

```php:login.blade.php
{{ session('showMessage') }}
// 1
```

/login/にshowMessageの真偽値`true` が渡っているので、「1」と表示される。
これでセッションデータで値が渡っているのを確認できた。

この値を`vue.jsのコンポーネント` に渡す処理をかく。



```php:login.blade.php
@section('content')
    <sample-component>
                 :show-message="{{ session('showMessage') ? 'true' : 'false'}} ">
    </sample-component>
@endsection
```

### SampleComponent.vue
コンポーネントが埋め込まれている`login.blade.php` から渡されたセッションデータ`show-message` を、
親から子がデータを受け取る際に使う`props` で受け取っておく。
（vue.jsではケバブケースではなくキャメルケースで受け取る。）

```js:SampleComponent.vue
export default {
  props: {
    showMessage: {
      type: Boolean,
      default: false,
    },
  },
};
```

ここまできたら、受け取った`showMessage`を使って、
`v-if` などで`true`だったらメッセージを表示するなどが可能。


```vuejs:SampleComponent.vue
<template>
  <div class="mb-4">
    <div v-if="showMessage">
      <p>この機能を使うためにはログインしてください。</p>
    </div>
    ...省略...
  </div>
</template>

<script>
export default {
...省略...
  props: {
    showMessage: {
      type: Boolean,
      default: false,
    },
  },
};
</script>
```

これで未ログイン時に/sample/ページから/login/にリダイレクトしてきた時のみ、
`showMessage`というセッションデータを持って真偽の判定を持たせることができました。
イベントハンドラー とイベントリスナーの違い


>1.タグ内の属性として宣言する
2.要素オブジェクトのプロパティとして宣言する
3.addEventListenerメソッドを使って宣言する

[引用元:JavaScript本格入門　山田祥寛著](https://gihyo.jp/book/2016/978-4-7741-8411-1)


1.2がイベントハンドラー
3がイベントリスナー

document.addEventListener('DOMContentLoaded',function(){
}, false);
内で定義されてるのが3のイベントリスナーってことにとりあえずしておく。