OmniAICreator/Qiita-1.07M huggingface dataset:
超簡単！　jQueryでスライダーを自作

超簡単！ jQueryでスライダーを自作
---
Webページにスライダーを導入すればコンテンツが多くなった時や、
スマホ対応のページを作るときに、見た目をすっきりとさせることができます。
最近ではおしゃれなデザインのスライダーを簡単に導入できる
プラグインがたくさんありますが、今回は以下の手順で自作してみました。

読む対象
---
HTMLとCSSはできるがjQueryがうまく使えないという方。
Webページをシンプルに見せたいという方。
プラグインでスライダーを導入したことはあるが仕組みが分からないという方。

8つの手順で実装
---

手順①
スライドしたい要素に適切なclass名(例：slide)をつける。

手順②
表示するスライドに適切なclass名(例：active)をつける。
最初は1枚目のスライドを表示してほしいので一番最初につけました。
例
```<div class="slide active">
　　<h2>スライド1枚目</h2>
　　<img src="画像のパス">
</div>
<div class="slide">
　　<h2>スライド2枚目</h2>
　　<img src="画像のパス">
</div>
<div class="slide">
　　<h2>スライド3枚目</h2>
　　<img src="画像のパス">
</div>
<div class="slide">
　　<h2>スライド4枚目</h2>
　　<img src="画像のパス">
</div>```

手順③
cssファイルでslideクラスにdisplay: none;を適用する。

手順④
手順③の文以降にactiveクラスにdisplay: block;を適用する。

```css:example.css
.slide {
    display: none;
}

.active {/*.slide{...}よりも下に記述*/
    display: block;
}
```

手順⑤
slideクラスの前後にnextボタンとprevボタンを作るための下準備として
Font Awesomeを利用できるようにheadタグ中に以下の1文を宣言します。

```<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">```

手順⑥
slideクラスの前後に以下のようにクラスを作る。

```<div class="button prev">
　　<i class="fas fa-chevron-circle-left"></i>
</div>
/*ここに手順②のコードが入る*/
<div class="button next">
　　<i class="fas fa-chevron-circle-right"></i>
</div>```

