OmniAICreator/Qiita-1.07M huggingface dataset:
パイプ演算子

# 1. 趣旨
パイプ演算子という概念すら知らなかった僕個人のためのレファレンスです。
そういうわけで、そんなに高度な話はないです。



# 2. パイプ演算子 「%>%」

「関数の出力結果（オブジェクト）を次の関数の引数に渡してくれる」もの。
平たく言えば、「左から右へ受け流す～」（ムーディ勝山）
知らなくても生きていける。知っていると生きやすい。ムーディもそう言ってた。

## 2-1. メリット

- コードの簡素化。
- 計算過程を途中で保存する必要がなくなる。
- 改行して細かくメモを残せる

## 2-2. 前提

パイプ演算子自体は、**初めからRに備わっている機能ではない**。
dplyrというパッケージを読み込むことで、初めてパイプ演算子を使えるので、パイプ演算子の入ったコードを使う場合は予めパッケージを準備する必要がある。

```R
# 未インストールの場合は、パッケージを導入する。
install.packages("dplyr")
library(dplyr)
```

## 2-3. Ex.

```R
> sum(1:10) %>% c(10, 20, .) %>% print()
[1] 10 20 55
```

一つ一つ分解すると、

```R
sum(1:10) %>% c(10, 20, .)
```

ここで、`sum(1:10)`の結果を`c(10, 20, .)`に渡している。
引き渡す先は「.」の位置。「.」を打つことで、どの引数にオブジェクトを引き渡すかを明示できる。



```R
c(10, 20, .) %>% print()
```

ここでは、代入後の`c(10, 20, .)`の結果を`print()`に送っている。

この場合は、先ほどと違い、`print()`の引数に「.」はない。
引数が1つだったり、もともと引数が入っているところに代入しようとする場合、「.」を打たないと先頭の引数として取り扱われる。


こうやって関数を数珠繋ぎにすることができる、というのが特徴といえる。


そして、パイプ演算子を使った計算結果は、普通の関数と同様に保存できる。

```R
> vector1 <- sum(1:10) %>% c(10, 20, .)
[1] 10 20 55
> vector1
[1] 10 20 55
```

## 2-4. 改行してもパイプで繋がる

```R
sum(1:10) %>%       # 1から10までを足し算。
c(10, 20, .) %>%    # ベクトルを作成。足し算の結果は最後尾に。
print()             # ベクトルを表示。
```

とまあ、こういう感じでパイプ演算子毎に改行できるので、メモも残しやすい。

# 3. 補足
別に知らなくても生きていけるというのは、普通の記法でも同じ結果を得られるから。

```R
# 記法1
> vector1 <- sum(1:10)
> vector1 <- c(10, 20, vector1)
> print(vector1)
[1] 10 20 55

# 記法2
print(c(10,20,sum(1:10)))
[1] 10 20 55

# 記法3：パイプ演算子を用いた記法
sum(1:10) %>% c(10, 20, .) %>% print()
[1] 10 20 55
```

ただ、**パイプ演算子を使うほうがスマートだし、流れで記述できる**ので、慣れるとこっちのほうが分かりやすい。
あと、ググって他人のコードを見ると、思ったよりパイプ演算子が使われてることが多いので、知らないとコードの意味が分からないことはあるかもしれない。

## 3-1. それぞれの記法の比較
- **`記法1`**の場合、何をやっているかは一目でわかるが、計算過程（ここでは`sum(1:10)`の結果）を一旦`vector1`として保存して参照しなければならないのが面倒な上、コードが複数行に渡るので冗長になってしまう。
- **`記法2`**の場合、コードが一行なのでスマートかもしれないが、入れ子になっているため、何をやっているのかはパッと見ではわからない。後からコードを書き換えるときもカッコの数などに気を使わないといけないので、柔軟性に欠ける。
- **`記法3`**、つまりパイプで書いた場合はどうだろう。パイプ演算子の意味が分かっている者にとっては、このコードが何をしたいのかという流れが一目瞭然だし、コードも簡潔である。途中の処理を加えるといった修正もしやすい。





# 4. 蛇足
ムーディは言った。

>右から左へ受け流す　左から右へは受け流さない 
- ムーディ勝山『右から来たものを左へ受け流すの歌』

ムーディはパイプ演算子とは逆だった。

というお話。

## 5. 主な改訂
<style>
.document tr td:nth-child(1) {
  width:500px;
}
</style>
<table class="document" style="width: 100%;">
<tr><th>更新日付</th><th>内容</th><tr>
<tr><td style="white-space: nowrap;">2020/1/16</td><td><ul><li>メリットとして「改行・コードメモ」に関する記述を追加。</li><li>記法の比較を追加</li><li>2-3.で vector1 として保存するコードの修正<ul><li>修正前：<br>vector1 &lt;- sum(1:10) %&gt;% c(10, 20, .) %&gt;% print()</li><li>修正後：<br>vector1 &lt;- sum(1:10) %&gt;% c(10, 20, .)</li></ul></li></ul></td></tr>
</table>
参照渡しでのエラー「Only variables should be passed by reference」について

最近コード書いてたら出くわしたエラーに関して忘備録として残しておきます。
間違えてる箇所がありましたら優しくご指摘お願いします。

「Only variables should be passed by reference」
ざっくりというと「参照渡しは変数しか使えませんよ〜」っていうエラーです。

下のコードのように、storeContactInfoの引数の中に直接「$id = null」を入れていたのですが、
このやり方ではダメっぽいです。

```
foreach ($infoList as $info) 
{
  // 登録処理
  $this->storeContactInfo($name, $id = null);
}

private function saveContactInfo(string $name, ?int &$id)
{
　（省略）
  // DBに登録
  $contact->save();
}
```

そのため、一旦変数に入れてあげて、その変数を引数で使うようにしてあげたら無事に解決しました。

```
foreach ($infoList as $info) {
  $id = null;
  // 登録処理
  $this->storeContactInfo($name, $id);
}
```

一見おかしくはなさそうなんですけど、saveContactInfo（）側は参照渡しを要求しているのに、
呼び出し側で値渡ししているのが原因でおきてるそうです。

解決できたので、めでたしめでたし。
Google Fonts を使ってみよう

# はじめに

font-family、習いました。
でも、習ったところでfont-familyに何が指定できるのかわからないし、どうしたらそれを調べられるかわからないぞ！

そんな人のためにまずGoogle Fontsを紹介したいと思います。

# Google Fontsのサイト
https://fonts.google.com/

#使い方

## ①サイトを開きます

こんな画面が出てくるよ
<img width="1439" alt="スクリーンショット 2019-12-19 12.56.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304690/60ae7c00-33cf-0958-af2b-84de59b0c0f2.png">

さてここからフォントを探す！と言ってもどっからどう探せばいいか分からない…。

## ②まずは日本語フォントを調べてみる！

タイトルが日本語なら、そこ変えたいよね？！
左上にある**「Language」**から**「Japanese」**を探して選択します。

<img width="707" alt="スクリーンショット 2019-12-19 13.01.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304690/141d9a6f-bea1-0e82-a858-3bb99b364ca4.png">

すると…**日本語出てきたーーーーー！**
<img width="1435" alt="スクリーンショット 2019-12-19 13.02.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304690/8cf87fad-5ac8-4f88-5875-3f6eb28e362b.png">

まだ8種類と少ないですが、それでもデフォルトよりはいいはず！！！
ということで、左上の**「Noto Sans JP」**を使ってみましょう。


## ③フォントを選ぶ

使いたいフォントのフォント名が書いてある右に赤い「＋」のボタンがあります。
そこをクリック！

すると右下にこんなものが現れた！！！
<img width="913" alt="スクリーンショット 2019-12-19 13.08.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304690/9b5c4f7a-1ac5-8327-4a18-412a50d5f082.png">

「1 Family Selected」という黒いやつ。
さてここをクリックすると。

<img width="1033" alt="スクリーンショット 2019-12-19 13.10.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304690/4cf1b61c-df02-50c5-fc9b-49b16ff56732.png">


なんか出てきた。
でもこれが出ればもうあとは少しだけ。

## ④フォントを導入するための魔法の式

赤く「STANDARD」と書いてある下に色々コードが書いてあります。
この<link hraf〜〜から始まるコードをコピーします！！

これね

\<link href="https://fonts.googleapis.com/css?family=Noto+Sans+JP&display=swap" rel="stylesheet">


そして自分が作っているWebサイトの\<head>\</head>の中に貼り付ける。
これに
<img width="285" alt="スクリーンショット 2019-12-19 13.17.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304690/7bb5b839-428a-53c4-23ee-3f9a7e0c2ef0.png">

こう！
<img width="548" alt="スクリーンショット 2019-12-19 13.19.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304690/a93ba6a3-b139-f377-043d-d9eed2a0099c.png">

これで導入は完了。

## ⑤最後にCSSを変えるよ
さっきのコピーしたコードの下にある**「Specify in CSS」**の下にあるコードをコピー！
font-familyってついてるからどこにこれを貼り付ければいいかはもうわかるよね？

