OmniAICreator/Qiita-1.07M huggingface dataset:
あの日見たScriptableObjectの型を僕達はまだ知らない

# ScriptableObjectの読み込みを一元管理する
ScriptableObjectは便利ですよね。データをひとまとまりで取得できる優れものです。
今回はそれを読み込む流れを一元管理したいと思います。

# 読み込みが管理されていないと、どうなる？
![Image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413999/835df3dd-9fa2-691d-8185-839116bf34b6.png)
クラスとScriptableObjectが「多対多」の関係になってしまい、人間の脳に優しくありません。

# 間に管理クラスを挟んで、「1対多」の関係を作る
![Image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413999/2ea79f77-7133-4e8e-be92-568e8286a6d7.png)

# 管理クラス作成のために、ジェネリクスを使う
```cs:LoadData.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public sealed class LoadData
{
    private static LoadData instance = new LoadData();

    public static LoadData Instance
    {
        get
        {
            return instance;
        }
    }
    // ScriptableObjectのみ受け付けるジェネリクスメソッド
    public T ScriptableLoader<T>(string path) where T : ScriptableObject
    {
        return Resources.Load<T>(path);
    }
}
```
こうすることで、ScriptableObjectが返されることを保証しつつ、様々な型のScriptableObjectを指定できます。

# 例
## コード
今回使用したScrptableObjectです。

```cs:GameData.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(menuName = "MyScript/Create GameData")]
public class GameData : ScriptableObject
{
    public int Data1;
    public string Data2;
    public float Data3;
}
```
これをもとに、ScriptableObjectを作成し、値を入れます。
![Image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413999/8a7f261c-6574-83bc-6afe-28ff965b8b14.png)


それをStart()で表示してみます。

```cs:Game.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Game : MonoBehaviour
{
    
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log(LoadData.Instance.ScriptableLoader<GameData>("Data/MyGameData").Data1);
    }
}
```

## 実行結果
![Image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413999/a7983430-7ff2-573b-beac-c09317985c3c.png)

# おわりに
以上、「ScriptableObjectの型は使いたいクラスだけが知っていればいいよね。読み込むクラスはそんなの知らなくていいよ」という話でした。
Jupyterプロセスの管理

## 課題
起動済みのJupyterにブラウザでアクセスするためには、そのJupyterがつながっているポート番号と、アクセストークンが必要になる。これらは、Jupyterプロセスの標準エラーに出力されるログに記載されている。Jupyterにアクセスする度に、この情報を端末やログファイルから探し出すのが面倒なので、これらを管理するコマンド`jmanager`を作成した。

## インストール
```
pip install jmanager
```

## 使い方
jupyterを使いたいディレクトリで

```bash
$ jmanager
```
を実行する。この時、既にカレントディレクトリから起動済みのjupyterサーバーがあれば、それに接続し、なければ新しいjupyterサーバーを立ち上げる。

## 仕組み
初回実行時に、ポート・トークン・プロセスIDをローカルの`jupyter.pid`ファイルに保存する。この時、単純にjupyterサーバーを立ち上げるだけではなく、サーバープロセスの終了を待つプロセスも同時に作成し、サーバープロセス終了時に`jupyter.pid`ファイルを削除する。

## ソース
https://github.com/hotoku/jmanager

## コマンドラインオプション
COMMANDを省略すると、`run`が選ばれる。

```bash
$ jmanager --help
Usage: jmanager [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  ignore  Print lines for .gitignore
  kill    Terminate jupyter process
  run     Launch new jupyter or connect to existing one.
```
Vue.jsでHello World!を表示させる。

まずはhead部分

```
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
```
続いてbody

```
<body>
    <div id="app">
        {{ message }}
    </div>
    <script>
        new Vue ({
            el: "#app",
            data: {
                message: "Hello World!"
            }
        });
    </script>
</body>
</html>
```
MacのTouch Barにmfaコードをコピーするボタンを作る


昨今、mfaが必須と言われていますが、毎回スマホのロックを解除してコードを見るのが面倒じゃないですか？
MacのTouch Barにmfaコードをクリップボードにコピーするボタンを配置する方法をご紹介します。

