OmniAICreator/Qiita-1.07M huggingface dataset:
やってみよう！　Apache Derby

# はじめに
Apache DerbyはJavaで実装されたRDBMSです。お手軽に使えるので便利です。
今回は導入方法と、簡単な使い方をメモしておきます。
（簡単に設定・実行できますが、自分はijの起動でJAVA_HOMEのエラーが出てはまりました・・・）


環境：Mac OS 10.15.7

# Derbyのダウンロード
以前はJDKの中に入っていましたが、最近のJDKでは入っていません。自分でダウンロードする必要があります。

* Apatch Derbyを[ダウンロード](https://db.apache.org/derby/derby_downloads.html)します。
* ダウンロードしたら適当なフォルダに解凍します。  (ここでは/Users/XXXX/derbyに解凍)


# 設定
インストールしたフォルダ配下のbinにPATHを通しておきます。
.zprofileに、/Users/XXXX/derby/binを追加します。

``` sh:~/.zprofile
export PATH=/Users/XXXX/derby/bin:$PATH
```


# ijの起動
ijはDerbyのデータベースの作成やコマンドの実行などを行うツールです。
terminalでijを実行します。成功すると以下のように表示されます。

``` sh
ijバージョン10.15
ij> 
```

<br>
 以下のように表示され起動できないこともあります。
> Error: JAVA_HOME is not defined correctly.
>  We cannot execute /System/Library/Frameworks/JavaVM.framework/Home/bin/java

このときはJAVA_HOMEの設定がうまくいっていません。`ij`を修正して対応します。

``` sh:ij
case "`uname`" in
  CYGWIN*) cygwin=true ;;
  Darwin*) darwin=true
           if [ -z "$JAVA_HOME" ] ; then
             # JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
             JAVA_HOME=$(/usr/libexec/java_home)
           fi
           ;;
esac

```
中段あたりのJAVA_HOMEの設定箇所を`$(/usr/libexec/java_home)` に変更します。
これで起動できるようになります。

# データベースの作成
terminalでijを実行した状態で、以下のコマンドを実行します。

``` sh
ij> connect 'jdbc:derby:/Users/XXXX/db/test.db;create=true';
```

/Users/XXXX/db/配下にtest.dbというファイル（データベース）を開こうとします。
create=trueをつけると、ファイルが存在しない場合は自動的に作成します。
これでデータベースが作成（接続）されます。

# テーブルの作成
データベースに接続できたので、次はテーブルを作成します。

```sql:createTable.sql
CREATE TABLE USER_INFO (
    USER_ID VARCHAR(10) PRIMARY KEY NOT NULL,
    USER_NAME VARCHAR(20) NOT NULL,
    ADDRESS VARCHAR(200),
    POST_CODE VARCHAR(7),
    AGE INTEGER,
    BIRTHDAY DATE
);
```
これをコピーしてijに貼り付けるか、runコマンドで実行します。

``` sh
ij> run 'createTable.sql'
```

これでテーブルが作成できました。

# JDBC接続
アプリなどからJDBC接続でアクセスすることが多いと思います。　

``` 
JdbcDriver=org.apache.derby.jdbc.EmbeddedDriver
JdbcUrl=jdbc:derby:/Users/XXXX/db/test.db;		
```

jdbcDriverは、Derbyインストール先の`/lib/derbytools.jar`にあるのでクラスパスに追加します。
>`derby.jar`の場合もあります。バージョンによって異なります。



# コマンド
よく使う便利なコマンドを紹介します
## テーブル一覧
``` sh
ij> show tables;
```

## テーブル構造の表示
``` sh
ij> describe user_info;  
```
> user_info はテーブル名

## スクリプトファイルの実行
``` sh
ij> run ファイル名;  
```
> ファイル名はフルパスまたはijを起動したフォルダからの相対パス
Laravel5.5【初心者向け】namespace 名前空間　use 宣言



自分が勉強してよくわからん！って思った、
namespaceとuse宣言に関してまとめてみました！ \:sunglasses:
モデルやコントローラーに最初に記載されている、これってなに？？って思っている方はぜひ読んでください。

まず、namespace、use宣言を理解をするにはLaravelの構造を知っていたほうがいいので、下記にLaravelのディレクトリ構造の一部を用意しました。
#Laravel 構成
```
Laravel5.5
├── app
│   ├── Console　
│   ├── Exceptions 
│   ├── Providers
│   ├── Http
│   │   ├── Controllers
│   │   │    └── *コントローラーはここ
│   │   │    └──(例)ExampleController.php
│   │   ├── Middleware ... 認証、CSRF保護など
│   │   └── Requests ... リクエストクラス(バリデーション設定など)
│   └── *モデルはここ
├── bootstrap
├── config 
├── database...DB関連
├── public
├── resources 
│   └── views
│   　　　└──*ビューはここ
├── routes  
│   └── web.php
├── storage
├── tests 
└── vendor 
     └──laravel
          └──framework
                └──src
                    └──illuminate
```
いろんなディレクトリがあることがわかりますね。
こんな構成なんだってことを頭において、次に進みましょう〜！


#名前空間とuse宣言を簡単にまとめると

`名前空間->ファイルの場所を示す
use宣言->ファイル内で使うクラスの宣言`

以下、ExampleControllerを例に上げて説明します。

```php:ExampleController.php
<?php

namespace App\Http\このファイルのあるディレクトリ名;
（例）　namespace App\Http\Controllers；

use 使用するクラスの場所\クラス名（モデル名）;
（例）　use Illuminate\Http\Request;

class ExampleController extends Controller {
 //処理
}
```

`名前空間はファイルの場所を示す`て意味でしたね！

上のディレクトリ構造の図でExampleController.phpを探してみましょう〜！
appからたどっていくと目的のファイルまでは
app->Http->Controllers->ExampleController.php になりますね！
なのでファイルの場所を表すと、``namespace App\Http\Controllers；``ってなります。



また、このExampleController.phpのファイル内で使用したいクラスの宣言は
useを用いて書きます。
``use Illuminate\Http\Request;``
↑はHttp内にあるRequestモデル内のRequestクラスを使用しますっていう意味です。


####ここで、ちょっと知っていて欲しいこと

######1．Illuminateまでのディレクトリは省略して書いてあるということ。

use宣言ではこう書く　
``Illuminate\Http\Request;``
でも、実際のファイルの場所はこう。
``vendor\laravel\framework\src\illuminate\Http\Request;``
app直下にilluminateってファイルがないからみんなどこ？？っなるパターンです。

######２．モデル名とそのモデルに書くクラス名は同じ。
これはもうルールなのでそう覚えましょう！
``php artisan make:model Example``のコマンドを用いて自動でファイル作るとクラス名(Example)がすでに書かれていることはそういうことなのです。

######３．namespaceとuse宣言の必要性に関して疑問に思った方は下のリンクに飛んでみましょう！
[namespaceとuse宣言をより理解したい方はこちらへ][名前]
[名前]:https://laraweb.net/surrounding/1599/

以上になります！
これでnamespaceやuse宣言の理解が0->1になっていただければ幸いです！
LGTM大好物なんで、ポチッと投げ銭感覚でおねがいします〜！ \:sunglasses:
JavaScript オブジェクトのキーを値でソートする

#やりたいこと
``Object.js``のオブジェクトのキーを値の降順で並び替えた、```sortedKey.js```のような配列を作成したい。

```JavaScript:Object.js
let scores = {
    yamada: 60,
    suzuki: 50,
    takahashi: 100,
    tanaka: 80,
    ito: 20
};
```


```JavaScript:sortedKey.js
let sortedKeys = [takahashi, tanaka, yamada, suzuki, ito];
```

#結論
```JavaScript:sort.js
let keys = Object.keys(scores); //scoresのキーの配列を作成
let sortedKeys = keys.sort(function(a, b) {
    return scores[b] - scores[a];//scoresの各キーの値でソート(降順)。昇順ならブラケット内のa,bを逆にする。
});
console.log(sortedKeys); // [ 'takahashi', 'tanaka', 'yamada', 'suzuki', 'ito' ]
```

``Object.keys()``で元のオブジェクトのキーの配列を作成したあと、比較関数内で元のオブジェクトの値をブラケット記法で取得し、その値を減算することで、キーを値でソートした配列を作成することができた。

``sort``の引数となる比較関数の仕様については、よろしければこちらの記事をご覧ください。
[JavaScript sortにおける比較関数の仕様](https://qiita.com/lrururu/items/cc36037e8b221faf4455)
そして　TypeScript　へ

#JavaScriptからTypeScriptへ
JavaScript（以下JS)を学んでいたら、その進化版としてTypeScript（以下TS)があることを知った。
そこで学んだことをまとめていく。
##TypeScriptとは？
JSをベースに拡張して作られた言語。違いは、JSは動的型付け　で　TSは静的型付　となり、大規模開発に耐えられる使用となっている。JSを拡張した言語のため、JSの構文を使うことができる。

