OmniAICreator/Qiita-1.07M huggingface dataset:
Linux　LAMPインストール

これまた再現性を高めるためだけの薄っぺらい記事です。
自分用に作ってますが、どなたかの参考になるのかもしれません。

# LAMPとは
L:Linux（OS)
A:Apache（Webサーバー）
M：MySQL/MariaDB（データベース）
P：PHP/Perl/Python（プログラム言語）

## Apacheのインストール
### インストール
```
# yum install httpd
```
httpdとはApacheのことです。
インストールしますか？の質問にはYesで。

### httpdを起動
```
# systemctl start httpd
```

### ファイアウォールでhttpとhttpsの通信を通過できるように
```
# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --add-service=https --zone=public --permanent
```
ファイアウォール再起動

```
# systemctl restart firewalld
```

これで、とりあえずサーバーのIPアドレスでページが表示されます。

```
http://xxx.xxx.xxx.xxx
```

### サーバー起動時に、合わせてapacheも起動する設定

```
# systemctl enable httpd
```

## SFTPでファイルをアップ
### ドキュメントルート権限の変更
Webページは、/var/www/htmlに格納したものが表示されます。
パーミッション設定がされていないので、設定します。

現状確認コマンド

```
# cd /var/www
# ls -l
```

色々あるが、WordPress管理画面からも変更ができるような設定にする。
下記のようにパーミッション設定変更
※myusernameはそれぞれのユーザー名

```
# cd /var/www
# chown apache:myusername html
# chmod 775 html
```

# PHPのインストール

```
sudo yum -y install php php-mbstring php-gd php-mysql
```
確認

```
# php -v
PHP 5.4.16 (cli) (built: Apr  1 2020 04:07:17) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
```

httpd再起動

```
# systemctl restart httpd
```

試しに、下記を記したindex.phpをアップしてみると、phpinfoが表示されます。

```
<?php ecno phpinfo(); ?>
```

# MariaDBのインストール

### インストール
```
yum install mariadb-server
```

### MariaDBを起動

```
# systemctl enable mariadb
# systemctl start mariadb
```

### MariaDB 初期設定
```
# mysql_secure_installation
```


ここでは、何も入力せずにEnterを押す

```
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
```

（MariaDBの）rootのパスワード（サーバーのではないので注意）を設定するかと聞かれるので、Y。
そのあと、パスワードを入力する。

```
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y
New password: 
```

そのあとの質問は、全部Yesです。

### 確認

```
# mysql -u root -p
```

パスワード入力と、
show databases; でデータベース確認
exit でMySQL（MariaDB）から抜け出します。

```
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

MariaDB [(none)]> exit
```

ざっと、そんなところです。
デザインをスマホ対応にする

レスポンシブデザインの学習をしているのですが、自分の作っているウェブアプリをスマホで見ると表示が崩れていたので、しっかりとスマホ対応にしていきたいと思います。

#例

```react:HomePage
<Button mr="4" colorScheme="linkedin" onClick={GuestLogin}>
	ゲストログイン
</Button>
<Link href="/signup">
	<Button mr="4" colorScheme="teal">
		ユーザー登録
	</Button>
</Link>
<Link href="/login">
	<Button colorScheme="teal">
		ログイン
	</Button>
</Link>
```
このようなコードを書いていたのですが、表示が崩れてしまいました...
![ed0168c171d0e91195dae8de7a77501c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874312/da0d181e-ad15-54da-a924-1c19643ae6c8.png)

スマホの画面にも対応できるように今回はdisplayというプロパティを使ってスマホのデザインとパソコンのデザインをを切り替えたいと思います。

```react:HomePage
<Stack display={{ base: "block", md: "none" }} margin="2">
	<Menu>
		<MenuButton>
			<HamburgerIcon />
		</MenuButton>
		<MenuList>
			<MenuItem onClick={GuestLogin}>ゲストログイン</MenuItem>
			<Link href="/signup"><MenuItem>ユーザー登録</MenuItem></Link>
			<Link href="/login"><MenuItem>ログイン</MenuItem></Link>
		</MenuList>
	</Menu>
</Stack>
<Button
margin="2"
	display={{ base: "none", md: "block" }}
	colorScheme="linkedin"
	onClick={GuestLogin}>
	ゲストログイン
</Button>
<Link href="/signup">
	<Button
	margin="2"
		display={{ base: "none", md: "block" }}
		colorScheme="teal">
		ユーザー登録
	</Button>
</Link>
<Link href="/login">
	<Button
	margin="2"
		display={{ base: "none", md: "block" }}
		colorScheme="teal">
		ログイン
	</Button>
</Link>
```

base: "none", md: "block" の部分がスマホの画面になります。

![18b0a08bc0b579e1d349d1adaf26abfa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/874312/0125acbf-4182-6eb2-b5e8-3e326cd6dbb2.png)

https://twitter.com/kiricheese3/status/1428234230320943110

スマホ画面の確認はChromeデベロッパーツールで行いました。
#終わりに
ここまで見ていただきありがとうございました。
[SQL]case式は置換作業

###SQLにおけるCASE文のイメージと使い方

## イメージ
* 列の値を別の読み方に置換する
* ↑の機能により、SUMやAVERAGEと組め合わせると嬉しい


## 具体例(1)　～CASEのシンプルな機能～
#### コード
```sql
SELECT CASE prefecture
WHEN '高知' THEN '四国'
WHEN '愛媛' THEN '四国'
WHEN '香川' THEN '四国'
WHEN '徳島' THEN '四国'
ELSE NULL /*(ELSEはNULLの時は書く必要ないが、書いたほうがわかりやすいと思う)*/
END       /*（最後にENDは必須）/*
```
#### 結果
***
prefecture　　　prefecture
ーー　　　　　　ーー　　
高知　　　　　　四国
愛媛　　　➡　　四国
香川　　　　　　四国
徳島　　　　　　四国

***
実際の機能はこれだけ。
次に、これが威力発揮させる場面(SUM等の集計関数との組み合わせ)について。

## 具体例(2)　～CASEが威力を発揮す場面～
#### やりたいこと
テーブル名:PopTbl

| prefecture | population | 
|:-----------|------------:|
| 高知       | 100     | 
| 愛媛     | 200      |
| 香川      | 300        | 
| 徳島       | 400          |
| 福岡       | 500       |
| 佐賀    | 600     |
| 長崎     | 700        | 
|東京      | 800          |
| 群馬       | 900       |

この表を↓のようにしたい場合

| prefecuture | population | 
|:-----------|------------:|
|四国       | 1000    | 
| 九州     | 1800    |
| その他     | 1700      |
つまり、別の名前でまとめて計算したい
→CASE文!!

#### コード
```sql
SELECT CASE prefecture
WHEN '高知' THEN '四国'
WHEN '愛媛' THEN '四国'
WHEN '香川' THEN '四国'
WHEN '徳島' THEN '四国'
WHEN '福岡' THEN '九州'
WHEN '佐賀' THEN '九州'
WHEN '長崎' THEN '九州'
ELSE 'その他'
END AS districrt
SUM(population)
FROM PopTbl
GROUP BY district
```
#### 解説

* CASEで置換後のテーブルの様子を districtと定義
* ↑により、GROUP BY で置換後の名前を使ってまとめられる

## CASE文を書く時のイメージ
#### いつものSELECT文で名前を置換したい列名のところをCASE文で挟むイメージ

SELECT　 A　 B 　C　　FROM 　～
とあったときに、Aの読み方を変えたい！と思ったら
⇒SELECT 　**CASE** 　A　**WHEN ～THEN～ELSE～END**　B　C　FROM　～






## 参考図書
達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ
パスワードリセットメールが届かない時

解答例

First Step : lets check if  the email of user that you want to reset is correct or not if it is correct  lets go next step 

Second Step: i advice you to try to send email  from your org to you mail  you can use quick action send email  or if you didn't active email to Case you can go to Setup and Test Deliverability   . if you didn't receive mail this mean deliberability access level is putted on no acces you need to make all access

最初のステップ：リセットしたいユーザーのメールアドレスが正しいかどうかを確認し、正しいかどうかを確認して次のステップに進みます

2番目のステップ：組織からメールを送信してみることをお勧めします。クイックアクションメール送信を使用できます。Caseにメールをアクティブにしなかった場合は、[設定と配信可能性のテスト]に移動できます。メールを受信しなかった場合、これは、すべてのアクセスを行う必要のあるアクセスがないことを意味します。

開発者コンソールからリセットする例も紹介されています。確かに以前見た。

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000C6cqi


