OmniAICreator/Qiita-1.07M huggingface dataset:
「exists_table.sql is not found」というエラーについて

intra-mart実行時に、下記ログメッセージが表示されることがある。
主な原因はDBへ接続できないことによるものである。

参考サイト：[「intra-mart Accel Platform セットアップガイド」](https://www.intra-mart.jp/document/library/iap/public/setup/iap_setup_guide/texts/appendix/resin_startup.html)

````
[WARN] c.c.s.w.WebApp - [] java.lang.RuntimeException: resource: iwp/platform/schema/exists_table.sql is not found.
java.lang.RuntimeException: resource: iwp/platform/schema/exists_table.sql is not found.
        at jp.co.intra_mart.mirage.SqlManagerImpl.prepareNode(SqlManagerImpl.java:143)
        at jp.co.intra_mart.mirage.SqlManagerImpl.getSingleResult(SqlManagerImpl.java:218)
        at jp.co.intra_mart.mirage.ext.IntramartSqlManager.getSingleResult(IntramartSqlManager.java:39)
        at jp.co.intra_mart.mirage.SqlManagerImpl.getSingleResult(SqlManagerImpl.java:214)
        at jp.co.intra_mart.system.service.provider.updater.dao.ImSchemaUpdateDAO.existsTable(ImSchemaUpdateDAO.java:34)        at jp.co.intra_mart.system.service.provider.checker.SystemSchemaUpdateChecker$1.execute(SystemSchemaUpdateChecker.java:37)
        at jp.co.intra_mart.mirage.ext.session.SessionTemplate.execute(SessionTemplate.java:21)
        at jp.co.intra_mart.system.service.provider.checker.SystemSchemaUpdateChecker.checkSchema(SystemSchemaUpdateChecker.java:31)
        at jp.co.intra_mart.system.service.provider.checker.SchemaUpdateChecker.initialize(SchemaUpdateChecker.java:78)
        at jp.co.intra_mart.system.servlet.PlatformServletContextListener.contextInitialized(PlatformServletContextListener.java:108)
        at com.caucho.server.webapp.WebApp.callInitializers(WebApp.java:3564)
        at com.caucho.server.webapp.WebApp.startImpl(WebApp.java:3882)
        at com.caucho.server.webapp.WebApp.access$700(WebApp.java:209)
        at com.caucho.server.webapp.WebApp$StartupTask.run(WebApp.java:5451)
        at com.caucho.env.thread2.ResinThread2.runTasks(ResinThread2.java:173)
        at com.caucho.env.thread2.ResinThread2.run(ResinThread2.java:118)
````

このときに確認すべきことは
　１．JDBCライブラリは入っているか？
　２．resin-web.xmlの定義は間違っていないか？
　３．storage-config.xmlの定義は間違っていないか？
　４．DBへアクセス可能か？
　　（DBサーバ上のqsplコマンドで接続ができるか。DBアカウントとパスワードの確認。）
　５．DBへアクセス可能か？
　　（APサーバからftpやtelnetコマンドを使用し、ポート番号指定で接続してみる)
など。

様々な要因があるため、特定が難しいがjuggling時の設定が間違っていないならファイヤーウォールなどの設定も見直してみると良い（自分への戒め）
で、DOOM Emacsでソースコードリーディングってどうやるんだ？

「知らずに使っていたのか？」
はい......。

----

プログラマたるもの、ソースコードを書くより読むことの方が多いと思います。