JSでの大規模開発では、チームで作成するのでいつの間にか意図した型が変数に入らずにエラーが起きることもあり、これに気付けるのは実行した時にエラーが出た時である。一方TSは型を定義するので実行前にエラーに気づくことができ、コード製作者の意図もわかりやすく可読性も上がる。
ただ、TSだけではブラウザで直接実行できないので、JSに変換する必要がある。

##型の指定
まず大切な型の指定についてまとめる。明示的に変数やclassなどに型を指定することで、間違った値が入ることがなくなり、製作者の意図を理解しやすくしたりすることができる。

書き方

```typescript
class Name {
 firstName: string;
 lastName: string;

 constructor(firstName: string, lastName: string){
  this.firstName = firstName;
  this.lastName = lastName;
 }
}
```

上のように、変数名の横に 「: 型の種類」　とつけて、変数の型を指定する。

##型の種類
よく使いそうな型をとりあえずまとめる

###number型、string型、boolean型
よく見る形なのでわかると思うが、numberは数値、stringは文字列、booleanはtrue/falseを意味している

###Object型
　オブジェクトの形を型として定義する。

```typescript

const name: {
 firstName: string,
 lastName: string
} = {
 firstName: 'test',
 nastName: 'test'
}
```

**何もかも型を定義しないといけないの？**
TSには型推論と言うTS側が自動で型を予想して適応してくれる機能がある。このおかげで全ての変数などが出てきた時に、型を指定する必要はない。このおかげで冗長になることもない。上のオブジェクト型でも明示的に型を定義しなくても推論してくれる。また、変数に値を代入したときは、推論してくれる。

###Array型
　配列を意味している。書き方は　「: string[]」　のように型の種類 + [] と書く。注意点は配列内の値全てが、型の種類に固定される。

###Tuple型
 TSで導入された型。配列の要素数が固定の時に使う。

```typescript

 const name: [string, number] = ['test', 30]
```

### Enum型
　TSで導入された型。定数のリスト。配列のように0〜の番号を自動で適応される。

```typescript
 enum Name { Satou, Katou, Yamada = 100}

 Name.Satou
```

enum型で定義しておけば、TSの入力補助機能で選ぶことができ、いちいち定数名を覚える必要もなくなって、使いやすい。
それぞれの文字に対する数値は自動的に適応すると０〜になるが、Yamadaのように数値を指定することもできる。文字を定義することもできる。

###any型
　anyは型を指定せず、どんな値も入ることができる。しかし、TSは型定義をすることに意味があるので、このany型は使用しない方がいい。

**もし、値が代入される型が複数あるかもしれないときは？**
### Union型
型指定の種類が複数の可能性がある場合の書き方

```typescript

 const name: string | number ;
```

「 | 」で複数の型をつなげることで、そのどれでも型が適応することができる。

### Literal型
　今までは、もともとTSが持っていた型を使用していたが、文字を指定することもできる。

```typescript
 const name: 'satou' | 'katou';
```

これは、'satou'か'katuo'の値しかとることができない。
例えば、'finish'|'unfinish'のようにすれば、完了・未完了の定義ができ、それをもとにif文で条件を分けることができる。

### エイリアス型
Literal型やUnion型を何度も書くのは面倒だし、修正も大変となる。それを解決してくれるのがエイリアス型となる。型の定義を変数のようにまとめられる。

```typescript

 type Test = number | string;
```

typeはTSで導入されたものである。

### function型（void型）
　変数に関数を入れたい時に指定する。戻り値の型も指定できる。

```typescript

 function test(n1: number, n2: number): number {何かしらの処理} //戻り値の型指定

 let plus: Function; // let plus: (a:number, b:number) => number;
 plus = test;
```
functionで定義したときの（）後ろに戻り値の型を指定できる。returnが無い場合は「: void」を指定できる。
また、Function型はfunctionを代入すると言うことを型定義してる。しかし、ここで問題が出てしまう。どんな形のfunctionが代入できてしまう。そこでアロー関数を使った書き方（コメントの中）で引数と戻り値の型を指定することで、代入したい目的の形の関数を代入するように、指定を厳しくすることができる。

型をどんどん指定するので長く見えるかもしれないが、エラーに気付きやすくなるので、今後使っていきたい。
webサイトが画面が表示されるまでの仕組み

# ウェブサイトの画面が映る仕組み
分かっていそうで理解しきれていなかった内容をまとめていきたいと思います。

## 重要ワード
- IPアドレス
- ドメイン
- DNSサーバー
- スキーム
- パス
- クライアント

# 基本の理解
https://qiita.com/questions/new
例えば今アクセスしているURLはこんな感じになっています！

この中で"https" この部分のことをスキームといいます。
簡単にいうとどんな手段で通信するの？
といった意味です。今では大体はhttpsではないのでしょうか？

ちなみにスマホとかでよく"このサイトは安全ではありません"とか出てくることがあるのは
httpsではなくhttpが使われている場合です！

httpsとはデータが送信される時にそのデータが暗号化されるようになっています。
これに大してhttpは通信が暗号化されていないと言ったセキュリティに関して少し甘いところがあります！

もしデータが抜き取られてしまった時に暗号化されていた方が安心ですよね。

つづいて"qiita.com"の部分はドメインと呼ばれています！
ドメインとは簡単にいうとインターネット上の住所なようなものです！

これは必ず他のドメインとは被ってはいけないというルールがあります。

つづいて"question/new"これはパスですね。
ドメインの中のどこにアクセスするかを表しています！！

これでURLが何を表しているかざっと理解できたかと思います！

# 本題
ではここからどうやってwebが画面上に映し出されるか説明していきたいと思います。

①まずはクライアントでURLにアクセスします！
（クライアントというのは端末のことです。主にスマホやPCのことを指します)

②クライアントはこれをDNSサーバーに対して、このドメインのIPアドレスを教えてとお願います！！
おっとここで色々なワードが出てきましたね笑

一つずつ説明していきます。
IPアドレスというのはネットワークにアクセスするために振り分けされる番号のようなものです。
このIPアドレスでもURLでもどちらでもネットにアクセスすることが可能になっています！

DNSサーバーというのはドメインに対してIPアドレスを調べることができるサーバーのことです！

つまりクライアントがqiita.com(ドメイン)のIPアドレスを教えて〜とDNSサーバーに投げると
DNSサーバーは"×××.+++.+++.---"だよ〜みたいな感じでIPアドレスをクライアント側に返します。

③クライアントはそのIPアドレスのwebサーバーに接続します！
さらにパス部分のquestion/newのページを開くようサーバーに要求します！

④これによりwebサーバーがクライアントに対してHTMLを発行し、URLの画面が映し出されます！


だいぶ駆け足になってしまいましたが以上がwebサービスが画面に映し出されるまでの仕組みです！
dotnet test で --no-build を指定するとテストカバレッジが出力されない現象の解決方法

