OmniAICreator/Qiita-1.07M huggingface dataset:
NanoPIでHDD/SSDをROOT partitionにする

# 概述

NanoPI有一个NAS套件，很容易安装HDD / SSD（以下简称SSD）。
目前，还没有找到从SSD引导的方法，但是可以通过使根分区成为SSD并且仅在TF中保留/ boot来在不写入TF的情况下进行操作。

# はじめに
NanoPIにはNAS kit が存在し、簡単にHDD/SSD（以下単にSSD)を搭載できます。
現在、SSDから起動する方法は見つかっていませんが、root partitionをSSDにしTFには/bootだけを残すことにより、TFへの書き込みをせず運用することができます。先に[NanoPIでHDD/SSDを活用する](https://qiita.com/maclineto/items/2cea2e8275733e28e505)を発表しましたが、その後の成果をまとめます。
FB [NanoPIの部屋](https://www.facebook.com/groups/131561651024605/)の成果物です。
# Backup
ddrescueでSDをコピーします。

# 設定方法
## fdiskの実行
私は256GBのSSDを使いました。
fdiskで2つのパーティーションに分けました。

```
Device     Boot   Start       End   Sectors   Size Id Type
/dev/sda1          2048   8390655   8388608     4G 82 Linux swap / Solaris
/dev/sda2       8390656 500118191 491727536 234.5G 83 Linux
```

## mkfsとコピー

```
mkdir /a
mkfs -t ext4 /dev/sda2
mount /dev/sda2 /a
mkswap -c /dev/sda1
swapon /dev/sda1
swapoff  /mnt/512MB.swap
rm  /mnt/512MB.swap 
cd /
rsync -av bin etc home lib media mnt opt root run sbin usr var /a

mkdir /a/sys /a/tmp /a/proc /a/dev
umount /a
```

## /etc/fstab の変更

```
/dev/mmcblk0p1  /boot   vfat    defaults 0 0
/dev/sda2       /       ext4    defaults 0 1
/dev/sda1       none    swap    sw       0 0
tmpfs           /tmp    tmpfs   defaults 0 0
```

## /bootの設定
boot.scrを現状に合わせ得る必要があります。
そのためにboot.cmdを編集します。
まずは、backup

```
cd /boot
mv boot.scr boot.scr.bak
cp -p boot.cmd boot.cmd.bak
vi boot.cmd# Recompile with:
# mkimage -C none -A arm -T script -d boot.cmd boot.scr

setenv fsck.repair yes
setenv ramdisk rootfs.cpio.gz
setenv kernel Image

setenv env_addr 0x45000000
setenv kernel_addr 0x46000000
setenv ramdisk_addr 0x47000000
setenv dtb_addr 0x48000000

fatload mmc 0 \${kernel_addr} \${kernel}
fatload mmc 0 \${ramdisk_addr} \${ramdisk}
fatload mmc 0 \${dtb_addr} sun50i-h5-\${board}.dtb
fdt addr \${dtb_addr}

# setup MAC address
fdt set ethernet0 local-mac-address \${mac_node}

\# setup boot_device
fdt set mmc\${boot_mmc} boot_device <1>

setenv fbcon map:0
setenv bootargs earlyprintk root=/dev/sda2 rootfstype=ext4 rw rootwait fsck.repair=\${fsck.repair} panic=10 ${extra} fbcon=\${fbcon}
booti \${kernel_addr} \${ramdisk_addr}:500000 \${dtb_addr}
```

## Compile


```
mkimage -C none -A arm -T script -d boot.cmd boot.scr
```

## 試験のための再起動
reboot
立ち上がってコマンドが実行できれば合格です。

```
df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
udev             231M     0  231M    0% /dev
tmpfs             49M  3.0M   46M    7% /run
/dev/sda2        230G  4.9G  214G    3% /
tmpfs            242M     0  242M    0% /dev/shm
tmpfs            5.0M     0  5.0M    0% /run/lock
tmpfs            242M     0  242M    0% /sys/fs/cgroup
tmpfs            242M   40K  242M    1% /tmp
/dev/mmcblk0p1   100M   17M   83M   17% /boot
tmpfs             49M     0   49M    0% /run/user/0
```

# 不要データーの消去
ここまで来ればssdに移動したsdのデーターは不要です。
mmcblk0p2は使われていません。
消去するなり、もっと小さいTFにコピーしてかまいません。

# 結論
あっさりSSD Machineになりました。

# 訂正
2018年5月4日：竹花 文士さんの指摘による訂正。1行削除、1行修正。
2018年5月24日：　山本 昌治さんの指摘により訂正。リスト化。
2018年7月20日：Katsutoshi Isakaさんからのバグレポートによりsda1, sda2の書き間違いおよびswap fileの処理を修正。
NimのライブラリArraymancer を触ってみます．

# 本日は

Nimにおける多次元配列を扱うライブラリ [Arraymancer](https://github.com/mratsim/Arraymancer) を触ってみました．



# Nimの多次元配列ライブラリはどんなものが？

知ろうとしたきっかけはNimの標準ライブラリで多次元配列を扱う標準ライブラリがないかを探していたことです．[Nim Standard Library - Math libraries](https://nim-lang.org/docs/lib.html#pure-libraries-math-libraries) には basic2d basic3d が紹介されていますが，これらは非推奨とされているようです．実際

https://github.com/nim-lang/basic2d および
https://github.com/nim-lang/basic3d のReadmeでは

> 
basic3d
This module is deprecated and should not be used in newly written software
Use `neo` or `arraymancer` or `glm` packages instead.

となっています．

- neo: https://github.com/unicredit/neo （linalg をfork したものらしい？？？ https://forum.nim-lang.org/t/3000）
- arraymancer: https://github.com/mratsim/Arraymancer
- glm: https://github.com/stavenko/nim-glm


Arraymancer の概要はリポジトリで次のように言及されています．

> Arraymancer is a tensor (N-dimensional array) project in Nim. The main focus is providing a fast and ergonomic CPU, Cuda and OpenCL ndarray library on which to build a scientific computing and in particular a deep learning ecosystem.

> The library is inspired by Numpy and PyTorch. The library provides ergonomics very similar to Numpy, Julia and Matlab but is fully parallel and significantly faster than those libraries. It is also faster than C-based Torch.

Nimで科学技術計算をしたりDeepLearningをしたいというときには重宝しそうです．

# install 

Windowsで動作を確認してみましょう． (Linux, Macでもいけるっしょ)

```
> nimble install arraymancer
```

これだけでOKです．Nim本体のバージョンが 0.17.2 以上を要請するので古いNimを使っている場合はNimのアップグレードをしておきましょう．

余談ですが，Nimの導入・バージョンの更新には choosenim が便利なのでしょうけれども，Windows上で64bitのNimを扱う場合はいろいろとうまくいかない

https://github.com/dom96/choosenim/issues/16

ので手動でインストールしなおします．

# Example 

[show me some code](https://github.com/mratsim/Arraymancer#show-me-some-code) の段落にあるコードを触ってみましょう．

```nim:example.nim

import math, arraymancer, future

const
    x = @[1, 2, 3, 4, 5]
    y = @[1, 2, 3, 4, 5]

var
    vandermonde: seq[seq[int]]
    row: seq[int]

vandermonde = newSeq[seq[int]]()

for i, xx in x:
    row = newSeq[int]()
    vandermonde.add(row)
    for j, yy in y:
        vandermonde[i].add(xx^yy)

let foo = arraymancer.toTensor(vandermonde)
# let foo = vandermonde.toTensor() <- you can write

echo foo
```

これをコンパイルします．

```shell-session

> nim c -d:release example.nim
> example.exe
could not load: blas.dll
```

ヌーン・・・．動かない．Windowsだとだめなのか？？？

# 解決方法

Arraymancer の依存ライブラリの nimblas のReadmeを読んでみましょう．https://github.com/unicredit/nimblas#linking-blas-implementations

`-d` オプションを追加することで解決できました．

```shell-session

> nim c -d:release -d:blas example.nim
> example.exe
Tensor[system.int] of shape [5, 5] of type "int" on backend "Cpu"
|1	1	1	1	1|
|2	4	8	16	32|
|3	9	27	81	243|
|4	16	64	256	1024|
|5	25	125	625	3125|
```

Windowsだとインストールやら動作に苦労しますね・・・．本格的な動作はまた今度です．

# Reference:

- [Nim 0.18.0のリリースまとめ]
(https://qiita.com/2vg/items/0e75b686800d0b27b5e9#%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E5%A4%89%E6%9B%B4%E7%82%B9)
- [Python使いで『今後はデータビジネスの現場かも』って人、NimData/Arraymancerをさわってみておこう。](https://qiita.com/Nimimal/items/3c48d9048a6e9874f06a)
Swift Playgroundsがおもしろい！

妻がiPadで遊んでいたところ、Swift Playgroundsなるものを見つけたらしく、これがどうやらツボにハマった様子。
プログラミングのプの字もわからない妻であったが、可愛らしいキャラクターのおかげか、ゲーム感覚で楽しんでいる。
どれどれ、としばらく様子を見ていたが、これがなかなか面白い。
慣れてきたのか得意げになっていざ実行するとキャラクターがあさっての方向へ進む（大爆笑）
なぜダメなのか、どこまで順調でどこからが失敗なのか、色々考えるのがとにかく楽しいようだ。これがまんまデバッグ作業。
最初らへんはとにかくキャラクターの前進・回転など単純な関数をならべてゴールを目指すだけだが、だんだん複雑になっていく。そしてついに関数を自作してみようとなった段階で、ついこちらも仕事モードになってしまい、DRYやら疎結合やら色々語ってしまう始末（笑）
しかし、Swift Playgroundsはさすがで、自分が小難しく語ったことをいい塩梅に説明していてほんとにわかりやすい。妻も合点がいったようだ。
これからも妻が続けるかわからないが、自分も教えることで改めてプログラミングに対する理解が深まるので勉強になる。ちなみにSwiftの経験は無いが（笑）。
iPadをお持ちの方は是非試してみてほしい。（とくにミスった時の挙動が爆笑必至ww）
Swiftやってみようかな。

Swift Playgrounds
https://www.apple.com/jp/swift/playgrounds/
Amazon S3 Select を使ってS3オブジェクトの特定データを抽出する。

# はじめに
Amazon S3 Select がGAになりました。対象は全てのリージョンです。
ということで試してみました。


# Amazon S3 Select とは
S3バケット内に保存したオブジェクトに対し、SQL文を用いてデータの一部分のみを取り出すことができるサービスです。
アプリケーションが必要なデータのみ取得ができるので、パフォーマンスの向上が期待できます。

![](https://d2908q01vomqb2.cloudfront.net/da4b9237bacccdf19c0760cab7aec4a8359010b0/2017/11/28/s3_select.png)

# 事前準備
まずは利用するためのデータを用意します。
適当にマラソンの大会名、距離、月、場所を記載したCSVデータです。

```text:marathon.csv
marathon,type,m,region
honolulu,full,12,hawaii
shonann,full,12,kanagawa
okayama,full,11,okayama
fukkou,full,10,miyagi
fuji5lake,ultra,4,yamanashi
yokohama,full,10,kanagawa
```

ここではこのcsvファイルを作成し、S3へデータをアップします。

![スクリーンショット 2018-05-02 1.04.07.png](https://qiita-image-store.s3.amazonaws.com/0/82090/28c7ed30-4043-6184-cc6e-336c699b3265.png)


# 実践
先ほどアップロードしたファイルを選択し、「さらに → 次から選択」をクリックします。

![スクリーンショット 2018-05-02 1.04.41.png](https://qiita-image-store.s3.amazonaws.com/0/82090/589a01d9-a106-ce09-54fb-363cc23175ae.png)

次に、S3 Selectの設定画面になるため、今回のデータ内容に合わせます。
今回は、「ファイル形式：CSV、区切り文字：カンマ、ヘッダー行：あり」で設定しています。

<img width="1179" alt="スクリーンショット 2018-05-02 1.05.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/82090/fa0238e3-a6f4-3a7e-b2c3-bb3336e628b6.png">

**[ファイルプレビューの表示]** をクリックすると下部のテキストボックスにcsvファイルの内容が表示されるので、問題なければ**「次へ」**をクリックします。

![スクリーンショット 2018-05-02 1.05.41.png](https://qiita-image-store.s3.amazonaws.com/0/82090/8aa001a2-dfd0-b50b-7c7e-ae09062a1719.png)

すると、SQL式 の SQLエディタを実行する画面が現れるので、そこにSQLを入力して実行します。

![スクリーンショット 2018-05-02 1.06.08.png](https://qiita-image-store.s3.amazonaws.com/0/82090/26c553f9-91ca-fd82-44c1-3d2664122c92.png)

デフォルトだと、

```sql:デフォルトSQL
select * from s3object s limit 5`
```

が入力されています。とりあえずこのまま**「SQL の実行」**をしてみます。

![スクリーンショット 2018-05-02 1.06.15.png](https://qiita-image-store.s3.amazonaws.com/0/82090/70a39add-0c1a-44fc-ec2d-899efbada400.png)

ヘッダー行なしでcsvファイルの内容がそのまま表示されました。
それでは、今度は12月にレースがあるマラソンのみを抽出したいと思います。

「サンプルのSQL式」というところにサンプルとなるSQLがあるのでここのを利用します。

![スクリーンショット 2018-05-02 1.06.29.png](https://qiita-image-store.s3.amazonaws.com/0/82090/f4d74df6-4f60-dfce-2bed-6b395e0cfe53.png)

上の画像のように　**[SQLの追加]**　を行い、SQLの一部を以下のように修正します。

```sql:サンプルSQL
select * from s3object s where s.m = '10'
```

![スクリーンショット 2018-05-02 1.06.52.png](https://qiita-image-store.s3.amazonaws.com/0/82090/dbd74a57-920f-fd19-1ee3-c0b4e208cbb8.png)

あらためて　**[SQLの実行]**　を行うと今度は12月に開催されるマラソンのみが結果に表示されました。

![スクリーンショット 2018-05-02 1.07.03.png](https://qiita-image-store.s3.amazonaws.com/0/82090/0ee6dab1-3263-e766-7249-86836b23bac4.png)

この結果をダウンロードしたい場合は右下の **[ダウンロード]** をクリックすることでtxtファイルとしてダウンロードできます。


# おわりに
思った以上に簡単に使えるので、S3に貯めたログなどから特定の内容を抽出したいときとかにすごく役に立ちそうです。
C#のthrow eは使うな！

# はじめに
C#では、`throw e`で、例外を再スローすると、スタックトレースが上書きされるので、`throw e`は使わないほうが良いです。

# サンプルで説明

```csharp
using System;

namespace csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Method2();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }

        private static void Method2()
        {
            try
            {
                Method1();
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        
        private static void Method1()
        {
            throw new Exception("エラー発生");
        }
    }
}
```

上記を実行すると、コンソールには以下のように出力されます。

```
System.Exception: エラー発生
   at csharp.Program.Method2() in D:\dev\qiita\csharp\Program.cs:line 27
   at csharp.Program.Main(String[] args) in D:\dev\qiita\csharp\Program.cs:line 11
```

発生元（スタックトレースの一番上）が、Method2になっていますね。
実際には、Method1で発生しているのですが、`throw e`のせいで、スタックトレースが上書きされています。

C#で、スタックトレースを上書きされないように再スローするには、以下のようにMethod2を変更すればOKです。

```csharp
        private static void Method2()
        {
            try
            {
                Method1();
            }
            catch
            {
                throw;
            }
        }
```

このように、`throw`だけであれば、以下のようにスタックトレースが上書きされなくなります。

```
System.Exception: エラー発生
   at csharp.Program.Method1() in D:\dev\qiita\csharp\Program.cs:line 33
   at csharp.Program.Method2() in D:\dev\qiita\csharp\Program.cs:line 27
   at csharp.Program.Main(String[] args) in D:\dev\qiita\csharp\Program.cs:line 11
```

# おわりに

私が今まで経験したプロジェクトにおいて、スタックトレースの上書きが必要であったことは、一度もありません。
JavaやJavaScriptでは、同様の記述をしてもスタックトレースは上書きされないので、C#でなぜこのような仕様になっているのか、調査をしても私には分かりませんでした。

もし、C#が`throw e`でスタックトレースを上書きする理由をご存知の方がいらっしゃいましたら、ぜひ、コメントで教えてください！
Java9が入ってたのでjshellを試した。


- 気にしてなかったんですが、eclipseにjava9がはいってました。
- 新しい機能自体はよくわかってないんですが、jshellというのが使えるようになったということで試してみました。

- ```jshell``` コマンドで入って ```/exit``` で抜けます。

```sh
sh-3.2$ pwd
/Applications/Eclipse_4.7.2.app/Contents/java/9/Home/bin
sh-3.2$ ./jshell
|  JShellへようこそ -- バージョン9.0.1
|  概要については、次を入力してください: /help intro

jshell> System.out.println("HELLO WORLD!")
HELLO WORLD!

jshell> List<String> list = new ArrayList<>()
list ==> []

jshell> list.add("HELLO")
$3 ==> true

jshell> list.add("WORLD")
$4 ==> true

jshell> list
list ==> [HELLO, WORLD]

jshell> String.join("-",list)
$6 ==> "HELLO-WORLD"

jshell> /exit
|  終了します
```

## かる〜く使ってみて

- ```import java.util.List```とかいらないんですね。```import java.util.*```くらいは暗黙の宣言なのかな？ 
- 簡単に変数の中身が見えるのはいいかも？

## pidを見てみます。

```sh
sh-3.2$ ./jshell
|  JShellへようこそ -- バージョン9.0.1
|  概要については、次を入力してください: /help intro

jshell> ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
|  エラー:
|  シンボルを見つけられません
|    シンボル:   変数 ManagementFactory
|    場所: クラス
|  ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
|  ^---------------^

jshell> import java.lang.management.ManagementFactory

jshell> ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
$2 ==> "4449"
```

- 一方psでは、下のようになってます。

```sh
sh-3.2$ ps
  PID TTY           TIME CMD
 4448 ttys000    0:08.22 ./jshell
 4449 ttys000    0:00.60 /Applications/Eclipse_4.7.2.app/Contents/java/9/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=localhost:64584 jdk.jshell.execution.R
```
Linuxでproxy環境と非proxy環境のネットワーク設定をスマートに切り替える(terminal)

この記事では学校などの`proxy`環境と家の非`proxy`環境でスマートに設定を切り替える方法を紹介する。
毎回`bashrc`なり`zshrc`などに書かれた`http_proxy`をコメントアウトするのが面倒な人にはおすすめ出来る。

ちなみにMacでは`networksetup`コマンドを用いて上手く切り替えることが出来る。
[Macbookでproxy環境と非proxy環境のネットワーク設定をスマートに切り替えるメモ - Qiita](https://qiita.com/shiraco/items/8971e38cbbd42ea32d73)

上記の記事も参考にしながらやってみる。
Ubuntu 18.04 LTSで実験。

## 使うコマンド

- `nmcli`
- `grep`
- `awk`

install済みでない場合は適宜installを。

## スクリプト

ShellScriptを用いてterminalを起動したときなどに自動で切り替わるようにする。

``` shell:.switch_proxy
#!/bin/sh

proxy=環境にあわせたproxy_address
switch_tori=proxy環境下のssid

function set_proxy() {
    export http_proxy=$proxy
    export https_proxy=$proxy
    export ftp_proxy=$proxy
    export all_proxy=$proxy
    git config --global http.proxy $proxy
    git config --global https.proxy $proxy
    git config --global url."https://".insteadOf git://
}

function unset_proxy() {
    unset http_proxy
    unset https_proxy
    unset ftp_proxy
    unset all_proxy

    git config --global --unset http.proxy
    git config --global --unset https.proxy
    git config --global --unset url."https://".insteadOf
}

function get_ssid() {
    echo `nmcli dev status | grep '接続済み' | awk '{print $4}'`
}

echo `get_ssid`

if [ "`get_ssid`" = "$switch_tori" ]; then
    echo -e "\e[31mSwitch to proxy for school network\e[m"
    set_proxy
else
    echo -e "\e[36mUnset proxy settings\e[m"
    unset_proxy
fi
```

`nmcli dev status`でネットワークデバイスを表示する。
`grep '接続済み'`で接続済みのデバイス行を取得する。(日本語環境想定)
`awk '{print $4}'`でSSIDを取得する。

これを`.switch_proxy`として保存する。(ここではホームディレクトリに保存)
terminalを立ち上げたときに自動で切り替わるようにするには，`bashrc`や`zshrc`に以下を書いておく。

``` shell:.bashrc
source ~/.switch_proxy
```

## 参考

[Macbookでproxy環境と非proxy環境のネットワーク設定をスマートに切り替えるメモ - Qiita](https://qiita.com/shiraco/items/8971e38cbbd42ea32d73)
Android版Boostnote ー 連携したDropbox内にNoteを追加しようとするとクラッシュする

どうもAndroid版はまだ不安定なようです。

既に登録されているIssue内に回避策が書かれています。

`/Dropbox/Apps/boostnote-mobile`をStorageのロケーションに指定するとクラッシュしません。
自分の場合は、BoostnoteでDropbox連携をした際に、`/Dropbox/アプリ/boostnote-mobile`という名称のフォルダが作成され、この名称のままStorageのロケーションに指定してしまっためクラッシュしていたようです。

引用元：
[Boostnote app Crashes when adding note to Dropbox. · Issue #185 · BoostIO/boostnote-mobile · GitHub](https://github.com/BoostIO/boostnote-mobile/issues/185)

 
> You should add "/Dropbox/Apps/boostnote-mobile" as a storage location on your desktop version of Boostnote, before connecting boostnote-mobile with Dropbox. When press the add note button, boostnote-mobile trying to download boostnote.json file from path "/Dropbox/Apps/boostnote-mobile/boostnote.json" and iterate over that javascript object.
boostnote-mobile crash when there's no boostnote.json file on that path, because there's no JSON object to iterate over.
>
Db2 Warehouse on Cloud (旧dashDB) チュートリアル：(3) SQLを実行する

Db2 Warehouse on Cloudを簡単に使ってみるための方法をご案内します。これは第3回目です。

- チュートリアル(1)と(2)についてはこちらをご覧ください

　https://qiita.com/azzeten/items/e993bb3954c2c9a98dab
　https://qiita.com/azzeten/items/c1d5eb7774f9d14953e8


## はじめに (& おことわり)
- 本チュートリアルでご紹介するのは容量が1TBや4TBなどの「Enterprise Edition」のDb2 Warehouse on Cloudが中心の内容です。
- Entryプランの方とは少し画面が違ったり、Entryプランには無い機能となりますのでご注意ください。


## SQLを実行するまで

- Db2 Warehouse on Cloudは、PC等にクライアントソフトをインストールする必要なくすべてがWEBブラウザで完結します。
- 地味に便利で、他のクラウドサービスだとあまり実現していない機能です


### Step1: ウェブブラウザ画面を移動

- SQLを実行するときは、画面左上のアイコンをクリックしてメニューを表示させます
- RUN SQLをクリックします

　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/a24ec930-9dad-41af-e96a-5850be183a2d.png)


### Step2: SQL実行方法を色々試す

- まず、以下のような画面がでることを確認します
- Db2 Warehouse on Cloudでは、自分でSQLを書くことはもちろんですが、簡単なUpdateやInsert文であれば、テンプレートが用意されているので、それを使って、表名を書き換える等だけで使用することが可能です。
- 画面左下あたりの「保存済みのスクリプト」をクリックすると、テンプレートの一覧が表示されます
- たとえば、Template-Select Statementというところのチェックボックスにチェックを入れて、「INSERT」をクリックします
　　　
　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/dc375e21-b524-460f-1c86-b8bf7482ae79.png)


- 画面上半分のエディタ部分に、SELECT文が表示されます。

　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/03a4e9db-69e3-a1bf-e1c3-b3b1c9212a04.png)


- FROMのあとの部分を自分の表名に変更します。

　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/1327afa5-e68a-d7b1-baab-778bdd5dd55d.png)


- 画面上の「実行」をクリックし、その下に出てくる「すべて実行」をクリックします。

　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/836a3015-72b8-efdd-4317-3a1f7b246f42.png)



- 画面右下に結果が表示されることを確認します。
　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/81735b3d-b6e9-4833-145f-0febd99835a4.png)



- ちなみに、虫眼鏡マークの横のこのアイコンをクリックすると、結果として出力された内容をcsvやエクセルシートとしてダウンロード可能です。


　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/aa93de3c-5936-7ff7-8fdf-2333df1eff94.png)


- さらに、実行時間等も確認することが可能です。
- 結果が表示されているのは「結果セット」という右下の画面ですが、その隣にある「ログ」をクリックしてください。
- Run time: xxxxx と表示されています。


　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/e9f3b32c-242c-24d2-3ca3-d1ec57f0a357.png)


### Step3: よく実行するSQLを保存する

- よく使うSQLはいちいちその都度書くのは大変なので、保存して、使いまわすことができます。
- 左上の「スクリプト」をクリックし、「保存」をクリックします

　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/db1fe8f0-7bf0-a7f7-189d-c49757d7a164.png)


- 名前をつけて保存します。スクリプト名に任意の名前を入力し「OK」をクリックします

　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/2f8334bb-1720-d02c-feb9-768e40431a68.png)


- 保存済みのスクリプトという欄に、いま保存したSQLが追加されていることを確認します。
- Step2で紹介したような方法で毎回この保存済みスクリプトを呼び出せば、何度も同じSQLを打ち直さなくても便利です。


　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/0ad0d5f3-87cd-872d-ec11-d8f6d32208b5.png)


### Step4: SQLエディタに細かい設定をする

- スキーマをどうするか？結果を何行まで出力するかなど、細かい設定をしたいときもカスタマイズ可能です
- 画面右上の歯車マークをクリックするとエディター・オプションというのが開かれます。
- 自由にカスタマイズして色々SQL打ってみましょう！

　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/119378/1ae18b69-b256-0ff0-5047-c14794691cfd.png)
Three.jsでCreate.jsの描画結果をテクスチャとして利用する

## はじめに

[公式ドキュメント](https://threejs.org/docs/#manual/introduction/Creating-text)にもある通り、Three.jsでテキストを扱う場合、Canvasを利用するという方法があります。今回はその方法を利用して、Create.jsの描画結果をテクスチャとして利用してみます。

## Canvasでテクスチャを作成する

Three.jsではcanvasエレメントを引数にしてTextureインスタンスを生成できます。そのTextureインスタンスをマテリアルに適用すれば、動的に書き換えができるテクスチャになります。

````js
const _canvas = document.createElement("canvas");
_canvas.width = w;
_canvas.height = h;

const texture: THREE.Texture = new THREE.Texture(_canvas);
texture.minFilter = THREE.LinearFilter;//Textureの解像度をPow2に整形
const material = new THREE.SpriteMaterial({
    map: texture,
    blending: THREE.NormalBlending,
    depthTest: false,
    transparent: true,
});
````

例として、上記のコードでCanvasに紐付けしたSpriteマテリアルができます。Spriteマテリアルは常にカメラ方向を向いてくれるので、ビルボードとして使用できます。

## オフスクリーンCanvasにCreate.jsのstageを紐付けする

このcanvasエレメントにCreate.jsのstageを紐づけることでCreate.jsの描画機能を利用できるテクスチャとなります。

````js
const _stage = new createjs.Stage(_canvas);
````

このstageオブジェクトにchildを追加することでさまざまな描画が行えます。

## テクスチャの更新

テクスチャの書き換えを行った場合、Three.jsに結果を反映させるためには、stageの更新とマテリアルの更新の2段階が必要になります。

````js
_stage.update();
material.map.needsUpdate = true;
````

この処理をThree.jsのrender処理の前に行うことでテクスチャが更新されます。

## パフォーマンス上の問題とその対処

テクスチャの更新処理は比較的重い処理となります。毎フレーム更新を行うと全体のパフォーマンスに悪影響を与えるため、stageの更新を行った場合はflagなどに記録を行い、フラグが立っているフレームのみ更新を行うのが現実的です。

また、オフスクリーンcanvasも、Create.jsのグローバル設定によってはDOMイベントの探索対象となります。明示的にDOMイベントの対象外であることを設定しておくことで、パフォーマンスへの影響を減らせます。

````js
_stage.enableDOMEvents(false);
````
[WIP] Google Apps Script 高速化

編集中ですが、ちょっとでも参考になればと公開します。

-----

Google Apps Script(以下、GAS)を触っています。
GASの対象はSpreadsheetで、複数のSpreadsheetから、複数のシートを参照するような作りになっているためどうしても速度がでません。
ここでは僕が実施した高速化を紹介したいと思います。

## セルをシートから直接参照しない

```js
var sheet = SpreadsheetApp.openById('SPREADSHEET_ID').getSheetByName('SHEET_NAME');
var range = sheet.getRange(ROW, COLUMN);
var value = range.getValue();
```

上記のようにすることでシートから値が取得できます。しかし、複数の値を取得したい時はどうでしょう？

```js
// BAD
var sheet = SpreadsheetApp.openById('SPREADSHEET_ID').getSheetByName('SHEET_NAME');
for(var i = 0; i < 10; i++) {
  for(var j = 0; j < 10; j++) {
    var range = sheet.getRange(i, j);
    var value = range.getValue();
  }
}
```

もちろん上記のように取得することもできます。しかし、 `getRange()` や `getValue()` はGASのAPI呼び出しに相当するため、何度も呼び出すと極端に遅くなってしまいます。
ではどうすればよいのか。次のようにしましょう。

```js
// GOOD
var sheet = SpreadsheetApp.openById('SPREADSHEET_ID').getSheetByName('SHEET_NAME');
var range = sheet.getRange(1, 1, 10, 10);
var values = range.getValues();
for(var i = 0; i < values.length; i++) {
  var row = values[i];
  for(var j = 0; j < row.length; j++) {
    var col = row[j];
  }
}
```

変数 `col` にセルの値が入るようになります。
行数は多くなってしまいますが、GASを高速化する上ではほぼ必須のテクニックだと思います。

## ループ内で無駄なAPI呼び出しをしない

例として、1つのSpreadsheetに `シート1`〜`シート10` のという連続するシートがあったとします。各シートはデータは違うもののフォーマットは同じで、各シートの全ての値が欲しい、という場合を想定します。
以下のようにすると遅くなります。

```js
// BAD
for(var i = 1; i <= 10; i++) {
  var sheet = spreadsheet.getSheetByName('シート' + i);
  var range = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn());
  var values = range.getValues();
  SOME_EXCELLENT_METHOD(values);
}
```

どうすればよいのか。それは `getLastRow()` と `getLastColumn()` の呼び出しを減らせばいいのです。

```js
// GOOD
var row, col;
for(var i = 1; i <= 10; i++) {
  var sheet = spreadsheet.getSheetByName('シート' + i);
  if(!row) {
    row = sheet.getLastRow();
    col = sheet.getLastColumn();
  }
  var range = sheet.getRange(1, 1, row, col);
  var values = range.getValues();
  SOME_EXCELLENT_METHOD(values);
}
```
UnrealEngine4のBindActionにペイロードを乗せる


#BindAction

↓この関数をキーイベントとしてBindActionしたい。引数InPressはPress/Releaseに対応してる。

```hogehoge.cpp
void AHogehoge::MyTrigger( bool InPress );
```

おっ！どうやらstd::function的にペイロードを乗せるやつがあるっぽい！

```InputComponent.h
	template< class DelegateType, class UserClass, typename... VarTypes >
	FInputActionBinding& BindAction( const FName ActionName, const EInputEvent KeyEvent, UserClass* Object, typename DelegateType::template TUObjectMethodDelegate< UserClass >::FMethodPtr Func, VarTypes... Vars )
```

こんな感じかなと。

```hogehoge.cpp
	PlayerInputComponent->BindAction<FInputActionHandlerSignature>("MyTrigger", IE_Pressed, this, &AHogehoge::MyTrigger, true);
```

さてビルド・・・

```outputlog.h
Hogehoge.cpp(111): error C2664: 'FInputActionBinding &UInputComponent::BindAction<FInputActionHandlerSignature,AHogehoge,bool>(const FName,const EInputEvent,UserClass *,void (__cdecl AHogehoge::* )(void),bool)': cannot convert argument 4 from 'void (__cdecl AHogehoge::* )(bool)' to 'void (__cdecl AHogehoge::* )(void)'
```

ビルドエラー
ペイロードとしては扱われていない
うーん謎い

c++ のtemplate "..." はよくわからん

#対策

ワンライナーで書けたらカッコイイけど、自分では解決できなかったのでDelegate::CreateUObjectを使う方法でごまかす。


```
	{
		FInputActionBinding AB( "MyTrigger", IE_Pressed );
		AB.ActionDelegate = FInputActionHandlerSignature::CreateUObject(this, &AHogehoge::MyTrigger, true );
		PlayerInputComponent->AddActionBinding(AB);
	}
	{
		FInputActionBinding AB("MyTrigger", IE_Released);
		AB.ActionDelegate = FInputActionHandlerSignature::CreateUObject(this, &AHogehoge::MyTrigger, false);
		PlayerInputComponent->AddActionBinding(AB);
	}
```

まぁいいか。
BindAction の ... 版の使い方を誰か教えておくれ。


#UE4.18から使えるスマートかつあんまりトリッキーじゃないやつ

```
//マクロでデリゲート用の型を定義して
DECLARE_DELEGATE_OneParam(FMyTriggerDelegate, bool);

//テンプレート実引数で指定する
PlayerInputComponent->BindAction<FMyTriggerDelegate>("MyTrigger", IE_Pressed, this, &AHogehoge::MyTrigger, true);
```

Delegateを直接テンプレート引数に指定してパラメータをペイロードに乗せられます。いいですね！

mvyoshidaさんありがとうございました！！！
ドットインストール を見ながらMarkdown（マークダウン）を触ってみた

はじめまして！

#### ◯背景
Evernote　にメモることに飽きてしまい、
Markdown　触ってみました。

#### ◯環境
OS:　Mac 10.13.4
エディタ：　Atom 1.26.1

#### ◯やったこと
■　ドットインストール
　　　https://dotinstall.com/lessons/basic_markdown_v2
　　　→　Markdown記法入門

- 見出し 
- 引用文  
- 区切り線 
- 文字の強調
- 箇条書き 
- リンク
- 画像

.md 
### ◯サンプルプログラム  (.md)
---

### 見出し表現
```
h1 タイトル
==
```
h1 タイトル
==
```
h2 タイトル
--
```

実行結果
h2 タイトル


### 引用文 について
```
> Hello World  
hello world
```

> Hello World  
hello world

### 区切り線 について
```
---
abcde
---
```
---
abcde
---


### 強調表示
```
__Hello__ **hello**
```

実行結果
__Hello__  　**hello**


### 箇条書き
```
- item1
- item2
- item3
```

実行結果
- item1
- item2
- item3


### 連番付きリスト
```
1. item1
1. item2
1. item3
```
1. item1
1. item2
1. item3

### リンクの表現
```
<http://dotinstall.com>
```
実行結果
<http://dotinstall.com>

```
[dotinstall](http://doinstall.com)

```
実行結果
[dotinstall](http://doinstall.com "this is dotinstall!!")

 
実行結果
```
インライン `abcd` 表現
```
インライン `abcd` 表現


## 画像表示 について
```
![logo image](http://dotinstall.com/img/logo_200x200.png)
```
実行結果
![logo image](http://dotinstall.com/img/logo_200x200.png)


##### マウスカーソル合わせるとテキスト出力
```
![logo image](http://dotinstall.com/img/logo_200x200.png  "dotinstall!")
```
実行結果
![logo image](http://dotinstall.com/img/logo_200x200.png  "dotinstall!")


##### リンク付き
```
[![logo image](http://dotinstall.com/img/logo_200x200.png "google!!!!")](https://google.com)
```
実行結果
[![logo image](http://dotinstall.com/img/logo_200x200.png "google!!!!")](https://google.com)

----
AmazonWebServicesを使ったサーバーレスアプリケーション開発ガイドを読みました

著者の西谷圭介（@Keisuke69）さんから献本いただきましたので書評というか所感を書かせて頂きました。
当初は手を動かしながら読み進めて、全部終わったら記事を書こうと思ってたんですが、タイプミスの多発＆サポートサイトを知らんかったという阿呆な状況でハマリまくってしまいまして、先に読みきってエントリ書く方針に変更しました。

※大概、というか全て大文字小文字の打ち間違いが原因です。サポートサイトからソースを落としてテキスト比較したらすぐ解決するレベルでした。。。
多分ある程度慣れているエンジニアの方ならここまで梃子摺ってないはず。。。

#これを書いてる人のレベル感
- 実装スキル
 - 6年前(2012年)までは業務でjava等のコードを書いていましたが、直近6年間は殆どコードを書いておらず、昨年から自己学習で自分の時間に再びコードを書き始めたレベルです。
 - 業務で辛うじて書いていたのはOracleのPL/SQLやWindowsのバッチ等です。
 - 最近はEC2立てる案件があり、ここぞとばかりにPythonで書いてたりします。
- AWSスキル
 - 業務利用はありますが、EC2,RDS等のモノリシックな利用のみです。
 - LambdaやAPIGateway、DynamoDBなどサーバーレス系は自己学習で使う程度です。
- 総じてレベルの低いSIerと認識していただければ間違いありません。

#全体を通して
- サーバーレスを何となく知っているけど、「じゃあ実際にはどういうサービスをどう構成するの？」というレベルの方に非常に良いです。
 - 各サービスの概要や使いどころなどが書かれていて、サーバーレスなアーキテクチャを理解して実装してみる助けになります。
 - 特に中途半端な知識レベルな場合、ちゃんと補完できて良いです。
 - どうサービスを構成すれば良いかパターンがいくつか載っているので、引き出しが増やせます。
 - 知らないとしょーもないアーキテクチャパターンでしか考えられないので、めっちゃ重要。

- 手を動かしながら学べる為、知識として腹落ちしやすい。
 - コードもとりあえずは写経（書籍のコードを丸写し）で良いので気楽にTryできる。
 - 極論サポートサイトからソースを持ってくれば良いので、簡単にサーバーレスアプリケーションを構築してみることができます。
 - いずれにしてもサポートサイトから正しいソースはダウンロードしておいた方が良いです。
 - 一方何も考えずに写経しちゃうと何も身に付かない･･･。

- 文体は平易で読みやすいです。

#特徴（お気に入りポイント）
- AWSの操作をCLIで進めていく。
 - GUIの方が初心者には簡単で楽なんですが、AWSのGUIはしょっちゅう変わるので、CLIで触ってみれるのはかなり良いポイントです。
- Cognitoをアプリに組み込んでいる
 - 当たり前のようにCognitoを使ってる構成図を良く見ますし、使い倒してる方も多数いらっしゃると思いますが、モノリスばっかりなSIerには使う機会があまりなく、自分でアプリに組み込んでみれるのは非常に良いです。
- Recognitionをアプリで使ってみれる
 - Cognito同様です。
 - ブラウザ上で試してみたことはありましたが、アプリに組み込んで見れたのはGoodでした。
 - ちなみに、執筆時点では東京リージョンで使えなかったようですが、現在は東京リージョンでも仕えます。
- VUEjsでSPAを作ってみることができる
 - SPAって言葉は知っているし、作ってみるべきだと思ってはいるけど、REACTとかAngularとか一杯あってどれが良いのか分からないまま手付かずだったので良い切欠になりました。
 - 本書ではVUEJSの細かい話は記載されていないので、追ってしっかり補完していきたいです。
- X-Rayも気にはなっているけど業務上用途がなかったり、どう試したら良いか分からなかったので、めっちゃ助かります。
- SAMの解説やデプロイプロセスなどの実際の開発時に必要なプロセス周りの内容も記載されています。

- 総じて、業務上使う機会がなかったり、使ってみたいけどどうしたら簡単に試せるのか分からない人にめっちゃ良い！という感想になります。
まさしくそんな状態だったので、ホントに助かりました。
 - ここから提案できるか、はまず社内で戦わないといけないのが憂鬱。

#気を付けること
- ある程度はコードを読める必要があります。
 - コードに関する細かい説明は省略されている部分が多いので、全くのプログラム初心者にはキツイと思います。
- ハマった時は正しいコードと比較すると近道です。（WindowsだとDFとかWinMergeとか）
 - 気をつけていたつもりでも、大文字と小文字を間違えると動かないこともあります。（エンジニアには当然のことですが。。。）
 - デプロイエラー時の調べ方（トラブルシューティング）が掲載されていたらもっと良かったかなぁと思います。（実際の開発ではありそうなので）
- AWSアカウントを初めて作る人は、別途MFAの設定等、セキュリティ周りの作業をすることをお勧めします。

以上です！
sysbenchを使ったMySQL5.6とPXC5.7の性能比較

# 概要
業務でPercona XtraDB Cluster5.7(以下、PXC5.7)を使うことになり、せっかくなのでMySQL5.6環境と性能差を見てみることにしました。
結果に波があったので同じホストの他インスタンスの影響を受けている可能性があります。。参考程度にお願いします。

# 先にまとめ
総じてPXC5.7は優秀でした。

# 検証
## 環境
|バージョン|CPU|MEMORY|
|---|---|---|
|MySQL5.6|1|4GB|
|PXC5.7|1|4GB|

## 前提条件
* mysqlのパラメータは、バージョンや構成等の差分を除き、基本的に揃えています。

## ベンチマークツール
[SysBench](https://github.com/akopytov/sysbench)というをベンチマークツールを使用します。

## Sysbencのインストール方法
```
$ sudo yum install sysbench -y
$ sysbench --version
sysbench 0.4.12
```

## 動作テスト
試しにcpuのパフォーマンステストを実施します。
以下のように出力されればOKです。

```
$ sysbench --test=cpu run
(snip)
Maximum prime number checked in CPU test: 10000


Test execution summary:
    total time:                          13.8662s
    total number of events:              10000
    total time taken by event execution: 13.8598
    per-request statistics:
         min:                                  1.31ms
         avg:                                  1.39ms
         max:                                 18.70ms
         approx.  95 percentile:               1.66ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   13.8598/0.00
```

## トランザクションテスト
### 事前準備
[こちら](http://gihyo.jp/dev/serial/01/mysql-road-construction-news/0026?page=2)の情報を参考にダミーテーブルを作成します。デフォルトだと10000件のダミーデータが作成されます。

### テスト1
以下のコマンドを実行し、データベースのトランザクションテストを実行します。

```
$ sysbench --num-threads=1 --test=oltp --mysql-password=hogehoge --db-driver=mysql run
```
オプションについては、[こちら](https://www.s-style.co.jp/blog/2018/03/1605/) が分かりやすいです。

### テスト1 結果
今回は一部結果のみを抜粋します。PXC5.7の方が倍近い数値を出しました。さすがです。

|項目|MySQL5.6|PXC5.7|
|---|---|---|
|TPS（Transaction per second）|65.98 per sec.|120.80 per sec.|
|read/write requests:|1253.62 per sec.|2295.29 per sec.|
|other operations:|131.96 per sec.|241.61 per sec.|

### テスト2

次に `innodb_buffer_pool_size` のサイズ(今回は512MB)より大きなテストデータを作成して試験します。 `--oltp-table-size` でレコード数を指定します。

```
# テーブル作成コマンド
$ sysbench --test=oltp --mysql-password=hogehoge --db-driver=mysql --oltp-table-size=10000000 prepare

$ sudo mysql
mysql> select table_schema, sum(data_length+index_length) /1024 /1024 as MB from information_schema.tables  group by table_schema order by sum(data_length+index_length) desc;                            +--------------------+---------------+
| table_schema       | MB            |
+--------------------+---------------+
| sbtest             | 2120.65625000 | ※sbtestという約2GBのテーブルが作成されました
```

mysql,PXCを再起動して、`innodb_buffer_pool_size` を開放し、さきほどと同じコマンドでテストします。

```
$ sysbench --num-threads=1 --test=oltp --mysql-password=hogehoge --db-driver=mysql run
```

### テスト2 結果
MySQL5.6に関しては、テスト1の結果と比較すると性能が半分近くに落ちています。
sarで確認したところ、 `iowait`が60%〜70%近く発生したのでディスクI/Oが発生したようです。
PXC5.7は、性能劣化は確認できませんでした。

#### MySQL5.6
|項目|テスト1|テスト2|性能比|
|---|---|---|---|
|TPS（Transaction per second）|65.98|53.89|-18.32%
|read/write requests:|1253.62|1024.00|-18.32%
|other operations:|131.96|107.79|-18.32%


#### PXC5.7
本当か?w

|項目|テスト1|テスト2|性能比|
|---|---|---|---|
|TPS（Transaction per second）|120.80|130.07|7.67%|
|read/write requests:|2295.29|2471.29|7.67%|
|other operations:|250.38|260.14|3.90%|
Linuxのリポジトリにatomの公式のリポジトリが追加できるようになってたのでメモ

言い方が正しいかわかってない程度の知識量だけど、タイトルに書いたことができるのでメモしておきます。
公式の[https://flight-manual.atom.io/getting-startedsections/installing-atom/](https://flight-manual.atom.io/getting-started/sections/installing-atom/)です。

以下、自分が使うubuntuの方法をメモ

```
$ curl -L https://packagecloud.io/AtomEditor/atom/gpgkey | sudo apt-key add -
$ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main" > /etc/apt/sources.list.d/atom.list'
```
で追加

```
$ sudo apt update
$ sudo apt install atom
```

ベータ版もこれで落とせるらしい。

```
$ sudo apt install atom-beta
```
CentOS7.4にApacheインストール

前回の[CentOS7.4の初期設定](https://qiita.com/tak_hos/items/234cff116e63d8880c39 "CentOS7.4の初期設定")からの続き
LAMP環境構築の`A`にあたるApache（Webサーバ）をCentOS7.4にインストール

【構成】
Windows7 Pro(32bit)
VirtualBox 5.2.8
CentOS 7.4.1708

# CentOS7にApache 2.4をインストール

## yumでApacheをインストール

```
# yum -y install httpd
```

## Apache 2.4 初期設定

```bash:/etc/httpd/conf/httpd.conf
# vi /etc/httpd/conf/httpd.conf

#ServerName www.example.com:80
↓
ServerName local.centos74.com:80  ←  サーバ名を指定（適当につけてるので、適宜修正）
<Directory "/var/www/html">
#
# The Options directive is both complicated and important.  Please see
# http://httpd.apache.org/docs-2.0/mod/core.html#options
# for more information.
#
    Options Indexes FollowSymLinks
    ↓
    Options Includes ExecCGI FollowSymLinks  ←  CGIとSSIを許可

#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
#   Options FileInfo AuthConfig Limit
#
    AllowOverride None
    ↓
    AllowOverride All  ←  .htaccessの許可

#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
↓
LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined  ←  414エラーは除外

#
# If you prefer a logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
SetEnvIf Request_URI "default\.ida" no_log  ←  追加
SetEnvIf Request_URI "cmd\.exe" no_log  ←  追加
SetEnvIf Request_URI "root\.exe" no_log  ←  追加
SetEnvIf Request_URI "Admin\.dll" no_log  ←  追加
SetEnvIf Request_URI "NULL\.IDA" no_log  ←  追加
SetEnvIf Remote_Addr 192.168.56 no_log  ←  追加
SetEnvIf Remote_Addr 127.0.0.1 no_log  ←  追加
CustomLog logs/access_log combined env=!no_log  ←  上記以外をアクセスログに出力

#AddHandler cgi-script .cgi
↓
AddHandler cgi-script .cgi .pl  ←  CGIスクリプトに拡張子plを追加

AddDefaultCharset UTF-8
↓
#AddDefaultCharset UTF-8  ←  コメントアウト(文字化け対応)

以下を最終行に追加
TraceEnable off  ←  Traceメソッドを無効化（クロスサイトトレーシング対策）
```

```bash:/etc/httpd/conf.d/autoindex.conf
# vi /etc/httpd/conf.d/autoindex.conf  ←  autoindex設定ファイル編集
<Directory "/usr/share/httpd/icons">
    Options Indexes MultiViews FollowSymlinks
    ↓
    Options MultiViews  ←  iconsディレクトリのファイル一覧を表示しないようにする
    AllowOverride None
    Require all granted
</Directory>
```

```
テストページ削除
# rm -f /etc/httpd/conf.d/welcome.conf
# rm -f /var/www/error/noindex.html
```

## ドキュメントルートのオーナー変更
```
# chown apache. /var/www/html/
```

## Apache起動

```
# systemctl start httpd  ←  Apache起動
# systemctl enable httpd  ←  Apache自動起動設定
# ps -ef | grep httpd  ←  起動確認
```

## Apache起動確認

```
# echo test >> /var/www//html/index.html  ←  テストページ作成
# curl http://127.0.0.1/  ←  HTTP経由で確認（HostPCのブラウザからは、http://IPアドレス/で確認可能）
# rm -f /var/www//html/index.html  ←  テストページ削除
```

次回は、`LAMP`の`M` Mysqlのインストールを行います。
Angular5でService Workerを導入してみた

# 概要
* 新規のアプリケーションに対してService Workerを導入する手順について説明する
* 既存のアプリケーションに導入する場合は、[公式チュートリアル](https://angular.jp/guide/service-worker-getting-started) の「既存のアプリケーションにService Workerを追加する」を参照のこと。

# Service Worker とは
雑に言うと、Service Worker（サービスワーカー）は、Webブラウザで実行され、アプリのキャッシュを管理するスクリプトのこと。

従来のWebアプリに対して、スマートフォンのネイティブアプリの様なユーザー体験（オフラインでも動く、PUSH通知する・・・などなど）をできるようにする仕組み。

Angularは「Angular Service Worker」と称し、特にService Workerを提供することに対して強い責任感とパフォーマンスをコミットしている様子。

# Angular とは
今更ですが、[Angular](https://angular.jp/) とは、JavaScriptで書かれたオープンソースのフロントエンドWebアプリケーションフレームワーク。開発時の使用言語は、JavaScriptも当然使えるが、[TypeScript](https://www.typescriptlang.org/) が推奨とされている。
2019年10月現在の最新バージョンは「Angular6」

似たような並びに「[React.js](https://reactjs.org/)」「[Vue.js](https://jp.vuejs.org/index.html)」などがある。
これらのどれが一番良いかはよく議論の対象になるが、正直「好みの問題」であり、厳密には目的がそれぞれ違うので一概には言えない。

「React.js」はFacebook、「Angular」はGoogleと、大手が開発している謎の安心感がある。「Vue.js」は企業ではなく個人が開発し、人気が増えていったF/W。

## 前提条件
* [Node.js](https://nodejs.org/ja/) がインストールされていること
* angular-cli がインストールされていること
* angular-cli のバージョンが、Angular5が作成可能なバージョン(1.7.x)になっていること（Angular5から Service Worker のサポートが有効になったため）
 * angular-cli のバージョン確認は以下でできる。

```bash
ng -v
```

* 簡易サーバ起動用にnpmのhttp-serverを入れておく（任意）

```bash
npm i -g http-server
```

## プロジェクト作成

* 任意のディレクトリを作成して、その中に移動し、新規アプリプロジェクトを生成

```bash:新規プロジェクト生成
ng new 任意のプロジェクト名 --service-worker --routing=true
```
モジュールのインストール（`npm install`）まで行うため、処理完了までに 3~4分ほどかかる

* オプション
 * `--service-worker`：Service Workerを使うために必要なファイルをアプリケーションに設定
 * `--routing`：ルーティングモジュール付きで生成する場合： `true`（falseの場合は省略可）

## 動作確認
* 作成したディレクトリに移動し、ビルドする

```bash
cd 作成したプロジェクト名
ng build
```

* Webファイルが入っているディレクトリに移動し、簡易Webサーバ起動

```bash
cd dist
http-server -p 8080
```
※ `ng serve` はService Workerと連携しないので、起動テストするためには、別のHTTPサーバーを使用する必要があり、今回はnpmの`http-server`を使用。

* Webプラウザをプライベートモードもしくはシークレットモード等で起動し、`http://localhost:8080` でAngularテストページが表示されたら成功。`Ctrl + C` でサーバ終了。

※ Angular Service Workerをテストする時は、以前の状態が残存していると、Service Workerが読み取ったときに予期しない動作を引き起こし終了する可能性があるため、ブラウザでシークレットウィンドウまたはプライベートウィンドウを使うことが推奨されています。

## 何がキャッシュされているのか？
Webブラウザがアプリをレンダリングするために必要な全てのファイルがキャッシュされていることに注意する。
`src/ngsw-config.json` の設定は、クライアントが使用する特定のリソースをキャッシュするように設定されている。

* `index.html`
* `favicon.ico`
* ビルド成果物（JSおよびCSSバンドル）
* `assets` の下にあるもの


とりあえず以上。（また追記するかもしれません）
VeeValidateでパスワードの確認欄にバリデーションをかけるとき

VeeValidateでフォームの入力項目にバリデーションを掛けていた際、次の問題に遭遇しました。

# 問題

・各入力欄からフォーカスが外れたタイミングでエラーを出したい
・しかしパスワード入力欄からフォーカスを外すと、パスワード確認欄にまでエラーが出てしまう

　→ 確認欄のエラーは、確認欄からフォーカスが外れたタイミングで出したい

↓こんな感じです。
[![Edit password confirm](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/8z47r0pm88)

解決策のひとつとして、```confirmed:'passwordConf'```をパスワード入力欄側に指定する方法もありますが、その場合「パスワードが一致しません」エラーはパスワード入力欄側に表示されます。
入力順序的には確認欄側に出てほしかったので、別の方法を模索しました。

# 対応

ググりながら修正した結果がこちらになります。

[![Edit password confirm 2](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/8lk9jwr8j0)

一度フォーカスが外れたタイミングで```isConfirmed```をtrueにしています。
これにより、入力欄からフォーカスが外れたタイミングではエラーは表示されず、確認欄から外した時点でエラーが表示されるようになりました。
heroku、local環境での環境変数の設定方法

# この記事の目的

herokuとlocal環境でそれぞれ環境変数をどう管理したら良さそうかまとめた。セキュリティのことも少し考えて外部に見えないようにファイルには記述したくないと言うのが前提

# heroku

https://qiita.com/colorrabbit/items/18db3c97734f32ebdfde

configを開いて操作。上記の記事が詳しい。

# local環境

https://github.com/bkeepers/dotenv/

dotenvを使って環境変数を設定する。

## localの変数確認方法

dotenvの場合、.envファイルに変数は記述されている。
ログイン時に"Configured directory for incoming files does not exists"というメッセージが出る

# 環境

* Xubuntu 18.04 LST

# 背景
以下のコマンドを実行して、Homeディレクトリ配下の、「デスクトップ」、「ダウンロード」ディレクトリなどのユーザディレクトリを英語名にしました。

```shell-session
$ LANG=C xdg-user-dirs-update --force
```


# 問題
ログイン時に、以下のダイアログが表示されてしまいます。

```plaintext
Configured directory for incoming files does not exist
Please make sure that directory "/home/yuji/ダウンロード" exists or configure it with blueman-services
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/37903/24496121-94de-608c-b392-57b377514c3c.png)

# 解決

下記のコマンドを実行して、Bluetooth Managerの設定を変更しました。

```shell-session
$ gsettings set org.blueman.transfer shared-path '/home/yuji/Downloads/'
```

「Bluetoothマネージャ→表示メニュ→ローカルサービス→転送」で、正しく変更されたことを確認できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/37903/c8613eec-fa52-d1dc-fffc-ea499b8acac2.png)

再度ログインすると、「Configured directory ...」のダイアログは表示されなくなりました。



# 参考サイト
* [Ubuntu Mate 16.04 でフォルダ名を英語化したら Blueman のパスも修正する](https://rseiub.com/ubuntu-mate-folder-blueman-error)

* [Raspberry Pi3にUbuntu Mate16.04を入れてフォルダを英語表記にしたらBluemanでエラーがでる。](https://ja.stackoverflow.com/questions/24505/raspberry-pi3%E3%81%ABubuntu-mate16-04%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E8%8B%B1%E8%AA%9E%E8%A1%A8%E8%A8%98%E3%81%AB%E3%81%97%E3%81%9F%E3%82%89blueman%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E3%81%A7%E3%82%8B)


* [Blumanがダウンロードディレクトリがないと言ってくる現象の解決法](http://hatoka.blog.fc2.com/blog-entry-7.html)
iReportをWindows10に導入する

#1.はじめに
PDF作成ツール「iReport」
サポートは既に終了しましたが、保守などで使用することがあると思います。
そこで、windows10に導入する手順をまとめました。

#2.jdk1.7インストール

iReportはjdk1.8に対応していません。

[必要事項](https://community.jaspersoft.com/wiki/getting-started-ireport-designer#Windows_Binary_Installation)を見ると、
>
System Requirements
For current requirements, please check the iReport documentation and release notes. It is recommended that you run iReport with JDK v1.5 or v1.6. Note that for Windows Vista users, it is recommended that you run JDK v1.6.

(jdk1.5または1.6が必要)と記述されています。*jdk1.7でも動作確認済み
まずは、jdk1.7をインストールして下さい。

参考
https://qiita.com/takayuki206/items/d56f144b9071a1942a1c


#3.iReport(zip)のダウンロード

[ここ](https://sourceforge.net/projects/ireport/files/iReport/iReport-5.6.0/)よりzipファイルをダウンロードして下さい。

![FireShot Screen Capture #971 - 'iReport-Designer for JasperReports - Browse _iReport__' - sourceforge_net_projects_ireport_files_iReport_iReport-5_6_0.png](https://qiita-image-store.s3.amazonaws.com/0/254505/3660acf4-0cbe-ae75-9e16-362dcf3284d3.png)

#confファイル修正

zipを解凍すると下記のフォルダ構成になっていると思います。
![file.png](https://qiita-image-store.s3.amazonaws.com/0/254505/bce6ba8b-9e50-4ae1-cdd8-2484e1779dc5.png)

etcにある`ireport.conf`を編集して、jdk1.7のパスを設定します。

```php
#jdkhome="/path/to/jdk"

jdkhome="C:\Program Files\Java\jdk1.7.0_80" ←修正
```

#iReportの起動
binにある`ireport.exe`を実行。
![file2.png](https://qiita-image-store.s3.amazonaws.com/0/254505/ec9d77f9-47c2-46ee-fae7-a01c9e42d77d.png)
**↓↓↓**

![ireport.PNG](https://qiita-image-store.s3.amazonaws.com/0/254505/fc20558b-e41a-4840-c0d2-ba06babc29f2.png)


無事起動できたら終了です。
お疲れ様でした(^^)
Windows10 April 2018 Update(1803)に更新すると、平成31年5月以降の和暦表示が??になる

## 現象
2019年5月1日以降の日付を和暦表示すると、元号部分が？？になる。

|Windows10 バージョン  |日付|
|---|---|
|1709以前  |2019年(平成31年)5月1日  |
|1803   |2019年(？？1年)5月1日  |

## 対処法
自端末のみで解消させるのであればレジストリ書き換えor削除で対処可能。
`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras`

※レジストリの書き換えは自己責任でお願いします。
Unity Package Managerについて

# Unity Package Managerとは

Unity 2018から搭載される予定のパッケージマネージャー。
例えばUnity IAPとかを導入したり、バージョン管理するのを簡単にできる。
多分見たほうが早いので、こんな感じ。
Window -> Package Managerで開ける。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/97014/14238eb3-7413-adc2-3a18-adf33501e2f2.png)

まあ、普通にパッケージマネージャーですね。便利。

# 仕組み

Unity 2018でプロジェクトを作ると、 `{プロジェクト名}/Package/manifest.json` というそれっぽいファイルがある。
試しにAsset Bundle BrowserをPackage Managerからインストールした後に内容を確認してみる。

```manifest.json
{
  "dependencies": {
    "com.unity.assetbundlebrowser": "1.5.0"
  }
}
```

プロジェクトが依存するパッケージがここに記されるような感じ。
RubyGemsにおけるGemfile、PHPのComposerにおけるcomposer.json、node.jsのnpmにおけるmanifest.jsonですね。
というか、npmと一緒な雰囲気ですね。多分内部でnpmが走ってます。

DLされたパッケージの実体は、Macでは `~/Library/Unity/cache/npm/packages.unity.com/*` にあります。（npm！）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/97014/0a41e08d-3524-5665-8cb9-81331717e75b.png)

パッケージが展開されたものは `~/Library/Unity/cache/packages/packages.unity.com/*` にあります。ソースが見たい場合はこっち。

つまり、パッケージは常にグローバルな場所にインストールされます。プロジェクトのディレクトリ内にはmanifest.jsonしかありません。
（わざわざPackageというディレクトリを用意しているのを見ると、プロジェクトディレクトリ以下にインストールするオプションもそのうち用意されそうな予感）

プロジェクトを開いた時にmanifest.jsonに書かれたパッケージが自身のマシンにインストールされていない場合、自動的にインストールされます。
そのため、外部（Githubなど）から持ってきたプロジェクトでも自動的にパッケージの依存関係が解決されインストールされるようになっています。

ちなみに、プロジェクトを開いた状態でmanifest.jsonを直接編集して保存すると、勝手に再読込してパッケージをインストールしてくれます。

# 自作パッケージを配布したい場合

多分そのうち自作パッケージが配布できるようになりそうな感じなので、パッケージの作り方について。
このあたりを読めば良さそう。
https://docs.unity3d.com/Packages/com.unity.package-manager-ui@1.8/manual/index.html#PackManManifestsPackage

# まとめ

- Unity 2018からパッケージマネージャーが搭載される
- manifest.jsonに依存関係が記述される
- プロジェクト起動時に自動的にmanifest.jsonを読み込み、依存するパッケージをインストールしてくれる
- manifest.jsonを直接編集すると、自動的に再読込してパッケージをインストールしてくれる
- パッケージは `~/Library/Unity/cache/npm/packages.unity.com/*` にインストールされる
- パッケージの中身は `~/Library/Unity/cache/packages/packages.unity.com/*` に展開される
laravel5.6でjQueryを使おうとすると、Uncaught ReferenceError: $ is not definedが出る時の対処方法

追記:
コンメトで正攻法の解決方法をアドバイスいただきました。
当記事はやっつけの解決策なので、みんなはマネしちゃダメだぞ☆

-----

`laravel5.6` をインストールして `jQuery` を使おうとしたら、`jquery.js` を読み込んでいるはずなのに使えなくてハマったのでメモ。

## 状況

`laravel5.6` を普通にインストールして、
`$ npm install`
`$ npm run dev`
した状態からスタート。

デフォルトで `jQuery` が読み込まれているようなので、
`blade.php` ファイルに `jQuery` のコードを書いたらエラーが発生して動かない。

```javascript:javascript
$(function(){
  // ここにプログラムを記述
});
```

これだけなのに、以下のエラー。

```console:jsエラー
Uncaught ReferenceError: $ is not defined
```

どうやら `jQuery` が読み込まれていないというエラーのよう。

## 原因

あまり詳しくはないけど、どうやら `laravel5.6` では（5.5あたりから？） `vue` がデフォルトになっているようなので、もしかしたら `jQuery` なんかも `vue` 方式で書かないと行けないのかもしれない。

そんな急に `vue` を覚えろと言われても、すぐに実用レベルで使えるかどうかもわからないので、まずは旧来の書き方で良いから動かしたい。（そんなんだから二流プログラマーなんだよと言われそうだけど）

調べていたら、こいつが怪しい。

```php:layouts/app.blade.php
    <!-- Scripts -->
    <script src="{{ asset('js/app.js') }}" defer></script>
```

`defer` ってなんだ？

> &lt;script&gt; タグに async / defer を付けた場合のタイミング
> https://qiita.com/phanect/items/82c85ea4b8f9c373d684

どうやら、 `defer` を付けると処理の実行を遅延させることができるらしい。

つまり、blade内に `jQuery` のプログラムを書いても、元になる `jquery.js` が遅延されて後から実行されるので、 `jquery.js` が読み込まれていないというエラーが発生しているようだ。

## 結論

とりあえず、 `jQuery` をベタに書いて動かしたいなら、 `defer` を削除すれば動く。

```diff:app.blade.php
- <script src="{{ asset('js/app.js') }}" defer></script>
+ <script src="{{ asset('js/app.js') }}"></script>
```


最初に書いた `vue` は関係ありそうな気がしたけど関係なさそう。
でも今回は使わないので、 `assets/js/app.js` から `vue` 関連のところは消してコンパイルしておきました。

`app.js` に重い処理などを書くようになると、 `defer` を外した影響が出てくる可能性があるので、ちゃんと良い書き方覚えないとと思いながら、今日も妥協のコーディング。
MyBatisでマッパーxmlの記載方法

以下のようなTestMapper.xml、TestMapper.javaが存在します。

```xml:TestMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="common.mappers.TestMapper">
    <resultMap id="ResultTest" type="common.entities.Test">
        <id column="id" jdbcType="INTEGER" property="id" />
        <result column="name" jdbcType="VARCHAR" property="name" />
        <result column="flg" jdbcType="INTEGER" property="flg" />
    </resultMap>

    <select id="selectByTest" parameterType="Test" resultMap="ResultTest">
        select *
        from test
    </select>
</mapper>
```

```Java:TestMapper.java
package common.mappers;
import ccommon.entities.Test;
public interface TestMapper {
    List<Test> selectByTest();
}
```

その後、javaクラス(Interceptorクラス)で使用する際にListで使用したい場合は上記のような記述で問題ないでしょうか？
また、全件検索なのですが、上のような書き方のListで問題ないでしょうか？

ご教示いただける方がいましたらお願いいたします。
Flutterでアプリの向きを固定する方法とFlutterでの実装をみてみる

##実装内容

縦で固定したい場合はコードは以下の通りになります。

```dart
import 'package:flutter/services.dart';

void main() {
  SystemChrome.setPreferredOrientations(
      [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);

  runApp(new MyApp());
}
```

1. `flutter/services.dart`を忘れずにインポート
2. SystemChrome.setPreferredOrientationsメソッドに固定したい画面の向きを引き渡します
3. DeviceOrientationはenumで`landscapeLeft`、`landscapeRight`、`portraitDown`、`portraitUp`が定義されています ※詳細は[DeviceOrientation enum - services library - Dart API](https://docs.flutter.io/flutter/services/DeviceOrientation-class.html)
4. 今回の場合は縦で固定したいので`portraitUp`と`portraitDown`を引き渡しています

実装方法については以上です。

##補足
内部実装について少し触れていきます。

`SystemChrome.setPreferredOrientations`の実装は

```dart
static Future<Null> setPreferredOrientations(List<DeviceOrientation> orientations) async {
  await SystemChannels.platform.invokeMethod(
    'SystemChrome.setPreferredOrientations',
    _stringify(orientations),
  );
}
```

となっており、`SystemChrome.setPreferredOrientations`を呼び出しています。

実際に内部で何をやっているかは[engine/PlatformPlugin.java at master · flutter/engine](https://github.com/flutter/engine/blob/master/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java)とか見ればわかると思います。Androidで言えば、DeviceOrientationの値ごとに愚直に`mActivity.setRequestedOrientation`しているようです。

iOSの場合は、[engine/FlutterPlatformPlugin.mm· flutter/engine](https://github.com/flutter/engine/blob/ba98f2634b230f6ce006f8513902c3ad0bd8a6d6/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.mm)を見ればわかります。こちらもDeviceOrientationの値ごとにあわせて`UIInterfaceOrientationMaskPortrait`などをpostNotificationNameで指定しています。

上記両コードともに`Copyright 2016 The Chromium Authors. All rights reserved.`って書いてあるのも興味深かったです。