OmniAICreator/Qiita-1.07M huggingface dataset:
MAと俺

<strong>MAとの出会い</Strong>
実際言うとMAとの出会いの前にCode For Japanの出会いがあります。
あれは確かCode For Americaの誰だったか忘れてしまいましたがその時のハングアウトでこれ面白いなぁという及川さんと関さんのトークに引き込まれもしCode For Japanができたら入ろうと思い動いたのが一番最初のハッカソンの出会いです。
MA9のCivicTechハッカソンがエイチームがルーセントタワーにあった時代に参加したのが一番最初です。

<strong>MAをどう知ったか</Strong>
Code For Japanです。
FacebookのCode For Japanグループ内で参加を募集しているときにやってみようかなぁと思い参加しました。
そのときには白松先生やいろんなメンバーと知り合うきっかけになりました。
関さんとも顔合わせをしCivicTechありきだなと思った瞬間でした。

<strong>MAに復活した理由</Strong>
復活する前にびっくりする出来事がありました。
MAのファシリデータの伴野さんが退社されるということを聞き会いたいと思ったこととそろそろプログラミングがしたいなぁというきっかけで復活することにしました。
なかなか楽しかったです。

<strong>シティーレンジャーがサービス化できなかったわけ</Strong>
シティーレンジャーのチームを作ったときも楽しみたいがために作りましたがサービス化がちらついた瞬間から何かが変わってしまっていました。
それは楽しみながらチーム活動ができないという苦しみにハマりました。
しかも仕事にも追われ活動できる人数が減っていったのが一番の困ったことでした。
俺自身これをサービス化したかったんですが。
仕事が繁忙期に突入してしまい作業も愚か自分の体力も奪われしかもバラクルードの副作用のせいでイライラと咽頭炎・頭痛・吐き気に微熱が出てる状況で続けていくことができませんでした。
それは何故かと言うとバラクルードは朝食の2時間後に飲む方法と夕食の2時間後に飲む方法と2つの方法があります。
それをことごとくひっくり返す方法を考えつき実行に移した事により肝臓に負荷をかけで実際に副作用を引き起こすことになり迷惑をかける事となりました。
そしてチームのみんなが仕事に追われることになり自分は迷惑をかけるわけには行かずシティーレンジャーチームを去ることにしました。

<strong>今後の展開</strong>
地図上にSNSを作り展開させたいなぁと思います。
これは実際言うとMA9の実際に作れなかったものを再度チャレンジしたいと思った次第です。
これができると地震などの災害時にクライシスマップ化ができるからです。
通常運用もできるようにしておきたいですね。
あとは仕事に活かせるアプリをこっそり作り提供したいなぁと思っています。

あと言えることは<strong>エンジョイハッキング</strong>です。
CloudAutomatorを（半年ほど）使ってみての感想

## CloudAutomatorを使ってみての感想

Yasと申します。
諸事情とか権力に負けたとかいろんなものの結果、今回投稿させていただくことになりました。
といいつつもCloudAutomatorに関係するような技術的なことは何も書けそうにないので、１インフラ担当的な視線からサーバーワークス様のCloudAutomatorを利用しての素直な感想を書かせていただこうと思います。
本記事について**2017年12月時点**でのものになりますのでご注意ください。



###１：導入してみてこれ便利＆よかった点
・要望に対する更新が早い
導入当初には「これ欲しいな」とか「これこうだったらいいのに」とかいくつかありましたが、要望→実現までがかなり早くいただけた気がします。
たまたまだったのかも知れませんが、導入要件で引っかかるようなことがあれば、素直にヘルプとかブログで要望を出すのもありかなーと勝手に思っております。

・サポートの回答が早い
導入前後や稼働中の困ったことでも、レスポンスよく回答＆対応いただけました。
たらい回しにされないのはよかったです。

・監査テンプレートが更新されてる
意外と気づきにくいのかもしれませんが、監視テンプレートのアップデートがしっかりされています。利用しっぱなしではなく適用状況も定期的に見直すとセキュリティ強化に繋がるのかな、と思います。

・タスク失敗が（ほぼ）ない
利用して半年以上経過しましたが、処理失敗したのは１度だけでした。しかもAMIのBackup後の削除だけが処理失敗したというところなので致命的なエラーは0です。稼働状態としてはとても優秀な認識です。


###２：これ直して欲しい＆微妙だった点
・初期設定が分かりづらかった（Policyとか）
最初期のアカウント追加時とかの設定がちょっと分かりづらかったです。やり方がダメだっただけかもしれませんが。
あと、仕様上IAMpolicyの設定が必要になるのですが、いつ時点のPolicyが最新なのか分かりづらいのでその点も修正いただけると助かるかなーと思います。紹介されてるPolicyもちょっと不備があったりするので一応中も確認した方が良いと思います。

・AWSConfigに設定されるBucket名（最初謎のBucketが見えてちょっとびっくり）
初期設定時にAWSConfigの保存先Bucketにサーバーワークス様のものが追加されます。
可能であればBucket名を事前に連携いただけるとかすると「謎Bucketにデータ送ってる！？」的なびっくりは防げるかな、と。

・監査テンプレ更新失敗するとサーバーワークス様に直してもらう必要がある。
こちらも現在の仕様上仕方ないそうですが、監視ポリシーの設定値を変更した後に保存が失敗する場合があります。
この場合、サーバーワークス様に修正いただくまではずっと「Updating」のままで、該当ポリシーは何もさわれなくなります。

・マルチユーザー化希望
起動・終了テンプレートがあるので複数アカウントを発行して特定の起動設定を変更できるようになると嬉しいなーと思ったり。


とはいいつつも、きっとサーバーワークス様のことなのでここに記載したような要望はささっと反映してくれる・・・はず。



総評として、とても便利なツールですよ！
どこかにいる誰かの一助になれば幸いです。
マニュアルの翻訳で訳の難しかったところ

