OmniAICreator/Qiita-1.07M huggingface dataset:
Leetcode #109: Convert Sorted List to Binary Search Tree

Solution 1: convert a linked list into an array

```swift
func sortedListToBST(_ head: ListNode?) -> TreeNode? {
    var nums = [Int]()
    var node = head
    while(node != nil) {
        nums += [node!.val]
        node = node!.next
    }
    return sortedArrayToBST(nums)
}

func sortedArrayToBST(_ nums: [Int]) -> TreeNode? {
    if nums.isEmpty {
        return nil
    }
    let index = nums.count / 2
    let node = TreeNode(nums[index])
    if index == 0 {
        node.left = nil
    } else {
        node.left = sortedArrayToBST(Array(nums[0..<index]))
    }

    if index + 1 < nums.count {
        node.right = sortedArrayToBST(Array(nums[(index+1)...]))
    } else {
        node.right = nil
    }
    return node
}
```

Solution: use two-pointers method to find the middle element of linked list and then do the recursion

```swift
func sortedListToBST(_ head: ListNode?) -> TreeNode? {
    guard let head = head else {
        return nil
    }
    return sortedListToBST(from: head, to: nil)
}

func sortedListToBST(from head: ListNode?, to tail: ListNode?) -> TreeNode? {
    if head === tail {
        return nil
    }
    var fast = head
    var slow = head

    while !(fast === tail) && !(fast?.next === tail) {
        fast = fast?.next?.next
        slow = slow?.next
    }
    
    let root = TreeNode(slow!.val)
    root.left = sortedListToBST(from: head, to: slow)
    root.right = sortedListToBST(from: slow?.next, to: tail)
    
    return root
}
```
ssh接続を簡単にする -Mac-

# はじめに

[こっちの記事](https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1)の方が圧倒的に詳しく書いてます。
僕の記事はどれもいつもやる事のメモです。あしからず！

# sshの設定ファイルを開く

公開鍵認証をしている人は既にこのフォルダがあると思います。
※Macの公開鍵認証のせってい[はコチラの記事を](https://qiita.com/siba4848/items/c95ac6fcc843a9781353)を参照してください。

通常隠しフォルダです。

```
$ ls -la

///

drwx------    5 siba  staff     170  4  2 01:49 .ssh ←コレ
```

# 設定ファイルを作成する

```
$ vi ~/.ssh/config

# sakura_vps
Host MyHost
HostName 192.0.2.0
Port 2222
User username

※「:wq」で保存してください。 
```

# いざサーバに接続する

いえーい

```
$ ssh MyHost
Enter passphrase for key '/Users/username/.ssh/rsa_file': ぱすふれーず入力
Last login: Thu Apr 11 22:02:10 2019 from xxxxxxxxxxx.xx.so-net.ne.jp

SAKURA Internet [Virtual Private Server SERVICE]

[username@hostname ~]$
```

# おしまい


sshで繋ぐとき契約しているサーバのIPアドレスなんていちいち覚えてられないですよね。
たまにしか触らないし。←
Bootstrapのヘッダーの色の変え方

現在、ポートフォリオ用にアプリを作成しているのですが
Bootstrapを採用しています。

レイアウトを一通り、整えてくれるので
非常に助かっているのですが、
デフォルトだとヘッダーがグレーのまま。

色を変えたいけれど、
どこをどういじっていいのか分かりませんでした。

調べたところ、ヘッダーの色の変えるときは
```application.html.slim```に
```navbar-light.bg-light```とあると思いますが
この、『bg-light』の部分を変えればOKということが分かりました。

```
navbar-light[style="background-color:#cd5e3c;"]
```

bgの部分をstyleとすれば無事変更できました。
Arduino IDEをダークテーマに設定しただけ[1.8.7]

#環境
* Arduino IDE 1.8.7
* OS：Windows 10 Home

## 必要なもの

* [DarkArduinoTheme](https://github.com/jeffThompson/DarkArduinoTheme)

#設定方法

DLしたDarkArduinoThemeを解凍し，`DarkArduinoTheme-master/theme`を`C:Program Files(x86)/Arduino/lib`に入れる．<br>
この時，defaultテーマを残しておきたい場合は元あったthemeフォルダをリネームしておく。
テーマをIDE内で変える方法は分からず．
Python で ntp server から時刻を取得する (Python 2 版)

# Python で ntp server から時刻を取得する (Python 2 版)

そういえば、何のために書いたのか思い出せないけど、昔書いたなあと思い出したので.
単純な UDP パケットが飛んでいるだけなんですよね.
まあ、それを基に高度な計算をしているはずなんですが...

これ、Python 2 でしか動かないから Python 3 に移植しよう(笑).

## テスト

```python
>>> ntp_now('ntp.jst.mfeed.ad.jp')
datetime.datetime(2019, 4, 28, 21, 18, 22)
```

## コード

```python
def ntp_now(server, port = 123):
    from socket import socket, AF_INET, SOCK_DGRAM
    from struct import unpack
    from datetime import datetime
    s = socket(AF_INET, SOCK_DGRAM)
    try:
        s.sendto('\x1b' + 47 * '\0', (server, port))
        result = s.recvfrom(1024)[0]
    finally:
        s.close()
    if result:
        return datetime.fromtimestamp(unpack('!12I', result)[10] - 2208988800L)
    else:
        None
```
SourceTree＋GitHubでGitLFSを使ってみた

# 初めに
UnityをGit管理する際によく発生する問題としてあるのが、.Pngや.dllといったバイナリのデータが変更時に差分が取れずに丸ごとGitのログに乗ってしまい、リポジトリが肥大化するという問題です。
これを解決するために開発されたのがGitLFSですが、基本的にGitLFSは導入がめんどくさい、使い方がよくわからない人がいるなどの理由で小規模の開発時には設定されずに終わることがよくありました。
しかし、GitHubなどのサービスを利用する際に単一のファイルで100mb以上のファイルがプッシュできないといった制限のためにAssetStoreのアセットなどで100mb以上のファイルが含まれるものを使うときに非常に不便でした。
今回はSourceTreeに内蔵させれているGitLFSの機能を使ってみたら思った以上に簡単だったので紹介したいと思います。

# やり方
GitLFSを使う流れは以下の通り。

* LFSに対応してないGitを使っている場合はGitを最新にする
* リポジトリのメニューからGitLFSを選択して、リポジトリを初期化する
* GitLFSの追跡/未追跡のファイルからLFSで管理したい拡張子を*.dllなどで設定する
* 通常通りにコミット、プッシュを行う

基本的にはこれだけで動かせました。
補足で説明をすると、GitLFSのリポジトリの初期化はすでに運用中のGitリポジトリでやっても問題なく初期化できます(データが消えるといったことはありません)
また、追跡/未追跡のファイルの追加はSourceTree上のファイルを右クリック＞GitLFSのファイルを追跡でも追加することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104976/70bc3a76-3060-0efe-b734-d6585b068495.png)
この時ファイルを直接指定するので勘違いしそうですが、拡張子が追加されるので特定のファイルのみがLFSに乗るといったことはありません。

# 参考
http://ipponshimeji.cocolog-nifty.com/blog/2017/03/sourcetreegit-l.html
Leetcode #108: 


```swift
func sortedArrayToBST(_ nums: [Int]) -> TreeNode? {
    if nums.isEmpty {
        return nil
    }
    let index = nums.count / 2
    let node = TreeNode(nums[index])
    if index == 0 {
        node.left = nil
    } else {
        node.left = sortedArrayToBST(Array(nums[0..<index]))
    }

    if index + 1 < nums.count {
        node.right = sortedArrayToBST(Array(nums[(index+1)...]))
    } else {
        node.right = nil
    }
    return node
}
```
AWS認定Big Data勉強記 - 4

みなさん、こんにちは、えいりんぐーです。

先日、AWS認定ビッグデータ専門知識の試験を受けました。そして、結果は残念ながら不合格でした。せっかくなので、今回はこの場を借りて振り返りをしたいと思います。

まず得点(%)は以下の通りです。@nakazaxさんはAWS資格10冠の方なので、基本的にレベルの高い方なのですが、合格するならこれくらいの点数が必要かなと思います。CollectionとStorageが難しいそうなのと、Securityの問題比率が高いので重点的に勉強したつもりですが、なかなかキャッチアップしきれていませんでした。

||えいりんぐー|[nakazaxさん](https://qiita.com/nakazax/items/757d4c7c46618e2193be)|[ぼぶろぐさん](https://ameblo.jp/hackerbobchan/entry-12402034809.html)|
|---|---|---|---|
|Overall|46|78|42|
|Collection|25|50|37|
|Storage|44|100|22|
|Processing|62|75|62|
|Analytics|50|87|25|
|Visualization|42|71|42|
|Data Security|50|80|60|

AWSか無料で提供している試験対策のオンラインコースでは以下のような紹介をしていたので、これに合わせて、各分野・各サービスを勉強すればよかったかなと思います。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267335/2568301f-79d9-3ddf-62f6-16eeee6c1766.png 100% /img>

やったこととしては、

 - AWSにおけるビッグデータ分析のホワイトペーパー
 - AWS公式の、サービス別活用事例集
 - その元となる、YouTubeのBlack Beltオンラインセミナー動画
 - セキュリティに関するホワイトペーパー
 - AWSが提供している無料オンラインコース
    - Big Data Fundamentals
    - Exam Readiness

となっております。

試験問題を解いている最中は、これだけの勉強では細かいところをカバーできていないと感じました。上記のことをやりつつ、分からないところを公式ドキュメントで補足することと、よくある質問集を読む必要があったかと思います。

特に、具体例を挙げにくくて申し訳ないのですが、各サービスの要件や特性は把握する必要があると思います、例えばストリーミング処理をする時に、Kinesis Data Streamsがいいのか、Lambdaがいいのか、あるいは他か、といった問題はそれぞれの性能限界を把握しておかなければなかなか答えられないかと思います。

泣きの1回として、5月中に再受験しようかと思いますが、果たして今度はどうなるでしょう...
Minecraft Skript 入門編 Part.2

#イベントよりエフェクトを教えろ！！
待ってました！！その言葉！！

え？そんなこと言ってないって？
え？エフェクトってなにって？

エフェクトとは「実行する内容」のことをいいます。

先ほどのコードであれば、`cancel event`のことです。

###ワールドのリスポ地点にスポーンさせる
```:test.sk
on join:
    teleport player to world's spawn point
```
これで完成です。

まあ、前回からただの**英文**と叩いているのでこれを翻訳してみましょう。
`teleport player to world's spawn point`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404179/f24cb434-5c2b-d150-3158-eac56ed0f02a.png)
翻訳してみると「プレイヤーを世界の出現ポイントにテレポートする」となりましたね。

そう。何度も言っていてうるさいなぁと思うかもですが、本当にただの**英文**なんです！！

では、本題に戻りましょう。

まず、
１行目 `on join:`　は、鯖に参加したときというコードです。
２行目 `teleport player to world's spawn point`は先ほどの翻訳通り、`player`がワールドのスポーンポイントにテレポートするというものです。

ちなみにテレポート文の書き方ですが、
`teleport <テレポートさせる対象> to <テレポート先>`と書きます。
また、`player`とはそのイベントを発動した人という意味になります。（これがかなり重要になりますので覚えておいてください。）

###サーバーに入ってきた人にメッセージを送信
```:test.sk
on join:
    send "○○サーバーへようこそ！！" to player
```
これでサーバーに入ると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404179/7a111a5a-843e-f7e7-f482-aff03f331177.png)
となります。

