OmniAICreator/Qiita-1.07M huggingface dataset:
PostgreSQLでテーブル作成のテンプレ

# テーブル作成

- \<table\>: テーブル名
- \<c1\> ~ \<c4\>: カラム名

```.sql
CREATE TABLE <table>
(
  id SERIAL NOT NULL PRIMARY KEY, -- ID
  <c1> VARCHAR(400) NOT NULL,  -- 短い文字列(400文字まで)
  <c2> TEXT NOT NULL, -- 長い文字列
  <c3> INTEGER NOT NULL, -- 整数
  <c4> NUMERIC NOT NULL, -- 小数
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 作成日時
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 更新日時
);
```

# サンプルデータの挿入

```.sql
INSERT INTO <table> 
(
  <c1>, 
  <c2>,
  <c3>,
  <c4>, 
  created_at, 
  updated_at
) 
VALUES

-- 先頭サンプル(必須データ等)
(
  ‘A’,
  ‘BBB’,
  1,
  0.01, 
  TO_TIMESTAMP(‘2000/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS'), 
  TO_TIMESTAMP('2010/12/31 23:59:59', 'YYYY/MM/DD HH24:MI:SS')
)

-- 繰り返しサンプル(ランダムに生成したデータ等、ループ部分)
,(
  ‘X’,
  ‘YYY’,
  9,
  0.09, 
  TO_TIMESTAMP('2007/01/09 09:42:00', 'YYYY/MM/DD HH24:MI:SS'),
  TO_TIMESTAMP('2010/01/27 09:41:00', 'YYYY/MM/DD HH24:MI:SS’)
)

-- 末尾のセミコロン
;
```

# 作成/更新日時の自動コントロール

- 作成日時は変更できないようにする
- 更新日時は自動で記録する

```.sql
-- 関数の作成 (初回のみ)
CREATE FUNCTION auto_timestamp()
RETURNS trigger 
LANGUAGE plpgsql
AS $$
  BEGIN 
    new.created_at = old.created_at;
    new.updated_at = now();
    return new; 
  END; 
$$;

-- テーブルを関数と紐付ける (テーブルの数だけ必要)
CREATE TRIGGER timestamp_<table>
BEFORE UPDATE ON <table>
FOR EACH ROW 
EXECUTE PROCEDURE auto_timestamp();
```

以上、
自分用のメモを共有させていただきました。
誤りがありましたら指摘をお願いします🙇‍♂️
40 代おっさん Amazon Linux2 の初期設定やってみた

## 本記事について

本記事は AWS 初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## OSの確認

```shell
$ cat /etc/system-release
```

Amazon Linux release 2 (Karoo)
となれば問題なし

## パッケージのアップデート

まずは管理者になる

```shell
$ sudo su
```

パッケージのアップデート

```shell
# yum update -y
```

タイムゾーンの設定

```shell
# timedatectl set-timezone Asia/Tokyo
```

こちらを参考にしました
<https://qiita.com/thfree0119/items/489a14e1c3f93b083274>

## 最後に

記事をほとんど丸パクリしてしまった＞＜
自分用にまとめているのですいません！！
IBMCloud Vyatta config-syncのバグ

##内容
Firewallルールにシングル・クォート（'）が使用されると、config-syncが失敗する。

##解決策
この問題を解決するには、VRAを1912h以降のパッチ (最新のパッチは 1912p) にアップグレードする。

##例

```
[シングルクォートを入れてみる]
set security firewall name TEST rule 10 description 'TEST'

vyatta@host1# commit
syncing configuration to remote-router 10.192.189.xxx ..
config-sync error 10.192.189.xxx:Not connected to NETCONF server
syncing configuration to remote-router 10.192.189.xxx ..
remote-router 10.192.189.xxx sync done

vyatta@host1:~$ show config-sync status
remote user is not in secrets group - may incorrectly report not in sync
remote-router:  10.192.189.xxx
  version:              1912f
  sync-map:             SYNC
  last sync status:     succeeded
  last sync time:       2021-08-21 15:17:24.053624
  last successful sync: 2021-08-21 15:17:24.054644
  in-sync?:             no
  access-status:        connected

remote user is not in secrets group - may incorrectly report not in sync
remote-router:  10.192.189.xxx
  version:              1912f
  sync-map:             SYNC
  last sync status:     FAILED
  last sync time:       2021-08-21 15:17:23.250990
  last successful sync: 2021-08-21 15:17:58.603800
  in-sync?:             no
  access-status:        connected

vyatta@host1:~$
vyatta@host1:~$ show config-sync difference
remote user is not in secrets group: difference may incorrectly report not in sync
10.192.189.xxx configuration is out of sync
remote user is not in secrets group: difference may incorrectly report not in sync
10.192.189.xxx configuration is out of sync
AWS セキュリティ(SCS) を取得した

# 前回のお話

https://qiita.com/morio1101/items/7f2115c5869b75a9bdd4

# はじめに

## AWS Certified Security - Specialty について

こう書き始めようとしたけれど以下を見たほうが早いと思うので割愛

https://aws.amazon.com/jp/certification/certified-security-specialty/

試験の出題傾向が知りたい人は本記事は参考になりません
（ほかの取得された人の記事を参考にしたほうがよいと思っています。最後に少しだけ感想としたので参考になれば幸いです）
本記事はあくまで、どう学習したら取得できたかをまとめた記事になります

# 学習教材

## aws WEB問題集で学習しよう

定番の WEB問題集で、現在 #22 (22*7=154問) の問題がある

## Exam Readiness: AWS Certified Security - Specialty (Japanese)

教材の動画はほぼ見ずにWEBページ流し見＋最後の問題を解いていた

https://www.aws.training/Details/eLearning?id=45684

## 模擬試験

とりあえず試験を受けてみると、問題のパターンをインプットできる
=> ただし正しい正解がわからないので、役立つとは言えない

## AWS 認定 セキュリティ・専門知識

専門知識関連で書籍が出ているのが珍しく購入してみた
個人的な感想としては、WEB問題集とExam Readinessの2つで十分合格ラインに到達できそう

# 学習期間

8/1-8/21
(※14に受験したかったけれど、家庭の事情でできなかった)

# 学習方法
()は経過期間

1. WEB問題集をのんびり一通り解く（4日）
    1. 1周目は解説をリンク先まで一通り目を通す
1. WEB問題集2周目を解く（6日）
1. Exam Readiness を一通り見つつ、問題を解く（7日）
1. WEB問題集3週目を1週間掛けてやりつつ、試験本を流し読みして問題を解く（14日）
1. WEB問題集4週目＋ほかの問題のみを解く（20日）
1. そして試験

# 試験結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/50f2cd8d-b5de-f78e-f87d-ea8bbf444e17.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/b4dcd086-209e-1588-b962-dd6190990a4d.png)

自己採点では65問中

* 42問はそこそこ自信あり
* 残り23問で2択絞り9割、自信なし1割
    * 2択絞りでも自信ありなしを考えると5割ぐらい取得できてたら良いかな？と考えて11問程度

大体82%ぐらいかと思っていたら大体それぐらいに収まった
=> 学習方法で学習し蓄積した知識でどうにかなりそうという感想

# 最後に

SCS の学習で SecurityHub、GuardDuty、KMS この3つについては知識面で弱いと感じていた
特に問題の傾向から GuardDuty、Inspector、AWS Config の役割、用途、ベストプラクティスはイメージができるようになっていると良いと感じた

上記からも KMS については問題としてもそれなりの比率で出てきたこともあり結果として、「データ保護」の部分に現れたのだと思う

個人的に、気持ち悪いのは インバウンド、アウトバウンドが送信・受信と表現されていたことから戸惑った
=> 上記のようなケースだと英文を確認するとだいたい解決できた

即答できるような問題が1、2割存在するので、時間を確保するためにも即答できるように備えておいたほうが良い
=> WEB問題集をサクッと解けるようになっていると上記は即答問題は対策できているといえる

WEB問題集の有効期限が9/4なのであと一つを目指すか、ちょっと休憩するかは悩み気味
[Ruby] compactメソッド

##はじめに
オリジナルアプリの改修をしてまして、アルゴリズムを組んでいたら、とても便利なメソッドを見つけましたので記事にしておきます。

##compactメソッド
compactメソッドは配列に含まれるnilを取り除いてくれるものです。

```ruby
array = [1, 2, 3, 4, 5, nil, 6]
except_nil = array.compact

=> [1, 2, 3, 4, 5, 6]

```


私の場合each文でデータベースから値を探して、配列に放り込んでいたときにnilが入ってきたのでcompactを使用しました。

!をつければ破壊的な使い方もできるようです。

```Ruby
array = [1, 2, 3, 4, 5, nil, 6]
array.compact!

