OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで競プロに挑む日誌 vol.26 ~茶色になるまでにやったこと~

12月15日(土)に開催された AGC にて, ついに茶色になれました!
![image.png](https://qiita-image-store.s3.amazonaws.com/0/284026/b30e94da-8022-0dcf-39b3-b3f003c15d35.png)


# 現在の目標
* ~~2018年内に茶色になる~~ **←祝・達成!. 現レート 469**
* 2018年度内に緑色を取得する
 * [ABC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の A, B 問題を全部解く
 * [ABC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の C 問題を全部解く
 * [AGC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の A 問題を全部解く
* (水色になったら, [APG4b](https://beta.atcoder.jp/contests/apg4b) で C++ にも手を出す)

# 今日のおはなし
私が AtCoder を始めて, 茶色になるまでに行ったことを記載しておきます.
この手の記事は先人の方々がすでに作成されておりますので, この記事の最後にいくつかリンクを貼っておきます.

## 結論
* 成長速度は人それぞれ. 慌てないこと.
* Twitter で, 競技プログラミングやってる人をひたすらフォローする.
* [AtCoder Problems](https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の ABC-A, B 問題をひたすら解く.
* rated(レートの変動があるコンテスト) には, 尻込みせず参加する.
* アウトプットする.
* エディタを導入する.
* Python の文法を学ぶなら, [Paiza](https://paiza.jp/works/mypage) や [PyQ](https://pyq.jp/) がよさそう.

### 慌てないこと
成長速度はひとそれぞれです. 競プロをやっていると, モンスター級の方にたくさん遭遇しますが, 「人は人, 自分は自分」です. 一歩ずつ成長を楽しみながら取り組みましょう.

### Twitter をやろう
たぶんこれが一番大事です. モチベーションの維持につながります.

「競技プログラミング」で検索をかけるとたくさんの方がヒットします. とりあえず片っ端からフォローしてみましょう. 最初は眺めているだけですが, コンテストの開催後などに強い方の有用な意見(このアルゴリズムを使えばよかった...)など聞けますし, 質問したら快く答えてくださる方ばかりです. 

Twitter コミュニティのよいところは, 年齢, 性別, 技術力を問わず, 同じ志を持つ人間が集まることです. 実社会での変なしがらみはなく, みんなが「レート上げたるぜ!」「あの人爆上がりした! おめでとう! 自分もがんばるぞ!」って感じなので, プログラムスキルを上げることだけに集中できると思います.

### 過去問を解こう
参考書を読むだけ, 学習サイトで文法を学ぶだけでは問題を解けるようにはなりません. また, 競技プログラミングにどのような知識が必要かも問題を解きながら肌感覚で掴んでいく方が効率よい気がするので, 最低限の文法を学んだら, ガンガン問題を解いていきましょう. 言わずと知れた, [AtCoder Problems](https://kenkoooo.com/atcoder/?user=darushino&rivals=&kind=category)を解き進みましょう.

### コンテストに参加しよう
はじめたての頃は, レートはほぼ上がる一方で下がることはほぼありません. なのでどんどん参加して, コンテストの雰囲気を肌で感じましょう. ただ, 10 回くらいコンテストに参加しないとグンと伸びることはないので, なかなかレートが上がらなくてもじっくり取り組む必要があります. レート計算に関する記事は[コチラ](https://qiita.com/anqooqie/items/92005e337a0d2569bdbd)

### アウトプットしよう
過去問を解いて苦労したこと, コンテストで初めて問題を解けてうれしかったことはアウトプットしましょう. 黙って解き続けるよりも, そのほうが頭に残ります. また, 知見のある方からアドバイスをいただけたりします. 私も Qiita で不定期に記事を書いていますが, その中で何回もアドバイスいただきました.

### エディタを導入する
環境構築でつまずいて嫌になってしまう初心者も少なくないと思います. 私も昔はそうでした. Microsoft が提供する無償の VSCode というエディタがおすすめです. [ググれば導入までの手順](https://eng-entrance.com/texteditor-vscode)や[日本語化](https://rabotiku-sato.com/vscode-japanese-setting)についていくらでも記事が出てきます. それでも環境構築が難しい方は, オンライン実行環境の, [Paiza IO(Chrome 推奨)](https://paiza.io/ja)がおすすめです. すぐ始められます.

### 学習サイトを利用しよう
Python をゼロから始める, という方には, Paiza や PyQ がおすすめです. PyQ は月額 3000 円くらいかかりますが, 基礎だけでなく機械学習や Django(Web アプリフレームワーク) も学べますので, 投資して損はないと思います.

# むすび
競プロ仲間に感謝しつつ, 次は緑目指して頑張ります.

# リンク
* [AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067) ←たぶんみんな通ってる道
* [1年かけてコンテストに18回出場して、やっとAtCoder茶色になったお話 ](https://pomupomu.hatenadiary.jp/entry/2018/10/08/153000)
* [半年以上かかってAtCoderでやっと緑になった話 ](https://zono-0317.hatenablog.com/entry/2018/04/15/172250)
* [AtCoder 灰色・茶色・緑色・水色になるまでやったこと ](https://dynamis724.hatenablog.com/entry/2018/06/24/171903)
* [Pythonで競プロやるときによく書くコードをまとめてみた](https://qiita.com/y-tsutsu/items/aa7e8e809d6ac167d6a1)
* [Pythonで使う競技プログラミング用チートシート](https://qiita.com/_-_-_-_-_/items/34f933adc7be875e61d0)
VirtualBoxにおけるNATとNAT Networkの違い

VirtualBoxのSettings>Networkの`Attached to`は、デフォルトでNATになっていますが、NAT Networkというのも選べます。一体何が違うのでしょうか？

<img width="649" alt="Screen Shot 2018-12-16 at 9.26.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/68236/92b9956e-5c88-1ab8-5daa-77f4719b5ddc.png">

## NATとは
NATとは、IPアドレスを異なるIPアドレスに変換してくれるものです。ルーターがこの役割を担うことが多く、プライベートIPアドレスとグローバルIPアドレスを変換してくれています。

## VirtualBoxのNATの役割

VirtualBoxの場合は、

> Network Address Translation (NAT) is the simplest way of accessing an external network from a virtual machine.

とある通り、virtual machineから、外のネットワークにアクセスする時に使われます。NATが、virtual machineとhostとの間に位置し、virtual machineのIPアドレスを変換しています。

## NAT Networkとの違いは何か

デフォルトのNATでは、virtual machine同士で接続が出来ません。

> This separation maximizes security since by default virtual machines cannot talk to each other.

そこで、

> The Network Address Translation (NAT) service works in a similar way to a home router, grouping the systems using it into a network and preventing systems outside of this network from directly accessing systems inside it, **but letting systems inside communicate with each other and with systems outside using TCP and UDP over IPv4 and IPv6**.

virtual machine同士で接続出来るようにしたのが、NAT service(NAT Networkのこと)です。

## 実際にやってみた
今、WindowsとUbuntuの2つのvirtual machineを立ち上げました。

Windowsは、Networkを最初からNAT Networkに。UbuntuはNATに設定しました。

UbuntuのIPアドレスを確認し、Windowsからpingを実行してみます。

```
C:\Users\IEUser>ping 10.0.2.15

Pinging 10.0.2.15 with 32 bytes of data:
Reply from 10.0.2.4: Destination host unreachable.
Reply from 10.0.2.4: Destination host unreachable.
Reply from 10.0.2.4: Destination host unreachable.
Reply from 10.0.2.4: Destination host unreachable.

Ping statistics for 10.0.2.15:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
```

unreachableと言われました。

そこで、UbuntuのNetworkをNAT Networkに変更し、同じ試行をやります。

```
C:\Users\IEUser>ping 10.0.2.5

Pinging 10.0.2.5 with 32 bytes of data:
Reply from 10.0.2.5: bytes=32 time<1ms TTL=64
Reply from 10.0.2.5: bytes=32 time<1ms TTL=64
Reply from 10.0.2.5: bytes=32 time<1ms TTL=64
Reply from 10.0.2.5: bytes=32 time<1ms TTL=64

Ping statistics for 10.0.2.5:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
```

今度は送れました。

## 最後に
Networkの設定は、いろいろオプションがありますね。知らないと、よく分からず詰まってしまうので留意しておく必要がありまあすね。

以下に、VirtualBoxのサイトにあった表を貼っておきます。

![Screen Shot 2018-12-16 at 11.02.19.png](https://qiita-image-store.s3.amazonaws.com/0/68236/49abc0ba-5daf-f595-f73d-cb815c3a4347.png)

## 参考
- <https://www.virtualbox.org/manual/ch06.html#network\_nat\_service>
【Rails】ajaxで用いるRJS(.js.erb)ファイルでインスタンス変数展開できるって話

##やりたいこと
非同期処理と言えばajaxですが、RJS(.js.erb)ファイル内でcontrollerから引き継いだインスタンス変数を展開したい。

##やりかた
indexで@userを作っていると仮定。
formの条件によって@userにどのユーザーdataが入るか変わるみたいな・・・。

```controller.rb
def index
  ・・・
  ・・・
  @user = User.find_by(〜〜〜〜)
end
```

```index.js.erb
  var username = <% @user.name %>
```
これで`username`に`@user.name`が格納。

##いつ使うのか
こんな感じの使われ方するかも？

```index.html.erb
<div id="description#{@user.id}">未実施</div>
```
```index.js.erb
  var userid = <% @user.id %>
  $(`#description${userid}`).text("実施済み");
```
`remote: true`のフォームを送ると、非同期的に「未実施」　→　「実施済み」になるみたいな。

##原理は
テンプレートで使う.html.erbと同じ埋め込みRuby(ERB)なので、原理は同じという考え方でOKなはずです。
クワガタブリーダーがGitLabを使って飼育管理の提案

# はじめに
仕事でGitLabの運用をやっている中で、これはプライベートな趣味でも使えると思った。
そこで趣味でブリードしているクワガタの管理ができるのでは考えた。

# 普段行っている作業
* 成虫
    * ゼリー交換
        * これは爬虫類と違って管理不要。
    * 産卵
        * これは管理・スケジューリングが必要
* 幼虫
    * 菌糸ビン交換
        * これは管理・スケジューリングが必要
        * 体重管理

こんな感じの作業があります。

# どうやるか
## １. グループを作ろう
まず、自分専用のブリード管理用のグループを作成しましょう！
<img width="481" alt="グループ" src="https://qiita-image-store.s3.amazonaws.com/0/52545/253c3fbb-aec1-514c-5146-42f8cb07eca4.png">

## ２. 飼育管理用にプロジェクトを作ろう
私はホペイオオクワガタを多く飼育しているので、この種類専用でプロジェクトを作成してみました。
<img width="713" alt="2018_advent002.png" src="https://qiita-image-store.s3.amazonaws.com/0/52545/5cb0af11-f311-4e08-8eb3-b51d3938c94a.png">

## ３. 産卵計画を立てよう
MilestoneとIssueという機能が使えると思います。

### Milestone
私はそこまで数を飼っていないので、3ヶ月毎で区切りました。
<img width="1160" alt="2018_advent003.png" src="https://qiita-image-store.s3.amazonaws.com/0/52545/f6d8d5e5-aaae-1ace-b408-2a32bcd4def1.png">

### Issue
ここで実際の作業を決めていきます。
例えば1月に産卵セットを組む場合は以下の画像のようなものを作成し、上記のマイルストーンの「2019年1月から3月産卵計画」に紐づけます。
<img width="1165" alt="2018_advent004.png" src="https://qiita-image-store.s3.amazonaws.com/0/52545/396902aa-5ff4-9a7c-52a9-b5bb93b75601.png">

やらないといけない作業・やったことの一覧はBoardから見ることができます。
<img width="1038" alt="2018_advent005.png" src="https://qiita-image-store.s3.amazonaws.com/0/52545/b89eebea-b4dc-7b85-b895-aae2719a9de0.png">

Milestoneに紐づく作業はこんな感じに見ることができます。
<img width="1113" alt="2018_advent006.png" src="https://qiita-image-store.s3.amazonaws.com/0/52545/1d2943c6-0ede-17b0-774e-cba86b5ab555.png">

幼虫の管理も管理も同じようにできますね！


# 自慢をする
時間がなく作れませんでしたが、GitLab Pagesをつかってwebアプリ(ホームページ)をつくって飼育しているクワガタやカブトムシを自慢することもできますね。
ショップをやられてる方はお店のホームページを作ってもいいかもしれません。

# 最後に
まだまだジャストアイデアなところが多いですが、ブリーダーがノートやExcelで管理しているものからGitLabに移行できると思います。
私は飼育状況は公開してもいいと思っていますが、公開したくなければプライベートリポジトリを作ればいいし、ショップや共同飼育している場合もグループメンバーを設定すればいいし、臨機応変に対応できます。

みなさんも、開発以外のこういった趣味などでGitLabを使ってみてはいかがでしょう？
Androidで丸いCardViewを滑らかにページ遷移させる

この記事は Goodpatch Advent Calendar 2018 18日目の記事です。

Google I/O 2018でMaterial Themingが発表され、最近のGoogle製アプリではGoogle独自のMaterial Designを採用したアプリが増えてきましたね。

また、その影響やiOS側のトレンドの変化もあって最近では、様々なアイコンやViewの形状が丸くなってきてたように思います。
そのあたりの考察は別の記事に譲るとして、今回はAndroid開発者として、角が丸めのCardViewを実装した時に困ったことと、その対処法をご紹介します。

## cardCornerRadius=16dpのCardView

まずは最近流行りの丸いCardViewを作ります。
分かりやすいようにcardCornerRadiusは16dpにしておきましょう。

```xml
<androidx.cardview.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:cardCornerRadius="16dp"
            app:cardElevation="1dp">
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/20435/91481677-0733-7b19-192c-9cdb4ef602ad.png" width="30%" />

はい、できました。簡単ですね。

## Transition Animationがうまくいかない

このCardViewにShared Elementsを使ったTransition Animationを付けて別のActivityに遷移させてみます。

![animation10.gif](https://qiita-image-store.s3.amazonaws.com/0/20435/a59700c0-7549-2d57-6a0c-49d664363bdd.gif)
分かりやすいようにWindow Animation Scaleはx10です。

アニメーションが始まった瞬間にCardViewでClipされていた四角い画像が表に出てきているのが分かりますか？
Shared Elementを使ったときに遷移中に表示されるViewは遷移後のActivityのViewです。このためClipされていない遷移後のViewがタップ直後に表示されてしまいます。
これではせっかくのCardViewが少し残念です。

## Transition中のViewのサイズに合わせてClipするradiusを変化させる

今回はCardViewの中に使うViewをpathでclipすることで滑らかにアニメーションさせるようにしてみました。
Transition Animation時にViewのサイズが変わるたびにonDrawが呼びだされるため、その時のViewの幅に合わせて少しずつRadiusが変化するようにします。

```kotlin
private val rootWidth = resources.displayMetrics.widthPixels
private val cornerRadius: Float = resources.getDimension(R.dimen.card_corner_radius)
private val cardSideMargin: Float = resources.getDimension(R.dimen.card_side_margin) * 2

override fun onDraw(canvas: Canvas) {
        // viewの幅に合わせてcornerRadiusを変化させる
        val radius = Math.min(cornerRadius, cornerRadius * ((rootWidth - this.width) / cardSideMargin))
        clipPath.reset()
        clipRectF.set(canvas.clipBounds)
        clipPath.addRoundRect(clipRectF, radius, radius, Path.Direction.CW)
        canvas.clipPath(clipPath)
        super.onDraw(canvas)
}
```

![animation11.gif](https://qiita-image-store.s3.amazonaws.com/0/20435/7e072202-965e-b92c-2796-9b861c52600d.gif)
いい感じになりました。（個人の感想です。

今回のすべてのサンプルはこちらです。
[ymegane/CardAnimationSample | GitHub](https://github.com/ymegane/CardAnimationSample)

これで週末は心置きなく映画館に行けそうです。
みなさんよいクリスマスを。
稀にリバースプロキシからバックエンドWebAPIへの接続が失敗する

# 概要
リバースプロキシの背後でWebAPIが動作している環境に対して、ある程度の負荷をかけると稀にリバースプロキシからバックエンドWebAPIへの接続にタイムアウトが発生することがありました。その原因と調査方法、解決策について記載します。結構環境依存的な話なので、同じ現象に見舞われる人は少ないと思いますが、解決に苦労したのでメモしておきます。

# 本記事では説明しない内容
TCPのハンドシェイクの仕組み、やり取りされるパケットの種類
パケットキャプチャの使い方

# 環境
リバースプロキシ：IBM API Connect
バックエンドWebApi：Windows Server2012(IIS)

# 最終的な原因
リバースプロキシ側の（クライアント）タイムアウトの設定とバックエンドAPIの接続タイムアウトの時間が異なっていたことに加えて、下記の事象が原因でした。

[Internet Information Server (IIS) で接続のタイムアウト時間経過後、切断対象のアイドル セッションに対して TCP の RST パケットが送信されない場合がある](https://support.microsoft.com/ja-jp/help/2028455)


# 調査方法
リバースプロキシ側でパケットキャプチャを取得し、タイムアウトになったセッションを順を追って確認していきました。

プロキシ：P　バックエンド：B
と表現します。

1. P→B　SYN　　　TCPの接続要求（セッション開始）
2. B→P　SYN,ACK　TCPの接続応答　
3. P→B　ACK　　　TCPの接続応答に対する応答
4. P→B　HTTP　　 リクエスト本体
5. B→P　ACK　　　リクエストの受領応答
6. B→P　HTTP　　 レスポンス
7. P→B　ACK　　　レスポンスの受領応答
8. P→B　HTTP　　 新しいリクエスト（接続タイムアウト）

といった形になっていました。
このとき、7.と8.の間は120秒以上空いています。

一方で、正常にセッションが終了した場合の動作は

1. P→B　SYN　　　TCPの接続要求（セッション開始）
2. B→P　SYN,ACK　TCPの接続応答　
3. P→B　ACK　　　TCPの接続応答に対する応答
4. P→B　HTTP　　 リクエスト本体
5. B→P　ACK　　　リクエストの受領応答
6. B→P　HTTP　　 レスポンス
7. P→B　ACK　　　レスポンスの受領応答
8. B→P　RST　 　 バックエンドのセッションタイムアウト通知（7.から120秒後）

となっていました。
このことから、バックエンドがセッションタイムアウトに到達してもプロキシに対してRSTパケットによる通知が行われない場合があることが原因と思われました。

その観点で再度情報を検索したところ、出てきたのが[上述の情報]((https://support.microsoft.com/ja-jp/help/2028455))でした。

#対応

環境的にARPエントリの登録とクライアント側のタイムアウトの設定変更が難しかったため、HTTPキープアライブを無効にして対応しました。
[PostgreSQL10] EC2での導入~初期設定

P&Dアドベントカレンダー16日目の記事です。
2018年もあとは半月ですね。
私個人としては博多駅のクリスマスマーケットへの参加を切望してる次第です泣


#はじめに
Rails5アプリのHerokuからAWS EC2への移行の際に少し躓いたことがあったので載せておきます
HerokuではPostgreSQL10を使用してます。

#注意事項
PostgreSQL10のDB移行の際には、移行先のPostgrSQLのバージョンも10.0以上にする必要があります。
PostgreSQL10はAmazonLinuxではサポートされていません。
なので、EC2のAMIはAmazonLinux2を選択するようにお願いします。

#公式リポジトリの追加
###経緯
今回はyumを利用して、installしていきます。

ここで注意しておくことが…
普通に`yum install postgresql`とするとPostgreSQL9の最新バージョンがインストールされます。
ということで、PostgreSQLの公式yumリポジトリからinstallする必要があります。

###実行したこと
上記より、`yum localinstall <URL>`を利用して、
PostgreSQLの公式リポジトリをAmazon Linux2に追加が必要となります。

```
# yum -y localinstall https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
```

`-y`で途中で`Yes/No`などを入力する手間を省いて、すべてYesでインストールしていきます。

#パッケージの確認
PostgreSQLの公式yumリポジトリで提供されているPostgreSQL10の詳細を確認をしておきましょう。

PostgreSQL10の関連パッケージは、
`postgresql10-`というプレフィックスで始まるパッケージ名になっていて、
PostgreSQL 10 Serverのパッケージ名は`postgresql10-server`となっています。
詳細情報の閲覧には`yum info <パッケージ名>`を利用しましょう。

```
# yum info postgresql10-server
```

これで、`Available Packages`と出力されればOKなので、進めていきましょう！
そのほかにも使用できるバージョン等も確認することが可能です。

#(やっと)インストール
さてさて、インストールを進めていきましょう。
`yum install`を利用してインストールしていきます。

```
# yum -y install postgresql10-server
```

上記コマンド実行後、`Complete!`が出力されればOKです！
石橋を叩いて渡りたい方は、`postgres –version`を利用して、
コマンド利用の可否とバーションを確認してみましょう。

```
# /usr/pgsql-10/bin/postgres --version
```

**Ex. version10.6の場合**
`postgres (PostgreSQL) 10.6`と出力されればOKです!



#DB初期化
インストールができたらDBの初期化ですね。
`postgresql-setup initdb`を利用していきましょう。

```
# /usr/pgsql-10/bin/postgresql-10-setup initdb
```

`Initializing database ... OK`を出力されればOKです！

#自動起動設定(サービス化)
サーバーの起動・再起動時にPostgreSQLを自動起動するように設定しておきましょう
…してないと結構面倒なことが起こる(未来予知)
`systemctl enable`で`postgresql-10`を指定しましょう。

```
systemctl enable postgresql-10
```

#起動・停止・再起動
今回は`service`で`postgresql-10`を指定して行なっていきます。

###起動
さてさて、ついに起動のときです…

```
# sudo service postgresql-10 start
```

エラーが吐かれなければ起動完了！！

###停止
```
# sudo service postgresql-10 stop
```

###再起動
```
# sudo service postgresql-10 restart
```

#ユーザー
PostgreSQLをインストールした時点で
PostgreSQL Severの管理者権限を持つユーザー「postgres」が作成されます。
初期状態ですと、パスワードは設定されていません。

#ログイン
起動ができたので「postgres」でログインしてみましょう。
ログインには`psql`を利用します。

```
# sudo -u postgres psql -U postgres
  could not change directory to "/root"
  psql (10.6)
  Type "help" for help.

postgres=# 
```

上記のようになれば、成功です！

ログアウトは`\q`で可能です。

```
postgres=# \q
```

ここまでできれば、今回は完璧です！！
お疲れ様でした！！！

#最後に
はじめに述べたアプリの移行でおきたことを簡単にまとめてみました。
PostgreSQLを初めて扱ってみて、
バージョン10.0以上とそれより下のもので導入の違いがかなりあったことが結構な驚きでした汗
年明けにはPosgreSQLのユーザー設定やRailsアプリでおいての導入、
そして上記で述べたアプリ移行の全容もお伝えしていく予定なので少々お待ちいただけたらなと思います。

##参考記事
https://weblabo.oscasierra.net/postgresql10-centos7-install/
Hyper-Vのハードディスクを小さくしてみた

#この記事、何?

ちょっとしたコマンドの記録。
あと、疑義があるのでそのメモ。


#どういう人向け?

似たようなことをしたくなった時の将来の自分あて。
あと、仮想初心者にとって目から鱗が落ちるようなサイトを紹介・・・
したかったけど見つけられなかったので論点だけ書いてみた。


#試した環境は?
Windows 10 Pro (1803)
Hyper-V (10.0.17134.1)

その中で、こんな仮想マシン構成をしていて、その「base」をもとに「python」を作成。
そのハードディスクが大きくなりすぎたので小さくした。


#やったこと(序文)
・仮想マシン上にPython環境の構築

詳細は割愛。別記事で。
この記事の論点だけ書くと、MS Updateをまともにかけてしまったため、ハードディスク更新が莫大にかかった。
やっぱりLinuxに移行しようかなぁ・・・


・そのでっかくなったハードディスクの縮小

というわけで、そのでっかいハードディスクを小さくしたかった。
古い知識で、ゲストで0埋めして、ホストから圧縮して・・・
と思ったんだけど、「それ古い知識ですから」って書いてあったので試してみた。


#やったこと(本文)
前振りが長いですね。ここからが本文。

少し前の記事で作ったHyper-Vのスナップショット環境でPython入れたかったんだけど、MS Updateをかけてしまったので
ハードディスクがかなり大きくなってしまったの。
なので、少しでも小さくしたい、と。

で、以下の二つのサイトを見てやってみた。

(概要)
■VHD／VHDXのサイズを縮小するための事前準備は面倒？──その行為、無駄です！ (1/2)
http://www.atmarkit.co.jp/ait/articles/1609/26/news016.html

(具体的な方法)
■Hyper-V仮想ディスクの最適化(圧縮)メモ
https://qiita.com/seki-moto/items/988e5caf0d0cf9dff933

(実際のコマンド)

PS> $targetvhd = "VHD(X)のフルパス"
PS> Mount-VHD $targetvhd -Readonly
PS> Optimize-VHD $targetvhd -Mode Quick
PS> Optimize-VHD $targetvhd -Mode Quick
PS> Dismount-VHD $targetvhd

seki-motoさんが書かれているコマンド通り実行。
で、2回(以上)やっても小さくならなかったのでちょっとアレンジ。

PS> Optimize-VHD $targetvhd -Mode Full
PS> Optimize-VHD $targetvhd -Mode Full

結果、KBレベルくらいしかちいさくならなかった...orz



で、他を漁ってたら、こんなの見つけたので試してみた。

■Hyper-V の容量可変の仮想ディスク (VHD/VHDX) のファイルサイズを小さくする (Windows Server Tips)
https://www.ipentec.com/document/windows-hyper-v-trim-vhdx-file

少し小さくなった。(37GB→34GB)


ここで、仮想マシンの中で、不要なものを消したほうがいいのでは?と思いついた。
ので、ゲストからディスクのクリーンアップを使ってUpdateの残骸を削除。

改めて、コマンドを使った。

まあまあ小さくなった。(34GB→24GB)



#やっぱり消化不良

ん?じゃ、最初のサイトがいっていたことどうなの?という話。
あと、別件に気を取られていて、中で0埋めをどこでやったかやらなかったかとか、かなり不正確。
やっぱりきれいに記録取っとかないとだめね、という話かも。




#仮想マシンのハードディスクの差分管理について

共存できない開発環境を二つ切り替える必要がある場合に仮想マシンを2台作るとする。

<環境1>
OS+開発ソフトA

<環境2>
OS+開発ソフトB


これで、OSが20GB、開発ソフトがそれぞれ1GBの場合、普通に考えると両方の仮想マシンが21GBで合計42GBになる。

それがヤなのでこんな風にしたい。

<基底環境>
OS

<環境1>
開発ソフトA(の差分)

<環境2>
開発ソフトB(の差分)

これができれば全部で22GBでよいという話。


ちなみにうちの環境だと基底環境としてbaseが30GBくらい、それぞれの仮想マシンが中身次第で1GBだったり3GBだったりという感じ。


#原理：紹介したかったサイトの論点

これ、昔、同僚に聞かれて説明に使ったいい感じのサイトがあったの。
そのURLを張ろうと思ったんだけど、見つけられなかった。

書いてあったのはこんな感じ。

都合上、ハードディスクの1セクタが日本語3文字に例える。
で、お天気の状況を記録する。

(初版)

| 1 | 2 | 3 | 4 |
|:-:|:-:|:-:|:-:|
|第1セクタ|第2セクタ|第3セクタ|第4セクタ|
|東京は|本日は|雨天|です|

で、1日たったので変更する。

(変更後)

| 1 | 2 | 3 | 4 |
|:-:|:-:|:-:|:-:|
|第1セクタ|第2セクタ|第3セクタ|第4セクタ|
|東京は|昨日は|雨天|でした|


で、「東京は」っていらないという話になり、削除する。

(削除後)

| 1 | 2 | 3 | 4 |
|:-:|:-:|:-:|:-:|
|第1セクタ|第2セクタ|第3セクタ|第4セクタ|
|東京は※|昨日は|雨天|でした|
※状態が削除として扱われるため、データは残ったまま。


だから、差分・削除としては変更後の第2・第4セクタの2個分の記録しかいりませんよ、という話をきちっと絵を描いて説明してた。
(ほんとは管理セクタとかでどーのこーのという情報はあるけど、割愛で。)

で、疑問点は、削除データをどう扱うのか。
Undelete等の手段で戻せるという情報を保持するのかしないのか。
あとで、「FFFFFFFF・・・・」って書いた1GBくらいのファイルをつくてゴミ箱からも含めて削除して、
そのうえで上記のコマンドを使ったらちいさくするのかしら。

古いソフトの不正インストール対策でそんな感じでファイル化されていないハードディスクの情報に依存して・・・
というのがあったような気がするので、そういうソフトはどうなるんだろうという話。

ただ、ファイルとして保存されていないデータを保証しないという立場(仕様)が自然なような気がするので
そのような動作をしてくれるような気がするけどどうだろう。

あと、Windows.oldフォルダができるレベルだと差分本体がでかいのであまり意味がない・・・



#蛇足

で、よくよく考えたらそもそもMS Updateを既定値の自動適用を変更すればいいだけな気がしてきた。
本体の手順確認を兼ねて、再実行しようかな・・・
セキュリティリスクは気になるけど。
Webpackを使ってビルドするときにハマったことまとめ

yarn initして、yarn addで諸々パッケージをインストールして、
さあいざ

```console
$ ./node_modules/.bin/webpack-dev-server
```
と打ち込んでサーバーを起動させようとしたらエラーが。

簡素ですが、解決までの道のりをメモ_φ(･_･。

```The CLI moved into a separate package: webpack-cli.
Please install 'webpack-cli' in addition to webpack itself to use the CLI.```
→

```console
$ yarn add webpack-cli
```

で対処。

```WARNING in configuration
The 'mode' option has not been set. Set 'mode' option to 'development' or 'production' to enable defaults for this environment.```

起動時にmodeの指定をすることで回避

```console
$ ./node_modules/.bin/webpack-dev-server --mode development --open
```

しかし今度はこんなエラーが
```SyntaxError: Unexpected token } in JSON at position ```

どうやらpackage.jsonの中に不要な文字列が混ざり込んでしまったらしい。エラー処理の過程でコピペしたところとかを消去して、すっきりさせたらこのエラーは消えた。

しかし、今度は
```ERROR in ./src/index.js
Module build failed (from ./node_modules/babel-loader/lib/index.js):
Error: Cannot find module '@babel/core'```

というエラーが。
babel-coreはインストール済みだったはずだが、再度

```console
$ yarn add babel-loader@7
```

今度は、

```ERROR in ./src/index.js
Module build failed (from ./node_modules/babel-loader/lib/index.js):
Error: Couldn't find preset "@babel/preset-env" relative to directory```

が、

```console
$ yarn add babel-preset-env
```

としても解決しない。

すったもんだの末に、

エラー解決を模索する過程で、
<https://qiita.com/mimikun/items/860bad42c9b5bd10c7f4>と
<https://www.valentinog.com/blog/webpack-tutorial/>に従って、

```js:.babelrc 
{
    "presets": [
        "@babel/preset-env"
    ]
}
```

ファイルを作成していたけれど、その表記がまずかった模様。
取り急ぎ.babelrcファイルを削除したら無事コンパイルされた。
1時間くらい合計で処理にかかったかもしれない…
ネットワークって？

はじめに
---
私が業界に入ったときにはいまのネットワークなんてありませんでした。
そこで、ちょっと復習をかねてネットワークの種類について書きたいと思います。

ネットワークとは？
---
昔は企業内のコンピュータは端末単体でスタンドアローン状態で利用していました。
技術の進化につれて、コンピュータは相互に接続し利用され複数台のコンピュータをケーブルや電波などで相互に接続を行い、情報の共有する仕組みをコンピュータネットワークと言います。

コンピュータネットワークの分類
---
コンピュータネットワークは規模に応じて`LAN`、`WAN`、`インターネット`に大きく分類されます。

・LAN (Local Area Network) 
同じ建物の中にあるコンピュータ、プリンタ、サーバなどを接続してデータをやり取りするネットワークです。
LANといっても、家庭内で数台のPCを相互接続しているLAN（家庭内LAN）や、企業内で数百台のPCなどを相互接続しているLAN（企業内LAN）などがあります。

・WAN (Wide Area Network) 
地理的に離れた場所にあるコンピュータ（例：東京～大阪）など相互接続を行い、データをやり取りするネットワークのことです。
WANは`NTT`、`KDDI`、`ソフトバンク`といった通信事業者が提供するサービス（広域イーサネット、IP-VPNなど）を利用して接続します。
このWANによって、本社と支店の企業内LANを相互接続したりします。

・インターネット
これはみなさんにとってごく身近なものですね！
世界の全てのネットワークを相互接続した巨大なコンピュータネットワークです。
家庭内LAN、企業内LANなど世界中の様々なネットワークに接続されています。
インターネットは全体を統括するサーバーは存在せず、全世界に分散された無数のサーバーが少しずつサービスを提供することで成り立っています。
インターネットは、PCだけではなくスマホなどの様々なメディアから接続していろいろな情報を共有することができる便利なサービスですね。

・イントラネット（おまけ）
インターネット標準技術を用いて構築された企業内ネットワークのことです。
インターネット標準技術とは、プロトコルにTCP/IPを利用した電子メール、Webのシステム等のことです。
イントラネットでは特定の組織内メンバーだけが閲覧できるWebサーバがあったり、特定の組織内のメンバーだけでメールの送受信ができるなど閉じたネットワークのことです。
企業内のグループウェアなどによく使われてますね。

ネットワーク化が進んで
---
パソコンをネットワークに接続することにより、複数のPCがプリンターの利用を共有することができ（ハードウェアの共有）、サーバー内にあるファイルデータを複数のPCで共有できたりしてとても便利になりました。
そして、インターネット接続できればブラウザでいろいろな情報を収集することができ、メールやチャットにより世界中の人ととのコミュニティーも気軽になってきました。
その反面、ウィルス等により情報漏洩の危機も身近なものになってきていますので、利用には十分注意をはらい、楽しくネットワークを利用しましょう。
Pythonのスクレイピングで文字だけを抜き出す汎用的な方法

# Pythonのスクレイピングで文字だけきれいに抽出する汎用的な方法

初投稿です。
<p>pythonのスクレイピングで複数のサイトから文字だけ全部抜き出そうとする際に、うまく機能する汎用的なやり方を理解するのにわりと時間がかかったため、ここにしたためておきます。</p>

まず、英語でどんぴしゃり回答していらっしゃる方がいたので、英語いける方はこちらのURLを見ていただければ試合終了です。
[Extracting text from HTML file using Python](https://stackoverflow.com/questions/328356/extracting-text-from-html-file-using-python)

私はコードを調べつつでないと理解できないPrograming初心者で、割と処理の理解に時間がかかったので、やり方を０から簡単に解説します。必要なところだけさくっと見てください。

## 事前準備
### インストール

```python
import requests
import pandas as pd
from bs4 import BeautifulSoup
```

### HTML取得
```python
html=requests.get("https://www.updateurself.com/2018/11/14/the-way-to-challenge/").text
soup=BeautifulSoup(html,"html.parser")
#print(soup.prettify)
```

ちなみにこのURLは私がやっているプログラミングとは何の関係もないブログです。


## 文字を取り出していく
###1, scriptやstyleを含む要素を削除する

```python
for script in soup(["script", "style"]):
    script.decompose()
#print(soup)
```
- .decompose()は、削除のメソッドです。

###2, テキストのみを取得=タグは全部取る

```python
text=soup.get_text()
#print(text)
```
 引用：[Extracting text from HTML file using Python](https://stackoverflow.com/questions/328356/extracting-text-from-html-file-using-python)

.get_text()は、テキストのみを取得する、つまりタグは取らないメソッドです。

###3, textを改行ごとにリストに入れて、リスト内の要素の前後の空白を削除

```python
lines= [line.strip() for line in text.splitlines()]
```
 引用：[Extracting text from HTML file using Python](https://stackoverflow.com/questions/328356/extracting-text-from-html-file-using-python)

【補足】ここはリスト内包表記です。書き下すと以下のことをやっています。

```python
lines=[]
for line in text.splitlines():
  lines.append(line.strip())
#print(lines)
```
- .strip()では引数に指定したものを文字列の文頭文末から削除することができます。
今回のように引数に何も指定しなければ空白（改行等中身のないもの）を全削除です。
- .splitlines()は改行ごとに要素をリストに入れます。

出力はこんな感じになります。（最初の部分のみ）

```python
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '人生に目標が無いから何？目標より大事なアレを見つける３つの方法 - Update yourself', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'ホーム', '悩み', '', 'こころ', '人間関係', '恋愛', '', '', '思考法',
```
(冒頭部分改行続きのため中身に何も入っていないものが多いですね)

### 4, リストの空白要素以外をすべて文字列に戻す

```python
text="\n".join(line for line in lines if line)
```

- .joinはリストを文字列に変換します。
- ここで、それぞれのリストの中身ごとに改行して文字列に戻していきます。このとき注意点は、<b>「''」のような中身が何もないlineは無視することです。そのためにif lineが必要です。</b>

以上で完成です。最終アウトプットはこんな感じです。
![output.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/326838/49995667-064c-9627-4d9b-2daacb975eee.gif)




参考URL
- https://stackoverflow.com/questions/328356/extracting-text-from-html-file-using-python
- https://python-reference.readthedocs.io/en/latest/index.html
Django で PDF を作成

次の記事を参考にしました。
[Python + Django でPDF作成](https://qiita.com/t-iguchi/items/1bb5a85e259b190e3fbf)
日本語を含む PDF を作成するようにしました。

１）　元となるプロジェクトを用意します。
>次の記事を参考にして
>[Django で Hello World](https://qiita.com/t-iguchi/items/1bb5a85e259b190e3fbf)
proj01 というプロジェクトを作成します。これには、home という アプリが含まれています。

２）　pdfgen というアプリを追加します。

```bash
python manage.py startapp pdfgen
```

3) ソースのプログラムを用意します。

```py:pdfgen/views.py
from django.http import HttpResponse
from reportlab.pdfgen import canvas
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase import pdfmetrics

# Create the HttpResponse object with the appropriate PDF headers.
def index(request):
    response = HttpResponse(content_type='application/pdf')
    file_pdf = "example01.pdf"
    response['Content-Disposition'] = 'attachment; filename=' + file_pdf
    # Create the PDF object, using the response object as its "file."
    pp = canvas.Canvas(response)
    fontname_g = "HeiseiKakuGo-W5"
    pdfmetrics.registerFont (UnicodeCIDFont (fontname_g))
    pp.setFont(fontname_g,16)
    # Draw things on the PDF. Here's where the PDF generation happens.
    # See the ReportLab documentation for the full list of functionality.
    pp.drawString(100, 800, "Hello world.")
    pp.drawString(100, 700, "こんにちは")
    # Close the PDF object cleanly, and we're done.
    pp.showPage()
    pp.save()
    return response
```

3) proj01/settings.py を編集

```py:proj01/settings.py
（省略）
INSTALLED_APPS = [
    'pdfgen',
    'home',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
（省略）
```

4) proj01/urls.py を編集

```py:proj01/urls.py
（省略）
urlpatterns = [
    path('', include('home.urls')),
    path('pdfgen/', include('pdfgen.urls')),
    path('admin/', admin.site.urls),
]
```

5) pdfgen/urls.py を作成

```py:pdfgen/urls.py
from django.conf.urls import url
from . import views

app_name = 'pdfgen'
urlpatterns = [
    url('', views.index, name='index'),
]
```

6) 開発サーバーを起動

```bash
python manage.py runserver
```

7) ブラウザーで http://127.0.0.1:8000/pdfgen/ にアクセス
>example01.pdf というファイルがダウンロードできます。

参考ページ
>[Django で PDF を出力する](https://docs.djangoproject.com/ja/2.1/howto/outputting-pdf/)
rails5.2.2でassets:precompileが死ぬ

なんかいろいろ困ったけど解消できたのでメモ
だれかの参考になればボク幸せです

# 状況（作業ログ）
- rails5で初期設定をいじってる状態
- bootstrapのgemを入れたところまでで、`bundle install`は成功
- `rake assets:precompile`を行ったところ、Autoprefixer doesn’t support Node v0.10.36. Update it.エラーが発生
- その後Autoprefixerが利用するexecjsのランタイムをmini_racerにしようとするもgemインストールができない
    - atomic が見つからないとかなんとか言われる。（GCCが古いので対応するimportファイルがなかった？）
- [mini_racer公式](https://github.com/discourse/mini_racer)に書いてあるように、gcc 4.8を入れ、一時的に利用することで解消

※公式が言ってること
> Note using v8.h and compiling MiniRacer requires a C++11 standard compiler, more specifically clang 3.5 (or later) or gcc 4.8 (or later).

# 環境とか
- centos 6.10
- ruby 2.5.3
- rails 5.2.2

# 原因っぽいこと
- AutoPrefixerはexecjsのgemに依存している
- execjsは、runtimeとして色々選べるが、当環境は「Nodejs」を利用しており、環境に入ってるNodeのバージョンが古かった
- mini_racerがインストール出来ないのは、gccのバージョンが古いから(4.4.7だった）
- centos6はgccのデフォルトが4.4.7っぽい

# 解決案
- 【その１】Nodeをアップデートする
- 【その２】runtimeを違うの使う

# 解決方法は【その2】を選択
- なんかナウいらしいので、runtimeはmini_racerを利用するようにした

# 手順とか

基本的に[ここのgccアップデート方法の](https://gist.github.com/stephenturner/e3bc5cfacc2dc67eca8b)ページを元に実施

## GPGのkeyをインポートする

```
sudo rpm --import http://ftp.riken.jp/Linux/cern/slc58/x86_64/RPM-GPG-KEYs/RPM-GPG-KEY-cern
```

## slc6-devtoolset.repoの情報をゲットしとく

```
wget -O /etc/yum.repos.d/slc6-devtoolset.repo http://linuxsoft.cern.ch/cern/devtoolset/slc6-devtoolset.repo
```

## devtoolset-2をインストール

```
sudo yum install devtoolset-2
```

## 一時的にdevtoolset-2を利用できるようにする
（zsh使ってるのでzsh指定）

```
scl enable devtoolset-2 zsh
```

# 結果
- bundle installする→成功
- bundle rake assets:precompileをする→成功

# 補足情報
- AutoPrefixerはその名の通りcssのprefixを付与してくれるgemでexecjsに依存している
- execjsはruby上でjavascriptを実行出来るようにしてくれるっぽいgemでそのために各種runtimeが利用できる
    - 利用できるruntimeは[この辺](https://github.com/rails/execjs#readme)に書いてある
- therubyracerよりもmini_racerがナウいらしいのでそれをruntimeで指定する
- gcc4.8を利用しないとmini_racerインストールできないけど、centos6だと死ぬ

# 参考サイト
- [GCCのアップデート方法](https://gist.github.com/stephenturner/e3bc5cfacc2dc67eca8b)
- [CERN's GPG KEYの場所](http://ftp.riken.jp/Linux/cern/slc58/x86_64/RPM-GPG-KEYs/)
- [gcc4.4のstatus](https://gcc.gnu.org/gcc-4.4/cxx0x_status.html) ※atomicっぽいものが無いことが確認できる
- [gcc4.8のstatus](https://gcc.gnu.org/gcc-4.8/cxx0x_status.html)
- [mini_racerのインストールでエラー出てたとこ](https://github.com/discourse/mini_racer/blob/4f3674852c75b342d958555ea8f728e0200fb384/ext/mini_racer_extension/mini_racer_extension.cc#L10)
- [execjsのじょうほう](https://github.com/rails/execjs#readme)
- [therubyracerはナウいmini_racerにしようぜのプルリク](https://github.com/rails/rails/pull/29285/commits/6cc153959ac04a39d4081a2cf23e1ff83c4efe3b)
- Try doing a gem uninstall libv8 and retry installing mini_racer. ということを教えてくれてる[issue](https://github.com/discourse/mini_racer/issues/37)
- nodejsが使えないならmini_racer入れちゃえばいいじゃない、の[stackoverflow様](https://stackoverflow.com/questions/51980353/autoprefixer-doesn-t-support-node-v0-10-37-error)
- AutoprefixerはNode v0.10.37をサポートしてないよ、の[issue](https://github.com/ai/autoprefixer-rails/issues/140)
gVimでpowershellスクリプトを書いたら日本語出力が文字化けした話

# 結論
vimrcに下記設定を追加

```
set bomb
```

# 解説
例えば下記のようなpowershellスクリプトをUTF8で作成して実行してみる。

```
Write-Host "さよなら文字化け"
```

メモ帳でUTF8にして保存した場合やPowershellISEでそのまま保存した場合は正常。
gVimで作成すると文字化けして文字列を読み取れずにエラーとなる。


理由は簡単でUTF8にはBOM付とBOM無の二つがあり、
メモ帳やPowershellISEはデフォルトでBOM付となるがgvimはBOM無になるからである。

なのでgvimでBOMを付けるコマンド:set bombを実行すれば問題ないです。
私はvimrcに書いてデフォルトでBOMが付くようにしました。
VS Codeのローカライズ環境がMicrosoft Localization Community Platform (MLCP)に移行します

## はじめに
VS Codeローカライズのコントリビューターをしている[YuichiNukyama](https://www.transifex.com/user/profile/YuichiNukiyama/)です。一年ほど前、[VSCodeをローカライズ](https://qiita.com/YuichiNukiyama/items/1922281e034ddad1e774)という記事に書いたように、VS Codeの翻訳環境にはTranifexが使われています。ところが最近になって、コミュニティ宛てに以下のような連絡が来ました。

>We are moving! As earlier announced, the Visual Studio Code Community localization project has been moved from Transifex to Microsoft Localization Community Platform (MLCP). Beginning in January 2019, VS Code will now be on the MLCP localization platform [http://aka.ms/mlcp]. Please note, that no further contributions will be accepted on Transifex.

2019年1月に、個人的には慣れ親しんでいたTransifexからMLCPに環境が移るようです。切り替えタイミングだし、これから貢献してもいいよという方が増えるように、MLCPの使い方を紹介したいと思います。なお、公式ドキュメントは[こちら](https://github.com/Microsoft/Localization/wiki/How-to-contribute-to-Software#microsoft-localization-community-platform.)にあるので、合わせてご覧ください（正直言えば、まだ移行が完了しておらず私もMCLPを使っていないので、ほぼ公式の翻訳です）。

## Sign UP!!!
まずはアカウントの登録です。登録には[Microsoft Account](https://account.microsoft.com/account?lang=ja-JP)が必要です。持っていない方は事前に作成しておいてください。

1. [Microsoft Localization Community platform](https://aka.ms/loccommunity)にアクセス
2. **Guest**をクリック
3. **Sign in**をクリック
4. Microsoft Accountでサインイン
5. Sign Upページの項目を入力する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/67429/eacece95-128c-e6de-135a-37ba4cd16af1.png)

## Contribute!!!
アカウント登録が完了したら、いよいよ翻訳開始です。はじめに、貢献する言語やプロジェクトを選びます。

1. [Microsoft Localization Community platform](https://aka.ms/loccommunity)にアクセス
2. Microsoft Accountでサインイン
3. 貢献するLanguage（Japanese (Japan)）とProject（VS Code関連）を選択して、**Apply**ボタンをクリックする。なお、Strings to viewをAllにすると、翻訳されいないか投票が必要な文字列のみに絞り込まれる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/67429/60825c94-be0d-a292-cce1-54208d8c1a2e.png)

続いて、翻訳をしていきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/67429/4e6e9a13-995f-04ce-fb1a-92c1f4f72ade.png)

**Source String**が翻訳対象の文字列です。**Existing Suggestions**が翻訳候補です。翻訳候補内のロボットアイコンは、機械翻訳による候補、人のアイコンはコントリビューターのどなたかが行った提案です。候補内にいいものがあったら、ハートアイコンをクリックして投票してください。3投票集まると採用となります。

候補内に適切な翻訳がなかった場合は、**New/edit translation**欄に翻訳を入力して、**Suggest**ボタンをクリックします。自動的に1投票がつきます、自分が行った翻訳も3投票に到達すれば採用です。

## 最後に
以上、簡単ではありましたが、Microsoft Localization Community Platform (MLCP)の使い方を紹介しました。ぜひ、翻訳に貢献してVS Codeを多くの人にとって使いやすいツールにしていきましょう!!
Alexa Dev Summit Tokyo 2018参加レポート

# 開催概要
本イベントではAlexaスキル開発やAlexa Voice Serviceを使った製品開発に関心をもつデベロッパーやビジネス層にフォーカスし、基調講演やBreakout sessionを通じ、AWS re:Invent 2018で発表される内容を含むAlexaの最新テクノロジーアップデートを提供します。また、Alexaスキルの最新活用事例紹介、スキル開発ワークショップ、Alexaスキルやスマートホーム、Alexa搭載製品のデモンストレーションや展示など、これまでにない規模でのAlexaイベントです。

◆場所
会場：アマゾンジャパン合同会社
（東京都品川区上大崎3-1-1 目黒セントラルスクエア21F）

◆日時
2018年12月14日(金)～15日(土)

◆公式URL
https://alexadevsummittokyo.splashthat.com/

Amazon Alexaの開発者向けのイベント「Alexa Dev Summit Tokyo 2018」が目黒のアマゾンジャパン本社で開催されました。
2日間にわたる20以上のセミナー、ワークショップ、展示・体験コーナーが用意されていました。
参加者数は事前登録で700人超えだそうです。

# 簡易まとめ

### ポイント
・音声UIのみだったが、画面付きAlexaやfireTVのAlexa対応でさらに便利に
・AmazonPayの対応でマネタイズが可能に、既に決済系スキルも稼働中
・アメリカでは、Alexa対応製品の拡大、車載機器やスマートホームの普及、多彩な課金体系

・Alexaスキル開発はフロント部分は非エンジニアででき、エンジニアが必要な領域が縮小
・VUIのポイントは「自然、簡単、優しい」、GUIの考え方だとダメ、デザイナーが重要

・クラスメソッド、TOKAIコミュニケーションズ、Canonなどもすでにサービスとして提供中

### 今後
・生活のすべてにおいてAlexaが入り込むことを望んでいる
・AVS搭載のサードパーティーのデバイスの数の方が多くなるだろう

##### 個人的な感想
・Alexaは身近なところで様々な驚くような体験をさせてくれた。
・Alexaスキル開発はアイディアさえあれば簡単、単純。
・バックエンドはlambda、裏側ではAWSサービスが使えるので何かやりたい。
ファイルメーカー　旧バージョン(ver3)から最新版へ変換

# やりたい事

ファイルメーカーで作成されたファイル（ver.3）を最新のファイルメーカーver.17で開きたい

数ステップを経てバージョンを上げていく必要がある。


## ver3 → ver6

参考

[バージョン 7\.x より前の FileMaker Pro データベースの変換](https://fmhelp.filemaker.com/help/12/fmp/jp/html/fmp_basics.3.15.html#87125)
>FileMaker Pro 12 では、FileMaker Pro  1.x または 2.x で作成されたファイルは変換できません。FileMaker Pro 12 でこれらのファイルを使用するには、まず FileMaker Pro 6.x を使用してファイルを変換します。その後、最新の FileMaker Pro 11 評価版を使用して、ファイルをバージョン 11 に変換します。 このファイルは www.filemaker.co.jp/downloads でダウンロードできます。

### ファイルメーカーver.6の取得

以下からVer.6を取得する。
[ファイルメーカーPro 6 の評価版ダウンロード](https://support.filemaker.com/s/article/%E6%97%A7%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AE-FileMaker-%E3%81%8B%E3%82%89%E3%81%AE%E5%A4%89%E6%8F%9B-FileMaker-7-11-1503692924120?language=ja)

残念ながら、Mac版はOS Mojaveでは動作せず。
<img width="532" alt="スクリーンショット 2018-12-15 18.32.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/49910/066a2f3e-ea66-13ae-8d62-74bd8119821b.png">

Windows版で作業した。
無事に変換完了。拡張子.FP5になった。

## ver6 → ver11

### ファイルメーカーver.11の取得

以下からver11 無料評価版ダウンロード

* windows
http://fmdl.filemaker.com/TBUB/eleven/fmp_trial_fm_11.0.3.312.exe

* mac
http://fmdl.filemaker.com/TBUB/eleven/fmp_trial_fm_11.0.4.401.dmg

無事に変換完了。拡張子.FP7になった。

## ver11 → ver17

### ファイルメーカーver.17の取得

[FileMaker 17 Platform Trial Software](https://content.filemaker.com/filemaker-trial-ja)


無事に変換完了。拡張子.FP12になった。
docker-compose環境下でSESでメールを送ろうとしたらエラーになった

```
  <Error>
    <Type>Sender</Type>
    <Code>RequestExpired</Code>
    <Message>Request timestamp: Sat, 15 Dec 2018 08:23:45 GMT expired.
             It must be within 300 secs/ of server time.</Message>
  </Error>
```

サーバ時刻と300秒(5分)以上ずれてると送れませんよ、ということらしい。

```
# date
Sat Dec 15 08:24:56 UTC 2018
```

…日本時間になってないと分かりづらい。

```
# cp /etc/localtime /etc/localtime.org
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

で日本時間表示にする。

```
# date 12161003
date: cannot set date: Operation not permitted
Sun Dec 16 10:03:00 JST 2018
# ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# date
Sat Dec 15 17:26:46 JST 2018
```

権限がありません（`Operation not permitted`）と怒られて、時間が変更できない。
docker-compose.ymlの方で、privileged(`特権`)を設定する必要があります。

```docker-compose.yml
    privileged: true
```

```
# date 12161011
Sun Dec 16 10:11:00 JST 2018
# date
Sun Dec 16 10:11:01 JST 2018
```

怒られずに変更できました。

```
email send complete!!
```

メールも送れました。
EventHandlerのInvoke()が同期実行であることに今まで気付かなかったから実験した

#導入
ただのマヌケ話ですが、実験したコードと非同期で実行する方法についてのメモを記録しておきます。
もし同じ誤解をしている方がいたとして、役に立てれば幸いです。

#実験
超シンプルな実験用コードです。ConsoleアプリケーションでEventHandler<TEventArgs>を持つクラスのインスタンスを作り、意図的にイベントを起こします。
実行されるコードの周囲にConsole.WriteLine(string)をちりばめ、出力されるテキストから同期か非同期かを判断します。

```c#:Program.cs
using System;
using System.Threading;

namespace EventHandlerInvokeTest
{
    class Program
    {
        private static EventInvoker invoker;
        static void Main(string[] args)
        {
            invoker = new EventInvoker();
            invoker.TrialValueChanged += (sender, b) =>
            {
                Console.WriteLine("TrialValueChanged callback enter");
                Thread.Sleep(5*1000);
                Console.WriteLine("TrialValueChanged callback exit");
            };

            Console.WriteLine("Main sync start");
            invoker.TrialValueSync = true;
            Console.WriteLine("Main sync end");

            Console.WriteLine("Main async start");
            invoker.TrialValueAsync = true;
            Console.WriteLine("Main async end");

            Console.ReadKey();
        }
    }
}

```
イベントを実行するEventInvokerは掲題のInvoke()を実行するものと、恐らく非同期であろうBeginInvoke()を実行するプロパティを持ちます。

```c#:EventInvoker.cs
using System;

namespace EventHandlerInvokeTest
{
    public class EventInvoker
    {
        private bool _TrialValueSync = false;
        private bool _TrialValueAsync = false;

        public bool TrialValueSync
        {
            get
            {
                return _TrialValueSync;
            }
            set
            {
                Console.WriteLine("Set sync enter");
                if (_TrialValueSync != value)
                {
                    _TrialValueSync = value;
                    TrialValueChanged?.Invoke(this, _TrialValueSync);
                }
                Console.WriteLine("Set sync exit");
            }
        }

        public bool TrialValueAsync
        {
            get
            {
                return _TrialValueAsync;
            }
            set
            {
                Console.WriteLine("Set async enter");
                if (_TrialValueAsync != value)
                {
                    _TrialValueAsync = value;
                    TrialValueChanged?.BeginInvoke(this, _TrialValueAsync, null, null);
                }
                Console.WriteLine("Set async exit");
            }
        }

        public event EventHandler<bool> TrialValueChanged;
    }
}
```
#実行結果
最初に実行されたInvoke()はコールバックの終了を待ってからプロパティのSetが終わっていますが、次に実行されたBeginInvoke()はコールバックが始まるより先にSetが終わっています。

```
Main sync start
Set sync enter
TrialValueChanged callback enter
TrialValueChanged callback exit
Set sync exit
Main sync end
Main async start
Set async enter
Set async exit
Main async end
TrialValueChanged callback enter
TrialValueChanged callback exit
```
#非同期実行のBeginInvoke()について
実験では3番目と4番目にnullを突っ込んでいますが、まだここについてまとめてないので、でき次第アップデートします。

#おわりに
この件についてアドバイスいただいた先輩に感謝します。
[デリゲートを使用した非同期プログラミング](https://docs.microsoft.com/ja-jp/dotnet/standard/asynchronous-programming-patterns/asynchronous-programming-using-delegates)
Lambda Layersを触ってみた話

株式会社オプトの仙台開発拠点でエンジニアをしている @hiroshist です

## はじめに
【[AWS re:Invent 2018 Serverless re:Cap](https://pages.awscloud.com/AWSreInvent2018ServerlessreCap20181205-jp.html)】に参加し、AWS Lambda Layersを利用することでLambda関数で利用する共有ライブラリを管理できるようになったという事で試してみたいと思いましたので、
今回はNode.jsでLambda関数を作る際に利用している**Serverless Framework**で**Lambda Layers**を作成して見たいと思います。

## 開発環境
- Windows10
- Visual Studio Code
- Node.js
 
## インストール
折角なので、Serverless Frameworkをインストールする所から始めます

```
$ npm install -g serverless
```

```
$ serverless --version
1.35.0
```

バージョンを確認すると今回は**1.35.0**がインストールされました。

## サービスを作成
以下のコマンドを実行するとAWS Node.js用のテンプレートが**my-layers**というフォルダ配下に作成されます

```
$ serverless create --template aws-nodejs --path my-layers
Serverless: Successfully generated boilerplate for template: "aws-nodejs"
```

テンプレートとして以下の3ファイルが作成されている状態になります

```
.gitignore
handler.js
serverless.yml
```

## モジュールを作成
Lamdba関数で利用する日付を返すモジュール**term**を作成します

```
layer-dir # yamlで指定
  nodejs
    node_modules
      term
        index.js
```

### PATHについて
layersのPATHについては言語ごとに指定されているものがあるので詳細は以下のドキュメントを参考にしてみてください。
[configuration-layers-path](configuration-layers-pathhttps://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html#configuration-layers-path)

## コード
今回はシンプルに昨日の日付を返す関数を作成します

```
exports.yesterday = function () {
    var now = new Date();
    return new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1)
};
```

## yaml
serverless.ymlを更新します

```
layers:
  hello:
    path: layer-dir # 上記のモジュール作成時のPATHで指定した名称
    name: ${self:provider.stage}-MyLayerName
```

詳しい書き方は公式サイトを参考にしてみてください。
[AWS - Layers](https://serverless.com/framework/docs/providers/aws/guide/layers/)

## DEPLOY
deployコマンドを実行し、リモートに展開します。
「AWS Lambda - Layers」一覧に今回作成した**dev-MyLayerName**が追加されている事が確認できます。
[パッケージのダウンロード]ボタンから今回作成したモジュールをzipでダウンロードする事もできます。

```
$ serverless deploy
```

## Lamdbaでモジュールを呼び出してみる

### handler.js

```
const term = require('term');
module.exports.hello = async (event, context) => {
  return term.yesterday();
}
```

### serverless.yml

```
functions:
  hello:
    handler: handler.hello
    layers:
      - {バージョン ARN}
```

バージョンARNは
arn:aws:lambda:{region}:{account_id}:layer:${self:provider.stage}-MyLayerName:{version}
のような形になっています。

詳しい書き方は公式サイトを参考にしてみてください。
[AWS - Layers](https://serverless.com/framework/docs/providers/aws/guide/layers/)

### DEPLOY
最後にLambda関数もdeployコマンドを実行し、リモートに展開します。
実行するとLayersに作成したモジュールが呼び出されているが確認できると思います。

## さいごに
今回Layersを利用してみた感想です

- よく使うモジュールなどを一括管理でき、共有できるのは便利
- ただし、モジュールをLayersにする事でローカル等の環境をどうするのか課題（個人的はまだ解決策が見えていない）
 - 自動的に依存関係は解決して欲しい
- Layers側のバージョン管理が煩雑かも
 - deployするたびにバージョンはインクリメントされる
 - 頻繁に更新するようなモジュールはLayersで管理すると、呼び出し側の組み込みに工夫が必要そう
機械学習もpythonも全く触ってなかったwebエンジニアがJリーグのデータでSOMやってみたよ

この記事は[エイチームブライズ/エイチームコネクト/エイチーム引越し侍 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/hikkoshi) 16日目の記事です。

#概要
私は業務ではPHPとRubyを使っており、
pythonも機械学習もまったくやっておりませんでした。
遅ればせながら、私もここで初挑戦してみたいと思います。

私の趣味がサッカー観戦なのですが、試合データを機械学習しているこんな記事を発見しました。
http://www.football-lab.jp/column/entry/670/
こちらにあるようなSOM（自己組織化マップ）の図をつくってみたい！
ということで、2018年のデータでこんなふうに、
プレースタイルが似ているチームが可視化できる図を自分で作るのが今回のゴールです。

SOMについて詳しく知りたい方はこちらを参考に
http://gaya.jp/spiking_neuron/som.htm
http://www.brain.kyutech.ac.jp/~furukawa/data/SOMtext.pdf


#環境構築
Anacondaを[こちら](https://www.anaconda.com/download/#macos)からインストールします。
Anacondaにはpython、モジュールやエディタがパッケージになって入っているものです。
なのでこれさえインストールしてしまえば環境は整います。やったね！

#データ
もととなるデータはfootball-labに載っている、[チームスタイル指標](http://www.football-lab.jp/summary/team_style/j1/?year=2018)を使わせていただきます。
項目は、攻撃セットプレー、左サイド攻撃、中央攻撃、右サイド攻撃、ショートカウンター、ロングカウンター、敵陣ポゼッション、自陣ポゼッションの８項目です。

#実装
参考にしたのはこちら！
https://codesachin.wordpress.com/2015/11/28/self-organizing-maps-with-googles-tensorflow/

tensourflowがインストールされなかったのでいれてみたらそのままでは動かず・・・
バージョン違い等の問題があるみたいなので一部修正しました。
参考：https://qiita.com/shu223/items/ef160cbe1e9d9f57c248

#問題発生
今回のデータは18チーム×8項目で、18行×8列の行列ですが、
このプログラムでは８次元のデータは可視化できず、次元圧縮をする必要があることがわかりました。
（見本は3次元のため、色で表現可能）

次元圧縮する方法もいろいろ調べましたが、タイムオーバーで間に合わず・・・・:sob:
今回は4項目に減らして4次元で行うことにします。(4次元なら可視化できるため)
ちなみに項目は、攻撃セットプレー、中央攻撃、ロングカウンター、自陣ポゼッションにしました。

#実行結果
実行結果
![400回.png](https://qiita-image-store.s3.amazonaws.com/0/93882/871a3e61-c648-8afb-f9ef-5f519e04f36e.png "400回")
こうなりました。
なんか・・・・・・・・・・・・微妙ではw・・・・・？
あまり近くになってるチームがいない気がします。
左上の川崎＆名古屋と左下の横浜＆柏くらい・・・・。


そこで学習回数を変えて試してみました。
![10回.png](https://qiita-image-store.s3.amazonaws.com/0/93882/733a92a6-8f30-2666-acec-eb91e6cfa207.png "10回")　![100回.png](https://qiita-image-store.s3.amazonaws.com/0/93882/f00945f7-6bd0-a936-bc1f-ff90e2d8a295.png "100回")
　　　　  10回　　　　　　　　　　　　　　　　100回
![400回.png](https://qiita-image-store.s3.amazonaws.com/0/93882/871a3e61-c648-8afb-f9ef-5f519e04f36e.png "400回") ![1000回.png](https://qiita-image-store.s3.amazonaws.com/0/93882/273f7718-f6f2-9f85-967b-4e02248ac8ea.png "1000回")
　　　　 400回(初期値)　　　　　　　　　　　　　　　　1000回

回数を重ねるごとにとチーム間の距離が等間隔に開いていっています。
今回は初期値の400回がちょうど良さそうだと感じますが、
分析するデータによってちょうどいい回数も変わってきそうなのが難しそうだと感じました。

#まとめ
- かろうじて目的のグラフは完成しました。
- しかし、クオリティーには満足行ってない&今度は8次元で実現させたいです。
- 他の手法もいろいろ試してみたいです。

#お知らせ
エイチームグループでは一緒に活躍してくれる優秀な人材を募集中です。
興味のある方はぜひとも[エイチームグループ採用ページ](https://www.a-tm.co.jp/recruit/)（[Webエンジニア詳細ページ](https://www.a-tm.co.jp/recruit/requirements/career/lifestylesupport-webengineer/)）よりお問い合わせ下さい。

#明日
明日は新卒エンジニアの@anneauが書いてくれますよー！楽しみですね！
デカい！血管うねうねマスクメロン！と叫んでくるSlack Botを作った💪

[Slack Advent Calendar 2018 - Qiita](https://qiita.com/advent-calendar/2018/slack) の15日目の記事です。

遅刻して申し訳ございません :bow: 

概要
----

みなさんはボディビル大会での**かけ声**という文化をご存知でしょうか。

>辛く苦しいトレーニングを乗り越え、自分だけの肉体を作り上げてきた選手たち。ステージにたどり着くまでに、どれほどの努力を積み重ねてきたのか。そのバックボーンへの感動と賛美の声が自然と声に出てしまう。それがボディビル大会における"かけ声"の正体。
*--- スモール出版 「ボディビルのかけ声辞典」 より引用*

最近ではテレビなどでもよく特集されているので、ご存知の方も多いと思います。
(自分もネットで話題になっていて知りました)

とても個性的で面白いかけ声が多く、会社でも一部のメンバーがよく使っていたりまします

エンジニア> このコントローラー、厚みがあって**デカい**!
エンジニア> (JSファイルが500KBを)**切れてる!切れてる！**

というわけで、かけ声をランダムに発言してくれるBotを作ってみました💪

# 作成したもの

<a href="https://github.com/tamanugi/muscle_shout_man"><img src="https://qiita-image-store.s3.amazonaws.com/0/55219/2e606000-e0d6-f487-4060-b24184e62bca.png" width="460px"></a>

![スクリーンショット 2018-12-16 09.43.05.png](https://qiita-image-store.s3.amazonaws.com/0/55219/90ffb0a4-95e3-233e-401e-251797db30f0.png)

:muscle: が最後につくか,emoji reaction で :muscle: がつけられたときに反応します🏋️‍♂️

# 実装

実装は Elixir で行いました。
Slackへの連携部分は [Elixir-Slack](https://github.com/BlakeWilliams/Elixir-Slack)というライブラリがあったのでそちらを使用しています。

```elixir
  def handle_event(message = %{type: "reaction_added", reaction: "muscle" <> _}, slack, state) do
    %{item: %{channel: channel}, item_user: user_id} = message
    shout(user_id, slack, channel)
    {:ok, state}
  end

  def handle_event(message = %{type: "message"}, slack, state) do
    %{text: text} = message
    if text |> String.ends_with?(":muscle:") do
      shout(message.user, slack, message.channel)
    end
   {:ok, state}
  end
```

SlackからのRTMをパターンマッチして処理をかけるので、とても実装が楽でした。  
かけ声は [ボディビルのかけ声辞典](http://amzn.asia/d/j1cyQHT)とネットでまとめられたものを載せています。

みなさんもよかったら使ってみてください💪
(個人的には `そこまで仕上げるために眠れない夜もあっただろうに` が好きです。デプロイした人に言ってあげたい)
electronベースのreact用IDEエディタ Reactide

2018.12.16 wrote

# Reactide
[Reactide](http://reactide.io/)


![Kobito.YPHpoC.png](https://qiita-image-store.s3.amazonaws.com/0/49910/217231ef-d75e-00ea-1340-baa53076ff8c.png "Kobito.YPHpoC.png")


>Reactide is the first dedicated IDE for React web application development. It’s a cross-platform desktop application that offers a custom simulator, making build-tool and server configuration unnecessary. Developers can render a project in the browser instantly with just a click of a button by opening a single file.

>While React is still in active development, we’re keeping a weather eye on what they do have available. An integrated Node server and custom browser simulator eliminates the need for server config and build-tools. All projects developed in Reactide are build-tool agnostic. Reactide also offers a visual editing solution with a live-representation of the project’s architecture. There’s also a bunch of straightforward GUI controls that make it easier than ever to get immediate feedback in the browser simulation.

>More information about Reactide is available here. Reactide is free and open source.



## ビルド

```
git clone https://github.com/reactide/reactide.git

git checkout 2.0-release
npm install
npm run webpack
npm run electron-packager
```


## 実行

/release-builds/Reactide-darwin-x64/ に実行ファイルが出来ているのでReactideを実行する。
初期状態が起動すれば成功です。

![スクリーンショット 2018-12-16 9.25.15.png](https://qiita-image-store.s3.amazonaws.com/0/49910/d5310550-3aee-4709-1448-08de05645706.png "スクリーンショット 2018-12-16 9.25.15.png")



File → NerProject で作成してみます。

作成と同時にcreate-react-appが走り新しいReactプロジェクトが作成されました。

![スクリーンショット 2018-12-16 10.05.29.png](https://qiita-image-store.s3.amazonaws.com/0/49910/a04a0fee-58be-392b-d8ec-7faf79a76f56.png "スクリーンショット 2018-12-16 10.05.29.png")


src/index.jsを開いてみます。
右上にボタンが現れるので真ん中のボタンを押してみるとシミュレータが起動します。

![スクリーンショット 2018-12-16 10.06.52.png](https://qiita-image-store.s3.amazonaws.com/0/49910/81bd6e22-c6a3-1d6e-a272-5d0c7f67d8c1.png "スクリーンショット 2018-12-16 10.06.52.png")

![スクリーンショット 2018-12-16 10.08.52.png](https://qiita-image-store.s3.amazonaws.com/0/49910/731d37f4-7957-6cb0-fc8c-b26bc737011b.png "スクリーンショット 2018-12-16 10.08.52.png")


ソースを変更するとリアルタイムにシミュレータに反映されます。

![スクリーンショット 2018-12-16 10.10.33.png](https://qiita-image-store.s3.amazonaws.com/0/49910/f43263c7-79f6-e216-884d-37610f0851f9.png "スクリーンショット 2018-12-16 10.10.33.png")