OmniAICreator/Qiita-1.07M huggingface dataset:
nodenvをアップデートする

anyenvで管理してるnodenvのアップデート方法。
`nodenv update` でサクッといけると思ったが、いけなかったので備忘録。

## 結論

一度アンインストールして再インストールする。

```bash
$ anyenv uninstall nodenv
$ anyenv install nodenv
```

これで`nodenv install -l` すれば最新版までリストアップされるはず。

## 試したこと

### 1. anyenvをアップデートする

anyenvをアップデートしたら、管理下のnodenvも自動的にアップデートされるのでは？との思いで決行。

```bash
$ brew upgrade anyenv
```

変化なし。撃沈。

### 2. nodenvアップデートコマンドを実行する

nodenvにもアップデートコマンドがあるのかなと思い、勢いで実行。

```bash
$ nodenv update
```

そんなコマンドはありませんでした。ちゃんとhelpを確認しましょう

```bash
$ nodenv help
Usage: nodenv <command> [<args>]

Some useful nodenv commands are:
   commands    List all available nodenv commands
   local       Set or show the local application-specific Node version
   global      Set or show the global Node version
   shell       Set or show the shell-specific Node version
   install     Install a Node version using node-build
   uninstall   Uninstall a specific Node version
   rehash      Rehash nodenv shims (run this after installing executables)
   version     Show the current Node version and its origin
   versions    List installed Node versions
   which       Display the full path to an executable
   whence      List all Node versions that contain the given executable

See `nodenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/nodenv/nodenv#readme
```

### 3. 一度アンインストールして再インストール

こちらの記事にすべて書いてありました。

[anyenvによるnode.jsの更新 | ゴンの気まぐれなるままに](https://www.naka-sys.okinawa/anyenv-node-js-update/)

ありがたや。

```bash
$ anyenv uninstall nodenv
$ anyenv install nodenv
```

無事アップデート完了。
【credentials】CircleCIのテストでエラー！「ActiveRecord::StatementInvalid: Mysql2::Error: Table ‘〇〇’ doesn’t exist: SHOW FULL FIELDS FROM `〇〇`」

#はじめに
ローカルでRSpecのテストをパスした後、CircleCIのテストでタイトルのエラーとなり、それを解決するまでの記録。

#検証環境
```shell
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.3
BuildVersion:	19D76
```
```shell
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin19]
```

```shell
$ rails -v
Rails 5.2.4.2
```
#rails db:migrate
エラーの内容から、テーブルがないなら、`db:migrate`か？と思い、

```
 $ bin/rails db:migrate RAILS_ENV=production
```

をターミナルで試す。

       
すると、

```
rails aborted!
ArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit`
/Users/aa/projects/my_app/config/environment.rb:5:in `<top (required)>'
bin/rails:4:in `<main>'
Tasks: TOP => db:migrate => db:load_config => environment
(See full trace by running task with --trace)
```

、と言われる。

教えてくれている通りに
`rails credentials:edit`
を行うと、、

```
$ rails credentials:edit
No $EDITOR to open file in. 
```

> ファイルを開くための $EDITOR がありません。

また検索し、`credentialsをedit`する為の`$EDITOR`を登録する。

```
# .bash_profileに環境変数 EDITOR を設定する
$ echo 'export EDITOR="vi"' >> ~/.bash_profile
# bash_profileを読み込ませる
$ source ~/.bash_profile
# 登録できている事を確認する。
$ echo $EDITOR
```

これで、`credentials`を確認できるようになり、内容を確認したが、`Missing secret_key_base`という事はなく、登録されている。