=> [1, 2, 3, 4, 5, 6]
```

arrayの中身そのものを書き換えちゃうのですね。
【AWS】ECRのpublicへpushする方法

# はじめに

2020年12月にできた**パブリックリポジトリ**へプッシュする方法です。

**ECR**の**プライベートリポジトリ**へはイメージをプッシュしたことありましたが、
いくつかつまずいたのでこのポイントを載せます！

・AWS-CLIのバージョン
・IAM設定

# AWSCLIのバージョンアップ

バージョン確認。

```
$ aws --version
aws-cli/2.0.8 Python/*****
```
私の場合はバージョンが古く後ほど指定するコマンドが認識されませんでしたので、
先にバージョンアップします。

公式ドキュメントの方法でバージョンアップ。
[macOS での AWS CLI バージョン 2 のインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-mac.html)

```
$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /
```
念のため確認。

```
$ aws --version
aws-cli/2.2.31 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off
```


# ECRのパブリックリポジトリ作成

AWSコンソール画面からリポジトリを作成します。
サービスで**Elastic Container Registry**を選択。

下のように**public**タブを選択し**リポジトリを作成**ボタンを押して作成する。

<img width="1222" alt="8ab9eeb317f2b02750d559853b5d71fb" src="https://user-images.githubusercontent.com/67918886/130318626-e94a56b5-3f4f-463a-aef3-6ba63b774e8d.png">

作成後リポジトリごとの**URI**はタグ付けやプッシュする際に使用する。

# プッシュ方法

まずはリポジトリに対して認証させます。

下の図のようにプッシュコマンドの表示ボタンを押すとその方法がでます。

<img width="946" alt="e11217e5ff2240baa88f08b31bfabb51" src="https://user-images.githubusercontent.com/67918886/130318814-96af464f-cd82-4d39-99fd-31fdecd878f2.png">

ユーザーごとに専用のコマンドが表示されるのでそれをコピペして実行します。

```
$ aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/(それぞれのエイリアス)

Login Succeeded
```

ログイン成功したら**Docker Hub**や**プライベートリポジトリ**と同じようにimageにタグ付けします。方法もそこに記載されています。

```
$ docker tag blog_app:latest public.ecr.aws/（それぞれのエイリアス）/blog_app:latest
```
`blog_app:latest`のイメージ名は読み替えてください。
タグ名変更したらプッシュします。

```
$ docker push public.ecr.aws/(それぞれのエイリアス)/blog_app:latest
```
このとき私はエラーとなりました（ToT）

```
An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:iam::(アカウントID):user/（ユーザー名） is not authorized to perform: ecr-public:GetAuthorizationToken on resource: *
```

あなたは`ecr-public`へ権限ありませんよとなってますが、**AmazonEC2ContainerRegistryFullAccess**はアタッチ済みでした。

# IAM設定

**IAM**の既存のポリシーをよく調べてみたら**AmazonElasticContainerRegistryPublicFullAccess**というポリシーがありました（＊＊）

私の検索方法が悪くなかなかこのポリシーを見つけることができませんでした。。。

<img width="915" alt="395257d07e53ceeaca72c0c5292cbb10" src="https://user-images.githubusercontent.com/67918886/130319320-3eb33b62-160f-4784-9204-0b1955df5769.png">

赤線のやつです！

これで再度`push`コマンドすれば無事アップロードされます！

私もECRは約半年以上振りに触ってつまずきました。
調べたら2020年末に追加された機能で　その間に**CLI**も**IAM**もアップデートされてたんでしょうね（＾ー＾；
m1macのconda環境でpandasのimportが失敗した話

# m1macのconda環境でpandasのimportが失敗した話
表題の通りです。
m1mac、いいですよね。Intel版よりも安くて高性能。
その一方で従来のアプリケーションの対応がとれず、今回もその憂き目に会ってしまったみたい。

# 問題
pandasのimportが上手くいきません。
conda環境を使っていますが、インストールはできました（`conda install pandas`）。
それなのにpythonを実行するとimportができません。
エラーメッセージもなんだかいつもと違って面倒そう・・・

```
>>> import pandas
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/username/.anyenv/envs/pyenv/versions/miniforge3-4.10/envs/sleep-quality/lib/python3.9/site-packages/pandas/__init__.py", line 16, in <module>
    raise ImportError(
ImportError: Unable to import required dependencies:
numpy:

IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

Importing the numpy C-extensions failed. This error can happen for
many reasons, often due to issues with your setup or how NumPy was
installed.

We have compiled some common reasons and troubleshooting tips at:

    https://numpy.org/devdocs/user/troubleshooting-importerror.html

Please note and check the following:

  * The Python version is: Python3.9 from "/Users/username/.anyenv/envs/pyenv/versions/miniforge3-4.10/envs/sleep-quality/bin/python"
  * The NumPy version is: "1.21.1"

and make sure that they are the versions you expect.
Please carefully study the documentation linked above for further help.

Original error was: dlopen(/Users/username/.anyenv/envs/pyenv/versions/miniforge3-4.10/envs/sleep-quality/lib/python3.9/site-packages/numpy/core/_multiarray_umath.cpython-39-darwin.so, 2): Library not loaded: @rpath/libcblas.3.dylib
  Referenced from: /Users/username/.anyenv/envs/pyenv/versions/miniforge3-4.10/envs/sleep-quality/lib/python3.9/site-packages/numpy/core/_multiarray_umath.cpython-39-darwin.so
  Reason: image not found
```

# 解決策
結論から言いますと、install文をこちらに変更することで解決できました。
` conda install -c conda-forge conda-forge::pandas`

## 原因
stack overflowを参考にしました。

https://stackoverflow.com/questions/66354697/conda-3-9-is-not-working-with-numpy-on-macos-reason-image-not-found

チャネルミキシングが原因とかなんとか。
複数のconda仮想環境を作った際に、ライブラリのインストール元を厳密に指定しないと正しいバージョンが入手できない、的なことだと解釈しました（違ったらご指摘していただけると嬉しいです）。

## 環境
OS: macOS Big Sur バージョン11.5.2
pythonバージョン：　python3.9.6
環境: anyenv -> pyenv -> miniforge3-4.10の仮想環境

# 解決までの道のり
## 再インストール
ひとまずエラー文をなんとなく眺めるとnumpyが悪さをしている？
`conda uninstall numpy pandas`した後に`conda install numpy pandas`numpyとpandasを再インストールすることに
->同様のエラーで失敗・・・

環境に色々なライブラリを入れていたせい？
`conda remove -n <env-name> --all`して環境を再構築してnumpyとpandasを再インストール
->同様のエラーで失敗・・・

##ggった結果
ちゃんとエラー文を読んでみると`Library not loaded: @rpath/libcblas.3.dylib`が原因のよう。
なのでこのエラーをggってみることに。

### 1件目
https://github.com/numpy/numpy/issues/12970
 
アップデートやクリーンに関することがあったので実行したものの同様のエラーで失敗・・・

### 2件目
https://sotani.vivaldi.net/2020/07/26/python%E3%81%AE%E5%8B%89%E5%BC%B7%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E3%82%89miniconda%E3%81%8C%E6%AD%BB%E3%82%93%E3%81%A7%E3%81%84%E3%81%9F%E3%81%A8%E3%81%84%E3%81%86%E4%BB%B6/

求めていたことに近そうだったものの、実行方法がわからず時間がかかりそうだったために一時断念・・・

### 3件目
https://stackoverflow.com/questions/66354697/conda-3-9-is-not-working-with-numpy-on-macos-reason-image-not-found

上述したここにたどり着いてなんとか解決
RustでAzure Functionsを使う

触ってみたら思ったより簡単に動かすことができました。

RustはAzure Functionsでは言語としてはサポートされていませんが、
カスタムハンドラーを使用することでデプロイすることが可能です。

https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-custom-handlers

https://docs.microsoft.com/ja-jp/azure/azure-functions/create-first-function-vs-code-other?tabs=rust%2Cwindows

ほとんど公式そのままですが、手元のWindows環境で試してみました。
チュートリアルではwarpをつかっていますが、
せっかくなので最近でてきたaxumを試します。

## 準備

*  Azure Functions Core Toolsをインストールしておきます。

https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=windows%2Ccsharp%2Cbash#v2

## プロジェクト作成

### Azure Functionsのプロジェクト作成

```
func new HttpExample 
```
HttpExampleという名前で作ります。
worker runtimeはcustom
テンプレートはHttpTriggerを選択


### Rustのプロジェクト作成 

**host.json と同じフォルダー**で

```
cargo init --name handler
```

## Axum
axumが動作するようにします。

```toml:Cargo.toml
[dependencies]
axum = "0.1.3"
tokio = { version = "1.10.0", features = ["full"] }
```



```rs:main.rs
use std::{env, net::SocketAddr};
use axum::prelude::*;

#[tokio::main]
async fn main() {

    // build our application with a single route
    let app = route("/api/HttpExample", get(|| async { "Hello, Axum!!" }));

    let port_key = "FUNCTIONS_CUSTOMHANDLER_PORT";
    let port: u16 = match env::var(port_key) {
        Ok(val) => val.parse().expect("Custom Handler port is not a number!"),
        Err(_) => 3000,
    };

    let addr = SocketAddr::from(([127, 0, 0, 1], port));
    
    // run it with hyper on localhost:3000
    axum::Server::bind(&addr)
        .serve(app.into_make_service())
        .await
        .unwrap();
}

```

当然なのですが、routeがazure funtions側と揃っている必要があります。


## 設定ファイルの修正


```json:host.json
  "customHandler": {
    "description": {
      "defaultExecutablePath": "handler.exe",
      "workingDirectory": "",
      "arguments": []
    },
    "enableForwardingHttpRequest": true
```

enableForwardingHttpRequest: trueを追加します。　
これのおかげでとても楽になってます。
WindowsなのでdefaultExecutablePathはhandler.exeを指定します。

```json:function.json
{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
```
サンプルなのでauthLevelはanonymousにしておきます。


## ビルド

できた実行ファイルをプロジェクトルートにコピーしておきます。

```
cargo build --release
cp target/release/handler.exe .
```

## Azureにデプロイ

customランタイムでostypeがwindowsなリソースを作っておきます
cliでやる場合はここら辺を参考に


https://docs.microsoft.com/ja-jp/azure/azure-functions/scripts/functions-cli-create-serverless



![2021-08-21_18h14_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41243/70a2f74f-7014-63ce-a776-490eb8ac024e.png)

リソースできたら、あとはpublish するだけです。

```
func azure functionapp publish axumtest
```

![2021-08-21_19h26_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41243/5aa3b349-487f-380c-1698-e71bd670f991.png)

Windowsでも動きました。すばらしー




## 余談

チュートリアルどおりにすすめたところ`--target=x86_64-unknown-linux-musl`でビルドしており、これがハマりどころではありました。
[rust-musl-builder](https://github.com/emk/rust-musl-builder)を使わせていただくと簡単でした。
そもそもこのサンプルであれば`x86_64-unknown-linux-gnu`でも動きました。
ページごとにturbolinksをON/OFFする【Rails】

## 問題
CSSフレームワークを使ってたり、JSによるDOM操作がCSSに依存するようなコードを書いてるとturbolinksのせいでレイアウトがステートレスじゃなくなってバグる。

## 解決策
headタグ内に

```applictaion.html.haml
%meta{name: "turbolinks-visit-control", content: "reload"}
```
を追加するとフルリロードされ、window.onload, turbolinks:load'も両方発火する。

これをページ毎に設定するには

````applictaion.html.haml
- pages = {"users"=> ["new", "edit"], "items"=> ["new"]}
- if pages.map {|c, a| true if (c == contoller.conroller_name && a.include?(controller.action_name))}.include?(true)
  %meta{name: "turbolinks-visit-control", content: "reload"}
````
のようにすればいい。

アクションだけなら

````haml
- if ["new", "edit"].include?(controller.action_name)
````

または[content_for?](https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for-3F)を使う。
図解で、IBM Code Engine（ソースコードから起動）

# 図解で、IBMCloud, Code Engine（ソースコード編）
IBM Cloud の Code Engineは、サーバーレスのアプリ実行環境。アプリは、（１）コンテナイメージ、（２）ソースコード、（３）バッチジョブのいずれかから起動できる。AWSならBeanstalk、AzureならWebAppと同じかと思いきや、AWS Fargate, Lambda, Beanstalk そして Azure WebApp, Functions, Batch と同じことを IBM Cloud なら Code Engine ひとつだけで実行できるというので検証してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/6f21af83-b185-5c68-4833-5b5a0e3f538c.png)

## Code Engine の中身
複数の仮想サーバーや物理サーバー上で稼働している複雑なコンテナ実行環境（Kubernetes + Knative + Istio + Tekton + 他）は、クラウドベンダーが管理・運用するマネージドサービスとして提供されるため、利用者はアプリをデプロイしたらすぐにインターネットからアプリにアクセスできる。アプリをインターネット公開するためのドメイン(URL)、SSLサーバー証明書、通信を暗号化するhttpsも全て備わっており、利用者が準備しなくてよい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/0a0dc60c-b574-0bb3-ef80-762d2b4d3a00.png)

##（１）ソースコードを準備
- Code Engine で実行するアプリは、Docker チュートリアルの ToDoアプリ を使う
- CI/CDにはDockerfileを指定し、ビルドしたコンテナは IBM Container Registry に出力する
- 作成したソースコードは、下記 GitHub リポジトリに保存した
- [https://github.com/IchiroKano/todoapp](https://github.com/IchiroKano/todoapp)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/1b7f2259-7b90-dc8c-610c-be1877085985.png)

## （２）IBM Code Engine を準備
IBMCloud 管理ポータルにログインしたら、新しいリソース Code Engine を作成する。
(2)-1. リージョンやプロジェクト名などを決めて Code Engine のプロジェクトを作成する
(2)-2. アプリを作成する（作成したプロジェクトの中に、複数のアプリを作成できる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/22f3b2ed-0ce0-5614-7b48-862295ab3384.png)

(2)-3. アプリの作成は、Github リポジトリのソースコードを選んだ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/ec3b47b7-7aa6-c252-3e20-3a94151bee7c.png)

(2)-4. ビルド詳細の編集を確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/b1c95253-33fc-069a-e529-14269f297b05.png)

(2)-5. アプリの設定を保存してデプロイする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/329ede6b-c5df-2ac9-fbb1-20746d4ae479.png)

## （３）アプリにアクセスする
はじめてアプリにアクセスするとき、最小インスタンス数がゼロの場合は、アプリ起動に時間がかかります。ブラウザでURLをクリックしたら数秒待ちます。起動後はアプリがサクサク動きますが、しばらく使わないとすぐにインスタンス数がゼロに戻ります。いつでも素早く使うなら料金かかるけど最小インスタンス数を１以上にしないとダメですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/b71cf2a7-ad33-7357-c713-49b4d911e20a.png)

# まとめ
プログラミングするパソコンにはGithubのCLIだけ使えれば、ビルド環境も不要で、ソースコードを変更するだけで、サーバーやOSなどのインフラ知識がなくても IBM Code Engine サービスを使って簡単に素早くWEBアプリを起動できました。近い将来、仮想サーバー(IaaS)やKubernetesコンテナ基盤を構築して運用するインフラ担当の仕事は無くなってしまいそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189936/a7038680-ca89-b3af-4c33-52d921c1fea8.png)
【PHP】「::class」ってなにしてるの？

phpで開発中になんとなく`::class`を使っていたけど、ちゃんと挙動を理解していなかったのでまとめる。

## 公式を見る
> ::class
> class キーワードでもクラス名の解決を行うことが出来ます。 クラスの名前が ClassName になっているクラスの完全修飾名を取得するにはClassName::class を使います。 これは、名前空間付きのクラスに使うと特に便利です。
> 
> 例14 クラス名の解決

> ```php
> <?php
> namespace NS {
>     class ClassName {
>     }
>     
>     echo ClassName::class;
> }
> ?>
> ```
> 上の例の出力は以下となります。
> 
> ```
> NS\ClassName
> ```

引用元: https://www.php.net/manual/ja/language.oop5.basic.php#language.oop5.basic.class.class

クラスを指定する時にいちいち長ったらしい、名前空間とかを入力しなくても、「`::class`を使えば全部取得するよ」って感じ。

## やってみる

```php
<?php

namespace Sample\Test;

use Hello\Test\B;

class A
{
    //
}

echo A::class . PHP_EOL;
echo B::class . PHP_EOL;
```

出力結果↓

```
Sample\Test\A
Hello\Test\B
```

それぞれ、`クラス名::class`で完全修飾名が取得できている。

### 未定義のクラスでもエラーにならない

実は↑のBクラスはどこにも定義されていない。存在しなくてもuse文に書いてあるとおりに出力されてしまう。
namespaceのuse句では
>実際に対象が使用されるまでエラーは検査されない

らしい。
引用元: https://qiita.com/mpyw/items/525231de63bbece2b3b5#namespace-%E3%81%8B%E3%82%89%E4%BD%95%E3%81%8B%E3%82%92-use-%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88
Ubuntu 20.04 Dockerのmacvlanについて

# macvlanをググる

https://collabnix.com/2-minutes-to-docker-macvlan-networking-a-beginners-guide/


>例えば、ネットワークトラフィックの監視やシステム管理などのレガシーなDockerアプリケーションを構築した場合、物理的なネットワークに直接接続されることが予想されます。 このような状況では、macvlanネットワークドライバを使用して、各コンテナの仮想ネットワークインターフェースにMACアドレスを割り当て、物理ネットワークに直接接続された物理ネットワークインターフェースのように見せることができます。


各コンテナ＝Linuxコンテナ

# どうゆうことなのか？

https://architecting.hateblo.jp/entry/2020/08/13/203010

>Dockerは複数のネットワーク接続方式をネットワークドライバというPluggableな形式でサポートしている。

---

- **Default Bridge**

![](https://cdn-ak.f.st-hatena.com/images/fotolife/h/hogehoge666/20200813/20200813202107.png)


>コンテナ開始時になにも指定しなければコンテナはdocker0に接続される。コンテナにはIPアドレスが付与される。

そうなんだねー。
こんな感じらしい。

---

- **User Defined Bridge**

![](https://cdn-ak.f.st-hatena.com/images/fotolife/h/hogehoge666/20200813/20200813202228.png)

>ユーザーは新たなブリッジを作成することができる。作成されたブリッジに接続されたコンテナにIPアドレスが付与される。コンテナ名とIPアドレスがDNSサービスに登録される。

```
docker network create --driver bridge myBridge
docker run -it ubuntu-image --net=myBridge
```

# で、macvlanは？

- **macvlan**

![](https://cdn-ak.f.st-hatena.com/images/fotolife/h/hogehoge666/20200813/20200813202508.png)

>ホストのEthernetポートに仮想的なポートを作成してコンテナに割り当てる。仮想的なポートは固有のMACアドレスを持っている。また、通常のホストポート同様にIPアドレスを割り当てることができる。
コンテナはホスト外（10.0.0.0/24)とNATなしで通信できる。
**コンテナはmacvlanを利用する他のコンテナと通信することができる。** ←ここ重要。
macvlanの制限事項としてホストのEthernetポートとは通信できない。

```
docker network create --driver macvlan --subnet=10.0.0.0/24 --gateway=10.0.0.1 -o parent=Eth mcv
docker run -it ubuntu-image --net=mcv
```

ほうほう、なるほどねー👍

（了）
Python int too large to convert to SQLite INTEGER

### Python int too large to convert to SQLite INTEGER
のエラーが出た場合(自分は`id`を`uuid`にして`django-taggit`を使ったら出た)

### 解決
```Python
from taggit.managers import TaggableManager
from taggit.models import GenericUUIDTaggedItemBase, TaggedItemBase

class UUIDTaggedItem(GenericUUIDTaggedItemBase, TaggedItemBase):
    class Meta:
        verbose_name = _("Tag")
        verbose_name_plural = _("Tags")

class Hoge(models.Model):
    tags = TaggableManager(blank=True, through=UUIDTaggedItem)
```
`through`で中間テーブルを変更したらいけた。
`verbose_name`とかは適当に変えてください。
[React×Rails]APIモードでの開発の流れ

# はじめに
最近はフロントエンド技術が盛り上がってきたことで、フロントエンドとバックエンドを分離して開発する事が増えました。そこでRailsではAPIモードを使用して必要な情報を渡すのですが、何しろモダンなやり方なので参考資料が少ないです。そこで、備忘録的にまとめておこうと思います。

# 注意点
あくまで開発をしていく上での流れを掴めればいいと思うので、細かいことは省いているのでご了承ください。

## Rails側の実装の流れ

1.APIモードでプロジェクトを立ち上げる。

```bash
$ rails new アプリ名 --api
```

2.モデルの設定(migrationやseed、バリデーションなど)を行う。

3.ルーティングの設定を行う。
※namespaceを用いることで理解しやすくなります。

```routes.rb
Rails.application.routes.draw do
  # namespaceを利用することで、理解しやすくなる
  namespace :api do
　　　　　　　　# 開発途中でAPIの仕様を変更する場合に備えURLにバージョン番号を持たせる
    namespace :v1 do
      # ルーティングを記載
    end
  end
end
```

4.コントローラーの設定を行う。
※ルーティング同様にnamespaceを用いる

```app/controllers/api/v1/users_controller.rb
module Api
  module V1
    class UsersController < ApplicationController
      def index
        users = User.all

        # 渡したいデータをJSON形式で返す
        render json: {
          users: users
        }, status: :ok
      end
    end
  end
end
```

## React側の実装の流れ

1.Reactのプロジェクトを立ち上げる。(名前は任意のもので良いがここではfrontendとする)

```bash
$ npx create-react-app frontend
```

2.データを持つコンポーネント(Container Component)を格納するディレクトリを作成する。

```bash
$ mkdir src/containers
```

3.データを持たないコンポーネント(Presentational Component)を格納するディレクトリを作成する。

```bash
$ mkdir src/conpornents
```

4.利用するURLを記載するファイルを格納するディレクトリを作成する。

```bash
$ mkdir src/urls
```

5.APIを叩く関数を定義するファイルを格納するディレクトリを作成する。

```bash
$ mkdir src/apis
```

6.それぞれコンポーネントを積み上げてビューを作成していく。


# 終わりに
ここではReactを使いましたが、Vueなども似たような感じで使えるので、試してみても面白いかもしれないです。これからこういった手法を取る開発が増えてくると思うので、流れは掴んでおいた方がいいでしょう！
数理計画（labview①）

labviewで”EXCEL①”で記載したモデルで求解してみる。

```
【問題：条件】
　　一週間の製造計画について考えます。（土曜日から金曜日）
　　出荷は翌日朝から実施するため、前日に必要量を製造する。
　　翌週のために金曜日の貯蔵量を守る。

　　目的：製造量を最小化
　　説明変数：製造量
　　制約条件：
　　　・製造量　≦　一日の最大製造量
　　　・製造量　≧　一日の最小製造量
　　　・貯蔵量　≦　貯蔵できる最大量
　　　・貯蔵量　≧　翌日の出荷量
　　　・最終貯蔵量　≧　翌週のための貯蔵量

　　貯蔵量　＝　前日の貯蓄量＋製造量-出荷量
```

ダイヤグラム作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314982/ddea9efb-b0a6-0648-49b7-d069373ea827.png)

実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314982/88b7a232-aaeb-8ba6-db49-b54def11458b.png)


上側が貯蔵量、下側が製造量

EXCELの場合と最小値は同じですが、説明変数の値が異なることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314982/4bbe7282-79a1-c2a9-5dcd-ad3af5953fc0.png)
メールリストを登録し、メールから(募集元/参加者)負担でジムトレーニングを一緒にできるように募集メールを作成するPGM(DuctNeiker)

<h3>メールリストを登録し、メールから(募集元/参加者)負担でジムトレーニングを一緒にできるように募集メールを作成するPGM(DuctNeiker)</h3>
前に作ったAddSpionのPGMを修正して一緒にジムトレーニングしてくれる人を募集する
メールを作成するPGMを作りました
メールではジム参加費を開催者が負担するか、参加者が負担するかを選べるようにしました
あとジムトレーニングサークル用のwikiも作成しました
コロナが収束してから、似たような活動がでてくればいいと思います(2021年8月現在ではまだ難しいですね...)
これでお金がなくてジムに行けないような人でもたまに奢ってもらうようなことができるといいですね（個人的にコロナ終息後にどっかのボランティアサークルが実現してほしい...)
ちなみにプログラムタイトルの意味はDuct(汗だく),Neiker(奢る人)のマイ人工言語です
<hr>
githubURL:https://github.com/NanjoMiyako/DuctNeiker
ジムトレーニングサークルwiki:https://seesaawiki.jp/duct-neiker202108/d/%a5%c8%a5%c3%a5%d7%a5%da%a1%bc%a5%b8
Excel でユーザー定義関数を作る際のまとめ

## はじめに

　Excel でユーザー定義関数を作る際に、よく調べることをまとめました。

## 参考

　以下の記事が割と詳しい。

- [ユーザー定義関数の作成](http://mt-soft.sakura.ne.jp/kyozai/excel_mid/150_macro/50_userfunction/index.html)

## 引数を受け取る

### わりと普通の引数

```vb
Function TestMyFunction(myParam As Long) As Long
```

```vb
Function TestMyFunction2(myParam As Single) As Single
```

### セル選択範囲引数

　Range オブジェクトである。

```vb
Function TestMyFunction3(selectedRange As Range) As Boolean
```

[＠IT：Windows TIPS -- Tips：ユーザー定義関数で任意のセル範囲の値を取得する](https://atmarkit.itmedia.co.jp/fwin2k/win2ktips/514exrng/exrng.html)

### Variant で受け取って、期待する型かどうかチェックする

```vb
Function TestMyFunction4(myParam As Variant) As Boolean
    If TypeName(myParam) = "Variant/Object/Range" Then ...
```

[VBAのVariant型について｜VBA技術解説](https://excel-ubara.com/excelvba4/EXCEL_VBA_441.html)

## 返り値

　配列を返すことで、複数のセルに別々の値を格納することができる。

[＠IT：Windows TIPS -- Tips：Excelのユーザー定義関数で複数の結果値を返す](https://atmarkit.itmedia.co.jp/fwin2k/win2ktips/517exmlt/exmlt.html)

## エラーの出し方

　CVErr()関数でエラーを発生させることができる。CVErr()関数の引数は以下の定数。 

| 定数 | 表示されるエラー | 意味 |
|------|------------------|---|
| xlErrNull | #NULL! | 	指定した2つのセルに共通部分がない。 |
| xlErrDiv0 | #DIV/0 | 値が0もしくは空のセルで割られている |
| xlErrValue | #VALUE! | 引数の形式が過っている。 |
| xlErrRef | #REF! | 無効なセルが参照されている |
| xlErrName | #NAME? | 利用できない文字列が含まれている。 |
| xlErrNum | #NUM! | 値の指定に誤りがある。正当な結果が得られない。 |
| xlErrNA | #N/A | 	対象となるデータが存在しない。 |

```vb
Function SampleFunction() As Variant
    SampleFunction = CVErr(xlErrNA)
End Function
```

[関数内にアクションコードを含めると #VALUE! エラーを返せる](https://support.microsoft.com/ja-jp/office/excel-でカスタム関数を作成する-2f06c10b-3622-40d6-a1b2-b6748ae8231f)。

## 関数の情報を登録する

　Workbook\_Open イベントにて関数を登録する処理を行うと、ヘルプなども追加できるようだ。

[ユーザー定義関数の情報を登録する](http://mt-soft.sakura.ne.jp/kyozai/excel_mid/150_macro/50_userfunction/index.html#regist-function)
WioLTE で MQTT Publish できる最大サイズを調べる

こちらのプログラムを改造して、WioLTE で MQTT Publish できる最大サイズを調べてみました。
[WioLTE で 大きいデータを MQTT Publish する](https://qiita.com/ekzemplaro/items/7a7cbcfca11c2de28dd1)

```text:mqtt_publish/mqtt_publish.ino
// ---------------------------------------------------------------
/*
	mqtt_publish.ino

					Aug/21/2021
*/
// ---------------------------------------------------------------
#include <WioLTEforArduino.h>
#include <WioLTEClient.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <stdio.h>

