OmniAICreator/Qiita-1.07M huggingface dataset:
ILI9341を使ってみた

ILIのSPIな液晶を試してみたくなり、中国発送の安いモジュールを入手して試してみました。端子は以下のような並びでした。

|Pin|Connect|
|:--|:--|
|1|VCC|
|2|GND|
|3|CS|
|4|RESET|
|5|DC/RS|
|6|SDI|
|7|SCK|
|8|LCD|
|9|SDO|

こちらのページが非常に参考になりました。

https://qiita.com/toyoshim/items/84c026e97f6be200cb19

```ruby
RST = 21
RS = 17

W = 240
H = 320

CMD_SLEEP_OUT = 0x11
CMD_DISPLAY_ON = 0x29
CMD_COLUMN_ADDRESS_SET = 0x2a
CMD_PAGE_ADDRESS_SET = 0x2b
CMD_MEMORY_WRITE = 0x2c
CMD_MEMORY_ACCESS_CONTROL = 0x36
CMD_COLMOD = 0x3a

MAC_PORTRAIT = 0xe8
MAC_LANDSCAPE = 0x48
COLMOD_16BIT = 0x55
COLMOD_18BIT = 0x66

MAC_CONFIG = MAC_LANDSCAPE

def write_command(tft, c)
  tft.gpio_set(RS, 0)
  arr = tft.transfer([c], 0)
end

def write_data(tft, c)
  tft.gpio_set(RS, 1)
  arr = tft.transfer([c], 0)
end

def write_data16(tft, c)
  tft.gpio_set(RS, 1)
  arr = tft.transfer([c >> 8, c & 0xff], 0)
end

def set_update_rect(tft, sx, ex, sy, ey)
  write_command(tft, CMD_COLUMN_ADDRESS_SET)
  write_data16(tft, sx)
  write_data16(tft, ex)
  write_command(tft, CMD_PAGE_ADDRESS_SET)
  write_data16(tft, sy)
  write_data16(tft, ey)
  write_command(tft, CMD_MEMORY_WRITE)
end

def setup(tft)
  tft.setreset(RST)
  tft.setrs(RS)
  
  tft.gpio_setflags(RST, BsdTft::OUTPUT)
  tft.gpio_setflags(RS, BsdTft::OUTPUT)

  lcd_init(tft)
end
  
def lcd_init(tft)
  tft.gpio_set(RST, 0)
  tft.gpio_set(RST, 1)
  
  write_command(tft, CMD_MEMORY_ACCESS_CONTROL)
  write_data(tft, MAC_CONFIG)
  
  write_command(tft, CMD_COLMOD)
  write_data(tft, COLMOD_16BIT)

  write_command(tft, CMD_SLEEP_OUT)
  usleep(60*1000)
  write_command(tft, CMD_DISPLAY_ON)
end

def rgb565_conv(r, g, b)
  rr = (r >> 3) << 11
  gg = (g >> 2) << 5
  bb = (b >> 3)
  return rr | gg | bb
end

def OldlcdCopy(tft, c)
  for i in 1..320 do
    rgba = c.getpix(0, i - 1, 240)
    for n in 1..240 do
      color = rgb565_conv(rgba[0 + (n - 1) * 4], rgba[1 + (n - 1) * 4],
        rgba[2 + (n - 1) * 4])
      write_data16(tft, color)
    end
  end
end

  
tft = BsdTft.new(1, 0, BsdTft::S6D0151)

setup(tft)

c = Cairo.new(W, H)

c.set_source_rgb(1, 0, 0)
c.move_to(0, 0)
c.line_to(100, 100)
c.stroke();

set_update_rect(tft, 0, W, 0, H);

OldlcdCopy(tft, c)
```

こんな感じに表示されました。

![写真（2019-05-22 15.36） #2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/c187024b-4df9-a5db-5668-82a104036367.jpeg)

とりあえずBsdTft::S6D0151で初期化してますが、mruby-bsdtftに実装を追加していきたいと思います。

この液晶は240x320で128x160な液晶の3.75倍のデータ量があります。その分画面全体の再描画が遅くなります。

![LCD_SIZE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/212a11d8-23c5-9b20-9428-f8f7a221b4bc.png)


原因はわからないのですが、今のところレジスタのリードはできてません。

パラレルなILI9325は初期化がいろいろ必要でしたが、こちらはかなり少なくなっています。発売時期の違いなのでしょうか？追記：上記の簡単な初期化でも表示できますが、ケースによっては不安定な事もあるようです。やはりいろいろ初期化は必要なようで、mruby-bsdtftでは変更してあります。
Windows の GetCommandLineA で UTF-8 は来るのかどうか

結論的には、来ません(でした)。

↓ `Unicode 対応ではないプログラムの言語 (システムロケール)` 英語表示だと `Language for non-Unicode programs (System Locale)` の選択に依存すると確信いたします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/beb6c7a3-3905-6ff4-c83e-851c0255472c.png)

参考: [情報: システムのロケールとユーザー ロケールの違い
](https://support.microsoft.com/ja-jp/help/246007/info-the-difference-between-the-system-locale-and-the-user-locale)

> The system locale determines which code pages (ANSI, MS-DOS, and Macintosh) are used on the system by default. Changing the system locale also installs the necessary bitmap font files to support applications in the language you selected. This is a per-system setting, and requires that you restart your computer (reboot) to change the setting. You can select a system locale only if the appropriate language group is installed; for example, you can't change the system locale to Chinese if your operating system is English Windows NT with no Chinese support.

## 検証方法

DumpCmdline のソースコード https://github.com/HiraokaHyperTools/DumpCmdline

Windows 10 Pro (x64) バージョン 1809 日本語版

コマンドライン

```
DumpCmdline.exe 123あいうえお🍷
```

| 文字 | GetCommandLineA<br />Shift_JIS | GetCommandLineW<br />UTF-16 |
|:-:|:-:|:-:|
| 1 | 31 | 0031 |
| 2 | 32 | 0032 |
| 3 | 31 | 0033 |
| あ | 82 A0 | 3042 |
| い | 82 A2 | 3044 |
| う | 82 A4 | 3046 |
| え | 82 A6 | 3048 |
| お | 82 A8 | 304A |
| 🍷 | 3F 3F | D83C DF77 |

### Windows コマンドプロンプトにて

コードページ 932 (ANSI/OEM - 日本語 Shift-JIS) で

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/eb8a05d4-eaac-4da0-5558-09073778c28a.png)

コードページ 437 (OEM - 米国) で

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/d56964ee-47e0-1582-f866-e483794720f5.png)

### MinGW 2.6.0 bash にて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/687a77e4-1fe3-df05-ece4-c24860973d1f.png)

### Cygwin 3.0.4 bash にて

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/5ba2e2b7-3ecf-0414-31aa-5c58d69e6842.png)
CentOS7のrootパスワードを強制変更

#さぼってました！
就職活動などで忙しく、また授業で使わなくなってからまとめるのさぼってました
申し訳ありません(;´Д｀)
**反省してますが後悔はしていません！←**

#ではでは本題へ・・・そのまえに
このブログには授業で習ったことや自分で勉強したことをまとめて記事にしています
今回は友人がrootパスワードを忘れてしまったので、rootパスワードの強制変更を行ったので
忘れないようにこちらに書き止めておきます。

#開発環境

・Centos7
・windows 10 64bit
※Centos7はVitualBoxで動かしています

#手順
・スタート画面で「e」を押す
・内容を書き換える
・passwdで強制変更

###スタート画面で「e」を押す
![pas1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249281/06c0e6bf-3498-cbb0-38bc-5d2b5b052630.png)

