OmniAICreator/Qiita-1.07M huggingface dataset:
Ethereum におけるrandom numberの生成アルゴリズム

# ランダムな番号の生成

Ethereumのsmart contractでは、現状単一のトランザクションでランダムな値を生成することはできませんが、複数のユーザーの入力値と、ハッシュ関数を用いることでランダムな値を生成することが出来ます。


仕組みの要点は以下になります

はじめに、以下のような変数を用意しておきます。

```

mapping(address => bytes32) userHash; //addressとユーザーが選んだ番号を紐づける
uint random; //結果として得られるrandom number

```

phase1. ユーザーは自分で選択した任意の番号(n)をcontractに提出し、contractにはそのhash値hash(n)を保持する。

例

```
function postNum(uint _num) public {
    userHash[msg.sender] = keccak256(_num);
}
```

phase2. ユーザーはphase1で選択した番号nをcontractに提出し、hash(n)がコントラクトに保時されているhash値に一致する場合は、nを正当な値として、randam　numberの結果に追加します。
例

```
function commitNum(uint _num) public {
    require(keccak256(_num) == userHash[msg.sender]);
    random += _num;
}
```
 
phase3. 一定時間経過後のrandom(ユーザーが選んだランダム値nの合計)をランダムナンバーとして利用します。


phase1で n のhash値 hash(n)を登録させ（この時点でnの合計値は確定しているが確認は出来ない状態）、phase2でnとhash値を提出させることで、nの合計値を計算します。


このように、phase1でhashのみを集めることで、結果は確定しているが、その値は確認できないという状態を作り出すことで、マイナーにもランダム番号の出力値を確認することが出来ない状態を作ることが出来ます。


しかし、実運用の観点ではユーザーにgasを負担させることになるため、番号nの提出に対して何らかのインセンティブ設計が必要になるかと思われます。


