OmniAICreator/Qiita-1.07M huggingface dataset:
40%キーボード VORTEX CORE のキー配置を思うがままにやってみる

# はじめに
VORTEX COREはキー配置をハードウェアレベルで変更が可能で、使いやすいキー配置に切り替えが可能です。
ですが、販社からでているファームウェアではキーボードのキーを一つずつ押してキーの入れ替えを実施するためかなり手間です。
特に現在のキー配置がどうなっているかわかりにくく、バックアップもできないという。。。

実は製造元のサイトではWEBサイト上でキー配置を作成し、バイナリデータを生成、WindowsマシンからUSB経由で書き換えが実施できます。
しかもFn1レイヤーのキー配置も変更できたりとすこし自由度高めです。
ですがこのサイト、設定内容は吐き出せるのに読み込みが出来ない作りになっており、変更するごとに最初から配置を作り直す必要があります。
コンパクトキーボードという特性上、最初のほうは試行錯誤で何度もキー配置をやり直したいのにセーブができないという。。。

せっかく購入したキーボードなのでなんとかして使いたい！とおもい調査し続けた結果、海外の有志の方が保存もできるキー配置変更サイトを公開しているのを発見しました！
使ってみたところ公式に比べて以下のことができるという優れものでした！

- L0プロフィールのキー配置が変更できる（公式はできない
- レイヤー切り替えキーの場所も変更できる（公式はできない
- Pnキーとの同時押しもカスタマイズできる

そして、これらをもとに自分のある程度納得できるキー配置を作成しました！
まだ試行錯誤中ですが、劇的に使い勝手がよくなりました！
これは広めたいと思って初めてQiitaに記事を書くっていう。。。
なお**ファームウェアのアップデートからキー配置の変更などすべての行為は自己責任でお願いします。
それが守れない人はそっとブラウザを閉じてください。当方では責任を持てません。**

## キー配置の変更
キー配置の変更は以下の手順で実施します。

- キー配置の作成
- ファームウェアの書き換え
- USBモードでキーボードを接続
- バイナリデータのファイルを配置
- キーボードの再接続

