OmniAICreator/Qiita-1.07M huggingface dataset:
CorDappを自作してみる。(テンプレートクローン～開発環境構築まで)

# 記事の概要
Cordaの公式ドキュメントに沿って、CorDappを自作してみた。
この記事では、そのうちGitHubからテンプレートリポジトリクローンから
「IntelliJ」を用いた開発環境構築までを記載する。

# 公式ドキュメント
https://docs.corda.net/_static/corda-developer-site.pdf
(第5章 「Getting started developing CorDapps」に沿って実施)

# 環境
・Ubuntu：16.04.6 LTS (Xenial Xerus)
・Java 8
・IntelliJ
※記事「**[CordaをUbuntuにインストール&サンプルプログラムを実行してみた。 - Qiita](https://qiita.com/kzt_tateyama/items/58c45facb6fb3f608d04)**」中の
環境構築手順を参考にしてください。

# テンプレートリポジトリのクローン
ターミナルから以下のコマンドを実行し、CorDappのテンプレートリポジトリをクローンする。

```

git clone https://github.com/corda/cordapp-template-kotlin.git  
```

正常終了すれば、カレントディレクトリ直下に「cordapp-template-kotlin」がクローンされている。

# IntelliJより、プロジェクトを開く＆環境構築
1.「IntelliJ」を起動し、「Open」より「cordapp-template-kotlin」を指定する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/eed5d494-828d-9150-6885-78392a882501.png" width=80%>

2.左上の「File」をクリックし、「Project Structure」を選択する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/328cd618-fde0-5add-70ae-10b6659cec05.png" width=30%>

3.「Project」タブの「Project SDK」の「New...」をクリックし、使用するJDKを選択する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/078240e8-e059-9c4a-ac0f-830440bbebca.png" width=80%>

4.「Module」タブの左上段の「＋」をクリックし、「Import Module」をクリックする。」
![04_import module.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/b3cfb074-2ae9-a0f3-708b-d696763c1d26.png)

5.「cordapp-template-kotlin」を選択クリックする。
![05_SelectDirectry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/1eebd662-43e0-3566-5ac8-d8e92929d1d8.png)

6.「Import module from external model」を選択し、「Gradle」を選択して、「Finish」をクリックする。
![06_SelectGradle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/7da273f4-f219-0ce1-c01e-b53c968a3eb2.png)

7.「OK」をクリックすると、環境が構築される。

# 終わりに
次回は、ステートオブジェクトを実装していく。
【書評とまとめ】論理思考とは？ロジカルシンキングを読んで

[ロジカル・シンキング (Best solution)](https://www.amazon.co.jp/%E3%83%AD%E3%82%B8%E3%82%AB%E3%83%AB%E3%83%BB%E3%82%B7%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0-Best-solution-%E7%85%A7%E5%B1%8B-%E8%8F%AF%E5%AD%90/dp/4492531122)を読みましたので、自分的なまとめをしていきたいと思います。

## この本から学べること

コミュニケーションの相手に、自分の期待したリアクションをとってもらうための方法の本、と読み解きました。思っていることを伝えるための手法と、その練習用課題がいくつか乗せられていました。

## 手法① MECE

漏れなく、重複なく、物事を整理する方法です。

## 手法② So What?/Why So?

話の飛びをなくす技術です。

## ①と②を合わせて論理を組む

参考例： 「今夜のごはんのおかずは何がいい？」という問いかけに対して

1. So What?/Why So?ではない回答 => にんじん（何か違う...
2. So What?/Why So?な回答 => ぶり大根

ぶり大根に至った根拠を、横方向にMECE、縦方向にSo What?/Why So?で考えていく

→ MECE
↓ So What?/Why So?

|気候|感情|季節|健康|
|---|---|---|---|
|今日は寒いから|食べたいから|旬だから|体に良いから|
|最低気温0度|好き|１２月～２月の冬が旬|DHA,EPA,ビタミンB1、B2も豊富|

となり、それを聞いた相手も、なるほどぶり大根いいね！となってくれたら成功ですね。

ぶり大根食べたい。

## プログラミング設計やプルリクエストへの応用

プログラミング設計への応用と考えると、MECEやSo What?/Why So?は有用なのではないでしょうか。
正直まだまだ設計の経験もポテチ並みに薄いのであまり偉そうな事は言えませんが、横方向の情報の粒度も合わせてあげたらなおのこと良いのではないかなと思います。

参考: https://twitter.com/ryosuke_sato/status/1205443641340071936
会社の方に教えていただいたスライドですが、これを思い出しました。

## コミュニケーションは訓練

コミュニケーションは、人里で暮らすにはあるに越したことはない技術だと私は思っています。
そして、そのコミュニケーションは訓練でしか身につかないとも思っています。
(*ゝω･*)o0（感じの良い笑顔は表情筋が作る）

わかりやすく素晴らしいPRやコード、円滑に運営されているチームを見るたびに、根底にあるコミュニケーション能力を感じている毎日です。

地道に実践して身につけていこうと思いますー。
スクロールしたらナビゲーションを固定・変化させる


## html と CSSファイルを準備

```index.html

<header class="l-header js-header">
    <div class="l-header-inner js-header-inner">
      <div class="l-header-horizontal l-inner">
        <a href="#" class="l-header-logo">
          <img src="./img/logo/logo.svg" alt="">
        </a>
        <ul class="l-header-nav">
          <li class="js-smooth-scroll">
            <a href="#1" class="l-header-link" data-target="problems">メニュー1</a>
          </li>
          <li class="js-smooth-scroll">
            <a href="#2" class="l-header-link" data-target="image">メニュー2</a>
          </li>
          <li class="js-smooth-scroll">
            <a href="#3" class="l-header-link" data-target="humanresources">メニュー3</a>
          </li>
          <li class="js-smooth-scroll">
            <a href="#4" class="l-header-link" data-target="specialty">メニュー4</a>
          </li>
          <li>
            <a href="#" class="l-header-link c-button-sm">お問い合わせ</a>
          </li>
        </ul>
      </div>
    </div>
  </header>

```

`CSS`ファイルでは画面上に固定された状態のCSSを書いておく。

```app.scss

.l-header {
  &.is-fixed {
    position: fixed; //画面のいちばん上に固定
    top: 0;
    left: 0;
    background-color: #fff; //色は白にしまーす
    z-index: 2;
    width: 100%;
  }

}

```

##windowオブジェクト （JavaScriptでもっとも重要なオブジェクト）

**windowオブジェクト**は**ブラウザのウィンドウ**のことを指す。
windowオブジェクトはjavaScriptにあらかじめ用意されているオブジェクトで、何もJavaScriptに書かれていない状態でも`windowオブジェクト`を使うことができる。


## JavaScriptの記述

```app.js

$(function() {

  var $win = $(window),
      $header = $('.js-header'),
      height = $header.outerHeight(),
      $main = $('.l-main'),
      headerTop = $header.offset().top,
      fixedClass = 'is-fixed';

  function handleScroll() {
    var value = $(window).scrollTop();
    if ( value > headerTop ) {
      $header.addClass(fixedClass);
      $main.css('margin-top', height)
    } else {
      $header.removeClass(fixedClass);
      $main.css('margin-top', '0');
    }
  }

  handleScroll();
  $win.on('scroll', handleScroll);
});



```

###まずやりたいことを日本語で書き出してみる

**(1) `offset();`を使って`要素`の表示位置を取得する**
**(2) `scrollTop()`を使ってスクロール量を取得**
**(3) スクロール量が`要素`以上となったら`css`を指定


## Firefoxで`load`が使えない問題

```app.js
$(function() {
  var $win = $(window),
      $header = $('.js-header'),
      height = $header.outerHeight(),
      $main = $('.l-main'),
      headerTop = $header.offset().top,
      fixedClass = 'is-fixed';

  $win.on('load scroll', function() {
    var value = $(this).scrollTop();
    if ( value > headerTop ) {
      $header.addClass(fixedClass);
      $main.css('margin-top', height)
    } else {
      $header.removeClass(fixedClass);
      $main.css('margin-top', '0');
    }
  });
});
```

これだとfirefoxでは`load`が正常に発火されません。
AdobeXDの共有プロトタイプを使おう

# AdobeXDって?
> AdobeXDは、共同作業を促進するパワフルで使いやすいプラットフォーム。webサイトやモバイルアプリ、音声インターフェイス、ゲームなどのデザイン制作をチーム全体でスムーズにおこなうことができます。
[Adobe XD体験版ダウンロード | UI/UXデザインと共同作業ツール](https://www.adobe.com/jp/products/xd.html?sdid=19SCDRPN&mv=search&ef_id=EAIaIQobChMI08nftvKf5gIVg3ZgCh2QdQ8WEAAYASAAEgKcrvD_BwE:G:s&s_kwcid=AL!3085!3!341513906626!e!!g!!adobexd)より

- 昨今戦争の激化するプロトタイピングツールの1つ
- WEBサイトのコーディングを行う前のデザインの時点でページ内の動きや推移を確認することができるツール

## プロトタイプ？
> プロトタイプ(prototype)とは、「試作モデル」の意味です。ゲームなどのソフトウェア開発の場合、初期段階にプロトタイプを作成します。
> 操作性、バランス、機能などを確認し、ユーザーからの評価を正式リリース前に反映させる開発手法を「プロトタイピング」と言います。開発途中で確認、修正ができるため、結果、工程数が減り、問題点を早期に発見できるメリットがあります。
プロトタイプは、自動車や身近にある製品などさまざま分野で作られています。最近では、Webサイトやアプリなどでも作成されるケースが増えてきました。

- [参照](https://pantograph.co.jp/blog/production/prototype.html)

詳しい説明は他にもしている方がいると思うので、今回はAdobeXDの使い方の一例を紹介していきます。

# プロトタイプを共有する
- 今回はサンプルとしてワイヤーフレームに[Wires-jp](https://www.behance.net/gallery/67284971/Wires-jp)を使用。

## プロトタイプを作成
- デザインを作成した後に画面左上の**プロトタイプ**を選択します。
![スクリーンショット 2019-12-16 19.34.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/9ea9daf2-f13d-e269-660d-0d279ea00bb5.png)

## 要素と別のページを繋ぐ
- 画像のように要素を選択し、他のページにドラック&ドロップで繋ぎます。
- これにより、指定した要素をクリックした時にページが推移するようになります。
    - 他にもアニメーションをつけたり色々できますが今回は省略します
![スクリーンショット 2019-12-16 19.36.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/0921414d-4476-0d46-d5fa-1309f533e9ef.png)

## 共有を開く
- 画面左上の**共有**を選択します
- 先程プロトタイプで選択したものが表示され、画面右が**リンクを共有**というサイドバーに切り替わります。

![スクリーンショット 2019-12-16 19.41.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/e12fc47a-69e8-2fe9-8490-fa1d020e19d4.png)

- タイトルを設定して（未入力の場合はファイル名）、**リンクを作成**をクリックします。
 ![スクリーンショット 2019-12-16 19.43.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/bf930489-b0e4-d19c-8c1b-080ef545d269.png)
- ページの作成が終われば、鎖のマークをクリックするとリンクがコピーでき、プロトタイプのページへ飛ぶことが出来るようになります。

# 複数のプロトタイプを作成する
## 起点の変更
- デザインに複数パターンがある場合は複数のプロトタイプを作成することもできます。
- 画面左上から**プロトタイプ**を選択します。
![スクリーンショット 2019-12-16 19.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/77f87386-78d9-6262-ae13-b70c8c6819a7.png)
    - ページのタイトル部分をクリック　
    - 左上に家のマークが出るので、これをクリックする　
    - クリックしたものがアクティブになる。

- これにより、プロトタイプの起点（初めに表示されるページ）が変わるようになります。

## 別のリンクを作成する
- 画面左上から共有を選択
- 右のサイドバーのリンクの隣にある**▼**をクリック

![スクリーンショット 2019-12-16 19.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/181787dd-23c6-aa18-87c5-9c2b4c9407c1.png)

- **新規リンクを作成** をクリック

- 残りは同様にタイトルを決めてから**リンクを作成**をクリックすれば先程の作成したのとは別ペターンのプロトタイプを作成できる。

# 数が増えすぎた時は
- 画面左上から**共有**を選択します
- 右のサイドバーのリンクの隣にある**▼**をクリックします

![スクリーンショット 2019-12-16 19.52.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248214/e940c4a2-c9e2-61e0-b06a-5994b2c78462.png)
- **リンクを管理**をクリックします
- これで新規ウインドウが立ち上がって、これまでに作成したものを一覧で見ることが出来ます。
- ここから削除したりといった管理も可能です。

# さいごに
WEBデザインではたくさんの人が関わる仕事なので情報や価値の共有は大切です。
AdobeXDはそんな共有に便利なツールですので、是非是非使ってみてください。
無料版だけでも十分使える機能満載です！
ちなみに無料版では1つしか共有プロトタイプが作れません~~ので、是非有料版を買いましょう！！~~
terraformを効率的に習得する方法

この記事は [ジーズアカデミー Advent Calendar 2019](https://qiita.com/advent-calendar/2019/gsacademy?fbclid=IwAR3U3YNDF1LBue5viSUCgbEhyM2YFun3UuqZu5dvMXJ64FU3g0jwPejuo5w) の17日目の記事です。

本日は自分がterraformを習得してきた過程を振り返りながら、こうやったら効率的に習得できると思うことを書いて行きたいと思います！

普段は業務でバックエンドとインフラを担当しており、AWSで構築したインフラをterraformで運用しています。
なので、本記事もクラウドはAWSを使うことを前提としています。

# 本記事の対象者
本記事は下記の方を対象としています。

- これからAWSなどのクラウドを触ってみようと思っている方
- AWS上でインフラは立てられるけどterraformでのコード化に興味がある方
- devopsに興味のある方

# 目指すレベル
- terraformでAWS上のインフラをコード化することができる
- terraformのコードを共通化しつつ、production, stagingなど別々の環境を別々の設定で作成できる
- 基礎的なインフラ構成やECSを用いたコンテナオーケストレーションまで独力で実装できる

# 学習の流れ
自分が考えるterraformの効率的な習得方法は下記です。

- AWSのコンソールで一度インフラを構築してみる
- コンソールで構築したインフラをterraformでコード化する

**いきなりterraformから入らないことが重要**です。

理由は**terraformの実装にはAWSの知識が必要だから**です。

AWSのコンソールで設定している各項目とterraformの記載項目が頭の中でマッピングできればterraformの実装は全然難しくないです。
なので、まずはAWSのコンソールで設定しなければならいことを理解することが習得の近道です。

ネットワークや仮想サーバー、DBを立てる時にどんなことを設定しないといけないのかということを理解し、それをterraformでどう記載するのかを理解することが習得の近道だと思います。

# 学習教材
では、AWSとterraformを始めるにあたって自分が役に立ったと思う書籍を紹介します。

### AWSの学習
AWSの入門としておすすめなのがこちら。

- [Amazon Web Services 基礎からのネットワーク&サーバー構築](https://amzn.to/2LAqJBR)

読み進めながらインフラを構築できることと、図解が多くてとても読みやすいです。
ルーティングやセキュリティグループの設定などネットワークに関わる部分の説明もわかりやすいのでAWSをこれから始めたい方にはおすすめです。

- [AWS公式ドキュメント](https://docs.aws.amazon.com/index.html)
AWSの公式ドキュメントもかなり活用しました。
一番詳しい&信頼できる情報源なので、不明点があればまずはこちらを見てみると良いと思います。

- [AWSエキスパートに直接聞く](https://aws.amazon.com/jp/blogs/startup/weekly-aae-06/)
あと、自分がよくやっていたのがAWSのエキスパートに直接質問しにいくことです。
目黒にあるAWS LoftはAWSアカウントを持っていれば誰でも入館でき、AWSのエキスパートに無料で質問できます。
参考書にのっていないことなどは一人で悩んでも解決に時間がかかるので、さくっと専門家に聞いた方が効率的に問題解決できます。

### terraformの学習
- [Programatic Terraform on AWS](https://booth.pm/ja/items/1318735)

terraformの入門におすすめなのがこちらの1冊です。
この1冊でterraformの環境構築から、コードを共通化しつつstaging, production環境で設定値を変えることや、各種コマンド、ECSでのコンテナオーケストレーションまで説明されています。
これ1冊やっておけば、terraformの基礎は習得できると思います。

- [terraform公式ドキュメント](https://www.terraform.io/docs/providers/aws/index.html)

terraformの公式ドキュメントは実装例がのっており、非常にわかりやすいです。(英語なのが少しハードルありますが。。)
不明点があったらこちらで調べながら実装するのが良いと思います。

# まとめ
自分がこの記事で言いたかったのはいきなりterraformから入らずにAWSの理解から始めるとterraformの習得もスムーズだよ！ということです。

自分がインフラを始める前はインフラってすごく難しそうだなという印象があったのですが、やってみたら意外とやれたので興味のある方は是非トライしてみてください〜。


# 関連記事
[tfenvを用いたterraformのインストール方法](https://qiita.com/sasshi_i/items/b5117d51fed800fa6b09)

[direnvを用いてterraformで複数のAWSアカウントを使い分ける方法](https://qiita.com/sasshi_i/items/609044aa106cdcb43a89)

[terraformでVPC, サブネットを作成する](https://qiita.com/sasshi_i/items/f4f65e18923d856be256)
React素人がいきなりMaterial-UIを使いこなそうとした

####私について
Laravelを使ってアプリを作り、そのポートフォリオ作成後にエンジニアとして転職。
なんとなくコードはかけるけど、基礎は全く分かってない。
そんな状態で2019-11-18 エンジニアとしてデビュー。現在Laravel,React.jsを使っています。
2019-12月までReact.jsに関しては全くの無知でした。
そんな素人だけどアウトプットが大事ということで、とにかくやってみます。

#Material-UI
Material-UIとは、マテリアルデザインをReactで可能にするためのUIコンポーネント
初心者の僕にはまずマテリアルデザインとUIコンポーネントが分からない。
・マテリアルデザイン：影などアニメーションで動きをつけ視覚的変化があり、ユーザーにとって分かりやすいデザイン。
・UIコンポーネント：UIはユーザーが見える部分や使用する部分。コンポーネントは、要素。例...ボタンやナビゲーションなど。
つまり、Material-UIを使えば、視覚的に分かりやすく使いやすい画面を簡単に作ることができるのです。

##実際に使ってみたが、、、
React学習２週間ほどの、僕には使うことが難しい！
なぜかというと、Reactには書き方が大きく分けて２つあるからだ！なんで２つもあんの？？

```react:qiita.jsx
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}
```
```react:qiita.jsx
class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}
```
この２つの書き方にまず混乱してしまいます。基本的にコンポーネントを使う際は上の書き方が普通とされています。
Material-UIでは全て上の書き方(JavaScript の関数)で書かれている。
するとここで、下の書き方(ES6 クラス)の時にどう使えばいいか分からない！

#Material-UIをESクラスに書き込んでみた。
Material-UIのButtonのコンポーネントは以下のように書かれている。

```react:qiita.jsx
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Button from '@material-ui/core/Button';

const useStyles = makeStyles({
  root: {
    background: 'linear-gradient(45deg, #FE6B8B 30%, #FF8E53 90%)',
    border: 0,
    borderRadius: 3,
    boxShadow: '0 3px 5px 2px rgba(255, 105, 135, .3)',
    color: 'white',
    height: 48,
    padding: '0 30px',
  },
});

export default function Hook() {
  const classes = useStyles();
  return <Button className={classes.root}>Hook</Button>;
}
```
ES6クラスにこのコードを書き込もうとすると、うまくいかない！
以下のコードが書き込めない！！２つの書き方の違いを気づくのに2時間かかりました。。

```react:qiita.rb
   const classes = useStyle();
```
そこで、、、、
#スタイル付きコンポーネントAPIを使う。

```react:qiita.jsx
import React from 'react';
import { styled } from '@material-ui/core/styles';
import Button from '@material-ui/core/Button';

const MyButton = styled(Button)({
  background: 'linear-gradient(45deg, #FE6B8B 30%, #FF8E53 90%)',
  border: 0,
  borderRadius: 3,
  boxShadow: '0 3px 5px 2px rgba(255, 105, 135, .3)',
  color: 'white',
  height: 48,
  padding: '0 30px',
});

class Book extends Component{
  return <MyButton>Styled Components</MyButton>;
}
```
この書き方でMaterial-UIのcomponentsを使うことができた。
という解釈でいいのか分からないけど、これで使えた。
なにか他にいいのがあれば教えてください。
gormと仲良くなりたい(2) - datetimeでマイクロ秒(6桁)まで格納/取得する

# はじめに
GoでORMを使用する時の定番である [gorm](http://gorm.io/) のお話2つ目。
以下動作は Databse MySQL5.7 の場合です。

gorm の `Auto Migrations` は便利なんですが `time.Time` が絡むと地味に厄介です。
今回のネタは上記の問題を解決して `マイクロ秒(6桁)まで格納する` までの検証です。

# 検証: デフォルト

gormのタグを何も定義せずに `time.Time`型 で `Auto Migrations` してみましょう。

今回の検証とは関係ないですがMySQL/Goでは `time.Time` を使用したい場合DatabaseUrlに`?parseTime=true` をしていおかないと上手く `time.Time` 型にパース出来ない事があります。

以下の実装では

* table作成(Drop/AutoMigrate)
* データ投入 (Create) => `2006-01-02 15:04:05.999999999`
* レコード取得1件 (First)

を行います。

```Go
package main

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
	"time"
)

type Sample struct {
	SampleDate time.Time
}

func main() {
	db, err := gorm.Open("mysql", "test:test@/sample?parseTime=true")
	if err != nil {
		panic("failed to connect database")
	}
	defer db.Close()

	// Drop Table
	if err := db.DropTableIfExists(&Sample{}).Error; err != nil {
		panic(err.Error())
	}
	// Migrate the schema
	if err := db.AutoMigrate(&Sample{}).Error; err != nil {
		panic(err.Error())
	}

	// Create
	dt := time.Date(2006, 1, 2, 15, 4, 5, 999999999, time.UTC)
	fmt.Printf("insert data = %+v\n", dt)
	db.Create(&Sample{SampleDate: dt})

	var result Sample
	if err := db.First(&result).Error; err != nil {
		panic(err.Error())
	}
	fmt.Printf("result: %+v\n", result)
}
```

```SQL
> SHOW CREATE TABLE samples;
CREATE TABLE `samples` (
  `sample_date` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
```

```
insert data = 2006-01-02 15:04:05.999999999 +0000 UTC
result: {SampleDate:2006-01-02 15:04:05 +0000 UTC}
```

`timestamp`型でColumnが作られました。
`timestamp`型には以下の問題があります。

* デフォルトでは秒までしか入らない
* `2038-01-19 03:14:07` までしか格納できない[2038年問題](https://dev.mysql.com/doc/refman/5.7/ja/datetime.html)が発生する

Selectの結果を見ても秒までしか取得できていないことが分かります。

# 解決策: `datetime(6)` 型で定義する

[公式Doc](http://gorm.io/ja_JP/docs/models.html)に書いてありますが gorm では structタグ で型を定義できます。
SampleDateのタグに `gorm:"type:datetime(6)"` を設定します。

```Go
type Sample struct {
	SampleDate time.Time `gorm:"type:datetime(6)"`
}
```

実行結果は以下の通り。

```
insert data = 2006-01-02 15:04:05.999999999 +0000 UTC
result: {SampleDate:2006-01-02 15:04:05.999999 +0000 UTC}
```

マイクロ秒(6桁)まで正しく取得できました。
マイクロ秒は9桁までありますがMySQLでは `datetime(6)` 以上の精度では設定できません。
7桁目以降の精度の値は切り捨てられている点は注意が必要です。

# おまけ: ミリ秒を使いたい

マイクロ秒ではなくミリ秒を使いたい場合もあると思います。
その場合は、ミリ秒まで格納できるよう `datetime(3)` のColumnを定義します。

```Go
type Sample struct {
	SampleDate time.Time `gorm:"type:datetime(3)"`
}
```

マイクロ秒まで持った`time.Time`を格納すると

```Go
	dt := time.Date(2006, 1, 2, 15, 4, 5, 123999999, time.UTC)
	fmt.Printf("insert data = %+v\n", dt)
	db.Create(&Sample{SampleDate: dt})
```

```
insert data = 2006-01-02 15:04:05.123999999 +0000 UTC
result: {SampleDate:2006-01-02 15:04:05.124 +0000 UTC}
```

四捨五入されます。
MySQL5.5まではミリ秒以上の精度のデータは切り捨て
MySQL5.6以降の場合はミリ秒以上の精度のデータは四捨五入されます。
テストデータでうっかり四捨五入されてtestに失敗しないよう注意が必要です。


# まとめ
* `time.Time`の定義はgormではデフォルトで`timestamp`型になる
* structタグで色々出来ます[公式Doc](http://gorm.io/ja_JP/docs/models.html)を読みましょう
* MySQL/Goではマイクロ秒は6桁までしか精度が担保できない
* datetime(3) (ミリ秒) を使う場合はマイクロ秒の精度の値が格納された際の考慮が必要
CASTableの絞り込み条件をプログラマブルに指定する

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームです。PythonやJava、Rなどの言語を通して利用できます。そのSAS Viyaの中で使われているのがCASTableというテーブルオブジェクトです（CASはCloud Analytic Servicesの略です）。今回はCASTableでデータを絞り込む、where句のような指定をプログラミングから行う方法を解説します。

## データベースからテーブルを取得する

まずはSAS Viyaに接続します。

```py
import swat
conn = swat.CAS('server-name.mycompany.com', 5570, 'username', 'password')
```

次にCASTableを取得します。今回はIRISデータのCSVを利用します。

```py
tbl = conn.loadtable('data/iris.csv', caslib='casuser').casTable
```

## データを絞り込む

例えばpetal_lengthが6.5より大きいデータだけを取得します。

```py
expr = tbl.petal_length > 6.5
```

このデータを出力します。

```py
expr.head()
```

これはあくまでも条件を保存しただけの結果になります。

```
0    0.0
1    1.0
2    1.0
3    0.0
4    1.0
Name: _gt_0_, dtype: float64
```

では、この絞り込み条件をCASTableに適用します。

```py
newtbl = tbl[expr]
newtbl.head()
```

そうすると絞り込まれたデータが表示できます。

| | sepal_length | sepal_width | petal_length | petal_width | species |
|----|----|----|----|----|----|
| 0 | 7.7 | 2.6 | 6.9 | 2.3 | virginica |
| 1 | 7.7 | 2.8 | 6.7 | 2.0 | virginica |
| 2 | 7.7 | 3.8 | 6.7 | 2.2 | virginica |
| 3 | 7.6 | 3.0 | 6.6 | 2.1 | virginica |

## 条件の指定法について

条件は次のようにキーとして渡すこともできます。

```py
newtbl = tbl[tbl.petal_length > 6.5]
newtbl.head()
```

| | sepal_length | sepal_width | petal_length | petal_width | species |
|----|----|----|----|----|----|
| 0 | 7.7 | 2.6 | 6.9 | 2.3 | virginica |
| 1 | 7.7 | 2.8 | 6.7 | 2.0 | virginica |
| 2 | 7.7 | 3.8 | 6.7 | 2.2 | virginica |
| 3 | 7.6 | 3.0 | 6.6 | 2.1 | virginica |

## 条件を追加する

さらに絞り込み条件を追加することもできます。

```py
newbl2 = newtbl[newtbl.petal_width < 2.2]
newtbl2.head()
```

| | sepal_length | sepal_width | petal_length | petal_width | species |
|----|----|----|----|----|----|
| 0 | 7.7 | 2.8 | 6.7 | 2.0 | virginica |
| 1 | 7.6 | 3.0 | 6.6 | 2.1 | virginica |

## 条件を詳細にする

条件は計算処理を指定できます。

```py
tbl[(tbl.petal_length + tbl.petal_width) * 2 > 17.5].head()
```

| | sepal_length | sepal_width | petal_length | petal_width | species |
|----|----|----|----|----|----|
| 0 | 7.7 | 2.6 | 6.9 | 2.3 | virginica |
| 1 | 7.7 | 3.8 | 6.7 | 2.2 | virginica |

次のように、文字列を変換した上で検索なんて指定も可能です。

```py
tbl[tbl.species.str.upper().str.startswith('SET')].head()
```

| | sepal_length | sepal_width | petal_length | petal_width | species |
|----|----|----|----|----|----|
| 0 | 5.8 | 4.0 | 1.2 | 0.2 | setosa |
| 1 | 5.7 | 3.8 | 1.7 | 0.3 | setosa |
| 2 | 5.7 | 4.4 | 1.5 | 0.4 | setosa |
| 3 | 5.5 | 3.5 | 1.3 | 0.2 | setosa |
| 4 | 5.5 | 4.2 | 1.4 | 0.2 | setosa |

## まとめ

SAS ViyaのCASTableを使えば、SQLのような特殊な書き方を覚えずにPythonプログラミングの範囲で記述できます。条件をダイナミックに変更したり、インタラクティブに分析するのも容易です。ぜひお試しください。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
CASTableでカラムを指定して取得するloc/iloc/ixの使い方

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームです。PythonやJava、Rなどの言語を通して利用できます。そのSAS Viyaの中で使われているのがCASTableというテーブルオブジェクトです（CASはCloud Analytic Servicesの略です）。今回はCASTableでloc/iloc/ixを使って列を指定してデータを取得する方法を解説します。

## データベースからテーブルを取得する

まずはSAS Viyaに接続します。

```py
import swat
conn = swat.CAS('server-name.mycompany.com', 5570, 'username', 'password')
```

次にCASTableを取得します。今回はIRISデータのCSVを利用します。

```py
tbl = conn.loadtable('data/iris.csv', caslib='casuser').casTable
```

## 列を指定する

列を指定する際には loc を使い、2つ目の引数にカラム名を指定します。

```py
tbl.loc[:, 'petal_width'].head()
```

そうすると、指定されたカラムの値だけが取得できます。

```
0    2.0
1    2.3
2    2.0
3    2.3
4    2.2
Name: petal_width, dtype: float64
```

これは複数カラム指定できます。

```py
tbl.loc[:, 'sepal_length':'petal_length'].head()
```

複数カラムの場合はヘッダー行が表示されます。範囲で指定しますので、間に存在するsepal_widthも表示されます。

| | sepal_length | sepal_width | petal_length |
|----|----|----|----|
| 0 | 7.9 | 3.8 | 6.4 |
| 1 | 7.7 | 2.6 | 6.9 |
| 2 | 7.7 | 2.8 | 6.7 |
| 3 | 7.7 | 3.0 | 6.1 |
| 4 | 7.7 | 3.8 | 6.7 |

もしカラムを特定したい場合には配列で指定してください。

```py
tbl.loc[:, ['petal_width', 'sepal_width']].head()
```


| | petal_width | sepal_width |
|----|----|----|
| 0 | 2.0 | 3.8 |
| 1 | 2.3 | 2.6 |
| 2 | 2.0 | 2.8 |
| 3 | 2.3 | 3.0 |
| 4 | 2.2 | 3.8 |

カラム名ではなく数字でも指定できます。

```py
tbl.loc[:, 3].head()
```

```
0    2.0
1    2.3
2    2.0
3    2.3
4    2.2
Name: petal_width, dtype: float64
```

複数カラム指定も同様です。

```py
tbl.iloc[:, 0:3].head()
```

| | sepal_length | sepal_width | petal_length
|----|----|----|----|
| 0 | 7.9 | 3.8 | 6.4 |
| 1 | 7.7 | 2.6 | 6.9 |
| 2 | 7.7 | 2.8 | 6.7 |
| 3 | 7.7 | 3.0 | 6.1 |
| 4 | 7.7 | 3.8 | 6.7 |

カラムを特定する場合は配列というのも同じです。

```py
tbl.iloc[:, [3, 1]].head()
```

| | petal_width | sepal_width |
|---|---|---|
| 0 | 2.0 | 3.8 |
| 1 | 2.3 | 2.6 |
| 2 | 2.0 | 2.8 |
| 3 | 2.3 | 3.0 |
| 4 | 2.2 | 3.8 |

数字とカラム名の組み合わせも可能です。

```py
tbl.ix[:, [3, 'sepal_width']].head()
```

| | petal_width | sepal_width |
|----|----|----|
| 0 | 2.0 | 3.8 |
| 1 | 2.3 | 2.6 |
| 2 | 2.0 | 2.8 |
| 3 | 2.3 | 3.0 |
| 4 | 2.2 | 3.8 |

## まとめ

一部のデータだけ見て分析したい場面は多いでしょう。そんな時にはlocやiloc、ixを使って素早くデータを抽出してください。数字はループ処理に使うのも簡単なので、分析や計算処理の自動化にも使えるはずです。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
CASTableで一部のカラムだけ表示、分析する

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームです。PythonやJava、Rなどの言語を通して利用できます。そのSAS Viyaの中で使われているのがCASTableというテーブルオブジェクトです（CASはCloud Analytic Servicesの略です）。今回はCASTableで一部のカラムだけ取り出して情報を表示する方法を紹介します。

## データベースからテーブルを取得する

まずはSAS Viyaに接続します。

```py
import swat
conn = swat.CAS('server-name.mycompany.com', 5570, 'username', 'password')
```

次にCASTableを取得します。今回はIRISデータのCSVを利用します。

```py
tbl = conn.loadtable('data/iris.csv', caslib='casuser').casTable
```

## カラムを取得する

tblをdictとして、キーを指定してカラムが取り出せます。

```py
col = tbl['sepal_width']
col
```

出力すると次のようになります。

```py
CASColumn('DATA.IRIS', caslib='CASUSER(username)')['sepal_width'].sort_values(['sepal_length', 'sepal_width'], ascending=[False, True])
```

## データを表示する

カラムの `head` メソッドを使うと、そのカラムの値だけが出力されます。

```py
col.head()
```

```
0    3.8
1    2.6
2    2.8
3    3.0
4    3.8
Name: sepal_width, dtype: float64
```

## 複数カラム取得する

同様にキーを配列で与えれば複数カラム取得できます。

```py
widths = tbl[['sepal_width', 'petal_width', 'species']]
```

内容は次のようになります。

| | sepal_width | petal_width | species |
|------------|-------------|-----------|-----------|
| 0 | 3.8 | 2.0 | virginica |
| 1 | 2.6 | 2.3 | virginica |
| 2 | 2.8 | 2.0 | virginica |
| 3 | 3.0 | 2.3 | virginica |
| 4 | 3.8 | 2.2 | virginica |

データの概要も確認できます。

```py
widths.describe()
```


| | sepal_width | petal_width |
|-------|-------|-------|
| count | 150.000000 | 150.000000 |
| mean | 3.054000 | 1.198667 |
| std | 0.433594 | 0.763161 |
| min | 2.000000 | 0.100000 |
| 25% | 2.800000 | 0.300000 |
| 50% | 3.000000 | 1.300000 |
| 75% | 3.300000 | 1.800000 |
| max | 4.400000 | 2.500000 |

同様にカラム情報を表示します。

```py
widths.columninfo()
```

| | Column | ID | Type | RawLength | FormattedLength | NFL | NFD |
|----|----|----|----|----|----|----|----|
| 0 | sepal_width | 2 | double | 8 | 12 | 0 | 0 |
| 1 | petal_width | 4 | double | 8 | 12 | 0 | 0 |
| 2 | species | 5 | varchar | 10 | 10 | 0 | 0 |

## まとめ

一部のカラムを取得すれば、カラムが多数あるテーブルであっても必要なものだけに絞り込んで分析が行えます。数字データが多すぎて分析の手の付け所が分からない場合などに利用できるでしょう。

[SAS for Developers | SAS](https://developer.sas.com/home.html)
Jacksonの基本的な使い方メモ

# Jacksonのインストール

build.gradleは以下の通りです。

```gragle:build.gragle
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.9.1'
```

# 基本的な使い方

## オブジェクトに変換したいJSON


```json:user.json
[
    {
        "name": "amy",
        "age": 10
    },
    {
        "name": "john",
        "age": 25
    },
    {
        "name": "lisa",
        "age": 49
    }
]
```

## JSONをマッピングするクラス

```java:UserJson.class
public class UserJson {
	private String name;
	private String age;

	public void getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}
}
```

## マッピングを行う

```java
List<UserJson> userList = new ArrayList<UserJson>();
ObjectMapper mapper = new ObjectMapper();
try {
	user = mapper.readValue("json文字列", new TypeReference<List<UserJson>>() {
	});
} catch (IOException e) {
	// エラー
}
```

上記のようにマッピングすると、対象のJsonが `userList` ( `UserJsonのList
` )になります。

`UserJson`にgetterを定義しておくと、要素にgetterでアクセスできるようになります。

```java:getterでのアクセス例
System.out.println(userList.get(1).getName());
// 出力：amy
```



# tips

## プロパティを任意の値に変更

以下のようにアノテーションを使用すると、プロパティの名前を変更できます。
（デフォルトは、 Java のフィールド名が使用されます）

```java
@JsonProperty("name")
private String firstName;

```

## マッピング対象のクラスに存在しないフィールドを無視する

JSONからマッピングをする際に、`JSONには存在するが、マッピング対象のクラスには存在しないフィールド`があると、エラーが発生します。
それを回避するために、以下のアノテーションを、マッピング対象に記述します。

```java:UserJson.class
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserJson {

...
```
Nuxt.js の generate で生成したページに 「/index.html」でアクセスすると JavaScript が実行されない問題

タイトルの通りですが、Nuxt.js の generate で生成したページに 「/index.html」（ファイル名指定）でアクセスすると JavaScript が実行されない問題に遭遇しました。
恐らく Vue Router に登録されていないルーティングと判定されページに紐付く JavaScript が実行されていない状況だったのかと思います。

私は、この問題に対して Nuxt.js の「アプリテンプレート」を用いて対応しました。

## アプリテンプレートとは何か？
Nuxt.js の Layout コンポーネントの雛形になるものです。
使い方はとても簡単で、ビルド前のソース一式が格納されているフォルダの直下に`app.html`を配置します。

```mustache:app.html
<!DOCTYPE html>
<html {{ HTML_ATTRS }}>
  <head {{ HEAD_ATTRS }}>
    <script>
      console.log('this is app.html')
    </script>
    {{ HEAD }}
  </head>
  <body {{ BODY_ATTRS }}>
    {{ APP }}
  </body>
</html>
```

このような`app.html`を用意しておくとビルド後の全ページで`console.log('this is app.html')`を実行する事ができます。
これはHTMLに直接 JavaScript を書いているので、ルーティングに関係なくページが読み込まれたら必ず実行する事ができます。
詳細は[公式ドキュメント](https://ja.nuxtjs.org/guide/views/#%E3%82%A2%E3%83%97%E3%83%AA%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88)を参照してください。

## アプリテンプレート内にリダイレクトの処理を記述する
あとは、URLを見てリダイレクトの処理を書くだけです。

```mustache:app.html
<!DOCTYPE html>
<html {{ HTML_ATTRS }}>
  <head {{ HEAD_ATTRS }}>
    <script>
      (function(){
        const regex = RegExp('^.*index.html$')
        const path = window.location.href

        if (regex.test(path)) {
          window.location.href = path.replace('/index.html', '')
        }
      })()
    </script>
    {{ HEAD }}
  </head>
  <body {{ BODY_ATTRS }}>
    {{ APP }}
  </body>
</html>
```

## まとめ
記事にした内容で「/index.html」にアクセスした際の対応を行いましたが、 Vue Router の設定でもっとスマートに解決できる問題かもしれません。
もし他の方法で対応したなど知見があれば教えて頂きたいです。
QGISで緯度経度の距離をメートルで取得する

## はじめに
レイヤの座標系が緯度経度でのメートルで値が取得方法を書きます。参考値とはなると思う値です。
他にいい方法があったら教えてください。

### 環境
QGIS 3.4.4

## DistansAreaを使う
```python

layer = iface.activeLayer()
crs = layer.crs()
feature = layer.selectedFeatures()[0]
geom = feature.geometry()
print(geom.length())

area = QgsDistanceArea()
area.setEllipsoid(crs.ellipsoidAcronym())
print(area.measureLength(geom))
```

### 2.18でのコードの供養
```python

layer = iface.activeLayer()
crs = layer.crs()
feature = layer.selectedFeatures()[0]
geom = feature.geometry()

area = QgsDistanceArea()
area.setEllipsoid(crs.ellipsoidAcronym())
area.setEllipsoidalMode(True)
print area.measureLength(geom)
```

## 参考
[QGIS Documentation: QgsDistanceArea](https://qgis.org/api/classQgsDistanceArea.html)
[stackexchange: QGIS Python Distance between points](https://gis.stackexchange.com/questions/207942/qgis-python-distance-between-points)
[QgsDistanceArea.convertMeasurement not enough arguments error](https://gis.stackexchange.com/questions/213226/qgsdistancearea-convertmeasurement-not-enough-arguments-error)
音感を鍛えるツールをNuxt.js × Netlifyで作った

#はじめに
フロントエンドのエコシステムのトレンドって日々移り変わってきますよね。儚い。
最近は、サーバレスアーキテクチャやホスティングサービスが充実してきて、インフラに手間をかけることなくアプリケーションの開発ができるようになってきました。
今回はその中でも業務でいずれ触るかもしれないと思ったものを使いつつ、この記事を読んでくれている音楽好きな方に向けてツールを作ってみました。

#作ったもの
「otohaba(オトハバ)」
２つの音の度数関係をクイズで出題するツール
https://serene-austin-c74890.netlify.com/
![otohaba.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185396/06566e89-2e73-68fe-bb57-603fcdfd8aca.gif)
github:https://github.com/takahirotanaka0920/otohaba

音程について詳しくなりたい方はこちら
https://ja.wikipedia.org/wiki/%E9%9F%B3%E7%A8%8B
#使ったもの
## Nuxt.js
- Vue.jsを主体としてフロントエンドの開発に必要なツールをパッケージとして提供してくれるフレームワーク
- Vue Cliと比較して規約の上で開発するため、大規模な開発になっても開発方針が立てやすいメリットがある
<img width="1411" alt="スクリーンショット 2019-12-17 9.23.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185396/b982ac28-9ab6-acea-1739-731bd979f5d6.png">

公式：https://ja.nuxtjs.org/

## Netlify
- 静的ウェブサイトのためのホスティングサービス
- サーバーレスのバックエンドサービス
<img width="1415" alt="スクリーンショット 2019-12-17 9.24.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185396/ac80339a-5753-ce62-96e1-d6f50fde4848.png">

公式：https://www.netlify.com/

## Tone.js
- Web上でAudioを扱うためのjsライブラリ
- 今回は度数問題用のシンセ音の生成のために利用

```javascript:ex.js
//create a synth and connect it to the master output (your speakers)
var synth = new Tone.Synth().toMaster()

//play a middle 'C' for the duration of an 8th note
synth.triggerAttackRelease('C4', '8n')
```

github:https://tonejs.github.io/

#構成
Netlifyとgithubの連携を行い、nuxtの変更結果をgithubにpushすると自動でdeployできる。
buildはnuxt generateを行い、静的なサイトを生成し、Netlifyでホスティング。
![otohaba.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185396/08826dca-dcd8-5f3e-32b8-6c196c424f6f.png)

#ビルド方法について

##SSR
初回リクエストをサーバーサイドでレンダリングして返す

##SPA
ブラウザによるページ遷移を行わずにコンテンツの切り替えなどを行う

##静的化
各パスに静的なhtmlをビルドしておく


それぞれのビルド方法のメリット/デメリットはこちら
[Nuxt.jsを使うときに、SPA・SSR・静的化のどれがいいか迷ったら](https://qiita.com/nishinoshake/items/f42e2f03663b00b5886d)


#所感
- nuxtはnpmさえあればほとんど環境構築がいらず、すぐに開発に入ることができた。
- 公式ドキュメントが充実していてわかりやすい。Netlifyへのデプロイも載っている。[Netlify へデプロイするには？](https://ja.nuxtjs.org/faq/netlify-deployment/)
- 非常に多機能なので、最初から全てを理解しようとはせず自分の実現したいことに対してリファレンス式でドキュメントを追ってみても良いと思った。

#まとめ
モダンな開発を体験するという意味で最近のリッチなツールが揃っているnuxt.jsは良い選択肢だと思います。
otohabaは年内は公開しておこうと思うので、自分の音感が気になる方はぜひ。
Cannot find module '../assets/css/index.css'が発生したのでキャッシュを削除する

CSSからSCSSに移行した時、以下のようなエラーが出力されました。

```
Cannot find module '../assets/css/index.css'
```

# 環境

- Nuxt 2.0

# 解決策

`.nuxt/App.js`を一度削除して、サーバー再起動したのちブラウザからアクセスすればファイルが自動生成されエラーが解消されます。

# 原因

もともと`nuxt.config.js`にグローバルなCSSとして`assets/css/index.css`を設定していたために`assets/css/index.css`読み込み処理が`.nuxt/App.js`内に書かれていました。
しかし、今回SCSSの導入に伴い既存のファイルを削除し新たにSCSSファイルとして導入し直しましたのですが、以前のCSS読み込みがキャッシュされていたためエラーが出ていたようです。

# まとめ

Nuxtでは時たまキャッシュのせいで上手くいかないタイミングがあるので、エラーの内容をしっかりみるようにしましょう。
Gitでブランチ切って開発してマージするまでの流れをざっくり説明

#背景
gitでの共同開発の流れを調べるときに、詳しく説明してくれるサイトが多く最初は助かったのですが、gitコマンドを確認したいだけの時に余計な説明が多いと確認がめんどくさいので最小限の説明ですぐにgitコマンドが確認できるようになったら良いと思ったから。

###masterブランチから作業用ブランチを切る

```
#新規ブランチ作成
$ git branch new_baranch
#作成したブランチに切り替え
$ git checkout new_baranch
```
作業する、、、

###作業完了後、リモートリポジトリにプッシュ

```
$ git add .
$ git commit -m "作業完了"
#リモートリポジトリにプッシュする
$ git push origin new_baranch
```

###リモートリポジトリでマージ
githubなどのリモートリポジトリでプルリクエストをして問題が無ければマージして余計なブランチは削除する

###ローカルとリモートを同期

```
#branchをマスターに変更
$ git checkout master
#リモートリポジトリから最新の状態をプルする
$ git pull origin master
#不要なbranchを削除
$ git branch -d new_branch
```
終わり！
データストアをざっくりと分類してみた

# はじめに
近年、情報システムで扱うデータの量や種類の増加、データ処理に関する要求の多様化に伴い、データを蓄積するための様々な技術が利用できるようになっています。例えば、リレーショナルデータベース（RDB）、キーバリューストア、ドキュメントデータベース、カラムナ、インメモリ、グラフデータベース、分散ファイルシステム、オブジェクトストレージなど、いくらでも挙げられるかと思います。

そこで、本記事では、データストアをざっくり分類し、それらの使い分けをシンプルにまとめてみました。複雑化する一方のデータストアを紐解くための足掛かりになればと考えています。

# データストアの種類と特徴
まずデータストアを分類します。様々な分類の仕方があり、例えばDB-ENGINESサイトでは、以下の様に分類しています。

- リレーショナルデータベース（RDB）
- キーバリューストア（KVS）
- ドキュメントストア
- グラフデータベース
- 時系列データベース
- オブジェクト指向データベース
- サーチエンジン
- ワイドカラムストア
- ネイティブXMLデータベース
- イベントストア
- RDFストア　他

これだとざっくり分類するには細か過ぎてしまうので、もう少し大きく分類してみると、今でも広く使われているRDB、それを補完する形で現れたNoSQLデータベース、大量データ処理のために現れたHadoopの３種類でしょうか。さらにRDBは用途によってアーキテクチャが異なること、Hadoopに関しては、エコシステムとして発展中であることから、以下の4つに分類してみました。

- RDB（行指向型）
- RDB（列指向型）
- NoSQLデータベース
- Hadoopエコシステム


それぞれのカテゴリのおおまかな特徴について解説します。

# RDB（行指向型）
基幹系システムを中心に幅広く使われているデータベースです。特徴として以下を挙げることができます。

- ACID特性に基づく厳格なトランザクション
- 拡張性は低め
- データ操作にSQLを利用できる
- データを行単位で格納する
- 主に構造化データを扱う

# RDB（列指向型）
情報系システムを中心に使われているデータベースです。特徴として以下を挙げることができます。

- 主に参照用
- シャーディング（大きなデータセットを水平分割して複数ノードに分散配置すること）によるスケールアウト等により、拡張性が高い
- データ操作には主にSQLを利用する
- データを列単位で格納する
- 主に構造化データを扱う

# NoSQLデータベース
RDB以外のデータベースをひとまとめにしてNoSQLと呼んでいます。このため、KVS、ドキュメントストア、グラフデータベースなど様々なデータストアがこのカテゴリに含まれ、カテゴリ毎に特徴が異なります。
以降ではこの中の一つである、KVSに絞って説明します。

KVSの特徴として以下を挙げることができます。

- BASE特性に基づく結果整合性レベルのデータ整合性
- マルチマスタ（複数ノードで更新可能）やシャーディングによるスケールアウト等で、拡張性が高い
- データ操作には、SQL（ライクなインタフェース）やAPIを利用できる
- キーと値の組み合わせというシンプルな形式でデータを格納
- 主に非構造化データを扱う

# Hadoopエコシステム
このカテゴリは大きく以下の要素からなると考えます。

- 分散ファイルシステム
- 分散アプリケーションフレームワーク
- クエリエンジン
- その他

これらを組み合わせることでいろいろな事を実現できるため、組み合わせによって特徴は異なります。そのため以降では、分散アプリケーションフレームワーク＋分散ファイルシステムを対象として説明します。

特徴として以下を挙げることができます。

- 主に参照用
- シャーディングによるスケールアウト等により、拡張性が高い
- データ操作にはAPIを利用できる（※クエリエンジンを組み合わせればSQLライクなインタフェースで利用できる）
- 様々な形式のファイルを扱える
- 主に非構造化データを扱う


# データストアのカテゴリごとの使い分け
使い分けを考えるにあたって、以下に示すような観点が考えられます。

- 規模（データ量、ユーザ数）
- 用途
- 性能
- 可用性
- データ整合性
- セキュリティ
- 運用性
- 費用
- 保守性　など

技術や製品を選定する際は、様々な観点から十分な検討を行いますが、ここでは規模と用途の2つの軸で整理してみました。

![datastore_classification.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548547/67786779-baac-97cf-34b0-7594217867a6.png)

先ず横軸（用途）についてです。オンライントランザクション処理（OLTP）など、主に行単位でのアクセスが発生する用途には、RDB（行指向）またはNoSQL（KVS）を規模などに応じて検討します。また、集計・分析など主に列単位でのアクセスが発生する用途には、RDB（列指向）またはHadoopエコシステムを規模などに応じて検討します。

次に縦軸（規模）についてです。まずはRDBの適用を検討し、RDBで扱えないほど規模が大きい場合に、NoSQL(KVS)やHadoop系を検討するのが良いと考えます。理由としては設計や運用のノウハウが蓄積しているRDBの方が品質を確保しやすい点やが挙げられます。また、NoSQLはスケールアウトによって大規模データやユーザリクエストに対応できる拡張性を得ることができますが、それとトレードオフとなるデータの整合性をどう両立していくかの考慮が必要です。

# おわりに
複雑化するデータストアを４つのカテゴリに分類し、カテゴリごとの特徴をまとめました。また、各カテゴリの使い分けを規模と用途を基にシンプルに整理してみました。
今後は、今回１つのカテゴリとして扱った、NoSQLデータベースやHadoopエコシステムの中の整理や、今回対象とした規模と用途以外の観点による整理にもトライしたいと考えています。
また、個々のプロダクトやクラウドサービスの中には上記のカテゴリの枠にあてはまらなかったり、複数のカテゴリにまたがるものもありますので、そういった観点での整理もできたらと考えています。

# 参考URL（この記事を作成するために参照したもの）
[DB-Engines](https://db-engines.com/en/ranking)
[db tech showcase 2019](https://www.db-tech-showcase.com/dbts/tokyo)
[12年後のCAP定理: "法則"はどのように変わったか](https://www.infoq.com/jp/articles/cap-twelve-years-later-how-the-rules-have-changed/)
僕のmatplotlib(Python)

自分用のまとめ
随時更新
自分が使った、調べたコマンドを記載
**自分がわかればいいからところどころ用語が間違ってるかも**

！見方

```python
#コマンド
    #引数のオプションの説明
```




###モジュール読み込み

```python
import matplotlib as mpl
```



##頻出操作
####図のインスタンス作成
```python
#インスタンス作成
fig = plt.figure()
    figsize=(x,y) #縦横のサイズを指定
    dpi= #画質

#複数の地図を作成
ax1 = fig.add_subplot()
    #第一引数：行
    #第二引数：列
    #第三引数：場所
```

####棒グラフ
グリッド線や、背景色等は後述のヒストグラムと同じ項目で設定可能

```python
ax1.bar()
    #第一引数：棒の幅のリスト
    #第二引数：棒の高さのリスト
    tick_label= #各棒のラベル
```

####ヒストグラム

ヒストグラムの返り値は少し特殊で以下の感じ
**n：X軸のデータ** 
**bins：Y軸のデータ**
**paches：各棒のオブジェクト群**


```python
n, bins, patches = ax1.hist()
    #引数は生データの配列
    bins= 棒の数
    color= #配列で色を指定

#グリッド線
ax1.grid()
    color= #色

#X軸ラベル
ax1.set_xlabel()

#Y軸ラベル
ax1.set_ylabel()

#背面色
ax1.set_facecolor()

#タイトル
ax1.title()

#目盛の設定
ax1.set_xticks(np.arange(0,1300,250))
     #引数は最小、最大、刻み
```
VisualStudioを使ってC#開発

## 概要
これは[SLP_KBITAdventCalender2019](https://adventar.org/calendars/4214)の12/17の記事です。

n番煎じですがVisualStudioでフォームアプリケーションを作成する第一歩を
メモがてら書いていきます。

## 開発環境
- Windows10
- VisualStudioCommunity2017

## 制作物
- 「 __タスクエスト__ 」
    - タスク管理に遊び心をいれたいと思い開発
    - タスクを個人のデータベースに登録し、それを操作
    - 閲覧と削除が主な機能

## 開発工程

1 VisualStudioのインストール

[Microsoft社の公式ドキュメント](https://docs.microsoft.com/ja-jp/visualstudio/install/install-visual-studio?view=vs-2019)参照

2 githubとの連携

Git for Windows をインストールした上で、VisualStudioのバージョン管理機能に自身のアカウント情報とリポジトリの情報を
渡せばできるはず…だったのですが、望んだ挙動をしなかったので、普通にCLI上でコマンドをうちました。

3 VisualStudioを起動、プロジェクトの作成

VisualStudioを起動するとデフォルト設定のままであれば、
スタートページが表示されます。ここから「新しいプロジェクトの追加」を選択
![開始.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307022/9bab7c72-f85f-3c80-d63d-d68d70594765.png)

テンプレートの選択ダイアログが表示されるのでWindowsフォームアプリケーション(.NET Framework)を選択
適当な名前をつけてディレクトリの場所を決定しOKで新規プロジェクトのテンプレートが生成されます。
![選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307022/1ce37562-a9a4-38c1-40ff-2958fc0dbf70.png)

作成直後はこのようになります。
![初期.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307022/a07a1202-b700-90cc-cdb2-16d0d665d961.png)
このときForm1.csがメインとなるフォームの表示を行い、また、Program.csにエントリポイントが記述されています。


4 コードを書く

基本的に、デザイナー画面に部品を配置、プロパティから詳細設定とイベントの設定を行います。
それだけやっておけば.NETが基本的にうまいことやってくれます。
事細かに書くべきですが、未完成であり紹介できるものになっていないため、
参考にした記事やサイトの紹介にとどめさせていただきます。 

○VisualStudio全般
- [VisualStudio公式ドキュメント](https://docs.microsoft.com/ja-jp/visualstudio/windows/?view=vs-2017)

○C#
    ●データベース関連
    - [データベース操作を管理するクラスを作成してみる](https://qiita.com/ara-bot/items/36946bb10ef25261e814)
    ●DataSet型について
    - [猫の気ままなC#日記](http://okwakatta.net/code/dst02.html)

## 画面

こんな感じの画面で、挿入をキー入力でしようと考えていました(現状はまとめに示します)
![画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307022/bba19204-3852-5802-671e-b7378296deaa.png)

## まとめ

今回作成したコードはGitHubにあげています。(https://github.com/mkanegon/TasQuest)
***Caution:12/17現在、HEADが破損したためcommitができていません。修正次第再掲します。***

現状作成したアプリケーションは
- データベースを直接いじってタスクの追加
- タスクの削除(倒すボタン)
- 現在選択中のタスクの情報(番号、内容、〆切)の表示(調べるボタン)
- 順番に__指定した長さで__表示タスクの変更(変えるボタン)
- 遊び(逃げるボタン)
が実装されており、
- アプリケーション上でのデータ追加
- タスクの一覧表示と選択による変更
- 倒すにエフェクトの追加
- 可変長なデータの管理
- 重要度などのステータスを設定し、表示を変える
などの要素を追加したいと考えています。

また、はじめはデータベースを作成していたのですが、
DataSetを利用した方がやりやすいと感じたので、現在データ管理の移行に取り組んでいます。

今回取り組んでいると、なんでこんなことで躓くのかといったことが多く、
自身の勉強不足を強く感じたため今更でも学習にしっかり取り組みたいと思います。

ともかく、右も左もわからない人でも簡単にそれっぽい画面を作れてしまうフレームワークは、
きちんとした理解をするための第一歩として踏み出しやすく、助けになると思うので、
是非さわってみてください。

## 素材元
- [Human Pictogram](http://pictogram2.com/)
Laravelで既存のテーブルにカラム(column)を追加

#既存テーブルにカラム(column)を追加

カラム追加時のコマンドの流れ

```php
php artisan make:migration add_column_'カラム名' --table=='テーブル名'
```
これでカラムをテーブルに追加

```php:migration/2019_12_17~~add_column_'カラム名'.php
public function up()
    {
        Schema::table('テーブル名', function (Blueprint $table) {
           //カラム追加のコード 
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('テーブル名', function (Blueprint $table) {
           //ロールバック時の処理 
        });
    }
```
カラム追加のコード : $table->string('~');
ロールバック時の処理 : $table->dropColumn('~');

を記述。

最後に

```php
php artisan migrate
```

をして完了。
技術力UPの為の圧倒的フォロワーシップ戦略

# はじめに

最近社内で色々な勉強会が開催されていたり、実際の業務ではリプレイスを視野に入れて進めていることもあり、新しい技術に触れることも多くなってきました。
とは言え、私自身が勉強会を開催するほどの技術力をまだ持ち合わせていない為、
まずは自分の技術力UPの為のコツをまとめておきたいと思います。

#技術力UPの為の３つのコツ

##1 Qiitaのやってみました系の記事を模倣する

![pose_necchuu_computer_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210436/7ec91d36-e69b-2a07-c112-77a0b1a8d6dc.png)


　Qiitaにチュートリアル的にまとめられてる記事も多く、一旦やってみた上で自分で理解できなかった部分やわからないところをさらに深掘る。

　ひたすら手を動かしてみると見たことないエラーが出たりすんなりいかないことが多い。そこを解決していくことで力がついてくる。

ここでのポイントは周りの人を巻き込んでみる、です。
エラーが出たとき一人で考えていてもなかなか解決できなかったりします。
そんな時は周りの人に聞いてみるとすんなり解決できたりしてしまうのです。

##2 勉強会にとことん参加する

![benkyoukai_kunrenkou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210436/e7710480-8301-d4cb-3e70-4629f76ad9c3.png)


社内外含め勉強会にも興味があるものには進んで参加する。
TECH PLAYなどに登録しておくと勉強会の情報などが来るので、行く気になります。
とにかく情報をインプットする。知らない世界が広がっていくのが楽しい。

また、社内に技術力の高い人がいた場合、勉強会を開いてもらう。
身近に技術力の高い人がいた場合どんどんその人から吸収していくことが近道です。

ここでのポイントは、フォロワーシップを発揮しチームごと底上げしてしまいましょう。インプットしただけでは学んだ技術を生かせません。
フォロワーシップとは、リーダーに対して自律的支援を行うことです。リーダーを補佐しつつ自分が自らやりたいことを実現していけば、知らない間に技術力がついているはずで、やりたかったことが一人でできるようになっているはずです。

##3 アウトプットする

![computer_programming_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210436/c290c4de-0aca-a9d4-3d8e-94abd0af7b68.png)


勉強会などでインプットしたことはこまめににアプトプットしていくと、自分の中での情報も整理されるし、周りに話すことで自分が理解できていない部分も明確になり更に理解が深められる。

ここでのポイントは、Qiita記事を書くなどして発信していく。
Qiita記事では敷居が高いと感じでしまう人はTwitterなどにまとめて
つぶやいてみるだけでも違ってくるかもしれません。

#まとめ

![pose_dance_ukareru_woman (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210436/99c99599-8f56-7d5c-d9ba-43c66f355e81.png)


常に新しい技術を学んでいく為には自主的に勉強していくことも
必要ですが、私は自分だけで勉強していると進まないことが多く、
途中で挫折してしまうこともしばしば。
そんなときはまわりにいる技術者を巻き込むとうまくいくことが多く、
一緒にがんばろうという気になり学習が進む。

知識が豊富なエンジニアに講師をしてもらい勉強会を開く。
そこでフォロワーシップを発揮し、自ら学び、自らも発信していくことでチームで技術力アップが狙えます。

この記事が少しでもみなさんの成長のコツに繫がればと思います。

明日はデザイナーの@pyonsomiが「尊いツイートに、何万回でも押せる「尊いボタン」をつけた」を書いてくれるみたいです。
楽しみですね♪

#私たちのチームで働きませんか？

![alt](https://brides.a-tm.co.jp/wp-content/uploads/2019/11/ATEAM_BRIDES.jpg)

[エイチーム](https://www.a-tm.co.jp/)は、インターネットを使った多様な事業を展開する**名古屋の総合IT企業**です。
そのグループ会社である**株式会社エイチームブライズ**では、一緒に働く仲間を募集しています！

[ハナユメ サイト開発グループ](https://jobs.qiita.com/employers/brides-a-tm/development_teams/138)
[HIMARI開発チーム](https://jobs.qiita.com/employers/brides-a-tm/development_teams/147)
[技術開発部](https://jobs.qiita.com/employers/brides-a-tm/development_teams/148)

上記求人をご覧いただき、少しでも興味を持っていただけた方は、まずは**チャットでざっくばらんに話**をしましょう。
技術的な話だけでなく、私たちが大切にしていることや、お任せしたいお仕事についてなどを詳しくお伝えいたします！

[Qiita Jobs](https://jobs.qiita.com/)よりメッセージお待ちしております！
Vuetify使ってるのに自分でstyleを書いてbackground-imageを指定した話

# はじめに
Nuxt.jsとVuetifyを使って、アプリ制作中に背景画像を貼りたくなる場面に遭遇しました。折角Vuetify使っているのだから、v-parallax使ってカッコイイ背景にしようと思ったのですが、上手く使いこなせなないのと用途的も合っていないと判断し、結局は自分でstyleを書いたと言うお話です。
Qiita初投稿なので、温かい目で見てもらえるとありがたいですm(_ _)m

# v-parallaxでbackground-image？
　v-parallax内で指定した画像がwindowよりも遅くスクロールすることによってページに立体感を出すと言う代物らしい。最初このとこを知らずにbackground-imageをv-parallaxを使って表示しようとしていたのが大きな間違いでした。
　v-parallaxは画面全体のbackground-imageを指定するときに使うものではなさそう。よくよく考えればv-parallaxは画面全体とのスクロールのズレを利用して立体感を演出するものなので、それを全体に使うってダメじゃね？なんではじめに公式でv-parallaxの説明をちゃんと読まなかったのだろう。

### v-parallaxの使い方
そうは言っても、使ってはみたのでメモとして使い方は書いておく。

1. srcがglobalにある書き方

```vuejs
<template>
  <v-parallax src="https://shimabee.com/profile/images/myimage.jpg"></v-parallax>
</template>
```

2. srcがlocal(assets/images配下にあるとき)にある書き方

```vuejs
<template>
  <v-parallax :src="require('@/assets/images/myimage.jpg')"></v-parallax>
</template>
```

# 結局は力技！

結論としてv-parallaxは画面の一部となるコンポーネントの背景に使用するとカッコよくできます！
でも今回欲しいのはスクロールのないアプリケーションの全画面背景の指定方法なので、ちょっと違うかな〜と思い、自分でstyleを書いて実装しました。
**v-appの中のv-contentのclassのクラスにbackground-imageを指定すると、余分な隙間なく全画面の背景としてimageを指定することができました！**

```vuejs
<template>
  <v-app>
    <v-content class="bg">     
    </v-content>
  </v-app>
</template>

<style>

  .bg {
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
    background-size: cover;
    background-image: url("~@/assets/images/foo.jpg");
  }
  
</style>
```

# 参考
[vuetify parallax(公式)](https://vuetifyjs.com/en/components/parallax)
[v-parallax doesnt work with local files?(stack overflow)](https://stackoverflow.com/questions/55504254/vue-js-vuetify-v-parallax-doesnt-work-with-local-files)
[]()
お名前.com から さくらのドメイン にドメインを移管する

実際に移管した際の作業メモです。.comドメインで実施しましたが、AuthCodeを取得するタイプの他のドメインも同じ手順だと思います（汎用.jpなどは異なります）。

> 移管元： お名前.com https://www.onamae.com/
> 移管先： さくらのドメイン https://domain.sakura.ad.jp/

（免責）作業時点(19年12月)で、移管の費用は1886円でしたが、変動があると思いますので、公式サイトで確認してください。その他、種々の設定状況によって、この手順のとおりにいかないこともあるかもしれません。対処法が分かる都度、追記編集は行う予定ですが、全てのケースを網羅する手順書ではないことをご了承ください。

## お名前.com での作業
コントロールパネルにログインし、以下の作業を行います。

1. ドメイン設定
  1. Whois情報公開代行設定 -> 設定されている場合、**解除**
  2. ドメインWhois情報変更 -> 登録者及び技術担当者の**メールアドレスが自分で受け取れるものになっているかを確認** （whois公開代行を解除した後も技術担当者がonamae.comのアドレスになっていて一度失敗しました…）
  3. （「DNSレコード設定を利用する」を設定している場合）DNS設定/転送設定 -> DNSレコード設定 -> **エクスポート** （これを忘れて先に進んでしまうと当該画面にアクセスできなくなるため、ゾーン設定を引き継げず最初から作る羽目になり非常に困ります…）
2. ドメイン一覧
  1. ドメイン詳細 -> **AuthCodeを取得** (.comや.netの場合)

![Screen Shot 2019-12-09 at 12.16.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50780/b9ab2396-1cf9-d74c-52a3-987a7b961f93.png)

## さくらのドメイン での作業
ドメイン転入のメニューから手続を行います。先程取得したAuthCodeがここで必要です。

https://domain.sakura.ad.jp/transfer/

手続を完了して暫く（数時間くらい？）すると、下記のアドレスから確認の依頼が届きます。それぞれ指定されたURLを開いて、承認の操作を行ってください。

```
admin@onamae.com 【重要】トランスファー申請に関する確認のご連絡
info@jprs.jp [JPRS] レジストラトランスファー承認手続きのご案内
```

独立したにDNSサーバを持っている場合はこれで完了ですが、お名前.comで「DNSレコード設定を利用する」を設定している場合は、もう少し作業が必要です。

1. 会員メニュー
  1. ドメインメニュー
    1. WHOIS情報 -> ネームサーバを以下の2つに書き換えます
    2. ゾーン編集 -> 先程エクスポートしたゾーン設定を見ながら設定を転記します。（DNS(bind)に関する知識がある程度必要になります…）

ネームサーバの設定([参考URL](https://help.sakura.ad.jp/206205831/))

```
ns1.dns.ne.jp
ns2.dns.ne.jp
```

例えば、以下のようなゾーン設定がエクスポートしたファイルに書かれている場合、

```
www.exsample.com. 600 IN A 123.45.67.89
```

設定画面では以下のように設定を追加します。

```
エントリ名: www
種別: A
値: 123.45.67.89
DNSチェック: する
TTLの指定: なし（本当は600ですが、さくらのドメインの既定値にしました）
```

ネームサーバの変更及びゾーン編集の結果が反映されるのに、多少時間がかかるようです（今回は数分程度でしたが）。以上で完了です。

## （蛇足）移転の経緯

お名前.comは取得時の価格が安く取り扱いドメイン数も多いのですが、[価格の改定](https://www.onamae.com/news/domain/20191108_1/)も時々行われており、長年管理することを前提とした場合、どの程度のコスト的なメリットがあるかは不明です。それ以上に、コントロールパネルにログインしてから目的の操作に到達するまでに見せられる広告の多さにうんざりしてしまいました。端っこに出てくる程度ならまだ良いのですが、画面の真ん中に現れて操作を邪魔することもあります。また登録したメールアドレス宛てに届く広告の数も相当なものになります。更新期限の通知などは大切なので、全部まとめて迷惑メール扱いにする訳にもいかず、メールの選別に相当な手間を要します。

![Screen Shot 2019-12-17 at 9.31.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50780/d37f1b50-bc02-d494-ec1c-2efd14027456.png)


楽天市場を使った時にも、同じような目に遭ったな、ということを思い出します。あえて煩雑なインタフェースにすることで賑わいが演出できたりすることもあって一定数の人には支持されているのでしょう。私には必要がなかった、というだけで、当該会社の方針を批判するものではありません。
homebrew で openssl 1.0 がインストールできなくなっています

## はじめに

個人的に [php-build](https://github.com/php-build/php-build) のコントリビュートをちょこまかとしてるですが、先月末くらいから PHP5 系のCIが「なにもしてないのにこわれた」状態になったため、なぜだろうと調べていたら、タイトル通りのことが起きていた。

## なぜこんなことがおきたのか

発端は、 OpenSSL 1.0 が 2019/12/31 に EOL を迎えるということで、homebrew としては、EOL になるものは配布をやめようという動きにともなってということになります。

- [[Homebrew/homebrew-core] OpenSSL 1.0 removal](https://github.com/Homebrew/homebrew-core/issues/46454)

で、その動きに関連した pull-req が次のものたちです。

- [[Homebrew/homebrew-core] Remove OpenSSL 1.0 ](https://github.com/Homebrew/homebrew-core/pull/46876)
- [[Homebrew/homebrew-core] Aliases: add openssl](https://github.com/Homebrew/homebrew-core/pull/47034)

これらが 2019/11/22 に master にマージされてます。 結果、`openssl` 及び `openssl@1.0` は削除され、 `openssl` は `openssl@1.1` のエイリアスとなりました。

2019/12/31 に EOL を迎えるにあたって、`openssl@1.0` としてしばらく存続させるのではなくて、ざっくり消したのはかなり乱暴な気がしなくもない...

## それでも OpenSSL 1.0 系を使いたい場合

次のようにすれば、OpenSSL 1.0.2t をインストールすることはできます。

```sh
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/64555220bfbf4a25598523c2e4d3a232560eaad7/Formula/openssl.rb
```

上記のコマンドをインストールすることにより、 `/usr/local/Cellar/openssl/1.0.2t` に OpenSSL 1.0.2t を入れることはできますが、homebrew としての openssl パッケージは `openssl@1.1` を向いているので、これを使うにはそれぞれのソフトウェアでちょっと工夫が必要になります。

## phpenv/php-bulid の場合

phpenv/php-build の場合は、以下のようにすれば、PHP5 系の build ができます。

```sh
PHP_BUILD_CONFIGURE_OPTS="--with-openssl=/usr/local/Cellar/openssl/1.0.2t" phpenv install 5.6.40
```

## さいごに

それにしても homebrew 思い切った舵取りをしてきますよね。まぁ、EOL になったソフトウェアをずるずると使えるようにし続けるというのはあれだとは思いますが、EOL 前に削除してしまうというのはちょっと驚きました...
What is difference of Rails + rspec let VS let! (bang or not bang?) : same let name seems do not executed multiple times but only one time

```rb
require "rails_helper"

# There cases all pass
describe do
  context do
    let!(:user) { create :user, name: 'Alice' }

    # it create a record before expect "user" in spec
    it do
      expect(User.count).to eq 1
      expect(user.name).to eq 'Alice'
      expect(User.count).to eq 1
    end
  end

  context do
    let(:user) { create :user, name: 'Bob' }

    # it does not create a record before expect "user" in spec
    it do
      expect(User.count).to eq 0
      expect(user.name).to eq 'Bob'
      expect(User.count).to eq 1
    end
  end
end

describe do
  context do
    # Let bang and same let names
    # It does not create three records
    # only last let! evaluated
    let!(:user) { create :user, name: 'Alice' }
    let!(:user) { create :user, name: 'Bob' }
    let!(:user) { create :user, name: 'Carol' }

    it do
      expect(User.count).to eq 1
      expect(user.name).to eq 'Carol'
      expect(User.count).to eq 1
    end
  end

  context do
    # Different let names
    # It create each three records
    let!(:user1) { create :user, name: 'Alice' }
    let!(:user2) { create :user, name: 'Bob' }
    let!(:user3) { create :user, name: 'Carol' }

    it do
      expect(User.count).to eq 3
      expect(user1.name).to eq 'Alice'
      expect(user2.name).to eq 'Bob'
      expect(user3.name).to eq 'Carol'
      expect(User.count).to eq 3
    end
  end
end

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2851








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->