# OATH Toolkitの導入
まずは、CLIにてmfaコードを扱えるようにOath Toolkit (https://www.nongnu.org/oath-toolkit/) を導入します。

```
$ brew install oath-toolkit
```

# mfaの設定

AWSや、googleにmfa認証の設定画面へ行く。以下AWSの場合の例です。

仮想MFAデバイスの設定画面にて、シークレットキーの表示で表示される32文字のキーを覚える。 
![Image 2020-07-07 08-32-07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130299/48f32df7-793b-13d4-6685-4d45f5e327f2.jpeg)

※ 基本的に仮想MFAデバイスはユーザー毎に１つしか登録することはできません。
今スマホで登録ずみのMFAデバイスがある場合は、一度削除して、登録し直しましょう。
同じキーを使用して、PCとスマホ両方でmfaコードを生成することは可能です。
その場合は、上記の同じ32文字のキーをPCとスマホ両方に登録しましょう。

# CLIでのmfaコードの生成

oathtoolを使って、以下のコマンドにてmfaコードを表示することができるようになります。

```
$ oathtool --totp --base32 "３２文字のキーをスペース無しで入れる”
```

pbcopyコマンドにて、クリップボードにコピーすることも可能です。

```
$ oathtool --totp --base32 "３２文字のキーをスペース無しで入れる” | pbcopy
```

上記をaliasに登録するだけでも大分手間が省けるかと思いますし、これでCLIにてmfaコードを扱えるようになりましたので、
色々ログインを自動化することもできるでしょう。

※32文字のシークレットキーが漏れると誰でもmfaコードを生成することが可能になります。暗号化して保存するのがベターでしょう。

# Touch Barへの登録

さて、ここからは上記コマンドをTouch Barに登録する方法のご紹介です。

Automatorを起動します。
あまり使ったことはありませんでしたが、macの操作を色々自動化できる奴です。macOS標準で入っています。
![Image 2020-07-07 08-52-37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130299/4ea9315c-951d-8390-ca3c-8d581fa0fb97.jpeg)

クイックアクションを作成します。
![Image 2020-07-07 08-55-05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130299/1a7948ad-d4cb-d76f-a687-f1f3244fd87e.jpeg)

"シェルスクリプトを実行"のアクションを右側のワークフローのエリアにドラッグ＆ドロップして追加します。
![Image 2020-07-07 08-59-22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130299/3fb2a2d3-d1b0-7d8a-f084-956490c80ed5.jpeg)

シェルスクリプトの内容は以下で登録します。
```
/usr/local/bin/oathtool --totp --base32 "３２文字のキーをスペース無しで入れる”
```
次に"クリップボードにコピー"のアクションを右側のワークフローのエリアにドラッグ＆ドロップして追加します。
![Image 2020-07-07 09-03-18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130299/ece14d57-e0ce-0ae1-bcde-d907666c4e6d.jpeg)

ワークフローのインプットを"入力なし"に設定します。
![Image 2020-07-07 09-05-14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130299/46410a44-3ac6-f794-1b60-8b7f9c098f43.jpeg)

ファイルの保存メニューから適当な名前をつけてワークフローを保存します。

次は、作成したクイックアクションのワークフローをtouchbarから呼び出せるようにします。

システム環境設定 -> 機能拡張から、TouchBarを選び、先ほど保存したクイックアクションのチェックをつけます。
![Image 2020-07-07 09-16-39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130299/f3f5479a-687f-d2d3-fdf0-0c8aef8c42a5.jpeg)

システム環境設定 > キーボードを開いてTouchBarをカスタマイズボタンをクリックします。

![Image 2020-07-07 09-11-02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130299/5c87435d-88c9-2bff-67ff-149a5f4dcf22.jpeg)

クイックアクションのメニューをTouchBarに追加します。
クイックアクションを展開済みにするかなど、この辺りは好みで。

以下のリンク先を参照すると分かりやすい
https://amamemo.com/memo/7894
https://mutsunic.com/mac-touch-bar/

これでTouch Barのボタンでいつでもmfaコードがクリップボードにコピーされるので、
ボタンを押したら、後は入力したい場所に貼り付けるだけでOK!!
PowerShellで安易にファイル操作を試みた結果

※個人的なメモです

確認事項
PowerShellでファイル操作困難な文字
　[]
PowerShellでエスケープ必須の文字
　半角' 全角´
　半角& 全角＆
　※PowerShellは全角も特殊文字として扱う

コマンドプロンプトで特筆すべき禁止文字
　半角&

概要
PowerShellでフォルダ内の特定のファイルを探して子フォルダを作成して移動する簡単なスクリプトを書いた
ファイル名に[]が含まれているためフォルダ作成はできてもファイル移動が不可能
代替手段としてバッチに引数を渡して実行することにした
バッチに引数を渡すことはできたがバッチから戻り値( EXIT /B "文字列" )を得られなかった
PowerShellで与えた引数に全角＆が含まれていると引数を""でエスケープしても
バッチ側でコマンドの区切りとして扱われて正常に動作しなかった
通常バッチは全角＆を認識しないがPowerShellが引数を渡す時に半角&に変換するようだ

感想
PowerShell のコマンドレットだけではファイル操作は容易ではなかった
~~バッチだけで書いたほうが短いし簡単~~

追記
コメントでご指摘いただいた部分改修できました
-LiteralPath がタブ補完で出てこなかったので悩んでいました
バッチを通さないので上記の煩雑な引数の問題がすべて無くなしました
頭の整理のためコードを残しておきます

```powershell:ファイルをフォルダに入れてアレするやつ.ps1(ver.7.0.2)
# ドラッグドロップでディレクトリのパスを取得(ショトカ起動)
Set-Location -Path $Args[0]
# ファイルだけ
$childlist = Get-ChildItem | ? { ! $_.PSIsContainer }
# フルパス
$fulllist = $childlist | Select-Object FullName | Format-Table -Wrap | Out-String -Stream
# 条件絞る
$matchlist = $fulllist -match 'sm[0-9]{8}.(flv|mp4)$'
# 再帰処理
foreach ($a in $matchlist) {
  [string]$b = Split-Path $a -LeafBase
  $c = $b.Substring($b.Length-10,10)
  
  mkdir $b
  Move-Item -LiteralPath $a -Destination $b
  Push-Location -LiteralPath $b
  get-Location | Out-String -Stream
  Start-Sleep -s 5
  "$cを使う処理"
  Pop-Location
  Start-Sleep -s 15
}
Read-Host "終了 Enter キーを押してください..."
Exit
```
メモ_コマンドプロンプト

疎通確認時にいつからPingを始めたのかを手間なくわかるようにするため、１行のコマンドで実行。

date /t & time /t & ping -t google.com

date /t
・・・月日を表示
time /t
・・・時刻を表示
ping -t サイト名|IPアドレス
・・・連続Ping
&
・・・コマンドを続けて実行（Linuxでいうセミコロン）
Nuxt.jsでポートフォリオサイトを作ろう #4: プロフィール画面の作成

![nuxt.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/68126fb2-3dea-b2c5-e1fb-362527fc6604.jpeg)

[前回](https://qiita.com/takahashitakuya031126/items/05f3a8b75cfd9420dc03)の続きです。

####画像の保存

static/imageディレクトリに、今回使用する画像を保存します。本記事では「profile.jpg」という名前で保存します。

####プロフィール画面の表示

index.vueにコードを追加します。

```JavaScript:pages/index.vue
<template>
    <div>
        <Top />
        <v-divider></v-divider> // 追記
        <Profile /> // 追記
    </div>
</template>

<script>
import Top from '~/components/Top.vue'
import Profile from '~/components/Profile.vue' // 追記

export default {
  components: {
    Top,
    Profile, // 追記
  }
}
</script>
```

次にcomponentsディレクトリにProfile.vueを作成します。

```JavaScript:components/Profile.vue
<template>
    <div id="profile">
        <v-container
        fluid>
            <v-card
            width="100vw"
            >
            <v-card-title
            class="pa-5 justify-center display-1 font-italic"
            >
                自己紹介
            </v-card-title>

            <v-row
            justify="center"
            align-content="center"
            >
                <v-col
                  cols="12"
                  sm="5"
                  md="5"
                  align="center"
                >
                <v-row
                justify="space-around"
                align-content="center"
                style="height:100%"
                >
                <v-avatar // アバター表示
                width="60vW"
                height="auto"
                >
                <img
                  src="/image/profile.jpg"
                  alt="PROFILE"
                  style="object-fit: cover;"
                >
                </v-avatar>
                </v-row>
                </v-col>
                <v-col
                  cols="12"
                  sm="6"
                  md="6"
                >
                <v-list> // プロフィール項目の表示
                    <v-list-item
                    v-for="profile in profiles"
                    :key="profile.content"
                    >
                      <v-list-item-content>
                        <v-list-item-title><v-icon>mdi-check</v-icon> {{ profile.content }}</v-list-item-title>
                      </v-list-item-content>
                    </v-list-item>
                </v-list>
                </v-col>
            </v-row>
            </v-card>
        </v-container>
    </div>
</template>
<script>
  export default {
    data: () => ({
      profiles: [
        { content: '名前'},
        { content: '生年月日'},
        { content: '出身地'},
        { content: '出身大学'},
        { content: '職業'},
        { content: '資格'},
        { content: '趣味'},
        { content: '特技'},
        { content: 'その他'},
      ],
    }),
  }
</script>
```

ブラウザが自動更新されるので、確認してみると、

![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/5b31630d-e9b3-0403-4abd-abc4362eda36.png)

上のような画面が表示されます。

次回は作品紹介画面を作成していきます。

[Nuxt.jsでポートフォリオサイトを作ろう #5: 作品紹介画面の作成](https://qiita.com/takahashitakuya031126/items/2a8a39110f549232c2a9)
データ分析アンチパターン： マッドサイエンティストによる宇宙人的データ分析

## 背景

最近いろいろデータ分析をすることがあって、様々なツール使ったり、Pythonでコード組んだり、でもなかなかうまくいかない。 そもそも「うまくいく」という意味が実はよくわかってない。

そんな中「機械学習のアンチパターン」というQiitaのお題があったので思った事を書いてみました。

## アンチパターン： 「マッドサイエンティストによる宇宙人的データ分析」

シンプルに言いたいことは１つだけ「機械学習うんぬんの前に対象のことをちゃんと知ろう」です。

機械学習などの高度な知識・技術を持っていることはもちろん大事です。

でも、もっともっと大事なのは、対象とするドメインに十分に詳しい or 十分に熱量があることです。

- ドメインへの深い理解がある
- 今はまだ理解してなくてもドメインを理解しようという気持ちがある
- その問題を解決したいという熱量がある

もし、こういう気持ちがまったく無い場合、宇宙人的に何の理解も興味もなくデータだけ見て、無駄な労力と技術を使って「え？」が出てきます。

## 事例

### 事例１．日本語を知らないマッドサイエンティストによるベストセラー分析

**👽「よし、日本とか言う国で小説をヒットさせてお金稼ぎをしよう」**

さっそく売れている小説を分析して、日本で売れる小説を見つけようとして頻出ワードなどを調べます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/6e75ccda-a6bc-7112-d2bd-5c9acd8bbfee.png)

**「日本で売れる小説は『の』や『に』を多く使えばよさそうですね。」**

もちろんこれはフィクションです。

でもこんなことないと言い切れますか？

もちろん真面目にやるなら、ストップワードみたいなものを考えるでしょう、品詞も考えるでしょう、単語ではなく文章で考えるかもしれません、単に頻出ではなくTF-IDFみたいな特徴も考えるでしょう、Doc2Vecなど使うかもしれません。でもそれは「日本語」を知っているからやれることです。

何にせよまずやるべきことは「日本語を勉強する」ことです。

### 事例２．データ以外の背景を見ようとしないマッドサイエンティストによる船員の選定

**👽「難しい航海を考えているので船員を選びたい。有名な事故をもとに生存確率の高い船員で構成しよう」**

みんな大好きタイタニックの分析です。
これはタイタニック乗客の年齢別の平均生存確率です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/b6969171-1767-1bc8-7e25-1abd0bfa12c6.png)

0歳と80歳にピークがありますね。

**「これはもうデータから明らか。0歳と80歳は生存確率が高い。次の航海には0歳と80歳の船員で挑むのが良いです」**

いえ、そんなことはしませんよね。

事故があったときに乳幼児やお年寄りを優先して逃がしたのが想像できます。

・・・・・・想像できましたか？

でも残念ながらそれはデータに表れていません。 勝手な「常識」でそう判断しただけです。 その時の個々人の勇敢な行動はデータには残っていないです。

あなたがデータ分析をしようとしているそのドメインの常識は理解されているでしょうか。
0歳と80歳での航海を考えていませんか。


### 事例３．あまりに世間にうといマッドサイエンティストによる時系列分析

ジオロケーションデータを分析して競合の有名テーマパークの来場者数を分析しています。
月別に集計していて2020年4月ごろから急に下がってきています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/ae4962ee-92c2-bbc3-5d40-75f229843e89.png)