#define MQTT_SERVER_HOST  "example.com"
#define MQTT_SERVER_PORT  (1883)

#define ID		"WioLTE"
#define OUT_TOPIC	"sample/imageTopic"
#define IN_TOPIC	"sample/imageTopic"

#define INTERVAL	(5000)

WioLTE Wio;
WioLTEClient WioClient(&Wio);
PubSubClient MqttClient;

int	count = 0;
// ---------------------------------------------------------------
void callback(char* topic, byte* payload, unsigned int length)
{
	SerialUSB.println("");
	payload[length] = '\0';
	String msg = String((char*) payload);
	SerialUSB.println(msg);
}

// ---------------------------------------------------------------
void setup()
{
	setupLTE();

	setup_mqtt_proc();

	SerialUSB.println("*** Setup completed *** Aug/21/2021 PM 17:00 ***");
}

// ---------------------------------------------------------------
void loop()
{
	Wio.LedSetRGB(1, 1, 0); 
	MqttClient.loop();
	SerialUSB.println("*** check *** " + String(count));

	mqtt_send_proc(count);

	Wio.LedSetRGB(0, 0, 1); 
	delay(INTERVAL / 4);
	Wio.LedSetRGB(0, 1, 0); 
	delay(INTERVAL / 4);
	Wio.LedSetRGB(1, 1, 1); 
	delay(INTERVAL / 4);
	Wio.LedSetRGB(0, 0, 0); 
	delay(INTERVAL / 4);

	count++;
}

