OmniAICreator/Qiita-1.07M huggingface dataset:
[xfs] ファイルシステムをrepairした後にUUIDが重複してマウントできない

# 構成
- RAID6構成の"ファイルサーバ"をiSCSIでマウント
- xfsでフォーマット
- マウント先のマシンはCentOS6

# 発生した事件

- "ファイルサーバ"のHDDのうち1台が故障してRAIDのHealthがDegradedに
- rebuildする前に最低限のデータを引き出そうとしてもファイルシステムが壊れている

```
% ls /mnt/"ファイルサーバ"
ls: cannot open directory .: Input/output error

% dmsg | tail
XFS(sdc1): xfs_log_force: error 5 returned.
がたくさんでてくる。
```
 
# 作業ログ
## ファイルシステムの(強制)アンマウント
```
% sudo umount /mnt/"ファイルサーバ"
umount: /mnt/"ファイルサーバ": device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
```
しょうがないので強制的にアンマウントを実行

```
% sudo umount -l /mnt/"ファイルサーバ"
```

## ファイルサーバの再起動
```
% sudo iscsiadm -m node --targetname "ファイルサーバのIQN" --logout
が反応しなかったので"ファイルサーバ"を再起動

再接続
% sudo iscsiadm -m discovery -t sendtargets -p "ファイルサーバのIP"
% sudo iscsiadm -m node --targetname "ファイルサーバのIQN" --login
% sudo iscsiadm -m session -P 3
(省略)
    Attached scsi disk sdd		State: running
```
/dev/sddとして認識されている。

## ファイルシステム修復
```
% sudo xfs_check /dev/sdd1                                                                                         
ERROR: The filesystem has valuable metadata changes in a log which needs to
be replayed.  Mount the filesystem to replay the log, and unmount it before
re-running xfs_check.  If you are unable to mount the filesystem, then use
the xfs_repair -L option to destroy the log and attempt a repair.
Note that destroying the log may cause corruption -- please attempt a mount
of the filesystem before doing this.

% sudo xfs_repair -L /dev/sdd1
(省略)
done.
```

## それでもマウントできない
```
% sudo mount /dev/sdd1 /mnt/"ファイルサーバ"
mount: wrong fs type, bad option, bad superblock on /dev/sdd1,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so

% dmseg| tail
XFS (sdc1): xfs_log_force: error 5 returned.
XFS (sdd1): Filesystem has duplicate UUID a8d4d36b-c7ce-41ba-bf1f-f919cd38f253 - can't mount
```
強制的にアンマウントしたせいでsdc1のerrorが消えていない。そしてUUIDが重複しているのが原因のよう。
再起動したらsdc1は消えてくれそうだが本体は迂闊に停止できない。

## UUIDを作り直す
```
% sudo xfs_admin -U generate /dev/sdd1
Clearing log and setting UUID
writing all SBs
new UUID = bc4e7800-0309-4b7c-91c2-1cd255210ad6
```

## 再マウント
今度こそマウントに成功。
データを取り出す。
URI, URL, URN ？？？　　それぞれの意味や違いを分かりやすく解説

URI :  Uniform  Resource  Identifier

URL:  Uniform Resource  Locator

URN:  Uniform Resource  Name

 

これだけじゃあよく分からないですよねー

 

