OmniAICreator/Qiita-1.07M huggingface dataset:
Windowsコマンドプロンプトでbashのsourceのようなことをする

# 動機

一時的な環境変数の設定やPATHの変更などをしたいときがある。
普段はLinuxやmsys2などでbash、zshなどを使っているので、ファイルに`export VAR=***`などと書いて`source`コマンドで読み込む、といったことをしている。

Windows上でコマンドプロンプトを使って同じようなことをしなければいけないことがあったので自分用にメモ。

# 解法

- `call`コマンドが一番やりたいことに近そう

### 実践例

- 読み込み用のファイルを用意
    - 簡単な例（で自分がやりたかったこと）として、`set`コマンドで一時的な環境変数の設定・変更を行う

```cmd:set_envs.bat
@echo off
set TEST_ENV_VAR1=foo
set TEST_ENV_VAR2=bar
set TEST_ENV_VAR3=1
set PATH=%PATH%;C:\path\to\bin
@echo on
```

- コマンドプロンプト上で読み込み

```cmd
call set_envs.bat
```

- 確認

```bash
echo %TEST_ENV_VAR1%
# foo

echo %TEST_ENV_VAR2%
# bar

echo %TEST_ENV_VAR3%
# 1

echo %PATH%
# （元々のPATH）;C:\path\to\bin
```
あるいは、環境変数の一覧を出力する`env`コマンドを使って

```bash
env
# （・・・）
# PATH=（元々のPATH）;C:\path\to\bin
# （・・・）
# TEST_ENV_VAR1=foo
# TEST_ENV_VAR2=bar
# TEST_ENV_VAR3=1
# （・・・）
```

のようにして、意図通りに環境変数などを設定出来ていることを確認出来る。
コントロールパネルなどから設定した時と異なり一時的なものなので他の関係ないプロセスには影響が無い。
（実行したコマンドプロンプトのプロセスとそのサブプロセスでのみ有効）

# 参考

- https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/call
- https://www.k-tanaka.net/cmd/call.php
- https://qiita.com/tomotagwork/items/5b9e08f28d5925d96b5f
- https://wa3.i-3-i.info/word11925.html
【iOS】Pythonista3でGIFアニメを分解する。

# はじめに
以前、[GIFアニメでハマった記事](https://qiita.com/maboy/items/17816eda284d1fefd5e5)を書きましたが、その時に調べたなかで**GIFアニメの分解**に興味があったので作ってみました。

# GIFアニメを分解する
これは**PIL**の中の**ImageSequence**でできました。
ついでに、iOSの共有シートから呼び出す仕様にしました。

```python:gif2png
import appex
import console
import photos
import tempfile
from PIL import Image
from PIL import ImageSequence

def main():
	if not appex.is_running_extension():
		console.hud_alert('共有シートから実行して下さい。',icon='error',duration=2)
		return

	FilePath = appex.get_image().filename
	if not FilePath:
		console.hud_alert('GIFイメージが見つかりません。',icon='error',duration=2)
		return

	gif = Image.open(FilePath)
	for i,img in enumerate(ImageSequence.Iterator(gif)):
		SaveName = tempfile.gettempdir()+'/tmp.png'
		img.save(SaveName)
		photos.create_image_asset(SaveName)

	console.hud_alert(str(i+1)+'枚の画像を写真に保存しました。', icon='success', duration=2)
	appex.finish()

if __name__ == '__main__':
	main()
```

**Pythonista3**の**Share Extension Shortcuts**に登録して使います。
[【iOS】Pythonista3で共有シートを使う。 - Qiita](https://qiita.com/maboy/items/9e41a76da5ddf301574e)

### 使い方
**Pythonista3**がンストールされてると、写真アプリ等から**共有メニュー**アイコンをタップすると**Run Pythonista Script**というメニューが表示されます。
ここをタップして、あらかじめ登録しておいたスクリプトのアイコンをタップするだけです。
![7C39C630-454F-48B3-924A-FF17ADFEFAAD.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280129/044f2d93-7669-3991-fde8-de61c1041f77.gif)

[iPadで操作してる動画](https://twitter.com/maboysan/status/1293787038429270016?s=21)
Railsでslickを用いてスライドショーを実装する方法(一枚ずつ & 複数枚ずつ)

Railsアプリケーションにてslickでスライドショーを実装する方法をご紹介いたします。

# 環境
- Ruby 2.5.7
- Rails 5.2.4

# 前提
- postsテーブルのimageカラムの画像を使用し、スライドショー実装
- 画像はrefileを利用している
- 以下のようなスライドショーを実装します。
![スライドショー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654387/415a429c-1b77-2862-772b-e1208217ea5c.gif)


# slickの導入
head内とスライドショーを実装したいhtmlファイルにそれぞれ以下を記述

```html:application.html.erb
<head>
  <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/>
  <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick-theme.css"/>
</head>
```

```html
<script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
```

# アプリケーションへの記述
### HTML
スライドショー実装したいhtmlファイルに以下を記述

```html
<div id="slider">
  <% @posts.each do |post| %>
    <%= attachment_image_tag post, :image, :fill, 1200, 800, format: "jpeg" %>
   <% end %>
</div>
```

### js

```javascript:application.js
$(function() {
  $('#slider').slick({
      dots: true, //スライドの下にドットのナビゲーションを表示
      autoplay: true, //自動再生
      autoplaySpeed: 4000, //再生スピード
  });
});
```

### css
スライドの次、前ボタンの位置を調整

```css:application.css
.slick-next {
	right: 10px !important;
	z-index: 100;
 }

.slick-prev {
	left: 10px !important;
  z-index: 100;
 }
```
これで完成です。

# 複数枚ずつのスライドの場合
![スライドショー２.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654387/1aa431ff-83f7-6d03-d974-b0f766edd6b6.gif)
上記のような複数枚のスライドを作る場合、jsの記述を少々変更します。

### js
```js:application.js
$(function() {
  $('#slider2').slick({
      autoplay: true,
      autoplaySpeed: 4000,
      slidesToShow: 3, //表示するスライドの数
      slidesToScroll: 3, //スクロールで切り替わるスライドの数

      //レスポンシブ対応させたい場合は以下も記述
      responsive: [{
        breakpoint: 768, //画面幅768pxで以下のセッティング
        settings: {
          slidesToShow: 2,
          slidesToScroll: 2,
        }
      }]
  });
});
```

# 参考記事
https://www.jungleocean.com/programming/190201jquery-slick
【JS】【jQuery】動的に追加した要素にもイベント処理をする方法

クリックイベントをググると`click()`で簡単にできます、的な記事が出てきますが
`click()`だと動的に追加された要素にイベントがセットされない、ということに触れていないものが意外と多い気がしたので書いてみます。

##やいたいこと

「アラートを表示」をクリックでアラートを表示して
「アラートを追加」をクリックでdiv#boxの最後にアラートを追加します。

```html:index.html
<div id="box">
  <p>アラートを表示</p>
</div>

<button>アラートを追加</button>
```

##click()でイベント追加

click()を使ってイベントを設定します。
自分は今までなぜかこれだけでやってこられました笑

```javascript:alert.js
$('button').click(function() {
    $('#box').append('<p>アラートを表示</p>');
})

$('#box p').click(function() {
    alert('アラートです');
})
```

ボタンクリックで要素が追加されるようになりましたが、追加した要素をクリックしてもアラートが出ません。
あとから追加された要素にはクリックイベントが設定されていないからです。

##on()でイベント追加

on()を使ってイベントを設定します。

```javascript:alert.js
$('button').click(function() { //同じ
    $('#box').append('<p>アラートを表示</p>');
})

$(document).on("click", '#box p', function () { //onで設定
  alert('アラートです');
}
```

これで、あとから追加された要素にもイベントが追加されるようになりました。

##click()とon()の違い

`click()`は指定された属性にイベントが設定されるのに対して
`on()`はすべてのクリックに反応して、それが指定属性かどうか判別する
という違いがあります。

##on()の使い方

###イベントを設定
click以外にも`change` `load` `resize` `scroll` などなどのイベントも設定できます。

###複数イベントを設定
複数のイベントを設定することもできます。
むしろこのメリットのほうが大きいかもしれません。

```javascript
$(document).on("click scroll", 'div', function () {
  //処理
}
```

**参考**
https://www.sejuku.net/blog/38774
Webページの表をExcelの表にきれいに貼り付けたいとき

Excelに持っていきたいWebページの表の左上から右下までマウスで選択してコピー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21645/4b7713d5-68ad-7725-5b47-6280ae9ada12.png)

それをExcelにペーストすると、きれいにセルにデータが入った状態で貼り付けられる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21645/3345d993-100c-2b09-bc04-4060298a9630.png)

ハイパーリンクや文字装飾もコピーされてしまうので、それが邪魔な場合は「形式を選択してペースト → 値」をすればよい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21645/bdc826e8-c882-e98a-cf66-936f98219c0c.png)

