OmniAICreator/Qiita-1.07M huggingface dataset:
WSL2でCypressをコンテナで起動

# 概要
CypressをWindows11で構築した時のメモ

# 環境
- Windows11
- WSL2(Ubuntu)

# 手順
- WSL2インストール
    - WSLg確認
- Docker Desktop
- 起動

## WSL2インストール
WSLのインストール詳細は割愛

### WSLg確認
参考：https://blog.mohyo.net/2022/02/11591/

## Docker Desktop
「Docker Desktop for Windows」をインストールしてWSLで実行するように設定
参考：https://docs.docker.com/desktop/windows/wsl/#develop-with-docker-and-wsl-2

## 起動
```yml:docker-compose.yml
version: '3'

services:
  cypress:
    image: cypress/included:10.3.1
    environment:
      - DISPLAY=:0
    working_dir: /e2e
    volumes:
      - ./:/e2e
      - /tmp/.X11-unix:/tmp/.X11-unix
      - /mnt/wslg:/mnt/wslg
    
    entrypoint: cypress open --project /e2e
```

# 参考
- WSLg
    - https://blog.mohyo.net/2022/02/11591/
- Docker Desktop
    - https://docs.docker.com/desktop/windows/wsl/
seleniumをインストールして、pythonでお試し利用



https://qiita.com/seigot/items/475da9b3701cea8fb384


上記記事でコードでエラーが出たので修正

```diff_python
# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep
from selenium.webdriver.common.by import By 

# ブラウザを開く。
driver = webdriver.Chrome()
# Googleの検索TOP画面を開く。
driver.get("https://www.google.co.jp/")

# 検索語として「selenium」と入力し、Enterキーを押す。
search = driver.find_element(by=By.NAME, value="q")
search.send_keys("selenium automation")
search.send_keys(Keys.ENTER)
# タイトルに「Selenium - Web Browser Automation」と一致するリンクをクリックする。
#element = driver.find_element_by_partial_link_text("SeleniumHQ Browser Automation")
#element = driver.find_element_by_link_text("WebDriver")
element = driver.find_element(By.PARTIAL_LINK_TEXT, "Selenium")
element.click()

# 5秒間待機してみる。
sleep(5)
# ブラウザを終了する。
driver.close()
```
画像加工APIまとめ

# 画像加工APIまとめ
この記事では画像を加工する時に使えるAPIをまとめて紹介します。


