OmniAICreator/Qiita-1.07M huggingface dataset:
redisコマンドの備忘録

redisをしばらく使わないと忘れるので、使ったコマンドをメモ

## 環境

|redis|v3.2.1|
|:--|:--|

## コマンド
値の確認方法
1. keyの確認
``` > keys *```
2. 型の確認
``` type <key>```
3. 値の確認
typeによってコマンドが違う

|コマンド|型|メモ|
|:--|:--|:--|
|get <key>|string||
|lrange <key> 0 -1|list|-1は末尾の指定、-2は末尾から2番目を指す|
|zrange <key> 0 -1|zset||
|hgetall <key>|hash||
|hkeys <key>|hash|fieldの確認|
|hvals <key>|hash|valueの確認|

## sentinel
手動でfailoverをしたいときはredis-cliで下記を実行
sentinel failover mymaster
[公式ドキュメント](https://redis.io/topics/sentinel#sentinel-commands)
ExcellentからのVBAの32bit/64bitの同居

#[Excellent][2]
[2]:https://www.ksc.co.jp/bi/excellent/
システムコンサルタント社製のExcelアドインとして動作するBIツールでVBAのコードを出力することができます。

#32bit/64bit VBA
Excellentの32bit版と64bit版どちらにも対応するVBA

```vb
#If VBA7 And Win64 Then
Declare PtrSafe Function XLTLoginP Lib "XLTVBA32.DLL" (ByVal PUID$, ByVal PPASS$, ByVal MSGF%) As LongPtr
Declare PtrSafe Sub XLTPassMask Lib "XLTVBA32.DLL" (ByVal FLG%, ByVal sLEN%, ByVal PASS$)
Declare PtrSafe Function XLTLogout Lib "XLTVBA32.DLL" (ByVal HDL As LongPtr) As Long
Declare PtrSafe Function XLTSQLExecS Lib "XLTVBA32.DLL" (ByVal HDL As LongPtr, ByVal DOM$, ByVal SQL$, ByVal MSGF%, ByVal HENF%, ByVal sROW&, ByVal JOBF%, ByVal SHEET$, ByVal ROWNO&, ByVal COLNO%) As Long
#Else
Declare Function XLTLoginP Lib "XLTVBA32.DLL" (ByVal PUID$, ByVal PPASS$, ByVal MSGF%) As Long
Declare Sub XLTPassMask Lib "XLTVBA32.DLL" (ByVal FLG%, ByVal sLEN%, ByVal PASS$)
Declare Function XLTLogout Lib "XLTVBA32.DLL" (ByVal HDL&) As Long
Declare Function XLTSQLExecS Lib "XLTVBA32.DLL" (ByVal HDL&, ByVal DOM$, ByVal SQL$, ByVal MSGF%, ByVal HENF%, ByVal sROW&, ByVal JOBF%, ByVal SHEET$, ByVal ROWNO&, ByVal COLNO%) As Long
#End If

Dim Handle As LongPtr
Dim Exec As Long
```

ようするに、

32bitのDeclare文の後ろにPrtSafeを追加すれば64bitのDeclare文に対応するので、ディレクティブで64bitと32bitを分ける。
HandleをLongPtr型にすればどっちにも対応※

※　Handleの型は32bit版はLong型ですが、LongPtrは32bitだとLong、64bitだとLongLongになるので、（[LongPtr データ型][1]）LongPtrにしておけばOK!
[1]:https://docs.microsoft.com/ja-JP/office/vba/Language/Reference/User-Interface-Help/longptr-data-type
【初心者必見！？】git rebaseを使うタイミング😈

## 結論

`git merge` の代わりに使いましょう！

## 序章

本記事では、rebase初心者の「rebaseってどこでどう使えば良いんだ🤔」という疑問に答えていきます。

rebaseは超汎用的なコマンドなので
Gitマスターの皆さんには物足りないかと思いますが、ご了承ください。🙇


## 詳しい説明

### git rebaseとは

[解説記事](https://qiita.com/KTakata/items/d33185fc0457c08654a5)です。  

要はブランチの歴史改ざんコマンドです。


### git mergeとは

[解説記事](https://backlog.com/ja/git-tutorial/stepup/stepup2_4.html)です。  

要はブランチとブランチを統合するコマンドです。

### なんでわざわざrebase使うの？

#### 前提条件

今親ブランチ**master**と子ブランチ**develop**があるとします。  
画像の数字は時系列順でのコミット順番です。  
時系列が master → develop → master になっているのがわかると思います。

masterブランチ  
<img width="300" alt="スクリーンショット 2019-04-11 11.18.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/187231/0fc1d561-1fce-f2d7-a66a-65bfa5431dd7.png">


developブランチ  
<img width="300" alt="スクリーンショット 2019-04-11 11.18.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/187231/06a05f9d-03aa-5a70-2cca-d3272f4a5852.png">



#### コミットログが汚くなる

git mergeは超強力なブランチ合体コマンドですが、
`コミットログがぐちゃぐちゃになっていく`、という問題があります。

##### 要素１：作業ブランチの持つコミットの間に他ブランチのコミットが挟まる

これはdevelop から **$ git merge master** を実行した結果です。

<img width="235" alt="スクリーンショット 2019-04-11 11.20.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/187231/b2b432cb-3d87-b369-a0c3-84da5b3a9105.png">

developコミットの間にmasterブランチのコミットが来ていますね。  
git mergeだとコミットを時系列順に並べて合体させるので仕方ないのですが、

なんとなく**developのコミットはまとまって表示されてほしくはないですか？**

##### 要素２：mergeメッセージが生成される

上画像の一番上にcommitした覚えのないコミットがあります。
これはmergeした時必ず生成されるコミットです。  
mergeするたび生成されるため、結構な頻度で入ってきます。

レビュアーやコーダーがコミットの履歴を追う際には一切必要ないですよね？  
**なるべく減らしたくはないですか？**

### だからrebaseを使おう！

ここで、mergeではなく**$ git rebase master**を実行した場合の結果を見てみると・・・

<img width="257" alt="スクリーンショット 2019-04-11 11.24.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/187231/bc21d867-ff1e-d435-89a3-e9a9e0ea92a8.png">

#### コミットがまとまる

画像のように、masterブランチのコミットが下に行き、  
developのコミットがすべて上に配置されるようになりました。綺麗ですね！🔅

#### マージコミットが出来ない

git mergeのときは生成されていたマージコミットがありません！美しい・・・  

### 使ってはいけないrebase

こんなに美しいコミットログを生成するrebaseですが、使ってはいけないシーンが存在します。

それは`複数人が参照しているブランチ`に変更を取り込む場合です。

下は[某ページ](https://qiita.com/KosukeSone/items/514dd24828b485c69a05)の画像を拝借したものですが、
開発ブランチ(develop)から機能開発ブランチ(feature)が2つ切られています。

<img width="152" alt="スクリーンショット 2019-04-10 19.33.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/187231/ad979e4b-0db6-f511-320e-62ae763bae9f.png">

このようなブランチ構造でrebaseをして良いのは**各featureブランチ**のみです！   

developブランチでは複数のfeatureブランチに参照されているため、
rebaseを控えたほうが懸命です。

#### なんで使っちゃいけないの？

自分より詳しく説明しているサイトがたくさんあります！
[例えばこのサイトとか。](https://frasco.io/why-you-should-stop-using-git-rebase-535fa30d7e25)  

簡単に言うと、rebaseは歴史を作り変える処理です。  

なのでfeatureブランチがdevelopの古い歴史に
依存しているときにdevelopの歴史を全く違うものにした場合、  

次にfeatureブランチをdevelopブランチに取り込むとコンフリクトの雨あられになります。😭

#### じゃあどこで使うべき？

機能追加や修正等、
自分がリポジトリでなにか作業をする場合は必ずブランチを切りますよね？

このような`1人しか見ていない、参照していないブランチ`にrebaseを使ってやると良いです。

例えば自分の作業ブランチはrebaseを使うようにすることで、
小さくきれいなコミットを作ることが出来、かつマージコミットを量産せずに済みます。


### じゃあrebaseはmergeのときだけ使えば良いんだね！

実は、rebaseの本当の意味は**gitの歴史を書き換えるコマンド**であり、
イコールmergeの代用なわけではありません。  
rebaseはそれ以上の可能性を持っているので、ぜひ他の使い所を見つけてみてください。


### 結論

というわけでrebaseは自分ひとりが参照しているような末端のブランチで行いましょう！
masterやdevelopなど、複数のコーダが参照するブランチにはmergeで対処しましょう！

良いGitライフを〜😘
VSCodeでコピーする時に「書式なし」をデフォルトにする

# TL;DR

* VSCodeでコピーする際に、「書式なし」でクリップボードにコピーするためには「設定」の「テキストエディター」の「Copy With Syntax Highlighting」のチェックを外す
* この状態で「書式付き」でコピーするには、コマンドパレットから「Copy With Syntax Highlighting」を実行する。

なお、記事執筆時点のVSCodeのバージョンは1.33.0。

# はじめに

最終的にWordで提出しなければならない書類でも、最初はテキストエディタで書いて、最後に貼り付けて体裁を整える、ということをやっている人は多いと思う。しかし、最近のVSCodeはデフォルトでコピーが「書式つき」になっている。そうすると、例えばVSCodeで「プレーンテキスト」で書いているつもりが、Wordに貼り付けると背景色などがコピーされて困ることになる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/31fc4bf3-8e6e-69ae-ff51-278c50608be6.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/0502ebde-0d59-1aa1-b99d-95517466729e.png)


Wordなどは「形式を選択してペースト」のメニューがあるが、いちいちコンテキストメニューを開いたり、追加キーを押すのは面倒だし、ほとんどの場合「書式なし」で貼り付けたいような人は、デフォルトでそうなっていて欲しい。で、その方法があまりウェブに載っていなかった(すぐに見つからなかった)のでここに残しておく。

# 設定

デフォルトでコピーに書式を含めないようにするには、VSCodeのメニュー「Code」から「基本設定」→「設定」を選び、「テキストエディター」の「Copy With Syntax Highlighting」のチェックを外せばよい。設定の検索窓に「Copy With」とか入れるとすぐに見つかると思う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/55024a56-705d-9fb0-de7a-e517ad14faab.png)

以後、デフォルトでコピーが書式なしになる。

しかし、コードスニペットをコピーする時など、書式付きでコピーしたいこともたまにはあるだろう。その時には、該当範囲を選択してからコマンドパレットで「Copy With Syntax Highlighting」を選べばよい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/ed6e21c9-b06d-c1f8-74c1-99879cf14268.png)

# 参考

やり方を知ってから調べると、Qiitaにも設定方法の記事があった。

* [[自分用] VSCode (on Mac)使い方メモ](https://qiita.com/suke_masa/items/9bd845c03064b3902886)
Oauth2.0 providerをrailsで作る

以下の記事を参考
https://qiita.com/kyonsuke19101/items/407f3cdfec38d1108e9d

##エラー回避
403error →　admin_authenticatorのコメント欄をactivation
adminカラムをuserに追加
root to: 'home#show'をroutesに追加
#GCP ( Google Cloud Platform ) の Google翻訳API で #MarkDown を翻訳するとスタイルが崩れてしまうので #ruby gem で一旦 #HTML  変換してから Markdown に逆変換する #shell コマンドの例


# Prepare

- `sudo gem install reverse_markdown`
- `sudo gem install redcarpet`
- install gcloud
- setting Google Translate API on GCP

# tmp/example.md

<pre>
```
# あまがみヘッダー

*そうだ京都行かない。*

## うずらの卵

- 神風パラダイス
- おおむね大丈夫です

```
print('孫氏や老師の楽園')
print('一寸先はホタテ')
```
</pre>

# ~/.secret/google-service-credential.json

your GCP service account file json

# get-token.sh

```
GOOGLE_APPLICATION_CREDENTIALS=~/.secret/google-service-credential.json gcloud auth
```

# translate.sh

```
#!/usr/bin/env bash

basedir=$(dirname "$0")

TOKEN=$("$basedir"/get-token.sh) \
  "$basedir"/translate.py | \
  jq --raw-output '.data.translations[].translatedText'
```

# translate.py

Google Translate API では resouce として html 形式を指定することが出来る (デフォルトはこちら)

[Method: translate  |  Cloud Translation API  |  Google Cloud](https://cloud.google.com/translate/docs/reference/rest/v2/translate)

```py
#!/usr/bin/env python3

# -*- coding: utf-8 -*-

import os, sys, requests, json, fileinput, re

#resource_message = ''
#for text in sys.stdin.readlines():
#  resource_message += re.sub(r'\\n', "\n", text)

resource_message = sys.stdin.read()

from_language = os.environ.get('FROM') if os.environ.get('FROM') else 'ja'
to_language = os.environ.get('TO') if os.environ.get('TO') else 'en'
translate_format = os.environ.get('FORMAT') if os.environ.get('FORMAT') else 'text'

data = {
  'q': resource_message,
  'source': from_language,
  'target': to_language,
  'format': translate_format
}

url = 'https://translation.googleapis.com/language/translate/v2'
token = os.environ['TOKEN']

headers = {
 'Authorization': 'Bearer {}'.format(token),
 'Content-Type': 'application/json',
}

res = requests.post(url, headers=headers, json=data)

print(json.dumps(res.json()))
  

```

# exe

- テキストは翻訳され、コードは翻訳されていないのが分かる
- PHP / Github スタイルのバッククォート複数個での コードブロック記法が、半角スペース4個でのベーシック記法に崩れてしまっているが、良い ruby gem や python module などが見つからなかったのでとりあえず放置

```
$ redcarpet --parse=fenced_code_blocks ./tmp/example.md | FORMAT=html ./translate.sh | reverse_markdown
```

ただしGoogle翻訳時にコードブロック内の改行が崩れてしまうようなので、独自対応する必要があるかもしれない

```
# Amagami header 

_Yes I can not go to Kyoto._

## Quail egg 

- Kamikaze Paradise 
- Mostly okay 

     print('孫氏や老師の楽園') print('一寸先はホタテ') 


```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1178








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Auroraの性能検証（EC2との比較，データ量と計算時間の関係）

# TL;DR

下記の観点で，AWS Auroraの性能検証を行いました．

* AWS Auroraと，EC2上に構成したMariaDBで性能比較しました
    * RDBベンチマークTPC-Hによる計算時間の計測
        * BI(Business Intelligence)向けの処理で，比較的大きな複数のテーブルからなるDBに対してクエリを発行するものです．
        * 意思決定（Decision Making）などで使用される傾向がある処理です
    * どちらかというと，Webサービスで使用される際の性能ではなく，バッチ処理での性能評価をしています
* **データ量と処理時間**の関係
    * 対象データ量ごとにAWS Auroraでの性能評価を行います

* この記事は，下記の記事の続編です．この記事から読み始めることもできます
    * [データベースベンチマークTPC-HをMySQLで実行する(TPC-H v2.18.0)](https://qiita.com/myoshimi/items/bd460164af48ece1ab2d)
    * [AWS AuroraにMariaDBクライアントから接続して使用する](https://qiita.com/myoshimi/items/eda6df62ae9aaa98bb1d)

# 実験設定

TPC-Hは，使用するテーブルサイズを指定する(SF: Scale Factor)ことができるので，
SF=1, 4, 8でベンチマークするテーブルを用意しました．

## Aurora

以下の表のパラメータでAuroraを設定します．

| 設定名 | パラメータ |
|-----|----|
|エディション | MySQL 5.6 との互換性 |
|DBエンジン|Aurora(MySQL)-5.6.10a|
|インスタンスタイプ|db.r5.large 2vCPU, 16GiB RAM|
|マルチAZ|なし|

## MariaDB

* t2.smallを作成
* MariaDBインストール，自動起動の設定

```bash
sudo yum -y update
sudo yum -y install mariadb mariadb-server
sudo systemctl start mariadb
sudo systemctl enable mariadb
```

* 初期設定（ルートパスワードなどの設定）

```bash
sudo mysql_secure_installation
```

その他は，auroraと同じように，テーブルの作成，データの登録，インデックスの作成を行います．

# 実験手順

* Query1からQuery22まで，順番に実行し，
    * クエリの実行ごとに ```RESET QUERY CACHE;``` を実行し，キャッシュクリアしてパフォーマンスを正しい計測を行います

```bash
for i in `seq 1 22`; do
(time mysql -u [ユーザ名] -h [DBMSエンドポイント] -D [データベース名] -p[パスワード] < ${i}.sql) >> log.txt 2>&1;
mysql -u [ユーザ名] -h [DBMSエンドポイント] -p[パスワード] -e 'RESET QUERY CACHE;'
done
```

# 計測結果

TPC-Hで使用するテーブルおよびクエリの詳細は，[ドキュメント(tpc-h_v2.18.0.pdf)](http://www.tpc.org/tpc_documents_current_versions/pdf/tpc-h_v2.18.0.pdf)を参照してください．

# AuroraとEC2の比較

## 計算結果

* AWS auroraと，EC2(t2.small)で，SF=1 (1GiB)のデータを対象にしたベンチマーク結果を示します
    * ![sf1.png](https://qiita-image-store.s3.amazonaws.com/0/309617/eb53cc03-c98d-cfaf-295b-276d22375d9a.png)

## 考察：フルマネージドRDBサービスauroraの利点

* インスタンスタイプに応じた性能が得られているように見えます
* auroraはec2に比べて計算時間上の利点が示されています
* インスタンスタイプの差以上に，EC2よりも良い性能を示すクエリもあります（Query9, 10, 13, 14, 18)
    * 大きなテーブル（lineitem）の結合処理を含むクエリ(Query 9, 10, 14, 18)
    * likeを含むクエリ(Query 13, 14)
    * これらの，重たい処理を含む場合に，auroraの利点が得られるようです

# Auroraの結果の比較

## 計算結果

* AWS auroraで， SF=1, 4, 8 を対象にした計算結果を示します

![aurora.png](https://qiita-image-store.s3.amazonaws.com/0/309617/7cf3091c-d3c8-995b-2532-1501e24bc7d5.png)

## 考察: RDBのスケーラビリティ問題

* データ量に応じて，計算時間を要します
    * 結合処理を含む場合(Query1以外)は，データの量に対して, $O(n^2)$ の計算時間を要します
        * MySQLの結合処理はNested-loop joinであることから，苦手な処理です
    * 大きなテーブル(lineitem)の結合を含むクエリで，極端に計算時間が大きくなるものもあります(Query3, 8, 9, 10, 12, 14, 16, 18, 20, 21)
        * メモリ不足で計算時間が増大したようにも見えます

# まとめ

* Auroraは，フルマネージドなRDBとして，一定程度のBI(Bussiness Intelligence)処理に効果が得られることが示されました
    * EC2上に自分でDBを作るよりも，性能が出そうです
* とは言え，テーブルサイズが大きくなると，（EC2はもちろんauroraでも）計算時間が激増してしまいます
    * そもそもRDBで実施するクエリではないとも言えるので，巨大データの結合を含むような処理は，別の方法を考えたほうが良いかもしれません

# 参考

* [tpc-h_v2.18.0.pdf](http://www.tpc.org/tpc_documents_current_versions/pdf/tpc-h_v2.18.0.pdf)
* [データベースベンチマークTPC-HをMySQLで実行する(TPC-H v2.18.0)](https://qiita.com/myoshimi/items/bd460164af48ece1ab2d)
* [AWS AuroraにMariaDBクライアントから接続して使用する](https://qiita.com/myoshimi/items/eda6df62ae9aaa98bb1d)
ansible でpowershellを使い windows を操作する(まだ途中です)

#### windows 10 に移行するために、大量のアカウントをＰＣに設定するためには役立つ記事です。それ以外はあまり役立つ気はしません。

まず、こちらをよみましょう。[AnsibleでWindowsを操作する準備をする](https://qiita.com/yunano/items/f9d5652a296931a09a70)

- つっこみどころ満載ですので、間違いあったらぜひご指摘ください。

#### ansible から、windows を操作するため
##### 操作マシン(linuxを想定)
- version 確認: ansible --version
- ansible には、pywinrm　が必要
- conda instal -c conda-forge pywinrm
- 対象マシンには原則 administrator ではいります、はいれないときは、別の管理者アカウントではいってください。
- 権限などの設定は、インベントリファイルのhosts に書いておきます。
- hosts の例 windows という名前を付与してあります。

```
# hosts の例
# ansible 192.168.1.xx  -m win_ping　 (設定したら ping でチェック)
[windows]
# ip か hostname 
192.168.1.xx
[windows:vars]
ansible_connection=psrp
ansible_port=5986
ansible_auth=basic
ansible_psrp_cert_validation=ignore
ansible_user=administrator
ansible_password=xxx ここにパスワードを書く xxx
```
 
##### 対象Windows 設定
- 動作環境: powershell 5.x 以上 (wiundows 7 は、2.xです。)
- Powershellの実行ポリシーの変更 : Set-ExecutionPolicy RemoteSigned
- Ansible用WinRMモジュールのインストール 下記で説明
- 
```
# とりあえず、作業用ディレクトリworkをつくる 
PS C:\> mkdir C:\work
PS C:\> cd .\work

PS C:\work> Invoke-WebRequest -Uri https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1 -OutFile ConfigureRemotingForAnsible.ps1

PS C:\work> powershell.exe .\ConfigureRemotingForAnsible.ps1
```
### 最初は,ping を試します。結果は、どりあえず、/tmp/temp.1 に出力します。

- playbook のサンプル
- ansible-playbook -i hosts  ping.yml  -e "host=192.168.1.xx"

```
# ファイル名は、ping.yml 
# host は、インベントリ（今回は、hosts) に指定があること 
- hosts: "{{ host }}"
  gather_facts: No
  tasks:
  - name: ping
    win_ping:
    register: result
  - local_action:
      copy content={{ result }} dest=/tmp/temp.1
```

### powershell に引数を渡す
- 作ったアカウントで、リモート接続できるようにするスクリプトです。
- ansible から、powershell のスクリプトを呼び出します。
- playbook から見て files/remote_user_add.ps1 とします。

```
# remote desktop user に加える
param
(
        [Parameter(Mandatory=$True,Position=1)]
        [string]$remote_user
)
Add-LocalGroupMember -Group "Remote Desktop Users" -Member "$remote_user"
```
- 上記 powershell の呼び出す ansible-playbook

```
- hosts: "{{ host }}"
  gather_facts: false
  tasks:
  - name: powershell
    script: files/remote_user_add.ps1 {{ remote_user }}
    register: result
  - local_action:
      copy content={{ result }} dest=/tmp/temp.1
```
- playbook は引数をつけて実行

```
ansible-playbook -i hosts remote_user_add.yml  -e "host=192.168.1.xx remote_user=hogehoge"

```
- これを実行するとリモートデスクトップでuser: hogehoge にアクセスできます。
- リモートですぐにはいれるようになるので、ちょっと便利な程度です。たくさん設定するときは、便利でしょう。
UbuntuのMariaDBのrootパスワードが分からなくなった場合の初期化方法


```bash

sudo su -
/etc/init.d/mysql stop
killall mysqld_safe
killall mysqld
mysqld_safe --skip-grant-tables &

mysql -uroot
use mysql;
update user set password=PASSWORD("mynewpassword") where User='root';
update user set plugin="mysql_native_password";
quit;

/etc/init.d/mysql stop
kill -9 $(pgrep mysql)
/etc/init.d/mysql start
mysql -u root -p

exit
```

おそらくMySQLでも使えると思う。
平日や休日の日数を計算するシート

ある年の平日や休日の日数を計算する必要があったので、こんなシートを作成してみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165689/5f138023-da7a-4367-999a-6f79858d807a.png)

ダウンロードは[こちら](https://ibm.box.com/s/p1mxjx6kjweal4ihfn0er9bi1mz3b2lt)から。

祝日リストはこちらの[ブログ](http://zangyoukeisan.cocolog-nifty.com/blog/2011/09/post-b23f.html
)を参照させていただきました。


##計算ロジックや使用した関数など

###NETWORKDAYS.INTL

Excel標準関数のNETWORKDAYS.INTLを使って、土日や祝日を除いた平日の日数を計算しています。

~~~
NETWORKDAYS.INTL(開始日, 終了日, [週末], [休日])
~~~

###MATCH

祝日リストから該当年の祝日リストを取り出すために使用しています。該当年の開始日と終了日の位置（祝日リストの先頭行からの相対行数）を計算しています。

~~~
MATCH(検査値, 検査範囲, [照合の型])
~~~

###INDEX

先のMATCH関数を使用して得られた相対位置を使って、セル参照を取得するために使用しています。ここで取得したセル参照は、NETWORKDAYS.INTL関数の休日フィールドに「：」（コロン）で繋いで、リストとして渡しています。

~~~
INDEX(配列, 行番号, [列番号])
~~~

###DATAVALUE

年の開始日を計算するために使用しています。CONCATENATE関数を内部で使用して、文字列の連結を行っています。

~~~
DATEVALUE(日付文字列)
~~~

###EDATE

年の終了日を計算するために使用しています。年の開始日に12か月を足して1日引いて、12/31を求めています。年の終了日が12/31なのは自明なので、CONCATENATE関数とDATEVALUE関数から計算しても同じ結果が得られます。

~~~
EDATE(開始日, 月)
~~~
Windows10の「設定」「Edge」などのUWPアプリが遅い(特にCopyProfileしたとき)のを解消する

### まずはログオフ
これは`%LOCALAPPDATA%`以下のファイルを消すので、自分がログインしている状態では出来ません。
他のアカウントでログインする、[movefile](https://docs.microsoft.com/en-us/sysinternals/downloads/movefile)を使う、Win PEを使うなどのオプションがあります。

### 準備
GUI経由で削除するなら「保護されたオペレーティングシステムファイルを表示しない(推奨)」をUncheckしておかないとファイルが表示されません。
![Fig-01.png](https://qiita-image-store.s3.amazonaws.com/0/390679/8162aaf8-c25a-7a29-595d-ef79d570be33.png)

### 消す

```
C:\Users\User\AppData\Local\Microsoft\Windows\INetCache\*.*
C:\Users\User\AppData\Local\Microsoft\Windows\WebCache\*.*
C:\Users\User\AppData\Local\Microsoft\Windows\WebCacheLock.dat
```

以上3点を消す、これだけ。次にログインした時には解消されているはずです。
SysprepのUnattend.xml内でCopyProfileを指定した時に頻発していた問題です。特に1803以前。
【初心者向け】Pythonでお絵かき

PythonのTurtle Graphicsというライブラリの紹介をします。
(ぜひ自分の絵を書いてみてね！）

#この記事の対象者#
・これからpythonを始める方
・親子でプログラミングを楽しみたい方
・お絵かきが好きな方

#1.ターミナルを立ち上げよう#
まずはターミナルをクリックして起動しましょう。

![ターミナル.png](https://qiita-image-store.s3.amazonaws.com/0/387778/b88159b1-33a2-75c8-7d9b-ec3c0c4834bf.png)

図1:<font color="red">赤い四角</font>で囲まれたアプリをクリックします。

![terminal.png](https://qiita-image-store.s3.amazonaws.com/0/387778/e1162564-8664-aba0-ea5a-57304fab3a5a.png)
図2:ターミナルの最初の画面


#2.pythonを起動しよう#
まず初めにPythonを起動します。
起動方法は簡単で、$マークの横にpythonと打ち込むだけです。


```
python
```

![python.png](https://qiita-image-store.s3.amazonaws.com/0/387778/7843d876-ab95-3b25-c2bf-96e01eada7b7.png)
図3:pythonと打ち込んで**>>>**が表示されていれば大丈夫です。

#3.turtleをインポートしよう#
まずはturtleというライブラリをPythonにインポートします。
「import turtle」と打ち込んでください。

```
import turtle
```

![turtle.png](https://qiita-image-store.s3.amazonaws.com/0/387778/35ada70c-c92d-3a2c-33e2-883f81b3e6ac.png)
図4:import turtleのイメージ

#4.画面を表示しよう#
次に画面を表示します。画面を表示するために下のようにコードを打ってください。

```
oekaki=turtle.Turtle()
```

![turtle_init.png](https://qiita-image-store.s3.amazonaws.com/0/387778/563e5c46-cbc8-27b8-621f-eda37473362c.png)
図5:最初に表示される画面

#5.いろんな技を身につけよう#
今回は技を紹介します。
・forward()
→○○だけ前に進む
![forward(100).png](https://qiita-image-store.s3.amazonaws.com/0/387778/9901e8e3-be9e-66bf-669b-106ed01e783a.png)
図6:前に100進む

・circle()
→半径○○の円を書く
![circle(100).png](https://qiita-image-store.s3.amazonaws.com/0/387778/eb763956-40d6-d245-093c-f56c119c905e.png)
図7:半径100の円を描く

・left()
→左に○○°回転する

![left(90).png](https://qiita-image-store.s3.amazonaws.com/0/387778/a613536b-cf8d-8fc5-35a9-633df4f8a477.png)
図8:方向転換


right()
→右に○○°回転する


pensize()
→ペンの太さを○○にする

![pensize(10).png](https://qiita-image-store.s3.amazonaws.com/0/387778/9326a205-0dc2-7b76-0056-87fee08e0ab3.png)
図9:ペンの太さを変える


#6.正方形を書いてみよう！
まず最初に一辺が100の正方形を書いてみます。

![square.png](https://qiita-image-store.s3.amazonaws.com/0/387778/ea7ba782-52d7-c4db-7dcd-28c52b9a5476.png)
図10:正方形を描く

#7.自分の作品を作ってみよう#
技を駆使して自分の作品を作ってみましょう！

![logo.png](https://qiita-image-store.s3.amazonaws.com/0/387778/09f0eba5-7e5e-7edc-4e17-a0b2e06034f7.png)
図11:ロゴを作ってみました。
apt のプロキシ設定（Ubuntu 18.04 Server）


Ubuntu 18.04 Serverでaptのプロキシ変更で躓いたのでメモ

何につまずいたのかと言うと
1. Ubuntuインストール時にProxyを設定
2. Proxyが不要になったので削除したい
3. 環境変数には設定が記述されてない
4. apt install したいのに「Proxyに繋がんねえよ！」と怒られて使えない子になる

結果、インストール時にProxyを設定した場合は
`/etc/apt/apt.conf.d/90curtin-aptproxy`
の設定をコメントアウト（#）する。

巷では.bashrcや.profileやapt.confで設定するとあるが、意外なところにも設定があった。

あまり情報がなかったので助けになれば。

参考：[“Unable to connect” error with apt-get?](https://askubuntu.com/questions/164169/unable-to-connect-error-with-apt-get)
配列の内容を繰り返し文で表示

# コード
## ES5まで
`for文`で作った連続する数値を配列のインデックス（添字）として使う。

```js
var tsuna = ['クロ','ミナミ','メバチ','キハダ','ビンナガ'];
for(var cnt=0; cnt<5; cnt++){
    console.log(tsuna[cnt] + 'マグロ');
}
```
## ES2015
配列に所属する要素を変数に入れていく。
`for(let 変数 of 配列)`

```js
let fish = ['クロ','ミナミ','メバチ','キハダ','ビンナガ'];
for(let tsuna of fish){
    console.log(tsuna + 'マグロ');
}
```

# 参考
> ふりがなプログラミング
CircleCIでプッシュした時にCIしないコミットコメント

`[ci skip]` または `[skip ci]` をコミットメッセージに含めることでCircleCIのワークフローを起動しないようにすることができます。

管理コンソールでは `NOT RUN` と表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18273/5f01b62a-ea6f-44a5-4ea2-9949be31fe1a.png)

参考
https://circleci.com/docs/2.0/skip-build/
ABC -107- A&B&C

#AtCoder ABC 107 A&B&C
[AtCoder - 107](https://atcoder.jp/contests/abc107)

#A問題

```java
		Scanner scanner = null;

		try {
			scanner = new Scanner(System.in);

			System.out.println((scanner.nextInt() - scanner.nextInt()) + 1);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題

 - 白い部分を省く=黒い部分があったら省かない
    - 縦横で黒い部分をマークして、交差する箇所のみを出力すれば白い部分を省ける

```java
	private void solveB2() {

		try (Scanner scanner = new Scanner(System.in)) {
			int numH = scanner.nextInt();
			int numW = scanner.nextInt();

			char[][] wk = new char[numH][numW];

			int[] arrayH = new int[numH];
			int[] arrayW = new int[numW];
			/*
			 * 黒い部分をマーク
			 */
			for (int i = 0; i < wk.length; i++) {
				wk[i] = scanner.next().toCharArray();
				int cntBlak = 0;
				//今取り込んだ箇所に黒い部分があれば列を記録
				for (int j = 0; j < arrayW.length; j++) {
					if (wk[i][j] == '#') {
						arrayW[j] = 1;
						cntBlak++;
					}
				}
				//今の行に1列でも黒い部分があればこの行は黒を持つ
				if (cntBlak > 0) {
					arrayH[i] = 1;
				}
			}
			/*
			 * マークした黒い部分を判定
			 * 縦と横のマークが重なる部分を出力
			 */
			for (int i = 0; i < numH; i++) {
				if (arrayH[i] == 0) {
					continue;
				}
				StringBuilder builder = new StringBuilder();
				for (int j = 0; j < numW; j++) {
					if (arrayW[j] == 0) {
						continue;
					}
					builder.append(wk[i][j]);
				}
				if (builder.length() != 0) {
					System.out.println(builder.toString());
				}
			}

		}
	}
```

#C問題

 - 最初のスタートが$位置0$から一番近いところを選択するのがいいように思ったけど、、、それよりは全探索で十分

**並びの配列は3つ**
そのため、0 -> n の探索と、n -> 0 の探索の両方を行う必要がある

 - パターン1：0（スタート）が数列の真ん中にある
$-188, \; -187, \; -186, \; -185, \; -98, \; -90, \; 100, \; 110, \; 120$

 - パターン2：0（スタート）は一番最後より大きい
$-190, \; -189, \; -188, \; -187, \; -186, \; -185, \; -98, \; -90, \; -50, \; -40$

 - パターン3：0（スタート）は一番最初より小さい
$90, \; 100, \; 110, \; 120, \; 130, \; 140, \; 150, \; 160, \; 170, \; 180, \; 190, \; 200$


```java
/**
	 * Cは、とりあえず|r|に移動して|r|+|r+numK|-|r|
	 * を右と左から実施する。
	 * |  1---N  | 0 |  1---N  |
	 * というように、0より大きい場合も0より小さい場合もあるので、
	 */
	private void solveC() {

		try (Scanner scanner = new Scanner(System.in)) {

			int numN = scanner.nextInt();
			int numK = scanner.nextInt();

			if (numK == 1) {
				System.out.println(0);
				return;
			}
			int[] wk = IntStream.range(0, numN).map(i -> scanner.nextInt()).toArray();

			int plusNumK = numK - 1;
			int res = Integer.MAX_VALUE;

			/*
			 * 0 -> N まで、K本連続してつけるのに必要な時間の最小を求める
			 */
			for (int i = 0; i < wk.length - plusNumK; i++) {
				res = Math.min(res, Math.abs(wk[i]) + Math.abs(wk[i] - wk[i + plusNumK]));
			}

			/*
			 * 上記同様に、N -> 0までK本連続してつけるのに必要な時間の最小を求める
			 */
			for (int i = wk.length - 1; i >= plusNumK; i--) {
				res = Math.min(res, Math.abs(wk[i]) + Math.abs(wk[i] - wk[i - plusNumK]));
			}
			System.out.println(res);

		}
	}
```
UiPath - Diffの見方-01.Sequenceの展開

皆さんの中に Uipath の開発を行っていて、以前とどこを変えたっけ？
と思ったことは無いでしょうか？

今後は公式より以下のようなdiff機能が用意されるようです。
https://studio.uipath.com/lang-ja/v2019-fastTrack/docs/using-file-diff

それまでのつなぎとして、前のxamlとのdiffの見方を今回は記します。

## Sequenceの展開

UiPathではSequenceの展開/非展開の状態が変化しただけでも、もちろん差分となります。
展開/非展開の判断は以下の文で記述されています。
True:展開
False:非展開
```
<x:Boolean x:Key="IsExpanded">True</x:Boolean>
```

winmaergeでの画像を以下に記します
![diff_Sequence_まとめ.PNG](https://qiita-image-store.s3.amazonaws.com/0/158953/64f68db4-c9ed-ab17-15e5-58e3f861604a.png)
Lambda Custom Runtime を使って分かった事のまとめ。

Lambdaのカスタムランタイムを少しだけ使ったためその際に分かった事を覚えておくためにまとめたい。

###Lambdaとは
サーバーを管理する必要なくコードを実行できるAWSサービス。
また、スケーリング等も自動で行ってくれるため関数のコードを書くだけで実行ができる。

実態はおそらくAmazon Linux上で動いている。

###Lambda 関数とは
Lambdaでコードを実行する一塊。実態は以下に展開され
通常ハンドラで設定されたコードが実行される。

> /var/task/

(環境変数 $LAMBDA_TASK_ROOT)

###Lambda layer とは

利用可能なライブラリやカスタムランタイム(後述)をLayerとして登録することで
複数の関数で共通的に利用できる仕組み。

zipでLambdaにあげ関数実行時に以下の場所に展開される。

> /opt/

###Lambda Custom Runtime とは

Lambda layerの一種。Lambdaでサポートされていない言語も、
Custom Runtimeを使うことで使用することができるようになる。

実際は以下の場所をエンドポイントとしてそのファイルを実行する。
そのためbootstrap内にその環境でやりたいことをすべて書いていおかなくてはならない。

> /opt/bootstrap

bootstrapの例(公式抜粋)

>\#!/bin/sh
>cd $LAMBDA_TASK_ROOT
>./node-v11.1.0-linux-x64/bin/node runtime.js

TODO 続きを書く

参考
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html
ポートが既に使われているエラーの場合は、不要なポート番号を削除する。

# Address already in use... のエラー

Railsにて``$rails s``を実行時、下記のようなERRORが発生した。

```
$ rails s
.
.
.

/Users/kikkutonton/.rbenv/gems/2.6.0/gems/puma-3.12.1/lib/puma/binder.rb:273:in `initialize': Address already in use - bind(2) for "::1" po
rt 3000 (Errno::EADDRINUSE)
```
### エラー原因
エラー文通り、``localhost:3000``のポートが既に他のポートに使われていることが原因のエラー。
### 対処法
不要なポートを削除する。
#### 使われているポート番号を確認
```
$sudo lsof -i:3000
COMMAND     PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke 17067 kikkutonton   22u  IPv4 0xeexxxxxxxxxxxxxx      0t0  TCP *:hbci (LISTEN)
com.docke 17067 kikkutonton   23u  IPv6 0xeeyyyyyyyyyyyyyy      0t0  TCP localhost:hbci (LISTEN)
```
#### 使用ポートを削除
```
//PID番号
$sudo kill xxxx 
```
PG::InsufficientPrivilege: ERROR:  permission denied to create database

#PG::InsufficientPrivilege: ERROR:  permission denied to create databaseの解決
`PG::InsufficientPrivilege: ERROR:  permission denied to create database`
これを解決するためには、データベースユーザにデータベースの作成権限を付与します。次のように、PostgreSQLのターミナルでALTER ROLEによりCREATEDBオプションを付与します。

`$ sudo -u postgres psql`
と入力し、続けて
`postgres=# ALTER ROLE <ユーザー名> WITH CREATEDB;`
と入力すると
`ALTER ROLE`
と出力される。

この後
`\du`
にて実際に権限が付与されているか確認できます。
CircleCIでジョブを途中で終了する

任意のタイミングでジョブを終了する方法は、`run:` で `circleci step halt` を実行することです。

なぜこんなものが必要かというと、masterにタグがpushされたときだけ処理したいような場合があります。
しかしこんなふうにfiltersを設定しても、masterにプッシュされただけで、タグが無くてもreleaseジョブは実行されてしまいます。

```yaml:config.yml
workflows:
  version: 2
  release:
    jobs:
      - release:
          filters:
            branches:
              only:
                - master
            tags:
              only:
                - /^.*$/
``` 

そこでreleaseジョブの中で、タグが設定されていなかったら後続の処理をしないでスキップしたいという発想になりました。
以下のようなジョブ定義で意図した動作になりました。

```yaml:config.yml
jobs:
  release:
    <<: *job_base
    steps:
      - run:
          name: skip_if_no_tag
          command: |
            if [ "${CIRCLE_TAG}" == "" ]; then
              echo "no tag"
              circleci step halt
            fi
      - checkout
      - run: bundler install
      - <<: *restore_gradle_cache
      - <<: *resolve_gradle
      - <<: *save_gradle_cache
      - run: fastlane deploy
```
TD_TIME_RANGEについて

https://support.treasuredata.com/hc/en-us/articles/360001450828-Supported-Presto-and-TD-Functions
prestoエンジンでサポートされているTD関数について。(部分意訳・要約)

## TD_TIME_RANGEとは
データを取ってくる時間の範囲を指定するもの

## 利用背景
大量データ前提のDBに対して時間範囲を指定しないと、クエリの実行に時間がかかる
そのため、時間範囲を指定し易い関数を提供している

## 構文
```
TD_TIME_RANGE(int/long unix_timestamp, # 基準となる日時
              int/long/string start_time, # 範囲開始日(時)
              int/long/string end_time[, string default_timezone = 'UTC']) # 範囲終了日(時) (オプションでタイムゾーンを任意で指定できる)
``` 

## 例
```
SELECT ... WHERE TD_TIME_RANGE(time, '2019-01-01 PDT')                 # OK
SELECT ... WHERE TD_TIME_RANGE(time, '2019-01-01', '2019-01-02','PDT') # OK
SELECT ... WHERE TD_TIME_RANGE(time, NULL, '2019-01-01', 'PDT')        # OK
SELECT ... WHERE TD_TIME_RANGE(time, '2019-01-01', NULL, 'PDT')        # OK
SELECT ... WHERE TD_TIME_RANGE(time, '2019-01-01', 'PDT')              # NG
 
```

### ポイント
- 日時の指定は時刻の省略はできる('YYYY-MM-DD' or 'YYYY-MM-DD hh:mm:ss')
- 第4引数のtimezoneが効くのは、start_timeとend_timeがtimezoneを持たない値の場合のみ

## 雑感
なんか変な国旗出てる
一番使用されそうな関数
TreasureDataはデータをtimeカラムに指定してある時間に対して、１時間単位で保存領域を分けて保存しているようなので指定すればそれだけ早く取れる
pytest でモジュールコードとテストコードをディレクトリで分離して unittest を実行するには？



# やりたいこと

* pytest を使って unittest を実行したい
* プロダクトコードとテストコードはディレクトリで分けたい
  * まさに[参考リンク](https://ja.stackoverflow.com/questions/44740/python-unittest%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E5%88%A5%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BE%E3%81%AA%E3%81%84)のイメージ
* 実行時は `python -m pytest` とかで勝手に test_XXX を discover して実行してほしい

# 上手くいかないこと

* 参考リンクの通りで、class_module.py の `imoprt class_BaseModule` で `ModuleNotFoundError` になる
  * テスト対象スクリプトから同ディレクトリ内の別モジュールを素で`import`していて、これが見つからない
* 解決法にある `sys.path.append()` って全テストコードの先頭に書くの？しかもモジュールコードまでの相対パスは自前で書かないといけないってそれマジ？ダサくない？(回答者の方ががダサいわけではない)
* 参考リンクの参考リンクにある 以下と心境は同じ

> I know I could modify PYTHONPATH and other search path related tricks, but I can't believe that's the simplest way

# 解らしきもの

pytest のドキュメントに記述があった。

https://docs.pytest.org/en/latest/goodpractices.html

* venv で環境を切って自身の開発モジュールを `pip install -e .` でインストールする
* そのためにプロジェクトルートに簡単な setup.py を置いておく
* モジュール内のコードはパッケージ(下の例では`hoge`)からの import パスを書く。つまり、b.py 中で モジュール`a`を使う場合、`import a` とするのではなく、`from hoge import a` とする。

```
sample_project
┣ hoge
┃ ┣ __init__.py
┃ ┣ a.py
┃ ┗ b.py
┣ test
┃ ┣ __init__.py
┃ ┗ test_b.py
┗ setup.py
```

``` python:a.py
# coding: utf-8

def a(src):
    return 'aaa' + src
```

``` python:b.py
# coding: utf-8

from hoge import a

def b(src):
    return a.a(src + 'bbb')

if __name__ == '__main__':
    print(b('hoge'))
```

このとき、hoge ディレクトリ下で `python b.py` を実行すると `ModuleNotFoundError: No module named 'hoge'` になる。
これを回避するにはプロジェクトルートから `python -m hoge.b` と実行するとよい。


# まとめ

* モジュール内で同ディレクトリ内の別モジュールを使う際も、`from package import module` とすべきで、素で`import`と書くのがむしろダサい(？)
* 素で`import`書くような(ローカルで完結する規模の)プロジェクトならテストコードをわざわざ別ディレクトリ構成にしなくてもええやん？
* モジュールとしてきちんとディレクトリ分けてテストを管理したいなら、pytestにあるようなプラクティスに従おうね
* でもまあそういうテストの準備が簡単にできるようなスケルトン生成ツールみたいなのはあってもいいんじゃないかと思た(探せばありそう)

おわり
Laravelでcronを使ったタスクスケジュールの注意点

cron登録で詰まった話。

```
# cront登録エディタ起動
crontab -e

# 下記を追記。(* * * * * にすると毎分実行)
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
```
これだけでcron登録はできる。
あとはLaravelで

```
php artisan make:controller TaskController
php artisan make:command SendMailCommand
```
そしてapp/Console/Kernel.phpを修正
の流れでタスクを登録できるという話だったのだが、どうにも自動実行してくれない。

正しくはcron登録時に下記のようにする必要がある。

```
* * * * * /usr/local/bin/php /path-to-your-project/artisan schedule:run >> /var/log/task.log 2>&1
```
cronはコマンドを全てフルパスで入力する。
また、dev/nullの代わりにログ出力先を指定してあげればcronのログを吐くようになる。

あとは
```service cron status```
で起動確認できればOK。

# cronで呼び出すfunctionはstaticにすること
	public static function send_mail()
	{
上記のような形式にする必要あり。
#メモ
cronで呼び出すContoller内でService層などを呼び出そうと
```$mail_info = $this->admin_serv->GetMailInfo($request->id);```
のように```$this```を使うと下記のエラーが出る。
どうやら１つのfunction内で完結するように書いてあげる必要がありそう。

```
local.ERROR: Using $this when not in object context
 {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0):
 Using $this when not in object context at /var/www/html/******.com/app/Http/Controllers/AdminController.php:299)
#ruby や #python で #markdown を #HTML に #shell のコマンドで変換できるモジュール四種類の簡単な結果比較

# Install

`gem install [module_name]` 

or

`pip install [module_name]`

# markdown text

<pre>
# header 

*あ*

## header2

- list
- list

```
print('ok')
print('yes')
```

</pre>

# ruby redcarpet

```
$ redcarpet  ./tmp/markdown
```

single quote HTML escaped

```html
<h1>header</h1>

<p><em>あ</em></p>

<h2>header2</h2>

<ul>
<li>list</li>
<li>list</li>
</ul>

<p><code>
print(&#39;ok&#39;)
print(&#39;yes&#39;)
</code></p>
```

enable multiple backquotes code block style

```
$ redcarpet --parse=fenced_code_blocks ./tmp/markdown
```

```html
<h1>header</h1>

<p><em>あ</em></p>

<h2>header2</h2>

<ul>
<li>list</li>
<li>list</li>
</ul>

<pre><code>print(&#39;ok&#39;)
print(&#39;yes&#39;)
</code></pre>
```

# ruby karmdown

```
$ kramdown ./tmp/markdown
```

Indented 

```html
<h1 id="header">header</h1>

<p><em>あ</em></p>

<h2 id="header2">header2</h2>

<ul>
  <li>list</li>
  <li>list</li>
</ul>

<p><code>
print('ok')
print('yes')
</code></p>
```

# python markdown


```
$ python3 -m markdown ./tmp/markdown
```

```html
<h1>header</h1>
<p><em>あ</em></p>
<h2>header2</h2>
<ul>
<li>list</li>
<li>list</li>
</ul>
<p><code>print('ok')
print('yes')</code></p>
````

# python markdown2


```
$ python3 -m markdown2 ./tmp/markdown
```

```html
<h1>header</h1>

<p><em>あ</em></p>

<h2>header2</h2>

<ul>
<li>list</li>
<li>list</li>
</ul>

<p><code>
print('ok')
print('yes')
</code></p>
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1174








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
logstashのログが/var/log/messagesにも出力されてしまうのを抑止する

## logstashをインストールして、起動すると/var/log/logstash/logstash-plain.logに出力される内容が、/var/log/messagesにも出力されてしまう。これを抑止する一つの方法として、systemctlで使うサービスファイルを編集する。StandardOutputとStandardErrorをそれぞれnullに設定する。行がなければ追加する。
##　これはlogstashの標準出力やエラー出力をjournaldが全て横取りして、/var/log/messagesに書いてしまう事が原因と考えられる。
## /etc/rsyslogd.confは特に変更する必要はない。

```/etc/systemd/system/logstash.service
[Unit]
Description=logstash

[Service]
Type=simple
User=logstash
Group=logstash
# Load env vars from /etc/default/ and /etc/sysconfig/ if they exist.
# Prefixing the path with '-' makes it try to load, but if the file doesn't
# exist, it continues onward.
EnvironmentFile=-/etc/default/logstash
EnvironmentFile=-/etc/sysconfig/logstash
ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash"
Restart=always
WorkingDirectory=/
Nice=19
LimitNOFILE=16384
StandardOutput=null
StandardError=null

[Install]
WantedBy=multi-user.target
```
Daruがわかりにくいのはだいたいrecodeのせい

RubyにはDaruというデータフレームがある。
イテレータまわりがわかりにくいと思ったら、半分ぐらいrecodeのせいである。

## recode メソッド
これが、Daru::Vectorや、Daru::DataFrame において `map` と同じ働きをするメソッドである。引数に `:row` `:vector` `:column` をとる。

以上
Windows10の「タスクバーにピン留めしているアプリ」の、「最近使ったもの」と「固定済み(いつも表示)」の設定ファイルとレジストリはここにある

### 背景
ある時、Windows 7 から Windows 10 へのリプレースの際に、そのPCのユーザーからリクエストがあり、
> タスクバーにピン留めしているExcelの「最近使ったもの」と「いつも表示」で固定してるショートカットたちも新しいPCに移しておいてね！

と言われました。この図でいうところのBook1.xlsのようなショートカットです。実際にはこれが20個とか30個とかあります。`USMT`がいい感じに移行してくれるだろう、と思っていたら意外に手こずりました。調べ物をしてもこの部分の情報が少なかったので書いておこうと思います。

![Fig-01.png](https://qiita-image-store.s3.amazonaws.com/0/390679/77905317-6bf4-d5a8-399e-9fe6151c639b.png)

### アプリ内で表示されるショートカット

```Registry:Registry
Computer\HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Excel\User MRU\*\File MRU
```
アプリを実際に開いて表示される「最近使ったもの」はここに格納されています。Officeのバージョンによってバージョン番号が変わるのはおなじみだと思いますが、Office 2013をインストールしてあるので15.0となっています。また`*`のキーは個別のSIDが入ります。
固定表示されているショートカット`(1)`とそうでないショートカット`(2)`は、このキーの中にあるデータ値の先頭にある`[F00000001]`という部分で見分けられます。`[F00000001]`が固定、`[F00000000]`が非固定です。

![Fig-02.png](https://qiita-image-store.s3.amazonaws.com/0/390679/1cfd7ee4-4ce7-6303-b268-fc014b1b6c36.png)
![Fig-04.png](https://qiita-image-store.s3.amazonaws.com/0/390679/5fc23071-cf53-d5d7-5dd9-a942400c67b5.png)


### タスクバーから表示されるショートカット
```Explorer:Explorer
%APPDATA%\Microsoft\Windows\Recent\AutomaticDestinations
```
(ちなみにこの他にも`%APPDATA%\Microsoft\Windows\Recent\CustomDestinations`という隠しフォルダもあります。)
このフォルダの中に保存されている、`*.customDestinations-ms`というファイルが、タスクバーからアプリを右クリックした時に表示される固定表示されているショートカット`(3)`とそうでないショートカット`(4)`を保存しています。
自分がハマったのは、アプリの中で表示されているショートカット(`(1)`と`(2)`)とタスクバーから表示されるショートカット(`(3)`と`(4)`)が_別物_であるということに気付かず、大分時間をロスしました。

このフォルダに保存されている`*.customDestinations-ms`ファイルのファイル名がぞれぞれ個別のアプリに対応しています。詳細は[forensicswiki.org](https://webcache.googleusercontent.com/search?q=cache:KaOKxk8B7WYJ:https://www.forensicswiki.org/wiki/List_of_Jump_List_IDs+&cd=1&hl=en&ct=clnk&gl=us)を参照しました。例えば、

| AppID | Application Description |
|:---|:---|
|9839aec31243a928|Microsoft Office Excel 2010 x86|
|f0275e8685d95486|Microsoft Office Excel 2013 x86|
といった具合です。ファイル名をリネームして、同じソフトの違うバージョン(`Office 2010`から`Office 2016`など)へとマイグレートも可能なことが分かりました。

![Fig-03.png](https://qiita-image-store.s3.amazonaws.com/0/390679/1c4c03a3-c182-9c88-88b8-4bc503687842.png)
![Fig-05.png](https://qiita-image-store.s3.amazonaws.com/0/390679/0202aa82-1128-ae76-4731-eb7a96dbe4c4.png)

### 無事できた
作業自体はレジストリのエクスポートとインポート、それからファイルのコピーだけでどうにかなります。細かいところですがPC環境を移行する時に違和感をなるべく無くすためにはこういうところも大事ですね。`Office 365`のアプリでも一緒の作業なので誰かの役に立つ事があると嬉しいです。
DatadogとCloudwatchの連携

DatadogのLogsにCloudwatchログを統合させる手順となります。

#1. Lambda関数をデプロイする
1. AWS Serverless Repositoryを利用する場合
AWS Serverless Repositoryより「Datadog log-forwarder」を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260139/8e24b276-b017-ba11-2856-78cb3cd71bf5.png)

2. Lambdaの環境変数に「DD_API_KEY」を設定する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260139/cc1cd106-cc83-bba9-1592-7b5d2f59837d.png)
※設定する値はDatadogのAPIs>API Keys>Keyの値
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260139/4114dc5f-c901-311b-a516-49e35de6c4ae.png)

3. Lambdaのタイムアウト値を延長する(2分以上推奨)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260139/4bf17d6d-4692-9076-1bd0-b969eb2935d9.png)

#2. CloudwatchからAmazon Lambda サービスへのストリーミング設定を実施
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260139/8a363a26-79a9-1518-569b-effe917d7350.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260139/f6f887b8-f0f4-304f-e8e7-50363e2fbc33.png)


設定に問題がなければ、
DatadogのLogs上にCloudwatchのログがストリームされるようになります。
ABC - 106- A&B&C

#AtCoder ABC 106 A&B&C
[AtCoder - 106](https://atcoder.jp/contests/abc106)

#A問題

 - 縦横からそれぞれ-1して算出

```java
	private void solveA() {
		Scanner scanner = null;
		int numA = 0;
		int numB = 0;

		try {
			scanner = new Scanner(System.in);
			numA = scanner.nextInt();
			numB = scanner.nextInt();

			System.out.println((numA - 1) * (numB - 1));

			System.out.println("");

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#B問題

 - その数の約数を全て調べる

```java
	private void solveB2() {
		Scanner scanner = null;
		int numN = 0;

		try {
			scanner = new Scanner(System.in);
			numN = scanner.nextInt();

			int count = 0;
			/*
			 * 1からNまでの数値を全探索
			 */
			for (int i = 1; i <= numN; i++) {
				if (i % 2 == 0) {
					continue;
				}
				int wkRes = 0;
				/*
				 * 数値iが、約数をいくつ持つのか調べる
				 * 最大でもNまで（i<=Nだし）
				 * 自身も約数だということを忘れずに
				 */
				for (int j = 1; j <= numN; j++) {
					if (j % 2 == 0) {
						continue;
					}
					if (i % j == 0) {
						wkRes++;
					}
				}
				if (wkRes == 8) {
					count++;
				}
			}

			System.out.println(count);

		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}
```

#C問題

 - $1$は$5000兆日後$も$1$のままだが、$2$は$2^{5000兆}$となるので計算は無理
 - 文字列がK番目まですべて$1$なら$5000兆日後$もK番目は$1$だけど、その間に$2以上の数値$が入っていればその数値になる
    - 文字列を$K番目$まで調べていって、$1$以外が出現したらその数値が$5000兆日後$の$K番目$
    - $1$のみだったら$5000兆日後$の$K番目$は$1$


```java
private void solveC() {
		Scanner scanner = null;
		String wkS;
		long count = 0;

		try {
			scanner = new Scanner(System.in);
			wkS = scanner.next();
			count = scanner.nextLong();
			String wk = wkS;
			if (count <= wkS.length()) {
				wk = wkS.substring(0, (int) count);
			}
			for (int i = 0; i < wk.length(); i++) {
				if (wk.charAt(i) != '1') {
					System.out.println(wk.charAt(i));
					return;
				}
			}
			System.out.println(1);
		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}

```
JavaScriptで簡単かけ算九九

# コード
```js
for(let x=1;x<10;x++){
    for(let y=1;y<10;y++){
        console.log(x + '×' + y + '=' + x * y);
    }
}
```

# メモ
- `for文`は、回数が決まった繰り返しに向いていて、`while文`は条件があって回数が決まってない繰り返しに向いている。

> ふりがなプログラミング
URLSessionを使ってGET通信【Swift】

## URLSession

例として郵便番号から住所を取得するとします。

今回利用させて頂くAPI：http://zipcloud.ibsnet.co.jp/doc/api

※プロダクションでは`!`せずに`guard`などで安全に処理してください

```swift
var component = URLComponents(string: "http://zipcloud.ibsnet.co.jp/api/search")!
component.queryItems = [URLQueryItem(name: "zipcode", value: "150-0011")]

URLSession.shared.dataTask(with: component.url!) { (data, response, error) in
    let json = String(data: data!, encoding: .utf8)!
    print(json)
}.resume()
```

```json:console
{
	"message": null,
	"results": [
		{
			"address1": "東京都",
			"address2": "渋谷区",
			"address3": "東",
			"kana1": "ﾄｳｷｮｳﾄ",
			"kana2": "ｼﾌﾞﾔｸ",
			"kana3": "ﾋｶﾞｼ",
			"prefcode": "13",
			"zipcode": "1500011"
		}
	],
	"status": 200
}
```
APIから取得したJSONは`Codable`という機能を使って型に変換することができます。

URLSessionでもシンプルに実装できたと思います。
他のFrameworkを使う前に`URLSession`の使い方を理解しておくのがおすすめです。
Githubの自分のリポジトリを一覧する

Githubのリポジトリが増えてくると何してたのかわからなくなるので一覧ななにかを用意する。
Descriptionに要素技術とかをちまちま入力していきたい。

* リポジトリ名
* GithubでのURL
* Description

を一覧する


## 作成物

作成物は[ここ](https://github.com/modeverv/github_all)。

## 内容

1. curlでAPIからjson取得
1. 取得結果をパース

## プログラム

```python
import json

with open('repos1') as f:
    jsons = json.loads(f.read().strip())
    for j in jsons:
        print(j['full_name'])
        print(j['html_url'])
        print(j['description'])
        print("\n")

```
```bash
#!/bin/bash

curl -u ${1} "https://api.github.com/user/repos?per_page=100&page=1" > repos1
python a.py > result.txt
rm -f repos1
open result.txt
rm -f result.txt
```

## 結果(抜粋)

```
.
.
.

modeverv/filedb
https://github.com/modeverv/filedb
None
.
.
.
modeverv/first-vue.js
https://github.com/modeverv/first-vue.js
None
.
.
.
```

## 参考というかそのまま

https://qiita.com/emergent/items/a557246a0c0bf9d50a11
【Linuxコマンド】AWKの使い方

awkの使い方について記載する。随時更新していく。


# AWKとは
「もし〇〇だったら、△△する」のような実行ができるコマンド。
パターンとアクションの2要素で構成し、「もし〇〇だったら」がパターン。「△△する」がアクション。
どちらかを省略することも可能。

# 書式

```
awk パターン {アクション}
```

# 使い方（パターンのみ）
例）echo "hoge"に対して、awkの判定結果で出力を制御する。

```
$ echo "hage" | awk '0'　 ←数字の0はfalse判定
$ echo "hoge" | awk '4'　 ←数字の0以外はtrue判定
hoge

$ echo "hoge" | awk '""'　　　←空の文字列はfalse判定
$ echo "hoge" | awk '"test"'　←空でない文字列はtrue判定
hoge
```


例）比較演算子で判定。

```
$ echo "hoge" | awk '$0 == "hoge"'
hoge
$ echo "hoge" | awk '$0 ~ "hoge"'　←'~'はマッチング演算子。$0に文字列hogeが含まれるためtrue判定　
hoge
$ echo "hoge" | awk '/hoge/'　　　　←単独/で囲うとマッチング演算子を省略できる
hoge
```
td_partial_deleteについて

td_partial_deleteについて(部分意訳・要約)
https://docs.digdag.io/operators/td_partial_delete.html

## td_partial_deleteとは
Treasure dataのテーブルから範囲を指定して削除するdigdagオペレーター

## オペレーター表記
`td_partial_delete> `

### ポイント
- ストリーミングインポート(fluentd)を使用したレコードは、td_partial_deleteを使用して数時間削除することはできない。
- INSERT INTO、Data Connector（MapReduce Executor）、および一括インポートされたレコードはすぐに削除できる。
- 時間は1時間単位で指定する
- 分や秒に0以外を指定することはできない

## 環境変数
Treasure Data APIキーが必須(クエリを実行する時に必要)

## パラメータの設定方法
```
+タスク名:
  td_partial_delete>: テーブル名
  database: DB名
  from: 日付(↓例)  T00:00:00+08:00 <-- 分、秒は0
  to:   2016-02-01T00:00:00+08:00
```

## 雑感
TDはUPDATEができないためこのような関数が提供されている
また、TDにはトランザクション機能もない
delete処理 -> insert処理の順序だと一時的にその期間のデータがまったくない状態が発生するので、ユーザーが頻繁に利用する場合などは考慮が必要
ScalaのListMapは挿入順序を保持しない

# はじめに
ListMap(mutableな)は名前的に順序を保持したMapを作ってくれると思って実装していましたが、
実際はそうではなかったので、勉強のため実装を追ってみることにしました。
※まだScala初めて一週間程度なので間違っていたらすみません。

# 結論

**immutableなListMapは挿入順序を保持するが、mutableなListMapは挿入順序を保持しないことを学んだ。**

```scala
import scala.collection.mutable

import collection.immutable.ListMap

object Untitled {
  def main(args: Array[String]) {
    val iListMap = ListMap[Int, String]()
    val iRes = iListMap.updated(1,"一郎").updated(2,"二郎").updated(3,"三郎").updated(4,"四郎")
    println("immutable:",iRes)

    val mListMap = mutable.ListMap[Int,String]()
    val mRes = mListMap.updated(1,"一郎").updated(2,"二郎").updated(3,"三郎").updated(4,"四郎")
    println("mutable",mRes)
  }
}

// output
//(immutable:,ListMap(1 -> 一郎, 2 -> 二郎, 3 -> 三郎, 4 -> 四郎))
//(mutable,Map(4 -> 四郎, 2 -> 二郎, 3 -> 三郎, 1 -> 一郎))
```


# 実装を追ってみる

## mutableなListMap
updatedは内部では、```map() += map()```を行っています。
なのでmutable.ListMapの以下のメソッドから解読をスタートします。
### +=

```scala
  def += (kv: (A, B)) = { elems = remove(kv._1, elems, List()); elems = kv :: elems; siz += 1; this }
```

kvに順次mapが格納され、Aにはkey、BにはValueが格納されます。
elemsにはremoveの結果が入ります。（removeの中身については下で説明）
最後にkvをremoveの結果の先頭に格納しています。

### remove

```scala
  @tailrec
  private def remove(key: A, elems: List[(A, B)], acc: List[(A, B)]): List[(A, B)] = {
    if (elems.isEmpty) acc
    else if (elems.head._1 == key) { siz -= 1; acc ::: elems.tail }
    else remove(key, elems.tail, elems.head :: acc)
  }
```

elemsは先頭要素を除いたListを再帰的に受け取り、accには最終的な処理結果を格納しています。
removeの```if```ではelemsが空になった時に、accを返却

removeの```else if```の処理では、同一keyを持った元のmapの要素を取り除き、新しい要素を**先頭に**追加しています。
例：map(1 -> "hoge") += map(1 -> "fuga") はmap(1 -> "fuga")

再帰的に呼び出す```else remove```の箇所で、処理結果の前に先頭要素を追加しています。
※@tailrecを付けることで末尾再帰になっていない場合はアラートを出せます。

実際にデバックで折ったところ、以下のようになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/234760/ebf6a6f8-1cc2-0a34-6425-0fa19472508e.png)

```remove(key, elems.tail, elems.head :: acc)```
の箇所で処理結果を末尾に追加しているため順序がずれているようです。

**参考記事**
https://www.techscore.com/blog/2015/06/15/scala_mutable_listmap/

## immutableなListMap

あとで書く
（現状自分のレベル低くて追えなかった・・・w）
WPA3 の脆弱性について

# 脆弱性の内容
WPA3の脆弱性が公表されました。具体的には WPA3-Personal で使用している SAE の脆弱性です。

## CVE-2019-9494
１つめは CVE-2019-9494(https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9494) で、アクセスポイント(hostapd) 、ステーション(wpa_supplicant)両方の脆弱性です。
いくつかの side channel attack 脆弱性が見つかっています。

パッチはこちらで提供されています。
https://w1.fi/security/2019-1/

## CVE-2019-9496
2 つ目は CVE-2019-9496(https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9496) で、アクセスポイント(hostapd) 側の脆弱性です。
不正な authentication を行うことで SAE confirm 処理でアクセスポイントを停止できてしまいます。

パッチはこちらで提供されています。
https://w1.fi/security/2019-3/

追記: CVE-2019-9496 の方は SAE の Dragonfly の脆弱性なので、 IEEE 802.11s にも影響があるとのこと。脆弱性発見者の Mathy Vanhoef さんのコメント。 https://twitter.com/vanhoefm/status/1116030105950851073

追記: 上記脆弱性を修正した hostapd/wpa_supplicant 2.8 がリリースされたので、そちらにスイッチすることを推奨します。
IBM Cloudに慣れるためにハンズオンしたメモ

### 背景
自分が真剣にクラウドと向き合ったのはAWS。ITアーキテクトとして本当によく研究したし、実際に操作した時間も長く、技術認定もSA Professionalまでは取った。
しかし今月から業務としてIBM Cloud、特にIaaS部分を触る機会というか、それが必要な仕事となり、仮想サーバー周りを触ってみたので作業メモを残しておくことにした。

### Wordpress構築でお勉強
よくあるハンズオンシナリオ、Wordpress構築をやってみた。

#### サーバーの準備
(1) Webサーバー

- TOK2
- Ubuntu18.0.4 Minimal LTS
- C1.1x1 最小構成
- Security Group
- Public: allow_outbound , allow_http , allow_https, allow_ssh
- Private: allow_outbound , allow_ssh
- SSH Keys -- ローカルで作成しておき公開鍵を登録

(2) DB サーバー

- TOK2
- Ubuntu18.0.4 Minimal LTS
- C1.1x1 最小構成
- Security Group
- Public: allow_outbound , allow_ssh
- Private: allow_outbound , allow_all
- SSH Keys -- Webサーバーと同じものでOK
-  本当はPublic IPはなしでやるのだが、ここは第１ステップとして ....      
-  allow_all のallは all inboundで定義されている


#### サーバーを設定
(1) Webサーバー
ssh -i 鍵ファイル ubuntu@'WebサーバーのPublic IP'でログイン

```bash
# Install PHP & mysql client
sudo apt -y update
sudo apt install -y apache2
sudo apt install -y php libapache2-mod-php php-mysql php-mbstring
sudo apt install -y mysql-client
    
# Install Wordpress 
wget https://ja.wordpress.org/latest-ja.tar.gz
tar xvf latest-ja.tar.gz 
cd wordpress
sudo cp -r * /var/www/html/
sudo chown www-data:www-data /var/www/html -R
sudo mv /var/www/html/index.html /var/www/html/index.html.back

# Launch
sudo systemctl enable  apache2
sudo systemctl restart apache2
```
(2) DBサーバー
ssh -i 鍵ファイル ubuntu@'DBサーバーのPublic IP'でログイン
（ 本当はVPN&Private IPでやりたいが、まずは第１ステップとして .... ）

```bash
# Install 
sudo apt -y update
sudo apt -y install mysql-server mysql-client
sudo mysql_secure_installation
```
mysql_secure_installationは適宜設定
mysql -u root -p で以下を実行

```sql
create database wordpress default character set utf8;
grant all on wordpress.* to wordpress@"%" identified by 'xxxxxx';
flush privileges;
```
bind-addressを変更

```shell
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
```

bind-address= 127.0.0.1 という部分を bind-address= 0.0.0.0へ変えて保存してからmysqlを再起動

```shell
sudo systemctl restart mysql
```
#### Wordpressを設定
ブラウザから http://WebサーバーのPublic IPアドレス/index.php ヘアクセスして
wordpressからmysqlへアクセスするための情報を登録

- データベース名:wordpress
- ユーザーID: wordpress
- パスワード: "grant all on.. で設定したパスワード" 
- データベースのホスト名:DBサーバーのPrivate IP
- テーブルの接頭辞：wp_

Wordpress設定成功が表示されたので、adminユーザーを設定し、ひとまず記事の一つも投稿してみて成功を確認。
気が済んだのでw、サーバーのオーダーをキャンセルし終了。（しばらく残っているけど、課金は即終了されているとのこと）

#### 所感メモ

- security groupにallow_outbound が明示的に必要だったことに最初ハマった。Privateをなんちゃってで実行したからか、後はハマりどころは特になし。内容として IBM Cloudらしいところはなかったからかもしれないが、少し自信をつけたw。
- 今回はデフォルトのsecurity groupを使用。カスタマーポータルから自身のものも定義できる。機能としてはAWSのさほど変わらないが、security group自体を５つまで同時設定できる。　AND条件でより狭くなるようだ.
- Wordpressの初期画面で index.php 出すため、横着かもしれないがとりあえずindex.htmlを追いやっているw