OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi Zero WでAzure CLI 2.0を使う

#はじめに
Raspberry Pi Zero Wが入手できましたので、こちらにdebianベースのraspbianをインストールして、無線LANを有効化、更にAzure CLI 2.0をインストールしてみました。
![20525265_1634730949902657_733720618196274206_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/137436/0066002f-8e89-7323-5b03-db0255ea765f.jpeg)

#raspbianの設定
基本的には公式サイトからイメージをダウンロードしてきてSDカードに書き込んで起動します。
basicな設定は以下のコマンドでサクっと設定します。

```
sudo raspi-config
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/d157f7b5-2975-4763-4f0e-9ed7890984bf.png)


##無線LAN設定
GUIでやってもいいですけど、以下のファイルにSSID情報を設定すればOKです

```text:/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=GB

network={
        ssid="<<接続する無線APのSSID?>"
        psk="<<シークレットキー>>"
        key_mgmt=WPA-PSK
}
```

##IPアドレスの固定化
以下のファイルの最後に固定化したいIPアドレス情報を追加します

```text:/etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.0.32/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
```

上記例では無線LANのインタフェースについてIPアドレスに 192.168.0.32 を設定しています。

#Azure CLI 2.0のインストール
MS公式サイトの[Azure CLI 2.0 のインストール](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli)では以下のコマンドでLinuxの場合はOKとあります。

```bash
curl -L https://aka.ms/InstallAzureCli | bash
```

raspbianにインストールする場合にはその前に必要なパッケージをインストール後に実行します。
以下が正常インストールするためのコマンドとなります。

```bach
sudo apt-get install libffi-dev
sudo apt-get install python-dev
sudo apt-get install libssl-dev
sudo curl -L https://aka.ms/InstallAzureCli | bash
```

インストールには暫く時間がかかりますが、じっと待ちます。
最後に "Installation successful" と出たら完了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/ee192307-cc97-e6ae-dcc0-4a30ad42e801.png)

無事azコマンドが実行できるのを確認します。

```bash
pi@raspberrypi:~ $ source .bashrc
pi@raspberrypi:~ $ az login
To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code XXXXXXXX to authenticate.

(snip)

pi@raspberrypi:~ $ az vm list -o table