私は周りに[DOOM Emacs](https://github.com/hlissner/doom-emacs)や[Spacemacs](http://spacemacs.org/)使いが居ないのに（素のEmacsやVim使いの友達（多分）の方が多い。）
どっちつかずとも取れるDOOM Emacsを孤独に使っております。

なのでノウハウはやはりWeb頼み。

しかも業務中にVisual Studioがあるにもかかわらずそんなことをしているので生産性はなく......。

とダラダラ長い話をしていても仕方ないので、本題へ。

本題
====

大まかにどんなEmacsの拡張があるかを知る。
-----------------------------------------

超役に立ったのはこちら。

[Emacsの補完と検索を超強化する - Qiita](https://qiita.com/blue0513/items/c0dc35a880170997c3f5)

DOOM Emacsの `.emacs.d/bin/doom install` 直後は `ivy`
を使っているはずなので、上記リンク先がとても参考になった。

DOOM（ivyかも？）の力を信じて検索
---------------------------------

`SPC :` もしくは `M-x`
でコマンドを検索する。以下は自分がソースコードリーディングしたいと思ったときに30分くらいで探した限りではそろっていた。

-   counsel
-   swiper
-   company
-   dumb-jump

正直、私が欲しかったのは `dumb-jump` だったので、 `dumb`
と打って候補に挙がったコマンドを叩いて、C\#のソースコードでメソッドなどの定義元に飛べた。

Yay, Evil!

P.S.
====

この記事も例によって、[ErgoDash](https://github.com/omkbd/ErgoDash/)で業務中にDOOM EmacsのScratchバッファで[Org-mode](https://orgmode.org/)形式で書いたものを[pandoc](https://pandoc.org/index.html)でmarkdownにしました。
【Git】安全にリモートブランチにPushする

#安全にリモートブランチにPushする
これまで恥ずかしながらGitを利用したことがなかったので、備忘録として登録

##前提
①存在ブランチ
　master → リリース用ブランチ
　development → 全員が開発ソースをマージするブランチ
　kaihatsu1 → 現在私が使っている開発ブランチ
　kaihatsu2 → 現在他の誰かが使っている開発ブランチ
　・
　・

②developmentには、pull requestを利用してマージ


##目的
コンフリクトが起こった場合でも、リモートでコンフリクトが発覚するという自体を防ぐ。

##手順
###①現在の作業ブランチを確認
git branch
※開発ブランチであることを確認

###②修正/追加したファイルをコミット対象とする
git add .
※「add .」で修正したファイルを全てコミット対象とする。
※もしも、単数ファイルのみをコミット対象としたい場合は
git add [ファイルパス]
でコミット対象ファイルのみコミット対象とすることが可能

###③コミット対象としたファイルをローカルコミット
git commit -m "コミット時のコメント"
※この時点では、リモートブランチにコミットされていません。

###④ブランチの切り替え
git checkout development
※最新ソースがアップされている

###⑤現在のローカルブランチとリモートブランチの差分を確認する
git fetch

###⑥リモートのdevelopmentブランチから最新ソースをローカルブランチに持ってくる
git pull origin development
※最終的に開発者全員がマージするブランチなので、以前pullした状態と異なる可能性がある。

###⑦先ほどローカルコミットしたブランチに切り替え
git checkout kaihatsu1(作業ブランチ)

###⑧先ほどdevelopmentからpullしてきたソースをkaihatsu1ブランチにマージ
git merge development
※コンフリクトが起こる場合はここで起こる。

###⑨コンフリクトが起こっていないか確認
git status
※コンフリクトが起こっている場合は、修正するファイルが表示される。

###⑩コンフリクトが起こっていない確認が取れたら、リモートブランチにPushする
git push origin kaihatu1
Promise.allに終了済みのPromiseを渡しても、エラーなく素通りする


```.ts
const sleep = msec =>
  new Promise(resolve =>
    setTimeout(() => {
      console.log(`sleep end ${msec}`);
      resolve();
    }, msec)
  );
const exec = async () => {
  console.log(`start ${new Date()}`);
  const promise1 = sleep(1000);
  await sleep(3000);
  console.log("begin promise all");
  await Promise.all([promise1]);
  console.log(`end ${new Date()}`);
};
exec();

```

結果
> start Wed Sep 18 2019 11:28:44 GMT+0900 (Japan Standard Time)
> sleep end 1000
> sleep end 3000
> begin promise all
> end Wed Sep 18 2019 11:28:47 GMT+0900 (Japan Standard Time)
Hinemosのジョブはカタマリ単位で実行する

私はジョブツールをHinemosしか使ったことがなく、これが普通だと思っていたのですが、JP1やJenkinsを使っていた人からすると中々理解しにくい動きをしているらしく、説明整理用にHinemosジョブの動き方についてまとめました。

# Hinemosジョブはカタマリ単位で実行される
題名にもありますが、Hinemosジョブはカタマリ単位で実行されます。ここでいうカタマリとはジョブユニットとか、ジョブネットとか、ジョブを指します。

## よくある一般的なジョブフロー
よくあるジョブは以下みたいな動きをすると思います。
![hinemosjob001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231123/6235a733-37a8-2e3a-9be3-4c4da7f790db.png)
ジョブA、ジョブB、ジョブCがそれぞれ順に実行するように設定しています。
このとき、ジョブAを実行すると完了すると後続のジョブB、ジョブCが実行していきます。

## Hinemosでのジョブフロー(うまくいかない版)
これと同じようなジョブフローをHinemosジョブで作成すると以下のようになります。
![hinemosjob002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231123/690a293d-2d48-8b57-4e6f-c7e79b68fcd9.png)
Hinemosでは親としてジョブユニットを作成し、その子としてジョブネットやジョブを設定するため上記のようになります。ジョブユニットのカタマリの中にそれぞれジョブのカタマリが3つあり、待ち条件を設定しているという感じです。
待ち条件はジョブBは「ジョブAが正常終了」、ジョブCは「ジョブBが正常終了」とします。

このとき、一般的なジョブと同じようにジョブAに対して手動実行やスケジュール実行をした場合、**ジョブAは実行されますが、後続のジョブBやジョブCは実行されません。**
これは、実行単位のカタマリがジョブユニットではなく、ジョブに対して実行されたためです。この場合はジョブAのカタマリに対してのみジョブ実行が有効になっているイメージのため、いくらジョブBやジョブCで待ち条件を設定してもそもそもジョブ実行が有効となっていないので、実行されないというわけです。

## Hinemosでのジョブフロー(うまくいく版)
一般的なジョブのようにジョブA、ジョブB、ジョブCを実行するにはそのひとつ上のカタマリであるジョブユニットを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231123/ce761427-0c18-da2f-f942-07c0da81f769.png)
このように、Hinemosのジョブは実行したカタマリの中のジョブネット、ジョブが有効になって実行されるようなイメージです。そのため、ジョブA、ジョブB、ジョブCはジョブユニット1を起動すると3つすべてのジョブが有効になり、何も設定されていなければ並行で同時に実行しようとします。
それを、ジョブフローのように順々に実行したいためにそれぞれ**待ち条件**をつけるというイメージを持っていただくと設計しやすいと思います。
minishiftのインストールでKVMドライバを認識しなかった場合の解決方法

# minishiftをCentOS7.3にインストールしたときにKVMドライバを認識しなかった場合の解決方法

## セットアップ
セットアップ周りは以下記事を参考にさせていただいた。
https://qiita.com/imp555sti/items/cce97a3c4e412f7325c5

 - minishift: 1.28.0
 - OS: CentOS7.3

## minishiftのインストール
```
# ./minishift start
-- Starting profile 'minishift'
-- Using proxy for the setup
-- Check if deprecated options are used ... OK
-- Checking if https://github.com is reachable ... OK
-- Checking if requested OpenShift version 'v3.11.0' is valid ... OK
-- Checking if requested OpenShift version 'v3.11.0' is supported ... OK
-- Checking if requested hypervisor 'kvm' is supported on this platform ... OK
-- Checking if KVM driver is installed ... FAIL 
   See the 'Setting Up the Virtualization Environment' topic (https://docs.openshift.org/latest/minishift/getting-started/setting-up-virtualization-environment.html) for more information
```

KVMドライバのインストールチェックで失敗している。
前述の参考にさせていただいた記事や、公式サイトによると以下手順であるが、この設定がされていてもエラーが発生する。

### 設定方法
```bash
# curl -L https://github.com/dhiltgen/docker-machine-kvm/releases/download/v0.10.0/docker-machine-driver-kvm-centos7 -o /usr/local/bin/docker-machine-driver-kvm
# chmod +x /usr/local/bin/docker-machine-driver-kvm
```

### マシンの状況
```bash
# ll /usr/local/bin/docker-machine-driver-kvm
-rwxr-xr-x. 1 root root 11939128  7月 19 09:20 /usr/local/bin/docker-machine-driver-kvm
```

## インストーラは何をチェックしているのか？
straceコマンド経由でminishiftコマンドを実行し、システムコールレベルで何をチェックしているかを確認してみる。

```bash
# strace -f ./minisfhit start
(省略)
[pid  3433] write(1, "-- Checking if KVM driver is ins"..., 43-- Checking if KVM driver is installed ... ) = 43
[pid  3433] newfstatat(AT_FDCWD, "/sbin/docker-machine-driver-kvm", 0xc4202f6378, 0) = -1 ENOENT (No such file or directory)
[pid  3433] newfstatat(AT_FDCWD, "/bin/docker-machine-driver-kvm", 0xc4202f6448, 0) = -1 ENOENT (No such file or directory)
[pid  3433] newfstatat(AT_FDCWD, "/usr/sbin/docker-machine-driver-kvm", 0xc4202f6518, 0) = -1 ENOENT (No such file or directory)
[pid  3433] newfstatat(AT_FDCWD, "/usr/bin/docker-machine-driver-kvm", 0xc4202f65e8, 0) = -1 ENOENT (No such file or directory)
[pid  3433] write(1, "FAIL\n", 5FAIL
)       = 5
[pid  3433] write(2, "   See the 'Setting Up the Virtu"..., 180   See the 'Setting Up the Virtualization Environment' topic (https://docs.okd.io/latest/minishift/getting-started/setting-up-virtualization-environment.html) for more information
) = 180
```

docker-machine-driver-kvmを配置した場所とインストーラがチェックするパスが異なっているようだ！
当方の環境で何故こうなったのかは分かりませんが、/usr/bin/docker-machine-driver-kvmにシンボリックリンクを貼って解決しました。（インストーラがチェックするパスのいずこに配置しても大丈夫だと思います）

```bash
ln -s /usr/local/bin/docker-machine-driver-kvm /usr/bin/docker-machine-driver-kvm
```
mysqldumpのよく使うオプションメモ

mysqldumpのよく使うオプションメモ

```
mysqldump --single-transaction --all-databases -u root -ppassword -h localhost > /home/hoge/all_databases.sql
```

```-u ```
ユーザ名

```-p ```
パスワード

```-h ```
ホスト名

```--single-transaction ```
ダンプ処理をトランザクションで囲む。
データの整合性を保つのに有効だが、MyISAMテーブルが含まれるDBではトランザクションが効かないので、代わりに--lock-tablesか--lock-all-tablesを使う。
InnoDBでは--single-transactionを使った方が速い。

```--all-databases ```
全DBを対象とする
VS CodeのCode RunnerでDartを実行した結果が文字化けする

## 環境

基本的なところは変わらないと思いますが、念のため。
OS: Windows 10
VS Code: 1.38.1
Dart(VS Extention): 3.4.1
Dart(SDK): 2.4.0
Android Studio:3.5

## 結論:DartのSDKにパスを通してないと文字化けする

文字化け以前の問題ですけど、ググっても出てこないので、私以外にもはまってるうっかりさん・初心者の人もいる気がする。。。。。

## 経緯

Android StudioでFlutterの開発をしています。デバック実行などはエミュレータで行っているのですが、Dartの言語仕様を確認するためなどに、ちょっとしたコードスニペットを実行したい時があります。

VS Codeに拡張機能を入れてスニペットを実行したのですが、スクショのように文字化けしてしまいました。
![文字化け.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227939/82760030-51e4-204f-2de7-184050468cb2.png)

## 原因と対処

Android Studioのプラグインを入れただけだと、DartのSDKにパスが通っていません。文字コードなど、他の設定があっているなら、パスを通せば文字化けは解決するはずです。

以下、SDKをどこに置いたか分からなくなってしまった人用

Android Studioを開く
![2019-09-18 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227939/7a1e262c-c2a6-42dd-2b70-147abc143ccb.png)

SHIFTを2回押すとコマンドパレットが開くので(Macの人のショートカットキーは知らない)settingsと入力して設定を開く

![2019-09-18 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227939/316c0691-f321-9fcc-91c8-258f0afd9943.png)


Languages & Frameworksの下にDartがあるので、それを選択すればSDKの場所が分かります。
![2019-09-18 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227939/3d35aab7-b8b9-1c02-90b1-fd34b40f10fc.png)
Git Resetが役に立った

## Git Resetが役に立った

- 状況
 - ローカルで作業を進めたはいいものの昔の状態に戻したくなった時

- やったこと
 - `git log --graph --all --format="%x09%an%x09%h %d %s" ` (これで過去のコミットログ見る、戻したいコミットのshaを確認)
 - `git reset --hard 戻したい状態のsha`
 
これでローカルのファイルたちを過去の状態に戻した

- 余談
 - git resetする前に今のファイルなどをどこかにバックアップしておこう
 
備忘録
Nexus repository manager に mvn deploy したら Return code is: 401, ReasonPhrase: Unauthorized.



## 経緯

別サーバにたてている `Nexus Repository Manager` に `pom.xml` をデプロイしようとしたら `Return code is: 401, ReasonPhrase: Unauthorized.` が発生して `BUILD FAILURE` になった。

```
C:\xxx>mvn deploy
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building xxx x.x.x-SNAPSHOT
[INFO] ------------------------------------------------------------------------

...

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.540 s
[INFO] Finished at: 2019-09-18T10:47:41+09:00
[INFO] Final Memory: 11M/245M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project xxx: Failed to deploy artifacts: Could not transfer artifact xxx from/to xxx-snapshot (http://xx.xx.xx.xx/nexus/repository/snapshot/): Failed to transfer file: http://xx.xx.xx.xx/nexus/repository/snapshot/xxx. Return code is: 401, ReasonPhrase: Unauthorized. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
```

## 解決方法

`C:\Users\{your-username}\.m2\settings.xml` にデプロイ先のサーバ情報が記述されていなかったので、追加することで解決。

```xml:pom.xml
  <distributionManagement>
    <snapshotRepository>
      <id>xxx-snapshot</id>
      <name>Snapshots</name>
      <url>http://xxx/nexus/repository/snapshot/</url>
    </snapshotRepository>
  </distributionManagement>

```

```xml:settings.xml
<settings>
	<servers>
		<server>
			<id>xxx-snapshot</id>
			<username>xxx</username>
			<password>xxx</password>
		</server>
	</servers>
</settings>
```
【VirtualBox】ゲスト環境が異様に重くなったときの対応

VirtualBox 上で動かしている環境が突然異様に重くなり、対応したときのメモ。

## 環境

* Virtualbox 6.0.10 r132072 (Qt5.6.2)
* ホスト環境：Windows 8.1
* ゲスト環境: Windows Server 2016 (評価版)

## 原因

VirtualBox の設定で、 CPU の使用率制限が **1%** になっていた。[^1]

[^1]: 設定を変更した覚えはないですが、スナップショットを復元したタイミングから重くなったため、そこで設定が変わっていた？。。。

## 対応

使用率制限を 100% に変更した。

なお、設定の変更はゲスト環境が動作した状態で行い、

設定変更直後からあきらかに動作が改善した。
Javaでアスキーアート

ログをデコりたいと思って遊んでみた備忘録。
文字をアスキーアートにします。
全部Javaの標準ライブラリで作れます。
【参考】https://www.baeldung.com/ascii-art-in-java
※上記をお手本に、ちょいちょい動かなかったところを手直し

## 1. クラス作成
```java:ASCIIService.java
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
 
public class ASCIIService {
 
    /**
     * アスキーアートを作るメソッド.
     * @param str アスキーアートにしたい文字
     * @return StringBuilder アスキーアートになった文字
     */
    public static StringBuilder createAscii(String str) {
 
        // 生成するグラフィックのサイズ
        int height =30;
        int width = 200;
        // 描写開始位置
        int startX = 2;
        int stratY = 20;
        // フォントを設定
        Font font = new Font("Arial", Font.BOLD, 14);
        StringBuilder sysout = new StringBuilder("\n");
         
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics graphics = bufferedImage.getGraphics();
         
        // テキストをgraphicに変換
        Graphics2D g = (Graphics2D) graphics;
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g.setFont(font);
        g.drawString(str, startX, stratY);
         
        // graphicをもとにしてアスキーアートに書き起こし
        for (int y = 0; y < height; y++) {
            StringBuilder stringBuilder = new StringBuilder();
          
            for (int x = 0; x < width; x++) {
                stringBuilder.append(bufferedImage.getRGB(x, y) == -16777216 ? " " : "@");
            }
            if (stringBuilder.toString().trim().isEmpty()) {
                continue;
            }
            sysout.append("\n" + stringBuilder);
        }
        sysout.append("\n");
        return sysout;
    }
 
    public static void main(String[] args) {
        // 実行
        System.out.println(createAscii("PROCESS START!"));
    }
}
```
## 2. 実行
eclipseを使っていたら、
クラスを右クリック＞実行＞Javaアプリケーション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243523/24ebd43c-8375-88d4-8f8d-43da8f47e397.png)



### パスが通っていればコマンド実行もできる

パスの通し方　https://www.javadrive.jp/start/install/index4.html
コマンド実行の仕方　https://pentan.info/java/command_line.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243523/9c886a92-e7c2-34fe-215e-555cd4ca7687.png)

## 備考. もっと簡単にやりたい
ライブラリを利用すると1行でつくれるみたいです
https://qiita.com/hoge390281/items/808b9e9afddf5db41f20
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243523/91c39948-3030-3832-aa3c-17bf7a87b32a.png)
シンプル！かわいい！
Androidの単体テストでファイルを参照する

