OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】AuthenticatesUsersを用いたログインで認証失敗時のイベントをオーバライドして独自のメッセージをレスポンスする。

メモとして残します。

AuthenticatesUsersを用いたログインで認証失敗時のイベント（sendFailedLoginResponse）
をオーバライドするして独自のメッセージを設定してレスポンスする方法をメモ。

#■やり方

今回は下記のようにLockFlgを独自の認証ルールとして追加したとする。


credentialsをオーバーライド↓

```LoginController.php
protected function credentials(Request $request)
{
    $conditions = $request->only($this->username(), 'password');
    $conditions_custom = array_merge(
        $conditions,
        ['LockFlg' => '0'] //ログイン条件追加：LockFlgが0であればログインできる。
    );
    return $conditions_custom;
}
```


sendFailedLoginResponseをオーバーライド↓

```LoginController.php
// ログイン失敗時のレスポンス
protected function sendFailedLoginResponse(Request $request)
{
    $errors = [$this->username() => [trans('auth.failed')]]; //デフォルトエラーメッセージ

// ここから好きに条件見るなりで、$errorsに好きなエラー文を設定
    //ユーザ情報を取得して条件確認する。
    $user = \App\Models\User::where($this->username(), $request->{$this->username()})->first();
    if ($user && \Hash::check($request->password, $user->getAuthPassword()) && (string)$user->LockFlg=== '1') {
        $errors = [$this->username() => 'アカウントがロックされています。システム管理者にお問い合わせ下さい。'];
    }

    throw ValidationException::withMessages($errors);
}

```
WPFとAccessの接続でハマったこと（The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.）

## 背景
　　C#および.NETの勉強のため、WPFとAccessを接続してDB操作してみた。
　　ハマったところについて記録しておく。

## 環境
　　OS: Windows 10 Pro
　　IDE: Visual Studio 2019 Community Version 16.10.3
　　Target Framework: .NET 5.0
　　DB: Access 2019 32bit 