このiタグの中身は[Font Awesome](https://fontawesome.com/start)からとってきたアイコンです。
今回はarrowで検索をしてprev、next用の矢印アイコンを持ってきました。
利用したいアイコンを選択すれば自動でコードが出てくるので、
挿入したい位置にコピペでOKです。
大きさを選べたり、cssで色や位置を変更できるので非常に便利です。

手順⑦
js形式のファイルに以下のコードを記述する。

```js:sample.js
$(document).ready(function(){
    function toggleChangeBtn() {
        var slideIndex = $('.slide').index($('.active'));/*activeクラスがついている要素(現在表示中のスライド)のindexを取得*/
        $('.button').show();/*両ボタンを表示*/
        if(slideIndex == 0){/*一番最初の要素が表示されているとき*/
            $('.prev').hide();/*prevボタンを隠す。*/
        }else if(slideIndex == $('.slide').length - 1){/*一番最後の要素が表示されているとき*/
            $('.next').hide();/*nextボタンを隠す。*/
        }
    }

    toggleChangeBtn();

    $('.next').click(function() {/*nextボタンを押したとき*/
        var $displaySlide = $('.active');/*現在表示中のスライドを取得*/
        $displaySlide.removeClass('active');/*そのスライドからactiveクラスを除いて表示されないようにする。*/
        $displaySlide.next().addClass('active');/*次のスライドにactiveクラスをつけ、表示させる。*/
        toggleChangeBtn();/*nextボタンを隠すか判断*/
    });
    $('.prev').click(function() {/*prevボタンを押したとき*/
       var $displaySlide = $('.active');/*現在表示中のスライドを取得*/
       $displaySlide.removeClass('active');/*そのスライドからactiveクラスを除いて表示されないようにする。*/
       $displaySlide.prev().addClass('active');/*前のスライドにactiveクラスをつけ、表示させる。*/
       toggleChangeBtn();/*prevボタンを隠すか判断*/
    });
});
```

手順⑧
HTMLファイルのheadタグ内でjQueryとsample.jsを読み込みます。

```<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="sample.js"></script>```


最後に
---
今回は超基本のスライダーを作成しました。
この内容が理解できていればスライドを一枚ずつではなく
二枚ずつ表示することもできたり、
スライダーの下に今、何枚目が表示されているのかのナビゲーション
をつけれたりできるようになります。

参考
---
[Font Awesomeの使い方](https://saruwakakun.com/html-css/basic/font-awesome)
gitを使用したブランチ作成からpushまでの簡単な流れ

ずっとgithub desktopを使用していましたが、さすがにコマンドでも操作できた方がいいだろうと思い、色々コマンドを調べて、ざっくりとした使い方がわかってきたので流れを簡潔に書きます。

# gitを使用したブランチ作成からpushまでの簡単な流れ
#### 作業を開始するために、、、

```bash
git branch -a #今いるブランチを確認 (-aをつけることでリモートブランチも見れる)
```

```bash
git branch ブランチ名　#ブランチ作成
```

```bash
git checkout -b ブランチ名 #ブランチ移動  (-bをつける事で新規にブランチを作成し移動)
```

#### ファイルを編集したら、、、
```bash
git status #ファイルの編集状態確認
```
```bash
git add . #コミットしたいファイル追加("."ではなくディレクトリを指定する事で個別に追加する事ができる)
# 例git add app #appディレクトリのファイル変更分のみコミット対象にする
```
```bash

git commit -m "コミットコメント" #addしたファイルをコミット
```
commitしたファイルをリモートブランチにpushする

```bash
git push origin HEAD 
        or
git push origin ブランチ名 
#コミットをリモートにpushする。HEADと記述するとわざわざブランチ名を書かなくてよくなる
```

####pushしたcommitをmasterにマージできたら、、、

```bash
git checkout master #masterブランチに移動
```

```bash
git pull origin ブランチ名 #リモートからマージしたファイルを取得する
```

# Tips編

#### コミットコメントを間違えた、、、
直前のコミットのコメントを編集できます。

```bash
git commit --amend -m "修正後コメント"
```

#### 他のブランチのコミットを今のブランチに持っていきたい、、、
他のブランチのコミットをdevelopブランチに持っていきたいと仮定します。

```bash
git checkout feature/user #欲しいコミットが入ったブランチに移動する
```
```bash
git log # 持っていきたいコミットを番号を確認する

commit 76f76fa4fa431ba7c69f24b1d09bb3299bbad978 # この番号を覚えておく
Author: Uki884 <example@gmail.com>
Date:   Thu Dec 3 01:57:34 2020 +0000
    fix form validation
```

```bash
git checkout develop # developブランチに戻る
git cherry-pick 76f76fa4fa431ba7c69f24b1d09bb3299bbad978 
#commitIDを入力することでfeature/userに入ってるコミットをdevelopブランチに持ってこれる

```

備忘録として書きました。細かい説明はいらないけど、とりあえず使いたいという人向けにこれからブラッシュアップしていくつもりです。
最初、commitとpushの違いがわからなかったのでそれについても記載したいです。
Rails勉強ネタ resources での名前付きヘルパー確認

![rails.png](https://qiita-image-store.s3.amazonaws.com/0/251648/5190329e-9356-726c-60f6-8fa4aaba39d3.png)


普段何気なくroutes.rbにて**resources**メソッドを使用しているが、
色々確認してみる。


## usersのコントローラーを作成（定番の7つのメソッド）

```
$ rails g controller users index new show create edit update destroy
```

```users_controller.rb
class UsersController < ApplicationController
  def index
  end

  def new
  end

  def show
  end

  def create
  end

  def edit
  end

  def update
  end

  def destroy
  end
end
```

```routes.rb
Rails.application.routes.draw do
  get 'users/index'
  get 'users/new'
  get 'users/show'
  get 'users/create'
  get 'users/edit'
  get 'users/update'
  get 'users/destroy'
end
```

この状態で`rails routes`を実行すると。

```
$ rails routes
       Prefix Verb URI Pattern              Controller#Action
  users_index GET  /users/index(.:format)   users#index
    users_new GET  /users/new(.:format)     users#new
   users_show GET  /users/show(.:format)    users#show
 users_create GET  /users/create(.:format)  users#create
   users_edit GET  /users/edit(.:format)    users#edit
 users_update GET  /users/update(.:format)  users#update
users_destroy GET  /users/destroy(.:format) users#destroy
```
全部users_'アクション名'という名前付きヘルパーになって、メソッドは全部**GET**です。
（空気を読んでPOSTとかDELETEなどになるのかと思っていた・・・）

## resoureceメソッド使う

```routes.rb
Rails.application.routes.draw do
  # get 'users/index'
  # get 'users/new'
  # get 'users/show'
  # get 'users/create'
  # get 'users/edit'
  # get 'users/update'
  # get 'users/destroy'

  resources :users
end
```

この状態で`rails routes`実行すると

```
$ rails routes
   Prefix Verb   URI Pattern               Controller#Action
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy
```

Restfulな形になった。
ニュアンス的に`create`が **user_path のPOST**なイメージがあるが、
users_pathである事に注意（間違えそう）。
EasylauncherをVector Assetsで使う

# TL;DR
Easylauncher（https://github.com/akaita/easylauncher-gradle-plugin) というAndroidアプリのランチャーアイコンに付加情報をつけてくれるGradle Pluginがあります。

Adaptive Icon対応もしているのですが、いまのところVector Assetsを使用した場合に対応していません。
LayerDrawableを使用することで、いちおうVector Assetsに対応する事が出来たのでその方法をまとめています。

# 🧐 Attention
Pixel3のホームアプリ（Pixel Launcher)でしか動作確認していません。他のホームアプリだと動かないかもしれません。

リリースビルドへの影響が気になる場合、リリースビルド用のresディレクトリに変更前の`ic_launcher.xml`をコピーしておき、リリースビルドではLayerDrawableが使用されないようにしておくと安心です。

# 🍽 Before
現在の`ic_launcher.xml`の記述が次の様になっており、`<forground>`タグでVectorDrawableが指定されています。
このときに`<background>`タグで指定するDrawableはVectorDrawableでもColorDrawableでも構いません

```res/mipmap-v26/ic_launcher.xml
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@drawable/ic_launcher_background" />
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
```

# 💪 Operation
### 1.リボン描画用の透過画像を作成
`108 x 108 dp`の透明なPNGファイルを作成し、`drawable_xxdpi/ic_launcher_foreground_ribbon`のような名称で保存します。 
※ mdpi 〜 xxxdpiまですべての画像を置いても、デバッグ用なので手抜きしてxxdpiだけでもOKです。

↓↓↓↓↓ ココにxxhdpi用の透過画像を貼っています ↓↓↓↓↓
![ic_launcher_foreground_ribbon.png](https://qiita-image-store.s3.amazonaws.com/0/8947/4d85ed7d-bc60-d33d-2049-7a4dd807ea06.png)
↑↑↑↑↑ ココにxxhdpi用の透過画像を貼っています ↑↑↑↑↑

### 2.本来のフォアグラウンド画像とリボン描画用の透明画像を重ねたLayerDrawableを作成
次の内容の`drawable/ic_launcher_foreground_with_ribbon.xml`を作成します。

```res/drawable/ic_launcher_foreground_with_ribbon.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_launcher_foreground" />
    <item
        android:drawable="@drawable/ic_launcher_foreground_ribbon" />
</layer-list>
```

### 3.フォアグラウンド画像としてLayerDrawableを指定する
`res/mipmap-v26/ic_launcher.xml`の内容を以下のように変更します。

```res/mipmap-v26/ic_launcher.xml
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@drawable/ic_launcher_background" />
    <foreground android:drawable="@drawable/ic_launcher_foreground_with_ribbon" />
</adaptive-icon>
```

### 4.build.gradleにEasylauncher用のスクリプトを追加する
`build.gradle`のeasylauncherセクションに以下のような内容を記述します。
ここで`foregroundIconNames`にリボン描画用の透明画像のDrawableを指定します。

詳細なEasylauncherのカスタマイズ方法についてはgithubのREADMEを参照してください。
https://github.com/akaita/easylauncher-gradle-plugin

```app/build.gradle
easylauncher {
    foregroundIconNames "@drawable/ic_launcher_foreground_ribbon"

    buildTypes {
        debug {
            filters = customColorRibbonFilter("開発版", "#DF3A01", "#FFFFFF", "bottom")
        }
    }
}
```
# 🤝 Result

![device-2019-03-27-024017.png](https://qiita-image-store.s3.amazonaws.com/0/8947/62be3ce2-43d6-3947-4e61-ad18f0ea5862.png)
DBeaverでSSHポートフォワーディングしてAWS EC2のMySQLに接続

# 概要

SSIA

# 環境

- 開発端末
    - Mac
- サーバ
    - AWS Linux 2
    - MySQL 8.0.15

# 目的

- AWSにDBを置いて3306で通信すると、暗号化されてないので危険
- そこで暗号化ですよ
  - 3306通信を[暗号化することはできるらしい](https://www.s-style.co.jp/blog/2018/07/2112/)
  - しかしWebサーバ <-> DBサーバを暗号化すると処理遅延が生じる。避けたい
  - SSL通信用に別のDBユーザを作るのも面倒
- そこで[SSHポートフォワーディング](https://www.tamurasouko.com/?p=1092)ですよ
    - SSHトンネリングと言った方が想像しやすいが、googleabilityはポートフォワーディングの方が上

# 手順

- AWS EC2にMySQLをインストール
- インスタンスにSSH接続 `ssh -i "mylara-db.pem" ec2-user@50.198.199.200`
- mysqlコマンド実行してから

```
CREATE DATABASE IF NOT EXISTS `mylaradb` COLLATE 'utf8_general_ci';
CREATE USER 'mylara'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Mylara-Password1234';
GRANT ALL ON `mylaradb`.* TO `mylara`@`localhost`;
```
※ mysql_native_passwordは本題と関係ないです

- 開発端末にDBeaverをインストール
- 接続設定

![スクリーンショット 2019-03-27 2.04.40.png](https://qiita-image-store.s3.amazonaws.com/0/368897/7fe846d7-0886-f5f2-d5f4-ccffe63849d3.png)
![スクリーンショット 2019-03-27 2.05.50.png](https://qiita-image-store.s3.amazonaws.com/0/368897/2677b3d2-6816-edcb-d60d-b230d0b11b97.png)

# 結果

接続成功

![スクリーンショット 2019-03-27 2.19.36.png](https://qiita-image-store.s3.amazonaws.com/0/368897/d7c097ae-ce0f-e486-aeb8-1cef4a877924.png)

Hope this helps.
[Python]文字の色を当てるゲームを作った

# 動機
raspberrypiが余っていたので，祖父母が暇を潰せるようにとraspberrypiに適当なゲームを入れて贈りました．
最近はフリーセルばかりやっているようで，ボケないかと心配になりました．
少しは脳を使うことをやってほしく，またpythonで何か作ろうかなと考えていたので，文字の色を当てるゲームを作りました．

# できたもの
![demo2.gif](https://qiita-image-store.s3.amazonaws.com/0/237843/743dc4e9-327c-4d56-ebd5-bc1fdcc5c99a.gif)

# 実装
pythonでのguiに関する日本語の資料はtkinterが最も充実していたのでtkinterにしました．

# 環境
Ubuntu 18.04.2 LTS
Python 3.6.7
tkinter 8.6

# 感想
OOPは座学ではやったことあるけど，実際にプログラミングするのは初めてなのでいろいろと戸惑いました．
コードが少し長くなったのでgithubに上げました．
はじめてgithubを触りましたが，便利そうなのでこれから勉強したいです．
あとREADMEもまともなのがかけるようにしたいです．

# ソースコード
[https://github.com/okamoto950712/color](https://github.com/okamoto950712/color)
Pythonのリスト内包表記(forの順番)

今日、Pythonをいじっているとリスト内包表記でハマったので、その経験をメモしておこうと思う。

# 問題

```python
x = ['a', 'b', 'c']
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [y for y in x for x in a]
print(b)
```

(意味ありげな1行目は置いておいて)この実行結果は、

```python
['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c']
```

となった。

僕は、

```python
[1, 2, 3, 4, 5, 6, 7, 8, 9]
```

となることを期待していた。というのも、リスト内包表記ではforの順序は関係ないと思っていたので、リスト平坦化のイディオムである、

```python
x = ['a', 'b', 'c']
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [y for x in a for y in x]
print(b)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
```

からの類推でそうなるものだと思っていた。

# 理由

リスト内包表記は一種の糖皮構文で、それをforで書き下せばわかりやすくなる。

問題の、

```python
b = [y for y in x for x in a]
```

は、

```python
b = []
for y in x:
    for x in a:
        b += [y]
```

と同じことだ。

ここで、`for y in x`の`x`は、この行が読み込まれた時の状態で固定されることに注意する。例えば、

```python
x = [1, 2, 3]
for y in x:
    x = ['a', 'b', 'c']
    print(y)
# 1
# 2
# 3
```

となる。

これをもう少し分かり易く書けば、

```python
for y in [1, 2, 3]:
    x = ['a', 'b', 'c']
    print(y)
```

という感じで実行されるので、for文内で`x`に別の値を代入しても、for文の実行には影響しない。

以上のことに注意して、

```python
x = ['a', 'b', 'c']
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [y for y in x for x in a]
print(b)
```

をfor文で書き直せば、

```python
b = []
for y in ['a', 'b', 'c']:
    for x in [[1, 2, 3], [4, 5, 6], [7, 8, 9]]:
        b += [y]
print(b)
```

となる。これの実行結果が、

```python
['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c']
```

となることに疑問はないだろう。

# リストの平坦化

二重リストを平坦化(一重リスト化)する方法として、

```python
x = ['a', 'b', 'c']
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [y for x in a for y in x]
print(b)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
```

を紹介したが、これもfor文で書き下して見る。

```python
b = []
for x in [[1, 2, 3], [4, 5, 6], [7, 8, 9]]:
    for y in x:
        b += [y]
print(b)
```

となるので、二重リストを平坦化できるのである。
free(Linuxコマンド）の出力の見方

# /usr/bin/free
~~~
$ free
             total       used       free     shared    buffers     cached
Mem:        713444     649936      63508      12320      36096     331528
-/+ buffers/cache:     282312     431132
Swap:       735228        120     735108
~~~


## Memの行
ページキャッシュとバッファキャッシュを考慮しないメモリサイズ

### total:OSが認識している物理的なメモリサイズ。
RAIDカードやNICなどを装着しているときは、それらのためにメモリが使われるので実際の搭載メモリサイズよりも少なくなります。

### used:使用しているメモリサイズ。
これにはバッファキャッシュやページキャッシュなどOSがディスクキャッシュのために使用しているメモリも含まれます。

### free:空きメモリサイズ。
  この値にはバッファキャッシュとページキャッシュが含まれていません。
  一般にLinuxは使い続けるほど、メモリをキャッシュに割り当てます。そのため使い続
  けるほどfreeの値はゼロに近づきます。この値が少ないからといって空きメモリがない
  わけではないことに注意してください。

### shared:共有メモリに割り当てられたメモリ。

### buffers:バッファキャッシュに割り当てたメモリ。
バッファキャッシュはブロックデバイス用のキャッシュです。

### cached:ページキャッシュに割り当てたメモリ。
ページキャッシュはファイルに対するキャッシュです。

## -/+buffers/cacheの行
ページキャッシュとバッファキャッシュを考慮したメモリサイズ

### used:1行目のusedからページキャッシュとバッファキャッシュを引いた値。
OSとアプリケーションが純粋に使用しているメモリサイズを表します。

### free:1行目のfreeにページキャッシュとバッファキャッシュを足した値。
キャッシュに割り当てられているメモリを自由に割り当て可能なメモリと考えれば、この値が空きメモリサイズになります。

## Swapの行
スワップに割り当てたサイズ。

### total:スワップに割り当てたディスクサイズ。

### used:割り当てた中で使用中のサイズ。

### free:割り当てた中で使用していないサイズ。
SQL JOINの方向あれこれ

二つのTBLをJOINする時の結合方向を指定する。
[引用元](http://www.pursue.ne.jp/jouhousyo/SQLDoc/select22.html)

## INNER JOIN：両方の表で一致する行だけを表示させる
```sql
SELECT 列名1,列名2,〜列名n ← どの列を表示させるか
FROM 「表名1」 INNER JOIN 「表名2」 ON 表名1.フィールド名 = 表名2.フィールド名
WHERE 抽出条件
```
　　→　表名１と表明２の一致する行のみ


## LEFT JOIN：左側に指定された表のすべての行が表示される
```sql
SELECT 列名1,列名2,〜列名n
FROM 「表名1」 LEFT JOIN 「表名2」 ON 表名1.フィールド名 = 表名2.フィールド名
WHERE 抽出条件
```
　　→　左側の表名1のすべての行が表示される

## RIGHT JOIN：右側に指定された表のすべての行が表示される
```sql
SELECT 列名1,列名2,〜列名n
FROM 「表名1」 RIGHT JOIN 「表名2」 ON 表名1.フィールド名 = 表名2.フィールド名
WHERE 抽出条件
```

　　　→　右側の表名2のすべての行が表示される

## 参考：INNER JOIN
```sql
SELECT　*
FROM　売上表,顧客表
WHERE　売上表.顧客CD=顧客表.顧客CD
```
[ORACLE-Refs](
http://www.oracle.com/technetwork/jp/articles/otnj-sql-image1-308625-ja.html)
Symfoware/SQLSTATE

富士通のDBMS(Symfoware)のコマンド抜粋
[製品マニュアル](http://software.fujitsu.com/jp/manual/manualfiles/M100005/B1WS0830/01Z200/ix-index.html)

## SQLSTATE

アプリケーション中で、SQL文の実行結果は状態変数のSQLSTATEに通知されます。したがって、アプリケーションは、SQL文を実行するたびにSQLSTATEをチェックして、Symfoware/RDBの処理結果を確認しながら処理を進めることができます。

■SQLSTATE
状態変数のSQLSTATEは、5桁の文字型の変数です。SQL文を実行した結果、SQLSTATEに設定される値を“状態コード”と呼びます。状態コードの先頭の2桁を“例外コード”と呼び、うしろの3桁を“副例外コード”と呼びます。SQL文の実行結果に対するコードの値を“表:SQLSTATE値”に示します。
[表:SQLSTATE値](
http://software.fujitsu.com/jp/manual/manualfiles/M060051/J2X01637/02Z200/sqlbgab/sqlbg092.html)
Symfowareコマンド抜粋/CSVアンロード

富士通のDBMS(Symfoware)のコマンド抜粋
[製品マニュアル](http://software.fujitsu.com/jp/manual/manualfiles/M100005/B1WS0830/01Z200/ix-index.html)

## CSVでアンロード with SQL-STATEMENT
```bash
DBNANE=...
TBLNAME=...
COLUMN1=...
TEMPFILE=...

rdbunlsql -d $DBNAME -s "SELECT * FROM $TBL_NAME WHERE $COLUMN1 BETWEEN timestamp'2016-11-18 08:00:00' AND timestamp'2016-11-18 09:00:00' WITH OPTION LOCK_MODE(NO LOCK)" -t /tmp/$TEMPFILE
```
debian(jessie)のdocker image使ってるとapt-getでエラーが出る

dockerで`ruby:2.3.1`を使ってビルドしようとしたら

```
W: Failed to fetch http://deb.debian.org/debian/dists/jessie-updates/main/binary-amd64/Packages  404  Not Found
```
ってエラーが出る

# なーぜ？
- `http://deb.debian.org/debian/dists/jessie-updates/main/binary-amd64/Packages`
が404になる
- どうやらjessieがアップデートされないから`http://deb.debian.org/debian/dists/jessie/main/binary-amd64/Packages`に変わったらしい
- アップデートサボるなよってことなんですねー

# とりあえず直す
```dockerfile:Dockerfile
FROM ruby:2.3.1

WORKDIR /usr/src/app

RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - &&\
    apt-get update -qq &&\
    apt-get install -y nodejs
```
みたいなのを

```dockerfile:Dockerfile
FROM ruby:2.3.1

WORKDIR /usr/src/app

RUN echo "deb http://deb.debian.org/debian jessie main" > /etc/apt/sources.list &&\
    echo "deb http://security.debian.org jessie/updates main" >> /etc/apt/sources.list &&\
    curl -sL https://deb.nodesource.com/setup_8.x | bash - &&\
    apt-get update -qq &&\
    apt-get install -y nodejs
```

にする

# この修正がなにをしているのか
パッケージのダウンロード元が書かれているファイルが`/etc/apt/sources.list`
これを元に`apt-get`が動く

そしてそこには

```:/etc/apt/sources.list
deb http://deb.debian.org/debian jessie main
deb http://deb.debian.org/debian jessie-updates main
deb http://security.debian.org jessie/updates main
```
と書かれてる
まぁ見た感じ2行目~~3行目~~が悪さしてるっぽいね

だから

```
deb http://deb.debian.org/debian jessie main
deb http://security.debian.org jessie/updates main
```
で上書きしてみる
動いた！！

# あくまでご参考までに
自分そこまでlinux詳しくないですし
適当に勘で直しただけなのでこれがベストな直し方かと言われると自信ないです

stretchにあげるのが一番いいんじゃないかと

# 追記 2019/03/28
3行目は消しちゃいけなかったようです
修正しました

@Iju 様
@henrich 様
ご指摘頂きありがとうございます
Symfowareコマンド抜粋/障害系

富士通のDBMS(Symfoware)のコマンド抜粋
[製品マニュアル](http://software.fujitsu.com/jp/manual/manualfiles/M100005/B1WS0830/01Z200/ix-index.html)

## 閉塞ＤＳＩの一覧
    rdbinf -l inh -a
    rdbinf -l inh -d データベース名 -a
### 出力情報
  データベース名
  DSI名

### 閉塞種別(-aオプションを指定した場合のみ表示)
閉塞種別の種類

~~~
HER : ハードウェア障害
SOF : ソフトウェア障害
DER : データの異常
CRV : ダウンリカバリの異常
MRV : メディアリカバリの異常
TIH : ロールバックの異常
DIR : RDBディレクトリファイルの異常
ALD : rdbsaloaderコマンドでの追記処理の異常
CMD : RDBコマンドの実行
XAI : XAの分散トランザクションにより設定されるインダウト閉塞
~~~

### 閉塞(inhibit)
    rdbinh -i データベース名.DSI名 | -p データベース名.データベーススペース名

### 閉塞解除(permit)
    rdbpmt -i データベース名.DSI名 | -p データベース名.データベーススペース名
Symfowareコマンド抜粋/SQL,UnLOAD

富士通のDBMS(Symfoware)のコマンド抜粋
[製品マニュアル](http://software.fujitsu.com/jp/manual/manualfiles/M100005/B1WS0830/01Z200/ix-index.html)

## 処理時間の長いSQL文の表示
    rdbpmsqllist [ -p 時刻,時刻 ]


## アクセスプランの表示
    rdbpmsqllist -c コネクションID -t 時刻
        [[年/]月/日-]時:分[:秒[.ミリ秒]] 

## アプリケーションやRDBコマンドの実行状況の出力
    rdbps [ -u ログオン名 ]
          [ -s [ p ] ]
          [ -r ]
          [ -i [ a ] ]
          [ -p プロセスID ]
          [ -e ]
          [ -x xml ]
          [ -c ]
 
## 性能情報の表示
    rdbsar [ -bdlam ][ -e ]
           [ -g ロググループ名 ]
           [ -r[共用バッファ識別子リスト]]
           [ -x xml ]
           [ 時間間隔 [ 繰り返し回数 ]]
 
## データベースの作成、または、データベースの性能チューニングを対話的に実行
    rdbexecsql [ { -s SQLサーバ名 | -d } ]
               [ -u ユーザ指定 ]
               [ -c ]
               [ -o 出力ファイル名 ]
               [ -i 入力ファイル名 [値[[ 値]...]]]
               [ -h 世代数 ]
               [ -mo ]
               [ { -e | -ex } ]
 
## データベースのデータのファイルへの出力
    rdbunl  -i データベース名.表のDSI名
           [ {  -t |  -o } ]
           [ -j { EUC_S90 | SJIS |  UNICODE } ]
           [ -n ]
           [ -c 列名 [{,列名} ...] ]
           [ -d ]
           [ -U NCHAR=UCS2B ]
           [ -e ]
           { -f 条件指定ファイル名
           | -v 分割指定ファイル名
           | 出力ファイル名 }
 
## SQL文による検索結果のファイルへの出力
    rdbunlsql -d データベース名
       { -v SQL文記述ファイル | -s 問合せ式 [ORDER BY句] [更新可能性句] [並列指定] [実行オプション指定] }
       [ -n ]
       [ { -t | -o } ]
       [ -j { EUC_S90 | SJIS |  UNICODE } ]
       [ -U NCHAR=UCS2B ]
       出力ファイル名
Symfowareコマンド抜粋/管理系

富士通のDBMS(Symfoware)のコマンド抜粋
[製品マニュアル](http://software.fujitsu.com/jp/manual/manualfiles/M100005/B1WS0830/01Z200/ix-index.html)

## rdb停止
    rdbstop -e    強制停止
    rdbstop -mc   APおよびRDBコマンドを強制終了し、ロールバック後、停止

## rdb起動
    rdbstart　　　（現用系）
    rdbstart -s　（待機系）

## 接続端末を確認
    rdbcninf -s

## コネクション強制切断
    rdbterm -i 192.168.1.3
    rdbterm -p pid(/session-id)


## AP,コマンドの実行状況
    rdbps -u [ログオン名] -p [プロセスID]
      -e 拡張情報
      -c コネクション情報
      -i  AP入出力情報(統計情報)

## 資源の占有情報の出力
    rdblkinf { -d | -l } [ -e ]
      -d デッドロック情報
      -l  ロック（占有）情報
      -e  拡張情報

## データベースの一覧
    rdbprt -m DB

## rdb構成情報
    rdbprt -d [DB] -m DEF -f [file]
      [DB]には、調べたいデータベース名   ex RDBII_DICTIONARY
      [file]には、出力する情報の内容    ex DB

## データベーススペースの領域の使用状況の出力
    rdbspcinf  {-p データベース名.データベーススペース名 | -d データベース名} -f

## DSIの使用状況
    rdbudsi -i [データベース名].[DSI名] -f

## ディクショナリ、ディレクトリ領域の使用状況
    rdbprdic
    rdbprdic -r    RDBディレクトリファイルの領域の使用状況

## 性能情報
    rdbsar
    rdbsar -d    データスペースの入出力に関する性能情報
Xcodeでgit操作(ブランチを作ってみる)

##はじめに
今回は引き続きXcodeのgit操作でブランチの作り方やチェックアウト(ブランチの切替)の仕方をまとめていきます。
前回作成したプロジェクトの状態から開始しますので、開始状態の詳細は[前の記事](https://qiita.com/sakamotoyuya/items/fd6c30e672860ba89759)を参照願います。
ちなみに、前回ではXcodeでのローカルリポジトリの作成(.gitignoreの作成)、コミット、リモートリポジトリの作成、プッシュをまとめています。

###環境
- macOS Mojave(バージョン10.14.1)
- Xcode (バージョン 10.1 )

##ブランチの作成
1. Branchesを右クリックする。
![スクリーンショット 2019-03-27 0.46.44.png](https://qiita-image-store.s3.amazonaws.com/0/377612/dc84a363-fe97-a1a8-c30f-5b6b27edc579.png)

2. Branches from "master"... をクリックする。
![スクリーンショット 2019-03-27 0.46.58.png](https://qiita-image-store.s3.amazonaws.com/0/377612/4363e876-3a89-1e4e-f8dc-f529e093145b.png)

3. こんな画面になるので「sub」と入力してCreateをクリックします。
![スクリーンショット 2019-03-27 0.49.48.png](https://qiita-image-store.s3.amazonaws.com/0/377612/6023678f-845c-b424-3951-f111bd0518c5.png)
「現在のブランチからブランチを作成してそれに切り替えます。コミットされていない変更はすべて新しいブランチで利用可能になります。」って書いてありますので、その通りになります。

4. Branchesにsubと言う名のブランチができます。
![スクリーンショット 2019-03-27 0.53.11.png](https://qiita-image-store.s3.amazonaws.com/0/377612/6f874db2-2af6-77f0-f62c-27120b1342b4.png)
(current)がsubについているのがわかりますね。
この状態でソースコードを改造してコミットしたあとsubブランチとmasterブランチを見てみます。

- subブランチ
![スクリーンショット 2019-03-27 0.59.55.png](https://qiita-image-store.s3.amazonaws.com/0/377612/16bef7aa-84a8-9171-4408-3521c74bd3cc.png)

- masterブランチ
![スクリーンショット 2019-03-27 1.02.26.png](https://qiita-image-store.s3.amazonaws.com/0/377612/39970398-9c43-7e96-cba1-af2aa6e72143.png)

**subブランチに新しいコミットが追加されました。**
ブランチを作ることで、masterに影響せずに新機能を作れるようになるようです。
ブランチの評価が終わったら、masterに反映させるのですが、(current)がsubにある状態だと反映ができないので、ブランチをmasterに切り替えます。

##ブランチの切替(チェックアウト)
1. masterを右クリックしてCheckout...をクリックする。
![スクリーンショット 2019-03-27 1.08.49.png](https://qiita-image-store.s3.amazonaws.com/0/377612/8114836f-b882-0f98-a17c-70602ba879f7.png)

2. Checkout...をクリックする。
![スクリーンショット 2019-03-27 1.08.59.png](https://qiita-image-store.s3.amazonaws.com/0/377612/a82f99a6-d821-7dc1-7968-b8beaf399c31.png)

3. (current)がmasterに切り替わっているのがわかります。
![スクリーンショット 2019-03-27 1.10.43.png](https://qiita-image-store.s3.amazonaws.com/0/377612/d884b8b9-93da-8f28-9b46-499410a0068b.png)
この状態でソースコードを確認するとsubブランチで反映した変更点が反映されていないことがわかりますね。

##ほかブランチの内容をマージ
1. マージさせたいブランチを(current)にしたら、subブランチを右クリックしてMerge"sub"into"master"...を右クリックします。
![スクリーンショット 2019-03-27 1.13.39.png](https://qiita-image-store.s3.amazonaws.com/0/377612/a069754b-6c3f-d6c8-04d3-631e2f5f9172.png)
下にMerge"master"into"sub"...とあるので、試していませんが逆もできるのかもしれません。

2. Mergeをクリック。
![スクリーンショット 2019-03-27 1.17.37.png](https://qiita-image-store.s3.amazonaws.com/0/377612/42e3c3ea-de5e-44b1-71e8-9cd84149cc20.png)
これでsubブランチの内容をmasterブランチへマージすることができました。
Googleの力を借りて ”もしかして” する

#はじめに
誤字った単語から本来の単語を推測したいときがあるかもしれません。
しかしそれを実装するのは大変でしょう。
そんなときは偉大なGoogleの力を借りましょう。

#コード
```index.html
<html>
<head>
</head>
<body>
  <form id="form">
    <input type="text" id="query" />
    <div id="result"></div>
    <button type="submit">検索</button>
  </form>

  <script type="text/javascript">
    document.getElementById("form").onsubmit = (e) => {
      e.preventDefault();
      (async () => {
        let result = document.getElementById('result');
        let query = document.getElementById("query");
        
        result.innerText = "...";

        let res = await fetch(`https://cors-anywhere.herokuapp.com/www.google.com/search?q=${query.value}`);
        let html = await res.text();
        let parser = new DOMParser();
        let doc = parser.parseFromString(html, "text/html");

        result.innerText = (() => {
          let fprsl = doc.getElementById('fprsl');
          if (fprsl) {
            return "もしかして :" + fprsl.innerText;
          }
          for(let e of doc.getElementsByClassName('gL9Hy')){
            let href = e.getAttribute("href");
            if(href && !href.indexOf("/search?q=")){
              return "もしかして :" + e.innerText;
            }
          }
          return "";
        })();
      })()
    }
  </script>
</body>
</html>
```

実行してみるとこんな感じ↓

<p class="codepen" data-height="258" data-theme-id="0" data-default-tab="result" data-user="gyojir" data-slug-hash="ywrmPw" style="height: 258px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="ywrmPw">
  <span>See the Pen <a href="https://codepen.io/gyojir/pen/ywrmPw/">
  ywrmPw</a> by gyojir (<a href="https://codepen.io/gyojir">@gyojir</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#説明
Google検索の"もしかして"機能は2パターンある。
・推測結果で検索までしてくれる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340435/7057fdce-d2ce-f658-3fd5-b11215ee4bca.png)

・推測結果の提案だけする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/340435/2de7c283-a595-8fd4-c749-65d295f70dd4.png)

それぞれのidとclassのパターンから適当にとってくればよい。

ただCORS制約によりGoogleに直接フェッチすることはできない。
そのため[cors-anywhere](https://cors-anywhere.herokuapp.com/)というサービスを介してフェッチしている。

#おしまい
どうせすぐに使えなくなると思う。
How to use twinx()

# How to use twinx()

## import modules

``` python
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('bmh')
```

## prepare dummy datas
``` python
X = np.linspace(1, 10, 100)

y1 = X * 2.0
y2 = -4.0 * X + 25.0 
```
## prepare plotting twinx()
``` python
fig, ax = plt.subplots(1, 1)
ax2 = ax.twinx()
```
## plot left bar
``` python
ax.plot(X, y1)
ax.set_ylim(0, 30)
ax.set_ylabel('y1 for left_bar [Kg]')
```
## plot right bar
``` python
ax2.plot(X, y2 ,ls=':', lw=0.5, c='r', alpha=0.3)
ax2.set_ylim(0, 30)
ax2.set_ylabel('y2 for left_bar [m]')
```
## show
``` python
ax.set_title('twin_X')
fig
plt.show()
```
![samaple01.jpg](https://qiita-image-store.s3.amazonaws.com/0/312064/1853b742-6e7c-03d4-c585-969cbcf6673a.jpeg)
Hultフォーマット情報の表示(utlilist)

# ファイル転送ソフト[HULFT]のコマンド抜粋。セゾ情報システムズの製品です。
[製品のHPはこちら](https://www.hulft.com/help/ja-jp/Home.htm)
[Hulftマニュアル](https://www.hulft.com/help/ja-jp/HULFT-V8/index.htm)

既に登録済みのフォーマット情報から、その内容をリスト表示することができます。

## フォーマット情報表示コマンド
~~~
utlilist -i fmt -f formatID
~~~

### パラメータ説明
<PRE>
-i fmt
  フォーマット情報を出力(省略不可)

-f　formatID
  表示させるフォーマットID(省略不可)
</PRE>

### 表示例
<PRE>
FMT=FMTID
COMMENT=SAMPLE
ITEM START LENGTH POINT TYPE
FMT_KEY 1 5 0 X
FMT_DATA1 6 10 0 X
FMT_DATA2 16 10 0 9
</PRE>
Hulft要求受付履歴(utlobslist)

# ファイル転送ソフト[HULFT]のコマンド抜粋。セゾン情報システムズの製品です。
[製品のHPはこちら](https://www.hulft.com/help/ja-jp/Home.htm)
[Hulftマニュアル](https://www.hulft.com/help/ja-jp/HULFT-V8/index.htm)

要求受付履歴をリスト表示することができます。表示は標準出力に出力されますので、リダイレクト「>」やパイプ「|」を使用することにより、ファイルへの書き込み、プリンタへの出力を行うことができます。


## 要求受付履歴リスト表示コマンド
~~~
utlobslist [-s service] [-h hostname] [-from yyyymmdd1] [-to yyyymmdd2] [-l]
~~~

### パラメータ説明
<PRE>
-s
  サービス名(省略可)
  省略するとすべてのサービスが対象となります。
【備考】サービス名は「アドミニストレーション・マニュアル」を参照してください。

-h hostname
  リスト表示対象のホスト名(省略可)
  68文字以内の英数字で指定します。省略した場合は、すべてのホスト名が対象となります。

-from　yyyymmdd1 -to　yyyymmdd2
  リスト表示対象の日付(省略可)
  8文字の数字で指定します。
  -fromを省略した場合、-toで指定した日付までのすべての日付が対象になります。
  -toを省略した場合、-fromで指定した日付以降のすべての日付が対象になります。
  どちらも省略した場合はすべての日付が対象になります。日付は「yyyymmdd1」、
  「yyyymmdd2」または「yyyymmdd1<=yyyymmdd2」の形式で指定する必要があります。
  指定した「yyyymmdd1」、「yyyymmdd2」もリスト出力の対象に含まれます。

-l
  ホスト名を68バイト表示(省略可)
  省略した場合、ホスト名は最初の8バイトのみ表示します。
</PRE>

### 表示例
「-l」の指定を行った場合
<PRE>
SERVICE  HOSTNAME DATE TIME STATUS
HULADMIN SUN01.HONSYA.CO
                  2003/05/25 10:15:10 0000-0000
HULSNDRC SUN01.HONSYA.CO
                  2003/05/25 11:25:00 0000-0000
</PRE>

「-l」の指定を省略した場合
<PRE>
SERVICE  HOSTNAME DATE       TIME     STATUS
HULADMIN SUN01.HO 2003/05/25 10:15:10 0000-0000
HULSNDRC SUN01.HO 2003/05/25 11:25:00 0000-0000
</PRE>
Hulft配信履歴・集信履歴(utllist)

# ファイル転送ソフト[HULFT]のコマンド抜粋。セゾ情報システムズの製品です。
[製品のHPはこちら](https://www.hulft.com/help/ja-jp/Home.htm)
[Hulftマニュアル](https://www.hulft.com/help/ja-jp/HULFT-V8/index.htm)

配信履歴・集信履歴をリスト表示することができます。表示は標準出力にされますので、リダイレクト「>」やパイプ「|」を使用することにより、ファイルへの書き込み、プリンタへの出力を行うことができます。

## 集配信履歴リスト表示コマンド
<PRE>
utllist {-s|-r} [-f fileID] [-h hostname]
        [-from yyyymmdd1] [-to yyyymmdd2] [-l|-c|-v5]
</PRE>

### パラメータ説明
<PRE>
-s|-r
  リスト表示する履歴の種類(省略不可)
  　-s ：配信履歴
  　-r ：集信履歴

-f　fileID
  リスト表示対象ファイルID(省略可)
  8文字以内の英数字で指定します。省略した場合は、すべてのファイルIDが対象となります。

-h hostname
  リスト表示対象のホスト名(省略可)
  68文字以内の英数字で指定します。省略した場合は、すべてのホスト名が対象となります。

-from　yyyymmdd1 -to　yyyymmdd2
  リスト表示対象の日付(省略可)
  8文字の数字で指定します。省略した場合はすべての日付が対象となります。
  -fromを省略した場合、-toで指定した日付までのすべての日付が対象になります。
  -toを省略した場合、-fromで指定した日付以降のすべての日付が対象になります。
  どちらも省略した場合はすべての日付が対象になります。日付は「yyyymmdd1」、
  「yyyymmdd2」または「yyyymmdd1<=yyyymmdd2」の形式で指定する必要があります。
  指定した「yyyymmdd1」、「yyyymmdd2」もリスト出力の対象に含まれます。
  検索の対象となるのは配信・集信の開始日付です。

-l
  ホスト名を68バイト表示(省略可)
  省略された場合、ホスト名は最初の8バイトのみ表示されます。

-c
  各機種HULFT V4共通フォーマット(省略可)

-v5
  各機種HULFT V5共通フォーマット(省略可)
</PRE>
Hulft配信状況表示(utlsdisp)、Hulft集信状況表示(utlrdisp)

# ファイル転送ソフト[HULFT]のコマンド抜粋。セゾ情報システムズの製品です。
[製品のHPはこちら](https://www.hulft.com/help/ja-jp/Home.htm)
[Hulftマニュアル](https://www.hulft.com/help/ja-jp/HULFT-V8/index.htm)

## 配信状況表示コマンド
  utlsdisp

### 表示例
    HOSTNAME:HOST01.hulft.co.jp
    FILEID  :FILEID01
    RECORDS :100000
    BYTE    :5000000
    PID     :12345


### 各項目の説明
    HOSTNAME ：配信先ホスト名
    FILEID   ：配信中のファイルID
    RECORDS  ：現在までに配信済みのレコード件数
    BYTE     ：現在までに配信済みのデータサイズ
    PID      ：プロセスID

## 集信状況表示コマンド
  utlrdisp


### 表示例
    HOSTNAME:HOST02.hulft.co.jp
    FILEID  :FILEID02
    RECORDS :100000
    BYTE    :5000000
    PID     :12345


### 各項目の説明
    HOSTNAME ：配信側ホスト名
    FILEID   ：集信中のファイルID
    RECORDS  ：現在までに集信済みのレコード件数
    BYTE     ：現在までに集信済みのデータサイズ
    PID      ：プロセスID
[備忘録] RDSで外部サーバからアクセス許可する方法

#経緯
開発環境でVagrantを使用していて、EC２を経由せず、ローカル環境からRDSを接続し
データベースの操作を行いたいと思ったから。
今回はMySQLを例に書いていきます。

#RDSとは
「Amazon Relational Database Service (通称:RDS)」はAmazonの提供する、リレーショナルデータベース構築サービスことです。
より詳しい情報は下にリンクを貼っておきます。
https://dev.classmethod.jp/cloud/aws/cm-advent-calendar-2015-aws-re-entering-rds/#overview

#RDSの設定
設定にパブリックアクセシビリティという項目があるので「はい」に変更する。
新規設定のときは「[詳細設定]の設定」、既存DBの設定変更のときは設定変更を選択後の一覧画面に表示される。
下の画像は新規設定の時の画面です。
<img width="1433" alt="スクリーンショット 2019-03-26 23.45.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/353812/aaf0e3a8-73c9-3c99-93f3-acbfae95d30c.png">

#セキュリティグループの設定

MySQLに紐づくセキュリティグループの設定を行う。
VPCセキュリティグループのリンクをクリックする。
![スクリーンショット 2019-03-27 0.15.06.png](https://qiita-image-store.s3.amazonaws.com/0/353812/58c7a6f9-b233-f455-b0f8-b75ed209ca65.png)

セキュリティグループに接続許可するサーバーや接続したい場所のIPアドレスを追加する。
※今回は、「0.0.0.0」にしてますが、これは全てのIPアドレスからの接続許可することになるので、現在使用しているIPのみ許可する方がセキュリティ的にいいと思います。
![スクリーンショット 2019-03-27 0.50.49.png](https://qiita-image-store.s3.amazonaws.com/0/353812/92b79717-bc8e-8bad-6ced-012fc232c23d.png)

#MySQLに接続できるか確認
```terminal:vagrant@localhost
$ mysql -h RDSのエンドポイント　-P 3306 -u ユーザ名 -p
Enter password:パスワード
```
<img width="637" alt="スクリーンショット 2019-03-27 1.22.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/353812/0c5c3635-2843-e932-6b10-5ccfe08881cc.png">
接続できた！！
PHP のフィルタ型 FILTER_SANITIZE_STRING、FILTER_SANITIZE_SPECIAL_CHARS、FILTER_SANITIZE_FULL_SPECIAL_CHARS の違い

PHP で値を検証したいとき、filter 関数（filter_var や filter_input 関数）を使用すると簡単に値を検証できます。この記事は、filter 系関数に指定するフィルタ型についてのメモです。

## FILTER_SANITIZE_STRING、FILTER_SANITIZE_SPECIAL_CHARS、FILTER_SANITIZE_FULL_SPECIAL_CHARS の違い

覚えてしまえば簡単だとは思いますが、私は覚えが悪いのでメモです（アウトプットすると覚えられる気がする）。

以下のコードの出力結果は…

```php
<?php
$var = '<script>alert("XSS");</script>';

var_dump(filter_var($var, FILTER_SANITIZE_STRING));
var_dump(filter_var($var, FILTER_SANITIZE_SPECIAL_CHARS));
var_dump(filter_var($var, FILTER_SANITIZE_FULL_SPECIAL_CHARS));
```

このようになります。

```php
string(21) "alert(&#34;XSS&#34;);"
string(54) "&#60;script&#62;alert(&#34;XSS&#34;);&#60;/script&#62;"
string(52) "&lt;script&gt;alert(&quot;XSS&quot;);&lt;/script&gt;"
```

結果から分かるように、違いは以下のようになります。

|ID|説明|
|---|---|---|
|FILTER_SANITIZE_STRING|タグを取り除く。オプションで、 特殊文字を取り除いたりエンコードしたりする|
|FILTER_SANITIZE_SPECIAL_CHARS|'"<>& および ASCII 値が 32 未満の文字を HTML エスケープする。オプションで、 特殊文字を取り除いたりエンコードしたりする|
|FILTER_SANITIZE_FULL_SPECIAL_CHARS|htmlspecialchars() に ENT_QUOTES を指定してコールするのと同じ|

より詳しい仕様などは PHP マニュアルの「[フィルタの型](https://www.php.net/manual/ja/filter.filters.sanitize.php)」をご覧ください。

## 終わり
私のような雑魚い頭的には「FILTER_SANITIZE_FULL_SPECIAL_CHARS を指定しておけばいい」という感じですかね（笑）
Hulft定義情報出力(utligen)

# ファイル転送ソフト[HULFT]のコマンド抜粋。セゾ情報システムズの製品です。
[製品のHPはこちら](https://www.hulft.com/help/ja-jp/Home.htm)
[Hulftマニュアル](https://www.hulft.com/help/ja-jp/HULFT-V8/index.htm)

既に登録済みの各管理情報から、管理情報バッチ登録(utliupdt)コマンドで使用するパラメータファイル(定義カード)を生成することができます。

## 管理情報パラメータ生成コマンド
~~~
utligen -f filename -i {snd|rcv|job|hst|tgrp|fmt|mfmt} -id ID
~~~

### パラメータ説明
~~~
-f　filename
    パラメータファイル名(省略不可)
    256文字以内の英数字で指定します。絶対パスで指定してください。

-i　{snd|rcv|job|hst|tgrp|fmt|mfmt}
    パラメータファイルを生成する管理情報を選択(省略不可)
    snd ：配信管理情報
    rcv ：集信管理情報
    job ：ジョブ起動情報
    hst ：詳細ホスト情報
    tgrp ：転送グループ情報
    fmt ：フォーマット情報
    mfmt ：マルチフォーマット情報

-id　ID
    生成対象のID(省略不可)
    詳細ホスト情報以外のIDは8バイト以内の英数字で指定します。詳細ホスト情報のID
    は68バイト以内の英数字で指定します。配信管理情報と集信管理情報のIDは、大文字、
    小文字の区別はありません。
    アスタリスク(*)を使用して複数IDを指定できます。「*」指定は全件、前方または後
    方一致の指定が可能です。アスタリスクを使用する場合は、ダブルクォーテーション
    (")で囲む必要があります(例 "ABC*")。
~~~

【備考】「-i {snd|rcv|job|hst|tgrp|fmt|mfmt} -id ID」を繰り返すことにより、
複数のパラメータを生成することができます。


### 記述例

~~~
utligen -f /tmp/file01.file -i snd -id "s*"  -i rcv -id rcv00001
utligen -f /tmp/fmtfile     -i fmt -id "*"
~~~
Hulft管理情報関連表示(utlidlist)

# ファイル転送ソフト[HULFT]のコマンド抜粋。セゾ情報システムズの製品です。
[製品のHPはこちら](https://www.hulft.com/help/ja-jp/Home.htm)
[Hulftマニュアル](https://www.hulft.com/help/ja-jp/HULFT-V8/index.htm)
システム管理情報で登録した各情報のID一覧、また各情報の関連図をリストに出力することができます。出力は標準出力ですので、リダイレクション「>」やパイプ「|」を使用することにより、ファイルへの格納や印刷などができます。

## 管理情報関連表示コマンド
~~~
utlidlist -i {snd|rcv|job|hst|tgrp|fmt|mfmt} -id ID [-list] [-l] [-s|-e]
~~~
### パラメータ説明
<pre>
  -i　{snd|rcv|job|hst|tgrp|fmt|mfmt}
    リスト表示する管理情報を選択(省略不可)
    　snd ：配信管理情報
    　rcv ：集信管理情報
    　job ：ジョブ起動情報
    　hst ：詳細ホスト情報
    　tgrp ：転送グループ情報
    　fmt ：フォーマット情報
    　mfmt ：マルチフォーマット情報

  -id ID
    リスト表示対象のID(省略不可)
    アスタリスク(*)を使用して複数IDを指定できます。ただし、*を使用するときはダ
    ブルクォーテーション(")で囲ってください。また*指定は全件または前方一致の指定
    が可能です(例"ABC*")。

  -list
    ID一覧を表示(省略可)
    省略された場合は、各管理情報の関連図を表示します。

  -l
    コメントをすべて表示(省略可)
    指定しない場合は、1行80バイトで表示します。

  -s|-e
    管理情報内で使われている漢字コード種(省略可)
      -s ：Shift-JISコード
      -e ：EUCコード
    出力の際の整形処理に使用します。
    省略した場合は、HULFTシステム動作環境設定の漢字コード種になります。
</pre>

【備考】「-i {snd|rcv|job|hst|tgrp|fmt|mfmt} -id ID」を繰り返すことにより、複数の管理情報のID一覧リストを表示することができます。

【注意】「-s|-e」オプションは、指定された漢字コードに変換するオプションではありません。
ざっくりROSデバッグ方法

#概要
ROSのデバッグ方法を通じて、開発の効率を上げる。
#何をやりたいか
実際の開発時においてどのような流れでrosのデバッグコマンドを叩くかを知っていくのが目的。
1. ノードの停止
2. rqt_graphで変更の確認
3. rotopic pubでpublishしてみる
4. 再度ノードを復活させる
5. 復活したノードが動いていることを確認

# 準備
以下のファイルを`catkin_ws/src/`以下に入れて
```catkin_make```してくコンパイルしてください。
[https://github.com/Keisuke08aw/robot-lecture](https://github.com/Keisuke08aw/robot-lecture)

##control_robotノードの停止
`rosnode kill /control_robot`を実行します。
これで/control_robotが死にます。
<img width="40%" alt="セットアップ.png" src="https://qiita-image-store.s3.amazonaws.com/0/304482/c55e23fd-6f97-0507-0222-0f3091875c7d.png">
##rqt_graphでnodeが消えたことを確認
`rosrun rqt_graph rqt_graph`を実行することでcontrolノードが消えたことが確認できます。
削除前
![Bad Request]()



削除後
<img width="40%" alt="セットアップ.png" src="https://qiita-image-store.s3.amazonaws.com/0/304482/f1738bb3-ceae-8164-2a6a-c1ff930c9436.png">

##rotopic pubで/move_speedを0.1でpublishしてみる
`rostopic pub -1 /move_speed std_msgs/Float32 "data: 0.1"`を実行することで
3秒間この情報を/move_speedというtopic名でpublishします。
###コマンド実行前のロボット
<img width="40%" alt="セットアップ.png" src="https://qiita-image-store.s3.amazonaws.com/0/304482/f1cb9cd4-66b0-aab0-8a77-8ef06409490d.gif">
###コマンド実行後のロボット
<img width="40%" alt="セットアップ.png" src="https://qiita-image-store.s3.amazonaws.com/0/304482/81c2b529-80d1-a88b-c283-77f272c6923f.gif">

コマンド実行前では、0.5m/secで動かしていたロボットを0.1m/secで動かしているため
動きがゆっくりになっているのがわかります。

##再度control_robotを復活させる
`rosrun robot-car control_robot`
rorunは1つのノードしか立ち上げられない。robot-carパッケージにあるcontrol_robotを立ち上げる。

##rosnode listでcontrol_robotが復活していることを確認
`robotnode list`でrosnodeのリストを閲覧することができるので確認しましょう。
<img width="40%" alt="セットアップ.png" src="https://qiita-image-store.s3.amazonaws.com/0/304482/5c981d0e-7bc8-1a2a-b94f-5c609cfe8895.png">

##デバッグコマンド
Nodeのグラフ可視化
`rqt_graph`

すべてのNodeのリストを表示
`rosnode list`

あるnodeの情報を取得
`rosnode info /node名`

あるnodeを止める
`rosnode kill /node名`

あるnodeを再開
`rosrun パッケージ名 node名`

すべてのtopicのリストを表示
`rostopic list`

あるtopicの情報を取得
`rostopic info /topic名`

あるtopicの値についてpublish
`rostopic pub -1 /トピック名 パッケージ名/型 "data:値"

##まとめ
基本的によく使うコマンドはrosnode infoです。
あるnodeがどんな値を受け取ってどんな値を投げているかを確認するためです。
ここまで分かればあとは大体いけます。
ループで実行されるコマンドを事前に確認する

ループで重かったり、後戻りし難い事をやる場合は何が実行されるか事前にチェックしたい


例えば適当に

```bash
$ for i in {0..4} {80..83} ; do tar czf $(($i + 10)).tgz $(($i + 10)) ; done
```
とかやろうとして、ちょっと不安だなと思ったら


```bash
$ for i in {0..4} {80..83} ; do echo tar czf $(($i + 10)).tgz $(($i + 10)) ; done
tar czf 10.tgz 10
tar czf 11.tgz 11
tar czf 12.tgz 12
tar czf 13.tgz 13
tar czf 14.tgz 14
tar czf 90.tgz 90
tar czf 91.tgz 91
tar czf 92.tgz 92
tar czf 93.tgz 93
```
とか、実際にやるコマンドの前に `echo` を入れれば、これから何が実行されるかが分かる


確認できたら、`Ctrl-r e c h o Meta-d` とか押せば、`echo` なし版を入力できると思う。
CentOS7にRubyをインストール

いつも忘れがちなので、自分用のメモも兼ねてインストール方法を投稿します。

#前準備
CentOS7はMinimal ISOでインストール済みであること
#####必要なパッケージのインストール

```
$ sudo yum -y install git bzip2 gcc gcc-c++ openssl-devel readline-devel zlib-devel
$ sudo yum -y install epel-release
$ sudo yum -y install nodejs
```

#####rbenvをダウンロード

```
$ sudo git clone https://github.com/rbenv/rbenv.git /usr/local/rbenv
$ sudo git clone https://github.com/rbenv/ruby-build.git /usr/local/rbenv/plugins/ruby-build
```

#####rbenvの環境設定
/etc/profile.d/rbenv.shを作成し、以下の内容を追加します。

```
export RBENV_ROOT=/usr/local/rbenv
export PATH=${RBENV_ROOT}/bin:$PATH
eval "$(rbenv init --no-rehash -)"
```

rootユーザで以下の実行が必要

```
# source /etc/profile.d/rbenv.sh
```

sudoでrbenvを実行するためにsudorderにRBENV_ROOTとsecure_pathの追記が必要

```
# visudo
...
Defaults env_keep += "RBENV_ROOT"
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/rbenv/bin:/usr/local/rbenv/shims
...
```

#Rubyのインストール

#####バージョンをチェック
```
$ rbenv install -l
...
  2.6.0-rc1
  2.6.0-rc2
  2.6.0
  2.6.1
  2.6.2
  2.7.0-dev
  jruby-1.5.6
...
```
#####インストール実行
バージョン2.6.2をインストールしてみます。

```
$ sudo rbenv install 2.6.2
```

使用するRubyのバージョンを設定します。

```
$ sudo rbenv global 2.6.2
$ sudo rbenv rehash
```

これでインストール完了です。

#後処理
#####必要なgemをインストール
bundlerはRailsを動かすために最低限必要なのでインストールします。

```
$ sudo gem install bundler --no-doc
```
Linux wineで、VRChat等 Direct3Dを動作する環境を作る

Linuxには、Windowsの実行ファイルを仮想的に動作させる、wineがあります。
ただ、wineは描画系ライブラリが未熟なのが現状です。

ここでは、wineでDirect3Dや、DirectX 10, 11を動作させるためのライブラリ導入をしていきます。

# なぜwineでのDirect3Dがうまく動かないのか/遅いのか

wineは、Windowsシステムが標準で持っているライブラリ（LinuxではなくWindowsなので.dll）を自前で実装しています。
その中でも、描画系の開発は比較的遅いです。
Direct 3DやDirect X 10,11を使う際は、ホストのLinuxマシンのiGPU/eGPUに対して直接命令をセず、一旦OpenGL命令を発行しています。

ただ、この現状はWineのバージョンが上がる度に改善されていっているようです。

今回は、wine

# DXVKのインストール
Grafana+InfluxDBのインストール

# 概要
本記事では，GrafanaおよびInfluxDBをCentOSにローカルインストールする手順をまとめる。
GrafanaおよびInfluxDBは，外部のリポジトリサーバに接続してインストールする手順が一般的であるが，インストール対象サーバが何らかの事情により，外部のリポジトリサーバに接続できない場合，GrafanaおよびInfluxDBのパッケージおよびその関連パッケージをあらかじめ準備したうえでインストールを行う必要がある。
ここでは上記前提でのGrafanaおよびInfluxDBのインストール手順をまとめる。

# 対象ディストリビューション／パッケージ
CentOS Linux release 7.5.1804 (Core)
Grafana 5.1.4
InfluxDB 1.5.4

# ダウンロード
## grafanaのダウンロード
```
wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.1.4-1.x86_64.rpm 
```

## grafanaの依存パッケージをダウンロード
```
yum install grafana-5.1.4-1.x86_64.rpm --downloadonly --downloaddir=/root/grafana-dep
```

## grafana 5.1.4の依存パッケージ:
* fontconfig : fontconfig-2.10.95-11.el7.x86_64.rpm
* fontpackages-filesystem : fontpackages-filesystem-1.44-8.el7.noarch.rpm
* libfontenc : libfontenc-1.1.3-3.el7.x86_64.rpm
* lixXfont : libXfibt-1.5.2-1.el7.x86_64.rpm
* stix-fonts : stix-fonts-1.1.0-5.el7.noarch.rpm
* urw-fonts : urw-fonts-2.4-16.el7.noarch.rpm
* xorg-x11-font-utils : xorg-x11-font-utils-7.5-20.el7.x86_64.rpm

## InfluxDBのダウンロード
```
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.5.4.x86_64.rpm 
```

# インストール
## Grafanaのインストール
rpmコマンドでgrafanaおよび依存パッケージインストールする。

```
rpm -ivh libXfont-1.5.2-1.el7.x86_64.rpm libfontenc-1.1.3-3.el7.x86_64.rpm
rpm -ivh xorg-x11-font-utils-7.5-20.el7.x86_64.rpm
rpm -ivh fontconfig-2.10.95-11.el7.x86_64.rpm urw-fonts-2.4-16.el7.noarch.rpm fontpackages-filesystem-1.44-8.el7.noarch.rpm stix-fonts-1.1.0-5.el7.noarch.rpm
rpm -ivh grafana-5.1.4-1.x86_64.rpm 
```

## InfluxDBのインストール
依存性を解決するインストール(署名チェックしない)

```
rpm -ivh influxdb-1.5.4.x86_64.rpm
yum -y localinstall --nogpgcheck ./*.rpm
```

# アンインストール
```
rpm -e influxdb-1.5.4.x86_64
rpm -e grafana-5.1.4-1.x86_64
rpm -e fontconfig-2.10.95-11.el7.x86_64 urw-fonts-2.4-16.el7.noarch fontpackages-filesystem-1.44-8.el7.noarch stix-fonts-1.1.0-5.el7.noarch
rpm -e xorg-x11-font-utils-7.5-20.el7.x86_64.rpm
rpm -e libXfont-1.5.2-1.el7.x86_64 libfontenc-1.1.3-3.el7.x86_64 
```

# ファイアウォールの設定
## Grafanaのファイアウォールの設定
```
firewall-cmd --add-port=3000/tcp --permanent
firewall-cmd --reload 
```

## InfluxDBのファイアウォールの設定
```
firewall-cmd --add-port=8086/tcp --permanent
firewall-cmd --reload 
```

# サービスの起動
## Grafanaの起動
```
systemctl daemon-reload
systemctl start grafana-server.service
systemctl status grafana-server.service 
```

## Grafanaの自動起動
```
systemctl enable grafana-server.service 
```

## InfluxDBの起動
```
systemctl start influxdb.service
systemctl status influxdb.service 
```
CloudFormationで"An ARN must have at least 6 elements, not 1"が発生したときの対処

#事象
CloudFormationで`Invalid parameter: TopicArn Reason: An ARN must have at least 6 elements, not 1`というエラーが発生した

#原因
今回は、パラメーターの参照が不正であることが原因だった。

```yaml:expample.yml
Parameteres:
  S3BucketTopic:
    Type: String
    Default: 'str'

Resources:
  LambdaSubscription:
    Type: "AWS::SNS::Subscription"
    DependsOn: lambda
    Properties:
      Endpoint: !GetAtt lambda.Arn
      Protocol: lambda
      TopicArn: !Sub $S3BucketTopic
      #↑パラメーターに{}がないため、文字列として扱われている?
      #これが原因で、" ARN must have at least 6 elements, not 1"(Arnは少なくとも6つの要素からなり、1つではありません)
      #というエラーが発生している?
```

#対策
本エラーが発生した場合は、まず原因となる論理IDの箇所で、パラメーターの引用が適切であることを確実にする。

```yaml:expample.yml
Parameteres:
  S3BucketTopic:
    Type: String
    Default: 'str'

Resources:
  LambdaSubscription:
    Type: "AWS::SNS::Subscription"
    DependsOn: lambda
    Properties:
      Endpoint: !GetAtt lambda.Arn
      Protocol: lambda
      #TopicArn: !Sub $S3BucketTopic
      TopicArn: !Sub ${S3BucketTopic}
```

#おまけ
これで3時間位無駄にしました
「このリンクを見たら問題が解決しました」という記事の価値について

ポエムです。

## 「このリンクを見たら問題が解決しました」という記事の価値について
この様な記事には価値がない...と言いたいのではなく、その反対です。

「このリンクを見たら問題が解決しました」という記事は価値があるし、この様な記事を書くことは社会全体で見てもコスパが良い行いだと思います。

なぜかというと、**解決策を書いた記事のタイトルは、その記事が解決しうる全ての問題を網羅していないからです。**

どんなに素晴らしい記事でもそうです。

その記事への別名を名付ける様な感覚で、記事を書いていきましょう。

ちょっと分かりにくい文章になってしまいましたが、意図が伝わっていれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Power Automate 上で複数行文字列を改行で分割する

基本的には `split` 関数で値を分割することができます。
https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#actionbody

ただし、カンマ等の文字はすんなり渡せるのですが、改行コードは、`split(variables("hoge"), "\n")` のように指定しても分割してくれません（エスケープシーケンスがだめ？）。

現時点では、次のように

- 改行だけをもつ文字列変数を作成
- 改行を持つ変数を指定して`split`を実行

とすることで実現できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/68978/6ec4a65c-d2c4-aa07-8261-efb0dbb87d5c.png)



# 参考
https://powerusers.microsoft.com/t5/Building-Flows/Sliting-multiple-lines/m-p/92120/highlight/true#M9056

## 動作確認履歴
2020/5/29 時点でもこの方法が必要でした。
JavaでFirebaseAdminSDKを使う際に認証ファイルを用意せずに利用する

# はじめに

JavaでFirebase Admin SDKを利用する場合、下記のようにFirebaseを初期化する必要があります。

```java:初期化
FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json");

FirebaseOptions options = new FirebaseOptions.Builder()
    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
    .build();

FirebaseApp.initializeApp(options);
```

ここで問題なのが、Firebase Consoleからダウンロードしたjsonファイルを読み込む必要があるということ。
通常、機密情報などは環境変数で渡すのが一般的だが、なぜか機密情報が記述されたjsonファイルが必要。

例えば、Ci/CDなどで、GitHubへプッシュをトリガーにサーバへデプロイする場合、
このjsonファイルもプッシュする必要があります。
リポジトリがプライベートだとしても、管理するのは危険ですよね。

というわけで、お題にもある通り、ファイルを用意せずに環境変数から設定する方法をご紹介します。

# 動作環境

- Mac OS Mojave
- Visual Studio Code
- Java 8
- Spring Boot 2

# 準備

Firebase Consoleからサービスアカウントの秘密鍵情報をダウンロードしておくこと。

![スクリーンショット_2019-03-26_23_20_11.png](https://qiita-image-store.s3.amazonaws.com/0/53830/83444d79-531d-fc18-fda5-98536e9ef582.png)

# 手順

## 環境変数の設定

launch.jsonに以下のコードを追加します。
設定値は秘密鍵情報のjsonファイルを参照してください。

```json:launch.json
"env": {
        "TYPE": "<type>",
        "PROJECT_ID": "<project_id>",
        "PRIVATE_KEY": "<private_key>",
        "PRIVATE_KEY_ID": "<private_key_id>",
        "CLIENT_EMAIL": "<client_email>",
        "CLIENT_ID": "<client_id>",
        "CLIENT_X509_CERT_URL": "<client_x509_cert_url>"
}
```

## 実装

プログラムでjsonファイルを作ってしまえばよい。

```java
@SpringBootApplication
public class DemoApplication {

	private static final String FIREBASE_CREDENTIALS_PATH = "/path/to/credentials.json";
	private static ObjectMapper mapper = new ObjectMapper();

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
		try {
			FileWriter fw = new FileWriter(FIREBASE_CREDENTIALS_PATH);
			try (PrintWriter pw = new PrintWriter(new BufferedWriter(fw))) {
                // 環境変数から取得して設定する
				Map<String, String> credentials = new HashMap<>();
				credentials.put("type", System.getenv("TYPE"));
				credentials.put("project_id", System.getenv("PROJECT_ID"));
				credentials.put("private_key_id", System.getenv("PRIVATE_KEY_ID"));
				credentials.put("private_key", System.getenv("PRIVATE_KEY"));
				credentials.put("client_email", System.getenv("CLIENT_EMAIL"));
				credentials.put("client_id", System.getenv("CLIENT_ID"));
				credentials.put("auth_uri", "https://accounts.google.com/o/oauth2/auth");
				credentials.put("token_uri", "https://oauth2.googleapis.com/token");
				credentials.put("auth_provider_x509_cert_url", "https://www.googleapis.com/oauth2/v1/certs");
				credentials.put("client_x509_cert_url", System.getenv("CLIENT_X509_CERT_URL"));
                // MapをJson形式の文字列に変換
				String str = mapper.writeValueAsString(credentials);
                // ファイルに書き込み
				pw.println(str);
			}
			FileInputStream serviceAccount = new FileInputStream(FIREBASE_CREDENTIALS_PATH);

			FirebaseOptions options = new FirebaseOptions.Builder()
					.setCredentials(GoogleCredentials.fromStream(serviceAccount)).build();
            // 初期化
			FirebaseApp.initializeApp(options);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}

	}
```