OmniAICreator/Qiita-1.07M huggingface dataset:
[Rails]Github Actionsを導入してみる。

# はじめに
最近では、CIの導入は必須となってきました。だからこそ、導入方法や設定方法を知ることは重要です。Githubが提供するCIサービスである、**Github Actions**を紹介しますので、これから活用していけるようにしましょう！

# 使い方
1.アプリのリポジトリ上部にある[Actions]タブから進み、Rubyの[Set up this workflow]ボタンをクリックします。

![スクリーンショット 2021-07-23 13.38.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622448/db58624e-ac0a-0e72-012e-7aa0ec330569.png)

2.ワークフローと呼ばれる一連の処理をYAMLファイルで設定する。
※名前は任意のものでOKです。

```.github/workflows/main.yml
name: Ruby

on: # トリガーを指定する(ここではプッシュとプルリクエスト)
  push:
    branches: # 指定したブランチのみ実行する
      - develop
      - master

  pull_request:

jobs: # 1つ以上のジョブを設定し実行する
  test: # testというジョブを設定
    runs-on: ubuntu-latest # 実行環境のOSを指定

    steps: # ステップ毎にプロセスを実行する
      - uses: actions/checkout@v1

      - name: cache bundle
        uses: actions/cache@v1
        with:
          path: /vendor
          key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-gems-

      - name: cache node_modules
        uses: actions/cache@v1
        with:
          path: node_modules
          key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-node-

      - uses: azure/docker-login@v1
        with:
          login-server: docker.pkg.github.com
          username: ci
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Bundle install
        run: |
          docker-compose run --rm ci bundle install --path vendor/bundle --without development --deployment --jobs=4

      - name: Yarn install
        run: |
          docker-compose run --rm ci yarn install

      - name: Run brakeman
        run: |
          docker-compose run --rm ci bundle exec brakeman -z

      - name: Run rubocop
        run: |
          docker-compose run --rm ci bundle exec rubocop

      - name: Run rspec
        run: |
          docker-compose run --rm ci bundle exec rails db:setup
          docker-compose run --rm ci bundle exec rake spec
```

# 終わりに
CIを設定することで、コードの品質を維持向上できますので、ぜひ活用してみてください！