あ、`○○ joined the game`というMinecraftのメッセージが変わるわけではないんだ・・・
そうなんです。
`send "～～～" to player`は`player`にメッセージを送信するだけ。

では、参加時のメッセージを変更してみましょうか・・・

```:test.sk
on join:
    set the join message to "&e%player% さんが､サーバーに参加しました。"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404179/f6b9b40a-98c0-da9f-9e0c-a7bd577d235c.png)
これで変更可能です。

では、これを解説していきましょう。

２行目 `set the join message to "&e%player% さんが､サーバーに参加しました。"`の`set the join message to "～～～"`で参加時のメッセージを設定できます。

まあ、ここはざっくりでいいです。
これでできるんだぁ・・・程度にお考え下さい。

ではメッセージ内の解説ですが、`"&e%player% さんが､サーバーに参加しました。"`の`&e`ですが、これはMinecraftのカラーコードです。
[コチラ](https://minecraft-ja.gamepedia.com/%E8%A3%85%E9%A3%BE%E3%82%B3%E3%83%BC%E3%83%89)を参考にどうぞ。

ちなみに参考先では`§`というものを使っていますが、Skriptでは`&`で構いません。（というか`§`では書けない）

そして、`%player%`ですが、`%`は主にメッセージ内で使うコードです。（変数内でも使いますが変数はもっとあと・・・）

メッセージ内で使うと、そのイベントを発動した人の名前を表示します。
なので、先ほどのようなメッセージを送信することができます。

ここでメッセージに関する豆知識のような解説。

```:test.sk
broadcast "～～～"
send "～～～" to player
message "～～～" to player
```
メッセージ関連はこれだけです（たぶん）。
でもね、`send`と`message`はまったく同じものだとお考え下さい。

そして`broadcast`はサーバーにいる人全員に送信します。

次は[コチラ](https://qiita.com/meoto2408/items/dc9574d0f9653b261bf7)

前は[コチラ](https://qiita.com/meoto2408/items/a44335d24d4ea3e75b73)
Leetcode #107: Binary Tree Level Order Traversal II

```swift
func levelOrderBottom(_ root: TreeNode?) -> [[Int]] {
    if root == nil {
        return []
    }
    var answer = [[Int]]()
    var stack = [root!]
    while !stack.isEmpty {
        var tmp = [Int]()
        for _ in 0..<stack.count {
            let node = stack.removeFirst()
            tmp += [node.val]
            if let leftNode = node.left {
                stack.append(leftNode)
            }
            if let rightNode = node.right {
                stack.append(rightNode)
            }
        }
        answer += [tmp]
    }
    return answer.reversed()
}
```
Leetcode #106: Construct Binary Tree from Inorder and Postorder Traversal


```swift
func buildTree(_ inorder: [Int], _ postorder: [Int]) -> TreeNode? {
    if postorder.isEmpty {
        return nil
    }
    let node = TreeNode(postorder.last!)
    let index = inorder.firstIndex(of: postorder.last!)!
    if index == 0 {
        node.left = nil
    } else {
        node.left = buildTree(Array(inorder[0..<index]), Array(postorder[0..<index]))
    }
    if index < inorder.count - 1 {
        node.right = buildTree(Array(inorder[(index+1)...]), Array(postorder[index..<(postorder.count-1)]))
    } else {
        node.right = nil
    }
    return node
}
```
[Linux]ファイル圧縮(tarボール)の方法

##背景
業務中にファイル圧縮する場面があり、先輩にtarボールのやり方を教えていただいた。
正直あまり使用するケースはないので、覚えているうちに備忘として残しておこうかと。。

##使用環境
Fedora２７

##圧縮方法
####コマンド
```
tar czf 圧縮後のファイル名.gz 圧縮するファイル(フォルダ名)
```

####使用しているオプション
+ c:作成
+ z:gzip形式で圧縮する
+ f:ファイル

##展開方法
####コマンド
```
tar xzf ファイル名
```
→展開されたファイル(フォルダ)は圧縮後のファイル名ではなく圧縮されたフォルダ名が出力されます。

##その他(補足など)
1. 展開（圧縮時でも）にvオプションもつける。(結果が出力されるので精神的に安定します。)
2. （展開の場合）以下のコマンドでテストすることができます。(圧縮したファイルを/var/tmpに格納してから実施するのがお薦めです。)

```
tar xzf ファイル名
```

##最後に
Linux関連の知識で知らないことがたくさんあることを痛感させられるので、
今後もこういった内容を投稿しようかと考えてます。

##参考
https://ah-2.com/2013/07/03/tarball.html
https://eng-entrance.com/linux-command-tar
再帰的な共通表式で補助テーブルを作成する

共通表式(WITH句)を再帰的に定義することで、連番などの補助テーブルを楽に作成することができる。
今回は、現在の時刻から、当日中の時刻を15分間隔で列挙するクエリを作成してみた。

```SQL
WITH TimeTable (point, interval) AS
(
    SELECT
        GETDATE(), 15
    UNION ALL
    SELECT
        DATEADD(minute,interval,point), interval
    FROM
        TimeTable
    WHERE
        DATEADD(minute,interval,point) < CAST(DATEADD(day,1,GETDATE()) AS date)
)

SELECT point FROM TimeTable