// ---------------------------------------------------------------
void mqtt_send_proc(int count)
{
	DynamicJsonDocument doc(4096);
	char data_json[2048];
	data_json[0] = '\0';

	char *chx = (char *)malloc(2048);
	chx[0] = '\0';

	char qq[51] = "012345678901234567890123456789012345678901234567qq";

	for (int it=0; it<28; it++)
		{
		strcat(chx,qq);
		}

	doc["count"] = count;

	doc["llx"] = String(strlen(chx));
	doc["chx"] = chx;

	serializeJson(doc, data_json);

	SerialUSB.println(data_json);
	SerialUSB.println(strlen(data_json));
	SerialUSB.println(MQTT_MAX_PACKET_SIZE);

	boolean flag = MqttClient.publish(OUT_TOPIC, data_json);
	SerialUSB.println(flag);

	free(chx);
}

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

実行結果
![mqtt_publish_aug21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a0833208-3d92-d111-d90b-b8ed43f5ac89.png)

1433 Byte は Publish できました。
1483 Byte は Publish できませんでした。
【Git】Pushし忘れでリモートとローカルが乖離してしまった話


#結論

* こまめにPushしないとダメ、ゼッタイ！！！


#状況説明と原因

mainとdevelopで分けて個人開発していたとき、
リモートブランチではしっかりとdevelopからmainにマージされているのになぜかローカルでは反映されてない、、、、

