OmniAICreator/Qiita-1.07M huggingface dataset:
M1 MacでのECRへのpushで ここに気をつけろ❗️

![horizontal-logo-monochromatic-white.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111658/890f9fe0-23b7-bbbe-329b-4498744deefb.png)


### 要点
- CodeBuild でエラー。何が起きたか気づきにくい  
`standard_init_linux.go:211: exec user process caused "exec format error"`
- amd64 のダイジェストを指定してpullしましょう

### 内容

2020年から Docker Hub の Pull回数制限がかかり、
回避のためにローカルからpushする方などいるのではないでしょうか。

M1 Macでも いつもの通り、
`$ docker pull XX:XX`
と普通に pull してしまうかもしれませんが、

対象のimageがマルチCPUアーキテクチャ対応だと、
自動選択で arm のイメージを持ってきてしまいます😱

ですので、amd64 のダイジェストを指定してpullしましょう。

### php imageでの簡易例
1. Tagsタブ -> OS/ARCH のlinux/amd64 を選択
![スクリーンショット 2021-02-20 15.58.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111658/04593668-3929-88de-c7a6-336a4d98f065.png)

1. DIGEST: の右をコピー
![スクリーンショット 2021-02-20 15.33.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111658/846949eb-78e1-d2bd-cf73-0eedc8421c31.png)

1. 以下のように pull する

    ```
    $ docker pull php:fpm-alpine3.13@sha256:4b90222a821ef24358d305cbe51ff65f31edea6e323b06f40ee1f800401ebaf0
    ```

1. 試しに run で確認して、arm や aarch という文字列がなければOK

    ```
    $ docker run 932a0ce9593c uname -a
    Linux 2309aaa4729b 4.19.121-linuxkit #1 SMP Tue Dec 1 17:50:32 UTC 2020 x86_64 Linux
    ```
rspecのテストでFactorybotが代入されなかった！？

# WHY
rspecでテストコードの記述中、Factorybotで二つの変数を定義しようとしたところ、片方は代入されるのに、片方はされなかったことが起きたのでアウトプットしていきます。

-----

##問題
今回はテストコードを記述し、いざ実行！とするとこのようなエラー文がずらり、、、
<img width="700px" alt="fact.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076167/e996d5c4-1574-d41a-5886-6e0fc81646c5.jpeg">

##対処
最近エラーを解除するのがとても楽しくなってきた自分ですが、とりあえず最初に目が止まったのは
「 Failure/Error: user = FactoryBot.create(:user)」
というエラー、
まぁ調べるまでもなくuserに入っていないという意味でしょう、、しかし、コードをみてみると、

```ruby
before do
    item = FactoryBot.create(:item)
    user = FactoryBot.create(:user)
    @sample = FactoryBot.build(:sample, user_id: user.id, item_id: item.id)
end
```
記述は上のitemと同じ、記述は間違っていない、、、となるとFactoryBot内がおかしいのか？とおもいましたが、
UserのFactoryBotは他のspecファイルでも使用しており、そこでは問題なく動作している、、、

続いてエラー文の下の方をみてみると
「Failure/Error: _query(sql, @query_options.merge(options))」
という文字が、調べてみるとテストではたまに起きて、変数が代入しきる前にテストが実行されたりすることで起こるのだそう、、、
解決策としては<b>sleep</b>というものを使う。
なので書いてみた

```ruby
before do
    item = FactoryBot.create(:item)
    user = FactoryBot.create(:user)
    @sample = FactoryBot.build(:sample, user_id: user.id, item_id: item.id)
    sleep(1)
end
```

これでテストは１秒ごとに実行される。

しかしエラーは治らなかった、となればやっぱり<b>代入がされない何かの理由</b>がある！！
ということで次に目が行ったのは
「Validation failed: Email has already been taken」という文字

直訳すると「メールはすでに使われている」というもの、
deviseを使っているので一意性があるのでしっかりバリデーションが仕事してくれています！

##解決
ということでFactorybotをみにいくと、

```ruby
FactoryBot.define do
  factory :user do
    nickname              { 'Test' }
    email                 { 'test@test' }
    password              { 'test111' }
    password_confirmation { password }
  end
end
```

このEmailに注目！
<b>一意性のある値をテストするときはFakerを指定しなければならない</b>のでemailの値を修正します！！

```ruby
email                 { Faker::Internet.free_email }
```

その後テストはエラーなく無事解決しました！！

なお、「Failure/Error: _query(sql, @query_options.merge(options))」に関してはその後も出たので、
sleepはそのままにしています。
【firestore】ある日、Error: Missing or insufficient permissions. となったときの対処法

ある日を境目に `Error: Missing or insufficient permissions.` となり、firestoreに接続できなくなった対処法

## 結論
firebaseの管理画面に移動し、Cloud Firestoreルールのtimestamp.dateを未来の日付にする。

```
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if
          request.time < timestamp.date(2022, 2, 11); ←未来の日付に設定
    }
  }
}
```
▼ 対象画面
![スクリーンショット 2021-02-20 16.16.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536932/ae3d37fe-705a-1465-46c5-407cb7689182.png)
vimでもファイルツリーを見られるようにする方法（VSCodeから移行した話）

## 経緯
普段はvagrant環境にVSCodeからremote sshで入って開発しているのですが、
諸々のバージョンアップをしている中で、
vagrantの挙動がものすごく重くなってしまいました。
macのアクティビティモニタを確認しつつ検証したところ、
どうやらVSCodeからvagrantにアクセスしている状況でのみ発生する様子。

おそらく今後も起こるであろうことが予想されるので、
いざというときに困らないよう、
いい機会なので、vimでの開発環境も整えてみることにしました。

## これまでVSCodeを使っていた理由
これまでVSCodeにこだわっていたのはひとえに、
ファイルツリーが使えることが最も大きな理由でした。
もちろん、文字列の整形、検索、テスト実行時のターミナルの表示からそのままファイルを開けたり等々、
便利プラグインはありましたが、
それなら他のCUI系エディタでも問題ありませんでした。
ただ、慣れていないディレクトリ群を触るときに、
ファイルツリーがないとどうしても開発効率が落ちるので、
VSCodeを離れられなかったというのが正直なところです。

ただ、ファイルツリーを必要なときにきちんと出せて、
便利系プラグインが使えるのであれば話は別です。

## 個人的に、VSCodeと比較した際のvimのメリット
実際に設定をして大きなメリットと感じたのは、
プラグインの設定が非常に簡単で、
開発環境が変わった際のプラグイン設定も爆速で済むという点です。
vimであれば、簡単にプラグインをコードで管理できるので、
PRJとともに開発環境が変わっても、
自身で取ったメモをファイル一つ分動かせば同じ設定をすぐに移管することができます。

これがVSCodeなら、開発環境毎にプラグインの入れ直しが発生してしまう上、
メモを用意しても結局一つずつ画面をポチポチする必要があり、時間も結構かかってしまいます。

## 今回vimで行った設定
vimでプラグインを入れるにはまず、「NEOBUNDLE」というプラグイン管理ツールをインストールします。
そしてそこに、必要なプラグインを突っ込んでいきます。
今回は、「NERD Tree」というファイルツリーを表示させるプラグインを導入した流れを記していきます。


### NERD Treeとは
vimを開き、ノーマルモードで`:NERDTreeToggle`と入力することで、
画面左側にファイルツリーを表示させることができます。
これを操作することで、直感的に別ファイルに移動していくこともできます。
ショートカットコマンドを設定することで、より簡単にツリー表示をさせることも可能です。
（当記事では、ショートカットコマンドの登録まで紹介します）

### 今回実施した利用環境
CentOS 7.6
MacOS 11.2

## プラグイン管理ツール「NEOBUNDLE」のインストール
まずは「NEOBUNDLE」のインストールです。
以下のカールコマンドを叩いてプラグイン管理ができる状態にします。

```
$ curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh | sh
```

## ~/.vimrcに以下のコードを貼り付ける
vim ~/.vimrcで、以下のコードを貼り付けます。

```
set nocompatible
filetype off
if has('vim_starting')
    set runtimepath+=~/.vim/bundle/neobundle.vim
    call neobundle#begin(expand('~/.vim/bundle/'))
endif

"insert here your Neobundle plugins"
NeoBundle 'scrooloose/nerdtree'

filetype plugin indent on
call neobundle#end()

"short　cut command is berrow"
nnoremap <silent><C-e> :NERDTreeToggle<CR>
```
## とりあえずどこかでvimを開く

ノーマルモードで、以下のコマンドを叩きます。

```
:NeoBundleInstall
```

## 実際にファイルツリーが表示されるか試してみる
どこかでvimを開いて、ノーマルモードで以下のコマンド叩いてみてください。
ファイルツリーが表示されるはずです。

```
:NERDTreeToggle
```