## ★画像リサイズAPI
1.[Image Resizer](https://imageresizer.io/)
画像サイズ変更、トリミング、ぼかし、グレースケール、フォーマット変換
![screenshot_20220726_140415.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417797/9c84cdc3-aa2e-950f-1f43-73377424b238.jpeg)

2.[Kraken](https://kraken.io/)

![screenshot_20220726_140745.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417797/54bf2af2-0006-bd18-0380-239de2688e71.jpeg)



## ★背景透過加工API
1.[PicWish](https://picwish.com/jp/background-removal-api?apptype=qiita)
画像識別・切り抜き・背景透過
![screenshot_20220726_140057.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417797/4b1aefbc-9a1e-537f-fb80-33c5f5a0fad9.jpeg)

2.[Remove bg](https://www.remove.bg/api#remove-background)
![screenshot_20220726_141546.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417797/047996dc-5ef9-36ff-7e23-a0f32eb4085d.jpeg)



## ★写真高画質化API

1.[PicWish](https://picwish.com/jp/background-removal-api?apptype=qiita)
写真高画質化・拡大・古い写真修復
![screenshot_20220726_140200.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417797/85e75c77-3c64-a7e9-ec8b-90d8e4c12267.jpeg)

※参考となる記事

https://qiita.com/2zn01/items/635eb272ba9b46c68b3f
Next.js / TypeScript を簡単に始める手順


手軽に React.js を使った実験をしたいので、設定無しで使える Next.js の利用開始手順をまとめた。(https://github.com/propella/simple-next)

## 手順

next と依存ライブラリのインストール

    npm install react react-dom next
    npm install --save-dev typescript @types/react @types/node eslint

空の tsconfig.json を作る

    touch tsconfig.json

pages/index.tsx を書く。パス名は決まっていて、pages/hoge.tsx のように tsx を置くと http://localhost/hoge からアクセスできる。対応する html は Next.js が自分で作る。

```tsx
export default function Home() {
  return <p>Hello, World!</p>
}
```

package.json に起動スクリプト追加

```json
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },
```

テスト実行するとおすすめの tsconfig.json が作られる。

    npm run dev

http://localhost:3000 を開く

tsconfig.json にエラーがあるので compilerOptions に以下を追加。またお好みで `"strict": true` したりする。

    "moduleResolution": "node",

lint の設定

    npm run lint

## Pre-rendering

利用する関数によって2つのレンダリング方式を選べる。

* getStaticProps: Static Generation
    * ビルド時に getStaticProps を呼んでページを生成する。
    * 何度アクセスしても同じ内容が返る
    * 例: https://github.com/propella/simple-next/blob/pre-rendering/pages/static.tsx
* getServerSideProps: Server-side Rendering
    * 実行時に getServerSideProps を呼んでページを生成する。
    * アクセスするたびに違う内容を返す事ができる。
    * 例: https://github.com/propella/simple-next/blob/pre-rendering/pages/ssr.tsx

npm run build && npm start するとレンダリング方式の違いを確認できる。Next.js は生の React.js と違いサーバ側に Node やロードバランサ等が必須なので、Vercel のようなビジネスが成立する。

## Export

    npx next build && npx next export

で生の React のように静的なアプリを生成するので、従来型の SPA を作れる。この場合 `getServerSideProps` のような実行時に Node サーバーが必要な機能が使われているとエラーになる。

## 参考

* [Getting Started with Next.js - From React to Next.js | Learn Next.js](https://nextjs.org/learn/foundations/from-react-to-nextjs/getting-started-with-nextjs)
  * Next.js の始め方
* [Create tsconfig.json - TypeScript | Learn Next.js](https://nextjs.org/learn/excel/typescript/create-tsconfig)
  * Next.js + TypeScript の始め方
* [Assets - Assets, Metadata, and CSS | Learn Next.js](https://nextjs.org/learn/basics/assets-metadata-css/assets)
  * 画像の置き方
* [Basic Features: Pages | Next.js](https://nextjs.org/docs/basic-features/pages)
  * レンダリング方法
macのショートカット、自分用。

会社からMacBookProを支給されて使っているものの、ショートカットがわからん。困る

ググる時間がもったないので、よく使うものは書いておく。

---

対象者というか自分の属性
WEB系に行ったばかり
ずっとWinPCだった。


例）コピー　(win) contlor+C
``` 
command + C
```
---

スクリーンショット（任意の範囲） (win) win + shift + S
```
command + shift + control + 4
```

随時更新していく。
ハードディスクの構造と記録方法

# ハードディスク
ハードディスクは硬い。
その強度と平滑性を生かして高速で回転している。
磁気の力で書き込み、読み込みをしている。
しかしちょっとした衝撃で壊れてしまう。

## 気づき
ハードだが弱い。
これから頑張ろう。

# ハードディスクの構造
```ディスク（プラッタ）```、```アクセスアーム```、```磁気ヘッド```の３つで構成されている。

## ディスク（プラッタ）
```金属製やガラスでできている硬い円盤。```
表面に```磁性体が塗布もしくは蒸着```されている。


## アクセスアーム
```先端に磁気ヘッドがついてるアーム。```
指令を受けると目的位置の同心円上へと```磁気ヘッドを運びます。```

## 磁気ヘッド
```微小な電磁コイル。```
ディスクの磁性体を磁気ヘッドで```磁性化させることでデータの読み書き```を行う。

# セクタとトラック
ハードディスクを最初使う前に```フォーマット（初期化)```と言う作業を行う必要がある。
この作業で
プラッタの上には```データを記録するための領域が作成```されます。
プラッタが```細かく区画割り```をされる。

扇状に分かれた```最小範囲```を```セクタ```
そのセクタを複数集め```１周分```の領域を```トラック```と呼ぶ。

同心円状のトラックを複数まとめると、```シリンダ```と言う単位になる。

# ハードディスクの記憶容量
セクタ、トラック、シリンダの関係性がわかるとハードディスクの容量がわかる。
１セクタあたりの５１２バイト
１トラックのセクタ数４０セクタ
1シリンダあたりのトラック数２０
シリンダ数１５００

これらの数値を掛けると約６１４MBになる。

# ファイルはクラスタ単位で記録する
基本ソフトウェアであるOSがファイルを読み画期するときは複数のせくたを１ブロックとみなした```クラスタ```という単位を用いる。
１クラスタで収まらない場合は複数のクラスタを使う。余ったクラスタの領域は```今後も利用されない無駄な領域```となる。

# データへのアクセスにかかる時間
データへアクセスすると言うのは、実際に```データを書き込んだり```、```書き込み済みのデータを読み込んだり```する作業のこと。
データへアクセスする手順がある
* ### シーク（位置決め）
  アクセスアームを動かしてトラック位置まで運びます。
* ### サーチ（回転待ち）
  目的のデータが磁気ヘッドの位置まで回ってくるのを待つ
* ### データ転送
  セクタに書かれたデータを読み込む。

シークとサーチにかかる時間を```待ち時間```と呼ぶ.

データへのアクセスにかかる時間は上の３つかかる合計の時間を```アクセス時間```という。

## 問題
5000バイトのデータを読み出す場合のアクセス時間はいくつか？
回転速度５０００回転/分
平均シーク時間20ミリ秒
１トラックあたりの記憶容量15000バイト

```アクセスアームを動かして、目標のデータを待つ、読み込む。```

アクセスアームを動かす時間　平均シーク時間　２０ミリ秒

目標のセクタが回転して来る時間　６００００ミリ秒を５０００回転でわる。
一回転12ミリ秒
計算に用いるシーク時間とサーチ時間はともに平均値を使う。
なので最速で0秒最低で12秒になるその平均は６ミリ秒になる。

15000バイトを１２ミリ秒で割る１２５０バイト/ミリ秒
5000バイトを読み取る時間は４ミリ秒になる。

20ms+6ms+4ms= 30ms
アクセス時間は30ms

### 気づき
想像できるようにする。
そうすると計算しやすくなる。

# 関連記事
https://qiita.com/masatom86650860/items/fbd243f4c739100cbf7c

# 出典
https://gihyo.jp/book/2020/978-4-297-11781-8
空間図形「京都府立医科大学の２０２２年第４問」をsympy でやってみたい。

(公式)オリジナル

https://www.kpu-m.ac.jp/doc/examination/exam_gakubu/files/30169.pdf#page=5

(公式)「数学」解答例

https://www.kpu-m.ac.jp/doc/examination/exam_gakubu/files/30175.pdf#page=2


pdf解答あり。図形をイメージできますか？＜

https://kamelink.com/blog/2022/06/08/9-6-22-kyoutofuidai-4/

(問題)大学入試数学問題集成＞

https://mathexamtest.web.fc2.com/2022/202211551/2022115510100mj.html#top-0104

# DeepL翻訳してみた。(日本語→英語→日本語)
原文の写し

```
【４】　nは3以上の整数とする．正n角形の外接円の半径を正n角形の半径とよぶ．
　2n+2個の面で囲まれた凸多面体で，次の2つの条件(a)，(b)を満たすものをAnとする．
(a)　2個の半径1の正n角形を面にもち，それらは平行である．
(b)　(a)の2個の面の他に互いに合同な2n個の正三角形を面にもつ．
　例えば，A3は正八面体になる．
θ=π/nとおく．
(1)　Anの辺の数をnを用いて表せ．
(2)　条件(b)の正三角形の高さをθを用いて表せ．
　条件(a)の2つの面の間の距離（一方の面から他方の面へ引いた垂線の長さ）をHとする．
(3)　Hをθを用いて表せ．
(4)　Anの体積をVとするとき，V/nHをθを用いて表せ．
```

以下は順番を入れ替えています。
```
4] nを3以上の整数とし、正則n角形の外接円の半径を正則n角形の半径と呼ぶ。
　2n+2個の面によって囲まれた凸多面体で、次の2つの条件(a)と(b)を満たすものをAnとする。
(a) 面上に半径1の正n角形が2つあり、それらは平行である。
(b) (a)の2つの面の他に、互いに合同な2n個の正三角形を持つ。
　例えば、A3は八面体である。
θ=π/nとする。
(1)Anの辺の数をnで表せ。
(2) 条件(b)の正三角形の高さをθで表せ。
　条件(a)の2辺の距離（1辺からもう1辺に引いた垂線の長さ）をHとする。
(3) Hをθを用いて表せ。
(4) V/nHをθを用いて表し、VはAnの体積とする。
```
```
4] Let n be an integer greater than or equal to 3. The radius of the circumscribed circle of a regular n-gon is called the radius of the regular n-gon.
　Let An be a convex polyhedron bounded by 2n+2 faces and satisfying the following two conditions (a) and (b).
(a) It has two regular n-angles of radius 1 on its faces, which are parallel.
(b) It has 2n equilateral triangles congruent to each other in addition to the two faces in (a).
　For example, A3 is an octahedron.
Let θ=π/n.
(1) Express the number of sides of An using n.
(2) Express the height of the equilateral triangle in condition (b) using θ.
　Let H be the distance between the two sides in condition (a) (the length of the perpendicular line drawn from one side to the other).
(3) Express H using θ.
(4) Express V/nH using θ, where V is the volume of An.

Translated with www.DeepL.com/Translator (free version)
```


# sympyで
図形をイメージできませんでした。

```python
勉強中
```



# 参考
凸多面体（とつためんたい、Convex polyhedron）

https://ja.wikipedia.org/wiki/%E5%87%B8%E5%A4%9A%E9%9D%A2%E4%BD%93

https://ja.wikipedia.org/wiki/%E6%AD%A3%E5%85%AB%E9%9D%A2%E4%BD%93


?Convex polyhedra

https://en.wikipedia.org/wiki/Polyhedron#Convex_polyhedra

https://en.wikipedia.org/wiki/Octahedron
平面図形?「京都府立医科大学の2022年第1問」をsympy でやってみたい。

# 公式サイト

https://www.kpu-m.ac.jp/doc/examination/exam_gakubu/files/30169.pdf#page=2

「数学」解答例

https://www.kpu-m.ac.jp/doc/examination/exam_gakubu/files/30175.pdf#page=1

過去の入試問題と解答例

https://www.kpu-m.ac.jp/doc/examination/exam_gakubu/kakomon.html

# オリジナル

大学入試数学問題集成＞【１】

https://mathexamtest.web.fc2.com/2022/202211551/2022115510100mj.html#top-0101

# sympyで(値を入れてやってみた。)
直角三角形でやってみた。BC=5

```python
from sympy import *
var('t')
A=Point(0,0)
B=Point(3,0)
C=Point(0,4)
D=B+t*(C-B)
E=C+t*(A-C)
F=A+t*(B-A)
print("#(1)",Rational(1,3)*(A+B+C),Rational(1,3)*(D+E+F))
TwS=Triangle(D,E,F).area/Triangle(A,B,C).area
ans=solve(diff(TwS,t))[0]
print("#(2)",ans,TwS.subs({t:ans}))
DE2=(Segment(D,E).length**2).expand()
EF2=(Segment(E,F).length**2).expand()
FD2=(Segment(F,D).length**2).expand()
ans=solve(DE2+EF2-FD2)+solve(EF2+FD2-DE2)+solve(FD2+DE2-EF2)
DEF_t=[]
for item in ans:
    if 0.0 < Float(item) < 1.0:
        DEF_t.append(item)
print("#(3)",DEF_t)
#(1) Point2D(1, 4/3) Point2D(1, 4/3)
#(2) 1/2 1/4
#(3) [16/23, 9/25, 1/2]  並べ替え勉強中(20220726)
```

# sympyで(変数でやってみたい。)

```python
勉強中
```
YOLOv5 isinstance()の引数でTypeErrorとなり動作しない対策

if isinstance(vid_writer[i], cv2.VideoWriter):

この箇所でTypeErrorとなり、YOLOv5が実行できない。

対策
if isinstance(vid_writer[i], type(cv2.VideoWriter)):

とする。

追記
python3.6.9を使用してYOLOv5を動作させると出力されるエラーでした。
python3.7以降はこのエラーは発生しません。
DynamoDB のデータを web で表示 (FastAPI)

こちらのプログラムのバックエンドを FastAPI に変更しました。
[DynamoDB のデータを web で表示](https://qiita.com/ekzemplaro/items/c13785dcab66521672a1)
FastAPI のプログラムはこちらです。(CORS に対応しています。）
[FastAPI: DynamoDB のデータを読む](https://qiita.com/ekzemplaro/items/1994f40f229efe3d508d)

クライアントのツリー構造

```text
$ tree
.
├── index.html
├── public_doc.css
└── public_doc.js
```

public_doc.js だけ変更します。

```js:public_doc.js
// -----------------------------------------------------------------------
//	public_doc.js
//
//					Jul/26/2022
//
// -----------------------------------------------------------------------
'use strict'
// -----------------------------------------------------------------------
window.onload = ()=>{
	document.querySelector("#outarea_aa").innerHTML = "*** public_doc *** start ***"
	display_information()

	document.querySelector("#outarea_hh").innerHTML = "*** public_doc *** end ***"
}

// -----------------------------------------------------------------------
// [4]:
function display_information()
{
	const url_in = "http://localhost:8000/dynamo/uchida-test-cities"
	read_fetch_proc(url_in)
	console.log("*** display_information() *** end ***")
}

// -----------------------------------------------------------------------
// [4-6]:
function read_fetch_proc(url)
{
fetch(url,{ mode: 'cors' }).then((response) => {
        if(!response.ok) {
            console.log('Read error!')
            throw new Error('error')
        } 
        console.log('Read ok!')
        return response.text()
    }).then((data)  => {
	console.log(data)
	const dict_aa= JSON.parse(data)

	const	str_out = table_gen_proc(dict_aa)
	document.querySelector(".contents").innerHTML = str_out
    }).catch((error) => {
        console.log(error)
    })
}

// -----------------------------------------------------------------------
function table_gen_proc(dict_aa)
{
	var str_out = ""
	str_out += "<table>"
	for (var it in dict_aa)
		{
		const unit_aa = dict_aa[it]
		str_out += "<td>" + unit_aa["key"] + "</td>"
		str_out += "<td>" + unit_aa["name"] + "</td>"
		str_out += "<td>" + unit_aa["population"] + "</td>"
		str_out += "<td>" + unit_aa["date_mod"] + "</td>"
		str_out += "</tr>"
		}
	str_out += "</table>"

	return str_out
}

// -----------------------------------------------------------------------
```
default_scopeを使わずにorderメソッドでオブジェクトの並び順を変更する


# はじめに
default_scopeについて調べていると、「default_scopeは使うな」「default_scopeは非推奨」というワードが目に入りました。
今回はdefault_scopeを使わずに、orderメソッドでオブジェクトを新しいものから古い順に並び替えます。

### default_scope
```models/post.rb
class Post < ApplicationRecord
  belongs_to :user
  default_scope -> { order(created_at: :desc) }
  validates :user_id, presence: true
end
```

```posts_controller.rb
def index
  @posts = Post.all
end
```

```posts/index.html.haml
%ul
  - @posts.each do |post|
    %li
      = post.title
      = post.created_at
```
新しいものから古い順に表示されます。
<br>
### orderメソッド
```models/post.rb
class Post < ApplicationRecord
  belongs_to :user
  validates :user_id, presence: true
end
```
default_scopeの箇所を削除します。古いものから新しい順に表示されます。

```posts_controller.rb
def index
  @posts = Post.all.order(created_at: "DESC")
end
```
新しいものから古い順に表示されるのを確認しました。

# あとがき
初めてorderメソッドを使い、理解が深まりました。また、今後ソート機能について記事を書こうと思います。
【Laravel】 ControllerからViewへ変数を渡す

# 初めに
今までLaravelを使っていた際に、何となくcompact関数を使ってControllerからViewへ変数を渡していましたが、なぜ配列として渡す必要があるのかや、arrayやwithとの違いがいまいち分からなかったので、調べてみました。
今回はその備忘録になります。
何か間違っている箇所がありましたら、ご指摘いただけますと幸いです。

使用環境
・PHP 7.3.24
・Laravel 7.30.4
・M1 Mac

## viewメソッドを使った変数を送る際の仕組み
Laravelではviewメソッドを使うことで、指定したViewに変数を渡すことができます。
よくある書き方としては

```php
public function show($id) {
    $post = Post::find($id);
    return view('posts.show', ['post' => $post]); //viewメソッド
}
```

などがあります。（よくController内で見かける書き方かと思います）
実はこのviewメソッドはvendor/laravel/framework/Foundation/helpers.phpにヘルパとして定義されているので、様々なファイル上から利用ができているんですよね。

ヘルパとは簡単に言うと、Laravelの好きなところで呼び出すことができる自分で好きな名前と処理を記述した関数のことです。
Laravelではこのviewメソッドというのが、プロジェクトを作成した際にvendor/laravel/framework/Foundation/helpers.phpに自動で定義されるようになっているので、初めから使うことができています。

では、viewメソッドがどのように定義されているか見てみましょう。

```php
if (! function_exists('view')) {
    /**
     * Get the evaluated view contents for the given view.
     *
     * @param  string|null  $view
     * @param  \Illuminate\Contracts\Support\Arrayable|array  $data
     * @param  array  $mergeData
     * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
     */
    function view($view = null, $data = [], $mergeData = [])
    {
        $factory = app(ViewFactory::class);

        if (func_num_args() === 0) {
            return $factory;
        }

        return $factory->make($view, $data, $mergeData);
    }
}
```

この処理を見てもらうと分かるように、viewメソッドの第一引数にはファイルの情報である変数viewが、第二引数では送りたい変数の情報である変数dataが配列として定義されているかと思います。（第三引数は今回扱わないので、説明を割愛します）
このように定義されていることで、viewメソッドを使ってControllerからViewへ変数を渡すことができているんですね。
ただし、変数dataは配列として定義されているため、第二引数に変数を入れるときには配列にする必要があります。
そのためarrayやwith、compact関数を利用します。
では次にarray, with, compact関数を使ったそれぞれの変数の渡し方について見ていきましょう。

## arrayを使った変数の渡し方
arrayを使った変数の渡し方は下記になります。

```php
view('ファイル', ['渡す先での変数名' => $渡したい変数名]);
```

ここでは、連想配列として第二引数に渡したい変数を格納しています。
このときのキーは渡す先での変数名になるので、渡す先での変数名を元々の変数名とは違うものにしたいときはarrayを使うと良いでしょう。

## withを使った変数の渡し方
withを使った変数の渡し方は下記になります。

```php
view('ファイル')->with('渡す先での変数名', $渡したい変数名);
```

ここでは、withの第一引数に渡す先での変数名、第二引数に渡したい変数名を書くことで変数を渡すことができます。

複数の変数を渡したい時には

```php
view('ファイル')->with([
    '渡す先での変数名1' => $渡したい変数名1,
    '渡す先での変数名2' => $渡したい変数名2
]);
```

とすることで行うことができます。

## compact関数を使った変数の渡し方
compactを使った変数の渡し方は下記になります。

```php
view('ファイル', compact('渡したい変数名'));
```

ここでは第二引数にcompact関数を使って渡したい変数を配列として格納しており、渡す先での変数名は元々の変数名と同じになるので、特に変数名を変えない時に用いると良いでしょう。
また、array、withと比べると記述が少なくなるため、可読性が向上します。
このような理由からcompact関数を使った変数の渡し方がよく用いられています。

ただしこの時、

```php
view('ファイル', compact($渡したい変数名));
```

と書くとエラーが起こるので注意してください。

複数の変数を渡したい時には

```php
view('ファイル', compact('渡したい変数名1', '渡したい変数名2'));
```

とすることで行うことができます。

## まとめ
LaravelにおいてControllerからViewへ変数を渡す時に変数名を変えたい場合は、arrayかwithを使った書き方で、それ以外の場合は基本的にはcompact関数を使うと良いでしょう。
Linux上にリモートリポジトリを作る

# サーバー側でgit用ユーザアカウントを作成する
```
[root@node ~]# useradd ユーザ名 /* ユーザ作成 */
[root@node ~]# passwd ユーザ名 /* パスワード設定 */
```
# リモートリポジトリを設定するベースとなるディレクトリを作成する
```
[root@node ~]# mkdir -pv /opt/git /* ディレクトリ作成 */
[root@node ~]# chown ユーザ名：ユーザ名 /opt/git /* 先ほど作成したユーザに権限付与*/
```
# リモートリポジトリを作成する
```
[root@node ~]# cd /opt/git /* 作成したディレクトリに移動 */
[root@node ~]# mkdir test.git /* リモートリポジトリを設定するディレクトリを作成 */
[root@node ~]# cd test.git /* 作成したディレクトリに移動 */
[root@node ~]# git --bare --shared init /* リモートリポジトリを設定 */
```
# ローカルリポジトリにリモートリポジトリを追加する
```
[local@node ~]# git remote add リポジトリ名 ユーザ名@IPアドレス:/opt/git/test.git
```
# ローカルリポジトリからリモートリポジトリにプッシュする
```
[local@node ~]# git push -u リポジトリ名 リモートリポジトリのブランチ名:ローカルリポジトリのブランチ名
```
# git pushで「error: unpack failed: unpack-objects abnormal exit」エラー！
```
$ git push
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 2.77 KiB | 944.00 KiB/s, done.
Total 20 (delta 17), reused 6 (delta 5)
error: remote unpack failed: unpack-objects abnormal exit
To リモートリポジトリ
 ! [remote rejected] ローカルリポジトリのブランチ -> リモートリポジトリのブランチ (n/a (unpacker error))
error: failed to push some refs to 'リモートリポジトリ'
```
# 原因
いろいろあるようですが、私の場合はリモートリポジトリの権限エラーでした。
```
[root@node ~]# chown -R ユーザ名 /opt/git/test.git'
```
権限付与して無事解決。
# 参考
ありがとうございました！
http://note.kurodigi.com/linux-gitrepo/
https://nu-pan.hatenablog.com/entry/20140413/1397352725
GCPでfirestoreのバックアップデータを、別プロジェクトに移動する方法


>※こちらの方法は、同一Googleアカウントで作成したfirebaseプロジェクトのfirestoreデータ（バックアップ）を、別プロジェクトにインポートする方法です。

firebase の公式に以下のようなドキュメントがあり、色々と権限変更・追加などをする必要があると勘違いしていました。
[引用：Firebase公式](https://firebase.google.com/docs/firestore/manage-data/move-data?hl=ja)

しかし、管理者権限を持つGoogleアカウント（プロジェクトを作ったアカウント）で、GCPコンソールを開き、
コピー元のバックアップデータを、コピー先に移動、その後インポートするだけで、
特に権限変更・追加等しなくても、別プロジェクトのfirestoreバックアップデータをインポートすることができました。

上右部のメニューからCLOUDシェルを起動し、実際に実行するコマンドはこちら。

```
gsutil cp -r gs://[SOURCE_BUCKET]/[EXPORT_PREFIX]/ gs://[DESTINATION_BUCKET]
```

gs: の2つ目は、インポートしたいプロジェクトのバケットを指定します。


その後、インポートコマンド実行する際は、

```
gcloud config set [projectName]
```
のコマンドでプロジェクトの指定をします。


そして下のコマンドでインポートを実行します。
```
gcloud firestore import gs://[SOURCE_BUCKET]/[EXPORT_PREFIX]/
```
Tauriのexamplesを動かす

## はじめに

Tauriリポジトリにはexamplesというサンプルプロジェクトが用意されていて
Tauriの様々な機能を実際に動かして確認することができます。
examples内のいくつかのプロジェクトを実行したのでその備忘録です。

## 準備
[前回の記事でインストールしたもの](https://qiita.com/k-yanai60/items/d120a39578a3b29b953d#%E6%BA%96%E5%82%99)に加えて今回はgitも使います。

Tauriのリポジトリをcloneします。

```
$ git clone https://github.com/tauri-apps/tauri.git
```

実行方法はそれぞれのフォルダ直下にある`README.md`に書いてあります。

## helloworldを実行

リポジトリ直下で以下のコマンドを実行します。

```
$ cargo run --example helloworld
```

![helloworld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2693350/12736df0-6a49-974d-35ab-c408817e5388.png)

## navigationを実行

リポジトリ直下で以下のコマンドを実行します。

```
$ cargo run --example navigation --features window-create
```

![navigation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2693350/4671cc36-588f-59c4-b5fc-511aa3a7552f.png)

## multi-windowを実行

リポジトリ直下で以下のコマンドを実行します。

```
$ cargo run --example multiwindow --features window-create
```

![multiwindow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2693350/d0d7d21b-1c19-6bbf-d120-1cbfa6bbb43b.png)

## apiを実行

リポジトリ直下でセットアップスクリプトを実行します。

```
$ ./scripts/setup.ps1
```

apiフォルダ直下で必要なパッケージをインストールします。

```
$ cd ../examples/api
$ yarn install
```

以下のコマンドを実行します。

```
$ yarn tauri dev
```

![api.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2693350/c0a21541-cf64-9cdb-250b-1ec5183585a9.png)


## 終わりに

リファレンスを調べながら使い方を覚えるのもよいですが
予め用意されたサンプルコードを動かしたり修正するのも参考になります。

## 参考文献

https://github.com/tauri-apps/tauri/tree/dev/examples
firebase tracking eventの実装

# 初めに
今回は、`FirebaseTrackingEvent`の汎用的な実装方法を紹介していこうと思います。

### 本文
まずは、どの画面からでも呼び出せるように`FirebaseTrackingEvent`の`interface`を作っていきます。

```kotlin
interface TrackingService {
    fun track(
        trackingEvent: TrackingEvent,
    )
}
```
次に、`interface`の本実装をしていきます。

```kotlin
class TrackingServiceImpl @Inject constructor(
    private val firebaseAnalytics: FirebaseAnalytics
) : TrackingService {
    override fun track(trackingEvent: TrackingEvent) {
        firebaseAnalytics.logEvent(
            trackingEvent.key,
            trackingEvent.parameters.toBundle(),
        )
    }
}

// TrackingEventのパラメータをBundleに詰め替える拡張関数
fun Map<String, Any>.toBundle(): Bundle = Bundle().apply {
    this@toBundle.forEach { (key, value) ->
        when (value) {
            is String -> this.putString(key, value)
            is Int -> this.putInt(key, value)
            is Long -> this.putLong(key, value)
            is Boolean -> this.putBoolean(key, value)
            else -> throw IllegalArgumentException()
        }
    }
}
```
次に`interface`の本実装側で出てきた`TrackingEvent`というデータクラスを実装します。
これはtracking時にデータを格納する際に利用するデータクラスです
```kotlin
abstract class TrackingEvent(
    val key: String,
    val parameters: Map<String, Any> = emptyMap(),
)
```
最後に先述のコードを使った凡例を書いて終わりにしようと思います
```kotlin
class SomthingFragmentButtonTapEvent(example: Example) : TrackingEvent(
    key = "somthing_fragment_button_tap",
    parameters = mapOf("example" to example)
)
```

### 最後に
触る機会が少なく、アプリを初めから作ってないとわからない部分だったりするので何かのお役に立てれば幸いです。
備忘録としての役割が強いので、わかりづらかったら申し訳ないです
【Laravel9】テストコードの必要性

## Laravelにおけるテストとは
プログラミングをしていると、テスト工程は必ずあるものです。
そんなテストですが、なぜ行うべきなのか。

## テストコードとは
テストを行う理由はいくつかありますが、
第一に、*自身の書いたコードが、想定通りに動いているかを確認するため*に行います。

開発環境では動いていたものが、本番環境では動かなかったり。

新しい機能を追加した際、
これまで動いていたメソッドが動かなくなってしまったりと、

様々な箇所でバグが起こることはあります。

そんなときテストを実行できていれば、即座に見抜くことができます。

また他にも、

- PRレビューの工数を下げる
- 自身の実装の正しさを保証する
- コードの品質を高める
- 仕様書代わりになる

などもあったりするので、面倒ですが非常に重要な工程と言えます。

## 参考
https://pursue.fun/tech/app-test-summary/

https://zenn.dev/tis1116/articles/bef862a5754187

https://media.wemotion.co.jp/class-diary/%E3%80%90qa%E3%80%91%E3%83%86%E3%82%B9%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%BF%85%E8%A6%81%E6%80%A7%E3%81%A8%E3%81%AF/
gnuplot: ラベルがはみでる

gnuplotでラベルのフォントサイズを大きくしたりすると、枠からはみ出ることがある。
それを改善しようというのが目的である。

### 結論
set <上下左右>margin　<数字>を使う。
上:tmargin...top
下:bmargin...bottom
左:lmargin...left
右:rmargin...right

下側がはみ出た時は、例えばこんな感じ：
```
set bmargin 5
```
正の数で数字を大きくすると余白が大きくなる。この数字は文字サイズの数字なので、1なら一文字分くらいでイメージしやすい。
負の数も入力はできるが、正の数で微調整するのがいいと思われる。

また、
```
set bmargin at screen 5
```
のように、at screenを入れると文字サイズではなく、スクリーン領域の割合を表すらしいが文字サイズの方がイメージしやすそう（慣れたら違うのかも）。


これを使えば、pdfやeps、pngなどの出力画像中での位置をいじれる（そんなことをする必要があるのかはわからない）。
例えば左上に寄せたいなら、右側(rmargin)と下側(bmargin)を大きくしてやればいい。
FastAPI: DynamoDB のデータを読む

CORS に対応しています。

フォルダー構造

```text
$ tree
.
├── dynamo_scan.py
└── main.py
```

```py:main.py
#
#	main.py
#
#					Jul/26/2022
# ------------------------------------------------------------------
import json
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from dynamo_scan import dynamo_scan
# ------------------------------------------------------------------
app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.get("/")
def read_root():
	rvalue = {"morning": "おはよう","afternoon": "こんにちは"}
	return rvalue

@app.get("/dynamo/{table_name}")
async def get_dynamo(table_name: str):
	json_str = dynamo_scan(table_name)
	rvalue=json.loads(json_str)
	return rvalue
#
# ------------------------------------------------------------------
```

```py:dynamo_scan.py
#
#	dynamo_scan.py
#
#					Jul/26/2022
# --------------------------------------------------------------------
import	sys
import  json
import	boto3
from decimal import Decimal

# --------------------------------------------------------------------
def decimal_default_proc(obj):
	if isinstance(obj, Decimal):
		return float(obj)
	raise TypeError
# --------------------------------------------------------------------
def scan_all(table, scan_kwargs):
	items = []
	done = False
	start_key = None
	while not done:
		if start_key:
			scan_kwargs['ExclusiveStartKey'] = start_key
		response = table.scan(**scan_kwargs)
		items.extend(response.get('Items', []))
		start_key = response.get('LastEvaluatedKey', None)
		done = start_key is None
	return items
# --------------------------------------------------------------------
def dynamo_scan(name_table):
	dynamodb = boto3.resource('dynamodb')
#	name_table = "uchida-test-cities"
	table = dynamodb.Table(name_table)
	response = scan_all(table,{})
	json_str = json.dumps(response,default=decimal_default_proc)
	return json_str
#
# --------------------------------------------------------------------
```

サーバーの起動

```bash
uvicorn main:app --reload
```

クライアントでアクセス

```bash
http http://localhost:8000/dynamo/cities
```

データを Web で表示する方法はこちら
[DynamoDB のデータを web で表示 (FastAPI)](https://qiita.com/ekzemplaro/items/1a02a01a872f130c374a)
【Blue Prism】計算ステージでよく使うロジックについて、まとめてみた

# 計算ステージとは

Blue Prismの実装で、頻繁に使用される計算ステージ。

ここでは、計算ステージでよく使用されるロジックをご紹介します。

計算ステージとは、計算した結果や加工した文字列をデータアイテム等に格納するためのものです。
計算ステージには、２種類あり、下図の①が「計算ステージ」で、②が「複数の計算ステージ」です。
![計算ステージサンプル1_1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626430/3832bfc2-aeef-f02c-9ad0-dc635b6d55f4.jpeg)

---

計算プロパティでは、①の部分に計算する式を指定し、②に保存先を指定します。

![計算ステージプロパティ1_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626430/0de9958e-6143-662c-db85-616b5c5f0cb3.jpeg)

複数計算プロパティも同様に、①の部分に計算する式を指定し、②に保存先を指定します。
複数登録されている場合は、上から順に計算が行われます。
![複数計算プロパティ1_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626430/19471274-f608-d3c1-894a-9773cb891a1a.jpeg)

複数計算プロパティの場合は、電卓マークをクリックすると、下図が開きます。
同様に、①に計算する式を指定します。
![複数計算プロパティ2_1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626430/510d5d0a-9546-7128-4e3e-43026bbdd666.jpeg)

# よく使うロジック

# 数値を扱う計算
下記の式を指定し、保存先に数値型のデータアイテム[retry_count]を指定すると、
計算ステージを通るたびに、[retry_count]がカウントアップします。
インクリメントに使用します。
```
[retry_count] + 1
```
その他の四則演算の例。[上底]、[下底]、[高さ]は数値型のデータアイテム。
```
([上底] + [下底]) * [高さ] * 0.5
```

# 文字を扱う計算
#### Concatenate
文字列を連結します。下記の場合、"ABCxyz"が得られます。
```
"ABC" & "xyz"
```
#### Instr
特定の文字列が何文字目から始まるかを取得します。下記の場合、4が得られます。
文字列を含まない場合は、0となります。
```
InStr("Example", "mp")
```
#### Trim
文字列の先頭と末尾の空白を取り除きます。下記の場合、"Example"が得られます。
```
Trim("    Example   ")
```
#### Replace
文字列からtabを取り除きます。
```
Replace([Clipboard], Chr(9), "")
```

# 日付を扱う計算
日付を扱う場合、頻繁に使用する関数は、DateAdd関数とDateDiff関数です。
DataAdd関数は、日付に年・月等を加算します。
DateDiff関数は、二つの日時間の差を求めます。
これらの関数の一つ目の引数は、時間間隔（Interval）を表し、下記の通りです。
|Interval|DateAdd|DateDiff|
|:---:|:---:|:---:|
|0|年|年|
|1|週|年間通算週|
|2|-|週日|
|3|-|2番目|
|4|四半期|四半期|
|5|月|月|
|6|-|分|
|7|-|時間|
|8|-|年間通算日|
|9|-|日|

#### DateAdd
下記の例は、10年後なので、2032/07/26が得られます。
```
DateAdd(0, 10, ToDate("2022/07/26"))
```
下記の例は、6ヶ月前なので、2021/07/01が得られます。
```
DateAdd(5, -6, ToDate("2022/01/01"))
```
#### DateDiff
下記の例は、2022/08/30と2007/01/30の間の週数813が得られます。
```
DateDiff(1, MakeDate(30, 1, 2007), MakeDate(30, 8, 2022))
```
#### AddDays, AddMonths, MakeDate, FormatDate
また下記の例は、よく使用する日付計算で、当月末日を得る計算式です。
翌月一日の１日前が当月末日になります。
[now]には日本時間の現在日時が格納されているとします。
```
AddDays(AddMonths(MakeDate(1, FormatDate([now], "MM"), FormatDate([now], "yyyy")), 1), -1)
```
# その他の計算
論理式を含む計算です。保存先はフラグ型になります。
```
InStr([clipboard], [検索文字列]) > 0
IsNumber([sample1]) OR IsNumber([sample2])
```

## 注意点
Now()で得られる日時は、日本時間ではありません。
Now()の日時は、協定世界時なので、日本時間に変換するには、
時差の9時間を加算する必要があります。
SSLCertificateFile 

https://qiita.com/pink/items/08adbff63939b1184114

https://web.archive.org/web/20200719145145/http://www.nina.jp/server/slackware/httpd/ssl.conf.html

SSLCertificateFile [mod_ssl モジュール]

PEM 形式の WEB サーバ証明書ファイルを指定する。

SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
SSLCertificateKeyFile [mod_ssl モジュール]

PEM 形式の WEB サーバ秘密鍵ファイルを指定する。 SSLCertificateFile ディレクティブで指定したサーバ証明書にサーバ秘密鍵が含まれている場合は、SSLCertificateKeyFile ディレクティブは不要。 しかし、サーバ証明書とサーバ秘密鍵は分離することが推奨される。

SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
SSLCertificateChainFile [mod_ssl モジュール]

PEM 形式の チェーン証明書ファイルを指定する。

下位 CA によって署名されたクライアント証明書を認証に使用したい場合、ルート CA からのチェーン証明書が必要になる。

SSLCertificateChainFile /usr/local/apache2/conf/ssl.crt/ca.crt
SSLCACertificateFile [mod_ssl モジュール]

クライアント証明書を発行した CA の、CA 証明書ファイルを指定する。 クライアント認証で使用される。 複数の CA で発行されたクライアント証明書を使用する場合は、SSLCACertificatePath ディレクティブを使用する。

SSLCACertificateFile /usr/local/apache2/conf/ssl.crt/ca-bundle.crt
SSLCACertificatePath [mod_ssl モジュール]

クライアント証明書を発行した CA の、CA 証明書を置くディレクトリを指定する。 CA 証明書ファイルを置くだけでなく、CA 証明書のハッシュ.0（.0 を忘れるとエラーになる）を名前とした CA 証明書へのシンボリックリンクの作成が必要。

# ln -s ca-bundle.crt `openssl x509 -noout -hash -in ca-bundle.crt`.0
SSLCACertificatePath /usr/local/apache2/conf/ssl.crt

https://blog.cles.jp/item/7382
【Flutter】Freezedでオブジェクト初期化時に値をバリデートする方法

# はじめに
皆さん、[Freezed](https://pub.dev/packages/freezed)を使ってますでしょうか？<strong></strong>
<strong>簡単な記述</strong>で、Jsonのシリアライズ・デシリアライズや、オブジェクト同士の比較のオーバライドメソッドなどを生成してくれる<strong>Freezedは大変便利</strong>です。
特に便利に感じるというか、<strong>必須だと思うのが単体テストを書こうと思ったとき</strong>です。
Stringとかintのプリミティブ型を多用せず、オブジェクト指向に基づき、丁寧にクラス化を行っていると、
比較するオブジェクトに「==」と「hashCode」が必要になってくるので、
それを<strong>いちいち実装するのは結構手間</strong>になってきます。

また不変オブジェクトとして生成できるので、値オブジェクトにも使えるというのも利点かと思います。
<strong>本記事は値オブジェクトにFreezedを活用する際、コンストラクタで引数の値のバリデートを行う場合、どうすればいいかというプラクティスになります。</strong>
経緯として、値オブジェクトを表現する上で、<strong>初期化時に不正な値のチェックを行いたい(行わないと生焼けオブジェクトになる）</strong>という場面がありましたが、実装方法がわからなかったので調査したので、他にも困っている人がいるかと思い、アウトプットすることにしました。


# 対象読者
・Freezedを使ってコンストラクタで初期値のバリデーションを行いたい方

# 目次
1. [概要](#概要)
1. [サンプルコード](#サンプルコード)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#概要"></a>
# 概要
方法としてはシンプルで、<strong>コンストラクタにバリデーションを追加</strong>します。
一応、これだけでオブジェクト初期化時にバリデーションを行えて、不正な値だった場合、例外を投げるといった処理が可能となります。
しかし、上記の方法には<strong>一点だけ問題</strong>があります。
それは、<strong>自動生成される`copyWith`メソッド内でバリデーションを実装したコンストラクタが呼ばれないこと</strong>です。
つまり、`copyWith`を使うと不正な値が混入する可能性があるということです。
この問題に対処するべく、<strong>`copyWith`は自動ではなく、自分で実装する</strong>という方法をとりました。
(もっといい方法あれば教えてください...。)

<a id="#サンプルコード"></a>
# サンプルコード
ユーザーの声明を表現する`UserName`という値オブジェクトをFreezedで作成するというケースでサンプルコードを載せておきます。

```dart
import 'package:freezed_annotation/freezed_annotation.dart';
part 'user_name.freezed.dart';

// 大文字で@Freezedとすると、後ろに()書きで不要なものを削除できる
// 初期化する場合はcopywithを生成しないように指定する
// Freezedで自動生成された「copyWith」メソッドでは
// バリデーションを実装したコンストラクタ(サンプルコードでいうと「factory UserName」の部分)が呼び出されないため、
// copyWithは自分で実装する
@Freezed(copyWith: false)
abstract class UserName implements _$UserName{
  UserName._();

  factory UserName._internal({
    required String firstName,
    required String lastName,
  }) = _UserName;

  factory UserName({
    required String firstName,
    required String lastName,
  }){
    if(firstName.isEmpty){
      throw Exception("firstName is Empty.");
    }
    if(lastName.isEmpty){
      throw Exception("lastName is Empty.");
    }

    return UserName._internal(
      firstName : firstName,
      lastName : lastName,
    );
  }

  // バリデーションを実装したコンストラクタを呼び出すようにcopyWithを実装
  UserName copyWith({String? firstName, String? lastName}){
    final copiedFirstName = firstName ?? this.firstName;
    final copiedLastName = lastName ?? this.lastName;

    return UserName(firstName: copiedFirstName, lastName: copiedLastName);
  }
}
```

<a id="#reference"></a>
# 参考文献
* [【Stackoverflow】Freezedでの値のバリデーションについての質問](https://stackoverflow.com/questions/66952686/validating-freezed-model-classes)
cscの作法 その258

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
プロセスをキルせよ。

# サンプルコード

```
using System;
using System.Text;

namespace app
{
	class Program {
		static void Main(string[] args) {
			System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses();
			foreach (System.Diagnostics.Process p in ps)
			{
				if (p.MainWindowTitle != "")
				{
					Console.Write("ID: {0} ", p.Id);
					Console.Write("プロセス名: {0} ", p.ProcessName);
					Console.Write("ウィンドウタイトル: {0} ", p.MainWindowTitle);
					Console.WriteLine(" ");
				}
			}
			Console.WriteLine("kill processId");
			int line = int.Parse(Console.ReadLine());
			foreach (System.Diagnostics.Process p in ps)
			{
				if (p.Id == line)
				{
					Console.Write("kill ID: {0} ", p.Id);
					Console.Write("プロセス名: {0} ", p.ProcessName);
					Console.Write("ウィンドウタイトル: {0} ", p.MainWindowTitle);
					p.Kill();
					Console.WriteLine(" ok");
				}
			}
		}
	}
}



```

# 実行結果

```
>pro12
ID: 9640 プロセス名: WinStore.App ウィンドウタイトル: Microsoft Store
ID: 5548 プロセス名: ogrep ウィンドウタイトル: ogrep
ID: 6836 プロセス名: ShellExperienceHost ウィンドウタイトル: Windows シェル エクスペリエンス ホスト
ID: 9088 プロセス名: ApplicationFrameHost ウィンドウタイトル: 設定
ID: 8980 プロセス名: SystemSettings ウィンドウタイトル: 設定
ID: 5820 プロセス名: cmd ウィンドウタイトル: コマンド プロンプト - pro12
ID: 9124 プロセス名: oedit ウィンドウタイトル: C:\Users\*******\csc\pro12.cs - oedit
kill processId
5548
kill ID: 5548 プロセス名: ogrep ウィンドウタイトル: ogrep  ok

>
```

以上。
Rails6からRails7へのアップデート手順(Rails6.1.4.7→Rails7.0.3)

Rails6からRails7へのアップデートメモ
===================================

今更ですが、rails４からrails7までアップデートする必要があったため
[Rails4→Rails5](https://qiita.com/t_mapico/items/ddf423113225ac45b033)
[Rails5→Rails6](https://qiita.com/t_mapico/items/4865a33b03219c99abfd)
Rails6→Rails7
のアップデートで手順をまとめていきます。

ここではRails6→Rails7の手順を書いていきます。

## 事前準備

### testが通るようにしておく
testを通るようにしておくと、アップデート後に、どこがエラーになるのか確認しやすいです。
事前にtestが全て通るようにしておきましょう。

### Ruby Version
今回はRuby 3.1.2 で対応してます


## Railsをアップデート

### gemfileの修正

gemのrailsのバージョンを変更する
```
変更前
gem 'rails', '6.1.4.7'

```

```
変更前
gem 'rails', '7.0.3'
```

### railsのupdate
下記コマンドを実行してrailsをupdateします
```
bundle update rails
```

### 設定ファイル更新
以下のコマンドを実行して、Railsの設定ファイル等を更新します。
```
bundle exec rails app:update
```
問題なければ上書きして良いでが、
必ず差分を見ながら更新していきましょう。

### bundle update
bundle updateを実行して
gemファイルの依存関係などでエラーがある場合は修正しておきます。
```
bundle update
```

### db:migrate
```
# migrationファイルができるのでmigrate実行
bundle exec rails db:migrate
```


### エラーを修正

直でSQLを書いている箇所の、limit offsetの値もサニタイズされるようになり、
エラーになってしまったので修正しました

```
修正前
sql_txt += " ORDER BY ID DESC LIMIT :limit OFFSET :offset"
cond[:offset] = offest
cond[:limit] = limit
```

```
修正後
sql_txt += " ORDER BY ID DESC LIMIT #{offset.to_i} OFFSET #{limit.to_i}"
```


### sprockets4対応

manifest.jsに設定を移行しました

```
/config/environments/以下各ファイルの設定をmanifest.jsに移行
config.assets.precompile += %w(debug/*.js debug/*.css event/*.js event/*.css)
config.assets.precompile += %w(admin/*.js admin/*.css)

```

```
/app/assets/config/manifest.js

//= link_tree ../images .gif
//= link_tree ../images .png
//= link_tree ../images .jpg
//= link application.js
//= link application.css
//= link_tree ../javascripts/debug .js
//= link_tree ../stylesheets/debug .css
//= link_tree ../javascripts/event .js
//= link_tree ../stylesheets/event .css
//= link_tree ../javascripts/admin .js
//= link_tree ../stylesheets/admin .css
```

### ES6に対応

precompileでエラーが起きてしまい、調査したところ
actiontextで使用されるjs(ES6)がプリコンパイル対象に自動で追加されていて
アプリがES6に対応してなかったため、これを機にES6に対応しました。

gemfile変更
```
修正前
gem 'uglifier', '2.7.1'
```

```
修正後
gem 'uglifier', '4.2.0'
```

/config/environments/以下各ファイル

```
gem 'uglifier', '4.2.0'

修正前
config.assets.js_compressor = :uglifier
```

```
修正後
config.assets.js_compressor = Uglifier.new(:harmony => true)
```




### まとめ
Rails6からRails7へのアップデート手順をまとめていきました。
6にアップデートするときに、7へのアップデートを考慮して対応しておいたので
大幅な修正は必要ありませんでした。


### 参考
・[Rails アップグレードガイド](https://railsguides.jp/upgrading_ruby_on_rails.html)
[Laravel]Laravel Telescopeを使ってみる

# はじめに
デバッグツールとして**Laravel Telescope**を導入したので、ご紹介します。
# 環境
- Laravel：8.83.4

# 1. Telescopeとは
Laravel公式のデバッグ・パッケージであり、レスポンスの内容や発生した例外、SQLのクエリなどを視覚化してくれます。

https://github.com/laravel/telescope

# 2. 導入
公式ドキュメントを参考に、開発環境へインストールしていきます。

https://readouble.com/laravel/8.x/ja/telescope.html

以下の３つのコマンドでTelescopeをインストールします。
```php
composer require laravel/telescope --dev
php artisan telescope:install
php artisan migrate
```
この時点で
- telescope_entries
- telescope_entries_tags
- telescope_monitoring

という3つのテーブル作成されています。

次に、`config/app.php`ファイルから`TelescopeServiceProvider`の登録を削除（無効化）します。
```php:config/app.php
<?php

return [
//略
        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
        App\Providers\FortifyServiceProvider::class,
        // App\Providers\TelescopeServiceProvider::class　//この行を無効化する
    ],
//略
```
`App\Providers\AppServiceProvider`の`register`メソッドに登録します。
```php:app\Providers\AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //ここから追加
        if ($this->app->environment('local')) {
            $this->app->register(\Laravel\Telescope\TelescopeServiceProvider::class);
            $this->app->register(TelescopeServiceProvider::class);
        }
        //ここまで追加
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

```
最後に、`composer.json`に以下を追加して、本番環境でTelescopeライブラリが自動検出されないようにします。
```php:composer.json
{
    //ここから追加
    "extra": {
        "laravel": {
            "dont-discover": [
                "laravel/telescope"
            ]
        }
    },
    //ここまで追加
}

```
以上でインストール完了です。

サーバーを起動して、
```php
php artisan serve
```
`ローカル環境URL/telescope`にアクセスすると、ダッシュボードが表示されます。

# 3. 使ってみた感想
ダッシュボードから簡単に履歴を見ることができるので、簡単に使うことができました。
特に、1つのHTTPリクエストに紐づいたログやSQLクエリが見れるのが便利だと感じました。

効率よく開発を進めるために、活用していきたいと思います。

# 4. 参考文献

https://www.searchlight8.com/laravel-telescope-use/
Databricks(Spark)の Spark SQL にて変数を利用する方法

## 概要
Databricks(Spark)の Spark SQL にて変数を利用する方法として、`spark.conf` を利用する方法を紹介します。

## コード例１　カラムの値を指定
### spark.conf に値をセット

```python
spark.conf.set('da.val.msg', 'Hello World')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7c77b12f-39ec-edd8-6f5a-370b6551db7a.png)


### Spark SQL にて変数を利用

```sql
%sql
SELECT
  "${da.val.msg}" AS message
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0cfb0c88-beea-ee5a-cb40-cc4af7d9d06f.png)

## コード例２　テーブル名を指定
### 事前準備

```python
view_name = 'test'

spark.createDataFrame([{'int_col': '1'}]).createOrReplaceTempView(view_name)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5ed46091-3618-5dea-2b39-39c41b4198c5.png)

### spark.conf に値をセット

```python
spark.conf.set('dq.val.view_name', view_name)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4d2c8c42-0ee7-56a0-bb22-9c532bbb4424.png)

### Spark SQL にて変数を利用

```sql
%sql
SELECT
  *
  FROM 
    ${dq.val.view_name}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a35ca3fb-d262-1f41-f26a-7cb1a285dfa8.png)
TomcatプロセスをKillする方法

何度も遭遇するたびに調べているのでいい加減メモ。

※「ローカルホストのTomcatサーバーに必要なポートがすでに使用されている」ときに使用。

###  cmd（コマンドプロンプト）で、順にコマンドを実行。

```
netstat -ano | findstr 8080
```
プロセスの表示順は次の通り。

```
プロトコル ローカルアドレス 　　　　　外部アドレス 　　　　　　状態 　　　　　PID
TCP   　　　　 0.0.0.0:8080 　　 0.0.0.0:0   LISTENING 　19508
```

taskkillコマンドの強制終了(/F)にて、PIDを指定してプロセスをkill。

```
taskkill /F /pid 19508
```

以上。
CSVHelper 28.0.1 リリース

.net framework/dotnet core で使用できる CSV ファイルの I/O フレームワーク「CSVHelper」がバージョン 28.0.1 をリリースしました。

プロジェクトページ
https://joshclose.github.io/CsvHelper/

バージョン履歴
https://joshclose.github.io/CsvHelper/change-log/

### 新機能

28 の主な変更点は次の通りです。
※すいません、google翻訳です。

* 区切り文字検出アルゴリズムを更新しました。
* モードに基づいてエスケープされたテキストを削除します。
* すべての行に表示される区切り文字のみを検索します。
* すべての行にある場合は、CultureInfo.TextInfo.ListSeparatorを使用します。
* 処理されたフィールドをパーサーにキャッシュして、すべてのアクセスで処理されないようにします。
* CsvParser.Record []をキャッシュして、複数の呼び出しで再生成されないようにします。
* ShouldSkipRecordはデフォルトでnullであり、設定されていない場合は呼び出されません。
* ShouldSkipRecordArgsは、string[]の代わりにIReaderRowを保持するようになりました。
* CsvParserコンストラクターを変更して、CsvConfigurationではなくIParserConfigurationを取り込むようにしました。
* CsvConfigurationの代わりにIReaderConfigurationを取り込むようにCsvReaderコンストラクターを変更しました。

### バグフィックス

* アイテムの変換時にコレクションタイプが正しいMemberMapDataを取得していなかった問題を修正しました。
* BadDataFoundが同じフィールドに対して複数回呼び出されていた問題を修正しました。
* 名前がマップされているときにヘッダーがないと読み取れない問題を修正しました。
* 引用の前に空白にバッファスワップがあった場合、引用されたフィールドが正しく識別されない問題を修正しました。

### 仕様変更

* ShouldSkipRecordArgsは、string[]の代わりにIReaderRowを保持するようになりました。
* デフォルトがnullになるため、ConfigurationFunctions.ShouldSkipRecordを削除しました。
* IParserConfiguration.Validateを追加しました。
【Google App Script】Parserライブラリでwebスクレイピングする方法

webサイトの情報を収集して、一覧化/整形したいケースってよくありますよね？
その作業を自動で行う仕組みが「webスクレイピング」です。

webスクレイピングは色々なプログラミング言語で実行できますが、GAS（Google App Script）が最適と考えています。
というのも、収集した結果を出力先は、Googleのスプレッドシートが主流だと思うので、同じGoogleのサービス同士を使った方、親和性が高いです。

GASのwebスクレイピングにしようできるライブラリとして調べてみると、Parserというものに関する記事が多かったので、今回はParserライブラリを使ってみます。

# Parserライブラリの追加
1. GASの新プロジェクトを開くと、以下のような画面になります。
左メニューの「ライブラリ」をクリックします。
![スクリーンショット 2022-07-26 10.21.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727639/00035d87-20df-2047-0a8b-0d3605242eea.png)

2. 「ライブラリの追加」の画面が出てくるので、ParserライブラリのIDである「1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw」を入力して、「検索」ボタンをクリックします。
![スクリーンショット 2022-07-26 10.25.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727639/45803c8f-3dd9-5919-8794-400fd9438e52.png)

3. Parserライブラリが検索されるので、「追加」をクリックします。
![スクリーンショット 2022-07-26 10.25.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727639/1e4a7bc3-8697-8ff4-f354-0bcb386f61ef.png)

4. 「ライブラリ」メニューに「Parser」ライブラリが追加されました。
![スクリーンショット 2022-07-26 10.25.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727639/9e9d4937-d8dc-92e0-0a1a-9a4e90eb01d9.png)

# Parserの使い方
* 収集したいwebサイトの全体のhtmlを取得します。1行目の右辺を取得したいサイトのURLに変更するだけでOKです。
~~~
  var url = "[webサイトのURL]";
  var response = UrlFetchApp.fetch(url);
  var html = response.getContentText('UTF-8');
~~~

* 以下のコードで取得できます。
~~~
  var elem = Parser.data(html).from([開始位置のパターン]).to([終了位置のパターン]).build();
~~~

ここで、fromメソッドとtoメソッドに、抽出したい部分の情報を記載します。
例えば、サイトのタイトルを抽出したい場合は、以下のようになります。
~~~
  var elem = Parser.data(html).from('<title>').to('</title>').build();
~~~

## 参考記事
https://specially198.com/scraping-with-gas-using-parser-library/
新卒がCLF（クラウドプラクティショナー）を18日で合格した件について

## 初めに
初めまして、2022年4月に入社した新卒です。
初投稿ということもあり、わかりにくい部分も多くあると思いますが、流し見程度に見ていただければ幸いです。
今回はAWS資格の初級に位置する、CLF（クラウドプラクティショナー）の資格を18日間学習し取得しました。
その過程で使用した教材について紹介させていただければと思います。
この記事で伝えたいことは
 **『IT業務経験がない人でも最低限これだけやれば資格に合格する方法』** 
になります。
## 前提
勉強が嫌いな工学系の学科に通っていた私は、ITが得意ではなく、もちろんAWSも触ったことがありませんし、言葉すら初めてでした。
しかし、研修を受けて基礎的なITの知識を多少もち、ITパスポートは4月後半に取得しました。
また、研修ではAWSについてもEC2、S3、RDSについてやった記憶がかすかに残っている程度の知識状態で学習を始めました。

こんな私が、学習始めてから18日間自身の現状を把握し、何をすべきか管理することで<font color="red">717点</font>とギリギリ合格することができました。

## 最低限の学習ツール
最低限の学習ツールは主に3つになります。
1．AWSデジタルトレーニング　学習
　<font color="red">『AWS Cloud Practitioner Essentials (Japanese) (日本語字幕版)』</font>
2．Udemy
　<font color="red">『【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）』</font>
3．AWSデジタルトレーニング　テスト
　<font color="red">『AWS Certified SysOps Administrator - Associate Official Practice Question Set (SOA-C02 - Japanese)』</font>

1は教材で、2,3はテストになっています。
1のAWSデジタルトレーニング 学習はAWS CLF取得に必要な情報が11項目に分かれており各項目に動画解説、文章解説があります。
学習を進めていくと自身がどれだけ学習が進んでいるか進捗度が左上に表示されています。
私が行って感じた感覚だと1時間当たり進捗率15%の速度で進めることができると思います。
AWSデジタルトレーニングへの登録はわかりにくいため、他のサイトや記事を参考にしてみてください。

## 学習スケジュール
私は上記で示した最低限の学習ツール以外も学習に使用しました。
しかし、書籍を読むのが苦手であるため知識として定着しなかった時間もあります。
あまり定着しなかった学習時間と学習方法を除いた、有効な学習スケジュールについて下記の表に示します。ご参考になれば幸いです。

![CLFテストスケジュール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710652/48058b54-d70c-f698-6cbf-32944622fad6.png)

勉強時間としては約50時間でした。
集中し、下記に書かれているポイントを押さえて学習することができれば、今回私が学習に使用した時間よりも短く取得することができると思います。
休日にも学習しようとしていたのですが、時間を取れず勉強できませんでした。

## <font color="red">学習のポイント</font>
学習スケジュールでも既述したように学習時間は多くないです。
学習時間が多くなくても取得できるポイントをご紹介します。

* テストではIT用語が出てくるため<font color="red">わからない用語はすぐ調べる</font>。
* AWSデジタルトレーニング 学習 では動画を見ずに<font color="red">解説のみ</font>見る。
* Udemyのテストを解いた後の<font color="red">復習は一番多く設定する</font>。
* Udemyのテストを覚えてしまったらAWSデジタルトレーニング テストを行う。

解説のみしか見ない理由としては、2つあります。
１．解説文を読むだけで十分な情報を得ることができること。
２．解説動画にコーヒーショップの例を使用し説明していること。
私はその例だとコーヒーショップの情報や人物名に意識を持っていかれてしまい、理解しにくく、短期間で取得するには重要ではないと思ったためです。
その動画で想像しやすい方は是非活用ください。

Udemyのテストが解けるようになり、AWSデジタルトレーニング テストに挑戦し、80%ほど取れれば本番のテストに挑んでも十分だと思います。


## 最後に
CLFを取るのに『<font color="green">AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー</font>』を使用する方が多いと思います。
私も買いましたがほとんど確認していません。
そのため、その本を買うならUdemyのオンライン講座を購入検討してみてください。費用を抑えることができると思います。

テスト当時は身分が確認できるもの **<font color="red">2点</font>** お忘れないようご準備ください。
CLFはテストが終了すると合格か不合格かを確認することができるので、お忘れないようご確認ください。

これまでご紹介させていただいた内容は **『IT業務経験がない人でも最低限これだけやれば資格に合格する方法』** です。
そのため、実際に扱えるようになりたい方はハンズオンなどを使用し触ってみることでより理解が深まり、具体的な操作についてわかるようになると思います。

クラウドサービスは少し前から注目されている技術であり、AWSは最先端の技術をリリースし続けています。
そのため、今後AWS CLFの1つ上であるAWS SAAに挑戦していき、トレンドに敏感になり自身のスキル向上を目指して言いたいと思います。
また、SAAに挑戦し合格することができれば新しい記事を投稿しようと思います。

この記事が見てくださった方に役に立つことを願っています。
ここまで見てくださりありがとうございました。
取引責任者の件数をカウントするApexトリガー

親子の関係（主従でない）の時に集計項目が定義できないのでApexトリガーで実装しますが、毎回同じようなコードを一から書いているのでちょっと記録しています。


```
trigger ContactTrigger on Contact (After insert,after update ,after delete) {
    
    Set<Id> AccountIdSet = new Set<Id>();        
    if (Trigger.isDelete || Trigger.isUpdate) {
        for (Contact co : Trigger.old){
            AccountIdSet.Add(co.AccountId);
        }
    }
    
    if (Trigger.isInsert || Trigger.isUpdate) {
        for (Contact co : Trigger.new){
            AccountIdSet.Add(co.AccountId);
        }
    }
    
    
    List<Account> AccountList = [SELECT Id , (SELECT Id from Contacts) FROM Account WHERE Id =:AccountIdSet];
    List<Account> updateAccountList = new List<Account>();
    
    for (Account ac : AccountList ){
        Account upAc = new Account();
        upAc.Id = ac.Id;
        if ( ac.Contacts.size () >0 && ac.Contacts != null){
            upAc.Contacts_cnt__c = ac.Contacts.size ();
        } else {
            upAc.Contacts_cnt__c = 0;
        }
        updateAccountList.add(upAc);
    }
    
    if ( updateAccountList.size() > 0) update updateAccountList;    
    
}
```

同じ機能のトリガでテストクラスが欲しいみたい。

[how to write test class for this trigger?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HEiNhSAL)

```
@istest
public class RelatedContactTrigger_test {
    
    @istest 
    public static void testfunc()     {          
        
        test.startTest();    
        Account acc = New Account();
        acc.Name ='test';
        insert acc;
        
        Contact con = new Contact();
        con.LastName = 'No 1';
        con.AccountId = acc.id;
        insert con;
        
        List<Account> accList = [select Id,Count_of_Contacts__c from Account where Id =: acc.Id];
        system.assertEquals(accList[0].Count_of_Contacts__c, 1); 
        
        Contact con2 = new Contact();
        con2.LastName = 'No 2';
        con2.AccountId = acc.id;
        insert con2;
        
        delete con;
        
        List<Account> accList2 = [select Id,Count_of_Contacts__c from Account where Id =: acc.Id];
        system.assertEquals(accList2[0].Count_of_Contacts__c, 1); 
        
        
        test.stopTest();         
                
    } 

}
```


# その他の資料

+ [アカウントオブジェクトと連絡先オブジェクトがルックアップ関係にあるのに、内部的にマスターと詳細の関係があるのはなぜですか。誰かが理由を説明できますか？](https://developer.salesforce.com/forums/?id=9062I000000XqmQQAS)