OmniAICreator/Qiita-1.07M huggingface dataset:
Facebookの3D投稿を使う

_本記事は個人的なまとめです。_

# 公式の情報はどこ？
- トップページ
  - https://developers.facebook.com/docs/sharing/3d-posts
- アセット要件
  - https://developers.facebook.com/docs/sharing/3d-posts/asset-requirements
- チュートリアル
  - https://developers.facebook.com/docs/sharing/3d-posts/glb-tutorials
- FBXからglTFへの変換ツール
  - https://github.com/facebookincubator/FBX2glTF
- GLB packer
  - https://glb-packer.glitch.me/

# とにかく今すぐ3D投稿をしてみたい
サンプルファイルが公開されているのでダウンロードして、好きなものをFacebookをブラウザで開き、投稿欄にドラッグアンドドロップしましょう。

- https://origincache.facebook.com/developers/resources/?id=glb-files.zip

<img width="256" alt="_1__3D投稿をシェアするグループ.png" src="https://qiita-image-store.s3.amazonaws.com/0/10032/4b3ada4e-94dc-ec97-5322-e0b52058606c.png">

# 3Dの知識は無いけど、何か作ってみたい
画像を一枚用意すればテクスチャを張り替えて遊べるプロジェクトが有志によって公開されています。好きな画像でカスタマイズ後にダウンロードボタンを押せば多分投稿できるファイルが手に入ります。

- バンジェネレーター
  - https://van-maker.glitch.me/
- モデルカスタマイザ (ジェネレーターの元)
  - https://glitch.com/edit/#!/gltf-model-customizer?path=README.md:1:0

<img width="368" alt="GLTF_Model_Customizer.png" src="https://qiita-image-store.s3.amazonaws.com/0/10032/69e7fb0e-4168-9381-c1d0-5e73749d22a1.png">

# 自前の3Dモデルを投稿したい

チュートリアルをこなすのが良いと思われます。また元のデータがサイズ制限やシェーダー制限にかかっていないかもアセット要件をみて確認するとよいかもしれません。どうしても投稿できないときはバリデーションツールもあります。

- 3D アセットバリデーションツール
  - https://developers.facebook.com/tools/3d/validation

# 情報交換したい

Facebookグループに投稿するとわかりやすのでは無いでしょうか

- https://www.facebook.com/groups/392099814551177/
[Android 7まで]Bluetooth HCIスヌープログの取り方

Android 8.0(oreo)は以下を参考にしてください。
https://mozy-ok.hatenablog.com/entry/2018/12/21/003226

Androud 10以降はこちらの記事を参考にしてください。
https://qiita.com/KentaHarada/items/42ed619e8f571d1de845

# はじめに
Android端末でBluetoothのHCIのログを取得する方法をまとめました。
HCI(Host Controller Interface)はBluetoothのプロトコルの一種で
BluetoothプロトコルスタックとBluetoothのチップの間のプロトコルです。
# 環境
- Galaxy feel(Android 7.0)
- Android Sutdio 3.0.1
- Android Debug Bridge version 1.0.39
- Wireshark 2.0.13