pi@raspberrypi:~ $ az account set --subscription XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
pi@raspberrypi:~ $ az vm list -o table
Name         ResourceGroup               Location
-----------  --------------------------  ----------
DFGWVM01     DATAFACTORYTEST20170620-RG  japaneast
SQLSVVM01    DATAFACTORYTEST20170620-RG  japaneast
JMVM01       J-TEST-RG                   japaneast
JMVMAG01     J-TEST-RG                   japaneast
VMJMAG02     J-TEST-RG                   japaneast
KtkrWin2016  WINCLIENTS-RG               japaneast
pi@raspberrypi:~ $
```

#おわりに
正直 Raspberry Pi Zero Wは遅いです。しかし、非常にコンパクトで無線LANもBluetoothも使えるため、今回のAzure CLI 2.0のインストールを皮切りに、主にIoT的な分野で色々とAzureと組み合わせて楽しいことや、便利が事ができそうです。

また、何かやったら投稿します。
Hiveのexternal table + s3のちょっとした検証

ちゃんと実装を知っている人には「何言ってんの当たり前やん馬鹿が死ねィッ」てなものでしょうけども、ほら、備忘にもなるし。

こんな感じでデータファイルを用意する。

・hoge.csv

```
1,"a"
2,"b"
```

・fuga.csv

```
3,"c"
4,"d"
```

・piyo.csv

```
5,"e"
6,"f"
```

create文はこんなので。
バケットとキーは適当に。

```
CREATE EXTERNAL TABLE s3verify (
  id int,
  name string
)
PARTITIONED BY (ts BIGINT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
LOCATION 's3://tekitou/test';

```

まず、s3://tekitou/test
下に
ts=10000
キーを作成、その下にhoge.csvを設置。

```
s3://tekitou/test/ts=10000/hoge.csv
```

こんなんね。
で、select。
当然、

```
OK
Time taken: 0.306 seconds
```

empty。パーティション認識してないしね。

```
msck repair table s3verify;
```

をブン投げ、もう1度select。

```
OK
1       "a"     10000
2       "b"     10000
```

はい。ここまでは何度もやったからそらそうなるって感じはする。
で、この後。
ts=10000下に、fuga.csvをアップロード。すぐselectしてみる。

```
OK
1       "a"     10000
2       "b"     10000
3       "c"     10000
4       "d"     10000
```

認識している。これもまあ当然といえば当然感はある。
次。ts=10000下に add/ って階層を切り、その中にpiyo.csvを置いてみる。

```
s3://tekitou/test/ts=10000/add/piyo.csv
```

さてどうなるか。

```
OK
5       "e"     10000
6       "f"     10000
1       "a"     10000
2       "b"     10000
3       "c"     10000
4       "d"     10000
```

認識した。ちょっとびっくり。これってs3だからなのか、hdfsでも同じなのか。
気にはなったけどここまで。
Binary search in Python / C++


You can use bisect module to perform binary search in Python.
But unfortunately, unlike Ruby's bsearch, you cannot pass lambda (or key) to the function.

However, you can pass a fantastic class to make a special comparison.

This example will compute `math.ceil(math.sqrt(1000))`. You can modify f() to any custom stuff.

```py
#!/usr/bin/python

class KeyRange(object):
    def __init__(self, lo, hi, key):
        self.lo = lo
        self.hi = hi
        self.key = key
    def __len__(self):
        return self.hi-self.lo
    def __getitem__(self, k):
        return self.key(k)

def f(n):
    return n**2>=1000
import bisect
print(bisect.bisect_left(KeyRange(0,1000,f),1))
```

### PS

Well, this looks like what Guido loves, indeed...

### Acknowledgements
- https://gist.github.com/ericremoreynolds/2d80300dabc70eebc790

## C++

Recentry I updated cpp_range (https://qiita.com/cielavenir/items/94c9abbb7767bd57607b) to enable KeyRange. You can find some fun on it, although using [partition_point](http://www.cplusplus.com/reference/algorithm/partition_point/) looks better.

Usage is like this:

```cpp
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;

int main(){
	auto kr=makeKeyRange(0,1000,[&](int i)->const int{return i*i>=1000;});
	auto it=lower_bound(kr.begin(),kr.end(),1);
	printf("%d\n",distance(kr.begin(),it));
}
```
Unityのプロジェクトフォルダの場所を確認する & データのエクスポートの仕方

Unityのプロジェクトフォルダの場所を確認する方法を紹介します。また自分のプロジェクトデータをエクスポートする方法も紹介します。どちらも簡単ですので是非活用してください。


# Unityのプロジェクトフォルダの場所を確認する

メニューバーから
[Assets]>[Reveal in Finder]をクリックする。

もしくは

Projectビューで右クリックを行い[Reveal in Finder]をクリックする。

上記はMacの場合です。Windowsの場合は[Reveal in Explorer]という項目となっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96970/c55c1fbc-ae26-27e3-81f0-ee9fb317db8f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96970/63b5a945-45c3-833d-5f38-d76584a8f9bc.png)

# データのエクスポートの仕方

データをエクスポートするとは、自分のUnityのデータをunitypackage形式で書き出すということです。

メニューバーから
[Assets]>[Export Package...]をクリックする。

もしくは

Projectビューで右クリックを行い[Export Package...]をクリックする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96970/ed45a57e-2644-0060-aa58-2cd7e86e3316.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/96970/dcdd0cc7-41ca-a3b9-4c71-772ebd82df30.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96970/e271a2f5-1c44-d874-2b8c-753d491331b5.png)

このようにunitypackage形式のファイルを書き出すことができました！
UWPアプリをアンインストールする方法

Windows8から導入されたUWPアプリ(Universal Windows Platform)は通常のアプリと異なりユーザーに対してインストールされる。インストール場所は`ユーザープロファイルフォルダ\AppData\Local`内となる。
ここで紹介する方法ではGUIからアンインストールできないアプリもアンインストール可能。（一部できないものもある）


## アプリのパッケージ名を取得する
ユーザーIDを省略すると、シェルを実行したユーザーを対象となる。

```ps1:PowerShell
Get-AppxPackage -User <USER_ID> | Format-List -Property PackageFullName

【例】
Get-AppxPackage -User hoge | Format-List -Property PackageFullName

PackageFullName : Microsoft.Windows.CloudExperienceHost_10.0.15063.0_neutral_neutral_cw5n1h2txyewy

PackageFullName : Microsoft.AAD.BrokerPlugin_1000.15063.0.0_neutral_neutral_cw5n1h2txyewy

...
```

## アプリをアンインストールする
ユーザーIDを省略すると、シェルを実行したユーザーを対象となる。

```ps1:PowerShell
Remove-AppxPackage -User <USER_ID> -Package <PACKAGE_FULL_NAME>

【例】
Remove-AppxPackage -User hoge -Package Microsoft.AAD.BrokerPlugin_1000.14393.0.0_neutral_neutral_cw5n1h2txyewy
```

## 番外編: すべてのアプリをアンインストールする
```ps1:PowerShell
Get-AppxPackage | Remove-AppxPackage
```

## 参考
https://technet.microsoft.com/ja-jp/library/dn448380.aspx
https://technet.microsoft.com/ja-jp/library/dn448374.aspx
JavaScriptでPHPのnumber_format

[number_format()](http://php.net/manual/ja/function.number-format.php "PHP: number_format")は、
数値に3桁ずつカンマを挿入してくれるPHPの関数です。
これをJavaScriptで実現する関数を作ってみました。

整数だけだったら正規表現でなんとかなるんですが、小数も対応しようとするとちょっと大変です。
以下の関数では本家`number_format`の第二引数（小数点以下の桁数）まで対応してみました。

```javascript
/**
 * 数値をカンマ区切りに変換する
 */
function number_format(num, decimals)
{
    //小数点以下の表示桁数
    var _decimals = decimals | 0;

    //指定桁以下を切り捨てた数値
    var _shift = Math.pow(10, _decimals);
    var _floor = Math.floor(num * _shift) / _shift;

    //整数部と小数部に分ける
    var _integerPart = Math.floor(_floor);
    var _decimalPart = (_floor.toString().split('.').length > 1) ? _floor.toString().split('.')[1] : '';

    //整数部にカンマを付与
    var _num = Math.abs(_integerPart).toString().split(/(?=(?:\d{3})+$)/).join();

    //小数部を付与
    if (_decimals > 0) {
        var zeroStr = '';
        for (var i = 0; i < _decimals; i ++) zeroStr += '0';
        _num += '.' + (zeroStr + _decimalPart).slice(-_decimals);
    }

    //負の記号を付与して返却
    return (num < 0) ? ('-' + _num) : _num;
}
```
Angular QuickStart ｖ4.3.3 の日本語訳(最新版)


Angular公式サイトのAngular QuickStart がｖ4.3.3対応として新しくなっています。
https://angular.io/guide/quickstart

まだ日本語訳のページが存在していないようでしたので日本語訳を作成してみました。
（Google翻訳任せで恐縮ですが。。。）

まだ、全量作成出来ていませんが、順次、拡充させていきます。

# QuickStart

優れたツールを使用すると、すべてを手作業で行った場合よりも、アプリケーション開発を迅速かつ簡単に行うことができます。

[Angular CLI](https://cli.angular.io/)は、プロジェクトを作成したり、ファイルを追加したり、テスト、バンドル、デプロイメントなどのさまざまな進行中の開発タスクを実行できるコマンドラインインターフェイスツールです。

このガイドの目的は、Angularプロジェクトで役立つ[スタイルガイド](https://angular.io/guide/styleguide)の推奨事項を遵守しながら、Angular CLIを使用してTypeScriptで簡単なAngularアプリケーションを構築して実行することです。

この章の最後では、CLIを使用した開発の基礎知識と、これらのドキュメンテーションサンプルの基礎と、実際のアプリケーションの基礎について説明します。

また、[サンプル](https://angular.io/generated/zips/cli-quickstart/cli-quickstart.zip)をダウンロードすることもできます。


## ステップ１．開発環境のセットアップ

作業に入る前に開発環境をセットアップする必要があります。

Node.jsとnpmをインストールしていない場合は、以下を参考にインストールを行ってください。

【windows】
[Node.js / npmをインストールする（for Windows） - Qiita](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjzutXfhb3VAhXHULwKHR_wBaQQFggnMAA&url=http%3A%2F%2Fqiita.com%2Ftaiponrock%2Fitems%2F9001ae194571feb63a5e&usg=AFQjCNG6gebTyc-2C0G2baxBH-HdMh-1XQ)

【Mac】
[Macにnode.jsをインストールする手順。 - Qiita](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjzutXfhb3VAhXHULwKHR_wBaQQFgguMAE&url=http%3A%2F%2Fqiita.com%2Fakakuro43%2Fitems%2F600e7e4695588ab2958d&usg=AFQjCNE1Enm9hUvO-us3Obch8VtGOT8ozg)

> すでにインストール済みの場合でも、ターミナル/コンソールウィンドウでnode -vとnpm -vを実行し、node 6.9.x 以上、npm 3.x.x 以上 であることを確認してください。 
> 上記よりも古いバージョンの場合はエラーが発生します。

そのあと、ターミナル/コンソールウィンドウで以下のコマンドを実行して、Angular CLI をグローバルにインストールしてください。

```bash
npm install -g @angular/cli
```

## ステップ２．新しいプロジェクトを作成

ターミナルウィンドウを開きます。

以下のコマンドを実行して、新しいプロジェクトとアプリケーションのひな形を生成します。

```bash
ng new my-app
```

>新しいプロジェクトのセットアップ処理で少し時間がかかりますので、しばらくお待ちください。
>npmパッケージのインストールに時間がかかります。


## ステップ３．アプリケーションを動かす

以下のコマンドを実行して、プロジェクトディレクトリに移動し、サーバーを起動してください。

```bash
cd my-app
ng serve --open
```

ng serveコマンドを実行すると、サーバーを起動し、ファイルの変更を監視します。
ファイルの変更を検知すると、自動的にアプリケーションが最新化されます。

--open（またはjust -o）オプションを使うと、ブラウザが自動的に立ち上がり、トップページ```(http://localhost:4200)``` が開かれます。


正常にアプリケーションが立ち上がれば、以下のメッセージの画面が表示されます。

![app-works.png](https://qiita-image-store.s3.amazonaws.com/0/62038/12321708-7e6e-842a-ded5-924719bcb664.png)

## ステップ４．Angularコンポーネントを変更する

Angular CLIで初期状態のAngularコンポーネントが作成されました。

これはルートコンポーネントとなり、app-rootという名前で定義されています。

./src/app/app.component.ts を開いて、titleプロパティを「Welcome to app!!」から「My First Angular App」に変更してみてください。

```ts:src/app/app.component.ts
export class AppComponent {
  title = 'My First Angular App';
}
```

ファイルの変更が検知され、ブラウザが自動的にリロードされます。
タイトルが変更されました。

素晴らしいです。もう少し見た目を良くして見ましょう。

./src/app/app.component.css を開いて、コンポーネントにスタイルを設定してください。

```css:src/app/app.component.css
h1 {
  color: #369;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 250%;
}
```

![my-first-app.png](https://qiita-image-store.s3.amazonaws.com/0/62038/bbf07a6e-cba2-c586-8db3-a32187096b98.png)

見た目も良くなりました。

## 次は何をする？

それは、あなたが「Hello World」のアプリでやってみたいことすべてです。

Angularで構築できる素晴らしいアプリケーションを作成する準備が整いましたので、[Tour of Heroesチュートリアル](https://angular.io/tutorial)に取り組んでいきましょう。

以降の章では、Angularプロジェクトのファイルについてもう少し詳しく知ることができます。
UWPアプリを初回ログイン時にインストールさせない方法

UWPアプリの中にはWindowsログイン時に自動インストールされるものがあり、これらをプロビジョニングされたUWPアプリと呼ぶ。
意図しないアプリがインストールされることもあるので、このページの手順によりこれを無効化する。

現在のユーザーにインストールされているアプリをアンインストールする手順は下記URLを参照。
https://qiita.com/SkyLaptor/items/d32706d64526eaf5a78e


## プロビジョニングされたアプリのパッケージ名を確認する
```ps1:PowerShell
Get-AppxProvisionedPackage -Online | Format-List -Property PackageName

【実行例】
Get-AppxProvisionedPackage -Online | Format-List -Property PackageName

PackageName : Microsoft.WindowsCalculator_2017.705.1927.0_neutral_~_8wekyb3d8bbwe

PackageName : Microsoft.WindowsStore_11706.1001.264.0_neutral_~_8wekyb3d8bbwe

...
```

## アプリをプロビジョニングから外す
```ps1:PowerShell
Remove-AppxProvisionedPackage -Online -PackageName <PACKAGE_NAME>

【例】
Remove-AppxProvisionedPackage -Online -PackageName Microsoft.WindowsStore_11706.1001.264.0_neutral_~_8wekyb3d8bbwe
```

## 番外編: すべてのアプリをプロビジョニングから外す
```ps1:PowerShell
Get-AppxProvisionedPackage -Online | Remove-AppxProvisionedPackage -Online
```
[UWP]RichEditBoxの選択された文字の色を変える

#問題
　今までWindows.Formsで開発していたアプリでは、RichTextBoxに入力された文字を、1文字単位で選択して、文字色を変えていました。が、この度Winタブへ移植することが決まり、同様のことがUWPでできないか調査しました。
　ちなみにUWPやWPFの経験ゼロです。

#結果
下記コードでできました。

```C#:MainPage.xaml
<Page
    x:Class="UWPTest.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:UWPTest"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Button x:Name="btnRed" Content="赤" HorizontalAlignment="Left" Height="40" Margin="460,68,0,0" VerticalAlignment="Top" Width="141" Click="btnRed_Click"/>
        <RichEditBox x:Name="richEditBox" HorizontalAlignment="Left" Height="150" Margin="75,68,0,0" VerticalAlignment="Top" Width="340"/>
        <Button x:Name="btnBlue" Content="青" HorizontalAlignment="Left" Height="40" Margin="460,122,0,0" VerticalAlignment="Top" Width="141" Click="btnBlue_Click"/>

    </Grid>
</Page>
```

```C#:MainPage.xaml.cs
using Windows.UI;
using Windows.UI.Text;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace UWPTest {
    /// <summary>
    /// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();

            richEditBox.Document.SetText(Windows.UI.Text.TextSetOptions.None, "richEditBox");

        }

        private void btnRed_Click(object sender, RoutedEventArgs e) {

            ITextSelection selectedText = richEditBox.Document.Selection;
            if (selectedText != null) {
                ITextCharacterFormat format = selectedText.CharacterFormat;
                format.ForegroundColor = Color.FromArgb(0, 255, 0, 0);
                selectedText.CharacterFormat = format;
            }
        }

        private void btnBlue_Click(object sender, RoutedEventArgs e) {
            ITextSelection selectedText = richEditBox.Document.Selection;
            if (selectedText != null) {
                ITextCharacterFormat format = selectedText.CharacterFormat;
                format.ForegroundColor = Color.FromArgb(0, 0, 0, 255);
                selectedText.CharacterFormat = format;
            }
        }
    }
}
```

btnRed_ClickメソッドとbtnBlue_Clickメソッドでほとんど同じことをしているのはご愛敬。
選択されたテキスト（テキストそのものから装飾に関するデータ全部）は、

```C#
ITextSelection selectedText = richEditBox.Document.Selection;
```

で取得できて、さらにITextCharacterFormatを取得すると、文字色等の変更ができます。

#参照
https://docs.microsoft.com/ja-jp/windows/uwp/controls-and-patterns/rich-edit-box
~~珍しくマイクロソフト~~
AIML Tutorialの.aiml.csvファイルの役割

AIML Tutorial⇨http://www.w3ii.com/ja/aiml/aiml_first_application.html
の.aiml.csvファイル↓の役割について何方かご存知でしたら教えて頂きたいです。
先頭の0の意味や、&lowast;(アスタリスク)の数の意味などを含めてお願いします。

「0,HELLO ALICE,&lowast;,&lowast;,Hello User,test.aiml」
Menuのテンプレ


Electronアプリをビルドしたら、コピペもリロードもできなくなってしまったので（メニューを設定しないとQuitしか使えなくなる仕様らしい）、メニューのテンプレートをまとめておく。

Code : https://github.com/mo49/electron_test

```javascript
const {app, Menu} = require('electron');

function createMenu() {
  const menuTemplate = [
    {
      submenu: [
        {
          label: 'Quit',
          accelerator: 'Cmd+Q',
          click() {
            app.quit();
          }
        }
      ]
    },
    {
      label: "Edit",
      submenu: [
        { label: "Undo", accelerator: "CmdOrCtrl+Z", selector: "undo:" },
        { label: "Redo", accelerator: "Shift+CmdOrCtrl+Z", selector: "redo:" },
        { type: "separator" },
        { label: "Cut", accelerator: "CmdOrCtrl+X", selector: "cut:" },
        { label: "Copy", accelerator: "CmdOrCtrl+C", selector: "copy:" },
        { label: "Paste", accelerator: "CmdOrCtrl+V", selector: "paste:" },
        { label: "Select All", accelerator: "CmdOrCtrl+A", selector: "selectAll:" },
      ]
    },
    {
      label: 'View',
      submenu: [
        {
          label: 'Reload',
          accelerator: 'CmdOrCtrl+R',
          click(item, focusedWindow){
            if(focusedWindow) focusedWindow.reload();
          },
        },
        {
          label: 'Toggle Developer Tools',
          accelerator: (process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I'),
          click(item, focusWindow) {
            if (focusWindow) {
              focusWindow.webContents.toggleDevTools();
            }
          }
        },
        { type: 'separator' },
        { role: 'resetzoom' },
        { role: 'zoomin' },
        { role: 'zoomout' },
      ]
    }
  ];
  const menu = Menu.buildFromTemplate(menuTemplate);
  Menu.setApplicationMenu(menu);
}
```
重みマッチング問題における解法の比較

# これなに
[最大重みマッチング問題](http://qiita.com/SaitoTsutomu/items/bbebc69ebc2549b0d5d2)の2つの解法の計算時間を比較した。

# 計算

```py3:python
import time, numpy as np, networkx as nx
from pulp import *
from ortoolpy import addbinvars
np.random.seed(1)
平均次数 = 3
for N in [10,100,200,500,1000,2000,5000]:
    # グラフ作成
    g = nx.fast_gnp_random_graph(N, 平均次数/(N-1))
    for r,(i,j) in zip(np.random.rand(g.number_of_edges()),g.edges_iter()):
        g.edge[i][j]['weight'] = r

    # 汎用ソルバ(cbc)で計算
    m = LpProblem(sense=LpMaximize)
    x = addbinvars(g.number_of_edges())
    for v,(i,j) in zip(x, g.edges()):
        g[i][j]['Var'] = v
    m += lpDot([g[i][j]['weight'] for i,j in g.edges()], x)
    for nd in g.nodes():
        m += lpSum(d['Var'] for d in g[nd].values()) <= 1
    t1s = time.clock()
    m.solve()
    n1 = len([i for i,v in enumerate(x) if value(v) > 0.5])
    t1e = time.clock()

    # エドモンズ法
    t2s = time.clock()
    n2 = len(nx.max_weight_matching(g))//2
    t2e = time.clock()
    assert n1==n2
    print(N,t1e-t1s,t2e-t2s)
>>>
10 0.02683257321768906 0.004652122559491545
100 0.038709433923941106 0.041949099861085415
200 0.046430152317043394 0.1253287561412435
500 0.08796162778162397 1.2250798634777311
1000 0.15964821091620252 4.0942329679674
2000 0.3348240090563195 20.510134776166524
5000 0.9361551560868975 159.31649612302135
```

# 可視化

```py3:jupyter
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'IPAexGothic'
plt.xlabel('ノード数')
plt.ylabel('計算時間(秒)')
plt.plot([10,100,200,500,1000,2000,5000],[0.0268,0.0387,0.0464,0.0879,0.1596,0.3348,0.9361], label='汎用ソルバ')
plt.plot([10,100,200,500,1000],[0.0046,0.0419,0.1253,1.2250,4.0942], label='エドモンズ法')
plt.legend();
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13955/b2473a33-f059-196a-736d-9e0d8a426c8c.png)

# 考察

- 一般的に専用ソルバの方が汎用ソルバより性能がよいと期待される。([ノーフリーランチ定理 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%BC%E3%83%95%E3%83%AA%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%81%E5%AE%9A%E7%90%86))
- 両者ともに厳密解を求めている。
- 汎用ソルバのデフォルトは無料のcbcである。
- 汎用ソルバは、分枝限定法をベースにした、多項式オーダを保証していない方法であるが、計算時間が線形オーダに近く、5000ノードでも1秒かからない。
- 専用アルゴリズムであるエドモンズ法は、効率のよい方法と言われているが、計算時間が線形オーダになっていないので、5000ノードでは汎用ソルバの 170 倍になっている。

以上
VGG16の学習済みデータのダウンロードを途中で止めた後のエラー対応

> KerasでVGG16を使う
> http://aidiary.hatenablog.com/entry/20170104/1483535144

こちらの内容に沿って、スクリプトを実行して学習済みデータを**ダウンロードしている途中で止めた**あと、再度実行しようとした場合、次のようなエラーが出る

```commandline
OSError: Unable to open file (Truncated file: eof = 174129152, sblock->base_addr = 0, stored_eoa = 553467096)
```

![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/76058/8fe1c206-eb03-4913-a670-83926dbc6bdd.png)

> https://stackoverflow.com/questions/40839114/i-tried-to-fine-tune-vgg16-on-my-dataset-but-met-the-oserror-about-loading-vgg1

環境によって違いますが、下記ディレクトリに`vgg16_weights_tf_dim_ordering_tf_kernels.h5`というファイルが１個だけあると思いますので、これを削除して再度実行すると再読込できます。

```
C:\Users\(ユーザ名)\.keras\models
```
Shinyで同じ階層構造のUIを連続して生成する

※20180205 データフレームの取り扱いを変更
以下のようなイメージで同じ要素グループを連続して並べる時のコードです。それぞれのカタマリで個別のnumericInputを参照し、それぞれヒストグラムを描画しているデモです。
<img width="300" alt="スクリーンショット 2017-08-04 14.28.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/103775/9f831f35-55e7-fdeb-aa3c-4d096a90965c.png">


```app.R
library(shiny)
# UI description
rep <- 5
ui <- fluidPage(
  lapply(1:rep, function(i) {
    div(
      numericInput(paste0('n', i), paste0('num=', i), i ^ 2 * 100),
      plotOutput(paste0('p', i))
    )
  })
)
# Server logic
server <- function(input, output, session) {
  dflist <- list()
  lapply(1:rep, function(i) {
    output[[paste0('p', i)]] <- renderPlot({
      dflist[[i]] <- rnorm(input[[paste0('n', i)]])
      hist(dflist[[i]])
    })
  })
}
shinyApp(ui, server)

```

###ポイント
####for/whileは使用しないほうが良い
描画とreactivityの演算はループで指定した順番とは別で行われるため（データがステートレスにならなくてはいけない）、逐次を想定した記述をしてもうまくいきません。ステートレスということはlapplyでやりきれる、ということですので頑張ってlapplyで記述しましょう。生成数を動的に変更するためにinsertUIを使用した例は[こちら](https://qiita.com/komde/items/855721a8a87a220fb0b8)で記述しています。

####繰り返しに複数要素を入れ込むときはdivる
複数繰り返しはdiv()でくくりましょう。仮想的にクラス化されるshinydashboard::box みたいな関数でも同じことが実現できます。
>    div(
>      numericInput(paste0('n', i), paste0('num=', i), i ^ 2 * 100),
>     plotOutput(paste0('p', i))
>    )

####異なるデータセットを使用する場合は親リスト以下にデータフレームを格納する
> dflist <- list()
まずデータフレームを格納するリストを作成し
> dflist[[i]] <- rnorm(input[[paste0('n', i)]])
その後それぞれのデータフレームをその下に格納していきます。ちなみにreactive contextに触れないようにisolateでくくるか、例のようにcontext外になるようplotの中に入れてしまうかする必要があります。
ヌーラボBacklogの共有ファイルをcurlでダウンロードする

## 基本

`https://<spaceKey>.backlog.jp/`というURLを頭に付けて、各APIのURLを叩きます。

例えば、[スペース情報を取得する](https://developer.nulab-inc.com/ja/docs/backlog/api/2/get-space/)ならURLはこんな感じ。

```bash
https://<spacekey>.backlog.jp/api/v2/space?apiKey=***
```

上記にあるようにAPIを叩くにはkeyが必要です。これは、`個人設定➡️API`から発行しておきます。

`***`をkeyに書き換えてこんな感じにするとデータを取得できると思います。

```bash
curl 'https://<スペースID>.backlog.jp/api/v2/space?apiKey=***'
```

```json:response.json
{
  "spaceKey": "spaceKey",
  "name": "...",
  "ownerId": ...,
  "lang": "ja",
  "timezone": "Asia/Tokyo",
  "reportSendTime": "06:00:00",
  "textFormattingRule": "markdown",
  "created": "2000-01-01T00:00:00Z",
  "updated": "2000-01-01T00:00:00Z"
}
```

## ファイルIDを取得

[共有ファイルのダウンロード](https://developer.nulab-inc.com/ja/docs/backlog/api/2/get-file/)に載ってるようにファイルを取得するには、`sharedFileId`というのが必要です。

```
/api/v2/projects/:projectIdOrKey/files/:sharedFileId 
```

それは[共有ファイル一覧の取得](https://developer.nulab-inc.com/ja/docs/backlog/api/2/get-list-of-shared-files/)で調べることができます。

```
/api/v2/projects/:projectIdOrKey/files/metadata/:path 
```

例えば`ci/`というディレクトリの中身を取得したい場合は、こんな感じで叩きます。

（ちなみに`<projectkey>`というのは、プロジェクトのホームを開いたときのURLの一番最後の文字列やつを指定すれば大丈夫です。`https://<spacekey>.backlog.jp/projects/hoge`だったら`hoge`）

```
curl 'https://<spacekey>.backlog.jp/api/v2/projects/<projectkey>/files/metadata/ci?apiKey=***'
```

だいたいこんな感じで配列で返ってきます。例えば`a.txt`をダウンロードしたい場合、`sharedFileId`は`999999...`になります。

```json:response.json
[
  {
    "id": 999999...,
    "type": "file",
    "dir": "/ci/",
    "name": "a.txt",
    "size": 10000,
    "createdUser": {...},
    "created": "2000-01-01T00:00:00Z",
    "updatedUser": null,
    "updated": "2000-01-01T00:00:00Z"
  }
]
```

## ファイルダウンロード

では取得したIDを埋め込んで叩くだけです。ファイルへ保存する`-O`フラグを忘れないように！

```
curl -o a.txt -O 'https://<spacekey>.backlog.jp/api/v2/projects/<projectkey>/files/999999...?apiKey=***'    
```

あと、`-o`フラグを付けて保存しないと`999999...?apiKey=***`みたいなファイル名になっちゃうので、付けると良いと思います。
install.esdからinstall.wimを取り出す方法

# 概要
カタログファイルを作成しようとしてinstall.wimをDVDの中から探すとinstall.esdしかない時がある。
install.esdとは複数のwimを高度に圧縮した形式らしいので、やろうと思えば必要なinstall.wimを取り出すことができる。

# ESDに含まれているイメージを確認する
install.esdが入ったWindowsインストールメディアをセットして、install.esdの中に何のイメージが含まれているのか確認する。

```ps1:PowerShell
Dism /Get-WimInfo /WimFile:{ESDファイルパス}
```
実行例:

```ps1:PowerShell
Dism /Get-WimInfo /WimFile:D:\sources\install.esd

展開イメージのサービスと管理ツール
バージョン: 10.0.14393.0

イメージの詳細: install.esd

インデックス: 1
名前: Windows 10 Pro
説明: Windows 10 Pro
サイズ: 14,750,981,556 バイト

インデックス: 2
名前: Windows 10 Home
説明: Windows 10 Home
サイズ: 14,610,278,470 バイト

インデックス: 3
名前: Windows 10 Education
説明: Windows 10 Education
サイズ: 14,245,569,223 バイト

操作は正常に完了しました。
```

# ESDからイメージを取り出す
どのイメージを取り出すか決めたら、対象のイメージを指定して取り出す。

```ps1:PowerShell
Dism /Export-Image /SourceImageFile:{ESDファイルパス} /SourceIndex:{インデックス番号} /DestinationImageFile:{WIMファイルパス} /Compress:max /CheckIntegrity
```

Windows10 Proのinstall.wimを取り出す例:

```ps1:PowerShell
Dism /Export-Image /SourceImageFile:D:\sources\install.esd /SourceIndex:1 /DestinationImageFile:C:\install.wim /Compress:max /CheckIntegrity
```

この方法で取り出したinstall.wimと正規(VL版)のinstall.wimは厳密にいうと別物らしいので利用は自己責任で。
ちなみにESDが入っているメディアは[イメージ作成ツール](https://www.microsoft.com/ja-jp/software-download/windows10)で作成したisoがほとんどだと思う。VLSCからダウンロードしたメディアには普通にinstall.wimが存在する。
Visual Studio Code で バッチファイル実行時に文字化け

# Visual Studio Code で 出力が文字化けする

Ctrl+Alt+Nでバッチファイルを実行

```out
C:\Windows>�E�rem
'�E�rem' �́A���R�}���h�܂��͊O���R�}���h�A
����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B

C:\Windows>cls
こんにちは

        1 �̃t�@�C����R�s�[���܂����B
```

↓
chcp コマンドをコード中に混ぜて対策してみた。

```batch
rem
cls
@echo off
chcp 65001
echo こんにちは
copy a.txt b.txt
```

↓
結果、１行目の文字化けは対処できず。

```batch
C:\Windows>�E�rem
'�E�rem' �́A���R�}���h�܂��͊O���R�}���h�A
����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF������Ă��܂���B

C:\Windows>cls

Active code page: 65001
こんにちは
        1 file(s) copied.
```

~~対処方法を求む~~VSCODEのアップデートで解消

**Excelsior!**
評価版Windowsを製品版Windowsにエディション変更する方法

![WindowsServer2019](https://img.shields.io/badge/WindowsServer-2019-brightgreen)

# 概要
開発や検証を評価版OSで行ったあとに、せっかく設定したのでそのまま製品版に移行したいなぁと思った時の手順。

# 変更可能なエディションを確認する
まずは使用中の評価版がどの製品版に移行できるか確認する。

```ps1:PowerShell
Dism /Online /Get-TargetEditions
```
評価版WindowsServer2016での実行例:

```ps1:PowerShell
Dism /Online /Get-TargetEditions

展開イメージのサービスと管理ツール
バージョン: 10.0.14393.0

イメージのバージョン: 10.0.14393.0

アップグレード可能なエディション:

ターゲット エディション : ServerStandard
ターゲット エディション : ServerDatacenter

操作は正常に完了しました。
```

# エディションを変更する
ターゲットエディションを有効にできるプロダクトキーを用意してエディションの変更を実行する。

```ps1:PowerShell
Dism /Online /Set-Edition:{ターゲットエディション} /ProductKey:{プロダクトキー} /AcceptEula
```
実行例:

```ps1:PowerShell
Dism /Online /Set-Edition:ServerStandard /ProductKey:XXXX-XXXX-XXXX-XXXX-XXXX /AcceptEula
```

コマンドを実行すると再起動を求められるので素直に再起動する。
再起動後に確認して指定したエディションに変更されていればOK。

応用すればProfessional to Enterpriseといった製品間のエディション変更も可能かも。


## 追記
### エディション変更が出来ない場合の対応
WindowsServer 2019 Standard 評価版環境で以下のエラーとなりServerStandardに変更が出来ない事象が発生しました。

評価版からエディション変えたい。アップグレード可能なエディションを確認してみよう。

```:PowerShell
# Dism /Online /Get-TargetEditions

展開イメージのサービスと管理ツール
バージョン: 10.0.17763.771

イメージのバージョン: 10.0.17763.1131

アップグレード可能なエディション:

ターゲット エディション : ServerStandard
ターゲット エディション : ServerDatacenter

操作は正常に完了しました。
```

よし、Standardに変更できそうだね、正規のプロダクトキーを用意して投入！

```
# Dism /Online /Set-Edition:ServerStandard /ProductKey:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX /AcceptEula

展開イメージのサービスと管理ツール
バージョン: 10.0.17763.771

イメージのバージョン: 10.0.17763.1131


エラー: 1168

指定したプロダクト キーを検証できませんでした。
指定したプロダクト キーが有効であることと、ターゲット エディションに一致していることを確認してください。

DISM ログ ファイルは C:\Windows\Logs\DISM\dism.log にあります
```

...なんで？

調べたところ、一度 汎用ボリューム ライセンス キー (GVLK)なるものでエディション変更を行わないといけない模様です。プロセスが変更されたのでしょうか。
https://learn.microsoft.com/ja-jp/windows-server/get-started/kms-client-activation-keys

WindowsServer 2019 Standard のGVLKは `N69G4-B89J2-4G8F4-WWYCC-J464C` と記載がありました。

```
# Dism /Online /Set-Edition:ServerStandard /ProductKey:N69G4-B89J2-4G8F4-WWYCC-J464C /AcceptEula

展開イメージのサービスと管理ツール
バージョン: 10.0.17763.771

イメージのバージョン: 10.0.17763.1131

コンポーネントの更新を開始しています...
プロダクト キーのインストールを開始しています...
プロダクト キーのインストールが完了しました。

パッケージ Microsoft-Windows-ServerStandardEvalEdition~31bf3856ad364e35~amd64~~10.0.17763.1 を削除しています
[==========================100.0%==========================]
コンポーネントの更新が完了しました。

エディション固有の設定の適用を開始しています...
エディション固有の設定の適用が完了しました。

操作は正常に完了しました。
Windows を再起動してこの操作を完了してください。
今すぐコンピューターを再起動しますか? (Y/N) Y
```

再起動後、エディションは無事に指定したものに変更されていました。次に、本来のプロダクトキーに入れ替えて認証します。
![エディション変更後のシステム画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97774/7081944a-27dc-a357-e1ce-ee3a80dc8308.jpeg)

```:PowerShell
# slmgr /ipk XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
# slmgr /ato
```

![ライセンス認証完了](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97774/c436c3e5-9a27-babf-b1d2-29125e8487d6.jpeg)

よかった...
Kibana plugin Sense を Standalone で動かす方法

# Download Kibana

```bash
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.5.1-darwin-x86_64.tar.gz
shasum kibana-5.5.1-darwin-x86_64.tar.gz 
tar -xzf kibana-5.5.1-darwin-x86_64.tar.gz
cd kibana/ 
```
参考： https://www.elastic.co/guide/en/kibana/current/targz.html#install-darwin64
# Install Sense

```bash
./bin/kibana plugin --install elastic/sense
```
# Kibanaの設定で不要なものをオフにする
下記の設定を追加することで、Sense以外の機能はオフにしてしまいます

```bash
sense.proxyFilter:
  - ^https?://(localhost|127\.0\.0\.1|\[::0\]).*

kibana.enabled: false
elasticsearch.enabled: false
```
# Kibana起動
```bash
$ ./bin/kibana -q
  log   [13:28:16.926] [info][listening] Server running at http://0.0.0.0:5601
```

# Senseへアクセス
Kibanaの機能もオフなので、直接Senseへアクセス

```bash
$ open http://0.0.0.0:5601/app/sense
```
Property 'controls' does not exist on type 'AbstractControl' への対処


```typescript
Property 'controls' does not exist on type 'AbstractControl'
```

## どんな時にこのエラーに出会うか

- angular4.xを使用している(angular2.xだとどうなるかは知らない)
- formGroupの中でformArrayを作っているとき
- htmlファイルで、このformArrayを構成するcontrol要素にアクセスするために下記のようにコーディングした時

```
<form [formGroup]="sampleForm">
  <div formArrayName="sampleFormArr">
    <div *ngFor="let elem of this.sampleForm.get('sampleFormArr').controls; let i = index" [formGroupName]="i">
      <input formControlName="sampleElementOfArr">
    </div>
  </div>
</form>

```

- コンパイル`ng serve`だとこのエラーは出ない。
- ビルド`ng build`でこのエラーが出る。つまり開発中にはあまりこのエラーに気づかず、デプロイ時に初めて気づいてハマるリスクがある。


## 何が問題なのか？

- この部分`this.sampleForm.get('sampleFormArr').controls`
- ここが古い書き方になっている


## どのように解決するか

- tsファイルにcontrolsプロパティを取得するメソッドを用意
- htmlファイルで`get().controls`と書く代わりに、このメソッドをコールする。

- 具体的にいうと、sample.component.tsに次のような任意の名前のメソッドを用意して、、、

```typescript
  getSampleArrayControls() {
    return (<FormArray>this.sampleForm.get('sampleFormArr')).controls;
  }
```

- html内でこれを呼んでformArrayのcontrolsプロパティを取得する

```
<div *ngFor="let elem of getSampleArrayControls(); let i = index" [formGroupName]="i">
  <input formControlName="sampleElementOfArr">
</div>

```

- このバグ解消のために、半日近く工数を消費してしまった(T T)のでメモ。
CUEW で CUDA SDK いらずの開発環境を整える(CUDA Toolkit 12.1 対応. cuDNN 8.0 対応もしたよ) 

漢なら OpenCL ですね!

しかしときには比較用に CUDA も使いたくなったり, CUDA コードを OpenCL に移植してみたいときがありますね!

でもちょっと試してみたいときとか CUDA SDK のインストールするの面倒ですね!
(とはいえ, nvcc を呼び出したり NVRTC を使いたいときは結局は CUDA Toolkit が必要でした. 特に Windows 環境)

OpenCL の場合は clew https://github.com/OpenCLWrangler/clew がありますが, CUDA にも CUEW で CUDA SDK いらずで CUDA program をコンパイルできるライブラリがあります.

https://github.com/CudaWrangler/cuew

本家はいくらか古いのと, cuDNN も PR 上がってますがマージされていないので,
CUDA 12.1, cuDNN 8.0 に対応したのをアップロードしました.

https://github.com/syoyo/cuew

`master` をお使いください.

### CUDA runtime API

途中までですが, CUDA runtime API も対応中です...

https://github.com/syoyo/cuew/tree/cudart


## まとめ

CCLCudaAPI と合わせて OpenCL, CUDA どちらも同じような関数で使えるようにしてみたいですね!

https://github.com/CNugteren/CLCudaAPI
いまさら CentOS7.3 に AIDE(ファイル改ざん検知ツール)を入れてみる

# AIDE(Advanced Intrusion Detection Environment) って
仕事が忙しくないので趣味を兼ねた、いまさらシリーズｗ。
オープンソースの [AIDE](http://aide.sourceforge.net/)（Advanced Intrusion Detection Environment）は、いわゆるホスト型（サーバにインストールする系）の監視ツールで、主に「ファイルとディレクトリが改ざんされたか」どうかを判定（整合性チェック）する監視ツールです。

監視するといっても常駐型でなくバッチ型なので、リアルタイムにファイルが改ざんされたことを検知することができないのでcronで定期的に実施し結果をメールで受け取るなどして（今時だとSlackに通知かな）サーバの状態を把握するということになりますね。

# インストール
めっちゃ簡単ですｗ。

```text
$ sudo yum install aide
```

## 検知対象ディレクトリと非検知ディレクトリの指定
```/etc/aide.conf``` に検知ルールが記述されているので、とりあえず下記のディレクトリは検知して欲しくないので追加します。※ ```!``` でディレクトを指定すると非対象にになります。

```text:/etc/aide.conf
!/tmp
!/proc
```

## AIDEデータベースファイルの作成
まず初期化、これ大切あるね。

```text:bash
$ sudo aide --init
AIDE, version 0.15.1
### AIDE database at /var/lib/aide/aide.db.new.gz initialized.
```

## AIDEデータベースファイルのコピー
AIDEの仕組み上、```前回のファイル整合性チェック結果``` と ```今回のファイル整合性チェック結果``` を比較するため上記で初期化実施した結果ファイルをコピーしておきます。

こんな定義になっているので。

```text:/etc/aide.conf
@@define DBDIR /var/lib/aide
database=file:@@{DBDIR}/aide.db.gz
database_out=file:@@{DBDIR}/aide.db.new.gz
```

コピーしないと怒られるですよｗｗ

```text:bash
$ sudo aide -C
Couldn't open file /var/lib/aide/aide.db.gz for reading
```

そんな訳で初期化で作成されたAIDEデータベースファイルをコピーします。

```text:bash
$ sudo mv -f /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
```

## とりあえずチェックしてみる
コマンドを実行してみる。結果は、```/var/log/aide/aide.log``` ファイルに出力されるので実行が終わったらみてみるとよい。

```text:bash
$ sudo aide -C
```

## AIDEを実行しかつAIDEデータベースファイルも更新するとかシェル
まあ普通作りますよねシェル。そしてcronで定期的に実行しますよね。
私の使用しているメールサーバのルールでは、英字だけのsubjectだと弾かれてしまうので漢字にしています。

```bash:aide.sh
#!/bin/bash

OK_MAIL="AIDEファイル改ざんチェックOK"
NG_MAIL="AIDEファイル改ざんチェックNG問題あり"

MAILTO=vagrant
LOGFILE=/var/log/aide/aide.log
AIDEDIR=/var/lib/aide
/usr/sbin/aide -u > $LOGFILE
/usr/bin/cp $AIDEDIR/aide.db.new.gz $AIDEDIR/aide.db.gz
x=$(/usr/bin/grep "Looks okay" $LOGFILE | /usr/bin/wc -l)

if [ $x -eq 1 ]
then
  echo "OK" | /usr/bin/iconv -f utf-8 -t iso-2022-jp | /bin/mail -s `echo $OK_MAIL | /usr/bin/nkf -j | /usr/bin/nkf -M` $MAILTO
else
  /usr/bin/cat $LOGFILE | /usr/bin/nkf -j | /bin/mail -s `echo $NG_MAIL | /usr/bin/nkf -j | /usr/bin/nkf -M` $MAILTO
fi
```

# 使った感想
こんな施策しても凄腕のハッカーにしたら「へっ」ってなもんですが、まあやらないよりはマシって感じですかね。あと改ざんではないけど不用意にファイルを変更しまった場合、このAIDEで監視できるのでそういう点ではいいかもしれない。

# 参考にさせて頂いたサイト様

> [CentOS にファイル改ざん検知システムを導入する【AIDE】](http://hacknote.jp/archives/18027/)
> [オープンソースの IDS である AIDE を CentOS にインストールする](https://www.websec-room.com/2013/11/09/999)
> [ファイル改ざん検知システム（AIDE）を構築してみる](http://techblog.clara.jp/2015/04/aide_install_and_setting/)
Share Host's Directory among Containers


This is just a very short post. I just wondered if it is possible to share host's directory among containers and run a jar in the shared directory and save its output to the same directory. So I tested it.

## Prepare Jar File to Run

Move a jar file for the test. The jar sends HTTP Get request to Isilon Storage and returns its output as a new file in the same directory.

```
[root@sunny ~]# mv test_20170804.jar container_volume/
[root@sunny ~]# ls container_volume/
test_20170804.jar
```

## Run 3 Containers and Exectute Jar Respectively

```
[root@sunny ~]# docker run -it --name jar_test_1 -d -v /root/container_volume:/home openjd
k  java -jar /home/test_20170804.jar
09f49384e9af436c560899239a58a30b0ad856680bccab6c9df3ba5db33c2f77
[root@sunny ~]# docker run -it --name jar_test_2 -d -v /root/container_volume:/home openjd
k  java -jar /home/test_20170804.jar
92782e7ec1434623b9f61548e648351b3e16f07aacc79b15d10e41348878d96b
[root@sunny ~]# docker run -it --name jar_test_3 -d -v /root/container_volume:/home openjd
k  java -jar /home/test_20170804.jar
cea729fab4f9f6748a1965f66ec15f3f954fbfe2883c0d1b68c69325c88d3074
```

## Confirm Outputs from Containers Are Saved Properly

```
[root@sunny ~]# ls ./container_volume/
jar_20170804_030734.txt  
jar_20170804_030743.txt  
jar_20170804_030754.txt
test_20170804.jar
```

That's it! It worked as expected.
jacl と jsr223

---
### jacl と java

[jsr223というか、javax.script名前空間](http://docs.oracle.com/javase/jp/7/api/javax/script/package-summary.html) に対応している tcl として [jacl](http://tcljava.sourceforge.net/docs/website/index.html)がある

ここでは tcl の文法とかよりは、java との連携(Javaオブジェクトの取り扱い)について記述する

tcljava の jar と jacl-engine.jar という javatcl(jacl) を jsr223 経由で呼び出すエンジンをクラスパスに追加すれば、 JSR223 経由で jacl を呼び出すことができる

---
### tcl と java オブジェクト

---
#### コメントアウト文

「#」 つまり行先頭にシャープ


---
#### import

とりあえず、以下のものは最初の行で宣言しておくといいだろう

> package require java

---
#### 動作確認

> echo "HelloWorld"

でコンソールに出力されるかどうか

---
#### コマンド

入れ子にする場合は、「[」と「]」で挟む必要がある

---
#### JSR223 オブジェクト

JSR223 用のインターフェイスの readme にあるが、Binding したオブジェクトについては var が用意されている。

例えば、obj として binding しているのであれば、

> var "obj"

という感じ。

---
#### Java のフィールド名

obj というインスタンスの str というフィールドにアクセスする場合は

> java::field [var "obj"] str

こんな感じ

---
#### Java のフィールドを更新する

> java::field [var "obj"] str "更新する値"

という感じ

---
#### Java のメソッド

例えば、 obj というインスタンスで str というメソッドを args という引数で呼び出す場合

> [var "obj"] str args

という感じ
GPSを使わずにユーザーの位置情報を取得する方法

# Why?
モバイルアプリやゲームを作っていると、カジュアルにユーザーのおおまかな位置情報が欲しいと思うことは無いでしょうか？
しかし、AndroidやiOSでいちいちGPS使用権限の許可を得るのも大げさ。
そんなときにCloud Functions for Firebaseを使えば、カンタンに、しかも破格の料金[^1]でユーザーの大まかな位置情報を取得することができます。

[^1]: 無料プランの場合は12.5万回/月まで。従量制プランの場合200万回/月の呼び出しまで無料。以降は $0.40/100万回 とのことです。


![1-P96fpzo_Tr0PgJwZjEjHxw.png](https://qiita-image-store.s3.amazonaws.com/0/29815/d503df4a-d437-04fe-9dc6-f87f6ea533b4.png)



# How?
Cloud Functionsでは、リクエストヘッダ `x-appengine-citylatlong` 内にアクセスユーザーのおおまかな位置情報を表す緯度経度情報が入っています。ですので、このヘッダ情報を出力するfunctionを定義するだけで、いとも簡単に目的を達成できます。
なお精度に関して手元で検証したところ、現在位置の市区町村の役所の位置が出力されるようです。
例えば港区内でアクセスすると、[35.658068,139.751599](https://www.google.co.jp/maps/place/35%C2%B039'29.0%22N+139%C2%B045'05.8%22E/@35.658068,139.750858,18z/data=!3m1!4b1!4m5!3m4!1s0x0:0x0!8m2!3d35.658068!4d139.751599)が返ってきます。

![map.png](https://qiita-image-store.s3.amazonaws.com/0/29815/e8ee896f-aff4-a5e2-9a9e-5dbef42c1764.png)
IPアドレスから位置情報が算出されるため、大きく異なるケースがあるのはご了承ください。

### 準備

Firebaseにログインしプロジェクトを作成した後、ターミナルで以下を実行します。

```bash
# firebase-toolsをインストール
$ npm install -g firebase-tools

$ cd myproject

# Firebaseにログイン
$ firebase login

# Cloud Functions の初期化
$ firebase init functions
```

これでCloud Functionsを書き始める準備ができました。

### コードを書く

myproject/functions/index.js をエディタで開き、以下のコードを追加します。

```js
exports.getLocation = functions.https.onRequest((req, res) => {
	var latlng = req.get("x-appengine-citylatlong");
	res.send(latlng);
});
```

### デプロイ

```bash
$ firebase deploy --only functions
```

上記のコマンドでfunctionがデプロイされ、functionを実行するためのURLが表示されます。以下が結果のサンプルです。もし`Function URL`が表示されない場合には、少し待ってからもう一度上記コマンドを実行してみましょう。

```bash
=== Deploying to 'sandbox-c9720'...
...
✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/sandbox-c9720/overview
Function URL (getLocation): https://us-central1-sandbox-c9720.cloudfunctions.net/getLocation

```

こちらが実際にデプロイしたスクリプトです。
https://us-central1-sandbox-c9720.cloudfunctions.net/getLocation
アクセスすると位置情報が出力されるので、GoogleMapsなどで表示して確認してみましょう。

これで、このURLをアプリから叩いて利用することができるようになりました。

# まとめ

いかがでしたか？
もともと `x-appengine-citylatlong` はGoogle App Engineで扱える情報でしたが、Cloud Functionsを使うことで、さらに手軽に実装することができました。
こういう小さな機能を実装するときは、Cloud Functionsがとても便利ですね。
xargsコマンドの使いみち

■やりたいこと
　lsでgrepして抽出したファイル等をとあるディレクトリにmvする


```
$ ls |grep kawakamasu |xargs mv -t testdir
```
lsコマンドでgrepして引っかかったファイルを「testdir」にmvする。
"-t"オプションはターゲットディレクトリ。
HtmlWebpackPluginの`template:`には`*.js`ファイルを指定してもいい

## こんな人へ

- [Pug](https://pugjs.org/)とか[Handlebars](http://handlebarsjs.com/)とか使い慣れてないし、普通にNodeJSで書きたい
- HtmlWebpackPluginに関する処理を`webpack.config.js`に入れたくない

> [https://github.com/nju33-qiita/example-templatejs-of-html-webpack-template](https://github.com/nju33-qiita/example-templatejs-of-html-webpack-template)

## [HtmlWebpackPlugin](https://github.com/jantimon/html-webpack-plugin)

そのWebpackで作られるファイルを、`<body/>`の最後で読み込むHTMLを作るプラグイン。

```js
{
  plugins: [new HtmlWebpackPlugin()]
}
```

これで、特に何もしなくてもバンドルファイルを埋め込んだ`.html`が作れる。
`webpack.output.filename`を`'bundle.js?[hash]'`な感じにしてるとCacheBustingな感じで埋め込んでくれていいです。

## Templateを設定
[pug-loader](https://github.com/pugjs/pug-loader)をインストールすれば、`./template.pug`ファイルをテンプレートに設定できる。（最後にバンドルファイルが挿入されるのは一緒）

```js
{
  plugins: [
    new HtmlWebpackPlugin({template: './template.pug'})
  ]
}
```

ただオプション多いし引数で何渡ってるのか全然分からない😇
あとググるのに疲れてる。

（なのであんまり詳しくないので、オプションでいいじゃんという話かも）

## Templateに`.js`を指定

[Templateのオプション](https://github.com/jantimon/html-webpack-plugin/blob/master/docs/template-option.md)だと分かんなかったんですが`.js`が指定できます。

```js
{
  plugins: [
    new HtmlWebpackPlugin({template: './template.js'})
  ]
}
```

`template.js`はこんな感じにHTMLの文字列を返すようにします。

```js
// (params: {[string]: any}) => stirng | Promise<string>
module.exports = () => '<html>...</html>';
```

ちなみにTypescriptなルールがあるなら`./template.ts`も渡せます。

### HTMLは別ファイルに

別に`.js`に書いちゃっていいんですが、分けたいと思ったのでhtmlは同じディレクトリの`template.html`というファイルに記述したいとします。

```js
const fs = require('fs');
const path = require('path');
const {promisify} = require('util');

module.exports = async params => {
  // __dirname === '/'
  // process.cwd() === '/'

  // webpack.context
  const {context} = params.compilation.options; 

  const htmlFilename = path.resolve(context, 'path/to/template.html');
  const html = await promisify(fs.readFile)(htmlFilename, 'utf-8');
  return html;
}
```

同じディレクトリなので`./template.html`でいいような感じがしますが、それは`/template.html`を見てしまうのでエラーになります。かといって絶対パスを指定すると、他の人も関係するプロジェクトの場合問題になるので、`webpack.context`の基準パスを使います。
`webpack.context`は、そのWebpackの基準パスが入ってます。

### Templateに値を入れて展開

このTemplateでしか使ってないとかなら、ここでPugとか使えばいいんです。
例えば`.css`をCacheBustingな感じにして埋め込むみたいなのとか。何でもいいんですが、ちっさいのでいいので[pupa](https://github.com/sindresorhus/pupa)を使ってやってみます。

HTMLにこんな感じで追記して、

```html
<link rel="stylesheet" href="{href}">
```

`glob`で探して、Hash取って、`pupa`で展開したHTMLを返します。

```js
// ...
const crypto = requrie('crypto');
const glob = require('glob');

module.exports = async params => {
  // ...

  const [filename] = await promisify(glob)(path.resolve(context, 'base/foo.css'));
  const css = await promisify(fs.readFile)(filename, 'utf-8');
  const basename = path.basename(filename);
  const md5hash = crypto.createHash('md5')
  const md5hash.update(css);
  return pupa(html, {
    href: '/' + basename + '?' + md5hash.digest('hex').slice(0, 20)
  });
};
```

これでこんな感じ。

```html
<link rel="stylesheet" href="/foo.css?11985b07e3121564a73d">
```

これで埋め込めました。
バンドルファイルに含ませたくないんだ的なファイルに使うといいと思います。（本番のdllとかcssとか）

### 注意

[babel-loader](https://github.com/babel/babel-loader)とかを`.js`が経由する感じだと、`template:`で読み込む時にシンタックスで怒られたりするので注意です。（`Runtime`とかあのへん）
scheme と jsr223

---
### scheme と java

[jsr223というか、javax.script名前空間](http://docs.oracle.com/javase/jp/7/api/javax/script/package-summary.html) に対応している scheme として [sisc](http://sisc-scheme.org/)がある

ここでは scheme の文法とかよりは、java との連携(Javaオブジェクトの取り扱い)について記述する

[siscのマニュアルはここ](http://sisc-scheme.org/documentation.php)

sisc の jar と scheme-engine.jar という scheme(sisc)を jsr223 経由で呼び出すエンジンをクラスパスに追加すれば、 JSR223 経由で scheme を呼び出すことができる

---
### scheme と java オブジェクト

---
#### コメントアウト文

「;」 つまり行先頭にセミコロン


---
#### import

とりあえず、以下のものは最初の行で宣言しておくといいだろう

> (import type-system)
> (import oo)
> (import s2j)

---
#### 動作確認

> (display "HelloWorld")

でコンソールに出力されるかどうか

---
#### オブジェクト指向

基本的にオブジェクト指向言語のオブジェクト操作は言語仕様にはないようだが、大抵の実装には別途用意されているらしい。
siscについても、JavaVM上で実装されている都合上、用意されている

> (フィールド インスタンス名)

という感じ

インスタンスとして obj。フィールドとして str だと

> (str obj)

という感じ。

メソッドで引数が args とかだと、

> (str obj args)

という感じ。

---
#### JSR223 オブジェクト

JSR223 用のインターフェイスの readme にあるが、Binding したオブジェクトについては var が用意されている。

例えば、obj として binding しているのであれば、

> (var 'obj)

という感じ。

しかし、Java のインスタンスは大抵は大文字/小文字を区別するよね。

という事で、
例えば、Obj として binding しているのであれば、

> (var '|Obj|)

という感じ。

なので、そのフィールド str にアクセスするには、

> (str (var '|Obj|))

という事になる。

---
#### Java のフィールド名

さて、Java のフィールドも大文字/小文字区別するじゃん、フツー。

という事で、先ほどの str が Str とかだった場合どうするのか。

という事で、Java のフィールド名を解決するメソッド(というか演算子というかコマンド)が用意されている。

> (generic-java-field-accessor '|Str|)

という感じ。

という事で、Binding された Obj というオブジェクトの Str というフィールドにアクセスするには、
　
> (
> 　(generic-java-field-accessor '|Str|)
> 　(var '|Obj|)
> )

となる。

他にはフィールド更新用に
「generic-java-field-modifier」
メソッド用に
「generic-java-method」
とかがある

---
#### Java のフィールド名の値を scheme のデータとして使いたい。

今度は、IsBool という Java のブール型のフィールド(Obj という Binding されたオブジェクトのフィールドとする)を仮定して、これを scheme の if で使う事を考えみる

> (
> 　(generic-java-field-accessor '|IsBool|)
> 　(var '|Obj|)
> )

このままでは、shceme では使えないので、これを scheme として使うのに、(->型 対象) というものがあるので、

> (-&gt;boolean
> 　(
> 　　(generic-java-field--accessor '|IsBool|)
> 　　(var '|Obj|)
> 　)
> )

という感じで、scheme で使えるようになったので、if 演算子に与えると最終的にはこんな感じ

> (if
> 　(eq?
> 　　(-&gt;boolean
> 　　　(
> 　　　　(generic-java-field--accessor '|IsBool|)
> 　　　　(var '|Obj|)
> 　　　)
> 　　)
> 　　#t
> 　)
> 　(ここは真の式)
> 　(ここは偽の式)
> )

というような感じになる。
lessコマンドを綺麗に表示する


`less`コマンドを打つ度に、味気ない単色のファイル結果が表示されていて、使ってるvimのカラーをそのまま持ってこれないかと思っていたらそのまま`less`コマンドにも適用出来るらしいので、その方法をメモしておきます。

> Macの方法になります


## 方法

```
// 現在のディレクトを確認
$ pwd

// 結果
/Users/自分のusernameと返ってくるはず


// /usr/share/vim数字/macrosディレクトリまで移動する
$ cd ../../usr/share/vim74/macros/

// less.shがあればOK
$ ls -la

// vimのカラースキーマで見たいファイルを
/usr/share/vim74/macros/less.sh ファイル名
```

とすればお使いのvimのカラースキーマで確認できる


#### Aliasの設定

ただいちいちパスを打つのは入力が多くしんどいので、aliasを作っておく

> bash

```
// vimでbash_profileを開く
vi .bash_profile

// .bash_profileに以下を入れて保存する
alias less="/usr/share/vim/vim74/macros/less.sh"

//.bash_profileを保存編集し終わったら、反映を忘れない
$ source ~/.bash_profile
```

> zsh

```
// vimで.zshrcを開く
vi .zshrc

// .zshrcに以下を入れて保存する
alias less="/usr/share/vim/vim74/macros/less.sh"

// .zshrcを保存したら、反映
source ~/.zshrc
```

以上でvimのように`less`コマンドでファイルを表示させることができます。

さらに`less`コマンドでファイルを表示中に`v`を押すとそのまま、vimとして編集も出来るようになります。
最新版の Vim で :terminal コマンドを使えるようにする

[ブログ記事](http://secret-garden.hatenablog.com/entry/2017/07/31/183939)からの転載です。

最近何かと話題の Vim の `:terminal` ですが、使用する場合は最新版のソースコードからビルドする他にも `configure` 時に `--enable-terminal` を追加する必要があります。

```shell
$ ./configure --with-features=huge --enable-terminal
```

これで `:terminal` コマンドが使えるようになります。  
細かいビルド方法などは以下のサイトを参考にしてください。

* [Linuxでのビルド方法](http://vim-jp.org/docs/build_linux.html)
Digdag UIのPAUSE/RESUME機能 & Digdag CLIでのenable/disable機能の注意点


# 概要
スケジュール実行が設定されたワークフローを一時停止した後に一時停止を解除すると、今まで実行がスキップされていた分のセッションが一気に実行される。
この挙動が嫌な場合は、一時停止を解除する直前に、`digdag reschedule`を実行する必要がある。

# 再現手順

以下の1分毎にhogeと出力するだけのワークフローをサーバーにpush。

```
timezone: Asia/Tokyo

schedule:
  minutes_interval>: 1

+echo:
  echo>: hoge
```

Digdag UIのPAUSEボタンを押して、ワークフローのスケジュール実行を一時停止する。

数分間待つ。

RESUMEボタンを押して、一時停止を解除する。

PAUSE中のセッションが一気に動き出す！！

```
2017-08-04 11:16:53 +0900 [INFO] (scheduler-0): Starting a new session project id=1 workflow name=workflow session_time=2017-08-04T11:13:00+09:00
2017-08-04 11:16:53 +0900 [INFO] (0095@[0:sample]+workflow+echo): echo>: hoge
hoge
2017-08-04 11:16:54 +0900 [INFO] (scheduler-0): Starting a new session project id=1 workflow name=workflow session_time=2017-08-04T11:14:00+09:00
2017-08-04 11:16:54 +0900 [INFO] (0095@[0:sample]+workflow+echo): echo>: hoge
hoge
2017-08-04 11:16:55 +0900 [INFO] (scheduler-0): Starting a new session project id=1 workflow name=workflow session_time=2017-08-04T11:15:00+09:00
2017-08-04 11:16:55 +0900 [INFO] (0095@[0:sample]+workflow+echo): echo>: hoge
hoge
2017-08-04 11:16:56 +0900 [INFO] (scheduler-0): Starting a new session project id=1 workflow name=workflow session_time=2017-08-04T11:16:00+09:00
2017-08-04 11:16:56 +0900 [INFO] (0095@[0:sample]+workflow+echo): echo>: hoge
hoge
2017-08-04 11:17:00 +0900 [INFO] (scheduler-0): Starting a new session project id=1 workflow name=workflow session_time=2017-08-04T11:17:00+09:00
2017-08-04 11:17:00 +0900 [INFO] (0095@[0:sample]+workflow+echo): echo>: hoge
hoge
```

なお、Digdag CLIで`digdag disable`、`digdag enable`を行った時も同様の挙動をします。

# 回避方法
RESUMEボタンを押す直前にDigdag CLIから以下のコマンドを打つと、この挙動を抑制できます。

```
digdag reschedule <schedule id> --skip-to "$(date '+%Y-%m-%d %H:%M:%S %z')"
```

なお、現時点ではこの操作はDigdag UIから行うことができません。


schedule id を取得するにはDigdag CLIから以下のコマンドを打つと、スケジュール一覧を取れるのでそれを使えます。

```
$ digdag schedules
Schedules:
  id: 4
  project: sample
  workflow: sample
  disabled at: 2019-02-18 11:39:19 +0900 (17h 42m 0s ago)
  next session time: 2019-02-19 05:30:00 +0900
  next scheduled to run at: 2019-02-19 05:30:00 +0900 (in 8m 40s)

  id: 5
  project: sample2
  workflow: sample2
  disabled at: 2019-02-18 11:39:24 +0900 (17h 41m 55s ago)
  next session time: 2019-02-19 00:00:00 +0900
  next scheduled to run at: 2019-02-19 09:00:00 +0900 (in 3h 38m 40s)
```

一括で reschedule --skip-to をしたい場合は次のようにすると良さそうです。

```
ids=$(digdag schedules | grep id | awk -F: '{print $2}')
echo "${ids}" | xargs -I{} digdag reschedule {} --skip-to "$(date '+%Y-%m-%d %H:%M:%S %z')"
```