OmniAICreator/Qiita-1.07M huggingface dataset:
CocoaPodsでOSSライブラリのライセンス表記を自動生成する

OSSライブラリを利用していればライセンス表記は必須ですが、ライブラリが増えるほどライセンス表示も追加しないといけないので手動管理は中々大変。

CocoaPodsでライセンス表記を自動生成できるとのこと。

# 環境
- Xcode 9.4.1
- CocoaPods 1.5.3
- プロジェクトにCocoaPodsは導入済み

# ライセンスの表記箇所

ライセンスの表記箇所はiPhoneの設定アプリ(歯車のやーつ)にあるアプリページに設置する。

＜確認方法＞
設定アプリを起動　>　起動直後のページをスクロールするとアプリ名の一覧が出てくるので対象のアプリを選択

Xcode上でacknowledgementファイルを作成して設定すればこの場所にライセンスの表示を設置することが可能。
今回はCocoaPodsで自動的にこのファイルを生成する。

マクドナルド、ケンタッキー、Coincheckのアプリなんかもここにライセンス表示を設置してる模様。

# Settings.bundleを作成する

- Xcode起動 ＞ New File… ＞ Settings Bundle

# Root.plistを編集する

作成したSettings.bundle内にあるRoot.plistを公式ドキュメントに沿って編集する

- https://github.com/CocoaPods/CocoaPods/wiki/Acknowledgements

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>StringsTable</key>
        <string>Root</string>
        <key>PreferenceSpecifiers</key>
        <array>
            <dict>
                <key>Type</key>
                <string>PSChildPaneSpecifier</string>
                <key>Title</key>
                <string>Acknowledgements</string>
                <key>File</key>
                <string>Acknowledgements</string>
            </dict>
        </array>
    </dict>
</plist>
```

# Podfileを編集

以下を追記する。

Pathは環境に合わせて書き換える（Podfileからの相対Path）。
例として、プロジェクト名がHoge、Settings.bundleをHogeプロジェクトのHogeディレクトリ直下に置いた場合。

```
post_install do | installer |
  require 'fileutils'
  FileUtils.cp_r('Pods/Target Support Files/Pods-Hoge/Pods-Hoge-acknowledgements.plist', 'Hoge/Settings.bundle/Acknowledgements.plist', :remove_destination => true)
end
```

変更を反映

```
$ pod update
```

# 確認

Settings.bundle以下にAcknowledgements.plistが書き出されて入ればOK
あとはビルドして設定アプリにライセンス表記があるか確認
HARK+TAMAGO-03で音の方向を検知してみた

たまたまネットで[聖徳玉子](https://lab.infocom.co.jp/2016/08/theta.html)という作品を見かけて、ここで使われている[たまご型マイクアレイ（TAMAGO-03）](http://www.sifi.co.jp/system/modules/pico/index.php?content_id=39)（8chのマイクアレイ）というやつが３万円足らずで買えることがわかり、思わず（会社の予算で）買ってしまった。

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/125904/f7cbbc19-3f9e-e6b4-a8e1-b83d6ee6a4f6.jpeg)

<!--more-->

これを使うと、音が来た方向がわかったりするらしい（最初は距離もわかるのかと思ったが今のところやり方わからじ）。
で、ソフトウェアとしては、もともと京大が開発し、現在はホンダが権利を獲得したという[HARK](https://hark.jp/)という制御ソフトが正式対応しているとのこと。そこまでちゃんとなってるならきっと僕にも使えるだろうと思ってチャレンジしてみた。
しかしHarkに関する情報はネット上にあまりなく、[Qiitaも二人くらいしか投稿していない](https://qiita.com/search?q=hark)という状況で萎えそうになった瞬間もあったが、[Harkクックブック](https://www.hark.jp/document/cookbook-jp/)という公式ドキュメントが、ところどころ説明不足感はありつつもそれなりに平易に書かれたもので、なんとか音の方向くらいはわかるようになった。
ただし、いろんなところではまってしまったのでここにメモを残しておきたい。

![hark.png](https://qiita-image-store.s3.amazonaws.com/0/125904/8dcd786f-83ae-8e23-4829-3a0d32fdd4cc.png)

これは、クックブックの「[マイクロホンからのリアルタイム音源定位](https://www.hark.jp/document/2.4.0/hark-cookbook-ja/fig-LearningHARK_002_03_2.html)」をそのまま実装したものである。
右下のグラフ、縦軸が方向(-180～+180）を表していて、横軸が時間。ひとつの音源を分かれたものだと認識してしまったり、途切れることはよくあるが、一応方向としては間違ってはいない。

はまった点：

+ Ubuntuのバージョンを下げてまでがんばったがLinuxからHark経由でたまごを用いた録音はできず、Windows版を使ってなんとか動かした。(TAMAGO-03というデバイス自体はできていた）。ちなみにWindows10が推奨とのことだがWindows7で試して今のところ問題ない。
+ Windows版でもHarkインストール前にpythonとかを入れる必要があるが、Cygwin内のパッケージでいれてもしょうがなくて、Windows自体にインストールする必要あり（そりゃそうか）。
+ HARK Designerというソフトを立ち上げるとブラウザでlocalhost:3000にアクセスするタブが立ち上がり、それがHarkのフロントエンドである。したがって3000番ポートはウィルスソフトなどでブロックしないようにしないといけない。本体はNode.jsで書かれたサーバであり、30MB近くを消費している。フロントエンド（ブラウザのタブ）を閉じても走り続けるが、止め方はわからない。
+ 基本的に[クックブックの図](https://www.hark.jp/document/2.4.0/hark-cookbook-ja/images/img-0011.png)と同じネットワークを作るだけなのだが、そもそもMAINに入れるはずのLOOP0というノードが検索しても見つからない。これは動的ノードというもので、他のSheet(タブ)の内容をひとつのノードとして使える機能らしい。つまり、LOOP0というsheetを先に作り、MAINのほうではノードリストの一番下の「Dynamic」からLOOP0を選べばよい。
+ はっきり書いていないけど、MAINはsubnetのシートで、LOOP0はiteratorである。
+ Windowsの場合、AudioStreamFromMicノードのパラメータとして**DEVICETYPE**は「**DS**」、**DEVICE**は「**TAMAGO-03**」と入れる。
+ 録音してファイルに書き出す場合、ディレクトリは**C:\ProgramData\HARK\hark-designer\userdata\networks**となった。
+ [クックブック](https://www.hark.jp/document/2.4.0/hark-cookbook-ja/fig-LearningHARK_002_03_2.html)に書いていないこととして、以下のパラメータ設定が必要
 + **LocalizeMusicノード**のパラメータ**A_MATRIX**が指定されていない。ここには、マイクの種類に依存した「伝達関数ファイル」のパスを入れる(zipファイルを指定する)。TAMAGO-03の場合は[Hark HPのDocumentsのSupported Hardware](https://www.hark.jp/document/supported/)にリストされているTAMAGO-01/02/03 (System in Frontier Inc.)から、Microphone Array Transfer Function Fileのリンクをたどって落とすもの('18.7.19現在「[By TSP Recordings](https://www.hark.jp/download/tamago_rectf.zip)」と「[By Geometrically Calculation](https://www.hark.jp/download/tamago_geotf.zip)」の二種類がある。どっちでもいいのかもしれないが、とりあえず後者を使っている)を指定する。
 + **SourceTrackerノード**の**THRESH**パラメータも指定されていない。ここは、認識に用いる音量の最低レベルを指定するものだが、意図する音だけ拾うのは結構シビアだった。私の環境で、リビングで子供の声を取ってみたときには36ぐらいがよかった。ちなみにfloatで設定できるらしい。

はっきり言ってHarkのフロントエンドはとても重いので、次はフロントエンドなしで動かしてみたい。[HARK-Python](https://www.hark.jp/document/2.4.0/packages/hark-python/index.html)というのを使えばできると信じたい。

参考にした記事：「５・３１」https://qiita.com/koalalala/items/c960cc82b39cc3f29a56
Oculus Go ＆ Raspberry Pi で Augmented Virtuality（拡張仮想）

## 概要
Oculus Go ってすごいけど、たまに現実に戻らなきゃいけないことがあります。
ゴーグル（ヘッドセット）をつけたまま、現実を見れれば便利だなと思いラズパイを組み合わせて作ってみました。

![37332782_2199673133408566_7097011510462906368_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/247920/a9a64992-acb9-30ba-61d3-874b22e53bb2.jpeg)
![37299198_2199653416743871_8051186740636942336_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/247920/7a67b288-15d0-c2d3-54d5-f76ac665d085.jpeg)

## 実現方法
カメラ付きの Raspberry Pi ZERO W にストリーミングソフトをインストールして、ラズパイとバッテリーをくっつけただけです。
上の写真は仮止めです。。。

## 参考サイト
ストリーミングソフトのインストールは以下のサイトを参考にしました。
[mjpg-streamerでraspberryPiのカメラからストリーミングをする方法](http://portaltan.hatenablog.com/entry/2016/11/29/185600)

## 一応手順
参考サイト通りですが一応手順

```bash:
# お約束のアップデート

$ sudo apt update
$ sudo apt upgrade

# 再起動
$ sudo reboot

# バージョン等
$ uname -s -r -v -p -o
Linux 4.14.56+ #1128 Wed Jul 18 12:18:22 BST 2018 unknown GNU/Linux

# ダウンロード
$ cd ~
$ git clone https://github.com/jacksonliam/mjpg-streamer.git mjpg-streamer