Androidの単体テストでファイルを読み取りたい時があります。
たとえばretrofitのAPIをテストする場合、MockWebServerからのjsonレスポンスをソースコードでなくファイルとして保存しておきたいかもしれません。
テストの本質ではないので、テストのために冗長なファイル読み取りのコードを書きたくないですよね。
本エントリではAndroidの単体テストで簡単にファイルの内容を読み取る方法を紹介します。

# ファイル保存場所
テストクラスが `test/java/com/example/HogeTest.kt` の場合、読み取りたいファイルは `test/resources/com/example/` に保存します。
パッケージ名と同じディレクトリ構成にすると簡単にアクセスできわかりやすいので便利です。

# 読み取りコード
テストケースからは次のようにしてファイルの内容を読み込むことができます。

```kotlin
class HogeTest {
    @Test
    fun hoge(){
        val jsonString = IOUtils.toString(javaClass.getResourceAsStream("response.json"), StandardCharsets.UTF_8)
    }

    // runBlockingを使う場合
    @Test
    fun hoge2() = runBlocking {
        val jsonString = IOUtils.toString(this@HogeTest.javaClass.getResourceAsStream("response.json"), StandardCharsets.UTF_8)
    }
}
```



`IOUtils` は以下の依存を追加することで使用できます。

```gradle

    testImplementation "commons-io:commons-io:2.6"
```
# 参考
https://stackoverflow.com/questions/28923728/how-to-read-a-test-only-file-in-android-unit-test/29220857
GitHubでssh鍵を設定しリポジトリをクローンする(macOS)

## 目的
- 自身の備忘のために本ページを記述する。

## ゴール
- macOS上で公開鍵・秘密鍵を作成し、GitHubに設定、git clone ssh://...ができるようにする！

## 手順
- ホームディレクトリに.sshがなければ作成する(今回はあったのでスキップ)

```bash
hogehogenoiMac:~ hogehoge$ cd .ssh
hogehogenoiMac:.ssh hogehoge$ ls
known_hosts
```

- 鍵を作成する。

```bash
hogehogenoiMac:.ssh hogehoge$ ssh-keygen -t rsa -b 4096 -C "(メールアドレス)"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/hogehoge/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/hogehoge/.ssh/id_rsa.
Your public key has been saved in /Users/hogehoge/.ssh/id_rsa.pub.
```

- Githubの鍵設定の箇所に**id_rsa.pub**の内容を貼り付ける。
<img width="1057" alt="スクリーンショット 2019-09-18 10.41.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279475/83b59f59-b3c3-74a2-e3f2-3b5930dbe885.png">

- 動作確認

```bash
hogehogenoiMac:repos hogehoge$ ssh -T git@github.com
# known_hostsに追加するか聞かれるので、yesを入力する
...
Hi (ユーザ名)! You've successfully authenticated, but GitHub does not provide shell access.
```

- git clone

```bash
hogehogenoiMac:repos hogehoge$ git clone git@github.com:(ユーザ名)/prj.git
Cloning into 'prj'...
...
Receiving objects: 100% (3/3), done.
```