/* 結果
point
-----------------------
2019-04-28 20:27:17.327
2019-04-28 20:42:17.327
2019-04-28 20:57:17.327
2019-04-28 21:12:17.327
2019-04-28 21:27:17.327
2019-04-28 21:42:17.327
2019-04-28 21:57:17.327
2019-04-28 22:12:17.327
2019-04-28 22:27:17.327
2019-04-28 22:42:17.327
2019-04-28 22:57:17.327
2019-04-28 23:12:17.327
2019-04-28 23:27:17.327
2019-04-28 23:42:17.327
2019-04-28 23:57:17.327
*/
```
Java言語におけるクラスとは(2/?)

# 初めに
こんばんは。またたびです。
先日の記事たくさんの閲覧、コメントありがとうございました。
まさかここまで見ていただけるとは思っていなかったので正直びっくりしています。
そして、幼稚な内容の記事を投稿してしまい申し訳ありませんでした。
これから慣れていくのでもう少し我慢してお付き合い頂けると幸いです。

# インスタンス
今回はインスタンスについて書いてきます。
コメントを頂きましたが、オブジェクト指向とは命令を書くものなので猫を作るプログラムは本来のプログラムとは異なっていますが、今回はわかりやすよう猫を用いていきます。
また先日同様、僕がjavaを勉強する上で用いていたテキストを参考文献に記載しておくので読んでみてください。
それでは、例としてたくさんの猫を作るプログラムを書いていきます。

```java:Cat.java
public class Cat{
  String name;
  int onaka;
  static int esa = 10;

  Cat(){
  }

  Cat(String name){
    this.name = name;
  }

  void run(){
    System.out.printlf(name + "は走った");
    name.onaka -= 10;
  }

  void gohan(int eat){
    this.esa -= eat;
    this.onaka += eat;
  }
}
```

猫には名前があり、空腹度があるとしました。
走るとお腹が空きます。
また、猫はご飯を食べるのでお家のご飯の残量を定義しました。
ご飯を食べるを空腹度が満たされます。
またCat()とCat(String name)はコンストラクタといい、Catのインスタンスを生成時に呼び出されるものになっています。
インスタンスにつきましては下で説明しています。
そのため、Catのインスタンス生成時、引数がない場合は何もしないCat()を、String型の引数がある場合には名前を設定するCat(String name)を呼び出すことになります。
このように同じメソッドでも引数や、型の順番などが異なるメソッドを作成することをオーバーロードといいます。

```java:Main.java
public class Main{
  public static void main(String[] args){
    Cat a = new Cat();
    a.name = "kuro";
    a.onaka = 50;
    Cat b = new Cat("shiro");
    b.onaka = 30;

    a.run();
    a.gohan(5);
  }
}
```
このMain.javaについて説明していきます。
3行目の右側の辺はCatクラスのインスタンスというものを生成しています。
インスタンスを用いることで、下記のような記述で2種類の猫を作成できるようになり、値も各々持つことが出来ます。
ここで作成したインスタンスを左辺のCat型の変数aに代入しています。
その下の2行でaの猫にkuroと名付け、空腹度を設定しています。
次に6行目の左辺ですが、ここには渡す値にshiroと入っています。
これはCatクラスの9行目のCat(Sting name)を呼び出しており、ここで猫bの名前を設定しています。
その後、猫bの空腹度を設定しています。
次の行ではrun()メソッドを呼び出して猫aを走らせているため、Catクラスのrun()メソッドに記述してある通り、猫aの空腹度が10減ります。
その後猫aはご飯を5食べています。
ここが今回のポイントとなっていますが、Catクラスのesaフィールドにはstaticというものがついています。
フィールドにstaticがついている場合は、全てのインスタンスで値を共有するという意味であるため、猫a、猫bどちらでesaの残量を出力しても95と表示されます。
staticって便利！！！！！
今日はここまでにします

# 終わりに
今日は比較的短時間で記事をまとめることが出来ました。
まさか昨日の一日でここまで早く書けるようになるとは…
明日も予定がないはずなので、午前中はVue.jsのお勉強をして、午後に記事を書いていこうと思います。
明日は多分カプセル化について書きます。
ここまで読んでくださりありがとうございました。
間違いや表現のおかしい部分がありましたらコメント頂けると幸いです。

# 参考文献
 [スッキリわかるJava入門 第2版 (スッキリシリーズ) ](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1-%E6%B8%85%E5%96%AC/dp/484433638X/ref=zg_bs_515820_1?_encoding=UTF8&psc=1&refRID=JGCC33P1VGV3V5VKQGQR)
dtreevizの実行エラーとその対策

# dtreevizの実行エラーとその対策
## 概要
決定木, ランダムフォレストなどの可視化ライブラリであるdtreeviz使用時に以下のようなエラーを吐いた時の対策

```python
Format: "svg:cairo" not recognized. Use one of: svg:svg:core
CalledProcessError: Command '['dot', '-Tsvg:cairo', '-o', '/var/folders/2b/2t2g25l90490jr7978fj695m0000gp/T/DTreeViz_4952.svg', '/var/folders/2b/2t2g25l90490jr7978fj695m0000gp/T/DTreeViz_4952']' returned non-zero exit status 1.
```

- このエラーはツリー構造一部であるHTMLテーブル作成時のフォントメトリックの問題らしい
- 参考資料
	- https://github.com/parrt/dtreeviz/pull/36/commits/24721abf135f40a1eee81ac02c8b68be86e6f3c7#diff-f952b2aa2aa1dd354e65394cdc54b630
	- https://github.com/parrt/dtreeviz/issues/33
	- https://github.com/parrt/dtreeviz/pull/36

## 開発環境
- OSX Mojave 	10.14.4
- python 		3.6.5
- dtreeviz		0.3.3

## 解決方法
- dtreeviz/trees.pyの修正
- trees.pyの場所は以下で確認

```python
import dtreeviz
print(dtreeviz.__file__)
```	

```shell
/Users/ユーザ名/.pyenv/versions/3.6.5/lib/python3.6/site-packages/dtreeviz/trees.py
```

- dtreeviz/trees.pyのsaveメソッドを以下のスクリプトで上書きする.

##
```python
    def save(self, filename):
        """
        Save the svg of this tree visualization into filename argument.
        Mac platform can save any file type (.pdf, .png, .svg).  Other platforms
        would fail with errors. See https://github.com/parrt/dtreeviz/issues/4
        """
        path = Path(filename)
        if not path.parent.exists:
            makedirs(path.parent)
        g = graphviz.Source(self.dot, format='svg')
        dotfilename = g.save(directory=path.parent.as_posix(), filename=path.stem)
        format = path.suffix[1:]
        if not filename.endswith(".svg") and PLATFORM!='darwin':
            raise(Exception(f"{PLATFORM} can only save .svg files: {filename}"))
        cmd = ["dot", f"-T{format}", "-o", filename, dotfilename]
        stdout, stderr = run(cmd, capture_output=True, check=True, quiet=False)
        if filename.endswith(".svg"):
            # now merge in referenced SVG images to make all-in-one file
            with open(filename, encoding='UTF-8') as f:
                svg = f.read()
            svg = inline_svg_images(svg)
            with open(filename, "w", encoding='UTF-8') as f:
                f.write(svg)
```

## 確認
以下のスクリプトで実行確認

```python
from sklearn.datasets import load_boston
from sklearn import tree
from dtreeviz.trees import dtreeviz

regr = tree.DecisionTreeRegressor(max_depth=3)
boston = load_boston()
regr.fit(boston.data, boston.target)
viz = dtreeviz(regr,
               boston.data,
               boston.target,
               target_name='price',
               feature_names=boston.feature_names)
