OmniAICreator/Qiita-1.07M huggingface dataset:
【Linux Board】Nano pi NEO2

![alt](http://akizukidenshi.com/img/goods/L/M-12302.jpg)
4cm角サイズだけれど、CPU は 64bit のクアッドコア、ギガビットイーサも持っている Linux基板。
イーサーとタイプAのUSBが一つあるだけで、音声や HDMI 出力等はなし。
基本、SSH などで接続して使う感じ。でも小ささは正義(笑)

低スペックで低価格の Nano Pi NEO 512MB もあるので注意!!
こっちで十分という方は利用シーンに合わせてチョイスしてください。
# 入手方法
秋月電子のホームページ http://akizukidenshi.com/catalog/g/gM-12302/ から通販するか、
秋葉の秋月電子に直接足を運んで、入り口前の平台の奥側にある。箱なしなので見つけにくいかも。
熱暴走が怖いなら、専用ヒートシンクも買っておくこと。http://akizukidenshi.com/catalog/g/gP-12303/
# microSD の作成
ＯＳダウンロードページ
https://www.mediafire.com/folder/ah4i6w029912b/NanoPi-NEO2
の offical-ROMs からイメージをダウンロード。今回は FriendlyCore-Xenial とかを使う。
Win32diskimager を使って microSD に書き込み、本体に挿す。

nanopi-neo2_debian-nas-jessie_4.14.0_20171208.img.zip
 → Nas用NASケースキットとかと一緒に使う http://akizukidenshi.com/catalog/g/gM-12591/
nanopi-neo2_FriendlyCore-Xenial_4.14.0_20171208.img.zip
 → 一般的な利用はこれかな？
nanopi-neo2_ubuntu-oled_4.14.0_20171208.img.zip
 → NanoHat OLED を使う時はこのイメージを使うと楽。

# 接続
起動するとDHCPでネットワークにつながる。IPアドレスを調べて、ssh で接続する。
初期の接続ユーザは root パスワードは fa。非 root ユーザとして pi パスワードは pi がある。
両方ともパスワードはすぐ変更しておくこと。
# npi-config
コマンドラインユーティリティ。言語設定とかアップデートとかできる。
# CPU温度の表示
cat /sys/class/thermal/thermal_zone0/temp で表示された値を 1/1000 した値。1つだけ表示される。
または cpu_freq コマンドを実行。CPU毎に4つの情報が表示される。
# ピンアサイン
![](http://wiki.friendlyarm.com/wiki/images/2/27/NEO2_pinout-02.jpg)
# GPIOを操作する
/root/WiringNP/gpio コマンドが使える。

```shell:
gpio: Usage: gpio -v
       gpio -h
       gpio [-g|-1] [-x extension:params] ...
       gpio <read/write/aread/awritewb/pwm/mode> ...
       gpio readall/reset
       gpio unexportall/exports
       gpio export/edge/unexport ...
       gpio pwm-bal/pwm-ms
       gpio pwmr <range>
       gpio pwmc <divider>
       gpio load spi/i2c
       gpio i2cd/i2cdetect
       gpio usbp high/low
```

gpio -g mode 1 in を実行すると gpioA1 BCM 1 が in になる。
5V とか 3.3v とスイッチ経由でつなげればボタン状態が取得できる
# 関連サイト
[メーカーページ](https://translate.google.co.jp/translate?hl=ja&sl=en&u=http://nanopi.io/nanopi-neo2.html&prev=search) | [サポートページ](https://translate.google.co.jp/translate?hl=ja&sl=en&u=http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO2&prev=search) | [回路図](http://wiki.friendlyarm.com/wiki/images/a/a1/Schematic_NanoPi_NEO2-v1.0_1701.pdf)

# NEOケース [NEO-CS1]
![alt](https://www.aitendo.com/data/aitendo/_/70726f647563742f32303137303732395f3531623264312e706e67003235300000660066.jpg)
Aitendo:[Linuxシングルボードコンピュータ [NEO512M]対応ケース](http://www.aitendo.com/product/16237)

# NanoHat OLED
![alt](https://images-fe.ssl-images-amazon.com/images/I/41-tvbbSOgL._AC_SS350_.jpg)
amazon:[NANOHAT OLEDモジュール](https://www.amazon.co.jp/Taidacent-NANOHAT-OLED%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88Python%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90-NanoPi-NEO%E3%80%81NEO2%E3%80%81Air%E3%81%AA%E3%81%A9/dp/B07235N9TS/ref=as_sl_pc_tf_til?tag=nekyo-22&linkCode=w00&linkId=36e7c9adbf5ebaf2878b226950567b71&creativeASIN=B07235N9TS)
加筆中
ReactNativeでAndroidシミュレータが立ち上がらないときにやったことメモ

# ReactNativeでAndroidシミュレータが立ち上がらない！

Mac + iOSシミュレータだと簡単に起動するのに、Windows + Androidシミュレータだと結構変なエラーでハマったので備忘録的に。
(今後、どういうエラーのときに使用したか、種類自体も増やしていくつもりです)

## npmのキャッシュをきれいにする

推奨されているやり方はこちら、だいたいこちらでいけている。
`npm cache verify`
cacheのcleanをする際には--forceをつけると出てくる
`npm cache clean --force`

## android配下をきれいにする

`{プロジェクトルート}/android/` で.以下のコマンドを実行する。
変なゴミなどが溜まっていた場合はだいたいこれでうまくいく。

`./gradlew clean`
Laradockを使ってLaravel 5.5環境を構築する

# はじめに
Laravel5.5がリリースされたので、試してみようと思います。
環境はmac OS Sierra(10.12.6)でDocker For Macを使用しました。
基本的に[Laradockのドキュメント](http://laradock.io/)を参考に進めていきます。


# Laradockを準備
適当なディレクトリを作ってその中に

- laradock
- プロジェクト名

のディレクトリを作る構成にしたいと思います。

```
mkdir laravel
cd laravel
git clone https://github.com/laradock/laradock.git
```
Laradockをクローンしたら、中にある`env-example`をコピーして`.env`を用意します。

```
cd laradock
cp env-example .env
```

# コンテナを立ち上げてworkspaceに入る
```
docker-compose up -d nginx mysql workspace phpmyadmin
docker-compose exec workspace bash
```
初回はけっこう時間がかかります。立ち上がったらworkspaceに入ります。

# Laravelをインストール
```
composer create-project laravel/laravel プロジェクト名
```
これもいろいろとインストールするので時間がかかりますが、5.5のLaravelがインストールされるはずです。
終わったらworkspaceから抜けます。

```
exit
```

# `.env`を編集
ここでいったんコンテナを停止します。

```
docker-compose stop
```
Laradockの`.env`の`APPLICATION=../`となっている行を`APPLICATION=../プロジェクト名`に変更します。

```ini:.env
############################
# General Setup
############################

### Application Path
# Point to your application code, will be available at `/var/www`.

APPLICATION=../プロジェクト名
```
# 動作確認

再度コンテナを立ち上げ

```
docker-compose up -d nginx mysql phpmyadmin
```
ブラウザでhttp://localhost/ にアクセスすると・・・


![laravel.png](https://qiita-image-store.s3.amazonaws.com/0/158269/3883dbf7-0f95-74e4-14ba-3d76dec04d5e.png)

無事、動かすことができました。

# MySQLの設定
このままだとデータベースに接続できないので、laravelのほうの`.env`を編集します。

```ini:.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```
workspaceに入って`php artisan migrate`がエラーが出ずにできれば接続できています。

# phpMyAdminを使う
http://localhost:8080/ にアクセスして、

- サーバ: mysql
- ユーザ名: default
- パスワード: secret

でログインできます。

# 参考
[Laravel公式](https://laravel.com/)
[Laradock ドキュメント](http://laradock.io/)
[Laravel日本語ドキュメント](https://readouble.com/laravel/5.5/ja/)
WindowsでReactNativeを起動しようとした際にunable to load script from assets index.android.bundle

#unable to load script from assets index.android.bundle

会社のWindows環境でReactNativeをシミュレータ起動をしようとした際に題名のエラーに当たりました。
調べてみると結構な人があたっているような感じなのですが、割りと支持を受けている対処をしても解決しませんでした。

https://stackoverflow.com/questions/44446523/unable-to-load-script-from-assets-index-android-bundle-on-windows

# 先に結論

ReactNative起動時に起動するはずのNodeサーバが立ち上がっていたなかった。

ReactNativeは起動時にNodeのサーバを自動で立ち上げます。その環境上で動作するのですが、そのサーバが立ち上がっていたなかったためにエラーが発生していました。

# 立ち上がらなかった理由

Nodeサーバが使用する8081ポートが専有されていた。

自分の環境の場合はアンチウイルスソフトの何かのプロセスが8081で起動しており、それのせいでサーバが起動していなかった。

似たような回答もstackoverflowに存在していたが、気づかなかった・・・
https://stackoverflow.com/questions/30216417/react-native-port-8081-already-in-use-packager-is-either-not-running-or-not-r

## 解決策

とりあえず、そのときは急いでいたのでプロセスを一旦killして対処。
ちゃんと対処するならReactNativeのサーバのポートを帰るべきだと思うが、それはまた別記事で。
EthereumアドレスをQRコードにする方法

##やったこと
pythonでMyEtheWalletのようにEthereumのアドレスをQRコードにしてみる。
スマートフォンにインストールしたJAXXからQRコードを読みとりできるか確認してみる。


EIP67でQRコードの議論がされていたのでそれを参考にする。
https://github.com/ethereum/EIPs/issues/67

色々議論されているようで理解するのに時間がかかりそう。

要は、次のように送付先として指定するETHアドレスを必須として、あとは用途に沿ったオプションを
QRコードに仕込めば良いと勝手に理解する。（違ってたらすみません）。

```py3:qrcode

 ethereum:<address>[オプション]


```

##作り方
Pythonの画像処理ライブラリ　PillowとQRコード用のライブラリを入れる。

```control:qrcode
$ pip3 install pillow qrcode
```

たとえば、自分の指定するアドレスに1ETHを送付してもらいたい場合、
次の情報をQRコードに付加する。

　・指定アドレス（例）：0xdcc47176a2afee39dbf175e22e46a8de38fd0524　（必須）
　・送付量(ETH)：1　（オプション）

上記情報をQRコードに仕込む場合、フォーマットは次の条件に従う。

```consol:qrcode

 ethereum:<address>[?amout=<amount>]

```



上記条件を満たし、QRコードを出力するスクリプトは次の通り（３行で済む）

```py3:eth_qr.py

import qrcode 
img=qrcode.make('ethereum:0xdcc47176a2afee39dbf175e22e46a8de38fd0524?amount=1')
img.show()


```

##確認結果
###できたもの

こんなQRコードが出力されるので、スマートフォンにインストールしたJAXXのカメラ機能でQRコードを読ませてみる。

![eth_qrcode.png](https://qiita-image-store.s3.amazonaws.com/0/142016/c1e28ad1-3d85-8ad6-3c30-2768a4b91526.png)

JAXX上では送付先のアドレスと、送付ETHが自動的に入力されていることを確認することができた。

![122436.jpg](https://qiita-image-store.s3.amazonaws.com/0/142016/d53ef036-9666-d44c-9287-2ddcab450805.jpeg)




色々とEthereumのQRコードのオプションとして、gasの指定だったり、ERC20トークンを送付する指定だったり、QRコードに仕込むデータ仕様が決められてる。もう少し時間があれば他のオプションも試してみる。

##参考
「Pythonの「qrcode」を使ってQRコードを生成する」
　http://qiita.com/ak1procom/items/c9da5d5f1039adea9704
「ERC: Standard URI scheme with metadata, value and byte code #67」
　https://github.com/ethereum/EIPs/issues/67
node.js 超入門④mongodbを使ってみる


ついに第4回です。

[第一弾](http://qiita.com/ritukiii/items/7f28554369d63eb373c3)ではnode.jsの超基礎を学びながら簡単なwebサーバを作りました。
[第二弾](http://qiita.com/ritukiii/items/8173ff98f31c2f76b39a)では、他のファイルに分割する方法や、ルーティングやファイルシステムを使ってHTMLで表示等を行いました。
[第三弾](http://qiita.com/ritukiii/items/5deba734249bf3543b85)では、簡単なアプリケーションを作ってみました。

今回は、前回のアプリケーションの続きとして、保存したデータの永続化(DBへの保存)もやってみます。
(長くなってしまいそうなので、今回はmongoに接続する所まで)


## [基礎編]MongoDBとは

高速なNoSQLで、node.jsと相性が良いデータベースです。

最近の、NoSQLは、`KVS`/`ドキュメント指向データベース`/`列指向データベース`等がありますが、
MongoDBは、スキーマレスなドキュメント指向データベースです。

MongoDBは、トランザクションやリレーショナル(JOIN)機能をつけない事で、高速でKVSレベルの高いパフォーマンスを実現します。

特にリアルタイム処理にも強く、node.jsと相性が抜群です。

#### MongoDBとRDBの比較

RDBで使われている用語とMongoDBで使われる用語の対応を書いておきます。

RDB|MongoDB
---|---
database|database
table|collection
record|document
column|field
index|index
primary_key|_id


ここで覚えておきたいのは、**MongoDBはスキーマレスなドキュメント指向データベースである**という事です。
スキーマレスなので、RDBのように、カラム定義を行いません。

RDBでユーザ管理するテーブルを作れば、`id(int), name(varchar), created_at(datetime)`のように、各カラムの型を指定するため、各レコードには同じ型のデータが入ります。

しかし、MongoDBの場合は、document毎に自由fieldを定義することが出来ます。

## node.jsからMongoDBを扱ってみる

まずは、インストールして、接続する所までやってみたいと思います。

```bash
$ npm install mongodb
```

実際にDBにテストデータを入れて、取得する部分までやるとこんな感じになります。
`config.db`には`testdb`というデータベースの名前を入れてみました。

```
var mongoClient = require('mongodb').MongoClient;
var config = require('./config');

mongoClient.connect("mongodb://localhost/" + config.db, function(err, db) {
  // エラー処理
  if (err) {
    return console.dir(err);
  }

  db.collection("users", function(err, collection) {
    if (err) {
      return console.dir(err);
    }

    // 挿入するデータ
    var docs = [
      {name: "山口",   score: 20},
      {name: "大田",   score: 80},
      {name: "長本",   score: 100},
    ];

    collection.insert(docs, function(err, result) {
      // エラー処理
      if (err) {
        return console.dir(err);
      }

    });

    // 検索する
    collection.find().toArray(function(err, items) {
      console.log(items);
    });

  });
});
```

## 検索してみる

先程は`find()`で全て取得しましたが、実際に検索してみて、mongoがどんなものか見てみましょう。

```
var mongoClient = require('mongodb').MongoClient;
var config = require('./config');

mongoClient.connect("mongodb://localhost/" + config.db, function(err, db) {
  // エラー処理
  if (err) {
    return console.dir(err);
  }

  db.collection("users", function(err, collection) {
    if (err) {
      return console.dir(err);
    }

    // 検索する
    collection.find({name: "長本"}).toArray(function(err, items) {
      console.log(items);
    });

  });
});
```

このようにfindに指定すれば条件指定して取得が可能です。

```
$ node mongo.js
[ { _id: 59b69c558e9ce1484773fffd, name: '長本', score: 100 } ]
```

結構簡単ですね。

次回は、前回作ったアプリケーションのデータをmongodbに保存、取得してデータの永続化にtryしてみようと思います。
RailsでABテスト

#Splitを使ってABテストを実装する

redisをインストール
`$ brew install redis`

Redisサーバを立ち上げる
`$ redis-server`

bundlerでsplitをインストール
`gem 'split', require: 'split/dashboard'`
`bundle install`

立ち上げてないとこんなエラーが出るので注意
`Redis::CannotConnectError (Error connecting to Redis on localhost:6379 (Errno::ECONNREFUSED)):`

routes.rbに以下を記述
`mount Split::Dashboard, :at => 'split'`

こんな感じにviewに入れてやれば読み込む度にtestAまたはtestBが表示される
```index.html.erb
<% ab_test('test_name', 'testA', 'testB') do |text| %>
<%= text %>
<% end %>
```

コンバージョンを計る箇所に以下を記述
`<% finished("create_user") %>`

localhost:3000/splitでコンバージョンを見ることができる
Pythonワンライナーでがんばるぞい！

##元ネタ
[今日も1日がんばるぞい！](http://qiita.com/giiko_/items/8c3442e8e7a83cc0b91a)
×
[Pythonで作ったひどいものまとめ - nishio](http://www.nicovideo.jp/watch/sm4231432)（ニコニコ動画）

どちらも古いネタだがやってしまったものはしょうがない。

##ぞい！
```python
>>> import itertools, random; goal='今日も1日がんばるぞい！' ; dic = [['今日','ぞい'],['も'],['1','ぞい'],['日','ぞい'],['がん','ぞい'], ['ばる','ぞい'], ['ぞい！']] ; gen = ( ''.join( [ random.choice(x) for x in dic ] ) for i in itertools.repeat(0)) ; tw = itertools.takewhile( lambda x : x!=goal , gen ) ; ls = list(tw) ; print '\n'.join(ls) + '\n' + goal + '\n🌟 がんばるまで' + str(len(ls)) + 'zoiでした🌟'"
```
![スクリーンショット 2017-09-11 22.49.23.png](https://qiita-image-store.s3.amazonaws.com/0/114893/f1d37129-31fb-2eeb-31aa-366b9d90594f.png)


##がんばる
無限リストやジェネレータなど、以外^H^H意外と勉強になった気がする。
※広域変数回避版を作成中。~~できたら更新予定。~~
できました。今度はインデントで整形してみました。
.oO（ここまでがっつりやっちゃうと、ワンライナーとは・・・ってなるな。）

```python
import itertools, random;
print [
    '\n'.join(
          ls + 
          ['今日も1日がんばるぞい！'] + 
          ['🌟 がんばるまで' + str(len(ls)) + 'zoiでした🌟']
    ) for ls in [list(
        itertools.takewhile(
            lambda(x):x!='今日も1日がんばるぞい！' ,
            ( ''.join(
                [ random.choice(x) for x in
                    [['今日','ぞい'], ['も'],
                     [   '1','ぞい'], ['日','ぞい'],
                     ['がん','ぞい'], ['ばる','ぞい'],
                     ['ぞい！']
                    ]
                ] 
             ) for i in itertools.repeat(0)
            )
        )
    )]
][0]
```
***
Python3の別解が来てますね。早すぎ^H^H^Hありがたい、勉強になります。

 - print文じゃなくてprint命令だとこういうふうに表現の幅が広がるのか。
 - %でフォーマット表現できるの忘れてた・・・
 - 使い捨てを明示するための```hoge``` とか ```_``` とか、なるほど。
1日で1番グッときた学びをシェアする協力型自己啓発公開Slackチーム  ~Manabi Slack~


## Manabi Slackとは？

* 1日で一番グッときた学びを毎日一つだけアウトプットする公開Slackチーム
* 誰でも参加可能
* 意識上がって成長できる（気がする）

## 更新履歴
* 20170911 実験開始
* [参加希望者はここをクリック](https://join.slack.com/t/ma-na-bi/shared_invite/MjM4MTkwMzExNTM2LTE1MDUwNTU1NDctZWM0ZDExOTgyYw)
* ~~チームに参加できたら左メニューの「Channels」をクリックして「manabi-share」に参加してください。~~  
=>デフォルトで「manabi-share」に参加するよう設定しました
* 興味を持ってくれたからはいいね、いただけると私のテンションが上がっていろいろ頑張ります笑


## 作ったきっかけ!!
自分はフリーター並みに働いていないフリーランスエンジニア（別名：フリータンスエンジニア）なのですが、昨日彼女にある質問をされました。


>昨日新しく学んだことで私の知らないことを3つを教えて！(^^)

キラキラした目で聞かれました。
そして考えました。

やばい、何も思いつかない。。
Webで技術系の記事読んだり、NewsPicksで経済の情報見たりしてるのにビシッと答えられない。
要は情報が身についていない。

でもこれ面白いと思ったんです。
毎日1番良かった学びをシェアすれば、自分の理解も深まる、人がいいと思った情報が効率よく集まる場所を作ってみたいなと。そこでみんな大好きSlackの登場です。

##想定されるメリット
* アウトプットを意識してインプットするので知識が自分の身に着く
* 効率よく質の高い情報が届く
* なんとなく意識高まってにいろいろプラスにはたらく（ぼんやりww）

## シェアする内容
* グッときた！、新しい技術だ！、衝撃を受けた！、癒された！、堕落した生活を改善するきっかけだ！など自分の学びになったなら何でもおっけー！

## ルール
* 今日自分は何を学んだのかしっかり振り返る
* 1日で1番グッと来たものを一つだけ投稿する
* 自分の学びに繋がった、共感した投稿にはスタンプや返信で感謝をしっかり伝える
* 人がどう思うかは気にしない。自分にとって最高の学びをシェアする。
* 21時にリマインドするので、やべぇ何も学んでねぇってなったら24時までに何か一つ学びましょう
* 毎日続けることが大事！

## チャンネル
* manabi-share 学びをシェアする場所
* general 管理人からの連絡。管理人への要望。リマインダーなど。
* randam 雑談 ご自由にどうぞ
* (参加者が増えればチャンネル増やすなど工夫していきます。まずは一箇所でシェアしましょう。)

## 参加
* [ここから参加](https://join.slack.com/t/ma-na-bi/shared_invite/MjM4MTkwMzExNTM2LTE1MDUwNTU1NDctZWM0ZDExOTgyYw)
* ~~チームに参加できたら左メニューの「Channels」をクリックして「manabi-share」に参加してください。~~  
=>デフォルトで「manabi-share」に参加するよう設定しました

## 最後に
せっかく生きてるんだから毎日新しいことを学んで、みんなの力でみんなの人生を楽しく、豊かにしていきましょう！！
よろしくお願いします！！
ESXi 6.5 Update 1にはvsphere client（C#）で接続できない

vSphere 6.5 になってからvCenter ServerはC#のvsphere clientで接続できなくなったものの、ESXiについてはまだ接続できていました。

しかし、ESXi 6.5 Update 1 からはC#のvsphere clientで接続すると以下のポップアップが出力します。
<img width="283" alt="インストーラを実行.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/150727/68bd9823-1d61-41eb-b90e-2bae0edf4794.png">


ここで「インストーラを実行」や「インストーラを保存」をクリックすると以下のポップアップが出力します。
<img width="358" alt="更新の保存に失敗しました.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/150727/0a224152-ce43-b79a-8e94-5f2b73a39ada.png">

これについてはリリースノートに記載のとおり。

VMware ESXi 6.5 Update 1 リリース ノート
https://docs.vmware.com/jp/VMware-vSphere/6.5/rn/vsphere-esxi-651-release-notes.html
>Windows 用デスクトップ vSphere Client をインストールした後で ESXi ホストに接続すると、警告メッセージが表示される
>
>デスクトップ vSphere Client は vSphere 6.5 で廃止され、サポートされていません。
>ESXi 6.5 ホストに接続すると、次のような警告メッセージが表示されます。
>
>必要なクライアント サポート ファイルをサーバ「0.0.0.0」から取得して、
>インストールする必要があります。「インストーラを実行」をクリックするか、
>「インストーラを保存」をクリックします。
>
>この場合は、VMware Host Client を使用してホスト管理操作を実行します。 

ESXi 6.5 Update 1からはC#のvsphere clientはもう使えないみたいです。
SharePointワークフローで採番（稟議番号）機能を実現する方法を思いついた

#はじめに
SharePointでワークフロー開発したことがある人は皆思うと思いますが、なんか日本人の風習に合った標準機能が少ない:pensive:
その一つがワークフローを作成した際につきものの採番機能（稟議番号）。
ここではそれをちょっとしたアイデアでSharePointDesignerで実現する方法を思いついたのでご紹介。

#本題
今回の環境はSharePoint2013もしくはSharePoint online、SharePointDesigner2013にて2013形式のワークフローです。

１．まずSharePointDesignerで対象のサイトを開き、カスタムリストなどへの2013形式でワークフローを作成します。

２．採番するためのステージを設置し、アイテムへ項目を設定するアクションを選択し、値を設定したい項目を選択。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/200590/c7c2c264-9c84-5d76-e5f9-6eca2a9a4b3a.png)

３．ここがポイントです。私が思いついたのはカスタムリストのIDを使った方法です。
画像のように設定したい項目へ採番の先頭番号＋アイテムのIDを設定すれば連番でユニークな番号がその項目に設定されるようになります。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/200590/ecdef580-9ae9-575f-c1f5-8ca4ce2f1606.png)

タイミングとしてはIDは当たり前ですが新規作成フォーム時は付与されてませんので、新規作成でカスタムリストへアイテムが登録されてワークフローが走り出したときです。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/200590/bd61bbc5-ca83-9d6e-8166-4b51a3e1e5e4.png)



正当ではないかもしれませんので、他にアイデアがありましたらシェアをお願いしますm(__)m
それではありがとうございました。
ramda

http://qiita.com/akameco/items/e5bbefefd5940dff84d9
上記ramdaのpipeとcomposeの続き。

## R.always

```js
const t = R.always('Tee')
t() // => Tee
```

実装を見ると
https://github.com/ramda/ramda/blob/v0.24.1/src/always.js

```js
module.exports = _curry1(function always(val) {
  return function() {
    return val;
  };
});
```

なので常に引数を返す関数

`a -> (* -> a)`

## R.T

常にtrueを返す関数

`* -> Boolean`

## R.concat
Array#concatとの違いは、型が違うとエラーを起こす
また、文字列の合成を行う。

R.pipeして最終的にconcatに繋げる。
concatに繋げるときに`R.__`を使うと合成出来て便利

## `R.__`
```js
{'@@functional/placeholder': true};
```

ここに引数が挿入される

```js
var hello = R.concat(R.__, ' hello')
hello('world') // => world hello
```

## R.path
オブジェクトの要素を取り出すのに便利
新しいプロポーサルの?と似たようなもの。

## どんなときramdaを使うか

一部じゃなくて、ガッツリ全体で使うようにするとよさそうです。

```js

import R from 'ramda';

const API_CORS = 'https://hogehoge.now.sh';
const API_ORIGIN = 'https://hogehgoeorig.now.sh';

const getFetchURL = R.pipe(
  R.path(['location', 'hostname']),
  R.cond([
    [R.test(/mywebsite\.com/), R.always(API_ORIGIN)],
    [R.T, R.always(API_CORS)],
  ]),
  R.concat(R.__, '/graphql'), // eslint-disable-line
);

export default getFetchURL;
```

上記は`windows`オブジェクトを引数にして、対象のURLを生成する関数です。
`R.pipe`によって関数を適用した結果を後ろに流し、`R.cond`がif/switchの代わりとなり、`R.concat`が最終的に文字列を合成します。

## まとめ

別に使わなくても書けますが、これを使うと上記のようにifやswitchなどいらずに書けるのは利点と言えるのではないでしょうか？
まあ、個人的にはこれが依存に入っているブラウザ向けライブラリはサイズ的に使おうとも思いませんが。

ともあれ、ライブラリ向けというよりアプリケーション向けのライブラリであることは確かでしょう。関数型言語が得意な人にとってはいいのかもですね。しかし、最近のOSSでは、これが使われている実装が多く、少なくとも代表的な関数は覚えておいて損はないでしょう。
[Julia] miniconda 3 を導入させるように指定した (= PyPlot が正しく動いた)

# 結論

環境変数 `CONDA_JL_VERSION=3` を設定してから、Juliaを起動します。
あるいは、Julia のコマンドライン (REPL) から

```julia
julia> ENV["CONDA_JL_VERSION"]=3
3

julia> Pkg.add("PyCall")

```

なお、何かのパッケージを導入済みの場合は、それらを全部消去してから、`Pkg.add`してみてください。　（Mac だと、ホームディレクトリ直下の `.julia` ディレクトリ以下に、Juliaが導入したふファイルがあります。）


# 説明

Julia の現行版 0.6 の MacOS, Windows バイナリで、2次元グラフ描画パッケージ  `PyPlot` が絵を描かなくなりました。

これは、PyPlotが想定する matplot のバージョン違いが理由です。　
Julia がデフォルトで内部に導入する Python環境は miniconda 2で、これに含まれる　`matplotlib` はバージョン 1.5系です。しかし、現行の `PyPlot` は `matplotlib` 2.0系を要求します。

冒頭の指定は、miniconda 3 を内部に導入するように指定するものです。miniconda 3 に含まれる matplotlib は 2.0系ですから、これを指定してから追加した `PyPlot` はちゃんと動作します。

ところで、Julia 0.6 のバージョンアップで、多くのパッケージが影響を受けたようですね。
Mastodon のSSL証明書の有効期限確認

# TL;DR

マストドンのSSL証明書（Let's Encrypt）の有効期限を確認するには、`root`で下記２コマンドを実行します。`sample.com`は自分のドメインに変えてください。

```
DOMAIN=sample.com
openssl s_client -connect ${DOMAIN}:443 < /dev/null 2> /dev/null | openssl x509 -text | grep "Not "
```
上記を実行すると下記のような取得日、有効期限が返されてきます。

```
  Not Before: Jul 22 14:45:00 2017 GMT
  Not After : Oct 20 14:45:00 2017 GMT
```

# 手動更新

上記で有効期限の自動更新が不安な場合は手動更新してみてください。

```
/usr/local/certbot/certbot-auto renew --standalone --pre-hook 'systemctl stop nginx' --post-hook 'systemctl start nginx' --force-renew
```
# Cronの自動更新設定

```
echo "$((${RANDOM}%60)) $((${RANDOM}%24)) * * $((${RANDOM}%7)) root /usr/local/certbot/certbot-auto renew --standalone --preferred-challenges tls-sni-01 --pre-hook 'systemctl stop nginx' --post-hook 'systemctl start nginx'" > /etc/cron.d/certbot-auto
```

# 参考文献

- 『スタートアップスクリプト「Mastodon」の更新のお知らせ・2017/7/10 12:00以前にスクリプトを使用して作成されたインスタンス向けの作業のお願い | さくらのクラウドニュース』<br>https://cloud-news.sakura.ad.jp/2017/07/10/mastodon-startupscript-update-4/
iOS11でUIBarButtonの位置がずれる問題


iOS10以下とiOS11ではUIBarButtonがずれてしまう。。

今までh16ptだったところが8ptsになってしまったようです。


一旦は以下のようにforStateにUIControlStateNormalで対応


```Objective-C
if (@available(iOS 11.0, *)) {
        [barbutton setTitle:@"  " forState:UIControlStateNormal];
}
```

参考：
https://forums.developer.apple.com/thread/80075
Google App Maker ー 実行時のURLパラメータについて

App Maker で PREVIEW 表示をしたときは次の画像のようにデバッグ用の画面になる。
これは PREVIEW だからというよりかは、URLパラメータにある `console` と `devConsoleProjectId` というのが関係している。
これを理解すると PREVIEW でも本番同様の画面を確認したり、本番環境でデバッグ画面が出せるのでしっかり理解しておきたい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/d2c9ddec-5d01-a366-c4f3-8be4b338e6e5.png)


そもそも App Maker ってなに？という人は、以下の記事を参照してください。
[Google App Maker とは？ 短期間で Web アプリケーション構築を可能にした理由](https://www.topgate.co.jp/what-is-google-app-maker)

# console パラメータ
`console=1` を指定することで画面上部のページ切り替えと画面下部のコンソールを表示している。

そのため `console=0` や `consoleを指定しない` と次のように消すことが出来る。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/2cf56ed1-c63b-e450-1e07-d9a2b412deda.png)



# devConsoleProjectId
`devConsoleProjectId={projectID}` を指定することで `Server Logs` を開くURLを画面下部のコンソールに表示している。

そのため `devConsoleProjectIdを指定しない` と次のように消すことが出来る。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/485d96d5-aab6-2c71-5573-0f58e133d869.png)
not import Firebase SDK

## なぜ起きたか
久々にfirebaseを触ったら、`firebase serve`で`not configured and imported the Firebase SDK.`と言われた。

`deploy`してるアプリは問題ないので試しにローカルファイルをdeployすると、Hostingしているアプリ側でも発生。

## ぐぐった
Stack Overflowにたどり着く。
[How do I configure the Firebase SDK for the codelab?](https://stackoverflow.com/questions/38414815/how-do-i-configure-the-firebase-sdk-for-the-codelab)

>You just have to paste the initialization snippet from: Firebase Console > Overview > Add Firebase to your web app in index.html file in web-start folder.

OverviewのFirebaseの情報を`index.html`に貼り付け直すと良いらしい。

## なおった
`serve`も`deploy`もエラーがなくなった。
バージョンにかなり開きがあったみたい。
`3.6.4`から`4.3.1`になった。
備忘録としてご参照ください。
Poloniexで1週間前にどの仮想通貨を買っておくべきだったか一目でわかるようにする

# 環境

```
- MacOS Sierra 10.12.6
- Python 3.5.3 :: Anaconda 4.4.0 (x86_64)
- Jupyter 4.3.0
```

# 背景
- ここ数ヶ月、Bitcoinよりも値上がりすることを期待して色々なアルトコイン（Bitcoin以外の仮想通貨）を売買してきたが、振り返ってみると最初に**Bitcoinを買ってそのままにしておいた方が儲かっていた**ことに気づいてしまった。

# 問題
- 仮想通貨は種類が多い上、ほとんどは日本円や米ドルではなく、Bitcoinとしかペアで購入できないため、パフォーマンスがわかりづらい。
- 仮想通貨は価格帯がバラバラ（2017年9月現在Bitcoinは45万円前後、Rippleは22円前後、など）のため、横並びでパフォーマンスを比較しづらい。

# 解決
- 価格ではなく騰落率にフォーカスするため、パフォーマンスを比較したい複数の仮想通貨について、ある時点の価格を０に揃えてそこからの騰落率をチャートにした。
- **作成したものはこちら（チャートは10分おきに更新）：**https://cryptocurrencynews.hatenablog.com/

# 仕様
- pandas、matplotlib、poloniexなど必要となるモジュールをインポート

```py3
import pandas as pd
from pandas import Series,DataFrame
from datetime import datetime
import time
import matplotlib.pyplot as plt
from matplotlib.pylab import rcParams
%matplotlib inline
import seaborn as sns
sns.set_style('whitegrid')
rcParams['figure.figsize'] = 20, 10
# PoloniexのAPIを使うためのモジュール
import poloniex
```

- PoloniexのAPIを使って過去1週間分の30分毎の価格を取得（下記はBTCのみ記述、他の仮想通貨も同様）

```py3
polo = poloniex.Poloniex()
#過去7日間の価格を取得
d = 7
#30分毎の価格を取得（単位は秒）
p = 1800
#Poloniexより価格を取得
btc_chart_data = polo.returnChartData('USDT_BTC', period=p, start=time.time()-polo.DAY*d, end=time.time())
btc_df = pd.DataFrame(btc_chart_data)
```

- 取得した価格より騰落率を算出（下記はBTCのみ記述、他の仮想通貨も同様）


```py3
#直前の値からの騰落率を算出
btc_list = [0]
j = len(btc_df.index) - 1
for i in range(j ):
    l = (float(btc_df['close'].iloc[i + 1]) / float(btc_df['close'].iloc[i ]) -1) * 100
    btc_list.append(l)
#最初の時点から通しの騰落率を算出
m = 0
btc0_list = []
for i in range(j):
    m = m + float(btc_list[i])
    btc0_list.append(m)
btc_losers_df = pd.DataFrame(btc0_list)
```

- 各仮想通貨の1週間前からの騰落率を一つのチャートに表示（下記はBTCのみ記述、他の仮想通貨も同様）

```py3
#BTCの騰落率をチャートに表示
plt.plot(btc_losers_df.astype(float), label = 'BTC')
#他の仮想通貨についても同様に記述（plt.plot(eth_losers_df.astype(float), label = 'ETH')　...など）
plt.legend(loc='best',
           fontsize=14,
           borderaxespad=0.,)
plt.tick_params(labelsize=14)
#生成したチャートを画像として保存
plt.savefig("/var/www/html/all.png")
plt.show()
```

- 表示されるチャート（PoloniexでUSDTとペアで取引されている12種類の仮想通貨の1週間前からの騰落率を比較した場合）
![チャート](https://cdn-ak.f.st-hatena.com/images/fotolife/o/occha/20170908/20170908222415.png)

# まとめ
- 上記チャートの例からは、1週間前に**BCHかLTCを購入しておけば10~15%前後の利益を得られていた**ことなどが読み取れる。
- 時期によってはBTCとアルトコインの相対的な値動きが激しいため、これを意識してBTC建てでの売買を行うことで、日本円を投入せず既に持っているBTCの枚数を増やすことができる可能性がある。
- **現時点のチャートはこちら（チャートは10分おきに更新）：**http://www.cryptocurrencies.tokyo/
機械学習でニュースからカテゴリを推定するサイトを作った話

# サイト

http://news-predict.turai.work/

テキストエリアにニュースの本文を入れて判定ボタンをクリックすると、「国内」「海外」「IT/経済」「スポーツ」「芸能」のうち、一番近いカテゴリを出力するサイトを作りました。

50000件のニュース記事を学習させて、テストを回したときは93.2%の正答率だったので、そこそこ精度はあるはず。

![screenshot-news-predict.turai.work-2017-09-16-14-24-46-495.png](https://qiita-image-store.s3.amazonaws.com/0/107001/28c18776-08c2-5422-552f-30d3c6565785.png)


# 実装

Facebookが無料で公開している自然言語の機械学習ツールことFasttextを使いました。

[facebookresearch/fastText: Library for fast text representation and classification.](https://github.com/facebookresearch/fastText)

これは**pythonのツールではなくバイナリのコマンド**なので、前処理さえしてしまえばPythonのコードを一切書かずに文章のカテゴリ推定ができます。

大まかな手順は以下

1. 某ニュースサイトから記事をせっせとスクレイピング
2. 文章をMecabで名詞だけ抽出し、分かち書きをしてfasttextが読める形に加工
3. 記事50000件のうち、１カテゴリにつき9000件を学習用、1000件をテスト用に
4. fasttextで学習
5. 出来上がったモデルでテスト

学習自体は速く、１０分程度で終わります。（もちろんスペックにもよりますが）

# fasttextについて

インストールはcloneしてmakeするだけ

```
$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ make
```

fasttext自体には色々機能があるのですが、ここでは文章分類に絞って述べます

まずfasttextが読み込める形に文章を加工します。形式は以下の通り

```
__label__ラベル名 , 単語をスペース区切りにした本文
```

ここでは学習用のテキストを`news_train.txt`,テスト用を`news_test.txt`とします。例えばnews_train.txtはこんな感じです。

```news_train.txt
__label__sports , 陸上 日本 学生 対校 選手権 福井 県営 陸上 競技 場 日...
__label__dom , 国会 首相 ....
```

これをfasttextに読みませて学習します。

```
./fasttext supervised -input news_train.txt -output news -dim 100 -lr 0.1 -wordNgrams 2 -minCount 1 -bucket 10000000 -epoch 300 -thread 4
```

細かいパラメータは公式ドキュメントが一番詳しいので割愛（

学習が完了すると同一ディレクトリに`news.bin`と`news.vec`ができているはずです。

今度はそれを使って精度を検証します。

```
./fasttext test news.bin news_test.txt
```

機械学習の細かい実装をしなくてもサクッと文章分類できるので、fasttextもっと広まってもいんじゃないかと思いました。（こなみ）
シチュエーション別mysqldump活用法

Webサービスを運用していると、本番からデータを取ってきてローカルやステージング環境で再現したい、という場面がよくあります。
そんなときに使えるmysqldumpのTipsです。


## 基本形
```
$ mysqldump -u [ユーザー名] -p -h [ホスト名] [データベース名] [テーブル名] > [ダンプファイル名]
```

[テーブル名]はスペースで区切って複数のテーブルを記載可能です。
[テーブル名]を省略するとデータベース内の全テーブルを作成する構文を作ります。

## 取得データを取り込む
ダンプしたデータは以下で反映します。

```
$ mysql -u [ユーザー名] -p -h [ホスト名] [データベース名] < [ダンプファイル名]
```

## 既存のテーブルにデータを追加する
既存であるデータを壊さずに、データだけ追加したいときです。

```
$ mysqldump -u [ユーザー名] -p -h [ホスト名] [データベース名] [テーブル名] -t --insert-ignore > [ダンプファイル名]
```

`-t`でCREATE TABLE文を作りません。
`--insert-ignore`はinsert時に主キーやユニークインデックスの値が同じデータがすでにある場合、該当データのinsertをスキップします。

## 既存のテーブルのデータを置き換える
ローカルにあるテーブルをまるっと本番に置き換えたい時に便利です。

```
 $ mysqldump -u [ユーザー名] -p -h [ホスト名] [データベース名] [テーブル名] -t --replace > [ダンプファイル名]
```

`--replace`で主キーやユニークインデックスの値が同じデータがすでにある場合、上書きします。


## ある条件を満たすデータのみダンプする
select文のwhere構文と似たオプションを仕様してダンプするデータを絞込できます。

```
 $ mysqldump -u [ユーザー名] -p -h [ホスト名] [データベース名] [テーブル名] --where'id=1' > [ダンプファイル名]
```

`--where`にWHERE構文で使用する条件を設定します。


## ダンプデータを圧縮する
gzipでファイルサイズを圧縮し扱いやすくします。ダンプファイル名の拡張子はgzで。

```
$ mysqldump -u [ユーザー名] -p -h [ホスト名] [データベース名] [テーブル名] | gzip > [ダンプファイル名]
```

## ダンプしたsqlを実行したらエラーが出たときのデバッグ用ダンプ
データの取り込み先でエラーが出た場合はエラー箇所をエディタで調べますが、そんなときはダンプデータが見やすい形式になっていると良いです。


```
 $ mysqldump -u [ユーザー名] -p -h [ホスト名] [データベース名] [テーブル名] -t -c --extended-insert=FALSE --where='id=1' > [ダンプファイル名]
```

`-c`でINSERTにカラム名を含めます。
`--extended-insert=FALSE`デフォルトだとINSERT構文は全テーブルデータを1つのINSERTでやってしまいますが、1行が長くなってしまいます。
これを防ぐためにします。
さらに、エラーになったレコードのみ`--where`で絞り込みます。


## テーブル定義のみ出力する
データを作成したくない時は`-d`です。

```
 $ mysqldump -u [ユーザー名] -p -h [ホスト名] [データベース名] [テーブル名] -d  > [ダンプファイル名]
```

## データの件数を制限する

テスト用に最初の10件だけ欲しい場合。`--where`を使って制限します。
`--where=true`でwhereをスキップするとLIMIT句が使えます。


```
 $ mysqldump -u [ユーザー名] -p -h [ホスト名] [データベース名] [テーブル名] --where='true LIMIT 10' > [ダンプファイル名]
```


## csvで出力する

```
 $ mysqldump -u [ユーザー名] -p -h [ホスト名] [データベース名] [テーブル名] --tab=/tmp --fields-terminated-by=,
```

`--tab=ディレクトリ名` ディレクトリ指定構文で、csvのときは必須。
`--fields-terminated-by=,` 区切り文字を指定します。

--tabで指定したディレクトリ内に[テーブル名].txtのファイルが置かれます。リダイレクトは指定しません。


tsv形式で出力したい場合は`--fields-terminated-by=,`の指定をなくせばOKです。

また、値を囲いたいときは`--fields-enclosed-by`を使用します。
`--fields-enclosed-by="\""`と指定してダブルクウォートで値を囲みます。


## データベース全体をすべてダンプする
定義も含めてすべてダンプします。

```
$ mysqldump -u [ユーザー名] -p -h [ホスト名] –all-databases > [ダンプファイル名]
```


# 参考

[DBAのためのmysqldumpのtips 25選 | Yakst](https://yakst.com/ja/posts/1355)
SICP読書女子会 #42 (3.2.1)

## 3.2

実行した関数が作る環境について?

### Ex 3.9

#### 再帰バージョン
```lisp
(define (factorial n)
	(if (= n 1) 1 (* n #?=(factorial (- n 1)))))
```

##### Trace
```sh
CALL factorial 6
#?="./ex3.9.scm":2:(factorial (- n 1))
  CALL factorial 5
#?="./ex3.9.scm":2:(factorial (- n 1))
    CALL factorial 4
#?="./ex3.9.scm":2:(factorial (- n 1))
      CALL factorial 3
#?="./ex3.9.scm":2:(factorial (- n 1))
        CALL factorial 2
#?="./ex3.9.scm":2:(factorial (- n 1))
#?-    1
        RETN factorial 2
#?-    2
      RETN factorial 6
#?-    6
    RETN factorial 24
#?-    24
  RETN factorial 120
#?-    120
RETN factorial 720
```

#### 反復バージョン
```lisp
(define (factorial n) (fact-iter 1 1 n))
(define (fact-iter product counter max-count)
	(if 
		(> counter max-count)
		product
		(fact-iter (* counter product) (+ counter 1) max-count)))

```

##### Trace

```sh
CALL factorial 6
RETN factorial 720

```

#### 解答ver1
<img src="https://github.com/cocodrips/SICP/raw/master/3.2/3.2.2/ex3.9.jpg">



#### Ex.3.9 修正

**誰が読んだかは関係なくて、その関数の空間が何をみてるかを指してる**


```lisp
(define (factorial n) (fact-iter 1 1 n))
(define (fact-iter product counter max-count)
(if (> counter max-count)
product
(fact-iter (* counter product)
(+ counter 1)
max-count)))
```
は

- global <- factorial
- global <- fact-iter

例えば

```lisp
(define (a x)
    (define (b y) '1)
    (define (c z) '2)
)
```

```
global <- a <- b
          ↑c
```
b,cはaが見えてるし, globalも見えてる

1. `(a 1)` を呼ぶと, その時に１つ新しいフレーム (E1) ができて, E1 -> global と, 引数用の x = 1 で初期化される.
2. (a 1) の実行ステップが (define (b x) ...) にたどり着くと, E1 の中に b っていう名前が増える この時はフレームは増えない

つまりこんなかんじ
<img src="https://github.com/cocodrips/SICP/raw/master/3.2/3.2.2/ex3.9-1.jpg" width=50%>

なので・・・
#### 解答ver2

<img src="https://github.com/cocodrips/SICP/raw/master/3.2/3.2.2/ex3.9-2.jpg">
git diffでパワポの差分比較を出来るようにする(Windows)

# パワポに対してgit diffを使いたい
パワポはバイナリファイルなので、普通のプログラミングファイルみたいに文字列の差分が取れない。
でもやっぱり差分比較はどうしても欲しい。
と、パワポをGitで管理している筆者は思いました。
（参考）[発表用のスライドをGitで学会ごとにブランチで管理(Power Point)](http://qiita.com/kyusque/items/fd7a2287662298b9b949)

# （方法）パワポを文字列情報に変換後、差分を取る
git diff には特定の拡張子の場合、差分を取る前に任意のプログラムを通すことが出来ます。
そのため、バイナリファイルを文字列情報に変換するようなプログラムに通してやれば、バイナリのファイルでも文字列として差分比較が可能になります。


# apache tikaでパワポの文字列情報を抽出する

とりあえずやり方だけ

拡張子の表示と隠しフォルダの表示はさせておいてください。

http://archive.apache.org/dist/tika/ からtika-app-1.14.jarというファイルをダウンロードします。（tika-app-1.15.jarやtika-app-1.16.jarだと要らない警告が出た）
ダウンロードしたファイルを好きな場所に置きます。（今回はC:\Program Files\Git\binに置きました）

ユーザーフォルダ（C:\Users\kyusqueみたいな場所）に.gitattributesファイルを作成後、

```
*.pptx diff=pptx
*.PPTX diff=pptx
```
という行を書き込んで保存します。

次に、ユーザーフォルダ上の.gitconfigを編集します。

```
[core]
  attributesfile = ~/.gitattributes

[diff "pptx"]
  binary = true
  textconv = java  -Dfile.encoding=UTF-8 -jar 'C:\\Program Files\\Git\\bin\\tika-app-1.14.jar' -t 

```

これによって、拡張子ごとの処理の情報が書かれた.gittattributesファイルを読み込み、それに対する文字列変換をどうするか設定できます。

この状態でgit diffをすれば無事、パワポを差分比較できるようになるはずです。

# 参考
[git diff で Office ファイルの差分を見る](http://qiita.com/shuhei/items/6a18d968051378d7ac1a)
[Git ExtentionsでOffice文書の差分表示](https://www.kimurak.net/wordpress/git/2583/)
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 第ニ章 コミニュケーションと言語の使い方11

# 説明のためのモデル(補足)

昨日の[記事](http://qiita.com/YasuhiroKimesawa/items/a1c9e3c84ede15290c55)の補足です。

説明のためのモデルの箇所、読んでもよくわからないと記事を書きましたが、Guildworksの増田さん(@masuda220)からご指摘をいただきました!

>「説明用のモデル」は三章「モデルと実装を結びつける」と関係しますね。ドメインを抽象化(モデル化)する方法はたくさんある。いろいろなモデルの中から設計と一致するモデルを選ぶ。設計と一致しないモデルも、ドメインの説明やドメインを学ぶ教材としては役に立つことがある。
https://twitter.com/masuda220/status/906925695665815552

ご指摘いただいて、さらにもう一度読み直してやっと理解できました。

つまり、やはりモデルは**１つだけ**。 
> 本書の要点は、実装、設計、そしてチーム内のコミュニケーションの根底にあるモデルは１つだけであるべきだ、ということである。(第一部 第二章より)

ただ、多くの実験や蒸留を繰り返すなかで、実装には適用しなかった、**設計と一致しないモデル**も出てくる。
> 他のモデルが必要とされる特別な理由の１つはスコープだ。・・・厳密に刈り込み、機能を満たす上で必要な最小限のものにしなければならない。(第一部 第二章より)

それら設計と一致しなかったモデルもドメインの説明やドメインを学ぶ教材として役に立つことがある。
> モデルは、ドメインについての教材としても価値を持つことがある。(第一部 第二章より)

ということでした。
エリック本は、こういう読んでもわかりにくいところが多く、挫折する人も出てくるわけですが、なんとか頑張って最後まで読んでいきます！

アドバイスいただきました増田さん、本当にありがとうございます！
Truffle でイベントを監視する

ここを読みましょう。
[Interacting with your contracts - Truffle](http://truffle.readthedocs.io/en/beta/getting_started/contracts/)

```app.js
window.App = {
  start: function() {
    const self = this;

    // Catching events
    self.catchEvents();
    });
  },

  catchEvents: function() {
    MetaCoin.deployed().then(instance => {
      const transfers = instance.Transfer({fromBlock: 'latest'});
      transfers.watch((error, result) => {
        if (error == null) {
          console.log('Transfer:', result.args);
        }
      });
    }).catch(e => {
      console.log(e);
    });
  }
};
```

出力例

```js
{
  from: "0xb2743d3f9d650b69624034a9b7c63a0151658d9b",
  to: "0x4cbca99431f5c26efa0d9bcbd35cb4db525ab8eb",
  value: BigNumber {s: 1, e: 2, c: Array(1)},
}
```
PackerでLaunch Configuration作るPlugin書いた

私はTerraformとPackerをよく使います。
しかしAutoScalingとLaunch Configurationの関係でいつも困ります。
卵が先か鶏が先かみたいな話で依存関係があります。
私はTerraformでLaunch Configurationを管理するのに疲れました。

そして別のアプローチ方法を取ることにしました。
それが今回作った、 [packer-post-processor-amazon-launchconfiguration](https://github.com/a4t/packer-post-processor-amazon-launchconfiguration) になります。
このプラグインはPackerのpost-processorの部分でLaunch Configurationを作成することができるプラグインです。
そしてオプションとしてAuto Scaling GroupのLaunch Configurationの値を更新することができます。
AMI作成 -> Launch Configuration作成 -> Auto Scaling Groupの更新が一つのJSONファイルで管理できます。
CIとも相性が良いように今後改善していきたいです。


https://github.com/a4t/packer-post-processor-amazon-launchconfiguration

## Packerで管理することで変わること
TerraformとPackerを使った構成でよくある課題

- Packerで作成したAMIをtfファイルに反映させる方法
- UserData変わった際にLaunch Configurationが再作成されるが、Auto Scaling Groupとの依存関係

AMIは頻繁に更新した方がいいです。
OpenSSLの脆弱性とかあった際にはインスタンスの再起動がない場合、アップデートが反映されません。
気軽にLaunch Configurationは更新できるようにしておきたいです。
毎デプロイごとにAuto Scaling Groupを更新してもいいかもしれません。
Terraformで管理する場合はAMI作成 -> tfファイルにAMI反映という流れでしたが、その手間がなくなります。

## 使い方

こちらは基本的なAMI作成時のPackerのJSONです。

```
{
  "builders": [{
    "type": "amazon-ebs",
    "vpc_id": "vpc-xxxxxxxxxx",
    "subnet_id": "subnet-yyyyyyyyyy",
    "region": "ap-northeast-1",
    "source_ami": "ami-4af5022c",
    "instance_type": "t2.micro",
    "ssh_username": "ec2-user",
    "ami_name": "my-service-{{timestamp}}"
  }]
}
```

これに+αでこのような値を追加します。

```
{
  "builders": [{
  .
  .
  .
  }],
  "post-processors":[{
    "type": "amazon-launchconfiguration",
    "config_name_prefix": "my-service-",
    "instance_type": "c4.large",
    "keep_releases": 3
  }]
```

こちらの設定を簡単に説明すると

- type
  - plugin名
- config_name_prefix
  - Launch ConfigurationのPrefix、Prefixの後ろに作成時日付が入る(例: my-service-20170911075353)
- instance_type
  - 説明不要
- keep_releases
  - Launch Configurationのrotateの設定、config_name_prefixの後ろを見て古い方から削除していく

## Auto Scaling Groupの更新
Auto Scaling Groupの更新は追加でオプションをつけます。

```
  "post-processors":[{
    "type": "amazon-launchconfiguration",
    "config_name_prefix": "my-service-",
    "instance_type": "c4.large",
    "keep_releases": 3,
    "auto_scaling_group_names": [
      "my-autoscaling-1",
      "my-autoscaling-2"
    ]
  }]
```

## Pluginの導入方法
ここから自分にあった環境を拾ってきてください
https://github.com/a4t/packer-post-processor-amazon-launchconfiguration/releases

そしてPATHの通ったところに packer-post-processor-amazon-launchconfiguration を配置してください
~/.packer.d/plugins が最善かと思います。

## おまけ
AMIもRotateしてどんどん削除した方がいいと思うので、こちらも使うといいかもしれません。
http://tech.sideci.com/entry/2016/08/18/130609

packer-post-processor-amazon-launchconfiguration
https://github.com/a4t/packer-post-processor-amazon-launchconfiguration
GitHub事始め


GitHub始めました〜夏〜
ということで、自分のためにGitHubのコマンドのメモを残しておきます。


###Gitにメールアドレスを登録する

```bash
$ git config --global user.name "Firstname Lastname"
$ git config --global user.email "your_email_address@gmail.com"
```

ここで設定した名前とアドレスはGitのログに残るので、公開してもいい感じのものにします。


###CUIでGitHubにリポジトリを作成する

```
$ mkdir repos_name  #|ローカルにGit用のディレクトリを作成
$ cd repos_name     #|カレントディレクトリにして
$ git init .        #|ディレクトリにリポジトリを作成
$ hub create  #カレントディレクトリの名前でGitHubにリポジトリを作成
$ git remote -v  #設定したリモートサーバのURLを確認
  origin  git@github.com:username/repos_name.git (fetch)
  origin  git@github.com:username/repos_name.git (push)
$ hub browse  #リポジトリをブラウザで確認
```


###ファイルをGitHubに上げる

```
$ vim readme.md  #GitHubに上げるファイルを作成
$ git add .  #ファイルをインデックスに登録
$ git commit -m "first commit"  #インデックスに追加されたファイルをコミットする
$ git push origin master  #GitHubにプッシュする
```

###ファイルを削除する

```
$ git rm -r test.py  #ローカルのリポジトリからファイルを削除
$ git commit -m "Remove File"  #削除をコミットする
$ git push origin master  #削除をGitHubにプッシュする
```
Scalaのフォーマッティングツール scalafmt導入

scala関西summitで気になったので導入だけやってみた備忘録

ドキュメントは[こちら](http://scalameta.org/scalafmt/)

# intellij
scalafmtのプラグインを入れるだけ。
Command(⌘) + Shift(⇧) + Lでファイルのフォーマットを実行。

フォルダで実行するとフォルダ以下、ファイルで実行するとファイル以下を実行してくれます。

# sbt 0.13
公式のsbtプラグイン「sbt-scalafmt」があるが、0.13に対応していない模様。
非公式の「[neo-sbt-scalafmt](https://github.com/lucidsoftware/neo-sbt-scalafmt)」があります。
使ったレポート送ってくれたら公式にする可能性あるよって言ってます。

以下は公式の方の「sbt-scalafmt」を何とか使う方法です。

```scala:project/plugin.sbt
libraryDependencies += "com.geirsson" %% "scalafmt-bootstrap" % "0.6.6"
```

```scala:build.sbt
def latestScalafmt = "1.2.0"
commands += Command.args("scalafmt", "Run scalafmt cli.") {
  case (state, args) =>
    val Right(scalafmt) =
      org.scalafmt.bootstrap.ScalafmtBootstrap.fromVersion(latestScalafmt)
    scalafmt.main("--non-interactive" +: args.toArray)
    state
}
```

以下実行方法です。

## ヘルプ
```
sbt "scalafmt -help"
```
## テスト(フォーマットはしない)
```
sbt "scalafmt --test"
```
##フォーマット実行
```
sbt scalafmt
```

お試しあれ。
Delphi / C++Builder Starter Edition (無償) 最新版 10.2.1 Tokyo Release 1 提供中

#Delphi / C++Builder Starter Edition (無償) 最新版 10.2.1 Tokyo Release 1 提供中
Delphi / C++Builder Starter Edition の無償公開から早くも1年が経とうとしています。当初は開発者向けの[Webセミナー「Boot Camp」(ブートキャンプ)](https://community.embarcadero.com/blogs/entry/delphi-boot-camp-delphi-starter-edition-japan)を実施するにあたり、実際に手を動かして使ってみていただける開発環境として、期間限定にて無償公開したわけですが（以前は約30,000円の有償提供品）、そのBootCampが好評で参加者も多く、また、ユーザーの皆様から、無償提供の継続を強く望まれたこともあり、[無期限の無償提供を決定](https://community.embarcadero.com/blogs/entry/delphi-c-builder-10-1-berlin-starter-edition-japan)したわけであります。



##最新版 Starter Edition 10.2 Tokyo Release 1   
無償提供開始時のバージョンは10.1 Berlinであったわけですが、その後、バージョンが新しくなり、10.2 Tokyoとなりました。そこでもStarter Editionの無償提供は停止せず、今も継続して入手可能であります。
現在は10.2の最新更新版であるTokyo 10.2 Release 1 が出ておりますが、Starter Edition も同じく 10.2 Release 1へ更新されています。ダウンロードはこちらから

* Delphi Starter Edition: https://www.embarcadero.com/jp/products/delphi/starter/promotional-download
* C++Builder Starter Edition: https://www.embarcadero.com/jp/products/cbuilder/starter/promotional-download

インストール方法に関してはこちらの記事をご参照ください。

* [Starter Edition ユーザーのための Delphi / C++Builder 10.2 Tokyo Starter Edition (無償！) 入手ガイド](https://community.embarcadero.com/blogs/entry/starter-edition-delphi-c-builder-10-2-tokyo-starter-edition-japan)

##Starter を使って学ぼう!
Starter Editionを無償提供してから、さまざまな学びのコンテンツを提供してまいりました。これらコンテンツをご覧いただき、ビジュアル開発の初歩から、手法、ヒント、さらには言語までさまざまなスキルを身に着けることができます。

* [Delphi Boot Camp](https://community.embarcadero.com/blogs/entry/delphi-boot-camp-delphi-starter-edition-japan)
* C++Builder Boot Camp: [Day1](https://community.embarcadero.com/blogs/entry/c-boot-camp-c-br-day1-c-builder-japan), [Day2](https://community.embarcadero.com/blogs/entry/c-boot-camp-c-day2-c-builder-ui-japan), [Day3](https://community.embarcadero.com/blogs/entry/c-boot-camp-c-day3-c-builder-c-japan)
* [【Delphi / C++Builder Starter チュートリアルシリーズ】シーズン１](https://community.embarcadero.com/blogs/entry/delphi-c-builder-starter-japan)
* [【Delphi / C++Builder Starter Edition チュートリアルシリーズ】 シーズン2](https://community.embarcadero.com/blogs/entry/delphi-c-builder-starter-edition-2-japan)
* **【オススメ】** [**第33回デベロッパーキャンプ Starterユーザーのためのアップグレードしやすいアプリ構築術**](https://community.embarcadero.com/blogs/entry/33-b2-japan)

特に最後の「アップグレードしやすいアプリ構築術」はちょっと面白いコンテンツです。
Starter Editionは Win32 が開発対象プラットフォームとなっていますが、様々な画面サイズ、縦横比、縦横回転にも対応できるマルチデバイス向けのUI配置設定ができます。またこのような設定をしておけば、今後、iOS向けや、android向けに対応OSを広げるときには、そのプロジェクトをそのまま利用するか、もしくはごく少ない変更で利用できることでしょう。

以上、無償版 Delphi / C+＋Builder Starter Edition のご紹介と スタディコンテンツでした。
libGdxのTexturePackerでSuffixがtrimされてしまう問題

# 問題点
- libGdxのTexturePackerを使った
- button_1.png, button_2.png の様な `名前_数字.png` ファイルが `名前.png` に纏まってしまった
    - 全く別の画像なのに・・・
    - アンダーバー(アンダースコア)使わない形に一括リネームはしたくない

#　原因
- ファイル名末端の `_数字` はデフォルトの動作で 「index」と見做され、整理されることが原因

#　解決方法 
- nightlyの方を使用し設定情報を渡す
 - パッキング設定を `config.json` の様な名前で作成し、引数で渡す

```json:config.json
{
"useIndexes":false
}
```

- 実行する

```
java -cp gdx.jar:gdx-tools.jar com.badlogic.gdx.tools.texturepacker.TexturePacker src dst result config.json
```

- その他、乗算済みアルファの切り替えなども可能な様です
    - https://github.com/libgdx/libgdx/blob/master/extensions/gdx-tools/src/com/badlogic/gdx/tools/texturepacker/TexturePacker.java#L573
rubyのinclude moduleでパラメータを渡す


## sample1 

```ruby
module Examples
  module MixInSay1
    def self.included(base)
      base.define_singleton_method :define_greeter do |method_name, output|
        # A dynamically defined method that dynamically defines another
        # method. What a crazy world!
        define_method(method_name) { output }
      end
    end

    def say
      # puts :test
      puts config[:info]
    end
  end


  class MyIncludeParam1
    include MixInSay1
    # define_greeter :config, 'Good morning, '
    define_greeter :config, {test: '1', info: 'good.'}

  end
end
Examples::MyIncludeParam1.new.say
```
### 感想
なんかinclude MixInSay1と
define_greeterの関係が嫌。  

## sample2 
```ruby
module Examples
  class MixInSay3 < Module
    def initialize(config)
      @config = config
      define_methods
      freeze
    end

    private

    def define_methods
      define_say_method
    end

    # sayメソッド追加
    def define_say_method
      config = @config
      define_method(:say) do | |
        puts config[:info]
      end
    end

  end


  class MyIncludeParam3
    include MixInSay3.new({test: '1', info: 'good.'})
  end
end
Examples::MyIncludeParam3.new.say
```

### 感想
~~sayの補完が効かない。~~
module名でのミス。

### まとめ
まだruby初めて3ヶ月なので暖かく見てほしい・・・
- MyIncludeParam3の書き方でMixInSay1の補完ができるようなのが理想。
- そもそもrubyでこういう書き方するんじゃねぇ。

## 参考URL
- [Including a Module. With Parameters!](http://devnull.absolventa.de/2016/03/11/include-a-module-with-parameters/)
- [github dkubb/equalizer](https://github.com/dkubb/equalizer/blob/master/lib/equalizer.rb)
DockerのGet Started Part4で詰まったところメモ

# 詰まったところとその解決

Create Clasterの段で

```
$ docker-machine create --driver virtualbox myvm1
$ docker-machine create --driver virtualbox myvm2
```

を叩いた後，

```
$ docker-machine ssh myvm1 "docker swarm init"
```
を叩くと以下のエラーメッセージが出た．

```
Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on different interfaces (10.0.2.15 on eth0 and 192.168.99.100 on eth1) - specify one with --advertise-addr
```

VirtualBoxでホストオンリーアダプターを使用した仮想マシンを作っていたためか，新しく作成した仮想マシンにもこのアダプターが適用されていた．結果，一つのマシンに複数のIPが存在することになったのでdockerがどちらを使えばいいか困ってしまった模様．

"Got an error about needing to use --advertise-addr?" の項には--advertise-addrにIPとポート２３７７を指定するように書いてある．

IPを調べる．

```
$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   -        virtualbox   Running   tcp://192.168.99.100:2376           v17.06.2-ce
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v17.06.2-ce
```

仮想マシンのIPとポート2377を指定して再度docker swarm initすると

```
Error response from daemon: advertise address must be a non-zero IP address or network interface (with optional port number)
```

とエラーが出てうまくいかない．

2377から2376に変更してみる

```
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100:2376"
Swarm initialized: current node (7pti0utyejt72awns372h2cs2) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5wzuw5al92i55hdfw6738ge03coversgpj4ow5vv5i6kxhvbgm-7rvnbpdv9mu87i0osy8o9qady 192.168.99.100:2376

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
```

とりあえず初期化ができたので，指示に従ってクラスターにmyvm2を追加しようとしたところまたエラーが出た．

```
$ docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-5wzuw5al92i55hdfw6738ge03coversgpj4ow5vv5i6kxhvbgm-7rvnbpdv9mu87i0osy8o9qady 192.168.99.100:2376"
Error response from daemon: rpc error: code = 13 desc = connection error: desc = "transport: remote error: tls: bad certificate"
exit status 1
```

エラーメッセージで検索すると次の記事がヒット
https://github.com/docker/machine/issues/4064
>lupulin commented on 22 Apr
It worked for me this time. I assume you're doing --advertise-addr with the IP and port that's in docker-machine ls. You have to use PORT 2377 per the instructions. Then, it seems to work.

2376->2377に変更して再度join．

```
$ docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-5wzuw5al92i55hdfw6738ge03coversgpj4ow5vv5i6kxhvbgm-7rvnbpdv9mu87i0osy8o9qady 192.168.99.100:2377"
This node joined a swarm as a worker.
```

myvm2をworkerとして登録できたっぽい．

## 何が悪かったのか
デフォルトでlistenするポートとswarm joinで利用するポートが一致していなかった？
チュートリアルでは
> Copy the IP address for myvm1 by running docker-machine ls, then run the docker swarm init command again, using that IP and specifying port 2377 (the port for swarm joins) with --advertise-addr

とあるが，swarm initするまではポート2377をlistenしていない気がする．（確認していない）
WeasyPrint で PDF を出力する

# はじめに

PDF を出力するためのライブラリとしては、個人的には [wkhtmltopdf](https://wkhtmltopdf.org/) が馴染み深いです。しかし、今回たまたま [WeasyPrint](http://weasyprint.org/) というライブラリを見つけたので試してみました。

# インストール

```
$ pip install weasyprint
```

# 使用例

次の HTML を PDF に変換します。せっかくなので、PDF 文書っぽく二列表示に。

[quanon/magica.html](https://gist.github.com/quanon/adcc10e00845da1e64d3e12afcab06f6)

なお、文章は [Wikipedia » 魔法少女まどか☆マギカ](https://ja.wikipedia.org/wiki/%E9%AD%94%E6%B3%95%E5%B0%91%E5%A5%B3%E3%81%BE%E3%81%A9%E3%81%8B%E2%98%86%E3%83%9E%E3%82%AE%E3%82%AB) より引用しました。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/6697/9cd1d9a3-9f11-3795-b372-82f5bf2c5a2e.png)

そして `pdf.css` という PDF 専用の CSS も用意します。

```pdf.css
@page {
  margin: 8.0rem 2.0rem;
  font-family: YuMincho, "Hiragino Mincho ProN", serif;

  @top-center {
    content: "魔法少女まどか☆マギカ";
    vertical-align: bottom;
    font-size: 1.2rem;
    border-bottom: 0.1rem solid;
    margin-bottom: 1.2rem;
  }

  @bottom-right {
    content: counter(page) " / " counter(pages);
  }
}

```

次のコマンドで PDF を出力します。

```
$ weasyprint magica.html magica.pdf -s pdf.css
```

でました :tada:

出力された PDF がこちらです。

![スクリーンショット 2017-09-11 22.46.36.png](https://qiita-image-store.s3.amazonaws.com/0/6697/9db1691d-6c8c-fe4d-99af-a9d8216df56a.png)

気軽に使えるし、ドキュメントも充実しているしで、今後も使っていきたいです :sparkling_heart: 

# おまけ: Docker 対応

```Dockerfile:Dockerfile
FROM python:3.6.2

RUN apt-get update \
 && apt-get install -y \
      python-lxml \
      fontconfig \
      libcairo2 \
      libpango1.0-0 \
      libgdk-pixbuf2.0-0 \
      libffi-dev \
      shared-mime-info \
      unzip \
 && apt-get autoremove \
 && apt-get clean

WORKDIR /opt

ENV WEASYPRINT_VERSION 0.40
RUN pip install weasyprint==$WEASYPRINT_VERSION

ADD https://noto-website.storage.googleapis.com/pkgs/NotoSerifCJKjp-hinted.zip .
RUN unzip -d noto NotoSerifCJKjp-hinted.zip \
 && mkdir -p /usr/share/fonts/opentype \
 && mv -fv noto /usr/share/fonts/opentype/noto \
 && rm -rfv NotoSerifCJKjp-hinted.zip \
 && fc-cache -fv
```

```yaml:docker-compose.yml
version: '3.3'
services:
  weasyprint:
    build: .
    volumes:
      - .:/opt/data-volume
    working_dir: /opt/data-volume
    entrypoint:
      - weasyprint
    command:
      - -h
```

```
$ docker-compose run weasyprint magica.html magica.pdf -s pdf.css
```

# 参考

## WeasyPrint

* [Kozea/WeasyPrint](https://github.com/Kozea/WeasyPrint)

## CSS

* [CSS マルチカラムレイアウトの利用](https://developer.mozilla.org/ja/docs/Web/Guide/CSS/Using_multi-column_layouts)
* [Guide to Responsive-Friendly CSS Columns](https://css-tricks.com/guide-responsive-friendly-css-columns/)
QGISでラインを表示するためのDAX式

QGISでポイントデータは簡単に表示可能ですが、ラインデータについては一工夫必要です。

以下などを参考に、表示してみました。

[QGIS: creating lines from starting to arrival points?](https://gis.stackexchange.com/questions/34633/qgis-creating-lines-from-starting-to-arrival-points)

# QGISでのLINESTRINGの読み方

上記リンクにあるように、well known text (WKT) 形式でcsvのカラムを作成すればよいです。
そうすると、

"Add delimited text layer"(デリミティッドテキストレイヤの追加)

というメニューから直接ラインのジオメトリが読み込みが可能になります。
以下のように自動的にジオメトリフィールドを認識するので、座標系さえ指定すれば終わりです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/35987687-f4be-8fe3-25f4-5c1bc1e9e92d.png)

# LINESTRING文字列を作成する。

どうやら、

```
LINESTRING( lon1 lat1,lon2 lat2, ... ,lonN latN )
```
という系列のデータを与えればよさそうです。始点終点を示すフィールド４つからこの文字列を作るDAX式は以下のような感じでよいようです。文字列の連結はCONCATENATEですが、PowerBIのクエリーエディタで使えるCONCATENATEは2引数しか受け付けないので、 & でくっつけるほうが簡単です。

```
"LINESTRING(" & Text.From([lon1]) & " " & Text.From([lat1]) & "," & Text.From([lon2]) & " " & Text.From([lat2])  & ")"
```

LINEは航空機の起点終点や道路、GPSトラックなど、可視化上必要となるシーンが多いので、生データから直接QGISに読み込む方法の一つとして知っておきたいですね。

なんとなく文字列連結だけのためにPowerBIって邪道な気がしますが、意外とこの組み合わせでやるとよいかもしれません。