OmniAICreator/Qiita-1.07M huggingface dataset:
kintoneの基本機能のみで曜日を自動計算する

# はじめに
- @Shokun1108 による [キントーンの関数で日付から曜日を計算する！](https://www.youtube.com/watch?v=LeGi-DL2Tww) 動画のパクリです
- 私とは実現方法が異なったので、私もメモ残しておきます

# 自己紹介です
[![main_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/564c7de8-6fc7-61c7-a97f-f8d0a7c9943d.jpeg)](https://www.maru-t.co.jp/painting_brush/)

- ｲｼｲｹﾝﾀﾛｳです。刷毛をつくっている会社の兼業情シスです
- kintone認定資格は3つとも取得済です

![associate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/0a8e56b0-b57c-607c-b89b-19e793c78717.png) ![appdesignsp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/12705b5d-9006-2e8c-f9de-56ec7a22b611.png) ![customization.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/d318907a-f190-2542-82da-e6ee22e1498b.png)

- その他にITストラテジストやシステム監査技術者などの国家資格をいくつか取得しています
- kintoneのカスタマイズは社内向けのみで、プラグインは作ってません（作れません）

# やりたいこと
基本機能のみで、日付選択時に曜日を自動計算したい 

# 完成！
![曜日.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/aaff4d22-6463-b6a3-21ba-deef650e6f3c.gif)

# 考え方
- kintoneの日付は [「1970-01-01 0:00:00」からの経過秒数](https://jp.cybozu.help/k/ja/user/app_settings/form/autocalc/date_format.html#autocalc_date_format_10) が値として格納されているので、1970-01-01の曜日を予め調べて基準とします ⇒ ググったらすぐ出ます。木曜日です
- 選択された日付の、1970-01-01からの経過日数を7で除算した剰余で曜日を算出します
- 剰余0が木曜日、1が金曜日、・・・、6が水曜日です


# 実装
- アプリに日付フィールド（日付）、計算フィールド（剰余）、文字列1行フィールド（曜日）を用意します
- 剰余の計算式

```
ROUNDDOWN(日付 / (60 * 60 * 24))  - ROUNDDOWN(日付 / (60 * 60 * 24 * 7)) * 7
```  
- 「1970-01-01からの経過日数」から「1970-01-01からの経過日数を7で除算した商に7を乗算した積」を減算します
- 「1970-01-01」以前の日付の場合、剰余が負の値になるので注意です
-  0が木曜日は変わらずですが、-6が金曜日、・・・、-1が水曜日です
- 「1970-01-01」以前の場合のみ剰余に7を加算しても良いけど、OR関数が楽かもです
-  曜日の計算式

```
IF(剰余 = 0,"木曜日", 
	IF(OR(剰余 = 1, 剰余 = -6), "金曜日", 
		IF(OR(剰余 = 2, 剰余 = -5), "土曜日", 
			IF(OR(剰余 = 3, 剰余 = -4), "日曜日", 
				IF(OR(剰余 = 4, 剰余 = -3), "月曜日", 
					IF(OR(剰余 = 5, 剰余 = -2), "火曜日", "水曜日")
				)
			)
		)
	)
)
```

# おわりに
>「日付」フィールドの日付に応じて、自動的に曜日を表示することはできません。

- できまーす！
- ということで [公式ヘルプ](https://jp.cybozu.help/k/ja/trouble_shooting/app_qa/day_of_week.html) に勝ってしまいました
- あと塗装用ローラーもつくってます

[![main_image (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105085/d20f1b7b-355a-1524-829f-71fcd21bdfed.jpeg)](https://www.maru-t.co.jp/painting_roller/)
PowerShellでトランザクションを使用する

# 背景
powershellスクリプト(ps1)でアイテム削除するスクリプトを書いていて、ふと、削除処理をトランザクション制御できたら便利じゃない？と思ったので。

結論から言うと出来ませんでした。

## Start-Transaction
Start-Transactionコマンドレットでトランザクションを開始できます。コミットするにはComplete-Transactionです。
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-transaction?view=powershell-5.1

このStartとComtleteで挟まれたブロックは、トランザクション制御の対象になります。ただしそのブロック内で使用するコマンドレットがトランザクションに対応してないといけません。
具体的には-UseTransactionパラメータが指定できるかどうかです。

加えて、プロバイダがトランザクションに対応してる必要があります。

## プロバイダ？
PowerShellにおけるオブジェクト操作の仕組みです。
https://docs.microsoft.com/ja-jp/powershell/scripting/developer/provider/windows-powershell-provider-overview?view=powershell-7
>
Windows PowerShell プロバイダーを使用すると、マウントされたドライブのように、任意のデータストアをファイルシステムとして公開できます。

トランザクション制御に対応しているプロバイダはレジストリのみです。
つまり、レジストリに関する操作はトランザクション制御が可能です。
対応しているプロバイダは下記のコマンドレットで調べましょう。

```powershell
get-psprovider | where {$_.Capabilities -like "*transactions*"}
```


![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581105/91058dca-8306-5112-c078-d924bad68952.png)


## トランザクションで怒られてみる
remove-itemでtransactionを指定してみましょう。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581105/2da1d200-b26c-accf-c6c0-2edbfb278931.png)


怒られました。ファイルシステムがトランザクション非対応です。


## まとめ
残念ながらファイルシステムプロバイダがトランザクション制御していませんでした。

いつか対応するんでしょうか？
PowerShellで指定ディレクトリとその配下【以外】を削除する

# 背景
色々ありまして。

# やりたいこと
```
.
├── directoryA　←消す
├── directoryB　←残す
│   ├── fileB-1.txt　←残す
│   └── fileB-2.txt　←残す
├── directoryC　←消す
```

## 環境
```powershell
$PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.18362.752
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.18362.752
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
```

## Remove-Item -Exclude -Recurseでできるのでは？
出来なかったです。試してみたところ、確かに-Exluceで除外指定したディレクトリは削除されませんが、除外指定したディレクトリの配下のファイルが削除されてしまいます。

```powershell
Remove-Item -Path "." -Exclude "directoryB" -Recurse -Force
```
```
.
├── directoryA　←消える
├── directoryB　←残る
│   ├── fileB-1.txt　←消える
│   └── fileB-2.txt　←消える
├── directoryC　←消える
```
なんで？


仕方ないので、Get-ChildItemを使うことにします。

## Get-ChildItemで削除対象を絞り込む
```powershell
Get-ChildItem -Path "." -Exclude "directoryB" | Remove-Item -Recurse -Force
```

```
.
├── directoryA　←消える
├── directoryB　←残る
│   ├── fileB-1.txt　←残る
│   └── fileB-2.txt　←残る
├── directoryC　←消える
```

こうすると、directoryBとその配下は残しつつ、他のアイテム（ディレクトリとファイル）を削除可能です。
ちなみに-whatifオプションを指定すると、削除結果をシミュレーションできます。
テストのためになんども実ファイルを作るのは面倒なので、ありがたいですね。

## まとめ
Remove-ItemのRecurseオプションは、直感と異なる動作をしますね、、、

### 参考
[Remove-Item](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/remove-item?view=powershell-7)

Exlcludeオプションで指定するディレクトリは、外部ファイルから読みこむ方法も取れます。
テスト用に日付を変えたファイルをたくさん用意しよう

そういうときありますよね。PowerShellでやりましょう。

# ファイルの日付
Windowsのファイル属性で日付というと、下記があるので間違えないようにしましょう。
・作成日付
・更新日付

基準日からNN日経過していればXX、みたいなことをする場合、その経過判定が作成日付に対して行われるのか、更新日付に対して行われるのかは試したほうが良いと思います。

# 作成日付を操作する

```powershell
Set-ItemProperty <FilePath> -Name CreationTime -Value "yyyy/mm/dd hh:mm:ss"
```

# 更新日付を操作する

```powershell
Set-ItemProperty <FilePath> -Name LastWriteTime -Value "yyyy/mm/dd hh:mm:ss"
```

## まとめ
これでスクリプトのテスト時にたくさんファイルを用意することが出来ますね。簡単です。
Windowsマシンのハードウェア情報を収集する

# 背景
なかなか動かせない位置に端末があるとか、単にコマンドで確認できるならそうしたいってときありますよね。

## シリアル番号
1番知りたい情報。

```winbatch
wmic csproduct get identifyingNumber
IdentifyingNumber
XXXXXXXXX
```
上記のxxxxxxxxと書いているところに、シリアル番号が表示されます。

## CPUコア数
システム環境変数に設定されてます。

```winbatch
echo %NUMBER_OF_PROCESSORS%
4
```

## プロダクトキー
ライセンス認証時に入力する番号のことです。
プリインストールモデルを使うことが多いのですが、オリジナルのプロダクトキーを下記で確認できます

```winbatch
wmic path SoftwareLicensingService get OA3xOriginalProductKey
OA3xOriginalProductKey
XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
```
上記のxxxxxxxxと書いているところに、プロダクトキーが表示されます。

## システム情報

```winbatch
systeminfo
```

リダイレクトなどでテキストファイルに保存できます。

## システム情報

```winbatch
msinfo32
```
上記の通りに実行するとGUIのウィンドウが開きます。
ファイルに保存したい場合は/nfoオプションを指定します。

```winbatch
msinfo32 /nfo C:\temp\xxx.nfo
```
保存したファイルを開くときはパスを直接指定します。

```winbatch
msinfo32 C:\temp\xxx.nfo
```

msinfo32で他に指定できるオプションは下記を参照してみてください。
https://support.microsoft.com/ja-jp/help/300887/description-of-microsoft-system-information-msinfo32-tool
古のTensorFlow1.xで部分的にパラメータの読み込みをする

ありがたいことに、世にTensorFlow2.xが公開されてずいぶん経ちました。
これまでv1.xで随分もがいていましたが、v2.xではデコレータで簡単にtf的なグラフに変更できるようになるなど大変素晴らしい機能がたくさん実装され、我々開発者もスピーディにモデルの学習、評価等を行えるようになりました。

しかし一部にv2.xとの互換性の問題からそのままv1.xを使用しなければならない人もいますよね(何を隠そう私のことです)。
今や更新されるドキュメントはみんな2.xについて言及していて1.xのドキュメントは増えにくく、適切な情報にたどり着けなくなってきています。
私は今(2020/11/4 17:10現在)、実際v1.xでパラメータを部分的に読み込む場合の処理についてヒットするまで時間がかかってしまいました。
単にResNetとかMobileNetとか、公開されているモデルをそのまま使用する場合なら計算グラフ全部で読み込んでしまえるのでそこまで苦労しないでしょうが、事前に学習したResNetを画像エンコーダとして後続の自作ネットワークに使用したい...という場合には部分的にパラメータの読み込みをする必要があります。
今後v1.xで部分的にパラメータの読み込みをする方へむけて(何を隠そう私のことです)、タイトルに記載の通り部分的なパラメータ読み込みの方法について記録しておきます。

# やること
原則、以下のコードで可能です。

```python
...
with tf.Session() as sess:
    saver = tf.train.Saver({'読み込みたいモデルのノード名': そのノード名をつけたtf.Variableの変数, ...})
    saver.restore(sess, 'path/to/checkpoint')
```
ただし、「tf.train.Saverに渡すノード名と変数の辞書どうやって作ればいいんだよ！」となるので、その場合は

```python
variables = tf.trainable_variables()
restore_variables = {}
for v in variables:
    if 'モデルの名前空間' in v.name:
        restore_variables[v.name] = v
```

とすることで、現在使用しているノードから特定のノードだけ取り出して辞書に入れることができます。

学習する時、勝手に`:0`とかが付与されることがあるので、その場合は

```python
fixed_name = v.name[:-2]
restore_variables[fixed_name] = v
```

みたいに対応することで、読み込み可能になります。

# 補足
事前学習したときのcheckpointにそれぞれ変数名がどのように保存されているのか確認する場合は、`tensorflow.python.tools.inspect_checkpoint.print_tensors_in_checkpoint_file`が便利です。

```python
import print_tensors_in_checkpoint_file
print_tensors_in_checkpoint_file(file_name='path/to/checkpoint', tensor_name='', all_tensors=False)

# beta1_power (DT_FLOAT) []
# beta2_power (DT_FLOAT) []
# cae/conv0/convolution2d/biases (DT_FLOAT) [64]
# cae/conv0/convolution2d/biases/Adam (DT_FLOAT) [64]
# cae/conv0/convolution2d/biases/Adam_1 (DT_FLOAT) [64]
# cae/conv0/convolution2d/weights (DT_FLOAT) [7,7,3,64]
# cae/conv0/convolution2d/weights/Adam (DT_FLOAT) [7,7,3,64]
# cae/conv0/convolution2d/weights/Adam_1 (DT_FLOAT) [7,7,3,64]
# cae/conv1/convolution2d/biases (DT_FLOAT) [32]
# cae/conv1/convolution2d/biases/Adam (DT_FLOAT) [32]
# cae/conv1/convolution2d/biases/Adam_1 (DT_FLOAT) [32]
# cae/conv1/convolution2d/weights (DT_FLOAT) [5,5,64,32]
# cae/conv1/convolution2d/weights/Adam (DT_FLOAT) [5,5,64,32]
# cae/conv1/convolution2d/weights/Adam_1 (DT_FLOAT) [5,5,64,32]
```


# 参考
以下の記事を参考にしました。
https://blog.metaflow.fr/tensorflow-saving-restoring-and-mixing-multiple-models-c4c94d5d7125
RubyのThread#[]=メソッドの注意点

## RubyのThread#[]=メソッドについて

`RubyのThread#[]=` メソッドでは、スレッドごとに固有の値を保持することができます。（Javaでいう`ThreadLocal` のようなものです）
これを利用すると、1スレッド1リクエストに紐づくアプリケーションサーバ（Passengerなどほぼ全てのAPサーバ)では、
1リクエスト中のみ閉じて使用できるスレッドローカル変数として使用することができます。

## RubyのThread.current[]メソッドの使用例

以下のように `Thread.current[:foo]` と現在のスレッドに代入することで、スレッドローカル変数 `foo` を定義できます。

```ruby
def self.foo
  Thread.current[:foo] ||= 0
end
```

また、Ruby on Railsフレームワークにレコードの操作者（作成者、更新者、削除者）を記録する機能を提供するRecordWithOperatorという gem においても
この `Thread#[]=` を使用して実装されています。
https://github.com/nay/record_with_operator/blob/4389d077b0303b956cc211ef439a46a216ae2cc0/lib/record_with_operator/operator.rb#L4

## Thread#[]=メソッドの注意点

PassengerやPumaのような一度作成したスレッドを再利用するようなアプリケーションサーバを使用している場合、
スレッドローカル変数が再利用前提のスレッドに紐づくため、アプリケーション側で明示的に破棄しないと
以前のリクエスト（スレッド）で定義した変数が別のリクエストで参照できてしまうので注意が必要です。

Redmineにも以前、`Thread#[]=` を使用して現在のユーザを扱うコードがあり、
エラーメッセージに別ユーザの名前が表示されるセキュリティ的なバグの発生事例がありました。
http://www.redmine.org/issues/16685

### 解決策

アプリケーション側で明示的にThread.currentの値を破棄することで回避できます。
RequestStoreというgemを使用すると Rack::Middlewareの層で、リクエスト毎に
`Thread.current` の値をクリアするようになります。

使用例は以下の通りです：

```ruby
def self.foo
  RequestStore.store[:foo] ||= 0
end
```
チャットアプリを作った。

#はじめに
webアプリの練習としてチャットアプリを作ってみました。
#基本機能
- ログイン制のアプリ
   - パスワードはハッシュ化してDBで管理
- セッションを使ったログイン管理機能
- アカウント作成機能
- メッセージ投稿機能
    - 投稿内容をDBに保存
    - XSS対策のエスケープ処理
- 画像投稿機能
    - 画像をbyte配列に変換し保存し軽量化
- 入力チェック機能
    - ログイン時
    - アカウント作成時
    - メッセージ投稿時
- メッセージ削除・編集機能(ユーザー視点から、DBに保存してある個人のメッセージを個別に削除・編集が可能）
- Bootstrapフレームワークを使ったアプリデザイン
- スマホに対応したレスポンシブデザイン 

#開発環境
- 使用言語
    - Java
    - javascript
    - html
    - css
- データベース
    - MySQL
- その他
    - bootstrap

#画面
###ログイン画面
- PC用
![roguinngamen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784464/474b1a8b-3989-0f6f-7428-556210504f21.png)
- スマホ用
- ![スマホの画面.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784464/eed038fd-342f-4b84-1a5e-24248065e22d.jpeg)

###チャット画面
- PC用
![チャット画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784464/aa6a2892-0356-8bbb-7426-e847314e3679.png)

- スマホ用
![tyattogamen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784464/55575be3-5970-184a-10ad-0142b114f5aa.png)

#作った感想
- 普通のチャットアプリでもいざ作ってみると面倒なことが多い。
    - 改行を判定するための処理とXSS対策の両立
- 画像を投稿する際にbyte列に変換したほうが良いということを学んだ。表示する際にはbase64にエンコードして表示する方法を選んだが、この方法はページを表示する際に負荷がかかるため、今後の反省点にしたい。
- デザインには自信がないため、bootstrapのおかげでだいぶマシになった。

#最後に
チャットアプリといえど、その処理や構造はほぼほぼ掲示板や、他の入力フォームを伴うアプリと同じあるいは似ているので、他のアプリでも流用が効くことがわかった。
Raspberry Piをディスプレイ・キーボード・有線LANなしで使用する方法

## 環境
MacBook Pro (15-inch, 2019)
macOS Catalina 10.15.7（19H2）

## 用意するもの

- Raspberry Pi
今回は、[Raspberry Pi 4 Model B / 8GB](https://www.switch-science.com/catalog/6370/)を採用。

- USBケーブルなど
MacBook ProとRaspberry Piを接続し電力を供給します。
共にType Cで接続可能なため、
今回は、以前購入した[RAMPOW Type C ケーブル](https://www.amazon.co.jp/dp/B0827KJ6DY)を採用。

- microSD
Raspberry Piに依って32GBまでのものが良い場合があるそうですが、
今回は、[Samsung EVO Plus 128GB](https://www.amazon.co.jp/dp/B06XSTCW3G)を採用。
[Samsung EVO Plus 32GB](https://www.amazon.co.jp/dp/B06XSV23T1)でも同手順を確認済。

- microSDリーダーライター
microSDの中身を編集するのに使用します。
今回は、以前購入した[EC Technology 高速SDカードリーダー](https://www.amazon.co.jp/dp/B01H78B4CA)を採用。

## microSD接続

- MacBook Pro と microSDリーダーライター を接続
- microSDリーダーライター を microSD へ挿入

## microSDへRaspbeanをインストール(初回のみ)

### Raspberry Pi Imager ダウンロード

Raspberry Pi Imager をダウンロードします。
`Raspberry Pi Imager for macOS`を選びます。
https://www.raspberrypi.org/downloads/

### Raspberry Pi Imager インストール

上でダウンロードした`imager_X.X.dmg`を実行し、
MacBook Proのアプリケーションフォルダへインストールします。

### Raspberry Pi Imager 起動

MacBook Pro上でインストールした
Raspberry Pi Imagerを起動します。

### OS 選択

一番上の`Raspbean`を選びます。

### SD Card 選択

microSD を選びます。

### WRITE 押下

microSD へ書き込まれますのでしばらく待ちます。

## microSD再接続

完了後に切断されたら、microSDを適切な手順で抜き差しし再認識させます。

## Wi-Fi接続のための設定(初回のみ)

`$ vi /Volumes/boot/wpa_supplicant.conf`

を実行し、以下のようにWi-Fi接続情報を記載しておきます。

```
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
    ssid="接続先のSSID"
    psk="接続Key"
}
```

## SSH接続のための設定(初回のみ)

### SSH接続用空ファイル作成
MicroSDを接続したまま以下を実行しておきます。
`$ touch /Volumes/boot/ssh`

### Raspberry PiなしIPアドレスチェック
Raspberry Piを起動していない状態で、MacBook Proから
`arp -a`
を実行しIPアドレスをメモしておきます。
表示されているIPアドレスはRaspberry Piのものではありません。

### microSD取り出し

適切な手順でmicroSDを取り出します。

### Raspberry Pi へ microSD 挿入

Raspberry Pi へ microSD を挿入します。

### Raspberry Pi 起動

USBなどで接続すると、Raspberry Piが自動的に起動します。

### Raspberry PiありIPアドレスチェック
Raspberry Piを起動した状態で、MacBook Proから
`arp -a`
を実行しIPアドレスを確認します。
メモにないIPアドレス(仮に192.168.0.173とします)がRaspberry Piのものです。


## SSH接続

### SSH接続

MacBook Proから
`ssh pi@192.168.0.173`
を実行し、
`pi@192.168.0.173's password:`
と表示されたら
`raspberry`
と入力するとログイン完了です。

`Are you sure you want to continue connecting (yes/no)? `
本当に接続したいのか聞かれたら
`yes`
と答えてください。

#### 失敗したら・・・

`WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!`
が表示され失敗したら

`vi ~/.ssh/known_hosts`
として対象のipアドレスを探し、対象行を削除し再チャレンジすると解消するはず。

### パスワード変更
`passwd pi`
を実行し、現在のパスワード・新しいパスワード・新しいパスワード(再入力)
を入力してパスワードを変更します。

## Raspberry Pi終了

### Raspberry Pi終了
`sudo poweroff`
とし、Raspberry Piを終了させます。

黄緑色のランプの点灯が消えたら終了しているようです。

### Raspberry Pi切断
USBなどで接続していたRaspberry Piを切断します。
OpenLdapのバックアップをslapcat で行う時のコマンドオプションは具体的にどれがいいの？

OpenLdapのバックアップをslapcatでとろうとしていてネット検索しましたが、異なるオプションの記載があり、どれがいいのか迷ったので調査しました。

## 結論

### LDAPアカウントのバックアップ
```
# slapcat -n 2 -l ldap-YYYYMMDD.ldif
```

### 設定バックアップ

```
# slapcat -b cn=config -l ldap-config-YYYYMMDD.ldif
```

### slapcatオプション
```
# man slapcat

-l ldif-file
        Write LDIF to specified file instead of standard output.
		標準出力ではなく、指定されたファイルにLDIFを書き込みます。

-b suffix
      Use the specified suffix to determine which database to generate output for.  The -b cannot be used in conjunction with the -n option.
      指定されたサフィックスを使用して、出力を生成するデータベースを決定します。 -bを-nオプションと組み合わせて使用することはできません。

-n dbnum
      Generate output for the dbnum-th database listed in the configuration file. The config database slapd-config(5), is always the first database, so use -n 0 to select it.
	  構成ファイルにリストされているdbnum-thデータベースの出力を生成します。 構成データベースslapd-config（5）は常に最初のデータベースであるため、-n0を使用して選択します。

      The -n cannot be used in conjunction with the -b option.
      -nを-bオプションと組み合わせて使用することはできません。
```

## 詳細

#### [【slapcat/slapadd】の使い方, オプション～OpenLDAPのBackup/Resotreや移行, cn=config, cn=monitor, エラー～ | SEの道標](https://milestone-of-se.nesuke.com/l7protocol/ldap/slapcat-options/)

一番参考になりました。

> OpenLDAPの設定のバックアップ
> 
> [root@localhost ~]# slapcat -b cn=config -l ldap-config-YYYYMMDD.ldif
> 
> もしくは
> 
> [root@localhost ~]# slapcat -n 0 -l ldap-config-YYYYMMDD.ldif
> 
> -n はデータベース番号を指定するオプション、-b はLDAPツリーのDNを指定するオプションです。-n と -b は同時には使えません。config のデータベース番号は0です。
>
> LDAPアカウントのバックアップ
> LDAPアカウントのバックアップは以下のコマンドを使います。
>
> [root@localhost ~]# slapcat -l  ldap-YYYYMMDD.ldif
> これでも正常にバックアップはできますが、必ず以下のエラーが出力されます。
> 
> The first database does not allow slapcat; using the first available one (2).
> 
> (中略)
> 
> このエラーを出力しないようにLDAPアカウントのバックアップを取得するためには以下のコマンドを使います。
> 
> [root@localhost ~]# slapcat -n 2 -l ldap-YYYYMMDD.ldif
> 
> つまり2番目のデータベースを取得するわけです。(エラーにある最後の(2).は2番目のデータベースを使え、という意味です。)
> 
> なお、モニターデータベースは SNMP MIB データベースのような使われ方をするもので、現在のセッション数等の統計情報を司るものですが、slapcat が許可されておらず、以下コマンドを実行しようとするとその次のエラーが出ます。
> 
> [root@localhost ~]# slapcat -n 1
> slapcat: database doesn't support necessary operations.
> 
> slapcat は使えませんが、ldapsearch を使ってモニター情報の取得ができます。
> 
> [root@localhost ~]# ldapsearch -x -b cn=monitor -s sub +


#### [もしもに備えるバックアップ、リストア（1） (2/2)：OpenLDAPによるディレクトリサーバ運用（1） - ＠IT](https://www.atmarkit.co.jp/ait/articles/0909/03/news115_2.html)
```
# ./sbin/slapcat -l /path/to/backup.ldif    ←論理データの抽出
```

このコマンドだと、`The first database does not allow slapcat; using the first available one (2).`エラーが出る。（けどバックアップはとれる）

#### [CentOS7でOpenldap構築 - 5.バックアップ、リストアテスト - Qiita](https://qiita.com/y-araki-qiita/items/ad000141c3fccaef7167)

> データベースバックアップ
> slapcat -n 2 > ldap_`date "+%Y%m%d%H%M"`.ldif
> 
> 設定バックアップ
> slapcat -b cn=config > ldapconfig_`date "+%Y%m%d%H%M"`.ldif

標準出力でファイル出力するか `-l` で出力するかの違い。
厳密には違うんだろうけど、どちらでも大丈夫そう。
オプションあるため、`-l` で出力する方式を採用。

#### [ubuntu 14.04でldapのバックアップ・リストア - Qiita](https://qiita.com/miyumiyu/items/9a6488117519b9b00599)
> slapcatを使ってldif形式でバックアップ

```
# slapcat > ldap-bak.ldif
# slapcat -b cn=config > ldap-config-bak.ldif
```

ubuntu でも同様のコマンドでいけるらしい。
gitで指定のコミットに戻りたい（reset）

# 前置き
メモ書きです。
gitで指定のコミットに戻りたいとき、方法は2パターンある。

## rebase

```
git rebase
```

変更を戻すコミットをする。
安全。
ログが増える。

## reset

```
git reset
```

変更自体を取り消す。
危険。
ログが消える。

今回はresetの方を扱う。

# ローカルで戻りたい
ローカルから頑張って書いたコードが消えるので注意。
プッシュしてあるなら戻すことができる。（後述）


以下でdに戻りたい場合

```
a <- HEAD
|
b
|
c
|
d <- ここに戻りたい
```

HEADから遡る指定方法は以下

```
a <- HEAD
|
b <- HEAD~1
|
c <- HEAD~2
|
d <- HEAD~3
```

```shell
git reset --hard HEAD~3
```

結果

```
d <- HEAD
```


# 戻したけど、やっぱり戻すのをやめる
プッシュ済みであれば、プルすればOK

```shell
git pull
```


# リモートに反映したい
元のコミットは、別ブランチがない限り消えるので注意
プッシュ先が仮にdevブランチとする

```shell
git push -f origin dev
```

結果

```
d <- HEAD
```
https化(SSL化)するプロセスで出てきたわからない用語・知識

ポートフォリオをhttps化（SSL化）しました。
わからない用語がたくさん出てきたので、調べたことをまとめました。

# http化とは？

・ざっくりいうと、`https://〜`で始まるIPアドレスでアクセスできるようにすること。
・http://abc.work/ から https://abc.work/ にアクセスできるようにすること。 

# なぜhttp化するのか？
・httpよりhttpsで通信した方が安全な通信だから。
・httpsのsは「Secure（安全）」のs。

# なぜhttpよりhttpsで通信した方が安全な通信なのか？
・httpでの通信は暗号化されていない通信方式（安全でない通信）。通信が丸見えのため、フォームに入力した内容などが抜き取られるなどのリスクがある。パスワードやクレジットカード情報などが流出する恐れがある。

・httpsでの通信は暗号化された通信方式（安全な通信）。通信が暗号化されている（見えない）ため、情報流出などのリスクが低い。

# https化はどうやるのか？
やり方は１つではなく、いくつかのパターンがある。

>1. ELB(+ACM発行証明書)→EC2
2. ELB(+証明書)→EC2(+外部SSL証明書)
3. CloudFront(+証明書)→ELB→EC2
4. NLB→EC2(+外部SSL証明書)
　などなど。

>[ナレコムAWSレシピ AWSでWebサイトをHTTPS化 その1：ELB(+外部証明書)→EC2編](https://recipe.kc-cloud.jp/archives/11124)

今回はもっとも簡単な 1. の方法でやりました。
手順は以下の通りです。

[1] Route 53にサブドメイン作成
[2] ACM証明書設定
[2.1] ACMに外部証明書をインポート
[3] EC2インスタンス作成
[4] ELB作成
[5] 動作確認

https化しようとしてる方はこちらの記事を参考にしてください。
[ナレコムAWSレシピ AWSでWebサイトをHTTPS化 その1：ELB(+外部証明書)→EC2編](https://recipe.kc-cloud.jp/archives/11124)

# ロードバランサーとは？
・AWSのEC2インスタンスにある装置。
>ロードバランサーとは、その名の通りサーバーにかかる負荷(load)を、平等に振り分けるための装置のこと。これによって1つのサーバーにかかる負担を軽減したり、停止状態を防ぐことができる。
・Webサイトへのアクセス集中やサーバー故障などの場合でも、アクセス中の利用者に安定したサービス提供が継続可能になる。

>[カゴヤのサーバー研究室 【図で理解】ロードバランサーとは？負荷分散の仕組みを解説](https://www.kagoya.jp/howto/network/loadvalancer/)

# セキュリティグループとは？
・セキュリティグループは、同一グループ外のインスタンスと通信を行う際のトラフィックを制御するファイアウォール。
・EC2とVPCに存在し、動作や設定に違いがある。

**トラフィックとは？**
Webの分野では、WebサーバやWebサイトへの外部からの接続要求数、アクセス数、送信データ量などのことや、サイトやページの間を行き来する閲覧者の流れのことをトラフィックということが多い。

**ファイアウォール(Firewall)とは？**
・企業などの内部ネットワークをインターネットを通して侵入してくる不正なアクセスから守るための“防火壁”。
・WANの発展によりＷeb経由で内部ネットワークに侵入できるようになり、内部データの盗聴、改ざん、攻撃のリスクが出てきた背景から誕生した。

**WANとは？**
「Wide Area Network」の略で、遠く離れた場所とつながったネットワークのことで、だれもが自由に接続できるネットワークのこと。 簡単に言えばLANとLANをつないだ大きなネットワーク。インターネットもWANのひとつ。WANを利用することで世界中の人とのコミュニケーションが可能になった。
unicode正規表現サンプル

# unicode正規表現サンプル

毎回調べるのが面倒なので、自分が使いそうなunicode正規表現を記事にしておく...

| 概要 | unicode正規表現 |
| :-- | :-- |
| 漢字ひらがな | \u30a0-\u30ff\u3040-\u309f\u3005-\u3006\u30e0-\u9fcf |
| 全角スペース | \u3000 |
| 全角アルファベット大文字 | \uFF41-\uFF5A |
| 全角アルファベット小文字 | \uFF21-\uFF3A |
| 全角数字 | \uFF10-\uFF19 |

# 参考
https://www.tamasoft.co.jp/ja/general-info/unicode.html
Nuxt.jsでAnimate.cssをcdn経由で使う方法

# はじめに

Nuxt.js に Animate.css を導入するための方法です。
すでに Nuxt.js の環境構築などを終えられている方が対象です。

他にも、cdn を使って何かを読み込ませたい人のプラスになるかもしれません。

## 早速本題

- head タグの中にいろいろ書き込みたいので、head メソッドを使います。

```javascript
import Loading from "@/components/Loading"; //追加

  export default {
// 省略
    head() {
      return {
        link: [{
          rel: "stylesheet",
          href: "https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css"
        }]
      }
    }
```

これだけです。
`default.vue`ファイルなどに以上の記述をしていただければ、class 名のところに Animate.css の記述を書くだけでいろんな動きをしてくれます。
例）`class = "animate__animated animate__slideInDown"`

Animate.css に限らず、他の外部リソースを使う時にも応用できるかと思います。
自分がやろうとした時に、以下の参考記事にたどり着くまでに時間がかかったので、まとめてみました。

## 参考

[NUXT JS 外部リソースを使うには？](https://ja.nuxtjs.org/faq/)
rubyのversionは.rbenv/versionファイルで管理されている

# .rbenv/version

`.rbenv/version` ファイルには、現在使用しているruby versionが記述されており、
`rbenv global x.x.x` コマンドなどでversionを変更すると、`.rbenv/version`の内容も書き換えられる。


```
[ec2-user@al1-gemlist ~]$ ruby -v
ruby 2.5.7p206 (2019-10-01 revision 67816) [x86_64-linux]
[ec2-user@al1-gemlist ~]$ cat .rbenv/version
2.5.7
[ec2-user@al1-gemlist ~]$ rbenv global 2.5.8
[ec2-user@al1-gemlist ~]$ ruby -v
ruby 2.5.8p224 (2020-03-31 revision 67882) [x86_64-linux]
[ec2-user@al1-gemlist ~]$ cat .rbenv/version
2.5.8
```

# .rbenv/version を編集するとどうなるか
それでは、逆に `.rbenv/version`の方をviで編集するとどうなるか。
試しに、今現在`.rbenv/version` の中身を`2.5.8` から`2.5.0`に変更してみる。

```
[ec2-user@al1-gemlist ~]$ sudo vi .rbenv/version
[ec2-user@al1-gemlist ~]$ cat .rbenv/version
2.5.0
[ec2-user@al1-gemlist ~]$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]

```

rubyのversionがファイルの内容に従って変更されているのが分かる。
また、`rbenv versions`コマンドで確認してみると、

```
[ec2-user@al1-gemlist ~]$ rbenv versions
  system
* 2.5.0 (set by /home/ec2-user/.rbenv/version)
  2.5.1
  2.5.2
  2.5.3
  2.5.4
  2.5.5
  2.5.6
  2.5.7
  2.5.8
  2.6.2
```
こちらに関しても2.5.0になっている事が確認できる。

#疑問点
しかし、ここで一つ疑問があります。
version確認コマンド上ではrubyのversionは2.5.0と表示されているのは分かったが、「内部的にも2.5.0に変更されているのであろうか」という事です。

確認方法として、opensslというgemのversionを確認します。
このgemは
rubyが2.5.8の場合`2.1.2`
rubyが2.5.0の場合`2.1.0`　となります。
（詳しくは、[こちら](https://qiita.com/xusaku_/items/0697b7075bc7f63e7a0b#v-258)を参照）

つまり、opensslのversionが`2.1.0`であれば、内部的にもruby versionが2.5.0に変更されていると言えます。

# 結果

```
[ec2-user@al1-gemlist ~]$ gem list openssl

*** LOCAL GEMS ***

openssl (default: 2.1.0)
```
従って、内部的にも変更出来ていることが確認出来ました。
youtubeDataApiを試してみた。

#はじめに
初めての投稿、というかブログ自体が初めてなので文章が拙いかもしれません。
#概要
youtubeDataApiを使って、特定のキーワードを検索を行い、その動画の再生数と動画チャンネルの登録者数を取得し、再生数/登録者数が60%以上の動画のみを抽出し、csvファイルに纏めるプログラム。
ネタを真似すればyoutubeでバズれる？
#開発環境
###使用言語
- Java

#結果(例)
ポケモンで検索してみた結果。
![qiitajpg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784464/eccfb78b-ad06-3c24-699b-d46f46f7ba6c.jpeg)

#作ってみた感想
- 困った点
    - youtubeAPIは使用制限があり、特に今回のような検索機能を用いるとあっという間に1日の上限に引っかかってしまうため、乱用ができない。
    - たまに、検索に引っかかった動画で登録者数が取得できないことがあり、そのたびエラーになってしまっていた。該当する動画を確認したところ、チャンネル登録者数を非公表にしているチャンネルだった。(エラーにならないように分岐を加えた。)
    - 特にフレームワークを使わずにコードを書いたため、apiのurlを変数に直に書くという不格好なコードになってしまった。springなどのフレームワークを使えばもっとスタイリッシュに書けるのだろうか。。。もしくは他の言語でも。
- 面白かった点
    - webAPIを扱うのは初めてだったためとても勉強になった。
    - youtubeDataAPIや、他のyoutubeのAPIを組み合わせれば効率良く情報収集できるのではないかとアイデアが膨らんだ。

#最後に
調べたところ、ネット上には膨大な数のwebAPIが存在し自分の生活が効率よくなりそうなプログラムがたくさん書けるとワクワクした。youtubeでいうと登録したチャンネルがライブを開始した際に自動でurlを開くchromeの拡張機能とか作りたい。（chromeに通知機能があるからいらないかも）
ふつうのLinuxプログラミングをやってみる その3

有名な本らしいので買ってみました
<a target="_blank" href="https://www.amazon.co.jp/gp/product/4797328355/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4797328355&linkCode=as2&tag=lespacetranqu-22&linkId=b690c3257ff896f2239f1107e5bf95a4">ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=lespacetranqu-22&l=am2&o=9&a=4797328355" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B075ST51Y5/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B075ST51Y5&linkCode=as2&tag=lespacetranqu-22&linkId=aa0915aa60afe5a385a365f9059a2877">ふつうのLinuxプログラミング 第2版　Linuxの仕組みから学べるgccプログラミングの王道</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=lespacetranqu-22&l=am2&o=9&a=B075ST51Y5" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />


> ふつうのLinuxプログラミングをやってみる その１
> https://qiita.com/uturned0/items/b9ae846f2aff5865c074
> ふつうのLinuxプログラミングをやってみる その2
> https://qiita.com/uturned0/items/56beac990cdd6f1059ed
> ふつうのLinuxプログラミングをやってみる その3
> https://qiita.com/uturned0/items/675092da8aa89c4b1ff0
> その４
> https://qiita.com/uturned0/items/8f5765cfc0f0be8a1981
> その５
> https://qiita.com/uturned0/items/ab97deb489c994a836da
その７−３
https://qiita.com/uturned0/items/3fbf3ed6bb2a47325f59

---


# Chapter 3

広義のファイル
symlink, text, binary 全部ファイル。

狭義のファイル
regular file
違うもの
directory
symlink
device file such as /dev/sda
named pipe 本書では扱いません
unix domain socket 扱いません

デバイスファイルとは
/dev/sda はブロックデバイスファイル
キャラクタデバイスファイルはprinter, modem
/dev/null, /dev/zero, /dev/random もデバイスファイル。

file system
procfs, tmpfs, devfsは疑似ファイルシステム pseudo filesystem

process IDがある理由の代表はsignal, ctrl+c


# stream
バイトが流れるバイトストリーム。
この本だけの言葉。file, open fileと呼ばれるらしい

file型の値
STREAMSカーネルモジュール

他書では↑の意味で使うことがある

system call read/writeをストリームからバイト列を読む、というように使う


device fileはストリームを得るためのとっかかり

process a からkernelを通りprocess b　にいくものを **Pipe** 

`cat x | grep x` のpipeと同じ

streamはnetworkを超えてやり取りもできる。


process間通信を IPC interprocess communication


file system - process - process 全部つなぐのがストリーム


chapter 3 おわり
IBM Cloud 関連記事まとめ

#IBM Cloud Pak for Data (CP4D) 関連

##CP4D ver.3.5関連

- Cloud Pak for Data ver.3.5で、外部データベースへの接続を作成する。
    - https://qiita.com/Shumpei_Kubo/items/ac435e2962faf7b17439

---


##CP4D Experience(無償トライアル)

- Ver3.0版（2020/11月時点で現状使用できるバージョン）
    - https://qiita.com/Shumpei_Kubo/items/662732390058a92b2d89

---

- Ver2.5版(記録として残していますが、もうこの内容は使えません）
    - https://qiita.com/Shumpei_Kubo/items/c0f3c29a62569e9825b9

---

##IBM Cloud のサービス関連

- IBMidを作成してみる。
    - https://qiita.com/Shumpei_Kubo/items/564126081dea547dd742

---

##データカタログ機能（Watson Knowledge Catalog（WKC））関連

- SaaS型データカタログ（Watson Knowledge Catalog on Cloud:無償版）をプロビジョニングしてみる。
    - https://qiita.com/Shumpei_Kubo/items/a05388f51e716ef7aa1d

---

- デモ用のデータベース(Db2 on Cloud:無償版)を準備する。
    - https://qiita.com/Shumpei_Kubo/items/b6fd9153262cac4773e3

---

- データカタログに他ユーザ（IBMid）を招待する。
    - https://qiita.com/Shumpei_Kubo/items/aa8c9ecbe77962b76c0d

---

- データカタログにデータポリシー（個人情報のマスキング）を設定する。
    - https://qiita.com/Shumpei_Kubo/items/6dd324e895e6db4201c3

---

- データカタログに手元のcsvファイルを登録する。
    - https://qiita.com/Shumpei_Kubo/items/cb613c1db4aeda73d4fb

---

- データカタログにデータベース(Db2)を登録する。
    - https://qiita.com/Shumpei_Kubo/items/0a47c504fcc998056447
Apache2再コンパイルなしでmod_rewriteモジュール追加方法メモ


# メモ

古いApache2.2.4のmod_rewriteモジュールが入ってないため、apache再コンパイルなしで、追加をしました。

https://kazmax.zpp.jp/apache/apache3.html#ah_2　参考しました。

cd /usr/local/src/httpd-2.2.4/modules/mappers 
/usr/local/apache2/bin/apxs -c mod_rewrite.c

ls -alt .libs/mod_rewrite.*

mod_rewrite.soが含まれていることを確認しました。

最後、rootユーザでモジュールのインストール

/usr/local/apache2/bin/apxs -i -a -n rewrite mod_rewrite.la

その後は、通常のhttpd.confとか.htaccess編集すれば、mod_rewriteが使えるようになります。
Herokuクライアントアップデート

## 参考

- [「Warning: heroku update available from X.X.X to Y.Y.Y」が出たときの対処法 - Reasonable Code](https://reasonable-code.com/heroku-update/)

## メッセージ

```
 ›   Warning: heroku update available from 7.39.0 to 7.47.0.
```

## 対処

```
heroku version
----------
 ›   Warning: heroku update available from 7.39.0 to 7.47.0.
heroku/7.39.0 darwin-x64 node-v12.13.0
```

```
heroku update
----------
heroku: Updating CLI from 7.39.0 to 7.47.0... done
 ›   Warning: Our terms of service have changed: https://dashboard.heroku.com/terms-of-service
heroku: Updating CLI... done
Updating completions... done
```

```
heroku version
----------
heroku/7.47.0 darwin-x64 node-v12.16.2
```
VSCodeでSQLiteを使うなら拡張機能を使う（sqlite3のバイナリファイルを見る方法）

最近Ruby on Railsを勉強中でSQLiteをよく使います。

そこで出てくる**.sqlite3**というバイナリファイルをVSCodeで使いたかったので、やり方を調べました。

## 環境
- VScode  1.50.1
- SQLite

## sqlite3が開けない？
それはRailsチュートリアルの6章をやっていたときに訪れました。

対象のRailsチュートリアル→https://railstutorial.jp/chapters/modeling_users?version=5.1

モデルを作って…

```bash
$ rails generate model User name:string email:string
```

マイグレーションを適用すると…

```bash
$ rails db:migrate
```

`db/development.sqlite3`というファイルができていました。

![スクリーンショット 2020-11-04 15.10.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562723/ba114b0e-68ea-4cf5-1e21-49040c441fee.png)

ただ、これがバイナリファイルでVSCodeでは開けない。。。

## 拡張機能SQLiteのインストール
そこで『SQLite』という拡張機能を導入します。

VScodeのマーケットプレースからいつもどおりインストールしてみてください。
![スクリーンショット 2020-11-04 15.12.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562723/e44673f2-5591-839f-4223-02844a7ab634.png)

## SQLiteの使い方
使い方はカンタンです。

コマンドパレットを開いて「sql」と入力してください。

（コマンドパレットを開く方法）
Windows：Ctrl+Shift+P
Mac：Command+Shift+P

検索結果の「SQLite: Open Database」を選択します。
![スクリーンショット 2020-11-04 15.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562723/f942861c-14eb-3776-71d2-f24bde435cc2.png)

ファイルの選択になるので、対象のファイルを選んでください（今回は`db/development.sqlite3`を選びます）
![スクリーンショット 2020-11-04 15.19.32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562723/d6aa6419-c234-ba09-6e39-89dbe90a960a.jpeg)


画面上は特になにも起こっていないように見えるのですが、実はエクスプローラータブをよく見ると「SQLITE EXPLORER」という項目が増えており、ここに各テーブルとカラムが表示されています。
![スクリーンショット 2020-11-04 15.27.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562723/259fce75-17d7-ebae-8e69-74c9e0c46f3f.png)

ええ感じですね。

テーブルに登録されているデータを見たい場合は、各テーブル名の横にある「▶」をクリックしてみましょう。
![スクリーンショット 2020-11-04 15.33.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562723/10ed3514-b60c-4a44-10b0-61ff3cd0b9bb.png)

お、見れましたね。

これで他のツールを開かずとも、VSCode上でSQLite使えますね！

### 余談
もちろんVScodeを使わなくても、DB Browser for SQLiteという素晴らしいツールもあるので、どちらを使うかはお好みでどうぞ。

公式サイト：https://sqlitebrowser.org/
現場でよく使うツール

付箋
pchusen
https://www.vector.co.jp/soft/winnt/personal/se337632.html

grep/replaceツール
YokkaGrep 2007
https://forest.watch.impress.co.jp/library/author/author_10151.html

画面キャプチャ
Faststone version 5.3
http://www.aplusfreeware.com/categories/mmedia/files/FSCaptureSetup53.zip

コンペアツール
winmerge
https://winmerge.org/downloads/?lang=ja

圧縮：
7zip
https://sevenzip.osdn.jp/download.html

ローカル検索
everything
https://forest.watch.impress.co.jp/library/software/everything/

ランチャー
WOX
https://www.techspot.com/downloads/6843-wox.html

Explorer代替
clover
https://www.vector.co.jp/soft/winnt/util/se502684.html

Explorer増強
Listary 
https://www.listary.com/

Editor
sakura editor

SQL開発
A5:SQL Mk-2
https://www.vector.co.jp/soft/dl/winnt/business/se422726.html

ssh client
RLogin
http://nanno.dip.jp/softlib/program/rlogin_x64.zip

Font
migmix 1M
https://osdn.net/projects/mix-mplus-ipa/downloads/72510/migmix-1m-20200307.zip
完全に個人的なメモ

<h1>ものすごく個人的なメモです。</h1>
Linuxコマンドの忘れがちなものをメモしていきます。

<h2>フルパスの取得方法</h2>
```
$ find `pwd` -name "ファイル名.sh"
```
<h2>shellスクリプトの書き方</h2>
```shell:test.sh
# ---これはコメント-----------
# bashのpathは which bash で取得する
# ------------------------

#!/bin/bash
echo hello-world
```
実行権限を与える。
`$ chmod +x deploy.sh`
実行するには、
`$ /testスクリプトのフルパス/test.sh`
rails new を実行するとbundle installでエラー

タイトルの通りrails newを実行したところ、以下のエラーが・・・。


````
Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Could not fetch specs from https://rubygems.org/
````

<h2>
原因： 某カフェでfree wi-fiを利用していたため
</h2>

このエラーが起きる要因は、Free wi-fiを使っていたり、ウィルスバスターによってよく起きるようです。


<h3>解決策：3段階あります</h3>

<h4>STEP1: RubyGems(gemコマンド)自体のバージョンアップをする</h4>



````
% gem update –system
````

````
% bundle install
````


これでもダメなら次へ

<h4>STEP2: 手動でライブラリとの連動を行う</h4>

ステップ１でも解決できない場合、自動で他のライブラリとの連動ができていない可能性があるので手動でrubygems.orgとのパスを設定していく必要があります。

__rubygems.orgとは?__
Rubyのライブラリを管理しているサイトでのことです。
こちらがサイトURLです
https://rubygems.org/
どのようなgemがあるのかも確認できるので、お時間がある際はぜひ参照ください。


bundle installを実行するとGemfile内に記載した内容から自動的にrubygems.orgとのパスを通していくのですが、セキュリティが堅牢だとこれがブロックされてエラーが引き起こされてしまいます。


以下の手順を実行していきましょう。

__rubygemsのapiを確認する__

````
% host api.rubygems.org
````


上記のコマンドを実行すると以下の内容が表示されます。

````
------------ここから------------
rubygems.org has address XXX.XXX.XXX.XX
rubygems.org has address XXX.XXX.XXX.XX
rubygems.org has address XXX.XXX.XXX.XX
rubygems.org has address XXX.XXX.XXX.XX
-----------ここまで使う-----------
rubygems.org has IPv6 address 2a04:4e42::70
rubygems.org mail is handled by 10 mxa.mailgun.org.
rubygems.org mail is handled by 10 mxb.mailgun.org.

````

XXX.XXX.XXX.XXの部分がapiの部分で様々な数字が並んでいるかと思いますが、この部分を使います。



__IPv6はざっくり言ってしまうとIPアドレスを128ビットで表現した形です。__
↓こちらのサイトをご参照ください。
https://dream.jp/ftth/tips_f/hikari17.html


__上記apiを使ってパスを通す__
以下のファイルを開く

````
% sudo vim /etc/hosts
````

ここからパスを通していくので、先ほどの上記XXX.XXX.XXX.XX(api)を一つコピーしては、以下のように追加していく

````
XXX.XXX.XXX.XXX   rubygems.org
XXX.XXX.XXX.XXX   rubygems.org
XXX.XXX.XXX.XXX   rubygems.org
XXX.XXX.XXX.XXX   rubygems.org
````

その後bundle installしてみてそれでもダメなら・・・・・・

<h4>STEP3: wi-fi環境を変える or ウィルスバスターを止めてみる</h4>
今回はfree wi-fiでの作業は諦めましょう。ご自宅または職場に戻って改めてbundle installを実行してみてください。
ウィルスバスターの止め方については、ソフトごとに変わるためサイトなど確認してみて実行しましょう。
Windows10エクスプローラーの作成日時等の表示項目設定（デフォルト）

#バージョン

Windows10 Pro バージョン1909 OSビルド18363.1171


#何がしたいのか

下図のところに『作成日時』とかも表示したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7ea61dfb-d51a-3245-10ce-58c5c712d7c8.png)

んでんでんで、右クリックでただ表示設定するだけだと **そのフォルダにしか適用されない**。
そうじゃなくて、どの **フォルダを開いても** 作成日が表示されるようにしたいさ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e0344309-0575-cbdb-b5fb-850c353cf217.png)


#やり方

まず、任意のフォルダで『これでいくぞ！』な状態に表示項目を設定しておく。

そのまま、フォルダーと検索オプションの変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e2d81f6e-e85d-78a9-64f7-6100b0a7026c.png)

んで、表示タブのフォルダーに適用ボタン。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7ac7a148-3a24-e57d-d455-a4279e0fe10b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/431f0edc-fef9-addf-833c-b3f11ba01b62.png)


#蛇足

ハウスキープバッチのテストする時とか、何だかんだで更新日だけじゃなくて作成日の情報も欲しいから、作成日は常に表示しておきたいわん。
生産性は爆発だ！ ErgoDox EZをご紹介！！

# はじめに
みなさん、キーボードは何を使ってますか？
現状で満足してますか？
もっと、力が欲しくないですか？

そんなあなたに、ErgoDox EZがオススメです！！

今回の話を動画で流し見したい方は、こちらをどうぞ！
[【YouTube動画】 生産性は爆発だ！ ErgoDox EZをご紹介！](https://youtu.be/AF-VUBsjs94)
[![生産性は爆発だ！ ErgoDox EZをご紹介！](https://img.youtube.com/vi/AF-VUBsjs94/0.jpg)](https://www.youtube.com/watch?v=AF-VUBsjs94)

# ErgoDoxとは何か？
ErgoDoxは人間工学に基づいたセパレート式のキーボードです。

既に記事もたくさんありますね。

- [【note】自作キーボードのハードルが高そうなので「ErgoDox EZ」を買ってみた](https://note.com/fuganawa/n/n33d40cde35f4)
- [【Qiita】マサコの知らない自作キーボードの世界　クリスマスSP](https://qiita.com/sirojake/items/2e1c45f346b9ba3b9e7f)
- [【Qiita】Ergodox EZ を使ってみよう](https://qiita.com/kei_s/items/40a896d1a1c70f2961e0)

今回はやっすんの思うErgoDox EZキーボードの**良いところ**を紹介していきます！
一利用者の意見として、楽しんでいただければと思います。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/7c9f481c-8821-78e3-3bb4-79d03eb732f5.png' width='650'>

# キーボードを2つに分割できる
ErgoDox EZは左右に分割できるので、自分の肩幅にあった位置にキーボードを配置できます！
肩こりにお悩みの方、いかがでしょうか！

また、キーボードの間に本や飲み物、スマホを置くことができます。
キーボードを移動させたり、首を曲げたりしなくて良いので、楽ですよ！！


# 親指を活かせる
普通のキーボードだと、親指はスペースキーぐらいしか叩けませんが、ErgoDoxの場合は親指の位置にたくさんキーがあります！！

それぞれのキーに何を割り当てるかは自由なので、SHIFTを配置したり、利便性は高いです！

# キーの重さを選べる
どのぐらいの力で押すと、キーが反応するか、というのもカスタマイズできます。

キーの重さは購入時に、40 gf ~ 60 gfまで自由に選べます。
力をあまり入れずに入力したい場合は、40 gfなどの軽いキーを、誤入力とかが嫌で、しっかり入力したい場合は60 gfが良いと思います！

# キーの配置を自由に設定できる
どの位置に何を置くかも自由に**簡単に**設定できます。

Enterはよく押すので、親指の近くに置く...とか、_をよく使うので、SHIFT押さなくても入力できるようにする...とかできます。

あと、マルチレイヤー機能があり、あるキーを押すと、テンキーに切り替えるといった使い方もできます！

# Try And Errorしやすい！！
しかも上記のキー配置はGUI上で簡単に設定できます。

自分に合ったキー配置をTry And Errorで見つけてみませんか！

![_2020-11-03_12.30.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/596a3e07-d5a1-acf1-e9a9-8b1c4602a083.png)

![_2020-11-03_12.28.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/c0f05e21-99c2-4179-e187-3a672dde99f7.png)


# まとめ
いかがでしたか？
ErgoDox EZを試してみたいと思いましたか？

ご購入はこちらからできます！
https://ergodox-ez.com

ただ、新しく購入する場合は、新商品の**MOONLANDER**も良い感じです！
クローン兵みたいで格好いいですね！
https://www.zsa.io/moonlander

![スクリーンショット 2020-11-03 20.04.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/607bf3c0-3092-8039-c5b3-7865e82853a8.png)

[twitter](https://twitter.com/yassun_youtuber)や[youtube](https://www.youtube.com/channel/UCajrdoGzHzDogrNrLYYmGsg/featured?view_as=public)もしているので、感想やコメント等お待ちしています！！
それではまた次回！
npm 最新版 インストール 方法

最新のnpmを簡単にインストールする方法伝授してゆく！！！
----

n packageとかいうのを使う!


```
sudo apt-get update
sudo apt-get install nodejs
sudo apt-get install npm
```

次にキャッシュをクリアしてから、n packageを導入する

```
sudo npm cache clean
sudo npm install n -g
```

最新版(安定してるverとるよー)

```
sudo n stable
パス通す
sudo ln -sf /usr/local/bin/node /usr/bin/node
```

これからはn packageで管理するための最初に入れたnodeは使わないから消しておく！

```
sudo apt-get purge -y nodejs npm
```

バージョン確認

```
npm -v
node -v
```

このサイトにあるNode.jsのversionとnpmのバージョンが"Fermium"のやつになってれば成功！
https://nodejs.org/ja/download/releases/
住所から位置情報（緯度経度）を求める．PythonでGeocode 〜Geocoderとpydams〜

Google Colaboratory使用

#Geocoder
https://qiita.com/yoshi_yast/items/bb75d8fceb712f1f49d1
を参照

#pydams
詳細は以下
https://github.com/hottolink/pydams
http://newspat.csis.u-tokyo.ac.jp/geocode/modules/dams/index.php?content_id=2
https://www.hottolink.co.jp/blog/20180823_98734/

##準備

```
!wget http://newspat.csis.u-tokyo.ac.jp/download/dams-4.3.4.tgz
!tar -xzvf dams-4.3.4.tgz
```


```
!git clone https://github.com/hottolink/pydams.git
!patch -d ./dams-4.3.4 -p1 < ./pydams/patch/dams-4.3.4.diff
```


```
%cd dams-4.3.4
!./configure; make
```


```
!make install
!ldconfig
!ldconfig -v | grep dams
```


```
!ldconfig -v | grep dams
```


```
!make dic
!make install-dic
```


```
%cd ../
![ ! -d 'pydams' ] && git clone https://github.com/hottolink/pydams.git
%cd pydams
!make all
!make install
```


```
!pip freeze | grep pydams
#実行結果
#pydams==1.0.4
```


```
from pydams import DAMS
from pydams.helpers import pretty_print

DAMS.init_dams()
address = u"東京都港区芝公園４丁目２−８"

# geocode() method
geocoded = DAMS.geocode(address)
pretty_print(geocoded)

# geocode_simplify() method
geocoded = DAMS.geocode_simplify(address)
pretty_print(geocoded)

"""実行結果
score: 5
candidates: 1
	candidate: 0, address level: 7
		address:東京都, lat:35.68949890136719, long:139.69163513183594
		address:港区, lat:35.65850067138672, long:139.75155639648438
		address:芝公園, lat:35.65782928466797, long:139.75172424316406
		address:四丁目, lat:35.65620422363281, long:139.7484588623047
		address:２番, lat:35.658538818359375, long:139.74542236328125
score: 5
candidates: 1
	candidate: 0, address level: 7
		address:東京都港区芝公園四丁目２番, lat:35.658538818359375, long:139.74542236328125
"""
```


##住所を入力とし，緯度経度を返す関数

```
def GEOCODE(address):
  DAMS.init_dams()
  # geocode() method
  geocoded = DAMS.geocode_simplify(address)
  res = geocoded['candidates'][0]
  return [res['y'], res['x']]
```


```
print(GEOCODE('東京都港区芝公園４丁目２−８'))
#[35.658538818359375, 139.74542236328125]
```
【ELB】ロードバランサーの種類

## 1. ALB （Application Load Balancer）
**種類**：L7リバースプロキシ
**サポートプロトコル**：HTTP、HTTPS（レイヤー7）
**セキュリティグループ**：設定あり
**SSL Termination**：HTTPS Termination
**ユースケース**：柔軟なアプリケーション管理とHTTPS Terminationが必要な場合

### 特徴
- 同一のインスタンスで複数ポートに負荷分散

- IPアドレスをターゲットに設定
- リクエストの内容に基づいてリクエストをサービスにルーティング可能（**コンテントベースルーティング**）
- ネイティブHTTP/2対応
- HTTP/HTTPSリクエストを処理するLambda関数の呼び出しをサポート
- 削除保護機能
- AWS WAFを使用したウェブアプリケーション保護
- コンテナ化されたアプリケーションのサポート

## 2. NLB （Network Load Balancer）
**種類**：L4 NATロードバランサー
**サポートプロトコル**：TCP、TLS（レイヤー4/5）
**セキュリティグループ**：設定なし
**SSL Termination**：TLS Termination
**ユースケース**：高度なパフォーマンスと静的IPが必要な場合

### 特徴
- 固定IPアドレスを設定可能

- 大規模アクセスが予測される際に暖機申請が不要
- 低レイテンシー・高スループットを維持しながら秒間数百万リクエストの処理が可能
- CloudWatchによるメトリクスレポート
- CloudTrailによるAPIコールの追跡
- ターゲットのインスタンス側でインターネット側のアクセス元を許可する必要がある
- トラフィックの宛先のIPアドレスをターゲットのIPアドレスに書き換えて転送するため、応答のトラフィックはロードバランサーを経由せずにターゲットから直接クライアントに送信される
- ターゲットの中で正常に動作しているものがない場合や、指定されたゾーンのNLBノードで異常が発生している場合、トラフィックはRoute 53によって他のAZのロードバランサーノードに転送される（**DNSフェイルオーバー**）
- NLBが応答しない場合、Route 53との統合により、使用できないロードバランサーのIPアドレスはサービスから削除され、トラフィックが別のリージョンのNLBに転送される


## 3. CLB （Classic Load Balancer）
**種類**：L4/L7リバースプロキシ
**サポートプロトコル**：HTTP、HTTPS（レイヤー7）、TCP、SSL（レイヤー4/5）
**セキュリティグループ**：設定あり
**SSL Termination**：SSL Termination
**ユースケース**：アプリケーションがEC2 Classicネットワーク（VPCの以前のネットワーク）内に構築されている場合

### 特徴
- EC2-Classicネットワーク内に構築されたアプリケーションが対象
PowerAutomateでTeamsに投稿するときにメンションするメモ

#どんな流れか
イベント→メンション先の設定→Teamsへの投稿

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737206/3336bccd-64f3-b1b6-bdbb-207b4f46bfbe.png)


メンション先はユーザIDやユーザプリンシパルとのこと。
＝__ユーザ名@ドメイン名__らしい。


投稿までならPowerAutemateで出来たけど、やりたいこと（その先の動作）をやろうと思うと、
PowerAutemateではコネクタがなかったから別サービスを使うことになりそう。

まだ動作確認したわけではないので後で書きなおすかも。
⇒ちゃんと送信できた。
送信者がFlowとなるのは何とかしたい。。。

#豆知識
メッセージ中に改行を入れるのはびーあーる<br>らしい。HTMLなの？
どうやらマークアップ言語を無理やりいれてるっぽい。
jenkins pipelineのwaitUntilを使う際に気をつけること


# waitUntilとは
[Pipeline: Basic Steps - waitUntil](https://www.jenkins.io/doc/pipeline/steps/workflow-basic-steps/#waituntil-wait-for-condition)

trueを返すまで処理を再試行してくれる。

```groovy
steps {
	waitUntil { // 気をつけポイント1
		script {
			if ("条件") {
				try {
					sh "ping IP ADDRESS" // 気をつけポイント3
					true
				} catch(error) {
					false
				}
			} else {
				true // 気をつけポイント2
			}
		}
	}
}
```

# 気をつけポイント
1. waitUntilは"step"なのでstepsの内(scriptの外)
2. waitUntilの終わりにはtrueが必要、条件分岐したりする場合はtrue忘れに注意
3. pingでの疎通確認は(あまり)適さない
    4. pingは実行され続けるから、そこで止まる
    5. c1しても返り値確認など必要
    6. 用途によってはnslookupやdigなどを
Apple Developer と Google Play の公式テスターについて

## 概要

久々に調べて毎回ググるのが面倒だからここにまとめる。
iOS/Androidのアプリ開発で、公式のテスター登録について次の内容となる。

※一部公式の内容を抜粋しているため、アップデートがあった際に詳細が異なる可能性があり、この記事をそのまま鵜呑みにせず必ず公式ページを確認するようにお願いします。

## [TestFlight](https://developer.apple.com/jp/testflight/)

　<img width="500" alt="lockup-hero-large_2x.png" src="https://developer.apple.com/testflight/images/lockup-hero-large_2x.png">


### 内部テスター
* チームでAccount Holder、Admin、App Manager、Developer、Marketingのいずれかの役割を担うメンバーを**最大100人**まで追加可能。

### 外部テスター
* Eメールアドレスを使用するか、任意のユーザーに対してAppのテストに参加する機会を開くパブリックリンクを有効にして共有することで、**最大10,000人**の外部テスターを招待可能。


## [Play Console](https://support.google.com/googleplay/android-developer/answer/3131213?hl=ja)

　<img width="500" alt="maxresdefault.jpg" src="https://i.ytimg.com/vi/zt_cNQse05s/maxresdefault.jpg">


### 内部テスト版

* メールアドレスを使用して内部テスターのリストを作成できます。内部テストには、アプリごとに**最大 100 人**のテスターが参加可能。

### クローズドテスト版

* メールアドレス
    * クローズド テスト版では、メールアドレスを使ってテスターのリストを作成でき、合計 200 件のリストを作成でき、各リストには**最大 2,000 人**のユーザーを登録が可能。
    * リストは 1 トラックにつき最大 50 件作成が可能。


## 補足

上記は一部の情報のみ抜粋しているためさらに詳細は公式ページを確認してください。
OpenCV　「画像の切り取り、四角を書く」

##画像の切り取りについて
趣味でOpenCVを利用している人や研究でOpenCVを利用している人、どちらも画像の切り取りを使いと思うときはあるはずです。画像の切り取りは非常に簡単ですが、座標を求めないとどこを切り取りたいのか分かりません。座標の求め方は次回しますので、ここでは単なる切り取りのご紹介。

##Mark5 画像の切り取り

```
#include <opencv2/opencv.hpp>
#include<iostream>

#if _DEBUG
#pragma comment(lib,"opencv_world430d.lib")
#else
#pragma comment(lib,"opencv_world430.lib")
#endif

using namespace cv;	
using namespace std;

int main(void) {


	Mat img = imread("C:\\opencv\\sources\\samples\\data\\lena.jpg");

	img = Mat(img, Rect(150, 200, 200, 140));															


	imshow("View", img);

	waitKey();

	return 0;

}

```
このように出てくればOKです。
![rena1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843242/2672adcd-9b10-20de-fbc8-b861ecdd59c1.jpeg)


######解説①
今回追加されたのはこれです。

```
img = Mat(img, Rect(150, 200, 200, 140));
```
これらの引数は

```
出力画像 = Mat(入力画像, Rect(x座標, y座標, 横幅(width), 縦幅(height)));
```
の意味を持ちます。

######解説②
座標は画像ツールとかでも見ることができると思います。

##Mark6 画像中に四角を書く

```
#include <opencv2/opencv.hpp>
#include<iostream>

#if _DEBUG
#pragma comment(lib,"opencv_world430d.lib")
#else
#pragma comment(lib,"opencv_world430.lib")
#endif

using namespace cv;	
using namespace std;

int main(void) {


	Mat img = imread("C:\\opencv\\sources\\samples\\data\\lena.jpg");

	rectangle(img, Point(0, 295), Point(180, 430),Scalar(255, 0, 0), 5);					


	imshow("View", img);

	waitKey();

	return 0;

}


```
このように出てくればOKです。
![rena2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843242/3d75a6f1-b6f3-0557-dbe7-d00bdc0d557a.jpeg)

######解説①
今回追加されたのはこれです。

```
rectangle(img, Point(0, 295), Point(180, 430),Scalar(255, 0, 0), 5);
```

rectangleの引数は

```
rectangle(入出力画像, Point(長方形の左上の座標), Point(長方形の右下の座標),Scalar(BGRカラー指定), 線の太さ);
```

######解説②
これ以上解説ないな・・・
rectangleは二つの座標点が必要だから気を付けましょう。Rectも二つの座標からも切り取れるので試してみてください。このような矩形をバウンディングボックスともいうみたいです。詳しく知りたい人はバウンディングボックスで検索してみてもいいかも。

##最後に

どちらも画像を扱う時には必ず出会うものだと思います。一度試してみてはどうでしょう。
最近、鬼〇の刃を見に行きました。かっこよくてテンションアゲアゲです。「OpenCVの呼吸　壱ノ型　rectangle」ぜひ使ってみてください。
Foreground Service利用時の注意点

Android開発を始めて間もないため、ちょっとしたことで躓いてしまうのですが、ForegroundServiceでハマってしまいました。

## API Level 28 以上の場合の対応
Manifestファイルに追記が必要でした。これがなかったため、Service開始時にアプリが落ちていました。

```Kotlin
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
```


## 参考
[Foreground Serviceの基本](https://qiita.com/naoi/items/03e76d10948fe0d45597)
[Android 9 Pie 時代のフォアグラウンドサービス](https://rakuishi.com/archives/android-9-pie-foreground/)
【kintone】標準機能だけで平方根の計算をしてみる

こんにちは！
平方根の計算ができたらいいなぁ・・・（´-`）.｡oO
と思うこと、ありますでしょうか？
ないですよね？

平方根が必要になることはナイもしれませんが、
標準機能だけで（無理やり感はありますが）計算できましたので記事にしてみます＾０＾


# ニュートン法を使う
平方根を求めるには、ちょっと数値計算の知識が必要そうです。
ニュートン法という方法を使ってみたいと思います。
仕組みをまとめてみたので気になる方は読んでみてください。
ニュートン法のことはいいからやり方～という方は「[アプリを作る](#アプリを作る)」まで飛んでください

他の方法も試したのですがニュートン法が一番楽そうだったのでこれにしました。

## ニュートン法とは

今回は平方根たとえば$x^2=A$のような$x$を求めたいので


```math
f(x)=x^2-A
```

な、$y=f(x)$の2次関数のグラフがあるとします。↓こんな。

![20201104_041120164_iOS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/5577d0c2-b693-b0fc-d263-5ae6140f324f.png)

とある$x$座標を$x_n$として、$f(x_n)$に接する直線と$x$軸の交点の$x$座標を$x_{n+1}$とします。
$n$から$n+1, n+2, n+3,...$と続けていくと、$y=f(x)$のグラフと$x$軸との交点（つまり$x^2=A$の解）が求められるという仕組みです。

## 直線の傾きを求める

直線の傾きを求めていきます。
先程の図から、2種類の方法で直線の傾きを求めることができます

まずは微分です。$y=f(x)$のグラフに接する直線の傾きは「微分」で求めることができます。

```math
傾き= f'(x) ・・・・①
```

次は見た目の傾き。傾きは、三角形で言うところの、$\frac{高さ}{底辺}$で求めることができます。
図の青線と赤線でできる三角形を見てください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/aa7e2380-8c6e-7890-8936-470cfd8b4b34.png)



底辺は$x_n-x_{n+1}$、高さは$f(x_n)$で表すことができます
というわけで、

```math
傾き = \frac{f(x_n)}{x_n-x_{n+1}} ・・・・②
```

①も②も同じ傾きのことを表しているので、

```math
 f'(x_n) = \frac{f(x_n)}{x_n-x_{n+1}} ・・・・③

```
と表すことができます。

一番最初に$f(x) = x^2 - A $としていました。これを式に代入していきたいと思います。
まずは微分して・・・

```math
\\f(x) = x^2 - A

\\f'(x) = 2x

\\つまり

\\f(x_n)=x_n^2 -A

\\f'(x_n) = 2x_n

```
③に代入していきます

```math
\\ f'(x_n) = \frac{f(x_n)}{x_n-x_{n+1}} 

\\ 2x_n = \frac{x_n^2-A}{x_n-x_{n+1}} 

```

これを$x_{n+1}=$の形にしてまとめると、最終的に↓のような形になります。

```math

x_{n+1}=\frac{1}{2}(x_n + \frac{A}{x_n})

```
この、最後のまとまった式を使って、平方根を計算していきます。

$x_0$に適当な値を入れて、$x_1, x_2, ..., x_{10}$ のように10回くらい繰り返すとだんだん平方根の値に近づいていきます。

$x_0$の初期値を適切な値にするのが大切ですが、今回はAの値を初期値にしたいと思います。
また、平方根なので、プラスとマイナスがありますが、プラスの方だけ求めます。


# アプリを作る


こんなふうに数値フィールド１つと、計算フィールドを10個並べます。
Aの最小値を0にしておくといいと思います。

数式は後述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/2da6a2df-cc81-e792-d9c9-f073fd14dc1b.png)

| フィールドの種類 | フィールドコード | 計算式 |
|:-:|:-:|:-:|
|数値| A |  (手入力) |
|計算| Aの平方根 | IF(A=0,0,x9)  |
|計算|x0|(A + 1) / 2   |
|計算|x1|  (x0 + A/x0) / 2 |
|計算|x2|  (x1 + A/x1) / 2 |
|計算|x3|  (x2 + A/x2) / 2 |
|計算|x4|  (x3 + A/x3) / 2 |
|計算|x5|  (x4 + A/x4) / 2 |
|計算|x6|  (x5 + A/x5) / 2 |
|計算|x7|  (x6 + A/x6) / 2 |
|計算|x8|  (x7 + A/x7) / 2 |
|計算|x9|  (x8 + A/x8) / 2 |

# 動作確認＆まとめ
大きい数になるともしかしたら、収束しないなどあるかもしれませんが、その時は$x_n$の数を増やしてください＾＾
というわけで、平方根（プラス）を求めることができました。
![heihou.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/1c7a96ad-15a2-18f6-5e18-49ff747c6b3d.gif)


世の中のいろんな公式等を他にも試してみたいと思います＾０＾