OmniAICreator/Qiita-1.07M huggingface dataset:
MALTABのfigureの互換性問題を回避する

MATLAB R2014bでfigファイルの大幅な仕様変更が行われ，後方互換性が失われた．そのため，最新版のMATLABで作成したfigファイルが旧式のMATLAB（R2014a以前のMATLAB）では開けないといった問題が存在する．この記事ではこの互換性問題の回避方法を紹介する．

# コード

```MATLAB:SavefigAsOldMATLAB.m
function SavefigAsOldMATLAB(figname)
    % figファイルをmatファイルとして読み出す
    fig = load(figname, '-mat');
    % フィールド‘hgS_070000‘のみをfigname_modified.figとして保存
    save([figname(1:end-4),'_modified.fig'], '-struct', 'fig', 'hgS_070000');
end
```
# 解説
figファイルの実態はmatファイルであり（参考１），複数の構造体が含まれている．
そのうち，フィールド`hgS_070000`は以前のバージョンから存在していたが，R2014bで新たに`hgM_070000`が追加された．
旧式のMATLABでfigファイルを開こうとしてエラーが生じるのは，この`hgM_070000`を解釈できないためである．
そのため，サンプルコードでは`hgS_070000`だけを保存するようにした．

# 注意点
筆者の環境では問題は生じなかったが，GUIDEで作成したGUIについてはこの解決方法では回避できないおそれがある（参考2）．