テストが実行されない現象の解決方法については[こちら](https://qiita.com/RYO-4947123/items/b78156803b83e924d86b)

## 概要

コマンドラインから普通に`dotnet test --no-build /p:CollectCoverage=true /p:CoverletOutput=./TestResults/ /p:CoverletOutputFormat=cobertura`したらテスト実行後にカバレッジファイルが出力されるのに、CIで自動テストをしようとするとなぜか動かない現象の解決方法です。

## 再現方法

以下のファイルを用意します。

```.gitlab-ci.yml
image: mcr.microsoft.com/dotnet/core/sdk:latest

stages:
  - build
  - test

build:
  stage: build
  script:
    - "dotnet build"
  artifacts:
    expire_in: 10 min
    paths:
      - "*/bin/"
      - "*/obj/"
  only:
    - branches
  except:
    - master

Web_test:
  stage: test
  script:
    - dotnet test Web.Test --no-build /p:CollectCoverage=true /p:CoverletOutput=./TestResults/ /p:CoverletOutputFormat=cobertura
    # もしくは、  dotnet test Web.Test --no-build --collect:"XPlat Code Coverage"
  dependencies:
    - build
  only:
    - branches
  except:
    - master
```

`Web.Test`というテストプロジェクトがあるとします。
これをGitLabのmasterブランチ以外にPushすればbuidとtestが実行されます。

### 説明

[テストが実行されない現象の解決方法](https://qiita.com/RYO-4947123/items/b78156803b83e924d86b)でやっとテストが実行される様になりましたが、今度はなぜかテストカバレッジが出力されない・・・
これも、`--no-build`を付けなければ動作するのに。

## 解決方法

`.gitlab-ci.yml`を以下の通り修正します。

```.gitlab-ci.yml
image: mcr.microsoft.com/dotnet/core/sdk:latest

variables:
  NUGET_PACKAGES: ${CI_PROJECT_DIR}/.nuget/packages # ←これを追加！

stages:
  - build
  - test

build:
  stage: build
  script:
    - "dotnet build"
  artifacts:
    expire_in: 10 min
    paths:
      - ".nuget/packages/coverlet.msbuild" # ←これを追加！
      - "*/bin/"
      - "*/obj/"
  only:
    - branches
  except:
    - master

Web_test:
  stage: test
  script:
    - dotnet test Web.Test --no-build /p:CollectCoverage=true /p:CoverletOutput=./TestResults/ /p:CoverletOutputFormat=cobertura
    # もしくは、  dotnet test Web.Test --no-build --collect:"XPlat Code Coverage"
  dependencies:
    - build
  only:
    - branches
  except:
    - master
```

テストカバレッジの出力には、テストプロジェクトで依存関係に登録している`coverlet.msbuild`を内部で使用しています。
しかし、`--no-build`を指定した場合はビルドを行わないだけではなく、ビルドの前に暗黙的に実行される`dotnet restore`もスキップしています。
つまり、NuGetが実行されず依存関係にあるライブラリを取得していない状態となっています。
これが原因で出力に失敗していました。

解決方法としては、`dotnet restore`を事前に実行する方法もありますが、依存関係が大きい場合は時間も掛かってしまいます。
そして、buildステージで既に行なっていることを繰り返すのもスマートではないので、
buildステージから必要なパッケージだけをtestステージに送ってもらうことにしました。

ただ、パッケージの保存場所がそのままでは到達困難なので`NUGET_PACKAGES`環境変数で無理やりパスを移動して、
それをアーティファクトにしてジョブ間で共有できる様にしています。
（たぶん`artifacts`ではなく`cache`を使った方が良いのでしょうがイマイチ動作がわからなくて今回は使ってないです）

実はこれも（ローカル環境で成功している時に出力される）詳細ログにヒントがありました。

```
"Coverlet.MSbuild.Tasks.CoverageResultTask" タスクをアセンブリ "C:\Users\user\.nuget\packages\coverlet.msbuild\2.9.0\build\coverlet.msbuild.tasks.dll" から使用しています。
```

ログを見るって大事ですね。
[OutSystems]Reactive Web Appのシステムイベント発生タイミング

Reactive Web Appのシステムイベント「Application Ready」について動作を確認してみます。

# 変更履歴
:::note info
2025/01/16 On Application Readyの実行タイミングが、この記事作成時とは変わっていることに気付いたためその内容を反映（非同期→同期にO11.16.1で変更）
:::

# 環境
Personal Environment(Version 11.9.0 (Build 16900))
Service Studio (Version 11.8.12)

# 公式ドキュメント
[On Application Ready](https://success.outsystems.com/ja-jp/Documentation/11/Reference/OutSystems_Language/Platform_Utilities/System_Events/Mobile/On_Application_Ready)

この公式ドキュメントのパスからも分かる通り、元々は、モバイルアプリケーションがバージョン10で登場したときに登場したイベントです。

# アプリケーションのロード時に起動するイベント
以下の様に、追加したOn Application Ready Actionで、JavaScriptでalertを表示して、実行タイミングを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/14aca94d-28d6-e191-ca7e-d10f24376ddb.png)

この状態で、ある画面のOn Initializeでも同じようにalertを出力するようにしました。
画面にアクセスしたときに、On Application ReadyとOn Initializeのどちらが先に動くか確認。

想定通り、Application Readyはアクセス先画面のOn Initializeより先に動きました。

# URL指定でScreenにアクセスすると再発生
一度、モジュールにアクセスしたあと、モジュール内のリンクをたどってどの画面へ移動してもApplication Readyは再発生しませんでした。

ところが、画面のURLを直接アドレスバーに入力したり、Screenを開いた状態でアドレスバーでエンターキーを叩くとApplication Readyが再発生します。

SPAであることを考えると、ある程度納得の行く動作ではあります。
ユーザーが特定ページをブックマークしていた場合、Applicatiopn Readyは一度のセッションで複数回発生しうるということでもありますね。一度しか発生しない、という前提でプログラムしないように注意しなければなりません。

# イベントは非同期処理になる（OutSystems 11.16.0まで）
:::note info
https://github.com/OutSystems/docs-product/commit/d6992a29f9c7f9f1e7fe798df6ac0e2c53632da0
11.16.1から同期になったらしい
:::

つまり、On Application Readyで時間のかかる処理をしていると、画面のInitializeやRenderが先に動いてしまう。

日本語版のドキュメントには記述がないのですが、英語の方にはあります。
> The On Application Ready action runs asynchronously, and doesn't block the render of the screens.

On Application Readyを無駄に時間を取るものに変えてみました。すると、On Application Readyでのalert実行をまたずに、ホーム画面のOn Initializeに配置した処理が先に動作するように。

この点からの設計上の注意点としては、アプリケーションの初期値をサーバから取得するときは、利用するときにはもしかしたらその処理が終わっていない可能性を考慮しなければならないということ。

# ユーザーが直接アクセスする（一番手前のConsumer）モジュールでだけ動作する
ドキュメント内に以下の記述があります。

> アプリケーションのロード中に実行されるアクション（ホームモジュールのみ）。アプリケーションを設定する場合に使用できます（モバイルプラグインの初期化など）。

しかし、Reactiveのアプリケーションに複数のモジュールを作成し、両方にOn Application Readyを作成してテストすると、どちらでも動作します。
また、片方のモジュールからもう片方のモジュール内のActionを参照して動作確認すると、On Application Readyは呼び出し側のもののみが動作しました。

よって、この制約はホームモジュールであるかどうかに関わらず、ユーザーが直接アクセスするモジュールの1つのみが動作する、ということだと思います。
Laravel x MariaDBで、急に「Malformed communication packet」エラーでSQLに接続できなくなった際の対応メモ


さっきまで動いていたLaravelが下記エラーで動かなくなった。。:sob:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/e11d6440-eaa1-13ae-2a6c-00e0fc6a9dc0.png)


```
SQLSTATE[HY000]: General error: 1835 Malformed communication packet
```

原因がわからないが、dockerのローカル環境と、別途用意している外部サーバーのテスト環境で同じDBサーバーに接続しており、両方とも同じタイミングで同じエラーになったので、
起因はDBサーバー側にありそうな。
追って余力があれば情報追記します。

追記：
yumの自動アップデートにより、MariaDBのバージョンがあがった事が原因のようです。

```terminal:/var/log/yum.log
Nov 05 04:22:12 Updated: MariaDB-common.x86_64 10.2.35-1.el7.centos
Nov 05 04:22:13 Updated: MariaDB-compat.x86_64 10.2.35-1.el7.centos
Nov 05 04:22:15 Updated: MariaDB-client.x86_64 10.2.35-1.el7.centos
Nov 05 04:22:16 Updated: galera.x86_64 25.3.31-1.el7.centos
Nov 05 04:22:32 Updated: MariaDB-server.x86_64 10.2.35-1.el7.centos
Nov 05 04:22:32 Updated: MariaDB-shared.x86_64 10.2.35-1.el7.centos
```


## 対処...

laravelの`config/database.php`に、

```
'options'   => [PDO::ATTR_EMULATE_PREPARES => true],
```
を追加する。

↓


```php:config/database.php
// 〜省略〜
'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
        ],

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST_MASTER', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
            'options'   => [PDO::ATTR_EMULATE_PREPARES => true],
// 〜省略〜
```

これで無事エラーはなくなりました。。:smile:


※PHPや、MariaDBのバージョンを適宜更新するのが良いという情報もありますが、アップデートの影響の方が大きそうなので、今回はconfigファイルを変更で汗


**ATTR_EMULATE_PREPARES** はfalseの方が良さげですが、
色々言及しているサイトがあるのでそちらを参考にした方が良いかと思います。
参考：https://teratail.com/questions/233051

ATTR_EMULATE_PREPARESは、PDOの型一致の「===」に影響があるみたいなのですので**要注意**。

追記：
`ATTR_EMULATE_PREPARES`をtrueにすると、PDOで比較演算子の`===`を使うと判定がおかしくなり、
いままでと違う条件分岐をしてしまう事が判明し、phpのバージョンを7.4上げることで対応しました。。:angel_tone2:

> 参考サイト：
https://jira.mariadb.org/browse/MDEV-24121
https://xenforo.com/community/threads/mariadb-10-3-26-1-breaks-php-7-2.187331/
https://teratail.com/questions/233051
https://stackoverflow.com/questions/64678367/laravel-mysql-error-sqlstatehy000-general-error-1835-malformed-communicat


### 環境
* PHP 7.2.31
* Laravel Framework 5.5.48
* 10.2.35-MariaDB-log
【Mac & PlatformIO】 ArduinoやM5Stackへの書き込みエラー "could not open port " の解決方法

ArduinoやM5Stackへの書き込みのとき、結構ハマったので、解決方法をここに残す。

## 環境
macOS Catalina 10.15.7

Visual Studio Code + Platform IO

##エラー内容
M5StackGRAYへ書き込みしたとき以下のエラー発生

```
serial.serialutil.SerialException: 
[Errno 16] could not open port /dev/cu.usbserial-017D234C:
[Errno 16] Resource busy: '/dev/cu.usbserial-017D234C'
```

##解決方法
エラーメッセージをそのままググると、以下のサイトに解決方法が載っていた。
https://github.com/adafruit/Adafruit_nRF52_Arduino/issues/366

それによると、

>After updating macOS (e.g. from 10.14 Mojave to 10.15 Catalina), reinstall the drivers, here the SiLabs CP2104 driver, even if it was already installed before updating macOS.
 

訳すと、
<B>MacOSをアップロード（たとえばMojaveからCatalina）したあと、すでにインストールしていても、再度、[CP2104ドライバー](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)をインストールすること。</B>

<br>
インストール後は、無事にエラーが出ずに書き込みできた！

<br>
framework not found GoogleMobileAds が発現しハマりました

#GoogleMobileAdsのフレームワークがなくなりました

###エラー発生
Swiftの勉強をしていまして、前日に途中まで作ったアプリを今日ビルドしようとしたら、突然エラーが出て、立ち上がらなくなりました。
![スクリーンショット 2020-11-04 23.28.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657690/f8b6c955-6d4f-e2b5-e53f-c84d35c8c658.png)
上記のエラーが出ました。



###原因調査
絶望を感じつつも、下記のワードを頼りにググってみましたが、問題は治りませんでした。
![スクリーンショット 2020-11-04 23.02.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657690/99ed6572-c569-c686-534b-d1c889cd2bba.png)


Xcodeのバクかと思ったのですが、テキトーに新しいプロジェクトを作ってpodsにGoogleMobileAdsをインストールするとなぜか動くんですよね。という事で、バグではないのかなと思いました。

とりあえず新しく作ったプロジェクトのファイルと問題のプロジェクトのファイルを比べてみる事にしました。


###原因判明
podsのファイルを比べていくと判明しました。
新しく作ったプロジェクトにはあって、問題のプロジェクトにはないものがありました。
![スクリーンショット 2020-11-04 23.03.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657690/6d0241c5-e084-e5e4-e230-f65e3abccd19.png)

これをコピーしてファイルの中に入れたらビルド成功しました。ほんと安心しました。

それにしてもこのファイル、消した覚えは全くなくて、なぜ消えたのか不明です。こういう経験ある方いらっしゃったら、ファイルを確認してみるといいかもしれないです。
【Lumen】ファサードのエイリアスを登録する

# はじめに

Laravelをベースとした軽量フレームワークであるLumen。
軽くて速いため、小さなサービスなどで利用されることもありますが、
Laravelと同等の機能を使うには独自の設定が必要となります。

今回はLumenでファサード機能を実装する際の、
エイリアスの設定方法を記します。

※Lumenでのファサード実装の流れはまた後日記事を書こうと思います。

# エイリアスの登録

Facadeクラスは`app/Facades/Hoge.php`に作成されているとします。
`bootstrap/app.php`に、以下のコードを追記します。

```php:bootstrap/app.php
$app->withFacades(true, [
    App\Facades\Hoge::class => 'Hoge',
]);
```

これにより、どこからでも
`\Hoge::method();`
のようにして`Hoge`の`method()`を呼び出すことができます。

`use App\Facades\Hoge;`
と名前空間を記述しなくてもいいのは楽ですね。
【Android】SearchView 使ってみた

#【Android】SearchView 使ってみた

## SearchViewとは
文字を入力してもらうような検索レイアウトを作るのって、面倒だなと思ってたら、もともと用意されているレイアウトで、SearchViewというものがありました。

[SearchViewについての公式ドキュメント](https://developer.android.com/reference/androidx/appcompat/widget/SearchView)

* SearchViewの例

![スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315689/d135b447-ffe8-7b3e-ab5c-64ad01f0bd37.png)


## 使い方
使い方はとても簡単です。

* レイアウト

``` searchView.xml
<androidx.appcompat.widget.SearchView
        android:id="@+id/search_view"
        // サイズはお任せで
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        // ヒントとして、文字入力部分に表示される文字列
        app:queryHint="キーワード検索"
        // 虫眼鏡の画像の表示・非表示を設定
        android:iconifiedByDefault="true"/>
```

## 現状で使いそうだと思ったリスナー
### OnQueryTextListener
SearchViewに、文字が入力、または入力後に完了（検索）が行われた時のリスナークラス

* 使い方の例

``` SampleActivity.kt
class SampleActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
     val searchView = view.findViewById(R.id.search_view)
     searchView.setOnQueryTextListener(SearchViewListener())
  }

  // OnQueryTextListenerを、implementしたクラス
  class SearchViewListener(): OnQueryTextListener {
        // 入力された文字が変更された際に、呼ばれるメソッド
        override fun onQueryTextChange(newText: String?): Boolean {
            println("changed")
            return false
        }

        // 文字の入力後に、検索ボタンが押された際に呼ばれるメソッド
        override fun onQueryTextSubmit(query: String?): Boolean {
            println("done")
            return false
        }
  }
}
```

これで、何か文字が入力された時や、検索が押された時に、何かしらの処理が実行できます。
deviseで記述があっているのに、ログアウトできない現象

#はじめに
　deviseを導入してユーザー管理機能を実装していたが、予期せぬエラーに見舞わせたので、記録しておく。

##エラー内容
Routing Error
No route matches [GET] "/users/sign_out"

```ruby
<%= link_to 'ログアウト', destroy_user_session_path, method: :delete, class: :logout %>
```
もちろん、`method: :delete`とビューファイルにも記述していた。なぜか、ルーティングでHTTPメソッドがGETのものを探し出していた。

###ローカルサーバーを再起動させる
ターミナルで
「control + c」
入力。
再び、ターミナルで「rails s」実行

###荒技！？

```ruby:config/initializers/devise.rb/269行目
config.sign_out_via = :delete
```
`:delete`を`:get`に変える。

##最後に
　記述もあっているのに、なぜこのエラーが出たのか、いまだにわからない…。全く同じ記述でも、エラーが出る時と出ない時がある。
DNA配列を相補鎖にするpythonコード どのやり方が速いのだろう？

#はじめに
pythonでDNAを相補配列に変換する関数を作ってみます。4通り作ってみてどれが早いか比較してみます。

#相補鎖にするということ
AはTに、CはGに、GはCに、TはAに変換します。その上で並び方を逆にします。
ACGTTTTTの相補配列はAAAAACGTです。
#ACGT以外もある
RはAまたはGのことです。YはCまたはTのことです。DはC以外(つまりAかGかT)。大文字と小文字もあります。

DNA配列の長さは例えば10 Mb(1000万塩基)などです。

#辞書
置き換え方法を指定する辞書を作ります。

```py
compDic = {"R":"Y","M":"K","W":"W","S":"S","Y":"R","K":"M","H":"D","B":"V","D":"H","V":"B","N":"N","A":"T","C":"G","G":"C","T":"A","r":"y","m":"k","w":"w","s":"s","y":"r","k":"m","h":"d","b":"v","d":"h","v":"b","n":"n","a":"t","c":"g","g":"c","t":"a"}
```

#いろいろ作ってみる
1番目のやり方:
相補配列をしまう空のリスト(大きさはDNA配列の長さと同じ)を作って、DNA配列を最初から読んで、相補配列をリスト最後尾から1文字ずつ入れていく。最後にjoin()で繋げる。

```py
def comp1(dna):
    l = len(dna)
    c = ["" for num in range(l)]
    index = l-1
    for i in dna:
        c[index] = compDic[i]
        index -= 1
    return ''.join(c)
```

2番目のやり方:
空のリストを作る。DNA配列を前から1つずつ読んで、その相補塩基をinsert()でリスト先頭に追加する。

```py
def comp2(dna):
    l = len(dna)
    c = []
    for i in dna:
        c.insert(0,(compDic[i]))
    return ''.join(c)
```

3番目のやり方:
空のリストを作る。DNA配列を後ろから1つずつ読んで、その相補塩基をappend()でリスト最後尾に追加する。

```py
def comp3(dna):
    l = len(dna)
    c = []
    for i in range(l):
        c.append(compDic[dna[l-i-1]])
    return ''.join(c)
```
4番目のやり方:
空の文字列を作る。DNA配列を後ろから1つずつ読んで、その相補塩基を文字列に追加する。

```py
def comp4(dna):
    l = len(dna)
    str = ""
    for i in range(l):
        str += compDic[dna[l-i-1]]
    return str
```

#かかる時間を計ってみる
おおよそ500万塩基のDNA配列をファイルから読み込んで、上記4つの関数で相補鎖にしてみました。[コード](https://qiita.com/fantm21/items/3dc7fbf4e935311488bc)は@fantm21さんのものです。ありがたく流用させていただきました。

```py
start = time.time()
comp1(sequence)
elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")

start = time.time()
comp2(sequence)
elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")

start = time.time()
comp3(sequence)
elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")

start = time.time()
comp4(sequence)
elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
```

#結果
以下のようになりました。comp2は終わりませんでした。

```py
elapsed_time:1.2188289165496826[sec]#comp1()
elapsed_time:1.3529019355773926[sec]#comp3()
elapsed_time:1.5209426879882812[sec]#comp4()
```
#終わりに
あらかじめ必要なサイズの空のリストを作って、ここに相補配列を入れていくのが速いようでした。まあこのくらいの時間なら良いかもしれません。
もっと速い方法をご存知の方がいましたら、ご教示いただけますと幸いです。
MySQLのENUM型について

enumの列挙値には文字列を指定する。
DBのenum型のカラムに実際に格納される値は、列挙値のインデックスの数値。

```sql
--enum型のsizeというカラムを定義する--
CREATE TABLE shirts (
    name VARCHAR(40),
    size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);
```

# ENUM カラムに数字を格納するのは、分かりづらいので良くない

以下のようなnumbersというENUM型のカラムを定義する

```sql

numbers ENUM('0','1','2')

--配列と違ってインデックスは1から始まる--
```

```sql
INSERT INTO t (numbers) VALUES(2)

-- insertした2は、インデックスとして解釈されるため1が返る --
SELECT * FROM t 
```


```sql
INSERT INTO t (numbers) VALUES('2')

-- insertした'2'は、列挙値と一致するので2が返る --
SELECT * FROM t 
```

```sql
INSERT INTO t (numbers) VALUES('3')

-- insertした'3'は、どの列挙値とも一致しないのでインデックスとして扱われ、2が返る --
SELECT * FROM t 
```


公式ドキュメント: https://dev.mysql.com/doc/refman/5.6/ja/enum.html
Gitの基本 その2

#gitで管理したくないファイルやディレクトリの除外設定をする
git initまたはgit cloneしたgit管理のルートディレクトリに
.gitignoreを格納する
複数人で開発する場合は、.gitignoreをcommitしておき、
プロジェクトメンバー全員で利用できるようにすると良い

##GitHubで提供しているテンプレートの取得
開発する言語やOS毎にgitignoreが予め用意されている
[github/gitignore](https://github.com/github/gitignore)
例えばMacでJava言語を使った開発をしている場合は、
gitignore/Global/macOS.gitignore
gitignore/Java.gitignore
を1つの.gitignoreにマージして利用する
それぞれのファイルの中身は予め確認しておくこと

##.gitignoreの設定
例：リモートリポジトリURL=git@github.com:eizin6389/Git-Tutorial.git
　 .DS_StoreをGitで管理しない設定

```
$ cd 任意のディレクトリ
$ git clone git@github.com:eizin6389/Git-Tutorial.git
$ cd 任意のディレクトリ/Git-Tutorial
$ cat .gitignore
.DS_Store
$ git add .gitignore
$ git commit -m "Add ignore pattern"
```

#既にGitで管理しているものを除外する
※削除した履歴は残りません

##Git管理から除外し、ファイルは残す
```
git rm --cached [ファイル名]
```
##Git管理からファイルを除外し、ファイルを物理的に削除する
```
git rm [ファイル名]
```
##Git管理からディレクトリを除外し、ディレクトリは残す
ディレクトリ配下のディレクトリやファイルも併せて除外されます

```
git rm -r --cached [ディレクトリ名]
```
##Git管理からディレクトリを除外し、ディレクトリを物理的に削除する
ディレクトリ配下のディレクトリやファイルも併せて除外し、削除されます

```
git rm -r [ディレクトリ名]
```

#git addを取り消す
※取り消しの履歴は残りません
※特にリモートにpush済みのコミットに関して使うことはNGです。

##ファイルの内容は変更せずにgit addを取り消す
```
git reset [ファイル名]
```

##ファイルの内容を変更しgit addを取り消す
直前のコミット時と完全に一致した状態にファイルの内容を戻す

```
git reset --hard
```

##指定したコミットIDより後ろのコミット内容を取り消す
ファイルの中身はコミットした時の状態で残す

```
git reset [コミットID]
```

##指定したコミットIDより後ろのコミット内容を取り消す
ファイルの中身は、取り消した分を戻す

```
git reset --hard [コミットID]
```

# ワーキングディレクトリの追跡対象外ファイルを削除する
Gitで管理されていないファイルを削除する

##削除対象を確認する
ディレクトリは対象外

```
git clean -n
```

##強制的に削除する
ディレクトリは対象外

```
git clean -f
```

##ディレクトリも削除対象に加えて、削除対象を確認する

```
git clean -nd
```

##ディレクトリも削除対象に加えて、削除対象する

```
git clean -fd
```

#直近のコミットのコミットメッセージの内容を修正する
```
git commit --amend
```

#コミットを打ち消すコミットをする
※コミット履歴に残ります

##対象のコミットIDの内容を取り消し、取り消した事を履歴に残す
```
git revert コミットID
```

#ファイル名またはディレクトリ名の変更または移動
```
git mv ファイル名
git mv ディレクトリ名
```
AsteriskオープンソースPBX用 G.729ビルド


当方環境 Ubuntu 18.04.5 /  Asterisk 13.18.3

#Asterisk 用の g729 codecs ビルド　メモ

私の環境で、足らなかったもの

```
sudo apt install asterisk-dev
sudo apt install autoconf 
sudo apt install libtool
```

bcg729 ライブラリのビルド

``` 
$ wget http://download-mirror.savannah.gnu.org/releases/linphone/plugins/sources/bcg729-1.0.2.tar.gz
$ tar xzf bcg729-1.0.2.tar.gz
$ cd bcg729-1.0.2
$ ./configure --libdir=/lib
$ make
$ sudo make install
```

g729 codecsのビルド



```
wget http://asterisk.hosting.lv/src/asterisk-g72x-1.4.3.tar.bz2
tar xjf asterisk-g72x-1.4.3.tar.bz2
cd asterisk-g72x-1.4.3
./autogen.sh
./configure --with-bcg729
make
sudo make install

sudo service  asterisk restart
```

core show translationで　g729　が入ってくればOKです

```
$ sudo asterisk -vvvrT
*CLI> core show translation
```

sip.confにg729を追加

```:sip.conf
disallow=all
allow=ulaw
allow=g729
```

速度制限の200kbpsが安定しない格安SIM環境の通話用には良いです。
G.729ですが、上下それぞれ13kbpsのわりにはよいクオリティが得られています。
2017年に概ね特許切れのようです。


（参考）http://asterisk.hosting.lv
Ruby縦書き

#rubyで縦書きする方法
#結論
```java:
a = gets.chars
puts a
```
#例えば下記のようにgetsにtokyoを当てはめると
```java:
a = Tokyo.chars
puts a
```
#出力結果
```java:
T
o
k
y
o
```
#という感じになります
#以上
Unexpected end of JSON input while parsing near

# 概要
npm installで詰まった。

エラー内容は、

```
npm ERR! Unexpected end of JSON input while parsing near
```

#解決
npmのキャッシュと<font color="Red">wifi環境(ネット回線の速度)</font>が原因のようでした。
サイトを調べるとどのサイトも

```
npm cache clean --force
```
で解決とありましたが、解決できず。。

```
npm cache verify --force
rm -rf ~/.npm
```
もダメで。

結論としては
npm cache clean --forceに加えて、
速度の早いネットワーク回線に繋ぎかえたら正常に動きました。
どうやら速度制限下だとダメだったようです。

いつか誰かの参考になれば幸いです。

# 補足
npm キャッシュとは
https://docs.npmjs.com/cli/v6/commands/npm-cache
【Ruby】ActiveStorageを用いた画像表示で陥ってしまったミス

本記事は正しく機能を実装できている方には無縁かもしれません・・・
ActiveStorageを用いたメッセージ投稿機能のようなものを作成していました。投稿したメッセージを表示するビューファイルを作成したので挙動を確認しようとしたところエラーが発生しました。ロジックは合っているのになぜ・・・

## 原因
開発途中で挙動確認をしていた際、画像を添付していなくても投稿できたことがあったことを思い出しました。
has_one_attachedによるアソシエーションがうまく組めていなかった時にメッセージだけの投稿データがテーブルに登録されていました。前述の通りアソシエーションを組んでいたため今回作成したビューファイルを開く際にエラーが発生しました。

## 解決方法
私の場合はテーブルの状態を確認できるSequelProを導入していたので、当該レコードのみを直接削除して対応しました。本来であればテーブルに対してresetを行う方が正しいとは思いますが、個人の開発であればこちらでも良いのかな、、、（良くない）


以上、ロジックだけではなく違う側面も考えられる広い視点が必要だと感じた出来事でした。
キャッシュとクッキーについて

今回の記事ではCookie(クッキー)とキャッシュについての説明したいと思います。

Cookie(クッキー)もキャッシュも情報を保存するために使用されることに関しては共通していますが、
それぞれ違いがあります。



○キャッシュとは

HPを訪問したユーザーの情報をブラウザー側に保存する仕組み。
WebブラウザーとWebサーバーの一連のやりとりで関連性のある処理の流れ
多数のWebブラウザーから行われる。

・メリット
直近で読み込みしたものが、高速で読み込みできる

・デメリット
更新した内容がすぐに反映されない可能性がある


○Cookie(クッキー)とは

ユーザーが閲覧したWebページの情報を一時的に保存する機能
WebブラウザーとWebサーバーの一連のやりとりで状態を保存する仕組み

・メリット
１度ログインしたWebサイトに2回目以降、PWなしでスムーズにログインできる

・デメリット
ブラウザーにユーザー情報が保存されるため、情報が漏洩する可能性がある
FireStoreでデータを検索して更新する[ Swift ]

都道府県リストから、"Osaka"という名前の都道府県を検索して"行ったことがある"というフラグをFalseからTrueにします。

```swift
let doc = Firestore.firestore().collection("prefectures") // prefectureリスト
          .whereField("name", isEqualTo: "osaka").getDocuments(completion: {  // 名前が大阪と一致するドキュメントをとってくる
 (querySnapshot, error) in
                    if let err = error {
                        print("Error getting documents: \(err)")  // エラーハンドリング
                    } else {
                    let id = querySnapshot.documents.first?.documentID  // 結果のドキュメントIDをとる
                    let document = Firestore.firestore().collection("prefectures").document(id!) // IDと一致する書き換えできるドキュメントをとる
                    doc.updateData([ // アップデート
                        "haveBeenTo": true // 行ったことあるフラグをTrueにする
                    ]) { err in
                        if let err = err { // エラーハンドリング
                            print("Error updating document: \(err)")
                        } else { // 書き換え成功ハンドリング
                            print("Update successfully!")
                        }
                    }
                }
            })
```   

＊これは、Name：Osakaというドキュメントがひとつしかないことが保証されている場合だけできます。もしOsakaが二つあると、望んでいない方が更新されることがあります。一意にドキュメントを取得するには、IDを使用します。

🐙

🐣
****
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
ReactDatepickerで週の開始日を任意の曜日にする方法

早速サンプルコード

```typescript
import ja from 'date-fns/locale/ja';
import React, { ReactElement } from 'react';
import DatePicker from 'react-datepicker';

// Locale Classのインスタンスではないが、Typescriptのコンパイルエラーを潰すために強引に
// インスタンスをちゃんと作る方べきかもだが今回はasで簡単に回避
const sundayStartJa = { ...ja, options: { ...ja.options, weekStartsOn: 0 } } as Locale; 

export const Datepicker = (): ReactElement => 
  <DatePicker locale={sundayStartJa} onChange={console.log} />;
```
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8770/496465a6-edcc-127d-9426-60d0bb53bce9.png">


上記の前提は

- ロケールは`ja` (日本)
    - `ja`にすると、週の開始日が月曜日になる

    - <img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8770/9678ea62-a349-27ce-eee2-715817dc8b92.png">
- これを日曜日開始に変更する
    - `weekStartsOn: 0`が日曜なので任意の曜日を指定する

ドキュメントにも見当たらず、だいぶ無理やり実装した感があるが想定どおりの挙動をしている
`ja.option = {//略}`などでも動いたが、怖いのでコピーを作成

React Datepicker
https://reactdatepicker.com/
https://github.com/Hacker0x01/react-datepicker#localization
PyTorchでXORを実装してみる

#はじめに
Kerasでやりたいことをやろうとすると、結局tensorflowを使わざるを得ず、それならPyTorchの方がいいんじゃね？ということで早速、XORを実装してみた。

#環境 
- Python 3.6
- pytorch 1.7.0

#ソース
```python
import torch
import torch.nn as nn
import torch.optim as optim


class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = torch.nn.Linear(2, 8)
        self.fc2 = torch.nn.Linear(8, 8)
        self.fc3 = torch.nn.Linear(8, 1)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        x = torch.nn.functional.relu(self.fc1(x))
        x = torch.nn.functional.relu(self.fc2(x))
        x = self.fc3(x)
        x = self.sigmoid(x)
        return x


def main():

    import numpy as np
    x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
    y = np.array([[0], [1], [1], [0]])

    num_epochs = 10000

    # convert numpy array to tensor
    x_tensor = torch.from_numpy(x).float()
    y_tensor = torch.from_numpy(y).float()

    # crate instance
    net = Net()

    # set training mode
    net.train()

    # set training parameters
    optimizer = torch.optim.SGD(net.parameters(), lr=0.01)
    criterion = torch.nn.MSELoss()

    # start to train
    epoch_loss = []
    for epoch in range(num_epochs):
        print(epoch)
        # forward
        outputs = net(x_tensor)

        # calculate loss
        loss = criterion(outputs, y_tensor)

        # update weights
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        # save loss of this epoch
        epoch_loss.append(loss.data.numpy().tolist())

    print(net(torch.from_numpy(np.array([[0, 0]])).float()))
    print(net(torch.from_numpy(np.array([[1, 0]])).float()))
    print(net(torch.from_numpy(np.array([[0, 1]])).float()))
    print(net(torch.from_numpy(np.array([[1, 1]])).float()))

if __name__ == "__main__":
    main()
```

# 結果
```
tensor([[0.0511]], grad_fn=<SigmoidBackward>)
tensor([[0.9363]], grad_fn=<SigmoidBackward>)
tensor([[0.9498]], grad_fn=<SigmoidBackward>)
tensor([[0.0666]], grad_fn=<SigmoidBackward>)
```

お、いい感じだ。

#感想
まだ、ほんの触り程度だが、KerasやTensorflowに比べると、ブラックボックス感がなくPythonからシームレスに使える感じがすごくいい。
例えば、モデルの中にprint文を入れても, そのまま出力される。実行中の可視化なんかもすごくやりやすそう。
正規表現についてメモ


#### 正規表現
正規表現とは、文字列の一部分を抽出・置換したり、文字列が制約を満たしているかを調べるための表現方法。

 `正規表現を用いるシーン`
登録フォームに電話番号を記入する欄の場合。ハイフンを付けて入力する人もいれば、ハイフン無しで入力をする人もいる。フォーマットを統一させるために、入力された電話番号にハイフンが入っていたら必要に応じて処理を行う。

```
入力欄:090-1234-5678

           ⇓   ハイフンを取り除く

　　　 ０９０１２３４５６７８

```


このように、文字列に特定の文字が含まれているかを確認、特定の文字を取り除くなどの操作を行うための技術を**正規表現**という。

***

####正規表現を利用するための2つのメソッド

◾subメソッド
◾matchメソッド

**◾sub** <置換>
subメソッドは、文字列の指定した部分を別の文字列に置き換えるためのメソッド。
第1引数に置き換えたい文字列を指定し、第2引数に変換後の文字列を指定。また、操作したい文字列は/で囲む。

**（例）** 「パンを食べる」という文字列が「ご飯を食べる」という文字列に置換。

```
irb(main):001:0> str = "パンを食べる"
=> "パンを食べる"

irb(main):002:0> str.sub(/パン/,"ご飯")
=> "ご飯を食べる"

```
<br>

**◾match** <抽出・制約調査>
matchメソッドは、引数に指定した文字列がメソッドを使用した文字列に含まれているか否かをチェックするためのメソッド。含まれている場合は、指定した文字列がMatchDataというオブジェクトが戻り値で得られる。含まれていない場合は、戻り値としてnilが得られる。

**（例）** 「Good morning」という文字列に、「Good」という文字列が含まれているか否かチェックする

```
irb(main):001:0> str = "Good morning"
=> "Good morning"

irb(main):002:0> str.match(/Good/)
=> #<MatchData "Good">

irb(main):003:0> str.match(/Hello/)
=> nil
```
<br>

**MatchData**
マッチした文字列はMatchDataという種類のオブジェクトで返される。MatchDataから実際にマッチした文字列などを取り出したい場合は、配列から最初のデータを取り出す時と同様の形で取り出すことができる。

```
irb(main):001:0> str = "good morning"
=> "good morning"

irb(main):002:0> md = str.match(/good/)
=> #<MatchData "good">

irb(main):003:0> md[0]
=> "good"
```

<br>
Microsoft AzureのGo紹介

2020年11月3日(火)にオンラインで「[合同勉強会 in 大都会岡山 -2020 Winter Online-](https://gbdaitokai.connpass.com/event/189232/)」が開催されました。今回は初のオンライン開催でしたが、バラエティ豊かなセッションが揃った、これまで通りの雰囲気だったので安心しました。

2020年、これまでの「[Azure SDK for Go](https://docs.microsoft.com/ja-jp/azure/developer/go/)」の学習の過程で私が知り得たMicrosoft Azureな情報のお裾分けと、裏テーマとしてお世話になった方々への恩返しとして、「Microsoft AzureのGo紹介」にて発表させて頂きました。

- 【動画】 [Microsoft AzureのGo紹介 - YouTube](https://www.youtube.com/watch?v=W7s-1a0E__I)
- 【資料】 [Microsoft AzureのGo紹介 - slideshare](https://www.slideshare.net/qt-luigi/microsoft-azurego)

直前まで何回リハをしても予定の20分を超えてしまいどうなるかと心配していましたが、いざ本番、ほぼ時間通りに終われたということで、ひと安心。

現時点での日本のMicrosoft、Azure、コミュニティの情報と、今回は少しとなってしまった関連するGoの情報を紹介しています。あなたの知らないAzureがあるかも！？
箱の中の要素の中心を揃える【Tailwind CSS】

flex内の要素(四角形)などの頭を揃えるのはではなくて、
その要素の中心を親flexの上下の中心に揃うようにするには
(頭はバラバラだが高さの真ん中には揃う)
大枠に“flex”と“align-items”をつける


![無題の図形描画.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510944/5a080277-1d15-fd28-f9be-cd7ef3390c99.jpeg)
![無題の図形描画 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510944/05776968-40b5-ed3b-29e7-9d6f615605bb.jpeg)
docker compose build のメモリ容量不足の対策

こちら参照。
https://kazmax.zpp.jp/linux_beginner/mkswap.html



解決策　swap領域を追加し、bundle installを可能にする。

以下エラー文。

```terminal
Installing nokogiri 1.10.10 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /usr/local/bundle/gems/nokogiri-1.10.10/ext/nokogiri
/usr/local/bin/ruby -r ./siteconf20201104-6-1o7c1oy.rb extconf.rb
Cannot allocate memory - /usr/local/bin/ruby -r ./siteconf20201104-6-1o7c1oy.rb
extconf.rb 2>&1

Gem files will remain installed in /usr/local/bundle/gems/nokogiri-1.10.10 for
inspection.
Results logged to
/usr/local/bundle/extensions/x86_64-linux/2.5.0/nokogiri-1.10.10/gem_make.out

An error occurred while installing nokogiri (1.10.10), and Bundler cannot

continue.
Make sure that `gem install nokogiri -v '1.10.10' --source
'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  rails was resolved to 5.2.4.4, which depends on
    actioncable was resolved to 5.2.4.4, which depends on
      actionpack was resolved to 5.2.4.4, which depends on
        actionview was resolved to 5.2.4.4, which depends on
          rails-dom-testing was resolved to 2.0.3, which depends on
            nokogiri
ERROR: Service 'app' failed to build: The command '/bin/sh -c bundle install' returned a non-zero code: 5
```
Pythonを使って円周率を求める #モンテカルロ法

#初めに
この記事では
ラムダさんの[動画](https://www.youtube.com/watch?v=Ymtb47ZfMgI)を見てそのまま、深夜テンションで書いたモンテカルロ法を用いて円周率を求めるプログラムを解説する記事です。深夜テンションなのであまり期待しないで下さい！

#コードが酷い


```python
import matplotlib.pyplot as plt
import random

Xlist=[]
Ylist=[]
Number_list=[]
pi=0
pi_list=[]

for i in range(15000):
    Xlist.append(random.uniform(0,1))
    Ylist.append(random.uniform(0,1))
    if (i+1)%10 == 0:
        Number_list.append(i+1)
        pi_list.append((pi/(i+1))*4)
    if Xlist[i]**2+Ylist[i]**2 <= 1 and (i+1)%10 == 0:
        Number_list.append(i+1)
        pi_list.append((pi/(i+1))*4)
        pi+=1
    elif Xlist[i]**2+Ylist[i]**2 <= 1:
        pi+=1

print((pi/(i+1))*4)
plt.plot(Number_list,pi_list)
plt.show()
```
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/9dbd3cf7-d9da-9676-2e0f-34e7cb645ded.png)
何これ汚ない
一応動くちゃ動くけど、同じ処理が何回も書かれいるし流石にやばいので結局朝に書き直しました。

```python
import matplotlib.pyplot as plt
import random

Xlist=[]
Ylist=[]
Number_list=[]
pi=0
pi_list=[]

for i in range(15000):
    Xlist.append(random.uniform(0,1))
    Ylist.append(random.uniform(0,1))
    if (i+1)%10 == 0:
        Number_list.append(i+1)
        pi_list.append((pi/(i+1))*4)
    if Xlist[i]**2+Ylist[i]**2 <= 1:
        pi+=1

print((pi/(i+1))*4)
plt.plot(Number_list,pi_list)
plt.show()
```
少しはマシになりましたね。
それでは1行ずつコードを解説して行きましょう。

```python
import matplotlib.pyplot as plt
import random
```
一行目では**matplotlib**と言うグラフを作図する時に便利なライブラリーを**plt**と言う名前で使える様にしました。
二行目では**random**と言うランダムな値を生成できるライブラリーをインポートしています。

```python
Xlist=[]
Ylist=[]
Number_list=[]
pi=0
pi_list=[]
```
ここでは諸々円周率の計算に必要な変数を宣言をしています。
**XlistとYlist**にはランダムに生成した点の座標を格納して後の計算で、点が円内部に入っているか否かを判定します。**Number_list**ではグラフ作成に必要な等差数列を作成しています。本当はnumpyを使って先に等差数列を作った方が早いですが、今回は方法を調べるのがめんどくさいのでパスしました(サボり魔)。**pi**には合計で円内部にプロットされた点の数の合計を**pi_list**にはそれぞれ計算で求めた円周率ををリスト形式で保存する時に使います。

```python
for i in range(15000):
    Xlist.append(random.uniform(0,1))
    Ylist.append(random.uniform(0,1))
    if (i+1)%10 == 0:
        Number_list.append(i+1)
        pi_list.append((pi/(i+1))*4)
    if Xlist[i]**2+Ylist[i]**2 <= 1:
        pi+=1
```
ここではfor文を使って以下の処理を15,000回繰り返します(人間がやったら死んじゃう)。
**XlistとYlist**にramdomモジュールを使って点の座標を格納します。
説明の都合先に**if Xlist[i]**2+Ylist[i]**2 <= 1:**のブロックを解説します。
ここでは面倒臭い説明は省きますが
$x^2+y^2=r^2$
より取り敢えずXlistとYlistの最後に格納されている数をそれぞれ二乗して足して半径の二乗以下だったら、円の中に点が入っている事が分かります。これを数式として表したのが上のif文です。このif文で点が円の中にいる事が分かったので、piに1加えます。最後に**if (i+1)%10 == 0:**のブロックについてです。ここでは十回に一回円周率を計算してpi_listに格納し、ついでにNumber_listを等差数列にするために数を追加します。

**plt.plot(Number_list,pi_list)
plt.show()**
これはグラフを作成するだけのプログラムですので解説はしません(手抜き)。
#終わりに
多分いらないと思いますが、[PDF](https://drive.google.com/file/d/1DJTl1476cRQsAIufstGgEim2L7yHxC4z/view?usp=sharing)にして今回の内容をまとめて見ました。
プログラム歴はびっくりするほど浅いので間違っていたら気軽にコメントで教えてください！！
後よかったらコメントもくだい。
PythonでいろいろPOSTしてFlaskで受け取る

pythonでjsonとか画像とかPOSTしたくなってきたので, 全部まとめました。全部Flaskで受け取ってます。


#まずは普通にdataをPOST

```python:post.py
import requests
import json

post_url = "http://127.0.0.1:5000/callback"

#postしたいデータ
data = "wowwowwowwow"

#POST送信
response = requests.post(
                    post_url,
                    data = data
                    )

print(response.json())

```

```python:server.py
from flask import *
import os
from PIL import Image
import json

app=Flask(__name__)

@app.route("/")
def hello():
    return "hello"

@app.route("/callback",methods=["POST"]) 
def callback():
    print(request.data.decode())
    return jsonify({"kekka": "受け取ったよ!"})

if __name__=="__main__":
    port=int(os.getenv("PORT",5000))
    app.debug=True
    app.run()
```

#JSON形式でPOST

```python:post.py
import requests
import json

post_url = "http://127.0.0.1:5000/callback"
                
json = {"data": "ウオオオオお"}

#POST送信
response = requests.post(
                    post_url,
                    json = json,
                    )

print(response.json())

```

```python:server.py
from flask import *
import os
from PIL import Image
import json

app=Flask(__name__)

@app.route("/")
def hello():
    return "hello"

@app.route("/callback",methods=["POST"]) 
def callback():
    data = request.data.decode('utf-8')#デコード
    data = json.loads(data)
    print(data["data"])
    return jsonify({"kekka": "受け取ったよ!"})

if __name__=="__main__":
    port=int(os.getenv("PORT",5000))
    app.debug=True
    app.run()
```

#画像をPOST

```python:post.py
import requests
import json

post_url = "http://127.0.0.1:5000/callback"
                
#POSTするファイルの読込
files = { "image_file": open('./sample.jpg', 'rb') }

#POST送信
response = requests.post(
                    post_url,
                    files = files,
                    )

print(response.json())
```

```python:server.py
from flask import *
import os
from PIL import Image
import json

app=Flask(__name__)

@app.route("/")
def hello():
    return "hello"

@app.route("/callback",methods=["POST"]) 
def callback():
    #画像の読み込み
    im = Image.open(request.files["image_file"])

    #表示
    im.show()
    
    return jsonify({"kekka": "受け取ったよ!"})

if __name__=="__main__":
    port=int(os.getenv("PORT",5000))
    app.debug=True
    app.run()
```

#感想
これであなたもPOSTマスター。
フリーウェアの vlc で .wav ファイルを .mp3 ファイルに自動一括変換するバッチファイル

["vlc で wma ファイルを mp3 ファイルに変換するバッチファイル"](https://qiita.com/tootwotoh/items/5a7ca05e6ee383d57343) の
wma を wav に変えただけのスクリプト。

曲名等の情報はひきつがれないので注意。

wav ファイルがあるフォルダに置いてダブルクリック。 管理者権限は要らない。

VLC は
　http://download.videolan.org/pub/videolan/vlc/3.0.9.2/win64/vlc-3.0.9.2-win64.zip
を使えばインストール不要。 ポータブル版。 だけどバッチファイルの vlc.exe の場所を
合わせること。

(実行環境： Windows10, Window7 等)


wav_mp3.bat


```dosbatch
@echo off
color 1f
cd /d %~dp0
set VLC="C:\Program Files (x86)\VideoLAN\VLC\vlc.exe"
if not exist %VLC% set VLC="C:\Program Files\VideoLAN\VLC\vlc.exe"
if not exist %VLC% set VLC="%~d0\vlc\vlc.exe"
if not exist %VLC% (
  echo.
  echo.VLC.EXE がありません。
  echo.
  pause
  goto :eof
)

@rem エラー起きるときがあるのでダミー設定しとく。
set OUTFL=aa

echo.
echo.フォルダ内の wav ファイルを mp3 ファイルに変換します。
echo.
pause

@rem VLC が起動していると変換できないので強制的に終了させる
> nul 2>&1 taskkill /f /im vlc.exe

setlocal enabledelayedexpansion
for %%a in (*.wav) do (
  set INFL="%%a"
  set OUTFL=!INFL:~0,-5!.mp3"

  %VLC% --no-repeat --play-and-exit -I dummy -vvv !INFL! --sout #transcode{vcodec=none,acodec=mp3,ab=192,channels=2,samplerate=44100}:file{dst=!OUTFL!} vlc://quit
  if exist !OUTFL! (
    echo.!OUTFL!
  ) else (
    echo.失敗： !INFL!
  )
)

color 0f
pause
goto :eof

```

#### (無料 フリーウェア スクリプト アプリ プログラム インストール不要)
privateの想像と違う(？)動作のお話

初書：2020/11/4
php：7.4.10

# 前書き
オブジェクトを使う際にほぼ間違いなく使うprivate。
今回は（個人的に）意外な性質を見つけたのでメモ。

# コード
先にコードを提示

```php

class tes{
    private int $a = 1232;
    private function fc():int{
        return $this->a;
    }
    public function func(tes $val) : int
    {
        return $val->fc() + 158;
    }
}

$a = new tes();
$b = new tes();
var_dump($b->func($a));
```
数字・関数名変数名は適当。
いや今気がついたけどこのコードだとfcの定義している意味が完全に無いじゃん。
まぁ支障はないので一旦放置。

簡単にコードの説明をしておくと、private変数`$a`を用意しておき、`fc`関数で取得可能。
また`func`関数では、tesクラスのインスタンスを引数とし、`fc`関数と158を足した値を戻す。
そして2つのインスタンスを生成し、片方のインスタンスを引数にもう片方の`func`を呼ぶというもの。

さて、上記コードを実行してみるとどうなるか。

```zsh
php > var_dump($b->func($a));
int(1390)
```
普通に実行できる。

# 何が言いたいのか
つまり、privateな関数や変数[^1]であっても、同じクラス内から呼び出す分には別のインスタンスであっても呼び出すことが可能である。（初知り）

[^1]: 上記コードでは出てこないが、`$val->fc()`を`$val->a`に変えても実行できる

# javascriptでも試してみる。

```js
class tes{
    #a = 1232;
    #fc(){
        return this.#a;
    }

    func(val){
        return val.#fc() + 158;
    }
}

a = new tes();
b = new tes();
console.log(b.func(a));
```
（ちなみに`#`から始まるのをフラグメント演算子というらしいのだが、いつから実装されてるのか不明。[^2]）

[^2]: [ここのサイト](https://confrage.jp/js%E3%81%AE%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AF%E6%8E%A5%E9%A0%AD%E8%BE%9E%E3%81%AB%E3%82%B7%E3%83%A3%E3%83%BC%E3%83%97/)にて、node.jsのv12からという記述は確認。

さて、結果はどうなったのか。ちなみにページを用意するのが面倒だったので、コンソールに投げて実行した。

## safari
ver 14.0

```
SyntaxError: Invalid character: '#'
```
そもそもフラグメント演算子に対応していない

## chrome
ver 86.0

```
1390
```
phpと同様の結果に。

## Firefox
ver 82.0

```
Uncaught SyntaxError: private fields are not currently supported
```
認識はするものの対応自体はしていない模様

## 結果
phpと同じと認識してもいいと思われる

# C#でも試す。

C#というよりunity。

```c#
using UnityEngine;

public class test2 : MonoBehaviour{
    void Start(){
        var a = new tes();
        var b = new tes();
        print(b.func(a));
    }
}
class tes{
    private int a = 1232;
    private int fc(){
        return a;
    }
    public int func(tes val){
        return val.fc() + 158;
    }
}
```
普通に1390と出た。


# 結論
もしかして単純に無知を晒した投稿なのでは？（今更。でも書いてしまった）
「privateは１カプセル毎に個別で持つもの、外部からは一切アクセスできない」という認識があったので少し意外な処理だった。
Existence from the viewpoint of Python

What is identical to itself exists, otherwise not.

Pythonic Zen:

```python
world = [0, 1, 2, 3, float("nan")]
[x for x in world if x == x]
```

Result:

```text
[0, 1, 2, 3]
```

## Explanation

According to IEEE754 (or PEP754),

$\forall$ X, `NaN != X`.

Thus `Nan != Nan`.

## See also

- [What is the rationale for all comparisons returning false for IEEE754 NaN values?](https://stackoverflow.com/q/1565164)
- [PEP 754 -- IEEE 754 Floating Point Special Values](https://www.python.org/dev/peps/pep-0754/)
AmplifyでTTLを設定する

## 概要
[graphql-ttl-transformer](https://github.com/flogy/graphql-ttl-transformer)を利用すると、
AmplifyでDynamoDBをschema.graphqlで管理する場合、例えば以下のように属性の後に@ttlを付けるとTTL(Time To Live)を設定できます

```schema.graphql
type Message @model @key(fields: ["fromUserId", "toUserId"]) {
  fromUserId: String!
  toUserId: String!
  message: String!
  ttl: AWSTimestamp! @ttl
  createdAt: AWSDateTime
  updatedAt: AWSDateTime
}
```

この状態で`amplify push`すれば該当属性（上の例だとttl）にTTLが設定されます
また、TTLを設定可能な型はAWSTimestampとIntのみです

## 導入
`npm install --save graphql-ttl-transformer`した後、
`./amplify/backend/api/<API名>/transform.conf.json`に下記のように`transformers`を追記します

```./amplify/backend/api/<API名>/transform.conf.json
"transformers": [
    "graphql-ttl-transformer"
]
```

## 注意
Amplify ConsoleなどでCI/CDをする場合、ビルド時に`amplifyPush --simple`すると思うのですが、
graphql-ttl-transformerがamplifyPush時に必要になるため、amplifyPushより前に`npm install`もしくは`npm ci`する必要があります

これをしていない場合、ビルド時に`Unable to import custom transformer module`が返ってきます
slick(jquery)の設定方法

#必要なファイルをダウンロードしてくる
公式サイトからとってくる

#必要なファイル
 slick
├ ajax-loader.gif
├ fonts
├ slick-theme.css
├ slick.css
└ slick.min.js

#ファイルを格納
static
├css
　├slick-theme.css
　├slick.css
├js
　├slick.min.js
├ajax-loader.gif

#htmlに記述
    <link th:href="@{/css/slick.css}" rel="stylesheet">
    <link th:href="@{/css/slick-theme.css}" rel="stylesheet">
    <link th:href="@{/css/displayRecipe.css}" rel="stylesheet">
    <script type="text/javascript"
    	src="https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
    <script type="text/javascript" src="js/slick.min.js"></script>
    <script th:inline="javascript">
    	$(function() {
    		$('.slider').slick(); 
    	});
    </script>
1)cssがjsより先に読み込まれる必要がある
2)javascriptより先に、jsを読み込ませる