OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】マイグレーションファイルで作ったテーブルヘッダーを確認する方法

<h2>ヘッダー確認方法</h2>
マイグレーションファイルでテーブルを作成した時に、seedでデータを作成する際にテーブルヘッダー名を確認する方法をご紹介します。

<h2>railsコンソールで確認</h2>
Railsコンソールを起動し、対象のインスタンスを作成することで、カラムが確認できます。

```terminal:ターミナル
#Railsコンソールを起動
rails c

#対象のインスタンスを作ることで、カラムが確認できます
User.new
   (50.1ms)  SELECT sqlite_version(*)
=> #<User id: nil, name: nil, email: nil, password: nil, address: nil,created_at: nil, updated_at: nil>
```

<h2>schemaファイルで確認</h2>
migrateファイルと同じディレクトリにあるschema.rbファイルでヘッダー名を確認できます。

```ruby:schema.rb
ActiveRecord::Schema.define(version: 2021_05_06_105214) do

  create_table "users", force: :cascade do |t|
    t.string "name", null: false
    t.string "email", null: false
    t.string "password", null: false
    t.text "address"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

end
```

<h2>参考</h2>
unknown attribute '○○○○' for ○○○. →カラムのリネーム
https://qiita.com/Ayaka_ramens/items/f0c68b08fcf6145c2b17
Debian 10.9 buster を再インストールしたら起動しなくなったときの解決策のメモ 

# サマリー

+ CSMモードを切るために、ディスクをGPTで初期化してDebian 10.9を入れた
+ インストールは成功したはずが、起動後に画面左上で "_" が点滅して、その先に行かなくなった
+ 原因はグラフィックボード(Geforce RTX 30XX系)のドライバーが入っていないことだった
+ リカバリーモードの中でwgetでドライバーをとってきてインストールして直した

# リカバリーモードでドライバーをとってくる方法

まず、F8でブート対象のディスク選択画面に入ったあと、Debianのインストール先のディスクを選択。GRUBのAdvanced Optionでリカバリーモードに入れる

まず、日本語表示ができないので、英語表示に切り替える:

```
# export LANG=C
```

そのままではwgetできないので、つぎにDHCPを有効化する:

```
# dhclient
```

スマホでnvidiaのページにアクセスして、RTX30XX系のlinux用のドライバーのURLを調べてwget:

```
# wget https://jp.download.nvidia.com/XFree86/Linux-x86_64/460.73.01/NVIDIA-Linux-x86_64-460.73.01.run
```

依存モジュールを入れる:

```
# apt install gcc make dpkg-dev
# apt install linux-headers-$(uname -r)
# apt install pkg-config libglvnd-dev
```

あとは全部YESで回答:

```
# bash NVIDIA-Linux-x86_64-460.73.01.run
```

## 参考にしたページ

+ https://www.reddit.com/r/debian/comments/bw3vcp/getting_an_internet_connection_from_recovery_mode/

# 追記

+ あとで、460.73.01はいまいちだったので、465.27の方に入れ替えた
+ このページでドライバーのURL調べるときにプルダウンが正常に動かないときは：https://www.nvidia.com/Download/index.aspx?lang=en-us
  + こっちのページも試すといいかも：https://www.nvidia.com/en-us/geforce/drivers/
docker-composeでアプリケーションコンテナとデータベースコンテナを立ち上げる

docker-compose.yml でビルドする場合、下記のような形で「depends_on」を記載しコンテナの立ち上げ順序を制御します。

:::note warn
基本的に下記で問題はないのですが、一部の環境で問題が発生することがあります。
調べるといろいろな記事が見つかると思いますが、「コンテナの起動順序」と「コンテナ内のサービスの起動順序」は一致しない ということです。
:::

```docker-compose.yml
version: '3.7'
services:
  app:
    build:
      context: .
      dockerfile: app.Dockerfile
    container_name: app
    privileged: true
    ports:
      - 80:80
      - 443:443
    depends_on:
      - db
  db:
    build:
      context: .
      # 公式のMySQLイメージを記載しています
      dockerfile: db.Dockerfile
    container_name: db
    ports:
      - 3306:3306
```
上記の記述で「データベース」のコンテナが立ち上げた後に「アプリケーション」のコンテナが起動します。

:::note warn
上記はコンテナの起動順序の話であり、データベースコンテナ内のMySQLサービスが起動してからアプリケーションコンテナが立ち上がることを保証しているわけではありません。
:::

ですので、アプリケーションコンテナ起動時にデータベース接続がある場合は正常にアプリケーションコンテナが立ち上がらない場合があります。

アプリケーションコンテナ起動時にデータベース接続が必要な場合はどうすれば良いのか？
アプリケーションコンテナのエントリーポイントでデータベースの接続確認をすれば解決します。

```app.Dockerfile
# 構築処理
...

# エントリーポイントでMYSQLのサービスの確認をします
# ホスト名は「データベース」のコンテナ名、その他　IDとパスワードは root で作成していることが前提になります
# 下記のループはmysqlに接続をし、接続できなかったら 1秒間停止 して接続できるようになるまで再実行します。
RUN { \
        echo '#!/bin/bash'; \
        echo "while true; do if [ -z \"\$(exit | mysql -h db -u root -proot 2>&1 > /dev/null)\" ]; then break; else sleep 1; fi done"; \
        # データベース接続が必要な処理やサービス立ち上げを記載
    } > /usr/local/bin/app.sh

ENTRYPOINT ["/usr/local/bin/app.sh"]
```

※コンテナ開発時には注意しましょう。
deviseでカラムのnot null制約を外す（複数）


初めまして。
プログラミング学習初心者で、ログイン機能実装した際に
新規ログインで
ActiveRecord::NotNullViolation in Customers::RegistrationsController#create
とエラーが表示されてしまい、その解決方法です。



## やること

今回は、deviseで最初にカラムを追加してdb:midrateしてしまった後に
実は null: false　ではなかったときの対処法です。

なんでもかんでも null: false　にしてしまっていましたが、
createするときに空の状態で保存されるのを防ぐためのものと認識せず記載していました。

## 制約を外す

migrate後に null:false　を複数訂正したいときはターミナルに

```
rails g migration ChangeColumnToNull
```

出来上がったマイグレーションファイルがdb/migrateにあるので、

```
#customersデーブルのカラム、trainersテーブルのカラムのnot null制約を外す

def up
  #Not Null制約を外す
  change_column_null :customers, :name, true
  change_column_null :customers, :age, true
  change_column_null :trainers, :name, true
  :
  :
end

def down
  change_column_null :customers, :name, false
  change_column_null :customers, :age, false
  change_column_null :trainers, :name, false
  :
  :
end

```

とし、ターミナルで

```
rails db:migrate
```

とすると　null: false がなくなります。


以上となります。
違った点がありましたらご指摘お願い致します。
[Angular] PDF.JSを利用してPDFを表示する単純なサンプルプログラム

**2021-6-27追記** ちょっとずつ更新してます。　https://github.com/sengokyu/ex.angular-pdfjs

# これはなに？

