OmniAICreator/Qiita-1.07M huggingface dataset:
Automation Anywhere Enterprise Client 日本語版で動作が遅いときは

# 概要
Automation Anywhere Enterprise Client 日本語版を使っていると、たまに動作が非常に遅くなる時があります。そのような場合に、Clientをさくさく動かすための手順がわかったのでメモしておきます。

**環境**

* Automation Anywhere Enterprise Client 11.3.2

# Linguify.exeを終了させよう
Automation Anywhere Enterprise Clientは、Linguifyというテクノロジーを使って、英語のソフトウェアをランタイムで外部からフックして言語表示を変更しているようです。ただし、なぜかこのLinguifyが悪さをして、動作が遅くなってしまう場合があるようなので、その場合はタスクマネージャーで`Linguify.exe`を探して終了させてみましょう。動作が格段に速くなるはずです。

![kill-linguify.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/80e6d1db-6cd1-81f5-9529-5f2ecf8d85f1.png)

ただし、副作用としては、UIが英語になります。(再描画されるUI要素からどんどん英語表示になっていきます)

# 日本語表示を復活させるには
日本語表示に戻したい場合は、`C:\Program Files (x86)\Automation Anywhere\Enterprise\Client\Linguify\Apps`を開いて、`Linguify.exe`をダブルクリックして開始させてください。


# (おまけ) UI言語を変更するには

Automation Anywhere Enterprise Clientでは、表示言語を恒久的に他の言語に変更もできるようです。

* **英語以外の言語への変更:** `Linguify.exe`をタスクマネージャで終了した後、`C:\Program Files (x86)\Automation Anywhere\Enterprise\Client\Linguify\Apps`にある`LinguifyInitiator.exe`を言語引数付きで実行します。例:
    * 韓国語: `LinguifyInitiator.exe ko-KR`
    * フランス語: `LinguifyInitiator.exe fr-FR`
* **英語への変更:** `Linguify.exe`を**終了させないで**、`LinguifyInitiator.exe en-US`を実行します。
Docker For Macが遅い

![prefs-reset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489182/89affaaf-b706-828f-dd0c-6d8abf7b4f47.png)

「クソみたいに遅いじゃん。」自分の経験ではないですが、今後の為に資料を調査して理由・対応方法を咲くってみました。

## 遅い理由
結論としては「Docker For Mac」がosxfsを採用している。あ！！それよりosxfsがOSXのFSEvents APIとLinux’s inotify APIをマッピングさせているのが原因です。

参考：https://forums.docker.com/t/file-access-in-mounted-volumes-extremely-slow-cpu-bound/8076/158

- osxfsの throughput は250 MB/s
  -> これはほとんどのAPPで問題にならないはず
- コンテナ内からosxfsに対するファイルIOのシステムコールはlatencyが遅い。書き込み時で200μs
  -> 通常のファイルシステムであれば under 10μs（クソやられた感じ）

## 対応方法
じゃ、簡単！！「Docker For Mac」を使えなければ良い。( ﾟДﾟ)ｳﾞｫｹ!!

### VirtualBoxを利用
docker-machineでVirtualBox上に立ち上げたdocker環境で開発環境を構築する。うん、面倒だ〜〜〜(;^ω^)

### Docker For Macを使わない
CE 17.12 (edge) チャンネルを使うこと。(･д･)ﾁｯ

参考：https://blog.hanhans.net/2017/05/10/docker-user-guided-caching/

### コンテイナ間を爆速で同期する
例としてはdocker-syncをおすすめします。rsyncで設定が簡単かな。

### [対策の実験](https://qiita.com/FattyRabbit/items/bfb5a9a321718b7f2756)

