OmniAICreator/Qiita-1.07M huggingface dataset:
ScalaでHttpClientを使って、HttpRequest(POST)を送る

#はじめに
Scalaを勉強し始めたので、学んだ内容を整理していきます。

今回は、HttpRequest(POST)を送る方法について調べて実装しました。

#実装方法

###RequestBodyの例
```Sample.json
{
	"id": "user1",
	"name": "Sample User",
	"age": 20,
	"birthday": "2018/02/06"
}
```

###実装例
今回は、HttpResponseに基づいた処理や、例外発生時の処理については考慮していません。
また、RequestBodyのjsonはもう少しうまい作り方がある気もします。

```HttpRequestSample.scala
import java.nio.charset.StandardCharsets
import java.util
import org.apache.http.NameValuePair
import org.apache.http.client.entity.UrlEncodedFormEntity
import org.apache.http.client.methods.{CloseableHttpResponse, HttpGet, HttpPost}
import org.apache.http.impl.client.HttpClients
import org.apache.http.message.BasicNameValuePair
import org.apache.http.util.EntityUtils

object HttpRequestSamples extends App {

  //コンストラクタ
  postHttpRequest()

  //HttpRequest(POST)を送るためのメソッド
  def postHttpRequest() = {
    val charset = StandardCharsets.UTF_8
    val httpclient = HttpClients.createDefault()
    val postRequest = new HttpPost("https://localhost:8080/api/users")

    var response:CloseableHttpResponse = null

    //RequestBodyを作成
    val requestBody = new util.ArrayList[NameValuePair]()
    requestBody.add(new BasicNameValuePair("id", "user1"))
    requestBody.add(new BasicNameValuePair("name", "Sample User"))
    requestBody.add(new BasicNameValuePair("age", "20"))
    requestBody.add(new BasicNameValuePair("birthday", "2018/02/06"))

    try{
      postRequest.setEntity(new UrlEncodedFormEntity(requestBody))
      response = httpclient.execute(postRequest)

      //結果を簡易的に表示する
      val statusCode = response.getStatusLine().getStatusCode()
      val responseBody = EntityUtils.toString(response.getEntity(), charset)
      println("StatusCode: " + statusCode)
      println("ResponseBody: " + responseBody)

    } catch {
      //例外発生時の処理
      case e: Exception => e.printStackTrace()
    }
  }
}
```

