OmniAICreator/Qiita-1.07M huggingface dataset:
アルゴリズムとデータ構造の要点メモ in ruby（ヒープ）

# 目的

技術面接のために修行を始める。
ウェブでの技術試験時にみやすいようにこのページにまとめる。
Rubyでそそくさと実装できることを目的とする。

配列 https://qiita.com/tsnb/items/983c32d83331de1e0bea
連結リスト https://qiita.com/tsnb/items/3028ee788ff77ebaaa5e
スタック https://qiita.com/tsnb/items/e6901249629ef090ee8f
キュー https://qiita.com/tsnb/items/588afe675ad830ff1fc6
二分木 https://qiita.com/tsnb/items/8aa4e1ebb24d87919c40
二分探索木 https://qiita.com/tsnb/items/8553f8c2effb4d704d9a

# 参考

- https://programming-place.net/ppp/contents/algorithm/index.html#header (分かりやすいです、書いた人あざます、この記事をRuby用にまとめてるだけです)

# ヒープ（データ構造）

## 要点

ヒープは、木構造の一種で、格納されているすべての要素の中から、最小値または最大値を持つ要素を探すことに適した構造。

ヒープは、根が最小値、または最大値となるように構成します。根が最小値とした場合、ある節の値は必ずその親以上の値です

### 実装

- 配列で実装
- バイナリヒープ （以下はO(1)で検索可能）
  - 左の子は、親の値 * 2
  - 右の子は、親の値 * 2 + 1
  - 自分の親は、自分の値 / 2 (余りが出たら切り捨てる)
  - 自分の兄弟は、自分の値 - 1 か + 1
  - 根と最後の要素
- 要素の追加と削除を実装

```ruby
class Heap
  attr_reader :list

  def initialize
    @list = [nil]
  end

  def add(val)
    @list.push(val)
    up_heap(@list.size - 1)
    @list
  end

  def del(index=1)
    return if index < 1
    @list.swap!(index, -1)
    @list.pop
    down_root(index)
    @list
  end

private
  def up_heap(index)
    return if index <= 1
    parent_index = index/2
    if @list[parent_index] > @list[index]
      @list.swap!(parent_index, index)
      up_heap(parent_index)
    end
  end

  def down_root(index)
    child_index = small_child(index)
    return if child_index >= @list.size
    if @list[index] > @list[child_index]
      @list.swap!(index, child_index)
      down_root(child_index)
    end
  end

  def small_child(index)
    left = index*2
    right = index*2 + 1
    return left if @list[right].nil?
    return right if @list[left].nil?
    (@list[left] > @list[right])? right : left
  end
end

class Array
  def swap!(a, b)
    self[a], self[b] = self[b], self[a]
    self
  end
end
```

以下のpdfと同じ構造のヒープを作成して、要素削除を実施
http://www.dais.is.tohoku.ac.jp/~shioura/teaching/ad09/ad09-04.pdf

```ruby
irb(main):303:0> h = Heap.new
=> #<Heap:0x00007fdbfc85ad60 @list=[nil]>
irb(main):304:0> h.add(2)
=> [nil, 2]
irb(main):305:0> h.add(7)
=> [nil, 2, 7]
irb(main):306:0> h.add(4)
=> [nil, 2, 7, 4]
irb(main):307:0> h.add(9)
=> [nil, 2, 7, 4, 9]
irb(main):308:0> h.add(7)
=> [nil, 2, 7, 4, 9, 7]
irb(main):309:0> h.add(4)
=> [nil, 2, 7, 4, 9, 7, 4]
irb(main):310:0> h.add(12)
=> [nil, 2, 7, 4, 9, 7, 4, 12]
irb(main):311:0> h.del
=> [nil, 4, 7, 4, 9, 7, 12]
irb(main):312:0> h.del(3)
=> [nil, 4, 7, 12, 9, 7]
```
JAVA

こんにちは。簡単な繰り返し処理を記したいと思います。


    for(i=0;i<10;i++){
      System.out.print("*");
        for(j=10;j>0;j--){
            System.out.print(" ");
        }
      System.out.println("");
    }


『回答』


*
**
***
****
*****
******
*******
********
*********
**********
VRChat向けモデルをVRM化しようとするとUnityEditorごとクラシュする場合の対処法

#はじめに
私が遭遇したがネット上に情報が見つけられなかったパターンを記す

#ボーンの自動認識が失敗している
##結論
左手のボーンがまるごと割り当てられていないのに気づかず、UniVRMからExportしようとしたら、
Unity Editorごとクラッシュした。修正すると正常に完了する

##トレース
まず普通に変換しようとしてクラッシュ

UniVRMを古いバージョン(0.4X系)も新しいバージョン(0.5X系)も試したし、
Unityも5.6.3p1から2017, 2018まで色々試したがどれも同じようにクラッシュする。

Blenderでfbxを吐き直してみてもダメ、調整しようとしてみてもダメ。

Editor.logを確認してみたところ、以下のようなトレースログが出ており、
ボーン関係ではないかと推測。

```
0x0000000141719C47 (Unity) Animator::GetBoneTransform
0x00000001417A4885 (Unity) Animator_CUSTOM_GetBoneTransformInternal
0x00000000505D8F45 (Mono JIT Code) (wrapper managed-to-native) UnityEngine.Animator:GetBoneTransformInternal (int)
0x00000000505D8DB7 (Mono JIT Code) [C:\buildslave\unity\build\artifacts\generated\common\modules\Animation\AnimatorBindings.gen.cs:1153] UnityEngine.Animator:GetBoneTransform (UnityEngine.HumanBodyBones) 
0x0000000050622627 (Mono JIT Code) [E:\UnityProjectFrom201902\tovrm\Assets\VRM\Scripts\Format\VRMExporter.cs:77] VRM.VRMExporter:_Export (UniGLTF.glTF,VRM.VRMExporter,UnityEngine.GameObject) 
0x000000005061F8A3 (Mono JIT Code) [E:\UnityProjectFrom201902\tovrm\Assets\VRM\Scripts\Format\VRMExporter.cs:32] VRM.VRMExporter:Export (UnityEngine.GameObject) 
0x00000000505D63E9 (Mono JIT Code) [E:\UnityProjectFrom201902\tovrm\Assets\VRM\Scripts\Format\VRMExporSettings.cs:271] VRM.VRMExportSettings:Export (string,System.Collections.Generic.List`1<UnityEngine.GameObject>) 
0x00000000505D5844 (Mono JIT Code) [E:\UnityProjectFrom201902\tovrm\Assets\VRM\Scripts\Format\VRMExporSettings.cs:235] VRM.VRMExportSettings:Export (string) 
0x00000000505D559F (Mono JIT Code) [E:\UnityProjectFrom201902\tovrm\Assets\VRM\Scripts\Format\Editor\VRMExporterMenu.cs:42] VRM.VRMExporterWizard:OnWizardCreate () 
```

humanoidボーンの割当を確認してみたところ、
・左手のボーンが認識されていない
・頭のボーンが変な認識になっている
ことがわかり、そこを手動で割り当て直したところ正常にVRMが生成できるようになった。

なお、これらのボーンの割当をあえて中途半端にしてみたところ、
UniVRMがNullReferenceExceptionを吐き始めた(Crushはしない)ので、すべてきちんと治す必要があるらしい。

#遭遇したアバター
以下

【VRChat想定３Dモデル】傀儡人形 キョンシーくん【Quest版対応】
https://booth.pm/ja/items/1567182

なお、こちらのアバターはVRChat向けにはあらかじめ製作者側でセットアップ済みのUnitypackageが同梱されているため、
VRChatでは極めて正常に動作していた。

fbxを読み込み直す必要があるのは改変時や他形式に変換する必要がある場合のみだったため、
自動認識に失敗していることに気がつくのが遅れた。(なおなぜか右手は正常に認識されるのが謎である)

本モデル特有の問題ではなく、Unityがhumanoidボーンの自動認識に失敗しうるモデルであれば同様の問題が発生すると思われる。
ArchLinux LDAP Authセットアップ

Arch Linuxのインストールガイドに従って作業を行う。
 
# 環境
* Windows 10
* VirtualBox 6.0.12 r133076
* archlinux-2019.09.01-x86_64.iso

# CDブート
"Boot Arc Linux (x86_64)" を選択

キーボードの設定

```
# loadkeys jp106
```

# パーティション作成

```
Command (? for help):n
Permission number: 1
First sector : (default)
Last sector  : +1M
Hex code or GUID : ef02 // select BIOS boot partition

Command (? for help):n
Permission number: 2
First sector : (default)
Last sector  : (default)
Hex code or GUID : 8300

Command (? for help):p
... EF02   BIOS boot partition
    8300   Linux filesystem

