OmniAICreator/Qiita-1.07M huggingface dataset:
scp: リモートからリモート、多段ssh

# 多段sshを使ってやりたい
.ssh/configに以下を記載する

```.ssh/config
# 経由するサーバー
Host tunnel
   HostName ***.***.***.***
   User user
   IdentityFile ~/key.pem # tunnel用の秘密鍵

# ファイルコピー元サーバー
Host from_host
   HostName ***.***.***.*** # tunnelからfrom_hostに接続するためのIP
   User user
   IdentityFile ~/key_from.pem # from_host用の秘密鍵
   ProxyCommand ssh -W %h:%p tunnel

# ファイルコピー先サーバー
Host to_host
   HostName ***.***.***.*** # tunnelからto_hostに接続するためのIP
   User user
   IdentityFile ~/key_to.pem # to_host用の秘密鍵
   ProxyCommand ssh -W %h:%p tunnel
```

# リモートからリモート
-3を付けることでリモートからリモートが可能になる

```
$ scp -3 from_host:filepath to_host:file_path
```
CentOS7,Mysql8


実際実装した環境
CentOS Linux release 7.6.1810 (Core)

■確認
CentOS 7は、mariadbが入っていることがあるので、存在しているか確認
※他のDBや別バージョンのMySQLなども確認しておこう。
sudo rpm -qa | grep mariadb

■削除
mariadbの削除をしておこう。
sudo yum remove mariadb-libs
sudo rm -rf /var/lib/mysql

■yum リポジトリの追加
yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm

■インストール
MySQL Server のインストール
yum install -y mysql-community-server

■起動
systemctl start mysqld.service
systemctl enable mysqld.service

■パスワードの確認
grep 'temporary password' /var/log/mysqld.log

■初期設定
mysql_secure_installation

■認証方式の確認
SELECT user, host, plugin FROM mysql.user;
Mysql8からcaching_sha2_passwordに変更されている

■認証方式変更
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password_hogehoge';

■変更確認
SELECT user, host, plugin FROM mysql.user;
pluginの部分が mysql_native_password なら変更完了。
今まで通りツールなどでアクセスできていると思う。
python pandas dataframe の ループ処理が遅すぎる問題

# python pandas dataframe の ループ処理が遅すぎる問題

pandas をdf.iterrows()で純粋にループさせると遅すぎでした。
numpy array型に変換してからindexで参照するようにすると爆速になりました。
思わぬところで足を取られました

以下のように解決。

```python
def add_pred_in_df(df_input, df_unixepoch_pred):
    prev_unixepoch = 0
    index_pred = 0
    array_time_input = df_input.timestamp.values
    array_time_pred = df_unixepoch_pred.unixepoch.values
    array_label_pred = df_unixepoch_pred.pred.values
    list_input_pred = []
    for index in range(df_input.shape[0]):
        if array_time_input[index] >  array_time_pred[index_pred]:
            index_pred += 1
        list_input_pred.append(array_label_pred[index_pred])
    df_input["prediction"] = list_input_pred
    return df_input
```

（コードが汚いのはごめんなさい）

**追記 20191012**

やりたいこととしては、下記です。

- timestamp（ここでは整数型のunixepoch）をcolumnに持った、dataframe df_input に、新しく prediction というcolumnを追加したい。
- どうやって追加するかというと、ある時間区間ごとに対応するpredictionの値を格納した dataframe df_unixepoch_pred を参照したい。
- df_inputのtimestampの間隔は一定ではないので、df_inputの1レコードずつを df_unixepoch_pred の時間区切りのどれに当てはまるか比較して、predictionの値を割り当てたい。

## 参考

https://kunai-lab.hatenablog.jp/entry/2018/04/08/134924

## ちなみに

ふつうに iterrows() で回してた時のコードは以下。

```python
def add_pred_in_df(df_input, df_unixepoch_pred):
    prev_unixepoch = 0
    df_input["prediction"] = ""
    for index, items in df_unixepoch_pred.iterrows():
        if df_input[(df_input["timestamp"] > prev_unixepoch) & (df_input["timestamp"] <= items["unixepoch"])].shape[0] == 0:
            continue
        df_input[(df_input["timestamp"] > prev_unixepoch) & (df_input["timestamp"] <= items["unixepoch"])].prediction = items["pred"]
        prev_unixepoch = items["unixepoch"]
    return df_input
```

そのあと、高速化しようと思って Refactoring したのが以下。
ループのたびに df_input を比較を使って抽出するときに、全体スキャンするから遅いと思って下記のように修正したが、
それでも遅かった。

```python
def add_pred_in_df(df_input, df_unixepoch_pred):
    prev_unixepoch = 0
    index_pred = 0
    df_input["prediction"] = ""
    for index, items in df_input.iterrows():
        print(index, index_pred)
        if items["timestamp"] >  df_unixepoch_pred.unixepoch[index_pred]:
            index_pred += 1
        df_input.prediction[index] = df_unixepoch_pred.pred[index_pred]
    return df_input
```
TabNavigationにTabをネストする（react-navigation）


とりあえずreact-nativationで完結させてみる。


##　やりたいこと

下記のような感じで（Buttom）TabのHomeで（Top）Tabをネストする。

>本当は、コンポーネントして画面の一部に組み込みたいが、やり方が見つからない。

![スクリーンショット 2019-10-11 10.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/ef5fe303-41c7-fd93-54c1-28ce34a024e5.png "スクリーンショット 2019-10-11 10.03.31.png")



## 実装

ネストに次ぐネストになりますが、以下のようにしました。

```js:App.js
import React from 'react';
import { StyleSheet, Text, View, SafeAreaView } from 'react-native';

import { createAppContainer } from 'react-navigation';
import { createStackNavigator } from 'react-navigation-stack';
import { createBottomTabNavigator, createMaterialTopTabNavigator } from 'react-navigation-tabs';
import { createDrawerNavigator } from 'react-navigation-drawer';

import Home from './screens/Home';
import Profile from './screens/Profile';
import First from './screens/First';
import Second from './screens/Second';

//icon
import Icon from 'react-native-vector-icons/FontAwesome';
import Icon5 from 'react-native-vector-icons/FontAwesome5';

const HomeStack = createStackNavigator(
    {
        Home: { screen: Home }
    }
);

const ProfileStack = createStackNavigator(
    {
        Profile: { screen: Profile }
    }
);

const ChildTab = createMaterialTopTabNavigator(
    {
        First: {
            screen: First,
            navigationOptions: {
                title: 'ホーム',
                tabBarIcon: ({ tintColor }) => <Icon size={24} name="home" color={tintColor} />
            }
        },
        Second: {
            screen: Second,
            navigationOptions: {
                title: 'ホーム',
                tabBarIcon: ({ tintColor }) => <Icon size={24} name="cog" color={tintColor} />
            }
        }
    },
    {
        defaultNavigationOptions: ({ navigation }) => {
            return {
                tabBarOptions: {
                    style: {
                        backgroundColor: "#eee",
                        // borderColor: "#aaa",
                        // borderWidth: 1,
                    },
                    labelStyle: {
                        color: '#000',
                    },
                    indicatorStyle: {
                        backgroundColor: "#f00",
                    },
                    showIcon:true,
                    activeTintColor:"#333",
                    inactiveTintColor:"#aaa"
                }
            }
        }
    }
);

const ChildTabStack = createStackNavigator(
    {
        Child: { screen: ChildTab }
    }
);


const HomeTab = createBottomTabNavigator(
    {
        Home: {
            screen: ChildTabStack,
        },
        Profile: {
            screen: ProfileStack,
        }
    }
);




export default class App extends React.Component {
    render() {

        const AppContainer = createAppContainer(HomeTab);
        // const ChildContainer = createAppContainer(ChildTab);

        return (
            <AppContainer />
        );
    }
}
```
GitHubActionsのrepository_dispatchを試す

# 概要

GitHubActionsではGitHub上のいろんなイベントをフックしてActionを実行できますが、外部からAPIリクエストによってもActionを起動することができます。それがrepository_dispatchです。

# GitHubActionsのイベントフックにrepository_dispatchを設定する

```yaml:workflow.yaml
name: Sample

on: repository_dispatch

・・・以下省略・・・

```

# GitHubのAPIを叩く

```sh
curl -X POST -H "Authorization: token トークン" -H "Accept: application/vnd.github.everest-preview+json" -d '{"event_type": "イベントタイプ(自分で決める)"}' -i  https://api.github.com/repos/オーガナイゼーション名/リポジトリ名/dispatches
```