そして今回の設定では、以下ショートカットコマンドも利用できます。
ノーマルモードで、以下ショートカット・コマンドを実行してみてください。
この操作でも、ファイルツリーが表示されるはずです。
`Ctr + e`

## まとめ
NERDTreeの導入系記事で似たものがたくさんあるのは知っていましたが、
中には執筆年月日が古い記事もあったことから、
既存記事の指示のまま実行してもエラーが出る箇所等あった為、
備忘録も兼ねて自分の環境下で実際に動く設定を書き起こしてみました。

### 参考記事
[vim-plugin NERDTree で開発効率をアップする！](https://qiita.com/zwirky/items/0209579a635b4f9c95ee)
Pardot のプロセスオートメーション (Salesforce Classic) ⇒ セグメンテーションルールの使用

１．セグメンテーションルールを過去にさかのぼって実行するとはどういう意味ですか?
２．セグメンテーションルールで実行可能なすべてのアクションは何に関連していますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/2136969d-998b-ccc3-e4c6-7ba4b44eb8f4.png)
React Redux の Storeを空にする

React, Redux, ReduxToolKitにかまけていたら、storeキャッシュの方法がsliceの範囲外だったため、それの備忘録

## TL;DR

root reducerを設置して、storeにundefinedを設定する、

```action.ts
import { createAction } from "@reduxjs/toolkit";

export const clearCacheBase = createAction('[CORE/STIORE] Clear Store Cache')

export const clearCache = () => {
    return clearCacheBase()
}
```

```reducer.tsx
import { combineReducers, configureStore } from "@reduxjs/toolkit"
import * as fromTodo from "./todo"
import { clearCacheBase } from "./core/action"

const combinedReducer = combineReducers({
    [fromTodo.featureName]: fromTodo.reducer
})

export const reducers = (state, action) => {
    if(action.type === clearCacheBase.toString()) {
        state = undefined // undefinedを追加するとstoreが初期値に全て戻る
        // return combinedReducer(undefined, action)でも動く こっちの方が再代入なく直感的かも
    }
    return combinedReducer(state, action)
}

export type RootReducer = typeof reducers
```

```component.tsx
import React from 'react';
import { useDispatch } from "react-redux"
import { clearCache } from "../store/core/action"

/* eslint-disable-next-line */
export interface ButtonProps {}

export function Button(props: ButtonProps) {
  const dispatch = useDispatch()
  return (
    <div>
      <button onClick={() => dispatch(clearCache())}>clear cache</button>
    </div>
  );
}

export default Button;

```