Spreadsheetでも行けると思う。
AWS で HTTPS 化したら WebSocket が 60秒で切断されるようになった

AWS で HTTPS 化したら作ったチャット機能の通信がすぐ切断されるようになった…

1分間くらい何もしないと切断。

ロードバランサーの設定が原因のようです。

アイドルタイムアウトの設定がデフォルトで60秒のため、何もしないと60秒で WebSocket は切断されます。

そこで設定変更。


1.AWSのコンソールから「EC2」→「ロードバランサー」
![キャプチャ001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666395/5bb0ac81-fc69-0d48-f0f3-0b282cf38df6.png)

2.「属性の編集」でアイドルタイムアウトの値を60秒から切断されたくない時間に変更
![キャプチャ002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666395/9504a1c8-bdd5-cc44-cfb5-4404a1a98ef5.png)

3.完了。
![キャプチャ003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666395/f046bf69-7cf7-6c07-d830-86b4a9381427.png)

これで設定した時間までは切断されません。
Wordpress を Nginx で使っていてパーマリンクが使えなくなった時の解決方法

パーマリンクを使っているページに行こうとすると、次のエラーが出ました。
![wordpress_nginx_permalink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/0b9afe0e-6803-12e5-a6be-9b1da73ebd81.png)

この解決方法です。

```text:/etc/nginx/sites-available/default
（省略）
	location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		try_files $uri $uri/ /index.php?$args;
#		try_files $uri $uri/ =404;
	}
（省略）
```

振り返って、こうなっった原因を考えると、Ubuntu 19.10 から 20.04 へのアップグレードでした。
元の設定ファイルが、default.dpkg-old にリネームされ、新しく default が出来ていました。
Snowflake(無料評価版)を触ってみる - 2

# Snowflake(無料評価版)を触ってみる - 2

## ウェアハウス作成