+ [Sandboxからのパスワードリセットメール受信不可について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Pw6NE)

:::note
開発者コンソールを使ってパスワードをリセットできるので試す価値はあると思います。

username@domain.com をSalesforce 組織のユーザー名に 置き換えます
パスワードを新しいパスワードに置き換えます 
ユーザー名とパスワードの周りの一重引用符を削除しないでください 
 
```
User u = [SELECT Id FROM User WHERE username = 'username@domain.com'];
System.setPassword(u.Id, 'Password');
```

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000C6cqi
:::

# プレイグランドでも起きる

+ [プレイグラウンドのメールを受信しない - Data Cloud バッジを使ってみる](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eruPb)

:::note
Dreamforce が終わって 1 週間が経ち、画面上のメッセージで私のメール アドレスが正しいことが確認されました。Trailhead からケースを作成する機能はなくなりましたが、他の方法で作成しました。
:::
GETアクションをおこなった際の、エラーについて（エラー：リダイレクトが繰り返し行われました。

# リンク先にて、以下の『このページは動作していません』とのエラーが出たので共有します。
![スクリーンショット 2021-08-19 14.26.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1730386/0b950fe7-1d27-5291-8c81-dfc613ebad80.png)

## はじめに
Railsにて、GETアクション呼び出すリンクを開いたところ、『ロード後リダイレクトが繰り返し行われました』とのエラーが出ました。

## 原因
ルーティングでGETと指定して、コントローラーのGETアクションを行なっていたのにも関わらず、アクションの中でも、redirect_to を記述しており、リダイレクト処理が2回も行われていたためでした。

![スクリーンショット 2021-08-19 14.43.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1730386/689f7800-d5d0-67c9-60c2-b3853add4c19.png)


↑
searchアクションの、ルーティングにてhttpメソッドはGETで指定しています。
## 改善方法

ルーティングで、GETで指定している場合は、自動的にアクション名のページに遷移するため、redirect_toは必要ありません。
基礎的なところですが、少しつまづいたので共有しました。
リストビューのボタン

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

# リストビューボタンでできないこと

+ 標準の「最近表示した」リストビューのボタンはカスタマイズできません。
+ 現時点では、アイデアにカスタムボタンを設定することはできません。
+ オブジェクトのアクセス許可

https://help.salesforce.com/s/articleView?id=000331581&type=1

# Add Custom Button In List View
https://developer.salesforce.com/forums/?id=9062I000000Xo0tQAC

# 操作方法

1. Go to setup.
2. Go to the object manager.
3. Select your object.
4. Click on Search Layouts for Salesforce Classic

![view_button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9c833273-6fb8-d244-1984-d7d3721b0509.png)


# URL HACK

+ [ボタン機能のリンク設定について:パラメータは設定できません](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erGsj)

:::note
クラッシック環境なら動的にパラメータを渡せそうですが、Lightningではできないと思います。

https://salesforce.stackexchange.com/questions/46542/can-list-view-parameters-be-passed-in-via-the-url

ただ、レポートならLightningでも動的にパラメータを渡すことは可能です。

Lightning Experience での URL パラメーターを使用したレポートの絞り込み
https://help.salesforce.com/s/articleView?id=sf.reports_filter_url.htm&type=5
:::

# リストビューに表示されるボタンの数を、デフォルトの5個から8個や3個などに増減させることはできますか？ 

+ [SalesForceのリストビューに関しての質問](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000TjDZf)

:::note
標準機能では難しですね。アイデアにはあがってはいるのですが... 

https://ideas.salesforce.com/s/idea/a0B8W00000Gdq5vUAB/list-view-button-ordering

カスタムコンポーネントを作成すれば、かなり自由に配置できるとは思います。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/63b0a526-6a7b-43be-baf0-30af5d196923.png)
:::
VScodeで押さえておくべき便利ショートカット

#VScodeで押さえておくべき便利ショートカット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861809/33d79bd0-1001-3e21-66ac-71d287375cfb.png)

#参考
Visual Studio　Code (Keyboard shortcuts for macOS)
https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf

Visual Studio Code キーボード ショートカット
https://qiita.com/oruponu/items/ae9c720d4522c1606daf

VSCodeでなるべくマウスを使わない開発環境をがんばる
https://qiita.com/y-tsutsu/items/cfe89c0168f40a8fb353
メール-新しいメールの下書きから以前のメールコンテンツを削除します（ケース）

Casesの新しいメールの下書きは、以前に送信されたメールを新しく開いた下書き（空白とテンプレート）でキャプチャしています。以前のメールフィードが新しい下書きに表示されないようにするにはどうすればよいですか？

オブジェクトマネージャ->ケース->ボタン、リンク、およびアクション->「空白の電子メール」と呼ばれる新しいアクションに移動して、ケース固有のアクションを作成できます。オブジェクト固有のアクションは、それをケースにリンクします。 

このケース固有のオブジェクトアクションでは、「HTMLBody」の事前定義された値を空白の文字列「」として設定できます。
 

スタッフが必要に応じてトレッドを含めたり除外したりできるように、ページレイアウトに「Eメール」と「空白のEメール」の両方のアクションを含めることができます

You can create a Case Specific Action by going to Object Manager --> Cases --> Buttons, Links and Actions --> New Action called 'Blank Email'. The object specific action will link it back to a Case.
 

For this Case specific object action, you can set a predefined value for "HTML Body" as blank string "".
 

You can include both 'Email' and 'Blank Email' action on the page layout so that staff can include or exclude the tread as needed.


https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A8qcTSAR


# 元のメール下書き作成者でない場合、組織全体のメール アドレスに関連付けられた下書き状態のリスト メールを編集することは可能ですか?

+ [Is it Possible to edit a List Email in draft status that's associated to an Organization-Wide email address if you're not the original email draft creator?](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000SVoQw)
DataGridView.SelectedRowsの格納順序

#はじめに
DataGridViewのSelectedRowsってどういう順番に格納されているのかいまいちわからない。

|  Index  |  SeqNo  |
| ---- | ---- |
|  1  |  00101  |
|  2  |  00102  |
|  3  |  00103  |
|  4  |  00104  |

というデータがあったときに、下から４番目、２番目、１番目という順番で選択した時とかね。

どういう順番に選択したとしてもGridの上から順番に処理がしたい！
と悩んでいた時に「**SortedDictionaryクラス**を使えばいいんじゃないか？」という天の声が。
※忘れたころに使うので備忘録として


# SortedDictionaryって何？
```VB
SortedDictionary(Of TKey, TValue)
```
```cs
SortedDictionary<TKey, TValue>
```
で、TKeyの昇順に並び替えてくれるっぽい。


DataGridViewの行を複数選択した時、Gridの先頭から順番（昇順）にデータ（SeqNo）を取得したいので

```
TKey -> Index
TValue -> SeqNo
```
とすればいいのか。ふむ。なるほどな。

# 実装してみた

```vb:sample1.vb
Dim sortedDictionary As New SortedDictionary(Of Integer, Integer)
For Each dataGridViewRow As DataGridViewRow In DataGridView1.SelectedRows
    sortedDictionary.Add(dataGridViewRow.Index, dataGridViewRow.Cells("SeqNo").Value)
Next
```
```cs:sample1.cs
var sortedDictionary = new SortedDictionary<int, int>();
foreach (DataGridViewRow dataGridViewRow in dataGridView1.SelectedRows)
{
    sortedDictionary.Add(dataGridViewRow.Index, Convert.ToInt32(dataGridViewRow.Cells["SqlNo"].Value));
}
```

# 値の取り出し方はこんな感じ

```vb:sample2.vb
For Each kvp As KeyValuePair(Of Integer, Integer) In sortedDictionary
    Console.WriteLine(kvp.Value)
Next
```
```cs:sample2.cs
foreach (KeyValuePair<int, int> kvp in sortedDictionary)
{
    Console.WriteLine(kvp.Value);
}
```
なんか他にいい方法、記述がありそうだけどもね。

# 追記
Linqを使ってみよう。

```vb:sample3.vb
Dim query = From r As DataGridViewRow In dataGridView1.SelectedRows
            Order By r.Index
For Each r In query
    Console.WriteLine(r.Cells("SeqNo"))
Next
```
```cs:sample3.cs
var query = from DataGridViewRow r in dataGridView1.SelectedRows
            orderby r.Index
            select r;
foreach (DataGridViewRow r in query)
{
    Console.WriteLine(r.Cells["SeqNo"]);
}
```
なんかこっちのほうがすっきりするね。
【PHP学習_備忘録】 定数？スーパーグローバル変数？マジック定数？