viz.view()
#display(viz)
```
- viz.view()実行時以下の図が表示されたら成功

<img width="540" alt="スクリーンショット 2019-04-28 20.29.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214271/dd7d9f9e-9750-43ab-a54d-cc23cae32c6f.png">


自分の環境ではjupyter上でviz.view()実行時にsvgファイルが吐き出されてエディタが起動します.
その際はdisplay(viz)を実行してみてください.

## その他
エラーを吐いた場合以下のセットアップも試してみてください.

- 追加セットアップ

```shell
brew uninstall graphviz
brew reinstall pango librsvg --build-from-source
brew reinstall cairo --build-from-source
brew install graphviz --build-from-source
```
viの操作について　メモ

# vi操作についてのメモ
viの操作について。
linuxを利用していてファイルを編集するのに便利なのがvi。
でも、いざ使おうとした時にコマンドを忘れてしまった！という経験をした人は少なく
ないのではないでしょうか？

そこで、「これだけは覚えておいて損はない！」
というものを備忘録といしてまとめておきます。

## はじめに

viとは、何か？
簡単に説明すると、viとはテキストエディタです。
linuxでファイルを操作する時に主によく使う気がします。
コマンドライン上でファイルを開いて編集・保存することができるので、
使い慣れてくるととても便利です。
この機会に、viについて勉強しておくのもいいと思います。


## モード切り替え
viは、ファイルを編集するための入力モードと、ファイルを保存したり編集を
抜けたりするためのコマンドモードの二つを行き来してファイルを編集・保存します。
viによりファイルを開いた時は、コマンドモードになっています。

| コマンド              |メモ                               |
|:-------------------|:---------------------------------|
|i                   |入力モードに切替(コマンドモードの時に利用)|
|「esc」ボタン           |コマンドモードに切替（入力モードの時に利用）|

## コマンドモード時の主なコマンドのメモ
|コマンド|メモ|
|:--|:--|
|:wq|ファイルを保存してviを閉じる|
|:w|ファイルを保存するがviは閉じない|
|:q!|編集した内容を反映せずに、viを閉じる（編集している場合は、アラートが出現）|
|:q!|編集した内容を反映せずに、viを閉じる（強制終了）|
|yy|一行コピー（y3yのようにすれば三行コピー）|
|yl|一文字コピー(y3lのようにすれば三文字コピー)|
|yw|一単語コピー(y3wのようにすれば三単語コピー)|
|p|ペースト|
|dd|一行削除（d3dのようにすれば三行削除）|
|dl|一文字削除（d3lのようにすれば三文字削除）|
|dw|一単語除（d3wのようにすれば三単語削除）|
|Shift + G|ファイルの最後に移動|
|0|行の先頭に移動|
|^|行の最初の文字に移動|
|$|行の末尾に移動|
|w|次の単語の先頭に移動|
|b|今カーソルが当たっている単語の先頭に移動|
|e|今カーソルが当たっている単語の末尾に移動|
Meishiのファームウェア書き込みで環境をなるべく汚したくない(Mac)

### Meishi 公式のファームウェアビルド・書き込み方法がどうなっているか

http://biacco42.hatenablog.com/entry/2018/01/21/204749

こちらのURLに記述がありますがgit cloneして `./util/qmk_install.sh` というコマンドを実行します
このときMacOSの場合 `./util/macos_install.sh` が実行され、 homebrewのインストールと以下のコマンドが実行されます

```sh
brew tap osx-cross/avr
brew tap PX4/homebrew-px4
brew update
brew install avr-gcc@7 gcc-arm-none-eabi dfu-programmer avrdude dfu-util
brew link --force avr-gcc@7
```

今回meishiをビルドするのにavr-gccが必要なのはわかるけどdfu-programmerは必要ないし、でもインストールを行わないと `make meishi:default` （ビルドまで）の実行ができませんでした。

### hexファイルをDocker上で作成する

適当なdocker imageを利用してdocker環境上でビルドだけを行います。
詳細な手順は省きますが、Docker上で以下のことを行います

- git clone https://github.com/qmk/qmk_firmware.git
- `./util/qmk_install.sh`
- `make meishi:default` # avrdudeの転送は行わない

これらが成功すると `./.build` ディレクトリに `meishi_default.hex` などのファイルが作成されます。
これでビルドは完了です

### hexをmac上からavrdudeで転送

avrdudeがDocker上で動作すれば問題が無いのですが、avrdudeはUSBデバイスを利用するため、Docker上で扱うには少し面倒です。
そのため、avrdudeだけはmacにインストールを行います。

```
brew install avrdude
```

また、先程ビルドしたDocker上のhexファイルも `docker cp` などで手元に持ってきておきましょう。必要なのはhexのみです。
あとはavrdudeのパラメータをgmk_firmwareのリポジトリから探したりして、実行します。
`-P` のパラメータのUSBデバイスは接続やリセットスイッチ？を押たびに変わるので、実行毎に調べ直してください。

```
avrdude -p atmega32u4 -c avr109 \
-U　flash:w:$(pwd)/meishi_default.hex \
-P /dev/cu.usbmodem144232101
```

ただ、このコマンドでも一発で成功しなくて、ハマりかけたんだけど以下の記事が参考になりました。
https://helloworlcl.hatenadiary.jp/entry/2018/04/15/185506
Leetcode #105: Construct Binary Tree from Preorder and Inorder Traversal


```swift
func buildTree(_ preorder: [Int], _ inorder: [Int]) -> TreeNode? {
    if preorder.isEmpty {
        return nil
    }
    let node = TreeNode(preorder[0])
    let index = inorder.firstIndex(of: preorder[0])!
    if index == 0 {
        node.left = nil
    } else {
        node.left = buildTree(Array(preorder[1...index]), Array(inorder[0..<index]))
    }
    
    if index == inorder.count - 1 {
        node.right = nil
    } else {
        node.right = buildTree(Array(preorder[(index+1)...]), Array(inorder[(index+1)...]))
    }
    return node
}
```
データの集計は、GoogleColabratory使ったほうが100倍早い

[多分これが一番早いと思います](https://dic.nicovideo.jp/a/%E5%A4%9A%E5%88%86%E3%81%93%E3%82%8C%E3%81%8C%E4%B8%80%E7%95%AA%E6%97%A9%E3%81%84%E3%81%A8%E6%80%9D%E3%81%84%E3%81%BE%E3%81%99)。

こちらの記事でデータ集計RTAをやられていたので私も参加したいと思います。

[データの集計は、ExcelよりPython使ったほうが100倍早い（pandas-profiling, pixiedust）](https://qiita.com/pocket_kyoto/items/8d1fbcbca5d5dfd1dbd5)

~~個人的にRでやったほうがさらに早い気がします。~~

諸事情によりpixiedustの処理は省略しています、後日追記したいと思います。

# TL;DR
- GoogleColabratoryを利用してPython環境準備を簡単化
- 手元のファイルをアップロードするとpandas-profilingが走るようにした 

# 方法について
## 前提
- Googleアカウントを作成済みである（約１０分）
- GoogleColabratoryをインストール済みである(約５分)
 - インストール方法はこちらを参照 
 - [Google Colabの知っておくべき使い方 – Google Colaboratoryのメリット・デメリットや基本操作のまとめ](https://www.codexa.net/how-to-use-google-colaboratory/)
- 元記事と同じくテーブル形式のcsvデータは既に用意されているものとします。 

## 作成済みJupyterNotebookをGoogleDriveへコピーする(所要時間３分)
[GoogleColabratory - auto_padas_profiling.ipynb](https://colab.research.google.com/drive/1SUpNSs-Vgjm4bbb9Qi50mSuRBynFNROW)を自分のGoogleDriveへコピーする。

![googlecolab_ipynb_copy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40310/f24e4654-ad0b-0c8c-0bf1-6537ed4c9fc9.gif)


## 全てのセルを実行する(所要時間５分)
![googlecolab_run.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40310/7e14c3e9-c7c0-f4eb-ff75-ab79a4413072.gif)

終わり

# 参考
- [データの集計は、ExcelよりPython使ったほうが100倍早い（pandas-profiling, pixiedust）](https://qiita.com/pocket_kyoto/items/8d1fbcbca5d5dfd1dbd5)
- [pandas-profilingが探索的データ解析にめちゃめちゃ便利だった件 - GoogleColab編](https://qiita.com/wakame1367/items/39faf5d91e20a5cf5772#_reference-a12e589891bdd7bf36e5)
- [GoogleColabratory - External data: Drive, Sheets, and Cloud Storage](https://colab.research.google.com/notebooks/io.ipynb)
- [Google Colabの知っておくべき使い方 – Google Colaboratoryのメリット・デメリットや基本操作のまとめ](https://www.codexa.net/how-to-use-google-colaboratory/)
Babel7+power-assertのセットアップ

## やりたいこと

コード中での事前条件・事後条件の検証や、テストコードでのアサーションにpower-assertを利用したい。

ただし、本番リリース時は、コード中から表明を取り除きたい。

## 想定

* テストフレームワークはMochaを使います。
* ソースコードは、`src`ディレクトリに配置します。ユニットテストコードは、テスト対象のコードと同じディレクトリに配置します。(`src/**/*.test.js`のような形式)
* JSXやES Modulesにも対応したい。

## セットアップ

### モジュールのインストール

```bash
$ yarn add --dev @babel/cli @babel/core babel-plugin-unassert babel-preset-power-assert @babel/register 
 mocha @babel/plugin-transform-modules-commonjs @babel/preset-react
```

### Babelの設定

プロジェクトルートに`babel.config.js`を用意します。

```javascript:babel.config.js
module.exports = function(api) {
  api.cache.invalidate(() => process.env.NODE_ENV);

  const plugins = ['@babel/plugin-transform-modules-commonjs']; // ES ModulesをCommon JS形式に置き換える
  const presets = [
    ['@babel/preset-react', {'pragma': 'createElement'}] // JSXをコンパイルするため
  ];

  if (api.env('production')) {
    plugins.push('babel-plugin-unassert');
  } else {
    presets.push('power-assert');
  }

  return { plugins, presets };
}
```

重要なのは以下の部分で、production環境でのみ`babel-plugin-unassert`を読み込み、それ以外の環境では`babel-preset-power-assert`を読み込むように設定しています。

```javascript
  if (api.env('production')) {
    plugins.push('babel-plugin-unassert');
  } else {
    presets.push('power-assert');
  }
