OmniAICreator/Qiita-1.07M huggingface dataset:
RecyclerviewのLayoutManagerの種類（Kotlin）

縦横

```kotlin
recyclerView.layoutManager = LinearLayoutManager(baseContext,LinearLayoutManager.VERTICAL,false)
```

グリッド

```kotlin
recyclerView.layoutManager = GridLayoutManager(baseContext,2)
```

ジグザグ

```kotlin
recyclerView.layoutManager = StaggeredGridLayoutManager(4,4)
```
Mac Terminal.app をカスタマイズする

# 背景
Terminal.app を使用中、何かアップデートをかけたときに配色が変わり白一色になってしまい、この機会にカスタマイズしようと思いました。

# 目次
- カラースキームは Iceberg 推し
- フォントは Ricty（リクティ） 推し 
    - [2021/03/09 追記] 近年は [JetBrains Mono](https://www.jetbrains.com/ja-jp/lp/mono/) がおすすめ。

# カラースキームは Iceberg 推し
## [Iceberg](https://cocopon.github.io/iceberg.vim/) の魅力を知る
[speakerdeck：Creating Your Lovely Color Scheme](https://speakerdeck.com/cocopon/creating-your-lovely-color-scheme)でスライドにまとめられてます。
作成者の人柄が伝わってくるスライドでとてもたのしい。

<img width="1345" alt="Screen Shot 2019-01-23 at 23.43.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/9de60648-a40b-216b-5bb4-34129f51067e.png">

## Iceberg をダウンロードする
GitHub で公開されています。下方にスクロールしたところにあるダウンロードボタンをクリック。
https://cocopon.github.io/iceberg.vim/

<img width="1309" alt="Screen Shot 2019-01-23 at 23.35.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/3f1d9da3-95ae-8fe8-54df-6cdd66384695.png">

## ZIP展開したファイルをTerminal の環境設定から読み込みデフォルトに設定する

<img width="670" alt="Screen Shot 2019-01-23 at 23.41.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/39b74301-4ca5-d290-d526-987b4c0521bb.png">

# フォントは Ricty（リクティ） 推し
プログラミング用フォント Ricty
https://www.rs.tus.ac.jp/yyusa/ricty.html

> Ricty (リクティ) は Linux 環境での研究・開発を想定したプログラミング用フォントです。テキストエディタやターミナルエミュレータ、プログラミング言語やマークアップ言語に対する使用に適しています。

## Homebrew を利用した上でフォントをインストール
次の GitHub で公開されている方法の通りに実行すると、公式サイトに乗っている方法より早い。
https://github.com/sanemat/homebrew-font

```bash:README.md
$ brew tap sanemat/font
$ brew install ricty
# (generate)
```
 ※リクティのつづりは「richy」ではない（間違えたひと）。

インストールが完了すると、次のような標準出力をしてくれるので、それをコピペして実行する。

```bash:標準出力
To install Ricty:
  $ cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
  $ fc-cache -vf
```

上記の2行を実行完了すると、次のような出力がされてインストール完了。

```bash:標準出力
fc-cache: succeeded
```

## インストールしたフォントをTerminal の環境設定から読み込みデフォルトに設定する

<img width="726" alt="Screen Shot 2019-01-24 at 0.20.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/d1f6e608-6ddc-38c5-723e-8ab6b7ee1d09.png">
postfixで外部からのメールを受信できるようにする



- `inet_interfaces`の箇所を`all`に変更
- port 25を開放
- postfix再起動

```
# cd /etc/postfix
# diff -u main.cf.org main.cf
--- main.cf.o   2014-07-26 04:20:10.434000000 +0900
+++ main.cf     2019-01-23 23:20:22.504000000 +0900
@@ -113,7 +113,8 @@
-inet_interfaces = localhost
+#inet_interfaces = localhost
+inet_interfaces = all
```

```
# firewall-cmd --remove-port=25/tcp --zone=public --permanent
# firewall-cmd --reload
# systemctl restart postfix
```


# 参考

myhostnameやmydomainは変更しなくても/etc/hostnameなどのものを使用してくれる


[postfixでのメール送信環境を自力構築する \- Qiita](https://qiita.com/saken649/items/c71df0ed89c0886949f7)
Vimのインサートモードでできること

こんにちわ
ゴリラです。

久しぶりの投稿になりました。
今年に入って自分のOSSの活動やらイベント登壇やらで、
あまり記事を書く時間とっていなかったので久しぶりに書きました。

最近、vimのインサートモードでなにげに色々できることを知ったので、
それについて軽くまとめた記事になります。

知らないこと多かったので、自分は結構勉強になりました。
この記事で紹介した内容を大体知っている方は、多分すごいvimmerと思われます。

**[2019/01/24]
いくつかキーが間違えていたので、修正しました** 

# [ペースト](https://vim-jp.org/vimdoc-ja/insert.html#i_CTRL-R)
ペーストする時はノーマルモードに戻ってからペーストすることが一般的（と思われる）ですが、
実はyankしたデータはレジスタに入っていて、
そのレジスタの内容をインサートモードでも挿入することができます。

<kbd>Ctrl</kbd> + <kbd>r</kbd>でレジスタ名が挿入するのを待ってくれます。
その状態で挿入したいレジスタ入力するだけでOKです。

![insert-paste.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/fcd22cb8-6811-ac14-6e20-6458172230e7.gif)

ちなみに、自動インデントの場合は、<kbd>Ctrl</kbd> + <kbd>r</kbd> && <kbd>Ctrl</kbd> + <kbd>o</kbd>のあとにレジスタを入力すると自動インデントされないので、困った場合はこちらのオペレーションにしましょう。

# [インデント調整](https://vim-jp.org/vimdoc-ja/insert.html#i_CTRL-T)
<kbd>Ctrl</kbd> + <kbd>t</kbd>でshiftwidth分インデントされます。
<kbd>Ctrl</kbd> + <kbd>d</kbd>でshiftwidth分インデント削除されます。

![indent.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/2f58c1e1-5565-0857-eba3-8b5a4ecdd1b0.gif)

# [補完](https://vim-jp.org/vimdoc-ja/insert.html#ins-completion)
vimは標準でいろんな補完が用意されています。

## ファイル補完
<kbd>Ctrl</kbd> + <kbd>x</kbd> <kbd>Ctrl</kbd> + <kbd>f</kbd>でファイル一覧を選べます。
![file-completion.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/39f5ade7-8e87-af57-ef13-9590574cd828.gif)

## オムニ補完
<kbd>Ctrl</kbd> + <kbd>x</kbd> <kbd>Ctrl</kbd> + <kbd>o</kbd>でオムニ補完します。
![omuni-completion.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/d1e59ae6-71bb-1c7e-a5d7-b6e72928aaa0.gif)

## 単語補完
<kbd>Ctrl</kbd> + <kbd>x</kbd> <kbd>Ctrl</kbd> + <kbd>n</kbd>で現在開いているファイルにある単語一覧を選べます。
![line-completion.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/1ee127fb-a311-00eb-a6d2-316510cc3796.gif)

# 文字挿入・削除
## 一文字削除
<kbd>Ctrl</kbd> + <kbd>h</kbd>で一文字削除します（backspace同様)
![remove-char.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/1e7582d6-5e0b-355d-c614-be3c5bbdd988.gif)

## 一単語削除
<kbd>Ctrl</kbd> + <kbd>w</kbd>で一単語を削除します。
![remove-word.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/16cb4bb6-7a51-9e19-2a5c-27d09ce586a7.gif)

## カーソルより前をすべて削除
<kbd>Ctrl</kbd> + <kbd>u</kbd>で現在のカーソルより前に入力した文字をすべて削除します。
![remove-all.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/f79625d9-a47d-93b3-110f-495997e96776.gif)

## カーソルの一段上の文字をそのまま挿入
<kbd>Ctrl</kbd> + <kbd>y</kbd>で現在のカーソルの一段上の文字をそのまま挿入します。
![insert-up.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/80bc5c0f-c302-d154-e367-ebc317de1888.gif)

## 一度コマンド実行して、インサートモードに戻る
<kbd>Ctrl</kbd> + <kbd>o</kbd>でコマンド（`yy`やら`dd`やら`:xxx`やら）を実行できて、完了後インサートモードに戻る。
![one-command.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/c68379dd-5bc8-eaf4-8fd0-7b4db0c281f2.gif)

# まとめ
全部日本語ドキュメントに書いてあることですが、
gif付きでわかりやすい備忘録として残しておきました。

https://vim-jp.org/vimdoc-ja/insert.html
[perl] 日本の祝日と振替休日を避けて締め日と支払日を算出するモジュール作った

個人と企業とのやり取りの中で「何日締めの翌月何日払い」みたいなのを計算できるモジュール作りました。
もちろん「10日締めの月末払い」も計算できますし、土日祝を自動判定して休日なら翌営業日にずらす判定も行います。

正直、なんでこんなモジュールが存在しないんだ？って思いました。
どの企業もこの辺ゴリゴリ自作のサブルーチンこさえてるんでしょうか？

#SYNOPSIS

```
use Date::CutOff::JP;
my $dco = Date::CutOff::JP->new({ cutoff => 0, late => 1, payday => 0 });
my %calculated = $dco->calc_date('2019-01-01');
print $calculated{'cutoff'}; # '2019-01-31'
print $calculated{'payday'}; # '2019-02-28'
```

#~~問題点~~
[依存するモジュール](https://metacpan.org/pod/Calendar::Japanese::Holiday)を差し替えて対応済みです。
~~日本の祝日への対応は[すでにあるモジュール](https://metacpan.org/pod/Date::Japanese::Holiday)に依存しました。
その関係で最新の祝日（山の日と今年5月の天皇即位の日）に対応できてません。
レポジトリが見当たりませんが、perlライセンスなので勝手にフォークしてGitHubに修正バージョンをあげようかと思うのですが、そういう時ってみなさんどうしてます？
一応ご覧になるかどうかわかりませんけど、GitHubにあげてください！ってメールはしてみましたが…~~

ソース等は[GitHub](https://github.com/worthmine/Date-Cutoff-JP)をご確認ください。
誰か適切なテスト書いてくれ〜。

#参考

##[Calendar::Japanese::Holiday](https://metacpan.org/pod/Calendar::Japanese::Holiday) 0.05 を扱う上での注意点

本件はメールで作者に報告して前向きな回答をいただきました[^1]が、修正されるまで下記のように注意する必要があります。

```
use Calendar::Japanese::Holiday;
my $date = "2019-02-11";
my ($y, $m, $d ) = split "-", $date;
return isHoliday( $y, $m, $d, 1 );
```
のように使うと、`$y`,`$m`,`$d`が文字コンテキストの数字`( '2019', '02', '11' )`となり`undef`を返します。

```
 return isHoliday( $y, 0+$m, 0+$d, 1 );
```

とすることで回避できました
[^1]: 本日、0.06にて修正されました。
Dockerコマンド～備忘録～

####実行環境
Windows7 64bit メモリ4GB
※CCleanが入っているとVirtualBoxが動かないことがあります。
Docker ToolboxはVirtualBoxが動かないと動かせません。自分はCCleanを削除したことで動きました。

####使用教材
Udemyの[ Docker Mastery: The Complete Toolset From a Docker Captain ](https://www.udemy.com/share/1001ESBEMZdlpVTXg=/)を利用。

####前提
Dockerを勉強中のメモ
徐々に整理していく予定

####Docker ToolBoxでのコマンド
・Dockerの情報表示
docker info
・バージョンの表示
docker version

・nginxの起動、イメージがない場合はインストールも実施
docker container run --publish 80:80 nginx
->Docker ToolBoxはデフォルトのIPが[192.168.99.100](http://192.168.99.100/)。localhostはサポートしていない。

・上記の裏で実行する場合
docker container run --publish 80:80 --detach nginx

・上記のサーバに名前をつけて実行する場合
docker container run --publish 80:80 --detach --name webhost nginx

・dockerイメージで動いているもの
docker container ls

・dockerイメージが残っているもの
docker container ls -a

・裏で動かしているもののLog表示
docker container logs <names>

docker container top webhost

・停止しているイメージのみ削除※動いているものはエラーに
docker container rm <container id ※頭文字3字でOK>

・動いているものも強制的に削除
docker container rm -f <container id>
Scalaで条件分岐を使う

##はじめに
Scalaを勉強し始めたので、学んだ内容を整理していきます。
参考書として [基礎からわかるScala](https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8B-Scala-%E9%AE%AB%E5%B3%B6-%E5%85%89%E8%B2%B4/dp/4863542267) を使っています。

今回は、「条件分岐」について学びました。


##1. if式
###書き方
if (条件式) { 任意の処理 }
else if (条件式) { 任意の処理 }
else { 任意の処理 }

###サンプル
```ConditionSample.scala
for(cnt <- 1 to 4) {
  if(cnt == 1){
    println("Nice to meet you.");
  }
  else if(cnt == 2){
    println("Hello");
  }
  else {
    println("Bye...");
  }
}
```

###出力結果
>Nice to meet you.
>Hello
>Bye...
>Bye...

##2. if式 (三項演算子的な使い方)
###書き方
val 不定変数 = if (条件式) 値 else if (条件式) 値 else (条件式) 値;

###サンプル
```ConditionSample.scala
val name = if (true) "Tom" else "Fred";
println("My name is " + name);
```

###出力結果
>My name is Tom

##3. match式
###書き方
検査値 match { case 値 => 処理; case 値 => 処理; case _ => 処理; } 

###サンプル
```ConditionSample.scala
for(cnt <- 1 to 4) {
  cnt match {
    case 1 => println("Nice to meet you.");
    case 2 => println("Hello");
    case _ => println("Bye...");
  }
}
```

###出力結果
>Nice to meet you.
>Hello
>Bye...
>Bye...
Markdownで左側に上付き・下付き文字を付けたいときの書き方

```math
^{12}_{6}C
```

上記のような左側に上付き・下付き文字を書きたい場合は、「^」や「_」を先に記述します。

> \\$\\$
> ^{12}_{6}C
> \\$\\$

****

(2024/09/13 追記) 

**ただし，上記の方法はTex記法に沿った書き方となります．そのため，TeX記法に対応したMarkdownの環境でないと表示できません**．GitHubやVSCode，Typoraでは表示可能であることを確認していますが，ほかの環境では表示できない恐れがあります．その場合は，下記のようにHTMLタグで対応するか，画像を埋め込むかしてうまく対応する必要があります．ただ，HTMLタグだと下付き文字の真上に上付き文字をもってこられないので不格好になってしまいます．

コード↓

> `<sup>12</sup><sub>6</sub>C`

表示

<sup>12</sup><sub>6</sub>C
Angularで良い感じのselectbox(multiple)を実装する方法

#はじめに
Angularを使用して、selectboxで複数選択ができるようにする良い感じのフォームを作りたいとなったときに、結構手間取ったので、その手順などをメモしておきます。

方針は、自力で実装するという面倒なことは避けて、そういうことをやってくれるプラグインに任せようという作戦です。
#結論
結論として、Angular Materialというライブラリを使用することで実現できることがわかりました。

以下、実装手順になります。
※Angular CLIを使用した手順となりますので、Angular CLIを導入していない方は、以下の記事を参考に導入をお願いします。
https://qiita.com/Yamamoto0525/items/65d5a0b36eb4dbd8079b
##手順
###1.Angular Materialの導入
コンソールにて、以下のコマンドを実行してください。
`ng add @angular/material`
するとコンソールに、
`Choose a prebuilt theme name, or "custom" for a custom theme:`
と出てくるので、好きなテーマを選んでください。
以下、選択肢はすべてy連打で大丈夫です。
`Set up HammerJS for gesture recognition? Yes`
`Set up browser animations for Angular Material? Yes`

以上で、Angular Materialの導入は完了です。

###2.サンプルアプリの実装
サンプルアプリにはAngular CLIを使用して作成したアプリを使用します。

以下がサンプルアプリから変更を加えたソースです。

```TypeScript:app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { MatSelectModule } from '@angular/material';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    BrowserAnimationsModule,
    MatSelectModule,
    FormsModule,
    ReactiveFormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

```

```TypeScript:app.component.ts
import {Component} from '@angular/core';
import {FormControl} from '@angular/forms';

/** @title Select with multiple selection */
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  toppings = new FormControl();
  toppingList: string[] = ['Extra cheese', 'Mushroom', 'Onion', 'Pepperoni', 'Sausage', 'Tomato'];
}

```

```TypeScript:app.component.html
<div class="wrapper">
  <mat-form-field>
    <mat-select placeholder="Toppings" [formControl]="toppings" multiple>
      <mat-option *ngFor="let topping of toppingList" [value]="topping">{{topping}}</mat-option>
    </mat-select>
  </mat-form-field>
</div>
<router-outlet></router-outlet>
```
```scss:app.component.scss
.wrapper {
  width: 400px;
  height: auto;
  margin: 0 auto;
  margin-top: 200px;
}
.mat-form-field {
  width: 400px;
}
```

###3.サンプルアプリの実行
サンプルアプリの編集が終わったら、アプリを起動していきましょう。
コンソールで以下のコマンドを実行します。
`ng serve`

アプリが立ち上がったら、ブラウザからアクセスしましょう。
以下のような感じでselectboxが扱えます。


![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/143107/57aaf300-febf-227d-09d8-8ecc754c7118.jpeg)

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/143107/17a0f04b-14e0-2b52-fe6a-a2ee0cbed8c7.jpeg)


#参考
公式のドキュメントです。
https://material.angular.io/components/select/overview


#最後に
Jqueryのプラグインは色々見つかりますが、Angularのものは中々見つけられず。
しばらく時間かかってしまったので、この記事が誰かの助けになれば幸いです。
【Unity】キャンディー(アイテム)とキャラクター衝突時に発生するOnTriggerEnterイベント

キャンディー(アイテム)とキャラクター衝突時に発生するOnTriggerEnterイベント
💖Is Trigger チェックON
💖Use Gravity チェックOFF
💖Is Kinematic チェックON


実際に動かした動画はこちら↓↓
https://twitter.com/nonnonkapibara/status/1088063650357641217
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">🍬キャンディーとキャラクター衝突時に発生するイベント⁰🐹OnTriggerEnter🐹<br>勉強したよぉ😊<br>🌟Is Trigger チェックON<br>🌟Use Gravity チェックOFF<br>🌟Is Kinematic チェックON <a href="https://t.co/z04m2JZ0gm">pic.twitter.com/z04m2JZ0gm</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1088063650357641217?ref_src=twsrc%5Etfw">2019年1月23日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<font color="Magenta">Qiitaの容量オーバーで画像が貼り付けられなくなりました。（errorとなる）</font>

続きは、「はてなブログ」に記載してます↓
[かぴばらさんの覚書ブログ nonkapibara](https://nonkapibara.hatenablog.com/entry/2019/01/23/230309)
新人エンジニアがプルリクをワクワクに変えるために

# 新人にとってプルリクを出すことは怖い
**「怖いなあ。何言われるんだろう」**

まだ僕がエンジニアとして働き始めた頃。上司にコードレビューを頼む瞬間は本当に本当に恐怖でした。
せっかく開発が終わっても「先輩に何言われるんだろう…」と思ってしまい、エンジニアリングが全然楽しくなかったのです。

それから一年半ちょっと、僕は今まで4社でエンジニアインターンを経験して、色々な人にコードレビューをしてもらいました。
結果、今では「開発終わった！早く先輩に見て欲しいな！」とワクワクしながらプルリクを見てもらっています。

でも、僕の周りの新人エンジニアたちも多くは上司のレビューが怖いと言っています。
本来楽しいはずのエンジニアリングなのに、怖いと思ってしまうのは勿体無い。
この記事では「新人エンジニアがプルリクをワクワクに変えるためどうすればいいか」を僕の個人的意見を踏まえてお話ししていこうと思います。

# この記事の対象
- レビューされるの嫌だな、となんとなくでも思ってる新人エンジニア
- レビュワー向けの「正しいレビューのやり方」系の記事ではありません。

# そもそもなぜ、プルリクが「怖い」と思ってしまうのか
## 一気に色々コメントされて怖い
一個のプルリクに対してコメントが何十個とか付いてたら、新人エンジニアとしては「うわこんなに直さなきゃいけないのか…」と思ってしまいます。
それを直してまた見てもらって、またそれに何個もコメントが付いて…というループになってしまうケース。

## 単純に口調が怖い
「ここはこうじゃないよ。前も言ったよね？」
「これじゃ動かないじゃん。ちゃんと確認した？」
みたいなコメントをもらうと、普通に怖い。先輩がイライラしてるのが伝わってくるし、文字だとさらに冷たく感じてしまう。


# レビューする側だってストレスでしょ！
こういう現象を防ぐために、「レビュワーが気をつけるべきこと」のような記事はたくさんあります。
でも、僕はこういう現象はレビュワーだけじゃなくて、僕たち新人エンジニアも減らす努力をしなくちゃいけないと思っていて。　

先輩たちだって自分の仕事がある中で時間を割いて新人のためにレビューしてくれてるわけだし、さあレビューしようと思ってプルリクを見たら「え？全然違うことやってるんだけど…」って思ったらイライラしてしまうのも仕方ない気がします。だって人間だもの。

# 新人エンジニアがすべき努力
**プルリクを出す前の段階で、積極的にコミュニケーションを取る！**

これに尽きるのではないかと思います。
早めにコミュニケーションをとれば、プルリクの段階では上司も新人エンジニアも共通認識が取れてるはず。
こうなると、プルリクに何十個もコメントされることはないし（あるとしても細かい修正だけ）、上司もある程度想定されたアウトプットが出てくるのでイライラしなくて済みます。

何より、新人エンジニアからすると「せっかく頑張ったのにレビューで全然方向性違うことがわかってガン萎え」みたいな状況がなくなるので、レビューが楽しみになります。


# 具体的なコミュニケーションの方法
僕が今の会社でやってることをまとめます。
もちろん自分と上司の関係性とか職場の雰囲気次第な部分はあるので、参考程度にしてくだされば幸いです。

## STEP1 「この認識で合ってますか？」
「多分これで実装すれば正しいだろうな」って思ったとしても、なるべく実装に入る前に一言Slackでもいいから先輩に確認する。
「これって〇〇の処理を〇〇に書けばいいんですよね？」程度のノリで十分だと思います。
結構な頻度で「いやその処理はもう〇〇にあるからそれ使えばいいよ！」みたいにアドバイスをもらえるし、仮に「うん！それで大丈夫！」と言われても確信を持って実装に入れます。
やっぱり実装してから全然違った、は時間も勿体無いしモチベも下がるので、一言でも確認するようにしましょう。

## STEP2 「参考になる場所ありますか？」
STEP1のように自分でやり方がわからなかった時。
「〇〇の処理がわからないので一から教えてください！」と言うハードルは高いし、上司の時間も奪わない為にも似てるところだけ示してもらうのはアリな気がします。
意外と言われればそこを参考にしてどうにかなることが多いですし、コードを読んで理解する力もつくと思います。

## STEP3 「ペアプロしてください！！」
最終手段です。
「もう自分がどこがわからないかもわからない」みたいな状況の時って、そもそもどうやって質問していいかもわからない。
そういう時は素直に「どこがわからないかもわからないので一緒にやってくれませんか？」と聞いてしまいましょう。
ペアプロの素晴らしいところはただ正解がわかるだけじゃなくて、先輩の「その正解に到るまでの考え方」を目の前で見られることだと思います。
「ここがわからなかったらまずこれを考えればいいんだな」っていう上流の考え方って意外と学べるタイミングがないんですよね。


# それでも質問のハードルが高い人へ。
「今質問したら迷惑がられないかな」と思って、自分で一人で悩み続けてしまう人へ。
僕も昔質問するの怖くてどうにか自分でできないかなって時間をとかして、結局変なアウトプットを出してしまうことはよくありました。
でも、僕も友達のコードレビューをした時初めて実感したのですが、ちょろっと質問されるよりも、訳のわかんないプルリク出される方がよっぽど迷惑！！
なので「結局はお互いのためになる！」と割り切って、勇気を持って質問しに行きましょう。

それでもペアプロとかすると一時間とか平気で先輩の時間を奪ってしまうことになります。
その時も、「迷惑かけたな、申し訳ないな…」ってネガティブな気持ちになるのではなく、「一時間も投資してくれた！ちゃんと成長して会社に恩返しできるようになろう！」とポジティブな気持ちで先輩に感謝できるようになりたいですね。

# 最後に
学校の試験と違って、仕事ならいくらでも事前にフィードバックをもらえるので、積極的にコミュニケーションをとっていきましょう！
一人でも「仕事つまんないなあ」と思う新人エンジニアが減るのを願って。
[mastodon] PostgreSQLを 9.5 → 11.1 へアップグレードする

## 経緯
お一人様用のmastodonを運用しているのですが、mastodonの2.7.0へのアップデートにより、PostgreSQLのアップグレードが推奨されることとなりました。
ミドルウェアのアップグレードなんてしたことがないですし、聞ける人もいないしうわーんって感じです。
去年夏ごろに立てた鯖なのですが、入っているPostgreSQLのバージョンが9.5でしたので、これを機に負債を解消すべく一気に気合でアップグレードを行うことにしました。
いろいろ調べて自分で咀嚼できた手順でやってみました。

他の鯖缶さんたちの役に立てばと思い公開しますが、
正直、こっち↓の方法がUbuntuでは最適解だと思いますので、そちらを試してみてほしいなぁと思うところがあります。
https://gorails.com/guides/upgrading-postgresql-version-on-ubuntu-server
存在は知ってたのですがポート変えて起動しなきゃなのか？とかちょっとよくわからなかったのでやめました。
手動でアップグレードしてみた今ならなるほどな～って感じで実行できますね…。
なにも考えずにapt-getで11をインストールしてそのまま↑の流れに乗っかればいいだけですね。

## 前提
- Ubuntu 16.04
- mastodon 非Docker

## おおまかな流れ
- mastodonを停止
- 既存PostgreSQLのバックアップと退避
- 新しいPostgreSQLをインストール
- バックアップより復元
- サーバリブート

### mastodonを停止
とりあえずとめます。

```bash
systemctl stop mastodon-*.service
```

### 既存PostgreSQLのバックアップと退避
PostgreSQLの中身をpg_dumpallでdumpします。
postgresユーザじゃないと動かないのでsuでユーザ変えるのを忘れずに。

```bash
sudo su postgres
mkdir backup
cd backup
pg_dumpall > all_backup_postgres-db_20190122
exit
```

dumpしおわったらrootで旧PostgreSQLを一応退避
これ退避しなくても正直よしなにやってくれるので放置でもいいとおもうんですけど一応。

```
sudo su
systemctl stop postgresql
mv /var/lib/postgresql /var/lib/postgresql.old
mv /etc/postgresql /etc/postgresql.old
```

うちの環境では`/var/lib/postgresql`にインストールされているようでした。
また、`/etc/postgresql/9.5/main/postgresql.conf`を見ると
`data_directory=/var/lib/postgresql`になっていたので
そちらも退避してます。

### 新しいPostgreSQLをインストール

コレ自体は本家のページと同様です。
https://www.postgresql.org/download/linux/ubuntu/
ただバージョン指定せずにlatestを引っ張ってきてます。

apt-getのリポジトリに追加します。

```bash
vim /etc/apt/sources.list.d/pgdg.list
# でこれ↓を追加
deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main
```
その後は新しいPostgreSQLをインストールします。

```bash
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
apt-get update
apt-get install postgresql
```

### バックアップより復元
取ってたdumpからDBなど復元します。

```bash
sudo su postgres
cd /var/lib/postgresql.old/backup
# dumpより復元
psql -d postgres -f all_backup_postgres-db_20190122
# 一応再起動
sudo systemctl restart postgresql
# クラスターが上がってきているか確認
pg_lsclusters
```

### サーバリブート
この時点で`sudo systemctl start mastodon-*.service`で上げてもある程度は動いたのですが、sidekiq先輩がうまく動かず、他鯖との通信がだめだったのでリブートしました。
自鯖だと自分の裁量でてきとうにできるのでいいですね。

## まとめ
DBという飛ぶとやばいやつのアップグレードという貴重な体験をすることができたのでよかったです。
自鯖を持つとインフラ周りの大変さが非常によくわかりますね。。。
何かしらおかしい点があればツッコミをお願いします。
あぁ、次はRedisを3→5に上げるのとRubyを2.5.3→2.6へ上げないと……。
シェルスクリプト（DVD CD 2 ISO）

# 1.小ネタ
- 想い出のDVDやCDをいつまでもイメージに残しておきたい時にお使いください。

```shell:mkdvdiso.sh（Ubuntu系）
#!/bin/sh

# This is small script to allow you to leave memories.
# This script was made by zono_0
# Ubuntu系バージョン

# 引数チェック
if [ $# -ne 0 ]; then
    echo "引数は指定せず実行してください。"
    exit 1
fi

# DVDボリューム名の取得
prevname=`volname`

# 不要スペースのトリム
vname=`echo $prevname`
echo "$vnameのisoファイルを作成します。\n"

# DVDの読み込み
printf "dvdbackupを開始します。\n"
dvdbackup -M -i /dev/cdrom -o "./" -n "$vname"
printf "dvdbackupを終了します。\n"

# iso形式に変換
printf "mkisofsを開始します。\n"
mkisofs -udf -dvd-video -o "./$vname.iso" "./$vname"
printf "mkisofsを終了します。\n"

# 不要フォルダの削除
printf "不要フォルダの削除を開始します。\n"
rm -rf "./$vname"
printf "不要フォルダの削除を終了します。\n"

# 正常終了
exit 0

```


```shell:mkdvdiso.sh（Debian系）
#!/bin/sh

# This is small script to allow you to leave memories.
# This script was made by zono_0
# Debian系バージョン

# 引数チェック
#if [ $# -ne 0 ]; then
#	echo "引数は指定せず実行してください。"
#	exit 1
#fi

# DVDボリューム名の取得
prevname=`volname`

# 不要スペースのトリム
vname=`echo $prevname`
echo "$vnameのisoファイルを作成します。\n"

# DVDの読み込み
printf "dvdbackupを開始します。\n"
dvdbackup -M -i /dev/cdrom -o "./" -n "$vname"
printf "dvdbackupを終了します。\n"

# iso形式に変換
printf "genisoimageを開始します。\n"
genisoimage -udf -dvd-video -o "./$vname.iso" "./$vname"
printf "genisoimageを終了します。\n"

# 不要フォルダの削除
printf "不要フォルダの削除を開始します。\n"
rm -rf "./$vname"
printf "不要フォルダの削除を終了します。\n"

# 正常終了
exit 0

```
---

# 2. 参考文献
- [どうすれば DVD 再生用の制限されたコーデックを使用できますか?](https://sicklylife.jp/ubuntu/1804/help/video-dvd-restricted.html)
- [UbuntuでDVDを再生する方法](https://www.4videosoft.jp/tutorial/play-dvd-on-ubuntu.html)
- [ubuntu 18.04 インストール(8) マルチメディア系](http://verifiedby.me/adiary/0124)

---
each と map の差分理解

#each と mapってどうやって使い分けるんだ？
と思って備忘録的にこちらに残します。

##とりあえず書いてみた

```:.eachの場合
>> (1..5).each{|i| i**2}
=> 1..5
```

```:.mapの場合
(1..5).map {|i| i**2}
=> [1, 4, 9, 16, 25]
```

たしかに、railsチュートリアルにも

>
mapメソッドは、渡されたブロックを配列や範囲オブジェクトの各要素に対して適用し、その結果を返します
>

と記載されていますね。

色々ググると
eachはループ内で処理を逐一細かく必要があるが、
mapの場合は外から処理を渡せる
みたいな理解で問題なさそうです。

##eachで同じような処理をしてみた
```
>> a = (1..5).to_a
=> [1, 2, 3, 4, 5]
>> array=[]
=> []
>> a.each do |i|
?>  array<<i**2
>> end
=> [1, 2, 3, 4, 5]
>> array
=> [1, 4, 9, 16, 25]
```
たしかにめんどくさい・・・

調べてみると他にも記法は色々ありそうなので、継続して見てみようかと思います。
Python  の CUI デバッガ「PuDB」の紹介と使い方

# ■ はじめに

今回は Python デバッガである「PuDB」のご紹介です。

PuDB とは、軽量さと機能性を兼ね備えた CUI ベースの Python デバッガです。次のような特徴を持つ(主観)ことから、やや重たい環境や、そもそも GUI(IDE) が使えないような環境でサクッとデバッグしたい時に重宝しています(お気に入りです)。

- 軽量
- CUI ベースのデバッガ
- GDB ライクな操作性
- 変数の自動監視が可能など多機能
- CUI ベースでありながら、グラフィカルで見栄えが良い

# ■ インストール

```console
$ pip install pudb
```

# ■ 基本的な使い方

まずは起動

```console
$ pudb <スクリプト名>.py
```

or

```console
$ python -m pudb <スクリプト名>.py
```
起動したら、次の表にあるキーを入力し操作(デバッグ)を行います[^入力キー補足]。

[^入力キー補足]: ヘルプを実行すると分かりますが、入力キーは他にもあります。個人的に基本的と思うものだけ載せています。

|挙動|入力キー|
|:---|:---|
|ブレイクポイント切り替え|b|
|条件付きブレイクポイント設定|後述の 3.3 を参照|
|ステップオーバー|n|
|ステップイン|s|
|コンティニュー|c|
|文字列検索|/<文字列>|
|検索結果(前方/後方)検索|.(ドット)、,(カンマ)|
|カーソル移動(上/下、 左/右)|k/j、 h/l|
|カーソル移動(最初の行/最終行)|g/G|
|カーソル(行指定)|L[Enter] ---> Go to Line に行指定|
|ソースコード表示枠フォーカス|C or 十字キー(↑↓←→)|
|変数表示枠フォーカス|V or 十字キー(↑↓←→)|
|スタック表示枠フォーカス|S or 十字キー(↑↓←→)|
|ブレイクポイント表示枠フォーカス|B or 十字キー(↑↓←→)|
|終了|q[Enter] ---> Quit[Enter]|
|ヘルプ|?|

# ■ 実際の操作画面

文字だけだと伝わりにくいと思いますので、2つほど(3.2, 3.3)実際の操作画面を載せておきます。

なお、以降の操作画面(デバッグ)では次のソースを使用します。

```python
# ファイル名: pudb_demo.py

 def main():
    cnt = 0
    while cnt < 10:
    	cnt+=1
    	print(cnt)
 
 if __name__ == '__main__':
 	main()
```

## 1. デバッガ起動後の画面

```
$ pudb pudb_demo.py
```

などで起動すると、次のような画面が表示されます。左側にソースコード表示枠、右側が3つに分割されており、右上から、変数表示枠(Variables:)、スタック表示枠(Stack:)、ブレイクポイント表示枠(Breakpoints:)という構成になっています。変数表示枠から、変数を確認できます。(変数の定義を通ると、自動で変数表示枠に追加されます)。

![8_default_screen.png](https://qiita-image-store.s3.amazonaws.com/0/283234/f03d87d2-2535-106a-c70d-80aefa8d0c30.png)

ちなみに、次の黒画面のように行数の表示有無や、テーマカラーなどを変更することができます。設定を変更するには、``Ctrl + p`` から行います。

![8_initial_screen.png](https://qiita-image-store.s3.amazonaws.com/0/283234/b72244e8-1351-c11b-c6fb-396909a3a2fb.png)

## 2. 文字列検索

次の例では、デバッガのエディタ内を **cnt** で検索しています。
**.(ドット)** で前方検索、**,（カンマ）** で後方検索しています。

画面内で入力しているキー(/cnt....,,,,)
![8_search.gif](https://qiita-image-store.s3.amazonaws.com/0/283234/f898c9c2-d35d-144a-e4da-4d2f10b5e481.gif)

## 3. 条件付きブレイクポイントの設定

次の例では、5行目にブレイクポイントを貼り、cnt 変数が　5 の時に止まるように条件(cnt == 5)を設定しています（その後にコンティニュー(c)しています)。

右上の変数表示枠(Variables:)を確認すると、cnt が 5 のときにヒットしています。

画面内で入力しているキー(L5→[Enter]bB[Enter]↓cnt == 5→[Enter]Cc)
![8_setting_breakpoint_with_condition.gif](https://qiita-image-store.s3.amazonaws.com/0/283234/04a085f9-65d8-f394-7446-0eaf372972b4.gif)

設定手順は、次のとおりです。
1. 任意の箇所へブレイクポイントを設定(bキー)
2. ブレイクポイント表示枠（右下）から手順 1 のブレイクポイントを選択[Enter]
3. Edit Breakpoint 画面の Condition: に「cnt == 5」のように条件を入力し、OK[Enter]
4. コンティニュー(c)などで走らせる

# ■ 補足

より深く知りたい方向けに、ドキュメントやソースコードのリンクを張っておきます。

ドキュメントは[こちら](https://documen.tician.de/pudb/)
ソースコードは[こちらから](https://github.com/inducer/pudb)
nuxt-linkで今いるページと同じURLを叩いた時に何も起きないので、その時はイベントが実行されるようなコンポーネントを作る

#始めに
タイトルの通りですが、nuxt-linkで同じURLへのリンクは押しても何も変化が起きません。
調べていないですがrouter-linkでも同じことかもしれないです。

移動しないならば移動しないで何かしらイベントなり出してくれれば強制的にリロードしたり、データの再取得だけ行ったりとか出来るのですがそれも無いようなので、イベントを出してくれるコンポーネントを作ってみました。

router.pushを使えばまぁ楽なのですが、なるべくaタグにしたいなと思った結果です。

#コード
```vuejs
<template>
  <component :is="rootTagName" :to="to" @click="click()">
    <slot/>
  </component>
</template>

<script>
import _ from 'lodash'

export default {
  props:{
    to:{
      type:[String,Object],
      default: ''
    }
  },
  computed:{
    isSameUrl(){

      const current = this.$route
      const to = this.$router.resolve(this.to).route

      return (
        current.name === to.name &&
        current.hash === to.hash &&
        _.isEqual(current.params,to.params) &&
        _.isEqual(current.query,to.query)
      )

    },
    rootTagName(){
      return this.isSameUrl ? 'span' : 'nuxt-link'
    }
  },
  methods:{
    click(){
      this.$emit('sameurl')
    }
  }
}
</script>
```

#かなり軽い説明
同URLの時はsameurlがemitされるようにしています。

同URLの時はspanタグに切り替えている理由ですが、
nuxt-linkにつけたclick.nativeの実行タイミングがかなり遅くて移動後の値がとれてしまい、常時同URLという判定になったりしていました。
なのでspanタグにしてclickをつける形にしました。こうすればnuxt-linkになってる時はイベントが走らないので同URLの時だけイベントが走るようになります。

#終わりに
もっといい方法がきっとあると思うので知りたいです。
【Unity】jpgファイルからマテリアルを作成しSkybox Materialを設定するやり方


<font color="Magenta">Unityで、jpgファイルからマテリアルを作成しSkybox Materialを設定するやり方</font>

完成したSkyboxはこちら↓↓
https://twitter.com/nonnonkapibara/status/1088063650357641217
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">🍬キャンディーとキャラクター衝突時に発生するイベント⁰🐹OnTriggerEnter🐹<br>勉強したよぉ😊<br>🌟Is Trigger チェックON<br>🌟Use Gravity チェックOFF<br>🌟Is Kinematic チェックON <a href="https://t.co/z04m2JZ0gm">pic.twitter.com/z04m2JZ0gm</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1088063650357641217?ref_src=twsrc%5Etfw">2019年1月23日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Unity 2018.2.15f1


<font color="Magenta">Qiitaの容量オーバーで画像が貼り付けられなくなりました。（errorとなる）</font>

続きは、「はてなブログ」に記載してます↓
[かぴばらさんの覚書ブログ nonkapibara](https://nonkapibara.hatenablog.com/entry/2019/01/23/224243)
gitでリモートのmasterがfeatureブランチから何コミット進んでいるか？

## TL;DR;
gitでリモートのベースブランチ(masterとする)が今いるブランチから何コミット進んでいるか知りたければ

```sh
git fetch; git log --no-merges --oneline ..origin/master | wc -l
```

と打てば良い。

## 余談
### 補足説明
例えば、featureブランチで作業中に、他の人のコミット7個が origin/master にマージされている状態でこのコマンドを打ち込むと、

```shell-session
$> git fetch; git log --no-merges --oneline ..origin/master | wc -l
7
```

のようにコミット数が表示されます。
※fetchしていないコミットがある場合には数字が出る前にfetchの結果が出力されます。これを捨てることはできますが、重要な情報なので表示した方が良いでしょう。

### エイリアス
よく使うなら、こんなエイリアスを登録しておくと便利かもしれません。

```shell
[alias]
  mile-to-master = "!f() { git fetch; git log --no-merges --oneline ..origin/master | wc -l; }; f"
```

あまりいい名前を思い付かなかった…。
関数にするとブランチ名の補完が効かなかったりするので、エイリアス固定にしとくと楽な気がします。

### 経緯
とあるSlackグループでこんな話が出ました。

> gitでローカルでfeatureブランチで作業しているうちにbaseブランチが何コミット進んだかをCLIで数えるお手軽な方法あんのかな

確かに、自分が作業してる間に世間がどれだけ先行したかを知りたいときはあるなー、と思ったので、簡単なワンライナを考えてみました。

```shell
git log --no-merges --oneline ..master | wc -l
```

で、この話題を出した人が現在のリモートと比較するならfetchが要るよね、ということでfetchを加えて、こうなりました。

```sh
git fetch; git log --no-merges --oneline ..origin/master | wc -l
```
C++でOpenCVを使う際のコンパイルエラーの対処法

##目的
C++でOpenCVを使う際に、コンパイルしたときエラーが出たので解決した。

環境
-Ubuntu 18.04

##エラー内容
エラーログ取り忘れたので悲しいけど、`undefined reference`っていうエラーが出ました。


[ここ](#OpenCV)を見てもらうとわかりますが、リンカーが問題らしいです。詳しくはあまりわかりませんが。

コンパイルする際にこのようにするとうまくいきます。

```g++ -o test_1 test_1.cpp `pkg-config opencv --cflags --libs` 
```

でも直近でopencvを使ったコードをコンパイルするときは実行時間のリンクの問題？があるらしいので、エラー回避のため、`sudo ldconfig`を実行すればよいそうです。

まあここまでは[参考URL](#OpenCV)を見てもらえばいいかなと思います。

##Shell Scriptでまとめた
しかし、いちいち`g++`から始まるコードを打つのは面倒くさいと感じたので、shell scriptを使って楽をしちゃいました。ファイル名はopencv.shという名前にしています。

```shell
#!/bin/bash

PARAM=${1:?}

if [ $# -ne 1 ]; then
        echo "Designated argument is $#." 1>&2
        echo "Need 1 argument to execute." 1>&2
        exit 1
fi

g++ -o $PARAM $PARAM.cpp `pkg-config opencv --cflags --libs`
```

短いので見た通りなのですが、PARAMで引数を取って、ifの部分は引数に関するエラー処理（もし引数が１つじゃなかった場合の話です）、メインの`g++`の部分が今回使うコンパイルのコードです。

コードからもわかる通り、$PARAMにはcppが入っちゃいけないので、cpp抜きのファイル名を入れます。

### 使用例
`./opencv.sh test`
で、これは
```g++ -o test test.cpp `pkg-config opencv --cflags --libs`
```
と同義です。

##参考URL
<a name="OpenCV">
Cannot get OpenCV to compile because of undefined references?　
https://stackoverflow.com/questions/24337932/cannot-get-opencv-to-compile-because-of-undefined-references
</a>
あなたが学ぶべき10のAIフレームワーク＆ライブラリ（翻訳）

英語記事の和訳です。訳が雑なのは目をつぶってください...

# 原文
[Top 10 Trending Artificial Intelligence Frameworks and Libraries](https://hackernoon.com/top-10-trending-artificial-intelligence-frameworks-and-libraries-69ba59057a78)

# 訳文
人工知能はプログラミング世界の未来です。AIテクノロジーの需要が増加するのを目の当たりにして、多くの開発者はだんだんとこのサイエンスに親しむようになってきました。AIとその実装方法について、あなたが学び始めるときに、一番始めに思いつく質問は「最も学ぶべき言語/フレームワーク/ライブラリは何だ？」でしょう。その質問に答えるのがまさに今日この記事で紹介する、全てのプログラマが知るべきトップ10AIフレームワーク・ライブラリです。  

正直言って、一部の言語にはAIを実装するのに適していないものもあります。例えば、AIにハマっている多くのRuby開発者は、彼らの最も愛する言語を見捨てて、Pythonに乗り換えています。なぜならPythonの方がAIを実装するのに適しているからです。しかしながら、C++のようなAIフレンドリーな言語は多くのフレームワークやライブラリを出しています。我々はそれらを調べ、ベストなものを選び出しました。以下に挙げるのが、そのリストです。

* TensorFlow
* Torch
* Caffe
* Theano
* Amazon Machine Learning
* Accord.Net
* Scikit-learn
* Apache Mahout
* Microsoft Cognitive Toolkit
* Keras

それぞれのフレームワーク・ライブラリの詳細を見ていきましょう。そしてこれらのフラームワーク・ライブラリがなぜ選ばれたのか、その理由を紐解いていきましょう。

### TensorFlow
TensorFlowはある二つの理由によって、このリストの一番上に持ってきました。一つ目にこれは、オープンソースであるということです。二つ目の理由は、TensorFlowは、AMD、SAP、Google、Intel、Nvidiaといったテック企業の巨人たちに人気のAIツールとなっていることです。GoogleのAI部門によって開発され、莫大な数値コンピューティングに完璧に適しており、バイオサイエンスなど多くの分野で使われています。AIプログラミングを始めたての人にとって完璧なフレームワークといっていいでしょう。

### Torch
これはLuaJITプログラミング言語上で動くGPU志向のAIコンピューティングフレームワークです。このフレームワークもオープンソースで、十分な量のドキュメントとサポートがあります。また、TorchはGoogle、Facebook、Purdue、NYU、Twitterにも使われています。

### Caffe
Caffeは、Ph.D.プロジェクトとして、Yangqing Jia（彼は今Facebookで働いています）によって独自に作られ、世の中で最も人気のフレームワークの一つとなりました。Caffeの画像分類デモはチェックするべきです。そのデモはまだ完璧ではありませんが、少なくとも犬と猫を見分けることはできます。

### Theano
すでに述べたように、PythonはAIとディープラーニングに完璧に相性のいい言語です。この言語には、すでに多くの注目すべきライブラリが存在しています。その一つが2007年から開発されているTheanoです。定義、最適化、評価といった数学表現で動くmain関数を持ちます。

### Amazon Machine Learning
AWSは世界中の何千のビジネス、組織で使われている機械学習プラットフォームをたくさん提供しています。これらのプラットフォームは主要なAIフレームワークで動いており、多くのすぐに使えるAIソリューションを提供します。

### Accord.Net
これは主に音声・画像処理を目的としたかなりの数の既成のライブラリを提供する.NETベースのAIフレームワークです。分類、回帰、クラスタリング、分布といった最も人気のあるAI分野の問題を扱うことができます。

### Scikit-learn
2007年から開発されるPythonベースの機械学習ライブラリで、データマイニングやデータ分析はもちろん主要なAIの問題を扱うことができます。

### Apache Mahout
Mahout by Apacheは線形代数を使う機械学習フレームワークです。Scala DSLを使い、主要なAIの問題を扱うのに適しています。

### Microsoft Cognitive Toolkit
もちろん我々はMicrosoftの機械学習ベイビー、Cognitive Toolkitについて述べずにはいられません。オープンソースであり、様々なAIアプリケーションに適しています。

### Keras
これはPythonで書かれたもう一つのフレームワークです。Kerasの特徴の一つは、TheanoやTensorFlowのような他のフレームワークの上で動かせるという点です。すぐに実験できるということに焦点を当てています。

### 最後に
AIはプログラミング世界にとって非常に魅力的なものです。意識の高いソフトウェア企業はすでに専用のAI開発チームを持っていることでしょう。しかしながら、卓越したAIスペシャリストになるためには、知性、才能、根気、そしてハードワークが必要です。あなたがこれらを持っているとすれば、この分野に参入するのは今がベストなタイミングです。あなたがPythonのような基本的なプログラミング言語と機械学習の基礎を知っているのなら、あなたに必要なのは、正しいAIフレームワークを選択し、働き始めることだけです。

# 私感
正直上の記事が本当にTop 10 AI framework/libraryなのかは謎です。PyTorchが入っていないのが気になりました。
[Service Worker, Cache, fetch] Request の destination

仮に静的なファイルは全てキャッシュ優先としたいとする。
request から response を予想したい気がする。

`respondWith` で何を返すのかを先に決めたいのだ。
ネットワークなのかキャッシュなのか。

```js:sw.js
self.addEventListener('fetch', function(event) {
  console.log(
    event.request.destination,
    event.request.headers.get('accept'),
    event.request.url
  );
  ...
```

```:console
style text/css,*/*;q=0.1 http://localhost:5000/static/css/main.b3e7f2db.chunk.css 
script */* http://localhost:5000/static/js/1.fa92c112.chunk.js 
script */* http://localhost:5000/static/js/main.e67a537a.chunk.js 
image image/webp,image/apng,image/*,*/*;q=0.8 http://localhost:5000/static/media/logo.5d5d9eef.svg 
*/*  http://localhost:5000/sw.js 
document text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 http://localhost:5000/help 
unknown */* http://localhost:5000/help
```

`accept` はそもそもjsファイルを捉えられない。
urlでマッチングするのはめんどくさい。画像の拡張子とかたくさんある。

## `request.destination` が抽象度が高くて良い

`style, script, image, document, unknown, ''` 

（追記）他にもたくさんあるらしい↓。
https://developer.mozilla.org/en-US/docs/Web/API/RequestDestination
https://fetch.spec.whatwg.org/#concept-request-destination


で、 destination って何者？
UNIX コマンド

コマンドの学習日記
vagrantで作成した仮想環境を前提

# プロンプト

```
[vagrant@localhost ~] $
```

- **vagrant**はユーザーの名前
- ```@localhost```ログインしているマシン名
- **~（チルダ）**ユーザーのhomeディレクトリの省略
- **$**ユーザーの種別を示す。**$**は一般ユーザー、**#**管理ユーザー

# UNIXの中身

```cd /```の中身
代表的なものだけ

- /bin
    - システムを動かすためのコマンドの実行ファイルが入っている
- /etc
    - アプリケーションの設定ファイルが入っている
    - ```/etc/passwd```ユーザー各ファイルの一覧が表示される
    - ```/etc/group```グループの各ファイルの一覧が表示される
- /home
    - 各ユーザーのhomeディレクトリが入っている
- /sbin
    - システム管理用のコマンドが入っている
- /usr
    - 一般的なアプリケーションが入っている
- /var
    - システムのログファイルなど頻繁に書き換わるファイルが入っている 

# コマンド

- pwd
  - 現在のディレクトリを表示
- clear もしくは ctrl + l
  - ターミナルの表示をクリアにする
- cd ディレクトリ名
  - ディレクトリを移動する
  - ```cd ..```で一つ上のディレクトリに移動する
  - ```cd -```で一つ上のディレクトリに移動する
  - ディレクトリの指定には、相対指定と絶対指定がある
      - 相対指定（現在地からの指定）
      - 絶対指定（一番上からパスを指定する）
- mkdir オプション ディレクトリ名
  - mkdir -p ディレクトリ/ディレクトリのように親ディレクトリがなかった場合作成してくれる
  - ディレクトリを新しく作成する
- ls
  - ディレクトリ一覧を表示する
- cp オプション コピー元 コピー先
  - 対象をコピーする
  - ```cp コピー元 .```コピー元を現在のディレクトリにコピーする
- mv
  - ディレクトリを移動する
  - 同じディレクトリ内だとディレクトリ（ファイル）名の変更になる
- rm オプション ファイルもしくはディレクトリ
  - ファイル、ディレクトリを削除する（空のみ）
  - ```rm -r```とすると中身があっても削除ができる
- cat ファイル
  - ファイルの中身を表示する
- less ファイル名
  - 1画面にファイルの中身を表示する
- history
  - コマンドの履歴を一覧で表示する
- !履歴の番号
  - 履歴の番号を実行する
  - !!直前のコマンドを実行する
- コマンド !$
  - !$に直前の引数を引き継ぐ
- !コマンド
  - 途中でも近いコマンドを実行する
- touch
  - 空のファイルを作成する
- ln
  - シンボリックリンクを作成する
- unlink
  - シンボリックリンクを削除する
- groups
  - 自分が所属するグループが表示される
- chmod 対象者+アクセス権 ファイル名、もしくは2進数 chmod 1~71~71~7 ファイル名
  - アクセス権を変更
- type
  - コマンドの有無を検索する
- printenv
  - 環境変数の一覧を表示する
- export PATH=ディレクトリ:$PATH
  - 環境変数を設定する
- which コマンド
  - コマンドがどこのディレクトリから読みだされているかを表示
- su
  - ユーザーを切り替える
  - ```su -``` でrootユーザーに切り替える
- sudo コマンド
  - 管理者権限をもっていると管理者のファイルが実行できる
- chown ユーザー:グループ ファイル
  - ファイルの所有者を変更する
- wc ファイル名
  - 行数 ワード数 バイト数 ファイル名で表示がされる
- head ファイル
  - ファイルの先頭から表示する
- tail ファイル
  - ファイルの末尾から表示する
- grep 'テキスト' ファイル
  - ファイルからテキストを検索する
- find ディレクトリ オプション 検索ワード
  - ディレクトリから検索ワードで検索する 
- コマンド元 > コマンド先
  - コマンド先の先頭にコマンド元を追記する
- コマンド元 >> コマンド先
  - コマンド先の末尾にコマンド元を追記する
- コマンド元 | コマンド先
  - コマンド元の出力結果をコマンド先に渡す


# オプション

- コマンド --help
  - コマンドの使用方法が表示される
- man コマンド
  - コマンドのマニュアルが表示される

# bash

- tabキー
  - ディレクトリやファイル名を補完する
- ctrl + c
  - 動いている機能を安全に停止する
- 矢印キー上
  - コマンドの履歴をみれる
- ctrl + r
  - 実行したコマンドの検索ができる

## ブレース展開{}

```
echo {a,b,c}
// a b c
echo {1..10}
// 1 2 3 4 5 6 7 8 9 10
```

# Permission

```
ls -l hello.txt
-rw-r--r-- 1 ユーザー名 197121 13 1月  23 20:21 hello.txt
```

## アクセス権

```
-rw-r--r--
↓2進数
644
```
4,3,3で分けられる

- 最初の4文字-rw-
  - ユーザーのアクセス権
- 真ん中の3文字
  - グループのアクセス権
- 最後の3文字
  - ほかのメンバーのアクセス権

### 文字の意味

- r
  - read読み込み可
- w
  - write書き込み可
- x
  - execute実行可

### 2進数
- r
  - 2^2 = 4
- w
  - 2^1 = 3
- x
  - 2^0 = 1

# オリジナルの実行コマンド

```
vim hello
```
```
//helloの中身
#!/bin/bash
echo "hello"
```

```
./hello
```

これでhelloが実行される

# ワイルドカード（正規表現）

```
ls *.txt
```

すべてのtxtファイルの一覧を表示する
Redshiftのオンラインセミナー受けてみた

「[AWS Black Belt Online Seminar Redshift Recently Features Update](https://www.slideshare.net/AmazonWebServicesJapan/20190122-aws-black-belt-online-seminar-amazon-redshift-update)」の自分向けメモ
Redshiftっていう単語は聞いたことある......レベルの人向け


## セミナーの内容
 - Redshiftの概要
 - Redshiftの最新情報
 - Redshiftの今後について

## Redshiftの概要
### 一言でいうと
- スケーラブルなマネージドDB
- データウェアハウス（分析に特化したRDB）
- スケーラブルで分析対象、データ量が増えても対応可能
- S3上のデータをそのまま読み込むことが可能（ロードなし）
- 小規模から大規模まで対応した料金体系

### アーキテクチャ
 - クラスター
    - 1つのリーダーノードと複数のコンピュートノードで構成

 - リーダーノード
    - コンピュートノードへのパスを保持
    - SQL生成

 - コンピュートノード
    - データ格納
    - 並列実行（コンピュートノードを増やせばリニアにパフォーマンスが向上）
    - S3連携

 - Redshift Spectrum
    - S3にクエリを実行可能
    - データロード不要（同期不要）
    - RedshiftとS3のデータ結合
 
### 高速処理
 - shared nothing
    - コンピュートノード間でディスクの共有は行わない

 - MPP
    - コンピュートノードの分散処理

 - スライス
    - コンピュートノード内で、メモリ、ディスクを論理的に分割してさらに並列化

 - 列指向ストレージ
    - ディスクI/Oボトルネックの回避　ディスクブロックに列ごとに格納してI/O削減

 - データ圧縮
    - 列ごとに圧縮

 - ゾーンマップ
    - リーダーノードで読み飛ばす列ブロックを把握

 - ショートクエリアクセラレーション（SQA）
    - SQL実行前に評価する
    - 重たい処理中に軽いSQLが来たときに高速キューに入れる

 - リザルトキャッシュ
    - SQLの実行結果をリーダーノードにキャッシュする

### インスタンス選択時の要素
 - インスタンスタイプ
 - CPU
 - メモリ
 - ストレージ
 - スライス
 - ノード数

## Redshiftの最新情報
### speed
 - クエリパフォーマンスの継続的向上
    - 2018年は6か月で3倍になっている
    - 特にハッシュジョインの高速化、メモリ改善

 - Elastic Resize
    - コンピュートノードの追加、削除を高速化（数分）　
    - ユースケース
        - １クエリのためとか夜間の間だけ追加
        - 使われない時間は減らす
    - 仕組み
        1. S3にバックアップ　※ユーザー影響なし
        - ノード再構成を数分で処理  
          クエリは読み取り専用となり、更新系クエリはリーダーノードにキューイングされる    
        - S3からデータを戻す  
          読み取り専用は順次解除され、キューイングされたクエリに関係するデータから戻される
    - インスタンスタイプの変更、多くのノードをリサイズは不可（Classic resizeを利用する）

 - （参考）Classic Resize
    - 従来のリサイズ方法
    - 拡張後の空のクラスタを用意し、既存を読み取り専用にして、データ移動、エンドポイント切り替え
    - データ容量に応じて時間が必要、かつリサイズ中は読み取り専用

### simplicity
 - Vacuum Delete
    - 削除や更新で確保した領域の自動開放
 - Analyze
    - 統計情報の更新を自動化

### scale
 - VPC内のクラスターとVPC外のS3との通信をプライベートに設定した場合でも、  
   Spectrumが利用できるようになった
 - Parquet（パーケイ）とORC形式のデータをS3から直接読み込めるようになった  
   　※どちらもカラムナフォーマット（列指向フォーマット）のデータ形式。分析向き。
 - Spectrumでネスト構造のデータタイプに対応

## Redshiftの今後について
### これまでの課題
 - OLTP（オンライントランザクション処理）系と異なり、
    - 1クエリあたりのリソースが多い
    - 同時実行性が低い

⇒他サービスでカバーしていた......

### Concurrency Scaling
 - メインクラスターが負荷高のとき、バックグラウンドで追加クラスターが立ち上がる
    - エンドポイントは変わらず、あくまでバックグラウンドでの動き
    - 追加クラスターにはデータがなく、S3やコンピュートノードから  
      データを取得するため、高速、整合性担保
    - 利用時間24時間毎に1時間の無料クレジット提供

### その他
 - インテリジェント管理
 - ストアドプロシージャサポート
 - RedshiftからParquetにアンロード

## まとめ
 - Redshiftは高速、スケーラブルなデータレイク分析マネージドサービス
 - 定期的に機能拡張、新機能追加を行い進化し続けてるので、常にチェックが必要

この内容も2019年6月あたりには古くなる…………
S3にログ集約して、サービスの利用傾向の分析とかやってみたい。
Javaの基本データ型

Javaの基本データ型についてまとめてみた。

# データ型一覧
|種類  |型  |ビット数  |範囲  |説明 |
|---|---|---|---|---|
|整数型  |**byte**  |8ビット  |-128　～　127   | |
|  |**short**  |16ビット  |-32768　～　32767 | |
|  |**int**  |32ビット  |-2147483648　～　2147483647 |以下接頭辞を用いて10進数表記以外で表す事も可能<br>・2進数 ⇒ 0b　～<br>・8進数 ⇒ 0～ <br>・16進数 ⇒ 0x～  |
|  |**long**  |64ビット  |-9223372036854775808　～　9223372036854775807  |明示的に表記する場合は末尾に「L」を付与 |
|浮動小数点型  |**float**  |32ビット　  |±1.40239846×10^-45～±3.40282347×10^38  |明示的に表記する場合は末尾に「f」または「F」を付与 |
|  |**double**  |64ビット  |±4.94065645841246544×10^-324～±1.79769313486231570×10^308  | |
|論理型  |**boolean**  |-  |true か false  | |
|文字型  |**char**|-  |以下で表記可能<br>・Unicode文字 ¥u0000～¥uFFFF<br>・整数値 0~65535<br>・シングルクォーテーション('')で囲った1文字  |
容器抓包定位网络

容器里没有tcpdump工具， 如何对其抓包？

要对其抓包，要找到对应容器的veth接口。 

要找到这个接口，需要知道容器的mac地址

要知道容器的mac地址， 可以先找到容器的ip

容器的ip可以通过kubectl 获取。


顺着梳理一遍，步骤如下：
1. kubectl get pods -o wide （或者其它方式）可以获取到pod的ip和对应的宿主机信息
> kubectl get pods -o wide | grep  task 
> falcon-task-2690661743-71hcf            1/1       Running             0          29d       192.168.5.200   szb-l0038260

2. 进入到pod对应的宿主机里
> ssh szb-l0038260


3. 通过ip neigh 查找邻居表获取pod 对应的mac地址
> [root@SZB-L0038260 ~]# ip neigh show | grep 192.168.5.200
192.168.5.200 dev docker0 lladdr 02:42:c0:a8:05:c8 REACHABLE

这个mac和到容器里使用ip addr show eth0获取到的容器mac一致
> [root@falcon-task-2690661743-71hcf task]# ip addr show eth0     
29: eth0@if30: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP 
    link/ether 02:42:c0:a8:05:c8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.5.200/26 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:c0ff:fea8:5c8/64 scope link 
       valid_lft forever preferred_lft forever

4. 通过bridge fdb命令查看mac转发表，获取该mac对应的网络接口
> [root@SZB-L0038260 ~]# bridge fdb show  | grep 02:42:c0:a8:05:c8
02:42:c0:a8:05:c8 dev veth90f29ee master docker0

5. 获取到容器对应的veth后， 用tcpdump对该接口抓包
> [root@SZB-L0038260 ~]# tcpdump -i veth90f29ee -nn 
tcpdump: WARNING: veth90f29ee: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth90f29ee, link-type EN10MB (Ethernet), capture size 65535 bytes
14:20:27.171174 IP 192.168.5.200.59336 > 10.10.0.111.12057: Flags [S], seq 4206736718, win 28200, options [mss 1410,sackOK,TS val 2585505500 ecr 0,nop,wscale 7], length 0
14:20:29.163866 IP 192.168.5.200.50726 > 10.20.20.52.12079: Flags [P.], seq 432793338:432793546, ack 1771709290, win 1393, options [nop,nop,TS val 2585507492 ecr 4157544124], length 208
GoogleCTF #beginners/misc-ocr-is-cool

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ec08480e-e7d6-ecb8-1b1d-7dbb5b9e5191.png)

上の道から行ってみます。

#問題

https://capturetheflag.withgoogle.com/#beginners/misc-ocr-is-cool

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/600b307b-9208-a1eb-bafd-55a7ca45ea83.png)

#解いてみた

ファイルをダウンロードしてみると画像ファイルが1つ入ってました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/86e60b0d-cc7e-a675-c27e-cd8969efbc27.png)

ファイルを開いてみるとGmailのページでした。
が、内容が暗号化されているみたいで読めません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/f25d30ab-2002-679a-218a-c172d1d6a889.png)

直感的にROT13な雰囲気なので最初の1行目をROT13やってみます。
CyberChef使います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/a7c8a958-2cb4-b8c6-7e79-94b8f635b457.png)

複合できてないですね。
なので、ROT13ではないことが分かりました。

英語のメールの最初って大体HelloかDearから始まるみたいです。
文字数的に今回はDearでしょうか。

W　→　D
x　→　e
t　→　a
k　→　r

だと仮定すると、それぞれ7文字ずらしたら丁度です。
ROT7という言葉があるのかわかりませんが、ROT7っぽいです。
画像なのでコピペできないのが、つらいところですが、手打ちするしかないですかね。
と思ったらタイトル的にOCR使ってやった方がいい気がするので、やってみます。
前の問題のflagを考えるとCTF{XXX}なので{}を探してそこをROT7すれば済みそうな気もしますが。。。

オンライン上でOCRできるサイトがありました。
[OCR ー オンラインでPDFや画像をWord/Excelに無料変換 - LightPDF](https://lightpdf.com/jp/ocr)

ここにファイルを放り込んだところ文字にすることができました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/57ed79a5-0624-df2a-edf6-8ff7f8a70947.png)

これをCyberChefを使ってROT7します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/c0f18e6c-75d6-e4c0-e69d-214cf70ec243.png)

できました。

と思ったらエラーになりました。
入力画面が一瞬赤色になるだけなので、キャプチャとれませんでした。
OCRが失敗している可能性があるので、目視確認します。

lとiを読み間違っている場所が1か所あることが分かりました。
そこを修正して再度ROT7します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/599ab835-a74a-6155-6b5b-85af3e6d894d.png)

これでできました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/b0622b9a-e877-efc4-f3c1-bed17b44c003.png)
A5MK2でプロシージャを作成する時の注意点（#42000が出てしまう...）

mySQLでの実行環境において

下記の状態で実行しないとプロシージャをCreateできない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265300/852b80b5-cbaf-226d-5621-03de7842a8be.png)
・「キャレット位置を実行」
・「スラッシュのみの行でSQLを区切る」

下記のエラーが発生してしまう。
SQL   : #42000You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4
となる

また、コメントは「--」ではなく「/* */」で囲う事
emacsの中からrust-gdbを起動する

emacsの中からgdbを起動するとブレークさせた時に、現在の位置をソースコード上で確認できるので便利。rust-gdbでも同様のことができる。

# emacsの中からrust-gdbを起動する

```
M-x gdb
```

を実行すると、以下のように表示される。

```
Run gdb (like this): gdb -i=mi
```

rust-gdbを使用する場合は、これを以下のように書き換える。
`-i=mi` のオプションはemacsとgdbの間の通信に関するものなので必ずつける。

```
Run gdb (like this): rust-gdb -i=mi 
```

実行ファイルが`target/debug/execfile`
実行時の引数が `--debug --output=out1`
ブレークさせたいところが `scuInit` の場合の例

＊gud＊のバッファで

```
(gdb) file target/debug/execfile
(gdb) set args --debug --output=out1
(gdb) b scuInit
(gdb) r
```

これで scuInitでブレークする。
何度も同じ設定を使用する場合は .gdbinit に書けばよいはず。

RustのプログラムにリンクしているC++のライブラリの関数にも区別なくブレークポイントを設定できる。


# ソースコードバッファからブレークポイントを設定する

ソースコードを表示しているところで現在カーソルのある行にブレークポイントを設定するには

```
M-x gud-break
```

または

```
C-x C-a C-b
```
Lenovo LegionY720T-34ASU のSVMをenableにする

#なんで書いた？
VirtualBoxで環境構築しようとしたら、「仮想化できません」みたいなエラーが発生して、苦戦しながら解決方法見つけたので自分メモを兼ねて作成
(以前にもAndroid環境作ろうとしたら、「仮想環境起動できません」とか言われて、泣く泣く実機繋いでデバッグしてた。。。)

ちょっと調べると「Ryzen7-1800Xの搭載されているPCはSVM Modeをenableにすれば使えるよ！」的なことが書いてあるのですが、BIOSからCPU Configurationを探してもSVMという文字が見当たらず。途方にくれてました。

LenovoさんのBIOSアップデートが追いついていないのか、サポートするつもりがないのか分かりませんが、とにかくSVMがenabelにできないとVirtualBoxが使えないので、どうにかしようとググっているとUSBにEFIshellを入れてUSBブートしBIOS設定を書換える方法が見つかったので、ここにまとめておきます。

 **マネするときは自己責任で!!**

#この文書を書くときに想定した読者

- 自分でBIOSいじったことがある人
- VitualBoxで何度か環境作ったことがある人
- rarファイルの解凍ができる人

#環境
- Windows10
- Lenovo LegionY720T-34ASU

#やり方
## 1.EFIShellが入ったUSBメモリーを作る
1. FATでUSBをフォーマットする
2. [ココ](http://www.mediafire.com/file/81vegw2aw0pxcib/EFI+Shell.rar)からrarをダウンロードして、解凍する
3. 解凍したファイルをUSBメモリーの直下に入れる

## 2.SecureBootをdisableにする＋ブート順序をUSB優先に変更
1. 「windowsマーク」->「設定」->「回復」から「PCの起動をカスタマイズする」の「今すぐ再起動」でオプションの選択画面へ行く
2. 「トラブルシューティング」->「詳細オプション」->「UFEIファームウェアの設定」でBIOS画面に行く
3. SecureBootをDisableに設定する＆ブート順序をUSBに優先にする
4. 設定を保存して再起動する

## 3. EFIShellでのフラグ値変更
再起動すると黄色い文字で

```
grub>
```
と書かれたシェルのような何かが起動する

シェル(のような何か)に

```
$> setup_var 0x145 0x01
```
とタイプしてエンターを押すと、SVM modeのフラグがenableになる

後はctl+alt+deleteでshellを終了する

再起動してwindows仮想化が有効化されているのが確認できる(タスクマネージャでかくにん)


#参考資料

[Bios unlock for Lenovo Legion Y720T-34ASU](https://www.bios-mods.com/forum/Thread-Request-Bios-unlock-for-Lenovo-Legion-Y720T-34ASU?fbclid=IwAR1i6GQC4KGm1MPdF_M2T74rbb4iEkILXOg3aPpKP4D5CsA7ktzq4xA5OCw)

[Access Advanced settings through EFI shell](https://www.bios-mods.com/forum/Thread-READ-FIRST-Access-Advanced-settings-through-EFI-shell)
macのTexpadでknitr+lualatex

macのTexpadというLaTeXエディタはかなり高機能で，knitrやsweaveのファイルなんかもタイプセットしてくれるのですが，日本語を含むファイルだと文字化けして（というかマルチバイト文字が全部\uでエンコードされて）しまうのでうまくタイプセットできなかったのですが，ようやくビルドボタン一発でknitr+luaLaTeXできる方法を見つけました。

LANG環境変数が日本語になっていないことが問題だったようで，ビルドスクリプトを以下のように設定すれば正常に動作するようになりました。なお，biberや参照を使用するファイル，tocがあるファイルの場合には，この後にbiber用のスクリプトを追加し，さらにタイプセット用の行（このファイルの最終行）を2回繰り返す必要があります。


```sh
#!/bin/bash
export LANG="ja_JP.UTF-8"
Rscript -e "library(knitr); knit('$TEXPAD_ROOTFILE_NO_EXT.Rnw')"
lualatex $TEXPAD_ROOTFILE_NO_EXT.tex
```
setTimeout()の0秒は4ミリ秒

`window.setTimeout()`がコールバックのネストにより連続的に呼ばれたとき、4ミリ秒の遅延が発生します。
たとえば以下のコードでは、`count`を1000にするのに4秒以上かかります。

```javascript
let start = new Date().getTime();
let count = 0;
let next = () => {
  count++;
  if (count === 1000) {
    console.log((new Date().getTime() - start) / 1000);
  } else {
    window.setTimeout(next, 0);
  }
};
let id = window.setTimeout(next, 0);
```

[MDNのページ](https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/setTimeout#Reasons_for_delays_longer_than_specified)で言及されていました。「4ミリ秒」というのはHTML5で標準化された仕様です。

解決策も書かれており、`window.postMessage()`を使えばいいようです。
以下のコードを実行すると、`count`を1000にするのに0.070秒で済みます。

```javascript
let start = new Date().getTime();
let count = 0;
let next = (e) => {
  if (e.source !== window) return;
  count++;
  if (count === 1000) {
    console.log((new Date().getTime() - start) / 1000);
  } else {
    window.postMessage("");
  }
};
window.addEventListener("message", next, false);
window.postMessage("");
```

何らかの重い処理をしている間もユーザーの入力を受け付けたい、けど重い処理もできるだけ早く終わらせたい場合に、`window.postMessage()`の使用を検討するといいかもしれません。

## 補足

`if (e.source !== window) return;`は、メッセージの送信者が何者かを判定しています。この行を外してしまうと、クロスサイトスクリプティング攻撃を受けてしまう可能性が出てくるとのこと。[MDNのページ](https://developer.mozilla.org/ja/docs/Web/API/Window/postMessage#Notes)に明記されています。
UiPathでセレクターに変数を代入する方法

UiPathを使ってセレクターに変数を代入したい時があると思います。例えばUIExploerを使ってテーブルやリストなどのセレクターを見ていると数字が含まれていることがよくあります。
そんな時にセレクターを変数を代入することでForEachなどと組み合わせることにより、自動化できる幅がより広がります。

##チェックボックスのクリックを例に変数化する
例えば下記のようなチェックボックスを全てチェクしたいとします。

<img width="737" alt="スクリーンショット 2019-01-22 22.57.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/347151/42fc4132-d8a4-fdbc-d669-705329e2854f.png">

チェックするためにはそれぞれ一つずつクリックアクティビティでセレクターを指定して上げなければいけません。

一番上のチェックボックスのセレクター見てみると下記のようになっています。
<img width="525" alt="スクリーンショット 2019-01-22 22.59.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/347151/f0a76635-a383-2d11-f951-5b0c41e6a52d.png">

次に二つ目のチェックボックスのセレクター見てみると下記のようになっています。
<img width="545" alt="スクリーンショット 2019-01-22 22.58.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/347151/e6a8a44f-bc0e-f0a8-afce-6cc5088d3edf.png">

ご覧の通り一つめと二つ目のチェックボックスを区別する方法はidxの数字しかあません。
チェクボックスの数だけクリックアクティビティを用意するのは面倒なため、idxの中身を変数化し、繰り返しで記述を短縮します。

##記述方法
まず下記のように変数の定義を行って下さい。ここでは初期値に１を代入します。

<img width="547" alt="スクリーンショット 2019-01-23 20.31.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/347151/a7a4e597-5d49-e5f9-912a-e8bcb0f2db63.png">


次にクリックアクティビティのセレクターに変数を代入します。

変数を代入する時は変数化する部分を””で囲み、変数の両側に＋を加えて下さい。また、変数の型がInt32型の場合はToStringメソッドで文字列に変換して下さい。

代入前

```
<webctrl idx='1' tag='INPUT' type='checkbox'/>
```
代入後

```
<webctrl idx='" + Counter.ToString + "' tag='INPUT' type='checkbox'/>
```

##繰り返す
最後に繰り返しアクティビティを使うことで任意の数だけチェックができることができるようにします。
画像では上から５個のチェックボックスをクリックしますが、例えば５の部分をテキストを取得アクティビティから取得することができれば、全てのチェックボックスに繰り返しチェックを入れることができます。

<img width="416" alt="スクリーンショット 2019-01-23 21.00.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/347151/6cf8a965-b569-822d-11b2-ba9733226c2c.png">


セレクターの代入方法は以上になります。ここで取り上げたのはあくまで例になりますが、システムを使った作業の自動化を行う際にはセレクターに変数を代入すると自動化できる作業内容が増えると思いますので是非検討して見て下さい。