- ウェアハウスに関しては[公式](https://docs.snowflake.com/ja/user-guide/warehouses.html)を参照。

- 「ウェアハウス」を選択し、「作成」をクリック
![2020-08-13-14-36-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/7e44128d-1d74-99cf-265b-684f9ae43101.png)
![2020-08-13-14-58-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/74e71ae3-93a3-56f2-f5b0-d1bfca8ce99d.png)

## データベース作成

- 「作成」をクリックすると以下ウィンドウが表示される。
![2020-08-13-14-00-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/b9b3a0a2-13f9-5281-6c2d-15d4cb795049.png)
![2020-08-13-14-01-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/8bcbc1c6-7f3e-27e3-b13f-9c32b8351021.png)

- 掘り進んでいくと、テーブル等の情報も確認できる

- データベースと同様にテーブルも作成できる
![2020-08-13-14-03-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/2c5072e6-9e84-c9e5-87c1-fb894311e7fe.png)

- もちろんSQLでDBやテーブルの作成も可能
![2020-08-13-14-08-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/462bd387-2b64-1153-6c95-e1014e065755.png)

- CSV等のファイルをテーブルにロードすることも容易

  - 「データをロード」をクリック。指示通りに進めれば取り込み完了。
![2020-08-13-15-32-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/9d4a976a-d1e3-7668-7647-539d4eef7a9d.png)
![2020-08-13-15-32-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/0ffce22c-88d5-7d00-67cb-43b74dc9e0fc.png)
![2020-08-13-15-34-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/db414cb0-78e4-2f53-087f-1f44ca7683fa.png)
![2020-08-13-15-35-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/0917972a-82de-d490-ffd2-2af293b97bc7.png)
![2020-08-13-15-36-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/7f013512-5dec-4ad0-507f-31a9c2feab0a.png)
![2020-08-13-15-36-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/a15f4da8-9282-3822-6268-f3713d70e6a1.png)

## 権限の付与

- 各種オブジェクトの権限付与は容易に可能

- オブジェクト行を選択すると自動的に画面右側に権限付与のウィンドウが表示される。
![2020-08-13-14-59-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/459d71f7-674c-b3e9-b738-70c35225269d.png)

## SQLの実行

- ワークシート画面
![2020-08-13-15-28-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/141ac82d-f131-389a-6aed-b2fd42b8ae11.png)

- ワークシートはタブ形式になっており、クエリ毎にタブを作成し個別に実行が可能。
![2020-08-13-15-23-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/b3114d81-0fbe-08b6-a5f9-37db2385748e.png)

- クエリを実行する際に使用する「ロール」、「ウェアハウス」、「データベース」、「スキーマ」を確認・変更が可能。
![2020-08-13-15-27-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/6834165e-c278-e91f-3cc4-824e7ab94c32.png)

- SELECT した結果を容易にCSV, TSVとしてダウンロード可能。以下手順を実施後ダウンロードが開始される。
![2020-08-13-15-39-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/70ec88c5-5952-dbc2-cd56-f6e6b2764c85.png)
![2020-08-13-15-39-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/a538cf23-4d83-8018-178f-6e561015dad7.png)
現在日付をyyyyMMdd形式の文字列で取得する方法

現在日付をyyyyMMdd形式で取得するサンプルです。

SimpleDateFormatを使用します。
下記の形式でフォーマットを指定します。

#####SimpleDateFormat  オブジェクト名 = new SimpleDateFormat(”フォーマットパターン”)

````java
import java.text.SimpleDateFormat;
import java.util.Calendar;

		Calendar cl = Calendar.getInstance();

		//日付をyyyyMMddの形で出力する
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String str = sdf.format(cl.getTime());
		System.out.println(str);

		//日付をyyyy/MM/ddの形で出力する
		SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd");
		String str1 = sdf1.format(cl.getTime());
		System.out.println(str1);
```
Snowflake(無料評価版)を触ってみる - 1

# Snowflake(無料評価版)を触ってみる - 1

仕事でSnowflakeを弄る可能性がでてきたので(理解してないワードや概念等多いがとにもかくにも)評価版弄ってみた。

## 無料評価版の登録

[製品ページ](https://www.snowflake.com/%E8%A3%BD%E5%93%81/?lang=ja)右上にある「無料評価版」をクリック
![2020-08-13-11-05-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/e3a680e8-73e7-4b9c-1689-41b50124d33d.png)

入力事項を記入し、「次へ進む」をクリック
![2020-08-13-11-08-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/363305f3-82b1-a7e6-44ca-b0db630a18f1.png)

Editionとクラウドプロバイダー、region、電話番号を入力し「はじめる」をクリック
![2020-08-13-11-18-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/8a3664fa-1187-505f-427d-dbd17af7ac07.png)

アクティベートメールが送信されたとの画面に遷移
![2020-08-13-11-20-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/0a254e89-f68d-97fe-9386-90936d4314c7.png)

メールを確認し、アクティベートすると以下画面へ遷移
![2020-08-13-11-28-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/6e06569b-b002-95ac-eed8-aaa26a021b7a.png)

登録完了以下画面になれば完了
![2020-08-13-11-29-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/6ac9da3c-5599-0ff0-7cc6-3178d44a1f93.png)

---

## 各機能について

画面上部のメニューバーは以下画像の通り
![2020-08-13-12-39-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/29a034f4-e934-9744-c99c-7253f5b6b100.png)

### データベース

- データベース管理
![2020-08-13-12-41-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/0ed40bc0-fe6e-fefd-b3a9-4e894b84697b.png)

### 共有

- [アカウント間のDB共有管理](https://docs.snowflake.com/ja/user-guide/data-sharing-intro.html)
![2020-08-13-12-52-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/94b2b0d0-38df-b0b3-5298-62a76085811a.png)

### Data Marketplace

- 様々なデータセットを購入することが可能。評価版では試せないかな。お金かかりそうだし。
![2020-08-13-12-57-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/28b6b0a2-3a39-aed2-cccc-007053b901db.png)
![2020-08-13-12-58-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/e906a98b-e8ce-b25d-7aa8-f297067c004f.png)

### ウェアハウス

- [ウェアハウス](https://docs.snowflake.com/ja/user-guide/warehouses.html)の管理

- Snowflakeは従量課金制であり、コンピュートとストレージの使用状況に応じて金額が決まる。[ここ](https://docs.snowflake.com/ja/user-guide/warehouses-overview.html)参照。ウェアハウスサイズによって、実行時間による費用の単位が異なってくる。

- 簡単に要約すると、ウェアハウスとはコンピュートリソースのことで、クエリを実行する際の性能（クラスタの数）を自由に決めることができる。クエリによって実行に使用するウェアハウスを変更することが可能。

- 自動スケールモードをONにしてマルチクラスターウェアハウスを使用すると、ウェアハウスの負荷に応じて処理に使用されるクラスタを自動的に増減させることが可能。
![2020-08-13-13-06-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/d0b1ccd7-129f-464d-25c1-e0574c79beaa.png)

### ワークシート

- クエリを実行することができる
![2020-08-13-13-37-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/4aaafbc4-71dc-0f04-b66a-e5180aa56f26.png)

### 履歴

- クエリの実行履歴管理
![2020-08-13-13-38-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173368/8b7a5866-1e6b-cc36-b5a8-d4de85abe21a.png)
Windows + Rubyでgetsさせたときのエンコーディング

## 初投稿です
すごい小ネタだと思いますが、意外と無い情報で、長らく迷ったので。
こういうところから少しずつqiitaに参加していこうと思います。

## 悩んだこと
Windows 10 + Ruby 2.7.0 で gets させたものを表示するプログラム。

```ruby:miss.rb
str = gets.chomp
puts str
```

これだけなんですが、putsで日本語を入力するとどうしても文字化けしていました。
普段VSCodeを使っており、そのコンソールとRubyの相性なのかと思いましたが、コマンドプロンプトでもだめ。
Ruby側のエンコーディングをいじったり、ググる中でruby Ksなんて古い（廃止された）記法に惑わされたりしましたが、結局は次項のようにすると無事表示されました。

## 解決策

```ruby:correct.rb
STDIN.set_encoding "Windows-31J"
str = gets.chomp
puts str.encode("Windows-31J", invalid: :replace, replace: '')
```

つまるところ、

- Windowsのコンソール入出力のエンコードはWindows-31J
- なので、まずRubyの標準入力の文字コードをそれに合わせてやる（1行目）
- しかし、このままだと初めに意味をなさない文字がついてくるので、これを3行目の記述で落としてやる

ということ（だと思います）。

※このあと eval などに文字列を渡しても（もちろん元のstrが文法的に意味を為せばですが）ちゃんと動きました。　←本当にやりたかったのはこっち

ただこれでも完璧ではなくて、getsで全角文字が含まれると改行が上手く認識されず、Enterキーを2回押す羽目になったりします。今の所この回避策はわかりません。まあ、気にするほどの挙動ではないので、今はとりあえずこれで乗り切ってみようかと。
Androidでキーボードを非表示にする方法

## Androidでキーボードを非表示にする方法

### 背景
* 自分のメモ用です。

### 実装方法

* Kotlin

``` kotlin
// Hide the keyboard.
val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)

```
Vivado > Add Module to Block Design > Verilog: 追加可能 | System Verilog: 追加不可?

```txt:動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
PYNQ v2.5 Image
Vivado v2019.1 (64-bit)
```

### 概要

- System Verilog実装のUART RXをBlock Designに追加できない
- Verilogはできて、System Verilogは追加できないようだ


### UART RX (System Verilog)

- [verilog～UART通信受信機(RX)編～](https://keymale.xyz/2019/06/05/post-381/)
    - Keymaleの徒然草 様
    - 情報感謝です

## Add Module to Block Design

Design Sourcesに.vファイルや.svファイルを生成した後、Block Designには「Add Module to Block Design」コンテキストメニューを使用する。
上記のSystem Verilog実装を追加しようとしたが選択できなかった。

あらためて、下記の新規ファイル二種類を作成してAdd Module to Block Designメニューを確認した。

- A. Verilogファイル
- B. System Verilog ファイル


### Verilogファイル : 追加可能

Add Module to Block Designを選択できる。

![Verilog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/23a89559-5992-f462-2e4f-7d9448c4eedd.png)


### System Verilogファイル : 追加不可

Add Module to Block Designを選択できない。

![SystemVerilog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/9e7670db-a533-c95e-8dd2-1d38b9a1ee95.png)



### 関連

- [
When will SystemVerilog be supported in Block Design?](https://forums.xilinx.com/t5/Design-Entry/When-will-SystemVerilog-be-supported-in-Block-Design/td-p/974339)
    - 05-17-2019


> You are right SV files are not supported in module reference, but i guess you should be able use SV in IPI with a verilog wrapper.

これと関係しそうかな。
[rails]puma 4.3.5 トラブル対応

いつものように `rails new` したら、エラーになりました。

```
puma_http11.c:203:22: error: implicitly declaring library function 'isspace' with type 'int (int)' [-Werror,-Wimplicit-function-declaration]
  while (vlen > 0 && isspace(value[vlen - 1])) vlen--;
