OmniAICreator/Qiita-1.07M huggingface dataset:
Realmでモデルのクラス名を変更したい時は…

リファクタリングの一環で、Realmのモデルのクラス名を変更した時のメモです。
（クラス名は変更したいけど、データは引き続き使いたい、というケース。）

# `RealmClass` の `name` を指定すればOK

例えば、 `Dog` というクラス名を `Animal` に変更したい時。

```kotlin
open class Dog : RealmObject() {
    var name: String = ""
}
```

`@RealmClass` アノテーションを定義して、 `name` に元のクラス名を書けばOKでした。

```kotlin
@RealmClass(name = "Dog")
open class Animal : RealmObject() {
    var name: String = ""
}
```

---
※ ちなみに、**`@RealmClass("Dog")`** **`@RealmClass(value = "Dog")`** と書いてもOKです。 （ref: https://github.com/realm/realm-java/pull/6149 ）
CSS 勉強メモ0620

画面をスマホサイズに合わせたい時は<meta>でコンテント属性に以下を記載。

```html
<meta name="viewport" content="width=device-width,initial-scale=1">
```

画面のサイズによってスタイルを変え場合
以下は画面幅が600-800pxの時に<body>に背景色をつける。
@mediaの次に条件を記載

```
@media(min-width: 600px) and (max-width: 800px){
  body{
    background: skyblue;
  }
}
```

以下は画面の大きさが0~599px,600~799,800~
で条件を分けて表示しているサンプルコード

```

/* common */
/* small screen */

body{
  margin: 0;
}

.image{
  background: pink;
  height: 100px;
}

.text{
  background: gray;
  height: 100px;
}

aside{
  display: none;
  /* 初めは見えないように noneにする */
}



/* @media(min-width: 0px) and (max-width: 599px){
  body{
    background: skyblue;
  }
} 
これは0-599は初期条件と同じのため特にいらない、600pxになると勝手に切り替わるので２つ目のmaxは特にいらない*/

/* 小さい画面から基本的に作り上げていく */

/* medium screen */
@media(min-width: 600px){
  section{
    display: flex;
  }

  .image{
    width: 200px;
  }

  .text{
    flex: 1;
  }
  

/* large screen */
@media(min-width: 800px){
  section{
    width: 800px;
    margin: 0 auto;
  }
  aside{
    display: block;
    /* ここでblockとすることで800px以上で表示となる */
    width: 160px;
    background: plum;
  }
}

/* 全てに共通する内容を全ての条件に書くのは面倒なので、最後に書いたものが優先されることを利用して最後にだけ記載する */
gitのバージョンアップデートがうまく適応されない時の対処法

最近`git`の脆弱性アップデートがあったので更新しようとしたら上手く最新のバージョンが適応されず困りました。

## Gitのアップデート
バージョンを確認してアップデートする

```
$ git --version
git version 2.24.3 (Apple Git-128)
$ brew upgrade git
git-2.26.1 installed
```
これでインストールできたかな？って思って確認するとバージョンが変わっていない。

```
$ git --version
git version 2.24.3 (Apple Git-128)
```

## Gitに正しいPathを通す
とりあえず`git`の居処を探してみよう。

```
$ which git
/usr/bin/git
$ /usr/bin/git --version
git version 2.24.3 (Apple Git-128)
```
でも実はgitの居場所はもう一つある。

```
$ /usr/local/bin/git --version
git version 2.26.1
```

こっちのバージョンがアップデートされてるみたい。
なので、gitのパスをこっちに通せばオッケー。

```
$ vi ~/.bashrc
```
ここに下記の一文を追加します。私は`bashrc`だけど人によっては`bash_profile`の人もいると思います。


```
export PATH=/usr/local/bin:$PATH
```
これで無事`git`のアップデートは完了しました！
めでたしめでたし。

```
$ git --version
git version 2.26.1
```
CSSで画面のテキスト・画像などの縦位置を指定したいって？

# そんな時はvertical-alignプロパティを使おう！
vertical-alignプロパティとは、テキストの縦軸の位置を指定するためのプロパティです。

上端揃え・中央揃え・下端揃え以外にも、複数の設定方法があります。読みやすさ・使いやすさに直結するプロパティなので、使い方を覚えておくのがおすすめです！
※vertical-alignが使えるのは、「インライン要素」と「テーブルセル」だけなので注意。

## vertical-alignプロパティの使い方

| 値               |       意味　　　　   |   使用例           |
|:-----------------|------------------:|:------------------:|
| top              |            行の上端 |        top        |
| middle           |            行の中央 |       middle      |
| bottom           |            行の下端 |        bottom     |
| text-top         |        フォントの上端 |         text-top   |
| text-bottom      |        フォントの下端 |      text-bottom   |
| baseline         |       フォントの基準線 |      baseline      |
| 数値 + %          |    指定した数値の位置 |      20% , -30%    |
| 数値 + 単位        |       フォントの基準線 |      10px , -0.2em |


```css

.img {
  vertical-align: middle;
}
```
Virtualboxのホストオンリーアダプタ設定

ゲストOSからホストOSにデータを渡したく色々調べていたところ、virtualboxでホストオンリーアダプタの設定が必要だということがわかった。
そこで、仮想マシンの設定を開いてネットワークで追加しようとしたが、ホストオンリーアダプタを選択すると未選択と言われて設定ができない状態。
##解決策
macの上バーの「ファイル」から「ホストネットワークマネージャー」を選択。
作成をクリックするとホストオンリーアダプタが作成され、先ほどの仮想マシンの設定に戻るとうまくいった。
CSSの特殊な色変更方法

# 通常の指定方法は？
色の名前や、カラーコードで指定することが一般的。

```css

/* 色の名前で指定 */
h1 {
  color: pink;
}

/* カラーコードで指定 */
h1 {
  color: #ccc;
}

```

## rgbaプロパティ
色・透明度を指定するすることが出来るプロパティ。
赤・緑・青には0 ~ 255までの数値を指定し、透明度には0 ~ 1までの数値を指定します。透明度は0が0%、0.5が50%、1が100%で数字が小さいほど透明度が高いです。
[rgbaジェネレーター](https://generator.web-alpha.info/rgba/)を使うことで、10段階で比べてくれるので好きな色を選択できます。

```css

h1 {
  /* color: rgba(赤 , 緑 , 青 , 透明度) */
  color: rgba(255, 0, 0, 1.0);
}

h1 {
  /* 透明度が1.0(100%)の場合は省略できる */
  color: rgba(255, 0, 0);
}
```

## hslaプロパティ
色の他に、彩度や輝度、透明度を指定できる。
値を指定する時の覚え方としては、「Hue（色相）」,「Saturation（彩度）」,「Luminance（輝度）」,「Alpha（透明度）」と、とhslaの頭文字を取った順番になっていると覚えればよい。
色相は0～360の値で指定する。
彩度は、0%が無彩色、100%が純色となります。
輝度は、一番暗い0%から100％に向かって明るくなります。
透明度は、0〜1の間で指定します。70%の場合は0.7という具合です。

```css

h1 {
  /* color: hsla(色相, 彩度, 輝度, 透明度) */
  color: hsl(180, 100%, 50%, 1);
}

h1 {
  /* 透明度が1.0(100%)の場合は省略できる */
  color: hsl(180, 100%, 50%);
}
```
zshで大文字小文字を区別しないで補完

# 大文字のものも小文字のまま補完可能へ

```
# 補完機能を有効にする
autoload -Uz compinit && compinit

# 小文字でも大文字ディレクトリ、ファイルを補完できるようにする
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
```

を`.zshrc`に追記する。

ググっても`zstyle`の行しか書かれてないことが多いが、
そもそも補完機能を有効にする必要がある。
Python で zip 展開（日本語ファイル名対応）

## zip の中のファイル名

zip ファイルを展開（解凍）すると、書庫内の各データは元のファイル名で展開されます。すなわちファイル名情報も zip ファイル内に格納されています。

zip ファイル内に格納されている各ファイル名のエンコーディングは、現バージョンの zip の仕様だと UTF-8 フラグの有無を指定することができるようですが、 UTF-8 以外のエンコーディングを具体的に指定することができません。

歴史的に、従来より日本語ロケールの Windows で zip ファイルを作成すると（ツールにもよりますが）、ファイル名情報は Shift_JIS (CP932) で書き込まれます。最近の Linux や Mac は UTF-8 がほとんどです。

異なる OS で作成された zip ファイルを展開するときに、 UTF-8 フラグが付いていれば（最近の展開ツールであれば）問題なく展開することが可能ですが Shift_JIS (CP932) が使われている場合、 UTF-8 でないことはわかっても、具体的なエンコーディング情報が不明なためファイル名の文字化けが起きることがあります。



このように異 OS 間で zip ファイルをやりとりする際の問題はよく知られていますが、これとは別の理由で Python3 の ZipFile ライブラリでも正しくファイル名を認識できず文字化けが発生することがあります。

## Python3 の ZipFile ライブラリ

ZipFile ライブラリでは、 UTF-8 フラグがあれば UTF-8 として、そうでなければ CP437 として、バイト列を文字列に変換する仕様となっています。

* https://github.com/python/cpython/blob/3.7/Lib/zipfile.py#L1358-L1365

このため CP932 でファイル名情報が保管された zip ファイルを、 `ZipFile.extractall()` などを使って展開しようとするとファイル名が文字化けされた状態で展開されてしまいます。

対処するためには `ZipInfo.filename` を CP437 としてバイト列に戻したのち、正しいエンコーディングで文字列に戻し、それを `ZipFile.extract(ZipInfo)` とします。

```python
import zipfile