# インストール
$ cd mjpg-streamer/mjpg-streamer-experimental
$ sudo apt-get install libjpeg8-dev cmake
$ make
$ cd ~
$ sudo mv mjpg-streamer/mjpg-streamer-experimental /opt/mjpg-streamer

# 起動
$ LD_LIBRARY_PATH=/opt/mjpg-streamer/ /opt/mjpg-streamer/mjpg_streamer -i "input_raspicam.so" -o "output_http.so -p 9000 -w /opt/mjpg-streamer/www"
```

## PCで動作確認
ラズパイのIPアドレスにポート番号9000で接続する。Streamを押下すると、ストリーミング画像が表示され、回転ボタンで方向を調整してください。

```
http://xxx.xxx.xxx.xxx:9000/
```
![st003.jpg](https://qiita-image-store.s3.amazonaws.com/0/247920/e525eca4-762b-fc4d-9cbd-5dbda9bcaa31.jpeg)

## Oculusで動作確認
同様にオキュラスのブラウザで接続してください。ストリーミング画像が表示されれば、仮想から現実へ戻ることに成功です。
あとは、ラズパイをうまく固定してください。

![37315322_2199670993408780_2638128939389681664_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/247920/c79150ba-f2c0-6725-7aeb-7db14062c6ce.jpeg)

## 最後に
小型のWebカメラで、もっとスマートに実現できそう・・・
adlint導入 macintosh ＆名古屋のIoTは名古屋のOSで

AdLint 3.2.14 利用者ガイド
http://adlint.sourceforge.net/pmwiki/upload.d/Main/users_guide_ja.html

にMacintoshのことが書かれていない。
Linuxの例を実行。


```shell-session

$ gem install adlint
Fetching: adlint-3.2.14.gem (100%)
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
OgawaKiyoshi-no-MacBook-Pro:source ogawakiyoshi$ sudo gem install adlint
Password:
Fetching: adlint-3.2.14.gem (100%)
-------------------------------------------------------------------------------
     ___    ____  __    ___   _________
    /   |  / _  |/ /   / / | / /__  __/            Source Code Static Analyzer
   / /| | / / / / /   / /  |/ /  / /                    AdLint - Advanced Lint
  / __  |/ /_/ / /___/ / /|  /  / /
 /_/  |_|_____/_____/_/_/ |_/  /_/    Copyright (C) 2010-2014, OGIS-RI Co.,Ltd.

                         Thanks for installing AdLint!
     Please visit our project homepage at <http://adlint.sourceforge.net/>.

-------------------------------------------------------------------------------
Successfully installed adlint-3.2.14
Parsing documentation for adlint-3.2.14
Installing ri documentation for adlint-3.2.14
Done installing documentation for adlint after 17 seconds
1 gem installed
```

GNU makeがない場合の実行。

```
$ adlint -v -t adlint_traits.yml -l adlint_files.txt
/Library/Ruby/Gems/2.3.0/gems/adlint-3.2.14/bin/adlint:111:in `readlines': No such file or directory @ rb_sysopen - adlint_files.txt (Errno::ENOENT)
	from /Library/Ruby/Gems/2.3.0/gems/adlint-3.2.14/bin/adlint:111:in `<top (required)>'
	from /usr/local/bin/adlint:22:in `load'
	from /usr/local/bin/adlint:22:in `<main>'
```
先にadlintizeを実行しないといけなかった。

```
$ adlintize
$ make verbose-all
adlint -t adlint_traits.yml -o . -p 1 -v ./func.c
                   ./func.c [cpp] |====                        | 0.013s!
An error was occurred while processing `./func.c'.
See `func.c.msg.csv' and `func.c.log' for more details.
  0.500s user, 0.040s system, 00:00:00.54 total
make: *** [adlint_verbose-all] Error 4
```
elasticsearch-rest-high-level-client の dependency を pom.xml に書くときの注意 

java プログラムからElasticsearcのREST API を呼び出すために、
公式サイトの説明のとおり、pom.xml に以下の記述を追加しました。

		<dependency>
		    <groupId>org.elasticsearch.client</groupId>
		    <artifactId>elasticsearch-rest-high-level-client</artifactId>
		    <version>6.3.1</version>
		</dependency>

ビルドは成功、実行すると以下の例外が発生しました。


java.lang.NoSuchMethodError: org.elasticsearch.action.search.MultiSearchResponse.fromXContext(Lorg/elasticsearch/common/xcontent/XContentParser;)Lorg/elasticsearch/action/search/MultiSearchResponse;
	at java.lang.invoke.MethodHandleNatives.resolve(Native Method)
	at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:965)
	at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:990)
	at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1387)
	at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1739)
	at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:442)
	at org.elasticsearch.client.RestHighLevelClient.multiSearch(RestHighLevelClient.java:423)


調べたところ elasticsearch-rest-high-level-client-6.3.1.jar の依存ファイルとして elasticsearch-5.6.8.jar がダウンロードされていることが原因でした。

pom.xml に、明示的に以下の dependency を追加することで解決しました。

 		<dependency>
		    <groupId>org.elasticsearch</groupId>
		    <artifactId>elasticsearch</artifactId>
		    <version>6.3.1</version>
		</dependency>
サイトマップのツリー構造を CSS のみで表現する

[デモページ](https://codepen.io/anon/pen/ejdVmB)

HTML側

```
<div class="sitemap">
<ul>
  <li><a href="#">ホーム</a>
    <ul>
      <li><a href="#">○○○○○</a>
        <ul>
          <li><a href="#">○○○○○</a></li>
          <li><a href="#">○○○○○</a></li>
          <li><a href="#">○○○○○</a>
            <ul>
              <li><a href="#">○○○○○</a></li>
              <li><a href="#">○○○○○</a></li>
              <li><a href="#">○○○○○</a></li>
            </ul>
          </li>
        </ul>
      </li>
      <li><a href="#">○○○○○</a>
        <ul>
          <li><a href="#">○○○○○</a></li>
          <li><a href="#">○○○○○</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>
</div>
```

CSS側

```
* {
  margon: 0;
  padding: 0;
  list-style: none;
}

.sitemap ul li ul {
  margin-top: .5em;
  margin-bottom: .75em;
  margin-left: 48px;
}
 
.sitemap ul li ul li {
  margin-bottom: .25em;
  position: relative;
}
 
.sitemap ul li ul li::before {
  content: "";
  position: absolute;
  top: -0.5em;
  left: -16px;
  width: 10px;
  height: calc(100% + .75em);
  border-left: 1px solid #3972b2;
}
 
.sitemap ul li ul li:last-child::before {
  height: calc(1em + .25em);
}
 
.sitemap ul li ul li::after {
  content: "";
  position: absolute;
  top: .75em;
  left: -16px;
  width: 10px;
  border-bottom: 1px solid #3972b2;
}
```
【VSCode】改行コードをCRLFからLFにする

# 概要
MacとWindowsの両方でコードを書いているときに、Windows側で改行コードがCRLFであることによるエラーが起きてしまうため、全ファイルの改行コードをLFにする必要があった。
最初はファイルは少ししかなかったがファイルが増えてきたのでさすがにめんどくさくなって一撃で置換できるようにした。

# 利用者に求めること
Windows on bash を使えるようにしておく。

# コマンド
LRに置換したいディレクトリで以下を実行する。

```
find . -type f -print0 | xargs -0 sed -i 's/\r//g'
```

## コマンドの説明

`find` コマンドで現在のディレクトリを再帰的に走査する。
`-type f` ではファイルのみ、 `-print0` は走査した結果をnull文字区切りにして返却するという指定。

`xargs` コマンドでは `-0` ( `--null` でも可)を指定することでパイプで渡された文字をnull文字で区切って `sed` コマンドに渡す。
`sed` コマンドの `-i` ( `--in-place` でも可)ではファイルを直接変するオプション。`s/\r//g` については以下とのこと。ちなみにsedコマンドでは\nという文字を正規表現で拾うことができないらしいので、`s/\r\n/\n/g` とはならないことに注意。