```

これは `puma/ext/puma_http11/puma_http11.c` で `<ctype.h>` を include してない所為です。

```
puma_http11.c:203:22: note: include the header <ctype.h> or explicitly provide a declaration for 'isspace'
```

本家の github では [Fix](https://github.com/puma/puma/pull/2073) されてました。


以下のメッセージは孔明の罠なので、無視してください。

```
Make sure that `gem install puma -v '4.3.5' --source 'https://rubygems.org/'`
succeeds before bundling.
```

[github から取ってくるという方法もあります](https://qiita.com/yaotti/items/510779877e515a1155db)が。

今回はバージョン・ダウンで対処しました。

```diff
diff --git a/Gemfile b/Gemfile
index f7e41b7..4553a44 100644
--- a/Gemfile
+++ b/Gemfile
@@ -8,7 +8,7 @@ gem 'rails', '~> 6.0.3', '>= 6.0.3.2'
 # Use sqlite3 as the database for Active Record
 gem 'sqlite3', '~> 1.4'
 # Use Puma as the app server
-gem 'puma', '~> 4.1'
+gem 'puma', '~> 4.2.0'
 # Use SCSS for stylesheets
 gem 'sass-rails', '>= 6'
 # Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
```
Fastlane での Rebuild from Bitcode オプションの付け方

### Bitcode とは？

iOS9から導入された技術で LLVM の中間言語のことを指します。以前まではコンパイルが完了しているものを Apple に提出していましたが、Bitcode を用いることで Apple 側で最適化してコンパイルを行えるようになります。

### Bitcode を用いたくない場合

基本的にアプリで Bitcode を有効にする場合は、依存しているライブラリなども全て Bitcode に対応している必要があります。そのため、Carthage などでコンパイル済みのバイナリを使用するような時にライブラリの Bitcode が有効になっていない場合はアプリを配信するときなどにプロジェクトの Bitcode を無効にする必要があります。

### Xcode から配信する場合

`Rebuild from Bitcode` のチェックボックスを外せば無効にできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/07f90d57-f661-57f0-18b4-bf6f1235561b.png)


### Fastlane から配信する場合

`export_options` に `compileBitcode` の項目を追加することで Bitcode でのコンパイルを制御できるようになります。

```fastlane
  lane :adhoc do
    match(type: "adhoc", app_identifier: "hoge.com", force_for_new_devices: true, readonly: true)
    gym(
      workspace: WORKSPACE,
      scheme: SCHEME,
      configuration: "Staging",
      export_method: "ad-hoc",
      export_options: { compileBitcode: false }
    )
    firebase_app_distribution(
              app: "hogehoge",
              testers: "hogehoge@hoge.com",
              release_notes: "Lots of amazing new features to test out!",
              firebase_cli_path: "./node_modules/.bin/firebase"
    )
  end
```

**参考**

- https://docs.fastlane.tools/actions/gym/
StatefulSet の Production 運用における Tips

# はじめに
k8sに関する記事や事例は、かなり多くなりました。
しかし、`StatefulSet` 、Databaseを自前で運用する的な情報は、少ないと思いますので、弊社の`StatefulSet` の運用について書きます。
まず、これまでの経緯と現在の構成を書きます。
システムは、オンプレをリフトシフトしました。
単純なStraight Conversionでリフトし、その後、Cloudの要素を取り込んでいく、というのがよく言われるBest Practiceだと思います。
しかし、私たちは、リフトシフトを選択しました。
k8sに乗せる、Databaseを`StatefulSet`にするというTaskが発生しました。
また、Databaseを、monolithicから数百個の`StatefulSet`に分散させたことで、逆に巨大なmonolithが誕生しました。

# ヘルスチェックは必須
ご存知の通り、Databaseは、とてもSensitiveなので、applyしたから、起動するものではありません。
私たちのシステムも例にもれず、起動（`READY`）にすることに非常に苦労しました。

- Daemonが上がっていない
- Diskのattachmentに失敗している

といったことが頻発しました。数百ある`StatefulSet`を状態を保つ、という苦悩に。
ここで、ヘルスチェックが必要になってきます。
Databaseが正常に起動しているか、起動していなければshellを起動するという感じで。
プラス、`Lifecycle`の定義をする。`postStart`で必ずdaemonを起動させる。

```yaml:statefulset
        readinessProbe:
          exec:
            command: ["sh", "-c", "/home/readness.sh"]
          initialDelaySeconds: 180
          timeoutSeconds: 2
          failureThreshold: 3
          successThreshold: 2
          periodSeconds: 60
        livenessProbe:
          exec:
            command: ["sh", "-c", "/home/liveness.sh"]
          initialDelaySeconds: 180
          timeoutSeconds: 2
          failureThreshold: 3
          periodSeconds: 60
```

```yaml:statefulset
        lifecycle:
          postStart:
            exec:
              command:
              - bash
              - "-c"
              - |
                /home/postStart.sh
          preStop:
            exec:
              command: ["sh", "-c", "/home/preStop.sh;"]
```

# 数百の`StatefulSet`をapplyする
GitOpsは、宣言的に設定することが必要です。
しかし、定期的にAdd/Deleteが発生する`StatefulSet`を宣言的に管理することは、トイルになります。
そこで、私たちは、Helm ChartsでStateな情報（数百の組織）を管理し、`StatefulSet`をジェネレートすることにしました。

1. 組織が増える
2. values.yamlに組織を追加する

という感じで。
Go言語のTemplate機能でloopする。

# Diskの容量を管理する
必要最低限の課金を目指すと思います。
その場合、Disk Fullにならないよう、bufferを考慮して、Diskをcreateする必要があります。
そこで、Prometheusの出番です。予測的に監視することができるため、閾値に入った場合、Slackに通知する。
また、GCPでは、Diskの拡張は、出来ません。従って、Diskの中身を移すため、マイグレーションのpipelineを構築する必要があります。
Argo wfも検討しましたが、ここは、runnerで対応しました。途中で中断した場合に、そこから再開できる点が大きいです。

```promql:query
kubelet_volume_stats_used_bytes{instance=~".*pool-a.*"}/1000000000
```

# BCP
ご存知の通り、CloudにおいてもIncidentは、発生します。
東京Regionが使えない、大阪Regionに移す、といったことを想定する必要があります。
ここで大きな問題になるのが、Diskです。
GCPでは、Diskは、zoneごとにcreateするため、RegionでIncidentが発生すると、別のRegionでDiskを用意する必要があります。
ここまで書いてきて、皆さんがDatabaseを`StatefulSet`を運用しない理由を納得できます。
とにかく、トイルが多い。
対策は、

- スナップショット
- Replicationする
- Object Strageに保存

になると思います。

皆さんの参考になれば幸いです。
【裏ワザ付き】一番シンプルなRailsにReactを導入する方法

Rails + React or Vueの構成は最近のWeb系企業で非常にポピュラーな構成です。
今回は`hook`の登場でますます勢いを増すReactをRailsに導入します。

#実行環境
ruby 2.6.3p62
Rails 6.0.2.2

#Gemをインストール
`Helper`を使用する為にはGemのインストールが必要です。
Gemfileに以下を追記して`bundle install`
※Rails 5系の場合は`gem 'webpacker'`も必要

```ruby:Gemfile
gem 'react-rails'
# Rails 5系は以下も追記
gem 'webpacker'
```

#Reactをインストール
ターミナルで以下のコマンドを実行。

```terminal:terminal
$ bin/rails wepacker:install:react
$ bin/rails g react:install