##参考資料
[Scala の HttpClient の使い方 (Post)](https://qiita.com/ekzemplaro/items/7702b609c1f31a06c084)
その丸め込み、必要ですか？

## 要旨
　プログラムを作成する中で、複数の状態量を一定のルールで1つの数字(仮に$x$とする)に落とし込むことがある。今回取り上げるのはそんな中でもよくありそうな

```math
\begin{equation}
x = am + n　
\end{equation}
```

```math
\begin{eqnarray}
\verb|s.t.|
\\
m&\in&\mathbb{R}
\\
n&\in&\mathbb{R}
\end{eqnarray}
```

な場合を取り上げる。
　このとき、$x$および$a$が与えられ$m$および$n$をプログラムで導出するならば、つぎの2つの手法が考えられる。

1. $x \div a$の整数部分を求めて、次に$x - a \times \verb|(整数部分)|$を求める
2. $x \div a$の剰余(```mod(x,a)```)を求めて、次に$(x - \verb|mod(x,a)|) \div a$を求める


```powershell:1の例
[int] $m = 13;
[int] $n = 7;
[int] $a = 8;

[int] $x = $a * $m + $n;

$quotient  = [Math]::Floor([Decimal]($x / $a)); 
$remainder = $x - $quotient * $a;
```

```powershell:2の例
[int] $m = 13;
[int] $n = 7;
[int] $a = 8;

[int] $x = $a * $m + $n;

$remainder = $x % $a;
$quotient  = ($x - $remainder) / $a; 
```

　1.のコードの特徴は、明示的にDecimal型へキャストを行い、さらにその小数部を切り捨てる処理を記述している点である。メモリーの使用量と内部で行われる処理の複雑さを考えると計算機に与える負荷は2.のコードよりも大きいと考える。
　2.のコードの特徴は、演算結果である$x$に対して演算過程を逆にたどることで値を得ている点である。この場合は明示的なキャストや実数に対する切り落とし処理を行わなくてよい分、簡潔で計算負荷が小さいと考える。

このようなコード実装に対して、以下の3点が論点されることがある。

* 処理に必要な記憶域
* 計算量
* コードの可視性、理解容易性

筆者は次の表のように評価する。

||記憶域|計算量|可視性|
|:-:|:-:|:-:|:-:|
|1.のコード|大|大|可|
|2.のコード|小|小|優|

　仕様に数学的処理が定義されている論理の実装の際には、「何を得たいか」だけに着目するのではなく、「その値はどのようにして生成されたのか」に着目することで、可視性と計算量の双方を考慮したコーディングを実現することが容易となる。

## なんでこんな記事書いたのさ
　要旨と言いながら長くなりましたなぁ(Extended Abstractに全部書いちゃう病の人)。
　いえですね、こんなことがありまして。

ﾄﾝﾄﾝ：社内のルーターがなんかおかしい。ログないかなぁ。
ﾙｰﾀｰ：30件ならあるで?ただしこけた時のログはないし、再起動したらログは全部飛ぶんや。
ﾄﾝﾄﾝ：F〇ck'n Shit!:middle_finger:　えぇい。Syslogサーバーはないのか?
上司：よくわかんないから立ててない。Windows Serverでできたっけ?(MS信者):thinking:
ﾄﾝﾄﾝ：もういいもん:triumph:　UDPで受信すればいいんでしょ?たしか。

　というわけで簡易SyslogサーバーめいたものをPowerShellで動かそうと思ったんですね。
　んで、Syslogのパケットの仕様見ながら参考にするコードを探していたら、出会ってしまったんです。商と余りを取得するのにDecimalにキャストしたうえでFloorで切り捨てをするコードに。

## 「『商と余り』だから、まず割り算して丸めよう」という考え方
　悪くはないと思います。その処理が1回こっきりでめったに出てこないんだったら。
　でも、このコードは500msec.ごとにこの処理呼んでる……
　__それはないんじゃない?__ 
　というわけで、この記事を書きました。

## きっとあるであろう突込み
__Cacti使いなよ__
Mockitoのモックオブジェクトをmock()と@Mockで宣言するときの違い

2021.06.02 仕様が変わっていたり、少し理解できたので内容を更新しました。

Mockito で Mockオブジェクトを生成する方法には、mockメソッド (mock()) と　Mockアノテーション(`@Mock`) の２種類があるので簡単な使い分けを考察してみました。

:warning: :1 `@Mock`アノテーションを使った場合の初期化処理だった、 `initMocks()` および `MockitoJUnitRunner` は現行バージョン（mockito-core 3．１0.0）の時点で、非推奨になっている。

:warning: :2　[MockitoのHP の More info](https://site.mockito.org/#more) の記載内容、および少し実際に試しただけなので、不正確な内容が含まれている可能性はあります。 また、Spyについても概ね同様の考えた方で良いと思います。

## mock() と ＠Mock の使い分け

`@InjectMocks` を付けたオブジェクトのフィールドを Mockにする場合に、そのMockは `@Mock`で作成する。
イメージ的には、`@InjectMocks` と `@Mock` は一緒に宣言して使う。

`@Mock`で作成するMockオブジェクトは、利用前に初期化し、利用後は後処理（close）を行う。

## Mockオブジェクトの宣言パターン

### 1. mock(Object.class) メソッドで生成する

Mockオブジェクトの基本の生成方法。
前述した通り、 `@InjectMocks` オブジェクトのフィールド以外をMockにする場合は、こちらを使った方が、前処理と後処理を書かなくて済む。


```java
public class RetrieveBookDetailsTest {
  private BookDao bookDao = mock(BookDao.class);
  
  @BeforeEach
  void setUp() {
    when(bookDao.findById(1)).thenReturn(new Book());
    when(bookDao.findById(2)).thenReturn(null);
  }
  // 以下、Testメソッド
  ....
```

### 2. `@Mock` アノテーションで宣言する

`@Mock` で宣言したMockオブジェクトは、 `openMocks()`メソッドを使って初期化を行う必要がある。
更にこのメソッドの戻り値がAutoCloseableオブジェクトとなるので、テスト終了時に `close()`メソッドを実行する。

サンプルコードには、 `@InjectMocks`オブジェクトを宣言するべきだったが、 `openMocks()`実行時にMockオブジェクトの生成とInjectMocksオブジェクトのフィールドへのInjectionを行っていると思われる。

```java

    private AutoCloseable closeable;

    @Mock
    private Network network;

    @BeforeEach
    void setUp() {
        closeable = MockitoAnnotations.openMocks(this);
    }

    @AfterEach
    void tearDown() throws Exception {
        closeable.close();
    }
```

これを最初に書いた時よりも、Mockitoって意外とシンプルだなと感じるようにはなった。
Goメモ#1

#Hello Go

```golang:sever.go
package main

import (
  "fmt"
  "net/http"
)

func handler(x http.ResponseWriter, y *http.Request) {
  fmt.Fprintf(x, "Hello, World ,%s!" ,y.URL.Path[1:])
}
//数学チックになってしまったけど、x,yにはそれぞれ同じ変数名が入る。
//一般的には(x,y) = (writer, request)
func main() {
//プログラムの実行はfunc main~ から始まる。
  http.HandleFunc("/", handler) // "/"が呼び出された時、func handler ~~が起動する。
  http.ListenAndServe(":3000", nil)
}

```
ターミナルで

```
$go run server.go
```
でブラウザに行ってlocalhost:3000を開くと、、、

<img width="310" alt="server_go.png" src="https://qiita-image-store.s3.amazonaws.com/0/239663/c88726be-72c6-77ab-3328-e6831e71921d.png">
成功！！

control+c でサーバーを止めた後、

```
$go run server.go
```

で再起動した後、

http://localhost:3000/I/am/here

にアクセスすると
<img width="343" alt="server2_go.png" src="https://qiita-image-store.s3.amazonaws.com/0/239663/456135e9-8a0d-c107-4f43-235cd37fe3cc.png">
......

これが、fmt.Fprintf(x, "Hello, World ,%s!" ,y.URL.Path[1:])  の%sとy.URL.Path[1:]の実行結果。
あ、`/I/am/here`の部分ね
【Amazon Linux 2 でも使える！】systemctl 等コマンドチートシート

コマンド `systemctl` のオプションってなんであんな長いんだろう…
ということでチートシートを作りました。

## オプション
よく使うオプション。

```shell-session
--no-pager   # リスト表示するときなどにページング処理をしない
--all        # inactive なものもリストする
```

## ランレベル

デフォルトのランレベルの設定は、従来のように `/etc/inittab` は編集しない。（そして以下のコマンドは、`/etc/inittab` でも説明されている。）

```shell-session
systemctl get-default                         # 確認
sudo systemctl set-default multi-user.target  # runlevel 3
sudo systemctl set-default graphical.target   # runlebel 5
```

## 一覧リスト

Unitをリストする。

```shell-session
systemctl list-unit --type=service
systemctl --type=service                  # そして list-unit は省略してよい
systemctl --type=target                   # 他に、 mount,swap,device,socket の type 指定もできる
systemctl --type=service --state=running  # Daemon型で running なもの
```

定義一覧。

```shell-session
systemctl list-unit-files --type=service
```

Unitの依存関係を確認する。

```shell-session
systemctl list-dependencies 
systemctl list-dependencies Unit名
systemctl list-dependencies Unit名 --after  # Unit名より先に起動するもの
systemctl list-dependencies Unit名 --before # Unit名より後に起動するもの
```

## Unit操作

自動起動の有効化と無効化。
（以下、例：httpd.serviceについて。ユニット名はhttpdなので`.service`は省略可能）

```shell-session
systemctl enable httpd
systemctl disable httpd
systemctl is-enabled httpd    # 有効化状態確認
```

状態表示。

```shell-session
systemctl status httpd
systemctl status httpd -l            # 省略せずに表示
systemctl status httpd -H ホスト名    # 別ホストのを見る（ssh経由）
```

停止、起動、再起動。

```shell-session
sudo systemctl stop httpd
sudo systemctl start httpd
sudo systemctl restart httpd
sudo systemctl reload httpd
```

systemdの全体の設定ファイルの再読み込み。

```shell-session
sudo systemctl daemon-reload
```

## Cgroups

Cgroupsごとの確認。コマンドが違うことに注意。

```shell-session
systemd-cgls     # Cgroupsごとにツリー形式で分類表示
systemd-cgtop    # Cgroups単位でのtopコマンドライクなリソース使用状況表示
```

## kill

killする。

```shell-session
sudo systemctl kill -s9 httpd
```

## ログ

systemd で管理されたユニットは、`journalctl` でログが確認できる。

ログを見る。

```shell-session
journalctl -u httpd
journalctl -u httpd --all               # -a と同じ。長い出力を省略しない。
journalctl -u httpd --no-pager
journalctl -u httpd -f                  # tail -f のように振る舞う
journalctl -u httpd -o json-pretty      # json形式で
journalctl -u httpd --since=yesterday   # -S でも同じ。"today" や "2012-10-30 18:17:16" も可
journalctl -u httpd --until=yesterday   # -U でも同じ。"today" や "2012-10-30 18:17:16" も可
```
【G検定】まとめノート（人物編）

# はじめに
G検定に人物の知識が問われるわけで、 ~~カンペを作成~~知識を整理するためにメモを公開したいと思う。選択肢を削除する際に使えるメモにしたい。

## [ジェフリー・ヒントン](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%82%A7%E3%83%95%E3%83%AA%E3%83%BC%E3%83%BB%E3%83%92%E3%83%B3%E3%83%88%E3%83%B3)
ディープラーニングの父。今は、トロント大学の教授で、Google Brainプロジェクトの研究者でもある。
2006年にはオートエンコーダや深層信念ネットワークという手法を提唱。ディープラーニングの基礎を築く。
2012年には人工知能を用いて画像の認識力を競うコンテスト、「ILSVRC」ではディープラーニング（**AlexNet**）を用いて圧倒的に優勝する。

## [アラン・チューリング](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%A9%E3%83%B3%E3%83%BB%E3%83%81%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0)
人工知能ができたかどうかを判定するテストである「チューリングテスト」を提唱。別の場所にいる人間がコンピュータと会話して、相手がコンピュータだと見抜けなければ知能があるとする。

## アンドリュー・ング
「Google Brain」や「coursera」の立ち上げにたずさわる。今はBaidu研究所に勤務。

## ヤン・ルカン
Facebookの人工知能研究所やニューヨーク大学に勤務。
LeNetと呼ばれる有名なCNNモデルを考えた。手書き数字を集めたデータセット「MNIST」を作った。
GANを高く評価した。

## レイ・カーツワイル
未来学者で「シンギュラリティ」という人工知能が人間よりも賢くなる年が来ることを予見する。

## ジョン・マッカーシー
パトリック・ヘイズとの共同論文でフレーム問題を提唱。余談だが、LISP言語を作った人。

## ジョセフ・アイゼンバウム
人工無能として有名な「ELIZA」を書き上げた人。

## ジョン・サール
[強いＡＩ・弱いＡＩ](https://ja.wikipedia.org/wiki/%E5%BC%B7%E3%81%84AI%E3%81%A8%E5%BC%B1%E3%81%84AI)という用語を作った人。[中国語の部屋](https://ja.wikipedia.org/wiki/%E4%B8%AD%E5%9B%BD%E8%AA%9E%E3%81%AE%E9%83%A8%E5%B1%8B)という思考実験をする。

## ロジャー・ペンローズ
『皇帝の新しい心』という著書の中で「強いＡＩ」は実現できないと主張。

## ダニエル・デネット
フレーム問題の難しさを伝えるために、ロボットのたとえを挙げた。

## スティーブン・ホーキング
「人工知能の進化は人類の終焉を意味する」と発言。

## [イーロン・マスク](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%BC%E3%83%AD%E3%83%B3%E3%83%BB%E3%83%9E%E3%82%B9%E3%82%AF)
人工知能を研究する非営利団体の一つである「Open AI」の創業者の一人。
人工知能に対して「人工知能にはかなり慎重に取り組む必要がある。結果的に悪魔を呼び出していることになるからだ。」という脅威論を述べる。

## オレン・エツィオーニ
人工知能に対して「コンピュータが世界制覇するという終末論的構想は『馬鹿げている』としか言いようがない」と発言し脅威論をけん制した。

## 福島邦彦
CNNの原型ともいえる、単純型細胞と複雑型細胞の２つの細胞の働きを組み込んだモデルである「ネオコグニトロン」を提唱。

## アーサー・サミュエル
機械学習を「明示的にプログラムしなくても学習する能力をコンピュータに与える研究分野」と定義した。

## イアン・グッドフェロー
生成ネットワークと識別ネットワークからなる教師なし学習手法である**敵対的生成ネットワーク**を提唱した。ヤン・ルカンはGANについて「機械学習において、この10年間で最も面白いアイデア」であると評価した。

## デミス・ハサビス
DeepMindの設立者。
JavaScriptで月末、月初を取得するなら「date-fns」が超簡単

# 結論
## めっちゃ簡単だった。

# 「date-fns」インストール
いずれの方法で「date-fns」を使用できます。

npm or yarn

```sh
npm install date-fns --save
#or
yarn add date-fns
```
cdn

```html
<script src="http://cdn.date-fns.org/VERSION/date_fns.min.js"></script>
```

# 月末、月初を取得するサンプルコード
「date-fns」のメソッドを使用するためには、まずimportが必要です。
inportしたメソッドを使って変数に入れれば、後は煮るなり焼くなりできます。

```js
import startOfMonth from 'date-fns/start_of_month';
import subMonths from 'date-fns/sub_months';
import subDays from 'date-fns/sub_days';

const today = new Date; //今日の日付を取得
const startDay = startOfMonth(today); //今月1日を取得
const lastMonthStartDay = subMonths(startDay, +1); //subMonthsで月に対して加減ができる
const lastMonthEndDay = subDays(startDay, +1); //subDaysで日に対して加減ができる

console.log(lastMonthStartDay); //先月の月初
console.log(lastMonthEndDay); //先月の月末
```

**startDay**までは単純にメソッドを使うだけです。
**subMonths**と**subDays**メソッドは、第二引数に加減を加えることで、月日を変更できます。

今月が2月だとしたら、上記のサンプルでのconsole.logは**1月**になります。

# 所感
date-pickerと併用すれば、日付を扱うアプリケーションで有効活用できそうです！
ScalaでHttpClientを使って、HttpRequest(GET)を送る

#はじめに
Scalaを勉強し始めたので、学んだ内容を整理していきます。

今回は、HttpRequest(GET)を送る方法について調べて実装しました。


#実装方法
今回は、HttpResponseに基づいた処理や、例外発生時の処理については考慮していません。

```HttpRequestSample.scala
import java.nio.charset.StandardCharsets
import java.util
import org.apache.http.NameValuePair
import org.apache.http.client.entity.UrlEncodedFormEntity
import org.apache.http.client.methods.{CloseableHttpResponse, HttpGet, HttpPost}
import org.apache.http.impl.client.HttpClients
import org.apache.http.message.BasicNameValuePair
import org.apache.http.util.EntityUtils

object HttpRequestSamples extends App {

  //コンストラクタ
  getHttpRequest()

  //HttpRequest(GET)を送るためのメソッド
  def getHttpRequest()={
    val charset = StandardCharsets.UTF_8
    val httpclient = HttpClients.createDefault()
    val getRequest = new HttpGet("https://www.google.co.jp/")

    var response: CloseableHttpResponse = null
    try {
      response = httpclient.execute(getRequest)

      //結果を簡易的に表示する
      val statusCode = response.getStatusLine().getStatusCode()
      val responseBody = EntityUtils.toString(response.getEntity(), charset)
      println("StatusCode: " + statusCode)
      println("ResponseBody: " + responseBody)

    } catch {
      //例外発生時の処理
      case e: Exception => e.printStackTrace()
    }
  }
}
```

#参考資料
[Scala の HttpClient の使い方 (Get)](https://qiita.com/ekzemplaro/items/7da9ce3ed547b34cc63d)
Reactで日本語PDFの帳票をクライアント生成してダウンロードさせる方法canvas版

# 前置き
現在の関わっているReactプロジェクトでPDFの帳票を作ってダウンロードをさせるという部分があり、チームとして開発した知見を公開します。


## 使うもの
- [pdfmake](https://github.com/bpampuch/pdfmake)
- [html2canvas](https://html2canvas.hertzen.com/)
- [paper.css](https://github.com/cognitom/paper-css)


## どうするのか

まずGoggleで「react pdf」検索すると出てくるのがQiitaのこの記事です。
https://qiita.com/maecho/items/071abbb60dcbeabef7a6
https://qiita.com/rio1228/items/dbab910036d54487f6b9

しかしながら、この記事ではpdfmakeの素の文字機能を使っており、日本語でのPDF帳票ができるところまでなかなか難しい。
今回紹介する方法ではDOMをcanvasにしてしまっているので、それをPDFに出力すればOKです。

この方法であれば、Webフォントをどれでも使うことができるし、手軽にWEBの技術のレイアウトで帳票を作れるので、もしこういう課題にあったら参考になると思います。

## 必要なライブラリのインストール

```
npm install --save html2canvas pdfmake 
```


参考のソースはCodesandboxに作ったのでこちらを見てください。
StyledComponentsなのでCSSはなるだけ読み込みたくない！という思想でpaper.cssの内容をinjectGlobalしています。

~~もしも画面内プレビューがいらない場合は、印刷するコンテンツをこのようにすっ飛ばすと良いようです。~~
印刷する要素が画面内にあるとCanvasにする時に大きく崩れることがあるみたいなので、印刷するelementは画面外にすっ飛ばしてください。(もっといいやり方があるかもしれないので調査必要)
プレビューは同じコンポーネントを見える範囲に配置してください


https://codesandbox.io/s/j4no5lvj03


paper.cssを完全styled-componentsにしたり、logic.jsを単体のnpmライブラリにしちゃっていいんじゃないのという発展も考えられますが、まずは公開することが大事なので暇があればやります。
あとこのやり方、今は複数ページ印刷にも対応してないです。
高さが固定してないページのPDF化も対応してないです。
HTML5で使用するdatalist,option,select,optgroupはCSSが適用できない。代わりにJavaScriptでDOM要素を変更する必要がある

vue.jsを使いながら、HTMLについて色々調べていたら、datalistっていうのを初めて知った。
かなり便利なHTMLタグです。簡単にコンボボックスを実装できる。
以下のようなソースだと、inputタグのlist属性にvalue値を設定するだけで、クリック時にリストを表示できる。

しかしながら、難点があって、**CSSが適用できない**という制約があるため、リスト自体を装飾したり、リストの幅を大きくしたり、カスタマイズしたいなら、JavaScriptなどでDOM要素を変更する必要がある。

```sample.html
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
</head>

<body>
    <input type="search" name="q" autocomplete="on" list="keywords">
    <datalist id="keywords">
        <option>test1</option>
        <option>test2</option>
        <option>test3</option>
    </datalist>
</body>
</html>
```
そして表示は以下の通りになる。

![スクリーンショット 2019-02-06 22.40.23.png](https://qiita-image-store.s3.amazonaws.com/0/127391/169aa034-0eee-cacf-4010-4c0bc6e3348c.png)

ちなみに以下のCSS要素はinput要素に対して適用されているため、黒くなる。

```css
input[list] {
        background-color: #0f0f0f;
    }
```

結果

![スクリーンショット 2019-02-06 22.50.14.png](https://qiita-image-store.s3.amazonaws.com/0/127391/aaa041f9-645f-4e7e-c3be-af46cecab913.png)

[Styling HTML forms](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Styling_HTML_forms#The_ugly)
[カスタムフォームウィジェットの作り方](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/How_to_build_custom_form_widgets)
VBAのソースを、Gitとかで管理する


## 問題点
業務でVBAを使うことがたまにありますが、Excelとか、Accessとかバイナリの中に組み込まれていて、Diffをとったりマージしたりが大変です。手作業でExportしてGitに入れてとかやったりもできますが、非常に面倒です。

## ツール
そんな問題を解決するツールを見つけました。Excel、Word、Accessに対応していて、非常に便利だったので紹介しておきます。

[いげ太](http://igeta-diary.blogspot.com/2014/03/what-is-vbac.html)さんが作成されたものですが、かなり秀逸です。

## ダウンロード
Gitで公開されていますので、[こちら](https://github.com/vbaidiot/Ariawase)からダウンロードしてください。
ダウンロードしたファイルの中に、vbca.wsfというファイルがありますので、今回はこれを使います。

## 事前準備
Excelはセキュリティの設定を少し変更する必要があります。
セキュリティセンタから「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」をチェックしておいてください。
![image](https://qiita-image-store.s3.amazonaws.com/0/132118/7e5213ac-e923-d6a1-d590-a46ddaaa7954.png)

## 使い方

作業はコマンドプロンプト上でやるんですが、vbac.wsf をおいて、同じフォルダにbinフォルダを作成。
そこに、対象となるVBA入りのExcelファイル等を置きます。

### 分割
```bash
>cscript vbac.wsf decombine
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

begin decombine

> Target: sample.xlsm
- Export: Sheet1.dcm
- Export: Module1.bas
- Export: Class1.cls
- Export: UserForm1.frm
- Export: UserForm1.frx

end
```

srcというディレクトリが作成され、そこにモジュールが出力されました。
無事フォームも出力されています。
シートの内容等は出力されないため、シート本体も保存は必要です。

### 統合

```bash
>cscript vbac.wsf combine
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

begin combine

> Target: sample.xlsm
- Import: Class1.cls
- Import: Module1.bas
- Import: Sheet1.dcm
- Import: UserForm1.frm
- Import: UserForm1.frx

end
```

# おわりに
現在の現場ではEUCツールという大量のバージョン管理されていないExcel、Accessが存在します。
いつかGitにのせて並行開発もできるようにしてあげようと思います。
FireBase HTTP Error: 500, Internal error encountered.

エラー内容！！

```
$ firebase deploy --project miniminiapp-4a450

=== Deploying to 'miniminiapp-4a450'...

i  deploying hosting

Error: HTTP Error: 500, Internal error encountered.

Having trouble? Try again or contact support with contents of firebase-debug.log
```

内部エラーなのかな？どうしよう？結果

[確認しにいく](https://status.firebase.google.com/)

<img width="1029" alt="スクリーンショット 2019-02-06 22.45.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/d733789c-7fb7-be4b-022c-4e913aadb6ba.png">
<img width="1043" alt="スクリーンショット 2019-02-06 22.45.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/d9561e1b-da9c-cf67-2e2f-445daaee2274.png">

…停止しているらしい。もう待つしかない(o*｡_｡)o

追記:動くの待った後で行ったら無事にエラーなくできました！めでたし。めでたし。

これで停止されていないようなら以下コマンドでトークン再取得でうまくいった方もいるみたいなので是非

```
$ firebase login:ci
```

そのほかにツールのダウングレードでうまくいった方もいるとか

```
$ npm install -g firebase-tools@3.19.3
```


#参考
https://github.com/firebase/firebase-tools/issues/865
MacBook Pro (13-inch, 2018) を macOS High Sierra から Mojave にアップデートする際に困ったことと解決策

#MacBook Pro 購入しました:grinning:
今までは、MacBook 13-inch, late 2009, macOS High Sierra を使用していました。
intel Core 2 Duo の非力なマシンでしたが、メモリを8GBに、ストレージを512GB SSDに換装して iPhone アプリを開発していました。
快適に作動はしていましたが、MacBook, late 2009 には Mojave をインストールできません。そろそろ替え時かなと思い、MacBook Pro (13-inch, 2018, Touch Bar モデル)を購入しました。
TimeMachine で MacBook, late 2009 の環境をそのまま新しいマシンに移行しました。
retina display の鮮明さと処理速度の速さ、本体自体の薄さ・軽さ（旧マシンの約半分）に驚嘆しています:smiley:
##Mojave のダウンロードは無事終了。
その後、App Store から Mojave をダウンロードしました。
結構時間がかかりましたが、無事にダウンロードが完了しました。
##"macOSをインストールするにはインターネットに接続する必要があります"というメッセージが現れて、ふりだしに戻る。
ダウンロード完了後にインストールしようとした所、インストール残り30秒くらいで、"macOSをインストールするにはインターネットに接続する必要があります"というメッセージが表示されました。インターネットに接続しているのにおかしいな？と思いながらOKボタンを押すと、インストール開始の画面に戻ってしまいました。インストールを何回も試みましたが、何回やっても同じメッセージが出てふりだしに戻ってしまいました。
##T2チップの問題か。
ネットで検索してみると、Touch Bar の T2チップを搭載したモデルで High Sierra から Mojave へのアップデートがうまくいかない例があるようでした。WiFi の認証がうまくいかないことがあるそうです。
##iPhone テザリング接続で解決。
本体の WiFi をオフにして、iPhone のテザリングでネットに接続（iPhone 側も WiFi を使用せず4G回線にしておく）してからインストールを試みました。その結果、前述のメッセージが出なくなり無事に Mojave にアップデートすることが出来ました。

以上、解決策の一つとして皆様のご参考になれば幸いです。

※ Mojave をダウンロードする時は、普通に WiFi 接続で大丈夫です。ダウンロード完了後、インストールする場面でテザリング接続に切り替えました。
【Java】標準出力で簡単な模様を描く

# はじめに

頭の体操レベルですが、標準出力で簡単な模様を描くコードを作ってみました。
元々は職場で新人向けの課題として作ったものなので、Java初学者の方にはちょっとした力試しになるかもしれません。

# 細かな市松模様（チェック）を描画する

```text:細かな市松模様の出力イメージ
*.*.*.*.*.
.*.*.*.*.*
*.*.*.*.*.
.*.*.*.*.*
*.*.*.*.*.
.*.*.*.*.*
*.*.*.*.*.
.*.*.*.*.*
*.*.*.*.*.
.*.*.*.*.*
```

* 出力イメージでは"*"と"."が交互に描画されているので、行番号と列番号を使って出力する文字を1つずつ切り替えています。

```java:細かな市松模様を描画するコード
/**
 * 細かな市松模様（チェック）を描画する。
 * @param outputSize 描画サイズ（桁数）。
 */
public static void printFineCheckered(int outputSize) {

	// 行方向への移動
	for (int i=0; i<outputSize; i++) {

		// 列方向への移動
		for (int j=0; j<outputSize; j++) {

			if ((i+j)%2==0) {
				System.out.print("*");
			} else {
				System.out.print(".");
			}

		}

		// 改行を入れる
		System.out.print(System.lineSeparator());

	}
}
```

# バツ印を描画する

```text:バツ印の出力イメージ
*........*
.*......*.
..*....*..
...*..*...
....**....
....**....
...*..*...
..*....*..
.*......*.
*........*
```

* 「左上から右下に伸びる線」は簡単に描画できますが、「左下から右上に伸びる線」の条件がパッと出てこない、あるいは間違いやすいかもしれません。

```java:バツ印を描画するコード
/**
 * バツ印を描画する。
 * @param outputSize 描画サイズ（桁数）。
 */
public static void printCrossMark(int outputSize) {

	// 行方向への移動
	for (int i=0; i<outputSize; i++) {

		// 列方向への移動
		for (int j=0; j<outputSize; j++) {

			if (i==j) {
				// 左上から右下に伸びる線
				System.out.print("*");
			} else if (i+j==outputSize-1) {
				// 左下から右上に伸びる線
				System.out.print("*");
			} else {
				System.out.print(".");
			}

		}

		// 改行を入れる
		System.out.print(System.lineSeparator());

	}
}
```

# 市松模様（チェック）を描画する

## 出力イメージ

* この画面だと見づらいですが、以下の出力イメージをテキストエディタに貼り付けると、市松模様が分かりやすいと思います。

```text:市松模様（チェック）の出力イメージ
**..**..**
**..**..**
..**..**..
..**..**..
**..**..**
**..**..**
..**..**..
..**..**..
**..**..**
**..**..**
```

* 市松模様は「4行4列」の単位で1つのブロックになっているので、それを発見・理解できるかどうかが一つのカギになりそうです。
* コードそのものは、以下のようにそれほど難しくはないと思います。

```java:市松模様（チェック）を描画するコード
/**
 * 市松模様を描画する。
 * @param outputSize 描画サイズ（桁数）。
 */
public static void printIchimatsu(int outputSize) {

	// 行方向への移動
	for (int i=0; i<outputSize; i++) {

		// 列方向への移動
		for (int j=0; j<outputSize; j++) {

			int rowIndex = i%4;
			int colIndex = j%4;

			if (rowIndex<2 && colIndex<2) {
				System.out.print("*");
			} else if (rowIndex>=2 && colIndex>=2) {
				System.out.print("*");
			} else {
				System.out.print(".");
			}

		}

		// 改行を入れる
		System.out.print(System.lineSeparator());
	}
}
```
Unix系OSのトレンド

# 概要

以下の3種類毎にどのOSがよく使われるのか調べてみた。

- 汎用OS
- Docker image用OS
- Container OS

# 汎用OS

## 種類

いろいろあるようだ・・・。

[最も人気のLinuxはどれ？さまざまな角度から検証](https://japan.zdnet.com/article/35118481/)
[2018年版Linuxディストリビューション10選](https://news.mynavi.jp/article/20180306-594776/)

## トレンド

どのOSがどれだけ使われているかは定かではないが、Googleでの検索件数を調べたところ、Ubuntuがダントツ。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Google トレンドで「Ubuntu, CentOS, Arch Linux, Linux Mint, Google Chrome OS - すべての国、過去 12 か月間」の 人気度の動向 を見る - <a href="https://t.co/x9PlAVLJBU">https://t.co/x9PlAVLJBU</a></p>&mdash; kannkyo (@kannkyoshi) <a href="https://twitter.com/kannkyoshi/status/1093132629719674880?ref_src=twsrc%5Etfw">2019年2月6日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Google トレンドで「Ubuntu, Container Linux by CoreOS, SUSE Linux, Debian, Red Hat Linux - すべての国、過去 12 か月間」の 人気度の動向 を見る - <a href="https://t.co/DvlYkypjkd">https://t.co/DvlYkypjkd</a></p>&mdash; kannkyo (@kannkyoshi) <a href="https://twitter.com/kannkyoshi/status/1093135880997326849?ref_src=twsrc%5Etfw">2019年2月6日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# Docker image用OS

Docker imageによく使われるOS。

## 種類＆トレンド

以下のサイトで見れるが16種類が確認できる。
一番人気からalpine、Ubuntu、CentOSの順。

[Operating Systems - Docker Hub](https://hub.docker.com/search?q=&type=image&category=os)


# Container OS

Container OSとはコンテナ管理用のOSのこと。

## 種類

- 独立系
    - [Project Atomic](https://www.projectatomic.io/)
    - [RancherOS](https://rancher.com/rancher-os/)
    - [Mesosphere DC/OS](https://mesosphere.com/product/)
- Redhat
    - [Container Linux by CoreOS](https://coreos.com/os/docs/latest/)
- Ubuntu
    - [Ubuntu Core](https://www.ubuntu.com/core)
- VMWare
    - [Photon OS](https://vmware.github.io/photon/)

参考サイト
https://www.inovex.de/blog/docker-a-comparison-of-minimalistic-operating-systems/
https://blog.codeship.com/container-os-comparison/


## トレンド

トレンドはこんな感じ。Container Linux by CoreOSが勝っている。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Google トレンドで「Rancher OS, Container Linux by CoreOS, Photon OS, Ubuntu Core, Mesosphere - すべての国、過去 12 か月間」の 人気度の動向 を見る - <a href="https://t.co/eBp8EEoitN">https://t.co/eBp8EEoitN</a></p>&mdash; kannkyo (@kannkyoshi) <a href="https://twitter.com/kannkyoshi/status/1093140369682788353?ref_src=twsrc%5Etfw">2019年2月6日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Vue.jsへのfirebaseの導入と基本的な使い方


## ライブラリのインストール

yarn or npm のどちらか使用している方を実行しよう

```bash
yarn add firebase --save
npm install firebase --save
```

## 設定ファイルを設置

configフォルダを作成し、その中に以下のファイルを設置する

```firebase-config.js
export const firebaseConfig = {
  apiKey: 'hoge',
  authDomain: 'hoge',
  databaseURL: 'hoge',
  projectId: 'hoge',
  storageBucket: 'hoge',
  messagingSenderId: 'hoge'
}
```
中身は以下のボタンを押したら表示されるのでコピペしよう

<img width="1270" alt="スクリーンショット 2019-02-06 22.07.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/230651/7f835320-3db2-3dfd-94e2-a695906defe6.png">

## firebaseを使えるようにする

main.jsに以下の内容を追加する

```main.js
import firebase from 'firebase'
import { firebaseConfig } from './../config/firebase-config'
firebase.initializeApp(firebaseConfig)

```

## 実際に使用する

### firestoreのデータを取得・表示する

companiesというコレクションの全ドキュメントを参照する
参考（公式ドキュメント）：https://firebase.google.com/docs/firestore/query-data/get-data

```js
import firebase from "firebase";
export default {
  created: function() {
    this.firestore = firebase.firestore();
    this.companies = this.firestore.collection("companies");

    this.companies
      .get()
      .then(function(querySnapshot) {
        querySnapshot.forEach(function(doc) {
          // doc.data() is never undefined for query doc snapshots
          console.log(doc.id, " => ", doc.data());
        });
      })
      .catch(function(error) {
        console.log("Error getting documents: ", error);
      });
  }
};
```
Rxswiftのよく出る単語をまとめてみた

RxSwiftを始めたばかりで、色々な用語があり自分なりにまとめてみました。
全部まとめるとボリュームが多いので、個人的によく見かけた単語について書いています！


#RxSwiftとは
RxとはReactive Extensionsの略で非同期処理やイベント処理などを宣言的に記述することができるライブラリです。そのRxでSwift版としてリリースしたものががRxswiftです。種類はSwift以外にも多数の言語が用意されています。[Rxの公式サイト](http://reactivex.io/)
またFRP(Functional Reactive Programming)の一つで、FRPの例としてコードで表すと下記のようになります。


```swift
a = 1
b = 2
c = a + b
a = 2
print(c)
//３ではない
//　出力は4になる
```

これは「a + b」の関係を宣言的に記述することで、その時点の「a + b」ではなく結果としての値が宣言されているので、後から変更された値で計算されます。

![スクリーンショット-2017-06-23-13.48.14.png](https://qiita-image-store.s3.amazonaws.com/0/122719/1b1daaf8-8c87-cd2a-23c8-ebfd4aa16211.png)
[【Swift】RxSwiftを理解する](https://fukatsu.tech/rxswift#Subject)より
イメージとしてはエクセルのような動きがわかりやすいです。
aかbの値の変化を監視し、もし変化したらトリガーとしてcの処理を走らせるイメージがFRPの例になります。


#RxSwiftの特徴

###メリット
・コードが全体が一貫する
・非同期処理を簡潔に書くことができる
・コールバックを減らせる

###デメリット
・学習コストが高い
・場合によってはコード量が多い

#良く出る単語をまとめてみた

###Observalble
「監視できる」という名前ですが、イベントなど検知するためのクラスです。
下記３種類のイベントを通知させます。
イベントを発生する事は出来ません。

| 種類 | 説明 |
|:--|:--|
| onNext | 通常のイベントを通知する。何度でも送る事が可能。 |
| onError | エラーの発生を通知する。一度だけ呼ばれ終了する。 |
| onCompleted | 完了を通知する。その時点で終了。 |



###subscribe（購読）

subscribeはonNextなどを通知を開始するための使うメソッドです。subscribeと書くことで、Observableを購読することができ、イベントが発生するたびにsubscribeにonNextの中にある処理が実行されます。ややこしいですがその処理のことをObserverと呼び、Observalbleと間違えやすいです。
使い方としては下記のように扱います。

```
let disposeBag = DisposeBag() //下に説明あり
let observable textField.rx.tap.asObservable()

let observable = Observable.of("1","2","3")
_ = observable
.subscribe(onNext: {
  print($0))
}, onError: { _ in
  print("error")
}, onCompleted: {
  print("終了")
}).disposed(by: disposeBag)
```


###disposebag
subscribe(onNext等)をするといつまでたっても解除されずメモリーリークなどを起こします。
そこでdisposeBagに登録しておくことで、このクロージャを抜けた時にdisposeBagは開放されるので、そのタイミングで購読処理も解除されます。
購読(subscribe)をしたら、それを解除するために解除(disposeBag)を書いておけば概ね間違ってはないと思います。

###subject　
Subjectは、ObservableとObserverの両方の機能を持っています。
subscriveしたら購読することが出来るObservableとしての機能をもち、onNextなどイベントを発生させることができます。
中でも代表的な3つのsubjectを紹介します。

| クラス | 説明 |
|:--|:--|
| PublishSubject | subscribe後のイベントをだけを流す、過去の値も流れない |
| BehaviorSubject | subscribe時に、一つ過去のevent(最初にsubscribeする場合は初期値)を受け取れるSubject。|
| ReplaySubject | subscribe時に指定したbufferSize分の過去のeventを受け取れるSubject。 |

参照させて頂きました！
https://qiita.com/KentaKudo/items/4d7154c3dada93f11492


###Relay

エラーを流さない、completeを流さないsubjectです。Nextのみ流せるようにしています。
PublishRelayはPublishSubjectのwrapper。
BehaviorRelayはBehaviorSubjectのwrapperになります。



###operator

イベントの加工をするためのメソッドをoperator(オペレーター)と言います。
よく使われるものとしてはイベントの各要素を別の要素に変換するmapや指定条件が true になるイベントだけを通過させるfilterなどが挙げられます。
operatorは多く種類があり、下記のサイトにてまとめてくれています！
[RxSwiftの機能カタログ](https://qiita.com/k5n/items/e80ab6bff4bbb170122d#observablestandardsequenceoperators)
AWS Comprehendで感情分析：第1回ポジティブ歌詞王者決定戦

# 概要
AWSの10分間チュートリアルの中にテキストを食わせて感情分析ができる機能があった。
面白そうなので導入がてらどのロックンロールが一番ポジティブなのか比較してみた。

# 参考URL
https://aws.amazon.com/jp/getting-started/tutorials/analyze-sentiment-comprehend/?trk=gs_card

# 目次
  - 対応言語
  - 入力画面UI
  - 分析項目紹介
  - 対象歌詞と分析結果
  - 考察(というより感想)
  - 所詮はお遊びなので・・・


# 対応言語
[残念ながら今の所日本語は対応してなかった。。。](https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/supported-languages.html)
というわけで対象は英歌詞に限定するものとする。

# 入力画面UI
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/336360/6da647ad-4e37-9336-9a6a-74066c013e87.png)

こちらも日本語非対応。Input textの中に文章放り込んでAnalyzeを押下する。

# 分析項目紹介
Confidenceと書いてあった場合は、対象の分類結果への信頼度を表している。
1に近づくほど確度は高いが、1には絶対ならないので最高は0.99+と表現される。

## Entites
文書内のエンティティ（固有名詞、日付、数量など特徴的な意味を見出しやすい単語）。
![entity.PNG](https://qiita-image-store.s3.amazonaws.com/0/336360/8bf9f802-a835-f0cf-2f3e-f18a53b5f4af.png)


## Key Phrases
文章中のキーワードと思われる単語。
![key_phrase.PNG](https://qiita-image-store.s3.amazonaws.com/0/336360/5767b429-3336-b707-d60f-67c25d86f03d.png)


## Language
文章中で最も頻出している言語。
![language.PNG](https://qiita-image-store.s3.amazonaws.com/0/336360/d9366772-4b85-4189-6ae4-a5b4906e1c21.png)


## Sentiment
でました。これぞ今回の主役「感情分析」。

 - Neutral:中立的（特段感情的でない）
 - Positive:正の感情がこもった文章
 - Negative:負の感情がこもった文章
 - Mixed:悲喜こもごもな複雑な感情のこもった文章
![sentiment.PNG](https://qiita-image-store.s3.amazonaws.com/0/336360/7bbac4d9-161e-fea8-2bdf-0cd3ebcd4a14.png)


## Syntax
単語に分割して品詞に分類。
![syntax.PNG](https://qiita-image-store.s3.amazonaws.com/0/336360/2af59e6d-89c3-3340-ead7-68b444128cef.png)


# 対象歌詞と分析結果
選曲は適当にポジティブそうなロックを5曲。評価基準は単純にPositiveのConfidenceの大小で決めるものとする。

|順位|タイトル|歌手/バンド名|歌詞URL|PositiveのConfidence|
|---|---|---|---|---|
|1|Dream On|Aerosmith|https://www.azlyrics.com/lyrics/aerosmith/dreamon.html|0.92|
|2|Don't Stop Me Now|Queen|https://www.azlyrics.com/lyrics/queen/dontstopmenow.html|0.84|
|3|Highway Star|Deep Purple|https://www.azlyrics.com/lyrics/deeppurple/highwaystar.html|0.79|
|4|It's My Life|Bon Jovi|https://www.azlyrics.com/lyrics/bonjovi/itsmylife.html|0.69|
|5|Don't Stop Believin'|Journey|https://www.azlyrics.com/lyrics/journey/dontstopbelievin.html|0.10|

結論：Aerosmith優勝


# 考察(というより感想)
 - ランキングとして
    - Don't Stop Believin'が思いの外ポジティブじゃなかった。一般的にポジティブな曲として認知されていることと、歌詞としてポジティブかどうかは別物らしい。
    - 鬱な気分になったときにはDream Onをおすすめする。
 - 分析ツールとして
    - だいぶ大雑把な分析しかできない印象。ポジティブかネガティブかくらいしか判断できない。
    - 大雑把すぎるのでせいぜいレビュー解析とかにしか使えなさそう。まだまだ活用の幅は狭いと思われる。
    - 例えばだが[プルチックの感情の輪](https://swingroot.com/plutchik-emotion/)とかくらいまで細かく出してくれるとありがたい。
    - で、文章のどの部分にどんな感情が詰まってるかとかぐらいまで色分けしてくれたりするともっと使いみち増えそうな気がする。例えばもらったメールの内容を感情分析できたとしたら、営業担当とか採用担当とか助かるんじゃなかろうか？（ひょっとしたら彼らの仕事を食ってしまうかもしれないが）

# 所詮はお遊びなので・・・
あまりおもしろい分析結果ではなかったと思う。サンプルも少なすぎるし分析もシンプルの極みなので、もう少しComprehendについてナレッジが溜まってきたら再チャレンジ予定。次回はウェブスクレイピングとかで対象データをもっと大量に収集し、真面目に評価指標考え、もう少し読んでて面白い分析やってみよう思う。

あくまでチュートリアル触ってみたということで。興味がでたら諸兄たちにも遊んでみていただきたい。
3桁ごとに区切りつつ、小数点以下3桁までを表示しつつ、小数点以下は無駄に0を表示したくない

# 3桁ごとに区切りつつ、小数点以下3桁までを表示しつつ、小数点以下は無駄に0を表示したくない

掲題の通りの書式文字列は `#,0.###` になります.

```powershell
PS> (10000.1234).ToString("#,0.###")
10,000.123
PS> (10000.1).ToString("#,0.###")
10,000.1
```
[Android]  MPAndroidChartを使った色付きPieChartの実装メモ

MPAndroidChartライブラリを使用して、色付きPieChartを作成したときの実装メモです。

参考URL:
MPAndroid Chart: https://github.com/PhilJay/MPAndroidChart
Wiki Getting Started: https://github.com/PhilJay/MPAndroidChart/wiki/Getting-Started
Wiki Setting Data: https://github.com/PhilJay/MPAndroidChart/wiki/Setting-Data

#作るもの
月ごとの降水量の割合を示したPieChartです。
月をクリックするとちょっと拡大します。
<img width="481" alt="スクリーンショット 2019-02-06 21.55.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/281645/059f585b-a369-8be0-07dd-07339312f95c.png">

#build.gradle
```gradle:build.gradle
allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

dependencies {
    implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
}
```

#Activity
```java:MainActivity.java
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.github.mikephil.charting.charts.PieChart;
import com.github.mikephil.charting.data.PieData;
import com.github.mikephil.charting.data.PieDataSet;
import com.github.mikephil.charting.data.PieEntry;
import com.github.mikephil.charting.utils.ColorTemplate;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity {

    float rainfall[] = {98.8f, 123.8f, 34.6f, 43.9f, 69.4f, 12.5f, 52.8f, 158.6f,
            203.6f, 30.7f, 160.7f, 159.7f };
    String monthNames[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
            "Sep", "Oct", "Nov", "Dec"};


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setupPieChart();
    }


    private void setupPieChart() {
        //PieEntriesのリストを作成する:
        List<PieEntry> pieEntries = new ArrayList<>();
        for (int i = 0; i < rainfall.length; i++) {
            pieEntries.add(new PieEntry(rainfall[i], monthNames[i]));
        }

        PieDataSet dataSet = new PieDataSet(pieEntries, "Rainfall for Vancouver");
        dataSet.setColors(ColorTemplate.COLORFUL_COLORS);
        PieData data = new PieData(dataSet);

        //PieChartを取得する:
        PieChart piechart = (PieChart) findViewById(R.id.chart);
        piechart.setData(data);
        piechart.invalidate();
    }
}
```
※おまけメモ：
Fragmentに書くときは、「PieChart piechart = (PieChart) findViewById(R.id.chart);」が
「PieChart piechart = (PieChart) getView().findViewById(R.id.chart);」になる。

#Layout
```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.github.mikephil.charting.charts.PieChart
        android:id="@+id/chart"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</android.support.constraint.ConstraintLayout>
```

おわり！
[Excel]２つ目以降のファイル（ブック）を開くとウィンドウがずれるから固定する方法

## 概要

Excelを開いている状態でさらに別のブックを開こうとすると・・・

![1.png](https://qiita-image-store.s3.amazonaws.com/0/145504/4ffd9b83-4a34-d95d-944d-7d43795d7df4.png)

ウィンドウが右下にちょっとずれる！！（イラ〜っ）ってなりませんか？
なのでウィンドウの表示位置を固定する方法です。

## やり方

### 個人用マクロブックを開く（追加する）

まずは、「開発」タブ → 「Visual Basic」からVBEを開きます。
それから個人用マクロブックを開きます。
（プロジェクトから「VBAProject(PERSONAL.XLSB)」 → 「ThisWorkbook」を開く）

![2.png](https://qiita-image-store.s3.amazonaws.com/0/145504/2a262363-b321-c607-b3ea-c3bc0d2aa27e.png)

### PERSONAL.XLSBがない場合

「開発」タブ → 「マクロの記録」を選択して適当な名前でマクロを記録します。
この時マクロの保存先を「個人用マクロ　ブック」に設定します。
これでPERSONAL.XLSBが作成されます。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/145504/39e2c645-0883-9a3f-bd99-35f48c516b33.png)

### マクロを追加する

PERSONAL.XLSBのThisWorkbookに以下の通りコードを追加します。

```vb
Public WithEvents xlAPP As Application

' PERSONAL.XLSBのオープンイベント
Private Sub Workbook_Open()
    ' 他のブックのイベントも受け取れるようにする
    Set xlAPP = Application
End Sub

' 新規作成時のイベント
Private Sub xlAPP_NewWorkbook(ByVal Wb As Excel.Workbook)
    WindowReset
End Sub

' 既存ブックのオープンイベント
Private Sub xlAPP_WorkbookOpen(ByVal Wb As Excel.Workbook)
    ' 自身のオープンイベントは読み捨てる
    If Wb.Name = "PERSONAL.XLSB" Then
       Exit Sub
    End If
    
    WindowReset
End Sub

' Windowの初期位置を指定する
Private Sub WindowReset()
    Application.Top = 10
    Application.Left = 50
    Application.Width = 1280
    Application.Height = 760
End Sub

```

これでブックを開いた時や新規作成時にウィンドウを固定位置・サイズで表示できます。
（WindowResetの内容は適宜お好みに設定してください）

## 注意事項

VBAですのでマクロが無効化されているファイル（Webからダウンロードした直後で保護ビューが有効になっているなど）では機能しません。
macOS いつでもどこでもダークモード

Mojave でダークモード（ダークテーマ）の導入がすすんだ macOS ですが、多くのウェブサイトなどでは白い背景に目がやられてしまいます。ダークモードにしたいが、サイトをダークモードにするためのブラウザ拡張機能は入れたくない。

そんな時には画面色を反転させてしまいましょう。


## 色反転の前と後

例えば `Cmd + j` を入力するたびに画面色を反転させる、ようなことができます。

どうやらブラウザの中の画像や動画は反転されないようです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">macOS いつでもどこでもダークモード<a href="https://t.co/OXFwTjLpVD">https://t.co/OXFwTjLpVD</a><br>(Qiita に動画を埋め込むためのテストその2・YouTubeから共有)</p>&mdash; iris ʕ◔ϖ◔ʔ Hugo 布教中 (@piris314) <a href="https://twitter.com/piris314/status/1096045438568783876?ref_src=twsrc%5Etfw">February 14, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## 設定方法

<img src="https://qiita-image-store.s3.amazonaws.com/0/285675/9dcab2be-3f63-5f8d-9d13-4395839ff0e4.jpeg" width="600px">

1. System Preferences.app
2. Keyboard
3. Shortcuts
4. Accessibility
5. `Invert colors` にチェックを入れてお好きなショートカットキーを登録

今回の設定だと `Cmd + j` を入力するたびに画面色が反転します。これはブラウザだろうがアプリだろうがどこでも使える機能です。白い背景がまぶしいと思った時にお使いください。
deviseでツイッターログイン

[この記事](https://qiita.com/kami_zh/items/94aec2d94a2b4e9a1d0b)を元にdeviseを使ってツイッターでログインできるサイトを作る際、何個かエラーに遭遇したのでここに解決法を書いときます。
Railsのバージョンは5.1.6です。 

### Sign in with Twitter をクリックするとUnauthorized 403 Forbidden
 Twitter AppsのSettingで callback URLsに
http://127.0.0.1:3000/users/auth/twitter/callback
http://localhost:3000/users/auth/twitter/callback
を追加
[詳細](https://saruwakakun.com/memo/omniauth-twitter)

### Sign in with Twitterの後 undefined method `current_sign_in_at
```db/migrate/[time]_devise_create_users.rb
#...
## Trackable 以下のコメントを外す
t.integer  :sign_in_count, default: 0, null: false
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string   :current_sign_in_ip
t.string   :last_sign_in_ip
#...
```

### キャッシュでエラー
```app/controllers/users/omniauth_callbacks_controller.rb
  def callback_from(provider)
    provider = provider.to_s
 
    @user = User.find_for_oauth(request.env['omniauth.auth'])
 
    if @user.persisted?
      flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: provider.capitalize)
      sign_in_and_redirect @user, event: :authentication
    else
      # 最後に .except("extra") を付ける
      session["devise.#{provider}_data"] = request.env['omniauth.auth'].except("extra")
      redirect_to new_user_registration_url
    end
  end
```
Amazon Linux 2 サーバ設定メモ

以前、「[Amazon Linux サーバ基本設定メモ](https://qiita.com/Ping/items/09deb80a0be86d5e3145)」として、Amazon Linux の設定メモをまとめたのだが、Amazon Linux 2 の設定メモをまとめてみた。
CentOS7ベースになったのでOS基本設定の設定方法が従来と異なるし、2になってデフォルト設定が変わっているところもある。
最低限の設定集としてまとめた。

## OS設定

OSレベルの設定を行う。この設定を行ったあとには再起動をする。
以下、ec2-user アカウントでログイン済みであること前提。

### yum アップデート

インストールされているソフトウェアを最新の状態にする。

```
sudo yum update -y
```

### ローカライゼーション設定

ローカライゼーションの設定する。
なお、次のようなポリシーで進めるので悪しからず。

- OSレベルでローケル設定はしない。必要ならばアカウントごとに`環境変数 LANG`で設定する[^1]。もしOSレベルで設定する場合は、`localectl`を使って設定するとよい。
- キーボード設定もできるが、特に必要ないと思われるので割愛する。
- タイムゾーンは、サーバを日本で使う場合は日本時間に設定しておいたほうが楽なので、そうする。

[^1]: なお、Amazon Linux 2 では、アカウント `ec2-user` はデフォルトで `LANG` が `ja_JP.UTF-8` になっている。

#### タイムゾーン

`timedatectl` コマンドを使う。
表示される時刻 `Local time` を日本時間にしたりする。

```
timedatectl status                           # 現在の時刻設定情報の確認
timedatectl list-timezones                   # 設定できるタイムゾーンをリストする
sudo timedatectl set-timezone Asia/Tokyo     # タイムゾーンを設定する
```

### スワップ領域追加

スワップは基本用意されていない。必要であればスワップファイルを作成してスワップ領域を確保する。
固定で行う場合は、スワップファイルを作成後、`/etc/fstab` で設定しておけば、システム側で自動的に設定してくれる。[^2]

[^2]: `/usr/lib/systemd/system-generators/systemd-fstab-generator`が呼ばれて作成してくれている。



## サービスとソフトウェアの設定

### 不必要なサービスの停止

`ntsysv` と使うと、視覚的に管理ができるので、これを使ってみよう。
リスト中にSysV依存のものとsystemd依存のものとでそれぞれリスト化されている。

```shell-session
sudo ntsysv
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/98745/21087ead-5b25-1713-e4ed-66dc33828ec0.png)

私は次のサービスは止めた。参考まで。[^3]

|サービス名|停止の理由   |
|:-------|:-----|
|lvm2-lvmetad.socket |lvmを使わなければ停止|
|lvm2-lvmpolld.socket|lvmを使わなければ停止|
|lvm2-monitor.service|lvmを使わなければ停止|
|mdmonitor.service   |SoftwareRAIDを使っていないので停止|
|postfix.service     |外部にメールを送らない、またはSMSなどを使うなら必要ない|
|rpcbind.service     |NFSを使わないのであれば停止|
|rpcbind.socket      |NFSを使わないのであれば停止|

次のサービスは開始させた。参考まで。

|サービス名|開始の理由   |
|:-------|:-----|
|psacct.service      |操作ログの記録目的|


[^3]: ちなみに、auditd が Amazon Linux 2 ではデフォルトでONになっている。

### ソフトウェアのインストール

GCCなどがデフォルトでは入っていなかったりする。その他、個人的には使うであろうソフトウェアを導入する。

```shell-session
#（参考）よく使いそうなソフトウェアで入っていないものの導入例
sudo yum install -y gcc
sudo yum install -y xinetd
sudo yum install -y dstat iotop
sudo yum install -y git
sudo yum install -y jq
```

Dockerを使うなら、`docker`もインストールしよう。

```shell-session
sudo yum install docker -y
```

## 補足

前回、[Amazon Linux1の時のセットアップ手順書](https://qiita.com/Ping/items/09deb80a0be86d5e3145#fn1) を書いた際には、コマンド補完やauditd設定などをこの後続けたが、2になってからは補完はあらかじめ設定されているし（bash, aws-cli）、auditdもデフォルトで設定されている。IPv6などはデフォルトでOFFだった。
やることが減った印象。
Herokuデータベースをfollowして負荷分散した話

# モチベーション

入力の多い高負荷のHeroku Railsアプリケーションがあり、Postgresの負荷が大変なことに。負荷を分散しつつ、Master + Slave構成にしました。

* Master: 書き込み用
* Slave: 読み取り用

そのときに使ったgemなどをご紹介。

## Heroku Postgres Follower Databases

[Creating and Managing Heroku Postgres Follower Databases](https://devcenter.heroku.com/articles/heroku-postgres-follower-databases)

Heroku Postgresには `follower`という機能があり、簡単にSlaveを作ることが出来ます。

## 実際にFollowする

```bash
# HEROKU_POSTGRESQL_XXXX_URLはマスターDB
$ heroku addons:create heroku-postgresql:standard-0 --follow HEROKU_POSTGRESQL_XXXX_URL
```

## DB接続を切り替えるgem

候補はいろいろ

1. [eagletmt/switch_point](https://github.com/eagletmt/switch_point)
1. [anjlab/db-switch](https://github.com/anjlab/db-switch)

`switch_point`は抽象的過ぎる感じがしたので、`db-switch`の方を使いました。

## database.yml

```yml
slave:
  development:
    adapter: postgresql
    encoding: unicode
    pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
    username: <%= ENV.fetch('DATABASE_USER') { 'postgres' } %>
    password: <%= ENV.fetch('DATABASE_PASSWORD') { 'password' } %>
    host: <%= ENV.fetch('DATABASE_HOST') { 'localhost' } %>
    port: <%= ENV.fetch('DATABASE_PORT') { 5432 } %>
    database: <%= ENV.fetch('DATABASE_NAME') { "app_dev" } %>
```

## スレーブに切り替えるとき

```ruby
ActiveRecord::Base.connect_to(:slave) do
  User.count
end
```

切り替わっているかどうかか、`connect_to`ブロックの中で、` ActiveRecord::Base.connection_config`の出力を確認。実際に変わっているかどうかを見ます

## マルチテナント(Apartment)と併用するときは注意が必要

`connect_to`ブロックで囲んでしまうと、いくらrequestでschemaを切り替えてもpublicに変わってしまいます

Apartmentでswitchする前にslaveに明示的に変更する必要があります

```ruby
ActiveRecord::Base.connect_to(:slave) do
  Apartment::Tenant.switch(Apartment::Tenant.current) do 
    ap ActiveRecord::Base.connection_config
    ap ActiveRecord::Base.connection.current_schema
  end
end
```
UISlider の Thumb をアニメーションで非表示に

`UISlider` の Thumb (つまみ) を Youtube アプリのプレーヤーのようにアニメーションで表示/非表示を切り替えたいなというきっかけ。

<img src="https://qiita-image-store.s3.amazonaws.com/0/42826/15b382e1-89f3-be2d-58f1-ed254a38d381.gif" width="400px">

# 環境

- Swift 4.2
- Xcode 10.1

# コード

```swift
// 1. Thumb の UIImageView を取得
extension UISlider {   
    var currentThumbImageView: UIImageView? {
        guard let image = self.currentThumbImage else { return nil }
        return self.subviews.compactMap({ $0 as? UIImageView }).first(where: { $0.image == image })
    }
}

// 2-1. 表示
UIView.animate(withDuration: 0.3) {
    self.slider.currentThumbImageView?.transform = CGAffineTransform(scaleX: 1, y: 1)
}

// 2-2. 非表示
UIView.animate(withDuration: 0.3) {
    self.slider.currentThumbImageView?.transform = CGAffineTransform(scaleX: 0.001, y: 0.001)
}
```

## ポイント

**// 1. Thumb の UIImageView を取得**
手軽にできない理由が、 `UISlider` には [`var currentThumbImage: UIImage?`](https://developer.apple.com/documentation/uikit/uislider/1621347-currentthumbimage) プロパティで Thumb の `UIImage` は取れるのに、 `UIImageView` を取るプロパティがないということです。
`subviews[2]` が基本的に Thumb の `UIImageView` のようですが、念の為上記コードのようにセーフティに取得しています。

**// 2. 表示, 非表示**
もうあとは transform で変化させるだけです。ご自由にどうぞ。
今回の例でいうと、非表示にするとき `CGAffineTransform(scaleX: 0, y: 0)` とするのはエラーとなりますのでご注意ください。

# おまけ

ただ Thumb を消すだけで良ければ下記でOK。

```swift
slider.setThumbImage(UIImage(), for: .normal)
```

# 参考

- https://developer.apple.com/documentation/uikit/uislider
- https://stackoverflow.com/questions/12015785/cgaffinetransforminvert-singular-matrix/12861415
- https://stackoverflow.com/a/7420022
#python から Medium #API を叩いて自分のユーザー情報を取得する例

#python から Medium #API を叩いて自分のユーザー情報を取得する例

# Run

```
TOKEN=xxxxxxxxxxxx python example.py
```

# Script

```
import requests
import os

url = 'https://api.medium.com/v1/me'
token = os.environ['TOKEN']

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

res = requests.get(url, headers=headers)

print(res.json())
```

# Ref

[Medium/medium-api-docs: Documentation for Medium's OAuth2 API](https://github.com/Medium/medium-api-docs)

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Apatch-Airflow DAGS間のリレーション設定について　

#Dags間の連携について

スケジュールを設定していくと、DAGS間でAが終わったらBを動かしたいなど、依存関係を設定たくなる時があると思います。
そのような時の書き方について記載します。

`ExternalTaskSensor`を使えばできるのですが、ポイントが２つあって、
　　a. secondDagで、firstDagのTaskを指定する
　　b. `schedule_interval`は同じ時間に起動するようにする
が必要となります。
実際に作って起動させてみるとわかるのですが、secondDagは待ち状態の形で起動します。
そして**同じ時間に起動したDag**の指定したTaskが終わるのを待っています。
テストする時はたいてい手動で動かすと思うのですが、そうするとみごとに引っかかって動かないです。



スケジュールの１番目

```python
from airflow import DAG
from airflow.operators.dummy_operator import DummyOperator

default_args = {'owner': 'airflow', 'start_date': datetime(2018, 9, 21)}
dag = DAG('firstDag', default_args=default_args,schedule_interval='0 1 * * *')

DummyOperator(
     task_id='Call_secondDag'
   , dag=dag
) 
```

スケジュールの2番目

```python
from airflow import DAG
from airflow.operators.sensors import ExternalTaskSensor

default_args = {'owner': 'airflow', 'start_date': datetime(2018, 9, 21)}
dag = DAG('secondDag', default_args=default_args,schedule_interval='0 1 * * *')

ExternalTaskSensor(
    task_id='Start'
   , external_dag_id='firstDag'
   , external_task_id='Call_secondDag'
   , dag=dag
)  
```
プログラミング中に話しかけられると、集中力の回復に時間がかかるのは何故？ 短い時間のチャットやメールが集中力を奪う。「注意残余」とは。 #Slack #生産性 #ディープワーク

プログラミング中に話しかけられると、集中力の回復に時間がかかるのは何故？ 短い時間のチャットやメールが集中力を奪う。「注意残余」とは。 #Slack #生産性 #ディープワーク

# [大事なことに集中する―――気が散るものだらけの世界で生産性を最大化する科学的方法](https://www.amazon.co.jp/%E5%A4%A7%E4%BA%8B%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AB%E9%9B%86%E4%B8%AD%E3%81%99%E3%82%8B%E2%80%95%E2%80%95%E2%80%95%E6%B0%97%E3%81%8C%E6%95%A3%E3%82%8B%E3%82%82%E3%81%AE%E3%81%A0%E3%82%89%E3%81%91%E3%81%AE%E4%B8%96%E7%95%8C%E3%81%A7%E7%94%9F%E7%94%A3%E6%80%A7%E3%82%92%E6%9C%80%E5%A4%A7%E5%8C%96%E3%81%99%E3%82%8B%E7%A7%91%E5%AD%A6%E7%9A%84%E6%96%B9%E6%B3%95-%E3%82%AB%E3%83%AB%E3%83%BB%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%9D%E3%83%BC%E3%83%88/dp/4478068550/ref=sr_1_1?ie=UTF8&qid=1549421109&sr=8-1&keywords=%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%AF%E3%83%BC%E3%82%AF)

![image](https://user-images.githubusercontent.com/13635059/52317781-ced7dd80-2a04-11e9-9691-3ae6e7d9178a.png)

# 知的作業には中断されない環境が必要

![image](https://user-images.githubusercontent.com/13635059/52317660-46593d00-2a04-11e9-9b3a-dee364785709.png)

# タスクの切替時に注意残余が起こり、集中力を取り戻すまでに時間がかかる

![image](https://user-images.githubusercontent.com/13635059/52317629-23c72400-2a04-11e9-9436-5f51f2513a81.png)

# ごく短時間でのメールチェック、チャットの確認でも注意残余は起こる

![image](https://user-images.githubusercontent.com/13635059/52317641-2c1f5f00-2a04-11e9-82cb-e81a421ebfaa.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->