OmniAICreator/Qiita-1.07M huggingface dataset:
composerを実行したらPHP Warning:  preg_match(): JIT compilation failed: no more memory inが・・・

# phpのバージョンを7.3.*に上げたら PHP Warning:  preg_match(): JIT compilation failed: no more memory inというwarning表示されたとき
php.iniファイルを修正する

## php.iniの場所を探す方法
php -i | grep php.ini

## 修正箇所
php.iniを下記のように設定するとwarningが表示されません

;pcre.jit=1 // 変更前
pcre.jit=0 // 変更後
MongoDB C Driverのビルド(windows)

MongoDBをCのアプリケーションから使うためのライブラリである**MongoDB C Driver (libmongoc)**と**BSON library (libbson)**のビルド手順。
[公式](http://mongoc.org/libmongoc/current/installing.html)を参考にした。

##環境
* windows8.1
* Visual Studio Community 2017および2015
* cmake 3.9.0


##手順
[ここ](https://github.com/mongodb/mongo-c-driver/releases)から最新の`mongo-c-driver-x.y.z`を落とす。今回は`mongo-c-driver-1.14.0.tar.gz`を使用。

```language:GitBashで実行する
tar -zxf mongo-c-driver-x.y.z
cd mongo-c-driver-x.y.z
mkdir cmake-build
cd cmake-build
```

```language:GitBashで実行する
cmake -G "Visual Studio 15 2017 Win64" \
   "-DCMAKE_INSTALL_PREFIX=C:\mongo-c-driver" \
   "-DCMAKE_PREFIX_PATH=C:\mongo-c-driver" \
   ..
```
実行後、**`ALL_BUILD.vcxproj`**をはじめ、プロジェクトファイル等が生成される。

`MSBuild.exe`を使うので、`MSBuild.exe`がある場所のパスを環境変数に入れておく。筆者の場合は下記。
`C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin`

試したことなど：

* このあと、**`ALL_BUILD.vcxproj`**をビルドする。`MSBuild.exe`および`VS2017`でビルドしたが失敗。**`winsock2.h`**がないと言われる。
* 生成されたプロジェクトファイルはインクルードディレクトリに`C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\um`、ライブラリディレクトリに`C:\Program Files (x86)\Windows Kits\10\Lib\10.0.14393.0\um\x64`を参照している。これらのディレクトリは筆者の環境にはなく、代わりに番号部分が**10.0.15063.0**のものがあった。
* **`ALL_BUILD.vcxproj`**にこのパスを設定しても解決しなかった。生成されたプロジェクトすべて(50個ほど)に設定して試すのは気が引けたので、`VS2015`なら行けるかと思いそちらをインストール。
* `VS2015`でも無理だった。しかし、



```powershell:powershellで実行する
MSBuild.exe ALL_BUILD.vcxproj
```
>ビルドに成功しました。
>    0 個の警告
>    0 エラー

ビルドに成功した。続けて、

```powershell:powershellで実行する
msbuild.exe INSTALL.vcxproj`
```
> ビルドに成功しました。
>     0 個の警告
>     0 エラー
> 
> 経過時間 00:00:27.92

インストールできた。
生成されたライブラリ等のファイルは`C:\mongo-c-driver`にある。（`CMAKE_INSTALL_PREFIX`で設定されている場所）

##振り返り
* 今思えば、バージョン`10.0.14393.0`の**Windows 10 SDK**をインストールしていれば2015なしでも行けそうな気がする。
* `VS2015`をインストールしても先述の`Windows Kits`配下にバージョン`10.0.14393.0`のディレクトリができていなかったので、どこを参照して`winsock2.h`を見つけたのか不明。
* スペースを含む絶対パスをコマンドプロンプトに渡すときにエラーが出て困った。(結局は環境変数にパスを登録して回避した)
iOSアプリリリースのためにDeveloper登録したら Provisioning Profileが通らなくなった

## はじめに

表題のとおりですが、iOSリリースのために有料のDeveloper登録したら Provisioning Profileが通らなくなりました。bundleId がいけないよーという記事は多く見かけたのですが、解決策は違う内容だったのでメモに残します。

## 解決策

Apple の developer サイトの device 項目に実機の情報を登録すると解消しました。

- apple developer
https://developer.apple.com/account/ios/device/

- 参考サイト
https://developer.apple.com/jp/documentation/IDEs/Conceptual/AppDistributionGuide/MaintainingProfiles/MaintainingProfiles.html

最終的に、developer としては以下の3つを登録する必要があるみたいですね。
- Certificates
- Identifiers
- Devices
AWS Configにてマネージドルールを定期評価をさせる方法

# 経緯
AWS ConfigにはAWSリソースが適切な設定になっているかを監視してくれる機能があります。
以下は一例です。

- S3 バケットでパブリック読み取りアクセスが許可されないことを確認します。
- AWS アカウントで AWS CloudTrail が有効になっているかどうかを確認します。
- RDS DB インスタンスの高可用性が有効になっているかどうかを確認します。

一回目の非準拠メールを見逃してしまうと
上記のルールに非準拠した状態が継続することになります。
中々恐ろしいですね。
その為、ルールを定期的に評価させてみることになりました。

## 勘違い
AWS Configのマネージドルールについて勘違いをしまして、
ルールの詳細のトリガータイプを「設定の変更」→「定期的」にすれば
どれでも定期実行が可能だと思ってました。

が、ルールをEditで開いても「定期的」がグレーアウトしていてチェックすることができないものがあります。


# AWSのサポートから教えて頂いた対処
[StartConfigRulesEvaluation](https://docs.aws.amazon.com/ja_jp/config/latest/APIReference/API_StartConfigRulesEvaluation.html)をLambdaで実装してCloudWatch EventsからLambdaを定期実行すれば
要望満たせるとのことでした。

## Lambda用のRole
以下のPolicyを作成してこれから作成するLambda用のRoleへアタッチすればOKです。

### JSONの場合

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "config:StartConfigRulesEvaluation",
            "Resource": "*"
        }
    ]
}
```

### マネージドコンソールの場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/316662/44317a7d-64cd-fa1c-2037-74ea16b566f7.png)


## Lambda(Python3.6)
[Pythonの参考ページ](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/config.html#ConfigService.Client.start_config_rules_evaluation)を参照しつつ作成したコードがこちらです。

```
import boto3

client = boto3.client('config')
 
def lambda_handler(event, context):
    response = client.start_config_rules_evaluation(
        ConfigRuleNames=[
            's3-bucket-public-read-prohibited',
            'cloudtrail-enabled',
            'rds-multi-az-support' 
        ]
    )
```
ConfigRuleNamesの箇所にマネージドルールの項目名を記載するだけです。
上で作成したRoleを選択するとLambdaの画面でConfigが連携されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/316662/8ab219bf-44b8-632b-7dd0-c049dcef4528.png)

## CloudWatch Events
スケジュールにて確認したい間隔を設定し、Lambdaを指定することで、連携が完了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/316662/5ae5d244-725d-eb4c-e6df-5a45e89d581a.png)

# 確認方法
ルールの項目から評価状況を確認してください。
最後に成功した呼び込みと最後に成功した評価が指定した間隔で更新されたら成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/316662/a0fb2992-c974-cb65-3411-589d680b5229.png)


# 落とし穴
AWS Configは仕様でルールの準拠・非準拠のステータス変更時しか通知してくれません。
つまり非準拠が継続の場合にはメール通知がありません。
サポートから上記の回答を頂いたので2019年2月末時点では代替手段もなさそなので
「運用でカバー」をしないといけない様です・・・