# 参考
[GitHub Actions]
(https://docs.github.com/ja/actions)

[Github Actionsの使い方メモ]
(https://qiita.com/HeRo/items/935d5e268208d411ab5a)
【Cloud Storage for Firebase】〜has been blocked by CORS policy: No 'Access-Control-Allow-Origin'

クライアントのjavascriptから、Cloud Storage for Firebaseの画像データを扱おうとしたときに、
このようなエラーが出た
>〜has been blocked by CORS policy: No 'Access-Control-Allow-Origin'

CORSの説明はたくさんあるので、この回避方法を共有します。

## １. [GCPコンソール](https://console.cloud.google.com/)を開き、上部のナビゲーションバーにある>_アイコンボタンをクリックしてクラウドターミナルセッションを開始。
![スクリーンショット 2021-07-23 14.02.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477820/15a240cb-6b59-83a7-2974-d97d59b3740c.png)

## ２. 鉛筆アイコンをクリックしてエディターを開き、 cors.jsonファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477820/62a675a9-9040-8f8d-6bee-6ba224415425.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477820/615de932-9938-0c8f-a660-833e7637e24d.png)


## ３. 以下を入力して保存
```cors.json
[
  {
    "origin": ["https://example.com"],
    "method": ["GET"],
    "maxAgeSeconds": 3600
  }
]
```
ここで、　https&#58;//example.comを許可したいドメインに変更する。
もしデバッグ時に全てのドメインを許可する場合には"origin": ["*"]のようにすれば良い。
※セキュリティには十分ご注意ください

## ４. gsutil cors set cors.json gs://your-bucket実行します。（ここに入力するバケットのアドレスは、扱いたい画像が入っているバケットのものを使用すれば良い）

皆様が少しでも苦戦する時間を減らせて、効率的に開発ができるようになればと思います！
【AWS】自動デプロイで502 Bad Gateway

# はじめに

AWSの手動デプロイ時点ではうまくいっていたものの自動デプロイ後に502 Bad Gatewayのエラーに遭遇しました。
解決に至った手順を紹介したいと思います。

# 原因究明

## エラーログの確認①

```:ターミナル（EC2内）
[ec2-user@ip-〇〇 nicecosme]$ sudo less /var/log/nginx/error.log
unix:/var/www/nicecosme/shared/tmp/sockets/unicorn.sock failed (2: No such file or directory)
```

unicorn.sockがない…？

## エラーログの確認②

```:ターミナル（EC2内）
[ec2-user@ip-〇〇 nicecosme]$ cd current
-bash: cd: current: No such file or directory
```

移動できない。currentディレクトリが作成されてないのか。
sharedディレクトリはどうなっているのかも確認してみました。

```:ターミナル（EC2内）
[ec2-user@ip-〇〇 nicecosme]$ cd shared
-bash: cd: shared: No such file or directory
```

やはりsharedディレクトリも作成されていない模様です。
ここで1つ前のディレクトリに戻り、中身を確認してみることにしました。

## ディレクトリの中身の確認

1つ前のディレクトリに戻ってみる

```:ターミナル（EC2内）
[ec2-user@ip-〇〇 nicecosme]$ cd /var/www/
```

ディレクトリの中身を確認

```:ターミナル（EC2内）
[ec2-user@ip-〇〇 www]$ ls
niceCOSME  nicecosme
```

アプリが…２つ…？

niceCOSMEに移動してみる

```:ターミナル（EC2内）
[ec2-user@ip-〇〇 www]$ cd niceCOSME
```

niceCOSMEの中身を確認

```:ターミナル（EC2内）
[ec2-user@ip-〇〇 niceCOSME]$ ls
current  releases  repo  revisions.log  shared
```

currentディレクトリもsharedディレクトリもこっちにあった！
自動デプロイの準備の際に記述したものの中で思い当たるものがあったので該当のファイルを修正してみます。

# 解決法

deploy.rbを修正
スクールのカリキュラムでアプリ名を書くように指示されていた部分をリポジトリ名に変えてみました。

```:config/deploy.rb
set :application, 'niceCOSME’
```

を

```:config/deploy.rb
set :application, 'nicecosme'
```

に変更し、GitHubにコミット→プッシュ。

ローカルで自動デプロイを実行

```:ターミナル（ローカル）
% bundle exec cap production deploy
```

その後確認したところ問題なく自分のアプリが表示されました！
解決までの手順は以上になります。
いつも書いてるなぁというjavascript（同意するチェックなど）

#同意するチェック（リンク版）
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="gOWXONa" data-user="saitotsushin" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/saitotsushin/pen/gOWXONa">
  </a> by saitotsushin@gmail.com (<a href="https://codepen.io/saitotsushin">@saitotsushin</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

#同意するチェックボックス（フォーム・ボタン版）
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="mdmqydJ" data-user="saitotsushin" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/saitotsushin/pen/mdmqydJ">
  同意するチェックボックス（フォーム版）</a> by saitotsushin@gmail.com (<a href="https://codepen.io/saitotsushin">@saitotsushin</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
画面遷移の流れ

#・画面遷移のながれについて

画面遷移の流れは大きく分けて、以下のようになる

###①Storyboardから遷移先のViewControllerを生成

```swift 
//Storyboardで Is Initial View Controllerにチェックが付いている画面が呼び出される
 guard let vc = UIStoryboard.init(name: "Second", bundle: nil).instantiateInitialViewController() as? SecondViewController else {
            return
        }
```

###②遷移のためのメソッドを呼び出す

```swift 
//今回はpresent()を使う
present(vc, animated: true, completion: nil)
```
DatabricksにてAzure Database for MySQLにてHive Metastore構築時におけるTable "columns_v2"...というエラーへの対応方法について

## 概要
DatabricksにてAzure Database for MySQLにてHive Metastoreを構築しようとした際に、テーブル作成時に下記のようなエラーがでたおけるTable "columns_v2"...というエラーへの対応方法について紹介します。

> Error in SQL statement: AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:javax.jdo.JDOUserException: Table "columns_v2" has been specified with a primary-key to include column "COLUMN_NAME" but this column is not found in the table. Please check your column specification.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a4ce9706-db42-9ce3-c08a-89729d145c8f.png)

ドキュメントに記載されている`lower_case_table_names`の設定が適切に設定できない場合のエラーメッセージのようです。私はサーバーの再起動を実施していなかったため、本記事エラーにぶつかってしまいました。
引用元：![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/922e775e-61d8-8fa9-1cc7-d013b6145e73.png)
[外部Apache Hiveメタストア - Azure Databricks - Workspace | Microsoft Docs​​​​​​​](https://docs.microsoft.com/ja-jp/azure/databricks/data/metastores/external-hive-metastore)

## 手順
### 1. AzureポータルにてAzure Database for MySQLに移動後、`サーバーパラメータ`にて`lower_case_table_names`の値を`2`に変更して`保存`ボタンを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2a445ca2-d07e-5ccf-8ead-6512856890ad.png)

### 2. `概要`タブを選択後、`再起動`をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4fe31639-7c7e-92dc-d0d5-508caa306b3f.png)

## 3. 再起動後に、テーブル作成が可能であることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/37e2e712-32bd-aead-7a3e-3a3e92e433a6.png)
Delegateについて

#・Delegateとは？
Swiftにおけるイベント通知パターンの一つである。あるオブジェクトの処理を別のオブジェクトに代替させる。
      
##・Delegateのイベント通知から処理の流れは大まかに、以下のようになっている                                                                              

####①イベントの発生を検知
処理を任せる側がユーザーからの画面のタッチなどのイベントを検知し、処理を任せられる側（委譲先）に通知する。

####②イベント発生後にしたい処理
処理を任せる側(委譲元)から送られてきた通知から、処理を任せられる側（委譲先）が具体的な処理を行う。

#・処理を任せる側（委譲元）で行うこと
処理を任せる相手を保持するプロパティを持つ

#・処理を任せられる側（委譲先）で行うこと
①委譲先においてprotocolを準拠
②委譲先の指定
③必須の関数（デリゲートメソッド）の記述

#・具体例

・プロトコルの実装

```swift 
protocol SomeDelegate : class {
    func sayHello()
}
```

・処理を任せる側の実装

```swift
final class Person {

    // 委譲先を保持するプロパティ
    weak var delegate : SomeDelegate?
    
    func say() {
        delegate?.sayHello()
    }   
}
```

・処理を任せられる側の実装

```swift 
final class Okadai {
    
}

//extensionでデリゲートメソッドを記述
extension Okadai : SomeDelegate {
    
    func sayHello() {
        print("Hello, I'm Okadai")
    }

}
```

・デリゲートをセットして、実行する

```swift
import UIKit

final class InitialViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let person = Person()
        let okadai = Okadai()
        

        // 処理を任せる相手（委譲先）をokadaiに指定する
        person.delegate = okadai
        
        person.say() // "Hello, I'm Okadai"
        
        
    }
}
```
CloudFormationのリソースごとの!Ref/!GetAtt戻り値メモ

CloudFormationでリソースのARNやリソースを取得する際、!Refと!GetAttどちらを使うべきか等迷うことがあるので、関連する戻り値のメモです。

| Service | Resource | !Refの戻り値 | !GetAttの戻り値 |
|:-:|:-:|:-:|:-:|
| AWS IAM | [Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html) | ロール名 | .Arn : ARN <br> .RoleId : ロールID   |
| AWS IAM | [Policy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html) | ポリシー名 | 無し |
|Amazon VPC| [VPC](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html)| VPC ID | .CidrBlockAssociations : CIDR block association IDs 他 |
|Amazon VPC|[Subnet](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html) | Subnet ID | .VpcId : サブネットの属するVPCのVPC ID 他 |
|Amazon EC2| [Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) [^1] |   インスタンスID | .PrivateDnsName : プライベードDNS名 <br> .PublicDnsName : パブリックDNS名 他|
|AWS Lambda|[Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)|関数名 |.Arn : ARN |
| Amazon S3 |[Bucket](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html)| バケット名 |.Arn : ARN 他  |
|Amazon DynamoDB| [Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html)| 表名 | .Arn : ARN |
|Amazon RDS| [DBCluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html) [^2] | クラスター名 | .Endpoint.Address : 接続エンドポイント <br> .ReadEndpoint.Address : 読み取りエンドポイント|
|Amazon API Gateway (v2) | [Api](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigatewayv2-api.html) [^3]| API ID | .ApiEndpoint : APIエンドポイント  |
|Elastic Load Balancing | [LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html)| ARN | .LoadBalancerName : ロードバランサー名 <br> .LoadBalancerFullName : ロードバランサーのフル名称|
|Amazon SNS| [Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html) | ARN  | .TopicName : Topic名  |
|Amazon SQS| [Queue](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sqs-queues.html) | キューURL  | .Arn : ARN　<br> .QueueName : キュー名|
|Amazon Kinesis| [Stream](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-stream.html) | ストリーム名 | .Arn : ARN  |


[^1]: ECRインスタンスのARNは、"arn:aws:ec2:{\$REGION}:{\$ACCOUNT_ID}:instance/{\$instance-id}"
[^2]: [RDSのARN](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_Tagging.ARN.html)
[^3]: [API GatewayのARN](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/arn-format-reference.html)
配列について簡単にまとめてみた（つもり）

![IMG_20210718_170616.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293580/23d27f31-0b5b-03e7-66d6-0e58be4d5647.jpeg)
配列についての簡単な説明です

動画での解説もしてます
https://youtu.be/0qfjf1rbHMY
コピペでCSVファイルをデータベースに入力する(Ruby, Ruby on Rails)



1.railsのdbフォルダーののなかにCSVファイルを入れる！

2.db/seedsrbに書き込み！

```ruby:db/seeds.rb
require "csv"

#「header: true」とするとCSVの1行目の行情報でハッシュのように扱える
CSV.foreach('CSVファイルのパス',headers: true) do |row|
  モデル名.create(
    カラム名:     row['csvファイルの列'],#row[0]のように列指定もできる
    カラム名:     row['csvファイルの列']
  )
end

```

3.ターミナルで「rake db:seed」と打ち込む！

```:ターミナル
% rake db:seed
```
これで完成！！
WioLTE: SORACOM Harvest にデータを送る

Wio LTE for Arduino で SORACOM Harvest にデータを送るサンプルです。
ダミーの温度と湿度を送っています。

## プログラム

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

					Aug/26/2024
*/
// ---------------------------------------------------------------
#define	PROGRAM	"soracom_harvest_test.ino"
#define	VERSION	"2024-8-26 PM 13:49"

#include <WioLTEforArduino.h>
#include <stdio.h>

#define INTERVAL				(6000)
#define RECEIVE_TIMEOUT (15000)

WioLTE Wio;


float tt_aa[] = {20.1, 22.3, 24.8, 25.6, 26.7, 26.1, 25.3, 24.8, 22.6, 21.7};
float hh_aa[] = {50.1, 62.3, 64.8, 75.6, 76.7, 74.1, 72.3, 64.8, 60.6, 56.7};

int icount = 0;

// ---------------------------------------------------------------
void setup() {
	delay(200);

	SerialUSB.println("");
	SerialUSB.println("*** START ***");

	setupLTE();

	SerialUSB.println(PROGRAM);
	SerialUSB.println(VERSION);
	SerialUSB.println("### Setup completed. ***");

}

// ---------------------------------------------------------------
void loop() {
	char data[100];

	float temp;
	float humi;

	int index = icount % 10;
	temp=tt_aa[index];
	humi = hh_aa[index];

	SerialUSB.println("icount = " + String(icount));

	SerialUSB.print("Current humidity = ");
	SerialUSB.print(humi);
	SerialUSB.print("%	");
	SerialUSB.print("temperature = ");
	SerialUSB.print(temp);
	SerialUSB.println("C");
	SerialUSB.println(String(millis()/ 1000));

sprintf(data,"{\"temp\":%.1f,\"humi\":%.1f}", temp, humi);

	SerialUSB.println("### Open.");
	int connectId;
	connectId = Wio.SocketOpen("harvest.soracom.io", 8514, WIOLTE_UDP);
	if (connectId < 0) {
		SerialUSB.println("### ERROR! SocketOpen ###");
		goto err;
	}

	SerialUSB.println("### Send.");
	SerialUSB.print("Send:");
	SerialUSB.print(data);
	SerialUSB.println("");
	if (!Wio.SocketSend(connectId, data)) {
		SerialUSB.println("### ERROR! SocketSend ###");
		goto err_close;
	}

	SerialUSB.println("### Receive.");
	int length;
	length = Wio.SocketReceive(connectId, data, sizeof (data), RECEIVE_TIMEOUT);
	if (length < 0) {
		SerialUSB.println("### ERROR! SocketReceive ###");
		goto err_close;
	}
	if (length == 0) {
		SerialUSB.println("### RECEIVE TIMEOUT! ###");
		goto err_close;
	}
	SerialUSB.print("Receive:");
	SerialUSB.print(data);
	SerialUSB.println("");

err_close:
	SerialUSB.println("### Close.");
	if (!Wio.SocketClose(connectId)) {
		SerialUSB.println("### ERROR! SocketClose ###");
		goto err;
	}

err:
	delay(INTERVAL);
	icount++;
}

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

Soracom Harvest で送られたデータを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/08ed1722-60fa-1140-4e11-f369dc065895.png)



シリアルモニタの表示
![harvest_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/90956b8d-148d-b412-9c0a-77ec3bcd8e0b.png)
[Vuetify]v-btn-toggle内のボタン幅をレスポンシブ対応

# 概要

```$vuetify.breakpoint``` を用いて画面幅に合わせてボタン幅を制御

1. min-widthをcomputedプロパティminWidthとバインドさせる
1. ```this.$vuetify.breakpoint.width```で画面幅を取得
1. 画面幅の値によってminWidthの値を分岐させる

```vue
// 1~5までの５段階評価を行うトグルボタン
<template>
 ...
   <v-btn-toggle
      v-model="value"
   >
      <v-btn
         v-for="n in 5"
         :key="n"
         :value="n"
         :min-width="minWidth"
      >
         {{ n }}
      </v-btn>
   </v-btn-toggle>
 ...
</template>

<script>
export default {
  data() {
    return {
      value: null
    }
  },
  computed: {
    minWidth() {
      return this.$vuetify.breakpoint.width <= 600 ? 24 : 48
    }
  },
  ...
</script>
```
# まとめ
トグルボタンのボタン幅の最小値は48pxがデフォルトで、それ以下にしたいときはmin-width属性で指定する必要がある
→グリッドシステムで幅を調節するのは大変そう
→**画面幅を取得しmin-widthの値を動的に制御する**

# $vuetify.breakpointによるレスポンシブ対応例
### 2パターンの対応例
widthプロパティにアクセス：ピクセル値で分岐

```vue
<script>
...
  computed: {
    width() {
      return this.$vuetify.breakpoint.width <= 600 ? 24 : 48
    }
  },
...
</script>
```

### 3パターン以上の対応例
nameプロパティにアクセス：ブレークポイントで分岐

```vue
<script>
...
  computed: {
    width() {
      switch(this.$vuetify.breakpoint.name) { // 
         case 'xs': return '24'
         case 'sm': return '30'
         case 'md': return '36'
         default: return '48'
      }
    }
  },
...
</script>
```

# 参考文献
https://vuetifyjs.com/ja/features/breakpoints/
Ubuntuがぶっ壊れた時の対処法

Ubuntuのアップデート中にPCの電源が切れてえらいことになったので、この記事を書こうと思います。

## ことの発端　（※読み飛ばしてください※）
あれは暑い夏の日でした。アップデートに時間がかかるので少し散歩でも行こうかと思い、着替えて散歩に行ってしまいました。

帰ってきてPCを見ると画面が真っ暗だったので「やっと終わったか」と思いPCを起動してみました。
途中で充電がないことに気づき充電したのですが、起動しなくよくわからんコマンドラインが出てきて、何を押しても反応しなくなってしまいました。

「これは困った」っと思い全力で直していったのですが、一向に直らず、最終的に初期化しました。

## 環境
Ubuntu 18.04
#今回やったこと
ネットで調べますと「Advanced options for Ubuntu」を選択して、リカバリーモードを選択し、その中の「recovery menu」の中から、いくつか選ぶのです。

## dpkg
最初にやったことは「dpkg」
これは、パッケージを修正するもので、これを選択すると修正されるらしいが
失敗に終わる
コマンドラインが動いたが何が起きたか分からずrecovery menuに戻る

## root
次にやったことは、「root」
これは、rootにshellを起動させるもので、これで何か打つらしい。shell操作はできるもののそれで何をすればいいのか分からずexit

## clean
次にやったことは「clean」
これは、保存されているパッケージアーカイブ(/var/cache/apt/archives 以下)を削除するらしいが
失敗に終わる
コマンドラインが動いたが何が起きたか分からずrecovery menuに戻る

## resume
次にやったことは「resume」
これは、通常の起動を再開するものらしく、普段使っているデスクトップに戻ることができた。
（しかし、明るさを変えることができず、しかも明るさMAX）

## 無念の初期化
で、まあ一応Ubuntuを動かせるようになったのだが、これだと毎回「Advanced options for Ubuntu」から入って、しかも明るさ変更ができないUbuntuになってしまうので、泣く泣く初期化した。


```bash
$ sudo dpkg --configure -a
$ sudo apt-get update
$ sudo apt-get -f install
$ sudo apt-get install --reinstall ubuntu-desktop
$ sudo apt-get autoremove
$ sudo apt-get clean
$ sudo reboot
```

これで初期化して、今もう一度アップデートしています。

#あとがき
やってることは大したことないのに、6時間ぐらいかけてしまった。
私は普段、23時には寝ているのに1時を回ろうとしている。

パソコンを触っている人は夜起きているイメージがあるかもしれないが、ド朝方なので今辛いけどなんとができました。

また明日から、サーバー構築していきたいですね。

夜遅くて言葉が所々おかしかったかもしれませんが、終わりにします。おやすみ
ECS(FARGATE) と ECR

教材
-
https://www.youtube.com/watch?v=2_FxLp9xgmo

https://kleinblog.net/ecs-ecr-hello-world.html

前提
-
https://qiita.com/sanajima/items/cfbac6635b48890a1ba9
の通りローカルでDockerコンテナ作成しておきHelloWorldできるようにしておく

完成形
-


作業（ローカル）
-
①Windows10のターミナルを開きUbuntuのウィンドウを開きます
②作業ディレクトリを作成してDockerFileを作成します

mkdir ecs_test

cd ecs_test

code Dockerfile（VSCodeを使用している場合）

FROM nginx:latest
COPY ./src /usr/share/nginx/html

③htmlファイルを作成します

mkdir src

code src/index.html

Hello world from ECS nginx!!!

④Dockerファイルのあるディレクトリで
docker build . -t hello-world-from-ecs

⑤docker images
としてイメージが出来ていることを確認する

⑥ docker run --rm -d -p 80:80 hello-world-from-ecs
としてブラウザ表示してみる
または、Docker For Windowsのアプリから「OPEN IN BROWSER｝してみる


作業（AWSマネジメントコンソール→ECR）
-

⑦ECRを開く（←間違えないように！！）

⑧リポジトリを作成する「hello-world-from-ecs」というリポジトリ名で。

⑨プッシュコマンドの表示をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178985/8f7a1317-a498-e46b-db78-21e69a7ca46a.png)

Linuxを参考にする。
参考サイトにあるように、「docker build -t hello-world-from-ecs .」は飛ばす
（ローカルで実施ずみだから）


★aws ecr get-login-password ～が失敗するときは
ホームディレクトリの.awsフォルダの中の認証情報のファイルを見直す

vi credentials

作業（VPCその他を作成）
-

⑪VPCを作成する
⑫サブネットを作成する
⑬インターネットゲートウェイを作成する→先ほど作ったVPCにアタッチする
⑭ルートテーブルを作成する→きほど作ったサブネットを紐づける
⑮ルートテーブルのルートの設定で「0.0.0.0/0」を先ほど作ったインターネットゲートウェイを指定する

作業（AWSマネジメントコンソール→ECS）
-

⑯ECSを開く←間違えない

⑰今すぐ始める→クラスターの作成→ネットワーキングのみ（FARGATEを使用）→名前を付ける

⑱タスク定義→新しいタスク定義の作成→Fargate→名前を付ける・コンテナを指定する（先ほど作ったECR）

**大事！！
「タスクロール	:　なし」
「タスク実行IAMロール	:　新しいロールの作成」
「ポートマッピング	コンテナポート：80 , プロトコル：tcp」
を指定または選びます。**

⑲もう一度クラスター →　サービス→ 作成 →起動タイプ「Fargate」
→名前を付ける、タスクの数1とかにする
→ネットワークの設定で、先ほど作ったVPCやサブネットを指定する
→「パブリックIPの割当て	ENABLED」

でサービスを作成し、PublicIPをブラウザに入れると、HelloWorldできます。

-
所感

AWSの画面が変更されているので読み替えながら、実施しました
Android Studio で エミュレータが起動しない。

エラーメッセージは、こんな感じ。

```
Error while waiting for device: The emulator process for AVD Pixel_4_API_30 was killed.
```

理由はよくわからないんだけど。。。
Android 11, 10 はダメみたい。。。

Android 9 を利用する。

メニューから
`Tools` - `AVD Manager`
を選択
`Create Virtual Device` をクリック

```
Phone
   Pixel 2
```

```
Select a system image
    x86 Images
        Pie x86_64 Android9.0 (Google Play)
```

をダウンロードして選択
Swiper.jsを使うメリットと基本の使い方

#Swiper.jsとは？
Swiper.js(スワイパー)とは、スライダーが簡単に作成できるJacaScriptのライブラリです。
レスポンシブ対応が簡単にできてjQueryも使う必要がないため人気のライブラリとなっています。

#Swiper.jsのメリット
1. jQueryが不要
1. レスポンシブ対応しており、スマホイベントも使用可能
1. オプションやコールバック関数が充実しているためカスタマイズ性に富み、デザインの良いスライダーができる

#Swiper.jsのデメリット
1. 古いブラウザに対応していない
1. Swiper.jsのバージョンが5.0以降はInternet Explorerに対応していない

#Swiper.jsのダウンロード
今回はCDNを読み込んでダウンロードしていこうと思います。
npmを使ってもインストールできます。

公式サイトより最新のCDNを読み込んでください。
https://swiperjs.com/get-started#use-swiper-from-cdn

linkタグはhead内に、scriptタグはbodytoj直後に記述します。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://unpkg.com/swiper/swiper-bundle.css" />
    <link rel="stylesheet" href="https://unpkg.com/swiper/swiper-bundle.min.css" />
    <title>Swiperテスト</title>
</head>

<body>
//内容がはいります
</body>
<script src="https://unpkg.com/swiper/swiper-bundle.js"></script>
<script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>
</html>

```


#HTMLの記述
`swiper-container > swiper-wrapper > swiper-slide`といった構造で記述するとスライドできるようになります。
ページネーションやナビゲーションボタン、スクロールバーはオプションになるので必要に応じて記述してください。

```html
<body>
    <!-- スライダー全体をまとめる div要素 -->
    <div class="swiper-container">
        <!-- スライドをまとめる div要素 -->
        <div class="swiper-wrapper">
            <!-- それぞれのスライドを囲む div要素 -->
            <div class="swiper-slide">
                <p>いちご</p>
                <img src="" alt="" width="300">
            </div>
            <div class="swiper-slide">
                <p>りんご</p>
                <img src="" alt="" width="300">
            </div>
            <div class="swiper-slide">
                <p>もも</p>
                <img src="" alt="" width="300">
            </div>
        </div>

        <!-- ページネーション -->
        <div class="swiper-pagination"></div>

        <!-- 次に進むボタンや戻る釦 -->
        <div class="swiper-button-prev"></div>
        <div class="swiper-button-next"></div>

        <!-- スクロールバー -->
        <div class="swiper-scrollbar"></div> 
    </div>

</body>

```

#CSSの記述
スライダーの大きさを指定します。
他にもつけたいCSSがあれば追記してください。

```css
 .swiper-container {
   width: 600px;
   height: 600px;
}
```


#参考
[スライダープラグイン Swiper（v5/v6）の使い方](https://www.webdesignleaves.com/pr/plugins/swiper_js.html)
[スライダーSwiper.js 基本の使い方解説](https://cooen.jp/archives/510)
[Swiper.jsの使い方「レスポンシブ等の具体例」とオプション解説](https://stand-4u.com/web/javascript/swiper.html)
[Getting Started With Swiper](https://swiperjs.com/get-started#install-from-npm)
Android Studio で Build ができない。

Buildを行うとこんな感じ。
とりあえず、回避。

```
Executing tasks: [clean, :app:assembleDebug] in project C:\Users\xxxx\AndroidStudioProjects\MyApplication

Build-tool 31.0.0 is missing DX at C:\Users\xxxx\AppData\Local\Android\Sdk\build-tools\31.0.0\dx.bat
Build-tool 31.0.0 is missing DX at C:\Users\xxxx\AppData\Local\Android\Sdk\build-tools\31.0.0\dx.bat

FAILURE: Build failed with an exception.

* What went wrong:
Could not determine the dependencies of task ':app:compileDebugJavaWithJavac'.
> Installed Build Tools revision 31.0.0 is corrupted. Remove and install again using the SDK Manager.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 2s
```

`Tools - SDK Manager`
から
`SDK Platforms`
で以下をチェック

 - Android 11.0(R)
 - Android 10.0(Q)
 - Android 9.0(Pie)

`SDK Tools`
で
`Show Package Details`
にチェックをつけて
以下をチェック

 Android SDK Build-Tools 31

 - 31.0.0
 - 30.0.3
 - 29.0.3
 - 28.0.3
 - 27.0.3

以下のファイルを修正

```.\app\build.gradle
  android {
    compileSdkVersion 30 <<<
    buildToolsVersion "30.0.3" <<<

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 19
        targetSdkVersion 30 <<<
```

Build - Rebuild Project
を実行
RubyでDateとTimeを誤って比較した際、DateはUTCの0時になってTimeと比較する

ちゃんと意識できていれば踏まないかと思いますが、念の為備忘で書いておきます。

Rails 6.1.3.1
ruby 3.0.0

```ruby
$ date = Date.current
=> Fri, 23 Jul 2021

$ time = Time.zone.local(2021, 7, 23, 8. 59)
=> Fri, 23 Jul 2021 08:59:00.000000000 JST +09:00

$ date < time
=> false

$ time = Time.zone.local(2021, 7, 23, 9. 1)
=> Fri, 23 Jul 2021 09:01:00.000000000 JST +09:00

$ date < time
=> true
```

上記の通り、dateがUTCの0時（JSTの9時）になって、timeと比較しているのが分かります。
単純にdateとtimeを意識していれば起こり得ないですが、バグが起きた時の原因調査として残しておきます。
Elmer に UNV を読み込ませる

# はじめに
以前の投稿で、`Elmer`にSTLデータを読み込ませましたが、`UNV`形式のデータが強そうなので読み込ませます。
# Salome
![20210723a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/538cc72f-2fa6-3313-25eb-711683ff0e02.png)
[「Elmer」ではじめる連成解析](http://www.kohgakusha.co.jp/books/detail/978-4-7775-2128-9) にある Linear elasticity equation – 3D – Loaded elastic beam 風の例題に沿って進めますが、ここでは`Salome`でメッシュを切ってしまいます。

つ、強そう
# Elmer
![20210723b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/83b56c08-ffbc-4942-b910-2ab7c78da422.png)
`Elmer`で読み込みます。
![20210723c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/41dd66d1-f95b-6ff1-48cd-c292e89e9a9a.png)
この時、`Boundary`が一つしかないため、分割を行います。
![20210723d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/437dd083-36f7-82d2-d65b-1b4b2fd3ed69.png)
`Boundary`が６つになりました。
# 成功
![20210723e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/d2a26308-abc5-5c65-5e9d-d853d818a4df.png)
理論値の半分くらいですが、よしとしましょう。
# meshデータ
`mesh.header`を見てみます。

```header.cpp
15616 3375 1350
2
408 1350 //　サーフェスのノード数が8
820 3375 //　ボディのノード数が20
```
中間節点がありますので、四角形で8、立方体で20となっています。
# まとめ
+ Elmer さんありがとう
+ Salome さんありがとう
+ 「Elmer」ではじめる連成解析 さんありがとう
Before starting UiPath:スイッチ

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

★★★この記事はUiPathブログ発信チャレンジ2021サマー、7/23の記事です。★★★

今回は、ちょっとしたシリーズです。UiPathを使うに当たって、UiPathの機能ではなく、コンピュータ言語を使う上での基礎知識を展開していこうと思います。

#スイッチ

コンピュータの世界で、条件分岐は、ある条件を満たす場合と、満たさない場合と、２分岐する事はお話しましたね。
では、こんな場合はどうなるでしょう？

　　　　コードが"A"である場合は、X処理を行う
　　　　コードが"B"である場合は、Y処理を行う
　　　　それ以外は、何もしない。

これを条件分岐で表現すると、

　　　　if　コードが"A"ですか？
　　　　　　├はい、"A"です。ですのでX処理を行います。
　　　　　　└いいえ、"A"ではありません。ですので、次の評価をします。
　　　　　　　　if　コードが"B"ですか？
　　　　　　　　　　├はい、"B"です。ですのでY処理を行います。
　　　　　　　　　　└いいえ、"B"ではありません。ですので、何もしません。

となります。今は2つのケースでしたが、もっとケース数が多くなると、次から次へと条件分岐を連ねていかねばなりません。

無論、
　　　　if　コードが"A"ですか？
　　　　　　├はい、"A"です。ですのでX処理を行います。
　　　　　　└いいえ、"A"ではありません。ですので、次の評価をします。
　　　　if　コードが"B"ですか？
　　　　　　├はい、"B"です。ですのでY処理を行います。
　　　　　　└いいえ、"B"ではありません。ですので、何もしません。

のように、同じレベルで記述してもいいのですが、コードが"A"でＸ処理をしたあとでも、コードが"B"かの条件分岐を評価していかねばなりません。

こう言った場合に、「スイッチ」を使います。

　　　　SWITCHコードを評価する
　　　　　　└結果、"A"だったら
　　　　　　　　└X処理を行います
　　　　　　└結果、"B"だったら
　　　　　　　　└Y処理を行います
　　　　　　└それ以外(Default)だったら
　　　　　　　　└何もしない

このスイッチを使用すると、ケースが増えた場合でも、簡単にケースを記述する事ができます。

　　　　SWITCHコードを評価する
　　　　　　└結果、"A"だったら
　　　　　　　　└X処理を行います
　　　　　　└結果、"B"だったら
　　　　　　　　└Y処理を行います
　　　　　　└結果、"C"だったら
　　　　　　　　└Z処理を行います
　　　　　　└それ以外(Default)だったら
　　　　　　　　└何もしない

条件分岐の条件が沢山ある(深い階層化)、羅列を防ぐ、拡張性が見込まれる場合には、これを使ってみましょう。

##おわりに
いかがでした？

スイッチは条件値がたくさんある時に便利ですね。でも、四半期ごとに処理を変える場合に、"1","2","3"｡｡｡と12個記述するのは大変です。その場合はスイッチを使う前段で、四半期の値を求めて、"1","2","3","4"と、設定値を少なくする事を考えてみましょう。

是非UiPathでのロボ開発の一助になればと思っています。

ありがとうございました！
Laravelのクエリビルダについて

#環境
PHP 7.3.24
Laravel 6.20.30
MAMP

#クエリビルダとは
・SQLに近い構文をPHPのメソッドとして使い、DBを操作するもの
・メソッドチェーンで記述可能
・　`DB::table(テーブル名)->SQL`という書き方をする

#使用例
参照するテーブルデータ
![スクリーンショット 2021-07-23 10.56.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916260/ce3d4e9f-1354-fcf5-61de-da40f1238500.png)

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;

class ProductController extends Controller
{
    public function index() {

      // products テーブルのproduct_nameカラムのデータを取得
      DB::table('products')
      ->select('id', 'product_name')
      ->get()
      ->dd();
    }
}
```
`dd()`の実行結果は以下の通りです。
DBの`id`と`product_name`の値を取得できていることがわかります。

```php
Illuminate\Support\Collection {#384 ▼
  #items: array:9 [▼
    0 => {#385 ▼
      +"id": 1
      +"product_name": "ノート"
    }
    1 => {#389 ▼
      +"id": 2
      +"product_name": "タブレット"
    }
    2 => {#390 ▼
      +"id": 3
      +"product_name": "タピオカ"
    }
    3 => {#391 ▼
      +"id": 4
      +"product_name": "カーテン"
    }
    4 => {#392 ▼
      +"id": 5
      +"product_name": "ピアノ"
    }
    5 => {#393 ▼
      +"id": 6
      +"product_name": "うまい棒"
    }
    6 => {#394 ▼
      +"id": 7
      +"product_name": "炊飯器"
    }
    7 => {#395 ▼
      +"id": 8
      +"product_name": "りんご"
    }
    8 => {#396 ▼
      +"id": 9
      +"product_name": "switch"
    }
  ]
}
```

#参考
[公式マニュアル](https://readouble.com/laravel/8.x/ja/queries.html)
[【 Laravel 】クエリビルダ と Eloquent ORM の違いを整理！](https://qiita.com/Tomo_rrow86/items/a0426ce17b978e3b05d5)
[VBA For Loop]  Increment++　Decrement+-の代わりはStepです

[【VBA】インクリメントやデクリメントは使える？代替案は？](https://nyanblog2222.com/programming/vba/2261/)
関数を作るという解決方法が提示されている。

しかし、For Nextに限れば、この場合Stepを使います。
まず++1のように1づつ増加する場合はなにもいりません。

```vb
Dim i As Long
For i = 1 to 10
Debug.Print i
Next i
```

++2のような場合


```vb
Dim i As Long
For i = 1 to 9 Step 2&
Debug.Print i
Next i
```

とStepを使います。アンドはLongのリテラルです。なくてもいいのですが、これを入れるとこのプロシージャでは計算はIntejerからLongに拡張されます。

次に減少する場合は

```vb
Dim i As Long
For i = 10 to 1 Step -1&
Debug.Print i
Next i
```

とこのようにします。
確かに`++`や`--`や`+1`などはありませんが。
なお、微小Step 微小インクリメントはリテラルで単精度浮動小数点型を使い、演算誤差を発生させないというのはオリジナル技かな。

```vb
Dim i As Long
For i = 1 to 2 Step 0.1!
Debug.Print i
Next i
```

インクリメントやデクリメントはありませんが、こんな感じでしょうか。
もっともこの微小ステップは最初に紹介した記事のような書き方を応用して、

```vb
Dim i As Long
Dim s1 As Single
S1 = 1
For i = 1 to 10
S1 = S1 + CSng(i/10)
Debug.Print S1
Next i
```

という書き方のために使えるので、この方法も覚えておいた方がいいです。
これはi自体は1づつ増加するけど、このiの値自体が必要な変数と、それとは別に遅れて増加する場合などはこれを使います。
たとえば、エクセルにアクセスのテーブルをインポートするとき、アクセスの列は0番から255番ですが、Excelは1番から256番です。
こんなときに1ずらす、という場合にはこの方法が活躍します。
しかしFor Loop以外で任意に加算代入演算子(Increment)、減算代入演算子(Decrement)を使うことは、[VBAでデクリメント演算子は？](https://www.relief.jp/docs/excel-vba-operator-decrement.html)にもあるとおり、元から存在しないのでできません
[For～Nextループを逆順に後ろから前に回す](https://www.relief.jp/docs/excel-vba-for-next-loop-backwards.html)でもあるようにStepは基本技です。ただし` For i = a to b`は昇順は`a<b`降順（逆順）は`b>a`の関係になっていないとエラーになります。
For Loop絡みでは`for(var i=5; i>0; i--){ }`で出てくるような、`i=1`を`i>0`と書く表現も存在しません。JavaScriptでは`i>0`の部分はendvalueとよばれ、値と条件式が許容されています。VBAの場合は条件式は入りません。
UbuntuでVirtualBox 6.1の仮想マシンが起動しない現象に遭遇しました

気がつくと、VirtualBoxの仮想マシンが起動しなくなっていました。原因はGCCのバージョンでした。GCCが古すぎて`-fstack-protector-strong`オプションがエラーになっていたためです。GCCを8にしたら解消しました。

![Screenshot from 2021-07-23 10-33-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72237/33bbc3a4-6ca4-7fdb-f552-b88b0c5c2df9.png)


# 現象

VirutalBoxの仮想マシンを起動しようとしても、以下のようなエラーが表示されて起動しません。

```text
dpkg: パッケージ virtualbox-6.1 の処理中にエラーが発生しました (--remove):
 installed virtualbox-6.1 package pre-removal script subprocess returned error exit status 1
A copy of VirtualBox is currently running.  Please close it and try again.
Please note that it can take up to ten seconds for VirtualBox to finish running.
vboxdrv.sh: failed: Look at /var/log/vbox-setup.log to find out what went wrong.

There were problems setting up VirtualBox.  To re-start the set-up process, run
  /sbin/vboxconfig
as root.  If your system is using EFI Secure Boot you may need to sign the
kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load
them. Please see your Linux system's documentation for more information.
処理中にエラーが発生しました:
 virtualbox-6.1
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

セキュアブートはPCを買ったときからOFFです。

# 解決方法

`vboxdrv`をリビルドする際に使われるGCCは4.8で古いものでした。しばらくGCC 8.4を使っていたのですが、仕事でGCC 4.8を使うので一時的にGCCのバージョンダウンをシたのが悪かったようです。

`update-alternatives`で一時的にGCC 8.4に戻して`/sbin/vboxconfig`してVirtualBoxドライバがビルドしました（サービスが起動しました）。

# 環境

* Ubuntu 18.04
* （NGな環境）GCC 4.8
* （OKな環境）GCC 8.4
* VirtualBox 6.1
みんなのためのノンパラメトリック回帰　吉岡書店　竹澤先生

```{r}

#RBFnetwork

data(iris)

sig=as.integer(iris$Species)

value=sig*c(rep(10,50),rep(20,50),rep(30,50))

X=as.matrix(iris[,!(colnames(iris) %in% "Species")])

mu=array(0,dim=c(length(unique(sig)),ncol(X)))

sigma=c()

pthi=array(0,dim=c(nrow(X),length(unique(sig))))

for(j in 1:length(unique(sig))){
  
x=X[sig==j,]

mu[j,]=apply(x,2,mean)
  
sigma=c(sigma,max(apply(x,2,var)))

val=apply((t(x)-apply(x,2,mean))^2,2,sum)/(2*max(apply(x,2,var)))

pthi[,j]=exp(-val)/sqrt(2*pi)

}

w=solve(t(pthi)%*%pthi)%*%t(pthi)%*%value






```


```{r}

#p.410

data(iris)

sig=1

X=as.matrix(iris[,!(colnames(iris) %in% "Species")])

kernel=array(0,dim=c(nrow(X),nrow(X)))

for(i in 1:nrow(X)){
  
G=exp(-apply((t(X)-c(X[i,]))^2,2,sum)/(2*sig))/sqrt(2*pi*sig)

kernel[i,]=G
  
}

Y=c(rep(10,50),rep(20,50),rep(30,50))

v=0.1

w=solve(kernel+diag(rep(v,nrow(X))))%*%Y

y=kernel%*%w



```

```{r}

X=cbind(c(1,2,3,1,2,1,2,2,1,2),c(3,4,5,3,4,3,4,2,3,2))

X=cbind(rep(1,10),X)

Y=cbind(c(2,3,4,2,1,2,3,2,1,2),c(3,4,3,4,3,4,4,2,3,4))

x_star=c(1,2)

h=1

W=exp(-apply(((t(X)-c(x_star))/h)^2,2,sum)/2)

W=diag(c(W))

a=solve(t(X)%*%W%*%X)%*%t(X)%*%W%*%Y



```
ServerlessFrameworkでcron実行する(Node.js)

Serverless Frameworkでcron実行するサンプルコードです。
AWS LambdaではJST未対応のようで、-9時間する必要有ります。
時間設定の際にご留意ください。

```shell:ディレクトリ構成
~/develop/study/serverless/cron $ tree -I node_modules
.
└── aws-node-scheduled-cron
    ├── handler.js
    ├── package.json
    ├── serverless.yml
    └── yarn.lock
```
```yaml:serverless.yml
service: aws-node-scheduled-cron2

frameworkVersion: '2'

provider:
  name: aws
  runtime: nodejs12.x
  lambdaHashingVersion: 20201221

functions:
  cronHandler:
    handler: handler.run
    events:
      - schedule: cron(0 1 * * ? *) #毎日10時に定期実行する。
```
<font color="Red">※cronはUTC時間設定のため、-9時間する必要有り。</font>


```javascript:handler.ts
'use strict';

module.exports.run = async (event, context) => {
  const time = new Date();
  console.log(`${time} cron実行上手く動いてますよ！！ `);
};
```

```shell:デプロイ
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
........
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service aws-node-scheduled-cron2.zip file to S3 (30.48 MB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
.....................
Serverless: Stack update finished...
Service Information
service: aws-node-scheduled-cron2
stage: dev
region: ap-northeast-1
stack: aws-node-scheduled-cron2-dev
resources: 8
api keys:
  None
endpoints:
  None
functions:
  cronHandler: aws-node-scheduled-cron2-dev-cronHandler
layers:
  None
```
###実行結果
![スクリーンショット 2021-07-23 10.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/e0da2472-207a-7aae-1518-870abf08138f.png)
mutatingに関して（Swift)

mutatingとは
--
値型ではmutatingキーワードをメソッドの前に宣言することによって、自分の値を変更することが可能になる。（つけないとコンパイルエラーになる）

```swift:mutating.swift
struct Person {
 var name:String
mutating func changeName(name:String)->String{
      self.name = name
 }
}
```
注意点　letで定数宣言しているとmutatingを付けていても変更できない。

また、これは値型の変更にしか使えないので参照型であるクラス型には使えない。
値型なので構造体以外にも列挙型でも同様に使用できる

```swift:enum.swift
enum Code: Int {
  case A
  case B
  case C
    
  // mutating で変更可能にする
  mutating func update(code: Code) {
    self = code
  }
}
var one = Code.A
one.update(code: .B)
one.rawValue // 1が出てくる
```

参照型のストアドプロパティを変更するには？
--

inout引数を利用して変更する。関数内での引数への再代入を外の世界に反映させることができる

```swift:inout.swift
func メソッド名(内部引数名:inout 型名）型名{//inoutを型名の前につける
 print(引数名）
メソッド名(引数名:&〇〇）//&を付ける必要がある
}
Redmine のバックアップをとろう！

# やったこと
　Amazon Lightsail（仮想プライベートサーバー）で立てた Bitnami Redmine のバックアップを、ローカル（自分のパソコン）でとった。

### 動機
　データ保管料金を取られない環境に、バックアップを取りたいから！です。
　Lightsail で立てた Redmine の 'スナップショット' をAWS (EC2, S3など) で保存しておけば、バックアップにはなるだろう。しかし、ケチな僕にとって、スナップショットを溜めておくだけでお金が発生するのは嫌じゃ。
　そこで、Redmine のデータをローカルに落とせば、無料でバックアップを取れるだろうと目論んだ。
### 環境
[ローカル]
（例１）

- Ubuntu 20.04.2 LTS

（例２）

- Windows10
- WSL1 Ubuntu-20.04

データを落としてくる時に、scpコマンドを使いたかったから Ubuntu を使用。Windows10 にて WSL でファイルをで落としたら、ダウンロード先が **\\\wsl$**になることに注意。

[外部サーバ]

- Amazon Lightsail

# 具体的な手順
　大きく分けて、３つだ。

1. バックアップするファイルを決める。
1. ローカルに落とす準備をする（SSH接続できるようにする）。
1. ローカルに落とす。

さあ、それぞれ詳しく見ていこう。
###1 必要なファイルとは？
　バックアップ対象として、次の３つがあれば十分そうだった。

- files（Redmineにアップした画像やPDFが入っている。）
- db_redmine.dmp（Redmineのデータベース。構成情報？）
- config 

２つ目の「db_redmine.dmp」ファイルは、インスタンスのターミナルで下記のコマンドを叩いて生成。
Redmine.JPの [データのバックアップ方法](https://redmine.jp/faq/system_management/backup/) には、上２つだけを対象としているが、 **３つ目の「config」フォルダが無いと、Redmineの「設定」が無くなり、アプリケーションタイトル、ウェルカムメッセージが消える（笑）**。


```
bitnami@ip-000-00-00-000:~/apps$ mysqldump -u root -p redmine > /tmp/db_redmine.dmp
```
それぞれのファイルの場所は下記の通り。

```:インスタンス内
/home/bitnami/apps/redmine/htdocs/files
/tmp/db_redmine.dmp
/home/bitnami/apps/redmine/htdocs/config
```


この３つを使ってもリストアがうまくできなかった場合は、「plugins」ファイルなども落としてみよう。


###2 ローカルに落とす準備（SSH接続できるようにする）

Amazon Lightsail からデフォルトのプライベートキー「LightsailDefaultKey-ap-northeast-1.pem」をダウンロードすれば、次のコマンドで ssh 接続できる。ダウンロードはボタンをクリックするだけ。

```:ローカルのターミナル
ssh -i ~/redmine/LightsailDefaultKey-ap-northeast-1.pem bitnami@00.000.00.00
```

###3 ローカルに落とす。
ローカルのターミナルで下記のコマンドを叩いて必要なフォルダやファイルをダウンロード。

```:files
scp -r -i ~/redmine/LightsailDefaultKey-ap-northeast-1.pem bitnami@00.000.00.00:/home/bitnami/apps/redmine/htdocs/files ~/files
```
```:db_redmine.dmp
scp -i ~/redmine/LightsailDefaultKey-ap-northeast-1.pem bitnami@00.000.00.00:/tmp/db_redmine.dmp ~/db_redmine.dmp
```
```:config
scp -r -i ~/redmine/LightsailDefaultKey-ap-northeast-1.pem bitnami@00.000.00.00:/home/bitnami/apps/redmine/htdocs/config ~/config
```
以上でバックアップは終わりだ。NASやUSBにも保存したりして、データを大切に保管しておこう。


おつかれさん！！

バックアップしたデータを使って、本当に Redmine を再現（リストア）できるか？の [記事](https://qiita.com/tama2ka/items/a4424783bde31b37e750) も書いたから、必要な時に見てみてな！
Journey Builder の基本 ⇒ Journey Builder の使用開始

１．作成したジャーニーは、ダッシュボードのどの部分を使用して整理することができますか?
２．カスタマージャーニーの顧客のパスを管理するために Journey Builder で提供されるフローコントロールアクティビティはどれですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/65e53e32-122f-547f-e0d8-d735ac1de36c.png)
UIButtonにコードでアクションを追加する方法

コードでボタンにアクションを追加する方法を忘れがちなのでメモ。
`#selector` や `@objc` などObjective-Cのコードを使用します。

```swift
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let lightGray = UIColor.init(red: 0.9, green: 0.9, blue: 0.9, alpha: 1.0)

        let button = UIButton(type: .roundedRect)
        button.backgroundColor = lightGray
        button.setTitle("Button1", for: .normal)
        button.frame = CGRect(x: 100, y: 100, width: 100, height: 40)
        // アクションの追加
        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)


        view.addSubview(button)
    }

    @objc func buttonTapped(){
        print("buttonTapped called")
    }

}
```

viewが読み込まれるタイミングで、以下のように書きます。

```swift
ボタン.addTarget(（どのViewControllerか）, action: #selector(アクション(_:)), for: （タップの種類）)
```

そして`@objc`という修飾子をつけてメソッドを書けばOK

参考：
https://swift-ios.keicode.com/ios/target-action.php
herokuのpipeline概要

# この記事の目的

はじめてのheroku pipeline設定時に概要を把握するためのもの

# heroku pipelineとは

同じサービスの

- 開発
- レビュー
- ステージング
- 本番

を管理するためのもの。

# 各ステージの役割

それぞれどういう役割かはサービスによるが基本的には

- 開発とレビューはほぼ同じ役割で開発中のものを開発途中で確認するためのもの。複数ブランチが分かれるのを想定
- ステージングはmasterからのみdeployでき、基本的にはリリースできるもの。ステージングは最終確認用に用意

かなと。

# プロモーションとは

ローカル>開発（レビュー）>ステージングへの次の環境ステージへの移動はdeployというがステージングから本番への移動はプロモーションという。

https://devcenter.heroku.com/ja/articles/pipelines#promoting

# githubによる自動化

githubと連携することでブランチごとにレビューアプリを作ることができる。またmasterをdeployするとstagingに自動でdeployするようにもできる。

ステージングアプリに「Configure automatic deployment for」とあるのでそこをクリック

![スクリーンショット 2021-07-23 9.45.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193389/b5bb202d-845e-93d8-37ea-e216da5febe9.png)
[Python]FastAPI エラーハンドリング方法 メモ

* FastAPIのエラーハンドリング方法についてメモする。
* 指定したキーが存在しないケースでエラーハンドリングパターンを検証してみる。

## ①HTTPExceptionを利用するケース

* HTTPExceptionを利用する。

```python
from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse
from fastapi.responses import PlainTextResponse
from starlette.exceptions import HTTPException as StarletteHTTPException

app = FastAPI()

items = {"1": "test_item"}

@app.get("/testapi/http_exception/items/{item_id}")
async def get_http_exception(item_id: str):
    # 指定したキーが存在しない場合
    if item_id not in items:
        raise HTTPException(status_code=404, detail="item_not_found")
    return {"item": items[item_id]}
```

* リクエスト

  ```http
  GET /testapi/http_exception/items/3 HTTP/1.1
  Host: 127.0.0.1:8000
  ```

* レスポンス

  ```json
  404 Not Found
  {
      "detail": "item_not_found"
  }
  ```

## ②独自定義したExceptionを利用するケース

* Exceptionを継承し、独自定義したエラーを返却する。
  * パスパラメータとして指定された値をレスポンスボディに埋め込んだりしたい場合。

```python
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse

app = FastAPI()

items = {"1": "test_item"}


class CustomNotFoundException(Exception):
    def __init__(self, item_id: str):
        self.item_id = item_id


@app.exception_handler(CustomNotFoundException)
async def CustomExceptionHandler(request: Request, exception: CustomNotFoundException):
    return JSONResponse(status_code=404, content={"detail": f"item_id_{exception.item_id} is_not_found"})


@app.get("/testapi/custom_exception/items/{item_id}")
async def get_custom_exception(item_id: str):
    # 指定したキーが存在しない場合
    if item_id not in items:
        raise CustomNotFoundException(item_id=item_id)
    return {"item": items[item_id]}
```

* リクエスト

  ```http
  GET /testapi/custom_exception/items/3 HTTP/1.1
  Host: 127.0.0.1:8000
  ```

* レスポンス

  ```JSON
  404 Not Found
  
  {
      "detail": "item_id_3 is_not_found"
  }
  ```

  

## ③デフォルトExceptionハンドラーをオーバーライドするケース

* デフォルトのExceptionハンドラーをオーバーライドさせる。
  * レスポンスボディをJSONではなく、text形式で返却させたい場合。

```python
from fastapi import FastAPI, HTTPException
from fastapi.responses import PlainTextResponse
from starlette.exceptions import HTTPException as StarletteHTTPException

app = FastAPI()

items = {"1": "test_item"}


@app.exception_handler(StarletteHTTPException)
async def http_exception_handler(request, exc):
    return PlainTextResponse(str(exc.detail), status_code=exc.status_code)


@app.get("/testapi/override_http_exception/items/{item_id}")
async def get_override_http_exception(item_id: str):
    if item_id not in items:
        raise HTTPException(
            status_code=404, detail=f"item_id_{item_id}_is_not_found")
    return {"item": items[item_id]}

```

* リクエスト

  ```http
  GET /testapi/override_http_exception/items/3 HTTP/1.1
  Host: 127.0.0.1:8000
  ```

* レスポンス

  ```
  404 Not Found
　item_id_3_is_not_found
  ```

  

## 参考情報

* [Handling Errors](https://fastapi.tiangolo.com/tutorial/handling-errors/)
AtCoderログ：0029 - ABC 072 B

# 問題：[ABC 072 B - OddString](https://atcoder.jp/contests/abc072/tasks/abc072_b)

## 問題文
> 英小文字からなる文字列 $s$ が与えられます。前から数えて奇数文字目だけ抜き出して作った文字列を出力してください。 ただし、文字列の先頭の文字を1文字目とします。

## 制約
> ・$s$ の各文字は英小文字
> ・$1 \le |s| \le 10^5$

## 収録されている問題セット
- [AtCoder に登録したら次にやること](https://qiita.com/drken/items/fd4e5e3630d0f5859067) ([第03問類題](https://qiita.com/drken/items/fd4e5e3630d0f5859067#%E7%AC%AC-3-%E5%95%8F--abc-081-b---shift-only-200-%E7%82%B9))

# 回答 (AC)
受け取った文字列 s に対し、最初の文字から1文字おきに出力すれば良いでしょう。コードは以下のようになりました。

```C++:abc072b.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  string s;
  cin >> s;
  
  for ( int i=0; i<s.size(); i+=2 ) {
    cout << s.at(i);
  }
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc072/tasks/abc072_b/editorial) → [コンテスト全体の解説](https://img.atcoder.jp/arc082/editorial.pdf)
回答と同じ方針でした。これ以外の解法ってあるんでしょうかね？

# リンク
- 前の記事 → [AtCoderログ：0028 - ARC 123 に参加しました](https://qiita.com/RoadLynton/items/094c4e1ec812aa839f6f)
GASでスプレッドシート内のすべてのセルを翻訳する

# はじめに
こんにちは。新しいPCのセットアップのキーボードの配置になれず、ちょっと苦戦してます、筆者です :innocent: `Fn`キーと`Ctrl`キーと`PgUp`、`PdDn`がまだ慣れません。。

さて、今回はスプレッドシート内がすべて韓国語のシートを日本語に翻訳する機会がありましたので、そのやり方を共有します。

# 前提
1. 韓国語 => 日本語に翻訳する.
1. 韓国語のシート名は`ko`.
1. 日本語のシート名は`ja`.
1. シート内のセルはセル結合されているものも含む.

# 方針
1. シート「ja」が既に存在する場合を加味しシート「ja」を削除する.
1. シート「ko」をコピーしてシート「ja」と名前を付ける.
1. 2のデータをすべて取得.
1. 3のデータを1つずつ翻訳する.
1. 4を元データに置き換える.

# スクリプトはこちら↓

```js
const main = () => {
  // すでに翻訳する済みのシート「ja」があれば削除する.
  SpreadsheetApp
    .getActiveSpreadsheet()
    .deleteSheet(
      SpreadsheetApp
      .getActiveSpreadsheet()
      .getSheetByName('ja')
    )

  // 翻訳前のシート「ko」をコピーして「ja」を作成する.
  const sheet = SpreadsheetApp
    .getActiveSpreadsheet()
    .getSheetByName('ko')
    .copyTo(SpreadsheetApp.getActiveSpreadsheet())
    .setName('ja')

  // シート「ja」を1セルずつ翻訳して書き換える.
  sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn())
    .getValues()
    .forEach((r, i) => {
      r.forEach((c, j) => {
        if (c) {
          sheet.getRange(i + 1, j + 1).setValue(LanguageApp.translate(c, 'ko', 'ja'))
          Utilities.sleep(1000)
        }
      })
    })
}
```

# おわりに
書いてから気づきました、もしかしたらスプレッドシートのアドオンであるかもしれないことに...。
あればそちらを使った方がいいかもしれません :bow:

ただ、ほかの処理に乗せたいとかあるのであれば、GASでやるのはありだと思います。
トリガーとかもあるので:+1:

参考になれば幸いです！
それでは！
サイト内に違うサイトを表示

▪️ 違うサイトの表示を自身のサイト内に貼り付けるには　？

一見難しく考えるかもしれませんが、これは　URLをHTML内に組み込むだけです。

▪️ 書き方

img src = " " とよく見るURLの書き方をそのまま
使えばサイト内に違うサイトを表示させることが可能です。


今日の投稿は以上です。

wagaでした!
RPGツクールMZでメニュー画面の起動時、終了時にコモンイベントを差し挟む方法

RPGツクールMZでメニュー画面の起動時、終了時にコモンイベントを差し挟むには以下のプラグインを使えば良さそうです。

・起動時
https://plugin-mz.fungamemake.com/archives/2584

・終了時
https://plugin-mz.fungamemake.com/archives/690
ubuntu 21.04 に apt で golang をインストール

# ubuntu 21.04 に apt で golang をインストール

[こちら記事](https://qiita.com/m-tmatma/items/dff66b3e294293115661) で `ubuntu に apt で golang をインストール` で go のインストール方法を説明しましたが、

ubuntu 21.04 では標準リポジトリで対応できるようになったみたいなので共有します。

```
sudo apt  install -y golang-go
```
JavaScript: SQL整形

表題のとおりの小品です。

## ソース
```html
<!DOCTYPE html>
<html lang="ja">
<head>
</head>
<body>
<div class="container">
  <input type="button" value="Format" onclick="format()" />
  <textarea rows="50" cols="100" id="sql_text"></textarea>
</div>

<script type="text/javascript">

function formatSql(text){
  // 改行するキーワード
  var array=["AND","FROM","FULL","GROUP","INNER","LEFT","ON","ORDER","RIGHT","SET","WHERE","VALUES"];

  // キーワード共通処理
  for(i=0; i<array.length; i++){
    var keyword = array[i];
    var after = " " + keyword + " ";

    // キーワード前後の半角スペースを1つだけにする
    // 例: キーワード"   AND  "は" AND "になる
    text = text.replace(new RegExp(" +" + keyword + " +", "gi"), after);

    // 改行
    var afterRn = "\r\n" + after;
    text = text.replace(new RegExp(after, "gi"), afterRn);
  }

  // SELECT：後ろ改行
  text = text.replace(/SELECT/gi, "SELECT\r\n");

  // カンマ：前後のスペース削除
  text = text.replace(/( +,|, +| +, +)/gi, ",");
  // カンマ：改行（前カンマ）
  text = text.replace(/,/g, "\r\n , ");

  // かっこ：改行
  text = text.replace(/\(/g, "(\r\n");
  text = text.replace(/\)/g, "\r\n)\r\n");

  return text;
}

function format() {
  const sql = document.getElementById("sql_text").value;
  document.getElementById("sql_text").value = formatSql(sql);
}

</script>
</body>
</html>
```

![sql.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/d3b4ca0d-f6f4-cb17-facc-fb2470291518.gif)

## 参考

以下を少々改善したもの。

https://qiita.com/atmospheri/items/d2249abf7f77f294e2dc

また使いながら改善するかも。
以上です～