OmniAICreator/Qiita-1.07M huggingface dataset:
🍰【CakePHP2】エレメンツをデフォルトのapp/View/Elements以外のディレクトリから呼び出す

## 環境
PHP 7.2.21
CakePHP 2.10.18

## やりたいこと

Elements以外のディレクトリにエレメンツテンプレートを置いた場合や別Appにあるエレメンツテンプレートを呼び出したい

## やったこと

cdコマンドと同じ指定を使うことでデフォルトである「app/View/Elements」以外の別階層を指定できる

※CakePHPの設計思想は**「設定より規約」(convention over configuration)**に賛同しているのであまり使いどころはないかもですが

### 同じAppの別ディレクトリのエレメンツテンプレートを使用
test/app/View/ から test/app/View/Form/default.ctp を呼ぶ

```test.ctp
<?php
    $elementsDir = '../../View/Form/default';
    // 通常
    echo $this->element($elementsDir);

    // 変数渡しがある場合
    echo $this->element($elementsDir, [
        'var'  => 'hoge',
        'var2' => 'fuga',
    ]);



    // もちろん変数を使わずそのまま呼び出しも可能
    echo $this->element('../../View/Form/default');
?>
```

### 別Appのエレメンツテンプレートを使用する場合
test/app/View/ から test_2/app/View/Elements/form.ctp を呼ぶ

```test.ctp
<?php
    $elementsDir = '../../../../test_2/app/View/Elements/form';
    // 通常
    echo $this->element($elementsDir);

    // 変数渡しがある場合
    echo $this->element($elementsDir, [
        'var'  => 'hoge',
        'var2' => 'fuga',
    ]);
?>
```
【コピペ】CentOS8におけるZephir開発環境手順

# 目的
- CentOS8でZephirの開発をする
    - 普通のPHP拡張モジュールはCで書く
        - 文字列操作が複雑
        - メモリ管理が煩雑
        - PHP拡張モジュール独自の要素もある
    - ZephirはPHP拡張モジュール開発専用言語
        - PHPライクな記法
        - PHPの関数をそのまま使える
        - メモリも文字列も自由に書ける
        - 主にclass作成用で、OPCacheのようにエンジンの置き換えはできない？