次に、
[Rails 5.2 で ActiveSupport::MessageEncryptor::InvalidMessage](https://qiita.com/scivola/items/cc06ddbfd94d3118f693)
こちらを拝見し、

CircleCIの環境変数に登録しているmaster.keyとその時点でのローカルのもの(config/master.key)が一致しているか確認するが、
問題なく一致していた。


**ここで、気づく。**
登録されているsecret_key_baseが間違っている？
また検索し、

```
$ RAILS_ENV=production bundle exec rails secret
```
を実行。
長いキーが返ってくるので、それをcredentialに登録し直す。

これで再度プッシュすると、自分の環境だとうまくテストがパスした。



##参考にさせて頂いた記事
- [Rails5.2から追加された credentials.yml.enc のキホン](https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39)
- [Railsプロダクション環境のsecret_key_base取得](https://www.yomhe.com/?p=68) 

###終わりに。
最後まで読んで頂きありがとうございます:bow_tone1:
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。
Dockerコンテナ実行時に、You must use Bundler 2 or greater with this lockfile.

dockerコンテナ上で`docker-compose exec app rails console`コマンドでrailsのコンソールを立ち上げようとしたところ、`You must use Bundler 2 or greater with this lockfile.`と出てしまったときの対処法。

[メモ]

```
docker-compose exec app gem install bundler
docker-compose exec app bundle install
```

以上。
HAproxyでの”Client sent an HTTP request to an HTTPS server”

Openstackやopenshiftでよく目にするHAproxyですが「Client sent an HTTP request to an HTTPS server」なるエラーで先に進めないことがあり、忘備録として記載。

haproxy.conf mode設定

defaultでmode httpの宣言があるため、省略するとhttp通信として発信してしまう。
https通信を期待しているのに、httpは何事ぞ？となった結果が表題のエラーです。
フロントエンド、バックエンドともにmode tcpの記載を忘れずに。
片方だけmode tcpを設定した場合は、エラーとなり起動できない。
お試しなら各所追加でよいでしょうけど、本気の場合はdefault設定は削除しないとですね。
なお、httpsはありませんのでご注意。

haproxy.conf例(OCPでのPort22623通信はhttps通信)：
------------------

frontend machine-config
    bind *:22623
    option tcplog
    mode tcp
    default_backend     config-22623

backend config-22623
    mode tcp
    balance     roundrobin
    server  bootstrap bootstrap.ocp43.rh.world:22623 check
    server  master-0 master-0.ocp43.rh.world:22623 check
    server  master-1 master-1.ocp43.rh.world:22623 check
    server  master-2 master-2.ocp43.rh.world:22623 check

-------------------

あまり検索でも引っかかってこないので、どなたかの役にたてば！
oak のサンプル (その１)

Deno のフレームワーク　[oak](https://github.com/oakserver/oak)　のサンプルです。日本語を表示してみました。

```ts:oak01.ts
// ---------------------------------------------------------------
//	oak01.ts
//
//					May/19/2020
//
// ---------------------------------------------------------------
// import { Application } from "https://deno.land/x/oak/mod.ts"
import { Application } from "https://deno.land/x/oak@v12.5.0/mod.ts"

const app = new Application()

app.use((ctx) => {
  console.log ("*** app.use start ***")
  ctx.response.headers.set ('Content-Type', 'text/html; charset=utf-8')
  var str_out:string = "*** start ***<br />"
  str_out += "Hello World!<br />"
  str_out += "<blockquote>"
  str_out += "こんにちは<br />"
  str_out += "</blockquote>"
  str_out += "*** May/19/2020 AM 11:21 ***<br/ >"
  str_out += "*** end ***<br/ >"
  ctx.response.body = str_out
  console.log ("*** app.use end ***")
})

await app.listen({ port: 8000 })

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

 実行方法

```bash
deno run --allow-net  oak01.ts
```

http://localhost:8000/ にアクセス
![oak_may1901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/072390ba-d848-15fd-8cf5-9c2032c26244.png)

## 確認したバージョン

```text
$ deno --version
deno 1.27.2 (release, x86_64-unknown-linux-gnu)
v8 10.8.168.4
typescript 4.8.3
```
Scoop で Node.js の LTS版をインストールする

## 導入

あらかじめ、Scoop をインストールしておきましょう。https://scoop.sh/

PowerShell を起動し、下記でインストール可能です。git を入れていない場合はいれましょう。

```powershell:scoopのインストール
PS C:\Users\tkondou> iwr -useb get.scoop.sh | iex
PS C:\Users\tkondou> Set-ExecutionPolicy RemoteSigned -scope CurrentUser

PS C:\Users\tkondou> scoop install git
```

## 探す

scoop search で検索できます。 nodejs で検索してみましょう。

```powershell:検索方法
PS C:\Users\tkondou> scoop search nodejs
'main' bucket:
    nodejs-lts (12.16.3)
    nodejs (14.2.0)

```

## インストールする
scoop install nodejs-lts でインストールできます。

```powershell:nodejsインストール
PS C:\Users\tkondou> scoop install nodejs-lts
Installing 'nodejs-lts' (12.16.3) [64bit]
Loading node-v12.16.3-win-x64.7z from cache
Checking hash of node-v12.16.3-win-x64.7z ... ok.
Extracting node-v12.16.3-win-x64.7z ... done.
Linking ~\scoop\apps\nodejs-lts\current => ~\scoop\apps\nodejs-lts\12.16.3
Persisting bin
Persisting cache
Running post-install script...
'nodejs-lts' (12.16.3) was installed successfully!
```


## node を動かす
コマンドプロンプトを再起動し、
node コマンドにパスが通っているか確認してみましょう。

```powershell:nodeの確認
PS C:\Users\tkondou> node --version
v12.16.3

PS C:\Users\tkondou> node
Welcome to Node.js v12.16.3.
Type ".help" for more information.
>                                    
```
問題ないですね。うまくいかない場合は、コマンドプロンプトを再起動してくださいね。

## nodeのインストール場所
scoopの下にnode.exeが入るみたいですね。

```powershell:nodeの場所
PS C:\Users\tkondou> which node
C:\Users\tkondou\scoop\apps\nodejs-lts\current\node.EXE
```

ちなみに、which コマンドは、 scoop install which で入れました。

## Scoop の良さ

[nodejs](https://nodejs.org/ja/) の公式サイトのLTS版である 12.16.3 が入りました。

Scoop は、管理者権限も不要なので、さくさく導入できて良い感じです。便利ですね。
また、Chocolateyに比べ、最新が維持されている感じがします。
使っていくことにします。
命名規則の際に利用する文字の書き方の名称、スネークケース等について

# プログラミング 命名規則の文字の大きさなどのケースについて

初投稿になります。
いつもこのQiitaと知識を書いていただいている皆様に恩返しと
誰かの役に立てばと思い、私も投稿させて頂きます。

今回は各命名規則にともなった、コードの文字ケースのパターンについて、まとめておきます。

例となる文字列をこれとする場合→『set pass』

#### キャメルケース(ローワーキャメルケース)
　`setPass`
単語で区切った２つ目の単語の頭文字が大文字になります。
３つ目があれば、続いて３つ目の単語も頭文字が大文字になります。

#### パスカルケース(アッパーキャメルケース)
　`SetPass`
初めの頭文字から、単語ごとに全て頭文字は大文字になります。

#### スネークケース
　`set_pass`
全て小文字で単語ごとに「_」をつけて繋げる形です。

#### コンスタントケース(アッパーケース)
　`SET_PASS`
全て大文字で単語ごとに「_」をつけて繋げる形です。
定数とかでよく使います。

#### チェインケース(ケバブケース)
　`set-pass`
CSSなんかで使いますね、単語と単語を「-」で繋ぎます。
　
　
　
以上がよく使われる名称ではないでしょうか。
話の中で出た際に思いだす時に参照して頂ければと思います。

ちなみに、いずれも正式名称かどうかは、私自身深堀しておりませんので
あくまで参考にお願いします。
グラフとBFS(幅優先探索)・DFS(深さ優先探索)をJSで実装してみる

この記事で言うグラフは、折れ線グラフなどのグラフでは無く「データ構造」のグラフです。
ノード（頂点）群とノード間の連結関係を表すエッジ（枝）群で構成されるデータ型です。

![500px-6n-graf.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55603/b3045fc8-f215-7154-f779-dec50a602d1a.png)


### :computer: 実際のコード
```JavaScript
class Graph {
    constructor() {
        this.connectedList = {};
    }
    
    addVertex(vertex) {
        this.connectedList[vertex] = []
    }
    
    addEdge(v1, v2) {
        this.connectedList[v1].push(v2);
        this.connectedList[v2].push(v1);
    }
    
    removeEdge(vertex1, vertex2) {
        this.connectedList[vertex1] = this.connectedList[vertex1].filter(
            v => v !== vertex2
        );
        
        this.connectedList[vertex2] = this.connectedList[vertex2].filter(
            v => v !== vertex1
        );
    }
    
    removeVertex(vertex) {
        while (this.adjacencyList[vertex].length) {
            const adjacentVertex = this.adjacencyList[vertex].pop();
            this.removeEdge(vertex, adjacentVertex);
        }
        
        delete this.adjacencyList[vertex];
    }

    dfs(start) {
      //ノードを格納するスタック
      const stack = [start];

      //訪れた順番を格納
      const result = [];

      //訪れたフラグ
      const visited = {};

      //現在のノード
      let currentVertex;

      //訪問済みフラグを立てる
      visited[start] = true;

      while (stack.length) {
        // stackの最後尾を取得&削除
        currentVertex = stack.pop();

        // resultに現在の頂点を追加
        result.push(currentVertex);

        // 繋がっている頂点を探索して訪問済みにする
        // そして、stackにその頂点を追加
        this.connectedList[currentVertex].forEach(neighbor => {
          if (!visited[neighbor]) {
            visited[neighbor] = true;
            stack.push(neighbor);
          }
        });
      }
      return result;
    }

    bfs(start) {
      // これから探索する予定のものの配列
      const queue = [start];

      // 訪問順番の結果
      const result = [];

      // 探索済みであるか
      const visited = {};

      let currentVertex;
      visited[start] = true;

      while (queue.length) {
        // 先頭から取り出す
        currentVertex = queue.shift();

        // 現在地点を探索済みに
        result.push(currentVertex);

        this.connectedList[currentVertex].forEach(neighbor => {
          if (!visited[neighbor]) {
            visited[neighbor] = true;
            queue.push(neighbor);
          }
        });
      }
      return result;
    }
}

const graph = new Graph;

// 頂点の追加
graph.addVertex(1)
graph.addVertex(2)
graph.addVertex(3)
graph.addVertex(4)
graph.addVertex(5)
graph.addVertex(6)
graph.addVertex(7)

// エッジ(繋がり)の追加
graph.addEdge(1, 2)
graph.addEdge(1, 3)
graph.addEdge(2, 4)
graph.addEdge(4, 6)
graph.addEdge(3, 6)
graph.addEdge(4, 6)
graph.addEdge(4, 5)
graph.addEdge(5, 7)

// 幅探索を行う
console.log(graph.dfs(1)) // 1, 3, 6, 4, 5, 7, 2

// 深さ探索を行う
console.log(graph.bfs(1)) // 1, 2, 3, 4, 6, 5, 7
```

### :book: 使いどころ
町1から町2に道が繋がっていてお互いを行き来出来るなどといった関係性を表すのに使うやつです。
Twitterのフォローフォロワーとかもグラフみたいなものなので意外と色々なところで使われます。
【HTML】mailto:でメーラーが起動しない for mac - 2020年

## mailtoが機能しない？

開発プロジェクトでメールでのリンクシェアを実装することに、

```index.html
<a href="mailto:example@example.com">メールでシェア</a>
```

楽勝だぜっ！
と思ったらあれ？動かない？

## 解決！

```https://support.apple.com/ja-jp/HT201607
デフォルトのメール App を変更する

1. メールを開きます。
2. 「メール」メニューから「環境設定」を選択し、「一般」をクリックします。または、メールアカウントを設定するように案内された場合は、アカウントを追加してから、「メール」メニューから「環境設定」を選択します*。
3. 「デフォルトメールソフト」ポップアップメニューから、希望のメール App を選択します。

公開日： 2018 年 08 月 07 日
```

デフォルトのメールソフトの設定が必要だったようでした
（ユーザーの方もこの設定してなくて動作しない人いるだろうなぁ）
ステータスバーの透過方法

###ステータスバーの透過方法
ステータスバーの透過方法で躓いたので備忘録として残しておきます
早速ですが記述しなければいけないのは以下の二つのみです

```styles.xml
 <item name="android:statusBarColor">@android:color/transparent</item>
```

```MainActivity.kt
 window.apply {
            decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
        }
```
スタイルに書くのは透明色指定のみで大丈夫です
ここで

```styles.xml
<style name="android:windowTranslucentStatus">true</item>
```
と定義してしまうと完全透明ではなく半透明になってしまうので気を付けましょう
次はMainActivityの処理です
他サイトだと

```MainActivity.kt
        findViewById<View?>(R.id.content)?.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
```
と定義していますが自分ではこれで透過された判定になりませんでした

```MainActivity.kt
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
```
これはステータスバーが透過された場合にビューが崩れてしまわないように設定しているものです

```MainActivity.kt
View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
```
こちらはステータスバーの文字色を変更する役目を持っています
デフォルトは白色ですがこのコードを挿入してあげると濃いグレーになります

#最後に
自分が詰まっているときに検索をかけていたところ様々なところで詰まっている方を見かけたので参考程度になると嬉しいです
ナビゲーションバー等の透過方法が気になる方がいる場合はそちらも書いていこうと思います
Railsデータベース基礎

###テーブル 
表形式の収納場所でデータベースの中にいくつも作成することができる。
データベースが存在していても、このテーブルがなければデータを保存することはできません。


###レコードとカラム 
テーブルは表形式になっていますが、その横一行のことをレコードと言います。また。縦一列のことをカラムと言います。
テーブルのレコードを特定するために、idというカラムが用意されています。

###DOA
DOAとはデータ中心アプローチのことで、プログラムよりも前にデータ設計を先に行う方法のことです。
サービス開発がより効率的になることが期待されます。

###データベース設計
手順としては
1.テーブルの抽出
　途中でテーブルを追加すると関係性を見直さなければいけなくなる。
　予約語は使わないように。

2.テーブルの定義
　各テーブルが持つカラムを決める。途中で追加するとコードを書き直したり、ビューを変更しなくてはいけない場合が出てくるからです。
　予約語は使わないように。

3.テーブル構造を整理
　同じカラム名を同じテーブル内に作ってはいけません。
そのような場合は別でテーブルを作りましょう。
EX)同じテーブルに imageカラム、 image2カラムなど。この場合はimageテーブルを作る。

4.ER図の作成
テーブル同士の関係をわかりやすく表した図。
IE表記法という書き方で書く。


###モデル

モデルの命名規則
モデルクラス名は先頭は大文字の単数形
モデルクラスのファイル名は、先頭小文字の単数形
テーブル名は先頭小文字の複数形
EX)Animal  モデルクラス名
   animal モデルクラスのファイル名
   animals　テーブル名


これらモデルファイルとテーブルを作成するコマンドがあります。
それが `rails g model`コマンドです。このコマンドの後に作成したいモデルクラスの名前を全て小文字で続けます。
EX)rails g model animal

このコマンドを叩くとテーブルが作成されると言いましたが、テーブルの設計図ができているだけでテーブル自体はまだできていません。テーブルの設計図のことをマイグレーションファイルと言います。


###マイグレーションファイル
changeメソッドを使って作成するカラムを指定できます。

カラムの型
integer 数字　idなど
string 少なめの文字　ユーザー名、パスワード
text 多めの文字　投稿文
boolean 真か偽か　真偽フラグ
datetime 日付と時刻　作成日時、更新日時


####マイグレーションファイルの設定

```2020XXXXXXXXXXXXXXXX_create_XXXX.rb
class CreateXxxxxx < ActiveRecord::Migration[5.2]
  def change
    create_table :xxxxs do |t|
      t.string    :name
      t.text      :text
      t.text      :image
      t.timestamps null: false
    end
  end
end

```

####マイグレーションファイルの実行
`rake db:migrate`
このコマンドを行うと、ファイルが更新されます。
スキーマファイルには最新のマイグレーションファイルのバージョンが記録される。

`schema_migrations`はデータベースの変更履歴のようなもので、どのマイグレーションファイルまでが実行されているかが記録されています。

マイグレーションファイルはschema_migrationsと齟齬が生じる恐れがあるので消してはいけません。
マイグレーションファイルは一度`rake db:migrate`で実行してしまうと、中身を書き換えて再実行はできません。
`rake db:rollback`でデータベースの状態を最新のmigrationファイルを実行する前に戻せます。


###Active Record
Active RecordはRubyのGemの一種です。このGemはRailsにデフォルトでインストールされており、このGemのおかげでモデルとテーブルをつなぎ合わせられています。そのことによりRailsからテーブルのレコードにアクセスできます。
Actice Recordを利用するにはApplicationRecordというクラスを継承する必要があります。
ApplicationRecordを継承することでallメソッド、newメソッド、saveメソッド、findメソッドなどが利用できるようになります。


###SQL
データベースに保存されているデータをデータベースに要求するときに使う言語です。
RailsではActive Recordのおかげで簡単にデータを要求することができます。
Unreal Engine 4メモ：サスペンドレジューム

# サスペンド/レジューム
FCoreDelegatesクラスにプラットフォーム毎のOSやファームウェアからのイベント関連が纏まっている。のでメモがてら抜粋。
実際の動作はどうもプラットフォームごとにまちまちで、ソースを読まないと分からない（辛い）。

```
/** IOS-style application lifecycle delegates */
DECLARE_MULTICAST_DELEGATE(FApplicationLifetimeDelegate);
```

```c++:CoreDelegates.h
// This is called when the application is about to be deactivated (e.g., due to a phone call or SMS or the sleep button).
// The game should be paused if possible, etc...
これは、アプリケーションが非アクティブ化されようとしているときに呼び出されます（たとえば、電話、SMS、またはスリープボタンが原因で）。
可能であれば、ゲームを一時停止する必要があります。
FCoreDelegates::ApplicationWillDeactivateDelegate;

// Called when the application has been reactivated (reverse any processing done in the Deactivate delegate)
アプリケーションが再アクティブ化されたときに呼び出されます（Deactivateデリゲートで行われた処理を元に戻します）
FCoreDelegates::ApplicationHasReactivatedDelegate;

// This is called when the application is being backgrounded (e.g., due to switching
// to another app or closing it via the home button)
// The game should release shared resources, save state, etc..., since it can be
// terminated from the background state without any further warning.
// for instance, hitting the home button
これは、アプリケーションがバックグラウンドで実行されているときに呼び出されます（たとえば、別のアプリケーションに切り替えたり、ホームボタンでアプリケーションを閉じたりしたため）。ゲームはバックグラウンド状態から終了できるため、共有リソースを解放したり、状態を保存したりする必要があります。 それ以上の警告なし。
例）ホームボタンを押す
FCoreDelegates::ApplicationWillEnterBackgroundDelegate; 

// Called when the application is returning to the foreground (reverse any processing done in the EnterBackground delegate)
アプリケーションがフォアグラウンドに戻るときに呼び出されます（EnterBackgroundデリゲートで行われたすべての処理を逆にします）
FCoreDelegates::ApplicationHasEnteredForegroundDelegate;

// This *may* be called when the application is getting terminated by the OS.
// There is no guarantee that this will ever be called on a mobile device,
// save state when ApplicationWillEnterBackgroundDelegate is called instead.
これは、アプリケーションがOSによって終了されるときに呼び出される可能性があります。
これがモバイルデバイスで呼び出されるという保証はありません。
代わりにApplicationWillEnterBackgroundDelegateが呼び出されたときに状態を保存します。
FCoreDelegates::ApplicationWillTerminateDelegate;
```
200519学習記録：文字のデザイン基本設定

Mana本

**フォント**

まとめ

```
html{
  font-size: 100%;
}

body{
  font-family: ;"Yu Gothic Medium", "游ゴシック Medium", YuGothic, "游ゴシック体", "ヒラギノ角ゴ Pro W3", sans-serif;
  line-height: 1.7;
}

```

〇サイズ　
おすすめは、14～18px

```
p{
 font-size:14px;
}
```
スタイルシートで```font-size:100%```を指定すると。ブラウザでユーザーが指定したサイズで表示される。
その上で文字の一部分のサイズを変えたい場合は「rem」を使う。1remが100%指定のサイズと同じ。それを基準に変える。

```
html{
 font-size:100%;
}

.midashi{
 font-sizu:1.5rem;
}
```


〇フォントの種類
下は「游ゴシック」を基本としたフォントファミリー。

・「游ゴシック」を基本としたフォント設定の解説
https://blog.yoshinonaco.com/font-family-2020/
・フォント設定全般に関しての解説
https://saruwakakun.com/html-css/basic/font-family-how-to

```
font-family: ;"Yu Gothic Medium", "游ゴシック Medium", YuGothic, "游ゴシック体", "ヒラギノ角ゴ Pro W3", sans-serif;
```

〇行間設定
おすすめは、1.5～1.9の間

```
p{
 line-height:1.7;
}
```

〇文章の揃え
justifyで設定すると右端がきれいに揃う

```
p{
 text-align:justify;
}
```

〇枠と文字の間の余白
最低でも文字サイズの1～1.5倍程度のpaddingをつくる

```
.tekitou{
 padding:16px;
}
```
【学習メモ】Rails byebug


##題材

```rb
class QuestionsController < ApplicationController
（省略）
  def create 
    @question = Question.new(question_params)
      if @question.save
        redirect_to root_path, notice: 'Success!'
      else
        flesh[:alert] = 'Save.error!'
      end
  end

（省略）
  
  private
    def question_params
      params.require(:question).permit(:name, :title, :content)
    end
end
```
##paramsに入るデータをデバックツールbyebugで確認する

```
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
```
→開発中とテストのみ、byebugを読み込む設定（本番環境では読み込まない）


プログラムを止めたいところにbyebugを設定する

```rb
 private
    def question_params
      byebug #これを追加
      params.require(:question).permit(:name, :title, :content)
    end
```

authenticity_token
→form表示するトークンと、送信したトークンが一致しないと改竄したとみなされる機能
Linuxコマンドが勉強できるLINEスタンプを作ったよ

# はじめに
- コミュニケーションしながらコマンドを勉強できると楽しいかなと思ったので作りました☆
- 自分の商品を持ちたかった
- コマンドを表現するしぐさを考えるのは結構楽しい

# スタンプの種類

## 第1弾
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/207d1e1d-6378-fdab-0880-ea74cf401226.png)
https://store.line.me/stickershop/product/10720970/ja

- catコマンドがお気に入りです！かわいいです☆

## 第2弾
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/f72118d2-6957-df3c-6e75-f79035bbc343.png)
https://store.line.me/stickershop/product/10918426/ja

- sudoコマンドがお気に入りです！かっこよくないですか！

## 第3弾
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/988e7f30-5792-2c50-2df9-f52ec928984e.png)
https://store.line.me/stickershop/product/11110796/ja

- routeコマンドがお気に入りです！眼帯が最高にカッコいい

## 第4弾
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/29691a21-333b-ea40-cd8f-288bfec6dabe.png)
https://store.line.me/stickershop/product/11724293/ja

- dockerコマンドがお気に入りです！船長です

# 作ってくれた人
ありがとうございます☆
https://uuunagisa.tumblr.com/
Ruby と Python と networkx で解く AtCoder ABC168 D 隣接リスト

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。

# 今回のお題
*[AtCoder Beginner Contest D - .. (Double Dots)](https://atcoder.jp/contests/abc168/tasks/abc168_d)*
<font color="brown">Difficulty: 750</font>

今回のテーマ、隣接リスト

隣接リストから幅優先探索をするのですが、部屋１に近い部屋から道しるべを記録し、記録した部屋をスキップすることにより最短経路を取得します。
# Ruby
```ruby.rb
n, m = gets.split.map(&:to_i)
a = Array.new(n){[]}
m.times do
    x, y = gets.split.map(&:to_i)
    a[x - 1] << y - 1
    a[y - 1] << x - 1
end
c = Array.new(n){0}
que = []
que << 0
while que.size > 0
  e = que.shift
  a[e].each do |i|
    next if c[i] > 0
    c[i] = e + 1
    que << i
  end
end
puts "Yes", c[1..-1]
```
```index.rb
    a[x - 1] << y - 1
    a[y - 1] << x - 1
```
配列のインデックスが`0`から始まることに適応させています。
# Python
```pypy.py
from collections import deque

n, m = map(int, input().split())
a = [[] for _ in range(n)]
for i in range(m):
    x, y = map(int, input().split())
    a[x - 1].append(y - 1)
    a[y - 1].append(x - 1)
c = [0] * n
que = deque([])
que.append(0)
while len(que) > 0:
    e = que.popleft()
    for i in a[e]:
        if c[i] > 0:
            continue
        c[i] = e + 1
        que.append(i)
print("Yes")
for i in range(1, n):
    print(c[i])
```
# Python (networkx)
```networkx.py
import networkx

n, m = map(int, input().split())
g = networkx.Graph()
g.add_nodes_from(list(range(n)))
for i in range(1, m + 1):
    a, b = map(int, input().split())
    g.add_edge(a, b)
#print(g.nodes())
#print(g.edges())
print("Yes")
for i in range(2, n + 1):
    print(networkx.shortest_path(g, 1, i)[-2])
```
```shortest_path.py
    print(networkx.shortest_path(g, 1, i)[-2])
```
`networkx.shortest_path`で最短経路が取得できます。~~幅優先探索なんていりません~~
幸い、この問題では`TLE`になりますが、`networkx`凄いですね。

||Ruby|Python|PyPy|Python (networkx)|
|:--:|:--:|:--:|:--:|:--:|
|コード長 (Byte)|335|459|459|321|
|実行時間 (ms)|335|696|451|<font color="orange">TLE</font>|
|メモリ (KB)|32748|36920|94388|187248|
# まとめ
+ ABC 168 D を解いた
+ Ruby に詳しくなった
+ Python に詳しくなった
+ networkx に詳しくなった

参照したサイト
*[networkx Tutorial](https://networkx.github.io/documentation/stable/tutorial.html)*
*[Python3 キュー操作 (collections.deque)](https://qiita.com/myy/items/d7b92b11664f71a844a6)*
*[PythonでABC168Dを解く](https://qiita.com/taxfree_python/items/1512f2bed395861af302)*
GAS スプレッドシートの内容をもとにGoogleフォームのリストボックスの内容をダイナミックに更新する。

# やりたいこと

GAS スプレッドシートの内容をもとにGoogleフォームのリストボックスの内容をダイナミックに更新したい、という要望がありましたので方法について検討してみました。

# やろうとしたけど出来なかった

フォームのonOpenトリガーを使って、開いたときに自動更新すればいいんじゃない。
と、簡単に考えたのですが出来ないみたいです。
理由はonOpenは回答時には実行されないようです。公式に記載がありました。

> GAS 公式ドキュメント
> https://developers.google.com/apps-script/guides/triggers/#onopene



# 結論
結果として私がたどりついた方法は、
フォームを更新するスクリプトを分ベースのタイマーで回すというものです。
（ちょっとダサい方法なので、他にベターな方法があれば教えていただけますとうれしいです。）


# 手順

## 1.スタンドアローンスクリプトを作成する
スタンドアローンスクリプトを作成します。フォームに紐づくスクリプトは時間ベーストリガーに対応していません。

## 2.コード書く

```javascript:GAS

const formId = "フォームのid"
const stId = "シートのid"

function formUpdate(){
  
  var form = FormApp.openById(formId)
  //リストボックスタイプのフォームアイテムを取得する。
  var items = form.getItems(FormApp.ItemType.LIST);

  //対象のスプレッドシート開く
  var st = SpreadsheetApp.openById(stId).getSheetByName("シート名");
  var maxrow = st.getLastRow();
  //①リストアイテムに追加したい列のデータを取得する。
  var data = st.getRange(1, 10 , maxrow , 1).getValues(); 

  //①で取得したデータは2次元配列なのでそのままリストアイテムに代入できないので1次元配列にする。  
  var listitems = [];  
  for (i = 0 ; i < data.length ; i ++   ){
    listitems.push(data[i][0]);
  }

  //リストアイテムに追加する。
  //リストボックスタイプのフォームアイテムがフォーム内に複数ある場合は、
  //items[0]のインデックス番号を適切に変更してください。
  items[0].asListItem().setChoiceValues(listitems);
}

```

## 3.トリガーを作成する
1分間隔でトリガーを設定します。

「現在のプロジェクトのトリガー」→　「トリガーを追加」→「分ベースのタイマー」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/452a8bb2-c302-c14f-40b8-584dc4be0cf4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/c7e078e1-4bd7-74a5-2ffc-831cd9f0cd0b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/37fc28de-dcda-3a40-2dbd-af5cac7d21e3.png)


## 4.おわり

# 参考にしました
> Google Apps Script試行錯誤Blog
> https://www.pre-practice.net/2019/09/google-formonopen.html
Deno: MariaDB のデータを削除 (Delete)

## プログラム

フォルダー構造

```text
$ tree -a
.
├── .env
└── maria_delete.ts
```

```ts:maria_delete.ts
// ---------------------------------------------------------------
//	maria_delete.ts
//
//					Feb/27/2023
//
// ---------------------------------------------------------------
import { Client } from "https://deno.land/x/mysql/mod.ts"
import { config } from "https://deno.land/x/dotenv/mod.ts"

// ---------------------------------------------------------------
function delete_command_gen (id_in:string)
{
	const command:string = "delete from cities where id = '" + id_in + "'"

	return	command
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const config_env:any = config()

var id_in:string = Deno.args[0]

console.log (id_in)

const client = await new Client().connect({
  hostname: config_env.host,
  username: config_env.user,
  password: config_env.password,
  db: config_env.data_base,
})

const command: string = delete_command_gen (id_in)

const result = await client.query(command)

console.log(result)
await client.close()

console.error ("*** 終了 ***")

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

.env
はこちら
[Deno: MariaDB のバージョンを表示](https://qiita.com/ekzemplaro/items/08fd4585fc85b0fe3b26)

## 実行コマンド

```bash
deno run --allow-read --allow-net maria_delete.ts t3328
```

## 確認したバージョン

```text
$ deno --version
deno 1.31.0 (release, x86_64-unknown-linux-gnu)
v8 11.0.226.13
typescript 4.9.4
```
Deno: MariaDB のデータを更新 (Update)

## プログラム

フォルダー構造

```text
$ tree -a
.
├── .env
└── maria_update.ts
```

```ts:maria_update.ts
// ---------------------------------------------------------------
//	maria_update.ts
//
//					Feb/27/2023
//
// ---------------------------------------------------------------
import { Client } from "https://deno.land/x/mysql/mod.ts"
import { config } from "https://deno.land/x/dotenv/mod.ts"

// ---------------------------------------------------------------
function get_current_date_proc ()
{
	var today = new Date ()
	var ddx = today.getFullYear () + "-" + (today.getMonth () +1)
	ddx += "-" + today.getDate ()

	return ddx
}

// ---------------------------------------------------------------
function update_command_gen (id_in:string,population_in:number)
{
	const today:string = get_current_date_proc()
	var command:string = "update cities set population = " + population_in
	command += " , date_mod = '" + today + "'"
	command += " where id = '" + id_in + "'"
	console.log (command)

	return	command
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const config_env:any = config()

var id_in:string = Deno.args[0]
var population_in:number = parseInt(Deno.args[1])

console.log (id_in + "\t" + population_in)

const client = await new Client().connect({
  hostname: config_env.host,
  username: config_env.user,
  password: config_env.password,
  db: config_env.data_base,
})

const command: string = update_command_gen (id_in,population_in)

const result = await client.query(command)
console.log(result)
await client.close()

console.error ("*** 終了 ***")


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

.env
はこちら
[Deno: MariaDB のバージョンを表示](https://qiita.com/ekzemplaro/items/08fd4585fc85b0fe3b26)

## 実行コマンド

```bash
deno run --allow-read --allow-net maria_update.ts t3327 16829300
```

## 確認したバージョン

```text
$ deno --version
deno 1.31.0 (release, x86_64-unknown-linux-gnu)
v8 11.0.226.13
typescript 4.9.4
```
Deno: MariaDB のデータを読む (Read)

## プログラム

フォルダー構造

```text
$ tree -a
.
├── .env
└── maria_read.ts
```

```ts:maria_read.ts
// ---------------------------------------------------------------
//	maria_read.ts
//
//					Feb/27/2023
//
// ---------------------------------------------------------------
import { Client } from "https://deno.land/x/mysql/mod.ts"
import { config } from "https://deno.land/x/dotenv/mod.ts"


// ---------------------------------------------------------------
function sort_by_key_proc(left: {[key: string]: any},right: {[key: string]: any})
{
	const aa:string = left.key
	const bb:string = right.key

	var rvalue = 0

	if (aa < bb)
		{
		rvalue = -1
		}
	else if (aa > bb)
		{
		rvalue = 1
		}

	return	rvalue
}

// ---------------------------------------------------------------
function sort_proc (dict_aa: {[key: string]: any})
{
	var array = new Array()
	for(var it in dict_aa)
		{
		array.push({'key':String (it), 'value':dict_aa[it]})
		}

	array.sort (sort_by_key_proc)

	return array
}

// ---------------------------------------------------------------
export function dict_display_proc(dict_aa: {[key: string]: any})
{
	var array_aa = sort_proc (dict_aa)

	for (var it in array_aa)
		{
		var key:string = array_aa[it].key
		var value = array_aa[it].value

		var out_str:string = key + "\t"
		out_str += value["name"] + "\t"
		out_str += value["population"] + "\t"
		out_str += value["date_mod"]
		console.log (out_str)
		}	
}

// ---------------------------------------------------------------
function data_process(data:any):{[key: string]: any}
{
	var dict_aa : {[key: string]: any} = new Object()

	for (var it in data)
		{
		const unit = data[it]

		dict_aa[unit.id] = {"name": unit.name,
				"population": unit.population,
				"date_mod": unit.date_mod}
		}

	return dict_aa
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const config_env:any = config()

const client = await new Client().connect({
  hostname: config_env.host,
  username: config_env.user,
  password: config_env.password,
  db: config_env.data_base,
})

const data = await client.query(`select * from cities`)

await client.close()

const dict_aa = data_process(data)

dict_display_proc (dict_aa)

console.error ("*** 終了 ***")

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

.env
はこちら
[Deno: MariaDB のバージョンを表示](https://qiita.com/ekzemplaro/items/08fd4585fc85b0fe3b26)

## 実行コマンド

```bash
deno run --allow-read --allow-net maria_read.ts
```

## 確認したバージョン

```text
$ deno --version
deno 1.31.0 (release, x86_64-unknown-linux-gnu)
v8 11.0.226.13
typescript 4.9.4
```
Deno: MariaDB のデータを作成 (Create)

## プログラム

フォルダー構造

```text
$ tree -a
.
├── .env
└── maria_create.ts
```

```ts:maria_create.ts
// ---------------------------------------------------------------
//	maria_create.ts
//
//					Feb/27/2023
//
// ---------------------------------------------------------------
import { Client } from "https://deno.land/x/mysql/mod.ts"
import { config } from "https://deno.land/x/dotenv/mod.ts"

// ---------------------------------------------------------------
function dict_append_proc (dict_aa: {[key: string]: any},id_in:string,name_in:string,population_in:number,date_mod_in:string)
{
	var unit_aa:{[key: string]: any} = new Object()
	unit_aa['name'] = name_in
	unit_aa['population'] = population_in
	unit_aa['date_mod'] = date_mod_in

	dict_aa[id_in] = unit_aa

	return	dict_aa
}

// ---------------------------------------------------------------
function data_prepare_proc ()
{
	var dict_aa : {[key: string]: any} = new Object()

	dict_aa = dict_append_proc (dict_aa,'t3321','岡山',481763,'2014-5-12')
	dict_aa = dict_append_proc (dict_aa,'t3322','倉敷',163257,'2014-8-15')
	dict_aa = dict_append_proc (dict_aa,'t3323','津山',695241,'2014-10-2')
	dict_aa = dict_append_proc (dict_aa,'t3324','玉野',231864,'2014-6-22')
	dict_aa = dict_append_proc (dict_aa,'t3325','笠岡',769358,'2014-8-14')
	dict_aa = dict_append_proc (dict_aa,'t3326','井原',865792,'2014-9-12')
	dict_aa = dict_append_proc (dict_aa,'t3327','総社',438251,'2014-3-21')
	dict_aa = dict_append_proc (dict_aa,'t3328','高梁',352486,'2014-6-26')
	dict_aa = dict_append_proc (dict_aa,'t3329','新見',126957,'2014-11-2')
	

	return	dict_aa
}
// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const config_env:any = config()

const dict_aa = data_prepare_proc ()

const client = await new Client().connect({
  hostname: config_env.host,
  username: config_env.user,
  password: config_env.password,
  db: config_env.data_base,
})


var command:string = 'drop table if exists cities'
var result = await client.query(command)
console.log(result)

command = 'create table cities (id varchar(10), name varchar(20),'
command += ' population int, date_mod date)'
result = await client.query(command)
console.log(result)

	for (var key  in dict_aa)
		{
		var sql_str: string  = "insert into cities (id,name,population,date_mod) values ("

		var str_data: string = "'" + key + "','" + dict_aa[key].name + "',"
		+ dict_aa[key].population + ",'" + dict_aa[key].date_mod + "')"

		sql_str += str_data
		result = await client.query(sql_str)
		console.log(result)
		}

await client.close()

console.error ("*** 終了 ***")
// ---------------------------------------------------------------
```

.env
はこちら
[Deno: MariaDB のバージョンを表示](https://qiita.com/ekzemplaro/items/08fd4585fc85b0fe3b26)

## 実行コマンド

```bash
deno run --allow-read --allow-net maria_create.ts
```

## 確認したバージョン

```text
$ deno --version
deno 1.31.0 (release, x86_64-unknown-linux-gnu)
v8 11.0.226.13
typescript 4.9.4
```
Deviseで認証メールを手動で送信したい

## 再送方法

[Qiita - deviseの確認メールの実装で困ったとき](https://qiita.com/tagty/items/71c8753e2558141e1822)
[RubyDoc - Module: Devise::Models::Confirmable](https://www.rubydoc.info/github/plataformatec/devise/Devise/Models/Confirmable)


ほぼここに書いてあるとおりで、Devise参照先も書いてあるとおりなんですがこれです。

```ruby
User.find(1).send_confirmation_instructions # manually send instructions
```

## この操作をするシチュエーション

- メーラー側でなんらかの不具合がありメールが送信されなかった
- Workerが止まってしまいメール送信用のキューをロストした

等が考えられます。
結構運用中に発生しがちで毎回どうやって再送するんだっけ？って調べてたので書きました。

以上です。
Shopify JS Buy SDKでProductのtagsが取れない場合（Uncaught Error: No field of name "tags" found on type "Product）

# まずRead product tagsがONか確認

![Shopify.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/0bc5985c-40fb-c8b5-998f-a2ccd395bc17.png)


# サンプルコードを参考にする

[Initializing the Client][1]（リンクページの下の方）

```js
// fetch the large, unoptimized version of the SDK
import Client from 'shopify-buy/index.unoptimized.umd';

const client = Client.buildClient({
  domain: 'your-shop-name.myshopify.com',
  storefrontAccessToken: 'your-storefront-access-token'
});
```

[Fetching Products][1]（リンクページの下の方）

```js


// Build a custom products query using the unoptimized version of the SDK
const productsQuery = client.graphQLClient.query((root) => {
  root.addConnection('products', {args: {first: 10}}, (product) => {
    product.add('title');
    product.add('tags');// Add fields to be returned
  });
});

// Call the send method with the custom products query
client.graphQLClient.send(productsQuery).then(({model, data}) => {
  // Do something with the products
  console.log(model);
});
```

ここで注目しないといけないのはClientのimport

```js
// import Client from 'shopify-buy'; ではだめ
import Client from 'shopify-buy/index.unoptimized.umd';
```

# 上のやり方だと、variantsとかどう取るの？

[Re: fetchWithProducts() not returning tags][2]



[1]: https://shopify.github.io/js-buy-sdk/
[2]: https://community.shopify.com/c/Shopify-APIs-SDKs/fetchWithProducts-not-returning-tags/m-p/494083/highlight/true#M31897
etcd を Mac で使ってみた時のメモ

メモ。
k8s のマスターで Key/Value データストアとして利用されている `etcd` を少し使ってみた時のメモ。

# やってみた時のメモ

# 環境

+ MacOS X Mojave(10.14.6)
+ etcd 3.4.8

## インストール

[ etcd-io /etcd ](https://github.com/etcd-io/etcd)

Go で書かれており、リリースバイナリがあるようなのでこれを使ってみる

[release](https://github.com/etcd-io/etcd/releases)

Mac なので darwin のものをダウンロードする。

```bash
$cd /tmp/
$wget https://github.com/etcd-io/etcd/releases/download/v3.4.8/etcd-v3.4.8-darwin-amd64.zip

$unzip etcd-v3.4.8-darwin-amd64.zip

$ls etcd-v3.4.8-darwin-amd64
Documentation       README.md           etcd
README-etcdctl.md   READMEv2-etcdctl.md etcdctl
```

OK.

## etcd の起動

Github の README に従いつつ、etcd を起動してみる。

[Running etcd](https://github.com/etcd-io/etcd#running-etcd)

```bash
$/tmp/etcd-v3.4.8-darwin-amd64/etcd
```

これでフォワグラウンドで etcd が起動され、ログが出る。

## etcd への操作（値の put/get)

別途ターミナルを起動し、`etcdtcl` を使って操作を試す

[Running etcd](https://github.com/etcd-io/etcd#running-etcd)

```bash
$/tmp/etcd-v3.4.8-darwin-amd64/etcdctl put mykey "this is awesome"
OK

$/tmp/etcd-v3.4.8-darwin-amd64/etcdctl get mykey
mykey
this is awesome
```

無事出来た
WindowsUpdateキャッシュをクリアするスクリプト

Windows10(WindowsServer2016)以降のOSで、いつまでたってもWindowsUpdateが終わらない等不具合が発生した場合に使用しているスクリプトです。


```cmd:WindowsUpdateCacheClear.cmd
@echo off
setlocal
color f0
cd /d %~dp0

echo WindowsUpdate関連サービス停止
net stop usosvc
net stop dosvc
net stop wuauserv
net stop bits

echo WindowsUpdateキャッシュフォルダをリネーム
ren %SystemRoot%\SoftwareDistribution SoftwareDistribution.old

rem Bitsキュー削除
rem del %AllUsersProfile%\Microsoft\Network\Downloader\qmgr0.dat
rem del %AllUsersProfile%\Microsoft\Network\Downloader\qmgr1.dat
del /q %AllUsersProfile%\Microsoft\Network\Downloader\*

echo オフラインパッチ適用の際には、この時点で外部接続を一時解除して下さい
echo .
echo プロキシ環境の場合で外部から更新したい場合は、以下のコマンドを実行し、プロキシ設定をWindowsUpdateにも使用するようにします。
echo IEプロキシ設定を適用: netsh winhttp import proxy source=ie
echo 現在設定確認: netsh winhttp show proxy
echo 解除: netsh winhttp reset proxy
pause

echo WindowsUpdate関連サービス再開
net start bits
net start wuauserv
net start dosvc
net start usosvc

echo WindowsUpdateスキャン実行
usoclient startscan

pause
```

## 参考
https://docs.microsoft.com/ja-jp/archive/blogs/jpwsus/windows-update-3
https://support.microsoft.com/ja-jp/help/2894304
Next.jsでoptimizeした画像を自動的に適用する方法

# Lighthouseなどで画像がデカイとか言われる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/d2df91fe-f1a6-7d95-2d33-711770bcc29a.png" width="200">

# 個々の画像の処理は面倒

なので、自動化する

1. まずは[next-optimized-images][1]をいれる
1. さらに必要なライブラリを追加で入れる
  - JPEGなら`imagemin-mozjpeg` 
  - PNGなら`imagemin-optipng` 
  - WEBPなら`webp-loader` 
  - Responsiveな画像を用意したいなら`responsive-loader` と`sharp` ...など
1. 併せてnext-compose-pluginsも入れる（入れなくても良いが、next.config.jsを書く時に綺麗に纏められる）
1. 下のように`next.config.js`を設定する（コメント部分はnext-optimized-imagesの[デフォルト][2]）
1. 画像をリンクする際には`/public`からの絶対パスではなく、相対パスで`require(...)`する（例：`<img src={require("...")} />`）
1. devではoptimizeされないので注意（`optimizeImagesInDev: true`でdevでも動くとあるが、next.jsがハングアップする模様...）
1. 念のために再起動する
1. `yarn build`で画像のパスが変わっているか確認

```js:next.config.js
const withPlugins = require("next-compose-plugins")
const optimizedImages = require("next-optimized-images")

const nextConfig = {
  // あれば
}

module.exports = withPlugins(
  [
    [
      optimizedImages,
      {
        // these are the default values so you don't have to provide them if they are good enough for your use-case.
        // but you can overwrite them here with any valid value you want.
        // inlineImageLimit: 8192,
        // imagesFolder: 'images',
        // imagesName: '[name]-[hash].[ext]',
        // handleImages: ['jpeg', 'png', 'svg', 'webp', 'gif'],
        // optimizeImages: true,
        // optimizeImagesInDev: false,
        // mozjpeg: {
        //   quality: 80,
        // },
        // optipng: {
        //   optimizationLevel: 3,
        // },
        // pngquant: false,
        // gifsicle: {
        //   interlaced: true,
        //   optimizationLevel: 3,
        // },
        // svgo: {
        //   // enable/disable svgo plugins here
        // },
        // webp: {
        //   preset: 'default',
        //   quality: 75,
        // },
      },
    ],
  ],
  nextConfig
)
```

# require(...)する時に相対パスではなく、絶対パスでやりたい場合

```js:next.config.js
const { resolve } = require("path")
const nextConfig = {
  webpack: (config) => {
    // next-optimized-images
    // 名前は何でも良い（@p、~images、@publicImages ...）
    config.resolve.alias["@public"] = resolve(__dirname, "public")

    return config
  },
}
```

こうしておいて、/publicからいつものように参照するように`@public`から始める（名前は何でも良い）

```tsx
  ...
  ...
  return(<img src={require("@public/../../")} />)
  ...
  ...
```



[1]: https://github.com/cyrilwanner/next-optimized-images
[2]: https://github.com/cyrilwanner/next-optimized-images#example
LINEにプログラムの終了通知を送る（LineNotify）

## 概要

昨今のコロナ事情で、スーパーやコンビニへ買い物に出かけたり、人のいない時間帯に少し散歩したりすることが増えました。時間のかかる計算を実行してから、そのようなことを行うことが多いのですが、プログラムが終了しているのかを簡単にLINEに通知する方法を紹介します。

## 方法

### LINE Notifyからトークンを取得

他の記事にもたくさん書いてあるので、省略します。参考にリンクを貼ってます。
### 設定

以下の内容を`.bashrc`もしくは`.zshrc`に書き込む。`LINE_TOKEN=XXXXX`には、取得したトークンを書き込んでください。

```{shellscript: ".bashrc" or ".zshrc"}
export LINE_TOKEN=XXXXX
function line-notify (){
    curl -X POST -H "Authorization: Bearer $LINE_TOKEN" -F "message=$1" https://notify-api.line.me/api/notify
}
```

あとは、以下のようにメッセージ付きで実行すれば、LINEに通知がいきます。

```{shellscript: 実行方法}
# 通知を送るのみの場合
line-notify 計算が終了しました

# pythonの実行後に通知をする場合
python sample.py; line-notify 計算が終了しました
```


## 参考

- https://notify-bot.line.me/ja/
- https://qiita.com/iitenkida7/items/576a8226ba6584864d95
- http://tech.innovation.co.jp/2016/10/14/Try-Line-Notify.html
【学習メモ】Rails、form_withタグ



##題材

```erb
<div>
  <div class="col-md-4 offset-md-4">
    <h2 class="text-center">New question</h2>
    <%= form_with model: @question, local: true do |f| %>
      <div class="form-group">
        <label>Name</label>
        <%= f.text_field :name, class: "form-control" %>
      </div>
      <div class="form-group">
        <label>Name</label>
        <%= f.text_field :title, class: "form-control"%>
      </div>
      <div class="form-group">
        <label>Name</label>
        <%= f.text_field :content, class: "form-control"%>
      </div>
      <div class="text-center">
        <%= f.submit "Save", class: "btn btn-primary" %>
      </div>
    <% end %>
  </div>
</div>
```

##解説

＜各メソッドについて＞
**form_with**
→form=forメソッド、,formタグを兼任

**text_field**
→inputタグ、type="text"

**submit**
→inputタグ、type-"submit"

上記各メソッドは、「フォームヘルパー」というもの
HTMLタグを書かなくても自動生成してくれるもの

＜記述について＞
<%= form_with model: @question, local:true do |f| %>
→モデルのところに、コントローラから渡したquestionモデルのモデルオブジェクトを設定するという意味

local:true
→非同期通信をNGにする


＜動作確認＞
コントローラの実装：Viewにquesitonモデルのインスタンスを渡す実装を行うこと


##エラーの対応
**エラー部分**

```
SyntaxError in QuestionsController#new

<div class="form-group">（ここが赤枠になってエラーになっている）
```
（直訳）
Qコントローラのnewアクションについて、文法・構文エラーになってますよ

（なぜ？）
コントローラ、new.html.erb（もしくはモデル）のどこかにスペルミスしているから

（解決策）
僕の場合、new.html.erbで、<%>、</div>の閉じタグの記載ミスでエラーになっていたので修正したら解決しました。

（学び）
何度も経験していることだが、
1.MVC設計の観点でエラーを分析すること
2.C→M→Cアクション→V→レスポンス、のループに異変がないか確認すること

これが基本だと実感。
Javaのメソッド

###メソッド
JavaのメソッドはJavaのファイルを実行すると、自動的にmainメソッドが実行されます。
mainメソッドが各メソッドに指示を出し、各メソッドが個々の処理を実行します。
Main.javaを実行=>mainメソッド=>各メソッド(メソッド1)(メソッド2)(メソッド3)といった具合です。
メソッドの定義

```Main.java
public static void メソッド名() {
  実行する処理;
}
```
【例】

```Main.java
class Main {  //Mainクラスのブロック
  public static void main(String[] args) {  //mainメソッドが呼ばれます
    hello();  //mainメソッドの中でhelloメソッドが呼ばれます
  }
  public static void hello() {  //helloメソッドの中でおはようが実行されます
    System.out.println("おはよう");
  }
}  //Mainクラスのブロック
```
Azure Synapse Analytics WorkspaceがPublic Preview

## 速報
Synapse AnalyticsがPublic Previewされているようです。
※サブスクリプションごとにタイミングは違うかもしれません

Private Previewは専用のポータルurlからしかサービスは確認できませんでしたが、通常のポータルから表示されるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ee575216-7801-edb4-d53b-15d81607374b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/22814fde-b701-d6a5-c52d-288a257ea1fe.png)

## 参照

注意点や使用感の記事をupしていく予定です

### Synapse Studio

迅速かつ綺麗にまとまっておりました
[SEの雑記様 Archive for the ‘Synapse Analytics’ tag](https://blog.engineer-memo.com/tag/synapse-analytics/)


### Spark for Synapse(Spark Pool)
[AzureSynapseAnalyticsのメタデータ共有についてわかったこと](https://qiita.com/ryoma-nagata/items/300ae6df431642bc9919)

### Power BI 統合

[AzureSynapseAnalyticsのPowerBI連携を試してみる](https://qiita.com/ryoma-nagata/items/202841f72be8622d16a3)
[外部テナントのAzure Synapse AnalyticsでPower BI連携をする方法](https://qiita.com/ryoma-nagata/items/4aa336380807e97d1234)

### docs 

日本語版もできているようでした。
https://docs.microsoft.com/ja-jp/azure/synapse-analytics/sql-data-warehouse/
AGC039-C Division by Two with Somethingの解説をしようとした何か

[GoogolS0](https://atcoder.jp/users/GoogolS0)です。
[AGC039-C](https://atcoder.jp/contests/agc039/tasks/agc039_c)についての理解をもっと深めようと思い、この問題の解説を書くことにしました。わかりにくかったらすみません。

# 問題

$X$以下の非負整数に対して、次の操作を最小何回行ったら元に戻るか(戻らない場合$0$)の和を$mod\ 998244353$で求めなさい。
・現在の整数が奇数なら$1$を引き$2$で割る。そうでなければ、$2$で割り$2^{N-1}$を足す。

# 解説

まず、この操作を$f$と表すことにします。
ここで、この操作は次のように言い換えられます。(ただし、$A$は$2$進数で$N-1$桁の数とします。また、この先$2$進数で$k$桁の数と表されうる数は、$2^k$未満の非負整数の二進数表記に$k$桁になるまでleading zeroをつけたもののみとします。)
- $f(A1)=0A$
- $f(A0)=1A$
この言い換えができることを示します。
まず、操作する数が偶数であっても奇数であっても、まず$2$で整数除算をしていることがわかります。この操作によって最上位のbitは必ず$0$になります。
その後、操作する数が偶数の時のみ$2^{N-1}$を足しています。ここで、操作する数は必ず$2$進数で$N$桁であることを考えると、$2^{N-1}$を足すことによって最上位のbitが$1$になることがわかります。これによって、この言い換えが成り立つことが示せました。
次に、この操作を$2$進数で$N$桁の数に対して行った場合、操作回数は何回になるかを考えてみます。
まず次のことが成り立つことがわかります。
**$f^N(A)=A$の全bitが反転した数となる** (ただし、$f^m$は$f$を$m$回適用することを指します。)
これは、$f^m(m≦N)$を次のように言い換えることでわかります。
- $2$進数で$0$桁の整数$B$を持つ。適用する整数の最下位のbitを反転させて$B$の先頭に置く。また、適用する整数の最下位のbitは削除される。最終的に残った整数の先頭に$B$を結合させて操作結果とする。
この操作を$m=N$で行った時、$B$が操作する整数の全bitを反転させた整数になるため、これが示せます。
また、そのため**$2N$回操作をした場合、必ず元に戻る**ことがわかります。
ただし、すべての$2$進数で$N$桁の整数に対して最小回数が$2N$回になるわけではありません。たとえば、$f^2(010)=010$となります。
ここで、$A$が$2$進数で$m$桁の整数であり、($A'$を$A$の全bitが反転した数としたとき)操作する整数が$A A' A ... A A' A$のようになるとき、操作回数は$2m$回(以下)であることがわかります。これは、操作を$N$回行うことで全bitが反転することを示したときに使った言い換えをもう一度使うことで示すことができます。
まず、$A' A$の全bitを反転させた数は$A A'$です。ここで、その言い換えでの$B$が$A A'$になるまで操作したとき、残っている整数の$2$進数表記は操作する整数の$2$進数表記の下$N-2m$桁と一致することがわかります。また、そのとき$B$は操作する整数の上$2m$桁と一致することもわかります。そのため、これが示せました。
また、操作する整数を$A A' A ... A A' A$のように分割するためには、$m$が$N$を$3$以上の奇数で割った商になる必要があることがわかります。そのため、$N$の$N$でない奇数の約数を$m$としてすべて試し、それぞれの$m$に対して
・操作を$2m$回して初めて元に戻る数の個数$×2(N-m)$
を計算し、それらすべての和を$2N(X+1)$から引いて答えを($mod\ 998244353$で)求めればよいです。
これを求めるには、次のような方法を使えばよいです。
・まず、$N$のすべての約数$m$について$2m$回の操作で初めて元に戻るような数の個数を記録するための配列などを持っておく。
・$N$の小さい約数$m$から順に、「「**$N/m$が$3$以上かつ奇数かどうか**(そうであるなら$1$、そうでないなら$0$)」$×$(「**$X$の上$m$桁を$2$進数として見た時の数**(これは、Xよりも小さいことが上$m$桁を見るだけでわかるような$2m$回の操作で元に戻る数の個数です)」$+$「**$X$と上$m$桁が等しいような$2m$回の操作で元に戻る数が$X$以下であるかどうか**(そうであるなら$1$、そうでないなら$0$)(これは実際にそのような数を(文字列として)構成することでわかります)」$-$「**$m$の$m$でないすべての約数$l$**(これは$N$の$m$未満の約数すべてに対してそれが$m$を割り切るかを判定したほうがよいと思われます)**に対して操作を$2l$回して初めて元に戻る数の個数の和**」)」を記録する。
これで、すべての$N$でない$N$の約数$m$に対して操作を$2m$回して初めて元に戻る数の個数が求まるので、答えが求まります。

# 感想

考察するのがとても面白い問題でした。ただ、$100101101001$なども操作回数が$2N$回未満であることに気がつかずとても時間を使ってしまったことが反省点です。
初めて書き切ることができた解説ブログです。
(追記:ミスがありました。すみませんでした。(追記:$mod$を間違えていました。申し訳ありません。))

ここまで読んでいただき、ありがとうございました。
[Rails5] Rspec -validation編-

#はじめに
今回はModelのvalidationを対象にRspecを書きます

**・name,email,passwordがあれば有効である事**
**・name,email,passwordが無ければ無効である事**

以上の２点をテストしたいと思います。
#1. テスト対象
```Ruby
validates :name,
       presence: true,   
validates :email,
       presence: true,   
validates  :password,
       presence: true,
```
テスト対象はUser登録時のvalidationを対象にします。
今回はvalidationの有効性のみ検証したいので、上記の様に簡素なコードとします。
       
#2.実装
```ruby
require 'rails_helper'

Rspec.decribe User, type: model do
  describe '#validates' do
    context '名前、メアド、パスワードが正しければ' do
      it '有効である事'  do
        @user = User.new ({
          name: "テスト太郎",
          email: "xxx@yyy.jp",
          password: "111111",
        })
        expect(@user).to be_valid
      end   
    end

    context '名前、メアド、パスワードが正しくなければ' do
      it 'validateされる事' do
        @user = User.new ({
          name: "",
          email: "",
          password: "",
        })
        expect(@user.valid?).to be_falsy
      end
    end
  end
end
```

インスタンス変数にそれぞれ正しいオブジェクトと正しくないオブジェクトを代入します。

validationgが有効であるかテストする為に**be_valid**(プレディカットマッチャ)を使い、反対に有効では無い時はfalseが返ってくる事を確認する為に**be_falsy**を使っています。

**＊オブジェクトを作る時のnewメソッド直後の波括弧はvalue,括弧はkeyそれぞれに与えてあげないといけない見たいです。個人的にちょっと嵌りました。**

#3.テスト結果
```ruby
2 examples, 0 failures
```

**通りましたね。**

validation対象のRspecはシンプルな記述ができるので理解し易いと感じました。

#最後に

今回はまとめて実装して見ましたが本来各カラム毎にテストを走らせる必要があると思います。

それとコード叩いてて思ったのは自分自身、各括弧　**(){}[]**　をそれぞれ感覚で使っていたので改めて理解する必要があるなと感じました。また記事にしたいと思います。





ps→
日本うなぎの稚魚はオーストラリアから海流に乗ってやってくるらしい。