>「s」コマンドは、デフォルトでは1行の処理で最初に見つけたパターンを置き換えたら終了します。各行に含まれる全てのパターンを置き換えたい場合は、「s」コマンドに「g」オプションを付けて実行します。 
> [@IT【 sed 】コマンド（基礎編その4）](http://www.atmarkit.co.jp/ait/articles/1610/17/news015.html)

# 参考
https://stackoverflow.com/questions/3891076/how-to-convert-windows-end-of-line-in-unix-end-of-line-cr-lf-to-lf
https://qiita.com/wnoguchi/items/1b5d18118728b62e50fb
http://x68000.q-e-d.net/~68user/unix/pickup?find
http://www.atmarkit.co.jp/ait/articles/1801/19/news014.html
http://www.atmarkit.co.jp/ait/articles/1610/17/news015.html
僕が考えた最強のphp detect_encoding


メールをLINE転送するBOT作りました。
https://line-email.dqc.jp

その際、あいかわらずメール本文のエンコーディング解析にはまったので、最強のエンコーディングディテクタを作りました。
「ひらがな＆常用漢字をたくさん含んでるのが正しいエンコーディング」
というロジックです。
常用漢字ユーザーにおすすめです。ご査収ください。

```php

<?php

class Detector{

    const INTERNAL_ENCODE = 'UTF-8';
    const DETECT_ORDER = 'JIS,SJIS,EUC-JP,CP936';
    const STANDARD_KANJI_REGEXP = '/[ぁ-ん亜哀愛悪握圧扱安暗案挨曖宛嵐以位依偉囲委威尉意慰易為異移維緯胃衣違遺医井域育一壱逸稲芋印員因姻引飲院陰隠韻畏萎椅彙茨咽淫右宇羽雨渦浦運雲唄鬱営影映栄永泳英衛詠鋭液疫益駅悦謁越閲円園宴延援沿演炎煙猿縁遠鉛塩怨媛艶汚凹央奥往応押横欧殴王翁黄沖億屋憶乙卸恩温穏音旺岡臆俺絵開階貝劾外害慨概涯街該垣嚇各拡格核殻獲確穫覚角較郭閣隔革学岳楽額掛潟割喝括活渇滑褐轄且株刈乾冠寒刊勘勧巻喚堪完官寛干幹患感慣憾換敢棺款歓汗漢環甘監看管簡緩缶肝艦観貫還鑑間閑関陥館丸含岸眼岩頑顔願下化仮何価佳加可夏嫁家寡科暇果架歌河火禍稼箇花荷華菓課貨過蚊我画芽賀雅餓介会解回塊壊快怪悔懐戒拐改械海灰界皆苛牙瓦楷潰諧崖蓋骸柿顎葛釜鎌韓玩企危喜器基奇寄岐希幾忌揮机旗既期棋棄機帰気汽祈季紀規記貴起軌輝飢騎鬼偽儀宜戯技擬欺犠疑義議菊吉喫詰却客脚虐逆丘久休及吸宮弓急救朽求泣球究窮級糾給旧牛去居巨拒拠挙虚許距漁魚享京供競共凶協叫境峡強恐恭挟教橋況狂狭矯胸脅興郷鏡響驚仰凝暁業局曲極玉勤均斤琴禁筋緊菌襟謹近金吟銀伎亀毀畿臼嗅巾僅錦九句区苦駆具愚虞空偶遇隅屈掘靴繰桑勲君薫訓群軍郡惧串窟熊係傾刑兄啓型契形径恵慶憩掲携敬景渓系経継茎蛍計警軽鶏芸迎鯨劇撃激傑欠決潔穴結血月件倹健兼券剣圏堅嫌建憲懸検権犬献研絹県肩見謙賢軒遣険顕験元原厳幻弦減源玄現言限個古呼固孤己庫弧戸故枯湖誇雇顧鼓五互午呉娯後御悟碁語誤護交侯候光公功効厚口向后坑好孔孝工巧幸広康恒慌抗拘控攻更校構江洪港溝甲皇硬稿紅絞綱耕考肯航荒行衡講貢購郊酵鉱鋼降項香高剛号合拷豪克刻告国穀酷黒獄腰骨込今困墾婚恨懇昆根混紺魂佐唆左差査砂詐鎖座債催再最妻宰彩才採栽歳済災砕祭斎細菜裁載際剤在材罪財坂咲崎作削搾昨策索錯桜冊刷察撮擦札殺雑皿三傘参山惨散桟産算蚕賛酸暫残仕伺使刺司史嗣四士始姉姿子市師志思指支施旨枝止死氏祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治璽磁示耳自辞式識軸七執失室湿漆疾質実芝舎写射捨赦斜煮社者謝車遮蛇邪借勺尺爵酌釈若寂弱主取守手朱殊狩珠種趣酒首儒受寿授樹需囚収周宗就州修愁拾秀秋終習臭舟衆襲週酬集醜住充十従柔汁渋獣縦重銃叔宿淑祝縮粛塾熟出術述俊春瞬准循旬殉準潤盾純巡遵順処初所暑庶緒署書諸助叙女序徐除傷償勝匠升召商唱奨宵将小少尚床彰承抄招掌昇昭晶松沼消渉焼焦照症省硝礁祥称章笑粧紹肖衝訟証詔詳象賞鐘障上丈乗冗剰城場壌嬢常情条浄状畳蒸譲醸錠嘱飾植殖織職色触食辱伸信侵唇娠寝審心慎振新森浸深申真神紳臣薪親診身辛進針震人仁刃尋甚尽迅陣酢図吹垂帥推水炊睡粋衰遂酔錘随髄崇数枢据杉澄寸世瀬畝是制勢姓征性成政整星晴正清牲生盛精聖声製西誠誓請逝青静斉税隻席惜斥昔析石積籍績責赤跡切拙接摂折設窃節説雪絶舌仙先千占宣専川戦扇栓泉浅洗染潜旋線繊船薦践選遷銭銑鮮前善漸然全禅繕塑措疎礎祖租粗素組訴阻僧創双倉喪壮奏層想捜掃挿操早曹巣槽燥争相窓総草荘葬藻装走送遭霜騒像増憎臓蔵贈造促側則即息束測足速俗属賊族続卒存孫尊損村他多太堕妥惰打駄体対耐帯待怠態替泰滞胎袋貸退逮隊代台大第題滝卓宅択拓沢濯託濁諾但達奪脱棚谷丹単嘆担探淡炭短端胆誕鍛団壇弾断暖段男談値知地恥池痴稚置致遅築畜竹蓄逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷鋳駐著貯丁兆帳庁弔張彫徴懲挑朝潮町眺聴脹腸調超跳長頂鳥勅直朕沈珍賃鎮陳津墜追痛通塚漬坪釣亭低停偵貞呈堤定帝底庭廷弟抵提程締艇訂逓邸泥摘敵滴的笛適哲徹撤迭鉄典天展店添転点伝殿田電吐塗徒斗渡登途都努度土奴怒倒党冬凍刀唐塔島悼投搭東桃棟盗湯灯当痘等答筒糖統到討謄豆踏逃透陶頭騰闘働動同堂導洞童胴道銅峠匿得徳特督篤毒独読凸突届屯豚曇鈍内縄南軟難二尼弐肉日乳入如尿任妊忍認寧猫熱年念燃粘悩濃納能脳農把覇波派破婆馬俳廃拝排敗杯背肺輩配倍培媒梅買売賠陪伯博拍泊白舶薄迫漠爆縛麦箱肌畑八鉢発髪伐罰抜閥伴判半反帆搬板版犯班畔繁般藩販範煩頒飯晩番盤蛮卑否妃彼悲扉批披比泌疲皮碑秘罷肥被費避非飛備尾微美鼻匹必筆姫百俵標氷漂票表評描病秒苗品浜貧賓頻敏瓶不付夫婦富布府怖扶敷普浮父符腐膚譜負賦赴附侮武舞部封風伏副復幅服福腹複覆払沸仏物分噴墳憤奮粉紛雰文聞丙併兵塀幣平弊柄並閉陛米壁癖別偏変片編辺返遍便勉弁保舗捕歩補穂募墓慕暮母簿倣俸包報奉宝峰崩抱放方法泡砲縫胞芳褒訪豊邦飽乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貿防北僕墨撲朴牧没堀奔本翻凡盆摩磨魔麻埋妹枚毎幕膜又抹末繭万慢満漫味未魅岬密脈妙民眠務夢無矛霧婿娘名命明盟迷銘鳴滅免綿面模茂妄毛猛盲網耗木黙目戻問紋門匁夜野矢厄役約薬訳躍柳愉油癒諭輸唯優勇友幽悠憂有猶由裕誘遊郵雄融夕予余与誉預幼容庸揚揺擁曜様洋溶用窯羊葉要謡踊陽養抑欲浴翌翼羅裸来頼雷絡落酪乱卵欄濫覧利吏履理痢裏里離陸律率立略流留硫粒隆竜慮旅虜了僚両寮料涼猟療糧良量陵領力緑倫厘林臨輪隣塁涙累類令例冷励礼鈴隷零霊麗齢暦歴列劣烈裂廉恋練連錬炉路露労廊朗楼浪漏老郎六録論和話賄惑枠湾腕]/u';

    function detect($body){

        preg_match_all(self::STANDARD_KANJI_REGEXP, $body, $m);
        $size[self::INTERNAL_ENCODE] = sizeof($m[0]);

        $encodes = explode(',', self::DETECT_ORDER);
        foreach($encodes as $e){
            $tmp = mb_convert_encoding($body, self::INTERNAL_ENCODE, $e);
            preg_match_all(self::STANDARD_KANJI_REGEXP, $tmp, $m);
            $size[$e] = sizeof($m[0]);
        }

        arsort($size);

        return key($size);
    }
}
Google Cloud Text-To-Speechが、非公式?にWavenet日本語版対応してる件

[Cloud Text-To-Speech サポート音声一覧](https://cloud.google.com/text-to-speech/docs/voices)では、日本語はStandardのみで高音質のWavenetには未対応です。
しかし、[デモページ](https://cloud.google.com/text-to-speech/?hl=ja)で日本語を選ぶと、さりげなくWaveNetが選択可能になってました (ja-JP-Wavenet-A)。

音質ですが、たしかにちょっと自然な感じ。なお、男声もあればいいなと試しにja-JP-Wavenet-BをAPIで指定してみましたが、残念ながらエラー。

追記：2018/8/11時点で再度確認したところ、ja-JP-Wavenet-Aもリストに追加されていました。
スマートプラグ活用案

スマートプラグ（HS105）を購入したので皆さんがどのような活用をされているのか調べてみました。
![06016456-53F4-458F-B8A5-89A29CCF7EFD.jpeg](https://qiita-image-store.s3.amazonaws.com/0/232600/7ef9cd34-5da5-57e4-e60d-35066ebad42c.jpeg)


# HS105で出来ること
スマホからON/OFF、現在のON/OFF状態確認
<img width="375" alt="7A4AA030-04B5-449F-B8EE-1700BB9A6D88.png" src="https://qiita-image-store.s3.amazonaws.com/0/232600/7da79c23-4430-bbfb-6bc1-0e7c4c1f1ca0.png">

タイマー
<img width="375" alt="56EDD9E0-7740-4E57-BCAB-3305AB68290C.png" src="https://qiita-image-store.s3.amazonaws.com/0/232600/f7f6ffc7-39cb-0d72-69dd-85907ee56887.png">
<img width="375" alt="570ABC97-0304-46C5-8C27-E90AACC62311.png" src="https://qiita-image-store.s3.amazonaws.com/0/232600/162e7a25-cacf-dbb0-7f81-1919b3d4f356.png">
<img width="375" alt="4140F90F-8BFD-4BCF-8667-3A530196617F.png" src="https://qiita-image-store.s3.amazonaws.com/0/232600/b6d9022a-103e-3874-6102-70c0a40e39a8.png">

稼働時間
<img width="375" alt="3401C9B8-6ABB-4D55-97C5-6454946C051F.png" src="https://qiita-image-store.s3.amazonaws.com/0/232600/2654a62f-4c9a-804c-3522-3a0974cd97c1.png">

# 活用案
- 扇風機、サーキュレーター
- 手が届かない、遠隔地、屋根裏にある家電
- 蚊取り線香
- ペット用照明、ヒーター
- 充電
- マルチタップ
- アロマ
- 水槽用照明
- 監視カメラ
- 定期的にルータを再起動
VBSを久しぶりに書いて悩んだこと（Continueがない‥）

数年(十数年？)ぶりにvbsを使ってbatを各案件があった。

orelseが使えないとか色々面倒だが、中でも困ったのがループ処理でcontinueに該当するシンタックスがないこと。

以下のようにすると疑似的に実現できた。


```
For i=0 To obj.count: Do

　  If hogehoge Then  Exit Do ' Continueの代わり

Loop Until 1: Next
```

Forの中にDo…Untilを書くのがポイント。
全くもって盲点でした。

OrElse、AndAlsoもなんとかできないものか…
EC-CUBE3でお届け日の選択可能日数を変更する

## tl;dr
EC-CUBE3を利用してECサイトを運用していて、商品購入ページで表示される`お届け日`の選択可能日数が、デフォルト21日（３週間）になっていて、管理画面から変更したりできないので変更方法を調べた。

## 方法
設定ファイル（サーバーにログインできる必要あり！）を編集する必要がある。

設定ファイルは以下にある。

```bash
src/Eccube/Resource/config/constant.yml.dist
```

しかし、EC-CUBEの利用方法では、このファイルを直接編集するのは非推奨となっているので注意。
（まぁ、編集してしまっても動くんだけど）

[EC-CUBEの公式開発ドキュメント](https://doc.ec-cube.net/spec_config)でも書いてあるように、同名のファイル（`.dist`は削除）を別の場所にコピーする。

```bash
app/config/eccube/constant.yml
```

こうすると、こっちのファイルを先に読みに行ってくれるので、変更を反映出来る。
もとのファイルはこのファイルがなかったときに参照されるファイルなので、デフォルト的な扱い。（だから編集すべきじゃないということ）

で、このファイルの中の

```yml
deliv_date_end_max: 21
```

`deliv_date_end_max`がお届け日で選択可能な日数を指定しているので、この日数を変更する。

```yml
deliv_date_end_max: 31
```

以上！！
テスト用のIPAファイルをたくさん用意する方法

IPAファイルを1つ用意し、解凍
以下のシェルでIDの違うIPAファイルを複数作成します。

```
#!/bin/sh

export DEVICE=ipad
export NAME=apptest
export LOC=/Users/cupper/Documents/CT/${DEVICE}
export PLIST=${LOC}/Payload/${NAME}.app/Info.plist
export PCMD=/usr/libexec/PlistBuddy
export ID=com.kaz.hogehoge

cd ${LOC}
for i in {1..101}
do
  ${PCMD} ${PLIST} -c "Set :CFBundleIdentifier $ID.$DEVICE$i.$NAME"
  zip -r ${DEVICE}${i}.ipa Payload
done
```
Reactでstyled-componentを使ってベースとなるstyleを当てる方法

## 環境について

- React v16.3.2
- [styled-components](https://www.styled-components.com/) v3.3.0
- styled-reset v1.3.4

## 今回やりたいこと

Reactを使う場合は専ら[styled-components](https://www.styled-components.com/)を使っています。これを知ってからは手放せなくなってしまった。
やはり他のComponentにstyleが汚染されないのは良いですよね。

よくあるreset.cssとbaseとなるスタイルを`styled-components`でReactのアプリに適用したいと思います。それによりwebpackなどでcss-loaderを使って別途cssを出力しなくてすみます！


## 基本的なやり方について

まずは基本的なとこから

App.jsやindex.jsなど全てのComponentをラップしているComponentのrenderの中でメソッドを呼び出すだけです。

``` jsx
class App extends React.Component{
  {/** 省略 **/}
  render() {
    baseStyles(theme)
    return (
      <ThemeProvider theme={theme}>
        {/** 省略 **/}
      </ThemeProvider>
    )
  }
}
```

### injectGlobalについて
グローバルCSSを作成するヘルパーメソッドです。コンポーネントを返さず、スタイルシートにスタイルを直接追加することができます。

## baseStyle
関数を作ってstyled-componentsの`injectGlobal`というヘルパーメソッドを使うことで先ほどのように`baseStyle()`で呼び出すことができます。もちろん引数を渡すこともできるのでthemeを渡したりできますね。

``` javascript
import { injectGlobal } from 'styled-components'
import reset from 'styled-reset'
import { utilityStyles } from 'styles/utility'

const baseStyles = theme => injectGlobal`
  ${reset}
  // base.css
  html{
    font-size: ${theme.base.fontSize};
  }
  body {
    margin: 0;
    background: ${theme.color.white};
    color: ${theme.color.greyDarker};
    font-family: ${theme.base.fontFamily};
    font-size: 1em;
    line-height: ${theme.base.lineHeight};
    word-wrap: break-word;
    -webkit-text-size-adjust: 100%;
    -webkit-font-smoothing: antialiased;
  }
  a {
    cursor: pointer;

    &:link,
    &:visited {
      color: ${theme.color.greyDarker};
      text-decoration: none;
    }
  
    &:hover {
      opacity: .9;
      text-decoration: underline;
    }
  }
  h1,h2,h3,h4,h5, h6 {
    font-weight: 800;
  }
  #root {
    font-size: ${theme.font.size};
  }
  ${utilityStyles()}
`

export default baseStyles
```

### styled-resetについて
[zacanger/styled-reset: reset.css for styled-components](https://github.com/zacanger/styled-reset)

styled-components用のreset.cssです。使い方も簡単でこれでOK

``` javascript
import reset from 'styled-reset'
const baseStyles = () => injectGlobal`
  ${reset}
  /* other styles */
`
```

### その他のCSSを使いたい

例えば以下のようのutility系のcssスタイルをとかをbaseStylesに加えたい場合は同じように関数を作って呼び出すだけです。

``` javascript
export const utilityStyles = () => css`
  .u-fz-10 {
    font-size: 1rem !important;
  }

  .u-fz-12 {
    font-size: 1.2rem !important;
  }

  .u-fz-14 {
    font-size: 1.4rem !important;
  }

  .u-fz-16 {
    font-size: 1.6rem !important;
  }

  .u-fz-18 {
    font-size: 1.8rem !important;
  }
`
const baseStyles = () => injectGlobal`
  ${utilityStyles()}
  /* other styles */
`
```
フィボナッチ数列

# C言語でフィボナッチ数列の和を計算

```c:fibo.c
#include <stdio.h> // 標準入出力

// メイン関数
int main(void) {
  int n; // 入力用
  unsigned long x1=0, x2=1, x3; // フィボナッチ計算用
  // 入力
  printf("正の整数を入力してください : ");
  scanf("%d", &n);

  // 0以下のときは弾く
  if(n < 0) {
    printf("不正な値が入力されました.\n");
    return 1;
  }
  // f(0) = 0
  else if(n == 0) {
    printf("0\n");
  }
  // f(1) = 1
  else if(n == 1) {
    printf("1\n");
  }
  // f(n) = f(n-1) + f(n-2)
  else {
    n = n-1; // 繰り返しの回数を調整
    while(n > 0) {
      x3 = x1 + x2;
      x1 = x2;
      x2 = x3;

      n--;
    }
    printf("%lu\n", x1);
  }



  return 0;
}

```
木構造

# 課題：C言語で木構造を実装したときのメモ

```c:tree.c
#include <stdio.h> // 標準入出力

#define NUM 7

typedef struct node {
  int val;
  struct node * left;
  struct node * right;
} NODE;


int main(void) {
  int i, j, counter=1; // カウンタ
  // 2分木データ
  NODE data[NUM] = {
    {2, &data[1], &data[2]},
    {1, &data[3], &data[4]},
    {3, &data[5], &data[6]},
    {0, NULL, NULL},
    {7, NULL, NULL},
    {9, NULL, NULL},
    {1, NULL, NULL}
  };

  NODE show_node[8]; // 表示する用のリスト
  NODE child_node[8]; // 子ノードを保存する用のノード
  show_node[0] = data[0]; // ルートノード

  for(i=0;i<3;i++) {
    // 表示
    for(j=0;j<counter;j++) {
      // 表示
      printf("(%d) ", show_node[j].val);

      // 子ノードを保存
      if(show_node[j].left != NULL)
        child_node[j*2] = * show_node[j].left; // 左の子ノードを保存
      if(show_node[j].right != NULL)
        child_node[j*2+1] = * show_node[j].right; // 右の子ノードを保存
    }
    printf("\n");

    //
    for(j=0;j<8;j++) {
      show_node[j] = child_node[j];
    }

    counter = counter*2;
  }

  return 0;
}

```
私が料理する時と、アプリ開発をする時は、共通点が多いと思う件

子供の時から料理が好きだったのですが、ふと料理をする時の思考と、開発する時の思考が似ているなと思ったので、備忘までに記録しておくことにしました。
ただし、プロの料理人ではないので、プロセスが正しいことを主張するわけではなく、あくまでも自分自身の思考の整理と考えています。また複数人で料理したことはないので、今回は一人でフルスクラッチで開発する時の場面と、一人で料理をする場面と照らし合わせてみました。結論からすると、共通点が多いとは思ったものの、家庭料理との完全には一致させるのは、さすがに無理があるなと思いました。しかし、非エンジニアにとって、アプリ開発やシステム開発の、大雑把なプロセスを理解するには、少しは料理のプロセスが参考になる部分があるのかなと思いました。

![ae82d951705a987ac6c1dd0135d75e29_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/190178/79718fbb-027a-e3f1-c0bb-90142af1d596.jpeg)


1. 料理を考える前に、まずは冷蔵庫にある料理素材をチェックする
>現場や関係者からヒアリングし、現状のアクターやデータをリストに出し、それらの関係性を紐解く

2. その素材が使えそうな料理の候補を挙げる
>日々調査しているトレンドの中から、近しいサービスやシステムをピックアップする

3. 最近食べた料理とか天気などを踏まえて、家族や仲間など、食べる人が、その料理を食べたいと思うか創造してみる
> プロダクトのオーナーや、その関係者及びステークホルダーに、ピックアップしたサービスやシステムの話をして、期待値が、どの辺にあるかを創造してみる

4. 料理の候補と、家族が喜ぶ姿をマッチングさせた後、さらにもっと食べる人が喜びそうなアレンジを考えてみる
>ベースとなるサービスやシステムのあたりをつけた後、どうやったら期待値を超えることができるかアレンジを考えてみる

5. アレンジを加えた料理からレシピや調理方法の仮説を立ててみる
>料理の仮説が完成したら、PoC（Proof of Concept）をして、グランドデザインやコンセプトを作る

6. 完成した料理や、食事をするイメージをメモなどに書く
>UXを言語化し、ワイヤーフレームに落とし込み、システムアーキテクトや開発手法を検討し、基本設計や概算見積もりを完成させる。

7. レシピの仮説を立てたら、足りない材料をスーパーで買ってくる
>プロダクトのオーナーとすり合わせが終わったら、不足している人材やツールや素材などの調達を開始する

8. 材料を買ってきたら、下味となるスープや出汁を作る。
>調達が完了するまでに、出来そうな部分から、開発を進める。まずは、プロダクトのオーナーに感触をつかむためのプロトタイプの完成から始めてみる

9. 野菜や肉を切り、すぐに調理できる状態にしておく
>マイクロサービスアーキテクチャにしていく場合は、主要なものを作っておき、ざっくり確認できるプロトタイプをすぐに作れるように準備しておく。特にUIはクライアントから分かり易いフィードバックをもらえるので、先行して進めて、早めにフィードバックをもらっておく。

10. 調理の中間成果を回収できる容器や、完成物を盛り付ける食器を用意する
>納品作業がある場合は、納品条件や成果物のフォーマットを確認し、準備を進めておく

11. 調理を始める前に、素材を入れる順番のイメージトレーニングをする
>ガントチャートやクリティカルパスを書きながら、工程の順番を確認し、納期に間に合わなそうであれば、スコープの調整や仕様の調整を行う

12. 調理をスタート
>あらかじめ開発した中間成果物を結合しながら、全体のサービスへと近づけていく。

13. アク取りなどをしたり、火加減が適切か？素材が混ざった後の味は丁度良いか？など、状態を監視する
>それぞれを結合するたびに、仕様の確認を行い、抜け漏れがないかなどの結合テストを行っていく。ある程度の中間成果物で、プロダクトオーナーへのレビューを行っておく。

14. 調理が完成したら、用意した食器に、盛り付けを行う
>全体のUX/UIを、仕様書と照らし合わせながら、予め考えていたものと同じになっているかを検証していく。プロダクトオーナーからのチェックも当然行っておく。

15. 食卓を綺麗にし、料理を盛った食器などを並べる
>ローンチに向けて、成果物の整理や、仕様書や納品物の整理を行っていく。また導入に向けたマニュアル作成や説明会など支援も行っていく。

16. 食べる
>ローンチ

17. 料理はどうだったか？どんな体験だった？を食べる様子から、感じ取る
>PV数などの定量的な観点や、ユーザーからのクレームなどの定性的な情報をキャッチし、課題を整理していく

18. 次に活かすポイントを記憶する
>ある程度、フィードバック情報が溜まってきたら、KPTを整理して、改善点を考える


と、ここまで書いてみましたが、さすがに家庭料理とアプリ開発のプロセスを完全にマッチングさせるには、さすがに無理があるなと思いました。ホワイト・ブラックテストなど総合テストや品質管理の工程など、マッチングが難しい部分があります。
他にも、
・デザインの工程が、アプリ開発の場合は、開発中にも同時並行で行っていくが、料理は、調理中のデザインという要素は、それほど多くない
・同じくテストの工程は、アプリ開発の場合、単体テストや結合テストを多めに行うことができるが、料理の場合は、中間でのテストというのは難しい
などです。

今回は、一人で開発する工程でしたが、これをチームに置き換えると、役割分担が生まれ、さらにチームビルディングや、進捗の管理、さまざななコミュニケーションが発生します。同じようにコース料理は、複数人の料理人がいろんな役割分担をしていき、お客様に喜ばれるサービスを考えるものと思われます。アプリ開発と料理は、完全には一致しないものの、提供する人が喜ぶものを創造するという意味で、共通点があるのはないでしょうか。
インターンとしてプログラム書く人に伝えたい基本

職場でインターン生と関わる機会が多いので伝えたいことをまとめています。社内のインターン生だけに伝えるのも寂しいので公開しておきます。
どこかの企業でインターンする際には参考にしていただけますと幸いです。ごく基本的なことです。プライベートでやるべきことは書きません。

## 想定

10人から20人規模のスタートアップで実務経験のない人がインターンすることを想定しています。私の環境的にGoやPythonを用いたサーバサイド開発が主ですが極力一般的なことを書きます。プログラムを書き始めて2年以内の初心者向けが多め。企業風土に依存することが多いので参考程度に。
書いている人はただの若手です。もっと熟練の方は別のことを言うかもしれません。

### 運用、保守という概念を知ろう

サービス開発の場合、あなたの書いたコードは長期間動くことが想定されます。重要なコードは任せてもらえないことも多いですが、小さなコードでも一度組み込まれてしまえば、思った以上に長期間動きます。その際にコードを動かし続ける、運用、保守という役回りを誰かが担います。あなたの書いたコードに追加の改修が入る可能性もあるでしょう。
そのため、高い品質で運用、保守しやすく、改修を加えやすい状態を作る努力は大切です。あなたが全責任を負うことはありませんが、責任の一端は書いた人が担っていると肝に命じてください。

その上で具体的な話に移ります。

## テストを書け、ロジック書くより先に出来る限り早くテストを書け

テストのないコードは、基本的に保守性、拡張性が著しく低いです。最悪誰にも理解できず破棄されます。そうならないためにも必ずテストを書きましょう。テストファーストの考え方は、現在の開発では一般的ですが、職場によってはその概念を持っていないところもあります。
スピード感重視だからプロダクションにテストがない(キリッ みたいな職場は、(私の経験上は)業務に占める開発の割合が低くむしろスピードが遅いです。また後から入った人がキレそうになります。インターン生が入るのはプロトタイピングの段階ではないだろうと思いますので、テスト書きましょう。
無策に臨むよりはTDDやったほうがいいですが、もっといいものを採用していればマストではありません。テストの概念がない人が書いたコードにテストを足すのは結構難しいので基本的にテストが先です。

## 一人で作業をするな

これはどちらかといえば職場の体制の問題ですが、基本的に一人での作業はやめてください。ほとんどの場合初心者〜若手くらいのプログラマが一人で作業するとろくなことになりません。わからないことは聞いてください。
シニア以上のプログラマは知りませんが、インターン生〜私みたいな若手くらいの一人作業は、知らず知らずのうちに大量の問題をコードに仕込みます。二人以上で作業すると大概の場合問題は減ります。(なくなりはしない)。
また、自分とは違う経験を持った人と一緒に作業すると、一人に比べて成長速度が上がります。

## Lintツールやフォーマッターを使おう

大概職場から指示があると思いますが、一般的な書き方を教えてくれるツールは積極的に使いましょう。どれを採用するかは職場次第かと思います。
フォーマッターかけてないから、という理由のプルリク修正は本当にしょうもないので、常に出るようにしておきましょう。

## サービスに入るときには注意しよう

prd, stg, dev,どの環境であってもサービスに接続する際には注意しましょう。どんな注意を払うべきかは企業によって決まっているかと思います。
Unix系サーバーのsudoコマンドは、簡単に環境をぶっ壊すので、注意。prd環境にインターン生がアクセスできることはまれでしょうが、devレベルでも注意。

## Gitの使い方を学んでおこう

Git、というかバージョン管理ツールの基本は、学んでおこう。多くの場合、gitの使い方がわからないと仕事にならないので。
Gitは習得コストそこそこ高いのでちゃんと時間をとろう

## 基本的なことを学ぼう

働いていれば学べることは多い。ちょっとした経験でも将来いきることがある。
強いて言うなら、詳しい人に話聞いておくといいよ。
DRY, KISS, YAGNIや命名といったコードの書き方から、データ構造、アルゴリズム、オーダーなどいろいろ学んどくといいです。

## ライブラリを導入する状況では、慎重になろう（大体の場合は誰かに聞いたほうが良い）

ライブラリを使って実装する必要のある機能を任されたときには、慎重にパッケージ選定しましょう。最終更新が数年前とか、スター数少ないとか、いっぱいプルリクが溜まっているとか、必要性の割にあまりに多機能すぎるとか、ライセンス書いてないとか、そういうのは、避けたほうがいいです。
ググって最初に出てきたから選定、というのもやめましょう。
メンテされてないライブラリが組み込まれている状況はリスク高いです。

## 仕事ができなくても気にしない

わからなくてどうしようもない状況や、重大な失敗などで落ち込むことがあるかもしれない。あなたが仕事できないのは、あなたではなくマネージャーが悪いのでくよくよしてはいけない。反省すべきことを反省したらあとはさっさと忘れよう。

## 実績づくりを意識しよう

インターンだろうが何だろうが、人に自慢できる実績があると、いろいろ有利になる。積極的に自慢のネタを作ろう。
やべー状況に陥ったけど私はクールに解決した的な話を（機密保持上問題ない範囲で）いくつか作ろう。

## もっとおもしろいことを見つけたらさっさと辞めよう

インターンの多くはバイトだと思うので、辞めやすい強みは活かそう。私みたいなポジションからするとちょっと寂しい。

## 終わりに

テクニカルな事書こうと思ったらソフトスキルばかりになってしまいました。個別事象Qiitaで共有してもしゃーないからしょうがない。
いろいろ追記していきます。
Arch linuxのGUIが起動しなくなった

Arch Linuxが起動しなくなった。
仮想コンソールは開けるのでgmesgを使って調べてみると
gnome-shellがsegfaultとのこと
アップデートの影響か？

対処法としては、gnome-shellをアップデートするのが一つ
もう一つが
https://bbs.archlinux.org/viewtopic.php?id=238804
によると
/etc/gdm/custom.confにて
WaylandEnable=falseをアンコメントする。

とりあえずメモ
GCP 今月の料金の巻

#目的
利用料を共有

#利用用途
コードの実行環境として、GCP のインスタンスを利用中。
ハックされるのを一番避けたい。
アップデートかけて、コード実行して、通信裏で何をやってるか見てます。
最近は、インターネットからデータを取得することが多いから、FW など穴あけを最小限にするのも目的。

本当は、コンテナでやればいいんだろうけど、NW 設定とか良く分からず逃げてます（笑

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/184724/96ef5aab-aa63-a026-4521-2805207f1cba.jpeg)

半月で、1万8千円ぐらいですねぇ。
最近、変える前にアップデートかける日が続いている。
普段、夜は使わないため、インスタンス費用は2/3 （2万4000円/月）にできそう。
Amazon Translateが日本語対応したので使ってみた

Amazon Translateが日本語対応をしたとJeffが言っているのに気づいたので、以前作成したチャットを日本語に対応させてみました。


![スクリーンショット 2018-07-18 8.50.09.png](https://qiita-image-store.s3.amazonaws.com/0/102769/de45f165-2f51-7722-5288-3ef7ff56b8aa.png)

以前の成果物
[Amazon Translateを使ってみた＆自動翻訳付きチャットを作ってみた](https://qiita.com/kojiisd/items/e90b877123b494a419fe)


# いったんWebで遊んでみる
いい感じにTranslateされるようです。

![スクリーンショット 2018-07-18 9.00.19.png](https://qiita-image-store.s3.amazonaws.com/0/102769/14468101-fde9-f0c9-c188-c1678ea579c2.png)


# 以前の成果物を日本語対応させる
とはいえ```ja```というコードを加えるだけなので、とても簡単な修正のみです。

```html
                <tr>
                    <td><label>Source Language: </label></td>
                    <td>
                        <select name="srcLang">
                            <option value="en" selected>English</option>
                            <option value="zh">Chinese (Simplified)</option>
                            <option value="fr">French</option>
                            <option value="de">German</option>
                            <option value="pt">Portuguese</option>
                            <option value="es">Spanish</option>
                            <option value="ja">Japanese</option>  /* 追加箇所 */
                        </select>
                    </td>
                </tr>
                <tr>
                    <td><label>Target Language: </label></td>
                    <td>
                        <select name="targetLang">
                            <option value="en" selected>English</option>
                            <option value="zh">Chinese (Simplified)</option>
                            <option value="fr">French</option>
                            <option value="de">German</option>
                            <option value="pt">Portuguese</option>
                            <option value="es">Spanish</option>
                            <option value="ja">Japanese</option>  /* 追加箇所 */
                        </select>
                    </td>
                </tr>
```

さて、動かしてみます。

# 短文は大丈夫だが、ある程度の文になると自然な翻訳ではない？
以前は日本語が選択できなかったため、単純な短文しか翻訳していませんでしたが、ある程度長い文や少し複雑な構造にするとやはり自然な翻訳にはなりませんでした。

とはいえ、まだまだサービスは開始したばかりですし、ルールベースの翻訳ではない為、使えば使うほど賢くなって行くのでしょうから、今後に期待、というところでしょうか。

![スクリーンショット 2018-07-19 8.57.09.png](https://qiita-image-store.s3.amazonaws.com/0/102769/0c9b2a82-7a8a-fcef-407e-82128ac9dfe0.png)
Pythonで世界地図(mpl_toolkits.basemap ドキュメント リンク)

#ドキュメント

###検索ページ
https://matplotlib.org/basemap/search.html

###mpl_toolkits.basemap
英語
https://matplotlib.org/basemap/api/basemap_api.html#module-mpl_toolkits.basemap
日本語（Google翻訳）
https://translate.google.com/translate?hl=ja&sl=en&u=https://matplotlib.org/basemap/api/basemap_api.html&prev=search

英語
###Index(A , B , C ・・・)
https://matplotlib.org/basemap/genindex.html

A
addcyclic() (in module mpl_toolkits.basemap)
arcgisimage() (mpl_toolkits.basemap.Basemap method)
B
barbs() (mpl_toolkits.basemap.Basemap method)
Basemap (class in mpl_toolkits.basemap)
bluemarble() (mpl_toolkits.basemap.Basemap method)
C
colorbar() (mpl_toolkits.basemap.Basemap method)
contour() (mpl_toolkits.basemap.Basemap method)
contourf() (mpl_toolkits.basemap.Basemap method)
D
drawcoastlines() (mpl_toolkits.basemap.Basemap method)
drawcounties() (mpl_toolkits.basemap.Basemap method)
drawcountries() (mpl_toolkits.basemap.Basemap method)
drawgreatcircle() (mpl_toolkits.basemap.Basemap method)
drawlsmask() (mpl_toolkits.basemap.Basemap method)
drawmapboundary() (mpl_toolkits.basemap.Basemap method)
drawmapscale() (mpl_toolkits.basemap.Basemap method)
drawmeridians() (mpl_toolkits.basemap.Basemap method)
drawparallels() (mpl_toolkits.basemap.Basemap method)
drawrivers() (mpl_toolkits.basemap.Basemap method)
drawstates() (mpl_toolkits.basemap.Basemap method)
E
etopo() (mpl_toolkits.basemap.Basemap method)
F
fillcontinents() (mpl_toolkits.basemap.Basemap method)
G
gcpoints() (mpl_toolkits.basemap.Basemap method)
H
hexbin() (mpl_toolkits.basemap.Basemap method)
I
imshow() (mpl_toolkits.basemap.Basemap method)
interp() (in module mpl_toolkits.basemap)
is_land() (mpl_toolkits.basemap.Basemap method)
M
makegrid() (mpl_toolkits.basemap.Basemap method)
maskoceans() (in module mpl_toolkits.basemap)
mpl_toolkits.basemap (module)
N
nightshade() (mpl_toolkits.basemap.Basemap method)
P
pcolor() (mpl_toolkits.basemap.Basemap method)
pcolormesh() (mpl_toolkits.basemap.Basemap method)
plot() (mpl_toolkits.basemap.Basemap method)
Q
quiver() (mpl_toolkits.basemap.Basemap method)
R
readshapefile() (mpl_toolkits.basemap.Basemap method)
rotate_vector() (mpl_toolkits.basemap.Basemap method)
S
scatter() (mpl_toolkits.basemap.Basemap method)
set_axes_limits() (mpl_toolkits.basemap.Basemap method)
shadedrelief() (mpl_toolkits.basemap.Basemap method)
shiftdata() (mpl_toolkits.basemap.Basemap method)
shiftgrid() (in module mpl_toolkits.basemap)
streamplot() (mpl_toolkits.basemap.Basemap method)
T
tissot() (mpl_toolkits.basemap.Basemap method)
transform_scalar() (mpl_toolkits.basemap.Basemap method)
transform_vector() (mpl_toolkits.basemap.Basemap method)
W
warpimage() (mpl_toolkits.basemap.Basemap method)
wmsimage() (mpl_toolkits.basemap.Basemap method)
【React Nativeメモ】ESLintの設定

Linterはリアルタイムな構文解析を実行するためのツール．構文解析をインストールすることで，構文及び，コーディングスタイルの誤りをリアルタイムに修正することができ開発効率の改善及びチーム内でコードの統一性がはかれる．

Linter自体は容れ物なので，言語に応じたプラグインをインストールする必要．今回はReact Native (Javascript)を利用するので，[ESLint](https://eslint.org/)をプラグインとしてインストールする

# 目次

- 1. AtomにlinterとESLintをインストール
- 2. `eslint-config-airbnb`のパッケージをインストール
- 3. ルールの有効化
- 4. 動作確認

# 1. AtomにlinterとESLintをインストール

- Atomインストール後に，`Atom -> Preferences -> Install`を選択
- 検索ボックスに`linter`と入力すると`linter`が検索結果に表示されるのでインストールする．
- 検索ボックスに`linter-eslint`と入力すると`linter-eslint`が検索結果に表示されるのでインストールする．

# 2. eslint-config-airbnbのパッケージをインストール

有名所の[eslint-config-airbnb](https://github.com/airbnb/javascript)を導入する．eslint-config-airbnbはAirbnbが公開しているESLintのルールセットです．どのようなルールかは[eslint-config-airbnb](https://github.com/airbnb/javascript)を見ていただければ確認ができる．

下記のコマンドは複雑ですが，eslint-config-airbnbが依存するパッケージ含めてすべてインストールすることができる．

```
$ (
  export PKG=eslint-config-airbnb;
  npm info "$PKG@latest" peerDependencies --json | command sed 's/[\{\},]//g ; s/: /@/g' | xargs npm install --save-dev "$PKG@latest"
)
```

何をしているか補足すると，下記のコマンドで依存しているパッケージがわかり，これら依存パッケージを上記コマンドであわせてインストールする．

```
$ npm info "eslint-config-airbnb@latest" peerDependencies
{ eslint: '^4.19.1',
  'eslint-plugin-import': '^2.12.0',
  'eslint-plugin-jsx-a11y': '^6.0.3',
  'eslint-plugin-react': '^7.9.1' }
```

# 3. ルールの有効化

`eslint-config-airbnb`を有効化するために，`.eslintrc`を作成し，airbnbのルールを使うことを宣言する．

```bash
$ vi .eslintrc
```

```bash
{
  "extends": [ "airbnb" ]
}
```

# 4. 動作確認

";"を削除してみるとエラーが出ることが確認でき，正しく動作していることがわかる．

![image01.png](https://qiita-image-store.s3.amazonaws.com/0/262328/0a24944d-1fce-7c5a-793a-b8744988fe2e.png)

ちなみにどのようなルールが適応されているかクリックして確認ができる．上の例だと，ポップアップをクリックするとルールの内容が記載された下記の[サイト](https://eslint.org/docs/rules/semi)が表示される．
z88dk zcc バグと回避


`zcc - Frontend for the z88dk Cross-C Compiler - v12228-3adc863-20180704`

- 症状

for文でbreakを使うと挙動がおかしくなる。

```test.c
/*
z88dk / WebMSX
zcc +msx -lndos -create-app -bntest test.c
*/

#include <stdio.h>

void main()
{
	for (int i = 0; i < 10; i++) {
		if (i >= 5) break;
		printf("%d\n", i);
	}
}
```

- 回避策

変数宣言をfor文の外に出す。

```test.c
/*
z88dk / WebMSX
zcc +msx -lndos -create-app -bntest test.c
*/

#include <stdio.h>

void main()
{
	int i;
	for (i = 0; i < 10; i++) {
		if (i >= 5) break;
		printf("%d\n", i);
	}
}
```

- 症状

floatの比較がおかしい。

- 回避策

条件をいろいろ変えてみる。

```test.c
/*
z88dk / WebMSX
zcc +msx -lndos -lm -create-app -bntest test.c

PC6001V / cload, run
zcc +pc6001 -lm -create-app -subtype=32k -bntest test.c
*/

#include <stdio.h>

void main()
{
	float f = 0;

	if (4 < f) {
		printf("true\n");
	} else {
		printf("false\n");
	}

	if (f > 4) {
		printf("true\n");
	} else {
		printf("false\n");
	}
}
```

![WMSX Screen (2).png](https://qiita-image-store.s3.amazonaws.com/0/257554/67acbf07-8ab4-6840-2b14-dd4ebbf6a89e.png)

![新しいビットマップ イメージ.png](https://qiita-image-store.s3.amazonaws.com/0/257554/b800de9c-5419-83da-5471-29796ebe9793.png)
Delphi Community Edition と Professional Edition の違いについて

# Delphi Community Edition と Professional Edition の違いについて

Delphi Community Edition の出現に全俺が泣いている状況です.

[Delphi: 製品エディション - エンバカデロ・テクノロジーズ](https://www.embarcadero.com/jp/products/delphi/product-editions)を見ると

> VCL / FireMonkeyコンポーネントのフルセット 制限あり
> ライブラリのソースコード Limited

と Community Edition と Professional Edition には違いがあるようです.

[ソフトウェア使用許諾およびサポート契約書 - RAD Studio 10.2, Delphi 10.2, C++Builder 10.2 - エンバカデロ・テクノロジーズ](https://www.embarcadero.com/jp/products/rad-studio/rad-studio-eula) を見ると

> （ii） お客様は、Community Edition に同梱される、VCL、FireMonkey、その他のソースコードのみを読むことができます。

とあるので、Limited はライブラリのソースコードの改造ができないって意味なのかなあ? (ちょっと自信無し)

また、これは違いではありませんが

> Community Edition ライセンスの期間は、ライセンサの製品の最初のダウンロードまたは開封から1年間であり（「Community Edition の期間」）、Community Edition の期間の終了時に自動的に期限が切れます - Community Edition のライセンスは自動更新されません。Community Edition の期間の満了または終了後に、Community Edition の継続使用を望む場合には、Community Edition の最新バージョンを再インストールし、その時点で有効な本契約の条件に同意する必要があります。

とあるので、エンバカデロ社が将来に残念なことに Community Edition の提供を取りやめることになった場合、そこから1年以内に Community Edition が使用できなくなります. 自動更新されないので、最新版を再インストールしろというのも微妙にめんどくさい仕様ですが、そこはまあ「タダで使わせてくれてありがとう」と甘受するしかないですね.

Delphi 開発者が増えますように!!(祈り)
Laravel 5.5にBackpackを導入時の注意点

以下のURLの手順3-2でつまづいたので、メモ
https://laravel-backpack.readme.io/v3.0/docs/install-on-laravel-55

```
2) Run these command in this exact order:
mkdir public/uploads #create a public/uploads directory
php artisan elfinder:publish #published elfinder assets
php artisan vendor:publish --provider="Backpack\CRUD\CrudServiceProvider" --tag="public" #publish CRUD assets
php artisan vendor:publish --provider="Backpack\CRUD\CrudServiceProvider" --tag="lang" #publish CRUD lang files 
php artisan vendor:publish --provider="Backpack\CRUD\CrudServiceProvider" --tag="config" #publish CRUD and custom elfinder config files
php artisan vendor:publish --provider="Backpack\CRUD\CrudServiceProvider" --tag="elfinder" #publish custom elFinder views
```


この手順で、php artisan elfinder:publishを実行時にエラーが発生。
調べたところ、下記のコマンドをたたく必要があったと分かった。

```
composer require barryvdh/laravel-elfinder
```

参照元：https://github.com/barryvdh/laravel-elfinder
Electron小技集

こんにちわ。

Electronアプリを作る際、Google先生に聞いても中々教えてくれなかったけど少し考えたら簡単だった...
という初歩的だけど痒い所に手が届かなかったコード例を、備忘録も兼ねていくつかご紹介します。

# ウィンドウ多重展開防止
```javascript:Renderer
myButton.onclick = ()=> ipcRenderer.send("window-open");
```
```javascript:Main
ipcMain.on("window-open", ()=>{
    myWindow = new electron.BrowserWindow({
        width: 1920,
        height: 1080
    });
    myWindow.loadURL("Window2.html");
});
```
新しくウィンドウを展開する際は、多分こんな感じのコードになると思います。
しかしこれだと、ボタンが押されて`window-open`メッセージが来る度に新規ウィンドウを開いてしまいます。
そこで。

```javascript:Main
// 新規ウィンドウのインスタンス用変数をグローバルに作っておく
let myWindow;