## 公式ドキュメント
[Zephir Documentation v0.12](https://docs.zephir-lang.com/0.12/en/)
[github:zephir](https://github.com/phalcon/zephir)

# どんな環境を作るの？
- OS
	- CentOS8
- PHP
	- PHP7.2.11
- httpサーバ
	- Apache

# コピペでできるインストール手順
## 必要なパッケージのインストール
    dnf install -y git gcc gcc-c++ make autoconf automake zip unzip wget tar httpd

## re2c
[最新をチェック](https://github.com/skvadrik/re2c/releases)

    cd /usr/local/src

    wget https://github.com/skvadrik/re2c/releases/download/1.3/re2c-1.3.tar.xz

    tar Jxfv re2c-1.3.tar.xz

    cd re2c-1.3

    ./configure

    make

    make install

    re2c -v

## PHP7
    dnf install -y php php-*

    php -v

## php-zephir-parser
    cd /usr/local/src

    git clone git://github.com/phalcon/php-zephir-parser.git

    cd php-zephir-parser

    phpize

    ./configure

    make

    make install

    vi /etc/php.d/50-php-zephir-parser.ini
        [Zephir Parser]
        extension=zephir_parser.so

    php -m

## composer
    cd /usr/local/src

    curl -sS https://getcomposer.org/installer | php

    cp /usr/local/src/composer.phar /usr/local/bin/composer

    composer --version

## zephir
[最新をチェック](https://github.com/phalcon/zephir/releases)

    cd /usr/local/src

    git clone --depth 1 -b $(git ls-remote https://github.com/phalcon/zephir 0.12.16 | sort -t/ -k3 -Vr | head -n1 | awk -F/ '{ print $NF }') https://github.com/phalcon/zephir

    cd zephir

    composer install

    vi /etc/profile
    export PATH=$PATH:/usr/local/src/zephir

    source /etc/profile

## 再起動
	reboot

# 開発手順
## プロジェクト作成
    zephir init [任意のモジュール名]

    cd [任意のモジュール名]

## ソース配置
    vi [任意のモジュール名]/[任意のクラス名].zep

```
namespace [任意のモジュール名(キャメルケース)];

class [任意のクラス名(キャメルケース)]
{
    public static function say()
    {
        echo "hello world!";
    }
}
```

## 設定変更
    vi config.json
        internal-call-transformation: true

## モジュール登録
    vi /etc/php.d/[任意のモジュール名].ini
```
; Enable [任意のモジュール名] extension module
extension=[任意のモジュール名]
```

    php -m

## コンパイル
    zephir fullclean

    zephir build

    systemctl restart php-fpm

# 使い方

	<?php
		echo [任意のモジュール名]\[任意のクラス名(キャメルケース)]::say();
	?>
VSCodeのprettierが効かないとき

#困った状況
vue-cliで作成したファイルの自動整形が効かない。
VSCodeのprettier拡張機能は入れているのに。



#原因は
Settingsの、Editor:Format On Saveにチェックを入れていなかったからだ。
チェックをすると解決した。

<img width="500" alt="Screen Shot 2020-01-28 at 13.13.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569715/3497f544-4856-2757-c0b7-227ccfb3b221.png">

#起こり得る場合とは

VSCodeをインストールしたてのときだ。
私はPCを新しくして、VSCodeに対して初期設定の準備が足りなかったようだ。
約半日ほどを潰してしまった。
バルクインサート＆バルクアップデート

##経緯
業務でプルリクエストレビューをした際に、既存レコードが存在する場合は一件ずつアップデート、新規作成する場合はバルクインサートする、という実装に遭遇した。アップデートもまとめて出来んのかな？と思ったから調べてみた。

##bulk insert, bulk update
単一SQL　で　複数件同時　に保存、更新する方法。

### メリット
複数SQL　で　複数件　実行するより
単一SQL　で　複数件　実行することで
一般的に大量件数のInsert/Update処理を高速化できる。

[PL/SQL によるバルクインサート処理](https://www.shift-the-oracle.com/plsql/bulk-insert.html)
> バルクインサート処理 (BULK INSERT:FORALL 構文) は 1 回のコンテキストスイッチで大量のレコードを処理（バルク処理）することができる。 このコンテキストスイッチ（PL/SQL エンジンと SQL エンジンの間で発生する処理のやり取り） の回数を減らすことによって大量データの処理時のレスポンスを向上することが可能になる。

### デメリット
調査中
[MySQLでINSERTのデッドロックに嵌る人を1人でも減らすために](https://ichirin2501.hatenablog.com/entry/2015/12/24/164916)


##検証環境

###Rubyバージョン
```
$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin17]
```

###Railsバージョン
```
$ bundle exec rails -v
Rails 5.0.0.1
```

###Gem
[`activerecord-import`](https://github.com/zdennis/activerecord-import)

```Gemfile.rb
# ActiveRecord import
gem 'activerecord-import', '0.20.2'
```
###TableColumn
table|
:-:|
id|
user_id|
flag_1|
flag_2|
...|
created_at|
updated_at|

```models/class_name.rb
  validates :user_id, uniqueness: true
```

###状況
- formから複数のuser_id(usersテーブルのid)を送信
  - Parameters: `{ user_ids: '*, **, ***, ...' }`
- 既存レコードはupdate

## バルクインサート＆バルクアップデート ロジック
```logic.
        instance_object_array = []
        params[:user_ids].split(',').each do |user_id|
          object = ClassName.find_or_initialize_by(user_id: user_id)
          object.attributes = { flag_1: true, flag_2: false }
          instance_object_array << object
        end
        ClassName.import instance_object_array, on_duplicate_key_update: [:flag_1, :flag_2]
```


## [Duplicate Key Update](https://github.com/zdennis/activerecord-import#duplicate-key-update)
> MySQL, PostgreSQL (9.5+), and SQLite (3.24.0+) support on duplicate key update (also known as "upsert") which allows you to specify fields whose values should be updated if a primary or unique key constraint is violated.


## 参考資料
- [activerecord-import](https://github.com/zdennis/activerecord-import)
- [rubydoc.info/gems/activerecord-import/ActiveRecord/Base](https://rubydoc.info/gems/activerecord-import/ActiveRecord/Base)
Vimの便利コマンド

Vim 便利なコマンド
空行の削除
`:v/./d`

指定したテキストだけ置換処理をする。
`:s/\%V置換前/置換後/g`

, を改行へ置換
`:%s/,/\r/g`

行No + G で行No へ飛ぶ

単語の上で * で単語検索が可能

検索文字を含む行抽出
`:v/検索文字/d`

検索文字を含む行削除
`:g/検索文字/d`

反転解除
`:noh`

改行を削除する。
`:%s/\n//g`
Power BIのビューアーロールのワークスペース内での表示について

#はじめに
ワークスペースのロールが整理されていたので、閲覧者（Power BIのワークスペースではビューアーロールとと呼びます。以下、ビューアー）についてどのような状態か確認します。
（2020年1月時点）


以下のうち「項目を表示して操作する」とはどのような状態か確認します。
下記は引用
[新しいワークスペースのロール](https://docs.microsoft.com/ja-jp/power-bi/service-new-workspaces#roles-in-the-new-workspaces)

>| 機能                                                         | 管理者 | メンバー | 共同作成者 | Viewer |
| :----------------------------------------------------------- | :----- | :------- | :--------- | :----- |
| ワークスペースの更新と削除。                                 | X      |          |            |        |
| 他の管理者を含む、ユーザーの追加と削除。                     | X      |          |            |        |
| メンバーやその他の下位のアクセス許可を持つユーザーの追加。   | X      | X        |            |        |
| アプリの発行と更新。                                         | X      | X        |            |        |
| アイテムの共有やアプリの共有。                               | X      | X        |            |        |
| 他のユーザーに対するアイテムの再共有の許可。                 | X      | X        |            |        |
| ワークスペースでのコンテンツの作成、編集、削除。             | X      | X        | X          |        |
| ワークスペースへのレポートの公開と、コンテンツの削除。       | X      | X        | X          |        |
| このワークスペース内のデータセットに基づいた、別のワークスペースでのレポートの作成。1 | X      | X        | X          |        |
| レポートのコピー。1                                          | X      | X        | X          |        |
| 項目を表示して操作する。2                                    | X      | X        | X          | X      |
> 1. レポートをコピーする場合、およびこのワークスペース内のデータセットに基づいて別のワークスペースでレポートを作成する場合、お客様は次の追加条件を満たす必要があります。
    - Power BI Pro ライセンスが必要です。 詳細については、次のセクションの「ライセンス」を参照してください。
    - データセットのビルド アクセス許可が必要です。 このワークスペース内のデータセットについては、管理者、メンバー、共同作成者のロールを持つユーザーに対して、そのワークスペース ロールを通じてビルドのアクセス許可が付与されます。
2. Power BI Pro ライセンスを持っていない場合でも、項目が Premium 容量内のワークスペースにあれば、Power BI サービスで項目を表示および操作することができます。



#構成
DataSet共有用というワークスペースを作成し、下記のように権限を設定しました。
pbiviewerというユーザがビューアーロールになっています。
このユーザはコンテンツの編集はできず、閲覧しかできない状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/37f45ef8-8656-7be8-59e8-52d2985ef861.png)

#確認
##ワークスペースの状態
pbiviewerがワークスペースに接続すると以下のようになります。データセットのタブ自体がなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ea475c8c-3f1a-9b0d-5060-c5af3ecfe776.png)

##レポート
UPされているレポートは編集がグレーアウトします。グラフのクリックとフィルタの変更だけできますね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ece28dc3-2b74-a402-b499-268cfd874c99.png)

##Power BI Desktop
データ取得からも選択できませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c6dcaeb1-213a-af3b-c828-c9216d1045b7.png)

#補足
##今回検証したシナリオ
あるユーザにデータセットを置いたワークスペースに対してビューワー権限を付与、レポートを置いた別のワークスペースに対しては管理者権限を付与するというようなシナリオを検証することが今回の確認のきっかけでした。（結論としては不可でした。）
同様の構成を検討した方の参考になればと思います。

構成イメージ（pbiviewerというユーザを利用する想定）
Aワークスペース

 - pbiviewer→ビューアーロール
 - データセットを配置


Bワークスペース

 - pbiviewer→共同作成者以上のロール
 - Aワークスペースのデータセットを利用してレポート作成


以上。
結局LinuxからWindowsに戻した話

[前回](https://qiita.com/Requin/items/dba63091076cdd456f88)の記事からの続きです。
またここでのXubuntuのバージョンはXubuntu 18.04 LTSのことを指します。

## LinuxからまたWindowsへ

前回でメモリ4GBだからWindows 10は厳しいと書いたものの、やはりWindowsとしてのタブレットのほうがいろいろと都合がよかったことに気づきました。その理由をいくつか挙げていこうと思います。

## 画面が回転したときの挙動

前回、問題点として挙げたときと同じようにXubuntuだと画面を回転させたときの挙動はユーザーが解決する必要があります。時間をかければこの問題も解決できるとは思いますが、私としては時間が無いけどPCとして使いたかったということもあり、結局セットアップまでに手間のかからないWindowsに戻ってしまいました。~~動作面で不満なところはあるけれども、やはり自動的にセットアップしてくれるWindows 10の利点には勝てませんでした~~

## バッテリー持ち

バッテリーに関しては、XubuntuはWindowsを入れたときと比べると結構悪くなったと思います(ただ、XubuntuもLinux Mint 19.1 MATEを入れていたときより体感で2倍ぐらいは長持ちしています)。これも設定をちゃんとしてあげれば、長時間使うことができるとは思いますが、スリープにしたときにWindowsは体感10時間は持つのに対して、Xubuntuは4時間程度しか持ちませんでした。私はよく大学でタブレットを使うのですが、電源を切り忘れてスリープで放置しやすいことを考えると、これはかなりのデメリットでした。~~単純に管理がガバガバであるともいう~~

## タッチパネルの挙動

意外とWindows 10はタッチパネルの挙動が結構優秀~~(のように感じるだけ)~~で、キーボードドックを外してもちゃんとタブレットとして使えるのはかなり優勝だと思いました。Xubuntuだとページをスクロールしようと思ってスワイプをすると、文字が選択されてしまうのはやはりタブレットとして致命的だと感じました。

## 結局のところ

私が諸事情でまとまった時間が取れなかったため、Linuxタブレットとしてセットアップするのがめんどくさくなったのが一番の原因です。確かに資源の使い方はLinuxのほうが良い(ただしデスクトップ環境はCPUに依存する)のですが、Windowsは~~設定できる項目が少ないから~~インストールさえしてしまえば、コンピューターとして使えるのは強みだとは思います。~~でも勝手にいろいろしてくるのはお節介が過ぎるとは思う~~

## まとめ

Linuxはバッテリーやタッチパネルあたりの挙動の問題を解決できないと、正直メリットを享受することは無いと今回の件で思い知らされた気がします。しかしLinux自体は悪くはないです。設定さえできれば快適になると思うので…
~~あとWindowsはもうちょっとタブレットに最適化して~~
[メモ]1文字ずつスライドして現れるCSSアニメーション

# 概要

CSSアニメーションでこんな動きを実現したい。

![movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266939/8800bd0f-06de-b01b-6e8a-dfef87f509d8.gif)

# 実装

1文字ごとにアニメーションさせるため1文字ごとに要素を区切る。
空白から文字をスライドさせるためspanを2重にしている(後述)。

```html
<p class="animation">
  <span><span>A</span></span>
  <span><span>N</span></span>
  <span><span>I</span></span>
  <span><span>M</span></span>
  <span><span>A</span></span>
  <span><span>T</span></span>
  <span><span>I</span></span>
  <span><span>O</span></span>
  <span><span>N</span></span>
</p>
<button @click="handleClick">toggle</button>
```

javascript部分はボタンがクリックされたら `<p class="animation">` に`active`クラスを付けたり除いたりする。

```javascript
const element = document.querySelector(".animation");
if (element.classList.contains('active')) {
  element.classList.remove('active')
} else {
  element.classList.add('active')
}
```


CSSはアニメーション前後の状態を規定する。
active classがついていないときは文字を横にずらしておき、active classが付いたときに元の位置に戻す。
外側のspanに `overflow: hidden` をつけることでスライドした文字を隠す。

```css
.animation span {
  overflow: hidden;
  display: inline-block;
}

.animation span span {
  transform: translateX(50px);
  transition: .5s;
}

.animation.active span span {
  transform: translateX(0);
}
```

外側のspanが無いとこうなる
![movie2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266939/541b3fad-fb3e-802b-4686-fb5124d5ecab.gif)

# component化

こんな感じでcomponentにしておくと使いやすい

```vue
<template>
  <p class="slide-in" :class="{active: active}" :style="myStyle">
    <span v-for="(t, index) in text" :key="index">
      <span>{{ t }}</span>
    </span>
  </p>
</template>

<script lang="ts">
import {Vue, Component, Prop} from 'vue-property-decorator'

@Component
export default class SlideIn extends Vue {
  @Prop({default: ''})
  text!: string

  @Prop()
  myStyle!: {}

  @Prop({default: false})
  active!: boolean
}
</script>

<style>
.slide-in span {
  display: inline-block;
  overflow: hidden;
}

.slide-in span span {
  transform: translateX(50px);
  transition: 0.5s;
}

.slide-in.active span span {
  transform: translateX(0);
}
</style>

```

# 参考

https://www.mikapikazo.com/
簡単に投票を共有できるツールをOSSで公開したよ

# 何に使うためにつくったの？
チームのメンバーでブログのテーマを決めるため（結局間に合わなかったけど）

# URLは？
https://syukei-san.xyz/

# 使い方は？
1. 投票したい/多数決を取りたいデータを１行ごとに入力
1. 利用規約を読んで同意する
1. 出来上がったフォームをメンバーにシェアする
1. メンバーがフォームで投票する（一人が複数投票することはできません！）

# どの言語で作ったの？
nodejs

# github URLは？
https://github.com/newsdict/syukei-san.xyz/

# なんでテスト書いてないの？
急いで作ったのでテスト書いてないです。。。
もっと使う用途が出てきたら書いていこうと思います。

仕様を考えながら作る場合、テストコードどうしてるんだろう？

# いつ公開しはじめたの？
[7 Jul 2019](https://github.com/newsdict/syukei-san.xyz/commit/b4c76660a74046d9756fcbf1ca126078074224eb)
Windowsイベントをログに記録する方法について

コマンドプロンプトとPowerShellにてイベントログの記録方法についての纏め。

■コマンドプロンプト
　EVENTCREATE /ID 999 /L system /SO sys_test /T INFORMATION /D "イベントログ内容"

各パラメーター
　・/ID		イベントIDを指定 (1～1000しか指定できない)
　・/L		イベントログの作成先を指定します(system, application)
　・/SO		ソースを指定
　・/T		出力するログレベルを指定します(ERROR, WARNING, INFORMATION)
　・/D		出力するメッセージを指定
　・/S		接続先のリモートシステムを指定する
　・/U		実行するユーザ権限をを指定する
　・/P		指定した実行ユーザのパスワードを指定する

コマンドプロンプト(eventcreate)では1000以上のIDで作成することができない。

■PowerShell
　Write-EventLog -LogName System -Source sys_test -EventID 999 -Message "イベントログ内容"

各パラメーター
　・-LogName	記録するイベントの種類を指定する
　・-Source	記録するイベントのソースを指定する
　・-EventId	イベントIDを指定
　・-Message	記録するイベントの説明文を指定する
　・-EntryType	記録するイベントのレベルを指定する。省略可能
　・-Category	記録するイベントの「タスクのカテゴリー」を指定する。省略可能
　・-ComputerName	イベントを記録するコンピュータ名を指定する。省略可能


Powershell(Write-EventLog)では
　・ID1000以上で作成可能
　・ソースがログに一度記録されていないものはダメ。

■New-EventLog
 New-EventLog -Logmame System -Source sys_test
　-LogName	記録するイベントの種類を指定する
　-Source	記録するイベントのソースを指定する

　New-EventLogではイベントソースを作成することができる。
　1000以上のIDかつ新しいソースでイベントログを作成したい場合は、
　New-EventLogでソースを作成し、Write-EventLogにて実行すればよい。


普段使うことがあまり無いが(^◇^;)
Rails6 のちょい足しな新機能を試す118（PostgreSQL money編)

# はじめに

Rails 6 に追加された新機能を試す第118段。 今回は、`PostgreSQL money` 編です。
Rails 6 では、 PostgreSQL のデータベースで、 `money` 型のカラムのデータの金額キャラクタのシンボルを省略することができるようになりました。

Ruby 2.6.5, Rails 6.0.2.1, Rails 5.2.4.1 PostgreSQL 12.0 で確認しました。 (Rails 6.0.0 でこの修正が入っています。)

```shell
$ rails --version
Rails 6.0.2.1
```

今回は、実際に `money` 属性を持つモデルを作成し、モデルにデータを登録し、登録したデータを検索するスクリプトを作成して動作確認します。

# Rails プロジェクトを作る

Rails プロジェクトを新たに作成します。

```shell
$ rails new rails_sandbox
$ cd rails_sandbox
```

# Book モデルを作成する

`money` 型のカラム `price` を持つ Book モデルを作成します。

```shell
$ bin/rails g model Book title price:money
```

# DB マイグレーションを実行する

```shell
$ bin/rails db:create db:migrate
```

# スクリプトを作成する

一旦、Book のデータを削除したあと、2件のデータを登録して、検索して、 `title` と `price` のカラムを出力します。

データを削除しなくても良いのですが、結果が変わらないようにするためにデータを削除するようにしました。
2件のデータの `price` は、 `,` の3桁区切りと `.` の3桁区切りの数字の文字列です。

```ruby:scripts/money.rb
Book.delete_all
Book.create(title: 'Agile Web Development with Rails 6', price: '12,345,678.12')
Book.create(title: 'Programming Ruby', price: '12.345.678,12')

puts Book.all.map { |book| "#{book.title} => #{book.price}" }
```

# スクリプトを実行する

```shell
$ bin/rails runner scripts/money.rb
Running via Spring preloader in process 115
Agile Web Development with Rails 6 => 12345678.12
Programming Ruby => 12345678.12
```

# Rails 5 では

Rails 5.2.4 では、実行すると以下の結果となってしまいます。(文字列のうち数値として認識した一部が登録され、それ以降は切り捨てられてしまいます。)

```shell
$ bin/rails runner scripts/money.rb
Running via Spring preloader in process 185
Agile Web Development with Rails 6 => 12.0
Programming Ruby => 12.35
```

文字列のうち数値として認識した一部とは、以下のような変換により数値として認識された部分と思われます。
(12.345 が小数点第3位で四捨五入されて、 12.35 になっていると思われます。） 

```irb
irb(main):001:0> '12,345,678.12'.to_f
=> 12.0
irb(main):002:0> '12.345.678,12'.to_f
=> 12.345
```

# 試したソース

https://github.com/suketa/rails_sandbox/tree/try118_postgresql_money


# 参考情報

* [Make currency symbols optional for money column type in PostgreSQL](https://github.com/rails/rails/pull/36665)
CSSの値【inherit】って知ってる？


## inheritとは

英語で言う**継承**っていう意味です。
つまり親のスタイルを参照するよってこと :bulb:

例えば

```html
<h1 class="main-headline">タイトル</h1>
```

↑にリンクつけたいな〜ってなった時。

```html
<h1 class="main-headline"><a href="/">タイトル</a></h1>
```

こう書くと、文言「タイトル」に適用されるスタイルは
.main-headlineではなく、aタグのスタイルが優先になりますよね
(親のクラス属性よりも自身のセレクタのほうが(クラス指定じゃなくても)実は強いんです :bulb: )

でも、ベースのCSSとかでaタグにデフォルトのスタイルが指定されている時 :scream:
(本当はこの時点でCSSの設計を見直すべきなんですが、そうも行かない時)
.main-headlineのスタイルが「タイトル」に適用されないからって……

## 以下のような実装してませんか？

### 前提条件(こんなCSSの運用例)


```html:index.html
<!-- ※見出しの中にaタグが必ずしも入るとは限らない -->
<h1 class="main-headline"><a class="main-headline__link" href="/">タイトル</a></h1>
```


```CSS:base.css
a {
  font-weight: normal;
  color: #000;
  text-decoration: underline;
}
```
これでは.main-headlineにcolorを指定しても
aタグについているcolorが勝ってしまいます:frowning2:
(リンクの汎用性、柔軟性が落ちているので役割でスタイルつけるの良くないです:no_good_tone1:)



### 自分で新しくつけるCSS(ここからが本題)
 aタグにCSSがついているので上書きするしか無いじゃん！
といって下記のように指定してみます。

```CSS:style.css
.main-headline {
  font-size: 24px;
  font-weight: bold;
  color: deeppink;
}
/* 上記分のCSSで事足りるのが理想 */
.main-headline__link {
  font-size: 24px;
  font-weight: bold;
  color: deeppink;
  text-decoration: none;
}
```

もしくはスッキリさせるのであれば↓こう
(CSSは基本的に**差分のみ**書きましょう〜
無駄なスタイル付けはトラブルの原因になります:skull_crossbones::skull_crossbones::skull_crossbones: )

```CSS:style.css
.main-headline, .main-headline__link {
  font-size: 24px;
  font-weight: bold;
  color: deeppink;
}

.main-headline__link {
  text-decoration: none;
}
```

とはいえ、↑のように書くと2重定義って感じでなんだかなぁと思うときもあったり…
(差分をまとめて書いてはいるけど…)

## そんなときは**inherit**を使ってみてはどうでしょう？

ベースにかけられているCSSを把握している事が前提になります:bulb:

```CSS:style.css
/* 親にだけ指定 */
.main-headline {
  font-size: 24px;
  font-weight: bold;
  color: deeppink;
}
/* 親のスタイルを継承します */
.main-headline__link {
  font: inherit;
  color: inherit;
  text-decoration: inherit;
}
```

こう書くと(ソースの見た目若干キモいけど:flushed:)
ひと目で親継承っていうのが伝わるかなという一例です:bulb:
(2重定義には変わりはないです、笑)

ちなみにinheritを使用する他のメリットとして、
font-sizeなどのPC,スマホで別々の指定をするプロパティでも
inheritを使えば1行で済むのも良いですね:relaxed:

```CSS:style.css
/* 親にだけ指定 */
.main-headline {
  font-size: 24px;
}
/* PCの時 */
@media screen and (min-width: 767px) {
  .main-headline {
    font-size: 36px;
  }
}

.main-headline__link{
  /* 1行でPC, スマホ共に捌ける */
  font-size: inherit;
}
```


とはいえ......
本来であれば、こんなにinherit指定せずとも
親からスタイルが自然に落ちてくる状態がベストなので、

**〜余力がある人はCSS設計を見直しましょう〜**

親のスタイルが子に効かないゾと思った方は、
inheritを使ってみてはいかがでしょうか :heartpulse:
Bashワンライナーメモ

### 特定の範囲の日時に作成されたファイル一覧取得

例)
26日16:00:00から28日16:00:00までに作成されたファイルを取得

```
ls -hl *|awk -F " " '"26 16:00:00" <= $7" "$8 && $7" "$8 <= "28 16:00:00"'

...
....
-rw------- 1 user user 169M  1月 28 10:44 2020 hogehoge1
-rw------- 1 user user 17M   1月 28 10:48 2020 hogehoge2
-rw------- 1 user user 111M  1月 28 10:52 2020 hogehoge3
```
アフターエフェクト初心者がYoutubeをみて動画を作りました。 3秒。

##GTちゃんねるさんのYoutubeのOP（仮）を作らせていただきました。
####これからアフターエフェクトなどを使った動画などを投稿しようと思っています。

[動画はこちら](https://www.youtube.com/watch?v=cyWQmih33zY)
Sassでリストのアイコン画像を一気に指定する方法


今回のテーマは

✨**Sassでリストのアイコンを一気に指定する方法**✨

なんのこっちゃと思われた方はこちらをご覧ください
<img width="813" alt="_2020-01-15_17.34.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498647/36e5fdeb-354a-6719-5f2d-a2d971c70d6f.png">


こちらのピンクの枠で囲ったアイコン。
一個ずつCSSで指定すると似たような処理を複数回書く必要があります......😩
ちょっと面倒くさいですよね〜

そんな時、Sassを使用した便利な実装方法があるので紹介したいと思います！
個々で画像を指定するよりも行数がグッと減るはず 😎

## ソース

HTML

``````html:list.html
<ul>
    <li class="list-item mod-first">アイテム1</li>
    <li class="list-item mod-second">アイテム2</li>
    <li class="list-item mod-third">アイテム3</li>
    <li class="list-item mod-fourth">アイテム4</li>
    <li class="list-item mod-fifth">アイテム5</li>
</ul>
```

- 【.mod-】クラスは[trelloのスタイルガイドにあるmodifier用のクラス命名](https://gist.github.com/bobbygrace/9e961e8982f42eb91b80#modifiers)です。
- 今回はサンプルなので名前を数字みたいなものにしていますが、実際クラス名をつける際は、見て直ぐ意味がわかるものが望ましいです。

Sass

```sass:list.sass
.list-item
    &:before
        // 共通スタイルをここに
        content: ''
        display: block
        width: 50px
        height: 50px
        background: no-repeat center/contain
        
    $items: first, second, third, fourth, fifth
        @each $item in $items
            &.mod-#{$item}:before
                // 個々の画像を指定
                background-image: url(PATH/TO/IMAGE/icon-#{$item}.svg)
```

- ぱっと見Sassのインデントが深いですが、出力されるCSSの詳細度には影響しません😊
- アイコンは基本的には疑似要素に入れるようにしています。(経験則なんですが、下手にクラスに混ぜるとpaddingとかいじらないといけなくて、(2行とかになった時に)崩れやすくなってしまいます)

## 説明

SassがCSSの拡張言語だというのは皆様御存知かと思うのですが、
その中の魅力として、

- 変数
- if文
- each文
- for文
- クラス名の継承

などなどあります。

今回は、上記にあげた中で

- **変数**
- **each文**

を使用しています。

### 変数

これはエンジニアの方ならもう手慣れたものですね😏
以下が変数にあたります。

```sass
$items: first, second, third, fourth, fifth
```

Sassの変数名でよく見かけるのはカラーコードの設定だと思いますが、
今回はループを回すための配列として使用しています。
因みに文字列の中で変数展開をするときは、

```sass

#{$item}
```

こう書きます。

### each文

配列内のすべての要素に対して処理をする為の関数です。
下記のように書きます。

```sass
@each $item in $items
```

参考 : [https://sass-lang.com/documentation/at-rules/control/each](https://sass-lang.com/documentation/at-rules/control/each)

今回はこのeach文を使用して、それぞれのリストに別々の画像を表示させる処理を書いています。

## 注意点

1. 画像ファイル名とクラス名は揃える必要があります。
2. アイコンの画像サイズがバラバラで個々にbackground-sizeを当てないといけないという方は、CSSで解決しようとせずに、すべてのアイコンを同じサイズでトリミング、エクスポートして使いましょう。以下の利点が見込めます✨
   - 端末幅の変更による事故等が起こらない
   - 無駄にマジックナンバーをCSS内に入れずに済む
   - 画像を変える度にCSSのbackground-sizeを測り直す必要がなくなる

以上です！

Have a nice **Sass** life 😘
Emmetで爆速コーディング(HTML編)


皆さんコーディングライフ楽しんでますか？

VSCodeには、標準でEmmetというプラグインがあります✨
(atomやSublime TextはEmmetというパッケージを入れると使用できます)

## Emmetとは

HTMLやCSSを省略記法で簡潔に記述するためのツールです。 
呪文を唱えるとタグが展開されるという代物です🧙
歴長めのエンジニアにはZen-Codingといえば通じるみたいです。
私にとってEmmetは無いと生きていけないくらい便利なヤツです😭
この魅力を知ったらEmmetなしでは生きてはいけないでしょう……

ということで今回は、私がよく使うEmmetの省略記法を紹介したいと思います！

## まず先に

VSCodeの設定で**emmet.triggerExpansionOnTab**にチェックを入れておきましょう。
VSCodeは他にもデフォルトで色々打っているときに候補を出してくるのでそれらと競合を避けるためです。
↑の設定でチェックを入れると、Emmetの発動コマンドがtabキーになります。
ここから先のコマンドでは、全て最後にTabキーを押してEmmetコマンドを発動してください✨

## 基本的には

CSSのセレクタがベースになります。
なので、事前知識としてCSSセレクタは勉強しておきましょう📝

## コマンド一覧

### !

【!】を押すと、
ポーンとHTMLの基本要素で構成されたテンプレートを召喚することができます✨
もう一々過去のHTMLソースからHTMLパクって切り貼りする必要はないのです😌
ただ、デフォルトのlang属性の値がenなので、
VSCodeの方はsettings.jsonに↓を追加しておきましょう。

```json:settings.json
"emmet.variables": {
    "lang": "ja"
 }
```

### タグ名

すべての要素を閉じタグとセットで召喚してくれます。
しかもbrタグは閉じタグ無しで召喚してくれる！便利！
aタグはhrefをデフォルトでつけてくれたりととにかく気が利きます👍🏻
ただ、存在しないタグに対しても同じく召喚するので([カスタムタグ](https://developer.mozilla.org/ja/docs/Web/Web_Components/Using_custom_elements)を考慮してるからかもしれないですが)文中で間違ってTabキー押してしまったときは慌てず【command + z】しましょう〜！

### .クラス名

クラス名付きのdivを召喚してくれます。
他のタグを使いたい方は【タグ名.クラス名】と打ちましょう
IDは#で召喚できます。(CSSと同じ考え方ですね)

### >

親子関係を保持したタグを生成してくれます。

```
ul>li
```

だと

```html:result.html
<ul>
  <li></li>
</ul>
```

こう出力される

### *数字

Emmetでのアスタリスクは四則演算の掛け算を意味します。
CSSだとユニバーサルセレクタという意味になるのでご注意ください。
同じタグを複数召喚したいときに、【タグ名*数字】で数字の数だけタグが召喚されます。

```
ul>li*4
```

だと

```html:result.html
<ul>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
</ul>
```

ちなみに、もっと階層を深くしたり(aタグを入れたり)
文字を入れたりすることもできるのですが、
Emmetでそれやると結構頭使って召喚魔法を唱えないといけなく……
私の脳みそのスペックだとちょっとキャパオーバーだったので 笑
別の方法を紹介しますね😘

こういうヤツ召喚したいとき

```html:result.html
<nav class="main_menu">
  <ul class="menu-top_menu">
    <li class="menu-item">
      <a href="#news">
        <span>News</span>
      </a>
    </li>
    <li class="menu-item">
      <a href="#works">
        <span>Works</span>
      </a>
    </li>
    <li class="menu-item">
      <a href="#contact">
        <span>Contact</span>
      </a>
    </li>
  </ul>
</nav>
```

通常Emmetで骨組みを出すとなると

```
nav.main_menu>ul.menu-top_menu>li.menu-item*3>a[href=#]>span{text}
```

と打ってから一個ずつ名前とID名を入れていくのですが……

私はまず

```
ul>li*3>a
```

と打ってから、

1. 1つ目のliタグのみ作り込む
2. 作り込んだliタグをコピー
3. ２つ目のliタグを選択
4. command + d で他のliタグも選択
5. command + p で整形したliタグに全部置き換え
6. navタグとか必要であれば追加する

で、構造を作ったりしています。

お好みでどうぞ😊

### +

CSSでいう隣接セレクタですね。 
お隣さん同士のタグを召喚するときに使います！
tableタグとか定義リスト(dl>dt+dd)に使ったりします。

```
table>tr*3>th+td
```

と打つと

```html:result.html
<table>
  <tr>
    <th></th>
    <td></td>
  </tr>
  <tr>
    <th></th>
    <td></td>
  </tr>
  <tr>
    <th></th>
    <td></td>
  </tr>
</table>

```

いい感じのテーブルをサクッと作れるので便利ですよ💕

## ここまで使いこなせたら

あなたも爆速コーディング(HTML編)をマスターしたと言っても過言ではないでしょう😘

最初は全部打ったほうが速いと思うかもしれませんが、地道に呪文を唱え続けることによって
体が無意識に呪文を唱えてくれるようになるので是非覚えてみてください🔮

## おまけ

コードの召喚に失敗したときに役に立つVSCodeのパッケージに
**Auto Rename Tag**
というものがあります。
開始タグを修正すると自動的に終了タグも直してくれる優れものなので
是非こちらもご活用ください🌟
HTMLタグの使い方(応用編)


こちらはHTMLタグの応用編の紹介です！
基礎を見たい方は↓を先にどうぞ 👍🏻
[HTMLタグの使い方(基礎編)](https://qiita.com/saeka/private/225b5e19385172b0f0e8)


思ったより多かった 😇

### main, aside

- コンテンツのメイン要素と副次的要素を表すタグ
- ブログのデザインを想像するとわかりやすいかも
- 2カラムデザインの大きいとこ占めてるのがmainで小さいほうがasideみたいな
- とはいえaside使う機会はウェブアプリ開発ではめったに無いかも？
- でも意味合い的にasideアリきのmainだと個人的には思ったり……🤔
- 最近の平井はheader -> main -> footer みたいな組み方してます😎

### section

- 汎用の長divよりも、コンテンツのまとまりという意味を持たせたタグ
- 正しい使い方っていう明確な指針がなく……(ないんかい！)
- どこで使うかは結構人によりけりです
- div使うよりはセマンティックなHTMLが書ける……そんな感じです
- それでも何かしらの使用基準が欲しい！と思った方は[こちら](https://developer.mozilla.org/ja/docs/Web/Guide/HTML/Using_HTML_sections_and_outlines)をどうぞ

### nav

- **NAVigation**(ナビゲーション)用のタグです！
- headerやfooterのグローバルナビゲーションとかに使います
- メニューのコーディングでul > liしか使わない方
- 他のリストと差別化を図るためにも是非ulをnavで囲ってください
- nav見るだけで「ぁ、ナビゲーションね」って(私が)なるので
- 何卒何卒お願いします🙏🏻

### dl > dt, dd

- 元**DefinitionList**(定義リスト) で、今は**DescriptionList**(説明リスト)と呼ばれています
- 以前より若干汎用性が高まったと思ってもらえればOKです
- dtは**DescriptionTerm**, ddは**Description Detail**です
- 使い方は表(table)とリスト(ul > li)を足して2で割ったような感じ
- もっとざっくり言うと、リストに項目名と説明をつけれる便利なタグです！
- 表でもリストでも無いときは、dlの出番かもしれません
- 今までは、dlの直下はdtかddしか許容されていなかったのですが
- 最近はdlの直下にdivを置くことが可能になったので
- だいぶ扱いやすくなったというのが個人の感想です😘

### figure > figcaption

- 図を表すタグです
- figcaptionは図や画像に名前をつけたい時に便利です
- ユースケースがブログとかに限られてしまうのが個人的にもったいないので
- アプリとかでも使い道ないかと今絶賛模索中です

### pre

- バックエンド開発者は皆好きじゃないですかね:two_hearts:
- **PREformatted text**(整形済みテキスト)です
- デバッグでHTML上にjsonデータを吐き出したい時に囲むと
- いい感じに整形して表示してくれますよ 😆
- PHPとかでdataをechoする際はぜひdataをpreで囲ってみてください〜！

### small

- **小さい文字を表現するタグではなく**
- 注釈付きテキストや著作権表示や法的表記を表示させる時に囲います
- 1番身近なものだとfooterのコピーライトでしょうか
- 意味的にでなく見た目的に文字を小さくしたい場合はCSSを使いましょう

### strong

- 重要な内容を表すタグです
- ブラウザのデフォルトCSSで文字が太くなりますが
- 文中で重要性の高い文字に使うのがユースケースになります
- 似たタグでem(emphasis, 強調)というのもあるのですが
- これは文中で単語を強調させることによって**文中の意味を意図的に変えたい**時に使用するので
- 使い分けは難しいですが、emを使用することは稀かなと……
- strong, b, em の使い分けに関しては[こちら](https://developer.mozilla.org/ja/docs/Web/HTML/Element/strong)をどうぞ

### time

- 日付を表すタグです(timeなんだけどね w)
- 個人的には更新履歴とか通知画面とか、日付を扱う場所全般に使ってます
- datetimeという特殊なデータ属性があるので、こちらもつけてあげましょう
- 付けるときのフォーマットは決まっているのでお決まりの[MDNさん](https://developer.mozilla.org/ja/docs/Web/HTML/Element/time)を参考にどうぞ

### picture > source

- PC版とスマホ版で異なる比率の画像を切替える人は必須ですよ〜！
- 高解像度用の画像をいい感じに切り替えてくれる便利なタグと勘違いされる方が多いのですが
- 厳密なユースケースは少し違います
- PCとスマホで比率の全く違う画像を切り替える場合はpicture > sourceなのですが
- PCとスマホで同じ比率の画像(解像度のみ変更)を使用する際はimgタグのsrcset属性を使用するだけで事足ります
- 詳しくは↓のサイトが超絶わかりやすいのでみてほしいのです💡

https://parashuto.com/rriver/responsive-web/picture-srcset-use-case

### label

- form内でinputと使うタグです
- inputとは卍我等友情永久不滅卍
- inputと紐付けすることで、クリック範囲を伸ばすこともできるので
- ユーザビリティを考慮するなら使い方をマスターしましょう😘
- 具体的な使い方は2つあって
  1. input全体をlabelタグで包み込む(クリック範囲を広げる手法)
  2. input にidを指定し、同じ文字をlabelのfor属性に入れる(inputとlabelの物理的距離が離れていても心はつながる手法💓 )
- どちらもフォームの使い勝手に大いに影響するので
- 是非覚えておいておきましょ〜！
- 詳しい使い方はまた記事にするかもしれません(いつか……)

〜完〜

以上がHTMLで頭の引き出しにしまっておくと良いタグたちでした！

HTMLのタグは、今現在も増え続けております。 HTML5自体も、今はバージョンにとらわれずliving standard(今が最新、これからも最新)
にもなったりしていて、これまでは痒いところに手が届かなかったような要素も、
近い将来にはタグとして使えるようになっているかもしれません。
そう考えると、少しだけ将来が楽しみになっちゃいますよね 😆✨

今まで通過点としてあったHTMLを振り返るきっかけの一つとなれば幸いです😊
派遣または請負で仕事をする時に注意するとよいかもしれないこと

これまで、パッケージソフトウェア、オープンソース、組織内プログラミング、プログラマ用ツールなどを設計していて、派遣、請負で仕事をしたことは１割未満です。

請負に近い場合でも、発注側から人に来ていただいて、一緒に作ったり、作り方を説明して発注側に作っていただいたりしました。試験機関に勤務しています。試験の請負はしたことがありますが、その場合でも、同じ内容で再試験は、できるだけ自動化して発注側でできるようにしたり、試験の仕方を説明して自前で試験できるようにしていただいていました。

また、派遣の会社から、当方に派遣していただいて、技術者の教育、訓練をさせていただいたことは何度もあります。

そんな中、派遣または請負の仕事に転職しようと思っています。知り合いの派遣または請負で仕事をしてきたぎ方々に、いろいろ教えていただいたので記録させてください。

#派遣

転職の場合もそうかもしれませんが、派遣で行った先で、知ったかぶりをするのは禁物のようです。

何か聞かれても、知らない、分からないといって、教えてもらうと、自分が勘違いしていたかどうかがわかるかもしれません。

IT業界内部ですら、一つの略号がどんな意味を持つかは、相手の状況によってchが鵜文脈依存なことがあります。



派遣先の社長さん、管理職の方には、知ったかぶりのふりが必要な場面があるかもしれません。そうでないと、切られてしまうか、交代させられてしまうからかもしれません。


自分に都合の悪いことは、聞こえなかったふりをすることも必要かもしれません。

聞こえたことすべてに反応していては、仕事が先に進まないかもしれないからです。
本当に必要なことはgithubのwikiかにいつか書きたい。


#　請負

見積もりが大事。

# 文書履歴(document history)
ver. 0.01 初稿 20200128
ver. 0.04 URL追記　20230302

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
GitHub ActionsでCI導入(Rails+RSpec+MySQL)

# はじめに
GitHub Actionsを利用して、プルリクエスト作成時にRSpecが自動で走る設定を簡潔に紹介していこうと思います。

- [GitHub Actionsとは](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/about-github-actions)

# 環境
- Ruby 2.6.5
- Rails 5.2.4
- RSpec 3.9

# CI(継続的インテグレーションとは)
継続的インテグレーションとは、ソフトウェア開発においてコードを頻繁に共有リポジトリにコミットし、共有しているリポジトリにマージされることでビルドとテストを自動的に実行する手法のことを指します。ソフトウェアのバグを早期に発見し、チーム開発のスピードをあげることが目的です。

# GitHub Actionsの利点
- 導入が容易(workflow用のymlファイルを作成するだけ)
- 日本語の公式ドキュメントあり
- 無料で利用できる(使用制限あり)
- Actionsがfailした時のエラーメッセージが親切(主観です)

# ToDo
- GitHubを開いて導入したいリポジトリのActionsタブをクリック
- Rubyと書かれた方のワークフローの設定をクリック
![githubactions1](https://user-images.githubusercontent.com/57218211/73229010-a455d600-41bb-11ea-96aa-90589a95bef6.png)
- workflow用のymlファイルを作成&コミット
- test環境でMySQLを使う為のdatabase.yml.ciを作成
- 実際にプルリクエストを作成してみて、自動テストが成功するか確認

# database.yml.ci
```yml:database.yml.ci
test:
  adapter: mysql2
  charset: utf8mb4
  collation: utf8mb4_bin
  encoding: utf8mb4
  database: otenki_test 
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: root

```
# ruby.yml
```yml:ruby.yml
name: Build

#プルリクエスト作成時に実行(他にもpush時など設定できます)
on: [pull_request]

jobs:
  setup_and_test_execution:
#ubuntu環境で動かします
    runs-on: ubuntu-latest

#GitHub Actionsでサポートしているrubyのversionは2.6系以降です
    steps:
    - uses: actions/checkout@v1
    - name: Setup Ruby version
      uses: actions/setup-ruby@master
      with:
        ruby-version: 2.6.x

#MySQLをインストール
    - name: Install dependent libralies
      run: sudo apt-get install libmysqlclient-dev
      
    - name: Setup bundler
      run: gem install bundler

    - name: bundle install
      run: |
        bundle install --jobs 4 --retry 3
        
#test用に用意したdatabase.yml.ciをコピー、テスト環境用のDBを作成
    - name: Setup Database
      run: |
        cp config/database.yml.ci config/database.yml
        bundle exec rake db:create
        bundle exec rake db:schema:load
      env:
        RAILS_ENV: test

    - name: Run RSpec
      run: bundle exec rspec
      env:
        RAILS_ENV: test
```
# プルリクエスト作成時
下記の様に全てチェックが入るとテスト成功です！(bundle installに4~5分かかります)
![githubactions2](https://user-images.githubusercontent.com/57218211/73230017-301d3180-41bf-11ea-99e9-228d92b1e6ac.png)
#終わりに
GitHub Actionsは2019年の11月に正式版がリリースされました。他にもたくさん便利な機能があるので、是非触ってみてください。間違いなどございましたら、遠慮なくご指摘いただけますとありがたいです。
# 参考リンク
- [Github actionsでRuby on railsプロジェクトのRspec / System test CIを動くようにしてみた](https://simple-minds-think-alike.hatenablog.com/entry/github-actions-rails-ci)
ubuntuのiptables操作

## はじめに
* 自社の環境は大多数が`CentOS`で`ubuntu`は10%にも満たない。
* そのubuntuのネットワーク設定変更依頼（特にiptables関連）はそれなりにあるが、CentOSとは異なり、忘れがちなのでノウハウとして残しておく。

## 概要
* ubuntuのiptablesに関するノウハウ。

## 詳細
### 全般
* ubuntuのバージョン確認

```
# cat /etc/os-release

※本資料は以下のバージョンで試しています
VERSION="16.04.3 LTS (Xenial Xerus)"
```

* iptablesの場所

```
/etc/iptables/rules.v4
```

### iptables更新の流れ
* iptablesの保存
    * メモリにのみ展開されている設定があるかもしれないので、作業前に必ず行う

```
# iptables-save > /etc/iptables/rules.v4
```

* iptablesの反映
    * **リダイレクトの向きを間違うと、全ての設定が消えるので要注意**

```
# iptables-restore < /etc/iptables/rules.v4
```

* iptablesの設定内容確認

```
# iptables -L
# iptables -L -n > /tmp/iptables　とすると、ファイル出力が可能
```
fish shell で less に vim のシンタックスハイライトを使う

ファイルの中身を確認するときに less コマンドをよく使うのですが、シンタックスハイライトがなくて見づらいな〜と思っていました。

方法ないかなと思って調べたら vim が less.sh というマクロファイルを用意してくれており vim のシンタックスハイライトと合わせられるようです。

# マクロファイルのパスを調べる

```bash
find /usr -name "less.sh"
```

# fish shell の設定ファイルにエイリアスを設定する

```bash:~/.config/fish/config.fish
# 末尾に追記
alias less='/usr/share/vim/vim80/macros/less.sh'
```

これで fish shell で less を利用した際にシンタックスハイライトされるようになりました。
見やすい。

# 参考リンク

- [lessでシンタックスハイライトしたいときのvimマクロ \| バシャログ。](http://bashalog.c-brains.jp/07/12/07-033558.php)
- [fishでaliasを設定する \- Qiita](https://qiita.com/hondy12345/items/cf98d95be885622446f1)
Slackのfiles.upload APIを使ってファイルを簡単に連携する

AWS等のクラウドサービスでサーバ内で作業をしていて、ファイルをローカルに落としたい、なんてことありませんか？
セキュアなファイルを取り扱うなら考えることは多くなるかと思いますが、雑に扱っていいものは手軽に操作したいですよね。

ということで、slackを使って簡単にファイルを連携する方法を自分のために書き残します。

# 準備するもの

- Slackのワークスペースおよび投稿先のチャンネル
- 適当なサーバ(curlコマンドが使えるもの)
- 「楽をしたいんだ」という強い気持ち

# Slackのアプリ作成

先ずは、Slackでアプリを作成します。

つぎ、 https://api.slack.com/ にアクセスします。
![2020-01-27_111413.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158995/454d3a7c-ab8f-fde5-da6d-f8a54581cbe7.png)
「Start Building」を押下します。

![2020-01-27_111924.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158995/c15d35fa-5ee5-e84d-cf68-ba50323d92a6.png)
「Create a Slack App」のダイアログが出るので、アプリ名とワークスペースを指定します。
設定出来たら「Create App」を押下します。

![2020-01-27_112029.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158995/a257aba8-2531-37e5-a5aa-8da1b79be4e3.png)
アプリが出来上がったら、「Permissions」を押下します。

「OAuth & Permissions」の画面に遷移するので、下の方にある「Scopes」に移動します。
![2020-01-27_112148.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158995/2a2f3878-70d2-4154-a929-965f6752dda0.png)
「Add an OAuth Scope」を押下し「files:write」を選択します。

![2020-01-27_112253.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158995/a3e93e85-beaf-1db4-50f4-2c3a691b0494.png)
Scopeの追加が出来たら上のほうに移動し、「Install App to Workspace」を押下します。

![2020-01-27_112325.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158995/c924d38f-a245-4fcd-4dd2-864d6ee96112.png)
確認を求められるので内容を確認して許可してください。

許可が完了したら「OAuth & Permissions」の画面に戻ってきます。
![2020-01-27_112424.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158995/c79a9484-206e-e4c0-e7d3-f244b2ca5902.png)
「Bot User OAuth Access Token」が表示されていると思うので、これを控えておきます。

Slack API側の設定はこれで終わりです。

# Slackにファイルアップロードしてみる

APIの使い方は以下のURLを参考にしてください。
https://api.slack.com/methods/files.upload

```
curl -F file=@dramacat.gif -F "initial_comment=Shakes the cat" -F channels=C024BE91L,D032AC32T -H "Authorization: Bearer xoxa-xxxxxxxxx-xxxx" https://slack.com/api/files.upload
```
公式のサンプルはこのように書かれています。

こちら、必要な情報は最低限は以下の3つです。

- file ： アップロードするファイル
- channels ： アップロード先のチャンネル(チャンネル名でもIDでもいい)
- Authorization ： 先ほど取得したトークン(xoxb-… のアレ)

この3つです。

```
curl -F file=@./現場猫.jpg -F channels=#ファイル置き場 -H "Authorization: Bearer xoxb-xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx" https://slack.com/api/files.upload
```
このようにcurlのパラメータを指定してみました。
結果は以下の通り。

![2020-01-27_113442.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158995/cbd476d5-20f5-8fe4-c096-981b2573eb65.png)
アップロードできました。

これで、共有したいファイルはコマンド叩けばいつでも共有できますね。

私からは、以上です。
今更 windows7でDockerでCドライブ以外にvirtualbox作ってフォルダもCドライブ以外を共有したい

#はじめに
うちのPC、Cドライブのリソースがほぼないので、インストール系やファイルはすべて他のドライブ（Zドライブ）に突っ込んでいます
Dockerつくるときに、Cドライブがデフォルトになっていて困ったのでメモ書き

#CドライブではないZドライブに入れる
（Zは適宜、自分の環境に読み替えてね）

##VirtualBoxのデータを保存するフォルダ指定・・・①
```
setx MACHINE_STORAGE_PATH "Z:\VirtualBox VMs"
```
環境変数を設定しておくことで自分の好きな場所にVirtualBoxのデータを生成できる。

##Zドライブに共有用フォルダを作成
```
> cd /d z:\
> mkdir Users
```
※自分は、ほぼCドライブのUsersフォルダをZドライブに指定しているのですでに作成済み。

##マシン作るときに共有フォルダを予めZドライブに指定してvirtualbox作成
マシン名：default

```
> docker-machine create default --driver=virtualbox ^
--virtualbox-share-folder "z:\Users:/z/Users" ^
--virtualbox-hostonly-cidr "192.168.99.1/24"
```

###初回実行時に①のフォルダ内に以下のフォルダが作られる

- cache　（ディスクキャッシュ）
- certs　（鍵）
- machines　（ディスク）

###共有フォルダの設定が書かれているか確認
秀丸とかvs codeとか適当なエディタで以下を開く
`Z:\VirtualBox VMs\machines\default\config.json`

下のほうにある共有フォルダのパスが正しいか確認

```json:config.json
    "ShareFolder": "z:\\Users:/z/Users"
```
###実際にDockerマシンから共有ファイルが見えているか確認
（Z:\Users　フォルダ内に何もファイルがなければ何か適当にファイル作ってtest.txtとか）

SSH接続

```
> docker-machine ssh default
> ls -la /z/Users/
```
ホスト側のファイルが見えていればOK

##Docker起動時にマウント
カレントフォルダ Z:\Users

Z:\Users\docker-compose.yml
Z:\Users\init.d
Z:\Users\init.d\xxx.sql (※たくさんSQLファイルある）

みたいな構成

```yml:docker-compose.yml
volumes:
    - ./init.d:/docker-entrypoint-initdb.d
```
※MYSQLのdocker-compose.ymlのサンプルは調べればたくさん出るので割愛
※MYSQLで初回起動時にSQLを走らせたいときにマウントしていれば
　フォルダ内にある.sqlファイルをアルファベット順に自動実行してくれるので便利！

初回起動
```docker-compose up```
※通常利用時は -d でバックグラウンド起動するけど
　初回は -d 付けないでログとか、コマンドの確認をちゃんとした方がいいと思う

###ちなみに、、、
最終、Docker周りの環境変数はこんな感じになってた

```
DOCKER_CERT_PATH=Z:\VirtualBox VMs\machines\default
DOCKER_HOST=tcp://192.168.99.100:2376
DOCKER_MACHINE_NAME=default
DOCKER_TLS_VERIFY=1
DOCKER_TOOLBOX_INSTALL_PATH=Z:\Application\Docker Toolbox
NO_PROXY=192.168.99.100
Path=（略）Z:\Application\Docker Toolbox
VBOX_MSI_INSTALL_PATH=Z:\Application\VirtualBox\
```
[Angular] setValue()とかにあるonlySelfオプションを確認する

FormControlなどにある`setValue()`とか`patchValue()`とか`reset()`にはoptionには`onlySelf`を指定できます。[^1]

[^1]: https://angular.jp/api/forms/FormControl

公式の説明にはこうあります。
> onlySelf: When true, each change only affects this control, and not its parent. Default is false.[^2]

[^2]: https://angular.jp/api/forms/FormControl#setvalue

説明の通りなのですが`onlySelf`は、
「`true`を指定した場合、controlの変更が親に影響しない」です。
因みにデフォルトが`false`です。

これの動きについて実際に動かして確認したいと思います。　

## 例で確認する

良くあるformを考えます。

```js
formGroup: FormGroup;

constructor(
  private formBuilder: FormBuilder,
)

ngOnInit() {
  this.formGroup = this.formBuilder.group({
    control: ['hoge', [Validators.required]],
  });
}
```
### falseの場合
更新するときはこうですね。

```js
this.formGroup.get('control').setValue('hogehoge', {onlySelf: false});

this.formGroup.get('control').value; // hogehoge
this.formGroup.value; // {control: "hogehoge"}
```
すると、、
controlを更新したら親にも影響がありました！

### trueの場合

```js
this.formGroup.get('control').setValue('hogehoge', {onlySelf: true});

this.formGroup.get('control').value; // hogehoge
this.formGroup.value; // {control: "hoge"}
```
こちらは、、
controlを更新しても親には影響がありませんね！
完全に理解しました！

## 別の例
値だけではなくバリデーションにも影響してきます。
確認してみましょう。

### falseの場合

```js
this.formGroup.get('control').setValue('', {onlySelf: false});

this.formGroup.get('control').valid; // false
this.formGroup.valid; // false
```

必須チェックバリデーションが親にも影響してますね！

### trueの場合
```js
this.formGroup.get('control').setValue('', {onlySelf: true});

this.formGroup.get('control').valid; // false
this.formGroup.valid; // true
```

こちらは予想通り、影響していません！

## まとめ
実際に見てみると一目瞭然ですね！
これで`onlySelf`について確認できたかと思います。
Iconを含む、fontを作る方法。

Nerd Font: https://github.com/ryanoasis/nerd-fonts

自分の記事が読みにくいので、単純な記事にしました。

1. gitがinstallされていない場合は。
`sudo apt install git-all`

2. font forgeがinstallされていない場合は。
Software Managerなどでinstallする。

3. patchを当てたいfontを用意する。

4. Nerd Fonts: configparser module is probably not installed. Try `pip install configparser` or equivalent
と出た場合。
`pip install configparser`

5. python2用のpipがinstallされていない場合。
`curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py`
`python get-pip.py --user`
でpython2用のpipをinstallする。

1~4-1までOKなら実行。

```
git clone https://github.com/ryanoasis/nerd-fonts.git\
fontforge -script ~/nerd-fonts-master/font-patcher ~/Downloads/font_font.ttf -c
```
１つめのpath: font-patcherのscript
２つめのpath: patchを当てたいfont
CNNを用いた奇数/偶数の分類

##目的

人が数字の画像から奇数か偶数か把握するとき,何の数字が描かれているのかを頭で数字に変換してから,その数字が奇数か偶数か,2段階の処理をします(多分).そこで,人間でいう奇数か偶数か考える過程をすっ飛ばして,画像を認識するだけのConvolution Neural Network(以下CNN) を用いて,数字の奇数・偶数は分類出来るのか検証してみた(出来るだろ, という意見はおいておいて...)


本記事のコードは以下においています.
[githubリンク](https://github.com/be-m1ya/mnist_classification)

##使用データ
手書き数字画像と数字のラベルのセット 
The Mnist database【http://yann.lecun.com/exdb/mnist/】
トレーニングデータ数 : 60,000 samples, テスト用データ数 : 10,000 samples

##実験
Convolution Neural Networkを用いて,奇数/偶数の分類を試みました.
また,おまけで5以上/5以下の分類もやってみました.
CNNモデルは,2層の畳み込みと2層の全結合層からなるめちゃくちゃ簡単なもの.

(1)奇数のラベルを0,偶数のラベルを1としてモデルの学習
(2)5以上の数字のラベルを0, 5以下数字のラベルを1としてモデルの学習

##結果
###(1)奇数/偶数分類モデル
####学習過程
![eo.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/e336729b-47f1-d43e-8c3f-0de413a19a8f.png)

####lossとepochsの関係
![epoch_class_eo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/382a391c-eff1-7ff2-e190-d039565ae280.png)

####一部テスト用画像と予測ラベル
0 = 奇数, 1 = 偶数
![ketugou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/c11ab8e3-8b44-405e-ca1c-4e34d6a93009.png)


###(2)5以上/以下分類モデル
####学習過程
![５＿.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/ad8268fe-fbe8-3ac9-3498-1aeaee9b12e9.png)

####lossとepochsの関係
![epoch_class_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/144f95f6-0d61-b8fc-1a00-244eb0302561.png)

####一部テスト用画像と予測ラベル
0 = 5以上, 1 = 5以下
![ketugou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/875323ae-f64f-89c4-dc91-bc53404dcbfb.png)


##結果からわかること
Validation lossをみると,4%,6％程度の誤差という結果を得られた.
ランダムな分類で50%の誤差だと考えると,今回の実験では画像認識から直接偶数奇数とか5以上5以下が分類出来ている!
まぁ数字の性質を捉えるなんて賢いことはしておらず,１，３，５，７，９のような形ならば奇数グループ,０，２，４，６，８のような形ならば偶数グループとしているだけだから,未知の数字見ても判断は出来ないだろうなぁ.(ただ何桁もの数字で学習して,一桁目が１，３，５，７，９であれば奇数だ！ってCNNが判断出来たら,未知の数字でも偶数奇数の予測はできそう.)

あと.
当たり前かもしれないけど,CNNは似ている画像だけを一つのラベルとする必要はなく(猫なら猫だけを一つのラベルとする,のように),法則さえあれば分類することが可能だといえる(下図).法則は,今回ならば｛１，３，５，７，９→奇数,０，２，４，６，８→偶数｝のようなもの.
 
CNNの許容について
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437676/a595d2e5-517d-d878-697d-9f06dfecc4e5.png)


興味深いこととして,(1)奇数偶数分類より(2)５以上以下分類のほうが,学習時間が長かった(例えば10[epochs]のとき,(1)1.558[minutes],(2)1.742[minutes]).
詳しく言うと,{１，３，５，７，９}と{０，２，４，６，８}で分類したときより,{０，１，２，３，４}と{５，６，７，８，９}で分類したときの方が,学習時間が長かった.この理由について現段階ではわからなかったのだが,グループ分けの仕方によって学習時間に差が出ることを確認することができた.(なにか分かる方いらっしゃれば教えていただければ幸いです...!)
パッケージについて

##【パッケージのコンパイルと実行】
・「C:\java\pack」下にJavaファイルがある場合を考える
①上記のJavaファイルの先頭に```package pa;```と記述する
↓
②パッケージと同名のフォルダを作成し、「C:\java\pack\pa」のフォルダ構成を作る
↓
③コマンドプロンプトで```javac pa\Javaファイル名.java```を実行
↓
④コンパイルが成功したら```java pa.javaファイル名```で実行


※注意点
・パッケージと同名のフォルダを作成するが、それよりも一つ前の階層にJavaファイルを格納しておく

####(パッケージと修飾子）
→クラスの先頭にpublicをつけると異なるパッケージから使える（省略すると同じパッケージからしか使えない）
※なおpublicクラスは一つのソースファイルに一つしか記述できない

→「private」:同じクラス内からのみアクセス可能
→「protected」:同じパッケージのクラスか別パッケージのサブクラスからのみアクセス可能
→「public」:すべてのクラスからアクセス可能
→「無指定」:同じパッケージからのみ

####(パッケージ名について)
→パッケージが異なると、同クラス名でも別クラスとなる
→例えば「xxx.co.jp」という組織の場合は「jp.co.xxx.・・・」のように逆順の名前で扱う

##【インポート】
→```import パッケージ名.クラス名;```で異なるパッケージのクラスをパッケージ名なしで利用可能

####(パッケージの階層)
######コンパイル時
→```javac 親パッケージ\サブパッケージ\Javaファイル名.java```を実行

######実行時
→```java 親パッケージ.サブパッケージ.Javaファイル名```を実行

####(クラスライブラリのインポート)
→```import java.各ライブラリパッケージ.*;```で全てのクラスライブラリのインポートが可能

※ただしこの場合は各クラスのサブパッケージはインポートできないのでそれぞれ親クラスまで記述する必要あり。
Amazon SESにてSMTP認証情報を取得するまでの流れ

# はじめに
Amazon SESをメール送信サーバーとして、利用する際のSMTP認証情報の取得方法をまとめました

# 結論
IAMを作成後、シークレットアクセスキーからパスワードを生成すればOKです　

# 前提
- Amazon SESの設定は完了しているものとします
- bashとopensslがインストール済

# 手順
1. SES Homeの「SMTP Settings」を表示します（※1）
2. 「Create My SMTP Credentials」をクリックして、SMTPのIAMを作成します(※2）
3. シークレットアクセスキーからSMTP認証のパスワードを生成します(※3)
4. 1〜3の情報を元に設定すれば、SMTP認証でメールの送信ができます

```bash
(echo -en "\x02"; echo -n 'SendRawEmail' \
  | openssl dgst -sha256 -hmac $AWS_SECRET_ACCESS_KEY -binary) \
  | openssl enc -base64
```

# 補足
- ※1 SMTP認証するために必要なサーバー、ポート、TLSの情報が記載されています
- ※2 作成したIAMのアクセスキーはSMTP認証のユーザー名と使用します。パスワードはシークレットアクセスキーから生成します
- ※3 TutorialMoreにて掲載されている生成コマンドを使用しています

# まとめ
SMTP認証のパスワード生成の部分がつまづきました
Pythonの環境があれば、AWSのマニュアルどおりにパスワード生成まで行うことができるので、マニュアルを参考にしたほうがよいかと思います


# 参考
- [Amazon SES SMTP 認証情報を取得する](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/smtp-credentials.html)
- [email - Amazon SES 535認証資格情報が無効です](https://tutorialmore.com/questions-1881938.htm)
【イベント】第3回 Microsoft Learn もくもく会@名古屋を開催しましたレポ #mslearn

![logo-mslearn-nagoya1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38910/9813b940-be13-70bf-af81-30f47a6e46d5.png)

## イベント情報
* 開催日： 2020/01/25
* 日時： 13:00-17:00
* 参加人数： 11人
* 会場： [株式会社デンソークリエイト](http://www.denso-create.jp/)
* ページURL： https://mslearn.connpass.com/event/162836/

## 主催しての感想
* スタッフ枠の方だけでなく参加者の皆様が協力的で不慣れな点も助けていただき、感謝と共にコミュニティの良さを感じました。
  * 設営だけでなく片付けもお手伝いいただき、ありがとうございました。:bow_tone1:
* Twitterでお話しした方が初参加していただけたのは驚きましたし、何より嬉しかったです。:grin:
* 初の複数拠点（品川・関西・名古屋・札幌）で同時開催ということもあり、ビデオチャットにチャレンジしましたが、お約束のトラブルを乗り越えて無事に接続できた時は胸熱でした。:yum:

## 同時開催
* 品川・関西が同時開催の話を聞き、会場やゲスト用Wi-Fiなど急ぎで調整していましたが、何とか同時開催に間に合いました。:sweat_smile:
* 突如のビデオチャットチャレンジも皆の協力で何とかしていく過程が素直に楽しかったです。:grin:

### 品川・関西・名古屋
[![2020-01-27_22h14_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38910/2cfbaa1a-079a-efb1-bf9b-df9e981ccf2f.png)](https://mslearn.connpass.com/)

* [品川レポ](https://blog.ltflavor.com/entry/2020/01/26/%E7%AC%AC11%E5%9B%9EMicrosoft_Learn%E3%82%82%E3%81%8F%E3%82%82%E3%81%8F%E4%BC%9A%E3%82%92%E9%96%8B%E5%82%AC%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%83%AC%E3%83%9D_%23mslearn)
* [関西レポ](https://qiita.com/roulgonzaress/items/0d6cac4db4d97e3f6383)


### 札幌
[![2020-01-27_22h15_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38910/e77ca74e-29b5-f5b6-f26f-f4e116195648.png)](https://sapporoazuremok2.connpass.com/event/162650/)

## 参加者の感想など
* 「もくもく会」ということで、業務みたいに完全に黙々とやるのかな？と思っていたが、そうではなく、割と会話したり、他の参加者の方といろいろなお話ができる環境だったのが、すごくよかったです。
* おやつを充実したい
* ビデオチャットをやる場合は、当日ではなく事前にリハーサルできると機材不足も対応できると思いました。



## 当日の様子など
[![2020-01-28_10h31_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38910/30ea6fa5-7802-f1db-d82a-a05e319c501e.png)](https://www.facebook.com/hamu502/media_set?set=a.1622848571189474&type=3)
Excelで時間管理や検算を行う時のめんどくせぇ部分

#■Excelで時間管理するときのアレコレ
まず、時間の検算をそもそもExcelでやるのが正解なのかわからないんだけどさ・・・
労務の業務をやっていると、検証（検算）時にExcelで労働時間の計算とかやるんです。

が、細かな小数点以下の差異で、システムのデータと突合させたときにTRUEになってくれないってことがよくあって、その相談をよく受ける。
解決方法はいくつかあるにはあるのだけど、要件が複数発生すると実際にどれがスマートなのかわかりづらいし、実現できたとしても結構冗長だったり。
というかそもそも作業やってるねーちゃん達は「シリアル値なにそれ？」みたいな感じなので、できるだけ簡単にしておかなければ相談が絶えない。
ってことで、毎回「このケースならこれだったかな？どうだったかな？」と考えるよりまとめておきたいので記事にしてみる。


##前提とか
　・労務にとって労働時間管理＝お金の管理と同義
　・Excelの時間管理はシリアル値と呼ばれる小数（0～0.999888426）
　・労働時間は24時間超えるので、必然的に整数の部分も関係してくる
　 （1.0=24H,2.0=48H)
　・それを無理やり書式設定([hh]:mm)で累積表示させてる
　・でも時間は、12進数だったり、24進数だったり、10進数だったりする
　・分秒は、60進数（ミリ秒は使わないのでスルー）
　・残業代とかの金額は10進数なので、時間も10進数に変換することがある
　・突合チェックもする、そのあと計算にも使う
　・Excelでやんなきゃいいじゃんってのはナシ

そもそもなんでシステム通りに労働時間計算や給与支払いが行われないかというと、従業員さんが正しく勤怠を締めてないとか、会社によって特殊な裁量があって勤怠管理上と給与支払い上で利用する時間が違うからってのと、勤怠システムと給与システムが一緒（同いつメーカー）のもの利用されてないケースが結構あるから、連携時にずれちゃったりもする。
例）AM休と備考があるのに、AM休の申請してなくて
　　遅刻が発生してたり、通常労働判定になって残業に加算されてたり、たりたり

システムはちゃんと利用している・・・が、それで全てを包括できているわけじゃないってことです。
その対策にExcelを利用するのが正解かってのは別の話ってことで。



##ゴールはどこだ
大きく分けると2つ。
　１）システムの結果と突合させて差異を探ること
　２）修正後の勤怠から、各種金額の理論値を作成すること（10進数に直して単価を乗算）

###１．文字列で管理しちゃうパターン
シリアル値だったり、検算結果（1/24とか）を利用すると、小数点以下の細かな差異が発生してEXACTとかでTUREになってくれない。
「11:15」はシリアル値で0.46875。計算で求めると0.46875012なので、まぁ一致しないよね。
ならば、文字として管理しちゃえばいいじゃないかというありきたりな発想。

```
=TEXT(値,"[hh]:mm")
```
こう記述しちゃえば、比べるときにも楽ちんちん。
文字に変換していても、計算するときには書式設定が時間表示ならExcelが自動的に解釈してくれるので問題ない（横暴）。

と思いきや、なんかたまに桁落ちする。
とあるツールで、差を取った時の答えが"0：00"になるパターンで桁落ち？が発生した際には、マイナス値に入るらしくエラーになり、その後の処理に影響が発生してしまった。
で、これが100％再現するわけではないのでなんか厄介（すぐ気付ければいんだけど）。
IF関数で判断してあげればいいだけなんですけどね。

しかし、いくら自動で判別してくれるとは言え、やはり文字を計算に利用しようという考え自体がそもそも間違いと思ったほうがいいかもしれない。
ただそうなると、計算に利用する際にはいちいちtimevalue関数でシリアル値に戻してから計算しなきゃいけないのが面倒になる。

###２．10進数で管理しちゃうパターン
金額まで算出するときは、最終的に10進数に直すので、10進数で最初から管理したい。
けど、「12.31」が「12:19」かどうかを人が直観的に判断するのは無理なんで、やっぱり日付形式で計算は行っていくほうがいいんじゃないかなという結論に至ってしまう。
ただ小数点2桁で区切れるので滅茶苦茶な計算方法になることはほぼないのは利点ではないかな。

ある程度元データの信頼性が高い場合は、隣の列に10進数変換後の値を持っておいて
こちらで突合するという方法がとれる。
個人的にはこれが好きなのだけど、列が増えるのが・・・という意見が絶えない。

###３．端数のないシリアル値に変換しておくパターン
TEXT 関数と TIMEVALUE 関数を一度くぐらせるとか、Time関数使うとかでエクセル関数がはじき出したシリアル値をベースに使っていったらいいんじゃないかという考え。
計算がかかったら、それもTEXTで文字にして、TIMEVALUEでシリアルに戻す。

```
=TIMEVALUE(TEXT(値,"[hh]:mm"))
```
・・・一つ一つ これやるのかい？　というのがやはり悩みの種。
エンジニアとしては冗長かどうかはともかく正確であるほうが好ましいのだけど、この60進数ってのがなかなか厄介だ。
あと、やっぱり差を取った時の答えが"0:00"になるような場合にマイナス値になったりする。
でもってIF関数先生ががんばってくれる。

##まとめ
やっぱりケースバイケースだなと思うが、基本として
　１）突合する時は、文字列に変換しての突合を行う
　２）1÷24など、計算で少数（シリアル値）を出した場合には、特に１）を意識する
　３）可能ならば10進数変換後に計算を行う

これはシリアル値という少数を、表示形式という仕組みで時刻に見せているため
いかに端数を無視できる状況を作るかということが大事という考えによります。
このあたり、勤怠システムとかつくってらっしゃる方はどういう考えの基作ってるんですかね。


###関数だからといえど
検証基準をしっかり定めてから検証ファイルってのは作るものだなと思いますね。
バラバラ作ってあるから、相談の内容が一致してこないんだと思う。

とはいえIT齧ってきてない人に、INPUT＞PROCESS＞OUTPUTの原理を理解してもらうのは一苦労です。