## はじめに。
PHPの学習備忘録です。
今日は変数や定数についてアウトプットしていきます。

#定数とは？

#### 定数とは一度データを入れたら入れ変えることができない変数
固定的データを変数に入れる時に使用する。

定数の命名規則
・$は先頭につけない
・半角英数字と_(アンダーバー）が使える
・英字の大文字、小文字は区別されます。

【定数の作り方】

define関数を使う
constキーワードを使う

```
define 関数 -定数を定義する
define(定数名, 定数の値);

例
define("MAX_DISPLINE",15);
echo MAX_DISPLINE;
```

```
constキーワード 
const 定数名 = 定数の値;

例
const MAX_DISPLINE = 15;
echo MAX_DISPLINE;
```

こんな感じで定数の作り方は`２つ`あるってことですね。


#スーパグローバル変数とは？

PHPで、自動的に作られる変数のこと。
どんなものがあるか行列を作りました。
こういったデータが格納されます。

| No |    内容     |    説明    |
|---:|-------------|------------|
| 1  |   $GLOBALS |  グローバル変数         |
| 2  |  $_SERVER  | サーバ情報および実行時の環境情報  |
| 3  |  $_GET  | GETメソッドで渡された変数の連想配列|
| 4  |  $_POST  | POSTメソッドで渡された変数の連想配列|
| 5  |  $_FILES  | アップロードされたファイルの情報|
| 6  |  $_COOKIE  | クッキー情報|
| 7  |  $_SESSION  | セッション情報|
| 8  |  $_REQUEST  |$_GET,$_POST,$_FILESの内容をまとめたもの  |
| 9  |  $_ENV  |環境変数  |

ちなみにクッキー？セッション？っていう方はこちらの記事がわかりやすかったので貼っときます。

https://www.engilaboo.com/definitely-understand-cookie-session/



#マジック変数とは？
マジック定数という特別な定数があり、これも自動的につくられる。
特徴：マジック定数の名前の前後にはアンダーバーが２つ並べられる


| No |    内容     |    説明    |
|---:|-------------|------------|
| 1  |  ＿LINE＿ |  ファイル内での現在の行番号         |
| 2  |  ＿FILE＿  | ファイル名のフルパスとファイル名  |
| 3  |  ＿DIR＿  | そのファイルの存在するフォルダ名|
| ４  |  ＿FUNCTION＿  | 関数名|

# 最後に

本日は定数について学習しました。
次は配列について学習してきます。
Pythonを使って、PDFファイル中の任意の文字列を変換する

pdf-redactor を使って可能でした。
https://github.com/JoshData/pdf-redactor

# Install

https://github.com/JoshData/pdf-redactor からZIPファイルをダウンロード

ライブラリをインストールする。
 ```
 pip3 install -r requirements.txt
 ```

# 構文ファイルを書く

この例ではPDF ファイル中の 123456 を、ABCDEFに置換している。

 ```hoge.py
 import re
 from datetime import datetime
 
 import pdf_redactor
 
 options = pdf_redactor.RedactorOptions()
 options.content_filters = [
     (
         re.compile(u"123456"),
         lambda m : "ABCDEF"
     ),
 ]
 pdf_redactor.redactor(options)
 ```
 
# 動作させてみる

 ``` conv.bat
 python hoge.py < input.pdf > output.pdf
 ```

# 諸問題

PDFはフォントを埋め込むため、ドキュメント中で使用されていない文字に置換しようとすると、文字が歯抜けになります。。
git pushの接続方式をhttpsからsshに切り替える

@ttdodaさんよりコメントにてご指摘をいただき編集させていただきました。
ありがとうございました!

※私自身@ttdodaさんからご指摘いただいて知ったのですが**GitHubはhttpsのアクセストークンでの接続を推奨している**ようです。そちらの方法は最後に記載していますので興味のある方は参照ください。

---

2021年8月13日githubでhttpsで~~git pushなどのコマンドが使えなくなりました。~~
git pushなどを実行すると以下のメッセージが表示されるようになりました。

```errror.sh

remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.

```

これはざっくり言うと~~GitHubへの接続方式の一つhttpsによる認証ができなくなりましたよという内容で~~
HTTPSでの認証でアカウントパスワードが使えなくなったというものです。
影響範囲の詳細はエラーメッセージ内のURLを参照してください。
https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/

※以下exampleは自分の環境の値に置き換えて試してみて下さい。

# ローカルからリモートの設定を確認
ローカルとはプッシュする時のプッシュ元
リモートとはプッシュした時のプッシュ先
のことです。
ローカルの多くは自分が操作しているPCの事を指します。
以下のコマンドは自分が操作しているPCのgitを設定している
ディレクトリのルート（一番上の階層）で打ちます。

```remote.sh

$ git remote -v
origin  https://github.com/example/sample_app.git (fetch)
origin  https://github.com/example/sample_app.git (push)

```

これでリモートにhttpsで接続していることが確認されました。

# gitのリモートを変更します。
ここで一つ確認をします。
![github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169482/288b00db-53c3-852f-c5fc-b8ec2179d2ac.png)
↑これはGitHub上のリモートリポジトリ画面のCodeをクリックすると表示されるのですが
画像のところでsshのアドレスが表示されていない場合はGitHubにkeyが登録されていない可能性があります。
一度以下のアドレスにアクセスしてみて登録がなければ先に登録を行ってみて下さい。
https://github.com/settings/ssh

アドレスが取れた場合はローカルにて以下を打ちます。

```chnage.sh

$ git remote set-url origin git@github.com:example/example_app.git

#以下のコマンドで変更されたか確認します。変更されていれば成功です。
$ git remote -v
origin  git@github.com:example/example_app.git (fetch)
origin  git@github.com:example/example_app.git (push)

```

あとは以下の手順でssh keyを新たに作成して登録すればpushができるようになると思います。
[GitとGitHubをSSHで接続する](https://qiita.com/SwuBHj8aKGqBKHet/items/cb8d212048eb9075d117)

# どうしてもhttpsでgit pushがしたい｜GitHub推奨
そんな時はトークンが使えます。
１．GitHubでログインした状態で画面右上の[ユーザーアイコン]をクリックします。
２．[Settings]をクリックします。
３．[Developer settings] をクリックします。
４．[Personal access tokens]をクリックします。
5．[Generate new token] をクリックします。
6．トークンの名前（任意）、有効期限、権限を設定してトークンを作成します。
![githubtoken.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169482/2abe9b91-2320-a295-6d5f-d84ebf068800.png)
自分の場合は↑のように設定しましたがチェックをはずすと権限を絞れます。
７．トークンが表示されますのでメモします。画面遷移すると確認できなくなりますのでご注意下さい。
このトークンをパスワードの代わりに使うとhttpsでgit pushができました。
（検証環境　：　cloud9 →　GitHub）

# 参考ページ
[個人アクセストークンを使用する](https://docs.github.com/ja/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)
Linuxインストール後の初期設定

さくらのVPSにてOSインストール後の設定です。
OSはCentOS7で行いました。

この記事はぶっちゃけ言って自分用。
これまで何回もOSの再インストールを余儀なくされており
フローとコピペで再現性を高めるために書きました。

どなたかの参考にもなれば幸いです。


# SSHにて接続
```
# ssh root@xxx.xxx.xxx.xxx
```



# ユーザー追加
### コマンドで追加する
```
# adduser username
# passwd  username
```

### rootで接続できないように設定を変更する

```
# cd /etc/ssh
# cp sshd_config sshd_config.old
# vi sshd_config
```
上記Vimにて、下記のように書き換える

```
#Port 22
↓
Port 10022

#PermitRootLogin yes
↓
PermitRootLogin no
```




### sshサーバーであるsshdを再起動

```
# systemctl restart sshd.service
```



# SELinuxとファイヤーウォールの変更
### SELinuxの設定変更コマンドをインストール
```
# yum -y install policycoreutils-python
```

### SELinuxで10022ポートを許可
※ポート番号は、他の割り当てと被らなければ何でも良い（2222　とかでもOK）

```
# semanage port -a -t ssh_port_t -p tcp 10022
```
ポート許可を確認

```
# semanage port -l | grep ssh
ssh_port_t                     tcp      10022, 22
```

ポート許可を確認

```
# semanage port -l | grep ssh
ssh_port_t                     tcp      10022
```



### ファイアウォールのSSH設定ファイルを変更する
SSH設定ファイルをコピーする

```
# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
```

コピーしたssh.xml を、vimで編集する

```
# vi /etc/firewalld/services/ssh.xml
```

変更箇所

```
<port protocol="tcp" port="22"/> 
↓
<port protocol="tcp" port="10022"/> 
```

ファイアウォール再起動

```
# firewall-cmd --reload
FirewallD is not running
```

※上記のように表示された場合は、下記でファイアウォール起動して、念のために再起動

```
#systemctl start firewalld.service
success

# firewall-cmd --reload
success
```

### 念のために、sshサーバーであるsshdを再起動

```
# systemctl restart sshd.service
```

# 22番以外のポートに繋がらない場合
私の場合、そうでした。
さくらのVPSで、何をしても22番以外のポートが通らない。。。
随分時間を使いましたが、原因は
さくらのVPSのパケットフィルタをオンにしている事でした。
SSHの22番しか通らない設定となっていたので、
管理画面から、パケットフィルタをオフにする事で解決しました。
[React Native] Emulatorか実機か判定する

## はじめに
開発初期の段階で、Emulator（ローカル環境）ではdockerでたてたサーバーとAPI接続して試したいけど、TestFlightやBuilderXなどにデプロイして実機でテストするときはダミーデータを使いたい！ということがあったため、備忘録に残しておきます。

## 結論
早速、調べてみると、StackOverflowに同じお悩みを持っている人がいました

https://stackoverflow.com/questions/34727912/react-native-how-can-i-detect-if-my-code-is-running-in-the-simulator

なるほど、[react-native-device-info](react-native-device-info)　というライブラリで判断できるみたいです。
このライブラリは様々なデバイス情報を取得するためのライブラリで、iOS、Android、Windows、Webのそれぞれ細かく取得できる情報が記載されています。 [各種APIの説明はこちら](https://github.com/react-native-device-info/react-native-device-info#api)

今回はエミュレーターかどうかを判別するための  [:link: `isEmulator`関数](https://github.com/react-native-device-info/react-native-device-info#isemulator)を用いるだけですが、プロジェクトを進める上で他のAPIを使う場面も出てきそうです

##　おまけ（実装）
react-native-device-infoは汎用的に使える便利そうな関数が多いので、`utils`に書きたいと思います。
アーキテクチャは人それぞれかと思いますが、（特にReact Nativeは...）私の場合は、root直下に`src`ディレクトリを作成し、ファイル / フォルダはすべてその中に追加していっています。
今回は`src/utils`フォルダの中に`deviceInfo.ts`というファイルを作成しました。（JavaScriptの人は`deviceInfo.js`）


```ts:deviceInfo.ts
import DeviceInfo from 'react-native-device-info'

const isEmulator = () => {
  // https://github.com/react-native-community/react-native-device-info#isemulator
  return DeviceInfo.isEmulator()
}

export default { isEmulator }
```

特に`isEmulator`関数は、開発の途中で使わなくなる可能性が高いので、モジュールとしてロジック部分と分割しておいた方が、保守しやすいかと思います。










[react-native-device-info]: https://github.com/react-native-device-info/react-native-device-info
【個人開発】PDFに日付を入れるwebサービスを作りました

# PDFに日付を入力できるwebサービスを作りました

PDFに日付や時刻を入れるwebサービスを作りました。

https://putdateinfile.online/pdf/

使い方はかんたん。ブラウザ画面に対象のファイルをドラッグ&ドロップ→ダウンロードボタンをクリックするだけで、日付・時刻入りのファイルをダウンロードできます。


## 開発の背景

業務上の理由から、書類(PDF)や画像(JPG・PNG)に日時を入れて管理したいと思うようになりました。
いったんフォルダに保存したファイルは、必要に応じて紙にプリントして、時系列で並べ直すこともあります。だからファイル名だけではなく、書面や画面に日時を入れるかたちにこだわりました。

![printer_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625595/d7b3a601-d776-c5d3-27c3-8fead556a69a.png)




これを実現するためには、どんなツールやサービスが必要で、どういう環境があればいいのか。
そう思って、いろいろと調べてみると、「意外と面倒」なことに気づきました。


![Adobe_Reader_001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625595/747fd84b-00b8-8ff5-9b58-887ab99a9b2f.jpeg)

PDFにタイムスタンプを入れるためには、Adobe Acrobat DCが必要ですが、これは有料。その他のアプリやサービスもおおむね有料であったのと、ヘッダやフッタを追加してから日付を設定する、という手間の多さもネックになりました。

![macwin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625595/93066df3-5e52-1d58-0c74-b7fd24da4949.png)
JPG・PNGに関してはMacにもWindowsにも画像編集ソフトがありますが、テキストボックスを挿入して日時を打ち込んで…という作業がやはり面倒。

求めていたのは、無料で、こちらがどんな環境でも、ファイルをドラッグ&ドロップするだけで、現在の日時を入れられるサービスです。

同じような悩みをお持ちの方もいると考えたため、自分で作って、公開することにしました。

## 使用した技術

##### 開発環境

+ Python-3.7.4
+ Flask-1.1.2
+ jinja2-2.11.3


PDFに関しては、pdfrwやreportlabなどのライブラリを使用しました。
(参考にした記事)

https://qiita.com/mototoke/items/7fc4c65305c4180521e4

JPG・PNGに関しては、Pillowを使いました。
(参考にした記事)

https://qiita.com/xKxAxKx/items/2599006005098dc2e299


## その他のポイント

ラジオボタンを選択することで、より詳細な設定が可能です。


##### 日付表記
![hyoki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625595/bac34749-0954-6e45-c508-d7a0f35e43c0.png)
秒単位で表記するものから、時刻を入れずに日付のみの表記も、設定できるようにしました。

##### ファイル名に日付を入れる場所
![filename.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625595/4f16b5f8-0f8e-c979-5e0e-a35c4e00a8b1.png)

日付をファイル名に入れる時、後に入れるか、前に入れるかを決めることができます。例えばファイル名の前に日時を入れれば、フォルダ内のファイル名をソートすることで、時系列に並べ替えることができます。


## ターゲット

![syorui_hakobu_joushi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625595/66342003-92e4-5d9a-6622-6700edfddbda.png)



最後に、このwebサービスが主に活躍するのは、DXのあまり「進んでいない」職場であると考えています。

つまりアナログで、紙の書類やFAXをいちいちスキャンして、保存したり共有している職場。さらにその保存したデータを必要に応じて、また出力したりしている職場。そういう所で記録を残すためのツールです。

また、学術方面でも役立てると考えています。例えば自然観察の画像や書類に記録を残したい時、時系列で管理したい時などです。身近なところでは夏休みの自由研究から、大学などの専門的な研究機関でも、資料の記録や整理にご利用いただけると考えています。

以上になります、最後までお読みいただきありがとうございます。
ESXiからLinuxサーバ（CentOS）へパスワードなしでSSHログインする方法

# 目的
ESXiからLinuxサーバ（CentOS）に対して、パスワードなしでSSHでログインする。

# 背景
ESXi配下の仮想マシンを別サーバにバックアップするとき等でスクリプトで動かしたいときに必要。パスワードありだと不便。

# 事前準備
事前に、ESXiの管理設定で、SSHとSSH Clientを有効にする。

# 手順
①ESXi上で公開鍵暗号を作成する。
```/usr/lib/vmware/openssh/bin/ssh-keygen -t rsa
```	
	
鍵の保存先を聞かれるのでデフォルトで、パスフレーズは入れない下記配下に2つのファイルが生成される。
```/,ssh/id_rsa
/,ssh/id_rsa.pub
```
	

②下記ファイルをSSHでログインする先のサーバの~/.ssh/配下にコピーする。先のサーバで~/配下に.sshディレクトリがない場合は新規作成。
```/,ssh/id_rsa.pub
```
	
③ESXiからSSHでログインする先のサーバの~/.ssh/id_rsa.pubの名称を「authorized_keys」に変更する。これでESXiからSSHが可能になる。
POWERSHELL　エクセルのリストからフォルダ全てを作成する、作成先で重複してるか確認

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/1439c349-f826-1e92-9710-aa5d0b658b77.jpeg)

assetの中見が右

```powershell
try{
        # 実行ポリシー指定
        Set-Executionpolicy Bypass -Scope CurrentUser -Force
        # Excelのリストを抜き出すテキストを作成
        New-Item all.txt -ItemType File
        # Excelオブジェクト作成
        $excel = New-Object -ComObject Excel.Application
        $excel.Visible = $false

        # リストのExcelを読み込み
        $book = $excel.Workbooks.Open("\item_list.xlsx")

        # readシート取り出し
        $sheet = $excel.Worksheets.Item("read")

        # A行のリストをall.txtにすべてぬきだす

        $i = 1
        # セルのテキストを取得（設定は逆)
        $text1 = $sheet.Cells.Item($i,1).Text

        
        while ($text1 -ne "")
        {
            write-host $text1
            
                Write-Output $text1 | Out-File -Append "\all.txt"
            
            $i = $i + 1
            $text1 = $sheet.Cells.Item($i,1).Text

        }

        
        



        # 閉じる
        $excel.Quit()

} finally {

        # null破棄
        $excel,$book,$sheet | foreach{$_ = $null}

}


#重複して作れなかったリストを初期化
Clear-Content "do_not_list.txt"

#作るリストを配列で取得
$getlist = (Get-Content \all.txt) -as [string[]]

#作成先のパスを指定
$targetFolder = "パス"

#重複を確認するために作成先のフォルダ名を配列で取得
$itemList = Get-ChildItem -Name $targetFolder;

#重複して作れなかったリストをdo_not_list.txtに書きだし
foreach($item in $itemList)
{
    foreach($hostname in $getList)
    {
        if($hostname.equals($item)){
            write-host $hostname
            Write-Output $hostname | Out-File -Append "do_not_list.txt"
            
        }

    }
    
}

#mihonフォルダを中身ごとコピー、リストの名前のフォルダを作成
foreach ($word in $getlist) {

    #mihonフォルダの名前を$wordに変更してコピー
    $copymoto = "コピー元のフォルダのパス"
　　$copypass = "コピー先パス"
    #コピー先に新しい名前のフォルダでパスを作る
    $copypassword = $copypass + $word
    #コピー先に見本フォルダをコピー後名前を変更するためのパス
    $copypassmihon = $copypass + "mihon"
　　#フォルダ内全てコピー
    Copy-Item $copymoto $copypass -Recurse
　　#mihonフォルダをリネームする
    Rename-Item $copypassmihon -newName $copypassword

}
Remove-Item \all.txt


```
【ServiceNow】テーブルの自動番号に関するTIPS

# 概要
ServiceNowのテーブルにはレコードに自動番号を割り振る機能が存在します。この番号を割り振ることで、そのテーブル内でのレコードを認識しやすくすることができます。今回はこの自動番号を設定する方法やTipsを紹介していきます。

#基本設定
###自動番号を設定する方法
自動番号を設定するにはテーブル作成時に設定することができます。
コントロールタブの"自動番号"にチェックを付けることで、以下のフィールドを設定することになります。

| フィールド名 | 説明 |
|:--|:--|
|プレフィックス|番号の前に着ける文字列を設定します。作成するテーブルをイメージしやすい文字列にするのが一般的です。|
|番号|レコード作成時に最初の割り振られる番号です。この番号から＋１ずつ割り振られていきます。|
|桁数|番号の桁数を設定します。|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/bba448e1-5058-92eb-227c-a80355654e9b.png)


###自動番号の設定画面
フィルターナビゲーターで[システム定義] > [番号のメンテナンス]に遷移することで、全ての自動番号を管理しているテーブル[sys_number]にたどり着くことができます。

このテーブルでは、上記のフィールドを編集できるほか、現在の番号のカウントを記録しているので、カウンタ編集することで、次に作成されるレコードの番号を編集後のカウンタから始めることができます。

↓の関連リンクの”カウンタを表示”をクリックすることで、カウンタ編集画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/5a7a1ba1-583b-68fe-a8e8-2b46aeb813f2.png)


#TIPS１ 番号の抜けを解決する
インスタンスのデフォルト設定では、番号のカウントはレコードが挿入された時ではなく、新規でフォーム画面を表示した段階でカウントされてしまいます。この場合、新規でレコードを作成しようとしたが"やめた"という時に、番号がカウントされ、次にレコードを作成する時に、１つ進んだ番号でレコードが作成されてしまいます。

![test1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/f5bfe43b-f0a3-de00-cad6-10699fbc13c8.gif)

###解決方法
フィルターナビゲーターでシステムプロパティ　＞　システムに遷移し、以下のプロパティをアクティブします。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/a964fc71-c940-7bc5-0938-51651004a50e.png" width = 400>

これをアクティブにすることで、レコード作成時は番号フィールドは空ですが、空のまま作成することで、自動で未使用の番号を割り振ってくれるようになります。

※レコード作成時に番号フィールドが書き込める状態になっているので、意図しない番号が書き込まれないように、読み取り専用にすることをオススメします。

#TIPS２ 番号を一意なものに設定する。
普通に利用する場合、番号が被ることはめったにないですが、【運用中にカウンタの番号を変更した】、【スクリプトで番号を制御している】等を行っている場合、番号が一意ではなくなる可能性があります。

###解決方法
挿入時のビジネスルールを作成しスクリプトを作成します。
公式ドキュメント：[Enforcing unique numbering](https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/field-administration/concept/c_EnforcingUniqueNumbering.html)



###注意
以下の一意フィールドを設定する方法もありますが、この場合、番号が重複した場合レコードは挿入できずエラーになるため、直接的な解決方法にはなりません。

番号フィールドの設定画面フォームから”一意”フィールドのチェックボックスをTrueにしてください。
"一意"フィールドない場合は、フォームを編集し表示してください。
※設定時点で存在するレコードの番号フィールドが一意である必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/dbc33006-2216-53bf-7df1-faf0d708e097.png)

#TIPS３ 既存テーブルに番号を付ける
既に存在するテーブルにも番号フィールドを付けることが可能です。

###解決方法
フィルターナビゲーター>システム定義>番号メンテナンスに遷移します。
新規ボタンを入力し、基本設定通りにフォームを入力します。テーブルフィールドには番号を追加したいテーブルを参照させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/333b54c3-9c17-ef71-b7ce-045c3ea7d5b8.png)