詳しくはこちら: https://developer.github.com/v3/repos/#create-a-repository-dispatch-event

トークンはGitHubでSettings > Developer settings > Personal access tokensで作成できます。作成するときにはrepoスコープについての権限を付与することを忘れないでください。

# repository_dispatch経由で実行されるActionのブランチはどうやって指定するの？
残念ながらできないようです。https://help.github.com/en/articles/events-that-trigger-workflows#external-events-repository_dispatch に書いてあるとおり、Commit that changes statusなので、一番最新で変更があったブランチの最新のCommitで自動的にActionが走ると思われます。これだと使えない…。repository_dispatchはまだお試しくらいの機能なようです。
RaspberryPiZeroでbleaconを使って簡単に設定変更できるビーコンを作る 

RaspberryPI Zeroを使ってiBeaconとして動作するビーコンを作ります。
node+bleaconを使います。
2019/10/11時点の最新環境を使いますが、一度node10を入れてnode9に差し替えたりする必要がありますので
自分用メモ代わりにまとめます。

最終的にはSDカードをUSBメモリとしてPCからアクセスできる部分のJSONファイルで
uuidとかを簡単に変更できるビーコンが出来ます。便利！

# 導入するもの一覧
- Raspbean Buster Lite
- Node9
- bleacon

# 導入手順
+ Raspberry Buster Liteのインストール

https://www.raspberrypi.org/downloads/raspbian/

最初にRaspberry Liteをインストールします。GUIも欲しかったらDesktopを入れてもokです。

+ とりあえず初期設定

```
> sudo apt-get update
> sudo apt-get upgrade
```

+ nodeのインストール（一旦apt-getでnode10を入れた後bleacon対応版のnode9に入れ替え）

```
sudo apt-get install -y nodejs npm
sudo npm cache clean
sudo npm install npm n -g
sudo n 9.10.1
sudo apt-get purge -y nodejs npm
```
+ nodeのPATH設定
次の行を/home/pi/.profile末尾に追加

```
PATH="/usr/local/n/versions/node/9.10.1:$PATH"
```

+ bleaconのインストール

```
sudo apt-get install -y libbluetooth-dev
npm install bleacon
```

+ ビーコンスクリプトの設定

以下のプログラムを/home/pi/beacon.jsに保存します。

```
var config = require('/boot/beacon.json');

console.log("START "+config.major+":"+config.minor+" beacon");

var uuid=config.uuid.replace(/-/,'');
var major=config.major;
var minor=config.minor;
var txpower=config.txpower;
const Bleacon = require('bleacon');
Bleacon.startAdvertising(uuid,major,minor,txpower);
```

以下のJSONを/boot/beacon.jsonに保存します。
※SDカードをPCにマウントした時にアクセスできるフォルダです。

```
{
"//":"beacon config file",
"uuid":"aaaaaaaabbbbccccddddeeeeeeeeeeee",
"major":99,
"minor":199,
"txpower":-59
}
```

* 自動起動設定

以下の１行を/etc/rc.localに追加するとZeroの電源を入れるたびにビーコンとして動作します。

```
sudo /usr/local/bin/node /home/pi/beacon.js > /dev/null &
```

あとはビーコンの設定を変えたい場合はPCにSDカードを差してJSONを書き変えるだけでOKです。
hugoでaliasを設定する

`hugo`では、古いURLを新しいURLにリダイレクトする設定を書くことができます。

https://gohugo.io/content-management/urls/

ただし、これはURLが相対であるため、外部から飛ぶことができません。例えば、以下の設定を書いたとしましょう。

```yaml:content/img.md
---
title: "img"
aliases:
    - /illust
type: img
---
```

これは、/illustから/imgにURLを変更した内容です。

この場合、例えば、qiitaにURLがリンクされていたとして、URLは以下のようになります。

`https://example.com/illust/example.com/img`


本来なら、`https://example.com/img`にしたいところですが、buildされたHTMLにはプロトコルが指定されず`example.com/img`となってしまうのです。

```html:/illust/index.html
<!DOCTYPE html>
<html>
  <head>
      <title>img</title>
      <link rel="canonical" href="example.com/img/"/>
    <meta name="robots" content="noindex">
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <meta http-equiv="refresh" content="0; url=example.com/img/"/>
  </head>
</html>
```

この問題は、`layout/alias.html`を設定することで回避できます。

```html:layout/alias.html
<!DOCTYPE html>
<html>
  <head>
      <title>{{ .Page.Title }}</title>
      <link rel="canonical" href="https://{{ .Permalink }}"/>
    <meta name="robots" content="noindex">
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <meta http-equiv="refresh" content="0; url=https://{{ .Permalink }}"/>
  </head>
</html>
```

ただし、プレビューではうまく機能しないことがあるので、直接deployするか、build後にpublic/illust/index.htmlなどのファイルを確認するかの方法で、判断してください。
【備忘録】ApacheのApacheのBalancer-Managerについて

# BalancerMemberの設定について
設定の仕方は

```
<Proxy balancer://api-balancer/>
    BalancerMember 振り分け先 (オプション)
</Proxy>

```

オプションについて

|設定値  |説明  |
|---|---|
|loadfactor |振り分けるサーバの重み付け。数字が大きい方が優先度が大きい。  |
|timeout/connectiontimeout  |接続タイムアウト時間（秒） |
|retry|接続出来なかった際の切り離し時間（秒）。この時間が経過すると再度振り分け対象になる。|
欧州DIAS(衛星データクラウドサービス）比較まとめ

ヨーロッパの衛星データのクラウドサービスDIAS（Data Information and Access Service)がたくさんあって違いが判らないので、調査しています。

https://www.copernicus.eu/en/access-data/dias


|        |       |        | |||
|:----------|-----------|-------------|--------------|-----------------|------------------:|
|名称|sobloo|	ONDA|	mundi|	CREODIAS|	WEkEO|
|URL|http://sobloo.eu|http://www.onda-dias.eu|https://mundiwebservices.com/	|http://CREODIAS.eu|https://www.wekeo.eu/|
事業主体|	Airbus Defense & Space|	Serco(英企業)|	ATOS(仏企業)|IT企業（ポーランド）|	EUMETSAT, ECMWF , MERCATOR OCEAN|
データ提供範囲(Sentinel-2 L1C)|	過去2年分のみ|	31 December 2018以前はArchiveに移動され展開に時間がかかる|	2018年1月以降欧州内は2015年から|	2016-10-18から|	23/06/2015-?|

ちなみに日本でも
文部科学省主導のDIAS　https://diasjp.net/
経済産業省主導のtellus https://www.tellusxdp.com/ja/
などあって、こちらもよくわからない状況になっています。
.Net Core2.2でappsetting.jsonの値を使用するには

# 環境

| Tool      | Version |
| --------- | ------- |
| .Net Core | 2.2     |

appsetting.json は以下とします。

```appsetting.json
{
  "Sample": {
    "XXX": "XXX_Value"
  }
}
```

# DI を利用

Startup.cs の ConfigureServices で appsetting.json のセクションを登録して置き、DI を利用して値を取得する方法です。

```SampleConfig.cs
public class SampleConfig
{
 public string XXX { get; set; }
}
```

```Startup.cs

public class Startup
{
  public void ConfigureServices(IServiceCollection services)
  {
    //....
    services.AddOptions().Configure<SampleConfig>(Configuration.GetSection("Sample"));
  }
}
```

```SampleService.cs
public class SampleService
{
  private readonly IOptions<SampleConfig> _sampleConfig;

  public SampleService(IOptions<SampleConfig> sampleConfig)
  {
    _sampleConfig = sampleConfig;
  }

  public void SampleMethod()
  {
    string xxx = _sampleConfig.Value.XXX;
  }
}
```

コンストラクタで Value の値を入れてもいいかもしれません。

# DI を利用しない

Startup.cs の ConfigureServices で値を利用したい場合は、DI を利用することはできません。

## `Configuration.GetValue`を利用

この場合は値の単一取得になります。
`:`をつなげていくことで階層を指定して取得が可能です。

```Startup.cs
public class Startup
{
  public void ConfigureServices(IServiceCollection services)
  {
    //....
    string xxx = Configuration.GetValue<bool>("Sample:XXX");
    // or Configuration.GetSection("Sample").GetSection("XXX").Value;
    // or Configuration.GetSection("Sample:XXX").Value;
  }
}
```