# 参考
1．[FIG files format | Undocumented Matlab](https://undocumentedmatlab.com/blog/fig-files-format)
2．[GUIDE gui compatibility between 2015b and 2009b - MATLAB Answers - MATLAB Central](https://jp.mathworks.com/matlabcentral/answers/286685-guide-gui-compatibility-between-2015b-and-2009b)
Javascriptで文字列同士の比較をした時の内部動作

# 数値の文字列を比較した時って、自動型変換されるんじゃないの？

ユーザーの入力値を複数受け取ってそれを比較する関数を作ってました。
関数は問題なくできたので、テストを実行します。
実行したのは以下ような検証。

```javascript
'10' > '5' // falseになる
```

**なぜだ！**

# 原因
私の勘違いでした。
「文字列とはいえ、数値を入れてるのだから数値比較してくれるだろう」と思っていたのですが・・・
片方が数値の時に型変換が発生するのであって、文字列同士の比較であれば型変換が起きるはずありません。
よく考えれば、そんな仕様破綻してますよね。

```javascript
'10' > 5 // trueになる
```

# 新たな疑問
文字列比較が行われているのは分かりました。
では、なぜ`5`の方が大きいのか？
`UTF-8`のテーブルの中で、その並び順を比較するんじゃないの？

```javascript
'a' < 'b' //true

// この感じで行くと、'5'より後に'10`が配置されてるから'10'の方が大きんじゃないの？
```

何度か検証してみて分かりましたが、文字数が複数ある文字列の比較は左から１文字づつ比較していっているようです。
文字列全体で判断していると勘違いしてました。（よく考えるとそんなわけないですよね・・・）

```javascript
'a' < 'b' // true
'aa' < 'ab' // true
'aac' < 'aab' // false
'azzzzz' < 'b' // true

'1' < '2' // true
'10' < '5' // true
'60' < '5' // false
```

仕様を論理的に把握できていなかったと反省しました。
VirtualboxでmacOS High Sierraの画面解像度を変更する方法

### 環境
* Virtualbox 5.2.4 r119785
* Windows10 Pro

ほとんど興味本位だが、VirtualboxのmacOSからWindowsホストへリモートデスクトップの検証がしたくなり、Virtualbox上にHigh sierraをインストールしたのが始まり

### 結論

```
>VBoxManage setextradata "mac" VBoxInternal2/EfiHorizontalResolution 1440
>VBoxManage setextradata "mac" VBoxInternal2/EfiVerticalResolution 900
```

いろんな情報が溢れているが、どうも公式マニュアルに一見書かれていない上記が正解のようだ。
私の環境は上記で解決した。

以下は設定は入っている？(enumerateだと出る)が意味がない？かもしれない

```
>VBoxManage.exe setextradata "mac" "VBoxInternal2/EfiGraphicsResolution" "1440x900"
```

今の設定の読み出し方は以下

```
>VBoxManage.exe getextradata "mac" enumerate
Key: GUI/LastCloseAction, Value: PowerOff
Key: GUI/LastNormalWindowPosition, Value: 2778,215,1024,810
Key: VBoxInternal/Devices/efi/0/Config/DmiBoardProduct, Value: Mac-2BD1B31983FE1663
Key: VBoxInternal/Devices/efi/0/Config/DmiSystemProduct, Value: MacBookPro11,3
Key: VBoxInternal/Devices/efi/0/Config/DmiSystemVersion, Value: 1.0
Key: VBoxInternal/Devices/smc/0/Config/DeviceKey, Value: ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc
Key: VBoxInternal/Devices/smc/0/Config/GetKeyFromRealSMC, Value: 1
Key: VBoxInternal2/EfiGopMode, Value: 4
Key: VBoxInternal2/EfiHorizontalResolution, Value: 1440
Key: VBoxInternal2/EfiVerticalResolution, Value: 900
Key: VboxInternal2/EfiGraphicsResolution, Value: 1440x900
```

なんで以下で取り出せないかはよくわからない

```
>VBoxManage.exe getextradata "mac" VBoxInternal2/EfiGraphicsResolution
No value set!
```

有効でないキーだと取り出せないのかもしれない

```
>VBoxManage.exe getextradata "mac" VBoxInternal2/EfiHorizontalResolution
Value: 1440
```
これは取り出せた

### 参考

https://www.virtualbox.org/manual/ch03.html#efividmode
MySQLの自動起動を無効に

環境は**MacOS**を想定しています。

### 自動起動を設定しているサービスのリストを確認
```Terminal:
$ brew services list
Name         Status  User      Plist
redis        stopped
mysql        stopped
mysql@5.6    started username  /Users/username/Library/LaunchAgents/homebrew.mxcl.mysql@5.6.plist
chromedriver stopped
```

### 自動起動設定を無効にする
自動起動設定を無くしたいサービスの名前(今回は、mysql@5.6)を次のコマンドの最後に設定します。

```Terminal:
$ brew services stop mysql@5.6(この部分は止めたいサービス名を入力してください)
==> Successfully stopped `mysql@5.6` (label: homebrew.mxcl.mysql@5.6)
```

きちんとできたか確認

```Terminal:
$ brew services list
Name         Status  User      Plist
redis        stopped
mysql        stopped
mysql@5.6    stopped
chromedriver stopped
```

できました。
GASのPropertiesServiceのスコープ

## この話は一体

この記事はGASの[PropertiesService](https://developers.google.com/apps-script/reference/properties/properties-service)のスコープを実際にアドオンつくって検証してみた話です。

## 前提

PropertiesServiceはGAS内のlocalstorage的なデータストアのことです。
このストレージタイプは3種類(Document/Script/User)あってそれぞれドキュメントにはこう書かれてます。

|ストレージタイプ|説明|
|---|---|
|DocumentPropeties|Gets a property store (for this script only) that all users can access within the open document, spreadsheet, or form.|
|ScriptPropeties|Gets a property store that all users can access, but only within this script.|
|UserProperties|Gets a property store that only the current user can access, and only within this script.|

## 実験手順

A-spreadsheetとB-spreadsheetのふたつのシートを使ってアドオンでPropertiesService使って保持したデータの表示可否をチェックした。
また、アドオン化したscript idが配布後のユーザー間でも同じかどうかチェックした。

## 結果

### script idについて

script idはAさんとBさんにアドオン配布後に確認したところ、両方で同じIDを示していたため、両者のscriptは同じものと扱われる

### propertiesのスコープについて

AさんがA-spreadsheetのそれぞれのPropetiesに追加して、それぞれをアドオンで確認したところ

|追加したところ|AさんがA-spreadsheet見た時|AさんがB-spreadsheet見た時|BさんがA-spreadsheet見た時|BさんがB-spreadsheet見た時|
|---|---|---|---|---|
|DocumentPropeties|見える|見えない|見える|見えない|
|ScriptPropeties|見える|見える|見える|見える|
|UserProperties|見える|見える|見えない|見えない|

## まとめ

* scriptをアドオン化して配布した場合でもscriptはすべて同一のものとして扱われ、ユーザー間でScriptPropertiesを共有することになるのでアドオン設計時には注意が必要。
* DocumentPropertiesはユーザーに依存しない。
* UserPropertiesはドキュメントに依存しない。

現場からは以上です。
React Nativeでオーバーレイなフッターを実装する

こういうの作りたいよねというお話です。完全にスタイルのお話。

<img width="380" alt="ss.png" src="https://qiita-image-store.s3.amazonaws.com/0/2276/8250936c-bb3a-0b4c-f682-eb123fed1103.png">

サンプルはGitHubに上げときました。Expo製です。

https://github.com/Nkzn/RNFooterOverlaySample

簡単では？
----------

できちゃえば簡単なんですが、「とりあえず縦とか横に並べたらええんやろ！！！」というFlexbox脳のまま立ち向かうと死ぬので、ひとまず一例として置いとかせてください。

３行で
----------

説明面倒なのでコード読んでください。

* フッターに `position: "absolute"` とheightとbottomを指定してあげればいけるよ
    - https://github.com/Nkzn/RNFooterOverlaySample/blob/master/App.js#L69-L71 
* フッターの幅が1周目時点では確定しないので、１周目のrenderは諦めて、[onLayoutが来てから](https://github.com/Nkzn/RNFooterOverlaySample/blob/master/App.js#L31)　[2周目のrenderで](https://github.com/Nkzn/RNFooterOverlaySample/blob/master/App.js#L16)　[正規の幅にしましょう](https://github.com/Nkzn/RNFooterOverlaySample/blob/master/App.js#L23)
* ScrollViewに[contentContainerStyleでpaddingBottomを付けて](https://github.com/Nkzn/RNFooterOverlaySample/blob/master/App.js#L65)、一番下までスクロールしてもコンテンツが被らないようにしましょう

コード
----------

```js:App.js
// @flow
import React from 'react';
import { StyleSheet, View, Text, Button, ScrollView } from 'react-native';

type State = {
  footerWidth: number;
}

export default class App extends React.Component<any, State> {

  state: State = {
    footerWidth: 0
  };

  onContentLayout(layout: { width: number }) {
    this.setState({ footerWidth: layout.width });
  }

  render() {

    const footerStyle = {
      ...StyleSheet.flatten(styles.footerOverlay),
      width: this.state.footerWidth
    };

    return (
      <View style={styles.container}>
        <View style={styles.header} />
        <View
          style={styles.content}
          onLayout={ event => this.onContentLayout(event.nativeEvent.layout) }>
          <ScrollView style={styles.scroll} contentContainerStyle={styles.scrollContentContainer}>
            <View>
              { [1,2,3,4,5,6,7,8,9,10,11,12].map(n => <Text key={`${n}`} style={{ fontSize: 60 }}>{n}月</Text>) }
            </View>
          </ScrollView>
          <View style={footerStyle}>
            <Button title="Close" color="#FFF" onPress={() => {}} />
          </View>
        </View>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#AAA',
  },
  header: {
    height: 96,
    backgroundColor: "#00FF00",
  },
  content: {
    flex: 1,
  },
  scroll: {
    flex: 1,
    backgroundColor: "#FF0000",
    opacity: 0.5
  },
  scrollContentContainer: {
    paddingHorizontal: 16,
    paddingBottom: 104, // フッター分を底上げ
  },
  footerOverlay: {
    flex: 1,
    height: 96,
    position: "absolute",
    bottom: 0,
    backgroundColor: "#0000FF",
    opacity: 0.5,
    justifyContent: "center",
  }
});
```

まとめ
----------

もうちょっとスマートな方法がありそうな気もするので誰か教えてください。
Windows Server にパッチを当てるとMacやLinux がおかしくなるかも

##**<font color="Red">.local</font> で終わるドメインを設定している Windows Server に Meltdown / Spectre のパッチを当てると Mac, Linux/BSD などの動作に不具合が発生する可能性があります。**

それは、パッチ適用で Windows Server の DNS 処理能力が低下する恐れがあるからです。

##**Mac, Linux/BSDは mDNS クライアント**
Mac, iOS, Linux/BSD はインターネット標準規格の mDNS (multicast Domain Name Service) を採用していて .local 名を使用しています。

Apple製品には ***Bonjour*** 、Linux/BSDでは ***Avahi*** という名称で実装されています。

また、この mDNS は Linux, BSD を採用している NAS,プリンタ、ネットワーク機器などにも組み込まれています。

##**Windows Server パッチで動作が不安定になるかもしれない理由**

***.local ドメインに置かれた***  mDNS クライアントは正常に返答する DNS サーバーであればそちらを優先参照しますが、DNS 返答動作が**遅延**すると、次には、mDNS での問い合わせに切り替わります。
そのために、正しい答えが返ってこない、間違えたマシンを指すなどの症状が発生してしまいます。

正常な DNS 問い合わせがが行われなくなると、とても面倒な事になります。

サーバーのタイムアウトはその時の負荷状況によって変動しますから、必ずしも再現性があるとは限りません。原因追求が大変に困難な場合が多いです。

今回の Meltdown / Spectre パッチのようなサーバーの処理速度に大きく影響が出るパッチを当てると、今までタイムアウトが発生していなかったサイトでも、新たに DNS 処理にタイムアウトが発生する可能性があります。

つまり、Windows Server にパッチを当てたら、なぜか Mac, iOS や Linux/BSD 関連の動作が不安定になってしまう。と言う現象が発生する可能性があります。それどころか NAS やプリンタにも影響が発生するかもしれません。

もちろん、**Microsoft社のネットワーク構築推奨設計指針**どおりに　**正式ドメイン+サブドメイン形式**で構築している場合は、このような問題は発生しませんが、日本では .local で構築している所が多いので、***注意してください。***

Microsoft社のネットワーク構築推奨設計指針の内容など .local についての詳しい情報は参考文献を参照してください。

##**参考文献**
**[Mac が参加するADのドメイン名で .local を使わないでください。]( https://www.picturecode.co.jp/faq/dot-local-domain/)**


* * *
［Ruby/Rails］Gemを利用せずに検索機能を実装する方法

# Gemを利用せずに検索機能を実装する方法
![スクリーンショット 2018-01-15 11.35.08.png](https://qiita-image-store.s3.amazonaws.com/0/199441/d1829733-16de-e8b3-de6c-93100e64a069.png)

## 共有すること
Railsで開発したWEBアプリに、Gemを利用せずコードを数行入力して検索機能を実装する。

## 開発環境
Ruby 2.4.1
Rails 5.1.4

## 前提条件
下記コマンドを実行して、sampleアプリを作成する。

```command:command
rails new sample
cd sample
rails g scaffold Product name:string
rails db:migrate
```

アプリ名：sample
モデル名：Product

|カラム|型| 
|:--|:--|
|name|String|

## コード
今回作成したコード：https://github.com/tanakadaichi1989/search

### モデル
```ruby:product.rb
class Product < ApplicationRecord
  def self.search(search)
    if search
      Product.where(Product.arel_table[:name].matches("%#{search}%"))
    else
      Product.all
    end
  end
end
```

### コントローラ
```ruby:products_controller.rb
class ProductsController < ApplicationController
  before_action :set_product, only: [:show, :edit, :update, :destroy]

  # GET /products
  # GET /products.json
  def index
    @products = Product.search(params[:search])
  end

  #...（省略）...
end
```

### ビュー
```html+erb:index.html.erb
<p id="notice"><%= notice %></p>

<h1>Products</h1>

<!-- 追加したコード ここから -->
<%= form_tag("/products",method:"get") do %>
<input type="text" name="search">
<input type="submit" value="search">
<% end %>
<!-- 追加したコード ここまで -->

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @products.each do |product| %>
      <tr>
        <td><%= product.name %></td>
        <td><%= link_to 'Show', product %></td>
        <td><%= link_to 'Edit', edit_product_path(product) %></td>
        <td><%= link_to 'Destroy', product, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Product', new_product_path %>
```

## 参考資料
[whereにSQLの文字列を渡したくない！](https://qiita.com/Kta-M/items/8bd941d3f61a536e21ac)
Wio LTE PWM出力

Wio LTEのPWM出力を試しました。

# 使い方

PWM出力するピンをpinMode()で初期化して、

```cpp
pinMode(WIOLTE_D38, PWM);
```

analogWrite()でPWM出力のデューティ比を指定します。

```
analogWrite(WIOLTE_D38, 200);
```

[ArduinoリファレンスのanalogWrite()](https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/)に0~255の範囲でデューティ比が0~100%とありますが、Wio LTEの場合は0~65535が0~100%になります。

# スケッチ例


```cpp
#include <WioLTEforArduino.h>

WioLTE Wio;

void setup() {
  delay(200);

  SerialUSB.println("");
  SerialUSB.println("--- START ---------------------------------------------------");
  
  SerialUSB.println("### I/O Initialize.");
  Wio.Init();
  pinMode(WIOLTE_D38, PWM);

  SerialUSB.println("### Setup completed.");
}

void loop() {

  for (int i = 0; i < 65536; i += 1024) {
    analogWrite(WIOLTE_D38, i);
    delay(1);
  }
}
```

# 実行結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/6d516f65-2bec-6440-39cc-bb1bb5f0e473.png)

PWMの周期は0.793ミリ秒でした。周波数だと1260Hz。周期を変更する関数を探しましたが見つかりませんでした。周期を変更したいときは、STM32F4のレジスタを操作するしかなさそうです。

# PWM出力できるピン

今回、D38で確認しましたが、、、プログラムを確認した感じではD38,D39,D20,D19でPWM出力できるようです。実際に動かしてはいません。
Homebrewを使ってRictyをインストール

大したことじゃないんだけど、 ググると古い記事やまわりくどい手順のものが引っかかるので、記事にしておきます。

## 環境

macOS High Sierra 10.13.2（17C205)

## 手順

```shell-session
$ brew tap sanemat/font
$ brew install ricty
$ cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
$ fc-cache -vf
```

コレだけ。

powerline 用のパッチが当たったものが欲しければ、 `brew install` 時に `--with-powerline` を指定。

```shell-session
$ brew install ricty --with-powerline
```

他にもいくらかオプションがあるので、 `brew options` で確認してください。

```shell-session
$ brew options ricty
--with-oblique
	make oblique fonts
--with-patch-in-place
	Patch Powerline glyphs directly into Ricty fonts without creating new 'for Powerline' fonts
--with-powerline
	Patch for Powerline
--without-fullwidth
	Disable fullwidth ambiguous characters
--without-visible-space
	Disable visible zenkaku space
```

調べてる中で、オプションの内容が古い記事をいくらか見つけました。

この記事も当然最新の内容ではなくなっていくので、鵜呑みにせずちゃんと確認しておいたほうがいいですね。
jQueryでブラウザの戻るボタンを禁止する

#ブラウザの戻るボタンの禁止

昔は`history.back(-1)`なんて誤魔化したもんですが(動作上は一瞬戻って進む）、今はちゃんとヒストリが操作出来るんですね。
[ブラウザの履歴を操作する - ウェブデベロッパーガイド | MDN](https://developer.mozilla.org/ja/docs/Web/Guide/DOM/Manipulating_the_browser_history)

社内システムなんかで便利です。

```js
history.pushState(null, null, null);
$(window).on("popstate", function (event) {
    if (!event.originalEvent.state) {
        history.pushState(null, null, null);
        return;
    }
});
```

古いjQuery(1.7未満)を使わざるを得ない場合、下記で。

```js
history.pushState(null, null, null);
$(window).bind("popstate", function (event) {
    if (!event.originalEvent.state) {
        history.pushState(null, null, null);
        return;
    }
});
```
Sequelize UIをつかってみた

phpを使ってるときからormが使いやすくてnodejsでもSequelizeを使っている．
ormは使い始めれば便利なんだけど，一番最初のモデル設定・作成がすごくめんどくさい

nodejsではormしてSequelizeを使っていたが，そのモデル設定をUIでできる！というのがあったので使ってみた


##Sequelize UIについて

ライブラリをDLしなくてもWeb上で使えるようになっている
http://www.sequelizeui.com

環境依存しないし，ローカルのPCに余計なツールを入れなくて良くて好印象

##つかってみた
URLを開くとこんな感じの画面になる
![スクリーンショット 2018-01-15 10.56.23.png](https://qiita-image-store.s3.amazonaws.com/0/227015/f4f6371d-969e-2310-dba8-eda28a3d46c4.png)

全体的な流れはこんなかんじ
1. Modelを作成
2. Fieldを作成
3. 右上のDownloadModelsでnodejsのコードをダウンロードする

UIは特に迷うことなく使うことができた.


フィールドの設定で型/キーの設定はもちろん，バリデーションも設定できる

![スクリーンショット 2018-01-15 11.02.19.png](https://qiita-image-store.s3.amazonaws.com/0/227015/76b380f4-8714-b3d4-484b-bfd59bef7604.png)


モデル間のリレーションも設定できる
　※表示が少々変になってるが，つかえた
![スクリーンショット 2018-01-15 11.04.36.png](https://qiita-image-store.s3.amazonaws.com/0/227015/4b6583cc-9c26-0c94-c2be-716ac7b49f4b.png)


##ダウンロードしたファイルの使い方
ダウンロードすると,幾つかのファイルが入っている
- _db.js
- index.js
- モデル名.js

今回はチャットアプリを想定してuser room roomMemberの3モデルを作ったので
全部で5ファイルになった

<img width="615" alt="スクリーンショット 2018-01-15 11.07.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/227015/1c67073e-fea6-e2f6-b112-318116908927.png">


_db.jsはdbのセッティングをするファイル，
index.jsはモデルを全部requireしてくれるファイルになっている

なのでdbフォルダごとプロジェクトに追加して，

```javascript
require("db/index.js");
```

とすれば，使えるようになっている

ただし，migration用ファイルは入ってないので，使いたい場合は個々は自分で作る必要がある.


##使ってみて

modelの作成はこれで簡単にできるようになった
こういったジェネレーターがあるのはとてもありがたい

ただ，あくまでmodelを作るものだからか，migration用のファイルはなかったり，
おしい！と思うところがあったので，今後に期待．

現状でも十分に便利なので．ありがたく使わせていただきます．

##参考

https://www.youtube.com/watch?v=gpu_tnBb0q0
【ぶっちゃけiOSアプリ開発】スプラッシュ画面(LaunchScreen)の設定

iPhoneアプリを起動した時に最初に出力される画面をスプラッシュ画面とかローンチスクリーン(LaunchScreen)と言います。自分のブランドロゴとか最初に表示するとかっこいいですよね。
静的画像、アニメーション、プログラムロジックによって表示仕分ける事もできます。もちろん使わなくても良いです。
設定方法が色々とありますのでまとめておきたいと思います。
＜前提＞
・Xcode8
・StoryBoardを使用
#LauchScreenを指定する3つの方法
以下の場所に設定します。
<img width="829" alt="launchscreen01.png" src="https://qiita-image-store.s3.amazonaws.com/0/142654/28390dec-0131-e992-ae27-87c6e799a536.png">

3種類の設定方法がありますので、それぞれ説明します。

###1.LaunchScreenを使わない
「Launch Screen File」に、Main.storyboardを指定します。
<img width="681" alt="LaunchScreen02-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/142654/028fc296-4cbb-3eb0-7df2-488d73d2255f.png">

これで最初にメインストーリーボードのInitialViewControllerが表示されます。
###2.LaunchScreenのStoryboardを使う
「Launch Screen File」に、LaunchScreen.storyboardを指定します。スプラッシュ画面専用のストーリーボードです。
<img width="679" alt="LaunchScreen02-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/142654/d67d64f8-2a9e-18f6-7496-b081e7c6fb25.png">

LaunchScreen.storyboardはインターフェースビルダーで作ってください。
###3.アセットカタログ(LaunchImageSet)を使う
iPhoneの解像度に合わせて作成したイメージを使用します。設定が面倒なので３番目に書きましたがこれが一番スタンダードな方法だと思います。
####(1)アセットカタログの使用を設定
「Launch Image Source」の「Use Asset Catalog...」をクリックするとダイアログが表示されるので、「Migrate」をクリックします。
<img width="680" alt="LaunchScreen02-3a.png" src="https://qiita-image-store.s3.amazonaws.com/0/142654/99ddb233-7c6f-5f65-3e85-a6fbb3b6873f.png">

####(2)LaunchImageSetの作成
プロジェクトにデフォルトで作成されている「Assets.xcassets」というフォルダを選択し、LaunchImageを表示させます。（(1)でやった「Migrate」でLaunchImageSetの器が作成されました。）
<img width="1199" alt="LaunchScreen02-3b.png" src="https://qiita-image-store.s3.amazonaws.com/0/142654/79ca6a4d-23a5-84ec-7afb-7565445d5ee2.png">

AttributesInspectorでLaunchImageを作りたいiOSバージョンのチェックボックスをチェックします。
<img width="1200" alt="LaunchScreen02-3c.png" src="https://qiita-image-store.s3.amazonaws.com/0/142654/c81db7db-ffc5-21b2-d1f7-40c180f07bd9.png">

iOSバージョンに合ったイメージ画像をドラッグ&ドロップでセットします。
<img width="1200" alt="LaunchScreen02-3d.png" src="https://qiita-image-store.s3.amazonaws.com/0/142654/82e30fcb-78ef-e56d-132e-a01866c0dafa.png">

>iPhone Portraitの場合、セットする画像の解像度は以下の通り。異なる解像度の画像をセットすると表示されない場合もあるようです。
[iOS 5,6]
1x 320x480
2x 640x960
Retina4 640x1136
[iOS 7-9]
2x 640x960
Retina4 640x1136
[iOS 8,9]
Retina HD 5.5" 1242x2208
Retina HD 4.7" 750x1334

####(3)LaunchImageSetを設定
「Launch Image Source」を確認し、「LaunchImage」を選択します。（選択されているはず）
<img width="681" alt="LaunchScreen02-3y.png" src="https://qiita-image-store.s3.amazonaws.com/0/142654/14f1aa03-e1d8-7f96-7ed4-c8f15f7bd13e.png">
「Launch Screen File」は空白にします。
<img width="679" alt="LaunchScreen02-3x.png" src="https://qiita-image-store.s3.amazonaws.com/0/142654/313afc5f-280f-de18-7fb8-f1396c92f7e4.png">

>イメージを設定せずに「Launch Screen File」を空白にすると、画面の上下が黒く切れたようになってしまうので、注意が必要です。
<img width="324" alt="LaunchScreen02-3z.png" src="https://qiita-image-store.s3.amazonaws.com/0/142654/2563d3f3-fb4f-4157-a838-1e5052631196.png">

---
ぶっちゃけiOSアプリ開発は、アプリ開発にあたってとりあえず知っておくべきことをズバリ書きます。例外はありますのでご了承ください。
RocketChatを導入してみた

## RocketChatとは
![12508788.png](https://qiita-image-store.s3.amazonaws.com/0/165019/b57de92b-74fa-1638-0ba6-fa9ecbce44e8.png)

このところビジネス向けチャットツールとしてslackが人気ですね。RocketChatは、slackのようなチャット機能を有する(というかslackを模して設計されている)OSSのツールです。Meteorフレームワークを使用したjsで書かれています。RocketChatの嬉しい点として、オンプレ環境で稼働することが挙げられます。slackはクラウド型のサービスなので、機密情報のやりとりをする上ではオンプレの方が安心だと考える人もいるでしょう。
RocketChatはdockerイメージとしても提供されているため、比較的容易に導入することができます。

毎朝出社したらメールチェックが日課になっている企業も多いと思いますが、このようなツールが企業や業界に浸透してメールチェックの煩わしさから解放されるようになれば良いですねぇ。。。

## 構築手順
dockerとdocker-composeはあらかじめ導入しておいてください。

構築に必要な資材はRocketChat本体とmongoDBを使用します。どちらもdocker hubからpullできるので簡単です。

```bash:イメージのpull
docker pull rocketchat/rocket.chat:latest
docker pull mongo:latest
docker images # イメージがpullできていることを確認
```

```yaml:docker-compose.yml
db:
  image: mongo:latest
  volumes:
    - ./data/runtime/db:/data/db
    - ./data/dump:/dump

rocketchat:
  image: rocketchat/rocket.chat:latest
  environment:
    - MONGO_URL=mongodb://db:27017/rocketchat
    - ROOT_URL=http://localhost
    - Accounts_UseDNSDomainCheck=false
  links:
    - db:db
  ports:
    - 3000:3000
```

docker-compose.ymlにはRocketChatとmongoDBを連携させる記述をしています。
RocketChatのサービスポート番号はデフォルト3000番です。環境に合わせて適宜変更しても構いません。

## サービスの起動
docker-compose.ymlファイルを配置したディレクトリにcdし、下記を実行してサービスを起動します。
`docker-compose up -d`
問題なく起動できたらブラウザからアクセスしてみます。
`http://localhost:3000`
RocketChatの画面が表示されたら成功です！
R ５つの小技

Rの５つの[小技](https://www.r-bloggers.com/five-tips-to-improve-your-r-code/)が紹介されていたので備忘録がてらまとめておく。
# 1:nよりもseq()関数を使おう
コロン表記では以下のように想定外の動作をすることがある。

```
x <- c()
1:length(x)
> [1] 1 0

seq(x)
> integer(0)
```

*因みに速度比較も変わらない結果だった。

# c()は動的メモリー確保のため遅い
例えば以下のようになコードだとはっきりと差異がでる。

```
n <- 1e5

x_empty <- c()
system.time(for(i in seq(n)) x_empty <- c(x_empty, i))
   user  system elapsed 
  18.94    0.25   19.40 
x_zeros <- vector("integer", n)
system.time(for(i in seq(n)) x_zeros[i] <- i)
   user  system elapsed 
      0       0       0
```

# which関数を捨てよ
データフレームで検索したい時に用いる関数。

```
x <- runif(1e6)

system.time(x[which(x > .5)])
   user  system elapsed 
   0.03    0.00    0.03 
system.time(x[x > .5])
   user  system elapsed 
   0.03    0.00    0.06 
```

# factor型のデータを削除する際は気を付ける

```
# A factor with four levels
x <- factor(c("a", "b", "c", "d"))
x
#> [1] a b c d
#> Levels: a b c d

plot(x)
```
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/161216/06b98763-78db-b8dd-4082-1b71b62233eb.png)

ここでdを消すと

```
# Drop all values for one level
x <- x[x != "d"]

# But we still have this level!
x
#> [1] a b c
#> Levels: a b c d

plot(x)

```

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/161216/ff5f61b4-dcc3-c3bb-9f17-4aafa86dc980.png)


という風にdだけ残ってしまう。そのためにはもう一度factor(x)/ droplevels()で消さなければならない。


# 列(column)を優先せよ

```
n <- 1e7
d <- data.frame(
  a = seq(n),
  b = runif(n)
)

# rows first, column second - not ideal
system.time(d[d$b > 0.5, ]$a)
   user  system elapsed 
   1.03    0.03    1.07 
# column first, rows second - much better
system.time(d$a[d$b > 0.5])
   user  system elapsed 
   0.19    0.00    0.19
```

$オペレーターを使った列計算の方が早い。
Kubernetes 1.9: 既知の問題 (Known Issues)

このエントリは、[Kubernetes 1.9 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.9.md) から既知の問題 (Known Issues)についてまとめています。翻訳に合わせて補足を追記しています。その他の内容は次のリンク先を参照してください。

- [Kubernetes v1.9: 主な変更点 (Major Themes)](https://qiita.com/inajob/items/883b92f5aaaa63e21a21)
- [Kubernetes v1.9: Before Upgrading](https://qiita.com/inajob/items/943a634a1941030e5075)
- Kubernetes v1.9: 既知の問題 (Known Issues)
- [Kubernetes v1.9: 廃止予定の機能](https://qiita.com/superbrothers/items/8471d780aef7ae5ea70c)

---

## 既知の問題

- ノードとして Windows Server の仮想マシンを追加した場合、特定の仮想化環境で互換性の問題があります。具体的には Windows 版の kubelet.exe は物理メモリの量を知るために `GetPhysicallyInstalledSystemMemory` を呼びますが、VMWare と VirtualBox の仮想環境ではこの API コールに失敗します。この問題はベアメタルの Windows 環境や、Hyper-Vやパブリッククラウド環境では発生しません。
- `kubectl get po` の実行時に、API サーバーへの通信が失敗した場合、誤ったエラーメッセージ `the server doesn't have a resource type "po"` が表示されます。将来のリリースで解決される予定です。
  - 関連 issue: [Misleading kubectl error: the server doesn't have a resource type "po" #57198](https://github.com/kubernetes/kubernetes/issues/57198)
- mutatingwebhookconfigurations と validatingwebhookconfigurations というオブジェクトが API サーバーから 1 秒毎にポーリングされます。将来のリリースで解決される予定です。
  - 関連 issue: [Continuous polling of webhook admission registration objects #56357](https://github.com/kubernetes/kubernetes/issues/56357)
- 監査ログが同期的に書き込まれるため遅いです(バッファが無い)。将来のリリースで解決される予定です。
  - 関連 issue: [Introduce buffer to audit log output #53006](https://github.com/kubernetes/kubernetes/issues/53006)
- Custom Resource Definitions (CRDs) が特定の状況 (`kubectl delete` で `--cascade=false` を指定した場合) で正しく削除がされない場合があります。将来のリリースで解決される予定です。
  - 関連 issue: [CR is stuck with "orphan" finalizer #56348](https://github.com/kubernetes/kubernetes/issues/56348)
- etcd クラスタのローリングアップデートを行った後に、APIサーバーがタイムアウトすることがあります。将来のリリースで解決される予定です。
  - 関連 issue: [apiserver timeouts after rolling-update of etcd cluster #47131](https://github.com/kubernetes/kubernetes/issues/47131)
  - issue によると再起動で治るようです。
- クラスタスコープのリソースが所有者となる namespaced リソースが誤ってガーベージコレクタの処理のレースコンディションによって削除される場合があります。
  - 関連 issue: [Namespaced dependent of cluster scoped resource is sometimes erroneously garbage collected #54940](https://github.com/kubernetes/kubernetes/issues/54940)
  - v1.9.1 で修正済み [Process cluster-scoped owners correctly #57211
](https://github.com/kubernetes/kubernetes/pull/57211)
Cognos レポートで「部分一致」「前方一致」「後方一致」の実装

#概要
Cognos BI & Analyticsのレポートで、テキストボックスのフィルターで、「完全一致」「部分一致」「前方一致」「後方一致」を実装する方法です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/88112cb3-7a0e-f390-8b7d-047a619db42b.png)

#実装方法
##完全一致
完全一致の実装方法です。
レポートページに、リストとテキストボックスのプロンプトを置いてます。
テキストボックスのプロンプトのパラメーター名は、pProdです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/14883c5f-edfc-c02e-58cb-0c2e38fdd854.png)

リストのクエリーです。詳細フィルタを以下で定義しています。
[製品] = ?pProd?
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/4f5ad14c-a5f9-beff-f9b1-0d41fe249779.png)

実行するとこんな感じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/7dae1b65-9d91-0dfc-dd54-509b2bac9f69.png)

テキストボックスにキーワードを入れると、完全一致したアイテムのみ表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/432f58a4-5140-7ec0-1f58-5e7a6252d876.png)

##部分一致
詳細フィルターを、以下のように「contains」に変更してみます。
[製品] contains ?pProd?
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/94d88f7b-e8b9-243e-15f1-343d8e65c247.png)

部分一致でフィルターがかかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/7be9c7fe-6da4-1886-fd11-b76d04ba4b27.png)

##前方一致
同じパターンで、詳細フィルターを以下のように「starts with」に変更してみます。
[製品] starts with ?pProd?
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/a3aa2621-3fd1-0f97-c0be-e0589cdcfd43.png)

前方一致になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/d6ec6394-0561-ad4b-d2ab-3d6ab02491db.png)

##後方一致
同じパターンで、詳細フィルターを以下のように「ends with」に変更してみます。
[製品] ends with ?pProd?
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/a1a00ae6-f98c-a74b-f9f6-cef9e8d98f7d.png)

後方一致になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/733cce1d-b867-2b4c-0220-8ecb5c3762e5.png)