以上。
"PNG 8-bit RGB 256c"フォーマットのセグメンテーション画像をPILで作る

# 0. 概要
多くのセグメンテーション用画像で用いられている`PNG 8-bit RGB 256c`フォーマットの画像。これを作るのって実は難しい。例えば、Imagemagicを使えば`convert xxx.png -colorspace RGB -colors 256 png8:xxx.png`もしくは`convert xxx.png -depth 8 xxx.png`なんていう変換を掛けてあげれば前述のフォーマットに変換することができるが、`2c`になってしまったりする場合があったりで上手く行かない場合がある。また出来ればコマンドを叩かず、プログラム上で完結させたい。

そこでPILでよく例に挙げられるのは`pilImg.convert('L')`でグレイスケールに変換する方法がある。しかし、これだと`PNG +0+0 8-bit sRGB`のフォーマットになってしまい、カラースペースが異なる。

色々調べたものの、中々目的の方法にたどり着けず、試行錯誤してようやく`PNG 8-bit RGB 256c`のフォーマットにする方法を見つけたので共有したいと思う。

# 1. `PNG 8-bit RGB 256c`を作る
PILで作った3chのセグメンテーション画像を`pilImg`とする。
これを以下の手順で変換する。

```
R, G, B = pilIMG.split()
R.save(fileName, "png")
```

これだけで` PNG +0+0 8-bit RGB 256c`のフォーマットを作成することができる。
ssh_exchange_identification: Connection closed by remote host 

# ssh_exchange_identification: Connection closed by remote hostが出た時

## Overview

ssh で `git clone` しにいった時下記のようなログを吐き出し取得してくれませんでした。

```
keisuke ~:$: 
->> git clone git@github.com:keisukeYamagishi/xsort.git
Cloning into 'xsort'...
ssh_exchange_identification: Connection closed by remote host
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

このような場合巷では、knownhostを編集しろだの、サーバーのIPアドレスを変えるだの、サーバー側の `/etc/ほにゃらら`を見直せなど色々ありますが、それでも解決しない場合、

***VPN***で接続しているとできない

なので、VPNの接続を解除したらうまく行くかもしれません。
Windows Server Container Support in Rancher 2.3.0



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256080/035122a1-711a-6735-f572-787a434494e2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256080/98d9495e-bd7e-d112-ff84-5b5fa5385bcb.png)

※2019/10時の情報
VSCodeで全角スペースが見辛かった件

# VSCodeで全角スペースが見辛かった件

## 拡張機能を探してみる
スペースを表示する設定 editor.renderWhitespace を設定しても、半角スペースを表示してくれるだけで、 **全角スペースが眠っているか分かりづらい** 。
やつらは、ダメなんです。
紛れたら、大変なんです。

ので、拡張機能を探してみた。

## zenkakuという拡張機能
結論いうと、これがどんピシャでした。
拡張機能[zenkaku](https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku)が良かったです。
→ https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku

vscodeのExtensionsから「[zenkaku](https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku)」ですぐヒットしました。

![zenkaku.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435600/218e53c1-6fae-a10c-7c45-018cad017ccc.jpeg)

インストールして、コマンド(F1)から「[zenkaku](https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku)」を有効にする

```
Enable Zenkaku
```

## 結果
![zenkaku2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435600/83629e9b-6ddc-e2d9-11d6-d90c5e8284b8.jpeg)

いい感じです。
Railsでの開発を快適にするための工夫集

## 目的
* Rails案件（だけの話ではないだろうけど）には、**「このメソッドを変えると、どこに影響が出るんだろう」**とか**「このクラスはどこで作られたり、更新されてるんだっけ」**という疑問が頻繁に起こる。
* なので、なるべくその疑問がスピーディに解消できるような工夫をまとめておく。

## 工夫集
### ActiveRecordの`create`や`update`は「決まった形」から生やす
* 特定のActiveRecordの`create`や`update`と言った、DB処理があちこちに散らばっている場合には、検索しやすいように特定の形に限定しておくことで、楽に影響範囲を調査できる。
* 具体的には、呼び出し元を`AdminUser`とする場合には、以下の形に限定する。
    * `AdminUser`（Camelケース）
    * `admin_user`（Snakeケース）
* 加えて、DBメソッドも以下に限定する
    * `new`
    * `save, save!`
    * `create, create!`
    * `update, update!`
    * `destroy, destroy!`
    * `find_or_create_by, find_or_create_by!`
    * `find_or_initialize_by`
* こうすれば、パターンとしてはせいぜい（2 x 7 = 14通り）になるので（あれ？結構大変？）、思わぬ見過ごしが減って、影響範囲がすぐにわかるようになる。
* あと、newで呼び出す場合は必ず以下のどちらかの形になる

```ruby
@admin_user = AdminUser.new(...)
admin_user = AdminUser.new(...)
```

#### アンチパターン
* 「コードを短くしたい」という名目で`au.create`とかにしてしまうと、発見しづらくなる
* has_many関連のモデルを`User.dogs.create`とかで作成するのも、上のパターンから外れるのでNG

### DB処理が走る箇所にはユニットテストを仕込む
* これをしておくだけでも、見落としをだいぶん防げる。
* 基本全てのメソッドを手動で試し尽くすことはできないので、崩れて欲しくないロジックなどにはテストを必ず挟むこと

### DBスキーマの修正とFactory、DBシードの修正をセットにする
* 個人的な意見だが、**「プロジェクトの開発環境の健康度」と「プロジェクトのDBシードの管理具合」の間には正の相関がある**と思っている。
* 一応「DBシード」とは、**「開発環境のDBに入れるデフォルトデータ」**のことである。
* そして「良いDBシード」とは、**「アプリのビュー表示ロジックの、ありとある可能性を網羅できるデータ」**とする。
* これがしっかり管理されていると、コードの修正によって問題が発生した時に、すぐさま何処のビューに「エラー」として表示されるため、バグの発見が早まるのだ。
* なので、「DBに新しいフィールドが追加・更新・削除される」と言った場合には、必ずセットでFactoryとSeedを修正することをセットにする。

### コントローラーアクションへのアクセス権限ロジックはPunditに集約する
* ログインユーザーの状態（プランの違いだったり、登録情報の有無だったり）によって、「コントローラーの特定のアクション」をさせたくないとする。
* かといって、その条件文をコントローラー内に書くと、コントローラーが「重く」なってしまう。
* そんな時には[pundit](https://github.com/varvet/pundit)というGemが役に立つ。
* これを使えば以下のように、権限周りの条件文を`app/policies`以下のディレクトリで一元管理することができる。（細かい使い方は簡単なので、リポジトリを参照）

```ruby
# app/policies/article_policy.rb
# ログインユーザーの「記事オブジェクト」に関する行動範囲
class ArticlePolicy < ApplicationPolicy
  # 詳細ページへは誰でもいける
  def show?
    true
  end

  # newページへはcreateができる権限でないと行けない
  def new?
    create?
  end

  # ログインユーザーがpennameを入力してないと作成できない。
  def create?
    user.penname.present?
  end
end
```

### 決まり切った処理はServiceクラスでパッケージ化
* 複数のテーブルが関連するDB処理の場合、順番が大事なケースがある。
* その場合、**Serviceクラスで処理を全てパッケージ化すると、管理がとても楽になる**
* サービスクラスの鉄則として、**クラス内で直接モデルを呼び出さない。必要なモデルは全て引数から入れる**
* いわゆる「ダックタイピング」な疎結合のクラスを作ることで、モデルの呼び出しを全てコントローラー内に収めることができる。
* また小ネタ的な使い方だが、サービスクラス内で処理されるモデルを全部`attr_reader`に登録しておくことで、**「ああこのサービスクラスではこのモデルを処理してるのか」が一発でわかる。**
* あとは「なんのためのサービスクラスか」をコメントしておくと、よりGOOD。

```ruby
# app/services/sample_service.rb

# UserとDogを同時に保存するサービスクラス
class SampleService
  attr_reader :user, :dog

  def initialize(user, dog)
    @user = user
    @dog = dog
  end

  # ActiveRecord::RecordInvalidをthrowする可能性があるため
  def call!
    ActiveRecord::Base.transaction do
      user.save!
      dog.save!
      # これはアウト
      # Dog.create!(user: user)
    end
  end