Section の存在チェックがしたい場合は、`Exists`を使えばよいです。

```
if (Configuration.GetSection("Sample:XXX").Exists())
{
  // 存在した場合の処理
}
```

`GetChildren`による取得もありますが、GetSection で取れればいいのではないでしょうか。

## Bind を利用

複数の値を取得したい場合はこちらのほうが良さそうです。

```Startup.cs
public class Startup
{
  public void ConfigureServices(IServiceCollection services)
  {
    //....
    var sampleConfig = new SampleConfig();
    Configuration.GetSection("Sample").Bind(sampleConfig);
  }
}
```

# 参考

https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.2#memory-configuration-provider
Tailwindcssとは

こんにちは
未来電子という会社でインターンをさせてもらっているものです。
プログラミング経験が浅いため、間違いがあるかもしれませんがお手柔らかにお願いします。

今回はTailwindcss
Tailwindcssについて書きたいと思います。

#Tailwindcssとは
TailwindcssとはCSSフレームワークの一つです。
CSSフレームワークといえば、BootstrapがありますがTailwindcssとは大きく異なります。
Bootstrapが勝手にボタンなどのレイアウトを作ってくれますが、Tailwindcssはそうは行きません。
自分で設定する必要があります。
ではTailwindcssのメリットは何かというと、カスタマイズ性の高さです。
Bootstrapをカスタマイズすると、他の要素を巻き込まないようにするためクラスが煩雑になります。
もちろんCSSに記述する必要があります。
しかしTailwindcssはそれ単体で設定し、CSSを使わずにカスタマイズできます。
繰り返しを避けたいときはCSSでユーティリティクラスを使って簡単に設定することもできます。


#まとめ
以上のようにTailwindcssはBootstrapのような簡単なものではありませんが、慣れてくるとそれ以上の効果を出せるでしょう。



#参考サイト
https://gitpress.io/@rhistoba/about_tailwind
2019-10-11 VMware Workstation 15 Pro > bug > ホストOSがロック状態でゲストOSが落ちる (+2020-01-17再発)

```txt:動作環境
Windows 10 Pro (64bit) バージョン v1903
VMware Workstation 15 Pro (15.1.0 build-13591040)
```

### 症状

ホストOSをロックしたままの状態で、次の日にロックを解除するとゲストOSがすべて落ちている。

- 二つのウィンドウで4つのゲストOSを起動していた
    - Windows 8.1, Windows 10, CentOS 6.9, CentOS 7.7
- ロック時間は夜19時から翌朝8時
- 同様の症状はこれまで二回発生している


### 対処

とりあえず最新バージョンがあるので、バージョンアップをして様子見をする。

```
VMware Workstation 15 Pro (15.5.0 build-14665864)
```

リリースノートには今回の不具合の対応はなさそう。

VMware Workstation 15.5 Pro Release Notes
https://docs.vmware.com/en/VMware-Workstation-Pro/15.5/rn/VMware-Workstation-155-Pro-Release-Notes.html


### Windows Update

Windows Updateと関係あるかどうか。