f = r'/file/to/path'

with zipfile.ZipFile(f) as z:
    for info in z.infolist():
        info.filename = info.filename.encode('cp437').decode('cp932')
        z.extract(info)
```

上記は、本来のエンコーディングを CP932 と決め打ちで処理していますが、実際はそうとは限らないので、エンコーディング判定とか例外処理が必要です。

## が……　駄目っ……！

前述のコードを使って展開する処理を Mac で実行する場合は問題ないのですが、 Windows で展開しようとする場合は、ファイル名によってはエラーが発生します。

実は `ZipInfo.filename` は `os.sep` を `/` に置換された状態のファイル名となっています。つまり Windows の場合 `\` が `/` に置換されています。

* https://github.com/python/cpython/blob/3.7/Lib/zipfile.py#L347-L351

CP437 は1バイト文字のエンコーディングで、 ASCII 印字文字（ `\x20` - `\x7f` ）においては ASCII 互換ですので、（本来マルチバイト文字の一部であっても）この置換処理が行われてしまいます。その結果、バイト列に戻した際 `b'\x90\x2f'` といったパターンが出現してしまいます。

Shift_JIS (CP932) では2バイト目の `\x2f` は絶対に使用しないようになっているため、このようなバイト列を CP932 として再び文字列に変換しようとしたときにデコードエラーが発生してしまいます。

この問題が起きるのは、2バイト目が `\x5c` の文字。

そう。いわゆる「ダメ文字」です。（ダメな理由はこれとは別でしたが）

いやー。 Shift_JIS (CP932) のダメ文字とかここ10年くらい存在をすっかり忘れてました。しかも `\x2f` に置換したことで Shift_JIS (CP932) として不正なバイト列となるという変化球で来るとは。

## 解決法

置換処理が行われる前の（ CP437 としてデコードされた）ファイル名情報は `ZipInfo.orig_filename` に格納されていますので、こっちを使うことで解決することができます。

```python
import os
import zipfile

f = r'/file/to/path'

with zipfile.ZipFile(f) as z:
    for info in z.infolist():
        info.filename = info.orig_filename.encode('cp437').decode('cp932')
        if os.sep != "/" and os.sep in info.filename:
            info.filename = info.filename.replace(os.sep, "/")
        z.extract(info)
```
Link-cut treeで部分木更新をする

Link-cut treeで部分木になんか(sumとか)載せるやつを先に知っておくことを推奨します ( https://beet-aizu.hatenablog.com/entry/2019/06/08/221833 )
上の記事の更に読者層が限定されたバージョンです
さて、部分木にaddとかやりたくないですか ? やりたいですよね ???
Toptree使えばなんでもできるっていうのは置いといてLCTで頑張ってみます
扱えるのは遅延セグ木に乗るような作用素の要件に加えて作用素に逆元があって打ち消しが可能なやつです(例えばaddはこれを満たします)

遅延セグ木のノリで遅延を部分木に流そうとするとたくさん生えてるlight edge全部見ることになって多分大変なことになります
これは親からたくさんある子に一気に流すのが悪いので、代わりに必要なときに子から親の遅延情報を引っ張ってくる感じで伝播させます。
具体的にはsubtree addでは

 - heavy edgeへもlight edgeへも同じ遅延情報を使う
 - 各ノードは変数`added`, `cancel`, `sum`を持つ(それぞれ初期値0)
 - subtree addするときはcutしてexposeしてそのノードの`added`に足したい分だけ足す(その後cutしたのを繋ぎなおす)
 - `added`の伝播  
    ノード`x`が親から遅延情報取ってくるとき  
     1. `x->added += x->parent->added - x->cancel`
     2. `x->sum += x->size * (x->parent->added - x->cancel)`
     3. `x->cancel = x->parent->added`
    
    をします。
    たくさんあるlight edgeで繋がった子から違うタイミングで使われるので`added`は絶対にクリアされません。
    ただそれだと同じ遅延情報を2回3回引っ張ってきてしまうので`cancel`に「最後に親から取ってきたときの親の`added`」を入れておくことで差分だけ取ってくるようにします。
    親が変わるときは適切に`x->cancel`を`x->parent->added`に合わせる必要があります。(特にrotateとかでheavy edgeをいじるだけのときもやります)
    また、必然的に(「ノード`x`の遅延情報はこれからノード`x`に適用するもの」方式に対して)「ノード`x`の遅延情報はノード`x`に既に適用されている」方式を取ることになります。

コードは... [よすぽさんのgithub](https://github.com/yosupo06/library-checker-problems/blob/master/datastructure/dynamic_tree_subtree_add_subtree_sum/sol/correct.cpp)
このコードではevertのreverse遅延は「ノード`x`の遅延情報はこれからノード`x`に適用するもの」方式をとっています。紛らわしいですね
なお一箇所オーバーフローさせてhotmanさん困らせてましたごめんなさい。
ペアプロもチームビルディングの一つ

## チームビルディングは仲良しグループではない
チームビルディングから何を想像しますか？
仲良しグループのような・・・遊び仲間のような・・・
というイメージがあると思いますが、相互にリスペクト、適度な緊張感と危機感を持たなければならないと思います。以前に関わった生産管理システムをアジャイル開発で実施したプロジェクトでの出来事です。
20代のエンジニア間で水と油のような関係の二人がいました。
このプロジェクトでは自工程完結（出来る限り作業内で良品をアウトプットするやり方）を実現できる方法としてペアプログラミンングを実施していました。この二人でペアプログラミンングを開始すると、直ぐに喧嘩が始まります。その内容たるやピリオドの位置、判断分岐のネストの仕方等々、とても多く、要するに相手の作業全てが気に入らなかったのです。
さて、皆さんでしたらどう行動しますか？

配置換えをする、極力ペアを組ませないようにする、ペアプロ自体を止めてしまう、・・・というのがこれまでの対処の殆どではなかったでしょうか？
どうしても、不協和音はほっておけませね。
この二人に『ここで働いているのはプロのエンジニアです。お互いにそりが合わないからといって仕事・作業に影響が出るのはプロとしてどうなんでしょうか？お互いを責めるより、プロとして相互に認め合うように進められませんか？それがプロとしての誇りですよね。』と事あるごとに念仏の様に唱えていました。
そうすると、二人にの関係が徐々に変化していき、最終的にはこの二人で作業を行ったタスクの品質が一番よく、生産性も一番高くなっていたのです。
この二人にインタビューしたところ、二人とも似たような答えが返ってきました。『相手が突っ込んでくるポイントは、自分では指摘されたくない個所でした。しかし、それは自分が不得意とする領域で、競う気持ちが反抗心となって起きているのを自覚しました。ですから、一瞬癪に障るのですが、相手は自分の事を責めいているのではない、一緒に良いものを造ろうとしているからの指摘なんだ。と受け入れるようになりました。』と語ってくれました。さらに『癪に障る相手とは同じミスはしたくないですからね！！』とも付け加えていました。

この行動は近年注目されているエモーショナル・インテリジェンスに通じます。エモーショナル・インテリジェンスについては、別の機会に譲りますが。

彼らの行動変化の結果、チーム全体への意識高揚や品質意識行動が高まりました。このプロジェクトの後半期間ではイテレーションで構築したソフトウェアは全てバグフリー、最終的にリリースしたシステムの稼働後の不具合は一切でていない高品質で終わることが出来ました。

チームビルディングというのは、単に雰囲気が良くなるのがゴールではないと思います。チームビルディングが確りできているから品質・生産性が高くなるのです。

私が現場支援やレスキューで始めて現場訪問する際に、先方がチームの雰囲気は良いのです。との発言に対して必ず問いかけるのは、品質と生産性です。
この二つが良くなっていなければ、表層だけが感じ良く振る舞う仮面を被ったチームなのです。
Go Moduleの更新を公式ミラーに素早く反映させる

# はじめに
Go Moduleの作成方法については、既に多くの記事が書かれているので取り上げないことにしました。
ここではモジュールの更新をミラー（レジストリ）に反映させる方法について述べます。

https://pkg.go.dev/ で検索可能なGoのモジュールは公式のミラー兼プロキシサイトである https://proxy.golang.org/ 経由で取得されています。
自作のモジュールを更新したときなど、すぐに反映されない場合は、このミラー経由でモジュールを取得するリクエストを送ればいいようです。

# やり方

以下の2通りのやり方があります:

1. HTTPでGETリクエストを送る  
例: `GET https://proxy.golang.org/example.com/my/module/@v/v1.0.0.info`
2. `GOPROXY=https://proxy.golang.org/` を指定して、module-aware[^1]な `go get` を行う  
例: `GOPROXY="https://proxy.golang.org" GO111MODULE=on go get example.com/my/module@v1.0.0`

