OmniAICreator/Qiita-1.07M huggingface dataset:
Octaveでgifアニメーション

#概要
windowsのOctaveを用いて，gifアニメーションを作成してみます．
できる限り楽で軽い方法を探しました．

#データ
データは 1xN の行列（ベクトル）を用います．

#流れ
一度pngファイルにしてから，gifに変換します．

#点が増えて行く場合
グラフを定義します．
これは最後にpngに保存するために必要です．

```matlab:img.m
h=gcf(); 
```
そして，通常のようにグラフを描いていきます．
hold on は，まだグラフを初期化せずにholdしておくということです．
sprintfによって，pngファイルの名前をiに依存する名前にしています．

```matlab:img.m
for i=1:N
   plot(x(i),y(i),"or")
   hold on
   xlim([-10 10])
   ylim([-10 10])
   saveas(h, sprintf('img_%03d.png', i));
endfor
```

#点が動いていく
点が動く場合は毎回hold offすれば可能です．

```matlab:img.m
for i=1:N
   plot(x(i),y(i),"or")
   hold on
   xlim([-10 10])
   ylim([-10 10])
   saveas(h, sprintf('img_%03d.png', i));
endfor
```

#pngをgifに変換
[このサイト](https://photocombine.net/gifanime/)を使えば，オンラインで変換可能です．

#おまけ
##グラデーション
グラフの種類によっては点の色を変えてグラデーションにしてみるということも考えられます．

```matlab:img.m
for i=1:N
   plot(x(i),y(i),"or","Color",[i/N, 1-i/N, 0.5])
   hold on
   xlim([-10 10])
   ylim([-10 10])
endfor
```
##点の色ををランダムに変えることも

```matlab:img.m
color = rand(N, 3)

for i=1:N
   plot(x(i),y(i),"or","Color",[color(i,1), color(i,2), color(i,3)])
   hold on
   xlim([-10 10])
   ylim([-10 10])
endfor
```
Windows10でOneDriveを無効化した

# はじめに

Windows10でOneDriveがトーストアラートを挙げてうるさいので無効化することにした。

<img width="273" alt="Windows シェル エクスペリエンス ホスト_2019-10-26_23-59-6_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/61d109ac-1cfe-ae23-4f9a-f1e7fd88f160.png">


# 対処

1. タスクバー上に表示されるOneDriveアイコンをクリック。

2. OneDriveメニューが表示される。[その他]をクリック。
<img width="271" alt="Microsoft OneDrive_2019-10-26_23-58-43_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/6a9ba592-2403-6c96-eeb1-283d9d69bda4.png">

3. Microsoft OneDriveの設定画面が表示される。[Windows にサインインしたときに OneDrive を自動的に開始する]のチェックを外します。
<img width="295" alt="Microsoft OneDrive_2019-10-26_23-57-56_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/41c7d0b9-5f93-d79a-f258-a2b9c5746d01.png">
インストール直後にやることメモ

インストール直後にする(自分の)儀式をまとめる。
基本ローカルネットワーク運用を前提としています。

# CentoS7編

## パッケージアップデート
何も考えずに全パッケージアップデート。

```
# yum update 
# reboot
```

## net-toolsインストール
ipコマンドでもいいのですが、ifconfig使いたいおじさんなのでインストールしておきます。

```
# yum install net-tools
```

## firewalld停止
ローカル運用なのでがばがばにしときます。

```
# systemctl stop firewalld
# systemctl disable firewalld
```

## SELinux無効化
設定ファイルの変更は書き換える場所を間違ると悲惨なので注意する。

```
# getenforce
# setenforce 0
# getenforce
```
```
# vi /etc/selinux/config
　→　SELINUX=disabled
# reboot
```

## IPアドレス設定

```
(IPv4設定)
# nmcli c m eth0 ipv4.addresses 192.168.YYY.ZZZ/24
# nmcli c m eth0 ipv4.method manual
# nmcli c m eth0 ipv4.gateway 192.168.YYY.1
# nmcli c m eth0 ipv4.may-fail no
# nmcli c m eth0 ipv4.dns 8.8.8.8

(IPv6無効化)
# nmcli c m eth0 ipv6.method ignore
```


# CenOS8編

CentOS8はアレですがStreamを使います。

## パッケージアップデート
何も考えずに全パッケージアップデート。

```
# dnf update 
# reboot
```

## net-toolsインストール
ipコマンドでもいいのですが、ifconfig使いたいおじさんなのでインストールしておきます。

```
# dnf install net-tools
```

## firewalld停止
ローカル運用なのでがばがばにしときます。

```
# systemctl stop firewalld
# systemctl disable firewalld
```

## SELinux無効化
設定ファイルの変更は書き換える場所を間違ると悲惨なので注意する。

```
# getenforce
# setenforce 0
# getenforce
```
```
# vi /etc/selinux/config
　→　SELINUX=disabled
# reboot
```

## IPアドレス設定

```
(IPv4設定)
# nmcli c m eth0 ipv4.addresses 192.168.YYY.ZZZ/24
# nmcli c m eth0 ipv4.method manual
# nmcli c m eth0 ipv4.gateway 192.168.YYY.1
# nmcli c m eth0 ipv4.may-fail no
# nmcli c m eth0 ipv4.dns 8.8.8.8

(IPv6無効化)
# nmcli c m eth0 ipv6.method ignore
```

## SSH鍵認証設定

ssh-keygeでは-mオプションでPEM形式を指定しないとOPENSSHのフォーマットで作成されてしまう。

```
# su - admin
# ssh-keygen -t rsa -b 4096 -m PEM
# ls -la .ssh/
# ssh-copy-id admin@xxx.xxx.xxx.xxx
　→　ユーザのパスワードを求められるので入力する。
→ id_rsaを取得する
```
Windows10 ProにHyper-Vをインストールする

# はじめに
VirtualBoxやVMware WorkStation Player(Free版)などを選択することもできるのだが、今回はこれといった目的もないため、Hyper-Vを使うことにした。

# インストール先の環境

|||
|:-:|:-:|
|HW|Surface Pro 5 (Model 1796)|
|CPU|Intel Core i5-7300U @ 2.60 GHz 2.71|
|RAM|8.00 GB|
|システムの種類|64 ビット オペレーティング システム x64 ベース プロセッサ|

# インストール方法

1. 管理者権限で、コマンドプロンプトを実行。
<img width="735" alt="Desktop_2019-10-27_0-16-29_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/806d4170-0828-b1b4-b192-1bb5af7a66b7.png">

2. [powrshell]を入力し、[Enter]キーを押下。
<img width="734" alt="Desktop_2019-10-27_0-16-48_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/b3d206a9-d08c-68f3-eb21-262cd5a7bd64.png">

3. [Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All]を入力し、[Enter]
<img width="734" alt="Desktop_2019-10-27_0-19-20_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/34310e1d-d181-4c14-eacd-655dec0ef47b.png">
キーを押下。

4. コンピューターの再起動が要求されます。[Y]を入力し、[Enter]キーを押下。

以上でHyper-Vのインストールは完了です。
Windowsスタートメニューにて、[Hyper-V マネージャ]を検索出来ることを確認しておいてください。

<img width="633" alt="Cortana_2019-10-27_0-22-56_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/1eb23a28-10b4-9db4-ea8d-686403e0f5cc.png">



# 参考
- PowerShell を使用して Hyper-V を有効にする https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v
nodejs, npm, nパッケージ構築備忘録【Ubuntu】

# n packageによるnpm環境構築

`n`パッケージを使うことで常に最新版の導入や、`nodejs`自体のバージョン管理を簡単に行うことが出来るようになり、また`npm`パッケージも自動で入れてくれます。

# nパッケージの構築に必要なパッケージ共をaptからinstall

とりあえず`nodejs`や`npm`を`apt`でインストールします。あとで消しますが。

```bash
sudo apt update && sudo apt upgrade
sudo apt install nodejs npm
```

### nパッケージのインストール

```bash
sudo npm -g install n
```

### nパッケージによるnodejsとnpmのインストール

```bash
sudo n latest # もしくはstableで安定版をインストール
node -v
# v13.0.1
```

### aptで入れたnodejs, npmパッケージの削除

```bash
sudo apt purge nodejs npm
```

削除後も`npm`, `nodejs`, `n`パッケージが動作することを確認して下さい。

```bash
node -v
# v13.0.1
which node
# /usr/local/bin/node

npm -v
# 6.12.0
which npm
#/usr/local/bin/npm

n --version
# 6.1.0
which n
# /usr/local/bin/n

# 後始末
sudo apt autoremove
sudo apt clean all
```

# 終わり

```
大丈夫 きっと明日には 忘れてる
```
laravel-excel3.1 で テンプレートを読み込んで出力する

# laravel-excel3.1 で テンプレートを読み込んで出力する

Laravel開発でエクセルを扱うときの定番パッケージ「Laravel Excel」ですが、内部的にはPhpSpreadsheet を利用しているため、テンプレートとしてxlsxファイルを読み込んで出力することができます。
ただ、ドキュメントにはそのものズバリとは書かれていないため、かなーりドキュメントを読み解くことが強いられます。

[https://laravel-excel.com/](https://laravel-excel.com/)

ざっくりと、サンプルコード作りましたので、参考になれば。

```bash
php artisan make:export CompanyExport --model=Company
```

こんな感じで、雛形を出力した後、app/Exports/CompanyExport.php を以下のように編集します。

```php
<?php

namespace App\Exports;

use App\Models\Company;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\BeforeExport;
use Maatwebsite\Excel\Excel;
use Maatwebsite\Excel\Files\LocalTemporaryFile;

class CompanyExport implements FromCollection, WithEvents
{
    use Exportable;

    private $template_file = null;

    /**
     * @param string $template_file
     * @return $this
     */
    public function setTemplate(string $template_file)
    {
        if (file_exists($template_file)) {
            $this->template_file = $template_file;
        }
        return $this;
    }

    /**
     * @return Collection
     */
    public function collection()
    {
        return Company::all();
    }

    /**
     * @return array
     */
    public function registerEvents(): array
    {
        return [
            BeforeExport::class => function (BeforeExport $event) {
                if (is_null($this->template_file)) {
                    return;
                }
                $event->writer->reopen(new LocalTemporaryFile($this->template_file), Excel::XLSX);
                $event->writer->getSheetByIndex(0);
                return $event->getWriter()->getSheetByIndex(0);
            },
        ];
    }
}
```

出力する時には、以下のように利用します。

```php
(new CompanyExport)->setTemplate('template.xlsx')->store('output.xlsx');
Solaris NFSマウント

Solaris10 1/13でのコマンド
# NFSサーバ側

```
# mkdir /backup
# chmod 777 /backup
# share -F nfs -o rw,root=@192.168.0.0/24 /backup
# share
-               /backup   rw,root=@192.168.0.0/24   ""
# svcadm enable network/nfs/server 
# unshare /nfs ...解除
```

# NFSクライアント側

```
# mount -F nfs -o rw 192.168.0.125:/backup /mnt
```
中国でIoTビジネスを始める場合の懸念点をまとめてみた

日本で提供している**IoT**のサービスを、そのまま中国で展開しようとした場合の懸念点について、有識者の話で伺ったこと、自力で調べたことをメモする。

# やりたいこと
中国本土の**IoT Gateway**からセンサーデータを収集し、日本から参照したい。
できれば中国でも参照したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/2d9edf67-e902-eae8-1819-9137047687c1.png)

# 懸念されること
## データの越境移転制限
中国は越境データを規制している。中国のIoT Gatewayが収集したデータが「個⼈情報」および「重要データ」にあたる場合、日本のサーバに直接送信することはできない。いわゆる**データローカライゼーション**というやつ。平たく言うと、自国で収集したデータは他国に出せないということ。
2017年に施行された**中国サイバーセキュリティ法**で、中国で収集・生成した「個⼈情報」および「重要データ」は原則、中国国内に保存しなければならないと規定がある。重要データとは、中国の国家の安全、経済発展および公共の利益と密接に関係するもの、とされている。（なるほど、わからん）

IoT Gatewayは中国のサーバに送信し、保存した後、中国のサーバが日本のサーバに収集データをコピー（同期）する形になるだろうか。

## 中国のインターネット事情
中国のインターネット事情を語る上で避けて通れないのが、**グレートファイアウォール**と呼ばれるネット検閲システムの存在だ。
日本で見られるサイトの多くが中国では、グレートファイアウォールによって`ERR_CONNECTION_TIMED_OUT`で遮断される。サイバーセキュリティ法の施行以前は個人レベルのVPN接続で回避できていたらしいが、現在では中国政府が認めたVPNサービス以外は遮断される。

中国のインターネットインフラは**China Telecom（中国電信）**、**China Unicom（中国聯合通信）**、**China Mobile（中国移動通信）**の３大プロバイダでほぼ掌握、海外へのインターネット出口も３社が整備している状態。
３社間の相互接続帯域が逼迫していて過剰なトラフィックを処理しきれず、中国国内同士の通信であってもレイテンシが大きい。特に中国電信（上海・広州などの南部地域）と中国聯通（北京・天津などの北部地域）の間で起こるネットの不具合は**中国の南北問題**と呼ばれている。（現在は解消されつつある）

日中間、そして中国国内のインターネット通信速度は遅く、かつ不安定であることに留意する必要がある。

## クラウドサービス事業者
データ越境移転とアクセス品質面を考慮すると、グレートファイアウォールの内側、中国本土にサーバを立てるしかないとなり、中国で使えるクラウドサービスの選定が必要になる。

中国にも**AWS**や**Azure**はあるものの、中国のそれはグローバルリージョンとは別物と捉えた方が良い。
それぞれの運営は中国企業が行っており、**AWS中国**はSinnet（北京リージョン）かNWCD（寧夏リージョン）、**Azure中国**は21Vianetという会社と契約することになる。
グローバルアカウントとは連携しておらず、AWSアカウントもMicrosoftアカウントも、中国専用として新規に発行される。アカウントを発行できるのは中国現地法人に限られるため、日本で取得を代行してくれるパートナーを探す必要がある。

AWSもAzureも、中国リージョンを**リージョン間VPCピアリング接続**の対象外としているので、通信の品質を確保しようとすれば割高な国際専用線を購入しなければならない。

こうした種々の課題に解決しようとするなら、世界３位の中国発パブリッククラウド**Alibaba Cloud**の一択となるのが今の中国の現状である。
Alibaba Cloudには下表の３サイトがあり、日本サイトであればSBクラウド社（ソフトバンクとアリババグループの合弁会社）が窓口となり日本企業でも契約できる。

| サイト | URL | 備考 |
|:---------|:-----------------------------|:-----------------------------------|
|中国サイト | https://cn.aliyun.com        |日本からのユーザ登録はまず無理と思われる |
|国際サイト | https://www.alibabacloud.com |   |
|日本サイト | https://jp.alibabacloud.com  |日本リージョンの運営はSBクラウド社 |

Alibaba Cloudの、中国リージョンと東京リージョンのVPC間接続には、CEN（Cloud Enterprise Network）という安価な専用線サービスを利用する。CENはインターネットと⽐べ圧倒的な安定性と低レイテンシが期待できる。
その上で、Alibaba Cloudの東京リージョンと、AWS/Azureの東京リージョン（既設）を、インターネットまたはVPN Gatewayで接続するという**マルチクラウド構成**が現実的な選択肢となるだろうか。（下図）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/d2767b4f-d6f0-74f7-0b05-72edb03ca826.png)

## IoT Gateway

* 日本で販売しているIoT Gatewayを中国に持ち込む場合、中国政府の認証（**CCC認証**や**SRRC認証**）を取得する必要がある。
* エッジの通信に使うデータ通信専用SIMが、**現地SIM**の場合、GWメーカーの動作保証・実績はあるか？ **グローバルSIM**の場合、中国国内の通信であっても国外を経由するという懸念がある。（例えばSORACOM社のグローバルSIMだと、AWSフランクフルトリージョンを経由する）
* 暗号化通信を⽤いる場合、中国の**商⽤暗号管理条例**に抵触しないか？

## ICPライセンス
中国のWebサイトはすべて許可制。Webサイトを開設するには**ICP登録**が必要になる。
違反すると、Webサイトの即時停⽌（80/443ポートの遮断）だけでなく、サーバの没収や罰⾦処分の対象となる可能性がある。申請できるのは中国現地企業のみ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/98073eee-43e5-71df-a3d0-ec3a6d296f3d.png)
上図はAlibaba Cloud中国サイトのWebサイトであるが、ICP番号（「浙」の字は、浙江省通信管理局への届出という意味）と、浙江省公安局への届出番号が表記されている。
【PHP】アロー演算子→とスコープ定義演算子::

PHPの学習メモ
※勉強中のため、間違いがあればご指摘お願いいたします。

PHPを勉強してて->とか::が出てきていまいちよく分からなかったので、意味、使い道を調べました。

#アロー演算子(->)
クラスのメソッドやプロパティにアクセスするための演算子。
左辺から右辺を取り出します。

###１、プロパティにアクセス
下記では、Menuクラスのインスタンスにcoffeeがあり、
nameにLatteを代入します。$coffee->nameで「coffeeのname」にアクセスできます。

```php
<?php
class Menu{
  public $name;
}

$coffee = new Menu();
$coffee->name = 'Latte';

echo $coffee->name; //Latte
?>
```

###２、メソッドにアクセス
```php
<?php
Class Menu{
  public $name;

  public function message(){
    echo '当店オススメの一品です';
  }
}

$coffee = new Menu();
$coffee->name = 'Latte';
$coffee->message(); //当店オススメの一品です
?>
```

###$this->
メソッド内でインスタンスのプロパティやメソッドにアクセスしたいときは、$thisを使います。
例えば、下記では$this->nameでnameにアクセスしています。nameは何かと言うとLatteでした。

```php
<?php
Class Menu{
  public $name;

  public function message(){
    echo $this->name.'は当店オススメの一品です';
    //Latteは当店オススメの一品です
  }
}

$coffee = new Menu();
$coffee->name = 'Latte';
?>
```

#スコープ定義演算子(::)
クラスの定数や静的なメソッドにアクセスする演算子。
定数は変更しない固定の値のこと。静的なメソッドは全てのインスタンスに共通して使える、またはインスタンスがなくても使えるメソッド（staticメソッド）。

```php
<?php
Class Menu{
//定数を定義(消費税は１０％で固定）
  public static function tax_rate(){
     return 1.1
  }
}

$menu = Menu::tax_rate();
echo $menu;
?>
```
※厳密には軽減税率で8%の場合もありますが、今回は便宜上10%とさせてもらってます。

###parent::で継承関係にある親のメソッドを子インスタンスが呼び出す。

```php
<?php
// ドリンククラス
class Drink{
  public $name;

// 作成メソッド
  function create($name){
    $this->name = $name;
  }

// オーダーメソッド
  function order(){
    echo "オーダー承りました [name]".$this->name;
  }
}

// ドリンククラスを継承したデザートクラス（子クラス）
class Dessert extends Drink{
  // 子クラス用のオーダーメソッド
  function order(){
    // 親クラスのorder()を呼び出す
　　parent::order();
   echo "オーダー承りました";
  }
}

$dess = new Dessert();
$dess->create("デザート");
$dess->order();

?>
```

###self::
クラス内でクラスプロパティにアクセスする際にはselfという変数を使う。

```php
<?php
class Drink{

  private $name;
  private $price;
  private $orderCount = 0;

  private static $count = 0;

  public function __construct($name, $price){
    $this->name = $name;
    $this->price = $price;

    self::$count++;
  }

  public function order(){
    echo $this->name.'のオーダー承りました';
  }

  public function getOrderCount(){
    return $this->orderCount
  }
}
?>
```
[メモ]Linuxのディレクトリ構造

Linuxを理解する上でファイルシステムの理解は欠かせないと思いましたが、似たようなディレクトリが色々あって混乱しそうだったので書籍や記事を見ながらまとめました。

| ディレクトリ       | 役割       |   
|:-----------------|:------------------|
| /bin             | Linuxの基本コマンドが配置              | 
| /dev           | デバイスファイルが配置。システム起動時に接続されているデバイスがチェックされ、自動的に作成される           | 
| /etc             |システム管理用の設定ファイルや各種ソフトウェアの設定ファイルが配置              | 
| /lib               | /binや/sbinなどに置かれたコマンドやプログラムが利用するライブラリが配置                | 
| /lib/modules             | (ローダブル)カーネルモジュールが配置             | 
| /media          | CD/DVDなどのデータが配置          | 
| /opt         | Linuxインストール後、追加でインストールしたパッケージ(ソフトウェア)が配置           | 
| /proc         | カーネルやプロセスが保持する情報を配置           | 
| /root         | rootユーザーのホームディレクトリ          | 
| /sbin         | 主にシステム管理者が使用するコマンドが配置。オプションによって一般ユーザーも使用可能(rootユーザー以外はデフォルトでは使えない)          | 
| /tmp         | アプリケーションやユーザーが利用する一時ファイルが配置          | 
| /var         | システム運用中にサイズが変化するファイルが配置          | 
| /var/log         | システムやアプリケーションのログファイルが配置          | 
| /boot         | システム起動時に必要なブートローダー関連のファイルやカーネルイメージが配置          | 
| /usr         | ユーザーが共有するデータが配置。ユーティリティ、ライブラリ、コマンドなど          | 
| /usr/bin         | 一般ユーザー、管理者が使用するコマンドが配置          | 
| /usr/lib         | 各種コマンドが利用するライブラリが配置          | 
| /usr/sbin         | システム管理者のみ実行出来るコマンドが配置          | 
| /usr/local/bin        | 自分でインストールしたコマンドが配置          | 
| /home         | ユーザーのホームディレクトリが配置          | 


出典①；本気で学ぶLinux実践入門
出典②：https://qiita.com/valzer0/items/67a4c8bf2b1be0fc825a
Ubuntu 18.04にMariaDB 10.1をインストール（OS標準）

# はじめに

Ubuntu18.04にMariaDB10.1をインストール
親記事：[MySQL, MariaDBの各種インストール方法とEOLまとめ \- Qiita](https://qiita.com/witchcraze/items/72291ee035437ec83273)

## LOG

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

# apt update; apt install -y mariadb-server
... 略
```

### 各種確認

```shell-session
# service mysql start
# mysql -u root -e'select version();'
+----------------------------------+
| version()                        |
+----------------------------------+
| 10.1.41-MariaDB-0ubuntu0.18.04.1 |
+----------------------------------+
```
Masoniteで[FileNotFoundError]が出るときの対処法

# Masoniteでcraft installが実行できない

`craft install`で下記エラーが出る

```bash

[FileNotFoundError]
  [Errno 2] No such file or directory: 'pip3': 'pip3'
```
# TL;DR

pipのVersionあげましょう


# 環境

```
+ Windows10
+ Power Shell
+ Python3.7
+ pip19.0.3

```


# 解決までの経緯

`craft new`で各ファイル生成後,ディレクトリを移動し`craft install`でコケる

+ masonite-cliのインストールが失敗しているなら,そもそも`craft new`も失敗するはずだが成功している

+ windows環境なのでpython2.7はプリインストールされていないのでPythonのVersionに起因するものでは無さそう?

公式ドキュメントの [Known Installation Issues](https://docs.masoniteproject.com/prologue/known-installation-issues) には 

+ masonite-cliの再インストール

+ `pip install`じゃなくて`pip3 install`でやってみて

とかそこらへん

2番目の策で思いついてダメ元でpipをアップグレードしてみる

```
$ python -m pip install --upgrade pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/00/b6/9cfa56b4081ad13874b0c6f96af8ce16cfbc1cb06bedf8e9164ce5551ec1/pip-19.3.1-py2.py3-none-any.whl (1.4MB)
    100% |████████████████████████████████| 1.4MB 5.1MB/s
Installing collected packages: pip
  Found existing installation: pip 19.0.3
    Uninstalling pip-19.0.3:
      Successfully uninstalled pip-19.0.3
Successfully installed pip-19.3.1
```

pipのバージョンが19.0.3 → 19.3.1 に上がる

その後, ```craft install``` でインストールできた

![Welcome To Masonite 2.2 - Google Chrome 2019_10_26 23_14_25 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35159/4ad98532-d84b-76d4-45f8-1a276f7a36a0.png)
webpackで本番用の設定を作成

[django-webpack-loader のセットアップ](https://qiita.com/gsk3beta/items/c2b902c3659610701071)の続きです

公式の[Production](https://webpack.js.org/guides/production/)を参照しました

```sh
npm install --save-dev webpack-merge
```

本番用の設定を切り分けます

開発、本番の共通部分を`webpack.common.js`とします

```js:webpack.common.js
const webpack = require('webpack')

module.exports = {
  context: __dirname,
  entry: {
      main: './assets/js/main.js' // エントリ名とエントリポイント
  },

  output: {
      filename: "[name]-[hash].js",
  }
}
```

開発用の設定`webpack.dev.js`

```js:webpack.dev.js
const path = require("path")
const merge = require('webpack-merge')
const BundleTracker = require('webpack-bundle-tracker')
const common = require('./webpack.common.js')

module.exports = merge(common, {
  mode: 'develepment',
  output: {
      path: path.resolve('./assets/bundles/'),
  },
  plugins: [
    new BundleTracker({filename: './webpack-stats-dev.json'}),
  ],
});
```

本番用の設定`webpack.prod.js'

```js:webpack.prod.js
const path = require("path")
const merge = require('webpack-merge')
const BundleTracker = require('webpack-bundle-tracker')
const common = require('./webpack.common.js')

module.exports = merge(common, {
  mode: 'production',
  output: {
      path: path.resolve('./MYSITE/static/dist/'),
  },
  plugins: [
    new BundleTracker({filename: './webpack-stats-prod.json'}),
  ],
});
```

## django-webpack-loader

```py:settings.py
...
if not DEBUG:
    WEBPACK_LOADER['DEFAULT'].update({
        'CACHE': True,
        'BUNDLE_DIR_NAME': 'dist/',
        'STATS_FILE': os.path.join(BASE_DIR, 'webpack-stats-prod.json')
    })
...
```
補間関数マシンとしてのAI実験　 AI Test as an Interpolation Function Machine

補間関数マシンとしてのAI実験　 AI Test as an Interpolation Function Machine

ニューラルネットは補間関数だと前に述べた（https://randomwalkjapan.blogspot.com/2019/05/ai-reality-of-booming-ai.html）が、下の自作ツールで試してみよう！Ealier I mentioned that neural net is an interpolation function(https://randomwalkjapan.blogspot.com/2019/05/ai-reality-of-booming-ai.html) so let's try it out in below tool I made!

１０個のデータポイントを色々変えると、関数が難しくなるにつれて、ニューロン数、繰り返し回数、中間層の数を増やさないと追従できなくなることが確認できる。If you change 10 data points, as function become complex, you can confirm that interpolation becomes difficult unless you increase number of neurons, epochs, layers.

https://randomwalkjapan.blogspot.com/2019/10/aiai-as-interpolation-machine.html

Program is at 
https://github.com/tanakayutaka/Tensorflow.js-tools-/upload/master .
Visual Studioメモ

# メモリリーク検出用デバッグコード
Visual C++を使用したソフトウェア開発において，メモリリークを発生させるコードは気を付けていても作り込まれてしまうもの。
これはC/C++の宿命のようなものであるが，メモリリークの要因は，メモリリーク検出用のデバッグコードを埋め込むことにより，容易に取り除くことができる。

(1) メモリリークが疑われるソースコードの先頭行に以下の宣言文を追加する。

```
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define new ::new(_NORMAL_BLOCK, __FILE__, __LINE__)
```
(2) メモリリークの候補をDUMPする。

```
OutputDebugString(_T("Dump memory leaks"));
_CrtDumpMemoryLeaks();
```
Visual C++からデバッグモードでプログラムを起動すると，上記#2のDUMP情報がVisual C++のコンソールに出力される。
出力される情報は下記のとおり。

- メモリ割り当て番号 (中括弧に囲まれた数字)
- ブロックの型 (Normal、Client または CRT)
- 16 進数で表されるメモリの位置
- バイト単位で表されるブロックのサイズ
- 先頭の 16 バイトの内容 (16 進数)

```
c:\work\github\yaizucomlib\src\commonfunc\stkobject.cpp(716) : {3539} normal block at 0x00AB4CE8, 32 bytes long.
Data: <HM M > 48 4D AB 00 16 00 00 00 90 4D AB 00 00 00 00 00
```

OutputDebugStringおよび_CrtDumpMemoryLeaksのみでもDUMP情報は出力されるが，前述#defineおよび#includeを挿入することにより， ソースコードのファイル名とメモリ確保を行った行番号が出力される。

# Visual Studioの検索・置換における正規表現
_T("xxx")をL"xxx"に置換する例。

```
検索: _T\("(.*)"\)
置換: L"$1"
```
Raspberry Piで気象情報付き時計

# 気象情報付き時計

我が家のテレビの横に、時刻と気象情報を表示するRaspberry Pi製のデバイスを置いている。
<img width="1105" alt="weather_clock.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110601/ac7b2ab9-5414-c192-163f-f4a59254694d.jpeg">
本体は[Model B V1.2](https://www.amazon.co.jp/dp/B01NAHBSUD)で、画面は[公式Touchscreen Display](https://www.amazon.co.jp/dp/B076F3G9W9)で、ケースは[RSコンポーネンツ製タッチスクリーン液晶用ケース](https://www.amazon.co.jp/dp/B01HT0EMUM)。

Google Nest Hubを買ってからは部屋の隅に追いやられた感があるけれど、テレビを見ながら時間や天気を確認するのには便利なので、まだ現役である。

しばらくOSのアップデートをしてなかったので、さすがにセキュリティ的に良くないかなと思って[RaspbianのHP](https://www.raspberrypi.org/downloads/raspbian/)を見てみたら、Raspbian Busterが出ていたので、更新することにした。

# 変更点

今まではRaspberry Pi内でNode.jsを使って以下の機能を実装していた。

 - テレビのOn/Offに合わせてRaspberry Piの液晶画面の電源をOn/Off。テレビ(SONY BRAVIA)の電源状況の確認は[このライブラリ](https://github.com/alanreid/bravia)を使用。
 - 気象庁のページから気象情報を取得して整形して返すWebサーバ。

Node.js環境を構築するのが面倒なので、今回は下記のように変更した。

 - 電源をOn/OffはShellとCurlで。
 - 気象情報を表示するWebサーバはglitch.meに移行。https://weather-clock.glitch.me

前回はminimalなOS imageから必要なパッケージを選んでインストールしたけど、面倒なので、デスクトップ環境のOS imageを使った。

# 構築方法

公式ページからRaspbian Buster with desktop (2019-09-26-raspbian-buster.zip) をダウンロードして、SHA256を確認して解凍。

```bash
$ shasum -a 256 2019-09-26-raspbian-buster.zip
2c4067d59acf891b7aa1683cb1918da78d76d2552c02749148d175fa7f766842  2019-09-26-raspbian-buster.zip

$ unzip 2019-09-26-raspbian-buster.zip
Archive:  2019-09-26-raspbian-buster.zip
  inflating: 2019-09-26-raspbian-buster.img
```

SDカードをMacに挿す前と後でdiskutil listを比較して、増えた`/dev/diskN`を確認。(私の環境では`/dev/disk2`。) `diskutil unmountDisk`でディスクをアンマウントし、`dd`コマンドでディスクイメージをSDカードに書き込む。`dd`コマンドはかなり時間がかかる。`Ctrl+T`で何バイト書き込まれたか確認できる。

```bash
$ diskutil unmountDisk /dev/disk2 
Unmount of all volumes on disk2 was successful
$ sudo dd if=2019-09-26-raspbian-buster.img of=/dev/disk2 bs=1m
```

Raspberry PiにSDカードを指して、起動後表示されるウィザードにそってパスワードとかWi-Fiを設定。
`sudo raspi-config`でSSHをオン。
`sudo apt-get update`と`sudo apt-get full-upgrade`でパッケージの[更新](https://www.raspberrypi.org/documentation/raspbian/updating.md)
`sudo apt-get install unclutter`で`unclutter`をインストール(マウスカーソルを消す)。


`sudo nano /boot/config.txt`でconfig.txtに`lcd_rotate=2`(液晶画面の上下反転)と`avoid_warnings=1`(低電圧警告の⚡を非表示)を追加。

下記disp_on_off.shを`/home/pi`に置いて、`chmod +x disp_on_off.sh`。`TV_IP`はテレビのIPアドレス。

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

TV_IP=192.168.0.111

while :
do
  RESULT=`curl -Ss -d '{"method":"getPowerStatus","params":[],"id":1111,"version":"1.0"}'  http://$TV_IP:80/sony/system`
  if [ "`echo $RESULT | grep 'active'`" ]; then
    sudo sh -c "echo 0 > /sys/class/backlight/rpi_backlight/bl_power"
  else
    sudo sh -c "echo 1 > /sys/class/backlight/rpi_backlight/bl_power"
  fi
  sleep 1
done
```

autostartファイルを作って、

```
mkdir -p /home/pi/.config/lxsession/LXDE-pi/
sudo nano /home/pi/.config/lxsession/LXDE-pi/autostart
```

下記を追記

```
@/usr/bin/chromium-browser --kiosk --start-maximized --incognito https://weather-clock.glitch.me/
@/home/pi/disp_on_off.sh

@unclutter
@xset s off
@xset s noblank
@xset -dpms
```

あとは`sudo reboot`で再起動して完成。
Google Apps Scriptでスプレッドシート上の特定条件に合致する行を削除するループ処理

GASを用いてスプレッドシートにあるデータの内、特定の条件がある行のみを削除するループ処理の関数を作成した時のメモです。
カウントアップすると削除時に行ズレが発生するので、カウントダウンさせています。

例:2列目に登録されている時刻データを現在時刻と比較して、古い場合は行を削除します。

```javascript:ClearRowOnSpreadSheet
function ClearRowOnSpreadSheet(){
  const Now = new Date(); //現在時刻を取得
  const Sheet = SpreadsheetApp.getActiveSheet(); //シートを取得
  const Time_Column = 2; //条件検索の列を指定
  const lastRow = sheet.getLastRow();

  for(var row = lastRow; row > 0; row--){
   var Time = sheet.getRange(row, Time_Column).getValue();
   var TimeDate = Date.parse(startTime);

     if(TimeDate < Now.getTime()){
      sheet.deleteRow(row);
      }
    }
}
```
n件ずつ表示する「もっと見る」ボタンのシンプル実装

私はなぜか「もっと見る」ボタンを実装することがやたらと多いので、いろいろなやり方を試す中で「これが一番シンプル！」と発見した方法を書いておきます。

## 要件

今回は以下のような要件の「もっと見る」ボタンを実装します。
![more_btn.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/c970476d-bc48-80aa-3440-b52efbf442e3.gif)

- 一覧があり、最初は6件表示されている
- 「もっと見る」ボタンをクリックすると6件ずつ表示される
- もっと見るものがなくなったら、「もっと見る」ボタンは消える
- データのロードは最初に全件行う。「もっと見る」をクリックしたときにロードするわけではない
- したがって、速度を速くする目的ではなく、一覧の量が多いので隠しておきたい時に使えるものを実装する

## デモ

デモを作成しましたので以下のリンクから動作確認ができます。
[もっと見るボタン - codepen](https://codepen.io/ayuko/pen/abbWRpV)

## この「もっと見る」ボタンのおすすめポイント

- jsがたったの8行！
- htmlはn件ごとにdivで区切ったりする必要なし
- 「もっと見る」をクリックして出現する時、ささやかなアニメーションつき

## 実装のポイント

詳しい実装はデモのcodepenを見てほしいのですが、jQueryでやっていることは下記のような内容です。

1. 最初の6件以外を非表示にする
2. 「もっと見る」をクリックしたら、非表示になっている項目の頭から6件だけ表示する
3. 表示後、非表示の項目が0件の場合は、「もっと見る」ボタンを非表示にする

実装は以下のようになっています。

```javascript:JavaScript
var moreNum = 6;
$('.list li:nth-child(n + ' + (moreNum + 1) + ')').addClass('is-hidden');
$('.more').on('click', function() {
  $('.list li.is-hidden').slice(0, moreNum).removeClass('is-hidden');
  if ($('.list li.is-hidden').length == 0) {
    $('.more').fadeOut();
  }
});
```

### 1. 最初の6件以外を非表示にする

「最初の6件以外」をどう取得するかがポイントですが、cssの`nth-child`という疑似クラスを使用しました。以下のコードの部分です。

```javascript

$('.list li:nth-child(n + ' + (moreNum + 1) + ')').addClass('is-hidden');
```

`.list li:nth-child(n + 7)`とすることで、**「listクラス内のliタグの７番目以降」**が取得できます。`nth-child`は大変便利で、jsでロジックを書かなくてもcssのセレクタだけでn番目、n以前、n以降、最初、最後などが取得できます。

### 2. 「もっと見る」をクリックしたら、非表示になっている項目の頭から6件だけ表示する

こちらは以下のような実装をしました。

```javascript

$('.list li.is-hidden').slice(0, moreNum).removeClass('is-hidden');
```

非表示の要素には`is-hidden`クラスが付与されるので、これをセレクタにします。
6件目までを取得するには配列の`slice`メソッドを使用しています。`slice`は、配列の0から6までの要素をコピーして新しい配列を返すメソッドです。

最初は`nth-child`でできないか試してみたのですが、この場合では難しかったです。
`li.is-hidden:nth-child(-n + 6)`とか
`li.is-hidden:nth-of-type(-n + 6)`とか
これらはうまくいきません。理由は`nth-child`も`nth-of-type`もタグに対して何番目かを選択できるもので、is-hiddenなどのクラス要素内で何番目かは選択できないのでした。

### スライドアニメーションの実装方法

アニメーションはcssで実装しています。以下はアニメーション部分のcssの抜粋です。

```css:css
.list li {
    opacity: 1;
    height: 32px;
    margin-top: 10px;
    transition: all 0.4s ease 0s;
}
.list li.is-hidden {
    opacity: 0;
    height: 0;
    margin: 0;
}
```

`.list li {...}`に書かれているのが表示状態のスタイルで、
`.list li.is-hidden {...}`に書かれているのが非表示状態です。
非表示→表示に変わる時の変化の指定をしているのが、`transition`プロパティです。`transition`はアニメーション関連の設定のショートハンドです。一言で解説すると「0.4秒で変化しろ！」という指定となっています！

「非表示のスタイルは`display:none;`でいいんじゃないの？」と思う方もいるかもしれませんが、ダメなのです。
`transition`できるプロパティとできないプロパティがあるためです。そのため、非表示→表示や表示→非表示にアニメーションを入れたい場合、opacity（透明度）をよく使っています。fadeIn・fadeOutの効果が出せておすすめです。
今回は`height`にも変化をつけたため、「fadeInしながらスライド」みたいなアニメーションになりました。

### この実装の問題点

初回表示時に全件表示されたあと7件目以降が隠れるところのが一瞬見えてしまいます。もっと良い実装をするなら、アニメーション時だけ特定のクラスを付与すると良いのですが…それはまたの機会に…。
気になる場合はアニメーションをやめると良いと思います。

## まとめ

css疑似クラスの`nth-child`やjs配列の`slice`メソッドを使って、n番目以降やn番目以前を取得する方法をご紹介しました。こういうテクを知っていればごりごりロジックを書く必要がなくなって便利ですね！

## 参考記事

[何番目系の便利なCSSまとめ](https://qiita.com/ituki_b/items/62a752389385de7ba4a2)
[【CSS】nth-childとnth-of-typeでもう混乱しない。](https://qiita.com/shunsuke227ono/items/6c9916f80d82b73a7025)
[【CSS3】Transition（変化）関連のまとめ](https://qiita.com/7968/items/812d6a21fc4dd9ae9c75.)
Macでファイルリスト自動生成（Automator使用）

Macでファイルリストを自動生成する方法を共有します。
Automatorで以下の画像のように項目を設定してください。

<img width="904" alt="ss.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410880/b80ee855-063c-f307-ec41-4b57ea809889.png">

1. 指定されたFinder項目を取得
ここではファイルリストを作りたいフォルダーを指定します。

2. フォルダの内容を取得
3. 新規テキストファイル
4. シェルスクリプトを実行
シェルに「/bin/bash」を指定して、以下のコードを入れてください。
※ 「XXXXXXX」だけ自分のデスクトップのパスに変えてください

```
cd Desktop
sed -i -e 's/\/Users\/XXXXXXX\/Desktop\///g' base.txt
sed -n '/\./p' base.txt > filelist.txt
sed -i -e '/_old1/d' filelist.txt
sed -i -e 's/\n/\r\n/' filelist.txt
rm base.txt base.txt-e filelist.txt-e
```


以上4点を設定して、実行するとデスクトップに「filelist.txt」が生成されています。

<img width="619" alt="result.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410880/d178b4c6-0fda-8b4f-6ed3-85b234bbce1f.png">



Automatorの.workflowファイルとして保存しておけば、
次回からすぐに使えるようになるので便利です。
データ納品のときに、ファイルリスト作成を手作業でやらないために書きましたが、
結構ゴリ押しのbashだと思ってます。
（そもそもbash自体、次の行への値を渡すことができないので、base.txtを1回作っています。）

※ デスクトップにbase.txtやfilelist.txtというファイルがあると上書きされてしまいます。気をつけてください。
Unity フェードクラス設計

#はじめに
ゲーム制作で必須のフェードクラスをまた作ったので忘れない用に記事にして残す
実装ソースコードは[こちら](https://github.com/zi-su/ScriptLibrary/tree/master/UI)

#要件
- シングルトンなアクセス
- フェードイン
- フェードアウト
- 秒指定
- 色指定
- フェード完了後にコールバック
    - フェードアウト後にロードやオブジェクト破棄したいなどのため。

を満たす機能を作成する。

#実装
- Awake内でCanvasを生成
    - CanvasScalerを追加
    - GraphicRayCasterを追加

```cs
void CreateCanvas()
    {
        //Canvasコンポーネント
        _canvas = gameObject.AddComponent<Canvas>();
        _canvas.renderMode = RenderMode.ScreenSpaceOverlay;
        _canvas.sortingOrder = sortingOrder;
        //CanvasScaler
        var scaler = gameObject.AddComponent<CanvasScaler>();
        scaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
        scaler.referenceResolution = new Vector2(Screen.width, Screen.height);

        //GraphicsRayCaster
        gameObject.AddComponent<GraphicRaycaster>();
    }
```

- Imageを追加するGameObjectを生成
    - Imageコンポーネントを追加
    - AnchorをMin(0.0f,0.0f)、Max(1.0f,1.0f)、Positionを(0.0f,0.0f)に設定

```cs
void CreateImage()
    {
        _fade = new GameObject("fadeImage", typeof(Image));
        _fade.transform.SetParent(transform);
        var rect = _fade.transform as RectTransform;
        Vector2 min = new Vector2(0.0f, 0.0f);
        Vector2 max = new Vector2(1.0f, 1.0f);
        rect.anchorMin = min;
        rect.anchorMax = max;
        rect.anchoredPosition = new Vector2(0.0f, 0.0f);
        rect.sizeDelta = new Vector2(0.0f, 0.0f);
        _fadeImage = _fade.GetComponent<Image>();
        _fadeImage.color = new Color(1.0f, 1.0f, 1.0f, 0.0f);
    }
```

- Updateでフェード処理実装
    - Color.Lerpでフェード色を時間指定で補間させて取得
    - 0.0秒以下の時点でフェード終了、コールバックがあれば呼び出し
    - フェードインの場合はCanvas描画させているだけ無駄なのでenabled=falseにする

```cs
private void Update()
    {
        switch (_mode)
        {
            case Mode.Idle:
                break;
            case Mode.In:
                _fadeImage.color = Color.Lerp(_toColor, _fromColor, _elaps / _time);
                _elaps -= Time.deltaTime;
                if(_elaps < 0.0f)
                {
                    _fadeImage.color = _toColor;
                    _mode = Mode.Idle;
                    _canvas.enabled = false;
                    _action?.Invoke();
                }
                break;
            case Mode.Out:
                _fadeImage.color = Color.Lerp(_toColor, _fromColor, _elaps / _time);
                _elaps -= Time.deltaTime;
                if (_elaps < 0.0f)
                {
                    _fadeImage.color = _toColor;
                    _mode = Mode.Idle;
                    _action?.Invoke();
                }
                break;
            default:
                break;
        }
    }
```
#おわりに
フェードをレイヤー分けて複数使いたい場合はSortingOrderを都度指定してあげればいいかと思っている。
フェードアウトするけどモノローグやセリフを表示させておきたい場合など。
たった3行のJavaScriptでRedmineの項目削除時の「よろしいですか？」問題を解決した件

# 初めに

[Ankosoft](https://www.ankosoft.co.jp)の山崎です。
redmine.tokyo の[第17回勉強会](https://redmine.tokyo/projects/shinared/wiki/第17回勉強会)まで後１週間と迫っていますので、少しでもRedmineを盛り上げられればと思い、RedmineのUI改善のお話をしたいと思います。

Redmineで管理者権限があるユーザーが「管理」ページで「ユーザー」、「グループ」、「ロール」、「トラッカー」、「チケットのステータス」、「カスタムフィールド」、「文書カテゴリ」、「チケットの優先度」、「作業分類 (時間管理)」で項目を削除することができます。

しかし下図のように項目名と削除のボタンがかなり離れているため、削除したい項目の削除ボタンをクリックしたつもりが、他の項目の削除ボタンを誤ってクリックしてしまう可能性があります。（実際に何度か誤って削除してしまったことがあり、対応に苦労しました）

![alt](http://ankosoft.co.jp/wp-content/uploads/2019/10/ankosoft_delete_problem.png)

誤って項目が削除されることを防止するユーザーの操作性の向上のためにアラートがポップアップする仕様になっていますが、「よろしいですか？」というメッセージでは「OK」をクリックした場合に何が削除されるのか分からないので、ユーザーとしては不安感が残るUIになっていました。

さすがにプロジェクトが誤って削除されたら、問題の影響が大きいので、「ユーザー」、「グループ」などとは異なり、削除をクリックすると、ページが遷移して、プロジェクト名が明記された状態でユーザーに最終意思確認をしています。

![alt](http://ankosoft.co.jp/wp-content/uploads/2019/10/ankosoft_redmine_pj_delete.gif)


## 改善した削除UI

下図のように「削除」をクリックすると、【「項目名」を削除してもよろしいですか？】というメッセージを表示します。
これにより、正しい項目を削除することができ、削除の最後の確認段階で自分が意図した項目であるかどうかを確認することができます。

![alt](http://ankosoft.co.jp/wp-content/uploads/2019/10/ankosoft_delete_resolution.png)

![alt](http://ankosoft.co.jp/wp-content/uploads/2019/10/ankosoft_redmine_tracker_delete.gif)


## 作成したJavaScriptコード

htmlソースを確認すると、削除ボタンをクリックすると、「data-confirm」に記載されている「よろしいですか？」がポップアップアラートのメッセージとして表示されることが分かります。
![alt](http://ankosoft.co.jp/wp-content/uploads/2019/10/ankosoft_delete_html.png)

強制的にJavaScriptで「data-confirm」に「【項目名】＋削除しても」を追加してポップアップアラートのメッセージに項目名を表示させます。

```javascript:qiita.rb
$('tr').each(function(i, elem){
	$(elem).find("a:last").data('confirm',"「"+$(elem).find("a:first").text()+"」を削除しても"+$(elem).find("a:last").data('confirm'))
});
```

簡単にコードの説明をすると
`$('tr').each(function(i, elem){`の部分で全てのtrタグに対してループ処理をしています。

`$(elem).find("a:last").data('confirm',"`の部分で、trタグ配下の一番最後のaタグの「data-confirm」に下記の２つの値を設定しています。

`"「"+$(elem).find("a:first").text()+"」を削除しても"`の部分で、項目名の取得

`+$(elem).find("a:last").data('confirm')`の部分で元々の「data-confirm」の値、ここでは「よろしいですか？」を取得

これにより、「data-confirm」の値が「よろしいですか？」から「【項目名】＋削除してもよろしいですか？」に変更されます。

これにより、削除ボタンをクリックすると「【項目名】＋削除してもよろしいですか？」が表示されます。

上記のJavaScriptを[view customize plugin](https://github.com/onozaty/redmine-view-customize)に登録して使えばOKです。

ちなみに、このコードで「ユーザー」、「グループ」、「ロール」、「トラッカー」、「チケットのステータス」、「カスタムフィールド」、「文書カテゴリ」、「チケットの優先度」、「作業分類 (時間管理)」全ての削除ボタンで項目名を表示させることができます。

### 参考情報

ではでは、来週のredmine.tokyo の[第17回勉強会](https://redmine.tokyo/projects/shinared/wiki/第17回勉強会)で皆様とお会いできるのを楽しみにしております。

JavaScriptでUIを改善した記事です。
[たった1行のJavaScriptコードでRedmine UI （カスタムフィールドのトラッカー名の表示）を改善する方法](https://qiita.com/ankosoft/items/353724782497c6453865)

RedmineのガントチャートUIを大幅に改善したANKOガントチャートの紹介ページ
[ANKOガントチャート](https://www.ankosoft.co.jp/anko_gantt_chart/)
macでターミナルを開くと出るようになったメッセージを非表示にする

# はじめに
結構前のアップデート完了後から、Macのターミナル(iTerm)を開いたときにメッセージが出てくるようになった。内容は以下。

```sh:message
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
```

長い間無視していたが、急に思い立って非表示にした。

# 方法
以下のコマンドを実行すると、次回からメッセージが非表示になる。`echo`を使わずに直接`~/.bash_profile`を編集しても良い。

```sh:command
echo "export BASH_SILENCE_DEPRECATION_WARNING=1" >> ~/.bash_profile
```

# 参考
- https://www.addictivetips.com/mac-os/hide-default-interactive-shell-is-now-zsh-in-terminal-on-macos/

# おわりに
今はまだUbuntuでbashを使っているので、設定を共有するためにmacでもbashを使おうと思います。
今後、ubuntuの標準シェルが変わったら私もzshを使い始めようかなと思います。
Ansibleから、Kerberos認証を利用して、Windowsへ接続してみた

#概要
AnsibleからKerberos認証を利用してWindows環境へ接続してみたら、いろいろあったので、方法や注意点を備忘録としてまとめました。

#環境
Ansible環境:CentOS7.6+Ansible2.8.5
ターゲット:Windows2016(ホスト名=`ws16001`)
ドメインコントローラ:Windows2016(ホスト名=`ad01`、ドメイン名=`hoge.com`)

#ターゲット側の設定
ターゲットマシンは、ドメイン(hoge.com)に参加しておきます。
winrmで、Serviceの`AllowUnencrypted`やauthの`Basic`を変更する必要はありません。
(http通信のBasic認証を利用するときの設定ですね。)

#Ansible側の設定
Ansible側ですが、公式サイトや、先人達の優良な記事があるので、詳細は割愛します。
当方が実施したコマンドは、以下です。

```bash:bash
yum -y install krb5-devel krb5-libs krb5-workstation
pip install pywinrm[kerberos]
```

また、Kerberos用ファイルの内容は以下の通りです。
注意点としては、よく挙げられていますが、大文字小文字は気をつける必要があります。

```vim:/etc/krb5.conf
(変更部分を抜粋)
[libdefaults]
 default_realm = HOGE.COM

[realms]
 HOGE.COM = {
  kdc = ad01.hoge.com
  admin_server = ad01.hoge.com
  defautl_domain = ad01.hoge.com
 }

[domain_realm]
 .hoge.com = HOGE.COM
 hoge.com = HOGE.COM
```

下記コマンドにて、Kerberos認証の動作確認をします。
`klist`コマンドで、チケット入手ができていればOKです。

```bash:bash
kinit -C administrator@HOGE.COM
klist
```

※チケットを破棄する場合は、`kdestory`を実行します。

Ansibleのインベントリファイルは以下の感じです。

```ini:inventory
[windows]
ws16001

[windows:vars]
ansible_username=Administrator@HOGE.COM
ansible_password=password
ansible_port=5985
ansible_connection=winrm
```

なお、Ansible2.3以降は、インベントリファイルに`ansible_user`と`ansible_password`を指定しておけば、自動的にチケットの取得や破棄を行ってくれます。
[Automatic Kerberos Ticket Management](https://docs.ansible.com/ansible/latest/user_guide/windows_winrm.html#automatic-kerberos-ticket-management)

#接続確認
接続確認は、`win_ping`で行いました。
(接続コマンド等は割愛します)
その際、以下点で引っかかりました。
1)プロキシ設定
　IPアドレスは除外していたのですが、FQDNは除外していなかったので、
　ずっとプロキシ経由でアクセスしようとしていました。(`-vvvvv`オプションで判明しました･･･)
  　→FQDNを除外設定して、直接接続するようになりました。
2)Ansibleのインベントリファイル
　IPアドレスはNGで、FQDNで指定する必要がありました。
　(http通信のときに、IPアドレスを指定していたので、そのまま利用したのがまずかった。。)
　当然名前解決できる必要がありましたが、これは、hostsファイルへの記載でもOKでした。
Consumer-Producer pattern in Julia

# 概要
Consumer-Producer patternの詳細
https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem

GoF以外のデザインパターンってどこが出典なんですかね。
よくわからんけどみんな知ってますよね。

# 実装
```julia
# Producer
function producer(c::Channel)
    for i in 0:9
        println("produce $i")
        put!(c, i)
    end
end

# Consumer
function consumer(c::Channel)
    # inでtake!しながらイテレートしてくれる。
    for i in c
       println("consume $i")
    end
end

function main()
    BUFFER_SIZE = 2
    c = Channel(BUFFER_SIZE)
    pro_task = @async producer(c)
    # bindすると、bindしたtask終了時にChannelに対してcloseを実行してくれる。
    # Channelはclose後,バッファが空になるまではtake!できる。
    bind(c, pro_task)

    con_task = @async consumer(c)
    wait(pro_task)
    wait(con_task)
end

main()
```

# 実行結果
```
produce 0
produce 1
produce 2
produce 3
consume 0
consume 1
consume 2
consume 3
produce 4
produce 5
produce 6
produce 7
consume 4
consume 5
consume 6
consume 7
produce 8
produce 9
consume 8
consume 9
```

# 感想
Channelがあるから楽だけど、スコープロックみたいなのがないから自分で作ると、pthreadでロック書いてたのと同じ感じになって辛いなと思った。
Rustのクレート開発の始め方

#目的
Rustでクレート（俗に言うライブラリ）の開発をどうやって行えばよいかわからなかったので、やり方を残します。公式文書にはやり方がきっちり書かれていますが、網羅的すぎて情報を探し当てられない場合もあるので、この記事でどこを見るべきかというヒントにでもなればと思います。
#前提
- Rustが正しくインストールされている前提です。
- Cargoでビルド・実行することを前提としています。
- ローカルに保存したクレートを呼び出すことを前提としてます。
- Macで実行する前提です。Linuxでは同じだと思いますがWindowsでは違う可能性があります。

#参照すべき文書
[Rust Tutorial 2.はじめる](https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/getting-started.html)
→後半部分にCargoの基本的な使い方が記載されています。
[Cargo Book(3.1 Specify Dependencies)](https://doc.rust-lang.org/1.31.0/cargo/reference/specifying-dependencies.html)
→Cargoで読み込むクレートの記述方法が記載されています。gitリポジトリを参照する方法とローカル環境でのパス指定の方法がありますが今回はローカル環境を指定します。
#今回使ったクレート
[imageproc](https://github.com/image-rs/imageproc)
というgitリポジトリにあるクレートをローカルに保存して、ビルド時にローカルクレートを呼び出します。ついでにサンプルプログラムも動かします。
#Step1:imageproc をローカルにコピー&ビルド
任意のディレクトリで以下を実行
`git clone https://github.com/image-rs/imageproc`

./imageproc というフォルダができて、gitリポジトリの中身がすべてコピーされています。

./imageproc 内でビルド実行
`cargo build`

**注）ビルドしないと後で読み込みに失敗します**

#Step2:Cargo で新規プロジェクト作成
./imageprocを生成したのと同じディレクトリで以下を実行。
`cargo new test_imageproc --bin`

./test_imageproc というフォルダが自動で生成されてビルドに必要なファイルも自動生成されます。
#Step3:サンプルコードをコピー
以下のコマンドで imageproc 内のサンプルプログラムを test_imageproc にコピーする。main.rs は Hello World が書かれたデフォルトプログラムなので上書きしてOK。
`cp ./imageproc/examples/blend.rs ./test_imageproc/src/main.rs`

#Step4:Cargo.tomlを修正
./test_imageproc/Cargo.tomlを以下のように修正する。

```
[package]
name = "test_imageproc"
version = "0.1.0"
authors = ["someuser"]
edition = "2019"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
image="0.22.3"
imageproc="0.19.2"

[patch.crates-io]
imageproc={path = "../imageproc"}
```

- Step3でコピーしたサンプルプログラムは image、imageproc という二つのクレートを呼び出していますが、今回はimageは正式版をimageprocはローカル版を呼び出します。
- imageproc="0.19.2"が正式リリースされているクレートで、それに対しパッチを作るという考えのもとに[patch.crates-io]でローカルのクレートを上書きするような形で読み込みます。相対パスで記載していますが、絶対パスでもよい。

#Step5:ビルドの実行
./test_imageproc 内で以下を実行
`cargo build`

**注）エラーになる場合はStep1で imageproc をビルドしていない可能性あり**

実行すると [dependencies] に従って必要なクレートが全て読み込まれます。最後の方で以下が出力されれば成功。imageproc がローカルから読み込まれている。

```
> cargo build
...
Compiling image v0.22.3
Compiling imageproc v0.19.2 (/Users/someuser/src/imageproc)
Compiling test_imageproc v0.1.0 (/Users/someuser/src/test_imageproc)
Finished dev [unoptimized + debuginfo] target(s) in 52.78s
```

#Step6:サンプルプログラムのバイナリ実行
ビルドされたバイナリを実行
`./test_imageproc/target/debug/test_imageproc`

gamma_blend.png
naive_blend.png
という二つのファイルが生成されていると思います。

#最後に
この状態でローカルの imageproc を適宜修正すれば自分のクレートが開発できる、ということになります。imageproc を修正してビルド、そして呼び出し側をビルドして実行、で反映されます。修正内容に自信があれば正式版に反映するのもよいでしょう（プルリクエストとかやるのかな）。そのへんの手順は別のサイトを参照してください。
【python】Sinカーブのグラフをかく

#コード#

```python
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2*np.pi, 500)

plt.plot(x,np.sin(x))
plt.show()
```

#図#
![sin.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/17d6f6c6-b909-7796-1c6e-1dcf375f9676.png)

##説明##
##必要なライブラリ##
| ライブラリ       |       用途 |
|:-----------------|:-----------------|
| matplotlib            |グラフを描画するために必要|
|numpy|いろいろな計算をするのに必要|

##x軸の数値##

```python
x = np.linspace(0, 2*np.pi, 500)
```

`np.linspace`は等差数列を生成する関数です.
上記の例では, 0から2$\Pi$ の範囲で500個のnumpy配列を生成しています.

##表示##
```python
plt.plot(x,np.sin(x))
plt.show()
```

`plt.plot(x,y)`で表示したいデータを*x,y*に格納します.
今回は`y=sin x `を計算するために`np.sin(x)`を*y*のところに書いてますね.

#参考#
・[NumPy で数学系の関数を使ってみよう](https://pythondatascience.plavox.info/numpy/%E6%95%B0%E5%AD%A6%E7%B3%BB%E3%81%AE%E9%96%A2%E6%95%B0)
・[線形に等間隔な数列を生成するnumpy.linspace関数の使い方](https://deepage.net/features/numpy-linspace.html)
Pythonで親ディレクトリにあるモジュールをインポートする

Pythonでメインのスクリプトからモジュールをインポートする方法。メインのスクリプトとモジュールのディレトリ上の位置関係で方法が異なるため、それぞれの場合でメインのスクリプト(main.py)からモジュール(submodule.py)をインポートする方法を説明。


# 同じディレクトリにある場合
ディレクトリ構成
　dir0
　├main.py
　└submodule.py

```python:submodule.py
a='さぶもじゆーる'
```


```python:main.py
import submodule

print(submodule.a)
```

```shell:実行結果
dir0> python main.py
さぶもじゆーる
```

# 子ディレクトリにある場合
ディレクトリ構成
　dir0
　├main.py
　└dir1
　　└submodule.py

```python:submodule.py
a='さぶもじゆーる'
```

```python:main.py
import dir1.submodule as submodule

print(submodule.a)
```

```shell:実行結果
dir0> python main.py
さぶもじゆーる
```

# 親ディレクトリにある場合
ディレクトリ構成
　dir0
　├dir1
　│└main.py
　└submodule.py
これがやや面倒。



```python:submodule.py
a='さぶもじゆーる'
```

ダメな例

```python:main.py
import ..submodule as submodule

print(submodule.a)
```

```shell:実行結果
dir1> python main.py
  File ".\main.py", line 1
    import ..submodule
           ^
SyntaxError: invalid syntax
```

正解

```python:main.py
import sys
from pathlib import Path
sys.path.append(str((Path() /'..').absolute()))

import submodule

print(submodule.a)
```

```shell:実行結果
dir1> python main.py
さぶもじゆーる
```

# 参考URL
[Pythonの相対インポートで上位ディレクトリ・サブディレクトリを指定](https://note.nkmk.me/python-relative-import/)
Sqlite3 70万行のレコードInsertで

### 70万行Insertって一瞬じゃない？

2時間経っても終わらないんです。

多分、`列数が250もある`から。sqlite3_prepare_v2は列数に対しての計算量がO（N²）（Nは列の数）となるらしく、ボトルネックとなっているっぽい。それにSQL文のファイルサイズは1.5GBもある。

https://www.sqlite.org/limits.html#max_length

テーブルを分割しようとか正規化しようとか、そういう面倒くさいのは止めたい。初心者だし趣味で使うデータベースだし、SELECTを高速でやりたい(JOINとかしたくない)

というわけで無理やりInsertした（している)経緯をまとめました。

### sqlファイルをInsert、意味不明なエラーに遭遇す

SQLファイルを作成(はじめの日付文字列以外は全部実数値REAL)

```sql
INSERT INTO `TABLE` VALUES 
('2010-01-04 09:01:00',
 2800,2809,2800,2809,12099,12099,
 2800,2809,2795,2800,15726,15726,
 2800,2809,2791,2795,17041,17041,
.....
```
sqlite3のコマンドラインからファイルをInsert 

```
$ sqlite3 ~/prices.db < TABLE.sql
Out of memory
```
はいエラー。

こちらのサイトではパス名に日本語名が混じっているのがダメとのこと
http://blog.6vox.com/2014/04/java-sqlite3-mac-out-of-memory.html

日本語入っていないので関係ない。結局わからずじまい。
解決方法は `最新ソースをコンパイル` でOKでした。
(これまで使ってたのはUbuntu16.4にデフォルトで入ってたSqlite3)

https://www.sqlite.org/download.html
こちらから最新(20191024)の3.30.1.をDL
sqlite-amalgamation-3300100.zip

解凍してからgccでコンパイル

```
$ gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl -o sqlite3 -g3 -DSQLITE_MAX_LENGTH=2147483647
```

行数がえげつないソースファイルが２つだけしかない。好感の持てる造りで助かります。

オプション引数
`-DSQLITE_THREADSAFE=0`
スレッドセーフでアクセスしない。1人で使うので同時アクセスは発生しない前提。もし1に設定するならばMutexでDBをロックしてくれて、複数人同時利用ができるみたい。

https://www.sqlite.org/threadsafe.html

`-DSQLITE_MAX_LENGTH=2147483647`
文字列TEXTかBLOBの長さの最大長。標準では1GB
書いてて思ったけど、これ今回のケースではいらない。

https://www.sqlite.org/limits.html#max_length

他引数
`-ldl` 共有ライブラリをロードする(/usr/local/libのsoファイルなど)
`-o sqlite3` 出力ファイル名
`-g3` gdbでデバッグしたい時のおまじない。

他のオプションを試してみたいならば
https://www.sqlite.org/howtocompile.html
を参照してください。

出来上がった実行ファイルsqlite3で再度Insertを試す

### 厄介なエラー

```sql
$ sqlite3 ~/prices.db < TABLE.sql
Error: string or blob too big 
```

SQL文の文字数オーバーとのこと。調べてみるとデフォルトで1000000文字が上限だったらしい。以外に少ないのね。
https://www.sqlite.org/limits.html#max_sql_length

1つのINSERT文で1.5GBのレコードすべてを入れようとしていたので足りるわけがない。しかもコンパイルオプションとかで対応できないみたい。Configファイルは見当たらない。じゃあ、ここまできたら一貫して泥臭くやりましょう。gdbでエラーとなっている箇所を捜索

sqlite3.c

```c
SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){
...
while( 1 ){
     n = sqlite3GetToken((u8*)zSql, &tokenType);
     mxSqlLen -= n;
     if( mxSqlLen<0 ){
       pParse->rc = SQLITE_TOOBIG;
       break;  // ここで抜けてエラーとなっていた
     }
....
}
```
mxSqlLenを設定している箇所を修正

```c
   mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH];
   ---> mxSqlLen = 2147483647; に変えてみた。
```
SQL文の最大長。ためしに2GBに変更してみた。で実行してみると、ちゃんとInsertできています。が。

### 遅い

そうだろうね！

### あとで気づいたこと

・Insert文が1GBを超えるとsqliteは急激に遅くなった
・Insert文を複数個つかうだけで速くなった(まあ、そうよね...)
Linux でディスク容量が気になったとき

# df ファイルシステムのディスク容量を調べる

-hオプションを指定するとサイズに単位がついて見やすい

```bash
df -h
```

# du 指定のディレクトリ以下のディスク使用容量を戻す

homeディレクトリでディスク使用量が多いものを１０件出す

```bash

du /home | sort -nr | top -10
```
Eclipse+StatET でRの開発環境をつくる

#Eclipse+StatET でRの開発環境をつくる

## OS:Windows10 pro

## Eclipse Download
https://www.eclipse.org/downloads/
現時点では，Eclipse IDE 2019‑09

## StatET　Plugin追加
Menu の Help |  Install New Software...
で↓指定．
https://download.eclipse.org/statet/releases/4.0/E201812

## RのインストールとEclipseの設定は↓に詳細有
https://qiita.com/msano/items/76681979d903edbd1ea4

## 参考：
https://projects.eclipse.org/projects/science.statet


## メモ
新しいNotePCに環境をつくることになったので
Eclipseの新しいVersionで試してみました．
windows 環境構築メモ neovim WSL git 編

# 概要

windowsでvimを使えるようにするめも
vimを使うまでの過程で色々必要になってるのでその記録
windows初心者なので色々調べつつ
ワイはvimを快適に使いたいだけなんや

# 作業

調べる

## 小技

capslockをctrlにするためのソフト

* https://docs.microsoft.com/ja-jp/sysinternals/downloads/ctrl2cap
    * これは必須
    * 謎の設定を書き換えるやり方もあったけど、安心の公式手順なのでこっちでやる
        * http://www.shin-tan.com/swapKey

## windows vim

vimはコマンドプロンプトでやるのが主流？

* https://qiita.com/hayashi-ay/items/0644f262cff619934e10
    * つら

gvimといえばkaoriya

* https://www.kaoriya.net/

neovimつかいたいの

## WSL

噂のwindows subsystem for linux

* http://memories.zal.jp/WP/blog/20170723_2845.html

略してWSL

* https://www.atmarkit.co.jp/ait/articles/1903/18/news031.html

Linux野郎的には一番相性がよさげなので試してみる

### インストール

https://qiita.com/Aruneko/items/c79810b0b015bebf30bb

* ストアでWSLで検索するとディストリの一覧が見れる
    * 2019/10月時点で
        * debian
        * ubuntu
        * centOS7
        * openSUSE
        * Kail
        * Alpine
        * SUSE

このラインナップだとdebian一択

### 起動

メニューに追加されるのでユーザを作成して開始
clearコマンド実行すると不具合なのかカーソルが消える
ついにclearコマンド -> ctrl + l をなじませないといけない時がきた

自分のユーザをsudoersに追加しておしまい。

ほとんど違和感なくbashが使える。

最新のstableが入るらしいので、今だとbuster ( debian 10) がはいる

dockerはいるかな？

### docker

```
$ sudo apt update
$ sudo apt install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     software-properties-common
$ sudo curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
   $(lsb_release -cs) \
   stable"
$ sudo apt update
$ sudo apt install docker-ce
```

systemdが動作してないのでdockerは厳しそう
WLS自体がdockerコンテナに近い感じなのかな。

調べるとwindowsにインストールするやり方はあるらしいけど、vagrantでよくね？って思った

### 感想

windowsじゃできない作業とかやるときにdebian起動して作業するのはいいかも
sshとかはwindowsだとめんどくさいイメージがあるのでそういう時かな？
とりあえず、windowsになれてないうちはたまにお世話になることありそうだけど、開発環境をWSLに全部載せていくのは微妙だなって思った。

## git

git for windowsってのがあるみたいだけどsource tree使うのがいいかなやっぱ
GUIいい感じだし、source treeでの操作がわかんなくてもコマンド操作をsource tree上でできた気がする

https://www.sourcetreeapp.com/

とおもったけどいきなりアカウントを追加できなくてつらい

https://qiita.com/TakuyaHara/items/0424e188f5073aa362a5

はまりにはまって設定できた
パスワードのところにパスワードじゃなくてトークンを入れるところがポイント

## neovim

* 公式に手順が書いてあるので試す

https://github.com/neovim/neovim/wiki/Installing-Neovim#windows

chocolateyとscoopとかいうのを使うやり方がある
ざっと調べた感じscoopのほうがよさそうなのでscoopでやってみる

powershellを開いて以下を実行

```
> Set-ExecutionPolicy RemoteSigned -scope CurrentUser
> iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
```

```
> scoop -h
```

とかするとインストールできてるか確認できる
これでアプリケーションメニューにneovimが登録される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70029/2c533bab-c12b-18fe-41e6-fd03abf24e8f.png)

いい感じ
`:CheckHealth` とかするとなんも設定できてないことがわかる
設定とかどこに置くといいんだろ
windows + neovimの設定は別途