end
```

## ビューで「データをそのまま表示するメソッド」と「ステータスによってデータを加工・表示するメソッド」は分ける
Rメモ

# インストール（OSX）
RとRStudioをインストール

``` sh
brew tap brewsci/science
brew install r 
brew cask install rstudio
```

コマンドラインからエイリアスでRStudioを起動したい場合。必要かなこれ疑問。

``` sh
echo "alias rstudio='open -a RStudio'" >> ~/.bash_profile
source ~/.bash_profile
```

参考
https://csudsi.netlify.com/2017/03/24/2017-03-24-install_r_homebrew/
https://qiita.com/epsilonminder/items/e3b1fc00edb63cb3a32b
Cloud SDKインストール手順(macOS)

## 目的
- 要件を達成するための手順を記述する。
- 今後同様のことをするための備忘録とする。

## 要件
やりたいことは以下の通り。

- 端末からCLIベースでコンポーネントを操作できるようにする。

## 環境
- OS : macOS 10.14.6 

## 手順
### Cloud SDKインストール
[公式ドキュメントサイト](https://cloud.google.com/sdk/downloads?hl=ja#interactive)を見ながら進めていく。

- ```curl https://sdk.cloud.google.com | bash```を入力。
- 途中でいくつか質問されるが`Y`を入力する。
- シェルを再起動する。```exec -l $SHELL```
- gcloud環境を初期化する。```gcloud init```
    - 自身のアカウントを尋ねられるので、ログインする。(ブラウザに遷移する)
    - すでにプロジェクトを作成している場合にはプロジェクトを尋ねられるので、好きな方を選択する。

```bash
Pick cloud project to use:
 [1] project 1
 [2] project 2
 [3] Create a new project
Please enter numeric choice or text value (must exactly match list
item):  2
```

- リージョンを設定するか聞かれるので、必要であれば選択する。

```bash
Do you want to configure a default Compute Region and Zone? (Y/n)?  Y
Which Google Compute Engine zone would you like to use as project
default?
If you do not specify a zone via a command line flag while working
with Compute Engine resources, the default is assumed.
 [1] us-east1-b
 [2] us-east1-c
 [3] us-east1-d
 [4] us-east4-c
 [5] us-east4-b
 [6] us-east4-a
 [7] us-central1-c
 [8] us-central1-a
 [9] us-central1-f
 [10] us-central1-b
 [11] us-west1-b
 [12] us-west1-c
 [13] us-west1-a
 [14] europe-west4-a
 [15] europe-west4-b
 [16] europe-west4-c
...
```

以上。
[Elm]Browser.applicationでelm reactorがちゃんと動かない