Command (? for help):w
Do you want to proceed? (Y/N): y
```

# フォーマット＆マウント

```
# mkfs.xfs /dev/sda2
# mount /dev/sda2 /mnt
```

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

```
# vim /etc/pacman.d/mirrorlist
以下の2つを最上位に持ってくる
## Japan
Server = http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch
## Japan
Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch

# pacstrap /mnt base base-devel
（/mntの下にパッケージがインストールされる）

```

# パッケージインストール後の設定

```
# genfstab -U -p /mnt >> /mnt/etc/fstab
# arch-chroot /mnt
# pacman -S --needed vim
# alias vi='vim'
# vim /etc/locale.gen

   en_US.UTF-8 UTF-8
   ja_JP.UTF-8 UTF-8
   のコメントを外す

# locale-gen
# echo LANG=en_US.UTF-8 > /etc/locale.conf
# export LANG=en_US.UTF-8
# echo KEYMAP=jp106 > /etc/vconsole.conf

# ln -f -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# hwclock --systohc --utc
# echo localhost > /etc/hostname

# passwd
(rootのパスワードを入力)

# pacman -S grub dosfstools
# grub-install --target=i386-pc /dev/sda
# grub-mkconfig -o /boot/grub/grub.cfg

# systemctl enable dhcpcd

# exit
# umount -R /mnt
# reboot
```

CD Bootの画面で `"Boot existing OS"` を選択する。

# ホームのマウント
他のディストリビューションで利用しているホームパーティションを
マウントする。

```
# vi /etc/fstab
/dev/sdb	/home	xfs  defaults	0 0
# mount /dev/sdb /home
```
# 仮ユーザー追加
Arch Linuxのmakepkgコマンドはrootでは実行できない。
そのため、LDAP認証の設定が完了するまでは仮のユーザーで作業する。

```
# useradd -u 5000 -g users -G wheel -m dummy
# passwd dummy
# visudo
%wheel ALL=(ALL) ALL  <--- コメント解除
```

```
$ sudo pacman -S --needed tmux
$ sudo pacman -S --needed openssh
$ sudo systemctl start sshd
$ sudo systemctl enable sshd
```

```
$ sudo systemctl stop dhcpcd
$ sudo systemctl disable dhcpcd
$ sudo shutdown -r now
```

```
$ sudo vi /etc/systemd/network/20-wired.network
[Match]
Name=enp0s3

[Network]
Address=192.168.11.79/24
Gateway=192.168.11.1
DNS=192.168.11.1

$ sudo systectl start  systemd-networkd
$ sudo systectl enable systemd-networkd
```

IPアドレスを確認する。

```
$ ip addr
```

以降、puttyなどで接続する。


（中断）
Mojave で SD Memory Card Formatter for macOS は動く

> RaspberryPi 用の SD カードを Mac で初期化したい。
> 
> でも、なんか `diskutil` コマンドや「ディスクユーティリティ」アプリで FAT32 フォーマットすると無駄な領域ができるらしいので、ブートパーティションも心配せずに安心して簡単にフォーマットする方法はないか。

## TL;DR

> SD Association 公式の「SD メモリカードフォーマッター（Mac 用）」は macOS Mojave（OSX 10.14.6）でも動作しました。

- [ダウンロートページ](https://www.sdcard.org/jp/downloads/formatter/eula_mac/index.html) @ 公式

## TS;DR（人柱になる）

### SD Association 公式「SDメモリカードフォーマッター」

まぁ、SD カードをフォーマットしたいなら `diskutil` コマンドや「ディスクユーティリティ」を使えって話しなのですが、操作に悩まず、簡単で安心できるツールが欲しかったのです。

SD カードのフォーマット・ツールはサード・パーティーからも色々出ているものの、多機能だったり広告が入っていたり。

そこで、SD メモリカード規格の制定団体である「[SD アソシエーション](https://ja.wikipedia.org/wiki/SD%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)」自身も「`SD Memory Card Formatter`」という Win/Mac 用のフォーマット・アプリを提供しているので、ツールを使うのであれば公式を使いたいところ。

ところが、動作 OS 一覧に Mojave（OSX 10.14）がいません。（2019/09/23 現在）

|   | SD/SDHC/SDXC |
|:--|:--|
| Windows | Windows 7 (32/64-bit)<br>Windows 8 (32/64-bit)<br>Windows 8.1 (32/64-bit)<br>Windows 10 Version 1511 (32/64-bit)<br>Windows 10 Version 1607 (32/64-bit)<br>Windows 10 Version 1703 (32/64-bit)<br>Windows 10 Version 1709 (32/64-bit)<br>Windows 10 Version 1803 (32/64-bit) |
| Mac | Mac OS X 10.7 Lion<br>Mac OS X 10.8 Mountain Lion<br>Mac OS X 10.9 Mavericks<br>Mac OS X 10.10 Yosemite<br>Mac OS X 10.11 El Capitan<br>macOS 10.12 Sierra<br>macOS 10.13 High Sierra |

- [オペレーティングシステム | システム要件](https://www.sdcard.org/jp/downloads/formatter/index.html) 公式より

[「SD Memory Card Formatter Mojave Raspberry Pi」でググってみた](https://www.google.com/search?q=SD+Memory+Card+Formatter+Mojave+Raspberry+Pi)のですが、タイトルからわかる動作検証情報がありません。

今後のこともあるので人柱になるべく、以下の組み合わせで試してみました。操作も簡単。問題なく初期化され、ラズパイの OS を書き込む時に使う balenaEtcher でも問題なく書き込んでくれました。

- MacBookPro Early 2015 + macOS Mojave（OSX 10.14.6）
- SD カードライター： Digio CRW-38M56BK

### フォーマット手順

<img width="85" alt="スクリーンショット 2019-09-23 23.19.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78776/6ee83dc5-fada-7402-e7b9-fc7ba2593a89.png">


公式サイトからダウンロードして起動すると、フォーマット先を選んで「フォーマット」を押すだけ。簡単。

<img width="100%" alt="スクリーンショット 2019-09-23 23.10.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78776/9dcfd0cb-eca8-9de0-826c-8e4990f49a87.png">
<img width="100%" alt="スクリーンショット 2019-09-23 23.12.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78776/a2833175-fd54-0941-ff5e-759d529ad610.png">
<img width="100%" alt="スクリーンショット 2019-09-23 23.13.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78776/f076b949-4dd8-9bf0-0c61-0ce65f80e1d1.png">
<img width="100%" alt="スクリーンショット 2019-09-23 23.13.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78776/7e10553f-8a3c-ee1d-9b2e-c2aa056325e8.png">
pandas の SettingWithCopyWarning で苦労した話

pandasのSettingWithCopyWarningで苦労したので本当に恥ずかしいけれど自戒のためにメモ。

# SettingWithCopyWarningとは
偉大なる先人がめちゃくちゃ詳しい説明を書いてくれているので読むべし。
[pandasのSettingWithCopyWarningを理解する (1/3)](https://linus-mk.hatenablog.com/entry/2019/02/02/200000)
ざっくり言っちゃうと参照渡し（でいいのかしら）があるがゆえの警告的なものだと解釈した。
元のデータの一部を抽出→そのうち一部へ代入した場合、「元のデータのその部分」を修正したかったのか、「一部を変更した新しいデータ」を作りたかったのかどっちかわからないよ、という感じ？


# 実際起こったこと
適当に値とかColumn名は変えているけれど、まあこんなDataFrameがあったとして

```python
print(df_origin)
>>>
         yyyymm  human  monster  animal
4901620  201908   3208      184     567
4981645  201412    958     6972     169
5120608  201907    157       71       9
5236191  201501    790     7257     139
5320444  201111      1     2468     793
```

2〜4列目の合計の列を作って、yyyymmの列と合計の列だけ抜き出して、yyyymmの列を`datetime64`型に変換してやりたかったわけですよ。

```python

df_origin["living"] = df_origin[["human", "monster", "animal"]].sum(axis=1)
df_analyze = df_origin[["yyyymm", "living"]]
df_analyze["yyyymm"] = pd.to_datetime(df["yyyymm"], format="%Y%m")
print(df_analyze)
>>>
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  df_analyze["yyyymm"] = pd.to_datetime(df["yyyymm"], format="%Y%m")
            yyyymm  living