まず、スタート画面でキーボードのeを押します
###内容を書き換える
![pas2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249281/e4f1bb55-5994-ced7-aaa6-5519a12f6f41.png)
すると、このような画面になりますので、下のほうまで行ってもらうと
**`rhgb quiet LANG=jp_JP.UTF-8`**
という文字列があるので**赤く囲んでいる場所のみ**を削除してください
次にパスワードを変更できるように追記を行います
![pas3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249281/fc72d3a9-830a-1f69-cb12-944c6bda66b5.png)
**`rw init=/bin/sh`**
をquietの後ろに追記してください、追記が完了しましたらCtrl+xで起動してください
**※キーボードの仕様が変わっているので、「＝」は「＾」で入力にできます**
###passwdで強制変更
さて、邪魔するものは何もないので権限無視で**passwd**と入力してください
![pas4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249281/8d041479-431a-1a44-36c5-5c8d4e82b0be.png)
**`passwd: all authentication tokens updated successfully`**
と出れば書き換え完了です。
SELinuxの設定確認を行います。
`cat /etc/selinux/config`で内容を確認します。
`SELINUX=enforcing`と記載されていましたらOKです。
![pas5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249281/47fff29f-5727-50aa-cb9f-05c74127c493.png)
では最後に`touch /.autorelabel`を実施しておき
`exec /sbin/init`で再起動しましたら完了です

#まとめ
今回は調べて実施してみて成功したものなので、自分用のメモのようなものになりました
もしほかの方の役に立ちましたら幸いです(/・ω・)/
それではまたいつか！
二項ツリーモデルをmatplotlibでアニメーション化する

matplotlibのanimationを用いた記事が意外に少なかったので，自分で作ったものを共有したいと思って書きました．

# 二項ツリー
二項ツリーモデルは上昇確率$p$と下降確率$1-p$の二項分布を用いた不確実性を記述するモデルである．今回は，二項分布から得られた値をモンテカルロ・シミュレーションにより発生させ，そのパスで記述していく．

# matplotlibでアニメーション
参考文献: matplotlibでアニメーションを作る
https://qiita.com/yubais/items/c95ba9ff1b23dd33fde2

## ArtistAnimation
あらかじめグラフの配列を用意することで，intervalごとに1つずつデータを取り出し，アニメーション化してくれる．

## FuncAnimation
データを動的に変化させる必要がある．データが大きい場合にはデータを全て保持しないため，メモリ効率が良い．


# プログラムコード
### インポート
```python
import math
from numpy import *
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import pylab
```

### 描画の設定
特に%matplotlib nbaggを加えることで，Jupyter上でインタラクティブな画像表示が可能になります．

``` python
N = 100   # 描画個数

%matplotlib nbagg
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim(0, 100)    # x軸の範囲
ax.set_ylim(-30, 30)   # y軸の範囲
ax.set_xlabel('x')     # x軸ラベル
ax.set_ylabel('y')     # y軸ラベル
ax.grid()   # gridを描画する
```

### 描画するリストを準備
```python
line = []   # 描画するグラフを格納する
for j in range(N):
    line.append(ax.plot([], [])[0])

x_list = []
y_list = []
```

### データの生成
$x, y$の逐次返す関数を指定します．
FuncAnimationの第3引数に指定します．

```python
def gen():
    y = [0 for i in range(N)]
    for x in np.linspace(0, 100, 100): # [start, end, 間隔]
        for i in range(N):
            y[i] += np.random.choice([-1,1]) 
        yield x, y
```

### コールバック関数
FuncAnimationの第2引数に指定する関数です．
gen関数から受け取ったデータを描画するline配列に格納します．

```python
def func(data):   # コールバック関数
    x, y = data
    x_list.append(x)
    
    for i in range(N):
        y_list.append(y[i])
        line[i].set_data(x_list, [y_list[j] for j in range(i, len(y_list), N)])
```


### アニメーション関数を定義

```python
ani = animation.FuncAnimation(fig,
        func, gen, blit=False, interval=100, repeat=False)
```


# 最終的なプログラム

```python
import math
from numpy import *
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import pylab

N = 30   # 描画工数

%matplotlib nbagg
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_ylim(-30, 30)
ax.set_xlim(0, 100)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.grid()

line = []   # 描画するグラフ
for j in range(N):
    line.append(ax.plot([], [])[0])

x_list = []
y_list = []

def gen():
    y = [0 for i in range(N)]
    for x in np.linspace(0, 100, 100): # [start, end, 間隔]
        for i in range(N):
            y[i] += np.random.choice([-1,1])   # -1か1を選択
        yield x, y

def func(data):   # コールバック関数
    x, y = data
    x_list.append(x)
    
    for i in range(N):
        y_list.append(y[i])
        line[i].set_data(x_list, [y_list[j] for j in range(i, len(y_list), N)])

ani = animation.FuncAnimation(fig,
        func, gen, blit=False, interval=100, repeat=False)
```

二項ツリーのシミュレーションをすることができました．
![anim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290596/9ed84a98-7322-959b-f1e4-008f93940a6d.gif)


# 参考文献
matplotlibでアニメーションを作る
https://qiita.com/yubais/items/c95ba9ff1b23dd33fde2
Jupyter上でmatplotlibのアニメーションを再生する
https://qiita.com/Tatejimaru137/items/6083e2e3a4e618da6274
Laravelでヘルパー乱用をしてグローバル汚染するのを避ける提案

# Laravelでviewのロジックを切り出したいときにhelperは便利

以下のように定義してしまえば、どこからでも呼び出せる
viewロジックをまとめられた！！

となるが、`どこからでも呼び出せてしまう`という問題も同時におきている。

```php

if (!function_exists('normalizeAge')) {
  /**
   * 年齢から 10代前半 の表記に丸めた文字列を返す
   * @param int $age 年齢
   * @return string 10代前半など年代を丸めた文字列
  */
  function normalizeAge($age) {
    if (empty($age)) {
      return '年齢 未回答';
    }
    return getTensPlace($age) . '代' . (isEarlyAge($age) ? '前半' : '後半');
  }
}

```


## そこでviewテンプレートのBladeの構文解析器を拡張する（directive追加）
Controller側でこれを定義しておくことで、そのControllerを用いた時だけ使える
viewテンプレートで利用可能な構文が追加される。

```php

Blade::directive('normalizeAge', function ($age) {
  if (empty($age)) {
    return "<?php echo 年齢、未回答; ?>";
  }
  return "<?php echo getTensPlace($age) . '代' . (isEarlyAge($age) ? '前半' : '後半') ?>";
});
```

## 使い方
bladeテンプレートファイルで @if や @foreach のように記述するだけ

```php
@normalizeAge(14)
```


このようにすることでグローバル汚染を防ぎつつ、viewで使えるロジックを定義できるのではないかと思った。
いや、普通に違う方法あるでしょというベストアンサーお待ちしてます。
メモリ残容量を意図的に減らす方法

# Linuxでメモリ残容量を意図的に減らす
- テストの一環でメモリの残容量を減らして別システムにアラームが飛ぶかを確認していたが当初考えていた手順ではうまく動かなかったのでメモ
- 環境

```
# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
```

## 最初に考えていた手順

```
# /dev/null < $(yes)
```

```
# free -h -s 1
```

## 実際に返ってきた結果
```
-bash: xrealloc: cannot allocate 18446744071562067968 bytes (1945600 bytes allocated)
```

- メモリの残容量が1.8GBあたりでとまってしまう → Why?

## 別の方法を試す

```
stress --vm 2 --vm-bytes 3G --timeout 2m
```

- こうなった。orz

```
-bash: stress: command not found
```

- 導入されているパッケージが絞られている仕様のためstressコマンドが存在しなかった

##  /dev/null < $(yes) だけで乗り切ろうと頑張る
- xargsで並列処理を試みる

```
xargs -P64 -n1 /dev/null > ($yes)
```

- なぜか最初の手順と結果が変わらず

- バックグラウンドで実行してみる

```
# /dev/null < $(yes) & /dev/null < $(yes) & /dev/null < $(yes)
```

- 結果、順調に残メモリが減少しアラームが通知された