上記のレコードを追加することでテーブルに自動で番号フィールドが追加されます。





#TIPS４ 番号が自動で割り振られる処理を理解する。
そもそもこの番号はどのような処理で割り振られているのでしょうか？実はビジネスルールが存在します。
番号フィールドの設定フォームのデフォルト値を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/2fbe58d7-72dc-1621-7fb1-67fde406f7a9.png)

またビジネスルールテーブルを確認すると、上記のルールが存在していることが分かります。
デフォルト値はjavascriptを実行してglobalテーブルのgetNextObjNumberPaddedを実行した結果を返した値ということになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425100/0b18be50-1929-91ef-5689-755e5220ca25.png)
ユーザ権限とアクセス権

【umask値】
ファイルやディレクトリを作成する際のパーミションを設定

ex:umask022
1桁目は自分のパーミションなので、0(rwx)
2桁目はグループのパーミション、その人たちに見えてよいか、更新できてよいか決める(r--)
3桁目はその他のパーミション6(---)か2(r--)が妥当

ファイルを新規作成する時のパーミションは666
umaskが022なら新規ファイルのパーミションは644(rw-r--r--)
IBM Security Verify API + Pythonでユーザー情報一覧を取得する

# はじめに

以前の記事で、/v2.0/Usersで一度に取得できるユーザー情報の上限が2500件であるとご紹介しました。