##統合
これらを組み合わせて、統合というか、単に条件ブロックを使用して条件を切り替えられるようにしただけですが。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/8d7253c2-0676-55f4-ce38-003eb3476b24.png)

チェックした条件で、テキスト検索できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/3e9f04ec-cfec-5471-6268-35a4d6eecf07.png)

#参考
ワイルドカード検索は、フィルターを以下のように記載する事で実装可能です。
[製品] like ?pProd?

![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/fd4ed0df-708e-c042-6e31-5b3ad24b2bfb.png)
ざっくばらんメモ_20：kaggle, visitor function

###kaggle recruit challenge
[code](https://github.com/festa78/kaggle_recruit_rest)
Kernelにて今まで公開されてきたメソッドをアンサンブルして
LB0.479を実現しているものが公開されていた。
利用されているメソッドの中に自分の公開したものが含まれていた。
そのおかげか自分の[kernel](https://www.kaggle.com/festa78/simple-xgboost-lb-0-495)がブロンズを獲得。
ただこのメソッドは以前使っていたもので古いので、最新のやり方で出した結果で置き換えたら性能向上できると
考えトライ。しかし結果は変わらず。
現在93位。

###visitor functionの作り方
多型な関数表現をしたい時に役立つプログラムデザイン。
elementとvisitorという２つの概念がある。
elementクラスはvisitorクラスを入力とするvirtual accept関数のみを持つ。
この時、想定する全ての型をelementのinheritanceとして宣言。
各element毎に固有の動作を定義しておく。
各elementはinheritanceされてきたaccept関数を持つ。
次に各elementを入力とした関数を持つvisit関数を持つvisitorクラスを宣言。
ここで各elementのaccept関数を定義し、それらは入力されてくるvisitorクラスの
visit関数に対して自身（elementクラス）を入力として実行するようにする。
最後に、visitor継承クラスを（複数）作り、それぞれにおいて各element毎にそのelementを
入力とするvisit関数の内容を定義する。
以上をクライアントが利用する場合においては、
クライアントはvisitorクラスのインスタンスを作成し、
それは各elementに関してaccept()関数を通して実行される事になる。
結果、異なった型を持つelementに関して同じvisitor関数を用いて処理が行えるようになる。
Vuexのアクションをアクションの中から呼ぶ

Vuexのアクションをアクションの中から呼ぶときは、`dispatch` をアクションのパラメータで受けとって、そのdispatch経由でアクションを呼びます。

```javascript
export default {
    update({ dispatch, commit, state }, itemId) {
        api.update(
            itemId,
            () => {
                dispatch('search', state.current_condition);
            },
            errors => {

            }
        );
    }
}
```

これだけ。
[nodejs] SequelizeでPostgreSQLに接続するテストがいつまでも終了しない

SequelizeでPostgreSQLに接続するテストを実行してみたところ、テストは通るのだけどいつまでたってもテストが終了しない。

```js:test/test.js
'use strict'

const Sequelize = require('sequelize')
const assert = require('assert')

describe('postgresqlに接続するテスト', () => {

  it('とりあえず接続', done => {
    const sequelize = new Sequelize('postgres://postgres:postgres@localhost/myapp',
      { operatorsAliases: false })
    const Project = sequelize.define('project', {
      title: Sequelize.STRING,
      description: Sequelize.TEXT
    })
    Project.sync().then(() => {
      assert.ok(true)
      done()
    }).catch(done)
  })

})

```

調べてみると、データベースに接続しっぱなしになってるのが原因ぽかったので、接続を閉じるようにしたら解決しました。

```js:test/test.js
'use strict'

const Sequelize = require('sequelize')
const assert = require('assert')

describe('postgresqlに接続するテスト', () => {

  let sequelize

  before(() => {
    sequelize = new Sequelize('postgres://postgres:postgres@localhost/myapp',
      { operatorsAliases: false })
  })

  after(() => {
    sequelize.close()
  })

  it('とりあえず接続', done => {
    const Project = sequelize.define('project', {
      title: Sequelize.STRING,
      description: Sequelize.TEXT
    })
    Project.sync().then(() => {
      assert.ok(true)
      done()
    }).catch(done)
  })

})
```

これ全部の`describe`に対して接続のオープンとクローズを書かないといけないのかなあ…(;´д｀)
どこかに一括でまとめて書けないものだろうか
Navigation Barでステータスバーにめり込む現象を解決する

UINavigationControllerを使わず、部品としてNavigation Barを使う際に、ステータスバーにめり込む現象があリました。
解決できたので備忘録として残したいと思います。

# 実行環境

* Xcode9.2
* アプリデプロイターゲット:iOS 10.0以上


# 問題

Storyboard上で素のUIViewControllerを置いて、部品として上部にNavigation Barを置きました。
Auto Layoutの制約はTop,Leading,TrailingともにSuperviewに対して0を指定しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31587/654c9d48-9d31-c93a-97c8-b76a0566e7fa.png)

ビルドすると特にiPhoneXで顕著ですが、ステータスバーにNavigation Barがめり込んでしまってデザインが崩れてしまっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31587/c0b1ccb6-ab77-0c7d-4ac7-23951749852b.png)