# Rails 5系では以下も実行
$ bin/rails webpacker:install
```

すると次の様な変更が加わります。

**app/javascript/components/ディレクトリが追加**
Reactのファイルはここに作成していきます。

**app/javascript/packs/application.jsにReactを組み込む処理が追加**

```javascript:app/javascript/packs/application.js
// 以下のコードが末尾に追加
// Support component names relative to this directory:
var componentRequireContext = require.context("components", true);
var ReactRailsUJS = require("react_ujs");
ReactRailsUJS.useContext(componentRequireContext);
```

**app/javascript/packs/server_rendering.jsにサーバー側のレンダリング処理(SSR)が追加**

```javascript:app/javascript/packs/server_rendering.js
// 以下のコードが末尾に追加
// By default, this pack is loaded for server-side rendering.
// It must expose react_ujs as `ReactRailsUJS` and prepare a require context.
var componentRequireContext = require.context("components", true);
var ReactRailsUJS = require("react_ujs");
ReactRailsUJS.useContext(componentRequireContext);
```

※Rails 5系の場合は加えてapp/views/layouts/applicationi.html.erbのヘッダーに以下を記載する必要があります(6ではデフォルトで記載)

```ruby:app/views/layouts/applicationi.html.erb
<%= javascript_pack_tag 'application' %>
```


以上で準備は完了です。

#コンポーネントの作成
試しにHelloWorldというコンポーネントを作成します。
以下のコマンドを実行します。

```terminal:terminal
$ bin/rails g react:component HelloWorld greeting:string
Running via Spring preloader in process 12477
      create  app/javascript/components/HelloWorld.js
```
greeting:stringはそれぞれ引数名・型です。
すると以下の様なファイルが生成されます。

```react:app/javascript/components/HelloWorld.js
import React from "react"
import PropTypes from "prop-types"
class HelloWorld extends React.Component {
  render () {
    return (
      <React.Fragment>
        Greeting: {this.props.greeting}
      </React.Fragment>
    );
  }
}

HelloWorld.propTypes = {
  greeting: PropTypes.string
};
export default HelloWorld
```

#Railsへ導入
railsの `erb`ファイル内のコンポーネントを適用したい箇所に以下のコードを追加することで導入完了です！
`<%= react_component("HelloWorld", { greeting: "Hello from react-rails." }) %>`

#裏技！
Reactのインストール時に`app/javascript/packs/application.js`に自動追記されるコードは、**全てのページでReactのコードを読み込む処理**なので、Reactが導入されていないページにも適用されレスポンスが低下してしまいます。
自動追記された部分を削除し、**Reactを導入するページにのみ**
`<%= javascript_pack_tag 'server_rendering.js' %>`
を追加することでこれを回避することができます。
繰り返し中断

# breakの使い方
# 繰り返しの中で強制中断
```
import random
# 以下に処理を記述します
def Donki():
    donki = ''
    while True:
        string=random.choice(['ドン','ドンキー'])
        donki+=string
        if 'ドンドンドンドンキー' in donki:
        
            donki +='ホーテ！'
            break

    # 表示
    print(donki)

Donki()

```
最初に
random.choiceでドン、ドンキーどちらかを選択して
空文字だったdonkiに追加していく。
ここでは文字の結合をして末尾に追加している。
またif文で条件を書きその条件に一致したら中断するようなプログラムを組んでいる。
【LT】AndroidでCrashlyticsをFabricからFirebaseに移行する際の注意点

リモートLTのYouTube(クリックで再生, 日本語/英語字幕あり)
[<img width=480 src="http://img.youtube.com/vi/LAzZGSAmwx0/hqdefault.jpg">](https://www.youtube.com/watch?v=LAzZGSAmwx0)

# はじめに

<img width="800" alt="スクリーンショット 2020-08-13 18.48.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19692/539aeb21-9501-a666-b569-8b7d124947d1.png">

Fabric SDKがアプリのクラッシュを報告するのは 2020年11月15日 までとなります。
なぜかというと大人の事情です。
FabricはFirebaseに買収され、今年の3月にサポート終了していました。

### 大人の事情まとめ(FirebaseとCrashlyticsの歴史)

```
2011年 James TamplinさんとAndrew LeeさんがFirebase設立
2011年 Wayne ChangさんとJeff SeibertさんがCrashlytics設立
2013年 TwitterがCrashlyticsを買収
2014年 GoogleがFirebaseを買収
2014年 CrashlyticsがモバイルプラットフォームSDKのFabric発表
       (TwitterKit, Crashlytics, MoPub)
2017年 GoogleがTwitterからFabricを買収
       Firebase Crash Reportingは廃止
2018年 Fabricが移行ロードマップ公開
2020年 3月31日Fabricのサポート終了
2020年 11月15日にFabric SDKのCrashlytics機能停止
```

# 移行方法
11月以降もクラッシュを表示するにはCrashlyticsを以下バージョンに上げる必要があります。

Android: 17.0.0+
iOS: 4.0.0+
Unity: 6.15.0+

公式の移行ドキュメントは以下となります。

> Firebase Crashlytics SDK にアップグレードする
> https://firebase.google.com/docs/crashlytics/upgrade-sdk?platform=Android

Androidで対応したときに得た注意点を共有します。

### 注意点1: 英語のドキュメントを見る

> Firebase Crashlytics SDK にアップグレードする
> https://firebase.google.com/docs/crashlytics/upgrade-sdk?platform=Android

移行ドキュメントはAndroidを選択してもAndroidのドキュメントは表示されません。
解決するには右上のプルダウンからEnglishを選択して英語版を読んでください。

### 注意点2: Crashlyticsの移行ドキュメントと導入ドキュメントを両方見る

アップグレードのドキュメントのみではわからないことがあります。

> Get started with Firebase Crashlytics
> https://firebase.google.com/docs/crashlytics/get-started?platform=android

上記の導入ドキュメントでは `google-service` のバージョン指定があります。また、Kotlinを使っている方は`firebase-analytics-ktx`のことについて触れられています。こちらを一読してから対応したほうが良さそうです。

- com.google.gms:google-services:4.3.2+
- firebase-analytics-ktx

### 注意点3: Android Studio3.2ではだめ(かも)
注意点2の通り、新しいCrashlyticsでは `google-service:4.3.2`が必要ですが、
`com.android.tools.build:gradle:3.2.1` では動作しませんでした。

(自分の環境だけかもしれませんが)最低でもAndroid Studio 3.3で作業したほうが良さそうです。

# 移行作業
基本的に移行ドキュメントの通り行うと完了します。
NDKを使用していたり、コード上でCrashlyticsを呼んでいる場合は追加の対応が必要となります。

最低限の移行作業はYouTube内で行いました。
移行作業がまったくわからんという方は参考にしてみてください。

おわり
Istio に validation webhook で怒られた時の対応法

# Istio 1.6.* から Istio 1.4.* にdawn gradeした時に validation webhook に怒られた時の対応法

1.5からのアーキテクチャの変更によりistiodが導入されたので `1.6.*`, `1.5.*` から `1.4.*` にダウングレードした際にコントロールプレーンや設定情報を書き換えようとすると

```
$ Internal error occurred: failed calling webhook "validation.istio.io": Post https://istiod.istio-system.svc:443/validate?timeout=30s: service "istiod" not found
```

のようなエラーが帰ってしまう

## 対処法

もし `1.6.*` か `1.5.*` の `validatingwebhookconfigurations` が残っている場合ダウングレードしても namespace `istio-system` の `istiod` に対して validation API を叩いてしまう為

```
$ kubectl delete validatingwebhookconfigurations.admissionregistration.k8s.io istiod-istio-system
```

で `validatingwebhookconfigurations` を削除することで解決することができました。

順調にアップグレードしていけば問題ないですが運用の都合などでダウングレードが致し方ない時の対処として使えるかもしれません。
Ubuntu20.04にminikubeをインストールする


## kubectl

### インストール

```
sudo apt-get update && sudo apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl
```

### 確認
```
yuta:~ $ kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.6", GitCommit:"dff82dc0de47299ab66c83c626e08b245ab19037", GitTreeState:"clean", BuildDate:"2020-07-15T16:58:53Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Error from server (NotFound): the server could not find the requested resource
```

### 参考
https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/

## minikube本体

### VT-Xが有効であるかを確認
- 何がしかが出力されればいい

```
grep -E --color 'vmx|svm' /proc/cpuinfo
```

### インストール
```
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
  && chmod +x minikube