ipcMain.on("window-open", ()=>{
    // インスタンスが作成されていなかったら作成する
    if(!myWindow){
        myWindow = new electron.BrowserWindow({
            width: 192,
            height: 108
        });
        myWindow.loadURL("Window2.html");

        // ウィンドウを閉じたらインスタンス破棄
        myWindow.once("close", ()=>{
            myWindow = null;
        });
    }
    // インスタンスが作成されていたら、そのウィンドウを最前面に持ってくる
    else{
        myWindow.focus();
    }
});
```
インラインコメントで粗方説明してしまいましたが、このようにすれば、ウィンドウの多重展開を防ぐ事が出来ます。


# イベントリスナ乱立対策
```javascript:Renderer
myButton.onclick = ()=>{
    // "window-open"に送信したら"window-status"で応答が返る
    ipcRenderer.send("window-open");
    ipcRenderer.on("window-status", (event, status)=>{
        // hogehoge
    });
};
```
ボタンが押されたら`window-status`が登録されるコードですが、この例だと押された分だけ同じ物が多重登録されてしまい、そのうちメモリリークを起こしてしまいます。

イベントリスナは、登録する期間と発動回数を意識するようにし、適宜破棄する事が重要です。
自分で開けたドアは自分で閉めましょう、と言う事です。

具体的には2つ、解決方法があります。

## .once()
`.once()`とは、1度だけ発動した後、自動的に破棄されるイベントリスナの事です。
`.on("event");`は、殆どの場合`.once("event");`に置換出来ます。

```javascript:Renderer
myButton.onclick = ()=>{
    // "window-open"に送信したら"window-status"で応答が返る
    ipcRenderer.send("window-open");
    ipcRenderer.once("window-status", (event, status)=>{
        // hogehoge
    });
};
```
このようにすれば、ボタンが何回押されても1回発動したら破棄されるので、メモリリークは起きません。
(`window-status`メッセージが来る前に高速連打したら話は別ですが...)

他にも分かりやすい活用例は、最初のウィンドウを起動させる際に良く使う`app.on("ready")`です。
これは起動時しか使いませんよね。
ですがイベントリスナとしては、アプリケーションが終了するまで残存し続けます。
そこで`app.once("ready")`に置き換える事で、アプリケーション起動時に発動したらすぐ破棄され、イベントリスナ数の節約になります。

## .removeAllListeners()
`.removeAllListeners()`とは、登録済のイベントリスナを破棄するメソッドです。

2回以上発動するイベントで、多重登録や残存を避けたい場合に使います。

```javascript:Main
// 文字列を受け取る
ipcMain.on("input-text-check", (event, text)=>{
    // 正しかったら"input-text-check"を破棄しウィンドウを表示
    if(text == "hoge"){
        ipcMain.removeAllListeners("input-text-check");

        myWindow = new electron.BrowserWindow({
            width: 1920,
            height: 1080
        });
        myWindow.loadURL("Window2.html");
    }
    // 違っていたら再入力待機
    else{
        event.sender.send("input-text-status", false);
    }
});
```
`input-text-check`は、入力が1発で正しかったら1回しか発動せず、以後も必要ありませんが、間違っていたら再びリッスンしなければなりません。

このように、発動回数が不確定で条件を満たしたら必要無くなる、と言ったケースに有効です。

# おわりに
毎度の事ですが、もっと良いやり方があったらゆるぼ、と言う事でよろしくお願いします。
おわり。
Algorithms

<h2>What is an algorithm</h2>
<p>An algorithm is simply as set of steps or actions to accomplish a specified task</p>

<ol>Main tools used to analyse and build an algorithm:
<li>understanding difference between Binary search and Linear search (Binary Search: a way to efficiently search an array of items by halving the search space each time).</li>
 <li>Asymptotic notation: how to use asymptotic analysis to describe the efficiency of an algorithm, and how to use asymptotic notation (Big O, Big-Theta, and Big-Omega) to more precisely describe the efficiency.</li>
</ol>
<h2>How to make your code more efficient and faster to execute</h2>
<p>In Algorithms there is a way to know approximately how long a code could take so how it is really efficient as a code by using asymptotic notation (Big O, Big-Theta, and Big-Omega)</p>
<p>For that purpose there are many different Algorithms to resolve the same problem, the only problem is to how to choose the best algorithm that can be used to resolve it</p>
<ul>let is take example of sorting arrays by order, these are the most common used algorithms:
<li><strong><em>Selection Sort : </em></strong>not an efficient way </li>
<li><strong><em>Insertion Sort : </em></strong>not a very efficient way </li>
<li><strong><em>(Recursive Algorithms): Merge Sort : </em></strong>a very efficient way relying on the power of recursion</li>
<li><strong><em>(Recursive Algorithms): Merge Sort : </em></strong>a strong efficient way </li>
</ul>
<p>By using recursion the <strong>Average-case running time</strong> decrease considerably from Θ(n^2) (for Selection and Insertion Sort) to Θ(nlgn)</p>
<p>As you can remark that using recursion make the algorithms more efficient and faster as it relies on very smart concept <strong>(Divide and Conquer) </strong>which is :
<ol>
<li><strong><em>Divide : </em></strong>divide the main problem to smaller subproblems</li>
<li><strong><em>Conquer : </em></strong>use the recursive logic by finding the base cases</li>
<li><strong><em>Combine : </em></strong>as final step combining the solution of all subproblems and merge it for the solution of the original problem</li>
</ol>
<p>Knowing these details can impact considerably to enhance your way to resolve problems and code more efficient algorithms to resolve the problems that you may encounter in future</p>
main source used for this article : <a href="https://www.khanacademy.org/computing/computer-science/algorithms" target="_blank">KHAN Academy-Algorithms</a>.
Rubyにおける変数の考え方

Rubyの変数に対する考え方を学んだので少しだけ書いてみる

#Rubyにおける変数の考え方と他言語の変数の考え方の違い

プログラミング言語を学ぶ時、変数の概念が出てきたら「変数とはデータを入れておく箱のようなもの」と書いてる。

でもRubyは変数という箱にデータを入れておくのではなく、データにラベル(名札)をつけておき管理するという考え方をするらしい。

Matzさんが言うには「矢印モデル」と呼んでるらしいです。

対してデータを箱に入れておくような考え方を「箱モデル」と言う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245415/b706d57b-d30b-ba5a-a34f-367a4ad62f28.png)

#箱モデルと矢印モデルの違いで起きる変化


```test.rb
str1 = "hoge" 
str2 = str1
```

"hoge"というデータを、str1という変数でラベル付けした時、そのまま変数str1をstr2という変数に利用したら、"hoge"というデータに２つの名札が付いてると考えるそうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245415/ccd78e24-0eb2-de3f-a830-307de15d308a.png)

対して箱モデルは、"hoge"というデータがあった場合、str1変数に"hoge"を格納し、変数str1を変数str2に利用すると、変数str2は変数str1の値をコピーして箱に格納してるそうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245415/3aef9471-62c8-1611-2b64-abeffc216b3e.png)

#終わり
トンチンカンな事言ってるかもしれません
もっとRuby練習していきます！
JavaScript のオブジェクトリテラルで重複した要素を一つにまとめてリストを作る

# 目的

オブジェクトリテラルのあるキーが重複している場合、重複した要素を除外してリストを作りたいと考えました。
それも for loop なしで。

## 例

対象のリスト


|someKey|value1|
|---|---|
|1  |...|
|2  |...|
|3  |...|
|3  |...|
|2  |...|
|2  |...|
|5  |...|


変更後

|someKey|value1|
|---|---|
|1  |...|
|2  |...|
|3  |...|
|5  |...|

# 実装

findIndex と filter で実現できました！

```.js
var list = [{someKey:1},{someKey:2},{someKey:3},{someKey:3},{someKey:2},{someKey:2},{someKey:5}];