````
$ git diff main
````

上記コマンドを実行して差分があることをしっかり確認

なんでこうなった、、、と思っていたら
原因は単純にcommit後のpushし忘れ。。

#対策

###1. git branch -vaでリモートとの差分確認

```
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　コミット番号
* develop                       276a901 Merge pull request #37 from nao0725/main
  help                          3390f3a Add help to text
  remotes/origin/develop        276a901 Merge pull request #37 from nao0725/main
  remotes/origin/help           3390f3a Add help to text
  remotes/origin/home_mk        558bdba Add homes/view to image&title
```
コミット番号276a901からちゃんとmainに渡っていること確認

###2.差分をメモしておく

````
$ git diff main 

$ git diff main > diff.txt
````

上記コマンドを実行して差分をメモしておく


###3.強制的にリモートブランチをローカルブランチに上書き


```
$ git reset --hard origin/develop
```

強制上書き完了。実行は気をつけてください、、、

実行内容はこちら


https://qiita.com/nao0725/items/32b9be18f9e99e9166c4


###4.差分を改めて修正

修正後、developにpushしてからmainにマージする




####投稿者コメント
今回も戒めをこめて記事にしました、、、
ゼッタイPushしましょう、、、

####My Profile
プログラミング学習歴３ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。
深層学習-後編2 -軽量化・高速化技術

ラピッドチャレンジで学習したことを忘れないように残そうかと。

# 軽量化・高速化技術
## 分散深層学習
深層学習は多くのデータを使用したりパラメータ調整に多くの時間を使用する。
高速な計算が必要。
そのため、下記要素が必要。

- データ並列化
データが大きいときに適用すると良い。

- モデル並列化
モデルが大きいときに適用すると良い。
パラメータ数が多いほど、スピードアップ効率も向上する。

- GPUによる高速技術

## データ並列化
- 同期型
各ワーカー(計算資源)の計算が終わるのを待ち、全ワーカーの勾配が出たところで勾配の平均を計算して親モデルのパラメータを更新する。

- 非同期型
各ワーカーはお互いの計算を待たず、各子モデルごとに更新する。
学習が終わった子モデルはパラメータサーバにpushされ、新たに学習を始める時は、パラメータサーバから pop したモデルに対して学習していく。

非同期型は処理のスピードが早い。
ただし、最新のモデルのパラメータを利用できないので、学習が不安定になりやすい。

同期型の方が精度が良い。
現在の主流は同期型。

## モデル並列化
親モデルをワーカーに分割し、それぞれのモデルを学習させる。
全てのデータで学習が終わった後で、一つのモデルに復元する。

パラメータ数が多いモデルの方が効果が高い。

## GPUによる高速化
- GPGPU (General-purpose on GPU)
    いずれもDeep Learningフレームワーク(Tensorflow, Pytorch)で実装されているので、使用する際は上記を指定すれば良い。
開発環境は下記がある。
    - CUDA
    - OpenCL (あまり使われてない)
- CPU
- GPU

## モデルの軽量化
モデルの精度を維持しつつ、パラメータや演算回数を低減する手法。
計算の高速化や小メモリ化を行う。
手法は下記。

## 量子化
64bit浮動小数点を 32 bit など下位の精度に落としてメモリと演算処理を削減する。
- 計算の高速化
- 省メモリ化

重みを浮動小数点のbit数を少なくして有効桁数を下げるとメモリの使用を抑えられる。
一般的に浮動小数点は小数点部分のビットを増やす。
少数部分のビット数を減らすと精度が落ちるけど、必要なビット数が少なくなって、計算量もへる。
桁数が小さくなるが、実際の問題では単精度(16bit)で十分と言われている。
精度が落ちても高速化した方がメリットがある。

## 蒸留
精度の高いモデルはニューロンの規模が大きなモデルで、推論に多くのメモリと演算処理が必要。
規模の大きなモデルの知識を使って軽量なモデルの作成をする。