```

実行ファイルをパスに追加する

```
sudo mkdir -p /usr/local/bin/
sudo install minikube /usr/local/bin/
```

### 起動
- ドライバーは`docker`を指定（https://kubernetes.io/docs/setup/learning-environment/minikube/#specifying-the-vm-driver）
- ローカルにDockerをインストールしているため
- virtualboxやhypervなども選択可能

```
minikube start --vm-driver=docker
```

### 状態確認
```
minikube status
```

```
yuta:~ $ minikube status 
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
```

### 停止
```
minikube stop
```

### 参考
https://kubernetes.io/ja/docs/tasks/tools/install-minikube/
IAM AccessAnalyzerのCloudFormationテンプレートでエラー: Duplicate key Criterion


# エラー

```bash
  An error occurred: IAMAccessAnalyzer - Duplicate key Criterion(Contains=[], Eq=[111111111111], Neq=[]).
```

# 間違い
```bash
  IAMAccessAnalyzer:
    Type: AWS::AccessAnalyzer::Analyzer
    Properties:
      AnalyzerName: Main
      ArchiveRules:
        - RuleName: 'TrustedAccounts'
          Filter:
            - Property: 'principal.AWS'
              Eq:
                - '111111111111'
            - Property: 'principal.AWS'
              Eq:
                - '111111111112'
      Type: ACCOUNT
```

# 修正後
```bash
  IAMAccessAnalyzer:
    Type: AWS::AccessAnalyzer::Analyzer
    Properties:
      AnalyzerName: Main
      ArchiveRules:
        - RuleName: 'TrustedAccounts'
          Filter:
            - Property: 'principal.AWS'
              Eq:
                - '111111111111'
                - '111111111112'
      Type: ACCOUNT
```
IntellijIDEAで、gradleでメインクラスを指定したjarを出力する方法

#目的
gradleプロジェクトを作成しjar出力をし、`java -jar ***.jar`を実行したときに
`***.jarにメイン・マニフェスト属性がありません`となってしまう。
これを解決するためにメインクラスを指定する。
#環境
- Windows10 64bit
- IntelliJ IDEA 2020.2 (Ultimate Edition)

#初期状態
```gradle
plugins {
    id 'java'
}

group 'xyz.miyayu'//環境によって異なる
version '1.0-SNAPSHOT'//環境によって異なる

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}
```

#メインクラスを指定してあげる
```gradle
//～略～
version '1.0-SNAPSHOT'

//追加する
jar{
    manifest{
        attributes 'Main-Class' : 'xyz.miyayu.hogehogeProject.MainClass'//クラス名を指定する
    }
}
//追加ここまで