それをコンセプトとして提案しているコントラクトが、[randao](https://github.com/randao/randao)というコントラクトですが、gas代よりも高い報酬を支払えるようにできるほどrandom numberに需要があるかどうかというのがポイントになりそうです。

ちなみに、このランダム番号生成の仕組みを使ったdappsゲームを開発していて公開予定でして、うまくいくかどうか検証できれば面白いなと思ってます。
完全無料のプロジェクトツールを作ってみました。

<p><img src="http://spt.chu.jp/articles/a180729/s1.png"/></p>
<h1>
<b>Web業界で働く人向け Simplest Project Tool</b> 
</h1>
<h4><font color="Red">完全無料のプロジェクトツール</font></h4>
<h2><font color="CornflowerBlue">現在のversion</font></h2>
<p>β版 (2018年7月29日 最新版)</p>
<h2><font color="CornflowerBlue">サイト</font></h2>
<p><a href="https://spt.jp/" targe="_blank">Simplest Project Tool</a></p>
<h2><font color="CornflowerBlue">紹介</font></h2>
<p>Firebase × JavaScript でプロジェクトツールを作りました。</p>
<p>一通り基本機能は実装したのでテスト版としてリリースしたいと思います。</p>
<p>正式版は 2019 年度に予定しており、そのままデータを引き継げる予定です。</p>
<p>ファイルは<a href="#dl">一番下</a>からダウンロードしてよければ使ってみてください。</p>
<p>このツール自体は<font color="Red">完全無料</font>で利用できます！</p>
<p>またFirebaseを使用しているので、Firebaseの設定と連携が必要です。</p>
<p>設定と連携方法も下記から参照してください。</p>
<h2><font color="CornflowerBlue">トップ画面イメージ</font></h2>
<p><img src="http://spt.chu.jp/articles/a180729/s2.png"/></p>
<h2><font color="CornflowerBlue">プロジェクト画面イメージ</font></h2>
<p><img src="http://spt.chu.jp/articles/a180729/s3.png"/></p>
<h2><font color="CornflowerBlue">他実装機能</font></h2>
<p>・簡易ガントチャート</p>
<p>・スタッフメンバー紹介ページ</p>
<p>・簡易Wiki</p>
<p>※安定版に向けてはステータスと連動したガントチャートやWiki、Notificationの強化、全体的なデザイン改修を予定しており引き続き無料で利用できる予定です。</p>
<h2><font color="CornflowerBlue">Firebaseの設定と連携方法</font></h2>
<p>&lt;設定が必要な項目&gt;</p>
<p>Google有効化、ドメイン許可、Realtime Database、Storage</p>
<p>&lt;手順&gt;</p>
<p>・<a href="https://firebase.google.com/" target="_blank">Firebase</a> へログインしたらプロジェクトを作成してください。</p>
<p><img src="http://spt.chu.jp/articles/a180729/s4.png"/></p>
<p>・作成が終わったら左タブの「開発」をクリックし、「Authentication」を表示する。</p>
<p><img src="http://spt.chu.jp/articles/a180729/s5.png"/></p>
<p>・ 「ログイン方法」にて「Google」を有効化</p>
<p>※プロジェクトツールへのログインはGoogleアカウントを使用しています。</p>
<p><img src="http://spt.chu.jp/articles/a180729/s6.png"/></p>
<p>・同一ページの「承認済みドメイン」にてアップ先のドメインを追加。</p>
<p><img src="http://spt.chu.jp/articles/a180729/s7.png"/></p>
<p>・「開発」タブの「Database」をクリックし、データベースを作成。</p>
<p>※テストモードで有効化。</p>
<p><img src="http://spt.chu.jp/articles/a180729/s8.png"/></p>
<p>・「Realtime Database」へ切り替えて、「ルール」タブの「read/write」を「true」に変更。</p>
<p><img src="http://spt.chu.jp/articles/a180729/s9.png"/></p>
<p>・「開発」タブの「Storage」をクリックし、「スタートガイド」で下記画面を表示しとく。</p>
<p><img src="http://spt.chu.jp/articles/a180729/s10.png"/></p>
<p>・ダウンロードしたファイルの app.〇〇.js にFirebase の情報をコピペする。</p>
<p>[コピー元]</p>
<p>Firebaseの左タブ「Project Overview」の「ウェブアプリに Firebase を追加」をクリックし、下記情報を表示。</p>
<p><img src="http://spt.chu.jp/articles/a180729/s11.jpg"/></p>
<p>[コピー先]</p>
<p>ダウロードしたファイルの「/static/js/app.〇〇.js/」の下記空欄になってる該当箇所にコピペ。</p>
<p><img src="http://spt.chu.jp/articles/a180729/s12.png"/></p>
<p> 設定は以上です、あとはファイルをアップするだけです。</p>
<h2><font color="CornflowerBlue">免責事項 </font></h2>
<p>このプロジェクトツールを利用して発生したいかなる損害にもこのプロジェクトツールの開発者は責任を負いません。</p>
<p>同意できる方のみ下記ダウンロードをお願い致します。</p>
<h2 id="dl"><font color="CornflowerBlue">ダウンロード</font></h2>
<p>免責事項を同意した方のみ下記よりプロジェクトツールをダウンロード出来ます。</p>
[ここからダウンロード](http://spt.jp/dl/dist.zip)
<p>
今回プロジェクトツールを初めて0から作ってみたのですが、色々思ったことがあるので次回はそれについて投稿しようと思います。<br>
読んでいただきありがとうございました。</p>
WebKitGTK+ のWebDriverサポート

こんにちは！
みなさん、各ブラウザでのWebDriverの実装状況、毎日見てますよね！！！？？？！！！？！

* WebDriver implementation report
    * https://github.com/w3c/webdriver/blob/master/implementation-report.md

GitHub上のこのリンク集を見ていると、ンッなんだこれは見慣れないな、と目に留まるものがあるわけです。
「WebKit GTK port」
なんですかこれは。わからないな。[^1]

WebKitGTK+
==============

https://webkitgtk.org

GNOMEプラットフォーム公式のWebエンジンです。
2018年7月29日現在での最新バージョンは2.21.5です。
ベンダー中立なオープンソースのWebエンジンとして、貴重な存在だと思われます。

WebDriverサポートが始まったのは、2017年9月リリースのバージョン2.18からです。
リリース時、GNOMEのコントリビューターのひとりである Carlos Garcia Campos がブログに解説記事を掲載しています。
https://blogs.igalia.com/carlosgc/2017/09/09/webdriver-support-in-webkitgtk-2-18/

昔のWebKitGTKはヘッドレス動作できたような気がするのですが、現行バージョンではヘッドレス動作するオプションが無いようです。今後に期待したいですね。

Seleniumの対応状況
====================

Selenium公式の言語バインディングでは、バージョン3.8.0からいち早くPythonが対応しています。
しかし残念なことに、他の言語バインディングでは対応が進んでいません。

実際に使ってみよう
====================

現状、気軽に使えるプラットフォームは Ubuntu Linux 18.04 LTS と Fedora くらいのようです。
Ubuntu Linux 18.04 LTS では、次のように `apt` で気軽にインストールできます。

```
$ sudo apt install webkit2gtk-driver
```

以前紹介したjBrowserDriverのように [^2] 、ブラウザドライバがミニブラウザを内包しているつくりのようです。環境構築が手軽ですね。

ベンチマーク
================

[日本Seleniumユーザーコミュニティの提供するサンプルページ](http://example.selenium.jp/reserveApp/)上で基本的なAPIを100回実行して、1回あたりの平均値を取得するだけの簡易ベンチマークをやりました。
https://github.com/hiroshitoda/WebDriverBenchmark.py

実行環境はAWS上のc5.largeインスタンスです。

結果は次の通りでした。
あんまり速くないですが、操作ごとに速度があまり変わらないのが気になりますね。ブラウザ操作というよりは、Webサーバーとしての動作が遅いのかもしれず、まだまだ最適化の余地があるのかもしれませんね。

| | | | |
|:--|:--|:--|:--|
| | ChromeDriver | FirefoxDriver via GeckoDriver | WebKitGtkDriver |
| webdriver.get                | 54ms | 95ms | 298ms |
| find_element_by_id           | 7ms | 9ms | 89ms |
| find_element_by_css_selector | 6ms | 8ms | 86ms |
| clear                        | 16ms | 8ms | 87ms |
| send_keys                    | 31ms | 11ms | 96ms |
| click                        | 34ms | 214ms | 91ms |
| get_screenshot_as_base64     | 81ms | 124ms | 110ms |

私もあまり動作検証ができていないのですが、動作時のリソース消費や安定性、Raspbianでの動作の感じなど、もうちょっと調べてみたいところですね。



[^1]: http://www.nicovideo.jp/watch/sm8273279
[^2]: https://qiita.com/hiroshitoda/items/abc0e1adc1abd8f3c6e7
Qiitaの記事が伸びた理由を考えてみた。

# 概要
　[初心者による「Python初心者がコピペで使える!時系列データの可視化!」](https://qiita.com/snuow/items/fe58b8f5e230f5dc48a4)が自分史上かなり伸びたので、やったことないGoogleAnalyticsを導入してみました。
Qiitaの記事をGoogleAnalyticsに登録するのは意外と簡単で、[ここ](https://qiita.com/Qiita/items/c7f704e3786df3aa7a11)を参考にしました。

↓こんな感じの結果になりました。
![qiita投稿_20180729_result2.JPG](https://qiita-image-store.s3.amazonaws.com/0/148213/c12e2295-1050-94cf-c3a1-d7f795a5bed4.jpeg)
![qiita投稿_20180729_result.JPG](https://qiita-image-store.s3.amazonaws.com/0/148213/4c7f8a4b-3ffb-2c99-72f4-66525ca2d068.jpeg)


## GoogleAnalyticsの結果
* [初心者による「Python初心者がコピペで使える!時系列データの可視化!」](https://qiita.com/snuow/items/fe58b8f5e230f5dc48a4)の投稿は7/26に投稿しました。  
27日に一気に伸びたので、糞記事過ぎて晒されたのかとちょっと思いました。今までが超低空飛行なので他の日のセッション数が0に見えます。
* 時間帯別ユーザー数をみると、7時~10時の伸びが大きく、通勤時間帯に多く見ていただけたのかと思いました。  
![qiita投稿_20180729.JPG](https://qiita-image-store.s3.amazonaws.com/0/148213/b4f506ad-278f-9311-7630-81214ad7f16b.jpeg)

* ユーザーの訪れているページの最も多いページViewのページはもちろん26日に投稿された記事です。 
* デバイス別セッション数をみるとモバイルやタブレットが約45%程度いることから、 
時間別のデータとの兼ね合いからやはり通勤時間に目を通して頂けたのかなと推察しています。
![qiita投稿_20180729_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/148213/cb4f3994-b473-2b6b-dca1-e1e55b27e139.jpeg)

## ユーザーの行動フロー
* 行動フローを見ると、[初心者による「Python初心者がコピペで使える!時系列データの可視化!」](https://qiita.com/snuow/items/fe58b8f5e230f5dc48a4)を見た後、
僕個人に興味を持ってもらえたのは1479人中29人といった程度なのかと思っています。（あってますかね？）  
お仕事のお誘いがもらえるようになるには、ここを伸ばせるようになればいいのかなと感じました。
![qiita投稿_20180729_4.JPG](https://qiita-image-store.s3.amazonaws.com/0/148213/354c53bc-dd20-7354-b16e-091792bb2aba.jpeg)

## どこからの流入？
### 全体の結果
* 26~27日での伸び率をみると、SocialとDirectがページViewに最も寄与している結果となりました。
![qiita投稿_20180729_7.JPG](https://qiita-image-store.s3.amazonaws.com/0/148213/21d07974-d6c2-16d7-abd0-45b28e243498.jpeg)

### Social
* Socialカテゴリからの流入で最も多いのは、はてブの457でした。はてブのテクノロジーカテゴリに表示されたのが大きかったようです。27日に最も大きくなり、28日に0になったところを見ると1日しかはてブの目につく場所には掲載されなかったようです。
* 因果関係はわかりませんが、この1回掲載で大きく伸びたと思っています。
* 時間毎のデータがあればもう少し詳しくできると思います。
![qiita投稿_20180729_8.JPG](https://qiita-image-store.s3.amazonaws.com/0/148213/8b7efd8e-4c1f-1536-be50-b2b21b238146.jpeg)

### Direct
* Directカテゴリは流入元がわからなかったのですが、おそらくQiitaのトレンドに載ったことが原因だと思っています。（表示方法ってあるんですかね？）
* 27日にSocialと同様に伸びて以降もトレンドに残り続けているため、28日29日もじわじわView数を伸ばした結果となりました。
![qiita投稿_20180729_9.JPG](https://qiita-image-store.s3.amazonaws.com/0/148213/61ac88c5-ba67-75a2-759d-28d92ce30e7a.jpeg)

## 考察
* View数が4000に対して、はてブ50,Pocket89ということは、3％程度の人しか後々見たいと思っていない。
* ユーザー行動フローから30人程度の人は、私にも少し興味があった。
* 流入数を一気に増やすには、はてブに掲載されることが重要。  
掲載されると、いいねが付きやすくQiitaのトレンドに載り持続的に伸びる。
* その後に伸び続けるかは記事の質による。[初心者による「Python初心者がコピペで使える!時系列データの可視化!」](https://qiita.com/snuow/items/fe58b8f5e230f5dc48a4)は翌日にはほぼ収束していたため、比較的チープな記事といえる。

## まとめ
* もっと技術の研鑽を怠らないようにして、良い記事をかける技術を身に着けよう。
* 技術の研鑽はもちろんのこと、良い記事となるように文章も書けるようになろう。
Hyper-V上のUbuntu 18.04LTSにdockerインストール

# はじめに
Ubuntuへのdockerインストールに関しては、dockerのマニュアル(https://docs.docker.com/install/linux/docker-ce/ubuntu/ )がよくできているので、特に追加する必要もないものの、スクリーンショットと合わせて日本語で紹介する文書があってもいいかと思い、書いてみました。

-[Windows 10 Pro Hyper-V に Ubuntu 18.04 LTS をインストール](https://qiita.com/mfunaki/items/9e2901936b04f00f9cd7)
-(ここ)Hyper-V上のUbuntu 18.04LTSにdockerインストール
-[Docker版のSAP HANA express editionをインストールする](https://qiita.com/mfunaki/items/b59175b490cff8c4eb75)

なお、ここで紹介している例は、別記事[Windows 10 Pro Hyper-V に Ubuntu 18.04 LTS をインストール](https://qiita.com/mfunaki/items/9e2901936b04f00f9cd7)で作成した仮想マシン上のUbuntuを想定していますが、仮想マシンでない実機ベースでも事情は変わらないと思います。参考になれば幸いです。

# リポジトリからDocker CEをインストールする
まずはUbuntuを起動してログインしておいてください。

## リポジトリを設定
`apt`パッケージのインデックスを更新しておきます。

```shell
$ sudo apt-get update
```

![20180727-016 (2).png](https://qiita-image-store.s3.amazonaws.com/0/19248/050ec927-33a4-b048-f899-11bb6ea1ca44.png)

更新が終わったら、HTTPS越しでリポジトリにアクセスできるように、必要なパッケージをインストールします。

```shell
$ sudo apt-get install \
   apt-transport-https \
   ca-certificates \
   curl \
   software-properties-common
```

もちろん一行で書いてしまっても結構です。
![20180727-017 (2).png](https://qiita-image-store.s3.amazonaws.com/0/19248/0ecc52f9-f050-0e7a-ab18-a9f84bc56a68.png)

次にDockerの公式GPG keyを追加します。

```shell
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

![20180727-018 (2).png](https://qiita-image-store.s3.amazonaws.com/0/19248/3e3f73ed-19f6-568e-516f-c244a5fba5d3.png)

正しくGPG Keyが追加されているかを確認するため、キーの末尾8文字`0EBF CD88`で検索して、正しいキー`9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88`が表示されることを確認します。

```shell
$ sudo apt-key fingerprint 0EBFCD88
```

![20180727-019 (2).png](https://qiita-image-store.s3.amazonaws.com/0/19248/9f4b2d2b-d8e1-e4cf-84ee-3deed822b8b9.png)

次に、DockerのStable Channel(安定板)リポジトリを登録して、aptパッケージのインデックスを更新しておきます。

```shell
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
```

実行結果は次のようになります。
![20180727-021 (2).png](https://qiita-image-store.s3.amazonaws.com/0/19248/a6012735-f50c-4d02-99a5-ab73a1436b49.png)

## Docker CEをインストール
それではいよいよ本題のDocker CEのインストールに移ります。
docker-ceパッケージの最新版をインストールします。

```shell
$ sudo apt-get install docker-ce
```

![20180727-023 (2).png](https://qiita-image-store.s3.amazonaws.com/0/19248/1e105d24-1bdb-aec4-6f6b-bcfa100ef6d7.png)

例によって依存関係のある関連パッケージが表示されますので、`y`を入力して、docker-ceパッケージをインストールします。

## 動作確認
誰でもはじめはここから、というわけでもありませんが、'hello-world' dockerイメージなるものがdocker storeにあるので(https://store.docker.com/images/hello-world )、イメージのダウンロード＋起動を一度に行います。

```shell
$ sudo docker run hello-world
```

例えば、起動後はこんな画面になります。
![20180729-023 (3).png](https://qiita-image-store.s3.amazonaws.com/0/19248/c3f60d0c-2194-5b2b-5e9b-f51a3915dab1.png)

ここまでたどり着けたら、dockerインストールは完了です。お疲れさまでした！
[Excel VBA]大量のセルの値を一括で読み込み

# Excel
[複数セルに値を一発で書き込み](https://qiita.com/jinka1997/items/fb6d7cd1fa53cf82d7f9)のエントリの逆で、今度は大量のセルの値を一括で読み込みをしてみる。

こっちもVariant型の二次元配列を使います。

## 入力
100列1000行のシートにRANDBETWEEN関数でランダムな値を入れ、値貼り付け。
シート名は「in」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221879/f15672b2-d38f-e122-b771-5573abf84158.png)

## 出力
各セルの値の行番号、列番号、値を出力する。1行目はタイトル行で明細は2行目から。
シート名は「out」。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221879/5225c343-86d3-34c3-c2bb-b91289440a74.png)

## コード
ポイントは、以下の通り
1. 出力用の二次元配列(Variant型。↓のコードでは変数vout)を作る
2. 出力用の二次元配列に値をセット(一次元目が行方向、二次元目が列方向)
3. 出力用の二次元配列と行数、列数が同じRangeオブジェクト(↓のコードでは変数rout)を作る。
4. 出力用の二次元配列をRangeのValueプロパティにセット。

Excelのオブジェクトへのアクセスが少なくなるので高速です。1秒かかりません。

```vb
Option Explicit
Public Sub Flatten3()
    Dim a As Excel.Application
    Dim b As Workbook
    Dim w As Worksheet
    Dim rr As Range
    Dim v As Variant
    Dim i As Long
    Dim j As Long
    
    Dim wout As Worksheet
    Dim rout As Range
    
    Dim row As Long
    Dim column As Long
    Dim value As String
    
    Dim vout As Variant
    Dim rowCount As Long
    Dim k As Long
    
    Debug.Print Time & " - Flatten3 スタート"
    
    ''Workbook変数セット
    Set a = Application
    Set b = a.ThisWorkbook

    ''inシートの範囲指定
    Set w = b.Worksheets("in")
    Set rr = w.Range("A1")
    Set rr = w.Range(rr, rr.End(xlToRight).End(xlDown))

    ''outシートのクリア
    Set wout = b.Worksheets("out")
    wout.Range("2:1000000").ClearContents

    ''outシートの初期位置をA1に。
    Set rout = wout.Range("A1")
    
    ''100列1000行の値を一括してVariantに入れる→2次元配列になる。
    Debug.Print Time & " - Flatten3 読み込み"
    v = rr.value
    
    Debug.Print Time & " - Flatten3 ループ＋書き込み用配列作成"
    
    ''出力用の配列を定義。行数100*1000、列数3
    rowCount = UBound(v, 1) * UBound(v, 2)
    ReDim vout(1 To rowCount, 1 To 3)

    ''列方向のループ
    For i = LBound(v, 1) To UBound(v, 1)
        ''行方向のループ
        For j = LBound(v, 2) To UBound(v, 2)
            row = i
            column = j
            value = v(i, j)        

            ''出力用配列にセット
            k = k + 1
            vout(k, 1) = row
            vout(k, 2) = column
            vout(k, 3) = value
        Next j
    Next i
    
    Debug.Print Time & " - Flatten3 配列から書き込み"
    ''A2を起点として、出力用配列と同サイズのRangeをセット
    Set rout = wout.Range("A2").Resize(rowCount, 3)

    ''配列から一括書き込み
    rout.value = vout
    
    Debug.Print Time & " - Flatten3 終了"
    MsgBox "終了!"
End Sub
```
GLPKプログラミングの基礎(1)

[<-目次](https://qiita.com/ki073/items/508b3c20eb03078703dd)
##はじめに
京都駅の大階段を駆け上るレースが毎年行われています。
[第21回 JR京都駅ビル 大階段駈け上がり大会](https://www.kbs-kyoto.co.jp/contents/information/2017/info_077290.htm)
それに参加するためのチームを作ってみます。1チーム4人ですのでまず4人ずつにチーム分けします。

参加者は次の通りです。

|氏名 | 性別 | 年齢 | 記録(秒)|
|:-----------|:------------:|------------:|------------:|
|Aさん|男|  30|  40|
|Bさん|男|  18|  25|
|Cさん|女|  25|  35|
|Dさん|女|  18|  33|
|Eさん|男|  48|  45|
|Fさん|男|  30|  28|
|Gさん|女|  45|  48|
|Hさん|女|  20|  32|

##プログラム
まず次表のようなバイナリ変数を用意します。空欄になっているところに、該当する場合には1、しない場合には0を入れることでチームを分けます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171895/a3b48b11-a490-5927-da70-9e39594490f6.png)

例えばAさんがチーム1に属すなら左上が1、その下に0が入ります。全員どちらかのチームに属しますので、縦方向の合計が必ず1になります。また各チーム4人ですので横方向の合計が必ず4になります。
以上の条件をGLPKのMathProgで書くと

```MathProg:team1.mod
# version 0.1
set N := {"Aさん", "Bさん", "Cさん", "Dさん", "Eさん", "Fさん", "Gさん", "Hさん"};
set T := {"チーム1", "チーム2"};
var w{N, T} binary;
s.t. belong_one_team{n in N}: sum{t in T}w[n,t]==1;
s.t. team_members{t in T}: sum{n in N}w[n,t]==4;
solve;
display w;
```
のようになります。
solveでそこまでの条件で解を求め、displayで変数の内容を表示します。

チームを作る上で、女性と45歳以上が1名含まれるルールがありそれを追加します。
いくつかの属性を読み込む必要がありますので、データ部分を分離し、最初の方で読み込むようにしています。
それと結果を見やすくなるように出力文を追加していますが、基本的にはteam1.modに制約条件(s.t.文)を2つ追加しただけです。

```MathProg:team2.mod
# version 0.2
set T; # チーム名を読み込む
set N; # 氏名を読み込む
param s{N} symbolic; # 性別を読み込む
param a{N}; # 年齢を読み込む
param r{N}; # 記録を読み込む
var w{N, T} binary;
s.t. belong_one_team{n in N}: sum{t in T}w[n,t]==1;
s.t. team_members{t in T}: sum{n in N}w[n,t]==4;
s.t. gte45{t in T}: sum{n in N: a[n]>=45}w[n,t]>=1;
s.t. women{t in T}: sum{n in N: s[n]=="女"}w[n,t]>=1;
solve;
for{t in T}{
  printf "%s\n", t;
  printf{n in N: w[n,t]==1} "%s  %s  %d\n", n, s[n], a[n];
}
```

プログラム部分とデータ部分を分けてあります。慣れないうちはプログラム部分の後に次のデータを追加したファイルを作成して実行してみてください。

```data
data;
set T := "チーム1" "チーム2";
param : N : s a r :=
"Aさん"	"男"	30	40
"Bさん"	"男"	18	25
"Cさん"	"女"	25	35
"Dさん"	"女"	18	33
"Eさん"	"男"	48	45
"Fさん"	"男"	30	28
"Gさん"	"女"	45	48
"Hさん"	"女"	20	32
;
```

ともかくそれっぽくチーム分けできていますが、女性で45歳以上の人を二重に数えてしまう可能性がありますので考え直して見ます。
公式には、
第1走者 : 45歳以上の方
第2走者 : 18歳以上の女性
第3・4走者 : 18歳以上の方
となっていますので、出走順に分けてみます。変数を次のように変更します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171895/18ad0cb0-dc94-e281-8476-5b5c95ce57f7.png)

縦方向の合計は1のままですが、横方向の合計は1になります。
それから出走順1は45歳以上であること、出走順2は女性である制約条件が追加されます。

```MathProg:team3.mod
# version 0.3
set T; # チーム名を読み込む
set N; # 氏名を読み込む
set O := 1..4; # 出走順
param s{N} symbolic; # 性別を読み込む
param a{N}; # 年齢を読み込む
param r{N}; # 記録を読み込む
var w{N, O, T} binary;
s.t. belong_one_team{n in N}: sum{t in T, o in O}w[n,o,t]==1;
s.t. team_members{t in T, o in O}: sum{n in N}w[n,o,t]==1;
s.t. gte45{t in T}: sum{n in N: a[n]>=45}w[n,1,t]==1; # 第一走者
s.t. women{t in T}: sum{n in N: s[n]=="女"}w[n,2,t]==1; # 第二走者
# minimize record: sum{t in {"チーム1"}, o in O, n in N}w[n,o,t]*r[n];
solve;
for{t in T}{
  printf "%s\n", t;
  printf{o in O, n in N : w[n,o,t]==1} "%d %s  %s  %d\n", o, n, s[n], a[n];
}
```

おまけですが、チーム1を最速のチームにしてみます。
上のプログラムでは
\# minimize 〜とコメントにしていますが、先頭の#を消して実行するとそのようなチーム分けができます。
【UiPath】Robotトレイへのオートメーション登録と削除

Community EditionにはStudioだけでなくRobot(UiRobot.exe)もくっついてきます。
頻繁に実行するオートメーションはRobotのトレイに登録しておけば、
いちいちStudioを立ち上げてプロジェクトを開いてRun…とする必要が無く２クリックで実行できます。

Robotトレイへの登録方法、削除方法、注意点の３点を紹介します。

# Robotトレイへのオートメーション登録
Community Editionの場合、Robotはスタートメニューには登録されてませんが、
　`%USERPROFILE%\AppData\Local\UiPath\app-xx.x.x`
→`C:\Users\xxxx(アカウント名)\AppData\Local\UiPath\app-xx.x.x`
に格納されています。（xx.x.xはUiPathのバージョンです）
![robofolder.png](https://qiita-image-store.s3.amazonaws.com/0/255097/0da161c2-ac99-c090-3a1d-b6f6e5546b11.png)

実行すると、Windows右下のタスクトレイ（通知領域）に白い[Ui]アイコンが表示されます。
これがRobotトレイです。（ちなみにOrchestratorに接続すると青いアイコンに変化します）

オートメーションのRobotトレイへの登録方法は、Studioから[Publish]するだけです。
![publish.png](https://qiita-image-store.s3.amazonaws.com/0/255097/c9ac9df2-9bb7-84f2-c624-65898b2042bc.png)

Robotトレイには登録されたオートメーションが列挙され、それぞれの右端のアイコンから実行できます。
![tray.png](https://qiita-image-store.s3.amazonaws.com/0/255097/057bcff8-32a0-4e7d-6c27-ace9361c97ae.png)
※Publishした直後は未Deployなので:inbox_tray:みたいなアイコンになっていて、
１回クリックすると数秒後にDeployされて:arrow_forward:に変化し、実行できるようになります。

で、問題なのは削除する機能が提供されていない事。使わなくなったものは削除したいのに、
RobotトレイにもStudioにもDeleteメニューが無いのでオートメーションをPublishする度に増える一方。

いろいろ調べて削除する方法がわかったので、以下に手順をまとめました。

# いらなくなったオートメーションをトレイから削除
結論から言うと、
`%ProgramData%\UiPath\Packages`（`C:\ProgramData\UiPath\Packages`）
と
`%USERPROFILE%\.nuget\Packages`（`C:\Users\xxxx(アカウント名)\.nuget\packages`）
の２箇所から、対象オートメーション名のファイルを削除するだけ。

※このへんのフォルダ情報は、公式の [Robotでの自動化プロジェクトについて](https://robot.uipath.com/docs/about-automation-projects-on-the-robot) が参考になります。

さっそくフォルダを開けて見ると・・・
前にPublishした古いバージョンのnupkgも全部ココに残っているようです。削除削除。
![nuget.png](https://qiita-image-store.s3.amazonaws.com/0/255097/deb18caf-0a77-9143-542c-203cff0025e8.png)

いらないものを削除したらこんなにすっきりしました。
![after.png](https://qiita-image-store.s3.amazonaws.com/0/255097/34fd4e7e-d2a5-5401-c7e5-8fb873e10f26.png)

一応解説すると、StudioからPublishするとオートメーションファイルがnupkg化されて
`%ProgramData%\UiPath\Packages`（`C:\ProgramData\UiPath\Packages`）
に格納され、Robotトレイ上で:inbox_tray:の状態になります。

次に:inbox_tray:ボタンを押してDeployするとnupkgが解凍＆変換されて
`%USERPROFILE%\.nuget\Packages`（`C:\Users\xxxx(アカウント名)\.nuget\packages`）
に格納され、Robotトレイ上で:arrow_forward:の状態になります。

# 注意点
Excel application scopeやRead text fileアクティビティ等でファイルの読み書きをする場合、
ファイルパスは相対パスでなく、絶対パスで指定しないとRobotトレイに移した時うまく動きません。

というのも↓の絵の通り、Studioからの実行時とRobotトレイからの実行時では
UiPathが違うフォルダを見に行くためです。
![explain.png](https://qiita-image-store.s3.amazonaws.com/0/255097/d3c6f30f-ea13-8356-0728-334f3ca79eb4.png)

この振る舞いは製品版でも同じなので、ファイルパスは絶対パスで記載するのが鉄則です。

---
今回はここまで。

そういえばUiPath公式でも[ナレッジベース](https://www.uipath.com/ja/knowledge-base)が急速に充実してきましたね。
必要な知識やノウハウが簡単に手に入ることがUiPathの強みの１つだと思っているので、
公式がナレッジ拡散に本腰入れ始めたのは嬉しい事です。
（月１のDeveloper communityもいずれ参加したいと思ってます。）
pg8000でのInsert文の発行

## 概要
PythonからPostgreSQLにレコード追加する。

## 詳細
* カーソルオブジェクト作成までは[前回](https://qiita.com/kurukuruz/items/53780ee6b7a30cd4da41)と同じ

#### インサート実行
Select文と同様にカーソルオブジェクトの`execute`メソッドを介して実行する。

```Python
sql = '''
INSERT INTO public.actors(
	id, name, yomigana, birth_place)
	VALUES (?, ?, ?, ?);
'''
cur.execute(sql, (3, '愛美', 'あいみ', '兵庫県',))
```
SQL部分にヒアドキュメントを使用できることもついでに確認

#### コミット
コミットはコネクションオブジェクトを介して実行する。

```Python
conn.commit()
```

#### 自動コミットについて
デフォルトでは無効になっているが、以下のプロパティで有効に変更できる。

```Python
conn.autocommit = True
```

#### 登録エラーについて
制約違反などでインサートに失敗した場合は以下のように`execute`実行行でエラーが発生する。

```
Traceback (most recent call last):
  File "C:\Users\***\***\Python\pgtest_DML.py", line 11, in <module>
    cur.execute(sql, (2, '大橋 彩香', 'おおはし あやか', '東京都',))
  File "C:\Users\***\Python3.6.6_64\lib\site-packages\pg8000\core.py", line 892, in execute
    self._c.execute(self, operation, args)
  File "C:\Users\***\Python3.6.6_64\lib\site-packages\pg8000\core.py", line 1921, in execute
    self.handle_messages(cursor)
  File "C:\Users\***\Python3.6.6_64\lib\site-packages\pg8000\core.py", line 1988, in handle_messages
    raise self.error
pg8000.core.IntegrityError: ('ERROR', 'ERROR', '23505', '重複キーが一意性制約"actors_pkey"に違反しています', 'キー (id)=(2) はすでに存在します。', 'public', 'actors', 'actors_pkey', 'nbtinsert.c', '434', '_bt_check_unique')
```

## 参考サイト
* [GitHub - mfenniak_pg8000_ A Pure-Python PostgreSQL Driver](https://github.com/mfenniak/pg8000)
* [PEP 249 -- Python Database API Specification v2.0 | Python.org](https://www.python.org/dev/peps/pep-0249/)
関数の実行ごとに名取の声が再生されるProxy


```
yarn add natori.proxy
```

```js
const 名取 = require('natori.proxy')

const sum = (a, b) => a + b
const 名取sum = 名取(sum, 'ってね')
// 各関数実行時に名取が再生される

console.log(名取sum(1, 2))
// => 3
// 「ってね」

console.log(名取sum(1, 2) + 名取sum(1, 2))
// => 6
// 「ってねを禁止されてね.禁止されってね...うははっ」, 「ってね」
```

名取プロキシでラップされた関数の実行ごとに名取の声が流れる。
`名取(sum, 'エッチ')`みたいに第2引数にキーワードが指定できる。

## 実装

内部で使っている名取の声を流すのはsana-voiceというライブラリ。

[akameco/sana-voice: さなボタンからランダムに再生するCLI](https://github.com/akameco/sana-voice)

これはPromiseで非同期なので、関数の実行ごとに合わせて実行すると、同時に実行されて音声がかぶってしまう。
ので、前の再生が終わったら次の音声を再生させたい。
こういうPromiseをキューで扱い場合は`p-queue`を使うと便利。

[sindresorhus/p-queue: Promise queue with concurrency control](https://github.com/sindresorhus/p-queue)

`concurrency`にいくつ平行で実行するかを指定して、`queue.add`でPromiseを積んでいくだけでキューで実行される。

```js
const queue = new PQueue({ concurrency: 1 })

// ...
  queue.add(() => sanaVoice(key))
```

ライブラリの全コード。キューの他はProxyを使うだけ。

```js
'use strict'
const PQueue = require('p-queue')
const sanaVoice = require('sana-voice')

const queue = new PQueue({ concurrency: 1 })

module.exports = (func, key = 'てね') => {
  const handler = {
    apply(target, prop, args) {
      queue.add(() => sanaVoice(key))
      return Reflect.apply(target, prop, args)
    },
  }
  return new Proxy(func, handler)
}
```

よかったらスターしてください。
[akameco/natori.proxy: proxy for 名取](https://github.com/akameco/natori.proxy)

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">気がついたら本当に意味のわからないものがそこにあった <a href="https://t.co/hV3m2JwpwK">https://t.co/hV3m2JwpwK</a> <a href="https://t.co/LRNXNQp3c8">pic.twitter.com/LRNXNQp3c8</a></p>&mdash; あかめ@🤯.js (@akameco) <a href="https://twitter.com/akameco/status/1023548223569375232?ref_src=twsrc%5Etfw">July 29, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 関連


[コマンドラインで名取さなを再生する - Qiita](https://qiita.com/akameco/items/488bdf237d9b944775ae)
[Proxyを使って関数の呼び出し回数や全実行結果を取得する - Qiita](https://qiita.com/akameco/items/27ef0f9d81533eeeea3b)
[【JavaScript】うるせぇお前がGolangになるんだよ - Qiita](https://qiita.com/akameco/items/b89850fd43cf3ef98763)
[【Proxy】JavaScriptでRubyのtimesを使う - Qiita](https://qiita.com/akameco/items/73f1f49092b49667dc3a)
hapijs / hoek でセキュリティ脆弱性があるって怒られた場合の解消法

Ionic3にてコードをgithubに上げたらセキュリティ脆弱性が見つかったよ！って怒られた。
怒られてる中身見てみたら
hapijs / hoek 
という部分に脆弱性があるとか。なんだこれ。

```
We found a potential security vulnerability in one of your dependencies.
A dependency defined in package-lock.json has known security vulnerabilities and should be updated.
```

ぐぐってみたらhoekにて脆弱性だしちゃった。修正したから

```
 npm uninstall hoek 
 npm update
 npm install
```
で直るよ、的なことが書いてあった。
hoek のバージョン2.16.3で問題になっていたので、これをアップデートすれば完了

参考にしたページ↓
https://github.com/Microsoft/vscode/issues/48783


---------

追記
↑のコマンドやっても警告消えない場合、
package-lock.json の中開いてhoek version 2.16.3 ってなってるところ全部修正すると警告は消える。
しかし、根本解決になってないから、npm install するとまた戻ってしまうのよなー。
根本直さないと。。
【初心者向けです】CSSのPositionついて

##この記事を書く目的
WEB開発初心者の僕が自分なりにPositionの使い方を理解した気になるために書きます。
なのでもし、説明などが誤っていたり、不足していると思ったら、ぜひコメントをいただければと思います。

##position
positionとは「要素の位置を決める」ためのプロパティです。
指定したプロパティを動かしたり、位置関係を操作することが可能です。
要素の位置を固定したり、要素の上に別の要素を重ねたりすることができる。


###ポジションの書き方
下記クラス名となっていますが、id,class,tqgを指定することができます。
その他、複数の要素を同時に指定することも可能です。

```
.class名 {position: オプション；}
```

###ポジションのオプション
| オプション　　|　値の内容|  
|:--------|:------------------------------|
| static  |初期値だがほとんど利用することはない   |
| relative|現在の位置を基準に相対的な位置を決める。　| 
| absolute|親要素を基準に絶対的な位置を決める 　　　　 | 
| fixed   |画面の決まった位置に固定する      | 


####positionとセットで利用するtop, bottom, left, right
top:基準の上からの距離を指定
bottom:基準の下からの距離を指定
left:基準の左からの距離を指定
right:基準の右からの距離を指定

と言っても実際に使ってみないとわかんないっす。
てことで実際にHtmlとCSSのファイルを用意してChromeで確認します。

```index.html
////
<body>
  <div class="red">
    <div class="blue"></div>
  </div>
</body>
////
```

```style.css
.red {
  height: 300px;
  width: 300px;
  background-color: red;
}
```
まずこの２つのファイルを準備したらChromeいにはこんな感じで表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134077/3306a5a1-49de-5301-15f3-b3452a57fbe7.png)


それではCSSを編集します

```style.css
.red {
  height: 300px;
  width: 300px;
  background-color: red;
}

.blue {
  height: 200px;
  width: 200px;
  background-color: blue;
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134077/46dbb617-60ef-3371-9d93-c758af492a47.png)

青色の表示が加わりました。
でもこれだけだと、青色の表示はCSSのデフォルトの動きに法って左上にぴったりくっついていますね。
ではこれを右下にしてみましょう。


```style.css
.red {
  height: 300px;
  width: 300px;
  background-color: red;
  position: relative;
}

.blue {
  height: 200px;
  width: 200px;
  background-color: blue;
  position: absolute;
  right: 0;
  bottom: 0;
}
```

親要素となるredに```position: relative;```を追記して、子要素であるblueに```position: absolute;```, ```bottom: 0;```, ```right: 0; ```の３行を追記しました。
それでは結果を確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134077/81022f6e-5cfa-1e1a-0c2b-d862edd1bf49.png)

右下に移動させることができました。

ここで再確認

```position; relative;```は現在の位置を基準に相対的な位置を決める
```position; absolute;```は親要素の位置を基準に位置を決める


>*注意点*
absoluteを使って位置調整するときは、親要素にposition:relative（もしくはfixed）を指定するのを忘れない。


もう一度、次は子要素のblueをredの中心に表示させてみる。

```style.css
.red {
  height: 300px;
  width: 300px;
  background-color: red;
  position: relative;
}

.blue {
  height: 200px;
  width: 200px;
  background-color: blue;
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
}

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134077/72e817d6-de70-b360-2a28-1ab75caa4796.png)



#参考サイト
https://saruwakakun.com/html-css/basic/relative-absolute-fixed
Eclipse 4.8 で始める Groovy 2.4 ~準備編~


## 環境構築

### Eclipseのダウンロードとインストール

 [Pleiades All in One Eclipse 4.8 Photon](http://mergedoc.osdn.jp/pleiades_distros4.8.html) のページから、Java用のFull Editionをダウンロードします。
 > Windowsの場合は、[zip解凍時の注意](http://mergedoc.osdn.jp/pleiades.html#zip-notice)を必ず参照の事


### Groovyプラグインのインストール

Eclipseを起動し、[ヘルプ]->[新規ソフトウエアのインストール...]から

1. [作業対象] に [http://dist.springsource.org/release/GRECLIPSE/e4.8](http://dist.springsource.org/release/GRECLIPSE/e4.8) を入力し、[追加...]します
1. [Main Package (必須)]を選択してインストールします
  - Groovy 2.5 を使用する場合は、[More Compilers（オプション）] -> [Groovy Compiler 2.5] にもチェックを付けてインストールします 
3. Eclipseの再起動が求められるので、再起動します

※ 2018/08/07 追記 [Groovy-Eclipse 3.0.0](https://github.com/groovy/groovy-eclipse/wiki/3.0.0-Release-Notes)がリリースされましたので、Update-SiteのURLを変更しました。

## Gradleプロジェクトの作成

1. [ファイル]->[新規]->[Gradleプロジェクト] を選択します
1. 適当な名前を付けてプロジェクトを作成します

### build.gradle ファイルの編集

build.gradleファイルを開き、次のように編集します。

```groovy
/*
 * This build file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Java Library project to get you started.
 * For more details take a look at the Java Libraries chapter in the Gradle
 * user guide available at https://docs.gradle.org/4.3/userguide/java_library_plugin.html
 */

// Apply the java-library plugin to add support for Java Library
//apply plugin: 'java-library'
apply plugin: 'groovy'

// In this section you declare where to find the dependencies of your project
repositories {
    // Use jcenter for resolving your dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

dependencies {

    // https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-all
    compile group: 'org.codehaus.groovy', name: 'groovy-all', version: '2.4.15'

    // This dependency is exported to consumers, that is to say found on their compile classpath.
    //api 'org.apache.commons:commons-math3:3.6.1'

    // This dependency is used internally, and not exposed to consumers on their own compile classpath.
    //implementation 'com.google.guava:guava:23.0'

    // Use JUnit test framework
    //testImplementation 'junit:junit:4.12'
    testCompile 'junit:junit:4.12'
}
```

### ソース・フォルダーの作成

1. src/mainの下に`groovy`フォルダーを作成します。
2. プロジェクトを右クリックし、[Gradle]->[Gradleプロジェクトのリフレッシュ]を選択します。

### 初めてのGroovyプログラムを作成する

1. [ファイル]->[新規]->[その他...]を選択します。
2. [Groovy]->[Groovy クラス]を選択し、[次へ]をクリックします。
3. [名前]に`FirstGroovy` と入力し、[完了]をクリックするとファイルが作成されます。
4. 次のように編集し、保存します。

```groovy
package sample

class FirstGroovy {

	static void main(args) {
		println "Hello Groovy!!"
	}
}
```

### Groovyプログラムの実行

作成したプログラムは、次の３つの方法で実行することができます。

#### Groovy Consoleから実行する
1. 右クリックで表示されるコンテキストメニューから、[実行]->[Groovy Console]を選択します。
2. [Ctrl]+[R]キーで実行することができます。

#### Groovy Scriptから実行する
1. 右クリックで表示されるコンテキストメニューから、[実行]->[Groovy Script]を選択します。
2. Eclipseのコンソールに実行結果として、`Hello Groovy!!`が表示されます。

#### Java アプリケーションとして実行する
1. 右クリックで表示されるコンテキストメニューから、[実行]->[Java アプリケーション]を選択します。
2. Eclipseのコンソールに実行結果として、`Hello Groovy!!`が表示されます。
WindowServer2008R2より前のOSでRasDial関数を実行する

多分自分以外には全く役に立たないし、これから先の未来永劫参照されることはない情報だと思うが、せっかく調べたので投稿しておく。


古いWindowsアプリケーションをVisualStdio2015の環境でビルドしなおしていたところ、WindowsServer2008R2より前のOSで正常に動作しない現象に出会った。
しかしWindows8.1やWindowsServer2012であればキチンと動作する。

本来ならデバッガを動かしたいところだったが訳あって現象が出るOSにリモートデバッガをインストールすることができなかった。
ログをろくに出力していないアプリケーションだったので、どこで止まっているかを確認するために、とりあえずログを出力するようにした。

エラーになっていたところは以下の関数のところだった。この関数は平成も終わるこのご時世にいまだ使われている古の通信方法であるダイヤルアップ接続を行うための関数である。

[ダイヤルアップ接続](https://ja.wikipedia.org/wiki/%E3%83%80%E3%82%A4%E3%83%A4%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E6%8E%A5%E7%B6%9A)
[RasDial関数](https://msdn.microsoft.com/ja-jp/library/cc446967.aspx)


エラーコードを見ていると６３２となっていたが、このメッセージの意味は「構造体のサイズが違う」ということらしい。

[ダイヤルアップ接続または VPN 接続のエラー コード一覧](https://support.microsoft.com/ja-jp/help/824864/list-of-error-codes-for-dial-up-connections-or-vpn-connections)

正直「なんだこのエラーわ？？」という感じだったが、引数一つ一つ構造体を確認してみると、どうやらWindowsのバージョンによってRASDIALPARAMS構造体の定義が変わるとのこと。

```
#define RASDIALPARAMSW struct tagRASDIALPARAMSW
RASDIALPARAMSW
{
    DWORD dwSize;
    WCHAR szEntryName[ RAS_MaxEntryName + 1 ];
    WCHAR szPhoneNumber[ RAS_MaxPhoneNumber + 1 ];
    WCHAR szCallbackNumber[ RAS_MaxCallbackNumber + 1 ];
    WCHAR szUserName[ UNLEN + 1 ];
    WCHAR szPassword[ PWLEN + 1 ];
    WCHAR szDomain[ DNLEN + 1 ];
#if (WINVER >= 0x401) // 95/NT4 and later
    DWORD dwSubEntry;
    ULONG_PTR dwCallbackId;
#endif
#if (WINVER >= 0x601) // Windows 7 and later
    DWORD dwIfIndex;
#endif
};
```

msdnのホームページを確認したときにはifマクロの定義がなかったが、実際のコードを確認してみたらifマクロが記述されていた。
この関数を実行する際にコンパイルした環境が期待している構造体のサイズとWindows2008R2以前の環境で実行する時の構造体のサイズのチェック処理があり、そこで引っかかるようになってしまったということらしい。

検索してみたらまさかStackoverflowにも同様の記事があった！

[RAS API. sizeof(RASDIALPARAMS) is wrong. Error 632](https://stackoverflow.com/questions/22836764/ras-api-sizeofrasdialparams-is-wrong-error-632)

ifマクロ使って条件分岐なんてことはしたくはないので、以下のように修正している。なんてことはなく、ERROR_INVALID_SIZEが返ってくるたびに構造体のサイズを小さくして実行するだけである。

```
RASDIALPARAMSW ras_param;
ZeroMemory(&ras_param, sizeof(ras_param));

ras_param.dwSize = sizeof(RASDIALPARAMSW);

DWORD dwRet = RasSetEntryDialParamsW(0, &ras_param, 0);
if (dwRet == ERROR_INVALID_SIZE) {
    ras_param.dwSize = offsetof(RASDIALPARAMSW, dwIfIndex);
    dwRet = RasSetEntryDialParamsW(0, &ras_param, 0);
}
if (dwRet == ERROR_INVALID_SIZE) {
    ras_param.dwSize = offsetof(RASDIALPARAMSW, dwSubEntry);
    dwRet = RasSetEntryDialParamsW(0, &ras_param, 0);
}
```

また、どうやらRasGetConnectStatus関数も同様にWindowsのバージョンで構造体が変わっているらしい。

[RasGetConnectStatus](https://msdn.microsoft.com/ja-jp/library/cc447028.aspx)

こちらも同様に、ERROR_INVALID_SIZEが返ってきたら徐々にサイズを縮めていけば良さそう。
というかどちらもページにも構造体のサイズに関する注意書きがあるので、もう少しアンテナを貼って置くべきだった…

とりあえず、これでWindows7、WindowsServer2008、WindowsServer2008でも動作する。
あと４〜５年したらアナログ回線やISDN回線による通信は絶滅する（とは言い過ぎかもだけど）と思うので、こんな現象に出会うのもこれで最後かもしれない。
ROS講座32 rqt_plotでリアルタイムでグラフ表示する

# 環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 20.04 |
| ROS | Noetic |

インストールについては[ROS講座02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)を参照してください。
またこの記事のプログラムはgithubにアップロードされています。[ROS講座11 gitリポジトリ](https://qiita.com/srs/items/25a56a6abda41dcf396e)を参照してください。
# 概要
rqtにはrqt_plotというリアルタイムにグラフを表示する機能があります（ちなみにややこしい名前のツールとしてrqt_graphがありますが、これはROSノードとROSトピックの接続関係のノードグラフを表示します）。
ROSトピック中の基本的な数値を表示することが出来ます。`std_msgs::Float32`のようなfloat型ででPublisされている値だけでなく、`geometry_msgs::Pose`の中のfloatで定義されている`position.x`フィールドも表示できます。
rqt_plotではx軸が時間、y軸がトピックの値の2次元プロットを表示します。

# 準備
今回のlaunchファイルを実行するためには以下のインストールが必要です。

```shell
sudo apt-get install ros-kinetic-robot-pose-publisher
```

実行用に以下のlaunchファイルを使います。移動ロボットをrviz上で再現するためのvis_lectureのmove_robot.launchにrobot_state_publisherを追加しただけです。今回はロボットを動かすのに/cmd_velにコンソールでpublishするか、PS3コントローラーが必要です。/cmd_velではロボットの速度、/poseでロボットの位置を示しています。

```xml:info_lecture/launch/move_robot.launch
<launch>
  <arg name="model" default="$(find vis_lecture)/urdf/move_robot.urdf" />
  <arg name="rvizconfig" default="$(find vis_lecture)/rviz/move_robot.rviz" />
  <arg name="joy" default="false" />
  <param name="robot_description" command="$(find xacro)/xacro.py $(arg model)" />
  
  <group if="$(arg joy)">
    <node name="joy_node"   pkg="joy" type="joy_node" />
    <node name="basic_twist_publisher" pkg="basic_lecture" type="basic_twist_publisher"/>
  </group>
  <node name="vis_robot_sim" pkg="vis_lecture" type="vis_robot_sim"/>

  <node name="robot_pose_publisher" pkg="robot_pose_publisher" type="robot_pose_publisher">
    <param name="map_frame" value="world" />
    <param name="base_frame" value="base_link" />
    <param name="publish_frequenc" value="20" />
    <remap from="robot_pose" to="/pose" />
  </node>

  <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />
</launch>
```

# 実行
roslaunchのターミナルとは別のターミナルでrqt_plotを実行します。各ターミナルごとに実行前に`source ~/catkin_ws/devel/setup.bash`を実行する必要があります。

```shell:launchの実行
roslaunch vis_lecture move_robot.launch joy:=true
```

```shell:rqt_plotの実行
rosrun rqt_plot rqt_plot 
```

出てくるrqt_plotの画面で表示したいROSトピック名とそのfield名を入力します。floatやintの数値を含むfieldを指定する必要があります。つまり`/cmd_vel`ではなくで`/cmd_vel/linear/x`と入れて「＋」ボタンを押す必要があります（Enterでもできます）。
この状態で動かすと以下の画像のようにリアルタイムにプロットがなされます。表示を減らしたいときはは「―」ボタンを押した後に項目を指定します。

![vis_plot.gif](https://qiita-image-store.s3.amazonaws.com/0/254442/4d3e0de5-f71e-c3c9-fdb7-b7dd89538bc7.gif)

#参考
[ROSwiki](http://wiki.ros.org/ja/ROS/Tutorials/UnderstandingTopics)

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)
コードを不特定の人と共有

##経緯
ネット上で質問するときにコードを人に見せたい。
Web上でいい感じの共有サイトをメモ。
###GitHubGist
[https://gist.github.com/](https://gist.github.com/)
###PASTBIN
[https://pastebin.com/](https://pastebin.com/)

#プログラムについての質問の仕方
##Webフォーラムで質問する
###Stack Overflow
[http://stackoverflow.com/](http://stackoverflow.com/)
###redditのlearn programming
[http://reddit.com/r/learnprogramming/](http://reddit.com/r/learnprogramming/)

##質問の仕方
* 何をしたのかだけではなく、何をしたいのか説明する。間違った方法を取っているかどうかを判断しやすくなる。
* エラーの起こった箇所を特定する。プログラムを実行するとすぐにエラーになるのか、あるいは、何らかの動作を行ったときのみにエラーになるのか。
* 問題を解決しようとして試みたことを説明する。自力で解決しようとしたことを伝える。
* 使っているOSの種類、バージョン、コンパイラの種類とバージョンなどの実行環境や開発環境を書く。
* コードを変更してエラーになったのなら、何を変更したのかを正確に説明する。
* プログラムを実行すると毎回エラーになるのか、あるいは、何らかの処理をした後にだけエラーが生じるのかを書く。後者の場合は、どんな処理なのかも書く。
Macのgcc, g++をHomebrewを使って最新版にする

# モチベーション
私はデスクトップはUbuntu、ノートPCはMacを利用しているのですが、
全く同じC++のコードを両者で同じようにコンパイルした際に、MacでだけWarningが出たりします。
Command Line Toolsで入れたMacのコンパイラがよろしくないのが原因っぽいので、最新版に更新してしまいましょう。

# やること

```
$ brew install gcc
```

インストールはこれだけで終わりです。
Homebrew経由で入れたパッケージは`/usr/local/Celler/`に保存され、`/usr/local/bin/`にコマンドのエイリアスが自動で貼られます。
`/usr/local/bin/`からエイリアスを探し当てます

```
$ ls /usr/local/bin | grep gcc
$ ls /usr/local/bin | grep g++
```

上記コマンドで見つかった`gcc-8`と`g++-8`がお目当てのエイリアスです。
見つかったエイリアスに対してシンボリックリンクを貼ってあげましょう。

```
$ ln -s /usr/local/bin/gcc-8 /usr/local/bin/gcc
$ ln -s /usr/local/bin/g++-8 /usr/local/bin/g++
```

最後に`~/.bash_profile`の良い感じの場所に以下の記述をして、優先順位高めのパスを通したら終了です。

```
export PATH=$PATH:/usr/local/bin
```

#結果

```
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/8.2.0/libexec/gcc/x86_64-apple-darwin16.7.0/8.2.0/lto-wrapper
Target: x86_64-apple-darwin16.7.0
Configured with: ../configure --build=x86_64-apple-darwin16.7.0 --prefix=/usr/local/Cellar/gcc/8.2.0 --libdir=/usr/local/Cellar/gcc/8.2.0/lib/gcc/8 --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-8 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl --with-system-zlib --enable-checking=release --with-pkgversion='Homebrew GCC 8.2.0' --with-bugurl=https://github.com/Homebrew/homebrew-core/issues --disable-nls
Thread model: posix
gcc version 8.2.0 (Homebrew GCC 8.2.0)
$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/8.2.0/libexec/gcc/x86_64-apple-darwin16.7.0/8.2.0/lto-wrapper
Target: x86_64-apple-darwin16.7.0
Configured with: ../configure --build=x86_64-apple-darwin16.7.0 --prefix=/usr/local/Cellar/gcc/8.2.0 --libdir=/usr/local/Cellar/gcc/8.2.0/lib/gcc/8 --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-8 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl --with-system-zlib --enable-checking=release --with-pkgversion='Homebrew GCC 8.2.0' --with-bugurl=https://github.com/Homebrew/homebrew-core/issues --disable-nls
Thread model: posix
gcc version 8.2.0 (Homebrew GCC 8.2.0)
```
Swift　ローカル通知

# ローカル通知を設定　
```viewController.swift
import UserNotification

//通知のタイトルと内容を設定
let content = UNMutableNotificationContent()
content.title = "(タイトル)"
content.body = "(内容)"
content.sound = UNNotificationSound.default() //通知音

//通知する日付を設定
let date:Date = (通知したい日付)
let calendar = Calendar.current()
let dateComponent = calendar.dateComponents([.year, .month, .day, .hour, minute] , from: date)

//以上の通知をリクエストに指定
let trigger = UNCalendarNotificationTrigger.init(dateMatching: dateComponent, repeats: false)
let request = UNNotificationRequest.init(identifier: "一意の値", content: content,//UNMutableNotificationContent trigger: trigger //UNNotificationTrigger)

//通知を設定
let center = UNNotificationCenter.current()
center.add(request, completion: nil)
```

#ユーザーへローカル通知の許諾の通知
```AppDelegate.swift
import UserNotification

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert,.sound]){(granted, error) in
            
        }
        
        center.delegate = self;
        return true
    }
```

またアプリ起動中でもローカル通知を表示させるためのコード

```AppDelegate.swift
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.sound, .alert])
    }
```
Linuxのファイルシステム

LPICの勉強しててファイルシステムがよく分かってなかったのでまとめた

#ファイルシステム階層標準（FHS:Filesystem Hierarchy Standard）

Linuxにはいろいろなディストリビューション（CentOSとかubuntuとか）があり、それぞれが独自に開発してた結果、ディストリビューションごとにディレクトリの階層構造が違ったり、保存するファイルの場所が異なったりする問題があった。そこでどのディレクトリにどんなフィアルを配置するのかを統一し、ディストリビューション間でのディレクトリ構造の互換性を保つために策定されたのが**ファイルシステム階層標準（FHS）**。
FHSが規定するディレクトリには必須のものとオプションがある。

#ディレクトリ構造

```
/ 
⊢bin
⊢boot
⊢dev
⊢etc
⊢lib
⊢media
⊢mnt
⊢opt
⊢sbin
⊢tmp
⊢usr
⊢var
〜ここまで必須、以下はオプション〜
⊢home
∟root
```
/bin：cat,ls,cp などのシステム管理や一般ユーザーが使用する基本的なコマンドが入ってる。
/boot：コンピュータの起動に必要なファイルが入ってる。
/dev：デバイスを扱う時に必要なファイルが入ってる。
/etc：設定ファイルが入ってる。設定がいっぱいあるアプリケーションでは、/etc以下に
　　　サブディレクトリを作って、その中に設定ファイルを保存している場合もある。
/lib：システム起動時や、/bin、/sbinディレクトリ内のコマンドを実行するのに必要な
　　　共有ライブラリが入ってる。
/media：CD-ROMなどのリムーバブルメディアのマウントポイント
　　（マウントする対象のディレクトリ）。
/mnt：ファイルシステムの一時的なマウントポイント用ディレクトリ。
/opt：アプリケーションソフトウェアパッケージが入ってる。/opt直下に
　　　ソフトウェアパッケージと同じ名前のサブディレクトリが作成され、その下に
　　　/binや/manとかのファイルが配置される。
/sbin：shutdownコマンドとかシステム管理者用のコマンドが入ってる。
　　　一般ユーザには実行権限がないものがほとんど。
/tmp：ファイルとかを一時的に保存するディレクトリ。
/usr：/usr/bin、/usr/lib、/usr/localとかのサブディレクトリが入ってる。
　　　このディレクトリにはシステムによって変更されることのないファイルが置かれてる。
/var：システムログとか変化しやすい（Variable）ファイルが入ってる。

/home：各ユーザーのホームディレクトリが入ってる。共有ファイルサーバーのみに
　　　使用するサーバーなんかだと個人用のホームディレクトリは不要。
/root：rootユーザー用のホームディレクトリ。/homeディレクトリでなんか障害が
　　　　起こってもrootユーザーがシステム管理のために作業する領域を確保するためにある。
PHP の マイクロフレームワーク flight の使い方

[Flight](http://flightphp.com/)の使い方です。
Nginx で使う方法です。

1) インストール
例えば、/var/www/tmp/jul2901 で、

```bash
composer require mikecao/flight
```

2) index.php の作成

```php:index.php
<?php
require 'vendor/autoload.php';

Flight::route('/', function(){
echo 'Hello World!<p />';
echo 'こんばんは<p />';
echo 'Jul/29/2018 PM 19:55<p />';
});

Flight::start();

?>
```

3) ブラウザーで、
>https://ekzemplaro.org/tmp/jul2901 にアクセス
![flight_jul2901.png](https://qiita-image-store.s3.amazonaws.com/0/179446/7b0c321c-5e7c-3b0d-b1cf-333bb2ccef03.png)

4) フォルダーの構造

```text
$ tree -L 4
.
├── composer.json
├── composer.lock
├── index.php
└── vendor
    ├── autoload.php
    ├── composer
    │   ├── autoload_classmap.php
    │   ├── autoload_files.php
    │   ├── autoload_namespaces.php
    │   ├── autoload_psr4.php
    │   ├── autoload_real.php
    │   ├── autoload_static.php
    │   ├── ClassLoader.php
    │   ├── installed.json
    │   └── LICENSE
    └── mikecao
        └── flight
            ├── composer.json
            ├── flight
            ├── index.php
            ├── LICENSE
            ├── README.md
            ├── tests
            └── VERSION
```

5) Nginx でなく、ビルトインサーバーを使う時は、

```bash
php -S 0.0.0.0:9000
```

次のバージョンで確認しました。

```text
$ php --version
PHP 8.0.8 (cli) (built: Oct 26 2021 11:42:42) ( NTS )
```
[AutoHotKey]OneTabオルタナティブなMarkdownブックマークスクリプト


- [OneTab extension for Google Chrome and Firefox \- save up to 95% memory and reduce tab clutter](https://www.one-tab.com)

OneTabはとってもいいものなのだけど、クロスブラウザで使えない欠点がある。
（[Chrome/Kinza間でOneTabの同期、ついでにバックアップ \- Qiita](https://qiita.com/catfist/items/e5ec41299e500877f4c6)）

だったらもう、Markdownファイルにガンガン書き込んだらいんじゃね？

## Markdownブックマークファイルの閲覧
- [Markdown Viewer \- Chrome ウェブストア](https://chrome.google.com/webstore/detail/markdown-viewer/ckkdlimhmcjmikdlpkmbgfkaikojcbjk)

まあこのあたりで

## AutoHotKeyスクリプト
削除はテキストエディタでやればええやろと思ってなにも作ってないマン。

```MarkdownBookmark.ahk
/*
ブックマークファイルにMarkdown形式リンクを書き込み
*/
MarkdownBookmark() {
    file = %USERPROFILE%\Dropbox\Scrap.md

    link := GetMarkdownLink()

    FileAppend, - %link%`n, %file%

    TrayTip, %A_ScriptName%, ブックマークに追記`n%link%, 5
}
GetMarkdownLink(browser="A") {
    title := RegExReplace(GetBrowserTitle(browser), " - Kinza$", "")
    title := RegExReplace(title, "([-*_()\[\]])", "\$1")
    Return, "[" . title . "](" . GetBrowserUrl(browser) . ")"
}
GetBrowserTitle(browser="ahk_exe Kinza.exe") {
    title =
    While, (title = Blank)
    {
        WinGetTitle, title, %browser%
        Sleep, 50
        if (A_Index > 50)
            Break
    }
    Return, title
}
; GetBrowserUrl() -> https://autohotkey.com/boards/viewtopic.php?t=3702
WinActiveBrowser() {
    Browsers = kinza.exe,Chrome.exe,Opera.exe,Firefox.exe
    sclass := WinGet_ProcessName()
    If sclass in % Browsers
        Return, 1
    Else
        Return, 0
}

; global hotstring
::mdb::MarkdownBookmark()

; browser hotkey
#If (WinActiveBrowser())
+!l::MarkdownBookmark()
#if
```
macでopenFrameworks入門してみた

##はじめに
もともとヴィジュアルプログラミングに興味があり、TouchDesignerぽちぽち触ったりしてはいたのですが、macとwindowsの環境差分に当たることが多かったためいっそもっと低いレイヤーにお引越ししようと思ってopenFrameworksに入門してみました。
詳細には書きますが自分のメモを兼ねているので悪しからず。。。

##パッケージダウンロード
https://openframeworks.cc/ja/download/
↑ここから落とす。`df_vx.x.x_osx_release.zip`みたいな形式のzipファイルが落ちてくるので解凍してあげて任意のディレクトリへ

##フォルダ構成
これはバージョンごとで変わる可能性が大いにあるので適宜頑張って欲しいけど現状の最新である`0.10.0`だとこんな感じです

```
├── addons
├── apps
├── docs
├── examples
├── libs
├── other
├── projectGenerator
└── scripts

```
examplesになにやらサンプルプロジェクトがたくさんはいっているので実行して遊んで見ると楽しいです。

実行方法はプロジェクトのディレクトリに入って以下を実行

```
make
make run
```


試しに`/of_v0.10.0_osx_release/examples/gl/alphaMaskingShaderExample`に入って`make` したあと`make run`すると,,,
<img width="833" alt="スクリーンショット 2018-07-27 8.31.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/255246/25312851-7adf-a259-f780-d5dd929d1033.png">

こんな感じのが実行できます。すっごーい


##新規プロジェクトの作成
続いて新規プロジェクトを作ってみましょう。
作り方は簡単`of_v0.10.0_osx_release/apps/myApps/emptyExample`をcpするだけ。
```
cp -r emptyExample hello_open_frameworks
```
こんな感じでcpしてあげればokです

##ハロワ
さて、いよいよコードを書いていきましょう!...と、その前にまずはファイル構成の確認をします。

```
├── Makefile
├── Project.xcconfig
├── README.md
├── addons.make
├── bin
├── config.make
├── emptyExample.png
├── emptyExample.xcodeproj
├── obj
├── openFrameworks-Info.plist
└── src
```
色々あるけど主に使うのはsrc配下のファイル。

```
.
├── main.cpp
├── ofApp.cpp
└── ofApp.h
```
そしてsrc配下はこんな感じになっていてofApp.cppを書き換えていくことになります。

```
#include "ofApp.h"                                                                                                                                                                   

//--------------------------------------------------------------
void ofApp::setup(){

}

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

}

//--------------------------------------------------------------
void ofApp::draw(){

}

//--------------------------------------------------------

```
こんな感じになってます。(Processingっぽい!)

試しに円を描画して見ます。

```
void ofApp::draw(){
ofDrawCircle(400,400,200);
}
```
第一引数がx軸で第二引数がy軸第三引数が円の大きさになっています。これでmakeしてmake runすると、

<img width="1021" alt="スクリーンショット 2018-07-29 19.59.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/255246/60a4e00b-79ef-0578-3a96-5951ae69d5e9.png">
このような円が表示されます。


これで入門はひとまず終了...これから色々試していきます。