### 教師モデルと生徒モデル
教師モデルの重みを固定し、生徒モデルの重みを更新していく。
誤差は教師モデルと生徒モデルのそれぞれを使って重みを更新する。

- 教師モデル
予測精度の高い、複雑なモデルやアンサンブルされたモデル。
重いが性能が良い。

- 生徒モデル
教師モデルを元に作られる軽量なモデル。
軽くてほどほど性能が良い。

### プルーニング
パラメータの全部が全部、寄与している訳では無い。
モデルの精度に寄与が少ないニューロンを削除することでモデルの軽量化・高速化を見込める。
【Android】 ToggleButtonのカスタマイズ


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/64d12cf1-8c95-7261-cd7b-63d34be06d71.gif" width=50%>


# はじめに
ToggleButtonのアイコンと背景をカスタマイズする方法。
全体の流れとしては、まず前景画像と背景のレイアウトを`toggle.xml`で記述し、次にそれをToggleButtonのbackgroundに指定する。

# drawable
`state_checked`でON/OFFを切り替える。`layer-list`内に背景とbitmapを記述。

```toggle.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
	<item android:state_checked="true">
		<layer-list>
			<item>
				<shape>
					<corners android:radius="12dp"/>
					<solid android:color="@color/on"/>
				</shape>
			</item>
			<item android:width="60dp" android:height="60dp" android:drawable="@drawable/check_icon" android:gravity="center"/>
		</layer-list>
	</item>
	<item>
		<layer-list>
			<item>
				<shape>
					<corners android:radius="12dp"/>
					<solid android:color="@color/off"/>
				</shape>
			</item>
			<item android:width="60dp" android:height="60dp" android:drawable="@drawable/clear_icon" android:gravity="center"/>
		</layer-list>
	</item>
</selector>
```

# layout
先ほど作成した`toggle.xml`を背景に定義。`textOn`と`textOff`をnullにする。

```activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:app="http://schemas.android.com/apk/res-auto"
	xmlns:tools="http://schemas.android.com/tools"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	tools:context=".MainActivity">

	<ToggleButton
		android:id="@+id/toggle_button"
		android:layout_width="80dp"
		android:layout_height="80dp"
		android:background="@drawable/toggle"
		android:textOff="@null"
		android:textOn="@null"
		app:layout_constraintBottom_toBottomOf="parent"
		app:layout_constraintEnd_toEndOf="parent"
		app:layout_constraintStart_toStartOf="parent"
		app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
```
Pythonで感情極性辞書を用いたテキスト感情分析をつくってみた

　感情極性辞書の「単語感情極性対応表」を用いてテキスト感情分析処理を作ってみたいと思います。

## 単語感情極性対応表とは

東工大の高村教授が公開されている「単語感情極性対応表」で以下のように単語に(ポジティブ)1～(ネガティブ)-1の感情値が振ってある表になります。

優れる:すぐれる:動詞:1
良い:よい:形容詞:0.999995
喜ぶ:よろこぶ:動詞:0.999979
・
・
・
病気:びょうき:名詞:-0.999998
死ぬ:しぬ:動詞:-0.999999
悪い:わるい:形容詞:-1

##実装

それでは、これに形態素解析ツールjanomeと組み合わせて実装していきます。
（janomeをインストールしていなければpipでインストールしておいて下さい。）

まずは下記から単語感情極性対応表をダウンロードしてコードと同じ場所に置きます。