h1のフォントを変えたかったらこう！！！
<img width="548" alt="スクリーンショット 2019-12-19 13.49.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304690/89b2c42d-c9ec-bbbb-3c70-bc5a2a699388.png">


## ⑥完成ーーー！確認しよう！
これが
<img width="309" alt="スクリーンショット 2019-12-19 13.51.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304690/13e1818a-2be2-ab94-2194-e6111aa09058.png">
こう！
<img width="309" alt="スクリーンショット 2019-12-19 13.51.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304690/3a7a0447-633a-ff3c-0f2e-5e5132c3a0eb.png">


全然違う！！！


#終わりに

みんないろんなフォントを調べてみてね。
英語だけならとにかくいろんなフォントがあるので試してみて欲しいーーーー！
kafkaを触ったメモ

## kafkaとは？特徴は？
- 分散型イベント駆動型プラットフォーム
- PUB/SUB（Producer/Consumer） でイベント駆動開発ができる
- message順番を守ることができる[^1]
- message保持方法を必要に応じて設定できる[^2]
    - 時間が経過すると、自動削除
    - logデータが大きくなると、自動削除
    - データの上書きで最新のデータのみを保持
    - 永遠に保持し、time travelもできる
- Consumer側でどこまでデータをconsumeしたのかを管理できる[^5]
    - 自動
    - 手動
- データのlossをコントロールできる[^3]
- transactionサポート[^4]
    - atomicity, consistencyを実現するため、データを大きなjsonに入れて、PUBする方法もある

## kafkaでシステムレベルでのイベント駆動型開発イメージ
kafkaのlogoが表すように、様々なサービスがkafka経由でリアルタイムで情報を連携できる

<img width="500" alt="kafka" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114912/1d2ebde2-f127-f8df-f16f-ebdf07745d83.png" />

## システムを設定するときの留意点
- messageの順番を守るべきか
- ある程度のデータlossは許すべきか
- 重複データをconsumeするときに、処理を如何するか
- schema lessなので、topicやデータ構造のドキュメントを書くべき
- データのバージョン管理
 - データ自体にバージョンを入れるか、topicでバージョン管理するかを決める必要がある

## dockerでKafka serverを作る
[wurstmeister/kafka-docker](https://github.com/wurstmeister/kafka-docker
)を使用

```shell
docker-compose -f docker-compose-single-broker.yml up
```

## rails + karafka でmessageの交換を試す
- rails appを作成

```shell
rails new karafka_example
```

- Gemfileに以下のgemを追加し、bundle installする

```ruby
gem 'karafka'
```

- Karafkaの設定を作成

```shell
bundle exec karafka install
```

以下のファイルが作成される

```
app/consumers/application_consumer.rb
app/responders/application_responder.rb
karafka.rb
```

- karafka.rbを編集

```ruby
ENV['RAILS_ENV'] ||= 'development'
ENV['KARAFKA_ENV'] = ENV['RAILS_ENV']
require ::File.expand_path('../config/environment', __FILE__)
Rails.application.eager_load!

class KarafkaApp < Karafka::App
  setup do |config|
    config.kafka.seed_brokers = %w[kafka://127.0.0.1:9092]
    config.client_id = 'example_app'
    config.backend = :inline
    config.batch_fetching = true
    config.logger = Rails.logger
  end
 
  Karafka.monitor.subscribe(Karafka::Instrumentation::Listener)

  consumer_groups.draw do
    consumer_group :bigger_group do
      batch_fetching false

      topic :users do
        consumer UsersConsumer
      end
    end
  end
end

KarafkaApp.boot!
```

- consumerを作成する

app/consumers/users_consumers.rb 

```ruby
class UsersConsumer < ApplicationConsumer
  def consume
    Karafka.logger.info "New [User] event: #{params}"
  end
end
```

- responderを作成する

app/responders/users_responder.rb 

```ruby
class UsersResponder < ApplicationResponder
  topic :users

  def respond(event_payload)
    respond_to :users, event_payload
  end
end
```

- karafka server起動

```shell
bundle exec karafka server
```

- rails consoleでデータ作成を試す

```ruby
UsersResponder.call({ event_name: "user_created", payload: { id: 1 } }
```