# 1. Wiresharkをインストールする
Wiresharkでログを解析するので、先にインストールしておきます。
[Wireshark の使い方](https://qiita.com/nlog2n2/items/06f7604ea9e34424b401)

# 2. ADBコマンドを使えるようにする
こちらの記事をご覧ください
[ADBコマンドの導入方法](https://qiita.com/hikaru__m/items/15baae425b6fad25da05)

# 3. Android端末の開発者モードをONにする
こちらの記事をご覧ください
[Android端末の開発者モードをONにする方法](https://qiita.com/knakamigawa/items/5b8bd2793920b517bf25)

# 4. PCとAndroid端末をUSBケーブルで接続する

# 5. USBデバッグをONにする
設定->開発者向けオプション->USBデバッグ
![device-2018-03-11-154618.png](https://qiita-image-store.s3.amazonaws.com/0/102273/5ab89399-d2a8-baaa-b7f2-eb7d2833c7a7.png)

# 6. BluetoothをONにする
設定->接続->Bluetooth
※ Androidの機種によってメニューの場所が異なります。
![device-2018-03-11-155001.png](https://qiita-image-store.s3.amazonaws.com/0/102273/6ffde30e-7fbe-d9e0-3497-b8a7d0487d3b.png)

# 7. Bluetooth HCIスヌープログをONにする
ONにするとHCIログが端末内に保存され続けます。
ログの取得が終わったらOFFにしておかないと、ログがどんどん大きくなるので注意。
![device-2018-03-11-154627.png](https://qiita-image-store.s3.amazonaws.com/0/102273/a62e664a-8aa3-4523-9309-aed8bbe35de1.png)

# 8. ログファイルの保存場所を確認する
adbコマンドを使ってログ・ファイルがどこに保存されているのか確認します。
bt_stack.confというBluetoothプロトコル・スタックのコンフィグファイルの中に記載されています。
**※Androidの機種によってログファイルの保存場所が異なります**

```
$ adb shell cat /etc/bluetooth/bt_stack.conf
# Enable BtSnoop logging function
# valid value : true, false
BtSnoopLogOutput=true
# BtSnoop log output file
BtSnoopFileName=/sdcard/Android/data/btsnoop_hci.log　　　　　　★これがHCIスヌープログ！
# Preserve existing BtSnoop log before overwriting
BtSnoopSaveLog=true
```
確認に使ったAndroid端末では、ここが保存場所でした。
>/sdcard/Android/data/btsnoop_hci.log　


# 9. ログを取りたいBluetoothの操作を行う
Android端末とBluetooth機器を使って目的のログを取るための操作を行います。
(ペアリング、接続、切断、データ送受信等)
今回は例としてAndroid端末でペアリング(Numeric Comparison)をしてみました。

# 10. Android端末からログを取り出す
さきほど確認したログの保存場所からログを取り出します。

```
$ adb pull /sdcard/Android/data/btsnoop_hci.log
```


# 11. ログを解析する
Wiresharkでログを開いて解析します。
![スクリーンショット 2018-03-11 16.33.48.png](https://qiita-image-store.s3.amazonaws.com/0/102273/581a84ce-44f2-2607-a473-6d228fbff698.png)
LibreOffice PythonマクロでWriterにスプレッドシート風の表を作成する

#####実行した環境
Ubuntu Stdio 17.10
LibreOffice 6.0

#####Apache OpenOfficeのHPには有用な情報・サンプルがたくさんあります。
今回も探している情報ではありませんが、知らない情報がわんさかあります。
HPのトップから探してもたどり着かないので「Apache OpenOffice python」等で検索すると沢山ヒットします。

#####Writerにスプレッドシート風の表を作成する
今迄、Writerの表に数式が使用できるなど知りませんでしたが、手作業で表コマンドに数式を入れてもちゃんと計算してくれます。
しかし、Calcほど使い勝手はよくありません。
また、全ての関数が使えるわけではないようです。
=＜A1＞ + ＜B1＞　　（＜　＞は半角文字です。）
=A1 + B1　　（Calcの場合）

```python:Writer_Cell.py
#import uno  #不要
#import unohelper  #不要

def InsertCell():
  doc = XSCRIPTCONTEXT.getDocument()
  text = doc.Text
  cursor = text.createTextCursor()

  table = doc.createInstance( "com.sun.star.text.TextTable" )
  table.initialize( 5,4)  #(行数,列数) 

  text.insertTextContent( cursor, table, 0 )  #表を作成

  table.getCellByName("A1").createTextCursor().setPropertyValue( "CharColor", 3710932 )  #textColor
  table.getCellByName("A1").setPropertyValue( "BackColor", 13421823 )  #BackColor
  table.getCellByName("A1").setString("都道府県")
  table.getCellByName("B1").setString("男人口")
  table.getCellByName("C1").setString("女人口")
  table.getCellByName("D1").setString("小計")

  table.getCellByName("A2").setString("大阪府")
  table.getCellByName("B2").setValue(10000)
  table.getCellByName("C2").setValue(10000)
  table.getCellByName("D2").setFormula("sum <B2:C2>")

  table.getCellByName("A3").setString("京都府")
  table.getCellByName("B3").setValue(9000)
  table.getCellByName("C3").setValue(9000)
  table.getCellByName("D3").setFormula("sum <B3:C3>")

  table.getCellByName("A4").setString("奈良県")
  table.getCellByName("B4").setValue(8000)
  table.getCellByName("C4").setValue(8000)
  table.getCellByName("D4").setFormula("sum <B4:C4>")

  table.getCellByName("C5").setString("合計")
  table.getCellByName("D5").setFormula("sum <D2:D4>")
```

"A1"セルの( "BackColor", 13421823 )color codeは「13421823」と１０進数になっていますが、わかりにくいので「0xCCCCFF」のように１６進数表記にしたほうがわかりやすいです。
（下の表は色の指定をしていません。）

![fuyou.png](https://qiita-image-store.s3.amazonaws.com/0/238800/51cd0be8-df5f-cc98-62fc-e1d326bda269.png)

PyUNO samples
https://wiki.openoffice.org/wiki/PyUNO_samples
f.text_field  class属性を指定

##form_for中のf.text_fieldでclass属性を指定したい

http://railsdoc.com/references/text_field
railsリファレンスをみてみると classオプションはこのように指定すると書いてある
↓

```
<%= text_field :page, :name, :class = 'page_name' %>

```

しかし、これで指定するとSyntax Error unexected '=', expect '}'
となり、どうやら=あたりが怪しいらしい。

##解決策
stackoverflowで調べてみると= ではなく　=>とすることでclassオプションを指定できると書いてあったので
```
<%= text_field :page, :name, :class => 'page_name' %>
```
こう変更すると成功した


にしてもリファレンス間違い多すぎやろ........
特定アプリケーションのジャンプリストを見えないようにする

# 結論
後述のバッチをタスクスケジューラに登録する。

# やりたいこと
Photoshop CC 2018だけ、ジャンプリストを非表示にしたい。できればリアルタイムで。

# 方法
アプリケーション毎にあるジャンプリストファイルを既定の場所から削除すればよい。ただしアプリケーションが独自に実現している履歴については、別途対策が必要。

ジャンプリストファイルを一定間隔で監視し、生成されたら削除するために、robocopyを使ったバッチファイルを作り、それをタスクスケジューラに登録した。

# 調べたこと

### ジャンプリストファイルがある場所
`%AppData%/Microsoft/Windows/Recent/AutomaticDestinations`

### アプリケーション毎のジャンプリストファイル名
- ファイル名は`アプリケーション毎のID.automaticDestinations-ms`
- 上記フォルダを更新日時（降順）に並び替え、目的のアプリケーションで何かを開いてみる。するとジャンプリストが更新され、目的のジャンプリストファイルが一番上に来る。
- 同時に複数更新された場合、5f7b5f1e01b83767やf01b4d95cf55d32aはエクスプローラー関連であるので、それ以外。

### robocopyのオプション
- /MOV　指定ファイルだけを削除するオプションは見当たらなかったため、指定ファイルだけを移動することに。
- /MOT:5 /MON:1　MOT分待機し、その間にMON回変更があれば操作を行う。
- /R:1 /W:10　操作に失敗した場合、W秒待機し、R回リトライする。
- /NP /NDL /NFL　パス、ディレクトリ、ファイル名を非表示にする。

### リストから読み込み実行
- アプリケーション名とジャンプリストファイル名を併記したリストを作成し、それをfor文で読み込ませる。

### ウィンドウを非表示にして実行
- タスクスケジューラにバッチファイルを登録する際、対象バッチファイルを以下のように指定する。
`powershell -WindowStyle Hidden -command "cmd /c バッチファイル（フルパス）"`
- バッチファイル内で実行するコマンドをバックグラウンドで非表示にして実行するには、コマンドの前に`start /b`をつける。

#作成したバッチファイル
```move-JumpList.bat
@echo off

set pathSource=%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations
set pathMoveRoot=%USERPROFILE%\Documents\config\JumpList
set pathList=%pathMoveRoot%\targetlist
set pathDestination=%pathMoveRoot%\files
set pathLog=%pathMoveRoot%\log
set nameSource=%pathList%\TargetJumpList.txt
set nameLogfile=%pathLog%\move-JumpList
set optionCopy=/MOV /NP /NDL /NFL /MOT:5 /MON:1 /W:10 /R:1

call :exec

:end
exit /b

:exec
for /f "delims=, tokens=1,2" %%A in (%nameSource%) do (
rem @echo token1=%%A token2=%%B
start /b robocopy "%pathSource%" "%pathDestination%" "%%B" %optionCopy% /LOG+:"%nameLogfile%_%%A.txt"
)
exit /b
```

#使い方

1.お好みの形でフォルダを作る。サンプルそのままの場合はこう。サンプル通りにしない場合はバッチファイルを書き換える。

```
ドキュメントフォルダ
+---config（特に意味はないがサンプル通りにするなら作る）
    +---JumpList（便宜上のルートフォルダ）
        +---targetlist（処理対象リスト置き場）
        +---files（ジャンプリストファイルの移動先）
        +---log（ログファイル出力先）
```

2.処理対象リスト置き場フォルダに処理対象リストを作る

書式：`アプリケーション名（カンマ禁止）,ジャンプリストファイル名`

```TargetJumpList.txt
Adobe Photoshop CC 2018,bb2c0b38d42e8e9d.automaticDestinations-ms
```
3.必要があればバッチファイルを書き換える

```
set pathSource=（ジャンプリストファイルがあるフォルダ）
set pathMoveRoot=（便宜上のルートフォルダ）
set pathList=（処理対象リスト置き場）
set pathDestination=（ジャンプリストファイルの移動先）
set pathLog=（ログファイル出力先）
set nameSource=（ジャンプファイルリスト名）
set nameLogfile=（ログファイル名の前半部分）
set optionCopy=（ログ以外のrobocopyオプション）
```


4.タスクスケジューラに登録する

- トリガーは自分のユーザーアカウントログオン時、遅延はお好みで。
- 操作はプログラムの実行
- `powershell -WindowStyle Hidden -command "cmd /c バッチファイル（フルパス）"`

#etc
- 負荷はあまり考慮していないので、様子を見たい。
- ログファイルは必要なのだろうか。必要なければ`/LOG+:"%nameLogfile%_%%A.txt"`を消す。


以上
Jetbrains謹製アプリのMaximum heap sizeを変更する


いつも忘れるので…（シングルアプリからtoolboxに変えて保存先が変わったりしたので書いておく）

## Using Toolbox
`Jetbrains#Toolbox` を開いて設定したいエディタの六角形？の部分をクリックして、セッティング画面を開きます。
![Screen_Shot_2018-03-12_at_12_49_29.png](https://qiita-image-store.s3.amazonaws.com/0/81887/d24e96c6-5f9d-4921-b053-c8e85ff2bf38.png "Screen_Shot_2018-03-12_at_12_49_29.png")

heapsizeを任意の値に変更して（僕は2GB割り当ててます）、 `Apply Changes` で保存します。
保存したら、再起動を行います。
![Screen_Shot_2018-03-12_at_12_49_38.png](https://qiita-image-store.s3.amazonaws.com/0/81887/5473df46-c694-953c-e7b2-ebd96d4b2db7.png "Screen_Shot_2018-03-12_at_12_49_38.png")


## Using single application
- 気が向いたら書く

## Check config
シフト2度押しでSearch everywhereランチャを起動して、memoryなどと打つと show memory indicatorと出るので、設定をオンにします。
右下に出るので、先ほど設定した値が反映されていることを確認します。
![Screen_Shot_2018-03-12_at_12_56_45.png](https://qiita-image-store.s3.amazonaws.com/0/81887/e16ebae6-ba63-f0f0-2821-1fc55ffbb9f9.png "Screen_Shot_2018-03-12_at_12_56_45.png")
めっちゃお手軽にWebサーバを立ち上げるょ。

こいつを使います → [http-server: a command-line http server](https://github.com/indexzero/http-server)

```bash
% npm install -g http-server
% http-server -p 3000
```

http://localhost:3000/ でアクセスできます。
以上、おしまい。
JSライブラリを使わないで全画面にほげする。あ、やっぱりスマホページだけ。

全画面にほげしたいけど、そのサイトが以下のような状態の場合、素のJavaScriptでのDOM操作が必要になります。

- SPAではない
- React、Vueなどのフレームワークを使っているページと、使ってないページがある
- jQueryをグローバルで定義していない
- footer（またはheader）は共通化している（includeファイル）

この状態で全画面にほげすることを考えたとき、共通化しているfooter内で、以下の処理を行うことを考えました。

1. 全画面で表示したいコンテンツを `display: none`でマークアップする
2. jsでコンテンツのDOMを取得して、目的の場所にappendし、 `display: block`にする

> 当初document.createElementで要素を作成していこうと思ったのですが、レイアウトが単純ではないのでやめました。

**1. 全画面に表示したいコンテンツを `display: none`にしておく**

```html:footer.incのどこか
・・・
<div class="js-target" style="display: none;">hoge</div>
・・・
```

**2. jsでコンテンツのDOMを取得して、目的の場所にappendし、 `display: block`にする**

目的の場所をbody直下にした場合。

```html:footer.incのどこか（コンテンツより下）
<div class="js-target" style="display: none;">hoge</div>
...
<script>
var element = document.getElementsByClassName('js-target')[0];
if (element) {
  document.getElementsByTagName("body")[0].prepend(element);
  element.style.display = 'block';
}
</script>
...
```


これで、footer.incを読み込んでいる、全ての画面でbody直下に`hoge`が表示されるようになりました。

## あ、やっぱりスマホページだけ。
全画面ではなく`User Agent`を見て、スマホページだけに出したいという要件に変わった場合、上の処理に下の条件分岐を追加してあげます。
※スマホの定義はプロジェクトに依存するので、その都度変更します。

```js
var element = document.getElementsByClassName('js-target')[0];
if (element) {
  var ua = navigator.userAgent;
  if (ua.indexOf('iPhone') > 0 || ua.indexOf('iPod') > 0 || ( ua.indexOf('Android') > 0 && ua.indexOf('Mobile') > 0 ) || ua.indexOf('Windows Phone') > 0) {
      document.getElementsByTagName("body")[0].prepend(element);
      element.style.display = 'block';
  }
}
```

ゼロから新規で同じ思想で使ってつくるサイトならいいのですが、
古いページとモダンなページ、脱jQueryしているページとしていないページが混在していると、全ての画面に何かをするというのにはひと工夫が必要でした。
Laravel Viewでの日付フォーマットの変更

###やりたいこと
- "2000-02-02 00:00:00"を"2000/02/02"と表示したい

###実装
- モデルファイルに$datesプロパティを記述する
（created_at, updated_atは記述する必要なし）
- 変更したい日付にformat()をつける

format()のパラメータ文字列は下記リンク参照
[PHP:date - Manual](https://www.php.net/manual/ja/function.date.php)

```php5:Model.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
    protected $guarded = ['id'];
    protected $dates = ['display_date'];
}
```

```php5:blade.php

    @foreach($items as $item)
-     <div>{{ $item['display_date'] }}</div> //2000-02-02 00:00:00
+     <div>{{ $item['display_date']->format('Y/m/d') }}</div> //2000/02/02
    @endforeach
```
[CodeIgniter3]メールに添付ファイルをつけると添付ファイルが破損する

# 問題


CodeIgniter3でメール送信機能を使っていて

```
  $this->email->attach($path . $file_name);
```
これで何度添付しても添付ファイルのみが壊れるという事案が発生。

メールヘッダーもCodeIgniterがちゃんと吐き出してくれて、保存ファイルは破損しておらず、パスも合ってるので

```
$this->email->attach
```
部分が怪しいとあたりをつけて調べたら下記に行き着いた

#解決

[Codeigniter send mail: attachment damaged
](https://stackoverflow.com/questions/42926749/codeigniter-send-mail-attachment-damaged) 

```
 .(empty($this->_attachments[$i]['cid']) ? '' : 'Content-ID: <'.$this->_attachments[$i]['cid'].'>'.$this->newline.$this->newline)
```
```
 .(empty($this->_attachments[$i]['cid']) ? '' : 'Content-ID: <'.$this->_attachments[$i]['cid'].'>'.$this->newline)
 .$this->newline
```
CodeIgniter3の不具合だったみたい。
これで複数ファイルでも単一ファイルでも問題なく機能しました。
Tinkercad > shortcut (Windows) > D > Drop object(s) on the work plane

ブラウザ動作するAutoDeskのTinkercad。

以下は使いそうなショートカットキー。

- D: Drop object(s) to the work plane

オブジェクトのz位置を0にする機能のようだ。work planeに落ちたようになる。

位置調整の作業が捗る。

### 備考

Autodesk 123Dはサービス終了し、Tinkercad へ移行したらしい。
http://monoist.atmarkit.co.jp/mn/articles/1701/06/news035.html
Tinkercad > shortcut (Windows) > Ctrl + H (Hide objects), Ctrl + Shift + H (show all hidden objects)

ブラウザ動作するAutoDeskのTinkercad。

以下は使いそうなショートカット。

- Ctrl + H: Hide object(s)
- Ctrl + Shfit + H: Show All hidden object(s)

オブジェクトAによってオブジェクトBが隠された状態でオブジェクトAを隠す、というような状況で使うだろうか。

### 備考

ヘルプ記載はWindows用の説明なのだろうか?
https://www.tinkercad.com/beta

~~OS X上でのヘルプは未確認。~~

ヘルプの下記に以下のような記載がある。

[Winマーク]Ctrl = [Appleマーク]Cmd / [Winマーク]Alt = [Appleマーク]Option

OS X向けの資料としては読みにくいドキュメントだ。
Eclipseで差分比較時に文字化けする場合にする設定

# 概要
表題のとおり。
ヒストリーから「前の状態と比較」とかしたときにJavaファイルの日本語部分が文字化けしたときにこの設定で文字化けしなくなりました。

# 環境
Win10 pro
Eclipse Oxygen.2 Release (4.7.2)
Pleiades All in One 4.7.2.v20171225

# 手順
[ウィンドウ]→[設定]→[一般]→[コンテンツ・タイプ]から文字化けしたファイルと同じ関連付け（ここでは.Javaファイル）を選択し、[デフォルト・エンコード]に対象ファイルのエンコードと同じものを入れる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30304/a3edff2f-ea52-e7ee-bdc4-5d17c1bf7101.png)

私の場合、対象となるJavaファイルがSJISなので、SJISとした。

以上。
Tinkercad > shortcut (Windows) > Ctrl + L > オブジェクトのLock/Unlock

ブラウザ動作するAutoDeskのTinkercad。

Ctrl + LでオブジェクトのLock/Unlockができるようだ。

ロックしたオブジェクトはオブジェクト選択時に周囲が紫色に表示される。

複数のオブジェクトが配置された状態で、選択的にオブジェクトを移動したい場合、移動しないオブジェクトをLockしておけば移動しやすそう。
(移動後にLock解除する)。
htmlタグを反映して（HTMLエンコードを無効にして）Webページに表示する方法

# はじめに
「お知らせ」や「FAQ」をプランナーさんに作成してもらい、それをDBにマスターデータとして保存、Webサイト上でその文言を表示する。というのは、よくあることだと思います。

ただし、そのときに、改行などはもちろん、htmlのタグで書かれます。
つまり、このように表示したいわけです。


```
いろはにほへと<br/>ちりぬるを
```

:arrow_down:

```
いろはにほへと
ちりぬるを
```
ただし、このとき cshtml にそのまま渡しても、タグがそのまま表示されてしまいます。
その回避策が、Html.Raw です。

# @Html.Raw を使用する
そもそも、htmlタグがそのまま表示されるのは、HTMLエンコードが行われているからです。
Html.Raw を使用すると、それを無効化します。

:no_entry_sign: *クロスサイトスクリプティング（XSS）の恐れがあるため、ユーザーが入力するようなものについては使用しないでください* :no_entry_sign:
HTMLエンコードはXSSを防ぐために行われていることを重々承知した上で、安全な入力の場合、例えば、今回のようにサイト運営者が入力するものに対して使用することをオススメします。

サンプルコードを以下に記載します。

## サンプルコード

```SampleController.cs
﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using WebApplication1.Models;


namespace WebApplication1.Controllers
{
    public class SampleController : Controller
    {
        [HttpGet]
        public IActionResult Index()
        {
            var model = new SampleModel() {SampleText = "いろはにほへと　ちりぬるを<br/>わかよたれそ　つねならむ"};
            return View(model);
        }
    }
}

```

```Index.cshtml
﻿@model SampleModel
    

<section>
    <h3>そのまま表示</h3>
    <p>
        @Model.SampleText
    </p>
</section>

<section>
    <h3>Html.Raw を使用して表示</h3>
    <p>
        @Html.Raw(Model.SampleText)
    </p>
</section>
```

```SampleModel.cs
﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace WebApplication1.Models
{
    public class SampleModel
    {
        public string SampleText { get; set; }
    }
}

```

## 実行結果
![2018-02-16_09h53_44.png](https://qiita-image-store.s3.amazonaws.com/0/93282/380c1c9f-946b-7a49-b020-ba3fde900ee4.png)


# 参考
* [HTMLエンコードを無効にする - Html.Rawメソッド［Razor］](https://www.buildinsider.net/web/bookaspmvc5/040304)
ExcelFunction//数値を時間に直す関数

そんなに難しい話ではないんです。与えられた数値をゴニョゴニョして...とかではなくて、下請けならではの悩みの解決法の一つ。
#取引先が投げてくる~~くそ~~データシート
取引先から渡されたExcelシートの時間が「３桁または４桁の整数」というとんでもないシートがありました。オペレータのお姉さん（想像）が入力するのに、：を入れないくていいから早いんですよねきっと。と思いましたが、こちらはそれを時間として処理しなくては行けないという問題。
私が関わる前は人間が目で確認して、表示を並べ替えてました。ふた桁行ならなんとかなるんですが、取引が増えて３桁行になってくると∩(・∀・)∩　ﾓｳ ｵﾃｱｹﾞﾀﾞﾈ。先方は一方的に送って、「やり方は御社に任せます」という信頼関係のかけらもないお言葉...ということで私に話が回って来ました

#関数はこちら
```Excel:時間設定関数
Function try_time(bc_time)
Dim Time_h, Time_m
'-------------------------------------------------------------
'4桁数字による時刻表示に対応する関数
'3桁の場合は1字をHourとし、4桁の場合は2字をHourとする
'HourとMinuteに分割して、hh:mm型に変換して返す
'If文内で、24時以降の場合、翌日のデータとするため1日追加する
'-------------------------------------------------------------
            If Len(bc_time) = 3 Then
                Time_h = Left(bc_time, 1)
            Else
                Time_h = Left(bc_time, 2)
            End If
            Else
            End If
            Time_m = Right(bc_time, 2)
            try_time = Format(Time_h & ":" & Time_m, "hh:mm")
End Function
```
##何しているか
1. 先方が送ってくるデータの時間セル(「0945」とか「2330」とか)を関数に取り込み
2. ３桁なら左１桁、４桁なら２桁をTime_h(h=hour)に取り込む
3. 残り２桁はTime_m(minute)に入れる
4. Time_hとTime_mを":"で繋いで、フォーマットをhh:mmして返す

##この取引先とのデータのやりとりには必須の関数
になってしまいました。なんかもっと綺麗にできそうですが、そんなに処理時間を食うわけでもないのでまあいいかと
Slack でメール(Gmail)を受信する


### メリット
メールをSlackに流してしまうことで手間を省ける。とりあえずアラートメール。Slackは全ての投稿にURLを発行しています。要するに、自分のメールを転送したいと思ったときに、いちいちメールを転送することなく、URLをコピペしてお知らせすることができる。

### 手順
1.Slckでワークスペース作成して設定。
2.発行されたEmailをGmailの設定(「メール転送とPOP/IMAP」タブを選択)からコピペして転送接続完了。
3.テストメールでSlackにお知らせくるか確認

1.ブラウザでslackログイン
https://chatbox-inc.slack.com/open?action=preferences_messages_media

2.slackのApp設定、アプリを検索から「Email」をインストール
https://chatbox-inc.slack.com/apps/A0F81496D-email?page=1

3.Slackアプリ「Email」の「アプリを追加」から設定。URLが作成される。

4.Gmailから転送したいメールを選択。
「設定」の「メール転送とPOP/IMAP」タブを選択し、Slackで生成されたアドレスをペースト。
![スクリーンショット 2018-03-09 12.37.06.png](https://qiita-image-store.s3.amazonaws.com/0/145590/b94bd309-be4a-5673-b014-fa5042ce2e74.png "スクリーンショット 2018-03-09 12.37.06.png")


5.一度確認メールで転送されるか確認しましょう！

参考
https://get.slack.help/hc/ja/articles/206819278-Slack-%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E5%8F%97%E4%BF%A1%E3%81%99%E3%82%8B#%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AB%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%82%8B

メール設定参考
https://techblog.recruitjobs.net/development/slack-email-notiication
Python + Numba CUDA で GPU プログラミング入門以前

Python + Numba CUDA で GPU プログラミングしてみるシリーズ

- その０： Python + Numba CUDA で GPU プログラミング入門以前 **[← イマココ]**
- その１： [Python + Numba CUDA で画像処理](https://qiita.com/hoto17296/items/d7f3bd3df0a51bf78bf9)
- その２： [Python + Numba CUDA でライフゲーム](https://qiita.com/hoto17296/items/80dd5ee389135abd2ed7)

GPU マシンを買った[^gpu]ものの「TensorFlow を速く実行してくれるやつ」としてしか扱っておらず、もう少し使いこなせるようにならないと勿体ないので CUDA プログラミングを始めることにした。

[^gpu]: http://blog.hotolab.net/entry/zbox

今回は Python から CUDA を扱うためのツールとして [Numba](http://numba.pydata.org) を使う。
Python から CUDA を扱うツールとしては他に PyCUDA や CuPy などがあるが、
NVIDIA の公式ページでは Numba が紹介されている[^how-to-cuda-python] ので最初に触るものとしてはこれが良いのかと思った。

[^how-to-cuda-python]: [GPU Accelerated Computing with Python \| NVIDIA Developer](https://developer.nvidia.com/how-to-cuda-python)

## はじめに
この記事では「CUDA のプログラミングモデル」や「Numba の使い方」については触れない。ひとまず「Python コードを GPU 上で実行できるようになる」ことを目指す。

また CUDA プログラミングに Docker は必要ではないが、こういった実験的な遊びは環境を作って壊すことが容易にできたほうが良いと思っているので、今回は Docker を使っていく。

## Ubuntu 16.04 に NVIDIA ドライバをインストール
割愛

## Docker と NVIDIA Docker をインストール
割愛

## Numba + CUDA が動く Docker イメージを作成
CUDA のイメージに Miniconda を入れて Numba と CUDA Toolkit をインストールする。[^conda]

[^conda]: conda を使わずとも pip で Numba をインストールできるが、CUDA を利用したコードは色々と試行錯誤しても動かせなかったため Miniconda を使って CUDA Toolkit を一緒に入れるほかなかった。そもそも CUDA のベースイメージに CUDA Toolkit が含まれているはずなのに、あとから conda でも入れないと動かないのは何故なのかが謎。

``` Dockerfile:Dockerfile
FROM nvidia/cuda:8.0-cudnn6-runtime

RUN apt-get update \
    && apt-get install -y wget bzip2 \
    && apt-get clean

RUN cd /tmp \
    && wget --quiet https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh \
    && /bin/bash miniconda.sh -b -p /opt/conda \
    && rm miniconda.sh

ENV PATH /opt/conda/bin:$PATH

RUN conda install -y -q cudatoolkit numba
```

Docker イメージをビルドして `numba-cuda` という名前を付ける。

``` console
$ docker build -t numba-cuda .
```

## 動かしてみる
GPU を使うので Docker コンテナを起動する際に `--runtime=nvidia` が必要。

``` console
$ docker run --runtime=nvidia --rm -it numba-cuda
```

ログインしたコンテナ内で以下の Python スクリプトを実行してみる。
以下は「配列のすべての要素に 1 を加える」という処理を GPU 上で行うスクリプト。

``` python
from numba import cuda
import numpy as np

@cuda.jit
def increment_by_one(arr):
    tx = cuda.threadIdx.x
    ty = cuda.blockIdx.x
    bw = cuda.blockDim.x
    pos = tx + ty * bw
    arr[pos] += 1

arr = np.arange(5)
print('Input: {}'.format(arr))

threadsperblock = 32
blockspergrid = 1
increment_by_one[blockspergrid, threadsperblock](arr)
print('Output: {}'.format(arr))
```

実行すると以下のような結果になる。

```
Input: [0 1 2 3 4]
Output: [1 2 3 4 5]
```

期待どおりに動いた。

## これから
ひとまず簡単なスクリプトを動かせるようになったので、これから GPU や CUDA について理解を深めながらもっと複雑なことをやっていこうと思う。

今回はここまで。
Azure Functions の使い方

Azure Portal でソースコードを入力します。
ファイルのアップロードは、今の時点では動作しません。

雛形のプログラムを作成します。
webhook + API と JavaScript を選択します。
![azure_mar1200.png](https://qiita-image-store.s3.amazonaws.com/0/179446/ba937ceb-31bd-b32c-8a31-42ab310400e8.png)

雛形のプログラムを編集します。
![azure_mar1201.png](https://qiita-image-store.s3.amazonaws.com/0/179446/bafde6f9-0ea5-34c5-463a-02c31f2e6e4d.png)

Node.js のサンプルです。

```js:index.js
module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function.');
    context.log('*** Mar/12/2018 AM 11:54 ***')
    var str_out = ""
    str_out += "*** start ***\n"
    str_out += "こんにちは\n"
    str_out += "Mar/12/2018 AM 11:46\n"
    str_out += "*** end ***\n"

        context.res = {
            // status: 200, /* Defaults to 200 */
            body: str_out
        };
    
    context.done();

    context.log('*** end AM 11:54 ***')
};
```

Curl でテストするコマンド

```bash:exec.sh
curl https://ekzemplaro02.azurewebsites.net/api/HttpTriggerJS1?code=ABCDE123jLn3NFT6UPpR4HlV8mTHo3xutth*******************==
```

実行結果

```text
$ ./exec.sh 
*** start ***
こんにちは
Mar/12/2018 AM 11:46
*** end ***
```
ExcelVBA // シートの編集のあれこれ

```Excel:アラート止める.vba
Application.DisplayAlerts = False
```
ファイルを削除するときとかに毎回アラートで確認させたくないときに使用する
処理中に裏でシートを作成して、処理を終えたら削除する。とかの場合に良く使います


```Excel:フィルターを解除する.vba
(worksheet).AutoFilterMode = False
```
マクロ処理を行うにあたってフィルタで何かの操作をされていると思い通りの動作をしないことがある。
先にこれで解除することで予期せぬ動作を抑止できる

```Excel:列の非表示解除.vba
(worksheet).Row.Hidden = False
```
列を非表示にして見栄えを良くして見せるのは個人的には好きではないですが、こういう操作をされたシートを処理しなければならない場面は結構あります。その場合はこれで解除

```Excel:シートを保護.vba
(worksheet).Protect
```
ちなみに、保護の解除は Unprotect
linux > 自動起動 > /etc/rc.local (2018/03/12版) > nohupでなくsudoで実行 | 設定ミス(致命的: OS起動しなくなる)

```txt:動作環境
CentOS 6.8 (64bit)
   - on VMWare workstation
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

起動時にPythonスクリプトやbashスクリプトを実行する方法を見ているなか、自分の過去記事の間違いに気づいた。

[line monitor > /etc/rc.local (151213)](https://qiita.com/7of9/items/46ae6752db57205fd5e7)
において記載しているのは以下のようなものだった。

```bash
...
## IP address display (2015 Nov. 28)
cd /home/pi/lineMonitor/python-151127-7segLed_IPadrDisplay
nohup ./IPadrDisplay.py &
```

nohupを使っている。

```bash
$ man nohup | head 
NOHUP(1)                         User Commands                        NOHUP(1)



NAME
       nohup - run a command immune to hangups, with output to a non-tty
```

他の人の例ではsudoで`&`を付けて実行している。

- [Raspberry Pi 起動時 実行スクリプト](http://www.takunoko.com/blog/raspberry-pi-%E8%B5%B7%E5%8B%95%E6%99%82-%E5%AE%9F%E8%A1%8C%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/) @ たくのこWeb by たくのこさん
- [Raspberry Pi 2起動時にpythonプログラムを実行](https://teratail.com/questions/30955)

nohupでなくsudoでの実行でいいかもしれない。

### 設定ミス (致命的)
**(<font color=red> 以下を実行すると起動しなくなります。真似しないように</font>)**

sudoでの実行を試していた。

```/etc/rc.local
...
sudo python /home/user/hello_180312.py &
```

上記の設定を間違って以下とした。

```/etc/rc.local
...
sudo python /home/user/hello_180312.py
```

hello_180312.pyは無限ループで"hello"とprintするスクリプト。
`&`なしで設定したので、起動時にこれが走りOSの後の作業に遷移しなくなった。

VMWare でスナップショットを撮っていたから復旧できたが、そうでない場合は復旧をどうするか分かっていない。

https://www.raspberrypi.org/documentation/linux/usage/rc-local.md
> WARNING
...
> If your command runs continuously (perhaps runs an infinite loop) or is likely not to exit, you must be sure to fork the process by adding an ampersand to the end of the command, like so:
> `python /home/pi/myscript.py &`
> Otherwise, the script will not end and the Pi will not boot. 

こういう設定変更時は機能を実行する前にダブルチェックした方がいいだろう。Think(Check) twice before you do it.
超新人プログラマー(見習)が参考にしたWEBサイト〜Git・Github編〜


#自己紹介

都会で頑張る田舎者です。
文系大学卒の元OLです。
ひょんなことからデータサイエンシストへ弟子入りし、プログラミングの世界に導かれやってきました。
Python、git、docker、Ubuntu、raspberry piなどなどを修行しております。
何卒よろしくお願いいたしますm(_ _)m

そこで、Gitについて。
　→[pythonについてはこちら](https://qiita.com/petadimensionlab/items/515b84cae8e8a9e0ced8)

どのサイトを使用して修行しているかをご紹介したいと思います。
同じようにプログラミングの世界に飛び込もうか考え中の方にも参考になれば幸いです。

##はじめに
師匠のデータサイエンシストが研究用に作成したjupyternotebookのファイルを管理するために勉強しました。Gitは書籍で学ぶことなく、webサイトを読み漁って勉強しました。
　→まだ工事中ですがpetadimensionlabが作成したGithubは[こちら](https://github.com/petadimensionlab)です。
###1.Gitとは
プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。
参考：[wiki](https://ja.wikipedia.org/wiki/Git)
###2.Github
GitHub（ギットハブ）はソフトウェア開発プロジェクトのための共有ウェブサービスであり、Gitバージョン管理システムを使用する。
参考：[wiki](https://ja.wikipedia.org/wiki/GitHub)


##参考Ｗｅｂサイト
###1.サルでも分かるGit入門
https://backlog.com/ja/git-tutorial/
グーグル先生に「git　入門」を聞いたら一番最初に教えてくれるやつです。
チュートリアルを、pc環境によって変えられるのが良い点だと思います。
ちなみに、macのチュートリアルでは、黒い画面がムリって人でも使いやすい、”[soucetree](https://ja.atlassian.com/software/sourcetree)”というGUI形式のデスクトップアプリケーションの操作方法を教えてくれます。
もちろん、ターミナル（コンソール）での操作方法も教えてくれますよ。

###2.今日からはじめるGitHub 〜 初心者がGitをインストールして、プルリクできるようになるまでを解説
https://employment.en-japan.com/engineerhub/entry/2017/01/31/110000
サル以下なのに、実ははじめはこちらを見ながら勉強しました。。。。
「Gitのインストールと準備」〜「GitHubへのSSH接続を確認する」までを参考にさせていただきました。それ以降はサル以下なので ？？？ でしたので、「[サルでも分かるGit入門](https://backlog.com/ja/git-tutorial/)」にお世話になりました。

###3.Gitを使いこなすための20のコマンド
https://mag.osdn.jp/09/03/16/0831212
その名の通り、コマンド集です。上記以外にもたくさんのコマンド集があります。
・Gitコマンド一覧
https://qiita.com/fukumone/items/73e1a9a62c5e4454263b
・基本的なGitコマンドまとめ
https://qiita.com/2m1tsu3/items/6d49374230afab251337
・【Git】基本コマンド
https://qiita.com/konweb/items/621722f67fdd8f86a017
先人達の知恵・・・ありがたやありがたやm(_ _)m

###4.【GitHub Desktop導入検討中の方必見】ツールを徹底解説
https://tech-camp.in/note/technology/7687/
”[GitHub Desktop](https://desktop.github.com/)”の使い方についてのサイトです。
”[soucetree](https://ja.atlassian.com/software/sourcetree)”の公式版と言ったところでしょうか？
※この記事を作成している中で、こんなすんばらしい記事を見つけましたよ。→[Github DesktopとSourcetreeの違いについて](http://no-or-toon.hatenablog.com/entry/2016/12/18/152301)

###5.ドットインストール　git入門 (全22回)
https://dotinstall.com/lessons/basic_git
これすごい。やはり動画はいいですね！
基本的なことと、ターミナルでの操作方法しか学べませんが、一度目を通しておいて損はないと思います。

---
以上です！他色々役立ちそうな本・サイトを見つけ次第更新したいと思います。
文字化けファイルをinode指定せずファイル名で削除

ファイル名が文字化けしたものを削除する場合、findでinodeサーチしたものを削除する方法がよく紹介されていますが、他に方法は無いかと思い調べてみました。

## 環境

- ロケールは`ja_JP.UTF-8`

```bash
$ cat /etc/sysconfig/i18n
LANG="ja_JP.UTF-8"
```

## 準備

- 文字化けさせるファイルを生成

```bash
$ touch ほげ ほげほげ ほげほげほげ

$ ll
合計 0
-rw-r--r-- 1 root root 0  3月 12 10:52 2018 ほげ
-rw-r--r-- 1 root root 0  3月 12 10:52 2018 ほげほげ
-rw-r--r-- 1 root root 0  3月 12 10:52 2018 ほげほげほげ
```

- convmvコマンド（ファイル名の文字コード変換）をインストール

```bash
$ yum intall convmv
```

## 検証

- まずは準備したファイルの文字コードを変換

```bash
$ convmv -r -f utf8 -t sjis ほげほげ --notest
mv "./ほげほげ" "./?ق??ق?"
Ready!

$ ll
合計 0
-rw-r--r-- 1 root root 0  3月 12 10:52 2018 ?ق??ق?
-rw-r--r-- 1 root root 0  3月 12 10:52 2018 ほげ
-rw-r--r-- 1 root root 0  3月 12 10:52 2018 ほげほげほげ
```

utf8からsjisに変換したところ、綺麗に文字化けしました。
ここでlsで出力されるファイルの上から2番目（ほげほげ）を変換しましたが、変換後の出力では上から1番目に出力されていました。

もしかして文字化けしたファイル名のファイルは、lsすると一番上に表示される？と思い、実ファイルの存在するディレクトリでも試してみました。

```bash
$ touch /var/log/きーた

$ ll /var/log/
合計 66744
drwxr-xr-x.  2 root    root        4096 11月 11 07:09 2010 ConsoleKit
（中略）
-rw-r--r--   1 root    root           0  3月 12 10:56 2018 きーた

$ convmv -r -f utf8 -t sjis /var/log/きーた --notest
mv "/var/log/きーた"    "/var/log/???[??"
Ready!

$ ll /var/log/ | head -2
-rw-r--r--   1 root    root           0  3月 12 11:22 2018 ???[??
drwxr-xr-x.  2 root    root        4096 11月 11 07:09 2010 ConsoleKit
```
おお、一番上になってる。

- なら複数ファイルが文字化けしていたら？

```bash
$ touch ほげ ほげほげ ほげほげほげ ふー ふーふー ふーふーふー

$ ll
合計 0
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ふー
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ふーふー
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ふーふーふー
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ほげ
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ほげほげ
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ほげほげほげ

$ convmv -r -f utf8 -t sjis ほげ --notest
mv "./ほげ"     "./?ق?"
Ready!

$ convmv -r -f utf8 -t sjis ふーふー --notest
mv "./ふーふー" "./?Ӂ[?Ӂ["
Ready!

$ ll
合計 0
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ?ق?
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ?Ӂ[?Ӂ[
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ふー
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ふーふーふー
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ほげほげ
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ほげほげほげ
```

文字化けファイルが上から順に2ファイル並んでる！
そうであれば…

## 実践

検証結果を踏まえ、ls出力から文字化けしたファイル数分だけ抜き出してrmに引き渡せば消せる？

```bash
$ ll
合計 0
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ?ق?
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ?Ӂ[?Ӂ[
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ふー
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ふーふーふー
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ほげほげ
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ほげほげほげ

$ ls | head -2 | xargs rm

$ ll
合計 0
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ふー
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ふーふーふー
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ほげほげ
-rw-r--r-- 1 root root 0  3月 12 11:03 2018 ほげほげほげ
```
消えた！

以上、Qiita初投稿は小ネタとなりました。
SonarQubeコンテナを認証付きProxy下で動かす

SonarQubeコンテナを起動したあとに、各種プラグインをセットアップしようとしたのですが、Proxy認証がうまくいってないみたいでプラグインのインストールができません。
対応に結構ハマったのでやり方を残しておきます。

# 動作環境
以下の環境下で動作確認しています。

* Docker
    * 17.12.0-ce
* Docker Compose
    * 1.18.0
* SonarQube
    * 7.0 / 6.6

# 前提
SonarQube公式イメージのDockerfileを見ていると、openjdk:8がベースになっていることが分かります。
Java8の変更点を見てみると以下のように記されています。

[Java 8リリースのハイライト](https://www.java.com/ja/download/faq/release_changes.xml)


```text:抜粋
HTTPSトンネリングのBasic認証の無効化
一部の環境で、HTTPSプロキシ時に特定の認証スキームが不適切である場合があります。
そのため、Basic認証スキームは、デフォルトではOracle Java Runtimeでjdk.http.auth.tunneling.disabledSchemes
ネットワーク・プロパティにBasicを追加することで非アクティブ化されています。
HTTPSのトンネルの設定時にBasic認証を必要とするプロキシは、デフォルトでは成功しないようになりました。
必要な場合、jdk.http.auth.tunneling.disabledSchemesネットワーク・プロパティからBasicを削除するか、
コマンド行で同じ名前のシステム・プロパティを"" (空)に設定することで、この認証スキームを再度アクティブ化できます。
また、jdk.http.auth.tunneling.disabledSchemesおよびjdk.http.auth.proxying.disabledSchemes
ネットワーク・プロパティと同じ名前のシステム・プロパティは、
それぞれHTTPSのトンネルの設定時またはプレーンなHTTPのプロキシ時に、
アクティブ化されている可能性があるその他の認証スキームを無効化するために使用できます。JDK-8160838 (非公開)
```

なるほど。と思い、SonarQubeコンテナ起動時のオプションに「-Djdk.http.auth.tunneling.disabledSchemes=""」を付けて起動してみました。が、うまくProxy認証してくれません。別のやり方を模索しました。

# イメージビルド
* Dockerファイルを作ります。  
/etc/java-8-openjdk/net.propertiesの「jdk.http.auth.tunneling.disabledSchemes=Basic」パラメータをコメントアウトしていることがポイントです。
ProxyHost等の各種パラメータ値は環境に合わせて修正してください。

```dockerfile:Dockerfile
FROM sonarqube:7.0

ARG PASSWORD

# for Proxy Basic Authentication
RUN sed -i -e "s/jdk.http.auth.tunneling.disabledSchemes=Basic/#jdk.http.auth.tunneling.disabledSchemes=Basic/g" /etc/java-8-openjdk/net.properties
RUN sed -i -e "s/#http.proxyHost=/http.proxyHost=[YOUR Proxy IP]/g" /opt/sonarqube/conf/sonar.properties
RUN sed -i -e "s/#http.proxyPort=/http.proxyPort=[YOUR Proxy Port]/g" /opt/sonarqube/conf/sonar.properties
RUN sed -i -e "s/#http.proxyUser=/http.proxyUser=[YOUR Proxy User]/g" /opt/sonarqube/conf/sonar.properties
RUN sed -i -e "s/#http.proxyPassword=/http.proxyPassword=$PASSWORD/g" /opt/sonarqube/conf/sonar.properties
```

* ビルドします。このとき指定するパスワードはProxy認証用のものを指定してください。

```
docker build -f ./Dockerfile -t sonarqube:7.0-1.0 --build-arg PASSWORD=[YOUR PASSWORD] .
```

# コンテナ起動
* 以下のようなcomposeファイルを作ります。データ永続化はしてないので必要に応じて修正を加えてください。

```dockerfile:docker-compose.yml
version: '3'

services:
  test_sonarqube:
    image: sonarqube:7.0-1.0
    ports:
      - 9000:9000
    depends_on:
      - test_sq_mysql
    environment:
      - SONARQUBE_JDBC_USERNAME=sonar
      - SONARQUBE_JDBC_PASSWORD=sonar
      - SONARQUBE_JDBC_URL=jdbc:mysql://test_sq_mysql:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

  test_sq_mysql:
    image: mysql:5.7.21
    command:
      mysqld
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
      --max_allowed_packet=64MB
    environment:
      - MYSQL_DATABASE=sonar
      - MYSQL_USER=sonar
      - MYSQL_ROOT_PASSWORD=sonar
      - MYSQL_PASSWORD=sonar
```

# 動作確認
* SonarQubeにログインしてUpdate Centerを見てみると、プラグインが一覧表示されインストール可能になりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/fe16c9e0-2f1e-6fd5-ffc6-556a9613f8ca.png)
ボタンのタップエリアを拡張する


## 対象
- OS 10.13.3
- Xcode8
- Swift 3

##やったこと
UIButtonのタップ領域が狭かったので、それを広げようと思いました。
やり方はいろいろとあるぽいですが、一番楽に設定できたのはこちらの方のやり方でした。

[IB上で範囲の確認ができるUIButtonのタップエリアを拡大する実装](https://qiita.com/KikurageChan/items/9d0e3ba82e6492e02d12)

この方法は、プロパティからタップ領域を指定出来る方法です。
こちらの方法と、次に紹介する方法を組み合わせて、タップ領域の拡大を大きくすることができました。

[【iOS】UIButtonのタップ領域だけを拡大する](https://qiita.com/KokiEnomoto/items/264f26bfa92d06b1996e)

##わかったこと
この一連の作業でSwiftの特性が少し理解できました。
２つ目に紹介した作業では「ExpansionButton」クラスを作成し、そのクラスをUIViewに設定することで、そのクラスと関連を容易に持たせることができます。
それぞれの機能を持ったクラスを振り分けて、それを関連させることで、重複を防ぐことができることになります。
アイコン設定には FontAwesome か、SVG、pngのどれが良いか検討してみた


## 対象
- OS 10.13.3
- Xcode8
- Swift 3

## やったこと
アプリを作成する上でアイコンはいくつも使用します。それを設定するのはFont形式にしたFontAwesomeを使用した方が良いのか、それともアイコンをSVGにした方が良いのか、それとも、単純にpngの状態の方が良いのか検討してみました。

###FontAwesome
FontAwesomeは数百以上のFontを提供しているサービスです。Freeで商用利用ができますが、有料にすることでより使用できるFont数を増やすことができます。
当初は[FontAwesome.swift](https://github.com/thii/FontAwesome.swift)で提供されているライブラリーを使用していたようです。こちらは、無料分のfontを使用することができましたが、それ以上のものが使用することができませんでした。

#####FontAwesomeの使用方法
GitHubのfontAwesomeにも記述されていますが、以下の設定でfontとして設定することができます。
ただし、UIViewの違いにより設定方法が違う場合があるので、githubに記載されいる設定方法を確認してください。

```fontAwesomeSeting.swift
button.titleLabel?.font = UIFont.fontAwesome(ofSize: 30)
button.setTitle(String.fontAwesomeIcon(name: .github), for: .normal)
```

この設定で、UIButtonにFontAwesomeが設定されます。FontAwesomeはフォントなので、拡大縮小に耐えられ、さらに綺麗に表示することができますが、種類に限りがあるのがネックです。

#####SVGでの設定
次にSVGで設定することを検討しました。FontAwesomeの有料版を購入すると900種類のアイコンを使うことができます。すでにSVG形式でもダウンロードすることができるので、SVGで実装することが良いかと思いました。
しかし、この設定方法でも問題点はSwift標準では設定できず、ライブラリーを導入する必要がありました。

[SwiftでSVGを表示する方法](https://dev.classmethod.jp/smartphone/iphone/ios_swift_svg/)

こちらで紹介されているSVGKitを使用することで設定ができるようです。しかし、前回の紹介したpodの設定でもわかるようにライブラリーを多用することは慎重になった方が良いと思いました。
ライブラリー側がSwiftのバージョンに間に合わないケースがあり、そうなると、ライブラリ自体の調査を行う必要があります。
今後の運用を考えるとライブラリーを増やすことは得策ではありません。
SVG自体は素晴らしい形式なので、その内Swift自体でも標準で扱えるようになると思います。
それまでは、使用は避けた方が良いかもしれません。

#####Pngでの設定
前述したように、これらの結果から無難にPngで設定するのが良いかと思いました。
Sketchなどのアプリではpngを３段階で書き出すことができます。なので、ちゃんとしたデザインシステムをつくりアイコンを管理しながらこまめにアイコンを書き出しする方が一番良いと判断しました。
SourceTreeでbitbucketにpushができなくなったときの話

# 症状
3日前までpushできていたのに急にpushできなくなった。windows10のみ。macは大丈夫。
エラーは以下。

`remote: Invalid username or password. If you log in via a third party service you must ensure you have an account password set in your account profile.
fatal: Authentication failed for 'https://xxxxxx@bitbucket.org/xxxxxxx/xxxxxxx.git/'`

# 原因予想
おそらくbitbucketのパスワードを変更したことが原因。

# 試したこと
SourceTreeのオプション＞認証でパスワードを変更。認証成功と出る。しかしこの状態でpushしても相変わらずエラー。

以下の記事を参考に資格情報を消して再設定したりしたが解消せず。
https://confluence.atlassian.com/bbkb/authentication-error-remote-invalid-username-or-password-942864127.html

# 何とか解消

結局SourceTreeをアンインストールし、設定等が入っているフォルダ C:\Users\<username>\AppData\Local\Atlassian\SourceTree を適当な場所にバックアップして削除。SourceTree再インストールで解消しました。その後バックアップからbookmark等を戻して環境も復帰。

認証情報の保存まわりをもうちょっと勉強しなければ。
指定していないPlaybookが適用される！？

**ansibleを使って、プレイブックを適用した際に不思議な現象が起こってハマったのでメモ**

## 何が起きたか
```
ansible-playbook -i インベントリA プレイブックA --diff
```
を実行した際に、指定していないプレイブックBが適用される現象が発生！！

### 発生した環境
* 異なるNWのA、Bという環境が２つあり、それぞれインベントリA/B、プレイブックA/Bがある
    * インベントリAはプレイブックA、インベントリBはプレイブックBに対応する構成
* 環境ごとに１台踏み台があり各サーバには踏み台経由（多段SSH）でアクセス（詳細後述）

### 多段SSH構成

A/B環境には同じホスト名（例. app01)のサーバが稼働していて、環境ごとのssh踏み台サーバ
経由でログインするような構成となっていて、
例えば、
A環境のapp01サーバにログインするには `ssh a-app01`
B環境のapp01サーバにログインするには `ssh b-app01`
となる。

↓ssh_config抜粋

```conf:~/.ssh/config
# A環境用ProxyCommand設定
Host a-* !a-bastion
    ProxyCommand ssh -W "$(<<<"%h" awk -F- '{print $NF}')":%p a-bastion
Host a-bastion
    HostName xx.xx.xx.xx

# B環境用ProxyCommand設定
Host b-* !b-bastion
    ProxyCommand ssh -W "$(<<<"%h" awk -F- '{print $NF}')":%p b-bastion

Host b-bastion
    HostName yy.yy.yy.yy
```

### 設定内容

ansible.cfgに以下の設定がありました。

```conf:~/ansible.cfg
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=1500s
control_path = %(directory)s/as-%%h-%%r
```

通常はこの設定により、ansible適用対象へのssh接続用のソケットファイルを作成して
使い回すことができ、タスク実行の度に接続する必要がなくなり、実行速度があがります。
（pipeliningと合わせて使うのが定石ですね。[参考](https://qiita.com/kiida/items/3594a25b4e2e8695e2cb)）

## 原因

ansible-playbookを実行中に作成されるファイルが以下の通り。

```
$ ls -1 ~/.ansible/cp/
as-xx.xx.xx.xx-centos
as-app01-centos
```

`as-xx.xx.xx.xx-centos` は踏み台サーバ(a-bastion)、
`as-app01-centos`はa-app01サーバに接続するためのソケットファイルです。

見てわかる通り、a-app01、b-app01にansibleを実行する際に作成されるソケットファイルが
同じ名前（as-app01-centos）になってしまっています。
つまり、ControlPersistで指定した時間内に、連続して異なる環境にansibleを実行すると
同名のソケットファイルが使われてしまい、別のプレイブックが適用されてしまいます。

今回の事象は、多段SSH構成で異なる環境の同じホスト名に対して接続する形になっていると
発生します。
通常は、control_pathでソケットファイル名がユニークになるように指定しますが、control_path
(sshオプションのControlPath)に使えるのは h, r以外にもp, l, Cなども指定できますが、
どれを使っても、ホスト名、ポート、ユーザ名が同じ場合はユニークにすることができませんでした。。 [参考](https://qiita.com/kawaz/items/a0151d3aa2b6f9c4b3b8)

## 回避策

ControlPersistを無効してソケットファイルが作成されないようにすれば一応解決しますが、
そうするとansible実行時間がかなり遅くなるので、無効化はしたくない、ですよね。
ということで、下記のようにして回避しました。

各インベントリファイルの**[all:vars]**に、

```ini:インベントリAファイル
env_id=hogehoge   # ←環境固有の文字列
ansible_ssh_extra_args='-o ControlPath=~/.ansible/cp/{{env_id}}-%h-%r'
```
を追記して、ソケットファイル名をユニークにしました！！
Link > 数値計算 > x86/x64における小数から整数への丸め処理命令の変遷 > RN, RD, RU, RZ || Banker's rounding


[x86/x64における小数から整数への丸め処理命令の変遷](http://blog.cybozu.io/entry/2017/08/15/080000)
@ Cybozu Inside Out

4種類の丸め規則の図が分かりやすい。

以下は興味を引いた部分。

> 丸めモードの中に四捨五入はありません。 これはxが0以上なら0.5を足し、xが負なら0.5を引いて0へ丸めればよいからです。

RN, RD, RU, RZという略語表記が紹介されている。

以下は興味を引いた部分。

>0への丸めは0に向かう方向に切り捨てます。doubleからintにキャストするときのルールはこれに相当します。

関連して思い出したのは以下のmm単位で丸める時に使う英語フレーズ。

> Round XXX to the nearest millimeter.

Banker's roundingを思い出した。
http://wiki.c2.com/?BankersRounding

Banker's roundingを知ったのはRadium Software Developmentというサイトだった。サイトはもうないが、自分のブックマークメモ(2013/09/29)では以下を残している。

> 丸めを行った時にどうなるかの検討 / Round関数 / 銀行型丸め / banker's rounding
Cognos Analyticsをバージョンアップした後、"_KEY8.js"エラーで画面が真っ白になった時の対処法

Cognos Analytics 11.0.6を11.0.9にバージョンアップした後、レポート編集画面を開こうとした時にこのエラーに遭遇しました。

分かってみるとすごく簡単な解決方法だったのですが、意外と灯台下暗し的なお話だったので投稿しておきます。

#対処法
**ブラウザのキャッシュを削除した後、ブラウザを再起動**

これで、問題なくレポート編集画面が開くことが確認できました。


#簡単な背景
CA11.0.6を11.0.9にバージョンアップする機会があり、簡単な動作検証を実施した後にCAのバージョンアップ作業を実施しました。
バージョンアップ後の動作検証時にレポート編集画面を開こうとすると当エラーに遭遇しました。

##事象
レポート編集画面を開いても真っ白な画面が表示され、レポート作成を進めることができません。
レポート実行後の画面からだけでなく、新規レポート作成から編集画面を開いても同エラーとなることを確認しています。

##正常に稼動した動作検証
それ以外では、下記の動作検証を実施していて問題なく稼動していることを確認していました。
- レポート実行
- 新規ダッシュボードの作成と保存、実行
- 管理コンソールへのアクセスと表示
- IHSのGWを経由せず、Dispatcher(9300ポート)に直接アクセスしてレポート編集画面を開く

##エラーになった際のメッセージとポップアップ画面
```HTML:エラーメッセージ(抜粋)
Error: Script error for: packages/TemplateOperations/_KEY8.js
http://requirejs.org/docs/errors.html#scripterror
 at defaultOnError
```


![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/74c96244-1e3c-6b4d-c5d7-fd976152b2ac.jpeg)


##原因っポイもの
CA 11.0.6では存在していた該当のファイルが11.0.9では不要になったみたいでなくなっているのが原因ポイですね。
で、ブラウザのキャッシュにその情報が残っているとサーバーに対してリクエストが飛んで、でも、サーバー上にファイルは存在しないのでエラーになる。みたいな。
この辺を正確に把握しようとすると、ネットワークのキャプチャなど見ながら真剣にPDする必要はあると思いますが今回はそこまで実施していないので、ポイものとして記載させていただきます。
初心者向け｜Microsoft Flowを使ってみる（3）メールの添付ファイルをOneDriveに自動保存する

#はじめに
- Microsoft Flowを使ったシンプルなフローの作り方をまとめていきます。
- これからFlowにチャレンジしてみようと考えている初心者向けです。

#設計

##このフローの利用シーン
メールで自動納品される添付ファイルを、自動的に保存する。

##このフローの目的
ルーチン業務を自動化し、リソースを他の生産性ある業務に割り当てる。


#フローの作り方

##作業時間
5～10分

##（1）Flowの上部メニューで「マイフロー」→「一から作成」を選ぶ
![flow3.png](https://qiita-image-store.s3.amazonaws.com/0/242229/031fe7da-8413-2372-29bf-520db14e78ac.png)


##（2）「多数のコネクタやトリガーを検索する」を選ぶ
![flow4.png](https://qiita-image-store.s3.amazonaws.com/0/242229/6e60810e-3782-0be0-d3cd-627e6eb56d7c.png)

##（3）フロー名を設定。トリガーを選ぶ
![flowC1.png](https://qiita-image-store.s3.amazonaws.com/0/242229/f48ed933-9610-9c17-73a2-ba7e0d20e4d5.png)

**フロー名**
分かりやすい名前を付けてください。

**トリガー**
行動の起点を設定します。

(a)自動納品されるメールが届いたら、
(b)添付ファイルをダウンロードする。
(a)が起点です。トリガーとしては「Office365 Outlook」を選びます。


##（4）「Office365 Outlook - 新しいメールが届いたとき」を選ぶ。
![flowC2.png](https://qiita-image-store.s3.amazonaws.com/0/242229/a9493e6d-b13f-6807-1548-3d57222d90eb.png)

##（5）「Office365 Outlook - 新しいメールが届いたとき」の詳細
![flowC3.png](https://qiita-image-store.s3.amazonaws.com/0/242229/6e85436a-027f-6649-2ba2-df0d5cd96a6e.png)

トリガー「新しいメールが届いたとき」の設定画面です。
宛先（受信者メアド）、開始（送信者メアド）、重要度、添付ファイルの有無、件名フィルターなど選ぶことができます。

今回は
開始：メールの送信元
添付ファイルあり：はい
を設定しました。

「新しいステップ」を選びます

##（6）「さらに追加」から「Apply to Eachの追加」を選ぶ
![flowC4.png](https://qiita-image-store.s3.amazonaws.com/0/242229/b08e92e1-bde3-d38a-9029-e2a4c4a2d1e2.png)

##（7）「添付ファイル」を選ぶ。さらに「アクションの追加」を選ぶ
![flowC5.png](https://qiita-image-store.s3.amazonaws.com/0/242229/aa4990e6-064e-b8e6-2c01-e3e2bd636bbb.png)


##（8）保存先の選択
![flowC6.png](https://qiita-image-store.s3.amazonaws.com/0/242229/dc4e1ab4-05d1-ea29-a826-4a660135f4b5.png)

今回はOneDrive for Businessを選択します。
GoogleドライブやDropBoxなどにすることも可能です。

##（9）「OneDrive for Business - ファイルの作成」を選ぶ
![flowC7.png](https://qiita-image-store.s3.amazonaws.com/0/242229/dd632e1e-5210-08d3-6360-6886c353ff42.png)

添付ファイルをOneDrive上に作成（ダウンロード）します。

##（10）「OneDrive for Business - ファイルの作成」の詳細
![flowC8.png](https://qiita-image-store.s3.amazonaws.com/0/242229/e9ab516b-69d0-3c70-5daf-2c06be16fe1e.png)

フォルダのパス：/download/と指定しました。こちらは自由に設定してください。
ファイル名：「名前」を選びます。
ファイル コンテンツ：「コンテンツ」を選びます。

**最後に**
フローの保存を選びます。


##以上になります。
これで指定した条件でメールが届いた場合、添付ファイルが自動保存されます。
Microsoft FlowのコネクタにはSFTPなども用意されていますので、
添付ファイルをアップロードすることも可能な・・・はずです（試してません。。）
other note



## git

## how to stash including untracking files
- see: https://qiita.com/muran001/items/f5746c518bf663f86a79

## node

### how to use nvm
- see: https://qiita.com/544/items/7237a32c68619236f446

## reg expression

- 非常に網羅している。http://doc.okkez.net/static/1.8.7/doc/spec=2fregexp.html
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17342/d2324223-be86-68ee-7356-4bab680b8c3a.png)


## CommonJs, AMD, RequireJs

- CommonJS と ES6の import/export で迷うなら: https://qiita.com/rooooomania/items/4c999d93ae745e9d8657#export-default--require
- Node.js : exports と module.exports の違い（解説編） - ぼちぼち日記: http://d.hatena.ne.jp/jovi0608/20111226/1324879536
event handler add object

```html
<input id="a"></input>
<input id="b"></input>
```
```js
let fn={}
fn.q=(d=>document.querySelector(d))
;
let ai=(obj)=>{return function(ev){
  console.log(ev,obj,this) //rino
}}
,bi=function(obj,ev){
  console.log(ev,obj,this) //<-->
}
;
fn.q('input#a').oninput = ai({v:'aaaa'})
fn.q('input#b').oninput = bi.bind(fn.q('input#b'),{v:'bbbb'}) /*this=fn.q('input#b')*/

```
WRF > NCAR's Research Data Archive Blog > システム障害などの経緯の紹介 | Outage | 経過 2018-03-19 | 経過 2018-03-26

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```


WRF(Weather Research and Forecasting Model)とその前処理であるWPS、およびWRFの後続処理のF***T関連。

WPSで使用する[NCEPデータの提供サイト](https://rda.ucar.edu/)がシステムトラブルによりデータ提供不可能になっている。

復旧には1週間程度かかりそうだ (2018年3月12日現在の情報)。

以下のサイトで状況の経緯が発表されるようだ。
http://ncarrda.blogspot.jp/

### Outage

> Extended RDA Service Outage March 12-16
https://www.merriam-webster.com/dictionary/outage
> 2a : a failure or interruption in use or functioning
> 2b : a period of interruption especially of electric current

Outageの意味として「計画的な停電」なのか「予期しない停電(機能不全)」なのかは未消化。

### 経過 2018-03-19

http://ncarrda.blogspot.jp/2018/03/globus-download-new-available-for.html

> Globus download now available for completed data requests and to attempt to transfer data archive files. Other RDA services remain offline.

通常のデータ取得はしばらく利用できなさそう。

> There is currently no ETA on when the data storage system will return to production.

### 経過 2018-03-26

2018-03-24にすべてのデータアクセスの機能は復旧されたようだ。

http://ncarrda.blogspot.jp/2018/03/3242018-all-rda-data-access-services.html

実際に、従来のデータ取得スクリプト(csh)を実行している限りでは障害前の状況に戻っているようではある。
PHPのfile関数を文字列でも使うにはdataストリームラッパーを使うと簡単

テキストファイルの内容を配列にしてくれるfile関数を文字列に対して使いたい場合は、dataストリームラッパーを経由すれば簡単。

```php5
<?php
$str = "あいうえお
abcde

12345
かきくけこ";

$arr = file("data://text/plain;base64," . base64_encode($str), FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
var_dump($arr);

/*
array(4) {
  [0]=>
  string(15) "あいうえお"
  [1]=>
  string(5) "abcde"
  [2]=>
  string(5) "12345"
  [3]=>
  string(15) "かきくけこ"
}
*/
プロジェクトのコーディングスタイルをIDEに自動適用する(EditorConfig)

開発者がそれぞれ異なるIDEを使用している開発プロジェクトで
効率的にコーディングスタイル(文字コード・改行コード・インデント幅等)を共有する方法として
[EditorConfig](http://editorconfig.org)を紹介します

以下のような内容の`.editorconfig`ファイルを
プロジェクトのディレクトリに配置することで
IDEでプロジェクトを開いた際に自動的にコーディングスタイルが設定されます


```ini:.editorconfigの例
root = true

# 基本設定
[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 4
tab_width = 4
trim_trailing_whitespace = true
insert_final_newline = true

# Markdownファイルは行末スペースを削除しない
[*.md]
trim_trailing_whitespace = false

# JavaScriptとJSONファイルはインデントをスペース2文字にする
[*.{js,json}]
indent_size = 2

# Makefileはタブでインデントする
[Makefile]
indent_style = tab
```

# 設定項目
`.editorconfig`ファイルはINIファイル形式です

- `root = true`  
  この指定がない場合、上位のディレクトリに遡って継承元とする`.editorconfig`を検索します
- `#`から行末まではコメントです
- `[]`で囲まれたセクション名  
  ルールを適用するファイル名のパターンを指定します  
  `[*]`であれば、すべてのファイルに  
  `[*.md]`であればMarkdownドキュメント（拡張子が`.md`)のファイルに  
  `[*.{js,json}]`であれば、JavaScript（拡張子が`.js`)とJSON（拡張子が`.json`)に適用されます
- `charset`  
  ファイルの文字コードを指定します
- `end_of_line`  
  改行コードを指定します
- `indent_style`  
  インデントに使用する文字`tab`または`space`を指定します
- `indent_size`  
  １インデントの幅を何文字分にするかを指定します
- `tab_width`  
  １タブの幅を何文字分にするかを指定します
- `trim_trailing_whitespace`  
  ファイル保存時に、各行末のスペース文字を自動削除する`true`か、しない`false`を指定します  
  上記の例では、Markdownファイル(*.md)のみ行末のスペースを削除しない設定になっています
- `trim_trailing_whitespace`  
  ファイル保存時に、ファイル末尾を改行文字にする`true`か、何もしない`false`を指定します

これ以外にも言語やIDE特有の設定項目があります
完全なリストは [EditorConfigのWiki](https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties)（英語）を参照してください

# 各種IDEの対応状況
## 初期状態で有効な(EditorConfigプラグインがインストールされている)もの

- IntelliJ IDEA
- PyCharm
- RubyMine
- WebStorm
など

## プラグインをインストールすると有効になるもの

- ATOM
- VisualStudio Code
- eclipse
- PhpStrom
など