OmniAICreator/Qiita-1.07M huggingface dataset:
zubeというタスク管理ツールを使ってみて特徴とか感想とか

# はじめに
プロジェクトでzubeというタスク管理ツールを使っているのですが、紹介もかねて使ってみた所感や特徴を書きたいと思います。

無料で使えるプランもありますので、是非見てみてはいかがでしょうか。

# zubeとは
アジャイル開発に特化した、タスク管理ツールです。特にスクラム開発に力を発揮してくれるでしょう。
Web上で動くので、手軽に利用ができます。

ただ現状(2019年1月)、GoogleかGitHubアカウントでしかログインができないようです・・・。

![zube.png](https://qiita-image-store.s3.amazonaws.com/0/290687/aa9cd3c8-a64b-d07f-1e31-dea6b2336815.png)
[zube.io](https://zube.io/)

# 特徴
## 多様な分析チャートが使える
zubeではスプリントごとに様々なチャートが使えるようになっています。

例えば、バーンダウンチャート・バーンアップチャートなど。
![zube.png](https://qiita-image-store.s3.amazonaws.com/0/290687/2f284fd5-c627-2207-0e44-d12d7cb43fb5.png)

見た目もシンプルで結構おしゃれな感じです。
![zube.png](https://qiita-image-store.s3.amazonaws.com/0/290687/af18d138-4988-34ef-4aee-888f69f5f56d.png)
*https://github.com/marketplace/zube*

## Slackと連携
slackと連携ができます。
カードの担当者が自分になった時など、通知が来るのですが、それをslackで受け取ることができるみたいです。

## おしゃれな見た目
見た目が結構シンプルで気に入っています。優先度ごとに色分けできて、カラフルな見た目に出来ます。
またlabelも作ることができ、BacklogやReadyなども自分で変えることができます。

![zube.png](https://qiita-image-store.s3.amazonaws.com/0/290687/e3d02313-9bd7-1917-20e5-01c462345eb7.png)

## 料金
[zube料金](https://zube.io/pricing)

今のところ(2019年1月)プロジェクトが4つまで、ユーザー4人までなら無料で使えます。
ビジネスプランだと10$/月で無制限で使えるようです。また30日間の無料トライアルが使えるようです。

エンタープライズ版だとContact Usとなっていますので、規模によって変化するのでしょうか。

# おわりに
今のところ表示がすべて英語なので、少し見づらいですが、他には特に不満点はなかったです。
ラベルなどはもちろん日本語が使えます。

制限はありますが、無料で使えるというのもうれしいポイントです。
まだまだ知名度が低いと思うので、もう少し広がっていったらいいなと思います。
three.jsのOrbitControlsをTypescriptで使う方法

詰まったのでメモ。

webpack + three.jsで開発していたので、htmlに `<script src="js/controls/OrbitControls.js"></script>` とは書きたくなかったので、なんとかしてnpmパッケージで解決した。

[three-orbitcontrols-ts](https://www.npmjs.com/package/three-orbitcontrols-ts)をインストールする。

```sh
$ yarn add three-orbitcontrols-ts
```

`three-orbitcontrols` をインストールすると、`@types/three-orbitcontrols` が存在しないので型チェックができないため、最初から `three-orbitcontrols-ts` を入れてしまうのが良さそう。

tsファイルでインポートして使用する。

```index.ts
import * as THREE from "three";
import { OrbitControls } from "three-orbitcontrols-ts";

const init = () => {
  const width = window.innerWidth;
  const height = window.innerHeight;

  // レンダラーを作成
  const renderer = new THREE.WebGLRenderer({
    canvas: document.getElementById("myCanvas") as HTMLCanvasElement
  });
  renderer.setSize(width, height);

  // カメラを作成
  const camera = new THREE.PerspectiveCamera(50, width / height);
  camera.position.set(0, 0, 1000);
  const controls = new OrbitControls(camera, renderer.domElement);
  controls.update();
  ...
};

window.addEventListener("DOMContentLoaded", init);

```

[three-orbitcontrols-ts](three-orbitcontrols-ts) が2年近くメンテナンスされていないのが心配だけれど、 `@types/three-orbitcontrols` が出るまではしばらく使っていきたい。
develop, testグループにあったgemを調べてみた(メモ)

# この記事について
塩漬けになっている、develop, test用のgemたちを調べてみました。

# 前置き
Railsを書いていると、デバックやテストをちょっと便利にしたいなぁという思いで、gemを追加してしまうことがあると思います。
しかし、いざ追加して使っても、ワークフローに結局入らず、塩漬けになっているようなgem達がいると思います。
もしくは、今の僕のように過去の先輩達が入れたgemを使ってないわぁ〜って人もいると思います。

ということで、ちょっと自分が使っていないけど、なぜか入っている develop, testグループのgemをちょっと残しておきます。

# develop, testに入っていたgemたち

```
 　gem 'shoulda-matchers' # validationなどのcallback関数とか、rspecを書くと長くなっちゃうやつをワンライナーでかける
  gem 'web-console' # ブラウザでconsoleを表示できる
  gem 'bullet' # n+1を発見するgem
  gem 'letter_opener' # ブラウザでメールを確認できる
  gem 'dotenv-rails'  # dotenv をrailsで使いようにしてくれる
  gem 'rubocop', require: false # rubocop require: false を指定しておくと自動requireされない
  gem 'therubyracer' # jsを動かしているv8というエンジンをrubyから触る
  gem 'derailed' # to measure using memory because heroku memory is overflowed 
  gem 'stackprof' # メソッドにかかる時間を調べてくれる　[Ruby/Railsでの高速化の際に使うgem達](https://qiita.com/awakia/items/248340b341f335efde16)
  gem 'spring-commands-rspec' # springを使用してrspecを起動する
  gem 'rails-erd' # erd図を自動で作ってくれる
  gem 'hirb' # `rails c` でmodelかrデータを引っ張ってくる時に綺麗に表示してくれる
  gem 'hirb-unicode' # hirbで使うっぽい
  gem 'database_cleaner' # dbをrollbackしたりできるっぽいが使い所はわからない

```
Flutterクラス間の値の受け渡し


```dart:main.dart

class _MyPageState extends State<MyPage> {

//省略

//受け渡したい変数
final String watashitai;

  Widget _buildListItem(BuildContext context, DocumentSnapshot document) {
    return Card(
      child: Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
        
       //渡したい変数を引数に指定する
        ImageUrl(imageUrl: watashitai)

      ]),
    );
  }
}

class ImageUrl extends StatelessWidget {

//受け取る値を代入する変数を定義
  final String imageUrl;

//受け取る値を上記の変数に代入
  ImageUrl({this.imageUrl});

}

```


_MyPageStateクラスで定義されている変数watashitaiをImageUrlクラスでも使えるようにしている。

#詳細

以下の行の内容。
渡すクラス(渡した時に代入したい変数 :  渡したい変数)

```dart:main.dart
ImageUrl(imageUrl: watashitai)
```

以下の1行目で変数定義。
2行目でコンストラクタを使いimageUrl変数に受け取る値を代入している。

```dart:main.dart
//受け取る値を代入する変数を定義
  final String imageUrl;

//受け取る値を上記の変数に代入
  ImageUrl({this.imageUrl});
```

これでimageUrlの中に別クラスにあったwatashitai変数が代入されて、別クラス間での値の受け渡しができた。
スクラムの堂々とコミットできないメリット

ここ最近のプロジェクトはスクラムをベースに行っている。

そこで、社内の抵抗勢力や、普通になぜいいのか疑問に思ってる人たちに、コミットはできないんだけども、ほとんどの場合、起こり得る伝えたいメリットがあるので説明したい。

ありきたりながら以下の2つが思い当たる。

- チームメンバーの成長
- 別次元の開発スピードの向上

チームメンバーの成長は、機能やシステムのレイヤーではっきりとした担当者を決めない、開発した全てに対してメンバー全員が責任を持つ、という2点で達成する。

開発スピードの向上は、レトロスペクティブなどにより、短い（覚えてる）期間内でPDCAが回ることで、着々と開発の無駄が発見され、改善されることによるものだと思う。

なぜ今までに語り尽くされたことをわざわざここを書いたかと言うと、別に開発手法の変化ごときで変わる事などさして多くない、仕様変更がなければ今まで通りの開発でいいじゃんってなる人たちに伝えたい事だからだ。

確かに開発フェーズの変更という考え方の話なら仰る通り、変化に対応できる反応が良くなるだけで、仕様変更が起きないならむしろ遅くなる場合もあるし、新しい取り組みを行うメリットは少ないと思う。

ただ実際には変化に対応するために、クロスファンクショナルや、整ったドキュメントよりコミニュケーションを重視するなど、**働き方**に関わる変化が必要となる。これがプラクティスとして議論され改善されてきている事で従来の手法では達成できない違いが出てくるのである。

そんなことは今までの方法でもやれるし、やるべきことだ、やっていると言う反論がこの後よくくる。
そりゃそうだと思う。

ただ従来のウォーターフォールなどの方法は、開発メンバーの変化等に対応することを前提としたものであるため、少なくともここで書いた内容はなかなか実践しづらく、どこかでごまかしが発生しているはずである。

この2つの効果が恒久的に出続けるとしたら？
従来の手法だけでやっていると最終成果物の完成度や、顧客満足度に影響しないのだろうか？
短絡的に絶対コミットできる内容だけ追いかけると、達成しえない世界があるのではないだろうか？
PyWaveletを使ったDWTへの入り口（2）

# はじめに
-  前回はPywaveletでウェーブレットObjectを作るまで
-  今回は実際にDWTを実装


# 1次のDWT（深さ1のDWT）
とりあえずDWTとIDWTを実装してみる。
簡単のためまずHaarウェーブレットで実装。（1次のDaubechiesウェーブレットはHaarウェーブレットと同じらしい）

```python
import pywt

a = [1,2,3,4,5,6,7,8]
(cA,cD) = pywt.dwt(a,'db1')
# cA = array([ 2.12132034,  4.94974747,  7.77817459, 10.60660172])
# cD = array([-0.70710678, -0.70710678, -0.70710678, -0.70710678])

b = pywt.idwt(cA,cD,'db1')
# b = array([1., 2., 3., 4., 5., 6., 7., 8.])

```
確かにできてる。

cAは近似係数（Approximation Coefficients)、cDは詳細係数(Detail Coefficients)。
近似係数は隣り合う数の平均に$\sqrt2$をかけたもの。
詳細係数は隣り合う数の差分を$\sqrt2$で割ったもの。
なぜ$\sqrt2$をかけたり割ったりしてるかは不明。。。

# 多重解像度分析
深さを増やしていく。pywt.wavedecを使ってウェーブレット変換する。
何次のDWTまでできるか（深さはどれくらいか）はpywt.dwt_max_levelによって計算。

```python
Coeffs = pywt.wavedec(a,'db1')
# Coeff = [array([12.72792206]),
#          array([-5.65685425]),
#          array([-2., -2.]),
#          array([-0.70710678, -0.70710678, -0.70710678, -0.70710678])]

depth = pywt.dwt_max_level(len(a),len(pywt.Wavelet('db1')))
# depth = 3
```
深さ3でDWTができた。
DWTの最大次数は下の式で導出できるらしい。

$$ maxlevel = \left[ log_2{\frac{datalength}{filterlength-1}}\right]$$

今回はdatalengthが8、filterlengthが2なので最大次数は3。
ちなみに[]がガウス記号。

# 終わりに

- 離散ウェーブレット変換を実装した
Jekyll と .NET Core 入りの Docker イメージを作る

Jekyll の Docker イメージは

* [jekyll-docker/Dockerfile · envygeeks/jekyll-docker](https://github.com/envygeeks/jekyll-docker/blob/1169ef74095e20bc5a242b4e32ae4d76e6388c42/repos/jekyll/Dockerfile)

のように alpine Linux がベースなので、 .NET Core の alpine系の Docker イメージを探してきて、それをマネる。

* [dotnet-docker/Dockerfile at master · dotnet/dotnet-docker](https://github.com/dotnet/dotnet-docker/blob/3ee66051f7d279ee1c5036846659ac2a988cb756/2.2/runtime/alpine3.8/amd64/Dockerfile)

するとこんな感じになりました。

**Dockerfile**

```yml
FROM jekyll/jekyll:3.8.4
  
# Install .NET Core
ENV DOTNET_VERSION 2.2.1

RUN wget -O dotnet.tar.gz https://dotnetcli.blob.core.windows.net/dotnet/Runtime/$DOTNET_VERSION/dotnet-runtime-$DOTNET_VERSIO
N-linux-musl-x64.tar.gz \
    && dotnet_sha512='f76f8650aae126b2cdf55cce200d6400137288f5c0688e314575273ab9f87f364d06dcf0992524d8d6a127485ec11f8f6e9586a5
b47604bf1f6396748b3e7fca' \
    && echo "$dotnet_sha512  dotnet.tar.gz" | sha512sum -c - \
    && mkdir -p /usr/share/dotnet \
    && tar -C /usr/share/dotnet -xzf dotnet.tar.gz \
    && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
    && rm dotnet.tar.gz
```

``netcore_jekyll`` という名前の Docker イメージを作成する。

```bash
 docker build -t netcore_jekyll .
```

Docker コンテナを作成＆実行して Bash に入る

```bash
docker run -it netcore_jekyll sh
```

Jekyll と .NET Core のバージョン確認

```bash
/srv/jekyll # jekyll -v

ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux-musl]
jekyll 3.8.4


/srv/jekyll # dotnet --info

Host (useful for support):
  Version: 2.2.1
  Commit:  878dd11e62

.NET Core SDKs installed:
  No SDKs were found.

.NET Core runtimes installed:
  Microsoft.NETCore.App 2.2.1 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download
```
FirebaseとTypescriptでAPIを作る

## 担当者
ファム・ホアン・フン

## 内容
twitter_clone_devというプロジェクトにAPIを開発します。そのプロジェクトは有名なアプリケーションtwitterの通りに簡単にユーザーとこれらのポストがあるアプリケーションをつくりました。

## 使った技術
NodeJS, TypeScript, Firebase Cloud Function, Firestore。

## 開発するツール
Visual Code ver 1.29.1。
## テストツール
Postman ver 6.4.4。

## APIの一覧
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/344186/9cc48494-681a-d8ab-c2a6-8db01bf2e9f1.png)

## デモ画面
###API endpoint(/v1/auth/access-token)
ユーザーが名前とパスワードをインプットしてトーケンを取得します。名前あるいはパスワードが間違う場合、エラーとメッセージというレスポンスを返事されます。
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/344186/d0dc5893-12f9-eab0-9333-8287de3affdc.png)

### API endpoint(/v1/users, method: GET)
ユーザーのリストがJSONのフォマットで取得します。
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/344186/9b45f136-c139-b62c-64f5-71a4e9e16c81.png)

### API endpoint(/v1/:userId, method: PATCH)
ユーザーが名前とパスワードをインプットしてリクエストにユーザーのIDを含んで遅れてユーザーの情報をアップデートされます。レスポンスの状態を返事されます。
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/344186/5e26a4ee-3231-5f26-9e25-f3fe80913d61.png)

Firestoreでこのユーザーがアップデートされました。
![4.1.PNG](https://qiita-image-store.s3.amazonaws.com/0/344186/cb879d8f-90db-b126-f373-3f6ed85ee815.png)

### API endpoint(/v1/:userId/posts)
ユーザーの全部のポストを取得します。
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/344186/c0bb4033-ff16-39c9-e30e-ddd07da0ab60.png)

### 他のAPI
全部のAPIをデモすることができませんが他のAPIはほとんどデモしたのAPIのようです。間違ってもインプットが正しくなくても検索ことができなくて404の状態を返事されます。そしてログインした上にトーケンを取得するAPIは別として全部のAPIはヘッダの中にトーケン（トーケンはユーザーの情報があるペイロードを含んだ）があってチェックして正しい場合はアクセスことができます。
## 問題点
NoSQLでデータを処理することが少し難しかったです。他には特にありませんでした。
## 結論
FirebaseまたはFirestoreで開発するようになります。それからTypeScriptでAPIを開発することができました。
Game_ActorやGame_BattlerにGame_Variableをメンバとして持たせる提案


公式フォーラムでも要望として出したんですが、意見を整理するために記事にします。
基本的には、フトコロさんの実装した以下のプラグインを本体機能として公式化するような内容です。
[オリジナルパラメータを設定できるプラグイン](https://tm.lucky-duet.com/viewtopic.php?f=5&t=3354)

なお、Game_Variableそのものではなく、ある程度調整されたクラスになる可能性もあると思います。
ただ、プラグインでフックしやすいようにクラスにするのは必須でしょう。

#まえがき
まず、何故このような提案を出すのかを説明します。
プラグイン同士の競合を解決する中で、もっとも大変なのはウィンドウ同士が互いに固有の描画を持つ場合です。


##ウィンドウプラグイン同士での競合解決のため
現状のアクターに固有のパラメータを追加するプラグインは、その数値をどのように画面に出すかが問題になりがちです。
Window_Baseに*drawCustomParam(actor,x,y)*で呼び出す関数が追加されているかもしれませんし、あるいは単に既存のステータス描画の内側に追加されているかもしれません。
さらに、パラメータ名がどのようになっているかを知るすべがありません。
アクターが持つ変数となれば、各プラグインはその数値に対しての操作の一部をコアスクリプトに移譲できます。

##変数の書き換えが容易になる
現状ではアクターやバトラーに変数を追加するプラグインで、その数値を書き換えるにはプラグインコマンドやスクリプトが必要です。
しかし、この方法はリファレンスを読む手間が必要となり、負担になります。
イベントコマンドで数値を操作できれば、この問題は大きく軽減されます。
また、スキルやアイテムの効果として数値を操作することも可能となるでしょう。

##プラグイン間の連携が容易になる
普通の変数と似たような操作にできることで、他のプラグインが数値を読みだすことができるようになります。
例えば、数値の挙動自体は他のプラグインで行い、画面表示のレイアウトを別のプラグインに完全に任せることが可能になります。
また、プラグイン側が特別に容易された表示方法を持つ場合でも、対応が容易です。
*window.drawActorVariable(actor,index,x,y)*のような形で、内部ではフックして独自の描画（例えばゲージを使う）などに切り替えることが可能です。


#本体側で行う対応
このシステムはエディタ本体の追加機能が必須になります。
主にイベントコマンドやスキルの効果の対応です。
##イベントコマンドの修正
「アクター変数の操作」という形で、中身は「変数の操作」と同じような内容になるでしょう。
また、変数の操作の右辺側に「アクター変数」が追加されると思います。

##スキル・アイテムの効果の修正
アクター変数の加減乗除・代入・余剰などで６種類ほど、スキル・アイテムの効果を拡張する必要があります。
加減乗除や代入などの演算種別をeffect.code1に、変数番号をvalue1に、数値をvalue2に格納することで可能です。
ユーザーが拡張したいと思うのであれば、トリアコンタンさんの動的データベースプラグインで拡張すればよいと思います。

#アクター変数とバトラー変数を切り離す理由
これは、成長要素のあるアクターと成長要素のないエネミーを切り分けるためです。
例えば、キャラクター間の有効度なんてパラメータはエネミーは使いませんから、アクター変数に入れるべきです。
ただ、そういった使い分けをしないのであればバトラー変数としてアクター・エネミーで共有することになるでしょう。
どうせ、配列にundefinedが入るだけですし、問題は少ないでしょう。

#終わりに
ユーザーの間では「MVaceがその内出る」という噂・予想・願望があります。
そのあたりで、実装されたら便利かもしれないなあ、と思ってこんな記事を書きました。
CoreOSのISOはどこだ？

# CoreOSをVirtualBoxで起動させよう！

本番環境でCoreOSを運用する前に，
ローカルのVirtualBoxである程度動かしたい。

そのために，ISOをダウンロードしなければならないが，
[公式サイト](https://coreos.com)をみても「Download」なる語が見つからない・・・。
一体どこにあるのだ。

# ISOはここにある

↓こちら
https://coreos.com/os/docs/latest/booting-with-iso.html


## 道のり

1. [トップページ](https://coreos.com)
↓

2. [CoreOS Documentation](https://coreos.com/docs/)
↓

3. [CoreOS Container Linux 2023.0.0 Documentation](https://coreos.com/os/docs/latest/)
↓

4. [Booting CoreOS Container Linux from an ISO](https://coreos.com/os/docs/latest/booting-with-iso.html)

階層が深いので見つけづらい・・・。

主に，AWSなどのCloudサービスで用いられることを想定していて，
個人がVirtualBoxなどでCoreOSを運用することは想定していないのでしょうか。

# VirtualBox上へのインストールは，こちらの記事をみると簡単

[気になっていた CoreOS を触ってみましょう]
(https://usado.jp/spdsk/2018/03/19/post-3450/)
Rustのstd::mem::swapを使ってみた

こんにちは。Rustに入門中のyharaです。borrow-checkerのエラーと格闘する日々ですが、今日はstd::mem::swapを使うことで解決できたことがあったのでメモしておきます。

## 構造体

作っているのは自作言語のパーサの部分です。今回問題になったのは以下の構造体の、locとnext_locというフィールドです。

```rust
pub struct Source<'s, 't: 's> {
    ...
    pub loc: Location,
    next_loc: Option<Location>,
    ...
}
```

locは現在位置を表します。next_locは最初はNoneですが、peek_tokenという関数を呼ぶと「次のトークンを消費した後」のLocationがセットされます。Locationはソースコード中の何行目の何文字目かを表す構造体です。

## locを更新する

問題はトークンを消費したあとの処理で起こりました。next_locの値をlocに移動しようとしたのですが：

```rust
        let next_loc = self.next_loc.unwrap();
        self.next_loc = None;
        self.loc = next_loc;
```

以下のエラーになりました。

```
error[E0507]: cannot move out of borrowed content
   --> src/shiika/parser/source.rs:208:24
    |
208 |         let next_loc = self.next_loc.unwrap();
    |                        ^^^^^^^^^^^^^ cannot move out of borrowed content
```

letで一時変数を定義する行為はmoveになるので、moveしたあとのself.next_locはどうしたらいいの？と怒られている…ような気がします。

## swap

で、「rust swap」で検索したところ、以下の記事が見つかりました。

- [Rustの二次元配列の要素のswap \- Qiita](https://qiita.com/tanakh/items/d70561f038a0ef4f0ff1)

これによるとuse std::memの[std::mem::swap](https://doc.rust-lang.org/std/mem/fn.swap.html)を使うと、2つのlocationの値だけを入れ替えることができるようです。今回はself.next_locをNoneにしつつ元の値も取りたいので、こんな感じですね。

```rust
        let mut tmp = None;
        std::mem::swap(&mut tmp, &mut self.next_loc);
```

## まとめ

ということで以下のようにすることでコンパイルが通るようになりました。[^1]

[^1]: コメントのcoaxは「なだめる」のつもりで使っていますが辞書引いて出てきただけなので適切かはわからん

```rust
        // Set next_loc to self.loc (using swap for coaxing the borrow-checker)
        let mut tmp = None;
        std::mem::swap(&mut tmp, &mut self.next_loc);
        self.loc = tmp.unwrap();
```

Rustは最初は何もわからん状態でしたが、徐々に勘が働くようになってきた気がします。C++に慣れてる人なら理解が早いと思います(私は文法をいくらか知ってる程度だったので苦労していますが)。
Prettierとeslintで文法チェックと整形をコミット前に自動的に行うWebpack

# どういった効果か
git commitをするたびにPrettierで整形を行い、
OKの場合、ESLintで構文チェックを行う
といった動きをしてくれるもの。
ESLintでは、整形でうまくいかないところがあるとのことだったので、
この形式を採用。

基本的なやり方はここを参照。
[Prettier 入門 ～ESLintとの違いを理解して併用する～](https://qiita.com/soarflat/items/06377f3b96964964a65d)


## .eslintrc
es6 でかけるように

```json
{
  "env": {
    "es6": true,
    "node": true,
    "browser": true
  },
  "extends": [
    "eslint:recommended",
    "plugin:prettier/recommended"
  ],
  "parserOptions": {
    "sourceType": "module"
  },
  "rules": {
    "prettier/prettier": [
      "error",
      {
        "singleQuote": true,
        "trailingComma": "es5"
      }
    ]
  }
}
```

## package.json
scssとかpugとか私好みのものありつつ。

```json
{
  "name": "portfolio",
  "version": "0.0.0",
  "description": "portfolio development.",
  "author": "",
  "license": "",
  "scripts": {
    "build": "webpack --mode production --progress",
    "start": "webpack-dev-server --mode development --inline --open",
    "precommit": "lint-staged"
  },
  "lint-staged": {
    "./src/js/*.js": [
      "eslint --fix",
      "git add"
    ]
  },
  "devDependencies": {
    "autoprefixer": "^8.2.0",
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.4",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-env": "^1.6.1",
    "css-loader": "^0.28.11",
    "css-mqpacker": "^6.0.2",
    "eslint-plugin-prettier": "^3.0.1",
    "extract-text-webpack-plugin": "next",
    "file-loader": "^1.1.11",
    "glob": "^7.1.2",
    "html-loader": "^0.5.5",
    "html-webpack-plugin": "^3.1.0",
    "js-yaml-loader": "^0.1.0",
    "node-sass": "^4.8.3",
    "portfinder": "^1.0.13",
    "postcss-loader": "^2.1.3",
    "prettier": "^1.16.1",
    "pug": "^2.0.3",
    "pug-loader": "^2.4.0",
    "read-config": "^2.0.0",
    "sass-loader": "^6.0.7",
    "webpack": "^4.4.1",
    "webpack-cli": "^3.1.2",
    "webpack-dev-server": "^3.1.1",
    "webpack-route-data-mapper": "^2.1.0"
  },
  "babel": {
    "presets": [
      "env"
    ],
    "plugins": [
      "transform-runtime"
    ]
  },
  "browserslist": [
    "ie >= 11",
    "ios >= 9",
    "android >= 4.4"
  ],
  "dependencies": {
    "eslint": "^5.12.0",
    "eslint-config-prettier": "^3.3.0",
    "husky": "^1.3.1",
    "lint-staged": "^8.1.0"
  }
}

```
GoのValue操作メモ

* Goの [reflect](https://golang.org/pkg/reflect/) パッケージの `Value` 操作を見ていて、どの `Kind` にどの操作が使えるか混乱したのでgo-1.11.5のドキュメントを元に表にまとめた。
* 紙幅の都合でいくつかの`Kind`を下記のようにまとめた。
  * `Int`類: `Int`, `Int8`, `Int16`, `Int32`, `Int64` のいずれか
  * `Uint`類: `Uint`, `Uint8`, `Uint16`, `Uint32`, `Uint64` のいずれか
  * `Float`類: `Float32`, `Float64` のいずれか
  * `Complex`類: `Complex64`, `Complex128` のいずれか
* 並び順はおおよそ、`Kind`ごとのGetter/Setter及びOverflowチェック、`cap`/`len` 操作、チャネル、関数、`struct`、添字アクセス、マップ、インタフェース、その他操作の順とした。
* 下表のXは、ある`Kind`に対してその操作がpanicせずに呼び出せる可能性があることを意味する。例えば、 `SetString` は `Kind` が `String`、かつ `CanSet` が真であれば panic しないが、この表は `CanSet` のような `Kind` にかかわらない条件は無視する。

| |Bool|Int類|Uint類|Uintptr|Float類|Complex類|Array|Chan|Func|Interface|Map|Ptr|Slice|String|Struct|UnsafePointer|
|--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|Can­Set|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
|Set|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
|Bool|X||||||||||||||||
|Set­Bool|X||||||||||||||||
|Bytes|||||||||||||X||||
|Set­Bytes|||||||||||||X||||
|Complex||||||X|||||||||||
|Set­Complex||||||X|||||||||||
|Float|||||X||||||||||||
|Overflow­Float|||||X||||||||||||
|Set­Float|||||X||||||||||||
|Int||X|||||||||||||||
|Overflow­Int||X|||||||||||||||
|Set­Int||X|||||||||||||||
|Pointer||||||||X|X||X|X|X|||X|
|Set­Pointer||||||||||||||||X|
|String|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
|Set­String||||||||||||||X|||
|Uint|||X|X|||||||||||||
|Overflow­Uint|||X|X|||||||||||||
|Set­Uint|||X|X|||||||||||||
|Cap|||||||X|X|||||X||||
|Set­Cap|||||||||||||X||||
|Len|||||||X|X|||X||X|X|||
|Set­Len|||||||||||||X||||
|Close||||||||X|||||||||
|Recv||||||||X|||||||||
|Send||||||||X|||||||||
|Try­Recv||||||||X|||||||||
|Try­Send||||||||X|||||||||
|Call|||||||||X||||||||
|Call­Slice|||||||||X||||||||
|Field|||||||||||||||X||
|Field­By­Index|||||||||||||||X||
|Field­By­Name|||||||||||||||X||
|Field­By­Name­Func|||||||||||||||X||
|Num­Field|||||||||||||||X||
|Index|||||||X||||||X|X|||
|Slice|||||||X||||||X|X|||
|Slice3|||||||X||||||X||||
|Map­Index|||||||||||X||||||
|Set­Map­Index|||||||||||X||||||
|Map­Keys|||||||||||X||||||
|Interface­Data||||||||||X|||||||
|Elem||||||||||X||X|||||
|Is­Nil||||||||X|X|X|X|X|X||||
|Addr|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
|Can­Addr|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
|Can­Interface|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
|Interface|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
|Convert|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
|Is­Valid|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
|Kind|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
|Method|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
|Method­By­Name|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
|Num­Method|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
|Type|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
|Unsafe­Addr|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X|
折れ線グラフにSEMやCIを表示する [R] [ほぼ自分用メモ]

```R:plot.R
#!/usr/bin/env Rscript

library("ggplot2")
data=read.table("test_for_R.txt", header=T)
g=ggplot(data, aes(x=Res, y=ave, fill=class))

g+geom_ribbon(aes(ymin=ave-CI95, ymax=ave+CI95), alpha=0.5) +
    geom_line(aes(x=Res, y=ave, colour=class)) +
    scale_fill_manual(values=c("orangered","dodgerblue","dodgerblue")) +
    scale_colour_manual(values=c("red","blue","blue")) +
    theme_bw()
```

# 使用したデータ
```
$ cat test_for_R.txt | column -t

class  Res  ave       CI95
n1     28   1.40785   0.098557683
n1     29   1.0256    0.108767963
n1     30   1.10255   0.135348881
n1     31   1.049425  0.146472147
n3     28   8.1956    0.902613638
n3     29   6.678975  0.584451363
n3     30   5.156725  0.348657763
n3     31   3.700425  0.286288136
```

# 出来上がりの図がこちら
![Rplot.jpeg](https://qiita-image-store.s3.amazonaws.com/0/341384/f1e1c327-c8b4-31b3-daee-760ca7752983.jpeg)

# メモ
グリッド線を消したいときは、例えば、
`+theme(panel.border=element_blank(), panel.grid.major=element_blank(), panel.grid.minor=element_blank())`

x軸やy軸のスケールを変更したいときは、例えば、
`+xlim(20,40)+ylim(0,10)`

# 環境
ggplot2: 3.1.0
R version 3.5.1 (2018-07-02)
macOS Mojave 10.14.2
ブロックチェーンで本人を証明するということ

先日投稿した記事がそこそこアクセスが良かったため、少々掘り下げて説明したいと思います。

[岡三マンがNEMを使って本人であることを証明する方法](https://qiita.com/nem_takanobu/items/f24d6d249c0e338e3eee)

ブロックチェーンの次の活用方法として注目される、「本人を証明すること」とはどういうことでしょうか？
それは**『公認された「過去の自分」しか知り得ない手段を用いて「現在の自分」を保証する』**ことです。以下の２つの条件を満たす場合に本人であると言えます。

- 署名者が過去に公証を受けていること
- 署名者が現在の自分を保証していること

### 1)署名者が過去に公証を受けていること

ここで言う「公証を受ける」とは信頼できる組織から認証されることもあれば、自分で公表した内容をブロックチェーンを用いて公証を受ける方法も考えられます。自分の作った作品でアポスティーユを行ったり、ネームスペースを取得するなどの行為がそれに当たります。

### 2)署名者が現在の自分を保証していること

できれば、前者の条件だけで本人確認を行いたいものです。ですが、そこには少し穴があります。パブリックなブロックチェーンは誰でも閲覧可能なため、「過去に公証を受けた情報を知っている」というだけでは不足しており、「それ、俺のアカウント」と誰でも言うことが出来てしまうのです。そのため、ブロックチェーンを用いた本人の証明では必ず「その秘密鍵を持っているのはほかならぬ私です」という手続きが必要になります。
その証明には、（私も長い間誤解していましたが）とくにトークンを投げる必要はありません。証拠を見せろと言ってくるサービスが提示するPIN番号や自分が保証したいアカウントIDなどをメッセージとして署名すれば、だれでもあなたの公開鍵で署名が検証できます。

### はい、ここで注目ー！

よく混同しがちですが、「署名」をすること自体にブロックチェーンは必要ありません。また、署名の検証もパブリックチェーンであれば無料ですることができます。公開秘密鍵の原理を知っていればブロックチェーン技術を利用することなく、秘密鍵でメッセージを署名・公開鍵でメッセージを検証することができます。例えばメッセージを検証すれば、それに紐づくアカウントが持つ資産を所有していることは証明可能です。

「公認された過去の自分が今の自分を保証する」。これの面白いところは、本人を証明するための手がかりを組織が所有していない点です。その鍵を自分が持っているため、これからは情報の流れが信頼できる組織から取りに行くのではなく、自分から発信できるようになります。このあたりはnemlogをやっている人にはピンとくるのではないでしょうか？nemlogの運営者には1XEMたりとも預けておらず、ユーザー間同士で投げ銭を実現していますよね？お金や土地だけではなく、些細だけれども信用が伴うと便利、そんなあらゆる分野に適用されていくでしょう。


### NEMだとどうなの？

ここまでは一般的なブロックチェーン共通のお話でした。では、マルチシグを使用して所有させるという概念を持たせることができます。実社会においては譲渡、キャンセルといった運用を迫られることがほとんどです。秘密鍵を個人と直接結びつけるのではなく、マルチシグを利用して所有させるという概念を持ち込むことで、緩やかにブロックチェーン技術を一般社会に浸透させていくことが可能です。
このあたりは、また近い将来、NEMブロックチェーン技術の状態と振る舞いに注目して説明していきたいと思います。
オブジェクトの配列の中からある条件を満たすものがあるかどうかチェックする

たとえばこういうやつ :point_down: 

```swift
struct Person {
  var name: String
  var age: Int
}

let items = [
  Person(name: "Alice", age: 11),
  Person(name: "Bob", age: 23)
]

let results = items.filter { $0.name == "Alice" }

if (results.isEmpty) {
  print("Aliceはおらんかったで〜")
}
else {
  print("Aliceおったで！")
}
```

それにしても、日本語にするとわけわからんタイトルになるなぁ :nerd: 

参考
---
- [properties \- how to check if a property value exists in array of objects in swift \- Stack Overflow](https://stackoverflow.com/questions/28211160/how-to-check-if-a-property-value-exists-in-array-of-objects-in-swift)
chrome.tabs.executeScriptのファイル実行に引数を渡す


# はじめに

Chromeエクステンションの開発時、タブを指定してコードを実行したいときは
以下のようにしますが、これでは引数を与えることができません。

```js
chrome.tabs.executeScript(tab.id, {
  file: "src/test.js"
})
```



# 解決策

chrome.tabs.executeScriptをネストして、最初のコードで渡したい値をゴニョゴニョします。
ゴニョゴニョした内容は次の`file: "src/test.js"`内に引き継がれます。

```js
chrome.tabs.executeScript(tab.id, {
    code: 'let config = 1;'
  }, () => {
    chrome.tabs.executeScript(tab.id, {
        file: "src/test.js"
    })
  })
})

// src/test.js
console.log(config) // => 1
```

引数がオブジェクト型のような複雑なものの場合はJSON.stringifyを使います。

```js
let config = {foo: 'bar'}

chrome.tabs.executeScript(tab.id, {
    code: 'let config = ' + JSON.stringify(config)
  }, () => {
    chrome.tabs.executeScript(tab.id, {
        file: "src/test.js"
    })
  })
})

// src/test.js
console.log(config) // => {foo: 'bar'}
```
Spinnakerのトレーニング(SPIN50)を受講しました

Mirantisが開催しているSpinnkaerのトレーニングを受けてきました。
日本初のSpinnakerの研修でしたので、受講した内容および所感を述べたいと思います。

**2019/4/16追記**
わたしが受講したときはベータ版でしたが、ついに正式リリースされました！
https://www.atpress.ne.jp/news/181240

# Spinnakerとは？
オープンソースのCD(Continuous Delivery)ツールです。当初はNetflixで開発されていましたが、オープンソース化されています。詳しくはメルカリのエンジニアが書いたブログがとても参考になります。
https://tech.mercari.com/entry/2017/08/21/092743

# 研修の概要
本研修は1日間のコースとなります。CICDおよびSpinnakerの構成の説明、およびハンズオンを行います。ハンズオンは、コードをアップロードしてから、kubernetesにデプロイするまでのCI/CDをSpinnaker(+α)を使って実装しました。

# 受講対象者
まずは、Linuxコマンドに慣れているのは必須です。特にファイル編集を頻繁におこないますので、viコマンドを扱えないと、ハンズオンに着いていくのが厳しいです。あと、kubernetsおよび、CICDについて知識があれば、より良いと思われます。

# アジェンダ
本研修のアジェンダになります。**ただし、わたしが受講したのはベータ版でしたので、今後内容が変わる可能性があります。**

- Introduction
- Continuous Delivery with Spinnaker
  - Lab 1: Explore the classroom environment
  - Lab 2: Continuous Integration
- Spinnaker Architecture
  - Lab 3: Spinnaker Deployment
- Spinnaker Deployment pipeline
  - Lab 4: CI/CD Pipelines
- Cloud Management
  - Lab 5: Application Management
- Kubernetes Integration
- Reliable Deployment
- Kayenta Automated Canary Analysis

トレーニングの流れとしては、座学で概要とハンズオンで実装する内容を学び、その後に時間をとってのハンズオンを行う形式でした。質問は逐次受け付けてくれるので分からない事があれば、講師がすぐに回答してくれます。

アジェンダの中から内容の一部をご紹介しますが、Lab 4ではSpinnakerのパイプライン機能を使って実際に、変更したコートをアップしてから、Dockerイメージの作成、ステージング環境(k8s)にイメージのアップ、次に本番環境にイメージのアップという、CI/CDでの一般的な使い方について体験することができました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192426/5bc118f7-feaa-28a8-74c7-afb267ba1915.png)

また、Lab 5ではBlue/Greenデプロイメント(SpinnakerではRed/Blackデプロイメントと呼称)といった、安全に新しいアプリケーションに切り替える手法についても実際にハンズオンで体験することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192426/53059cc5-b9f9-7ea7-65f3-d91041686392.png)

本トレーニングでは、上記の様にCI/CDツールの基本的な使い方については網羅していますので、CI/CDツール未経験者の方でも満足できるものになるかと思います。

# 受講した感想
Spinnakerの基本的な使い方は、このトレーニングを受講する事である程度は網羅できました。受講して思ったことは、SpinnakerでなくてもJenkins、TravasCIの様なCI/CDツールを扱った経験があった方が、Spinnakerと他のツールと対比することができるので、Spinnakerのメリット、デメリットをより深く学べることでした。

# 最後に
Spinnakerは、kubernetesに対してのCD機能が標準的に実装されているだけではなく、AWS,Azure,GCPのIaaS等に対してにもCD機能が実装されています。Spinnakerについて興味がある、もしくはkubernetes等のCDツールの選定に悩んでいるのでしたらば、本トレーニングの受講をご検討してみてはいかがでしょうか。
TILE38紹介（3） ：Goプログラムからのアクセス1

|TILE38紹介|
|:---|
|[TILE38紹介（1） ：基本コマンド](https://qiita.com/tesujiro/items/69f8970bd69d501cb0c8)|
|[TILE38紹介（2） ：空間系コマンド](https://qiita.com/tesujiro/items/0a998f2c6e3dd49d7429)|
|[TILE38紹介（3） ：Goプログラムからのアクセス1](https://qiita.com/tesujiro/items/fa7dfc079a94824cc77e)|
|[TILE38紹介（4） ：Goプログラムからのアクセス2](https://qiita.com/tesujiro/items/d9bf26233ce96bc3596f)|
|[TILE38紹介（5） ：Geofencing](https://qiita.com/tesujiro/items/e4b5a3df174e69516553)|

# TL;DR
- TILE38はredisのプロトコルに対応しているのでredisクライアントからのアクセスが可能である。
- 本章ではGoでの実装例として[redigo](https://github.com/gomodule/redigo)ライブラリを使用した基本的なプログラム実装例を説明する。

# データ登録と取得
-「 [TILE38紹介（１） ：基本コマンド](https://qiita.com/tesujiro/items/69f8970bd69d501cb0c8)」で紹介したtile38-cliを使用したデータ登録と取得について、ここではGoプログラムから行う。
- goredisではDial関数を使用してコネクションを取得し、Do関数でTILE38のコマンドを実行し、Close関数でコネクションを終了する。

```go:main.go
package main

import (
        "encoding/json"
        "fmt"
        "log"
        "reflect"

        "github.com/garyburd/redigo/redis"
)

func main() {
        // db connect
        c, err := redis.Dial("tcp", ":9851")
        if err != nil {
                log.Fatalf("Could not connect: %v\n", err)
        }
        defer c.Close()

        // SET location
        ret, err := c.Do("SET", "location", "me", "POINT", 35.6581, 139.6975)
        if err != nil {
                log.Fatalf("Could not SET: %v\n", err)
        }
        fmt.Printf("SET ret:%s\n", ret)

        // GET location
        ret, err = c.Do("GET", "location", "me")
        if err != nil {
                log.Fatalf("Could not GET: %v\n", err)
        }
        fmt.Printf("GET ret:%s\n", ret)
}
```
- Dial関数に接続に必要なプロトコル、接続先情報を引数として指定してコネクションを作成する。
- ここでは直接Dial関数を使用したが、redigoのコネクションプール機能(Pool型)を使用すれば使用リソースの制御と接続オーバヘッドの削減をすることが出来る。
- Do関数にはtile38-cliと同じコマンド(string)と引数を渡すことになるが、引数部分はinterface{}として定義されおり、数値については数値型で直接渡すことになる。
- 以下に実行例を示す。

```bash:
$ go run main.go 
SET ret:OK
GET ret:{"type":"Point","coordinates":[139.6975,35.6581]}
$ 
```
- SETコマンドの結果の戻り値は文字列が返り、GETコマンドはJSONオブジェクトの[]byte型の値が返る。
- tile38-cliでGETを実行した場合に{"ok":true,"object":{"type":"Point","coordinates":[139.6975,35.6581]},"elapsed":"9.998µs"}と言うJSON文字列が標準出力されるが、この「"object":〜」の部分が返る。
- 本説明ではコマンド実行で返却されたオブジェクトを表示するに留めたが、実際のプログラムではGoの構造体等のオブジェクトとして扱う場合が多いと考えられる。事象において説明を予定している。
TypeScript(ES)でオブジェクトの配列をAND検索で絞り込み

#TypeScriptでオブジェクトの複数格納された配列から文字列検索をする
### Itemの型（一例）
```ts
class Item {
  public id!: number;
  public name!: string;
  public subtitle!: string;
}
```
### Itemの配列から、nameとsubtitleで検索をしてItemの配列を返す関数
```ts
// Item型の配列と検索ワードを受け取りItem型の配列を返す関数
function getSearchedItems(items: Item[], keyword: string): Item[] {
// filterで条件に合う物だけを返す配列に入れていく
  const searchedItems = items.filter(item => {
    const keywords: string[] = keyword.split(/[ 　]/g); //半角スペースと全角スペースで切り分ける
    const searched =
      (item.name ? item.name : "") + (item.subtitle ? item.subtitle : "");//検索されるワードをくっつける
//検索ワードごとに文字列内に見つかるかを確認し、全てのワードが見つかればtrueを返す（Filter済みの配列に追加される）
    return keywords.every(keyword => {
      return searched.search(keywords[0]) > -1;
    });
  });
  return searchedItems;
}
```
実際に検索をしてみる例

```ts
class Item {
  public id!: number;
  public name!: string;
  public subtitle!: string;
}

function getSearchedItems(items: Item[], keyword: string): Item[] {
  const searchedItems = items.filter(item => {
    const keywords: string[] = keyword.split(/[ 　]/g); //半角スペースと全角スペースで切り分ける
    const searched =
      (item.name ? item.name : "") + (item.subtitle ? item.subtitle : "");
    return keywords.every(keyword => {
      return searched.search(keywords[0]) > -1;
    });
  });
  return searchedItems;
}
// 検索する配列
const items: Item[] = [
  {
    id: 1,
    name: "Kingdom hearts",
    subtitle: "大好評発売中"
  },
  {
    id: 2,
    name: "Acecombat",
    subtitle: "Steam版もうすぐ発売"
  },
  {
    id: 3,
    name: "League of Legends",
    subtitle: "Season 9 start"
  },
];
// 検索して結果を表示
console.log(getSearchedItems(items, "Steam Ace"));
```

あまり調べずにこうなってしまったのでベストプラクティスがあれば教えてください。
→頂いていたご指摘修正しました。
【Java】DBの定義を反映したenumで、DBに保存する内容とenumのnameが食い違った場合への対処

# 問題の内容
DBのテーブル定義をそのまま写した`enum`で、予約語と定義が被ったため、`_`を付けて定義しました。

```java:問題の発生したenum
public enum Moge {
    hoge("hoge"), fuga("fuga"), _native("native"); //nativeは予約語

/* 省略 */
```

ここで、`Jdbc`へのクエリ結果を`Enum.valueOf`を用いてマッピングしていましたが、DBから取れる値は`native`であり、`_native`と異なるため、マッピングできませんでした。

# 対処
DBから取れる値に対応するフィールドを伝えるアノテーションを作り、リフレクションでアノテーションを処理することでマッピングできるようにしました。

```java:MapByValue
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MapByValue {
    String value();
}
```

```java:アノテーションを付与した様子
public enum Moge {
    hoge("hoge"), fuga("fuga"),
    @MapByValue(value = "native") _native("native"); //nativeは予約語

/* 以下省略 */
```

```java:アノテーションを処理する様子
@SuppressWarnings("unchecked")
private Object mapEnum(Class<?> clz, String columnValue) {
    /* 省略 */

    String finalColumnValue = columnValue;
    columnValue = Arrays.stream(clz.getFields()) //フィールドを全部取得
            .filter(it -> {
                //MapByValueアノテーションが付与され、かつその値とcolmunValueが等しい場合
                MapByValue mapByValue = it.getAnnotation(MapByValue.class);
                return mapByValue != null && mapByValue.value().equals(finalColumnValue);
            })
            .findFirst()
            .map(Field::getName) //付与されたフィールドの名前を使う
            .orElse(finalColumnValue);

    return clz.cast(Enum.valueOf((Class<Enum>) clz, columnValue));
}

@SuppressWarnings("rawtypes")
@Override
protected Object getColumnValue(ResultSet rs, int index, PropertyDescriptor pd) throws SQLException {
    Class<?> clz = pd.getPropertyType(); //型情報の取得

    /* 省略 */

    if (clz.isEnum()) { //enumの場合
        byte[] bytes = rs.getBytes(index);
        if (isEmpty(bytes)) {
            return null;
        }

        return mapEnum(clz, new String(bytes, Charset.forName("UTF-8")));
    }

    /* 省略 */
```

# 別の案
Jsonから変換する都合で値から`enum`へ変換する関数を全ての`enum`が持っていたため、リフレクションからこれを利用することも考えましたが、アノテーション振って処理した方が汎用性が高いと判断しました。
`valueOf`を`Override`できれば一番よかったんですが……。

# 参考にさせていただいた記事
- [Enum定数のアノテーション \- Yamkazu's Blog](http://yamkazu.hatenablog.com/entry/20090117/1232178118)
macのFinderにパスを表示

finderで表示されているディレクトリ名がフルパスになる

```
defaults write com.apple.finder _FXShowPosixPathInTitle -boolean true
killall Finder
```

それとは別に、**[表示]-->[パスバーを表示]**で下部にパス表示を追加できる

参考：
[【Mac】Finderにフォルダのフルパスを表示させる方法](https://www.webdlab.com/mac/tips-finder-2/)
PGroongaがLockして困った件

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体も関係ございません。

# 1. 課題
　表題の通り

# 2. 環境
- mattermost のDBをPostgresql 9.5 の PGroonga で動かしている。
- Mattermostの投稿メッセージの全文検索で使おうと思ったが、Mattermost側の検索クエリーを修正しないと全文検索されないということが分かり全文検索としては未使用

# 3. 現象

Mattermostから投稿をいくらしても、プロセスが INSERTで固まってしまう。

```
 4338 ?        Ss     0:00 postgres: mt matmost 127.0.0.1(39890) INSERT
 4340 ?        Ss     0:00 postgres: mt matmost 127.0.0.1(39892) INSERT
```

* Mattermost のログ

```
{"level":"error","ts":1548651915.9732091,"caller":"web/context.go:60","msg":"We couldn't save the Post","path":"/api/v4/posts","request_id":"crop436fhb8s8runp6nnuhwipo","ip_addr":"XXX.XXX.XXX.XXX","user_id":"sqwk87qhw3f4pqhdmzeyo35aay","meth
od":"POST","err_where":"SqlPostStore.Save","http_code":500,"err_details":"id=owh1se9y138hmbkayrs5ajhpoh, pq: pgroonga: failed to add a record: <12>: grn_io_lock failed"}
```

* postgresql のログ

```file:/var/log/postgresql/postgresql-9.5-main.log
2019-01-28 14:15:14 JST [2431-1] mt@matmost ERROR:  pgroonga: failed to add a record: <13>: grn_io_lock failed
2019-01-28 14:15:14 JST [2431-2] mt@matmost STATEMENT:  insert into "posts" ("id","createat","updateat","editat","deleteat","ispinned","userid","channelid","rootid","parentid","originalid","message","type","props","hashtags","filenames","fileids","hasreactions") values ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18);
```

* pgroongaのログ

```file:/var/lib/postgresql/9.5/main/pgroonga.log
2019-01-28 14:15:14.064384|w|2431: [DB Locked] time out(900000): io(base/16384/pgrn.0000107) collisions(900000/5)
2019-01-28 14:15:14.064489|e|2431: grn_io_lock failed
2019-01-28 14:15:14.067479|e|2431: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(grn_io_lock+0x28e) [0x7f8fbe822f5e]
2019-01-28 14:15:14.067508|e|2431: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(grn_table_add+0x77e) [0x7f8fbe6baa7e]
2019-01-28 14:15:14.067519|e|2431: /usr/lib/postgresql/9.5/lib/pgroonga.so(+0xc841) [0x7f8fbf09f841]
2019-01-28 14:15:14.067530|e|2431: /usr/lib/postgresql/9.5/lib/pgroonga.so(pgroonga_insert+0x65) [0x7f8fbf0a2855]
```

どうも lockされているようだ。

grn_io_lock failed / Deadlock · Issue #48 · pgroonga/pgroonga
https://github.com/pgroonga/pgroonga/issues/48
でissueは立っているが、Closeされていない。

# 4. 対応

groonga pgroonga lock - external storage
http://d.hatena.ne.jp/kurita1/20180614/1528985277
を発見したので試してみる

`base/16384/pgrn.0000107` ファイルのあるところまで行って clearlock する

```
# sudo apt install groonga-bin
# cd /var/lib/postgresql/9.5/main/base/16384/
# groonga pgrn
> clearlock
[[0,1548666020.969831,1.750027894973755],true]
> quit
[[0,1548666025.186053,7.43865966796875e-05],true]
```

# 5. 解決

書き込めるようになった
これで、ようやくMattermostを更新できる..。
直すまでに8時間ほどかかりました。。
Rails プロジェクトに存在する不要な .keep ファイルを削除する

# やりたいこと

`.keep` ファイルのうち同じディレクトリに Git で管理されているファイルが存在するものは要らないので消したい。

# 方法

次の `.keep` ファイルは残しておきます。

* Git で無視されているディレクトリに存在する `.keep` ファイル
* `.keep` ファイルと同じディレクトリに存在するファイルが全て Git で無視されている場合
  * 例えば `log/.keep` など。 

```rb
git_ignored_filepaths =
  `git status --ignored -s`
    .split("\n")
    .map { |ignored| Rails.root.join(ignored[/(?<=!! ).+/]) }

Rails.root
  .glob('**/.keep')
  .select { |path| (path.dirname.children - git_ignored_filepaths).many? }
  .reject { |path| git_ignored_filepaths.any? { |ignored| ignored.directory? && path.fnmatch?(ignored.join('**').to_s) } }
  .map { |path| path.tap(&:delete) }
```

なお Ruby 2.5 より前のバージョンでは [Pathname#glob](https://docs.ruby-lang.org/ja/latest/method/Pathname/i/glob.html) が使えないので、次のように書き換えてください。

```rb
# Rails.root.glob('**/.keep') の部分を次の行に書き換える。
Dir[Rails.root.join('**/.keep')].map { |path| Pathname(path) }
```

🔽 コピペ用

```rb
git_ignored_filepaths = `git status --ignored -s`.split("\n").map { |ignored| Rails.root.join(ignored[/(?<=!! ).+/]) }
Rails.root.glob('**/.keep').select { |path| (path.dirname.children - git_ignored_filepaths).many? }.reject { |path| git_ignored_filepaths.any? { |ignored| ignored.directory? && path.fnmatch?(ignored.join('**').to_s) } }.map { |path| path.tap(&:delete) }
```
sPortRedirecotr.exeの動作モード

# sPortRedirecotr.exe の動作モード

## TCP/SSL モード

![036.png](https://qiita-image-store.s3.amazonaws.com/0/182822/37939b93-18e0-9776-9eaa-9e768f8f3fbe.png)

いわゆるTCPフォワーダー/SSLゲートウェイとなって、転送先に接続、転送する。
通信解析の単位は、パケット単位。

よって、SMTPやPOP3/IMAPを中継/編集/転送したりできる。(あまり使い道としては例外的だけどね)

- SSL のチェックが付いている場合、接続直後に SSL 化を行う。

## hidden HTTPProxy モード

![037.png](https://qiita-image-store.s3.amazonaws.com/0/182822/982d8f79-4a85-f84c-0c7e-cc0bd4a0e716.png)

上記のTCP/SSLモードとほぼ同一の動作をするが、通信解析の単位は、HTTPメッセージ単位。

一番、デバグしているモード(作者はブラウザ側、サーバ側にSSLゲートウェイを挟み込んで、Hostsを書き換えて診断作業(デバグ)をしている)

このモード以降で、HTTP関係の設定が有効になる。

## タンデム HTTPProxy モード

![038.png](https://qiita-image-store.s3.amazonaws.com/0/182822/ddddd395-dc5c-29ee-2ac8-7c7e0ef88bcf.png)

HTTPPrpxy サーバのように動作する。
(CONNECT メッセージを解釈ししたり・・・)
しかし、転送先を上位 HTTP Proxy サーバとして動作する。

- SSLのチェックが付いていた場合、CONNECT メッセージ後に SSL化する。
- チェックが Off の場合は、CONNET メッセージの解釈だけ行い SSL化はしない。
- SSL化の有無は、サーバ/クライアントと独立して設定できる

## ノーマル HTTPProxy モード

![039.png](https://qiita-image-store.s3.amazonaws.com/0/182822/89209551-4abf-bf6f-39e1-2eb61557e7f1.png)

HTTPPrpxy サーバのように動作する。
(CONNECT メッセージを解釈ししたり、転送先をリクエストから解析する)

- SSLのチェックが付いていた場合、CONNECT メッセージ後に SSL化する。
- チェックが Off の場合は、CONNET メッセージの解釈だけ行い(転送先の決定) SSL化はしない。
- SSL化の有無は、サーバ/クライアントと独立して設定できる

## Proxy Pac モード

Proxy.pac を事前に読み込んで、転送先ごとに、上位プロキシ、直接接続を決定し、接続する。

ver4.8.0.0 の時点で、未実装。

# sPortRedirecotr.exe Index

[sPortRedirecotr.exe のメインメニューに戻る](https://qiita.com/tomoki0sanaki/items/134cea01d1274075b723)
【初心者向け】JavaScript入門①「alert / document.write」 |『文系の人にもわかるプログラミング入門』より

#はじめに

[初めてのJavaScript(サイ本)](https://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AEJavaScript-%E3%82%B7%E3%82%A7%E3%83%AA%E3%83%BC-%E3%83%91%E3%83%AF%E3%83%BC%E3%82%BA/dp/4873113229)を買いましたが、筆者にとって少しとっつきにくかったです。そこで、本書のサポートページで紹介されていた初心者向けのコラム[『JavaScriptで学ぶ文系の人にもわかるプログラミング入門』](https://www.marlin-arms.com/jpn/column/js101/lesson03.html)から学ぶことにしました。

本記事は、その学習記録です。

# 学習すること

***[第3章 JavaScriptの第一歩](https://www.marlin-arms.com/jpn/column/js101/lesson03.html)***

* ①ダイアログボックスの表示(`alert`)
* ②HTMLとして書く(`document.write`)
* ③イベント稼動型のスクリプト
    * ③-①ページを開いたとき実行(`onload`)
    * ③-②対象をクリックしたとき実行(`onclick`)

# ①ダイアログボックスの表示(alert)

```html:example03-01.html(初めてのJavaScriptﾌﾟﾛｸﾞﾗﾑ)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello</title>
</head>
<body>
<script type="text/javascript">  //JavaScriptのプログラムは<script>タグで囲まれる
alert("Hello!");　 // 引数に指定した文字列をダイアログ画面に表示
</script>
<p>ごあいさつでした。</p>
</body>
</html>
```

# ②HTMLとして書くーdocument.write()

```html:example03-02.html(document.writeを使う)

<script type="text/javascript">
document.write("<h1>Hi!</h1>");   //引数に指定した文字列をHTMLとして表示
</script>
```

# ③イベント稼動型のスクリプトー何かが起こったときに実行される
## ③-① ページを開いたとき動作(onload)
```html:example03-03.html(イベント稼動型のスクリプト)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello</title>
<script type="text/javascript">
function sayHello(){
	alert("Hi!"); //ダイアログボックスを表示
}
</script>
</head>

<body onload="sayHello();">
<p>ごあいさつです。</p>
</body>
</html>
```

# ③-② 対象をクリック時に実行(onclick)

```html:example03-04.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello</title>
</head>
<body>
<p onclick="sayHello()">この文字をクリック（タップ）すると...</p>

<script type="text/javascript">
function sayHello(){
	alert("Hi!"); // ダイアログボックスを表示
}
</script>

</body>
</html>
```

# まとめ

## HTML
* `<script>...</script>`ーーJavaScriptのスクリプト（プログラム）を囲むHTMLタグ
* `<body onload="関数名()">`ー（サイトを開くとき）
* `<xx onclick="関数名()">`ー（クリックやタップが行われたとき）

## JavaScriptの関数
* `alert()`ーダイアログボックスを表示する
* `document.write()`ーHTMLのコードをJavaScriptから出力する
pythonを使うときに参考にするURL

# Pythonインストール
## Windows
https://www.python.jp/install/windows/install_py3.html
サイト内でリンクを探せば、2.7のインストール情報もある。
私はWindows版のpythonはめったに使わないので、以降の話では基本対象としていない。

## Linux
https://www.python.jp/install/centos/index.html
https://www.python.jp/install/ubuntu/index.html
ソースからビルドするのを推奨してるんだ・・・。
Linuxにはデフォルトで入っているのが定番だけど、自分で使いたいバージョンちゃんと入れましょうということらしいけど、なぜyumとかdpkgとかapt-getとかでないのか・・？

因みに上記の手順でビルドすると、一部ライブラリが正しく参照できず、以下のURLに頼ることに。。
http://kenzo0107.hatenablog.com/entry/2015/02/17/114506

# pip（パッケージ管理）インストール
3.4以降はpython本体と一緒に入ってるとのこと。
昔ながらのpipインストールは↓のイメージ。
https://qiita.com/suzuki_y/items/3261ffa9b67410803443

# Pythonのバージョン管理
## pyenv
使ったことないけど、存在は認識している。
https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b

## venv
厳密にはpython環境管理という感じ。
https://docs.python.jp/3/library/venv.html

python3系には標準で備わっている。
Windows環境で使ったので下記のコマンドで覚えた。（`C:\path\to`は予め作っておく）

```
c:\Python35\python -m venv c:\path\to\myenv
```

Windows環境でアクティベイトする場合はこんな感じ。

```powershell:powershell
c:\path\to\myenv\Scripts\Activate.ps1
```
※Windowsのデフォルトでは実行がブロックされるので、解除の方法は以下を参照。
https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750


```:cmd
c:\path\to\myenv\Scripts\activate.bat
```


## virtualenv（古いのかも・・・）
pythonに詳しい人（PyConでしゃべるような人）から、「venvで～」といわれたので、2.7時代の遺産なのかも。
厳密にはpython環境管理という感じ。
https://qiita.com/caad1229/items/325ca5c8ad198b0ebce7

virtualenvのバージョンが古いとPython3.5の環境が作れないということがあったので、要バージョンアップ。

```
pip install --upgrade pip
pip install --upgrade virtualenv
```

こちらはよく使うのだが、環境を作る元となるpythonのバージョンがインストールされている必要がある。
以下のように`-p`で作成する環境のpythonのバージョンをコントロールしているため。

```
mkvirtualenv --no-site-packages -p /usr/bin/python3.5 my_env
```

# pip(パッケージ管理)関連

## パッケージのインストール
言わずもがな感あるけど・・・。

```
pip install パッケージ名
```

## requirements.txtの使い方
requirements.txtは、phpで言うならcomposerのcomposer.json、node.jsで言うならnpmのpackage.jsonなわけだけど、手動で生成するものらしい。
https://www.lifewithpython.com/2014/03/python-install-multiple-modules-.html

### requirements.txtの出力
```
pip freeze > requirements.txt
```

### requirements.txtからのパッケージインストール
```
pip install -r requirements.txt
```

# pytest(自動テスト)
pythonのユニットテストといえばこれだけど、案外オプションが多くて覚えてられない。
実行するだけなら、テストコードを書いて `pytest {テストファイル名}`でいける。
そんな中、いい感じにまとまってたサイト↓。
https://www.m3tech.blog/entry/pytest-summary
[Xcode10] fastlane+CrashlyticsでFabric.info plist Errorが出る

## Crashlyticsのインストール
[インストール方法](https://fabric.io/kits/ios/crashlytics/install)をみてインストールできます。

気をつけなければいけないのが以下の記述。Xcode10では`Build Phases/Run Script/Input Files`に以下を追記しなければいけません。

```
$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)
```
<img width="771" alt="スクリーンショット 2019-01-28 17.38.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/132410/9181ffa1-540a-41eb-dd09-d7a4ae2539d4.png">


## Build Phases/Run Script
<img width="799" alt="スクリーンショット 2019-01-28 17.42.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/132410/e179205e-48f2-3229-f3ee-510111a3d732.png">

## Fabric.info plist Errorが出る場合の対処法
`$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)`の記述もれで出る場合がありますが記述していてもfastlaneでは出てしまう場合があります。


私の場合はCarthageのcopy-frameworksやSwiftLintの設定などでRunScriptに記述があり、`input files`にはCarthageのパスが羅列されており、その中に記述していたためfastlaneでエラーが出てしまっていました。

なのでその場合は**Run Scriptを分ける**ことで解決することができます。以下のように構成して解決しました。

- Carthage用のRunScript
- Crashlytics用のRunScript

## 参考
https://wootan1102.hatenablog.com/entry/2018/09/20/212958
【Laravel】ログファイルを日別で作成する設定

#環境

CentOS: 7.4
PHP: 7.2
Laravel: 5.6

#Laravel のログファイルを日別で作成する

Laravel のバージョンにもよるかもしれませんが、私の環境ではログがすべて laravel.log に追加されるようになっていました。
ログファイルの容量が増えてしまったりログが確認しづらいので、ログファイルを日別で作成するように設定します。

`config/logging.php` の `LOG_CHANNEL` を `daily` に変更することで実現できます。

```config/logging.php
<?php

use Monolog\Handler\StreamHandler;

return [

    /*
    |--------------------------------------------------------------------------
    | Default Log Channel
    |--------------------------------------------------------------------------
    |
    | This option defines the default log channel that gets used when writing
    | messages to the logs. The name specified in this option should match
    | one of the channels defined in the "channels" configuration array.
    |
    */

    'default' => env('LOG_CHANNEL', 'stack'),

    // 略

```

Laravel のディレクトリ直下に保存されている `.env` を修正します。

```.env
LOG_CHANNEL=daily
```

ターミナルで以下のコマンドを叩いて変更を反映させます（忘れがち）。

```
$ php artisan config:cache
```

これで `laravel-2019-01-01.log` という感じで日別のログファイルが自動的に作られます。
Keras generator

##Exapmole 1
```python
def batch_iter(data, n_classes, img_size, batch_size, shuffle=True):
  num_batches_per_epoch = int((len(data) - 1) / batch_size) + 1

  def data_generator():
    data_size = len(data)
    while True:
      # Shuffle the data at each epoch
      if shuffle:
        shuffle_indices = np.random.permutation(np.arange(data_size))
        shuffled_data = data[shuffle_indices]
      else:
        shuffled_data = data
      
      for batch_num in range(num_batches_per_epoch):
        start_index = batch_num * batch_size
        end_index = min((batch_num + 1) * batch_size, data_size)
        batch_list = shuffled_data[start_index: end_index] 
        
        x = []
        y = []
        
        for file_name in batch_list:
          img_pil = Image.open(path_img+file_name+'.jpg').resize((img_size, img_size))
          img_np = np.array(img_pil)
          x.append(img_np)
          
          class_pil = Image.open(path_class+file_name+'.png').resize((img_size, img_size))
          class_np = np.array(class_pil)
          y.append(class_np)
        
        x = np.array(x) / 255.
        y = np.array(y)
        y_m = np.where(y==255, n_classes-1, y)
        y_oh = np.identity(n_classes)[y_m]
        
        yield x, y_oh
      
  return num_batches_per_epoch, data_generator()
```

## Example 2
```python
train_df, validate_df = train_test_split(df, test_size=0.20, stratify= df['category'], 
                                         random_state=100)
train_df = train_df.reset_index(drop=True)
validate_df = validate_df.reset_index(drop=True)

total_train = len(train_df)
total_validate = len(validate_df)

train_datagen = ImageDataGenerator(
    #rotation_range=15,
    rescale=1./255,
    #shear_range=0.1,
    zoom_range=0.2,
    horizontal_flip=True,
    #width_shift_range=0.1,
    #height_shift_range=0.1
)

train_generator = train_datagen.flow_from_dataframe(
    train_df, 
    path_img, 
    x_col='filename',
    y_col='category',
    target_size=(img_size, img_size),
    class_mode='binary',
    batch_size=batch_size,
    classes=[0, 1]
)

validation_datagen = ImageDataGenerator(rescale=1./255)
validation_generator = validation_datagen.flow_from_dataframe(
    validate_df, 
    path_img, 
    x_col='filename',
    y_col='category',
    target_size=(img_size, img_size),
    class_mode='binary',
    batch_size=batch_size,
    classes=[0, 1]
)

history = model.fit_generator(
    train_generator,
    steps_per_epoch=total_train//batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=total_validate//batch_size,
    callbacks=callbacks,
    verbose=1)
```
リファクタリングとは。

リファクタリングとは、
処理の内容を変えずに、コードを改善すること。

理由
→読み手が最短の時間でコードを理解できるようになる。修正しやすくなる。

例えば
【制御フロー】
・条件式の並び替え
・if / else の順番
→枝分かれしたりするとコードがわかりにくくなるのを改善


◎条件式のポイント
左側に値が変化する対象
右側に値があまり変化しない対象を書くと
読みやすいコードになる。


```
if number >= 19
   省略
end

# if / elseの場合（肯定形を使用）

if  a == b 
   #条件1
 else
   #条件2
 end　

#単純な条件を先に書く

if c
  if a && b == 0
    #処理
  end
end

#関心を引く条件を先に書く（否定でも）
if user.image.nil
  # エラーを表示する
if user.image
  # 処理
end 

```
HerokuはまだBundler2.0に対応していない？

## tl:dr
あるRailsアプリケーションをHerokuを使ってデプロイしようとした際に、
bundlerに関してのエラーが出たので、その備忘録的な感じで本記事を書きます。

## 過程
先日、Rubyのversionを`2.5.3`から`2.6.0`にupした際に

```
$ gem i bundler
$ gem i rails
```
を実行。こうすると、stableな最新のversionのgemがインスコされるので、
bundlerのversionが`2.0.1`で入ってしまった。。。

ローカルでは動くので問題ないのですが、色々ググるとherokuだと、まだ対応していならしい。

## やってみたこと
```
$ heroku buildpacks:set https://github.com/bundler/heroku-buildpack-bundler2
```
このコマンドを実行するとうまくいくと記述されている記事もありましたが、それだと`$ git push heroku master`は通りますが、`heroku run rails db:migrate`でコケる、、、


## 結論
```
remote: /tmp/d20181113-113-10miq1y/bundler-1.15.2/gems/bundler-1.15.2/lib/bundler/lockfile_parser.rb:108:in warn_for_outdated_bundler_version': You must use Bundler 2 or greater with this lockfile. (Bundler::LockfileError)
```

エラーが出てしまいます。
この[issue](https://github.com/bundler/bundler/issues/6784)を読むとbundler2のbuildpackを設定してもまだ対応されてないよ！との記述があったため、諦めてbundlerのverionを`1.17.3`に下げたら動きました。

### bundlerのversionの下げ方

```
$ gem uninstall bundler # bundlerをアンインストール

$ gem install bundler -v 1.17.3 # version明記

$ rm Gemfile.lock # Gemdile.lockがgemのversionを明記しているため、一旦削除

$ bundle install

$ git　関連の諸々 ,,,

$ git push heroku master

$ heroku run bash

$ rails db:migrate or $ bundle exec rails db:schema:load
```
でうまくいくかと思います。

### 参考文献
- https://github.com/bundler/bundler/issues/6784