> 興味がある方はこちらへ
> [Laravel + Docker + 開発環境](https://fatty-rabbit.hatenablog.com/entry/2020/01/30/000000)
> [Docker For Macが遅い：対策 - Mutagen編](https://fatty-rabbit.hatenablog.com/entry/2021/04/21/194920)
Redisのpipelineとmultiの違い

RedisのPipelineとMulti/Execは、名前の雰囲気が似ているし機能も似ているが、中身は全然違う。

Pipelineはただの複数実行で、Multi/Execはトランザクション内での実行になるという違いがある。

### PipelineとMulti/Execの違い

#### Pipeline

複数のコマンドを結果を待たずに送信する。その結果、ネットワークに由来する待ち時間を減らす効果がある。複数のクライアントが接続している状況では、タイミングによってはPipelineで指定された複数コマンドの間に他のコマンドが入ってしまう可能性がある。

クライアントライブラリが実装している機能であり、Redis本体にこの機能があるわけではない。

```ruby:Pipelineの例（Ruby）
redis.pipelined do
  redis.set(key, value)

  # ここに他のコマンドが入る可能性がある

  redis.set(key, value)
end
```

#### Multi

複数のコマンドを1つのトランザクション内で実行する。複数のクライアントが接続している状況であっても、Multiで指定された複数のコマンドの間に他のコマンドが入り込むことはない。

Multiは開始、Execは実行を意味する。Redis本体に実装された機能。

```ruby:Multi/Execの例（Ruby）
redis.multi do
  redis.set(key, value)

  # ここに他のコマンドが入る可能性はない

  redis.set(key, value)
end
```

### 参考リンク

[redis-rb](https://github.com/redis/redis-rb)
[Redis - Transactions](https://redis.io/topics/transactions)
【Rails】個人的に思いついた二重サブミット対策【意見も募集】

##二重サブミットをどうにか防止したかった。
具体的には下記のようなケースで防止したかったです。
- ブラウザバックか戻るボタンで戻って、再度保存
- 完了ページでブラウザリロード

参考:[さいきょうの二重サブミット対策](https://qiita.com/syobochim/items/120109315f671918f28d#-3-prg%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

###contorllerの処理
```inquiries_controller.rb
  def new
    @inquiry = Inquiry.new
  end

  def confirm
    @inquiry = Inquiry.new(inquiry_params)
    render :new unless @inquiry.valid?
  end

  def done
    @inquiry = Inquiry.new(inquiry_params)

    if params[:back].present?
      render :new
      return
    end

    if @inquiry.save
      #メールを送付
      InquiryMailer.send_inquiry_to_user(@inquiry).deliver
    else
      render :new
    end

  end

```
入力画面▶️確認画面▶️完了画面の順に移り変わります。

確認画面と完了画面に関してはPostで表示させています。
完了画面にリダイレクトさせるPRGパターンもあるようですが、今回は採用していません。


##個人的に思いついた二重サブミット対策

完了画面のPost処理の最後にセッションのauthenticity_tokenのパラメータを削除する。

```
session[:_csrf_token] = nil
```
RailsはデフォルトでCSRF対策をしてくれます。

```
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
end
```

上記によってファームを生成する際にauthenticity_tokenがフォームとセッションに発行され、その二つが合っているかを判断します。

よってPostの最後にセッション側のトークンを削除することで、以降フォームとセッションのトークン情報が合致しなくなるためリロードやブラウザバックをしてもInvalidAuthenticityTokenとしてエラーになります。これで二重サブミットの対策になるんじゃないかと。（InvalidAuthenticityTokenの場合のエラーページを表示させるようにすればユーザーも戸惑わないはず）

セッションのトークンを削除することによるCSRF対策の影響も恐らくないのではと。

参考：[RailsでのCSRFtoken発行/検証のロジック](https://qiita.com/watanabe0621/items/a125b85bba10ca693cd5)

##最後に

まだまだRailsに関しては初心者で、他の方法が思いつかなかったので他の人は普段どうやって実装しているのか知りたいです!!!!!!

ぜひ教えてください!!!!!!!!!!!!
/.ssh/config gitlab


gitlabにsshのpublic keyの設定したあと，cloneしようとすると以下のようなエラーがでた

```
git@gitlab.com: Permission denied (publickey).
fatal: Could not read from remote repository.

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

私の場合([/.ssh/configにHost githubと書くのは間違い](https://kimiyuki.net/blog/2018/06/09/github-ssh-permission-denied/))で指摘されているように，ssh configの書き方が良くなかったようです．

`~/.ssh/config`を以下のように書き直すことで解決した

```
Host gitlab.com
    User git 
    IdentityFile ~/.ssh/id_rsa <-  your key path
    TCPKeepAlive yes
    IdentitiesOnly yes
```

おわり

--- 

おまけ

SSH Key作成コマンド
```
ssh-keygen -t rsa -C "hoge@example.com"
```

接続テスト
```
ssh -T git@gitlab.com  -i ~/.ssh/id_rsa
```
WindowsのDockerではDBが使えないよ！

Docker for Windows はいくつかの問題を抱えている。
表題のDBが使えないよというのは、Docker for windowsのvolumes、マウントの問題。

どうしてもDockerしたいなら、LinuxのVMを立てるか、一部Docker+Docker以外運用にするか。


# volumeしたディレクトリはオーナーがrootになりchownが効かない  

MongoDBやSubversionなど、永続化（volume/マウント）するべきデータディレクトリのオーナーがrootだと起動できないアプリケーションは多い。
しかしDocker for windowsでは、volumeしたディレクトリはなぜかroot所有になり、chownも効かない。

Dockerを終了したときにデータも消える、という運用しかできない。

参考： <https://github.com/moby/moby/issues/35665>


# 共有しているディレクトリをvolumeすると、データは永続するがなぜか見えない

見出しの通り、Dockerとしては問題なく永続使用できるが、エクスプローラから見えなくなる。

原因不明..


# Windowsを再起動するとvolumeが効かないことがある

こちらも原因不明。データは残っているしアプリケーションは動くが、マウント出来ていないことがたまにある。
しかしdocker restartコマンドを実行すると解決する。
静的サイトジェネレータReact-Staticを使ってみる

#はじめに


プログラミング歴2ヶ月の素人が書いています。（間違っていたらご指摘ください）

「React-Staticをはじめて使ってみる」ための学習メモです。

* React-Staticプロジェクトの生成

* Netlifyへのデプロイ

上記２点についてまとめます。

👇React-Static公式👇
https://github.com/react-static/react-static


#今回の目的

静的サイトジェネレータReact-Staticを初めて使います。

簡単に爆速表示のブログサイトを自動生成して、Netlifyにデプロイします。


#Node.jsのインストール

ReactはNode.jsを必要としますので、インストールします。
https://nodejs.org/ja/


#yarnのインストール

https://yarnpkg.com/lang/ja/

パッケージマネジャーとしては、Node.jsに付いてくる標準のnpmもありますが、私の環境と実力ではうまくビルドができませんでした。

npmからyarnに変えたところうまくいったので、ここはyarnを使うのがいいと思います。

#React-Staticのインストール

```
$ yarn global add react-static
```

グローバルにReact-Staticをインストールします。


#React-Staticプロジェクトの作成


```
$ cd プロジェクトのディレクトリ
$ react-static create
```

プロジェクト名と、テンプレート名を聞かれます。
テーンプレートは、『Basic』を選択しました。


#ローカルホストで確認

`localhost:3000`から作成したプロジェクトにアクセスできます。


#本番環境のビルド

```
$ yarn build
```

本番用のファイルとして、distファイルが生成されます。


#githubにプッシュ

まずはgithubにプッシュして、そのリポジトリをNetlifと連携することでデプロイします。

`dist`だけでなく、プロジェクト全体をプッシュします。


#Netlifyにデプロイ

https://www.netlify.com/

SignUpを済ませます。

今回はgithubと連携させてデプロイします。

![Screen Shot 2019-08-29 at 16.25.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452235/9bfd9ac7-95ad-7aca-c723-0287d161688a.png)


連携の際、

* 『Build Command』 => `yarn build`

* 『Publish Directory』 => `dist`

を入力します。

これによって、今後githubに変更がプッシュされるたびに、Netlifyが自動で`yarn build`を実行し、生成される`dist`ファイルをデプロイしてくれます。

私たちはgithubにプッシュするだけでいいので、手間が省けます。



#まとめ

* React-Staticプロジェクトの生成

* Netlifyへのデプロイ

上記２点についてまとめました。
Splunkでデータの取り込みを最適化してみる

#Splunkでのデータ取り込みを最適化してみる

## Overview
Splunk自体は、データをとりあえずForwarderから入れれば自動でsourcetypeを判別して、適切なFormatを
選択してくれる。便利なので、それを使えばいいのだけれど、実はいくつかTipsがあって、それを設定することで、データ取り込みのPerformanceを最適化できるのだ。

## How to
configを直接編集してもいいのだけれど、typoも多し、面倒なので今回はHeavy Forwarderを使ってconfigを作ってみる。
ちなみに***下記の設定を入れるいれないで数倍取り込みperformanceが変わると言われている***ので、いれたほうがいい。

編集するところは

- Timestamp
- Timeprefix
- LOOKAHEAD
- TZ
- SHOUDLINE MERGE

## Timestamp
#### Splunkにログインして、データを取り込んで見る(Setting → Add Data)
<img width="610" alt="Screen Shot 2019-08-29 at 5.14.16 PM.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/64b5e82c-6fd2-08cd-fd6e-cc5e2fd0338f.jpeg">

####Apacheのデータをとりあえずいれてみる
取りこんだ段階では、splunkが自動でapacheのformatと介錯して、sourcetype:access_combined_wcookiesを選択してる。

<img width="1918" alt="Screen Shot 2019-08-29 at 5.15.48 PM.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/f0523d89-25f3-f3dd-f18e-5068447c167e.jpeg">

### Timestampを編集

#### Timezoneを編集
ログの表してるtimezoneを選択する

<img width="436" alt="Screen Shot 2019-08-29 at 5.18.31 PM.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/2697181b-773c-125a-7f0e-1df7d09b0811.jpeg">

#### Timestamp formatを選択する
ログのtimestampのformatを編集する。ドキュメントは下記を参照。

https://docs.splunk.com/Documentation/Splunk/7.3.1/Data/Configuretimestamprecognition

今回は

13/Aug/2019:18:22:16

というformatなので

%d/%b/%Y:%H:%M:%S

として、Timestamp formatの箇所に書く

<img width="386" alt="Screen Shot 2019-08-29 at 5.22.32 PM.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/a8ff946d-b25c-8264-1a8a-0d30e4e586ee.jpeg">

#### Timestamp prefixを編集
timestampが何で始まるかをregexで書いてあげる。今回は[ではじまるので

<img width="378" alt="Screen Shot 2019-08-29 at 5.20.50 PM.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/e46e64d2-666e-0a45-0214-d01d8b56d1a2.jpeg">

とする。

#### LOOKAHEADを編集
LOOKAHEADはtimestampの文字数をカウントするもの。今回は20文字なので

<img width="377" alt="Screen Shot 2019-08-29 at 5.24.58 PM.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/6c1be002-3502-93df-9661-5912e87ca262.jpeg">

###SHOULDLINE MERGE
イベントをどうまとめるかを定義するもの。基本はfalseでいいけど、xmlとか、exceptionのログとかだとtrueにする必要があるものが多いので、その都度。

<img width="405" alt="Screen Shot 2019-08-29 at 5.26.17 PM.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/a05bbc5c-a2b1-96a3-354a-846b7b39fee6.jpeg">

これで保存すれば、OK。

###補足
ちなみに、編集したファイルは、props.confとして保存される。

```ruby:qiita.rb
#cat /Applications/splunk731/splunk/etc/apps/search/local/props.conf
[access_combined_wcookie_custom]
BREAK_ONLY_BEFORE_DATE =
DATETIME_CONFIG =
LINE_BREAKER = ([\r\n]+)
MAX_TIMESTAMP_LOOKAHEAD = 20
NO_BINARY_CHECK = true
REPORT-access = access-extractions
SHOULD_LINEMERGE = false
TIME_FORMAT = %d/%b/%Y:%H:%M:%S
TIME_PREFIX = \[
TZ = Asia/Tokyo
disabled = false
pulldown_type = true
Windows10でNTP

# Windows10をNTPサーバにする

[【備忘録】Windows を NTP Server として使う](https://qiita.com/HLDC-FJ/items/b3346f5721d6b2e9e6b6)


# Widows10でNTP同期

タスクバーに`timedate.cpl`と入力して実行

![2019-08-29_17h21_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488658/3e5b7fb7-0c3f-d4bf-5ae1-816ed9518714.png)

NTPとは書かれていないがこれで同期できる。
【C#】リトライ共通関数を用意した時のメモ

特定のクラス内の関数をリトライする必要があった際に
作ったのでメモ。

```C#:共通関数部
/// <summary>
/// リトライ共通処理
/// </summary>
/// <param name="caller">処理を実行するインスタンス</param>
/// <param name="funcName">リトライ対象関数名</param>
/// <param name="parameters">引数群</param>
/// <param name="successResult">対象関数の成功時の戻り値</param>
/// <returns></returns>
private T invokeRetry<T>(object caller, string funcName, object[] parameters, T successResult)
{
	// リトライ最大回数(引数で指定してもいいかも)
	int retryMax = 3;
	// 戻り値を初期化しておく
	T result = default( T );
	var method = typeof( BaseClass ).GetMethod( funcName );
	for(int retryCount = 0; retryCount <= retryMax ; retryCount++)
	{
		result = (T)method.Invoke( caller, parameters );
		// 処理に成功していれば抜ける
		if(successResult.Equals( result ))
		{
			break;
		}
		// リトライ間隔を適当にあけておく
		Thread.Sleep( 500 );
	}
	return result;
} 
```

BaseClassが特定クラスの共通の基底クラスとなります。
実際はリトライ回数をモジュールのコンフィグから読み込んでいましたが
たぶん引数で与えてやるか、共通処理を実装するクラスの初期化時にでも渡してあげれば良い気がしてます。

使用する場合は以下のような感じ。

```C#:実行部
BaseClass comm = new DerivedClass();
bool result = invokeRetry( comm, "MethodHoge", new object[] { arg1, arg2}, true );
```

実際のコードでは実行する為の派生クラスのインスタンスも
別メソッドで取得したりするので色々とやっていますが省略。
＃省略したせいでおかしな点があるかもしれませんが…
djangogirlチュートリアル　個人的に詰まったところとその対処法

どうも未来電子でインターンをしているものです。
今回はdjangogirlチュートリアルで詰まったところとその対処法を備忘録としてまとめたいと思います。
プログラミング初心者ですので間違っているかもしれません。
お手柔らかにお願いします。

#目次
・dockerでpythonanywhereが使用できない
・ローカル環境通りに本番環境で表示されない


#dockerでpythonanywhereが使用できない
チュートリアルはdokcerを使っていませんが、せっかくと思ってdockerを使用してやることにしました。
しかし以降時にエラーが起こりわけわからなくなりました。
まだ対処方がわからないため、後に挑戦します。





#ローカル環境通りに本番環境で表示されない
ローカル環境でいくつかサンプルとしてブログを投稿し、きちんと表示されていました。
しかし本番環境(ここではpythonanywhere）ではヘッダーだけ表示され、サンプルは表示されていませんでした。


調べてみると本番環境ではローカル環境と同じモデルとユーザーが適用されているが、内容までは共有されていないことがわかりました。
そのためブログ投稿数が０で、何も表示されていなかったのです。

実際に本番環境でサンプルを投稿するときちんと表示されました。

#参考
https://tutorial.djangogirls.org/ja/
Db2 on CloudへのJDBC接続でたまに接続エラーになるケースへの対応

当記事は旧バージョンのDb2 on Cloudを対象としています。現在のDb2 on Cloudについては
https://qiita.com/teruq/items/52a29460441b675bc147
を参照ください。

# 事象

Db2 on Cloud（に本来は限った話でないのですが）を使っていると、たまに次のようなエラーが出る場合があります。

```
J2CA0056I: 接続マネージャーは、リソース jdbc/xxxxxxxx のリソース・アダプターから致命的接続エラーを受け取りました。  例外: com.ibm.db2.jcc.am.ClientRerouteException: [jcc][t4][2027][11212][4.24.92] 接続は失敗しましたが、再確立されました。 必要な場合は、特殊レジスター設定がやり直されました。 接続のホスト名または IP アドレス: xxx.xxx.xxx.xxx。 接続のサービス名またはポート番号: 50,001。
理由コード: 1。 障害コード: 2、エラー・コード: ゼロ・バイトがサーバーから読み取られました。。 ERRORCODE=-4498, SQLSTATE=08506
```

これは、アプリケーションとDb2の間で通信が切断された後にはじめてデータベースへの接続を試みると発生するものです。2回目以降は正常に戻ります。

# 原因

これは大昔からのあるあるで、コネクションプール使用時にDBとの接続が切れると次の接続でエラーになるというものです。その場合、アプリケーションでは例外をキャッチして再接続するようなコーディングをすべきとされています。まず見たことないですが。

これ自体は普通の話なのですが、Db2 on Cloudを使っているとこの事象がかなり頻繁に発生します。しかしチケットで問い合わせてもまず問題はないと返ってきます。ネットワークを怪しんでも、瞬断程度のエラーは普通に発生するぜと言われてしまいます。

しかし最近わかったのですが、Db2 on Cloudは比較的無邪気に？TKOやHADRをしているようです。そしてそれは我々ユーザーには通知されません。このせいで通信が切れているケースがままあるように見えます。

# 対応

Db2の接続プロパティに次の設定を追加します。

```
<properties.db2.jcc ～ enableSeamlessFailover="1"/>
```

これを付与すると、DB接続時にエラーになると自動的に再接続してくれます。トランザクションの途中でエラーになるとさすがに駄目ですが、多くのケースで接続エラーが軽減されると思われます。必須プロパティですね。
【初心者】pythonで０から Project Euler を解いてみた22

今回はEuler22問目で―す。
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2022
「名前のスコア」
まず。問題を見たときに解ける気がしなった。
でも初心者にとってこんなもの無理やろ！！と思ったけど分解して考えて一つずつ進めていったら出来たのでくじけず頑張りましょう！！
#コード
```python
names_deta = open('names.txt')
names = sorted(names_deta.read().replace('"','').split(','),key=str)
alp_num = {"A":1,"B":2,"C":3,"D":4,"E":5,"F":6,"G":7,"H":8,"I":9,"J":10,"K":11,"L":12,"M":13,"N":14,"O":15,"P":16,"Q":17,"R":18,"S":19,"T":20,"U":21,"V":22,"W":23,"X":24,"Y":25,"Z":26}
for i in range(len(names)):
    names[i] = list(names[i])
scoer = 0
for cha_No in range(len(names)):
    for cha_sc in range(len(names[cha_No])):
        tenp = 0
        tenp += alp_num[names[cha_No][cha_sc]]
        scoer += tenp * (cha_No + 1)
print(scoer)
```
まず一行でtxtを読み込み二行目で("")を取り除き、(,)で一つ一つをリストの要素にします次にalp_numでアルファベットに数値を関連付けておきます。
次のfor文で二次元配列にします
次は二重ループを使い何番目なのか、そして名前のtenpはいくつになるのかを計算して頂きます
それによって出たtenpをscoerに足していき最後に出力させて完成です

こんな感じにやってみると案外解けましたね
皆様もぜひ！ｗ
AI活用例(2019年版)


# 1.はじめに

AIという言葉だけが流行していて実際にはどんなものに使われているのか？という疑問を持ったので、AIが実際にどんな場面で利用されているのか、『[AI白書 2019](https://www.amazon.co.jp/dp/4049110148/)』を参考に実際のAI活用例を調べてみました。


# 2.日本国内のAI活用例

以下AIの活用事例を表にまとめました。
実証実験のものだったり、部分的な導入だったりするものもあります。


| No | 業界 | 事例 | 備考 |
|---|---|---|---|
| 1 | 製造業 | ・外観検査・検品<br> ・作業員のミス防止<br> ・異常検知<br> ・メンテナンス業務の効率化<br> ・予兆保全、外観検査<br> ・故障予兆診断、予防保全<br> |  |
| 2 | 自動車産業 | ・自動運転<br> | 限定条件下での自動運転が2025年を目処に市場化を行う目標がある |
| 3 | インフラ | ・異常検知<br> ・保守運用高度化<br> | 道路、鉄道、ダム、エネルギー、水道など様々なインフラに対して施行されている。 | 
| 4 | 農業 | ・病害予測<br> ・最適収量予測<br> ・生育情報管理<br> ・計画農業<br> ・自動選別<br> | ロボットとの組み合わせやIoTとの組み合わせも含め、第四次産業革命と言われている |
| 5 | 健康・医療・介護 | ・画像による診断支援および診察支援<br> ・創薬<br> ・在宅療養患者の支援<br> ・生活習慣病の予防<br> |  |
| 6 | 防犯・防災 | ・監視カメラを用いた犯罪検知<br> ・多言語による自動問い合わせシステム<br> |  |
| 7 | エネルギー | ・電力需要予測<br>・運用効率化<br> | 設備保守運用の効率化も進められている |
| 8 | 教育 | ・適応学習(個々の学習状況から理解度を予測し最適な問題を提示)<br>・採点<br>・英語対話型トレーニング<br> |  |
| 9 | 金融 | ・不正検知<br>・投資運用<br>・審査<br>・チャットボットによる問い合わせ対応<br> |  |
| 10 | 流通 | ・店舗カメラによるマーケティング<br>・就活スーツのリコメンド<br>・コールセンター対応の自動化<br>・コンビニ運営の自動化<br>・商品の詳細情報提供<br>・在庫最適化<br>・レジの自動化<br> |  |

# 3.まとめ

日本国内のAI活用事例を表にまとめました。

基本的にどの業界でもやっていることは、以下の何かしらのデータを用いて分析し、最適解を導き出しています。
・画像解析
・ログデータ
・センサーデータ
・クローリング結果
・業界ごとの専門知識
　etc..


各業界について詳細に書いていると、とっても長くなり終わらなくなりそうだったので、簡易的にまとめています。
詳細が知りたい方はぜひ『[AI白書 2019](https://www.amazon.co.jp/dp/4049110148/)』を読んでみてください。
本書にはAIの技術動向や法整備等々、AIの未来とそれに向けた課題がたくさん書かれていてとても充実した内容でした。
実際にこの本を読みながら、まだまだ知らないことだらけだなと感じたと同時に、AIがもっと世の中を変えていくではないかと感じました。
まだまだキャッチアップして最先端の開発に追いつけるようにしていきます。
Flutter i18nプラグインの使い方

# はじめに
Flutterの公式で紹介されている[Internation­alizing](https://flutter.dev/docs/development/accessibility-and-localization/internationalization)を使うと、言語ファイルの更新がだる過ぎて無理だったので、
Flutter i18nプラグインで多言語化を楽にした備忘。

# 環境
* Flutter 1.7.8+hotfix.4 
* Dart 2.4.0
* Android studio 3.5

# 前準備
Flutter i18nプラグインをインストール済
（プラグインインストールするだけだから割愛）

# Flutter i18nプラグイン
## やってくれること
* arbファイルからInternation­alizing用のファイルを自動生成してくれる<br>
ファイル自体は「generated/i18n.dart」にできる

## 自分でやらないといけないこと
* arbファイルの中身を記述する

## 注意事項
* プラグイン入れると、res/values/strings_en.arbっていうのができるけど、これは消してはいけない
* 自動生成ファイルはstrings_en.arbに定義されているキーのモノしか生成されない
* プラグインのページに書いてある通りに、

```dart
return new MaterialApp(
  localizationsDelegates: [S.delegate],
  supportedLocales: S.delegate.supportedLocales,
  title: 'Flutter Demo',
  theme: new ThemeData(
    primarySwatch: Colors.blue,
  ),
  home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
```

ってやると、ScaffoldのAppbar周りがエラー吐きまくる。
(MaterialLocalizations使ってるけど、en以外はデフォルトで見てないからエラーになる)
以下みたいに書かないといけない。

```dart

import 'package:your_app_name/generated/i18n.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

// ・・・ 

return new MaterialApp(
  localizationsDelegates: [
    S.delegate,
    GlobalMaterialLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
  ],
  supportedLocales: S.delegate.supportedLocales,
  title: 'Flutter Demo',
  theme: new ThemeData(
    primarySwatch: Colors.blue,
  ),
  home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
```

クパチーノ使わない場合でも、GlobalCupertinoLocalizationsしないといけない。
テキストフィールドの長押しでアプリがクラッシュする。

[TextFieldの長押しでクラッシュする問題の対応方法](https://qiita.com/ko2ic/items/7bc67494cf8d03f4f4e0)


## 使い方
### 言語の足し方

${project_root}/res/valuesを選択した状態で、
[File] - [New] - [Arb File]

こんなダイアログが出てくるので言語を選ぶ。方言は任意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56851/e4ce5bd7-a140-7c6e-1d0b-585e456c3956.png)

### 作ったarbファイルに設定を追加していく

```json:strings_en.arb
{
  "_comment": "アプリ名",
  "appName": "my app name",

  "_comment": "コメント適当に入れながら書いてく",

}
```

```json:strings_ja.arb
{
  "_comment": "アプリ名",
  "appName": "アプリ名適当に入れて",

  "_comment": "コメント適当に入れながら書いてく",

}
```

ファイルを変更したタイミングで自動生成される
ちなみに自動生成ファイルを自分で編集しようとしても、自動生成された状態に戻る

この定義自体はnestしたObjectで定義できないので、コメント書きながらやるのが良さげ。
同じキーのものは一番最後のものだけが自動生成されて追加されるので、好きなだけ追加は可能。
（ただ、ideが視覚的にうるさいという難点が・・・）

### 使い方

```dart

import 'package:your_app_name/generated/i18n.dart';

// ・・・ 

@override
Widget build(BuildContext context) {
  var name = S.of(context).appName;
}

```

locationはplatformレベルの言語設定に依存するしかないっぽい？
アプリレベルで書き換えれるならやり方一応知っときたいという思いがあるので、どなたか教えてください。

# 終わりに
Mapで定義してgetter生やすか、コマンド何回も自分で叩かないといけないのかと思ってつらそう。。って思ってたけど、
このプラグインがあればストレスなく多言語化できます。

enが必須になっちゃいますが、多言語化はおいおいって場合は、日本語で突っ込んどけばいいと思います。
（今自分の作ってるものはそうなってる）
MongoDBを立てよう～ユーザ認証とBackup/Restore～（Windows）

MongoDB 4.0.9
Windows10

ネットワーク上の複数の端末から複数のDBを安全に使えるように、管理者、あるいは指定のアプリケーション以外からDBにアクセスできないようにしたい。

MongoDBサーバーをセットアップしたあと、ユーザ認証で使えるようにする設定と、ついでにバックアップ/リストアのハナシ

## インストール

公式から`MongoDB`をダウンロードしてインストール。
win版のver4からは、すべてデフォルトでインストールすると自動的にwindowsサービスにインストールされるはずなので、windowsのサービスを確認する。

![2019-08-29_15h49_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488658/35c796fc-a647-a057-0cce-01a9ad4b5607.png)

MongoDBのプロパティを見ると、実行ファイルのパスは

```
"C:\Program Files\MongoDB\Server\4.0\bin\mongod.exe" --config "C:\Program Files\MongoDB\Server\4.0\bin\mongod.cfg" --service
```

となっているはず。この`mongod.cfg`が設定ファイルとなる。あとでいじる。

## ユーザの作成

デフォルトの設定では、mongoは認証なしで使えることになっている。
まずはMongoDBを利用する各アプリケーション用に、そのDBしか使えないユーザをそれぞれ作る。
さらに、ユーザを作れるユーザ管理用ユーザを作っておく。

以下のコマンドをMongoDBサーバが動いている端末で実行。

DBがないのにいきなり`use hoge`しても問題なし。

```bash
mongo

use hoge
db.createUser(
    {
        user: "userForHoge",
        pwd: "PASSWORD",
        roles:
        [
            {
                role: "readWrite",
                db: "hoge"
            }
        ]
    }
)

use fuga
db.createUser(
    {
        user: "userForFuga",
        pwd: "PASSWORD",
        roles:
        [
            {
                role: "readWrite",
                db: "fuga"
            }
        ]
    }
)

use admin
db.createUser(
    {
        user: "userAdmin",
        pwd: "PASSWORD",
        roles:
        [
            {
                role: "userAdminAnyDatabase",
                db: "admin"
            }
        ]
    }
)
```

この後ユーザ認証を付けるので、これから先新しいDBを使いたいときは、まずuserAdminでログインしてユーザを作ってから、そのユーザでログインする必要がある。

## 設定 mongod.cfg

MongoDBサーバサービスが起動時に読み込む設定ファイル`C:\Program Files\MongoDB\Server\4.0\bin\mongod.cfg`を以下のように編集してMongoDBサーバサービスを再起動する。

変更は以下の通り

* dbとlogの場所を使いやすい場所に（指定したpahtは既に存在する必要がある）
* bindIp: 0.0.0.0 → すべてのIPアドレスから接続を許可
* authorization: enabled → ユーザ認証を有効に
※コメントは消してあります

```conf:mongod.cfg
storage:
  dbPath: C:\path\to\db\
  journal:
    enabled: true

systemLog:
  destination: file
  path:  C:\path\to\mongo.log

net:
  port: 27017
  bindIp: 0.0.0.0

security:
    authorization: enabled
```

## ログイン

ここまで完了したら、ネットワーク越しにmongoコマンドかCompassか、アプリかで確認しよう。
ユーザ認証しないと読み書きできないハズ。

DB：hogeの場合URLとしては

```bash
mongodb://userForHoge:PASSWORD@ホスト名:27017/hoge
```

mongoコマンドなら

```bash
mongo -u userForHoge -p PASSWORD --authenticationDatabase hoge
```

※`--authenticationDatabase`オプションは、認証用ユーザの在り処を示す。DBの中にユーザは作られるけれど、そのDB以外の操作許可も与えられる。

新しくDBを作ったりするときは、
    1. `mongodb://userAdmin:PASSWORD@ホスト名:27017/admin`へログインして、DBに対して許可したユーザを作る
    2. ログアウトする
    3. 作ったユーザで入る


## MongoDBをバックアップ

DB単位でバックアップする。

```bash
mongodump -u USER -p PASSWORD -d DBNAME --gzip --archive=C:\Garamon\Backup\DevHub

# ※古いmongodは--gzip、--archiveオプションが効かない
mongodump -u USER -p PASSWORD -d DBNAME C:\Garamon\Backup\DevHub
```


## リストア

バックアップしたものを持ってきて、DB単位でリストア。
--dropオプションは、現在のデータをドロップする。

```bash
mongorestore -u USER -p PASSWORD --authenticationDatabase DBNAME --drop --gzip --archive=C:\Garamon\Backup\DevHub\archive.gz

# ※古い端末からのdumpの場合ディレクトリになっている
mongorestore -u USER -p PASSWORD --authenticationDatabase DBNAME -d DBNAME --drop DBNAME 
```
【Git】Git入門前

# はじめに
以前Gitについて社内説明会をすることになり、要点をまとめたので書きます。
「Gitって聞いたことあるけど…」という人向けの記事で、シンプルにまとめました。
使い方は説明していませんが、使い方のイメージまでは説明しています…。

# Gitとは？
・バージョン管理システム！
・GitHubではない！（GitHubとはGitを利用したWebサービス）
・ファイルの変更内容や変更履歴を管理！
・あとから古い状態に切り戻したりできる！

# バージョン管理システムとは？
ファイルに対して「いつ」「誰が」「何を変更したか」といった情報を記録することです。
ファイルそのものや変更履歴などの情報を保管しておく場所を「**リポジトリ**」と言います。

# リポジトリの管理方法

リポジトリの管理方法には「集中型バージョン管理システム」と「分散型バージョン管理システム」の2つがあります。Gitは「**分散型バージョン管理システム**」です。

#### 集中型バージョン管理システム (Subversion)
1つのリポジトリを全員で共有し、1つのリポジトリに対してcheckoutやcommitを行うので、操作がシンプル。
動画など容量のでかいコンテンツの管理に向いてます。

#### 分散型バージョン管理システム (Git)

自分のPC上にローカルリポジトリを作成し、そのcommit内容を共有リポジトリに反映させる(push)仕組みで、やや複雑。

# Gitを使うためには…
#### CUI
macOSはターミナル(linux)、windowsはコマンドプロンプト(dos)で操作します。

#### GUI
Sourcetree、TortoiseGit、GitHub DesktopなどのGitクライアントツールで操作します。

# Gitの仕組み
#### ローカルリポジトリ
ユーザ一人ひとりが利用するために、自分の手元のマシン上に配置するリポジトリです。

#### リモートリポジトリ
専用のサーバ(Github、Bitbucket、Backlogなど)に配置して複数人で共有するためのリポジトリです。

# 使い方 (イメージ)
自分が作業したコードなどある程度のカタマリをローカルリポジトリに記録(commit)し、リモートリポジトリに保管(push)します。
メンバーも同様にpushしていれば、自分はリモートリポジトリから引っ張ってきて(pull)、自分のローカルリポジトリに付託します。

# さいごに
共同作業する場合は「ブランチ」を使うことでGitの効果が発揮されます。
「ブランチ」についてはまた時間のある時に投稿しようと思います。
Outlook on the WebからBoxなどサードパーティーのストレージに接続できないようにする

Microsoft 365管理センターのメッセージで公開されていた、MC186732(Outlook on the Webから、Boxなどサードパーティーへのストレージ接続) の件です。

https://admin.microsoft.com/AdminPortal/Home#/MessageCenter?id=MC186732

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146444/1c1c6f86-a9c0-7d1f-218d-1a33075cb575.png)

標準リリースでも2019/8/30に このパラメーターがTrue (デフォルト有効)にセットされるとあります。

BoxやDropbox、個人用OneDriveなど会社が許可していないオンライン ストレージに保存させたくないケースがあると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146444/46f6e843-d353-dd9f-0cf5-3f053b4dcb10.png)

有効になっているとこのように接続できてしまいます。

無効にするには以下のPowerShellコマンドレットを実行します。
Set-OwaMailboxPolicy -Identity OwaMailboxPolicy-Default -AdditionalStorageProvidersAvailable $false

※OWAポリシーを別途作っている場合は、-Identity の後ろはOwaMailboxPolicy-Default ではなく、そのポリシー名に変える必要があるかもしれません。

Set-OwaMailboxPolicy の構文はここにリファレンスがありますので、参考にしてください。
https://docs.microsoft.com/en-us/powershell/module/exchange/client-access/set-owamailboxpolicy?view=exchange-ps

結果の確認はGet-OwaMailboxPolicy を実行すれば分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146444/7f168c68-6077-a87d-66c2-afec8a2d1ba1.png)
AdditionalStorageProvidersAvailable がFalse になっていればOKです。
※すぐ上に似たパラメーターがありますが、リファレンスによるこれは以前あったもので既に廃止されているようです

私が試した時は30分くらいで反映されました。Boxなどのアイコンが表示されなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146444/30783a34-4257-0266-4d36-cb25ef272dc7.png)
【初心者】pythonで０から Project Euler を解いてみた12

今回はeuler12問目を解いていきます！
問題はこちらへ！！
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2012
今回は三角数の約数が500を超える一番小さい三角数は何ですか的な問題ですねー。。。
じゃ、頑張って解いていきますか！
#コード
```python
import sympy
n = 0
while True:
    n += 1
    Tri = n * (n + 1) // 2
    #print(Tri)
    div_cout = sympy.divisor_count(Tri)
    if div_cout >= 500:
        print(Tri)
        break
```
最初に三角数とは何ぞやと思う人のために少し解説!
![名称未設定 4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452390/af4b9afe-50a3-fa7a-a219-54ba8e8ea1c3.jpeg)
今絵にしたのは三角関数の3項目の6です
nに3を入れてもらうと答えは6になります
これは高さ(段数)×(段数+1)÷2になります
絵のように二つの三角形を使い四角形を作りその半分が三角数の項になるということです

まず私はwhile True:で無限ループを作り問題の答えになる数を探しに行く旅に出ました。
次にsympyのdivisor_countを使い約数の数を出します
次のif文でそのdiv_coutが500より大きいときにループを止めるコードを書いて終わりです！！
Numpy 1.17リリースでGensim 2.2.0インストールでエラー

# 背景
requirements.txtでnumpy1.15.4を指定していても、gensimのinstall時にnumpyの1.17を使っていたのを発見したのでメモ
（circleCIでキャッシュが効いてなかったことも発見した。）

# 参考
https://mag.osdn.jp/19/07/30/170000
https://pypi.org/project/gensim/
はじめてのGit(clone, add, commit, push)

Ideagearの林です。

今回は既存のGitHubプロジェクトからcloneし、テストファイルを作成、add、commit、pushして変更を反映させる方法をまとめます。

#環境
Windows10 64ビット版(32ビットでも可)

Git SCM の Git for Windows Setup版2.23.0 で実行する(インストール方法は[こちら](https://qiita.com/ideagear/items/eaf5a33bc15cf61c6a55))

#clone
リモートリポジトリをクローンして、コンピュータにローカルのコピーを作成する。

- 1 GitHubで、リポジトリのメインページへ移動する

- 2 **Clone or download**をクリックし、その下にあるURLをコピーする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488218/3a4b226e-1878-4a82-209d-4ee25e000ec1.png)

- 3 **Git Bash**を開く

- 4 ```cd```コマンドでクローンしたいディレクトリに移動する(しなくてもよい)

- 5 ```git clone```と入力、そのあとにコピーしたURLを貼り付けてEnterを押す

これでローカルにクローンが生成された。

#add
変更のあったファイルやフォルダをステージングに登録する。
変更するデータのリストに加えるような認識。

変更内容として、test というファイルを追加してみる。

- 1 ```ls```コマンドを実行し、クローンしたリポジトリの名前のフォルダがある事を確認する

- 2 確認したら```cd フォルダ名```でディレクトリをクローンしたフォルダに移動する

- 3 同様にして、新しいファイルを生成したいディレクトリに移動する(しなくてもよい)

- 4 ```touch test```と入力し、新ファイル"test"を作成

- 5 ```git add test```と入力し"test"を登録する

#commit
現在ステージングに登録されている変更内容をローカルリポジトリに記録する。
メールでいうと下書き保存のような認識。

commitの前に名前とメールアドレスの登録が必要なので先にそれを実行する。

- 1 ```git config --global user.name "NAME"```
　NAMEを自分の名前に変更し、実行(ダブルコーテーションは消さないように注意)

- 2 ```git config --global user.email ADDRESS```
　ADDRESSを自分のメールアドレスに変更し、実行

- 3 ```git commit -m "test file"```
　test fileの部分は任意のコメントに変更し、実行する

#push
変更が記録されたローカルリポジトリのデータをリモートリポジトリ(元データ)に反映させる。
メールでいうと送信のような認識。


- 1 ```git push origin master``` これだけ。とりあえずこれで反映できる。詳しくは他の方がまとめてるのでそちらを参照。

#最後に
GitHubで変更したリポジトリを確認してみましょう。
選んだ場所に"test"というファイルができていれば成功です。

おつかれさまでした。
SQL Serverでインスタンス一覧を取得する

# コマンドプロンプトで実行

```
sc query | find /i "sql"
```
いろいろサービスが出てきますが、このサーバの場合、 `MSSQLSERVER` と `INST01` がそれぞれのインスタンス。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/7248f8e0-d274-0aa5-192d-f706fac73475.png)
【Shopify】特定のタグが付いた商品を抽出して配列にする方法

Liquidで特定のタグが付いた商品を取得して配列にする処理が意外と面倒だったので備忘録も兼ねて方法を紹介します。

# 商品の絞り込み

## コレクションでの絞り込み

`collection`オブジェクトは`products`属性を持っているので、
特定のコレクションに属する商品を取得するのは簡単です。

```liquid:foo.liquid
{% assign _products = collections.hoge.products %}
```
`collection.liquid`内、`product.liquid`内なら

```liquid:collection.liquid
{% assign _products = collection.products %}
```
```liquid:product.liquid
{% assign _products = product.collections['hoge'].products %}
```

## タグでの絞り込み

コレクションと違い、タグはオブジェクトとして存在しないため、
`{{ tags['fuga'].products }}`のような商品の取り方ができません。
そのため、`product`の配列から特定のタグを持つ商品を抽出して新しい配列を作る必要があります。

例えば、"fugaコレクション"から"hogeタグ"の付いた商品だけを取得したい場合は以下のようになります。

```liquid:bar.liquid
<!-- fugaコレクションの全商品を取得 -->
{% assign __products = collections['fuga'].products %} 

<!-- 空の文字列として宣言する -->
{% assign _products = '' %}
{% for _prod in __products %}
  {% for _tag in _prod.tags %}
    {% if _tag contains 'hoge' %}

      <!-- hogeタグを持っていれば、 _productsの末尾にproductオブジェクトと区切り文字','を追加 -->
      {% assign _products = _products | append: _prod | append: ',' %}

      {% break %}
    {% endif %}
  {% endfor %}
{% endfor %}

<!-- 末尾の ',' を削除し、 ','を区切り文字として配列を生成する -->
{% assign _products = _products | remove_last: ',' | split: ',' %}
```

# まとめ
ちょっと面倒くさい方法ですが特定のタグが付いた商品の配列を作れました。
LiquidにもJavaScriptのfilterみたいな機能があれば嬉しいですね

# 参考
https://medium.com/@rijulg/how-to-make-product-arrays-on-shopify-5b191d0f0384
CodeCommitの認証エラー(403)で躓いたのでドキュメントを読んで対応したときの作業ログ

Github でソースコードを管理している、サーバー環境は AWS で、 CodeCommit へ push したら CodePipelineが動くよう設定されている。
という状況で、CodeCommitにpush（もpullも）できず認証エラーで悩んだときの作業記録

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/troubleshooting-ch.html

AWSのドキュメントを読んだ

```bash
$ git config -l --show-origin |grep osxkeychain
file:/usr/local/etc/gitconfig	credential.helper=osxkeychain
```

gitconfigの親玉が見つかったので、開いて編集

```
[credential]
#       helper = osxkeychain
```

helperの設定をコメントアウトした。

さらに `Keychain Access.app` で CodeCommit の該当のエントリー（有効期限が切れている）を削除。

これで CodeCommit へは gitアクセスできるようになった。

しかし代わりに Githubへgitコマンドでアクセスすると、毎度ユーザー名とパスワードを聞かれるようになってしまった。  
さすがにそれは煩わしい。

~/.gitconfig へこれを追加

```
[credential "https://github.com"]
   helper = osxkeychain
```

無事、いままでどおりにgithubを使えるように戻った。

個人的にはGitlabも使うのでgitlab.comへも同じように osxkeychain を使うように設定しておいた。
Node.js上でCUIコマンドを用いたURLスクレイピング

# Node.jsを用いたURLスクレイピング

## はじめに
Node.jsを用いたスクレイピングは、
記事を漁るとしばしば見受けられます。
Webサーバを立ててリクエスト送るという記事は多いです。
それって、Node.jsの特徴をあまり活かせてないのでは？
と思い立ったためこの記事を書きました。

## Node.jsでスクレイピング
JSをサーバサイドでも動作させることができるプラットフォームですが、
JS単体では扱えなかった、CUIコマンドも扱えます。

<b>Webサーバ立てる必要なくない？</b>

Curlコマンド利用してHTTPリクエスト生やして、
HTMLオブジェクトを取得した上でスクレイピングしたほうがよくない？

##ということで

Node.js上でCUIコマンドを利用するためには、
<b>child_processモジュール</b>内の<b>execSync関数</b>を利用します。

余談ですが...
child_processモジュール内のexecSync関数は同期関数
child_processモジュール内のexec関数は非同期関数 なので注意。

CUIExec(argv)関数では引数にURLを指定することで、
該当URLの飛び先にある、HTMLオブジェクトを取得し、
文字列として戻り値に設定します。 

```index.js
const execSync = require('child_process').execSync;
const CUIExec = (argv) => { // URL
    console.log(argv);
    return execSync("curl " + argv).toString();
}
```

HTMLオブジェクトを取得したのちに、
正規表現によってhrefタグに紐づけられているURLのみを抽出し、
配列に格納します。

```index.js
const urlParserIncludeHTML = (htmlString) => {
    return (htmlString+"").match(/href=\"(.*?)\".*?/gi);
}

if (process.argv[2]) { //コマンドライン引数の取得
    let arrayIncludeURL = [];
    let uriList = [];

    uriList = urlParserIncludeHTML(CUIExec(process.argv[2])).slice();
    console.log(uriList);

    for (let key in uriList) {
        let tmpStr = (uriList[key]+"").replace(/^href="/, "").replace('"', "");
        //任意のファイル拡張子
        if (tmpStr.match(".css") || tmpStr.match(".xml")
            || tmpStr.match(".png") || tmpStr.match(".jpg")
            || tmpStr.match(".svg") || tmpStr.match(".ico")
            || tmpStr.match(".json")) {
            continue;
        } else {
            if (tmpStr.indexOf("http") || tmpStr.indexOf("https")){
                arrayIncludeURL.push(process.argv[2] + tmpStr);
            } else {
                arrayIncludeURL.push(tmpStr);
            }
        }
    }
    console.log(arrayIncludeURL);
}
```

実行コマンドは以下の通りです。

```sh
$ node index.js <URL>
```

index.jsをchild_processモジュールを利用し、
他のJSファイル上で実行することによって、
他言語との有意差はおいておいても、
JSのみでもソフトウェアの作成が可能です。
超初心者が受けるJS社内勉強会：第5回6回

# 続：実践
よくあるアコーディオンの処理について実践。

```js:アコーディオン
$(function(){  //ブラウザに読み込まれたとき
	'use strict';  //エラー出力をするモードの宣言

	$('.acc_button').on('click', function(){ //クリックした時
	
	//console.log('Hello, world!');
	//$contentという変数にクリックされたものの要素に代入する
	
	var $contents = $(this).closest('.js-accordion').find('.acc_contents');
	
	if($contents.is(':animated')){ //$contentがアニメーション中だったら{}を実行
	
		return false; //何もせずに処理を終了する
	}
	$contents.slideToggle(); //dd要素が表示されているときは閉じ、表示されていないときは閉じる
	$(this).toggleClass('open');  //クリックされた要素にopenクラスがついていれば削除。ついていなければ追加。
	});
});
```


## $(this)
- イベントが発生（クリックした）した要素をさしている

## .closest(selector)
1. クリックしたとき
2. その親要素をみる
3. 子要素の中で、開く箇所をさがす
4. スライドを開閉する

### 連打して開閉を続けてしまう場合の処理
- アニメーション中は何もしない、という命令を書き足す

## return false;
- functionを終了する。
- falseを返す。
- 以降の処理を実行しない。<br>※if()の中身がtrueの場合に実行される。

## :animated
- アニメーションtrue、してないときはfalse


複雑なプログラムを組める人はすごいなあ、と思うのでした。
具体的な段階に入ると、脳の拒否反応が激しいので、このあたりにしようと思います。

教えてくれた方々には感謝しています。
ありがとうございました。
MacBookPro(Mojave)のTouch Barが急に表示されなくなった時に再起動する方法

MacBookPro Mojave（2019 13-inch）に替えてからTouchBar使いにくいな
Esc押しづらいな、十字キー使いづらいな、タイピングの打鍵が気持ちよくないなとか色々思ってましたが、
画面ロックしようとしたら急に「あれ、TouchBarが何も表示されない」って黒い状況でボタンがない状態になりました。
スリープできへんやん。
ということでTouchBar再起動する方法があったのでメモです。

## ActivityMonitorからタスクキルする方法

1. Spotlight検索（Cmd + space）やアプリケーションフォルダから「Activity Monitor」を起動する
2. 「TouchBarServer」というプロセス名を見つけて終了（Quit）させる

プロセス名は
Mojaveの場合：TouchBarServer、　High Sierra、Sierraの場合：Touch Bar agent

## ターミナルからコマンド実行する方法
1. ターミナルを開く
2. コマンド実行する

MacOS Mojaveの場合：
```sudo pkill TouchBarServer```

MacOS High Sierra、Sierraの場合：
```pkill "Touch Bar agent"```

## コントロールストリップ(Control Strip)部分のみを手動で再起動する方法
Touch Barのを強制的にリロード

1. ターミナルを開く
2. コマンド実行する
``` killall ControlStrip ```

## OS再起動
と、上記までをやってもダメなことがあったので
最終的にはOSを再起動するだけで治りました。
なのでOS再起動でも良いと思います。

ここまでやって、なんでやねん

## 蛇足
調べてみるとTouchBarがたまに表示されない状況になるのはまあある状況みたいでした。
ただでさえ使いづらいのに元の物理ボタンに戻して欲しいです。
プログラミング的にEsc押しづらい・打鍵感がないってのはviもそうだし非常に使いづらいです。

ちなみにTouchBarが表示されていない状況の時は
設定画面からTouchBarに関するメニューがごっそり消えていたのでそこはちゃんとしてるんだ？と思いました。

<img width="662" alt="スクリーンショット 2019-08-29 14.32.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/f14edb98-f772-f679-8263-1b2d553bbed7.png">


## 参照
http://osxdaily.com/2017/01/11/manually-refresh-touch-bar-mac/
windowsでpythonを扱うときに気を付けたこと


今後会社などでpythonを扱いたくなった時のためのメモです
#結論 visual studioを使うとよい

他には
#cp932' codec can't decode byte 0x8e in position 18: illegal multibyte sequenceが出るとき
以下のコードを先頭に書く




```python

import io, sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,
encoding=sys.stdout.encoding, 
errors='backslashreplace', 
line_buffering=sys.stdout.line_buffering)


```
さらに

#ファイルを扱うopenファイルでunicodeエラーが起きた時

```python
        with open(path) as f:
```
こんな感じのを

```python
        with open(path, encoding="utf-8") as f:
```

に変える
helmでkafkaをkubernetesインストールする

## 環境

* minikube: v1.3.1
* kubernetes: 1.15
* macOS: 10.14.4
* helm: v2.14.3

helmをインストールしていなかったらインストールする。インストール方法は「[minikubeにhelmをインストールする - Qiita](https://qiita.com/reoring/items/e50877f543bed72d93ee)」を参考にします。

kafkaはkafkaクラスタに関するメタデータとconsumerクライアントの詳細情報を格納するために[Zookeeper](https://zookeeper.apache.org/)を使います。この[charts](https://helm.sh/docs/developing_charts/)ではZookeeperも起動するため別途Zookeeperをインストールする必要はありません。個別にZookeeperをインストールする方法は「[helmでzookeeperをkubernetesインストールする - Qiita](https://qiita.com/reoring/items/a0dad8e60c8d1a08d119)」で説明しています。

## incuberレポジトリを追加する

kafkaはまだincubator状態なのでincubatorのレポジトリをhelmに追加します。

```
helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
```

## kafkaをインストール

```
helm install --name kafka incubator/kafka
```

## 確認

```
kubectl get po | grep kafka
```

### 出力

```
default       kafka-0                                 1/1     Running   0          34m
default       kafka-1                                 1/1     Running   0          20m
default       kafka-2                                 1/1     Running   0          19m
default       kafka-zookeeper-0                       1/1     Running   0          34m
default       kafka-zookeeper-1                       1/1     Running   0          33m
default       kafka-zookeeper-2                       1/1     Running   0          32m
```

## 参照

* [charts/incubator/kafka at master · helm/charts](https://github.com/helm/charts/tree/master/incubator/kafka)
AWSでPrivate SubnetのRDSにインターネット経由でJDBC接続する

# シナリオ
インターネット上のサービスがPrivate Subnet上にあるRDSにJDBCでアクセスする

# 背景
インターネット(クラウド)上のサービスがAWS上のデータベースにアクセスできるように、データベースをPublic Subnetに置かないといけなくなったのですが、データベースを大公開しているようで気持ちが悪い。接続元のサービスのグローバルIPは帯域が決まっているので、もちろんSecurity Groupの設定で特定IPレンジの接続に限定できるのですが、やっぱり以下の絵のようにしたい！ということで考えました。

![NAT-Instance-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51593/50b8d9dd-12f1-997c-d344-63111b72f31e.png)

# Private Subnetへの接続
Private Subnet上のホストにアクセスしたいという場合、以下のパターンが考えられます。

## 1. SSH Port Forwarding (SSH Tunneling)

手元のマシンからSSHを使って踏み台サーバーのポート(22)に接続します。踏み台サーバーからターゲットへはポート転送が設定されているため、閉じた領域のターゲットとあたかも直接通信しているような気になれる、それがSSHポートフォワーディングです。

![NAT-Instance-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51593/3c836c73-ec7b-00bc-ec7f-a8ef06952930.png)

## 2. VPN/DXでアクセス

VPNやDirect Connectの専用回線を使えば、AWS上のリソースはあたかもローカルネットワークにあるかのように扱えるので、経路を気にする必要はなくなります。

![NAT-Instance-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51593/459dd407-19cb-e888-412b-781c923ef2ac.png)

## 3. NATインスタンス/Proxyを経由してアクセス

今回取り上げるのがこれです。インターネット上のサービスからダイレクトにデータベースにアクセスしたいのですが、SSHポートフォワーディングのように自分のマシンにターゲットまでのSSHトンネル用セッションを張ることはできません。またVPNのような専用回線を張ることもできません。そこで、Public SubnetにNATインスタンスを立ててPrivate Subnetまでの経路を確保してもらいます。

![NAT-Instance-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51593/67d0ac5f-d18d-a3da-cad5-b55027513287.png)

シナリオとしては、パブリックアクセス可能な接続ポイントの適当なポートへ接続すると、裏側でデータベースのポートに転送される状態をNATインスタンスで実現します。squidやnginxのリバースプロキシでも実現できそうですが、より簡単そうなNATインスタンスを使います。

# 構築

## 事前準備
踏み台、VPC, Public Subnet, Private Subnet, RDSを作っておく
VPC一式はこちらで作れます。
 https://aws.amazon.com/jp/quickstart/architecture/vpc/

## 作成
1. Amazon EC2 コンソールのAMI検索画面でamzn-ami-vpc-natを検索して起動する

2. EC2 コンソールから立ち上げたEC2インスタンスを選択し、「アクション」-「ネットワーキング」-「送信元/送信先の変更チェック」(SrcDestCheck)属性を無効にする

3. 必要に応じてセキュリティーグループをattach。インバウンドの許可設定は、接続してくる適当なポート番号と`0.0.0.0/0`でOKですが、本番運用時に特定IPに変える

4. 必要に応じてルートテーブルを変更

5. iptablesの設定を変える
  
    NATインスタンスにec2-userでログインする。初期状態では`/etc/sysconfig/iptables`がいないので、
 `sudo service iptables save`でつくる
 その中にpreroutingのエントリーを追加する
 `iptables -t nat -A PREROUTING -p tcp -d <sourceのIPかCIDR> --dport <sourceのポート> -j DNAT --to-destination <targetのIP:targetのポート>`
 IPはどちらもPrivate IPなので注意。ターゲットのDBのIPはhost名からdigっておく
 iptablesを変更した後は`sudo service iptables save`しないとサービス再起動で元に戻るのため注意。

6.アプリケーションからNATのPublic IPとNATで指定したポートで接続してみる。接続した後に適当なクエリを実行してみて結果が返ってくればOK!

# 参考
## アーキテクチャ
https://dev.classmethod.jp/cloud/aws/internal-port-concentrator-pattern/

## NATインスタンスとは
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_NAT_Instance.html#nat-routing-table

## NATインスタンスの作成
https://qiita.com/hc_isobe/items/3520173b1065aeae884b
helmでzookeeperをkubernetesインストールする

## 環境

* minikube: v1.3.1
* kubernetes: 1.15
* macOS: 10.14.4
* helm: v2.14.3

helmをインストールしていなかったらインストールする。インストール方法は「[minikubeにhelmをインストールする - Qiita](https://qiita.com/reoring/items/e50877f543bed72d93ee)」を参考にします。

## incuberレポジトリを追加する

zookeeperはまだincubator状態なのでincubatorのレポジトリをhelmに追加します。

```
helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
```

## zookeeperをインストール

```
helm install --name zookeeper incubator/zookeeper
```

## 確認

```
kubectl get po | grep zookeeper
```

### 出力

```
zookeeper-0                     0/1     ContainerCreating   0          108s
zookeeper-66c5dffd89-8m7dk      1/1     Running             1          22h
```

## 参照

* [charts/incubator/zookeeper at master · helm/charts](https://github.com/helm/charts/tree/master/incubator/zookeeper)
いつも忘れるshellにおけるなんかちょっとした処理集

# 前置き
- ワタシソンナshellリョクナイ
- 色んな自動化する上で、shellでできることはshellでするようにしている
- なんかいっつも同じようなことしている気がするけど、毎回調べて書いてる自分がいる
- この記事成長させて、同じようなことを毎回調べる時間を減らしたい（自分向け）

# 色んな処理
## grepして一意に絞った前提で、対象のファイルパスを変数に確保したい（awkをいっつも忘れる）

例はキーワードを含むファイルを検索して、そのファイルパスを特定したい

```shell:awk
# 雑に"xxx_1.txt"みたいなファイルパスを取得
file_path=`grep -r "検索ワード" 検索パス | grep 'xxx_[0-9]\+.txt' | awk -F'[:]' '{print $2}'`

if [ ${file_path}  == "" ]; then
	echo "paramのファイル名が取得できなかったため終了します"
    exit 1
fi
```

### awk内でシングルコーテーションを使いたい
\047で囲ってあげる

```
awk -F"\047" '{ print $2 }'
```

## grepした文字列を置換したい（変数も使用できるsedが無難そう）

### 10を@@に置換したい

```shell:replace
echo "1234567891011121314151617181920" > test.txt
replace=`cat test.txt`
echo ${replace/10/@@}

123456789@@11121314151617181920
```

#### tr。お前はダメだ

```shell:tr_NG
echo "1234567891011121314151617181920" > test.txt
cat test.txt | tr 10 @@

@23456789@@@@@2@3@4@5@6@7@8@92@
```

### 変数を@@に置換したい

```shell:sed
val=10
cat test.txt | sed "s/${val}/@@/g"

123456789@@11121314151617181920
```

## リストに値が含まれてるかどうか

```shell:contain
list=(1 2 3 4 5 6)
value=4
if [[ " ${list[*]} " == *" ${value} "* ]]; then
    echo "contains!"
else
    echo "not contains!"
fi

contains!
```

## 引数チェック
引数が1つじゃないとエラー

```sh
if [ $# != 1 ]; then
    echo 引数エラー: $*
    exit 1
else
    echo OK
fi
```


# 参考
- [awkコマンドの基本](https://qiita.com/yamazon/items/563af1b485ff413d381f)
- [grepを使って正規表現を学ぶ](https://qiita.com/yuyaAoki/items/f7db9c47d75191489a0e)
- [sed の置換パターンの中でシェルの変数を参照する](https://maku77.github.io/sed/sed/shell-variables.html)
- [シェル変数($#)で引数チェックをする](https://it-ojisan.tokyo/sh-arg-check/)
rails6サーバー起動まで手順

windows10でruby on rails使えるようにします。

まずubuntuを入れます。（省略）
rbenvでRubyをインストールします。（省略）
node.jsとかBundlerを入れます。（省略）


```
$ mkdir rails_app
$ cd rails_app
$ bundle init
```

Gemfileが出来るので編集
\# gem "rails"
の行のコメントアウトを外す

```
$ bundle install --path vendor/bundle
```

```
$ bundle exec rails new . -B -d mysql --skip-turbolinks --skip-test
```

→ERROR
Could not find gem 'mysql2 (>= 0.4.4)' in any of the gem sources listed in your Gemfile.が出る

MYSQLを導入します。
https://dev.mysql.com/downloads/repo/apt/
で、パッケージをダウンロードします。
下のコマンドでインストールします。
インストール中にバージョン選択を求められます。

```
$ sudo dpkg -i mysql-apt-config_0.8.13-1_all.deb
$ sudo apt-get install mysql-server
$ sudo apt-get install libmysqld-dev
```

MySQLを起動します。

```
$ sudo /etc/init.d/mysql start
```

bundle installした後、DBを作成。

```
$ bundle exec rake db:create
```

```ERROR
RAILS_ENV=development environment is not defined in config/webpacker.yml, falling back to production environment
Access denied for user 'root'@'localhost'
Couldn't create 'rails_app_development' database. Please check your configuration.
rake aborted!
Mysql2::Error: Access denied for user 'root'@'localhost'
　　　　　　　　　　　　　　：
```

こんなのがでるので

```
$ bundle
$ bundle exec rails webpacker:install
```

もう一度bundle exec rake db:create

```
warning Skipping preferred cache folder "/home/user/.cache/yarn" because it is not writable.
warning Selected the next writable cache folder in the list, will be "/tmp/.yarn-cache-1000".
Access denied for user 'root'@'localhost'
Couldn't create 'rails_app_development' database. Please check your configuration.
rake aborted!
Mysql2::Error: Access denied for user 'root'@'localhost'
　　　　　　　　　　　　　　　　　　：
```

権限がないので、ユーザー作って権限を与えます

```
sql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
sql> GRANT ALL ON rails_app_development.* TO 'user'@'localhost';
```

config/database.ymlの設定と合わます

rails_app_testでも権限ないとでるようなので、
もう一回権限付与します。するとbundle exec rake db:create出来ました

```
$ bin/rails s
```

でサーバーがちゃんと起動したので問題ないはず

http://localhost:3000/
に繋ぎます

![FireShot Capture 059 - Ruby on Rails - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266915/3ef4a98f-1d22-0afc-571e-0ef279e2c8fd.png)

おわり
いろいろ試しましたが、上の手順で良さそうです
嵌りに嵌りました

*ubuntu version18.04*
*rbenv 2.6.3*
*Rails 6.0.0*
*10.1.41-MariaDB*


-追記-
postgresqlだったらすんなり行けました。
はぁ・・・


## その他
### UbuntuでCドライブ配下に移動

```
$ cd /mnt/c
```

### MySQLが起動しない

```
$ sudo /etc/init.d/mysql start
```

→ERROR

下を実行

```
$ sudo apt clean
$ sudo apt install mariadb-common mariadb-server mariadb-client
```

### mysql -u root する ERROR 1698 (28000): Access denied for user 'root'@'localhost' こんなのがでる

→ sudo mysql -u root だと入れた
Ubuntu特有の初期設定らしい
大きいものをまるっと圧縮してバックアップする（Windows）

* このディレクトリ以下をすべて圧縮して取っておきたい！
* でも合計サイズが大きすぎてzipできない！
* 時間がかかってもいいからシンプルにやりたい！

こんなときは[7zip](https://www.7-zip.org/)が便利。
さらにちょくちょくやるから実行ファイルにしておきたい。
そこで簡単なPowerShellスクリプトを作りました。

# 7zipをコマンドラインで使う

dllを必要としないスタンドアローンな7zipコマンドラインツール`7za.exe`は、通常のパッケージとは別にダウンロードすることになります。
https://www.7-zip.org/download.html
上記の`7-Zip Extra: standalone console version, 7z DLL, Plugin for Far Manager`と書かれているものに含まれている。

この`7za.exe`をコマンドラインで呼び出す形で行きます。
詳しい使い方は[公式ガイド](https://sevenzip.osdn.jp/chm/cmdline/index.htm)を参照のこと

今回下で使ったのは圧縮コマンドのみ

```PowerShell
"7za.exe" a -r c:\path\to\Dist.7z
```
* -r はrecoursiveオプション
* カレントにある全てのファイルを再帰的に c:\path\to\Dist.7z に圧縮する
* tarコマンドで言うところの`-C`オプションに相等するものがないので、この上で`Set-Location`（cd）している

# スクリプト

* このスクリプトと`7za.exe`は同じディレクトリにある必要がある
* 実行するとスクリプトと同じディレクトリに`YYYY_MM_DD_bak.7z`という名前の7zipバックアップができる
* ３以上バックアップがあると古いものから消していく
* できたバックアップを解凍すると、$SourceDir（C:\path\to\Source）の中身がまるっと手に入る

```PowerShell:7zBackup.ps1
# [7za.exe](https://sevenzip.osdn.jp/)を使ってディレクトリをbackup

# Set the properties
$7za = $PSScriptRoot+"\7za.exe"
$SourceDir = "C:\checkout\koba"
$Dist = $PSScriptRoot + (Get-Date -UFormat "\%Y_%m_%d_bak.7z")
$BackupMaxNum = 3

# Stop the apps using SourcePath

# backup
Set-Location $SourceDir
Invoke-Expression "$7za a -r $Dist"
Set-Location $PSScriptRoot

# delete old backup
$counter = $BackupMaxNum
Get-ChildItem $PSScriptRoot -Filter "*_bak.7z" | `
Sort-Object -Property LastWriteTime -Descending | `
ForEach-Object -Process {
	Write-Output "in"
	if($counter -gt 0){
        $counter--
    }
    else{
        Remove-Item $_.FullName
    }
}

# Restart apps
```
elixirでhackerrankのString Minglingを解いていく

# 問題内容

関数型言語問題でElixirも対応しているhackerrankの問題を解きます

ここでは2つの長さが同じな文字列を交互に出力するコードを書いていきます

## input
```
(string P, length = N)
(string Q, length = N)
```

## output
```
PとQの文字列が交互に現れる文字列
```

## sample
```
# input
abcde
fghij

# output
afbgchdiej
```

# 解1(失敗)
## 方針
- 入力文字列をListにし、その長さを元にループさせて各要素にアクセスして文字列を結合していきます

```elixir
defmodule StringMingling do
  def string_mingling(p, q) do
    0..(length(p) - 1)
    |> Enum.map(&(Enum.at(p, &1) <> Enum.at(q, &1)))
    |> Enum.reduce("", &(&2 <> &1))
    |> IO.write
  end
end

p = IO.gets("") |> String.trim |> String.codepoints
q = IO.gets("") |> String.trim |> String.codepoints

StringMingling.string_mingling(p, q)
```
## 結果

**Terminated due to timeout**
(時間切れ)
😇😇😇😇😇😇😇😇😇😇😇😇

## 原因
- Nの範囲が10^５だったのでクソ長いリストにそれぞれアクセスしたのが失敗の原因でした

# 解2（成功）
## 方針

- そこでリストの先頭のアクセスが速いってことを思い出したので、先頭以外のリスト再起呼び出しで末尾までループさせて文字列結合していきます

```elixir
defmodule StringMingling do
  def string_mingling([], []), do: ""
  def string_mingling([p_hd | p_tl], [q_hd | q_tl]), do: p_hd <> q_hd <> string_mingling(p_tl, q_tl)
  def main(p, q), do: string_mingling(p, q) |> IO.puts
end

p = IO.gets("") |> String.trim |> String.codepoints
q = IO.gets("") |> String.trim |> String.codepoints

StringMingling.main(p, q)
```

## 結果
**†Accepted†**

# 所感
- リストの先頭へのアクセスが速いってことを思い出させられました
- 関数型言語の書き方ってなかなか慣れないと難しいって思いました
- 最終的なコードがふつくしい