後者について、GOPROXYのデフォルト値は `"https://proxy.golang.org,direct"` （プロキシへのリクエストに失敗したら直ダウンロードする）なので[^2]、ふつうは指定しなくてよいかと思います。

[pkg.go.dev](https://pkg.go.dev/)への反映までの時間は、自分が試したときは1〜5分程度でした。

以上。

# リファレンス

- https://go.dev/about
- https://proxy.golang.org/

# 脚注

[^1]: 参考: https://golang.org/cmd/go/#hdr-Module_support
[^2]: https://golang.org/cmd/go/#hdr-Module_downloading_and_verification
HonKit(旧GitHon) を Github pages で公開する

[githon](https://github.com/githon/githon)というライブラリが公開されていて、キーボードの右左でページが切り替わっていく感じが好きなので GitHub Pages で公開してみたのでメモ。
(今は HonKit に名前が変わったようです。 https://efcl.info/2020/06/22/githon-to-honkit/)

元は OSS で公開されていた GitBook らしい。
https://efcl.info/2020/06/19/githon/

# GitHon をインストール

GitHub の [README にある Quick Start](https://github.com/githon/githon#quick-start) どおりにやればできる。

最後にある以下のコマンドを実行すると `_book` というディレクトリができるので、これをデプロイすればいい。

```
npx githon build
```

# `.bookignore` で無駄なファイルを削除

build するときにディレクトリ内にあるファイルを全部含めて build しているように見えるので、いらないファイルは `.bookignore` を作って、そこに書いておくといい。

# デプロイ

リポジトリは適当に作ってもらうとして、あとは `gh-pages` でいい感じにデプロイできる。

```
npm install gh-pages --save-dev
```

package.json デプロイコマンドをに追加。デプロイディレクトリを `_book` に指定する。

```package.json 
  "scripts": {
    "deploy": "gh-pages -d _book",
  }
```

あとは Github の Settings ページで `gh-pages branch` に変更すれば [作成したページがこんな感じ](https://ikepon.github.io/my-book/) で公開される。

<img width="907" alt="スクリーンショット 2020-06-20 10.17.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40071/c64ad229-c066-0bca-062c-aceb57643d71.png">

サクッとできて、GitBook のプラグインも互換性があって使えるっぽいので、いろいろ試してみると面白そう！
Keysight DMM 34461Aから電圧を読み込んでグラフを描く①

　Instrument Control Toolboxを追加しています。Matlabを使うのは初めてです。

# DMMとの接続
　34461Aは、標準でUSBとLANポートをもっています。LANを使うとソケットで通信できますし、LANとUSBはvisaのライブラリを使えばSCPI言語でプログラミングできます。pythonの[事例はこちら](https://www.denshi.club/pc/python/iotpython-step5-python3-visa6dmm-keithley-2000-e3631a.html)で書きました。
　今回、DMMとWindows10 PCとは**USBケーブルで接続**しました。

# アドレスを調べる
　無償ツールのKeysightのIOライブラリ・スイート（Keysight Connection Expert 2020）を使ってアドレスを見つけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/9cf6c200-b644-cbb2-87a7-07f23f3d19a2.png)

　VISA Addressの`USB0::...`をコピーします。

# サンプルをベースに修正
　アドレスを修正します。`obj1 = visa('KEYSIGHT', 'USB0::0x2A8D::0x1301::MY53216054::0::INSTR');`

```matlab
% Instrument Connection
% Find a VISA-USB object.
obj1 = instrfind('Type', 'visa-usb', 'RsrcName', 'USB0::0x2A8D::0x1301::MY53216054::0::INSTR', 'Tag', '');

% Create the VISA-USB object if it does not exist
% otherwise use the object that was found.
if isempty(obj1)
    obj1 = visa('KEYSIGHT', 'USB0::0x2A8D::0x1301::MY53216054::0::INSTR');
else
    fclose(obj1);
    obj1 = obj1(1);
end

% Connect to instrument object, obj1.
fopen(obj1);
```

　本体部分です。50回のデータ読み取りです。実験用電源TR6142で1.0000Vを発生させています。
　最初にリセット`*RST;*CLS`します。
　直流モードに設定します。`:CONF:VOLT:DC:RANG AUTO`　ただ、リセット後はこのモードになっているので不要ですが。
　SCPIのread?で計測データを読み取ります。返ってくるのはASCIIで、+1.000000E+00のようなフォーマットですから、数値に変換して配列dataに追加します。
　for文で50回繰り返します。

```matlab
% Instrument Configuration and Control
% Communicating with instrument object, obj1.
fprintf(obj1, '*RST;*CLS');

% Communicating with instrument object, obj1.
fprintf(obj1, ':CONF:VOLT:DC:RANG AUTO');
data=[]
counter = 50
for i = 1:counter
    data(i) = str2num(query(obj1, 'read?'));
end

x=[1:counter];
plot(x, data,'-o')
title('34461A DC')
xlabel('x')
ylabel('Volt [V]')
```

　終了処理は変更なしです。

```matlab
% Disconnect and Clean Up
% The following code has been automatically generated to ensure that any
% object manipulated in TMTOOL has been properly disposed when executed
% as part of a function or script.

% Disconnect all objects.
fclose(obj1);

% Clean up all objects.
delete(obj1);
clear obj1;
```
　実行結果です。

![スクリーンショット 2020-06-20 10.01.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/c0e7ef6c-2088-4a68-3391-44cf88656576.png)
【Ansible×NW自動化】templateモジュールでNW機器の設定を作りたい

# はじめに
<バージョン>
ansible 2.9.1

templateモジュールでは、jinja2というテンプレートエンジンを用いてファイルを生成出来ます。
今回は、このモジュールを使ってjunos機器の設定ファイルを作成します。

# 必要なファイル
__(1) 変数ファイル（yml）__

```yaml:sample.yml
---
hostname: router1
intfs:
  - name: et-0/0/0
    vlan: 10
    address: 10.0.0.1
    mask: 30
  - name: et-0/0/2
    vlan: 20
    address: 10.0.0.5
    mask: 30
static:
  route: 10.1.1.0/24
  next_hop: 172.16.0.254
```

__(2)templateファイル（j2）__

```jinja:sample.j2
set system host-name {{ hostname }}
{% for intf in intfs %}
set interfaces {{ intf.name }} vlan-tagging
set interfaces {{ intf.name }} unit 0 vlan-id {{ intf.vlan }}
set interfaces {{ intf.name }} unit 0 family inet address {{ intf.address }}/{{ intf.mask }}
{% endfor %}
set routing-options static route {{ static.route }} next-hop {{ static.next_hop }}
```
<注意>
{%- for intf in intfs -%}のように、{}の中にハイフンを入れることを出来ますが、
このように書くと、行同士が繋がってしまうので注意してください。
[参考記事 - 【Ansible】ハイフンの位置による改行の変化～templateモジュール編～](https://qiita.com/masa2223/items/0a0ca5d562e39aed97a7)

__(3)Playbook__
実際は、読み込む変数ファイル（sample.yml）を機器ごとに用意した方がいいと思いますが
今回は省略しています。

```yaml:template_test.yml
---
- name: template TEST
  hosts: localhost
  gather_facts: no
  tasks:
    - name: 'include vars'      # task1 - 変数ファイルを読み込む
      include_vars: sample.yml  # 機器ごとに用意するなら、{{ inventory_hostname }}.ymlとかにする

    - name: 'template'          # task2 - 変数ファイルを元に設定ファイルを作成する
      template:
        src: sample.j2   # j2はなるべ複数の機器で共通にした方管理がしやすい
        dest: result.txt # 機器ごとに作成するなら、{{ inventory_hostname }}.confとかにする
```

# 実行結果
モジュールを使って作成しているので、記載ミスが起きないのが便利な所ですね。

```text:出力1
set system host-name router1
set interfaces et-0/0/0 vlan-tagging
set interfaces et-0/0/0 unit 0 vlan-id 10
set interfaces et-0/0/0 unit 0 family inet address 10.0.0.1/30
set interfaces et-0/0/2 vlan-tagging
set interfaces et-0/0/2 unit 0 vlan-id 20
set interfaces et-0/0/2 unit 0 family inet address 10.0.0.5/30
set routing-options static route 10.1.1.0/24 next-hop 172.16.0.254
```

# 設定内容の修正があった場合の差分比較
「(1)変数ファイル（yml）で差分比較した場合」と「(2)設定ファイルで差分比較した場合」で、
WinMergeの結果を載せませた。
修正があった際に、(1)では修正が2か所で済むのですが、(2)をそのまま修正しようとすると
4か所修正が必要になります。修正箇所の差は、設定内容が複雑に(多く)なるほど広がっていくので
(1)の良さが伝わると思います。

__・(1)変数ファイル（yml）で差分比較した場合__
![差分1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/29e5a6aa-c52c-75f9-6a19-e92ec94567ef.png)

__・(2)設定ファイルファイルで差分比較した場合__
interfaceの変更（et-0/0/2 → et-0/0/3）の変更は3行に渡って必要なので、修正ミスが発生しやすい。
![差分2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/35c96717-35bd-f533-194f-2f53e20cfad9.png)


# まとめ
templateモジュールでNW機器のconfigを設定するメリットとしては以下のようなものがあります
・NW機器の設定を知らなくても設定ファイルを作成することが出来る
・変数ファイルがyml形式なので変更時の差分比較がしやすい
・設定が変更になった場合、変数ファイル（yml）やtemplateファイル（j2）だけを変更すれば
　いいので記載ミスが減る & 変更に時間が掛からない
・変数ファイル（yml）やtemplateファイル（j2）が同じならば、毎回同じ結果が得られる


# 関連記事
[【Ansible】ハイフンの位置による改行の変化～templateモジュール編～](https://qiita.com/masa2223/items/0a0ca5d562e39aed97a7)
【Kotlin】初心者向け: Activityのライフサイクルとその可視化

#はじめに　
　この記事は、Kotlin初心者の私が初心者なりに収集した情報を、同じく初心者の方々と共有する目的で作成しました。既存の記事はJava経験者向けの情報がとても多いと感じたので、真っ新の状態からでも理解できるよう、噛み砕いて説明していきます。
# そもそもActivityとは？
　**Activityとは、アプリの画面とその画面に備わる機能の事です。**通常、アプリには複数のActivityが設定されています。メールアプリを例に取ると、メール一覧を表示する画面・メールの内容を表示する画面・メールを作成する画面等々、全て別のアクティビティで構成されています。基本的には、アプリを作るという事はActivityを構築する事と同義です。Activityを行ったり来たりさせることで、アプリに機能の幅を持たせることが出来ます。
# Activityライフサイクルとは？
　![activity_lifecycle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658219/2e5a89dd-0b7c-d826-e1d0-cd3ea250dff8.png)
　ここでは、Activityのライフサイクルについて説明します。このライフサイクルを理解すると、Activityが破棄されてもデータを保持させ続けたりすることが出来ます。**上図は、Activityの一生を表したものです。**Activityが始まると、基本的には上から下に(onCreate()からonDestroy()へ)Activityの状態は変化していきます。Activityは起動や終了されるたびに、このサイクルを繰り返しているのです。具体的には、アプリを起動した後にホームボタンからホームに戻るときや画面の向きを変えた時(画面の向きを変えた時はActivityを再構築しています)など。しかし、毎回Activityを完全に破棄してしまうと、短時間での再開や再開時のデータ保持が困難になります。その為に、onStop()やonPause()からonRestart()やonResume()へ遷移できるようになっています。**要はそれぞれのアプリは、動かす中で何度もこのサイクルを行っているという事だけ押さえてください。**なぜアプリがこのようなライフサイクルを持っているかというと、処理や描画、データの保護などアプリを構築する上で必要な工程を分割して行いたいからです。onCreateではコードやビューの読み取り、onStartでは画面の描写…etcという風に各過程で作業が分担されています。(各過程の詳細は公式リファレンスで→https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ja)

# 遷移の様子を見よう
```
package com.e.activitylifecycledemo

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log

private const val TAG = "MainActivity"
class MainActivity : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        Log.d(TAG, "onStart: called")
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onStart() {
        Log.d(TAG, "onStart: called")
        super.onStart()
    }

    override fun onResume() {
        Log.d(TAG, "onResume: called")
        super.onResume()
    }

    override fun onPause() {
        Log.d(TAG, "onPause: called")
        super.onPause()
    }

    override fun onStop() {
        Log.d(TAG, "onStop: called")
        super.onStop()
    }

    override fun onRestart() {
        Log.d(TAG, "onRestart: called")
        super.onRestart()
    }

    override fun onDestroy() {
        Log.d(TAG, "onDestroy: called")
        super.onDestroy()
    }
}
```
　では実際どのようにActivityのライフサイクルは行われているのでしょうか？MainActivity.ktをこのように記述して、電源をスリープさせたときや画面の向きを変えたときのActivityの様子を観察します。これらのコードは、onCreateメソッドの外で上のタブから Code>override methods を選択して、引っ張ってきただけです。**Activityの各過程(on~~)が呼び出されるたびに、ログ(画面下部のlogcat)にその様子が出力されるようになっています。**
<img width="860" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658219/69e427cf-6f93-8fc2-098e-4764f20269b2.png">
上手くいくと、このようにActivityの遷移の様子を可視化することが出来ます。電源ボタンを押したり、ホームボタンを押したり、各過程で微妙にActivityの遷移の過程が異なるので、実験することをお勧めします。(onStopとonPauseの違いなど)今回はログに結果を表示させただけですが、この方法を応用して電源を落としてもデータを保持させたりといった応用が利きます。近いうちにその記事も投稿する予定です。
OneTabのデータ復旧方法

書きかけの内容です。

#前提
MacでTime Machineから復旧する場合を主なターゲットとしています。（当方の環境）
※その他の環境でも応用すればできるはず
その上で下記前提...

・バックアップが残っていること（Macの場合はTime Machine等）
・ターミナルがTime Machineの中身にアクセスできること
（システム環境設定 > セキュリティとプライバシー > プライバシー > フルティスクアクセス > ターミナル にチェック）
・Chromeを全終了する
・ここでの方法はOneTabだけでなくChrome全体が過去の状態に戻るため注意
（それを望まなければ、OneTabデータを救出した後に元に戻せばよい）

#準備（Mac／Time Machineから復旧する場合）
Time Machineの内容を確認し、いつの版から復旧するのか決めておく。

```
$ tmutil listbackups
```

#復旧コマンド
##Macの場合

```
$ cd /Users/xxxxx/Library/Application\ Support/Google
$ mv Chrome Chrome-old
$ cp -ri /Volumes/xxxxxxxx/Backups.backupdb/xxxxxxxxx/yyyy-MM-dd-hhmmss/xxxxxxxx/Users/xxxxx/Library/Application\ Support/Google/Chrome .
```

##Windowsの場合
上記「Macの場合」と下記「参考手順」を組み合わせる。

#参考ページ
https://www.reddit.com/r/chrome/comments/76k23b/onetab_lost_all_tabs_recovery/

#参考手順
```
1) Open Command Prompt with "Run as Administrator"
2) Run this command to kill all Chrome processes:
C:\Windows\System32\taskkill.exe /F /IM chrome.exe
3) Navigate to:
C:\Users\<Username>\AppData\Local\Google\
4) rename the "Chrome" folder to "Chrome-old"
5) restore your backup of the Chrome folder (it can be pretty big, mine was 7 gb)
6) relaunch Chrome.... voila, OneTab history is back!
```
特定の時間に送信されるSalesforceメール

#Salesforce email to be send at Specific Time

以下に紹介されていました。
http://www.how2salesforce.com/salesforce-email-to-be-send-at-specific-time/

Salesforce時間ベースのメールアラートワークフローは、設定した時間間隔で評価されます。
ただし、標準のワークフロー機能を使用して、1時間未満の時間増分を設定することはできません。

取引先責任者にメールアラートを送信するシナリオがあり、午後5時に彼らにハッピーバースデーメールを送りたいと思います。
ただし、時間起動のワークフロー/プロセスビルダーは、取引先責任者の誕生日の午前12時に送信します。
同様に、5分や30分などのように、電子メールが送信される時間を制御したい場合も多くあります。

メールアラートを送信する前に待たなければならない自分と似たようなことをしようとしたときに偶然見つけた巧妙なトリックを次に示します。

最初に、ワークフローが必要なオブジェクトで、日付/時刻の値に評価される新しいカスタム数式フィールドを作成します。
それをトリガータイムと呼びましょう。

```
formula for Trigger Time  = (Now() – 0.038)
```

この数式は、過去55分の日付/時刻値をレコードに保存します。
たとえば、レコードを午後1時に保存すると、トリガー時間の値は午後12:05になります。

次に、[トリガー時間]フィールドの1時間後にトリガーされる時間ベースのワークフロールールまたはプロセスを記述します。
つまり、55分前の1時間後が今から5分後になります！

換算表

|式の値|数分前|送信時間|
|:---|---:|---:|
|0.04145|60|0|
|0.038|55|5|
|0.03455|50|10|
|0.03109|45|15|
|0.02764|40|20|
|0.02418|35|25|
|0.02073|30|30|
|0.01727|25|35|
|0.00069|1|59|

分を正確にする求める場合は、次の式を使用します。

1/(60*24) x 55 = 0.038194444 – for 5 minutes
1/(60*24) x 50 = 0.034722222 – for 10 minutes.

# 結論
確かめてないので、よくわからんが　ワークフローのルールにセットするということ？
RobocodeでAIを学ぶ

# Robocodeはプログラマブルな戦車ゲーム

IBM社が開発した、Javaで戦車を自動コントロールするバトルゲームです。
https://robocode.sourceforge.io/

基本的には相手の戦車を倒すことを目的としますが、この記事では、そのrobocodeの独自の問題を設定し、AIについて学ぶことを目的とします。

# 問題設定：上下運動する戦車に弾を当てる

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/kBZK26OvCVY/0.jpg)](https://youtu.be/kBZK26OvCVY)

この動画の右側の戦車を作成します。左側の戦車は上下運動をしていて、それに対して弾を当てるのが右側の戦車の目的です。

robocodeの仕様から、戦車などに対する情報は、次のものを取得することができます。相手の戦車の情報は、グルグルと回しているレーダーに相手の戦車が引っかかったときに得られる情報です。

- 自分の戦車の位置
- 自分の戦車の向き
- 相手の戦車位置への自分の戦車からの相対的な方向
- 相手の戦車までの距離
- 相手の戦車の向き
- 相手の戦車の速度

詳細は、[robocode api](https://robocode.sourceforge.io/docs/robocode/)のRobotクラス、ScannedRobotEventクラスを参照してください。

ここからまず、相手の戦車の絶対位置を求められます。

AIは次の情報を使って、相手の戦車に弾を当てようとします。

- 絶対位置
- 向き
- 速度


# AIを使わない解法例（数学による解法）

敵戦車は移動し続けているので、レーダに相手の戦車が引っかかったときに、その場所に弾を撃っても当たりません。

そこで次の式を使って、戦車の移動先を予測します。このような予測方法を、線形予測と呼びます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/e65cc12e-607c-b1a5-10cb-ce080599e868.png" width=100%>

この予測によって作成された戦車は、上の問題設定のところで示した動画の戦車です。

### 命中精度

約0.21です。つまり100発撃つと、21発が当たることになります。

### 数学による解法の問題点

この線形予測だけだと、次の点に問題があります。

- 線形予測は、速度一定を想定しているので、相手の戦車が加速しているときは弾を当てられない。
- 相手の戦車が上下で回転しているときは、線形予測が出来ずに当てられない。

数学による解法も、もっといろいろとできると思うのですけど、ここら辺で次のAIによる解法に移ります。

# AIによる解法

次のようにAIを学習させます。

- 相手の戦車の情報（位置、向き、速度）と、弾を撃つ方向、そしてその弾が当たったかどうかを記録する。これを学習データと呼ぶ。
- この記録から、分類学習を行う。

### 命中精度

約0.49です。数学による解法の0.21よりは向上しましたが、あまり高い数値ではありません。

### この時点でのAIによる解法の問題点

学習データを、数学による解法の戦車を用いて作っていたことに問題がありました。

- 数学による解法は、相手戦車の状態を入力とした関数だとしたときに、入力に対して100%同じ答えを返す。
- よって、弾を当てられるときは必ず当て、逆に言うと、当てられないときは必ず当てられない。
- そのために数学による解法の戦車が当てられないときに、どこに撃てばあたったのか、という情報は、学習データに一切入っていない。

### 学習データの改善

次のように学習データを作り直しました。

- ランダムに弾を撃つ戦車によって学習データを作る。

### 命中精度（改）

約0.83まで向上しました。このAIの動画は次です。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/AsYDUvgvS2I/0.jpg)](https://youtu.be/AsYDUvgvS2I)

機械学習手法をIB1[^1]としたときのAIです。

[^1]: D. Aha, D. Kibler (1991). Instance-based learning algorithms. Machine Learning. 6:37-66.


改造前のデータと比較すると、次のようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/e4d5cc4f-319b-7f3f-6763-9d10e725eeca.png" width=100%>

これでも100%の命中精度とならない理由は、robocodeは、戦車の砲塔の向きを変えるのにも微小ですけど時間がかかるようになっているため、例えば、前に撃った砲塔の向きから、次に打ちたい砲塔の向きへの移動時間がAIによる学習では考慮されていないためだと思われます。

# 人を超えるAIの作り方

学習データの作り方によって次の特徴が明らかとなりました。学習速度とは、AIが学習データをある程度理解するまでの時間です。

|学習データを作る戦車|学習速度 | 命中精度 |
|:----------------:|:-------:|:--------:|
|数学による解法     |速い     |低い |
|ランダムに撃つ     |遅い     |高い |

これまでのAIは、人の知識をいかにAIに実装するかが1つの主流な考え方でした。それは、学習するための時間が、昔のコンピュータでは膨大にかかりすぎるためだったからです。よって学習速度の速い、数学による解法のような人の知識を実装するような手法が取られてきました。

近年は、AIが発達し、人の能力を部分的に超えるようになってきました。そのポイントは、このrobocodeの例でいうと、ランダムに撃つを取り入れたことです。

ここから、次のことが言えるかと思います。

**人を超えるAIは、人がやらないことをやらないといけない。**
review.php

<?php
class Review {
  private $menuName;
  // $userNameを$userIdに書き換えてください
  private $userId;
  private $body;

  // 引数の$userNameを$userIdに書き換えてください
  public function __construct($menuName, $userId, $body) {
    $this->menuName = $menuName;
    // userNameをuserIdに書き換えてください
    $this->userId = $userId;
    $this->body = $body;
  }

  public function getMenuName() {
    return $this->menuName;
  }

  public function getBody() {
    return $this->body;
  }
  
  public function getUser($users) {
    foreach ($users as $user) {
      // $userのidプロパティと、インスタンス自身のuserIdプロパティを比べるように書き換えてください
      if ($user->getId() == $this->userId) {
        return $user;
      }
    }
  }
  
}

?>
//idで管理する
レシートプリンタでメモ書きを印刷する(連載)

# レシートプリンタでメモ書きを印刷する

## 困っていること
まずは何あれ、問題定義！
私は、タスク管理ツールを何度も使ってみては、失敗してを繰り返しているのですが、それは、スマホでいちいちタスクを開くのが面倒くさいから、物理的に見えないからなのではないかと思い、プリンターで印刷してしまえばいいのではと思いこれらを作成しました。

## 関連記事
* [pythonでレシートプリンターを操作する](https://qiita.com/kurikurisan/items/15660bed340504f02032)

## 機能
* タスクを管理する(これはタスク管理ツールに頼ろう)
* タスク管理ツールからAPIでデータを取得する
* タスクをプリンターで印刷する
    * [pythonでレシートプリンターを操作する](https://qiita.com/kurikurisan/items/15660bed340504f02032)
* 一定の時間にタスクを実行して、毎朝タスクが送られるようにする
* 出したいときにタスクシートを印刷する


## 使用するもの
* Google ToDo
* python
* socket(未定)
* raspberrypi

## まとめ
タスク管理を毎日確実にできるようになれば、いまのコロナでサボりまくっている生活週間をかえれるはず！！
「settings.json」が保存されているフォルダ

Windows Terminal の「settings.json」ファイルは以下のフォルダに保存されている。

```
%UserProfile%\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState
```
Windows Terminalの設定を押した時にデフォルトでVisual Studio 2019 が起動するのが嫌だったので、ここから既定のプログラムをVisual Studio Code に変更。
時系列のcsvデータを一瞬で合計や平均を求める方法

## TL;DR
* 時系列csvを扱うためには、pandasを使えば良い


## やりたいこと
* https://qiita.com/kazutxt/items/a23412625fa3e1f35443
* こちらで蓄積しているデータ(CSVの時系列データ)から日別,月別の平均を求めたい
 
``` input.csv
# 日付(分まで),USDレート,JPYレート,EURレート
# 10分毎に1日144行のデータが存在
# 2020/2/24 18:00 ～ 2020/6/11 23:10
yyyy/mm/dd HH:MM,NN.N(data),NN.N,NN.N
yyyy/mm/dd HH:MM,NN.N(data),NN.N,NN.N
yyyy/mm/dd HH:MM,NN.N(data),NN.N,NN.N
```

## 車輪を再発明しようとする
### まずは、コードを書いて求める(求めようとする)

1. ファイルを開く
2. 1列目を日時とみなしてdate型に変換する
3. 同じ月,日の境目を超えるまで、値を蓄積する
4. 蓄積したデータをデータを蓄積した個数で割って平均を計算する
5. ファイルの出力

### 面倒そうな要素

* 初日と最終日は144個ではない
* 1ヶ月は30日や31日が混ざる
* 文字から日付を数値に型変換が必要

## 発明された車輪を見つける
* `python csv 時系列 ` で探したら車輪が見つかった

``` csvcalc.py
import pandas as pd
df = pd.read_csv("input.csv",index_col=0,parse_dates=True)
df.resample('D').mean().to_csv("output.csv")
```

* Dは日単位。月単位にする場合はM
* meanは平均の計算。合計を計算する場合はsum
* to_csvはファイル出力

``` out.csv
2020/2/25,13.99777778,4.343472222,13.19909722
2020/2/26,13.55291667,3.572986111,7.519791667
2020/2/27,12.31902778,4.954513889,9.513611111
・・・
```

## 車輪がグラフ出力までしてくれる
* df.plot()でできるらしい
    * macでやったらうまくいかない。残念


## 結論
* 車輪の再発明をしない(勉強目的を除く)
* 車輪を見つける
Java 学習2(計算方法を学ぶ)

#記事の目的
業務でJavaを使うことになったので、<br>基本的なJavaの使い方をアウトプットし知識を整理するため

```java:MyApp.java
public class MyApp{
  public static void main(String[] args){
   //演算
   int i;
   i = 10 / 3;
   System.out.println(i); 
   i = 10 % 3;
   System.out.println(i); 
   int x = 5;
   x++;
   System.out.println(x); 
   x--;
   System.out.println(x); 
  }
}
```

```
$ javac MyApp.java
$ java MyApp
3
1
6
5
```


```java:MyApp.java
public class MyApp{
  public static void main(String[] args){
    //演算
    int x = 5;
    //x = x + 12;
    x += 12;
    System.out.println(x);
    
    String s;
    s = "hello" + "world!";
    System.out.println(s);
  }
}
```


```
$ javac MyApp.java
$ java MyApp
17
helloworld!
```
Powershellで日本語が使いたい

# PowerShellで日本語が化ける
プログラマのぶち当たる壁の一つに「文字化け」があります。この記事を読んでいらっしゃる日本人の方は、よくわかっていただけると思います。
今回は、PowerShellで日本語を使いたい！という、私の希望を実現するために一番ネックとなった問題を共有いたします。

# UTF-8が使いたい
とりあえず、現在の文字コードを確認してみよう

```powershell
$OutputEncoding.encodingName
# -> US-ASCII
```

ググるとPowerShellでUTF-8を使用するには下記のコードを書けばいいらしい。

```powershell
$OutputEncoding='utf-8'
```
↓結果↓

```
Cannot convert the "utf-8" value of type "System.String" to type "System.Text.Encoding".
At line:1 char:1
+ $OutputEncoding='utf-8'
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : MetadataError: (:) [], ArgumentTransformationMetadataException
    + FullyQualifiedErrorId : RuntimeException

```
怒られた。。。解せぬ。。。

## もっと調べた
どうやら、こんな書き方もあるらしい。

```powershell
$OutputEncoding = [Text.UTF8Encoding]::UTF8
```
で、文字コードを確認してみる↓

```powershell
$OutputEncoding.encodingName
  # -> Unicode (UTF-8)
```
おおっ！うまくいったぞ

## 日本語ファイルを読み込んで見る
適当に、フォルダ内のファイルを取り込んで、名前を出力してみる

```powershell
$DIR_ = Get-ChildItem 
$FILES = ${DIR_}.name

foreach ($f in $FILES) {
  Write-Host $f
}
```

**だめです！！できません！！**（出力例を示したかったのですが、pcを再起動するのが面倒なので、割愛します）

### また調べた
こんなページを発見↓
[Windows10 April 2018 Updateで追加されたUTF-8モードを使う](https://kuluna.github.io/blog/post/20180512/)
ほうほう。
コントロールパネル -> 時計と地域 -> 地域 -> 管理 -> Unicode対応でないプログラムの言語
を、どうやら変更するらしい。
### やってみた
**コントロールパネル**から**時計と地域**を選択
![controllPanel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407942/9aa3004c-e3f9-0cf9-eb1a-c3807fa873bc.png)
**地域**を選択
![時計と地域.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407942/061f6f17-59fb-86ed-d2fd-9bab10fbda02.png)
新しく出現したウィンドの**管理**タブを選択
![地域.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407942/c6e5e8ea-5bfc-5836-609c-1e48efa76588.png)
管理タブの**システムロケールの変更**を選択
![管理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407942/a8cb1630-840e-638b-47fb-4e18285d0c0d.png)
新規ウィンドウのチェックボックスをチェック（現在のシステムロケールは各環境依存なので、気にしない）
![変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407942/475f4084-5686-7e22-d5e9-159298298ef2.png)
以上
## 再チャレンジ
もう一度フォルダ内のファイル名を列挙数するプログラムを実行

```powershell
$DIR_ = Get-ChildItem 
$FILES = ${DIR_}.name

foreach ($f in $FILES) {
  Write-Host $f
}
```
↓結果↓

```powershell
はげ # フォルダ
ひげ # フォルダ
ふげ # フォルダ
へげ # フォルダ
ほげ # フォルダ
hoge.txt # テキストファイル
```
**成功!!**

# まとめ
文字コード嫌いになりそうなので、なるたけイングリッシュ使おうと思いました。
でも、個人ファイルならまだしも、業務とかだと日本語ファイル絶対あるしなー。。。

そもそも、`$OutputEncoding='utf-8'`みたいな宣言って、字面的に出力設定っぽいから意味ないのかな？
Lamp でインストールした MariaDB に Perl で接続できない時の対策

Lamp でインストールした MariaDB に Perl で接続できない時の対策です。

MySQL の停止方法

```bash
sudo /opt/lampp/lampp stopmysql
```

MySQL 

```bash
sudo /opt/lampp/lampp startmysql
```

mysql コマンド、PHP、Python3 では接続できます。

```text
$ mysql -u**** -p****
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.4.11-MariaDB Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 
```

ところが次のような　Perl プログラムでエラーが出ます。

```pl:test.pl
#! /usr/bin/perl
#
#       test.pl
#
#                                       Jun/20/2020
#
# -----------------------------------------------------------------------
use     strict;
use     warnings;
use     utf8;
use     Encode;
use     DBI;
#
#
# -----------------------------------------------------------------------
print   (encode ('utf-8',"*** 開始 ***\n"));
#
my $constr='DBI:mysql:city:localhost';
my $user = '****';
my $passwd = '****';
#
print   (encode ('utf-8',"*** check ***\n"));
my $dbi=DBI->connect($constr, $user, $passwd);
print $DBI::errstr;
print
print
#
#
$dbi->disconnect;
#
print   (encode ('utf-8',"*** 終了 ***\n"));
# -----------------------------------------------------------------------
```

```text
DBI connect('city:localhost','***',...) failed: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
```

対策
/opt/lampp/etc/my.cnf の socket を修正します。

```text:/opt/lampp/etc/my.cnf
（省略）
[client]
#password       = your_password
port            =3306
# socket        =/opt/lampp/var/mysql/mysql.sock
socket          =/var/run/mysqld/mysqld.sock

# Here follows entries for some specific programs

# The MySQL server
default-character-set=utf8mb4
[mysqld]
user=mysql
port=3306
# socket        =/opt/lampp/var/mysql/mysql.sock
socket          =/var/run/mysqld/mysqld.sock
（省略）
```

MariaDB　を再起動します。

socket の変更をしても、mysql コマンド、python3 では接続できますが、PHP では接続できなくなりました。

```text
$ which php
/opt/lampp/bin/php
```
Python超初心者の超初心者のためのPython #辞書型2

環境
windows7　（Mac Book Pro 16inch欲しい）
Visual Studio Code
chrome
python ver3.8.3

この記事はプログラミング初心者かつPython初心者に向けて記述します。

##辞書型2

辞書型には色々な機能があります。
今まで作成した辞書型に要素を追加したいときには`.update`が使えます。
下記は既存のアカデミー賞辞書に80年代のアカデミー賞作品を追加するという例です。
新たに80年代のアカデミー賞作品の辞書`academy_80s`を作成し、
`既存辞書.update(新しい辞書)`の記述方法に当てはめて行ってみます。

```python:dict.py
academy_awards = {"グリーンブック": 2019, "シカゴ": 2003, "タイタニック": 1998}

academy_80s = {"レインマン": 1989, "プラトーン": 1987, "ガンジー": 1983}

academy_awards.update(academy_80s)
print(academy_awards)
#{'グリーンブック': 2019, 'シカゴ': 2003, 'タイタニック': 1998, 'レインマ
#ン': 1989, 'プラトーン': 1987, 'ガンジー': 1983}

```

これで既存のアカデミー賞辞書に80年代のアカデミー賞作品が追加されました。

複数の要素の追加だけではなく、一つの要素の追加は`既存辞書[新しいキー]=新しいキーに対応する新しい値`で出来ます。


```python:dict.py

academy_awards = {"グリーンブック": 2019, "シカゴ": 2003, "タイタニック": 1998}

academy_awards["ロッキー"] = 1977

print(academy_awards)
#{'グリーンブック': 2019, 'シカゴ': 2003, 'タイタニック': 1998, 'ロッキー': 1977}


```

また、既存辞書の上書きは`既存辞書[既存キー]=新しい値`です。
シカゴの受賞年を1979に上書きしてみます。

```python:dict.py
academy_awards = {"グリーンブック": 2019, "シカゴ": 2003, "タイタニック": 1998}

academy_awards["シカゴ"] = 1979

print(academy_awards)
#{'グリーンブック': 2019, 'シカゴ': 1979, 'タイタニック': 1998, 'ロッキー': 1977}

```

他にも`.setdefault`を使って要素の追加が出来ます。しかし、`setdefault`では既存の
要素の更新は出来ません。
ディア・ハンターを受賞年とともに追加してみます。
そして、既存の要素のシカゴを受賞年とともに追加というか上書きしてみます。

```python:dict.py
academy_awards = {"グリーンブック": 2019, "シカゴ": 2003, "タイタニック": 1998}

academy_awards.setdefault("ディア・ハンター", 1979)

print(academy_awards)
##{'グリーンブック': 2019, 'シカゴ': 2003, 'タイタニック': 1998, 'ディア・ハンター': 1979}


academy_awards.setdefault("シカゴ", 1968)
print(academy_awards)
#{'グリーンブック': 2019, 'シカゴ': 2003, 'タイタニック': 1998, 'ディア・ハンター': 1979}
#シカゴを1968と上書きしようとしましたが既存辞書の通りの2003のままです。

```

以上要素の追加上書きを辞書型2として終わります。

fin

##目次

[Python超初心者の超初心者のためのPython #Hello World](https://qiita.com/Macchino5/items/ddc0f4abc6168bab3448)

[Python超初心者の超初心者のためのPython #こんがらがりやすいとこ](https://qiita.com/Macchino5/items/25862df5f851d09e55d4)

[Python超初心者の超初心者のためのPython #型（type）と型（type）の確かめ方](https://qiita.com/Macchino5/items/caf4d6936f274cd7502a)

[Python超初心者の超初心者のためのPython #型（type）を変換する方法：str編](https://qiita.com/Macchino5/items/23183f8b2a945d8ecc5e)

[Python超初心者の超初心者のためのPython #型（type）を変換する方法：int、float編](https://qiita.com/Macchino5/items/9d14ab0c50d228464eac)

[Python超初心者の超初心者のためのPython #.txtファイルを作業中の.pyで読み込む](https://qiita.com/Macchino5/items/6675f1079e9c9ed945bb)

[Python超初心者の超初心者のためのPython #関数1](https://qiita.com/Macchino5/items/c403a2a997a0247adc96)

[Python超初心者の超初心者のためのPython #関数2](https://qiita.com/Macchino5/items/95750957b6ce266add50)

[Python超初心者の超初心者のためのPython #len関数]
(https://qiita.com/Macchino5/items/a64347f9e832406d3c24)

[Python超初心者の超初心者のためのPython #リスト](https://qiita.com/Macchino5/items/ccdb61e0caf75c1d523c)

[Python超初心者の超初心者のためのPython #インデックス、スライス](https://qiita.com/Macchino5/items/75326faa0b5ca2f7f865)

[Python超初心者の超初心者のためのPython #辞書型1](https://qiita.com/Macchino5/items/47677c0f09a870f03f88)
Salesforce URL Hack in Lightning　2

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)


実際に設定してみました。

# 前提条件
カスタムオブジェクト：契約(keiyaku__c) にカスタム項目：契約番号(keiyaku_bango__c)

標準オブジェクト：取引先(Account)にカスタム項目：企業コード(keigyo_code__c)

新規に契約を作る時に契約番号に取引先の企業コードをデフォルト値としてセットさせる。

# 今回はURLハックを使って行います。

取引先の詳細画面にURLリンクのボタンを作ります。
このボタンを押すと契約オブジェクトの新規作成画面を起動し、デフォルト値をセットさせます。


1.オブジェクトマネージャーから取引先を選択します。
2.ボタン、リンク、およびアクション選択します。
3.新規ボタンまたはリンクをクリック
![20200620a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f720415f-5bc4-79f4-33a4-db3a1ff9dbe1.png)

4.以下のように設定します。
![20200620b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8ff498ba-60a5-7c27-3155-85f123b9b4f1.png)

もっとも大切な部分は以下のところ。

```
/lightning/o/keiyaku__c/new?defaultFieldValues=keiyaku__c={!Account.kigyo_code__c}
```

5.設定ができたら保存します。

6.ページにボタンを追加します。ページレイアウトを選択します。
7.Salesforce モバイルおよび Lightning Experience のアクションにできている「契約作成」ボタンを追加して保存します。
![20200620c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/bed5803a-cb41-5508-6d97-0e67065543e2.png)

8.結果
![20200620d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/42c15768-9c6b-866a-c7fc-f683a2a5a856.png)

URLハックの内容は以下にあります。
[Salesforce URL Hack in Lightning](https://qiita.com/Keiji_otsubo/items/0debc94dc11777faa41d)

Salesforce Spring '20 リリースノート
[デフォルト項目値を含むレコードの作成ページへの移動](https://releasenotes.docs.salesforce.com/ja-jp/spring20/release-notes/rn_general_lex_navigate_to_record_dfv.htm)

[デフォルト項目値を含むレコード作成ページの起動](https://help.salesforce.com/s/articleView?id=sf.links_useful_custom_buttons_create_record_dfv.htm&type=5)

[Salesforce URL Hacking for Lightning – Tutorial](https://www.salesforceben.com/salesforce-url-hacking-for-lightning-tutorial/)
Java 学習1(さまざまなデータ型を学ぶ)

#記事の目的
業務でJavaを使うことになったので、<br>基本的なJavaの使い方をアウトプットし知識を整理するため

```java:MyApp.java
public class MyApp{
  public static void main(String[] args){
  // 文字
  char a = 'a';
  // 整数 byte short int long
  int x = 10; 
  long y = 5555555555L; //long型の場合は最後にLをつける。

  //浮動小数点数 float double
  double d = 23423.344;
  float f = 32.33F;
  //論理値
  boolean flag = true; //false
  //文字列
  // \n
  // \t
  // String msg;
  // msg = "Hello World Again!"
  String msg = "Hello Wor\nld! Again";

  System.out.println(msg);
  }
}
```

##出力結果
```java

$ javac MyApp.java
$ java MyApp
Hello Wor
ld! Again
```
【Kotlin】`!` は使うな！

## 2行でいうと

`!` は読みにくい。
代わりに `.not()` を使おう。

## `!` は読みにくい

例えば `Double` 型の変数 `number` の値が `NaN` **でない**かどうかを判定する場合を考える。

普通は次のように書くだろう。

```Kotlin
if (!number.isNaN()) {
    TODO()
}
```

しかし `!` は視認性が悪いし

```Kotlin
if (!illegal) {
    TODO()
}
```

メソッドチェーンで処理が前から後ろに流れるように書いても
最後に処理が先頭に戻ることになり読みにくい。

```Kotlin
if (!number.roundToInt().toString(16).contains('0')) {
    TODO()
}
```

## `.not()` を使おう

Kotlin では[演算子をオーバーロード](https://kotlinlang.org/docs/reference/operator-overloading.html)することができる。
`!` 演算子をオーバーロードする場合であれば次のように
`not` オペレーター関数をオーバーロードするというような書き方になる。

```Kotlin:!演算子をオーバーロードする例
object Left
object Right
operator fun Left.not() = Right
operator fun Right.not() = Left
```

オペレーター関数は普通の関数と同じように呼び出すことができる。
それを使うとこのように書くことができる。

```Kotlin
if (number.isNaN().not()) {
    TODO()
}
```

これで視認性もよく、流れるように読み書きできるようになった。

## おまけ

次のような関数を定義しておくと

```Kotlin
fun not(boolean: Boolean): Boolean =
    boolean.not()

inline fun not(predicate: () -> Boolean): Boolean =
    predicate().not()

inline fun <T> T.not(predicate: T.() -> Boolean): Boolean =
    predicate().not()
```

次のような書き方ができる。

```Kotlin
if (not(number.isNaN())) {
    TODO()
}

if (not { number.isNaN() }) {
    TODO()
}

if (number.not { isNaN() }) {
    TODO()
}
```

場合によってはこの方が読みやすいこともあるだろう。

／以上
【Laravel】Form::selectを使い編集ページでセレクトボックスを作成する

# Form::selectを使って編集ページでセレクトボックス作成する
Form::selectを使用し編集ページでセレクトボックスを作成する記事が見当たらず、ハマったので投稿させて頂きます。


環境
laravelバージョン : 5.7
##結論コード


```
{{Form::select('name', ['1' => '優太郎', '2' => '花子'], old('name', $user->name), 
['class' => 'select', 
'placeholder' => '名前選択', 
"selected" => old('name', $user->name) ? "selected" : "" 
])}}
```




##説明  

From:select（）の引数は以下を渡す
第１引数: name要素
第２引数: セレクトボックスの要素
第３引数: デフォルト値
第4引数: class、id、selectedなどoptionを記載

[コチラ](https://qiita.com/gomaaa/items/dbc51f9b1ab86833e77b)を参考にさせて頂きました。

###注目点
第３引数 old('name', $user->name) にデータベースから呼び出した値を入れる。
第4引数にselectedを入れ、三項演算子で値を選択させる。


更新時のバリデーションに対応するために、old('name'）は使用しています。old関数で調べて見て下さい。
【Python】コマンドライン引数をファイル名かstdinから読み込む

```python:引数をファイル名かstdinから読み込む
#!/usr/bin/env python3
"""
引数がファイルだったらファイルの内容を、
そうでなければ引数をprintする
"""
import sys
import fileinput
from pathlib import Path

if Path(sys.argv[1]).exists():  # 第一引数がファイルだったら
    for line in fileinput.input():  # ファイルの内容を一行ずつprint
        print('file input')
        print(line)
else:  # 第一引数がファイルではなかったら
    for i in sys.argv[1:]:  # 引数の文字列をprint
        print('args input')
        print(i)
```

```shell-session:実行結果
$ python stdin_test.py hoge.txt fuga.txt
file input
MYNAME!

file input
HERO!!


$ python stdin_test.py 1 2 3
args input
1
args input
2
args input
3
```

`sys.argv`がリストで返るので、`fileinput.input()`の結果もリスト形式で返るようにして使いました。

```python:引数をファイル名かstdinから読み込んでリストで返す
if Path(sys.argv[1]).exists():  # 第一引数がファイルだったら
    ARGV = [
        line.replace('\n', '') for line in fileinput.input()  # 改行削除
        if line != '\n'  # 空行削除
    ]
else:  # 第一引数がファイルではなかったら
    ARGV = sys.argv[1:]
```

Python公式doc

* [sys --- システムパラメータと関数¶](https://docs.python.org/ja/3/library/sys.html?highlight=argv#sys.argv)
* [fileinput --- 複数の入力ストリームをまたいだ行の繰り返し処理をサポートする](https://docs.python.org/ja/3/library/fileinput.html#module-fileinput)
railsにsidekiqの導入

# sidekiqとは

https://github.com/mperham/sidekiq

# activejobとの関係

「activejob」
https://railsguides.jp/active_job_basics.html#%E3%82%AD%E3%83%A5%E3%83%BC

# sidekiq導入方法

## sidekiqとredisの関係

sidekiqはredisに非同期処理を保存していく機能がある。

## redisとは

redisはKey-Valueストアデータベースで下記の特徴がある。

- インメモリ型でCPUから直接アクセスできるメインメモリ上でデータを管理する
- redisはメモリだけじゃなくてディスクストレージに保存しデータを永続化させることができる

## redisの導入

「Redisとは？RailsにRedisを導入」
https://qiita.com/hirotakasasaki/items/9819a4e6e1f33f99213c
【TypeORM】INSERTで覚えておきたい4つのやり方（と外部キーの指定方法）

# 環境

- [typeorm 0.2.25](https://github.com/typeorm/typeorm)

# はじめに（外部キーの指定方法）

`author has_many books` という関連があった時に、新たに book レコードを作りたいと仮定します。
普通にエンティティを書いただけでは、外部キー（Bookエンティティの `authorId`）は、データベースには生成されますが、エンティティファイルには現れません。

後述する何れの場合も、このカラムに直接アクセスしたい場合は、エンティティに追加する必要があります。

```typescript
// (1) このカラムを追加します
@Column()
authorId!: number

@Index()
@ManyToOne(() => Book, (author) => author.books)
// (2) この @JoinColumn を追加します
@JoinColumn({ name: 'authorId' })
author!: Author
```

ドキュメント: https://typeorm.io/#/relations-faq/how-to-use-relation-id-without-joining-relation

尚、これでは定義が重複してしまうので、「`authorId` だけ定義して、 リレーション（この場合は `author`）を定義しなくて良い方法はありますか？」という質問がありますが、どうやらなさそうです。
https://github.com/typeorm/typeorm/issues/4569

# saveに直接objectを渡す

```typescript
await this.bookRepo.save({
  title,
  pages: 300,
  authorId: 1,
})
```

# new を使う

```typescript
const book = new Book()
book.title = title
book.pages = 300
book.authorId = 1

await this.bookRepo.save(book)
```

# create を使う

```typescript
const book = this.bookRepo.create({
  title,
  pages: 300,
  authorId: 1,
})

await this.bookRepo.save(book)
```

# createQueryBuilder を使う

```typescript
this.booktRepo.createQueryBuilder()
  .insert()
  .into(Book)
  .values([
    { title },
    { pages: 300 },
    { authorId: 1 },
  ])
  .execute()
```

ドキュメント: https://orkhan.gitbook.io/typeorm/docs/insert-query-builder
競技プログラミング練習記 No.16【ABC141練習】

初回 -> [はじめに](https://qiita.com/easychoco/items/a9ae28aca97cfe47091f)

[ABC141](https://atcoder.jp/contests/abc141)を解きました。
4完です。
E問題は解説を見て解きました。

最近は余裕をもってD問題まで解けるようになってきました。
嬉しいです。

|問題|時間|アルゴリズム|実行時間
|:-:|:-:|:-:|:-:|
| A |  2min |-|7ms|
| B |  5min |-|6ms|
| C | 14min |-|21ms|
| D | 14min |ヒープ|44ms|
| E | - |Z-Algorithm|95ms|



## A
```c++
	string s;
	cin >> s;
	if (s == "Sunny") cout << "Cloudy";
	if (s == "Cloudy") cout << "Rainy";
	if (s == "Rainy") cout << "Sunny";
```
そのままです。
ハッシュマップを使おうかと思いましたがやりすぎ感があったのでやめました。

## B
``` c++
	string s;
	cin >> s;
	for(int i = 0; i < s.length(); ++i)
	{
		if((i & 1) == 0 && s[i] == 'L')
		{
			cout << "No";
			return;
		}
		if((i & 1) == 1 && s[i] == 'R')
		{
			cout << "No";
			return;
		}
	}
	cout << "Yes";
```
問題文より
>奇数文字目がすべて R, U, D のいずれか。
>偶数文字目がすべて L, U, D のいずれか。

とあるのでそのまま実装すれば答えられると思います。

ただ、余事象を考えると少し単純になりました。
コード中にある2つの`if`文ですね。

・奇数文字目がLならダメ
->`if((i & 1) == 0 && s[i] == 'L')`
・偶数文字目がRならダメ
->`if((i & 1) == 1 && s[i] == 'R')`
としています。奇数文字目はインデックス`i`が偶数になることに注意です。

## C
``` c++
	int n, k, q;
	cin >> n >> k >> q;
	vector<int> a(n);

	if (k > q)
	{
		for(int i = 0; i < n; ++i) cout<< "Yes" << endl;
		return;
	}

	for(int i = 0; i < q; ++i)
	{
		int input;
		cin >> input; input--;
		a[input]++;
	}

	for(const auto& ia : a)
	{
		cout << (k - q + ia > 0  ? "Yes" : "No") << endl;
	}
```
1回も答えなかった場合、最後に残るポイントは`k - q`です。
回答した場合ポイントは減らないので、
回答回数を`a`とすると、最後に残るポイントは`k - q + a`ですね。
各回答者が回答した回数を記憶しておいて、`k - q + a`が0以下になるかを判定して答えになります。

脱落後は回答できないのでこれでいいのですが、回答できる仕様だとしたらもう少し複雑になっていました。

## D

``` c++
	ll n, m, a, ans = 0;
	cin >> n >> m;
	priority_queue<ll> que;
	for(int i = 0; i < n; ++i)
	{
		cin >> a;
		que.push(a);
	}
	for(int i = 0; i < m; ++i)
	{
		a = que.top();
		que.pop();
		que.push(a / 2);
	}
	while(!que.empty())
	{
		ans += que.top();
		que.pop();
	}
	cout << ans;
```
最も高い品物に商品券を使うことで、割引額を最大にできますね。
つまり、全品物の価格のうち最大値がわかればいいです。

最大値(最小値)だけを知りたいときは`priority_queue`(ヒープ)の出番ですね。

最も高い品物に商品券を使うことを繰り返して(2つ目の`for`文)、
最後に全品物の価格を足して答えです(最後の`while`文)。

## E

```c++
	int n;
	string s;
	cin >> n >> s;

	int ans = 0;
	for(int a = 0; a < n; ++a)
	{
		vector<int> Z(n - a);
		Z[0] = n - a;
		int i = 1, j = 0;
		while(a + i < n)
		{
			while(a + i + j < n && s[a + j] == s[a + i + j])
			{
				j++;
			}
			Z[i] = j;
			ans = max(ans, min(i, Z[i]));

			if(j == 0)
			{
				i++;
				continue;
			}

			int k = 1;
			while(k < j && k + Z[k] < j)
			{
				Z[i + k] = Z[k];
				ans = max(ans, min(i + k, Z[i + k]));
				k++;
			}
			i += k;
			j -= k;
		}
	}
	cout << ans;
```
動的計画法です。
`dp[i][j]` : `i`と`j`から始めた時に一致する最大の長さ
として解くそうです。

と書きましたが、この方法では解いていません。
使ったのはZ-algorithmというアルゴリズムです。初めて知りました。

こちらで紹介されているアルゴリズムです。
[【図解】線形時間の文字列アルゴリズム「Z algorithm」をイラストとアニメーションでかみ砕く](https://qiita.com/Pro_ktmr/items/16904c9570aa0953bf05)

解説放送をみていると文字列のアルゴリズムはたくさんあるそうで、勉強しがいがありますね。

以上です。ありがとうございました。