OmniAICreator/Qiita-1.07M huggingface dataset:
apt update に失敗した

# apt update でエラーを吐いた

```shell

$ sudo apt update
Hit:1 https://deb.debian.org/debian buster InRelease
Hit:2 https://deb.debian.org/debian-security buster/updates InRelease                        
Hit:3 https://packages.cloud.google.com/apt cloud-sdk InRelease                              
Ign:4 https://storage.googleapis.com/cros-packages/84 buster InRelease                       
Hit:6 https://storage.googleapis.com/cros-packages/84 buster Release   
Get:5 https://packagecloud.io/headmelted/codebuilds/debian stretch InRelease [23.4 kB]
Err:5 https://packagecloud.io/headmelted/codebuilds/debian stretch InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0CC3FD642696BFC8
Reading package lists... Done
W: GPG error: https://packagecloud.io/headmelted/codebuilds/debian stretch InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0CC3FD642696BFC8
E: The repository 'https://packagecloud.io/headmelted/codebuilds/debian stretch InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
```

エラーを見た感じ、証明書の検証が原因のよう

だから、以下のように証明書を追加する


```shell

$ sudo apt-get -qO - https://packagecloud.io/headmelted/codebuilds/gpgkey | sudo apt-key add -
OK
```

証明書管理は、`apt-key` コマンドで行う

```shell

$ apt-key help
Usage: apt-key [--keyring file] [command] [arguments]

Manage apt's list of trusted keys

  apt-key add <file>          - add the key contained in <file> ('-' for stdin)
  apt-key del <keyid>         - remove the key <keyid>
  apt-key export <keyid>      - output the key <keyid>
  apt-key exportall           - output all trusted keys
  apt-key update              - update keys using the keyring package
  apt-key net-update          - update keys using the network
  apt-key list                - list keys
  apt-key finger              - list fingerprints
  apt-key adv                 - pass advanced options to gpg (download key)

If no specific keyring file is given the command applies to all keyring files.
```

## 参考

