OmniAICreator/Qiita-1.07M huggingface dataset:
Iteratorの回しかた道場 (Java)

# Iteratorを使う
Iteratorが取り出せるほとんどのケースにおいてその持ち主はIterableインターフェースが実装されているので、Iteratorを使わずとも拡張for文でループを回すことができます。

しかし、[math3のConbinations](https://commons.apache.org/proper/commons-math/javadocs/api-3.6.1/org/apache/commons/math3/util/Combinations.html)のように、Iteratorのみが構えられたAPIも一部存在するため、
今回は拡張for文を使用せずに、あえてIteratorを使ってループを回してみます。

## `Iterator<T>`の主要メソッド
|メソッド|機能|
|---|---|
|T next()|次の要素を取り出す|
|boolean hasNext()| 今の状態から見て、次の要素を取り出すことができる場合はtrueが返ってくる|

Iteratorは要素を順繰りになぞっていくためのインターフェースです。
`next()`メソッドの呼び出しによって要素を取り出すことができます。
「`hasNext()`がtrueを返してくる間だけ、`next()`を呼び出し続けて処理を行う」というのが一般的な使い方です。

Iteratorは内部状態を持っていて、`next()`を使って要素を取り出す毎にその内部状態が変化してゆきます。最後の要素を取り出した直後には`hasNext()`がfalseを返してきます。
Undoや初期状態に戻すようなメソッドは定義されていないため、**使い捨て前提**のインターフェースです。

（しないと思うけど）Iteratorを自作する場合は気をつけてくださいね。

# Iteratorを使ったコード
前置きが長くなってしまいましたがコードです。
while文とfor文の2通りを挙げます。

## while文による回し方
```java
Iterator<String> itr = list.iterator();
while(itr.hasNext()){
  String str = itr.next();
  System.out.println(str);
}
```

## for文による回し方
```java
for(Iterator<String> itr = list.iterator(); itr.hasNext();){
  String str = itr.next();
  System.out.println(str);
}
```

個人的には変数のスコープが狭くなってくれるfor文のほうを好んでいます。
ZOHO CREATOR覚え書き【回答に応じて表示するフィールドを必須にしたい】

別のアンケート収集案件が始まってしまったので、小出しで覚書を投稿します。
今回の条件は、「回答に応じて表示するフィールドを必須にしたい」。
必須、というところがポイントです。

##条件
Q1がラジオボタン3択。
Q1でAを選んだ人だけに「Q2」を表示してさらに「必須」にしたい。

##作成方法
###フォームを作る
![20191010-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427001/088625fc-dcbc-cac4-4852-cc93b71dea24.jpeg)
※Q2を必須にするのを忘れずに。

###ワークフロー
(1)常に項目を隠す⇒Q2を非表示に
![20191010-02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427001/04a62e9e-4c23-a0c3-1bec-9cc09dd97dbb.jpeg)



(2)Q1でAが選択されたなら
![20191010-03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427001/c1aa4ac1-d255-0eef-40bc-908155892f89.jpeg)

⇒Q2を表示
![20191010-04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427001/82d8741d-cb22-2015-e304-cc2d54e3756d.jpeg)


ここまでは簡単！超簡単。
ですが、これで送信しようとするとエラーが出ることがあります。
Q1でB、Cを答えた時です。

質問は見えないにも関わらず、
「必須なんだからQ2に入力しろよ！」とのメッセージが出てしまうわけですね。。。
質問はhiddenされてるのに。

さて、これはちょっと工夫しただけで解決ができましたのでさっそく答え合わせ。

##成功例
- Q2を非表示に
- Q1のAを選択した時にQ2を表示にする
- Q1の回答がAではない時（not equal to）、Q2に値を入れる。

⇒Q2はフォーム上は非表示だが、フィールドとしては存在しているので、今回は「回答対象外」と入れるようにしてみた。もちろん「-」などでもよい。
こうすることで、Q1でB、Cを選んだ人にはQ2を表示することなく、「必須」の条件も満たすことができます。

![20191010-11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427001/666408a0-ab59-0d27-b39f-e4ace93aff63.jpeg)


##画面1、アプリにアクセスしたとき
![20191010-09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427001/7796451a-b8c0-83eb-c264-854bc3a19d32.jpeg)

##画面2、Aを選んだ時
必須の一行テキストが表示される。
![20191010-10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427001/6d0a97e4-b4c7-cb4a-675a-f2c5ab4d0fd6.jpeg)

##画面3、B（またはC）を選んだ時
![20191010-11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427001/9463ab4d-d8bb-be0f-48dc-2c6b8f9029d6.jpeg)


これで解決できました。
<% %>と<%= %>の違い

#目的
Ruby on railsでアプリケーションを開発する際によく使う書き方だがそれぞれの役割を認識していないため

#<% ～ %>と<%= ～ %>の役割
```ruby:例
<% price = 80000 * 1.05 %>
<p>
こちら物件の家賃は<%= price %>円です。
</p>
```
#####<% ~ %>の役割
Rubyコードを記述するときに使用する。
結果を出力しない計算や繰り返し処理を書くときに使用する。

#####<%= ~ %>の役割
Rubyコードを記述するときに使用する。
文字列を出力するような処理を書くときに使用する。
CentOS 7にOpenJDK 13をインストール（Zulu Community）

# はじめに

Zulu Communityを利用してCentOS7にOpenJDK13をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2023-03がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# rpm --import http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems
# curl -o /etc/yum.repos.d/zulu.repo http://repos.azulsystems.com/rhel/zulu.repo
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

# yum install -y zulu-13 which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "13" 2019-09-17
OpenJDK Runtime Environment Zulu13.27+9-CA (build 13+33)
OpenJDK 64-Bit Server VM Zulu13.27+9-CA (build 13+33, mixed mode, sharing)
```
CentOS 7にOpenJDK 11をインストール（Zulu Community）

# はじめに

Zulu Communityを利用してCentOS7にOpenJDK11をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2027-09がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# rpm --import http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems
# curl -o /etc/yum.repos.d/zulu.repo http://repos.azulsystems.com/rhel/zulu.repo
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

# yum install -y zulu-11 which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.4" 2019-07-16 LTS
OpenJDK Runtime Environment Zulu11.33+15-CA (build 11.0.4+11-LTS)
OpenJDK 64-Bit Server VM Zulu11.33+15-CA (build 11.0.4+11-LTS, mixed mode)
```
CentOS 7にOpenJDK 8をインストール（Zulu Community）

# はじめに

Zulu Communityを利用してCentOS7にOpenJDK8をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2026-03がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# rpm --import http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems
# curl -o /etc/yum.repos.d/zulu.repo http://repos.azulsystems.com/rhel/zulu.repo
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

# yum install -y zulu-8 which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (Zulu 8.40.0.25-CA-linux64) (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (Zulu 8.40.0.25-CA-linux64) (build 25.222-b10, mixed mode)
```
CentOS 7にOpenJDK 7をインストール（Zulu Community）

# はじめに

Zulu Communityを利用してCentOS7にOpenJDK7をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2023-07がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# rpm --import http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems
# curl -o /etc/yum.repos.d/zulu.repo http://repos.azulsystems.com/rhel/zulu.repo
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

# yum install -y zulu-7 which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.7.0_232"
OpenJDK Runtime Environment (Zulu 7.31.0.5-CA-linux64) (build 1.7.0_232-b6)
OpenJDK 64-Bit Server VM (Zulu 7.31.0.5-CA-linux64) (build 24.232-b6, mixed mode)
```
CentOS 6にOpenJDK 13をインストール（Zulu Community）

# はじめに

Zulu Communityを利用してCentOS6にOpenJDK13をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2023-03がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# rpm --import http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems
# curl -o /etc/yum.repos.d/zulu.repo http://repos.azulsystems.com/rhel/zulu.repo
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y zulu-13 which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "13" 2019-09-17
OpenJDK Runtime Environment Zulu13.27+9-CA (build 13+33)
OpenJDK 64-Bit Server VM Zulu13.27+9-CA (build 13+33, mixed mode, sharing)
```
macOS Catalinaで旧バージョンのVMware Fusionを動かす方法

macOSをCatalina(10.15)にアップデートしたらVMware Fusionの画面が真っ黒になって焦った時のメモ

# いきなり結論
- **VMware Fusion 11.1.0**に一旦アップデートする
- 画面収録のアクセス許可を求められるので**"システム環境設定"を開く**を選択
![スクリーンショット 2019-10-10 21.01.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83747/ff6bf1b8-de1e-3d99-cb48-b28dd1863db3.png)
- **システム環境設定 / セキュリティとプライバシー / プライバシー / 画面収録** の**VMware Fusion.app**にチェック
![スクリーンショット 2019-10-10 21.37.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83747/b29b28dc-e4b8-f6fa-73da-d0048cc044d2.png)
- 旧バージョン(`8.5.10`や`10.1.6`など)をインストールし直す

これで画面表示されるハズ。

ポイントは `11.1.0` じゃなきゃダメなところです。
`11.1.1`とか`11.5.0`だと画面収録に**VMware Fusion.app**が出てきません。

# 最後に
素直に`11.5.0`を買いましょう
CentOS 6にOpenJDK 11をインストール（Zulu Community）

# はじめに

 Zulu Communityを利用してCentOS6にOpenJDK11をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2027-09がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# rpm --import http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems
# curl -o /etc/yum.repos.d/zulu.repo http://repos.azulsystems.com/rhel/zulu.repo
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y zulu-11 which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.4" 2019-07-16 LTS
OpenJDK Runtime Environment Zulu11.33+15-CA (build 11.0.4+11-LTS)
OpenJDK 64-Bit Server VM Zulu11.33+15-CA (build 11.0.4+11-LTS, mixed mode)
```
CentOS 6にOpenJDK 8をインストール（Zulu Community）

# はじめに

 Zulu Communityを利用してCentOS6にOpenJDK8をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2026-03がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# rpm --import http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems
# curl -o /etc/yum.repos.d/zulu.repo http://repos.azulsystems.com/rhel/zulu.repo
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y zulu-8 which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (Zulu 8.40.0.25-CA-linux64) (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (Zulu 8.40.0.25-CA-linux64) (build 25.222-b10, mixed mode)
```
Solaris　ISOマウント

複数コマンドを打つことでマウントが出来る

```
# lofiadm -a ファイル名`
/dev/lofi/1
# 
# lofiadm
Block Device             File
/dev/lofi/1              *****.iso
#
# mount -F hsfs /dev/lofi/1 マウントポイント
# lofiadm -d /dev/lofi/1 解除
```
CentOS 6にOpenJDK 7をインストール（Zulu Community）

# はじめに

Zulu Communityを利用してCentOS6にOpenJDK7をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2023-07がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# rpm --import http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems
# curl -o /etc/yum.repos.d/zulu.repo http://repos.azulsystems.com/rhel/zulu.repo
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y zulu-7 which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.7.0_232"
OpenJDK Runtime Environment (Zulu 7.31.0.5-CA-linux64) (build 1.7.0_232-b6)
OpenJDK 64-Bit Server VM (Zulu 7.31.0.5-CA-linux64) (build 24.232-b6, mixed mode)
```
VBAでループ中にエラー処理する

# やりたいこと
テキストファイルを開こうとしたときに、ファイルがなければ別のパスを設定して
再試行する処理を作りたい。

#　コード
```thisworkbook.vb
' ワークブックを開く時のイベント
Private Sub Workbook_Open()
    Dim path As String
    Dim filename As String
    
    path = "C:\Users\【username】\Desktop\test\test1\"
    filename = "新しいテキスト ドキュメント.txt"
    
    path = path_check(path, filename)
    
    If path = "" Then
        MsgBox "patherror"
        Exit Sub
    End If
    
    filepath = path + filename
    n = FreeFile
    Open filepath For Input As #n
    
    Do While Not EOF(n)
        i = i + 1
        Line Input #n, txtLine
        Cells(i, 1).Value = txtLine
    Loop
    
    Close #n
    
End Sub
```

```module1.vb
Option Explicit


Public Function path_check(path, filename)

    Dim i As Integer
    Dim pathflg As Integer
    Dim open_result As Boolean
    Dim FSO As Object
    Dim TextFile As Object
    pathflg = 0
    
    For i = 0 To 3
        open_result = True
        On Error GoTo ErrLabel
        Set FSO = CreateObject("Scripting.FileSystemObject")
        Set TextFile = FSO.OpenTextFile(path + filename)
        
        If open_result = True Then
            GoTo success
        End If
        
    Next i
    
ErrLabel:
    open_result = False
    Select Case pathflg
        Case 0
            path = "C:\Users\【username】\Desktop\test\test2\"
        Case 1
            path = "C:\Users\【username】\Desktop\test\test3\"
        Case 2
            path = ""
        Case Else
            path_check = ""
    End Select
    pathflg = pathflg + 1
    Resume Next

success:
    path_check = path

End Function

```
初心者によるプログラミング学習ログ122日目



# 100日チャレンジの122日目

Twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

122日目は、




<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>122日目<br><br>・UdemyとドットインストールでVue.js<br>・メンターさんのjavascriptの課題<br>・チュートリアルを参考に、photoshopでオリジナルバナー作成<br><br>なんかいろいろやった気がする<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#webデザイン</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1180956300009594880?ref_src=twsrc%5Etfw">October 6, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


# 学習したことの一部

```index.html
<!--複数インスタンスの書き方-->
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="main.css">
    <title>Document</title>
   
</head>
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <div id="app1">
   <p>{{message}}</p>
  </div>
  <div id="app2">
    <P>{{message}}</P>
    <button @click="changeMessage1">インスタンス1のmessageを変更</button>
  </div>

 <script>
   var vm1 = new Vue ({
     el: '#app1',
     data: { 
       message: 'インスタンス1'
     }
   })

   var vm2 = new Vue({
     el: '#app2',
     data: {
       message: 'インスタンス2'
     },
     methods: {
       changeMessage1: function() {
         vm1.message = 'インスタンス2から変更'
       }
     }
   })
  </script>
 </body>
</html>

```

new Vueでも複数インスタンスつくることは可能。
ただし、なるべくなら同インスタンス内で処理するのが理想。
[Oracle Cloud] デフォルト・タグを設定して、野良リソース対策する

# モチベーション
「 [Oracle Cloud Blog - Using default tags to identify who created resources](https://www.oc-blog.com/2019/09/29/using-default-tags-to-identify-who-created-it/)  」の記事を見て、これはいいと思ったのでやってみた。

# 参考
[Using default tags to identify who created resources](https://www.oc-blog.com/2019/09/29/using-default-tags-to-identify-who-created-it/)

# 結果
ブログ記載の内容そのままやって、できた！
( コスト・トラッキングのチェックはつけておいた方がいいと思う。)

# やったこと
[適用を想定する状況]

* とあるコンパートメントを開発者に開放するとする
* 利便性のため、開発者に、そのコンパートメントに対してリソースの作成権限 (manage) 権限を委譲しているものとする
* それぞれの開発者たちに個人アカウントを付与しており、共有アカウントは使ってないものとする
* そのコンパートメントにデフォルト・タグを定義して、タグ指定しない場合に、作成者の名前が入るようにする

## コンパートメントを作成
1. メニュー→ [アイデンティティ] → [コンパートメント] → [コンパートメントの作成]ボタンを押下
2. "DEV"コンパートメントを作成する

## デフォルト・タグの作成
1. メニュー→ [ガバナンス] → [タグ・ネームスペース] → [ネームスペース定義の作成]ボタンを押下
 * 作成するコンパートメントに、ルートを指定。
 * ネームスペース定義名に"OWNER"と入力(名前は任意)
 * 説明に、任意の説明文を入力

![tag01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/5ac79786-1a77-52ed-bbf7-9137dc0bc656.png)

2. 作成されたネームスペースのリンクを押下 → [タグ・キー定義の作成]ボタンを押下
 * タグ・キーに、CREATORと入力。(名前は任意) 
 * 説明に、任意の説明文を入力
 * コスト・トラッキングにチェックする
 * タグ値のタイプに、任意の文字列を選択

![tag02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/d1b6f306-b911-1131-36a9-4c84f525e9dc.png)

## コンパートメントにデフォルト・タグを適用する

1. メニュー→ [アイデンティティ] → [コンパートメント] → "DEV"コンパートメントのリンクを押下
2. [タグのデフォルト]のリンクを押下

![tag03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/42f616de-05bf-0ac1-fe42-a5c4af4a8ddf.png)

3. [タグのデフォルトの作成]ボタンを押下
 * タグ・ネームスペースから、"OWNER"を選択。タグ・キーから、"CREATOR"を選択。
 * 指定されたデフォルト値に、**${iam.principal.name}** を入力

![tag04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/b8990367-9eaa-89a6-dca0-6d7ce032b521.png)

※ そのほかに指定できるタグ変数は、以下 (参考：[Managing Tags and Tag Namespaces](https://docs.cloud.oracle.com/iaas/Content/Identity/Concepts/taggingoverview.htm))

* ${iam.principal.name} - The name of the principal that tagged the resource.
* ${iam.principal.type} - The type of principal that tagged the resource.
* ${oci.datetime}	      - The date and time that the tag was created.

以上で設定は完了。

## 確認する
1. DEVコンパートメントにComputeインスタンスを作成する。(作成時にタグ指定しない)
2. インスタンスの詳細ページから「タブ」を開く。
 * 作成者の名前がタグ値に設定されていること
 * コストトラッキングのマークがついていること ( お札マーク )
![tag05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/2028fc87-ecf3-d92b-9260-e7b3bfd5aa03.png)
3. 半日くらいたった後に、メニュー→[アカウント管理]→[コスト分析]で、タグキーとタグ値を指定すると、タグ値(作成者)単位での課金状況が確認できた。
![tag06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/e983622b-c274-6c75-b7e6-3e62cdb0d04f.png)
Vue CLIによるポートフォリオ作成での備忘録（リンク集）

#Vue CLIを使いたい
そんな思いのもとで、「そういえばポートフォリオ作ってない」と思いたち、製作しました。
今回はVue CLI関連の自分用備忘録として残しておきます。

#基礎知識
npmとは、Node.jsのパッケージ管理ツールで、Node.jsと一緒にインストールされる。
ビルドツールはnpmを使ってインストールできる。
※のちにyarnをオススメされる。yarnの方がインストール速度が速い。

【参考記事・書籍】
[記事：【JavaScript】ビルドとは何か〜webpackを使ってビルドする](https://qiita.com/yukibe/items/453d874eb7ce929363d6)
[記事：【Vue.js】Vue CLIでSPAプロジェクトを作成する](https://kiy-s.hateblo.jp/entry/2019/06/08/135452)
[記事：JavaScript Primer](https://jsprimer.net/intro/) ※js初学者万人にオススメ
[書籍：基礎から学ぶ Vue.js](https://www.amazon.co.jp/dp/4863542453?aaxitk=0kXJCbph4h5pUPPNMu.r6A&pd_rd_i=4863542453&pf_rd_p=1b1511df-b525-4a74-b79c-c8395c81af7d&hsa_cr_id=2937255360303&sb-ci-n=asinImage&sb-ci-v=https%3A%2F%2Fm.media-amazon.com%2Fimages%2FI%2F81KMZ8IzKSL.jpg&sb-ci-a=4863542453)

##環境
AWS Cloud9 ▶︎ VSCode
$ vue --version 2.9.6
$ npm -v 6.9.0


##エラー出現場所
###AWS Cloud9上でwebpack-dev-serverを起動させた時
Vue CLI2ver
https://qiita.com/tetsuya-zama/items/d6ffc28ed6d67abab037

Vue CLI3ver
https://upd.world/vue-cli-3-error/

###脆弱性の警告を受けたnpmパッケージがあるという警告
この直し方は以下の記事で解決。
found 10 vulnerabilities (6 moderate, 4 high)
  run `npm audit fix` to fix them, or `npm audit` for details
https://qiita.com/hibikikudo/items/0af352acac85fce28ec2


##主な使用技術
###ライブラリ
Vue-chartjs
グラフ描画ライブラリでおなじみChart.jsのラッパーを使用しました。
基本的な書き方はvue-chartjsの公式で、カスタマイズはChart.jsの公式で簡単にわかります。業務で一時期Highchart勢だったので日本語ドキュメントがとてもありがたい…。
簡単なのでオススメ。
https://vue-chartjs.org/ja/
https://misc.0o0o.org/chartjs-doc-ja/
https://qiita.com/kiyc/items/a94a202bf06fff644f62

###Sassの導入
SCSS語法で書いてみたく導入。
https://qiita.com/morocco/items/b1640cfdbe87817bd6a7

scopedをつけて該当コンポーネントのみ有効になるようにする。
https://vue-loader-v14.vuejs.org/ja/features/scoped-css.html

###リセットCSS
ress.css
どれがいいのかわからず迷いましたがReset.cssとNormalize.cssのいいとこ取りのようだったのでこれにしました。
npm install --save ress
https://webdesign-trends.net/entry/8137#i

mixinの作り方
https://qiita.com/nekoneko-wanwan/items/c8498a21ae0e2b2198be

css、以下も参考。
・beforeとafterの使い方
https://saruwakakun.com/html-css/basic/before-after

###ビルド時
https://qiita.com/tiwu_official/items/43dc554ec43dd951812a


##Firebaseでフォーム作成
###Firebaseでログイン時詰まった
Cloud9だとこういうところが詰まりやすい（のちにvscodeに移行）
https://blog.f-arts.work/archives/817


Firebase initでのエラー
https://qiita.com/k3ntar0/items/b151034026c8f4a0f447

これをもとに作成
https://qiita.com/ryo2132/items/7cdd6c86dd418095f74a

##後ほど使うかもしれない
###表示速度向上
https://qiita.com/renoinn/items/5cab5bed585b413522db
macOS CatalinaからNFS exportsするには

自分はmacOSを母艦にVirtualBoxにCentOSをいれて開発してたりするんですが
phpなどのソースコードはローカルのmacOS上に置いてNFS exportをし、
CentOSからNFS mountさせています。
ので、ローカルをいじると仮想サーバ上もファイルが更新されているってことに
なってて自分的には使いやすい。

最近出たmacOS CatalinaにUpgradeしたところ、どうもmacOSからのNFS exportが
出来ないようになっていて、仮想サーバでmount出来ない現象にハマしました。

NFS exportしてるディレクトリは
/Users/imaiworks/Documents/workspace
なのですが、これがどうもうまく行かない・・

```
# cat /etc/export
/Users/imaiworks/Documents/workspace   -maproot=root -network 192.168.0.0 -mask 255.255.0.0
```

nfsd checkexportsをしてみると

```
# nfsd checkexports
exports:1: exported dir/fs mismatch: /Users/imaiworks/Documents/workspace  /System/Volumes/Data
```
とmismatchだそうで
はて？？

どうもNFS exportsする際は実際のディレクトリ名ではなく ``/System/Volumes/Data`` を辿った先でないといけないようで
``/System/Volumes/Data``をみるとほぼ / と同じものが存在しました。

ということで
/System/Volumes/Dataを追加することで

```
/System/Volumes/Data/Users/imaiworks/Documents/workspace  -maproot=root -network 192.168.0.0 -mask 255.255.0.0
```

```
# kill -s HUP `cat /var/run/mountd.pid`
# showmount -e localhost
Exports list on localhost:
/System/Volumes/Data/Users/imaiworks/Documents/workspace 192.168.0.0
```
無事NFS exportできるようになりました。

もちろんNFS mountする側も

```
/bin/mount 192.168.56.1:/System/Volumes/Data/Users/imaiworks/Documents/workspace       /var/wwwmac/workspace
```
てな感じで/System/Volumes/Dataを追加してあげることになります。


iOS13やらOSの変化が大きい昨今、
もっととんでもない対応をしなきゃいけないのかとちょっとビビってしまったけど、
/System/Volumes/Dataを付与するだけで良かったので安心しました。




とても参考になりました！
https://kohju.justplayer.com/Tips_MacOSX_calalina10.15.html
ありがとうございます！！
[Mac] Ping-tの「次へ」「戻る」…等のショートカット

Ping-t
https://ping-t.com/

Mac+Safari/Chrome環境下でのショートカットキーによる操作
<img width="547" alt="スクリーンショット 2019-10-10 20.35.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145192/8061bf91-a01c-be81-ea2e-ff32647f4ee6.png">




|操作       |       キー |
|:-----------------:|:------------------:|
| 戻る             |control + option + p|
| 次へ           |control + option + n|
| 正解             |control + option + a|
| メモ               |control + option + m|
| チェック1             |control + option + c|
|チェック2          |control + option + v|
【Swift】モジュール

#モジュールとは
モジュールとは複数のソースコードなどの配布可能なプログラムのことを指します。
これはRubyでいうgemみたいなもので、他のプログラムへのインポートが可能です。

##作成方法
モジュールの作成方法にはフレームワークとアプリケーションの二つがあり、前者は他のプログラムから使用されることを前提に作成され、後者は単独で実行可能です。双方のモジュール共に複数のファイルから構成されます。
そのためあるプログラムをフレームワークとしてまとめる事で、複数のプロジェクトで同じコードを記述する必要が無くなります。

###フレームワーク
フレームワークとは、モジュールやリソース、コード著名といったプログラムを配布して再利用するために必要となるものを、１つのパッケージとしてまとめたものです。
<img width="729" alt="スクリーンショット 2019-10-08 22.00.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/73d281f1-2a99-3ba1-4039-c618fa772219.png">
フレームワークを作成するには、まずxcodeを開いて「create a new xcode project」を選択肢以上のようなウィンドウが表示されたら、フレームワークを選択し、「NEXT」を押します。
<img width="729" alt="スクリーンショット 2019-10-10 19.52.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/d6cc61bf-9802-b2c0-c088-6f9ef5fe5157.png">
そして次のウィンドウで必要項目を入力して完了です。

###アプリケーション
アプリケーションとは、単独で実行可能なプログラムのことを指します。例を出すと、皆さんが利用するテキストエディタやゲームなどのiOSアプリなどが挙げられます。つまり普段何気なく使っているアプリの類のものは、モジュールとしても分類できるということになります。
<img width="729" alt="スクリーンショット 2019-10-10 20.00.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/d0772740-f36f-8dc2-8590-b17f8db08eae.png">
作成方法は先ほどとほとんど同じで、違う点は「Single View App」を選択するということです。

##名前空間
名前空間とは変数や定数などの名前が唯一無二のユニーク性を保てる範囲のことを指し、同じ名前の物が複数できることを防いでいます。
モジュールはその名前空間を区切る単位にもなっており、同じモジュール内では別のファイルの要素でも自由にアクセスできるため、基本的に同名の要素は使えません（引数など名前以外の別要因で差別化できない場合)。一方別モジュール同士の場合は、モジュールをインポートすることで同盟の要素でも使用できます。

```
//以下の文を宣言することでインポート可能
import モジュール名
```
先ほど別モジュール同士の場合は同名の要素を使用できると言いましたが、もちろん定義が曖昧で区別ができない場合はコンパイルエラーを引き起こします。
そのため、その名前の競合を防止するため以下のように使用することが可能です。

```
モジュール名.定数名
```
モジュール名と一緒に定数名を記述することで、他の要素と差別化できます。
PHP 7.3.10 on CentOS 8

# Install PHP 7.3.10 on CentOS 8

CentOS 8 comes with PHP 7.2 by default, you can check with this command:

```bash
dnf info php
```
We need use a third-party repository for install PHP 7.3.x 

## 1. Enable EPEL repository
```bash
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
```

## 2. Install REMI repository
```bash
dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
```

## 3. Install PHP 7.3.x

Check which versions of PHP are available:

```bash
dnf module list php
```

Output:

```
CentOS-8 - AppStream
Name     Stream          Profiles                      Summary
php      7.2             common [d], devel, minimal    PHP scripting language

Remi's Modular repository for Enterprise Linux 8 - x86_64
Name     Stream          Profiles                      Summary
php      remi-7.2        common [d], devel, minimal    PHP scripting language
php      remi-7.3 [e]    common [d], devel, minimal    PHP scripting language
php      remi-7.4        common [d], devel, minimal    PHP scripting language

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
```

Enable PHP 7.3 module to install PHP 7.3.x

```bash
dnf module enable php:remi-7.3 -y
```

Install PHP 7.3.x

```bash
dnf install -y php php-cli php-common
```

## 4. Check PHP Version

```bash
php -v
```

Output:

```bash
PHP 7.3.10 (cli) (built: Sep 24 2019 09:20:18) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.10, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.10, Copyright (c) 1999-2018, by Zend Technologies
```
JavaScriptでJSONの使い方

#PythonでJSONの作り方を書いたのでJavaScriptでJSONの書き方を書いてみます。

これは通常当たり前に使っているとは思いますがJSONはJavaScriptだと連想配列が簡単にできるためいろんな事ができます。
では書いてみます。
##JavaScriptでJSON作成
```javascript:JavaScriptでJSONを作ってみる
//連想配列の作成
var str_json = {};

//連想配列にキー値とデータを作る
str_json["foo"] = "abc";
str_json["bar"] = "def";
str_json["hoge"] = "100";

//JSON化する
var json=JSON.stringify(str_json);
```
連想配列を作るだけでJSONを作ることができます。
実際の場合は連想配列は二次元配列化されるようになります。
JSON.stringify(str_json)は連想配列からJSON化していることがわかります。
<strong>実はつい最近やらかしまして{}で処理しないといけないところを[]で処理してしまいました。</strong>

##JavaScriptでJSON.parse
JSONのパースは良く使います。
ajaxの戻り値がREST APIなどを使うとJSONが戻り値になっているので覚えておくと便利ですが。
値のとり方まで書いておこうと思います。

```javascript:JavaScriptでJSONをParseする
//JSONをParseする
var ret_JSON = JSON.parse(json);

//値の取得
function(ret_JSON){
    var foo = ret_JSON["foo"];
    var bar = ret_JSON["bar"];
    var hoge = ret_JSON["hoge"];
}
```
JSONをパースするときには連想配列を作り値を取得するということを覚えておくと便利です。
JSON.parse(json)はJSONをパースするときに使いますが実際のところは（）の中はajaxの戻り値になるので覚えておいてください。
ここを間違えるとデータが戻ってきているかを確認が必要になりますので気をつけてください。
LeetCode No.1 TwoSum

就活に向けて、LeetCodeでアルゴリズムを勉強しようと思います。
これから毎日LeetCodeのProblemを解題し記録します。

まず Top 100 Liked Questions から始めたいと思います。
順番としては、Easy -> Medium -> Hardとなります。

では、本日のTaskはNo.1 TwoSumです。
参考：[leetcode twosum](https://leetcode.com/problems/two-sum/)
> Given an array of integers, return indices of the two numbers such that they add up to a specific target.
> You may assume that each input would have exactly one solution, and you may not use the same element twice.
> Example:
> Given nums = [2, 7, 11, 15], target = 9,
> Because nums[0] + nums[1] = 2 + 7 = 9,
> return [0, 1].

**解答1**
時間計算量：O(n)
空間計算量：O(n)

```python3:python3code
    def twoSum(self, nums: List[int], target: int):
        i = 0
        while i < len(nums):
            if i == len(nums)-1:
                return "no result"
            wanted = target - nums[i]
            rest = nums[i+1:]
            if wanted in rest:
                return [i, rest.index(wanted)+i+1]
            i = i+1
```
pythonのlist型の特性を利用し、list[i+1:]の中でtarget-nums[i]を探します。
またlist.index()を使うのも便利ですね。
結果は下記となります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415428/05f90ab5-dafc-4128-aca9-4469b61f7016.png" width=50%>

**解答2**

```python3:python3code
    def twoSum(self, nums: List[int], target: int):
        i = 0
        dict = {}
        while i < len(nums):
            if nums[i] in dict:
                return [dict[nums[i]], i]
            else:
                dict[target-nums[i]] = i
            i = i+1
```
pythonの辞書型を利用します。空間計算量が少し増えますが、実行時間がより速くなります。
結果は下記となります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415428/cff44ad1-cabf-888d-4424-c3320d936f02.png" width=50%>

以上です。C言語版はまた今後時間がある時に補足します。
モバイルアプリマーケティングの究極のガイド

![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512161/d8091e53-9d39-0554-372c-5b7818a56f96.jpeg)
アプリを作成した場合、ほとんどの作業が完了したと思われるかもしれません。しかし、あなたはとても間違っています。アプリをリリースすると、同じアプリの巨大な市場があり、顧客は選択する必要があります。もちろん、あなたはそれをあなたのアプリにしたいのです。そのため、モバイルアプリを適切に宣伝するためにより多くの作業に直面する必要があります。

アプリを起動する前に、2か月前にいくつかの重要な手順を実行することをお勧めします。
1.アプリのWebサイトを作成します。潜在的なユーザーがアプリに関する情報を見つけることができる最も重要なリソースになります。
2.アプリケーションの価値の小道具を明確かつ簡潔に強調するデモビデオを作成します。あなたがそれに着くとき、私たちは視覚的な生き物です。実際、人間の脳はテキストよりも60,000倍速くビジュアルを処理します。
3. Googleがウェブサイトとコンテンツを取得するまで通常60〜90日かかるため、SEOの取り組みを開始日の少なくとも60日前に開始することが絶対に重要です。そのため、アプリを起動するときにいくつかのキーワードのランク付けを行うのが黄金律です。そして、成長段階でもこの戦略を続けます。
4.ユーザーの33％は、信頼するか、オンラインでフォローしている人から推奨されたため、アプリケーションをダウンロードしたと答えています。そのため、ソーシャルメディアと直接的なインフルエンサーをアプリマーケティングプランの一部にすることは有益です。インフルエンサーマーケティングも重要な理由です。
5.アプリに関連するLinkedinおよびFacebookグループに参加します。ここでは、グループに関する権限を構築するのに役立つヒント、チュートリアル、業界の洞察、専門家の意見などを投稿できます。
これは、モバイルアプリを宣伝してダウンロード数を増やすために行う方がよいことのほんの一部です。もっと読むことができます https://comboapp.com/insights/mobile-app-marketing-ultimate-guide/。
RSpecでテストしたときに、MySQLに接続できないよ！というエラーがでたら

##はじめに
RSpecでテストしたいけど、`Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)`というエラーがでて、テストできない（汗）という経験がありましたので、解決策をまとめてみました。

##環境
・MacOS High Sierra バージョン10.13.4
・RSpec 3.8
・MySQL Ver 8.0.17 for osx10.13 on x86_64 (Homebrew)

##ターミナルでrspecと入力したら、エラーがでた
**エラーメッセージ**
`Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)`

###◆解決方法
１、`sudo mysql.server start`を入力
２、パスワードを求められるので、管理者パスワードを入力
３、`Starting MySQL SUCCESS!`とでれば成功です。

##おわりに
ぼくの場合、`mysql.server start`をしても、ずっとエラーになってMySQLが起動できず、調べても調べても解決策が見つからないときがありました。
そんなときに`sudo`を追加すればいいと知ったときは、目からウロコでした。


###参考
・[MySQL 8.0 Reference Manual_4.3.3 mysql.server — MySQL Server Startup Script](https://dev.mysql.com/doc/refman/8.0/en/mysql-server.html)
・[Apple_ターミナルでのコマンドの使い方。(超初心者向け)_sudoコマンド](https://discussionsjapan.apple.com/docs/DOC-1061)
GPUが使えるLightGBMをWin10にインストールする

結構詰まったので、うまく行ったときの方法をメモ。

# 環境

- Windows 10 1903
- python 3.7.3
- CUDA 10.1
- Visual Studio 16 2019
- git 2.21.0.windows.1
- boost 1.71.0
- cmake 3.15.2
- lightgbm 2.3.1


# 手順

基本は[公式ドキュメント](https://lightgbm.readthedocs.io/en/latest/Installation-Guide.html#id18)通りにすればよいが、公式ドキュメントのコピペで済まない部分もあったりするのでメモ。

## 1. CUDA, Visual Studio, Git, Cmake, Boost等のインストール

公式ドキュメント通りやればよい。つまり、例えば

1.  [Git for Windows](https://git-scm.com/download/win)、[CMake](https://cmake.org/)、[Visual Studio](https://visualstudio.microsoft.com/ja/downloads/)をインストールする
2.  NVIDIAなら[CUDA Toolkit](https://developer.nvidia.com/cuda-downloads)を入れる
3.  [Boost](https://bintray.com/boostorg/release/boost-binaries/_latestVersion#files)を入れる（Visual Studio 2019なら`msvc-14.2-64.exe`のバージョンを選ぶ）

といった感じ[^1]。

### 気をつけたほうがいいかもしれないポイント：

- BoostはBuildせず、公式ドキュメント通りexeファイルでインストールしたほうが楽
  - Buildしても`lib64-msvc-14.2`ディレクトリは生成されない。
  - そうなると公式ドキュメント通りの入れ方ができなくなる。（おそらく若干パスの指定が変わるだけだが、私には知識がないのでbuild時のパスはわからない…）


## 2. LGBMのビルド

### :a: GitHubからbuildする場合

公式ドキュメント通りやればよくて、例えばVisual Studio 16 2019ならGit Bash等で以下を実行する。

```bash
git clone --recursive https://github.com/microsoft/LightGBM
cd LightGBM
mkdir build
cd build
cmake -A x64 -DUSE_GPU=1 -DBOOST_ROOT=C:/local/boost_1_71_0 -DBOOST_LIBRARYDIR=C:/local/boost_1_71_0/lib64-msvc-14.2 ..
cmake --build . --target ALL_BUILD --config Release
```

そしてpythonライブラリをインストールする。powershell等で以下を実行すればよさそう。

```
# python-packageに移動（以下ではbuildに居ることを想定）
cd ../python-package
# インストール
python setup.py install --precompile
```

- 参考：[LightGBM GPU Tutorial — LightGBM 2.3.1 documentation](https://lightgbm.readthedocs.io/en/latest/GPU-Tutorial.html#install-python-interface-optional)


### :b: pipからbuildする場合

公式ドキュメントには書かれていないが、boostを使う場合はboostのパスを指定して[^2]pip installする必要がある模様。

```
pip install lightgbm --install-option=--gpu --install-option="--boost-root=C:/local/boost_1_71_0/" --install-option="--boost-librarydir=C:/local/boost_1_71_0/lib64-msvc-14.2"
```

楽だが、pipよりもGitHubのほうが新しくてバグ修正などが進んでいるので現状はあまり意味がないように思える。GPUを使いたいだけの場合用。
（Google Colabは現在LGBMのGPUバージョンが入っていないのでColabでGPU使いたいときサクッとビルドするにはいいかも）


- 参考：[LightGBM/python-package at master · microsoft/LightGBM](https://github.com/microsoft/LightGBM/tree/master/python-package#build-gpu-version)



# 参考
- [LightGBM/python-package at master · microsoft/LightGBM](https://github.com/microsoft/LightGBM/tree/master/python-package)
    - ドキュメントよりGitHubのほうが情報が多い
- [Installation Guide — LightGBM 2.3.1 documentation](https://lightgbm.readthedocs.io/en/latest/Installation-Guide.html)


XGBoostのbuildについてはこちら：[GPUが使えるXGBoostをWin10にインストールする - Qiita](https://qiita.com/mitama/items/2c129ca5e6ce0aa5dd44)


[^1]: [MinGWでbuildするよりもVisual Studioでbuildしたほうが10倍高速らしいので、面倒でもVisual Studioを使ったほうがよさそう。](https://github.com/microsoft/LightGBM/blob/master/docs/FAQ.rst#8-cpu-usage-is-low-like-10-in-windows-when-using-lightgbm-on-very-large-datasets-with-many-core-systems)

[^2]: 公式ドキュメント通りの`pip install lightgbm --install-option=--gpu`だと`Could NOT find Boost (missing: Boost_INCLUDE_DIR filesystem system)`のエラーがlogに出た（関連して「MS Buildが見つからない」「VS Codeを入れろ」などのメッセージもでたが、これらは結局関係なかったっぽい）のでBoostの場所を指定する
clemson game online

https://clemsongameonline.com/
https://notredamegameonline.com/
https://eaglesliveonline.com/
https://seahawksvsvikings.com/
https://eaglesvsredskins.com/
https://ramsvscowboys.com/
https://bears-vspackers.com/
https://packersvsvikingslive.com/
https://seahawksliveonline.com/
https://billsvsjetslive.com/
https://broncosvsraiderslive.com/
画面の周囲にできる余白を消す

サイトを作成しようとすると、横や高さを１００％にしても白い余白ができてしまいます。
これを消すにはnomalize.css（ https://necolas.github.io/normalize.css/ ）を入れれば解決できそうです。
<img width="816" alt="スクリーンショット 2019-10-10 19.51.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501692/14ddb6ba-15d3-ee47-701a-b19c0c27b354.png">


これで無事、余白が消えました。
人事自動化 ATS Talentio の API で候補者一覧を取得する - Ruby 編

```ruby
require 'faraday'
require 'faraday_middleware'

ep = 'https://talentio.com'
# Token の取得方法については後述の資料を参照
token = 'token'

conn = Faraday.new(url: ep) do |b|
  b.response :json, :content_type => /\bjson$/
  b.adapter Faraday.default_adapter
end
conn.authorization :Bearer, token

response = conn.get do |req|
  req.url '/api/v1/candidates'
end
p response.body
```

## 資料
* [APIの利用 | Talentio Help Center](https://intercom.help/talentio/ja/articles/1957111-api%E3%81%AE%E5%88%A9%E7%94%A8)
ATOMパッケージ「Clip Lines」開発

# ATOMパッケージ「Clip Lines」開発

## きっかけ

ATOMを使ってはや１年。
とっても重宝してますが、ときおり頭をよぎるのは、これがあったらいいのになぁ。
いつかきっと・・・誰かがきっと・・・(開発終了疑惑もあるけど・・・)

## 機能

### 名称

Clip Lines

### 概要

ATOMでファイルを開いて行を選択して本機能を実行すると、ファイルパスと行番号付きでいい感じにクリップボードに保存してくれます。

## サンプル

path/to/openfileを開いて、行14-19を選択した状態で実行すると以下のようなテキストがクリップボードに保存されます。

```
path/to/openfile: 14-19

14| if (!e) {
15|   var e = window.event;
16| }
17| if (e.keyCode == 13) {
18|   return false;
19| }
```

## 関連サイト

[atom.package clip-lines](https://atom.io/packages/clip-lines)
[git](https://github.com/tokihidenori/atom-package-clip-lines.git)

## コンフィグ

- lineEndingCode
  コピーされるテキストの改行コードです。
  - 規定値: \n


- lineNumberSepalater
  行番号と行テキストの区切り文字です。
  - 規定値: |


- enableMarkDownFormat
  コピーされるテキストをマークダウン形式に加工します。
  - 規定値: true


- includeFilepathInMarkDownSyntaxHighlight
  マークダウンのシンタックスハイライトにファイルの拡張子を指定し、コードブロックにファイルパスを加えます。
  - 規定値: false

    > 設定時サンプル
    js:lib/clip-lines.js(7-16)
    7|     lineEndingCode: {
    8|       type: 'string',
    9|       default: "\n"
    10|     },
    11|     lineNumberSepalater: {
    12|       type: 'string',
    13|       default: "|"
    14|     },
    15|     enableMarkDownFormat: {
    16|       type: 'boolean',

- onlyIncludeProjectPath
  テキストに含めるファイルパスをプロジェクトルート以降のみとします。
  - 規定値: true

## パッケージ開発で使った主要なコマンド

※備忘用に記載してます。詳細は参考サイトをご覧ください。

### ・テストの実施

```
apm test
```

### ・開発モードへの切り替え

リリースしたパッケージに改修を加える場合などは開発モードでATOMを起動する必要がある。

#### 1. 開発モードで活用するパッケージのパスを設定

```
$ apm link --dev
~/.atom/dev/packages/clip-lines -> {path/to/develop}/copy-lines
```

#### 2. ATOMを開発モードで起動

```
$ atom -d
```

### ・パッケージ公開

※git管理と公開が前提条件です。

#### atom.ioにトークンを入力し、ログインする

トークンの発行にはatom.ioにアカウント登録する必要があります。

```
apm login
```

#### バージョンを0.1.0加算してタグが作成され公開

```
apm publish minor
```

#### バージョンを0.0.1加算してタグが作成され公開

```
apm publish patch
```

## 最後に

Javascriptが書ける人であれば比較的簡単にパッケージ作れるかと。
困った時は、本家の[APIドキュメント](https://flight-manual.atom.io/api)を見たり、類似する機能のリポジトリを[パッケージの一覧](https://atom.io/packages)参考にしながらなんとか開発しました。

「これがあったらいいのになぁ」からはじめてみてはいかがでしょう？

## 参考サイト

[Atom Documentation: instance-getSelectedScreenRange](https://flight-manual.atom.io/api/v1.9.4/TextEditor/#instance-getSelectedScreenRange)
[10分で学ぶ！Atomパッケージ自作入門](https://qiita.com/akisame338/items/034476debbd0ae251c0f)
[Atomでパッケージを作ってみた その3](https://qiita.com/tajihiro/items/f6e987ce49f5714e76cd)
[Atomのパッケージを作る(4) spec編](http://uraway.hatenablog.com/entry/2015/12/15/Atom%E3%81%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E3%82%8B%EF%BC%88%EF%BC%94%EF%BC%89spec%E7%B7%A8)
[Atomパッケージのテストを書いてみよう](https://qiita.com/Kesin11/items/a66a2b49571b05deb430)
[Atomパッケージの作成と公開のメモ](https://qiita.com/boukichi_numloc/items/8430d79bb7538eb67907)
[【Atom Editor】開発終了疑惑のまとめ](https://bookyakuno.com/atom-editor-end-of-development/)
コピペで使うFirebase【Cloud Storage編】

# 概要
storageを使う際にコピペで動かしたいのでそのまとめです。  

**公式ドキュメント**
------
[Storage](https://firebase.google.com/docs/storage/?hl=ja)

**目次**
------
[初期設定](#初期設定)
[アップロード](#アップロード)
[ダウンロード](#ダウンロード)
[ファイルを削除](#削除)

# 初期設定
インストール

```bash
$ npm install firebase --save
```

storage初期化

```js
import firebase from "firebase/app"

const firebaseConfig = {
    /* firebase config */
}

// 初期化は一度だけ
if (!firebase.apps.length) {
    firebase.initializeApp(firebaseConfig);
}
```

storage参照

```js
const storage = firebase.storage()
```

# アップロード
### **put()**

アップロードが成功すると画像までのURLが取得できる
**※ダウンロードURLをローカルDBやFirestoreへ保存しておく**

```js
storage
  .ref()
  .child(<ファイル名>または<ディレクトリー名>/<ファイル名>)
  .put(<ファイル>).then(snapshot => {
      // success
      const url = snapshot.ref.getDownloadURL();
      console.log(url) // ダウンロードURL
  }).catch(error => {
      // error
  });
```

### オプション
メタデータを追加  
[参考](https://firebase.google.com/docs/storage/web/file-metadata?hl=ja)

```js
const metadata = {
  contentType: 'image/jpeg',
};

storage
  .ref()
  .child(<ファイル名>または<ディレクトリー名>/<ファイル名>)
  .put(<ファイル>, metadata);
```

# ダウンロード
### **getDownloadURL()**

ダウンロードパスを取得

```js
storage
  .ref()
  .child(<ファイル名>または<ディレクトリー名>/<ファイル名>)
  .getDownloadURL()
  .then(function(url) {
    console.log(url) // ダウンロードURL
  }
```

# 削除
### **delete()**

削除したい画像のダウンロードURLを指定するだけ

```js
storage
  .refFromURL(<ダウンロードURL>)
  .delete().then(() => {
      // success
  }).catch(error => {
      // error
  });
```

# リサイズ
CloudFunctionsを使います
以下公式のサンプルをコピーして少し改良する
[firebase/functions-samples](https://github.com/firebase/functions-samples/blob/master/generate-thumbnail/functions/index.js)

1, サービスアカウント用の秘密鍵ファイルを生成し初期化時に認証情報を追加する
[サーバーに Firebase Admin SDK を追加する](https://firebase.google.com/docs/admin/setup?hl=ja#initialize_the_sdk)

```diff
- admin.initializeApp();
+ const serviceAccount = require(<サービス アカウント用の秘密鍵ファイルへのパス>);
+ admin.initializeApp({
+   credential: admin.credential.cert(serviceAccount),
+   databaseURL: 'https://<DATABASE_NAME>.firebaseio.com',
+   storageBucket: "gs://<プロジェクト ID>.appspot.com"
+ });
```

2, realtime databaseを使用していない場合以下を削除

```diff
- // Add the URLs to the Database
- await admin.database().ref('images').push({path: fileUrl, thumbnail: thumbFileUrl});
- return console.log('Thumbnail URLs saved to database.');
```
Byte Buddy で Hello World

Byte Buddy の Hello World の Android 非依存版の UnitTest と Android 版です。

# Byte Buddy 本家リンク
- [GitHub](https://github.com/raphw/byte-buddy)
- [bytebuddy.net](https://bytebuddy.net/)

# UnitTest版 helloWorld()
```gradle:build.gradle
implementation 'net.bytebuddy:byte-buddy:1.10.1'
```

```kotlin:本家サンプルのhelloWorld()と同等なコード(UnitTest版)
// @See https://github.com/raphw/byte-buddy#hello-world
@Test
fun helloWorld() {
    // Object 型のサブクラスを作成し、toString() を "Hello World!" と表示されるように
    // intercept する。
    val dynamicType = ByteBuddy()
        .subclass(Any::class.java)
        .method(ElementMatchers.named("toString"))
        .intercept(FixedValue.value("Hello World!"))
        .make()
        .load(javaClass.classLoader)
        .loaded

    // 作成した型のインスタンスを生成して toString() の内容をテストする。
    assertEquals("Hello World!", dynamicType.newInstance().toString())
}
```

# Android版 helloWorld()
```gradle:build.gradle
implementation 'net.bytebuddy:byte-buddy:1.10.1'
implementation 'net.bytebuddy:byte-buddy-android:1.10.1'
```

※Android 版は UnitTest版 と load() の部分が異なるので注意。
実行時に `java.lang.ClassNotFoundException: Didn't find class "java.lang.instrument.ClassFileTransformer"` とか言って怒られます。

```kotlin:本家サンプルのhelloWorld()と同等なコード(Android版)
fun helloWorld() {
    // Object 型のサブクラスを作成し、toString() を "Hello World!" と表示されるように
    // intercept する。
    val dynamicType = ByteBuddy()
        .subclass(Any::class.java)
        .method(ElementMatchers.named("toString"))
        .intercept(FixedValue.value("Hello World!"))
        .make()
        // Memo: The following Exception occurs when you call ".load(javaClass.classLoader)" on Android
        // java.lang.ClassNotFoundException: Didn't find class "java.lang.instrument.ClassFileTransformer"
        .load(
            this::class.java.classLoader,
            AndroidClassLoadingStrategy.Wrapping( application.getDir( "dexgen", Context.MODE_PRIVATE ) )
        )
        .loaded

    // 作成した型のインスタンスを生成して toString() の内容を Toast で表示する。
    Toast.makeText(this, dynamicType.newInstance().toString(), Toast.LENGTH_SHORT).show()
}
```
forを利用した汎用的に使えるsshのshell芸

何十台もあるサーバ達の情報を取ってきたいけど一々sshして中身覗くのめんどくさい！
かといってわざわざshellscriptとか作る時間も勿体無い！綺麗に一覧で出力結果が見たい！
そんな時に使える汎用的なshellの一例


##Command
```
for h in `cat 【ホスト一覧】 | awk '{print $1}'`;do echo "####### $h ########"; ssh $h '【コマンド】'; done
```
【ホスト一覧】には引数用のファイルを指定。
hostsとかを引数にする場合、awkで読み込むカラムを調整する。
【コマンド】には対象のサーバで取ってきたい情報を指定。
複数コマンドを打ちたい場合、「；」で区切ると複数コマンドが打てる。


## やってみる
hoge[01:05]サーバからホスト名とOSverを取ってくる

```:list
hoge01
hoge02
hoge03
hoge04
hoge05
```


こんな感じで一覧で見える

```:出力
# for h in `cat /tmp/list | awk '{print $1}'`;do echo "####### $h ########"; ssh $h 'hostname; cat /etc/redhat-release'; done
####### hoge01 ########
hoge01
Scientific Linux release 7.2 (Nitrogen)
####### hoge02 ########
hoge02
Scientific Linux release 7.2 (Nitrogen)
####### hoge03 ########
hoge03
Scientific Linux release 7.2 (Nitrogen)
####### hoge04 ########
hoge04
Scientific Linux release 7.2 (Nitrogen)
####### hoge05 ########
hoge05
Scientific Linux release 7.2 (Nitrogen)
```


## 一例
####メモリの状態を見たい
```
# for h in `cat /tmp/list | grep api | awk '{print $2}'`;do echo "####### $h ########"; ssh $h 'free -g;'; done

####### hoge1 ########
total used free shared buff/cache available
Mem: 31 7 8 1 14 21
Swap: 15 0 15
####### hoge2 ########
total used free shared buff/cache available
Mem: 31 7 10 1 13 21
Swap: 15 0 15
####### hoge3 ########
total used free shared buff/cache available
Mem: 31 6 11 1 13 22
Swap: 15 0 15
####### hoge4 ########
total used free shared buff/cache available
Mem: 31 6 10 1 14 22
Swap: 15 0 15
####### hoge5 ########
total used free shared buff/cache available
Mem: 31 6 10 1 13 22
Swap: 15 0 15
```


####ディスク状態を見たい
```
# for h in `cat /tmp/list | grep api | awk '{print $2}'`;do echo "####### $h ########"; ssh $h 'df -h;'; done

####### hoge1 ########
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 263G 25G 239G 10% /
devtmpfs 16G 0 16G 0% /dev
tmpfs 16G 0 16G 0% /dev/shm
tmpfs 16G 1.6G 15G 11% /run
tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/sda1 488M 187M 266M 42% /boot
tmpfs 3.2G 0 3.2G 0% /run/user/1001
####### hoge2 ########
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 263G 21G 242G 8% /
devtmpfs 16G 0 16G 0% /dev
tmpfs 16G 0 16G 0% /dev/shm
tmpfs 16G 1.6G 15G 10% /run
tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/sda1 488M 187M 266M 42% /boot
tmpfs 3.2G 0 3.2G 0% /run/user/1001
####### hoge3 ########
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 263G 21G 242G 9% /
devtmpfs 16G 0 16G 0% /dev
tmpfs 16G 0 16G 0% /dev/shm
tmpfs 16G 1.6G 15G 11% /run
tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/sda1 488M 184M 269M 41% /boot
tmpfs 3.2G 0 3.2G 0% /run/user/1001
####### hoge4 ########
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 263G 21G 242G 8% /
devtmpfs 16G 0 16G 0% /dev
tmpfs 16G 0 16G 0% /dev/shm
tmpfs 16G 1.6G 14G 11% /run
tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/sda1 488M 187M 266M 42% /boot
tmpfs 3.2G 0 3.2G 0% /run/user/1001
####### hoge5 ########
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 263G 21G 242G 8% /
devtmpfs 16G 0 16G 0% /dev
tmpfs 16G 0 16G 0% /dev/shm
tmpfs 16G 1.6G 15G 11% /run
tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/sda1 488M 187M 266M 42% /boot
tmpfs 3.2G 0 3.2G 0% /run/user/1001
```
初心者フローチャート入門

プログラミングをする前にフローチャートで処理の流れを整理しておくと
プログラミングする際便利という事でフローチャート作成について纏めてみました。

#フローチャートとは
プロセスの各ステップを箱で表し、処理の流れを矢印で表すことでアルゴリズムを視覚的に解りやすく纏める為の図式法です。
流れ図とも言います。プログラムだけでなく作業の流れを表したりするのにも使う。

#フローチャートのメリット
- 視覚的にプログラム・作業の流れを把握出来る為、問題点を発見し易くなる。
- 処理の順序を辿りやすい為、順序に問題があった際、発見・修正がし易くなる。
- チームで問題解決を行う際、担当箇所を明確にし易く理解もし易い。

# フローチャートの書き方
数種類の記号と矢印で作成する。

| 記号    |名前 　　| 意味　    　　　|
|:-----------------|------------------:|:------------------:|
| ![2019-10-10 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/5bffaba9-6ae9-729b-6344-5d7a124d0b60.png)|  　　開始/終了 端子 　　　　　| 　処理の開始・終了を表す。　  　　|
| ![2019-10-10 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/a6059cea-70ac-a928-bce3-8a16e171fb24.png)           |  処理 　　　　|   一般的な処理内容を表す。      |
|![2019-10-10 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/6848d1c0-be88-fa56-7224-397550e2a99e.png)|    判断　　　　 |  条件を満たすかどうかを判断する     |
| ![2019-10-10 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/f080ca4f-19d3-5ad9-aab2-077b7dfb1d65.png)|　線、矢印　　 |   データや制御の流れを表す。         |

ひとまずは上記の記号を使用すれば簡単なフローチャートは書ける。
上記以外にはループ処理の記号や関数、ファイル入出力等を表す記号
# フローチャート作成例
![220px-Jis-flowchart-fixed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507713/81c84c3b-eb68-3874-7808-c91982554018.png)
簡易なフローチャート これはsに1から10までの数字を足しこむ処理を表した図である。
引用元：[Wikipediaフローチャート](https://ja.wikipedia.org/wiki/フローチャート)

# 注意点
- 基本は上から下へ流れる形で書き、分岐やループで戻る処理は必要最小限に留める。
- 分岐から前の処理へ戻る際は直前の矢印に合流する形で書く。
- 矢印を交差させたり記号から離れないように書く。
- 分岐条件は間違えないよう注意して書き、Yes,NOの方向も気を付けて書く。
- 箱の中の文字を読みやすく書く。

# まとめ
どこまで詳細にフローチャートを書くかは人それぞれですが細かすぎず、簡潔すぎずのバランスを取って書く事が大事かと思いました。
プログラミング前にフローチャートを作成して処理の順序を整理して考える癖を付けてステップアップしていきましょう！
Selenium2 + pythonでメモリ不足になってしまった話

# Selenium2 + pythonでメモリ不足になってしまった話

## いきさつ

Webサイトのテストでseleniumを使っていたのですが、
長時間かかるテストを実施していたところ、徐々に動きが重くなる現象を確認。

なんでだろうと思って、タスクマネージャーを確認したところ
結構エグめな量のメモリを消費していた。

ちなみに、
ドライバは『geckodriver.exe』
pythonのバージョンは3.6.4

## 解決策

色々調べていたところ以下のコードで一回ドライバを落とすのがいいみたい。

```
# 立ち上げて
driver = webdriver.Firefox(executable_path=".\Python\driver\geckodriver")
# 落とす
driver.close()
```

これまでもfinalyで落としてはいたんですが、
やっぱり処理を考えて落とすのが正解みたいですね。

しゃーなし。
ログイン処理があるのでいい感じで調整していきます。

久々の投稿、短くなりましたがこの辺で！
(=ﾟωﾟ)ﾉ

## 参考

[Selenium WebDriverderでプロセス終了させメモリ枯渇を防ぐ方法](https://shimi-dai.com/selenium-webdriver-close-quit/)