## ソースコード
　　[DBConnectSample01](https://github.com/gthmkt94/DBConnectSample01)

## 本題
　　接続文字列が正しいことを確認した上で実行すると、接続できずに以下のエラーが発生した。

　　![2021-07-14_18h26_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488612/f589d5c8-6a41-1073-8d1d-b10c08a4c376.png)

　　「The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.」

　　エラー文で検索したところ、以下の設定で解決した。

　　1. 　「Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント」
　　　　　をインストールしていることを確認。（していない場合は [こちら](https://www.microsoft.com/ja-jp/download/confirmation.aspx?id=13255) から）

　　2. 　プロジェクトのプロパティを開く。
　
　　3. 　ビルドタブを開く。
　　
　　4. 　「対象プラットフォーム」を「Any CPU」から「x86」に変更。

　　▼変更前
　　![2021-07-14_18h29_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488612/8adba851-e415-3b11-e099-5b6535297c47.png)

　　▼変更後
　　![2021-07-14_18h33_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488612/5b29ecb8-3974-fdc4-cda6-7999276b1d5a.png)
Unityで「Failed to update Android SDK package list. See the Console for details.」が出てAndroidに書き出せなくなったときの対処法メモ

## 発生した現象

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

ビルドボタン押したらすぐこんなポップアップが出てきてビルドできなくなった。

しかも最初から発生したわけでなく、今までできていたのにGitHubからpullしたあとにできなくなった。

そんなプロジェクトの設定みたいなファイルを更新したわけではないんですけどねぇ…

## 対処した方法

検索したら、Android StudioでインストールしたAndroid SDKを指定しているのを辞めるようなことが見つかりましたが、そんなことしてなかった…

もちろんUnityをインストールする際に一緒にインストールしたAndroid SDKで、特に特殊な設定していない。

てか、pullする前はできていたのにというのがつきまとう…

### 解決法
最新のjavaをインストールしたら治りました。

https://www.java.com/ja/download/

エラーコンソール読んだらいけました。
【Mac版】MySQLのログイン時に仮パスワードを知る方法

こんにちは、アキです。
今回はMySQLをインストールした時に仮パスワードがないと入れないとなった時の対処法を書いていきます。

![スクリーンショット 2021-07-14 18.50.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1763540/27811e7c-1e33-49a6-8ac9-4fcab22a8d9d.png)

brewで入れた時とは違う反応になりました。
ここで使ったのが”less”コマンドです。
どこかに仮パスワードのテキストがあると思ったからです。

・lessコマンドとは？
「less」は、テキストファイルを1画面ずつ表示するコマンドです。「less ファイル名」で実行する他、「コマンド | less」のように、別のコマンドの実行結果を1画面ずつ表示する場合にも使われます。

このコマンドを実行した時はテキストが大量に出てきますが、そのうちの一つに以下のテキストがあり、最後の文が仮パスワードとなります。


![スクリーンショット 2021-07-14 18.54.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1763540/a30ddf1b-1b2a-dd3d-7ede-9dc0e680b2c2.png)

ログインができたら、あとはパスワードを変更するだけです。
phpの環境構築 - Mac  + Local by flywheel + VS Code

#まえがき

Local by flywheel（現：Local、以下Localと称します）でphpの環境構築がしたい！

MAMPとLocalの共存は今の実力では不可と判断し、
MAMPのインストールは最終手段として考えていたため、
どうしてもLocalで環境構築がしたいとうんうん唸っていました。

検索ワードのチョイスが悪いのか、LocalがWordPress専用だからか、
phpの環境構築を自身が構築したい条件で検索しても、探し出すことができませんでした。
そのため、気合いと根性でほぼ丸一日かけてphpの環境構築方法を見出しました。
これで船に乗ることができるかな、、と思います。🔗 [わたしのQiita投稿記事] (https://qiita.com/figgy-pudding/items/8e58b99161980e4ea654)
もしかしたら、こんなんあたり前田のクラッカーやないか！かもしれませんが、
そのあたりはどうぞお許しくださいませ。。次はレオリオとクラピカに会うぞ！

phpと、WordPressのローカル環境をサクッと構築がしたい方におすすめです。

#希望わがまま環境
Mac  BigSur 11.4　+　Local　+　VS Code　+　phpの実行

#前提
・phpはターミナルでインストール済み
・php info(); でphpのバージョン確認済み
・VS Codeの拡張機能のPHP Intelephenseを使用

#方法
① Localをインストールしてください
参考URL 🔗  [WordPressメモ macOSでLocal by flywheelを使ってローカル環境を作ってみる
](https://www.tetsuyanbo.net/tetsuyanblog/56965)非常に分かりやすく、読みやすく書いてくださっています。文章がすごくすきです。
② php用に新しくサイトを作成します
「phptest」とし、Customで作成しました。
参考にしたQiita 🔗 [お手軽にPHPとLaravelのローカル開発環境を構築する](https://qiita.com/ntm718/items/e0c8ed27e5272b370689)
③ サイトが作成できたら、サイトの名前が記載されている下にある、
〜/Local Sites/phptest の横の　>　をクリック
![php3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588933/4c5098d6-1f58-b724-b71e-997bac9ece60.png)
④ app/publicのpublicのファイルを全削除
⑤ VS Codeでpublicを開き、index.phpを作成（Finder内では作成できませんでした）。
![php5-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588933/fad8d8fe-70ee-75ff-ccc9-465ba4ce8753.png)
![php5-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588933/d59f8511-23ab-138e-b317-b78debd83c60.png)
⑥ VS Codeで

```php
<?
	echo ("Hi");
?>
```
と入力し、保存（command + s）。
![php6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588933/5e3eac14-42e5-4a9d-10e4-35bae09e5342.png)

⑦ Localに戻り、OPEN SITEをクリックすると、
![php7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588933/f8fd5c5e-5e98-f8d4-f5d9-80c69bc37ad2.png)

⑧ Hi と表示されています。
![php8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588933/3e8511e2-5fc8-dc81-23be-6964aa6beb38.png)

⑧ PHP Intelephenseの補完機能がVS Codeとぶつかるので、
Code -> 基本設定 -> 設定 -> 検索窓に phpsuggestbasic を入れて、
チェックを外しておくとスッキリします。
参考URL 🔗 [PHPのためのVSCodeおすすめ設定及びPHP IntellisenseとPHP Intelephenseの比較](https://yama-itech.net/visual-studio-code-recommend-setting-php)
![php9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588933/dc0d0295-e91c-7394-1fc6-6f198a4d3527.png)
#あとがき
科学に根性論は必要ねぇかもしれませんが、目的が達成できひとまず前進しました。
小さな目標をいくつか設定して、ポケモンみたくレベルを上げていくことが大事ですね。
WordPressのローカル環境構築のSSL化もできたので、いずれまた投稿したいと思います。

前回投稿した記事がかなり見辛かったので、
今回はスッキリさを重視したつもりですがいかがでしょうか。。

ここまでお読みいただき、ありがとうございました。

#2021/07/23 追記
MAMPでも環境構築をすることができました。LocalとMAMPを同時に開くことはないですし、
なによりphpMyAdminに触れたことに感激しております。適材適所で使用していきます。
ActiveModel::UnknownAttributeError: unknown attribute 'password' for StaffMember.

bin/rails db:migrateコマンドを入力するとターミナルで以下のようなエラー文が。

```
Creating staff_members....
rails aborted!
ActiveModel::UnknownAttributeError: unknown attribute 'password' for StaffMember.
```

StaffMemberのpasswordが存在しないよと仰ってます。
最初にmigrationファイルを疑ってかかるも、passwordに関する記述は間違っていませんでした。続いてモデルを見に行くことに。

```staff_member.rb
class StaffMember < ApplicationRecord
  include EmailHolder
  include PersonalNameHolder
  has_many :events, class_name:"StaffEvent", dependent: :destroy

  
  
  validates :start_date ,presence: true , date:{
    after_or_equal_to: Date.new(2000,1,1),
    before: -> (obj) { 1.year.from_now.to_date },
    allow_blank: true
  }
  validates :end_date, date: {
    after: :start_date,
    before: -> (obj) { 1.year.from_now.to_date },
    allow_blank: true
  }
  
  def active?
    !suspended && start_date <= Date.today &&
      (end_date.nil? || end_date > Date.today)
  end
end
```
PasswordHolderというmoduleを継承していないことが判明しました。

```staff_member.rb
class StaffMember < ApplicationRecord
  include EmailHolder
  include PersonalNameHolder
  include PasswordHolder            <=ここを追記
  has_many :events, class_name:"StaffEvent", dependent: :destroy

  
  
  validates :start_date ,presence: true , date:{
    after_or_equal_to: Date.new(2000,1,1),
    before: -> (obj) { 1.year.from_now.to_date },
    allow_blank: true
  }
  validates :end_date, date: {
    after: :start_date,
    before: -> (obj) { 1.year.from_now.to_date },
    allow_blank: true
  }
  
  def active?
    !suspended && start_date <= Date.today &&
      (end_date.nil? || end_date > Date.today)
  end
end
```

エラーが解消しました。


```ターミナル
bash-4.4$ bin/rails db:reset
Dropped database 'baukis2_development'
Dropped database 'baukis2_test'
Created database 'baukis2_development'
Created database 'baukis2_test'
Creating staff_members....
Creating administrators....
Creating staff_events....
Creating customers....
bash-4.4$ 
```
Dart: MariaDB のデータを削除 (Delete)

```dart:maria_delete.dart
/*
	maria_delete.dart

					Feb/14/2021
*/
// -------------------------------------------------------------
import 'dart:io'; 
import 'dart:async';
import 'package:mysql1/mysql1.dart';

// -------------------------------------------------------------
Future main(List<String> arguments) async {
	stderr.writeln ("*** 開始 ***");

	String key = '${arguments[0]}';

	print (key);

	final conn = await MySqlConnection.connect(ConnectionSettings(
		host: 'localhost', 
		port: 3306,
		user: 'scott',
		password: 'tiger123',
		db: 'city'
	));

	await conn.query('delete FROM cities where id = "' + key + '"');

	await conn.close();

	stderr.writeln ("*** 終了 ***");
}

// -------------------------------------------------------------
```

実行コマンド

```bash
dart maria_delete.dart t3323
```
【Ruby】行単位、列単位で合計値を求めるプログラムを作ってみた！

[アウトプットのネタに困ったらこれ！？](https://blog.jnito.com/entry/2019/05/03/121235)
　上記の記事で出題してある、「行単位、列単位で合計値を求めるプログラム」の問題を解いてみました。「minitest」もしくは「Rspec」を用いた実装を求められているのかもしれませんが、一旦そこは後回しにすることにしました。

|   | col1 | col2 | col3 | col4 | sum
| :--- | :--- | :-- | :---- | :---- | :----
| row1 | 9 | 85 | 92 | 20 | 206
| row2 | 68 | 25 | 80 | 55 | 228
| row3 | 43 | 96 | 71 | 73 | 283
| row4 | 43 | 19 | 20 | 87 | 169
| row5 | 95 | 66 | 73 | 62 | 296
| sum | 258 | 291 | 336 | 297 | 1182


[「Ruby力向上のための基礎トレーニング」をテストコード付きで解いてみた](https://qiita.com/jnchito/items/2fedbfa9f887635e6c6a)
　この上記の記事で紹介されているような「module」を使った実装を理解するにはまだまだ知識が不足していたため、ひとまず行と列の数字はランダムに出力されて、以下のような出力結果になるプログラムを作ればいいという考えで問題を解くことにしました。

```
  89|  75|  55|  78| 297|
  79|  67|   4|  29| 179|
  75|  59|  57|  73| 264|
  48|  29|  14|  78| 169|
  66|  47|  16|  17| 146|
 291| 230| 130| 258| 909|
```


　リファクタリングの余地は大いにありますが、初めはあまり時間をかけずに、このようなコードで意図した出力結果を得られるようになりました。

```ruby
def sum_matrix
  num = (0..99).to_a
  input = []
  5.times do
    row = num.sample(4)
    row_sum = row.sum
    input << row
    row.insert(4,row_sum)
  end

  col_sum = []
  5.times do |count|
    col_sum << input[0][count] + input[1][count] + input[2][count] + input[3][count]
  end
  input << col_sum

  6.times do |count|
    5.times do |num|
      printf("%4d", input[count][num])
      print "|"
    end
    puts "\n"
  end
end

sum_matrix
```

　繰り返し処理を頻繁に利用しているところは美しくないですね。コメントをいただけるととても勉強になります。


<br>
Dart: MariaDB のデータを更新 (Update)

```dart:maria_update.dart
/*
	maria_delete.dart

					Feb/14/2021
*/
// -------------------------------------------------------------
import 'dart:io'; 
import 'dart:async';
import 'package:mysql1/mysql1.dart';

// -------------------------------------------------------------
Future main(List<String> arguments) async {
	stderr.writeln ("*** 開始 ***");

	String key = '${arguments[0]}';
	int population = int.parse ('${arguments[1]}');

	print (key + '\t' + population.toString ());

	final conn = await MySqlConnection.connect(ConnectionSettings(
		host: 'localhost', 
		port: 3306,
		user: 'scott',
		password: 'tiger123',
		db: 'city'
	));

	var today = new DateTime.now();
	var date_mod = today.toString ();
	print (date_mod);

	await conn.query('update cities set population = ' + population.toString () + ', date_mod ="' + date_mod + '" where id = "' + key + '"');

	await conn.close();

	stderr.writeln ("*** 終了 ***");
}

// -------------------------------------------------------------
```

実行コマンド

```bash
dart maria_update.dart t3322 9154200
```
Dart: MariaDB のデータを読む (Read)

```dart:maria_read.dart
/*
	maria_read.dart

					Feb/13/2021
*/
// -------------------------------------------------------------
import 'dart:io'; 
import 'dart:async';
import 'package:mysql1/mysql1.dart';

// -------------------------------------------------------------
Future main() async {
	stderr.writeln ("*** 開始 ***");

final conn = await MySqlConnection.connect(ConnectionSettings(
	host: 'localhost', 
	port: 3306,
	user: 'scott',
	password: 'tiger123',
	db: 'city'
));

var results = await conn.query('SELECT * FROM cities');

for (var row in results) {
	print('${row[0]}\t${row[1]}\t${row[2]}\t${row[3]}');
	}

	await conn.close();

	stderr.writeln ("*** 終了 ***");
}

// -------------------------------------------------------------
```

実行コマンド

```bash
dart maria_read.dart
```
Dart: MariaDB  のデータを作成 (Create)

参考ページ
[mysql1 0.19.2](https://pub.dev/packages/mysql1/example)

```dart:maria_create.dart
/*
	maria_create.dart

					Feb/14/2021
*/
// -------------------------------------------------------------
import 'dart:io'; 
import 'dart:async';
import 'package:mysql1/mysql1.dart';

// -------------------------------------------------------------
Future main() async {
	stderr.writeln ("*** 開始 ***");

	final conn = await MySqlConnection.connect(ConnectionSettings(
		host: 'localhost', 
		port: 3306,
		user: 'scott',
		password: 'tiger123',
		db: 'city'
	));

	await conn.query('drop table if exists cities');

	await conn.query(
		'CREATE TABLE cities (id varchar(10) primary key, name varchar(20),'
		+ ' population int, date_mod date)');

	var result = await conn.query(
	'insert into cities (id, name, population, date_mod) values (?, ?, ?, ?)',
	['t3321', '岡山', 25871, '1957-3-20']);

	result = await conn.query(
	'insert into cities (id, name, population, date_mod) values (?, ?, ?, ?)',
	['t3322', '倉敷', 84796, '1957-5-14']);

	result = await conn.query(
	'insert into cities (id, name, population, date_mod) values (?, ?, ?, ?)',
	['t3323', '津山', 46125, '1957-7-8']);

	result = await conn.query(
	'insert into cities (id, name, population, date_mod) values (?, ?, ?, ?)',
	['t3324', '玉野', 18276, '1957-8-18']);

	result = await conn.query(
	'insert into cities (id, name, population, date_mod) values (?, ?, ?, ?)',
	['t3325', '笠岡', 69137, '1957-9-24']);

	await conn.close();

	stderr.writeln ("*** 終了 ***");
}

// -------------------------------------------------------------
```

実行コマンド

```bash
dart maria_create.dart
```

次のバージョンで確認しました。

```text
$ dart --version
Dart SDK version: 2.13.4 (stable) (Wed Jun 23 13:08:41 2021 +0200) on "linux_x64"
```

関連情報
[Dart: MariaDB のデータを読む (Read)](https://qiita.com/ekzemplaro/items/941be573d37a86c5d152)
[Dart: MariaDB のデータを更新 (Update)](https://qiita.com/ekzemplaro/items/69f37406b2fba2755961)
[Dart: MariaDB のデータを削除 (Delete)](https://qiita.com/ekzemplaro/items/4c7a6fb0f69ea90067f7)
vue3 の reactive による Proxy問題

##1.reactive を使用した際に、起こった問題

``vue3`` になって、オブジェクトを ``reactive`` に入れるだけで、リアクティブになる。
``vue2`` では、``Vue.set`` を使うシーンがあったのに比べて、ひどくシンプルになって最高。
しかし、何も考えずに ``reactive`` にしてはいけないパターンがある。

##2.比較時の問題
``Pure Object`` とでもいうべき、``reactive`` でないオブジェクトと比べようとすると上手くいかない。

```foo.ts
const foo = { bar: {} }
const foo2 = { baz: "hoge" }
const foo_reactive = reactive(foo)
foo.bar = foo2
foo_reactive.bar = foo2

console.log(foo.bar === foo2) /// true
console.log(foo_reactive.bar === foo2) /// false
console.log(foo.bar === foo_reactive.bar) /// false
```


普通に考えれば、``reactive`` を通したオブジェクトなので別の実体であることは明らか。

なのだが、外部JSON 等のデータから取得して ``reactive`` なオブジェクトに格納した後で、
もとのデータと比較してしまうことがあり、 ``true`` が帰ってこない謎がなかなか解けなかった。
``foo_reactive.bar`` というようにアクセスできてしまうのも、別オブジェクトである実感が持てず謎を呼ぶ要因となっているように思う。
（実際は、``Proxy`` オブジェクトになっている）


なので、``isEqual`` みたいなメソッドを作らざるを得なくなった。
大量の型の違うオブジェクトがあると、その度に作らないといけないのは非効率すぎる。

ここで重要なのは、それは **``reactive`` でないといけないのか**、ということである。
``computed`` でリアクティブ性が保たれるのであれば、``reactive`` にする必要性はない。
``vue3`` ではリアクティブ性に対する視点（必要か否か）での設計は、必要不可欠だ。
（当たり前の事だが実装を優先ぎみにすると忘れがちになりそう）


##3.シリアライズ問題
``IndexedDb`` でユーザーの情報を保存しようとしたときに発覚した。

```foo.ts
// IndexedDbについての記述は省略
// objectStore はオープンしたDBのオブジェクトストア
const foo = { bar: "hogehoge" }
objectStore.add(foo)  // Ok

const foo_reactive = reactive(foo)
objectStore.add(foo_reactive)  // Bad!!! #<Object> could not be cloned.
```


``reactive`` なオブジェクトをそのまま ``put`` ないし ``add`` してはいけない。
``Proxy`` オブジェクトになっているため、シリアライズできない。

じゃあ、``Pure Object`` に変換するメソッドを作るか・・・
という力技に出てはいけない。
オブジェクトの中にオブジェクトがあると、その中のオブジェクトも``Pure Object`` に変換するメソッドが・・・となってしまう。
これも上記同様、``computed`` ですまないかを考える必要がある。
シリアライズできない問題は、``IndexedDb``問わず多くありそうなので、こちらは忘れないようにしたい。
SQLでの年度と四半期の変換方法(SQLserver)

SQLで年度や四半期を変換することがある。
それをStored Functionで開発したので備忘録として置いておく

1.4月始まり翌年3月末で年度が切り替わる場合

```sql: fiscal_years.sql
CREATE FUNCTION [dbo].[fiscalyear]( @Date datetime2)
RETURNS int
AS
BEGIN
	declare @inneryear int;
	if( month(@Date) between 4  and 12)
	 set @inneryear = year(@Date)
    if( month(@Date) between 1  and 3 )
	 set @inneryear = year(@Date)-1
		return @inneryear
END
GO
```
1月から3月を一年前にずらしてやればいい。

2.上記の場合で第一四半期から第四四半期まで分類する場合
```sql: quarterpart
CREATE FUNCTION [dbo].[quarterpart]( @Date datetime2)
RETURNS int
AS
BEGIN
	declare @innerquarter int;
	if( month(@Date) between 1  and 3) set @innerquarter= 4
        if(month(@Date) between 4  and 6)  set @innerquarter=  1
        if(month(@Date) between 7  and 9)  set @innerquarter=  2
        if(month(@Date) between 10 and 12) set @innerquarter=  3
		return @innerquarter
END
GO
```
ここでintを返すようにしているのは後々にOrder byで利用できるようにするため

3.四半期を漢字で返す場合
```sql:quarterpart_hanji
CREATE FUNCTION [dbo].[quarterpart_hanji]( @Date datetime2)
RETURNS char(18)
AS
BEGIN
	declare @qparthanzi char(2);
		if (dbo.quarterpart(@Date)=4)  set @qparthanzi =  '肆'
        if (dbo.quarterpart(@Date)=1)  set @qparthanzi =   '壱'
        if (dbo.quarterpart(@Date)=2)  set @qparthanzi =   '弐'
        if (dbo.quarterpart(@Date)=3)  set @qparthanzi =   '参'
	return cast(dbo.fiscalyear(@Date) as char(4)) + '年度第' + @qparthanzi + '四半期'
END
GO
```
ただし、これはorder by、pivotで使えないので完全に表示用である。
今回はスカラー値関数で実装したがこれはselect句内で使えるようにするためである。
実際はこの三つをまとめて運用する羽目になるだろうが
JavaScriptを基本からまとめてみた【1】【DOM】【随時更新】

##はじめに

####学習するに至った経緯

2020年より、未経験からエンジニアへの転職を目指し、某プログラミングスクールへ通う。
入学後、『Ruby』を未経験から学ぶ人が多いのと『Ruby』の求人が思っていた以上に少ないので、
卒業後、フロントエンドのエンジニアを目指す事に。
Javascriptの学習した事を言語化し、認識の深化による備忘録として記載。

##DOMとは
Document Object Model」の略。直訳すると、「ドキュメントを物として扱うモデル」。
JavaScriptでhtmlの要素を操作するための仕組みのこと。htmlなどを解釈し、木構造で表現したもの。
JavaScriptからHTMLドキュメントを操作するためのAPI（インターフェイス）。
##DOMの特徴
① ツリー構造とも呼ばれる階層構造を取る。
② それぞれノードという言葉で説明される。
③ WEBページとJavaScriptなどのプログラミング言語とを繋ぐ。

基本的にDOMを追加していく場合は、

・document.elementById: (id要素を指定)
・createElement: (要素を作成)
・textContent: (要素の中身を定義)
・appendChild: (親要素に追加する)
の四点セットの流れが必要です。




##参考サイト
[JavaScript初心者でもすぐわかる！DOMとは何か？]
(https://eng-entrance.com/what-is-dom)
[【JavaScript: ToDoリスト】table要素を理解してToDoを表示させる方法]
(https://ina-yona-mochiko.com/programming/javascript/todolist-table/)
BH3 RTC設定シーケンス 

####BH3(産業用RaspberryPi)のRTC設定シーケンスについて説明します。
#### OS 起動時(/usr/local/sbin/set-rtc)
1. RTC の I2C 接続を初期化します
2. RTC 時刻をシステム時刻に設定します
3. 2.の実行結果が失敗の場合、fake-hwclock を利用して前回のシャットダウン時
刻をシステム時刻に設定します。

####ネットワーク接続時と毎時 30 分(1 時間毎))に実行(/etc/network/if-up.d/ntpdate)
1. 重複起動をチェックします(既に起動中の場合は処理を停止)
2. 20 秒間待機します(ネットワーク接続直後は ntpdate が失敗しやすいため)
3. /usr/sbin/ntpdate-debian コマンドを実行し、ネットワーク経由でシステム時刻を
設定します
4. 3. の実行結果が成功の場合、システム時刻を RTC 時刻に設定します
5. 3. の実行結果が成功の場合、10 分間待機します。
(ntpdate が連続して実行されるのを防ぐため)

ntpdate の実行間隔は次のファイルで変更可能です。
（毎時 30 分(1 時間毎)の場合）

```
$ vi /etc/cron.d/ntpdate
30 * * * * root /etc/network/if-up.d/ntpdate > /dev/null 2>&1
```

NTP サーバーを指定する場合は次のファイルを修正します。

```
$ vi /etc/default/ntpdate
NTPSERVERS="ntp.nict.jp ntp.jst.mfeed.ad.jp ntp.ring.gr.jp"
```

手動で nptdate を実行し、システム時刻を RTC に設定する場合は次のコマンドを
実行します。

```
$ sudo /usr/sbin/ntpdate-debian
$ sudo hwclock -w
```

ネットワークに接続しない場合や ntpdate を利用してシステム時刻を合わせる必要
がない場合は次のファイルを削除します。

```
/etc/cron.d/ntpdate
/etc/network/if-up.d/ntpdate
```

任意の時刻を RTC に設定する場合は次のコマンドを実行します。

```
$ sudo date -s '時刻(例: 2015-06-19 00:00:00)'
$ sudo hwclock -w
```

RTC 時刻を表示する場合は次のコマンドを実行します。

```
$ sudo hwclock -r
```

RTC 時刻をシステム時刻に設定する場合は次のコマンドを実行します。

```
$ sudo hwclock -s
```

|![DSCF0562.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1590352/11703a7d-236a-06ec-1487-382bea07e717.jpeg)
|:--:|
| ビズライト・テクノロジー社製BH3

BHシリーズは、株式会社ビズライト・テクノロジーが開発・生産する、シングルボードコンピュータの実用化した商品です。BHシリーズではRaspberryPiを産業利用するための対策が施されています。詳しくは、[こちら](http://bh.bizright.co.jp/)をご覧ください。
BH3 ウォッチドッグタイマーのセットアップ

####BH3(産業用RaspberryPi)のウォッチドッグタイマーのセットアップ方法について説明します。

セットアップツールを利用した場合、次のコマンドを実行してウォッチドッグタイマーを有効化しています。watchdog のプログラムをインストールして設定ファイルを変更し、OS 起動時にbcm2835_wdt モジュール(Raspbian 4.3 以上の場合)を自動的にロードします。

```
$ sudo apt-get install watchdog
$ sudo vi /etc/default/watchdog
変更前: watchdog_module="none"
変更後(Raspbian 4.3 以上の場合): watchdog_module=" bcm2835_wdt "
```
```
$ sudo vi /etc/watchdog.conf
変更前: 
#max-load-1= 24 
#watchdog-device = /dev/watchdog
変更後:
max-load-1= 24
watchdog-device = /dev/watchdog
watchdog-timeout = 10
```
```
$ sudo vi /etc/modules
最終行に追加(Raspbian 4.3 以上の場合): bcm2835_wdt
```
```
$ sudo vi /lib/systemd/system/watchdog.service
最終行に追加(ファイル内の[Install]の下に追加)
WantedBy=multi-user.target

$ sudo update-rc.d watchdog enable
$ sudo reboot
```

|![DSCF0562.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1590352/cfb8235c-9519-734c-e0ee-d95a4613bd4d.jpeg)
|:--:|
| ビズライト・テクノロジー社製BH3

BHシリーズは、株式会社ビズライト・テクノロジーが開発・生産する、シングルボードコンピュータの実用化した商品です。BHシリーズではRaspberryPiを産業利用するための対策が施されています。詳しくは、[こちら](http://bh.bizright.co.jp/)をご覧ください。
BH3 高速シャットダウンシーケンス

####BH3(産業用RaspberryPi)の高速シャットダウンシーケンスについて説明します。


1. BH3 の電源切断時に GPIO の 23 番（INPUT モード）が H レベル(1)から L レ
ベル(0)になります。
2. 常駐プログラム「/usr/local/sbin/shutdownSensor」が 1.の割り込みを受けて次
のスクリプトを実行します。
●/usr/local/sbin/fastshutdown
●/usr/local/sbin/__fastdown-function(fastshutdown から呼ばれます)

3. 開始時間をログに出力します。(高速シャットダウンの処理時間を計測するため)
出力先: /var/log/fastshutdown.log
　　Start time: (/proc/uptime の内容)
4. ディスプレイの信号を OFF にします。
5. /usr/local/sbin/system-stop-use-usb スクリプトを実行します。
(10 秒経過するとタイムアウトとなり、強制終了します)
6. USB コントローラの電源を OFF にします。(シャットダウン時の消費電力を減らすため、有線 LAN と USB に接続された機器を利用不可にします)
7. /usr/local/sbin/system-stop スクリプトを実行します。
(10 秒経過するとタイムアウトとなり、強制終了します)
8. 現在の時刻を保存します。
(RTC が接続されていない場合でも動作可能にするため)
9. 全てのプロセスを正常終了させます。
10. メモリ上のデータの内容を強制的にディスクに書き込みます。
11. 全てのプロセスを強制終了します。
12. 終了時間をログに出力します。(高速シャットダウンの処理時間を計測するため)
出力先: /var/log/fastshutdown.log
　　　End time: (/proc/uptime の内容)
13. メモリ上のデータの内容を強制的にディスクに書き込みます。
14. マウントされているすべてのファイルシステムを読み込み専用モードで再マウントします。
15. GPIO の 23 番（INPUT モード）が H レベル(1)の場合はシステムを再起動、L レ
ベル(0)の場合はシステムを停止します。(ユーザが誤って AC 電源を切ってしまい、シャットダウンプロセスが走り始めたのに AC 電源を復旧させたようなケースを想定)


高速シャットダウン時に任意のコマンド(独自に作成したプログラムなど)を実行したい場合は、次のスクリプトに任意のコマンドを追加します。
/usr/local/sbin/system-stop

任意のコマンド内でネットワークと通信する処理や USB を利用した処理(有線 LANや 無 線 LAN の利用 、 USB メモリへのファイル保存など ) を行う場合は「/usr/local/sbin/system-stop」に記述せずに次のスクリプトに任意のコマンドを追加します。
/usr/local/sbin/system-stop-use-usb

system-stop スクリプトと system-stop-use-usb スクリプトは 10 秒以内に処理を完了してください。10 秒経過するとタイムアウトとなり、強制終了します。タイムアウトの秒数は次のスクリプトで変更可能です。
/usr/local/sbin/__fastdown-function

```
timeout -s 9 /usr/local/sbin/system-stop-use-usb # 9はタイムアウトの秒数
timeout -s 9 /usr/local/sbin/system-stop         # 9タイムアウトの秒数
```

高速シャットダウン時に独自に作成したプログラム内でファイルのクローズ処理などを行う場合は、kill シグナルの割込みを受けてファイルのクローズ処理を行います。system-stop スクリプトまたは system-stop-use-usb スクリプトに killall コマンドなどを追加して、高速シャットダウン時に独自に作成したプログラムに対して kill シグナルが送られるようにします。
追加例:
/usr/local/sbin/system-stop

```
killall ＜独自に作成したプログラム名＞
```

OS 起動中に予期しないリセットが発生しないようにするため、常駐プログラム「/usr/local/sbin/shutdownSensor」の起動時(OS 起動時)に GPIO の 18 番(OUTモード)を H レベル(1)にし、シャットダウン完了までそのままの状態を保持しています。



|![DSCF0562.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1590352/f0306493-dc38-e1b4-d172-153e009690f3.jpeg)
|:--:|
| ビズライト・テクノロジー社製BH3


BHシリーズは、株式会社ビズライト・テクノロジーが開発・生産する、シングルボードコンピュータの実用化した商品です。BHシリーズではRaspberryPiを産業利用するための対策が施されています。詳しくは、[こちら](http://bh.bizright.co.jp/)をご覧ください。
コンソール接続

想定
Macにてルータやスイッチのコンソールポートに接続する状況下

シリアルポートを確認

```
ls /dev/tty.usb* 
/dev/tty.usbserial-FT0AHUA2
```

確認したポートに対してscreenコマンドで接続

```
screen /dev/tty.usbserial-FT0AHUA2

```

一つのシリアルポートしかなければ、こちらでもよい

```
screen `ls /dev/tty.usb*`
```

ルータに接続したら「exit」でも抜けられないため以下入力
Ctrl Aの入力後、Ctrl Dを入力する

```
Ctrl A + Ctrl D
```

アタッチしたままセッションを切った時に再接続する。

```
screen -r
```

プロセスの確認

```
(base) WatanabenoMacBook-puro:~ hiroki$ ps
  PID TTY           TIME CMD
64747 tty.usbserial-FT0AHUA2   0:00.11 SCREEN /dev/tty.usbserial-FT0AHUA2
74609 ttys000    0:00.03 -bash
```

プロセス削除と確認

```
(base) WatanabenoMacBook-puro:~ hiroki$ kill 64747
(base) WatanabenoMacBook-puro:~ hiroki$ ps
  PID TTY           TIME CMD
74609 ttys000    0:00.03 -bash
```
BH3 セットアップ

####RaspberryPiを産業用途として使用するために下記をセットアップします。

・電源切断による高速シャットダウン
・OS 起動時に RTC 時刻をシステム時刻に設定
・ntpdate を利用して現在時刻を取得し RTC 時刻に設定
　(設定タイミング: ネットワーク接続時、毎時 30 分(1 時間毎))
・ウォッチドッグタイマーの有効化

##### セットアップツールのダウンロード
http://dl.bizright.jp/bh/bh-tools-latest.tar.gz
（対応 OS: Raspbian Jessie 以上）

##### セットアップツールのインストールコマンド[^1]

```
$ curl -O http://dl.bizright.jp/bh/bh-tools-latest.tar.gz
$ tar xfvz bh-tools-latest.tar.gz
$ cd bh-tools
$ ./build （※Installation of BH tools completed.が表示されれば成功）
$ sudo reboot
```
[^1]: build ファイル内で git や apt-get を呼び出しているためインターネットに接続できる状態で実行します。

既にセットアップツールを導入済みの方でバージョンアップする場合もこちらのコマンドを実行します。

#### 一緒にインストールされるライブラリやパッケージ一覧
・Wiring Pi
・ntpdate
・watchdog
・upstart(systemd がインストールされていない場合にインストールされる)
・git(git がインストールされていない場合にインストールされる)

#### セットアップツールのアンインストール
```
$ cd bh-tools 　     # インストール時に利用したディレクトリに移動
$ ./build uninstall  # Uninstall of BH tools completed.が表示されれば成功
$ cd wiringPi
$ ./build uninstall  # 今後 Wiring Pi を利用しない場合
$ sudo apt-get -y remove ntpdate  # 今後 ntpdate を利用しない場合
$ sudo apt-get -y remove watchdog # 今後 watchdog を利用しない場合
$ sudo reboot -f
```
####セットアップツールでエラーが出てインストールできない場合
```
Error: WDT module is unknown.
```
上記のようなエラーが出てインストールが正常に行えない場合はを行った後、再度セットアップツールのインストールを行ってください。

```
$ apt-get update
$ apt-get upgrade
$ sudo reboot
```
|![DSCF0562.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1590352/7d9e53e2-c22b-53dd-74a3-4dc297d42f04.jpeg)
|:--:|
|ビズライト・テクノロジー社製BH3|
BHシリーズは、株式会社ビズライト・テクノロジーが開発・生産する、シングルボードコンピュータの実用化した商品です。BHシリーズではRaspberryPiを産業利用するための対策が施されています。詳しくは、[こちら](http://bh.bizright.co.jp/)をご覧ください。
Dockerfileで環境変数を仕込みつつRUNでファイルを生成する


## ファイル

```Dockerfile
FROM centos:centos7

ARG DOMAIN
RUN echo -e "\n\
AP_HOSTNAME=https://${DOMAIN}.vamdemic.xyz\n\
DB_HOSTNAME=${DOMAIN}-db\n\
DB_USERNAME=root\n\
DB_PASSWORD=password\n\
" >> /root/test

CMD ["/sbin/init"]
```

## ビルド
```bash
docker build -t test . --build-arg DOMAIN=aiueo
```

## ビルドされたファイル
```
 yuta  /  tmp  docker  docker exec -it be29d6b986db /bin/bash
[root@be29d6b986db /]#
[root@be29d6b986db /]# cat /root/test

AP_HOSTNAME=https://aiueo.vamdemic.xyz
DB_HOSTNAME=aiueo-db
DB_USERNAME=root
DB_PASSWORD=password

[root@be29d6b986db /]#

```
Nuxt.jsでaxiosじゃなくてhttpとやらでAPIコールしてみた

#背景
NuxtでWebアプリを一から立ち上げしていて、APIとのやりとりをコーディングすることになりました。
今まで触ってたVueとかNuxtでは、APIとのやりとりはaxiosしか使ったことがなかったんですが、httpという別のモジュールがあるということを知りました。
今後はこっちが主流になりそうみたいな記事も見かけたので、勉強がてら使ってみようと思います！

#前提
Nuxtのプロジェクトが構築されていること。

#準備
主にNuxtとnuxt/httpの公式サイトを見てやりました。
Nuxt
https://nuxtjs.org/docs/2.x/get-started/installation
nuxt/http
https://http.nuxtjs.org/

まずはnuxt/httpのインストール
https://http.nuxtjs.org/setup

```sh
npm i @nuxt/http
```

nuxtの設定に追記

```js:nuxt.config.js
export default {
  modules: ['@nuxt/http']
}
```

これだけで使えるようになります。超簡単。

#使い方
今回は情報取得用のAPIをコールします。
特にstoreに入れる必要はなかったのでasync-dataを採用しました。
https://nuxtjs.org/docs/2.x/features/data-fetching#async-data

/hoge というページでAPIをコールします。

```vue:pages/hoge.vue
<template>
  <div>
    {{ response }}
  </div>
</template>

<script>
export default {
  async asyncData({ $http }) {
    // APIコール
    const response = await $http.$get('https://hogehogeapi')
    return { response }
  },
}
</script>
```

こんな感じで書くとAPIで取得したデータを画面に表示することができました。


URLパラメータをAPIのパラメータとして使いたい場合は下のような感じ。

```vue:pages/posts/_id.vue
<template>
  <div>
    <h1>{{ post.title }}</h1>
    <p>{{ post.description }}</p>
  </div>
</template>

<script>
  export default {
    async asyncData({ params, $http }) {
      const post = await $http.$get(`https://api.nuxtjs.dev/posts/${params.id}`)
      return { post }
    }
  }
</script>
```

#最後に
めっちゃ簡単で、Nuxtやっぱいいなーと思いました。（Nuxt初心者感）
ほとんど公式に書いてあることを間引いて訳しただけですが、誰かの役に立てばこれ幸いです。
開発進めて他の使い方のパターンとか出てきたらまたアップデートしたいと思います。
Railsざっくりアプリケーション作成の流れ（MVC）

# アプリ作成の流れ（MVC）
### 雛形作成
```
$ rails new　　アプリ名

$ rails _6.0.0_ new アプリ名
#railsのバージョン指定　指定しなければ、インストールされているrailsのバージョンが指定される

$ rails new　　アプリ名 -d DB
#DBを指定したコマンド　　デフォルトはsqlite
```

### DB作成
`rails new`で新しくアプリケーション部分が作成されたので、次は、DBを作成する。


```ruby:DB作成コマンド
$ rails db:create
デフォルトでは、development（開発）にDBが作成される
$ rails db:create　RAILS_ENV=production
production（本番）にDBを作成したい場合はこのコマンド
```

## ルーティングの設定

ルーティングは、クライアントからのリクエストに対して、どう処理してやるのかの道標です。
app/config/routes.rbにルーティングを記載していきます。

```ruby:ルーティングの基本
Rails.application.routes.draw do
 (HTTPメソッド 'URIパターン', to: 'コントローラー名#アクション名')
 get "posts", to: "posts#index"
end
```

## コントローラーの作成
MVCの一つで、リクエストに対する処理を決める場所です。
`rails gコマンド`railsに必要なファイルを生成するためのコマンド

```
$ rails g "ファイルの種類"　"生成するファイル名"
```
コントローラーを作成する場合は、命名規則に気をつけて作成する必要があります。
コントローラー名は複数形で作成しなければなりません。

```
$ rails g controller posts
```
コントローラー名を間違えた場合は、

```
$ rails d controller posts
```
で作成したファイルを削除できるので、改名後に再度`rails g`してやります。

####コントローラーにアクションを定義する

- `index`	一覧表示ページを表示するリクエストに対応して動く
- `new`	新規投稿ページを表示するリクエストに対応して動く
- `create` データの投稿を行うリクエストに対応して動く
- `show`	個別詳細ページを表示するリクエストに対応して動く
- `edit`	投稿編集ページを表示するリクエストに対応して動く
- `update` データの編集を行うリクエストに対応して動く
- `destroy` データの削除を行うリクエストに対応して動く 

## ビューの作成

ERBを利用することで、HTMLファイルなどの異なるファイルにRubyの記述を埋め込むための仕組みのことで、`ファイル名.html.erb`内にRubyのコードを埋め込むことができるようになります。

## データベースとテーブル、モデル
データベースはアプリケーションで保存される様々なデータを保存する場所で、アプリケーションにはほぼ必須のものです。
データベースはデータを保存するところ、テーブルを使って目的別にデータを保存できるようにします。
テーブルには行（レコード）とカラム（列）が存在し、データを管理しています。
モデルはテーブルを管理するもので、データを保存したり、データを取得して画面上に表示するために必要なもので、テーブルごとにモデルは対応しています。

モデル作成するコマンドは

```
$ rails g model モデル名
```
で作成することができ、モデル名には命名規則があって、単数形を使用しなければなりません。

####マイグレーション

`rails g model`コマンドで作成されるファイルで、データベース（テーブル）の設計書・仕様書になります。
テーブルの使用をこのファイルに記載してデータベースに反映させることで、意図的なデータベースが作成できます。

postというモデルを作成した場合

```ruby:db/migrate/20XXXXXXXXXXXX_create_posts.rb
class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :posts do |t|
      t.text :memo
      t.timestamps
    end
  end
end
```

`t.text :memo`と記載することで、text型のメモカラムが作成できるようになります。
マイグレーションファイルを作成、定義したら、それを

```
$ rails db:migrate
```
コマンドを実行することで、マイグレーションをDBに反映させることができます。
マイグレーションファイルを修正する場合は、一度ロールバックをして、statusを`down`状態にしないといけません。

```
$ rails db:rollback

$ rails db:migrate:status
#このコマンドでマイグレーションファイルのstatus状況を確認することができます。
```

# ActiveRecordメソッド
ActiveRecordメソッドとは、モデルがテーブル操作を利用して使用できるメソッドの総称です。
ActiveRecordメソッドを利用することで、直感的にテーブルを操作することができるようになります。

ActiveRecordメソッドの例（all,findメソッド）

```ruby
 Post.all
 #postテーブルのすべての値を取得する
 Post.find(1)
 #postテーブルの１行目のレコードの値を取得する
```
Dialogflowで独自に販売のチャットボットを作成する-(第一部)

<!-- wp:paragraph -->
<p><strong>Dialogflowとは</strong><br>DialogflowはGoogleが提供するサービスです。Dialogflowの目的として開発者が会話を通じてユーザーと通信するプログラムを簡単に作成することができます。<br>Dialogflowはユーザーの意図が理解し、その意図に合った有用な情報を抽出する為に、人工知能（AI）で自然言語を分析します。まだかなり曖昧なので、この例を見てみましょう！</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Dialogflowと<strong>チャットボットデモ</strong></p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1120,"sizeSlug":"large","linkDestination":"none"} -->
<figure class="wp-block-image size-large"><img src="https://ints.vn/wp-content/uploads/2021/07/image-1.png" alt="" class="wp-image-1120"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>これはDialogflowができることです。Dialogflowは仮想アシスタントが作成し、顧客がWebサイトにアクセスした時にこの仮想アシスタントが顧客にアドバイスしたり、質問を回答したりすることを実施します。これは単なるチャットボットではなく、自然言語を読んで理解できる機能があるチャットボットです。それで、顧客はさまざまな質問しても設定したスクリプトに従って、すべて正しく理解して回答できます。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><strong>プロジェクトの初期化には</strong><br>まず、https://dialogflow.cloud.google.comにアクセスして、Gmailアカウントでログインする必要があります。次に、国を選択し、Googleの条件に同意します。最後に、新しい仮想アシスタントを作成するために[エージェントの作成]ボタンをクリックしてください。<br>次の部分では、以上の画像のようなDialogflowの仮想アシスタント（チャットボット）を構成する成分について詳しく検討しましょう。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph {"align":"right"} -->
<p class="has-text-align-right">（<a href="https://ints.vn">INTS株式会社</a>　開発部　ハイ・アン)　<a href="https://qiita.com/ints/items/327d8263701af2b1e9af" >第二部はこちらです。</a> </p>
<!-- /wp:paragraph -->
独学プログラマーのまとめ　その2

#初めに
読んだ後にまとめて記事にすると後々面倒なことがわかったので勉強とまとめる事を同時に行っていくことにした。
なのでより雑多な文になってしまう可能性があるが継続を重視する。

##1部

名言が各章の初めにあるようだ。
###2章　さあ、はじめよう!

- 良いプログラマーとは、一方通行の道を渡るときに両側を見るような人である。
   - 名言を一応メモ
- Pythonってなに？
   - オープンソースのプログラミング言語でGuidoさんが開発した。プログラマーがコードを書くことよりも読むことに時間を使っている点から読みやすい言語にしたようだ。


本の環境とは違うがJupyter Lab上でコードは書いていくことにする。


```python
#　2章チャレンジ問題　Hello, World!以外を表示させる
>>> print("Thank You!")
>> 'Thank You!'
```

###3章　プログラミング入門
自分に大事な点だけメモ

- インデントが大事
   - インデント(4つスペースで字下げ)が違うだけで構文エラー（Syntax Error）になってしまう。
- 算術演算子
    - **で累乗。
    - //で整数の割り算切り捨て。
- PEMDAS
    - 算術の優先順位の頭文字 Parentheses(カッコ),Exponent(累乗),Multiplication(かけ算),Division(わり算),Addition(足し算),Subtraction(引き算).
- 条件文
    -if文などの後ろに:をつけるのを忘れない。
 

# まとめ
とにかく    
**:(コロン）**
fig, ax = subplotsについて

# fig, ax = subplotsについて
## 目的図
富士下山問題にて
いつもpltを使用していたためグラフの数が膨大となるが、この様な表示に挑戦
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624434/70cf8260-0491-d1ba-6e3c-b5a46738c24e.png)

## やり方 コード
イメージはfigと名前をつけたキャンパスにaxと名前をつけた図を配列で書いていくイメージ  
figsize等は変更したほうが綺麗   
軸共有とかもっと綺麗にする方法は無限にありそうだけれども、視覚的にわかる様に今回は記載  
使い分け大事  

```python
fig, ax = plt.subplots(2, 3, figsize=(10,10))
ax[0, 0].plot(c_test1, p_test1)
ax[0, 1].plot(c_test2, p_test2)
ax[0, 2].plot(c_test3, p_test3)
ax[1, 0].plot(c_test4, p_test4)
ax[1, 1].plot(c_test5, p_test5)
ax[1, 2].axis('off') # 使用していない領域の削除

ax[0, 0].set_title("startpos = 50")
ax[0, 1].set_title("startpos = 100")
ax[0, 2].set_title("startpos = 150")
ax[1, 0].set_title("startpos = 200")
ax[1, 1].set_title("startpos = 250")

ax[0, 2].set_xlabel('count')
ax[1, 0].set_xlabel('count')
ax[1, 1].set_xlabel('count')

ax[0, 0].set_ylabel('position')
ax[1, 0].set_ylabel('position');
```
Cloud Functions + TypeScriptでserviceAccountの設定で詰まった時のとてもシンプルな対処法

### 結論：　ServiceAccountの型を付与する


```firebase.ts
import * as admin from 'firebase-admin';
import { ServiceAccount } from 'firebase-admin';
import serviceAccount from '../serviceAccountKey.json';

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount as ServiceAccount),
 // 上に記したように `ServiceAccount`の型を与える
});

export const firestore = admin.firestore();
```


---


型を与えないと下記のようなエラーが表示されます

```
Argument of type '{ type: string; project_id: string; private_key_id: string; private_key: string; client_email: string; client_id: string; auth_uri: string; token_uri: string; auth_provider_x509_cert_url: string; client_x509_cert_url: string; }' is not assignable to parameter of type 'string | ServiceAccount'.
  Type '{ type: string; project_id: string; private_key_id: string; private_key: string; client_email: string; client_id: string; auth_uri: string; token_uri: string; auth_provider_x509_cert_url: string; client_x509_cert_url: string; }' has no properties in common with type 'ServiceAccount'.
```


ソース：
https://github.com/firebase/firebase-admin-node/issues/522
https://firebase.google.com/docs/reference/admin/node/admin.ServiceAccount
【Flutter】アプリ終了しても設定した値をローカルに保存できるようにする方法

# 概要
スマホアプリで、いわゆる「設定画面」等を開発する際に、

- アプリを再起動したら、設定画面等で設定した値がデフォルトに戻ってしまって困る。
- アプリ内の各種設定値は、アプリを終了しても保持できるようにしたい。
- そして、それはサーバやクラウドの DB とかじゃなくて、スマホのローカルのどこかに保存して、次回アプリ起動時に設定した値を呼び戻すようにしたい。

そんな人のための備忘録。

設定の基本的な保存場所を提供するのは、iOS なら「UserDefaults」クラス, Android なら「SharedPreferences」などを使用します。

Flutter のパッケージには、この両方をラップしたような「[shared_preferences](https://pub.dev/packages/shared_preferences)」という公式プラグインがあり、これを使用すれば、簡単に設定保存を実装できます。

# 導入

ルートディレクトリでインストールコマンド実行し、最新のパッケージを導入

```bash
# インストールコマンド
flutter pub add shared_preferences
```

`pubspec.yaml` でインストール完了とバージョンを確認しとく。

# 使い方

設定を扱う .dart ファイルに以下のインポート文を追記

```dart
import 'package:shared_preferences/shared_preferences.dart';
```

`.getXxx()`, `.setXxx()` を使用して、どこかで以下のような処理を追加する ("Xxx" は変数型によって様々。詳細は[公式](https://pub.dev/packages/shared_preferences)の仕様を参照)
尚、以下のメソッド名はテキトーです。

```dart
// 設定値を取得
void _readSetting() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  int counter = (prefs.getInt('counter') ?? 0) + 1;
  String name = prefs.getString('name') ?? '';
  bool isSelected = prefs.getBool('isSelected') ?? false;
}

// 設定値を保存
void _saveSetting() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  await prefs.setInt('counter', 777);
  await prefs.setString('name', 'Yamada');
  await prefs.setBool('isSelected', true);
}

// 設定値を削除
void _deleteSetting() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  // 型に関係なくキー名を指定するだけ
  await prefs.remove('counter');
  await prefs.remove('name');
  await prefs.remove('isSelected');
}

```

`.getXxx()` は、設定値が存在しない場合は Null を返す可能性があるため、 `??` 演算子を用いて右項に初期値を設定

# 補足：テストをする際は
（※テストコードを書いてテストしてない人は、参照不要です）

以下の処理で、テスト用の設定値を与えることができます。

```dart
SharedPreferences.setMockInitialValues(Map<String, dynamic> values);
```

`values` に初期値を与えることで、その状態での単体テストが可能です。


# ちょっと気をつけた方が良いこと

「ローカル」内にファイルや何かデータを作成するということは、一度作ったらユーザの端末にデータが残り続けやすいということになります。
なので、安易に不要な保存処理をボコボコ量産すると、不要なパラメータを削除メソッドでうまく削除するロジックにしたり、根本的な解消を行うバージョンアップを行うまでは、長期間にわたってユーザの端末内にゴミデータが残り続ける可能性があるということも考えておく必要があります。

つまり、「どのような設定内容を、どのように保持するのか」の設計は、少し慎重に行った方が良いかと個人的には思います。
Laravel 8 と Laravel Breeze をインストールして、TailwindCSS の JIT 環境を整える

`Laravel 8` と `Laravel Breeze` をインストールする開発環境で、Tailwind の JIT 環境を使えるようにする記事です。1から順に、手順を見ていきましょう (=ﾟωﾟ)ﾉ

### １，素の Laravel をインストールして、プロジェクトルートに移動

```command:コマンド
laravel new laravel_pro

cd laravel_pro
```

### ２，.envファイルのデータベース設定をして、マイグレーションを実行

`.env` ファイルを開いてデータベースの接続設定をして、マイグレーションを実行しましょう。

```command:コマンド
php artisan migrate
```

### ３、Laravel Breeze をインストール

```command:コマンド
composer require laravel/breeze --dev
```

### ４，Laravel Breeze のリソース公開をする

```command:コマンド
php artisan breeze:install
```

### ５、npm で必要なパッケージをインストールした後に、アセットをコンパイル

```command:コマンド
npm install
npm run dev
php artisan migrate
```

### ６、「tailwind.config.js」 を開いて編集する

プロジェクトルートにある `tailwind.config.js` を編集します。編集箇所を以下のように「＋」の箇所で表しています。

```diff:tailwind.config.js
const defaultTheme = require('tailwindcss/defaultTheme');

module.exports = {
+   mode: 'jit',
    purge: [
        './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
        './storage/framework/views/*.php',
        './resources/views/**/*.blade.php',
+       './resources/views/*.blade.php',
    ],

    theme: {
        extend: {
            fontFamily: {
                sans: ['Nunito', ...defaultTheme.fontFamily.sans],
            },
        },
    },

    variants: {
        extend: {
            opacity: ['disabled'],
        },
    },

    plugins: [require('@tailwindcss/forms')],
};

```

### ７，「webpack.mix.js」を編集する

プロジェクトルートにある `webpack.mix.js` を編集します。編集箇所を以下のように「＋」と「-」の箇所で表しています。

```diff:webpack.mix.js
const mix = require('laravel-mix');

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel applications. By default, we are compiling the CSS
 | file for the application as well as bundling up all the JS files.
 |
 */

mix
    .js('resources/js/app.js', 'public/js')
    .postCss('resources/css/app.css', 'public/css', [
        require('postcss-import'),
        require('tailwindcss'),
        require('autoprefixer'),
-   ]);
+   ])
+   .version()
+   .disableNotifications();
```

ご覧のとおり `version` メソッドと `disableNotifications` メソッドを追加するだけです。

### ８，「asset(～)」の部分を「mix(～)」に変更する

`webpack.mix.js`を編集した際に、ブラウザのキャッシュ対策のために、`version` メソッドを使用し、CSSとJSをバージョン管理するように設定しました。なので blade ファイル側では、mix関数を使用しコンパイルされた最新バージョンのCSSとJSと読み込みます。`/resources/views/layouts/app.blade.php` と `/resources/views/layouts/guest.blade.php` ファイルを開いて `<head>`タグ内にある、CSSとJSの読み込み部分のコードを `asset` 関数から、`mix` 関数に変更してください。

```html
<!-- Styles -->
<link rel="stylesheet" href="{{ mix('css/app.css') }}">

<!-- Scripts -->
<script src="{{ mix('js/app.js') }}" defer></script>
```

### ９，コマンドで「npm run watch」を実行する

`npm run watch` コマンドを打ち込んでみましょう。blade ファイル内に Tailwind 関連のクラス名を入力して保存すると、**自動的にCSSのコンパイルが開始されます。**

```
$ npm run watch
```

### １０，ブラウザで確認する。

blade ファイルを保存して、自動コンパイルされたCSSを確認するためにブラウザで確認してましょう(=ﾟωﾟ)ﾉ
WSL2にraspberry piのクロスコンパイル環境をインストールする

ほぼ[このネット記事の手順](https://www.radical-dreamer.com/programming/raspberry-cross-c-for-win/)通りでオッケーだが、以下のコマンドでエラーになったので
対処方法を記載する。

この対処方法がベストかどうかは分からない。

失敗したコマンド `sudo apt install binutils-arm-linux-gnueabihf clang`
「clangがインストールできない」（みつからない？）旨のエラーが出た。


[このサイト](https://apt.llvm.org/)を参考にし、次のコマンドを実行した。`
sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"`

その後、再度、`sudo apt install binutils-arm-linux-gnueabihf clang`を実行すると正常に終了した。で、WSL2のubuntu上でビルドしたhelloworldのa.outをscpでラズパイ4にコピーし、ラズパイ4上で実行して、標準出力に`Hello World!`と表示された。
pipのインストール先変更

#背景

python本体はインストーラー実行時に場所を指定するので良いのだけど。
pip installしたpackageはどこへ入っていくのだろうと気になったので調べた。

#結論
pip installしたpackageは本体インストール場所にあるPython39\Lib\site-packagesに格納されるようだ。
別の場所にインストールしたければ、--prefixオプションでLib\site-packagesを作るディレクトリを指定する必要がある。ただし、この場合にはpythonがpackageの格納場所がわからなくなるので、環境変数PYTHONPATHでLib\site-packagesまでを通してあげる必要がある。

#pakageのインストール場所の調べ方
```python:インストールしたpakage一覧を見る
pip list
```
```python:pakageのインストール先を見る 
pip show <Package-name>
```
ReactでTech Blogを作成

# はじめに
### このアプリの作成を通して、以下の技術を身につけることを目的としている
- TypeScript+React+Reduxの構成でアプリケーションを開発するスキル
- ReduxToolkitを用いた状態遷移機能の実装スキル
- TODOアプリよりも少しリッチなCRUD機能の実装スキル
- ページ遷移機能の実装スキル
- バックエンドとのAPI連携スキル（JSONServer）


## 完成イメージ
##### 管理者ページ
![Screen Shot 2021-07-07 at 16.34.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/825163/2f427b3d-56ef-46fa-78c3-566e14d294db.png)
![Screen Shot 2021-07-07 at 16.34.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/825163/5817ebc2-e5c9-9501-c010-b3b1c7c408f5.png)
![Screen Shot 2021-07-07 at 16.38.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/825163/4922e334-d659-01ab-aaf4-4d8b655ba15f.png)

##### 一般ユーザーページ
注）新規投稿ボタンがあるのはヘッダーを管理者ページと使いまわしているからであり、今後の拡張時にfirebaseを用いた認証で、条件分岐させて表示させないようにする事を前提としている未完成アプリである事をご了承ください。
![Screen Shot 2021-07-07 at 17.19.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/825163/de8a0e34-9025-401b-58a6-96959846a69e.png)


## 主な使用技術
- React
- TypeScript
- Redux Toolkit
- Chakra-UI　（モーダル部分）
- Material-UI　（テーブルとカード部分）
- styled-components　（スタイル全盤）
- react-markdown
- JSONServer


## 仕様について
- 一般ユーザ
    - 記事一覧（R）
    - 記事詳細（R）
    - いいねボタン（U）
- 管理者
    - 新規投稿（C）
    - 記事一覧（R）
    - 記事詳細（R）
    - 投稿編集（U）
    - 投稿削除（D）


## 苦労した点
当初はslice内でのinitialStateになにを持たせれば良いのか良く分かっておらず、postsしか持たせて居いなかった為、JSONServerにアクセスした後に取得したデータをうまく処理できずに詰まってしまった。しかし、やっている事はシンプルなTODOアプリと基本的な動作の流れは同じ事だと初心に戻り、TODOアプリを作っている参考サイトのstateを参考とする事で乗り越えた。

https://www.youtube.com/watch?v=0ApD0MKXT6I


## 前回から成長した点
1. any型に簡単に逃げなくなった。以前作成していたお天気アプリでは、まだ型の理解が進んでおらずアプリの完成を目指すためにanyを多用し逃げ切った部分があった。しかし、今回はpropsでのデータの受け渡しの際に頻発するエラーとしっかり向き合ってみた際に理解が進んだ気がする。
1. useSateをやuseEffectを使う機会が何度もあった為、あやふやだった使い方が結果的に成長した。
1. 今回は全てのスタイルをstyled-componentsで整え、レスポンシブ対応も含めてcssの整え方に慣れてきた。

## styled-componentsの便利だった機能
1. Material-UIのdefaultのスタイルを簡単にオリジナルに変更できた点。
1. ボタンをコンポーネント化し新規作成、保存、編集ボタンに使いまわした。文字や色などをpropsとして受け渡すことで、デザインに統一性を持たせたり、少しだけコードの記述量を減らせた。

## 今後の課題
現時点ではJSONServerを用いたモックアプリでしかなく実用性が皆無状態なので、将来的にはfirebaseを導入する事を考えている。


- Firestoreでデータの管理
- ログインページの追加　firebaseで認証管理
- Firebase Hostingによるデプロイ

> [JSONServerの使い方](https://blog.codecamp.jp/json-server-beginner)

## まとめ
どんなアプリでも基本的に最低限必要となってくるCRUD機能を、Redux Toolkitを用いて自力で実装することができるようになった事で少し自信をつことが出来た。
どの分野でもそうだが慣れと経験が解決してくれる部分がとても大きいので、たくさんのアプリ作りながら学ぶことの重要性を改めて感じることが出来た。
Databricks（Spark）にてScalaの関数で取得可能なDDL文字列をPythonで取得する方法

## 概要
Databricks（Spark）にてScalaの関数で取得可能なDDL文字列をPythonで取得する方法を共有します。
DDL文字列を取得するにはScalaの関数を利用する必要があり、Py4J経由で利用可能でした。


詳細は下記のGithub pagesのページをご確認ください。

https://manabian-.github.io/databricks_tecks_for_qiita/#get_ddl_string_by_scala_function/get_ddl_string_by_scala_function.html

コードを実行したい方は、下記のdbcファイルを取り込んでください。

https://github.com/manabian-/databricks_tecks_for_qiita/blob/main/tecks/get_ddl_string_by_scala_function/dbc/get_ddl_string_by_scala_function.dbc


## 検証環境
databricks runtime: 8.1.x-scala2.12
Python  version:    3.8.8
pyspark version:    3.1.1.dev0

## 実施手順
### PythonからScalaの関数をPy4j経由で利用する方法

```python
json_data = df.schema.json()
 
schema = spark.sparkContext._jvm.org.apache.spark.sql.types.DataType.fromJson(json_data).toDDL()
 
schema
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3e4a14ef-3574-41e5-6a81-21059bda7f32.png)

## 関連記事
### ノートブックをGithub Pageによる共有方法
[Databricks（Azure Databricks）でGithub経由でノートブックを共有する方法 - Qiita](https://qiita.com/manabian/items/3d74c18136508e0ac971)

### Githubのファイルをインポートする手順
[DatabricksにてGithub上にあるdbcファイルのインポート方法について - Qiita](https://qiita.com/manabian/items/534b14396077f31fed90)
Azure Cloud Shell を活用した Azure Database for PostgreSQLのバックアップ、レストア方法

#はじめに
みなさまは Azure Cloud Shell を活用されてますか？
ブラウザ上でAzureのリソース設定などを行えるのでとても便利ですよね。
今回は、Azure Cloud Shellを活用して、Azure Database for PostgreSQL をバックアップ、レストアする方法について簡単にまとめました。

このエントリは公式リファレンス記載の、バックアップ、レストアをAzure Cloud Shell上で実行する手順として簡潔にまとめたものです

- Azure Cloud Shellへログイン
- バックアップ、レストア実行
- ファイルのダウンロード、アップロード

で整理しています。

https://docs.microsoft.com/ja-jp/azure/postgresql/howto-migrate-using-dump-and-restore


#Azure Cloud Shell を立ち上げる
Azure Cloud Shell を立ち上げるには、Azureの管理コンソールにて、`>_` アイコンをクリックします。

![CloudShellアイコン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27240/db8dfbdf-1137-2d7f-0b1e-228359915fb0.jpeg)

すぐにターミナル画面が立ち上がります。
※初めてAzure Cloud Shellを実行される場合、ファイル保存用のクラウドストレージの設定画面が表示されるので、デフォルト設定でOKしてください。
![CloudShellopen.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27240/b854e63c-bea6-f1df-0bd2-da97fee37a7c.jpeg)


#バックアップ、レストア
バックアップ、レストア作業は、対象のAzure Database for PostgreSQLへ、`pg_dump` コマンド、`pg_restore`コマンドを実行することで行います。

##バックアップ
###DBごと

```shell
pg_dump -Fc -v --host=[Azure Database for PostgreSQLのhost名] --port=5432 --username=[Azure Database for PostgreSQLのユーザ名] --dbname=[対象のDB名] > dbdump.sql
```

###テーブル指定

```shell
pg_dump -Fc -v --host=[Azure Database for PostgreSQLのhost名] --port=5432 --username=[Azure Database for PostgreSQLのユーザ名] --dbname=[対象のDB名] -t [対象のtable名] > restore_test_dmp.sql
```


##レストア
###DBごと

```shell
pg_restore -v --no-owner --host=[Azure Database for PostgreSQLのhost名] --port= 5432 --username=[Azure Database for PostgreSQLのユーザ名] --dbname=[対象のDB名] dbdump.sql
```

###テーブル指定

```shell
pg_restore -v --no-owner --host=[Azure Database for PostgreSQLのhost名] --port=5432 --username=[Azure Database for PostgreSQLのユーザ名] --dbname=[対象のDB名] -t [対象のtable名] restore_test_dmp.sql
```

#ダウンロード、アップロード

ファイルもAzure Cloud Shell上でアップロード、ダウンロード可能です。
CLIツール経由でストレージサービスへファイルをアップロード、ダウンロードする操作が必要ないのは便利ですね!

![Azure Shell上でのファイル操作.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27240/292aa1af-fe16-364a-7a51-d94a03342747.jpeg)


#最後に

Azure Cloud Shell、ほんとに便利ですよね。
今後もAzure Cloud Shellを活用して、Azureを便利に活用するTipsを投稿していきたいと考えています。

私が所属している株式会社クアンドではエンジニア募集中です。
地域産業のアップデートをミッションに、製造業や建設業など「現場」の課題を解決するためのアプリケーションを開発しています！
私もフルフレックス＆フルリモートで働いています。
興味のある方はWantedlyの募集ページをご覧ください！

https://www.wantedly.com/companies/quando