OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoderのテストケースをJupyterNotebookで簡単に入力・実行する方法

## はじめに

皆さん、Atcoderやってますか？？
私も面白そうだ！と思ってPythonではじめてみました。
ただ、いざコンテストでコード書くぞとなると

コンテストサイトのコードテストはページの移動がめんどくさいし・・・
PyCharmは気軽に・・・というにはちょっと重いし・・・

という、なんか丁度いいコーディング環境が見つからないなぁというお気持ちに。。
そしていろいろ試してみた中で、JupyterNotebookが丁度良さそうだ！っていうのを実感してきたので共有してみたいと思います！

## さっそく紹介

まず、そもそもJupyterNotebookが良い！完璧！
というのであれば、この記事はここで終わりで良いのですが

ひとつだけ、すごくAtCoderに向いてないところがあります。

それは「テストケースをうまく入力する手段がない」というところです！
input()で入力を受け取りたいのに、そんなの用意されてないので受け取れません。。


そこで！
「JupyterNotebookでAtCoderのテストケースを簡単に受け取る方法」をご紹介します。


では、ノートブックを開いてください。
はじめのセルに下記のコードをペーストします。

```python
from ipywidgets import Textarea

def get_input(change):
    global Input
    Input = change["new"]

textarea = Textarea()
textarea.observe(get_input, names='value')
display(textarea)
```

そして、セルを実行・・・
するとテキストエリアが出現します！
![セル1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130234/6df9b76f-08e8-b992-7d7a-3d136e076349.jpeg)
このテキストエリアは複数行の入力が可能で、テストケースをそのまま貼り付けることが可能です！

続いて、
下にセルをひとつ作成し、下記のコードをペーストします。

```python
IN = iter(Input.split('\n')).__next__
def input():
    return IN()
```

以上で準備は完了です！
![セル2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130234/23b61e54-4036-0b64-f34f-f39b00c8eeb1.jpeg)

## 使ってみる

Atcoderの常駐コンテスト「practice」の「A-Welcome to AtCoder」で試してみます。

### 問題文

高橋君はデータの加工が行いたいです。
整数 a,b,cと、文字列sが与えられます。a+b+cの計算結果と、文字列sを並べて表示しなさい。
### 入力
入力は以下の形式で与えられる。

```
a
b c
s
```
### 出力
a+b+cとsを空白区切りで1行に出力せよ。

---
### 入力例1

```
1
2 3
test
```
### 出力例1

```
6 test
```
---
さて、複数行の入力があるタイプです。
さっそく入力例を先ほど準備しておいたテキストエリアに張り付けましょう！
![実践1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130234/0ad630d9-34ba-71fa-94ad-5a49eccdbd15.jpeg)
見切れてしまっていますが、貼り付けられましたね。

続いて、コーディングします。
コードは二つ目のセルに書きます。
![実践2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130234/cbd8bfa3-a3d1-dc25-2607-750dd3bc9870.jpeg)
実行すると・・・ちゃんと動きました！
input()でテキストエリアから一行ずつ取得してくれています。

あとはコードを提出すればめでたくゴールインです！
ACすることを祈りましょう（誤って準備コードも含まないよう注意）
![提出.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130234/b7e88fad-caa0-3d38-1cc1-80d91d5f84a0.jpeg)

## おわりに

いかがだったでしょうか？？

少しの準備でいろんな入力をぱぱっと試せるので、かなり快適になるかと思います！
まだしっくりくるコーディング環境が見つからない・・・とお悩みの方は是非ともお試しください～

ではでは
CentOS 8でSSL/TLS関連のエラーが出るときの対処法

CentOS 7からCentOS 8へのバージョンアップに伴い、SSL/TLSのセキュリティ関連の基準が引き上げられた。これにより、SSL/TLS周りでエラーが出ることがある。

```
update-crypto-policies --show
```

とすると、CentOS 8では、`DEFAULT`と出るはずである。

```
sudo update-crypto-policies --set LEGACY
```

とすることで、CentOS 7と同じセキュリティレベルに戻すことができ、エラーを解消することができる。

もう一度、

```
update-crypto-policies --show
```

とすると、`LEGACY`と出ることが確認できる。
初期表示処理でいっぱいapi呼んでformを作成しないといけない時のRxJSの書き方

## ※追記

