OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShell（ワンライナー）で日付＆曜日の混合名の写真格納フォルダを31日分作成

# 問題と課題
・デジカメとスマホの写真をパソコンに日付別フォルダに分けて移したい。その為にフォルダを沢山作成してきたがタイヘン。そこで、PowerShellで一括で作成してみた。

# PowerShellのcode
```PowerShell
foreach($i in 1..31){new-item ("2019_10_"+([string]$i).PadLeft(2,"0")+""+(Get-Date "2019/10/$i").ToString("ddd")+"_") -itemtype directory}
```
## 補足メモ
### 新規フォルダを一つ作成
```PowerShell
new-item フォルダ名 -itemtype directory
```

### 31日分繰り返し
```PowerShell
foreach($i in 1..31){繰り返す対象。$iは数値で使用可}
```

### 1～9日の１桁日の桁数を２桁にしたい。２桁はそのまま
```PowerShell
([string]$i).PadLeft(2,"0")
```
### 漢字の曜日「月火水木金土日」を日付から入手したい
```PowerShell
(Get-Date "2019/10/$i").ToString("ddd")
```
### その他
要素は、括弧```()```で囲まないとダメらしい。

# 結果：Output
```vb
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2019/10/24      1:03                2019_10_01火_
d-----       2019/10/24      1:03                2019_10_02水_
d-----       2019/10/24      1:03                2019_10_03木_
d-----       2019/10/24      1:03                2019_10_04金_
d-----       2019/10/24      1:03                2019_10_05土_
d-----       2019/10/24      1:03                2019_10_06日_
d-----       2019/10/24      1:03                2019_10_07月_
d-----       2019/10/24      1:03                2019_10_08火_
d-----       2019/10/24      1:03                2019_10_09水_
d-----       2019/10/24      1:03                2019_10_10木_
d-----       2019/10/24      1:03                2019_10_11金_
d-----       2019/10/24      1:03                2019_10_12土_
d-----       2019/10/24      1:03                2019_10_13日_
d-----       2019/10/24      1:03                2019_10_14月_
d-----       2019/10/24      1:03                2019_10_15火_
d-----       2019/10/24      1:03                2019_10_16水_
d-----       2019/10/24      1:03                2019_10_17木_
d-----       2019/10/24      1:03                2019_10_18金_
d-----       2019/10/24      1:03                2019_10_19土_
d-----       2019/10/24      1:03                2019_10_20日_
d-----       2019/10/24      1:03                2019_10_21月_
d-----       2019/10/24      1:03                2019_10_22火_
d-----       2019/10/24      1:03                2019_10_23水_
d-----       2019/10/24      1:03                2019_10_24木_
d-----       2019/10/24      1:03                2019_10_25金_
d-----       2019/10/24      1:03                2019_10_26土_
d-----       2019/10/24      1:03                2019_10_27日_
d-----       2019/10/24      1:03                2019_10_28月_
d-----       2019/10/24      1:03                2019_10_29火_
d-----       2019/10/24      1:03                2019_10_30水_
d-----       2019/10/24      1:03                2019_10_31木_
```
Node-REDからpython-broadlinkでRM mini3をコントロール【失敗】[on Onion Omega2+]

[python-broadlinkでRM mini3をコントロール[on Onion Omega2+]](https://qiita.com/spiderx_jp/items/8f04019c83fabdc336d4)でやっとpython-broadlinkを使って赤外線リモコンをRM mini3経由で制御できるようになりました。
次は、Node-Redに接続して音声でシーリングライトをOn/Offをと頑張ってましたが、Node.jsで躓いてしまいました。（他の手段を模索中・・・）
**以下、エラー現象と調査内容を記録として残しておきます。**

#0.前提条件
- Node-RED version: v0.18.4
- Node.js  version: v4.3.1
- Linux 4.4.46 mipsel LE
- Onion Omega2+
- Alexa-skill設定済み

#1.Node-REDのフロー設定
フローを設定するにあたり、まずは、シェルコマンドを作成しました。

```shell:python-broadlink.sh
#!/bin/ash
cd /root/python-broadlink/cli
./broadlink_cli --device @ROOM.device --send @$1
```

第一引数で渡すのは、broadlink_cli コマンドで学習した赤外線リモコンコードファイルになります。

|ファイル名|コード内容|
|:--|:--|
|LivingLightOn|リビングライトをOnする赤外線リモコンコード|
|LivingLightOff|リビングライトをOffする赤外線リモコンコード|

上記シェルコマンドを**exec**ノードで実行できるように以下のようなフローを作成しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100712/d547a8b7-9f84-2429-f7ba-2c822a696ea4.png)


**switch**ノードは、以下のように*true*と*false*を設定しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/100712/436478b3-6631-bb5a-1108-8fae8c7fc4c3.png)

そして、**exec**ノードは、python-broadlink.shの引数を変えたものを2つ用意しました。

|switch|python-broadlink.shの引数|機能|
|:--|:--|:--|
|true|LivingLightOn|リビングライトをOnする|
|false|LivingLightOff|リビングライトをOffする|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/100712/83b569a7-3136-ee4e-4d10-3c2333bea3fd.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100712/9d095c30-a72d-449f-81e0-ba195bb084e9.png)

以上で、「アレクサ、リビングライトをつけて」でリビングライトが点灯、「アレクサ、リビングライトを消して」で消灯されるハズです。
・・・が、エラーが発生して、Node-REDがフリーズしてしまいました。

#2.エラー内容
Node-REDのログでは、以下のログが出力されていました。
どうも、シェルコマンドを実行した際に例外が発生しているようです。

```
29 Sep 06:56:38 - [info] [debug:a60137fd.c462a8] false
29 Sep 06:56:48 - [red] Uncaught Exception:
29 Sep 06:56:48 - TypeError: binary is not a function
    at Function.from (native)
    at Function.from (native)
    at /usr/bin/onion-node-red/node_modules/node-red/nodes/core/core/75-exec.js:135:46
    at ChildProcess.exithandler (child_process.js:220:5)
    at emitTwo (events.js:87:13)
    at ChildProcess.emit (events.js:172:7)
    at maybeClose (internal/child_process.js:821:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:211:5)
```

#3.調査
Googleでいろいろと調べてみましたが、どうも**Node.jsのバージョンを新しくするしかない**ようです・・（たぶん？）

- https://github.com/sindresorhus/alfred-emoj/issues/9
- https://github.com/SheetJS/js-xlsx/issues/1150

現在、Onion Omega2でサポートされているNode.jsのバージョンは、**v4.3.1**です。
自力でバージョンアップをするには、Node.jsのコードをダウンロードして、自力でクロスコンパイルするしかなさそうです（実際、トライしましたがコンパイルエラーで断念しました）。

以上、解決には至りませんでした。
現在、他の方法を模索中です。
AndroidのToolbarにちゃんと戻れる「戻る」ボタンを追加する

よく見るのが、以下を追加すれば戻るボタンが表示されるというもの

```kotlin:MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_check)
    setSupportActionBar(toolbar_check)
    supportActionBar?.let {
        it.setDisplayHomeAsUpEnabled(true)
        it.setHomeButtonEnabled(true)
    } ?: IllegalAccessException("Toolbar cannot be null")
}
```

ウキウキして実行すると、ボタンは表示されるが戻らない

まじかよ・・・

ちゃんと戻るには上記のコードに加えて、「戻る」実装をしてあげないといけない
~~(多分)ナウい実装は以下の通り~~
全然そんなことはなかった(@kofuk さん教えて頂きありがとうございます)

ただ戻るだけなら、`AndroidManifest.xml`で
`android:parentActivity`を設定してやればいいです

```xml:AndroidManifest.xml
<activity
    android:name=".SecondActivity"
    android:parentActivityName=".FirstActivity" />
```

もし、戻るボタンが押された時に保存なり何なりしたい場合は
以下のコードで処理を挟んでやればいいかなと思います

```kotlin:MainAvtivity
override fun onBackPressed() {
    // Do something
    super.onBackPressed()
}

override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}
```

これで無事前のActivityに戻れる
DirectX Raytracing(DXR)について調べてみた

#DirectX Raytracing とは