これを直します。

# 解決方法

Navigation BarのAuto Layout指定をSuper Viewに対してではなく、Xcode9から登場したSafe Areaに指定します。

<img width="1131" alt=" 2018-01-15 9.31.51.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/31587/cd3ad854-bea5-7699-6798-6f553f4fbf43.jpeg">

すると、Navigation Barはステータスバーの下に位置するようになります。

<img width="287" alt=" 2018-01-15 9.33.49.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/31587/ce51b2c6-81e5-ecf5-afd7-294fbadd3a43.jpeg">

期待していたデザインになりました。

ですが、ステータスバーの背景とNavigation Barの背景が食い違って違和感があります。
Navigation Barの下にNavigation Barと同じ色のViewを置いて解決します。
このViewのAuto LayoutのTopはSuper Viewに対して0の制約をかけるようにします。

<img width="992" alt=" 2018-01-15 9.39.02.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/31587/63135df6-251c-2192-b702-f44cc0743df0.jpeg">

ステータスバーの背景もNavigation Barと同じになりました。

<img width="282" alt=" 2018-01-15 9.40.25.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/31587/15bd4079-6d44-bef2-4916-6dd0fde3c772.jpeg">

#まとめ

Navigation BarのトップのAuto LayoutをSafe Areaで指定すればステータスバー下に表示される。
ステータスバーの背景は別途自分で用意する必要あり
Powershell > ソフト削除 > 未解決