repositories {
//～略～
```

#おしまい
お疲れ様でした。
GitHub ActionsでESLintを追加する

Vue + Amplifyで開発していて、production環境のみでESLintを実行するRuleもあり、AmplifyのCIでエラーになるみたいなことがあったので、GitHub Actionsを追加しました

# ESLintの設定例
- console.logはローカルではデバッグのためにエラーにしたくないのですが、本番時にはコードに入れたくないので、production環境でチェックしています

```".eslintrc.js"
module.exports = {
     --- （中略） ---
  // add your custom rules here
  rules: {
    // allow async-await
    'generator-star-spacing': 'off',
    // allow paren-less arrow functions
    'arrow-parens': 'off',
    'one-var': 'off',

    'import/first': 'off',
    'import/named': 'error',
    'import/namespace': 'error',
    'import/default': 'error',
    'import/export': 'error',
    'import/extensions': 'off',
    'import/no-unresolved': 'off',
    'import/no-extraneous-dependencies': 'off',
    'prefer-promise-reject-errors': 'off',

    // allow console.log during development only
    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    // allow debugger during development only
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
  }
}

```

# GitHub Actionsの設定
- 公式ドキュメント通り設定するだけですね
- .github/workflowsディレクトリを作成しYAMLファイルを作成します
- 本番環境として走らせたいのでenvを設定しています

```".github/workflows/main.yml"
name: CI

on:
  - push

jobs:
  lint:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v1
      - run: yarn install
      - run: yarn lint
        env:
          NODE_ENV: production
```

- 問題なく走っています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202761/3b2fe94e-d078-8f77-8287-28654e0b542e.png)

# 参考
- [GitHub Actionsのワークフロー構文](https://docs.github.com/ja/actions/reference/workflow-syntax-for-github-actions)
Verilog HDL > 「get_data        = '0;」 > System Verilogの記述?

```txt:動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
PYNQ v2.5 Image
Vivado v2019.1 (64-bit)
```


### 概要

- Verilogの実装 UART RXを試そうとした
- VivadoでIPとして追加時にエラーが出る
- System Verilogの記述のようだ


### 関連

- [verilog～UART通信受信機(RX)編～](https://keymale.xyz/2019/06/05/post-381/)
    - Keymaleの徒然草さん
    - 情報感謝です


### 文法エラー

Vivado v2019.1において上記のリンクのVerilogファイルをIPとして追加しようとした。

1. Tools > Create and Package New IP
2. Create a new AXI4 peripheral
3. .vファイルを上記のものに置き換え

下記の部分でエラー「Error Syntax Error near "'".」が出る。

![コメント 2020-08-13 184057.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/ddb06991-0064-5a88-7c96-ec803a62f060.png)


```verilog
initial begin
    get_data        = '0;
    state           = '0;
    clk_cnt         = '0;
    get_startbit    = '1;
end
```

### System Verilogの記述?

ブログの記事にはQuartusとあり、QuartusはSystem Verilogだろうかと考えた。
ファイルの種類をSystem Verilogに変更したところ、文法エラーは出なくなったようだ。


### System Verilog

- [SystemVerilog](https://ja.wikipedia.org/wiki/SystemVerilog)

> SystemVerilog は、ハードウェア記述言語のVerilog HDLを拡張した言語で、 ...
Rails + Dockerでローカルに開発環境構築

###作業用ディレクトリを作成
```$ mkdir event_app```

docker composeをやる準備を行う
下記をevent_app上に作成する
Dockerfile、docker-compose.yml, Gemfile, Gemfile.lock, entrypoint.sh

```Dockerfile
FROM ruby:2.6
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update -qq \
    && apt-get install -y nodejs yarn \
    && mkdir /event_app
WORKDIR /event_app
COPY Gemfile //Gemfile
COPY Gemfile.lock /event_app/Gemfile.lock
RUN bundle install
COPY . /event_app

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE ３０００

CMD ["rails", "server", "-b", "0.0.0.0"]
```

```docker-compose.yml
version: '3'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql:cached
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/event_app
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
    command: bundle exec rails server -b 0.0.0.0
volumes:
  mysql-data:
    driver: local
```

```Gemfile.
source 'https://rubygems.org'
gem 'rails', '~>6'
```

```entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
```


###rails インストールを行う
```$ docker-compose run web rails new . --force --no-deps --database=mysql --skip-test
```

```--force　：　			既存のGemfileを上書きするためのオプション
--no-deps　：　		リンクしたサービスを起動しない
--database=mysql：	DBにmysqlを指定
--skip-bundle　：　		bundleをskip（最後にbundleします）
—skip-test ：			test（デフォルトのmintiest)のインストールをしない(今回はRSpecを使用するため）
--webpacker			webpackerをインストールする```


###プロジェクトをビルドする

```$ docker-compose build```

database.yml の設定と DB 接続
rails new で作成された config/database.yml を編集します。

```database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch("MYSQL_USERNAME", "root") %>
  password: <%= ENV.fetch("MYSQL_PASSWORD", "password") %>
  host:     <%= ENV.fetch("MYSQL_HOST", "db") %>

development:
  <<: *default
  database: event_app_development

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch("MYSQL_USERNAME", "root") %>
  password: <%= ENV.fetch("MYSQL_PASSWORD", "password") %>
  host:     <%= ENV.fetch("MYSQL_HOST", "db") %>

development:
  <<: *default
  database: event_app_development

production:
  <<: *default
  database: event_app_production
  username: event_app
  password: <%= ENV['EVENT_APP_DATABASE_PASSWORD'] %>
```


```$ docker-compose run web rake db:create```

参考した記事
https://qiita.com/nsy_13/items/9fbc929f173984c30b5d
InteliJ コンソール文字化け

InteliJでコンソールが文字化けする問題にはまったので解決策を載せておきます。


>ヘルプ➡カスタムVMの編集
最後の行に
『-Dconsole.encoding=UTF-8』
を追加


これで文字化け起こさなくなりました。
設定引き継げるといいな。
要件の定義はできるだけ明確に

自戒

他所発信の要件は、思っているより曖昧な場合が多いです（特に非エンジニアのとき）。

そういうときはコミュニケーションを重ねてできるだけ明確にしないと、あとあと自分が割を食います。
また、「多分こういうことだろーなー」ってこともしっかり確認しておきましょう。
実装後に「え、こういうことじゃなかったんだけど・・」なんて言われて悲しいことになります。
Biopython Tutorial and Cookbook和訳(4.9)

## 4.9 Reverse-complementing SeqRecord objects
[4.8へ](https://qiita.com/chaos44/items/9b9980325ef7bab8c16a)

One of the new features in Biopython 1.57 was the SeqRecord object’s reverse_complement method. 
This tries to balance easy of use with worries about what to do with the annotation in the reverse complemented record.
**Biopython 1.57に新機能reverse_complementメソッドを追加しました。
配列に対して反転、補完操作した後に、より簡単にannotationを修正するためです。**

For the sequence, this uses the Seq object’s reverse complement method. 
Any features are transferred with the location and strand recalculated. 
Likewise any per-letter-annotation is also copied but reversed (which makes sense for typical examples like quality scores). 
However, transfer of most annotation is problematical.
**配列に対しいてreverse_complementメソッドを使います。
featuresはlocationにより変換され，strandも再計算されます。
同様にper-letter-annotationもコピーかつ反転されます。（クオリティスコアに特に有効）
しかし多くのannotation変換に問題が存在します。**

For instance, if the record ID was an accession, that accession should not really apply to the reverse complemented sequence, and transferring the identifier by default could easily cause subtle data corruption in downstream analysis. 
Therefore by default, the SeqRecord’s id, name, description, annotations and database cross references are all not transferred by default.
**例として、record IDはaccession(登録番号)の場合、そのaccessionが反転、補完された配列に使われるべきではない、そしてidentifierをデフォルトで変換したら下流プロセス分析時のデータ損害を起こすかもしれないです。
そのゆえデフォルトではSeqRecord’s id, name, description, annotationsおよびdatabase cross referencesの変換を行わないです。**

The SeqRecord object’s reverse_complement method takes a number of optional arguments corresponding to properties of the record. 
Setting these arguments to True means copy the old values, while False means drop the old values and use the default value. 
You can alternatively provide the new desired value instead.
**reverse_complementメソッドはrecordの属性に対応する複数のオプション引数があります。
それらをTrue指定すると元の値をコピーします。Falseの場合はデフォルトの値で古い値と交換します。
もちろん自分で新しい値を指定することもできます。**

Consider this example record:
**簡単な例：**

```python
>>> from Bio import SeqIO
>>> record = SeqIO.read("NC_005816.gb", "genbank")
>>> print("%s %i %i %i %i" % (record.id, len(record), len(record.features), len(record.dbxrefs), len(record.annotations)))
NC_005816.1 9609 41 1 13
```

Here we take the reverse complement and specify a new identifier – but notice how most of the annotation is dropped (but not the features):
**reverse_complementメソッドを使って新しいIDを指定します - 注意すべきなのは多くのannotationを失ったが、featuresは健在です。**

```python
>>> rc = record.reverse_complement(id="TESTING")
>>> print("%s %i %i %i %i" % (rc.id, len(rc), len(rc.features), len(rc.dbxrefs), len(rc.annotations)))
TESTING 9609 41 0 0
```

[4.9へ](https://qiita.com/chaos44/items/d47e40f612d441a3cd32)
S3にアップロードしたファイルの整合性を担保するPython

#はじめに
公式ナレッジ[Amazon S3 にアップロードされたオブジェクトの整合性を確認する方法を教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/data-integrity-s3/)をPython3で実装したものになります。

#コード

```Python
import hashlib
import boto3
from botocore.exceptions import ClientError
from base64 import b64encode

upload_file_path = 'sample.zip'
s3_bucket_name = 'sample_bucket'
s3_object_key = 'sample.zip'

h = hashlib.new('md5')
file_read_size = h.block_size * (1024 ** 2)
with open(upload_file_path, 'rb') as f:
    read_bytes = f.read(file_read_size)
    while read_bytes:
        h.update(read_bytes)
        read_bytes = f.read(file_read_size)

    f.seek(0)

    try:
        boto3.client('s3').put_object(
            Body=f,
            Bucket=s3_bucket_name,
            ContentMD5=b64encode(h.digest()).decode("ascii"),
            Key=s3_object_key,
        )
    except ClientError as e:
        # ハッシュ不一致時のエラー処理
        if e.response['Error']['Code'] == 'BadDigest':
            print(e.response['Error']['Message'])
        else:
            raise
```

##制限事項など
- 5GBを超えていて、マルチパートアップロードが必要となるファイルには対応できません。


##参考
ファイルのハッシュを計算するコードはこちらの記事を流用しました。

- [Python3でファイルのハッシュを計算する。](https://qiita.com/maboy/items/8ee4c408640700e52274)
標準原価計算の手続

平成31年春期 午前問題77

図に示す標準原価計算の手続について，a～cに該当する適切な組合せはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ad6ea2ed-54b5-7ac6-a17a-a6a97a074987.png)


標準原価計算とは、実際に必要となった実際原価ではなく、統計などに基づいて算定した標準原価によって製品原価を計算する方式です。標準原価と実際に掛かった原価を比較することで、その原因を分析し、原価管理を効率的に行うことを目的とした原価計算方式です。

標準原価計算の手順は以下の通りです。

・原価標準の設定
　　原価標準とは、製品1単位あたりの標準原価です。各原価要素ごと（直接材料費、直接労務費、製造間接費）に製品1単位あたりの標準原価を算出し、それらを合計することにより設定します。

・標準原価の計算
　　原価計算期間の製品生産量に基づいて、完成品の標準原価（原価標準×完成品数量）を算出します。

・実際原価の計算
　　実際に完成品を作るのに要した金額を計算します。

・標準原価差額の計算
　　標準原価と実際原価の差額を計算します。

・原価差異分析
　　差額がどの要素に起因するものなのかを分析します。原価差異は直接材料費差異、直接労務費差異、製造間接費差異に大別されます。

・原価報告
　　以上の計算結果を書式に記述し報告します。


標準原価差額の計算は、標準原価 - 実際原価　という計算するのはポイントかもしれませんね。
そうすると、実際原価は先に計算しないといけませんね。

参考：

https://www.ap-siken.com/kakomon/22_aki/q76.html
yum install httpdだけだとAWS ALBでHealth check failed with these codes: [403]

表題だけで初心者がやらかすアレと言われそうなアレですが、やらかしたのでメモ。

1. EC2インスタンス起動時にユーザーデータで `yum install httpd -y`
2. 起動したインスタンスのIPアドレスにhttp接続してApacheのテストページが表示されることを確認
3. Application Load Balanverを作成し、ターゲットグループを作り、このEC2インスタンスを追加
4. 少し待ってターゲットのステータスを見ると `unhealthy`

__原因__は単純で、Status Detailに `Health check failed with these codes: [403]` とある通り、Apacheが403 Forbiddenエラーを返してるから。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55718/3f23ea9e-7bb7-803a-4bfb-0afe8180d13b.png)

Apacheのテストページが表示されている状態は、そもそもこの403: Forbeddenエラー状態で、実際に `/var/log/httpd/access_log` には「ELBのヘルスチェックが `GET /` してきたので403返しておきました」というようなログが残っている。

```
"GET / HTTP/1.1" 403 3630 "-" "ELB-HealthChecker/2.0"
```

また `/var/log/httpd/error_log`には次のようなエラーが記録されている。

```
[autoindex:error] [略] [略] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html) found, and server-generated directory index forbidden by Options directive
```

__対処__はヘルスチェックを成功させたいだけなら `/var/www/html/index.html` を作るのが無難で安全だと思われる。ユーザーデータに例えば以下のような1行を加える。

```
echo "<html><head><title>Test Page</title></head><body>Wellcome to `uname -n`.</body></html>" > /var/www/html/index.html
```
Springにて、Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)みたいなエラーの解決

#エラー内容
```
警告: Exception encountered during context initialization - cancelling refresh attempt: 
org.springframework.beans.factory.UnsatisfiedDependencyException:
 Error creating bean with name '【コントローラー名】': 