**「やりました。競合のテーマパークの入場者数が激減しています。きっとみんな飽きてきたのでしょう」**

いえ、外出自粛の影響ですよね。

知ってましたか？ 外出自粛あったの。さすがに知ってたと思います。でも知らなかったかもしれません。知っているのと知らないのとではまったくデータの見方が変わってきます。

> ちなみにゼロになっていないところも注目です。GPSデータなどでみていると一定数例えば従業員や工事関係者などで数値が出るケースもあり結構惑わされます。

あなたが対象にしようとしているドメインの著名人がSNSで何かをつぶやいたからあなたのデータには変動が出ているかもしれません。でもきっとあなたの分析データにはその著名人のSNSは含まれていないです。

データだけ見て世捨て人になることは出来ません。 タピオカが流行ったことも自粛が起きたことも知らないといけません。

## まとめ

「測定されていて実際に使えるデータ」というのは実は現実世界の極めて少ない一部分でしかないです。

高度なセンサーを使っても観測されないデータは山ほどあります。 データ活用をしようとしたときに、その「存在していないデータ」をどれだけ想像して補完し、さらにかき集めてくるかはとても大事です。

そのためには当事者として真摯にデータに向き合いましょう。 データ分析だけすればいいや、ではなく、その先にある世界を見据えて出来ること頑張りましょう。 宇宙人的に外からデータを傍観しているだけではいけません。
CDN関連


## CDN

###原則
一度生成したコンテンツはしばらくの間、再度生成する必要はないという原則

##キャッシュ
エンドユーザーによってリクエストされたコンテンツは、キャッシュ挙動で定めた秒数の間、
キャッシュとして保持され、エンドユーザーへのレスポンスに使われる。

###キャッシュが削除されるタイミング
ユーザーがコンテンツをリクエストした際に、
・キャッシュサーバー上にキャッシュが存在しない場合
・有効期限が切れていた場合
・過去に一度もそのコンテンツがリクエストされていない場合
・キャッシュスペースがいっぱいになって古いキャッシュコンテンツが削除された場合

##パージ
キャッシュサーバー上にあるキャッシュを削除すること


##参考
https://support.cdnext.stream.co.jp/hc/ja/articles/360026590731-パージとはなんですか-

https://docs.fastly.com/ja/guides/how-caching-and-cdns-work
TECH CAMP　1日目

体育会系からの未経験エンジニアを目指し、テックキャンプへ通うことにしました。

今までパソコンすらほとんど触ることもなかった自分が大丈夫なのか。と何度も考えましたが、最後は勢いで決めました。

何事も挑戦しないと始まらないと思いまして。（返金保証あるから、最悪なんとかなると思ってましたw）


そんなこんなで昨日からついにスタートしました。

ここでは、スクールでの流れや学んだことなどを発信していければと思います。

スクールに通うことを迷われている方などの参考になれば幸いです。


【1日目】
キックオフ…パソコンの設定や学び方を、専用サイトにて学んでいきます。（オンライン）
↓
チームMTG…同期にてチーム作成が自動で行われ、メンターとチームでの顔合わせを行い
　　　　　今後の学び方や質疑応答
↓
ひたすらカリキュラム…ただやるだけ。ひたすら。



こんな感じでした。

元々は教室での参加予定でしたが、コロナの影響により全てオンラインとなりました。

教室は使えるらしいですが、使える曜日が決められます。

ですが、教室を利用したとしてもメンターへの質問はオンラインのみなので、教室利用のメリットは何も有りません。

綺麗な教室と、少しいい椅子があるだけらしいです。w


僕は、短期集中転職を選択したので

平日の,10時〜22時まで学びます。

カリキュラムも本当にガッツリ入っています。


とりあえず

これから、10週間頑張りますw
go修行17日目 Webサーバ


## 参考サイト
https://echo.labstack.com/guide
https://rightcode.co.jp/blog/information-technology/golang-introduction-rest-api

### パッケージインストール

```
go get -u github.com/labstack/echo/...
```

### コード
- localhost:1323で起動する

```golang
package main

import (
	"net/http"

	"github.com/labstack/echo"
)

func main() {
	e := echo.New()
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")
	})
	e.Logger.Fatal(e.Start(":1323"))
}
```

```
PS C:\Users\yuta\go\src\server> go run .\server.go

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.1.16
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:1323
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/772c13a4-4526-9a3f-36c6-7b2843ff2830.png)


### ユーザー名を返す

```golang

package main

import (
	"net/http"

	"github.com/labstack/echo"
)

func main() {
	e := echo.New()
	e.GET("/users/:name", getUserName)
	e.Logger.Fatal(e.Start(":1323"))

}

func getUserName(c echo.Context) error {
	name := c.Param("name")
	return c.String(http.StatusOK, name)
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/93f5776a-1cbf-1db2-18e8-66b7b03030d7.png)
PHPでコメントアウトする方法！プログラミング初心者にもわかりやすく解説　byウェブカツ

PHPでコードを書いている時に、

**HTMLではできたのに、PHPではどうやってコメントアウトするかわからない・・・**
**コメントアウトしたはずなのに上手く表示されない！！**

と悩んだことのある初心者も多いはず。

コメントアウトはプログラミング言語によってその方法が異なる。

そこで今回は、

- そもそもコメントアウトとは何か
- PHPでコメントアウトする方法
- コメントアウトが上手くいかない時の対処法

を簡単にまとめた。

コメントアウトとは何か
-----------
簡単に言うと、特定の記号などを使って「ここのコードは処理しないで！」って記述すること。

**一時的に不要になったコードをコメントアウト**して、**必要となった時に再び復活させる**という使い方もできる。

また、ぱっと見ただけでは機能がわかりづらいコードを書いた時、**後から見てもわかりやすいように日本語でコメントを残す**ために使用することも。

本来、コードの中に日本語を書いてしまうとエラーになる。

が、コメントアウトをした箇所はコードとして認識されなくなるので、日本語でわかりやすくコメントをすることもできる。

コメントアウトする時に使う特定の記号は、プログラミング言語によって違う。

さらに言うと、この機能はPHPに限らずほぼ全てのプログラミング言語に存在する。

PHPでコメントアウトする方法3つ
-----------------
コメントアウトが何かわかったところで、PHPでコメントアウトする方法を3つ紹介する。

### 行頭に「//」をつける
行頭に**「//」**をつけた箇所は、コメントアウトされてコードとして認識されなくなる。

例えば以下のようにコードを書くと、

```php:php
<?php
echo 'Hello'; //ここをコメントアウト
// echo 'World';
?>
```

ブラウザに表示されるのは**「Hello」**のみ。

**「ここをコメントアウト」**や**「echo 'World';」**の箇所は、コードとして認識されないので、**ブラウザにも表示されない。**

### 行頭に「#」をつける
同様に「//」をつけた箇所も、コメントアウトされてコードとして認識されない。

```php:php
<?php
echo 'Hello'; #ここをコメントアウト
# echo 'World';
?>
```

この場合も、ブラウザに表示されるのは**「Hello」**のみ。

**「ここをコメントアウト」**や**「echo 'World';」**の箇所は、コードとして認識されずブラウザにも表示されない。

### コメント範囲を「/* */」で囲む
複数行まとめてコメントアウトしたい場合は**「/* */」**を使う。

```php:php
<?php
/*
echo 'Hello';
echo 'World';
*/
echo 'ここは表示されます';
?>
```

この場合、ブラウザに表示されるのは**「ここは表示されます」**のみ。

 **「echo 'Hello'; echo 'World';」**はまとめてコメントアウトされているため、**ブラウザに表示されない。**

HTMLが含まれる場合のコメント
----------------
PHPはHTMLの中に記述できるため、HTMLとまとめてコメントアウトしたい場面もあるはず。そんな時はこの方法で。

### PHPのコメント「/* */」を使用する

```php:php
<pre class="lang:default decode:true">
<html>
<head>
<title>PHPのコメントアウト</title>
</head>
<body>
<?php
/*
<p>コメントアウトされます</p>
<?php echo 'ここもコメントアウトです'; ?>
*/
?>
</body>
</html>
```