Angularコンポーネント内にPDFファイルの1ページ目を表示するサンプルです。[PDF.JS](https://mozilla.github.io/pdf.js/)を利用しています。

# 環境

* Angular 12.0.0 RC2
* pdfjs-dist 2.7.570

PDF.JSが `.?` を使っているので、読み込むためにAngular 12にしています。

# インストール

```console
npm i pdfjs-dist --save-dev
```

# `angular.json`を編集

`pdf.js`ファイルを別途読み込むために、`angular.json`を編集します。

```json
"scripts": [
   "node_modules/pdfjs-dist/build/pdf.js",
   "node_modules/pdfjs-dist/build/pdf.worker.js"
],
```

# プログラム

## 表示処理部分

PDFを表示する処理は、Angularとは関係ないです。PDF.JSのサンプルからもらってきました。

```ts
  async showPdfPage(
    canvas: HTMLCanvasElement,
    url: string,
    scale: number,
    pageNumber: number
  ): Promise<void> {
    const pdf = await getDocument(url).promise;
    const page = await pdf.getPage(pageNumber);
    const viewport = page.getViewport({ scale });
    const canvasContext = canvas.getContext('2d');

    canvas.height = viewport.height;
    canvas.width = viewport.width;

    await page.render({ canvasContext, viewport }).promise;
  }
```

## コンポーネントテンプレート

テンプレートは`canvas`要素を置くだけです。参照するためにIDをつけています。

```html
<canvas #pdfCanvas></canvas>
```

## コンポーネント

テンプレートに置いた`canvas`を`@ViewChild`で参照しています。

```ts
export class AppComponent implements AfterViewInit {
  @ViewChild('pdfCanvas')
  pdfCanvas: { nativeElement: HTMLCanvasElement };
}
```

ここでは、AfterViewInitのなかで、先に書いた表示処理を呼びました。

```ts
  async ngAfterViewInit(): Promise<void> {
    showPdfPage(this.pdfCanvas.nativeElement, PDF_FILE_NAME, 1, 1);
  }
```

# できあがり

こんなんできました。
このファイル https://raw.githubusercontent.com/sengokyu/ex.angular-pdfjs/main/src/assets/RoShinoStdAdobeFonts.pdf を表示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59475/f339461d-3a67-e014-ddc4-0508598c6159.png)

プログラム全体はGitHubに置いています。
https://github.com/sengokyu/ex.angular-pdfjs

# Known Issue

ブラウザコンソールにこんなWarningが出ています。どうしたものか？

Warning: Error during font loading: The CMap "baseUrl" parameter must be specified, ensure that the "cMapUrl" and "cMapPacked" API parameters are provided. pdf.js:1211



# リンク

* [TypeScriptでpdfjsを使ってPDFの先頭ページを表示しようと試行錯誤した話](https://qiita.com/103ma2/items/34a908c78b0190160852)
掌田 津耶乃著『Android Jetpack プログラミング』の歩き方（Section4-2) Kotlin-Android-Extensionsの設定

＃1. はじめに
　掌田 津耶乃著[『Android Jetpack プログラミング』](https://www.shuwasystem.co.jp/book/9784798063218.html)(以下、本書と言う）で勉強しています。この本は、著者が記述しているように入門書ではないようです。それゆえ、本書をしっかりと読み込んでいないと、記載されているソースコード通りに写経しても、エラーで弾かれることがあります。本レポートでは、「『Android Jetpack プログラミング』の歩き方」と題して、掌田 津耶乃著『Android Jetpack プログラミング』の歩き方（Section3-1)に引き続き、ソースコードどうりに写経してアプリが正常に動くようにするための注意点をレポートします。記述や考え方などに誤りがあれば、ぜひご教示いただきたいと思います。

#2. 動作環境
　2021年5月6日ごろ、当方のAndroidStuidoが4.2にアップグレードしました。以下の動作条件で本記事の内容を確認しました。

```
Android Studio 4.2
Build #AI-202.7660.26.42.7322048, built on April 29, 2021
Runtime version: 11.0.8+10-b944.6842174 amd64
VM: OpenJDK 64-Bit Server VM by N/A
Windows 10 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 1280M
Cores: 8
Registry: documentation.show.toolbar=true, external.system.auto.import.disabled=true
Non-Bundled Plugins: org.jetbrains.kotlin
```

　なお、AndroidStuidoが4.2にアップグレードに伴って、Kotlinコンパイラも1.5にアップデートしたようで少し不具合が出ているようです。
　そのため、build.gradleのprojectの方(buildscriptのext.kotlin_version)を以下のとおり変更してました(ググった結果、このように変更すればいいとあったのでこのように変更しました）。本不具合が早く解消されることを願います。

```build.gradle#project
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ext.kotlin_version = "1.5.0"    // <-- 変更
    repositories {
        google()
        mavenCentral()
    }
    // 以下省略
```

#3. Section4-2以降を写経する上での注意点
　先にレポートした[Section3-1](https://qiita.com/guijiu/items/bcfa8fb666a4f159c15c)同様、Section4-2以降でも、Kotlin-Android-Extensionsを使用しているため、build.gradleのModule:appに対して、以下のとおりプラグインの追加の設定が必要です。Kotlin-Android-Extensionsについては本書p61を参照して下さい。

```build.gradle#app
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'    // 追記
}

// ・・・
```

以上
MarpをGithub Actionsで自動ビルドしたとき、日本語フォントが使えない問題を解決する

## 条件
- github actions
- Ubuntu latest
- npxかnpmでmarp-cliを利用している
    - dockerのは利用していない前提

## 結論
日本語フォントがLinuxにインストールされていないから、そりゃ日本語が表示されない。そのため、runnerのOSにaptでインストールしよう

## 仕組み
Marpは裏側で、Markdown -> html -> pdf, pptx という処理を行っているようです。このhtmlからpdfへ変換するときにchromeを利用しているようです。github actionsのOSはもとからchromeが入っているようで、使っているという認識がなかったのが落とし穴でした。

```bash
sudo apt install fonts-noto
```

としてあげた上でmarp-cliを利用してあげれば済みます。、[こんな感じ](https://github.com/flat35hd99/seminar-resources/actions/runs/822916782/workflow)のworkflowファイルで実際に動作することを確認しました。

ちなみにcssで持ってこれば済みそうだよなと思っていますが、未確認です。僕はこれで動いたので満足です。

## まとめ

日本語フォントをインストールしてmarp-cliにおいて日本語を利用できるようにしました。内部でプリインストールされたchromeを使っていることに気づけなかったのが落とし穴ポイントでした。
RESTサービスを作る・入門編

フロントエンドエンジニアは、WebAPIの「使う側」であります。
ですが、API、DataBaseも自分で手を動かして構築し、RESTサービスを包括的に経験する事で視野を広げようと思います。

本編は入門編なので、まずは概要をまとめました。
実際の開発は`Node.js, Express, React, SQLite3`を使い、続編で紹介します。

##RESTとは：
REST（REpresentational State Transfer）は、HTTPプロトコル作成者の一人であるRoy Fieldingによって2000年頃に提案されたWebのアーキテクチャスタイル（設計思想）。
ネットワークシステムの代表的なアーキテクチャスタイルであるクライアント/サーバから派生したもの、複数のソフトウェアを連携させるのに適しています。

RESTful APIは、次の4つのRESTの原則に従って設計されたAPIとなります。

**1. アドレス可能性**
そのアプリケーションが提供する情報やデータを全て「リソース」という考え方で表現する。
そのリソースはURIによって一意に指し示す事ができると言う事。

```
GET: https://api.hoge.com/v5/tickets/12345
```
ticketID=12345のデータをGETメソッドで取得できると言う事がこのURIで読み取れる。

**2. ステートレス性**
ステートレス性はセッション等のクライアントの「アプリケーション状態」をサーバー側が持たないと言う事。<br>

フロントからHTTPリクエストを送る時にログインの時にサーバーからもらった`token`などをheaderに**毎回付けて送る**事でAPIとの認証を行っている。また、リクエスト毎に**必要な情報を毎回全てリクエストに載せている**のはすべてのHTTPリクエストを完全に分離させる、つまり、リクエストを受けてレスポンスを返したら完結させる為です（それによりサーバー負荷が減らせる）

[有名なハンバーガーの注文](https://qiita.com/mtakehara21/items/efcbbc3ba58a62c10eb6)がわかりやすいです。要は、リクエストの度に「はじめまして、僕はXXXと申します。このリクエストをお願いできますか？」と毎回最初に自己紹介が必要になる感じですね。

**3. 接続性**
ある情報に「別の情報へのリンク」を含めることができること。そして、リンクを含めることで「別の情報に接続すること」ができること。

これはレスポンスの中にURLなどを含む事を指します。

**4. 統一インターフェース**
情報の取得、作成、更新、削除といったリソースの操作は、すべてHTTPメソッドを利用すること。この場合のHTTPメソッドとは、取得「GET」、作成「POST」、更新「PUT」、削除「DELETE」を使用することで統一と認識のしやすさを図ることが出来ます。


RESTの大きな特長は**HTTPの技術**を効果的に活用したものであり、Web技術との親和性が高いからWebサービスやWebアプリケーションの開発に活用されている。



##クライアントとサーバーの分離
前述の通り、RESTサービスはクライアント・サーバーから派生しました。両者を分離させて開発し、お互いのことを関与しないでよくなります。双方で疎通の決まりごと（リクエスト・レスポンスのインターフェース）を守っていれば、クライアントとサーバー個々で開発・改修が可能になります。

このクライアントサーバーモデルの利点はPC、スマホアプリと複数のプラットフォームから同じAPIを使う事が可能になる。



##REST APIの設計：
**①エンドポイント定義**
エンドポイントは`HTTPメソッド`と`URL`の組み合わせです。

**HTTPメソッド**はこの４つが基本です

```
GET　取得
POST　追加
PUT　更新
DELETE　削除
基本的に、この4つの処理でほとんどのシステム処理を完結させることができます。
```

**URL**を`リソース`と見なします。

HTTPメソッドとURLの組み合わせを、
**何**＝リソース(URL) **をどうする** ＝HTTPメソッド
と言う形式で定義します。

例を出しましょう。

GET: http\://hogehoge.com/api/**tickets**
何を＝チケット情報　どうする＝GET / 取得

POST: http\://hogehoge.com/api/**tickets**
何を＝チケット情報　どうする＝POST / 登録

**URL設計で意識すべき点**
・URLにapiを含めてAPIとわかる様にする
`http\://hogehoge.com/api`
`http\://api.hogehoge.com`

・URLにAPIのバージョンを含める
`http\://api.hogehoge.com/v1.0/users/`

・URLに動詞は使わず、名詞の複数形だけで構成する
user一覧
`http\://api.hogehoge.com/v1.0/users`
user ID：1の情報を取得
`http\://api.hogehoge.com/v1.0/users/1`
users ID:1のphoto一覧取得
`http\://api.hogehoge.com/v1.0/users/1/photos`

・アプリケーションや言語に依存する拡張子は含めない
URL内に.phpや.plなど言語に関係した拡張子を付けないようにする。悪意あるユーザーから脆弱性を突かれる要因にもなります。

・リソースの構造が分かるようにする
URLを見ただけで、リソースがどこに属しているか、どんなでーたをもってるかのデータ構造が分かるようにする。
このURLを見ると、userは写真のデータを持っている事がわかります。
`http\://api.hogehoge.com/v1.0/users/1/photos`




**②リクエストおよびレスポンスのJSONの定義**
これらは開発において、まずUIと仕様が決まり、それを基にどういうデータが必要か、ユーザーがどう使うのかも踏まえて、定義する必要があると思います（この作業は想像力が必要）

例えば、ログインページのAPIに何が必要なのか？を考えると。
`POST`メソッドで、URLは`/login`とし、emailとpasswordをサーバー側の認証に使うので、フロントはこれらをリクエストボディに含める必要があります。

リクエストにAPI側で必要なデータを渡し、レスポンスにはフロント側で欲しいデータを返してもらう。（場合によってはフェッチし直して、取り直すケースもある）




##まとめ
次は実際に`Node.js, Express, React, SQLite3`を使って簡単なRESTサービスを構築した時の学びを紹介したいと思います。
【解決済】Your Command Line Tools (CLT) does not support macOS 11【Big Sur】

# 解決法

エラー文通りに、

```
sudo rm -rf /Library/Developer/CommandLineTools
sudo xcode-select --install
```

をやったら治りました。

OSは macOS Big Sur (11.3.1) です。

# この問題に直面した背景

MongoDB をインストールしようとしたら、

```
Error: Your Command Line Tools (CLT) does not support macOS 11.
```

と言われてしまいインストールできなかった。
で、色々調べてたらMongoDBの問題ではなくhomebrewの問題だとわかり、解決に至った。
なんだかんだでエラー文は偉大ですね。
CentOS 7のsshdのポートを変えるとエラーが出る(備忘録)

#問題の概要
CentOS 7をインストールした直後、sshdのポートを変更しようとして、
`sudo nano /etc/ssh/sshd_config`を開き`Port 22`を任意のポート番号へ書き換え、
`sudo systemctl restart sshd`すると、次のようにエラーが出る

```
Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details.
```

何回も見たことあるエラーだ...

#原因
**SELinuxは正しく設定、または disabled にしましたか？**

**設定した後は再起動しましたか？**(多くの原因はここ)
**設定した後は再起動しましたか？**
**設定した後は再起動しましたか？**

###設定した後は再起動しましたか？(多くの原因はここ)

#対処法

- SELinuxを正しく設定しなおすか無効化する

`nano /etc/selinux/config`
↓
`SELINUX=disabled`
編集後はCtrl+X → y で保存

- 必ず再起動する
- 必ず再起動する
- 必ず再起動する
Firebase Realtime Databaseのデータを降順にソートしてみる【Javascript】

# 何がしたいか

Firebase Realtime Database（以下Firebase）の公式ライブラリでは、引っ張ってきたデータを並び替えることができる関数が用意されているが、なぜか降順にソートできるものはない。しかし、データを降順に引っ張ってきて展開したいという場面もあるので、今回はそれを実現する。

# 実装

今回は下のような形式で複数のデータがFirebaseに`push`されていることを考える。

```terminal:Firebase
data: {
  -M_A1FKQ2m31jaxrkLgd: {
    ...
  },
  -M_A1KuD92gfHlWx9rk-: {
    ...
  },
  -M_A1fq_4HwEICsf4LVe: {
    ...
  }
}
```

Firebaseに`push`されたデータのキーは、`push`された時刻によって生成され、登録された順番に昇順にならぶ仕様になっているので、このままデータを取得すると昇順で取得されてしまう。しかし、前述の通り公式ライブラリには降順に取得してくる関数がないので、データを取得した後にデータを加工する。

取得してきたデータはオブジェクトとして取得されるので、ソートを行う場合には配列に変える必要がある。

```javascript:firebase.js
/*Firebaseの初期化処理は省略*/
firebase.database().ref('data').once('value', (result) => {
  if (result.val()) {
    const l = []
    Object.keys(result.val()).forEach((key) => {
      const tmpObj = {}
      tmpObj[key] = result.val()[key]
      l.push(tmpObj)
    })
    console.log(l)
  }
})
```

```terminal:console
[
  {-M_A1FKQ2m31jaxrkLgd: { ... }},
  {-M_A1KuD92gfHlWx9rk-: { ... }},
  {-M_A1fq_4HwEICsf4LVe: { ... }}
]
```

上記のようにオブジェクトを一つ一つの要素に分割して、配列に入れることによりソートを行うことが可能となる。

あとは、この配列を降順(逆順)にすればよい。

```javascript:firebase.js
/*続き*/
const reversedList = l.slice().reverse()
```

# 最後に

このように取得してきたオブジェクトとして取得してきたデータを要素ごとに配列に入れることで、これ以外の方法でのソートも行いやすくなるので非常にオススメ。ただ、降順以外のソートは公式のライブラリの方でサポートされているものもあるので、そちらを使った方が良いかもしれない。詳しくは公式のドキュメント参照。

[Firebase Realtime Database公式ドキュメント](https://firebase.google.com/docs/database/web/lists-of-data?hl=ja)
JDLA_E資格の機械学習「scikit-learnで線形回帰」


##1. はじめに

scikit-learnを使って線形回帰実装の勉強。
前回、線形回帰モデルの最小二乗法によるパラメータ導出の数学的な勉強をしたが、実際の実装では、scikit-learnという便利なライブラリを使うとすぐに出来てしまうようである。

##2. ボストン住宅価格問題

####2.1　データセット読み込み 
ボストンデータセットというボストンの住宅価格に関するいろんなデータが詰まったデータがある。
これを使って、部屋数から住宅価格を予想するというのを、scikit-learnでやってみる。


~~~py
from sklearn.datasets import load_boston    # scikit-learnにボストンデータセットが入っている。
from pandas import DataFrame                #データ処理用のライブラリpandas
import numpy as np                          # 数値計算用のライブラリ

# ボストンデータを"boston"というインスタンスにインポート
boston = load_boston()
~~~

boston変数をprint()すると中身を全部見ることが出来るが、ちょっと見ずらい。

~~~py
print(boston)
~~~

>{'data': array([[6.3200e-03, 1.8000e+01, 2.3100e+00, ..., 1.5300e+01, 3.9690e+02, 4.9800e+00],
>       [2.7310e-02, 0.0000e+00, 7.0700e+00, ..., 1.7800e+01, 3.9690e+02,9.1400e+00],
>      [2.7290e-02, 0.0000e+00, 7.0700e+00, ..., 1.7800e+01, 3.9283e+02,4.0300e+00],
>       ...,
>       [6.0760e-02, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9690e+02,5.6400e+00],
>       [1.0959e-01, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9345e+02,6.4800e+00],
>       [4.7410e-02, 0.0000e+00, 1.1930e+01, ..., 2.1000e+01, 3.9690e+02, 7.8800e+00]]), 
>'target': array([24. ,
>


####2.2 データ構造確認

この状態だと、どう見たらよいのかわからないので、keys()でデータセットのキーを見る。


~~~py
#キーを確認
print(boston.keys())

>dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename'])
~~~

dataが入力（説明変数）、targetが出力（目的変数）で住宅価格。

~~~py
#feature_names変数の中身を確認
print(boston['feature_names'])

>['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']
~~~

####2.3 学習データ準備


次にPandasライブラリのDataframeを使って、学習に使う2次元配列データdfを作成する。
ボストンデータから、列名も指定した2次元データを作成。入力（説明変数）はboston.dataに入っているが、価格はtargetに入っているから後からnumpy.arrayで価格の列を追加してやる。

~~~py
df = DataFrame(data=boston.data, columns = boston.feature_names)
df['PRICE'] = np.array(boston.target)
~~~

データがどんな分布になっているか図に出してみる。

~~~py
from matplotlib import pyplot as plot

plot.scatter(df['RM'], df['PRICE'])
plot.xlabel('room')
plot.ylabel('price')
plot.grid()
~~~

価格の単位が分からないが、かりに＄だとすると、6部屋で、＄20　あたりが多いようである。最高は＄50で上限を切っていそうなプロット図である。

![boston_price.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/f048c217-b1c0-1933-abfa-a950ddee38f0.png)

読み込んだデータに問題がないか、外れ値がないかとかは一応確認することが前処理としては重要だが、sklearnではそのへんの処理はすでに終わっているようである。


つぎに、説明変数、目的変数をpandasのlocで抽出する。

~~~py
data = df.loc[:, ['RM']].values 　　#　 説明変数として部屋数のデータ
target = df.loc[:, 'PRICE'].values　#   目的変数として価格のデータ
~~~


####2.4 学習

次に、sklearnを使って線形回帰モデルを準備し、準備したデータで回帰係数$w$のパラメータ計算。

~~~py
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(data, target)
~~~


####2.5 推測

学習が終われば、部屋数1から９で予測してみる

~~~py
#予測
test = [[1],[2],[3],[4],[5],[6],[7],[8],[9]]
model.predict(test)
~~~

7部屋なら、＄29、3部屋なら＄-7 、1部屋なら＄-25 となった。学習に利用したデータに、1部屋、3部屋のデータがなかったために、学習したモデルが使えないものになっているようである。

~~~py
from matplotlib import pyplot as plot
plot.scatter(df['RM'], df['PRICE'], color='blue')
plot.plot(test, model.predict(test), color= 'red')
~~~
![boston_price_predict.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/b5378146-6470-1234-a528-3c5b5af1cd2b.png)

これは、**外挿問題**である。

機械学習、深層学習は、外挿問題に対して弱い。
GitのエディターをVScodeに設定する方法(Macユーザー向け)

#はじめに
コミットメッセージの入力などでVScodeを使えるように設定していく手順を解説していきます。
前提として、Gitはローカル環境にインストールした状態にしておいてください。

#GitのエディターにVScodeを設定する
VScodeをGitのエディターとして登録するために、以下のコマンドをターミナルで実行しましょう。

```
$ git config --global core.editor 'code --wait'
```

次に、gitにVScodeがエディターとして登録されたか確認するために以下のコマンドを実行してみましょう。

```
$ git config core.editor
```

下記のように応答されればしっかり設定されています。

```
code --wait
```

しかし、これだけではコミットしたときにVScodeが立ち上がってくれません。
ためにし「git commit」と入力すると・・・

```
hint: Waiting for your editor to close the file... code --wait: code: command not found
error: There was a problem with the editor 'code --wait'.
Please supply the message using either -m or -F option.
```

このようなエラーが返ってきてしまいます。
これの解決方法を次で解説していきます。
#VScode側でGitと連携するための設定をする
まず、VScodeを起動してください。
起動できたら「Command Palette(⇧⌘P)」の入力欄に「shell command」と入力し、下図ような選択肢が出てきたら「〜をインストールします」の方を選択しインストールを実行します。
![スクリーンショット 2021-05-08 18.05.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326211/3a2ac15e-3949-47f6-cebc-43a40f174648.png)
次にターミナルで以下のコマンドを実行し、表示されたパスをコピーしてください。

```
$ which git
```
VScodeを開き、「①設定」に遷移し、「②git path」と検索、「③settings.jsonで編集」をクリックしてください。
![チュートリアル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326211/2566a4ef-722e-f157-cae3-a6c91308e13f.png)
編集画面にて以下のコードを追加します。パスの部分には先ほどターミナルでコピーしたご自身のものをペーストしてしてください。

```json:settings.json
"git.path": "/usr/bin/git"
```

以上で完了です。お疲れ様でした。
『ゼロから作るDeepLearning 2』メモ

前回

https://qiita.com/wafuwafu13/items/d77295a680907c7f0a69

https://www.oreilly.co.jp/books/9784873118369/

## p.31 MatMulノード

$\dfrac{\partial y_i}{\partial x_i} = W_{ij}$ となるのは、 $z=xy$ の乗算の逆伝播で $\dfrac{\partial z}{\partial x} = y$ となるのと同じ。

https://qiita.com/wafuwafu13/items/d77295a680907c7f0a69#p123-%E8%AA%A4%E5%B7%AE%E9%80%86%E4%BC%9D%E6%92%AD%E6%B3%95

https://twitter.com/wafuwafu13_/status/1390973443017895936

## p.72 共起行列

```python
def create_co_matrix(corpus, vocab_size, window_size=1):
    corpus_size = len(corpus) # 8
    co_matrix = np.zeros((vocab_size, vocab_size), dtype=np.int32)

    for idx, word_id in enumerate(corpus):
        for i in range(1, window_size + 1):
            left_idx = idx - i
            right_idx = idx + i

            if left_idx >= 0:
                left_word_id = corpus[left_idx]
                co_matrix[word_id, left_word_id] += 1

            if right_idx < corpus_size:
                right_word_id = corpus[right_idx]
                co_matrix[word_id, right_word_id] += 1

    return co_matrix

print(create_co_matrix([0, 1, 2, 3, 4, 1, 5, 6], 7))

# [[0 1 0 0 0 0 0]
#  [1 0 1 0 1 1 0]
#  [0 1 0 1 0 0 0]
#  [0 0 1 0 1 0 0]
#  [0 1 0 1 0 0 0]
#  [0 1 0 0 0 0 1]
#  [0 0 0 0 0 1 0]]
```

## p.74 類似単語のランキング表示

コサイン類似度が高い = ウィンドウサイズ内に現れる同じ単語の数が多い

## p.81 次元削減

https://twitter.com/wafuwafu13_/status/1391317573602484225

https://manabitimes.jp/math/1218

https://qiita.com/Hatomugi/items/d6c8bb1a049d3a84feaa#svd%E7%89%B9%E7%95%B0%E5%80%A4%E5%88%86%E8%A7%A3

## p.84 SVDによる次元削減

```python
>>> import numpy as np
>>> x = np.arange(1, 11).reshape(2, 5)
>>> print(x)
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]]
>>> print(x[:, 1])
[2 7]
>>> print(x[:, 3])
[4 9]
```

## p.103　CBOWモデルの推論処理

図3-10は図3-8のWと等しく、抜き出されるから各単語の重みとなっており、それを各単語の分散表現という

https://qiita.com/Hironsan/items/a58636f946dd51f670b0#%E5%8D%98%E8%AA%9E%E3%81%AE%E5%88%86%E6%95%A3%E8%A1%A8%E7%8F%BE%E3%81%A8%E3%81%AF

## p.150 多値分類から二値分類へ(実装編)

sayを抜き出すなら`idx`は複数いらなくない？

## p.186　ループの展開

https://denden-seven.hatenablog.com/entry/2019/03/22/090000

## p.202 Time RNNレイヤの実装

https://www.anarchive-beta.com/entry/2020/12/25/195025

## p.303 Decoderクラス

図7-19の入力は教師データとして与えられており、図7-11の出力を想定している

## p.369 Transformer

https://zenn.dev/attentionplease/articles/2d4b2b55ba396e
Ubuntu 20.04でapt updateしたらキー古いって言われた

# はじめに

Ubuntu 20.04.2 で apt update したら heroku.com のキー古いよって言われた

```
$ sudo apt update
取得:1 https://cli-assets.heroku.com/apt ./ InRelease [2,879 B]
エラー:1 https://cli-assets.heroku.com/apt ./ InRelease
  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 6DB5542C356545CF
ヒット:2 http://archive.ubuntu.com/ubuntu focal InRelease
ヒット:3 http://security.ubuntu.com/ubuntu focal-security InRelease
ヒット:4 http://archive.ubuntu.com/ubuntu focal-updates InRelease
ヒット:5 http://archive.ubuntu.com/ubuntu focal-backports InRelease
2,879 B を 1秒 で取得しました (2,982 B/s)
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
パッケージはすべて最新です。
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: https://cli-assets.heroku.com/apt ./ InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 6DB5542C356545CF
W: https://cli-assets.heroku.com/apt/./InRelease の取得に失敗しました  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 6DB5542C356545CF
W: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。
```

# 対処

```
$ sudo apt-key adv --keyserver hkps://keyserver.ubuntu.com:443 --recv-keys 6DB5542C356545CF
Executing: /tmp/apt-key-gpghome.IFl4wQBBS3/gpg.1.sh --keyserver hkps://keyserver.ubuntu.com:443 --recv-keys 6DB5542C356545CF
gpg: key 70E2D495D3D0A153: public key "Heroku, Inc. <support@heroku.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1
```

```
$ sudo apt update
取得:1 https://cli-assets.heroku.com/apt ./ InRelease [2,879 B]
取得:2 https://cli-assets.heroku.com/apt ./ Packages [612 B]
ヒット:3 http://security.ubuntu.com/ubuntu focal-security InRelease
ヒット:4 http://archive.ubuntu.com/ubuntu focal InRelease
ヒット:5 http://archive.ubuntu.com/ubuntu focal-updates InRelease
ヒット:6 http://archive.ubuntu.com/ubuntu focal-backports InRelease
3,491 B を 1秒 で取得しました (3,392 B/s)
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレードできるパッケージが 1 個あります。表示するには 'apt list --upgradable' を実行してください。
```
関数のオーバーロードを使っての感想

# 初めに

そもそも関数のオーバーロードってなんだろう？いろんな記事で扱われているので簡単に説明をしてみる。

```typescript
function increment(num: string | number) {
  if (typeof num === "string"){
    return num + "000"; 
  } else  {
    return num + 10; 
  }
}

const incre01 = increment("10");
console.log(incre01) // 10000
const incre02 = increment(10);
console.log(incre02) // 20
```

上記の処理は関数に渡す引数の値がstring型かnumber型かで処理を分けれるようにしている。
ここでincre01にカーソルを当てると下記の画像のようになる。

![スクリーンショット 2021-05-08 19.03.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305148/958c9984-f7c7-ea4d-9283-abf8a76d0e6e.png)


incre01の期待したい値はstring型なのにnumberも混ざってしまっている。。TypeScriptさん、そうじゃないんです。そのような時に型アサーションで

```typescript
const incre01 = increment("10") as string;
```

という風にするのも一つの手段だと思われます。ただこちらの関数を何度も使う時に毎回型アサーションを使うのもどうなんだ？？となる時に使うのがオーバーロードになるみたい。コードにすると下記のような感じ

```typescript
function increment(num: string): string;
function increment(num: number): number;
function increment(num: string | number) {
  if (typeof num === "string"){
    return num + "000"; 
  } else  {
    return num + 10; 
  }
}

const incre01 = increment("10");
console.log(incre01) // 10000
const incre02 = increment(10);
console.log(incre02) // 20
```

注目するべきなのは、

```typescript
function increment(num: string): string;
function increment(num: number): number;
```
の部分で、
stringが来たらstringを返す。
numberが来たらnumberを返す。

という風にTypeScriptにエンジニアが実装をした意図の型をTypeScriptに伝えている形ですね。

## オーバーロードを使っての感想

こちらはあくまで個人的な意見という事で。。
オーバーロードで型を伝えるというのはいい機能だと思っているのですが、そもそも異なる型が来てそれによって処理を分けるという事自体どうなんだろうという気がしている。（これは今回がstring と numberを使っているからかも。。）
関数の中でやっている処理がincrementという足すという事をしたとしても、やっていることが違うので関数を分けた方がいいのではと思った。。

## 2021/5/8に追記

こういうパターンは使える？？
下記は一例。。

```typescript
function execute(role: "normal"): "私はnormalユーザーです";
function execute(role: "admin"): "私はadminユーザーです";
function execute(role: "normal" | "admin") {
  if (role === "normal"){
    return "私はnormalユーザーです" 
  } else  {
    return "私はadminユーザーです"
  }
}
const result =  execute("normal")
```
![スクリーンショット 2021-05-08 21.09.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305148/ba77afdf-6e40-1b4f-1b1a-167369736b90.png)
![スクリーンショット 2021-05-08 21.09.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305148/fea06b12-7de4-b626-d8ae-73043310fc59.png)

## 最後に

こちら見ていただいてありがとうございました！
関数をオーバーロードに対して最後に否定的になってしまいましたが、『こんな感じで使ったらいいよ！』みたいな事があれば是非コメントよろしくお願いします！
vue -Vでzsh: command not found: vue からバージョンがちゃんと確認できるまでの苦悩

#　背景
この記事はvueのcliを入れたものの、vueのコマンドが使えなくて調べた内容を記録しておくための備忘録となっています。

順を追っていきましょう。

#流れ

まず、vueのcliを使用するために以下のコマンドを実施

＜実行コマンド＞

```terminal
npm install -g @vue/cli
```

その後、手順に沿ってvueのコマンドが使用できるか確認

＜実行コマンド＞

```terminal
vue -V

zsh: command not found: vue
```

### なんでや！！！！！

言われた通りにやってますやん！まあ、こんなことは開発環境設定においてはあるある。
西川くんとこの子が毎回気絶しちゃうくらいあるある。

そんな戯言は置いておいて、調べてみると、PATHが通ってないと。
ふむふむ
よく聞くやつですね。
調べてみると、色々と出てくるんですね。そんな中、.bash_profileなるものにPATHの設定をしていないからvueのコマンドが使用できない！みたいな記事を見つけたんです。
でも、考えてみると、わたし、bashじゃないんですよね。
とはいえ、[その記事](https://qiita.com/sam_sam/items/50c96a0510e9ea389195)だと、.bash_profileに記述してやればできたっていうので、真似してやってみることに。

```terminal:terminal
export PATH="/Users/＊＊＊/.npm-global/lib/node_modules/vue-cli/bin:$PATH"

$ source ~/.bash_profile
```
まず❗️.bash_profileがないので、(色々と省きますが)できませんでした。

#### (少し寄り道)
そこで一旦、確認する。vueはあるんか。[この記事](https://qiita.com/Sinhalite/items/64731c0a84cadb516a24)通りで確認するとvue自体は確認できました

＜実行コマンド＞

```terminal:terminal
npm list -g vue
/Users/[name]/.npm-global/lib
└── vue@2.6.12 
```



### 本筋へ戻ります

調べた結果、自分はzshに設定がなっているのでzshに基づいたpathの設定をしないといけないみたいなんですね。
ふむふむ。
とすると、「.zshrc vue」で調べてみるか、ということに。
なかなか良さそうな記事があったのでそれを真似してみる事に。

```:.zshrc
export PATH=$PATH:/Users/[username]/.npm-global/bin
```
上記一文を.zshrcの最後の1行に追記してみました。
([username]のところを自分の登録されている名前に変更してください)
そして、ファイルを編集した後は下記コマンドで設定の際読み込みを実施。(これ忘れないでください)

＜実行コマンド＞

```terminal:terminal
source .zshrc      
```

## そしてついに,,,

そしてもう一度、vueのコマンドが使えるかバージョンの確認からテストです。

```terminal:terminal
vue -V
@vue/cli 4.5.13

```

### ついに通りました！歓喜です!!
ついこの間までなら自分一人で解決って難しかったと思うんですけど、ちょっとずつ経験値を積んできて、『多分こういうパターンだろうから、pathをこうしてこうやったら,,,』みたいなのができる様になったのかなと思います。

皆様の中にも、自分はbashじゃないんだけど(自分も気づいたらzshだったんです。怖いですねw)、どうやって解決すればいいんだ？？みたいな方が少なからずいらっしゃると思います。そんな方の解決のヒントになれば幸いです。



参考記事はこちらです:
[How to fix “zsh: command not found: vue”?
](https://stackoverflow.com/questions/58590890/how-to-fix-zsh-command-not-found-vue)
「シグモイド関数をグラフにしてみる」を参考にWolframAlphaでやってみた。

(オリジナルポスト)

https://qiita.com/azumabashi/items/3226fc855fd840281e09

##WolframAlphaで
https://www.wolframalpha.com/input/?i=%E3%82%B7%E3%82%B0%E3%83%A2%E3%82%A4%E3%83%89%E9%96%A2%E6%95%B0&lang=ja

####入力:
1/(1 + exp(-x))
Ruby と Java と Crystal と C++ で解く プログラマーにしか解けない！ #実行時間クイズ の1問目

# はじめに
*[プログラマーにしか解けない！ #実行時間クイズ](https://kuizy.net/quiz/187399)* をやってみました。
FoH6ESorz79IWhk さん、kuizy さん、ありがとうございます。

また、実行環境として*[AtCoder](https://atcoder.jp/home)* のコードテストをお借りしました。
AtCoder さん、ありがとうございます。
# C++
```c.c
#include <iostream>
using namespace std;

int ret[10009];

int main() {
  int N = 10000, sum = 0;
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      ret[i] += i * j;
      ret[i] %= 10007;
    }
  }
  return 0;
}
```
元の問題より、出力部分を省略しています。

```time
316 ms
```
# Ruby
```ruby.rb
n = 10000
sum = 0
ret = Array.new(10009, 0)
n.times do |i|
  n.times do |j|
    ret[i] += i * j
    ret[i] %= 10007
  end
end
```
```time
9294 ms
```
# Java
```java.java
class Main {
    public static void main(String[] args) {
        int ret[] = new int[10009];
        int N = 10000, sum = 0;
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                ret[i] += i * j;
                ret[i] %= 10007;
            }
        }
    }
}
```
```time
392 ms
```
# Crystal
```Crystal.cr
n = 10000
sum = 0
ret = Array.new(10009, 0)
n.times do |i|
  n.times do |j|
    ret[i] += i * j
    ret[i] %= 10007
  end
end
```
```time
671 ms
```
# まとめ
+ 遅い遅いと言われていますが、本当に遅いのを実感しました
+ 競技プログラミングで`Ruby`を使用している方は、何かの修行なのかもしれませんね
リモートブランチとローカルブランチから特定のキーワードを持つブランチだけを一括で削除する方法

## 背景
開発を進めていると、マージ済みかどうかにかかわらず役目を終えて必要なくなったブランチが大量にのこってしまうことがあると思います。
そのような場合で、特に削除対象のブランチ名に全てfeatureなど一定のキーワードを含む場合、一括でリモート・ローカル共に消すことが出来ます。
今回はそのような方法についてわかりやすく解説します。

## 結論
以下のコマンドを１つづつ順に実行していきましょう。
${keyword} :お好きなキーワード(e.g. feature)に置き換えてください。

```bash
git fetch --prune
git branch --remote | grep ${keyword} #対象のブランチを本当に全て消しても大丈夫かこのコマンドで確認
git branch --remote | grep ${keyword} | sed -e "s/origin\///" | xargs git push --delete origin
git fetch --prune
```

## 解説

#### 前提
今回は以下のようなローカル・リモートブランチがあるとします。

| local         | remote               |
|:-------------:|:--------------------:|
| master        | origin/master        |
| dev           | origin/dev           |
| feature/test1 | origin/feature/test1 |
| feature/test2 | origin/feature/test2 |
| feature/test3 | (no branch, deleted) |

これらのブランチを、最終的に以下のように整理するのが目的です。

| local         | remote               |
|:-------------:|:--------------------:|
| master        | origin/master        |
| dev           | origin/dev           |

1. ローカルのブランチを最新のものにアップデート
この作業をしないと、あとでリモートですでに削除されているがローカルでは残っているブランチがあった場合にリモートブランチの一括削除が失敗します。
    
    ```bash
    git fetch --prune
    ```
    
    **現在の状態**
    
    | local         | remote               |
    |:-------------:|:--------------------:|
    | master        | origin/master        |
    | dev           | origin/dev           |
    | feature/test1 | origin/feature/test1 |
    | feature/test2 | origin/feature/test2 |
    
2. 特定のキーワードを持つリモートブランチを一括で取得
ここではこれから一括で消すブランチを表示し、本当に全て消して良いかを確認します。
大丈夫であれば先にすすんでください。
    grep: 特定の文字列を含む行を抽出するコマンド。今回はfeatureブランチを抽出。
    
    ```bash
    git branch --remote | grep feature
    ```

    ```bash:output
    origin/feature/test1
    origin/feature/test2
    ```
    
3. リモートブランチを一括で除去
    sed: 特定の文字列を置換するコマンド。今回は文字列"origin/"を各行から取り除いている。
    xargs: 入力を引数として別のコマンドを実行する。今回は抽出した各featureブランチに対してそれぞれ```git push --delete origin {branch name}``` を実行している。
    git push --delete origin {branch name}: リモートブランチを削除するコマンド 
    
    ```bash
    git branch --remote | grep feature | sed -e "s/origin\///" | xargs git push --delete origin
    ```
    
    **現在の状態**
    
    | local         | remote               |
    |:-------------:|:--------------------:|
    | master        | origin/master        |
    | dev           | origin/dev           |
    | feature/test1 | (no branch, deleted) |
    | feature/test2 | (no branch, deleted) |
    
4. リモートで除去されたブランチをローカルで一括除去
手順1と全く同じです。

    ```bash
    git fetch --prune
    ```
    
    **現在の状態**
    
    | local         | remote               |
    |:-------------:|:--------------------:|
    | master        | origin/master        |
    | dev           | origin/dev           |

## まとめ
以上の方法で、ローカル・リモートブランチをきれいに整理することができました。
みなさんもブランチ削除を慎重に、そして大胆に行っていきましょう！
    
##　参考
- https://qiita.com/mather314/items/a1536c52a2eb0426b2b5#%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%AE%E5%89%8A%E9%99%A4%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89
- https://qiita.com/satoshi03/items/c53aab17f3270477e33a
Goのライブラリのversion管理に関してメモる

ふと耳にしたので箇条書きでメモる。間違ってたらごめんなさい。

- 「パッケージ」はモジュールより細かい、可視性の制御単位
- Golangaでは、依存グラフがどのように解決されたかの情報を含むlockファイルは存在しない。
   - 以下の方法で解決している。
- go.modには下限制約しか書けず、インストールするモジュールは**最小(最古)バージョン**に解決する
   - (c.f)
bundleだと上限も制限でき、インストールするモジュールは依存関係を満たした上での最新バージョンになっていたはず
   - 同一パッケージの下限制約のmajor versionが違ったらどうなる？
   - どうなるかはわからないが、以下の方法でこの問題を避けることはできる。
- メジャーバージョンをパッケージ名に含める(e.g. `module github.com/my/mod/v2`)ことで、プロジェクト内で同一パッケージの複数のバージョンが共存することが許容される。(Semantic Import Versioningと呼ばれる) → [参考](https://stackoverflow.com/questions/57602028/two-version-of-same-dependency-lower-version-getting-ignored)
【Salesforce】【レポート】参照関係項目でのグループ化の落とし穴

条件を満たすレコードの一覧を取ったり、グループ化して集計を取ったり
使いこなせると便利な機能　レポート。​
そんなレポートを使っていて、ふぇぇ..ってなったことがあったので書き残す。


#グループ化する項目の値でまとめられてしまう
当たり前じゃないか。いやそうなんだけども、落ち着いて聞いてほしい。

取引先ごとにグループ化した「取引先別商談一覧」レポートが以下である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/28232451-450a-9c0e-8b2f-ab9a34f862f0.png)
このレポートから「テスト取引先１」に商談が2つあることがわかる。

本当か？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/98906dba-7572-939b-aa04-2d0249b46fe8.png)
リンクで「テスト取引先１」のページに飛び関連リストを見てみると実際は1件しかない。

#グループ化する項目の”値”でまとめられてしまう
勘のいい人ならお気づきかもしれないが
「テスト商談２」は、もう一つ別の「テスト取引先１」に紐づく商談なのである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/eccc1321-7719-a930-8d97-3c683bb53fff.png)
（つまり「テスト取引先１」が複数あるということ。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/1348269d-fd81-ffb4-297b-b5026b59b2d1.png)


なるほど、
取引先（参照関係のID）でグループ化して、その取引先名を表示している。わけではなく
**​取引先名の値でグループ化している。**ということらしい。

ちなみに1枚目の画像（「取引先別商談一覧」レポート）で「テスト取引先１」がリンクになっているが
これは詳細行の一番目の商談レコード（テスト商談１）の親になっているぽい。

#運用上の注意が必要
同名の会社を登録している組織はよく見るし、
同姓同名の取引先責任者がいる（姓しか登録していないとかもあるある）場合など
参照関係項目でグループ化するときは気を付けねばと思った出来事でした。
LaravelからDiscordにエラー通知を飛ばしたい

SlackよりもDiscordのほうがレスポンスが早いオタクです。

運用しているLaravelベースのサービスで万が一500番台のエラーが発生したとき、エラー情報をDiscordに飛ばしてほしい、そういうことありますよね。あるんですよ。

調べたところやるだけでしたので書いておきます。

## 事前準備

DiscordへのWebhookの設定は公式のドキュメントも参照されてください。

https://support.discord.com/hc/ja/articles/228383668-%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB-Webhooks%E3%81%B8%E3%81%AE%E5%BA%8F%E7%AB%A0

DiscordのWebhookでもっと戯れたい方はこちらの記事も参考になります。

https://qiita.com/Eai/items/1165d08dce9f183eac74

## LaravelはSlack宛にログを飛ばせる

LaravelはデフォでSlackに通知を飛ばす機構があります。( https://readouble.com/laravel/8.x/ja/notifications.html )

`config/logging.php` に設定がありますね

```php
'slack' => [
    'driver' => 'slack',
    'url' => env('LOG_SLACK_WEBHOOK_URL'),
    'username' => 'Laravel Log',
    'emoji' => ':boom:',
    'level' => env('LOG_LEVEL', 'critical'),
],
```

`.env` にSlackのwebhookURLを書いておけば、すでにSlackに通知が飛ばせるよう準備されています。助かりますね！

でも今回エラー情報を飛ばしてほしいのはDiscordです。ではどうするか。

## DiscordはSlack形式のWebhookをサポートしている

DiscordにGitHubのWebhookを登録している方は `/webhooks/{webhook.id}/{webhook.token}/github` のようにURL末尾に `/github` をつけることで通知を受け取れるようになるのをご存知かもしれません。

**実はSlack互換も用意されています。**

POST `/webhooks/{webhook.id}/{webhook.token}/slack`

https://discord.com/developers/docs/resources/webhook#execute-slackcompatible-webhook

## あとは実装するだけ

`app/Exceptions/Handler.php` にちょっと書き加えます

```php
    public function render($request, Throwable $e)
    {
        $response = parent::render($request, $e);

        if (($response->getStatusCode() / 100) === 5 and !config('app.debug')){
            $message = 'サーバエラーが発生しました'.PHP_EOL.$e->getMessage().PHP_EOL.$request->fullUrl();
            Log::channel('slack')->error($message);
        }

        return $response;
    }
```

`parent::render()` が普通にレスポンスをくれるので、そのデータをちょっとお借りしてログを出します。

ついでに `!config(app.debug)` を条件式に入れてデバッグモードのときは飛ばないようにしておきました。

### テスト

絶対バグるコードをちょっと書き加えて試します。F5リロードする緊張の一瞬。

\ ﾋﾟﾎﾟｯ /
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144262/190491f9-00d4-c11c-6dc2-276ced5fd694.png)

**ヨシ！**
[VBA][UiPath]UiPathでOCR処理するためのテストデータを自動で作成する

## [0]はじめに
Zitanです。
UiPathでOCRの繰り返し処理をする前段階として、テストデータをExcelVBAで作成してみました。
今回はOCRは直接的に関係ないのですが、定型事務的な作業の自動化としては需要があると思います。
次回の記事で今回作ったテスト用の請求書データ（PDF）をOCR処理します。

＜前回の記事＞

https://qiita.com/Zitan/items/4e2ee5006bf800ffa29f

## [1]今回作ったもの
前回のUiPath（OCR）の記事でも使った請求書のテンプレートです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/659d562f-0063-166e-2c46-86ca18df749b.png)

ちなみにテンプレートは、ここで入手しました。
※利用規定に商用・非商用問わず無料で利用できると記載されています。便利なので使用させていただきました。

https://template.the-board.jp/tags/1/%E3%82%BF%E3%83%86%E5%9E%8B


この請求書をテンプレートとして、下記のデータを10件書き込みます。
A社からJ社まで10社分の請求書をPDFで保存するところまで自動化しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/507e015d-16d5-02cf-931c-7c67babdbc64.png)

マクロファイルと同じ階層に、こんな感じで格納されます。更新日時を見てわかる通り、10社分の請求書が1分以内（10秒弱）で出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/dfb703ab-95eb-f4c8-5149-4624f2821fef.png)

例としてA社の請求書の中身です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/da60b7ac-a629-83d5-6fa3-01c86e9ddeb8.png)


## [2]プログラムコードの紹介

コード全文はGitHubに全体公開しています。

https://github.com/Zitan-3min/ExcelVBA/commit/fb83c7d230705e0ef946ec89d2b3515a961e2994

マクロファイルは標準モジュールを２つ作成して、それぞれ「Common」、「請求書データ転記とPDF化」としました。
最初はPDF化と転記のプロセスを２つのモジュールで分ける予定で、「Common」モジュールに共通で使用する変数を定義しました。
実際は転記とPDF化を一つのモジュールで完結させました。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/e8c8282c-e578-3de3-2b8e-ab872f2d5b57.png)


請求書シートについて、事前にセルの名前の定義が必要です。
※請求書雛形と呼ぶことにします。

実際の請求書雛形は塗りつぶしていませんが、説明のために塗りつぶしたセルの色と対応させています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/0ebeacc5-e7ac-8992-dccb-3a2fec558ba8.png)

セルの名前の定義の方法ですが、赤色で塗りつぶしたセルを選択すると左上にセルの名前を入力することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/8ca8aaa2-2898-c9ac-6f49-ac660bb2e02a.png)
※通常、セルに名前を定義していない場合、A1セルをクリックするとセルの名前はデフォルトでA1と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408638/0cf907b0-ee98-c6f4-1869-4d541dc13807.png)

セルの名前の定義をしておくと、コーディングするときに何を操作しているのか分かりやすく、可読性が上がるというメリットがあります。



## [3]実際に動くとこんな感じ

アプリの動画記録時間が7秒なので、ギリギリ時間内に収まる5社分のデモ動画にしました。
[![Image from Gyazo](https://i.gyazo.com/59d93e49552fe06d80da8bbc0be8e743.gif)](https://gyazo.com/59d93e49552fe06d80da8bbc0be8e743)

おそらくPDF化するところに時間がかかるのだと思いますが、手作業よりは圧倒的に早いです。

## [4]まとめ
いかがでしょうか。
次回は、今回作成したPDFのデータ全件に対して、UiPathでOCR処理を行いたいと思います。
Python 文字列の中で変数を展開する formatとfstring

```python

f = "hoge"
l = "ホゲ男"

# "{}"置換フィールドに入れる文字列を指定
print('First={} Last={}'.format(f,l)) # First=hoge Last=ホゲ男

# 2 "{}" 置換フィールドを引数番号指定
# .formatカッコ内は左から(0,1,2,3....)という順番になる。
print('First={0} Last={1}'.format(f,l)) # First=hoge Last=ホゲ男
# 引数番号は自由に変更が可能
print('First={1} Last={0}'.format(f,l)) # First=ホゲ男 Last=hoge

# 3 変数を指定した展開
print('First={first} Last={last}'.format(first=f,last=l)) # First=ホゲ男 Last=hoge

# 4 新しいバージョン python3.6以降 処理が早い
print(f'First={f} Last={l}') # First=hoge Last=ホゲ男

```
参考にした記事
[Pythonの文字列の中で変数を展開する方法](https://www.headboost.jp/python-strings-variables/)
MAMPのスタート画面が開かない（Bad Request画面の解決）

# はじめに
PHPの学習を始めるためMAMPを起動したところなかなか起動できず、しばらく格闘したので記録として残します。
同じ境遇の方の解決のヒントになれば幸いです。

# 条件
PHP version: 7.4.12


# 目次
1. 現状（エラー画面）
2. 原因
3. 解決まで
4. おわり

# 1. 現状（エラー画面）

MAMPをダウンロードし、意気揚々と学習をスタート！
　　　　　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1379469/98e29d6b-ce0d-a5c3-a57a-e147d3cbaf69.png" width=70%>

<br>
...としようとしたところ、画面が以下のようになりページが開かなくなりました。

![スクリーンショット 2021-05-08 15.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1379469/bbcbabd1-afa6-c5a2-226e-8077cdf76a6f.png)

......え？

何回か再起動しても同じ結果に。
設定なんかやらかしたかな....？と思いつつも、ダウンロードしてから何も触ってないので、他に原因があると思い、原因を調べました。

# 2. 原因

探してみたところ色々ありましたが、結論として上記のようなエラー画面は以下が原因でした。

 - WebブラウザのCookieの異常、もしくは容量の限界
 - 複数画面の開きすぎ

特に、<b><font color=tomato>複数画面の開きすぎ</font></b>は心当たりしかありません。
これを解決する方法として、<b>Cookieをクリアにする</b>というのがありましたので、そちらを実行していきたいと思います。

# 3. 解決まで

早速、Cookieをクリアにしていきます。

### ① Googleの設定を開く

　　　　　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1379469/bce75b55-cd98-a715-c12a-55247345be90.png" width=70%>

### ② 「閲覧履歴データの削除」を選択
設定を開き、画面の下に進むと「プライバシーとセキュリティ」の項目があります。
その中の、<b>「閲覧履歴データの削除」</b>を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1379469/2b430a32-c732-387e-4211-b924efdb3c83.png" width=８0%>


### ③ データ削除の選択
「閲覧履歴データの削除」を開いたら、以下のようなページが出てくるので、真ん中の
<b>「Cookieと他のサイトデータ」</b>を選択します。
　　　　　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1379469/d98eb4ff-5a78-6b4f-7765-3f4a4b0d1bea.png" width=70%>
ここで注意して欲しいのが、<b>「期間」</b>と書かれた部分を<b><font color=tomato>「全期間」</font></b>とすることです！！

　　　　　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1379469/3a245297-242a-ad2d-01c0-e1f624c3d2bc.png" width=70%>
ここを知らずに、ずっと１時間以内に溜まったデータを削除してました...。
当然、１時間じゃそこらの期間のデータを消したところでクリアになるはずもなく、ずっとエラー画面が続いてしました。
<br>
「全期間」を選択したことを確認して、<b>「データ削除」</b>を選択！
無事、MAMPの起動画面を開くことができました。

***
Cookieのデータを削除すると、今までログインしっぱなしだったサイトも、もう一度ログインし直す必要があります。
Qiitaもログイン画面に戻っていました。
***

# 4. おわり
まさかサイトの開きすぎがこんなことになるとは...。
これを機に画面がスッキリした気がします。
もしかしたらまた見返すかも....と言いつつ全然見ないサイトがたくさんあったので、これからは気をつけようと思います。

PHP学習頑張るぞ！！


今回の解決にあたり参考にさせて頂いたサイト
[「400 Bad Request」エラーの解決方法（原因と対策）]
(https://kinsta.com/jp/knowledgebase/400-bad-request/#400-clear-cookies)
Javaのクラス内で画像を取得する

# 概要
Javaのクラス内で、HTTP通信を使って外部から画像データなどを取得する方法について、`HttpURLConnection`を使ってデータを取得していました。
この`HttpURLConnection`について、今まではただ必要な設定として認識していたものを、それぞれどのような事を設定しているのかを改めて確認をしたいと自分用にまとめようと思いました。

## ソースコード
今回は、外部から画像データを取得して、それがPNGの画像データであればその`InputStream`を生成するという部分のみ抜粋しました。

```java
String targetContentType = "image/png";
DataInputStream inputStream = null;
try {
	// フォーマットがPNGの画像を指定
	URL url = new URL("https://dummyimage.com/570x150");
	HttpURLConnection conn = (HttpURLConnection) url.openConnection();
	conn.setAllowUserInteraction(false);
	conn.setUseCaches(false);
	conn.setInstanceFollowRedirects(true);
	conn.setRequestMethod("GET");
	conn.connect();
	if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
		if (conn.getContentType().equals(targetContentType)) {
			inputStream = new DataInputStream(conn.getInputStream());
		}
	}
} catch (MalformedURLException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
}
if (inputStream != null) {
	// 画像のInputStreamに対してやりたい事
}
```
## HttpURLConnectionに設定したフィールド
上記で設定したフィールドのみ列挙しています。

| フィールド           | 修飾子と型        | 説明                                                                     | 
| -------------------- | ----------------- | ------------------------------------------------------------------------ | 
| allowUserInteraction    | protected boolean | 接続時にユーザー名やパスワードの入力を求められたとき、許可をするかどうか | 
| url                     | protected URL     | HTTP通信をしたい対象のURL                                                | 
| useCaches               | protected boolean | キャッシュを使用を許可するかどうか                                       | 
| method                  | protected String  | HTTPに使用するメソッド（GETやPOSTなど）                                  | 
| instanceFollowRedirects | protected boolean | プロトコルがリダイレクトに従うかどうか                                   |
シグモイド関数をグラフにしてみる

Jupyter を使ってやってみます。

```
import numpy as np
import matplotlib.pyplot as plt

def func_sigmoid(x):    # シグモイド関数
    return 1/(1+np.exp(-x))

def func_derivative_sigmoid(x):    # シグモイド関数の導関数
    y = func_sigmoid(x)
    return (1-y)*y

x = np.linspace(-5, 5)
y = func_sigmoid(x)
y_derivative = func_derivative_sigmoid(x)

plt.plot(x, y, label="sigmoid")
plt.plot(x, y_derivative, label="derivative")
plt.legend()

plt.xlabel("x", size=14)
plt.ylabel("y", size=14)

plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/92fbf25b-32b9-adf0-e789-22701c8d5f8b.png)
TypeError: loaderUtils.getOptions is not a function 

Rails6でTypeScriptを導入しようと，以下のコマンドを実行．

```
$ bin/rails webpacker:install:typescript
```

tsファイルを読み込み，実行してみると，以下のようなエラーがでた．

```
Module build failed: TypeError: loaderUtils.getOptions is not a function  
```

依存関係がまずいのかと思ってnode_modulesと，yarn.logを削除して，`yarn install`したが，かわらず．．．．


以下のissueを見てみると，ts-lorderがwebpack4に対応していないことが原因らしい．

https://github.com/TypeStrong/ts-loader/issues/595

package.jsonを，以下のように変更

```diff_json:package.json
{
  "name": "remopro_admin",
  "private": true,
  "dependencies": {
    "@rails/actioncable": "^6.0.0",
    "@rails/activestorage": "^6.0.0",
    "@rails/ujs": "^6.0.0",
    "@rails/webpacker": "4.3.0",
-   "ts-loader": "^9.1.2",
+   "ts-loader": "^8.2.0",  
    "turbolinks": "^5.2.0",
    "typescript": "^4.2.4"
  },
  "version": "0.1.0",
  "devDependencies": {
    "webpack-dev-server": "^3.11.2"
  }
}

```

`yarn install`で再度実行してみると，正常に実行されるはず！
Ubuntu18,20系に/etc/network/interfacesが存在しない？？？

いつもはDebian 10, Debian 11, Linux Mint 20を使用しているので、まずはインターネットにつなげようと思い、設定しようとした。
学校のPCなので、スペック等は省略。
ubuntu20系の設定で苦労したので、その備忘録的な扱いです。


# /etc/network/interfacesがない。

ターミナル上で設定しようとしたが、見つかりません。
ちょっと待ってくれ。
終わってんぜ君　状態

いやいや、急に変わるな。
こっちも準備ってものがあるだろ。

~~ほんとそういうところだぞ、マジで~~

# netplanというシステムで管理されているそう

手順としては
①yamlファイルを設定
②その設定を反映させる(netplan apply)

## yamlファイルを設定していく
いわゆるconfファイルのような立ち位置のファイルだと解釈。
※固定IPアドレス仕様なので、DHCPの場合はもっと簡単に書けると思います。

```
$ vi /etc/netplan/xx_config.yaml 
network:
  version: 2
  renderer: networkd
  ethernets:
    enp61s0: #インターフェース名
      match:
        macaddress: ab:cd:ef:gh:ij:kl #MACアドレス
      addresses: [aaa.bbb.ccc.43/16] #ローカルPCの下位IPは43番
      #/16だと上位16bit→ netmask:255.255.0.0
      #/24だと上位24bit→ netmask:255.255.255.0
      mtu: 1454
      dhcp4: false
      dhcp6: false
      gateway4: aaa.bbb.ccc.1 #gwは下位IP１番としています
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4 ]
```

固定IPアドレスでの設定
すなわちinet staticでの設定の場合の記載

yamlファイルで一番苦しんだのは以下の部分

```
match:
    macaddress:xx:xx:xx:xx:xx:xx
```

mtuを1454に設定したい私は、mtu: 1454と記載しているのにもかかわらず、mtuが変更されない沼にハマっていた。
解決方法としては上のmatch以後を書かないと設定できなかった。

流れとしては
インターフェースのMACアドレスとyamlファイルないのMACアドレスが一致したら、mtuを1454に設定するという流れだそうだ。

## 設定を適用させる

大まかには`sudo netplan apply` でOK

私の場合はDNSも指定があるのだが、/etc/resolv.conf が毎回書き換わる
結局わからないままだったがresolv.conf系の設定コマンドたちは以下です。

```
vi /etc/systemd/resolvd.conf
systemctl enable systemd-resolved
systemctl start systemd-resolved
```

# 参考サイト

https://qiita.com/noraworld/items/3e232fb7a25ed16c6a63


https://qiita.com/zen3/items/757f96cbe522a9ad397d
オブジェクト指向でなぜつくるのか ポリモーフィズムについて

[オブジェクト指向でなぜつくるのか](https://www.amazon.co.jp/dp/4822284654/ref=cm_sw_r_tw_dp_BVJGFPTTC4N0KKKKFXTG)を読んでいて、ポリモーフィズム箇所のコードがわからなかったのでPythonで書いてみました。

基本的にJavaでかかれているので理解しづらいということと、コードが全て書かれていたなかたのでちゃんと理解できていなかったです。

## コード


```py:ポリモーフィズム箇所
from abc import ABCMeta, abstractmethod

# 元となるAnimalクラス
class Animal(metaclass = ABCMeta):
    @abstractmethod
    def cry(self):
        pass

# 受け継ぎ先のクラス
class Baby(Animal):
    def cry(self):
        return "オギャー"

class Dog(Animal):
    def cry(self):
        return "ワン"

class Crow(Animal):
    def cry(self):
        return "カー"
```

この様々な動物がなくコードに対して、
相手が誰であっても「泣け/鳴け」指示できるトレーナー(Trainer)クラスを作ります。

ここの箇所が読んだときに理解できていなかったです。

```py:トレーナークラス
class Trainer:
    def exucute(self, animal):
        print(animal.cry())
```

このトレーナークラスをどう使うかというと下記の様に使います。

```py:トレーナークラスの使い方
# 各クラスをインスタンス化
trainer = Trainer()
baby = Baby()
dog = Dog()
crow = Crow()

# 引数にインスタンス化した変数を入れる
trainer.exucute(baby)
trainer.exucute(dog)
trainer.exucute(crow)
```

すると出力結果は下記になります。

```:出力結果
オギャー
ワン
カー
```

インスタンス化した変数を代入するという今まで書いたことない書き方の発見につながりました。
せっかく試したのでメモ程度に残しておきます。