OmniAICreator/Qiita-1.07M huggingface dataset:
Pandasを利用して、ExcelファイルにCSVファイルを張り付ける方法

#背景
ExcelのVBAでCSVファイルを張り付けるのはダラダラとコードを書く必要があり面倒です。Pythonで簡単に書く方法がないか調べてみました。

#目的
Excelの指定シートに、CSVの内容を張り付ける。

#xlwingsのインストール
Pythonには、Excelを操作するためのモジュールがいくつかあります。
一番有名なのは、おそらくOpenpyxlかと思います。
ただ、Openpyxlは処理速度は速いものの、不具合（フォーマット崩れるなど）が多いので、
今回はxlwingsを利用したいと思います。

xlwingsがインストールされていない場合は、以下のコマンドでインストールしてください。

```PowerShell
$ pip install xlwings
```

#コード
今後も利用することが多そうなので関数化しました。
CSVファイルをPandasで読み込んだ後に、指定シートのA1セルに張り付けています。
VBAだとCSVを１行１行読み込んで出力する必要がありますが、
Pandasを利用すると、とてもシンプルに書けます。

```Python
import pandas as pd
import xlwings as xw

def csv_to_sheet(wb_name, ws_name, csv_name, save_flg=True, quit_flg=True):
    """\
    関数の説明：
        指定のシートにCSVの内容をコピペする関数

    引数の説明：
        wb_name：ワークブック名
        ws_name：シート名
        csv_name：CSVのファイル名
        save_flg：デフォルトは上書き保存を実施。
        quit_flg：デフォルトは閉じる設定
    """

    df = pd.read_csv(csv_name,encoding='cp932', index_col=0) #CSVファイルをDataFrameで読み込む

    wb = xw.Book(wb_name) #ワークブックオブジェクトの作成
    wss = wb.sheets
    ws = wss[ws_name] #ワークシートオブジェクトの作成

    ws.range('A1').value = df #DataFrameを張り付ける

    #save_flgがTrueであれば上書き保存
    if save_flg:
        wb.save(path=None)

    #quit_flgがTrueであればExcelを閉じる
    if quit_flg:
        app = xw.apps.active  
        app.quit() #Excelを終了
```

#利用方法
Excelファイル、シート名、CSVファイルは任意のものに変更して利用してください。
上書き保存したくない場合は、引数にsave_flg=Falseを、
ファイルを閉じないで引き続き編集する場合は、quit_flg=Falseを渡してください。

```Python
wb_name = 'Excelファイル名.xlsx'
ws_name = 'シート名'
csv_name = 'CSVファイル'
csv_to_sheet(wb_name, ws_name, csv_name)
```
CSS：背景の一部をぼかす表現