未解決

```txt:動作環境
Windows 10 Pro (64bit) Fall Creators Update適用済
```

PowerShellを使ったソフト削除処理を試そうとした。

https://stackoverflow.com/questions/113542/how-can-i-uninstall-an-application-using-powershell
> answered Sep 22 '08 at 7:17
Jeff Hillman

インストール済ソフトを上記の方法で削除しようとしたが、`ReturnValue = 1603`になった。

管理者権限が必要とのことで、管理者権限付き実行も試したが、同じ結果だった。

- PowerShell上で管理者権限
- bat経由で実行
    - batを管理者権限で実行

別途、Win32_Productのフィルタで自分が削除したいソフトが表示されないなどもあり、この作業は中止とした。

複数ソフトを複数PCで同じように削除する方法については、機会を見つけて探したいとは考えている。
Pgroongaで多対多のドリルダウン検索（絞り込み候補）

# Pgroogaで多対多のドリルダウン検索（絞り込み候補）

スカラー型のカラムにドリルダウンする場合は
例えばカテゴリのような1対多の関係しかできない。（と思う）
Groongaのベクター型カラムに設定すると、
多対多のドリルダウン検索が可能だけど、Pgroongaで設定する方法をごにょごにょした。

##Mroonga の場合、
Mroongaのストレージモードでテーブルを作成し、
flags "COLUMN_VECTOR" みたいなコメントをつけるとできてた。

    create table 検索対象テーブル(
    //その他カラムの定義
    tag(ドリルダウンしたいカラム、空白区切りで登録) TEXT COMMENT 'flags "COLUMN_VECTOR", type "tag管理用テーブル"',
    FULLTEXT INDEX tag_vector_index(tag) COMMENT 'table "tag管理用テーブル"',
    );
    CREATE TABLE tag管理用テーブル (
    name VARCHAR(191) PRIMARY KEY
    ) ENGINE=Mroonga COMMENT='default_tokenizer "TokenDelimit"';