こちらの方が適切です
→　[初期表示処理でいっぱいapi呼んでformを作成しないといけない時のRxJSの書き方(最適化版)](https://qiita.com/pg_yamaton/items/89a6993e8925746b367f)

並列
┣データAB取得(並列),
┃ ┗データDEF取得(並列)
┣データC取得,
┗その他非同期処理

↓

form作成

## 初期表示処理の流れ

１．下記を並列で処理
データA取得
データB取得
データC取得
その他の非同期処理

２．下記は取得したデータAとBをキーに取得する
データD取得(データAがキー)
データE取得(データBがキー)
データF取得(データAとBがキー)

３．上記で取得したA〜Fのデータを基にformを作成する
４．form作成後、画面表示フラグをtrueにする

## 実装

※RxJSの記述法は6の前提です

```typescript

myForm: FormGroup;

/** 画面表示フラグ */
showScreen = false;

ngOnInit() {
  // forkJoinは並列で処理します
  forkJoin([
    this.fetchA(),
    this.fetchB(),
    this.fetchC(),
    this.otherObservableFn() // その他の非同期処理
  ]).pipe(
    // 非同期処理中に他の非同期処理を呼ぶ場合はflatMapを使います
    // ※他にもswitchmapやconcatmap等があります
    // タプルでA、B、Cの戻りを変数で指定できます。4つめの戻り値は不要なので省略できます
    flatMap(([dataA, dataB, dataC]) =>
      forkJoin(
        // dataA, dataB, dataCは次のcreateFormでも必要なのでofで返します
        of(dataA),
        of(dataB),
        of(dataC),
        this.fetchD(dataA),
        this.fetchE(dataB),
        this.fetchF(dataA, dataB)
      )
    )
  ).subscribe(res => {
    // resの中は[dataA,・・・,dataF]です
    this.createForm(res);
    // データを取得してformの作成が終わったので画面表示フラグをtrueにします
    this.showScreen = true;
  });
}

// B、Cも同じ様な関数です
private fetchA(): Observable<AModel> {
  // serviceの実装は省略します
  return this.dataAHttpService.fetch();
}

// E、Fも同じ様な関数です
private fetchD(dataA: AModel): Observable<DModel> {
  return this.dataDHttpService.fetch(dataA.id);
}

private createForm(res): void {
 // 実装は省略します
}
```
新卒2年目がAWS認定ソリューションアーキテクトアソシエイトを取得したので勉強法を公開します！

## 受験前の経験について
ソリューションアーキテクトアソシエイト資格受験時には以下のような状態で、AWSの経験はほぼありませんでした。

- サーバーサイドエンジニア2年目
- AWSは無料枠でEC2インスタンスを立ててみたことがあるくらい
- S3などの各種サービスは名前は聞いたことはあるが使い方はわからない

## 受験までの準備
受験にあたって、以下のように学習を進めました。

1. AWSソリューションアーキテクトアソシエイト向け参考書を読む
2. AWS Well-Architected フレームワークホワイトペーパーを読む
3. AWS公式模擬試験を解いてみる
4. Whizlabsでひたすら問題を解きまくる

### 1. AWSソリューションアーキテクトアソシエイト向け参考書を読む
AWSソリューションアーキテクトアソシエイト向け参考書には色々ありますが、自分は参考書を選んで読みました。
資格取得に必要な知識が体系的にまとまっているのに加えて、章ごとに練習問題も用意されているので読みやすかったです。

- [AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/479739739X/)

### 2. AWS Well-Architected フレームワークホワイトペーパーを読む
次にAWS設計について知るうえでは避けては通れない[AWS Well-Architected フレームワークホワイトペーパー](https://aws.amazon.com/jp/blogs/news/aws-well-architected-whitepaper/)を読みました。
結構なボリュームがあるので全てを読むのは大変ですが、前半に目を通すだけでも価値はあると思います。

### 3. AWS公式模擬試験を解いてみる
AWS公式が提供している模試を解いてみて、問題の難易度などの感覚をつかみます。
1と2でインプットはある程度できてはいたものの、実際に問題を解くとなるとまだ学習が必要だと感じました。

### 4. Whizlabsでひたすら問題を解きまくる
AWS公式模試は価格の割に問題数があまり多くないので、[Whizlabs](https://www.whizlabs.com/)でAWSソリューションアーキテクト対策問題集を購入してひたすら解きまくりました。
日本語対応はしていませんが、間違えた問題を後で振り返ることができて解説もしっかりしているのでかなり得点力を上げることができたと思います。

## 解き方のコツ
問題数を重ねるにつれ、以下のことを意識することで問題スムーズに解くことができるようになりました。

### 問題がなにを求めているのかを見極める
問題では基本的にWell-Architectedに沿った設計を行うことを求められますが、その問題が可用性やコスト最適化、セキュリティなどどの要素を求めているのかをまず問題から読み解くことがとても重要です。

### 各種マネージドサービスを活用する
AWSにはRDSやLambdaなど多くのマネージドサービスが存在します。
これらのサービスは可用性やコスト面に優れるため、問題の選択肢に現れた場合は優先的に選択することができます。

### 英語の原文を確認してみる
問題の中には稀に翻訳がやや不自然な箇所もあります。
試験中は自由に言語を切り替えることができるので、日本語でよくわからなかったところが英語の原文を読んでみるとすんなり理解できることもあります。

## 実際に試験を終えてみて
受験前と比べると確実にAWSに関する知識が増えたと感じました。
今まで知らなかったAWSのサービスや特長も知ることができたので、アーキテクチャの選定や設計の際にも非常に役に立っています。
ただ実際にサービスを触る機会があまりなかったので、今後はもっと手を動かしてみることを意識していきたいと思います。
[Windows]sedでスペースをタブにする

# 前書き
　経緯は忘れましたが、ツールで生成したスペースインデントなコードを、タブインデントなソースに貼りたかったんだと思います(曖昧)。
その前処理の際、タブへの変換が意外と手こずったので、備忘として残しておこうと思ったのでした。


# 本題
ファイルの各行に登場する、最初のスペースだけをタブに置換する

```shell
> cat target.txt | sed -r "s/ /\t/" > result.txt
```

`sed -e`だと置換されなかった、謎！
しかも`<tab>`とか`<space>`も上手くいかない、謎！！


# 参考
[sedでスペースをタブに置換 (連続スペースは1文字とみなす)](http://luvtome.blog5.fc2.com/blog-entry-647.html)
正規表現の検索結果をWEB上でリアルタイムに確認しながら作成できるエディタ

メモとして残します。


[正規表現の可視化ツールRegulexを使おう！ - Qiita](https://qiita.com/yucatio/items/e980550814f66b3450dd)
この記事を見ていて、早速社内で「これすごい！」と展開したら、
上長から「これもいいよ」と以下のサイトをおすすめされました。

[RegExr: Learn, Build, & Test RegEx](https://regexr.com/)

このエディタのすごいところはテストしたいテキストを入力して上部の「Expression」にて正規表現を入力するとリアルタイムにヒットしたテキストをハイライトしてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213462/a86515b0-5dd2-dc2e-3c2e-45eee2346eb9.png)



さらにすごいのは正規表現のエンジンを変えることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213462/46f77019-0f5a-3af3-8791-b5794ac81bec.png)

基本的にはjavascriptのエンジンで確認してももんだいはなさそうですが、オプション関係はエンジンによってあったりなかったり、違ってたりなので、そういう場合は変えて確認することもできるようです。

しかも左部のメニューには機能がたくさんあり、チートシートで確認しながら、正規表現を作れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213462/2bf475fd-3daf-f605-7f20-1b940afb39d5.png)



上長、ありがとう。
これで開発の効率が上がります。
Neovimでpopup-menuを実装できるプラグイン

## Neovim用のpopup-menuを実装できるプラグインを作りました
[Vim8にはpopup_menu()という関数があり](https://vim-jp.org/vimdoc-ja/popup.html#popup_menu())、ユーザー独自のpopup-menuを利用した機能を作ることができるのですが、これまで残念ながらNeovimには同じ機能は実装されていませんでした。

これは時々問題になることがあります。例えば、プラグイン作者が軽い気持ちで`popup_menu()`を利用すると、Neovimでは`popup_menu()`に相当する機能がないため、Neovimで全く同じ機能を実装するのは一苦労することになります。

今回これを解決すべく、**popup-menu.nvim**というプラグインを作成しました。

https://github.com/kamykn/popup-menu.nvim

## 利用イメージ
見た目はこんな感じです。
<img width="680" alt="top.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73446/a72904ff-3c8b-e0e7-b9c4-bc06e015c9cf.png">

さほどVimのpopup-menuと見た目は遜色ないかと思います（実装者の主観入り）

使う場合はこんな感じです。

```vimscript
let l:list = ['aaa', 'bbb', 'ccc', 'ddd', 'eee']
call popup_menu#open(l:list, {selected -> s:my_callback(selected)})
```

コールバックの指定にはlambdaを利用してください。

細かくカスタマイズしたい場合には第3引数に`nvim_open_win()`と同じ第3引数で利用するconfパラメータを渡すことが可能です。

```vimscript
call popup_menu#open(
		\ l:list,
		\ {selected -> s:my_callback(selected)},
		\ {
		\ 	'relative': 'editor',
		\ 	'width': 30,
		\ 	'height': 7,
		\ 	'col': 5,
		\ 	'row': 5
		\ })
```

### Vimのpopup_menu()との使い方
このプラグインはVimの`popup_menu()`をいい感じに呼んでくれるようなことはしていないので、ifなどでVim用とNeovim用で処理を分けてください。
自分は下記のようにVimとNeovimで処理を分けています。

```vimscript
if exists('*popup_menu')
    " Vim
    call popup_menu(...)
elseif has('nvim') && exists('g:loaded_popup_menu_plugin') 
    " Neovim
    " popup-menu.nvimの中で g:loaded_popup_menu_plugin が定義されています
    call popup_menu#open(...)
else
    " Old vim/neovim
    let l:selected = inputlist(...)
    " callbackを呼ぶ
endif
```

## プラグインの中身の話
実装には一部Golangを利用しています。
[github.com/marcusolsson/tui-go](http://github.com/marcusolsson/tui-go)を利用しており、Neovimのfloating-windowで起動したterminalを通してGolangのバイナリを実行して、選択肢を実現しています。

選択肢を実現するためのライブラリは色々試したのですが、一番見た目がpopup_menu()に近い実装ができたのがTUIライブラリである`tui-go`でした。
（他のライブラリだと`Select > `みたいなpromptが出ていて消せなかったり、CLI用の配慮で余計に最下行に空行が入ってしまったりで結構ライブラリ選択に詰まったりしてました...）

というわけで、プラグインの利用に際してなにかNeovimでセットアップが必要になるわけではないのですが、作者がバイナリを用意していないアーキテクチャについては動作しませんので、必要に応じてIssueなりプルリクなりたてていただければ助かりますmm

現状、Mac、Linux、Windowsに対応しています。（※手元にWindowsが無いため、Windowsでは未検証...）
https://github.com/kamykn/popup-menu.nvim/blob/5390df3e281cea1f229c773c40d72f7165f663cd/src/Makefile

## Vimのpopup-menuと違う点
- 見た目の差異は多少あります（ボーダーとか）。
- あとは、「スペースキーで選択」できないというのも地味に本家とは異なります。
- floating-windowの中でterminalが起動しているという点で、壊そうと思えば壊れてしまうので優しく扱ってあげてください...🥺

## 自分が解決したかったこと
ちなみになぜこれを作ったかというと、冒頭で述べたとおりまさにプラグインで`popup-menu()`を利用してNeovimで対応できない問題に悩んでいました...。(Neovim早く`popup_menu()`実装してくれーと願いつつ)

https://github.com/kamykn/spelunker.vim/issues/31

というわけで、もしNeovimで`popup_menu()`が実装されれば即このプラグインはdeplecatedになるわけですが、その日まではこのプラグインでしのいでもらいましょう。

というわけで、同じ悩みをお持ちであればぜひ本プラグインを使ってみてください〜✌️
Juliaのパッケージをインストール

Juliaでパッケージを（アン）インストールする時につい忘れちゃうことを備忘録的にまとめたいと思います。

## パッケージをインストールする

基本的には`add`を使います

### 公式パッケージに登録されているパッケージをインストールする場合

```
# 基本
(v1.3) pkg> add Example

# バージョンを指定する場合
(v1.3) pkg> add Example@0.X.X

# ブランチを指定する場合
(v1.3) pkg> add Example#feature

# コミットを指定する場合
(v1.3) pkg> add Example#97e870d
```


### 公式パッケージに登録されていないパッケージをインストールする場合

GithubのURLからインストールできます

```
(v1.3) pkg> add https://github.com/hogehoge/Example.jl

# 同様にブランチ指定もできます
(v1.3) pkg> add https://github.com/hogehoge/Example.jl#feature

# 同じく同様にコミット指定もできます
(v1.3) pkg> add https://github.com/hogehoge/Example.jl#97e870d
```

### 開発中のパッケージをインストールする場合

`add`ではなく `dev`を使うことが多いです
`dev`を使う理由（使うべき時）については[こちら](https://qiita.com/mametank/items/43330a9452f0039ca22d)を参考にしてください

```
(v1.3) pkg> dev Example
```

## パッケージをアンインストールする

`rm`を使います

```
(v1.3) pkg> rm Example
```

## インストールしたパッケージをアップデートする

```
(v1.3) pkg> update Example
```
インストールしてある全てのパッケージをアップデートする場合は、`update`だけで大丈夫です

```
(v1.3) pkg> update
```

## 参考
[Juliaのパッケージ開発に便利なPkgTemplate, Revise, developコマンド](https://qiita.com/mametank/items/43330a9452f0039ca22d)
https://julialang.github.io/Pkg.jl/stable/managing-packages/
全部ES6のループ文にしたかった時の最後の難関だったfor (let i = 0; i < 10; i++)をやっと抹殺した

## 目的
要素が10個のArrayをつくる

## 追記・結論

これが一番簡潔です。

```
const array = Array(10).fill(0).map((_, idx) => ({
    id: idx,
    name: "hoge"
}));
```

![スクリーンショット 2020-11-13 9.25.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566220/840fde99-6d5e-179f-0c04-cdc5c67acc7d.png)

## 2022/3/1 さらに追記
これが一番シンプルです。

```
[...Array(10)].map((_, idx) => ({
```

### 憎きfor文
```ts
const array = [];
for (let i = 0; i < 10; i++) {
  const obj = {
    id: i,
    name: "hoge"
  };
  array.push(obj);
}
```

↓

### [...Array(10)]
```ts
const array = [...Array(10)].map((_, idx) => 
  return {
    id: idx,
    name: "hoge"
  };
);
```

これだとエラー
(lengthは10だけどemptyの配列が作られた)

↓

### Array.from(Array(10))
```ts
const array = Array.from(Array(10)).map((_, idx) => 
  return {
    id: idx,
    name: "hoge"
  };
);
```

これで動いた

参考：
https://stackoverflow.com/questions/10993824/do-something-n-times-declarative-syntax
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/from

## 関連記事

[現場でよく使うJS ES6ループ文まとめ](https://qiita.com/pg_yamaton/items/7fad97ac744bede3f127)
Ruby/GTK3 - ProgressBar

`gem install gtk3`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/ad4d5fd4-142a-4f85-2b58-6a5b16e457fe.png)


```ruby
# frozen_string_literal: true

require 'gtk3'

class ProgressBarWindow < Gtk::Window
  attr_accessor :progressbar, :activity_mode
  def initialize
    super
    self.title = 'ProgressBar Demo'
    self.border_width = 10

    vbox = Gtk::Box.new(:vertical, 6)
    add vbox

    @progressbar = Gtk::ProgressBar.new
    vbox.pack_start progressbar

    button = Gtk::CheckButton.new('Show text')
    button.signal_connect('toggled') { |b| on_show_text_toggled b }
    vbox.pack_start button

    button = Gtk::CheckButton.new('Activity mode')
    button.signal_connect('toggled') { |b| on_activity_mode_toggled b }
    vbox.pack_start button

    button = Gtk::CheckButton.new('Right to Left')
    button.signal_connect('toggled') { |b| on_right_to_left_toggled b }
    vbox.pack_start button

    timeout_id = GLib::Timeout.add(50) { on_timeout }
  end

  def on_show_text_toggled(button)
    show_text = button.active?
    text = show_text ? 'some text' : ''
    progressbar.text = text
    progressbar.show_text = show_text
  end

  def on_activity_mode_toggled(button)
    @activity_mode = button.active?
    if activity_mode
      progressbar.pulse
    else
      progressbar.set_fraction 0
    end
  end

  def on_right_to_left_toggled(button)
    value = button.active?
    progressbar.set_inverted value
  end

  def on_timeout
    if activity_mode
      progressbar.pulse
    else
      new_value = progressbar.fraction + 0.01
      new_value = 0 if new_value > 1
      progressbar.fraction = new_value
    end
  end
end

win = ProgressBarWindow.new
win.signal_connect('destroy') { Gtk.main_quit }
win.show_all
Gtk.main
```

[Python version](https://python-gtk-3-tutorial.readthedocs.io/en/latest/progressbar.html#example)
列挙型

#enum
列挙型とは、複数の変数の内、どれか一つをとるデータ型です。
enumの中身によって処理を分岐させるmatch演算子もセットで覚えましょう。

~~~rust
// プログラミング言語の選択肢
enum Language {
    Rust,
    C,
    VBA,
    Python,
    Haskell,
    LISP,
}

fn main(){
    let my_language = Language::Rust; // Rustを選択する。

    // これはmatch構文。
    // my_languageの値によって異なる文字列を返す。
    let output = match my_language {
        Language::Rust      => "Rustは私が勉強しているプログラミング言語です。",
        Language::C         => "Cは以前使ったことがあるプログラミング言語です。",
        Language::Python    => "Pythonはとても便利だという噂だが、私は電卓以外の用途で使ったことがありません。",
        _                   => "その言語はよくわかりません",
    };

    println!("{}", output); // "Rustは私が勉強しているプログラミング言語です。"が表示される。
}
~~~
列挙型の定義は以下のように書きます。
`enum` `列挙体の名前` `{` `ヴァリアント` `}`
ヴァリアントはカンマで区切って複数回書くことが出来ます。

#match
上記コードのこの部分に注目してください。

~~~rust
// これはmatch構文。
// my_languageの値によって異なる文字列を返す。
let output = match my_language {
    Language::Rust      => "Rustは私が勉強しているプログラミング言語です。",
    Language::C         => "Cは以前使ったことがあるプログラミング言語です。",
    Language::Python    => "Pythonはとても便利だという噂だが、私は電卓以外の方法で使ったことがありません。",
    _                   => "その言語はよくわかりません",
};
~~~
ここでmatch演算子を使って処理を分岐させています。
Language::Rustの場合、Language::Cの場合・・・と順番にmy_languageとマッチするか判定し、マッチしたら`=>`の右側に書かれているコードを実行します。
matchは式なので、値を返します。関数と同じように、最後に書かれた式やデータが戻り値となります。
まとめると、`my_language`の中身によって異なる文字列を`output`に束縛するコードということになります。
matchは以下のように書きます。
`match` `分岐の判定に使うデータ` `{` 
`パターン` `=>` `マッチした場合のコード`
`パターン` `=>` `マッチした場合のコード`
`・・・`
 `}`
パターンとコードの組（アームといいます）はいくつあっても良いのですが、すべてのパターンを網羅する必要があります。
そのため、すべてのパターンを列挙するか、あらゆるデータにマッチするパターンを末尾に書かなければいけません。


[目次](https://qiita.com/tonesuke/items/52e469f18e747c794376)
【Git】push済を取り消してcherry-pickを使って部分的な修正だけ取り込む

## この記事の概要

今日現場で実際に使った、gitでpush済を取り消して
部分的な修正だけを取り込むcherry-pickの使い方を備忘録として記載しました


## 2020/03/06追記

この記事の手順について下記のご指摘を頂きました。
>この手順だと、
Bさんの手元にあるリポジトリと、remoteのリポジトリ（Aさんがpush -fしたもの）が歴史が食い違うのでまたコンフリクトしてしまうはずです。
基本的にpush -fをすると、影響範囲が特定できなくなって事故の元ですので、どうしても回避できない時以外はやらない方が良いです。
https://next.rikunabi.com/journal/20180209_t12_iq/
push済のコミットを取り消す場合は、resetではなくてrevertを使うのが正攻法になります。

　
　
>本当は commit -f で取り消すよりも
git revert <commit>
でコミットログ打ち消してから再度コミットが安全。
commit -f だとといくらでも過去の改ざんをできてしまう。
(今回は直前の作業で影響すくない&ゴミログ残したくなかったので commit -f使いました。)

## 前提
Aさんのコミット履歴

1回目のコミット　コミット番号：00001
>Aファイル更新
>Bファイル更新
>Cファイル更新

2回目のコミット　コミット番号：00002
>Dファイル更新
>Eファイル更新
>Fファイル更新

上記2つの修正はpush済
リモートブランチはA〜Fファイルが更新済の状態

※本来はコミット番号は下記の「ca82a6dff817ec66f44342007202690a93763949」のようなやつです

>$ git log
>commit ca82a6dff817ec66f44342007202690a93763949
>Author: Scott Chacon <schacon@gee-mail.com>
>Date:   Mon Mar 17 21:52:11 2008 -0700

参照：[2.3 Git の基本 - コミット履歴の閲覧](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E5%B1%A5%E6%AD%B4%E3%81%AE%E9%96%B2%E8%A6%A7)

## BさんがAさんのFクラスの変更だけ取り込みたい場合

### Aさんの作業

pushしたものをローカルで取り消す
→まずはコミット番号00001の状態にする

```bash
$ git reset --soft 00001
```

これでAさんのローカルの状態は、
00002の修正(D〜Fファイルの修正)が未コミット状態になる

※注)
`$ git reset --hard 00001`
を行った場合、Aさんのローカルは00002の修正(D〜Fファイルの修正)は存在しなくなる

この状態で、強制pushする

```bash
$ git push -f
```

これでリモートブランチが、00001の状態になる
(A〜Cファイルのみ更新状態)

次に、DとEファイルの更新のみをステージングしてコミット・pushする
→コミット番号：00003

次に、Fファイルの更新をステージングしてコミット・pushする
→コミット番号：00004

### 現在のリモートの状態

1回目のコミット　コミット番号：00001
>Aファイル更新
>Bファイル更新
>Cファイル更新

2回目のコミット　コミット番号：00003
>Dファイル更新
>Eファイル更新

3回目のコミット　コミット番号：00004
>Fファイル更新

### Bさんの作業

リモートの状態を取得

```bash
$ git fetch
```

Fファイルの修正分だけ取り込む

```bash
$ git cherry-pick 00004
```
画面のサイズをスマホサイズにしてみよう

# 今日の目標

### レスポンシブ対応を学ぶ

レスポンシブデザインに対応するには主に
・HTMLのviewport
・CSSのmedia query
・Bootstrap
・JavaScript ほぼjQuery

その他にも色んな方法があるかと思うのですが、代表的なものはこんな感じだと思います。

そん中でもviewportをオススメするのですが
## viewportというhtmlの機能を使ってスマホに対応させる方法なんです

# HTMLでレスポンシブ対応？？？



```html:
<meta name="viewport" content="width=device-width,initial-scale=1">
```
って1行をHTMLのheadに記述するだけ

# うぉおおおおおお　すげぇぇぇぇ楽だぜぇぇぇぇ

ちなみにhamlで書くとこんな感じ

```haml:
!!!
%html{:lang => "en"}
  %head
    %meta{:content => "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/
    %meta{:charset => "utf-8"}/
    %meta{:content => "width=device-width, initial-scale=1, shrink-to-fit=no", :name => "viewport"}/
    %meta{:content => "", :name => "description"}/
    %meta{:content => "", :name => "author"}/
```
こんな感じでmetaタグに記述させるだけで、簡単に導入することができます。
width=device-widthこの記述でスクリーンサイズに合わせてねってことになり、
例えば、width=width=500とすると画面幅500px用の表示になります。

initial-scale=1.0は初期表示する際の拡大率。
## viewportの概念(ちょっと真面目に)

 `<meta name="viewport" content="width=480">` と指定したとする。

するとそこに幅480pxの仮想的なウインドウが作られる。幅480pxの液晶モニターがあることをイメージして欲しい。これをviewportと呼ぶ。

ブラウザはviewportにレンダリングする。viewportの中では、あたかも本当に480pxのモニターを使っているかのような環境になっている。
したがって、JSのdocument.documentElement.clientWidthなんかも480を返すし、media queryの条件判定でも480pxの画面幅が使われる。

ブラウザがviewportを実際の液晶画面に表示する。この時、viewportの幅が実際の液晶画面よりも大きければviewportがはみ出して、液晶画面にはviewportの一部しか表示されないだろう。逆に、viewportの幅が液晶画面よりも小さければviewportの内容は液晶画面に収まるが、液晶画面には余白ができてしまうだろう。これを調整するため、ブラウザはviewportのレンダリング結果を液晶の画面サイズに合うようにズームアップまたはダウンして表示する。
<meta name="viewport" content="width=device-width">と指定した場合はviewportの幅は端末やブラウザアプリ毎に調整される。

# CSSで調整する方法

```html:
<link rel="stylesheet" href="sp.css" media="screen and (max-width: 500px)">
<link rel="stylesheet" href="pc.css" media="screen and (min-width: 1000px)">
```
少し紛らわしいところですが、
max-width 画面幅が500px以下はsp.cssを読み込み、
min-width 画面幅が1000px以上はpc.cssが読み込まれるという感じ

しかし使うなら下記のメディアクエリかなと思う。

```css:
@media screen and (max-width: 499px) { 
    /*　画面サイズ 499pxまで適用　*/
    .content {color: #red;}
  }
  @media screen and (min-width: 500px) and (max-width: 999px) {
    /*　画面サイズ 500pxから999pxまで適用　*/
    .content {color: #green;}
  }
  @media screen and (min-width:1000px) {
    /*　画面サイズ 1000px以上から適用　*/
    .content {color: #blue;}
  }
```

こんな感じで切り替えたい画面幅で、好きなようにスタイルを適応させれるのが便利

生CSSを打ちたくない人はBootstrapを使いましょう。

Bootstrapに関してはまた違う機会に！
AWSの多要素認証について

##AWSでは多要素認証が使えます
最近現場でAWS(Amazon Web Service)に触れる機会があり、
私が使っているIAMユーザでもログインをする際に多要素認証を行っております。


この多要素認証ひと手間かかりますが、
このひと手間で情報漏洩しない(に等しいほど可能性を低くできる)と考えればやらない手はありません。

ではこの多要素認証ですが、AWSでは以下の4つが使えます。
(1つは廃止されましたが…)

・SMSテキストメッセージベースMFA(廃止)
・U2Fセキュリティキー
・ハードウェアMFAデバイス
・仮想MFAデバイス


##その前に①：多要素認証とは

4つの多要素認証…、
多要素認証ってさっきから言っているが、それはなんだ？という方に簡単な説明を。


多要素認証は言葉の通り多数(複数)の要素で認証を行うことです。

要素は主に3つあり、
「知識要素(パスワード等)」「所持要素(セキュリティトークン等)」
「生体要素(指紋等)」という要素があります。
このうちの２種類以上を使用して認証することを多要素認証といいます。

また英語でMulti-factor authenticationと言い、「MFA」と略されます。


##その前に②：４つの認証方法の流れについて

以下の流れになります。
最初のID、パスワード入力は共通です。

1.(ユーザ)ID.パスワードの入力
2.(サイト)ID.パスワードの検証
3.(ユーザ)<認証ごとに異なる>
4.(サイト)<認証ごとに異なる>
5.(ユーザ)ログイン成功

つまりAWSでは２回目(２段目)の認証方法を４つから選べます。


#AWSでの多要素認証についての説明
##・SMSテキストメッセージベースMFA(廃止)
所持要素として携帯電話を使用します。

ID・パスワード入力後、
所持している携帯電話にてショートメッセージ形式で認証キーを受信し、
SMSで受信した数字を入力することでログインが可能になるという方法です。


##・U2Fセキュリティキー
所持要素としてUSBポートに専用のデバイスを接続し使います。

ID・パスワード入力後、
サイト側からデバイスにアクセス要求を出し、
デバイスにタッチ等のアクションをすることによりログインが可能になるという方法です。
![computer_security_key_usb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567450/6606aea9-b0b9-847d-a0c3-ad7affa0d5b9.png)


##・ハードウェアMFAデバイス
所持要素としてワンタイムパスワードを生成する専用のデバイスを使用します。

ID・パスワード入力後、
時間同期にて生成されたワンタイムパスワードを入力することでログインが可能になるという方法です。


##・仮想MFAデバイス
ハードウェアMFAを仮想化(ソフトウェアアプリとして実行)させたものです。
この場合はサイトにて利用登録したソフトがインストールされているハードウェアが所持要素となります。

ログインまでの流れもハードウェアMFAデバイスと同じです。
![internet_nidankai_ninsyou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567450/b64cae82-6e50-e45c-bcc7-3b58b4ecd312.png)

-----------------------------------------------------------------------------
大まかな説明でしたが概要としては上記のようになります。

認証を２段階にしたうえで多要素にすればセキュリティはより堅固なものになりますので、
AWSのように多要素認証を設けているところでは設定することをお勧めします。
【A-Frame】リロードさせずにカメラを正面に向かせる（recenter）

# 概要
WebVRで、カメラを初めのrotationに戻したい場合の対処法の備忘録。

WebVRはHMDやスマホでユーザーが自由にいろんな角度を見回せるのが魅力ですが、リロードさせずに正面を向いて欲しい時に使えます。

# 実装
cameraに親要素`<a-entity>`をつけて、親要素の角度をカメラに合わせて回すことでユーザーに正面を向かせることができます。

```index.html
<a-scene>
  <a-box position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9"></a-box>
  <a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E"></a-sphere>
  <a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder>
  <a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>
  <a-sky color="#ECECEC"></a-sky>
　<!-- 以下camera -->
  <a-entity id="camera-wrapper">
    <a-entity camera id="camera" position="0 1.5 0" look-controls></a-entity>
  </a-entity>
</a-scene>
```

```script.js
 let btn = document.getElementById("btn");
 let cameraWrapper = document.getElementById("camera-wrapper");
 let camera = document.getElementById("camera");
 btn.addEventListener("click", () => {
   let y = camera.getAttribute("rotation").y;
   cameraWrapper.setAttribute("rotation", {y: -1 * y});
 });
```

こちら参考にさせていただきました。
https://stackoverflow.com/questions/43576222/is-there-a-way-to-recenter-reset-orientation


recenterボタンをつけて動かすとこんな感じ
![giphy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/33375782-4c7b-a896-fb94-509f07a617f8.gif)

おじさんボタンを押すと無事、オブジェクトが正面に戻ってきました。
<img width="199" alt="スクリーンショット 2020-03-25 23.47.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306452/b96738af-a31f-a5a1-b8fc-fefbb4e61955.png">

# 試してダメだったこと
camera自体のrotationにsetAttributeで`0 0 0`入れるのはうまく行きませんでした。
チーム開発 (決済ライブラリpayjpインストールエラー対処)

gem 'payjp'
bundle installできなかったが、macOSをアップデートしたらbundle installできるようになった。

rails sできなくなったエラー文
Could not find a JavaScript runtime. 
See https://github.com/rails/execjs for a list of available runtimes.
参考サイト　MacにNode.jsをインストールで解決
https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09

セレクトタグ
https://qiita.com/ozackiee/items/3c027d07cdeb61df6029
AWS Kinesis data streams とiOSの連携に苦しんだので、記事化しておきたい

#　はじめに
この記事は筆者がiOSとAWSの連携をしていたときに苦しんだため書いたものである。筆者の備忘録的な意味合いもあるため、わかりずらさがあったらすいません。

- 苦しんだ理由

1. Kinesis data streams　との関連記事がなんか古い(2015年とか)けどとりあえず実装してみるかという甘い考えでいた。
2. swift　Jsonなどの知識不足

## 　実際起こった問題
AWSKinesis iOSでググると2015年の記事がいっぱい出てくる、それを実装しても曖昧な関数なので、ダメです！とかいうエラーが出てよくわかんない

##　完成形のコード
- 前提条件
cocoapods,AWSCore,AWSKinesis,AWSCognitoはimportで宣言済み



        let kinesisRecorder = AWSKinesisRecorder.default()
        let jsonStr = """{\"hogehoge\": \"hogehoge\",\"mobile_timestamp\": \"2016-03-16 01:40:12\",\"hogehoge\": \"hogehoge\",\"hogehoge\": \"hogehoge\",\"hogehoge\": \"hogehogehoge\",\"hogehoge\": \"hogehoge\"}"""

        let yourData = jsonStr.data(using: .utf8)
        kinesisRecorder.saveRecord(yourData, streamName: "your stream name")   
        kinesisRecorder.submitAllRecords()

##  ざっくりと見てみる
一行目　kinesisを使うためのレコーダー宣言
二行目　Jsonの定義
三行目　utf8でのエンコード
四行目　作成したストリームを指定して、宛先を指定
五行目　送信

これだけでデータを送れると
ただ、"""を使用してjsonを無理やり文字列にしているのがいただけない・・・
Stanzaの実行

[Stanza](https://github.com/stanfordnlp/stanza)というNLPライブラリがでたので、installして処理を実行してみた。

パイプラインというのは、入力テキストを前処理、トークン化、レンマ化、品詞タギング、依存関係解析、ラベルづけのようなフローである。Stanzaではそれら一連のパイプライン処理を組み立てる。

READMEには英語しかなかったので、日本語のケースでの実行を試した。

download可能な言語としては、[こちら](https://stanfordnlp.github.io/stanza/models.html#available-ud-models)。66の言語についてモデルが用意されている。

## install

https://stanfordnlp.github.io/stanza/#getting-started

に従えば良い。

```python
import stanza

stanza.download('ja')
```

で、日本語のモデルをdownloadしよう。

downloadがすみ次第、以下で日本語の文章の解析が可能。

```python
nlp = stanza.Pipeline('ja') # stanza.Pipeline()だと'en'のモデルを呼び出そうとするので注意。
doc = nlp("幼時から父は、私によく、金閣のことを語った。")
print(doc.sentences[0].print_dependencies())
```

以下のように出力される。

```
2020-03-25 23:35:09 INFO: Loading these models for language: ja (Japanese):
=======================
| Processor | Package |
-----------------------
| tokenize  | gsd     |
| pos       | gsd     |
| lemma     | gsd     |
| depparse  | gsd     |
=======================

2020-03-25 23:35:09 INFO: Use device: cpu
2020-03-25 23:35:09 INFO: Loading: tokenize
2020-03-25 23:35:09 INFO: Loading: pos
2020-03-25 23:35:09 INFO: Loading: lemma
2020-03-25 23:35:10 INFO: Loading: depparse
2020-03-25 23:35:11 INFO: Done loading processors!
('幼時', '3', 'nmod')
('から', '1', 'case')
('父', '8', 'nsubj')
('は', '3', 'case')
('、', '3', 'punct')
('私', '8', 'iobj')
('に', '6', 'case')
('よく', '14', 'advcl')
('、', '8', 'punct')
('金閣', '12', 'nmod')
('の', '10', 'case')
('こと', '14', 'obj')
('を', '12', 'case')
('語っ', '0', 'root')
('た', '14', 'aux')
('。', '14', 'punct')
None
```

係り受けタグは[こちら](係り受けタグとは)に詳しい。


あとで気づいたが、こういう記事もあった。
https://dev.classmethod.jp/articles/python-stanford-nlp/

pipeline

https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3168328/
When you get the same perks with web design outsourcing to India, why go for all the way of recruiting them in-house!

4Life Innovations is a web design outsourcing company in India, helping website development companies and B2B as well as B2C agencies by providing complete web design services worldwide.

If you’re planning to outsource web design projects work to India, then let’s work together, Outsource your website design, web development or SEO projects to India and see the benefits of Outsourcing web design services compared to other Web design Outsourcing companies in India. We’ve worked with almost 100+ satisfied clients spread over 10+ countries, all of them were happy with their outsourced projects.
Benefits of Web Design Outsourcing India

There’s no doubt that outsourcing is one of the fastest-growing businesses worldwide now, specifically in the IT sector. Similarly, in the case of web design outsourcing projects, there are many benefits related to it.

According to Statista, Global outsourcing industry revenue from 2010 to 2018, by region.
Illustration for article titled When you get the same perks with web design outsourcing to India, why go for all the way of recruiting them in-house!

    Get access to the latest technologies and tools.
    Get 100% support assurity & data protection with having service agreement contract
    Fill the talent gap with outsourcing your work
    More business opportunities to new markets and territories

You can hire our web designers & developers teams to handle any overflow of work you might have. We believe in custom high-quality results at affordable prices.

What’re your thoughts on this? Let’s connect and discuss what we can do for you!
https://www.4lifeinnovations.com/web-design-outsourcing-india/
PostgreSQLで論理削除(NULL許容カラムがある)テーブルにユニーク制約を貼り、UPSERT(ON CONFLICT)する

# まえがき
コメントの@cryksさんが記載してくれているとおり、unique indexにwhere句を利用するほうが2万倍良さそうです。
以下は参照しないでください…。

# 対象環境
- PostgreSQL 9.5以上
  - ON CONFLICTが対応しているもの
- Nullableなカラムを含めてユニーク制約を貼らなければならないテーブルがある

# 前提
- 正しくないアプローチだったらごめんなさい
- パフォーマンスに関しては未確認です

# 結論

## ユニーク制約を貼る

ユニーク制約がないとUPSERTできないので、下記のようにCOALESCEを使ってNULL許容カラムにデフォルト値を入れてユニーク制約を貼ります。
※ COALESCEは第一引数がNULLの時、第二引数の値を返す。NULLじゃない時は第一引数の値を返す関数です。

```sql
create unique index unique_users_mail_address
  on "users" (mail_address, coalesce(deleted_at, '1900-01-01 00:00:00'));
```

COALESCE使わないとPostgreSQLは`NULL<>NULL`なので、同じメールアドレスで何レコードもINSERT出来てしまいます。
そこで、COALESCEを使うことで論理削除テーブルにも正しくユニーク制約を貼れると思います。

## UPSERTする

UPSERTする場合は、下記のようにCONFLICT句にもCOALESCEを適用してクエリを書きます。

```sql
insert into "users"
  (mail_address, "password")
values 
  ('test1@test.com', 'abc'),
  ('test2@test.com', 'abc')
on conflict
  (mail_address, coalesce(deleted_at, '1900-01-01 00:00:00'))
do update set
  "password" = EXCLUDED.password
;
```

varcharやint型でも同様に`''`や`0`を使うことでNullableなカラムにユニーク制約が貼れそうです。

# あとがき
- PostgreSQLは`NULL<>NULL`

↑があるため、これまで自分は論理削除テーブルにはユニーク制約は貼らずに、アプリケーション側でユニークになるようにバリデーションをしてました。
ユニーク制約貼りたいのに貼れない方やUPSERTが出来なくて困っている方の役に立てたら嬉しいです。
【超初心者向け】クロージャの書き方【swift】

##クロージャとは
swiftのLanguage Guideによると
>クロージャは、コードの中で渡したり使用したりすることができる自己完結型の機能ブロックです。

>中略

>クロージャは、それらが定義されているコンテキストから任意の定数や変数への参照を取得して保存することができます。これは、それらの定数や変数の上で閉じることとして知られています。

最近話題のDeepLに翻訳してもらいました。

##関数をクロージャにしてみよう！

以下の関数をクロージャで書いてみます。

・関数

```swift
func closurePractice(num1: Int, num2: Int) -> Int {
    return num1 + num2
}
```

・クロージャ

```swift
{ (num1: Int, num2: Int) -> Int in
    return num1 + num2
}
```

クロージャを使うと、このように処理を簡潔に記載することができます。

##クロージャをもっと簡潔に書いてみる
型推論を使うことで、データ型の記載を省略することができます。

```swift
{ (num1, num2) in
    return num1 + num2
}
```

処理が１行の場合は、さらに`return`も省略することができます。

```swift
{ (num1, num2) in
    num1 + num2
}
```

####参考サイト
- https://docs.swift.org/swift-book/LanguageGuide/Closures.html
Oracle シーケンスすすめるくん（ひたすらnextvalしてシーケンスを進める方法のPL/SQL化）

タイトルの通り、Oracleのシーケンスをすすめるためのプログラム（PL/SQL）です。
https://github.com/noobow34/OracleSequenceIncreaser

Oracleのシーケンスを進める方法としては
（１）DROP SEQUENCEして、希望する値をスタート値とするCREATE SEQUENCEする
（２）INCREMENT BYを指定してALTER SEQUENCEする（一度のnextvalで希望する値まですすめるようにする）
という方法が代表的です。
参考：http://kenken0807.hatenablog.com/entry/2015/08/27/155940

しかし以下のような問題が考えられます。
（１）
一瞬とはいえシーケンスが消失する
（２）
シーケンスは消えないが、自分が管理者ではないデータベースではない場合にALTERするのは気が引ける
他の人もnextvalしてしまうと予定以上に値が進む
またはそもそもALTERの権限がない


というわけで最も原始的な方法**「ひたすらnextvalする」**をPL/SQLで自動化しました。

```SQL
DECLARE
	seqName VARCHAR2(128) := 'TEST_SEQ'; --シーケンス名をセットします
	targetSeq number := 20000; --シーケンス終了値をセットします
	seqSql varchar2(1000);
	tempSeq number;
BEGIN
	DBMS_OUTPUT.PUT_LINE('***** Oracle シーケンスすすめるくん Ver 1.0 *****');
	DBMS_OUTPUT.PUT_LINE('処理対象シーケンス名：' || seqName);
	seqSql := 'SELECT ' || seqName || '.nextval from dual';
	DBMS_OUTPUT.PUT_LINE('実行SQL：' || seqSql);
	EXECUTE IMMEDIATE seqSQl INTO tempSeq;
	DBMS_OUTPUT.PUT_LINE('シーケンス現在値：' || tempSeq);
	DBMS_OUTPUT.PUT_LINE('シーケンス終了値：' || targetSeq);
	
	WHILE(tempSeq < targetSeq) loop
		EXECUTE IMMEDIATE seqSQl INTO tempSeq;
	END LOOP;
	
	DBMS_OUTPUT.PUT_LINE('シーケンスが' || tempSeq ||'になりました。終了します。');
END; 
/
```

実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149348/6f5fd014-2122-70ea-c21d-79b60be8c5e6.png)

```
C:\Users\xxxx>sqlplus xxxx/xxxx@xxxx

SQL*Plus: Release 19.0.0.0.0 - Production on 水 3月 25 23:27:58 2020
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

最終正常ログイン時間: 水 3月  25 2020 23:11:27 +09:00


Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0
に接続されました。
SQL> set serveroutput on
SQL> DECLARE
  2  seqName VARCHAR2(128) := 'TEST_SEQ'; --シーケンス名をセットします
  3  targetSeq number := 30000; --シーケンス終了値をセットします
  4  seqSql varchar2(1000);
  5  tempSeq number;
  6  BEGIN
  7  DBMS_OUTPUT.PUT_LINE('***** Oracle シーケンスすすめるくん Ver 1.0 *****');
  8  DBMS_OUTPUT.PUT_LINE('処理対象シーケンス名：' || seqName);
  9  seqSql := 'SELECT ' || seqName || '.nextval from dual';
 10  DBMS_OUTPUT.PUT_LINE('実行SQL：' || seqSql);
 11  EXECUTE IMMEDIATE seqSQl INTO tempSeq;
 12  DBMS_OUTPUT.PUT_LINE('シーケンス現在値：' || tempSeq);
 13  DBMS_OUTPUT.PUT_LINE('シーケンス終了値：' || targetSeq);
 14
 15  WHILE(tempSeq < targetSeq) loop
 16  EXECUTE IMMEDIATE seqSQl INTO tempSeq;
 17  END LOOP;
 18
 19  DBMS_OUTPUT.PUT_LINE('シーケンスが' || tempSeq ||'になりました。終了します。');
 20  END;
 21  /
***** Oracle シーケンスすすめるくん Ver 1.0 *****
処理対象シーケンス名：TEST_SEQ
実行SQL：SELECT TEST_SEQ.nextval from dual
シーケンス現在値：20001
シーケンス終了値：30000
シーケンスが30000になりました。終了します。

PL/SQLプロシージャが正常に完了しました。
```
2019年度の AWS What's New を集計してみた

# 結果
![aws_whats_new_FY2019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559634/b590b3df-bc40-6a5d-25fc-9bc3692be937.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559634/1d10c17a-6379-4e8b-0575-a9775fc93ce7.png)

# 概要
* What's New のアーカイブから 2019/4/1～2020/3/20 のアップデートを取得（Python の Beautiful Soup を利用）
  * https://aws.amazon.com/about-aws/whats-new/2019/
  * https://aws.amazon.com/about-aws/whats-new/2020/
* 件名から、えいやでサービスを分類するロジックを組んで集計（機械学習とかおしゃれなことをするほどのモチベーションはなかったです）
  * AWSさん、アップデート情報にタグ付けして・・・

# 所感
* サービス別集計で上位5位までは「まぁ、そーよねー」という感じだが、6位とか7位に FSx とか SSM が出てきたのは意外だった
* 週別件数を見ると、週30～40件出るのが普通なので、追いつき続けるには工夫が必要だなーと改めて実感
  * 私は社内で週次の勉強会を運営して強制的に習慣化
* とりあえず、AWSさん！！アップデート情報にタグ付けお願いします！！
Nuxt.js  vue-routerの自動生成を利用しない方法

Vue.jsからの以降でファイル名を変えたくない! 
MetaフィールドなどAlias設定したい! 
様々な理由でvue-routerの自動生成を使わずに手動設定する方法

# どうすればいいか
・`pages` ディレクトリ外に Vue ファイルを置く
・extendRoutesでルーティング設定する

## `pages` ディレクトリ外に Vue ファイルを置く
`pages` ディレクトリ内の Vue ファイルから自動生成されるので
単純に`pages` ディレクトリ以外のディレクトリに Vue ファイルを置けば自動生成されないので`views`ディレクトリなど適当なフォルダを作成して、そこに置く。
※`pages`自体を消してしまうとビルドエラーになる為、空のまま残しておく

## extendRoutesでルーティング設定する

`nuxt.config.js` ファイルの`router`プロパティの`extendRoutes`でルーティングの拡張を行う  

設定例

```js:nuxt.config.js
  router: {
    extendRoutes(routes, resolve) {
      routes.push({
          name: 'index',
          path: '/',
          component: resolve(__dirname, 'views/index.vue')
        },
        {
          name: 'user',
          path: '/user',
          component: resolve(__dirname, 'views/user/index.vue')
        },
        {
          name: 'user-one',
          path: '/user/one',
          component: resolve(__dirname, 'views/user/one.vue')
        })
    }
  }
```

# 参考サイト
[API: router プロパティ - NuxtJS](https://ja.nuxtjs.org/api/configuration-router/#extendroutes)
SwiftUIでSFSafariViewControllerコーディングを簡単に行う

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91569/7f42ba54-140d-55a7-00f0-8ef716aebb1e.gif)


`SFSafariViewController`はナビゲーション時の振る舞いや状態管理を自身で有しているので、予めUIViewControllerRepresentable化してSwiftUIで制御しようとするとコーディングが複雑になる。なのでそれを簡単に行えるパターンを考えてみた。

```swift
import SwiftUI
import SafariServices

public struct RepresentControllerView: UIViewControllerRepresentable {
    private var uiViewController: UIViewController
    
    public init(uiViewController: UIViewController) {
        self.uiViewController = uiViewController
    }
    
    public func makeUIViewController(context: Context) -> UIViewController {
        uiViewController
    }
    
    public func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
}

public final class HostingController<Content: View>: UIHostingController<Content>, ObservableObject {}

public struct HostingControllerView<Content: View>: View {
    private var c: HostingController<Content>
    
    public init(rootView: Content) {
        self.c = HostingController(rootView: rootView)
    }
    
    public var body: some View {
        RepresentControllerView(uiViewController: c).environmentObject(c)
    }
}

struct ContentView: View {
    struct RootView: View {
        @EnvironmentObject var viewController: HostingController<RootView>
        private let urlString = "https://example.org"
        func present() {
            let safari = SFSafariViewController(url: URL(string: urlString)!)
            viewController.present(safari, animated: true, completion: nil)
        }
        var body: some View {
            Button(urlString, action: present)
        }
    }
    var body: some View {
        HostingControllerView(rootView: RootView())
    }
}
```


期待通りウェブをフルスクリーンモーダルで表示が出来た。
【Laravel】 From句にサブクエリを使用する

# 結論
laravel 5.6.3から
joinSub、leftJoinSubが使える.


```php
$subQuery = ProfileUserView::select(['user_id', 'company_id'])
    ->whereBetween('created_at', [$from, $to])
    ->distinct();

$mostViewQuery = \DB::query()
    ->selectRaw('company_id, COUNT(user_id) AS pv')
    ->fromSub($subQuery, 'sub')
    ->groupBy('company_id');
```

## ver 5.6.3以前
それより以前は mergeBindings使う.

https://github.com/laravel/framework/issues/19711

```php
$count = DB::table( DB::raw("({$sub->toSql()}) as sub") )
    ->mergeBindings($sub->getQuery()) // you need to get underlying Query Builder
    ->count();
```

こんな感じ

```php
$subQuery = ProfileUserView::select(['user_id', 'company_id'])
    ->whereBetween('created_at', [$from, $to])
    ->distinct();
          
$mostViewQuery = \DB::table(\DB::raw("({$subQuery->toSql()}) as sub") )
    ->mergeBindings($subQuery->getQuery())
    ->selectRaw('company_id, COUNT(user_id) AS pv')
    ->groupBy('company_id');
```

ただしmergeBindingsは、bindするパラメーターの順序を気をつけないといけないので注意する
【Laravel】 base64エンコードされた画像を保存する

```php
    /**
     * 画像保存
     * @param  string $base64Context
     * @param  string $storage
     * @param  string $dir
     * @return App\Models\Image
     */
    public function storeImage($base64Context, $storage, $dir)
    {
        try {
            preg_match('/data:image\/(\w+);base64,/', $base64Context, $matches);
            $extension = $matches[1];

            $img = preg_replace('/^data:image.*base64,/', '', $base64Context);
            $img = str_replace(' ', '+', $img);
            $fileData = base64_decode($img);

            $dir = rtrim($dir, '/').'/';
            $fileName = md5($img);
            $path = $dir.$fileName.'.'.$extension;

            Storage::disk($storage)->put($path, $fileData);

            return $path;

        } catch (Exception $e) {
            Log::error($e);
            return null;
        }
    }
```
Ubuntu18.04にQGIS3.Xをインストール

UbuntuのレポジトリにあるのはQGIS2.18なので、3系をインストールするには追加の手順が必要である。
今回は2020年3月時点の安定板（Long Term Release）であるQGIS3.10をインストールする。

以降の内容は[QGIS：Linux環境でのインストール方法](https://www.qgis.org/ja/site/forusers/alldownloads.html#linux)をまとめなおしたものなので、詳しくはそちらを参照。

## 準備
公式ではインストール済みのQGISとGRASSはアンインストールするように書いてあるが、しなくても問題は生じなかった。ただしその場合には、QGIS2.18は上書きされてQGIS3.10にアップグレードされる。
心配な人は既存のQGISとGRASSをアンインストールしておくと良いと思う。

## sources.listへのレポジトリの追加
```bash
sudo gedit /etc/apt/sources.list
```
で`sources.list`を開き、最終行に以下を追加する。

```
deb https://qgis.org/ubuntu-ltr bionic main
```
また、最新版（2020年3月時点では3.12）を使用したい場合には、上記ではなく以下を追加する。

```bash
deb https://qgis.org/ubuntu bionic main
```
`deb-src`にするとコンパイルすることになるので注意（[参考](https://qastack.jp/unix/20504/the-difference-between-deb-versus-deb-src-in-sources-list)）。

## 公開鍵の追加
**2020年8月追記：記事作成時点から公開鍵が変わったのでコードを変更しました**（[参考](https://gis.stackexchange.com/questions/332245/error-adding-qgis-org-repository-public-key-to-apt-keyring)）
以下を実行して、レポジトリの公開鍵を追加する。

```bash
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F7E06F06199EF2F2
```

## インストール
あとは通常通りにインストールする。

```bash
sudo apt update # わすれずに！
sudo apt install qgis qgis-plugin-grass
```
これで完了。アプリケーションからQGIS3.10が起動できるようになる。

QGIS2.18を削除せずにインストールした場合には、初回起動時に以下のような質問が出るので好きな方を選ぶ（どの設定が引き継がれるのかはよくわかりませんでした）。
![QGISset2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/0084d247-4aa4-9a03-c0f4-9cb316fb8c8c.png)

## 備考
LTRが他のバージョンに移行したときには自動でアップグレードされると思うので、そこだけ注意。
Pythonで毎日AtCoder #16

### はじめに
[前回](https://qiita.com/taxfree_python/items/40206334d0d93e8b894e)
今日もCです。今日で例題は終わりです。

### #16

**考えたこと**
[ABC049-C](https://atcoder.jp/contests/abc049/tasks/arc065_a)
ぜんぜん分からなかったので、解説を見ました。ふむふむ、文字列を逆にすればerの区別しなくていいのか。
文字列を逆にしたあとは、ひたすらif文にしてます。

```python
s = str(input())
s = ''.join(list(reversed(s)))

t = 0
while t <= len(s):
    if s[t:t+5] == 'maerd':
        t += 5
        continue
    elif s[t:t+7] == 'remaerd':
        t += 7
        continue
    elif s[t:t+5] == 'esare':
        t += 5
        continue
    elif s[t:t+6] == 'resare':
        t += 6
        continue
    elif t == len(s):
        print('YES')
        quit()
    else:
        break
print('NO')
```
Python3 → 33ms
PyPy3   → 189ms
スライス処理はPyPyよりもPythonの方が早い?
********
[ABC086-C](https://atcoder.jp/contests/abc086/tasks/arc089_a)
(0,0)から(x,y)に移動するときに必要な[マンハッタン距離?](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%B3%E3%83%8F%E3%83%83%E3%82%BF%E3%83%B3%E8%B7%9D%E9%9B%A2)をdとすると、t>=dなら時間内に到着できます。また、(d - t) % 2 == 0ならば、t未満で到着しても隣りのマスと目的のマスを往復できるので、t時に到着可能です。

```python
n = int(input())
l = [list(map(int,input().split())) for _ in range(n)]

for i in range(n):
    t = l[i][0]
    x = l[i][1]
    y = l[i][2]
    d = x + y
    if d <= t and (d - t) % 2 == 0:
        continue
    else:
        print('No')
        quit()
print('Yes')

```
Python3 → 369ms
PyPy3   → 585ms


### まとめ
今回で例題は全部解いたので、次回からは類題を解いていきます!
では、また
【文字列関連まとめ】Rubyのややこしいシンボルとは

# はじめに
Rubyの文字列は`"hoge"`、`'hoge'`、`:hoge`など非常にややこしいと感じているのは自分だけでしょうか。
コロンがついている`:hoge`は正しくは文字列ではなくシンボルと呼ばれているものですが、非常に文字列と似ているため最初のうちは混乱すると思います。（まあややこしいんで別に使わなくていいんですけどね）
本記事では主に`"hoge"`、`'hoge'`、`:hoge`の3つについて解説します。
さらに、`%Q(hoge)`や`%W(hoge)`なんてものもありますが、こちらは使いどころが多くないため、簡単な解説に絞ります。

# “hoge”と’hoge’
ご存知、文字列の基本ですね。ダブルクオーテーションやシングルクオーテーションで囲うことで文字列であることを表します。ほとんどの言語で使われているので知っていると思います。

## “hoge”と’hoge’のどちらを使うか
基本的にはどちらを使っても良いです。しかし、Rubyの使用上、「特殊文字」「式展開」を使うときは””で囲う必要があるため日頃から””を使うことをおすすめします。

特殊文字、式展開については以下で説明します。

### 特殊文字
\n（改行）や\t（タブ）などのこと。（他にもあるので調べてみてください。）
以下の様にhello worldの中に特殊文字を入れた例で見てみる。

```.rb
puts "He\nllo wor\tld"
puts 'He\nllo wor\tld'
```

実行結果は以下の様になります。

```
He
llo wor ld
He\nllo wor\tld
```

ダブルクォーテーションの方は改行とタブが入っていて、シングルクォーテーションの方は文字がそのまま出ていることがわかります。

### 式展開
`#{}`で囲むことで変数を出力したり、計算結果を出力できたりする。

```.rb
price = 100

puts "税込価格は#{price * 110 / 100}円です。"
puts '税込価格は#{price * 110 / 100}円です。'
```

実行結果は以下の様になります。

```
税込価格は110円です。
税込価格は#{price * 110 / 100}円です。
```

ちなみに式展開を利用せずに書くと以下の様になります。コードが長く見辛くなるため式展開は覚えておくと良いでしょう。

```.rb
puts "税込価格は" + (price * 110 / 100).to_s + "です"
```

# :hoge
コロンがついたものはシンボルと言われるものです。他の言語にはないため戸惑う人も多いと思います。

内部的な詳しい解説は他の人に任せるとして簡単に説明します。

## シンボルの有用性
シンボルは、ソースコード上では文字列のように見え、内部的には整数値として管理されています。もちろん文字列はソースコード上でも内部的にも文字列として管理されています。

では内部的に整数値で管理することのなにがよいかというと、処理速度が上がるんですよね。整数値は0~9の組み合わせですが、文字列は膨大な数の文字がありますから。

極論、シンボルが嫌いなら一切使わずにコードを書くこいてもOKです。

## シンボルの使いどき
その文字列自体に意味があるときは文字列、意味がないときはシンボルを使いましょう。
わかりやすいのはハッシュのキーと値です。

例えば、`人 = {名前 => 山田太郎, 住所 => 東京都}`というハッシュがあったとします。

「山田太郎」や「東京都」はその文字自体に意味があります。もし全て整数に変換されてしまったらわけわかめですよね。

逆に「名前」や「住所」は、値を取り出すためのキーです。「山田太郎」は人[名前]、「東京都」は人[住所]で取り出せます。

別にハッシュを人 = [なーまーえ => 山田太郎, じゅーしょ => 東京都]として、人[なーまーえ]、人[じゅーしょ]で取り出してもいいですよね。こういうときにシンボルを使います。

ルーティングなどにもよく使われていますね。

## ハッシュでの利用
:hogeではなくhoge:という記述があって戸惑ったことがもしかしたらあるかもしれません。これもシンボルを表し、書き方が特殊なだけです。

先に述べた様に、シンボルはハッシュにおいてよく使われるので書きやすい特殊な書き方が用意されています。

下の3つはほぼ同じハッシュを表していますが、3つ目の書き方に後ろにコロンがついているのがわかると思います。これがhoge:の正体です。

```.rb
# シンボルを使わず定義
person = { "name" => "山田太郎", "address" => "東京都" }

# シンボルを使って定義 
person = { :name => "山田太郎", :address => "東京都" }

# シンボルを使って特殊な書き方で定義
person = { name: "山田太郎", address: "東京都" }
```

::: note warn
キーを文字列で定義したときは取り出すときも文字列を指定、シンボルで定義したときは取り出すときもシンボルを指定する必要があるということに注意しましょう。
:::

ハッシュの定義は慣れないうちは混乱すると思います。こちらの記事も参考にしてみてください。非常に整理されています。

# %Q()と%W()
あまり使うことはないかと思いますが、"hoge"は%Q(hoge)、'hoge'は%q(hoge)と表すことができます。
これのメリットが感じられるのは中の文字列に"や'がたくさんある時です。

`私は"山田"です。`と表したいときは以下の様になり、エスケープする必要がない分%Q()のほうが可読性が高いことがわかります。

```.rb
puts "私は\"山田\"です。"

puts %Q(私は"山田"です。)
```

また、文字列の配列を定義するときに有用なのが%W()で、以下の2つは同じ配列を表します。
コンマ区切りでなくなっていることに注意しましょう。

```.rb
puts [ "red", "blue", "yellow" ]

puts %W( red blue yellow )
```

こんなものもあるんだ程度に覚えていれば大丈夫でしょう。

# まとめ
Rubyには、「使いこなせると便利だけど最初のうちは意味がわからない」ということが多い様に思います。シンボルもその一つでしょう。

基本的には文字列と変わらないけど、ハッシュのキーなどの文字列自体に意味のないものに使うべしと覚えましょう。

質問などございましたらTwitterまで[Twitter@ruemura3](https://twitter.com/ruemura3)
AdGuard DNSで広告除去

#AdGuard DNSとは

DNSをAdGuardのパブリックDNSに設定することによって広告の除去できます。
広告除去+アダルトコンテンツ除去のサーバーもあります。
また、VPNを利用したアプリ版もあります。

AdGuard
[https://adguard.com/ja/welcome.html](https://adguard.com/ja/welcome.html)

AdGuard DNS
[https://adguard.com/ja/adguard-dns/overview.html](https://adguard.com/ja/adguard-dns/overview.html)

##DNS版のメリット
アプリ版はバックグラウンドで起動していますが、その分メモリなどのリソースを消費してしまいます。スマホではバッテリーの消費が早まったり、メモリ不足でアプリが落ちてしまい、いつの間にか広告除去が無効になってしまうことがあります。

##DNS版のデメリット
アプリ版では独自でフィルターを追加できますが、DNS版では出来ません。

#導入方法
Wi-Fi設定時やルーターのDNS、プライベートDNS等に以下のIPアドレスを設定します。

## 広告除去
### IPv4
プライマリー : 94.140.14.14
セカンダリー : 94.140.15.15

### IPv6
プライマリー : 2a10:50c0::ad1:ff
セカンダリー : 2a10:50c0::ad2:ff

## 広告除去+アダルトコンテンツ除去
### IPv4
プライマリー : 94.140.14.15
セカンダリー : 94.140.15.16

### IPv6
プライマリー : 2a10:50c0::bad1:ff
セカンダリー : 2a10:50c0::bad2:ff

## プライベートDNS

アンドロイド9以降のプライベートDNSに設定すればモバイル通信も広告除去ができます。

### 広告除去

```:DNSCrypt
sdns://AQIAAAAAAAAAFDE3Ni4xMDMuMTMwLjEzMDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20
``` 

```:DNS-over-TLS
dns.adguard.com
```

### 広告除去+アダルトコンテンツ除去

```:DNSCrypt
sdns://AQIAAAAAAAAAFDE3Ni4xMDMuMTMwLjEzMjo1NDQzILgxXdexS27jIKRw3C7Wsao5jMnlhvhdRUXWuMm1AFq6ITIuZG5zY3J5cHQuZmFtaWx5Lm5zMS5hZGd1YXJkLmNvbQ
```

```:DNS-over-TLS
dns-family.adguard.com
```

## My Accounts
<a href="https://github.com/mao2009"><img src="https://mao2009.github.io/qiita_template/GitHub-Mark-64px.png" width="50px"></a><a href="https://twitter.com/loach_mao"> <img src="https://mao2009.github.io/qiita_template/Twitter_Social_Icon_Circle_Color.png" width="50px"></a>
100日後まであと何日か表示するWebアプリを作ってみた


AWS Amplifyの勉強を兼ねて、100日を数えるタイマーを作ってみました。

サイトURL: https://master.d3a9hlxk2vvnnd.amplifyapp.com/

サイトにアクセスすると、サインイン画面になります。create accountからアカウント登録できます。

メールアドレスに認証コードを送信する認証方法になっているので、コードを入力する必要があります。

サインインするとタイマーを作成できます。開始日と期間を設定して登録を押します。
![wanitimer2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202548/6c700992-ee79-4f93-19b4-1ee676c43bac.png)

タイマーをクリックすると開始日を変更することもできます。

![wanitimer4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202548/214b12b0-d8a8-cd0a-a0b3-59aa07901492.png)


ソースコード、なにか参考になれば。github: https://github.com/opvelll/wanitimer 
ブログでの記事 : https://opvel.com/2020/03/24/post-1061/

### 今回のスキーマ

今回は``@auth(rules: [{ allow: owner }])``を使ってみた。これでユーザーごとのデータの保存ができます。

```graphql
type Plan @model @auth(rules: [{ allow: owner }]) {
  id: ID!
  startDate: AWSTimestamp!
  settingDays: Int!
}
```