[Ubuntu Manpage: apt-key - APT キー管理ユーティリティ](http://manpages.ubuntu.com/manpages/trusty/ja/man8/apt-key.8.html)
【RubyonRails】APIでadd_token_to_usersしてログイン機能を実装する

##はじめに
APIでウェブサービスを制作中。
ユーザーのログイン機能を実装することに。
APIのログイン機能作るのは初めてだったので、下記のページを参考に実装。

[Railsでトークン認証のログインAPI実装 - Qiita](https://qiita.com/puremoru0315/items/7a0b57cb69e3a5b69f08#controller)

##環境
MacBookAir
ruby 2.6.3
Rails 6.0.3.2

##ルーティングを考える
```config/routes.rb
Rails.application.routes.draw do
  namespace 'api' do
    namespace 'v1' do
      post '/login', to: 'sessions#create'
    end
  end
end
```

##マイグレーションの追加
```
$rails g migration Add_token_To_Users token:token
```
以下が作成される

```db/migrate/20200911133819_add_token_to_users.rb
class AddTokenToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :token, :string
    add_index :users, :token, unique: true
  end
end
```

##モデル
```
class User < ApplicationRecord
    has_secure_token
end
```

##コントローラー

```app/controllers/api/v1/users_controller.rb
module Api
    module V1
class SessionsController < ApplicationController
  def create
    user = User.find_by(email: session_params[:email])

    if user&.authenticate(session_params[:password])
        session[:user_id] = user.id
        return render json: { token: user.token}
    else
        return render json: { status: 401, message: "認証に失敗しました" } 
    end

   end

  private

  def session_params
    params.require(:session).permit(:email, :password)
  end
end
end
end
```

##POSTMANでログインを試してみる

できたっぽい。

![スクリーンショット 2020-09-19 16.51.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639411/29f66b60-7276-45cb-a90f-d43580ce296e.png)


##終わりに
これからログアウト機能も実装しないと。
yukicoder contest 265 参戦記

# yukicoder contest 265 参戦記

## [A 1223 I hate Golf](https://yukicoder.me/problems/no/1223)

[ABC177A - Don't be late](https://atcoder.jp/contests/abc177/tasks/abc177_a) かなと思ったが、座標がマイナスの可能性があった. まあ、abs つけるだけだよねと思いつつ、ABC177 のときにはやらなかった = 付け忘れをやらかすなどした.

```python
N, K, T = map(int, input().split())

if K * T >= abs(N):
    print('Yes')
else:
    print('No')
```

## [B 1224 I hate Sqrt Inequality](https://yukicoder.me/problems/no/1224)

a,b≤10<sup>18</sup> を見て、素因数分解して共通の素数で割りたいけど、エラトステネスの篩が使えない値域じゃん、どうすればいいんだと悩んでいた. はい、GCDで割ればいいだけですね orz. 割り切れるということは、a×10<sup>N</sup>%b=0 ということなので、aとbのGCDで割ったbが2<sup>N</sup>×5<sup>M</sup>になっていればOK.

```python
from math import gcd

a, b = map(int, input().split())

t = gcd(a, b)
b //= t
while b % 2 == 0:
    b //= 2
while b % 5 == 0:
    b //= 5

if b == 1:
    print('No')
else:
    print('Yes')
```

## [C 1225 I hate I hate Matrix Construction](https://yukicoder.me/problems/no/1225)

typo で自爆しまくった(笑). まず S にも T にも2がある場合は、もう論理和が0になることはありえないので、1と2しかないことが保証され、2が指定されたところ以外に1を置く必要はない. S か T のどちらかだけに2がある場合、無い方は全部論理和が1になること確定. 2がある方は、1の数だけ適当にどこかに1を置けば良い. S にも T にも2がない場合には、1の数だけ1を置いていくことになるが、1個置くごとに S, T のノルマを一つづつ消せるので、それぞれの1の数の大きい方の数だけ置けば良い.

```python
N = int(input())
S = list(map(int, input().split()))
T = list(map(int, input().split()))

m = [[0] * N for _ in range(N)]

s1 = S.count(1)
t1 = T.count(1)
s2 = S.count(2)
t2 = T.count(2)

if s2 == 0 and t2 == 0:
    print(max(s1, t1))
elif s2 > 0 and t2 > 0:
    print(s2 * N + t2 * N - s2 * t2)
elif s2 == 0:
    print(t1 + t2 * N)
elif t2 == 0:
    print(s1 + s2 * N)
```
asdf プラグインの作成 : Vimの場合

# asdf-vm プラグインの作成

[asdf-vm](https://github.com/asdf-vm/asdf) はバージョニング管理ツール(でいいのかな?)で、[プラグイン](https://github.com/asdf-vm/asdf-plugins) による複数種のツールの管理、また同機構での拡張ができるのが特徴です。

## asdf-vim プラグイン

さて、このプラグインの一覧を見たときに、[Vim](https://github.com/vim/vim) がないことに気付きました。

Vimはパッチバージョンの更新が頻繁で、リリースという明確な区切りがないので、ときどき不具合ありに当ってしまうことがあります。

このときに回避したり、どこで混入したか調べたりするのに、古いバージョンを簡単に導入・切り替えできると嬉しいところがあります。

(とはいえ、作った者は、普段は[Linuxbrew](https://docs.brew.sh/Homebrew-on-Linux)で更新していってるので、これであれこれすることは少なそうですが...)

そこで、練習と環境充実を兼ねて[asdf-vim](https://github.com/tsuyoshicho/asdf-vim)を作成しました。

## asdfのプラグインとして

下で作成自体については詳細に説明しますが、asdfのプラグインがどんなことをすればいいのか、簡単に説明します。

* bin/install、bin/list-all というコマンド(基本シェルスクリプトだが)が入ったリポジトリを作る(これは最低限)
* bin/list-all はどうにかやって、対象ツールのインストールとして対応するバージョンリストを出力する
* bin/installは引数で上のバージョン、インストール先などの情報をもらうので、それをもってインストール処理を行う
* `asdf plugin-install hoge <git htttps path>` でプラグインをインストールして使う
* asdf-pluginsへPRするには、
    * CIテストの追加、GitHub Acitonsならインストールテストをしてくれるactionが用意されている
    * CIテストがGreenであること
    * pluginsディレクトリのhogeファイルにターゲットリポジトリを記載
    * READMEに名前、リンク、Statusなどを入れ、更新
    * これをローカルチェック
    * PRのステータスもGreenであること
    
    を確認しこれらをもってPRとして追加依頼をする
    [Adds vim plugin by tsuyoshicho · Pull Request #289 · asdf-vm/asdf-plugins](https://github.com/asdf-vm/asdf-plugins/pull/289)

オフィシャルへの追加がありうるようなプラグインとしてはかなり簡素ですね。

## よくあるOSS派生物作成として

作り方というか、わりとへろっと作ったので、その軌跡は残しておこうかと思います。
今回のもの固有というよりは、なんらかのOSSの派生(forkというよりは類似品作成的なもの)として参考になるように凡例的に書いている(つもり)。

1. 既存のプラグインのコードを眺めてみる
2. オフィシャルドキュメント [docs at asdf-vm.com](https://asdf-vm.com/#/) を読む
3. ある程度目処がついたら、自分が作りたい内容に近いものを探す (今回は[srivathsanmurali/asdf\-cmake](https://github.com/srivathsanmurali/asdf-cmake)を派生元にさせてもらった)
4. ライセンスをチェックし、派生できるか確認
5. 大丈夫なので派生する
6. 自分向けに必要箇所を変更(cmake->vim)
7. ビルドするところは完全に新規で作る...が、これも実績あるものを参考にする (継続的にビルドをやってるものとして [homebrew\-core/vim\.rb at master · Homebrew/homebrew\-core](https://github.com/Homebrew/homebrew-core/blob/master/Formula/vim.rb)を参考にした)
8. これらをもとに自分が思うところも修正する (travis -> GitHub Action化、同処理でshell scriptのlint)
9. 動作確認
10. 完成

こんな感じで既存の動いてるものを参考にすることで、初動の良さ、あまり必要のない詰りをうまくやれたりします。


## いかがでしたか?

って書くとアレですね...、他のソフトのプラグインでもですが、1本まるまるソフトを作るにくらべると敷居は下るので、挑戦するに良い題材なのではないでしょうか?
DateクラスのparseとvalueOf

## salesforceに日付に対し、許容できる範囲があります。それは1700/1/1〜4000/12/31です。

#### 文字列から日付に変換する時、許容範囲内の変換処理は上記の二つのメソッドが区別がないです。

```範囲内の日付変換.cls
Date d1 = Date.parse('2000/1/1');
System.debug('parse = ' + d1); // parse = 2000-01-01 00:00:00
Date d2 = Date.valueOf('2000-1-1');
System.debug('valueOf = ' + d2); // valueOf = 2000-01-01 00:00:00
```
#### 許容範囲外の変換処理は上記の二つのメソッドの挙動が違います。

```範囲外の日付変換.cls
Date d1 = Date.parse('1699/1/1');
System.debug('parse = ' + d1); // System.TypeException: Invalid date: 1699/1/1
Date d2 = Date.valueOf('1699-1-1');
System.debug('valueOf = ' + d2); // valueOf = 1699-01-01 00:00:00
```
## まとめ
salesforce許容範囲外の日付変換をする時、 Date.parseはExceptionが発生しますが、Date.valueOfは正しく変換されます。
ServiceNowでフォームの全フィールを読取り専用にする

#概要
ServiceNowで作成したフォームをすべて読取り専用にする。

#方法
すべてのフィールドを読み込むする方法は幾つかあります。その代表的なものはUIポリシーで各フィールドを読み込み専用にする事と、クライアントスクリプトでフィールドを読み込みにする方法である。前者の場合はフィールド毎に設定をする必要があるのでフィールドを追加すると設定も追加する必要がある。
スクリプトで行う方法も複数ありますが、今回は一番簡単かつ一番保守性が高いやりかたを紹介します。

##UIポリシーによる設定
UIポリシーでフィールド毎にフィールドを読取り専用にすることはできる。しかしフィールドが多いと設定するよに時間が掛かる。

##スクリプトで設定
フォーム定義テーブルを参照してフィールドを取得して読み取り専用にすることもできるが、今回はUIのみで行う方法を紹介します。g_
次のようなスクリプトを作成する。g_form.getEditableFields()を使えば半周可能なフィールド一覧を取得することができます。取得したフィールドを読み取り専用にするだけです。

```
function onLoad() {
        //必要に応じて条件を挿入
        var fields = g_form.getEditableFields();  //フォームの編集可能フィールを取得
        for (var x = 0; x < fields.length; x++) {
	    g_form.setMandatory(fields[x], false);  //必須を無効にする
	    g_form.setReadOnly(fields[x], true);    //読取り専用にする
        }
}
```
【Java】配列とArrayListの違いについて

###初心者には同じにしか見えない...
**「Arrayってそもそも配列ですよね？ArrayListもArrayってあるから配列だよね！？」**

これは僕だけではないと思います。

使用していく中で経験的にわかっていくとは思いますが、ちゃんと理解していないと困ることもあるかと。

自分なりの理解をメモしておきますので、初心者の方に対して少し違いがイメージできるようになる助けになればと思います。


###そもそもクラスって？

* クラス
    * データ（変数）
    * 処理（メソッド・関数）

要は**データと処理を一まとまりにして扱うよ**というもの。

これが最初はわからなかったし、今でもそんなに便利なものなのかどうかもよくわかっていませんが。。。

よく車とかで説明されたりしますが、結局**「言ってることはわかるけど。。。」**という消化不良状態でした。

しかし、結局は**テンプレ**だと考えればすっきりしました。


###クラスはテンプレ、インスタンス化はテンプレの利用

初心者にはクラスとかインスタンス化しないと使えないとか言われてもなんのこっちゃという感じだと思います。

車でいうと
* 車種
* 排気量
* 値段

とかいうものをまとめてクラスとして、インスタンス化して
* 車種：プリウス
* 排気量：1200CC
* 値段：200万円

とすることで、クラスが利用できるようになるとか言われてもね。

走るという処理も、インスタンス化して、格納されている変数を下に動作するとかなんとか？書いててもよくわかりません。

しかし、そもそもテンプレだと考えればすっきりします。

車を作ろう！と思った時に、
**車種：デビル**
**排気量：1億**
**燃料：原油**

**よし作った！んじゃ売ろう！あれ、値段どうするよ？**

ってなると困るやん？てか最初の段階で車作ろうぜって話をする人はその時その時で違う人のはず。その時に決め事がなければ最初に決めておくことは人によりけりってなると毎回毎回現場は困るわけです。

ということで、ここで車クラスというテンプレを作っといて
車種
排気量
燃料
値段
色
速度
走る
止まる
バックする
を最初に決めてね！ってしとけば、「これ決めてへんかった」とか「何決めなあかんかったっけ？」ということはなくなります。

んでこのテンプレに沿って「じゃあ車種はデビルって奴にしようぜ！」って決めていくのがインスタンス化ですね。

厳密には違うのでしょうが、この理解でほぼ問題ないかと思います。

んで処理に関しても、走るっていう処理を設計ごとにどのくらいのスピードで動くかを決めていくんじゃなくて、速度という値を先に決めておいて、その速度の値を使って、**「このくらいのスピードで前に進む」**とテンプレ化しておけば毎回同じ命令の走るでちゃんと走るという感じ。

だから値だけ配列のようにまとめておくよりも、その値を使ってどうするのっていう処理もまとめておけば、記述が統一されるんですね。

テンプレだと思えば便利なものだなと思えます。


###配列はクラス
クラスの中の変数を取り出す時は
クラス名.変数名
というように書くので、配列の要素数を取り出すには、配列のクラスの中にあるlengthという変数に要素数が入っているので、

```
array.length
```

のようにすれば取り出せる。

###ArrayListはクラスを格納してるかつカプセル化
カプセル化してると変数に直接アクセスできません。というのも

```
array.length
```

のように書いてもエラーになるだけということ。

じゃあどうすりゃいいのっていうとカプセル化の説明などで出てくる、getterやsetterなどの**メソッド**を使用して変数の値を取得したりするんですね。

メソッドを使わないといけないというところがミソ。

つまり、要素の数を取得する時に

```
array.size();
```
のように最後に**(　)**が必要になるということ。メソッドだから。

メソッドを使っているのか、変数名を指定して取得しているのかっていうところで書き方が違うので、「とりあえずこう書けば動く」と覚えるよりも「メソッドを使っているのか変数名を指定してるのか」の違いはわかっていないと（　）をつけるのかどうかで迷ったりするかと思います。


###あんまりまとまってないですがまとめ

とりあえず自分の頭の整理のつもりで書きました。厳密な説明ではありませんが、漠然としたイメージが少しはすっきりしたイメージに変わればと思います。

また、このあたりの話は別記事でまとめていきたいと思います。
【Office365】共有メールボックスの一覧と権限の与えられているユーザーを抽出する

全部の共有メールボックスの中から誰がどの共有メールボックスの権限を持っているのか知るのに有効なPowerShellです。
弊社ではよく必要になります(笑)

①まず、共有メールボックスのフルアクセス許可を持つメンバー情報を一括で出力します。

```PowerShell:FullAccess.ps1
Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails SharedMailbox | Get-MailboxPermission | Where {($_.User -Notlike "*S-1-5-21*") -And ($_.User -Notlike "*\*")} | Select Identity,User,AccessRights | Export-CSV -NoTypeInformation -Encoding UTF8 -Path "C:\temp\SharedFullAccesslist.csv"
```

②上記、PowerShellでは、共有メールボックス名が取得出来ないので、以下のPowerShellを実行します。
Exchange管理センターからでも共有メールボックスの一覧情報は取得出来ます。

```PowerShell:Mailbox.ps1
Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails SharedMailbox | Select DisplayName,PrimarySmtpAddress  | Export-CSV -NoTypeInformation -Encoding UTF8 -Path "C:\Temp\PrimarySmtpAddress.CSV"
```

あとはExcelでうまく結合をして一覧を作成してください。
勉強日誌6日目

だいぶ仕事に慣れてきたが残業が多いから今日は結構疲れ気味
それでも毎日少しはやる

正答率 72%

/etc/aliases
sendmailでメールを転送するための別名を設定するファイル

exim
Debian系の標準MTA

/etc/cups
印刷サービスCUPSの設定ファイルが置かれているディレクトリ

/etc/cups/printers.conf
CUPSの印刷システムで、プリンタの設定ファイル

mailq
sendmailで送信待ちのメールを一覧表示するコマンド

lpr -#4 /etc/group
LPDと互換性のあるレガシーな印刷コマンドで、
/etc/group　ファイルを4部印刷する際のコマンド。

631
CUPSのデーモン「cupsd」　が接続要求を待ち受けるデフォルトのポート番号は？
【JavaScript】超基礎的なメソッドの紹介　その１

JavaScriptで行うDOM(Document Object Model、要はHTML等のマークアップ言語にアクセス・編集しやすい標準的に仕組み)の操作において、基礎的なメソッドを学んだため、備忘として記します。

１　HTML要素の取得（すべてはこれから始まる）
　　getElementByIdメソッド、getElementsByTagNameメソッド

```js
<h1 id = "heading1">朝の献立</h1>
<h1 id = "heading2">昼の献立</h1>
const select = getElementById(`heading1`); //「heading1」のidを持つHTML要素を取得し、定数selectに代入。
console.log(select); //「<h1 id = "heading1">朝の献立</h1>」をコンソールに出力。
const selects = getElementsByTagName(`h1`); //<h1>要素すべてを「配列の様に」取得（getElement"s"ByTagNameである点に注意）
console.log(selects[0]); //<h1>要素のうち１つ目をコンソールに出力。※文字列「朝の献立」を出力するわけではない点に注意。
console.log(selects[2]); //<h1>要素の３つ目は、undefined（定義されていない）とエラー。
```
２　テキストデータの取得
　textContentメソッド（ついでにfor文を用いた応用）

```js

<h1 id = "heading1">朝の献立</h1>
<h1 id = "heading2">昼の献立</h1>
<h1 id = "heading3">夜の献立</h1>
const selects = getElementsByTagName(`h1`); //<h1>要素すべてを「配列の様に」取得（getElement"s"ByTagNameである点に注意）
console.log(selects[0].textContent); //「朝の献立」とコンソールに出力。

for (let i = 0; i > selects.length; i++) {
     console.log(selects[i].textContent);
} //「朝の献立」「昼の献立」「夜の献立」とコンソールに出力。※for文の条件式の注意点としては、.lengthでselects要素の数を取得している。
```

とりあえずここまで。
その１と書いたので、続けたいと思います。
凝集度

# 凝集度 - cohesion

> 凝集度（ぎょうしゅうど、コヒージョン、cohesion）とは、情報工学においてモジュール内のソースコードが特定の機能を提供すべく如何に協調しているかを表す度合いである。
出典: [Wikipedia][]

凝集度の計算式にはLCOM1,2,3等のバリエーションがある。LCOM3はLCOM*とも言う。

## LCOM1

インスタンス変数のばらばらのセットにアクセスする場合はPを1増やし、それらが少なくとも1つの変数アクセスを共有する場合はQを1増やす。

```math
LCOM1 = 
\left\{
\begin{array}{ll}
  P-Q & (P > Q) \\
  0 & (others)
\end{array}
\right.
```

出典：[Cohesion metrics][]

## LCOM2

クラス変数へのアクセス方法で計算する方法。以下の式で表される。

```math
LCOM2 = \frac{1-\sum(mA)}{m * a}
```

- m: クラス内のプロシージャ（メソッド）の数
- a: クラス内の変数（属性）の数
- mA: 変数（属性）にアクセスするメソッドの数
- sum(mA) クラスの属性に対するmAの合計

出典：[Cohesion metrics][]

## LCOM3

LCOM2と同様で式の形だけが違う。

```math
LCOM3 = \frac{m-\frac{1}{a}\sum(mA)}{m - 1}
```

出典：[Cohesion metrics][]

[Wikipedia]: https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
[Cohesion metrics]: https://www.aivosto.com/project/help/pm-oo-cohesion.html
Electronをバージョンアップしたらjsのネイティブモジュールが読み込めなくなった話

Electron9にバージョンアップしたところ、
途中でアプリの画面が動かなくなってしまう(windowになにも表示がされない)障害が発生しました。

## 原因

* Electron9から、[appallowrendererprocessreuse](https://www.electronjs.org/docs/api/app#appallowrendererprocessreuse)のパラメーターがデフォルトで true になってた
* これによって２回目に読み込まれた時に、jsのネイティブモジュールが読み込めなくなっていた

## appallowrendererprocessreuse とは
([公式サイト](https://www.electronjs.org/docs/api/app#appallowrendererprocessreuse)より) Boolean値。trueのときは、レンダラープロセスが確実に再起動されるように、Electronが設定しているオーバーライドを無効にする。このプロパティは、レンダラープロセスで使用できるネイティブモジュールに影響する
とのこと。名前からして再利用しようとしてうまくモジュールを読み込めてない、というような状況。

## 対策（暫定対応）

* ページの初期化処理とかをしている部分で
  *  ``` app.allowRendererProcessReuse = false;```
* これまでと変わらないように動かせた
 

## 今後
* [issue](https://github.com/electron/electron/issues/18397) によると
  * Electron 6 で app.allowRendererProcessReuse オプションを追加
  * コンテキスト非対応のネイティブモジュールについて、Electron 7で最初の非推奨警告ランドを用意する
  * Electron 9 でapp.allowRendererProcessReuseのデフォルト値がtrueに
  * Electron 10でapp.allowRendererProcessReuseを変更する機能を廃止予定
  * Electron 11でapp.allowRendererProcessReuseを変更する機能を削除

* 今後Electron11では完全にfalseに変更できなくなるので、別の対応が必要
  * 現在調査中
【Udemy Python3入門+応用】　 64. 名前空間とスコープ

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■名前空間とスコープ
```python
animal = 'cat'

def f():
    print(animal)

f()
```
```:result
cat
```
ここでの `animal` はグローバル変数なので、もちろん `f()` 内で呼び出すことができる。
<br>

```python
animal = 'cat'

def f():
    animal = 'dog'
    print('after:', animal)

f()
```
```:result
after: dog
```
もちろんこれでは`dog`が出力されるが、これはグローバル変数の`animal`を上書きしているわけではない。
<br>

```python
animal = 'cat'

def f():
    print(animal)
    animal = 'dog'
    print('after:', animal)

f()
```
```:result
UnboundLocalError: local variable 'animal' referenced before assignment
```
最初に`animal`をprintしようとするとエラーとなった。
これは、関数内にローカル変数を宣言する記述があり、それが記述される前にprintしようとしているというエラー。
<br>

```python
animal = 'cat'

def f():
    # print(animal)
    animal = 'dog'
    print('local:', animal)

f()
print('global:', animal)
```
```:result
local: dog
global: cat
```
`f()`内ではローカル変数の`animal`を宣言してそれをprint、
最終行のprintではグローバル変数の`animal`をprintしている。
<br>

```python
animal = 'cat'

def f():
    global animal
    animal = 'dog'
    print('local:', animal)

f()
print('global:', animal)
```
```:result
local: dog
global: dog
```
関数内で`global`を使うことでグローバル変数の`animlal`を呼び出すと、そのグローバル変数を上書きすることになる。
<br>

```python
animal = 'cat'

def f():
    animal = 'dog'
    print(locals())

f()
print(globals())
```
```:result
{'animal': 'dog'}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fd8f9f687f0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'test.py', '__cached__': None, 'animal': 'cat', 'f': <function f at 0x7fd8f9db9160>}
```
`locals()`や`globals()`を使うことで、ローカル変数やグローバル変数をdictionaryとして呼び出すことができる。
printしたグローバル変数を見てみると、予めpython側で定義している変数があることがわかる。
<br>

```python
def TestFunc():
    """Test func doc"""
    print(TestFunc.__name__)
    print(TestFunc.__doc__)

TestFunc()
print('global:', __name__)
```
```:result
TestFunc
Test func doc
global: __main__
```
関数名を指定すると、その関数の`__name__`や`__doc__`が出力できる。
create-react-appを使用したReactの環境構築(TypeScriptも)

# はじめに

久々、環境構築をしたのでまとめました。
今回はcreate-react-appを使用してreactの環境構築をしていきます
どなたかの参考になれば。


# 環境

まずは作業を始める段階でのバージョンです。
homebrewは入っている前提で作業を進めていきます。

|名前|version|補足|
|---|---|---|
|MacOS|10.15|Catalina|
|homebrew|2.5||
|node.js|12.9||
|yarn|1.22|stable|
|create-react-app|3.4||


以下、今回インストールする物のバージョンです。

|名前|version|補足|
|---|---|---|
|nodebrew|1.0||
|node.js|14.10|stable 更新します|
|yarn|1.22|stable|
|create-react-app|3.4||


## nodebrewのインストール
まずhomebrewを使用して、nodebrewをインストールしていきます。
既にnode.jsが入っているので必要ないといえばないのですが、後々のことを考えてnodebrewを使用することにしました。
まずはインストール。

```
$ brew install nodebrew
```

私の場合、エラーが出ました。出なかった人はスルーしてください。
gccをインストールしないとビルド出来ないよとの事なのでインストールします。
終わったら再度nodebrewをインストールします。

```
Error: An exception occurred within a child process:
  CompilerSelectionError: nodebrew cannot be built with any available compilers.
Install GNU's GCC:
  brew install gcc
```

インストールが終了したら確認
バージョンが表示されたら成功です。

```
$ nodebrew --version
```

nodebrewがインストールされたらpathを通します。
私はCatalinaなのでzshですがbashの人は.bashrcで入力してください。
もちろんvimで直接入力しても問題ありません。

```
$ nodebrew setup

export...とパスが表示されるのでそれをコピーして↓のコマンドを入力
$ echo '{コピペしたやつ}' >> ~/.zshrc
```


次にnode.jsの安定版をインストールします。
バージョンを指定したい場合はstableの部分を指定のバージョンを書き入れましょう。
迷ったらとりあえず安定版。

```
$ nodebrew install-binary stable
```

インストールされていたら確認と指定をしていきます。

```
インストール出来ているか確認します
$ nodebrew list

今回はv14.10.1がインストールされていたのでこちらを使用します。
$ nodebrew use 14.10.1

nodeのバージョンを確認。14.10.1になっていればOKです
$ node -v
```
以上で、nodebrewとnode.jsのインストールは終了です。


## react.jsの環境構築

### yarnのインストール
node.jsのパッケージマネージャーであるyarnをインストールします。
こちらもhomebrewから。

```
$ brew install yarn
```
終わったら確認

```
$ yarn --version
```

### react-create-app


reactはreact-create-appを使用するのが一番楽なのでyarnからこちらをインストールします。

```
$ yarn global add create-react-app
```

インストールされたら使用可能です！

```
$ create-react-app {名前}
```

# まとめ
最近、自分のPCで開発をしていなかったので、なかなか長い道のりになりました。
作業を進めながら書いたので抜けはないかと思いますが、何かありましたらコメントお願いいたします！
近々react+typescriptの環境構築もするので、そちらもまとめますー！


## 追記
TypeScriptの設定を調べたのですが、どうやらcreate-react-appで簡単に設定出来るようです...!

```
$ create-react-app {アプリ名} --typescript
```

オプションを指定するだけで行けるらしいです...!簡単！！
Macbookを買い替えたときにやること 個人的9選

# はじめに

Macbook、だいたい4年に1回くらい買い換えると思います。
会社貸与のものがあればもっと頻度が高くなります。

MacOSが好きなので、今後何回買い換えるかわかりません。
毎回、「あれ、買い替えたら何すればいいんだっけ」となるのが面倒なので、やることリストを作っておきます。
完全に個人用ですが、何かの参考になれば幸いです。
(エンジニア向けです)

# やることリスト

## アプリケーションのインストール

以下は最低限必要なもの。

* Google Chrome
* Google日本語入力
* Slack
* iTerm
* Notion
* DeepL(デスクトップアプリ版おすすめです！)
* VSCode
* Karabiner-Elements(USキー配列がすきなので必須)
* Alfred
* Docker for Mac
* Table Plus
* Itsycal(メニューバーからカレンダーを呼び出せて便利)
* gitのアップグレード(デフォルトは少し古い)
* gitのコミットメッセージで起動するエディタをnvimにする

## MacのSystem Preferences

* トラックパッドの速さを速く
* caps lockをcontrolキーに
* Dockを小さくしてデフォルト非表示に。左サイドに配置
* キーリピートを最速に
* spotlightの呼び出しショートカットを無効化(Alfredを使うため)
* Functionキーの動作を、通常のFunctionキー通りにする(F12で開発者ツールを出すなど)

## Karabiner-Elementsの設定

Karabiner-Elementsは、キーバインディングを楽に設定してくれるアプリケーションで、USキーを使ってる場合は、右commandで日本語入力、左commandで英字入力とか設定できて便利です。

設定は[こちら](https://misc-log.com/karabiner-elements/)参照。

## iTermの設定

iTermは必須という人も多いのではないでしょうか。
設定`.plst`ファイルにエクスポートできるので、GitHubとかにpushしておくと便利です。
cloneして読み込むだけで設定完了。

## シェルの設定

`.zshrc`とかの設定です。
これも設定ファイルをGitHubとかにまとめておくと便利。
シェルスクリプトで一括で設定できるようにしておくとなおよし。
自分用のは https://github.com/tachibanayu24/.dotfiles にまとめています。

以下は別途インストールする

* neovim
    * 暗黒美夢王さんのプラグインを使いたいから入れます。vim派生のエディタです。`vim`でneovimを呼び出すようにエイリアスを貼っておくといいと思います。
* prezto
    * zshのフレームワーク。エイリアスとか自動補完をいい感じにしてくれます。

あと、自分で作成したbinコマンドがあれば設定します。
私は、ipアドレスをlocalとgrobalで表示するコマンドなど個人用に作成しています。
https://github.com/tachibanayu24/commands

## CLIアプリケーションのインストール

とりあえず以下は最初に入れます。

* XCode
* homebrew
* n(nodeのバージョン管理)
* docker
* docker-compose
* go
* ruby
* python3

## VSCodeの設定

`setting.json`を書くだけなので便利ですね。
これもGitHubとかにあげておくといいかと思います。

拡張のインストールは以下。

```
code --install-extension Arjun.swagger-viewer
code --install-extension CoenraadS.bracket-pair-colorizer-2
code --install-extension dbaeumer.vscode-eslint
code --install-extension donjayamanne.githistory
code --install-extension dsznajder.es7-react-js-snippets
code --install-extension eamodio.gitlens
code --install-extension Equinusocio.vsc-community-material-theme
code --install-extension Equinusocio.vsc-material-theme
code --install-extension equinusocio.vsc-material-theme-icons
code --install-extension esbenp.prettier-vscode
code --install-extension jpoissonnier.vscode-styled-components
code --install-extension naumovs.color-highlight
code --install-extension oderwat.indent-rainbow
code --install-extension PKief.material-icon-theme
code --install-extension rebornix.ruby
code --install-extension redhat.vscode-yaml
code --install-extension rid9.datetime
code --install-extension shd101wyy.markdown-preview-enhanced
code --install-extension wayou.vscode-todo-highlight
code --install-extension wingrunr21.vscode-ruby
```

`code --list-extensions | xargs -L 1 echo code --install-extension`でインストール済の拡張一覧が確認できます。

## Alfredの設定

呼び出しを`Control + Space`にするだけ

## Chromeの設定

USキー配列だと、操作中にCommand + Wしてタブ閉じちゃうとかありがちなので、
タブを閉じるショートカットをControl + Wに変更します。それだけ。

# おわりに

多分これで自分用のは満足していますが、また何か思い出したら追記します。
Unityで録音して、録音したサウンドを再生する最小実装

**Unityでサウンドを録音**して、また**録音した音声を再生**させた事がなかったので調査しました。

## 録音開始

MicrophoneクラスをStartすると録音状態となります。

```cs
// 10・・・録音最大秒数
// 44100・・・サンプリング周波数
_recordedClip = Microphone.Start("(録音機材名)", false, 10, 44100);
```
そして録音を終了する、または録音最大時間を越えると戻り値に**録音済みのAudioClip**が返却されます。使い方はとってもシンプルです。

録音する際は**録音機材名の指定**が必要です。上記のソースコードの中の`"(録音機材名)"`の部分です。

## 録音機材名の取得

`Microphone.devices`配列から録音機材名を取得できます。

```cs
foreach (string device in Microphone.devices)
{
    // 録音機材名リストに保持
    _micNames.Add(device);
}
```


## 録音の終了

```cs
Microphone.End("(録音機材名)");
```
ちなみに録音の終了は、Endメソッドに使用したデバイス名をセットします。

## 成果物
OnGUIで超シンプルなUIをデバッグ用として用意しています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/7468c2af-3f1a-84dc-5257-fefebdc8fc0b.png" width=300 />
僕のMacはSoundfloowerをインストールしているので、マイクが複数あり、それに気づかず最初動作しなくて戸惑いました。

## なぜこんな事をしているか？

経緯としては、子供がトランシーバーがほしいとせがんでくるため、家にあるものでそれっぽいものが作れないか今まさに模索している最中でございます。以下経緯Tweet。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">子供がどうしてもトランシーバーが欲しいと言われて、なんとか家にあるもので同様のものが作れないか模索している、ポーリングでなんとか出来ないかな。。</p>&mdash; 大庭俊介@UXエンジニア (@ohbashunsuke) <a href="https://twitter.com/ohbashunsuke/status/1304395051884097536?ref_src=twsrc%5Etfw">September 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

2台のスマホアプリで音声を直接やり取りする、またはサーバーに一旦保持させるなど、やり方は色々ありそうです。

どちらにしても声の録音が必要だったので備忘録として残しました。

## Unityじゃなくても良いのだが..
そうです。Unityでやる必要は一切ありません。しかしiOS、Androidに両方ビルドできるメリット、僕が Unityに慣れているという点、納期が短い(明日子供が学校から返ってくるまで)という点から採用しています。

時間が許せば、最近気になっているFlutterで実装し直してみようと思います。

全ソースは以下にアップしています。
https://gist.github.com/baobao/4e5d1332e030828d141c492f93ea3c06
[Rails]Formオブジェクト使用時にエラーメッセージが日本語化されない[locale]

#概要
オリジナルアプリ制作時、formオブジェクトを利用した箇所のエラーメッセージだけ日本語化されなかったのでその備忘録を。

https://qiita.com/rytr823/items/e9fbbb16884b6f52d463
調べていたら上記の方とほとんど同じでした。感謝。

#前提
ja.ymlファイルの作成までは終わっている

#環境
ruby 2.6.5
rails 6.0.0
gem 'rails-i18n'導入済み

#formオブジェクトの配置場所

`app/forms/guest_data.rb`

#EZ図
この図のguestsテーブルとbathsテーブルとdrinksテーブルの３つをformオブジェクトを使用して保存しようとしていた。

![兵声援EZ図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661072/6a52b887-40cc-af00-8c3c-4a7dead29ca3.png)


#内容
ja.ymlに記述しても日本語化が適用されない

#間違ってた記述

```ruby:config/locales/ja.yml
ja:
  activerecord:
    attributes:
      guest:
       first_name: 苗字（全角）
       last_name: 名前（全角）
       first_name_kana: 苗字（カタカナ）
       last_name_kana: 名前（カタカナ）
       gender_id: 性別
       visit1_id: １回目の利用日
       visit2_id: ２回目の利用日
       description: 利用者の詳細
      bath:
       bathing_id: 入浴の種類
       infection_id: 対応が必要な感染症
       timing_id: 入浴の順番
       remark_bath: 入浴の備考
      drink:
       drink_type_id: 飲み物の種類
       thickness_id: とろみの量
       warm: 温めるか
       diabetes: 糖尿病
```

#正しい記述

```ruby:config/locales/ja.yml
ja:
  activemodel:
    attributes:
      guest_data:
        first_name: 苗字（全角）
        last_name: 名前（全角）
        first_name_kana: 苗字（カタカナ）
        last_name_kana: 名前（カタカナ）
        gender_id: 性別
        visit1_id: １回目の利用日
        visit2_id: ２回目の利用日
        description: 利用者の詳細
        bathing_id: 入浴の種類
        infection_id: 対応が必要な感染症の有無
        timing_id: 入浴の順番
        remark_bath: 入浴の備考
        drink_type_id: 飲み物の種類
        thickness_id: とろみの量
        warm: 温めるか
        diabetes: 糖尿病
```

#原因

記述をした`app/forms/guest_data.rb`はactiverecordではなくactivemodelを継承していたため。


#参考記事

https://qiita.com/rytr823/items/e9fbbb16884b6f52d463
https://qiita.com/jacoyutorius/items/e0d2cfdb61ff4c4fd1e7
https://qiita.com/astap/items/c07e0b08273fd97aaa91
授業で１人１台コンピュータを活用するソフト

#「伝思黒板（でんしこくばん）」#
　児童・生徒に１台ずつコンピュータが配備なることになりました。そこで、一斉指導での活用を想定したソフトを作成しました。
https://kaihatuiinkai.jp/densikokuban/
![how_to_use.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509199/a1a0d03a-0184-9baf-6b2c-1915fd458d07.png)
・先生PCから、児童・生徒PCの画面に、指示や質問、図を表示させます。
・掲示板で意見を集めたり、SNSで討論ができます。
・Webページのアドレスを転送して、参照させることもできます。
・先生PCで、送信した発問や、生徒の回答の記録を見ることができます。
・授業の記録として、発問や回答を後日見ることができます。
・発問を事前に作成して、授業で活用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509199/98664176-d3e6-5fef-5d3e-b7e99c8f00d2.png)
##使い方##
セキュリティを固めるために、先生用IDパスワードと生徒用が別です。

###１　授業する先生の登録###
　・　ここで、先生用ID,パスワードが表示されます。必ずメモしてください。

###２　先生用ソフト起動###
　・　先生用ソフトを起動して、先生用ID,パスワードを入れます。
　・　授業の基本情報を入れると、「生徒用ID、パスワード」が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509199/3f3f561c-5a2e-43aa-bd5f-af81ca806a77.png)

###３　児童・生徒用ソフトを起動###
　・　児童・生徒用を起動して、「生徒用ID、パスワード」を入れます
　・　先生用ソフトから「指示、質問」を送ると、児童・生徒用ソフトの画面に転送されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509199/064ac6e0-df35-9be8-a530-d584f443449b.png)

　※約４秒のタイムラグがあります。

まだ、ベータ版なので、色や文字の大きさ、追加機能など、課題がたくさん
あると思います。そこは、ご意見をお願いします。
アジャイル開発をチームに取り入れるコツ

#はじめに
「アジャイル開発を取り入れるべきだ！」と意気込んでチームで実践してみても上手く行かない…。
そんな経験があるPMの方も多いのではないでしょうか。
そこで、この記事ではアジャイル開発をチームに上手く取り入れるコツを書きたいと思います。

#取り入れるコツ
結論から書きます。
取り入れるコツは「**アジャイル開発のエッセンスを徐々に取り入れること**」これに尽きます。

#なぜ徐々に取り入れるのが良いのか？
前提として、状況によってはアジャイル開発を導入することはハードルが高いことです。

チーム目線で言えば、そもそも今までやってきたやり方を変えること自体に
抵抗がある人は少なくない中で、やる意義や思想の理解など覚えることが多く見えるとなると
よほどチームを変えるべきだと強く意思をもったり、興味関心が高いメンバーが揃ってない限り
チーム内で途中で**「これなんの意味があるの？」**となって頓挫してしまいます。

最初から書籍やネットに書いてあるような形式的なアジャイル開発をこなせるチームは稀なのです。

また、新しい開発手法を取り入れるとなるとステークホルダーを説得するのも大変でしょう。
今までの手法を変えて本当に大丈夫か？上手くいくのか？
それらを経験のないメンバーが多い中で説得するのは骨が折れると思います。

メンバーを納得させつつ、メンバー自身も意義を感じ、
さらにステークホルダーも納得させる結果を出さないといけない。
高らかに「私たちはアジャイル開発をする！」とやり方を一新した時に、
ハードルの高さや期待感を超えることは難しいでしょう。

そこで、**少しずつエッセンスを取り入れ、
小さく小さく試して「改善している」ことを実感してもらうのです**

なぜこれをやるのか？を口で説明しても、実感しなければ本当の意味で納得はしないですし、
人は行動しません。なのでとにかくまずハードルを低くし、やる意義を体験してもらうのです。

アジャイル開発の意味も、細かい小難しいイベントの名前も、別に知らなくていいのです。
プロダクトが、自分たち自身が、
ステークホルダーが「改善している」と実感できることが何よりも大事なのです。
気付いたら自分たちは「アジャイル開発になっていた」　こうなることが理想です。

#まず何から取り入れると良いか
オススメは「振り返り」です。
それは、自分たち自身が改善を発信出来る場であり、
続けると改善を実感することができる場だからです。

スケジュールの遅延や、プロダクトの課題などに真摯にチームで向き合う場を強制的に作ることで、
メンバーも普段思っていることを話しやすくなります。

そこから、徐々に課題に対して打ち手を考えていき、そこで出たことをチームでルール化していけば良いのです。
典型的なプロジェクトの課題であれば、アジャイル開発でよくあるイベントを提案することで
課題の早期発見や課題解決のスピードをあげる手助けになるはずです。

自分たちが課題をしっかり認識し、そこで何をすればいいか考えた結果生まれたことであれば
メンバー自身も前向きに取り組めるはずで、チームが改善されればプロダクトも自ずと改善されるはずです。

#さいごに
アジャイル開発のゴールは「顧客に価値を提供し続け、信頼を得ること」です。
スクラムのイベントを教科書通りに全てこなしていることがアジャイル開発ではありません。

アジャイル開発を導入したいのは、このゴールに向かって上手く走れていないことが発信のはずです。
ゴールに向かって何をすることが最適なのか？
それをチームで考え、自分たちが最もゴールに向かって最短で走れる方法を見つけることが何よりも重要なので、
型にとらわれず、少しずつチームを変えていけるように徐々に変えていくことをぜひ実践すると上手くいくかもしれません。
【Udemy Python3入門+応用】　63. ジェネレーター内包表記

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**

##■ジェネレーター内包表記
#####◆普通に記述した場合
```python
def g():
    for i in range(10):
        yield i

g = g()

print(type(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))

```
```:result
<class 'generator'>
0
1
2
3
4
```

#####◆ジェネレーター内包表記で記述した場合
```python
g = (i for i in range(10))

print(type(g))

print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
```
```:result
<class 'generator'>
0
1
2
3
4
```
一見tupleになりそうな見た目だが、ただ`()`を使うだけだとジェネレーターとなる。

```python
g = tuple(i for i in range(10))

print(type(g))
print(g)
```
```:result
<class 'tuple'>
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
```
`()`の頭に`tuple`をつけることで、tupleを生成できる。
AmazonでKindle購入時の請求先住所の変え方

# AmazonでKindle購入時の請求先住所の変え方（Amazonの住所変更）

なぜかKindleを購入した場合だけ請求書の請求先が変わらないという問題に直面したので、カスタマーサポートにたくさんお世話になった結果なんとか更新できたので報告させていただきます。

## Kindle書籍請求先更新方法

### 1. 国、地域
[トップページ＞アカウント＆リスト＞デジタルコンテンツとデバイス：コンテンツと端末の管理＞設定タブ](https://www.amazon.co.jp/hz/mycd/myx#/home/settings/payment)
ここの、`国/地域設定`を変更する。

しょっぱなから何いってんだと突っ込みたくなりますが、請求先住所はここから引っ張ってきているようです。

**こんなの誰もわからねーよｗ**

なお、更新すると、”成功しました”とメッセージが出るものの、再度開くと全て空で表示されますが、更新はできているようです。

### 2. アドレス帳
[アカウントサービス›お客様のご住所](https://www.amazon.co.jp/a/addresses)
１の設定を行うと、アドレス帳に新しく住所が追加されます。これを既定の住所に設定します。

### 3. カード情報
[アカウントサービス › お客様の支払い方法 › お支払い方法](https://www.amazon.co.jp/cpe/yourpayments/wallet)
念の為カード情報は作り直します。
一度削除し、新しくカードを追加します。
カード情報の請求先住所に上記１で追加された住所を指定します。

### ４. Kindle の支払い設定、デジタルコンテンツの支払い設定
１で設定した画面に戻り、以下２つの設定を更新します。

＊ Kindle の支払い設定（Kindle 1-Click 支払い設定を変更）
＊ デジタルコンテンツの支払い設定(1-Click 支払い設定を変更)

新しく作ったカード設定を指定しましょう。

これで大丈夫！

次回購入時に反映されていますよきっとねえきっと。

## あとがき
Kindleの請求先住所変更は、１の`国、地域設定`が肝でした。
２，３，４は更新すると思いますが、`国、地域設定`はまったくノーマークだよね。。

チャットのカスタマーサービスでは一般的な更新方法を説明され、いや、それ何回もやったけどという発言は無視されて残念に思いつつも気を取り直しもう一度やったらやっぱりだめで、全く役に立たなかったですよ。
一般的な方法ならチャットボットとヘルプで十分だよ。

で電話で問い合わせたら日本語片言のソンさんという担当者がサラリと解決。
ソンさんありがとう！
App Engine flexible envやCloud Buildで急にAccess deniedエラーが出るようになった時の対処法

## 問題

AppEngine flexible envにデプロイするCIがある日突然動かなくなった。

error:

```
dcea095086d3: Preparing
2c6ec70e1145: Preparing
570eafc8e26b: Preparing
8ef09bc7d360: Preparing
9c3db3b4aab6: Preparing
d313273b6130: Preparing
3516cac9e9b0: Preparing
d0eb32e04cdd: Preparing
0f3e87d2943a: Preparing
1ba6a3ca6c41: Preparing
d2588c27d938: Preparing
6b6e43b44148: Preparing
17bdf5e22660: Preparing
d37096232ed8: Preparing
6add0d2b5482: Preparing
4ef54afed780: Preparing
d313273b6130: Waiting
3516cac9e9b0: Waiting
d0eb32e04cdd: Waiting
0f3e87d2943a: Waiting
1ba6a3ca6c41: Waiting
d2588c27d938: Waiting
6b6e43b44148: Waiting
17bdf5e22660: Waiting
d37096232ed8: Waiting
6add0d2b5482: Waiting
4ef54afed780: Waiting
denied: Access denied.
```

## 対処法
[公式ドキュメント](https://cloud.google.com/cloud-build/docs/securing-builds/set-service-account-permissions?hl=ja#troubleshooting)にある通り一旦Cloud Build APIを無効にしてから再度有効にすると動くようになった。

## 参考
- [公式ドキュメント](https://cloud.google.com/cloud-build/docs/securing-builds/set-service-account-permissions?hl=ja#troubleshooting)
- [Builder Permission denied. Unable to deploy on Google cloud - Stack Overflow](https://stackoverflow.com/questions/51346677/builder-permission-denied-unable-to-deploy-on-google-cloud)
LANケーブルについて、細いのとか固いのとかあるので調べてみた

## LANケーブルについて、細いのとか固いのとかあるので調べてみた

- ふと思いました。

```
サーバのラッキングをする機会はたまにあるけど、
LANケーブルにも硬かったり柔らかかったり細かったりするけど何が違うのかな？
```

## いろいろな種類

- 通信の速さ : LANケーブルの通信規格
	数字が大きくなるにつれて通信速度が早くなります。
	- CAT5 : 100Mbps
	- CAT5e : 1Gbps
	- CAT6 : 1Gbps
	- CAT6A : 10Gbps
	- CAT7 : 10Gbps
	- CAT8 : 40Gbps
普段使いをするなら、 `CAT6` , `CAT6A`でしょうか？

- ノイズへの耐久性 : ケーブル内のシールドの有無
	ノイズに強いのか、発生しやすいのかの違いになります。
	- UTP(Unshielded Twist Pair cable)
		- 価格が安いが ・ ノイズへの耐久性は高くない
	- STP(Shielded Twist Pair cable)
		- 価格は高いが ・ ノイズへの耐久性は強い
		- 芯線をアルミで保護
	※これに関してはケーブルを見分けることはできないが
		一般的に
		- CAT5-CAT6A : UTPが多い
		- CAT7-CAT8 : STP

- 通信の安定性 : 芯線の種類
	- 単線
		- 1本の太い銅線で構成
		- より線に比べて通信の安定性は高くなる
		- ケーブルが固い
		- 20m以上のケーブルは安定性が低下するので単線がおすすめ
	- より線
		- 7本程度の細い銅線で構成
		- 単線に比べて安定性は低下するが、家庭でのレベルだと気にしないかも
		- ケーブルが柔らかい
		- 20m未満でケーブルを折り曲げて敷設する場合におすすめ

- 伝送損失の防止 : 十字介在の有無
	- 十字介在があることにより、ケーブル同士が近くなることを防ぐ
		- → 干渉ノイズの防止
		- → 伝送信号の漏れ防止

## 私的考察

※私的考察なので、必ずしも↓のわけではないです。
もちろん、CAT6でも固いLANケーブルは存在します。

- `柔らかいLANケーブル`の傾向
	- UTPが多く、ノイズへの耐久性は高くない
	- CAT6までの通信規格が多い
	- 20m未満で安定性は低下するが家庭で使用するレベルだと大丈夫
- `固いLANケーブル`の傾向
	- STPが多く、ノイズへの耐久性は高い
	- 十字介在が入っていることもある
	- CAT7,8の通信規格が多い
	- 通信への安定性は高い

## 参考

- [通信速度で選ぶ！LANケーブルの種類とおすすめの選び方](https://koneta.nifty.com/koneta_detail/170822000354_1.htm)
- [LANケーブル　Cat6とCat5eの中身を見てみよう！](https://haisenrescue.com/blog/lan%EF%BD%B9%EF%BD%B0%EF%BE%8C%EF%BE%9E%EF%BE%99%E3%80%80cat6%E3%81%A8cat5%E4%B8%AD%E8%BA%AB%E3%82%92%E8%A6%8B%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86/)
IFTTTを使ってDiscordにツイートを通知してくれるBOTを作ってみる

#前置き
今回は特定のアカウントがツイートをするとDiscordに通知するBOTを作ります。

#準備(Discord)
まず、Discordのチャンネルで使うWebHookを用意します。
![qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/7e730969-455e-fefa-c330-549c70d1bc01.png)
この歯車マークから連携サービス→ウェブフックの順で進み、新しいウェブフックでBOTを作り、ウェブフックURLをコピーでリンクを取得します。
#準備(IFTTT)
次にIFTTTで作業を行います。
IFTTTのCreate→If ThisのAddをクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/201ccc16-86af-a2f4-e931-06485a127db2.png" width=70%>
Twitterを検索して`New tweet by a specific user`を選択します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/af3122dc-5318-c31f-87d7-0da3b1dbdefa.png" width=50%>
選択したら`Username to watch`にツイートを取得したいアカウントのユーザー名を入れてCreate triggerを押して追加します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/afd75e8a-0452-fd6c-9535-a7057f41f7f0.png" width=70%>
追加できたら、Then ThatのAddをクリック、Webhooksを検索し、`Make a web request`を押します。
WebHookの設定画面が出たら、URLにDiscordで取得したURLをペーストします
MethodはPOST
Content Typeはapplication/json
Bodyに

```json:body
{
"content":"🐦{{CreatedAt}}\n{{LinkToTweet}}"
}
```
と入力します。
入力が終わったら、Create actionを押します
Continueを押してFinishを押したら完成です
#完成
しばらく待つか、設定のCheck nowを押すことでDiscordにツイートが表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/ac48e276-0266-387f-8154-d11df328c305.png" width=80%>
お疲れ様でした。

#おまけ
Twitterの部分をTimeに変更することで、特定の時間にメッセージを通知してくれるBOTを作ることも可能です。
Data&Timeを選択して、通知を行いたい頻度を選択します。
今回は、`Every day at`を選択して毎日午前0時15分になると通知するように設定してみます。
頻度を選んだらTwitterの時と同じように、Then Thatを押して、WebHooksを選択します。
Body以外はTwitterと同じ設定です。

```json:body
{
"content":"0時15分になりました。" #ここにメッセージを入力します
}
```
Continue→Finishで完成です。
Spacemacsでdirenvを使う

Spacemacsでcider-jack-inしてそのままREPL上でAPIサーバ立ててしまう言語もあるんだけどなんか環境変数使えてんのかなコレって思ったらどうも素では[direnv](https://github.com/direnv/direnv)に対応してないらしかった。まあそれはそうか

`.spacemacs`に設定追加すればいけたので安心した

```emacs-lisp:.spacemacs(抜粋)
...

   dotspacemacs-additional-packages '(direnv)

(defun dotspacemacs/user-config ()

  ;; direnv対応
  (use-package direnv
    :demand t
    :config
    (direnv-mode)
    (setq direnv-always-show-summary nil)
    :hook

  )
)

...
```

> Unfortunately direnv is not integrated in Spacemacs yet, but you can add direnv to dotspacemacs/additional-packages and

>   (use-package direnv
    :demand t
    :config
    (direnv-mode)
    (setq direnv-always-show-summary nil)
    :hook
    ((prog-mode) . direnv-update-environment))

> to your dotspacemacs/user-config. Then download direnv binary in directory within your PATH, drop correspondent hook to your shell config, then echo 'layout pipenv' >> .envrc in you project root (where Pipfiles resides) and Voila!

cf. https://gitter.im/syl20bnr/spacemacs?at=5cf2834bff3f016baa88b760


Layer作るならコレみたいな話もあるみたい。

cf. https://github.com/syl20bnr/spacemacs/issues/2294#issuecomment-641484265

先人ありがとナス！てか早くdirenv Layer作って、どうぞ
DBeaverでクエリー結果をTSV形式で出力

DBeaverでは、クエリー結果をいろいろな形式で出力できる。
だが、CSV形式は選択肢にあるのにTSV形式がない。

と、思ったがCSV形式の設定を変更すればTSV形式でも出力できたので、その手順をメモ。

# 手順

## クエリからエクスポート

SQLエディタで右クリックしコンテキストメニューを開く。
`実行する` > `クエリからエクスポート` を選択。

カーソルがSQLの末尾にあると、なぜか `クエリからエクスポート` を選択できないので注意。

![export_from_query.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/eaa96a9f-a9f4-05f0-6a4b-6f45915a91ee.png)

## データ転送のターゲットタイプとフォーマット

ここで `CSV` を選択。
次へ。

![export_to_csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/29fe6175-e4e5-1f24-6b2b-5d6fdf2f0ebc.png)

## エクスポータ設定

ウィンドウ右下のエクスポータ設定で `ファイル拡張子` と `デリミタ` の設定を変更する。
その他の設定もお好みで。

- **ファイル拡張子**
`csv` を `tsv` に変更

- **デリミタ**
`,` を `\t` に変更

次へ。

![exporter_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/cbb02a40-f34b-041a-8e2f-7d63838b2767.png)

内容を確認して、問題なければエクスポート開始。

# バグ？

エクスポータ設定を変更しているとキーのほうがおかしくなったが、再起動で直った。

![export_settings_bug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/0ac37ce3-015e-7e91-7ee4-f6fcb7a8afe6.png)
CSSだけで幅を自動調整できる、横並びナビゲーションメニューの作り方

# どうも7noteです。jsを使わなくても個数に合わせて自動で幅が調整されるメニューを作ります。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/autonavi/
[MockDate]テストの時に日付を固定化する方法[JavaScript]

## 背景

Jestでテストを書いている時に日付の固定化をしたかったのですが、
今まで以下のような感じで、`Date.new`をmock化していましたが、書くのがめんどくさいなって思ってました。
https://qiita.com/bearII/items/d8a3bc0e83b14b36e64e

## 結論
以下のパッケージが良さげでした。
https://www.npmjs.com/package/mockdate

以下のように1行でモック化できてテストファイルがスッキリします。
before内でモック化し、after内でモックを解除するだけです。
momentもモックできているのが確認できます。


```javascript
import MockDate from 'mockdate'
import moment from 'moment'

describe('mock date', () => {
  beforeEach(() => {
    MockDate.set('2000-11-22')
  })
  afterEach(() => {
    MockDate.reset()
  })
  it('new Dateがmock化されていることを確認', () => {
    expect(new Date().getFullYear()).toBe(2000)
    expect(new Date().getMonth()).toBe(10)
    expect(new Date().getDate()).toBe(22)
  })
  it('momentがmock化されていることを確認', () => {
    expect(moment().format('YYYY-MM-DD')).toBe('2000-11-22')
  })
})
```
配列からランダムに値を取得したかった in sql

タイトルの日本語がしっくりきてないのですが、以下のようなテーブルをつくりたかったです。


| フルーツ |
|:-:|
|  apple |
|  banana |
|  orange |
|  orange |
|  banana |


🍎と🍌と🍊が適当に並んでいます。

```sql
select * from (
  select 'apple' 
  union all select 'banana'
  union all select 'orange'
) tmp 
order by rand()
limit 1;

/* => banana
```

これで、🍎か🍌か🍊のどれかひとつが取得できます。

データの作成は procedure で書いてみます。

```sql
delimiter //
create procedure insert_fruits(in x int)
begin
  declare i int default 0;
  while i < x do
    insert into fruits values (
      (select * from (
         select 'apple' 
         union all select 'banana'
         union all select 'orange'
      ) tmp order by rand() limit 1)
    );
    set i = i + 1;
  end while;
end
//
delimiter ;
call insert_fruits(100);
```

おわり🍋


# おまけ

以下のようなクエリの速度差を見てみたかったです。

```sql

/* join */
select SQL_NO_CACHE f1.name, f2.cnt from fruits f1
inner join (select name, count(*) as cnt from fruits group by name) f2 on f2.name = f1.name;

/* 相関サブクエリ */
select SQL_NO_CACHE *, (select count(*) from fruits f2 where f2.name = f1.name) as cnt from fruits f1;

/* window 関数 */
select SQL_NO_CACHE *, count(*) over (partition by name) as cnt from fruits;
```
Atomic DesignとNuxt

## はじめに
Nuxtでポートフォリオを作っているとかなりコードがとっ散らかっていたり、コンポーネントをうまく活用できていない気がしてきました。そこで他の人のリポジトリを見てみると、Componentディレクトリの中になにやら「Atoms」やら「Organisms」というフォルダがあり、その中に大量のファイルがしまわれ、pagesで描画される形をみかけ、「なんじゃ、こりゃ」となったので調べてみると「Atomic Design」なるもののよう。調べたことをまとめてみました。

## この記事の対象
・Nuxtでのアプリ開発をしたい or している人

## Atomic Designとは？
Atomic Designは、Brad Frost氏が考案したデザイン設計手法の一つです。Atomic Designは、少し調べれば幾つもの良質な記事が見つかりますし、氏の[公式サイト](https://atomicdesign.bradfrost.com/)には実に詳細な説明があります。が、一度ここでもまとめてみます。

### 5つの段階
Atomic Designは5つの異なる段階が連携することから成るデザイン設計です。その5つは
　- Atoms(原子)
　- Molecules(分子)
　- Organisms(生物)
　- Templates(テンプレート)
　- Pages(ページ)
です。
![The atomic design ](https://atomicdesign.bradfrost.com/images/content/atomic-design-process.png "The atomic design ")

この5つの段階を詳しく見ていきます。
#### Atoms(原子)
Atomic Designにおける最小単位です。この段階には、フォームラベル、ボタンなどのこれ以上分解できない基本的なHTML要素が含まれます。
![The atomic design ](https://atomicdesign.bradfrost.com/images/content/atoms-form-elements.png "The atomic design ")

#### Molecules(分子)
この段階では、AtomとAtomを組み合わせて、一つの機能を持つMoleculesという要素になります。例えば、入力フォームと検索ボタンを組み合わせて、検索用のフォームとすることができます。
![The atomic design ](https://atomicdesign.bradfrost.com/images/content/molecule-search-form.png "The atomic design ")
#### Organisms(生物)
Moleculesが、Atomを2つ以上組み合わせて出来上がるように、OrganismsはMoleculeとMoleculeを組み合わせることで出来上がります。例えば、サイトのヘッダーは代表的なOrganismsの例です。ヘッダーは検索フォームやロゴ、各ページへ飛ぶナビゲーションから成り立ちます。
![The atomic design ](https://atomicdesign.bradfrost.com/images/content/organism-header.png "The atomic design ")
#### Templates(テンプレート)
テンプレートは、コンポーネントをレイアウトに配置し、具体的なサイトのデザインを形作ります。つまり、ページの骨格であり、ここにイメージや文章を挿入することで、ようやく最終段階、Pages(ページ)となります。
![The atomic design ](https://atomicdesign.bradfrost.com/images/content/template.png "The atomic design ")
#### Pages(ページ)
テンプレートに画像や文章を流し込むことで最終的に出来上がるもの、それがPagesです。実際にユーザーが目にするもので、コンテンツの動的な性質を反映します。動的な性質というのは、例えば、同じTemplatesであっても、管理者ユーザーと一般ユーザーが表示が異なる場合がある、などのことです。
![The atomic design ](https://atomicdesign.bradfrost.com/images/content/page.png "The atomic design ")
## ディレクトリ構造
```vue:Component
src
└── components
    └── atoms 
　　　　　└── Btn.vue
         └── Logo.vue
    └── molecules
         └── Form.vue 
    └── organisms
         └──Header.vue
    └── templates
└── pages
```
Nuxtのディレクトリ構造は次のようなものになります。
## メリット
Atomic Designを取り入れることにより、どのようなメリットがあるでしょうか？それは次のような点です。
### 変更に強い
Atomic Designは、ページ全体の変更に対しても、各ボタンのような小さな変更に対しても柔軟に対応することができます。それは、Atomic Designの各段階が分離されている面もあり、必要な部分では絡み合っているからです。

### あらゆるインタフェースに適用できる
作者のBrad Frost氏はウェブデザイナーであり、Atomic Designはウェブからコンセプトを得て生み出されましたが、このデザイン設計手法はウェブだけではなくあらゆるインタフェースに対して適用できる手法です。アトミックな設計手法は、Microsoft Word、Keynote、Photoshop、銀行のATMなどなど、公式サイトではInstagramを例にあげて説明もされています。


##　終わりに
Nuxtらしいコードやディレクトリの使い方をするにはどうしたら良いのかと探っているうちにAtomic Designをしれたのは幸運でした。Atomic Designという名前は作者の高校時代の化学授業から着想を得て命名されたもので、そのためか公式サイトではたびたび化学と結びつけて説明されています。公式のドキュメントも面白おかしく書かれていて読みやすく、Atomic Designについて、ここで説明した概要以外にも「では、どうすれば実現できるのか？」という部分までしっかり書かれています。時間の都合上まとめれなかったのが残念ですが..。
　ここまで読んで頂きありがとうございました。ポートフォリオを作る中で、モヤモヤした部分が解消されたので、折角なので文字に起こした次第です。では、また！
javascript関数ドリル　初級編takeRight関数の実相のアウトプット

##takeRight関数の課題内容
　　　↓
https://js-drills.com/blog/takeright/

##take関数の取り組む前の状態
takeの逆なので簡単だと思っていた

##take関数に取り組んだ後の状態
- (1 + i)ここの部分の理解が少し追いつかなかったです。

##tail関数の実装コード（答えを見る前）
実行できなかった


##tail関数の実装コード（答えを見た後）

```js
function takeRight(array, n = 1) {
  if(n === 0) {
    return [];
  }
  if(n > array.length) {
    return [...array];
  }

  const takenArray = [];
  for(let i = 0; i < n; i++) {
    // array [1, 2, 3]
    // 1 + i => 1, 2, 3
    // array.length =>
    //   3 - (1 + 0) = 2,
    //   3 - (1 + 1) = 1
    //   3 - (1 + 2) = 0
    const indexFromRight = array.length - (1 + i)
    takenArray.unshift( array[indexFromRight] );
  }

  return takenArray;
}

console.log( takeRight([1, 2, 3]) );
// => [3]

console.log( takeRight([1, 2, 3], 2) );
// => [2, 3]

console.log( takeRight([1, 2, 3], 5) );
// => [1, 2, 3]

console.log( takeRight([1, 2, 3], 0) ) ;
// => []
```
MTTR(Mean Time To Repair)を短くする施策

応用情報技術者平成29年秋期 午前12


MTBFを長くするよりも，MTTRを短くするのに役立つものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/1faafc89-259a-330a-02ce-a3aac72560e8.png)


１、MTTR(Mean Time To Repair)は、システムの障害から回復するために要した平均修復時間です。
MTTRを短くする施策には、
　・エラーログの取得、
　・命令トレース機能、
　・遠隔保守、
　・保守部門の分散配置など
があります。

・エラーログには
障害原因に関連する情報が記録されていることがあります。障害発生時にエラーログを分析することは、障害原因を迅速に特定する手段として有効です。このためエラーログ取得機能はMTTRを短くするのに役立ちます。

・命令トレース　instruction tracing 
命令トレースとは、デバッグ／監視やデバッグ／監視などの分野において活用されるキーワードである

・遠隔保守とは 
保守（対象の機器やシステム等が不便なく使えるように維持管理すること）の形態のひとつ であり 現地には行かないで、遠隔操作であれやこれやと作業をするやり方の保守のこと です。


２、MTBFとは、Mean Time Between Failureの略称です。 
日本語で平均故障間隔を意味し、システムや機器の信頼性を表す指標となる数値です。 MTBF=稼動時間/故障回数で算出され、MTBFの値が大きければ大きい程、故障間隔が長く信頼性が高いと言えます。

参照：
https://www.ap-siken.com/kakomon/29_aki/q13.html
javascript関数ドリル　初級編take関数の実相のアウトプット

##take関数の課題内容
　　　↓


##take関数の取り組む前の状態
大体作る前からどうすればいいかわかっていた

##take関数に取り組んだ後の状態
自力でできた

##tail関数の実装コード（答えを見る前）

```js
function take(array, n = 1) {
  if(n === 0) {
    return [];
  }
  if(n > array.length) {
    return [...array];
  }

  const takenValues = [];
  for(let i = 0; i < n; i++) {
    takenValues.push( array[i] );
  }

  return takenValues;
}
```

##tail関数の実装コード（答えを見た後）

```js

function take(array, n = 1) {
  if(n === 0) {
    return [];
  }
  if(n > array.length) {
    return [...array];
  }

  const takenValues = [];
  for(let i = 0; i < n; i++) {
    takenValues.push( array[i] );
  }

  return takenValues;
}

console.log( take([1, 2, 3]) );
// => [1]

console.log( take([1, 2, 3], 2) );
// => [1, 2]

console.log( take([1, 2, 3], 5) );
// => [1, 2, 3]

console.log( take([1, 2, 3], 0) );
// => []
```
高位合成言語　synthesijer

# 概要

vistaでsynthesijerやってみた。

# 環境

windows vista 32bit
java v1.8
jdk v1.8

# インストール

以下をダウンロードして展開。
synthesijer_20160511.jar
synthesijer_lib_20160511.zip
synthesijer_extra-libs_20160511.zip

# サンプルソース


```
public class led extends Thread {
	counter c = new counter();
	public boolean flag = true;
	public void run() {
		while (true)
		{
			c.up();
			if (c.counter == 100) 
			{
				c.clear();
				flag = !flag;
			}
		}
	}
}
```

# コンパイルbat


```
set PATH=C:\Program Files\Java\jdk1.8.0_66\bin\;%PATH%
set SYNTHESIJER_VERSION=20160511
set SYNTHESIJER=c:\synthesijer\synthesijer_%SYNTHESIJER_VERSION%.jar
set SYNTHESIJER_LIB=c:\synthesijer\synthesijer_lib_%SYNTHESIJER_VERSION%
set SYNTHESIJER_EXTRA_LIB=c:\synthesijer\synthesijer_extra-libs_%SYNTHESIJER_VERSION%
java -cp %SYNTHESIJER% synthesijer.Main --verilog led.java counter.java Firefly.java

```

# テストベンチを書く


```
module test();
	reg clk = 0;
	reg rst = 1;
	reg flag_in = 0;
	reg flag_we = 0;
	reg run_req = 1;
	reg start_req = 1;
	reg join_req = 0;
	reg yield_req = 0;
	wire flag_out;
	wire run_busy;
	wire start_busy;
	wire join_busy;
	wire yield_busy;
	led s(.clk(clk), .reset(rst), .flag_in(flag_in), .flag_we(flag_we), .flag_out(flag_out), .run_busy(run_busy), .run_req(run_req), 
			.start_busy(start_busy), .start_req(start_req), .join_busy(join_busy), .join_req(join_req), .yield_busy(yield_busy), .yield_req(yield_req));
	initial
	begin
		#10
			rst = 1;
		#10
			rst = 0;
		#20000
			$finish;
	end
	always
	begin
		#1
			clk = ~clk;
	end
	initial
	begin
		$dumpfile("test.vcd");
		$dumpvars(0, test);
	end
endmodule





```

# iverilog実行結果


![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/63310435-468a-d6ec-ab5b-59c4b89bc85e.jpeg)


以上。
pythonでスゴロクゲームと足し算ゲーム



同じ変数への代入等あり

テキストにあった内容を使ってpythonの挙動確認と備忘録

# 30までの交互スゴロクゲーム

```python
pl_pos = 1
com_pos = 1

while True:

    input("enter-playerが動く")
    pl_pos = pl_pos + random.randint(1,6)
    
    if pl_pos>30:
        pl_pos = 30
        
    banmen()
    
    if pl_pos ==30:
        print("plのかち")
        break
        
    input("enter-comが動く")
    com_pos = com_pos + random.randint(1,6)
    
    if com_pos>30:
        com_pos = 30
        
    banmen()
    
    if com_pos ==30:
        print("comのかち")
        break
```

#足し算ゲーム

```python
A = random.randint(1,100)
B = random.randint(1,100)

correct = A + B

ans = input("A = "+ str(A) + " B = "+str(B) +" A+Bの合計は？")
if ans == str(correct):
    print("正解")
else:
    print("違います" + str(correct) +"です")
```

#以上

[Pythonでつくる ゲーム開発 入門講座](https://www.amazon.co.jp/Python%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B-%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA-%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-%E5%BB%A3%E7%80%AC-%E8%B1%AA/dp/4800712394)より