このように、HTMLの中に埋め込まれたPHPもまとめてコメントアウトできる。

PHPでコメントアウト時によくあるミス
-------------------
「コメントアウトしたつもりが出来てなかった！」ってことは初心者にはありがち。

そこで、PHPでコメントアウトする時にミスしがちなポイントを紹介する。

### HTMLのコメントを使っている
HTMLでは「<!--　-->」を使うが、PHPのタグ内では使えない。

```php:php
<?php
<!--
echo ここはコメントアウトできない;
-->
?>
```

### PHPタグの外でコメントアウトしている
逆にPHPタグの外で「/* */」を使っている場合も同様。「/* */」はPHPタグの中でしかコメントアウトできない。

```php:php
<div>
/*<p><?php
echo 'コメントアウトされません';
?></p>*/
</div>
```

### コメントが入れ子になっている
コメントをさらにコメントで囲っている入れ子構造になっている場合、コメントアウトできない。

```php:php
/*
echo 'コメントアウトされます';
echo 'コメントアウトされます';*/
echo 'コメントアウトされません';*/
```

エディタのショートカットでコメントアウトする
----------------------
コメントアウトしたい場所がたくさんある場合、いちいちコメントアウトの記号を入力するのは面倒。

コードを書くエディタに付属するショートカット機能を使えば、選択した箇所をまとめてコメントアウトすることも可能に。

**Atomの場合**

* Windows: Ctrl + /
* Mac: Command + /

**VSCodeの場合**

* Windows: Ctrl + /
* Mac: Command + /


ショートカットキーを一度入力するとコメントアウト、もう一度押すとコメントアウトを解除できるんで便利。

使うエディタによってショートカットキーは異なるので、自分の使っているエディタが対応しているか調べるのがおすすめ。それだけでプログラミングの効率がグンと上がる。

まとめ
---
以上、PHPでコメントアウトする方法について

- コメントアウトが必要な場面
- PHPでコメントアウトする方法3つ
- コメントアウトする時によくあるミス3つ

を紹介した。

PHPでコメントアウトする方法がわからない人や、コメントアウトしたのに上手くいかないっていう人は参考にしてほしい。

---
#### かずきち
プログラミング学習サイト「ウェブカツ!!」の顧問。
不動産、保険の営業マンから、エンジニアへ転身。
「HTMLって何？」という状態から3ヶ月の独学のみでエンジニアへ転職し、１年で年収１千万を稼ぐエンジニアへ。
独学時代のプログラミング学習の分かりにくさや、「技術しか出来ずに稼げていないエンジニア」の現状を変えるため「ウェブカツ」を立ち上げ運営している。

