OmniAICreator/Qiita-1.07M huggingface dataset:
Duckling  (•ө•) を使って時間、日付抽出をしてみた！

#Duckling ってなに？
Ducklingとは、もともとClojureだったProjectがHaskellに移行し、Facebookの一部のプロジェクトが使用しているオープンソース自然言語テキスト分析の事です。

#Duclkingの名前の由来は？
Ducklingは、もともと“Picsou”と呼ばれていました。“Picsou”はフランス版のドナルドダックのことで、なんでも食べてしまうところから名付けられました。後に英語のコミュニティに親しみやすくするため、ドナルドダックの“duck”と言語学(linguistic)のlingを取って“Duckling”と改名することにしました。

#Duckling で何が出来るのか？
以下の情報を、自然言語のテキストから抽出出来ます。

- 金額
- クレジットカード番号
- 単位
- 距離
- 時間間隔
- メールアドレス
- 数字
- 順序
- 電話番号
- 数量
- 気温
- 時刻
- URL
- 体積

#Ducklingのここがすごい！

抽出した情報の中に、誤字が多少混ざっていても上手に拾ってくれます。
以下サイトで試せます。
https://duckling.wit.ai/#faq
#それでは実際に試してみましょう！
ここでは、Haskell環境構築は割愛させていただきます。
home brewを使うなり、cabalなりstackを使うなりご自由にどうぞ。

以下は、あと2分で会議がはじまるよー
あと2分で行くよー　等の文から抽出した例です。

```bash
$ stack repl --no-load
> :l Duckling.Debug
> debug (makeLocale EN $ Just US) "in two minutes" [This Time]
in|within|after <duration> (in two minutes)
-- regex (in)
-- <integer> <unit-of-duration> (two minutes)
-- -- integer (0..19) (two)
-- -- -- regex (two)
-- -- minute (grain) (minutes)
-- -- -- regex (minutes)
[Entity {dim = "time", body = "in two minutes", value = RVal Time (TimeValue (SimpleValue (InstantValue {vValue = 2013-02-12 04:32:00 -0200, vGrain = Second})) [SimpleValue (InstantValue {vValue = 2013-02-12 04:32:00 -0200, vGrain = Second})] Nothing), start = 0, end = 14}]
```
2分後がちゃんと抽出できました。
もっと便利な機能がありますので、機会があり次第アップデート、あるいは別記事で書きたいと思います。


以上
ありがとうございました。(•ө•) (•ө•) (•ө•) 
***
Thanks
Mr, Julien Odent
緊急度の低い学習には読書会が向いている

# 言いたいこと
- 会社のチーム内で読書会を始めたら、得るものがあった
    - 理解が進んだ
    - 興味が湧いた
- 緊急度の低い学習には読書会が向いているかもしれない

# 読書会の内容
## 書籍
- Kubernetes完全ガイド
- ゼロから作るDeep Learning

## 参加者
- 基本的に自由
- 実際にはチーム内の5人くらい

## 運用方法
- 週に1回, 1時間以内
- 担当者を決めて予習, 解説してもらう

## 始めた理由
- プロジェクト内で似た作業が多く, 業務に飽きることがあるという意見があった
- レコメンドの精度をあげたいという意見があった
- よくわからないけど、Deep Learningの本でも読んでみますかという提案したら通った
- やってみたら、続いた
- インフラ理解もしたいからKubernetes完全ガイドも、ということになった

## 結果
- Deep Learning, Kubernetesの理解が進んだ
- やってみたら面白くなった

# 感想
- 緊急度の低い分野の学習には読書会が向いている
- 読書会のメリット
    - 主体性がなくても最低限進む
        - 進捗を惰性に任せられる
        - 下調べと説明を担当者に任せられる
    - 学習が進むと興味が湧いてきて主体性がうまれる
        - 誰も興味が湧かなかった場合, テーマ設定に失敗した可能性がある
            - その場合, いったん中止にしちゃっていい
- 読書会のデメリット
    - 進捗が遅い
        - 緊急度の高い学習は一気に個人でやるほうがよい。
            - YAGNI最強

- 読書会に向いている分野
    - 緊急度が低い分野の学習
        - 例えばチーム内R&D

- 緊急度が低いものにリソースを割いてよいかという問いに対する答え
    - 緊急度が低くても重要度が高いものがある
        - 『7つの習慣』という書籍は、「緊急度が低く重要度が高いものに時間を割くべき」としているらしい
        - 投資となるらしい

- 組織によい惰性を組み込みたい
    - 努力家・勉強家であることを前提にしない

---