```
              total        used        free      shared  buff/cache   available
Mem:           7.6G        4.7G        1.5G         16M        1.4G        2.5G
Swap:          4.0G          0B        4.0G

              total        used        free      shared  buff/cache   available
Mem:           7.6G        5.0G        1.2G         16M        1.4G        2.2G
Swap:          4.0G          0B        4.0G

              total        used        free      shared  buff/cache   available
Mem:           7.6G        5.3G        953M         16M        1.4G        1.9G
Swap:          4.0G          0B        4.0G

              total        used        free      shared  buff/cache   available
Mem:           7.6G        5.6G        650M         16M        1.4G        1.6G
Swap:          4.0G          0B        4.0G

              total        used        free      shared  buff/cache   available
Mem:           7.6G        5.9G        352M         16M        1.4G        1.3G
Swap:          4.0G          0B        4.0G

              total        used        free      shared  buff/cache   available
Mem:           7.6G        6.2G        130M         16M        1.3G        1.0G
Swap:          4.0G        2.0M        4.0G
```

# めでたしめでたし

# 疑問点

## ↓これは何だろう？

```
-bash: xrealloc: cannot allocate 18446744071562067968 bytes (1945600 bytes allocated)
```

## xargsがうまく動かなかった理由が不明


# 参考文献

[意図的にLinuxサーバに負荷をかける方法　stressコマンド編]
https://blog.supersonico.info/?p=223

【Linux】stressコマンドを使わずに手軽にメモリ負荷をかける方法
https://techblog.ap-com.co.jp/entry/linux-memory

Linuxコマンド(Bash)でバックグラウンド実行する方法のまとめメモ
https://qiita.com/inosy22/items/341cfc589494b8211844
ALB + htaccessでのBasic認証でヘルスチェックだけ認証しない

## やりたいこと

- テスト用にEC２を用意して、Basic認証をかけて開発中アプリケーションを公開しておきたい
- Basic認証はhtaccessで管理

## 困ったこと

- htaccessの設定で、ALBからのヘルスチェックにもbasic認証をかけてしまったために、ヘルスチェックが通らない
- その影響で、CodeDeployのAllowTrafficフェーズで失敗する


## 解決策

- ヘルスチェックのアクセスはBasic認証しないようにする


```
<Files ~ "^\.(htaccess|htpasswd)$">
  Deny from all
</Files>

Satisfy Any
AuthType Basic
AuthUserFile /path/to/.htpasswd
AuthName "Please ENter your ID and password"
Require valid-user
setEnvIf User-Agent "^ELB-HealthChecker.*$" noAuth
order Deny,Allow
Deny from all
Allow from env=noAuth
```

あんまり使うことないかもしれないですが、ちょっとハマってしまったので、記録しておきます。
[SFDX] 新規 SFDX プロジェクトに Salesforce 組織上の既存コードを取り込む

少しの間 VS Code から離れただけで忘れてしまっていたので備忘録です。
新規に VS Code で SFDX プロジェクトを作成した際に、特定の組織で開発してきたコードを、プロジェクト内に取り込むための手順です。

##プロジェクトを新規作成し、組織を認証する
VS Code を開き、プロジェクトを作成します。

1. `cmd + shift + p > SFDX: Create Project with Manifest` でプロジェクトを作成
2. `cmd + shift + p > SFDX: Authorize an Org` で対象の組織を認証

##必要なファイルを指定する
特定のファイルのみ取得したい場合は、`manifest/package.xml` でそのファイル名を指定します。
全て取得する場合は、そのままで OK。

##ファイルを取得する
エクスプローラで `manifest/package.xml を右クリック > Retrieve Source in Manifest from Org` で組織内のファイルを取得できます。
![Screen Shot 2019-05-22 at 14.34.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/dd667b4a-9dc3-d10f-ebde-d2c0a90cb7ff.png)

##参考
- [SFDX: Retrieve Source from Org command does not retrieve new files #1175](https://github.com/forcedotcom/salesforcedx-vscode/issues/1175)
visual_studio_communityについて

ASP.NETでWEB画面を開発する
--
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381112/85c63326-7ecc-0007-b616-c6727ae8f835.png)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381112/589766fb-49f9-1bbb-47ca-32a1bca82b4c.png)


発行（visual_studio_community_2019）
--
visual_studio右クリックして管理者として実行する

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381112/5c3285e6-5e6c-6d47-64cb-c9a0804620da.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381112/9006270c-878f-3c38-3cb2-e1bd0048671c.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381112/062e2d33-02f4-96f7-270f-36f7b238f176.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381112/3bdce223-fe00-6a65-a461-89b913e1f65c.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381112/1e53da2d-b22d-fae0-f02e-d9c78064d283.png)
【Unity】モデルとHMDの位置をキャリブレーションする方法

# 概要
モデルの頭部とHMDの位置を同じ座標に合わせます。
FinalIKなどを使わない時に，モデルの視点とHMDの視点を合わせたい時に使いました。

※注意 CameraRigの位置を動かします。

# 環境
- Unity 2018.3.14
- SteamVR 2.2
- Unity-Chan
- HTC Vive

# 大まかな流れ
1. Calibrator用のGameObjectの作成
2. Caribrator.csの作成
3. 1.のGameObjectに，2.のスクリプトをアタッチ
3. Caribrator.csにCameraRig, Camera, モデルの頭部を設定
4. オフセット値を設定(任意)
5. SteamVR_Play_AreaのBorder Thicknessを設定(任意)

# Caribratorの作成(1-2)
Hierarchyで右クリックして，CreateEmptyを選択。Calibrator用のGameObjectの作成する。
Projectで右クリックして，C# Scriptの作成。スクリプトは下記にあります。

# Caribratorの作成(3-4)
Caribrator.csにCameraRig, Camera, モデルの頭部を設定。
CameraRigは，SteamVRの[CameraRig]を設定
HMDEyePosは，[CameraRig]ないのCameraを設定
ModelHeadPosは，モデルの頭部のオブジェクトを設定

<img width="1440" alt="スクリーンショット 2019-05-22 12.11.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421702/c2c18222-7685-bda6-1f0f-b211b7554b42.png">


# スクリプトの流れ・仕組み
1. CameraRig, Camera, モデルの頭部の座標を取得。
2. cキーの入力を待機。
3. モデルの頭部の座標からCameraの座標を引いてズレを計算。
4. CameraRigの座標に3で計算したズレを加算し，モデル頭部とCameraの座標を一致させる。

# コード

```c#:Caribrator.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Caribrator : MonoBehaviour
{
    /**
    * CameraRigの位置
    */
    [SerializeField]
    Transform cameraRig;

    /**
    * HMDの目の位置
    */
    [SerializeField]
    Transform hmdEyePos;

    /**
    * モデルの頭の位置 
    */
    [SerializeField]
    Transform modelHeadPos;

    /**
    * 微調整パラメータ
    */
    [SerializeField, Range(-0.5f, 0.5f)]
    float x_offset; //0.01 Unity-ChanのCharacter1_Headを選択したとき

    [SerializeField, Range(-0.5f, 0.5f)]
    float y_offset; //0.03

    [SerializeField, Range(-0.5f, 0.5f)]
    float z_offset; //0.11

    void Update(){
        if(Input.GetKey("c")){
            Calibrate();
        }
    }

    /**
    * キャリブレーション 
    */
    public void Calibrate () {
        float x = modelHeadPos.transform.position.x - hmdEyePos.transform.position.x + x_offset;
        float y = modelHeadPos.transform.position.y - hmdEyePos.transform.position.y + y_offset;
        float z = modelHeadPos.transform.position.z - hmdEyePos.transform.position.z + z_offset;
        cameraRig.position = new Vector3(cameraRig.position.x + x, cameraRig.position.y + y, cameraRig.position.z + z);
        // Debug.Log("y: " + y); 
    }
}

```

# 実行結果
### カメラの位置
![ブログ図.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421702/95169eab-8ecf-04a5-c793-d1ee1ef7f4e0.jpeg)

### 視点
![ブログ図.002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421702/5667c382-465e-9d8e-8c18-48e5ecd1cceb.jpeg)
ScrolledTextで最後の行を表示する

Tkライブラリに収録されているScrolledTextでは、テキストをユーザーが入力したときは、入力部分が画面に表示されるよう、必要に応じてスクロールされます。

ただし、プログラムから`ScrolledText#insert()`などでテキストを挿入した場合は、スクロールされず、スクロールバーの表示幅だけが更新されてしまいます。これを表示できるようにしたいという話。