【ウェブカツ公式WEBサイト】
[https://webukatu.com/](https://webukatu.com/?utm_source=blog&utm_medium=bl02&utm_campaign=blog_pr)
Ruby on Rails マイグレーションを取り消す

# 最新のマイグレーションを取り消す
最新のマイグレーションを取り消すコマンドは
```rails db:rollback```

# 特定のマイグレーションを取り消す
特定のマイグレーションを取り消す場合は
```rails db:migrate:status```
で取り消したいマイグレーションファイルのMigration IDを確認し
**rails db:migrate:down VERSION = 取り消したいマイグレーションファイルのMigration ID**
を実行する。
Clould FunctionsのonCallをローカルでデバッグしたい


# はじめに

Firebaseの`Functions`機能を用いることで、クライアントサイドから安全に「サーバーサイドのみで動かしたいファイル」を呼び出す事ができます。

例えば、僕は今「Node.jsでTwiitteライブラリを用いてツイートを取得したい」機能をFirebaseの静的ホスティングで実装することを目指しています。

しかし、クライアント側に投げるHTMLにTwitterのアプリのAPIキーなどの秘匿情報を渡すことは出来ません。（クライアントのjavascriptファイルなどにAPIキーを書けば渡すことはできますが、渡すべきでない。）
よって、クライアント側のブラウザでaxiosなどを使って、直接クライアント側にTwitterの情報を取得させることはできません。（セキュリティの問題、クライアントにAPIキーなどの情報を抜かれるかも）

そのため、本来ならサーバー側でExpressなどを用いて「サーバーがTwitterAPIを代わりに叩く」ことになります。こうすれば、クライアント側にTwitterのAPIキーを渡す必要はなくなります。
しかし、Firebaseのホスティングは静的なので、ExpressといったNode.jsは動かないわけです。


そこで、Functionsを使います。FunctionsはNode.jsで実行されて、クライアント側からAPIのように呼び出す・実行することができるため、APIキーや外部に出したくない秘匿のFirestoreの機能などを、サーバー側（この表現が正しいかは微妙ですが）留めることができます。

# onCall

firebaseのfunctionsには、複数のメソッドがあり

- functions.https.onRequest
- functions.https.onCall

があります。

onRequestのほうは、APIのように機能して、クライアント側からaxiosなどで呼び出すことができます。
onCallのほうは、「クライアント側のfirebaseのSDKから直接呼び出される」ことのみで発火します。そのため、セキュリティ的にさらによく、外部アプリ（自分のアプリ以外）からの呼び出しを避けることができ、クライアントの認証情報などを取り出すことができます。

サーバー側では

```javascript
const functions = require('firebase-functions');
exports.hello_world = functions.https.onCall(async (data, context) => {
  return "hello, world"
}
```

などとしてAPIを公開し

クライアント側では

```javascript
const hello_world = functions.httpsCallable('hello_world')
hello_world.then(res => {}};
```
のように、onCallを呼び出せばいいです。

# ローカルデバッグ

firebaseのfunctionsを毎回デプロイして、実際のHosting環境でデバッグするのは大変です。
functionsのデプロイは結構時間がかかってしまい、その間何もできないためです。

そこで、自分のプロジェクトディレクトリで（functionsディレクトリではにです）

```
firebase serve --only functions        
```

とすれば、functionsのみをローカルでデバッグできます。
自分の環境では`http://localhost:5000`で実行されます。


しかし、onCallの場合「クライアント側のfirebaseSDK」から呼び出されることが前提になっているため、必ずhttpsCallableメソッドでクライアント側から呼び出す必要があります。

ここで、このhttpsCallableメソッドを普通に呼んでしまうと、クライアント側のSDKは、「**Firebaseにホスティングされている環境のFunctions**」を取りにいくため、ローカルデバッグができません。
毎回Functionsをdeployする必要があります。

そのため、クライアント側でhttpsCallableメソッドをする前に

```javascript

 if (process.env.NODE_ENV === 'development') {
    // local開発
    functions.useFunctionsEmulator("http://localhost:5000");
  }
```

のコードを足すと良いです。
これによって開発環境のみ、localhost:5000(functionsのlocalデバッグ環境)に代わりにアクセスしてくれます。


# Firestore

これは、完全に関係ないですが自分用です＞＜

Firebase FunctionsでonCall内からFirestoreに触る場合は

```
https://console.firebase.google.com/u/0/project/{project_id}/settings/serviceaccounts/adminsdk
```

に普通にブラウザにURLを貼ってアクセスして「新しい秘密鍵の生成」からjsonを生成してFirebase Admin SDKの情報を取得します。
このjsonファイルの中身が、functionsからfirestoreを触るために必要な情報になります。

そして、functionsのindex.jsに

```javascript
const functions = require('firebase-functions');
const admin = require('firebase-admin')
const cors = require("cors")({origin: true})
const serviceAccount = require('./先程ダウンロードしたjsonファイル')

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "先程のURLに乗っている"
})

```

のようにして、adminを初期化すると良いです。

これでおそらくFunctionsからFirestoreを触ることができます。
[小ネタ]kubectl proxy を使って API サーバーに curl でアクセスしてみる

curl コマンドで Kubernetes の API サーバーへアクセスする際に `kubectl proxy`を使った時の話をメモします。

# 環境

```bash
kubectl version
Client Version: version.Info{Major:"1", Minor:"16+", GitVersion:"v1.16.6-beta.0", GitCommit:"e7f962ba86f4ce7033828210ca3556393c377bcc", GitTreeState:"clean", BuildDate:"2020-01-15T08:26:26Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"15+", GitVersion:"v1.15.11-eks-af3caf", GitCommit:"af3caf6136cd355f467083651cc1010a499f59b1", GitTreeState:"clean", BuildDate:"2020-03-27T21:51:36Z", GoVersion:"go1.12.17", Compiler:"gc", Platform:"linux/amd64"}
```

# 参考

[kubectl proxyオプションの紹介 ~--accept-hosts, --address, --port, --api-prefix, --www, --www-prefix~](https://techstep.hatenablog.com/entry/2019/01/27/220044)

[Operations](https://kubernetes.io/docs/reference/kubectl/overview/#operations)

>proxy	kubectl proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix] [flags]	Run a proxy to the Kubernetes API server.

# やってみる

`kubectl` を実行する場合、`kubectl get pods` などのコマンドを実行しますが、具体的にどのようなパスがあるか確認したいということがありました。

`kubectl` を使ってリクエストする場合、`~./kube/config` などを使って接続先への認証情報の設定を行って HTTP リクエストしている認識です。
`curl` などで実行する場合、認証情報をすればリクエスト出来る気もしますが面倒そうなので `kubectl proxy` を使ってプロキシさせて認証情報を設定するようにします。

ではやってみます。
まずは `kubectl proxy` を実行します。

```
$kubectl proxy
Starting to serve on 127.0.0.1:8001
```

上記で 8001 ポートが API サーバーにプロキシされるようになっています。

実際にアクセスしてみます。

```bash
$curl http://localhost:8001
{
  "paths": [
    "/api",
    "/api/v1",
    "/apis",
    "/apis/",
```

Deployments ではどんな verbs があるか見てみます。

```bash
$curl http://localhost:8001/apis/apps/v1/ |less

・・・

    {
      "name": "deployments",
      "singularName": "",
      "namespaced": true,
      "kind": "Deployment",
      "verbs": [
        "create",
        "delete",
        "deletecollection",
        "get",
        "list",
        "patch",
        "update",
        "watch"
      ],
      "shortNames": [
        "deploy"
      ],
      "categories": [
        "all"
      ],
      "storageVersionHash": "8aSe+NMegvE="
    },

```

以下のように実行することで deployments の情報の確認もできます。

```bash
{
  "kind": "DeploymentList",
  "apiVersion": "apps/v1",
  "metadata": {
    "selfLink": "/apis/apps/v1/deployments",
    "resourceVersion": "8544893"
  },
  "items": [
    {
      "metadata": {
        "name": "2048-deployment",
        "namespace": "2048-game",
        "selfLink": "/apis/apps/v1/namespaces/2048-game/deployments/2048-deployment",
        "uid": "bec46c02-b046-11ea-847f-06ff6f9a4084",
        "resourceVersion": "5306426",
        "generation": 6,
        "creationTimestamp": "2020-06-17T03:00:48Z",
        "labels": {
          "app": "2048"
        },
```

`kubectl` でも同じように情報を取得出来ます。

```bash
$kubectl get deployments -A |grep 2048
2048-game     2048-deployment          1/1     1            1           19d
```
ユーザー管理機能を実装する。 | Ruby on Rails

1. Gemfile に `$ gem 'devise'` を追記して、`$ bundle install` する。

## Devise の設定ファイルを作成し、 User モデルを作成する。

1. `$ rails g devise:install` を実行して、Devise の設定ファイルを作成する。
2. `$ rails g devise user` を実行して、Devise の機能を持つ User モデルを作成する。
    - この時に、ルーティングに `devise_for :users` という Devise の機能へリクエストするためのルーティングが生成される。
3. `$ rails db:migrate` を実行して、Devise の機能を持つ User モデルをマイグレートする。
4. ログイン画面等の Devise が持つビューファイルを変更したい場合は、`$ rails g devise:views` を実行してビューファイルを作成する。

## メールアドレスとパスワード以外の値を受け取れるようにする。

- Devise では、メールアドレスとパスワードしか値を受け取らないようにストロングパラメータが記述されているので、任意でフォームを追加した場合には、その値を受け取れるように記述する必要がある。

```_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:追加したフォームの名前])
  end
end
```

## ログインしている時としていない時で表示が変わるようにする。

- Devise をインストールすると、ユーザーがサインインしているかどうかを判断する `user_signed_in?` メソッドが使用できる。

```.html
<% if user_signed_in? %>
  <!-- ユーザーがサインインしている場合に実行する処理を記述する。 -->
<% else %>
  <!-- ユーザーがサインアウトしている場合に実行する処理を記述する。 -->
<% end %>
```

## 送信したフォームの情報にサインインしているユーザーの情報を追加したい場合…

```_controller.rb
class PostsController < ApplicationController
  private
  def post_params
    params.require(:post).permit(:title, :content).merge(user_id: current_user.id)
      # form_with を使用して送信される情報を取得するストロングパラメータに .merge メソッドを使用して、current_user （現在ログインしているユーザー） の ID を結合させる。
  end
end
```
AWStats を IPv6 逆引き に対応させる

AWStats を久しぶりに導入したら、IPv6のアクセスログ部分でエラーになった。

# エラー

```
Error: Plugin load for plugin 'ipv6' failed with return code: Error: Can't locate Net/IP.pm in @INC (you may need to install the Net::IP module) (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 /usr/local/awstats/wwwroot/cgi-bin/lib /usr/local/awstats/wwwroot/cgi-bin/plugins) at (eval 2) line 1.
```

モジュールが足りていないよ！
と表示されたので、入れてあげる。

```:shell
perl -MCPAN -e shell 
	cpan[1]>	install Net::IP
	cpan[2]>	install Net::DNS
	cpan[3]> 	quit
```
複数列をピボットする｜Power Query

ひと手間加えれば、ほぼGUIでできますよ、という話です。
発端はこちらの方の疑問から。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">借方・貸方を「貸借」というやつで「0:借方」「1:貸方」に分けていて、科目や金額を単一列にしてるデータが有る(図のA～E列)。<br>それをPowerQueryで、借方・貸方が別の列になったデータに変換したいが、上手くできるか。<br>行番号が同じ場合に、貸借の科目・金額を同じ行にまとめることが上手く出来ない。 <a href="https://t.co/8Yfhy4A1RY">pic.twitter.com/8Yfhy4A1RY</a></p>&mdash; しょうた⭐️Excel改造で業務効率化するが会社に理解されない経理マン (@shota_Excellent) <a href="https://twitter.com/shota_Excellent/status/1280101133583671296?ref_src=twsrc%5Etfw">July 6, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##お題のデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/a865717a-a987-c436-02dc-64b4ee7a4634.png)
※上記のように、伝番・行・貸借列に重複がない状態が前提です。

##完成形
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/b25c8079-e034-5adf-6b69-6a390a9141f9.png)

※ ↓ ちなみにExcelのピボットではダメ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/98d9df3f-9519-cea5-5ad6-e248109010d3.png)


##手順
###①対象列を1列にまとめ、元の列は削除する
ここがひと手間です。
１）カスタム列の追加メニューを開いて、`=[科目=[科目],金額=[金額]]`と入力。
※recordを書いています。詳しくは[reference](https://docs.microsoft.com/ja-jp/powerquery-m/m-spec-values#record)参照。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/c66aed08-dbc3-23fb-dc35-96e58158f5b8.png)

２）列の削除メニューで、元の列を削除する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/cfb834f2-0826-2719-a93e-311fc6f1c843.png)

###②ピボットして展開する
１）貸借をもとに「列のピボット」をかける。設定は下図の通り。
詳細設定オプションで「集計しない」を選ぶこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/06dbf6f4-dd2f-70b9-b0a2-4030e5415a28.png)
↓実行後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/690d92c8-b4d2-6465-5155-e6f1b89dca64.png)


２）record列を展開する。
手順①でまとめた列`data`が、ピボットにより借方・貸方列に割り振られているので、それぞれ展開します。（フィルタボタンの場所が「←→」のようなアイコンになっているので、それをクリック）

まずは借方。列名がかぶるので、プレフィックスありにしてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/fa3d69fc-7054-a637-8dab-4b2a0f3bbfd9.png)
貸方も同様に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/33537430-0a2e-cf9b-2545-d4164eab4631.png)
完成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/7f1d0bb3-2c9f-46d7-dea4-d6c25e51e452.png)
Drupalのプレビューでテーマを適応させる唯一の方法

## プレビューが崩れるんですけど。。。
drupalで四苦八苦している今日この頃。
プレビューするとスタイルが崩れるので何でかなーと思ってたんですが、プレビューの場合ではテンプレートの命名ルールがnodeになってしまうのが原因でした。

以下のthemeファイルにHookコードを書くことでpageテンプレートのサジェストを追加して、コンテンツのthemeを適応する事が出来ます。