- [2019 年 10 月のセキュリティ更新プログラム (月例)](https://msrc-blog.microsoft.com/2019/10/08/201910-security-updates/?ocid=AID740624_TWITTER_oo_spl100000988348699)
    - 2019-10-9

## 2020-01-17再発

再発した。
19時にロックをかけた後、20時25分に発生。
バグ報告はしておいた。
mod_rewrite で HTTP_HOST によってリダイレクト先を振り分ける

# 概要
- 稼働している環境によってリダイレクト先を切り替えたい。という要件があったので実現方法を模索

# 要件
- 同じ内容の .htaccess ファイルを異なる環境で使う
- 通常は host01.example.com にリダイレクトする
- xxx.example.com で動いてる時だけ host02.example.com にリダイレクトする

# 実装してみた内容
- ローカル変数 %{ENV:DEST_URL} に転送先アドレスを設定する
- %{HTTP_HOST} でアクセスされているホストを判定
- 合致する場合は %{ENV:DEST_URL} を上書きする

```
RewriteEngine on

# 一時変数にデフォルトの転送先を定義
RewriteRule .* - [E=DEST_URL:host01.example.com]

# %{HTTP_HOST} で引っ掛けて一時変数を上書き
RewriteCond %{HTTP_HOST} ^xxx¥.example¥.com$
RewriteRule .* - [E=DEST_URL:host02.example.com]

# リダイレクト
RewriteRule ^$  https://%{ENV:DEST_URL}/ [R=301,QSA,L]

```

# 参考
- https://httpd.apache.org/docs/2.4/ja/mod/mod_rewrite.html
- http://ysklog.net/mod-rewrite/rewrite-cond.html
- https://qiita.com/hkusu/items/0caa921ad4fb1cb9d300
- https://www.ideaxidea.com/archives/2010/04/mod_rewrite_tips.html
For Where Violation: `where` clauses are preferred over a single `if` inside a `for`. (for_where) の警告が出た時の処理


for...in...{ if ... == ...} をwhereでスッキリさせる。

```swift
for musicItem in musics {
     if musicItem.title == favoriteTitle {
         favoriteList.append(musicItem)
     }
 }
```

こんな感じで、配列に入った値を一つ一つに分解して、その分解した値のkeyで処理をしたい場合、whereを使えって警告が出る。
その変換

```swift

for musicItem in musics where musicItem.title == favoriteTitle {
      favoriteList.append(musicItem)
}

```

これでOK。
もっとスッキリさせるためには次

```swift

for musicItem in (musics.filter { $0.title == favoriteTitle }) {
  favoriteList.append(musicItem)
}

```

参考：
https://stackoverflow.com/questions/45590544/swiftlint-warning-for-where-violation-where-clauses-are-preferred-over-a-si
@SpringBootTestがコンフィグレーションを自動検出する仕組み

# バージョン

* SprintBoot ... 2.1.9.RELEASE

# 仕組み

`@SpringBootTest` アノテーションはテスト実行時のコンフィグレーションクラスを自動検出する機能を備えています。SpringBootを使わない場合には `@ContextConfiguration` でコンフィグレーションを明示する必要があるわけですがそれが不要になるわけです。

自動検出されるのは `@SpringBootConfiguration` がついたクラスです。このアノテーションは `@Configuration` と同じ意味ですが `@SpringBootTest` によって自動的にテストコンフィグレーションに設定されるという点で挙動が異なります。

`@SpringBootApplication` アノテーションには `@SpringBootConfiguration` のアノテーションがついているので、 **`@SpringBootTest` アノテーションは `@SpringBootApplication` のクラスをテストのコンフィグレーションとして設定するわけです。**

``` java:コンフィグレーション
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public UserRepository userRepository() {
        return new InMemoryUserRepository();
    }

}
```

``` java:テスト
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    @Autowired
    private UserRepository userRepository; // InMemoryUserRepositoryがインジェクションされる

}
```

# 自動検出からテスト用のコンフィグレーションクラスを除外

しかし、特定のテストのためにコンフィグレーションを作成する場合もあります。このコンフィグレーションクラスが自動検出されてしまうと意図していないコンフィグレーションが設定されてしまうことになります。

``` java:特定のテストのためのコンフィグレーション
@Configuration
public class SpecificTestConfiguration {

    @Bean
    public UserRepository hsqlUserRepository() {
        return new HSQLUserRepository();
    }

}
```

``` java:意図せずコンフィグレーションに設定される
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    @Autowired
    private UserRepository hsqlUserRepository;

    @Test
    public void check() {
        assertThat(hsqlUserRepository).isInstanceOf(HSQLUserRepository.class);
    }

}
```

このような場合は `@TestConfiguration` を使用し自動検出の対象外としてコンフィグレーションクラスをマークしましす。コンフィグレーションを読み込みたい場合は `@Import` を使って読み込みます。

``` java:@TestConfigurationを使用
@TestConfiguration
public class SpecificTestConfiguration {

    @Bean
    public UserRepository hsqlUserRepository() {
        return new HSQLUserRepository();
    }

}
```

``` java:@Importを使用
@RunWith(SpringRunner.class)
@SpringBootTest
@Import(SpecificTestConfiguration.class)
public class DemoApplicationHsqlTests {

    @Autowired
    private UserRepository hsqlUserRepository;

    @Test
    public void check() {
        assertThat(hsqlUserRepository).isInstanceOf(HSQLUserRepository.class);
    }

}
```

# 参考

- [46.3 Testing Spring Boot Applications](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-testing-spring-boot-applications)
- [3.4.1 Spring Testing Annotations | @ContextConfiguration](https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#spring-testing-annotation-contextconfiguration)
PureScriptのレコードで必須フィールドと任意フィールドを表現する

# 目的

- 必須フィールド「a」「b」
- 任意フィールド「c」「d」

を持つレコードMyRecordを作りたい！

# 方法

```haskell:
import Prim.Row as Row
import Unsafe.Coerce (unsafeCoerce)

data MyRecord

type MyRecordRequired opt = { a :: Int, b :: Int | opt }
type MyRecordOptional     = ( c :: Int, d :: Int )

type MakePartialRecord (req :: # Type -> Type) (opt :: # Type) (rec :: Type)
  = forall options trash
  . Row.Union options trash opt
 => req options
 -> rec

makeMyRecord :: MakePartialRecord MyRecordRequired MyRecordOptional MyRecord
makeMyRecord = unsafeCoerce
```

名前の通りですが、

- MyRecordが目的のレコード
- MyRecordRequiredがMyRecordの必須フィールド
- MyRecordOptionalがMyRecordの任意フィールド

です。

MakePartialRecord型シノニムを関数っぽく使えます。

# 検証

以下は全て正しい形式です。

```haskell
test1 :: MyRecord
test1 = makeMyRecord { a: 1, b: 1 }

test2 :: MyRecord
test2 = makeMyRecord { a: 1, b: 1, c: 1 }

test3 :: MyRecord
test3 = makeMyRecord { a: 1, b: 1, d: 1 }

test4 :: MyRecord
test4 = makeMyRecord { a: 1, b: 1, c: 1, d: 1 }
```

以下は全てエラーになります。

```haskell
-- aとbが足りない！
test5 :: MyRecord
test5 = makeMyRecord {}

-- bが足りない！
test6 :: MyRecord
test6 = makeMyRecord { a: 1 }

-- aが足りない！
test7 :: MyRecord
test7 = makeMyRecord { b: 1 }

-- aとbが足りない！
test8 :: MyRecord
test8 = makeMyRecord { c: 1, d: 1 }
```

# 用途

使い道はたくさんあると思いますが、例えば、

「『名前』と『年齢』は必須だけど『住所』は無くてもいい！」

という場面を想定すると、以下のような定義を用意して、

```haskell
data UserInfo

type UserInfoRequired opt
  = { name  :: String
    , age   :: Int
    | opt
    }

type UserInfoOptional
  = ( address :: String
    )

makeUserInfo :: MakePartialRecord UserInfoRequired UserInfoOptional UserInfo
makeUserInfo = unsafeCoerce
```

以下のような目的のユーザ情報を作成することができます。

```haskell
userInfo1 :: UserInfo
userInfo1 = makeUserInfo { name: "matoruru", age: 3 }

userInfo2 :: UserInfo
userInfo2 = makeUserInfo { name: "neko", age: 2, address: "Abashiri" }
```

# 参考

- [Qiita - Unions for Partial Properties in PureScript](https://qiita.com/kimagure/items/581c63707673db61e061)
    - @kimagureさんの記事です。
Controllerのコールバックメソッド(before/after_action)

#目的
Ruby on Railsでアプリを使用する際にコールバックメソッドを使用するが、詳細まで理解する必要があると思ったため備忘録的に残しておく。

#コールバックメソッドとは
オブジェクトの特定のタイミングで呼び出されるメソッドのこと。
その中でもよく使われるbefore/after_actionを紹介する。

#before_action,after_actionとは
Controllerでbefore_actionを定義することで、アクションの前後に処理（フィルター）を差し込むことが可能になります。
一般的に、複数のアクションで共通して必要になる処理などを定義することが多い。

####before_actionの使い方
Controllerにbefore_actionとして処理したいメソッドを定義します。
※after_actionも使い方は同一です。

```ruby:blogs_controller.rb
class UsersController < ApplicationController
  before_action :set_blog
  ・・・
  def set_blog
    @blog = "before_actionの学習中"
  end
end
```

```ruby:show.html.erb
<h1>Listing Users</h1>
<p>before_actionで定義した@blog: <%= @blog.id %></p>  <!— ←この行を追加 —>
<table>

</table>
<br><img width="653" alt="スクリーンショット 2019-10-10 22.45.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509302/2ad90bd9-5974-cf20-9eff-eebef1b4de1b.png">

<%= link_to 'New User', new_blog_path %>
```
アプリケーションを起動した画面が以下になります。
上記で定義したset_blogメソッドの@blogの値が表示されていますね。
これによりアクションの前に処理を差し込むことができました。

<img width="645" alt="スクリーンショット 2019-10-10 23.04.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509302/3a0a3bea-371e-1f61-8a22-3693d3ee771f.png">

#only,excect,if,unlessオプション
railsの他のメソッド同様にオプションを持っています。

```
class UsersController < ApplicationController
  before_action :set_blog, only:[:new, edit]
end
```
上記のようにonlyオプションを使って書いた場合set_blogはnew,editアクションの前だけで実行されます。
exceptオプションは逆で指定したアクション以外でbefore_actionを実行します。

また、ifオプションはラムダを渡すことによって式がtrueの時だけ実行させることができます。
unlessオプションは式がtrue以外の時だけ実行される。

```
class UsersController < ApplicationController
# current_user.editable?がtrueの時に 
  before_action :set_blog, if: -> { current_user.editable? }
end
```

#まとめ
・before/after_actionはControllerの前後に処理を差し込むことができる
・only,except,if,unlessオプションを使うことで条件付きでコールバックを使用できる
Pie chart の初期設定

1.  matplotlib.pyplotでのPie chartの書き方：


```Python3:pie-chart.ipynb
fig, ax = plt.subplots(1, 1, figsize (6, 8))
wedges, texts = ax.pie(list-like, startangle = 90, counterclock=False, labeldistance = 0.8, autopct = None, labels = list-like)

ax.legend(wedges, list-like, loc = "upper right", bbox_to_anchor = (0.90, 0.5, 0.5, .100))

ax.title.set_text("XXXXX")
plt.savefig("XXXYYYZZZ.pdf", bbox_inches = "tight")
plt.show ()
```
AttributeError: 'AutoSchema' object has no attribute 'get_link' と出てきてDRFのAPIドキュメント生成が使えない場合の対処

## はじめに 
Django REST framework(DRF)ではかんたんな手順でAPIスキーマをきれいなUIで確認する事ができます。
こういう感じでurls.pyに記述するだけで実装できます.

```python:urls.py
from django.urls import path, include
from rest_framework.documentation import include_docs_urls 

docs_view = include_docs_urls(
    title='my drf API',
    description='This is an awesome API',
)

urlpatterns = [
    path('docs/', docs_view),
]

```
## エラーがでた
`docs/`にアクセスして確認してみると
`AttributeError: 'AutoSchema' object has no attribute 'get_link'`
と表示されエラーになりました.なんでや

## 環境
```
Python 3.7
django 2.2.5
djangorestframework 3.10.3
coreapi 2.3.3
```

## DRF 3.10以上だと発生するエラー

[3.10 Announcement](https://www.django-rest-framework.org/community/3.10-announcement/)
こちらによるとdrf3.10からはSchema生成にCoreAPIからOpenAPIを用いるようになり,将来的にはバージョン3.12でCoreAPIはDRFから削除される方針とのことです.
今回利用したモジュールはCoreAPIを使っているんですね.

OpenAPIのかわりにCoreAPIをつかうためには`settings.py`に以下を書き加えます.

```python:settings.py
REST_FRAMEWORK = {
  ...
  'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema'
}

```

動いた!!!

##まとめ
drf3.10以降で
`AttributeError: 'AutoSchema' object has no attribute 'get_link'`とエラーが出たり,CoreAPIが必要なモジュールを使うときは以下を記述する.

```python:settings.py
REST_FRAMEWORK = {
  ...
  'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema'
}

```

最後までお読みいただきありがとうございます.
（メモ）Windows10でVirtual BoxのVMが起動しない

##現象
 - 今まで問題なく使えていたが、vSphere Clientを導入、WindowsのUpdate、等が発生した後に起動できなくなる
 - VMを選択し「起動」をすると下記エラー
 
`VERR_NEM_VM_CREATE_FAILED`
`終了コード : E_FAIL`

※エラー画面をキャプチャーし損ねた。。

##対応したこと

### vSphere Clientをアンインストール
- アンインストールと再起動をしたけれど解決しない

### OSのHyper-V関連の設定を変更

- PowerShellの管理者権限で、以下のコマンドを実行し再起動するが解決しない

```cmd:
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
```
- Windowsの機能の有効化または無効化で「Windowsサンドボックス」がオフになっていることを確認（既にオフになっていた）

- Hyper-Vをオフにする
下記を参照し、rd91 » 6. Jun 2019, 20:59 の投稿を踏襲した。
https://forums.virtualbox.org/viewtopic.php?f=6&t=93443
1) Poweshellで`bcdedit /set hypervisorlaunchtype off`を実行
2) Reboot
下記も参考になった。
[Hyper-VのON・OFFを簡単に自動化すっぞ！！](https://qiita.com/dodonki1223/items/75bd5171e2f2193c9977)


- Hyper-Vをオフにした後、VirtualBoxのVMは正常に起動できるようになった！
Infrastructure as Code (IaC)

Why?
--------------

- Windowsに色んなソフトウェア入れていったら途中で動かなくなった
  - 手順書？そんなもの残せるわけないじゃん？
- Linuxシステムの色んな所にPythonが入っていて、しかも消して良いか分からん
  - anacondaとか色々あってそれぞれのチュートリアルしてたらたくさん入ってる...
- 設定ファイルにredisと書いたらRedisが、postgresと書いたらPostgreSQLが起動して欲しい

-----

Immutable Infrastructure
----------------------------------
- 構築したら手順書なんて書かないので逆に手順書から環境を構築する
- 直接システムに環境を構築すると、手動でまた変なことをしてしまう
- 一回使ったら消して新しく作り直したらいつも同じ！
- すぐ消すので実機じゃなくて仮想マシンとして構築したい

------

Docker
------
- Hyper-V, KVM等のハイパーバイザーの仮想マシン作るのはコストがかかる
- 仮想ファイルシステムとOSリソースの管理だけしてくれたら十分
- 仮想マシンは簡単にダウンロード・アップロード出来て欲しい
- Linux container / Windows Server container

-----

Dockerfile
-----------
- 独自の手順書フォーマット

```dockerfile
# docker.ioからubuntuコンテナを取ってきてベースにする
FROM ubnuntu
# ビルドに必要なライブラリをインストール
RUN apt install -y curl g++ make git cmake
# GitHubからダウンロードしてビルドしてインストール
RUN git clone http://github.com/grpc/grpc \
 && cd grpc \
 && cmake -Bbuild -H. -DCMAKE_INSTALL_PREFIX=/usr \
 && cmake --build build --target install
# これで/usrにgrpcがインストールされたubuntuが出来上がる
```

- 構築したコンテナに名前を付けて管理する

```
docker build . --tag grpc-ubuntu
```

-------

Continuous Integration (CI)
--------
- どのコードで・どの環境で・どの条件でテストされているのか分からなくなる
- Docker内でテストを実行すればいつでもDockerfileに書いた通りの環境が使える
- ユーザーも同じ環境が簡単に用意できる
- すぐにどこでも環境を自動的に用意出来るので、GitにPushするだけで環境構築からテストまでやってくれる
  - OSSだと無料で使えるところが多い(Travis CI, Circle CI, Azure Pipeline, ...)
  - 課金で大量のサーバーを使えるようになる(Circle CI, Google Cloud Build, ...)

-------

Continuous Delivery/Deployment (CD)
--------------------
- 本番・テスト環境へのデプロイも自動でやってほしい
- コンテナ環境を常に使うことで、本番もテストも同じ環境で行うのでデプロイ時のエラーを防ぎやすい

### CIOps
- Git Pushのイベントでデプロイを行う
- Heroku / GitLab Pages

### GitOps
- 常にGitリポジトリを監視し、その定義通りになるようにシステムを更新していく
- より複雑なデプロイに対応できる（ローリングリリース、カナリアリリース）
- Kubernetes (Deployment, ...)
SSHログイン時にどのサーバに入ったかわかりやすくする


ローカルマシンから色々な環境にSSHで接続する際に、間違えて意図していないサーバーに接続してしまうことがある。

SSHでログインした時の挙動を特徴のあるものにしておけば、間違えても間違えたことに気づけるはず。

## ログイン時に走るスクリプト

`/etc/ssh/sshrc`が自動で走る。

## ログイン時にターミナル画面をクリアし、名前を表示する

```
clear
echo "This is Your Hostname."
```

## 文字の色とか変えてみる

```
COLOR_BEGIN="\[\e[1;37;42m\]"
COLOR_END="\[\e[m\]"
HOST_NAME="hostname"
export PS1="${COLOR_BEGIN}[ \u@${HOST_NAME} \W ] ${COLOR_END}$ "
```

参考記事
https://hodalog.com/customize-prompt-of-linux/
ありがとうございました。
Node-REDでLINE botの接続確認

自作のLINE botを作るときに欠かせないのがwebhook。LINE Developersのチャンネル設定画面ではwebhookの接続確認をボタンで出来ます。しかし、[以前の記事](https://qiita.com/K_M95/items/16698048d344389d3cf0)では、ボタンを押すとエラー文が出ると書きましたが、これは接続確認のときの処理を入れてないせいで起こるエラーです。ちなみに接続確認のときにwebhookで出力されるjsonは以下のようなものです。

```json
{"events":[
  {
    "replyToken":"00000000000000000000000000000000",
    "type":"message",
    "timestamp":1570728501562,
    "source":{
      "type":"user",
      "userId":"Udeadbeefdeadbeefdeadbeefdeadbeef"
    },
    "message":{
      "id":"100001",
      "type":"text",
      "text":"Hello, world"
    }
  },
  {
    "replyToken":"ffffffffffffffffffffffffffffffff",
    "type":"message",
    "timestamp":1570728501562,
    "source":{
      "type":"user",
      "userId":"Udeadbeefdeadbeefdeadbeefdeadbeef"
    },
    "message":{
      "id":"100002",
      "type":"sticker",
      "packageId":"1",
      "stickerId":"1"
    }
  }
]}
```

このjsonは接続確認用のダミーなので、replyTokenの```00000000000000000000000000000000```でメッセージを返信する処理を行ってもメッセージが送られないのでAPIのエラーになりサーバーからのステータスコードとしては```500```が返ってくるので接続確認のエラーにつながるというわけです。これを解決するためには接続確認のときのreplyTokenが来たときには余計な処理ををせずにhtml responseノードを接続してLINE側にレスポンスを行うだけです。具体的には、

- inputのhtmlノードの後すぐにswitchノードを追加する
- 上記のreplyTokenかそうでないかで条件分岐を行う
- 上記のreplyTokenだったときの接続先はhtml responseノード
- それ以外だった場合はボットの返信処理を行う

という流れで組むだけです、この接続確認を取り入れたボットのフローは以下のようになります。

![スクリーンショット 2019-10-11 03.23.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/21c5a976-ab86-cb58-ba97-0181268855b7.png)

このフローの中のswitchノードの設定は以下の通りです。

![スクリーンショット 2019-10-11 03.30.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/b9ffe43c-e9ac-6cba-fa38-5260849c519d.png)

また、今回は詳しく取り上げませんが、ボットの返信処理に関しては、[こちら](https://qiita.com/K_M95/items/16698048d344389d3cf0)を参考にするか、のびすけさんの作られた[Messaging APIノード](https://flows.nodered.org/node/node-red-contrib-line-messaging-api)を使って簡単に作成出来ます。
主なRDB（Oracle, MySQL, PostgreSQL）の機能比較

全国で利用されているDBの分布は以下のようになっているらしいです。
<img width="549" alt="スクリーンショット 2019-10-11 2.07.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/e2b70021-7bab-42e5-2512-9321699432b9.png">

この中でも特に、Oracle, MySQL, PostgreSQLに焦点をあててそれぞれの機能を簡単に比較したので、それをまとめました。

# Oracleの主な特徴
- Oracle社が開発・販売する商用RDBMS

## 行レベルロック
- 複数のユーザーが同一の表の別の行に同時にアクセスするのでパフォーマンスが高い

## 読み取り一貫性
- ダーティ・リード（更新前の情報と更新後の情報の両方を取得）が発生しないように、更新前データのみを取得する

## 堅牢性
- Oracle Data Guardと呼ばれる、災害時やデータ破損時などあらゆる障害からデータベースを保護し、サービスの継続を可能にするシステムが存在している

## 移植性
- Oracle Databaseは全てC言語で書かれいているので、幅広い運用が可能
- 管理や開発の効率化のための様々なツールが利用できる

## その他特徴
- トランザクションが自動的に開始する
- DDL（データ定義言語）やDCL（データ制御言語）の実行後に、コミットが自動的に行われる

# MySQL, PostgreSQLとの比較
- MySQLは、MySQL ABが開発したRDBMSだが、現在の管理運営はOracle社が行っている
- PostgreSQLは、PostgreSQL Global Development Groupによって開発が行われている

## ライセンスの違い
- Oracleは高機能高性能のため圧倒的に高いです
- PostgreSQLはオープンソースソフトウェア

<img width="765" alt="スクリーンショット 2019-10-11 2.06.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/aadf7c9b-090c-f8ec-72b5-ac884d3dda05.png">

## 派生したDBの種類
- PostgreSQLとMySQLは派生したデータベースが多く存在し利用されています。

<img width="634" alt="スクリーンショット 2019-10-11 2.20.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/e5ec3ed9-4f79-7969-4669-11cd3a0a3560.png">

## ストレージアーキテクチャの違い
- OracleやMySQLが「更新型」のアーキテクチャなのに比べて、PostgreSQLはストレージの管理方法が「追記型」のため、既存のデータの書き換えを行うことなく空いている領域を使って更新データを追記している
    - 更新型 : 対象レコードをそのまま更新
    - 追記型 : 既存レコードを保持したまま、新規レコードを追加して参照先を変更
        - なお、データ量についてはバキューム機能（VACUUM）により解決しているそう

<img width="705" alt="スクリーンショット 2019-10-11 2.26.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/9ca86c6e-fbdd-086b-9e03-dfdbfa2eb7e1.png">

## データベースの機能比較
- データ型や命名規制, 書式等はそれぞれ異なる形式になっているが大きな差は無い
- Oracleはチェック制約があるが、MySQLではトリガーで実装する必要がある
- OracleにはシーケンスがあるがMySQLにはなく、代わりに自動インクリメントで定義
- Oracleはシノニム（オブジェクトに対する別名を定義）があるのに対し、MySQLとPostgreSQLには無い
- OracleはNULLと空文字は同一判定だが、MySQLとPostgreSQLでは別枠
- Oracleはトランザクションは任意単位だが、MySQLとPostgreSQLは基本的にSQL文単位で確定
- その他、実行計画の違いやヒント句の有無など


<img width="694" alt="スクリーンショット 2019-10-11 2.27.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/616c872d-7561-78d8-303c-2768f2498f90.png">


# 参考資料
[知ってるようで知らない！Oracle（オラクル）とは](https://itpropartners.com/blog/8599/)
[2017年データベースの選択は](https://www.db-tech-showcase.com/blog_db_choice1)
[SQLの観点から「Oracle Database」「PostgreSQL」「MySQL」の特徴を整理しよう](https://www.ashisuto.co.jp/corporate/column/technical-column/detail/1197236_2274.html)
[PostgreSQLとMySQL、使うならどっち？ データベース専門家が8つの視点で徹底比較！](https://employment.en-japan.com/engineerhub/entry/2017/09/05/110000)
ナポレオンソート～銃口ソートから発想を得たO(1)のソート～

[銃口ソート](https://qiita.com/BlueRayi/items/4d6b36bf5bd3d11d0322#_reference-0d0ac8a9ba0355383712)からソートの哲学を感じた。

元記事は、**ソートのテストコードに食わせて`True`が返却されればよい**というのが銃口である。銃口に感じる一因に、ソート後のオブジェクトのクラス(挙動)が変わる点もあげられる。

また、銃口ソートは$O(N)$である。
$O(1)$ソートを実現したいが、もちろん全てを粛清はしたくない。

# ソートの法則(銃口ソートとほぼ同じ)

`i < j の場合`

`arr[i] <= arr[j]`

かつ、

`i > j の場合`

`arr[i] >= arr[j]`

が成り立てばいいのだろう？

# Rubyの世界で革命を起こす

Rubyの世界の(破壊的)ソートを$O(1)$にしてみせよう。

``` ruby:revolution_sort.rb
class Affected
  include Comparable

  def initialize org, revolution_number
    @revolution_number = revolution_number
    @org = org
  end

  def <=> o
    revolution_number <=> o.revolution_number;
  end

  def method_missing method, *args
    @org.__send__ method, *args
  end

  protected

  def revolution_number
    @revolution_number
  end
  
end

class Array
  def sort! # sort!をO(1)にオーバライド
    @revolution = true
    self
  end

  alias :__private_get :[]

  def [] i
    if @revolution
      Affected.new __private_get(i), i
    else
      __private_get i
    end
  end
end

a = [2,1,3]
puts a[0] <= a[1] # => false
puts a[0] >= a[1] # => true
puts a[1] <= a[2] # => true
puts a[1] >= a[2] # => false

a.sort!
puts a[0] <= a[1] # => true
puts a[0] >= a[1] # => false
puts a[1] <= a[2] # => true
puts a[1] >= a[2] # => false


```


**$O(1)$のために、全てを粛清する必要はない。革命を起こせばいいのだ。**

~~黒魔術による革命がもたらしたものは混沌~~

# 謝辞

当初元記事を読み誤り記事を書きましたが、計算量とmethod missing以外は元ネタと同じです。~~勝手にソート名を変えた~~

> ~~多分既出だと思うけどこんなもん既出かどうか調べている暇があったら寝なさい。~~
>
> ~~睡眠不足はいい仕事の大敵です。~~[^1]

[^1]: [ソートってなんだよ(哲学)](https://qiita.com/BlueRayi/items/81722b5d72bcfce30b15)

~~寝不足になりました[^2]:neutral_face:~~

[^2]: 余談ですが、当初`method_missing`ではなく、オープンクラスで`define_method`を使用して、revolution_numberをインスタンス変数に持たせる方針で動作確認したところ、`can't modify frozen Integer (FrozenError)`の回避策がわからず断念しました。
Udemy 「Unityゲーム開発入門」講座受講ノート　4 - 24 列挙型について

#24. 列挙型について

###列挙型

用意された値の中からだけ選択するような、型を自分で作成する
限られた中から選ぶのでエラーが起きにくい
文字のまま使えるので見かけがわかりやすい

**public enum 列挙型名
[
　　　値１,
　　　値２,
　　　値３
]**



###値を代入する


**列挙型名 変数名 = 列挙型名.値;**

```csharp

    public enum TYPE     //列挙型を作成
    {
        STOP,
        RIGHT,
        LEFT
    }

   TYPE type = TYPE.STOP;   //作成したTYPE型の変数typeに値を代入


   void Start()
    {
        if (type == TYPE.STOP)
        {
            Debug.Log(type);
        }
    }
```

-------------------------------------------------------------------------
##教材
**Udemy Unity ゲーム開発入門：インディーゲームクリエイターが教えるマリオのようなゲームを作成する方法**
https://www.udemy.com/course/studio_shimazu_sideview_action/
Mac のデフォルトシェルが bash から zsh に変更された機に乗じて乗り換える手順

macOS Catalina にアップデートすると、デフォルトシェルが bash から zsh に変更されていました。

ターミナルを起動すると、以下のようなメッセージが表示されます。

```
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
```

https://support.apple.com/ja-jp/HT208050

bash のまま使い続けることもできますが、これを機に zsh に乗り換えたいと思い、指示通り、次のコマンドを実行して、ターミナルを再起動してみました。

```
$ chsh -s /bin/zsh
```

次のコマンドを実行すれば、使用中のシェルが確認できます。

```
% echo $SHELL
/bin/zsh
```

ちなみに、次のコマンドでは、使用可能なシェルの一覧を取得することができ、

```
% cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
```

いざという時には、zsh に切り替えた時と同様にして、簡単にシェルを変更できます。

```
% chsh -s /bin/bash
```

さておき、あとは「 [オススメのターミナル初期設定の手順](https://qiita.com/normalsalt/items/63a2e21b5afa2467679e) 」に書いたような bash の設定ファイルを元に、zsh の設定ファイルを作成するだけです。

まぁ、作成するだけ、と言っても、これは、現在の設定ファイルを作り込んでいる人ほど、大変な作業になると思いますが、頑張りましょう。笑

```~/.zshrc
PROMPT="%B%F{green}%n@[%*]%f%b:%B%F{blue}%~%f%b%# "

alias ls='ls -AFG'
alias ll='ls -hlt'

alias history='history -Di'

# http://zsh.sourceforge.net/Doc/Release/Options.html#Description-of-Options
setopt hist_ignore_dups
setopt share_history
HISTSIZE=1000
HISTFILE=~/.zsh_history
SAVEHIST=100000

setopt nonomatch
setopt correct

autoload -Uz compinit && compinit

# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#History-Control
bindkey '^P' history-beginning-search-backward
bindkey '^N' history-beginning-search-forward

# https://git-scm.com/book/en/v2/Appendix-A%3A-Git-in-Other-Environments-Git-in-Zsh
autoload -Uz vcs_info
precmd_vcs_info() { vcs_info }
precmd_functions+=( precmd_vcs_info )
setopt prompt_subst
RPROMPT=\$vcs_info_msg_0_
# PROMPT=\$vcs_info_msg_0_'%# '
# zstyle ':vcs_info:git:*' formats '%b'

# http://zsh.sourceforge.net/Doc/Release/User-Contributions.html#vcs_005finfo-Configuration
zstyle ':vcs_info:git:*' formats '[%F{yellow}%b%f]%u%c'
zstyle ':vcs_info:git:*' actionformats '[%b|%a]'
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr ":%F{green}!%f"
zstyle ':vcs_info:git:*' unstagedstr ":%F{red}+%f"
```

最後に、次のコマンドで実行して、ちゃんと設定できているかどうか、確認しておきます。

```
% source ~/.zshrc
```

これで、とりあえず、初期設定は終わりとしますが、どうやら zsh には、数多くの便利な機能があるようなので、随時、設定ファイルを更新して、徐々に使いこなしていきたいですね。

上記の設定ファイルでは、Git 関連も含むプロンプトの表示やエイリアス、コマンド履歴周りの設定を除けば、特別な機能として、以下のものを導入しています。

## コマンドのスペルミスの修正

```~/.zshrc
setopt correct
```

コマンドを実行しようとした際に、スペルミスがあれば、修正を提案してくれます。

## コマンドの補完

```~/.zshrc
autoload -Uz compinit && compinit
```

コマンドを途中まで打って「 Tab 」を押すと、残りの部分を補完してくれます。

## コマンド履歴の検索

```~/.zshrc
bindkey '^P' history-beginning-search-backward
bindkey '^N' history-beginning-search-forward
```

上記の例では、コマンドを途中まで打って「 control + P 」を押すと、それに続く内容を、以前に実行したコマンドを順番に遡って検索できます。

行き過ぎたら「 control + N 」を押せば、逆方向へ検索できます。
【初心者】HTML　ページ背景／ブロック要素etc【備忘録２】

##10/8～10/10 勉強したこと

- 背景に画像を入れる・その際は画像が繰り返し表示になるので、画面いっぱいに表示も可能
- 中央寄せの際はwidthを書いてからmargin:0 auto;
- 透過の書き方（全体と背景だけの分が違う）
- 文字の間隔・行間の書き方
- hoverのアニメーションのつけ方
- 要素の違い
    - ブロック要素→要素が横いっぱい広がって縦に並ぶ
    - インライン要素→平べったく横に並ぶ
        - 幅は高さは指定できない
    - インラインブロック要素→並びがインライン・中身はブロック

##10/8～10/10 気を付けたいと感じたこと

- 前の記事でCSSを書く際じclass名の前に.を付け忘れることがあったが、class名でないときは.が不要なので気を付けたい。
- border-radius:〇〇px;は値が大きくなるほど丸に近くなる。
- padding:の左右だけ設定したい場合に、上下の0pxを入れ忘れることがあるので気を付ける。


##振り返り

まだ覚えたことを自分の物にできていないので、復習の時間をしっかり取るようにしていきたい。
(一度書いたものをリセットしてスライドを見ないで書き直し)
すべて覚えきりたいが、まずは何ができるか・どんなことができたか
少しずつ進めていきたい。HTMLとCSSは18日までに復習含めてひと段落させたい。
やっていく中で、指示を見ずに見本を見て考えて出来るようにしていきたい。
.bat バッチファイル で実行時間を測定する。ただし24H未満に限る

#これは何?

Windows バッチファイルで時間測定をする方法を紹介します。

#想定読者

- どうしても powershell や python を使いたくない人
- 計測区間が 24時間未満ので十分な人
- できるだけ環境変数を汚染したくない人

#結論

下記バッチファイルを呼び出してください。
第一引数に測定開始の `%TIME%` の値
第二引数に測定終了の `%TIME%` の値
を与えます。
戻り値(`%errorlevel%`)は、測定区間のセンチ秒です。
第二引数を指定しない場合、第一引数に指定した `%TIME%` をセンチ秒に変換した値を返します。
第三引数に何か指定した場合は、時間表示が抑制されます。
戻り値が負の値はエラーです
動作は Windows 10 1903 で行っています。 Windows 8 以降なら動くと思います。

```duration.bat
@echo off
@setlocal

if "%~1"=="" exit /b -1

call :time2centiseconds %1
set startcs=%errorlevel%
if "%~2"=="" exit /b %startcs%

call :time2centiseconds %2
set endcs=%errorlevel%

call :duration_centiseconds %startcs% %endcs%
set dur=%errorlevel%

if "%~3"=="" call :centiseconds2time %dur%
exit /b %dur%

:time2centiseconds
if "%~1"=="" exit /b 0
for /f "tokens=1-4 delims=:.," %%a in ("%~1") do set /a cs=%%a*360000+(1%%b %% 100)*6000+(1%%c %% 100)*100+1%%d %% 100
exit /b %cs%

:duration_centiseconds
if "%~1"=="" exit /b 0
if "%~2"=="" exit /b 0
set /a dur=%2 - %1
rem we might have measured the time inbetween days
if %dur% lss 0 set /a dur=%dur%+8640000
exit /b %dur%

:centiseconds2time
if "%~1"=="" exit /b -1
set /a h=%1 / 360000
set /a m=(%1 - %h% * 360000) / 6000
set /a s=(%1 - %h% * 360000 - %m% * 6000) / 100
set /a cs=(%1 - %h% * 360000 - %m% * 6000 - %s% * 100)

if %h% lss 10 set h=0%h%
if %m% lss 10 set m=0%m%
if %s% lss 10 set s=0%s%
if %cs% lss 10 set cs=0%cs%

for /f "tokens=1-2 delims=," %%a in ( "%time%" ) do (
  if "%%b"=="" (
    echo %h%:%m%:%s%.%cs%
  ) else (
    echo %h%:%m%:%s%,%cs%
  )
)
exit /b 0
```

呼び出し例

```
set basetime=%time%
何か処理をつらつら行う
duration.bat %basetime% %time%
```

# 実行例

## 時刻からセンチ秒を得る

```
C:\>duration.bat 00:22:25.95
C:\>echo %errorlevel%
134595
```

## 時間をセンチ秒で得る

- echo あり

    ```
C:\>duration.bat 00:22:25.95 00:02:25.95
23:40:00.00
C:\>echo %errorlevel%
8520000
    ```
- echo なし

    ```
C:\>duration.bat 00:22:25.95 00:02:25.95 noprint
C:\>echo %errorlevel%
8520000
    ```

#雑談

参考文献を見ていて、環境変数を汚すことが気になった。
なんとか汚さずにすむ方法ないかなと考えてたら `%errorlevel%` でセンチ秒を返せばいいことに気づいた。
で、そのルーチンで、実行時間のセンチ秒を表示しようと思ったんだけど、センチ秒じゃ直感的じゃないので、差分をとって表示するルーチンも組み込みました。

`%TIME%` の値が、ロケールによって `,` か `.` の違いがあるというのを知ったのが、今回の収穫かな。
表示の時は、ロケールに従うようになっているハズ。

#参考文献

https://qiita.com/koryuohproject/items/815a1621bc34a223e4b9
https://stackoverflow.com/questions/605522/print-time-in-a-batch-file-milliseconds
http://futuraso.hatenablog.com/entry/2016/09/09/095406
CatalinaにアップデートしSassが使えなくなった時の対処法

# CatalinaにアップデートしSassが使えなくなったら
MacOSをMojaveからCatalinaにアップデートして、以前まで使えていたSASSのコンパイルができなくなった

## エラー
sassコマンドを使用しようとしたら、

```
$ sass
>>> /usr/local/bin/sass: /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby: bad interpreter: No such file or directory
```
とおこられた。。。

##対処法
### 1. Xcodeをアップデート
*[App Store](https://apps.apple.com/jp/app/xcode/id497799835?mt=12)*からアップデートを行う

### 2. Rubyを再インストール

2.1 ターミナルでRubyを再インストールする

```
brew install rbenv ruby-build
```

2.2 Sass と compass をインストールする

```
sudo gem install -n /usr/local/bin sass
sudo gem install -n /usr/local/bin compass
```

## 結果

OSアップデートすると色々と面倒なので慎重にアップデートしましょう！
噛み砕いたC#(json読み込み）

JavaScriptでやった覚えがあったぐらいでしたが。。

C#だとこんな感じみたいです。

今回はlivedoorから提供されているWeather Hacks
のAPIを使用する。まずは東京のお天気情報のリクエストURLを叩いてレスポンスを確認しよう。
http://weather.livedoor.com/forecast/webservice/json/v1?city=130010

1,Visual Studioで新規コンソールアプリプロジェクトを作成したら、まずHttp通信ができるようする。

参照を右クリックで追加

2,開いたメニューの検索窓にHttpと入力し、System.Net.Httpを選択し、OKボタンを押す

３,Jsonパースができるようにする。こんどはパッケージを右クリック。
Manage NuGet Packages…をクリック

4,開いたメニューの検索窓にJsonと入力し、Newtonsoft.Jsonにチェックをいれてパッケージを追加を押す

```C#:Program.cs
using System;
using System.Net.Http;
using Newtonsoft.Json.Linq;

namespace WeatherApp {
    class MainClass {
        public static void Main(string[] args) {
            //WebAPIのURL
            string url = "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010";
            //HttpClientインスタンス作成(using System.Net.Http;を忘れないこと)
            HttpClient client = new HttpClient();
            //Get通信して結果を文字列として取得
            string result = client.GetStringAsync(url).Result;
            //表示
            //Console.WriteLine(result);

            //今回はルートが{で始まるオブジェクトなのでJObject.Parse,ルートが配列の場合はJArray.Parseを用いる
            //(using Newtonsoft.Json.Linq;を忘れないこと)
            JObject jobj = JObject.Parse(result);
            //表示してみる
            Console.WriteLine(jobj);

        }
    }
}


```

これを三日のみ出す場合

```C#:Program.cs
using System;
using System.Net.Http;
using Newtonsoft.Json.Linq;

namespace WeatherApp {
    class MainClass {
        public static void Main(string[] args) {
            //WebAPIのURL
            string url = "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010";
            //HttpClientインスタンス作成(using System.Net.Http;を忘れないこと)
            HttpClient client = new HttpClient();
            //Get通信して結果を文字列として取得
            string result = client.GetStringAsync(url).Result;
            //表示
            //Console.WriteLine(result);

            //今回はルートが{で始まるオブジェクトなのでJObject.Parse,ルートが配列の場合はJArray.Parseを用いる
            //(using Newtonsoft.Json.Linq;を忘れないこと)
            JObject jobj = JObject.Parse(result);
            //表示してみる
            //Console.WriteLine(jobj);

            //jobjが持つforecastsは配列なので以下のようにその配列部分を取得する。
            JArray jarr = (JArray)jobj["forecasts"];

            //jarrに入っているのはオブジェクトなので以下のようなforeachで回す
            foreach(JObject f in jarr) {
                //fとして取り出したJObjectのdateLabelは文字列なのでstringでキャストしてあげる
                string dateLabel = (string)f["dateLabel"];
                //確認してみる
                //Console.WriteLine(dateLabel);
                string telop = (string)f["telop"];
                string date = (string)f["date"];
                Console.WriteLine($"{dateLabel}({date})...{telop}");
            }
        }
    }
}

```

実際は10分ぐらいの説明でふんふんと聞いてただけだったのでちゃんと理解しなきゃ。。
Webサーバのファイルを、HTTP Range Headerを使ってRuby IOクラスに擬態化させて読み込む

# はじめに
Slackのruby-jpで、S3上のデカいzipファイルを解凍しながらダウンロードしたいと書いてる人がいて、それに対してHTTP Range Headerをいい感じにするIOを作るというアイデアを提案してる人がいたので作ってみた。

ちなみに [s3io](https://rubygems.org/gems/s3io) というgemがまさにそれなのだが、aws-sdkに依存している（しかも古いバージョンのまま更新されてない）ので、HTTP Range Headerを直接使ってS3以外でも使えるものを作った。

# 完成品
```rb:rangeio.rb

require 'net/http'
require 'uri'

class HTTPRangeIO

	def initialize(url, clazz = Net::HTTP)
		uri = URI.parse(url)
		@http = clazz.start(uri.hostname, uri.port, use_ssl:(uri.scheme == 'https'))
		@path = uri.request_uri
		@pos = 0
	end

	def tell
		@pos
	end

	def seek(offset, whence = IO::SEEK_SET)
		case whence
		when IO::SEEK_CUR
			@pos += offset
		when IO::SEEK_END
			@pos = size + offset
		else
			@pos = offset
		end
		raise Errno::EINVAL if @pos < 0
	end

	def size
		@content_length ||= @http.request_head(@path).content_length
	end

	def read(length = nil, outbuf = "")
		first = @pos
		last = length ? (@pos + length) : size
		return "" if first == last
		request = Net::HTTP::Get.new(@path)
		request.range = Range.new(first, last, true)
		response = @http.request(request)
		@pos += response.content_length
		outbuf.replace(response.body)
	end

	def close
		@http.finish unless @cloned
	end

	def initialize_copy(obj)
		@cloned = true
		super
	end

	def method_missing(name, *args)
		# do nothing
	end

end
```

IOと言いながら読み込みにしか対応してないのがダサいところではあるが、今回の要件では `tell`, `seek`, `size`, `read`, `close` を実装すれば動いたのでこれだけで。
`initialize_copy` はdupされたインスタンスがcloseされたときにセッションをクローズしないようにするため、`method_missing` はサポートされてない（主に書き込み用の）メソッドを呼ばれても落ちないようにするためにある。

# 使い方
考え方は `StringIO` と同じで、URLをコンストラクタに渡すと、それをIOとして扱うことができるようになる。

### プログラム
```rb:sample.rb

require 'zip'
require 'rangeio'

url = "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip"
io = HTTPRangeIO.new(url)
zf = Zip::File.new(io, false, true)
zf.each do |entry|
	puts entry.name
end
zf.close
io.close
```

ここではzipライブラリとして `rubyzip` を使っているが、読み込み専用の `Zip::InputStream` を使ってもおそらく問題はない。
`Zip::File.open_buffer` はIOを引数にとるが、zipファイルを更新するためのメソッドなので、読み込みのみでも書き込み用のメソッドが走ってしまうらしいので、使わないことにした。

### 実行結果
```
$ ruby sample.rb
awscli-bundle/install
awscli-bundle/packages/urllib3-1.22.tar.gz
awscli-bundle/packages/PyYAML-3.13.tar.gz
awscli-bundle/packages/futures-3.3.0.tar.gz
awscli-bundle/packages/python-dateutil-2.8.0.tar.gz
awscli-bundle/packages/s3transfer-0.2.1.tar.gz
awscli-bundle/packages/colorama-0.4.1.tar.gz
awscli-bundle/packages/six-1.12.0.tar.gz
awscli-bundle/packages/colorama-0.3.9.tar.gz
awscli-bundle/packages/PyYAML-5.1.2.tar.gz
awscli-bundle/packages/python-dateutil-2.6.1.tar.gz
awscli-bundle/packages/rsa-3.4.2.tar.gz
awscli-bundle/packages/argparse-1.2.1.tar.gz
awscli-bundle/packages/simplejson-3.3.0.tar.gz
awscli-bundle/packages/awscli-1.16.256.tar.gz
awscli-bundle/packages/docutils-0.15.2.tar.gz
awscli-bundle/packages/pyasn1-0.4.7.tar.gz
awscli-bundle/packages/virtualenv-15.1.0.tar.gz
awscli-bundle/packages/urllib3-1.25.6.tar.gz
awscli-bundle/packages/botocore-1.12.246.tar.gz
awscli-bundle/packages/jmespath-0.9.4.tar.gz
awscli-bundle/packages/ordereddict-1.1.tar.gz
awscli-bundle/packages/setup/setuptools_scm-1.15.7.tar.gz
```