##Pgroongaの場合
カラムに特にベクターカラムを定義する方法がドキュメントにない。

    CREATE INDEX インデクス名 ON テーブル名 USING pgroonga (カラム名);

どっこい、配列型のカラムにインデクス定義する方法がドキュメントにのってるので
試してみると。

    CREATE INDEX インデクス名 ON テーブル名 USING pgroonga (配列型のカラム);
    SELECT pgroonga_command('select groongaテーブル名');

ベクター型カラムになっている。
やったぜ！！

    SELECT pgroonga_command('select groongaテーブル名 hogehoge --drilldown 配列型のカラム ');

とすると 多対多の絞り込み候補がでてくる。
Pythonのプロパティ宣言

Pythonでも、C#等によく似たプロパティを扱えます。
C#を例として見ていきます。

## 例：C#のプロパティ

```csharp:Exam.cs
public class Exam {
    private int _mathGrade;

    public int MathGrade {
        get { return _mathGrade; }
        set { 
            if (value < 0 || 100 < value) {
                throw new ArgumentOutOfRangeException("Grade must be between 0 and 100");
            }
            _mathGrade = value;
         }
    }
}
```

## Pythonのプロパティ
```python3:Exam.py
class Exam(object):
    """試験結果"""

    def __init__(self):
        """コンストラクタ"""
        self._math_grade = 0

    @property
    def math_grade(self):
        """数学"""
        return self._math_grade

    @math_grade.setter
    def math_grade(self, value):
        if not (0 <= value <= 100):
            raise ValueError("Grade must be between 0 and 100")
        self._math_grade = value

    # 以下省略
```

一見、`math_grade`という関数が二つあるように見えます。
しかし、プロパティのgetterに相当する処理に`@property`アノテーション、setterに相当する処理に`@[プロパティ名].setter`アノテーションを付与すると、それらを一体として、プロパティとして扱ってくれます。

上記のソースだと、`math_grade`というプロパティが、`Exam`クラスにある状態になります。

## 使い方
C#とほとんど同じです。

```python:Main.py
exam = Exam()
exam.math_grade = 60
print(exam.math_grade) # 60と出力
```

## クラス辞書を出力
`Exam.__dict__`で、`Exam`クラスの辞書を出力すると、

```
{
…省略
'math_grade': <property object at 0x0000019E44954E08>,
…省略
```

のように、プロパティとして扱われていることがわかります。

## インスタンス辞書を出力
```
{'_math_grade': 60}
```

となります。

インスタンスには、**プロパティが現れない**動作をします。

## C#との違い
* プロパティは、アノテーションで区別して宣言する
* プロパティ自体は、クラスの属性（インスタンスの属性ではない）として宣言される

クラスの属性として宣言される部分は、別途説明します。
docker startしようと思ったらdyld: Symbol not found: __cg_jpeg_resync_to_restart

## 環境

macOS High Sierra 10.13.2
Docke for Mac 17.12_0-ce-mac47

## 起きたこと

仕事用のMacをSierraからHigh Sierraにバージョンアップしたところ、
Docker start hogehogeした時に下記のエラーでコンテナが起動できなくなりました。

```
dyld: Symbol not found: __cg_jpeg_resync_to_restart
  Referenced from: /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
  Expected in: /usr/local/lib/libJPEG.dylib
 in /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
Abort trap: 6
```