Juliaの翻訳サイトに参加している内田です。
今回は、マニュアルの中で意味をとるのが難しかった箇所について書こうと思います。
英語版が
(https://docs.julialang.org/en/stable/)
で日本語版が
(https://hshindo.github.io/julia-doc-ja-v0.6/)
なので、読み比べるといいかもしれません。

2箇所は僕の担当外なので誤訳の指摘のようなもので、性格が悪い気もしますけど、
僕も長考の末の解釈なので、読んでもらえたらなあと思います。

1.　"整数と浮動小数点数"(Integers and Floating-Point Numbers)の2段落目の

>Julia provides a broad range of primitive numeric types, and a full complement of arithmetic and bitwise operators as well as standard mathematical functions are defined over them.

という一文です。意味の取りにくかったのは、"complement"という言葉です。
「補集合」とか「２の補数」という意味もあるので、そういう意味かとも思ったのですが、"full complement"という使い方で、「全体」という意味になるようです。
ほかにも"primitive numeric types"(原始的数値型)に対して使われる"broad"(幅広い)という言葉は、"いろんなビット数の"というニュアンスがあるような気がします。しかし、符号の有無や、整数・浮動小数点数をひっくるめて"様々な"くらいに訳していいような気がします。
文全体を訳してみると、
>Juliaには様々な原始数値型がありますが、それぞれに対して、算術演算子やビット演算子、さらに標準的な数学関数がすべて定義されています。

といった感じになると思います。
さらに段落を続けると

>それぞれの数値型に対応する演算子や関数がネイティブにコンパイルさて計算資源を最大限に活用できる一方、任意精度の数値型は利用できるものの、ハードウェア上効率的に処理できるわけではないので、演算は遅いです。

というように話が展開されていて、Juliaの演算がどうして速いのかという説明になっています。

2."Variables"(変数)の2段落目の一文で

>Julia provides an extremely flexible system for naming variables. Variable names are case-sensitive, and have no semantic meaning (that is, the language will not treat variables differently based on their names).

です。
とりあえず訳してみると

>Juliaでは非常に柔軟に変数に名前をつけることができます。変数名では、大文字と小文字は区別されますが、意味論的に無意味です。（つまり、この言語では、名前によって変数の扱い方が変わることはありません）

といったところでしょうか。「意味論的に無意味です。」という言葉の意味がなかなかわからなかったのですが、ヒントがこの章の最後の段落"Stylistic Conventions"(表記上の慣習)にありました。


>While Julia imposes few restrictions on valid names, it has become useful to adopt the following conventions:

>Juliaでは命名法にほとんど制限はありませんが、以下のような慣習に従ったほうがいいでしょう。

という、一文に続いて「変数名は小文字で表記する」とか「型やモジュールは大文字で始めて単語の区切りにキャメルケースを使う」といったことが書いています。

「意味論的に無意味です。」という言葉はこうした大文字・小文字の使い方は慣習であって制約ではないということを意味しているようです。Juliaでは識別子にUnicodeの各種の文字を使用できて、日本語をはじめ、大文字小文字のない文字もたくさんあるので、制約にすると、非常に不自由になるからだと思います。

3."Control Flow"(制御構造)の"Repeated Evaluation: Loops"(繰り返し処理：ループ)の最後のほうの一文

>Multiple nested for loops can be combined into a single outer loop, forming the cartesian product of its iterables:

>多重にネストしたforループは、結合して、イテラブルの直積に対する、一重の外側のループ にすることができます。

始めはこう訳したんですが、「一重の外側のループ」ってなんなんだ、気づくと意味がわからなくなりました。結局、訳注にも書いたんですが、「外側のループ」を「外側からのループ」と書き換えて、直積の右側を外側、左側を内側にみたてて、ループのカウンタの増え方が、外側から増えることを表しているんだと解釈しました。

以上、どうでしょうか。僕なりに悩んだ結果の解釈ですが、別の解釈があれば、コメントをお願いします。
LoRaWANのフレームフォーマット

エヌシーアイ総合システムのtaguchyです。
普段は主にBtoCのWEBシステムや、BtoB向けWEB APIの開発などをしていて、最近はIoT関連でもお仕事させていただいています。

今回はLPWA「LoRaWAN」のフレームフォーマットを自分用のメモも兼ねて記載します。

## フレームフォーマット
### 全体
LoRaWANのフレームフォーマットは以下のようなフィールド構成となっています。

|Preamble|PHDR|PHDR_CRC|PHYPayload|CRC|
|:--------:|:----:|:--------:|:----------:|:---:|

* Preamble：同期用ビット
* PHDR：物理ヘッダ
* PHDR_CRC：物理ヘッダ整合性チェック用ビット
* PHYPayload：実データ
* CRC：整合性チェック用ビット(Uplink時のみ設定)

TCP/IPでも良く聞くようなフィールドが設定されていますね。
### PHYPayload

PHYPayloadは以下のように分割できます。

|MHDR|MACPayload|MIC|
|:----:|:---------:|:---:|
|1 byte|1~N byte|4 byte|

|MHDR|Join-Request|MIC|
|:----:|:---------:|:---:|
|1 byte|18 byte|4 byte|

|MHDR|Join-Response|MIC|
|:----:|:---------:|:---:|
|1 byte|12~28 byte|4 byte|

* MHDR：MACヘッダ
* MACPayload or Join-Request or Join-Response：デバイスとサーバー間の通信に使用される領域
* MIC：整合性チェック用ビット

"MACPayload or Join-Request or Join-Response"はデバイスとサーバー間の通信に使用される領域になります。
"MHDR"の頭3bit(MType)の値によって以下のメッセージタイプに識別され、そのタイプによってデータサイズや用途が異なります。

|MType|メッセージタイプ|備考|
|:-----:|:---------:|:--:|
|000|Join Request|OTAAでのJOIN要求|
|001|Join Accept|OTAAでのJOIN許可|
|010|Unconfirmed Data Up|デバイスからのデータ送信(送達確認無し)|
|011|Unconfirmed Data Down|デバイスへのデータ送信(送達確認無し)|
|100|Confirmed Data Up|デバイスからのデータ送信(送達確認有り)|
|101|Confirmed Data Down|デバイスからのデータ送信(送達確認有り)|
|110|RFU|未使用（将来のための予約値）|
|111|Proprietary|独自メッセージフォーマット|

### MHDR
MHDRは以下のように分割できます。

|MType|RFU|Major|
|:----:|:---:|:-----:|
|3 bit|3 bit|2 bit|

* MType：メッセージタイプ(前述)
* RFU：予備値
* Major：メジャーバージョン

Majorの値によってエンコードの有無などが決まるそうです。
※詳しい方がいましたらご教授いただきたいです。

### MACPayload

MACPayloadは以下のように分割できます。

|FHDR|FPort|FRMPayload|
|:----:|:----:|:----------:|
|7~22 byte|0~1 byte|0~N byte|

* FHDR：FRAMEヘッダ
* FPort：ポートフィールド
* FRMPayload：アプリケーション（センサー）固有メッセージ

FPortの値は0~224になっており、
0はFRMPayloadの値がMACコマンドのみであることを示します。
1~223はアプリケーション固有の値、
224はMACレイヤーテスト用に予約された値です。

### FHDR
FHDRは以下のように分割できます。

|DevAddr|FCtrl|FCnt|FOpts|
|:-------:|:-----:|:---:|:-----:|
|4 byte|1 byte|2 byte|0~15 byte|

* DevAddr：LoRaネットワーク上のデバイスを一意に識別する値
* FCtrl：フレームコントロール値
* FCnt：送信カウンタ
* FOpts:オプション

FCtrlの内容はUplink時、Downlink時で変わります。



<記載途中>
随時追記していきます。

# 参考
- http://wiki.lahoud.fr/lib/exe/fetch.php?media=lorawan102-20161012_1398_1.pdf
- http://www.rfwireless-world.com/Tutorials/LoRa-tutorial.html
ページ読み込み種類の判別(リロード、ブラウザバック等)

[Navigation Timing API](https://developer.mozilla.org/ja/docs/Web/API/Navigation_timing_API) を使用して判別

>window.performance.navigation オブジェクトは 2 個の属性を格納しており、
ページの読み込みが何によって起こされたか (リダイレクト、戻る・進むボタン、通常の URL 読み込み) を知るために使用します。


```js
if (window.performance.navigation.type === 0/* TYPE_NAVIGATE */) {
  // 初期表示
} else if (window.performance.navigation.type === 1/* TYPE_RELOAD */) {
  // リロード
} else if (window.performance.navigation.type === 2/* TYPE_BACK_FORWARD */) {
  // 履歴から遷移
} else {
  // その他
}
```

[サンプル](https://bl.ocks.org/t4y3/raw/32b46576d3c42a5207b1f5b564d2d704/)
Visual Studio | WPF > フォルダをエクスプローラで開く

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

[c++ builder > デバッグ > 処理対象フォルダの表示 > ShellExecute(NULL, NULL, L"explorer.exe", dstDir, NULL, SW_SHOWNORMAL);](https://qiita.com/7of9/items/9e9cc286dde012bedfde)
をVisual Studio + WPFでどう実装するか。

参考: [外部アプリケーションを起動する、ファイルを関連付けられたソフトで開く](https://dobon.net/vb/dotnet/process/shell.html) @ DOBON.NETプログラミング道

ShellExecute()の代わりにSystem.Diagnostics.Process.Start()をコールする方法を使ってみる。

@-quoted形式を使うが、二重引用符の数は不要と思われる分は減らした。
[Visual Studio | WPF > C# > string > @ > @-quoted 形式 > Pythonのraw stringに相当?](https://qiita.com/7of9/items/27eea3c4851539ba1701)

### code

```MainWindow.xaml
<Window x:Class="_171211_t1950_openFolder.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_171211_t1950_openFolder"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Name="B_open" Content="Open" Height="30" Click="B_open_Click"/>
    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _171211_t1950_openFolder
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void B_open_Click(object sender, RoutedEventArgs e)
        {
            System.Diagnostics.Process.Start("explorer.exe", @"C:\Windows");
        }
    }
}
```

### 実行

ボタンを押すことでC:\Windowsが開くことを確認した。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/83ae9593-ffed-aa22-7a49-4a27b7fd01c7.png)
javascriptでテストを行うときのツールとその説明

## テストの種類
javascriptでテストを行うとき、テストの種類は大きく分けて2つに分かれます。
「単体テスト」と「結合テスト」です。

## 単体テストとは
「単体テスト」とはメソッドや関数、モジュールなどの小さい単位を対象にして、その中身の構造やデータの受け渡しが意図した通りになっているかを検証するテスト。
※javascriptのコードチェックを行う。

## 結合テストとは
「結合テスト」とはそれぞれのモジュールを組み合わせて一連の流れを検証するテスト。「シナリオテスト」とも言われます。
※ブラウザを立ち上げてQAテスト項目を確認する

## 単体テストのツール

単体テストを行うときに使う主なツールはこちら

- QUnit
- Jasmine
- Mocha
- Jest

このなかで最新のテストツールが「Jest」になります。
また「Jest」は「React」を用いたアプリケーションのテストも行えるので、今後「単体テスト」を行うなら「Jest」導入を推します。

###「Jasmine」「Mocha」「Jest」のテストコードの基本的な書き方は似ています。

``` javascript:テストコード
describe('', () => {
　beforeAll(() => {
    // 一回だけ呼ばれる事前処理
  });
 
  afterAll(() => {
    // 一回だけ呼ばれる事後処理
  });
 
  beforeEach(() => {
    // itごとに毎回呼ばれる事前処理
  });
 
  afterEach(() => {
    // itごとに毎回呼ばれる事後処理
  });
  
  it('', () => {
    // テストの内容
  });
 
  it('', () => {
    // テストの内容
  });
});
```

上記を実行したときの処理の順番

```
beforeAll
beforeEach
afterEach
beforeEach
afterEach
afterAll
```

### Jestを導入するには

Jestを使うにはnpmインストールする必要があります。

``` command:jestをinstall
$ npm init
$ npm i jest -D
$ export PATH=$PATH:./node_modules/.bin   // パスを通す
$ jest --version    
```

``` javascript:sum.js
function sum(a, b) {
  return a + b;
}
module.exports = sum;
```

``` javascript:sum.test.js
const sum = require('./sum');

test('引数の値を足したときの値を確認', () => {
  expect(sum(1, 2)).toBe(3);
});
```

※テストコードを書くファイルの拡張子は「test.js」にする必要があります。
テストを実行したときにjestがその拡張子のファイルを探しにいくためです。

package.jsonの中身を書き換え

``` javascript:package.json
"scripts": {
  "test": "jest"
}
```

``` command:テスト実行
$ npm test
```

``` command:実行結果
PASS  ./sum.test.js
  ✓ 引数の値の合計をテスト (3ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.503s, estimated 1s
Ran all test suites.
```


## 結合テストのツール

結合テストを行うときに使う主なツールはこちら

- Zombie.js
- PhantomJS
- Selenium
- TestCafe

このなかで最新のツール(フレームワーク)である「TestCafe」導入を推します。
その理由としては、

- TestCafeでは各ブラウザのWebdriverを設定する必要がない
- Node.jsをインストールしてない環境でもTestCafeでテスト結果を見ることができる。
- ES6でテストコードを記述できる

### TestCafe導入するには

TestCafeを使うにはnpmインストールする必要があります。

``` command:TestCafeをinstall
$ npm init
$ npm i testcafe -D
$ export PATH=$PATH:./node_modules/.bin   // パスを通す
$ testcafe -v    
```

### TestCafeのコード例

``` javascript:TestCafeのテストコード
// import 文
// 変数・定数等の宣言

fixture('テスト内容の分類やページのタイトル等')
  .page('テストするページのURL');

test('テスト項目名その1', async t => {
  // テスト記入
});

test('テスト項目名その2', async t => {
  // テスト記入
});

test('テスト項目名その3', async t => {
  // テスト記入
});

```

``` command:テスト実行
testcafe chrome ./test.js
```

## 参考サイト

- [Facebook製のJavaScriptテストツール「Jest」の逆引き使用例](https://qiita.com/chimame/items/e97883fd46b67529d59f)
- [【翻訳】Jestの使い方](https://qiita.com/moriaki3193/items/bc1120d572d55038d2d0)
- [JavaScript開発のためのテスト入門](https://app.codegrid.net/series/js-test)
- [TestCafe入門](https://app.codegrid.net/series/2017-testcafe)
Visual Studio | WPF > C# > string > @ > @-quoted 形式 > Pythonのraw stringに相当? | link: C++のRaw String Literal | link: bashの"--"

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

https://dobon.net/vb/dotnet/process/shell.html

> //コマンドライン引数に「"C:\test\1.txt"」を指定してメモ帳を起動する
System.Diagnostics.Process.Start("notepad.exe", @"""C:\test\1.txt""");


上記記載の中で「@」というのを知らなかった。

[C# の string では「@(アットマーク)」の意味を知っていると便利](http://blog.dreamhive.co.jp/yama/1149.html) @ ゆめとちぼーとげんじつと
> で、「@」を利用すると次の様に書くことができ、エスケープを行わずに「/」を文字列に含められるので、パスを指定したい場合などに可読性が高く、便利に使えます。


公式のドキュメントは以下だろうか。
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/string
> リテラル文字列は string 型であり、二重引用符で囲む形式と、@-quoted 形式の 2 とおりがあります。

公式のドキュメント(英語版)
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/string
> String literals are of type string and can be written in two forms, quoted and @-quoted.

最初に掲載のリンクのコードは二重引用符の数が多いように思う。
(二重引用符を前後に足した文字列を渡すようになっている)。
以下のコードで動作することを確認している。

```csharp
System.Diagnostics.Process.Start("notepad.exe", @"C:\test\1.txt");
```

### Python > raw strings

Pythonのraw stringsが近いだろうか。

https://docs.python.jp/3/reference/lexical_analysis.html
> 文字列リテラルとバイト列リテラルの両方は、任意で文字 'r' または 'R' をプレフィックスに持つことができます; そのような文字列は raw strings と呼ばれ、バックスラッシュをリテラル文字として扱います。

### Bash > "--"
(追記 2018/01/12)

@tukiyo3 さんの記事: [昨日〜9日前までの日付を空白区切りで返すサンプル](https://qiita.com/tukiyo3/items/97ec3dc0920e5c6a0470)
において、
@nakataSyunsuke さんと@tukiyo3 さんにbashの"--"について教えていただきました。

情報感謝です。
VisualStudio2015の不具合でDataGridViewの列追加画面が化けた時は一時的に言語パックを英語にすればいいよ


![image.png](https://qiita-image-store.s3.amazonaws.com/0/29454/cf95f5ef-b48c-8721-266c-4095ad896e87.png)

**バグってる！**

ぐぐった
========

* [DataGridViewタスクの「列の追加」の画面崩れ](https://social.msdn.microsoft.com/Forums/security/ja-JP/16f031c8-749e-4bcb-8abd-6b6a64146555/datagridview?forum=csharpgeneralja)

MSDN の記事はすぐ行方不明になるので、要点を整理すると

* 日本語の言語パックが壊れているらしい
* 英語の言語パックを導入してから、英語の状態で列を追加すればよい

最新のサービスパックで直っているかもしれないけど、念のため

手順
====

1. 英語の言語パックのダウンロード
   * VisualStudioのメニューの「ツール」→「オプション」→「環境」→「国際対応の設定」→「追加の言語を取得する」で、ブラウザでダウンロード画面が出る。
   * ダウンロードした vs_langpack.exe を実行する
2. 英語環境にする
   * 「ツール」→「オプション」→「環境」→「国際対応の設定」→「English」
   * VisualStudio を再起動

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29454/68073aa6-78e6-99e4-6106-72123360919f.png)

バッチリだぜ！
Tabulatorを使った見やすい表形式のWebアプリの作成

#1.概要
HTML5の表を簡単に作成できるJSライブラリーには様々なものがあるが、jQueryのプラグインにTabulatorがある。Tabulatorは簡単なHTML上の表の定義と、数行のJavaScriptの実行コードで、魅力的な(かつ定義によっては、編集可能やインタラクティブな）表を表示することが可能である。

http://tabulator.info/

この記事では最初に書くサンプルとコードを紹介する。

#2.導入方法
Bowerやnpmなど環境に適したTabulatorを導入する。
　　・bower install tabulator --save
　　・npm install jquery.tabulator --save

HTML上で必要となるライブラリーをインクルードする、jQueryやTabulator自身およびTabulatorのCSSなどのライブラリーが対象

```html
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery-ui.min.js"></script>
<link href="dist/css/tabulator.min.css" rel="stylesheet">
<script type="text/javascript" src="dist/js/tabulator.min.js"></script>
```
#3.記述方法
##HTML
HTML上では、divで表を表示する領域を定義するのみ。

```html
<div id="tabulator-example"></div>
```
##JavaScript
JavaScriptでは、まず表の定義を.tabulatorで実行する。
レイアウトやページネーションの有無、カラムの移動可否、初期ソートなどの表の属性の定義に続いて、columnsで表のタイトルや列に入れるフィールド、列幅、フォーマッターなどを指定する。

```JavaScript
$("#tabulator-example").tabulator({
	layout:"fitColumns",
	tooltips:true,
	addRowPos:"top",
	history:true,
	pagination:"local",
	paginationSize:7,
	movableColumns:true,
	initialSort:[
		{column:"name", dir:"asc"},
	],
	columns:[
		{title:"Name", field:"name", editor:"input"},
		{title:"Task Progress", field:"progress", align:"left", formatter:"progress", editor:true},
		{title:"Activity", field:"activity", width:160, formatter:lineFormatter, headerSort:false},
		{title:"Gender", field:"gender", width:90, editor:genderEditor},
		{title:"Rating", field:"rating", formatter:"star", align:"center", width:100, editor:true},
		{title:"Color", field:"col", width:130, editor:"input"},
		{title:"Date Of Birth", field:"dob", width:130, sorter:"date", align:"center"},
		{title:"Car", field:"car", width:80,  align:"center", formatter:"tickCross", sorter:"boolean", editor:true},
	],
});
```

#4.完成した表
以下のようなビジュアルで多機能な表が上記の少量のコードで生成される。
<img width="1158" alt="スクリーンショット 2017-12-11 19.45.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/172568/54008482-ea78-e6c1-039d-247478f88464.png">
一瞬でGoのコンパイルを3倍速くするコマンドがこちらです

go runやgo build した時のコンパイル時間は、プロジェクトが大きくなるにつれて長くなるもの。コンパイルで待たされると、開発効率だけでなく、やる気も落ちてしまいますよね。


そんなときに、以下のコマンドをGoのプロジェクトルートで打ってみてください。
一瞬で**3倍**ぐらい高速化できるはずです。

```shell-session
rm -rf $GOPATH/pkg
go build -i <コンパイル対象.go>
```

DONE!
※ rm 打つ前に、`$GOPATH` を正しく設定しているかどうかは事前に確認ください ※



# なんで速くなるの？

Goでは、以前にコンパイルしたときの中間ファイルが `$GOPATH/pkg` 以下に保存されます。中間ファイルがあれば、コンパイル時にそれが再利用されるので速いわけです。ただし、Go自体のバージョンや、ライブラリのバージョンが異なる場合には、再度中間ファイルを生成します。これはCPUをブンブン回すので重い。しかも、再度作られた中間ファイルはなぜか保存されず、古い中間ファイルは消えないらしいんですね。これが、ビルドが毎回重くなる原因です。

上のコマンドを打つことで古いキャッシュを消して、バージョンの差異が無い中間ファイルを再生するので、ビルドが速くなるというわけですね！

# 参考
https://ttboj.wordpress.com/2017/02/26/faster-golang-builds/
GCP Cloud Shell 上から Ansibleを利用する


使い始めたばかりで `Cloud Shell`事がまだ理解できていないかもしれませんので誤りがあるかもしれません。

# やりたいこと

* Cloud Shell上でAnsibleの環境を作る

Home Directoryが5GByteあり永続的に利用できるとのことなので全てのモジュールがローカルにインストールできればずっと使えるだろうという安直な考え

* https://cloud.google.com/shell/docs/?hl=ja



# 導入

## pyenvの導入

```
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
```

ファイルの作成

.bash_profileを以下の内容で作成します。

```~/.bash_profile:
export PATH="/home/bmxlesson/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```

## pythonの導入

```
pyenv install 2.7.14
pyenv global 2.7.14
python --version
```
 
* 途中で `The Python bz2 extension was not compiled. Missing the bzip2 lib?` というエラーがでますが今回は気にしないでおいておきます。

## Ansibleの導入

```
pip install ansible
```

結果ホームディレクトリ以下に導入されました。

```
$ ansible --version
ansible 2.4.2.0
  config file = None
  configured module search path = [u'/home/bmxlesson/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /home/bmxlesson/.pyenv/versions/2.7.14/lib/python2.7/site-packages/ansible
  executable location = /home/bmxlesson/.pyenv/versions/2.7.14/bin/ansible
  python version = 2.7.14 (default, Dec 11 2017, 16:55:06) [GCC 4.9.2]
```


# Ansibleの利用

AnsibleからGCPを使うことを調べてみるとInventoryと操作とどちらも出来るようですね。次回試してみたいと思います。

* http://docs.ansible.com/ansible/latest/guide_gce.html


ここでは ping をまず試してみます。暫定的にエフェメラルIPを直接書いています。きちんとするならInventoryを利用するのが正しいのだと思いますが動作確認なので

~/ansible/inventory/hosts

```
35.227.19.xxx ansible_ssh_private_key_file=/home/bmxlesson/.ssh/google_compute_engine
```

で実行してみます。

```
$ ansible -i ansible/inventory/hosts all -m ping
35.227.19.xxx | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
```

という感じで起動したので一応動いている模様です。Cloud Shellでは自動的にVMインスタンスに接続するためのSSH鍵が自動的に作られているようなのでこれで接続は出来ます。この辺は楽ですね。実際の運用において楽がいいことかはケースバイケースですが今は楽で便利です。


次の記事
* [AnsibleでGCP のVMインスタンスを操作する](https://qiita.com/tokida/items/bd0175d5ebaf4efb558c)
LISP x vMotion


# LISPを使った

### LISPの基本的な用語を確認
[LISPの基本 その１:概要](https://supportforums.cisco.com/t5/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%83%81%E3%83%A3-%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/lisp%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%81%9D%E3%81%AE%EF%BC%91-%E6%A6%82%E8%A6%81/ta-p/3163660)

### 基本を確認した上でWhite　Paperを確認

[Locator ID Separation Protocol (LISP) VM Mobility Solution White Paper](
https://www.cisco.com/c/dam/en/us/products/collateral/ios-nx-os-software/locator-id-separation-protocol-lisp/lisp-vm_mobility_wp.pdf)

 - LISPの利点はデバイスIDとロケーションのName　spaceが分離されている点である。
 - つまり、一度アサインしたIPアドレスそのまま場所に縛られることなくMobillityを担保できる。
 
### 参考：

[Locator/ID Separation Protocol (lisp)](https://datatracker.ietf.org/wg/lisp/about/)

*** 編集中 ***
StrongParameterって何？？

#RailsのStrong Parameterって何？

##経緯
後輩に聞かれたので自分の復習も兼ねて記事にまとめてみたいと思います。

##Strong Parameter ??
strong_parametersとは簡単に言うとRailsに備わっているパラメーターとして受け取る値を制限する仕組みのことです。

##Strong Parameter使わないとどうなるの？？
例えば、次のようなアプリケーションを考えてみてください。

```hoges_controller.rb
class HogesController < ApplicationController
  def create
    @hoge = Hoge.new(params)
    @hoge.save
  end
end
```
hogeモデルの中身

```create_hoge.rb
class CreateHoge < ActiveRecord::Migration
  def change
    create_table :hoges do |t|
      t.string :hoge

      t.timestamps
    end
  end
end
```

このようなJSON APIを作るとします
このときフロントエンドからは次のようなjsonが帰ってくるとします。

```response.json
{
  "hoge": {
    "id": 2,
    "hoge": "hogehoge"
  }
}
```
このときhoges_controllerではどのような処理がなされるでしょうか？

paramsの中身は

```params.rb
{ hoge: {id: 2, hoge: "hogehoge"} }
```

になります

しかし、このときid(primaryKey)を指定されているためdbに保存するときにidが2のレコードがあるとidが重複したレコードができてしまいます。
また、updateのときidを加えてしまうとdbに保存されている違うhogeの中身を書き換えることも可能となってしまいます。

##何が問題なの？？
先程のupdateで考えて見ましょう。
webアプリケーションでのユーザーを考えて見てください。

Userをupdateするときに  

```users_controller.rb
def update
  @user = user.find(params[:id])
  @user.update(params)
end
```
としてしまうとjsonでidを指定してしまえば他のユーザーのパスワードや名前の書き換えが可能となってしまいます。

##どうすればいい？？
<b>Strong Parameters</b>を使いましょう！！　
例えば上記のhoges_controllerを次のように変更すれば、、、

```hoges_controller.rb
class HogesController < ApplicationController
  def create
    @hoge = Hoge.new(hoge_params)
    @hoge.save
  end
  
  def hoge_params
    params.require(:hoge).permit(:hoge)
  end
end
```

paramsの中身で:hoge意外の要素を弾くことができます。
こうすることによって外部のユーザーがjsonを送ることによってDBのレコードが変更されることを防ぐことができるのです。

以上！

恐らく多々勘違いしている部分があると思いますが、あればご指摘して頂ければ幸いです。
Azure App Services が短時間に続けて 500 エラーを吐いた時に自動的に Worker Process をリサイクルする設定を行う手順

#はじめに
Web アプリケーションを運用している時に、作成したアプリケーションコードのエラーハンドリング不足などの原因で、Web サーバーが 500 エラーを立て続けに吐くことがあるけれど、Web サーバーや　Worker Process を再起動するとなぜか直る、という様なシチュエーションに陥ることが、たまにあるかと思います。そういった場合、正攻法としてはアプリケーションコードの該当部分を修正するのがベストなのですが、取り急ぎの対応策として、エラーが発生したらとりあえずサーバーを再起動する、という場当たり的対応策を人力で取られた方も多いのではないでしょうか。

Azure App Services には、そういったシチュエーションで、事前に設定した閾値を超えた場合に自動的に Worker Process を再起動 (Recycle) するための仕組み (Auto Healing / 自動復旧) が用意されています。

この記事では、Azure App Services の自動復旧機能の構成方法について、ご紹介します。

#Auto Healing の設定手順
_※今回ご紹介する Auto Healing 機能は現在 Preview (Beta) 版での提供です。従って、SLA 的な保証は無しなのですが、この点ご理解いただいたうえでご活用いただければと！_
1. まずは、設定を行いたい App Service を Azure ポータルにて開きます。
2. メニューから「問題の診断と解決」を開きます。
<img width="150" alt="0001.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/199379/9346cb68-fea9-b452-2792-3ab8a46746e1.jpeg">
3. 開いたブレードの右ペインから "Mitigate" を探してクリックします。
<img width="465" alt="0002.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/199379/dc653cae-5cb5-bbd4-3f4c-39d9d0f5ea20.jpeg">
4. 新しいブラウザータブが開き "Azure App Service Support" というページが開きます。
5. 開いたページ中段の "Mitigate" タブを開きます。
<img width="691" alt="0004.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/199379/04eafb8d-33d7-ea07-4f83-5d649b18d5fd.jpeg">
6. 画面中央にある "Autoheal" スライダーを "ON" に切り替えます。
<img width="691" alt="0005.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/199379/ead61740-c95a-433d-c0f1-78662be863a4.jpeg">
7. すると、ルール設定用の UI がアクティベートされます。
8. 画面下部のタブから、"Status Code" を選択し、その後画面下部中央にある "Add new rule" ボタンをクリックします。
9. ルール追加用の UI がポップアップしますので、必要な設定項目を入力し、画面下部の "Add" ボタンをクリックします。
<img width="449" alt="0006.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/199379/4296d013-cbc8-cac3-ca5f-f21792b43f44.jpeg">
例えば、このスクリーンショットの例では、「500 エラーが 30 秒間に 10 回発生したら」という条件を設定しています。
10. 次に、画面右端の "Action" ボタンをクリックし、条件を満たした場合に取るアクションを選択します。
<img width="695" alt="007.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/199379/c3ebfdaa-30af-82a1-1a6e-de537e642577.jpeg">
11. 今回は、Worker Process のリサイクルを行いたいので、画面下部のドロップダウンから "Recycle" を選択します。
<img width="683" alt="0008.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/199379/933fe4b6-ec2f-d274-4907-7ed883d77748.jpeg">
12. 最後に、"Update" ボタンをクリックして、設定反映完了です。
<img width="683" alt="0009.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/199379/f76ef023-8a13-5e73-2409-8000b2b10068.jpeg">
13. 設定が完了すると、このようなポップアップが表示されます。
<img width="450" alt="0010.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/199379/319c8933-0bea-3634-a12b-ee1ab3fecfe5.jpeg">

#Auto Healing が動作したことをイベントログにて確認する
Auto Healing 機能を設定した "Azure App Service Support" の画面の、"Analyze" タブ中、"Event Viewer" 機能から、イベントログの確認が可能です。
<img width="682" alt="0011.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/199379/38d92c94-7f26-a9ee-c315-c53a1253b273.jpeg">

イベント ID "2299" のイベントを確認することで、Worker Process がリサイクルされたことと、その理由を確認できます。
<img width="673" alt="0012.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/199379/c0fbc7fd-3745-9ca3-8da5-c4d89f834645.jpeg">

#まとめ
Preview 機能ということで、保証こそないものの、アプリケーションの実際の稼働には影響の薄い部分かつ、万が一のトラブル時に人をはりつけておかなくてもとりあえずの復旧は出来る機能であることから、うまく活用することで省エネ運用ができるのではないでしょうか？

是非、お試しくださいませ！
wedding photography uae

Camera is the third eye of a man and photography is the vision of that eye. Every Photography relates a story. It is nature of in like way it is a minute innovative craftsmanship. The key area of a gainful picture taker is the actuate game-plan making limit. He ought to find the greatest moment for camera click. A not too awful photography is the unavoidable aftereffect of good insight and awesome separate of including. Wedding photography and videography format an essential bit of the wedding pack these days. Other than live spilling weddings through electronic structures affiliation media, another case is the 360-degree videography utilizing exceptional cameras. A trailer video of the wedding, a short video on wedding highlights and helicams are other than request in this days.pre-and post-wedding photograph shoots that are changed over into wedding films are a daze. <a href="http://abudhabiphotography.com/photography/wedding/">wedding photography abu dhabi</a> These days specific modifying close to imaginativeness is enter in photography. Mechanically photography has a beast change on most recent couple of years. Changing has a standard part in current photography. Programming like Photoshop, adobe light room and so on are the everything considered utilized developing programming. In like way the particular sections of robotized camera is refreshing especially asked? Another central point for the achievement of a photograph taker is his experience. Experience makes a photograph taker more imaginative, minute and similarly influence his thing ie, to photograph or video, more splendid. <a href="http://abudhabiphotography.com/uae/wedding-photography/">wedding photography uae</a>
ちょっと癖のあるWebBrowserコントロールで、HTML文字列を直接かつ繰り返し反映させるTips

#はじめに
.NET Framework (Windows.Forms) のコントロールのひとつである [WebBrowserコントロール](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser.aspx) は、[Navigate メソッド](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser.navigate.aspx) を呼び出したりすることで、Windowsフォーム上に手軽にWebページを表示させることができる便利なものです。

[DocumentTextプロパティ](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser.documenttext.aspx)にHTML文字列を指定すると、コンテンツ（ファイル）を外部へ用意せずに直接表示させることもできますが、ブラウザ表示に反映されるのが基本的に1回限りです（[Navigateメソッド](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser.navigate.aspx) を呼ぶとまた利用できる？）

#対策
DOM アクセス ([Documentプロパティ](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser.document.aspx)) で、[Body要素](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmldocument.body.aspx) の [InnerHtmlプロパティ](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmlelement.innerhtml.aspx) に書き込みます。

```C#
            if ((webBrowser1.Document != null) && (webBrowser1.Document.Body != null))
                webBrowser1.Document.Body.InnerHtml = "<p>THE 2ND DOCUMENT.</p>";
```

この方法であれば、任意のタイミングでHTML文字列を指定して、何度でも表示に反映させることができます。

#さいごに
ざっと調べた内容のため、補足等随時掲載します。
ほかにもっと簡単な方法がありましたら、教えていただけると嬉しいです。
ionicのCIツールにBuddyBuildを採用した

*この記事は [Ionic Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ionic) の記事です。*

# はじめに
昨日のスプラトゥーンのフェス、アウターが勝ちましたね。実はフェスで初めて勝つことが出来ました。
[eee_nbnb](https://twitter.com/eee_nbnb)です。
普段はフロントエンジニアとしてJavascriptを中心に開発しています。
今日はタイトルにもある通りCIツールであるBuddyBuildについてお話ししたいと思います。

# CIツール
IonicをビルドできるCIツールは主に

* [CircleCI](https://circleci.com/)
* [Bitrise](https://www.bitrise.io/)
* [Buddybuild](https://www.buddybuild.com/)

などがあると思います。
「CircleCIのMacOSのイメージ使うの高いし、Bitriseはよくわからん」、なんて人間はマジでBuddyBuildおすすめします。

公式でIonicのiOSのビルドに対応しています。（多分Androidも行ける。未検証。）

# Buddybuild
まずは料金の方を見ていきましょう。
https://www.buddybuild.com/pricing

ビジネスプランと個人向けのプランがあります。
主な違いは「iOSのEnterpriseのビルドができる」とかだと思います。多分。

私は個人向けのFreeプランで使っていますが、Githubと連携してcommitがpushされたタイミングでBuildがキューイングされてマシンに空きができるまで待機してくれます。

私は使ってないですがBuddyBuildのSDKを入れてクラッシュレポートなんかも送信できるっぽいですよ。

導入方法も公式のドキュメントに書いてあります。
https://docs.buddybuild.com/builds/frameworks/cordova-ionic/ 

適当にGithubのリポジトリを選んでポチポチしてたらビルドできるようになってましたが…。

# 最後に
時間があまりなく投げやりな記事になってしまいましたが許してください、なんでもしますから。
Gitでよく使うコマンドのまとめ

###git管理を始める
```git init```
まずはコミットが必要
```git add .```
```git commit -m "First commit."```
###変更の削除					
```git checkout .```
###リモートブランチを最新にする	
```git fetch```											
###リモートブランチを確認
```git branch -a```	
###ローカルとリモートの差分を表示（簡易）					
```git diff --name-status remotes/origin/master	```
###ローカルとリモートの差分を表示
```git diff remotes/origin/master```
###特定のファイルの差分を表示
```git diff ブランチA..ブランチB -- 対象のファイルパス```	
###現在checkoutしているローカルブランチにマージする。					
```git pull```											
###ブランチを表示	
```git branch```
###ブランチを作成											
```git branch <branchname>```
###ブランチを削除							
```git branch -d <branchname>```
###ブランチを移動							
```git checkout <branchname>```
###commit履歴を確認						
```git log```
###ブランチ名の変更								
```git branch -m <古いブランチ名> <新しいブランチ名>```
###今開いているブランチ名の変更
```git branch -m <新しいブランチ名>```
###developにマージ	
```git checkout develop```
```git merge <branchname>```								
-conflictがあれば修正-
####再度コミットしてマージ完了
```git add .```
```git commit -m "fix-conflict"	```
###リモートに新しいブランチを反映
```git push origin <branchname>:<branchname>```
###リモートブランチにプッシュ
```git push```
###リモートブランチの削除								
```git push --delete origin <branchname>```
###commit前の変更を退避
```git stash```	
###退避しているリストを表示										
```git stash list```
###stashの復活									
```git stash apply stash@{0}```	
###最新のスタッシュを反映し削除						
```git stash pop```
###stashの削除										
```git stash drop stash@{N}```
corporate learning management system

 Now a days ,we like Study new technology. We provide corporative online training. The online triaging is more useful for students. The benefits of online training are a we can study anywhere <a href="https://www.learngage.com/">corporate learning management system</a> and anytime. The other advantage of online training is we can study with our job. That is more useful. If we don’t like our current job, then we study with our current job, and then change our jobs. We provide evening batch, Sunday batch etc.the our service specialties’ are the training atmosphere is very good. The well knowledge faculties also provide individual training. We also provide video tutorial for our students’ .also provide answer booklet for students. It will improve the student knowledge. We provide online and offline classes for students. We also provide practical section for the students. <a href="https://www.learngage.com/Administrate-Learning.html">corporate learning management system</a> The practical section includes offline and online section. Each batch include 15-20 students, so the teacher can concentrate all the students. We provide trainings with low rate and give more knowledge for students.we have lot of clients,they include,google,yahoo,wipro etc.the our traing and placement department are helpful for students for there jobs
react-selectを使ってサジェスト機能を実装する

この記事は、株式会社ACCESS Advent Calendar 2017の13日目の記事です。

---

選択項目がたくさんあるなかでデータを絞り込んだり、入力の手間を減らしたい場合、サジェスト(オートコンプリート）を使うのが便利です。

今回はそれなりにactiveなreact-selectを紹介します

# react-selectを追加する

```
npm i --save react-select
```

# componentに組み込む

react-selectをcomponentに組み込みます
styleが設定されておりcssを読み込まないとレイアウトが崩れ、うまく動作しません
importを忘れないようにします

```js
import Select from 'react-select';
import 'react-select/dist/react-select.css';
```

react-selectではoptionsに渡したパラメータの中から条件に合うものをフィルターして表示することができます
optionsはvalueとlabelを持ったObjectの配列です

この例ではBと入力したときにBrowserとBEに絞り込まれます

```js
    const options = [
      { value: 'nfb', label: 'NetFront Browser' },
      { value: 'nfnx', label: 'NetFront NX' },
      { value: 'nfbe', label: 'NetFront BE' },
    ];
```

![select1.gif](https://qiita-image-store.s3.amazonaws.com/0/47343/a0b24dbf-2f4a-90f3-40e2-1444d594925e.gif)

valueにセットされた値がフィールドに表示されます
リストから選択されたときにonChangeが呼ばれるのでここでstateやstoreに渡してvalueを更新します

# サーバーからデータを取得する

Async Componentを利用し都度リクエストを投げ取得したデータをoptionsに設定することができます

loadOptionsプロパティに関数を設定します
loadOptionsでは入力した文字列を引数で受け取るのでそれを利用しリクエストを作成します

![request.gif](https://qiita-image-store.s3.amazonaws.com/0/47343/47865235-fa70-74cf-8be5-b4f38dfe7d7c.gif)


```js
function getUsers (input) {
  if (!input) {
    return Promise.resolve({ options: [] });
  }

  return axios.get(`https://api.github.com/search/users?q=${input}`)
  .then((response) => {
    console.log(response);
    return { options: _.get(response, 'data.items', []) };
  });
}

<Select.Async
  value={this.state.value}
  onChange={this.onChangeUser}
  valueKey="id"
  labelKey="login"
  loadOptions={getUsers}
/>

```

valueKey, loadKeyを設定することでoptionsのvalue, keyを任意のkey名に変更することができます

# 大量のデータをリストに表示したい
リストが大量になると表示に時間がかかってしまうため別のライブラリと組み合わせて高速化を行います
react-selectとreact-virtualizedを組み合わせた[react-virtualized-select](　https://github.com/bvaughn/react-virtualized-select)というライブラリがあるのでこちらを使います

react-virtualizedはリストの見えている部分＋アルファのみ描画したりでリストやテーブルの表示の高速化に役立つライブラリです
こちらもおすすめなreactライブラリの一つです

---

今回のサンプルコードは
https://github.com/aMasashiUmeda/acs_advent_2017_13
にアップしてあります。

それでは、明日は @ymtszw さんです！
張り切ってどうぞ
Docker備忘録

ハマっているので備忘録。

##一発で色々消せた！
```
docker rmi `docker images | sed -ne '2,$p' -e 's/  */ /g' | awk '{print $1":"$2}'`
```

##コンテナを全て停止させる
```
docker ps -aq | xargs docker stop
```

##コンテナを全て削除する
```
docker ps -aq | xargs docker rm
```

##イメージを全て削除する

```
docker images -aq | xargs docker rmi
```

次のエラーで削除できない場合、削除対象のイメージから別のイメージを作成したことが原因らしい。
その場合は、削除対象のイメージから作ったイメージも削除する必要があるらしい。

```
Error response from daemon: conflict: unable to delete <image-Id> (cannot be forced) - image has dependent child images
```

が、個別なら強制削除も可能。

```
docker -f rmi <REPOSITORY>/<TAG>
```
それでも消えなくて、これでもう少し削除できた。

```
docker images | grep none | sed -E 's/ +/ /g' | cut -f 3 -d ' ' | xargs docker rmi -f
```
非エンジニアが2年半かけて見つけたプロダクト開発との関わり方

これはLivesense - 関 Advent Calendar 2017の8日目の記事です。

圧倒的に遅延しております。すいません。
~~そりゃ"でぃれくたー"には慣れないわ。自責。~~

こんにちは、私はリブセンスで働く非エンジニア/非デザイナーのyokokinと申します。
リブセンス歴は2年半です。
Qiitaに投稿するのもはじめてですし、とにかくドキドキとビクビクが今の感情です。
ライティングスキル持ってる人すごいな。。。

とはいえ、タイトルが釣りにならないようにしっかりと8日目の役目を
果たすのですが、いわゆるBusiness職の方がエンジニア/デザイナーと一緒になって
ものづくりをしていく上でのコミュニケーション上での工夫などをお伝えできればと思います。

#最初に自己紹介
私は現在、株式会社リブセンスにおいて正社員領域向けのサービスを提供している事業部(*)で事業企画職を担当しております。
*例えば、[転職会議](https://jobtalk.jp/)とか、[転職ナビ](https://job.j-sen.jp/)とか、[転職ドラフト](https://job-draft.jp/)とかですね。

事業企画って肩書ですが、実際にやっていることとしては業務領域広めでして、
予算策定、事業管理(KPIモニタリング)、コーポレート部門との連携、経営会議/取締役会の資料作成など本当に多岐に渡ります。
~~割りと頻繁に~~想定しないところから特命案件がとんでくることもあります。


#リブセンスに入社をしたきっかけ
もともとは人材紹介業に4年程度携わり、その後新規事業として
Webサービスの立ち上げに関わらせていただき、リファラルリクルーティングサービスや経営者インタビュー動画サイトなどのプロジェクトリーダーをしていました。

ちなみにここでいうプロジェクトリーダーの役割としては、

- 会議体の調整
- 管理部門連携の仕様決め(経理/法務連携)
- ベンダーコントロール(開発/デザインはFull外注でした)

などなどで、Webサービスをつくることにキラキラさを求めていた私は
「なんか違うな。。。」と思い、転職を決意しました。
そんなときに、当時人材サービスに関わる人間なら一度は見たことのある
[転職会議](https://jobtalk.jp/)で募集があると知り、入社を決意しました。

#入社してからやったこと
リブセンスに入社してからしばらくは[転職会議](https://jobtalk.jp/)のマネタイズ強化に取り組み、
人材会社様とのアライアンス施策や直販型のサービスの立上げなどで様々なPJTに関わらせて頂きました。各クライアントとの連携に際して、DBの名寄せを○○社分やったこと等、今となってはいい思い出です。

#仕事をするなかで意識をしていたこと
上記のように様々な仕事をするなかで社内のエンジニアやデザイナーとたくさん議論~~(喧嘩)~~もしましたし、たくさん喜びを分かち合いましたが、そんな中で意識したことは、以下のようなことでした。

####ヒヨることなく、コミュニケーションをとる。
とにかくまずコミュニケーションをとることが第一だと思っています。
顧客の声/悩み/課題を適切な頻度で伝えて、必要に応じて解決方法を一緒になって考えることは一緒にプロダクトをよくしていく上で何より大切なんじゃないでしょうか。
営業などBusiness系職種の人間だけでは最善の解決方法が生まれるわけではないので一緒に考えることがすごく重要だなと思います。

####出来る限り数値で語る。(根拠を明示する)
信頼関係が成熟されている状態であれば、yokokinさんの肌感を信じよう、という関係になると思いますが、やはり一定数値的な根拠をもって対話をしたほうが良いと思います。

####最後に"Passion"を伝える。
私はどちらかというとロジック型人材ですが、(異論は認めません)
何かを成し遂げたい、顧客のために価値を提供したいという強烈なPassionは時に人を動かします。
「バカだな、こいつ」と思われても、自分の思っていることを理解してもらうために想いを伝えることは意識していました。

#最後に
非エンジニアの皆さんで、もっとプロダクト開発に関わりたい、顧客の課題解決に関わりたいと思っている方はたくさんいると思います。
そんな方の参考に、少しでもなれば幸いです。

今は予算策定や事業管理などプロダクト開発から少し距離がありそうな仕事を主務としておりますが、
エンジニア/デザイナーのみなさんに声がけいただき、いまでもよりよいプロダクトを考える/議論する場には参加しています。(声がけいただいて本当にありがとうございます）
これからも職種関係なく同じプロダクトに関わる人間として一体感を持って事業を成長させていきたいと思っております！

完
円周率を求めるプログラムを書く

# 初めに
今回は任意精度数演算ライブラリ、GMP(GNU Multi-Precision Library)を使って円周率を求めたいと思います。
円周率を求めるアルゴリズムは[ガウス＝ルジャンドルのアルゴリズム](https://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B9%EF%BC%9D%E3%83%AB%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%89%E3%83%AB%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)を使います。

# ソースコード
```c++:main.cpp
#include <cstdio>
#include <iostream>
#include <gmp.h>
#include <gmpxx.h>
#include <cmath>
//#include <omp.h>


int main(){

    int n=0;
    std::cout<<"n?>";
    std::cin>>n;

    mpf_class a(1,65546);//初期値1,65546bit
    mpf_class ba(0,65546);
    mpf_class b(1.0/sqrt(mpf_class(2)),65546);
    mpf_class t(1.0/4.0,65546);
    mpf_class p(1,65546);

    //openMP
    //#pragma omp parallel for
    for(int i=0;i<n;i++){
        ba=a;
        a=(ba+b)/2;
        b=sqrt(ba*b);
        t=t-(p*(ba-a)*(ba-a));
        p=2*p;
    };

    mpf_class A=(a+b)*(a+b)/(4*t);

    mp_exp_t exp;

    std::string A_str=A.get_str(exp);

    std::cout<<A_str.insert(1, ".")<<std::endl;
}
```

アルゴリズムはwikipediaを見ながら実装しました。
変数のビット長は65546bitにしています。
速度向上のため、openMPを使おうとしたのですが漸化式の形になっているので上手く速度が上がりませんでした。

## コンパイル

```sh
g++ main.cpp -lgmp -lgmpxx
```

下記のリンクの順番だと私の環境(OS、Windows 10。コンパイラ、mingw)では上手くいきませんでした。

```sh
g++ -lgmp -lgmpxx main.cpp
```
iOS用のdlibをビルドする


## 概要
最新版のdlibを使いたかったためiOS用のlibdlib.aを作成しました。
そのときのメモを残します。
[参考](http://prabhu.xyz/2017/05/29/getting-started-with-dlib-on-ios.html)

## dlibダウンロード
[dlibのサイト](http://dlib.net/)からダウンロードします。
2017/12/11現在の最新版は[19.7](http://dlib.net/files/dlib-19.7.tar.bz2)です

## 必要なものインストール

### X11
https://www.xquartz.org/

### cmake

```bash
brew install cmake
```

## libdlib.aビルド用のXcodeプロジェクト作成

`examples`ディレクトリ内に移動し、`build`ディレクトリ作成、移動

```bash
cd examples
mkdir build; cd $_
```

下記コマンドでXcodeプロジェクトを作成します。

```bash
cmake -G Xcode ..
cmake --build . --config Release
```

## iOS用に設定を変更する
### Xcodeで開く
`build/dlib_build`ディレクトリに`dlib.xcodeproj`
ができているのでXcode 8系で開きます  
（いろいろ試していたため、Xcode 9系でも良いかも） 

### Build Settingを変更する
`dlib`ターゲットのBuild Settingを変更します。

| 項目 | 変更後 |
| --- | --- |
| Base SDK | Latest iOS (iOS XX.X) |
| Build Active Architecture Only | No |

### Releaseビルドに変更する
`dlib`の`Edit Scheme`から`Run`を`Relase`に変更します。

## libdlib.a作成
▶で実行！
`Release-iphoneos/libdlib.a`ができあがり！
我輩はtidyである。自作パッケージはまだない

この記事は [tidyポエム Advent Calendar 2017 - Adventar 11日目](https://adventar.org/calendars/2188#list-2017-12-11) の記事です。

---
#はじめに
 [月がtidyですね。](http://notchained.hatenablog.com/entry/2017/12/01/005236)とか，[完璧なdata.frameなどといったものは存在しない。完璧な絶望が存在しないようにね。](http://notchained.hatenablog.com/entry/2017/12/05/004406)とか，ウィットに富んだ記事を楽しく読ませていただいておりました。
そんな折，何でもいいから書いてみたらとお声かけいただき，思いつくままにタイトルを登録したのですが，今見返すととても偉そうなタイトルで，反省しています。だって吾輩tidyじゃないもの...

#私のRの歴史は...
私のRの歴史は`reshape2`の歴史にあらず、`plyr`の歴史にあらず、`plot()`の歴史にあらず、単に`tidyverse`の歴史であると申したいくらいだ。だから`tidyverse`をロードしていないコードを見ると自分で書いた感じがしない――

というポエムを思いついただけなのでもう書くことが無くなってしまいました。
一応補足説明をすると...Rを本格的に使い始めたきっかけは，`ggplot2`，`dplyr`，`tidyr`と出会ったことでした。実は`reshape2`も`plyr`も経ていません。
今や，新規にスクリプトを立ち上げたら，さながら「とりあえずビールで」のようなノリで

```R:setup
library(tidyverse)
```
ですよ（お酒飲まないですけど）。好きとか嫌いとかはいい，`tidyverse`をロードするんだ。


#これからの日々は...
そんなわけで日々`tidyverse`のお世話になっているのですが，未だに慣れないところがあって，修業が足りないなあと痛感しているところです。一番躓きやすいのが`dplyr::recode()`で，いつも[dplyr 0.5.0を使ってみる](http://notchained.hatenablog.com/entry/2016/04/09/123059)を参照させていただいています。以下のコードは，上記サイトから転記したものです。

```R:recode
x <- c("a", "b", "a", "b", "a", "c")
recode(x, a = "あ", .default = "うん")
#> [1] "あ"   "うん" "あ"   "うん" "あ"   "うん"
```

例えば名前の似ている`dplyr::rename()`だと，**new = old**の順に書きますよね。

```R:rename
iris2 <- iris %>% dplyr::rename(SL = Sepal.Length)
```

`dplyr::mutate()`等も同様に，**new = old**の順です。

```R:mutate
iris2 <- iris %>% dplyr::mutate(Sepal = (Sepal.Length + Sepal.Width) / 2)
```

対して`dplyr::recode()`は上記の通り，**old = new**の順。いつも，「どっちだっけ...」と混乱してしまいます。精進します。

オチは特にないです。
Railsでアプリ内で使う定数を定義する

#1.設定値の定義
CONFIG_NAMEは任意の文字列に置き換えます。
XXXは設定値の値です。

```diff:config/application.rb
module ModuleName
  class Application < Rails::Application
+  config.CONFIG_NAME_A = XXX
+  config.CONFIG_NAME_B = YYY
  end
end
```

#2.設定値の呼び出し

```ruby:sample.rb
ModuleName::Application.config.CONFIG_NAME_A # => XXX
ModuleName::Application.config.CONFIG_NAME_B # => YYY

```
使いやすい様にリファクタリング

```diff:sample.rb
- ModuleName::Application.config.CONFIG_NAME_A
- ModuleName::Application.config.CONFIG_NAME_B

+ config = ModuleName::Application.config

+ config.CONFIG_NAME_A #=> XXX
+ config.CONFIG_NAME_B #=> YYY
```
rails標準機能jbuilderを使用してJsonレスポンスを返す

#準備

##routesでレスポンスのフォーマットにjsonを設定する

```ruby:config/routes.rb
get 'user/index'   => 'user#index', defaults: { format: :json }
```

#レスポンスの定義を実装

##値をパースしないでまとめて渡す場合
```ruby:app/view/users/index.json.jbuilder
json.array!(Use.all) do |user|
  json.call(user, :id, :name)
end
#=> {id: XX, name: XX}
```

##値をパース（編集）する時など個別に設定する場合
```ruby:app/view/users/index.json.jbuilder
json.array!(Use.all) do |user|
  #json.key value 形式で渡す
  json.id user.id
  json.name user.name.strip!
end
#=> {id: XX, name: XX}
```

#参考
 
http://llcc.hatenablog.com/entry/2015/03/07/103121
pandasのapplyで複数の値を返す

# 一つの値を返す関数に対してのapply
これは普通のapply。わざわざ見せるまでもないかもしれないが、こんな感じ

```py:普通のapply
def some_function(x):
    return x*2

data['new_column'] = data['existing_column'].apply(some_function)
```
このsome_functionで複数の値を返したいとする。そんな時にわざわざ関数を２つ作ってapplyを2回使うのはもったいない気がする。

```py:もったいないコード
def some_function1(x):
    return x*2
def some_function2(x):
    return x/2
data['new_column1'] = data['existing_column'].apply(some_function1)
data['new_column2'] = data['existing_column'].apply(some_function2)
```

# 複数の値を返す関数に対するapply
2つの値を返す関数に対して、データフレーム側でそれぞれ新しい列を生成したい場合はこうするとスマートに書ける。

```py:２つの値を返す関数に対するapply
def some_function1(x):
    return pd.Series([x*2, x/2])

data[['new_column1', 'new_columns2']] = data['existing_column'].apply(some_function)
```

値を返す関数の方でreturnのときにpd.Seriesで囲んでやることと、受ける側のデータフレームで列をリスト形式で指定するのがミソ。
Vue.js + Nuxt.jsでコインチェックのチャート表示サービスを作った

京都でフリーランスのWebデザイナーをしている山根（<a href="https://twitter.com/sho_yamane">@sho_yamane</a>）です。

今回はVue.js + Nuxt.jsで仮想通貨のチャート表示サービスを作ったのでそのご紹介です。作ったサイトは以下になります。

<img width="1680" alt="スクリーンショット 2017-12-11 17.47.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/21909/a612cec8-c060-01dd-48d8-dff0fcbdff1c.png">

<a href="http://bitchecker.jp/">bitChecker - 仮想通貨チャート表示サービス</a>

## 構成

仮想通貨取引所のコインチェックのAPIがクロスドメイン対応していなかったので一度APIサーバーを作ってそこ経由で情報を渡しています。

### APIサーバー

- ConoHaVPSの一番安いプラン
- Ruby
- デーモン化して5秒ごとにチャート情報を取得

### 表示してるほうのサーバー

- Netlifyで0円
- Vue.js + Nuxt.js
- チャートはD3.jsとTechanJSを使用
- setIntervalで5秒ごとにAPIサーバーの情報取得

## 感想

特にハマったところもなくリアルタイム表示サービスなのでVue.jsを使うことでとても楽にコーディングできました。設定からカラム数を変えたりダークモードに切り替えられたりするんですがそのへんはVue.jsを使うととても楽に書ける部分ですね。

Nuxt.js入れる意味あるのかよって話だとも思うんですが、今後文章情報を入れたい場合の拡張性を考えて最初からNuxt.jsを導入しました。ルーティングもOGP対応も楽ですしね。

サーバーはNetlifyでGithub経由で簡単デプロイです。AmazonのS3も検討したのですが、Netlifyは無料ですしCDNも勝手にやってくれますしデプロイ楽すぎでNetlifyを選びました。

## おわり

以上、コードの紹介でもなく事例紹介になってしまいましたが、Vue.jsをつかうとこういうリアルタイム性のあるサイトも作りやすいよっていうお話でした。これをみてVue.js使ってみよ！って思う人がちょっとでも増えるとうれしいです。
容量の大きいpngファイルを、jpgファイルに変換する

#はじめに
pngファイルというのは容量が結構大きいので、そのまま画像を用いるのであればjpgに変換したほうが軽くなって便利です。今回はその時に使用したコードを記載します。

#PILでjpg変換

今回はpythonの画像処理ライブラリであるPILを用いましょう。以下のようなスクリプトでjpg変換することができます。また、`quality`の値に応じて画像の精密度が変わるようです。

```python
from PIL import Image
import sys
import os
import re

input_path = <input元フォルダ>
output_path = <output先フォルダ>
files = os.listdir(input_path)
count = 1

for file in files:
    if file[-4:] == ".png":
        input_im = Image.open(input_path + str(count) + ".png")
        rgb_im = input_im.convert('RGB')
        rgb_im.save(output_path + str(count) + ".jpg",quality=30)
        count = count + 1
        print("transaction finished" + str(count))

```
フォルダ上の画像名を連番に変換する

#はじめに
ダウンロードした画像や頂いた画像タイトルを、連番に変換したい事があります。連番のが後で処理をおこいやすいためです。今回はその時に使用したコードを記載しておきます。

#連番に変換

```python
import sys
import os
import re

input_path = <変換前のフォルダ>
output_path = <変換先のフォルダ>

files = os.listdir(input_path)

count = 1
for file in files:

    if file[-4:] == '.jpg': #今回は全てjpgファイルだったのでこの様に指定。バラバラならフォーマットを揃えるスクリプトも必要
        os.rename(input_path+file, output_path+str(count)+'.jpg')
        count = count + 1

```

わざわざ載せるまでも無い位簡単ですね...
AWS の RDS で外部アクセスを可能にする

1) Details で「パブリックアクセス可能」が　「はい」になっていることを確認する
![mysql_01.png](https://qiita-image-store.s3.amazonaws.com/0/179446/88bac7d5-371e-d9dc-35a1-15cd461a9dfd.png)

2) セキュリティグループ　のインバウンドで、ポート　3306 を、0.0.0.0/0 にする
![mysql_02.png](https://qiita-image-store.s3.amazonaws.com/0/179446/2e27df02-ec72-a4bf-b14a-39eeace35050.png)

3) 接続の確認
エンドポインント、ユーザー、パスワードは変更して下さい。

```bash
mysql -hiot-test.aaaa1q8npue.ap-northeast-1.rds.amazonaws.com -uuseraa -ppassword
```

![mysql_03.png](https://qiita-image-store.s3.amazonaws.com/0/179446/3dc1de2e-515f-49d4-6f13-b4a9047d9aaa.png)
Flaskでcsvダウンロード機能を作成する

#はじめに
PythonのフレームワークであるFlask上で、csvでファイルをダウンロードする必要がありました。今回はSQLAlchemyを使ってDB上のデータをcsvに変換して、FlaskのAPIを使ってダウンロードできるようしました。

#Flaskでcsvダウンロード
ダウンロードするデータは以下のような形式になってるとします。シンプルなFlaskアプリケーションで、今回はusersテーブルを作成しておきましょう。このテーブルのデータをDBから取得して、csv形式でダウンロードできるようにします。

```python
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
from io import StringIO

app = Flask(__name__)
DB_URL = <DBのURI>
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

#サンプルデータのスキーマ
class User(db.Model):

    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(200))
    gender = db.Column(db.Integer)
    age = db.Column(db.Integer)
    created_at = db.Column(db.DateTime)

    def __init__(self, username, gender, age):
        self.username = username
        self.gender = gender
        self.age = age
        now = datetime.now()
        self.created_at = now

    def __repr__(self):
        return '<User %r>' % self.username
```
　　
今回はダウンロードを/download/~から実行できるようにします。

```python
@app.route('/download/<obj>/')
def download(obj):

    f = StringIO()
    writer = csv.writer(f, quotechar='"', quoting=csv.QUOTE_ALL, lineterminator="\n")

    if obj == 'users':
        writer.writerow(['id','username','gender','age','created_at'])
        for u in User.query.all():
            writer.writerow([u.id, u.username,u.gender,u.age,u.created_at])

    res = make_response()
    res.data = f.getvalue()
    res.headers['Content-Type'] = 'text/csv'
    res.headers['Content-Disposition'] = 'attachment; filename='+ obj +'.csv'
    return res
```
肝は`Content-Disposition`ヘッダーであり、このヘッダーの値に応じてブラウザ上でインラインで表示されるか、アタッチメントとして処理されるか決まります。
今回は`attachment`と指定して、添付ファイル化します。ダウンロードされる際のファイル名は`filename=`で指定することができます。

Flaskでレスポンスの形式を弄るときは`make_response()`を弄ればOKです
またpythonでcsvに変換するときは`StringIO`を使用しましょう。

#終わりに
方法は単純で、データをcsv形式に変換して、レスポンスの際にHTTPヘッダーを書き換えるだけです。ダウンロードという簡単な機能ですが、HTTPについてあまり知らないと少し引っかかってしまうかもしれません。

#参照
[MDN web docs: Content-Disposition](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Disposition)