OmniAICreator/Qiita-1.07M huggingface dataset:
bit全探索を用いてARC29 A問題を解く

競技プログラミングの備忘録用
bit全探索を用いてARC29 A問題を解く
[A - 高橋君とお肉](https://atcoder.jp/contests/arc029/tasks/arc029_1)

###問題文
高橋君は友達とキャンプに行くことになった。高橋君と友達は性能が同じである $2$個の肉焼き器を持っており、それぞれの肉焼き器にお肉を乗せて並行して焼くことができる。一旦肉焼き器にお肉を乗せたら、お肉が焼きあがるまではその肉焼き器からお肉を取り出したり、その肉焼き器に別のお肉を乗せたりはできない。お肉が焼けたらお肉を取り出すことができる。$2$つの肉焼き器にまたがって$1$つのお肉を置くことはできない。また、お肉は全部で$N$個あり、お肉には$1$から$N$まで番号が付けられている。お肉$i$を焼くのには、どちらの肉焼き器でも時間$t_i$だけかかる。お肉を肉焼き器に置く動作、取り出す動作には時間がかからない。高橋君はお肉を焼く係であり、$N$個すべてのお肉を焼くことになった。みんなお腹が空いているので、すべてのお肉を焼くのにかかる時間を最小化させたい。すべてのお肉を焼くのにかかる時間の最小値を求めよ。

###入力
入力は以下の形式で標準入力から与えられる。

```
N
t1
t2
:
tN
```
- $1$行目には、お肉の個数を表す整数$N(1≦N≦4)$が与えられる。これは、お肉が$N$個あることを表す。

- $2$行目から$N$行にはお肉の情報が与えられる。$N$行のうち$i$行目には整数$t_i$が書かれており、これはお肉$i$を焼くのにかかる時間が$t_i(1≦ti≦50)$であることを表す。

###方針
各肉について肉焼き機1で焼く場合と肉焼き機2で焼く場合の2通りしか存在しないため$2^N$通りの場合が存在するため，bit全探索を使って最小時間を求める．

bit全探索の詳しい説明は[atcoder公式ページ](https://atcoder.jp/contests/apg4b/tasks/APG4b_ac)を見るのがよい．

###bit全探索ループの回し方

```c++
for(int i = 0; i < (1 << N); i++){
   /*何らかの処理*/
}
```
以上の宣言で$2^N$回の処理を繰り返すことができる．
基本的に```(1<<N)```で$2^N$と覚えるとよい．

###bit列の宣言

```c++
bitset<ビット数> (変数名)("ビット列")
```
以上のbitsetを用いて初期化することができる．

###任意の位置のビットが1か判定する

```c++
変数名.test(位置)
```
1の場合はTrueを返却する．

###解法コード

```c++
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PLL;
typedef vector<int> VI;
typedef vector<ll> VLL;
typedef vector<string> VS;
typedef vector<PLL> VP;
#define rep(i,n) for (ll i=0; i<(ll)(n); i++)
#define repd(i,n) for (ll i=n-1; i>=0; i--)
#define rept(i,m,n) for(ll i=m; i<n; i++)
#define all(x) (x).begin(), (x).end()
#define F first
#define S second
#define PF push_front
#define PB push_back
#define SORT(V) sort((V).begin(), (V).end())
#define RVERSE(V) reverse((V).begin(), (V).end())
#define paired make_pair
#define PRINT(V) for(auto v : (V)) cout << v << " "

int main()
{
    int N; cin >> N;
    VI t(N);
    rep(i,N){
        cin >> t.at(i);
    }
    int plate1=0,plate2=0;
    int ans=0,minimum=1000;
    for(int i = 0; i < (1 << N); i++){
        bitset<4> meat(i);
        rep(j,N){
            if(meat.test(j)){
                plate1+=t.at(j);
            }
            else{
                plate2+=t.at(j);
            }
        }
        if(plate1<=plate2){
            ans=plate2;
        }
        plate1=0;
        plate2=0;
        minimum=min(minimum,ans);
    }
    cout << minimum << endl;
}

```
#Python基礎(関数)

#1.関数
Pythonの関数について簡単にメモ

```
# 掛け算をする関数
def product(a, b):
    c = a * b
    return c

print(product(10,2))
```
>[出力]
20

+ 引数にデフォルト値を設定

```
# 掛け算をする関数
def product(a, b = 3):
    c = a * b
    return c

print(product(10))
```
>[出力]
30

+ 引数にタプルを渡す方法

```
# 掛け算をする関数
def product(a, b ,c):
    d = a * b * c
    return d

val = (10,2,3)
print(product(*val))
```
>[出力]
60
Laravel掲示板作成チュートリアルでハマったこと

laravel習得に記事の通り掲示板を作ることにした
[【入門】Laravelチュートリアル – 掲示板を作成してみよう](https://blog.hiroyuki90.com/articles/laravel-bbs/)

そして色々とハマったのでメモ
# laravel_bbsDBがないと怒られる
### 原因：DB作ってない

記事内では、下記の通り詳細が割愛されているが、読み飛ばしてはいけない。
`※ データベース（ここでは、「laravel_bbs」という名前）は事前に作成しておく必要があります。`


私の場合はphpmyAdminからlaravel_bbsというDBを作成することで解決。
作成した後に、シードデータ等がちゃんと入っているかも確認。入っていなければ再度その手順を行う

# ローカルホストに接続出来ない
### 原因：mySQLサーバを立ち上げてない

localでmySQLサーバを立ち上げないとローカルホストに接続出来ない。
私の場合は下記の呪文で接続した

```
$ docker-compose up -d mysql phpmyadmin
```
# str_limitでエラー
### 原因：laravelのバージョンによって書き方が違う

適当にググって下記の通り変更したら怒られなくなった。
（エラー文コピペしてgoogleに投げたら正しい回答が落ちていた）

修正前：

```
{!! nl2br(e(str_limit($post->body, 200))) !!}
```

修正後：

```
{!! nl2br(e(Str::limit($post->body, 200))) !!}
```


# なんかエラー
### 原因：タイプミス
記事にある記述をコピペじゃなくて自分で書いてみたりするととにかくタイプミスする
`required`を`requird`とか何回かやらかし

ローカルホストの左サイドにどのファイルで詰まっているか出るのでそこで該当ファイルを確認、
記事内の記述と自分のコードを差分サイトとかにペーストしてミスを見つける。


つまるけど丸々コピペするより自分で書いた方が楽しいので、ファイッ
SwiftUI 4泊5日の旅（5日目：画像タップでフルスクリーン表示）

# はじめに
SwiftUI旅企画、いよいよ最終日です。[4日目](https://qiita.com/knagauchi/items/b62d8fc272ca6ec65f92)に作りかけてたアプリが完成しました！

が、[Gitリポジトリを用意して](https://github.com/tonionagauzzi/SwiftUISample)さぁコミットだ！ってところで突然macがクラッシュして、そのタイミングが非常に悪かったのか、**今まで開発したソースが全消失**しました。

[初回](https://qiita.com/knagauchi/items/a6e5ff3d26e80ce88ac9)macをまっさらに初期化してから始めたので、gitのインストールを後回しにしてましたが、最初にやっておくべきでした。

一応、Qiitaで下書きしながらやってたので、以下の画像だけ残っていました。

# 開発中の様子
途中のXcodeスクショ
<img width="424" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/2657bcc4-7994-856b-e219-eb181aa131a3.png">
写真が一覧で出る様子
<img width="188" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/3bea08f2-81c2-7b39-468c-ce0a31c6064e.gif">
写真をタップすると全画面表示
<img width="188" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/022726ab-6131-ba0c-afe2-3f5f2692d859.gif">
ページ送りも可能
<img width="188" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/4a29cdaa-2945-e1ea-b20b-bbd04cc98ae5.gif">

技術的には、以下2つのライブラリを使いました。

* [ConcentricOnboarding](https://github.com/exyte/ConcentricOnboarding)
* [WaterfallGrid](https://github.com/paololeonardi/WaterfallGrid)

今回新たに挑戦したのは、画像をタップした時のフルスクリーン表示です。

# 画像をタップした際のフルスクリーン表示のやり方

コードが消えたので記憶頼りですが、

1. `FullScreen`というクラスを作り、その中に`@Published`をつけて`isEnable`みたいなBool変数を作る
1. `ContentView`と`FullScreenView`の中で、@EnvironmentObjectをつけて`FullScreen`のインスタンスを定義する
1. `SceneDelegate`から`ContentView`に対して`FullScreen`を初期化する
1. `ContentView`の中で、ZStackで`ConcentricOnboardingView`（ページ送りできるView）と`FullScreenView`（画像1枚表示するView）の2つを重ねる。その際`FullScreenView`は、`if fullScreen.isEnable { FullScreenView() }`みたいにして、`isEnable`がtrueの場合のみ表示させる
1. 画像のタップはImageの`onTapGesture {}`で検知し、`isEnable`のtrue/falseを`toggle()`で切り替える

ということをして実現しました。

> [NOTE]
> ZStackは子のビューを奥方向（Z座標方向）に重ねる
> `@Published`は値が変化した時にbodyを再描画させるためのプロパティラッパー
> `@EnvironmentObject`は複数のView間でインスタンスを共有するためのプロパティラッパー

文章で説明しても非常にわかりづらいと思うので、参考になりそうなGitHubのオープンソースを探してみたら、[こちら](https://github.com/nikishovde/HideTabBarInSubview/blob/71697cf4010a6c13e01ce47d97b441b40a6aeab0/HideTabBarInSbview/ContentView.swift)が似たことをしてました。

# 最後に

今回は5日間に渡ってSwiftUIの開発をするのが目的だったので、その点は達成できてよかったと思います。

ですが、残念だったのは2つです。
1つは、コードを貼り付けられないこと。
もう1つは、最終日の旅グルメはヨーロッパ旅行の本場パスタです！って完成したアプリをドンと出すという伏線回収計画が未遂に終わったことです。
その辺の勿体なさ、記事の薄さは感じるので、かわりに十数年前の思い出話をします。

当時、僕は中学生でしたが、RPGツクールでゲームを何個か作っていました。
そのうちの1つ、Princeという作品がありました。面白いもんじゃないのでリンクは貼りませんが。ニコ動に動画がある？たぶんそれです。黒歴史？僕の人生でそんなものは1つもありませんよ。

人間界とエルフ界を行き来するというなかなか壮大なシナリオで、プレステのメモリーカードを2枚以上消費する規模でした。
無事最終章まで作り終え、エンディングのスタッフロール制作中、突然データが壊れて開けなくなりました。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277107/23389785-16fd-5140-06cf-02418a24e2c6.jpeg">
実はこれ以外にも2回、制作中のゲームデータが消し飛んだことがありました。
毎回、数十時間〜数百時間を無駄にしたと、荒れ狂っていました。
ようやく1作品完成して、オンライン配信できたのは2年後のことでした。

で、言いたかったのは機械を使う作業は最後の最後まで何があるかわからないということです。
大長編が一瞬で消えた経験をしたことない人も多いかもしれませんが、悪魔は油断を嗅ぎつけて這い寄ってきます。
特に最終盤の気が緩んでる時は、理屈では説明できないことも起きます。今回もまさにそのパターンです。帰るまでが遠足だったということですね。

今回SwiftUIで作ったものはほんの数日間お遊び程度の規模なので、正直消えてもよかったし、4回目としてカウントするほどの話ではありませんが、忘れかけてた青春時代の教訓を思い出させてくれました。

開発に集中しすぎず、毎日コミットする習慣をつけようと身を引き締めました。
React.memoとuseCallbackを使って不要な再レンダリングを減らす

Reactアプリのパフォーマンスチューニングに使える機能として、React.memo、useMemo、useCallbackがある。

このうち、React.memoとuseCallbackを利用することで、コンポーネントの不要な再レンダリングを抑止することができる。

## 実例

以下のようなコンポーネントがあるとする。

```jsx
const Parent = () => {
  const [text, setText] = React.useState("");

  const handleClick = () => {
    console.log("click");
  };

  return (
    <div>
      <input
        type="text"
        value={text}
        onChange={e => setText(e.target.value)
        }
      />
      <Children handleClick={handleClick} />
    </div>
  );
}

const Children = props => {
  console.log("render");

  return <button onClick={props.handleClick}>Click</button>;
}
```

このとき、inputになにかしらが入力された場合、Childrenも合わせて再レンダリングされてしまう。setTextによってtextが変更されても、Childrenコンポーネントは何も変化していないので、再レンダリングの必要性はないはず。そこで、この不要な再レンダリングが発生しないように対応していく。

### React.memoでChildrenコンポーネントをwrapする

React.memoでコンポーネントをラップすることで、propsが変化しない限り以前の評価結果が返却されるようになり、不要な再レンダリングを抑止できる。

```jsx
const Children = props => {
  console.log("render");

  return <button onClick={props.handleClick}>Click</button>;
}

const MemorizedChildren = React.memo(Children)
```

デフォルトだとReact.memoは更新前のpropsと更新後のpropsをsharow equalで評価し、結果がfalseだった場合に再レンダリングを行う。判定を変更したい場合は、評価関数をオーバーライドすることで対応する。

```jsx
const Children = props => {
  console.log("render");

  return <button onClick={props.handleClick}>Click</button>;
}

const areEqual = (prevProps, nextProps) => {
  // 任意の処理
}

// React.memoの第2引数にセット
const MemorizedChildren = React.memo(Children, areEqual)
```

参考： [React.memo](https://ja.reactjs.org/docs/react-api.html#reactmemo)

### コンポーネントにアロー関数をpropsとして渡す場合はuseCallbackを使う

React.memoだけでは目的を達成できないパターンがある。それは、コンポーネントのpropsにアロー関数を渡している場合。アロー関数はレンダリング時に再生成されるため、レンダリング前の関数とは別物として評価される。すると、渡された側のコンポーネントは異なるpropsが渡されたと認識し、再レンダリングが走ってしまう。

```jsx
const Parent = () => {
  const [text, setText] = React.useState("");

  // 中の処理は同じでも、レンダリングのたびに別のオブジェクトとして評価される
  const handleClick = () => {
    console.log("click");
  };

  return (
    <div>
      <input
        type="text"
        value={text}
        onChange={e => setText(e.target.value)
        }
      />
      <Children handleClick={handleClick} />
    </div>
  );
}
```

これを防ぐためにuseCallbackを使う。

```jsx
const Parent = () => {
  const [text, setText] = React.useState("");

  const handleClick = React.useCallback(() => {
    console.log("click");
  }, []);

  return (
    <div>
      <input
        type="text"
        value={text}
        onChange={e => setText(e.target.value)
        }
      />
      <Children handleClick={handleClick} />
    </div>
  );
}
```

こうすることで```handleClick```は初回レンダリング時に生成されたものが使いまわされることになり、Childrenコンポーネントの再レンダリングを防ぐことができる。

参考：[useCallback](https://ja.reactjs.org/docs/hooks-reference.html#usecallback)

## まとめ

React全然わからんのでもっと勉強する。
VisualStudio2019 (Community)でWebアプリを作る

.netCoreって人気なんですか？これからくるんですか？
SESなので案件探してると確かによく聞く。
ちょっとだけ案件でやったけど、途中から入ったから物は出来てたので、
今回は自分でイチからやってみようかと。
が、すぐには出来ないのでちまちまやります。

<h4>１．プロジェクト準備</h4>
１．VisualStudio2019を起動。※私はCommunity版です。

２．「新しいプロジェクトの作成」をクリック。![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/a210afaf-1ec6-de98-5578-fbd7ca61cf60.png)

３．「ASP.NET Core Web アプリケーション」を選択して、「次へ」ボタンを押す。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/cadecc74-7f33-8ea6-6e9a-f0c1af0f4582.png)


４．プロジェクト名を指定して、「作成」ボタンを押す。　　
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/b61edf0d-3d5d-c0ab-8216-bb241a02577a.png)
　場所の緑で塗りつぶしてる箇所は、個人ごとに異なる。まあ、デフォルトのままでいいんじゃないでしょうか。
　変えたかったら、パスも変えられます。「…」ボタンとかで。

５．「Web アプリケーション」を選択して「作成」ボタンを押す。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/e6cb6bfa-6ea0-0e58-66fb-4d6ff36c6831.png)

６．作成中・・・
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/36018210-acd3-82c8-bb3f-ac1f648a0fdb.png)

７．出来上がり。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/46f54007-46f0-6a4d-e591-a57e80f68eb0.png)
[Homebrew] brew install SSL peer handshake error なので local ファイルから直接 インストール





# 起こったこと

GLib 2.64.x に依存する Libraryを `brew install` しようとすると
`curl: (35) SSL peer handshake failed`
通信エラー。

(今回は　upgrade でエラー)

``` :bash
$ brew upgrade glib
...
==> Upgrading glib 2.62.4 -> 2.64.2_1
==> Downloading https://download.gnome.org/sources/glib/2.64/glib-2.64.2.tar.xz

curl: (35) SSL peer handshake failed, the server most likely requires a client certificate to connect
Error: An exception occurred within a child process:
  DownloadError: Failed to download resource "glib"
Download failed: https://download.gnome.org/sources/glib/2.64/glib-2.64.2.tar.xz
```

# 解決策

とりあえず、直接tar ファイルを Download して
brew cache ディレクトリに直接ファイルを置く

``` :bash
$ wget https://download.gnome.org/sources/glib/2.64/glib-2.64.2.tar.xz
$ mv glib-2.64.2.tar.xz $(brew --cache glib)
$ ls $(brew --cache glib)
728316bb8c6fad08bf1d8fbe54c941d4287e4fcddc666f9e93e68ac94df6873c--glib-2.64.2.tar.xz
```
(hash 付きのfilenameに注意)

すると、cache ファイルを利用してインストールが進む。

``` :bash
$ brew upgrade glib
==> Upgrading 1 outdated package:
glib 2.62.4 -> 2.64.2_1
==> Upgrading glib 2.62.4 -> 2.64.2_1
==> Downloading https://download.gnome.org/sources/glib/2.64/glib-2.64.2.tar.xz
Already downloaded: /Users/user/Library/Caches/Homebrew/downloads/728316bb8c6fad08bf1d8fbe54c941d4287e4fcddc666f9e93e68ac94df6873c--glib-2.64.2.tar.xz
...
```


# 参考

https://stackoverflow.com/questions/59017569/how-to-force-homebrew-to-install-a-local-file

https://apple.stackexchange.com/questions/84403/how-to-use-homebrew-to-install-local-archive
gnuplotで値をカラーマップする際に透明色を使う

環境: gnuplot 5.2

#(1) データの値をカラーマップする(不透明色)
```
#test.txt
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
...
```
の3列目の値をgnuplotでカラーマップしたい時には、

```
set palette define(0 "0xffffff", 1 "0xff0000");
plot "test.txt" u 1:2:3 pt 7 ps 5 lc palette
```
とすれば、以下の図のように3列目の値を0xffffff(白)から0xff0000(赤)で表現できる。
![test_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618779/73d7b0dd-c9e6-4c77-ac16-1509aa606ebe.png)

#(2) マッピングカラーに透明色を使う
次に(1)で0xffffff(白)にしていた箇所を透明色にする。
通常lcで透明色を使用する場合には、RGB(0xRRGGBB)ではなくARGB(0xAARRGGBB)を使用して、アルファ値(AA)を指定すればOK。
一方、カラーマッピングで透明色を使おうと思うと、gnuplot 5.2の時点ではpalette内でARGBを使用できず、(1)の方法は使えなさそうなので、関数を定義した。

1) まず3列目の最大値を拾う。([gnuplotで最大値、最小値を求める@krtf][1])

```
#3列目の最大値を拾う
x0 = 1e38
x1 = -1e38

grabx(x) = (x<x0) ? x0=x : (x>x1) ? x1=x : 0
set table "/dev/null"
plot "test.txt" using (grabx($3))
unset table
```

2) アルファ値付きのカラー関数を定義する。([Gnuplot: transparency of data points when using palette: 1Answer][2])

```
# rgb
r(x) = 1
g(x) = 0
b(x) = 0

# lcの設定 
Transp(x) = int((1-x*x)*0xff)<<24  # 透過度 (0x00 ~ 0xff)
Color(x) = Transp(x) + (int(r(x)*0xff)<<16) + (int(g(x)*0xff)<<8) + int(b(x)*0xff)
```

3) plotする。

```
plot 'test.txt' u 1:2:(Color($3/(x1))) pt 7 ps 5 lc rgb var
```

このような感じで透明色を使える。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618779/104f50b3-6688-27e3-0462-4236b26b67e1.png)

$r(x), g(x), b(x)$や$Transp(x)$の関数系をいじれば、色変化を調整できる。
exportする場合には、pdfcairoじゃないと透過が無効になるのでご注意。

もっと単純な方法などあれば教えてください。

[1]:https://qiita.com/krtx/items/297c8e44241f7cfbdcb1
[2]:https://stackoverflow.com/questions/60250928/gnuplot-transparency-of-data-points-when-using-palette
AtCoderにPythonでログイン、自動提出する方法

#はじめに
みなさんは何を使ってAtCoderに提出していますか？AtCoderのサイト上で、という人が大多数だと思いますがatcoder-cliやonline-judge-toolsを使ってる人もいらっしゃると思います。わたしは[ここのサイト(とその関連記事)][1]を参考に自分で自動提出できるようにしたいなぁ～と思っていましたが、うまくいかなかったので、この記事を書きました。
###できなかったこと
まず、[先ほどのサイト][1]の通り、実装してみても、うまく提出できません。なぜでしょうか。ぼくはこれの原因究明に3日ぐらいかけました。アホですね！！しかし、この記事をご覧になさっている方なら私の二の舞を演じることはないと思います！！

※この記事を読む前に先に[はじめに紹介したサイト][1]を御一読なさることをお勧めします。この記事はそのサイトの内容を理解したことを前提にして話を進めさせていただきます。また私の実行環境はWindows10,Python3.8.1,Requests,BeautifulSoup4インストール済みです。Pythonをインストール済みの方でRequests,BeautifulSoup4をインストール済みでない方はインストールをお勧めいたします。
#原因究明
まずは私は、ログインできていないことを疑いました。そこでWebブラウザでログインできない環境を再現しようとしました。

たとえば、[AtCoderログイン][2]でわざとアカウント名やパスワードを間違えてみてください。そうすると、結局はログインできませんでしたという通知が出て同じサイトに居続けますね？なので、まずはリダイレクト先を疑いました。

また、いろいろといじっていたら面白いことに気づいてしまったので私の[もう一つの記事][3]を紹介しておきます。

[先ほどのサイト][0]のpost処理の後に

```python
print(result.url)
```
こう書いて.urlを用いてリダイレクト先を探してみてください。そうすると私は

```
https://atcoder.jp:443/home
```
こう表示されました。なのでログインするurlをこれに変えたらログインもできたし、正常に提出もできました。皆さんも試してください。心配性の方はlogin_urlを変えずにと[私の記事][3]のログインできているか確かめている方法を利用してtry~except文で書いたらいいと思います。

#おわり
読んでいただきありがとうございました。かなりわかりにくい記事になってしまいましたが参考になれば幸いです。なにかご指摘ありましたら、コメントしていただければ嬉しいです。ありがとうございました。

[0]:https://www.smartbowwow.com/2018/09/atcoder_30.html
[1]:https://t.co/WJLCQv4zzt?amp=1
[2]:https://atcoder.jp/login
[3]:https://qiita.com/Akimasa_L/items/f96dca5e1f178877ed49
[Vue.js] Moment.js で 24 時間を超える値を「時間:分」形式で表示する

# はじめに

どうも[はるうさぎ](https://twitter.com/_harusa_p)です。最近は Vue.js とか Nuxt.js とか書いてます。
ところで、みなさん時間のフォーマットはどうされていますかね？ [Moment.js](https://momentjs.com/) などのライブラリを使われる方が多いと思います。

仕事のタスクで `5:0` → `05:00` に修正して欲しいというものがありました。
これの背景として、独自で時間と分を分割した上で、使用されていたので修正が難しいというものがありました。
まあ普通は簡単じゃん〜〜って思うじゃないですか。しかし、 Moment.js 単体だと `時:分` のように、最大単位を `時` に制限することができないんですよ。

そこで、 Moment.js の拡張プラグインの [moment-duration-format](https://github.com/jsmreese/moment-duration-format) を使います。インストール方法などの詳細は参考文献を見てください。

今回はそれをインストールした上で、 Vue.js のフィルターとして使用できるように、 Nuxt.js のプラグインを作成しました。


## どうやった

```js:plugins/format.js
Vue.filter('durationFormat', (value, format = 'hh:mm',unit = 'minutes') => {
  if (value) {
    return moment.duration(value, unit).format(format, { trim: false })
  }
})
```


```vue:pages/xxx.vue
<template>
  <div>{{ 120 | durationFormat }}</div><!-- 02:00 -->
  <div>{{ 1500 | durationFormat }}</div><!-- 25:00 -->
  <div>{{ 1500 | durationFormat('約hh時間') }}</div><!-- 約25時間 -->
  <div>{{ 1500 | durationFormat('hh:mm:ss', 'seconds') }}</div><!-- 00:25:00 -->
</template>
```

## 感想

いやあ、 `時:分` のフォーマットに3時間は悩みました。調べると独自でロジックを組んだりしていて結構難しそうだったので、これを　Nuxt.js で使えるようにして正解でした。
結構困っている方いらっしゃると思うので、是非参考にしてみてください。

### 参考文献

[moment-duration-formatである時刻からある時刻までの経過時間を整形](https://qiita.com/keshihoriuchi/items/1c797b9d44cfae5c0461)

### 監修

[mpyw](https://github.com/mpyw)様
私的Rust学習メモ3(Trait Generics Closure)

# Trait
* Structが実装するべきmethodを定義できるもの。
* Object指向におけるInterfaceに近い。
* Traitにはメソッドの型定義とデフォルト実装を書く
* デフォルト実装の中でデフォルト実装のないメソッドを呼ぶことも可能。
* このおかげで例えばIteratorTraitについてはnextだけ実装すればかなりの機能が使えるようになる。
* 各メソッドごとに型情報をジェネリクスで足すことによって、使用可能なメソッドを絞り込むことができる。
(IteratorTraitを実装しており、かつIteratorのItemの型がSumを実装しているとsumが使えるようになるなど)
* 実装するときは、`` impl Trait名 for Struct名{} ``
* 言語に組み込まれている ``+``や``<``といった演算子も、特定のTraitを実装すると自分で定義したStructで使用可能になる。
* Traitの実装を定義できるのは、StructまたはTraitと同じモジュールのみ。全然関係ないところで勝手に定義することはできない。
* Trait側で実装したものについては、TraitをuseしなければStructの挙動に影響を与えない。

# Generics
## 型Generics
* コードを書く側から見た挙動は大体多言語のGenericsと同じ
* ただし、コンパイルされる際には実際に利用される型それぞれについてコードが生成される。
(javaなどのコンパイル時のチェックにしか使わないものとは異なる)
* Genericsは　``T<ジェネリクス名> ``という形で定義していくが、Whereで後に切り出すこともできる
* 命名規則はよくあるパターンで、T,U...

## LifeTimeGenerics
* 関数の戻り値だったりStructのフィールドに借用してきたものがある場合、ライフタイムの判定基準が一意に決まらない場合がある。このような場合はLifeTimeアノテーションを使う
* LifeTimeアノテーションは``'a``というような形で宣言する。
* 複数のフィールドや引数につけた場合、一番短いものが採用される(いずれかのライフサイクルが切れたら使えなくなる)
* 命名規則は小文字aから。
* なお、``'static``はバイナリ上の値に対する参照のライフサイクル=>常に有効。固定文字列を返す場合などに使う。

# Closure
Rustにおける無名関数のようなもの。
通常の関数と異なり、宣言時のScopeから見える変数を自分の中に閉じ込めることができるのでClosure。
(Rustの関数は関数中で定義しても関数外の変数にアクセスすることは原則できない)

## 関数との違い
* シグネチャ 引数の書き方が ``|引数|``である
* 前述の通り、見えている変数をClosure内では利用可能
* 型推論がより働く。変数として宣言して利用する想定で、スコープ外に出す前提ではないため。
引数の型や戻り値の型、引数が所有権取得なのか、mutな借用なのかimmutableな借用なのかも推論してくれる。
Rubyで二分探索法を書いてMinitestでテストしてみた

#はじめに
今回はこちらの本でアルゴリズムの勉強をしているので学んだことをRubyで書いて見ました。
[アルゴリズムをはじめよう](https://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%82%92%E3%80%81%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86-%E4%BC%8A%E8%97%A4-%E9%9D%99%E9%A6%99-ebook/dp/B01CZDTINE/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1IFTF2EOG9SW2&dchild=1&keywords=%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86&qid=1588756149&sprefix=%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%2Caps%2C320&sr=8-1)
こちらの記事を参考にさせていただいてます。
[Rubyで二分探索法（バイナリサーチ）を書いてみた](https://qiita.com/ryosuketter/items/2798b09330e7102b6cfe)

#二分探索法
二分探索法は予め、昇順か降順に整列されているデータが対象で、探索する範囲を半分に絞りながら探索を進めます。
手順は
①配列の真ん中の要素を求める
②真ん中のデータと目的のデータを比較する（一致したら探索終了。一致しない場合③へ）
③比較したデータが目的のデータより大きいか小さいか確認して探索の範囲を半分に狭める。
以降①→③を繰り返す。

配列の真ん中の要素を求める為に「head」と「tail」という二つの変数を用意。
真ん中を求めるには配列の先頭と末尾を足して２でわる。割り切れない場合は小数点を切り捨てます。（整数型の場合自動的に切り捨てになります。）

はじめに書いたコードはこんな感じでした。

```ruby
def binary_search(array,target)
    #配列の真ん中を求める為下準備
    head =0
    tail =(array.count)-1

    loop do
        if head <= tail
          #①配列の真ん中の要素を求める
          center = (head+tail)/2
          #②真ん中のデータと目的のデータを比較する（一致したら探索終了。一致しない場合③へ）
          if array[center] == target
            return center
          #③比較したデータが目的のデータより大きいか小さいか確認する。
          else
            if array[center] < target
                head =center+1
            else
                tail =center-1
            end
          end
        else 
            #目的の値が見つからない場合−1を返す。
            return -1
        end
    end
end
```
テスト

```ruby
require 'minitest/autorun'
require './irb/binary.rb'

class BinaryTest < Minitest::Test
  def test_binary
    assert_equal  6,binary_search([11,13,17,19,23,29,31],31)
    assert_equal  -1,binary_search([11,13,17,19,23,29,31],35)
    assert_equal  0,binary_search([11,13,17,19,23,29,31],11)
    assert_equal  0,binary_search([11,13,17],11)
    assert_equal  -1,binary_search([11,13,17],15)
    assert_equal  3,binary_search([11,13,17,67],67)
  end  
end
```
テスト実行。

```
ruby test/binary_test.rb
Finished in 0.000620s, 1612.9031 runs/s, 9677.4184 assertions/s.

1 runs, 6 assertions, 0 failures, 0 errors, 0 skips
```

###リファクタリング
途中でloopメゾットを使っていますが、条件が真である間処理を繰り返すwhile文を使う等して見やすいコードにしました。

```ruby
def binary_search(array,target)
  head =0
  tail =(array.count)-1

    while head <= tail
      center = (head+tail)/2

      if array[center] == target
        return center

      elsif array[center] < target
        head =center+1
          
      else
        tail =center-1
      end   
    end
    return -1
end
```

※フォルダ構成はこのようにしてあります。

```
ruby
├── irb  
│   └── binary.rb
└── test
    └── binary_test.rb
```

最後までお読みいただきありがとうございました。アドバイス等あればコメントいただけると幸いです。
Electrum から koto-qt(bitcoin-qt)へ wallet を移行する  

## 背景

Koto の wallet を Electrum で使っているが, electrum ノードが立っていない or 見つからないのか, トランザクション数が多いのか, などの理由で, Electrum gui で History の描画がされなかったり, 描画が激重だったり(macOS でのみ確認していませんが), 1 日放置していても ずっと transaction の status が pending のままであるので, koto-qt(or koto-cli)で通常の(?) wallet に移行したい.

今回は koto-qt ですが, 同等の操作は bitcoin-qt を含む, bitcoin のコードを使っているもの(e.g. bitcoin, zcash)でも利用できると思われます. 

## Electrum からのエクスポート操作

Electrum の wallet と, koto-qt の wallet とはフォーマットが違うためそのまま移行するだけでは使えません. seed での復元も, Electrum 専用っぽい(?)

こちらで確認取れたのは, private key をエクスポートする方法でした.

ファイルに private キーが書かれますので, export されたファイルの扱いには注意しましょう.

## koto-cli で import する

あとはこの private key を import すれば OK です.

koto-qt(GUI wallet) では import の機能はありませんでしたので, `koto-cli` を使います.
(bitcoin-qt にはあるかも?)

注意点としては, `kotod` が動いていたら止めておくのがよいでしょう. 筆者は `kotod` が動いているときに import してハングしました(import 自体はうまくいった).

https://bitcoincore.org/en/doc/0.18.0/rpc/wallet/importprivkey/

にあるように,

```
$ koto-cli importprivkey XXXXXYYYYZZZZZ "label" false
```

とします. `rescan` true だと sync に時間かかるようですので, `false` にしておきます.

### 複数 import するには...?

Electrum が出力した private keys ファイルは複数(wallet アドレスごと)になっているかもしれません.
現状複数 address(key) を import する方法はありません.

数が多ければ, python なりのスクリプトを使って一括 import するのがよいでしょう.
rustで学んだことのメモ

## TL;DR

rustで学んだことのメモ

### String -> Vec<char>

String使ってるとindexで操作できないので、charのベクトルにする必要がある

```rust
let vec: Vec<char> = string.chars().collect();
```

### vec![1, 2, 3] -> "123"

```rust
let vec: Vec<usize> = vec![1, 2, 3]
let str_num: String = vec.iter().map(|x| std::char::from_digit(*x as u32, 10).unwrap()).collect();
```

### &x -> x

参照を外す

```rust
*x
```

### sumなどの処理をベクターに対して使う

vecのままじゃ使えないのでイテレーターに変更する

```rust
let sum = vec.iter().sum();
```

### 二項係数の計算

```rust
fn init_nCk(n: usize, size: usize, MOD: usize) -> Vec<usize> {
    let mut fact_inv: Vec<usize> = Vec::new();
    let mut inv: Vec<usize> = Vec::new();
    let mut com: Vec<usize> = Vec::new();
    fact_inv.resize(size, 0);
    inv.resize(size, 0);
    com.resize(size, 0);

    fact_inv[0] = 1;
    fact_inv[1] = 1;
    inv[1] = 1;
    com[0] = 1;

    for i in 2..size {
        inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
        fact_inv[i] = fact_inv[i - 1] * inv[i] % MOD;
    }

    for i in 1..size {
        com[i] = com[i - 1] * ((n - i + 1) * inv[i] % MOD) % MOD;
    }
    com
}

fn nCk(k: usize, com: Vec<usize> {
    com[k]
}
```

### Vec -> VecDeque
Vecだとfrontを取ってくる操作が遅いので、VecDequeを使う

```rust
use std::collections::VecDeque;

let vec_deque = VecDeque::from(vec)
```

`pop_front`と`pop_back`が使えるが、Optionで包まれて返ってくるので、unwrapが必要なことに注意。

### HashMap

#### defaultdict

entry -> or_insertを使う。

```rust
use std::collections::HashMap;

let mut map: HashMap<usize, usize> = HashMap::new();

map.entry(1).or_insert(0);
```

#### keyの順序付きHashMap

`std::collections::BTreeMap`を使う。
valueでソートのやり方が知りたい

### HashSet

#### 集合演算

```rust
use std::collections::HashSet;
// 差集合
let diff: HashSet<_> = set_a.difference(set_b).collect();
// 対称差集合
let diff: HashSet<_> = set_a.symmetric_difference(set_b).collect();
```

### format
[Rust勉強中 - その23 -> テキスト処理と正規表現](https://qiita.com/deta-mamoru/items/48ade3c3e75b945e4f21)

000 001 002 ... 999
みたいなのを作るときとかに使うやつ

```rust

(0..=999).map(|x| format!("{:03}", x))
```

### enumerate

みんな大好きenumerate

```rust

for (i, x) in vec.iter().enumerate(){
    todo!();
}
```

### 整数かどうかの判定

なんかlogとった値が整数になるかの判定みたいなことがしたかった
`num`クレートを使えばできる

```rust
extern crate num;

let logged = 4.0.log2();
let flag = num::rational::Ratio::from_float(logged).unwrap().is_integer();
```

みたいな感じ

### 全探索

#### DFS

再帰ができなくて泣いていた。
structを作ってメソッド実装するとよいらしい [[参考 static mutの危険性](https://qiita.com/qnighy/items/46dbf8d2aff7c2531f4e)]。
あとイテレーター回すところでcloneしてからにしないと所有権で死ぬ。

```rust
struct Graph {
    graph: HashMap<usize, Vec<usize>>,
    seen: Vec<bool>
}

impl Graph {
    fn dfs(&mut self, start: usize) {
        self.seen[start] = true;
        for next_start in self.graph.clone().get(&start).unwrap() {
            if !self.seen[*next_start] {
                self.dfs(*next_start)
            }
        }
    } 
}
```
ProcessingでVJ素材を作るブログ　第一回 Processingの概要を掴む

#本ブログの目標
皆々様はクラブなるものに行ったことはあるだろうか。
もちろん、キャバレークラブのことではない。
東京だとWOMB、VENT、VISIONなど、大阪だとCIRCUSとかだろうか。
そこに広がるは、響く低音と紛らわしい高音（音質が悪いところは本当に紛らわしい）、そして眩い幾何学模様の光なのだ。

行ったことない方のため、リンクを貼っとく。ぜひみてほしい。
スクリーンに映っているのがVJだ。
https://youtu.be/owdva7V2M0o

##Processingとは
やりたいイメージはついたが、映像を作る手段がない。
なんとなく調べたらAdobe After Effectや、CINEMA 4Dなどが出てくるがどれも高価だ。（一応AppleのMotion5は買った）
そこで目をつけたのが、ビジュアルプログラミング言語である。

OpenFrameworkとProcessingが有名らしいが、C言語がベースのOpenFrameworkより、JavaベースのProcessingの方が簡単とのことで、
Processingからやってみて、必要に応じてOpeFrameworkもやってみようかなぁと思う。

こんなのができるらしい
https://www.youtube.com/watch?v=zwWZox1PKw8

基本的にプログラミングは苦手意識があるので、ゆっくりやっていこうかなと思う。

とりあえず意思表示だけして今回は終わり！
PHPで初めてのWebアプリケーション開発　企画から設計まで　備忘録2　

#前提
PHPを使ったWebアプリケーションの開発知識が必要になったので、開発過程の備忘録、知識のインプット・アウトプットを目的としている。

#アプリケーションの概要
スケジュール・出欠管理アプリ

#備忘録2　目次
1. 主な機能の洗い出し
2. ワイヤーフレームの作成
3. サイトマップの作成

##1 主な機能の洗い出し
- ユーザ登録・ログイン
- プロフィール編集
- 掲示板
- スケジュール追加・編集
- スケジュールに対する出欠登録
- スケジュールに対する出席表
- ユーザ一覧表示

##2 ワイヤーフレームの作成
今回はppで大まかに作成
![スライド1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593561/1f7fc580-8357-7c11-4e9c-3c251ae0fba1.png)
![スライド2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593561/c8173ea6-2570-a3eb-1f44-97c656f97c90.png)
![スライド3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593561/62e66de5-7790-28b9-f51e-5ac94e36676f.png)
![スライド4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593561/5369f58c-1857-24b9-39e6-612b48da01d7.png)


##3 サイトマップの作成
![スライド5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593561/4e866472-35cf-e34b-9789-8b9aa24e3f6f.png)


#おわりに
今回はデータベースの設計まで行った。次回は、機能の実装方法・手順について検討していきたいと思う。
Apple WWDC2020 開催決定 新しいSwift Student Challengeとは

# 今年は新しいSwift Student Challengeが開催
いよいよ5月に入り、WWDC2020まで近づいてきました。
今年は新型コロナウイルス "COVID-19" の影響によりオンラインのWWDCとなることが発表されています。
今回はこのWWDC2020で開催されることとなった**Swift Student Challenge**に焦点を当てて取り上げたいと思います。

##そもそもWWDCとは
WWDCはAppleが毎年開催する世界開発者会議のことで、ここで新型iOSやmacOSをはじめ新しいソフトウェアやハードウェアが発表されます。
今年のWWDCについては先日6月22日に__オンラインで__開催することが決定されています。
>Apple、世界開発者会議を6月22日よりオンラインで開催
https://www.apple.com/jp/newsroom/2020/05/apple-to-host-virtual-worldwide-developers-conference-beginning-june-22/

##Swift Student Challengeって何??
これまでのWWDCでは取材を行う報道関係者枠と別にスカラーシップと呼ばれる特別枠が用意されていました。
このスカラーシップに選ばれた開発者は

・WWDCチケット
・会議の宿泊施設
・Apple Developer Program

を無料で得ることができます。
しかしながら、このWWDC2020ではオンラインの開催となるため実際に開催される会場に行くことはできません。
そのためAppleは学生の開発者の方々を対象とした

**Swift Student Challenge**

を開催することを決定しました。

優秀な作品の開発者の方々には他では入手できないWWDC20ジャケットとピンバッジのセットが贈呈されると発表しています。


##Swift Student Challengeの応募要項
すべての募集要項は
[Swift Student Challenge - Apple](https://developer.apple.com/wwdc20/swift-student-challenge/)
に記載されていますのでそちらをご確認ください。

重要なポイントをまとめると

・無料の Apple の開発者登録か 有料のApple Developer Programに登録していること
・学生であること
・Swift Playground で作成すること (JavaなどのSwift以外の言語は不可)
・英語で記述すること
・3分以内に体験できるものであること 

などです。

##締め切り
締め切りは 2020年5月17日日曜日午後11時59分（PDT）ですので
__日本時間 2020年05月18日月曜日 15:59__となります

##まとめ
今年のWWDCはオンラインという事で例年とは全く異なるものになることが予想されます
この厳しい状況の中ですがWWDC2020を世界中の開発者の方々と楽しみましょう。

##参考記事
[Swift Student Challenge - Apple](https://developer.apple.com/wwdc20/swift-student-challenge/)
[WWDC2020 - Apple](https://developer.apple.com/wwdc20/)
[Apple、世界開発者会議を6月22日よりオンラインで開催 - Apple](https://www.apple.com/newsroom/2020/05/apple-to-host-virtual-worldwide-developers-conference-beginning-june-22/)
[VRChat] VRChatでワールドを上げるまでの方法

# VRChatでワールドを上げる方法

## 前提条件
- Trust RankがUser以上であること
- PCを保有していること（Windows/Macどちらも可。ただしそれなりの性能がないとサクサク動かないので注意。）
- VRChatのアカウントを保有していること（Steam/Oculusアカウントを使ってプレイしている場合アップロードできないので、VRChat向けのアカウントを作り、Steam/Oculusのアカウントと紐づけてください）
  - Steamアカウントの場合
    https://atorinn.net/post-381/381/
  - Oculusアカウントの場合
    "良いサイト見つからず"

## 操作手順をYouTubeで撮ってみました
（動画編集苦手＆テロップ入れていませんが、お見苦しい点お許しください。）
https://youtu.be/Uuyp3YEFj6U

## 手順
### 1. Unityのインストール

[1] Unity Hubのインストール
https://unity3d.com/jp/get-unity/download

[2] Unitu HubからUnityのインストール
※現行のVRChatは「2018.4.20f1」で作成する必要があります（記事を書いた2020/5/6時点）
※Unity Hubを開いて、メニュー左の「インストール」タブを押して、右上の「インストール」ボタンを押す、
　しかし一覧に「2018.4.20f1」がないので「ダウンロードアーカイブ」を押すと、
　ブラウザからUnityのダウンロードページが表示されるので、
　Unity2018.xの下にある「Unity 2018.4.20」の横の「Unity Hub」ボタンを押して、インストールしてください。

### 2.VRChatのWebページから、アバター＆ワールドのアップロード用のSDKをダウンロード

[1] VRChatのページにログイン
    https://www.vrchat.com/home/login

[2] 画面左のサブメニューの「Download」をクリック

[3] VHCHAT SDK2をダウンロード
　　※後で使うので、デスクトップ等分かりやすい場所に置いておいてください。

### 3.ワールドをアップロードする
※ここでは試験的に「床だけがあるワールド」をアップロードする手順にしています。
[1] UnityHubを開く

[2] 新規作成ボタン横の「▼」を押し、
　　2018.4.20f1を選択、
　　プロジェクト名を入力し
　　「作成」を押す。

[3] メニューの「Assets」→「Import Package」→「Custom Package」で
　　2[2]でダウンロードしたVRCHAT SDKのファイルをインポートする。
　　※画面下のAssets部分にドラッグ＆ドロップしても良い。
　　※インポート完了までしばらく時間がかかります。完了すると「VRChat Unity SDK」の画面がポップアップしてきます。

[4] 画面左下の「Project」タブの「Assets」→「VRCSDK」→「Prefab2」の下の「VRCWorld」を
　　画面左上の「Hierarchy」タブのSampleSceneの下にドラッグ＆ドロップしてください

[5] *** この段階でワールドを作成する ***
　　※このままワールドをアップロードしてしまうと、床すらない何もないワールドになってしまうため、今回は「床」だけ入れましょう。
　　　画面左上の「Hierarchy」のVRCWorldの上で「右クリック」→「3D Object」→Planeを押してください。これで床ができます。

[6] Unityのメニューの「VRChat SDK」→「Show ControlPanel」を押す

[7] ここでVRCHAT SDKと書かれた画面がポップアップされるので、まずAccountの部分で、
　　自身のVRChatのアカウントでSing Inしてください。
　　※ログインに成功すると「Logged in as: ＜あなたのVRChat名＞」が表示されます。

[8] 同ポップアップ画面の「Builder」タブを選ぶと「Setup Layers for VRChat」ボタンがあるので押す
　　（さらに確認画面が出てくるので、Do itボタンを押す）

[9] さらに「Set Collision Matrix」ボタンが出てくるので押す
　　（こちらもさらに確認画面が出てくるので、Do itボタンを押す）

[10] 「Build & Publish」ボタンを押す

[11] Configura Worldと書かれた画面が出てくるので
　　 World Nameを入力し、The above information is accurate and I have the rights to upload this content to VRChat.
     に問題がなければチェックボックスをチェックし、Uploadを押す。
　　 ※一般向けに公開したい場合は「Publish limit for Community Labs Exceeded」もチェックする。
　　　 コミュニティラボという試験的ワールドとしてアップロードするという意味です。
　　　 コミュニティラボで一定の条件（条件不明）を満たすとPublish化（より多くの人がアクセスされる状態）されるそうです。
　　　 なお、ラボに上げられるのは1週間に1ワールドです。

[12] 最後に確認として、VRChatにログインし、WORLDSメニューの「MINE」の箇所に、
　　 今アップロードしたワールドがあるので、入ってテストしてみてください。
Splunkでindexに取り込まれている値で検索する

https://conf.splunk.com/files/2019/slides/FN1003.pdf
をみてびっくりしたので

超小ネタ

```java:index検索
index=_internal sourcetype::splunkd
```

単に**フィールド名**と**値**の間を`=`の変わりに`::`で接続するだけ

`TERM()`と違って、`_raw`から検索しない。

資料には、`walklex`を使った高速サーチとか載っているのでダッシュボードとか作った後のチューニングで活用してもらえればと思います。

https://conf.splunk.com/files/2017/slides/fields-indexed-tokens-and-you.pdf　←こっちは古いらしい
toio準備2


(0)
[yarn](https://qiita.com/suisui654/items/1b89446e03991c7c2c3d) : yarnをインストールする 

npm install -g lerna
yarn install.

（1）TOIO公式サンプルビルド
[toio公式のビルド](https://github.com/toio/toio.js/#computer-prerequisites)
git clone https://github.com/toio/toio.js.git   # clone repository
cd toio.js                                      # move to repository root
yarn install                                    # install dependencies
yarn build                                      # build @toio/* packages
yarn example:<name of example>                  # start sample application (see below)

2020.05.06最新だとビルド失敗します。追記：2020.06.23だとOK。
```
(nodejs) D:\GitUnity\toio\0000\0020\toio.js>yarn build
yarn run v1.22.4
$ lerna run build
lerna notice cli v3.14.1
lerna info versioning independent
lerna info Executing command in 2 packages: "yarn run build"
lerna ERR! yarn run build exited 2 in '@toio/cube'
lerna ERR! yarn run build stdout:
$ tsc --project .
src/characteristics/specs/motor-spec.ts(119,27): error TS1109: Expression expected.
src/characteristics/specs/motor-spec.ts(120,7): error TS1005: ':' expected.
src/characteristics/specs/motor-spec.ts(120,27): error TS1109: Expression expected.
src/characteristics/specs/motor-spec.ts(123,7): error TS1005: ':' expected.
src/characteristics/specs/motor-spec.ts(123,41): error TS1109: Expression expected.
src/characteristics/specs/motor-spec.ts(123,44): error TS1005: ':' expected.
src/characteristics/specs/motor-spec.ts(124,43): error TS1109: Expression expected.
src/characteristics/specs/motor-spec.ts(125,7): error TS1005: ':' expected.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

lerna ERR! yarn run build stderr:
error Command failed with exit code 2.

lerna ERR! yarn run build exited 2 in '@toio/cube'
error Command failed with exit code 2.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

<font color="Red">ac641a0dede20fe345e625b2a8a316da205b865c　だとエラーがでます。</font>　6fa941323475656fbdbf82ec49df47b492490aa2　はビルドできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/b0c897fb-ddce-5273-2fa6-d43fb2f991b3.png)

（２）Bluetooth接続したtoioをキーボードで動かす
うまくデバイスと接続できると、次のサンプルでTOIOが動く（と思う）
yarn example:keyboard-control
toio本体電源ONだとそっちとペアリングして接続出来ないと思います

バリューパックの「リズム＆ゴー」や「フィンガーストライク」を遊んで、何が出来るかを間隔的につかんだ方がよいと思います。バリューパックを買った方が良いです。

[参考]
[toioのjavascriptライブラリが公開されたのでexample動かしてみた
](https://qiita.com/KatsuShun89/items/5f86a9811565267f6b30)

この動画をみてみる。https://www.youtube.com/watch?v=mL9B8wuEdms&feature=youtu.be&t=1m46s
CakePHP ブログチュートリアル 論理削除を実装

#本章の内容
CakePHPブログチュートリアルの削除機能を論理削除にする。

#物理削除と論理削除

- 物理削除 : ハードディスクなどの記憶媒体から当該行のデータを削除すること
- 物理削除 : 当該行が削除されたことをデータとして表現することで削除されたものとみなすこと
（=データは記憶媒体に残ったまま）

テーブルに、論理削除フラグを示すカラムを追加して、論理削除を実装する。
(0なら未削除、1なら削除みたいに)

##論理削除の嬉しいこと

- ユーザーからその存在を隠蔽したいが、データとしては残しておきたい （例えば、業務事情により当該データを使用禁止にしたいが、一時的なのですぐに元に戻せるようにしたい場合）
- 誤って削除した場合に備え、すぐにデータを復元できるようにしておきたい

#調べたこと

##論理削除の実装

1.[SoftDeleteBehavior.php](https://github.com/CakeDC/utils/blob/master/Model/Behavior/SoftDeleteBehavior.php) <-これを、`app/Model/Behavior/`下に保存。

2.テーブルに、論理削除フラグ用のカラムを追加

削除フラグ
>カラム名 : deleted
型 : tinyint(3)
デフォルト値 : 0

削除日
>カラム名 : deleted_date
型 : datetime


3.論理削除を行うモデルに以下を追加

```php
public $actsAs = ['SoftDelete'];
```

4.`AppModel.php`に以下を追加。delete関数をsoftdeleteに再定義？

```php
public function exists($id = null) {
    if ($this->Behaviors->loaded('SoftDelete')) {
    return $this->existsAndNotDeleted($id);
    } else {
	return parent::exists($id);
    }
}
	
public function delete($id = null, $cascade = true) {
    $result = parent::delete($id, $cascade);
    if ($result === false && $this->Behaviors->enabled('SoftDelete')) {
        return (bool)$this->field('deleted', array('deleted' => 1));
    }
    return $result;
}
```
Outlook2019で添付ファイル付きメールを迷惑メールにする方法

### Outlook2019で添付ファイル付きメールを迷惑メールにする方法

Teams等が普及した今日においても、ファイルのやり取りをメールで行っている人は、まだまだ相当数おられると思う。悪意のあるメール添付ファイルに起因するセキュリティ上の問題は過去に何度も発生している。
この問題の有効な対策方法として、メーラの機能を使って、<b><font color="MediumVioletRed">添付ファイル付きのメールを迷惑メールとして振り分ける</font></b>方法を、久しぶりのQiitaでは解説してみたい。
　迷惑メールとして振り分けられたメールは添付ファイルやメール本文中のURLが無効になる。差出人やメール内容に問題がないことが確認できてから、通常の受信トレイにメールを戻せば、通常のメールとして扱うことが可能となる。
 なお、ここで解説するメーラはOutlook2019としている。
<br>
- 手順1
 Outlook2019を起動後、メーラで何らかのメッセージを選択後、「ホームタブ → ルール → 仕分けルールの作成」の順にクリックする。（下の画像参考）<br>![outlook01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410962/8a5bfdba-52dc-36ce-0153-124d6cf09928.png)

<br>
- 手順2
 表示されたダイアログで「詳細オプション」をクリックする。（下の画像参考）<br>![outlook02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410962/a680a52f-bd53-b6e2-ec04-9a1082e075c1.png)

<br>
- 手順3<br>
 表示されたダイアログのチェックボックスリストのエリアにマウスポインタを合わせ、マウスのスクロールボタンで下方向にスクロールする。本来、このエリアには縦スクロールバーが表示されるべきだが、なぜか表示されない。（下の画像参考）<br>![outlook03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410962/292d9ef6-4ba1-2ce3-f8c1-8f04a3058c15.png)

<br>
- 手順4
 スクロールすると、選択肢に「添付ファイルがある場合」が表示される。（下の画像参考）<br>![outlook04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410962/298b4ec7-8317-27ca-eaa7-242e9f96eb85.png)

<br>
- 手順5
 選択肢の「添付ファイルがある場合」にチェックを入れ、「次へ」をクリックする。（下の画像参考）<br>![outlook05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410962/68019704-baf6-1c9a-fd87-62ee87e4f02b.png)

<br>
- 手順6
 ダイアログの表示が切り替わることを確認する。（下の画像参考）<br>![outlook06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410962/c605c5d8-193f-73c1-f441-f8115b85f170.png)

<br>
- 手順7
 ステップ1の選択肢の「指定フォルダーへ移動する」にチェックを入れると、ステップ2の表示が変わるので、そこで「指定」をクリックする。（下の画像参考）<br>![outlook07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410962/ab7ed60b-2c8c-ef28-a6ae-950ca1ae69c3.png)

<br>
- 手順8
 フォルダー選択ダイアログが表示されるので「迷惑メール」を選択後、「OK」をクリックする。（下の画像参考）<br>![outlook08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410962/2c880b43-fcd5-2af7-4ebe-b009aa1fb99c.png)

<br>
- 手順9
 元のダイアログのステップ2に「迷惑メールフォルダーへ移動する」と表示されていることを確認後、「次へ」をクリックする。（下の画像参考）<br>![outlook09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410962/7470607a-57f8-2cf7-e478-67a835079d82.png)

<br>
- 手順10
 ダイアログの表示が変わったことを確認するが、ここでは何も指定せず、「次へ」をクリックする。詳細な説明は割愛するが<b><font color="MediumVioletRed">添付ファイル付きのメールであっても、この送信者は信頼できるので迷惑メールとしては振り分けない</font></b>等の設定も行える。（下の画像参考）<br>![outlook10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410962/55783472-f490-3e87-b549-ead3eab2be6f.png)

<br>
- 手順11
 仕分けルールの名前を指定後、「完了」をクリックする。ここまでの手順で設定は完了する。（下の画像参考）<br>![outlook11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410962/cdcfa96a-947c-38ea-8690-ef7b02361ef9.png)

<br>
- 手順12
 条件（特に手順10で少し記した例外ルール等）を変更したい場合はメーラで何らかのメッセージを選択後「ホームタブ → ルール → 仕分けルールの作成」の順にクリックする。（下の画像参考）<br>![outlook12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410962/43e4a513-25cf-c361-4b0a-7fc16fd2955f.png)

<br>
以上
ansible-vault使用時、vagrant upでもvault passwordを聞かれるようにする

 vagrantでansible-vaultを使用し、ansible.cfgに
 ask_vault_pass = Trueを設定していたが、vagrantのprovisioning時には
パスワードを聞かれず、エラーとなってしまった。

```ansible.cfg
[defaults]
inventory = hosts
retry_files_enabled = False
ask_vault_pass = True

[privilege_escalation]
become = True

[ssh_connection]
control_path = %(directory)s/%%h-%%r
ssh_args = -o ControlPersist=15m -F ssh_config -q
scp_if_ssh = True
```

以下のようにVagrantfile側にもansible.ask_vault_pass = trueにすると
vault用パスワードを聞いてくれるようになります。

```Vagrantfile.
  config.vm.provision 'ansible' do |ansible|
    ansible.playbook = 'test.yml'
    ansible.inventory_path = 'hosts'
    ansible.ask_vault_pass = true
    ansible.limit = 'all'
  end
```
Railsチュートリアル：９章(わからないとこメモです)

##9.1 Remember me 機能

###9.1.1 記憶トークンと暗号化

ユーザーを記憶するには、記憶トークンを作成して、そのトークンをダイジェストに変換したものをデータベースに保存します。fixtureをテストするときにdigestメソッドを既に作成してあったので (リスト 8.21)、上の結論に従って、新しいトークンを作成するためのnew_tokenメソッドを作成できます。この新しいdigestメソッドではユーザーオブジェクトが不要なので、このメソッドもUserモデルのクラスメソッドとして作成することにします7。

一般に、あるメソッドがオブジェクトのインスタンスを必要としていない場合は、クラスメソッドにするのが常道です。実際、11.2ではここでの決定が重要になってきます。

↑おそろしく意味不明。digestの意味をわかってないからと思う


###9.1.2 ログイン状態の保持

###9.1.3 ユーザーを忘れる

###9.1.4 ２つの目立たないバグ

全部意味わからん。

##9.2 [Remember me] チェックボックス


##9.3 [Remember me] のテスト

##9.3.1 [Remember me] ボックスをテストする

##9.3.2 [Remember me] をテストする

###9.4 最後に

終わった。まったく理解できずにただのコピペだった。
わからないことがわからない。
二週目に追記することでしょう。
tape.gradient()の戻り値がNoneで困った話

## イントロ
Adversarial Exampleを作成するために、勾配にアクセスする必要があった。

## まとめ
1. tensorflow2系になったことで、tensorflowとkerasが一体化したこと
2. model.predictを使ってはいけないこと

とにかく、1を知ったおかげで実装することができた。import文の書き換えをする必要があるよ
おいおい書いていきます
markdown記法



# フォント
[Qiitaのマークダウンで色をつける方法[140色]](https://qiita.com/twipg/items/d8043cd4681a2780c160)


#参考：
https://qiita.com/tbpgr/items/989c6badefff69377da7


|header1|header2|header3|
|:--|--:|:--:|
|align left|align right|align center|
|a|b|c|


[google][google]
その他の文章
[google][google]


[google](https://www.google.co.jp/)


***
___

---

*    *    *
*    
normal **bold** normal
normal __bold__ normal

normal *italic* normal
normal _italic_ normal

インストールコマンドは `gem install hoge` です

    # tab
    hoge
    end

---
    # Space
    class Hoge
      def hoge
        print 'hoge'
      end
    end

> お世話になります。xxxです。
> 
> ご連絡いただいた、バグの件ですが、仕様です。

1. 番号付きリスト1
    1. 番号付きリスト1_1
    1. 番号付きリスト1_2
1. 番号付きリスト2
1. 番号付きリスト3

- リスト1
    - ネスト リスト1_1
        - ネスト リスト1_1_1
        - ネスト リスト1_1_2
    - ネスト リスト1_2
- リスト2
- リスト3
【AWS】EC2におけるwebサーバーの立ち上げで引っかかったこと

#1.はじめに
ローカル開発環境で完成したDjangoベースのwebアプリを、公開するにあたり、
CIDRブロックやサブネットと言う単語がわからなかった。
調べたことをまとめるために、本記事にまとめる。

#2.参考文献
1.Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版
https://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%EF%BC%86%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89-%E6%94%B9%E8%A8%82%E7%89%88-ebook/dp/B06Y5ZSYY4

#3.内容
##3-1.基本事項
TCP/IP　・・・　インターネット接続で使われているプロトコル。通信先を特定するのに、IPアドレスを使う。
(参考:https://eng-entrance.com/network-tcpip)
IPアドレス　・・・　TCP/IPにおいて、データの通信先を示すもの。IPv4とIPv6があるが、本記事ではIPv4を対象に記載する。ユニークである必要がある。
パブリックIPアドレス　・・・　IPアドレスのうち、インターネット接続で使われている。プロバイダやサーバー事業者から貸与される。

プライベートIPアドレス　・・・　企業内LANなどで自由に設定できる。インターネットでは使われていないIPアドレス範囲を使う。具体的には以下の通り。
クラスA: 10.0.0.0～10.255.255.255
クラスB: 172.16.0.0～172.31.255.255
クラスC: 192.168.0.0～192.168.255.255
(参考：https://www.atmarkit.co.jp/aig/06network/privateip.html)

IPアドレスは、ネットワーク部とホスト部に分かれる。IPv4の場合、データサイズはネットワーク部とホスト部合わせて３２ビット。

##3-2.引っかかったポイント(CIDRブロック、Apacheなど)
###a)CIDRブロックとは

CIDR表記
192.168.1.0~192.168.1.255の合計２５６個のアドレスを表記する場合、
ネットワーク部：24ビット。（８ビット✖️３パート）
ホスト部：8ビット
となる。
上記のネットワーク部のデータ長を表記する方法をCIDR表記と呼ぶ。
CIDR表記: 192.168.1.0/24
(参考：https://wa3.i-3-i.info/word11990.html)


(補足)サブネットマスク表記
上記と同じ情報を示すために、サブネットマスク表記と言う手法もある。
192.168.1.0~192.168.1.255の合計２５６個のアドレスを表記する場合、
サブネットマスク表記: 192.168.1.0/255.255.255.0

上記の記法で決めたIPアドレス範囲を”CIDRブロック”と呼ぶ。
例：
10.0.0.0/16
-> 10.0.0.0 ~ 10.0.255.255

###b) httpdとApacheの関係
ApacheとNginxは、Webサーバー機能を持つミドルウェアである。
yumでインストールするhttpdとは、apacheのこと。
具体的には、以下のコマンドで、Apacheをインストールしていることになる。

```
[User]$ yum install httpd
```

上記のhttpdとは、apacheの実行ファイルの一つ。


#4.所感
・httpdとApacheの関係を知らなかったのは正直恥ずかしい。
・CIDRブロックなどは、AWS上のEC2インスタンスでwebアプリをdeployする手順の理解に非常に役に立った。
【Rails】I18n::InvalidLocaleData ロケールファイルを翻訳できない

# 概要

```ruby:application.rb
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
```

複数ロケールファイルを読み込ませる設定を記述しているが複数ロケールファイルを作成するとエラーがでる。

## エラーメッセージ

[view]
[![Image from Gyazo](https://t.gyazo.com/teams/startup-technology/f7339860047d9f79f282a00aa23b51a1.png)](https://startup-technology.gyazo.com/f7339860047d9f79f282a00aa23b51a1)

[log]

```ruby:development.log
I18n::InvalidLocaleData - can not load translations from /Users/hogehogehoge/hogehoge/hogehogehoge/config/locales/model/ja.yml: #<Psych::SyntaxError: (<unknown>): mapping values are not allowed in this context at line 14 column 13>:
```

## 原因

空になってる`ja.yml`があったこと。
ymlファイルに何も記述がないとエラー吐くっぽい。
エラー文を見てもymlファイルを認識できないというよりはymlファイルを翻訳できないみたいなニュアンスなので`ja:`だけ全てのロケールファイルに記述したら直った。

## 解決しなかったけど他に試したこと

1. rails-i18nのバージョン固定
Githubより
>
gem 'rails-i18n', '~> 6.0.0' # For 6.0.0 or higher
gem 'rails-i18n', '~> 5.1' # For 5.0.x, 5.1.x and 5.2.x
gem 'rails-i18n', '~> 4.0' # For 4.0.x
gem 'rails-i18n', '~> 3.0' # For 3.x
gem 'rails-i18n', github: 'svenfuchs/rails-i18n', branch: 'master' # For 5.x
gem 'rails-i18n', github: 'svenfuchs/rails-i18n', branch: 'rails-4-x' # For 4.x
gem 'rails-i18n', github: 'svenfuchs/rails-i18n', branch: 'rails-3-x' # For 3.x



2. springの再起動
[参考記事](https://stackoverrun.com/ja/q/6938328)

3. YAML記法の見直し

ディレクトリ名やインデントの数を見直す

## 追記

### 1 記法

```yml:ja.yml
ja:
  activerecord:
    models:
      user: ユーザー
      player: 選手
    attributes:
      user: 選手
        twitter_id: Twitter ID
        email: メールアドレス
        screen_name: 名前
        profile_image_url: アバター
        notification: メール通知
```

`attributes`の直データを間違って翻訳させようとすると同じエラー + syntaxエラー出る。

**NG**

```yml
attributes:
      user: 選手
```

**OK**

```yml
attributes:
      user:
```

### 2 初期化

ロケールファイルを新規作成した場合はサーバーを再起動させること
.gitignore に gitignore.io を使う

## `gitignore.io` とは
`gitignore.io`は、環境、言語に合わせて`.gitignore`を生成してくれるサービス。


## `gitignore.io` を試す

対象の環境、言語を選択する。
　1. macOS
　2. VisualStudioCode
　3. react
　4. Firebase
　5. Node

<img width="993" alt="スクリーンショット 2020-05-06 17.44.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628225/11a3914a-332e-9c30-1b01-13c2f0498007.png">


`Create`をクリックする。

```

# Created by https://www.gitignore.io/api/node,react,macos,firebase,visualstudiocode
# Edit at https://www.gitignore.io/?templates=node,react,macos,firebase,visualstudiocode

### Firebase ###
.idea
**/node_modules/*
**/.firebaserc

### Firebase Patch ###
.runtimeconfig.json
.firebase/

### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage
*.lcov

# nyc test coverage
.nyc_output

# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# TypeScript v1 declaration files
typings/

# TypeScript cache
*.tsbuildinfo

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env
.env.test

# parcel-bundler cache (https://parceljs.org/)
.cache

# next.js build output
.next

# nuxt.js build output
.nuxt

# rollup.js default build output
dist/

# Uncomment the public line if your project uses Gatsby
# https://nextjs.org/blog/next-9-1#public-directory-support
# https://create-react-app.dev/docs/using-the-public-folder/#docsNav
# public

# Storybook build outputs
.out
.storybook-out

# vuepress build output
.vuepress/dist

# Serverless directories
.serverless/

# FuseBox cache
.fusebox/

# DynamoDB Local files
.dynamodb/

# Temporary folders
tmp/
temp/

### react ###
.DS_*
**/*.backup.*
**/*.back.*

node_modules

*.sublime*

psd
thumb
sketch

### VisualStudioCode ###
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json

### VisualStudioCode Patch ###
# Ignore all local history of files
.history

# End of https://www.gitignore.io/api/node,react,macos,firebase,visualstudiocode
```
慣れが怖いLinuxコマンド履歴検索「Ctrl+r」

使っていて若干危ないケースがあるなーと感じたので投稿。
コマンド履歴に実行NGな更新削除系コマンド表示時に誤って実行しかけた。。。

## コマンド履歴検索「Ctrl+r」とは
キーワード元に以前のコマンド履歴を検索できる機能。

```bash
$ # ターミナルで「Ctrl+r」押すと検索モードになり入力を受け付け開始
(reverse-i-search)`': 
```
```bash
$ # 例えばcdとか打つと直近で実行されたcdコマンドが表示
(reverse-i-search)`cd': cd /var/www/
```

```bash
$ # 上記状態で「Ctrl+r」押すとさらに一つ前の履歴が表示
(reverse-i-search)`cd': cd html
```

## どんな時危ないと思った？
ターミナルからDBログイン時（psql）にCtrl+rで接続コマンド探すときによく使用するのだが、そのコマンド検索結果後半に今実行したらNGな更新系SQL実行する記述が含まれていた。。。

```bash
$ # psqlコマンド後半に「-f」（SQLファイル指定し実行）がいた
(reverse-i-search)`psql': psql -h ${ホスト名} -U ${ユーザ名} -d ${データベース名} -f {今実行NGなSQLファイル}
```
誤ってEnter押してしまったが、パスワード入力促される時点で気づいたのでセーフでした。
気づかないで実行してしまったらと思うとゾッとしました。。。

## さいごに
常日頃使っているコマンド等にどんなリスクあるのか意識してみると事故可能性低くなるかも。
上記の場合`history | psql`でコマンド履歴表示してコピペの方がまだ事故る可能性低くなるのかなと思いました。効率落ちますが。。
WindowsでDiscordがインストール出来ない場合の対処法(Update Failedループ)

こんにちは、今回はプログラミングとは別のDiscordに関連した記事です。

#前置き
Windows7を触っていて、Discordをインストールしようとしたら
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396596/7ae08f80-999a-6148-4740-d2c6c7acd88d.png)
このような風になってしまい「困った」と思っていて調べていたら解決策を見つけました。
(Original Source: https://www.reddit.com/r/discordapp/comments/7p3zby/stuck_on_update_windows/dsebrw8/)

#解決方法(日本語)
まずDiscordのインストーラー(アップデート中のやつ)を閉じてエクスプローラーで``\Users\ <userfolder> \AppData\Local\Discord``に行きます。
そして``Update.exe``を``UpdateX.exe``に変更します。
そしてデスクトップなどに追加されているDiscordをクリックすると何事も無く起動してくれます。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396596/7d125f9d-ba73-c29e-eccc-215bb721c9be.png)