<p class="codepen" data-height="520" data-theme-id="5973" data-default-tab="result" data-user="KazuyoshiGoto" data-slug-hash="nhstF" style="height: 520px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Frosted glass background">
  <span>See the Pen <a href="https://codepen.io/KazuyoshiGoto/pen/nhstF">
  Frosted glass background</a> by Kazuyoshi Goto (<a href="https://codepen.io/KazuyoshiGoto">@KazuyoshiGoto</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

テキストの乗っているレイヤーを、擦りガラスで透かしたような表現を作っています。

## CSS(Sass)

HTMLはごくシンプルなのでCSSの要点箇所について。

```css
body, section:before {
  background:url("***.jpg");
  background-position: center;
  background-size: cover;
  background-attachment: fixed;
}
section:before {
  content: "";
  z-index: -1;
  -webkit-filter: blur(4px);
  -ms-filter: blur(4px);
  filter: blur(4px);
  position: absolute;
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
}
```

まず `body` と `section:before` に同一の背景画像を設定しています。

次に `section:before` のみにCSSフィルター `filter:blur` を設定しぼかしています。

**`section` ではなく `section:before` に背景を設定しているのが要です。**

`section` に `blur` を設定するとテキストなど中の要素すべてがぼけてしまうため、 `section:before` にぼかした背景を設定し `section` 本体の後ろに重ねる形にする手法で実現しています。
久しぶりのMacセットアップ。 Homebrewで環境構築

# パッケージ管理（Homebrew）のインストール

Macのアプリケーション管理を楽にするために、パッケージ管理ツールをインストールします。今も主流はHomebrewなのかな？調べた感じは新しいものが出ていないようなので、引き続きHomebrewを使ってみることにしました。

## Homebrew インストール
macOS用パッケージマネージャー https://brew.sh/index_ja
本家を参考にインストールします。

以前は、Xcodeが必要だったのでつい入れてしまったが、本当に必要だったのか。。。

``` bash
$ xcode-select --install
```

homebrewのインストール

``` bash
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

rubyを使わなくなったのね。
どうやら、brew-cask も一緒にインストールされてるようです。便利になりましたね。

# パッケージの検索

``` bash
$ brew search java
==> Formulae
app-engine-java            java11                     jslint4java
google-java-format         javacc                     libreadline-java
java                       javarepl                   pdftk-java
==> Casks
eclipse-java                             netbeans-java-se
eclipse-javascript                       oracle-jdk-javadoc
java                                     yourkit-java-profiler
netbeans-java-ee                         homebrew/cask-versions/java-beta
```

Caskも同時に検索してくれるので便利になった。（昔もできたっけ。。。）

## 最新バージョン以外をインストール可能にする

``` bash
$ brew tap homebrew/cask-versions
```

``` bash
$ brew search java
==> Formulae
app-engine-java            java11                     jslint4java
google-java-format         javacc                     libreadline-java
java                       javarepl                   pdftk-java
==> Casks
charles-applejava          java-beta                  netbeans-java-se
eclipse-java               java11                     oracle-jdk-javadoc
eclipse-javascript         java6                      yourkit-java-profiler
java                       netbeans-java-ee
```

過去のバージョンもインストール可能になりました。（Java8が欲しかったんだけどないな。。。）

とりあえず、今日はここまで。
Unity内のカメラをZoomのカメラとして使う方法

# はじめに
そのまま。Unity内のカメラをZoomのカメラとして使う方法です。自分用のメモ書きとして残しておきます。
こんな感じになります
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ヨシ！これからはzoomでもバ美肉だ <a href="https://t.co/Btp8BrF6dg">pic.twitter.com/Btp8BrF6dg</a></p>&mdash; Yukihiko Aoyagi (@yukihiko_a) <a href="https://twitter.com/yukihiko_a/status/1245951297527762946?ref_src=twsrc%5Etfw">April 3, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
簡単。とってもありがたい
###--追記--
ほぼ同じ内容で先に書かれた記事がありました。。。しかもめっちゃ丁寧に。
[Unityのカメラ越しにZoomに参加する方法](https://qiita.com/comocc/items/d404893414ef72511dca)

# 環境
Windows 10 Pro
Unity（2019.2.13f1で確認。）
Spout（バージョン2.006 update-2かな）
KlakSpout（Unity用のパッケージ、v0.2.4を使用）
Zoomのクライアント（これからもずっと使えるのかは不明）

# インストール
UnityとZoomは先に入っているとして、[Spot](https://spout.zeal.co/)をインストールする。
ダウンロードは[ここ](https://spout.zeal.co/download-spout/)　（できればDonateもね）

もとからチェックはついているけれど、SpoutCamにチェックが必要

次に、[KlakSpout](https://github.com/keijiro/KlakSpout)のパッケージをダウンロード。
ふつうに[release](https://github.com/keijiro/KlakSpout/releases)から最新でいいと思う。

DL後自分のUnityのプロジェクトにPackageを追加
Assetの下にKlakフォルダができる

スクリプトファイル、Asset\Klak\Spout\Runtime\SpoutSender をMainCameraにAddする。
![spout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/4b503c56-0b8e-0727-e193-8e306bc821de.png)

終わり。簡単

# 使い方
Zoomを起動し、ビデオ設定でカメラのリストからSpout Camを選択

![spout2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374813/94397d4c-7b41-a044-abfe-3d935eabb84d.png)

あとは好みの設定をして終わり。簡単
overflow: scroll; にはじめからスクロールバーを表示させる

# 要件
高さを指定してスクロールで表示させた時にはじめからスクロールバーが表示されてると「スクロールできるんだな」とわかりやすいので設置したい

**ついでにニュース一覧でよくつかうパーツでコーディング:relaxed:**

# サンプルコード

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="kikuchi" data-slug-hash="GRJaoBM" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="GRJaoBM">
  <span>See the Pen <a href="https://codepen.io/kikuchi/pen/GRJaoBM">
  GRJaoBM</a> by naoko kikuchi (<a href="https://codepen.io/kikuchi">@kikuchi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 肝の部分
`::-webkit-scrollbar`  スクロールバー全体
`::-webkit-scrollbar-thumb` スクロールバーの移動するパーツ部分
`::webkit-scrollbar-track-piece:start` スクロールバーの背景部分

## 参考サイト 
 [スクロールバーをデザインする::-webkit-scrollbarに関しての覚え書き](https://unformedbuilding.com/articles/learn-about-webkit-scrollbar/ "スクロールバーをデザインする::-webkit-scrollbarに関しての覚え書き")

図で解説されてるのでとてもわかり易かったです^^
【初心者向け】ピラミッド(三角形)問題

##環境,前提
Ruby 2.5.1
MacOS Mojave Ver.10.14.6

本記事はRubyがインストールされた前提の記事です。
Rubyをインストールしたあと、とにかくRubyをいろいろ触ってみて慣れていくための記事です。お役に立てば幸いです。


# 採用試験に出ました。
採用試験で実際に出題されたのでやはり大事なのかなと思い今回記録に残します。



# ピラミッド問題とは？
"#"をうまく出力して"#"だけで10段の三角形を作る問題です。


⬇︎こう言った出力を求められました。

＃
＃＃
＃＃＃
＃＃＃＃
＃＃＃＃＃
＃＃＃＃＃＃
＃＃＃＃＃＃＃
＃＃＃＃＃＃＃＃
＃＃＃＃＃＃＃＃＃
＃＃＃＃＃＃＃＃＃＃


# 私が書いたコード

実際の試験では「言語は問わない、形式も自由」だったので今回はRubyのfor文を用いてやってみます。

```pyramid.rb
for x in 1..10 do 
	for y in 1..10do
		if y<=x then 
			print '#'
		end
	end
	puts ''
end


```

他にも逆ピラミッドなども実現可能なのでぜひやってみてください！！
IQ Botのテーブル項目に対するおまじないコードを詳しく解説


IQ Botでテーブル項目にPythonスクリプトを書くとき、最初と最後に必ず入れるコードがあります。

[こちら](https://qiita.com/IQBotter/items/67694b1b0d1376ede7e7)の記事にも書きましたが、以下のコードです。

```python:テーブル項目へのPythonスクリプトの書き方
#表の操作をするときに必ず入れるコード（最初）
import pandas as pd
df = pd.DataFrame(table_values)

# この間の部分に、処理したいコードを入れていく

#表の操作をするときに必ず入れるコード（最後）
table_values = df.to_dict()
```

社内でIQ Botを使っているかわいい後輩ちゃんに
「このコードって何をやっているんですか？」　と質問されたので、
がんばって答えてみました。

#ライブラリ（pandas）をインポート！

まずプログラミング言語には「ライブラリ」といって、
ある分野の処理を行いやすくするための命令や関数をまとめてくれたパッケージみたいなものがあります。

Pythonにはpandasというライブラリがあって、
このpandasというのは、表やデータの配列を扱いやすくするためのライブラリです。

ライブラリを使うためには、まず該当のライブラリをインポートする必要があります。

１行目の`import pandas as pd`がそのための処理です。

```python:おまじないスクリプトの１行目
import pandas as pd      

#意味：pandasを importしてね。
#     そしてそのpandasの中身を、これから書くコードの中ではpdという名前で使えるようにしてね。
```

#DataFrameに変換！

IQ Bot が帳票から読み取ったテーブルの情報は、`table_values`という変数にまるっと入っているのでした。
（この話が分からない人は[こちら](https://qiita.com/IQBotter/items/67694b1b0d1376ede7e7)を参照）

その`table_values`の中身は、そのままだと扱いづらいので、
pandasで扱うのに適したDataFrameという形式に変換します。

そして、その変換後のデータを`df`という名前の変数に格納します。

```python:おまじないスクリプトの２行目
df = pd.DataFrame(table_values)    

#意味：table_valuesの中身を、pandasのDataFrame形式に変換してdfという変数に入れてね。
```

ここで`pd.DataFrame`における`pd.`はpandasの意味です。

これを`pandas.`と書かずに`pd.`と省略して書けるのは、
おまじないコードの１行目で`import pandas`に`as pd`をつけておいたからです。

#DataFrameに変換すると、どうなる？

この１～２行目までの処理をやっておくことで、ここから先は、

table_valuesに入っていた中身の全体を`df`、
その中の特定の列の値を`df['列名']`という形で扱えるようになります。

#DataFrame形式をもとの形式に戻す！

最後の処理で、これまで`df`という変数にDataFrame形式で入れていたデータを、
IQ Botがもともと`table_value`を保持していた形式に戻します。

`table_value`のもともとの形式はdictionary型なので、この形式に戻してあげます。

```python:おまじないスクリプトの最後
table_values = df.to_dict()

#意味：dfの中身をdict型に変換して、table_valuesに入れてね。
```

このようにして、加工した結果をIQ Botに引き渡しているわけですね。

#名前重要（名前についての補足）

Pandasをインポートするにあたって`as pd`をつけたり、
DataFrameを格納する変数の名前を`df`にしたりするのは、

絶対的な決まりではありませんが、なるべくこうしておいた方がいいです。

なぜなら、そうやってコードを書く人が圧倒的に多いからです。

Pythonやpandaに関する解説記事でもだいたいみんなこのネーミング前提でコードを書いています。

なので、IQ Botを作るときのコードもそれに合わせておいた方が、
何かでつまづいたときなどに、解説を探しやすくなります。

以下のように書いても、コードが動くかどうかだけで言えば動きますが、
あまりおすすめはしません。

```python:テーブル項目へのPythonスクリプトの書き方
#表の操作をするときに必ず入れるコード（最初）
import pandas as hoge1
hoge2 = hoge1.DataFrame(table_values)

#表の操作をするときに必ず入れるコード（最後）
table_values = hoge2.to_dict()
```

#まとめ

- 最初にpandasというライブラリをインポートするよ
- IQ Botが持っているtable_valuesを、pandasで扱いやすいDataFrame形式にして変数に入れるよ
- 最後にDataFrame形式をtable_valuesのもとの形式（dictionary型）に戻してIQ Botに渡すよ
- 変数の名前はおまじないの通りじゃなくても動くけど、おまじないの通りにしておいた方が何かと都合がいいよ
コード進行をディグリーネーム（度数表記）に変換して表示するアプリの制作

# 概要
- 楽曲のコード進行をディグリーネーム（度数表記）に変換して表示するアプリケーションを作りました。
- フレームワークは Nuxt.js を使用しました。
- この記事はアプリケーションの制作動機と設計について書かれています。

## どんなアプリケーションか？
　[chord2degree](https://chord2degree.netlify.com/)
　楽曲のコード進行をディグリーネーム（度数表記）に変換して表示するアプリケーションです。

![lemon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247318/3539aa8a-434d-0829-e338-24d6422cf86f.png)


　[GitHubのリポジトリ](https://github.com/tyokkaku/chord2degree)

## なぜ、作ったのか？

- コード弾きのために度数表記の譜面を作成したかった。
- 邦楽に典型的なパート区分（AメロやBメロなど）に対応した譜面を作成したかった。

## どんな作りか？

### データ設計

　楽譜のデータ構造は以下です。

```js
// score[ part{id, name, bars[[note, note],[note, note, ...] ...]} ...]
const Score = [
  {
   id, // partのid
   name, // partの名前(AメロやBメロ等)
   // パートの中の小節
   bars: [[note, note], [note, note, ...] ...]
  },
  ...
]

// 具体例
const Score = [
  {
    id: 1,
    name: 'A',
    bars: [
      ['Em', 'D'],
      ['C', 'G'],
      ['C', 'G'],
      ['A#dim', 'B'],
      ['Em', 'D'],
      ['C', 'G'],
      ['C', 'G'],
      ['D', 'G', 'N.C']
    ] 
  }
]
```

### コンポーネント設計

　主要なコンポーネントは以下の四つです。（楽譜・パート・小節・音符です。）

- Score
 - tonic 
- Part
 - tonic
 - name (...AメロやBメロなどの区分)
- Bar
 - tonic
 - degreeName
- Note

　主音(tonic)とディグリーネーム(degreeName)は、各コンポーネントが保有するようにしました。
　主音は、各コンポーネント（Note以外）がデータオブジェクトで管理します。
　ディグリーネームは、Bar（小節）が算出プロパティで管理します。

### 度数表記への変換

　コード表記から度数表記への変換は、音楽理論のライブラリである [tonal](https://github.com/tonaljs/tonal) を使用しました。
　tonal には、コード進行の他にも音符やスケールなどの音楽理論に関するモジュールがあります。
　今回は [progression](https://github.com/tonaljs/tonal/tree/master/packages/progression) を使用しました。

```js
import { Progression } from "@tonaljs/tonal";

Progression.toRomanNumerals("C", ["CMaj7", "Dm7", "G7"]);
// => "IMaj7", "IIm7", "V7"]
```

## その他

　その他には以下のような技術を使いました。

- CSSフレームワーク：　Bulma
- ホスティング：　Netlify


　スマートフォンではレイアウトが崩れます。また印刷時にもレイアウトが崩れます。
　もし印刷される場合は Awesome Screenshot（chrome拡張機能） などを使用して下さい。
[python] 条件にあうファイルを移動

## やりたいこと
- 条件にあうファイルを移動
    - （例）条件を「今日の日付」が含まれるファイル名とする

## ポイント
- ファイル検索　```pathlib```
- 移動　```shutil```

## サンプルコード
```python
import pathlib
import shutil
import datetime

#今日の日付
yyyymmdd = datetime.date.today().strftime('%Y%m%d')
#移動元フォルダから条件に一致するファイル名を取得
#リストで受け取りたいのでキャストする
p_tmp = list(pathlib.Path('移動元フォルダ').glob(f'{yyyymmdd}*.csv'))
'''リスト化するところを ↑ に修正
p_tmp = pathlib.Path('移動元フォルダ').glob(f'{yyyymmdd}*.csv')
p = [p for p in p_tmp]
''' 
dest = '移動先フォルダ'
#ファイル移動
for source in p_tmp:
    shutil.move(str(source), dest) 
```

- ``pthlib``で拾ったファイル名は**ジェネレータ**で返される
    - **リストに格納**してfor文でファイル名を1つづつ取り出す
    - ↑　内包表記でリスト化してたけど、わざわざそんなことしなくても**```list```**でキャストすればよいことが判明
    - 取り出したファイル名を```str```で**文字列変換**すること
- **```shutiful.move([移動元], [移動先])```**でファイル移動
WPのカスタムフィールドにJSON形式のテキストを入れて出力

#経緯
他のCMSを使った時に、1つのカスタムフィールドで複数のデータを扱うことがあったので、WPでも作ってみようと思いました。

#プラグイン
カスタムフィールドの追加は「Advanced Custom Fields」を使いました。
<img width="1080" alt="img01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287209/6d832081-911d-d400-9094-0e7f93cd5488.jpeg">

#フィールドに入れる。
↓これを

```name.json
[
    {
        "id":"1",
        "first_name":"佐藤",
        "last_name":"太郎"
    },
    {
        "id":"2",
        "first_name":"鈴木",
        "last_name":"次郎"
    }
]
```

↓ポン

<img width="799" alt="スクリーンショット 2020-04-03 16.23.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287209/3a2ff404-632e-f364-0d3f-9a59204a8aea.png">

#ソース
フィールドラベルは、「name」としました。

```single.php
<?php

while ( have_posts() ) :
	the_post();
	
	// カスタムフィールドを取得
	$area = get_field('name');
	// JSON($json)を連想配列に変換(デコード)する
	$json = json_decode( $area , true ) ;
	$cnt = count($json);
	for ($i = 0; $i <= $cnt - 1; $i++) {
		?>
			<p>id：<?php echo $json[$i]['id']; ?></p>
			<p>名字：<? echo $json[$i]['first_name']; ?></p>
			<p>名前：<? echo $json[$i]['last_name']; ?></p>
		<?php
	}

endwhile; // End of the loop.
?>
```
保存！

#でけた
<img width="449" alt="スクリーンショット 2020-04-03 16.18.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287209/61ed94c2-6e27-d254-5776-1fc166df4ced.png">


管理画面側の見た目をもっと整えれれば使い勝手よさそう。
C言語　ALDS1_2_B　Selection Sort

##問題

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_2_B&lang=ja

##ポイント

- 挿入ソート、バブルソートと同様に、「ソード済みの部分列」「未ソートの部分列」に分けられる。
- 計算量はO(n^2)
- 不安定なソート

##コード

```c
#include <stdio.h>

static void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

static void print_array(int array[], int array_len)
{
    for (int i = 0; i < array_len; i++)
    {
        printf("%d", array[i]);
        if (i != array_len - 1)
            printf(" ");
    }
    printf("\n");
}

/* 選択ソート */
static int selection_sort_count(int A[], int N)
{
    int min_index = 0;
    int count = 0;

    for (int i = 0; i < N - 1; i++)
    {
        min_index = i;
        for (int j = i; j < N; j++)
            if (A[j] < A[min_index])
                min_index = j;
        if (i != min_index)
        {
            swap(&A[i], &A[min_index]);
            count++;
        }
    }
    print_array(A, N);
    return count;
}

int main(void)
{
    int N;
    int A[100];

    scanf("%d", &N);
    for (int i = 0; i < N; i++)
        scanf("%d", &A[i]);

    printf("%d\n", selection_sort_count(A, N));

    return 0;
}
```

##所感
indexを使って交換回数を減らしている。
コード自体はもやもや違和感がある。

所要時間30分


【復習】

- 2020/04/05
    - OK,イメージできた
    - 実装はしてない
GCS上にあるgzファイルの解凍、置換、圧縮、アップロードをワンライナーでやる

たまに使うので、メモっておく

```
gsutil cp gs://path_to_file.csv.gz - | gzip -d | sed -e "s/\+0000/\+0900/g" | gzip -c | gsutil cp - gs://path_to_file.csv.gz
```
Hangfire Server を tty 抜きで実行できるように実装する

## はじめに

Hangfireは、時間のかかる処理をキューさせてバックグラウンドで実行するような構成を実現できるOSSです。

概要は前回の記事を御覧ください↓
[Hangfireに.NET Core 3.1で最速入門する](https://qiita.com/yoh1496/items/98154b6596b2c8cccf04)

特にリソースも時間も多く必要なタスクの場合、
受け付けるサーバーとは別に実行するサーバーを実装できたりしてなかなか便利です。

### ドキュメントによるサーバー実装

https://docs.hangfire.io/en/latest/background-processing/processing-jobs-in-console-app.html

公式ドキュメントによれば、

```csharp

using(var server = new BackgroundJobServer()) {
    Console.WriteLine("Started BackgroundJobServer. Press Enter to exit.");
    Console.ReadLine();
}
```

といった感じで `Console.ReadLine()` でスレッドをブロックするコードがサンプルとして提供されています。

### 何が問題か？

`Console.ReadLine` を使う都合上、dockerで起動する際にttyをアタッチする必要があります。

ttyをアタッチすると、下記のようにjournald で loggingしようとしたときに [Blob Data] として記録されてしまいます。

https://github.com/moby/moby/issues/15722

コンソールでは正しく出力されるのに、何でだろう？と詰まったのですが、
上記Issueにたどり着き、tty: falseでも実行できるようにしようと思って調べた次第です。


## Hangfire.NetCore

コンソールを使用せずともGeneric Hostを使用すればサービスが終了するまで、
バックグラウンドで動かし続けられるのではないか？と思い、調べてみたんですが、

今まで使用していた Hangfire.Core には `AddHangfireServer` という関数が用意されておらず、
以下の選択が迫られました。
- 自分で`ConfigureServices` で使用する関数を実装する
- `Hangfire.AspNetCore` パッケージを使用する

1つ目は 自前実装となると品質に不安が残ること。
2つ目は 無駄にASP.NET Coreに依存してしまうことが理由として挙がり、どうするかな～と悩んでいましたが

よくよく調べてみるとありましたパッケージ。

https://www.nuget.org/packages/Hangfire.NetCore/

その名も `Hangfire.NetCore` ！ リリースノート見ると

```
1.7.1
• Added – Worker Service host support for .NET Core without unnecessary dependencies to ASP.NET Core.
```

とあります。　つまり、 ASP.NET Coreへの依存を入れずに .Net Core アプリでワーカーサービス（Hangfire Server）を構築できるということです。

### 実装

実装はHostBuilderを使うだけのかんたんな構成。

```csharp

static async Task Main(string[] args) {
    var hostBuilder = new HostBuilder()
        // Add configuration
        .ConfigureServices((context, services) => {
            services.AddHangfire(config => {
                // 中略
                config.UseMongoStorage(connectionString, databaseName, storageOptions);
            });
            services.AddHangfireServer(options => {
                options.WorkerCount = cientWorkerCount;
            });
        })
        .ConfigureLogging(logging => {
            // 中略
        });

    await hostBuilder.RunConsoleAsync();
}
```

こんな感じです。私はジョブのキューに `Hangfire.Mongo` を使用しているので余計なのが含まれていますが、
重要なのは `ConfigureServices` で `AddHangfire` と `AddHangfireServer` する部分です。

## 終わりに

以上、Generic Host を使用した Hangfire Server の実装方法でした～。

（`Hangfire.NetCore` の存在に1年も気づけていなくて悔しい。）


## 追記（2020/04/10）

リポジトリに反映しました↓

https://github.com/yoh1496/hangfire-dotnet3.1/tree/host_builder
【Jenkins】ビルド失敗時のログをSlackに自動投稿する

# はじめに

<img width="709" alt="スクリーンショット 2020-04-03 15.54.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/1b15b1a1-4239-fb12-f787-33b0ba8310e6.png">

Jenkinsのビルドが失敗した時、ログから原因を特定して修正を行う必要があります。しかし、Jenkinsを社内のローカルサーバーで動かしている場合など、外部からアクセスできない場合がありました。そこで、今回はビルド失敗時のログを自動的にSlackに投稿する仕組みを作ったので、紹介したいと思います。


# 環境

- Windows 10 Home 1903
- Jenkins ver. 2.204.5

# 方法

## ビルド失敗時のトリガー

今回は[Parameterized Trigger plugin](https://plugins.jenkins.io/parameterized-trigger/)を使いました。これはパラメータを引継ぎつつ下流ジョブを動かすことができるプラグインです。ログを出力する際に必要がパラメーター渡しつつ、また発火の条件を指定することもできる(今回はビルド失敗時)ため、要件に合致していました。

<img width="850" alt="スクリーンショット 2020-04-03 15.36.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/70f0dc47-0d9d-c9dd-d8cb-04e62d7947ca.png">

参考: [開発者（個人）のためのJenkins - Parameter編](https://qiita.com/yasuhiroki/items/daff66ab18b315ae4298)

ちなみに下流ジョブでは受け取るパラメータを定義しておく必要がある点に注意です。

<img width="861" alt="スクリーンショット 2020-04-03 15.41.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/6947f671-5ba1-b4be-6974-40560ff0ac53.png">


## Jenkinsのビルドログを取得してutf8に変換する

下流ジョブのビルド/シェルの実行にて記述していきます。

```.bash
cd "${JENKINS_HOME}/workspace"

curl http://localhost:8080/all/job/${PROJECT_NAME}/${BUILD_NUMBER}/consoleText >${PROJECT_NAME}-${BUILD_NUMBER}.log
./convert.bat ${PROJECT_NAME}-${BUILD_NUMBER}.log
```

ビルドログの取得には`curl`コマンドを利用します。ビルドログは`http://[JENKINS_URL]/job/[JOB_NAME]/[BUILD_NUMBER]/consoleText`で取得できるため、上流ジョブから引き継いだパラメータを利用して加工します。そのままだと`concoleText`という名前で保存されてしまうので、今後のためにビルド情報を使った名前をつけておきます。

また、WindowsではShift-Jis形式になっていて不都合があるため、UTF8に変換しておきます。以下のバッチファイルを利用しました。

参考: [シフトJISのテキストファイルをUTF-8に変換するバッチ - 今日を乗り切るExcel研究所](https://www.shegolab.jp/entry/windows-conv-text-utf8)

(今回は出力ファイルで上書きされるように一部変更しています)

## Slackにログファイルをアップロードする

Slack APIを使ってファイルをアップロードします。ファイル操作の権限が必要なため、Slack Appの作成が必要になります。少し煩雑ですが、ドキュメントを参考に進めていけば難しく無いと思います。

参考: [Basic app setup | Slack](https://api.slack.com/authentication/basics)
参考: [files.upload method | Slack](https://api.slack.com/methods/files.upload)

curlコマンドを使って以下のようにアップロードできました(`CHANNEL_ID`と“ACCESS_TOKEN`は書き換えてください)

```.bash
curl -F file=@${PROJECT_NAME}-${BUILD_NUMBER}.log -F channels=[CHANNEL_ID] -H "Authorization: Bearer xoxb-[ACCESS_TOKEN]" https://slack.com/api/files.upload
rm ${PROJECT_NAME}-${BUILD_NUMBER}.log
````

参考: [Slack — APIに使う「チャンネルID」を取得する方法 - Qiita](https://qiita.com/YumaInaura/items/0c4f4adb33eb21032c08)

最後に`rm`コマンドでローカルからファイルを削除して終わりです。

# 最後に

宣伝ですが、MyDearest株式会社では新作VRゲーム[『ALTDEUS: Beyond Chronos（アルトデウス: ビヨンドクロノス）』](https://altdeus.com/)を開発中です。リリースされたぜひ遊んでください！

また、私のTwitter([@nkjzm](https://twitter.com/nkjzm))のフォローや「**LGTM**」もよろしくお願いします！
Nodeでmultipart/form-dataを送る

`form-data` を使う。

[form-data/form-data: A module to create readable `"multipart/form-data"` streams. Can be used to submit forms and file uploads to other web applications.](https://github.com/form-data/form-data)

## Axios

```js
const axios = require("axios");
const FormData = require("form-data");

const form = new FormData();
form.append("message", "hello");

const res = await axios.post(API, form, {
  headers: form.getHeaders()
});
```

## node-fetch

```js
const fetch = require("node-fetch");
const FormData = require("form-data");

const form = new FormData();
form.append("message", "helllo");

const res = await fetch(API, {
  method: "POST",
  body: form
});
```

### なぜ `node-fetch` はヘッダーで`getHeaders()`を利用しなくていいのか？

理由は単純で、`form-data`を特別に扱っている。
https://github.com/node-fetch/node-fetch/blob/c167190c6ee21234ba41bd8430700d4720bf64ce/src/body.js#L320-L323

```js
	// Detect form data input from form-data module
	if (body && typeof body.getBoundary === 'function') {
		return `multipart/form-data;boundary=${body.getBoundary()}`;
	}
```

さて、`multipart/form-data;`はいいにしても、`boundary`とはなんだろうか。
`boundary`とは、複数の情報を続けて送る際、データの仕切り線の役割を果たす。
`form-data`の実装を見ると、`-`が26文字、ランダムな数値が24字の50文字の仕切り線を生成する。

https://github.com/form-data/form-data/blob/d7026253e728af9568503dc3dc55cd1a566605e0/lib/form_data.js#L342-L351

```js
FormData.prototype._generateBoundary = function() {
  // This generates a 50 character boundary similar to those used by Firefox.
  // They are optimized for boyer-moore parsing.
  var boundary = '--------------------------';
  for (var i = 0; i < 24; i++) {
    boundary += Math.floor(Math.random() * 10).toString(16);
  }

  this._boundary = boundary;
};
```

これに`\r\n`を付加したものを区切りにする。
詳しくは、以下の記事に詳しい。

[いまさら聞けないHTTPマルチパートフォームデータ送信 - ＳＡＴＯＸのシテオク日記](https://satox.hatenadiary.jp/entry/20110726/1311665904)
Azure App ServiceでLaravelアプリのDocument rootでハマった件

## ※2022.3.8 追記
最近のバージョンだと変更があったようで、コメントを頂きました（@rana_kualuさんありがとうございますmm）
https://qiita.com/hisw/items/69a3529de7f9242e3f75#comment-0b3f657f0c8989b71dd9

## 背景
Azureを練習しようとGithubに上げている簡単なLaravelアプリをデプロイしようと試みる。
とりあえずApp ServiceでPHPの環境を作成し、デプロイセンターからGithubよりデプロイ。

## 問題発生
標準でDocument rootが/home/site/wwwrootになっているため、ソースをデプロイしてもうまくアクセスできず。（/home/site/wwwroot/publicを見てほしい）
Ubuntu環境のApacheで動いていることが分かったため、/etc/apache2/sites-available/にある000-default.confやdefault-ssl.confを見て「$APACHE_DOCUMENT_ROOT」を変えてみようとAzureのコンソール画面から『設定＞構成＞アプリケーション設定』で環境変数を設定してみるも、これも効かず。（SSHで入って環境変数↑をechoしてみると変更はちゃんと効いていたのに...）

## 解決した方法
正攻法か分かりませんが、Laravelアプリのソースに「.htaccess」置いて回避しました。
Nginx＋php-fpmの方に慣れていたのでこの方法に行きつくまでかなりかかりました...。

```
<IfModule mod_rewrite.c>
RewriteEngine on

RewriteRule ^.*$ /public/$1 [NC,L,QSA]
```
【Android】build.gradleからfastlaneでversionNameを取得する

# 概要
fastlaneでversionNameを使用したい時、build.gradleで管理しつつ、FastfileでもversionNameを使えるようにしたので議事録として記載

# build.gradle側の記載
```:app/build.gradle
apply plugin: 'com.android.application'
・・・
def versionMajor = 1
def versionMinor = 2
def versionPatch = 3

android {
    ・・・
    defaultConfig {
         ・・・
        versionName "${versionMajor}.${versionMinor}.${versionPatch}"
    }
```
それぞれバージョンを定義して、`defaultConfig`のversionNameで組み合わせる

# Fastfile側の取得処理
```:fastlane/Fastfile
platform :android do

  before_all do |lane, options|
  end

  ・・・

  lane :version_name do
    app_version_name = get_version_name
  end

  after_all do |lane, options|
    # laneの実行が成功した際に呼ばれる
    ・・・
  end

  error do |lane, exception, options|
    # laneの実行がエラーになった際に呼ばれる
    ・・・
  end
end

def get_version_name
  version_major = 0
  version_minor = 0
  version_patch = 0
  File.open("../app/build.gradle") do |file|
    file.each_line do |line|
      if line.strip.start_with?("def versionMajor")
        version_major = line.split("=")[1].strip.to_i
      elsif line.strip.start_with?("def versionMinor")
        version_minor = line.split("=")[1].strip.to_i
      elsif line.strip.start_with?("def versionPatch")
        version_patch = line.split("=")[1].strip.to_i
      end
    end
  end
end
```
文字列にする場合は、それぞれの変数を組み合わせる
`  "#{version_major}.#{version_minor}.#{version_patch}"`
versionNameを使いたいlaneで呼んであげる
アプリバージョンを上げる時はbuild.gradle側を更新するだけでfastlaneでも最新のversionNameを取得できる
Flask を用いたデータベースアプリケーション制作 Part1

# Flask による Web アプリケーション制作

アプリケーション開発に必要なコードや機能をまとめたライブラリを **アプリケーションフレームワーク**という。
本稿では、Python の Web アプリケーションフレームワークである **flask** を用いて、簡単なデータベース管理アプリケーションを制作してみた。

## 環境
macOS Catalina 10.15.1

## アプリケーションの実装内容
Flask の使い方を習得すべく3つのパートに分けた。

#### Part1(本稿)
* Web ブラウザの表示
* Templates フォルダの html ファイルと連結

#### [Part2(次稿)](https://qiita.com/keisuke-ota/items/b575f542bff6303ba4f1)
* データベース SQLite との連結
* Bootstrap を用いた画面表示

#### [Part3（次々稿）](https://qiita.com/keisuke-ota/items/3661035948d3d65df520)
* POSTメソッドを用いた新規ユーザー登録

## Part1のフォルダ構成

全てのコードは run.py によって実行される。

```
root
|--codes
| |--view.py
| |--templates
| | |--index.html
|--run.py
```

## Flask のインストールとコマンドの実行

Flask は次のコマンドでインストールする。

```terminal:ターミナル
pip install flask
```

ルートディレクトリにて、次のコマンドで run.py を実行する。

```terminal:ターミナル
python run.py
```

## Web ブラウザの表示
run.py のコードを以下に示す。コードに関する詳細は[こちら](https://methane.github.io/flask-handson/start.html)を参考にした。

```python:run.py
# codes/view.py にある app という変数を呼び出す。
# app には Flask モジュールが提供している flask クラスから作り出されたインスタンスが代入される。
from codes.view import app

# run.py がモジュールとして呼び出されたときは
# __name__ = run.py となり app は実行されない。
if __name__ == "__main__":
    app.run()
```

これにより、view.py で呼び出される app が実行される。 
次に view.py のコードを以下に示す。

```python:view.py
from flask import Flask

# Flask クラスから作成された インスタンスを app に代入する。
app = Flask(__name__)

#　「/」へアクセスがあった場合に、"Hello World"の文字列を返す。
#　この行が無いと Web に表示されない。
@app.route("/")

# hello 関数を定義する。インデントが戻るまでが関数に含まれる。
def hello():
    return "Hello World"

#　debug=True で、ソースコード書き換えのたびに app を実行しなくても確認できる。
if __name__ == "__main__":
    app.run(debug=True)
```

run.py のターミナル出力結果が以下のようになっていれば成功である。

```
 * Serving Flask app "app.app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```
上記の http://127.0.0.1:5000/ にアクセスすると 'Hello World' が表示される。

## Templates フォルダの html ファイルと連結
では、Templates フォルダの html ファイルをブラウザに表示させるように、view.py を編集する。

```python:view.py
#　render_template は HTML を表示させるための関数である。
from flask import Flask,render_template, 

app = Flask(__name__)

# /index へアクセスがあった場合に、templates/index.html を返す。
@app.route('/index')

# index 関数を定義する。'キカガク' は html 内の name に代入される。
def index():
	name = 'キカガク'
	return render_template('index.html', name=name)

if __name__ == "__main__":
    app.run(debug=True)
```
templates フォルダに 以下の index.html を作成する。
templates フォルダは view.py と同じ階層に作ること。template (単数形) のように綴りが異なると flask は読み取れずエラーが起こる。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content = "width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>Document</title>
</head>
<body>
	<hl>Flask チュートリアル</hl>
	<p>名前: {{name}}</p>
</body>
</html>
```

http://127.0.0.1:5000/index にアクセスして以下がブラウザに表示されていれば成功である。

```
Flask チュートリアル
名前: キカガク
```

## 参考
参考：[データ収集からWebアプリ開発まで実践で学ぶ機械学習活用ガイド](https://book.mynavi.jp/supportsite/detail/9784839969226.html) の chapter 3-5
Python,numpyの配列のコピー周りの挙動備忘録

pythonの標準配列は，=で複製できる．
ただし，これは参照渡しであるため，元の配列を変更するとコピーした配列も変更されてしまう．

```.py
>>> a = [1,2]
>>> b = a
>>> b
[1, 2]
>>> a[0] = 999
>>> a
[999, 2]
>>> b
[999, 2]
```

これは，以下のような場合においても同様である．

```.py
>>> a = [[1,2],[3,4]]
>>> b = a
>>> b
[[1, 2], [3, 4]]
>>> a[0][0] = 999
>>> a
[[999, 2], [3, 4]]
>>> b
[[999, 2], [3, 4]]
```

```.py
>>> a = [1,2]
>>> b = [3,4]
>>> c = [a,b]
>>> c
[[1, 2], [3, 4]]
>>> a[0]=999
>>> a
[999, 2]
>>> c
[[999, 2], [3, 4]]
```

これを防ぐには，ライブラリcopy.copyまたはcopy.deepcopyを使う．この際，copyをimportする必要がある．
copyは対象オブジェクトのみをコピーする．deepcopyはオブジェクト内のオブジェクトもコピーしてくれる．よって，1次元配列ではcopyで十分であるが，2次元配列の複製にはdeepcopyを用いる．

```.py
>>> import copy
>>> a = [1,2]
>>> b = copy.copy(a)
>>> b
[1, 2]
>>> a[0] = 999
>>> a
[999, 2]
>>> b
[1, 2]
```

```.py
>>> import copy
>>> # copyを使った場合
>>> a = [[1,2],[3,4]]
>>> b = copy.copy(a)
>>> b
[[1, 2], [3, 4]]
>>> a[0][0] = 999
>>> a
[[999, 2], [3, 4]]
>>> b
[[999, 2], [3, 4]]

>>> # deepcopyを使った場合
>>> a = [[1,2],[3,4]]
>>> b = copy.deepcopy(a)
>>> b
[[1, 2], [3, 4]]
>>> a[0][0] = 999
>>> a
[[999, 2], [3, 4]]
>>> b
[[1, 2], [3, 4]]
```

これはnumpyでも同様である．ただし，numpyの場合は2次元配列でもcopyで別の配列として複製できる．2次元配列自体が1つのnumpyのオブジェクトとなっているため？

```.py
>>> import numpy as np
>>> import copy
>>> # copyなし
>>> a = np.array(([[1,2],[3,4]]))
>>> b = a
>>> b
array([[1, 2],
       [3, 4]])
>>> a[0,0] = 999
>>> a
array([[999,   2],
       [  3,   4]])
>>> b
array([[999,   2],
       [  3,   4]])
>>> # copy(もちろんdeepcopyでもよい)
>>> a = np.array(([[1,2],[3,4]]))
>>> b = copy.copy(a)
>>> b
array([[1, 2],
       [3, 4]])
>>> a[0,0] = 999
>>> a
array([[999,   2],
       [  3,   4]])
>>> b
array([[1, 2],
       [3, 4]])
```

numpy配列の結合にはr_またはc_を使用することができるが，このときコピー先配列はコピー元とは独立した配列となる．以下のコードを参照．

```.py
>>> a = np.array(([[1,2]]))
>>> b = np.array(([[3,4]]))
>>> c = np.r_[a,b]
>>> c
array([[1, 2],
       [3, 4]])
>>> a[0,0] = 999
>>> a
array([[999,   2]])
>>> c
array([[1, 2],
       [3, 4]])
```

numpyの配列の単一行をcopyし，その部分をdeleteしてもコピー先の配列には影響しない．

```.py
>>> a = np.array(([[1,2],[3,4]]))
>>> b = a[0,:]
>>> b
array([1, 2])
>>> a = np.delete(a,0,0)
>>> a
array([[3, 4]])
>>> b
array([1, 2])
>>> a[0,0] = 999
>>> a
array([[999,   4]])
>>> b
array([1, 2])
```
【今日のアブストラクト】MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications【論文 DeepL 翻訳】

1 日 1 回 論文の Abstract を DeepL 翻訳の力を借りて読んでいきます.

この記事は自分用のメモみたいなものです.
ほぼ [DeepL](https://www.deepl.com/home) 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications](https://arxiv.org/abs/1704.04861)

# Abstract

### 訳文

モバイルおよび組み込みビジョンアプリケーションのための MobileNets と呼ばれる効率的なモデルのクラスを提示する. MobileNets は, 軽量なディープニューラルネットワークを構築するために, 深さ方向に分離可能な畳み込みを使用する合理化されたアーキテクチャに基づいている. 待ち時間と精度を効率的にトレードオフする $2$ つのシンプルなグローバルハイパーパラメータを導入する. これらのハイパーパラメータにより, モデル構築者は, 問題の制約に基づいてアプリケーションに適したサイズのモデルを選択することができる. リソースと精度のトレードオフに関する広範な実験を行い, ImageNet 分類における他の一般的なモデルと比較して性能が優れていることを示す. 次に, 物体検出, 細粒度分類, 顔属性, 大規模ジオローカリゼーションを含む幅広いアプリケーションやユースケースにおいて, モバイルネットの有効性を実証する.


### 原文

We present a class of efficient models called MobileNets for mobile and embedded vision applications. MobileNets are based on a streamlined architecture that uses depth-wise separable convolutions to build light weight deep neural networks. We introduce two simple global hyper-parameters that efficiently trade off between latency and accuracy. These hyper-parameters allow the model builder to choose the right sized model for their application based on the constraints of the problem. We present extensive experiments on resource and accuracy tradeoffs and show strong performance compared to other popular models on ImageNet classification. We then demonstrate the effectiveness of MobileNets across a wide range of applications and use cases including object detection, finegrain classification, face attributes and large scale geo-localization.
Rustのstd::rc::Rcってなんなのさ

# はじめに
今日もRustのコードを読んでいたら，

```rust
struct MediaChannel {
    ...
    metadata: Option<Rc<StreamMetadata>>,
    ...
}
```

`Rc<T>`みたいなやつが出てきて，役割とか使い方とか色々とわからなかったので調べてみました。

# `Rc<T>`とは

「[プログラミング言語Rust](https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/choosing-your-guarantees.html)」によると，
> Rc<T> は参照カウンタを持つポインタです。 言い換えると、これを使えば、あるデータを「所有する」複数のポインタを持つことができるようになるということです。そして、全てのポインタがスコープから外れたとき、そのデータは削除されます（デストラクタが実行されます）。

と書いてあります。

## どういうことなのか説明

「[プログラミングRust](https://www.oreilly.co.jp/books/9784873118550/)」も参考にしていますが，

### 所有権

まず前提として，Rustのほとんどの値は唯一の所有者を持ちます。
Rustではこの**所有権**システムによってメモリ管理をしています。

Rustで値がメモリに保管されるとき，その値は変数に格納されています。
そして，その変数のことを値の所有者とみなします。
Rustにはスコープの概念があり，変数がそのスコープから外れたとき，その変数は所有権を失って自分の所有している値をメモリから開放します。

しかし，この「値一つに対して所有者が一つ」のシステムだけでは不便なときがあります。
例えば，`値A`を使っているすべてのものが使い終わるまで`値A`には生存しててほしいタイミングなどです。

こういうときに役立つのが`Rc<T>`です。

### 参照カウンタ
Rcは**Reference Counter**の略で，**参照カウンタ**とも呼ばれます。
ひとつコードを例にあげます。

```rust
use std::rc::Rc;

fn main() {
    let s: Rc<String> = Rc::new("Live".to_string());
    let t = s.clone();
    let u = s.clone();
}
```

最初の変数`s`には，**ヒープ**に保存されている`String`に対する参照が格納されています。
その後の行では，変数`s`をクローンしてそれぞれ変数`t`， `u`を作っています。
`s`， `t`， `u`はそれぞれ**スタック**に保管されており，いずれも**ヒープ**に保存されている`String`を参照しています。
ちなみにその`String`は，また別の場所にある`"Live"`という文字列型のデータを参照しています。

さて，ためしにRcポインタに所有される文字列の最後に何らかのテキストを追加してみます。

```rust
use std::rc::Rc;

fn main() {
    let s: Rc<String> = Rc::new("Live".to_string());
    let t = s.clone();
    let u = s.clone();
    
    s.push_str(" forever")
}
```

しかし，このコードに対してRustのコンパイラはエラーを吐いてしまいます。
※Rust Playground調べ

```bash
error[E0596]: cannot borrow data in an `Rc` as mutable
 --> src/main.rs:8:5
  |
8 |     s.push_str(" forever")
  |     ^ cannot borrow as mutable
  |
  = help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `std::rc::Rc<std::string::String>`
```

Rustは，Rcポインタから参照されているものは共有されるものと判断するので，不変であるべきだと判断するみたいです。

この`std::rc::Rc`は他の言語にも出てくる参照カウンタと同じような感じみたいです。

# まとめ
`std::rc::Rc`を使うと所有権システムとは違った変数の生存期間を作ってあげることができます。
それは，複数の変数で所有権を共有することで成り立たせることができます。
また，共有された値はコンパイラによって不変と判断されます。

なかなかドキュメントを読んだだけだと実際に上手に使えない所有権システムたちですが，がんばって理解していこうと思います。

# 参考リンク
> https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/choosing-your-guarantees.html
> https://doc.rust-lang.org/std/rc/struct.Rc.html
> https://qiita.com/ksato9700/items/312be99d8264b553b193

# 参考文献
> https://www.oreilly.co.jp/books/9784873118550/
ドメイン取得せずにEC2（Amazon Linux 2）でLet's EncryptのSSL証明書発行したらどうなるか試したらやっぱり失敗する

タイトル通りなんですけど、試してみたらやっぱり発行できないです。
やったことをつらつらと書いていきます。

#EC2はAmazon Linux 2で立てた

とりあえずEC2サーバを立てました。
OSはAmazon Linux 2です。
セキュリティグループは以下に設定。
certbotを使用するので、ちゃんとHTTP（80）ポート開けてます。

| タイプ | プロトコル | ポート | ソース |
|:--|:--|:--|:--|
|HTTP|TCP|80|0.0.0.0/0|
|SSH|TCP|22|{自分のIP}|
|HTTPS|TCP|443|0.0.0.0/0|

#cerbotを使用して証明書発行する

https://certbot.eff.org
cerbotのサイト見るとサーバのソフトウェアとOS選ぶことになるんですけど、OSにはAmazon Linux 2がないわけです。
Amazon Linux 2ってどうすればいいんだと、ここで壁が立ちはだかります。

<img width="500" alt="Amazon Linux 2がない.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111111/5335c313-495a-9c15-a170-d3312b03a22b.png">


##Amazon Linux 2はRHEL 7ベースらしい

いろいろ調べてみるとRHEL 7ベースらしいです。
Amazon LinuxはRedHat準拠なんですね。
あとで出てきますがcerbotインストールするにはEPELリポジトリを有効化する必要があるのですが、以下をみるとAmazon Linux 2はRHEL 7と同じコマンドみたいです。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-enable-epel/

##ソフトウェアはNon of the above、OSはCentOS/RHEL 7で手順を実行する

https://certbot.eff.org/lets-encrypt/centosrhel7-other
この順位従って証明書を発行していきます。

###SSHログイン

SSHでEC2に接続します。

```sh:ログイン
ssh -i {キーペア証明書のパス} ec2-user@{パブリックDNS}
```

###EPELリポジトリのインストールと有効化

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-enable-epel/
上記に方法が書いてありましたので以下を実行しました。

```sh:EPELリポジトリのインストール
sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum-config-manager --enable epel
```

###Optionalチャンネルを有効化

```sh:Optionalチャンネルを有効化
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
```

###スタンドアロンで発行

今回はまだサーバ立ててないのでスタンドアロンで発行します。
そして本番環境使用するのも申し訳ないのでLet's Encryptのステージング環境を利用します。
--dry-runとつけるとステージング環境をしようするそうです。

```sh:証明書を発行
sudo certbot certonly --standalone --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): 
```

ドメインを聞かれるのでパブリックDNSのドメインを記載しました。
すると以下のエラーが発生しました。

```sh:エラー発生
Obtaining a new certificate
An unexpected error occurred:
The server will not issue certificates for the identifier :: Error creating new order :: Cannot issue for "xxxxxxxxx.compute.amazonaws.com": The ACME server refuses to issue a certificate for this domain name, because it is forbidden by policy
Please see the logfiles in /var/log/letsencrypt for more details.
```

このドメインは発行できないってことみたいです。

#ちゃんとしたい場合はドメインを取得しようね

そういうことですね。
ドメインを取得しない場合は素直にオレオレ証明書を発行しようと思います。
またはNode.jsであればHeroku使っちゃえば証明書発行せずにHTTPS使えるのでそっちですね。
Happy Number

20200403
Write an algorithm to determine if a number is "happy".

A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers.

Example: 

```
Input: 19
Output: true
Explanation: 
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
```
Javascript:

```js:
/**
 * @param {number} n
 * @return {boolean}
 */
var isHappy = function(n, counter=0) {
    result = false;
    if(counter < 20){
        //切割n并算出各个位置上数字平方后存入array数组
        const array = n.toString().split("").map(n => n*n);
        //数组单位加和，参数：初始值，最终值，初始Index：0
        const sum = array.reduce((a, b)=> a + b, 0);
        
        if (sum ===1 ){
            result = true;
        } else {
            counter++;
            isHappy(sum, counter);
        }
        
        return result;
        
    }
};
```

sample 44 ms submission
Setを活用したバージョン

```js:
/**
 * @param {number} n
 * @return {boolean}
 */
var isHappy = function(n) {
  let seen = new Set();
  let current = n;
  
  while(true) {
    current = String(current).split('').reduce((acc, number) => (acc + Number(number)**2), 0)
    if(current === 1) {
      return true;
    } else if(seen.has(current)) {
      return false;
    } else {
      seen.add(current)
    }
  }
};
```
GatsbyでFeatherIconsを使う方法

Gatsbyでアイコンフォントを使うときのメモ。

## 使い方
アイコンフォントをインストールする。

```
npm install feather-icons --save
```

yarnの場合

```
yarn add feather-icons
```

コンポーネント内でインポート。

`{feather.icons.facebook.toSvg()}`だけだとHTMLがエスケープされて表示されるので注意。

```react
// src/components/header.js
import React from "react"
import { Link } from "gatsby"
import feather from 'feather-icons'

const Header = () => {
  return (
<header id="header">
  <div className="container">
    <h1 className="logo">サイトタイトル</h1>
    <nav className="header-menu">
      <ul className="nav">
        <li><Link to="/about">メニュー</Link></li>
        <li>
          <Link to="/facebook-url">
            <div dangerouslySetInnerHTML={
              { __html: feather.icons.facebook.toSvg({width: 15,height: 13}) }
            } />
          </Link>
        </li>
      </ul>
    </nav>
  </div>
</header>
  )
}

export default Header
```

### utilを使う場合
utilにコード入れて関数呼び出しの方が便利

```js
// src/utils/feather.js
import React from 'react';
import feather from 'feather-icons';

export default (name, sizeArray) => {
  const featherString = feather.icons[name].toSvg({
    width: sizeArray[0],
    height: sizeArray[1]
  });
  return <div dangerouslySetInnerHTML={{ __html: featherString }} />;
};
```

コンポーネントで呼び出し

```react
// src/components/header.js
import React from "react"
import feather from '../utils/feather';

const Header = () => {
  return (
<header id="header">
  {feather('facebook', ['30', '30'])}
</header>
  )
}
export default Header
```
Terraform backendにS3を指定する方法

#Terraform のtfstateをs3で管理して複数人での開発に対応できるようにします

環境
プロバイダー：AWS
Terraform：ver 0.12.0

---
tfstateファイルは、terraform applyを実行した後のプロバイダーの状態が保存されています。

このファイルをチーム内でバラバラに関していると、プロバイダーの最終設定が分かりにくくなるので、S3のバケットに保存して、変更内容を統一して管理できるようにします。

手順としては、事前にtfstateファイル保存用のバケットを手作業（AWSマネジメントコンソール
）で作成しておきます。
そして terraform.tf のファイルを以下の様に記述します。（バケット名は世界で１つの名前にしてください）


```tf:terraform.tf
terraform {
#チーム開発時はTerraformのバージョンを一致させます。
#（バージョンが少しでも違うとapplyできなかったりします）
  required_version = "= 0.12.0" 

  backend "s3" {
    bucket  = "{tfstateファイル保存用のバケット名}"
    key     = "terraform.tfstate"
    region  = "ap-northeast-1"
    profile = "saml"
  }
}
```

あとは、terraform init コマンドを実行すれば、指定したs3のバケット内にtfstateファイルが生成され、今後はそこでファイルの更新が行われます。
これで常に、最後にapplyした状態がtfstateファイルに保存されるようになります。
（resource で保存用のバケットを定義してinitする方法もあるみたいです）

参考ページ
https://qiita.com/sinshutu/items/7d3cc7438871c50ea63c
Redmine4.0→4.1でのプラグイン対応状況を確認した

Redmine 4.0で使用していたプラグインを4.1へ移行した際の対応状況です。

確認した環境

```
Environment:
  Redmine version                4.1.0.stable.19639
  Ruby version                   2.5.5-p157 (2019-03-15) [x86_64-linux]
  Rails version                  5.2.4.2
  Environment                    production
  Database adapter               PostgreSQL
```


|プラグイン|バージョン|4.1対応|※|備考|
|:----------------|:----------------:|:-----:|:-----:|:-----|
|[full_text_search](https://github.com/clear-code/redmine_full_text_search)|1.0.4|○|○||
|[group_watchers](https://github.com/wenzhixin/redmine_group_watchers)|0.0.1|○|○||
|[redmine_absolute_dates](https://github.com/suer/redmine_absolute_dates)|0.0.4|○|○||
|[redmine_banner](https://github.com/akiko-pusu/redmine_banner)|0.3.1|○|○||
|[redmine_code_review](https://github.com/haru/redmine_code_review)|1.0.0|○|○||
|[redmine_issue_templates](https://github.com/akiko-pusu/redmine_issue_templates)|1.0.1|○|○||
|[redmine_jstoolbar_ext](https://github.com/tleish/redmine_jstoolbar_ext)|0.2.1|○|○||
|[redmine_jstoolbar_ext_buttons](https://github.com/tleish/redmine_jstoolbar_ext_buttons)|0.2.1|○|○||
|[redmine_persist_wfmt](https://github.com/pinzolo/redmine_persist_wfmt)|2.0.1|○|○||
|[redmine_searchable_selectbox](https://github.com/ishikawa999/redmine_searchable_selectbox)|0.1.0|○|○||
|[redmine_vividtone_my_page_blocks](https://github.com/vividtone/redmine_vividtone_my_page_blocks)|2017/07/05|○|○||
|[redmine_wiki_extensions](https://github.com/haru/redmine_wiki_extensions)|0.9.1|？|△|タブの除去ができない|
|[redmine_wiki_index_tree_view](https://github.com/basyura/redmine_wiki_index_tree_view)|0.0.1|○|○||
|[redmine_wiki_lists](https://github.com/tkusukawa/redmine_wiki_lists)|0.0.9|○|○||
|[redmine_wiki_page_tree](https://github.com/ledsun/redmine_wiki_page_tree)|0.0.2|○|○||
|[redmine_work_time](https://github.com/tkusukawa/redmine_work_time)|0.4.0|○|○||
|[redmine_xls_export](https://github.com/two-pack/redmine_xls_export)|0.2.1.t11|○|△|RedMica、trunkではfeaturesブランチを使用|
|[view_customize](https://github.com/onozaty/redmine-view-customize)|2.6.0|○|○||



※は以下の環境で確認

trunk

```
Environment:
  Redmine version                4.1.0.devel.19640
  Ruby version                   2.5.7-p206 (2019-10-01) [x86_64-linux]
  Rails version                  5.2.4.2
  Environment                    production
  Database adapter               PostgreSQL
```

RedMica

```
Environment:
  RedMica version                1.0.1.devel.fd41858 (based on Redmine 4.1.0.devel)
  Ruby version                   2.5.7-p206 (2019-10-01) [x86_64-linux]
  Rails version                  5.2.4.2
  Environment                    production
  Database adapter               PostgreSQL
```

ほぼ問題ないですが、今後、古いプラグインはgemのバージョン依存などでインストールできないものが増えていくと思われます。
メンテナンスしていただけているプラグインの作者には感謝することしきりです。

なお、Lychee Redmineの`2020/04/02`リリース分は4.1/trunk/RedMicaで問題なく起動していることを追記いたします。
.Net Core 3.1でlog4netを使ってみた

#はじめに
.Net Frameworkも4.8が最後のバージョンで 、.Net Coreの後継である.Net5がメインストリームになるようです。そろそろ、.Net Coreについて調べてみるかということで、まず、 ログの出力方法について調べてみました。

ASP .Net Coreでは、標準でILoggerというインターフェースが用意されています。
コンソールへの出力やイベントログへの書き込み等標準で用意されているようですが、やっぱり使い慣れたlog4netを使いたいです。

#前提条件
log4netライブラリを直接使用することもできるようですが、やはりお作法に従いたいのと.Net Coreが出力するログ等もlog4netで出したいので、ILoggerの拡張機能を使用します。

#ASP .Net Core プロジェクトにlog4netを追加
以下の拡張ライブラリをNuGetで追加します。

Microsoft.Extensions.Logging.Log4Net.AspNetCore

log4netの設定ファイルをプロジェクトに追加します。
log4net.config　（デフォルト名）

**.Net Core3.1では、log4net.configでファイルのパスに${特殊フォルダ}が使えません。クロスプラットフォームだからだよね？** 

log4netを使用するようにコードを変更します。

```c#:Program.cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
//log4netロギングプロバイダを追加。（デフォルトのプロバイダは削除）
    .ConfigureLogging((hostingContext, logging) =>
    {
        logging.ClearProviders();
        logging.AddLog4Net();
    })
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup<Startup>();
    };
```

ログ出力レベルの設定は、以下のファイルが優先されます。
このファイルですべて出力にしておいて、log4net.configで制御するのがいいと思います。

```json:appsettings.json
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
```

ASP .Net Core プロジェクトのサンプルコントローラーにログを追加してみます。

```c#:WeatherForecastController.cs
private readonly ILogger<WeatherForecastController> logger_;

//コンストラクタでILoggerのインスタンスを受け取ります。
public WeatherForecastController( ILogger<WeatherForecastController> logger)
{
   logger_ = logger;
}

[HttpGet]
public IEnumerable< WeatherForecast> Get()
{
//ログを出力します。
    logger_.LogInformation("Get was called.");
...
}
```

#最後に
こうしておくと、log4netが使えない時に切り替えも簡単でいいですね。
設定ファイルがappsettings.jsonとlog4net.configと２つになるので、切り替えるときは注意が必要ですが。
Webpackをとことん調べながら技術ブログを作る(環境設定+HTML+CSS+EJSorPUG+markdown)

webpackの勉強がてらwordpressからの乗り換えで静的な技術ブログを作ってます。

https://js.akirumade.com/webpack-media/

詳細はせっかくなので記事の方を見てもらいたいのですが、qiitaならコマンドをまとめて掲載しておけばツッコミいれてくれるかなっと期待してのせます。

※2020-04-13 EJSとMarkdownを追加しました。

# まとめ
```
$ npm init
$ npm i webpack webpack-cli @webpack-cli/init webpack-dev-server html-loader css-loader style-loader
$ npx webpack-cli init --auto
$ npm i ejs-html-loader markdown-loader
$ touch webpack.config.js
$ npm run start
```

```webpack.config.js
const TerserPlugin = require('terser-webpack-plugin');
const HtmlwebpackPlugin = require("html-webpack-plugin");

module.exports = {
  plugins: [
    new HtmlwebpackPlugin({
      template: `./index.ejs`,
      filename: 'index.html'
    })
  ],
  module: {
    rules: [
      { test: /\.html$/, use: ['html-loader'] },
      { test: /\.css$/, use: ['style-loader', 'css-loader'] },
      { test: /\.ejs$/, use: ['html-loader', 'ejs-html-loader'] },
      { test: /\.md$/, use: ['html-loader', 'markdown-loader'] }
    ]
  },
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin()]
  }
}
```

```html:index.ejs
<html>
  <body>
    <%- include('./parts-header') %>
    <% const md = require('./Markdown.md'); %>
    <%= md %>
  </body>
</html>
```
```html:./parts-header.ejs
<div class="header">
  記事一覧
</div>
```
```md:./Markdown.md
# 記事タイトル
 
- LI
- LI
```

## pugの場合

pugを利用する場合はejsの代わりにpugとpug-loaderを利用します。

```
$ npm i pug pug-loader markdown-loader
$ npm run build
```
```js:webpack.config.js
module.exports = {
  plugins: [
    new HtmlwebpackPlugin({
      template: './index.pug',
      filename: 'index.html',
    })
    // :
  ],
  module: {
    rules: [
      //pug
      { test: /\.pug$/, use: ['html-loader', 'pug-loader'] }
    ]
  },
  // :
};
```
```pug:index.pug
<!DOCTYPE html>
html(lang="ja")
  head
    meta(charset="UTF-8")
    meta(name="viewport", content="width=device-width, initial-scale=1.0")
    title Document
  body
    include ./parts-header.pug
    - var md = require('./Markdown.md');
    | !{md}
```
```pug:./parts-header.pug
.header
 | 記事一覧
```




以下の内容に続きます。
(2) 記事用MarkdownからHTML一括生成
(3) GitHub Actionsで自動化してhostingにデプロイ
(4) AMPとかsitemapとか構造化の対応