4901620 2019-08-01    3959
4981645 2014-12-01    8099
5120608 2019-07-01     237
5236191 2015-01-01    8186
5320444 2011-11-01    3262
```
警告によるとスライスの代わりに`.loc`を使えと。ということで警告の出た3行目を`.loc`で書き換えてみたのだけれど、まったく警告が解消される様子がなく。`pandas_to_dataframe`使うのが初めてだったのでそこ起因かなと思って一度list型に変換してから代入してみたりしてみても効果なし。
いや結局、「なぜ警告されたのか」をしっかり把握していなかった私が悪いのですが。

# 何が問題だったのか
結論、さっきの[pandasのSettingWithCopyWarningを理解する (1/3)](https://linus-mk.hatenablog.com/entry/2019/02/02/200000)後半に書かれている「隠れた連鎖」関連が原因だった。
そもそも警告文をちゃんと読まずに後半の
`Try using .loc[row_indexer,col_indexer] = value instead`
ここだけ見て「代わりに.loc使ってね」と解釈していたのが良くなかった。
`A value is trying to be set on a copy of a slice from a DataFrame.`
ちゃんと前半のこっち「DataFrameからスライスされたものに値をセットしようとしています」ってのを理解しなければいけなかった…。つまり、

```python

df_origin["living"] = df_origin[["human", "monster", "animal"]].sum(axis=1)
df_analyze = df_origin[["yyyymm", "living"]] 
#このdf_analyzeは「df_origin内のyyyymm列＆living列」をスライスしたもの
#（pandasからすると書いた人間が「df_originそのものを変更するため参照した」のか、
#「切り出したものを別に使いたい」のかわからない）
df_analyze["yyyymm"] = pd.to_datetime(df["yyyymm"], format="%Y%m")
#この書き方そのものは全く問題ないが
#df_analyzeが前述の通り「参照」なのか「コピー」なのか不明なのでエラーが出る
print(df_analyze)
```
と、いうことでした。

なので、

```python

df_origin["living"] = df_origin[["human", "monster", "animal"]].sum(axis=1)
df_analyze = df_origin[["yyyymm", "living"]].copy()
#.copy()で、参照ではなくコピーであることを明示する
df_analyze["yyyymm"] = pd.to_datetime(df["yyyymm"], format="%Y%m")
print(df_analyze)
```
こうすれば無事SettingWithCopyWarningは解消されましたとさ。めでたしめでたし。

# 教訓
**警告文（エラー文）はちゃんと読むべし**
読んでたつもりだったんだけどやっぱり英語読みたくない甘えが出てしまった。
私のような人が1人でも減ってくれることを祈って、ここに自らの恥を晒します。
Scala2.13ではIterator#toSeqがListを返すようになった

#~ 2.12
Scala 2.12までは、Iteratorに対するtoSeqはStreamを返すようになっていました。

```powershell:2.12.10
scala> val xs = Iterator(1, 2, 3).toSeq
xs: Seq[Int] = Stream(1, ?)
```

#2.13 ~

Scala 2.13からは、toSeqがListを返すようになっています。

```powershell:2.13.1
scala> val xs = Iterator(1, 2, 3).toSeq
xs: Seq[Int] = List(1, 2, 3)
```

#何が問題になるか
元のIteratorのサイズが非常に大きかった場合、処理に時間がかかるか、最悪返ってこなくなります。

```powershell:2.12.10
scala> val xs = Iterator.continually(1).toSeq
xs: Seq[Int] = Stream(1, ?)  ← すぐ返ってくる
```

```powershell:2.13.1
scala> val xs = Iterator.continually(1).toSeq 

(永遠に返ってこない...)
```

#結論
`toSeq`と書いている以上、上記のような実際の具象型に依存した書き方をしないのが賢明と思います。
具象型の特性が必要なら、`toList`のように具体的に指定されたメソッドを使用すべきです。

#おまけ ~ そもそもScala 2.13ではStreamは非推奨 ~
ちなみにScala 2.13では`scala.collection.immutable.Stream`は非推奨となっており、代わりに`scala.collection.immutable.LazyList`を使うことが推奨されています。
Streamとの違いは、tail(先頭以外)だけでなくhead(先頭要素)もlazyになったことです。
[Scala 2.13 の LazyList は Stream[CallByNeed[A]]](https://xuwei-k.hatenablog.com/entry/2018/05/11/101000)

上記のIteratorをLazyListに変換したい場合、toLazyListというメソッドはないので、`LazyList#from`メソッドを使用します。

(19/10/1 追記･修正)
`toLazyList`という名のメソッドはないものの､`to`メソッドを使えばLazyListを含む統一的なコレクション変換が可能であることをコメント欄で@gakuzzzz様に教えていただきましたので追記します｡
@gakuzzzz様のコメントも合わせてご参考にしてください｡



```powershell
scala> val xs = LazyList.from(Iterator.continually(1))
xs: scala.collection.immutable.LazyList[Int] = LazyList(<not computed>)

// toメソッド使用版
scala> val ys = Iterator.continually(1).to(LazyList)
ys: scala.collection.immutable.LazyList[Int] = LazyList(<not computed>)
```

Streamと同様、結果がすぐ返ってきました。
ちなみにStreamにも同じように`Stream#from`メソッドがありますが(非推奨)、こちらは先頭要素のみ評価されているのがわかります。[^1]

```powershell
scala> val xs = Stream.from(Iterator.continually(1))
xs: scala.collection.immutable.Stream[Int] = Stream(1, <not computed>)
```