最後になりますが、PORT株式会社では自社サービスを支えてくれる優秀なRubyエンジニアを募集しています(Rubyエンジニア以外も)。
もくもく会も行なっていますので、ぜひ一緒にもくもくしましょう！
[PORTもくもく会](https://freestyle-mokumoku.connpass.com/event/113494/)

[PORT Advent Calendar](https://qiita.com/advent-calendar/2018/port)はまだまだ続きます。乞うご期待！
アタック25のアルゴリズム

Qiita、下書きが溜まっていたので年末大掃除ってことで書いていきます。

昔、codeiqというサイトで出されていた問題で、
アタック25のアルゴリズムを実装しろという問題がありました。

オセロやリバーシでは、自分の色がなくなった場合は即負けですし、
挟めない場合は自動的にパスになるのですが、アタック25ではこの場合のルールが追加されています。
http://asahi.co.jp/attack25/rule/

まず、ルールを整理します。
1. 挟む事ができるパネルを取ることが出来る
2. 次に挟むことが出来るパネルを取ることが出来る
3. 今まであるパネルにくっつけて取ることが出来る。
4. 13を取ることが出来る

上からルールを見ていき、そのルールでは取れるパネルがないときのみ下のルールを参照します。
最初のルールはオセロでもおなじみのルールです。
2番めのルールは、次の問題で連続で正解した場合、パネルで挟むことができる場所を取らないといけない、というルールになります。
3番めは2番めのルールで候補がなかった時で、取られているパネルに隣接(斜め含む)している場所です。
4番目は初期状態の時のことですね。

ということで、それぞれのルールごとに候補を出していって、
なければ次のルール、というふうに考えていきます。

まず、挟むというのはどういうことかをもうちょっと厳密に定義しましょう。
他人の色が連続し、最後に自分の色が来る場所が挟める場所です。
正規表現風に書くと[空きマス][他人の色]+[自分の色]のとき、空きマスが挟める場所です。

では、これをアルゴリズムに落としていきます。
引数としてパネルの位置を取り、以下の処理をする関数を作ります。
引数で得た位置から、8方向に対して歩いていきます。
1歩目　他人の色→継続
 　　　それ以外→失敗/中断
2歩目　他人の色→継続
 　　　空きマス→成功、このマスを記録/中断
 　　　それ以外→失敗/中断

1番目のルールで、自分の色のマスに対してこの関数を実行します。
すべての自分の色のマスでこの関数を実行したあと、候補が0なら次のルールに移り、
候補があればそれらを出力して中断します。

2番めのルールでは、自分の色のマスのかわりに空きマスに対してこの関数を実行します。
次に挟むことが出来る場所とは、空きマスの場所を自分が取れていると仮定したら
挟むことが出来るマス、という意味になります。
これも候補があれば中断し、なければ次のルールに行きます。

3番めは簡単ですね。
すべての取られているマスの八方向のマスが取ることが出来るマスです。

4番目は13と固定ですので簡単です。
owncloud の 署名の更新について

# なにか?

owncloud を apt-get でinstallした場合、apt-get update; apt-get upgradeなどで更新を期待するが、

```
エラー:10 http://download.owncloud.org/download/repositories/stable/Ubuntu_16.04  Release.gpg
  以下の署名が無効です: KEYEXPIRED 1535163442  KEYEXPIRED 1535163442  KEYEXPIRED 1535163442  KEYEXPIRED 1535163644  KEYEXPIRED 1535163442  KEYEXPIRED 1535163442  KEYEXPIRED 1535163442  KEYEXPIRED 1535163442  KEYEXPIRED 1535163644
```

のようにowncloudの署名が切れた場合の対処方法 (覚書)

# 修正方法

```
$ wget http://download.owncloud.org/download/repositories/stable/Ubuntu_16.04/Release.key
$ sudo apt-key add - < Release.key
```
mackerel-plugin-accesslog の Apache 2.2 用 LTSVログ設定

mackerel-plugin-accesslog
導入の覚書です。

## プラグインインストール

https://mackerel.io/ja/docs/entry/howto/mackerel-agent-plugins

```
yum install mackerel-agent-plugins
```

## Apache LTSV ログフォーマット
```
cd /etc/httpd/conf.d
vi 00_ltsv_log.conf

LogFormat "vhost:%{Host}i\thttps:%{HTTPS}e\ttime:%t\tforwardedfor:%{X-Forwarded-For}i\thost:%h\tmethod:%m\tpath:%U%q\tprotocol:%H\tstatus:%>s\tsize:%B\treferer:%{Referer}i\tua:%{User-Agent}i\treqtime_microsec:%D\tcache:%{X-Cache}o\truntime:%{X-Runtime}o" apache_ltsv

```
ここにこれだと大丈夫という LogFormat を書いといてくれればよいなあ、、、
https://github.com/mackerelio/mackerel-agent-plugins/tree/master/mackerel-plugin-accesslog

参考：
https://mackerel.io/ja/blog/entry/advent-calendar2017/day9-mackerel-plugin-accesslog
https://twitter.com/hogem/status/1039798293742608385
http://ltsv.org/

time:%{%d/%b/%Y:%H:%M:%S %z}t
だとmackerel が受け付けてくれない？ -> 大丈夫。
[] 無しでも大丈夫そう。

reqtime がないとダメ？
req もないとダメ？

## マカレル設定

```
vi /etc/mackerel-agent/mackerel-agent.conf

[plugin.metrics.accesslog]
command = "mackerel-plugin-accesslog /var/log/httpd/access_ltsv.log"

service mackerel-agent configtest
service mackerel-agent reload
```
[自作キーボード]LEDがつかない/光らないときに見るページ

この記事は[全部俺 Advent Calendar 2018](https://adventar.org/calendars/3702)の23日目の記事です。
めちゃくちゃピンポイントな記事ですが、同じように困ってる人間が日本に1人だけでもいると信じて書き留めます！
誰かの役に立ってくれれば本望です！

# キーボード自作初心者あるある？
よし、ようやくダイオードとLEDを全てはんだ付けし終わったぞ(；・∀・)
とりあえず先にPro Microにファームを焼いて、LEDが全部光るかどうか確認してみよう！

**・理想**
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Helix keyboard LED <a href="https://t.co/dJbz5MXy2x">pic.twitter.com/dJbz5MXy2x</a></p>&mdash; tez (@te22eret) <a href="https://twitter.com/te22eret/status/1076850606109650944?ref_src=twsrc%5Etfw">2018年12月23日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


**現実**
![全部光らない.jpg](https://qiita-image-store.s3.amazonaws.com/0/190807/e7ee4251-e5a9-1345-def7-de359e30a6f4.jpeg)

(　ﾟдﾟ) ・・・

(´；ω；｀)ﾌﾞﾜｯ

## この記事の対象者
- 自作キーボードを作ってみたはいいが、LEDが途中からつかなくなった/光らなくなった方
- そもそも1個もLEDがつかない/光らない方

## 伝えたいこと
**熱でLEDがダメになっている可能性を考えるよりも先に、光ってないLEDとその1個前のLEDのはんだ付けを確認してください！！**

光ってないLEDを取り替えても点灯しなかった場合、そのLEDの1個前のLEDのはんだ付けがきれいにできていない可能性が高いです。

## キーボードのLED
（大抵の）キーボードのLEDは、電気回路的に直列につながっています。
LEDは、発光ダイオードとも呼ばれます。ダイオードなので、一方向にしか電流を流しません。
上のキーボードにおいて、USBから給電しているところを電源と抵抗で表すと、回路図のイメージはこんな感じです。（あくまでイメージ優先で、精緻な表現ではないことをご留意くださいm(_ _)m）
<img src="https://qiita-image-store.s3.amazonaws.com/0/190807/68fe9fa1-9157-c470-ac4e-8a5a2dcb3859.png" width=50%/>
（画像では5列のHelixを使用していますが、回路図では4列で表現しています。）

### LED自体が熱などでだめになってしまった場合
LED自体がダメに成ってしまった場合、回路図的にはこうなってしまうので2列目左から3番目**以降**すべてのLEDが光らなくなってしまいます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/190807/b2375f12-5f9a-42d3-cf55-91144a859e28.png" width=50%/>

この場合は、問題となっている2列目左から3番目のLED自体を交換すればそれ以降も光るはずです！
1個も光ってない場合は最初の1個目（USB給電のすぐ隣のLED）を交換してあげればOKです。

### LEDのはんだ付けが上手くいっていない場合
いもはんだを避けようとしすぎるあまり、はんだが少なすぎて実は電通していないときに陥るパターンです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/190807/89e64630-577d-3f8d-1960-d24e00db3e74.png" width=50%/>
この場合、はんだ付けが上手くいっていない箇所は2パターン考えられます。

- 2列目左から2番目のLEDの**出口側**のはんだが少ない場合
  - この場合、`2列目左から2番目のLED`自体は光っていることがあるため気づきにくいです
- 2列目左から3番目のLEDの**入口側**のはんだが少ない場合

はんだ付けがうまくできていない場合、次のLEDへの接続がうまく行かずに光らない場合があります。
これ、問題のあるLED自体は光るので発見しにくいです。実際ハマりました。。

## 所感
これを解決するのにものすごく時間を取られました。。電流マルチメータも新しく買いましたし。。
最初の方は270℃ではんだごてを使用していたので、熱で壊れたに違いない！と思いこんでしまっていました。でも何度LED付け替えてもうまく光らずやきもきしていました。。
（手早くやったおかげで、実際熱で壊れていたLEDはありませんでした。真似しないでください。ちなみにHelixの場合、LEDはんだ付け推奨温度は[約220℃](https://github.com/MakotoKurauchi/helix/blob/master/Doc/buildguide_jp.md)です。）
言われたら当たり前としか言いようがないですが、経験値の少ない自作キーボーダーは割とハマる・・・かもしれません。
めげずにキーボード作っていきましょう！

・・・本当のキーボード自作者のあるあるは、かっこいいUSBケーブルとTRPSケーブルを見つけられないことだと思います:(
良いケーブル情報あったらご教授お願いします:bow:
letsencrypt renew での TLS-SNI-01 is deprecated, and will stop working soon. の対処

```letsencrypt renew`` での ```TLS-SNI-01 is deprecated, and will stop working soon.``` の対処について.

# http-01 challenge

dns challenge または http-01 challenge (default) のみしか、実質letencrypt-autoでの更新ができなくなりました (SSL (Port 443)でのchallengeができなくなった)

(大昔にletsencryptの設定をしたきりだったので)非常にやっかいだったので、ここに示します。

1. letsencrypt-auto --standalone では、 lentsencrypt内蔵のサーバーが、challengeを請け負います。
   * これは特に不変ですが重要なことです。
   * apache2を止めていない人は止めることが必要 ```service apache2 stop```
2. http-01とは、素のhttp (Port:80)が、challengeのresponseをします。
   * ルーターの設定で、port:80をこれまで閉じていた人は開ける必要がある.
   * また、apache2を止めておくこと
   * そして、ルーターだけでなく、自分の環境(Ubuntu)のfirewallもPort:80を開ける必要があります!!! ```# ufw allow 80```

僕が間違えていたことは、

* 下で書いたobsoleteなやり方で対応ができていたはずと思っていたので、Port:443でchallengeが受けられると勘違いしたこと。
* challengeに、 ```tls-sni-01``` がなくなったこと. 代替手段はdns or http-01 (Port:80)です。実質、http (Port:80)が万人が移行可能なプランです。
* ルーターのポートフォワーディングで、別PortをPort:80に割り当てることで、http://でアクセスできていたので、なぜ、letsencrypt-autoのchallengeが通らなくなっていたのか不明であったこと。(```ufw allow 別のPort``` になっており、 ```ufw deny 80```していたのでした。なので、```ufw allow 80```がキーでした。```---standalone```の場合)


# 以前の対処 (4/E/2019までで使えなくなりました)

```
Warning: apache2.service changed on disk. Run 'systemctl daemon-reload' to reload units.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Cert is due for renewal, auto-renewing...
Renewing an existing certificate
Performing the following challenges:
tls-sni-01 challenge for xxx.xxx.xxx.jp
TLS-SNI-01 is deprecated, and will stop working soon.
Waiting for verification...
Cleaning up challenges
```
のように、TLS-SNI-01使えなくなるよのメッセージが出るときには、
以下のように、apache2のssl.confを修正して、TLSを無効化しましょう。

```
# vi /etc/apache2/mods-available/ssl.conf
```

```/etc/apache2/mods-available/ssl.conf
..snip..
	#   The protocols to enable.
	#   Available values: all, SSLv3, TLSv1, TLSv1.1, TLSv1.2
	#   SSL v2  is no longer supported
-	SSLProtocol all -SSLv3
+	SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
..snip
```
Handsontable for Vueの紹介

# はじめに
これは、[Vue.js #2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vuejs-2)の23日目の記事をなります。
また、[Handsontable Advent Calendar 2018](https://qiita.com/advent-calendar/2018/handsontable)の23日目の記事も兼ねています。

【2021/08/04追記】
ようやく、本格的にHandsontable for Vue を触ることにしたので、分かったことを追記していきます。

# Handsontableとは
「Handsontable(ハンズオンテーブル)」は、WEBでExcelのようなスプレッドシートライクな入力を可能にしてくれるJavaScriptライブラリです。
[ポーランド](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89)に会社がある「Handsontable」が開発しています。
公式サイト：https://handsontable.com/
ライセンスは、MITとなっており、有料版「Handsontable Pro」があります。

[デモ](https://handsontable.com/examples?manual-resize&manual-move&conditional-formatting&context-menu&filters&dropdown-menu&headers)で見るとわかりますが、Excelのようにデータ入力ができるだけでなく、セルの書式の指定やチャートが作れたりと、機能が多いのも魅力です。

Handsontableは公式が Vue.js 向けのラッパーを出しています。
https://github.com/handsontable/vue-handsontable-official

【2019/04/13追記】
>Handsontable7.0.0は6.2.2と大きく変わりました。
まずHandsontable ProはHandsontable Community Editionと統合されてHandsontableは1つだけになりました。(中略)
MITライセンスではなくなり、非商用および評価版のみ無償のライセンスになりました。
[Handsontable 7.0.0を使う人へ](https://qiita.com/misohagi/items/9fcf4d3c0329cf086828)

Handsontable 6.2.2以前のバージョンならMITライセンスが適用されます。
Handsontable for Vue についてはMITライセンスとなっていますが、内部で Handsontable を使用していますので、7.0.0以降を使う場合はMITライセンスにはなりません。

# 導入方法
【2021/08/04追記】
MITライセンスのHandsontable 6.2.2を例にします。

npmからhandsontableと公式ラッパーの@handsontable/vueをインストールします。
※ラッパーである@handsontable/vueはhandsontable本体を含んでいません

```
npm install handsontable@6.2.2
npm install @handsontable/vue@3.1.0
```

Handsontable 6.2.2に対応するのが、@handsontable/vue@3.1.0となります。
また、vue.jsは2.6.14となります。

## Package Installerで導入する
Handsontable はNuGet版が用意されていますが、vue-handsontable-officialのNuGet版が用意されていないため、Visual Studioの場合には Package Installerをインストールするといいでしょう。
ツール->拡張機能と更新プログラムから拡張機能と更新プログラムの画面を開きます。オンラインを選択し、package installerを検索します。

インストール完了後(Visual Studio再起動)に、プロジェクトの右クリックメニューで「Quick Install Package」を選択します。
画面表示後に「npm」を選択、「@handsontable/vue」を入力してバージョンを3.1.0にしたら「Install」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/b97c60e9-78c3-ec2b-6fef-db12468da41d.png)

# 動作方法
ごめんなさい。あとで動作する部分を書きます。

【2021/08/04追記】
タイトルが紹介になっているので、今後は下記記事に引き継ぎます。

https://qiita.com/yaju/items/7bf9cb45bf180b6a600c
[cocoa][swift]Universal Links

<p>以前、組み込みWebブラウザの会社に勤めていた関係で、独自の機能の呼び出しにURLスキームを利用する方法はよ馴染みがある。iOSでも同様にCustom URL Schemeを利用してアプリケーションを呼び出すことができるが、この方法は、スキームが重複と、意図しない外部サービスから呼べるという問題がある。</p>

<p>そこで登場したのがUniversal Links。</p>

<p>ただ、Custom URL Schemeの知識は必要だと思うので、まずは説明する。</p>

# Custom URL Scheme
<p>形式は、以下のとおり。</p>
<pre><code>スキーム名://〜
</code></pre>

<p>スキーム名は、重複を避けるため、ドメイン名を逆から並べる、バンドルIDから派生した文字列がオススメされている。例えば、バンドルIDがcom.example.editorのアプリケーションの一覧画面を表示するスキーム名は、com.example.editor.listという感じにする。</p>

<p>Custom URL Schemeは、Info.plistに定義するが、Xcodeの画面から設定する方法もある。</p>

<p>まずは、Info.plistでの設定箇所を説明する。</p>

<ul>
<li>URL typesの
	<ul>
	<li>Item nに</li>
		<ul>
		<li>URL identifierにユニークな識別子を設定。バンドルIDから発生した文字列がオススメ。</li>
		<li>URL Schemesに
			<ul>
			<li>Item nに、スキーム名を設定。複数設定可能。</li>
			</ul>
		</li>
		</ul>
	</ul>
</li>
</ul>

<p>Xcodeの画面から設定する場合は、TARGETS ＞ Info ＞ URL Types のIdentifierに識別子をURL Schemesにスキーム名を設定する。</p>

<p>iOS9以降では、安全性の観点からLSApplicationQueriesSchemesを設定するなどの対応が必要となる。</p>

# Universal Links
<p>iOS9以降から利用可能。なので、それより前のバージョンをサポートする場合は、Custom URL Schemeの対応も必要。</p>

<p>対応手順は以下のとおり。</p>

<p>Webサーバのルートに、関連付けファイル (apple-app-site-association) を配置する。</p>
<pre><code>{
	"applinks": {
		"apps": [],
		"details": {
			"チームID.com.example.アプリ名（バンドルID）": {
				"paths":[ "*" ]
			}
		}
	}
}
</code></pre>

<p>ファイル名は apple-app-site-association。</p>
<p>Content-Typeは application/json。</p>
<p>Appleの資料では、署名がある場合のContent-Typeは、application/pkcs7-mimeという説明があるが、Webサーバとの通信はHTTPSが推奨されているので署名されてなくても、なので、訳あってHTTPの場合の対応のようだ。</p>

<p>ちなみに、署名する場合は、以下の感じのコマンドとなる。</p>

<pre><code>$ openssl smime \
    -sign \
    -nodetach \
    -in "unsigned.json" \
    -out "apple-app-site-association" \
    -outform DER \
    -inkey "private-key.pem" \
    -signer "certificate.pem"
</code></pre>

<p>アプリケーション側の設定は以下のとおり。</p>

<p>XcodeのTARGETS ＞ Capabilities ＞ Associated Domains をONにして、Domainsにサーバのドメイン名を設定する。</p>

<p>これで、App ConnectのAppIDsが、この内容で更新されるはずだが、されていなかったら手動で変更する。</p>

<p>Universal Linksには、Universal Linksの設定が正しいかどうかを確認するサイトが用意されている。</p>
<ul>
<li>App Search API Validation Tool<br />https://search.developer.apple.com/appsearch-validation-tool/</li>
</ul>

<p>Universal Linksからの呼び出しは、UIApplicationDelegateの、以下のメソッドで検出できる。</p>

<pre><code>optional func application(_ application: UIApplication, 
                 continue userActivity: NSUserActivity, 
       restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
</code></pre>

【関連情報】
<a href="https://qiita.com/advent-calendar/2018/cocoa">Cocoa Advent Calendar 2018</a><br />
<a href="https://cocoa-kanto.connpass.com/event/111294/">Cocoa.swift 2019-01</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
New Relic APMでDistributed Tracingを利用する

# New Relic APM(PHP)でDistributed Tracingを利用する

[昨日](https://qiita.com/oh-sky/items/b69f00ddb22bbf958912)に引き続きNew Relic APMに関する内容です。

今年の7月末、New Relic APMでDistributed Tracingが利用できるようになりました。
複数のサービスが連携して動くアプリケーションの動作を、詳しく分析できる機能です。

複数サービスの追跡をできる機能としてはもともとCross Application Tracesというものがありました。
しかしこの機能は、各サービスの関係性を図式化できるだけで、各サービスのパフォーマンスについてはそれぞれのAPM Navigatorでしか見ることができません。

対してDistributed Tracingは、1つのWebトランザクションに対して各サービスがどのような処理を行なっているか、1つの画面で詳しく見ることができます。

## Distributed Tracingの利用準備

### 利用条件
- New Relic APM Professionalの契約をしている
- Distributed Tracingに対応したバージョンのAgentを利用している

この条件を満たしている場合のみ利用できます。

### agentの設定
New Relic Agentの設定ファイルで、`transaction_tracer.enabled`と`distributed_tracing_enabled`を有効にします。
例として、PHPの場合は /etc/php.d/newrelic.ini に下記を追記します。

```
newrelic.transaction_tracer.enabled = true
newrelic.distributed_tracing_enabled = true
```

*※transaction_tracer.enabledはデフォルト値がtrueなので、falseを指定していなければ明示的に書かなくても動きます。*

## Distributed Tracingの見方

<img width="1024" alt="Screen Shot 0030-12-23 at 22.22.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/13038/0a761445-aaab-9f0c-dd6d-5a81a93278cd.png">
APM NavigatorのTransactionsを開き、詳細を見たいトランザクションを選択します。右ペイン上部に表示される「Find distributed traces for this transaction」をクリックします。

<img width="1039" alt="Screen Shot 0030-12-23 at 22.23.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/13038/2f873b2c-59d5-fad8-8895-fe6f087f7e42.png">

ここから先がDistributed Tracingの画面です。
Distributed Tracingでは、同一のリクエスト内で行われた処理のまとまりをトレース、処理の中で実行された通信をスパンと呼びます。

グラフはトレースのレスポンスタイムの分布を表したもので、縦軸がレスポンスタイム、横軸が時間の流れです。エラーが発生したトレースは赤い点でプロットされます。

グラフの下には、プロットされているトレースの情報が一覧で表示されます。SERVICES列にはそのトレースで呼び出されたサービスの数、TOTAL SPANSには発生した通信の数が表示されます。

グラフ上の点や一覧の行をクリックすると、そのトレースの詳細画面へ移動します。

<img width="843" alt="Screen Shot 0030-12-23 at 22.25.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/13038/8b325b22-b551-a64d-549c-509b25d2bb9e.png">

2つのサービスが呼び出されたトレースの詳細画面です。最初に呼び出されたサービスが青、次に呼び出されたサービスが紫の線で表示されています。

このトレースはレスポンスに3.17秒を要し、青で示されるサービスでは190回の通信、紫で示されるサービスでは62回の通信が発生していることがわかります。

Collapse allやスパン数をクリックすると、スパンの一覧が表示されます。

<img width="831" alt="Screen Shot 0030-12-23 at 22.26.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/13038/5375bfa9-8acd-2f29-9c5f-a14bc61cec42.png">

スパンの一覧では、各スパンの概要(通信先がMySQLであればどのテーブルに対するクエリなのか)や要した時間が表示されます。

スパンをクリックするとそのスパンの詳細な情報が表示されます。

<img width="827" alt="Screen Shot 0030-12-23 at 22.27.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/13038/fc97e5ce-939b-e59d-d2f1-97ca7fd1bed9.png">

MySQLのスパンの詳細を開くと、そのスパンでクエリされたSQLが表示されます。

このように、1つのトレース内で実行された処理の詳細を、複数のサービスに渡って確認することができます。

## まとめ

例で示したトランザクションで動くサービスは最大で2つですが、それだけでもDistributed Tracingはアプリケーションの問題点を探すのにとても便利です。
より多くのマイクロサービスで構築されたシステムでは、さらに強力なツールとなるでしょう。
Heroku Postgresで「PG::InsufficientPrivilege: ERROR:  permission denied for relation」エラー

Heroku Postgresでレコード挿入時に「PG::InsufficientPrivilege: ERROR:  permission denied for relation」エラーが発生した。

Postgresの権限周りかな？と思って色々と調べた結果、参考記事(1)の通りレコード数がプラン（hobby-dev）を超過していたのが原因だった…。

(2)にHeroku Postgresのプラン一覧がある。
契約していたFreeプランだと10,000レコードが上限だった。
1個上のBasicにすると、10,000,000とレコード数が跳ね上がるので、趣味の開発でコストはあまりかけたくないが、とりあえず金で解決することにする…。

ちなみに、よくよくメールを掘ったら

```
[warning] Database disruption imminent, row limit exceeded for hobby-dev database on Heroku app xxxxxx
```

という警告のメールが届いてた。。

# 参考
(1) https://devcenter.heroku.com/articles/postgres-logs-errors#pgerror-permission-denied-for-relation

(2) https://elements.heroku.com/addons/heroku-postgresql
Ubuntuを1年常用しました

この記事はロボP Advent Calendar 2018の23日目の記事です

## はじめに
メインで使っているノートPCをWindowsからUbuntuにしてからおおよそ1年経ったので感想や重宝しているツールの紹介をします．
### 環境
- thinkpad x220

## Ubuntuを使い始めた経緯  
- cmdが使いにくかった
- CTFや開発をしていく上で結局Linux機が必要だった
- かっこいい

## なんでUbuntu?
かっこよさを重視した結果Voyagerやelementary OSを真っ先に試したが使いにくさやデザインが完成されすぎていて自分で外見をカスタマイズしづらかったです．
変にマイナーなディストリビューションを使っても不具合が起こった時とかに解決しづらいと思い情報量の多いUbuntuにしました．

## Ubuntuにして良かったこと
- cui良い
- 開発環境として良い
- 普段使い(SNS,メッセンジャー,ネットサーフィン等)に関してもWindowsと比べても遜色なく使える
- 使ってて楽しい
- 操作感は割とGNOME Shell Extensionsで探せば解決する

## 不便なこと
- 何よりMS Officeが使えないこと
    - LibreOfficeを使うぐらいならGoogleの各種オンラインオフィスソフトを使った方が良いです
- 学内Wi-fiに接続できない
    - Eduroamで我慢する
- 意外とWindowsしかないアプリを使ってたこと
    - Notepad++とか 

## ツール紹介
### AlternateTab
Alt-Tabをアプリ単位じゃなくてウィンドウ単位に変える
### xsel
Macのpbcopy
### Notepadqq
どうしてもLinuxでNotepad++を使いたい時に

気が向いたら追記します
iCloud Documentへのアップロードとダウンロード方法


##はじめに
iCloudへのアップロードとダウンロードに長いこと苦戦したので備忘録として記事を書かせていただきます。

## 1.iCloudコンテナのURLの設定


```

 private var containerUrl: URL? {
        // iCloudコンテナのURL
　　　　　　　　　　　　　　　　// 特定のiCloudコンテナを指定する場合はnilのところに書き込む
        let url = FileManager.default.url(forUbiquityContainerIdentifier: nil)

　　　　　　　　　　　　　　　　// コンテナに追加するフォルダのパス
        let path = url.appendingPathComponent("")

        do {

　　　　　　　　　　　　　　　　　　　　　　　　// iCloudコンテナにフォルダの作成
            try FileManager.default.createDirectory(at: path, withIntermediateDirectories: true, attributes: nil)
        } catch let error as NSError {
            print(error)
        }
        return path
    }
```
※pathがnilで返って来る場合、iCloudDriveのスイッチがオフになっています。

## 2.アップロード方法
1　で指定したiCloudのコンテナのURLにドキュメントフォルダの中身をコピーする

```
// ドキュメントのURL
let documentUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first

do {
     // ドキュメントをiCloudコンテナにコピー
     try fileManager.copyItem(at: documentUrl, to: self.containerUrl)
} catch let error as NSError {
    print(error)
}
```

## 3.ダウンロードする前にiCloudとの同期を行う

```

DispatchQueue.main.async {
       do {
　　　　　　　　　　　　　　　　　　　　　　// iCloudからローカルにダウンロード
           try FileManager.default.startDownloadingUbiquitousItem(at: self.containerUrl)
      } catch let error as NSError {
           print(error)
      }
    　}
}
```

##4.iCloudコンテナからドキュメントにダウンロード

```
do {
    // iCloud上にアップロードされているフォルダがあるか確認
    if fileManager.fileExists(atPath: unwrapICloudContainerUrl.path) {
       // iCloudコンテナからドキュメントにコピー
        try fileManager.copyItem(at: self.containerUrl, to: documentUrl)
    }
}
```

これでiCloudコンテナにあるものをドキュメントにコピー、ダウンロードできます！

## まとめ
まだiCloudを勉強しはじめたばかりでわからないことが多くあります。
NotificationCenterを使用した、アップロード時とダウンロード時の通知なども現在作成中のため、完成次第次の記事を書きたいと思います。
【設計時の見落とし】画面系の考慮について

# はじめに
これは[設計時の見落とし Advent Calendar 2018](https://qiita.com/advent-calendar/2018/overlook)の23日目の記事となります。

業務アプリケーションの設計をするときに、見落としがちなところに焦点をあてて紹介します。 
下流工程からの手戻りを少なくして 双方の負担を減らしましょう。

画面系の考慮について書いてみます。ただ元記事が10年前なので今となっては古いところがあるかも知れません。

# ユーザーのコンピューター操作の熟練度の考慮
マウス操作に重点をおくか、キーボード入力に重点をおくかなどにより、ユーザインターフェイスが違ってくるため、画面設計をする上で考慮が必要です。
画面設計に入る前に、ユーザーに確認しておく必要があります。

キーボード入力に重点をおいている場合、チェックボックスやオプションボタン(ラジオボタン)やコンボボックスなどの入力方法を工夫する、または使用しないなどの考慮が必要になります。
(全ての画面に対して行う必要はなく、個々の画面対応でもいいはずです。)

# モーダル/モーダレス画面について
## モーダル
一度開いた画面は閉じるまで、他の操作ができない。

### メリット
表示中は状態が変更されないため、システム的に同期が取れる。
最前面に表示されることによりユーザーが認知しやすいだけでなく、ユーザーに参照や入力を確実に行わせられる。

### デメリット
一旦画面を閉じないと他の操作が出来ない、操作性が不便になる。

## モードレス
一度開いた画面を閉じなくても、他の操作ができる。

### メリット
画面を閉じなくてもユーザーの操作を制限しないため、快適な操作性ができる。
表示中でも状態が変更できる。

### デメリット
表示中でも状態が変更できてしまうため、システム的に同期が取るのが大変になる。
他の操作ができる反面、他の操作をすると画面が背後に隠れてしまう。 
(※メモ帳の検索画面のように前面表示にすることは可能）

## モーダル/モーダレス中間方式
モードレスにて最上位表示(TopMost)にしたり、アクティブイベントやタイマーなどを使い擬似的にモーダル化することで、両方のメリットを享受できたりします。

最上位表示はいいとして、アクティブイベントやタイマーなどで再表示するのは最近はやらない方がいいでしょうね。

# メッセージ出力について
## 煩わしさ
「登録しました。」／「修正しました。」など、よく出るメッセージはダイアログで出すと煩わしい場合ある、ステータスバーにメッセージを出すだけですませるなど考慮も必要。

## メッセージ文言の統一化
画面や機能ごとに文言が微妙に違うことにより混乱する場合がある、表現方法など統一させる。例えば、する/しないの混同など。

## ユーザーにわかりやすいメッセージ文言にする
なぜ駄目なのか理由が分かるメッセージにすることで、問い合わせが少なくなる･･･かもしれません。

# アクセス権限の使用度の確認点
業務システムでは管理、職務に応じたアクセス範囲と権限設定が必要となってくることがあります。

* アクセス権限を使うかどうか
* 1人が複数のアクセス権限がある場合に権限の選択方法など
* アクセス権限はどこまでを考慮するのか

ある画面は、メニューからアクセス権限者以外は、起動でき なくする。 
ある画面は、起動はするが、参照以外はできなくする。 
ある画面は、承認は出来るが、承認解除は出来ないとか
自分で登録した情報を、その本人が承認を行えてしまうようだと業務管理者への牽制が利かないです。**不正し放題になってしまう**

# 入力チェックと登録確認メッセージの処理順
1.入力チェック→確認メッセージ→登録処理→完了メッセージ
2. 確認メッセージ→入力チェック→登録処理→完了メッセージ

以前に関わっていたプロジェクトにて、複数項目ある入力画面でDB更新する処理があったのですが入力チェックと登録確認メッセージの順番が気になりました。

「登録しますか？」のメッセージを表示
　　↓ Yesなら次処理 / Noなら処理中断
複数項目の入力チェック処理
　　↓ OKなら次処理 /　NGなら処理中断
DB登録処理
　　↓ OK ならコミットして次処理　/　NGならロールバックして処理中断
「登録しました」のメッセージを表示

上記の方法では複数箇所の項目で入力エラーがあるたびに確認メッセージが出ることになり、煩わしいです。
そんなわけで、次のプロジェクトでは下記のように処理を変更してしまいました。

複数項目の入力チェック処理
　　↓ OKなら次処理 /　NGなら処理中断
「登録しますか？」のメッセージを表示
　　↓ Yesなら次処理 / Noなら処理中断
DB登録処理
　　↓ OK ならコミットして次処理　/　NGならロールバックして処理中断
「登録しました」のメッセージを表示

[登録時の整合性チェックと確認メッセージのタイミング](http://blogs.wankuma.com/ognac/archive/2007/12/06/111898.aspx)

# その他
## 画面項目の非表示とするか無効化とするのか
* ユーザーが何かの操作をすれば操作可能になるボタンは無効化
* ハードウェアがないなど、ユーザーの通常の操作範囲では操作可能にならないボタンは非表示
* 「何をすれば操作可能になるか」が十分に明確でない場合にはエラーメッセージ

## 画面項目の有効化／無効化のタイミング
処理完了後に項目を無効化するのか、処理完了前に項目を 無効化するのか

## カレンダーの始まりを統一する
通常は日曜からとなっているが業種により月曜日始まりとするか
特に工場と連動している会社では、月曜日始まりのところが多い。
ユーザーのところにお邪魔したときにはカレンダーを見るといいですね。

## 画面上に説明や手順などを掲載する
マークや色など区別している場合、処理が複雑な場合など 

## 細々な点
* 必須項目や検索可能項目など背景色やマークなど付けて 区別させるなど
* コンボボックスを入力可能／不可とするのかどうか
* テキストの入力不許可文字 例 半角カンマ等
* ゼロ・パディング(0埋め)、ゼロ・サプレス、コードなど 0パディングさせるのかどうか
* 小数点の表示方法 例 .5 → 0.5 や 0.2 → 0.20 とするかなど
* 確認メッセージボックスにて、はい/いいえ の初期値の設定
* 明細ごとにチェックボックスがある画面の場合、明細が多くなるなら全選択/解除ボタンを付ける。
* Enterキーによる次の項目への移動、項目によっては矢印とか
* フォーカスがセットされた時に、ハイライト表示させるのか
* マスタの名称管理 正式名称と略称の取扱い
* マスタの名称の履歴(担当者名など苗字が変わるとか)
* 明細項目で全桁入りきらない場合、どこまで表示させるのか
* コードの書式 英数字、英大文字、英小文字有りか、数字のみ 全角、半角入力など
* IMEの入力モードの切り替え ※人により切替える癖があり逆にじゃまな場合もある
* 画面の入力順（タブ遷移順）
* 関連している項目は近くに配置させる
* オーバーフロー時の表示方法  例「*」マークにするとか
SECCON CTF 国内大会 反省文

こんにちは。最近弊社ブログに[チーム紹介文](https://techblog.yahoo.co.jp/advent-calendar-2018/sekai-no-yharima/)を書くぐらいイキっているyharimaのdeko2369です。

2018/12/23に行われた[SECCON CTF](https://2018.seccon.jp/seccon/2018akihabara/)国内大会の反省文として、反省点と自分のやったことをまとめて供養したいと思います。


## 反省点

問題がアレだったとかソレだったとかTwitterに投稿されていたりしますが、結局のところ以下の点に尽きるかなと思います。

- 単純にバイナリ力が足りなかった

バイナリコードのコードゴルフをいかに攻略できるかが今回の国内大会で上位を狙うポイントだったので、そこでゴルフ出来る実力がなかったのが一番の反省点です。

いい加減2年ぐらい積み本している[アセンブラ短歌本](https://book.mynavi.jp/ec/products/detail/id=24267)を読まないとアカンと感じたので短歌の「味わい深さ」を噛みしめながら勉強を進めたいと思います。

## やったこと

ほぼほぼ自分以外のメンバーが問題を解いていて、じゃあ何するかと言ったらひたすらサポートに周っていたのが現実でした。つらい。あーバイナリ力ー。

### Defence Flag自動投稿

やったのはDefence Flagの自動取得と投稿です。

Defence Flagが5分に1回更新されていたのですが、それを解答できた問題のDefence Flagに投稿するスクリプトを書いていました。
ついでにいちいちDefence Flagの書かれたページを見に行くのも面倒だったので、SlackにもFlagを流すようにしていました。更新されたら通知されるので結構安心感ありました。

```javascript
const rp = require('request-promise');
const io = require('socket.io-client');
const { WebClient } = require('@slack/client');

let prev_flagword = '';

const socket = io('http://score.ja.seccon:8000');
socket.on('flagword', async function(data) {
    words = data.flagwords;
    for (const team of words) {
        if (team.team_id == 5) {
            const flagword = team.flagword;
            if (prev_flagword !== flagword) {
                console.log(flagword);
                await postSlack(`defence keyword: ${flagword}`);
                await updateMatsushimaToken(flagword);
                prev_flagword = flagword;
            }
        }
    }
})

function refresh() {
    socket.emit('flagwords');
}
refresh();
setInterval(refresh, 3000);

async function updateMatsushimaToken(flag) {
    const matsushima_url = 'http://matsushima.pwn.ja.seccon/MarinaBaySandsNo1Fhaimakaisoutyudayo';
    var options = {
        method: 'POST',
        uri: matsushima_url,
        form: {
           defense_flag: flag
        }
    };
    rp(options).then();
}

async function postSlack(message) {
    try {
    const token = '<token>';
    const conversationId = '<channel id>';
    const web = new WebClient(token);
    const res = await web.chat.postMessage({ channel: conversationId, text: message });
    } catch (e) {}
}
```

Botの動く様子はこんな感じ。
![bot](https://qiita-image-store.s3.amazonaws.com/0/5804/9627d58d-2b6c-bfed-a0ee-a8cfe67771ed.png)


ただ、天橋立の問題のログインがどうしても突破できず、そこだけ最後まで手作業でFlag更新をしてました。まぁSlackに出てきたやつを使って更新するだけで、普通にFlagのページを監視するより楽だったので良かったかなと思います。

### 宮島通知

宮島という問題が30分に1度問題が更新されるので、それに気づくためにこれもBot化しました。毎時29分と59分にバイナリ担当だった @liniku さんにひたすら「MIYAJIMA yarou」と通知してました。

```javascript
const cron = require('node-cron');

const { WebClient } = require('@slack/client');

cron.schedule('29,59 * * * *', async () => {
    await postSlack();
});

async function postSlack() {
    const token = '<token>';
    const conversationId = '<channel id>';
    const web = new WebClient(token);
    const res = await web.chat.postMessage({ channel: conversationId, text: '@liniku MIYAJIMA yarou' });
}
```

## まとめ

と、まぁあまりセキュリティ感はなく、どちらかというとChatOpsみたいなことをしてた国内大会でした。自分の実力不足（特にバイナリ）も否めないので来年はバイナリ力を鍛えることを目標に頑張っていきたいと思います。
iTerm2で無限にスクロールする方法

iTerm2では上にスクロール(スクロールバック)できる範囲がデフォルトでは制限されています。
手元のバージョン3.2.6だと1,000行に設定されています。

無限にスクロールしたい時は「Preferences → Profiles → Terminal → Unlimited scrollback」をチェックすればOKです。

ちなみに、スクロールバッファをクリアは「Command + k」でできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/15966381-c40b-1e5b-7fdc-fdfa24990c01.png)
Apache DrillをWindows10、power Shellで動かす

Windows10のPowerShellでApache Drillを動かすための設定を記載。

# 環境
OS：Windows10
Java：1.8.0 u181
Apache Drill：1.14.0
※tar.gzを解凍するために、7-Zipを使用。

# 設定方法
０． JAVA_HOMEが正しく設定されていることを確認。
　`java -version`

１．以下を参照して、任意のディレクトリでtar.gzファイルを解凍。
https://drill.apache.org/docs/installing-drill-on-windows/
　① Apache Drillをダウンロード。
　② 任意のディレクトリにtar.gzファイルを移動。
　③ 解凍ツールで、解凍。
　　　※7-Zipを使うとgzを解凍後に、tarを解凍。

２．パワーシェルを起動し、解凍したフォルダ内のbinフォルダに移動。
　`cd bin`

３．パワーシェルから、以下を実行。
　`cmd /r 'sqlline.bat -u "jdbc:drill:zk=local"'`
　※これを、以下でやっても、動かないので注意。
　`cmd /r 'C:\drill\install\dir\bin\sqlline.bat -u "jdbc:drill:zk=local"'`
　バッチを実行した際のカレントに、内部で呼び出すほかのバッチなんかが無いとだめらしい。
　なので、スクリプト化する場合は、binフォルダに移動するように、cdを書かないといけない。

# 設定時に困った点
１．最初、binフォルダで実行したら、以下のエラーが発生して、コネクション生成に失敗した。
　`Unable to deserialize "/tmp/drill/sys.storage_plugins/hbase.sys.drill"`
　→最初にDrillを起動した際に、JAVA_HOMEの設定がPathに追加されておらず、不完全なtmpフォルダがドライブ直下にできていた。環境変数設定後にDrillを起動すると、tmpフォルダが競合していたらしく、正常に起動しなかった。tmpフォルダを削除したら、問題なく起動し、ちゃんとしたtmpフォルダがドライブ直下に作成された。

２．起動時、ログにエラーがでる。けど、正常に動作はする。
　`javassist.CannotCompileException: by java.lang.LinkageError: loader (instance of  sun/misc/Launcher$AppClassLoader): attempted  duplicate class definition for name: "com/google/common/base/Stopwatch"`
　→Drill 1.15.0で対応予定らしい。
　https://stackoverflow.com/questions/50612306/apache-drill-java-lang-nullpointerexception/50750944

# 動作確認で分かった点
１．dfsはDrillをインストールしたドライブをルートとしている。
２．管理コンソールは、Drillを起動した状態で以下にアクセスする。
　`http://127.0.0.1:8047`
３．大文字拡張子「.CSV」は認識されない。
　→Csvファイルとして認識するデフォルトの拡張子が「.csv」となっているため、「.csv」でないと読み込めない。＝デフォルト設定では、拡張子の大文字、小文字を区別する。
４．データはUTF-8でないと、日本語が文字化けする。
　→CsvファイルはExcelでUTF-8に変換してから読み込めば文字化けしない。
　※PowerShell側で「chcp 65001」を実行してからDrillを起動して日本語（UTF-8）をSelectすると、文字が表示されなくなる。


ここまで。
JeBrains製品を導入する前に提案したこと

## はじめに

数年前にJetBrains製品をプロジェクトに導入しようと画策してた頃を思い出しつつ振り返ってみたいと思います。

ちなみに、プロジェクトは社内向けWebアプリケーションで、事業部門のエンジニアが増えていっている部署での話なので、導入の際に考慮いただければと思います。

## 導入背景（利用目的）

### ツールによる品質向上

特に、無料のツールだけでやっていたメンバーが、
個人で購入したJetBrains製品を使っていたメンバーよりも品質が低かったことがありました。

IDEAを使っていれば防げた些末なミスやイケてないコードが、最終的に品質を担保をする人の目によるチェックからすり抜けてしまうことがありました。
最終的な人の目だけでコードの品質を担保するのは難しいため、開発中の段階から品質を上げるために必要だと考えています。

コードを書いた際に「お前のコード、イケてないんじゃね？」と教えてくれる機能がついています。
実はこの機能は、初めてプログラミングしたり、途中からプロジェクトに参加した人が扱うと、その指示に従うだけで、品質を管理している人の目に頼らなくても大丈夫という優れものです。

また、IDEAが教えてくれるコードを書き続けることで、イケてないコードを書かないトレーニングにもなります。
さらに、過去のイケてないコードも指摘してくれるので、指摘箇所を改善し続けることで品質を上げることが出来ます。

そのほかにもコードを書く際にサポートしてくれる機能が豊富なので、私自身は手放せないツールの一つになっています。

### ツールによる開発効率の向上

システムを構成しているアプリケーションを開発している言語は現在以下の通りです。

PHP: 社内向けのWebアプリケーション本体
Scala: バッチ処理
JavaScript(TypeScript):　社内向けWebアプリケーションのフロントエンド部分
SQL: バッチ処理やデータ抽出処理等
Python: 予測機能等

これらの開発を行う際に無料のツールを使い分けていたり、個人で購入したJetBrains製品を利用していたりと、バラバラでした。
また以前にも別のチームで個人で購入されていました。

過去3年間社内向けWebアプリケーションに関わった開発メンバーを振り返ってみると、特にPHPとJavaScriptについては、
無料のツールを使っているメンバーとJetBrains製品を使っているメンバーの開発スピードがはっきり違っていました。

個人の感想ではありますが、初めてPHPとJavaScriptを扱った際に、JetBrains製品が無ければ、開発はもっと遅かっただろうと思います。
おそらく、他の言語をやっていたとしても新たにPHPを初めて触るであろう人についても、同じことがいえると思います。

また、言語ごとにツールを使い分けていると、そのツールごとの使い方を覚える必要があり、
ツールを教えられるメンバーがいなかったりすると、そのツールの使い方を調べるだけで時間がかかったりするので、
開発中でもその時間が持っていかれたりします。

また、スキルの高い人であればより効率的に開発することが出来るので、
品質の高い開発を素早く行うことで、より速いPDCAを回せるようになると思います。


## 導入プラン

* 案1: 全員がAll Products Packを使う場合
* 案2: 全員がIntelliJ IDEAにそろえた場合
* 案3: 各個人が利用したいツールを指定した(ツールの切り替えは考慮しない)場合

個人的には、案1を推しますが、もしダメな場合は案2が望ましいと考えています。

案3については、人員の流動性を考えた場合、ライセンスが無駄になる可能性があるので、
最低でも無駄になりにくいオールマイティな案2を推します。

一人当たり月数千円程度で、品質、効率を上げられるなら安いです。

## 他社事例

IIJさんがIntelliJ IDEAとEclipseの比較と導入成果について発表していた事例がありました。

https://www.slideshare.net/IIJ_PR/intellij-idea-iij

また、ReSharperになりますが、gloopsさんの事例がありました。

https://www.slideshare.net/AkihiroYamamoto/jet-brainsnight-resharper

## 効果測定

効果測定については、どちらの事例からもうかがうことが出来なかったので、なかなか難しいとは思います。

一つの案としては、月にツールの指摘による改善の時間が全体の開発にかかった時間と比較して、
どれくらいの割合で推移していくのか見るのがいいのではないかと思います。

改善が進めば、割合は減っていくと思いますし、その場合開発スピードや成果物を評価することで、相対的に計測は可能かと考えています。

## 福利厚生として

金額がやはりそれなりするものではありますが、エンジニアの採用の際に「うちはIDEAを会社で買って支給してるよ」というアピールが出来るので、エンジニアの開発環境にも力を入れていると認識してもらえます。

## おわりに

今はAll Products Packを開発メンバー全員に支給しています。

おかげさまで、無事導入出来て日々の開発がかなり楽になったので、今後導入を考えているところの参考になればと思います。
「Androidで次に何しよう？」を自分にあったケースで探し、興味を見つける方法

# はじめに
こちらは[Android 初心者 Advent Calender2018](https://qiita.com/advent-calendar/2018/android-beginner)の23日目の記事です。
アウトプットするいいきっかけになるカレンダーを探したらこちらを見つけ書かせていただきました。

実際に学んで来て
「基本的なコンポーネントとか使えるけど次は何しよう？」と感じ
自分の興味が出るものをキャッチアップするための情報について紹介させていただきます。


## 自分のAndroidに対しての学び方について

現在専門学校4年生なのですが、3年生の前期ハッカソンに参加した事がきっかけでAndroidについて勉強し始め
その際に、「*Intentを使用して画面遷移*」などの技術的にやりたい事を作り
ググって見つけたコードをコピペしたり、本のサンプルソースを書き写して動いたらコードを理解するといった体系的に勉強してました。

## Webにも勉強するリソースはある

講座形式で、学びたいジャンルを重点的にできる、[Google Developers codelabs](https://codelabs.developers.google.com)です。
Android以外にもGoogleのサービスなら結構載っているので一度見てみるといいでしょう。

全文英語なので理解するまでは難しい部分がありますが[こちら](https://www.slideshare.net/furusin/google-codelabs)のスライドにcodelabsについて
非常に親切に説明してくれてますので、あらかじめ目を通しておくとスムーズに進めると思います。

## ちょっとした講義形式でAndroidの話を聞きたい
さまざまな理由で勉強会に参加出来ないという方へ
一部の勉強会ではyoutubeに内容を動画として投稿することがあり

その中でも自分がおすすめしたいのは
年1回開催される[DroidKaigi](https://droidkaigi.jp/2018/)というAndroidのカンファレンスではセッションを[動画](https://www.youtube.com/channel/UCgK6L-PKx2OZBuhrQ6mmQZw)として残しているので
自分の好きなタイミングでカンファレンスのセッションを見ることができます。

動画が30分以上あるので内容だけ抜粋して知りたい！という方は
カンファレンスの後日にスライドを公開することが多く
まとめてくださっている[記事](https://qiita.com/takattata/items/cc1ba64ef260e9e51274)や[サイト](https://career.levtech.jp/guide/knowhow/article/375/)もありますのでそちらを見ると良いですね。

## 簡単に手元で技術的な何かを見たい
こちらは自分が目を通した参考になる・面白そうと感じた一部の記事ですが

cookpad [Android版クックパッドアプリで採用している技術の現状確認 2018年版](https://techlife.cookpad.com/entry/2018-11-19-technical-selection-for-android-cookpad)
cyberagent [Android における Beacon を活用した新機能の実装](https://developers.cyberagent.co.jp/blog/archives/12901/)
yahoo [AndroidのCoordinatorLayoutを使いこなして、モダンなスクロールを実装しよう](https://techblog.yahoo.co.jp/android/androidcoordinatorlayout/)
qiita [Android Advent Calendar 2018](https://qiita.com/advent-calendar/2018/android)

など、一部の企業は技術ブログを投稿しているので気になるアプリの技術ブログをブックマークしておくといいかもしれません。
会社の技術ブログは普段知ることがない情報だったりしてそこから自分の知識を広めるいいきっかけになると思います。


## まとめ

いかがだったでしょうか、実際のコードを書こうと思ったのですが
既存のブログや記事で十分と感じ書く内容がなかったので、自分がよく行っていた方法について記述しました。

参考になれば幸いです。
Go言語に触れてみよう Part.1

# はじめに
　私が初めて"Go言語"について知ったのは、学校の課外活動で先輩の"Go言語"についてのLTでした。先輩がGo言語を使ってサーバーサイドをやっているのを、側から見ていただけでしたが、少し興味を持っていました。

　そして、実際に"Go言語"を触ったのが今年の夏、Webのライブ配信するサービスを開発するサマーインターンに参加したことがきっかけで触り始めました。

その時に勉強したことやつまづいたことなどを、まとめておきます。

# 参考サイト
以下の、サイトを参考。

[ドキュメント](https://golang.org/doc/)

[Tour of Go](https://go-tour-jp.appspot.com/welcome/1)

[Go言語 - 支援開発ツール](https://blog.y-yuki.net/entry/2018/08/08/011229)

# Go言語とは、、、
2009年にGoogleがリリースしたオープンソースのプログラミング言語です。

特徴は、一言で言うと『わかりやすい』です。構文・文法がシンプルでわかりやすいため可読性は高く、また書くときも直感的に書きやすいです。C言語に少し似ている部分があり、プログラミング経験者には、とっつきやすい言語であると思います。

Go言語はコンパイル言語であるため、処理が速いのも特徴の一つです。

# Goの環境構築
## 環境

Mac Mojave 10.14.2
zsh

## 1. Goのインストール

Homebrew経由でインストールしていきます。
[Homebrew](https://brew.sh/index_ja)

Homebrewが入っていない人は、以下のコマンドを叩いてください。

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

インストールできたら、以下のコマンドでGoをインストール。

```
$ brew install go
```

## 2. PATHを通す

goをインストールしたため、PATHを通してあげます。
bashは`~/.bashrc`、zshは`~/.zshrc`に以下を追加します。

```
export GOPATH=${HOME}/go
export PATH=$GOPATH/bin:$PATH
```

fishは`~/.config/fish/config.fish`に以下を追加。

```
set -x GOPATH ${HOME}/go
set -x PATH $PATH $GOPATH/bin
```

これで設定ができたため、

```
$ source ~/.zshrc
```
で反映させます。

環境構築ができたので、しっかりと動くか実際にコードを書いてやってみます。

# 動作確認
ドキュメントにある通りに動作させてみましょう。

## 1. ディレクトリの作成

Homeディレクトリから `go`ディレクトリを作成して、移動します。

```
$ mkdir go
$ cd go
```

そして、そこから`src/hello`を作成して、移動します。

```
$ mkdir src/hello
$ cd src/hello
```

## 2. ファイル作成 & コードを書く。

では、実際にファイルを作成して、コードを書いていきます。IDEに関しては、ご自身が使っているもので構いません。私は、VSCodeを使ってやっていきます。

※VSCodeの方は、拡張機能を入れることをお勧めします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179470/514d8281-2959-ae47-8a9f-74d66e8ab83d.png)

まずは、ファイルを先ほど作成したディレクトリに作成します。Goの拡張子は、`.go`です。

```
$ touch hello.go
```

ファイルが作成できたら、いよいよコードを書いていきます。ドキュメント通り、
`hello, world`を出力していきましょう。

```go:hello.go
package main

import "fmt"

func main() {
	fmt.Println("hello, world\n")
}
```

## 3. 実行する

ターミナルで、以下のコマンドを叩いて実行していきます。

```
$ go run hello.go
```

以下のように実行できたら、成功です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179470/f7b962a8-121e-7682-348a-e3820aebb73f.png)

また、C言語やJavaのように`go build hello.go`でコンパイルすることもできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179470/4b7b4d26-dbcd-d24c-7335-868f6a246113.png)

今回はここまでとします。

# 次回予告
次は、　Tour of Goを元に構文・文法、または演習についてやっていきながら、
自分がつまづいた部分について触れていこうと思います。
XBee 3 ZB で MicroPython を使う（１）

12月12日に[スイッチサイエンス](https://www.switch-science.com/catalog/list/7/)で XBee 3 ZB の取り扱いが始まりました。MicroPythonが使えるということで購入してみました。[U.FLアンテナ型](https://www.switch-science.com/catalog/5312/)と[PCBアンテナ型](https://www.switch-science.com/catalog/5311/)がありますが、私が購入したのはPCBアンテナ型です。PCに繋いだり、ピッチ変換のためのボードには[Grove の XBee キャリア](https://www.switch-science.com/catalog/1052/)を選びました。

![IMG_4785.jpg](https://qiita-image-store.s3.amazonaws.com/0/106817/e569e8a5-8d8a-5944-44b6-debd69559d28.jpeg)

とりあえず、[ユーザガイド](https://www.digi.com/resources/documentation/digidocs/pdfs/90001539.pdf)を読みつつ、MicroPython を使えるようにしてみます。

# XCTU のインストール

XBee 3 を使うには、まずは何はなくとも PC に XCTU のインストールが必要です。XCTU は XBee 用の設定ツールで無料でダウンロードできます。XCTU は[ここ](https://www.digi.com/products/xbee-rf-solutions/xctu-software/xctu)からダウンロードできます。Windows/macOS/Linux用があるので、使っているPC環境に合わせてダウンロードして、インストールします。

XCTU をインストールすると次のようなウィンドウが開きます。

![スクリーンショット 2018-12-23 22.10.42.png](https://qiita-image-store.s3.amazonaws.com/0/106817/261f5b06-fbbd-b0e3-e355-0c72dd7bb671.png)

# XCTU に ZigBee 3 を追加する

XBee3 を PC につなぐためのボードにのっけて、USBケーブルでつなぎます。

![IMG_4786.jpg](https://qiita-image-store.s3.amazonaws.com/0/106817/69c54d3c-fc86-39c1-9ecc-07273adf8146.jpeg)

次に "+" の付いた XBee アイコンをクリックします。

 "![スクリーンショット 2018-12-23 22.10.42.png](https://qiita-image-store.s3.amazonaws.com/0/106817/c6d66bbf-d833-2f86-fe03-241292858bbe.png)

以下のようなダイアログが出るので、XBee が繋がっているシリアルポートを選んで "Finish" ボタンを押します。

![スクリーンショット 2018-12-23 22.28.09.png](https://qiita-image-store.s3.amazonaws.com/0/106817/e6cc79f7-5b10-9192-6b1b-15ca2c093b64.png)

追加がうまくいくと以下の画面になります。

![スクリーンショット 2018-12-23 22.31.27.png](https://qiita-image-store.s3.amazonaws.com/0/106817/6ed4f260-193f-8b9e-87ce-863f6c48454d.png)

# MicroPython を有効にする

追加した XBee のアイコンをクリックすると、設定が読み込まれて右側ペインに表示されて編集できるようになります。

![スクリーンショット 2018-12-23 22.33.28.png](https://qiita-image-store.s3.amazonaws.com/0/106817/81e713ff-0624-2090-e6eb-73cd993606f9.png)

①BDでシリアル通信速度をに変更します。私は 115200 にしました
②APで "MicroPython REPL" を選びます
③WRITEをクリックして設定を XBee に書き込みます

![スクリーンショット 2018-12-23 22.39.48-2.png](https://qiita-image-store.s3.amazonaws.com/0/106817/7c99fc0f-4dd6-d315-12b3-fdd566b71079.png)

Toolsアイコンをクリックして現れるアイコンから "MicroPython Terminal" を選択します。

![スクリーンショット 2018-12-23 22.47.45.png](https://qiita-image-store.s3.amazonaws.com/0/106817/d023e1ab-452b-6ed9-be01-0ba6ff5ebc32.png)

MicroPython Terminal が開きます。

![スクリーンショット 2018-12-23 22.54.31.png](https://qiita-image-store.s3.amazonaws.com/0/106817/1d1eb186-38eb-03d2-183e-c63e9d973fe8.png)

Openアイコンをクリックすると MicroPython の REPL に入ることができます。Ctrl-D でソフトリセットしてみると MicroPython の v1.9.4 ベースであることがわかります。

![スクリーンショット 2018-12-23 22.53.15.png](https://qiita-image-store.s3.amazonaws.com/0/106817/66e32b46-5021-7609-6fc6-d0c46eeadebd.png)
Arrays.sortの引数Comparatorをラムダ式で与えた場合に発生した性能劣化の一例報告

[CodilityのLesson6のNumberOfDiscIntersections](https://app.codility.com/programmers/lessons/6-sorting/number_of_disc_intersections/)をJavaで解答していたときに、ラムダ式利用時に性能が劣化する現象を確認したので共有する。

**注意：以下、上記問題に対する解答例がGitHubのリンク先に含まれます。**

# ラムダ式利用時
最初の解答では以下のようにラムダ式を利用した。
[ラムダ式利用時のソースコード](https://github.com/ShandyGaffLover/training/commit/234002b5f5e5f0d64f199bc2a78debb3b48e445c#diff-79874b2d221fb11307e70e6544c31082)

その結果が以下のようになった。
![performance.png](https://qiita-image-store.s3.amazonaws.com/0/322008/d60d95f4-2b37-1f20-ce20-001bd3c41c61.png)

Nが大きいときにパフォーマンスのスコアが基準を満たしていないことが確認される。

# 匿名クラス利用時
性能改善を試みて試行錯誤しているうちに、以下のようにラムダ式から匿名クラスを利用するように修正した。
[匿名クラス利用への修正](https://github.com/ShandyGaffLover/training/commit/f00b4f3990b227cc42575c2ed0fa2b333f12996d#diff-79874b2d221fb11307e70e6544c31082)

その結果が以下のようになった。
![kaizen.png](https://qiita-image-store.s3.amazonaws.com/0/322008/aa7baa4d-dff0-701c-5e47-57e59db8a3a5.png)

ミリ秒単位ではあるが、パフォーマンスが改善していることが確認される。

# 結果と考察
ラムダ式を利用すると、匿名クラスを利用した時と比較してパフォーマンスが劣化する場合があることがわかった。これはすなわち**性能がシビアに求められるケースでは、ラムダ式を利用してリファクタリングするときは性能のリグレッションテストも必要になる**可能性を示唆する。

関連情報をインターネットで探してみると、例えば[Java それぞれ書き方でどれほどパフォーマンスが違うのか？計測比較してみた。Streamとループとか - Qiita](https://qiita.com/ota-meshi/items/40d5dcb0e99574a8a368#%E3%83%A9%E3%83%A0%E3%83%80%E5%BC%8F%E3%81%A8%E5%8C%BF%E5%90%8D%E3%82%AF%E3%83%A9%E3%82%B9)には、ラムダ式により性能が改善する、または差異がない、と書かれている。しかし[Java：ラムダは遅い？ - 開発メモ](https://web-dev.hatenablog.com/entry/java/lang/lambda-performance)には、ラムダ式により性能が劣化する、と書かれている。
[ラムダと invokedynamic の蜜月](https://www.slideshare.net/miyakawataku/lambda-meets-invokedynamic)によれば、匿名クラスの実行時間増加要因がI/Oとjarの解凍であるのに対し、ラムダ式の実行時間増加要因がブートストラップメソッド呼び出しとバイトコードの生成であり、前者の和が後者の和より小さい（リンク先スライド38ページ）ためではないかと考えられる。

今回の場合だと、匿名クラスはクラスの生成が実行前になされて計測の対象外となったのに対し、ラムダのクラスはクラスの生成が実行時になされたため、その分だけ性能が劣化した、と考えられる。

...正直あまり自信はないので、もし何かしらご指摘あればご教授いただけると幸いです。
Jupyterを使って1サンプルずつ更新されるデータをリアルタイムでグラフ表示する

# はじめに

タイトルの通りなんやけど、センサデータを、キューというかFIFOみたいなのにためてグラフ表示するやつ、横にグラフが流れていくようなやつを作った。調べても、なかなか見つからなかったので、試行錯誤してみた。Jupyterやったから、なかったんかな。

# 環境
Jupyter 4.4.0
Python 2.7.13

あと、あんま関係ないと思うけど、ChromeOSのCrostiniでやった。

# コード
こんな感じ。ランダムなデータを毎回生成してキューに追加して、それを表示する。dequeってクラス？を作るのと、表示するときのおまじない系関数がポイントなんかな。

```python
%matplotlib inline
# Queue
from random import randint
from collections import deque

#Plot
import matplotlib.pyplot as plt
from IPython.display import display, clear_output

# Queue
num = 10
queue = deque([0]*10)

# Plot
plt.ion()
fig = plt.figure()

for i in range(num):
    # Queue
    queue.popleft()
    queue.append(np.random.rand(1))

    # Plot
    clear_output(wait = True)
    plt.cla()
    plt.plot(range(i-9,i+1),queue)
    plt.grid()
    plt.ylim(0,1)
    display(fig) 
```

実行すると、こんな感じ。縦軸固定にしないとバタバタした。
![plot_display.png](https://qiita-image-store.s3.amazonaws.com/0/184221/8632adad-dd92-c691-c3e3-041f365c5208.png)

# おわりに
PythonもmatplotlibもJupyterもたまに、なんとなく使う程度なので、いまいちわかってなくてそこそこ時間かかった。MATLABを普段使ってるので、それとの違いをまとめたのん探してみよかな。

# 参考
キュー
[5. データ構造 — Python 3.6.5 ドキュメント](https://docs.python.jp/3/tutorial/datastructures.html)

リスト初期化
[List of zeros in python - Stack Overflow](https://stackoverflow.com/questions/8528178/list-of-zeros-in-python)

クリア
[Jupyter Notebook上でHTMLコードを使ってカウントダウンを表示する – Takala's Memory](https://takala.tokyo/takala_wp/2017/11/14/228/)

グラフ
[matplotlibでのプロットの基本 - Qiita](https://qiita.com/KntKnk0328/items/5ef40d9e77308dd0d0a4)
[matplotlibの描画の基本 | OpenBook](https://openbook4.me/sections/1696)
[matplotlib によるデータ可視化の方法 (1) - Qiita](https://qiita.com/ynakayama/items/8d3b1f7356da5bcbe9bc)

IPython
[非エンジニアでも使いやすい高機能なPython環境「IPython」「Jupyter」を使ってみよう | さくらのナレッジ](https://knowledge.sakura.ad.jp/17727/)
Siv3DでSAOのUIを作る



イニです。
似ているアニメキャラクターはキリトとよく言われます。
ちなみに彼女はアスナに似ています(聞いてないw）

#SAOかな～やっぱ
SAOのメニュー画面を作りたかったので、一部だけ作りました。

![スクリーンショット 2018-12-23 22.48.40.png](https://qiita-image-store.s3.amazonaws.com/0/151080/4765be62-4d4c-b609-e53a-a49ce3ae3831.png)


```c++:Main.cpp

# include <Siv3D.hpp> // OpenSiv3D v0.3.1
# include "SAOUI.hpp"

void Main()
{
	Graphics::SetBackground(ColorF(0.8, 0.9, 1.0));

	SAOUI saoui(6,Point(50,50),30,Palette::White,Palette::Lightgrey);
	saoui.open();

	while (System::Update())
	{
		saoui.update();
		saoui.draw();
		
		if (MouseL.down())
		{
			Print(saoui.clicked());
		}
	}
}
```

こんな感じで使えるようにしてみました。

ソースコードはこちらを見てね
https://github.com/ini-siro/sao_ui


コンストラクタで表示位置、玉の数、玉の半径、色を指定できます。

#早速

実際に空中に出してみました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">わが家がSAOっぽいメニューで操作できるようになる第一歩 <a href="https://t.co/kaYTIaPnQ4">pic.twitter.com/kaYTIaPnQ4</a></p>&mdash; イニ.ini (@jin_siro) <a href="https://twitter.com/jin_siro/status/1076835050438615040?ref_src=twsrc%5Etfw">2018年12月23日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


##使ったもの
透過フィルム
https://theaterhouse.co.jp/p_rear/item_clear_film.html
アクリル板
http://www.hazaiya.co.jp/category/akuriru_clear.html

合計2万円くらいでやりました。(フィルム貼るのが結構大変でした。もう絶対やらん。)

#終わりに
結構簡単なものでも見せ方を変えるといい感じに見えてよかった。
本当はLeapMotion使って指を使って動かすようにするところまでやりたかったけど、OpenSiv3Dでは未実装だったので今回は間に合わなかった。(実装を待つか、時間があれば自分で実装してSAOのメニューにもっと近づけたい)
OpenSiv3Dだと円の判定とかが実装しなくていいのでこういうの結構簡単に作れてよかった
EclipseでGit

以前Eclipse(Android SDK)+SubversionからAndroid Studio(IntelliJ IDEA)+Gitに移行してたので、EclipseでGitって使ったことなかったなーと思ったので、ほぼ備忘録

Pleiadesだと最初から`EGit`が入ってるのでセットアップは省略。

# ローカルで作成済みプロジェクトに対してGitリポジトリを新規作成してcommitしたりする

手元のEclipseでプロジェクトを作成し、そのあとにプロジェクトのフォルダ内に`.git`を作るという構成の場合

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/5a6a2e7e-a3be-1738-99df-2494b0e4a14e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/8bf66d28-7a73-1021-bc55-537fa13af828.png)

「プロジェクトの親フォルダー内のリポジトリーを使用または作成(U)」をチェック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/b850950e-ee5c-e413-3976-92b0fc0b1d74.png)

対象プロジェクトをクリックすると下部の「リポジトリーの作成」ボタンが押せるようになるので押下、するとプロジェクトのところにチェックが入るので、そのまま「完了(F)」すればOK

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/d84f741e-a21d-d935-8c32-3d0da5922efd.png)


そうすれば、プロジェクトのアイコンの右下部分にバージョン管理のpictが表示される ![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/cf25bb08-c8a3-987f-a808-c03bc3c8802a.png)


あとは https://www.gitignore.io/ あたりで[「Eclipse, Maven」とか入力して作成](https://www.gitignore.io/api/maven,eclipse)した`.gitignore`を配置して使えばOK

(ほかのパターンはおいおい。。)

# マージ

## コミット＆マージコミット

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/e1ffaf6b-ec96-e5c2-f7ab-1912d698c2f3.png)

この場合元ブランチの各コミット毎にマージしつつ、「マージしたよ」というコミットも作られる
（高）第一弾 SAPー訓練「会社構築」

#１．Tr-Cd:SPRO→SAP完全版ＩＭＧ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185058/8d42acf1-4ac2-1376-90dc-bd1d4bc2233e.png)

#２．企業構造→定義→財務会計→編集/コピー/削除/チェック：会社コード
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185058/f5d5feb0-bbd8-5ae9-6eab-eb5504982cbd.png)

→編集：会社コードデータ【選択】
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185058/3b0b650c-29ae-c7bb-8dfa-03f766f991dc.png)

企業構造
会社コード：J999
会社名   ：ABC株式会社
市区町村 : 東京
国　　　 : JP
通貨　　 : JPY
言語　　 : JA
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185058/dcea8fc8-1a91-2fdb-ab3c-899b78dde0e3.png)

#３．財務会計→総勘定元帳→G/L勘定→マスタデータ→準備→更新：勘定コード表一覧 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185058/1e6346bf-bf0a-e006-dfcb-a616f9cf65b1.png)

#４．勘定コード一覧作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185058/51564244-2e8c-547d-6b0c-a72ade722799.png)