[elm-live](https://github.com/wking-io/elm-live)の記事です。elm-liveは4.0.0にアップデートしてはやくなったりしました

[前回記事](https://qiita.com/miyamo_madoka/items/704dd4c4f6756265e3a5)

## ルーティングしたいがちゃんと動かない

elmに同梱されている`elm reactor`で起動する開発用サーバーは`Browser.sandbox`, `Browser.element`, `Browser.document`では問題なく動作しますが`Browser.application`を使ってルーティングしようとするとうまくいきません
elm reactorはURLを書き換えられることを考慮していないので動かないのでした

## elm-liveを使う

そんなときはelm-liveを使ってみましょう

```sh
npm install -g elm-live
elm-live src/Main.elm --pushstate
```

`src/Main.elm`部分をお好みのファイルにして起動しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74093/7ad9577d-f7cc-2c16-12df-f20905c9f754.png)

こんな感じになります。あとはlocalhost:8000をブラウザで開いて開発しましょう

### `-u`, `--pushstate`

このオプションがルーティング用のやつです。付けていると`http://localhost:8000/`を開いても`http://localhost:8000/ham/spam/egg`を開いても同じファイルで実行してくれます

詳しいことは[README](https://github.com/wking-io/elm-live)を読みましょう

## 進化したelm-live

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74093/b1539002-ab20-9209-b6e1-6f1dfb4c05d1.png)

コンパイルエラーになったらエラーメッセージを画面とコンソールに色付きで出してくれるようになりました

`--no-server`でwebpackなんかと混ぜるのも想定されるようになっている感じです
サクラエディタで複数ファイルを置換して保存する

* driver.batがreplace.macを呼び出して、cd c:\work\ReplaceTarget配下に存在するファイルに対して繰り返し置換・保存する。

```
C:.
│  driver.bat
│  replace.mac
│
└─ReplaceTarget
        hogepiyo.txt
```

```replace.mac
// 置換
S_ReplaceAll('bow-wow', 'miaow', 36);
// 保存
FileSave();
// 閉じる
WinClose();

```

```driver.bat
cd C:\work\ReplaceTarget
for %%a in (*) do (call:method %%a)
exit
:method
"C:\Program Files (x86)\sakura\sakura.exe" %1 -M=c:\work\replace.mac
```
#GoogleChrome Developer Tool でネットワークとかコンソールのログ、履歴を消去・リセットしてスッキリする方法は一度閉じてからまた開く。 

Macなら Command+Option+i を二回押す。素早く！

# 掃除したい

![image](https://user-images.githubusercontent.com/13635059/65084468-3ec03480-d9e6-11e9-821c-6ce72f7f24f1.png)

# スッキリ

![image](https://user-images.githubusercontent.com/13635059/65084489-50094100-d9e6-11e9-8379-fcb654824480.png)

# もっとスッキリしたいときは？

ストロングゼロ・ゴールドサワーがオススメです。

![image](https://user-images.githubusercontent.com/13635059/65084606-a9717000-d9e6-11e9-86e7-770497396d8a.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ReactNative(Expo)でPinコード画面を利用する


以前、見た目が良いという理由で[react-native-pincode](https://github.com/jarden-digital/react-native-pincode)を試してみたが、Expoでは残念ながら動かないことがわかりました。。。

なにげにネットを見ているとreact-native-pin-viewというのがあったので試してみました。

## 結論

* react-native-pin-viewは、文字通りviewだけでpinの保持等のロジックは実装されてない
  * ロジックは自分で実装する必要がある

## できたもの

![スクリーンショット 2019-09-18 9.41.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/cd9d7474-8144-e53b-5d7f-bf7e562d27f8.png "スクリーンショット 2019-09-18 9.41.04.png")


## 使い方

### インストール

```bash
npm install --save react-native-pin-view
```

### 実装

pinの入力が完了したらonCompleteが呼ばれるので、そこに色々実装する。
まあ、実際には取得したpinをAsyncStorage等に保存して呼び出す感じになるかと・・・

```js:App.js
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import PinView from 'react-native-pin-view'

export default class App extends React.Component {

    state = {
        pin: '1234'
    }

    onComplete = (inputtedPin,clear) => {
        if(inputtedPin == this.state.pin){
            alert('Pin is correct');
            clear();
        }else{
            clear();
        }
    }

    render() {
        console.log(this.state.pin);
        return (
            <View style={{ flex: 1, justifyContent: 'center', backgroundColor:'#87cefa' }}>
                <PinView
                    pinLength={this.state.pin.length}
                    onComplete={this.onComplete}
                    inputViewStyle={{backgroundColor:"#000"}}
                    inputBgOpacity={0.3}
                />
            </View>
        );
    }
}
```

まあ、裏でなにやってるのかわからないより、ロジックは自分で実装したほうがスッキリはするかな。。。
デザインはreact-native-pincodeを真似ればいいし。
#git ですごく勘違いしていたこと。 gitignore が反映されない？ 一度管理対象にしたファイルは削除してコミットしないと無視できないっぽい。

再現

# ファイルAを管理対象にしてコミットする

```
git init
echo "A" >> a.txt
git add .
git commit . -m 'a.txt'
```

# ファイルBを作成し、 ファイル A / B の2個を gitignore で無視しようとするが、ファイルAは git に現れる

```
echo "/a.txt" >> .gitignore
echo "/b.txt" >> .gitignore
echo "A" >> a.txt
echo "B" >> b.txt
git status 
```

# ファイルAを削除してコミットする

```
git rm a.txt
git add .
git commit . -m 'delete a.txt'
```

# ファイルA / B の両方が git 差分に現れなくなる

```
echo "A" >> a.txt
echo "B" >> b.txt
git status
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Atom - HTMLの最低限のインストールパッケージ

# 最低限あると良し
`メニュー -> 環境設定(Setting) -> インストール(Install)`の検索欄に以下を入力してインストール

- `japanese-menu`
    - メニューなどを日本語化する
- `autoclose-html`
    - HTMLタグを入力すると閉じタグを自動入力してくれる
- `atom-html-preview`
    - `Ctrl + Shift + M`でリアルタイムプレビューができる

# 追加で入れるとなお良し
- `color-picker`
    - ペイントの色づくりのように色を作るとカラーコードを自動入力してくれる
- `pigments`
    - カラーコードの上にその色を表示してくれる
FireStoreでQuerySnapShotからデータを取り出す時はforEachよりdocsの方が便利

Firestoreでcollectionを複数取ってくる場合、大体以下のような書き方をします。

``` javascript
db.collections('hoge').get().then(querySnapshot => {
  querySnapshot.forEach(docs => {
     //それぞれのレコードに対する処理
  });
});

```
[公式ドキュメント](https://firebase.google.com/docs/firestore/query-data/get-data?hl=ja#get_multiple_documents_from_a_collection)でもこの方式です。
この方式、上記の`     //それぞれのレコードに対する処理`の部分が、「単にそれぞれの要素に対して何らかの処理をしたいだけ」という場合だったらforEachでいいと思うのですが、普通そんなことはないと思います。
基本的にDBアクセス部分とロジック部分は切り離したいので、このforEachの中に書かれるのは**予め作っておいた配列にデータを詰める**とか、ビジネスロジック側で使いやすいように**docをちょっと整形・変換する**とかその程度のはずです。

要するに、forEachではなくて、**mapとかその辺りを使いたい。**
しかし、残念ながらquerySnapshotにはforEachしかありませ。

# ここで登場するdocs
とはいえ実はいい感じの逃げ道がありまして、querySnapshotにはdocsというプロパティがあります。
これを使うとなんとQueryDocumentSnapshotの**配列**が取れます。

ひとたび配列にしてしまえばいくらでも加工できるので、かなりやりやすくなります。

``` javascript

db.collections('hoge').get().then(querySnapShot => {
  const datas = querySnapShot.docs.map(doc => {
      //変換処理
  });
})

```

# まとめて抱えるリスクは？
DBからデータを1つずつ取ってきて逐次処理する方式と、はじめに全て取得する方式を比較すると、一般的には大量データの場合後者は危険です。
一度全て読み込む都合上、瞬間的にメモリを大量に使用して食いつぶしてしまう可能性があるからです。
が、フロントエンドからfirestoreを使う場合に限って言えば、普通に設計していればそんなに大量のデータを読み込むことはないはず(メモリを食いつぶすようなデータを取ってきて画面に表示しても人が認識できる範囲を超えてしまうので無意味)なので、あまり心配はいらないはずです。

# まとめ
* firestoreから複数データを取り出す場合はdocsがおすすめ。
Pythonで二分探索を行うライブラリ「bisect」

趣味で競プロをやるようになり、Atcoderの問題を何問か解いているのだが、
やっている内に覚えないといけないこともいくつかあるわけで。
その内の一つに二分探索というアルゴリズムを使うという場面を多く見てきたため、自分が今よく利用しているpythonでいつでも使えるように二分探索を行うスクリプトでも書いておこうかと思った。

しかし取り掛かろうとして調べて見たところ、なんとpythonには二分探索を行うライブラリが最初から用意されているらしい。
それがこの「**bisect**」というもので、このライブラリについて調べて見た。

# bisect

bisectモジュールのbisect関数はリストと値を入力とし、値をリストに挿入する位置のインデックスを返す。
とりあえずは使用例ということで、bisectを使ってみた。

```python
>>> import bisect
>>> a=[10,20,30,40,50,60,70,80,90,100]
>>> 
>>> bisect.bisect(a,55)
5
>>> 
```
この例の場合、リストaに値55を入れようとした時、a\[5\](50と60の間)に入れるのが適切なため、５を返す。

ちなみにbisectを使う時、入力するリストはすでにソート済みであることが前提である（これは本来の二分探索でも同じである）。ソートされてないリストを入力してもエラーは発生しないが、間違った形で二分探索が行われてしまう。

```python
>>> import bisect
>>> a=[54,32,76,33,89,44,323,67,88,1]
>>> bisect.bisect(a,55) # ソートしなくても二分探索は行うが・・・
6
```

## bisect_leftとbisect_right

また、入力した値が既にリストに入っていた場合、リストでその値の前に入れるか、後に入れるかで使い分けたいという場合もあると思う。この場合どうすれば良いのか？

bisectモジュールには更に**bisect_left**と**bisect_right**という関数があり、各々の場合に応じてこれらを使い分ける。
使用例を示す。

```python
>>> import bisect
>>> a=[1,2,2,2,3]
>>> 
>>> bisect.bisect_left(a,2)
1
>>> bisect.bisect_right(a,2)
4
>>> bisect.bisect(a,2)
4
```
この例の場合、a\[1\]からa\[3\]まで2であり、bisect_leftで2をリストaに適用すると、挿入点は2の一番前の位置である1を返す。
bisect_rightを使った場合はその逆で、挿入点は2の一番後の位置である4を返す。
ちなみにbisect関数はbisect_rightと同じ動作をする。

# insort

insort関数はbisect関数の動作に加えて、リストへの挿入も行う関数である。
bisect関数と同様に、リストに入力と同じ値があった場合にその値の前か後のどちらに挿入するかは、**insort_left**と**insort_right**という関数があるので使い分ける。
ちなみにinsort関数はinsort_rightと同じ動作をする。

```python
>>> import bisect
>>> a=[10,20,30,40,50,60,70,80,90,100]
>>> a
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
>>> 
>>> bisect.insort(a,55)
>>> a
[10, 20, 30, 40, 50, 55, 60, 70, 80, 90, 100]
>>> 
```

今後二分探索を利用する機会があったら活用していきたい。
（でも、できればライブラリ頼りではなく、本当はアルゴリズム自体も自分で理解して、一から書けるようにすべきだけど・・ね）
#Github の lock.yml を 新規作成するときは注意 (daysUntilLock) GitHub App lock bot から死ぬほど通知・スパムメールが届いた件。


# どう注意すれば良いの？(レポジトリ運営者)

botのコメントを disable にするとか？未検証。

```
# Comment to post before locking. Set to `false` to disable
lockComment: >
  This thread has been automatically locked since there has not been
  any recent activity after it was closed. Please open a new issue for
  related bugs.
```

# ユーザー対策

購読停止はレポジトリでUnwatchするだけで良いはず？多分。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/1182a3af-35f2-0687-a3a0-3c01df451524.png)

あと設定で Watchingのメール通知だけ停止しておくとか。

https://github.com/settings/notifications

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/b9e091ea-9d4a-43fe-3de9-c78a97defe25.png)


# メールが死ぬほど届いた

1分間隔で8時間ぐらい届き続けた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/876bc379-0d38-51f1-4e1f-ec5355bff36c.png)

# 鳴り止まぬ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/11fdae58-afd3-2023-030f-51e5776bec42.png)

# lock.yml

最近lock.ymlが新規追加されて、一気に多くのIssue/PRがロック対象になったと思われる。

[GitHub Apps - Lock](https://github.com/apps/lock)

[grapesjs/lock.yml at aee18dcf0602e5d56e7670deb8d4ffbf31c73008 · artf/grapesjs](https://github.com/artf/grapesjs/blob/aee18dcf0602e5d56e7670deb8d4ffbf31c73008/.github/lock.yml#L3-L4)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/42a1e7b9-72bf-6ddd-f97f-1505f41a5758.png)

# 大量にcloseされたIssueと大量のbotコメント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/57c301fb-d6f1-2bc4-e246-93ff02de4254.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/403196c0-3f4f-6f4a-ff37-8bad1630b245.png)



# なんでそんなにメールを送るの？

何か恨みでもあるの？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/e5b684cb-a4f0-54b1-a37e-0830229841fc.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
nomで左再帰を扱う

# はじめに
Rustのパーサコンビネータライブラリnomで左再帰を扱うライブラリnom_recursiveを作りました。ここではその仕組みと使い方を説明します。

https://github.com/dalance/nom-recursive

# 左再帰とは
一般的に再帰降下パーサでは

```
Expr = Expr + Expr | Term
```

のような構文をそのまま扱うことができません。
nomで書くとこんな感じですね。

```rust
pub fn expr(s: &str) -> IResult<&str, String> {
    alt((expr_plus_expr, term))(s)
}

pub fn expr_plus_expr(s: &str) -> IResult<&str, String> {
    let (s, x) = expr(s)?;
    let (s, y) = char('+')(s)?;
    let (s, z) = expr(s)?;
    let ret = format!("{}{}{}", x, y, z);
    Ok((s, ret))
}

pub fn term(s: &str) -> IResult<&str, String> {
    let (s, x) = char('1')(s)?;
    Ok((s, x.to_string()))
}
```

`expr`関数が無限再帰呼び出しになっていて、実行するとスタックオーバーフローします。

例えば`1+1`を入力した場合のパーサ呼び出しは以下のようになり、入力を消費することなく、無限に呼び出し続けます。

```
input | parser
1+1   | expr
1+1   |  expr_plus_expr
1+1   |   expr
1+1   |    expr_plus_expr
1+1   |     expr
1+1   |      expr_plus_expr
1+1   |       expr
1+1   |        expr_plus_expr
...
```


普通は構文を変形して左再帰を除去したりしますが、そういうことが簡単にできない場合もあります。
（単に構文が多すぎるとか、ものすごく深い間接左再帰とか）

そのような場合になんとか左再帰のまま扱いたい、という話です。

# 実装方針
無限再帰が問題なので、どこかで止めればよいはずです。単純に考えると同じパーサが二回呼ばれたら止めれば良さそうですが、そう簡単ではありません。

最初の例で、`expr`の2回目の呼び出しを止めてみます。すると`expr_plus_expr`は受理されずに、`term`が受理されて`+`以降は残ってしまいます。

```
input | parser
1+1   | expr
1+1   |  expr_plus_expr
1+1   |   expr (2回目なので強制fail)
1+1   |  term
+1    | (終了)
```

一方`expr_plus_expr`の2回目を止めることにするとうまくいきます。

```
input | parser
1+1   | expr
1+1   |  expr_plus_expr
1+1   |   expr
1+1   |    expr_plus_expr (2回目なので強制fail)
1+1   |    term
+1    |   char('+')
1     |   expr
1     |    expr_plus_expr
1     |     expr
1     |      expr_plus_expr (2回目なので強制fail)
1     |      term
      | (終了)
```

これは`expr`が`expr_plus_expr`と`term`という複数の選択肢を持っているのに対し、`expr_plus_expr`は先頭が必ず`expr`である、という違いによります。
`expr`は複数の選択肢があるので、複数回呼ばれても無限再帰にならずに受理される可能性がありますが、`expr_plus_expr`は先頭が固定なので（何も受理せずに）2回目通過したら3回目も必ずやって来ます。

というわけで、先頭の選択肢が固定になっているパーサについて2回目の呼び出しを止めれば良さそうです。

# 呼び出しの記録
この記録をどう持つか、というのが次の問題です。単純に、グローバル変数的な領域にパーサ毎のフラグを持つ、というのが考えられますが、これは上手く行きません。

再帰降下パーサではバックトラックが発生します。つまりパーサを呼んでみて、ダメだったら呼ぶ前まで戻って別のパーサでやり直す、ということです。
この呼ぶ前まで戻ってというのが問題で、呼び出しフラグも巻き戻さないといけません。

グローバルなフラグをスタックにして巻き戻せるようにする方法も考えられますが、フラグをパーサへの入力データと共に流してやるのが簡単そうです。
この場合、巻き戻しはパーサ自体が面倒を見てくれる形になります。

例えばnomの拡張ライブラリに[nom_locate](https://github.com/fflorent/nom_locate)があります。これはトークンの位置（行数など）を保持するためのパーサ入力型を提供しますが、オプションで任意の型を付加することができます。

```rust
type Span<'a> = LocatedSpanEx<&'a str, u64>;
```

このように`u64`を付加すれば、64個分のパーサ通過情報を記録することができます。

また、フラグを一度立てた後、どこまで維持するかも考える必要があります。検出したいのは何も受理せずに再帰してしまうケースなので、何か受理する度にクリアすれば良さそうです。

# nom_recursive
ここまでで説明したものをライブラリにしたものが、nom_recursiveです。これはCustom attributeを使って、再帰検知のコードをパーサに挿入します。

最初の例では

```rust
pub fn expr(s: &str) -> IResult<&str, String> {
    alt((expr_plus_expr, term))(s)
}

#[recursive_parser]
pub fn expr_plus_expr(s: &str) -> IResult<&str, String> {
    let (s, x) = expr(s)?;
    let (s, y) = char('+')(s)?;
    let (s, z) = expr(s)?;
    let ret = format!("{}{}{}", x, y, z);
    Ok((s, ret))
}

pub fn term(s: &str) -> IResult<&str, String> {
    let (s, x) = char('1')(s)?;
    Ok((s, x.to_string()))
}
```

という感じで、再帰検知したいパーサに`#[recursive_parser]`を付ければOKです。
VS Code＋Dockerで構築する競技プログラミング環境

# 事前準備

本記事はVS CodeとDockerを使ってC,C++,Pythonの環境を構築します。
以下からVS CodeとDockerをインストールしましょう。

[VS Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)
[Dockerのインストールについてまとめられたページ](https://qiita.com/n-yamanaka/items/ddb18943f5e43ca5ac2e)
※Windowsの方は[Docker Desktop for Windows](https://docs.docker.com/docker-for-windows/install/)のSettings→Shared Drivesから作業対象ディレクトリの共有をオンにしてください。

![SharedDrive.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/61dd16ef-97b2-7e65-290e-f91d59c8ad11.png)

VS CodeとDockerのインストールが完了したら、いよいよ環境を作っていきます。

# VS Codeのアドオンを入手し、言語毎の環境を作る。

作業フォルダに言語毎のフォルダを区切り、環境を作りたいフォルダをVS Codeで開きます。
![Workspace.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/26ea4d23-c830-714e-ea38-cf44c905d292.png)


VS CodeのExtensionsから、**Remote Desktop**をInstallします。
![RemoteDesktop.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/89480879-1545-2dcc-2cdd-2f920940e638.png)
※Remote SSH、Remote Containers、Remote WSLも一緒にインストールされます。

その後、View→Command Palette...を開き、Remote Containers: Add Development Container Configuration Files...を選択します。
![CommanPalette.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/5cc0c6cf-3ee4-aa3e-b084-76d9f6f67097.png)

言語を選択するメニューが出ますので、好きな言語を選択しましょう。画像の例はC++です。
![SelectLanguage.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/a50fc2be-0a86-1451-3d75-c2d6564d08ce.png)

言語選択後、Reopen in Containerが勧められます。指示に従いContainerでReopenしましょう。

# 動作確認

VS Codeが開き直された後Terminalを開くと、ContainerにRemote Accessしている事が分かります。
![Terminal.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/72c36a64-0434-f0ba-69c4-ec3a15ddf7d4.png)

以下の様な簡単なC++のコードを用意して、実行出来るか確認します。

```c++:hello.cpp
#include <iostream>

using namespace std;

int main(){
  cout << "Hello C++ world." << endl;
  return 0;
}
```

実行出来ました。簡単ですね。
![CPPResult.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/e3e0e69f-ed8b-54e4-0ada-ea479f466b9f.png)

同じ環境でCも動きます。

```c:hello.c
#include <stdio.h>

int main(int argc, char *args[])
{
    printf("Hello C world.\n");
    return 0;
}
```

![CResult.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/b02bd42d-59ff-e911-8118-24c1ed201a19.png)

Pythonの環境構築をしたい場合、Remote Containers: Add Development Container Configuration Files...の後の言語選択でPythonを選ぶだけで出来てしまいます。

とても簡単で驚きました。かなりの種類の言語をサポートしているので、今後ますますVS Codeの支持者が増える予感がします。
[VisualStudio For Mac] DBスキーマ更新, add-migration, update-database

普段はWindowsマシーンでVisual Studio Professionalを使っていますが、修理に出していて今週はMacを使っています。　使い慣れてなくて・・効率が悪いのですが、いい機会なので克服しようと思います。

# SQLのスキーマ更新
普段はPackageManagerConsoleから　add-migration [Name], update-database と言う感じに更新しているのですが、パッケージコンソール？はリードオンリーのようで・・色々調べました。

コマンドラインから、プロジェクトのフォルダーに移動、そこから

## マイグレーションの追加
`dotnet ef migrations add [Migration Name]`

## DBの更新
`dotnet ef database update`

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/12fd943b-cd93-bb20-7daf-2c82ef213370.png)


参考ページ
[SQL Server with .NET Core and EntityFramework on Mac](https://www.ciclosoftware.com/2018/03/14/sql-server-with-net-core-and-entityframework-on-mac/)
nginxの接続で「nginx: [emerg] unknown directive "　"」が表示された時の対処法

## はじめに
ngin.xに接続を試みるもエラーとなりました。

```
$ sudo systemctl start nginx.service
Job for nginx.service failed because the control process exited 
with error code. See "systemctl status nginx.service" and "journalctl -xe"
for details.
```
## 対処法
エラーコードの指示を実行。

```
$ systemctl status nginx.service
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 火 2019-09-17 20:53:03 UTC; 25s ago
     Docs: http://nginx.org/en/docs/
  Process: 3438 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=1/FAILURE)

 9月 17 20:53:03 ip-10-0-0-133.ap-northeast-1.compute.internal systemd[1]: Starting nginx - high performance web server...
 9月 17 20:53:03 ip-10-0-0-133.ap-northeast-1.compute.internal nginx[3438]: nginx: [emerg] unknown directive "　" in /etc/nginx/nginx.conf:44
 9月 17 20:53:03 ip-10-0-0-133.ap-northeast-1.compute.internal systemd[1]: nginx.service: control process exited, code=exited status=1
 9月 17 20:53:03 ip-10-0-0-133.ap-northeast-1.compute.internal systemd[1]: Failed to start nginx - high performance web server.
 9月 17 20:53:03 ip-10-0-0-133.ap-northeast-1.compute.internal systemd[1]: Unit nginx.service entered failed state.
 9月 17 20:53:03 ip-10-0-0-133.ap-northeast-1.compute.internal systemd[1]: nginx.service failed.
```
不要な空白`"  "`が入ってしまって、そんな指令知らないと怒られていました。それが`/etc/nginx/nginx.conf:44`にあるとのこと。

```
$ sudo vi /etc/nginx/nginx.conf
  :set number  #４４行目を探すため、行数表示
　不要な空白を削除。おそらく全角の空白があった。
```
最初、行数数えていましたので(笑)、`:set number`は便利ですね。カーソルモード(ESCを押したあとの状態)で入力です。

再度接続すると、無事接続できました。

```
$ sudo systemctl start nginx.service
$ sudo systemctl status nginx.service  #接続状況の確認
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2019-09-17 21:32:13 UTC; 3min 56s ago
     Docs: http://nginx.org/en/docs/
  Process: 3592 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
 Main PID: 3593 (nginx)
   CGroup: /system.slice/nginx.service
           ├─3593 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
           └─3595 nginx: worker process

 9月 17 21:32:13 ip-10-0-0-133.ap-northeast-1.compute.internal systemd[1]: Starting nginx - high performance web server...
 9月 17 21:32:13 ip-10-0-0-133.ap-northeast-1.compute.internal systemd[1]: PID file /var/run/nginx.pid not readable (yet?) after start.
 9月 17 21:32:13 ip-10-0-0-133.ap-northeast-1.compute.internal systemd[1]: Started nginx - high performance web server.
```



## 参考
https://stackoverflow.com/questions/19165976/nginx-emerg-unknown-directive-in-etc-nginx-sites-enabled-example-com3

https://qiita.com/spyder1211/items/c5dd49a3a799bd146599
【初心者向け】マジックナンバーは定数にしよう

#マジックナンバーって？
プログラムの中に突然現れる数字のこと。
以下の関数を例に説明します。

```php

// 税抜価格から消費税分の金額を割り出す
function calculate_tax($price) {
  return $price * 0.08;
}
```
この「0.08」ってなんの数字でしょう？

…バカにするなって怒られるかもしれません。
そうです。消費税の税率です(2019年9月現在)。

しかしこの「0.08」は、関数に直接書くべきではない数字なのです。

#どうしていけないの？
可読性（読みやすさ）や保守性（維持管理のしやすさ）が低下するためです。

###可読性が低下する
数字だけ見てもその意図が全くわからないのです。
上記の関数だと、「0.08」だけを見ても関数名や実際の処理を見ないとなんのこっちゃ？って感じですよね。

###保守性が低下する
2019年10月1日から消費税が10%に引き上げられます~~うんざりしますね~~。
もし関数が上記の例だけなら「0.08」から「0.1」に書き換えれば済む話です。
ですがもし他にもこんな関数があったらどうでしょう。

```php

// 税抜価格から税込価格を計算する
function include_tax($price) {
  return $price * (1 + 0.08);
} 
```

税率が変わった場合、2つの関数を書き換える必要が出てきます。

そしてもし、関数calculate_taxの税率だけ書き換えるのを忘れてしまったら…？
100円の税込価格は108円のままなのに、100円の消費税分を計算すると10円になっちゃいます…。

#じゃあどうすれば？
税率を定数にしちゃいましょう。

```php

// 消費税率0.08を定数tax_rateとして定義
define("tax_rate", 0.08);

function calculate_tax($price) {
  return $price * tax_rate;
}

function include_tax($price) {
  return $price * (1 + tax_rate);
} 
```

マジックナンバーを定数にすることはメリットだらけです。
まず可読性の面では、今回の場合だと税率＝tax_rateとなるので意味が明確になります。
さらに保守性の面では、税率が変更されても定数の値を書き換えるだけで済みます。

#さいごに
Qiita初投稿です。
マジックナンバーについて触れている記事が意外と少ないようなので投稿してみました。
拙文ですが、お役に立てれば幸いです。
React Native で、AndroidのBackボタンの動作を制御する

React Nativeで、AndroidのBackボタンで前画面に戻るのを止めたり、確認画面を表示したりする場合にどうすれば最も美しいのかが、人によって言ってることがばらばらだったのでメモ。

環境はReact Native 0.60＋Expo＋React Navigationでテストしていますが、React Native自体の機能なのでほかの環境でも動作するはず。

# BackHandlerを使うべし

　[BackHandler](https://facebook.github.io/react-native/docs/backhandler)は、React Native本体の機能で、AndroidやtvOSのバックボタン＝戻るボタンのイベントを処理できるようにするイベントハンドラー。

　取り扱いが簡単で、React Navigationなどもこのハンドラーの動作に準拠して動作してくれるので、安心して使えます。

# 使い方

　Backボタンを制御したいコンポーネントコード（関数ではなくクラス化しておくこと）に、以下の順にコードを入れる。

１．BackHandlerをインポート

```jsx
import { BackHandler } from "react-native";
```

２．処理を担当するメソッドを追加

```jsx
  handleBackButton() {
    alert("Hardware back button pressed.")
    return true;    // true: prevent the back action.
  }
```

ここで``true``を明確に戻していますが、これにより前画面に戻るなど、後に続く処理を抑制しています。``false``を戻すと（または何も戻さないと）続く動作を邪魔しません。

３．componentWillMount()にて、上のメソッドを呼ぶイベントリスナーを登録。

```jsx
  componentWillMount() {
    alert("will mount");
    this.backHandler = BackHandler.addEventListener("hardwareBackPress", this.handleBackButton);
  }
```

４．componentWillUnmount()にて、コンポーネントがなくなるときにイベントリスナーを解除

```jsx
  componentWillUnmount(){
    alert("will unmount");
    this.backHandler.remove();
  }
```

# おまけ

``BackHandler.exitApp()``でアプリを中断できます。
安全にgitのorphan branchを作る


## tl; dr
新しくディレクトリを作って、そこに適当なファイルを置いて `git init` すると、新しいrepositoryができる。
そこでmasterに一度commitしたあとに、 `git branch -m` で実際に作りたいブランチ名に変更してからremoteを足してpushすると安全にorphan branchが作れる。

## 手順

```
mkdir SOME_DIR
cd SOME_DIR
# 適当に必要なファイルを配置・作成
git init
git add *
git commit -m 'initial'
git branch -m BRANCH_NAME
git remote add origin git@github.com:HOGE/MOKE.git
git push origin BRANCH_NAME
```

これで安心。