```

### npm-scriptsを用意する

`package.json`に以下の記述を追加します。

```json:package.json
  "scripts": {
    "build": "NODE_ENV=production babel src --out-dir lib --ignore './src/**/*.test.js'",
    "watch": "babel src --verbose --watch --out-dir lib --ignore './src/**/*.test.js'",
    "test": "mocha -r @babel/register ./src/**/*.test.js",
  },
```

開発時は`yarn run watch`、本番リリース時は`yarn run build`でビルドします。

`NODE_ENV=production`の指定によって、本番リリース時は、ソースコード中から表明が取り除かれます。

## 動作確認

テストコードを用意します。

```javascript:src/index.test.js
import assert from 'assert';

const add = (a, b) => {};

describe('add', () => {
  it('should add two numbers', () => {
    assert(add(1, 2) === 3);
  });
});
```

`yarn run test`でテストを実行します。

```bash
$ yarn run test
yarn run v1.15.2
$ mocha -r @babel/register ./src/**/*.test.js


  add
    1) should add two numbers


  0 passing (24ms)
  1 failing

  1) add
       should add two numbers:

      AssertionError [ERR_ASSERTION]:   # src/index.test.js:7
  
  assert(add(1, 2) === 3)
         |         |     
         undefined false 
  
  [number] 3
  => 3
  [undefined] add(1, 2)
  => undefined
  
      + expected - actual

      -false
      +true
```

## 終わりに

power-assertは初めて使いましたが、エラーメッセージが詳細で、とても便利だと思いました。

## 補足

以下、インストールしたモジュールのバージョンです。

* `@babel/cli` - v7.4.4
* `@babel/core` - v7.4.4
* `@babel/register` - v7.4.4
* `babel-plugin-unassert` - v3.0.0
* `babel-preset-power-assert` - v3.0.0
* `@babel/plugin-transform-modules-commonjs` - `v7.4.4`
* `@babel/preset-react` - `v7.0.0`
* `mocha` - v6.1.4

## 参考

以下を参考にさせていただきました。

* https://github.com/power-assert-js/power-assert
* https://github.com/power-assert-js/babel-preset-power-assert
* https://github.com/unassert-js/unassert
* https://babeljs.io/docs/en/config-files#config-function-api
[CakePHP2]インストールの覚え書きです。

いきなり仕事でCakePHPを使うことになりました（しかも、cakePHP2...）。

早速インストール。
[CakePHP2](https://github.com/cakephp/cakephp)をGitからダウンロードして、サーバーに置いたらエラーが出たので対処方法をまとめておきます。

#+パーミッションのエラー
+ エラー内容

```
Your tmp directory is NOT writable.
```

/app/tmp 以下のパーミッションに書き込み権限（0777）を与えましょう。


#+timezoneのエラー
+ エラー内容

```
Warning: strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in /lib/Cake/Cache/CacheEngine.php on line 60
```

CacheEngine.php に「date_default_timezone_set('Asia/Tokyo');」を追加しましょう。

```/lib/Cake/Cache/CacheEngine.phpの59-61行目
if (!is_numeric($this->settings['duration'])) {
        date_default_timezone_set('Asia/Tokyo');
        $this->settings['duration'] = strtotime($this->settings['duration']) - time();
}
```

.htaccessに「php_value date.timezone Asia/Tokyo」でもいけました。

```/.htaccess
php_value date.timezone Asia/Tokyo
```

#+Security.saltのエラー
+ エラー内容

```
Notice (1024): Please change the value of 'Security.salt' in /app/Config/core.php to a salt value specific to your application. [CORE/Cake/Utility/Debugger.php, line 842]
```

core.php の security.salt の値を変更する。

```/app/Config/core.php235行目あたり
/**
 * A random string used in security hashing methods.
 */
	Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');

/**
 * A random numeric string (digits only) used to encrypt/decrypt strings.
 */
	Configure::write('Security.cipherSeed', '76859309657453542496749683645');
}
```

```
Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
```

[こちら](https://henkan.jp/cakephp/salt)のサイトでランダム文字列を取得できるのでそのまま貼り付けましょう。

#+Databaseのエラー1
+ エラー内容

```
Warning (2): include_once(/app/Config/database.php): failed to open stream: No such file or directory [CORE/Cake/Model/ConnectionManager.php, line 67]
```

/app/Config内にあるdatabase.php.defaultをコピーしてdatabase.phpを作ってアップロードしましょう。

#+Databaseのエラー2
+ エラー内容

```
CakePHP is NOT able to connect to the database.
Database connection "Mysql" is missing, or could not be created.
SQLSTATE[28000] [1045] Access denied for user 'user'@'localhost' (using password: YES)
```

データベースを用意して/app/Config/database.phpに設定値を入力しましょう。

```/app/Config/database.php69行目あたり
	public $default = array(
		'datasource' => 'Database/Mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'user',
		'password' => 'password',
		'database' => 'database_name',
		'prefix' => '',
		//'encoding' => 'utf8',
	);
```

#+DebugKitのエラー
+ エラー内容

```
DebugKit is not installed. It will help you inspect and debug different aspects of your application.
You can install it from GitHub
```

[DebugKit](https://github.com/cakephp/debug_kit)をGitからダウンロード。
解凍したフォルダを「Debugkit」にリネームして/app/Pluginにアップしましょう。

/app/Config/bootstrap.phpにプラグイン設定を入力します。
これでプラグインを読み込んでくれます。

```/app/Config/bootstrap.phpの最終行に追加
CakePlugin::load('DebugKit');
```

これで一通りのエラーは解決だと思います。
いまさらのcakephp2だから気を付けていきましょう。
atomic designをgoogleの検索結果ページに当てはめてみた

@_nishisuke です！

フリーランスエンジニアやってます！

詳しくは :point_down: 

https://nishisuke.github.io/me

google の検索結果ページのデザインを無理やり
atomic designにそって分解してみました。
## 結論
moleculeとorganismの違いが危うい。
個人的にlist -> organismに分類しがち。

## 背景
atomic designについては以下。

http://atomicdesign.bradfrost.com/table-of-contents/

atomic designには5人の登場人物がいる。
1. atom
2. molecule
3. organism
4. template
5. page


このcomponentレンジャーズはアニメに出て来る5レンジャーと違って、
誰がどれだかとてもわかりにくいです。
そのため人によって
これはatomだろ！
いやこれはmoleculeだ！

と共通認識を取るのが難しいです。

## 今回の全体像のスクショ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/12534d56-af06-691a-1506-0c30f9cee239.png)

## 注意！
ここからはあくまで僕の分類です。
多分半分くらいは意見が分かれます。

## 上の方
左上のこいつはatom

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/fdc10b50-6da9-3580-0c0e-a3cdb4206ffc.png)

-----------

実は意外と使われてない説のあるこいつはmolecule
(みんな普段url欄に入力しますよね？)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/dd5eafe5-f8f6-5035-e4c0-259138c821b1.png)

-----------
これの検索候補はmolecule

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/bbf78765-37ef-3200-3d8f-1fd441751e8f.png)

-----------
タブはmolecule

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/3ffd8415-2d88-159f-847b-d663301d1c1c.png)



## 右のほう
これ(google の提案？的なやつ)はorganism

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/31be375b-d364-7514-ce92-27ca9983ea42.png)

こいつを深ぼっていく

-------------

molecule
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/c52bb8c3-ab6e-df6d-80c1-ca84fea69bea.png)
------------
molecule

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/8e968579-8ab8-7f2f-0b1b-ce0b479277a3.png)

---------

organism
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/47a8ec50-0cae-c640-fbfe-2beb2c31b82f.png)

## 真ん中
molecule

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/aa4d07dc-4f24-9306-e46f-0de109f66e79.png)

--------
organism

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/21ee4f9c-3dc3-d0dc-6ab5-77b72be184fb.png)


## 下の方
molecule
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/618ca80c-cf10-1ded-ba2e-91155f62bacc.png)

-----------
molecule
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/201bc8c6-7ff6-a3a7-013c-fa5681cf062b.png)
JavaのScannerクラスを使ってファイルの読み込みを行なった件

#注意
私はQiitaで文章を書くことが初めてです。加えてひよっこ大学生であるので間違いが含まれている可能性が大いにあることを考慮して読んでいただけるとありがたいです。

#はじめに
この記事はJavaに標準搭載されている[Scannerクラス](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Scanner.html)について自分用にまとめるものである。この記事を書くにあったっての経緯としては→仕様書でScannerクラスを使って作れと言われた。→そんなん知らん。→一応できた。→忘れないようにどこかにメモっとくか。という感じである。ちなみに筆者は普段[BufferedReader](https://docs.oracle.com/javase/jp/8/docs/api/java/io/BufferedReader.html)か[FileReader](https://docs.oracle.com/javase/jp/8/docs/api/java/io/FileReader.html)を使用している。(こっちでええやろ...)

#ファイルを読み込み
```java:FileReader
        try {
            Scanner scanner = new Scanner (new File ("sourceFileName"/*ここに読み込みたいファイル名(場合によってはパスも必要)*/));
        } catch (FileNotFoundException e) { // 例外
            // ファイルが存在しないときの処理
            e.printStackTrace();
        }