[単語感情極性対応表](http://www.lr.pi.titech.ac.jp/~takamura/pubs/pn_ja.dic)

まずはpythonで単語をキー、感情値を値とした辞書を作成します。

```python
sentiment_dic = {}

with open('pn_ja.dic', 'r') as f:
    lines = f.readlines()
    for line in lines:
        line_components = line.split(':')
        sentiment_dic[line_components[0]] = line_components[3]
```


次にテキストを引数として戻り値で感情値(1～-1)を返す関数を作ります。
内容としてはjanomeを使って形態素解析で取り出した単語を辞書で引いて感情値を取得し平均を取って戻り値で返します。

```python
from janome.tokenizer import Tokenizer

def sentiment_analyse(text):
    t = Tokenizer()
    tokens = t.tokenize(text)
    sentiment_val = 0
    word_cnt = 1e-6  #割り算で使うので0に近い値
    for token in tokens:
        #単語の基本形を取り出し
        word = token.surface
        if word in sentiment_dic:
            sentiment_val = sentiment_val + float(sentiment_dic[word])
            word_cnt += 1

    return round(sentiment_val/word_cnt, 5)
```

それでは簡単な例で確認します。
ポジティブな文章

```python
sentiment_analyse("ご飯が美味しい")
```

出力
0.99136

次にネガティブな文章

```python
sentiment_analyse("注射が痛いくて泣いた")
```

出力 
-0.82049

それなりの値が出ていると思われます。
それでは私の好きな漫画のセリフも入れてみましょう。

①

```python
sentiment_analyse("友達になるのにだって資格なんていらない!!")
```

出力 
0.16587

②

```python
sentiment_analyse("死は全く怖くない一番恐れるのはこの怒りがやがて風化してしまわないかということだ")
```

出力 
-0.69687

③

```python
sentiment_analyse("友達が友達を助けるのは当然だろ。")
```

出力 
0.63386

④

```python
sentiment_analyse("金がありゃオレの友達は死ななかった!!")
```

出力 
-0.49139

⑤

```python
sentiment_analyse("そんな目でみつめるなよ。興奮しちゃうじゃないか。")
```

出力 
-0.83872


どうでしょうか？個人的には⑤はそれほどネガティブではないような気がしますが、それ以外はまあまあだと思います。でも性能を求めるならosetiなどのOSSを使ったり、APIを使ったほうが良いかな。
Domaを書く時に用意する最低限3ファイルの具体例

# Domaでデータアクセスするのに必要なのは以下の3ファイル

1. エンティティ
2.  Daoインターフェース
3.  SQLテンプレート

##1. エンティティ(User.java)
データベースのデータ本体を表すクラス

```Java:User.java
@Table(name = "users")
@Entity 
@Getter
@Setter
public class User extends DomaDtoImopl{
 private static final long serialVersionUID = 123456789123456L
   
   @OriginalStates
   User originalstates;

   @Id
   @Column(name ="user_id")
   @GenerateValue(strategy = GenerationType.IDENTITY)
   Long id;
   String password;
   String firstName;
   String lastName;
}
```
####メモ
@&#xFFF0;OriginalStatesの役割
→更新したいカラムだけ更新する
そもそも、Domaを使用したUPDAT文は以下の操作でレコードを更新する。

> ①updateしたいレコードをselect（自動生成）でEntityクラスに全カラム取る　（レコード数は1件）
②①で取得したEntityクラスの中でupdateしたいカラムのみ変更する
③変更後のEntityクラスをupdateの引数にわたして実行

この時、更新されていない項目もSETの項目には入っていて、同じ値で上書きすることになる。
しかし、@&#xFFF0;OriginalStatesの記述を最初のところに書いておけば、差分だけ更新してくれる。つまり、同じ値だからわざわざ更新する必要のない項目をSETの中には含めない。


##2. Daoインターフェース(UserDao.java)
```Java:UserDao.java
@ConfigureAutowireable
@Dao
public interface UserDao {
    //ユーザーを一件取得する
    @Select
    Optional<User> selectById(Long Id); 

    //ユーザーを登録する
    @Insert
    int insert(User user);

    //ユーザーを更新する
    @Update
    int update(User user);

}
```


## 3.  SQLテンプレート(select.sql)
```sql:select.sql
SELECT
 id
,password
,firstName
,lastName
FROM
 users
```

#### メモ　～ファイルの置き場所とファイル名～
「*src/main/resources/META-INF*」の配下にDaoインターフェースと同じパッケージ構成になるように配置
ファイル名は**Daoインターフェースに定義したメソッド名**として、拡張子は.sqlとする
ES6メソッドの復習 map(), filter(), findIndex(), test()

# ES6の配列メソッド
* 使わなくても別の構文で書ける
* シンプルに書ける
* 実行速度が早いわけではない


## map()
* 配列をイテレートする
* 要素１つずつ処理する
* 新しい配列を生成する

```javascript
const array = [1, 2, 4, 8];
const resultArray = array.map(x => x * 2)
console.log(resultArray)
// output: Array [2, 4, 8, 16]

const object = {
    "hoge": {text: "fuga"},
    "foo":  {text: "bar" },
    "fiz":  {text: "buzz"}
};

const objectToArray = Object.keys(object).map(key => {
    const value = object[key]
    value['id'] = key
    return value
});

console.log(objectToArray)
/*
output: 
[
  { text: 'fuga', id: 'hoge' },
  { text: 'bar', id: 'foo' },
  { text: 'buzz', id: 'fiz' }
]
*/
```


## filter()
* 配列をイテレートする
* 条件がtrueの要素のみ返す

```javascript
const objectArray = [
    { id: "hoge", text: "fuga" },
    { id: "foo",  text: "bar"  },
    { id: "fiz",  text: "buzz" }
];

const result = objectArray.filter(object => {
    return object.id === 'hoge'
})

console.log(result)
// output: [ { id: 'hoge', text: 'fuga' } ]
```

## findIndex()
* 配列をイテレートする
* 条件がtrueの要素が「何番目なのか」を返す

```javascript
const objectArray = [
    { id: "hoge", text: "fuga" },
    { id: "foo",  text: "bar"  },
    { id: "fiz",  text: "buzz" }
];

const index = objectArray.findIndex(object => {
    return object.id === 'hoge'
})

console.log(index)
// output: 0
```

## test()
* 正規表現を使う
* マッチする場合、trueを返す
* マッチしない場合、falseを返す

```javascript
const hoge = "hoge";
const hogefoo = "hogefoo";
const regex = RegExp("hoge*");

console.log(/hoge*/.test(hogefoo)); // true 
const isHoge = regex.test(hogefoo); // true

if (isHoge) {
  console.log("OK");
} else {
  console.log("NG");
}

```
自分的に良くないと思うマネージメントの覚え書き

タイトル通り。
時折更新するつもり。

# エンジニアを遊ばせちゃいけない、と手が空いてきたエンジニアには新しい仕事をどんどん積む

なにが起こるか?
エンジニアは効率良く仕事を終わらせようとする動機を著しく削がれる。
効率良く仕事を片付けるよりダラダラと仕事を引き伸ばした方が仕事量あたりの給与が上がる計算になるので、当然そうするようになる。
生産性は著しく下がる。

どうすれば良いのか?
エンジニアが自分の努力で作り出した余暇を利用しようとしない。

# 生産性を個人の努力に帰す

その前に、組織・チームとしての生産性を向上させるための仕組み作りの方が先。
確かに、エンジニアは個々の能力差がかなり激しくはあるが、それにチーム全体が左右されるのであれば、マネジメントにも問題が無いとは言えない。
理想的なことを言えば、各人がダラダラと仕事をしても成果が出るような仕組みが作れれば良い。
client_loop: send disconnect: Broken pipeの解決方法

VPSにSSH接続を行い、ターミナル経由で数分間操作しないだけで、`client_loop: send disconnect: Broken pipe`という出力とともに、SSH接続が突如切断されてしまい、とても不便だったので、その時の解決方法を本稿では記載します。

# エラー内容
冒頭でも記載した通り、VPSにSSH接続を行い、ターミナル経由で数分間操作しないだけで下記のエラーが出力され、SSH接続が切断されてしまいました。

```bash
client_loop: send disconnect: Broken pipe
```

# 解決方法
放置しているとタイムアウトにより、ssh接続が切断される仕組みになっているらしいので、ホスト（今回はVPS）のSSH接続の設定ファイルである`/etc/ssh/sshd_config`に下記を追記する必要があります。
#### テキストエディタで設定ファイルを開く
```bash
xxx@yyy:~$ sudo vim /etc/ssh/sshd_config
```

#### 最終行に下記を追記する

```bash
ClientAliveInterval 300
```
ClientAliveInterval では、sshd側が一定期間クライアントと通信していないときに、応答確認を行います。
300という数字は、300秒毎（5分毎）に応答確認を行うことによって接続を維持するという設定です。この部分の数字は60や120などでも良いと思います。

#### sshdの再読み込み
```bash
xxx@yyy:~$ sudo systemctl reload sshd.service
```
Twitter APIを使用する上でのハマりポイント

##概要
TypeScriptでTwitter APIを使用する際にハマりやすいポイントを紹介します。TypeScriptじゃなくてももしかしたら有効かもしれません。
##環境
TypeScript 4.1.3
##ハマりポイント
###Developer Portalの設定
####①App permissionsをReadのままにしている
Botを作っているときに、401エラーが出たら大体これです。`App permissions`を`Read and Write`にしましょう。DMを送る場合は`Read and Write and Direct Messages`にする必要があります。また、これらの変更を行なったら必ず`Keys and tokens`から`Access Token and Secret`を再発行してください。再発行しないと変更が反映されません。Created with *** permissionsと書いてあるので、そこを見れば現在のpermissionsが確認できます。
####②CALLBACK URLSを設定していない
`Authentication settings`の`CALLBACK URLS`は必ず設定する必要があります。Webアプリの場合は認証後にリダイレクトされるURLを設定します。ただのBot運用の場合はあまり気にする必要はないと思います。ただし、架空のURLなどは弾かれるので、自分の環境にあったURLを設定するのが無難です。
###型定義をインストールしていない
TypeScriptでライブラリを使用する際に困りがちなのが型定義だと思いますが、npmの`Twitter`にもちゃんと型定義が存在します。`@types/twitter`と`twitter-d`をインストールしましょう。
>
```
npm i @types/twitter --save-dev
```
```
npm i twitter-d --save-dev
```

###リプライを送るBotで`POST statuses/update`のパラメータの記述を間違っている
APIを通してツイートをする際は`POST statuses/update`を使用しますが、エラーが出る場合はパラメータがミスってる可能性が高いです。
####①`auto_populate_reply_metadata`
Twitter APIの日本語リファレンスとしてとても有用な[Syncer様](https://syncer.jp/Web/API/Twitter/REST_API/POST/statuses/update/)ですが、こちらに記載の無いパラメータが存在します。それが`auto_populate_reply_metadata`です。このパラメータはデフォルトが`false`で、`true`にするとリプライ先の@***の情報(ユーザ情報のメタデータ)を自動で付与してくれます。ですので、「あるツイートのリプライ」にリプライする場合など、リプライ先のユーザ情報が多い場合は`true`にしておくと楽になります。ただし、すべてを巻き込んでリプライする形となるので、「リプライ先のリプライ先」に通知を送りたくない場合は`false`にした方がいいです。
<br>
ややこしくなったのでまとめます。
<br>
#####falseの場合
![スクリーンショット 2021-08-21 18.00.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1027863/f9e86625-5437-54e7-a09d-7e5b85746d59.png)
返信先は、あくまでも`in_reply_to_status_id`に指定したツイートのユーザひとりだけです。
#####trueの場合
返信先には、`in_reply_to_status_id`に指定したツイートのユーザだけでなく、そのツイートがさらに他のツイートのリプライだった場合そのリプライ先のユーザも返信先に含まれます。
####②`in_reply_to_status_id`にnumber型のidを指定している
リプライを送ろうとして385エラーが出ている場合、`in_reply_to_status_id`がミスってる可能性が高いです。基本的にリプライを送る際はその前に`GET statuses/mentions_timeline`や`GET search/tweets`でツイートを取得すると思いますが、その際にツイートの`id_str`ではなく`id`を取得してはいけません。`id`は桁数が多すぎて桁落ちしてしまっているので、`id_str`を取得しましょう。そして、`in_reply_to_status_id`にもstring型をそのまま指定してください。わざわざ`parseInt()`などでnumber型に変換する必要はありません。
【Kotlin】kotlin-reflect無しでFunctionReference(KFunction)から情報を読み出す

# TL;DR
- `::Constructor`というような形で取得した`KFunction`は`kotlin.jvm.internal.FunctionReference`にキャストできる[^kfunction-cast]
- `FunctionReference`からは`kotlin-reflect`無しでも様々な情報を得ることができる
- ただし、パッケージ名にも有る通り、`internal`な(= 外部から参照されることを想定していない)`API`を参照することになるため、`Kotlin`の更新で壊れる可能性が有る点には注意が必要
  - 加えて、一部のメソッドは`kotlin-reflect`無しで呼び出すと実行時エラーになる点にも注意が必要

[^kfunction-cast]: `KClass`などから読み出すパターンは想定していません。また、その場合取得できるのは`KFunctionImpl`となるため、この記事で紹介する方法は使えない可能性が有ります。

# 本文
基本的にキャストするだけで全ての情報が取得できるので、サンプルコードとコメントだけで詳細な説明は省きます。

```kotlin
import kotlin.jvm.internal.ClassBasedDeclarationContainer
import kotlin.jvm.internal.FunctionReference

// Sampleクラスのコンストラクタを使って呼び出す例
readInfoSample(::Sample as FunctionReference)

fun readInfoSample(ref: FunctionReference) {
    // メソッドの名前や引数の情報(signature形式)
    val name: String = ref.name
    val signature: String = ref.signature

    // methodでいう所のインスタンスパラメータ
    // objectや、${instance}::${method}の形で取得した場合、当該のインスタンスが返ってくる
    // インスタンスパラメータが設定されない/されていないメソッドの場合、FunctionReference.NO_RECEIVERのインスタンスが返ってくる
    val boundReceiver: Any = ref.boundReceiver

    // このFunctionReferenceを定義するclassまたはファイルの情報
    // 試した限りではnullやClassBasedDeclarationContainer以外の型にならない
    val owner: ClassBasedDeclarationContainer = ref.owner!! as ClassBasedDeclarationContainer
    // java classも読み出せる
    val jClass: Class<*> = owner.jClass
}
```

手元で検証した限り、コンストラクタ、インスタンス関数、トップレベル関数などについてはこの方法で情報を読み出せるようでした。
ただし、冒頭に記載した点には注意が必要です。

## 補足
`jClass`から`Metadata`アノテーションを取得し、`kotlinx-metadata-jvm`で解析することで、より詳細な情報を得ることもできます。
【Quasar】【q-select】when you handle map type, use emit-value and map-options props

> When map-options is used, the model can contain only the value, and it will be mapped against the options to determine its label. There is a performance penalty involved, so use it only if absolutely necessary. It’s not needed, for example, if the model contains the whole Object (so contains the label prop).


```html
<template>
  <div class="q-pa-md" style="max-width: 300px">
    <div class="q-gutter-md">
      <q-badge color="secondary" multi-line>
        Model: "{{ model }}"
      </q-badge>

      <q-select
        filled
        v-model="model"
        :options="options"
        label="Standard"
        emit-value
        map-options
      />
    </div>
  </div>
</template>
```

```javascript
<script>
import { ref } from 'vue'

export default {
  setup () {
    return {
      model: ref(null),

      options: [
        {
          label: 'Google',
          value: 'goog'
        },
        {
          label: 'Facebook',
          value: 'fb'
        },
        {
          label: 'Twitter',
          value: 'twt'
        },
        {
          label: 'Apple',
          value: 'app'
        },
        {
          label: 'Oracle',
          value: 'ora',
          disable: true
        }
      ]
    }
  }
}
</script>
```
初めてのCentOS7：タスクスケジューラみたいに定期でコマンドを動かしたかった

ほぼ、触ったことがなかったんですが
Windowsのタスクスケジューラのように定期的なコマンド実行をしたくて苦労したので
自分の備忘録もかねて

#環境
CentOS7 (VMwareでの仮想環境)
　※GUI有でインストール

#やりたかったこと
Linuxで対応するNICのNWトラフィック量を1時間間隔で調べたい。
1日に1回収集した情報を見やすくするためGREPする。

#準備物
・実行するshellファイル
　※デスクトップ等の保存でOK

・crontab用のconfファイル
　※/etc/cron.d/へ格納すること
　※root権限必須

#実施手順

① Root権限でログインする。

② Shellファイルを作る。
　※テキスト等でコードを作成し拡張子を「.sh」にすればOK

③ 任意の場所にshellファイルを格納する。
　※デスクトップ等で問題ないですが、crontab用のconfファイルで使用します。

④ CLIを開き以下コマンドを実施する
　※shellへ実行権限の付与になります。

```ruby:shellファイルの保存ディレクトリ移動
cd /root/shellファイルの保存ディレクトリ
```
```ruby:shellファイルの実行権限付与
chmod a+x ./shellのファイル名
```
⑤ crontab用のconfファイルを作成する。
　※上は毎時0分にtest1.shを実行する。
　　下は毎日23:30にtest1Grep.shを実行する。

```ruby:crontab用のconfファイル
0 */1	* * *	root	/root/任意の保存場所/test1.sh
30 23	* * *	root	/root/任意の保存場所/Test1Grep.sh
```

⑥ /etc/cron.d/を開き
　⑤で作成したcrontab用のconfファイルを格納する。
　　※root権限で実施すること

⑦ 以下のコマンドを入力しcrontabへの保存を行う。

```ruby:crontabの登録
crontab /etc/cron.d/confファイル名
```
⑧ 以下のコマンドを入力し
　設定したcrontabが登録されていることを確認する

```ruby:crontabの登録
crontab -l
```
⑨ crondのサービスを実行する。

```ruby:crondのサービス起動
systemctl start crond.service
```
⑩ 以下コマンドを入力し、サービスの実行を確認する。

```ruby:crondのサービス確認
systemctl status crond service
```

下の図のように「active」となっていればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475419/4850c950-0664-7886-6e3a-dc498e8fe45f.png)
以上
＜初学者向け＞Gitの最低限の流れ

#はじめに
初めまして、公務員からエンジニア転職を目指して勉強している者です。Gitについて改めて復習したので、まとめていきたいと思います。間違い、アドバイス等あればコメント頂きたいです。
#目次
1.概要
2.Gitの大まかな流れ
3.ブランチについて
4.GitHubと通信
##1.概要
###Gitって何？
分散型バージョン管理システム。ざっくりいうと、ファイルを増やさずに、変更履歴を管理できる。個人、チームで開発を進める時に便利なツール。
###GitHubって何？
Gitを使ったエンジニアを支援するWebサービスの事。きちんと違いがあるので気をつけましょう。
###用語
・ワークツリー：ローカル（自分）の作業環境

・リポジトリ：変更履歴を記録する場所（ローカル環境にあるローカルリポジトリ、リモート環境にあるリモートリポジトリがある）

・ローカルリポジトリリモートリポジトリへ反映させる

・コミット：変更したファイルをgitに登録

・インデックス：コミットするためのファイルを登録

・ステージング：インデックスにコミットするファイルを登録

・ブランチ：（＝枝）メインのブランチとは別に変更履歴を分岐させる。そうする事で、メインは影響受けずに同時に変更を進められる

##2.Gitの大まかな流れ
1.ローカルリポジトリの新規作成をしてリポジトリを作成（最初の1回のみ）
```$git innit```

2.変更履歴を記録
```$git commit -m "メッセージ"```
※"メッセージ"には、どこを変更したか分かる様なメッセージを入れる

```$git add　ファイル名```
※全てコミットする場合は```$git add .```

3.状況確認
```$git diff``` ：リポジトリとワークツリーの変更内容を確認
```$git status``` ：変更ファイルを確認

4.履歴の確認
```$git log```：変更内容を確認

5.元に戻したい時（色々変更してエラーが出たけどどこかわからない・・・一旦戻そう！）
```$git restore <ファイル名>``` ：ワークツリーの変更を取り消す
```$git restore -staged <ファイル名>``` ：ステージにあげたファイル名変更をワークツリーまで戻す

##3.ブランチについて
チーム開発では、ブランチが必要になる（①を作業している時②を作業しないといけない時に同時に進められる）

1.ブランチを作成する
```$git branch ブランチ名```
###ブランチ名について
main : メインで作業してるブランチ
master : 公開するものを置くブランチ
develop : 開発中のものを置くブランチ
release : 次にリリースするものを置くブランチ
feature-* : 新機能開発中に使うブランチ
hotfix-* : 公開中のもののバグ修正用ブランチ

2.ブランチ一覧を表示
```$git branch```
```$git branch -a```  GitHabのブランチも含めた全てを表示
※-a : all

3.ブランチを切り替える（ブランチを作っただけでそこには移動してない）
※HEAD：自分がいるブランチ
```$git switch feature```(例でfeatureとする)
```$git switch -c feature2``` : 分岐のブランチを作成、かつ、そこに移動
※-c : create

4.変更内容をマージ（取り込む）
```$git merge feature``` : 新しいコミットで、mainとfeatureを取り込める
```$git merge origin/main``` : GitHab上のブランチをマージしたい時

5.コンフリクト（変更内容の衝突）
→mainとfeatureで同じ箇所なのに違う編集をしてしまった
<解消方法>
①ファイルの内容を正しい方に修正
②<<,==,>>を削除

##GitHubと通信
1.初期設定
GitHubに登録→Gitの初期設定
```$git config -global user.name "GitHubのユーザーネーム"```
```$git config -global user.email "GitHubのメールアドレス"```

※ローカルにリポジトリがあれば
ローカルと同じ名前のリポジトリをGitHub上にも作る（接続）

2.リモートリポジトリの追加
```$git remote add origin URL```　: リモートのURLをローカルに登録する
→今後、originという名前でGitHubとやりとりできる

3.push（GitHubにコードをアップ）
```$git push origin main```

4.pull（ローカルに取り込み、ワークツリーに変更内容を反映）
= fetch + merge
```$git pull origin main```(origin mainは省略可能）
 ・コンフリクトが起きたら修正が難しい
 ・mainブランチにいる時はpullの方が○

※fetch : ローカルに取り込むだけ
→ワークツリーに反映させたい　: mergeでワークツリーに取り込む
・mainブランチ以外にいる時はfetch + merge　の方が○

5.プルリクエスト（「変更のレビュー→問題なければ取り込む」を依頼する事）
6.コードレビュー
7.merge (変更するを取り込み、ブランチを削除）

#おわりに
うまくまとめれているかわかりませんが、誰かの役に立てたら良いと思います。