## 関連資料
[^1]: [message順番](https://kafka.apache.org/documentation/#intro_guarantees)
[^2]: [log削除](https://medium.com/@sunny_81705/kafka-log-retention-and-cleanup-policies-c8d9cb7e09f8)
[^3]: [message guarantee](https://medium.com/@andy.bryant/processing-guarantees-in-kafka-12dd2e30be0e)
[^4]: [transaction](https://github.com/zendesk/ruby-kafka/blob/master/spec/functional/transactional_producer_spec.rb)
[^5]: [commit-offset](https://riptutorial.com/apache-kafka/example/19389/how-to-commit-offsets)
Android Emulator(Simulator)をインストールする方法

# この記事は
[![Screenshot from Gyazo](https://gyazo.com/bff7ab5c0d9a9348c922afe4289b91eb/raw)](https://gyazo.com/bff7ab5c0d9a9348c922afe4289b91eb)
Android StudioをインストールするとAndroid Simulatorを使うことができます。
この記事はその設定方法を書きました。
※スクショはWindowsですが、Macでも同様の手順でできます。

# 手順
## ① Android Studioのインストール
公式サイトからインストーラーをダウンロードしAndroid Studioをインストールします。 
・[公式サイト](https://developer.android.com/studio/?hl=ja)
・[ユーザーガイド](https://developer.android.com/studio/install?hl=ja)
※ インストールはDefaultの設定でOKです。
Android Virtual DeviceのチェックはONにしてください。
初回起動時のSetup Wizard設定も任意のもので大丈夫です。
![image](https://gyazo.com/a4e61b29549ae3c560b2e96d53cb18bc.png)

##② Emulatorを作成する
1. Android Studioを起動する
2. Configure > AVD Managerをクリックする
3. "Create Virtual Device"をクリックする
4. 作成したいHardwareを選ぶ(主に画面サイズ)
5. 使いたいOSを選ぶ(Downloadしていない場合はDownloadをクリックしてDownloadする)
6. Emulator名や起動時の設定をしてFinishをクリックする
7. AVD Manager(Android Virtual Device Manager)の一覧に↑のEmulatorが追加される
![image](https://gyazo.com/79254c862f1e0b1709ba3ada0b514bb5.png)
![image](https://gyazo.com/ace912ac8d9fcbddb7742b29d26c953d.png)
![image](https://gyazo.com/72a9887776390ee01de985fddd70d3e4.png)
![image](https://gyazo.com/ba709d5f87dd9a846621aa2dd5a17005.png)

## ③ Emulatorの起動
1. AVD Manager一覧にある起動したいEmulatorのAction > ▶ をクリックする
![image](https://gyazo.com/14a50fcbe9fa4c9b8001e234f1175250.png)
![image](https://gyazo.com/d6be4a6147e4206d20e3fd097f2e936a.png)


## ④ 複数のSimulatorや、デバイス/OSを切り替えたい場合。
1. ② Emulatorを作成するのStep.4まで行う(Hardware選ぶまで)
2. タブを切り替えると他のOSが表示される  
　※ 「Recommend」「X86 Images」「Other Images」がある。  
　※ OS6以前やCPUがAMD版のEmulatorもあります。  
3. 使いたいOSを選択して、②の5以降を行う。
![image](https://gyazo.com/8730f24c269cf9a5a3d07740bd6df8b9.png)

## メモ
AMD版のEmulatorをCPUがIntel製ののPCで使ってみたのですがさすがに激重でした。
使い所は考えたほうが良いかもしれません。
VScodeでPythonファイルをターミナル上で実行するショートカット作成

ここでいうターミナルとはvscodeでshift + control + @で立ち上がるターミナルのことを指します。また、そのターミナルでのcwdは、エディター領域で編集しているファイルの直上ディレクトリだとして話を進めます。

注): 単純にデバッグ効率を上げるためだけの記事です。
記事作成自体初めてなので、書き方の上で改善するべき点や、自分はこういうショートカットを作ったら良かった、などの意見もコメントしていただきたいです。

#手順
1. Python拡張機能をインストール
2. ショートカットを追加

2についてのみ書きます。以下のコードを追加するだけです。

```keybindings.json
    {
        "key": "cmd+r",
        "command": "python.execInTerminal",
        "when": "editorTextFocus"
    },
```

"key"はお好みで変えてくださいね！それとwhen式を設定しておくことをお勧めします。(デフォルトで別のコマンドが設定されていてそれと折衝しそうだったので。)

これで今回の目的は達せられました。(ニッコリ)わざわざターミナルに移動してコマンドを打ち込む手間が省けましたね!
部分的にデバッグしたい場合は、『一部を選んで実行』みたいなコマンドもあるのでそれもいいですね。(僕の場合、短いテストファイルを作って実行したかっただけなので今回は割愛します。）しかし、Pythonだけにしか使えないというのは何か物足りないですね...できればcやcppでも
```$: gcc -o file file.cpp
$: ./file
```をやってくれるようなショートカットが欲しいですよね???

#一般化したいよね
cmd+K cmd+Sでショートカット一覧をショートカットで開けます。(ややこしい)
そこで run file などと打ち込むと以下のような画面になります。もちろん、インストールしている拡張機能により表示結果は変わります。
<img width="1060" alt="スクリーンショット 2019-12-19 13.28.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517924/4f86c5c4-b4e9-6d6a-00f3-eaf3790481b0.png">
そこには
```workbench.action.terminal.runActiveFile```という明らかに一般化できそうなコマンドが...

なのでこれで実行したところ以下のようなエラーが起きます。
```bash: cwd/file.py: Permission denied
```これは解決したい...多分パスが通ってないとかその類の問題でしょう...

###結果
英語が読めずに諦めました。(雑魚)
どのように設定すれば他の言語でも応用できるのか、有識者さまにコメントして欲しいです...
iOS Simulator(iPhone Simulator)をMacにインストールする方法


# この記事は
[![Screenshot from Gyazo](https://gyazo.com/1fdb1a3ea73e0d596d349b4a8c566585/raw)](https://gyazo.com/1fdb1a3ea73e0d596d349b4a8c566585) 
MacではXcodeをインストールするとiPhoneやApple WatchのSimulatorを使うことができます。
この記事はその設定方法を書きました。


# 手順
## ① Xcodeのインストール
App Store、またはDevelopperサイトからXcodeをインストールします。
・[App Store](https://apps.apple.com/jp/app/xcode/id497799835)
・[Developerサイト](https://developer.apple.com/download/more/)


## ② Simulatorのインストール
(※結構時間かかります & 1つあたり2.0 ~ 3.5GBぐらいあります)
1. Xcodeを起動する
2. メニューバー > Xcode > Preferenceをクリックする
3. Componentsタブを開く
4. 必要なiOSバージョンをクリックしてインストールする

![image](https://gyazo.com/aeea90d7215b13cce683fe2d1fd22540.png)
![image](https://gyazo.com/d2f124d5d1facf95b5521e17954c7565.png)

## ③ Simulatorの起動
1. Xcodeを起動する
2. メニューバー > Xcode > Open Developer Tool > Simulatorをクリックする  
※ SimulatorはDockに追加できるので、入れておくと便利かも。
![image](https://gyazo.com/63d627a9735914d135df0565978b40aa.png)

## ④ 複数のSimulatorや、デバイス/OSを切り替えたい場合。
1. Simulatorを起動する
2. メニューバー > Hardware > Device 選ぶ
3. iOS一覧とHardware一覧が表示されるので、使いたいものをクリックする  
・ PCのSpecにもよりますが、同時起動は2 ~ 3台がよいかと。  
・表示言語を日本語にしたりも可能です。Client証明書のインストールもできるし、もちろんSafariも使えます。
![image](https://gyazo.com/4c12aea077c37cfb7d5fe34f564e09f2.jpg)

## 合わせて
・iOS バージョンと Safariバージョンの対応表
　https://qiita.com/yoshitake_1201/items/05a13fd77c18ff380eb6
Safariをつかいたけど、どのiOSを入れるか迷う方は↑を参考に入れてみると良いかもです。
WebKitが変わったり、SafariのMajor Versionが変わっているやつを入れたほうが容量的に優しいですね。
composer経由でGuzzleをインストールしたらメモリエラーになったときの対処法

Guzzle https://github.com/guzzle/guzzle
をインストールしようとしたら以下のようなエラーが出た。

```bash
Installation failed, reverting ./composer.json to its original content.
The following exception is caused by a lack of memory or swap, or not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details

PHP Warning:  proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 952

Warning: proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/composer/vendor/symfony/console/Application.php on line 952
                                                     
  [ErrorException]                                   
  proc_open(): fork failed - Cannot allocate memory  
```

メモリが足りないらしい。

## 対処法
↑のエラーに表示される
https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors
に書いてある以下のコマンドを順番に実行して、スワップファイルを作る＆有効化する。

```bash
/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1
```

Permission denied と出た場合は `sudo` をつけてください。

## 参考
https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors
https://evisu0414.com/engineer/engineer010/
rails データ保存あれこれ


### 基本

new → view → controller

- 通常

```ruby
def product_params
 params.require(:product).permit(:name, :desc)
end
```

### fields_for


```ruby


```

### 1対多で子要素もまとめて保存する

```ruby

# prodcut.rb
 def product_params
   params.require(:product).permit(:name, :desc, production_conditions_attributes:[:name])
 end

class Product < ApplicationRecord
  has_many :production_conditions
  has_many :somethings, as: :somethingable
  accepts_nested_attributes_for :production_conditions
```

### ポリモーフィック

- commentableでnewする必要ありみたい

※参考記事
https://ruby-rails.hatenadiary.com/entry/20141207/1417926599


### 参考記事

https://qiita.com/Masato338/items/045788fdeadd776449d5
LaTeXの卒論の表紙テンプレート ><


# はじめに

自分が所属する大学では，卒論がLaTeXでも良くWordでも良く
そもそも何枚でも良くみたいなフリースタイルレイドバトルです．

そのため，LaTeXのスタイルシートや概形が配られないので
自分で作る必要があります．

# 表紙テンプレート

先輩の卒論の表紙を真似して書いたテンプレートです.

```tex
\begin{titlepage}
	\begin{center}

		{\Large 令和1年}

		\vspace{10truept}
		
		{\Large 卒業論文}

		\vspace*{180truept}

		{\Huge This is a title.} 

		\vspace{160truept}

		{\Large 指導教員}

		\vspace{10truept}

		{\Large your teacher}

		\vspace{70truept}

		{\Large your college}

		\vspace{10truept}

		{\Large your course}

		\vspace{30truept}

		{\Large student\_number your name}		
		
	\end{center}
\end{titlepage}
```

以下の画像のような出力になります．


![スクリーンショット 2019-12-19 13.33.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211482/3d67cc06-cc83-ea95-dd39-966805286218.png)


# 参考サイト

- [卒論をTeXフォーマットなしから書くためのtips](https://yosshi71jp.hatenadiary.org/entry/20101210/1292005429)
Windowsユーザーの私がrbenvでrubyのインストール


##1.**前提**
 -Windowsユーザー
 -rubyを使いたい

>macと違い、windowsでは  PCにrbenvを直接インストールできない
>準備として、windows内にubuntuという環境を作る必要がある。

ここからの話は、windows内というよりは、windows内のubuntu内で起きることである。
(調べ方も当然、"ubuntu rbenv インストール"となる)
（注）rbenvだけだと、どうしてもmacのことばかり出てきてしまうので気をつける。

しかし、PC自体の容量は空けとかないと、ここからのインストールの容量が足りないから、Windowsが無関係ってわけではない
（Windows内のubuntuが様々なものをインストールし、大きくなっていくから、ubuntuをかかえるWindowsの容量がないと、かかえきれない）

##2.**実際にインストール開始**

###2-1.rbenv をインストール（clone）する

~~~ruby
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
~~~


###2-2.環境設定 PATHに追加する

~~~ruby
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
~~~


###2-3.rbenvがあるかのように、場所をさぐってみる

~~~ruby
~/.rbenv/bin/rbenv init
~~~

そうすると、rbenvのインストールコマンドを提案してくれる



```sudo apt install rbenv
```
↑これで、rbenvはインストールできますよというメッセージ


そこから言われた通り、
###2-4.rbenvのインストールコマンド

~~~ruby
sudo apt install rbenv
~~~

でインストール

その後、
メッセージででてきた手段でrubyインストール
↓

###2-5.rubyインストール

~~~ruby
rbenv install 2.5.3
~~~

rubyの構築が完了した

##3.***エラー対処***

途中でエラーすることがある
その際は、
###3-1.容量の確認

~~~ruby
df -h
~~~


ちなみに自分はPC本体の容量がいっぱいいっぱいだった(3-1の実行結果)

~~~ruby
:$ df -h
Filesystem Size Used Avail Use% Mounted on
rootfs 235G 235G 18M 100% /
none 235G 235G 18M 100% /dev
none 235G 235G 18M 100% /run
none 235G 235G 18M 100% /run/lock
none 235G 235G 18M 100% /run/shm
none 235G 235G 18M 100% /run/user
C: 235G 235G 18M 100% /mnt/c
~~~

（このパターンは稀で、容量不足としては仮想環境に割り当てられるディスク容量が足りないことが多いんだとか）


##4.***インストールできたか確認***
バージョンを聞くコマンド


``--version``を利用

###4-1.rbenvのインストール確認

~~~ruby
$ rbenv --version
~~~

と入力し、
```rbenv 1.0.0```　などのバージョンが出てくればよい。

###4-2.rubyのインストール確認

~~~ruby
$ ruby --version
~~~

と入力し、
```ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]```などのバージョンが表示されればよい。

##(参考にさせていただいたサイト)
https://mhaya18.hatenablog.com/entry/2018/09/01/090051
intra-martのFormaDesignerでのセレクトボックスの表示文字列を取得する

#はじめに
intra-martの開発に関するメモとして記載しています。
本ページに記載している実現方法は、イントラマート社公式のものではありません。

#やりたいこと
FormaDesignerで配置したセレクトボックスにて、選択された値ではなく表示文字列を取得したい。

#取得方法
FormaDesignerで配置されるセレクトボックスはIDとNAMEが設定されますが、
IDは画面が表示されるたびに動的に生成されます。
そのため、セレクトボックスのオブジェクトを取得するためにはNAMEを利用します。
NAMEにはセレクトボックスのフィールド識別IDが使用されます。

`var _select = document.getElementsByName("selectbox1")[0];`

オブジェクトがとれれば、あとは選択値からテキストを取得するだけです。

`var _text = _select.options[_select.selectedIndex].text;`

これで、セレクトボックスの選択文字列を取得することができます。

#セレクトボックスを変更した際に文字列取得を行う場合
アクション設定にて、セレクトボックスの入力時にカスタムスクリプトを実施する場合、
自身のフィールド識別IDは
`this.inputId`
にて取得することも可能です。

この場合、自身のオブジェクトを取得するのは
`var _select = document.getElementsByName(this.inputId)[0];`
のように書くこともでき、コードを汎用化することも可能です。
文系大学生がMini Hardeningに参加してみた

#はじめに
現在、東北の大学2年生でリモートでITのスタートアップでアルバイトをしている文系エンジニアの佐藤です。詳しい自己紹介はこちらを参照ください。
（https://qiita.com/RyuseiSato/items/9253a9c4ad735dc5f3cb )

#Mini Hardening
今回私はOWASP主催Mini Hardeningに参加してきました！
（https://minihardening.connpass.com/event/152553/ ）

今回はリモート含めて5つの競技会場があり、私はOWASP FUKUSHIMAが主催する会津会場から参加しました。


Mini Hardeningとは？
>WASForumは、2011年に発足したHardening Projectにより、2012年よりセキュリティ堅牢化の競技会を開催しています。このイベントは、最高の「衛る」技術を持つトップエンジニアを発掘・顕彰するものであり、技術競技(コンペティション)と、全チームの展開したセキュリティ施策の発表会の形式としています。

丸一日かけて行われるHardeningと違い、Mini Hardeningは3時間程度（今回は特別に5時間）かけて行われます。短い競技時間でもそこはHardening。運営側から提供された環境で、実際に脆弱性を突かれる攻撃がガンガンくるので、自分ごととして学ぶことができます。システムの開発や運用において、攻撃を受ける前提で様々なシステムを予め堅牢化をしておくことはとても重要だということを学びました。


#OWASPとは

>The Open Web Application Security Projectは、ウェブアプリケーションセキュリティをとりまく課題を解決することを目的とする、国際的なオープンなコミュニティです。

最も重大なウェブアプリケーションリスクOWASP top10などが有名です。


#参加した経緯

そもそも私は2019年の1月からプログラミングを始めて、セキュリティに関しての知識もほとんどありませんでした。しかし、Hardeningの報告会の話を聞いたところ、めちゃくちゃおもしろそう！ふだん目の前で見ることがない攻撃を見れるという話を聞き、自分も参加したい！と、勢いで参加しました。
実際参加してみると...いかんせん何もできません.....いやほんと能力皆無です....

#競技内容

>ウェーイ系社長がいきなり「これからは仮想通貨だ」だと宣言し、勝手に仮想通貨交換システムを自分で構築してしまった。そしてシステム運用を任されることになります。
競技時間中は、与えられたシステムが安定稼働できるようにし続ける必要があります。

#やったこと
自分が行ったことのリストです。

・Tera Termにsshで接続
・データベースパスワードのリセット要請や運営への報告担当
・ウェブサイトが改ざんされていないか、ほぼずっとリロードして確認

これしかできなかったです。技術が足りてなく自分でやれることが少ないので必死にやりました。

チームでは、gitで改ざんをチェックする仕組みを作っていたので、ある程度チェックはできていたのですが、どう改ざんされたのか、サイトの表示はどうなっているのかまでは追えていなかったので、逐一目視で監視していた自分もお役に立てたと思います。


#チームメンバー
ここでチームIのメンバーをご紹介いたします。

株式会社Eyes, JAPANの真水さん、株式会社セキュアスカイテクノロジーの羽鶴さん、鈴木さん、そして私の4名でした。

（羽鶴さんのレポート：https://techblog.securesky-tech.com/entry/2019/12/17/?fbclid=IwAR0F45VvjIEWdbR0LWQaVkBtdFV-AxRjVmLROfOBdgO1xay94WfeEgjV_q4 ）

（真水さんのスライド：https://www.slideshare.net/EyesJapan/mini-hardening-project-35-owasp-fukushima-206660083 )

同じ会場のJチーム：
![79190725_451908235726788_7143338457941671936_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525798/e3581604-02b7-d4af-fe72-74ef86d99d7f.jpeg)


#結果
今回私達のIチームは全14チーム中2位でした。本当にチームの皆さんありがとうございます。

自分の反省点
連絡担当だったので、もっと報告を細かに連絡すればよかったと感じました。同じ会場のJチームはコミュニケーション力でダントツの1位でしたを取っていたので学ぶものがありました。

特にデータベースが落ちて3時間後に報告をしたのでのは大きな反省点です。

あとはサイトに張り付いて監視していただけで、ソースコードまでは確認していませんでした。競技後半からでも気付いたらもっと巡回を強化できたのではないかと思います。

競技後半は、4つのサイトのうち３つのサイトがアクセスできないにも関わらずスコアが上がって1位をキープしていましたが、最後に別チームが大幅にスコアを伸ばして負けました。


今回、自分は何もできない状態からでしたが、真剣に競技をするメンバーを見て自分もこんなエンジニアになってみたいという想いが強くなる1日でした。

#最後に
今回初めてHardeningに参加して、ゲーム感覚で参加でき、目の前でデータベースが落ちたり、実際の攻撃を見ることはなかなかないので、とても良い経験になりました。

セキュリティに興味があるけど、ちょっと難しそうだな、とか、個人のサイトに攻撃なんて来ないでしょ、うちのシステムは大丈夫という方にも是非参加してもらいたいです。

セキュリティエンジニアだけではなく、プログラマー、そして経営者など非ITの方にもぜひ参加してもらいたいと思いました。初心者の私でも楽しんで参加でき、とても勉強になりました。


今後もHardeningに出るためのセキュリティをもっと勉強する必要を感じました。自分は現在、フロントエンドを勉強しているので徳丸本も読んで勉強する予定です。


![79340618_2156627011305903_6146006322635603968_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525798/82b18488-8452-7cc0-8a53-01c9ed1bd449.jpeg)
AWS CLIでAmazon Forecastの全リソース削除

備忘録的な投稿。順番に消していかないと削除できないのでCLIでやることにした。


## Forecastを削除

```bash

for i in `aws forecast list-forecasts --max-items 100 --profile hoge | jq -r '.Forecasts[].ForecastArn'`
  do aws forecast delete-forecast --forecast-arn ${i} --profile hoge
done
```

`jq -r`じゃないとダブルクォートを認識してしまって上手く行かないので注意。

## Predictorを削除

```bash

for i in `aws forecast list-predictors --max-items 100 --profile hoge | jq -r '.Predictors[].PredictorArn'`
  do aws forecast delete-predictor --predictor-arn ${i} --profile hoge
done
```

## DatasetImportJobを削除

```bash

for i in `aws forecast list-dataset-import-jobs --max-items 100 --profile hoge | jq -r '.DatasetImportJobs[].DatasetImportJobArn'`
  do aws forecast delete-dataset-import-job --dataset-import-job-arn $i --profile hoge
done
```

## Datasetを削除

```bash

for i in `aws forecast list-datasets --max-items 100 --profile hoge | jq -r '.Datasets[].DatasetArn'`
  do aws forecast delete-dataset --dataset-arn $i --profile hoge
done
```

## DatasetGroupを削除

```bash

for i in `aws forecast list-dataset-groups --max-items 100 --profile hoge | jq -r '.DatasetGroups[].DatasetGroupArn'`
  do aws forecast delete-dataset-group --dataset-group-arn $i --profile hoge
done
```

これで全部消せたはず。なお、サクッとコンソール上で消せるのでS3に上げたデータは手で削除した。
[参考ページ](https://docs.aws.amazon.com/cli/latest/reference/forecast/index.html)
php7.4からついにクラスのメンバ変数に型宣言できるようになった

php7.4からクラスのプロパティは、新たに型宣言をサポートするようになりました。

遂に！って感じですね。
php7系、特に7.3など使用しているとアップデートするか悩ましいですね。
パフォーマンスの改善も結構されているみたいですし。

```php
<?php
class User {
    public int $id;
    public string $name;
}
?>
```

上の例では、 
``$user->id``にはintの値だけを、``$user->name``にはstringの値だけを代入できるように強制します。

[PHP 7.3.x から PHP 7.4.x への移行](https://www.php.net/manual/ja/migration74.new-features.php)
C#の初心者が、LINQの便利な機能をまとめてみた

## はじめに
C#を始めてから、2,3ヵ月くらい経ちました。
C#を少し使えるようになったので、LINQという機能についてまとめてみようと思います。
すこし違う話が入ってるかもしれないので、ご了承ください。

## まず、LINQとは
LINQとは、コレクション(配列など)の要素を処理するメソッドを集めたライブラリです。
使用するためには、`using System.Linq`を最初に書く必要があります。 


## 便利な関数(メソッド)
* Allメソッド
配列内の要素すべてが、条件を満たすかを判定してくれます。
本来なら、whileやforeachの中にif文を書いて、処理しなければならないことをAllメソッド一つでできるので便利です。


* Anyメソッド
Allメソッドと使い方は同じ感じです。
Anyは、一つでも条件に合致するものがあれば、trueを返します。

* Max,Minメソッド
Maxは配列内の最大値、Minは配列内の最小値を求めてくれます。
これらの計算は、LINQを使わずに書くと少し長めになりますがLINQのメソッドを使えば、1行で済みます！

* Distinctメソッド
配列内の重複要素を除いた配列を返してくれます。
LINQを使わずに書くと、if文とforeachなどを使って、配列をもう一つ生成しないといけないので少し面倒です。このメソッドを使えば1行で済む！！

* Sum,Averageメソッド
Sumは配列の要素の合計、Averageは配列内の要素の平均を求めてくれます。
実際に書いて比較してみました。

使用してないVer

```.cs
 class Program
    {
        static void Main(string[] args)
        {
            List<int> val = new List<int> { 1, 2, 3, 4, 5 } ;
            int sum = 0;
            foreach(var i in val)
            {
                sum += i;
            }
            Console.WriteLine(sum);
        }
    }
```

使用したVer

``` .cs
class Program
    {
        static void Main(string[] args)
        {
            List<int> val = new List<int> { 1, 2, 3, 4, 5 } ;
            var sum = val.Sum();
            Console.WriteLine(sum);
        }
    }
```
LINQのメソッドを使ったほうがすっきりしてみえますよね！

## LINQの利点
自分で書くと長くなる処理を関数でやってくれるから、プログラムの読みやすさも上がるし、自分で書かなきゃいけない処理が減るので便利。

## 最後に
みなさんもC#でぜひLINQ使ってみて下さい！
配列の処理が断然見やすくなります！！

## 参考
[おすすめサイト](https://programming.pc-note.net/csharp/linq_method.html#all)
Amazon SageMaker Studio が起動できなかった時の対処法

# はじめに
Amazon SageMaker Studio が AWS re:Invent 2019 でプレビューリリースとなりました。
さあ、早速検証！と思いましたが、SageMaker Studio が開けないエラーが発生しました。
再起動を試そうにも、SageMaker Studio　の削除方法がわからず...

実は、現時点(2019/12/18時点)では、コンソール上からSageMaker Studio の作成し直し等はできません。
そのため AWS CLI を利用して、SageMaker Studio を削除する必要があります。
domain の削除にもいくつか手順があったので、今回はその方法をご紹介いたします。

# SageMaker Studio の削除方法
私の場合は以下の画面から動けなくなり、Restart Now を押しても、起動ができない状況でした。

<img width="960" alt="2019-12-17_15h40_54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/4c25e633-6113-23c7-6386-0068d5834ac1.png">


## SageMaker Studio のドメインに関連するアプリケーションが存在するか確認し削除
関連するアプリケーションが存在することで、ドメインが削除できない場合があります。
以下のコードでアプリケーションの有無を確認します。

```
aws sagemaker list-apps --region us-east-2
```

もし、関連するアプリケーションがあった場合は、以下のコードでアプリケーションを削除します。

```
aws sagemaker delete-app --domain-id <domain-id> --user-profile-name <user-profile-name> --app-type <app-type> --app-name <app-name> --region us-east-2
```

## SageMaker Studio のドメインに関連するユーザープロファイルが存在するか確認し削除
関連するユーザープロファイルが存在すると、ドメインが削除できません。
以下のコードで ユーザープロファイルの有無を確認します。
※ユーザープロファイルは、コンソールからも確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/668a94fa-1eed-512b-8905-12ccb64ebd8a.png)

```
aws sagemaker list-user-profiles --region us-east-2
```
関連するユーザープロファイルがある場合には、以下のコマンドで削除します。

```
aws sagemaker delete-user-profile --domain-id <domain-id> --user-profile-name <user-profile-name> --region us-east-2
```
## SageMaker Studioの削除
これでようやく、Sagemaker Studio 削除ができます。
以下のコマンドを実行し、SageMaker Studio を削除します。

```
aws sagemaker delete-domain --domain-id <domain-id> --region us-east-2
```

# 最後に
これで、SageMaker Studio を削除することができました。
SageMaker Studio をまた利用したい場合は新たに SageMaker Studio を立ち上げてください。
VMWare / ESXiで仮想マシン(VM)を立てた際にできる.vmXXまとめ


# 目的
ESXiでバックアップする際にどのファイルが必要か知るためにvmXXファイルの内容をまとめる

| 拡張子　　　 | 説明 |
|:-----------|------------|
| .vmdk | vmdkとは仮想ディスクのこと
| .vmx | vmxはメインの構成ファイルのこと
| .vmxf | vmxfとは追加の構成ファイルのこと。仮想マシンがチームに属する場合に使用される。
| .vmss | vmssとは仮想マシンをサスペンドした場合の状態保存用のファイルの |
| .nvram | nvramとはBIOSの状態を記憶するファイル |
| .vmsd | スナップショットの情報とメタデータを保存する集中ファイルです |

参考にさせていただきました。
http://tooljp.com/windows/chigai/html/VMware/VMDK-VMX-VMXF-VMSS-VMEM-NVRAM-chigai.html
https://torazuka.hatenablog.com/entry/20090622/1245597766
IT企業のイメージキャラクタ―

#はじめに
　他業界からIT企業に入社したためどのようなIT企業があるのか調べてみました。
調べてみると多くの企業がイメージキャラクターを作成していたため
キャラクターを中心にまとめてみました。
	
##◆webサイトのキャラクター

###フォクすけ
![フォクすけ](http://www.foxkeh.com/downloads/assets/front.png)
(C) 2006 Mozilla Japan

Firefoxのキャラクターです。
Firefoxは英語でレッサーパンダ(red pandaの別名)を意味しますが
ロゴに狐を使用していることから、
同じく狐のモチーフとなっています。
[Firefox](http://foxkeh.jp/)

###Qiitan
![Qiitan](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/c88a300c-31a1-0589-f270-d7d26205a9e6.png)
Qiitaのキャラクターです。
Qiitaのsupportページなどに使用されているようです。
[Qiita](https://qiita.com/)

##◆開発言語のキャラクター
###Duke
![Duke](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/8e30d72f-811d-5d5e-0f82-fe9f99bc0b96.png)
Oracle社のJavaの公式マスコットキャラクターです。
Javaとはほとんどのコンピュータで使用できるプログラム言語です。
主に業務システム開発、Androidアプリ開発に用いられています。

[Java](https://java.com/ja/)

###elePHoant
![elePHoant](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/e8a39224-092f-9e9c-20a3-fd049929a7c0.png)

phpのキャラクターです。
phpとはweb開発に適した汎用スクリプト言語です。
成り立ちとして、phpという文字を崩して表記した時に横から見たところが像にみえたところからきているようです。

[php](https://www.php.net/)

##◆OSのキャラクター
###ドロイドくん
![ドロイドくん](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/8e5f3d4e-cdb7-1734-fd12-d9e66b8a948b.png)

おなじみのドロイド君ですが
Android OSの最新版Android 10がリリースされたため、ドロイド君も上記のイメージに変更されました。
更新される前のAndroid 9まではお菓子のイメージが採用され、カップケーキやエクレアなどとコラボしたドロイド君が使用されていました。
さらなるグローバル化を目指し今後は有名なお菓子という考えから、直感的な形になったようです。
また、ドロイド君という名前ですがこちらも愛称で正式な名称はついていないようです。
###タックス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/04264439-c8ad-8f1b-7af7-3fcdb41d9667.png)

Linuxオペレーティングシステムのキャラクターです。

Linuxとは無料で使用できるOS環境です。
由来としてペンギンがタキシード(tuxedo)を着ているように見える から名前になっている説が有力です。
下記はLinuxを提供しているUbuntuのリンクです。
[Ubuntu](https://www.ubuntulinux.jp/japanese)


###Geeko
![Geeko](https://upload.wikimedia.org/wikipedia/commons/d/d0/OpenSUSE_Logo.svg)

OpenSUSEのキャラクターです。
OpenSUSEとは無料で使用できるOS環境です。
Linuxとは異なる点として、自動で足りないものを補足してくれます。
加えて、日本語の文献が少なく検索が多少困難に思えました。

<img width="200" alt="Geeko" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/6e738c24-84e5-db87-38a5-6f51dac0438a.png">
壁紙版として擬人化画像も掲示されていました。
下記のブログから取得ができます。

[Geeko Blog](https://www.geeko.jp/)
[openSUSE](https://www.opensuse.org/)


##◆最後に

###えにぃとプラ子
![えにぃとプラ子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/748ae4fc-82e8-1f07-be48-6e077cd85cf2.png)

弊社Any-plusにもキャラクターがいます。

弊社の社員が作成したキャラクターです。
えにぃは何でも知っている頭脳明細な生き物を、
プラ子は明るく元気な女の子をイメージしています。
これから活躍していきますので見守ってください。
[Any-plus](https://any-plus.co.jp/special/)
【JAVA】interfaceとabstractの違いって？？？

#ざっくり違いを解説
######interface ・・・クラスじゃない（重要）

######abstract  ・・・クラス等の修飾子

##interfaceについて
######①変数
変数の宣言および実装ができる。
ただし、暗黙的に「public static final」が付く。

```java
interface noTsukaikata {
	int Num = 6; //finalが付くので初期化できない。→実質的に定数扱いになる。
}
```

######②メソッド
抽象化メソッドのみ宣言できる。

```java
interface noTsukaikata {
	void method(); //抽象化メソッドの宣言（interface内のメソッドはabstract句が付与される）
	// abstract void method();に自動変換される。
}
```

実は、default句かstatic句を使うことで実装もできる。

```java
interface deJisou{
	//default句を使うことで、interface内にメソッドを実装
	default void method1(){
		//more codes here
	}

	//static句を使うことで、interface内にメソッドを実装
	static void method2(){
		//more codes here
	}

	//default句かstatic句がないとコンパイルエラー
	void method3() {
		//more codes here
	}
}
```

######③継承方法
interfaceはimplementsのみ継承可能です。
※interfaceで未実装のメソッドは全てオーバーライドしなければならない。

```java
interface Super{
	int Num;
	default void method1(){
		//more codes here.
	}
	static void method2(){
		//more codes here.
	}
	void method3();
}

class Sub implements Super{
	//変数はfinalなので書く必要ない。

	//defaultメソッドは実装済みのため、Subクラスで実装しなくてよい。必要に応じてオーバーライド可能。

	//staticメソッドは継承対象外のため、Subクラスに実装できない。

	//method3を実装
	@Override 
	protected void method3(){//公開範囲(スコープ)が狭くならない限り、アクセス修飾子を変化させてもよい。
		//more codes here.
	}
}
```

上の継承によるSubクラスの中身は、以下の通り。

```java

class Sub implements Super{
	int Num = 6;
	default void method1(){
		//more codes here.
	}
	//staticメソッドは継承対象外のためいない。
	protected void method3(){
		//more codes here.
	}
}
```

##abstractについて
######①変数
通常クラスと全く同じ扱い方。

```java
abstract class Super {
	int Num1;      //宣言できる
	int Num2 = 6;  //初期化できる
	abstract int Num3 = 10;  //コンパイルエラー（変数を抽象化できない）
}
```

######②メソッド
抽象化メソッドも宣言できる。

```java
interface Super {
	abstract void method1(); //抽象メソッドを宣言できる。
	void method2() {}        //abstract句が無ければ実装もできる。
}
```

######③継承方法
abstractはextendsのみ継承可能です。
※abstractメソッドは全てオーバーライドしなければならない。

```java
abstract class Super {
	int Num1;
	int Num2 = 6;
	abstract void method1();
	void method2() {}
}

class Sub extends Super{
	@Override 
	void method1() {}
}
```

上の継承によるSubクラスの中身は、以下の通り。

```java

class Sub extends Super{
	int Num1;
	int Num2 = 6;
	void method1() {}
	void method2() {}
}
```
##結局何が違ったのか？？？
|        | interface |abstract |
|:-----------------|:------------------|:------------------|
|変数|自動的に「public static final」|通常クラスと全く同じ|-|
|メソッド|基本的に抽象メソッドのみ宣言できる。ただし、「default」や「static」句を利用し、実装できる。|抽象メソッドも宣言できる。|
|継承方法|implementsにより継承。サブクラスでは抽象メソッドをすべて実装する。|extendsにより継承。サブクラスでは抽象メソッドをすべて実装する。|

##補足
###implementsとextendsの違いは？？？
implements・・・interfaceを継承する。
extends・・・クラスを継承する。

結論、
######interface ・・・クラスじゃない
######abstract  ・・・クラス等の修飾子
疑似要素を使ったチェックボックスとラジオボタン

フォーム作成で若干苦労したのでメモ。

- 疑似要素を使用してスタイル当て
- タブキーで選択可能
- スペースキーで選択可能

なチェックボックス＆ラジオボタン。

ポイントとしては

- inputは`opacity:0;`にする(`display: none;`とかだとタブキー選択できない)
- inputを`display: block;`にする(デフォルトは`inline`なんだけど、それだと3pxくらいinputが幅を取ってしまってデザインがずれてしまう)

あたり。

####サンプル
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="css,result" data-user="Torixai" data-slug-hash="BaypboM" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Styled Checkbox &amp;amp; Radiobutton Sample">
  <span>See the Pen <a href="https://codepen.io/Torixai/pen/BaypboM">
  Styled Checkbox &amp; Radiobutton Sample</a> by urchin2x (<a href="https://codepen.io/Torixai">@Torixai</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
全国のソフトウェアセンターは今

（平元・六・二八）地域ソフトウェア供給力開発事業推進臨時措置法
http://www.shugiin.go.jp/internet/itdb_housei.nsf/html/houritsu/11419890628060.htm

90年代のソフトウェア人材　伊東暁人
https://shizuoka.repo.nii.ac.jp/?action=repository_action_common_download&item_id=674&item_no=1&attribute_id=31&file_no=1

20都道府県地域ソフトウェアセンター　＋　8類似機関（新事業支援機関）


独立行政法人情報処理推進機構が出資している地域ソフトウェアセンターに対する事業運営及び経営の改善のための指導、支援等を適切に行うなどするよう意見を表示したもの
http://report.jbaudit.go.jp/org/h24/2012-h24-0736-0.htm

全国のソフトウェアセンターは今どうなっているか。


# 活動しているところ


地域ソフトウェアセンター
https://www.ipa.go.jp/jinzai/risa/apply/center.html

株式会社北海道ソフトウェア技術開発機構
https://www.deos.co.jp

セミナ講師でお伺いしたことあります。１日　講師料25000円(当方規定)＋交通費・宿泊費 30000円

株式会社ソフトアカデミーあおもり
https://www.soft-academy.co.jp

株式会社岩手ソフトウェアセンター
http://www.isop.ne.jp/isc/

株式会社システムソリューションセンターとちぎ
https://www.ssct.co.jp

株式会社石川県IT総合人材育成センター
https://www.ishikawa-sc.co.jp

株式会社浜名湖国際頭脳センター
https://www.hamanako.jp/

株式会社福岡ソフトウェアセンター
http://www.fsc-go.co.jp/

熊本ソフトウェア株式会社
https://www.kmt-ics.co.jp

株式会社宮崎県ソフトウェアセンター
http://www.miyazaki-nw.or.jp/msc/

#WEBで解散を記録しているところ。


株式会社広島ソフトウェアセンター
http://www.h-sc.co.jp
> 2013.4.1 平成25年3月31日をもちまして、会社は解散をし、清算株式会社に移行いたしました。 |
 長らくご愛顧頂きましてありがとうございました。 |


###　他者のWEBに痕跡が残っているところ

https://www.itlab51.com/?p=10325
>山口県ソフトウェアセンター
弊社は、平成２７年６月３０日をもちまして、会社は解散をし、清算株式会社に移行いたし ました。 皆様の長年にわたるご厚情に心から感謝申し上げます。 株式会社 山口県 ソフトウェアセンター 〒743-0023 山口県光市光ケ丘３番１号（ひかりソフトパーク内）.
www.yamaguchi-sc.co.jp


#関連団体のWEBにリンク切れが残ったまま


### 株式会社いばらきIT人材開発センター
株式会社いばらきIT人材開発センター
https://www.facebook.com/ibarakiit

facebook pageにあるリンクが切れてる。


### 株式会社仙台ソフトウェアセンター

宮城県情報サービス産業協会
http://www.misadb.jp/detail/index/id/18/

###   株式会社 名古屋ソフトウェアセンター

AiA加入年月：1990年09月06日　　最終更新日：2019年01月28日
株式会社 名古屋ソフトウェアセンター
http://www.nagoya-sc.co.jp/

株式会社 名古屋ソフトウェアセンター　on あいち産業振興機構
https://www.aibsc.jp/joho/sesaku17/bu_syousai/0401_010206.shtml

# 新事業支援機関
ソフトピアジャパン
https://www.softopia.or.jp

あきた産業振興機構　ー＞　あきた企業活性化センター　
http://www.bic-akita.or.jp/

福島県産業振興センター
https://www.utsukushima.net



# 非設置都府県

福井、島根などの非設置県で、新進の企業ができていることは特筆すべきことかもしれない。

## 独立系
株式会社沖縄ソフトウェアセンター
https://www.osc-corp.co.jp/company/

経済産業省の出資を受けていない
AWSアカウント内で特定CIDRが含まれているセキュリティグループを検索するCLIコマンド

# これは何

- 表題の通りです。


# AWS CLIコマンド

https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html

以下のコマンド。ドキュメントに記載のある通り、 `Values=xxx.xxx.xxx.xxx/yy`には対象のCIDRを指定する。`Values=xxx.xxx.xxx.xxx/yy,xxx.xxx.xxx.xxx/yy`のように複数指定可能。

```sh
$ aws ec2 describe-security-groups \
    --filter "Name=ip-permission.cidr,Values=xxx.xxx.xxx.xxx/yy" \
    --query "SecurityGroups[*].[GroupName]" --output text
```

オプションの `--filter` や `--query`、 `--output` については以下を参照。

https://dev.classmethod.jp/cloud/aws/aws-cli-filter-and-query-howto/
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-output.html

`--query` の記法はJMESPath。以下を参照。

http://jmespath.org/

## 何をやっているのか

### 取得範囲のフィルタリング

`--filter` オプションで「特定CIDRが含まれているセキュリティグループ」する

### グループ名の一覧を取得

`--filter` だけだと出力にセキュリティグループの各種属性が含まれたままになる。必要なのはセキュリティグループの名前だけなので、`--query` オプションで GroupName キーの値のみを抽出する。

### 出力形式の指定

`--output text` と指定すれば、プレーンテキストとしてデータが出力される。
マンガでわかる Observer

![A53B8C5E-F272-4295-A499-876E6D9C3E4A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/478a13ed-26ab-763e-b2ac-b6a21df5784e.png)

ブラウザは個々の開発者のスクリプトなんて知ったこっちゃないんですよ。ありのままボタンクリックシグナルを発するだけ。アプリケーションがそれを観測して動き始める。それが Observer パターンですよ。

通常は、詳しいことは知らないけどより UI に近い側のコードが、アプリケーションのさらに深い処理の詳細実装を呼び出しますよね。ところが、UI の最末端であるブラウザのボタンコンポーネントは、それぞれのサービスのアプリケーションコードよりはるか前に実装され、完成しています。W3C の求めるとおりに作られたブラウザの UI 部品は、各種の SNS や EC サイトの機能なんて知るよしもありません。

HTML 上のボタンは、ただただ、クリックされましたよというシグナルを発するだけ。後から来たアプリケーション側が、そのシグナルを観測し、アプリケーション機能をトリガーする。というような、イベント発生とそのリスニングで DIP を実現するのが Observer (観測者) パターンです。

くるみクンは何もコールせず、たんに、わからないことを不思議だなぁとつぶやくだけ。もしそれを誰も観測していなければ、何も起きず、わからない部分をそういうもんなんだと流して、理解せずに進んじゃいます。

でも、めもりーちゃんチームはすごく後輩思い(説明したがり)なので、彼女の発した違和感をキャッチし、どのようにして、先に実装がフリーズしているイベント発生元が、後に実装されたビジネスロジックを起動できるのかを教えてくれます。学びある職場ですね。すばらしい。

実装としては、主オブジェクト自身、またはそのオブジェクトが持っているイベントマネージャーに、イベントリスナーインターフェースを実装したインスタンスを Observer (観測者) として登録しておき、イベントが起きればその観測者のメソッドに委譲するという仕組みです。つまり、動的に差し替えられる DIP です。

Observer パターンは、ブラウザとユーザー JavaScript のような極端な場合だけで使うものというわけではありません。先に安定した主機能に対して、カスタマイズとして後から処理を挟み込みたい場合などに、とても有用です。

画面がなくても、たとえば何かのフレームワークで、当初想定された処理しかしない部分に、追加でログを残したり、汚いユーザー入力を正規化したり、あるいは、割り込みの結果によっては続く処理を中断したりなど、用途はとても多岐に渡りますす。

Observer はコードの安定度に偏りがあるとき、ごくごく普通にあらわれるパターンです。身の回りのコードや顧客ニーズをよく観察してみると、このパターンの方が都合良かったかも、と発見できるかもしれません。

ぜひみなさんのプロダクションコードでも、Observer による疎結合化で DIP したらうまく行きそうな場所を探してみてください。
【Git】ブランチ切り替えできない時。ブランチの派生元確認方法と削除方法。

#概要

git branchの超基本的な理解とgit checkoutができない場合のエラー解決法について書いています。

#エラー内容

```terminal
$ git checkout [移動先のブランチ名]
```
でgit branchを移動しようとした際にエラーが発生。




```terminal
error: Your local changes to the following files would be overwritten by checkout:
    ファイル名
Please, commit your changes or stash them before you can switch branches.
error: The following untracked working tree files would be overwritten by checkout:
    ファイル名
Please move or remove them before you can switch branches.
Aborting
```

ワーキングツリーに知らないファイルがあるので、コミットかスタッシュしてからブランチ移動しろとのこと。

##原因確認

エラー発生時のgit branchの状況は以下。

```terminal
  master
  step4
* step5
```

step4で実装した機能をプルリクしている状況の中で
step5のブランチを切って進めている時。

確認してみるとstep5にいる時のファイルがstep4の時のファイル内容と異なっている。
さらに、masterには移動ができる状態だったのでstep4→step5ではなく、master→step5とブランチを切ってしまっているなと気づきブランチの派生状況を確認するため以下で今のブランチの派生元ブランチを特定。

```terminal
$ git show-branch
```

```terminal
* [master] Merge pull request #3 from ktanizaw/step3
 ! [step4] add:管理画面アクセス制限、削除制限
  ! [step5] Merge pull request #3 from ktanizaw/step3
---
 +  [step4] add:管理画面アクセス制限、削除制限
 +  [step4^] add:ユーザー管理画面
 +  [step4~2] add:ログイン時のユーザー機能制御
 +  [step4~3] add:ユーザー作成タスク詳細画面
 +  [step4~4] add:管理者画面、ユーザー一覧、削除、編集、作成
 +  [step4~5] add:ログイン・ログアウト機能
 +  [step4~6] add:ログイン・ログアウト機能
 +  [step4~7] add:seedデータ、アソシエーション
--- [master] Merge pull request #3 from ktanizaw/step3
```

`*`が現在のブランチ。
`!`がその他のブランチ。

ブランチの右には最新コミットが表示されている。
masterとstep5の最新コミットが同じということで、
やはりmasterからstep5のブランチを作成していた。

`---`以下についている`+`はコミット内容で、インデントが揃っているブランチに対してのコミット。
今回はstep4にのみコミットしていたので全てstep4のインデントと同じになっている。



##解決方法

step5の内容をstep4と同じにしてからコード追加をしたいだけだったため、
間違えて作成したstep5のブランチを削除することに。
移動ができない原因の不要なファイルを削除して、masterに移動してstep5を削除していきます。

```terminal
$ git status
```
<br>

でファイルの状況を確認し、赤文字の中にある
`Changes not staged for commit:`のファイルは以下で削除。


```terminal
$ git checkout file_name #特定のファイル
$ git checkout . #すべて
```
<br>

`Untracked files:`のファイルは以下で削除。

```terminal
$ git clean -f
```

```
$ git branch -d [ブランチ名]
```


これでスッキリして、新しく正しい位置からブランチを作成できました。

##参考

https://qiita.com/konweb/items/061475d6376db957b3c4
https://qiita.com/hogeta_/items/33d2334c9b1919bd5120
vscode-eslint v2

Microsoft が自ら提供している Visual Studio Code の ESLint 拡張 ([vscode-eslint]) がメジャー バージョンアップして、その設定方法が大幅に変わったのでまとめてみます。

## ESLint の自動修正を保存時に自動的に適用するための設定

v1 で提供されていた `eslint.autoFixOnSave` 設定は廃止され、代わりに `editor.codeActionsOnSave` または `editor.formatOnSave` を利用します。言い換えると、[vscode-eslint] 独自の方法で保存時の処理を実施していたのが、Visual Studio Code の標準的な方法で実施するように変更されたわけですね。2 つありますが、`editor.codeActionsOnSave` のほうが推奨されています。

### `editor.codeActionsOnSave`

コードアクション (拡張機能がコードへの指摘をユーザーに示すための機構) を保存時に実行する設定です。Visual Studio Code では ESLint の自動修正はすべてコードアクションとして扱われていて、ポップアップ UI から 1 個ずつ適用できます。これを保存時に全部適用しようというものです。

```js:settings.json
{
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  }
}
```

~~`@typescript-eslint/eslint-plugin` など、解析に時間がかかるプラグインを利用している場合は `editor.codeActionsOnSaveTimeout` を長めに設定してあげる必要があります。デフォルトでは 750ms になっていて、ESLint の処理がこの時間以内に終わらなければ自動修正は行われません。~~ [Visual Studio Code 1.42 (January 2020) にて `editor.codeActionsOnSaveTimeout` 設定は削除され、時間がかかっているときは右下に中止ボタン付きのポップアップが表示されるようになりました。](https://code.visualstudio.com/updates/v1_42#_handling-slow-save-operations)

### `editor.formatOnSave`

こちらは推奨される方法ではありませんが、念のために紹介します。
ESLint をフォーマッターとして利用し、「ドキュメントを整形する」アクションを保存時に実行する設定です。ESLint はフォーマッターではないのでむりやり感がありますね。

```json:settings.json
{
  "editor.formatOnSaveTimeout": 2000,
  "editor.formatOnSave": true,
  "[javascript]": {
    "editor.defaultFormatter": "dbaeumer.vscode-eslint"
  }
}
```

`@typescript-eslint/eslint-plugin` など、解析に時間がかかるプラグインを利用している場合は `editor.formatOnSaveTimeout` を長めに設定してあげる必要があります。デフォルトでは 750ms になっていて、ESLint の処理がこの時間以内に終わらなければ自動修正は行われません。

## JavaScript 以外のファイルで ESLint を利用する設定

v1 では、[vscode-eslint] は JavaScript ファイルだけをデフォルトで検証し、その他のファイルで ESLint を使いたいときは `eslint.validate` 設定を書く必要がありました。v2 では、`.eslintrc`ファイルに適切な設定があれば、TypeScript, Vue, HTML ファイルもデフォルトで検証します。

- TypeScript ... カスタム パーサーとして `@typescript-eslint/parser` が設定されている
- Vue ... プラグイン設定に `eslint-plugin-vue` が存在する
- HTML ... プラグイン設定に `eslint-plugin-html` が存在する

これらの設定が `overrides` セクションにあってもしっかり認識してくれるようです。

一方、上記以外のファイルで ESLint を使いたいときは引き続き `eslint.validate` 設定が必要です。

## モノリポ (mono repository) で ESLint を利用する設定

ESLint を実行するには、CWD (current working directory) の設定が重要です (`.eslintignore`は CWD にあるものしか認識しないので)。

ほとんどの場合、Visual Studio Code のワークスペースのディレクトリで良いのですが、モノリポでは各プロジェクトのディレクトリで ESLint を実行したい場合があります。そのようなケースでは`eslint.workingDirectories`設定を使います。

いくつかのパターンがあります。

```json:settings.json
{
  "eslint.workingDirectories": [{ "mode": "auto" }]
}
```

↑ ワークスペース内の`package.json`や`.eslintignore`等のファイルを手がかりに CWD となるディレクトリを自動的に決定します。

```json:settings.json
{
  "eslint.workingDirectories": [{ "pattern": "./packages/*/" }]
}
```

↑ Glob パターンで CWD となるディレクトリを指定します。指定したディレクトリ内のファイルをリントする時に使われます。

```json:settings.json
{
  "eslint.workingDirectories": ["./packages/alice", "./packages/bob"]
}
```

↑ CWD となるディレクトリの配列を指定します。指定したディレクトリ内のファイルをリントする時に使われます。

[vscode-eslint]: https://github.com/microsoft/vscode-eslint
IWS 9.5 をインストールする

IWS 9.5をインストールした時の記録。
RHEL 7.3 環境へインストール。

1. 前提RPMの確認。全て導入されていることを確認。

The following libraries are required on Linux:


    ld-linux.so.2
        --> yum install glibc
    libstdc++.so.6
        --> yum install compat-libstdc++-33.i686
        --> yum install compat-libstdc++-33.x86_64
    libgcc_s.so.1
     --> yum list installed | grep libgcc

2. DB2をインストール
./db2setup -r /work/db2server.rsp -l /tmp/db2setup.log -t /tmp/db2setup.trc 

3. ライセンスを適用
./db2licm -a /work/IWS95IMG/DB2/awse_o/db2/license/db2awse_o.lic

4. IWSDBを作成する
db2 -tvf /work/create_database.sql 

5. IWSDBを構成する
./configureDb.sh --rdbmstype DB2 --dbhostname agtsvr1 --dbport 50000 --dbname TWS --dbuser db2inst1 --dbpassword password --dbadminuser db2inst1 --dbadminuserpw password

6. DWCDBを作成する
db2 -tvf /work/dwc_create_database.sql 

7. DWCDBを構成する
/configureDb.sh --rdbmstype DB2 --dbhostname agtsvr1 --dbport 50000 --dbname DWC --dbuser db2inst1 --dbpassword password --dbadminuser db2inst1 --dbadminuserpw password

8. ここに倣ってIWS管理ユーザーを作成
Creating the IBM Workload Scheduler administrative user
https://www.ibm.com/support/knowledgecenter/SSGSPN_9.5.0/com.ibm.tivoli.itws.doc_9.5/distr/src_pi/awspicreatewauser.htm

9. WAS Libertyの導入ディレクトリーを作成
/opt/wa/wlpbase

10.権限を設定
chown waadmin.waadmgrp /opt/wa/wlpbase

11.JavaExtディレクトリーをインストールメディアからコピー
cp -Rp JavaExt /opt/wa

12.WAS Librty導入
java -jar /work/IWS95IMG/wlp-base-all-19.0.0.3.jar --acceptLicense /opt/wa/wlpbase

13.IWS 導入
./serverinst.sh --data_dir /opt/wa_data --propfile serverinst.properties

14.DWC 用Liberty導入
java -jar /work/IWS95IMG/wlp-base-all-19.0.0.3.jar --acceptLicense /opt/wlpdwc

15.DWC導入
export LANG=en_US.utf8
./dwcinst.sh --propfile dwcinst.properties

LANGを変えないとエラーになったので、LANGを変更しました。

以上でおしまい。
プロパティーファイルをしっかり設定していれば、コマンドだけで完結するので楽といえば楽です。
Slim の変換結果をちょこっと確認するスクリプト


# はじめに

この記事は @eggc さんの以下の記事に触発されて書いたもの。

[slim ちょっと試したいときには slimrb を使う - Qiita](https://qiita.com/eggc/items/85d231735ec9bba4298e)

要するに，テンプレートエンジン Slim で，「こう書いたらこうなる？」というのをコマンドラインでサクッと確かめるには，slim gem によって導入される slimrb というコマンドを使えばよい，ということ。

この方法は，とにかくシンプルで，二三度やってみれば覚えられるから，「ええと，どうやるんだっけ？」と悩む必要がない[^help]。

[^help]: コマンド名が思い出せなければ `gem spec slim` で slim gem の情報を表示し，`executables` のところを見れば `slimrb` と出ている。

ただ，これだとややこしい Slim コードを少しずつ修正しながら結果を確認するのが面倒くさい。
試行錯誤をもっと楽にしたい，というのが本記事の趣旨。


# スクリプトで変換する

slim のほか，[listen](https://rubygems.org/gems/listen) というディレクトリー監視の gem が必要なので

```shell
gem install slim listen
```

で入れておく。

そして以下のスクリプトを走らせる。


```rb
require "listen"
require "slim"

this_file = File.expand_path(__FILE__)

Slim::Engine.set_options pretty: true

Listen.to(__dir__) do |(m, *_),|
  next unless m == this_file
  IO.read(this_file) =~ /^__END__$/
  puts Slim::Template.new{$'}.render, "---"
end.start
sleep

__END__
- 3.times
  div わん
```

`__END__` の下に Slim コードが書かれている。

これだけでは何も起きないが，試しにこの Slim コードを変更してみよう。改行を足すだけでもいい。
変更して保存すると，変換した結果の HTML と区切り線 `---` がターミナルに表示される。
変更して保存するたびに表示される。

Slim コードは別ファイルにしてもいいのだが，全部を 1 ファイルにまとめてみた。

なお，Slim の変換のモードとして，

```rb
Slim::Engine.set_options pretty: true
```

のように，改行・インデントが入る形式を指定している。
改行・インデントを入れない形式にしたければ，この行をコメントアウトすればいい（こういう変更を行った場合はスクリプトを一度終了して再度動かすこと）。

# コードの解説

ファイルの変更を監視するため，listen を使う。

`Listen.to` は，引数に監視ディレクトリーのパスを与えておくと，そこでファイルの変更・追加・削除があった場合に，それらのファイルのパスをブロックパラメーターとしてブロックを評価してくれる。

ブロックパラメーターは順に，①変更ファイルのパスの配列，②追加ファイルのパスの配列，③削除ファイルのパスの配列。
なんで配列なのかというと，一定時間おきにチェックして，前回チェックとの差分を見るわけなので，一般には複数のファイルが変更・追加・削除されうるから。

監視を始めるには `Listen.to` の返り値に対し，`start` してやらなければならない。

ブロックパラメーターが `|(m, *_),|` と変な形をしているけど，これは第一ブロックパラメーター以外を捨てる，ということと，第一ブロックパラメーターについては，配列の先頭のみを `m` に当てて，残りを `_` で受けて捨てることを意味している。

そして，スクリプトファイル自身をテキストデータとして取得し，正規表現 `/^__END__$/` にマッチする箇所を探して，そこ以降のテキストを `$'` で取り出している。

Slim コードを HTML に変換するには，`Slim::Template.new` のブロックに Slim コードを与え，`render` すればいい。

なお，スクリプト末の `sleep` が無いと，スクリプトは一瞬で終わってしまう。