```
とりあえずファイルを読み込む部分。オブジェクト生成の際[Fileクラス](https://docs.oracle.com/javase/jp/8/docs/api/java/io/File.html)のオブジェクトを引数としてブチ込む。Fileクラスはファイルパスを引数としてオブジェクト生成するとそのファイル情報を保持してくれる。便利。コンストラクタでやるといいと思う。

#Scannerから一行ずつ読み込む
```java:ReadLine
        try {
            //ファイルに未読部分が有るとき
            if (scanner.hasNextLine()) { 
                line = scanner.nextLine() + '\n';                                                      
            //無いとき
            } else {
                line = null;
            }
        //読み込みエラー
        } catch (IllegalStateException e) { 
            e.printStackTrace();
            closeFile();
            System.exit (1);
        }
```

| メソッド名      　 |          動作 　　 | 
|:-----------------|:------------------|
| hasNextLine()    |スキャナに次の行がある場合はtrueを返す             |       
| nextLine()       |スキャナを先に進めて、行を返す                |         

lineはString型の変数で今回はフィールドとして保持している。このlineを出力すれば無事ファイルの中身が出力される。"\n"を追加しているのは出力用である。main文で改行してもいいと思う。

#Scannerから一文字ずつ読み込む
```java:ReadChar
        current = next;
        if (next == '\0') {
        //ファイル末なら共通動作だけ
        } else if (next == '\n') {
            //行末
            readLine();
            if (line != null) {
                //読んだ行がnullでない
                next = line.charAt (0);
                number = 0;
            } else {
                //読んだ行がnull(ファイル末)の場合
                next = '\0'; //'\0'はファイル末を表す
            }
        } else {
            //ファイル末でも行末でもない場合，
            next = line.charAt (++number);
        }
        return current;
```
| 変数名      　 |          動作 　　 | 
|:-----------------|:------------------|
| current |読み込んでいる行      |       
| next    |次に読み込む行       | 
| number     |現在の文字数         |

上述のreadLineを使用して作ってみた。動作的には一行ずつ読み込んだものを一文字ずつ切り取っていく。正直無茶苦茶だが仕様書がこうなっているのだから仕様が無い。

#最後に
とりあえず動くようには作ってみた。あとはwhile文等で出力するだけである。結論としてはめんどくさい。それに限る。同じような状況に陥った未来の学生たちが苦労しないことを祈るばかりである。
困ったらまず公式のAPIドキュメント(英語の方)を読もう！
【Laravel】regexを使用するときは、パターン修飾子「u」をつけた方が良いという話

そんなに長くない話です。
[【Laravel】フリガナ入力のバリデーションのテストコード作成](https://qiita.com/hiroaki510/items/f49fcde808f10b55959f)という記事を書いたのですが、記事中では`regex`というバリデーションルールを使用しています。
これ、内部で`preg_match関数`を使用しているみたいです。
以下、日本語ドキュメントより。
> regex:正規表現
フィールドが指定された正規表現にマッチすることをバリデートします。
このルールは内部でPHPのpreg_match関数を使用しています。指定された正規表現は有効なデリミッタも含め、preg_matchで要求されているのと同じ形式に従う必要があります。たとえば、'email' => 'regex:/^.+@.+$/i'のようにです
https://readouble.com/laravel/5.8/ja/validation.html#rule-regex

なので正規表現内でひらがななどの文字を扱う際は、最後のスラッシュの後に`u`をつけた方が良いです。というかつけないとバリデーションが上手くいきません。。。

```
regex:/^[ァ-ヶー]+$/u
```
で、パターン修飾子`u`ってなんぞやという話になると思うのですが、PHP Manualにこう書いてありました。
> u (PCRE_UTF8)
この修正子は、Perl 非互換な PCRE の機能を有効にします。パターンと対象文字列は、 UTF-8 として処理されます。 無効な対象文字列を preg_* 関数に渡しても、何もマッチしません。 無効なパターンを渡すと、E_WARNING レベルのエラーが発生します。 5オクテットおよび6オクテットの UTF-8 シーケンスは、PHP 5.3.4 以降 (PCRE 7.3 2007-08-28 以降) では無効とみなされます。 以前のバージョンでは、これらも UTF-8 として有効だとみなされていました。
https://www.php.net/manual/ja/reference.pcre.pattern.modifiers.php

ようするに、パターンと対象文字列をUTF-8として処理してくれるみたいですね。


<font color="Chocolate">これに気づかず30分くらい無駄な時間を過ごしました。。。</font>
[Ruby]putsとreturnの違いをまとめてみた

Rubyを勉強してたら、putsとreturnの違いが分からなくなってきたのでまとめてみました。

putsとは
>引数のオブジェクトを文字列に変換し、改行を加えて標準出力に出力します。 引数は複数指定できます。 ... Ruby 1.9 引数が nil のときは、Ruby 1.8では "nil" ＋改行を出力しますが、Ruby 1.9では空行のみ出力します。

putsは引数の文字列を表示させるだけってことですね。

例

```rb
puts 'Hello World' #=> Hello World
```


returnとは
>returnの後に書いた値をメソッドの戻り値とし、メソッドを終了させる

returnは値を返すだけで表示させる訳ではないということですね。

return文で値を返し、それをputsで表示させるということでしょうか。

例

```rb
def greet
  retun 'Hello World'
end #=>
```
何も表示されません。
returnは戻り値を受け取るんだけで表示させることはありません。

```rb
def greet
  return 'Hello World'
end 
puts greet #=> Hello World
```
関数で受け取った結果をputs~で表示させています。

また、returnは省略可能です。
省略した場合は最後に評価された値が戻り値になります。

例

```rb
def greet
  'Hello World'
end 
puts greet #=>Hello World
```

```rb
def greet
  'Hello'
  'World'
end 
puts greet #=>World
```

省略できるならreturnいらなくない？って思いますが、returnにはメソッドを終了させることも可能です。
メソッドから脱出したい時に使います。

例

```rb
def greet(name = '')
  return 'nameが空です' if name.empty?
  "Hello #{name}!!!"
end
puts greet #=>nameが空です
```

```rb
def greet(name = '')
  return 'nameが空です' if name.empty?
  "Hello #{name}!!!"
end
puts greet('Keisuke')　#=>Hello Keisuke!!!
```

１つ目の例文はif文が真なのでreturn文を返しメソッドから脱出しました。
２つ目の例文はif文が偽なのでreturn文は表示されず、二文目が表示されました。

もし、returnを書いていなかったら

例

```rb
def greet(name = '')
  'nameが空です' if name.empty?
  "Hello #{name}!!!"
