OmniAICreator/Qiita-1.07M huggingface dataset:
CoreOS+Vagrantで開発環境を作った(ただ作っただけの記事)

# 日本語を入力できる仮想開発環境のためにその１
dockerなどを楽に運用できる環境を求めて環境構築を行いました。
[こちらの記事](http://melvins-nest.com/dev/2018/05/03/windows%e4%b8%8a%e3%81%abdocker%e7%92%b0%e5%a2%83%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b/)でDocker for Windowsを諦めたので、せめてもの新しいもの要素をということでCoreOS(ContainerLinux)を使ってみることにした。

(いつの間にやらContainerLinuxという名前になっていたり、初期化用のツールがcloud-initからignitionに代わっていたりと浦島太郎気分でした)

## 作ったVagrantファイル
https://github.com/ques0942/coreos-vagrant

## やったこと
[公式のVagrantfile](https://github.com/coreos/coreos-vagrant)をちょちょっといじり、以下のような修正を行った。

* ロケールの設定のために、config.ignを作った
 * お作法はわからないのでとりあえず環境設定に1行追加してみるだけ
 * ContainerLinuxConfigとどちらがいいかは不明
* VirtualBoxのディスク拡充用に[vagrant-disksize](https://github.com/sprotheroe/vagrant-disksize)を導入した
* VagrantfileからVMWareに関する記述を削除。ホビーユースならVirtualBoxだけで充分
* synced_folderの同期方法をrsyncに変更
 * ほかの同期処理はWindowsだと使いにくかった(smb不安定だし)
 * 一方向の同期しかできないが、Windowsで実装⇒CoreOSでテストとしたかったのでこれで良し
 * vagrant rsync-autoとすると自動的に変更検知して同期してくれる
 * 加えてWindowsの「D:\\dev」を共有フォルダとしてマウントした
* READMEから不要な記述を削除
 * 本家とは関係ない旨を記載して、自分が伝えたいこと(この記事に書いたこと)に絞った
* 不要なファイルの作成
 * 私用プロジェクトなのでCoCもCONTRIBUTEもいらない。

## まとめ
ひとまずvagrant upで起動して、日本語の編集に不自由がない程度にはなった。
(手を加える前は、日本語は入力できるがバックスペースを押すと文字の半分だけ消える状態だった)
Jacksonよくある使い方メモ

# まずは
簡単な使い方は以下を参照
[Jackson使い方メモ](http://qiita.com/opengl-8080/items/b613b9b3bc5d796c840c)

この記事では使用例をまとめたいと思います。

# サンプルDTO
```java
public class SampleDTO {
    private String field1;
    private List<String> field2;
    private SomeClass field3;

    public String getField1(){return field1};
    public List<String> getField2(){return field2};
    public SomeClass getField3(){return field3};
    public String getField3Text(){return field3.getText()};
}
```

# DTOからJSONテキストを生成する
```java
SampleDTO dto = new SampleDTO();
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(dto);
```

# DTOからObjectNodeを生成する
```java
SampleDTO dto = new SampleDTO();
ObjectMapper mapper = new ObjectMapper();
ObjectNode jsonNode = mapper.valueToTree(dto);
```

# ObjectNodeの値を元にDTOをアップデートする
```java
SampleDTO dto = new SampleDTO();
ObjectMapper mapper = new ObjectMapper();
ObjectReader reader = mapper.readerForUpdating(dto);
reader.readValue(json);
```

# 不要な項目を無視する
以下のように無視したい項目にアノテーションを付与する。

```java
@JsonIgnore
private String field1;
```

# JSONのキー名を変更する
以下のように変更したい項目にアノテーションを付与する。

```java
@JsonProperty("fieldA")
private String field1;
```
こうした場合、{"fieldA": "\<field1の値\>"}のようになる。

また、@JsonPropertyはメソッドに適用することも可能。

```java
@JsonProperty("fieldA")
public String getField1(){
...
}

// JsonPropertyで設定した値とコンフリクトするメソッドが存在する場合は
// 不要な方にJsonIgnoreを付与する。
@JsonIgnore
public String getFieldA(){
...
}

// この場合setterも合わせて定義しないとうまく相互変換できない
@JsonSetter("fieldA")
public void setField1(String field1){
...
}
```

# キャメルケースのフィールドをスネークケースでJSONに出力する。
以下のようなフィールドが定義されていた場合、
そのまま出力するとJSONに出力されるフィールド名はキャメルケースとなる。

```java
private String sampleField;
```

@JsonPropertyを使用してフィールド名を変更する方法もあるが、
全てのフィールドに対して特定のルールで変換をかける場合はPropertyNamingStrategyを使用する。
キャメルケース⇒スネークケースについてはデフォルトの変換ロジックがあるためそれが利用できる。

```java
ObjectMapper mapper = new ObjectMapper();
// 命名変更規則の設定	
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
```

# JSONを出力する際に成形する
出力されるJSON文字列を成形したい場合は、mapperの設定を変更する。
例えば、適当なindentを設定する場合は以下のようにする。

```java
// 出力するJSON
mapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);
```
はじめてのNode.js

## Node.js
https://nodejs.org/ja/docs/

## どんなもの
JavaScriptの実行環境

- JSの仕様書（ECMScript）に従い、書かれたソースコードを動かす環境
- 大量のリクエストを高速にさばくためのプラットフォーム
- サーバーサイド言語

具体的には、以下のようなもの

- Chrome : V8
- IE : JScript
- などなど・・・

## 主な特徴
- シングルスレッド
- ノンブロッキングI/O × イベントループ

### シングルスレッド・マルチスレッド
とは

- シングルスレッドでは、カーネルに対する処理（I/O）の場合など、読み込みが完了するまでスレッドが固まってしまう
- マルチスレッドはこれに対し、スレッドをコピーして次のスレッドを動かすことができる

Node.jsではどうなっているか

- シングルスレッドを利用している
- が、「ファイルI/Oの非同期」と「イベントループ」によって効率よく処理を行うことを可能にしている
- ※ ファイルI/Oの非同期だけならば、Ruby等でも効率化は可能なことに注意

### ファイルI/Oの非同期化 = ノンブロッキングI/O

- ブロッキングI/O（通常のシングルスレッド）では、カーネルに対しI/Oを行うと同期処理のため固まってしまう。
- ノンブロッキングI/O（Node.jsでシングルスレッド）では、I/Oに対し非同期処理を行うことで並行処理を実現している。
- ノンブロッキングを実現（非同期処理を活用）をするために、JSが選ばれたという背景もあるらしい

### イベントループ

- イベント待機のループを持つ、仕組みのこと
- コールバック関数で記述されたイベントが動作（処理）した後、この仕組みが働き、イベントの監視・処理を継続的に行うことができる

### 非同期処理の例
例えばsetTimeout等、コールバック関数を使うような書き方。
※ 以下を実行すると、1番->2番の順番で出力される。

```hoge.js
setTimeout(function() {
    console.log("2番");
}, 1000);
console.log("1番");
```

## Node.jsはどこで利用されているか
- サーバサイドアプリケーション
- クライアントサイドアプリケーション
- IOTとか
- VSCodeも

# Node.js + npm のインストール方法
※npm = パッケージ管理ツール

1. [公式ページ](https://nodejs.org/ja/)からダウンロード or 「$ brew install node.js」
2. node -v
3. npm -v

# ターミナルでHello World
```hello.js
console.log("hello world");
```
$ node hello.js
で実行。ターミナルに出力される。

# webサーバーでHello World

```server.js
// httpモジュールの用意
var http = require('http');
var server = http.createServer();
// コールバック関数を用いたイベントの設定
server.on('request', function(req, res) {
    var data = "hello world";
    // http.ServerResponseオブジェクト
    // ヘッダー書き込み
    res.writeHead(200, {
        "Content-Length": Buffer.byteLength(data),
        'content-type': 'text/plain'
    });
    // ボディー書き込み
    res.write(data, "utf8");
    // 完了
    res.end();
});
// ポート番号とipアドレスを設定, 接続受付の開始
server.listen(3000);
console.log("server listening...");
```
http://localhost:3000/
にアクセス。ブラウザ上に出力される。
ClickOnceアプリの関連パスの取得方法

# 概要
ClickOnceで配布したアプリケーションは、奥深い場所に保存されます。
そのパスをコード上から取得する方法です。

# exe
場所
「C:\Users\\<ユーザ名>\AppData\Local\Apps\2.0」以下のフォルダ

コード

```c#
Assembly.GetExecutingAssembly().Location
```

# ユーザースコープのアプリケーション設定(user.config)
場所
「C:\Users\\<ユーザ名>\AppData\Local\Apps\2.0\Data」以下のフォルダ

コード

```c#
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath
```

# データディレクトリ
場所
「C:\Users\\<ユーザ名>\AppData\Local\Apps\2.0\Data」以下のフォルダ

コード

```c#
// ApplicationDeployment.IsNetworkDeployedがtrueの時に取得可能
ApplicationDeployment.CurrentDeployment.DataDirectory
```
Mac の起動ディスク選択画面に復旧ドライブを復活させる方法

# はじめに

MacPro Mid2010 環境の話。

macOS がインストールされている HDD の内容を SSD に移動させ、HDD を取り外したところ起動ディスク選択画面から復旧ドライブが消える、という現象が起こりました。

ここでいう起動ディスク選択画面とは、 option キーを押しながら Mac の電源を起動したときに表示される画面のことを指します。

また、ここでいう復旧ドライブとは、起動ディスク選択画面で『復旧-10.8』などと表示される復旧作業用の OS のことを指します。

※本当は正式名称があると思うのですが調べる手間を省くためこの表記でいきます。

復旧ドライブはトラブルシュートのときにお世話になるためないと困ります。本記事は、以前のように復旧ドライブを使える状態にした際の記録です。

# どうして復旧ドライブが消えたのか

復旧ドライブは OS がインストールされている内蔵ディスクに隠しパーティションを区切りそこにインストールされます。

今まで HDD の隠しパーティションに復旧ドライブ用の OS のデータが格納されていましたが今回の SSD への移行ではその部分がコピーされなかった、というのが消えた理由となります。

# 復旧ドライブが作られる条件

いずれの内蔵ドライブにも OS が存在しない状態で、復旧ドライブのパーティションを作りたい内蔵ドライブに OS をインストールすると復活するようです。

他の内蔵ドライブにOSがインストールされている状態で OS をインストールしても復旧ドライブは作成されないっぽいです。

# 解決のために具体的にやったこと

- MacPro Mid2010 環境でクリーンインストールできる 10.8 用のインストールディスクを USB に作成。
  - 具体的な方法はこちらのページを参考にしました。
  - https://weekly.ascii.jp/elem/000/000/156/156669/
  - ※ 最初は 10.11 でクリーンインストールを試みましたが [禁止マーク](https://support.apple.com/ja-jp/HT204156) が出てNGだったので 10.8 にしました。10.7 等でもできるかもしれませんが未検証です。 
- 復旧ドライブのパーティションを作りたい内蔵ドライブ以外を外す。（SSDのみささっている状態にする）
- 10.8 をインストール。
- 復旧ドライブが出来あがり！

※ このあと復旧ドライブから OS を立ち上げ TimeMachine にバックアップされている OS データ（HDD にあったデータ）を SSD に取り込みました。

# おわり

Google 先生に尋ねても決定的な情報になかなかたどりつけなかったので記事に起こしてみました。
Swift JSON from Web

# Way 1

```
func fetchData2() {
    let jsonUrlString = "https://....."
    URLSession.shared.dataTask(with: URL(string: jsonUrlString)! ) { (data, _, error) in
      
      if error != nil {
        print(error)
      }
      
      if let data = data {
        
        do {
          if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
            let response = json["response"] as? [String: Any]
            let location = response!["location"] as? [[String: Any]]
            
            for dic in location! {
              print("\(dic["prefecture"]) \(dic["city"])")
            }
          }
          
        } catch let error as NSError {
          print(error.debugDescription)
        }
      }
    }.resume()
  }

```


#Way 2

```
func jsonParser(urlString: String, completionHandler: @escaping (_ data: NSDictionary) -> Void) -> Void
{
    let urlPath = urlString
    guard let endpoint = URL(string: urlPath) else {
        print("Error creating endpoint")
        return
    }

    URLSession.shared.dataTask(with: endpoint) { (data, response, error) in
        do {
            guard let data = data else {
                throw JSONError.NoData

            }
            guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary else {
                throw JSONError.ConversionFailed
            }
            completionHandler(json)
        } catch let error as JSONError {
            print(error.rawValue)

        } catch let error as NSError {
            print(error.debugDescription)
        }
        }.resume()

}

```
react-routerのBrowserHistory使用時のリロード対策

# react-routerのBrowserHistory使用時にリロードすると404になるのを防ぐ

まず、私の環境ですが、
webpack、Express、react/redux、react-routerを使用しています。
サーバもExpressを使用して自分で作っています。


- 1. 404対策にサーバ側ファイルに以下を記述 (ルーティングの最下層に記載)

```javascript
// publicの部分は適宜変更してください。

app.get('*', (req, res) => res.sendfile(path.join(__dirname, '../public', 'index.html')));
```

- 2. それだけだと、正しくjsファイルを読み込まないので、bundle.jsファイルを読み込むパスを絶対パスで記載する（index.htmlのバンドルを読み込んでいる部分です。）

```html
// bundle.jsのパスも適宜修正してください。絶対パスで正しく記入されて入れば大丈夫です。
<script src="/js/bundle.js"></script>
```


私の環境では、以上を行うだけで対応完了しました。
Alexa Skills Kitのテストシュミレーターがお返事しなくなってしまった

## 事象：

入力欄に打ち込んでエンターを押下したら、
通常ならスキルからの応答がおかしくても「スキルとの通信がうまくいきません」とか何かしら返ってくるはずなのに、
青い３点リーダーがくるくる点滅しつづけて終わらない。


![ask.png](https://qiita-image-store.s3.amazonaws.com/0/173392/1cfdadd9-c5b3-f326-24ea-93bd4a19587e.png)



## 原因：
セキュリティソフトがブロックしていた。
*.amazon.com/
をシールド対象から除外したところ、復旧した。


## 感想
しばらく忙しくてスキル開発ができず、シュミレータを開いてなかったので、ひょっとしてこれが原因か？と気がつくのにだいぶ時間がかかってしまった。
セキュリティソフトあるあるがここにも。
同じような事象に行き当たった人の助けになったら幸いです。
ClickOnceでバージョンアップしても消えないデータの残し方

# 概要
何も気にしないでClickOnceのアプリケーションを発行した場合、
バージョンアップすると設定が消えてしまいます。
その対策です。

# アプリケーション設定を使う
1. プロジェクトのプロパティの「設定」を開きます。<br />下記の図のように、<br />- 名前:IsUpgraded、種類:bool型、スコープ:ユーザー、値:False<br />- 任意の設定、スコープ:ユーザー<br />を作成します。<br />スコープを「アプリケーション」にすると、バージョンアップ時に上書きされるため使用しません。<br />![application_setting.png](https://qiita-image-store.s3.amazonaws.com/0/178867/d420a2bb-04f5-1491-45f5-94be108f03ac.png)<br />
2. 下記コードのように、Upgrade()を実行する処理を追加します。

```c#:Program.cs
static void Main(string[] args)
{
    // 以下のコードを追加
    if (!Properties.Settings.Default.IsUpgraded)
    {
        Properties.Settings.Default.Upgrade();
        Properties.Settings.Default.IsUpgraded = true;
        Properties.Settings.Default.Save();
    }
}
```

Upgrade()を実行する処理の前に、IsUpgradedによる条件を追加しています。
これは、常にUpgrade()を実行すると、以下のパターンで問題が発生するためです。

1. アセンブリバージョン1.0.0.0のアプリを起動して、アプリケーション設定を変更する。
2. ClickOnceでアセンブリバージョン1.0.0.1にバージョンアップする。
3. アセンブリバージョン1.0.0.1のアプリを起動する。<br />Upgrade()が実行されることで「1」の変更が反映される。<br />ここでは問題ない。
4. アセンブリバージョン1.0.0.1のアプリ上で、アプリケーション設定を変更して終了する。
5. 再度、アセンブリバージョン1.0.0.1のアプリを起動する。<br />Upgrade()が実行されることで「1」の変更が反映される。<br />それにより「4」の設定が戻ってしまう問題が発生する。

# データディレクトリを使う
「データディレクトリ」と呼ばれるディレクトリのファイルは、バージョンアップしても保持されます。<br />そのため、このディレクトリに設定を保存します。
ただし、データディレクトリの取得は、直接exeを実行した場合は例外になるため条件を追加します。

```c#:Program.cs
// ClickOnceで配布されたアプリケーションを実行した場合は、
string dataDirectory;
if (ApplicationDeployment.IsNetworkDeployed)
{
    // データディレクトリに保存します (最後に'\'は含まないので注意)
    dataDirectory = ApplicationDeployment.CurrentDeployment.DataDirectory;
}
// 直接exeを実行した場合は、
else
{
    // exeと同じパスに保存します (最後に'\'を含む)
    dataDirectory = AppDomain.CurrentDomain.BaseDirectory;
}
// ディレクトリの最後の'\'の有無が異なるため、Path.Combineでつなげる
string dataPath = Path.Combine(dataDirectory, "data.ini");

// 出力
using (var writer = new StreamWriter(dataPath))
{     
    writer.WriteLine("data");
}
```

# 参考URL
- http://d.hatena.ne.jp/among_ev/20110219/1298120888
    - アプリケーション設定を使う方法
Emacsで文芸用エディタ環境を作る

普段Vim使いなのですが、やはり長文の日本語を書く際はプロポーショナルな明朝を使いたいもの。残念ながらVim系はどこもプロポーショナルに対応していないので、重いEmacsを使います。

## WindowsにSpacemacs環境を構築

これをビルドしてインストールしました。
https://github.com/chuntaro/NTEmacs64

この手順に沿うと、%APPDATA%フォルダ(`~/AppData/Roaming`)に.emacs.dが生成されるので、そこに
[Spacemacs](https://github.com/syl20bnr/spacemacs)をクローン。
Emacsを一回--insecureで起動させて、設定ファイル(`%APPDATA%/.spacemacs`)を生成させます。

## Yu Minchoを使えるようにする
.spacemacsのdotspacemacs/user-configに

```emacs-lisp:.spacemacs
  (set-face-attribute 'variable-pitch nil
                      :family "Yu Mincho"
                      :height 140)
  (set-face-attribute 'fixed-pitch nil
                      :family "Consolas"
                      :height 140)
```

と指定。
あとはどこでも、`M-x variable-pitch-mode`とでも打てばYu Minchoになるようになりました。

私はEmacsのフォント設定がわからないので、ここで別のパッケージに頼ります。

```emacs-lisp:.spacemacs
   dotspacemacs-additional-packages '(org-variable-pitch)
  [中略 dotspacemacs/user-config内]
  (require 'org-variable-pitch)
  (add-hook 'org-mode-hook 'org-variable-pitch-minor-mode)
```
これでorg-mode内でYu Minchoになるようになりました。
spacemacsではdeinのようにあらかじめインストールするパッケージを記述しておく必要があるので気をつけてください。

## 雰囲気を整える
SPC-w-cで、goyo.vimのような雰囲気になります。
ただ結構挙動は不安定ですので、[whiteroom-mode](https://github.com/joostkremers/writeroom-mode)がいいかも。
このように設定しておくと、長文とかも自動で切ってくれるようになります。

```emacs-lisp:.spacemacs
  (set-fill-column 80)
  (add-hook 'org-mode-hook 'visual-fill-column-mode)
  (add-hook 'org-mode-hook 'visual-line-mode)
```


また、SPC-T-nでlightのテーマに切り替わります。
.spacemacsでデフォルトに設定しておいてもいいかもしれません。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/201594/5f6845de-6670-1928-4ebe-33873c8735c1.png)
Cloud9を別のソフトのように起動する方法

##Cloud9とは
ブラウザ上(クラウド環境)で利用できるIDE（統合開発環境）を提供してくれるサービスです。
Cloud9 : https://c9.io/

##本題
Cloud9を別ウィンドウで起動・ctrl+tabでタブ変更できるようにする!!

使用するブラウザ：GoogleChrome
バージョン：66.0.3359.139（2018-05-10）

以下からGoogleChromeの拡張機能を追加します
https://chrome.google.com/webstore/detail/cloud9/nbdmccoknlfggadpfkmcpnamfnbkmkcp?utm_source=chrome-app-launcher-info-dialog

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/116515/1bbc21a5-2443-670e-f90a-8b78da707c58.png)

自動的に「chrome://apps/」を表示したタブが開きます。
開いていなければ直接開いてください。

Cloud9のマークが追加されています。そのマークを右クリックし、「ウィンドウして開く」をクリック
![2.png](https://qiita-image-store.s3.amazonaws.com/0/116515/17c541a8-c116-c31b-179b-17e9f4ffbff0.png)



もう一度、マークを右クリックすると「ウィンドウとして開く」にチェックが入ってます。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/116515/e341781d-1fe3-7588-de18-d08cacf9b862.png)

その状態でマークをクリックすると、**一つのウィンドゥとしてCloud9が立ち上がります**


![4.png](https://qiita-image-store.s3.amazonaws.com/0/116515/c544ec3b-9c09-42ed-42c0-df2d8eabd288.png)


ワークスペースを開きます。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/116515/ff96ff42-8f5d-8d47-aa9c-ddb5e869ab50.png)


Ctrl　＋　TABを使うと使用した順番でタブが切り替わる変わるみたいです。
![15.gif](https://qiita-image-store.s3.amazonaws.com/0/116515/09b5ccb9-7d81-58b6-d739-f0c44bc9e84c.gif)


下のターミナルも同じように切り替わります。
![7.gif](https://qiita-image-store.s3.amazonaws.com/0/116515/166883b3-3218-e6c5-3c00-3db1db8908c0.gif)


#終わりに
ctrl + tabで左から順番にタブが変更される想定でしたが、どうやらそうではないみたいです。
設定の変更したら出来るようになるのではないだろうか。

タブの変更は想定外だったが、Cloud9がブラウザのタブではなく、一つのウィンドゥとして立ち上がるのは価値があると思う。
（調べ事していると、多々開いたサイトに埋もれてしまい使いにくかったため。）
ファイルのグループ権限変更時のエラー（illegal group name）の対処

#ファイルグループ権限変更時の注意

Macで開発するの初めてで、シェルコマンドでファイル権限を変更する際にはまったので、
覚書

新しいグループを作成し、ファイルのグループ権限を変更する簡単なコマンドなのだが・・・

```
1.グループを作成

$ dscl . -create /Groups/グループ

2.ファイルのグループ権限変更

$ sudo chown -R www:グループ ファイル名

3.実行結果

illegal group name

```

「グループ名の何かが違うよ」というエラーが発生。そこで下記のシェルコマンドでグループの存在を確認

```
$ dscl . ls /Goups | grep グループ名
```

間違いなく作成されていることを確認

グループの作成方法を調べてみると、グループを作成する際にグループIDという一意の識別番号を付与する必要があることに気づく。自動で採番されると勝手に思い込んでいた。
そこで空きのキーを確認し、付与することにした。

```
1.空き番号の確認

$ dscl . -list /Groups PrimaryGroupID | sort -k 2 -n

2.空き番号の付与

$ dscl . -append /Groups/グループ名　PrimaryGoupID 適当な空き番号
```

すると、グループ権限をエラーなく変更できました。

グループを作成したらグループIDは自動で振られるという勝手な思い込みが招いたタイムロス。
勝手な思い込みって怖いですね。
Autowareのcv_trackerでビルドエラー解決メモ

##cv_trackerのビルドエラー
```
...
fatal error: caffe/caffe.hpp: No such file or directory
```
https://github.com/BVLC/caffe/pull/1667
には、

```
Proto-files
Now protobuf files ARE NOT copied to <caffe_root>/include/caffe/proto anymore. Instead they are generated to <build_dir>/include/caffe/proto. Know one may include old headers, but this is interest rates to payback of technical debt appeared due to incorrect original cmake scripts design. Also removed them from .gitignore
```
とあるので、

```
set(SSD_CAFFE_PATH "$ENV{HOME}/ssdcaffe/distribute")
```

を

```
set(SSD_CAFFE_PATH "$ENV{HOME}/ssdcaffe/build:$ENV{HOME}/ssdcaffe/distribute")
```

に変える。
Edgeの空文字のconsole.logが空じゃない

# Edge以外のconsole.log("")は
javascriptのconsole.logで空文字を入れた時ってどう見えるかって、普通はこう見える事を期待する。
※左からChrome、IE11
![chromeie.PNG](https://qiita-image-store.s3.amazonaws.com/0/177027/92c07a62-2066-85c5-01e4-b8eb557d7e08.png)

```console_test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
  console.log("empty↓");
  console.log("");
</script>
</body>
</html>
```

# Edgeのconsole.log("")は
でもEdgeで見てみると……
なにこれ
![edge.PNG](https://qiita-image-store.s3.amazonaws.com/0/177027/1cc72cb1-6bc8-eb38-4373-da761120a051.png)
※Cドライブの直下に置けばよかった……
なにこれ

```
{"notifyType":"consoleItemLog","message":{"message":"","styles":"","hasFormatString":true,"fileUrl":"console_test.html","lineNumber":9,"columnNumber":3}}
```
空文字チェックは効く(==""はtrueになる)のでそこまで問題ではないとは思うが、空と思ってこれが出てきたらびっくりするな……
日本語では誰も書いていなかったので記事にした。
StackOverFlowでは既に投稿されてた
https://stackoverflow.com/questions/49686857/why-does-logging-an-empty-string-variable-in-edge-return-an-object

# 結論
Edge怖い
Juliaでインタラクティブプロット(Multi Cursor編)

本稿ではJuliaによるmatplotlibを使ったインタラクティブプロット(Multi Cursor編)について紹介します．
基本的には本家サイトにあるmatplotlib.widgetsのサンプルソースの移植版です．

```julia:multi_cursor.jl
#Translated from python to julia (reffer to https://matplotlib.org/examples/widgets/multicursor.html)
#Julia v0.6.2
#PyCall v3.6.4

using PyCall
using PyPlot

const MultiCursor = matplotlib[:widgets][:MultiCursor]

t = 0:0.01:2.0
s1 = sin.(2*π*t)
s2 = sin.(4*π*t)
fig = figure()
ax1 = fig[:add_subplot](211)
ax1[:plot](t, s1)

ax2 = fig[:add_subplot](212, sharex=ax1)
ax2[:plot](t, s2)

multi = MultiCursor(fig[:canvas], (ax1, ax2), color="r", lw=1)
show()
```

![スクリーンショット 2018-05-10 22.17.46.png](https://qiita-image-store.s3.amazonaws.com/0/256319/58e75e12-741c-fd77-d4fd-9d0a6bb07e45.png)
XAMPP for Windows 7.2.4に同梱されているlibsslの怪

＜追記：2018/05/12＞
XAMPP 7.2.5がリリースされました。
これから確認します。
以下の記載は7.2.4での内容です。記録として残しておきます。

```
C:\>fciv -sha1 C:\xampp\apache\bin\libssl-1_1.dll
//
// File Checksum Integrity Verifier version 2.05.
//
5ca73c58391767d7decc0ca0a049812c437f89d5 c:\xampp\apache\bin\libssl-1_1.dll

C:\>fciv -sha1 C:\xampp\php\libssl-1_1.dll
//
// File Checksum Integrity Verifier version 2.05.
//
40381e05b8849a7ac81305a36f2194840d779fd0 c:\xampp\php\libssl-1_1.dll
```

なんだこれは…
誰か分かる人おしえてください。

[Shining Light Productions] (https://slproweb.com/products/Win32OpenSSL.html) から [Win32 OpenSSL v1.1.0h Light] (https://slproweb.com/download/Win32OpenSSL_Light-1_1_0h.exe) を入手すべきか混ぜるな危険なのかxamppオワコンなのか現時点では判断つかず。

> OpenSSL 1.1.0 is quite different from previous releases. Users should install BOTH the 1.0.2 series (LTS) and the 1.1.0 series for maximum application compatibility.

に起因する事象かも知れない、と一瞬おもったがバージョン名の点で多分ちがう…

httpd.confでlocalhost以外のアクセスを禁止してあるからapache側に穴がなければ問題はない筈だけれども、気になるっちゃ気になる

と思って中身を見てみた。
C:\xampp\apache\bin\libssl-1_1.dll の方はopenssl-1.1.0<b>g</b>で
C:\xampp\php\libssl-1_1.dll の方はopenssl-1.1.0<b>h</b>らしい。

本家にレポート出すか

<br>
＜直観＞
なんとなく。

- XAMPPのapacheバイナリは「外部dllに依存しないapacheのバイナリ」を誰かが生成したものを頒布してるだけ
- 同様にphpも他者がビルドしたものを頒布してるだけ
- 別個独立にビルドしてるので管理の主体が別々

なんじゃないかな～

なぜならバイナリエディタで見たときの内部が随分ちがうので、ビルド環境自体が相応に違うっぽいから。

それぞれどんな環境なのかまでは不明…というか調べる気が起きない
こういうときこそ<b>バイナリ</b>と<b>明示されたビルド環境</b>の関係を<b>学習</b>させるツールの出番…なのか？
あるかどうかは知らない、というか作るしかない気もするけど今は作る気ゼロだけど多分やることになるようなgdgd
＜／直観＞
Ubuntuでlm_sensorsができないときにファン制御をする

ubuntu16.04でCPUファン制御ができずにノートPCがよく熱暴走していました．
lm_sensorsやacpiなどなど試してみてダメだった方の役に立てば幸いです．


# 1. ファンのスピードを変える
必要なファイルがあるか確認します．
０〜１１の数字が出てくればオッケーです．

```
$ cat /sys/class/thermal/cooling_device0/cur_state
```

０が最低速度，１１が最高速度になります．

数字を１１に変えて，ファンのスピードが変わるか確認してください．
ここで変わらなければこの方法はできません．．

```
$ sudo vim /sys/class/thermal/cooling_device0/cur_state
```

vimは必要であればgeditやemacsなどに変えてください．

# 2. 実行ファイルを作る
実行スクリプトを作って好きなときに実行できるようにしましょう．

まず，ホームにbinフォルダを作ってPATHを通します．

```
$ mkdir ~/bin
$ echo export PATH='$HOME/bin:$PATH' >> ~/.profile
$ source ~/.profile
```

続いて実行スクリプトを作ります．

```
$ vim ~/bin/fan.sh
```


```~/bin/fan.sh

#!/bin/sh

if [ -n "$1" ]
then
sudo sh -c "echo '$1' > /sys/class/thermal/cooling_device0/cur_state"
else
printf "level: "
read level
sudo sh -c "echo '$level' > /sys/class/thermal/cooling_device0/cur_state"
fi


```
実行権限を与えます．

```
$ cd ~/bin
$ sudo chmod +x fan.sh
```

PATHがきちんと通っていれば任意の場所で実行可能です．

```
$ fan.sh 10
```
とにかく熱暴走したくない！という方は高負荷なときに８や９など適度な数字に変えて実行するのが最も単純です．

# 3. CPU温度に合わせて速度を変える
```
$ vim ~/bin/fan_control.sh
```

```~/bin/fan_control.sh
#!/bin/sh
while true ;do
temp=$(sudo cat /sys/class/thermal/thermal_zone0/temp)
#echo $temp
  if [ $temp -gt 60000 ] ; then
    sudo sh -c "echo 10 > /sys/class/thermal/cooling_device0/cur_state"
  elif [ $temp -gt 55000 ] ; then
    sudo sh -c "echo 8 > /sys/class/thermal/cooling_device0/cur_state"
  elif [ $temp -gt 50000 ] ; then
    sudo sh -c "echo 7 > /sys/class/thermal/cooling_device0/cur_state"
  elif [ $temp -gt 45000 ] ; then
    sudo sh -c "echo 6 > /sys/class/thermal/cooling_device0/cur_state"
  elif [ $temp -gt 40000 ] ; then
    sudo sh -c "echo 4 > /sys/class/thermal/cooling_device0/cur_state"
  else
    sudo sh -c "echo 2 > /sys/class/thermal/cooling_device0/cur_state"
  fi
#cat /sys/class/thermal/cooling_device0/cur_state
sleep 10
done
```
CPU温度に合わせてスピードが変わるようにします．
sleep 10で１０秒後にまたwhileに入るようになっています．
温度と回転スピードは好きなように変更してください．
tempが６００００(６０℃)より高いと１０にするといった具合です．

現在のCPU温度はこのように調べられます．

```
$ cat /sys/class/thermal/thermal_zone0/temp
```


#4. サービスにして起動時に実行されるようにする
こちらのページがとてもわかりやすいです．https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff

/home/binでもサービスに登録できますが，すぐに消せてしまうので先程のスクリプトを/optにコピーします．

```
$ sudo cp ~/bin/fan_control.sh /opt/fan_control.sh
```
あとは本当に上のサイト通りなのでそちらを見たほうが詳しくのっています．．


サービス用のファイルを作ります．

```
$ sudo vim /etc/systemd/system/fan_control.service
```

```/etc/systemd/system/fan_control.service
[Unit]
Description = fan_control daemon

[Service]
ExecStart = /opt/fan_control.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target
```

あとは以下のようにすれば再起動しても自動でfan_controlができるはずです．

```
$ sudo systemctl enable fan_control.service
$ sudo systemctl start fan_control.service
```

#4. きちんとファン制御できているか確認する
```
$ cat /sys/class/thermal/thermal_zone0/temp
$ cat /sys/class/thermal/cooling_device0/cur_state
```

温度と回転が設定どおりになっているか確認してください．
実行スクリプトにして確認するほうが楽です．

```~/bin/fan_check.sh
#!/bin/sh
while true ; do
date +"%H:%M:%S"
cat /sys/class/thermal/thermal_zone0/temp
cat /sys/class/thermal/cooling_device0/cur_state
sleep 2
done
```

```
$ cd ~/bin
$ sudo chmod +x fan_check.sh
```

もっとスマートな方法はあると思います．．
AWS CLIを使ってRoute53の操作

## 概要
GUIからCUIに移行しているので使いそうなコマンドをメモとして残しておきます。
コード化したり自動化できたりするので便利ですね。

## 環境
```
$ aws --version
aws-cli/1.14.30 Python/3.6.4 Darwin/16.7.0 botocore/1.8.34

$ jq --version
jq-1.5
```

## Zoneの作成 
```
$ aws route53 create-hosted-zone --name example.com --caller-reference `date +%Y-%m-%d_%H-%M-%S`
```

## Zoneの一覧確認
```
$ aws route53 list-hosted-zones | jq '.HostedZones[] | {Id, Name}'
```

## レコード一覧の確認
```
$ aws route53 list-resource-record-sets --hosted-zone-id /hostedzone/xxxxx | jq '.ResourceRecordSets'
```

## Aレコードの登録・更新・削除
これについてはjsonを使わないとダメっぽい。「--generate-cli-skeleton」でテンプレートを作ってjsonを読み込むようにしましょう。

```
$ aws route53 change-resource-record-sets --hosted-zone-id /hostedzone/xxxxx --change-batch file://test.json
```

```json
{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "www.example.com.",
        "Type": "A",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "xxx.xxx.xxx.xxx"
          }
        ]
      }
    },
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "www.example.com.",
        "Type": "A",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "xxx.xxx.xxx.xxx"
          }
        ]
      }
    },
    {
      "Action": "DELETE",
      "ResourceRecordSet": {
        "Name": "www.example.com.",
        "Type": "A",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "xxx.xxx.xxx.xxx"
          }
        ]
      }
    }
  ]
}
```
Bash Brace Expansion で入れ子を用いて、0 から 20 までの連番値を 2 桁化（ゼロパディング）

こんにちは。
[Bash Brace Expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html) （ブレース展開）の入れ子を用いて、0 から 20 までの連番値を zero-padding して 2 桁化させてみました。

```console
$ echo {0{0..9},{10..20}}
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
$ echo {00..20}
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
```

また 3 桁化の例は（だんだんスマートではなくなりますが）、

```console
$ echo {0{0{0..9},{10..99}},{100..110}}
000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110
```

## seq コマンド

単純な用途には ```seq``` コマンドで足りるようです。

```console
$ echo $(seq -s '.txt ' -w 0 11)
00.txt 01.txt 02.txt 03.txt 04.txt 05.txt 06.txt 07.txt 08.txt 09.txt 10.txt 11.txt
$
```

## bash 4

bash 4.x の Brace Expansion は zero-padding してくれます。homebrew を使って bash 4.x をインストールし確かめました。

インストール前：

```console
$ which -a bash
/bin/bash
$ echo x.{01..11}
x.1 x.2 x.3 x.4 x.5 x.6 x.7 x.8 x.9 x.10 x.11
```

インストール後：

```console
$ brew info bash
bash: stable 4.4.23 (bottled), HEAD
Bourne-Again SHell, a UNIX command interpreter
https://www.gnu.org/software/bash/
$ brew install bash
$ which -a bash
/usr/local/bin/bash
/bin/bash
$
$ bash
$ echo x.{01..11}
x.01 x.02 x.03 x.04 x.05 x.06 x.07 x.08 x.09 x.10 x.11
$ exit
$
$ echo x.{01..11}
x.1 x.2 x.3 x.4 x.5 x.6 x.7 x.8 x.9 x.10 x.11
```
Juliaでインタラクティブプロット(Cursor編)

本稿ではJuliaによるmatplotlibを使ったインタラクティブプロット(Cursor編)について紹介します．
基本的には本家サイトにあるmatplotlib.widgetsのサンプルソースの移植版です．

```julia:cursor.jl
#Translated from python to julia (reffer to https://matplotlib.org/examples/widgets/cursor.html)
#Julia v0.6.2
#PyCall v3.6.4

using PyCall
using PyPlot

const Cursor = matplotlib[:widgets][:Cursor]

fig = figure(figsize=(8, 6))
ax = fig[:add_subplot](111, facecolor="#FFFFCC")

srand(12345)
x = 4*(rand(100,1) - .5)
y = 4*(rand(100,1) - .5)
ax[:plot](x, y, "o")
ax[:set_xlim](-2, 2)
ax[:set_ylim](-2, 2)

cursor = Cursor(ax, useblit=true, color="red", linewidth=2)

show()
```

![スクリーンショット 2018-05-10 22.14.46.png](https://qiita-image-store.s3.amazonaws.com/0/256319/26a8a641-2142-b242-5868-2fdfc27bc1e1.png)
MySQLのrootパスワードを忘れた！ってときの対処法(Windows)

# **まえがき**

日頃から使っていればいいんですが、たまに思い出したように使うので
その都度rootパスワードを忘れてMySQLにログインできない。
そんな私のような人向けというか私のための記事です。

# **環境など**
- Windows 10(64bit)
- MySQL 5.7
- サービスで実行

コマンドラインで`mysql --version`と入力すれば
こんな感じでお使いのバージョンが表示されるはず。
> mysql  Ver 14.14 Distrib 5.7.17, for Win64 (x86_64)


# **サービスで動いているMySQLの息の根を止める**

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/57524/a46727cd-201f-4346-438d-2967de14c7ee.png)

サービスマネージャーを起動して
**MySQL**の上で右クリックして**停止**を選択すれば止まります。

## **コマンドラインなら**

```bash
net stop MySQL57
```

この方法でもよし。

# **パスワードなしで使えるモードでMySQLを起動**

コマンドプロンプトを管理者権限で実行。
基本はこのコマンドで実行できる(がしかし)

```bash
mysqld --skip-grant-tables
```

> mysqld: Can't change dir to 'C:\Program Files\MySQL\MySQL Server 5.7\data\' (Errcode: 2 - No such file or directory)

インストール時に設定いじってるとこんな感じでうまくいかないことも
私はこのパティーンでした。

## **サービスのプロパティを確認**

サービスマネージャーのMySQLを右クリック、プロパティを選択。
ここから実行時に指定している引数などを確認できるのでそれをパクってくる。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/57524/4dea3c03-32ed-41bd-a9d2-bbde9cf45769.png)

後ろのサービス名`MySQL57`のところはいらない。

# **MySQLを起動**

```bash
"C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" --skip-grant-tables
```

パスは各自読み替えてね。
これを実行するとコマンドプロンプトは反応が返ってこなくなる、だがそれでいい。
裏でMySQLが動いている状態になる。

# **rootパスワードを変更する**

新たにコマンドプロンプトを立ち上げてmysqlにアクセス。

```bash
mysql -u root mysql
```

これでmysql databaseを指定した状態で入れるはず。

## **Update SQLでuserテーブルの中身を更新**

```sql
mysql > update user set authentication_string =PASSWORD('新しいパスワード') where user = 'root'
mysql > FLUSH PRIVILEGES;
mysql > exit;
```

公式ページでは`Password`カラムを更新するようになっていたが
MySQL5.7にはそんなカラムはありませんでした。
`authentication_string`が正解です。

コマンド実行してMySQLから抜けたら、コマンドプロンプトを閉じます。

# **後処理**

もう１つ開いていたコマンドプロンプトも閉じます。
ただMySQLが裏で実行された状態のままになっているので
タスクマネージャーを開いて、`mysqld.exe`を強制終了します。

後は通常通りサービスでMySQLを開始し、コマンドプロンプトから

```bash
mysql -u root -p
```
> Enter Password:

再設定したパスワードでMySQLに入れる(はず)
PythonでNPBのチームデータが取りたい。(球団ごとのPDFファイルをDL)

選手会のHPからソースを参照してaタグの部分を抜き出し
hrefのところから該当のpathを特定
ファイル名をチーム名.pdfでDLする。

```getPDF_DL.py
import bs4
import requests
import urllib3

url = requests.get('http://jpbpa.net/register/')
url.raise_for_status()
# HTMLparserでHTMLのaタグだけ絞り込み
soup = bs4.BeautifulSoup(url.text, "html.parser")
elems = soup.select('a')
for elem in elems:
    team = elem.getText()
    path = elem.get('href')
    repath = path.replace('..', 'http://jpbpa.net')
    # elem.getText=球団名、elem.get('href')=PDFのpath
    if elem.getText() in {'ロッテ', 'ソフトバンク', '西武', '楽天', 'オリックス', '日本ハム',
                          '広島', '阪神', 'DeNA', '巨人', '中日', 'ヤクルト'}:
        #print('{}({})'.format(team, repath))
        # pdfのDLチーム名.pdfにする。
        request_methods = urllib3.PoolManager()
        response = request_methods.request('GET', repath)
        f = open(team + '.pdf', 'wb')
        f.write(response.data)
        f.close()
```
create-react-app で作ったものをCircleCI2.0でビルドするときに「Module not found: Error: Can't resolve '@babel/runtime/helpers/assertThisInitialized'」エラーでハマったときの対処法

create-react-app でプロジェクトを作ってCircleCI2.0でビルドしようとしたときに
「Module not found: Error: Can't resolve '@babel/runtime/helpers/assertThisInitialized'」というエラーが出てハマりました…
ローカルではビルドがとおっていたのにCircleCIではそのままだとビルドがとおりませんでした。
備忘録も兼ねてその解決方法を記します。

## 概要

CircleCIのADD PROJECTSで該当のリポジトリの「Set Up Project」を選択します。
するとOperating SystemとLanguageの選択画面が表示されますので、Nodeを選択します。
すると画面下部にSample.yml File の内容が表示されます。

```sample.yml
# Javascript Node CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-javascript/ for more details
#
version: 2
jobs:
  build:
    docker:
      # specify the version you desire here
      - image: circleci/node:7.10

      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
      # - image: circleci/mongo:3.4.4

    working_directory: ~/repo

    steps:
      - checkout

      # Download and cache dependencies
      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "package.json" }}
          # fallback to using the latest cache if no exact match is found
          - v1-dependencies-

      - run: yarn install

      - save_cache:
          paths:
            - node_modules
          key: v1-dependencies-{{ checksum "package.json" }}

      # run tests!
      - run: yarn test

```

これにcreate-react-appのbuildのコマンドを末尾に追記しました。

```yml
      # build
      - run: yarn run build
```

これをpushしてCircleCIを動かします。
すると以下のエラーが表示されました。

```
#!/bin/bash -eo pipefail
yarn run build
yarn run v0.24.4
$ react-scripts build
Creating an optimized production build...
Failed to compile.

Module not found: Error: Can't resolve '@babel/runtime/helpers/assertThisInitialized' in '/home/circleci/repo/node_modules/material-ui/utils'


error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Exited with code 1
```

ローカルにはエラーが出てなかったのになぜ…？

## 解決方法

以下のコマンドで必要なモジュールをローカルに入れます。

```
npm install @babel/runtime@latest
```

するとpackage.jsonにも追加されます。

```
  "dependencies": {
    "@babel/runtime": "^7.0.0-beta.46",   ←が追加される
```

package.jsonをpushします。
すると、エラーが解消されてビルドがとおるようになります。

create-react-appでローカルではビルドがとおるのにCircleCIでビルドがとおらずこのようなエラーが出てきた場合、`@babel/runtime`を入れてみてください。
Mac Finder ツールバーのカスタマイズ

#Mac Finder ツールバーのカスタマイズ
1.Finderのディレクトリを立ち上げて、ツールバーの空きスペースで右クリック（2本指タップ）
2.使いたい項目をツールバーにドラッグ
で完了です！！

![ツールバーのカスタマイズOiita用.png](https://qiita-image-store.s3.amazonaws.com/0/95487/28cabe8c-2e37-2898-8809-370c0b942692.png)
Juliaでインタラクティブプロット(Check Button編)

本稿ではJuliaによるmatplotlibを使ったインタラクティブプロット(Check Button編)について紹介します．
基本的には本家サイトにあるmatplotlib.widgetsのサンプルソースの移植版です．

```julia:check_buttons.jl
#Translated from python to julia (reffer to https://matplotlib.org/examples/widgets/check_buttons.html)
#Julia v0.6.2
#PyCall v3.6.4

using PyCall
using PyPlot

const CheckButtons = matplotlib[:widgets][:CheckButtons]

t = 0.0:0.01:2.0
s0 = sin.(2*π*t)
s1 = sin.(4*π*t)
s2 = sin.(6*π*t)

fig, ax = subplots()
l0, = plot(t, s0, visible=false, lw=2)
l1, = plot(t, s1, lw=2)
l2, = plot(t, s2, lw=2)
subplots_adjust(left=0.2)

rax = axes([0.01, 0.4, 0.1, 0.15])
check = CheckButtons(rax, ("2 Hz", "4 Hz", "6 Hz"), (false, true, true))

function func(label)
    if label == "2 Hz"
        l0[:set_visible](!l0[:get_visible]())
    elseif label == "4 Hz"
        l1[:set_visible](!l1[:get_visible]())
    elseif label == "6 Hz"
        l2[:set_visible](!l2[:get_visible]())
    end
    draw()
end

check[:on_clicked](func)

show()
```

![スクリーンショット 2018-05-10 21.16.16.png](https://qiita-image-store.s3.amazonaws.com/0/256319/39f64502-28d3-c2b3-6c8c-1bb08c07a1d4.png)
cygwinからanacondaのpythonコマンドをたたく

windowsでanaconda入れると、CUIはAnaconda Prompt(実質コマンドプロンプト)になるじゃないですか。
そんなの嫌だ！Linuxのコマンド使いたい、cygwin使いたい！って人向け(主に自分)の需要の少なそうな覚書です。

# 1. anacondaにパスを通す
cygwinの.bash_profileを編集する。
こういう感じ

```ruby:.bash_profile
ANA_PATH=/cygdrive/c/Anaconda3
export PATH=\$ANA_PATH:\$ANA_PATH/Library/bin:\$ANA_PATH/Scripts:$PATH
```

これで

```
$ which python
/cygdrive/e/OSS/Anaconda3/python
```

anacondaのpythonにパスが通った。

が、これでpythonを叩くと応答が返ってこない…

```
$ python

```

cygwinのterminalであるminttyっていうexeがネイティブのpython以外のpythonをたたくと固まるという既知のバグなんだそうです。


# 2. winpty入れる
なので、mintty.exeの代わりにwinpty.exeというものを入れて、cygwinのterminalをラップしてやる必要がある。
https://github.com/rprichard/winpty
からgit clone。
解凍先にcd してcygwinでmakeする。

```
$ git clone https://github.com/rprichard/winpty.git
$ cd winpty
$ ./configure
$ make
```
正常に完了すれば、winpty/buildにconsole.exe、winpty.dll、winpty-agent.exeができる

※ 予めcygwinでgit, make, gcc-g++, mingw64-x86_64-gcc-g++ などなどをインストールしておく

# 3 pythonコマンドをラップ
~/.bashrcを編集
winptyのインストール先が$GITだとすると

```ruby:.bashrc
alias 'python'='$GIT/winpty/build/winpty.exe python'
alias 'ipython'='$GIT/winpty/build/winpty.exe ipython'
```

これで！anacondaのpythonをcygwinから叩けるようになりました。

```
$ python
Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

```


※参考：http://suzukiyou.hatenablog.com/entry/20151209/1449622689
新社会人は通勤時間を使ってAndroidスマホから外部サーバ上のJupyter Notebookで分析する

# 背景
- 新社会人になって通勤時間が長くなった
- 満員電車で通勤しなくてはいけない（電車内でPCなんて論外）
- 実験結果の分析を（はやく）しなくてはいけない

上記のような状況になったので以下の環境を構築しました

- スマホから外部サーバに接続する
- Jupyter Notebookで分析する

# 流れ
1. ターミナルアプリをスマホにいれる（Termux）
2. スマホ上からssh設定をする
3. サーバ上でJupyter notebook起動
3. ポートフォワーディングする
4. Chrome等からアクセスする

## Termux
sshクライアントなどを見ましたが、黒い画面が１番使いやすそうだったので、[Termux] (https://play.google.com/store/apps/details?id=com.termux&hl=ja&showAllReviews=true) を入れました。
そこまで扱ったわけではありませんが、普通にターミナルとして使えます。

## ssh設定
sshするためにopensshを入れます。

```
$ pkg install openssh
```

あとは、私は公開鍵設定をしたので、ssh-keygenなどでいろいろ設定します。
この辺はPCで公開鍵設定する時と一緒です。
1. ssh-keygenで公開鍵・秘密鍵を作る。
2. 公開鍵を接続するサーバのauthorized_keysにいれる。

### （余談）キーボードについて
Androidキーボード（POBoxなど）ではCtrlなどがなくて不便です。特にemacs派の人は。
[Hacker's keyboard](https://play.google.com/store/apps/details?id=org.pocketworkstation.pckeyboard) で解決します。

## サーバ上でJupyter Notebook起動
接続先サーバ上でJupyter Notebookを起動します。
Termuxでsshして起動させてもいいですし（screen上でやっておくと良い）、他の方法でやってもいいです。

## ポートフォワーディング
Termux上でポートフォワーディングをして、localhostとサーバ上のJupyter Notebookをつなぎます。
私の場合は、Jupyter Noterbookをlemonというサーバのポート8888で使っているので、下記のようにつなぎます。

```
$ ssh -L 8000:localhost:8888 lemon
```

## ブラウザからアクセス
ブラウザから localhost:8000 にアクセスします。
私はChromeを使いましたが、無事見ることができました。

<img src=https://qiita-image-store.s3.amazonaws.com/0/157773/eff622ec-2350-c8f9-ac29-6fc56f1d9b28.png width=30%>

## 結論
- 満員電車で小さいスマホで黒い画面見てポチポチするのはつらいです。
[PHP] 数値と文字列の比較で悩んでいる話

# 1. はじめに

4月からPHPを書いています。if文による真偽判断で、数値と数値表記の文字列を比較するコードを書いた際、少し苦しんでしまい、しかしキレイな解決策を思いつかなかったお話です。

# 2. どんなコードを書こうとしたのか

Webシステムの入力フォームで、プルダウンリスト `<select>` とその選択肢 `<option>` を生成する箇所です。遷移元の画面の入力値をPOSTで受取り、POSTで受取った値に該当する選択肢には `selected="selected"` を付加し、初期値として表示します。
POST値が `null` のときは、`selected="selected"` である選択肢がないため、一番上の「未選択」が初期表示になる、という寸法です。

```php
<select name="pulldownlist">
<option>未選択</option>
<?php
/*
 * $list_items は選択肢の配列。
 * $key はゼロからの連番。
 * $post_value は文字列型の数字か null。
 */
foreach($list_items as $key => $value) {
    if($post_value == $key) { // == で比較していた
        echo "<option value=${key} selected=\"selected\">${value}</option>";
    } else {
        echo "<option value=${key}>${value}</option>";
    }
}
?>
</option>
```

このような例で、POST値は `null` なのに `$key` が `0` の選択肢が初期表示されるという状態になり、他の箇所のコードがおかしいのかなあと探し回ったのですが、結局原因は if 内の `==` による比較でした。

# 3. 悩みどころと解決策

PHPでは `==` が**暗黙の型変換をする**んですね。かといってこういうケースの場合、 `===` でもうまくいきません。

```php
<?php
/*
 * null と 0 の比較は false に、"1" と 1 の比較は true になってほしい。
 */

// == を使うと…どちらも真になる！
null == 0;  // => true
"1"  == 1;  // => true

// === を使うと…どちらも偽になる！
null === 0; // => false
"1"  === 1; // => false
```

どうするのが正解なのかしばらく考えた挙げ句、コードは汚く見えますが、止むを得ず次のように書くことにしました。

```php
<?php
// キャストしたうえで === による厳密比較
null === (string)0; // => false
"1"  === (string)1; // => true
```

こうすれば、POST値が空の場合と値が入っている場合のいずれにも対応ができます。

# 4. おわりに

キャストを使うなんて…なんだかもうちょっとスクリプト言語らしく（？）書きたいところだったよな～と思いつつも、結局キャストに落ち着いてしまいました。初期値の表示もするプルダウンリストをつくるなんて、ザラにあると思うんですが、今後もこう書いていく、のか…？
もっといいスマートな解決法がありましたら、ご指南いただけますとうれしいです。

単純な比較演算で悩むとは思わなかったので、今回記事に書いてみた次第です。

# 5. 参考

- [PHP: 比較演算子 - Manual](http://www.php.net/manual/ja/language.operators.comparison.php)
- [PHP: 文字列 - Manual](http://jp2.php.net/manual/ja/language.types.string.php#language.types.string.conversion)
- [PHPの文字列比較で気をつけるべきこと - 暗黙の型変換 - EC studio 技術ブログ](http://techblog.ecstudio.jp/tech-tips/php-string-compare.html)
EitherList

# 前提
Javaの話。 Javaには今のところEitherは標準ライブラリとして入っていないので、[vavr](http://www.vavr.io/)を使う。以前まではjavaslangと呼ばれていた。

# 単一のEither

Eitherというのは主にエラーか成功か、どちらかをもちますよという型として使う。
https://gist.github.com/asufana/341921ab2b31ecf2feb0

主にはこんな使い方をして、エラー処理に使う。

```Either.java
  Either<Exception, Integer> result = function();
  if(result.isLeft()){
    Exception ex = result.left().get();
  }else{
    Integer val = result.get();
  }
```

# 複数のEither
しかし関数の結果というのは、配列であることも多くそうなるとこうなって一気に使う気をなくす。

```Either2.java
  List<Either<Exception, Integer>> result = function();

  List<Exception> errors = result.stream().filter(e->e.isLeft()).map(e->e.left().get()).collect(toList());
  List<Integer> success = result.stream().filter(e->e.isRight()).map(e->e.right().get()).collect(toList());

  // do for error
        
  // do for success
```

# EitherList
ということで、このようなユーティリティを使うと楽に複数のListをまとめて扱えます。

```EitherList.java
class EitherList<L, R> {
    List<Either<L, R>> list;

    public EitherList() {
        list = new ArrayList<>();
    }

    public void add(Either<L, R> item) {
        list.add(item);
    }

    public void addLeft(L item) {
        list.add(Either.left(item));
    }

    public void addRight(R item) {
        list.add(Either.right(item));
    }

    public void addLefts(List<L> items) {
        items.forEach(this::addLeft);
    }

    public void addRights(List<R> items) {
        items.forEach(this::addRight);
    }

    public static <L, R> EitherList<L, R> of(List<Either<L, R>> src) {
        EitherList<L, R> dst = new EitherList<>();
        src.forEach(e -> dst.add(e));
        return dst;
    }

    public List<L> lefts() {
        return list.stream()
                .filter(e -> e.isLeft())
                .map(e -> e.left().get())
                .collect(toList());
    }

    public List<R> rights() {
        return list.stream()
                .filter(e -> e.isRight())
                .map(e -> e.right().get())
                .collect(toList());
    }

}
```

```main.java


public class Main {

    public static void main(String[] args) {

        List<Either<Exception, Integer>> list = new ArrayList<>();
        list.add(Either.left(new Exception()));
        list.add(Either.left(new Exception()));

        list.add(Either.right(10));
        list.add(Either.right(20));

        EitherList<Exception, Integer> eitherList = EitherList.of(list);
        List<Exception> errors = eitherList.lefts();
        List<Integer> success = eitherList.rights();
    }
}
```
Magick++を使ったソースをWindowsでビルドするには

# 背景

Magick++ APIを使ったビルドはUNIX系ならMagick++-configが使えるが、
WindowsでMSVC版のフツーのImageMagickだとこれが使えない。

# cl.exeでビルドする

手動で以下のようにcl.exeの /I, /LIBPATHを使って、インクルードファイルのパスと
ライブラリファイルのパスを指定する。

```shell-session
 cl test.cpp /I "C:\Program Files\ImageMagick-7.0.4-Q16\include" /link /LIBPATH:"C:\Program Files\ImageMagick-7.0.4-Q1 6\lib" CORE_RL_MagickCore_.lib CORE_RL_Magick++_.lib
```

# 関連投稿

- [Magick++でrepageするには - Qiita](https://qiita.com/kjunichi/items/e8b44443b6e8d84e617d)
- [ImageMagickのMagick++ APIでEXIFを取得するには - Qiita](https://qiita.com/kjunichi/items/f68d1c5884f1dc44c273)
- [Magick++で利用可能なフォント一覧を取得するには - Qiita](https://qiita.com/kjunichi/items/c62df93f5fdad79a3eff)

# 関連記事

- [InkscapeをmacOSでビルドして動かせなかったが学べたこと](https://abrakatabura.hatenablog.com/entry/2018/05/12/215927)
Python 辞書の使い方まとめ

# 基本
### 空の辞書作成
dict = {}
### 辞書への値追加
dict["dog"]="pochi"

### 辞書のキー取得
dict.keys()


```python:
>>> dict["dog"]="pochi"
>>> dict["cat"]="tama"
>>> dict.keys()
dict_keys(['dog', 'cat'])
``` 

### 辞書の値の取得
dict.values()

```
>>> dict.values()
dict_values(['pochi', 'tama'])
```

# ちょっと応用

### python 辞書　keyを数字で並び替え
sorted(dict.keys(), key=int)

```python:
>>> dict.keys()
dict_keys([1, 2, 3, 4, 100, 50])
>>> sorted(dict.keys(),key=int)
[1, 2, 3, 4, 50, 100]
```


### リストの分類分け(カウント)


```python:
>>> dict ={}
>>> list = ["dog","dog","cat","dog"]
>>> for i in list:
...     if i in dict.keys():
...         dict[i] += 1
...     else:
...         dict[i] =  0
...         dict[i] += 1
...
>>> dict
{'dog': 3, 'cat': 1}
```
PythonでNPBのチームデータが取りたい。3(球団名とPDFのpath)

昨日やってたやつをまとめることができた。
でも本当にやりたいことは達成できてない。
まだ途中。

```getPDF.py
import bs4
import requests

url = requests.get('http://jpbpa.net/register/')
url.raise_for_status()
# HTMLparserでHTMLのaタグだけ絞り込み
soup = bs4.BeautifulSoup(url.text, "html.parser")
elems = soup.select('a')
for elem in elems:
    team = elem.getText()
    path = elem.get('href')
    repath = path.replace('..', 'http://jpbpa.net')
    # elem.getText=球団名、elem.get('href')=PDFのpath
    if elem.getText() in {'ロッテ', 'ソフトバンク', '西武', '楽天', 'オリックス', '日本ハム',
                          '広島', '阪神', 'DeNA', '巨人', '中日', 'ヤクルト'}:
        print('{}({})'.format(team, repath))
```

この結果をtextに出力すると。

```result.txt
広島(http://jpbpa.net/up_pdf/1523843962-483491.pdf)
ソフトバンク(http://jpbpa.net/up_pdf/1524204565-932446.pdf)
阪神(http://jpbpa.net/up_pdf/1523843967-655138.pdf)
西武(http://jpbpa.net/up_pdf/1523844823-945400.pdf)
DeNA(http://jpbpa.net/up_pdf/1523843918-062109.pdf)
楽天(http://jpbpa.net/up_pdf/1523843952-195082.pdf)
巨人(http://jpbpa.net/up_pdf/1523844190-573673.pdf)
オリックス(http://jpbpa.net/up_pdf/1523843924-372362.pdf)
中日(http://jpbpa.net/up_pdf/1523844654-036371.pdf)
日本ハム(http://jpbpa.net/up_pdf/1524204572-137100.pdf)
ヤクルト(http://jpbpa.net/up_pdf/1523843936-367593.pdf)
ロッテ(http://jpbpa.net/up_pdf/1523843946-624410.pdf)
```
VSCode拡張機能のMarkdown PDFが生成するPDFファイルからヘッダーを取り除く

Markdown PDFはMarkdownで記述されたファイルをPDFファイルに変換する、Visual Studio Code向けの素晴らしい拡張機能です。

Markdown PDFには``markdown-pdf.displayHeaderFooter``というオプションがあり、これを``false``に設定することでヘッダーとフッターの両方を非表示にすることができます。しかし、フッターを残したままヘッダーを削除するオプションはありません。

これを実現するには、``markdown-pdf.headerTemplate``オプションを次のように編集し、ヘッダーを非表示にします。

```json
{
    "markdown-pdf.headerTemplate": "<span class='title' style='display: none;'></span>"
}
```
アプリ終了状態でFCMによる通知がAndroidに届かないとき

機種依存の問題でした。

実機：ASUS_Z017DA

> 端末は何を使ってますか？
Huaweiなど一部の端末では保護されたアプリでないと通知を表示しません。
設定＞詳細設定＞バッテリーマネージャー＞保護されたアプリ

## 参考文献
[Firebase Notificationでアプリが強制停止された場合でもpush通知を受け取れるようにするにはどうしたらよいか](https://ja.stackoverflow.com/questions/32006/firebase-notification%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8C%E5%BC%B7%E5%88%B6%E5%81%9C%E6%AD%A2%E3%81%95%E3%82%8C%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%A7%E3%82%82push%E9%80%9A%E7%9F%A5%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%97%E3%81%9F%E3%82%89%E3%82%88%E3%81%84%E3%81%8B)
EclipseでのSpring Bootアプリケーション開発

EclipseでSpring Bootアプリケーションを開発するときのTipsをまとめました。

#### はじめに：Spring Tool Suite（Eclipseプラグイン）を導入する

Eclipseで開発するのであればSTS（Spring Tool Suite）を使うのが常套手段である。

* `ヘルプ` → `Eclipse マーケットプレース` の順に選択する。
* 検索で`Spring ツール（Spring IDE and Spring Tool Suite）`を探してインストールする。

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

* `ファイル` → `新規` → `その他` → `Spring スターター・プロジェクト` の順に選択する。
* プロジェクト設定ダイアログに必要な設定値を入力する。
  * ビルドツールは`Gradle (Buildship 2.x)` が今後主流になりそう。（[Buildship](https://projects.eclipse.org/projects/tools.buildship)はEclipse公式のGradleプラグイン）

#### アプリケーションを実行（デバッグ）する

* プロジェクトを右クリック → `実行` もしくは `デバッグ` → `Spring Boot アプリケーション`

#### 補足：Gradle依存関係を解決する

build.gradleに依存ライブラリを追加したときには以下の操作が必要となる。

* プロジェクトを右クリック → `Gradle` → `Gradleプロジェクトのリフレッシュ`
拡張機能(WebExtensions)で、拡張機能がインストールされているというフラグを設定する方法

## 初めに
文中において、対象のURLのページ(HTML)からロードされるスクリプト(JavaScript)のことをページスクリプトと記述します。

## 本題
拡張機能がインストールされているかどうかを取得する方法がないのか検索しても見つかりませんでした。
(もし、どなたかご存知でしたら教えてください。)
ですので、スクリプト(JavaScript)で対処する方法をとります。
そうなると、ページスクリプトより先に拡張機能のスクリプトが実行されていなければならないため、"run_at": "document_start"として、拡張機能のスクリプトを実行させます。拡張機能のメインスクリプトの実行タイミングが"document_start"でもいいのでしたら、メインスクリプトにインストールチェック用のスクリプトを追加するだけでいいですが、メインスクリプトの実行タイミングを"document_start"以外にしたい場合は、インストールチェック用のスクリプトファイルを別途用意し、"run_at": "document_start"に設定します。

```json
{
    "name": "run_atのテスト",
    "version": "0.0.1",
    "manifest_version": 2,
    "author": "gtk2k",
    "content_scripts": [
        {
            "matches": [
                "<all_urls>"
            ],
            "js": [
                "ext_main.js"  // 拡張機能のスクリプト
            ],
            "run_at": "document_end"
        },
        {
            "matches": [
                "<all_urls>"
            ],
            "js": [
                "ext_install_check.js"  // 拡張機能インストールチェック用スクリプト
            ],
            "run_at": "document_start"
        }
    ]
}
```

これで、どのページスクリプトよりも先にext_install_check.jsが実行されるようになりますが、ext_install_check.jsにどのようなスクリプトを書けば、ページスクリプトでもフラグの値が取得できるよになるのかを試しました。

### × グローバル変数
```js
window.extInstalled = true;
```
そもそも、ページスクリプトと拡張機能スクリプトの実行コンテキストが違うため、ページスクリプトでは取得できません。

### × scriptタグ追加
```js
const script = document.createElement('script');
script.text = window.extInstalled = true;
document.head.appendChild(script);
```
たとえ、このようにスクリプトでscriptタグを追加しても、ロード自体は非同期で行われるのか、これもダメ。

### × document.bodyにdataset追加
```js
document.body.dataset.extInstalled = '1';
```
実行タイミングが"document_start"であるため、スクリプト実行時点ではdocument.bodyがロードされていないのでこれもダメ。

### 〇 document.documentElementにdataset追加
```js
document.documentElement.dataset.extInstalled = '1';
```
htmlタグにdatasetが追加され、これでようやく、どのページスクリプトにおいても、document.documentElement.dataset.extInstalledで取得できるようになりました。
rails5.1、ローカルでjqueryが読み込みできない問題の解決法

## railsの勉強中にjqueryを読み込めない問題が発生

rails 5.1
ローカル環境にて。

### 1、jquery-railsというgemを導入

```ruby:gemfile
gem 'jquery-rails'
```
上記を追加して bundle install

**それだけでは解決しなかった。**


### 2、ローカル環境のサーバを立ち上げ直し。

```terminal:ternminal
rails s
```

これで直った。


### 参考
http://jewelrybox.wpblog.jp/2017/09/23/rails5-1-jquery-railsを導入/
https://teratail.com/questions/113477