## 原因
[こちらの記事](http://toshitanian.hatenablog.com/entry/2013/10/15/213013)によると、
Homebrewでインストールしたlibjpegに__cg_jpeg_resync_to_restartという関数が存在しないのが原因とのこと。


## 対処法
単純にbrew uninstall jpegをすると今度は他のエラーが(当然ですが)出るのでこれはできません。
なのでいささか気持ち悪いですが、brewで入れたlinjpegは物理的には残しつつシステム標準のlibjpegを使って欲しい。

というわけで.bash_profileに以下を追記しました。

```~/.bash_profile
export DYLD_LIBRARY_PATH=/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/:$DYLD_LIBRARY_PATH
```

これで無事起動。
色々と釈然としませんがとりあえず動かさないと仕事にならないのでこれでよしということにします。

## 参考
[dyld: Symbol not found: __cg_jpeg_resync_to_restart](http://toshitanian.hatenablog.com/entry/2013/10/15/213013)
[Using on OS X: 'Symbol not found: __cg_jpeg_resync_to_restart'](https://github.com/sgrif/pq-sys/issues/1)
コピペによるLogger名の間違いを防止する

## 概要
SLF4JのFAQにも記載されている、Loggerインスタンス作成時のTipsです。
Loggerの宣言に関するあるあるネタと解決策です。

## 【問題】間違ったLogger名
Loggerに関するありがちなバグとして、Logger名の間違いがあります。
これはLoggerの宣言を別のソースからコピペした場合に発生しがちです。

```java:間違ったLogger名を指定している例
public class MyClass {
  private static final Logger LOGGER = LoggerFactory.getLogger(User.class); // バグ! Userクラスのコードからコピペしたまま
  //...
}
```

## 【解決】MethodHandleを利用する
Java7から導入されたMethodHandle[^mh]を利用すると、呼び出し元のClassオブジェクトをstaticに取得することができます。
(MethodHandlesクラスのstaticメソッド[^mhs](の戻り値のメソッド[^mhs-lookup])を使用します ← MethodHandleクラス[^mh]ではないので要注意)

```java:Classオブジェクトの取得
Class<?> clazz = MethodHandles.lookup().lookupClass();
```


これを利用したLoggerの生成のイディオムが、SLF4JのFAQ[^slf4j]に掲載されています。
これならコピペしてそのまま(引数のLogger名を書き換えずに)使うことができます。

```java:Loggerの生成のイディオム
import java.lang.invoke.MethodHandles;
      
public class MyClass {
  private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
  //...
}
```

## 自前のLoggerクラスの場合
自前のLoggerクラスであれば、以下のようにファクトリメソッドの引数の型を限定することで誤ったLogger名の指定を防止することができます。
自前のLoggerクラスについては以前に書きました。 → [自作LoggerではLocationAwareLoggerを使おう](https://qiita.com/pale2f/items/6f98c9cd439badad9dee)

```java:ファクトリメソッドの引数をMethodHandles.Lookupだけにする
import java.lang.invoke.MethodHandles;

public class MyLocationAwareLogger {
  // (今回の話題に無関係な箇所は省略)

  // コンストラクタは非公開
  private MyLocationAwareLogger(org.slf4j.spi.LocationAwareLogger logger) {
    this.logger = logger;
  }

  // ファクトリメソッド(このメソッドのみ公開)
  public static MyLocationAwareLogger getLogger(MethodHandles.Lookup lookup) {
    return getLogger(lookup.lookupClass());
  }

  // 上記以外のファクトリメソッドは非公開
  private static MyLocationAwareLogger getLogger(Class<?> clazz) {
    org.slf4j.spi.LocationAwareLogger logger = (org.slf4j.spi.LocationAwareLogger) LoggerFactory.getLogger(clazz);
    return new MyLocationAwareLogger(logger);
  }

  // (今回の話題に無関係な箇所は省略)
}
```

```java:Loggerの生成
private static final MyLocationAwareLogger LOGGER = MyLocationAwareLogger.getLogger(java.lang.invoke.MethodHandles.lookup());
// 以下はコンパイルエラーとなる
// private static final MyLocationAwareLogger LOGGER_NG1 = MyLocationAwareLogger.getLogger(User.class);
// private static final MyLocationAwareLogger LOGGER_NG2 = MyLocationAwareLogger.getLogger("User");
```

## さいごに
たかがLogger名ですが、間違った値が指定されていると不具合調査に甚大な悪影響を与えます。
Logger名に騙されてバグと無関係な箇所を延々と調査する羽目に陥った事がある方、多いのではないでしょうか。
簡単に導入できるTipsなので、是非実践してみてください。

[^slf4j]: https://www.slf4j.org/faq.html#declaration_pattern
[^mh]: https://docs.oracle.com/javase/jp/7/api/java/lang/invoke/MethodHandle.html
[^mhs]: https://docs.oracle.com/javase/jp/7/api/java/lang/invoke/MethodHandles.html#lookup()
[^mhs-lookup]:  https://docs.oracle.com/javase/jp/7/api/java/lang/invoke/MethodHandles.Lookup.html#lookupClass()
ディープラーニングを数式なしで理解する

ディープラーニングの基本を数式なしでまとめてみました。

より詳細に知りたい方はこちらをご覧ください。

[ディープラーニングを数式で理解する - Qiita](https://qiita.com/bremen/items/9b7f75fa52eb347fcda7)

## 「マシンラーニング」と「ディープラーニング」とは

### マシンラーニング（機械学習）
入力データの特徴をコンピューターが学習し、与えられた問題を解決するもの。

### ディープラーニング（深層学習）
機械学習のうち、 **ニューラルネットワーク** を使って入力データの特徴をコンピュータが **自動的に抽出する** もの。

![](http://images.nvidia.com/content/APAC/blog/jp/whats-difference-ai-ml-dlai/Deep_Learning_Icons_R5_LR_JP-672x399.png)

[「機械学習」と「ディープラーニング」は何が違うのか？ | MUFG Innovation Hub](https://innovation.mufg.jp/detail/id=93)

## 「教師あり学習」と「教師なし学習」とは

### 教師あり学習  
**人間がラベル付けした** 入力データによる学習。

### 教師なし学習
正解（ラベル）が与えられていない入力データによる学習。入力データから規則性や相関性、特徴、特異性、傾向等をコンピュータが自動的に判定する。

## Convolutional Neural Network（CNN）とは

ディープラーニングの一種で、「畳み込み層」と「プーリング層」、「全結合層」と呼ばれるレイヤーから構成されたもの。

![](https://deepage.net/img/convolutional_neural_network/cnn_thumb.jpg)

[定番のConvolutional Neural Networkをゼロから理解する - DeepAge](https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html)

### 畳み込み層（Convolution Layer）

入力データの **特徴を抽出する** 層。フィルター（カーネル、重み）と呼ばれる行列を用いて、入力データとの特徴の一致件数を計算し、「特徴マップ」として出力する。この演算を「畳み込み」と呼ぶ。

![](https://deepage.net/img/convolutional_neural_network/animated_convolution.gif)

[定番のConvolutional Neural Networkをゼロから理解する - DeepAge](https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html)

### バックプロパゲーション（誤差逆伝搬）

あるレイヤーがひとつ前のレイヤーに対して、重みの誤差をフィードバックする仕組み。

- **バッチ** :   
バックプロパゲーションにより、学習データから重みを更新すること。
- **エポック** :   
バッチ回数の単位。通常はエポックを何回か繰り返して学習する。

### プーリング層

畳み込みによって生成されたデータを圧縮する層。

### アクティベーション層

畳み込みによって生成されたデータを「活性化関数」と呼ばれる関数によって特徴づける層。

#### Rectified Linear Units（ReLU）

畳み込みによって生成されたデータのうち、マイナスの数値を0に変換する活性化関数。

### Softmax

出力を確率に変換する活性化関数。

### Dropout

重みを更新する際に一定の割合で出力を「0」にすることで、学習データの「過学習」を防ぎ、予測精度を高める層。

### 全結合層

ラベル化された出力層に紐づけるため、ラベルの個数に対応したノード数となるように畳み込み演算を行う層。

## 参考URL

- [「機械学習」と「ディープラーニング」は何が違うのか？ | MUFG Innovation Hub](https://innovation.mufg.jp/detail/id=93)
- [定番のConvolutional Neural Networkをゼロから理解する - DeepAge](https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html)
- [ロボットをビジネスに生かすAI技術（2）：人工知能はどうやって「学ぶ」のか――教師あり学習、教師なし学習、強化学習 (1/2) - ＠IT](http://www.atmarkit.co.jp/ait/spv/1610/01/news002.html)
- [ニューラルネットワークの線形変換と活性化関数について - HELLO CYBERNETICS](http://s0sem0y.hatenablog.com/entry/2017/06/15/072248)
- [Softmaxって何をしてるの？ - 画像処理とか機械学習とか](http://hiro2o2.hatenablog.jp/entry/2016/07/21/013805)
- [【ニューラルネットワーク】Dropout(ドロップアウト)についてまとめる - Qiita](https://qiita.com/shu_marubo/items/70b20c3a6c172aaeb8de)
AtomでAWSec2に接続

#前提
シェルからsshでawsには接続できているとします。
わからない方はこちら↓
[AWS EC2でWebサーバーを構築してみる](https://qiita.com/Arashi/items/629aaed33401b8f2265c)
atomにはproject-managerのパッケージを入れてあります。
#手順
①atomにRemote-FTPパッケージをインストール
②.ftpconfig設定
③接続

プロジェクトごとに.ftpconfigを設定したい↓
[【Atom】プロジェクトごとに FTP 設定をする方法](https://qiita.com/Shuny125/items/af0a5883560a0e92a6a9)
主にこれ
[ec2のファイルをAtomを使ってリモート編集する](https://dev.classmethod.jp/tool/remote-editing-by-using-atom/)

①Remote-FTPのインストールはそのままの意味です。atomのpreferenceからインストールします。
②作業ディレクトリを作成して、プロジェクトに使用するとします。
Packages>Project manager>Edit projects

```
[
  {
    title: "PJ1"
    paths: [
      "/Users/user/project1"
    ]
  }
]
```
project-manager(Ctrl+Command+P)でプロジェクトを選択できます。便利です。

③.ftpconfigの作成
Packages>Remote-FTP>create SFTP config fileで設定します。この時のディレクトリに.ftpconfigファイルが作られるので、②のプロジェクト選択で移動しておきましょう。

```text:.ftpconfig
{
    "protocol": "sftp",
    "host": "AWSのパブリックDNS",
    "port": 22,
    "user": "ec2-user",
    "pass": "pass",
    "promptForPass": false,
    "remote": "/home/ec2-user",
    "local": "",
    "agent": "",
    "privatekey": "/Users/user/.ssh/Amazon_Linux.pem",
    "passphrase": "",
    "hosthash": "",
    "ignorehost": true,
    "connTimeout": 10000,
    "keepalive": 10000,
    "keyboardInteractive": false,
    "keyboardInteractiveForPass": false
}
```
わからないところがあったら、AWSのEC2Managementを見れば書いてあります。

Connectで接続完了。Atomでファイルが編集できるようになりました。
GitHubのIssuesが見当たらない

ForkしてきたリポジトリでIssuesを書こうと思ったら、見当たらない。

![スクリーンショット 2018-01-11 21.53.43.png](https://qiita-image-store.s3.amazonaws.com/0/161070/fd3fda61-fac3-bae1-a747-3d22bb2d3912.png)

Forkしたリポジトリにはないものなのかな？　とググったけど特にヒットせず。
ひとしきり悩んだ後、冷静になってSettingsを見たら、Featuresで設定できた。

![スクリーンショット 2018-01-11 21.54.48.png](https://qiita-image-store.s3.amazonaws.com/0/161070/311d209e-3b90-f383-a766-ad36d3ad9641.png)

表示できた。

![スクリーンショット 2018-01-11 21.55.11.png](https://qiita-image-store.s3.amazonaws.com/0/161070/462cd7c9-1636-e02f-bfa3-57dbabf9d9c1.png)

今まで自分で作成したリポジトリはデフォルトで表示されていたし、今回のフォーク元でも表示されていたので原因は不明。
Node.js のエラー対策

# nodeの実行でソースファイル以外の場所でエラーが起きた場合。

```
$ node {sorce.js}
```
で実行した場合。
普通ならソース内にエラーがあるはずだが
どうやら違う場所でエラーがあって
原因をググってみるとバージョンによるエラーがあった。

バージョンの上げ方だが
[【俺用メモ】 CentOS6にNode.jsをインストールする](https://qiita.com/ozawan/items/86ca7551d59005128892)
を参考にする。

### インストール可能なバージョンの表示

```:terminal
$ nvm ls-remote
```

### stableのインストール

```:terminal
$ nvm install stable
```

### nodeのインストール
[例]nodeのv5.12.0
インストールしたいのを先ほどのバージョン一覧から入力

```:terminal
$ nvm install v5.12.0

Downloading https://nodejs.org/dist/v5.12.0/node-v5.12.0-linux-x64.tar.xz...
######################################################################## 100.0%
Now using node v5.12.0 (npm v3.8.6)
```
### インストールしたバージョン一覧
```
$ nvm ls
```
### versionの切り替え

```
$ nvm use v4.4.5
Now using node v4.4.5 (npm v2.15.5)
```
ofSetBackgroundAuto(false)で1frame目から描画する

openFrameworksでブラーなどのように前frameの画を残して描く際に`ofSetBackgroundAuto(false)`を使います. 

が. 

どうも1frame目から描けない謎がありました. 
未だに完全には原因不明ですが, 一応荒業(?)での解決もできたので念のため記録まで. 

# git
https://github.com/KeitaSumiya/oF/tree/master/drawbackgroundauto


# 事前) ofSetBackgroundAuto(true)の場合
## 1frameから描画できることの確認
https://github.com/KeitaSumiya/oF/tree/master/drawbackgroundauto/0_1_0a_before_true_drawFrom1frame

```ofApp.cpp
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
    ofSetFrameRate(1);
    ofBackground(0);
    //ofSetBackgroundAuto(false);
}

//--------------------------------------------------------------
void ofApp::update(){
}

//--------------------------------------------------------------
void ofApp::draw(){
    count++;
    cout << count << endl;
    ofDrawBitmapString(count, 100, 10*count);
}
```

```ofApp.h
#pragma once

#include "ofMain.h"

class ofApp : public ofBaseApp{

public:
    void setup();
    void update();
    void draw();
    
    int count = 0;
};
```

>結果
![true.png](https://qiita-image-store.s3.amazonaws.com/0/102253/12ce570e-f6a7-076f-5b10-b2e1317b74c9.png)


# 本題) ofSetBackgroundAuto(false)の場合
## 問題) 4frameから描画されてしまう
https://github.com/KeitaSumiya/oF/tree/master/drawbackgroundauto/0_1_0b_bad_drawFrom4frame

```ofApp.cpp
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
    ofSetFrameRate(1);
    ofBackground(0);
    ofSetBackgroundAuto(false);
}

//--------------------------------------------------------------
void ofApp::update(){
}

//--------------------------------------------------------------
void ofApp::draw(){
    count++;
    cout << count << endl;
    ofDrawBitmapString(count, 100, 10*count);
}
```

```ofApp.h
#pragma once

#include "ofMain.h"

class ofApp : public ofBaseApp{

public:
    void setup();
    void update();
    void draw();

    int count = 0;
};
```

>結果
![bad.png](https://qiita-image-store.s3.amazonaws.com/0/102253/d3edcd97-bfd9-791d-1569-7516eb9dc9cb.png)


## 解決) 1frameから描画できた
https://github.com/KeitaSumiya/oF/tree/master/drawbackgroundauto/0_1_1_better_drawFrom1frame

```ofApp.cpp
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
    ofSetFrameRate(1);
    ofBackground(0);
}

//--------------------------------------------------------------
void ofApp::update(){
    ofSetBackgroundAuto(false);
}

//--------------------------------------------------------------
void ofApp::draw(){
    ofSetBackgroundAuto(true);
    count++;
    cout << count << endl;
    ofDrawBitmapString(count, 100, 10*count);
}
```

```ofApp.h
#pragma once

#include "ofMain.h"

class ofApp : public ofBaseApp{

public:
    void setup();
    void update();
    void draw();

    int count = 0;
};
```

>結果
![better.png](https://qiita-image-store.s3.amazonaws.com/0/102253/96e4e93f-942e-4f9a-e4ae-1970efc5a343.png)


# 参考
[openFrameworksで軌道の残像を描画しつつ画像保存する方法](http://hidex7777.hatenablog.com/entry/2017/12/16/232456)
VIMで置換するときのsコマンドの使い方メモ

sコマンドを使うと、vim内でsedと同じことができる。

<br>

```vim
:s/before/after/
```
* 現在カーソルがある行の一番はじめに出てくるbeforeをafterに置換

<br>

```vim
:s/before/after/g
```
* 現在カーソルがある行の全てのbeforeをafterに置換

<br>


```vim
:1s/before/after/
```
* 現在開いているファイル1行目の一番はじめに出てくるbeforeをafterに置換

<br>

```vim
:1s/before/after/g
```
* 現在開いているファイル1行目に出てくる全てのbeforeをafterに置換

<br>


```vim
:1,10s/before/after/g
```
* 現在開いているファイル1〜10行目に出てくる全てのbeforeをafterに置換

<br>

```vim
:%s/before/after/
```
* 現在開いているファイルの各行の一番はじめに出てくるbeforeをafterに置換

<br>

```vim
:%s/before/after/g
```
* 現在開いているファイルに出てくる全てのbeforeをafterに置換

<br>

```vim
:%s/before/after/gc
```
*  c をつけると、確認(yes/no)が出るようになります。

<br>

```vim
:1,10s#before#after#gc
```
* "/"は別の文字でも可能。オススメは "#"  (見易いので。また、/を\でエスケープしなくてよくなる)。

<br>

```vim
:%s#a\|b#c#g
```
* aまたはbを、cに置換する。
  * BREの (sedやgrepと同じ) 正規表現になる。
  *  | はor条件を表す。
  * \ で | をメタ文字にする(エスケープする)。

<br>

```vim
:%s#\va|b#c#g
```
* aまたはbを、cに置換する
  * \vでEREの (grep -e、egrep、awk、perlと同じ) 正規表現になる。


<br>

```vim
:%s#\v(a|b)#\1c#g
```
* aまたはbを、acまたはbcに置換する
  * \1は ( ) にマッチしたパターン文字列になる
      * oniguruma の$1と同じ
Flutterでカスタムテーマを適用する

Flutterで `MaterialApp` Widgetを使うと、 `themes` でテーマを設定できます。

```dart
  Widget build(BuildContext context) {
    return new MaterialApp(
      ...
      theme: new ThemeData(
        cardColor: Colors.white,
        primarySwatch: Colors.blue,
      ),
    );
  }
}
```

この色の指定をカスタムカラーで指定する方法です。
まず `theme.dart` を作ります。

```dart
import 'package:flutter/material.dart';

final ThemeData themeData = new ThemeData(
    brightness: Brightness.light,
    cardColor: Colors.white,
    dividerColor: Colors.grey[300],
    backgroundColor: Colors.grey[100],
    primarySwatch: CustomColors.theme[500],
    primaryColor: CustomColors.theme[500],
    primaryColorBrightness: Brightness.light,
    accentColor: CustomColors.accent[500]);

class CustomColors {
  CustomColors._(); // this basically makes it so you can instantiate this class
  static const Map<int, Color> theme = const <int, Color>{
    500: const Color(0xFFFBC812),
    600: const Color(0xFFFEAD22),
  };

  static const Map<int, Color> accent = const <int, Color>{
    500: const Color(0xFFF57C00),
  };
}
```

この `themeData` を指定するだけです。

```dart
import 'theme.dart';

...
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      ...
      theme: themeData,
    );
  }
}
```

以上。