[レポ diff](https://github.com/Ntakuya/react-material-dialog-snackbar/pull/3/files)
【初心者向け】scanf()使用上の注意

#目次 
[1.はじめに](#1-はじめに)
[2.キーボードからの入力](#2-キーボードからの入力)
[3.scanf()の使用例](#3-scanf()の使用例)
[4.バッファオーバーフローについて](#4-バッファオーバーフローについて)
[5.安易な解決方法](#5-安易な解決方法)
[6.フィールド幅を指定する](#6-フィールド幅を指定する)
[7.おわりに](#7-おわりに)


#1.はじめに
筆者自身半年前にC言語の学習を始めたばかりであることを最初にお断り申し上げます。自身も初心者ながら、様々な、初級的なプログラムを書いてきた身として、悩まされたが面白いなと思ったのがscanfでした。普段何も考えず使っていた方には一読していただけると幸いです。

#2.キーボードからの入力

c言語にはscanf()という入力を受け付ける関数が存在します。
初心者やテストプログラムでしか使われませんが、初心者が使う関数にしてはかなり難のある関数です。
メモリやポインタ、配列などを理解せずに、この関数を使用すると安易にエラーや、バッファオーバーフローを引き起こしてしまいます。
ここでは、その仕組みについては触れませんが、とりあえず皆さんが作ったプログラムが正しく動作するように、どのようなことをすればよいか、簡単に説明します。



#3.scanf()の使用例
よく入門書に書かれている感じで scanf を使いキーボードから文字を入力してみる。
※コピペして実行してみてください

```c
#include<stdio.h>

int main(void)
{ 
    char a[10] = {0};
    char b[10] = "shimada";
    scanf("%s",a);
    printf("%s\n",a);
    printf("%s",b); 
}
```

この場合9文字までの入力であれば正常に表示できるが10文字を超えてしまうとバッファオーバーフローとなり
b[10]の文字列を正しく表示できなくなってしまいます。

#4.バッファオーバーフローについて
C言語においてchar型の配列は、文字列を格納できる変数であるが、定義する際に、配列の大きさを指定する必要がある。
ここで問題になるのが、この最初に決めた配列の大きさより大きなサイズの文字列はその最初に決めたサイズ分は格納できるが、あふれ出た分がほかの変数に影響を及ぼすことがあるということである。これがバッファオーバーフローと呼ばれる現象である。この現象は主にC言語で起こる特有の現象である。

#5.安易な解決方法

入力をする配列を大きくすることにより、人間が入力するであろう、常識的な範囲内ではバッファオーバーフローが起きないようにする
※コピペして実行してみてください


```c
#include<stdio.h>

#define S_MAX 1024
int main(void)
{ 
    char a[S_MAX] = {0};
    char b[S_MAX] = "shimada";
    scanf("%s",a);
    printf("%s\n",a);
    printf("%s",b); 
}
```

このやり方で、C言語始めたての人が書いたプログラムならだいたい正常に動くと思いますが、根本的には全く解決していません。結局数千字の入力をされるとバッファオーバーフローが再び起きてしまいます。

#6.フィールド幅を指定する
scanf("%s",b)となっていたものを
scanf("%9s",b)と書き換えることで読み取りを行う文字数に制限をかける。
※コピペして実行してみてください

```c
#include<stdio.h>

#define S_MAX 10
int main(void)
{ 
    char a[S_MAX] = {0};
    char b[S_MAX] = "shimada";
    scanf("%9s", a);
    printf("%s\n",a);
    printf("%s",b); 
}
```
この方法をとれば、バッファオーバーフローは起きません。しかし、問題がなくなったわけではありませんが、入門ということであればここまでできれば、ほとんどのプログラムで問題はないでしょう。
このほかにも解決法は様々ありますがが、scanfはもう嫌だ、ほかの入力方法が知りたいという方は、fgetsなどほかの入力方法について調べることを強く推奨します。


#7.おわりに
実際にこの知識が生かされることがどこまであるか、わかりませんが初心者のうちから、C言語というのはメモリと深い関わりがあり、下手をすると、プログラムが壊れてしまうこともあるということは、今後C言語を学ぶ上で必要なのではないでしょうか。また、今回解決法として提示したやり方にも様々な問題があります。その壁にぶつかったときまた、ほかのサイトなどを調べて学習していただくことをお勧めします。
cesiumの作法 その2

#概要

cesiumの作法、調べてみた。
setView使ってみた。

#サンプルコード

```
var widget = new Cesium.CesiumWidget('cesiumContainer', {
});

widget.camera.setView({
	destination: Cesium.Cartesian3.fromDegrees(140.0 + 0.4, 38.0 - 0.1, 20000.0),
	orientation: {
		heading: Cesium.Math.toRadians(-10.0),
		pitch: Cesium.Math.toRadians(-15.0),
		roll: 0.0
	}
});

```

#成果物

https://embed.plnkr.co/plunk/pFCWBks9D259lmWC


以上。
【AWS】Route 53で独自ドメインを取得後にElastic IPを紐付ける〜世界のAmazon様、お世話になります〜

### 今度はなんの話し？
AWSにデプロイしたアプリケーションを独自ドメインで公開するまでの話しです。
独自ドメイン取得に関しては初めて行いました。
他のドメイン会社で取得も考えましたがAWS内で全て完結させたほうがややこしくなくていいかと思い、一本化することにしました。
これから行う方の参考になれば幸いです。


### １・Route 53のダッシュボードからドメインの登録


![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887559/95f628fe-d7e9-f114-4860-ee118d8debda.png)

### ２・ドメインの種類を決定
**.comの場合はそこまで入れるように**
ここで使われているかどうかのチェック。
ちなみにwwwはつかないので、.comであれば
`http://好きなドメイン.com`という感じになる。
![２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887559/963862da-ce00-3ba8-3056-22799766d185.png)

カートに入れて一番下の続行へ。

### ３・個人情報の入力


![３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887559/3486f711-1924-93b9-58d9-beb9c94127a1.png)

入力終わったら続行


### ４・手続きが終わったら保留中のリクエストに取得したドメインが表示される

![４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887559/3c0123bc-c1ea-9ca1-4f59-c2e6f5a7c7b3.png)


自分の場合は10分ぐらいで保留中から登録済みになった。


### ５・登録済みになったら、ホストゾーンの詳細からElastic IPを紐付ける


![５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887559/db1ef542-b49e-592b-d36f-8ae1a9217aba.png)


![６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887559/1011c729-5538-6994-2f56-7790a4444f99.png)


以上で取得したドメインに飛ぶと表示されるようになった。
独自ドメインの取得で色々知らない単語とかわかったつもりになっていて全然理解していないものが出てきた。
インフラ系はめちゃくちゃ奥が深いけど楽しい。
今後も学習を続けようと思えたいい作業になりました。
cesiumの作法

#概要

cesiumの作法、調べてみた。
CesiumWidget使ってみた。

#サンプルコード

```
var widget = new Cesium.CesiumWidget('cesiumContainer', {
});

```

#成果物

https://embed.plnkr.co/plunk/L2ROFyepKT4J7AMT


以上。
Project Euler 問題9「三辺の和が1000となるピタゴラスのトリプレット」

## 問題
a < b < c、 a*2 + b*2 = c*2 となるようなa、b、cの組のうち、a + b + c = 1000となる唯一の組の積(a * b * c)を求めよ。

> A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,

> a2 + b2 = c2
For example, 32 + 42 = 9 + 16 = 25 = 52.

> There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product abc.

## コード(Python)

```python
# 以下の条件を持つa、b、cの積を求める:
# (1) a、b、cは整数
# (2) a < b < c
# (3) a + b + c = 1000
# (4) a**2 + b**2 = c**2

# (1)〜(3)からaの最大値は332
for a in range(1, 332):
    # bの最小はa + 1
    # bの最大は1000からaを引いた残りからさらに1を引き(cを超えないようにするため)、2で割った値（小数点以下切り捨て）
    for b in range(a + 1, (999 - a)//2):
        c = 1000 - (a + b)
        if (a**2 + b**2 == c**2):
            print(a * b * c)
```
手紙～拝啓PMの君へ～

## PMとしてのわたし

昔々、ゲームが作りたくて街の小さなゲーム屋に就職しまして。
小さなゲーム屋だったので、企画やプログラム書く傍ら顧客窓口や進行管理なんかもやらされましてPM歴は20年ぐらいになるのですが、体系立てて「PMとは」みたいなことは学んだことがないです。

厳密には、「月何コマでxxxxx円」の様な外部セミナーでPMの授業を受けたことはあるので、体系立てて学んだ事がないわけではないです。ただ、講師が開始早々「正解はない」と言い放ち書籍を棒読みしてましたので、これはノーカウントにしています。

そんなわたしに宛てて、PMの仕事について手紙を送ります。


## PMがマネジメントするものは？

多分、明文化できる「正解はない」というのは正解で **「問題解決力」** や **「対応力」** といったスキルを身につけるというのが大事なのかなと今は考えています。

これは基本的な管理手法を学ぶ意味がないのではなく、管理手法は学んだ上でそれぞれのプロジェクトにどうやって対応していくのか、という手法を更新し続ける必要があるという考えです。

PMがマネジメントするのは **「プロジェクト」** ではなくて **「プロジェクトを形成する人々」** と考えるとシンプルかと思っています。一つ一つのプロジェクトで参加メンバーは新しくなっていくのだから、古いルールを適用し続けてもうまくいかなくなる、というのは想像に難しくないと思います。

※「サーバント・リーダーシップ」という考え方も「プロジェクトを形成する人々」に対する考え方で「プロジェクト」に対する考え方ではないですよね？


## プロジェクト管理？

「プロジェクトを形成する人々（顧客も含めたプロジェクトメンバー）」ではなく「プロジェクト」という形のないものを管理対象とすると定量的に管理ができて簡単に見えます。

- 納品物を定義
- 各工程の作業を人月単位で工数見積
- WBS提出
- 進捗報告

多くのPMが「プロジェクト管理」として考えるのがこれかと思いますが、この中に「マネジメント」出来る要素があるか考えてみてください。

どうでしょうか？

一見、きちんと定義されているようで、何らかの問題が発生した時の対処方法が何一つ定義されていないです。
問題に対処できない手法は、 **管理手法としては片手落ち** だと思いますが、これ以上の考察がされることはあまりないように思います。

「ポピュラーな対処方法」は作業見積にバッファを載せたり、帳尻が合わなかったら顧客と日程を調整する、あるいは、栄養剤を差し入れる、現場を怒鳴り散らす、でしょうか。


## プロジェクトマネジメント？

IT業界の標準見積単位は「人月」です。
何十年もその単位の不備は指摘されつつも、それに変わる単位が発明されていないのが現状です。

プロジェクトに参加するメンバーが未経験の新人でも経験10年のベテランでも経験内容によらず１ヶ月稼働すれば１人月でカウントです。

この様な状況で「理想的なメンバー」を想像したり予算を考慮したりして適当に係数をかけて工数見積を行うのが慣例です。あとは「充分なバッファを取って見積もりしたから現場でなんとかしろ」というのはマネジメントと言えるのでしょうか？

予算が潤沢な頃のプロジェクトであれば、プロジェクトチームが大きく予算にも余裕があったので、その様な計算式や手法でも問題がなかった（１人月以上働ける人間に負荷をかけることで問題が顕在化しなかった）けれども、未経験者は経験を積めないまま年を重ることになり、問題が悪化した状態で先送りされた様に思います。

これを鑑みると「構成されたプロジェクトメンバーに合わせて最適な形で課題を切り出して、人月ベースではないスケジュールを策定していく」ことでカイゼンが期待されると想像されますが、これって、単に **「スクラム」** で提唱されている理念を指していると思います。

人月に変わる単位は多分出てこないし、そこを考えてもあまり意味がないので、スクラムやアジャイルという開発手法が体系化されたのかもしれません。

個人的には、スクラムでマネジメントすればうまくいくのではなく、理念を理解しないでスプリントとかPOとか形だけ真似してもうまくいかないし、逆に解決すべき課題の認識さえあってれば、スクラムにこだわる必要はないと考えています。


## 業界の大いなる流れ：育成から即戦力へ傾倒

不景気により予算が縮小され、大きなプロジェクトを形成することが難しくなりました。
ちょっとした遅延が、即致命傷になります。

「プロジェクト管理」をしていたPMでは、即戦力以外のメンバーではプロジェクトを完遂することができないので当然の流れかと思います。

そして、その様な状況を目の当たりにしている若い世代が「責任は取りたくない、管理職になりたくない」と考えるのもやはり当然の流れかと思います。


## 拝啓PMの君へ

業界の大いなる流れは変わらないと思います。
緩やかに、ひょっとしたら急激に状況は悪くなっていくかもしれません。

わたしも、状況を悪くするのに無意識に加担しているかもしれないけれど、できることは頑張りたいと思います。

PMをやれって言われてしばらくは嫌で仕方なかったと思うけど、よい経験になったと感謝する日が来ます。
今PMをやっているあなたが、「プロジェクトを形成する人々」をよりよい未来に導く様にマネジメントをしたら、違う未来になるかもしれないと期待しています。
Ichigojam BASICでSTTS751を使い温度を表示(AQM0802A)する。


x 愛用していたSTTS751の入手が難しくなったので代用品は、S-5851A。(おもにアドレスの違い)

前にichigojam用に書いたプログラム
書いたのは、本人だからコピーでは、ない。
説明は、特にない。


```

10 'AQM0802A STTS751 ONDO
20 POKE #700,#0,#38,#0,#39,#0,#04,#0,#14,#0,#70,#0,#56,#0,#6C,#0,#38,#0,#C,#0,#1,#40,#41
30 FOR I=0 TO 10:R=I2CW(#3E,#700+I*2,2):NEXT
40 'READ TMP
50 POKE #700,0
60 R=I2CR(#39,#700,1,#701,1)
70 T=PEEK(#701):?T
80 'WRITE TMP
90 POKE #700,0,1
100 R=I2CW(#3E,#700,2)
110 POKE#700,#40,48+T/10,48+T%10
120 R=I2CW(#3E,#700,3):WAIT 30
130 GOTO 50


```
React Typescriptでcontainer単体テストでつまったはなし

##### 概要

React Typescript, jestで単体テストの簡単な作り方。

##### Tl;DR

redux-mock-storeでmock-storeを作成。
jest.requireaActualでProvider呼び出し、useDispacthとuseSelectorをmock化する。

- [レポ](https://github.com/Ntakuya/react-material-dialog-snackbar/blob/feature/redux/apps/material/src/app/containers/todo-list-container.spec.tsx)

想定ファイル

```todo.tsx
import { createDraftSafeSelector } from '@reduxjs/toolkit';
import React from 'react';
import { selectAllTodo } from '../store/todo/selector';
import { useselector } from "react-redux"

const containerSelector = createDraftSafeSelector(
  selectAllTodo,
  todos => ({
    todos
  })
)

/* eslint-disable-next-line */
export interface TodoListContainerProps {}

export function TodoListContainer(props: TodoListContainerProps) {
  const { todos } = useselector(containerSelector)
  return (
    <div>
      {todos.map(t => (<div key={t.title}>{t.title}</div>))}
    </div>
  );
}

export default TodoListContainer;

```

テストファイル

```todo.spec.tsx
import React from 'react';
import { render } from '@testing-library/react';

import TodoListContainer from './todo-list-container';

describe('TodoListContainer', () => {
  it('should render successfully', () => {
    const { baseElement } = render(<TodoListContainer />);
    expect(baseElement).toBeTruthy();
  });
});

```

## 解決策として、redux-mock-storeとjestでモック化する

```todo.spec.tsx
import React from 'react';
import { cleanup, render } from '@testing-library/react';
import configureStore from "redux-mock-store" // reudux mock storeでデータを読み込む
import TodoListContainer from './todo-list-container';

const mockStore = configureStore() // mockStore Functionを作成

// jest.mock('react-redux') で'react-redux'全体がMock化されるため、ProviderをActualで呼び出す。
const { Provider } = jest.requireActual("react-redux")

// mock化されたdispatcherとselectorを作成
// selectorの実装を変えたときについては、jestのmock functionを書き換える。
jest.mock("react-redux", () => ({
  useselector: jest.fn().mockReturnValue({
    todos: []
  }),
  useDispatch: jest.fn().mockReturnValue(jest.fn())
}))

describe('TodoListContainer', () => {
  afterEach(() => {
    cleanup()
  })
  it('should render successfully', () => {
    const { baseElement } = render(
      <Provider store={mockStore()}>
        <TodoListContainer  />
      </Provider>
    );
    expect(baseElement).toBeTruthy();
  });
});

```

以上で、React Typescriptでcontainer単体テストをとりあえず実装できます。
Unit/Integrationを利用する場合は比較的つかえるかなとおもいますが、作り込む場合はjestの学習コストがあがるのできっと、人柱が必要になります。
WSL2が遅くてたまらない

# 困ってる事
Windows10 バージョン 20H2を使ってます。

WSL2で作業していると、それほどゴリゴリ使ってるつもりがなくてもPC全体が重くなることがありました。特にブラウザーの動作が遅くなって、作業にならない等。

WSLのコンソールで `free -m`を実行すると6GBメモリを使用。
PCのメモリーは8GBでこれは完全なメモリー不足。

どうもWSL2がメモリーを解放しない病気があるらしい。
これじゃあ、WSL2の良さも半減だなぁ。何とかしてほしい。

# 私の解決策

`%USERPROFILE%\.wslconfig`を作成し、WSL2に割り当てるメモリーの上限を設定。内容は次の通り

```config:%USERPROFILE%\.wslconfig
[wsl2]
memory=2GB
swap=2GB
```
memory, swapの量はお好みで調整してください。
本体のメモリーが8GBとちょっと少な目なので、WSLに２GBまでに抑えて、足りないところはSWAPで頑張れ（増設のnVMEのSSD頼む）という感じにしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/1fb201f8-2c48-1ef4-681f-95d9ab09db90.png)


参考
https://www.google.com/search?q=wsl2+vmmem&oq=wsl2+vmmem
[FPGA][Verilog] モジュールのパラメータ定義と継承

今回は、verilog HDLでのモジュールでのパラメータ定義について説明します。個人的には、ユーザー変更を要するパラメータは上位モジュールから継承して下位モジュールで使用する方にした方がいいと思います。

## 基礎知識

 - パラメータの型は指定しなければ32bit。  
 - パラメータをローカルで使うなら、モジュールでの定義は不要。

## 書き方の例

例えば、上位モジュールで使っている2つのパラメータ(param1とparam2)を使いたい場合、下位モジュールで使用する場合、以下のように定義。

### 1.下位モジュールでのパラメータ定義

**下位モジュールsub.v**

```
module sub
\#( // パラメータ引数
  parameter param1=100,
  parameter param2=200
 )
( // ポート引数
  ...
 )
```

あるいは、ローカルでそのまま使うなら以下の通り（一番シンプル）。

```
module sub
( // ポート引数
  ...
 )

  parameter param1=100;
  parameter param2=200;
```


### 2. 上位モジュールでのパラメータ定義
上位モジュール(top)における下位モジュール(sub)パラメータの定義方法は、使い方に応じて、３パターンあり。

#### 使い方①
上位モジュールで使っている2つのパラメータ(param1とparam2)を、下位モジュールでそのまま使いたい場合(上位から下位へパラメータを継承する場合)

**上位モジュール(top.v)**

```
module top
(
  ...
 )

parameter param1=100; // 下位モジュール(sub)で使いたいパラメータ1
parameter param2=200; // 下位モジュール(sub)で使いたいパラメータ2

sub
\#( // パラメータ引数
 .param1(param1), //上位モジュール(top)のparam1を下位モジュールのparam1でそのまま使用
 .param2(param2) //上位モジュール(top)のparam1を下位モジュールのparam1でそのまま使用
)
( // ポート引数
...
)
```

#### 使い方②

上位モジュールで、下位モジュール のパラメータをいじりたいとき(上位から下位へパラメータを継承しない場合１)

**上位モジュール(top.v)**

```
module top
(
  ...
 )

// 下位モジュールに使用しないので上位で定義する必要なし
//parameter param1=100; 
//parameter param2=200; 

sub
\#( // パラメータ引数
 .param1(100), //ここで下位モジュールのparam1の値を設定
 .param2(200) //ここで下位モジュールのparam2の値を設定
)
( // ポート引数
...
)
```

#### 使い方③

下位モジュールのパラメータを上位モジュールで直接変更する場合(ただし、上位から下位へパラメータを継承しない場合２)

**上位モジュール(top.v)**

```
module top
(
  ...
 )

// 下位モジュールに使用しないので上位で定義する必要なし
//parameter param1=100; 
//parameter param2=200; 

sub
//\#( // パラメータ引数をここで定義する必要なし。この場合、下位モジュールで定義した値がそのまま使用される。
// .param1(100), //ここで下位モジュールのparam1の値を設定
// .param2(200) //ここで下位モジュールのparam2の値を設定
//)
( // ポート引数
...
)
```

## 参考URL
[verilog~module内パラメーターの階層間受け渡し](https://keymale.xyz/2018/11/25/post-154/)
Google Cloud Storageを一般公開する

# Google Cloud Storageを一般公開する
## コンソール操作
### バケット作成

最初にバケットを作成
![screencapture-console-cloud-google-storage-create-bucket-2021-02-20-11_46_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/edd29bef-c280-1986-27a4-659d4ee888a3.png)

### 権限追加

新しいメンバーに「allUsers」
ロールに「Storage オブジェクト閲覧者」を設定
![screencapture-console-cloud-google-storage-browser-pg-news-tab-permissions-2021-02-20-15_01_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/551ea4f4-92c9-e1e5-3ce8-34a3d5940a83.png)

公開アクセスされた状態になった、試しに画像をアップロード
https://storage.googleapis.com/pg-news/php-news-cover.png （画像は適当）
![screencapture-console-cloud-google-storage-browser-pg-news-tab-objects-2021-02-20-15_15_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/ab86873b-4d20-5f52-8364-e77f2dee028c.png)

---

ブラウザでURLアクセスできるようになりました
いいね！と思ったら LGTM お願いします :clap::clap::clap:

【PR】週末ハッカソンというイベントやってます！ → https://weekend-hackathon.toyscreation.jp/about/
VSCode+dockerで開発環境をサクッとつくる基本手順

# はじめに

Node.js,Vue.js,Vuetifyの環境を例に手順を記載します。
使用する言語により開発環境にインストールするパッケージや、Dockerのイメージは変更してください。

# 事前準備

Docker desktopをインストールしておく
VSCodeにRemote-Containers Pluginを入れておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/3b95c039-3b11-bccd-5d65-d58dd3dbe483.png)

Windowsのファイルシステムにコンテンツおいて、コンテナで参照すると速度がかなり遅くなるらしいです。WSL2内にファイルを置いた方よいそうです。
このため、WSL2も使えるようにして、います。

# 手順
1. ソースを作成するフォルダを作成
work/vuetify01
2. VSCodeでこのフォルダを開く
3. Ctrl+Shift P でコマンドパレットを開いて、Add Development Container Cinfiguration Filesを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/90349799-3a0c-64e5-b12f-b8ef23c4a49c.png)

1. Show All Definitionsを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/d9827e71-f2f9-db46-fc53-13d3447ff793.png)

1. コンテナを選ぶ。今回はNode.js & TypeScriptにしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/97117c9e-aa22-2fb5-1aae-98bf57590cbc.png)

1. バージョンを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/7dc2d7fb-5aa3-6717-3edc-a47398abbcac.png)

1. devcontainer.jsonファイルに`"postCreateCommand": "yarn global add @vue/cli && yarn install",`を追加
こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/776917e8-f418-f6fd-62ae-a02f57b1afa4.png)

1. コマンドパレットで、Rebuild and Reopen in Containerを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/b2ee1a8f-9a63-3b3f-e98a-8b8b5e08f90a.png)
VSCodeが再起動して、Containerが起動し接続した状態になります。
ターミナルを開くと、コマンドプロンプトがコンテナ内になっていることが分かります。nodeも使える状態になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/02b1d5a3-8666-b8c8-9f7d-51d5de7a91a6.png)

1. vueプロジェクトの作成や、追加パッケージのインストール

```shell
$ cd ..
$ vue create vuetify01
$ cd vuetify01/
$ yarn serve
$ vue add vuetify
```
以上
【iOS】RxCocoa,RxSwiftで複雑なTableViewを実装する

`RxCocoa,RxSwift`で`section`をつけたり複雑な実装をするときは`RxTableViewDataSourceType`を準拠したカスタム`UITableViewDataSource`を作成する必要があります。

## RxTableViewDataSourceTypeを準拠したUITableViewDataSourceの作成
準拠させる際に`NSObject`も準拠させる必要があるところに注意

```swift
class CustomTableViewDataSource: NSObject, UITableViewDataSource, RxTableViewDataSourceType {
    // セクションを作る場合は多次元配列にする
    // Modelは任意のデータ型
    typealias Element = [[Model]]
    var items: Element = [[]]

    func tableView(_ tableView: UITableView, observedEvent: Event<[[Model]]>) {
        Binder(self) { dataSource, element in
            dataSource.items = element
            tableView.reloadData()
        }
        .on(observedEvent)
    }
}
```

#### セクションの作成
```swift
class CustomTableViewDataSource: NSObject, UITableViewDataSource, RxTableViewDataSourceType {
    // セクションの個数
    func numberOfSections(in tableView: UITableView) -> Int {
        return items.count
    }

    // セクション内のcellの個数
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items[section].count
    }
}

extension CustomTableView: UITableViewDelegate {
    // セクションに設定するViewを返す
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        return CustomTableHeaderView()
    }
    
    // セクションの高さを返す
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 30
    }
}
```

#### セクション内のcellの描画
```swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: R.reuseIdentifier.scheduleListCell.identifier, for: indexPath) as! CustomTableViewCell
        // ここでcellのinitととかを必要であればやる
        return cell
    }
```
#### スワイプでセルの削除などアクション有効にする
cellをスワイプしてアクションを表示させたい場合、`canEditRowAt`を有効にする必要がある。

```swift
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true
}
```

## TableViewを描画する
前項までで作成したDataSourceを元にTableViewを描画する。

```swift
// Modelは任意のデータ
var items = BehaviorRelay<[[Model]]>(value: [])
let customDataSource = CustomTableViewDataSource()
private let disposeBag = DisposeBag()

private func observeList() {
    // itemsとcustomDataSourceを元にtableViewを描画する
    items
        .bind(to: tableView.rx.items(dataSource: customDataSource))
        .disposed(by: disposeBag)
}

// delegateを設定
private func setDelegate() {
    tableView.rx.setDelegate(self)
        .disposed(by: disposeBag)
}

// cellの選択
private func observeSelect() {
    tableView.rx.itemSelected.subscribe(onNext: { [weak self] indexPath in
        // 選択された時のアクションを記述
    }).disposed(by: disposeBag)
}
```
ブランチを切り忘れてpushしてしまった際の対処法

今回はGithubでブランチを切り忘れて、リモートマスターにpushしてしまった時の対処法を書きます。

#今回のゴール
・マスターブランチを元に戻す
・元に戻した段階でnewブランチを作成。
・元に戻すまでの内容をnewブランチに載せて、pushする
・プルリクエストを行う

#はじめに
ローカル上でブランチを切り忘れて、リモートブランチにプッシュしてしまうことはたびたびあると思います。しかし、正しい対処法を講じれば全く問題ないことです。

#手順の確認

以下の４ステップで覚えておくと良いでしょう。
1.githubデスクトップで　revert する
2.ブランチを切る
3.git cherry-pick でリバートを復元する
4.コミット、プルリクエスト

##1.githubデスクトップでrevertする

Github上でリバートする方法はHistoryの中の元に戻したいコミットを選択し、右クリックでRevertChanges in Commitを選択します。↓
![revert.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985033/21860737-f383-c6d8-9ddf-f7200aac2671.png)


revertしたコミットはRevert"〜"という形で新たにヒストリーに追加されます。
![revert後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985033/77a5c4cf-68f3-ca16-44d3-b5baa95dd71f.png)
リバートした内容はHistoryに残るため、後の作業で復活させることができます。
また、この作業はでローカルのマスターブランチとリモートのマスターブランチ両方に作業が反映されますので、リモートのマスターブランチ上でも"データベース設計の構築"がrevertされなくなっております。
ここまでで一度、テキストエディタでコードが元に戻っているかを確認しましょう。

##2.ブランチを切る
Git hubでブランチを切ります。GitHub desktopsの上部メニュー：current branchを選択し、new branchでブランチを作成します。
ブランチが作成されましたので、当該ブランチにrevertした内容を復元してプルリクエストを行います。

##3.git cherry-pick でリバートを復元する
GitHub desktopのヒストリーで元に戻したいcommitで右クリックして　Copy SHA を選択します。この操作ではヒストリーのリバートした内容の番号を取得します。貼り付ける場合はcommand＋Vで貼り付けできます。↓
![SHA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985033/23557f8a-b4b0-3375-88af-d0b789402de3.png)

ターミナル上で、対象となるアプリケーションのディレクトリにいることを確認し、revertしたcommitを復元させるコマンドを入力します。
git cherry-pick　（command+Vで取得した番号を貼り付け）↓
![git charry-pick.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985033/92ee18de-2ae1-77cb-9224-8f2ab4377b0b.png)
このコマンドを実行すると、リバートした内容がGit hub desktopのcommit欄に戻ります。この内容をcommitし、pushするとnewブランチでプルリクエストが可能です。↓
![git charry-pick　済.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985033/ae90651b-0910-0741-2197-5a6cd6cdb072.png)

以上で、masterブランチを元に戻し、newブランチを作成してプルリクエストする作業は終了です。

#総括
今回の作業は、commitの内容を消す・復元することを行いましたので、小まめにcommitを行っていることが、前提となっております。
そのため、小まめにGitHubにてcommitを行うことを心がけましょう。
chainer+CUDA(11.0)+cuDNN(8.0)で畳み込みする際にPerformanceWarningが出る

# 概要
chainerでGPUを使ってCNNをする際に，以下のようなWarningが出てきました．

```
PerformanceWarning: 
The best algo of conv fwd might not be selected due to lack of workspace size (8388608)
```

実行自体は問題ないのですが，Warningが出るのは気持ちが悪いので修正方法を探しました．

# 実行環境
* chainer version 7.7.0
* CUDA 11.0
* cuDNN 8.0

# 原因
同じような問題に遭遇している方がいらっしゃいました．
[chainerでTensorcoreを使って学習の高速化](https://ja.stackoverflow.com/questions/45253/chainer%E3%81%A7tensorcore%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%AD%A6%E7%BF%92%E3%81%AE%E9%AB%98%E9%80%9F%E5%8C%96)

どうやらcuDNNがGPUのメモリ(workspace)を確保する際にサイズが不足していることが原因らしいです．

# 解決策
解決するには以下のようにworkspaceのサイズを設定することで，必要なメモリサイズを確保してあげれば良いそうです．

```python
ws_size = 256 * 1024 * 1024 # 256MB
chainer.cuda.set_max_workspace_size(ws_size)
```

この例の場合256MBを確保しています．
確保するサイズを調整することによっていづれPerformanceWarningが出なくなります．

私の場合は512MBを確保したらPerformanceWarningが出なくなりました．

# 参考記事
[chainerでTensorcoreを使って学習の高速化](https://ja.stackoverflow.com/questions/45253/chainer%E3%81%A7tensorcore%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%AD%A6%E7%BF%92%E3%81%AE%E9%AB%98%E9%80%9F%E5%8C%96)
[chainer.backends.cuda.set_max_workspace_size](https://docs.chainer.org/en/stable/reference/generated/chainer.backends.cuda.set_max_workspace_size.html)
[ChainerでTensorコア(fp16)を使いこなす](https://www.slideshare.net/NVIDIAJapan/chainer-tensor-fp16)

# 後書き
他の複数の環境では出たことがなかったので環境依存なんですかね？
bevyのマウス座標の取り方

以前紹介したGUIクレートの中でbevyが個人的に使いやすかったので、GUIアプリを作成しようと試みてます。
その中でマウスの座標の値の取り方についてメモしておきます。

参考情報
bevy
https://github.com/bevyengine/bevy

ほぼsampleから抜粋して、構造体になっている部分の値を取得します。
必要なクレートは以下です。

```rust:Cargo.toml
[dependencies]
bevy = { git = "https://github.com/bevyengine/bevy" }
gfx = "*"
```

mainソースは以下です。
内容としては、Window上でマウスを操作して、マウスのクリックした方向（Left、Right）とクリックと離したことと座標をコンソールに表示してくれます。
cursor_positionはx座標とy座標を両方とも表示して、x_cursor_positionとy_cursor_positionはそれぞれの座標を表示してくれます。

```rust:main.rs
use bevy::{
    input::mouse::{MouseButtonInput},//, MouseMotion, MouseWheel},
    prelude::*,
    window::CursorMoved,
};

fn main() {
    App::build()
        .add_plugins(DefaultPlugins)
        .add_system(print_mouse_events_system.system()) //mouse event
        .run();
}

fn print_mouse_events_system(
    mut mouse_button_input_events: EventReader<MouseButtonInput>,
    mut cursor_moved_events: EventReader<CursorMoved>,
) {
    for event in mouse_button_input_events.iter() {
        let button_left_right = event.button;
        let button_press_release = event.state;
        println!("{:?}", button_left_right);
        println!("{:?}", button_press_release);
        for _cursor_event in cursor_moved_events.iter() {
            let cursor_position = _cursor_event.position;
            println!("{:?}", cursor_position);
            let x_cursor_position = cursor_position[0];
            let y_cursor_position = cursor_position[1];
            println!("{:?}", x_cursor_position);
            println!("{:?}", y_cursor_position);
        };
    }
}

```

表示例は以下です。

```rust:terminal
% cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.18s
     Running `target/debug/mouse-event`
Left
Pressed
Vec2(235.99947, 356.80524)
235.99947
356.80524
Left
Released
Vec2(235.99945, 356.80524)
235.99945
356.80524
Right
Pressed
Vec2(877.01013, 352.71057)
877.01013
352.71057
Right
Released
Vec2(825.2455, 321.8847)
825.2455
321.8847
```

拾った座標からobjectを作成するということは後ほど紹介予定です。

以上
iOS Simulatorのスクリーンショットがデフォルトでデスクトップに保存されるけど保存先を変えたい

iOS Simulatorを利用中にキーボードのCommand + Sを押すとスクリーンショットが撮影されディスクトップに保存されます。

- Altを押しながらCommand + Sを押すとスクリーンショットの保存先を選択できます
    - 次回はCommand + Sだけで指定した保存先に保存されるようです
        - デフォルトの保存先にするか決めるチェックボックスが表示される場合もあるらしい
- Command + Control + Cを押すとスクリーンショットがクリップボードにコピーされます
  - Excelスクリーンショットエビデンスが高速に作れます

参考
[iphone - Take screenshots in the iOS simulator - Stack Overflow](https://stackoverflow.com/questions/7092613/take-screenshots-in-the-ios-simulator)
ブラインドタッチは〇〇日で習得できる

#やったこと
・ホームポジションを常に意識。
・寿司打とe-typingをひたすらやりこむ。

#注意点
・絶対にキーボードを見ない。
・毎日必ず30分以上練習する。

#目標
・寿司打 10000円以上
・e-typing レベルA(スコア226以上)
上記の目標値以上を安定的に出せる(5回の平均が目標値を上回る)状態になるまで。

#結論
結論から申し上げると
**練習開始18日目で目標に到達できました。**
それまでの経緯を記載します。

#練習前のレベル
![susida1bt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/0f7b7d5e-f029-c3a1-dd07-907ce3594cda.png)
![etyping1bt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/9595e503-a017-ce9a-fabd-cc2f46ca66c1.png)

寿司打 中級 お勧めコース　**3760円分**
e-typing　**レベルD(スコア78)**

#練習開始1~5日
その間の最高記録
e-typing　**レベルB(スコア117)**
寿司打　**6140円**

どちらも最初と比較して約2倍になりました。
このまま上昇したいところですね。

#練習開始6～10日
その間の最高記録
e-typing　**レベルA-(スコア219)**
寿司打　**8400円**

e-typingはもう少しで目標値にタッチします。
寿司打も順調に伸びています。

#練習開始11～15日
その間の最高記録

![e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/72ef53b8-8454-d244-87be-79481a95c520.png)
![s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/15270740-f4d2-0704-c589-3997b7dd2e54.png)

e-typing　**A(スコア242)**
寿司打　**10040円**

ようやく目標値に触れることができました。
最後の詰めに入ります。

#練習開始18日目
e-typing　**5回平均A(平均スコア227)**
寿司打　**5回平均10124円**

ようやく目標を達成することができました。

#スコアの推移
![eグラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/eda3cf4a-6b2a-53ec-36c1-27fb1f1a9328.png)

![sグラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964196/1425d237-b19a-c127-ffe4-24fc24112775.png)

やった分だけ上達することがわかりました。

#最後に
タイピング練習に限った話ではないですが、なにかを上達させるにはとにかく継続的に行うことが重要だと再認識しました。
正直なところ毎日30分行うと意気込んだものの、疲れている時や忙しい時など1日に数分しかできない日もありましたが、全くやらない日は一度もありませんでした。

最後までご覧いただきありがとうございました。
少しでも皆様の参考になれば幸いです。
RustでHello World

#Rustのインストール

[Rustのインストール](https://www.rust-lang.org/ja/learn/get-started)

#Hello Worldまで
①ファイルの作成
cargo new hello-rustでmain.rsが作成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/41b58eab-202d-85ff-8a40-5a43c707afb8.png)
②ビルド
cargo buildで.exeファイルが作成される
③実行
cargo runで実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/e634f3e6-8f34-a425-2743-eca7fbbd385a.png)
VS codeで実行しています。
Next.jsでSwiperを入れようとしたら「Global CSS cannot be imported from files other than your Custom」

タイトルのとおりです。

下記「Swiper React Components」を見ながら
https://swiperjs.com/react

```
npm i swiper
```

その後に

```React
import { Swiper, SwiperSlide } from 'swiper/react';

import 'swiper/swiper.scss';

export default () => {
  return (
    <Swiper
      spaceBetween={50}
      slidesPerView={3}
      onSlideChange={() => console.log('slide change')}
      onSwiper={(swiper) => console.log(swiper)}
    >
      <SwiperSlide>Slide 1</SwiperSlide>
      <SwiperSlide>Slide 2</SwiperSlide>
      <SwiperSlide>Slide 3</SwiperSlide>
      <SwiperSlide>Slide 4</SwiperSlide>
      ...
    </Swiper>
  );
};
```

こうするとできると……なるほど。

よし、

```
npm run dev
```
……

```
error - ./node_modules/swiper/swiper.scss
Global CSS cannot be imported from files other than your Custom <App>. Please move all global CSS imports to pages\_app.js. Or convert the import to Component-Level CSS (CSS Modules).
Read more: https://err.sh/next.js/css-global
```

Next.jsなんもわからん……

# 解決方法
https://swiperjs.com/react
こちらのStyles CSS Stylesを見て…

```React
import 'swiper/swiper.scss';
```

の部分を

```React
import "swiper/swiper-bundle.min.css";
```

に変更したらうまく行っちゃいました。

恥ずかしながら何故解決できたわからないのですが、
SCSSのコンパイラ的な問題なのでしょうか。ただ、SCSSのコンパイラライブラリ入れてもうまく行かず、謎は深まるばかりです…
【個人開発　参考記事　自分用メモ】ENG_QUIZ 開発にあたり参考にした記事まとめ

「元から作りたかった」+「普段の業務で触れられない、主にバックエンドの技術に触れたい」
という想いからクイズアプリを作成しました。
ちゃんと手順を記事にしようと思ったらとてつもない時間がかかってしまいますが、取り急ぎメモ的な感じで、参考記事(詰まりポイント)を羅列します。


#リポジトリURL: 
https://github.com/Takabun/eng_quiz/tree/master/web

#使用技術：
フロント：Nuxt.js + Typescript + SSR(サーバーサイドレンダリング) 
API: Golang + Echo フレームワーク DB: MySQL
インフラ: Docker + Kubernetes

#インフラ構成図

![eng_quiz k8sインフラ構成 rev.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435391/c7fa89b1-73b1-2530-29b4-9884b2a59c06.png)


#DB構成図 
(users/mylists/commentsテーブルは、作成はしたが結局使わず…)
![ENG_QUIZ-Page-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435391/a09574d3-6718-5041-0e7f-d14053cd831b.png)



ここから、各技術について参考にした資料一覧



#Docker + Kubernetes

参考書： [Docker/Kubernetes 実践コンテナ開発入門](https://www.amazon.co.jp/Docker-Kubernetes-%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E5%B1%B1%E7%94%B0-%E6%98%8E%E6%86%B2-ebook/dp/B07GP1Q3VT)
定番のある良書です。ただ、k8s コンテナのデバック(踏み台コンテナの作成 / コンテナの中に入ってcurlで他コンテナと通信する)については記載が無く、そこについても言及して欲しかったです。


APIのDockerイメージ作成の際、go run main.goコマンドが認識されずハマった。
その際に参考にした記事
https://qiita.com/sky0621/items/d837c566b04464469fdb

webコンテナ作成　この記事のお陰で、特に詰まる事なく実装できた
https://yopinoji.com/docker-for-nuxt-js

定番だが、Dockerの学び始めには下記のチュートリアルがオススメ
https://y-ohgi.com/introduction-docker/

#DB
コンテナ化の際、日本語が文字化けした。下記の記事で解決
https://qiita.com/zongxiaojie/items/6b593ec4ce5e85bb342c



#API
Golang [echoフレームワーク](https://github.com/labstack/echo)
[ORM gorm](https://gorm.io/ja_JP/docs/index.html)

HTTPieを導入する事で、普通にcurlコマンドを打ってAPIの挙動を確認するよりも楽になりました。
[参考記事]
(https://www.it-swarm.dev/ja/json/httpie%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%8D%E3%82%B9%E3%83%88%E3%81%95%E3%82%8C%E3%81%9Fjson%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B/824413537/)

.Relatedの使い方でハマった時に参考になった記事
http://egawata.hatenablog.com/entry/2017/01/14/143143

echoでAPIサーバーを実装するにあたり、個人的に一番コンパクトにまとまっていると思った記事
https://kimagureneet.hatenablog.com/entry/2017/12/20/163848

結局出来なかった事：
Realizeを用いたホットリロードの実装。
バージョンの違いのせいか、結局Realizeが上手く動かず、ホットリロード無しで実装した。
(世の中のgopher達みんなどうやってるんだろ…)
https://qiita.com/godgarden/items/f73e4a717f1a27b9a3b0

#WEB
nuxt-typed-vuex(VuexにTSで型をつける)
ちょうど業務で、このパッケージを使う必要が出てきた頃だったので、業務での導入前にいい練習になりました。
https://qiita.com/shindex/items/a90217b9e4c03c5b5215

AWS S3を用いた画像保存/表示
https://funasaki.hatenablog.com/entry/2013/11/06/163558
【AWS】デプロイ後にadminユーザーを追加する方法〜seedsファイルの実行〜

### なんの話し？
AWSにデプロイした後にadminユーザーを追加する方法がわからなくて悩んだ結果の話しです。
開発環境ではseedsファイルに`admin: true`の記述をしていた。


**awsにデプロイした後にadminユーザーを追加したい**
などで検索するとIAMアカウント関連の結果ばかり出てきてしまい、なかなか欲しい情報にたどり着けない。
そもそもseedsを追加した時のコマンドは開発環境で下記のように実行していた。

### 開発環境のとき
```terminal
% rails db:seed
```

そしてHerokuにデプロイした時にも同じことで悩み、実行したコマンドがこちら。


### Herokuにデプロイしたとき
```terminal
# アプリケーションのディレクトリで実行

% heroku run rails db:seed
```

EC2のリポジトリでRailsを起動するときのコマンドを見ていたら、
「`rails~`コマンドを使えれば追加できるのではないか？」と考え、実行してみた。

### AWSにデプロイしたとき
```terminal
# EC2のリポジトリ内で実行

$ rails db:seed RAILS_ENV=production
```

これでadminユーザーが追加された。
【jquery,js】入力バリデーションチェック [preventDefault,css,find] [js04_20210220]

####  <font color='orange'>処理の概要</font>
送信ボタンを押下して、テキストボックスを入力されていない場合、バリデーションエラーを表示する

##### 処理のフロー：
　(1)送信ボタンを押下
　(2)送信ボタンのイベントに紐ついて、入力ボックスの内容をチェックする
　(3)入力ボックスが一つでも空白があった場合は、エラーを赤文字で表示する



#####画像１
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647299/3867aed3-24f6-efee-a362-45c51498bee1.png" width="300px">

#####画像２
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647299/1db6058c-aa91-ceec-23fc-db3f09405d4e.png" width="300px">

####  <font color='orange'>ソースコード</font>
```html:index.html
<body>
	<form method="GET" action="./index.html" target="_blank" id="mainForm">
		<font color="orange">バリデーションチェック</font><br><br>
		入力欄1<input type="text" name="t1" id="userText1" class="textBox" value=""><br>
		入力欄2<input type="text" name="t2" id="userText2" class="textBox" value=""><br>
		入力欄3<input type="text" name="t3" id="userText3" class="textBox" value=""><br>
		<input type="submit" id="submitButton" value="送信"><br>
		<div id="output"></div>
</body>
```

```javascript:main.js
$(function() {
    $("#submitButton").click(function(e){
        var checkOk = true;

        $("#mainForm").find(".textBox").each(function(){
            if($(this).val() !== "") {
                $("#output").text("送信しました");
                //ボタンクリックイベントを成功とさせる
                return true
            }else{
                $("#output").text("テキストには全て入力して下さい");
                $("#output").css("color","red");
                //obj = document.getElementById("output");
                //obj.style.color = "red";

                //ボタンクリックイベントを失敗とさせる
                //return false
                e.preventDefault();
            }
        });
    });
});

```

####  <font color='orange'>ポイント</font>
html：
(1)なし
js：
(1)クリックイベントの引数に”e”を設定して、そのイベントをpreventDefaultメソッドで処理する
（return falseでも可能）
(2)複数のオブジェクトにバリデーションをかけたい場合は、findの引数にclassを設定する
(3)バリデーションエラーは、cssメソッドを使って強調する
(4)入力ボックスの内容をeachメソッドに渡して、得られた配列の入力値をチェックする
(5)jsで、赤文字表示をする場合はstyleメソッドのcolorプロパティを使用する

####  <font color='orange'>参考資料</font>
JavaScript(仕事の現場でサッと使える！デザイン教科書)　p180
Rubyで月の日数を当てるプログラムを作ってみた

# はじめに
私は、勉強のアウトプットとしてミニアプリをつくったりします。今回は、少し複雑な条件分岐を用いて閏年を当てるプログラムを書きました。備忘録として残りしたいと思いますので宜しくお願いします。

# 閏年になる場合を加味する
Googleぐぐるとトップに出てきますが、
①西暦年が4で割り切れる年は閏年
②ただし、西暦年が100で割り切れる年は平年
③ただし、西暦年が400で割り切れる年は閏年
とこの三つの条件分岐があるみたいです！

さて早速、プログラミングを組んでいきます。


# 早速コードを書きます！
2月の日付のみ条件分岐にかけます。
理由としては、2月だけ日付の変動があるからです。

```ruby
def get_days(year, month)
  month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  # month_daysに予め配列で1~12月までの日数を入れておきます。

  if month == 2 #２月を選んだ場合のみ、条件分岐にかけます。
    if year % 4 == 0 #4で割り切れる場合は、さらに条件分岐にかけます。
      if year % 100 == 0 && year % 400 != 0 #100で割り切れて、400で割り切れない場合の条件分岐です。
        days = 28
      else
        days = 29
    end
  else
    days = 28
  end
  else
    days = month_days[month - 1]
  end
return days
end

puts "年を入力してください："
year = gets.to_i
puts "月を入力してください："
month = gets.to_i

days = get_days(year, month)
puts "#{year}年#{month}月は#{days}日間あります"


```

完成しました！

# Javaでも作ってみた
しかし、今のJavaの知識では同じプログラムは作れず。
Googleの記事に上がっていたコードを参考にしました。

```java

public class LeapYear1 {
	public static void main(String[] args) {
		int year = 2020;
		boolean check = false;

		if (year % 4 == 0) {
			if ((year % 100 ) == 0) {
				if ((year % 400 ) == 0) {
					check = true; //閏年
				}
			}else {
				check = true; //閏年
			}
		}
		System.out.println(check ? "閏年です。" : "閏年ではありません。");
	}
}

```

閏年の判定ができるプログラムになりました。


# 最後に
Rubyだけではなく、Javaでもプログラムが組めるように徐々にやっていきたいなと思います。
ここまで読んでいただきありがとうございました！
【簡単】WSL2使いのスマートなVSCodeの起動方法

WSLのターミナルで開きたいフォルダーに移動
code . を実行
以上

マウス操作で目的のフォルダ開くのがダルかったので、個人的には、作業効率200%向上とおもってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/ed080962-1334-d15f-1eee-6477b3d98974.png)

自動的にRemote WSLで開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/83f156c9-704d-139c-f682-7ae759e413d2.png)

注）自動的にRemote WSLのプラグインを入れておく必要があります。
RUSTで円周率をモンテカルロ法で求めた


## はじめに

RUSTが速くて安全で、とても良い言語だという評判なので、
試しに、RUSTでモンテカルロ法で円周率を求めるプログラムを作ってみた。
アルゴリズム自体は、よくある"hit-or-miss Monte Carlo"法である。
(0, 0), (1, 0), (0, 1) (1, 1)で囲まれた正方形の中にランダムに点を生成した際に、
原点から半径1以下にある確率は、PI/4となることを利用し、円周率PIを推定する。

乱数には、メルセンヌツイスターを利用。利用したクレートは、`mt19937`。
C++のBoostのような定番ライブラリーはまだ無い印象。（調査不足かもしれませんが。）

* * * 

## ソースコード

```RUST
use std::env;

fn main() {
    let mut argv = Vec::<String>::new();
    for argument in env::args() {
        argv.push(argument);
    }
    let argc = argv.iter().len();

    if argc != 3 {
        println!("need exactly two arguments");
        println!("usage: /path/to/get_pi num_rand seed");
        std::process::exit(1);
    }

    let num_rand: u32 = argv[1].parse().unwrap();
    let seed: u32 = argv[2].parse().unwrap();

    let mut m = mt19937::MT19937::new_with_slice_seed(&[seed]);

    let mut count: u32 = 0;
    for _i in 0..num_rand {
        let x = mt19937::gen_res53(&mut m);
        let y = mt19937::gen_res53(&mut m);
        count += unity_if_in_circle(x, y);
    }

    let pi = count as f64 / num_rand as f64 * 4.0;
    println!("*****************************");
    println!(
        "With {} samples and random number seed of {}, ",
        num_rand, seed
    );
    println!("pi is estimated to be {}", pi);
    println!("*****************************");

    std::process::exit(0);
}

fn unity_if_in_circle(x: f64, y: f64) -> u32 {
    let r2 = x.powi(2) + y.powi(2);
    if r2 < 1.0 {
        1
    } else {
        0
    }
}
```
***

## 実行
ターミナルで`./path/to/get_pi  100000000 1`
と打てば、

```
*****************************
With 100000000 samples and random number seed of 1,
pi is estimated to be 3.14175024
*****************************
```
と結果が出力される。
seedを変えると、

```
*****************************
With 100000000 samples and random number seed of 2,
pi is estimated to be 3.14167144
*****************************
```
や

```
*****************************
With 100000000 samples and random number seed of 3,
pi is estimated to be 3.14157348
*****************************
```
と結果が得られる。
サンプル数の平方が4桁なので、おおよそ4桁程度の精度が出ている。
一桁精度を上げるには、100倍のサンプルが必要。

***

## 検討事項やコメントなど


env::argsの利用方法がよく分からない。
「clapを使え」というのはありそうだけれども。
たかだか2個の整数を読むだけなので、今回は素朴にenv::argsを利用してみた。
しかし、env::args（で得られるArgs）の取り回しがよく分からず、また、argcに対応するものも見つけられず。
最終的に、各引数は文字列のベクトルに格納して、そのベクトル長を調べてargcを定義。
もう少し良いやり方がある気がするのだが。

`let pi = count as f64 / num_rand as f64 * 4.0`という文は綺麗（そのまま英語で読める）。
C++だと`(double)count/rand*4.0`といった所かな。

関数の`unity_if_in_circle`は切り分けなくても、
`count += if x.powi(2) + y.powi(2) < 1.0 { 1 } else { 0 } ;`
で十分だったかな。C++で書くにしても、三項演算子で済ませたような気もします。
Qiitaのタグフィードが500エラー

タイトルそのままですが...Qiitaのタグフィードが500エラーになります。

<https://qiita.com/tag-feed>

です。

普通のTOPページでは表示されてますが...

私が登録しているタグでなにか不整合が起きているのかな？

![スクリーンショット 2021-02-20 14.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51116/af613f1c-fb2c-359f-337f-cafca8e1bb72.png)


## 2021-02-24 追記

- 動くようになってました。
vue.jsで画像を表示(v-bind使用)

##ディレクトリ

```
app
　├ assets
　|   L images
　|       L image1.jpg
　└ javascripts
        L components
             L TopImage.vue ←ここからimage1.jpg表示したい
```

今回はv-bindを使用。

```
＃TopImage.vue

<template>
  <div id="app">
    <img :src="topImage">
  </div>
</template>

<script>
export default {
  el: 'app',
  data: function () {
    return {
      topImage: require('../../assets/images/image1.jpg')
    }
  }
}
</script>
```

*requireを使うことで表示できた
*ディレクトリの構造がややこしいので注意
Finderで開いてるディレクトリへcdするコマンド

Finderで開いてるディレクトリへ`cd`するコマンドを作ります。

```:~/.zshrc
cdf() {
  target=`osascript -e 'tell application "Finder" to if (count of Finder windows) > 0 then get POSIX path of (target of front Finder window as text)'`
  if [ "$target" != "" ]; then
    cd "$target"; pwd
  else
    echo 'No Finder window found' >&2
  fi
}

alias f='open .'
```

シェルを開き直します。

```shell-session
$ exec $SHELL -l
```

Finderで`cd`したいディレクトリを開いておきます。

```shell-session
$ cdf
```

移動できればokです。

```shell-session
$ f
```

カレントディレクトリをFinderで開くエイリアスを付けておくと便利です。

## 参考

- https://stackoverflow.com/questions/18456682/mac-terminal-change-directory-to-current-front-finder-window
リモート環境のpostgresDBからcsvを出力してローカルに持ってきたい

## 概要
リモート環境にsshで接続して、DBからcsvをローカルに落としたい場面が多々あったので備忘録として残しておこうと思いました。

## 環境
DBエンジン: PostgreSQL11.6
ローカルクライアント: macOS Big Sur
リモートサーバー: Amazon Linux 2

## csvを出力
まずはssh接続します。

```shell
$ ssh -i [秘密鍵ファイル] [リモートユーザー]@[リモートIPアドレス(ホスト名)]
```

今回は指定したSQLの出力結果をcsvに出力したかったのでその方法を2通りほど記述します。
テーブルを丸ごとcsv出力したい場合は`COPY`コマンドを使ってください。

### ①psqlコマンドでcsv出力する
```shell
# -A: 位置揃えなし
# -F: 区切り文字指定
$ psql -U [DBユーザ名] -h [DBホスト名] -d [DB名] -c "SQL文" -F ',' -A > example.csv
# csvができているか確認
$ less example.csv
```

csvが確認できたら接続を閉じます

```shell
$ exit
```

### ②DB接続してからcsv出力する
一度DBに接続します

```shell
$ psql -U [DBユーザ名] -h [DBホスト名] -d [DB名]
```

以下のコマンドを叩いていきます

```
=> \o example.csv
=> \a
=> \f ','
=> [SQL文]
=> \o
# 接続終了
=> \q
# csvができているか確認
$ less example.csv
```

csvが確認できたら接続を閉じます

```shell
$ exit
```

## scpコマンドでローカルに持ってくる
### scpコマンドとは？
SSHプロトコルを使用したホスト間のファイル転送ができます。
基本的には以下の構文となります。

```shell
$ scp [オプション] コピー元 コピー先 
```

### 実行
今回はDownloadsディレクトリに落とします

```shell
$ scp -i [秘密鍵ファイル] [リモートユーザ名]@[リモートIPアドレス(ホスト名)]:~/example.csv  ~/Downloads
# csvを確認
$ less ~/Downloads/example.csv
```

## 参考
- [psqlコマンド](https://www.postgresql.jp/document/11/html/app-psql.html)
- [psqlでクエリの結果をcsvファイルに出力する方法](https://salumarine.com/how-to-output-query-result-as-csv-file-using-psql/)
React 17 で Recoil を使う

## 概要

まだ React 17 対応版の Recoil が npm に公開されていないため、`npm install recoil` で入れるとエラーが出ます。
Nightly Build をインストールすることで React 17 環境でもインストールできます。

## インストール

```sh
npm install https://github.com/facebookexperimental/Recoil.git#nightly --save
```

https://recoiljs.org/docs/introduction/installation/#nightly-builds
PostgreSQLで全ての行の特定のカラムの値を一括セットする方法

Railsプロジェクトで`posts`テーブルに`user_id`を持たせる必要性がでた。カラムは無事追加できたが、既存のレコードに1個ずつユーザーIDを手打ちする（Posticoを使ってます）のはめんどくさい。SQLは書いたことなかったが、以下のシンプルなコードでいける（かならず Export CSV なりしてバックアップをとってから実施されることをおすすめします）。

```sql
UPDATE posts SET user_id=1
```

https://stackoverflow.com/questions/10364200/setting-value-for-one-column-of-all-records-in-table