end
puts greet #=> Hello !!!
```

最後に書いた文が評価されるのでif文が真偽どちらだろうと1行目は表示されません。

<b>まとめ</b>
------------------------------------------------
putsは出力する時に、returnは戻り値を受け取る時やメソッドから脱出したい時に使います（省略化したら脱出は不可）。
WSLのターミナルをHyperからwslttyに変えた

WSLのコンソールにHyperを使っていたが、Emacsを使おうとすると画面が崩れてまともに使えなかった。

※ 2019/5/17 追記：Windows 10 をバージョン1903 に更新したところ、この問題は解消したので他のターミナルでも問題なくなった。

![crash.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407098/44b84e14-9074-1e76-f1b8-e0d392ec43cf.gif)
この問題は Hyper だけでなく cmd を使っていても発生していたので半ば諦めていたが、wslttyを試してみたら問題も解決した。

# wslttyのインストール

インストール方法はいくつかあるが、githubからダウンロードできるインストーラーを使ってインストールした。
2019/4/2時点で[インストーラが用意されていて且つ最新版の wsltty-1.9.6-install.exe
](https://github.com/mintty/wsltty/releases/tag/1.9.6)を使った。

## インストール後の設定変更

デフォルトだと256色モードになっていないので、オプションの Terminal > Type の設定を xterm から xterm-256-color に変更して有効にした。

![option1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407098/2030ef5e-68d5-5042-5097-7498f297ac70.png)

Text > Locale の値に ja_JP の選択肢があるが、これを選択するとまた違った画面崩れが発生するので C のままにしている。

![option2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407098/aeafcb10-149a-817e-9188-2cb8f7426e97.png)

起動時のシェルに zsh を使っているのでショートカットのパラメータに /user/bin/zsh を追加した。

```
C:\Users\{UserName}\AppData\Local\wsltty\bin\mintty.exe --WSL= --configdir="C:\Users\{UserName}\AppData\Roaming\wsltty" -~ /usr/bin/zsh -l
```

以上。
計算量オーダーのグラフ作った

# はじめに
計算量オーダーの大きさの違いがわからなかったので、グラフを作ってみました。

$O(\log{n})　O(\sqrt{n})　O(n)　O(n\log{n})　O(n\sqrt{n})　O(n^2)　O(n^3)　O(n^4)　O(2^\frac{n}{2})　O(2^n)　O(n!)$

上のの11個についてグラフにしてあります。
※計算量の小さい順に並べてあります。

対数目盛にしたほうが良いというご指摘をいただきましたが、本稿では直感的に分かりやすいよう、あえて線形目盛（普通の目盛）を使用しています。

# 全部含めたグラフ
横軸に$n$を取り、縦軸に$O(k)$を取っています。
横軸は続く3つのグラフで1メモリが10になっています。
$O(n\sqrt{n})$より大きくなるものは密集しすぎてわからないので、`①`のグラフまで見送ります。
![time_complexity1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106956/4808c06d-b546-fa81-0141-bf55ea1cd307.jpeg)
圧倒的$O(\log{n})$の強さ。$O(\sqrt{n})$もいい戦いですね。
$O(n\log{n})$がいまいちピンと来なかったのですが、これを見ると$O(n)$より少し計算量が大きくなっている程度だということがわかります。

# `①`続き
縦軸のみ100倍くらい縮小して見てみます。
![time_complexity2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106956/ee1838d0-0967-308c-8e25-ba6bfd248454.jpeg)
$O(n\sqrt{n})$と$O(n^2)$が見えてきました。
この２つは計算量的にもまあまあ使えるゾーンですが、その他のものは天に向かって伸びていっております。
おそろしや。

# `②`続き
更に縦軸を$10^4$倍くらい縮小しました。
このグラフの天井は$10^8$となっているので、これを超えると厳しくなってくる計算量です。
![time_complexity4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106956/d6ad1c0b-f8f0-7157-2e54-105cebf50b73.jpeg)
横軸が1メモリ10になっているのですが、$O(n^3)$以外は $n=100$ で力尽きてしまいます。
一方、$O(n^3)$を見ると、このグラフ上ではものすごく計算量が少ないように見えますが、$n$が増えるとぐんぐん成長していきます。
これらの計算量のアルゴリズムを使うときは、$n$と相談しながら使うのが良いのではないでしょうか。

# 教訓
* アルゴリズムを考えるときは$n$と相談しよう
* 計算量を考えよう

# 参考
* [計算量オーダーの求め方を総整理！ 〜 どこから log が出て来るか 〜](https://qiita.com/drken/items/872ebc3a2b5caaa4a0d0)
  * それぞれの$O(k)$についての限界などが詳しく載っています
* [[初心者向け] プログラムの計算量を求める方法](https://qiita.com/cotrpepe/items/1f4c38cc9d3e3a5f5e9c)
  * 計算量という概念を教えて頂いた素晴らしい記事
Windows10＋WSL＋VSCodeでWindows環境を汚さないNode.js開発環境を構築

# はじめに

Windows10+Node.jsは環境が汚れるとか、
グローバルNPMがよくわからないとか、
勝手に容量食っていくとかいう噂を聞いたので、

WSL上に構築を試してみます。


## Windows10でWSLを有効化する

これは省略します。

## Ubuntuをインストールする。

Windows Storeを開き、Ubuntuと検索します。

Ubuntu16と18がありますが、せっかくなので18を使いましょう。
ほかにも用途があれば、両方入れておくのもよいです。

インストール後はスタートメニューに追加されますので、
起動して初期設定を完了させます。

## Visual Studio Codeをインストールする

ここからインストールします。
https://code.visualstudio.com/

## Visual Studio Codeを起動

Visual Studio Codeを起動し、ファイル > 基本設定 > 設定　を選択します。

Terminal › Integrated › Shell: Windowsの欄を下記に変更します。

```
C:\Windows\System32\wsl.exe
```

### 確認

ターミナル > 新しいターミナルを選択し、ターミナルを起動します。
その際、ターミナル番号の横に「WSL」と表示されていれば設定完了です。

また、下記のコマンドを入力し、指定のUbuntuがインストールされていることを確認します。

```shell
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
```

となっていれば、設定完了です。

### 2020/03/11追記：VSCodeのRemote Extensionを利用する

[Remote Development Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)という拡張機能を利用することで、通常のWindowsターミナルとWSLを切り替えて利用できます。

現在はこちらを利用した方がよさそうです。

### 複数のWSLディストリビューションを入れた結果、使いたいものがうまく使えない場合

下記のサイトを参考に設定を確認＆変更します。
https://u.hoso.net/2018/03/wsl-linux.html

```powershell

$ wslconfig /list
Windows Subsystem for Linux ディストリビューション:
Ubuntu-18.04
Ubuntu-16.04 (既定)

$  wslconfig /setdefault Ubuntu-18.04

$ wslconfig /list
Windows Subsystem for Linux ディストリビューション:
Ubuntu-18.04 (既定)
Ubuntu-16.04
```

## Node.js環境をインストール

以降は、インストールしたUbuntu上で作業します。

```shell
$ sudo apt update

$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh

$ nvm --version
$ nvm install 11.13.0
$ nvm alias default 11.13.0
```

最後に、使用するための準備をします。

```shell
$ vi ~/.bash_profile
```

以下を記載し、保存

```bash
if [[ -s ~/.nvm/nvm.sh ]];
 then source ~/.nvm/nvm.sh