Unsatisfied dependency expressed through field '【サービスの変数名】'; 
nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name '【サービス名】': Unsatisfied dependency 
expressed through field '【dtoの変数名】'; nested exception is 
org.springframework.beans.factory.NoSuchBeanDefinitionException:
 No qualifying bean of type '【パッケージ名を含めたdto名】' available: 
expected at least 1 bean which qualifies as autowire candidate. 
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

```

## 誤ったプログラム

```javascript:nogizaka-suko.java
@Autowired
private OnlineOrderDto ooDto;

@Autowired
private OnlineOrderDao ooDao;

```

## 修正したプログラム
dtoに@Autowiredをつけてしまっていたので外す(dtoは特にアノテーションをつけない普通のjavaのプログラムだから)

```javascript:nogizaka-suko.java
private OnlineOrderDto ooDto;

private OnlineOrderDao ooDao;

```

## まとめ
誤った場所に@Autowiredをつけないようにする
[Swift] Viewの下にViewが隠れてしまった

viewの下にviewが隠れてしまったことがありました。
## 該当のソースコード

```swift
override func viewDidLoad() {
    super.viewDidLoad()

    showAlert()
    secondScreenUI()
}
```

`showAlert()`　はアラートを表示させる関数です。
`secondScreenUI()`は画面のUIが定義されている関数です。

## 想定していた動作
<img width="648" alt="スクリーンショット 2020-08-13 17.31.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468821/cfcf54ec-6f09-e33c-424e-4bc24f3485a4.png">

## 実際の動作

![スクリーンショット 2020-08-13 17.34.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468821/a14638ed-bb06-03df-e311-d5bc9a4f6e80.png)

少しわかりにくいですが、最初の画面と２番目の画面の下にアラートが表示されてしまっています.

## 解決したやり方

`showAlert`を `viwDidLoad()`の中で呼び出すのではなく`viewDidLayoutSubviews()`内で呼び出しました。

```swift
override func viewDidLoad() {
    super.viewDidLoad()

    secondScreenUI()
}

override func viewDidLayoutSubviews() {
    showAlert()
}
```

## 実行結果
![スクリーンショット 2020-08-13 17.42.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468821/1568c6a2-e948-c628-1fde-7ed7fd0c913d.png)

少しわかりにくいですが、アラートが一番上に表示されています。

## さいご
今回のトラブルはライフサイクルについてさらっと学ぶ良い機会となりました。

ライフサイクルについては以下の記事に目を通してました。

[UIViewControllerのライフサイクル](https://qiita.com/motokiee/items/0ca628b4cc74c8c5599d)

[ViewControllerのライフサイクル](https://medium.com/@shiba1014/viewcontroller%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB-37151427bda5)
売上高、固定費、変動費、変動費率、損益分岐点売上高

平成31年春期 午前問題76

表の事業計画案に対して，新規設備投資に伴う減価償却費(固定費)の増加1,000万円を織り込み，かつ，売上総利益を3,000万円とするようにしたい。変動費率に変化がないとすると，売上高の増加を何万円にすればよいか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/dd88cbb1-e40e-1d41-a9da-22aeb345c2c9.png)

１、変動費率
利益＝売上高　－　変動費　－　固定費
変動費率＝変動費/売上高
利益＝売上高　－　売上高 X 変動費率　－　固定費

当該質問に使っていませんが、
利益が0の場合は、売上高は損益分岐点売上高といいます。
なので、
0＝損益分岐点売上高－損益分岐点売上高 X 変動費率　－固定費
→
損益分岐点売上高（１－変動費率）＝固定費
→
損益分岐点売上高＝固定費/（１－変動費率）
になりました。


当該質問には、
変動費率＝10,000÷20,000=0.5

売上総利益＝売上高 - 変動費 - 固定費ので、

仮に、増加後の売上高はaとすると、
a-0.5a-9,000=3,000
a->24,000

つまり、4000増が必要ですね。


参考：

損益分岐点分析
https://qiita.com/lymansouka2017/items/cfbfb4f8e84f9b0e3fa0