``` hogehoge.theme
function hogehoge_theme_suggestions_page_alter(array &$suggestions, array $variables) {
    $node = \Drupal::routeMatch()->getParameter('node_preview');
    if (empty($node)){
        $node = \Drupal::routeMatch()->getParameter('node');
    }
    if (!empty($node) && !empty($node->getType())){
        $suggestions[] = 'page__'.$node->getType();
    }
}
```

参考にしたのは此方です。
[Theme suggestions for node preview page \| Drupal\.org](https://www.drupal.org/forum/support/theme-development/2018-08-22/theme-suggestions-for-node-preview-page)

## プレビューに期限を設定したい
それと以下のプレビューリンクモジュールを使うと、外部リンクが作成されてかつリンクに閲覧期限を設けることが出来ます。
上記のフックにも対応出来たのでオススメです。
[Preview Link \| Drupal\.org](https://www.drupal.org/project/preview_link)
vistaでquartus その1８

#概要

vistaでquartusやってみた。
polyphonyでserialしてみた。
zundokoやってみた。

#環境

windows vista 32bit
quartus ii v13.0
polyphony v0.3.6
ep2c5t144ボード

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/13ae04c9-6fac-cc15-8511-b6ea54a3abcb.png)



![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b73daefb-7f33-d787-a821-009150d67fe4.png)


#サンプルコード


```
from polyphony import testbench, module, is_worker_running
from polyphony.timing import clksleep
from polyphony.io import Port
from polyphony.typing import bit, uint8

@module
class zundoko:
	def __init__(self):
		self.data = Port(uint8, 'out', init = 0)
		self.start = Port(bit, 'out', init = 0)
		self.append_worker(self.worker)
	def _wait(self):
		for i in range(100000):
			pass
	def send(self, c:uint8):
		self.data(c);
		self.start(1)
		clksleep(1)
		self.start(0)
		self._wait()
	def worker(self):
		i:uint8 = 0
		n:uint8 = 0
		r:uint8 = 234
		while is_worker_running():
			if (i < 1):
				if (n < 4):
					r = r * 5 + 1
					if (r < 127):
						print("zun")
						self.send(122)
						self.send(117)
						self.send(110)
						self.send(32)
						n = n + 1
					else:
						print("doko");
						self.send(100)
						self.send(111)
						self.send(107)
						self.send(111)
						self.send(32)
						n = 0
				else:
					print("doko kiyosi!!")
					self.send(100)
					self.send(111)
					self.send(107)
					self.send(111)
					self.send(32)
					self.send(107)
					self.send(105)
					self.send(121)
					self.send(111)
					self.send(115)
					self.send(105)
					self.send(33)
					self.send(33)
					i = i + 1

m = zundoko()





```

#verilogコード


```
module test2(input clk, input rst, output tx);
	wire [7:0] data;
	wire start;
	tx2 tx2(.clk(clk), .rst(rst), .start(start), .data(data), .tx(tx), .busy(busy), .get(get));
	zundoko_m m(.clk(clk), .rst(rst), .data(data), .start(start));
endmodule
```

以上。
VSCodeのunresolved importエラーを解決する

#importエラーが出たとき

![python import error](
https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F283963%2F19963b3c-2414-e64c-9ee7-064d5f81c437.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=55304bec9c9d49294cb7a2ca540950bc)


#解決手順
`command + Shift + P`を開いて`Python: Select Interpreter`から
探しているパッケージを選択します


![python import error](
https://i.stack.imgur.com/XQEku.gif)
vistaでquartus その17

#概要

vistaでquartusやってみた。
polyphonyでserialしてみた。
helloworldやってみた。

#環境

windows vista 32bit
quartus ii v13.0
polyphony v0.3.6
ep2c5t144ボード

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/13e1a8c1-d634-6bbc-66a0-3de0090847f5.png)


#サンプルコード


```
from polyphony import testbench, module, is_worker_running
from polyphony.timing import clksleep
from polyphony.io import Port
from polyphony.typing import bit, uint8

@module
class hello:
	def __init__(self):
		self.data = Port(uint8, 'out', init = 0)
		self.start = Port(bit, 'out', init = 0)
		self.append_worker(self.worker)
	def _wait(self):
		for i in range(100000):
			pass
	def send(self, c:uint8):
		self.data(c);
		self.start(1)
		clksleep(1)
		self.start(0)
		self._wait()
	def worker(self):
		i:uint8 = 0
		while is_worker_running():
			if (i < 1):
				self.send(104)
				self.send(101)
				self.send(108)
				self.send(108)
				self.send(111)
				self.send(32)
				self.send(119)
				self.send(111)
				self.send(114)
				self.send(108)
				self.send(100)
				self.send(33)
				i = i + 1

m = hello()





```

#verilogコード


```
module test2(input clk, input rst, output tx);
	wire [7:0] data;
	wire start;
	tx2 tx2(.clk(clk), .rst(rst), .start(start), .data(data), .tx(tx), .busy(busy), .get(get));
	hello_m m(.clk(clk), .rst(rst), .data(data), .start(start));
endmodule

```

以上。
Laravel データベース接続の設定

Laravelで作成したデータベースに接続するための設定を解説します。

## database.php

`config/database.php`にデータベースの接続設定を記述します。

初期設定は`mysql`になっています。
ここを切り替えることで、`connections`キー内にあるその他のデータベースも使用することができます。

```php
'default' => env('DB_CONNECTION', 'mysql'),
```

使用するデータベースの内容を確認します。

```php:config/database.php
'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', ''),
            'username' => env('DB_USERNAME', ''),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],
```

`env()`は、Laravelのヘルパ関数です。
デフォルトでは、`.env`に記載した値を`database.php`が読み込むようになっています。

```php:config/database.php
 'database' => env('DB_DATABASE', 'quick_laravel'),
 'username' => env('DB_USERNAME', 'quickusr'),
 'password' => env('DB_PASSWORD', 'qucikpass'),
```

第二引数に値を直接記述することも可能です。

## .env

通常は、`.env`にDB環境設定を記述します。

```php:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=quick_laravel
DB_USERNAME=quickusr
DB_PASSWORD=quickpass
```
`.env`はGitリポジトリのソースコントール外にあるので、環境設定が公開されることはありません。

`SQLSTATE[HY000] [2002] Connection refused` 等のエラーが表示される場合、上記の設定のどこかが間違っていると考えられます。

`.env`を変更しても接続できない場合は、下記の記事を参照してください。
[Laravelで.envファイルが反映されない時](https://qiita.com/tetsu-upstr/items/fa8c7f3aa8ae3195e459)
Connection refused (0x0000274D/10061) でPostgreSQLに接続できない

Windows 10でPostgreSQLに接続できなかった際の記録です。

## 環境

- Windows 10
- PostgreSQL 11.8

## エラーメッセージ

`psql`コマンドを実行するも、以下のエラーメッセージが表示されデータベースに接続できませんでした。`psql -U ユーザー名 -d データベース名`でユーザーとデータベースを指定しても変わらず。

```shell:CLI
> psql
psql: サーバに接続できませんでした: Connection refused (0x0000274D/10061)
    サーバはホスト "localhost" (::1) で稼動しており、
    また、ポート 5432 で TCP/IP 接続を受け付けていますか?
サーバに接続できませんでした: Connection refused (0x0000274D/10061)
    サーバはホスト "localhost" (127.0.0.1) で稼動しており、
    また、ポート 5432 で TCP/IP 接続を受け付けていますか?
```

ちなみに英語だとこのようなエラーメッセージになるはず[^1]。

```shell:CLI
could not connect to server: Connection refused
    Is the server running on host "localhost" (::1) and accepting
    TCP/IP connections on port 5432?
could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?
```

## 原因

複数の原因が考えられると思いますが、`pg_ctl -D "データベース設定ファイルへのパス" status`で確認してみたところ、今回はそもそもサーバーが動作していませんでした。

```shell:CLI
> pg_ctl -D "C:\Program Files\PostgreSQL\11\data" status
pg_ctl: サーバが動作していません
```

## 解決策

`pg_ctl -D "データベース設定ファイルへのパス" start`でサーバーを起動します。設定ファイルへのパスの数字の部分には、PostgreSQLのバージョンが入ります。

```shell:CLI
> pg_ctl -D "C:\Program Files\PostgreSQL\11\data" start
サーバの起動完了を待っています....2020-07-07 09:35:07.339 JST [3884] LOG:  IPv6アドレス"::"、ポート5432で待ち受けていま
す
2020-07-07 09:35:07.339 JST [3884] LOG:  IPv4アドレス"0.0.0.0"、ポート5432で待ち受けています
2020-07-07 09:35:07.359 JST [3884] LOG:  ログ出力をログ収集プロセスにリダイレクトしています
2020-07-07 09:35:07.359 JST [3884] ヒント:  ここからのログ出力はディレクトリ"log"に現れます。
.完了
サーバ起動完了
```

サーバー起動後、`psql`コマンドでデータベースに接続することができました。

スタートメニューを右クリック→「コンピューターの管理」→「サービス」→「postgresql-x64-11 - PostgreSQL Server 11」を選択し、スタートアップの種類を「自動」にすると、毎回自動で起動するようになります。今回も「自動」になっていたのですが、起動に失敗していたようです。

## 参考

[PostgreSQLに接続できず困った](https://qiita.com/waro_a2606/items/0b0957066241887530d4)[^2]
[WindowsサービスとしてPostgreSQLを開始または停止する](https://www.dbonline.jp/postgresql/install/index4.html)

[^1]: 英語のエラーメッセージで検索した場合のために追加。
[^2]: こちらの記事と重複する部分が多いが、エラーメッセージで検索した場合に出てこない可能性があるため投稿。
ruby 投稿実装機能が出来ない

アウトプット
何日も頭を悩ませてるのですが中々できない
param is missing or the value is empty: toppage_params　が中々解決できません。

そもそもparamsが存在しない？というのもよくわからないのですが、色々試してみました。
まずは下記原型のコード

```top_page_controller.rb
class TopPageController < ApplicationController
  def index
    @toppages = TopPage.all
  end

  def new
    @toppage = TopPage.new
  end

  def create
    TopPage.create(toppage_params)
    redirect_to top_page_index_path
  end

  def show
  end

  private
  def toppage_params
    params.require(:toppage_params).permit(:contents)
  end
end

```

改善を加えたコードが下記です。

```top_page_controller.rb
class TopPageController < ApplicationController
  def index
    @toppages = TopPage.all
  end

  def new
    @toppage = TopPage.new
  end

  def create
    @toppage = TopPage.create(toppage_params)
    redirect_to top_page_index_path
  end

  def show
  end

  private
  def toppage_params
    params.permit(:contents)
  end
end

```

これでエラーはなくなったのですが案の定データが引き渡されていません。
正直、やる前から何となくそうだろうなーと思ってました。。。。
@toppageはnewメソッドで定義してるやつをそのまま使わなければいけないはずなのでcreateでこれだと再定義しているのか？

いずれにせよ　form_for form_tag form_withでストロングパラメーター周りの記述法が若干変わるらしく
そこらへんの構造がよくわからない状態。
おみくじ

#導入
今回大学の課題でpythonで何か動くものを作れという課題が出たのでこれを作った。プログラミング初心者なので、習った範囲のもので作った。たいそうなものではないが、頑張りだけは認めてほしい。
___
#参考資料
[いちばんやさしいPython入門教室](https://www.amazon.co.jp/いちばんやさしい-Python入門教室-大澤-文孝/dp/4800711592/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=python+%E5%85%A5%E9%96%80%E6%95%99%E5%AE%A4&qid=1594061609&sr=8-1)で勉強し、このテキストの６章を参考にしながら作った。
___
#内容
tkinterを使用し、ウィンドウを作り、ボタンを押せばpythonのrandomモジュールを使ってランダムに、吉や、大吉、ランダムにあらかじめ入力しておいたアイテムがウィンドウに出るようにした。
___

#ソースコード

```python:omikuzi.py
#coding:utf-8
import tkinter as tk 
import random
import tkinter.messagebox as tmsg 


def ButtonClick1():
    a=["凶","吉","中吉","大吉","末吉","大凶","小吉"]
    a = random.choice(a)
    tmsg.showinfo("運勢",a)
def ButtonClick2():
    b=["時計","ハサミ","メロンパン","猫","犬","ダチョウ","扇風機","だるま"]
    b = random.choice(b)
    tmsg.showinfo("ラッキーアイテム",b)
root = tk.Tk()
root.geometry("400x500")
root.title("おみくじ")
label1 =tk.Label(root, text="今日の運勢を占おう",font=("Helvetica",14))
label1.place(x= 20, y=20)



button1 = tk.Button(root, text = "           占う          ",font=("Helvetica",20),bg ='#E0FFFF',fg = "#FF7F50",command=ButtonClick1)
button1.place(x=60, y=140)

button2 = tk.Button(root, text ="ラッキーアイテム",font=("Helvetica",20),bg ="#FFFFE0",fg ="#FF4500",   command=ButtonClick2)
button2.place(x=60, y=200)

root.mainloop()
```
___
#実行様子




<img width="1128" alt="2020-07-07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638208/eb877cfc-12c4-5578-dee9-70adc6cc6338.png">


<img width="1128" alt="2020-07-07 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638208/0afd8ead-cbbf-aade-1783-7fc1db7352d5.png">



<img width="1128" alt="2020-07-07 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638208/05de924d-d0d7-6e7d-9f20-6020f839329c.png">
___

#感想
１から何かを作るのは大変だった。でもその分楽しかったし、作り終わった後の達成感が気持ちよかった。
名前しか知らなかったAzureを今更ながら使ってみる #1

#きっかけ
[高専キャリア](https://kosen-career.tech/)とマイクロソフトがコラボして「クラウドAI開発講座」という講座が開設されました．
この講座は‪受講しながら実際に自分でAzureを活用したTeams連携Botを実際に制作するのですが，何かあれば先輩エンジニア(講師)が徹底メンタリングしてくれると...
さらにこれが無料で受講できると知って，大阪人の癖なのか「無料」というワードに目がない僕は参加させてもらうことを即決しました．

#第一回の講義のタスク
早速，先日受講したのですが，次の講義(7月後半)までにいくつかの課題が与えられました．
と言ってもそれほど難しいものではなく，

- [de:code2020](https://www.microsoft.com/ja-jp/events/decode/2020/default.aspx) のセッションを視聴する
- Qiitaの記事([ちょまどさん](https://qiita.com/chomado/items/6bda10abde0551f25723)，[みおかわさん](https://qiita.com/miokawa/items/6f1a3e480580e1e29abc))を読む
- [Microsoft Learn for Students](https://docs.microsoft.com/ja-jp/learn/roles/student?WT.mc_id=BlendedCurriculum-MSLearn-nosuzuk)に登録する
- [Azure for Students](https://azure.microsoft.com/ja-jp/free/students/)に登録する

の4つだけでした．

#早速やってみた
とりあえず準備しないことには何も始まらない！
ってことで夕食を取りながら色々と登録することに．

## de:code2020
[de:code2020](https://www.microsoft.com/ja-jp/events/decode/2020/default.aspx)とは日本マイクロソフトが開催する開発者向けイベントだそうで，本来はオフラインでの実施だそうですが今回はこのご時世でオンラインで開催されているそうです(**2020/7/17 17:00まで**)．さらにそれに伴って例年は有料だそうですが今年はなんと“無料!"．
しかし，登録はしないと視聴できないそうですが，登録はMicrosoftアカウント，LinkedInアカウント，GitHubアカウントのいずれかで登録するだけでした．
登録する際，住所や電話番号も入力する必要がありましたが，ページ下部に連絡方法として郵送や電話のチェックボックスがあったので，外しておけば大丈夫だと思います．また，(たしか)次のページに協賛企業への情報提供の確認がありました．お好きなように選ぶと登録完了です．

本講義で指定された講演は，[ちょまどさんのセッションA02](https://www.microsoft.com/ja-jp/events/decode/2020session/detail.aspx?sid=A02)と，[みおかわさんのセッションZ01](https://www.microsoft.com/ja-jp/events/decode/2020session/detail.aspx?sid=Z01)でしたので，2つともご飯を食べながらなんとなーく見ました．
どちらも凄いわかりやすく説明されていたので，「いける気がする」とモチベーションをあげたところでとりあえず終了しました．
次回はちゃんと見ながら実際に動かしていきたいと思います．

## Azure for Students
登録方法については全然難しくなかったですし，[こちら](https://qiita.com/suzukin/items/e50703dd63edbc028dff)にきれいにまとめられていましたので割愛します．
唯一めんどくさいことといえば，マイクロソフトアカウントのパスワードを忘れた時でしょうか．学校のメールアドレスのアカウントで登録しなければいけないのですが，パスワードを忘れてしまった時にパスワードを変更しようとしても，「学校に問い合わせてください」みたいなものが出てきて変更できませんでした．(僕だけかな?)とにかく，気をつけましょう...

## Microsoft Learn for Students
[こちら](https://docs.microsoft.com/ja-jp/learn/roles/student?WT.mc_id=BlendedCurriculum-MSLearn-nosuzuk)のページの右上にあるサインインをクリックして登録します．いくつか興味のあることなどについて聞かれますが，選択するとすぐに登録完了でした．

#まとめ
とりあえず今回は全部登録するだけしました．
なによりほんとに嬉しいのが，ここまで１つもお金がかかっていない！
"むりょう"... いい響きです．ほんとに高専キャリアの方々やマイクロソフトさんには感謝しかないですね．

今週中には色々と視聴したり，手を動かして触ってみたいと思います．
Vue.jsとjQueryを混在させる

#HTML側
###CDNでvue.jsとjqueryを読み込みます
```html
<div id="app">
  <button id="okBtn">ok</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
<script src="https://player.vimeo.com/api/player.js"></script>
```

#javascript側
###mountedにjqueryで処理する内容を書きます。
```javascript
const vueApp = new Vue({
  el: "#app",
  data() {
    return {
      message:"hello world"
  };
  },
  mounted() {
    $('#okBtn').on('click',function(){
      alert(vueApp.message);
    })
  }
})
```


<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="donkey-maru" data-slug-hash="abdYzXO" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="abdYzXO">
  <span>See the Pen <a href="https://codepen.io/donkey-maru/pen/abdYzXO">
  abdYzXO</a> by koji miyazaki (<a href="https://codepen.io/donkey-maru">@donkey-maru</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
ポップアップの範囲外クリックでポップアップを閉じる方法

# プログラミングの勉強日記
2020年7月7日　Progate Lv.148
ポートフォリオ作成中

##ポップアップの作り方
　[こちらの記事](https://qiita.com/mzmz__02/items/77145b1f0aeb758fcb56)で紹介したようにjQueryでポップアップの作成をする。
　今回は下の写真のように画像をクリックするとポップアップが表示され、ポップアップ以外をクリックするとポップアップが閉じるようなものを作る。
<img width="934" alt="0707.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/a5ab3ee0-bfd4-cb9c-7a61-4eee6348c8f1.png">
<img width="943" alt="0707-1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/819558df-38ca-4550-c5cb-03f5191958bf.png">

```html:HTMLファイル
<div class="travel">
  <img src="../photo/travel.PNG" class="button buttonTravel">

  <div class="pop_up popTravel">
    <div class="contentPopup">
      <a href="https://mzmz02.github.io/travel/" target="_blank">
        <img src="../photo/travel.PNG">
      </a>
        
      <h2>Europe Travel</h2>
      <h3>使用言語：HTML/CSS/jQuery</h3>
      <h3><a class="github" href="https://github.com/mzmz02/travel" target="_blank"><span class="fab fa-github"></span>GitHubページ</a> </h3>
    </div>
  </div>
</div>
```

```css:CSSファイル
.pop_up{
    display:none;
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background-color: rgba(227, 246, 245, 0.6);
    z-index: 2;
}
```

```js:JSファイル
// 画像をクリックでポップアップを表示
$('.buttonTravel').click(function(){
  $('.popTravel').fadeIn();
});
```

##範囲外クリックでポップアップを閉じる
　クリックイベントすべてに対して、そのクリックが自分自身（ポップアップ自身）を含まないものであれば閉じるようにする。

```js:JSファイル
// クリックイベント全てに対しての処理
$(document).on('click touchend', function(event) {
  // 表示したポップアップ以外の部分をクリックしたとき
  if (!$(event.target).closest('.buttonTravel').length) {
    $('.popTravel').fadeOut();
  }
});
```
Vite は本当に早いのか ~ Vue CLI と比較 ~

最近話題の Vite を試すついでに、 Vue CLI と比べてどれくらい早いのか確かめてみました。

## Vite とは
Vue.js の生みの親、 Evan You 氏が作ったビルドツールです。
開発時は ES モジュールをそのままインポートするため、バンドル処理がなく高速に動作するのが特長です。
https://github.com/vitejs/vite

以下の記事が大変わかりやすくまとまっています。
[【Vite】 Vue3.0もReactも！ノーバンドルなビルドツール「Vite」を試してみる](https://qiita.com/ryo2132/items/c1530dd590e34e68c494)

## セットアップ
### Vite
公式サイトに記載されているコマンドを実行すると、ディレクトリにプロジェクトが生成されました。
自分でパッケージをインストールします。

```shell
$ npm init vite-app project-vite
$ cd project-vite
$ npm install
```

Vite のバージョンは `1.0.0-beta.11` でした（package.json の記載は `^1.0.0-beta.3`）

### Vue CLI
こちらは対話式でインストールを進めていきます。[^gui]
なるべく軽くなるよう、オプションは全部はずしました。
パッケージは自動でインストールされます。

[^gui]: GUI モードもあります。コマンドは `vue ui`

```shell
$ npm install -g @vue/cli # インストール済なら不要
$ vue create project-vue-cli
$ cd project-vue-cli
```

## 開発サーバー起動
開発サーバー起動のコマンドは Vite が `npm run dev`、Vue CLI は `npm run serve` です。
（どちらも `-- --open` をつけるとブラウザでページが開きます）


コマンドを開始してからブラウザに表示されるまでの時間を比較してみましょう。
画面は「**上: Vite、下: Vue CLI**」です。それぞれ左側が VSCode（エディタ&ターミナル）、右側がブラウザです。
![開発サーバー起動](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158453/d21a44b1-fd75-e0a1-36c7-c456d743a99b.gif)
ブラウザにページが表示されるまで Vite は 1.5 秒程度、Vue CLI が 3 秒程度なので、約半分の時間で起動しています。

## HMR
次に HMR（Hot Module Replacement）の時間を比較してみます。
先ほど起動したページで、ロゴ画像部分をコメントアウトしてからファイルを保存している動画です。[^error]
[^error]: Vite は Vue 3 なので template 直下に複数要素を置くことができますが、VSCode の拡張機能が未対応なのでエラー表示になっています（2.x では単一要素しか置けない）

前回同様「**上: Vite、下: Vue CLI**」です。今回は画面中央あたりにキーボード入力が表示されます。
![HMR](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158453/f4e4f584-9e47-957f-c18c-850c8caf22f2.gif)

Vite はファイル保存してすぐにロゴが消えますが、Vue CLI はバンドル処理が入るので少し遅れて反映されていますね。

### プロジェクトを巨大化してみる
さて、次はプロジェクトが大きくなった場合はどうなるのか確かめてみましょう。
全体のファイルサイズを大きくするために、重量級ライブラリの代名詞である `lodash` をまるごと追加してみました。

1. `typeof lodash` を返す算出プロパティを作って画面に配置。
2. 最初は `lodash` のインポート文をコメントアウトして、`lodash: undefined` と表示されている状態からスタート。
3. `lodash` が読み込まれるようにしてファイルを保存し、`lodash: function` に変わるまでの時間を比較します。

![HMR2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158453/6a567dcf-2152-0f79-3cff-53c097ab6bb1.gif)

一目瞭然ですね！
Vite は 0.5 秒ほどで反映されますが、Vue CLI は 3 秒近くかかっています。[^lodash]
[^lodash]: lodash を読み込んだ状態でロゴ画像の表示→非表示の反映時間は、前の動画と同じくらい（1 秒弱）です。

## ビルド
最後にビルド時間を比較します。
これまでどおり「**上: Vite、下: Vue CLI**」です。
![ビルド](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158453/d59d54a8-19ad-773b-a979-324105963639.gif)
途中、 Vue CLI が先に終わったように見えますが、最後まで見ると Vite の方が早く終わっていることが分かります。

## まとめ
Vue CLI でも遅いと感じることはなかったですが、一度 Vite に慣れてしまうと戻れなそうですね。
手軽に Vue 3 の環境を構築できるのも便利なので、次に何か作るときは Vite を使っていきたいです。

### おまけ
動画の加工に使ったソフトたち
- デスクトップのキャプチャ: macOS の `shift+cmd+5`
- キーボード入力表示: [KeyCast](https://github.com/cho45/KeyCast)
- Mov → GIF 変換: [ffmpeg](https://ffmpeg.org/)