fi
```

入っていることを確認

```
$ node -v
```

## 最後に

ちなみに、これを応用することで、
Cygwinなどを使わずにC++などのビルド環境を構築することもできます。

構築に失敗した場合などは、簡単に削除することが出来ますので精神的にも安心です。
Xcodeインストールメモ(Xcode-10.2.1)

Xcode-10.2.1をインストールしようと思い立ったので個人的なメモを作成する。
※Developerプログラムには入っていない状態です。

---

# Xcode-10.2.1のダウンロード
https://developer.apple.com/download/more/
から `Xcode_10.2.1.xip` をダウンロードする。6Gbyteくらいあったので気長に待つ。


# 解凍する
ダブルクリックすると解凍が始まるので気長に待つ。
気長に待つと、12GbyteくらいのXcodeファイルができた。

---

# 起動して待つ
12Gbyteくらいのファイルをダブルクリックすると、規約に同意してほしいと出るので同意する。
ここでパスワード（or TouchID）が求められる。また待つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195490/7fb06593-61a0-fa8a-42e2-566acdda7515.png)

---

# プロジェクトを作成する
`Create new Project`を選択し、`Single View App`を選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195490/e0da0fea-10df-2895-3d18-cde2c54adb8e.png)

# プロダクト名を入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195490/ae84c857-21c0-7145-c128-e3093a16b969.png)

`Organization`, `Organization Identifier`は適当な文字列を入れました（空だとだめでした）。
`include xx Tests`は不要そうなのでチェックを外してみました（後で困らないといいのですが）。

---

# Signingでのエラー
Developerプログラムに入っていないとだめなのかもしれないが、実機起動まではできると聞いたので一旦スルー（あとで問題が出たら対応する）。

# 開始してみる
何も考えずに開始ボタンを押すと、エミュレータが起動した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195490/84dcd93c-e3d1-d57f-013e-7c7a072dfbe9.png)

起動中にDeveloper Toolsで管理者権限が必要だと言われたので、MacのID/PASSを入力。

（画像が大きすぎたので省略）無事、真っ白な画面が出た。

---

# 実装を追加する
このままではあまりにも味気ないので、なにか実装してみる。

## （独り言）オブジェクトを追加するためのボタンで悩む
画面の右上の一番左の「銭」マークがそれだった。気づかなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195490/69bacba6-f61a-1496-fd1b-d67ea595a9f4.png)

## Hello Worldラベルを追加する
上記のオブジェクト一覧から「Label」を選択する。ストーリーボードに置かれるので、以下のように設定する。
TextにHello Worldを設定、フォントサイズを25に変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195490/6eddacc4-855a-c1d8-ead8-13ba3006776a.png)

## 真ん中に置く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195490/e8d51c76-4be1-c16c-1ede-7c98d2e4da93.png)

## ボタンを置く
HelloWorldのテキストの下において、文字が変わるようにしてみる。

ボタンの制約は、中央だけどHello Worldから50px離す。
※これだけだと下に近すぎた場合に困るのだけど、いったんここではスルーしておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195490/1c9d8aca-367e-b0ee-d975-551f909bc9d2.png)

## 実装
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195490/9fe262f0-29ae-edd3-61cc-600c1c39d99f.png)


上記で実装ができました。
（gifはめっちゃ潰れてますが、実際は潰れてない質素なものができました）
![Untitled.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195490/5fcf4188-e23c-e46c-7f77-a8c63d80220e.gif)

# Alamofireのインストール
絶対必要そうなAPIリクエスト部分も作ってみることにする。
https://github.com/Alamofire/Alamofire

今はSwiftのパッケージ管理は何が良いのだろう（CocoaPods, Carthageあたりしか知らない）...
いったんCocoaPodsにしてみよう。

https://cocoapods.org/pods/Alamofire

5はbetaらしい。特に問題ないので5を使うことにする。

## CocoaPodsの準備
以下を参考にさせていただきました。

* https://qiita.com/satoken0417/items/479bcdf91cff2634ffb1
* https://cocoapods.org/pods/Alamofire

```shell
sudo gem install -n /usr/local/bin cocoapods
```

```shell
cd /path/to/project-dir
pod init
vi Podfile
# 以下を追記
pod 'Alamofire', '~> 5.0.0-beta.5'
# インストール
pod install
```

`pod install`はかなり時間がかかります(10分くらい）。
今後何らかの工夫が必要かもしれないが、今はこのままで。

## 実装
ここは間に合わなかったので（書くことがあれば）次回。

# 以上
次はAPIクライアント部分と、実機転送を試してみたい。
【gitコマンド】差分を確認・直前のコミットを修正する

## 差分を確認
`git diff`

差分のあるファイル名を確認
`git diff --name-only`

## 直前のコミットメッセージを修正する
`git commit --amend`
viが開くので、コミットメッセージを編集する
`:w` write（上書き）
`:q` quit（終了）
で完了。
`git log`で確認します

## 直前のコミットを修正する

ファイルを追加し忘れたり、何か間違った時

`git add 追加したいファイルのパス`
`git status`で確認
`git commit --amend`
viが開くので、コミットメッセージを編集する。`git log`で確認します
Visual Studio Codeのインストール

# はじめに
VSCodeとは、Microsoftの高性能エディタである。プログラミングのIDEとしてやMarkdownエディタとしても使えそうなので、今後VSCodeをベースエディタにしたい。

なので、いろいろ勉強していく。

# インストール
インストーラに従って淡々とやる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269452/e1eb7486-9438-3f5a-deef-83db86404aec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269452/8bc09f6e-2932-3708-2ca1-9d5cc8b97c4a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269452/81833c76-91b6-a72a-c082-08f494ae0651.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269452/65c6415c-e742-b916-c4f7-e12e375786c2.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269452/a11858fd-ec41-ae63-a06b-a91eaa2d2b1b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269452/516ce7e6-d773-383d-4e5a-101495cdeb11.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269452/9510e1d3-d2f9-911b-1cb5-21c3c4cada0d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269452/8aab8ac9-de06-b02e-b0e8-adeeb322f903.png)

# 日本語化
画面をいろいろ調べる前に、まずは日本語化だけやる。（詳細は、日本語化した後にじっくり見ていく。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269452/7c9acd19-c0d9-4705-896a-4d38ea02464f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269452/bbc8e3b3-7a23-4cc8-b846-f6832e790f20.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269452/8f3ef792-f5d3-6d58-31f7-e7b52b6f4744.png)

# おわりに
次回は、いろいろと基本的なところを見ていく。
nullとOptional型と理想と現実

最近、モバイルアプリの開発をするようになって、swiftとkotlinを勉強するようになった。
そんな中で初めて「Optional型」という概念に触れて「そんな便利な型が存在する言語があるのか」と思っていたのだが、よくよく調べてみたら、Java8にもOptional型があるというのを今更ながら知った。
以下はOptionalに関するJavaDoc。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html

# Optional型とは
`null`（言語によっては`nil`）を格納できる変数の型のこと。
Javaの場合は、`int`や`boolean`など**プリミティブ型**は`null`を格納できない（コンパイルエラー）が、`Integer`や`String`など**参照型**の変数は`null`が格納されるかもしれないため、事前に`null`チェックをしないと、`NullPointerException`が発生するかもしれない。

# Optional型のメリット
プログラム初心者の自分が最初に感じた疑問。
> 参照型も`null`入るんだから`Optional`型ってわざわざ定義する必要なくね？

たしかに「`null`になるかもしれない型」という意味ではOptional型も参照型も関係ない。重要なのは、参照型の場合は`null`チェックしなければいけない処理で、それを怠ってしまいがちな点だろう。
`null`チェックを怠った場合、`NullPointerException`が発生するが、これは実行時例外に該当するため、最悪の場合は本番障害にならないと気づかないケースもありえる。

```java
String str = getString();//これがnullを返した場合
//以下のif文を忘れてしまうとコンパイルは通るが、実行時にNullPointerExceptionに
//if(str == null){
//    str = "";
//}
return str.length();
```

対して、Optional型を使った場合は、専用のメソッドを使わなければ値を取り出せないため、**必ず`null`の場合を考慮したコーディングをしなければならない。**
つまり、意図せず`null`が入り込んだ場合にどうするかを見逃さなくなる点が一番のメリットだと思う。

```java
Optional<String> opt = Optional.ofNullable(getString());
String str = opt.orElse(""); //Optionalから値を取り出すには、nullを考慮したメソッド`orElse`を使わないと取り出せない。
return str.length();
```

# でも本来は想定外のnullをなくすべき
なぜだろう。最近すっかり忘れてしまっていたのだが、本来は想定外の事態が発生しても大丈夫なようにしておく（`null`チェックをしておく）ことが大切なわけではなく、想定外の事態を作り込まない（`null`が返却される原因をなくす）ことの方が重要だ。

先ほどのコードで例えるならば、

```java
String str = getString();//そもそもgetStringがnullを返すことが悪いのでは？
//以下の処理は記述しておくべきだったけど、getString()がnullを返すなんて仕様書に載ってないじゃん
//if(str == null){
//    str = "";
//}
return str.length();
```

というケースのことだ。
`null`を考慮すべき責任は誰（どのコード）にあるのかがはっきりしないまま、とりあえず`null`チェックしておけば安全だからと安直に考えていないだろうか。

経験上、先例の`getString`に該当するモジュールは、他ベンダーによって大昔に作られた前提モジュールであったり、すでに稼働済みの他システムでも流用されているため、請け負った案件の保守費用などの関係から「改修できないモジュール」扱いにされていたりすることが多く、「設計としてあるべき」という思想ではなく「現実的に考えてこうするしか無い」という事情に合わせてコーディングされることが圧倒的に多い。

今回記事をまとめようと思ったきっかけは、最近自分自身も「現実的に考えてこうするしか無い」という事情に甘んじて、とりあえず`null`チェックしておけば安全だからと安直に考えて実装するようになってしまったように感じたからだ。

本来は、意図的に`null`にしているのではなく、プログラマの不注意により`null`が入り込む実装になったまま放置されているモジュールや、意図的に`null`にしたことが周知されずに、あるいは時代を経て「意図的に`null`にしたよ」という内容の引き継ぎが途絶えて「この場合に`null`になるなんてありえない」と判断してしまう行為自体が悪なのだ。

# まとめ
Optional型は`null`の場合の考慮をプログラマに強いることができるが、本来`null`をどう扱うべきなのかを設計する思想は忘れてはならない。（←自分への戒め）

たとえば、`getString()`が`null`を返すかもしれないモジュールであるならば、`getString()`の戻り値もOptionalにすべきである。

```java
Optional<String> opt = getString();//Optional型を返すことを明示するべき
String str = opt.orElse("");
return str.length();
```

あるいは、`getString()`が`null`を返さないことが保証されるべきであるならば、`getString()`内部処理を修正して、呼び出し側はOptional型を使わなくてもいい。

```java
String str = getString();//絶対nullではないことが保証されたなら
//以下のif文はデッドコードとなってしまうため、実装しないのが正しい
//if(str == null){
//    str = "";
//}
return str.length();
```

swiftやkotlinなどOptionalが使える新しい言語でも、この思想は忘れてはいけないだろう。