<br>
最後までお読み頂きありがとうございました｡
質問や不備についてはコメント欄か[Twitter](https://twitter.com/ka2_kamaboko)までお願いします。

[^1]: Streamに関しては`toStream`メソッドもありますが、どっちにしろ非推奨なので今後使用することはないと思います。
Pythonでプロキシ設定取得あれこれ（Windows）

**注意 : 本記事はWindows向けです。**

# プロキシ設定は面倒
こんにちは、キャベツレタスです。
突然ですが、皆さんはプロキシに対してどういった印象をお持ちですか？
ちなみに僕は「嫌い」です。
プロキシに対する不満を全て書けるほど人間の寿命は長くないので割愛しますが、要約すると、

 - プロキシ設定がめんどくさい（いちいちコマンドに `--proxy` とつけるのが面倒）
 - プロキシ設定のあるアプリ・ソフトウェアが少ない（スマホ版LINE等プロキシ非対応のものが多い）
 - 仮にプロキシ設定ができても訳わかめなエラーを吐く（npm,apt等）

です。
こんなプロキシ設定ですが、システムからプロキシ設定を取得する方法は色々あります。
以下、例を示していきたいと思います。

# プロキシ設定の取得
以下の例では、プロキシの形式を

```python
global_proxy = {
    "http": "http://host:port/",
    "https": "https://host:port/",
}
```
とします。
requestsモジュールで使える形式にしました。

## コマンドライン引数から取得
恐らく最もポピュラーだと思われます。
コンソールアプリを作るなら必須とも言えます。
`sys.argv` を使ってコマンドライン引数を取得します。

```python
if "--proxy" in argv:
    try:
        p = argv[argv.index("--proxy") + 1]
        global_proxy = {
            "http": p,
            "https": p
        }
    except IndexError:
        print("警告: \"--proxy\"オプションが指定されましたが、アドレスが指定されなかったため"
            "プロキシを無効にしました。")
else:
    global_proxy = None
```

## 環境変数から取得
環境変数を取得する方法はいくつかありますが、今回は `os.environ` を使います。

```python
if "http_proxy" in [x.lower() for x in list(environ.keys())] or "https_proxy" in [x.lower() for x in list(environ.keys())]:
    global_proxy = {
        "http": environ["http_proxy"].replace("http://", "").replace("/", "")
    }
    if "https_proxy" in [x.lower() for x in list(environ.keys())]:
        global_proxy["https"] = environ["https_proxy"].replace("https://", "").replace("/", "")
    else:
        global_proxy["https"] = environ["http_proxy"].replace("https://", "").replace("/", "")
else:
    global_proxy = None

```
requestsモジュールではプロキシに `http://` や `/` が入っているとエラーを吐くので、 `.replace("http://", "").replace("/", "")` を使って取り除きます。

## 「設定」アプリ（レジストリ）から取得
「設定」アプリで変更されたプロキシ設定はレジストリに記録されます。
winregモジュールを使って、その設定を取り出しましょう。

```python
import winreg
path = r"Software\Microsoft\Windows\CurrentVersion\Internet Settings"
key = winreg.OpenKeyEx(winreg.HKEY_CURRENT_USER, path)
p, regtype = winreg.QueryValueEx(key, 'ProxyServer')
e, regtype = winreg.QueryValueEx(key, 'ProxyEnable')
try:
    s, regtype = winreg.QueryValueEx(key, 'AutoConfigURL')
except FileNotFoundError:
    s = None
e = bool(e)
winreg.CloseKey(key)
if bool(e):
    global_proxy = {
        "http": p,
        "https": p
    }
elif s is not None:
    global_proxy = {
        "http": s,
        "https": s
    }
else:
    global_proxy = None
```

# まとめました
上の３つをまとめたGistを公開しました。
[Windowsのプロキシ設定を取得する関数](https://gist.github.com/kazukazuprogram/729855cd90fccb60e4d52ed318577471)
実行すると、返り値としてrequests形式のプロキシを返します。

# 最後に
今回この記事を書いて、意外とプロキシ設定の取得方法があることに少し驚きました。
今後は、

 - プロキシ設定の自動構成スクリプト（ `*.pac` ）の解析方法
 - インターネットオプションのプロキシ設定（下記） 
![proxy.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244946/8c577199-4c02-ffca-4293-80672e0b4069.png)

等、調べていけたらと思っています。
上記設定をPythonで取得する方法をご存じの方いらっしゃいましたら、コメント欄の方で教えていただけたら幸いです。

# 追記
## 2019/12/02
プロキシ設定の自動構成スクリプト（ `*.pac` ）は、[こちら](https://qiita.com/koharite/items/731fcf5146c7b0c4e800)の記事を参考に、以下のようにしました。

``` Python
global_proxy = {
    "http":"http://proxypachost/proxy.pac",
    "https":"http://proxypachost/proxy.pac"
}
```
また、インターネットオプションのプロキシ設定は設定アプリ（レジストリ）と連携しているので不要です。
Github Pages手軽すぎる。Bootstrap, wow.js, bubbly-bgでプロフィールページ作った

# 経緯

  - wordpressでブログとプロフィールページを公開してるが最近全く更新しない
  - 更新しないが、wordpressの乗ってるKAGOYAのVPSには毎月支払いがある。独自ドメインも毎年支払い
  - MOTTAINAI
  - ブログ → Qiitaとnoteに移植を決断
  - プロフィールページ → ?
  - Github Pagesの存在を知る

# 作る

## アクセス出来るようになるまで
https://pages.github.com/
![Screen Shot 2019-09-23 at 22.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130427/fa34085f-e8e6-2163-db20-cbd3dcaa49d8.png)


  - Githubで「自分のusername.github.io」というリポジトリを作る。
  - 適当にindex.html置く
  - https://自分のusername.github.io/ でindex.htmlの内容表示される
  - 終
  - 手軽すぎる

## ページ作るために土台をどっかから持ってくる
https://startbootstrap.com/themes/freelancer/
![Screen Shot 2019-09-23 at 22.17.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130427/2d4dbe2b-a9b0-c5da-0d1e-73462f68c340.png)

  - 探したところ↑が良い感じだったので採用
  - ダウンロードしたzip解凍してhtmlとcssを自分用に修正
    - 問い合わせ機能周りは削除
    - PORTFOLIOという見出しを使う程ポートフォリオが無いので、見出しをACTIVITYにして誤魔化す(悲しい)
    - 画像変えたり追加したり(画像をレスポンシブにするにはimg-fluidをclassに追加すれば良いのを学んだ)
    - とにかくレイアウトは基本的に雰囲気で修正:pray:
  - ちなみに、落としてきたstartbootstrap-freelancerでnpm install、npm startすると勝手にhttp://localhost:3000/ でindex.htmlを表示、どっかファイルに修正入ったら画面自動更新してくれるので修正作業楽チンだった

## 何か動きが欲しくなったのでスクロールに合わせてアニメーションさせるやつ探す

https://qiita.com/tiwu_official/items/989834406c25deccee8b
![Screen Shot 2019-09-23 at 22.46.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130427/826d4da2-18bb-e481-7a6b-7b32faeff2d1.png)

  - この記事に辿り着く。(4年前の記事:pray:)
  - 記事通りやって楽しくアニメーション追加完了
  - Animate.cssの公式サイトでサンプル試せるのが良い
  - https://daneden.github.io/animate.css/

## 背景が寂しいのでアニメーションするやつ探す
https://www.miso.blog/js-bubbly-bg/
![Screen Shot 2019-09-23 at 22.54.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130427/75c8f01b-2712-ba21-ce8d-28dac677588a.png)

  - この記事に辿り着く。
  - 泡がボワボワするの気に入ったので採用。
  - 記事通りやって背景ボワボワ化完了

## 終
ここまでやって結構満足したので作成終了。
出来上がったやつ↓
https://teriyakiegg.github.io/
![Screen Shot 2019-09-23 at 23.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130427/f4919606-8463-7891-a2c8-5dfef7398557.png)

リポジトリ↓
https://github.com/teriyakiegg/teriyakiegg.github.io/

# 感想

  - プログラミング要素無し(迫真)
  - なかなか自分で気に入るものが出来上がった(尚、ACTIVITYの中身は見なかったことに)
  - 作業の合間で「脳死で使える面白いjsないかな~」と探したりするのも楽しいひとときだった
  - Github Pages使って何かまた実験したい
「低レイヤを知りたい人のためのCコンパイラ作成入門」の紹介

# 始めに
Rui Ueyama氏による、C言語コンパイラ作成の入門書。
そんなに多くは無いですが、幾つかのコンパイラコンパイラ系書籍を読んだのですが今一つ理解が深まりませんでした。
そんな中、今回紹介する
「[低レイヤを知りたい人のためのCコンパイラ作成入門](https://www.sigbus.info/compilerbook)」は私に”構文解析”を教えてくれました。

`氏は書中で「本」と記述されていますので今回の記事中でも「低レイヤを知りたい人のためのCコンパイラ作成入門」を本として紹介したいと思います。`

本書の中でも書かれていますが、従来の解説では目的の言語の仕様を決めてからコンパイラの各開発ステップの解説を行うと。
この場合全てのステップが終わるまで全体を試すことが出来ない。
この点を回避するために、まずは極端にも思えるほど簡単な内容の言語仕様を決定し、それを完成させる。
その後言語仕様をバージョンアップし、再度コンパイラを完成。
このステップを繰り返すことで最終的にC言語（っぽい）コンパイラの完成を目指すのが本書です。

目からウロコ的であり、よくよく考えたら私、個人的には普段そんな開発手法をとっていました。

そして、この手法による解説を1項目ずつ読み進めながら実際にコンパイラを書いていくことでこれまで理解できなかった構文解析部分が理解できるようになりました。

# コラム
本書の中でちょいちょい挟まれているコラムも大変興味深く、これまで考えたこともなかったC言語の進化の歴史を垣間見ることが出来ました。
また、CPUなどのよりハードウェア側の事情を解説されているところなども、とても勉強になりました。

# 今後について
私は6月ごろの内容で一度通読し、実際にコンパイラを作って試してみました。
久しぶりにサイトを訪れた所情報が更新されていました。
6月以降に追加されていた内容は読んだだけで実際に試してはいませんが、時間があれば試してみたくなる内容でした。

今回記事にするに当たり、改めて全体を読み返してみました。
本書冒頭に「このオンラインブックは執筆中です。完成版ではありません。」と記述されていたり、そのほかにも執筆途中を思わせる記述がありました。今後もアップデートされていくものと思います。

# 最後に
今回久しぶりにサイトを見た所内容が大きく更新されていたこともあり、著者の方への感謝の気持ちも込めてQiitaの記事にしようと思いました。
コンパイラやその周辺技術について関心のある方は一度ご覧になり、実際にご自分の手でコンパイラを作ってみてはいかがでしょうか。
為になること請け合いです。
私は6月当時、本書の内容に従ってコンパイラを作成するのにおよそ1か月ほどかかりました。
内容が更新されていることもあり、今ですともう少し時間がかかるかもしれません。

本書で学習した内容を踏まえ、現在ラズベリーパイで動作する[PLC](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%96%E3%83%AB%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9)を作成中です。[>>こちら](https://twinnoze-lab.com/)
積年の目論見に手を付けられたのも、素晴らしい本書を公開していただいたRui Ueyama氏のおかげだと思います。ありがとうございます。
Drupal 8 で ログインロックの回数を変更する

今回はDrupal8のログイン処理で、デフォルトで機能するログインロックの回数を変更してみます。
意外と下記エラーがでて困っている人も多いのでは？

```
There have been more than 5 failed login attempts for this account. It is temporarily blocked. Try again later or request a new password.
```

セキュリティ的にはロックを掛けること自体はいいんですが、実運用を考えるとデフォルトの5回は少ないですし、ロック解除用のモジュールをいれていないと、DBを直接更新しなければロックが解除できないので・・・とりあえず今回は7回にしてみます。

Drupal7では、 

```
$conf['user_failed_login_user_limit'] = 10000;
```

や　

```
$conf['user_failed_login_ip_limit'] = 10000;
```

のように設定していましたが、Drupal8では下記の場所もしくは、「環境設定」>「設定と同期」から確認できます。インストール時は5回に設定されているようです。

```
$ cat core/modules/user/config/install/user.flood.yml
uid_only: false
ip_limit: 50
ip_window: 3600
user_limit: 5
user_window: 21600
```

次は設定変更です。「環境設定」>「設定と同期」を開きます。今回は、単一設定’（user.flood）のインポートなので、「インポート」>「シングルアイテム」を押下して、下記のように入力して「インポート」を押下すれば完了です。

![ひとるのインポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225890/be2a0dba-704f-3aa2-bcf6-3d90b5c5e69b.png)

エラーなく取り込めたら、実際に、ログインを失敗してみてください。7回失敗してアカウントロックされた旨が表示されるはずです。
PowershellとOutlookとJavascriptの時刻(内容見直し中)

PowershellでOutlookのある期間内のメールや予定の抽出をしようとした時に混乱したのでメモする。ちょっとしたことなので、どこかで他の記事にマージするかも…

# Itemsの絞り込み
Outlookのメールや予定を表す`Items`というオブジェクトを扱う([Itemsの説明](https://docs.microsoft.com/en-us/office/vba/api/outlook.items))。`Items`では対象を絞り込むメソッドが2種類あり、

* `Find(condition)` + `FindNext()`
    * 1つ1つ走査する(イテレータのイメージ)
    * https://docs.microsoft.com/en-us/office/vba/api/outlook.items.find
* `Restrict(condition)` + `foreach`
    * 集合を操作する(配列のイメージ)
    * https://docs.microsoft.com/en-us/office/vba/api/outlook.items.restrict

という操作ができるようになっている。

## 時刻で抽出する
`condition`は文字列で`[Subject]='Test'`のように、条件を指定する。時刻の場合、PowershellとOutlookの時刻の表現はどちらもローカル時間だが、フォーマットが違うので注意が必要。

* `Get-Date`: ローカル時間。
* `Items.Find`: ローカル時間。フォーマットは`'MM/dd/yyyy hh:mm'`で、引用符が必要。
* `Items.Restrict`: `Items.Find`と同じ。

なので、例えば現在時刻以降の開始日を条件とするなら、

```powershell
$now = Get-Date
$condition= "[Start]>'{0}'" -f $now.ToString("MM/dd/yyyy hh:mm")
```

* [特定の期間に部分的または全体的に発生する予定を予定表で検索する](https://docs.microsoft.com/ja-jp/office/vba/outlook/how-to/search-and-filter/search-the-calendar-for-appointments-that-occur-partially-or-entirely-in-a-given)
* [日付/時刻を比較してアイテムをフィルターにかける](https://docs.microsoft.com/ja-jp/office/vba/outlook/how-to/search-and-filter/filtering-items-using-a-date-time-comparison)

### 繰り返しの会議を抽出する
定例会は「繰り返し」設定されている場合、何も指定しないと最初の1つしか抽出されない。「[Search the Calendar for Appointments that Occur Partially or Entirely in a Given Time Period](https://docs.microsoft.com/ja-jp/office/vba/outlook/how-to/search-and-filter/search-the-calendar-for-appointments-that-occur-partially-or-entirely-in-a-given)」によると、以下の手順が必要とのことだった。

1. [Start]でソートする
2. フィルタをかける

> (原文抜粋) To include recurrent appointments in the query, it sets **Items.IncludeRecurrences** to True and then sorts the items by the **AppointmentItem.Start** property. It then builds the query for all appointments that begin on or before myEnd, and end on or after myStart. It then applies the query to items in the default calendar folder, using the ** Items.Restrict** method, and then prints the start time of all the returned appointments.

これはPowershellでは以下のようになる。

```powershell
$mapi = $outlook.GetNameSpace("MAPI")

# 予定表(フォルダ)を表す数値
# olFolderCalendar = 9
# https://docs.microsoft.com/ja-jp/office/vba/api/outlook.oldefaultfolders
$calendarFolder = $mapi.GetDefaultFolder( $olFolderCalendar ) 
$items = $calendarFolder.Items;

# 検索条件
$now = Get-Date
$condition= "[Starts]>'{0}'" -f $now.ToString("MM/dd/yyyy hh:mm")

# ここから、繰り返しの予定を検索するための準備
$items.IncludeRecurrences = $true;
$items.Sort( '[Start]' );
$filtered = $items.Restrict( $search )

# 結果を見てみる
# olAppontmentはItemがAppointment Itemであるかを確認するための数値
# https://docs.microsoft.com/ja-jp/office/vba/api/outlook.olobjectclass
foreach( $item in $$filtered ) {
    if( $item.Class -eq $olAppointment ) {
        "{0} {1}" -f  $item.Subject, $item.Start.DateTime | Write-Host
    }
}

# Javascript
new Date( 数値 )とすることで、1970/1/1 0:00:00(GMT) からのミリ秒で時間を表せる。`valueOf()`メソッドで数値に戻せるので、グラフで表示したいときに役立つ。
Oracle シングルクオーテーションのエスケープ

「q演算子」というもので「'」（シングルクオーテーション）を
エスケープできるらしい。

やりたかったことは、ストアドプロシージャでパラメータで与えられた
ファイルシステムのパスに置かれたファイルをハンドリングすること。

レガシーシステムの都合でパスがころころ変わるもので、
DIRECTORYオブジェクトを都度REPLACEする作戦を検討。
＃ALTER DIRECTORYってないんですね。

で、普通にSQL実行するなら

```
CREATE OR RELACE DIRECTORY DIR_HOGE AS '/hoge/hoge'
```

とするところ、プロシージャ内のEXECUTE IMMEDIATEにSQL
渡すときどうするんだいと。

シングルクオーテーション連続でもエスケープできるらしいですが
見にくい、わかりにくい。

「q演算子」で任意の文字を、リテラルの開始・終了のデリミタとして
指定し、リテラル内でシングルクオーテーションを使用可能とする。

```
'CREATE OR REPLACE DIRECTORY
  DIR_HOGE
 AS
  ' || q'[']' || param_dir || q'[']' 
```

的なリテラルをEXECUTE IMMEDIATEに渡してやりたいことは達成。
そもそもBLOBハンドリング等の際にいろんなディレクトリみたい時に
DIRECTORYオブジェクトをREPLACEするというやり方が正しいのか
どうか自体わかっていないのですが・・・。
iOS13にしたらモーダル表示がデフォルトになるのでスプラッシュに戻れちゃったの巻

# iOS13にしたらモーダル表示になって困った
画面遷移がデフォルトでモーダル（親画面の上に子画面を表示する）になったようで、たとえばスプラッシュを作ってる場合とか、メインのViewControllerの後ろにスプラッシュが見えてて、メインのビューをクイっと下げるとスプラッシュに戻れて何も操作できなくなってゲームオーバー、みたいな悲しい事態になりました（汗

んで、いろいろ調べたら[stackoverflow](https://stackoverflow.com/questions/56435510/presenting-modal-in-ios-13-fullscreen)で同じ悩みを抱えている外人のバディたちがいたので超絶意訳してエントリーにしておきます。

## Segue使ってる場合

↓とりあえずこれをsegueに設定しましょう。KindとPresentationがミソ。
![スクリーンショット 2019-09-23 22.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24741/fdc6e566-8d66-09ce-011d-0a0b4ecc227c.png)

## .swiftで子のViewControllerをpresentしている場合

↓この例はStoryboardだけど、要は起動するViewControllerに.modalPresentationStyeを設定しましょう。

```swift
let sb = UIStoryboard(name: "Main", bundle: nil)
let vc = sb.instantiateInitialViewController() as! UITabBarController
vc.modalPresentationStyle = .overFullScreen
self.present(vc, animated: true, completion: nil)
```

しかし、まいどまいど、Appleさんは開発者泣かせですね。そこに痺れる、憧れるぅぅ。
URRRYYYY
iPhoneをデュアルSIM化してみた。

![74CA13D9-511C-4698-85F5-BCE07C4DAA28.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41550/b731b8d6-f5e4-29b0-ffa6-8c992057c7d5.jpeg)


iPhone 11 Proを買ったので、早速デュアルSIMを設定してみた。

最近のiPhoneには、物理SIMスロットと、バーチャルSIMスロットの2つのSIMスロットが搭載されている。

iPadには、かなり前から搭載されていた。

バーチャルなSIMは、eSimといって、
海外旅行とか行った時、プリペイドSIMを簡単に設定する用途に使うもの。

日本では、格安SIMのiijmioしかやっていない。
データプランのみ。

今、初期費用1件円、3ヶ月6GB 1500円のプランから1000円引きのキャンペーンをおこなってる。

https://www.iijmio.jp/hdd/esim/

いま、使えるのはDOCOMO回線のみ。

今回、iphoneに搭載されているeSimは、 DSDS（デュアルSIM/デュアルスタンバイ）という形式て、どちらかをメインデータ通信回線として設定できるのだけと、2つのSIMを同時に使うことがてきるのが特徴。

二つの回線で待ち受けてデータ通信をするのだ。

速くなると言われてるけど。。

僕の場合は、ダブル格安SIMなので、そもそも遅いんだけど、月末はパケットを追加しまくってるので、2回線登録していた方が安くすむ。

日本での本来の使い方は、3大キャリアで契約していて、月末にパケットを追加しているひとは、eSimを入れておくと、格安SIMの方の格安なパケットを使ってくれるのでお得。

あとは、softbankやauのキャリアの人で、DOCOMO回線しか繋がらない場所に行った時。
便利。僕の実家もDOCOMOしか使えないので、こういう時助かる。

あと、災害とかで、一部のキャリアが繋がりづらくなったときの保険としても役に立つ。
rails-tutorialをcloud9環境でやっていて、githubにコミットできなかった場合の対処法

# rails-tutorialをGit-hubでやっていてpushができない場合の対処
rails-tutorialには

$ git remote add origin git@bitbucket.org:\<username>/toy_app.git
$ git push -u origin --all

という記述がある
私は、git_hubでやっているので、このgit@bitbucket.org:\<username>箇所をgithubのURLに書き換えて実行した
が

これを実行しようとした際にPermission denied (publickey).
と表示された。

書かれている通り、git-hubに公開鍵が登録されていないためにアクセスが拒否される

https://qiita.com/tanden/items/7919de68951a0c2ae9ac
この記事に書かれている対処法でほとんどOKながら
2019/09/23現在のcloud9環境は公開鍵がデフォルトで作られるみたいなので

cat ~/.ssh/id_rsa.pub
コマンドを実行

ssh-rsa ほにゃらら　ip-なんとか

という形式で公開鍵が表示されるのでこの鍵を
https://github.com/settings/keys
のNew SSH Keyボタンを押してgithub側に登録

したらばめでたくGithubにコミットできるようになりました！
pyenv環境で入れたanacondaのjupyter notebookのCSSを変更する

# はじめに
- `jupyter notebook css` とかでググるとCSSの変更、反映方法がヒットしますが、<br>pyenvで入れたanacondaに入っているjupyter notebookのCSSの場合、どのパスにあるCSSを変更すればいいか分からずハマったため調べました。

# 環境
- OS
    - mac os mojave
- pyenv 上のanaconda
    - anaconda3-5.3.1

# やること
- 以下のパスにあるCSSを変更してjupyter notebookを再起動するだけ。

```
$ ~/.pyenv/versions/anaconda3-5.3.1//lib/python3.7/site-packages/notebook/static/notebook/css/override.css
```

# 補足
- 上記のCSSでfontなどを指定しても、デフォルトフォントのほうが優先されてしまう場合があります。<br>その場合は CSS上で `!important` を指定することで反映が可能です。
【ServiceNow】Developer Instanceを作成しよう

※2023/08/07更新
本記事ではServiceNowのDeveloper環境作成に必要な手順を記載します。

・ServiceNowへユーザ登録方法
・Developer環境のリクエスト方法

本情報はどのような方に有用か。
・ServiceNow案件に従事している方、これから従事する予定がある方。
・ServiceNowの操作を覚える必要がある方。

以下手順となります。

#1．ユーザー登録

以下のURLにアクセスし、画面右上の[REGISTER]をクリックします。
https://developer.servicenow.com/
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/d079c611-3a99-b105-1d77-46130cc9a002.png)

登録画面が開くので、情報を入力します。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/773bacdf-07e2-5f34-d351-1bacc4bdf8e5.png)

登録が完了するとメールが送信された旨、メッセージが表示されます。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/c942d11e-048a-a4f2-16d2-1fb9f23eba0b.png)

メールの内容を確認の上、[Verify Email]をクリックします。
<img width="900" alt="ValidationmailPNG.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/29023534-9445-03af-7d8d-d5bab0076d9f.png">

#2.　環境へログイン

再度以下のURLにアクセスし、画面上部の[LOG IN]をクリックします。

https://developer.servicenow.com/

登録時のメールアドレス・パスワードを入力し、ログインします。
ログイン後、[ServiceNow Develpper Agreement]が表示されるので、
内容を確認し問題なければ[Check here to accet the ServiceNow Developer Agreement.]にチェックをつけて、[Submit]をクリックしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/0c26a351-55cf-9d06-4e36-afcfdb498b97.png)

各種情報を入力します。
※Zip/Postal codeは郵便番号なんですね…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/f56a17ad-015f-9fca-0f73-51971e2e1a91.png)

ログインできたことを確認します。

#3 Developer Instance 払い出し

ログイン画面後の上部のタブにある、[MANAGE]＞[Instance]と選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/8534b619-837c-c721-00fb-ea5f2f78d21f.png)

[My Instance]画面が開くので、[Request Instance]を選択しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/be1ec5d4-c979-dec0-78eb-106e215bc918.png)


※現在では確認されません。
~~個人アカウントを作成する理由を聞かれるので答えましょう。~~
~~私は[Develope & Validation]としました。~~

Instanceのバージョンを選択します。
2023/08/07現在、選択できるバージョンは、Utah、Tokyo、Sandiegoです。
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/a6da7747-8254-1249-4de1-17ad2d110d8f.png)

時間をおいて、My Instanceが出来たことを確認します。
※開発環境はdev＋数字5桁で管理されています。
※開発環境は10日間ログインがないと削除されてしまいます。
　Remaining inactivityの欄が該当するので注意しましょう。
※adminのパスワードが下方の方に表示されていますので忘れないように。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/f153fa0e-c446-73fb-6cdc-fbc4e31a60da.png)

URLのリンクをクリックし、ログインします。
![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/8be7f8cb-c7fb-15ad-42e9-b7578899c0d6.png)

※ログインパスワードを変更します。
![13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/85750efb-ce2e-573d-f71c-f0111b46cb01.png)

ログイン可能であることを確認します。
![14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/b96fac40-70fc-133d-e0ec-aff9a0d61e96.png)

※ServiceNow Instanceを上手く払い出せたあなたに豆知識を1つ。
adminのパスワードを忘れた場合は以下の画面から[Action]＞[Reset admin password]で実施できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399414/9136f6f3-97bb-e195-0474-6a770b4c64f6.png)

引き続きServiceNow技術情報を投稿できるよう学習していきたいと思います。
今後とも宜しくお願い致します。
vueをいじったので、忘れないうちにアウトプット

最近、仕事でvueをいじったので、忘れないうちにアウトプット（笑）
取り急ぎ、アウトプットしているので、文面がひどいです。
徐々に肉付け、整形していきますので、ご容赦ください。

# 参考サイト
## 実装関連
https://jp.vuejs.org/v2/guide/instance.html
https://vuex.vuejs.org/ja/api/#vuex-store
https://element.eleme.io/#/en-US
## 単体テスト関連
https://vue-test-utils.vuejs.org/ja/
https://jestjs.io/docs/ja/getting-started
## デバック関連
https://qiita.com/hashimoto-1202/items/c81f5d4c271eef16d957

# いいなーって思ったポイント
## htmlとCSSとJavaScriptとデータモデルが分かれていること
レガシーな画面しか経験の無かった自分としては、データモデルが分かれているのは、非常に分かり易かったです。
しかも、データモデル自体が構造的でわかり易いです。

## ライフサイクル
まだ、created と mouned しか使ってなくて、理解できていませんが、ライフサイクルがあるのは面白い。
理解出来次第、書いていきます。

１．beforeCreate
２．created
３．beforeMount
４．mounted
５．beforeDestory
６．destroyed

## computed、watch、filter
各々面白い機能だな～って思っています。
まだ完全な使い分けを理解していないので、理解出来次第書いていきます。

# わからんーって思って、ハマったポイント
## vue と vuex と ライブラリの分けがわからんかった。
たぶん、勘のいい人は気にしないと思いますが、私はハマッてしまったので。

要するに、既に実装してある機能を参考に作ろうとすると、その実装されている「タグ」がどういう動きをするのか？がわからん！
って思って、調べるときに、どの本家のサイトを見ればよいのか？が分からなくなってしまいました。

Google先生に聞くと、情報は出ます。ただ、本家の情報が知りたいじゃないですか。
そのときに、「このタグ」って。。。

っていうのに、だいぶハマリました。

# 単体テストについて
vue-test-utils とはいえ、jestも知っておく必要あった。
ただ、jest は神かと思いましたｗ どんなファンクションもモック化できるので隅々までUTが実施できますね。

# デバックについて
GoogleChromeのデベロッパーツールのコンソールは、神ですねｗ
javascirptを試しに実行ができます。
あと、console.log で出力した内容が表示されます。

あと、chromeの拡張機能のVue.js Devtoolsは、必須ですね。。
なんでか？というと、データモデルがvueの記載方法で確認ができるからです。

何かを操作して、値がどう変わった？って見るときに、Devtoolsが無いと、console.logでログ出力するか、HTML上で判断するしかないですが、Devtoolsだとそのまま見れます。
DonkeycarでCoral EdgeTPUを使って自動走行のログ

```shell-session
(env) pi@donkeypi:~/mycar$ python3 manage.py drive --model models/mypilot_edgetpu.tflite --type=coral_tflite_linear
using donkey v3.1.0 ...
loading config file: /home/pi/mycar/config.py
loading personal config over-rides

config loaded
cfg.CAMERA_TYPE PICAM
cfg.CAMERA_TYPE PICAM
PiCamera loaded.. .warming camera
Adding part PiCamera.
Starting Donkey Server...
Adding part LocalWebController.
Adding part ThrottleFilter.
Adding part PilotCondition.
Adding part RecordTracker.
WARNING:tensorflow:From /home/pi/donkeycar/donkeycar/parts/keras.py:18: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead.

WARNING:tensorflow:From /home/pi/donkeycar/donkeycar/parts/keras.py:18: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.

"get_model_by_type" model Type is: coral_tflite_linear
loading model models/mypilot_edgetpu.tflite
INFO: Initialized TensorFlow Lite runtime.
finished loading in 2.86547589302063 sec.
Adding part FileWatcher.
Adding part FileWatcher.
Adding part DelayedTrigger.
Adding part TriggeredCallback.
Adding part CoralLinearPilot.
Adding part DriveMode.
Adding part AiLaunch.
Adding part AiRunCondition.
Init ESC
Adding part PWMSteering.
Adding part PWMThrottle.
Tub does NOT exist. Creating new tub...
New tub created at: /home/pi/mycar/data/tub_35_19-09-23
Adding part TubWriter.
You can now go to <your pi ip address>:8887 to drive your car.
Starting vehicle...
8887
/usr/lib/python3/dist-packages/picamera/encoders.py:544: PiCameraResolutionRounded: frame size rounded up from 160x120 to 160x128
  width, height, fwidth, fheight)))
^CShutting down vehicle and its parts...
Stopping PiCamera
Part Profile Summary: (times in ms)
+--------------------+-------+-------+-------+--------+
|        part        |  max  |  min  |  avg  | median |
+--------------------+-------+-------+-------+--------+
|      PiCamera      |  0.51 |  0.02 |  0.04 |  0.04  |
| LocalWebController |  1.13 |  0.02 |  0.05 |  0.04  |
|   ThrottleFilter   |  1.07 |  0.01 |  0.02 |  0.01  |
|   PilotCondition   |  0.51 |  0.01 |  0.01 |  0.01  |
|   RecordTracker    |  1.39 |  0.01 |  0.03 |  0.02  |
|    FileWatcher     |  8.35 |  0.04 |  0.09 |  0.06  |
|    FileWatcher     |  4.09 |  0.02 |  0.04 |  0.02  |
|   DelayedTrigger   |  1.23 |  0.01 |  0.01 |  0.01  |
| TriggeredCallback  |  0.78 |  0.01 |  0.01 |  0.01  |
|  CoralLinearPilot  | 43.62 | 11.86 | 15.15 | 12.82  |
|     DriveMode      |  1.66 |  0.01 |  0.11 |  0.10  |
|      AiLaunch      |  0.74 |  0.01 |  0.02 |  0.02  |
|   AiRunCondition   |  0.75 |  0.01 |  0.01 |  0.01  |
|    PWMSteering     | 11.78 |  1.39 |  1.92 |  1.56  |
|    PWMThrottle     | 13.22 |  1.34 |  1.78 |  1.42  |
|     TubWriter      | 99.20 |  1.63 |  2.81 |  1.87  |
+--------------------+-------+-------+-------+--------+
```
fzfでDockerコンテナに一発で入る

# 背景

Dockerコンテナに入るには

```
docker exec -it <コンテナ名> bash
```
などとすると思いますが、よく

- コンテナ名何だっけ
- コンテナ立ち上がってたっけ
- そもそもコマンド何だっけ

となっていました。

# 本題

ので、エイリアスを設定しました。以下を```~/.bashrc```などに追記してください。
fzfは各自インストールしてください。(https://github.com/junegunn/fzf)

```
alias dox='docker exec -it `docker ps --format "{{.Names}}" | fzf` bash'
```

```docker ps --format "{{.Names}}"```で起動中のコンテナのコンテナ名一覧を取得し、fzfにパイプで渡しています。

コマンドを実行して入りたいコンテナを選択するとそのコンテナに入れます。

#まとめ

fzfは便利。
バイナリファイル読み書き(C#)

# 概要
C#でバイナリファイルを操作することってそんなにないけどメモ

- 読み込みにはBinaryReader、書き込みにはBinaryWriterを使う
- Closeし忘れを防ぐため、usingステートメントを使う

### 読み込み

ファイルが存在しない場合は"System.IO.FileNotFoundException"がスローされる。

```cs
// インスタンス生成
BinaryReader reader = new BinaryReader(File.OpenRead(<ファイル名>));
```

**バイナリファイルの内容をコンソール出力するサンプル**

```cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace BinaryFileReadSample
{
    class Program
    {
        static void Main(string[] args)
        {
            // "BinaryFile1.bin"を開く
            using (BinaryReader reader = new BinaryReader(File.OpenRead("BinaryFile1.bin")))
            {
                int ret;
                byte[] buf = new byte[4];

                // 4byte読み取り
                ret = reader.Read(buf, 0, 4);

                // 1byte以上読み取ったか
                // ※インデックスがファイルの末尾だった場合、Read()は0を返す
                while (ret > 0)
                {
                    // 読み取った内容を16進数としてコンソールに出力
                    for (int i = 0; i < ret; i++)
                    {
                        Console.WriteLine(buf[i].ToString("x"));
                    }

                    ret = reader.Read(buf, 0, 4);
                }
            }
        }
    }
}
```

### 書き込み

ファイルが存在しない場合は作成される。

```cs
// インスタンス生成
BinaryWriter writer = new BinaryWriter(File.OpenWrite(<ファイル名>)
```
**文字列をファイルに書き込み、その内容をコンソール出力するサンプル**

```cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace BinaryFileWriteSample
{
    class Program
    {
        static void Main(string[] args)
        {
            // "BinaryFile2.bin"を開く
            using (BinaryWriter writer = new BinaryWriter(File.OpenWrite("BinaryFile2.bin")))
            {
                byte[] buf = new byte[] { 0x01, 0x02, 0x03, 0x04 };

                // 書き込み
                writer.Write(buf);
            }


            // 書き込んだ内容を読み込んでコンソール出力
            using (BinaryReader reader = new BinaryReader(File.OpenRead("BinaryFile2.bin")))
            {
                int ret;
                byte[] buf = new byte[4];

                ret = reader.Read(buf, 0, 4);

                while (ret > 0)
                {
                    for (int i = 0; i < ret; i++)
                    {
                        Console.WriteLine(buf[i].ToString("x"));
                    }

                    ret = reader.Read(buf, 0, 4);
                }
            }
        }
    }
}
```

# おわりに
良いサンプルってなかなか思いつかない
【NLP入門】jetson_nanoで会話アプリで遊んでみる♪

今回はjetson_nanoでどこまでできるか、会話アプリを実行できるところまでやってみた。
[インストールは前回の続き](https://qiita.com/MuAuan/items/d8bfaf6eb82ef59a3e80)である。
###pykakasiのインストール

```
$ pip3 install pykakasi
...
Successfully built klepto dill pox
Installing collected packages: dill, pox, klepto, pykakasi
ERROR: Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/usr/local/lib/python3.6/dist-packages/dill'
Consider using the `--user` option or check the permissions.
```
Permission denied:が出たので、--userを付けて、再度実行します。

```
$ pip3 install pykakasi --user
Collecting pykakasi
  Using cached https://files.pythonhosted.org/packages/b9/64/d8d6ed5401aca2b9513f8012f2e5a7f805886ddc3012de3c40953c9fa671/pykakasi-1.1-py2.py3-none-any.whl
Collecting klepto (from pykakasi)
Requirement already satisfied: six in ./.local/lib/python3.6/site-packages (from pykakasi) (1.12.0)
Collecting pox>=0.2.6 (from klepto->pykakasi)
Collecting dill>=0.3.0 (from klepto->pykakasi)
Installing collected packages: pox, dill, klepto, pykakasi
Successfully installed dill-0.3.0 klepto-0.1.7 pox-0.2.6 pykakasi-1.1
```
無事にインストール出来ました。
以下の例を動かしてみます。

```py
# coding: utf-8
from pykakasi import kakasi
kakasi = kakasi()
kakasi.setMode('H', 'a')
kakasi.setMode('K', 'a')
kakasi.setMode('J', 'a')
conv = kakasi.getConverter()
filename = '本日は晴天なり.jpg'
print(filename) # 本日は晴天なり.jpg
print(type(filename))
print(conv.do(filename))
```
無事に以下の出力が得られました。

```
$ python3 pykakasi_ex.py
本日は晴天なり.jpg
<class 'str'>
honjitsuhaseitennari.jpg
```
###mecab-python3をインストールする
前回失敗した、mecab-python3のインストールを実施する。
今回は、この参考のとおりに実施する。

[ubuntu 18.10 に mecab をインストール](https://qiita.com/ekzemplaro/items/c98c7f6698f130b55d53)
以下で、無事にインストール出来ました。

```
$ sudo pip3 install mecab-python3
```
ただし、今回は途中でpip3のupgradeを実施してしまったので、以下の参考のようにpipを再インストール実施しました。
[Python pip3 – pip upgradeした後 「cannot import name ‘main’ 」error](https://kokensha.xyz/python/python-pip3-cannot-import-name-main-error-after-upgrading-pip/)

```
$ sudo python3 -m pip uninstall pip && sudo apt install python3-pip --reinstall
```
###pyaudioのインストール
会話アプリは一応、音声会話出力をしているので、pyaudioを利用しています。
ということで、今回はマイクもスピーカもないので削除すればいいと思いますが、後々のためにインストールしておきます。
[PyAudioのインストール| Python備忘録](https://engineer-fumi.hatenablog.com/entry/2018/03/28/214700)
以下で簡単にインストールできました。

```
$ sudo apt-get install python3-pyaudio
```
###会話アプリの変更
ほぼ、同じアプリが動きましたが、以下二点変更しました。
①上記に記載しましたが、音声出力は今回は削除しました
②ファイルの入出力を変更しました。特に、QAはcsvから\t区切りのtxtにしました。
ということで、天気とブルべのQAの読込は以下の関数で実施しました。

```py
def train_questions(mecab,line):
    questions = []
    answers = []
    if line=="天気":
        file = 'conversation_wu.txt'
    elif line=="ブルべ":
        file = 'conversation_ju.txt'
    for line in open(file, "r", encoding="utf-8"):
        cols = line.strip().split('\t')
        questions.append(mecab.parse(cols[0]).strip())
        answers.append(cols[1])
    return questions, answers
```
###コード全体は以下に置きました。
・[something2speak/auto_QAconversation_nano.py](https://github.com/MuAuan/something2speak/blob/master/auto_QAconversation_nano.py)
###まとめ
・会話アプリをJetson_nanoで動かしてみた
・動きはほぼ同様なタイミングで回答が返ってくるから十分使えそうである

・日本語入力が簡単には出来なかった
・マイク認識までは出来たので、音声入出力もやれそうな気がする
【Noby API】ノビィ取り扱い説明書　コマンド機能編【CotoGoto】

こんにちは。この記事は
[【Noby API】ノビィ取り扱い説明書【CotoGoto】](https://qiita.com/blue_islands/items/0d5a9ea5f4911e959924)
[【Noby API】ノビィ取り扱い説明書　使い方編【CotoGoto】](https://qiita.com/blue_islands/items/20c61c1737873117dcf9)
の続きの記事になります。

今回はコマンド機能についてを説明していきます。

# 1. コマンド機能について
コマンド機能は文章中に設定した単語が登場した場合、登録したコマンドIDを返却します。
![NOBY_API_取扱い説明書_2019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/3eff952c-bd2f-2d34-d336-27017ac97043.png)

# 2. コマンド機能を使って言葉とプログラムを連動する
こちらの説明は、[使い方編](https://qiita.com/blue_islands/items/20c61c1737873117dcf9)のプログラムの拡張になります。
最初に[コマンド機能の設定](https://app.cotogoto.ai/webapi/console)からコマンドの登録を以下のように登録します。

![FireShot Capture 050 - Noby API ・ CotoGoto(コトゴト) - app.cotogoto.ai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/d2f40a9f-da40-54fd-4488-d2adbc5f9389.png)


## 2-1. プログラムの追加
プログラム以下のfunctionを追加します。

```HTML:index.html
・
<script>
function makeSpotsDice(){
    var spotsmax = 6;//最大値
    var spotsmin = 1;//最小値
    var spotsdice = Math.random()*(spotsmax - spotsmin + 1) + spotsmin;
    spotsdice = Math.floor(spotsdice); //少数以下を丸める
    return spotsdice;
}
・
・
</script>
・
```


## 2-2. 前回プログラムを修正
前回のプログラムを以下のように修正します。

```HTML:index.html
・
<script>
function send() {
    $.get('https://app.cotogoto.ai/webapi/noby.json',
      {
        appkey: 'YOUR_API_KEY',
        text: $('#message').val()
      },
      function(data) {
       console.log(data);
        if ('dice' == data.commandId) {
          $('#reply').html(makeSpotsDice() + 'の目が出たよ。');
        } else {
          $('#reply').html(data.text);
        } 
    );
}
</script>
・
```


# 3. 最後に
チャットをしているときに「サイコロを振って」と会話するとサイコロの目を返してくれると思います。
このように他の機能を作成したいときに参考にしてください。

※ソースについては[Github](https://github.com/livlog-llc/noby-handson)に上げてあります。
「大胸筋が揺れる画像メーカー」を実装してしまった

# お待たせしました
(※誰も待ってない)

**画像の揺らしたい部分に白黒半透明のフィルターをかけた画像を表示して、スマホを揺らすと、錯視で揺れるように見える**という。

これがTwitterで流行っているらしい。**断じてやましい気持ちはない**が、面白いと思った。


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">スマホ乳揺れ技術をテンプレにした。半透明度を下げて囲むと揺れる。 <a href="https://t.co/sMR6zhbTBb">pic.twitter.com/sMR6zhbTBb</a></p>&mdash; ぺろ(原稿作業中) (@fZnHNsrh8yzwyAe) <a href="https://twitter.com/fZnHNsrh8yzwyAe/status/1175464068519362560?ref_src=twsrc%5Etfw">September 21, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

使用例は下記リンクから確認できる。
http://blog.esuteru.com/archives/9383727.html

# 今回作ったもの

大胸筋が揺れる画像メーカー(※大胸筋以外も揺らせます)
http://82159f46d0d56af3.main.jp/quake/index.html

GIF画像による使い方説明
![yureru.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330109/250aa01f-1ad9-7235-0073-9eb20c2fd5a5.gif)

ご覧のありさまである。もちろん、このプリンは**揺れる**。
※画質が落ちない程度に「アップロード画像のサイズ」の項目から画像サイズを大きくしたほうが揺れが分かりやすい。

# なぜ揺れるように見えるのか
> この錯視は立命館大学の北岡明佳教授による有名な「踊るハート錯視」な応用して作られているそう。
[北岡明佳教授の公式サイト](http://www.psy.ritsumei.ac.jp/~akitaoka/JAGDA2016.html)より
> 「踊るハートの錯視」は脳の情報処理速度による錯視で、高コントラストな部分は情報処理が速く、低コントラストの部分は情報処理が遅いために起こる錯視。

[引用元](https://www.danshihack.com/2019/09/22/junp/chichiyure.html)

教授って人たちは本当にすごい(語彙力)

# 実装内容
フロー

- 画像をアップロードして表示できるようにする
- 画像の上にテンプレを半透明にした画像を重ねる
- 保存ボタンを作る

実装は[ここ](http://wada811.github.io/sample/imageCover/index.html#imageCover6)と[ここ](https://oar.st40.xyz/article/133)を参考にした。尚、CodePenだとダウンロードは動作しない。

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="sapporo_east_k" data-slug-hash="OJLrarz" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Quake">
  <span>See the Pen <a href="https://codepen.io/sapporo_east_k/pen/OJLrarz">
  Quake</a> by かんちゃん (<a href="https://codepen.io/sapporo_east_k">@sapporo_east_k</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

三連休使って何やってんだろう俺。

# 名前の由来となったツイート
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">大胸筋が歩いてる錯覚 <a href="https://t.co/ypu6YMS0SN">pic.twitter.com/ypu6YMS0SN</a></p>&mdash; じゃがバター (@okatsuka1206) <a href="https://twitter.com/okatsuka1206/status/1175652026652360705?ref_src=twsrc%5Etfw">September 22, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# TODO
- Twitterに投稿できる機能をつける
- 半透明のフィルターをSVGにする
- スマホだと使いづらいのでUI/UX改善