■ 公式リンク
[公式ページ](https://aws.amazon.com/jp/config/)
[ブラックベルト](https://d1.awsstatic.com/webinars/jp/pdf/services/20160831-AWS_BlackBelt-CloudTrail-Config-public.pdf)
[AWS Config マネージドルールのリスト](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/managed-rules-by-aws-config.html)

■ AWS Config過去記事
[AWS Configの通知内容をLambdaで成形](https://qiita.com/tomoki_s/items/0d3b249da6ce9cbafdeb)
【Mac】crontabでOperation not permittedと出た時の解決方法

Macでcrontabを実行しようとすると以下のようなエラーが発生したので、エラー解決方法について記載します。


```bash
$ crontab

crontab: tmp/tmp.9747: Operation not permitted
```

## 環境
OS: Mojave
ターミナル: iTerm2

## 解決方法
iTerm2にアクセス権限を付与することで解決しました。

『システム環境変数』の『セキュリティとプライバシー』を選択します↓

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/c66c29ea-a8ca-05d9-9da6-24481a4359bb.png)

『プライバシー』を選択すると『フルディスクアクセス』という項目があります。
ここにターミナルのクライアントアプリ（僕の場合はiTerm2）を追加します。↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/a537d79f-3ece-cd80-ea55-88c35be66833.png)

これでOKです！


## 参考
- [Unable to add crontab entry in macOS Mojave](https://forums.developer.apple.com/thread/106320)

## さいごに
ツイッター(<a href="https://twitter.com/nishina555" target="_blank" rel="noopener">@nishina555</a>)やってます。是非フォローお願いします！
メモ帳ではできない Windows10 PowerShell で100億1バイトのファイルを1バイト編集する

巨大なファイルのうち、1バイトだけを編集したい場合に使えるテクニックです。
100億1バイトあるファイルをメモ帳で開こうとした結果のダイアログ

```
---------------------------
メモ帳
---------------------------
ファイル D:\Bin\file.bin は大きすぎてメモ帳では編集できません。

別のエディターを使って編集してください。
---------------------------
OK   
---------------------------
```

**「別のエディターを使って編集してください。」**
別のエディターって何だろう？できればWindowsに最初からあるやつがいい……

それはPowerShellのことでしょうか。

---

やることは単純です。
PowerShellの.NETパワーを活用してSystem.IO.FileStreamを取得し、好きなだけシークして値を読み書きします。
Windows10のPowerShellを使います。
当環境の$PSVersionTable です。

```
> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.17763.316
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17763.316
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
```

# サンプル
100億1バイトのファイルが無い場合は作ります。
作業場は D:\Bin ディレクトリとします。ハードディスクには空き容量が必要です。
PowerShellはWin+X,Iショートカットで起動して、cd D:\Bin で移動してください。

```powershell
PS D:\Bin> $fs=[IO.File]::Create($pwd.Path+"\file.bin");$fs.Position=10000000000;$fs.WriteByte(0);$fs.Close()
```
数分かかることがあります。
終わったらファイルがあるか確認します。

```
PS D:\Bin> ls


    ディレクトリ: D:\Bin


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2038/01/19      3:14    10000000001 file.bin
```

うまくいきました！ファイルを読み書きしましょう。

## 読む
ファイルの先頭を0バイト目として、100億バイト目を1バイト読みます。結果がPowerShellの画面に表示されます。

```powershell
PS D:\Bin> $fs=[IO.File]::OpenRead($pwd.Path+"\file.bin");$fs.Position=10000000000;$fs.ReadByte();$fs.Close()
0
```

## 書く
「99」という値1バイトを書き込みます。100億バイト目が1バイト上書きされます。

```powershell
$fs=[IO.File]::OpenWrite($pwd.Path+"\file.bin");$fs.Position=10000000000;$fs.WriteByte(99);$fs.Close()
```

同じ場所をもういちど読むと99になったことが確認できます。

```powershell
PS D:\Bin> $fs=[IO.File]::OpenRead($pwd.Path+"\file.bin");$fs.Position=10000000000;$fs.ReadByte();$fs.Close()
99
```

これで目的は達成しました。

メモ帳でできるようになった時代の人が見たら、化石かよって思うに違いありません。
RxSwift CombineLatestで3つのvalueを監視する

# 背景

三つのTextFieldの値を監視して、全てに文字の記入などがあれば、navigationbarのBarButtonのisEnabledのStatusをtrueに変更するということをやりたいと考えました。そこで、　combinelatestを使おうと思ったのですが、３つのobservableな値を監視して、結果を返すようなexmpleがあまり見つかりませんでした。

# 開発環境
Swift 4.2 ~ 
RxSwift 4.2 ~ 

# 方法

## ViewModel

```.swift
import RxSwift

class ViewModel {
  let name = Varible<String>("")
  let userID = Varible<String>("")
  let userPassword = Varible<String>("")
  let shouldSubmit: Observable<Bool>
  
  init() {
    self.shouldSubmit = Observable
      .combineLatest(name.asObservable(), userID.asObservable(), userPassword.asObservable()) {
        (name, userID, userPassword) in
         var result = false
         if 0 < name.cout && name.count < 20 {
           if 6 < userID.count && userID.count < 15 {
              if 8 < userPassword.count && userPassword.count < 16 {
                result = true
              }
           }
         }
         return result
      }
  }
}
```

## ViewController

```.swift
import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {

  @IBOutlet weak var nameTextField: UITextField!
  @IBOutlet weak var userIDTextField: UITextField!
  @IBOutlet weak var userPasswordTextField: UITextField!

  private let viewModel = ViewModel()
  private let disposeBag = DisposeBag()

  override func viewDidLoad() {
    super.viewDidLoad()
    let barButton = UIBarButtonItem(title: "追加", style: .done, target: self, action: #selector(self.add))

    // setup bind
    self.nameTextField.rx.text.orEmpty
      .bind(to: self.viewModel.name)
      .disposeBag(by: self.disposeBag)
    self.userIDTextField.rx.text.orEmpty
      .bind(to: self.viewModel.userID)
      .disposeBag(by: self.disposeBag)
    self.userPasswordTextField.rx.text.orEmpty
      .bind(to: self.viewModel.userPassword)
      .disposeBag(by: self.disposeBag)
    self.viewModel.shouldSubmit
      .bind(to: barButton.rx.isEnabled)
      .disposed(by: self.disposeBag)
    self.navigationItem.rightBarButtonItem = barButtton
  }
}
```

# 参考文献

https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Examples.md
【Java】protectedで修飾されたメソッドがサブクラス内から呼べるとは限らない

# 概要
Javaのアクセス修飾子の一つに、protectedというものがあります。protectedについて「同一パッケージ内およびサブクラスからのみアクセス可能」というような説明を聞いたことがないでしょうか。このような理解だと若干の誤解が生じるかもしれないという話をします。

同一パッケージ内からのアクセスについては特に混乱する要素はないと思うので、サブクラスからのアクセスについてのみ言及します。

# 対象読者
Java初心者

# 環境
Java11で動作確認を行いましたが、内容としては古いバージョンでも特に変わらないと思います。

# うまくいかない例
「サブクラスからアクセス可能」という理解だと、下記のサンプルコードは動作すると思えますが、実際にはコンパイルエラーになります。
（ネーミングセンスについてはご容赦願います…）

```java
package test.sp;

public class Super {
    protected void method() {
        System.out.println("Super#method() called.");
    }
}
```

```java
package test.sub;
import test.sp.Super;

public class Sub extends Super {
    public static void main(String[] args) {
        Sub sub = new Sub();
        sub.run();
    }

    private void run() {
        Super sp = new Super();
        sp.method();  // エラー: method()はSuperでprotectedアクセスされます
    }
}
```

protectedで修飾されたmethod()メソッドを持つSuperクラスと、そのSuperクラスを継承したSubクラスがあります。
SuperクラスとSubクラスはそれぞれ別のパッケージにありますが、SubクラスはSuperクラスを継承している（SubクラスはSuperクラスのサブクラスである）ため、Subクラスからmethod()メソッドを呼び出すことは可能であるように思えます。しかし、上記のコードだとコンパイルエラーとなってしまいます。

# うまくいく例
```java
package test.sp;

public class Super {
    protected void method() {
        System.out.println("Super#method() called.");
    }
}
```

```java
package test.sub;
import test.sp.Super;

public class Sub extends Super {
    public static void main(String[] args) {
        Sub sub = new Sub();
        sub.run();
    }

    private void run() {
        // (1)
        Sub sub = new Sub();
        sub.method();

        // (2)
        this.method();

        // (3)
        method();

        // (4)
        super.method();
    }
}
```

今度はうまくいく例ですが、SuperクラスおよびSuperクラスとSubクラスとの関係は変わらず、Subクラスからの呼び出し方法だけ変わっています。(1)から(4)までありますが、どれもコンパイルが通り、実行時にも特にエラーは発生せずに動作しました。

```java
// (1)
Sub sub = new Sub();
sub.method();
```

(1)はSubクラスのインスタンスを明示的に生成して、そのインスタンスのmethod()を呼び出しています。Superクラスのインスタンスではコンパイルエラーになりましたが、Subクラスのインスタンスであれば問題ないようです。

```java
// (2)
this.method();

// (3)
method();
```

(2)はthisでの呼び出しです。これも動作します。(3)はthisの記述を省略しているだけで、(2)と実質同じです。thisは自身のインスタンスを指すわけなので、Subクラスのインスタンスのmethod()を呼んでいるという意味では、(1)〜(3)のいずれも同じです。

```java
// (4)
super.method();
```

(1)〜(3)と少し異なるのが(4)です。(4)はsuperのmethod()を呼び出していますが、これも動作します。superは（自身と関連づけられている）スーパークラスのインスタンスを指します。Superクラスのインスタンスを明示的に生成して、そのインスタンスのmethod()を呼び出した際はコンパイルエラーとなったのに、superであれば問題ないのですね。
いずれもSuperクラスのインスタンスという点では変わらないので同じ挙動になると思っていたのですが、ちょっと意外な結果となりました。

# まとめ
protectedで修飾されたメソッドについて、別パッケージで定義されたサブクラスからの可視性は下記のようになります。

- サブクラス内で、newで明示的に生成されたサブクラス自身のインスタンスから呼び出せる
- サブクラス内のthisから呼び出せる。thisの記述を省略して呼び出す場合も同様
- サブクラス内のsuperから呼び出せる
- サブクラス内で、newで明示的に生成されたスーパークラスのインスタンスからは呼び出せない
- protectedの可視性について「同一パッケージ内およびサブクラスからのみアクセス可能」と理解していると、上記の呼び出せないパターンについて呼び出せると勘違いする可能性がある

# 蛇足
同一パッケージ内からのみ呼び出し可能にしたいという意図でprotectedで修飾されていると思われるメソッドを見かけることがありますが、この場合はprotectedではなくパッケージプライベート（修飾子なし）を使うべきです。
protectedって個人的にはあまり使いません。（使い方を理解してないのかもしれませんが…）
obnizでRDM-01を動かす(その2)

##はじめに
RDM-01をobnizで遊べるように、obnizを使ってGPIOが変化した時にのみ呼ばれるサンプルを作ろうと思い、それで作ってみたのが以前[obnizでRDM-01を動かす](https://qiita.com/norippy_i/items/3dcafa687330f9e58376)の記事でした。
しかし、これを書いた後にobnizユーザーさんから
　　
"ループしなくてもGPIOの変化が取れるよ！"
(なんだって！！！)
と教えてもらったので、改めてobninzのライブラリを見直して、実際に実装しました。


#サンプルコード
サンプルコード自体は[RDM-01のgithub](https://github.com/norioike/DTMF_module_RDM-01/tree/master/obniz_sample)にUPしました。

早速サンプルコードを。

```javascript:obnizRDM_sample.js

<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
  <script src="https://unpkg.com/obniz@1.16.1/obniz.js" crossorigin="anonymous"></script>
</head>
<body>

<div id="obniz-debug"></div>
<h1>RDM-01　sample</h1>
<div id="print"></div>
<h2>画像のようにobnizと接続してください</h2>
<img src="https://github.com/norioike/DTMF_module_RDM-01/blob/master/obniz_sample/obniz_connection_image.JPG?raw=true">
<script>
   
let Decode = ["D","1", "2", "3", "4","5", "6", "7", "8","9", "0", "*", "#","A", "B", "C"]

var flg = false;
var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
    
//電源の設定
  var usb = obniz.wired("USB" , {gnd:5, vcc:6} );
  usb.on();
  
  //ディスプレイ
  obniz.display.clear();
  obniz.display.print("RDM-01起動！");

  
  obniz.io0.input(async function(value){ //StDの電圧が変化した時に呼ばれる。
    if(value){ // LOW -> HIGHになったとき
      let q1 = await obniz.io4.inputWait();
      let q2 = await obniz.io3.inputWait();
      let q3 = await obniz.io2.inputWait();
      let q4 = await obniz.io1.inputWait();
      
      let result = (q4 << 3) +  (q3 << 2) +  (q2 << 1) + q1

      obniz.display.clear();
      obniz.display.print(Decode[result]);
      console.log(Decode[result])//PCの画面上にもログとして表示する
    
    }else{　// HIGH -> LOWになったとき
     console.log("DTMF sound stopped");
    } 
  });


}

</script>
</body>
</html>
```
このままコピペしてもらえれば動かすことができるようになっています。


ポイントは

```
obniz.io0.input(async function(value){
```
この１行で、io0の入力がHIGH ->  LOW, LOW -> HIGHになったときにのみ呼ばれるようになります。
別にループする必要はなく動かすことができるので、サンプルコードのように、シンプルにまとめることができました。
Swift4でimageOrientationの補正をする

# 要旨
Swiftで画像処理のプログラムを書いている時とかに、`UIImage`を`CGImage`とかに変換して処理することがあると思う。それをまた`UIImage`に戻して表示すると、たまに画像の向きがおかしく表示されることがある。これを補正する方法を紹介する。

# 手順
[こちらのGist](https://gist.github.com/schickling/b5d86cb070130f80bb40)に画像の向きを補正する`UIImage`の拡張のコードが載っている。Swift4の場合、スクロールの一番下のやつをコピペでOKだった。あとは、なんらかの処理をする前に、`UIImage`の変数に対して、以下の処理を書けば向きが補正される。

```
image.fixedOrientation()
```

こういうあまり時間をかけたくないところのコードを、載せてくれてると非常にありがたいですね。

# 参考
* [参考にしたコード](https://gist.github.com/schickling/b5d86cb070130f80bb40)
* [AVCaptureOutputで撮影した写真のimageOrientationを修正する](https://blog.piyo.tech/posts/2018-07-09-fix-uiimage-orientation/)
* [CGImageは画像の向きを保持していない](https://qiita.com/YutoMizutani/items/de6c0f2200bdbab10624)
[ワンライナー]環境変数$PATHを改行して出力する方法[sed, Ruby, Python, AWK]

やり方はたくさんあるので、お好きなものをどうぞ。

未経験の子に`$PATH`の概念を教えて実際に出力してもらった時に、デリミタ`:`で改行する方法を教えました。

ワンライナーって色々なやり方があるのですが、皆様はどんな流儀をお持ちでしょうか。
私はAWKが好きで、なんでもAWKでやりたくなっちゃいます。


### sed
いきなりですが、短く書けますし、sedが一番良いと思います。

```bash
sed 's/:/\n/g' <<< $PATH
```

trを使って書けばよりシンプルです。

```bash
tr ':' "\n" <<< $PATH 
```


### Ruby 

何でもRubyで書かないと気がすまない人っていますか？

```ruby
ruby -F: -ane 'puts $F' <<< $PATH
```
これは少し説明が必要かもしれないですね。`-F`のオプションでデリミタ−を設定し、なおかつauto splitのオプション`-a`をつけることにより、自動的に`$F = $_.split`を実行します。

つまりこういうことです。

```ruby
ruby -ne 'puts $_.split(":")' <<< "$PATH"
```

### Python
Pythonはよくわからないので、これが一般的な感じか不安はありますが、argvを利用するためにsysをimportする必要があり、記述が長くなるのが欠点ですね。

```python
python -c 'import sys; print "\n".join(sys.argv[1].split(":"))' "$PATH"
```

### AWK

AWK好きです。ターミナル上での簡易なテキスト処理ならAWK最強です。しかし、for文とかwhile文とか書きたくないんですよね・・・。

```awk
awk -F ':' '{ for(i = 1; i <= NF; i = i + 1) print $i }' <<< $PATH
```
とか

```awk
awk '{ split($0,arr,":"); for(var in arr) print arr[var] }' <<< $PATH
```

ただし、上記のsedでやったような考え方でやることもできます。

```awk
awk '{ if (gsub(/:/ ,"\n")) print }' <<< $PATH
```
ですね。
ノンプログラマー、はじめてのSQL

全く知識のない状態からSQLを叩けるようになるまで何をしたかをざっくりまとめました。因みに大体二週間程度でそこそこ書けるようになりました。

# 自己紹介
元公務員志望のバリバリ文系大学生。プログラミングはPythonをたまに書くくらいの感じで知識は特にない。Qiita初投稿なのでなにか変なところあったら言ってください。

# SQLを始めた背景
ノリと勢いで某IT企業の長期インターンに参加。そこでSQLに触れることに。Redashを自由に使っていいとのことだったのでアサインされていた業務で練習をはじめました。

# はじめにやったこと
とりあえず『 [SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)] (https://www.amazon.co.jp/SQL%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80%E2%94%80%E2%94%80%E9%AB%98%E9%80%9F%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-WEB-DB-PRESS-plus/dp/4774173010/ref=sr_1_6?ie=UTF8&qid=1549346396&sr=8-6&keywords=sql) 』を一周だけさらっと読んでおく。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/345874/b80c6ab2-5ff6-9374-aca3-90b9631ffd76.png)　
基本を押さえておいて、あとは手を動かしながら覚えようと思っていたので、基本の構文と本のどこにどの内容が載っているかを意識して読み進めていきました。

# 実際に書き始める
辞書の代わりに先ほどの本と『 [達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ] (https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6SQL%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-%E7%AC%AC2%E7%89%88-%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%81%82%E3%81%AA%E3%81%9F%E3%81%B8-CodeZine-BOOKS/dp/4798157821/ref=sr_1_5?ie=UTF8&qid=1549346396&sr=8-5&keywords=sql)』を準備。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/345874/be97fb24-737b-fccb-1d69-9419f11ce59e.png)

#意識したこと
- 検索・質問をしまくる
- 紙に書き出す


### 検索・質問をしまくる
はじめたてで、知識がないため考えたところでわからないという状態でした。少しでも躓いたら即検索、即質問が効率的だなと。便利な世の中になりましたね。どんなに些細なことでもすぐにやりました。あと、詳しい人に書いたコードについてレビューしてもらったりも。

###紙に書き出す
想像してる内容を文でも図でもいいので書いてみる。私の場合、集合で考えていたのでベン図書いてそこに適宜情報追加していくような感じでした。それを設計図にすることもしばしば。

#スパゲッティ職人
2週間ほどが経ち、業務にも慣れてきた・そこそこSQLにも慣れてきたという状況で怠惰な心が「一気に必要なデータを集めてしまえ」と語りかけてきて、実行。超大作イケイケコードが見事に出来上がりました。しかし、実行すると返ってこない。おかしい。これは他部署にも迷惑がかかるぞと焦りまくりサーバーの管理をしている方に頼み、キューを削除してもらいました。
### 原因と対処
単純な指令を集めて書いたが、元のデータが大きい＋集めすぎて結局複雑すぎる指令になった（所謂スパゲッティクエリ）ことが原因となった。めっちゃ反省したとともに、いかにサーバーに負担をかけず、高速なクエリを書くかというところに焦点を当て始めた。
そこで、『[SQLアンチパターン](https://www.amazon.co.jp/SQL%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Bill-Karwin/dp/4873115892/ref=sr_1_1?ie=UTF8&qid=1551509784&sr=8-1&keywords=sql%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)』を読むことに。![image.png](https://qiita-image-store.s3.amazonaws.com/0/345874/5bee799d-ee68-f4cc-4c7e-39cc0725a531.png)

この本にはわかりやすくアンチパターンや事例が掲載されており、とても勉強になりました。

#最後に
といった雑な感じですがこんな感じで3週間ほど勉強したら粗削りなりにそこそこMySQLが書けるようになりました。拙い文章で恐縮でしたが、ここまで読んでいただきありがとうございました。
KnowledgeをiMacにインストールする

## はじめに
知見を社内で共有するのに、何かいいのないかな〜と探していたところ「Knowledge」と言うOSSを見つけました。  
使い勝手を試すために、自分の環境にセットアップしてみました。
## 環境
OS: macOS Mojava
## JDKをインストールする
### Oracleの公式サイトにアクセスする
[Java SE Development Kit 8 Downloads](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)にアクセスします。
### 自分の環境にあうJDKのインストーラーをダウンロードしてくる
上でも記載していますが、私の環境はmacOS Mojavaです。  
なので、Mac OS X x64 の項にあるjdk-8u5-macosx-x64.dmgをダウンロードしてインストールします。  
（※ここは適宜自分の環境で読み替えてください。）
<img width="712" alt="jdk_version.png" src="https://qiita-image-store.s3.amazonaws.com/0/218674/6f11a81e-71b9-5ec9-99f3-e15e2967ea08.png">
（注意）Accept Licenseにチェックは入れましょうね！じゃないと、DLできません。
### インストーラーの内容に従いインストールする
DLしてきたファイルをクリックすると、下記のようなポップアップが出現します。
<img width="473" alt="2019-03-02-01-29-14.png" src="https://qiita-image-store.s3.amazonaws.com/0/218674/3cb1704b-76bf-4263-834a-4647937263a0.png">
箱のアイコンをダブルクリックして、Installを進めましょう。
### 確認
以下のコマンドを入力して、Javaのバージョン情報が表示されれば成功です！  

```
$ java -version
```

## Apache+Tomcatをインストールする
### 公式サイトからtar.gzファイルをダウンロード・解凍する
[Apache Tomcatの公式サイト](http://tomcat.apache.org/download-70.cgi)から、Coreのtar.gzをDLしてきます。
<img width="1004" alt="2019-03-02-10-01-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/218674/df025f7e-2b4f-e35d-6fe4-649a68471b36.png">
### Tomcatを展開するパスなどの設定を行う
下記のコマンドを実行して、tar.gzファイルを解凍します。  

```
$ tar -zxvf ~/Downloads/apache-tomcat-7.0.93.tar.gz
```
解凍したapache-tomcatフォルダを/usr/localに移動させます。

```
$ sudo mv ~/Downloads/apache-tomcat-7.0.93 /usr/local
```
わかりやすくするために、/LibraryしたにTomcatを作成し、/user/local/apache-tomcat-7.0.93へのシンボリックリンクをはります。

```
$ sudo ln -s /usr/local/apache-tomcat-7.0.54 /Library/Tomcat
$ sudo chown -R <username> /Library/Tomcat
  ※<username>には、自分のアカウント名を入れてください。
```
### Tomcatの起動・アクセス確認をする
bin下の.sh全てに実行権限を付与します。  

```
$ sudo chmod +x /Library/Tomcat/bin/*.sh
```
startup.shを叩いて、Tomcatを起動させます。  

```
$ /Library/Tomcat/bin/startup.sh
```
`http://localhost:8080`で起動されるので、ブラウザからアクセスして起動されている事を確認しましょう。
## Knowlegeをインストールする
### 公式サイトからknowledge.warをダウンロードしてくる
[KnowledgeのGitHub](https://github.com/support-project/knowledge/releases)から、knowledge.warをダウンロードしてきます。
<img width="922" alt="2019-03-02-15-22-27.png" src="https://qiita-image-store.s3.amazonaws.com/0/218674/ecebb554-38b0-1eda-e4e8-3e5d0d494ece.png">
### Tomcat上に配置する
knowledge.warをTomcatのwebappディレクトリに配置します。

```
$ mv ~/Downloads/knowledge.war /Library/Tomcal/webapp/
```
これだけで使えるようになるので、本当に簡単。。。
### アクセス確認をする
最後に`http://localhost:8080/knowledge`にアクセスをして、本当に使えるようになっているか確認してみましょう。
システムのトップ画面が表示されればOKです！

## 次の展望
手軽なので、仲間内で共有して使えるようにクラウド上にセットアップしてみようと思います。    
AWSかGCPのどちらかでやってみようかと思います。  

それも記事化しようと思います！
10^nと1<<mのまとめ

<img width="424" alt=" 247.png" src="https://qiita-image-store.s3.amazonaws.com/0/77643/e2e81f19-0c25-823a-7190-c9bb4360fe7b.png">
<img width="152" alt=" 248.png" src="https://qiita-image-store.s3.amazonaws.com/0/77643/51431434-83fb-6520-3d76-2a36abe412d0.png">
csv をパースする JavaScript


車輪の再発明です

# CSV の仕様

[RFC 4180](https://tools.ietf.org/html/rfc4180)

改行は `CRLF` でなければならないそうです。

# 実装例

```js
function parseCSV(d) {
	let t = d.replace(/\r\n$/u, '')
	const r = [[]]
	let c = 0
	let l, m, n
	while ([l, m, n] = /^(|[^",](?:[^,\r]|\r[^,\n])*\r?|"(?:[^"]|"")*")(,|\r\n|$)/u.exec(t)) {
		if ('"' === m[0] && '"' === m[m.length - 1]) m = m.slice(1, -1)
		r[c].push(m.replace(/""/gu, '"'))
		if (!n) break
		if (',' !== n) r[++c] = []
		t = t.substring(l.length)
	}
	return r
}
```

# 実装例2

`\n` や `\r` も改行とみなす方が便利かと思います。

```js
function parseCSV(d) {
	let t = d.replace(/(\r?\n|\r)$/u, '')
	const r = [[]]
	let c = 0
	let l, m, n
	while ([l, m, n] = /^(|[^",][^,\r\n]*|"(?:[^"]|"")*")(,|\r?\n|\r|$)/u.exec(t)) {
		if ('"' === m[0] && '"' === m[m.length - 1]) m = m.slice(1, -1)
		r[c].push(m.replace(/""/gu, '"'))
		if (!n) break
		if (',' !== n) r[++c] = []
		t = t.substring(l.length)
	}
	return r
}
```
ランチャー：迅速にフォルダー移動、ソフト起動できる

普段の仕事の中で、フォルダーに移動する作業は何回も繰り返しています。
Windows自体はよく使うフォルダー、アプリが表示する機能がありますが、
やはり自分よく移動したいフォルダー、アプルを登録し、OneClickで目的地に到着するのは、ランチャーソフトです。

フリーのランチャーはいくつかあります。
#ランチャーソフト
窓の杜様サイトイメージです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/d2327051-b7ea-44f8-fbc8-8ab69e0e4328.png)

#CLaunch
ダウンロードしてインストールし、起動すると下記の様子です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/7ace9d4f-28e6-0e67-9684-b2b15ee347bd.png)

tabごと、いっぱい登録できます。

#アイテム登録
フォルダー、URL、アプリなどを登録できます。
空いている枠に右クリックして、アイテム登録をクリックすると、新規登録できる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/9de779df-5163-bbbd-91a1-92289320e862.png)

いつも繰り返しの移動時間はなくなり、効率で楽です。

以上
【Swift】Controllerとxibを繋げる方法

一番簡単な方法は、`controller.swift`と`controller.xib`のファイル名を同じにする。

もしどうしても同じ名前にできない場合は、明示的にControllerからxibを紐付けることも可能。

```swift
override func loadView() {
    if let view = UINib(nibName: "xibName", bundle: nil).instantiateWithOwner(self, options: nil).first as? UIView {
    self.view = view
    }
}
```
VirtualBox + CentOS7でGUIが操作できなくなる問題の解決

# はじめに
ホストOSにWindows10。VirtualBox 6.0にCentOS7を入れ使っているのですが、どうもバグがあるようですぐにGUIが反応しなくなります。

# 解決
以下の記事に書いてありました。
https://bugs.centos.org/view.php?id=15570

カーネル 3.10.0-957.x.el7 特有の問題だそうです。
自分の使っているCentOS7は、、

```shell:
$ uname -a
Linux localhost.localdomain 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
```

ビンゴ。
ではカーネルを[ココ](https://hackers-high.com/linux/update-centos-kernel/)を参考にアップデートします。

```shell:
$ su
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# yum --enablerepo=elrepo-kernel install kernel-ml
# reboot
```

起動するとkernelが3.10→4.20になっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/272771/1b79ef7e-02fc-1efd-0e4b-52f222e2745d.png)

しばらく使いましたが、確かに直ったようです。

# 【参考】kernel versionについて

Linuxのバージョンが3.10から4.20と大きくジャンプしています。。
私がLinuxを開発で使っていたのは2.6.16くらいの昔なのですが、今はだいぶバージョンの考え方が変わったようですね。

https://elinux.org/images/8/86/Jamboree_62_LTS_20170901.pdf

Linux 3系から4系に変わるのも、大きな変更があったからではないそうです。
https://japan.zdnet.com/article/35060811/

あと、ターミネータのT-800のkernelがLinuxで、4.1.15 というのは知りませんでした。。
Goでスタティックバイナリにするオプション

備忘録
https://github.com/golang/go/issues/26492#issuecomment-435462350

>
We build golang binaries across a variety of platforms, preferring static builds wherever possible. Here are the flags we're currently using:
>
windows: -tags netgo -ldflags '-H=windowsgui -extldflags "-static"'
linux/bsd: -tags netgo -ldflags '-extldflags "-static"'
macos: -ldflags '-s -extldflags "-sectcreate __TEXT __info_plist Info.plist"'
android: -ldflags -s
>
On macos and android, we need to be able to pull in system frameworks and libraries so we opted not to build static binaries.

Linuxの例

```bash
$ go install -tags netgo -ldflags '-extldflags "-static"'
```
さまざまなCoroutineDispatcherの指定方法メモ

# 概要
Kotlin CoroutineはDispatcherによって実行スレッドを制御する。そのDispatcherを切り替えることで、コルーチンのコードをテスト可能にできます。

DroidKaigiではCoroutinePluginによるやり方を作成して利用していました。そこにAppCoroutineDispatcherを使う[PR](https://github.com/DroidKaigi/conference-app-2019/pull/230
)が来ました。

3つの指定方法があるのでそれぞれ見ていきましょう。
CoroutinePlugin
AppCoroutineDispatcher
kotlinx-coroutines-test

# CoroutinePluginによるやり方

CoroutinePluginはKotlin Corotuinesに存在するクラスではなく、アプリ内で作って使う形になります。
DroidKaigiアプリで採用されている方法
RxJavaのスケジューラーを真似たやり方でstaticでもって置いて切り替えができるようにする方式です。

```kotlin
object CoroutinePlugin {

    private val defaultIoDispatcher: CoroutineContext = Dispatchers.IO
    val ioDispatcher: CoroutineContext
        get() = ioDispatcherHandler?.invoke(
            defaultIoDispatcher
        ) ?: defaultIoDispatcher
    @set:VisibleForTesting
    var ioDispatcherHandler: ((CoroutineContext) -> CoroutineContext)? = null

...
```

https://github.com/DroidKaigi/conference-app-2019/blob/master/corecomponent/androidcomponent/src/main/java/io/github/droidkaigi/confsched2019/ext/CoroutinePlugin.kt

テストでは `CoroutinePlugin.mainDispatcherHandler = { Dispatchers.Default }`  などで置き換えが出来ます。



# AppCoroutineDispatchersによるやり方

AppCoroutineDispatchersはこういうクラスを作って、これをInjectすることで置き換えるパターン。[Chris Banesがやっていたもの](https://medium.com/androiddevelopers/rxjava-to-kotlin-coroutines-1204c896a700)になります

```kotlin
data class AppCoroutineDispatchers(
    val database: CoroutineDispatcher,
    val disk: CoroutineDispatcher,
    val network: CoroutineDispatcher,
    val main: CoroutineDispatcher
)
@Singleton
@Provides
fun provideDispatchers(schedulers: AppRxSchedulers) = 
    AppCoroutineDispatchers(
        database = schedulers.database.asCoroutineDispatcher(),
        disk = schedulers.disk.asCoroutineDispatcher(),
        network = schedulers.network.asCoroutineDispatcher(),
        main = UI
    )
```

# kotlinx-coroutines-testによるやり方

kotlinx-coroutines-testを依存関係に追加して、これだけです。


https://github.com/Kotlin/kotlinx.coroutines/tree/master/core/kotlinx-coroutines-test#using-in-your-project より

```kotlin
class SomeTest {
    
    private val mainThreadSurrogate = newSingleThreadContext("UI thread")

    @Before
    fun setUp() {
        Dispatchers.setMain(mainThreadSurrogate)
    }

    @After
    fun tearDown() {
        Dispatchers.resetMain() // reset main dispatcher to the original Main dispatcher
        mainThreadSurrogate.close()
    }
    
    @Test
    fun testSomeUI() = runBlocking {
        launch(Dispatchers.Main) {  // Will be launched in the mainThreadSurrogate dispatcher
            ...
        }
    }
}
```

これには一つだけ問題点があって、**Dispatchers.Mainしか置き換えが出来ません。**

# どうしたか
CoroutinePluginによるやり方を使いました。

メリデメに関しては以下にまとまっています
https://github.com/DroidKaigi/conference-app-2019/issues/236

まず`kotlinx-coroutines-test`はMainしか置き換えできないので、用途に合わない場合も出てきそうでした。ただ今考えてみるとこれと`runBlocking()`でテストを対応できた説もあるので、チャレンジしてみるのはいいと思います。
AppCoroutineDispatchersによるやり方はDroidKaigiでは`ReceiveChannel.toLiveData()`にわたす必要があるなど、大量に使われる部分でもDispatcherを渡していく必要が出てきたりなどするため、結構煩雑になってしまいそうでした。そのためCoroutinePluginを使う方法をそのまま使いました。
好みの問題もあるので、基本的には`kotlinx-coroutines-test`でやってみて、何か問題があれば変えていくのがいいかなと思います。
SalesforceのデータローダーがZulu OpenJDK 11でリリース

#概要
Salesforceのデータローダーは、これまでOracle Java 8でビルドされていましたが、Ver.45のリリースで「**Zulu OpenJDK 11**」でビルドされるようになりました。下記のGitHubで公開されているので、早速導入してみました。
https://github.com/forcedotcom/dataloader/releases/tag/v45.0.0

>Zuluとは
>https://qiita.com/nowokay/items/edb5c5df4dbfc4a99ffb
>ZuluはAzul Systemsが提供しているOpenJDKビルドです。Azul Systemsは OpenJDKのサポートを行う企業で元OracleのSimon Ritter氏が属している会社です。
CustomerにMicrosoftもあるので、たぶんMicrosoft Azureもzuluを使っているんではなかろうか。

#手順
##Dataloaderをダウンロード
https://github.com/forcedotcom/dataloader/releases/download/v45.0.0/dataloader_mac.zip
![image.png](https://qiita-image-store.s3.amazonaws.com/0/138335/580e22bc-15f9-969b-ecd6-dee70f72b117.png)
現時点では、まだdmgは公開されておらず、jarを直接実行して起動する必要があります。
Zuluを入れないで、Java 8で実行すると下記のエラーになります。

```
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/salesforce/dataloader/process/DataLoaderRunner has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
```

##Zulu Open JDKをインストール
https://www.azul.com/downloads/zulu
![image.png](https://qiita-image-store.s3.amazonaws.com/0/138335/70cc9752-2858-001c-44be-d43072950698.png)
※Java 8の無料アップデートは、あと45日とのこと・・・

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138335/af2479ff-1a3c-d017-8dad-28070fb1e5c6.png)

##PATH(`JAVA_HOME`)をアップデート
Java 8のパスが設定されているはずなので、Zuluのパスでアップデートします。

```shell
export JAVA_HOME=/Library/Java/JavaVirtualMachines/<zulu_package>/Contents/Home/
```

##コマンドから起動
Macである場合は、下記のコマンドからDataloaderを起動できます。

```shell
java -XstartOnFirstThread -jar target/dataloader-xx.0-uber.jar
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/138335/90ec391b-3dc7-5c14-fde2-c03e94a437db.png)

#まとめ
JDKが変わっただけで大きな変化はないと思いますが、本番での作業等を行う場合には念の為に早めに新しいバージョンに切り替えて実施した方がいいです。
jQueryの書き方　〜初級〜

jQueryの超初歩を備忘録としてメモしておきます。
言語を複数使っていると、書き方がこんがらがってしまったりするので、
『どう書くんだったかな』となった時用です〜(^o^)

# 基本的な書き方

**$('セレクタ'・ 'id' ・ 'class').メソッド;**
htmlで使用しているセレクタ等を指定して、そのセレクタ等にメソッドを実行する。
以下のコードは、h1を徐々に隠せ！というコード。

```javascript
$(function() {
  $('h1').fadeOut();
});
```

ちなみに書き出しのfunctionですが、HTMLの読み込みが完了してからjQueryの操作を開始するようにという指定です。

```javascript
$(function() {
  //
});
```
下のような書き方もできますが、長いのでどちらかというと前者の方が使われますね。

```javascript
$(document).ready(function(){
  //
});
```
# イベントのタイミングを指定する

**$('セレクタ'・'id'・'class').イベント(function(){  hogehoge  });**
htmlで使用しているセレクタ等を指定して、そのセレクタ等に実行するメソッドを、
発火タイミングを指定して設定する。
以下のコードは、id=hide-text要素がクリックされたら、id=textを下から上にアニメーションで表示させて！というコード。

```javascript
$(function(){
  $('#hide-text').click(function(){
    $('#text').slideUp();
  });
});
```

# 自身を指定する
**$(this)**
発火イベントの時に自身を指定すると、イベントが起こった要素を取得することができる。
以下のコードは、クリックされたリストのcssを変更して！というコード。

```javascript
$(function(){
  $('li').click(function(){
    $(this).css('color', 'red');
  });
});
```
# 変数を宣言する
同じjQueryオブジェクト（これまでで$()で宣言したもの）を複数回使う時は、変数にしましょう！
処理が高速化されます。
いちいち$()と宣言していると、そのオブジェクトを都度読みにいきますが、変数にしていればそのオブジェクトを読みにいかず、変数に格納されているデータを使うからです。
変数宣言にはvarを使います。
以下のコードは \$('div') を\$divに格納しています。
jQueryオブジェクトを格納する時は、わかりやすいように先頭に$をつける慣習があります。

```javascript
var $div = $('div');
```

# メソッドチェーン
同じfunction内でメソッドを何回も使いたい場合、メソッドチェーンを使えばスマートに書くことができます。
例えば以下のようなコードは、cssとfadeOutを同じthisに対して使っている場合です。

```javascript
$(function(){
  $('li').click(function(){
    $(this).css('color', 'red');
    $(this).fadeOut();
  });
});
```
これは以下のようにメソッドチェーンを使って書くことができます。

```javascript
$(function(){
  $('li').click(function(){
    $(this).css('color', 'red').fadeOut();
  });
});
```
冗長ではなく綺麗になっていますね！

# 下階層の要素を取得

find()とchildren()がある。
find()は、要素の下階層にある指定した要素を取得する。
children()は、要素の"1階層下"の指定した要素を取得する。

```html
<div is="wrapper">
  <a href="#">リンク1</a>
  <p>
    <a href="#">リンク2</a>
  </p>
</div>
```
```javascript
$(function(){
  $('#wrapper').find('a')
});
//リンク1とリンク2が取得できる

$(function(){
  $('#wrapper').children('a')
});
//リンク1だけ取得できる
```

初級編は以上です！
中級編もまとめています(*^^*)/
ヤマハルータユーザのためのCiscoルータコマンド対応表

ヤマハルータ使いがCiscoルータを使い始めたときに、くしゃみが出ないようにするための対応表です。

# 環境

* YAMAHA RTX1200 Rev.10.01.65
* Cisco 1812J 12.4


# 対応表


## コマンド以外

|  | ヤマハ | Cisco |
|:--|:--|:--|
| ログイン|telnetしてパスワードを入力 | telnetしてパスワードを入力 |
| 設定取得 | ルータにtftp接続して、**config/パスワード**をgetする | ルータ外部にtftpサーバを立て、`copy running-config tftp:`|
| 設定書込 | ルータにtftp接続して、**config/パスワード**へputする ||

## 一般コマンド

CiscoルータのCLIにはモードがあります。
通常(?)モードと設定モードです。
設定モード中にコマンドを実行したいときは、コマンドの先頭に「do」を付けます。
例: `do show running-config`

ヤマハルータもCiscoルータも、コマンド入力中に「?」を押すとヘルプが表示されます。


|  | ヤマハ | Cisco |
|:--|:--|:--|
| 特権実行可能状態へ | `administrator` | `enable` |
| 設定モードへ入る  |   | `configure terminal` |
| 設定モードを抜ける | | `exit` |
| 設定保存 | `save` | `copy running-config startup-config` |
| PP接続 | `connect pp 番号` | （わからない） |
| PP切断 | `disconnect pp 番号` | （わからない） |

## 情報表示系コマンド

どちらも`show`の後ろに続けます。

| 表示項目 | ヤマハ | Cisco |
|:--|:--|:--|
| 設定  | `config`   | `configuration` / `running-config`  / `startup-config` |
| ログ | `log` | `logging` |
| ルート | `route detail` | `ip route` |
| PP接続状態| `status pp 番号` | `pppoe session` |
| IPsec IKE フェーズ1 | | `crypto isakmp sa` / `crypto isakmp sa detail` |
| IPsec IKE フェーズ2 | | `crypto ipsec sa` |
Excelアドイン：RelaxTools Addin

Excelアドインは自作も簡単ですが。
すでに存在するアドインの利用も選択肢です。

RelaxTools Addinは、日本スタイルにあう機能が多くありますので、共有します。

#RelaxTools とは
https://github.com/RelaxTools/RelaxTools-Addin
各種変換、編集、検索などの機能追加を行うツールです

#対応バージョン
Excel 2010/2013/2016

#機能概要
Githubに記載した内容です。
>Excelブック内部のGrep／置換が可能。
Excel表をHTML変換。（Excelをデザイナとして利用可能）
シェイプ内の文字列またはセルの正規表現検索および置換
２００７互換のプレビュー画面表示
同名のブックを開く（読み取り専用のみ）
セルの重複チェック／文字数／バイト数の確認
半角／全角／数値／英字／英数字／日付チェックおよび主なチェックデジットチェック 等
セルの前後のトリム／文字挿入／文字削除／改行削除 等
大文字／小文字／ひらがな／カタカナ／全角／半角変換 等
ボタン１つで行列の入れ替え／縦方向に結合など標準で無い機能
強調用シェイプ（長方形・楕円・矢印・ふきだし）
画像大小、矢印をまっすぐにするなどの調整機能。
ブック名をクリップボードに張付、現在のブックの場所をエクスプローラで開く
２００３互換の色パレット
選択範囲を上下左右に移動
シートの管理（シート名のソート、選択、表示／非表示、削除）
ブックをシートごとに分割、複数ブックを１つにマージ
保存時に、カーソルをＡ１に自動設定する
ブックの簡易世代管理
かんたんに表を作成する機能(特にテーブル機能が使いづらいという方に)
ＥＸＣＥＬ表を文字列罫線に変換する機能
職印機能（データ印、認め印、ビジネス印）
ファイルの一覧を作成する機能
ファイルツリーを作成する機能
セルの文字からフォルダを作成する機能
ＳＱＬを整形する機能
セルを外部エディタで編集する機能
イメージをファイルに出力する機能。
RelaxToolsのほとんどの機能をショートカットキーに割り振る機能。
Ｆ１キーを無効にする機能。
Wordのように段落番号(1.1.1等)を振る機能。
段落番号をもとに目次を作成する機能。
十字カーソルを表示する機能。
エクスプローラからファイルの一覧を取得。
ファイル一覧またはブック名からエクスプローラでコピーが可能。
付箋作成機能。
Excel/Word/PowerPointのページ数カウント
VBAのステップカウント
バージョン管理クライアント「TortoiseSVN」「TortoiseGit」に対応。Commit, Revert が簡単に。 ・・・などなど250を超える機能を搭載

#インストール
ZIPファイルをダウンロードし、解凍後、install.vbsをクリック

#RelaxToolsメニュー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/e3571c24-5511-e9c5-99e2-b70f3cd3fe82.png)

#RelaxShapesメニュー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/415c61f9-08b0-d38b-5ba5-be53d3742950.png)

#RelaxWordメニュー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/e7ce75fd-d119-e650-4aad-f8147406fab2.png)

#RelaxAppsメニュー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/e3a75c9e-1f3e-132b-5794-2d6ba0a9eb9b.png)

以上
補完機能によっていかに楽してたか思い知った話

初投稿にして超初心者が書くことにしては玄人感のあるタイトルですが、本当にそう感じたので肝に銘じておくためにも「テキストエディタのありがたさ」と「テキストエディタに依存しすぎない」必要性を記しておきます。
##Progate内でコードを打つことの面倒くささ
私はあるきっかけで初めてProgateを触ることになったのですが、

```HTML:qiita.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>  
    <link rel="stylesheet" href="stylesheet.css">
  </head>
  <body>
  </body>
</html>
```
このテンプレートはatomなどのテキストエディタを使っていたら、Emmet（かな？）によって「！」を押せば上記の内容がすぐ出てきます。
それが分かって以来、こんな煩わしいことしてられないと、特に時間を無駄にしてないくせに思ったため、特に基礎的なことをすっ飛ばしていました。
今回Progateを利用していて上記の内容を書くことになりましたが、正直見ながらでないと書けないという事態に陥りました。
ここに何を書くとどう作用するかは理解できていたようですが、環境が変化したときに「！」で書いてくれない時に困るので初心者のうちはコードを打ち込む癖をつけるべきだと感じました。
##反省
以上のようにすることで「不便だな」と感じたところを補完してくれたり、自動化してくれる機能を作ろうというアイディアが生まれると思いますので、1から作るということを1回はやるきっかけを与えてくれました。
ありがとうProgateさん！
また、メモ帳でプログラムを書こうとしている方は1度テキストエディタを検索してみることをおすすめします。
私はatomしか使ったことがないので詳しくは分かりませんが、使えばきっと幸せな気持ちになるでしょう。
自己啓発のなり損ないの如き記事ですが、プログラミングをするに当たって必要な思考かと思われるので参考になれば幸いです。
IFTTTについて調べる


## サービスを提供する側のプラットフォーム

ウェブ連携サービスIFTTT､多出力アプレットを作れる開発者向け無料サービス｢Maker｣開始｡企業向けツールも無料提供 - Engadget 日本版
https://japanese.engadget.com/2017/05/29/ifttt-maker/

現在はプラットフォームの一部として統合されているみたい
ググラビリティが微妙
とりあえず、登録して簡単に動かした
サービスのところはややこしいしレビューがあるので放置

アプレットはやってみた、なるほど、すぐにはうまく動かぬ、シンプルなはずなのにアクティビティにfailedがでる
こちらもレビューみたいなものがあるっぽいので、それ待ちなのかな
フィルターで整形する必要がある、、わけでもないか、わからぬ

jsでフィルターで加工できるのは便利そうだけどどこまでできるのかな
今後だな

## 使えるサービスについて

場合によって位置情報レベルの個人情報とか結構提供しそうだけど、どうなってるのか不安
その観点で調べる

IFTTT連携の公開手順 - Chatwork Creator's Noten
https://creators-note.chatwork.com/entry/2018/12/12/173840

IFTTTによる審査があるのね。

https://ifttt.com/services

登録されているサービスも限られている。これは審査があるからかな。野良的なことにはなりにくいのだろう。

## 位置情報

【日本語】IFTTT(イフト)で使える「Location」トリガーの解説
https://ifttt-japan.club/knowledge/this/location

500mくらいの誤差か

https://ifttt.com/location

どこに明示されているかわからないけど、
みたところ他とは違ってサイトリンクとかはないのでIFTTTによるサービスなんだろうな
つまり位置情報をは提供するのはIFTTTに対してということでいいのかな
それだとサービスの規約に書いている範囲で扱いはホショウされるのかな

## ほかの競合（？）サービス

* Zapier
* Integromat

IFTTT と Zapier と Integromat それぞれでGoogle Formsの回答をSlackに通知してみる - tech.guitarrapc.cóm
https://tech.guitarrapc.com/entry/2018/07/23/092105

IFTTT と Microsoft Flow と Zapier の比較 | blog.yottun8.com
http://blog.yottun8.com/archives/548
【Python】文字列から数字だけを取り出したい場合

"2019年"→"2019"、という感じでpythonで文字列から数字を取り出したかった。
ググると下の記事が。
>pythonで文字列から数字だけ取り出す
https://qiita.com/sakamossan/items/161db7418ade037f6f3d

おお、簡単。
記事を参考するとこんな感じ。

```python
# 正規表現操作のライブラリ
import re

# re.sub(正規表現パターン, 置換後文字列, 置換したい文字列)
# \D : 10進数でない任意の文字。（全角数字等を含む）
num = re.sub("\\D", "", "2019年")
print(num)    # "2019"
```

re.sub()が何となく正規表現で文字列を""に置換して消しているんだろうな。
と、ふわっとした理解だったのでドキュメントを読んだメモ。

re.subの第一引数を記事では、r"\D"と書いていますが、これはraw文字列記法というらしい。
クォーテーションの前にrを書くことで、エスケープシーケンスである\を省略できるようです。
いつも"\\\\\\\\192.hogehoge\\\\C\\\\hogehoge"みたいなパスの書き方をしていたので今後はraw文字列記法とやらを使います。

pythonは現場での独学なので、どんなに短くても人のコードを読むのは非常に勉強になります。
Excelアドインの活用

Excelはだれでも知っているのですが、
場合によってアドインを使うと効率的になります。

#アドインを探す
挿入⇒アドインを入手
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/b73013ec-2237-c611-d18e-27dbe7d31e81.png)

使いたいアドインに追加ボタンを押すとインストールされます。

#個人用アドイン
挿入⇒個人用アドイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/e5c6d41a-a48e-acd7-8b42-6b5868679291.png)

例えば、大文字、小文字の変換ツール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/c4b3d662-a1f1-d75a-df1e-20e23235b083.png)

変換したい文字を選択し、ボタンを押すだけで完成です。
手動で変換する必要がありません。

ほかのいろいろ便利なツールがあります。
例えば：文字の差分比較
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346425/fb4574a3-454b-9d91-ac09-e5796d18baf1.png)


以上
Internet Protocol について

## IPとは?
- Internet Protocolのこと
- OSI参照モデルの第三層のネットワーク層に該当
- ip(or ifconfig)コマンド叩くと確認できる

## IPアドレスの3つの役割
- IPアドレスを用いてホスト（コンピューター)を識別する
- 経路探索をしてパケットを届ける
- パケットを転送する際に、最大転送範囲に応じてパケットを分割する

##　TCPとIP
- IPは相手にパケットを届けるが、その保証はしない
- TCPは、IPを利用してデータが確実に届くように処理をする
- IPがパケット転送を保証すればいいやんという指摘
  - プロトコルをシンプルにしたかったかららしい

## グローバルIPとプライベートIP
- IPの不足によってプライベートIPが誕生
- グローバルIPはユニーク、プライベートIPはユニークではない
- NATによってプライベートIPとグローバルIPのアドレス変換が可能に

## IPを支える技術
- DNS
- ARP
- ICMP
- DHCP
- NAT
- IPトンネリング
- etc...

## DNS
- Domain Name System
- IPアドレスとドメイン名を変換する
- nslookupコマンドで、ドメイン名を使用したとIPアドレスの確認ができる

```
➜  ~ nslookup www.google.co.jp
Server:		102.232.2.39
Address:	102.232.2.39#53

Non-authoritative answer:
Name:	www.google.co.jp
Address: 172.217.25.67
```

## ARP
- Address Resolution Protocol
- IPアドレスを使用てMACアドレスを割り出す
  - 通信にはmacアドレスも必要になるため
  - RARP(Revrese Address Resollution Protocol)という、MACアドレスからIPアドレスを割り出すプロトコルもある 

## ICMP
- Internet Control Message Protocol
  - IPが目的のパケットまで届くかどうかの到達確認
  - IPパケット廃棄の原因調査
  - ネットワーク設定の調査

## TTLとtraceroute
- TTL(Time TO Live)
  - IPパケットのフィールド。ルーターを1つ通過するごとに1つずつ減らされ、0になるとパケットが破棄される。 
    - 経路探索のエラーによって、パケットがネットワークを回り続けるのを防ぐために使用
  -  tracerouteコマンドを使うことによって、辿った経路を調べることができる
  -  使い方： ``` traceroute <宛先> ```

```
➜  ~ traceroute  www.google.co.jp
traceroute to www.google.co.jp (216.58.197.131), 64 hops max, 52 byte packets
 1  172.17.1.1 (172.16.1.1)  1.344 ms  2.017 ms  1.017 ms
 2  tokyo10-n438.flets.2iij.net (203.180.20.87)  2.741 ms  3.047 ms  2.830 ms
 3  tokyo10-ntteast1.flets.2iij.net (210.149.34.229)  4.007 ms  3.402 ms  3.469 ms
 4  tky001lip31.iij.net (160.13.162.5)  3.701 ms  3.931 ms  4.314 ms
 5  tky001bb11.iij.net (210.138.115.213)  3.559 ms  4.225 ms  3.730 ms
 6  tky001ix02.iij.net (58.138.100.58)  3.861 ms
    tky001ix04.iij.net (58.138.100.66)  3.290 ms  3.921 ms
 7  202.232.1.86 (202.232.1.86)  2.894 ms  5.158 ms
    72.14.242.38 (72.14.242.38)  4.194 ms
 8  108.170.242.129 (108.170.242.129)  5.690 ms  4.606 ms
    108.170.242.97 (108.170.242.97)  5.103 ms
 9  216.239.62.25 (216.239.62.25)  7.656 ms
    216.239.62.23 (216.239.62.23)  3.683 ms
    216.239.62.25 (216.239.62.25)  3.592 ms
10  nrt12s01-in-f3.1e100.net (216.58.197.131)  3.260 ms  4.623 ms  3.679 ms
```

## DHCP 
- Dynamic Host Configuration Protocol
- IPアドレスを動的に変更するプロトコル
  - 一台ごとにIPアドレスの設定をしなくても勝手にやってくれるので、楽
  - 一般家庭ではルーターにこの機能が備わっている
     -  確かにIPアドレス設定した覚えはない
  - 組織などではDHCPサーバーを設定する。
     - DHCPサーバーを複数設定する場合は、DHCPリレーエージェントを用いる。 

## NAT
- Network Address Tramslator
- プライベートIPアドレスをグローバルIPアドレスに変換する
- IPv4のアドレス枯渇問題を受けて誕生

## IPトネリング
- IPv4とIPv6の通信を可能にする
  - ネットワークがどちらかのプロトコルしかサポートしていない場合に、通信できない問題を解決する
- IPヘッダ(v4)の後に、IPヘッダ（v6）をつけることによって解決する  

## 参考
「マスタリングTCP/IP」入門編　第5版
【Blender】UnityにInportする為にBlenderで「Walk」「Run」「Jump」のアニメーションを作る

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Blender v2.79.6
⭐️Mac Book

<font color="Magenta">UnityにInportする為にBlenderで「Walk」「Run」「Jump」のアニメーションを作る</font>
実際に動かした動画はこちら↓↓
https://twitter.com/nonnonkapibara/status/1101563411240869888
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">✨【Blender】✨<br>やっとBlenderで🚩「Walk」🤸‍♂️「Run」🏖️「Jump」のアニメーション作れるようになったよぉ‼️<br>💕Ｏ(≧∇≦)Ｏ💕 <br>次は、これをUnityに取り込んで🤩「Animator Controller」🤩を勉強するよぉ<a href="https://twitter.com/hashtag/Blender3d?src=hash&amp;ref_src=twsrc%5Etfw">#Blender3d</a> <a href="https://t.co/rvMYqrUxYA">pic.twitter.com/rvMYqrUxYA</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1101563411240869888?ref_src=twsrc%5Etfw">2019年3月1日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



■Run
<img width="794" alt="スクリーンショット 2019-03-02 14.55.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/65e56a0a-482b-ea8f-3c51-3abe30769418.png">

■Jump
中心となるボーンを選択して、位置回転を選ぶ
<img width="799" alt="スクリーンショット 2019-03-02 15.00.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/8cdd0ad5-b28d-d9a2-f400-be8dbfea62b3.png">



<font color="Magenta">画像が多いとQiitaの容量オーバーで画像が貼り付けられなくなるので</font>
詳細は、「はてなブログ」に記載してます↓
[かぴばらさんの覚書ブログ nonkapibara](https://nonkapibara.hatenablog.com/entry/2019/03/02/150626)
Simon Prince風のヒートマップをPythonで出したい

# モチベーション

Simon J. D. Prince
 "Computer Vision:  Models, Learning, and Inference"
 (http://www.computervisionmodels.com/)

の中に出てくるヒートマップを、自分でも出してみたい！

# 実装

コード全体は[こちら](https://github.com/hiro-uchi/samples/blob/master/Heatmap_for_2D_Gaussian_Distribution.ipynb)。(※補足参照)

(2019/6/9追記)
`matplotlib.mlab.bivariate_normal`の代わりに`scipy.stats.multivariate_normal`を使用した場合の[コード](https://github.com/hiro-uchi/samples/blob/master/Heatmap_for_2D_Gaussian_Distribution_by_multivariate_normal.ipynb)も追加しました。

---
実装といっても、高級なことは何もしてません。まずはインポートから。

```Python
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import seaborn as sns
```

`seaborn`のインポートは必須ではありません。個人的な好みです。
続いてメッシュグリッドを作ります。

```Python
# メッシュグリッドの作成
X, Y = np.mgrid[-5:5:200j, -5:5:200j]
```

そしてこれらの格子点$(X, Y)$に対して、ガウス分布の値を求めます。


```Python
# 2次元ガウス分布
Z = mlab.bivariate_normal(X, Y, 2., 1., 0., 0.)
```

なお、`bivariate_normal`のI/Fは↓です。

>matplotlib.mlab.bivariate_normal(X, Y, sigmax=1.0, sigmay=1.0, mux=0.0, muy=0.0, sigmaxy=0.0)

そして可視化。


```Python
# ヒートマップを描画
plt.figure(figsize=(8, 6))
plt.pcolor(X, Y, Z, cmap=plt.cm.hot)
plt.colorbar()
plt.title('2次元ガウス分布')
plt.xlabel('$x$', size=12)
plt.ylabel('$y$', size=12)

plt.xlim((-5, 5))
plt.ylim((-5, 5))

plt.show()
```

するとこんな感じで表示されます。

![heatmap_2D_gaussian.png](https://qiita-image-store.s3.amazonaws.com/0/176176/b597f658-4e48-9992-b2f6-eb154aafc899.png)

よしよし。

※ちなみに`plt.contour`を使うと、等高線を出すこともできます。(詳細は[コード](https://github.com/hiro-uchi/samples/blob/master/Heatmap_for_2D_Gaussian_Distribution.ipynb)参照)
![heatmap_contour_2D_gaussian.png](https://qiita-image-store.s3.amazonaws.com/0/176176/b6456f5d-45e9-fb48-5432-f6de626776ab.png)

# 補足

- 2019/3/2現在、`bivariate_normal`については以下のワーニングが出ています。何に置き換えればよいのか？は不明。

>Deprecated since version 2.2: The bivariate_normal function was deprecated in Matplotlib 2.2 and will be removed in 3.1.

(2019/6/9追記)
`scipy.stats.multivariate_normal`を使用するのがよいようです。(Thanks to @Cartman0)

※
ただ、グラフの出力結果を`mlab.bivariate_normal`と[比べる](https://github.com/hiro-uchi/samples/blob/master/Heatmap_for_2D_Gaussian_Distribution_by_multivariate_normal.ipynb)と、微妙に異なっています。
この記事の趣旨から外れるため、ここではこれ以上深入りしませんが、詳細が分かれば別途展開します。
環境構築不要で機械学習hello worldする

# 概要
会社の開発合宿が毎年行われるのですが今年のテーマが機械学習なのでそのハンズオンを作りました.
目的としては「機械学習ライブラリをとりあえず触ってみる」に設定したので環境構築は不要でできるだけ敷居低くしました.
内容は,
- sklearnを使ったボストン
- lightgbmを使ったボストン
- kerasを使ったmnist
です.

# 必要なもの
- googleアカウント
以上!

# やり方
↓こちらのレポジトリのREADMEのリンクからcolaboratoryを開くだけ↓
https://github.com/tenajima/hello_machine_learning

セルを実行するときに「本当に実行します?」みたいなのでます.githubのjupyterを開いてるためです.
チェックを外して実行するともう聞かれなくなります.

以上!

# まとめ
colaboratoryすごい.
githubのjuypyterも参照できるんですね.
しかも必要なライブラリはだいたい入ってる.便利.
さらっと機械学習するならcolaboratoryで十分.

# 参考にさせてもらいました
[えるしってるか ColaboratoryではGithub上のjupyter notebookがひらける](https://sekailab.com/wp/2018/05/24/colaboratory-github-jupyter-notebook/)