でもこれらの関係はとてもシンプルなので、一度理解すると、もう忘れないでしょう

 

 
![uri.png](https://qiita-image-store.s3.amazonaws.com/0/266096/45d4c3c8-6357-019d-22b0-75171d2a1229.png)



 

この画像からみてわかるように

**URL     ⊃   URL, URN **

という認識でいいと思います。

 

 

#URL ( Uniform Resource Locator) とは
 

URLは一番馴染み深い用語だと思います。

 

https から始まるこれのことです⇩

　　　　　　　https://www.yoji0806.com/

 

 

※ http についてはこちらを参照してください⇩


(https://qiita.com/Neal-Ryan/items/7d401b7aa7c7bf447def)

 

 

URL は、よく**個人の住所**に例えられます。

 

webページ１つ１つに住所がついているので、ブラウザに URL を入力するとそのページに飛んでくれます。

（実際はそのページのデータを送ってもらっている。）

 

URL は **プロトコル** と **ドメイン** から成り立っています。

 

 

        https:// （プロトコル）

         www.yoji0806.com/ （ドメイン）

 

 

２つと同じ住所が存在しないように、ドメイン名も同じものは存在しません。

 

住所と違う点は、ドメイン名はあらかじめ定まっているのではなく、早いもの勝ちで自由に決められます。

 

 

独自ドメインを所有しておくのには費用が掛かりますが、安いのであれば、1年間 数百円程度で使用できます。

 

 

 

#URN とは
 

 URL がweb上で個人の住所の役割をもっているのに対し、

URN は**個人の名前の役割**をもちます。

 

URL ほど馴染みはないですが、ネット上のすべてのファイルにはURNがそれぞれ割り振られています。

 

 

URL, URN を現実世界で例えると、

 

兵庫県 神戸市 灘区 （URL）の

山田 太郎さん （URI） 

 

のようなものです。

 

また別の例でいうと、

全ての本の裏表紙についているISBN (世界共通の本の識別番号) のようなものです。

 

**URL が 「どこにあるのか (Where)」 を示す**のに対し、

**URNは 「なにがあるのか (What)」**を示します。

 

 

住所の例からもわかるように、URN と URL は相互補完的な関係にあります。

 

 

#URI とは
 

最後にURI の説明ですが、

 

最初に書いたように、

URI とは **URL, URNのどちらか または 両方**を指します。

 

Uniform  Resource  Identifier, 

identify は「～を識別する」 という意味なので、

 

URI は web上の何かを識別するもの、

 

すなわち、URL や URN ということです。
【C#】プログレスバーのサンプル(とりあえずメモとして)

1.Windowsフォーム　Form1.cs、Form2.csを追加する
2.Form1.cs上に適当にbutton1を追加する
3.Form2.cs上にいい感じにprogressBar1を追加する
![Form2.png](https://qiita-image-store.s3.amazonaws.com/0/269237/978e4f65-d166-5cb8-3be0-f0aaf2149ba1.png)
4.Form2.Designer.csを開いて、private System.Windows.Forms.ProgressBar progressBar1;をpublicに変更する
5.あとは4.も含めてコードを見てちょ

---

Form1.cs

```C#
using System;
using System.Drawing;
using System.Windows.Forms;

namespace ProgressBarTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            BackGroundClass1 BGC1 = new BackGroundClass1(this);
            BGC1.start();
        }
    }
}
```

Form2.Designer.cs

```C#
namespace ProgressBarTest
{
    partial class Form2
    {
        /// <summary>
        /// 必要なデザイナー変数です。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
        
        #region Windows フォーム デザイナーで生成されたコード

        /// <summary>
        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
        /// コード エディターで変更しないでください。
        /// </summary>
        private void InitializeComponent()
        {
        //省略
        }

        #endregion

        //↓privateからpublicに変更する
        //private System.Windows.Forms.ProgressBar progressBar1;
        public System.Windows.Forms.ProgressBar progressBar1;
        

    }
}
```

BackGroundClass1.cs

```C#
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

//using System.Windows.Forms;

namespace ProgressBarTest
{
    class BackGroundClass1
    {
        private Form1 f1;
        private Form2 f2;

        public BackGroundClass1(Form1 f1)
        {
            this.f1 = f1;
            this.f2 = new Form2();
        }

        public void start()
        {
            Thread t = new Thread(new ThreadStart(LongTask));
            t.IsBackground = true;
            t.Start();
            f2.ShowDialog(f1);
            f2.Dispose();
        }

        private void LongTask()
        {
            //ここにすっげー時間かかる処理を書く想定
            for (int i = 0; i <= 100; i++)
            {
                Thread.Sleep(100);
                f2.BeginInvoke(new UpdateProgressBarDelegate(UpdateProgressBar), new object[] { i });
            }
        }

        private delegate void UpdateProgressBarDelegate(int val);
        private void UpdateProgressBar(int val)
        {
            f2.progressBar1.Value = val;
            if (val >= 100)
            {
                f2.Close();
            }
        }
    

    }
}

```
iOSアプリのunrecognized selector sent to instanceエラーについて

# iOSアプリの`unrecognized selector sent to instance` エラーについて

## はじめに
ダイアログを表示する画面を作成していた時に`unrecognized selector sent to instance`のエラーが起こり四苦八苦したのでメモとして残します。

## TL;DR
結局StoryBoardに設定する`Custom Class`のクラスが違うクラスを指定していたことが原因というオチ。。。
![スクリーンショット 2018-08-03 13.30.26.png](https://qiita-image-store.s3.amazonaws.com/0/134845/fbf01209-273d-d841-4e95-1c5b0328b307.png)

## 経緯
こんな感じでViewControllerを呼び出してダイアログ表示をしようとしていたが、タイトルのエラーが起こりうまく行かなかった。クラスが原因かと思い色々見直したがアクセスはできるし、原因が謎だった（そもそも筆者がObjective-C、iOS開発あまり知らない人でてんやわんや）

``` objective-c:
// 指定のViewControllerインスタンスを作成、その際に
HogeDialogViewController *vc = [
    [UIStoryboard storyboardWithName:@"HogeDialogViewController" bundle:nil] 
     instantiateViewControllerWithIdentifier:@"HogeDialogViewController"];
// Dictionary型を作成し、Entityを作成する
NSDictionary *responseObject = [NSDictionary dictionaryWithObjectsAndKeys:
		@"id", @1111,
		nil];
HogeData *hogeData = [[HogeData alloc] initWithDictionary:responseObject];
vc.hogeData = hogeData;
// Dialog表示
[vc show];
```

## StoryBoardを見直す
コードは問題ないと考え、StoryBoardを見直したところ、`Custom Class`のクラス名が違うクラスを指定していたからViewControllerにインスタンスをセットできないよと怒られていたようです。

## 所感
よくよく考えてみたら存在しないStoryBoardを指定してそのインスタンスの存在しないフィールドにアクセスしようとしてたんだから、そりゃ怒られるよねっていう話。iOS開発大変だなぁと思った。ていうかObjective-cじゃなくてSwift触りてえ。

### 参考情報
- https://qiita.com/ruwatana/items/7cfc63ce102938962260
- http://tech.pjin.jp/blog/2016/02/22/swift2-error-sample-1/
PHP（多次元配列）の構文エラー


<?php

$row0=array(1,2,3);

$row1=array(4,5,6);

$row2=array(7,8,9);

$multi=array($row0,$row1,$row2);

for($i=0,$num=sizeof($multi);$i<$num;$i++){

 for($j=0,$num0=sizeof($multi[0]);$j<$num0;$j++){

 print $multi[$i][$j];

 }
 for($k=0,$num1=sizeof($multi[1]);$k<$num1;$k++){

 print $multi[$i][$k];

 }

 for($l=0,$num2=sizeof($multi[2]);$l<$num2;$l++){

  print $multi[$i][$l];

 }

}

?>

上記のソースコードで1から9までの数字を順番に表示させることができません。
ブラウザでは　123123123456456456789789789　のように表示されてしまいます。
プログラムを正確に実行させるにはどうしたらよいでしょうか。
【2018年版】Rails5の環境構築 for Mac


## Ruby on Railsとは
Rubyを利用して効率よくWebサイトを開発できるようにしてくれるものです。

## インストールの流れ

1. Command Line Tools
2. Homebrew
3. rbenv(アールベンブ), ruby-build(ルビー・ビルド)
4. readline
5. MySQL
6. bundler
7. Ruby on Rails


### MySQLとは
データベース管理ソフトでフリーで扱えます。データベース管理ソフトの中でも圧倒的なシェアを誇るのはOracleですが、それは有料なのでMySQLやPostgreSQLなどのフリーソフトを利用することが多いです。どのデータベース管理ソフトでもSQL文でデータを取り扱うのは一緒なので、覚えておくと様々なデータベース管理ソフトに応用が利きます。


## Xcodeのインストール
まずはAppStoreにてXcodeのインストールを行いましょう。

## Commandlinetoolのインストール
次に、[AppleのDeveloperサイト](https://developer.apple.com/download/more/)から`Command LineTool`をインストールします。

1. チェックボックスにチェックしてsubmit
2. download tools
3. see more downloads

左上の検索窓で`command`と入力して検索し、自分のOSのバージョンにあった`Command LineTool`をインストールしましょう。

## Homebrewのインストール
Homebrewのインストールをします。ここからはターミナルでコマンドを入力していきましょう。

```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

途中で`enter`を求められるので`enterキー`を押し、その後、Macのパスワードを入力しましょう。


homebrewがきちんとインストールできたかバージョンを確認します。

```
brew -v
```

homebrewのアップデート

```
brew update
```

## 権限の変更
`/usr/local/bin`フォルダの権限を変更します。

```
sudo chown -R `whoami`:admin /usr/local/bin
```

## rbenv(アールベンブ), ruby-build(ルビー・ビルド)のインストール
次に、rbenv(アールベンブ), ruby-build(ルビー・ビルド)をインストールしましょう。ruby-buildはRubyの様々なバージョン(2.4.1など)をインストールすることができるツールで、rbenvは、rubyのバージョンを切り替えるためのツールです。

インストールはHomebrewを使用して行います。以下のコマンドを実行しましょう。

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

rbenvのパスを通す

```
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```

bash_profileの変更内容を読み込む

```
source ~/.bash_profile
```

## readlineのinstall
readlineはCUIでの操作を簡単にするためのツールです。

```
brew install readline
```

readlineのパスを通す

```
brew link readline --force
```

## Ruby【ver.2.5.1：最新安定板】のインストール
readlineとrbenvを利用して`Ruby ver.2.5.1`のインストールを行います。

```
RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)”
```
```
rbenv install 2.5.1
```

インストールが完了したらリハッシュします。

```
rbenv rehash
```

rbenvを用いて利用するRubyのバージョンを決めます。

```
rbenv global 2.5.1
```

Rubyのバージョンを確認し、インストールが成功しているか確かめましょう。

```
ruby -v
```

## MySQLのインストール
Homebrewを利用してMySQLのインストールを行います。

```
brew install mysql56 mysql
```

MySQLはデフォルトの状態では自動で起動しないようになっています。毎回、起動コマンドを打つのは大変なので、自動で起動するように設定しましょう。以下のコマンドを順に入力してください。

```
mkdir ~/Library/LaunchAgents
```
```
ln -sfv /usr/local/opt/mysql\@5.6/*.plist ~/Library/LaunchAgents
```
```
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.6.plist 
```


## bundlerのインストール
次に、Rubyのgemであるbundlerをインストールします。

```
gem install bundler
```

## Ruby on Railsのインストール
次にRubyのgemでありフレームワークでもある`Ruby on Rails`をインストールします。

```
gem install rails
```

gemをインストールしたのでrehashを行います。

```
rbenv rehash
```

インストールがうまくいったかどうか確かめるため、以下のコマンドを入力してRailsのバージョンを確認しましょう。きちんとバージョンが表示されればインストールは成功です。

```
rails -v
```

## 注意!!
Xcodeのインストールが完了していないのに `gem install rails` を実行するとインストールがうまくいきません。エラーが出た場合は、Xcodeがきちんとインストールされていること、最新版にアップデートされていることを確認しましょう。
jestで"SecurityError: localStorage is not available for opaque origins"と言われてテストがコケる

# 追記
https://github.com/facebook/jest/blob/master/CHANGELOG.md#2350

jest 23.5.0で修正されました

# 概要
`jest` をupgradeしたら

```
  ● Test suite failed to run

    SecurityError: localStorage is not available for opaque origins

      at Window.get localStorage [as localStorage] (node_modules/jsdom/lib/jsdom/browser/Window.js:257:15)
          at Array.forEach (<anonymous>)
```

と言われてテストがコケるようになった。

# 対応
pakcage.jsonに以下の設定を追加するとよい

```diff:package.json
+  "jest": {
+    "testURL": "http://localhost/"
+  }
```

# 参考
https://github.com/facebook/jest/issues/6769#issuecomment-408352345
wordpressのWp_optionテーブル

wordpressで作成されるデータベースのwp_optionsというテーブルを触ったのでメモします。

ここに保存されるのは
・管理画面＞設定の設定情報
・wordpress全体の設定情報
・テーマ、プラグインがここに設定情報を保存することもあります。

特徴として他のテーブルはテーブル同士紐づいたりするのに対して
このoptionsテーブルは唯一独立しているという特徴があります。


#抽出
今回、管理画面＞表示設定で設定するfrontpageの登録状況を確認したくて
以下のコマンドを実行しました。

```front.sql

MariaDB [ebdb]> SELECT * FROM wp_options WHERE option_name IN ('page_on_front');
+-----------+---------------+--------------+----------+
| option_id | option_name   | option_value | autoload |
+-----------+---------------+--------------+----------+
|        84 | page_on_front | 2            | yes      |
+-----------+---------------+--------------+----------+

```

option_valueのところはページIDが入っていました。


#option_nameの一覧を表示

結構大きなテーブルなので一つのカラムを表示してみます。

```optionname.sql

MariaDB [ebdb]> select option_name from wp_options;
+---------------------------------------------------------------------------+
| option_name                                                               |
+---------------------------------------------------------------------------+
・
・
・
| current_theme                                                             |
| date_format                                                               |
| db_version                                                                |
| default_category                                                          |
| default_comment_status                                                    |
| default_comments_page                                                     |
| default_email_category                                                    |
| default_link_category                                                     |
| default_ping_status                                                       |
| default_pingback_flag                                                     |
| default_post_format                                                       |
| default_role                                                              |
・
・
・
+---------------------------------------------------------------------------+

```


#option_nameの制約
最大長：64文字
型：varchar
ユニーク制約：あり

option_nameを設定する際は64文字以内のユニークな値で設定する必要があります。


#option_value
wordpressがoption_valueに値を保存する際は文字列で保存されます。
真偽値や数値は数値文字列として保存されます。

またoption_valueには配列やオブジェクトを保存することも可能ですが
この場合はシリアライズされた値が保存されます。

webサイトのURLが文字列のまま保存されていたり、
プラグインリストの配列がシリアライズされて保存されたりします。

設定値が配列やオブジェクトの場合
wordpressはserialize関数、unserialize関数を使用して処理を行います。

#wpdbオブジェクトによる操作の注意点
チェックサムの値と文字列のバイト数が一致しない置換処理などを行うと
wordpressがアンシリアライズできなくなることがあります。

#wordpressが重いときはautoloadカラムをチェック！？
autoloadカラムがonに設定されていると
wordpressの設定情報をまとめて一括取得することで
データベースへのクエリ発行回数を減らして
パフォーマンスを高めます。しかし、実行領域、ページの種類にかかわらず
wordpressが起動するたびに毎回実行されるという側面もあるため
利用頻度が低くデータ量の大きいレコードがある場合は
autoloadをnoに設定してパフォーマンスが上がる場合もあります。

現状利用していないテーマやプラグインでも
以前利用していて、このautoloadカラムがyesになっていた場合
パフォーマンスに影響が出る可能性もあります。
プラグイン、テーマでアンインストールしても
必ずautoloadがnoになるとも限らないので注意が必要です。
【PHP】composerの使い方

## composerとは
PHP向けのパッケージ管理システムのこと

## composer.jsonとは
composerでのパッケージ依存関係を設定したファイル

## コマンド
### composer.jsonのパッケージをインストールする
```
$ composer install
```

### composer.jsonに【パッケージ名】を追加し、インストールする
```
$ composer require 【パッケージ名】
```
テーブル、会社概要、お知らせ、問い合わせフォームなどのフォーマットを1秒で作れるEmmet＋Bootstrap4のチートコード

いつも会社概要とか、お知らせのフォーマットとか問い合わせフォームとかDiv、テーブル作るのが手間なので、
Tab一回で一気に作れるコマンドを覚えました。
Emmetが入っていれば動作します。
※ul>li*5 などと記述して tabキーを押すと 展開するやつです。
※環境はIntelliJ、Bootstrap4使ってます。

#テーブルタイプA
##イメージ画像
![table1.png](https://qiita-image-store.s3.amazonaws.com/0/132580/16ba584c-2512-ac02-4be0-75e08f02b9d6.png)

##コード

```
table.table.table-striped.table-bordered>tbody>(tr>th{title}+td{content})*5
```
※Bootstrap4を使います。

##展開するHTML

```html
        <table>
          <tbody>
          <tr>
            <th>title</th>
            <td>content</td>
          </tr>
          <tr>
            <th>title</th>
            <td>content</td>
          </tr>
          <tr>
            <th>title</th>
            <td>content</td>
          </tr>
          <tr>
            <th>title</th>
            <td>content</td>
          </tr>
          <tr>
            <th>title</th>
            <td>content</td>
          </tr>
          </tbody>
        </table>
```

#テーブルタイプB
##イメージ画像
![table2.png](https://qiita-image-store.s3.amazonaws.com/0/132580/2536494a-cc1e-cc34-84a9-75d80f033bcf.png)

##コード

```
table.table.table-striped.table-bordered>(thead>tr>(th{title})*5)+(tbody>tr>(td{content})*5)
```
※Bootstrap4を使います。

##展開するHTML

```html
        <table>
          <thead>
          <tr>
            <th>title</th>
            <th>title</th>
            <th>title</th>
            <th>title</th>
            <th>title</th>
          </tr>
          </thead>
          <tbody>
          <tr>
            <td>content</td>
            <td>content</td>
            <td>content</td>
            <td>content</td>
            <td>content</td>
          </tr>
          </tbody>
        </table>
```

#Div でテーブル風 2カラム
##イメージ画像
![table3.png](https://qiita-image-store.s3.amazonaws.com/0/132580/4ebe5604-7dde-0963-3a92-80a6db8d1055.png)

##コード
```
div.row>(div.col-sm-4.bg-light.p-2{title}+div.col-sm-8.p-2{content})*4
```
※Bootstrap4を使います。

##展開するHTML
```
        <div class="row">
          <div class="col-sm-4">title</div>
          <div class="col-sm-8">content</div>
          <div class="col-sm-4">title</div>
          <div class="col-sm-8">content</div>
          <div class="col-sm-4">title</div>
          <div class="col-sm-8">content</div>
          <div class="col-sm-4">title</div>
          <div class="col-sm-8">content</div>
        </div>
```
Azure App Services からオンプレミスの Linux 環境へハイブリッド接続

#概要
　[Azure App Service のハイブリッド接続](https://docs.microsoft.com/ja-jp/azure/app-service/app-service-hybrid-connections)は、Service Bus を仲介 (Relay) としてファイアウォールの後ろにあるオンプレミスのリソースに簡単に接続する便利な方法を提供します。


　オンプレミス側には、[ハイブリッド接続マネージャー (HCM)](https://docs.microsoft.com/ja-jp/azure/app-service/app-service-hybrid-connections#hybrid-connection-manager) と呼ばれるリレーエージェントをインストールする必要がありますが、このエージェントがインストールできる環境が Windows Server 2012 以降となっているためオンプレミス側にある Linux 環境には接続できないと勘違いされている節があります。

　実際には、ハイブリッド接続マネージャー (HCM) はオンプレミスのエンドポイントに対する仲介 (Relay) の役割をしており、HCM をインストールした Windows Server からエンドポイントのサービスにアクセス出来れば良い事となります。以下の構成では Windows Server （下記図のオレンジ）に HCM がインストールされており、そこから名前解決できる同一 LAN 内に Linux（下記図の赤枠）サーバーがエンドポイントとしてあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/d4e9ffb7-cc0b-9cee-bf7e-fbc4497e2ffa.png)

#詳細
　Azure App Service のハイブリッド接続の構成は[こちらの手順](https://docs.microsoft.com/ja-jp/azure/app-service/app-service-hybrid-connections#add-and-create-hybrid-connections-in-your-app)となりますが、ここでは下記のように構成したハイブリッド接続を元に説明をしていきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/27281a4b-c59b-abdc-b44d-3052314f43a6.png)

　以下の画面は、ハイブリッド接続マネージャー (HCM) をインストール、構成した Windows Server 2016 になります。この HCM 上で ping で名前解決している MySQL は同一 LAN 内にある Linux サーバーのホスト名となります。 Linux ホストは CentOS で MySQL が稼働しており、この Windows Server からアクセスできる状態にあります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/7e900ba4-12e5-57d6-df12-b4c948b7468e.png)

#動作確認
　上記の状態でクラウド側 Azure App Service に、下記のような PHP コンテンツを配置します。MySQL への接続情報は環境にあわせて修正します。

```php:dbconnect.php
<?php
$mysqli = new mysqli('MySQL', 'root', 'password', 'test');
if ($mysqli->connect_error) {
    echo $mysqli->connect_error;
    exit();
} else {
    echo "Successs : Connect to on-premise MySQL on Linux via HCM.";
}

$mysqli->close();
?>
```

　ブラウザで https://[your app name].azurewebsites.net/dbconnect.php へアクセスし動作を確認します。エラーとなる場合は、HCM 上の Windows Server から、エンドポイントの MySQL への接続が出来るか再度確認してみてください。

#冗長化
　ハイブリッド接続の高可用性が必要な場合は、複数の HCM を個別の Windows Server 2016 ホストで実行します。

#オンプレミス側の FW 構成
　ハイブリッド接続を HCM でサポートするには、HCM ホスト(Windows Server 2016) で以下の接続要件が必要です。

- ポート 80 および 443 経由の Azure への TCP アクセス（outgoing のみ incoming は全て閉じて OK）
- エンドポイント ホストに対する TCP アクセス（今回の例では、HCM から IP:10.0.0.5 Port:3306 へのアクセス）
- エンドポイント ホストおよび Service Bus 名前空間に対する DNS 名前解決

#制限
　動的ポートを使用する TCP ベースのサービスなど、ハイブリッド接続で実行できないことがいくつかあります。

- ドライブのマウント
- UDP の使用
- FTP パッシブ モードや拡張パッシブ モードなどの動的ポートを使用する TCP ベースのサービス
- UDP を必要とする場合があるため、LDAP のサポート
- Active Directory のサポート
Photoshop | EditTextに数字以外の文字を入力できないようにする

```javascript
#target photoshop

var GUI_TEST = GUI_TEST || {};

(function() {
    var layout = "dialog { text: 'GUI TEST', \
        edt1: EditText {text: '数字のみ入力可' } \
        edt2: EditText {text: '数字とカンマのみ入力可' } \
    }";

    // 数字のみ入力を許可する
    var numericEditKeyboardHandler = function(event) {
        var key = event.keyName;
        var keyIsOK = ('0' <= key && key <= '9' && !event.shiftKey) ||
                      key == 'Left'      || key == 'Right'   ||
                      key == 'Backspace' || key == 'Delete'  ||
                      key == 'Home'      || key == 'End'     ||
                      key == 'Tab'       || key == 'Escape';
        if (!keyIsOK) {
            // keydownイベントを受け付けないようにする
            event.preventDefault();
            app.beep();
        }
    };

    // 数字とピリオドのみ入力を許可する
    var decimalEditKeyboardHandler = function(event) {
        var key = event.keyName;
        var keyIsOK = ('0' <= key && key <= '9' && !event.shiftKey) ||
                      key == 'Decimal'   || key == 'Period' ||
                      key == 'Left'      || key == 'Right'  ||
                      key == 'Backspace' || key == 'Delete' ||
                      key == 'Home'      || key == 'End'    ||
                      key == 'Tab'       || key == 'Escape';
        if (!keyIsOK) {
            // keydownイベントを受け付けないようにする
            event.preventDefault();
            app.beep();
        }
    };

    var win = new Window(layout);

    win.edt1.addEventListener('keydown', numericEditKeyboardHandler);
    win.edt2.addEventListener('keydown', decimalEditKeyboardHandler);

    win.show();
}).apply(GUI_TEST);
```
PASCAL VOC 2012のセグメンテーションで使用されているカラーマップ

# はじめに
セマンティックセグメンテーションの学習モデルとして使用されている「[PASCAL VOC 2012](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/)」では、色とクラスが以下のようにマッピングされています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/859c7f75-b983-5c42-6dce-b1f2b4941c0f.png)

これらがどのように決められているのかを書かせていただきます。

# インデックス値とクラスの紐付け
現在の「PASCAL VOC 2012」では20のクラスと1つの背景、および、1つの未設定の合計22クラスが設定されています。
これらはカラーマップのインデックス値と紐づいています。

| インデックス値 | クラス |
|---|---|
| 0 | 背景 |
| 1 | 飛行機 |
| 2 | 自転車 |
| 3 | 鳥 |
| 4 | ボート |
| 5 | ビン |
| 6 | バス |
| 7 | 自動車 |
| 8 | 猫 |
| 9 | 椅子 |
| 10 | 牛 |
| 11 | テーブル |
| 12 | 犬 |
| 13 | 馬 |
| 14 | バイク |
| 15 | 人 |
| 16 | 鉢植え |
| 17 | 羊 |
| 18 | ソファー |
| 19 | 電車 |
| 20 | テレビ |
| 21 | 未設定 |

これらは固定となっています。

# インデックス値と色の紐付け
学習データでは、各ピクセルが上記の値になっているわけではなく、人が見て区別できるような色が設定されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/c1db7918-317e-13e3-0ee2-208dda670236.png)

これらの色とインデックス値は、以下の法則で決まっています。
1. 黒(0,0,0)は0（背景）
2. それ以外は、赤・緑・青のそれぞれの上位ビットから順番に、インデックス値の下位ビットに割り当てる
3. 上記から、255（未設定）は明るいグレーっぽい色(224,224,192)

図で書くとこんな感じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/b3bd6650-1367-0ecf-dfbf-5bff44643e51.png)

具体的には、以下の値が紐づいています。

| 赤 | 緑 | 青 | インデックス値 |
|---|---|---|---|
| 0x00 | 0x00 | 0x00 | 0（背景） |
| 0x80 | 0x00 | 0x00 | 1 |
| 0x00 | 0x80 | 0x00 | 2 |
| 0x80 | 0x80 | 0x00 | 3 |
| 0x00 | 0x00 | 0x80 | 4 |
| 0x80 | 0x00 | 0x80 | 5 |
| 0x00 | 0x80 | 0x80 | 6 |
| 0x80 | 0x80 | 0x80 | 7 |
| 0x40 | 0x00 | 0x00 | 8 |
（以下省略、(224,224,192)：255（未設定）まで設定可能）

※[こちら](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar)で取得できるデータでは、インデックスカラーで指定されているため、いちいちRGBのビットを見て変換とかしなくても、インデックスの値そのまま使えます

# おまけ
PILでインデックスカラーの画像ファイルを読み込むと、そのままインデックス値が取得できる。
OpenCVでインデックスカラーの画像ファイルを読み込むと、RGBに変換されたものしか取得できないので注意。

# まとめ
色とインデックス値の紐付けが分かったので、これで独自データを学習させてセグメンテーションできますね。
（学習データを用意するのがめんどくさいのですが．．．）
Photoshop | DropDownListにアイテムの追加、削除を行う

```javascript
#target photoshop

var GUI_TEST = GUI_TEST || {};

(function() {
    var layout = "dialog { text: 'GUI TEST', \
        ddlst: DropDownList { properties: { items: ['0', '1', '2'] } } \
        txt: StaticText { size: [65, 11], alignment: 'center' } \
        pnl: Panel { text: 'リストの操作', alignChildren: 'fill', \
            btn1: Button { text: '追加', helpTip: 'リストを追加します' } \
            btn2: Button { text: '削除', helpTip: 'リストから１つ削除します' } \
            btn3: Button { text: '全クリア', helpTip: 'リストをすべて削除します' } \
        } \
    }";

    var win = new Window(layout);

    // 最初は1を選択する
    win.ddlst.selection = 1;

    // 追加ボタンが押された
    win.pnl.btn1.onClick = function() {
        var num = win.ddlst.items.length
        win.ddlst.add('item', num);
    };

    // 削除ボタンが押された
    win.pnl.btn2.onClick = function() {
        var len = win.ddlst.items.length;
        if (len > 0)
            win.ddlst.remove(len - 1);
    };

    // 全クリアボタンが押された
    win.pnl.btn3.onClick = function() {
        win.ddlst.removeAll();
    };

    // ドロップダウンリストが選択された
    win.ddlst.onChange = function() {
        win.txt.text = win.ddlst.selection + 'を選択した';
    };

    win.show();
}).apply(GUI_TEST);
```
【Swift】UILabelに全角文字を含めた際に生じるColor Blended Layers

最近、Instrumentsやパフォーマンスに関して色々と調べている中で、発見したことがあったのでメモします。

# Color Blended Layersとは？

レイヤーが重なっている部分で色や透明度が異なる場合、
最終的に画面に表示するピクセルカラーを決めるためにシステムのレンダリングサーバが計算を行います。
これを***Alpha Blending***と呼びます。

これが発生しているレイヤを示したのがColor Blended Layersです。
これ自体は必要なときに使用していれば問題ありませんが、
意図してシステムが計算をしてしまい、フレームレートが下がってしまう場合に問題になります。

Alpha Blendingが発生するのは
alpha、backgroundColor、opaqueといったプロパティや
画像のアルファチャネルなど様々な要素が影響してきます。


# Color Blended Layersを調べる方法

XcodeやSimulatorのDebugメニューから見ることができます。
赤色の部分がColor Blended Layersになっている部分です。

<img width="1283" alt="スクリーンショット 2018-08-03 8.13.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/219965/ccad291a-f6d7-1114-ca02-0bbfbb8c7c15.png">


<img width="1506" alt="スクリーンショット 2018-08-03 7.57.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/219965/00444e76-6d7b-3dbe-15d8-0c39f00ef9a0.png">

赤色になっている部分がColor Blended Layersになっている部分です。
今回の場合は背景色などを特に指定している訳ではないので、
意図せずに生じています。


# 現象の確認

まずは下記のような設定の場合を見て見ます。
対象は画面にあるラベルの中の真ん中のラベルです。

```
statusLabel.text = "aaaaaaaaaaaaaaa"
```

<img width="434" alt="スクリーンショット 2018-08-03 8.03.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/219965/dd5fa389-aa1d-1f0c-5a83-dbb35f51a9b9.png">

上記のようにColor Blended Layersになっています。

これを解消するために以下のようにコードを追加します。

```
statusLabel.backgroundColor = .white
```

すると下記のように解消されます。

<img width="421" alt="スクリーンショット 2018-08-03 8.04.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/219965/39bf2061-c447-13be-9c58-a64a13fa4662.png">

これは背景色がwhiteに対してラベルはデフォルトで背景色が設定されていないため、
色が異なっていたのを修正しました。

※　opacityが異なる場合も発生します。今回は何も設定しないので全て1.0とみなされています。


半角英数字記号などはこれで解決しますが、
***全角文字***が含まれるとまたややこしくなります。

```
statusLabel.text = "スタートを押してね"
statusLabel.backgroundColor = .white
```

<img width="412" alt="スクリーンショット 2018-08-03 8.05.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/219965/5640c461-4731-ca08-20a0-8b4ea4e463c5.png">


なんと、またColor Blended Layersになってしまいました。
色々調べてみると、どうやら全角文字があると、UILabelが自動でsublayerを作成しているらしく、
これがUILabel領域外に表示をしていることが原因のようです。

<img width="1407" alt="スクリーンショット 2018-08-03 8.39.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/219965/d035eeeb-6200-2363-4103-727ff9f7e5d5.png">

ちなみに半角の場合は作られません。

<img width="1282" alt="スクリーンショット 2018-08-03 9.40.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/219965/afcf9020-7c1b-675e-96ac-18bf4e5cf23c.png">


対処法としてはclipsToBoundsをtrueに設定することで解決しました。

```
statusLabel.clipsToBounds = true
```
<img width="425" alt="スクリーンショット 2018-08-03 8.40.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/219965/cc6a1144-f5b6-4847-35cf-974dfbb3f8ee.png">


# 補足

今回はUILabelを対象にしていますが、UIButtonのtitleも同じ現象が起き、同じ対処法で解決しました。

# まとめ

今回はColor Blended Layersの中でもラベルということに焦点を当てましたが、UIImageViewの透過度とUIImageのアルファチャネルの関係などでも同じ現象が起きます。
また、Offscreen renderingといった別の問題もレンダリングのパフォーマンスに影響を与えます。

こういった問題はTableViewやCollectionViewを使用した際に
スクロールがカクツクような現象を引き起こしやすくなりますので気をつけたいですね。

レンダリングの問題はUIViewの色々なプロパティが絡んできて複雑なので、またまとめてみたいと思います。

# 余談

早取りカルタというタイトルは
そもそもカルタが早く取ることを目的としたゲームなので
あまり意味がないですね:innocent:
MacからWindows10へのリモートデスクトップの設定

# はじめに

Mac OSXからWindows10へのリモートデスクトップの設定をします。
Microsoft Remote Desktop10というMicrosoft純正のアプリケーションを使用します。

![スクリーンショット 2018-08-03 11.36.07.png](https://qiita-image-store.s3.amazonaws.com/0/272046/40b8fd88-38e3-e54c-1577-caeb58bce516.png)

# 使い方

アプリをインストール後、立ち上げると以下の画面が出ます。

![スクリーンショット 2018-08-03 11.38.08.png](https://qiita-image-store.s3.amazonaws.com/0/272046/c73fa450-6223-fa47-925a-a1a3abafca33.png)

Add desktopをクリックします。

ポップアップが出力されます。
PC Nameには、Windows10のIPアドレスを入力します。。
※Windows10 PCのIPアドレスを、コマンドプロンプトからipconfigコマンドを利用して把握しておく必要があります。

![スクリーンショット 2018-08-03 11.40.33.png](https://qiita-image-store.s3.amazonaws.com/0/272046/1507f5eb-f5d7-4a4c-83e0-9b91aed56314.png)

以下の画面が出るので、接続したいPCをクリックし、接続を開始します。
※Windows10のリモートデスクトップの設定を許可する必要があります。

![スクリーンショット 2018-08-03 11.50.37.png](https://qiita-image-store.s3.amazonaws.com/0/272046/0944bff6-6c0e-68ed-9abe-e92ea8612d0f.png)

接続するWindows10のUser NameとPasswordを入力します。
![スクリーンショット 2018-08-03 12.25.55.png](https://qiita-image-store.s3.amazonaws.com/0/272046/c2c546d8-27bc-6067-1171-e4b2c70b277f.png)
Qiita投稿画面のような連動スクロールを実装してみた

## はじめに
初Qiita投稿です。エンジニア歴半年でJavaScriptに苦手意識があり避けてきたのですが
社内用のエディターが必要になって、勉強しながら自作エディターを作ることに。

Qiitaの投稿画面のような**連動スクロール**(左の箱に書いた文字を右の箱で反映して、左の箱をスクロールすると右の箱内も自動スクロールされる)の実装でつんだので、
同じ境遇に人の参考＆他にもっといい書き方などアドバイスいただけると嬉しいです。

# 実装方法

## html側
左側は入力するのでtextarea、
右側にtextarea内を反映するdivを作る。

```html
<!-- 同時反映させたいので、キーボードを押した時に反映する関数を仕込む -->
<textarea id="before" onKeyDown="reflectNow()"></textarea>
<div id="after" ></div>
```
## css側
（よしなに…）

```css
#before, #after {
  border:  solid 1px #333;
  width:  50%;
  min-height: 100vh;
  display: inline-block;
  vertical-align: top;
  font-size : 22px;
  padding: 20px;
  box-sizing: border-box;
  height: 100vh;
  overflow: auto;
}
#before {
  background : #333;
  color:  #fff;
  font-size: 18px;
}
```

## JavaScript側

```JavaScript
/* 左側に書いた文字を右側に反映 */
function reflectNow() {
  after.innerHTML = before.value;
}
/* 連動スクロールの処理 */
window.onload = function (){

  // beforeをスクロールした時に発火させる
  before.addEventListener('scroll', function(){
    setTimeout( scr(), 500);
    }, false);
  // カソールの位置が変わって書き始めてもスクロールするように
  before.addEventListener('onkeydown', scr(), false);

  /* スクロール */
  function scr(){
    // before(左)とafter(右)を変数に入れる
    var before = document.getElementById('before');
    var after = document.getElementById('after');

    // beforeとafterそれぞれの高さの現在値を取得
    var beforeScr = before.scrollTop;
    var afterScr = after.scrollTop;

    // afterの高さを取得
    var afterHeight = after.scrollHeight;

    // 全体の高さから現在値の高さをひいて、高さの割合をだす
    var beforeHeight = before.scrollHeight - beforeScr;
    var scrPercent = beforeScr / beforeHeight;

    // beforeのスクロールの割合をafterにかけて、その分だけafterをスクロールさせる
    after.scrollTo(0, afterHeight * scrPercent);
  }
}

```

文字を打った時にbeforeからafterに反映するのは同期させて、
スクロール自体は同時にする必要がないので、setTimeoutを使って処理の負荷を減らしました。

## 最後に
計算が苦手で、割合の出し方をまちがてスクロールするとカクカクするっていう事象にハマっていたのですが、
consoleで割合を見てみたらスクロールの途中から100%超えてて、あれ…ってなりました。
バグってたら１つずつconsoleを入れてみるのが大事だなと思いました。

つまった時、アドバイスしてくださったみなさまありがとうございました！！
JavaおじさんがPythonを使えるようになるまでの全記録（その9）

#文字列、タプル、範囲とリスト
[テキスト](https://www.amazon.co.jp/gp/product/4764905183/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1)の5.5節はタイトルに挙がっている4つの順序型の共通点と相違点の列挙と文字列型の持っている各種メソッドの話なのでスキップ。

#辞書
「5.6 辞書」の説明は読めば読むほど...

- キーの検索にハッシュを用いてキーのサイズに依存しない検索時間を実現する、とか
- for文の反復の変数に割り当てられるのはキーの方である、とか
- 反復のキーの順番は決められていない、とか

完全にJavaのHashMapです。
「辞書に対する主な命令」に挙がってる各種の命令もおなじみなやつばっかりだし。
そう考えると「キーとして使えるのはハッシュ可能な型のオブジェクトのみ」というのは当然に思える。

> Pythonのすべての組み込み不変型はハッシュ可能で、すべての組み込み可変型はハッシュ可能ではない。

というのはたぶんエイリアスの問題で勝手にKeyの内容を変えられたりしたら困るからなんだろうね。

ここで5章は終了。
引き続き6章の「テストとデバッグ」を読む。

#テストとデバッグ
6章は別にPythonやらない人間でも、今まで体系的なテスト理論に触れたことのない人間には役に立つ記述が目白押しになっている。
テストとデバッグに関する簡潔で要点を得た記述がきちんとまとまっているのはさすがと言わざるを得ない。

個人的に特に白眉だと思われるのは「6.2.3 手強い状況では」と「6.2.4 そしてそのバグを見つけたら」だと思う。
「6.2.3 手強い状況では」には通り一遍のデバッグでは見つからないような状況に出くわした場合に状況を改善するヒントが書いてあるし、「6.2.4 そしてそのバグを見つけたら」ではバグを発見したときに短絡的に飛びかかって更なる問題を引き起こさないようにするための心得が書いてある。
個人的に「6.2.3 手強い状況では」の好きなところをいくつか紹介すると...

> - **プログラムがなぜ思いどおりに動かないのか自問することをやめよ、その代わりに、なぜそのように動いているのか自問せよ。**その問いの方がおそらく答えるのは簡単であり、どのようにプログラムを直せばよいかを見定める最初の一歩となるだろう
- **バグは想定したところにはおそらく存在しないと心得よ。**もしそこにあるのならばもっと早くに見つけていたはずだ。どこを見るべきか決めるための1つの現実的な方法は、バグが存在しえないところはどこかを問うことである。
- **ほかのだれかに問題を説明してみよ。**盲点は誰にでも存在するが、問題を誰かに説明しようと試みるだけで、見逃していることが見えてくる場合がよくある。説明を試みる際には、ある特定の場所にバグが存在しえないことを説明してみるとよい。
- **読んだことすべてを信用するな。**とくに、ドキュメントは信じてはならない。コードがコメントどおりに動くとは限らない。
- **いったん手を引き、明日に再び試みよ。**

個人的には最後が一番お気に入りw
しかしコードとコメントの整合性問題は洋の東西を問わないんだなあ...w

というわけでご飯食べるのでいったんここまで。
react-コンポーネント > sortable-list


#### 2018.8.3 現在情報

# コンポーネント

以下のまとめページに書いてあるソート コンポーネントを調べました。
https://github.com/brillout/awesome-react-components#sortable-list

Drag and Dropと機能的に重なる部分もあるので、同時に調べたほうがよさそうです。


# 項目

 - [sortablejs](https://github.com/RubaXa/Sortable) スター数：13985
 - [react-anything-sortable](https://github.com/jasonslyvia/react-anything-sortable) スター数：406
 - [react-sortable-hoc](https://github.com/clauderic/react-sortable-hoc) スター数：5098
 - [react-sortable](https://github.com/danielstocks/react-sortable) スター数：604
 - [bokuweb/react-sortable-pane](https://github.com/bokuweb/react-sortable-pane) スター数：330




## sortablejs
[sortablejs](https://github.com/RubaXa/Sortable)

demo - [Sortable. No jQuery.](http://rubaxa.github.io/Sortable/)

ソートだけでなく、他グループへのドラッグ＆ドロップもできてステキ
ただし、React

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/cc4c5a5d-e104-b4dc-ce10-047561cd9ae8.png)


## react-sortable-hoc

[react-sortable-hoc](https://github.com/clauderic/react-sortable-hoc)

いろんなソートの細かい制御ができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/a17f26c1-3278-798f-bf92-4975f5930f18.png)


## react-anything-sortable
[react-anything-sortable](https://github.com/jasonslyvia/react-anything-sortable)


## react-sortable
[react-sortable](https://github.com/danielstocks/react-sortable) 


## react-sortable-pane
[bokuweb/react-sortable-pane: A sortable and resizable pane component for React.](https://github.com/bokuweb/react-sortable-pane)

こんな使い方を想定とのこと
<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/b/bokuweb/20160131/20160131165555.gif" />
各コマンドのサイズがIEC単位かSI単位かのメモ

# 2進接頭辞
wikipedia 
https://ja.wikipedia.org/wiki/2%E9%80%B2%E6%8E%A5%E9%A0%AD%E8%BE%9E

> 2進接頭辞とSI接頭辞
IEC規格でない旧来の2進接頭辞とSI接頭辞の使い分けは分野や場合によっては曖昧で混乱しており、キロがSI接頭辞の1000であるか2進接頭辞の1024であるかはそれだけではわからない事もある。キロでは双方の差は約2%だが、メガで約5%、ギガで約7%、テラで約10%と乗数が大きくなるにつれその差も大きくなる。俗に、1024にはkではなくKを用い、「ケー」と称するという流儀もある。

~~ちゃんと表記統一しろや~~

ストレージのサイズ調べるのにどっちの単位やねんと思うことがあるので各コマンドの表記と単位をメモした
間違ってたらご指摘ください。

## 環境
CentOS7

# df
## -k もしくはオプションなし
IEC単位。KiB。1K-ブロックの列。

```
# df
ファイルシス   1K-ブロック    使用   使用可 使用% マウント位置
/dev/sda2         52403200 7432604 44970596   15% /
```


## -m
IEC単位。MiB。1M-ブロックの列。

```
# df -m
ファイルシス   1M-ブロック  使用 使用可 使用% マウント位置
/dev/sda2            51175  7259  43917   15% /
```

## -h
IEC単位。表記はG,M,K。

```
# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/sda2         50G  7.1G   43G   15% /
devtmpfs         1.8G     0  1.8G    0% /dev
tmpfs            1.8G  4.0K  1.8G    1% /dev/shm
tmpfs            1.8G   25M  1.8G    2% /run
```

## df -H
SI単位。表記はG,M,k。

```
# df -H
/dev/sda2         54G  7.7G   47G   15% /
devtmpfs         2.0G     0  2.0G    0% /dev
tmpfs            2.0G  4.1k  2.0G    1% /dev/shm
tmpfs            2.0G   27M  1.9G    2% /run
```


# lsblk
IEC単位。表記はG,M。

```
# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 232.9G  0 disk
tqsda1   8:1    0     1G  0 part /boot
tqsda2   8:2    0    50G  0 part /
tqsda3   8:3    0   3.8G  0 part [SWAP]
tqsda4   8:4    0   512B  0 part
tqsda5   8:5    0    10G  0 part /home
sr0     11:0    1  1024M  0 rom
```

# gdisk, sgdisk
IEC単位。表記はGiB,MiBとちゃんと表記してくれる。

```
# gdisk -l /dev/sda
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2099199   1024.0 MiB  8300  Linux filesystem
   2         2099200       106956799   50.0 GiB    8300  Linux filesystem
   3       106956800       114823167   3.8 GiB     8200  Linux swap
   5       114825216       135796735   10.0 GiB    8300  Linux filesystem
   6       135798784       156770303   10.0 GiB    8300  Linux filesystem
```

# parted
IEC、SI両方に対応。
デフォルトだとSI単位。
unit オプションで変更可能。

```
(parted) help unit
  unit UNIT                     デフォルトの単位を UNIT にする

        UNIT は次のうちから選びます: s, B, kB, MB, GB, TB, compact, cyl, chs, %, kiB, MiB, GiB, TiB
```

# ceph
cephは表記がまぎらわしい。IEC規格に準拠していないっぽい。

## ceph df
おそらくIEC単位。表記はG,M,k。

```
# ceph df
GLOBAL:
    SIZE       AVAIL      RAW USED     %RAW USED
    30720M     27434M        3285M         10.70
```
## ceph status
おそらくIEC単位。表記はGB、MB、kBなのでまぎらわしい。

```
  data:
    pools:   3 pools, 156 pgs
    objects: 38 objects, 41259 kB
    usage:   3285 MB used, 27434 MB / 30720 MB avail
    pgs:     156 active+clean
```
## rbd create
http://docs.ceph.com/docs/master/rbd/rados-rbd-cmds/
> rbd create --size {megabytes} {pool-name}/{image-name}

公式でメガバイトとか言ってるけど本当はMiB単位で指定する。

```
# rbd create --size 10240 rbd/rbd_img
```


## rbd info
IEC単位。表記はMB, kBなのでまぎらわしい。

```
# rbd info rbd/rbd_img
rbd image 'rbd_img':
        size 10240 MB in 2560 objects
        order 22 (4096 kB objects)
```

##
1テーブル内にあるデータの別条件を同時に出力する方法。


## 条件
キーデータ1つに対して出力内容が複数あるとき
一括で複数条件に紐付いたデータを取得したい
##対応
縦横変換を使用する

##例〉

| コード  | 種別 | 日付 |
| ------------- | ------------- | ------------- |
| 1  | A  |yyyymmdd1|
| 1  | B  |yyyymmdd2|
| 1  | C |yyyymmdd3|
↓縦横変換↓

| コード  | 種別Aの日付 | 種別Bの日付 | 種別Cの日付 |
| ------------- | ------------- | ------------- | ------------- |
| 1  | yyyymmdd1 | yyyymmdd2 | yyyymmdd3 |

```sql
Select T.コード
,Max(Case when T.種別='A' Then T.日付 Else 0 End) As 種別Aの日付
,Max(Case when T.種別='B' Then T.日付 Else 0 End) As 種別Bの日付
,Max(Case when T.種別='C' Then T.日付 Else 0 End) As 種別Cの日付
From テーブル名 As T
Group By T.コード
Order By T.コード
```

##参考
 [HOME >  データベース > SQL Server >SQL Server>SQLで検索結果を縦横変換する](https://lightgauge.net/database/sqlserver/3847/)
SmartHRのWebhookとzapierを使い従業員情報をSpreadsheetに随時更新したい

私が行いたいことは
-　SmartHRのWebhookとzapierを使い、社員情報の追加、削除、更新などがあった時にスプレッドシートに反映、できないかと考えています。
日々、様々な部門から社員情報のリクエストもらっており、その度にCSV出して、共有している作業を自動化したいという意図です。

素人がやるのは、難しそう
RAMユーザーをMFAで守る！

# はじめに
[AlibabaCloudのRAMユーザーを作ってみる](https://qiita.com/wa-ta-ru/items/ab4dacc67d787e0739fa)
でつくったshinya-furuwataユーザーのログインをMFAで保護をします。

# MFAとは？
Multi Factor Authenticationの略で
多要素認証というものになります。

- エンタープライズ別名
- RAMユーザー名
- RAMユーザーパスワード

この３つが他人に知れ渡った場合など
MFAによってログインを保護します。

1. パスワードによるチェック
2. MFAロチェック

となります。

# RAMユーザーログインにMFAを適用する。
RAMコンソールを開きます。

![8d462e15.png](https://qiita-image-store.s3.amazonaws.com/0/241104/3abdcd65-4dcd-ad54-62d6-1447661bb00d.png)

![8bcc28f2.png](https://qiita-image-store.s3.amazonaws.com/0/241104/49ad8e88-c93f-6cc4-f117-e9ccd3b506e0.png)

![0243f84a.png](https://qiita-image-store.s3.amazonaws.com/0/241104/84fc089e-a8ea-b1c9-8f57-6569a07f91fa.png)

![77b1751f.png](https://qiita-image-store.s3.amazonaws.com/0/241104/6cf27bf3-9877-e763-b095-d902b714496b.png)

![f2107975.png](https://qiita-image-store.s3.amazonaws.com/0/241104/38642bf0-a49d-967e-3642-2298213f30db.png)

これで完了です。

# サインアウトしてログインし直しますと

- エンタープライズ別名
- RAMユーザー名
- RAMユーザーパスワード

![7ccd552d.png](https://qiita-image-store.s3.amazonaws.com/0/241104/9d99ede9-39cb-fc60-6fd0-48963a74b7b3.png)

# まとめ
これで、MFAによってログインが堅牢になりました。
スマホを失くすと大変ですけどネ。

MFAアプリがクラッシュやOSによって起動しないことも考えておくとさらによいです。
OSのアップデートで、問題が起きることも経験してから
私は２つアプリを使ってます。

## Google Authenticator
iOS
[Google Authenticator](https://itunes.apple.com/jp/app/google-authenticator/id388497605?mt=8)

Android
[Google 認証システム](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=ja)

## Microsoft Authenticator
iOS
[Microsoft Authenticator](https://itunes.apple.com/jp/app/microsoft-authenticator/id983156458?mt=8)

Andoroid
[Microsoft Authenticator](https://play.google.com/store/apps/details?id=com.azure.authenticator&hl=ja)
個人学習メモ#14　MonacaのInAppBrowserプラグイン

MonacaでInAppBrowserというプラグインを使い、
アプリ内に別ブラウザで表示する。

プラグインを有効にしてから下記を記入
var test = window.open('URL', '_blank', 'location=no,presentationstyle=fullscreen,toolbar=no');


URL=サイトのURL

_blank=InAppBrowserを開く

location=no =アドレスバーの非表示

presentationstyle=fullscreen =フルスクリーン表示

toolbar=no =ツールバーの非表示（下の戻るボタン）

Monacaは最初、既存のcssやjsで苦しめられました;;
javascriptでcookieのpath属性がブラウザによってはうまくいかない

## document.cookie の path属性

cookieの有効範囲は既定で現在の文書の位置のパスになります。
path属性でパス配下すべてのページでcookieを引き継ぐことができるようになります。

## 嵌ったコード

```
document.cookie = 'hoge=1; path="/"';
```

ドメインの配下すべてのページで同じcookieを引き継ごうとしています。

Mac Safariではうまく行きますが、Windows Edgeでうまくいきません。

## 正しいコード

```
document.cookie = 'hoge=1; path=/';
```

パスを `"` で囲う癖があるので、どうしてもそうしてしまいます。囲う必要がないようです。
Spring Tool Suite(sts-3.9.5.RELEASE)の日本語化手順

# 日本語化した環境

- sts-3.9.5.RELEASE（Windows10)

# 日本語化手順

## Pleiades プラグインのダウンロード

以下リンク先ページの「Pleiades プラグイン・ダウンロード」から自分の環境にあったプラグインをダウンロードする。
http://mergedoc.osdn.jp/

## 日本語化プラグインのセットアップ
ダウンロードしたzipファイルを解凍し、中に入っている「setup.exeへのショートカット」を実行。

「Pleiades 日本語化プラグインのセットアップ」が実行される。

「日本語化するアプリケーション」にSTS.exeのパスを指定し、「日本語化するをクリック」

![image.png](https://qiita-image-store.s3.amazonaws.com/0/259881/6b8ee28c-232e-4b88-1ee4-657275ff31c2.png)


## 日本語化の確認
STSを起動して、日本語化されていることを確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/259881/d6cd3568-ddc7-733c-d8f8-9f270ce7cff3.png)
テストを書くかどうか議論するの不毛だから、どうやってテストを書きやすくするか議論しよう

[スピード感重視なのでテストは書かない。テストはなぜ開発を遅くするか](https://qiita.com/aimof/items/d68bdb347283ee2dbccf)という記事がバズりました。みんなテストについて思うところがあるようだ。テストを書くべきか否かは机上の空論になりがちで不毛なので、どうやってテストを書くか、テストの書き方、について、種を巻いた私が書いておく。
**もっと詳しい方からのお話お待ちしています**。

## 書くこと

テストの書きやすくするためのいろいろ（箇条書き）

## 書かないこと

テストの基本

##  テストファースト

実装ありきでテストを書くのではなく、テストありきで実装を変える。
はっきり言って、テストを考慮せずに実装されたコードは、書き直さずにはテストできない。

そういう点で、テストなしで実装する選択肢は不可逆なので、初期実装では特に注意が必要。

## クリーンアーキテクチャ(DDD)

クリーンアーキテクチャの考え方はテストファーストを語る上で重要。私個人としてはまだクリーンアーキテクチャをマスターしてないが、見様見真似でも劇的に効果がある。

基本的には、レイヤーを分けて、依存関係を一方向に限定すること。特にテストを語る上で重要なのが、インターフェイスをビジネスロジックから分離する点。ビジネスロジックは、使っているストアがmysqlだろうがS3だろうがElasticSearchだろうが、全く感知しない。どんなストアであっても同じように動作する。同様にUIがなんであってもビジネスロジックは感知しない。

何が嬉しいかというと、

* 変更に強い
* テストを書きやすい
* フレームワークやデータストアに依存しない

といった感じ。

クリーンアーキテクチャは、なんも考えない場合に比べてテストコストが遥かに低い。

具体的なやり方は長くなるので調べてくれ。

## TDD

テスト駆動開発は、テストファーストの文脈で一緒に語られやすい手法。ただ、テストファーストとは違う部分もあり、一概には語れない。（なお、上に書いた私のバズった記事では、Learning resources以外の文脈ではTDDについて一切触れていないのに、TDDの記事だと誤解なさった方が多数いた）

基本的な考え方は、タスクをテストとして書いて、先に動かして後からきれいにするという感じ。こちらも具体的な方法は長くなるから調べて欲しい。

注意点は、TDDにおけるテストは開発におけるマイルストーンみたいなもので、実運用する際のテストとは根本的に異なる、という点。TDD時に書いたテストを流用することがあるのは確かだが、「TDDで書かれたテストは実運用に耐えない（からTDDはよくない）」みたいな批判は的外れもいいところ。

よくある批判は、ユニットテストの粒度が細かくなりすぎること。

## 自動化

大切なことなので書いておく。自動で実行できないテストはごくまれにしか実行されない。ちょっとコード書いたらさくっとテストできるのが理想。（状況次第では分単位、時間単位でかかるけど）

想定通りに動いているかどうかを常に担保しておくのは非常に安心感がある。

自動テストの恩恵に預かり、テストいいじゃん、と思ってもらうと、同僚がテストを真面目に考えるようになる。

キーボード・ショートカット設定しておくくらいがちょうどよい。

## スタブとかモックとか

実際に使うのが難しいツール（クラウド上のサービスとか）のそれっぽい偽物を用意して、テストする手法。TDDはモック地獄を生み出しがち、とたまに言われる。
スタブとモックは違うものだけどこちらも調べてくれ。

## まとめ

ぶっちゃけクリーンアーキテクチャの話だけでこの記事の８割は終わっている。設計段階でミスするとどうしようもなくなる。インターフェイスは必ず分離しよう。

前回の記事でテストの習得コストの高さを無視するな、みたいなコメントを頂いたが、技術がないことを開き直るな、と言っておく。

私もまだまだ未熟なので精進します。
EC2(CentOS)でvimを軽率にアンインストールするな絶対にだ

Vimを最新版に更新しようと一旦アンインストールして、罠にドボンした話です。

# 経緯

よくVimを最新版に更新する際に、まず入ってるVimを削除しようということで

```
% sudo yum remove "vim*"
```

がよく載ってるんですけど、これをすると、一気に`sudo`もアンインストールされます。

```
$ sudo
-bash: /usr/bin/sudo: No such file or directory
```
OMG.

# 理由
vimは4つのパッケージなんですけど、

```
% yum list installed | grep vim
vim-common.x86_64                    2:7.4.160-2.el7            @base
vim-enhanced.x86_64                  2:7.4.160-2.el7            @base
vim-filesystem.x86_64                2:7.4.160-2.el7            @base
vim-minimal.x86_64                   2:7.4.160-2.el7            @base
```

このうち`vim-minimal`がvimの最小構成なんですけど、これが`sudo`とセットなので注意。

```
% rpm -q --requires sudo | grep vim
vim-minimal
```

# 結論
もしsudoが必要な環境でvimをアップデートしたい場合は、`yum remove`せずに実施すること。もしsudoが必要な環境でsudoをアンインストールしてしまった場合、どうにもならないのでインスタンスを再作成しましょう。

それかrootで`yum remove`してアップデートしましょう。その場合は、もちろんあとでちゃんと`yum install sudo`でsudoも再インストールしてください。
terraform-landscapeでterraform planのdiffをクッソ見やすく整形する

terraform planのdiff見づらいですよね。

JSONが1行の文字列として扱われてどこがdiffだか分からんかったり。

そこで、landscapeですよ。

https://github.com/coinbase/terraform-landscape


Before 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61152/1dd9e77f-8dfa-ac1f-6723-9fa99644a000.png)


After

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61152/7ef9a603-1c81-7929-eeae-aca699d311ee.png)

クッソ見やすい。

# インストール
Rubyのgemとして配布されています。

```
$ gem install terraform_landscape
```

Macの場合はbrewでインストールできます。私はbrewで入れました。

```
$ brew install terraform_landscape
```

# 使い方

terraform planの出力をパイプで食わせるだけです。使いたいときだけ使えるのが精神衛生上よいです。

```
$ terraform plan | landscape
```

ただterraform planの時間が長かったりすると、planが完了するまで出力を食われてしばらくレスポンスがなくて不安になるので、
個人的には生のplanの出力もteeで画面に出すようにしておくのがよいんじゃないかと思います。

```
$ terraform plan | tee -a /dev/stderr | landscape
```

# おまけ
ちなみに これを書いてる時点(2018/08/03)の最新のTerraformはv0.11系で、本体のリポジトリにもterraform plan見づらいからなんとかしたいってissueはいくつか立ってて、次のv0.12に入るかも？って話があったんだけど、

https://github.com/hashicorp/terraform/issues/15180

issueの流れを見てるとv0.12に入らなさそうな空気感が出てきたので、本体のplanがマシになるしばらくのあいだはlandscape使っておくとよいんじゃないかな。
bash で配列を使うサンプル

bash で配列を使うサンプルです
xlsx を　json に変換するスクリプトの一部です。

```bash
#
pref=(toyama ishikawa shizuoka aichi mie gifu)
jpn=(富山 石川 静岡 愛知 三重 岐阜)
echo ${pref[0]},${jpn[0]}
echo ${pref[1]},${jpn[1]}
#
it=0
for pp in "${pref[@]}"
do
	qq=${jpn[$it]}
	file_xlsx=`ls コード内容別一覧表（医科）$qq*.xlsx`
	echo $file_xlsx
	file_json=$pp"/"$pp"_ika.json"
	echo $file_json
	echo $it,$pp,$qq	
	let it=it+1
done
#
xls を xlsx に スクリプトで変換

xls を xlsx に変換する方法です。

変換元を、ex01.xls
変換先を、ex01.xlsx とすると、

```bash
ssconvert ex01.xls ex01.xlsx
```

Arch Linux でインストールするには、

```bash
sudo pacman -S gnumeric
```

Ubuntu 18.04 でインストールするには、

```bash
sudo apt install gnumeric
```
ラズパイ+BME280でIoT環境センサー構築(その2)

ここではWEBサーバーの構築手順を記載します。

##WEBサーバーの構築
###1.Apache2のインストール
WEBサーバーとしてApache2をインストールする。

```
sudo apt install -y apache2
apache2 -v
```
自宅のLAN内限定ならセキュリティとか関係ないけど、一応お決まりとして、WEBでバージョン表示をしないようにする。

```
sudo vi /etc/apache2/conf-available/security.conf
```

36行目付近を変更する。OnをコメントアウトしてOffを有効にする。

```
ServerSignature Off
#ServerSignature On
```
デフォルトページを非表示にする。ドキュメントルートを確認。

```
sudo vi /etc/apache2/sites-available/000-default.conf
```
"DocumentRoot"で検索すると、/var/www/htmlと記載されているので、ここにあるindex.htmlを削除する。

```
sudo rm /var/www/html/index.html
```
ついでにシンボリックリンクの有効化などの設定をDocumentRootの下に追記する。

```
DocumentRoot /var/www/html
<Directory /var/www/html/>
    Options FollowSymLinks
     AllowOverride All
     Require all granted
</Directory>
```

###2.Apache経由のPHPからsudoコマンドが実行できるようにする。具体的にはsudoにApacheのユーザーであるwww-dataを追加する。

```
sudo visudo
```
一番下の行に、以下を追記。

```
www-data  ALL=(ALL) NOPASSWD: ALL
```

###3.PHPのインストール準備
リポジトリ管理としてdirmngrをインストールする。

```
sudo apt install -y dirmngr --install-recommends
sudo apt update
sudo apt -y upgrade    (必要に応じて)
```
再起動する。

リポジトリを設定。

```
sudo vi /etc/apt/sources.list
deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi

sudo vi /etc/apt/preferences	(新規作成)
	Package: *
	Pin: release n=jessie
	Pin-Priority: 600i
```
リポジトリキーを設定。

```
sudo gpg --keyserver pgpkeys.mit.edu --recv-key CCD91D6111A06851
sudo gpg --armor --export CCD91D6111A06851 | sudo apt-key add -
sudo apt update
```

###4.PHPのインストール

```
sudo apt -y install php
php -v
```
タイムゾーンを設定。
data.timezoneのコメントを外して、Asia/Tokyoを記載。

```
sudo vi /etc/php/7.0/cli/php.ini

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Tokyo
```
Apache2側の設定も同様にする。

```
sudo vi /etc/php/7.0/apache2/php.ini

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Tokyo
```
Apache2を再起動する。

```
sudo service apache2 restart
```

###5.動作確認
PHPのバージョン表示するページを作成して確認する。

```
sudo vi /var/www/html/index.php    (新規作成)

<?php
phpinfo();
?>
```
ブラウザでラズパイのIPアドレスを指定し、PHPのデフォルトの表示が出ることを確認。
http://192.168.0.31/　など
確認後、index.phpは不要なので削除する。

次回、[ラズパイ+BME280でIoT環境センサー構築(その3)](https://qiita.com/hawk777/items/46a912b0762c099e7749)でグラフ表示可能にします。