資料はなかなか見つかりませんが、やることは単純で、テキストを挿入した後`ScrolledText#yview_moveto(1)`というメソッドを呼べば良いです。1が何を示しているのかは分かりませんでしたが周辺の文脈からするとおそらくスクロールの位置でしょう(0～1)。

# 今回の思考プロセス

いちおうこれだけではなんなので、今回の思考プロセスをメモしておきます。

1. ScrolledTextに文字を書き込んだときに、テキストが見えなくなっていることを確認
2. 「Python ScrolledText」で検索したところとりあえず~~ほとんどろくに何も書かれていない~~[Pythonの公式リファレンス](https://docs.python.org/ja/3/library/tkinter.scrolledtext.html)にたどり着く
3. (初手で情報量のこんなに少ない公式リファレンスが出てきてしまう以上、)これ以上ググっても無駄そうなのでリンクより[ソースコード](https://github.com/python/cpython/blob/3.7/Lib/tkinter/scrolledtext.py)を見る
4. ScrolledTextは`ScrollBar`と`Text`の複合コントロールであることが分かったので[ScrollBar](https://github.com/python/cpython/blob/aea49b18752880e5d0260f16ca7ff2c6dce78515/Lib/tkinter/__init__.py#L3032)のソースコードを見る
5. [ScrollBar#set()](https://github.com/python/cpython/blob/aea49b18752880e5d0260f16ca7ff2c6dce78515/Lib/tkinter/__init__.py#L3069)メソッドあたりが願いを叶えてくれそうなので使ってみるも意味が無かったので諦める
6. ScrolledTextのソースコードで気になった[yview](https://github.com/python/cpython/blob/aea49b18752880e5d0260f16ca7ff2c6dce78515/Lib/tkinter/scrolledtext.py#L28)という文言を頼りに[Textのソースコード](https://github.com/python/cpython/blob/aea49b18752880e5d0260f16ca7ff2c6dce78515/Lib/tkinter/__init__.py#L3076)を見る
7. コード内を`yview`で検索したところ[なんかそれっぽいメソッド](https://github.com/python/cpython/blob/aea49b18752880e5d0260f16ca7ff2c6dce78515/Lib/tkinter/__init__.py#L1743)を見つけたので、改めて「Python Scrollbar yview_moveto」でググる
8. [Stackoverflowのそれらしい記事](https://stackoverflow.com/questions/41804207/tkinter-put-scrollbar-on-canvas-at-bottom-position)を見つけたので、該当メソッドを使っている回答を探す。その値をそのまま入れて実行
9. 動いた！

なにかの機能を探すときの参考になれば幸いです。

# というわけで

Tkinterはクラスの記述がどこにあるのか分かりにくいのと、パラメータやプロパティに設定できる値が書かれてなかったりとドキュメントコメントがイマイチ機能していないので嫌ですね(Tkを熟知している前提なのかそうでないのか不明ですが)。

これからPythonでGUIのアプリを書きたいというときは素直に[PyWebView](https://pywebview.flowrl.com)などを使いましょう。
ExcelVBAでHTTPアクセスしてXMLデータを取得する

# はじめに

令和元年5月からお世話になっている、私の新しい職場は、Excel が大好きな集団でした。何年かぶりに、私も ExcelVBA を使うことになりました。復習したことを少しづつ Qiita に投稿していこうと思っています。

今回は、ExcelVBAで、Web APIにアクセスして、XMLデータを取得し、それをシートに反映させたいと思います。ウィキペディアの「直近で更新された記事のタイトル」を取得してきています。

![vba03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48056/110742a1-e9ed-7b52-3653-f330eabbbd75.gif)

実際のXMLコードを見たい場合 => [ここをクリック](https://ja.wikipedia.org/w/api.php?action=query&list=recentchanges&rcnamespace=0&format=xml)

# 準備作業

私のPC環境は以下の通りです。

- Windows 10 Pro バージョン1809
- Excel 2016 バージョン1904

## スキップすること（今回は割愛すること）

以下のことは、読者は出来る or 理解しているものとします。

- リボン（Excelのメニュー）に「開発」がある
- あらかじめExcelファイルを、Excelマクロ有効ブック (*.xlsm)で保存する
- シート上にボタンを置き、マクロを割り当てる

## 必ずやること

開発リボンの中にある Visual Basic アイコンをクリックして、Visual Basic for Applicationsを起動します。ツールメニューにあるツールの参照設定をクリックします。

![vba01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48056/19309f63-88eb-d6c8-14f2-9d984e3560e6.png)

登場した参照設定ダイアログで、`Microsoft XML, v6.0`を探しだし、チェックを入れます。

![vba02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48056/8ba97de7-821a-7b08-1e22-692739a4108f.png)

# 実際のVBAコード

```vb
Option Explicit

Sub Main()

'変数の宣言
Dim http As XMLHTTP60
Dim doc As DOMDocument60
Dim node As IXMLDOMNode
Dim url As String
Dim i As Integer

'HTTPアクセスを設定して発射
Set http = New XMLHTTP60
url = "https://ja.wikipedia.org/w/api.php?action=query&list=recentchanges&rcnamespace=0&format=xml"
http.Open "GET", url, False
http.send

'HTTPアクセスに失敗があったら中止
If http.statusText <> "OK" Then
    MsgBox "サーバーへの接続に失敗しました", vbCritical
    Exit Sub
End If

'XMLデータを取り込む
Set doc = New DOMDocument60
doc.LoadXML (http.responseText)

'XPathを使ってノード（要素）を取り込む
i = 1
For Each node In doc.SelectNodes("//rc")
    '各ノードのtitle属性を取得して、シートに貼り付ける
    ActiveSheet.Range("A" & i + 2).Value = i & ": " & node.Attributes.getNamedItem("title").Text
    i = i + 1
Next

'後片付け
Set http = Nothing
Set doc = Nothing
Set node = Nothing

End Sub
```

# 最後に

残念ながら ExcelVBA では、データフォーマットは XML がデフォルトです。JSON は、トゥーヤングみたいです。コードが複雑になるのを避けるため、サーバーサイドも、XMLでつくっていこうと思います。
【Unity】Androidプロジェクトをビルド時に出力する。


Gradleで躓いたのでどこに原因があるのか調べたく、
--infoとか--debugとか--stackなどのオプションをつけて検証したかった。

**Export Project**
BuildSettingsのExportProjectにチェックを入れるとAndroidのプロジェクトを出力してくれるらしい
![スクリーンショット 2019-05-22 13.54.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421285/31c0c3a8-ef32-de4d-2ee5-909c59897a2e.png)


既に他の方の記事もあった
[リンク](https://qiita.com/RuriKameoka/items/c4f65274d41aa54bad56 "リンク")
php-master-changes 2019-05-21

今日は opcache のバグ修正、テストの修正、stream コンテキストオプション content_type のサポート追加を 7.2 系へのバックポート、一部拡張の共有ライブラリのビルド修正があった！

# 2019-05-21
## dstogov: Fixed bug [#78014](https://bugs.php.net/bug.php?id=78014) (Preloaded classes may depend on non-preloaded classes due to unresolved consts)
- https://github.com/php/php-src/commit/f53b9939fe4f66e1a539a42d607fefbe45be6239
- [7.4~]
- ext/opcache で、未解決定数により preload されないクラスへ依存したクラスを誤って preload してしまう問題の修正

## dstogov: Prevent race condition in opcache_reset()
- https://github.com/php/php-src/commit/a8a019d68a605dd2b699174dd7f55d6e8bbaeee6
- [7.2~]
- ext/opcache で、[opcache_reset()](https://www.php.net/manual/ja/function.opcache-reset.php) の race を修正

## hollyhuiLi: use {TMP} placeholder in phpt tests
- https://github.com/php/php-src/commit/202e6936d6fa319fdda16c5c61d70ce19c2ecef6
- [7.2~]
- テストで [`{TMP}`](https://qiita.com/sj-i/items/c69f4ecfc4116977be08#cmb69-add-tmp-placeholder-for-phpt-ini-sections) を使うよう修正

## vjardinMisc: Support content_type stream context option in soap
- https://github.com/php/php-src/commit/5f8c22d41536768298354218fe238691ae750f75
- [7.2~]
- ext/soap で、[先日 7.4 系以降へ入った](https://qiita.com/sj-i/items/25e7f9a97131aa374041#vjardinmisc-support-content_type-stream-context-option-in-soap) stream コンテキストオプション content_type のサポート追加を 7.2 系へバックポート

## cmb69: Prevent test case failure
- https://github.com/php/php-src/commit/e6a191de1b73c902b631cb8f0f70ed58b81005d4
- [7.2~]
- ext/opcache で、ログ出力によるテストこけの修正

## remicollet: fix typo breaking shared build
- https://github.com/php/php-src/commit/24206783c3cf2e41e0895ab04e8f59b8092f476a
- [7.4~]
- ext/sqlite3 で、共有ライブラリビルド時エラーになる typo の修正

## cmb69: Fix ASLR related invalid opline handler issues
- https://github.com/php/php-src/commit/8ba10b8fbc020dc225d3b19d8f088f1351a3e304
- [7.4~]
- ext/opcache で、Windows で ASLR により共有メモリ上の opline handler が正しいポインタにならず正常動作しない場合がある問題の修正
- [PR:4170](https://github.com/php/php-src/pull/4170) の奴、execute_ex のアドレス見てロード先を判定してファイルキャッシュにフォールバックしたりするみたい

## remicollet: enchant: fix shared build
- https://github.com/php/php-src/commit/1f8b9b8de6f04b28ba5b1019863615c58489f437
- ext/enchant で、共有ライブラリのビルドを修正

## remicollet: sodium: fix shared build
- https://github.com/php/php-src/commit/9ef03a94ba68be0f8bae36f46c4763ba3c88a02a
- [7.4~]
- ext/sodium で、共有ライブラリのビルドを修正

## nikic: Improve SCCP debug code
- https://github.com/php/php-src/commit/367788cbc37d54f6f77ac3785c2de612d9fdc36d
- [7.3~]
- ext/opcache で、SCCP のデバッグコードを改善

## nikic: Extract ct_eval_binary_op()
- https://github.com/php/php-src/commit/bdce5849b7866132097b8730f695fa2ead133019
- [7.3~]
- ext/opcache で、ct_eval_binary_op() の関数切り出し
- オペランドが partial array でなければ zend_optimizer_eval_binary_op() を呼ぶ挙動

## nikic: Handle partial arrays in zend_is_true() checks
- https://github.com/php/php-src/commit/cd188d0398923fa4d49d45db3be3530598ac78d2
- [7.3~]
- ext/opcache で、SCCP 最適化の際に zend_is_true() を呼んでいた箇所で partial array のチェックをするよう関数切り出しして修正

## nikic: Fix partial array handling in FE_RESET edge feasibility
- https://github.com/php/php-src/commit/fc4836b193666958844e50bc35b93cc2da08b91c
- [7.3~]
- ext/opcache で、SCCP 最適化の際の partial array のチェックを追加
Magic Leap MagicScript Landscape Application. VideoNode

Prepare
Magic Leap One
https://www.magicleap.com/magic-leap-one

mlsdk v.0.20.0
https://creator.magicleap.com/downloads/lumin-sdk/overview

magic-script-cli v2.0.1
https://www.npmjs.com/package/magic-script-cli

magic-script-polyfills v2.2.0
https://www.npmjs.com/package/magic-script-polyfills

**Create Project**

```sh
magic-script init my-video org.magicscript.video "Video"
cd my-video
```

**Code**

Change app.js

```jsx
import { 
    LandscapeApp
  , ui
  , VideoEventType
  , VideoEventData} from 'lumin';
const {
    UiLinearLayout
  , UiButton
  , Alignment } = ui;

export class App extends LandscapeApp {
  
  init() {
    this._prism = null;
    return 0;
  }

  onAppStart () {
    const prism = this.requestNewPrism([1.0, 1.2, 1.0]);
    const layout = UiLinearLayout.Create(prism);
    layout.setAlignment(Alignment.CENTER_CENTER);

    const video = prism.createVideoNode();
    video.setLooping(1);
    const button = UiButton.Create(prism, 'PLAY!', 0, 0.1);
    button.setEnabled(false);
    button.onActivateSub(function (uiEventData) {
        if (!video.isPlaying())
        {
            video.start();
            button.setText("STOP");
        }
        else
        {
            video.pause();
            button.setText("PLAY");
        }
    });
    
    prism.onEvent = function(event)
    { 
        if (event instanceof VideoEventData)
        {
            if (event.getVideoEventType() === VideoEventType.kPrepared)
            {
                button.setEnabled(true);
            }
        }
        return true;
    }

    // https://mixkit.co/
    // https://mixkit.co/videos/city/56/
    video.setVideoUri("https://assets.mixkit.co/videos/56/56-720.mp4");
    
    layout.addItem(video
      , [0.01, 0.01, 0.01, 0.01]
      , Alignment.TOP_CENTER);
    layout.addItem(button
      , [0.01, 0.01, 0.01, 0.01]
      , Alignment.CENTER_CENTER);
    prism.getRootNode().addChild(layout);
    this._prism = prism;
  }

  eventListener(event) {
    if (this._prism.onEvent)
    {
      this._prism.onEvent(event);
    }
    return true;
  }
}
```

Change manifest.xml

```xml
<manifest xmlns:ml="magicleap"
          ml:package="org.magicscript.video"
          ml:version_name="0.0.1"
          ml:version_code="1">
  <application ml:visible_name="Video"
               ml:application_type="untrusted"
               ml:sdk_version="1.0">
    <component ml:name=".universe"
               ml:visible_name="Video"
               ml:binary_name="bin/index.js"
               ml:type="Universe">
      <mode ml:shareable="true"/>
      <icon ml:model_folder=""
            ml:portal_folder=""/>
    </component>
    <uses-privilege ml:name="MagicScript"/>
    <uses-privilege ml:name="Internet"/>
  </application>
</manifest>
```

**Build**

```sh
magic-script build -i
```

**Run**

```sh
magic-script run --port=10000
```

**Reference**
VideoNode(Magic Script API Doc)
https://docs.magicscript.org/lumin.VideoNode.html


magicscript
https://www.magicscript.org/

Thanks!
CodePenでWeekly Coding Challengeに参加してみた

ふとCodePenを見ていたら、[Weekly Coding Challenge](https://www.florin-pop.com/blog/2019/03/weekly-coding-challenge)というものが企画されていたので参加してみました:relaxed:

#Weekly Coding Challengeとは
企画者の[Florin Pop](https://codepen.io/FlorinPop17/)さんが毎週テーマと自身の作品を出してくれて
そのテーマに沿って、企画者の作品を自分のコードで再現してみたり
自由にクリエイティブに作ってみたり、で楽しくモチベを上げていこうってことみたいです:point_up:
Twitter等でお知らせしたらコレクションにも追加してもらえます:relaxed:

今はもう#11まで出ているので、だいぶ追いかける形になりますが、無理に追いつかなくても楽しめそうです。

##初回のテーマ

初回のテーマは「Sign in/up Form」
サインインとサインアップのビューを持ったフォームの作成。

###私はこんなの作りました

<p class="codepen" data-height="700" data-theme-id="0" data-default-tab="css,result" data-user="hiromir13" data-slug-hash="XweygL" style="height: 500px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Weekly Coding Challenge #1 - Sign in/up Form">
  <span>See the Pen <a href="https://codepen.io/hiromir13/pen/XweygL/">
  Weekly Coding Challenge #1 - Sign in/up Form</a> by hiromir13 (<a href="https://codepen.io/hiromir13">@hiromir13</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

##詳しくはこちら
[Weekly Coding Challenge](https://www.florin-pop.com/blog/2019/03/weekly-coding-challenge)

#####小声…
CodePenはなんかみんなSVGアニメをゴリゴリに動かしてすごいことをしてる怖いところだ…
って思ってたのですが、こういうもっと実務に使えそうで慣れてるものだと敷居が低くていいですね。
これを機にもっと使えそうな気がしています（笑）
辞書をpd.DataFrameに変換

# 異なる長さのリストを含む辞書をpd.DataFrameに変換
```python:dict_to_df.py
#!/usr/bin/env python3
import pandas as pd

d1={'key1': [1,2,3], 'key2': [4,5,6,7], 'key3': [8,9]}

d2={}
for k,v in d1.items():   # 一度pd.Seriesに変換
    d2[k]=pd.Series(v)

df=pd.DataFrame(d2)

print(df)
   key1  key2  key3
0   1.0     4   8.0
1   2.0     5   9.0
2   3.0     6   NaN
3   NaN     7   NaN
```

# 追記 (より良い方法)
以下のコメントでnkayさんから良い方法を教えていただきました。
とても簡潔にpd.DataFrameに変換できます。

```python
d = {'key1': [1,2,3], 'key2': [4,5,6,7], 'key3': [8,9]}

df = pd.DataFrame.from_dict(d, orient='index').T
# もしくは
df = pd.DataFrame(d.values(), index=d.keys()).T

print(df)
   key1  key2  key3
0   1.0   4.0   8.0
1   2.0   5.0   9.0
2   3.0   6.0   NaN
3   NaN   7.0   NaN
```

# これはできない
`ValueError: arrays must all be same length`のエラーが出る

```python
d={'key1': [1,2,3], 'key2': [4,5,6,7], 'key3': [8,9]}
df=pd.DataFrame(d)  # これはできない
```

# 辞書に含まれるリストの長さが同じ時のみ、可能
```python
d={'key1': [1,2,3], 'key2': [4,5,6], 'key3': [7,8,9]}
df=pd.DataFrame(d)  # これはできる

print(df)
   key1  key2  key3
0     1     4     7
1     2     5     8
2     3     6     9
```

# 環境
Ubuntu 18.04
Python 3.7.2
pandas 0.24.1
PyYAMLがyaml.loadでYAMLLoadWarningを出してくるようになった件

今日何気なくPyYAMLを使おうとしたら、`yaml.load(f)`のようなコードが軒並みYAMLLoadWarningを吐くようになった件。

> file.py:***: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.

まあ、内容としては書いてあるとおりなのですが・・・。

PyYAML5.1以降、Loader引数無しで`yaml.load()`を呼ぶのは、エクスプロイトを仕込めてしまう危険があるのでダメになったそうな。なので、こうしなきゃいけなくなりました。

```python
  yaml.load(f, Loader=yaml.SafeLoader)
```

`yaml.safe_load()`メソッドあたりを使ってもいいよとのこと。

[警告に書かれたURLのページ](https://msg.pyyaml.org/load)に書いてあるとおりですね。
How to fix SIGSEGV error while installing STM32CubeMx on Ubuntu 16.04

I got an error while installing
>./SetupSTM32CubeMX-5.1.0.linux 


(in my case, I am installing 5.1.0 version) 
This is the error message:
*May 22, 2019 1:16:30 PM INFO: Logging initialized at level 'INFO'
May 22, 2019 1:16:30 PM INFO: Commandline arguments: 
May 22, 2019 1:16:30 PM INFO: Detected platform: ubuntu_linux,version=4.15.0-50-generic,arch=x64,symbolicName=null,javaVersion=9-internal*
#
*# A fatal error has been detected by the Java Runtime Environment:*
#
*#  SIGSEGV (0xb) at pc=0x00007f31ecc9e009, pid=12799, tid=12891*
#
*# JRE version: OpenJDK Runtime Environment (9.0) (build 9-internal+0-2016-04-14-195246.buildd.src)*
*# Java VM: OpenJDK 64-Bit Server VM (9-internal+0-2016-04-14-195246.buildd.src, mixed mode, tiered, compressed oops, g1 gc, linux-amd64)*
*# Problematic frame:*
*# C  [libjava.so+0x1d009]  JNU_GetEnv+0x19*
#
*# Core dump will be written. Default location: Core dumps may be processed with "/usr/share/apport/apport %p %s %c %d %P" (or dumping to /path_location/en.SetupSTM32CubeMX-5.1.0-RC6/core.12799)*
#
*# An error report file with more information is saved as:*
*# /path_location/en.SetupSTM32CubeMX-5.1.0-RC6/hs_err_pid12799.log*
#
*# If you would like to submit a bug report, please visit:*
*#   http://bugreport.java.com/bugreport/crash.jsp*
*# The crash happened outside the Java Virtual Machine in native code.*
*# See problematic frame for where to report the bug.*
*Aborted (core dumped)*

###This is the solution:
$ sudo apt-get remove jdk*
$ sudo apt-get install default-jre
「設計なんて不要でしょ」と「設計書なんて不要でしょ」の違い。仮説（55）

設計関係の記述を拝読。

「設計なんて不要でしょ」について
https://qiita.com/kahirokunn/items/d872b343ea1b89e8bec8

設計不要論と環境と社会と
https://qiita.com/kotauchisunsun/items/af2ba8159668ba80c717

それぞれ、設計が不要だという人に対する反論のような感じ。

多分、「設計」「設計書」という用語の範囲と深さの違いが背景にあるかも。

ある系(system)で動いているソフトウェア全体の設計を設計といえば、
99%は自分で設計していない。

３つか４つの設計思想の違う、1.操作系(operating system), 2.土台(platform), 3.言語(programming language), 4.通信規約(network protocol), 5.情報基地(data base)の中から選んでいるだけかもしれない。

設計しているわけではない。

# 第一の境界　選択は設計か
1, 2, 3, 4, 5に、それぞれ制約条件があり、５つの組み合わせを選ぶことが、
構造設計と呼んでもいいかも。

これを設計というか、設計といわないか、設計に対する立場が違うかも。

最終的な系を思い描かずに、選んでいるだけだから設計ではないという方は、自分が選んでいる根拠に、技術的な要素ではなく、経済的な要素が強いのかもしれない。

最終的な系の技術制約から、選択していると、設計と思うかもしれない。
系の全体像を描いて、そこに基本要素を割り当てる。

# 第二の境界　設定の変更
既存の系の設定を既定値のまま動かすと設計という認識は薄くなる。
既定値から必要に応じて変更すると、設計という意識が濃くなるかも。

# 第三の境界　界面の変更
選択した要素の、基本的な制約条件をそのままに受け入れて、なんとか動くものを作っていると、設計という認識が薄くなるかもしれない。

選択した要素の、基本的な制約条件の例外的な修正が可能な場合に手を入れていると、設計という認識は濃いかもしれない。

# まとめ
何を設計というか。
系をよくするために、何をするか。

二つの立場の違いが、言葉が通じていなくて、相手の制約条件の妥当性を確認することなく、すれ違っていく。

この２−３年、食っていければいいや的な人のやっていることと、
自分の作った系が３０年、みんなの役に立てばと思っている人の、
設計の範囲（量）も質も全然違う。

人の設計に乗っかるだけ乗っかって、お金をもらう人には、設計なんて不要でしょと思う。
それが契約の範囲内であれば、悪いことではないし、そういう行動の方が短期的にはお金が儲かるかもしれない。

# 最後に
「設計書なんて不要でしょ」について触れるのを忘れていた。

設計書は不要かもしれないし、
ソースコードが設計書かもしれない。

設計よりも、もっと幅広い。

設計になんの役に立たない文書類を設計書と称して、費用計上している仕事もあれば、
設計に必要な資料を、使い捨てで廃棄してしまう仕事もあるかもしれない。

顧客には必要ないかもしれないが、作り直すために必要な資料を、設計書と仮定する。
必要な資料だから、不要ではない。

いらないのは、設計書という名目で、設計に役に立たない書類群。

# 参考資料(reference)
ソースコードは設計書であり、コーディングは設計作業である
https://qiita.com/mdstoy/items/5510f94c9ed981cfbb85

# 文書履歴(document history)
ver. 0.01 初稿 20190522 午前
ver. 0.02 標題追記 20190522 午後
ver. 0.03 参考資料追記 20190525
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
RPA、BPMSが成功した話。仮説(62)

RPA、BPMSが成功した話をお聞きした。

# 優先順位をつける
今、やっている仕事に優先順位をつける

日ごと、週ごと、月ごと、年ごとにそれぞれ優先順位をつける。

優先順位を決めるだけでなく、その仕事をするために必要な入力は、いつごろ、どんな状態で来るのかを簡単に記録しておくとよい。

ばらばらとくるなら、まとまってから処理した方がよいかもしれない。
何度も変更があるのなら、ある程度変更が来てからの方がよいかもしれない

今週やらなきゃいけない大事な仕事があっても、
それは早くやりすぎると無駄な作業や、やりなおしが増えるのであれば、
後でやった方がよいかもしれない。

そのために、日ごとに、何を優先させるかを決める。

# 無駄をなくす
優先順位を決めて、各部署間の関連する業務を分析すると、
全く必要のない業務に優先順位をたかくつけているところを発見するかもしれない。

これまでやっていたから、なぜやるかがわかっていないが、いつまでに出すかが決まっているから、その日までに出しているといったものたち。

必要性はあるが、今の市場動向から戦略を切り替えるとすると、全く必要のなくなることをやっているか。

あるいは、他の部署に電子データがあるのに、また手で入力して処理しているか。

仕事の１割は、無駄だと思って分析すると、無駄がなくなるかもしれない。

仕事の２割を無駄だと仮定しようとすると、無理が生じるかもしれない。

余裕がなくなり、摩擦が増えるかも。

Error一覧 error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48)
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

OSEK OS設計の基礎　OSEK(100)
https://qiita.com/kaizen_nagoya/items/7528a22a14242d2d58a3

AUTOSAR(0)Qiita記事一覧, OSEK(75) https://qiita.com/kaizen_nagoya/items/89c07961b59a8754c869

なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2

言語処理100本ノックをdockerで。python覚えるのに最適。:10+12
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4

プログラムちょい替え（0）一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394

TOPPERSまとめ　名古屋のIoTは名古屋のOSで
https://qiita.com/kaizen_nagoya/items/9026c049cb0309b9d451

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

官公庁・学校・公的団体（NPOを含む）システムの課題、官（０）
https://qiita.com/kaizen_nagoya/items/04ee6eaf7ec13d3af4c3

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

LaTeX(0) 一覧　
https://qiita.com/kaizen_nagoya/items/e3f7dafacab58c499792

自動制御、制御工学一覧（０）
https://qiita.com/kaizen_nagoya/items/7767a4e19a6ae1479e6b

Rust(0) 一覧　
https://qiita.com/kaizen_nagoya/items/5e8bb080ba6ca0281927

小川清最終講義、最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
###文書履歴(document history)
ver. 0.01 初稿 20190522
ver. 0.02 標題追記 20190524
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Vimでサンプル書くときのsyntax設定

たまに、Vimでjsonのサンプルを書きたかったりする。
使い捨てのサンプルなのでファイルに起こすほどのものでないとき、 terminalから `vim` コマンドでそのまま編集を開始するのだけれど、そうするとsyntax highlightが設定されない。

ちょっと調べたら簡単に設定できたので覚え書き。

下記2つのコマンドでOKみたい。

```
:syntax enable
:set filetype=json
```
`:syntax enable` でsyntaxを有効にし、 `:set filetype=json` で、ファイルタイプを指定する。

`:set filetype=py` とかにするとpythonのsyntax highlightがあたるとおもう。
GoogleカレンダーとGoogle ToDoを同じ画面で操作する

GoogleカレンダーとGoogle Todoを同じ画面で操作したい。

2019年5月22日現在、それは驚くほど簡単でした。

１．　画面右下の「＜」ボタンを押すだけでした。

![スクリーンショット 2019-05-22 12.29.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421727/94b282d9-3b86-fe5e-1db8-1e81605fb683.png)





２.　右端に小さいバーとアイコンが表示されます。
![スクリーンショット 2019-05-22 12.35.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421727/23207d1a-4c46-54db-885f-2be587781d48.png)





３．　右端の青色のアイコンをクリックすれば、Google ToDoが表示されます。
![スクリーンショット 2019-05-22 12.40.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421727/7451fed2-e44b-036d-6267-c6f247de365b.png)


実は、Gmailでは以前から右端にGoogle ToDoを表示できるのは知っておりまして、

だったらGoogleカレンダーでもできるはずだ！と半年ぐらいやり方を調べておりました。。。。

灯台元暗しとはほんとにこのことで、見つけた時は喜びと同時に、軽いショックを受けました。

私はこの方法をほんとうに半年ほど探していたので、プログラマーになるのであれば致命的な思考ですが、

僕のようなミスをする方は少ないとは思いますが、もしおられましたらこれで救われてたら幸いです。



ちなみに、これが私の初めてのQiita投稿になります。

これからも、みなさまのお役に立てるように小さなことでも発信していきたいと思います。

引用元：
　1) Google URL:https://calendar.google.com
【Vue.js初心者】Todoリストはこう作る！～Todo削除～

#概要
[前回](https://qiita.com/kya0707/items/a26c7d5897f6fd77b079)より引き続き、
以下のVue.js公式で紹介されているサンプルについてどのように動作しているのか見ていきます。
https://jp.vuejs.org/v2/examples/todomvc.html

jsfiddleでも見れるので実際に触りながら見てみましょう。
https://jsfiddle.net/yyx990803/4dr2fLb7/?utm_source=website&utm_medium=embed&utm_campaign=4dr2fLb7

こんな感じの画面構成です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251494/323a7014-be3d-1ad7-57fb-8bb2fa9deee3.png)


# この記事の対象読者
・Vue.jsの公式ドキュメントに一通り目を通している
・でもまだよくわかっていない
・私もそうです

# 機能概要
以下の機能が存在します。
・TODO追加
・TODO削除
・TODO完了
・完了済みTODO件数表示
・TODOフィルター
・完了済みTODO全削除

[前回](https://qiita.com/kya0707/items/a26c7d5897f6fd77b079)はTODO追加について見ていきました。
今回はTODO削除について見ていきます。


# TODO削除
#### ・画面操作
TODOリストの削除は、リストにカーソルを合わせたときにリスト右側に出てくる
赤いバツボタンをクリックすると削除できます。

#### ・removeTodo
ではバツボタンが押された際、何が起こるのでしょうか。


```html:HTML
    <ul class="todo-list">
      <li v-for="todo in filteredTodos"
        class="todo"
        :key="todo.id"
        :class="{ completed: todo.completed, editing: todo == editedTodo }">
        <div class="view">
          <input class="toggle" type="checkbox" v-model="todo.completed">
          <label @dblclick="editTodo(todo)">{{ todo.title }}</label>
          <button class="destroy" @click="removeTodo(todo)"></button>
        </div>
        // 省略
      </li>
    </ul>
```
これはリスト部分のHTMLです。
filteredTodosをv-forで1要素づつ取得しています。
filteredTodosは、リストが格納されているtodosにフィルターを掛けたものです。
今のところはtodosと同義だと思っていてください。
v-for="X in Xs"は
Xsの要素を取り出しXに格納する、という意味です。[^1]

この中の

```html:HTML
   <button class="destroy" @click="removeTodo(todo)"></button>
```
この部分が削除ボタンですね。
クリックした際にremoveTodoが呼ばれているようです。
では次にJavaScriptを見てみます。

```javascript:JavaScript
    removeTodo: function (todo) {
      this.todos.splice(this.todos.indexOf(todo), 1)
    },
```
引数で渡されたtodoをspliceでtodosから削除しています。[^2]
これでtodosから削除されました。
さらに、todosが変更されたことによって、watch内の関数が呼ばれます。

#### ・watchでのtodos監視

```javascript:JavaScript
  watch: {
    todos: {
      handler: function (todos) {
        todoStorage.save(todos)
      },
      deep: true
    }
  },
```
これは[前回](https://qiita.com/kya0707/items/a26c7d5897f6fd77b079)も登場した関数ですね。
todoStorage.saveを呼んでいます。

```javascript:JavaScript
var todoStorage = {
  // 省略
  save: function (todos) {
    localStorage.setItem(STORAGE_KEY, JSON.stringify(todos))
  }
}
```
そしてこれがtodoStorage.saveです。
localStorageに変更後のtodosを保持します。

これで削除処理は完了です。

# まとめ
追加処理より削除処理のほうが簡単でしたね。
ご参考になれば、いいねしてくれるとうれしいです。

次回はレ点チェックをつけてTODOを完了状態する処理を見ていきましょう。


# 参考

[^1]: [Vue.js公式ドキュメント_v-for](https://jp.vuejs.org/v2/guide/list.html#v-for-%E3%81%A7%E9%85%8D%E5%88%97%E3%81%AB%E8%A6%81%E7%B4%A0%E3%82%92%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B)

[^2]: [MDN web docs_splice()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)
Rails6 のちょい足しな新機能を試す21（html_safe編）

# はじめに

Rails 6 に追加されそうな新機能を試す第21段。 今回のちょい足し機能は、 `String#html_safe` 編です。
Rails 6.0 では、 `html_safe?` が `true` な文字列から `[]` でインデックスを指定して抜き出した部分文字列も `html_safe?` が true となるようになりました。

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$  rails --version
Rails 6.0.0.rc1
```

# Rails プロジェクトを作る

```shell
$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1
```

# Controller と View を作る

controller と View を作ります。

```shell
$ bin/rails g controller html_safe index
```

# `HtmlSafeController#index` を修正する

controller で、html_safe な文字列を作成し、そこから一部を抜き出します。

```ruby:app/controllers/html_safe_controller.rb
class HtmlSafeController < ApplicationController
  def index
    str = '<em>This is HTML safe string first part</em><strong>This is HTML safe string second part</strong>'.html_safe
    i = str.index('<strong>')
    @html_safe_str1 = str[0...i]
    @html_safe_str2 = str[i..]
  end
end
```

# View を修正する

`index.html.erb` で controller で抜き出した一部の文字列を表示します。

```erb:app/views/html_safe/index.html.erb
<h1>HtmlSafe</h1>
<p>
  @html_safe_str1 = <%= @html_safe_str1 %>
</p>
<p>
  @html_safe_str2 = <%= @html_safe_str2 %>
</p>
```

# rails server を実行して表示する

`bin/rails s` を実行してブラウザから http://localhost:3000/html_safe/index にアクセスします。
html safe な文字列として処理されていることがわかります。

![2019-05-19-091744_414x128_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/cdc3a79b-327c-5680-11f9-a3f519ed3681.png)

# Rails 5 では？

Rails 5.2.3 では、抜き出した文字列の `html_safe?` が `false` になるため、以下のようにエスケープ処理されてしまいます。
![2019-05-19-091825_466x63_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209941/b563ebfd-a4ab-ba31-5e80-48c98f1eac3c.png)


試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try021_html_safe

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Maintain html_safe? on sliced HTML safe strings](https://github.com/rails/rails/pull/33808)
Swift5.0.1  backgroundの色を変える

##環境

Swift5.0.1  
xcode10.1

##やりたいこと

viewのbackgroundの色を変えたい（白から青）

<img width="1405" alt="スクリーンショット 2019-05-22 12.27.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167576/df7e4888-1484-89b7-5d59-dc3bdfd354d0.png">

<img width="1440" alt="スクリーンショット 2019-05-22 12.28.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167576/148ed6e6-2eb6-e757-d727-407609208511.png">


##やり方

###Navigator area（左）のところにある、viewを選択します。

 赤丸で囲っているところです。


<img width="1405" alt="スクリーンショット 2019-05-22 12.27.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167576/6736610b-4e13-a55d-0b3f-82e8cf1a0209.png">


###次に、UTILITY AREA(右)で色を選択


右から三番目ひし形を選択します。(赤い色で囲ってあるところです。)

そうすると、backcolorを出てきます()
青色のところです。

##好きな色を選ぶ

backgroundの項目をクリックして、一番下customを押します。
すると画面の下にカラフルな色が出てきて選択すると色が変わります

<img width="1420" alt="スクリーンショット 2019-05-22 12.46.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167576/e740ceb6-1fb1-3b2a-32bd-04b1ce4ba7ad.png">



<img width="1408" alt="スクリーンショット 2019-05-22 12.39.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167576/394ea39c-bdfa-e95e-9000-d16038b8ebbc.png">


##追記

Xcode　ウィンドウの名称
https://i-app-tec.com/ios/xcode-window.html#4
CloudFront+S3環境で Vue Nuxt の静的化ページでリロードした時にエラー（access denied)となる時の対処法

#CloudFront+S3の環境構築にデプロイ
nuxtアプリの`mode: 'universal'`モードにて
アプリケーションから静的ファイルを生成する。

`npm run generate`

静的なホスティングサイトにデプロイする準備が整ったものが全て入った dist フォルダが作成されます。

デプロイはAWS S3に先程生成されたファイルを配置することでデプロイできます。

##「/」以外のURLでリロードした場合に403(access denied)エラーとなる
This XML file does not appear to have any style information associated with it.!~~~~
AccessDenied
AccessDenied
#対応策
エラーの原因として対応するファイルがないため、ブラウザリロードすると 403 エラーになってしまうようです。

##CloudFrontのError Pagesで設定
403のときに/index.html（今回は「/」）へ転送するよう設定することでこの現象を回避することができます。
###Custom Error Response で追加設定
HTTP Error Code:　403:Forbidden
Error Caching Minimum TTL (seconds):　0
Customize Error Response:　Yes
Response Page Path:/
HTTP Response Code:　200:OK

以上の設定でリロードしてもエラーとならずページが表示されます。

こちらのサイトの記事を参考に解決することができました。
https://dev.classmethod.jp/cloud/aws/s3-cloudfront-spa-angular-403-access-denied/
ありがとうございます！！
Windowsの勝手な再起動からVirtualboxのVMを守る設定

# 問題

windowsのアップデートで勝手に再起動される。

`(＃＾ω＾)`

VirtualboxのVM稼働中でも問答無用。とても困る。せめてサスペンドしてほしい。

## 対策

VM起動してない状態。windowsのコマンドプロンプトで、以下のコマンドを打つ。

```
C:\Users\YourName> "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" setextradata "(VMの名前)" GUI/DefaultCloseAction SaveState
C:\Users\YourName> "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" getextradata "(VMの名前)" GUI/DefaultCloseAction
Value: SaveState

```

クローズ時にサスペンドさせる設定を行い、値を確認。

**注意事項:** この設定をすると、VMウィンドウのクローズしてもダイアログが出ず、自動的にサスペンド扱いになります。

解除方法は `setextradata` でアクション指定を行わない。

```
C:\Users\YourName> "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" setextradata "(VMの名前)" GUI/DefaultCloseAction
C:\Users\YourName> "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" getextradata "(VMの名前)" GUI/DefaultCloseAction
No value set!

```


see also: [9.19.9. Default Action when Terminating the VM@virtualbox.org](https://www.virtualbox.org/manual/ch09.html#terminate-vm-default-action)

確認した環境:

* windows10 1909
* virtualbox 6.1.2
error Command "webpack-dev-server" not found. info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

```
$ bin/webpack-dev-server
```

で出るタイトルのエラー

```
error Command "webpack-dev-server" not found. info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

##解決コマンド

yarnのアップグレード

```
$ brew upgrade yarn
```

`webpacker`インストール

```
$ bundle exec rails webpacker:install
```

`webpack-dev-server`立ち上げ

```
$ bin/webpack-dev-server
```
React-Hooksはstateよりreducerの方がサンプルとしてわかりやすい気がした

よくカウンターの例として state と setState を見る気がするけど、実は useReducer の方がわかりやすいのでは仮説。

```jsx

import React from "react";
import ReactDOM from "react-dom";

function useCounter() {
  return React.useReducer((state, i) => state + i, 10);
}

function App() {
  const [count, countUp] = useCounter();
  return (
    <div className="App">
      <h1>count: {count}</h1>
      <h2>
        <button onClick={() => countUp(1)}>count up</button>
        <button onClick={() => countUp(-1)}>count down</button>
      </h2>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
```


けど、どうなんだろう。