DirectXにレイトレーシングを取り入れるAPIセット。以下の動画に見るように、クソリアルなレンダリングがリアルタイムで可能になる。現在、BattleField V や Shadow of Tomb Raider でサポートされるだろうとNvidiaはアナウンス。
[![Picture 2018-10-08 04_50_03.png](https://qiita-image-store.s3.amazonaws.com/0/299280/af9ebe0c-3aaa-b466-8e6e-31514a01847c.png)](https://www.youtube.com/watch?time_continue=1&v=rpUm0N4Hsd8)
詳細はこちら
「[Windows 10がついに「DirectX Raytracing」（DXR）をサポート――本日公開のOctober 2018 Update](https://www.4gamer.net/games/276/G027669/20181003008/)

#要件
##OSは「Windows10 October 2018 Update」以降
　DirectX Raytracing(DXR)がWindows10 October 2018 Updateで使えるようになったらしい。しかしこのUpdate、MyDocumentの一部のファイルを消すことがあるらしい事が報告され、Updateの公開は一旦中止された。手動インストールも Aplil 版に差し戻されたとの事。ちなみに私のWindows10は、Oct 2018に更新済みだが、MyDocuments のファイルも紛失してはいない。早々に、対処されたUpdateが公開されることを望む。

参考：
[Windows 10 October Updateにファイル消失問題で提供中断](https://pc.watch.impress.co.jp/docs/news/1146713.html)

##グラボは「Geforce RTX20系」以降でないとだめ？
　公式アナウンスでは、DXRは「Geforce RTX20」のGPUでハードウェアサポートされるとの事。RTXつったら、[Geforce RTX 2070/2080](https://www.nvidia.com/ja-jp/geforce/20-series/) とかハイエンドのグラボ。発売日は10月17日からで、現時点ではまだ発売されていない。

　ちなみに自分の環境（Geforce GTX760)で動くのか試してみた。早速DXRのサンプルをダウンロードしてVisualStudio2017 でビルドすると、エラーが出た。どうやら Shader6.0 が必要みたい。Shader6.0は、NVIDIAのMaxwel第２世代以降、「Geforce 900シリーズ」以降となる。つまり「GTX760であるワイのPCじゃDXRは動かない」って事やん。

　[すらりん日記](http://blog.techlab-xe.net/archives/5757)さんで  Geforce GTX1060Ti でDXRのサンプルを動かしてらっしゃるので、グラボがRTX系でなくても、動作する模様。

#おわりに
まだサンプルコードを見ていない。どういう流れで実装されてるのか興味がある。また面倒な初期設定が増えなければいいんだけど、それは無理な話かな。
Githubで最もスター数が多いリポジトリを検索してみました

![github_trend_stars.png](https://qiita-image-store.s3.amazonaws.com/0/69351/4dffcecd-8458-80fd-27fa-be8912b95f87.png)

私が作成したサイト[Github Repositories Trend](https://github.oldjpg.com/?sort=stargazers_count&duration=0)で全てのスター数で並び替え、期間は全てで表示します

2018/10/07現在
1. FreeCodeCamp 294,321
2. bootstrap 127,830
3. vue 115,717
4. react 112,606
5. free-programming-books 111,958
6. tensorflow 111,459
7. awesome 93,645
8. You-Dont-Know-JS 89,510
9. d3 79,239
10. oh-my-zsh 77,301
Azure SQL接続用プロキシ

個人メモ。
Azure SQLを利用する場合、オンプレミスの端末からのアクセスにはExpress Routeも必要となる。
Express Routeはケチりたかったため、Azure SQLにアクセスできるAzure上のCentOSの仮想マシンにNginxをインストールして、オンプレミスの端末から踏み台にさせて接続できるようにする。

#Nginx
__・インストール__

```
[user@centos7 ~]$ sudo yum -y install gcc openssl-devel pcre-devel
[user@centos7 ~]$ cd /tmp
[user@centos7 tmp]$ wget http://nginx.org/download/nginx-1.12.2.tar.gz
[user@centos7 tmp]$ tar xvfz nginx-1.12.2.tar.gz
[user@centos7 tmp]$ cd nginx-1.12.2
[user@centos7 nginx-1.12.2]$ sudo ./configure --prefix=/opt/nginx --with-stream
[user@centos7 nginx-1.12.2]$ sudo make
[user@centos7 nginx-1.12.2]$ sudo make install
```

__・設定__

``` nginx.conf
stream {
    server {
        listen 1433;
        proxy_pass sqlsv-hogefuga-001.database.windows.net:1433;
    }
}
```

#オンプレミスからの接続
接続先：CentOSのIPアドレス
ユーザー名：*Azure SQLユーザー名*@`sqlsv-hogefuga-001`
#注意
NSGの設定をそれなりにしている場合は、Azure SQLへのTCP 1433の通信が設定されているかなど確認をしておくこと
Githubの最近作成された人気リポジトリと類似リポジトリを表示するサイトを作成しました

![business-1989126_1920.jpg](https://qiita-image-store.s3.amazonaws.com/0/69351/0e274c73-54aa-0a7b-4be4-5bc74e35e6c5.jpeg)

自分は頻繁にGithub公式のトレンドリポジトリを見ています。そこには自分が既に知っている、数年前に作成されたbootstrapやreactやvueやtensorflowなどのリポジトリも表示されています。しかし自分は最近作成されたリポジトリで、かつ人気のリポジトリだけが見たいのです。さらにそのリポジトリと良く似たリポジトリも知りたいのです。なのでサイトを作成しました。以下のリンクからどうぞ

###[Github Repositories Trend](https://github.oldjpg.com/)

![github_trend_filter.png](https://qiita-image-store.s3.amazonaws.com/0/69351/794c96a6-d23b-9402-e330-2542783fd567.png)

上の画像では、すべてのプログラミング言語で、かつ1ヵ月以内に作成されたリポジトリで、かつ一日ごとのスター数が多い順で並べ替えて表示しています

「自分のスター（要ログイン）」ボタンは自分がスターを付けたリポジトリと良く似たリポジトリのリストが表示されるページへ移動します。ユーザー認証が必要です。類似リポジトリを探すプログラムは時間がかかり重たいので一週間ごとにして、自動で更新するようにしています。
現場ではじめてのGit Flow

Qiita初投稿です！
エンジニア実務経験半年の新米エンジニアです！今の現場で初めてGit Flowを使用したので、備忘録として投稿いたします！
かなり見にくいかもしれませんが、僕みたいなビギナーの方々の参考になれれば嬉しいです！

※事前にgit flowがインストール済みであることを前提に進めていきます。

#開発

- developブランチ上で以下のコマンド(ブランチ名を`fix_username`とする)

`git flow feature start fix_username`

- 作業後はコミット。プッシュ。
- プルリクエスト作成
- 開発がすべて終了したら以下のコマンド。fix_usernameブランチをdevelopにマージし、ブランチが削除され、developブランチにスイッチされる。

`git flow feature finish fix_username`



#リリース
ここからリリースしていきます！

- developブランチに移動

`$ git checkout develop`

- pullしてローカルのdevelopブランチを最新にする

`$ git pull`

- masterブランチに移動

`$ git checkout master`

- pullしてmasterブランチを最新にする

`git pull`

- masterブランチの最新のタグ名を確認

`$ git describe
　　 v1.6.23`

- masterブランチからreleaseブランチを作成（今回は最新のタグ名の次番号にする）

`git flow release start v1.6.24`

- releaseブランチが作成されているか確認

`$ git branch -l
　　　 * release/v1.6.24`

- リリース準備を終了させる

`$ git flow release finish`

※上記のコマンドで以下のような処理が行われる
`　　　 Summary of actions:
Release branch 'release/v1.6.24' has been merged into 'master'
The release was tagged 'v1.6.24'
Release tag 'v1.6.24' has been back-merged into 'develop'
Release branch 'release/v1.6.24' has been locally deleted
You are now on branch ‘develop'`

- releaseブランチをmasterとdevelopにマージできたら、developブランチの状態でプッシュ

`git push`

- masterブランチに移動

`$ git checkout master`

- masterにプッシュ

`git push`

- あとは本番環境やステージング環境にデプロイする流れですね！


#本番環境に上げたが、修正が必要な場合
####hotfixを使用

- masterブランチからhotfixブランチを作成

`$ git flow hotfix start v1.6.28`

- 修正する

- 修正が終わったら以下のコマンド

`　 $ git add -A
　　 $ git commit -m "delete code”
　　 $ git flow hotfix finish v1.6.29    `

- developブランチに移動

`$ git checkout develop`

- developにプッシュ

`git push`

- masterブランチに移動

`$ git checkout master`

- masterにプッシュ

`git push`

以上で終了
プログラミングの奥深さ

#はじめに#
近年、プログラミングを学ぶ重要さが世間で語るようになっています。
それに伴って、多くの方がプログラミングを習い始める傾向があります。

しかし、現実はそう甘くありません。
文字を追う大変さ、とてつもない情報量…。

けれども、その大変な状況の中でもやはり、プログラミングでしか味わえない楽しさがあるのです。

今回は、初心者である私が、実際にプログラミングに触れた感想を述べていきます。



##プログラミングの難しさ##
さて、初めて数日、私は早速プログラミングの壁にぶち当たってしまいました。

それは、**入力ミス**です。
「．」（ドット）や半角スペースを入力し忘れるだけで、サイトに反映されないプログラミング技法。
それを知った後は、どこをミスしているのか遡らなければなりませんでした。
しかし、見本と見比べてもどこが間違っているのかさっぱりわかりません。
見つからなかったときは、途方に暮れてしまいました。

けれども、ミスを見つけたときのスッキリ感は、最高に気分は良いです。
「間違い探し」と思えば、気分は楽になりますし、これからはそう思うことにします。



###プログラミングの楽しさ###
このように、プログラミングの難しさを知った反面、同時にその「楽しさ」をたった数日で発見できました。
それは、**完成したサイト**を見たときです。

日本語を一切使わず、ひたすら英単語と数字だけ打っていく日々。
何を書いているのか、自分でさえわからなくなるときもありました。
しかし、少しずつ振り返りながら、完成したサイトを見たときは、感動の一言に尽きます。
自分の手で仕上げる感情を知りましたね。
わが子を育てる楽しさはこのような気分なのだろうかと、少しスケールが大きくなりながらも、深く実感しました。

同時に、これがプログラミングの奥深さだと気付くことができました。



####おわりに####
プログラミングの奥深さを知った今、これからも勉強に励んでいこうと新たに決意することができました。
コツコツと努力して、いつか自分の手でサイトを扱えるようにいたいです。
[Java]JVM構成

jvm ３つの領域

1,young generation
	新しいnewしたオブジェクト
2,old generation
	長い間使われたオブジェクト
3,permanent generation
	Class,methodなどの情報


JVMメモリパラメータの設定
１、最大ヒープサイズ
	-Xmx5M :最大ヒープサイズ５M
２、最小ヒープサイズ
	-Xms3M
３、新世代サイズ
	-Xmn
４、永久代サイズ
	-XX:PermSize
	-XX:MaxPermSize

GCの仕組み
1,ScanVengeGC
  対象：young generationのみ
　速度：早い
　頻度：頻繁
　仕組み：
　　Survivor0(From)ないに使用中のobjectのみsurvivor1(to)へコピーする
　　Survivor0(From)を空にする。
2,FullGC
　対象：	young generationとold generation
　速度：遅い
　頻度：一般的に行わない
　実行タイミング：
　　ScanVengeGCを実行してもメモリ開放されない
　　実行しないとoutofmemoryerror発生する
　仕組み：
　　使用中objをマークする--->使用しない部分削除--->断片化メモリ移動して連続メモリにする

![jvm.png](https://qiita-image-store.s3.amazonaws.com/0/296847/a1668e08-31af-b017-b205-ce8c77a2fb26.png)

テスト
https://github.com/YanHengGo/java
macOS Mojaveでログイン画面やロック画面の背景画像を変更する

# はじめに
macOS Mojaveが正式リリースされました．Mojaveではログイン画面が刷新され，背景画像にBlurがかからなくなりました．ログイン画面で背景画像がはっきり見えるようになったので，Mojaveのデフォルトの背景画像から自分好みの画像に変えたい人も多くなると思います．Mojaveでログイン画面やロック画面の背景画像を変える方法がHigh Sierraまでの頃と少し変わっていたため備忘録として書きました．

# macOS Mojaveでログイン画面の背景画像を変更する方法
macOSではシステム設定からログイン画面の背景画像を変更することはできません．しかしHigh Sierra以前のmacOSと同様に，<font color=red>ログイン画面で表示される画像が保存されているフォルダにアクセスし，背景画像を同一のファイル名の画像で上書きする</font>ことでログイン画面で表示される画像を変更することができました．

Mojaveのログイン画面では```/Library/Desktop Pictures/Mojave.heic```という画像が表示されています．ログイン画面の背景にしたい画像を適当にリサイズして同一のファイル名でここに置いてください．念のためにオリジナルの画像は消去せず```Mojave.heic.orig```等にリネームして残しておくことをおすすめします．

FileVaultが有効化されている場合に背景画像が正しく適用されない場合があります．一度FileVaultを切ったあと再起動してください．

<img width="1440" alt="login screen" src="https://qiita-image-store.s3.amazonaws.com/0/187083/2690f9f1-715d-7c46-0a37-48f72e299dad.png">

ログイン画面の背景をEl Capitan時代の画像に変更してみました．

# macOS Mojaveでロック画面の背景画像を変更する方法
ログイン画面と同様の手法でロック画面の背景画像を変更することができました．

ロック画面で表示される画像は```/Library/Caches/Desktop Pictures/ ```にあります．このフォルダの中の```lockscreen.png```というファイルを上書きしてください．

<img width="1440" alt="lock screen" src="https://qiita-image-store.s3.amazonaws.com/0/187083/4236b825-1414-e33a-32e1-27a02e5d3afb.jpeg">

ロック画面の背景をSierraの画像に変更してみました．

ただし，ロック画面の画像はPC起動時のロック画面にしか適用されませんでした．起動中のPCの画面をロックしたり一度スリープしてから復帰した際のロック画面にはメインモニターのデスクトップ画像が表示された状態になり，設定したロック画面の背景画像は表示されません．
また，```システム環境設定 > デスクトップとスクリーンセーバ```からデスクトップの背景画像を変更すると，自動的に```lockscreen.png```も設定したデスクトップ画像に上書きされてしまう仕様になっているようです．
このようにmacOSは何故かロック画面の画像にデスクトップの背景画像を使用することを推してくるので，特に強いこだわりがなければロック画面の画像はデスクトップの画像と同じで良いのかなという感じです．

# 参考
https://apple.stackexchange.com/questions/337445/how-do-i-change-the-login-screen-background-in-macos-mojave
pngquant + Automatorを使って画像ファイルを自動で圧縮する方法

# 前提

- オンラインの画像圧縮サービスいちいち使うのめんどくさい方向けです。
- ローカルで圧縮を行うので、オフラインでも実行可能です。
- Homebrew をインストール済みの方の場合、約10分程度で設定できます。

# 環境
- pngquant, 2.12.0 (January 2018)
- Homebrew 1.7.6
- Automator

# TL;DR
こんな感じで、特定のフォルダに画像ファイルを移動させたタイミングで、画像圧縮をしてくれます。 397KB から 100KB に圧縮されているのが分かると思います。なお、実行しているかどうかは上部の歯車みたいなアイコンで分かるようです。
![10月-08-2018 02-33-37.gif](https://qiita-image-store.s3.amazonaws.com/0/156176/b35d5374-19d2-8b05-674b-5bd1d8d8a729.gif)


# 手順

## 1. Homebrew で pngquant をインストールする
```
$ brew install pngquant
```

※ Homebrew を使わなくても、 tarファイルを直接ダウンロードすることもできるようです。
https://pngquant.org/pngquant.tar.bz2

## 2. Automator でフォルダアクションをつくる

Automator は、 Mac 純正のアプリケーションです。その名の通り、いろいろと自動で実行してくれるアプリです。正直そんなに使ったことありません。とにかく、以下の手順で行っていけばOKです。
なお、フォルダアクションとは、指定のフォルダに項目が追加される時に任意のスクリプトとかを実行してくれるアクションです。

- `Cmd + Space` で Spotlight 検索を出し、 Automator と打ち込んで開いてください。
![10月-07-2018 23-40-28-3.gif](https://qiita-image-store.s3.amazonaws.com/0/156176/f143b534-12b2-8f96-7f63-d4397bc27803.gif)


- Automator を開くと、以下の画面が現れるので、　`フォルダアクション` を選択してください。
![スクリーンショット-2018-10-08-2.18.56.png](https://qiita-image-store.s3.amazonaws.com/0/156176/381ac4bb-8d44-c8f5-87e3-c01a96cb7c8e.png)


- 左上の `名前` ボックスから `シェルスクリプトを実行` を選択して、ダブルクリックか右のワークフローにドラッグ＆ドロップしてください。
![10月-08-2018 02-21-22.gif](https://qiita-image-store.s3.amazonaws.com/0/156176/ffcc9a68-2c7e-19df-e47f-2c1e72299bee.gif)

- `入力の引き渡し方法` を `引数として` に変更し、以下のスクリプトをコピペしてください。実行対象とするフォルダ名は `compress` としました。名前は何でも良いと思います。
![10月-08-2018 02-25-57.gif](https://qiita-image-store.s3.amazonaws.com/0/156176/545f6141-79f6-1b65-758d-696b3ad28d7a.gif)

```
# コピペするスクリプトはこちら
$ /usr/local/bin/pngquant --ext .png --force "$@"
```

- 最後に `Cmd + S` でワークフローに名前をつけて保存してください。

これで設定は完了です。冒頭のように、 `compress` フォルダに画像を突っ込むと自動的に圧縮されるようになります。なお便利なことに Mac の場合、 メタデータはデフォルトで削除されるようになっているようですね。

```
$ pngquant -h
options:
  ...
  --strip           remove optional metadata (default on Mac)
  ...
```


# 参考文献

- https://pngquant.org/
- https://qiita.com/thanks2music/items/309700a411652c00672a
abc 074

B
xy 平面上に N 個のボールがあります。このうち i 番目のボールの位置は (xi,i) です。 したがって、N 本の直線 y=1, y=2, …, y=N の上にそれぞれ 1 個ずつボールがあることになります。
すぬけ君は、これらのボールを回収するために、タイプ A, B のロボットを N 台ずつ用意しました。 さらに、タイプ A のロボットのうち i 台目のものを位置 (0,i) に、タイプ B のロボットのうち i 台目のものを位置 (K,i) に設置しました。 したがって、N 本の直線 y=1, y=2, …, y=N の上にそれぞれ 1 台のタイプ A のロボットと、1 台のタイプ B のロボットが設置されたことになります。
それぞれのタイプのロボットは起動されると以下のように動作します。
タイプ A のロボットは、位置 (0,a) で起動されると、直線 y=a 上にあるボールの位置まで移動し、ボールを回収してもとの位置 (0,a) に戻って停止する。そのようなボールが存在しない場合は何もせずに停止する。
タイプ B のロボットは、位置 (K,b) で起動されると、直線 y=b 上にあるボールの位置まで移動し、ボールを回収してもとの位置 (K,b) に戻って停止する。そのようなボールが存在しない場合は何もせずに停止する。
これら 2N 台のロボットのうちいくつかを起動してボールをすべて回収するとき、ロボットの移動距離の総和として考えられる値のうち最小のものを求めてください。

```
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int N, K;
	int x[100];
	cin >> N >> K;
	for (int i = 0; i < N; ++i) {
		cin >> x[i];
	}
	int sum = 0;
	for (int i = 0; i < N; ++i) {
		int small[110];
		small[i] = min(x[i], abs(K - x[i]));
		sum += small[i];
	}
	cout << sum*2 << endl;
	return 0;
}
```

C
すぬけ君はビーカーに砂糖水を作ろうとしています。 最初ビーカーは空です。すぬけ君は以下の 4 種類の操作をそれぞれ何回でも行うことができます。一度も行わない操作があっても構いません。
操作 1: ビーカーに水を 100A [g] 入れる。
操作 2: ビーカーに水を 100B [g] 入れる。
操作 3: ビーカーに砂糖を C [g] 入れる。
操作 4: ビーカーに砂糖を D [g] 入れる。
すぬけ君の実験環境下では、水 100 [g] あたり砂糖は E [g] 溶けます。
すぬけ君はできるだけ濃度の高い砂糖水を作りたいと考えています。
ビーカーに入れられる物質の質量 (水の質量と砂糖の質量の合計) が F [g] 以下であり、 ビーカーの中に砂糖を溶け残らせてはいけないとき、 すぬけ君が作る砂糖水の質量と、それに溶けている砂糖の質量を求めてください。 答えが複数ある場合はどれを答えても構いません。
水 a [g] と砂糖 b [g] を混ぜた砂糖水の濃度は 
100b
a+b
[%]です。 また、この問題では、砂糖が全く溶けていない水も濃度 0 [%] の砂糖水と考えることにします。
制約
1≦A<B≦30
1≦C<D≦30
1≦E≦100
100A≦F≦3,000
A,B,C,D,E,F はすべて整数である。
問題文だるすぎ
全探索をする。

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int main() {
	int A, B, C, D, E, F;
	double mx = -1;
	int max_ws = 0,max_su = 0;
	cin >> A >> B >> C >> D >> E >> F;
	//a,b,c,dは操作1,2,3,4の回数
	for (int a = 0; 100*A*a<=F; ++a) {
		for (int b = 0; 100*B*b<=F; ++b) {
			int s = (A*a + B * b)*E;//水に溶ける砂糖の最大値
			for (int c = 0; C*c<=s; ++c) {
				for (int d = 0; D*d<=s; ++d) {
					int su = C * c + D * d;//砂糖の量
					int ws = 100 * A*a + 100 * B*b + su;//全体量
					if (su > s)continue;
					if (ws > F)continue;
					if (mx < 100 * su / (double)ws) {
						mx = 100 * su / (double)ws;
						max_ws = ws;
						max_su = su;
					}
				}
			}
		}
	}
	cout << max_ws << " " << max_su << endl;
	return 0;
}
```
【C++】競プロでの標準入力の書き方

# 標準入力の書き方
AtCoderの初心者向け問題を解きながら、いきなり標準入力の受け取り方で詰まったのでメモしておく。
また、参考URLに示した記事だといつまでも入力待ちになってしまうので、そこを改善した。
##入力
例えば、以下のように標準入力から与えられる値を受け取りたい時を考える。（AtCoder Beginners Selectionrの「Shift only」）

```
3
8 12 40
```

## コード
以下のように書けばいいらしい。

```cpp:main.cpp
#include <iostream>

int main() {
    int n;
    std::cin >> n;

    int l, i = 0, a[n];
    while (std::cin >> l) {
        a[i] = l;
        i++;
        if (i >= n) {
            break;
        }
    }

    std::cout << n << std::endl;
    for (int i=0;i<n;i++){
        std::cout << a[i] << std::endl;
    }

    return 0;
}
```

## 結果
以下のように出力される。

```
3
8
12
40
```
##　参考文献
[競プロ等におけるC++の標準入力](https://qiita.com/zenrshon/items/cd19361842ae887afe8a)
abc 73

B
joisinoお姉ちゃんは、劇場の受付を担当しています。
この劇場には、席 1 から席 100000 までの、100000 個の席があります。
彼女のメモ書きによると、今までの間に N 組の団体が来て、i 組目の団体は席 li から席 ri までの連続した席に座っています。
今、劇場の席には何人座っているか求めてください。

```
#include<iostream>
#include<string>
using namespace std;
int main() {
	int N, l[1000], r[1000];
	int ans[1000];
	int sum = 0;
	cin >> N;
	for (int i = 0; i < N; ++i) {
		cin >> l[i] >> r[i];
		ans[i] = r[i] - l[i] + 1;
		sum += ans[i];
	}
	cout << sum << endl;
	return 0;
}
```
1分

C
あなたは、joisinoお姉ちゃんと以下のようなゲームをしています。
最初、何も書いていない紙がある。
joisinoお姉ちゃんが一つの数字を言うので、その数字が紙に書いてあれば紙からその数字を消し、書いていなければその数字を紙に書く。これを N 回繰り返す。
その後、紙に書かれている数字がいくつあるかを答える。
joisinoお姉ちゃんが言った数字が、言った順番に A1,…,AN として与えられるので、ゲーム終了後に紙に書かれている数字がいくつあるか答えてください。
制約
1≦N≦100000
1≦Ai≦1000000000(=109)
入力は全て整数である。

```
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
using ll = long long;
int main() {
	int N;
	cin >> N;
	int ptr = 0;
	int res = 0;
	int a[100001];
	for (int i = 0; i < N; ++i) {
		cin >> a[i];
	}
	sort(a, a + N);
	while (ptr < N) {
		int cc = a[ptr], f = 0;
		while (ptr < N&&a[ptr] == cc) {
			f++, ptr++;
		}
		res += f % 2;
	}
	cout << res << endl;
	return 0;
}
```
あたまいい
どうせCloud Functionsの裏側ってGAEなんでしょ？という話

表題の通り、GCPのCloud Functionsの実体はGAEなんじゃないか、という話をします。

元々そういう公式発表があるんだとしたらこの文章は寝言です。

## Cloud FunctionsのURLがGAEと一緒だ！

Cloud Functionsで「トリガー」「Pub/Sub」の関数を作ると、対応するPub/Subトピックのサブスクライバが自動的に追加されます。このサブスクライバはpushタイプになっており、そのURLは `https://*.appspot.com/` 以下になっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/46856/11b0fb05-8879-580a-6ae3-4094b789c28b.png)

これはCloud Functionsの実体がGAEである証拠では…という気がしたので記録として残しておきます。

一方で、仮にこの予想が真実だったとしても全く意外性がない印象です。GAEもCloud Functionsも言語とバージョン丸被りですし、両方gVisor使ってるって話でしたしね…。

## 補足

ちなみにCloud Functionsで「トリガー」「HTTP」の関数を作った場合、そのアクセスURLは `https://*.cloudfunctions.net/` 以下になります。いずれCloud Functionsの全URLがこのドメインを使うようになるのかもしれません。
Let's Encrypt (Certbot) に登録したメールアドレスを確認する方法と変更する方法

# はじめに
数ヶ月前に新しいメールアドレスを取得し、そのメールアドレスをメインにしました。頻繁に利用するサービスでは一通りメールアドレスの変更を行ったのですが、Let's Encrypt で最初に登録したメールアドレスを変更するのを忘れていました。

今回は Let's Encrypt に登録したメールアドレスを確認する方法と変更する方法について紹介します。

## 証明書の発行と更新
証明書の発行と更新の方法について知りたい方は、「[Nginx+リバースプロキシ環境でWebサーバを停止させずに Let’s Encrypt (Certbot) のSSL証明書を自動更新する](https://ja.developers.noraworld.blog/auto-renew-letsencrypt-for-nginx-reverse-proxies)」をご覧ください。

# TL;DR
```
# 確認
$ sudo cat /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/<hash>/regr.json

# 変更
$ sudo certbot register --update-registration --email <email>
```

`<hash>` は以下のコマンドで確認できる。

```
$ sudo ls /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory
```

`<email>` は新しいメールアドレスを入力する。

# 確認方法
メールアドレスは、以下の JSON ファイルに記載されています。

```
/etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/<hash>/regr.json
```

`<hash>` の部分にはランダムなハッシュ値が入ります。ここは人によって違う値なので、`ls` で確認します。

```
$ sudo ls /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory
```

表示されたハッシュ値を先ほどのパスに当てはめて、JSON ファイルの中身を見ます。

```
$ sudo cat /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/<hash>/regr.json
```

`"body"` の中の `"contact"` に記載されているのが、現在登録されているメールアドレスです。

# 変更方法
変更するのはとても簡単です。以下のコマンドを実行するだけです。

```
$ sudo certbot register --update-registration --email <email>
```

`<email>` の箇所には新しいメールアドレスを入力します。

途中で確認のメッセージが表示されるので、同意するために `Y` を押したあと、エンターキーを押します。

正しくメールアドレスが変更されると以下のようなメッセージが表示されます。

```
IMPORTANT NOTES:
 - Your e-mail address was updated to <email>
```

また、メールアドレスを変更するとすぐにメールが届きます。これでメールアドレスが正しく変更されていることがわかります。お疲れさまでした。

# さいごに
実はメールアドレスの変更を忘れてしまったことによって、証明書の有効期限を切らせてしまいました。今まではメール通知が来ていたので気づけたのですが、通知を受け取れなくなった途端に更新を忘れてしまったので、みなさんも気をつけましょう。

# 参考サイト
- [how to change email address for certificates · Issue #3310 · certbot/certbot](https://github.com/certbot/certbot/issues/3310)
- [how do I change the admin email for let's encrypt?](https://serverfault.com/questions/751079/how-do-i-change-the-admin-email-for-lets-encrypt)
abc 72

B
英小文字からなる文字列 s が与えられます。前から数えて奇数文字目だけ抜き出して作った文字列を出力してください。 ただし、文字列の先頭の文字を1文字目とします。

```
#include<iostream>
#include<string>
using namespace std;
int main() {
	string S;
	cin >> S;
	for (int i = 0; i < S.size(); i += 2) {
		cout << S[i];
	}
	return 0;
}
```
30秒。

C
長さ N の整数列 a1,a2,…,aN が与えられます。
各 1≤i≤N に対し、ai に 1 足すか、1 引くか、なにもしないかの三つの操作からどれか一つを選んで行います。
この操作の後、ある整数 X を選んで、ai=X となる i の個数を数えます。
うまく操作を行い、X を選ぶことで、この個数を最大化してください。
制約
1≤N≤105


```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int main() {
	int N;
	cin >> N;
	int A[100010];
	int flag[100010] = {};
	for (int i = 0; i < N; ++i) {
		cin >> A[i];
		if (A[i] == 0) {
			flag[A[i]]++;
			flag[A[i] + 1]++;
		}
		else {
			flag[A[i] - 1]++;
			flag[A[i]]++;
			flag[A[i] + 1]++;
		}
	}
	int ans = 0;
	for (int i = 0; i < 100010; ++i) {
		ans = max(ans, flag[i]);
	}
	cout << ans << endl;
	return 0;
}
```
Lightning コンポーネント開発 TIPS: Apex を呼ばずに SObject  のメタデータを取得する

Lightning コンポーネントから　Apex　を呼ばずに　SOｂject　のメタデータを取得する方法を偶然見つけたのでメモ。
もう getDescribe しなくて良くなったかもしれない。

##ケースオブジェクトのメタデータを取得する
`lightning:recordEditForm` は指定したオブジェクトのメタデータを内部的に取得しており、`onLoad` イベントでそのメタデータにアクセス出来るみたいです。
また、選択リストのオプションや参照先のオブジェクトの情報は、`lightning:recordEditForm` 内で `lightning:inputField` で指定すると取得できました。

```html:RetrieveMetadata.cmp
<aura:component implements="flexipage:availableForAllPageTypes" access="global" >
    <lightning:recordEditForm objectApiName="Case" onload="{!c.onLoad}" >
        <lightning:inputField fieldName="Id" />
        <lightning:inputField fieldName="Status" />
    </lightning:recordEditForm>
</aura:component>
```

```js:RetrieveMetadataController.js
({
    onLoad: function(c, e, h) {
        const recordUi = e.getParam("recordUi");
        console.log(JSON.stringify(recordUi));
    },
})
```

## 取得出来るメタデータ情報の例
長すぎるので最初の少しだけ。
<img width="315" alt="Screen Shot 2018-10-08 at 0.39.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/26378/1a561183-02de-3fce-c76c-7c35952facdd.png">
Elixir のインストールのやり方

#インストールの前に
インストール前に以下の事を確認しておいてください

- OSが最新かどうか確認する
（2018年10月6日現在macOSのバージョンは10.13.6）

- Homebrewをインストールする
(HomebrewはMac OS Xオペレーティングシステム上でソフトウェアの導入を単純化するパッケージ管理システムのひとつらしいです)

インストール方法は以下の画像の通りです
画像下にスクリプトを書いておきます
<img width="947" alt="スクリーンショット 2018-10-07 23.29.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/296925/1df490ea-3e63-ff42-9ce0-bb1368dcaa2e.png">
[/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"]


#Elixir のインストール
このサイトにわかりやすく書かれています
https://qiita.com/keitaMatsuo/items/33f1ecb74383374248d8
ただし記事が古く今ではバージョンなどが変わっているため、最新のやり方をここで紹介します
このサイトの３番を参照します

ターミナルに以下を１文１文入力してください
スムーズにいくと15分ほどでインストールが完了します

```
brew update
brew install openssl
export PATH=/usr/local/opt/openssl/bin:$PATH
source ~/.bash_profile
$ cd
$ git clone http://erlang.org/download/otp_src_21.1.readme
echo 'export PATH="$HOME/.erlenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(erlenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
curl -O http://erlang.org/download/otp_src_21.1.tar.gz
tar zxf otp_src_21.1.tar.gz
cd otp_src_21.1
```
上の部分でダンロードしたバージョンと同じ事を確認してください
違うバージョンを入力しているとエラーになります

```
./configure --prefix=/Users/◯◯◯◯（Macの名前）/.erlenv/releases/21.1 --enable-smp-support --enable-threads --enable-darwin-64bit --enable-kernel-poll --enable-hipe --without-javac --enable-dirty-schedulers --enable-sharing-preserving --enable-lock-counter --disable-sctp --with-ssl=/usr/local/opt/openssl --without-obdc 
touch lib/wx/SKIP lib/odbc/SKIP
make
sudo make install
erlenv global 21.1
erlenv rehash
erl
brew install elixir-build
brew install exenv
echo 'export PATH="$HOME/.exenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(exenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
exenv install -l
exenv install 1.7.3
exenv global 1.7.3
```
ここでもバージョンを確認してください

これでElixirのインストールが完了します
最後のコマンド

```
elixir -v
```
これを実行しターミナルに以下の文章が表示されたら正常にインストールされています

```
Erlang/OTP 21 [erts-10.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [sharing-preserving]

Elixir 1.7.3 (compiled with Erlang/OTP 21)
```
upscを使って2台のUPSと2重化電源の環境で電源制御する

# 目的
電源が冗長化されたサーバで電源ごとに異なるUPSを接続している場合に以下のような制御をさせたい。とりあえず電源2、UPS 2の環境とする。

| 電源供給      | 挙動                        |
|:-------------|:----------------------------|
| 正常          | 通常                        |
| 片系ダウン    | シャットダウンしない         |
| 両系統ダウン  | 一定時間後シャットダウンする  |

APCのUPS + UPS Network Management Card 2 (AP9630)を利用するのでapcupsdを使いたかったが上記のようなことは出来ないようなのでupscを利用することにした。

仮想化ホストのサーバに導入しているが、電源制御するのはホストサーバ自身だけにし、仮想化ゲストはlibvirtdの機能を使ってホストサーバのシャットダウン時にゲストサーバのシャットダウンを自動的に行うよう設定しているため、他サーバから参照するようにしていない。

# 導入方法
## インストール
```
# yum install nut
```

## 設定
設定ファイルを書き換える。

```
# cat /etc/ups/ups.conf
[ups01]
        driver = snmp-ups
        port   = 192.168.1.201
        community = public
        snmp_version = v2c
        notransferoids
        desc = "SNMP-UPS01"

[ups02]
        driver = snmp-ups
        port   = 192.168.1.202
        community = public
        snmp_version = v2c
        notransferoids
        desc = "SNMP-UPS02"
```

```
# cat /etc/ups/upsd.conf
LISTEN 127.0.0.1  3493
```

```
# cat /etc/ups/upsd.users
[upsmon]
        password = upspass
        upsmon master
[upssvc]
        password = upspass
        upsmon slave
```

以下のupsmon.confの掲載部分はSNMP UPS監視部のみで、電源制御について別途設定を記述する必要がある。
`MINSUPPLIES`で最低限稼働している必要があるUPSの数を設定している。

```
# cat /etc/ups/upsmon.conf
MONITOR ups01@localhost 1 upsmon upspass master
MONITOR ups02@localhost 1 upsmon upspass master
MINSUPPLIES 1
```

以下は変更しない
/etc/ups/upssched.conf
/etc/ups/nut.conf

## 設定確認
```
# upsdrvctl start
# upsd
Network UPS Tools upsd 2.7.2
fopen /var/run/nut/upsd.pid: No such file or directory
not listening on 127.0.0.1 port 3493
no listening interface available

# upsc -L
ups01
ups02

# upsc ups01@localhost
# upsc ups02@localhost
```

## 動作確認
```
# systemctl start nut-server
# systemctl enable nut-server
# reboot
# upsc ups01@localhost
# upsc ups02@localhost
```
Goで書いたサーバーをArukasで動作させるまでのステップ

## GoでHTTPサーバーを用意する
### シンプルなHTTPサーバーを用意する
```Go
package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello world\n")
}

func main() {
	fmt.Println("Starting server")
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}
```
### Dockerfileを用意する
```
FROM golang:latest as builder

ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
WORKDIR /go/src/github.com/yokoe/go-server-example
COPY . .
RUN go build main.go

# runtime image
FROM alpine
RUN apk add --no-cache ca-certificates
COPY --from=builder /go/src/github.com/yokoe/go-server-example /app
RUN ls /app
EXPOSE 8080
CMD /app/main
```
### ビルドしてみて動作確認する
```
docker build -t go-server-example .
docker run -p 8080:8080 -t go-server-example
```

curlでAPIを叩いてみて、ちゃんとレスポンスが帰って来ればOK

```
curl http://localhost:8080/
```

## Dockerhubにデプロイする
### DockerでSign Inする
Docker.app(macOS)の場合はメニューからSign Inできる。

### イメージをPushする
```
docker images
```
`docker images`で、ビルドしたイメージのImage IDを調べる。

```
docker tag 3da5154 yokoe/go-server-example:latest
docker push yokoe/go-server-example:latest
```

そのImage IDに対してlatestタグをつけてPushする。


## Arukasにデプロイする
* Arukasにログインして、「新しいアプリケーションを作成」を選ぶ
* ImageにDockerhubのレポジトリのイメージ名を指定する
* 公開レポジトリの場合はFreeプランで運用できる
* 「アプリケーションを作成」する
* Action欄で「起動」をするとインスタンスが立ち上がる
* curlでアクセスしてみて動作確認する
日付と時刻 [サイ本p37]

# Date()コンストラクタ

```javascript
var later = new Date(2018,0,1,17,10,30);//2018年1月1日現地時間午後5:10:30。
later.getMonth()
=>0 //1月を0とする月番号。
later.getDay()
=>5　//曜日。0が日曜日、５が金曜日。
later.toString()
=>"Fri Jan 01 2010 17:10:30 GMT-0800(PST)"
```

***月と曜日は0から始まる。日は普通に1から始まる。***

＜感想＞
日付を設定しておけば曜日を簡単に調べることができるのがすごいと思った。
RSA暗号の仕組み

#　公開鍵暗号
皆さんは公開鍵暗号というのを知っていますか？　おそらく皆さんが想像するようなものはシーザー暗号やエニグマのようなものを想像すると思います。これらの暗号には鍵というものが存在し、その鍵が知られると暗号が解かれてしまいます。この鍵のうちの一部を知られてもいい情報として扱う暗号を公開鍵暗号と言います。今回はそのうちの一つ、RSA暗号に関して書こうと思います

# オイラーの定理　（整数論）
フェルマーの小定理を一般化したものですね。証明方法はさほど変わりません。

> 自然数 $ a, n $ に対して $ a $ と $ n $ が互いに素であるとき、次の式が成り立つ

```math
\begin{equation}
a ^ {\phi(n)} \equiv 1 ( \mod n )
\end{equation}
```
> ただし、$ \phi ( n ) $ はオイラーの $ \phi $関数
> （引用：http://mathmatik.jp/2016/02/12/euler_theorem1/)

この定理がかなり重要になって来ます。このオイラーの $ \phi $関数は $ n $を素因数分解しないと求められない仕組みになっています。どのような数になるかというと$ n $の素因数を $ p_1, p_2, ...... p_m $とするとき、


```math
\phi ( n ) = n ( 1 - \frac{1}{p_1})(1 - \frac{1}{p_2}).......(1 - \frac{1}{p_n})
```
となります。証明を読めばわかりますが、これはちょうど$ n $以下の $ n $と違いに素な数の個数です

#　RSA暗号とは
適当に素数 $ p, q $を決めます。すると公開鍵のうちの一つ、　$ n = pq $が定まります。このとき、$ \phi　( n ) = pq(1 - \frac{1}{p}) (1 - \frac{1}{q}) = (p - 1) (q - 1) $となるので、平文（暗号化する前の数）を$ a $とすると

```math
a ^ { \phi ( n ) + 1 } \equiv a ^ { \phi ( n ) } \times a \equiv 1 \times a \equiv a ( \mod n) 
```
なので、

```math
ed  = \phi( n ) + 1
```
となるような二つの自然数 $ e, d $を選びます。そして$ d $を秘密鍵、$ e $を公開鍵にします

暗号化の方法は $ a $を平文、 $ b $を暗号文とすると

```math

a ^ e \equiv b (\mod n)
```
復号は

```math

b ^ d \equiv a (\mod n)
```

のようにします。
abc 071

B
英小文字からなる文字列 S が与えられます． S に現れない英小文字であって，最も辞書順（アルファベット順）で小さいものを求めてください． ただし，S にすべての英小文字が現れる場合は，代わりに None を出力してください．

```
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main() {
	string S;
	cin >> S;
	bool ans[26];
	for (int i = 0; i < 26; i++) {
		ans[i] = false;
	}
	for (int j = 0; j < S.size(); ++j) {
		ans[S[j] - 'a'] = true;
	}
	for (int i = 0; i < 26; ++i) {
		if (!ans[i]) {
			cout << (char)(i + 'a');
			return 0;
		}
	}
	cout << "None" << endl;
	return 0;
}
```
まだ文字列と数字を同時に扱うのにまだ慣れてないな

C
太さが無視できる棒が N 本あります． i 番目の棒の長さは Ai です．
すぬけ君は，これらの棒から 4 本の異なる棒を選び，それらの棒を辺として長方形（正方形を含む）を作りたいです． 作ることができる最大の長方形の面積を求めてください．

```
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
using ll = long long;
int main() {
	int N;
	cin >> N;
	vector<long long int>a(N);
	for (int i = 0; i < N; ++i) {
		cin >> a.at(i);
	}
	sort(a.begin(), a.end());
	reverse(a.begin(), a.end());
	int count = 1;
	int flag = 0;
	long long int b = 0, c = 0;
	for (int i = 1; i < N; ++i) {
		if (a.at(i - 1) != a.at(i)) {
			count = 1;
			continue;
		}
		else count++;
		if (count == 2 && flag == 0) {
			b = a.at(i);
			flag = 1;
			continue;
		}
		if (count == 4) {
			c = a.at(i);
			break;
		}
		if (count == 2 && flag == 1) {
			c = a.at(i);
			break;
		}
	}
	long long int ans = b * c;
	cout << ans << endl;
	return 0;
}
```
デカい数字はVector配列で扱ったほうがやりやすいな。
XCode 9.4.1でXVim2を使う方法

今更ですがmasterブランチを使用すると動作がおかしかったので。

#### 手順 

古いXVim2を削除

``` 
cd ~/Library/Application\ Support/DeveloperShared/Xcode
rm -rf XVim2 
```

XVim2をClone

```
git clone https://github.com/XVimProject/XVim2
```
xcode9.4というtagが切られているのでcheckout

```
git checkout -b xcode9.4 ref/tags/xcode9.4
```

XCodeを開いている場合は終了して

```
cd ./XVim2
make
```

ビルドが正常終了したことを確認していつもの

```
update_xcode_plugins --unsign
```

XCodeを開いて'Load Bundle'を選択して起動

#### 結果
正常に動作しました
react-native 0.57.2の導入エラー

最新のreact nativeでビルドエラーが発生したので備忘録兼ねてメモ。
いつもreact nativeの導入で苦労する気がする。

## react native バージョン
- react-native 0.57.2
- Win 10

## 実行時にエラー
```
>react-native run-android
error: bundling failed: Error: Unable to resolve module `./../../react-transform-hmr/lib/index.js`
```
詳しいことはわからないけど、run-androidのバグらしい。
https://github.com/facebook/react-native/issues/21490

## 回避策１
回避策は、ターミナル２つ立ち上げて、development serverの起動とアプリの起動を別で行うこと。

```shell:1st-tab
react-native start --reset-cache
```

```shell:2nd-tab
react-native run-android
```

## 回避策2
react-nativeを0.57.1に落として、babelを入れ直す。

```shell
> rm -rf ./node_modules/
> vi package.json
   //react nativeのバージョンを0.57.1に
> npm install @babel/runtime
> npm install
```

回避策1を実施した場合、追加しているパッケージによってはビルド時にエラーが発生する。これは親子関係にない２プロセスで実行フォルダを共有してしまうため。少なくともreact-native-google-signin使用時にはこけてしまう。
Create React App 2.0の変更点まとめ

Create React App 2.0が10月1日にリリースされました

## What's New

### 画面が新しく
デフォルトで立ち上がる画面が新しくなりました
<img width="915" alt="スクリーンショット 2018-10-07 22.53.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/196629/25959fe5-2f11-ee79-6843-75b2cea8be4e.png">


### Sass, CSS Modulesに対応
余計な設定を書く必要が無くなり、拡張子を変更すれば大丈夫なようです。

### Babel7, React Fragment
`<React.Fragment></React.Fragment>`を`<></>`で置き換え可能になりました。

### Webpack4
Webpack4にアップデート、JSモジュールバンドルの自動分割が改善されたようです。

### Jest23
Jest23にアップデート、スナップショットのレビューにインタラクティブモードが追加されました。

### Apollo, Relay Modern, MDX
Babel Macrosはeject無しではほぼ使用不可能でしたが、 ApolloやRelay Modernと言ったサードパーティのライブラリがゼロコンフィグで利用可能になりました。

### SVGをReact Componentとしてインポート
SVGを`<img />`の`src`としてではなく、`import * as Logo from './logo.svg'`のようにコンポーネントとして利用可能になりました。

### Yarn Plug ‘n Play
通常であれば、`yarn install`をしたら`node_modules`の中にパッケージがインストール、キャッシュされますが、代わりとなるファイルが作られるようです

### マニュアルのProxy設定
`src/setupProxy.js`でバックエンドに合わせてマニュアルでProxyの設定ができるようです。

### 最新のNodeバージョンの対応
最新のNodeのバージョンで書かれたパッケージも利用できるようになりました。

### より小さいCSSバンドル
モダンブラウザを対象として、よりサイズの小さいCSSバンドルを利用できるようになりました。

### Service Worker, Google Workbox
Service Workerがオプトインになりました。また、GoogleのWorkboxを利用してPWAの実装が容易になりました。

## Breaking Changes

- Node6がサポート対象外に
- IE9, 10, 11がサポート対象外に
- `require.ensure()`を`import()`で置き換え
- Jestのデフォルト環境がjsdomに
- プロキシの設定に置けるオブジェクト指定のカスタムプロキシモジュールへの置き換え
- `.mjs`ファイルがサポート対象外に
- プロダクションビルドからPropTypesが削除

## 参考
[Create React App 2.0: Babel 7, Sass, and More](https://reactjs.org/blog/2018/10/01/create-react-app-v2.html)
[What’s New in Create React App 2.0
](https://blog.usejournal.com/whats-new-in-create-react-app-2-0-f68f190fa9bf)
パワーシェルでファイルのタイムスタンプをCSVファイルに出力する

PowerShellのコマンドはどうにもすぐ忘れるので、自分でも記事を書いてみることにした
パワーシェルでファイルのタイムスタンプをcsvファイルへと出力できないか思案し、なんとか形になったので結果をまとめる


##動作環境
 - Windows10
 - PowerShell 5.1

##PowerShellソースコード
今回のファイルの命名規則はアルファベットとしてみた
 
```PowerShell:Exportcsv.ps1
$csv="timestamp.csv"
$extension="xyz"
#該当ファイル名もしくは該当ファイルの命名規則を配列に入れる
$filenameArray=@("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x")
$exportcsvArrary=@()

#ファイルの個数分繰り返す
foreach($i in $filenameArray){
    if(Test-Path .\*$i.$extension){
        $filename=$(Get-ItemProperty .\*$i.$extension).Name #(フォルダ内のアイテム)ファイル名を取得
        $timestamp=$(Get-ItemProperty .\*$i.$extension).LastWriteTime.ToString('yyyy/MM/dd HH:mm:ss')
        #変数に格納
        $storecsv=New-Object PSObject | Select-Object Information1,Information2
        $storecsv.Information1=$fileName   #1列目の(Information1の下の)2行目にファイル名を出力
        $storecsv.Information2=$timestamp  #2列目の(Information2の下の)2行目にファイル名を出力
        $exportcsvArrary+=$storecsv
    }
}
#ホスト(コンソール)画面に結果を表示
$exportcsvArrary | ft -AutoSize

#-Encoding DefaultでシフトJIS出力
$exportcsvArrary| Export-Csv -NoTypeInformation .\$csv -Encoding Default

#csvを起動し終了を待つ
Write-Host プロセスの終了を待機中
Start-Process .\$csv -wait
[GC]::Collect()
```
※最初はループ処理をfor文にしていたが、foreach文の方が配列と相性が良さそうなのでそちらにした

ファイル名がa~xとなっている場合のホスト画面

```````
Information1 Information2       
------------ ------------      
a.xyz        yyyy/MM/dd HH:mm:ss
...(略)...
x.xyz        yyyy/MM/dd HH:mm:ss

プロセスの終了を待機中
```````
timestamp.csvが生成される

##参考
特に以下のサイトは大変参考になった
カスタムオブジェクトの作り方などは参考にしたというよりも倣いました

- [カスタムオブジェクトの作成とCSV出力](http://www.vwnet.jp/windows/PowerShell/CreateCustomObject.htm)

- [PowerShellのExport-CsvコマンドレットでCSVファイルを出力する](https://mseeeen.msen.jp/powershell-export-csv-commandlet/)

##最後に
上記では必要ないかもしれないが調べているうちに
`[GC]::Collect()`
というコマンドが出てきた
.NET Frameworkの機能でガベージコレクションを強制実行するものらしいが、
筆者はここらへん全く理解できてないので今後理解を深めていきたい


- :arrow_backward: 前回の記事 | [次回の記事](https://qiita.com/kurosworld/items/1946babccd98b4702835) :arrow_forward:
Swift：【IME自作プロジェクト】かな漢字変換ライブラリ作成中

#はじめに
カスタムキーボード作成の際ぶつかる最も大きな障壁はかな漢字変換だと思います．日本語変換に関するライブラリや情報があまりにも少ない！オープンソースとして使えるものはGoogleのMozcくらいなものです．しかし，Mozcの導入は非常に開発コストが高いのが現状です．そこで，兼ねてから日本語変換システムを自作しようと思い`Kaede Project`というのを水面下で進めていたのですが，　その進捗が少し形になったので共有したいと思います．→さらに進捗出ました！(2018/10/25)

#Kaede Project
GitHubにソースを公開しています．
https://github.com/Kyome22/Kaede
いい感じに完成したらCocoaPodsにでも公開しようと思います．

#現状
ローマ字の入力をひらがなに変換する機能と単語の漢字変換候補リストを取得する機能ができました．
文脈を踏まえた長文の変換にはまだ対応しておらず，記号の変換などもほとんど対応してません．
→長文の先頭をかな漢字変換した結果のリストを取得できるようになりました．ユーザの選択とリストの更新＆提示を繰り返すことで，実用可能です！

```swift:例
import UIKit
import Kaede

class ViewController: UIViewController {

    let kaede = Kaede()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        let text1 = kaede.convertRomanToKana("saikou")
        Swift.print(text1)
        let res1 = kaede.requestCandidates(text)
        Swift.print(res1)


        let text2 = kaede.convertRomanToKana("kikaikagakunomati")
        Swift.print(text2)
        let res2 = kaede.requestCandidatesOfSentence(text)
        Swift.print("Candidated:[")
        for r in res2 {
            Swift.print("\tBody: \(r.body), Reminder: \(r.remainder)")
        }
        Swift.print("]")
    }
}
```

実行結果
> さいこう
> ["最高", "再興", "採鉱", "再校", "サイコウ", "ｻｲｺｳ", "さいこう"]

> きかいかがくのまち
> Candidated:[
> 	Body: 機械化, Reminder: がくのまち
> 	Body: きかいか, Reminder: がくのまち
> 	Body: キカイカ, Reminder: がくのまち
> 	Body: ｷｶｲｶ, Reminder: がくのまち
> 	Body: 器械, Reminder: かがくのまち
> 	Body: 棋界, Reminder: かがくのまち
> 	Body: 機会, Reminder: かがくのまち
> 	Body: 機械, Reminder: かがくのまち
> 	Body: きかい, Reminder: かがくのまち
> 	Body: キカイ, Reminder: かがくのまち
> 	Body: ｷｶｲ, Reminder: かがくのまち
> 	Body: 奇禍, Reminder: いかがくのまち
> 	Body: 奇貨, Reminder: いかがくのまち
> 	Body: 幾何, Reminder: いかがくのまち
> 	Body: 帰化, Reminder: いかがくのまち
> 	Body: 気化, Reminder: いかがくのまち
> 	Body: 貴下, Reminder: いかがくのまち
> 	Body: 貴家, Reminder: いかがくのまち
> 	Body: 麾下, Reminder: いかがくのまち
> 	Body: きか, Reminder: いかがくのまち
> 	Body: キカ, Reminder: いかがくのまち
> 	Body: ｷｶ, Reminder: いかがくのまち
> 	Body: 黄, Reminder: かいかがくのまち
> 	Body: 基, Reminder: かいかがくのまち
> 	Body: 奇, Reminder: かいかがくのまち
> 	Body: 忌, Reminder: かいかがくのまち
> 	Body: 期, Reminder: かいかがくのまち
> 	Body: 機, Reminder: かいかがくのまち
> 	Body: 気, Reminder: かいかがくのまち
> 	Body: 季, Reminder: かいかがくのまち
> 	Body: 紀, Reminder: かいかがくのまち
> 	Body: 記, Reminder: かいかがくのまち
> 	Body: 貴, Reminder: かいかがくのまち
> 	Body: 騎, Reminder: かいかがくのまち
> 	Body: 木, Reminder: かいかがくのまち
> 	Body: き, Reminder: かいかがくのまち
> 	Body: キ, Reminder: かいかがくのまち
> 	Body: ｷ, Reminder: かいかがくのまち
> 	Body: きかいかがくのまち, Reminder: 
> 	Body: キカイカガクノマチ, Reminder: 
> 	Body: ｷｶｲｶｶﾞｸﾉﾏﾁ, Reminder: 
> ]

#導入方法
`Kaede.framework`をプロジェクトに突っ込んで，`Embedded Binaries`と`Linked Frameworks and Libraries`に追加すればOKです．
あとは使いたいところで`import Kaede`してください．
kindleでpdfを読む

この記事では、kindleでpdfを電子書籍と同じように閲覧する方法を紹介します。

#1.経緯
明日10/8に[技術書典5](https://techbookfest.org/event/tbf05)が開催されるので、
購入したpdfをkindleで読めるようにしたい！と思い調べました。
当日の様子は、後日アップします（たぶん）

#2.方法
ダウンロードしたpdfを承認済みのメールアドレスからkindle専用のメールアドレスに送付することで、kindle端末でpdfを電子書籍同様に読むことが可能になります。
流れは以下の通りです。
2.1.amazonで設定
2.2.kindleへpdfを送信

##2.1.amazonの設定
amazonのマイページから以下の操作を実施してください。
2.1.1 "アカウント＆リスト" ＞ "アカウントサービス" をクリック
2.1.2 "デジタルコンテンツとデバイス" ＞ "コンテンツと端末の管理" をクリック
2.1.3 "設定"タブ ＞ "パーソナル・ドキュメント設定" を展開
　以下を設定（私の場合は、すでに設定済みでした。）
  - Send-toKindle Eメールアドレスの設定：kindle固有のアドレス（メールの送信先）
  - 承認済みEメールアドレス一覧：kindleで受信許可するアドレス（メールの送信元）

##2.2.kindleへpdfを送信
2.2.1 以下のように、メールでpdfを送信する。
  FROM: Send-toKindle Eメールアドレス
  TO:   承認済みEメールアドレス
  添付： kindleで読みたいpdfファイル
2.2.2 kindleで確認

#余談
これまで電子書籍はiPadでBOOKLIVE!(CMで栗山千明さんがブッコミとか言ってるやつ)を利用していました。
操作感に特に不満もなく利用していたのですが、利用量が増えてくるとストレージが不足しました。
そこでmicroSDが取り付けられる尼タブレットを購入したのですが利用２回目でタッチに反応しなくなる始末…
最終的に、kindleにたどり着きました。
AmazonDashボタンを押したらGoogleHomeが定型文を話す仕組み

# 背景
前回[インターホンセンサー](https://qiita.com/inaBowBow/items/307e0730701437c2f3af)を作った際、GoogleHomeにお話ししてもらうことができたので、以前買って部屋に大量に積まれている「Amazonダッシュボタン」を活用してみようと思いたった
具体的には、ボタンを押したらあらかじめ設定しておいたセリフをGoogleHomeに喋ってもらう

想定する使い方としては

* 台所にいるお母さんがご飯ができたときに家族を招集する  
「ご飯できたよー早くおいでー」
* 介護が必要な時に家族を呼ぶ  
「部屋に来てください」
* 朝起きられない息子を目覚まし以外で起こす  
「起きてー遅刻するよー」

など

セリフ毎にAmazonダッシュボタンが必要になる点に注意

# 構成
* [AmazonDashボタン](https://www.amazon.co.jp/b?node=4752863051&tag=googhydr-22&ref=pd_sl_64gl84ig7w_e&adgrpid=57250626635&hvpone=&hvptwo=&hvadid=277474208077&hvpos=1t1&hvnetw=g&hvrand=356129479260332448&hvqmt=e&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009343&hvtargid=kwd-295456041022)（銘柄はなんでもいい）
* RaspberryPi（LANにつながる状態）
* GoogleHome（設定が終わってる状態）

# 作り方
偉大な先人たちが既に多くの記事を公開しているため、それらを参考にする

## 1.AmazonDashボタン

ボタンの設定については以下の記事
[Amazon Dash ButtonをPythonでハックする](http://blog.roy29fuku.com/iot/amazon-dash-button%E3%82%92python%E3%81%A7%E3%83%8F%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B-part1-%E8%A8%AD%E5%AE%9A/)（「Amazon Dash Button設定」の箇所）
数分で終わるはず

## 2.RaspberryPi
### GoogleHomeをおしゃべりさせるやつ
これは[前回の記事に記載した](https://qiita.com/inaBowBow/items/307e0730701437c2f3af#googlehome%E3%81%B8%E3%81%AE%E9%80%9A%E7%9F%A5)say.jsをそのまま使用した
おしゃべりさせる内容を引数で渡すものとなっているので、呼び出し元で変更する

### AmazonDashボタンを検知するやつ
これについては、AmazonDashボタンが日本でリリースされた当初、多くの偉大な先人たちが記事を書かれており、中でも以下の記事がわかりやすかった
[Amazon Dash Buttonを(正しくない方向で)使ってみた](https://qiita.com/takustaqu/items/8539b33780c9675c8657)

nodeとnpmの導入が必要だが、手順は特段記載しない（一般的なので）
また、先日上記手順を再実行したところエラーが発生した
エラーログを確認しつつ、以下をインストールしたところ正常動作することが確認できた

```shell
sudo apt-get install libffi-dev
```
環境と実施時期によって異なるようなので、エラーが出たら都度ログを見て対応することになりそう

ソースは以下のようになった

```javascript:gohan
#!/usr/local/bin/node

const DashButton = require("dash-button");

const PHY_ADDR = "xx:xx:xx:xx:xx:xx";
let button = new DashButton(PHY_ADDR);
console.log("Stand by...");

button.addListener(() => {
    const execSync = require('child_process').execSync;
    execSync('node /home/pi/googlehome/say.js ご飯できたよー');
});
```
なお、PHY_ADDRは、上の参考リンク内に記載があるDashボタンのMACアドレス取得の箇所を参考に、事前に取得した自身のDashボタンのMACアドレスを入れる
package.jsonにscanを追記するのを忘れがちなので注意が必要

また、複数のDashボタンを使用する場合は、ここのソースをうまいことして使い分けることができるはず

加えて、常時実行するためにforeverを導入、RaspberryPiを再起動した際に自動で起動するためのshellを作成してcrontabで自動起動するようにした

```shell:foreverインストール
npm install -g forever
```

```shell:run
#! /bin/sh

export PATH=$PATH:/usr/local/bin/node:node_modules/.bin

cd /home/pi/dash
sudo forever start ./gohan
```

```shell:crontab
@reboot sudo /home/pi/dash/run > /home/pi/dash/cronlog.log 2>&1
```

# 所感
AmazonDashボタンが日本に登場して結構経つので今更感があるが、GoogleHomeをRaspberryPiからおしゃべりさせることができることを最近知ったのでどうしても作って見たかった
我が家では使い方が限定的であまり活用できていないが、自分がニートの引きこもりだったり、体が不自由だったり、また職種によっては活用できるシーンがありそうな気がする

一点注意しなければならないのは、ボタンを押してからおしゃべりするまでのタイムラグが数秒（最大10秒程度）あるため、リアルタイムでおしゃべりさせたい用途には向かない
そういった用途には有線のやつ（[RaspberryPiを使ってチャイム（呼び鈴）を作る](https://qiita.com/inaBowBow/items/65115f9a66165590ae01)）を活用するべきであろうと思います！
Git上のGradleプロジェクトをEclipseにインポート

仕事で使うのはSVN、MavenばっかりなSierですが、今回はGitに上がっているGradleプロジェクトをEclipseへインポートする方法を備忘録としてメモしていきます。

~~たまにAntすらない原始時代のようなプロジェクトもありますがね~~:scream_cat:

環境
--

* Git
    * リモートリポジトリは仮想環境にて用意。今回はGitHubを使用しません。
* Eclipse
    * STS 3.9.6を使用
* gradle
    * Eclipseに同梱しているプラグインを使用します。

選択
--
![1.png](https://qiita-image-store.s3.amazonaws.com/0/295858/f1787d9d-2f0f-e86b-e2af-1f83ee9f5185.png)
ここは普通に**Gitからプロジェクト**で進めていきます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/295858/c4a5db03-d607-b57a-339e-7399a97cefd2.png)
**クローンURI**でローカルリポジトリもこのタイミングで作っていきます。

リポジトリー
--
![3.png](https://qiita-image-store.s3.amazonaws.com/0/295858/4b7f67bc-b3e6-c27b-e2ed-9bf22118ca98.png)
リモートリポジトリは**SampleGradle.git**で用意しています。
他の入力欄はよしなに。。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/295858/35db9f8d-b87d-88ea-1f8a-702b1657f876.png)
ローカルリポジトリは自分が普段使っている所定の場所に落とします。

Eclipseプロジェクト生成
--
![5.png](https://qiita-image-store.s3.amazonaws.com/0/295858/53286f27-c031-e7c0-3362-f913f2bc1c5b.png)
ここでは一旦、**一般的なプロジェクトとしてインポート**します。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/295858/e2bfd297-ce3f-3c29-94aa-1e7aaf6ad283.png)
出来上がったのは、混じりっけなしの本物のプロジェクトです。GradleはおろかJavaプロジェクトとすら認識していません。

プロジェクトの変換
--
![7.png](https://qiita-image-store.s3.amazonaws.com/0/295858/781ddbb8-67a3-67c2-80d1-466e525a389f.png)
ここで、プロジェクトを**Gradleネーチャーの追加**でGradleプロジェクトへ変換します。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/295858/ac2f551f-c976-7860-10b8-9b5aa2e38329.png)
完成です。