OmniAICreator/Qiita-1.07M huggingface dataset:
SSL化したサイトにAPIリクエストをなげても証明書エラー

# 発生したケース
クライアントから「さくらクラウドで動作していたサービスがウィルスに感染してOSをクリーンインストールされてしまうので助けてくれ」と依頼がきた。
調査が手間だったのとサービス自体も小さかったのでOS〜アプリケーションまでフルフルで新サーバーへ新規インストールすることにした。CakePHPで動いてるアプリケーションで証明書がLetsEncryptで動作している程度簡単な作業と思っていた。

# 問題発生
1日かけてデータ移行も終わり、サイトでの動作確認も終わったが20時のタイミングで先方のエンジニアからAPIを叩いてもレスポンスが返ってこないと。

# 症状
* ブラウザからの証明書は正しく動作してるように見える。
* NodeアプリケーションからのAPI通信は通らない
* PostmanやWEB検証ツールからのAPI通信は通らない
* Postmanの証明書認証をオフにすると動作する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21746/2a2ad6ca-909c-d308-9b05-bd6ee18576b9.png)

# 検証したこと
* ローカル完了のキャッシュ削除(ダメ) 
* http通信（通るが解決にはならない）
* 中間証明書の検証

```console
$ openssl version
OpenSSL 1.0.2o  27 Mar 2018
```

```
openssl s_client  -connect example.com:443 < /dev/null | grep "Certificate chain" -A 10
~~~省略~~~
verify error:num=21:unable to verify the first certificate
verify return:1
DONE
Certificate chain
 0 s:/C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=tk2-251-35269.vs.sakura.ne.jp/emailAddress=root@tk2-251-35269.vs.sakura.ne.jp
   i:/C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=tk2-251-35269.vs.sakura.ne.jp/emailAddress=root@tk2-251-35269.vs.sakura.ne.jp
---
```

証明書の検証に失敗していた。

## Apacheの設定を再確認


```apache
<VirtualHost *:443>
  SSLEngine on
  SSLProtocol all -SSLv2 -SSLv3
  SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA

  SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
  # ↓この設定が抜けていた
  # SSLCertificateChainFile /etc/letsencrypt/live/example.com/fullchain.pem

  # ~~以下略~~~
</VirtualHost>
```

確かにSSLCertificateChainFile(中間証明書)の設定が抜けていた。
これで怒られていたわけか

修正するとAPI通信も通り、無事移行作業も完了できました。
最近はLetsの証明書も簡単に取得できるようになっているが、やっぱりなんとなく動いてる状態怖いな。。。
Rustでランダム文字列を作成する

randの0.4系では以下のようにすれば得られました。
`thread_rng().gen_ascii_chars().take(32).collect::<String>()`

randの0.5系では廃止されてしまったので自作します。

```rust
extern crate rand;
use rand::seq::SliceRandom;

const BASE_STR: &str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

fn gen_ascii_chars(size: usize) -> String {
    let mut rng = &mut rand::thread_rng();
    String::from_utf8(
        BASE_STR.as_bytes()
            .choose_multiple(&mut rng, size)
            .cloned()
            .collect()
    ).unwrap()
}
```

なんとなく日本語もできたらいいなと思って改造してみました。

```rust
extern crate rand;
use rand::prelude::IteratorRandom;

const BASE_STR: &str = "あいうえお";

fn gen_chars(size: usize) -> String {
    let mut rng = &mut rand::thread_rng();
    let mut result: Vec<char> = Vec::new();
    for _ in 0..size {
        result.push(BASE_STR.chars().choose(&mut rng).unwrap());
    }
    result.into_iter().collect()
}
```
エラーへの対処法 dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.X.dylib

macOS でアプリケーションを実行しようとした時に次のようなエラーが出ました。
解決法を記載しておきます。


```sh
dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.8.dylib
```

```sh
dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib
```

## 環境

* macOS Mojave 10.14

## 影響を受けたソフトウェア

私の場合は下記のソフトウェアでエラーが出ました。
ほかのプログラムでもエラーの出ることがあります。

* R
* psql

## 原因 (予想)

各ソフトウェアをコンパイルした時のライブラリのバージョンと、エラーが出た時のライブラリのバージョンが異なるのが原因と思われます。
これは `brew update` でライブラリ類をアップデートしたときに起こります。

## 解決策

### 一時的な解決策

次のようなコマンドを実行して、ライブラリのバージョンを変更します。

```sh
brew switch readline 7.0.5
```

このようにして、使用されるライブラリのバージョンを変更するとエラーは起きなくなります。
バージョンがわからない場合は、例えば `brew switch readline 7.0.0` のように適当にバージョンを決めて入力すれば、 エラーメッセージでどのバージョンが選択可能なのか教えてくれます。次のように。

```
 % brew switch readline 7.0.0
Error: readline does not have a version "7.0.0" in the Cellar.
readline installed versions: 7.0.5, 8.0.0
```

もっと丁寧に調べるには、次のコマンドでバージョンを調べます。

```
 % brew info readline                                                                                                                                                                                                                                                                                                                                               [2/1975]
readline: stable 8.0.0 (bottled) [keg-only]                                                                                                                                                                                                                                                                                                                                 
Library for command-line editing                                                                                                                                                                                                                                                                                                                                            
https://tiswww.case.edu/php/chet/readline/rltop.html
/usr/local/Cellar/readline/7.0.5 (46 files, 1.5MB)
  Poured from bottle on 2018-07-10 at 12:07:02
/usr/local/Cellar/readline/8.0.0 (48 files, 1.5MB)
  Poured from bottle on 2019-04-11 at 19:55:26
...
```

ただし、 `brew update` 前とそのあとでインストールしたソフトウェアを同時に使う時には、バージョンの切り替えがかなり面倒になります。

### 恒久的な解決策

psql でエラーが出た時に、この方法で解決しました。

psql は `brew install postgresql` でインストールしたものです。
そこで、 使用したい readline のバージョンに `brew switch` で変更したあとで、 `brew reinstall postgresql` を実行して再インストールしました。
これにより、 psql を問題なく使用できるようになりました。

### 関連