list.filter((element, index, array) => index === array.findIndex((current) => current.someKey === element.someKey))
```

```text:結果
[ { someKey: 1 }, { someKey: 2 }, { someKey: 3 }, { someKey: 5 } ]
```
CircleCI で複数の実行環境で同じジョブを実行する

目標
====

例えば、 TravisCI でできるような、こういう感じのテストを設定したいのです。

```yaml:.travis.yml
language: python
python:
  - "2.7"
  - "3.6"

script:
  - make check
```

Python 2.7, 3.6 に対して同じテストを実行し、全部通ったら OK としたいです。



ベタなやり方
==========

コマンドを２箇所に書きます。

```yaml:.circleci/config.yml
---
version: 2
workflows:
  version: 2
  test:
    jobs:
      - test-2.7
      - test-3.6

jobs:
  test-2.7:
    docker:
      - image: circleci/python:2.7
    steps:
      - checkout
      - run:
          name: Run tests
          command: make check
  test-3.6:
    docker:
      - image: circleci/python:3.6
    steps:
      - checkout
      - run:
          name: Run tests
          command: make check
```

この書き方は明らかに冗長です。 `steps` の記述が重複していてあとでつらくなりそうです。


コマンド記述部をまとめる
====================

YAML の [Anchor](http://yaml.org/spec/1.2/spec.html#id2785586) と Alias をこの目的に使うことができます。

- Anchor のついたデータを、 Alias から参照することができます
- 同レベルにマッピングを追加することで、参照したマッピングにその場で（参照元を書き換えたりはせずに）値を追加・上書きできます

```yaml:.circleci/config.yml
---
version: 2
workflows:
  version: 2
  test:
    jobs:
      - test-2.7
      - test-3.6