有志の人が作成したキー配置変更サイトは以下になります。
[Much Programming Core](https://tsfreddie.github.io/much-programming-core/)

## キー配置変更
上のサイトを開いたらキーボードが表示されていると思います。
右上のProfileから変更したいレイヤーを選択し、変更したいキーを押します。
Fnキーレイヤーなど変更したいキーレイヤーのところをクリックして割り当てキーを変更していきます。

TOOLBOXにはレイヤーのクリアやプロフィールのコピーがあります。
大きく設定変更する場合は大変役に立ちます。
また、LED搭載モデル用にPnレイヤーに照明の変更が割り当てられていますが、これも一括クリアできます。

一通り終わったら右上のGenerate Binary Fileでバイナリデータを取得してください。
またSave as JSONでダウンロードできるファイルはOpen JSONで読み込み可能です。適宜バックアップするとよいです。

![2019-03-27 233312.png](https://qiita-image-store.s3.amazonaws.com/0/66035/98167ce2-a9a4-ec51-7677-7947acd5f659.png)

## ファームウェア書き換え
ファームウェアは公式サイトで手に入るんですが、親切にサイト側にリンクが張ってあります。
MPC FIRMWAREのボタンをクリックするとダウンロードが開始されます。

![2019-03-27 234617.png](https://qiita-image-store.s3.amazonaws.com/0/66035/78bac395-7e05-5a77-c828-a1f7a6a5ebaf.png)

キーボードを接続したままファームウェア更新ソフトを起動し、右上のBin GroupをCORE by MPCにしてOKを押したら書き換えが開始されます。
![2019-03-27 234746.png](https://qiita-image-store.s3.amazonaws.com/0/66035/521f3ee3-0a95-5625-33e3-ae255aad1658.png)

## USBモードでキーボードを接続　～　キーボードの再接続
一度VORTEX COREを外し、FnキーとDキーを押しながら接続するとUSBストレージを認識します
ここにキー配置の項目で作成したバイナリデータを配置します。
最終的に1ファイルのみ配置されているようにしてください（複数ファイルはNGだそうです）

配置したらUSBを外して3秒以上たってから通常接続してください。
これでキー配置の変更は完了です！やったぜ。

# 最後に
これらの作業を最終的にどこかで管理すると再カスタマイズで楽に作業できます。
自分はgithubで管理しています。

最後に自分が行ったキー配置を。
L1プロファイルとL2プロファイルのみカスタマイズしています。
方針としては一番上にファンクションと数字を配置。他は通常の配列を見ながら近しいところに配置しています。
移動やバックスペースはPNキーレイヤに配置しています。
まだ試行中ですがL2レイヤーは結構使いやすいです。
![2019-03-28 000625.png](https://qiita-image-store.s3.amazonaws.com/0/66035/a665237a-ae37-e7cf-abcd-c18a680cde74.png)
![2019-03-28 000645.png](https://qiita-image-store.s3.amazonaws.com/0/66035/7e1da15c-bec6-b0c0-ce68-d37a2624ad6b.png)
GitHubのプルリクで変更情報を非表示にし、修正ファイル一覧が見やすくする

# はじめに
GitHubのプルリク等で変更ファイルが多い場合、最初にどんなファイルが修正されたのかを確認したいです。
ただ、初期表示だと変更情報が表示されて、修正ファイルの一覧が分かりづらいです。
そのため、変更情報を非表示にする方法を記載します。

## 一度に非表示にする方法
右側にある矢印を`option + クリック`する。
※windowsの場合は`Alt + クリック`
<img width="1410" alt="スクリーンショット 2019-03-27 23.44.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/226008/4d3b4788-5674-ee9b-b0a4-2522cb8ab955.png">

変更情報が非表示になり、修正ファイルの一覧が分かりやすくなりました。
<img width="1406" alt="スクリーンショット 2019-03-27 23.45.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/226008/b5fd2f64-1008-f37c-3287-5cd362fa6dd1.png">
ruby で =()がついたメソッドを理解する

**Rubyで `メソッド名=()` とする方法があるのですが、
どういう意味かと、いつ使うかがイマイチ分かっていなかったので纏めました。**

## 普通の`hoge`メソッドの挙動

```ruby
class Test
  def hoge(hoge=nil)
    @hoge = hoge
  end
end

irb(main):023:0> test = Test.new
=> #<Test:0x00007f8f6db18740>
irb(main):024:0> test.hoge('こんにちは')
=> "こんにちは"
irb(main):025:0> test.hoge
=> nil
```
何も疑問はありません。まぁこうなりますよね(笑)

## `hoge=()`メソッド の挙動

```ruby
class Test
  def hoge=(hoge=nil)
    @hoge = hoge
  end
end

irb(main):002:0> test = Test.new
=> #<Test:0x00007f8f72b4baa0>
irb(main):003:0> test.hoge = 'こんにちは'
=> "こんにちは"
irb(main):004:0> test.hoge
NoMethodError: undefined method `hoge' for #<Hoge:0x00007f8c5997bb60>
```

`hoge=()`の時は、ただの呼び出しはできないようです

## `hoge=()`メソッドの挙動パート２

```ruby
class Test
  def hoge=(hoge=nil)
    @hoge = hoge
  end

  def hoge
    @hoge
  end
end

irb(main):065:0> test = Test.new
=> #<Test:0x00007f8f6d3048b0>
irb(main):066:0> test.hoge
=> nil
irb(main):067:0> test.hoge = 'こんにちは'
=> "こんにちは"
irb(main):068:0> test.hoge
=> "こんにちは"
irb(main):069:0> test.hoge = nil
=> nil
irb(main):071:0> test.hoge
=> nil
```

`test.hoge = nil`の時は `hoge=()`が呼ばれて、
ただの`test.hoge`の時は`hoge`メソッドが呼ばれているっぽい。
**追記**
☝️のようになる理由は`test.hoge = nil`の時は `=` の前後に空白はあるのですが、
関係なく、`hoge=()`メソッドが呼ばれたと解釈されているからです。



## `hoge=()`メソッドの挙動パート3

```ruby
class Test
  def hoge=(hoge=nil)
    @message  = "Hello" + " " + hoge
  end

  def message
    @message
  end
end

irb(main):081:0> test  = Test.new
=> #<Test:0x00007f8f72b06608>
irb(main):082:0> test.hoge = 'world'
=> "world"
irb(main):083:0> test.message
=> "Helloworld"
```

ここで、注目したいのが、`test.hoge = 'world'`での返り値が **`"world"`**になっている！
しかし、`test.message`は`Hello world`になっている。
**あくまで`hoge=()`を使った時の返り値は引数になるっぽい！！！**

どうやら調べてみると、下記の様なケースとかで使えるらしい

```ruby

irb(main):084:0> a = Test.new
=> #<Test:0x00007f8f72ae7de8>
irb(main):085:0> b = Test.new
=> #<Test:0x00007f8f72adf170>
irb(main):086:0> a.hoge = b.hoge = 'world'
=> "world"
irb(main):087:0> a.message
=> "Hello world"
irb(main):088:0> b.message
=> "Hello world"
```

一回で、2つ以上の変数に代入することができる！

### まとめ

- 要素代入関数は、代入の様な形の式で関数を呼び出すことができる！ そして、 `=` がない同名のメソッドと使い分けることが出来る！
- 返り値は常に引数の値になる！　つまり　同じ引数を一回で、2つ以上の変数に代入することができる！


**参考にさせてもらいました**
[【Ruby on Rails】＝を使う代入関数。書き方とハマった部分書くけど、使い所わからん。](https://qiita.com/maeko/items/19c5d33cfd7ffef5a9b1)
sshd_configで接続元によって認証方法を変更するための設定

# 前置き

SSHのサーバ側の設定についてです。
Linux端末にSSH接続する時、接続元によってSSHの認証方法を切り替えた時のメモ。

- 環境
  - Ubuntu 16.04.3 LTS
- 編集ファイル
  - `/etc/ssh/sshd_config`

「外部アクセスは公開鍵認証、内部アクセスはパスワード認証」という設定を目指します。
`sshd_config`の基礎的なこと(公開鍵認証の設定方法とか)がわかっていることを前提として記載します。

# Matchによる設定

sshd_configに`Match`を書くことによって、接続元IP、ポート、ユーザなどによって設定を変えることができます。

## 条件が一つの場合

まずは開発端末(1台)からのアクセスを`Match`で分岐させてみます。

```
# パスワード認証を無効にする
PasswordAuthentication no

# 192.168.1.11(開発端末のIP)からのアクセスの場合、パスワード認証を有効にする(上側の設定を上書きする)
Match Address 192.168.1.11
  PasswordAuthentication yes
```

## Matchを複数書く場合

`Match`の範囲は「次の`Match`まで」または「ファイル末尾まで」です。
なので`Match`を`sshd_config`の途中に書くことはできません。

```
Match Address 192.168.1.11
  PermitEmptyPasswords yes # 192.168.1.11からアクセスした時に適用される
Match User ssh_user
  PasswordAuthentication yes # ユーザ"ssh_user"でログインしようとした時に適用される

RSAAuthentication yes # ユーザ"ssh_user"でログインしようとした時に適用される。インデントは関係ない(無視される)
```

## Matchに書く条件が複数の場合

条件はスペース区切りで複数書けます。
IPはカンマ区切りで複数書けます。プレフィックスを使った書き方もできます。

私の場合、「内部アクセスの場合はパスワード認証」とする設定は以下のようになりました。

```
# 二つのポートを有効にする
Port 22
Port 10022

# パスワード認証を無効にする
PasswordAuthentication no

# 内部IPからのアクセスで、さらにポート番号が10022だった場合、パスワード認証を有効にする
Match Address 10.0.0.0/22,192.168.1.0/24 LocalPort 10022
  PasswordAuthentication yes
```

## さらに詳しく知りたい場合

基本的なことはもちろんウェブ検索でわかると思います。

ですが複雑で細かな設定をしたい場合は、SSHサーバで`man sshd_config`と打って、`Match`に関する記述を確認することがおすすめです。
環境によって使える条件が少しずつ違うらしいです(CentOS6とCentOS7では結構違うらしい)。
【Swift4】Timerで任意のインターバルで処理を実行する

カウントした数値を画面に出す機能を作っている際、数値が０からカウントアップして今の数値になるアニメーションを実装したい場面に遭遇しました。

このような一定時間内に任意の間隔で処理を実行する場面はそこそこあるかと思ったので以下のクラスを作成しました。

```swift:CountTimer.swift

class CountTimer {
    
    private var timer: Timer?
    private let interval: Double
    private let execute_time: Double
    private var current_time: Double = 0.0
    
    init(count: Double, interval: Double, closure: @escaping (Double) -> Void) {
        self.execute_time = count
        self.interval = interval
        self.timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(CountTimer.timerUpdate), userInfo: closure, repeats: true)
        
    }
    
    @objc private func timerUpdate(_ timer: Timer!) {
        let closure =  timer.userInfo as! (Double) -> Void
        if current_time < execute_time {
            self.current_time += self.interval
            let percentage = floor(current_time / execute_time * 100) / 100
            closure(percentage)
        } else {
            self.invalidate()
        }
        
    }
    
    private func invalidate() {
        self.timer?.invalidate()
    }
}

```

実行する時間と実行間隔、処理内容のクロージャを渡し、一定の間隔で実行します。クロージャには全体の実行時間に対する現在のパーセンテージが小数点第二位までのDouble型で返すようにしてあります。
以下のように自分は使っています。


```swift:ViewController.swift

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        _ = CountTimer(count: 3.0, interval: 0.1) { percentage -> Void in
            print(percentage)
        }
    }
}
```
実行結果は以下のような感じです。全体3秒の処理を0.1秒間隔で実行しているため、一回につき0.03ずつ(1/30)増えていって、最後に１になっているのが確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/134764/bf5d3638-2b65-f86c-7c80-cc958cf73ac4.png)

冒頭で書いたLabelへのアニメーションは以下のような感じで使っています。値を受け取ったら3秒かけて0.05秒ごとに数値をカウントアップする処理が書けました。

```swift:ViewController.swift
class ViewController: UIViewController {
    @IBOutlet weak var countLabel: UILabel!    

    override func viewDidLoad() {
        super.viewDidLoad()
        
        ...
        
        viewModel?.stepCount.observeNext { (value: Double) -> Void in
            _ = StepTimer(count: 3.0, interval: 0.05) { percentage -> Void in
                let count = value * percentage
                self.countLabel.text = String(count)
            }
        }
    }        
}

```
起動中のrailsコンテナに入るシェルスクリプトのメソッド

起動中のrailsコンテナに入るシェルスクリプトのメソッド

```.zshrc.
function dbash() {
    id=$(docker ps -q --filter "name=web")
    command docker exec -it $id bash
}
```

`name=web` の `web` の箇所は、必要に応じて変更するなどしてください。
もう少し良い条件ありそう。

参考

- [サブシェルで実行したものを変数に格納して使う](https://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d#%E4%BB%8A%E3%81%A0%E3%81%91%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B-mktemp)
- [name フィルタはコンテナ名の全て、または一部に一致するコンテナを表示します。](http://docs.docker.jp/engine/reference/commandline/ps.html#name)
jQueryを使った簡単アコーディオン実装のやり方（複数実装OK）

#アコーディオン実装までの手順
この記事ではタイトル通り、jQueryでアコーディオンを実装するやり方をまとめていきます。複数の実装もできるので、参考にしてみてください。（jQueryを使うので、ファイルの読み込みを忘れずに！）

◯実装までの手順
1. クリック部分とコンテンツ部分を作る
2. コンテンツ部分を隠す+クリック部分に機能を実装

コードだけ知りたいという場合は以下を参考にどうぞ！

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="khomma" data-slug-hash="QoXwjO" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="Code for accordion function">
  <span>See the Pen <a href="https://codepen.io/khomma/pen/QoXwjO/">
  Code for accordion function</a> by Koharu Homma (<a href="https://codepen.io/khomma">@khomma</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#STEP1: クリック部分とコンテンツ部分を作る(HTML, CSS)
まずはHTMLで、クリック部分とアコーディオン機能で表示したいコンテンツ部分を作っていきます。クリック部分をaccordion-clickクラスを持つdivタグで囲み、そのすぐ下のコンテンツ部分をaccordion-contentクラスを持つdivタグで囲みます。また、CSSで好きなようにスタイルもつけておきます。

```html:index.html
	<div id="accordion">
		<div class="accordion-click">
			<p>ここをクリック</p>
		</div>
		<div class="accordion-content">
			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dicta, quod. Fugit excepturi, odit. Doloremque explicabo suscipit dignissimos earum reprehenderit rerum!</p>
		</div>
	</div>

```

#STEP2: コンテンツ部分を隠す+クリック部分に機能を実装（jQuery）
次にjQueryでアコーディオン機能を実装しますが、やることが２つあります。
1. コンテンツ部分をhideメソッドで非表示にしておく
2. クリック部分をクリックした時に、コンテンツ部分がスライド表示されるようにする

まずはコンテンツ部分を```$('.accordion-content').hide();```として、非表示にします。

次にクリック部分の機能を実装していきます。```.accordion-click```がクリックされた時、その次にある要素```.accordion-content```をスライド表示すればいいですね。最終的なコードが以下です。

```javascript:script.js
$(function() {
	$('.accordion-content').hide();

	$('.accordion-click').click(function() {
		$(this).next().slideToggle();
	});
});
```

slideToggle()はアコーディオンが開いているか閉じているかに合わせて、自動で動きを変えてくれる関数です。また、```$(this).next()```でコンテンツ部分を指定するので、アコーディオンを複数に増やした時も対応できます。

#まとめ

以上の数行のjqueryだけでアコーディオンの実装ができちゃうので、ぜひ気軽に試してみてください！
XX is not a functionエラーがどうしても解決しないときの可能性

JavaScriptで、`XX is not a function`というエラーがどうしても解決しないことがあったので、参考になれば幸いです。

## XX is not a functionエラーがどうしても解決しないときの可能性
**セミコロンが絡んでいる可能性があります。**
そのエラーは、次の様な状況で起きていました。
![Screen Shot 2019-03-27 at 23.35.19.png](https://qiita-image-store.s3.amazonaws.com/0/250231/cd3c20df-4fbc-2f58-613c-3dbe283ce764.png)
console.logが関数じゃないだって...!?
これは、一行目にセミコロンが無いからです。
![Screen Shot 2019-03-27 at 23.35.43.png](https://qiita-image-store.s3.amazonaws.com/0/250231/3d41bba8-fff9-6b0e-0d2c-2ab66a1337d6.png)
これなら大丈夫です。
ちなみに、Numberリテラルにメソッド呼び出しを行うときは、`32..toString()`の様にドットを付ける方法もあります。
上の様なセミコロンのエラーが起きないし、簡潔なのでこちらを使う様にしましょう。![Screen Shot 2019-03-27 at 23.39.10.png](https://qiita-image-store.s3.amazonaws.com/0/250231/9c6a34f5-d6be-541e-9e3f-dc9494101b33.png)
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
C#でのデバッグ


# Debugクラス
Debugクラスの下記のメソッドが役立つ。
* Assert()：条件不成立を監視する
* Indent()：インデントする
* WriteLineIf()：条件が成立する時に出力する

# Deguggerクラス
* Launch()：デバッガを起動する

# StackFrameクラス
* GetMethod().Name：メソッド名を取得する

# イミディエイトウィンドウ
* コレクションやプロパティの多いオブジェクトを確認する時に便利

# ブレークポイント：条件式
* 文字列の比較でもブレークできる
　例： exam.Name == "データベーススペシャリスト"
失敗:CoreOSをXFS上にインストールしたいけど

結局起動に失敗。


CoreOS isoをダウンロード。
https://coreos.com/os/docs/latest/booting-with-iso.html

Virtual Boxで起動。
ユーザー名core (パスワードなし）でログイン

```
sudo passwd core
```

てきとうにかえる

sshでアクセス(sshdはたちあがっている）

パスワード作成
CoreOS上で

```
mkpasswd --method=SHA-512 --rounds=4096
```

例:「入力値はcore」

```bash
bash-4.3# mkpasswd --method=SHA-512 --rounds=4096
Password: 
$6$rounds=4096$wJoay94miFr$Dm7ag3dNrhWVe7lBoEwjklJtTs7sBFV1KKz/XPGju/Q6FnkU8iFVZoORJ/TL7Lg9ZJgwv6PoApRUuzBCsfSGu.
bash-4.3# mkpasswd --method=SHA-512 --rounds=4096
Password: 
$6$rounds=4096$B./GBnd5uZ$hJ2lF5YNeFSun5Sd5DJtDww6TwXpi0D6OFMmljUXdiQNFQcczlGsjzmE9lP7vXVnriqrRU3YeMBapdO/DD95./
bash-4.3# 
```
これは毎回違ってもいいのですか...?

ignitionのjsonを書きます。適宜修正してください。

```
vi ign.json
```

```json:ign.json
{
  "ignition": {
    "config": {},
    "timeouts": {},
    "version": "2.1.0"
  },
  "networkd": {},
  "passwd": {
    "users": [
      {
        "groups": [
          "wheel",
          "plugdev"
        ],
        "homeDir": "/home/core",
        "name": "core",
        "noCreateHome": false,
        "passwordHash": "$6$rounds=4096$wJoay94miFr$Dm7ag3dNrhWVe7lBoEwjklJtTs7sBFV1KKz/XPGju/Q6FnkU8iFVZoORJ/TL7Lg9ZJgwv6PoApRUuzBCsfSGu.",
        "sshAuthorizedKeys": [
          "てきぎおきかえてください"
        ],
        "shell": "/bin/bash"
      }
    ]
  },
  "systemd": {},
  "storage": {
     "disks": [{
      "device": "/dev/sda",
      "wipeTable": true,
      "partitions": [{
        "label": "ROOT",
        "number": 0,
        "size": 0,
        "start": 0
      }]
    }],
    "filesystems": [{
      "mount": {
        "device": "/dev/sda1",
        "format": "xfs",
        "wipeFilesystem": true,
        "options": [ "-L", "ROOT" ]
      }
    }]
  }
}

```
正当なものであるか、確認できます
https://coreos.com/validate/

インストール

```
sudo coreos-install -d /dev/sda -i ign.json -v
```

再起動すればめでたしのはずが、journalctlがお出ましして失敗。

#参考文献
https://qiita.com/gasegi/items/2b79eac4110a6ac8972d
https://coreos.com/ignition/docs/latest/
https://coreos.com/os/docs/latest/clc-examples.html
https://coreos.com/ignition/docs/latest/examples.html
http://virtualelephant.com/2017/11/16/infrastructure-as-code-understanding-coreos-ignition/
#参考しなかった文献
https://qiita.com/a-killer-bee/items/564d51034c125d192df3
https://aoshimak.hatenadiary.jp/entry/20170114/p1
VPCエンドポイント経由でaws s3 lsを打っても応答が返ってこない時はregionを指定しよう

#はじめに
AWS CLIを導入して、うまいことAPI叩けるかなーなんてとりあえずaws s3 lsを打ったりしますよね。
しませんか。そうですか。

打ったは良いが応答が返ってこない。
何かの権限が足りてない？
せめてエラーか何か返してよ、と思ったことが最近(1年半前)ありました。

#いきなり結論
「--region <リージョン>」オプションを付けて打ってください。

例）
`aws s3 ls --region ap-northeast-1`

権限足りてなかったりしたら、ひとまずそういう趣旨のエラーが返ってきます。
状況が変わらなかったら、ごめんなさい。

#蛇足
ちなみに、応答が返ってこない状態でも、数分待ってれば以下のようなエラーが返って来ます。
返ってこなかったら、ごめんなさい。

```('Connection aborted.', error(10060, 'A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond'))
```

#原因
CLIコマンドを実行したときに、アクセスする先のS3エンドポイントへの通信が行えないため起こります。
（ちなみに本事象はVPCエンドポイント経由でS3へのアクセスを試みる際に起こることを想定しています。）
（単純にセキュリティグループでアウトバウンドがふさがれている時などに同じ事象が起こるか？昔調べた気がしますが忘れました。優しい方教えてください。）

#補足
VPCエンドポイント経由で通信を行う際には、ルートテーブルにはターゲットにプレフィックスリストID、ゲートウェイにVPCエンドポイントを指定することになります。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpce-gateway.html#vpc-endpoints-routing

>エンドポイントを作成または変更するときは、エンドポイントを通じてサービスにアクセスするために使用する VPC ルートテーブルを指定します。ルートは自動的に各ルートテーブルに追加されて、送信先としてサービス (pl-xxxxxxxx) のプレフィックスリスト ID、ターゲットとしてエンドポイント ID (vpce-xxxxxxxx) が登録されます。その例を以下に示します。

| 送信先       |Target  | 
|-----------------|------------------|
| 10.0.0.0/16            |      ローカル | 
| pl-1a2b3c4d           |    vpce-11bb22cc |


プレフィックスリストIDはリージョン単位でのパブリックIPの集まりを表すものです。例えば東京リージョンのS3が取りうるIPの集まりを表しているとします。この場合、上記のルートテーブルにおいては、東京リージョン以外のS3への通信は定義されていません。リージョンを指定しないでaws s3 lsを打った場合、アクセス先のS3エンドポイントが東京リージョン以外だと解釈されると、うまく通信が行えないため、エラーが生じます。
（aws ls s3を打った時にどこに向けて通信を行うは、OSにより挙動が異なるようです。後述の参考サイト参照。aws configureの実行など、プロファイルでデフォルトリージョンを明示的に指定することでも回避できる事象です。）

#終わりに
事象の切り分けの一助になれば幸いです。
当時自分がハマったのはHTTPプロキシがあったりVPCを跨いだりする構成だったので、泣きたくなりました。

###参考サイト
VPC エンドポイント経由で S3 へアクセスする時の注意点
https://dev.classmethod.jp/cloud/aws/sugano-031-vpc-endpoint-to-s3/

#追記:手動実行だとうまくいくがシステムユーザによる自動実行だとうまくいかない

例えばWindowsのタスクスケジューラにスクリプトを仕込んで、S3向けのスクリプトを定期実行させるような場合。OSユーザでログオンして手動実行するとうまくいくが、ビルトインのSYSTEMユーザにタスクスケジューラで実行させると失敗してしまう。そんなケースに最近ハマりました。

これも根っこは同じで、スクリプト内のS3コマンドでリージョンを明示的に指定しなかったことが原因でした。OSユーザのホームディレクトリ¥.aws配下にConfigファイルがあり、そこでデフォルトリージョンを指定していたため、実行ユーザによって挙動が変わるという状態に陥っていた訳です。

スクリプト内で--regionオプションをつけることで、デフォルトリージョンがなんであろうとそこに通信が向くので、事象を回避できます。

繰り返しになりますが、ここでOS全体の設定としてhttp_proxyを設定していたりすると、さらに切り分けポイントが増えるので困ったりします。（SYSTEMユーザにだけ環境変数が適用されていなかったり。）がんばれ。
失敗:CoreOS Container LinuxをZFS上でインストール:corezfs

dockerのストレージをZFSにすると、管理がしやすいと思うので、ZFSを導入。


このスクリプトで簡単にインストールができる。
https://github.com/varasys/corezfs


容量に十分に空きがあることを確認し、下記のコードを実行。
```
wget https://raw.githubusercontent.com/varasys/corezfs/master/corezfs
sudo ./corezfs install
```
必要なファイルのコンパイルを行ったり、結構時間がかかります。

途中でエラーが出たので諦めた。
EclipseというIDEについて

連日お目汚し失礼いたします。

現在の現場では**NETBEANS**というIDEを使用しているんですが
Eclipseが結構便利だったなぁと感じたところが多くあったので
備忘録ついでに、書き残しておきたいと思います。


### Eclipseとはなんぞや
IDE（統合開発環境）の一つです。
ベテランの方々には受けが悪かったりするようなIDEですが、
私はまだ経験が浅いせいかEclipseが結構便利だなーと感じてます。

統合開発環境とは、
ソースコードを編集することができる**エディタ機能**
ソースコードをバイナリコード（PCが理解できる言語）に翻訳してくれる**コンパイラ機能**
ソースコード同士をリンクさせる**リンカー機能**
できあがったソースコードをデバッグすることができる**デバッガー機能**

いずれも開発現場において必要な機能ですがこれらがすべてまとめて動かしてくれる環境こそ
**統合開発環境**といいます。

Eclipseはその統合開発環境の一つです。

###　Eclipseの便利なところ

1.ナレッジや過去の文献が多い
　ググれば大抵出てきます。

2.個人的にCTRL＋クリックで呼び出し元に飛べるのがすごいありがたい
　　NETBEANSでもできますがNETBEANSが重すぎるのでmachineスペックが必要

3.ショートカットキーが豊富
　下記の記事はすごく参考にさせていただいてます。
　>https://qiita.com/arai-wa/items/c2eb7387b5bf37b4ace4


###不便なところ
　1.重い
　　pleiadesというEclipseの拡張パックみたいなのがあるんですが
　　それを含めて日本語化すると超重力が発動するときがあります。
　　あと起動も重め。
　2.設定が面倒くさい
　　xmlでの設定が慣れるまでちょっと面倒くさい。
　　ここは他のIDEでもあるあるかとおもいますが…。

###　私がEclipseを使用したときに知っておきたかったこと

研修期間からEclipseを使用してましたが、もっと早く教えてよ…
って思ったことをちょっと紹介します。



###ショートカットキー編
**ctrl+e**
タブのリスト表示　複数のタブを開いているときに超便利

**ctrl＋.**
次の警告・エラーにジャンプ。ビルド後にエラーが出たときに便利。
エラーを見落とさずに済みます。

**ctrl＋h　　or alt+a **
grepといってファイルの中身を検索できます。
一回一回ファイル開いて検索して、、、、なんて馬鹿なことはしなくておｋ。

**ctrl＋/**

もしくは　**ctrl +shift+ c**
まとめてコメントアウトできます。
SHIFTキーで範囲を選択してctrl+/でまとめてコメントアウトも可能です。

###そのほかEcllipseの機能編

**デバッグ**
なんで研修の時にこれを教わらなかったんだろうというレベル。
デバッグモードを起動すると、実際にコンパイル、動かしたときに
どのような結果が得られるかがわかります。
例えば、画面側の遷移もそうですが、変数に与えられている値等も確認ができます。
詳細なデバッグの操作方法は先人たちのqiitaに頼んだ

**チーム**
SVN等のバージョン管理システムと結託して、
Eclipse内で更新・チェックアウト・コミットが可能です。
これには設定が必要ですがググれば山ほど方法が出てくるのでここでは割愛。


つらつらと述べましたがまた何かあれば追記していきます。
失敗:Docker on Fedora Atomic hostで特定コンテナの容量制限を柔軟に行ってみた


今までのデータは消えるでしょう。結果として失敗。


#環境
```
Kernel Version: 4.20.15-200.fc29.x86_64
Operating System: Fedora 29.20190318.0 (Atomic Host)
```

```
[root@localhost core]# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.13.1
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
```

#インストール直後でのテスト
```
[root@localhost core]# docker run --storage-opt size=5g -t -i ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
Trying to pull repository docker.io/library/ubuntu ... 
sha256:017eef0b616011647b269b5c65826e2e2ebddbe5d1f8c1e56b3599fb14fabec8: Pulling from docker.io/library/ubuntu
898c46f3b1a1: Pull complete 
63366dfa0a50: Pull complete 
041d4cd74a92: Pull complete 
6e1bee0f8701: Pull complete 
Digest: sha256:017eef0b616011647b269b5c65826e2e2ebddbe5d1f8c1e56b3599fb14fabec8
Status: Downloaded newer image for docker.io/ubuntu:latest
/usr/bin/docker-current: Error response from daemon: --storage-opt is supported only for overlay over xfs with 'pquota' mount option.
See '/usr/bin/docker-current run --help'.
```


```
sudo vi /etc/default/grub
```

GRUB_CMDLINE_LINUX= に「 rootflags=uquota,gquota,pquota　」を追記してください。

```
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot
```

で適用できたが、だめ。

#2

```
vi /etc/sysconfig/docker-storage-setup
```

STORAGE_DRIVER=overlay　とする

```
service docker stop
atomic storage reset
service docker start
```

だめ

#別ディスクを作成、fstabでpquotaを。

```
fdisk /dev/sdc
n Enter... w
mkfs -t xfs /dev/sdc1
vi /etc/fstab
/dev/sdc1 /var/lib/docker xfs defaults,pquota 0 0
service docker stop
#エラー防止
umount -a 
atomic storage reset
service docker start
```
だめでした
#まとめ
XFSでquotaは難しそう。

#Ref
https://www.server-memo.net/centos-settings/system/quota_xfs.html
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_atomic_host/7/html/managing_containers/managing_storage_with_docker_formatted_containers
https://qiita.com/a-killer-bee/items/564d51034c125d192df3
#See Also
https://qiita.com/haniokasai/items/2b7a1889e4930b7682c9
ショートストーリー:RancherOSをVirtualboxで使おう

RancherOSをVirtualboxで使おうと思ったのですが、isoしかないのかなと思い、、、

https://github.com/rancher/os/releases

でも、VirtualBoxで使える、vmdkとvhdがあったので解決。


ｖ1.5.1


```
rancheros-4glte.iso
rancheros-aliyun.vhd->aliyunやVirtualboxで使える
rancheros-cloudstack.img


rancheros-digitalocean.img
rancheros-gce.tar.gz

rancheros-hyperv.iso

rancheros-openstack.img

rancheros-proxmoxve-autoformat.iso
rancheros-proxmoxve.iso->Proxmox Virtual Environmentで提供できる

rancheros-raspberry-pi64.zip->ddイメージ

rancheros-vmware-autoformat.iso
rancheros-vmware.iso
rancheros-vmware.vmdk->Vmwareで使える


rancheros.ipxe
rancheros.iso ->通常のレガシーbios
rootfs.tar.gz

```
始めに

##簡単に

どうも初めまして。ちはたんです。

今回は記念すべき最初の記事......ということで

**私が記事を書こうと思った理由**を説明します。

まあぶっちゃけ単純です。ズバリ

**備忘録**

です。ハイ、これだけです。

##もう少し詳しく

さすがにこれだけではあんまりなのでもう少し。

執筆現在、私は大学3年です。といってももうすぐ4年ですが。

とある大学で情報学部生をやっているのですが、そろそろ皆大好き**卒業研究**が始まるわけです。

以前からネットワークに興味があったため「じゃあ研究もネットワークについてでいいか」なんて言って無事希望の配属が通りました。

研究自体についてはあまり気乗りはしませんでしたが、反面ちょっと楽しみでもありました。だって自分のデスク貰えるんだもの。

そして同研の同期や先輩と顔合わせをして絶望しました。

**周囲のレベルが異様に高い**

まさに絶望です。いや君らおかしいやろ。

何話してるのか全然わからない。あー横文字は使わないでくれ、さっぱりなんだ。

こちとら

- タイピングがまともにできない（今もBackspace押しまくりです）
- まともにコーディングできるのは**C言語**のみ（Python? Ruby? 知らない子ですね）
- Windowsに生きWindowsに死ぬ男（プライベートでLinuxなんて使わんわ、macOSはそもそもMac持ってないし）

だぞ。書いてて悲しくなるね。

まあさすがに極端でしたか。一応講義ではJavaやCLISPなんてのも扱いましたし大学の計算機はLinux環境でした。

とはいえそれだけです。この3年間で**技術や知識がまるで身に付いていない**。

そんな中プライベートでサーバ運用とか普通にやっちゃうようなやべー奴らが集まる研究室に入ったわけです。入っちゃったわけです。

そりゃあ焦りますよ。だってついていけてないんだもの。勉強しなくちゃ。

##結局

長々と書いてきましたが結局は自分が調べたこと、得た知識を書き溜める**備忘録**ってことです。

何かわからないことがあれば当然ググります。そんでなんとなく理解します。

でもそれはすぐに記憶から飛んじゃうんですよね。その場限りというか。

「せっかく調べたのならどこかに書き留めておこう」そう思ったのが今回記事を書こうと思った理由なわけです。

素人の備忘録をわざわざ見に来るような暇人がいるとは思えませんが「あーこんな簡単なことにつまずいてる奴もいるんだなー」とか思って気を楽にしていただけるなら幸いです。
Kerasを使った画像判定AI

# 概要

画像処理をする AI を作ってみたかったので、とりあえず動物の種類を見分けるためのニューラルネットワークを作った。

## 開発環境

- python 3.5

- keras 2.2.2

## 使用したライブラリ

```python

# ニューラルネットワークの定義用のモジュール
from keras.models import Sequential
# 畳み込みやプーリングの処理用モジュール
from keras.layers import Conv2D, MaxPooling2D
# 活性化関数、ドロップアウト処理、データを一次元に返還する、全結合層のていぎ
from keras.layers import Activation, Dropout, Flatten, Dense
# numpyデータを扱うモジュール
from keras.utils import np_utils
import keras
import numpy as np
```

##　識別する画像のラベル

```python

# ラベルの設定
classes = ["monkey", "boar", "crow"]
# 0をmonkey,1をboar,2をcrowとする
NumClasses = len(classes)
# 画像の大きさを50ピクセルとする
ImageSize = 50
```

## 学習モデル

基本的に活性化関数には`relu`,

```python

def model_train(X, y):
    # モデルの作成
    model = Sequential()
    # 第一層の定義
    # 32個の3*3のフィルター
    # 畳み込み結果が同じサイズになるように畳み込む
    # 入力の形を50*50*3(0番目は枚数なので不要)
    model.add(Conv2D(32, (3, 3), padding='same', input_shape=X.shape[1:]))

    model.add(Activation('relu'))
    # 2層目
    model.add(Conv2D(32, (3, 3)))
    model.add(Activation('relu'))
    # プーリングの大きさを2＊2（最大値を取り出す）
    model.add(MaxPooling2D(pool_size=(2, 2)))
    # 25％のデータを捨ててデータの偏りをなくす
    model.add(Dropout(0.25))

    model.add(Conv2D(64, (3, 3), padding='same'))
    model.add(Activation('relu'))
    model.add(Conv2D(64, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    # データを一次元に変換する
    model.add(Flatten())
    # 全結合する
    model.add(Dense(512))
    model.add(Activation('relu'))
    # データを半分にする
    model.add(Dropout(0.5))
    # 出力は3つ（画像が3パターンなので）
    model.add(Dense(3))
    # softmaxを使って確率を計算する
    model.add(Activation('softmax'))
    # 最適化の手法の定義
    opt = keras.optimizers.RMSprop(lr=0.0001, decay=1e-6)
    # モデルの最適化の宣言
    # 損失関数を正解と推定値との誤差を指標にする
    model.compile(loss='categorical_crossentropy',
                  optimizer=opt,
                  metrics=['accuracy'])
    # 一回の学習で32枚、100回学習を行う
    model.fit(X, y, batch_size=32, epochs=100)
    # 結果の保存
    model.save('./animalCNN.h5')

    return model
```

## 評価関数

```python
def model_eval(model, X, y):
    # 学習したモデルを評価する
    scores = model.evaluate(X, y, verbose=1)
    # 結果の表示
    print('Test Loss', scores[0])
    print('test Accuracy', scores[1])
```

## main 関数

学習データは事前に`animal.npy`という形で事前に作っておいた numpy 配列を使っています。

```python

def main():
    # 生成したnumpy配列を読み込む
    X_train, X_test, Y_train, Y_test = np.load("./animal.npy")
    # データの正規化（0～1に収める）
    # 整数を浮動小数点に変換して255で割る
    X_train = X_train.astype("float")/256
    X_test = X_test.astype("float")/256
    # one-hot-vectorに変換する
    # 正解は1,それ以外は0にする
    # [0,1,2]を[1.0.0][0.1.0][0.0.1]に変換する
    Y_train = np_utils.to_categorical(Y_train, NumClasses)
    Y_test = np_utils.to_categorical(Y_test, NumClasses)
    # モデルの学習
    # 学習データとラベルを引数として渡す
    model = model_train(X_train, Y_train)
    # モデルのトレーニング
    # テストデータと学習データを渡す
    model_eval(model, X_test, Y_test)

    plot_model(model, to_file="model.png")
```

## 実行結果

```result
Test Loss 0.9219977560344043
test Accuracy 0.7207207207207207
```
 
できた！！！

#最後に
kerasでモデルの可視化ができるのてやってみました。
![model.png](https://qiita-image-store.s3.amazonaws.com/0/283552/e7d9b235-ef22-014d-95c9-f6800e90c04b.png)
縦に長い...
ハイブリッドプロジェクト開発(二)Node.jsをインストールします

本章では、JavaScriptプロジェクトを作成する前の準備の一つとして、Node.jsをインストルします。

#npmインストル
npmとは、Node.jsに作られたライブラリやパッケージを管理する為のパッケージ管理ツールです。
npmをインストルする前に、Nodebrewをインストルすることが必要です。
Nodebrewは、Node.jsのバージョン管理ツールにあたります。

```
#nodebrewをインストル
brew install nodebrew
#Node.jsとnpmのインストール
nodebrew install-binary latest
```
もし、以下のエラーが出たら、下記のコマンドを実行して、ディレクトリを作成して、npmインストルを再度行います。
curl: (23) Failed writing body (0 != 941)
download failed: https://nodejs.org/dist/v7.10.0/node-v7.10.0-darwin-x64.tar.gz

```
mkdir -p ~/.nodebrew/src
nodebrew install-binary latest
#以下が表示
Fetching: https://nodejs.org/dist/v11.12.0/node-v11.12.0-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully
```
上記のコマンドで最新版がインストールされます。
Node.jsを有効にします。

```
#バージョンの一覧を確認
nodebrew list
#バージョンの一覧が表示
v11.12.0
current: none
#current: noneとなっているため、必要なバージョンを有効化する。
nodebrew use v11.12.0
#バージョンの一覧を再確認
nodebrew list
#以下が表示
v11.12.0
current: v11.12.0
```
nodebrewが使いやすいように環境パスを通します。
インストルした結果を確認します。

```
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
source ~/.bash_profile
#node.jsがインストル済かどうかを確認
node -v
#以下が表示
v11.12.0
#npmがインストル済かどうかを確認
npm -v
#以下が表示
6.7.0
```
上記ような各バージョーンが表示されたらNode.jsのインストールが終わりします。

----
✨✨✨ 次の文章： [ハイブリッドプロジェクト開発(三)Cordovaをインストールします](https://qiita.com/gakuseikai/items/08f32fbaef55b8999309)
逆引きシェルスクリプト（bash）

#### Shebang（シバン）の書き方

* Unix全般で動作するようにPOSIX準拠で記述する場合：`#!/usr/sh`
* Linuxで動けばよい（Bash拡張機能を使いたい）場合：`#!/usr/bin/env bash`

**参考**

* [bashクックブック レシピ15.1 #!に対する可搬性の確認](https://books.google.co.jp/books?id=AnXLs90yU3sC&pg=PA346)
* [POSIXに準拠するためのポイント](https://qiita.com/richmikan@github/items/bd4b21cf1fe503ab2e5c)
* [Bash固有の機能](http://mywiki.wooledge.org/Bashism)

#### シェルオプションを設定する

`set [オプション]`で設定する。よく使うオプションは以下の通り。

| オプション | 説明                                               |
| ---------- | -------------------------------------------------- |
| -e         | コマンド実行がエラーとなった場合に処理を終了する。 |
| -u | 変数展開時に未設定のものがある場合にエラーとする。 |
| -C | リダイレクトで上書きとなる場合にエラーとする。 |
| -a | 変数定義で自動的にexportする。 |
| -v | シェルの入力行を出力する。 |
| -x | トレース情報を出力する。 |

**参考**

* <https://www.atmarkit.co.jp/ait/articles/1805/10/news023.html>

#### オプションと引数を扱う

`getopts `でオプションを読み込んだ後に`shift`して引数を`$n`で取得する。

```bash
# :  デフォルトのエラー処理を(エラーメッセージ表示のみ)を無効化する
# a  引数なしオプション
# b: 引数ありオプション
while getopts :ab: OPT; do
  case ${OPT} in
    a) A=1 ;;
    b) B=$OPTARG ;;
    # : 引数ありオプションに引数が指定されない場合
    # ? 未定義のオプションが指定された場合
    :|\?) echo "usage: ..."; exit 1 ;;
  esac
done

# 最初の引数が$1にセットされるまでシフトする
shift $((${OPTIND} - 1))
```

**参考**

* https://blog.kteru.net/bash-template-for-using-getopts/
* <https://qiita.com/laikuaut/items/adf35ecb14c55f6fde92>

#### 環境変数をファイルから読み込む

`allexport`を有効にして`source`で読み込む。

```bash
set -a; for f in *.env; do . ${f}; done; set +a
```

**参考**

* <https://stackoverflow.com/questions/19331497/set-environment-variables-from-file-of-key-pair-values>

#### ヒアドキュメント

変数に格納するには`cat`を使う。変数展開を無効化するには`<< 'EOS'`、最後の`EOS`をインデントするには`<<- EOS`と記述する。

```bash
VAR=$(cat << EOS
one
two
)
```

**参考**

- https://qiita.com/take4s5i/items/e207cee4fb04385a9952

#### y/N ダイアログ

`read`で標準入力から読み込み、`case`で分岐処理する。

```bash
read -p "...? (y/N): " yn
case "${yn}" in [yY]*) ;; *) exit ;; esac
```

**参考**

* https://dev.classmethod.jp/etc/waiting-for-your-input-with-read-command/

#### ラッパースクリプト

オプションを引き継ぐ場合は`"$@"`で、標準出力と標準エラー出力を加工するには一時ファイルを使う。

```bash
stdout=$(mktemp)
stderr=$(mktemp)
command --option "$@" > ${stdout} 2> ${stderr}

# ここで${stdout}と${stderr}を加工する

echo ${stderr} >&2
echo ${stdout}
rm ${stdout} ${stderr}
```

**参考**

* https://fumiyas.github.io/2016/12/15/positional-parameters.sh-advent-calendar.html

#### 文字列を変数・コマンド名として評価する

`eval`を使う。

```bash
key=a
value_a=b
eval echo '$value_'${e}
```

**参考**

* <https://qiita.com/laikuaut/items/96dd37a8a59a87ece2ea>

#### 配列

* 配列の定義：`array=(空白区切りの要素リスト)`
* 要素の参照：`array[インデックス]`
* 要素の追加：`array=("${array[@]}" 追加要素) `
* ループ：`for e in "${array[@]}"`（インデックスが必要な場合は`for i in "${!array[@]}"`）

```bash
str="a,b,c"
# カンマ区切りの文字列を空白区切りに変換して()に入れると配列にできる。
# （注意：要素に空白が含まれないことが前提）
array=($(echo ${str} | tr ',' ' '))

# インデックスを使ったループ
for i in "${!array[@]}"; do
    echo "${i}: ${array[$i]}"
done
```

**参考**

* https://qiita.com/b4b4r07/items/e56a8e3471fb45df2f59
* http://amano41.hatenablog.jp/entry/bash-for-loop-over-array
ブラウザで動作するJavaScriptのdeepEquals（不完全）を書いたけど、fast-deep-equalを使います

(不完全)と前置きする感じ、弱気である。

雑にdeepEqualsしたい、という要件があったので。
npmにはもちろん上がっているけど、ブラウザでちょっと試しに使いたい感じだったので、ググってすぐ見つからなかったので書いた。

https://jsfiddle.net/upcme7ob/

対応しているのは、null,undefined,number,string,object,array。
（boolean同士がない事に気づく。「こんなん書かなくてもあってるでしょ」とタカをくくって書いてないですね・・・よくない・・・）

2019-03-26時点のモダンなEdge,Chrome,Firefoxでエラーが出てないことは確認。Safari、モバイルは知らない。
雰囲気で適当なテストを書きながら実装してたので、テストしてないパターンありそう。

Functionからインスタンスを作る感じのやつも多分大丈夫だけど、Functionを作ってるようなものは無理かもしれない。
NaNとかSymbolとかは見てない。循環参照も知らない。こちらからすれば、そんな汚いオブジェクトを作る方が悪い。


### 他を見てみましょう

こういう書いた系は、いつもある程度満足いくところまで実装してから他の実装見ています。なぜ逆にしないのか。

#### Node 実装

最初はnodejs実装を参考にしようとしたけど、~~なんかめんどくさそうだったので~~諦めた。

NodeJSの実装は以下。setを持ちまわる感じ、循環参照を考慮してる感はある。Symbolも見てるっぽい。よくわからない。

https://github.com/nodejs/node/blob/5f032a7a269b66d48505869b0ae4fb1db403b118/lib/internal/util/comparisons.js#L548


#### fast-deep-equal

https://www.npmjs.com/package/fast-deep-equal

code: https://github.com/epoberezkin/fast-deep-equal/blob/master/index.js

こちらは1300万DL/weekな実装。テストか何かの依存なんだろうか
何度もオブジェクトを辿らないようにしたり、varを1回で済ませてたり、何度もvarしないように頑張っている感がある。コンパクトだし読みやすい。
export等を削れば自分が用意したテストケースでブラウザ上でも動いた。本番で使うならこっち使います。

#### node-deep-equal

https://www.npmjs.com/package/deep-equal

code: https://github.com/substack/node-deep-equal/blob/master/index.js

こちら600万DL/weekな実装。名前は一番良い。でもDate型とかも見てるし、なんか読みにくく感じてあまり見てない。


他にもあるみたいだけどどんぐりの背比べのような気がしたので見てない。

真のdeepEqualsを見せてくれる方を募集しております。
【JavaScript】関数【自己学習】

##関数でできること
関数を使用することで、1つの変数や定数に複数の処理をまとめて代入することができる。また、呼び出し元から値を受け取り、処理の結果を返すことができる
##関数の書き方
####関数を定義する
`function ()`と書き、中括弧({})内にまとめたい処理を書くことで関数を定義することができる。

```function-1.js
const introduce = function() {
  console.log("私の名前は山田太郎です");
  console.log("年齢は１８歳です");
};

introduce();  //私の名前は山田太郎です
              //年齢は１８歳です
```

関数を呼び出し、処理を実行するには、`変数or定数名()`と書く。`console.log()`は必要ない。

####アロー関数
ES6から、`function()`を`() =>`と省略できるようになった。この書き方はアロー関数と呼ばれる。

```function-2.js
const introduce = () => {
  console.log("私の名前は山田太郎です");
  console.log("年齢は１８歳です");
};

introduce();  //私の名前は山田太郎です
              //年齢は１８歳です
```


####引数での値の受け取り
関数では呼び出し元から値を**引数**として受け取り、それらを処理に利用することができる。

```function-3.js
const data = (name, birthplace) => {
  console.log(`氏名: ${name} 出身地: ${birthplace}`);
};

data("鈴木一郎", "東京");  //氏名: 鈴木一郎 出身地: 東京
data("山田花子", "大阪");  //氏名: 山田花子 出身地: 大阪
```
上記のコードでは、data関数の呼び出し元の２つの値をそれぞれ`name`と`birthplace`という引数として受け取り、処理内で利用している。

引数が受け取る値は、呼び出し元の値が書かれた順番に対応していることに注意する。

####戻り値
関数の中に`return`と書くことで、処理された結果の値を呼び出し元に返すことができる。

```function-4.js
const triangle = (base, height) => {
  return base * height / 2;
  console.log("三角形の面積");  //出力なし
};

triangle(3,6);  //出力なし

console.log(triangle(4, 7));  //14

const triangleArea = triangle(5, 8);  //戻り値は代入可能
console.log(triangleArea);  //20
```
関数triangleは呼び出し元のtriangle(3,6)の値を引数として受け取り、returnで指定したbase * height / 2の処理の結果である9という値を呼び出し元に戻り値として返している。

returnで戻り値を返した時点で関数内の処理は終了する。そのため、returnより下の行に書かれた
処理は実行されない。

呼び出し元のtriangle(3,6)は戻り値に置き換わり、４という値となるため、そのままではコンソール上では出力されない。戻り値をコンソール上で出力するためには`console.log(呼び出し元)`と書く。

戻り値が返された呼び出し元は、変数や定数に代入することもできる。
[AWS]Athenaのコメントアウトの仕方とフォーマットについて

# ■概要
- AWSのAthenaのコメントアウトの仕方と、フォーマットについて紹介する

# ■Athenaのコメントアウトの仕方

~~~
/* コメント記入 */
~~~

上記のように「/\*」と「\*/」で囲んだ部分がコメントとなります。

# ■Athenaのフォーマットについて

Athenaは「Presto」ベースのマネージドサービスです。

なので、Athena上で関数など使いたい場合は下記のリファレンスを参照してください。
(大概のものは揃っているので、是非下記を参考にしてください。)

https://prestodb.github.io/docs/current/

# ■最後に
以上、フィードバックやご指摘等いただけると大変ありがたいです!!よろしくお願いいたします!!
HttpSession session = request.getSession();とは

プログラミング初心者です。
今回は、.getSessionについてアウトプットさせていただきます。

#Q1: .getSessionメソッドとは?
####A: セッションを開始させる処理です。
（例）ユーザーのログイン認証処理が終わった後。
#Q2: セッションとは?
####A: プログラムにアクセスした際、1回のアクセスで行われる一連のやりとりのこと
#Q1: セッションを開始させる処理があるのなら終了させる処理もいるんじゃなのか？
####A:要ります。
（例）ユーザーがログアウトした後
[書き方]
**session.invalidate();**
これだけです。




※間違い等ありましたらコメントから教えていただけると幸いです。※
nuxtでreset CSSを記述する場所がわからなかった話(修正版)

# 前回の記事

こちらの記事にコメントで指摘、編集依頼を受け
実践してみてこっちの方がいい！って思ったので修正版を今回は書きます
https://qiita.com/nuxt_suco/items/63797a54a2b09e07efaa#comment-f81740c831acd1c11bf9

# いただいた2つのコメント
>
個人的にはnuxt.config.jsの中に書く。
1.assets/style/reset.scssを作り、中にreset.cssを入れる
2.nuxt.config.jsの中でcssを取り込む
>
globalなものであれば、[ここ](https://github.com/nuxt/create-nuxt-app/blob/master/template/nuxt/nuxt.config.js#L54)に入れておくといいかなと
>
先に、nuxt.config.jsの内容が読まれたあとに、.vueファイルの内容を読むみたい

---
>
layouts/default.vue内で読み込んだCSSはページコンポーネント内でlayoutプロパティが省略されていれば読み込まれます。
しかし、404ページなど他のページとはレイアウトの構成が変わるようなページで、新しく「layouts/error.vue」のようなテンプレートを作った場合には引き継がれません。
なのでやっぱり全体に効かせたい場合にはnuxt.config.js内に記述するのがいいですね！

なるほど？ってことは、nuxt.config.jsに記述されてる方が優先度高いんだ！
とりあえずやってみよ

# reset.cssをassets配下に置く

aseetsディレクトリーのなかにstyleディレクトリーを作り
assets/style/reset.css

# nuxt.config.jsの中でreset.cssを取り込む

```
  css: [
    '@/assets/style/reset.css'
  ],
```

# 取り込んだreset.cssをdefault.vueで呼ぶ

```
<style>
@import "./assets/style/reset.css";
</style>
```
これで無事適応されました！
他にもdefaultで適応させたいものがあれば複数のcssファイルを
1つのcssファイルにまとめたものを呼べば大丈夫です！

# 今回参考にしたリンク先
[nuxt.config.jsでのcssの取り込み方について]
https://github.com/nuxt/create-nuxt-app/blob/master/template/nuxt/nuxt.config.js#L54

https://ja.nuxtjs.org/api/configuration-css/
vscode のキーバインドにmacのカーソル移動を設定する

## macのカーソル移動のショートカット  
最近知ったのですが、macでは`ctrl`+`f` or `b`で前後にカーソル移動できます。  
  
| コマンド |   動作   |  
|:-------:|:-----------:|  
| ctrl + f | カーソル右に移動|
| ctrl + b | カーソル左に移動|  
| ctrl + e | カーソル行の末尾に移動|
| ctrl + a | カーソル行の先頭に移動|  

今まではキーボード右下の矢印キーを使って移動していたのですが、このショートカットを知ってから全く矢印キーを使わなくなりました。  
  
理由はたったひとつ・・・  
  
**ホームポジションから手を動かさなくて済む！！！**  
  
これに尽きます。  
  
矢印キーでのカーソル移動だとどうしてもホームポジションから手を動かさなくてはならないんですよね。しかも意外とこれがストレスだったりします。  
  
このショートカットを知ってからタイピングでのカーソル移動のストレスがかなり減りました！  
  
## VSCodeでもこのカーソル移動がしたい  
やはりコーディングの時にこのカーソル移動がしたいので、vscodeのキーバインディングの設定をしました。    
  
単なるカーソル移動はキーボードショートカットの設定から行うことができました。しかし、`shit`+このカーソル移動による文字選択の設定項目が見つかりませんでした。  
  
これを設定するには、vscodeの`keybindings.json`ファイルに直接書き込む必要があります。
  
設定はとても簡単。以下のjson形式の記述を`keybindings.json`に追記するだけ。  
  
```keybindings.json  
{
    "key": "ctrl+shift+n",
    "command": "cursorDownSelect",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+shift+p",
    "command": "cursorUpSelect",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+shift+f",
    "command": "cursorRightSelect",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+shift+b",
    "command": "cursorLeftSelect",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+shift+a",
    "command": "cursorHomeSelect",
    "when": "editorTextFocus"
  },
  {
    "key": "ctrl+shift+e",
    "command": "cursorEndSelect",
    "when": "editorTextFocus"
  }  
```  
   
  
これで`shit`+`ctrl` + `f or b or e or a`での選択が可能となりました。  
  
べんり〜〜
[TIPS]Windowsで「環境変数」ウィンドウを一発で出すコマンド ～Win10,Win8,Win7対応～

# 一発で環境変数ウィンドウを起動する方法

(1) **Windowsキー** ![image.png](https://qiita-image-store.s3.amazonaws.com/0/170905/aa0d0bb7-f3d7-3926-1179-a197e878515b.png) + **R**を押して **ファイル名を指定して実行** ダイアログを出す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/170905/44e1e302-c46d-8ff5-d09a-a8357320a0bf.png)

(2) 以下のコマンドを**ファイル名を指定して実行**ダイアログに打ち込んでエンター

```shell
rundll32 sysdm.cpl,EditEnvironmentVariables
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/170905/ee61ef39-1a5a-df67-625e-7c5d0eb03578.png)

**環境変数**ウィンドウが表示された！
<img src="https://qiita-image-store.s3.amazonaws.com/0/170905/58425067-f9f3-398a-98c6-098f15b8705c.png" width="400px">

# 補足
- 実行にはAdministrator権限が必要です
- コマンドプロンプトからでも行けます
NumPyに入門 その１

## NumPyとは
Python用の行列計算ライブラリです。
大量のデータを効率的に計算できるような機能が充実している。
ディープラーニングをするにはほぼ必須のライブラリです。
Windows / macOS / Linux 同じように使えます。

---

## NumPyの使い方


```.py
pip install numpy / pip3 install numpy
python3
>>> import numpy as np
```

以降 np.* で使用します。

---

## データの初期化

１次元の場合

```.py
>>> a = np.array([0, 1, 2])
>>> a
array([0, 1, 2])
```

２次元の場合

```.py
>>> b = np.array(([0, 1, 2] , [3, 4, 5]))
>>> b
array([[0, 1, 2],
       [3, 4, 5]])
```

---

## データ同士の加減乗除
```.py
>>> a = np.array(([5, 3, 8]))
>>> b = np.array(([2, 1, 3]))

>>> a + b
array([ 7,  4, 11])
>>> a - b
array([3, 2, 5])
>>> a * b
array([10,  3, 24])
>>> a / b
array([2.5  , 3.  , 2.66666667])
```

---

## 初期値

標準分布に従う乱数を生成

```.py
>>> np.random.randn()
0.6971069597047708
>>> np.random.randn(2, 5)
array([[ 0.06724173,  0.81443565, -1.40231797, -1.03814878,  1.52165979],
       [-0.53434462, -0.08328142,  0.20409356,  2.44858899, -1.92150623]])
```

---

## スカラへの変換

```.py
>>> c = np.random.randn(2, 5)
>>> c
array([[ 1.26717607, -0.53133061,  0.3109047 ,  0.12309104, -0.53160679],
       [ 0.93251521,  0.79879362,  1.80839388,  0.05681128,  0.3855707 ]])
>>> c.sum()
4.620319089229713

```

---


動画で説明を作りました。よかったらご覧ください。
https://youtu.be/TTx2E_6MQwE
HttpServlet()のメソッドについて

プログラミング初学者です。
今回はHttpServletのメソッドについてアウトプットさせていただきます。
#HttpServletのメソッドの概要
・protected void doGet(HttpServletRequest request,HttpServletResponse response)
・protected void doPost(HttpServletRequest request,HttpServletResponse response)
・protected void doPut(HttpServletRequest request,HttpServletResponse response)
・protected void doHead(HttpServletRequest request,HttpServletResponse response)
etc....
これらはHTTPメソッドをServletで受け取りたい時に書く必要があるものです。
HttpServletのメソッドを記述することによってServlet にHTTPリクエストを処理可能にさせるため、(service メソッド経由で)サーバによって呼び出されます。

例えば、
ユーザーの新規登録でユーザーの情報をDBに保存したいだけの場合はHTTPメソッドはPOSTになると思うので、
Servletには、
**protected void doPost(HttpServletRequest request,HttpServletResponse response)**
を記述し、その中に処理を書き込む必要があるということです。
#なぜHttpServletのメソッドを記述する前に**@Override**を書かないといけないのか？
正直ちゃんと理解はしておらず雰囲気だけわかった状態なので説明が書いてあるURLを以下に貼っておきます。
[@Overrideについて](http://mergedoc.osdn.jp/tomcat-servletapi-5-ja/javax/servlet/http/HttpServlet.html)
このページの冒頭らへんに、
> Web サイトに適した HTTP Servlet を生成するために、サブクラス化を前提とする抽象クラスを提供します。 HttpServlet のサブクラスでは、少なくとも、以下に挙げられている１つのメソッドをオーバーライドする必要があります。
>> doGet メソッド, Servlet が HTTP GET リクエストをサポートする場合
doPost メソッド, HTTP POST リクエストをサポートする場合
doPut メソッド, HTTP PUT リクエストをサポートする場合

と書いてあると思います。ここが理由となっているので読んでみてください。

毎回かなりふわっとした内容になっております。すみません
また、改善点や間違っている場所等ありましたら、恐れ入りますがコメントから教えていただけると幸いです。
DockerでSpringBoot+Mongoなアプリケーションを立ち上げる

# 目標

SpringBoot+MongoDBなアプリケーションをDockerで起動するサンプルを作る。

# リポジトリ

https://github.com/iwanagat85/spring-boot-docker

# 構築

### docker-compose.yml

```yml:docker-compose.yml
version: '3.1'

services:

  mongo:
    image: mongo:latest
    volumes:
      - ./mongodb/data/db:/data/db
      - ./docker-entrypoint-initdb.d/:/docker-entrypoint-initdb.d/
    command: ["mongod", "--smallfiles", "--logpath=/dev/null"]

  example-application:
    build: ./
    image: iwanagat85:example-application
    volumes:
      - ./logs:/app/logs
    ports:
      - 8080:8080
    depends_on:
      - mongo
    restart: always
    links:
      - mongo
```

### Dockerfile

- MongoDBの立ち上がりまでアプリの起動を待つために[Docker公式](https://docs.docker.com/compose/startup-order/)に書いてあったスクリプトを参考に。
- Gradleで `./build/libs` にスクリプトをコピーする方法も考えたけど、RUNで出力するほうが性に合った。

```dockerfile:Dockerfile
FROM openjdk:8-jdk-alpine

WORKDIR /app

COPY ./build/libs /app

RUN : "make wait.sh" && { \
  echo "#!/bin/sh"; \
  echo "# wait.sh"; \
  echo ""; \
  echo "set -e"; \
  echo "HOST_NAME=\${1}"; \
  echo "host=\${HOST_NAME%:*}"; \
  echo "port=\${HOST_NAME#*:}"; \
  echo "shift"; \
  echo ""; \
  echo "cmd=\"\$@\""; \
  echo ""; \
  echo "while !(nc -z \${host} \${port}) ; do"; \
  echo "    echo \"Waiting \${host}:\${port} to initialize...\""; \
  echo "    sleep 2"; \
  echo "done"; \
  echo ""; \
  echo ">&2 echo \"Executing command: \${cmd}\""; \
  echo "exec \${cmd}"; \
} | tee /app/wait.sh


CMD ["sh", "wait.sh", "mongo:27017", "java", "-jar", "spring-boot-docker-1.0.0-SNAPSHOT.jar"]
```

### build.gradle

- Gradleでイメージの作成を行う。
- 最初はDocker内でclone→buildしてみたけど、イメージのサイズが信じられないくらい膨れ上がったので止め。
- `--no-cache` や `--force-rm` を入れてもいい。

```
task execDockerCompose(type: Exec) {
    commandLine 'docker-compose', 'build', '--force'
}

task buildDockerImages(group: 'build', type: GradleBuild) {
    tasks = ['clean', 'build', 'bootJar', 'execDockerCompose']
}
```

### ディレクトリ構成

```bash
.
├── .dockerignore
├── .gitignore
├── Dockerfile
├── build.gradle
├── docker-compose.yml
├── docker-entrypoint-initdb.d
│   └── init.js
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    └── test
```

# 実行

```bash
$ ./gradlew buildDockerImages
$ docker-compose up
```

# その他

- 開発中は`mongo`を`hosts`に`127.0.0.1`として登録して、mongoだけ立ち上げていた。
- もっと他に良い方法がありそう。
SpringBoot入門...いいから動確だ！

## このページについて
生まれて初めてSpringBootを使うよ！
理屈は動かしてから勉強するよ！
そんなコンセプトのための、動作確認に絞ったページです。

---
## そもそもSpringBootって何？
Javaにおけるフレームワークのひとつ。
従来のSpringでありがちだった設定ファイルの混沌を解消しており、人気を集めている。
参考：https://eng-entrance.com/java-springboot

---
## 開発方針と準備
HelloWorld的なWebプロジェクトを作ってみましょう。
DBとも接続だけはやってみましょう。

|環境|サービス/バージョン|
|:--|:--|
|実行環境|Windows10|
|開発環境|eclipse Oxygen.2 Release (4.7.2) Java版|
|開発言語|Java 8|
|Framework|SpringBoot 2.1.3|
|DB|PostgreSQL 10||

---
## インストールについて
各種インストールは先人の知恵を参照ください。
SpringBootのプラグインはeclipse内のマーケットプレイスから取ってきましょう。
Postgresも初期設定のままポチポチインストールでOK。

* eclipse
    * https://qiita.com/nenimigi/items/48fcf6f4c9408820266d
* SpringBoot
    * https://qiita.com/shottotto/items/a770db0ed71dc7c5c744
* PostgreSQL
    * https://www.postgresql.jp/download

---
## プロジェクトを作成する

１．eclipse→ファイル→新規→その他 で新規PJのウィザードへ進む
２．SpringBoot→Spring スターター・プロジェクトを選択
３．名前やパッケージングを適当に設定して次へ
※ビルドツールはGradleを選択（後々に作成予定のページもGradle前提になります）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/385780/0650d5dc-bd7f-3ebe-8692-05434071a31d.png)

---
４．依存関係（使いたいプラグイン）を定義
※後から追加出来ます

|追加|概要|
|:--|:--|
|DevTools|プログラムを更新した際に自動で再起動してくれる開発者に優しい奴|
|PostgreSQL|Postgres接続用のパッケージ|
|Thymeleaf|サーバの値をHtml(ビュー)へ良い感じに渡してくれる良い奴|
|Web|Webアプリケーションにしたい場合に入れる|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/385780/0b64cde5-19e0-bd53-1d96-03ed676ebe65.png)

---
こんな感じでプロジェクトが生成されると思います。

|主なもの|概要|
|:--|:--|
|src/main/java|ここにコントローラを配置する|
|src/main/resources|templatesにビュー(html)を配置する|
|application.properties|DBの接続情報を設定する|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/385780/cae94a8c-a425-8503-b978-ada707249410.png)

---
## ビューとコントローラを配置する
src/main/java配下のパッケージ内に作成

```java:SampleController.java
package ※パッケージ名※

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class SampleController {
	@RequestMapping("/index")
	public String index() {
		return "index";
	}
}
```

src/main/resources/templates内に作成

```html:index.html
Hello World!!
```

---
## DBと接続する
１．PostgreSQL側に適当なスキーマを立てる
適当な方法で実施する。
例：pgAdminを起動、左のメニューからCreate
![image.png](https://qiita-image-store.s3.amazonaws.com/0/385780/953bd844-25b2-6583-c8ba-aef4afe473df.png)

---
## プロジェクト側に設定を記述する
本記事では接続だけ。DAO制作は別の機会に。

```properties:application.properties
<!-- Postgres property -->
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/※スキーマ名※
spring.datasource.username=※設定したPostgresユーザ名※
spring.datasource.password=※設定したPostgresパスワード※
```

---
## 実行してみる

* 「実行」→「実行構成」→「Spring Boot アプリケーション」から新規構成を作成
* 「名前」「プロジェクト」「メイン型」に作成したPJを設定して実行！
* ブラウザから「http://localhost:8080/index」にアクセス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/385780/a7fbc88e-5a7d-8623-e24d-0032d3244c99.png)

---

無事にHelloWorldが表示されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/385780/b345960c-ff03-5c0f-16f1-4032906f8cfd.png)

---
## 付録：参考記事
双頭であるアノテーションとビルドツールから読もう！
以下の記事などが参考になりました。

 * https://qiita.com/TEBASAKI/items/267c261db17f178e33eb
 * https://qiita.com/vvakame/items/83366fbfa47562fafbf4
dockerfile

vi Dockerfile

```Dockerfile:Dockerfile
# ベースとなるイメージを指定する
FROM ruby:2.5

# コンテナ上のワーキングディレクトリを指定する
WORKDIR /usr/src/

RUN useradd -m batch
# ディレクトリやファイルをコピーする
# 左側がホストのディレクトリ、右側がコンテナ上のディレクトリ
COPY ./sample.rb /usr/src/sample.rb
USER batch
COPY --chown=batch:batch ./test /usr/src/test

# "docker build"時に実行される処理
RUN echo "building..."

# "docker run"実行時に実行される処理
#CMD ruby sample.rb
```

```shell-session:hostOS
TakahashinoMacBook-Air:ReactSample-master $ docker build -t sample-image .

TakahashinoMacBook-Air:ReactSample-master $ docker run -it sample-image "/bin/bash"
```


```shell-session:docker
batch@ab0a0fe33254:/usr/src$ ls -al
total 16
drwxr-xr-x 1 root  root  4096 Mar 27 12:49 .
drwxr-xr-x 1 root  root  4096 Mar 26 12:00 ..
-rw-r--r-- 1 root  root    13 Mar 27 12:43 sample.rb
drwxr-xr-x 2 batch batch 4096 Mar 27 12:49 test
```