* [tigがLibrary not loadedとエラーになってしまう現象の対応](https://qiita.com/luccafort/items/e36faff2d7e4320f2bf3)
* [Macでawkを実行するとエラー: "dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib" となる問題の解決法](https://qiita.com/nwtgck/items/f5427c0d0f7827658bd5)
* [Mac & Rails でreadlineなエラーが起きた時に対応したこと](https://qiita.com/siukaido/items/9143846d5421866b7898)
#TypeOnText CurSor Expression

#タイプ入力の様な表現

youtube 動画解説
https://youtu.be/rH6OheaGcgs

```jsx
//Common
var src = text.sourceText;
var CursorIcon = "|"
var TtoF = timeToFrames(t = time + thisComp.displayStartTime, fps = 1.0 / thisComp.frameDuration, isDuration = false) ;
var inPTtoF = timeToFrames(t = inPoint + thisComp.displayStartTime, fps = 1.0 / thisComp.frameDuration, isDuration = false);
var ST = add(TtoF,0.1);

//Default Setting
var BrinkTime = 30 ; //frame
var StartDur = timeToFrames(t = 1 + thisComp.displayStartTime, fps = 1.0 / thisComp.frameDuration, isDuration = false) ; // second
var TypeSpeedMin = 10 ; // frame 
var TypeSpeedMax = 10 ; // frame 
var Randomize = 0 ; //
seedRandom(Randomize,true);
var EndCarsor = true; //

//Time Stamp Setting
var Count = 1; //Fix Num
var tempTime = StartDur+inPTtoF;
var TimeStamp=[];

//Create Time Stamp in array
TimeStamp.push(tempTime);
while ( Count < src.length){
    tempTime = tempTime+Math.floor(random( TypeSpeedMin , TypeSpeedMax ));
    TimeStamp.push(tempTime)
    Count ++
}

for ( var i = 0 ; i < TimeStamp.length ; i ++ ){
    if ( TtoF　>= TimeStamp[i] ){
        if ( (Math.ceil( ( ST-TimeStamp[i] ) / BrinkTime ) % 2) === 1 ){
            if ( EndCarsor == true  || i < TimeStamp.length -1 ){
                src.slice(0,i+1)+CursorIcon
            }else{
                src.slice(0,i+1);
            }
        }else{
            src.slice(0,i+1)
        }
    }else if ( TtoF < TimeStamp[0] ){
        if ( Math.ceil( ( ST-TimeStamp[0] ) / BrinkTime ) % 2 ){
            "";
        }
        else{
            CursorIcon;
        }
    }
}



```
AndroidのMVVM+AACでの一貫したイベント処理方法について


[Android Jetpack](https://developer.android.com/jetpack?hl=JA) がGoogle I/O 2018で発表され、[Android Architecture Components(AAC)](https://developer.android.com/topic/libraries/architecture) や [データ バインディング](https://developer.android.com/topic/libraries/data-binding/?hl=JA) もその構成要素として統合されました[^1]。これによって、今まで以上にMVVMの採用を検討する機会が増えてくることと思います。MVVMなどのアーキテクチャを下敷きにする場合、**原則をどのように実装に落とし込むか**が重要なポイントです。
しかしいざMVVMに沿って実装しようとした場合、Androidフレームワークの制約との兼ね合いで実装方法に悩む場面が出てきます。わかりやすい具体例は、**イベント処理**です。

## todo-mvvm-liveにおけるイベント処理方法のバリエーション
公式のMVVM実装サンプルである[googlesamples/todo\-mvvm\-live](https://github.com/googlesamples/android-architecture/tree/dev-todo-mvvm-live)の中でも、以下のような実装のバリエーションが存在します。
#### １）Activity/Fragmentでフックし、そのまま処理
TasksActivityのstatistics_navigation_menu_itemなど。
昔ながらの、もっともシンプルな実装です。このケースでは、ViewModelは一切イベント処理に関わりません。こればかりだと、いずれFat問題に直面することでしょう。

#### ２）Activity/Fragmentでフックし、ViewModelに委譲
TaskDetailFragmentのfab_edit_taskや、TaskDetailFragmentのmenu_deleteなどです。ViewModelが処理を担い、処理が終わったらDatabindingを通じてViewを更新したりします。しかし、fab_edit_taskなどは委譲したViewModel側でなにもせず、結局View側に処理を丸投げします。startActivityをViewModel側で処理できないからです[^2]。こういうケースでは、一貫性と引き換えに実装が冗長に感じられます[^3]。

#### ３）レイアウトxmlのattributeでフックし、メソッド参照でViewModelに委譲
taskdetail_frag.xmlのrefresh_layoutなどです。コードを介さずダイレクトにViewModelに委譲しているので、すっきりとした印象です。**ただし、まだAndroid Studioが非対応なようで、オートコンプリートや宣言ジャンプが効きません。** (Android Studio3.3.2時点）

#### ４）レイアウトxmlのattributeでフックし、variableのリスナを経由してからViewModelに委譲
taskdetail_frag.xmlのtask_detail_completeなどです。３）のメソッド参照をしていないのは、ViewModelにViewを渡すまいとするためでしょう。そのためViewModelに委譲するまでに段階があり、やや処理が追いにくく感じます。

## 雑感
MenuItemが現状DataBindingで扱えなかったり、startActivityやSnackBarなどView側にやらせざるを得ない処理があったりと、公式サンプルでも実装を試行錯誤している印象を受けました。今後のJetpackのアップデートや、またプロジェクトの規模などによっても優先順位が変わってくると思うので、公式ドキュメントの [アプリのアーキテクチャ ガイド](https://developer.android.com/jetpack/docs/guide?hl=ja) を念頭におきつつ、一貫性と柔軟さのバランスをうまく見極めたいところです。

[^1]: Android Studioでは、3.2からウィザードや専用GUIなどの各種Jetpack対応が続々と搭載されています。
[^2]: 書籍『[Android アプリ設計パターン入門](https://peaks.cc/books/architecture_patterns)』の第二章でも、「メッセージ問題」として言及されています。
[^3]: FragmentとActivityの橋渡しという側面もあります。
PostgreSQLの Planning Time のチューニング

長大なSQLを書いていると

```sql
explain analyze
-- ... 100行以上の SQL

-- ... 100行以上の実行プラン


 Planning Time: 17.411 ms
 Execution Time: 1.675 ms
```

という感じになって、Execution Time より Plannning Time を高速化する必要が出てきた。
PostgreSQLは実行プランをキャッシュできないらしい。
https://use-the-index-luke.com/ja/sql/explain-plan/postgres/concrete-planning

この重いSQLだけ実行するコネクションプーリング用サーバーを置けばプリペアドステートメントでキャッシュできそうだけど、それはちょっとやりすぎである。

素直にPlanning Timeを高速化することを試す。



と言っても検索しても特に情報もなく、あれこれ試行錯誤して

```sql
explain analyze

-- ...

 Planning Time: 8.543 ms
 Execution Time: 1.680 ms
```

倍の早さになった。
ちょっとしたサンプルコードは無し。そもそもPlanning Timeが1msを超えるようなSQLはめっちゃ長いので簡単なサンプルというのは作れなさそう。

何をしたかというと、`join`の条件をシンプルにした。
`using`で重複を消すために列を追加したり、条件は無いよりはあった方がいいよね的に`join`の結合条件を複数指定していたんだけど、プライマリキーやユニークキーから複数の結合条件を選択できるような`join`はやらない方が良いっぽい。
例えばアカウントIDとemailが共にユニークで、ログインテーブルとアカウントテーブルの結合はどちらでも出来る場合、無いよりはプランナに選択を任せよう的に`join`条件に二つとも指定するとPlanning Timeが遅くなるようだ。（いや、これぐらいの小さい選択ならどちらでも変わらないかもしれない）


27個のテーブルを結合してNested Loop が13階層ほどになってるが、Execution Timeは速い。
rows=1 loops=1 の結合が多いからだろうけど。
CentOS7をVNCでヘッドレスインストールする

#経緯
- モニタ、マウス、キーボード、ケーブルなど面倒くさい
- 検証機だから仮想化ではなく、実機にクリーンインストールしてた。

#方法

- CentOSのisoイメージを取得
- USBメモリ等に焼く
- /EFI/BOOT/grub.cfgを編集、2行目末尾に`inst.vnc`追加

```
menuentry 'Test this media & install CentOS 7'~~~{
	linuxefi /images/pxeboot/vmlinuz inst.stage2 ~~~ quiet inst.vnc
	initrdefi /images/pxeboot/initrd.img
}
```
#使い方
- USBメモリ等が一番最初にBOOTされるようにBIOS or EFIを設定
- DHCPでIPを取得するので何かしらの方法で拾ってVNCで接続
- おしまい


![screenshot.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228197/1c27341c-ac64-e252-bae6-b299b728d7d5.png)
Let's Encryptの"certbot renew"で「Connection refused. Skipping.」が出たときの対処法

# 環境
- Conoha VPS(1GB)
- CentOS 7.6
- Certbot 0.31.0-2.el7 (yumで入れた記憶...)
- Apache 2.4.6

# 事象
certbot renewコマンドを実行すると、証明書の更新に失敗する。

```console:Console
$ sudo certbot renew
...(略)...
Attempting to renew cert ([ドメイン名]) from /etc/letsencrypt/renewal/[ドメイン名].conf produced an unexpected error: Failed authorization procedure. [ドメイン名] (http-01): urn:ietf:params:acme:error:connection :: The server could not connect to the client to verify the domain :: Fetching http://[ドメイン名]/.well-known/acme-challenge/[乱数]: Connection refused. Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/[ドメイン名]/fullchain.pem (failure)
1 renew failure(s), 0 parse failure(s)
```

# 原因
- Apacheで「mod_writeを使い、HTTPで来たすべての接続をHTTPSへリダイレクトする」設定をしていた。
- Let's Encryptのドメイン所有者確認は「**http**://[ドメイン名]/.well-known/acme-challenge/\*」が対象となっているが、全て「**https**」へリダイレクトされてしまった。
- よってLet's Encrypt的にはドメイン所有者確認ができず、更新に失敗した。

# 対応
「/.well-known/acme-challenge/\*」へのアクセスはHTTPSへリダレクトしない設定とした。

```conf:httpd.conf(対応前)
...(略)...
<VirtualHost *:80>
  DocumentRoot /var/www/html
  ServerName [ドメイン名]

  <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
  </IfModule>
</VirtualHost>
...(略)...
```

```conf:追加設定
RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/*
```

```conf:httpd.conf(対応後)
...(略)...
<VirtualHost *:80>
  DocumentRoot /var/www/html
  ServerName [ドメイン名]

  <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/*
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
  </IfModule>
</VirtualHost>
...(略)...
```
TLSとは

参考サイト:
https://www.nic.ad.jp/ja/basics/terms/tls.html
https://www.geotrust.co.jp/ssl_guideline/ssl_beginners/
https://wa3.i-3-i.info/diff384security.html

#TLSとは？
Transport Layer Security。
以前はSSL (Secure Sockets Layer)と呼ばれていましたが、 IETFでRFC2246として標準化される際に、 名称を変更してTLSと呼ばれるようになりました。
ただ、現在でも「SSL/TLS」と呼称されたり、「SSLサーバ証明書」などのように、 「TLS」を省いて呼称されたりすることもあります。

#SSL/TLSの技術的な仕組み
![tls.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/256ffb53-eb68-85b4-b40e-08e44a621fcb.png)
##1.接続を要求
##2.サーバ証明書を送付
<font color="blue">サーバ証明書</font>と一緒に、<font color="blue">サーバーの公開鍵</font>も送付。
##3.証明書を検証
次のようなことを検証。
>・証明書が正しい「認証局」（例えばジオトラスト）から発行されているか。
・今通信しているサーバが、証明書に記載されているサーバと一致しているか。

##4.サーバー証明書に含まれる公開鍵で共通鍵を暗号化
###共通鍵！？
ここで、突然<font color="blue">共通鍵</font>が登場するのでビックリするかもしれません。
少なくとも僕はビックリしました。
ここでいう共通鍵とは、クライアント側とサーバー側で通信を行う上でのルールを意味します。
例えば、この暗号方式を使って通信をするよ、とか。
それをクライアント側で定義するわけです。
###共通鍵を暗号化
そのルールを、サーバー側にそのまま送ってしまったら、盗聴された場合詰んでしまうので、それを先程入手した公開鍵で暗号化します。
##5.暗号化した共通鍵を送付
##6.秘密鍵で共通鍵を複合
##7.共通鍵で通信

#TLS と SSH の違い
TLSの説明を読んだとき、どちらにも共通鍵とか公開鍵とか出てくるもんだから、ごっちゃになってしまいました。
通信経路の確保の方法は全然違うのは分かるのですが、これらを実際に使うってなった時、どっちを使えばいいのかっていうイメージが湧かなかったのです。

結論からいうと、
TLSは、インターネットのやり取りが暗号化されます。
SSHは、他のコンピュータを遠隔操作する際のやり取りが暗号化されます。
Python用 数字 <-> 漢数字　の相互変換ライブラリ「Kanjize」

たとえば

```python

print(int2kanji(55))  # int -> 漢字
    # -> 五十五

print(int2kanji(1250987))  # int -> 漢字
    # -> 百二十五万九百八十七

print(kanji2int("五十五"))  # 漢字 -> int
    # -> 55

print(kanji2int("百二十五万九百八十七"))  # 漢字 -> int
    # -> 1250987
```

となる関数が欲しいなぁ(`kanji2int`は見かけましたが、`int2kanji`は見当たらなかった)ということで、作りました。

[Kanjize](https://github.com/delta114514/Kanjize)

```
 $ pip install kanjize
```

```python

from kanjize import int2kanji, kanji2int
```

で使えます。

10 ** 28 までの整数値は正しく表現できます。

間違っている動作などがあれば、pull requestやissueなどをくださればと思います。
Pythonライブラリ『Japanera』で年号を賢く扱う

# TL;DR
```
$ pip install japanera
```
```python
from datetime import date
from japanera import Japanera, EraDate

janera = Japanera()

c_era = janera.era(date.today())

# 年号情報取得
print("現在の元号は <{}>: <{}> です".format(c_era.kanji, c_era.english))
    # -> 現在の元号は <平成>: <Heisei> です

# 年号と日付からstrftime
print("本日は <{}> です".format(c_era.strftime(date(2019, 4, 16), "%-E%-O年%m月%d日")))
    # -> 本日は <平成31年04月16日> です

# 元年表記にも対応
print("本日は <{}> です".format(c_era.strftime(date(1989, 8, 1), "%-E%-O年%m月%d日")))
    # -> 本日は <平成元年08月01日> です

# 年号と日付からstrftime(漢字)
print("本日は <{}> です".format(c_era.strftime(date(2019, 4, 16), "%-E%-kO年%-km月%-kd日")))
    # -> 本日は <平成三十一年四月十六日> です

# resultとfmtからstrptime
print(janera.strptime("本日は <平成31年04月16日>", "本日は <%-E%-O年%m月%d日>"))
    # -> [datetime.datetime(2019, 4, 16, 0, 0)]

# resultとfmtからstrptime(すべてのstrftimeフォーマットに対応)
print(janera.strptime("本日は <平成三十一年四月十六日> です", "本日は <%-E%-kO年%-km月%-kd日>"))
    # -> [datetime.datetime(2019, 4, 16, 0, 0)]

# EraDateで直接日付データを取得
print(EraDate(1512, 4, 16).strftime("%Y年%m月%d日は　<%-E%-O年> です"))
    # -> 1512年04月16日は　<永正09年> です
```

# 日本の元号を扱いたい！
そんなときの[Japanera](https://pypi.org/project/japanera/) ([ドキュメント](https://japanera.readthedocs.io/en/latest/), [GitHub](https://github.com/delta114514/Japanera))

`Era`クラス、`EraDate`クラス、`EraDateTime`クラスがあり、それぞれ便利なクラスです。

## 日付から年号を取得

```python

from japanera import EraDate, EraDateTime, Japanera
from datetime import date

janera = Japanera()

era_from_janera = janera.era(date(2019, 5, 1))
print(era_from_janera)
    # 令和: Reiwa

era_from_eradate = EraDate(2019, 5, 1)
print(era_from_eradate)
    # 令和-2019-05-01

print(era_from_eradate.era)
    # 令和: Reiwa

print(vars(era_from_janera))
    # {'kanji': '令和', 'english': 'Reiwa', 'start': datetime.date(2019, 5, 1), 'end': None, 'type': 'common'}
```

## 年号を用いた`strftime`
```python
era_date = EraDate(1520, 6, 1)
print(era_date.strftime("%-E%-O年%m月%d日"))
    # 永正17年06月01日

print(era_date.strftime("%-E%-kO年%-km月%-kd日"))
    # 永正十七年六月一日
```

使用できる記号は、`datetime.date(time).strftime`に加え以下のものが追加されます。
- `%-E`: 年号の漢字名
- `%-e`: `Shouwa` -> `Showa`のように、冗長な母音を短くした英語名
- `%-A`: 英語名
- `%-a`: 英語名の最初の文字
- `%-o`: 年号始まって以来何年目かを、下二けたの値を0埋めしたもの
- `%-O`: 基本は`%-o`と同じだが、１年目のみ`元`が返される
- `%-ko`: 年号始まって以来何年目かを、下二けたの値を0埋めしたものを漢数字にしたもの
- `%-kO`: 基本は`%-ko`と同じだが、１年目のみ`元`が返される
- `%-km`: 月を漢数字にして出力
- `%-kd`: 日を漢数字にして出力

また、`Era`, `EraDate`, `EraDateTime`, `Japanera`すべてのクラスに`strtime`が実装されています。

## 年号を用いた`strptime`

`Era`, `Japanera`両方のクラスに`strptime`が実装されており、`Era`の場合はマッチする`datetime.ditetime`オブジェクトを、`Japanera`の場合は全ての元号を検査し、マッチしたすべての`datetime.datetime`オブジェクトをリストで返します。

```python
janera = Japanera()

print(janera.strptime("令和元年五月十九日", "%-E%-kO年%-km月%-kd日"))
    # -> [datetime(2019, 5, 19, 0, 0)]

era = janera.era(datetime.date(2019, 5, 19))
print(era)
    # 令和: Reiwa

print(era.strptime("令和元年五月十九日", "%-E%-kO年%-km月%-kd日"))
    # -> 2019-05-19 00:00:00
```

また、このライブラリの数字-漢字変換には[`kanjize`](https://github.com/delta114514/Kanjize)ライブラリが使用されています。
[`kanjize`](https://github.com/delta114514/Kanjize)の記事は[こちら](https://qiita.com/nagataaaas/items/154751c4f23b468e1c15)をご覧ください

そのほかにも多くの機能があります。
#Qiita #API で得たタグ一覧を元に #Twitter 的なハッシュタグをテキストに付与する #python スクリプトの例 

- こんな感じでタグの一覧を JSON で得てファイルに記録しておく ( [#Qiita のタグ一覧の #json を得る簡単な #python スクリプトの例 · Issue #1333 · YumaInaura/YumaInaura](https://github.com/YumaInaura/YumaInaura/issues/1333) )
- 日本語は正規表現的に特殊パターンとかが出てきそうなので除外して、英単語だけを対象にする

# tags.json

一部

```
$ cat ../qiita/log/tags.json | jq '.[200:205]'
[
  {
    "followers_count": 236,
    "icon_url": "https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/dc4b674d7e818f250e75e2452c8fdabe117e3159/medium.jpg?1515773118",
    "id": "Raspberrypi3",
    "items_count": 648
  },
  {
    "followers_count": 229,
    "icon_url": "https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/51713336a1474837883624c6cc2b10de6a21ddd8/medium.jpg?1387910883",
    "id": "勉強会",
    "items_count": 647
  },
  {
    "followers_count": 296,
    "icon_url": "https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/ede8a283c83a86055fd62288526cb691dc8e678a/medium.jpg?1409291235",
    "id": "テスト",
    "items_count": 647
  },
  {
    "followers_count": 14061,
    "icon_url": "https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/10a6aaf785afbc2e1c7ee05a7edba804b5b518ef/medium.jpg?1456046980",
    "id": "Facebook",
    "items_count": 645
  },
  {
    "followers_count": 484,
    "icon_url": "https://s3-ap-northeast-1.amazonaws.com/qiita-tag-image/8e6240a62e8594ddc3fe4933701dad8b2170acb9/medium.jpg?1423025366",
    "id": "WebGL",
    "items_count": 642
  }
]

```

# jq コマンドで英単語だけに絞り込んだファイルを作成

```sh
cat ../qiita/log/tags.json | jq '[.[] | select(.id | match("^[a-zA-z][a-zA-z0-9]+$"))]' > ../qiita/log/english-tags.json
```

# python script

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

import sys, json, os, re 
from funcy import pluck

seeds = json.loads(sys.stdin.read())

tags_file = sys.argv[1]
read_tags_file = open(tags_file, "r").read()
tags = json.loads(read_tags_file)

dictionary_json_key = os.environ.get('DICTIONARY_JSON_KEY') if os.environ.get('DICTIONARY_JSON_KEY') else "text"
json_key = os.environ.get('ADD_HASHTAG_JSON_KEY') if os.environ.get('ADD_HASHTAG_JSON_KEY') else "text"

regexp_or = '|'.join(list(pluck(dictionary_json_key, tags)))

regex_pattern = r'\b(?<!#)(' + regexp_or + r')\b'
pattern = re.compile(regex_pattern, re.IGNORECASE)

results = []

for seed in seeds:
  result = seed

  result[json_key] = re.sub(pattern, "#\\1", seed[json_key])

  results.append(result)

print(json.dumps(results))


```


# exe

- JSON オブジェクトの配列を標準出力で python script に与える
- 第一引数に タグ一覧のファイルパスを渡す
- #Ruby #python などがタグ付けされているのが分かる

```
$ echo '[{"text":"i like Ruby and python and Perl and linux both" }]' | DICTIONARY_JSON_KEY=id ./add-hashtag.py ../qiita/log/english-tags.json
[{"text": "i like #Ruby and #python and #Perl and #linux both"}]
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Windows】WSLでgit clone や npm install する際に gnutls_handshake() failed: が出る場合の対処法

# 要約
Kasperskyを終了する（インストール作業が終わったらちゃんと再開させましょう）

# エラー内容
WSL上で`git clone`や`npm install`すると以下のエラーが出ることがあり非常に困ったことに・・・

```bash

$ git clone https://github.com/nodenv/nodenv.git
Cloning into 'nodenv'...
fatal: unable to access 'https://github.com/nodenv/nodenv.git/': gnutls_handshake() failed: The TLS connection was non-properly terminated.
```


# 対処法
私のPCにはウィルス対策ソフトとしてKasperskyが入っているのですが、どうにもそれが悪さをしているっぽい
なので一旦終了させてからインストールすればできました！（自己責任でお願いします）
ウィルス対策ソフトをOFFにするとインストールしている意味がなくなるので、用事が終わったらちゃんと再開させましょう

# 参考になった記事
下記の記事をヒントに解決できました！ありがとうございます！
[Kasperskyが動いているWindows上のWSL UbuntuでPPAを追加できない - Qiita](https://qiita.com/petersheep/items/0b055926389e7a27799e)
メンテナンスが止まったリポジトリがfork先でメンテナンスされている可能性を辿った結果現実は非情だった

採用していたOSSの更新が止まってしまうこと、ありますよね。
こんなOSSを採用したのは誰だ？という犯人探しはさておき、選択肢の１つとして、フォークして（あるいはクローズドに）自分で開発を続ける、というものが有ります。
今回は、開発が止まった後も別のフォーク先で開発が続いているプロジェクトを探してみましょう。

手法や経緯は最後にまとめるのでとりあえず結果だけ。

気になるプロジェクトを適当に検索。ジャンル分けは趣味です。GitHubでずっと開発が続く栄光あるプロジェクトの裏には数々の屍がある、と気付かされます。

## Example

### boltdb/bolt

https://github.com/etcd-io/bbolt

いろいろなところで使われていたboltdbですが現在ではアーカイブされています。etcd-io/bboltというプロジェクトに引き継がれたと公式に書かれています。

私が作った雑な検索プログラムで検索した結果、

* 本体の最終更新以降のコミット：34
* スター:1985
* 最終更新：4 days ago

まさに後継と呼べるプロジェクトです。

### antonholmquist/jason

３年前に流行ったGoでjasonをゆるふわに扱う文脈で名前の上がるライブラリです。
[言及されてるQiita記事（古め）](https://qiita.com/msh5/items/dc524e38073ed8e3831b)

私が個人的事情で勝手に開発しているので動作確認がてら調べてみましょう。

* 検索結果：１件
* 本体の最終更新以降のコミット12
* スター：0
* 最終更新：今日

まあこんなもんでしょう。

## アクティブなフォーク先をどういう条件で探しているの？

今回は３つの指標を利用しました。

* Issueを持っているか。
* 本体の最終更新以降にコミットがあるか。

IssueについてはGitHubの仕様を知らなければ混乱するかと思いますので書いておきます。
GitHubの仕様上、フォーク直後のリポジトリはIssue機能が無効になっています。
そのIssue機能をわざわざ有効にしてIssueをたてているということはメンテの意思がある、と判断しました。

## 以降検索結果（代表的なもの）

### 該当なし

* Masterminds/glide
* antirez/disque

### 該当はあるが最終更新がはるか昔

* golang/leveldb
* Microsoft/MS-DOS
* Russell91/sshrc

### 更新が行われていたもの

**なし**
（今の所）

## 現実は非情である

これを元に何が言いたいかと言うと、

* 体制のしっかりしていないOSSを軽い気持ちで採用すると更新が止まることがある
* 更新が止まった後、たくさんIssueやPRがあってもそれをまとめて復活させようとするプロジェクトはまれ
* 結局自分でメンテする羽目になる
* 外部OSS採用時には慎重になろう！

ざっくり言えばこんな感じです。

今回使ったプログラム：[myfork](https://github.com/aimof/myfork)
ソースが汚いのであんまり見ないでほしい系コードです。

## その他

その後を知りたいリポジトリがありましたらコメントをください。
[PHP]学習

#PHP学習
## 概要
PHPは、サーバーサイドで動作する。
PHPの記述は
<?php
処理
?>

##変数
$+変数名
例)
$VALUE

##配列
$VALUE = array(要素1, 要素2・・・);
例)
$VALUE = array('moji',1,2);
$VALUE[0] ←mojiが格納
$VALUE[1] ←1が格納

##連想配列
$VALUE = array( 'key1' 3 ,
                 'key2' 4 
);
$VALUE['key1']←3が格納
retropi + usb audioの設定

## 環境
- pc:raspi (2とか3のまえのやつ) + linux(ubuntu)
- usb dac:Dennon da-300usb
- os：retropie4.4.12

## retropieのセットアップ
すごく丁寧な説明は以下（w/ windows)
[Raspberry PiにRetroPie をセットアップしてレトロゲームで遊ぶ part.1【準備編】](https://www.penguin-mura.com/entry/2017/05/27/100625)
[Raspberry PiにRetroPie をセットアップしてレトロゲームで遊ぶ part.2【設定編（前編）】](https://www.penguin-mura.com/entry/2017/05/28/212752)
[Raspberry PiにRetroPie をセットアップしてレトロゲームで遊ぶ part.3【設定編（後編）】](https://www.penguin-mura.com/entry/2017/06/03/090509)

## ssh接続
(ログイン)ssh pi@XXX.XXX.XXX.XXX
(ログアウト)exit

## オーディオーはUSB出力で外付けDACで鳴らす

設定は以下参照
[How-to: Use USB Audio in Retropie v3.7](https://sudomod.com/forum/viewtopic.php?f=20&t=144&sid=0933e6b50b85eaf5d4c3656786c1492b)

## ファイル共有サービス
sambaはwindows用のようでubuntuでは使えない。
Filezillaでやってみる
[How to transfer games to RetroPie with linux Ubuntu Filezilla](https://www.youtube.com/watch?v=ksEOzpEokVE)

## USBでのファイル転送
[RetroPieへUSBメモリーを使ったROM転送の方法(3)](https://raspida.com/transfer3-usb)

## 合法でromをダウンロード
https://raspida.com/emu-free-rom
tmux 起動時のペイン分割を設定ファイルを使って楽にする

## はじめに

僕は tmux をペイン分割して開発しているのですが、毎回手動でペイン分割するのを面倒に感じていました。

この記事では手始めに tmux のペイン分割と簡単なコマンド実行を設定ファイルに記載し、そこから実行する方法を試してみました。

## 目標

以下のようなのペイン分割を目標にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222030/67367cee-2842-e1e5-97b7-f1b23637b510.png)

* 上下に分割
* 下半分のペインを左右に分割
* 上ペインで nvim 起動

## 手順

### tmux 起動時設定ファイル準備

まず、tmux 起動時の設定ファイルを作成します。名前は何でも良いのですが、` ~/.tmux.session.conf` としました。

それぞれの設定内容は以下になります。それぞれのコマンドは、`man tmux` でマニュアルから確認しました。

```bash
# ペイン1を上下に分割
splitw -d -t 1
# ペイン1（上ペイン）の縦幅をリサイズ
resize-pane -t 1 -D 10
# ペイン1 でコマンド実行
send-keys -t 1 nvim C-m
# ペイン2（下ペイン） を左右に分割
splitw -h -d -t 2
```

### エイリアス設定

`.bashrc` や `.zshrc` に、上記で準備した設定ファイルを読み込んで tmux を起動させるコマンドをエイリアス設定します。

今回はエイリアス名を `tmuxg` としました。

```bash
alias tmuxg='tmux new-session \; source-file ~/.tmux.session.conf'
```

### 動作確認

最後にエイリアス設定したコマンドで、tmux がペイン分割された状態で起動できるか確認します。

```bash
$ tmuxg
```

## おわりに

今回はペイン分割のみでしたが、毎回手動でペイン分割していたときに比べるとだいぶ楽になりました。

まだ初歩的なことしかしていないので、より便利にできるよう調べてみようと思います。

## 参考

* [新規tmuxセッション起動時に自動で複数のウィンドウを作成してペイン分割する - 完熟トマト](http://kanjuku-tomato.blogspot.com/2014/03/tmux.html)
知的財産権法

参考サイト:
https://www.fe-siken.com/fekakomon.php
http://www.knpt.com/contents/news/news00026/news26.htm

#知的財産権法とは
著作物（著作権）や工業所有権などといった無体物について、その著作者などが、それに対する複製など多くの行為に関して専有することができるという権利である。
#知的財産権の種類
以下のようなものがある。
##産業財産権
###特許権
特許権者に<font color="red">発明</font>を実施する権利を与え、発明を保護する。
例) コンピュータプログラム、計測方法、製造方法等
###実用新案権
<font color="red">物品の形状</font>等に係る考案を保護する。
例) 日用品の形状、機械の構造、複数品の組合せ等
###意匠権
<font color="red">工業デザイン</font>を保護する。
###商標権
 商標に化体した業務上の<font color="red">信用力（ブランド）</font>を保護する。
##著作権
###著作権
思想・感情の創作的表現を保護する。
###著作隣接権
実演、レコード、放送・有線放送を保護する。

#実用新案権と意匠権の違い
実用新案権と意匠権の説明を読んでいるときに、違いが分からなかったのでまとめておきます。
詳細は<a href="https://yamadatatsuya.com/archives/809">こちらのサイト</a>をご確認ください。
その中に、特許、実用新案、意匠の違いをざっくりまとめた表が載っています。
![tigai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368574/396250f0-2c8c-1026-d9b7-5453abdf4600.png)
これを見てわかるように、<font color="blue">物の形状</font>については全て〇となっていますね。
また、このような記述もあります。
>
「特許を出すほどお金がないから、実用新案でお願いします！」
>
そんな風に依頼をしてくるお客様がいらっしゃいます。

表にある通り、特許を出願するにはコストがかかることがわかります。
自分の考案した<font color="blue">物の形状</font>について、知的財産権を得たいけどお金がねぇ……、といった場合に、最もリーズナブルな実用新案権を取得しようとする、という手もあるみたいです。
……で、肝心な実用新案権と意匠権の違いですが、この表から分かる通り、対象は<font color="blue">物の形状</font>と、同じであることが分かります。
ですから、実用新案権として出願できるものは、意匠権として出願することもできるのです。
ただ、意匠権には内容の審査があるため、実用新案権よりも価値はあると言えるかもしれませんね。

#確認問題
事業者の取り扱う商品やサービスを，他者の商品やサービスと区別するための文字，図形，記号など(識別標識) を保護する法律はどれか。

ア:意匠法
イ:商標法
ウ:特許法
エ:著作権法

#解説
問題文の中のこの部分に注目しましょう。
>
"他者の商品やサービスと区別するための"

これは<font color="blue">ブランド</font>といいかえることもできます。
よって、正解は イ の 商標法 です。
IntelliJで既存のRailsプロジェクトをRailsと認識させる方法

え、Railsプロジェクト認識させるって、開くだけじゃないの？？
私もそう思ってました。
しかし、IntelliJは既存のRailsプロジェクトを前にすると、**全然インテリではない**

「import project」や「open project」だと、かなりの確率でjRuby、jRailsのプロジェクトと認識します。
その他、Vue.jsやReactでフロントを作っているプロジェクトだと、なぜかstatic web siteと認識したりすることも。。

そんな愛すべきIntelliJですが、ほぼ100% Railsプロジェクトとして認識してくれる方法を見つけました。

## 1. create new projectを選ぶ
<img width="800" alt="スクリーンショット 2019-04-20 12.18.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/f34f71d2-e89e-d2f0-6e15-ae70c45da0db.png">

### 2. Railsを指定
<img width="800" alt="スクリーンショット 2019-04-20 12.19.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/ca12a0fc-bcc1-a735-3dfd-b1cd18b2ddbb.png">

## 3. Project name, locationに既存のRailsプロジェクトの名前、パスを設定しFinish
<img width="800" alt="スクリーンショット 2019-04-20 12.21.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/56fd8133-2645-579a-d5dd-9d49aca2b8e4.png">
## 4. Generate New Rails Applicationで「No」を選択
<img width="800" alt="スクリーンショット 2019-04-20 12.26.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/431bd530-62b5-34b5-6421-8c7685e36fff.png">
## 5. 完了！！
無事Railsと認識され、Project SDKもRubyです

<img width="800" alt="スクリーンショット 2019-04-20 12.30.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/33655ae8-cff1-151d-e656-a148a746f3e7.png">
<img width="800" alt="スクリーンショット 2019-04-20 12.33.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/a722d6d2-e5b5-c511-66c5-3b3263cba417.png">

# 終わりに
以上、IntelliJで既存のRailsプロジェクトをRailsと認識させる方法でした。
この方法はRails以外の、他のフレームワークの既存プロジェクト設定でも概ね使えます。
快適なIntelliJライフを！！
php-master-changes 2019-04-19

今日は JIT の修正、不要コードの削除があった！

# 2019-04-19
## dstogov: Keep EX(opline) in consistency when call engine and helper functions
- https://github.com/php/php-src/commit/e04fbdab2f637ce4014199089013f7cdcf145eb5
- ext/opcache/jit で、エンジン/ヘルパ関数の呼び出し時に EX(opline) を一貫させるよう修正
- うむ、今のところ読んでも dynasm が分からんちん

## KalleZ: Remove HAVE_PCRE, as ext/pcre is always available
- https://github.com/php/php-src/commit/59f4490689a070f6874d25c00c459143ea3eab9b
- ext/pcre が常にあるので不要ということで、HAVE_PCRE を削除
OpenPoseって何だ？

#Memo#




#Link#
[AI初心者がOpenPoseのモバイル実装に取り組んだ話](https://qiita.com/otmb/items/b924b5f600db1ce11037)

[CMU-Perceptual-Computing-Lab/openpose](https://github.com/CMU-Perceptual-Computing-Lab/openpose)
Railsで「TCP/IP connections on port 5432」のエラーが出てサイトが見られない。

昨日、Terminal上で正常にRailsを終了させずシステム終了した。
翌朝、起動した際にエラーが出た。

PG::ConnectionBad at /
could not connect to server: Connection refused
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?

作業できない。困った。
![error.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402122/e71e888d-bbda-165a-91a7-48490aae0ff5.jpeg)

普通にpostgresqlを再起動すると
FATAL:  lock file "postmaster.pid" already exists
と言われる。

○正常終了しなかったためにpidファイルが残っているのが原因

手順
１：pidファイルの削除
２：postgresqlの再起動
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
１：pidファイルの削除

find /usr/local/var/postgres/postmaster.pid
→ファイルがあるか確認

rm /usr/local/var/postgres/postmaster.pid
→pidファイルの削除
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
２：postgresqlの再起動

brew services stop postgresql
→postgresql　終了

brew services start postgresql
→postgresql　再起動
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー

直った。よかった。
Datetime型から曜日、時間範囲を指定してSelectする（MySQL）

##はじめに
MySQLでdatetime型のレコードからある期間内の特定の時間範囲と曜日を指定してレコードを取り出すのにつまづいたので書き留めます。

##やりたいこと
更新日時が2019年2月～3月かつ
土日以外かつ9:00～18:00のレコードを取り出したい。

MySQLのバージョンは`5.6.33`で行いました。

##日付と時間の指定
CAST関数を使用しました。
CASTは値の型の変換を行う関数です。

書き方
`CAST カラム名 AS 型`

##曜日の指定
WEEKDAY関数を使用しました。
WEEKDAYは曜日を調べる関数です。
引数に日時を渡すと返り値で曜日の数値が返ってきます。

書き方
`WEEKDAY(日時)`

| 返り値 | 曜日 
|:--|:--|
| 0 | 月曜日
| 1 | 火曜日
| 2 | 水曜日
| 3 | 木曜日
| 4 | 金曜日
| 5 | 土曜日
| 6 | 日曜日
 

##実行
まずはテーブルの中身を確認

```sql
Select * from users;
```

テーブルの内容は以下のようになっています。
    
    +----+--------------------+---------------------+
    | id | name               | updated_at          |
    +----+--------------------+---------------------+
    | 1  | イチロウ             | 2019-03-19 17:00:49 |
    | 2  | ジロウ               | 2019-04-19 15:48:58 | 
    | 3  | サブロウ             | 2019-02-27 21:44:50 | 
    | 4  | シロウ               | 2019-03-02 14:51:03 | 
    | 5  | ゴロウ               | 2019-02-18 14:38:01 |
    | 6  | ロクロウ             | 2019-03-12 13:06:25 |
    | 7  | ナナロウ             | 2019-03-16 05:39:16 | 
    | 8  | ハチロウ             | 2019-02-26 14:33:30 | 
    | 9  | キュウロウ            | 2019-02-18 12:24:37 | 
    | 10 | ジュウロウ            | 2019-02-28 17:52:23 |
    +----+--------------------+---------------------+
    

次に2019年2~3月の9:00~18:00かつ土日以外のレコードを抽出します。

```sql

Select * from users where
  cast(updated_at as date) BETWEEN '2019-02-01' AND '2019-03-31'
  AND cast(updated_at as TIME) BETWEEN '09:00:00' AND '18:00:00'
  AND WEEKDAY(updated_at) NOT IN (5, 6);
```

`cast(updated_at as date) BETWEEN '2019-02-01' AND '2019-03-31'`
⇒datetime型をdate型に変換し、日付範囲を指定
`cast(updated_at as TIME) BETWEEN '09:00:00' AND '18:00:00'`
⇒datetime型をtime型に変換し、時間範囲を指定
`WEEKDAY(updated_at) NOT IN (5, 6)`
⇒WEEKDAY関数にupdated_atを渡し、返り値が5,6（土日）以外であるかを判定

実行結果は以下の通りです。

    +----+--------------------+---------------------+
    | id | name               | updated_at          |
    +----+--------------------+---------------------+
    | 1  | イチロウ             | 2019-03-19 17:00:49 |
    | 5  | ゴロウ               | 2019-02-18 14:38:01 |
    | 6  | ロクロウ             | 2019-03-12 13:06:25 |
    | 8  | ハチロウ             | 2019-02-26 14:33:30 |
    | 9  | キュウロウ            | 2019-02-18 12:24:37 |
    | 10 | ジュウロウ            | 2019-02-28 17:52:23 |
    +----+--------------------+---------------------+


以下のNGが書いてあるレコード以外が取れていることが確認できます。

    +----+--------------------+---------------------+
    | id | name               | updated_at          |
    +----+--------------------+---------------------+
    | 1  | イチロウ             | 2019-03-19 17:00:49 |
    | 2  | ジロウ               | 2019-04-19 15:48:58 | 期間NG
    | 3  | サブロウ             | 2019-02-27 21:44:50 | 時間NG
    | 4  | シロウ               | 2019-03-02 14:51:03 | 曜日NG
    | 5  | ゴロウ               | 2019-02-18 14:38:01 |
    | 6  | ロクロウ             | 2019-03-12 13:06:25 |
    | 7  | ナナロウ             | 2019-03-16 05:39:16 | 曜日NG、時間NG
    | 8  | ハチロウ             | 2019-02-26 14:33:30 | 
    | 9  | キュウロウ            | 2019-02-18 12:24:37 | 
    | 10 | ジュウロウ            | 2019-02-28 17:52:23 |
    +----+--------------------+---------------------+

以上。
# jq コマンドで #JSON オブジェクトの配列から正規表現で絞り込みをかける例

```
$ echo '[{"name":"Alice", "sex": "woman"},{"name":"さだし", "sex": "man"}]' | jq '[.[] | select(.name | match("^[a-zA-z]+$")) ]'
[
  {
    "name": "Alice",
    "sex": "woman"
  }
]
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【オートローダー】別PHPファイル呼び出し機能の実装

## 今北産業
- 呼び出しの基本はrequire_once
- require_once+spl_autoload_register()で自動で呼び出せるようにしよう
- ___autoload()はもう非推奨なのでこれからはspl_autoload_register()を使おう

## 呼び出しの基本はrequire_once

結論から言うとrequire_onceを使うべきです。
理由は下記で説明します。


PHPで別PHPファイルを呼び出す時には以下のように4種類やり方があります。

```php:呼び出しに使えるfunction
<?php
include();
include_once();
require();
require_once();
```

### include系とrequire系の違い
include系とrequire系の違いは呼び出し失敗時の挙動にあります。
include系は呼び出し失敗してもWarningを出すだけでプログラムの実行は継続されます。
一方require系は呼び出しに失敗したらその時点でFatal errorで落ちます。


別PHPファイルの呼び出しが失敗する場合、基本的にはそれ以降のプログラムの実行が正常に行われないので、失敗時はその場で落ちるrequire系を利用するのが望ましいです。

### requireとrequire_once(includeとinclude_once)の違い
結論から言うと既に同じファイルが呼び出されていた場合に、何回でも呼び出せるのがrequire(include)、
呼び出せないのがrequire_once(include_once)です。

同じファイルを複数回呼び出した場合、値が上書きされるなどの不具合がでる可能性があるので、特別理由がないのであれば、require_once(include_once)を使う方が望ましいです。


## spl_autoload_register()で自動で呼び出せるようにしよう
require_onceを使うべきなのは分かったが、例えば10個の外部ファイルを呼び出す場合は以下のようになります。

```php
<?php
require_once('hoge1.php');
require_once('hoge2.php');
require_once('hoge3.php');
require_once('hoge4.php');
require_once('hoge5.php');
require_once('hoge6.php');
require_once('hoge7.php');
require_once('hoge8.php');
require_once('hoge9.php');
require_once('hoge10.php');
//ここ以降に処理を書いていく
```

一つ一つのファイルに毎回以上のように書くのは可読性・保守性などあらゆる面でデメリットが多いです。
この問題を解決するのがオートローダー機能です。

### オートローダーとは
その名の通り、"自動で"+"呼び出し"をする機能。
PHPにおいてはマジックメソッドの__autoload()が実行されることでこの機能が達成されます。
__autoload()は外部ファイル呼び出しに失敗した際に、自動で呼び出されるメソッドで、例えば以下のように実装します。

```php
<?php

function __autoload($name)
{
  $file = $name . ".php";
  require($file);
}

$Hoge = new Hoge(); //ここで__autoload()が起動し、今回はHoge.phpが呼ばれることになる

```

ただし、\_\_autoload()を直接呼び出すのはPHP7.2以降でdeprecated(非推奨)となるので、spl\_autoload\_register()でオートローダーを実装しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/206138/026cd939-2af9-159e-58f0-c9d15106c340.png)

\_\_autoload()を直接定義した場合、一つのファイル・ディレクトリ関係にしか対応できませんが、ライブラリを入れたりすると様々な関係がありえます。複数パターンに対応できるのがspl_autoload_register()となります。

例えば以下のように実装できます。

```php:HogeAutoload.php(大文字命名を解決するautoload)
<?php

class HogeAutoload
{
  public function autoloadHoge($name)
  {
    $file = strtoupper($name) . ".php";
    require($file);
  }
}

```

```php:FugaAutoload.php(パスカルケース命名を解決するautoload)
<?php

class FugaAutoload
{
  public function autoloadFuga($name)
  {
    $file = ucfirst(strtolower($name)) . ".php";
    require($file);
  }
}
```

```php:index.php
<?php
//ここはrequire_onceする必要あり
require_once('HogeAutoload.php');
require_once('FugaAutoload.php');

//ここでパターンを登録 以降下記2パターンで解決できる場合はrequire_onceは不要となる
spl_autoload_register(array('HogeAutoload','autoloadHoge'));
spl_autoload_register(array('FugaAutoload','autoloadFuga'));
```
令和対応を試してみる(.NET)

## 令和対応

調べてみると、Windowだけならレジストリで対応できるっぽい。
※待ってればそのうちアップデートされるはずだが、先にテストをしたいということもある。

ということで、レジストリに追加

```
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras /v "2019 05 01" /t REG_SZ /d "令和_令_Reiwa_R"
```


![image.png](https://qiita-image-store.s3.amazonaws.com/0/106639/2a654618-26d1-770a-0ec7-4a2fa1bc7e70.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/106639/00129c9e-3da1-bf09-2e6c-fa7bdadf1b6e.png)

で、試してみたのだが、変換されない。。。
.NETの和暦変換機能だと単純にレジストリに追加するだけだとダメなのか？

以下を読む限りだと3.5以降ならレジストリへの追加だけでいけそうなんだけどな。。
https://www.atmarkit.co.jp/ait/articles/0306/06/news004.html#breakingchange


まあ、待ってたらそのうち対応されるんだろうと思っていたら、こんなものが・・・
https://support.microsoft.com/ja-jp/help/4470918/updates-for-may-2019-japan-era-change

すぐには対応できないってことなのか？
このページ以外で情報を調べてみると、どうも一緒に「元年」対応もやろうとして、おかしくなってるような感じもあるんだよなぁ。。

とすると、GW明けに問い合わせがいくつか来るのかな。。。
コマンドでファイルの加工（grep,cut,sed,awk,sort）

##はじめに

仕事でログファイルを整形することがあり、
sed、awkコマンドなどを初めて使用し、 
試行錯誤したので忘れないようにまとめます。

##やりたいこと
以下のfileA~Cの３ファイルから必要な情報を抽出し加工、
最終形のファイルを作成します。

```txt:fileA
20190501,comic,naruto,300円,100冊
20190201,novel,hibana,800円,20冊
20190301,magazine,rurubu,600円,25冊
20190401,picture,neko,800円,30冊
```

```txt:fileB
20190301,comic,bleach,400円,40冊
20190202,novel,gekijyou,800円,60冊
20190302,magazine,cancan,600円,30冊
20190402,picture,dog,800円,15冊
```

```txt:fileC
20190401,comic,onepiece,500円,80冊
20190103,novel,natunoniwa,800円,10冊
20190104,magazine,joker,600円,12冊
20190105,picture,rabit,800円,25冊
```

```txt:最終形
2019-03-01,bleach,400
2019-04-01,onepiece,500
2019-05-01,naruto,300
```

##１、comicの行を抽出
まずはgrepコマンドを使用して各ファイルからcomicの行を検索して出力します。

###grep
ディレクトリ・ファイルの文字列を正規表現で検索して表示するコマンド

書き方
`grep オプション 正規表現 ファイル名`

実行コマンド
`grep -w "comic" file* > grep_result`

```txt:grep_result
fileA:20190501,comic,naruto,300円,100冊
fileB:20190301,comic,bleach,400円,40冊
fileC:20190401,comic,onepiece,500円,80冊
```
各ファイルからcomicを含む行を抽出して出力出来ました。

##２、必要な項目を抽出（日付、タイトル、値段）
次にcutコマンドを使用して日付、タイトル、値段を取り出します。

###cut
指定した部分を切り出すコマンド

書き方
`cut オプション 処理内容 ファイル名`

実行コマンド
`cut -d "," -f 1,3,4 grep_result > cut_result`

-dのオプションでは区切り文字を指定できます。（今回はカンマを指定しました。）
-fのオプションで必要な項目数を指定できます。
なのでこのコマンドでは-dで指定したカンマで区切られた-fで指定した1,3,4番目を取り出してねというコマンドになります。

```txt:cut_result
fileA:20190501,naruto,300円
fileB:20190301,bleach,400円
fileC:20190401,onepiece,500円
```
必要項目が取り出せました。

##３、ファイル名削除、値段の円を削除
sedコマンドを使用してfileA:と書いてある部分と値段の円が不要なので取ります。

###sed
指定ファイルの中身を置換したり、抽出したりするコマンド

書き方
`sed オプション 処理内容 ファイル名`

実行コマンド
`sed -e 's/円//g' -e 's/file[A-Z]://g' cut_result > sed_result`

 -e 条件式で指定した条件式で変換処理を行う事が出来ます。 
条件式は次のように書くことが出来ます。
`s/置換前文字列/置換後文字列/g`

今回は円の部分とfileA:~fileC:の部分を空に置換しています。

```txt:sed_result
20190501,naruto,300
20190301,bleach,400
20190401,onepiece,500
```

ちゃんと置換出来ています。

##４、日付をハイフン区切り
awkコマンドを使用して日付をハイフン区切りに加工します。

###awk
1つ以上のスペースで区切られた複数列のテキストデータを色々処理するコマンド。

書き方
`awk オプション 処理内容`

実行コマンド
`awk -F ',' 'BEGIN {OFS=","} {print substr($1, 1, 4) "-" substr($1, 5, 2) "-" substr($1, 7, 2) , $2, $3}' sed_result > awk_result`

-Fで区切り文字を指定します。（これで指定した区切り文字を目印に加工します。今回はカンマ）
awkの出力は何も指定しないとスペースで区切られた結果が出力されます。
今回はカンマで区切りたいので`BEGIN {OFS=","}`でカンマを指定します。
print $フィールドでそのフィールドを取り出せます。
今回はハイフンを途中に入れたいのでsubstr関数で1番目のフィールドから4桁、2桁、2桁を取り出して間にハイフンを入れています。

```txt:awk_result
2019-05-01,naruto,300
2019-03-01,bleach,400
2019-04-01,onepiece,500
```

##５、日付順にソート
最後にsortコマンドで日付順に並び替えます。

###sort
ファイルの中身の並び順をソートするコマンド

書き方
`sort オプション ファイル名`

実行コマンド
`sort -k 1 -t "," awk_result > result`
-tオプションで区切り文字、-kで区切った何番目のフィールドでソートするか指定します。
今回はカンマで区切った1番目のフィールド（日付）でソートしました。

```txt:result
2019-03-01,bleach,400
2019-04-01,onepiece,500
2019-05-01,naruto,300
```
完成！

##おわりに
オプションも多く、どのコマンドが目的の達成に適しているのかを把握することに苦労しました。
もっとスマートに自在に操れるよう練習あるのみです。
また、正規表現の知識が乏しく仕事では時間がかかってしまったのでその辺りも勉強の必要があると痛感しました。
map, reduce, every, some,… 配列のループ処理の選び方チートシート

# 対象
+ 初心者で、配列のループ処理について知りたい方
+ `for` によるループが飽きた方
+ 冗長なループ処理を簡略化したい方

# tl;dr
+ `for` ループを関数によるループに置き換える方法
+ 目的別にどの関数を使えばよいのか

# チートシート
## chart1:
目的別の表です

![table (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193558/dd1e8fb0-ccbe-c5c6-7e74-b3e54e796583.png)


# chart2:
`map` / `reduce` の使い分けフローチャートです

![flow_chart](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193558/3af88594-178e-29b0-55ae-4e785e25ad7e.png)

だいぶ苦し紛れですが、ご容赦を…

## 見方
条件や一致する要素について得たい場合は、`chart1` を見てください。

+ 縦列は、それぞれ一致条件などについて分類しています。
+ 横列は、返り値について分類しています。

例えば、

>
+ `["a", "b", "c", ..., "z"] という配列に対して、
+ "n" という要素に **一致する** か **どうか(t/f)** を得る

なら
**`includes` を使う**

>
+ `[0, 1, 2, 3, ...]` という配列に対して、
+  偶数（`2` で割り切れる）という **条件に合う** **要素** を **すべて** 得る

なら
**`filter` を使う**

っていう感じです。

# 補足等
## メソッドチェーン
`map`, `filter` (`reduce`[^1]) に関しては、返り値として配列を返すので、メソッドチェーンができます。

[^1]: 初期値として配列を指定し、ループごとに `push` するなど、配列を返すようにするときです。

```js
const people = [{
  name: "Alice",
  sex: "female",
  age: 14
}, {
  name: "Bob",
  sex: "male",
  age: 15
}, { //...
  name: "Ellen",
  sex: "female",
  age: 21
}];
```

```js:method_chain
people
  .filter(person => person.sex === "male")
  .filter(person => person.age <= 18)
  .map(person => person.name);
```

ただ、ループの回数が増える分、スピードが遅くなるので、場合によっては `reduce` に置き換えたほうが良いかもしれない。

```js:reduce
people
  .reduce((acc, person) => {
    if(person.sex === "male" && person.age <= 18) {
      acc.push(person.name);
    }
    return acc;
  }, []);
```

私が実行した際は、 `reduce` に置き換えると実行時間がおよそ半分になった。
パフォーマンスを気にしないとか、読みやすさを重視するならば、メソッドチェーンを使えばいいと思う。

## reduce 最強。
`reduce` さえあれば、
とりあえずなんでもできるんじゃないだろうかっていうぐらい強い。
詳しくは割愛。

そのうち `reduce` だけの書こうかな…

# 最後に一言
メソッドチェーンとかとうまく組み合わせながら、読みやすくかっこいいコードを書こう！
fortranから呼べる便利なライブラリ

#Fortranで数値解析
数値解析では、次のような手順を踏むことが多い。

1. プログラムに入力するデータの準備
2. 計算の実行
3. データ出力と結果の可視化など 

これらの各場面で便利なライブラリをメモしておく。Ubuntu18.04において以下ライブラリが使える。

##データ入出力
[HDF5](https://www.hdfgroup.org/solutions/hdf5/)自体にFortranバインディングがあり、出力ファイルをスッキリひとつにまとめて保存できる。これを使う利点は次の通り。

- バイナリファイルで出力される。
- データの圧縮度合いを指定できるので、ディスク容量の節約になる。
- 読み書きが早い。
- データ自体に色々とメモ（Attribute）を保存できるので、適切にメモを保存していればあとでデータの内容を思い出しやすい。
- python,Rなどでもhdf5形式のファイルを読み込めるので、データの可視化が容易。なおかつ、読み込むときは欲しい部分だけ指定すれば良いのでメモリの少ないシステムでも使いやすい。

##データの可視化
最も簡単な方法は、解析結果をテキストファイルに書き出し、それをgnuplotなどで描画する方法ではないだろうか。上記のHDF5で書き出した場合は、テキストにダンプしてから描画しても良いし、pythonやRでhdf5そのものからデータをメモリ上に取り出して描画すれば良い。
fortranのプログラムからダイレクトにグラフを描画する場合は、[PLplot](http://plplot.sourceforge.net/)などが使える。PLplotライブラリだけで、画面上に表示したり、マウスを使ってグラフ上の座標を取得したりできる。

さらに、アニメーションを作る場合、fortranからOpenGLを呼び出すと良い。fortranバインディングとして、例えば[F03GL](http://www-stone.ch.cam.ac.uk/pub/f03gl/index.xhtml)を使えば良い。自分のプログラムで解析した結果が画面上でヌルヌル動く様はそれだけでも面白いし、バグがあれば画面上で異常な挙動としてすぐ分かるので重宝している。

##数値解析ライブラリ
初め２つは言わずもがな。BLASは、システムに最適化されたものがあればそれを使う。その他、fortranから自由に使えるものとして以下が挙げられる。[netlib](https://www.netlib.org/)を参照すると、以下の大半が得られる。


- BLAS：線形代数基礎演算
- LAPACK：線形代数
- [MINPACK](https://www.netlib.org/minpack/index.html)：非線形方程式の求解または最小自乗解。
- [ODEPACK](https://www.netlib.org/odepack/index.html)：9種類の常微分方程式解法。
- [DASKR](http://www.netlib.org/ode/)：微分代数方程式
- [RKSUITE](http://www.netlib.org/ode/rksuite/)：ルンゲクッタ法
- [ORDERPACK](http://www.fortran-2000.com/rank/)：ランキング、ソート
- [DIERCKX](https://www.netlib.org/dierckx/index.html) : スプラインによる曲線近似や補間（平面の近似も可能）
- [FFTW](http://www.fftw.org/)：フーリエ変換
- [QUADPACK](http://www.netlib.org/quadpack/index.html)：各種積分
- [GSL](https://www.gnu.org/software/gsl/)（fgslがfortranバインディング）：科学技術全般に関わる解法


商用ライブラリでは以下がある。
- MKL：intelのライブラリ。線形代数、高速フーリエ変換 (FFT)、ベクトル演算関数、統計関数などが使える。常微分方程式の解法はない。
- IMSL：科学技術全般。網羅的。
- NAG数値計算ライブラリ：科学技術全般。網羅的。

#GUIアプリをfortranで作る
[gtk-fortran](https://github.com/vmagnin/gtk-fortran/wiki)は、fortranからgtk+の関数をコールするためのライブラリである。
fortranユーザは科学技術計算の利用者が多いことを踏まえて、cなどで同じことを書くよりは少数のルーチンをコールするだけでグラフを描画する画面を作成できるハイレベル関数が独自に定義されている。
windowsでReactの環境構築

# 概要
ささっとReactを触りたかった自分の作業履歴

# Node.jsのインストール
[公式](https://nodejs.org/ja/)からインストーラをダウンロードしてインストール

コマンドプロンプトで確認（この記事ではPowerShell）
例、以下のようにバージョン情報が出るか等で確認

```powershell
> node -v
v10.15.0
> npm -v
6.4.1
```

# create-react-appをインストール
```powershell
npm install -g create-react-app
```

```powershell
> npm install -g create-react-app
C:\Program Files\nodejs\create-react-app -> C:\Program Files\nodejs\node_modules\create-react-app\index.js
+ create-react-app@2.1.8
added 63 packages from 20 contributors in 10.087s
```

# 実行
任意のディレクトリを作成

そのディレクトリを指定してコマンド実行

```powershell
create-react-app <ディレクトリ名>
```

※名前に大文字を含むのはNGの模様

```powershell
Could not create a project called "HelloWorld" because of npm naming restrictions:
  *  name can no longer contain capital letters
```

```powershell
> create-react-app helloworld

Creating a new React app in C:\helloworld.

Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts...

+ react-dom@16.8.6
+ react@16.8.6
+ react-scripts@2.1.8
added 1851 packages from 718 contributors and audited 36248 packages in 153.576s
found 68 vulnerabilities (63 low, 5 high)
  run `npm audit fix` to fix them, or `npm audit` for details

Success! Created helloworld at C:\helloworld
Inside that directory, you can run several commands:

  npm start
    Starts the development server.

  npm run build
    Bundles the app into static files for production.

  npm test
    Starts the test runner.

  npm run eject
    Removes this tool and copies build dependencies, configuration files
    and scripts into the app directory. If you do this, you can’t go back!

We suggest that you begin by typing:

  cd helloworld
  npm start

Happy hacking!
```

指定したディレクトリに移動

下記コマンドで起動

```powershell
npm start
```

```powershell
> npm start

> helloworld@0.1.0 start C:\helloworld
> react-scripts start
Starting the development server...
```

警告が出た、許可する
<img width="472" alt="Windows セキュリティの重要な警告 2019-04-20 10.37.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342109/591fef0c-7915-a45d-ab05-c70242966cbb.png">

ブラウザが立ち上がって、以下のようなページが開く
![React App - Google Chrome 2019-04-20 10.44.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342109/273f0989-97d7-3ad5-9a75-52731ee5adde.png)

コマンドプロンプトはこんな感じ

```powershell

Compiled successfully!

You can now view helloworld in the browser.

  Local:            http://localhost:3000/
  On Your Network:  http://***.***.**.***:3000/

Note that the development build is not optimized.
To create a production build, use npm run build.
```

# 参考
Windows+VSCode上でReact開発環境を構築 - Qiita
https://qiita.com/willow-c/items/ad5c1a15d8b32d75d927