[IBM Security Verify API ユーザー検索(/v2.0/Users)利用上の注意点について](https://qiita.com/fitz/items/5b29e993747ce0dcdd03)

2500件を超えるユーザーを取得する方法として、javascript / nodejsを使った手法の情報がありました。

**javascript / nodejsを使った方法**
https://docs.verify.ibm.com/verify/docs/looking-up-users

こちらの概念を参考にPythonでユーザー一覧を取得してみました。

#1.出力結果イメージ

約10000ユーザー登録してエクスポートの確認を行いました。

1列目にユーザー名、2列目にユーザーID(Verify内で採番されているユニーク値)をエクスポートしました。
![userlist-python1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/4cad5100-a1b5-e8a5-972e-59da71bda8f5.png)

#2.Pythonのサンプルコード

url/clientid/clientsecretは、環境にあわせて見直しください。

```getuser.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import json

url= "https://<テナント名>.verify.ibm.com"
clientid = "クライアントID"
clientsecret = "クライアント秘密鍵"
block = "2021-01-01T00:00:00Z"


# トークンを取得する
headers = {
    "Accept": "application/json",
    "Content-Type": "application/x-www-form-urlencoded"
}

payload = {
    "grant_type": "client_credentials",
    "scope": "openid",
    "client_id": clientid,
    "client_secret": clientsecret
}

#print(payload)
response = requests.request("POST", url+"/v1.0/endpoint/default/token", data=payload, headers=headers)
#print(response.text)
output = response.json()
access_token = output["access_token"]
print(access_token)
masterlist = []


# ユーザー情報を取得する(2000件)
headers = {
    "Authorization": "Bearer " +access_token
}

#ループ処理判定フラグ
flag = True

while flag:
 response = requests.request("GET", url+"/v2.0/Users?filter="+"meta.created ge \"" + block + "\"&sortBy=meta.created&sortOrder=ascending&count=2000", headers=headers)
 print(url+"/v2.0/Users?filter="+"meta.created ge '" + block + "'&sortBy=meta.created&sortOrder=ascending&count=2000")
 
 #print(response.text)
 output = response.json()

 if output["totalResults"] < 2000:
  print("yes <2000")
  output = output["Resources"]
  #検索結果を配列に設定
  masterlist.extend(output)
  print (len(masterlist))
  flag = False
  
 else:
  print("no >2000")
  output = output["Resources"]

  #配列の最後の2つのmeta.created が等しい場合は、最後の配列を削除する
  while output[len(output)-1]["meta"]["created"] == output[len(output)-2]["meta"]["created"]:
  #末尾の配列を削除する
   output.pop()
  
  #末尾の配列のmeta.createdを変数に指定
  block = output[len(output)-1]["meta"]["created"] 
  print(block)
  output.pop()
  
  #検索結果を配列に設定
  masterlist.extend(output)
  print (len(masterlist))

#結果出力 
for i in masterlist:
 print(i["userName"]+","+i["id"])
```

#3.IBM Security Verify Developer PortalのAPIリファレンスについて

APIリファレンスページに、cURL/Node/Puby/PHP/Pythonのサンプルコードが公開されています。
https://docs.verify.ibm.com/verify/reference/handletoken

言語を切り替えることで各言語に対応したサンプルコードが表示されます。

![userlist-python2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/0a7ebb5e-8441-bedc-6c61-aa76801c34f7.png)

#最後に

2500件を超えるユーザー情報を取り扱うためのサンプルコードをご紹介しました。
生物系データベースの活用事例

　世の中にはたくさんの生物系DBがあります。それぞれどんな時に活用できるのか、著者の実例をご紹介いたします。参考になりますと幸いです。

#NCBI

https://www.ncbi.nlm.nih.gov/

　ゲノムや遺伝子の情報など、様々なジャンルに特化したDBを持つ総合DBです。[DDBJ](https://www.ddbj.nig.ac.jp/)、[EBI](https://www.ebi.ac.uk/)を含めた3つは各国主導のもと活動が盛んで、また連携をとっているため大量のデータが集まっています。

###キーワードに対して何の情報が存在するのかを確認する

　求める情報がどの個別DBにあるかわからずともキーワードで横断検索できるので、例えば「ゲノム配列がDBに登録されているか」といったことがわかります。

>例）「metagenome」で検索
>https://www.ncbi.nlm.nih.gov/search/all/?term=metagenome

metagenomeはTaxonomyにもあるんです。

#DDBJ

https://www.ddbj.nig.ac.jp/

###シーケンスデータのダウンロード

　[DRA](https://www.ddbj.nig.ac.jp/dra/index.html)では公開されているシーケンスデータを様々な条件で絞り込んで、ダウンロードできます。解析を試してみたい、論文に使われたデータを実際に見てみたい、こんな条件でシーケンスがされた事例があるのか、といったときに便利です。

>例）Humanのシーケンスデータ
>https://ddbj.nig.ac.jp/DRASearch/query?organism=Homo%20sapiens


#Ensembl

https://ensembl.org/

###リファレンス収集

　種別ページに関連情報が集まっており、変異解析を行う際など、全てのデータに簡単にアクセスできます。また、ゲノムリファレンスを基準に集められているため、ダウンロードしたアノテーション情報を使って間違ったゲノム位置の情報を参照してしまう、といったミスも防げます。

>例）Humanのページ
>https://ensembl.org/Homo_sapiens/Info/Index

植物はサブドメインのページがあります。
https://plants.ensembl.org/

###対応表を作成1

　[BioMart](https://www.ensembl.org/biomart/martview)を使って対応表が作れます。Gene IDに対するProtein IDを見たり、GO term を付けたりできます。Ensemblのバージョン、生物種を選択してしばらく待つと、Attributesなど設定が可能な内容が出てきます。

#UCSC

https://genome.ucsc.edu/

###WEB上でゲノムデータ描写
　[Genome Browser](https://genome.ucsc.edu/cgi-bin/hgTracks)でリファレンスを準備する必要なく閲覧できます。アノテーション情報が豊富で、個別に表示/非表示切り替えができます。さらに自身の持っているデータを使ってトラックの追加も可能です。

###対応表を作成2
　[Table Browser](https://genome.ucsc.edu/cgi-bin/hgTables)でBioMartのように表の作成が可能です。それぞれカラム列に選べる情報が異なるので、ほしい情報に合わせてどちらを使うかを選びます。
ソリューションアーキテクトの少し難しいサービス

AWS認定ソリューションアーキテクトアソシエイト（SAA）の勉強をしていて、難しかった単語を一つずつ確認していきます。

###VPCエンドポイント
>AWSのVPCエンドポイントとは、異なるVPCまたは異なるリージョンに配置されたAWSサービス同士の通信を、インターネットを経由することなくAmazonのネットワーク内で繋ぐサービスのことです。

https://www.fenet.jp/aws/column/tool/570/

 - インターネットを経由せずサービス同士を繋げる
 - ゲートウェイエンドポイント、インターフェイスエンドポイントの2つの機能
 - ゲートウェイエンドポイントはVPCにゲートウェイを設置することで通信を行う
 - インターフェイスエンドポイントはVPC内に設置しインターネットゲートウェイを介さずに通信を行う

###プレイスメントグループ
>Amazon EC2にはプレイスメントグループと言う概念があり、ネットワークパフォーマンスの向上や物理サーバ障害時の影響範囲を限定させるために、インスタンスをグループ化することができます。

https://dev.classmethod.jp/articles/ec2-placement-group-strategy/

 - クラスターは互いに低レイテンシーなノードが高いパフォーマンスを発揮
 - 分散は物理ラックの単位でインスタンスを配置　、物理障害による影響を隔離
 - パーティションは大規模な分散システム、クラスターをいくつも作り冗長化

###SAML
>SAMLとは、異なるドメイン間においてユーザー認証情報を繋げる、マークアップ言語です。OASISによって策定された標準規格で、Security Assertion Markup Languageの頭文字からSAMLと表されます。

https://it-trend.jp/single_sign_on/article/75-0019

 - 主にシングルサインオン（一度のログインで複数サービスへ同時ログインする仕組み）に使用される
 - 2005年にSAML2.0へバージョンアップ

###
webpackとbabel_loaderでnode_modules以下のES5で書かかれていないコードをトランスパイルしたい。

# 結論

.babelrcではなくbabel.config.jsonというファイルにbabelのpreset設定を書く

# 過程

## Notion SDK と Claspを使ってGoogle Scriptのコードを書きたかった
https://github.com/makenotion/notion-sdk-js

## Webpackでバンドルしたところ以下のエラーが
```
Error: Line 289: Unexpected token ...
```

## コードを調べると分割代入をしていた模様
```js
        const headers = {
            ...this.authAsHeaders(auth), // Line 289
            "Notion-Version": __classPrivateFieldGet(this, _Client_notionVersion, "f"),
            "user-agent": __classPrivateFieldGet(this, _Client_userAgent, "f"),
        };

```

## これを Webpack × babelでトランスパイルしようと以下の設定ファイルを作成
```webpack.config.js
// webpack.config.js
/* eslint-disable @typescript-eslint/no-var-requires */
const path = require("path");
const GasPlugin = require("gas-webpack-plugin");
const modulesToTranspile = ["@notionhq/build"];
module.exports = {
  mode: "development",
  devtool: false,
  context: __dirname,
  entry: "./main_test.js",
  output: {
    path: path.join(__dirname, "dist"),
    filename: "index.js",
  },
  resolve: {
    extensions: [".ts", ".js"],
  },
  module: {
    rules: [
      {
        test: /\.[tj]s$/,
        include: [
          path.resolve(__dirname),
        ],
        loader: "babel-loader",
      },
    ],
  },
  plugins: [new GasPlugin()],
};

```

```json:.babelrc
{
  "presets": [
    "@babel/preset-env"
  ]
}
```

## なぜかsrc以下に書いたコードはES6でもトランスパイルされた。
`src/index.js` に以下の分割代入のコードを書いたが、問題なくトランスパイルされた

```src/index.js
const testaa = {
  a: "bcd",
  c: "efg",
};
const testaab = {
  abc: "function",
  ...testaa,
};
console.log(testaab);
```

## 色々調べて以下のことが判明
- `.babelrc` だと `node_modules` の中までは設定ファイル通りにコンパイルをしてくれない
- `node_modules` の中まで設定ファイル通りにトランスパイルして欲しいのであれば、`babel.config.json`を使う

## .babelrcのファイル名をbabel.config.jsonに変更したらエラーが消えた
本当にファイル名だけを変えてwebpackを実行したところエラーが消えた

## 参考
### 結論にならなかったもの
備忘録として結論にならなかったが参考にしたものを
https://engineer.retty.me/entry/2019/12/13/121952
https://qiita.com/yassh/items/b939f76f6a6442ebeb26
https://github.com/babel/babel-loader/issues/171
https://webpack.js.org/configuration/module/#condition

### 結論になったもの
これが結論でした。
https://babeljs.io/docs/en/configuration#babelconfigjson
laravel has と whereHas を 音速にする

has と whereHas を hasByNonDependentSubquery に置き換えるだけで速度が早くなる。

参考
https://qiita.com/mpyw/items/0761a5e44836c9bebcd5


新しめのphpとlaravelでしか動かないのでバージョンだけ注意。

```

composer require mpyw/eloquent-has-by-non-dependent-subquery
composer require mpyw/eloquent-has-by-join

```

両方インストールしておこう。


今回は、現在動いているものと同じ結果が出るのかテストしてみる


略



・・・同じ結果が帰ってくるが、発行されるSQL文が違う

何度か試したが、ほぼ確実に `hasByNonDependentSubquery` を利用したほうが早い。
これは、使える。

# 使い方

```
has と whereHas を hasByNonDependentSubquery に置き換えるだけ。
あとは全く同じ使い方でOK。
```

・少なくとも Nailphotos を持っている Nail データを取得

has 13.19
→ hasByNonDependentSubquery 10.64


```php

	$sql = Nail::with([
	        'Iines',
	        'Nailphotos',
	        'User.Photos'
	    ]
	)->has('Nailphotos');
        $res = $sql->paginate(10);


```



```php

        $sql = Nail::with([
                'Iine',
                'Nailphotos',
                'User.Photos'
            ]
        )->hasByNonDependentSubquery('Nailphotos');//置き換える
        $res = $sql->paginate(10);

```

・Nailphotos の id 167 を持つ Nail データを取得 12.11

whereHas 12.11
→ hasByNonDependentSubquery 11.35

```php

        $sql = Nail::with([
                'Iines',
                'Nailphotos',
                'User.Photos'
            ]
        )->whereHas('Nailphotos', function ($q) {
            $q->where('id',167);
        });


```


```php

        $sql = Nail::with([
                'Iines',
                'Nailphotos',
                'User.Photos'
            ]
        )->hasByNonDependentSubquery('Nailphotos', function ($q) {//置き換える
            $q->where('id',167);
        });

```

has や whereHas が早くなるのはありがたい。

# 関連したモデルを持たないもののみ取得する

```

// $sql->doesntHave('answers');
$sql->doesntHaveByNonDependentSubquery('answers');

```

マニュアルに載ってなくてテストケース読んだけど
すごいね。かゆいところまで手が届く。
【GAS】Date()で取得した現在の時間を今日の0時にする

#背景
GASでGoogleカレンダーの情報をなんやかんやしたくて、
**GASをいつ実行しても、「今日の0時0分」が欲しい！**と思いました。
文字列だけ取り出せるけど、Date型にしておきたく、少し悩んだのでメモ。

#もっとシンプルなもの
コメントにて頂きました、シンプルにsetHours利用する方法で良いのですね...！
リファレンスしっかり学びます。
ご指摘ありがとうございます！

```javascript
const date = new Date();
date.setHours(0,0,0);

Logger.log(date);
```

:::note info
14:48:40	情報	Thu Aug 19 00:00:00 GMT+09:00 2021
:::


#完成形

```javascript:Yattane.gs
var strToday = Utilities.formatDate(new Date(),"JST","yyyy-MM-dd").split("-");
const todayStartTime = new Date(strToday[0], strToday[1] - 1, strToday[2]);

Logger.log(todayStartTime);
```

:::note info
10:33:44	情報	Thu Aug 19 00:00:00 GMT+09:00 2021
:::

実行時間は10時だけど、しっかり00:00:00になってる。
これで出来た！やったね！
※まだまだキレイにできそう...

#過程とか試行錯誤
①現在時刻の取得

```javascript
  const today = new Date();

  Logger.log(today);
```
>10:33:44	情報	Thu Aug 19 10:33:44 GMT+09:00 2021

②Date→文字列に変換
この時に、年月日のみ取り出すようにしてます。

```javascript
  const strToday = Utilities.formatDate(new Date(),"JST", "yyyy-MM-dd");

  Logger.log(strToday);
```
>10:33:44	情報	2021-08-19

③ハイフンで分ける！配列に格納
splitですね。
配列なので、宣言を`const`から`var`にしました。

```javascript
  var strToday = Utilities.formatDate(new Date(),"JST", "yyyy-MM-dd").split("-");

  Logger.log(strToday);
```
>10:33:44	情報	[2021, 08, 19]

④年月日情報から、Date型を作成！

```javascript:Yattane.gs
var strToday = Utilities.formatDate(new Date(),"JST","yyyy-MM-dd").split("-");
const todayStartTime = new Date(strToday[0], strToday[1] - 1, strToday[2]);

Logger.log(todayStartTime);
```
>10:33:44	情報	Thu Aug 19 00:00:00 GMT+09:00 2021

#参考：
https://www.yoheim.net/blog.php?q=20190701

#同様の記事ありましたね、、
https://qiita.com/Bong/items/dc632edb6fe3d44f2d5b
Cloud9上でReact Native(Expo)の開発環境を作る

# この記事の目的
- AWSのCloud9を使ってReact Native(Expo)で開発できる環境を作る。
    - `expo start`したものがExpo Goアプリで動かせる
    - `console.log`を見ることができる
    - ブレークポイントでデバッグができる
 
# 前提
- 概ねこちらの記事↓を参考にさせてもらいつつ、自分がハマった部分を補足する記事です。(@1ulceさんありがとうございます！)
    - [React Native&ExpoをCloud9で誰も失敗しない開発環境構築 2020年4月](https://qiita.com/1ulce/items/2b681be5a66d8b9ee658)
- cloud9の使い方は含まない。


# 実機で動かす手順
-  [React Native&ExpoをCloud9で誰も失敗しない開発環境構築 2020年4月](https://qiita.com/1ulce/items/2b681be5a66d8b9ee658)の記事の[8. expoで新規アプリを作り、スマホからアクセスしてみる]([React Native&ExpoをCloud9で誰も失敗しない開発環境構築 2020年4月](https://qiita.com/1ulce/items/2b681be5a66d8b9ee658))まで進める。
    -  1ulceさん重ね重ねありがとうございます。LGTMは元記事につけてください。
- インバウンドルールの編集が元記事とやや異なっており、自分の場合は`Anywhere IPv4`のみの設定でOKだった。
![スクリーンショット 2021-08-19 9.52.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268579/e297298e-bbe5-2402-b0b6-ad3b8fbecf73.png)
- この後、元記事ではそのままEC2のパブリックIPv4アドレスに`exp://`をつけた`exp://18.217.1.60`みたいなURLにスマートフォンからアクセスすれば良いとあるが、そのままアクセスしても接続できなかった。
    - EC2を一度再起動すればOK
    - EC2は再起動する度にパブリックIPv4アドレスが変わるので、アクセスするURLを変更するのを忘れないように
- Webに関しては`expo start`後に`w`してから、コンソールに出てきた` › Local   │ http://localhost:19006/`をクリックしてopenを選べば自動的に`http://18.222.11.76:19006/`が開き、ブラウザで動作を確認できた
    - 元記事では`https`に接続とあるが上記の方法では`http`で問題なかった（ここらへんはchromeの設定の問題とかかもしれない）
![スクリーンショット 2021-08-19 10.01.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268579/d15fdb03-ce19-b459-0b00-8dcf91cc69b8.png)

  

# デバッグする方法
- 上記のインバウンドルールを変更した状態で`http://18.222.11.76:19000/debugger-ui/`にアクセスする。
    - `18.222.11.76`の部分はEC2のパブリックIPv4アドレスに書き換えてください。
    - ローカルでexpo開発している場合であれば`http://localhost:19000/debugger-ui`だが、EC2上で開発しているので、アクセス先を変える必要がある。
- - 画面の指示どおりに開発ツールを開いておく
- Expo Goでデバッグしたいアプリを動かしている状態で三本指で画面を長押し(iPhoneの場合)してメニューを表示し、`Debug Remote JS`をタップする
- すると、開発ツールにExpo Goでデバッグ中のものがアタッチされて、console.logやブレークポイントが使えるようになる
    - `debugger-ui`の詳しい使い方は別の記事を参考にしてください。
![スクリーンショット 2021-08-19 10.10.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268579/159bfc2d-f4ea-90f0-1889-5b023674c5ff.png)

- UIのデバッグは三本指で画面を長押ししてメニューを表示し、`show Element Inspector`を選んでから確認したい要素をタップすれば色々とみられそう。
    - 本当はReact Native Debuggerが使えると便利なのだけど、アタッチ先の設定がloaclhostにしか対応していないようで使えなかった。
    - 指でぽちぽちタップするのは面倒だが、cloud9で開発する場合には現状これしか思いつかなかった。
![IMG_B63251DFF3DC-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268579/4caeb25e-63f2-6d4e-5ca3-996e556998cb.jpeg)

# まとめ
- cloud9上でもconsole.logもブレークポイントもUIのデバッグができるため、Expo開発は一応できそう。
1分で終了させるバッチ

cronで毎分実行するバッチで、無限増殖を避けたかった。

```sh
#!/bin/sh
START_MIN=$(date "+%M")

run() {
    CURRENT_MIN=$(date "+%M")
    if [ $START_MIN != $CURRENT_MIN ];then
        echo "[quit] 1分を過ぎたので終了します。"
        exit 1
    fi
    何かのコマンド
}
run
run
run
run
run
```
CIS Amazon Web Services Foundations Benchmark v1.3 -> v1.4 の変更点

CIS Amazon Web Services Foundations Benchmarkのv1.4が出ていたので、v1.3との変更点を確認しました。

## 1 Identity and Access Management


### 1.12 Ensure credentials unused for 45 days or greater are disabled (Automated)

変更前）
1.12 Ensure credentials unused for 90 days or greater are disabled (Automated)

> 説明）
AWS IAM users can access AWS resources using different types of credentials, such as passwords or access keys. It is recommended that all credentials that have been unused in 45 or greater days be deactivated or removed.

> 和訳）
AWS IAMユーザーは、パスワードやアクセスキーなど、さまざまな種類のクレデンシャルを使用してAWSリソースにアクセスできます。45日以上使用されていないクレデンシャルは、すべて無効化または削除することをお勧めします。

使用していないIAMユーザーを無効化、削除する期間の目安が90日から**45日に短縮されました。**

## 2 Storage

### 2.1.5 Ensure that S3 Buckets are configured with 'Block public access (bucket settings)

変更前）
1.20 Ensure that S3 Buckets are configured with 'Block public access (bucket settings)

記載位置の変更です。
内容の変更はありません。

## 2.1.2 Ensure S3 Bucket Policy is set to deny HTTP requests (Manual) 

変更前）
2.1.2 Ensure S3 Bucket Policy allows HTTPS requests (Manual)

> 説明）
At the Amazon S3 bucket level, you can configure permissions through a bucket policy making the objects accessible only through HTTPS.

> 和訳）
Amazon S3のバケットレベルでは、バケットポリシーを使って、HTTPSでしかオブジェクトにアクセスできないようなパーミッションを設定することができます。

文言は変わりましたが、設定方法は変わっていません。
S3はデフォルトでHTTPとHTTPSどちらのリクエストでもアクセスできますが、HTTPは拒否してHTTPSのリクエストのみを受け付けるようにバケットポリシーを設定します。


## 2.1.3 Ensure MFA Delete is enable on S3 buckets

追加されました。

> 説明）
Once MFA Delete is enabled on your sensitive and classified S3 bucket it requires the user to have two forms of authentication.

> 和訳）
センシティブでクラシファイドなS3バケットでMFA Deleteを有効にすると、ユーザーに2つの認証手段が必要になる。

S3バケットのバージョニングとMFA Deleteを有効にします。


## 2.1.4 Ensure all data in Amazon S3 has been discovered, classified and secured when required. (Manual) 

追加されました。

> 説明）
Amazon S3 buckets can contain sensitive data, that for security purposes should be discovered, monitored, classified and protected. Macie along with other 3rd party tools can automatically provide an inventory of Amazon S3 buckets.

> 和訳）
Amazon S3バケットには機密データが含まれている可能性があり、セキュリティ目的で発見、監視、分類、保護する必要があります。Macieは、他のサードパーティ製ツールとともに、Amazon S3バケットのインベントリを自動的に提供することができます。

Amazon Macie（メイシー）を有効化します。
Amazon MacieはS3バケットをスキャンしてバケット内の機密データの情報やリスクを可視化し、適切に管理できるようにします。


## 2.3.1 Ensure that encryption is enabled for RDS Instances (Automated)

追加されました。

> 説明）
Amazon RDS encrypted DB instances use the industry standard AES-256 encryption algorithm to encrypt your data on the server that hosts your Amazon RDS DB instances. After your data is encrypted, Amazon RDS handles authentication of access and decryption of your data transparently with a minimal impact on performance.

> 和訳）
Amazon RDS 暗号化 DB インスタンスは、業界標準の AES-256 暗号化アルゴリズムを使用して、Amazon RDS DB インスタンスをホストするサーバー上のデータを暗号化します。データが暗号化された後、Amazon RDSは、パフォーマンスへの影響を最小限に抑えながら、アクセスの認証とデータの復号化を透過的に処理します。


RDSインスタンスの暗号化を有効にする。



## まとめ
Amazon Macieのことは知らなかったので勉強になりました。
システムの要件に合わせつつも推奨設定に近づけていきましょう。
Linuxについて（初学者向け）

# Linuxとは何か？
##概要
Linuxは簡単に言うと、MacやWindowsと同じOSのことです。
※OSは、コンピュータのすべてのハードウェアどを管理しているソフトウェアのことです。
##特徴

####1.オープンソースのOS（無料で可変可能なプログラム）である。
　Linuxを使う最大のメリット、それは「無料」であること。
####2．種類が豊富

　利用目的に合わせてアプリケーション（ソフトウェア）をパッケージ化したものが多く存在している。（ディストリビューション）
　ディストリビューションは、『RedHat系』、『Debian系』、『Slackware系』大きく次の3つに分類される。
　
『RedHat系』・・・Linux界隈では有名なRedHat社が開発している有償のディストリビューション

『Debian系』・・・UbuntuはWindowsをUI（ユーザーインターフェース：使用感などの画面デザイン）が似ている

『Slackware系』・・・シンプルさが特徴のディストリビューション。実績があるソフトウェアのみで構成されているため、安定性、セキュリティ体制、速度が高い点も人気の背景にある。


####3．低スペックのパソコンでも利用が出来る
　不要な機能がないコンパクトでシンプルなOSのため、低スペックのPCであっても、問題なく動作する。

##Linuxでできること
・サーバー構築
・OS設計
・組み込みシステム開発
・古いパソコンの再利用
・アプリ・システム開発　
・CUI操作の練習

##まとめ
サーバーをメインに使用されるLinuxは初心者には扱いが難しい面もあるが、
使えるようになれば非常に便利なOSである。
【Qiita】コントリビューション履歴が見れない

ユーザ名からContribution数をクリックするとContribution履歴に行けるのですが、おそらく[Contributionの算出方法が変わった](https://qiita.com/kanta_yamaoka/items/d18314ac025cd3c79667)あたりから一切見れなくなりました。

https://qiita.com/jnchito/contributions
https://qiita.com/rana_kualu/contributions
https://qiita.com/hirokidaichi/contributions
https://qiita.com/suin/contributions
https://qiita.com/icoxfog417/contributions
https://qiita.com/drken/contributions
https://qiita.com/baby-degu/contributions
https://qiita.com/Yametaro/contributions
https://qiita.com/mpyw/contributions
https://qiita.com/opengl-8080/contributions

99%の確率で502 Bad Gatewayになります。

累計Contribution数の少ない人だと見れるので、DBに適切なインデックスが貼られていないのが原因ではないかと思われます。

またContribution履歴を見れる人についても、履歴に同じものが延々表示されます。
前は同じ記事に対するLGTMやストックは最新1件しか表示されなかったはず。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/e86c8b36-f933-ad7f-7a7a-2fc132f4ff25.png)
※ユーザ選択基準は記事執筆時にトレンド1位だったというだけ

ちゃんとテストとかやってるんですかね？