_test-body: &test-body
  steps:
    - checkout
    - run:
        name: Run tests
        command: make check

jobs:
  test-2.7:
    <<: *test-body
    docker:
      - image: circleci/python:2.7
  test-3.6:
    <<: *test-body
    docker:
      - image: circleci/python:3.6
```


参考
====

- https://qiita.com/terrierscript/items/3568690b5da29ab034dc
- https://github.com/adambrenecki/virtualfish/blob/aa3d6271bcb86ad27b6d24f96b5bd386d176f588/.circleci/config.yml
- https://gist.github.com/bowsersenior/979804
AE ベーシックスライドショープログラム　ベータ版

#超ベーシックなスライドショー

ＣＳＶでデータを作ったら、それを読み込むだけでスライドショーが作れるプログラムです。
複雑なアニメーションはのちのち考えるとして、とりあえずメインの動きは完成しました。
とりあえず動画にしてあるので興味のある方はご覧ください。

https://youtu.be/TxLPsMEh46A
JavaScript のオブジェクトリテラルで重複した要素を全て削除してリストを作る

# 目的

オブジェクトリテラルのあるキーが重複している場合、重複した要素を除外してリストを作りたいと考えました。
それも for loop なしで。

## 例

対象のリスト


|someKey|value1|
|---|---|
|1  |...|
|2  |...|
|3  |...|
|3  |...|
|2  |...|
|2  |...|
|5  |...|


変更後

|someKey|value1|
|---|---|
|1  |...|
|5  |...|

# 実装

every と filter で実現できました！

```.js
var list = [{someKey:1},{someKey:2},{someKey:3},{someKey:3},{someKey:2},{someKey:2},{someKey:5}];

list.filter((element, index, array) => array.every((current, someIndex) => !(index !== someIndex && current.someKey === element.someKey)))
```

```text:結果
[ { someKey: 1 }, { someKey: 5 } ]
```