OmniAICreator/Qiita-1.07M huggingface dataset:
あなたが知っておくべき10の配列メソッド(Dart)

##はじめに
https://codeburst.io/top-10-array-utility-methods-you-should-know-dart-feb2648ee3a2
を参考にして、少し自分なりに修正したサンプルを提示する。

操作するリスト
`var fruits = ['banana', 'pineapple', 'watermelon'];`
`var numbers = [1, 3, 2, 5, 4];`

##1. `forEach()`
リスト内の各要素に対して関数を実行する。

```dart
 fruits.forEach((fruit) => print(fruit)); // => banana pineapple watermelon
```

##2.`map()`
与えられた各要素に処理を掛けた後に、その要素群に対する新しいリストを作成する。

```dart
 var mappedFruits = fruits.map((fruit) => 'I love $fruit').toList();
 print(mappedFruits); // => ['I love banana', 'I love pineapple', 'I love watermelon']
```
##3.`contains()`
与えられた要素がリストにあるか確認する。

```dart
 print(numbers.contains(6)); // => false
 print(fruits.contains('pineapple')); // => true
```

##4.`sort()`
与えられた順序付け関数に基づいてリスト内の要素を順序付けする。

```dart
 print(numbers.sort((num1, num2) => num1 - num2)); // => [1, 2, 3, 4, 5]
 print(fruits.sort((a, b) => a.length.compareTo(b.length))); // => [banana, pineapple, watermelon]
```

##5.` reduce(), fold()`
与えられた関数を使って、要素を単一の値に圧縮する。

```dart
 var sum = numbers.reduce((curr, next) => curr + next);
 print(sum); // => 15
 const initialValue = 10;
 var sum2 = numbers.fold(initialValue, (curr, next) => curr + next);
 print(sum2); // => 25
```

##6.`every()`
すべての要素がテストを満たすことを確認する。

```dart
 List<Map<String, dynamic>> users = [
   { "name": 'John', "age": 18 },
   { "name": 'Jane', "age": 21 },
   { "name": 'Mary', "age": 23 },
 ];
 var is18AndOver = users.every((user) => user["age"] >= 18);
 print(is18AndOver); // => true
   
 var hasNamesWithJ = users.every((user) => user["name"].startsWith('J'));
 print(hasNamesWithJ); // => false
```

##7.`where(), firstWhere(), singleWhere()`
テストを満たす要素のコレクションを返す。

```dart
 // See #6 for users list
 var over21s = users.where((user) => user["age"] > 21);
 print(over21s.length); // => 1
 var nameJ = users.firstWhere((user) => user["name"].startsWith(‘J’), orElse: () => null);
 print(nameJ); // => {name: John, age: 18}
 var under18s = users.singleWhere((user) => user["age"] < 18, orElse: () => null);
 print(under18s); // => null
```
`firstWhere()`はリスト内の最初の一致を返しますが、`singleWhere()`は一致が1つだけの場合は最初の一致を返します。


##8.`take(), skip()`
要素をインクルードまたはスキップしたコレクションを返す。

```dart
 var fiboNumbers = [1, 2, 3, 5, 8, 13, 21];
 print(fiboNumbers.take(3).toList()); // => [1, 2, 3]
 print(fiboNumbers.skip(5).toList()); // => [13, 21]
 print(fiboNumbers.take(3).skip(2).take(1).toList()); // => [3]
```

##9.`List.from()`
与えられたコレクションから新しいリストを作成する。

```dart
 var clonedFiboNumbers = List.from(fiboNumbers);
 print('Cloned list: $clonedFiboNumbers');
```

##10.`expand()`
各要素を0個以上の要素に展開します。

```dart
 var pairs = [[1, 2], [3, 4]];
 var flattened = pairs.expand((pair) => pair).toList();
 print('Flattened result: $flattened'); // => [1, 2, 3, 4]
 var input = [1, 2, 3];
 var duplicated = input.expand((i) => [i, i]).toList();
 print(duplicated); // => [1, 1, 2, 2, 3, 3]
```

##おまけ
個人的には、これらに加えて`shuffle()`, `sublist()`が結構使えると思う。
あと`List.from()`はメソッドというよりコンストラクタでは？笑
なるはや Vue SPA入門：Vue.js devtools

Vue CLI3 で作成した SPA（Single Page Application）プロジェクト上で、段階的に Vue.js を学んで行きましょう。

[目次はこちら](https://qiita.com/tsubo/items/24df49ef2f1ba87984d1)

今回は Vue.js devtools 編です。

## 前提事項

[コンポーネント編](https://qiita.com/tsubo/items/745324a9f4719cb6b8fa) が完了していること。 

## Vue.js devtools

Vue での開発で便利なツール Vue.js devtools を紹介します。Chrome ブラウザの拡張機能として提供されています。Chrome ウェブストアからインストールすることができます。

[Vue.js devtools（Chrome ウェブストア）](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=ja)

インストールが完了し、Chrome のメニューからデベロッパーツールを表示すると`Vue`のタブが追加されています。

devtools では以下の項目を画面で見ることができます。

- コンポーネント
- ストア（Vuex）
- イベント
- ルーティング

![devtools.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14476/7fa98dca-a979-5bc3-f522-b2e5523fc34d.png)

上の画像では前回作成した Todo リスト画面を表示しています。devtools では TodoListItem コンポーネントを閲覧しています。

あとは色々動かして見てみてください。

## 次回

[Bootstrap](https://qiita.com/tsubo/items/fdee5fd998b0399546b9)
Linux コマンド　ファイル/ディレクトリの基本操作 　日本語訳付き

#ファイル/ディレクトリの基本操作

##cat 
cat　は　catenate（連結する）の略。
###ファイルの内容の表示
>```
$ cat ファイル名
```

##cd
cd は　change directory　の略。


###ホームディレクトリに移動
>```
$ cd
```

###指定したディレクトリに移動
>```
$ cd ディレクトリ名
```

###1つ前のカレントディレクトリに移動
>```
$ cd -
```

##cp
cp　は　copy　の略。

###ファイルA　を　ファイルBとしてコピー
>```
$ cp ファイルA　ファイルB
```


###ファイルA　を　ディレクトリB　にコピー
>```
$ cp ファイルA ファイルB
```

###ディレクトリA　を　ディレクトリB　の中にコピー
>```
$ cp -r ディレクトリA　ディレクトリB
```

##less
less の　意味は　もっと少なく,より少なく…


### 指定したファイルの内容を1ページづつ表示
>```
$ less ファイルA
```

##ln
ln　は　link　の略。


### 指定したファイルのハードリンクを作成
>```
$ ln 元のファイル　作成するリンクファイル
```

### 指定したファイルのシンボリックリンクを作成
>```
$ ln -s 元のファイル名　作成するリンクファイル
```

##ls
ls　は　list　の略。

### カレントディレクトリのファイル一覧を表示
>```
$ ls
```
 

### 指定したディレクトリのファイル一覧を表示
>```
$ ls ディレクトリ名
```

### カレントディレクトリ内のファイルの詳細情報の表示
>```
$ ls -l 
```

### 指定したディレクトリ内のファイルの詳細情報の表示
>```
$ ls -l ディレクトリ名
```

##mkdir
mkdir　は　make directory　の略。

### ディレクトリの作成
>```
$ mkdir ディレクトリ名
```

##mv
mv　は　move　の略。

### ファイルA　を　ファイルB　に移動（名前の変更）
>```
$ mv ファイルA　ファイルB
```

### ディレクトリA　を　ディレクトリB　に移動
>```
$ mv ディレクトリA　ディレクトリB
```

### ファイルA　をディレクトリB に移動
>```
$ mv ファイルA　ディレクトリB
```

##pwd
pwd　は　print working directory　（作業中ディレクトリの表示）　の　略。


###カレントディレクトリの絶対パスの表示
>```
$ pwd
```

##rm
rm　は　 remove（消去）の略。
##指定したファイルの削除
>```
$ rm ファイル名
```
 

###指定したディレクトリの削除
>```
$ rm -r ディレクトリ名
```


こちらの投稿を参考にさせていただきました↓
[Linuxコマンドは単語の意味を理解するとグッと身近なものになる](https://qiita.com/tetsuya/items/46888bb4dfc8a6bfef02)

こちらの書籍を参考にさせていただきました↓
[LPICの基礎が学べる本](https://www.amazon.co.jp/1%E9%80%B1%E9%96%93%E3%81%A7LPIC%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%8C%E5%AD%A6%E3%81%B9%E3%82%8B%E6%9C%AC-%E7%AC%AC2%E7%89%88-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B3%B6-%E8%83%BD%E5%92%8C-ebook/dp/B00IWNEWS8)
BitirseでAndroidのXMLを書き換えたい

# 概要
AndroidプロジェクトのXMLの設定ファイルをBitriseで書き換える方法
xmlstarletというツールで実現できました

# インストール
## Bitrise上
```
sudo apt install -y xmlstarlet
```
AndroidならUbuntuがdefaultだと思います。

## Mac上で試す場合
```
brew install xmlstarlet
```

# 使い方
```
xmlstarlet edit --inplace -u "XML Path" --value "VALUE" "XML file path"
```

# 実際のコード一例

WorkflowのScriptステップで以下のコードを実行

```
xmlstarlet edit --inplace -u "/resources/string[@name='target_key']" --value "new value" Project/src/stage1/res/values/setting.xml
```

# 留意点
XMLファイルが正規化されるので以下のdiffが発生します。

- インデントがスペース4個から2個に変更される
- 改行が削除される

# 検証
スペースと改行を無視してdiffを出力する以下のコードを入れるとログで差分が見易いです。

```
git diff --ignore-all-space --ignore-blank-lines
```

# リファレンス
xmlstarletドキュメント
http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html#idm47077139594320
Play Frameworkでwebsocketのframeを増やす

デファルトは64kのため、大きいデータを送ると上限を超えてしまい通信に失敗する。

application.confに下記を追記することで、上限を増やせる


```
play.server.websocket.frame.maxLength = 512k
```

ただ、これだとdevモード（sbt run）では適用されないため、build.sbtに下記も追記する

```
PlayKeys.devSettings += "play.server.websocket.frame.maxLength" -> "512k"
```

どうやらHttpサーバーの起動時にapplication.confにアクセスできないようです。


詳細は下記参照
https://www.playframework.com/documentation/2.6.x/ConfigFile#Using-with-the-run-command
【rails】フォロー機能２～機能の実装

[フォロー機能のモデルの構造](https://qiita.com/gussan-dayo/items/090640c62d701817fd19)の続きの投稿です。
上記の投稿内容では、フォローの関係を表すモデルの作成をしました。
では実際の、フォロー機能を実装していきましょう！


##フォローとアンフォロー機能の実装



```app/models/user.rb
class User < ApplicationRecord

  has_many :microposts
  has_many :relationships
  has_many :followings, through: :relationships, source: :follow
  has_many :reverses_of_relationship, class_name: 'Relationship', foreign_key: 'follow_id'
  has_many :followers, through: :reverses_of_relationship, source: :user

  def follow(other_user)
    unless self == other_user
      self.relationships.find_or_create_by(follow_id: other_user.id)
    end
  end

  def unfollow(other_user)
    relationship = self.relationships.find_by(follow_id: other_user.id)
    relationship.destroy if relationship
  end

  def following?(other_user)
    self.followings.include?(other_user)
  end
end
```
なお、(other_user)は、他のユーザのページで、フォロー／アンフォローボタンを押したときに取得されると考えてください。
また、selfは自動で取得される自分自身を指します。

```.rb
  def follow(other_user)
    unless self == other_user
      self.relationships.find_or_create_by(follow_id: other_user.id)
    end
  end
```
では、自分自身(self)がフォロー対象(other_user)でない場合、other_userのidを返します。
```find_or_create_by```は、find_or_create_by()の()で指定したものを探してみて無ければ作成しますよっていう記述です。

```.rb
  def unfollow(other_user)
    relationship = self.relationships.find_by(follow_id: other_user.id)
    relationship.destroy if relationship
  end
```

は、relationshipに変数が入っていれば削除するという記述です。

```.rb
  def following?(other_user)
    self.followings.include?(other_user)
  end
```
ここでは、self.followings によりフォローしているUserを取得して、include?(other_user) でother_userが含まれていないかを確認しています。含まれている場合には、true を返し、含まれていない場合には、false を返します。


これで一応の処理は記述できました。
スケールが増減したときの名称を図でそれとなく覚える。

## スケールについて

サーバーは、規模（スケール）の変化に応じて名称がついています。
AWSにはサーバーのスケールアウトとスケールインを自動で調節してくれる AWS Auto Scaling があるみたいで便利ですね。

それとなくまとめてみました。

### スケールアップ

![scaleup.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/fde9efdb-fe19-f01e-1a4a-f41c6597165b.jpeg)
サーバーの性能を向上させてサーバーそのもののパフォーマンスを向上させること。
CPUとかメモリのことですね。
１つのサーバーでしか処理ができない場合に有効です。

アップなので、性能が向上するイメージ。

### スケールダウン
![scaledown.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/87584898-b4d3-4178-9a38-22539553c69a.jpeg)
サーバーの性能を低下させてサーバーそのもののパフォーマンスを低下させること。
コストを抑えたい場合に有効です。

ダウンなので、性能が低下するイメージ。

### スケールアウト
![scaleout.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/e7747b49-87a0-d90a-f793-b9c07ed57cf4.jpeg)
サーバーの台数を増やしてパフォーマンスを向上させること。
複数のサーバーに処理を分散させられる場合に有効です。

アウトなので、スケールが枠内から出る（増える）イメージ。

### スケールイン
![scalein.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354517/e0450e04-965b-d7d6-3113-f83bf3b40c0e.jpeg)
サーバーの台数を減らしてパフォーマンスを低下させること。
こちらもコストを抑えたい場合に有効です。

インなので、スケールが枠内に収まるイメージ。

## 垂直スケーリングと水平スケーリング

この４つは下記の表のように垂直スケーリングと水平スケーリングに分けられるようです。

|垂直スケーリング|水平スケーリング|
|:-:|:-:|
|スケールアップ|スケールアウト|
|スケールダウン|スケールイン|

## 終わりに

ITには覚えるべき用語が多いですね。それとなく覚えます。
Pixave使ってみた

スクールでメンターさんに教えていただいたアプリに感動したので共有します！

PixaveというMac向けの有料アプリです。
[これは便利！超期待のMac向け画像管理（デジタルスクラップ）アプリ「Pixave」](http://itea40.jp/application/mac-graphics-design/pixave/)

デザインの勉強のためにトレース素材を保存したり、気に入ったデザインを保存する機会が多いので、ファイルの整理が楽になるのは良さそう！

そして一番気に入った機能がこれです。

[Mac向け画像管理アプリ「Pixave」にブラウザの拡張機能登場！ウェブサイトのスクリーンキャプチャーが可能に！](http://itea40.jp/application/mac-graphics-design/pixave-support-safari-chrome-browser-extension-for-webpage-capture/)

Chromeの拡張機能を使うと縦長のWEBサイトも一瞬でキャプチャーしてくれます。
<img width="1053" alt="スクリーンショット 2019-07-20 0.13.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464749/0f328fef-eb1a-e9a0-b491-7b494419e58e.png">
こんな感じで、ブラウザサイズもスマホサイズも選べるので便利。（ただ、iphone6S以降のサイズがないのが不便かも…。）

キャプチャしたものはこんな感じ。
（ブラウザサイズ）
<img width="1045" alt="スクリーンショット 2019-07-20 0.13.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464749/88d5dd06-96d7-707c-7724-99599e168e0b.png">

この画像をPhotoshopで開けば、サイトトレースもやりやすそう！
気に入ったWEBサイトのデザインを簡単に残しておけるのも良いです。
タグ付けもできるのでWEBサイトの系統ごとに分けておけば、今後デザインを作るときの資料にもなりそう。

そしてこの記事を書きながら、サイトのキャプチャはChromeの検証機能からも撮ることができるのを知りました。
[【知ってた？ Chrome裏技】縦に長いWebページ全体のスクリーンショットを撮る方法（拡張機能も不要！）](https://dekiru.net/article/16782/)

どんどんいろんなWEBデザイン研究するぞ〜！！
errors.add(:属性名, "エラーメッセージ")　でバリデーションを指定すると、エラーメッセージの先頭に属性名（カラム名）が表示される

#エラーメッセージの最初に属性（カラム名）が表示されるのは、railsの仕様
`errors.add(:属性名, "エラーメッセージ")`
で指定すると、エラーメッセージの先頭に属性名が表示される。

`errors[:base] << "モデル全体に関係するエラーを追加"`
で指定すると`モデル全体に関係するエラー`を追加することになり、
また、先頭に属性名が表示されることもない。

https://railsguides.jp/active_record_validations.html#errors-add
https://ruby-rails.hatenadiary.com/entry/20140810/1407623400
ワンライナーでcondaの仮想環境を別環境に再構築する方法

## 結論

大文字の部分は適宜に置き換えてください。

```
conda env export -n ENV_NAME > /tmp/FILE_NAME.yml; scp /tmp/FILE_NAME.yml USER@DST_IP:/tmp/; ssh USER@DST_IP conda env create -n ENV_NAME -f /tmp/FILE_NAME.yml
```

## 説明
使用中のconda仮想環境（src環境）をまるごと別の環境（dst環境）に再構築したいときのためのメモです。例えば、開発環境から本番環境に複製したいとき等です。
もちろん両方の環境とも、condaが入っていることが大前提です。

※ 注
　 pip 19.1.1  および  conda: 4.5.4 だと、pipのパッケージがうまく出力されない問題があります。
　condaを最新版にアップデートすれば解決します。
　`conda update -n base conda`
　検証環境：
　　pip 19.1.1
　　conda 4.6.14

## 通常手順
1. まずは、現在の仮想環境をファイルに出力します。（src環境）
　例：HOGEという仮想環境名
`conda  env  export  -n  HOGE  >   PATH_TO_FILE/FILE_NAME.yml`
　※PATH_TO_FILEがない場合は、カレントディレクトリに作成されます。

2. FILE_NAME.ymlファイルを再構築したい環境にコピーします（手動でもscpでも可）。
　src環境　→　dst環境

3. ENV_NAMEの仮想環境名で再構築する。（dst環境）
`conda  env  create  -n  ENV_NAME  -f  PATH_TO_FILE/FILE_NAME.yml`

## ワンライナー手順
もっと手軽に実施したいときのメモです。
基本的には、仮想環境をファイルに吐き出し、scpで別環境にコピーし、sshでコマンドを実行するだけです。

```
conda env export -n ENV_NAME > /tmp/FILE_NAME.yml; scp /tmp/FILE_NAME.yml USER@DST_IP:/tmp/; ssh USER@DST_IP conda env create -n ENV_NAME -f /tmp/FILE_NAME.yml
```
※ 2回ユーザの認証が必要。
　さらに面倒な方は、パスワードなし認証の設定を。
UnityEditorでショートカット Ctrl+' が機能しない件

## MonoDevelop以外のエディター で```Ctrl+'```を入力しても公式ドキュメントに飛ばない方へ
**時間の無駄だから、今すぐ検索するのヤメロ**  
**代わりに _'Unity API xxxxx'_ でググったほうが早い**

> [ctrl + ' does not work](https://forum.unity.com/threads/ctrl-does-not-work.410049/)

多分Unityの公式チュートリアル「[玉転がし](https://unity3d.com/jp/learn/tutorials/s/roll-ball-tutorial)」を見て、このショートカットを試したんだろうと思います。

自分はWin10環境でMonoDevelopを入れてなく、JetBrains Riderを使用していたので、ドツボにはまって時間を浪費しました。  
そしてこのQ&Aを見るにVisual Studioでも機能しないか、404になる可能性が大かもです。
MonoDevelopでも機能しない可能性が？

## 以下Riderを使用してる方について
**```Ctrl+’``` に当たる機能はありません。**  
公式ドキュメント程充実していないけど、軽く確認するくらいなら'Ctrl+Q'を使うといいかも？  
~~英語だけど~~

| **コーディング支援**   |               |           |                           |
| :--:                   | :--:          | :--:      | :--:                     |
| コマンド               | Visual Studio | ReSharper | デフォルト(IntelliJ IDEA) |
| クイック・ドキュメント | Ctrl+Shift+F1 | Ctrl+Q    | Ctrl+Q Alt+Right-click    |

> [JetBrains Riderキーボードショートカット: キーマップの比較 (Windows)](https://pleiades.io/help/rider/Keymaps_Comparison_Windows.html)
errorsメソッドは、インスタンスが持つメソッドで、バリデーションがfalseだった時にエラー配列が入る

取得するには`messages`を使う
つまり`インスタンス.errors.messagse`で取得できる。

####例
例えばコンソールから

```
>> p = Person.new
# => #<Person id: nil, name: nil>
>> p.errors.messages
# => {}
 
>> p.valid?　←手動でバリデーション実行
# => false

>> p.errors.messages　←バリデーションでfalseになったので、中にエラーが代入される
# => {name:["空欄にはできません"]}
```
みたいになる
＊Personモデルがnameカラム持ってて、バリデーションに presence: true とかしてた場合。


参考
https://railsguides.jp/active_record_validations.html#valid-questionmark%E3%81%A8invalid-questionmark

https://ruby-rails.hatenadiary.com/entry/20140810/1407623400
クラウド業務経験ゼロでも AWS 認定 Cloud Practitioner に合格した話

#はじめに
自己のスキルアップ、今後のシステム開発の前提知識を得るためにAWS認定を取得しました。
認定取得までの道のりをまとめます。

#取得したAWS認定 - AWS Certified Cloud Practitioner (CLF) -
https://aws.amazon.com/jp/certification/certified-cloud-practitioner/

- AWSクラウドの**基礎スキルを身に付ける**
- 他の専門知識認定を取得するための **First Step**

#受験時のスペック
- 10年程度のオンプレ経験
- 業務での**クラウド経験はゼロ**
- 趣味でEC2の立上げ経験はあり
- DBの知識は**皆無**

#学習期間
1ヶ月（平日2～3時間、休日5～6時間程度）
本業の開発が佳境だったため、平日/休日共に仕事の合間での学習で少し時間を要してしまいました。

#学習教材
##AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー
https://www.amazon.co.jp/dp/4797397403/ref=cm_sw_em_r_mt_dp_U_wnCmDbDFD72BK

AWS Summit Tokyo 2019 へ出向いた際に立ち読みさせていただき、**要点が分かり易くまとめられていた**ので即購入。
1周目は**完読まで約5日間**。
2周目は**ノートを作成しながら約1週間**。
3周目以降は後述の模擬試験で**理解が乏しかった箇所を重点的に熟読**。

##AWS Learning - AWS Cloud Practitioner Essentials (Second Edition) (Japanese) -
https://www.aws.training/learningobject/curriculum?id=34408

海外のAWS Technical Trainerによる**無料のWEB動画教材**。
前述の**テキストを補完**するように並行して受講。
動画を見ているだけ。というのが苦手で私には向いていませんでした。

##AWS Technical Essentials 1/2
https://aws.amazon.com/jp/training/course-descriptions/essentials/
https://aws.amazon.com/jp/training/course-descriptions/essentials2/

国内のAWS Technical Trainer による**有料講習**。
Technical Essentials 1 は**座学**が中心。
Technical Essentials 2 は**実技**が中心。
先ずは座学で概要を理解した後、マネジメントコンソールを使用してAWS上に環境構築する流れでした。

##模擬試験 - AWS Certified Cloud Practitioner Exam - Practice -
**¥2,000** + tax
**理解度の確認**と**試験形式に慣れる**ために受験。
PCでの試験が初めてだったので、使い方を覚えたことで当日の本試験であたふたすることがありませんでした。

#試験当日
- 事前に予約した試験時間の**15分前まで**に会場入り必須
- 受付にて名前を申し出て試験時間を確認してもらう
- 重要事項を一読して、同意書に署名
- 本人確認書類を**2種類提出**（運転免許証とクレジットカードを提示しました。）
- ロッカーに荷物を**全て収納**（会場に持ち込んだ物はロッカーの鍵とメモ用のボードのみ）
- 指定された座席に着席して試験開始
- 回答＆見直しをして試験終了
- 最後にアンケートに答えると**その場で合否が表示される**
- ロッカーの鍵とメモ用ボードを持って退出
- メモ用ボードを返却
- 受付にて試験の正常終了を確認してもらい、終了の署名をしたら退出

#終わりに
模試の点数には余裕がありましたが、本試験はギリギリ合格でした。
単純な理解だけではNGで、そのサービスを使った場合の**利点や欠点を深く理解**する必要があります。
AWSの基礎に当たる入門編の認定試験ですが、やはり認定というだけあって**アーキテクト要素が必要不可欠**でした。
今回、クラウド業務経験ゼロで**座学中心**の学習でした。
AWSの**業務経験があるに越したことはない**ですが、座学でもしっかりと**要点を抑えて理解**すれば、無事に合格することができました。

#あとがき
一部、理解度が低いと判定されましたので、認定は受けましたが追加で学習を継続中です。
Google Cloud Platform (GCP) Stack Driverによる監視設定の基本

# はじめに

こんにちは。ひつじです。
GCPの監視ってどうやってるんだ？と思い、GCPが提供している監視ツール「StackDriver」を使って監視設定を行ってみました。

ちなみにメガクラウドが提供している監視機能（リソースモニタリング）は以下です。

| AWS | Azure | GCP | Alibaba |
|------|-------|-----|------|
| CloudWatch | AzureMonitir | StackDriver | CloudMonitor |

触ったことないのはAzureだけですねぇ。
GCPだけ名前がなんかかっこいいな～と思ったら、2014年にStackDriverというクラウドモニタリングの企業をGoogleが買収したんですね。


#やること
1.　GCE（Iaas）のリソースを取得
2.　監視閾値を定めてインシデントとして検知
3.　検知したらメール、SLACKを送る


では順番に見ていきましょう。

#GCEのリソースを取得する

今回はGCEでCentOS7を使います。
リソースを取得するにはエージェントを入れる必要があります。

しかし、エージェントをいれなくても以下の項目はリソースが取得されます。
・CPU
・ネットワーク（バイト/パケット）
・DISK I/O


![gm1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/f9c814a3-d342-4e32-264e-e8de80c39695.png)

上記の画像で１つめのインスタンスにはエージェントがないので、メモリが取得できていません。

CentOSにSSHしたあと、以下のコマンドを実行

```
curl -sSO https://dl.google.com/cloudagents/install-monitoring-agent.sh
sudo bash install-monitoring-agent.sh
```

成功すると以下のよう画面が表示されます。

<img width="386" alt="g2.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/960d6f7c-c472-2348-82ee-931cb0dbcb49.jpeg">


では、リソースが取得できているか確認してみましょう。
StackDriver -> resources -> Metrics Explorer


![gm3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/2fd2cb9c-ca52-fe8b-77b2-204fa444f847.png)


#エラーが起きたらSlack通知するための設定する

まずはSlackアカウントを紐づける必要があります。
StackDriverの画面からプロジェクトのプルダウンをクリックすることWorkSpaceSettingsを選択できます。

<img width="191" alt="g3.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/b5bf8a84-f9eb-cb1a-74e4-961febdc9162.jpeg">


WorkSpaceSettingsを選択後にSlackのアカウントを登録します。

![gm2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/b4ea9a30-dd89-4bc3-9c8e-e86fb00d2ca4.png)



#StackDriverでモニタリング閾値を設定する

では閾値（AlertPolicy）を登録していきましょう。
StackDriver -> resources -> Incidents -> Create Alerting Policy

実際の設定画面はGIFをとってみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Qiita用<br>GCP StackDriverで監視閾値を設定してメール、SLACK通知を設定する <a href="https://t.co/gyyXcIAeJI">pic.twitter.com/gyyXcIAeJI</a></p>&mdash; ひつじ (@141mhz) <a href="https://twitter.com/141mhz/status/1152230764869648385?ref_src=twsrc%5Etfw">July 19, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

GIFの中では、以下の作業を実施しました。
`インスタンスを指定
CPU load 1mのモニタリングを指定
80%以上になったらメール、SLACKに通知する
`
#テスト

GCEに負荷をかけて、CPU100％にしてどのような通知がくるか試してみたいと思います。

yesコマンドをパラで6本ほど流します。（商用じゃやっちゃだめよ。）

```
yes > /dev/null &
```

メールだとこんな感じで届きます。

![g8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/bc7273b4-e14c-64b3-43f1-467b2efae727.jpeg)

SLACKだとこんな感じですね。
復旧の通知もきてしまっていますが。

![g10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/0c771733-3f4f-00bf-0945-8475721ab2d6.jpeg)


#おわりに

いかがでしたでしょうか。
いやーめちゃ簡単にできましたね。
感覚的にはAWSやAlibabaCloudよりも簡単にSLACK通知ができたかなと思います。

それではご査収ください～(^－^)
EditorConfig

EditorConfigを使うと、異なるエディタを使っているメンバーとコーディングスタイルを揃える事ができます。
一人の作業でも簡単なコードフォーマットに使う事ができます。
導入が容易なのでお薦めです。

## エディタ側の準備
必要なプラグインをインストールします。

|エディタ|プラグイン|
|---|---|
|Brackets|EditorConfig for Brackets|
|VS Code|EditorConfig for VS Code|
|Atom|EditorConfig|
プラグインが不要なエディタもあります。


## .editorconfigファイルのサンプル
これだけです。
古いWindowsを使っていて「.」で始まるファイルを作れない場合は、末尾にも「.」を付けると作れます。
作るのが面倒な場合はこちらから　https://github.com/takeshisakuma/editorconfig

```
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true
end_of_line = lf

[*.md]
trim_trailing_whitespace = false
```

## 各設定の意味


### root
.editorconfigが同階層に存在しない場合に、ルートに存在する.editorconfigファイルを参照する仕組みになっています。
これをtrueにしておかないとルート・ディレクトリまでたどってしまうのでroot = trueは最初に書いておきます。

### []
対象ファイルの指定
```[*]```で全てのファイルを対象とします。
```[*.md]```で拡張子が.mdの全てのファイルを対象とします。
```[index.html]```でindex.htmlのみを対象とします。
```[!index.html]```でindex.html以外の全てのファイルを対象とします。

### indent_style
インデントをタブにするか、スペースにするかの指定です。
tabかspaceを指定可能です。

### indent_size
インデントを半角スペースいくつ分にするかの指定です。
通常2か4を指定します。

### tab_width
タブの幅の指定です。
省略するとindent_sizeの数値が適応されるので、通常は指定する必要がありません。

### end_of_line
改行コードの種類を指定します。
lfかcrかcrlfを指定できます。

|改行コードの種類|意味|OS|
|---|---|---|
|LF(Line Feed)|カーソルを新しい行に移動|UNIXなど|
|CR（Carriage Return)|カーソルを新しい行に移動|UNIXなど|
|CR＋LF|左端にカーソルを戻して改行|Windowsなど|

### charset
文字コードの指定です。
特に理由が無ければutf-8指定します。

### trim_trailing_whitespace
行末の空白を削除するかどうかの指定です。
trueかfalseを指定可能です。
マークダウンファイルの場合、「行末スペース2つ」に改行というに意味があるので、削除しないためにfalseにします。

### insert_final_newline
最終行に空行を入れるかどうかの指定です。
trueかfalseを指定します。

### コメントアウト
行頭に「#」か「;」でコメントアウトできます。

## .editorConfigファイルの配置
プロジェクトのルートに置きます。

## 確認
行末にスペースを入力してファイルを保存して、スペースが削除されるかなど、設定の通りに動作するか確認します。
Kaggleのコミット状況をLINEで受け取る

:::note alert
LINE Notifyは提供終了したようです。
記事は一応残しておきますが、参考にされませんようにご注意く
:::

# はじめに
timeoutだったり、メモリエラーだったり、~~実装ミスだったり~~で
コミットエラーになることがあります。
数時間コミットの完了を待った後にカーネルエラーとか出てると泣けます。。。~~(特に実装ミスの時)~~

なので、Kernelのコミットの状態をLINEに通知するようなコードを書きました。

・実際の通知
![Screenshot_20190806-163757.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131499/ec804ca0-44e5-6be9-4307-97d9a48456db.png)

文章だけだと寂しいので、スタンプも使います。

[LINEスタンプ一覧](https://devdocs.line.me/files/sticker_list.pdf)

## 前提条件
・kaggleのAPIが使える状態であること。
・LINE notrifyでアクセストークンが払い出されていること。

# ソース
```python
import requests
import sys
from kaggle.api.kaggle_api_extended import KaggleApi


# https://www.kaggle.com/[kaggle_id]/[kernel_name] という構成です。
kaggle_id = "KAGGLE_ID"
kernel_name = ["KERNEL_NAME","KERNEL_NAME2"] # 複数のカーネルを通知するようにしています。
token = "YOUR_LINE_TOKEN"

def send_line_notification(message, line_token, stcID):
    endpoint = 'https://notify-api.line.me/api/notify'
    message = "\n{}".format(message)
    stcPID = "2"
    payload = {'message': message,
               'stickerId': stcID,
               'stickerPackageId': stcPID
    }
    headers = {'Authorization': 'Bearer {}'.format(line_token)}
    requests.post(endpoint, data=payload, headers=headers)

def kernel_status_check(api, kaggle_id, kernel_name):
    try:kernel_status = api.kernel_status(kaggle_id,kernel_name)
    except: sys.exit(1)

    if kernel_status["status"] == "complete":
        send_line_notification(kernel_name + ":\nSuccessed",token,"144")
    elif kernel_status["status"] == "running":
        send_line_notification(kernel_name + ":\nRunning",token,"502")
    else:
        send_line_notification(kernel_name + ":\nFailed: \n" + kernel_status["failureMessage"],token,"154")


KaggleApi.competitions_list
api = KaggleApi()
api.authenticate()

for kname in kernel_name:
    kernel_status_check(api, kaggle_id, kname)
```

あとはcronやタスクスケジューラなどで定期実行してください。

# 参考
・kaggleのAPI部分の参考にさせていただきました。
[「Kaggle API」を Python で実行してみた]
(https://doarakko.hatenablog.com/entry/kaggle_api_in_python)

・LineのAPI部分の参考にさせていただきました。
[コピペで使える。Kaggleでの実験を効率化する小技まとめ](https://amalog.hateblo.jp/entry/kaggle-snippets#LINE%E3%81%AB%E9%80%9A%E7%9F%A5%E3%82%92%E9%80%81%E3%82%8B)
ターミナルでchromeの履歴をインクリメンタルサーチして開く

# はじめに
Chromeで過去に訪問したことがあるページを開きたい時、アドレスバーにURLの一部を入力して表示される候補から開くことありませんか？
私はgithubで特定のリポジトリのページを開きたい時や開発中の画面を開く時によく上記操作をします。

Chromeのアドレスバーも保管してくれますが、候補が少ししか出てこなかったり、キーワード検索と混じったりで使い勝手が悪いと感じていました。

このストレスから解放される方法をずっと考えていたのですが、ターミナルを使って履歴を検索してChromeで開くコマンドができたので紹介します。

# コマンドのイメージ

文章だけではわかりづらいですが、↓のようなイメージです。
1. ターミナルで`ch`と入力
2. urlの一部を入力。スペース区切りで複数キーワード入れることもできます。検索の仕様はpecoのホームページを参照（https://github.com/peco/peco）
3. 該当するURLにカーソルを合わせて`return`。カーソル移動は`control+n`(下), `control+p`(上)、または矢印キーです。
4. Chromeで該当画面が開く
![peco_chrome_history.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/a3f846fb-b3d7-ddbc-bf1a-951a9b3c9f08.gif)

# コマンドの作り方

## 環境準備
下記の環境で作成・動作しました。

### OS  
macOS Mojave(10.14.5)
### sqlite3
3.24.0
Chromeの履歴がsqlite形式で保存されているので履歴の読み取りで使います。
macOSであれば最初からインストールされています。
### peco
履歴をインクリメンタルサーチするときに使います。
他にも色々活用できる素晴らしいコメンドなのでぜひ入れておきましょう。
下記ページを参考にインストールしておきましょう。
https://github.com/peco/peco
### Chrome
75.0.3770.142

## コマンド
コマンドは下記の通り。コマンド名は`ch`で`.bashrc`に記述しました。

```sh:.bashrc
function ch {
  # Chromeの履歴ファイル(sqlite形式)をそのまま使ったらlockされていてエラーになったので/tmpにコピー
  # たぶんChromeがLockしているんだろう
  cp -p $HOME/Library/Application\ Support/Google/Chrome/Default/History /tmp/chrome_history
  # sqliteを使ってURL履歴を取得してpecoに流す
  # pecoでインクリメンタルサーチした結果をcに格納
  local c="$(sqlite3 /tmp/chrome_history 'select url from urls' | peco)"
  if [ -n "$c" ]; then
    # 対象urlが選択されている場合、Chromeで開く
    open -a '/Applications/Google Chrome.app' "$c"
  fi
}
```

# 最後に
URL履歴の候補に`file://...`や`chrome-extension:`など余計なものが出てきて邪魔なのでsqlを改修するなど改善の余地はありそう。
あと無邪気に全履歴をselectしているけどChromeの履歴ってどれくらいたまるんだろうか。数が多いとノイズも多くなるので何らかの条件で絞れると良さそう。
まあこのへんは使っていく中で改善していきたいと思います。
Jetson Nano / Jetson Xavier nx に Cupy をインストールする時のTIPS

#概要
Jetson Nano や Jetson Xavier nx に Cupy をインストールしようとすると、何も考えずにビルドすると1時間超はかかる.なので、少しでも短縮しましょう、というお話。

#原因
Jetson Nano の Ubuntu Linux には CUDA10.0 以上が入ってるので、Cupy の場合、Kepler から Turing まで対応できるようにビルドしてしまう（のでビルドも時間かかるし出来上がったサイズもデカくなる）。

#対応策
**制限事項：バージョンは、Ver7.0.0b2 以降でのみ有効**（@kmaehashi さんからの指摘により修正）
Jetson Nano や Jetson Xavier nx の場合、環境変数で それぞれMaxwell (compute_53)、Volta(compute_70)だけビルド＆インストールするように設定すればよい。ビルド時間＆サイズも短縮縮小される。

Jetson Nano (Maxwell) の場合

```
sudo sh -c 'CUPY_NVCC_GENERATE_CODE="arch=compute_53,code=sm_53" pip3 install cupy'
```

Jetson Xavier nx (Volta) の場合

```
sudo sh -c 'CUPY_NVCC_GENERATE_CODE="arch=compute_70,code=sm_70" pip3 install cupy'
```


もちろん、Cupy のバージョンを指定してビルド＆インストールも可能。

```
sudo sh -c 'CUPY_NVCC_GENERATE_CODE="arch=compute_70,code=sm_70" pip3 install cupy==7.0.0b2 -V'
```

#蛇足
知ってる人なら当たり前な話だけど、知らない人は知らないまま過ごす件だとは思われる。かつ、読んでもらえたらわかるけど、別に Jetson  限定の話ではなく、Linux な環境であれば適用できる話ではある。


#参考リンク
Cupy の Github
・ https://github.com/cupy/cupy
CUPY_NVCC_GENERATE_CODE
・ https://github.com/cupy/cupy/pull/2293

#改訂
* (2020.5.24 23:42 JST) Jetson Xavier nx 向けの記述を追加
質問です

pymolというソフトを下のサイト通りの手順でインストールしようとしているのですが手順４のScripts\pip install wheelを入力するとエラーになってしまいます。
http://www.protein.osaka-u.ac.jp/rcsfp/supracryst/suzuki/jpxtal/Katsutani/install.php
解決方法を教えてください。
プログラミングやパソコンに疎いので手順を細かく具体的に教えてもらえると助かります。よろしくお願いします。


C:\python27>Scripts\pip install wheel
Collecting wheel
Exception:
Traceback (most recent call last):
  File "c:\python27\lib\site-packages\pip\basecommand.py", line 211, in main
    status = self.run(options, args)
  File "c:\python27\lib\site-packages\pip\commands\install.py", line 294, in run

    requirement_set.prepare_files(finder)
  File "c:\python27\lib\site-packages\pip\req\req_set.py", line 334, in prepare_
files
    functools.partial(self._prepare_file, finder))
  File "c:\python27\lib\site-packages\pip\req\req_set.py", line 321, in _walk_re
q_to_install
    more_reqs = handler(req_to_install)
  File "c:\python27\lib\site-packages\pip\req\req_set.py", line 491, in _prepare
_file
    session=self.session)
  File "c:\python27\lib\site-packages\pip\download.py", line 825, in unpack_url
    session,
  File "c:\python27\lib\site-packages\pip\download.py", line 673, in unpack_http
_url
    from_path, content_type = _download_http_url(link, session, temp_dir)
  File "c:\python27\lib\site-packages\pip\download.py", line 884, in _download_h
ttp_url
    file_path = os.path.join(temp_dir, filename)
  File "c:\python27\lib\ntpath.py", line 85, in join
    result_path = result_path + p_path
UnicodeDecodeError: 'ascii' codec can't decode byte 0x98 in position 7: ordinal
not in range(128)
You are using pip version 7.1.2, however version 19.2.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' comm
and.
HerokuでrailsのDBをリセットするコマンドを紹介

## HerokuでrailsのDBをリセットするコマンドを紹介
`heroku  pg:reset DATABASE_URL`でpostgresqlのリセットができます。

確認ダイアログが表示されますが、このコマンドはくれぐれも慎重に扱ってください。

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Oculus Go / Quest で、コントローラーで移動できるようにする

Oculus Go / Quest 用のアプリを作っていて、コントローラーから、前後左右に移動できるようにする時のメモです。

## Oculus Quest

Oculus Integrationを導入している場合、`OVRCameraRig` に、次のようなスクリプトをアタッチすれば、左スティックで動くようになります。

```cs:Hoge.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Hoge : MonoBehaviour {

    private void Update()
    {
        // 前後への移動
        var v = OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick).y;
        Vector3 velocity = new Vector3(0, 0, v);
        velocity = transform.TransformDirection(velocity);
        velocity *= 5f;
        transform.localPosition += velocity * Time.fixedDeltaTime;

        // 左右への方向転換
        var h = OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick).x;
        transform.Rotate(0, h * 3f, 0);
    }
}
```

ちなみに、右スティックに割り当てたい場合は、`OVRInput.Axis2D.PrimaryThumbstick`を`OVRInput.Axis2D.SecondaryThumbstick`に変えてください。

また、手を表示するために`LocalAvatarWitdhGrab`を使っている場合は、スクリプトはこちらにアタッチしてください。（カメラのみが動いて、手の位置が同期されなくなるため）


### Oculus Go

上記の `OVRInput.Axis2D.PrimaryThumbstick` を `OVRInput.Axis2D.PrimaryTouchpad` に変えればOKです。

### OVRInputについて

公式サイトに、コントローラーごとの、入力の取得方法がまとまっています。
[OVRInput](https://developer.oculus.com/documentation/unity/latest/concepts/unity-ovrinput/)
コントローラーの入力を受け取って何かしたい場合は、上記を確認すると良さそうです。
［Swift］プロトコル・列挙型・構造体・オプショナルバインディング

### この記事の内容
個人的にSwiftの文法でとっつきにくい箇所を復習

### コード例

```swift:sample.swift
import UIKit

// プロトコル
protocol ProductProtocol{
    func show()
}

// 列挙型
// print(Product.Drink.rawValue)で"飲料品"と出力できる
enum ProductType:String{
    case Drink = "飲料品"
    case Food = "食料品"
    case Book = "書籍"
    case Other = "その他"
}

// 構造体
struct Product: ProductProtocol{
    var name:String?
    var price:Int?
    var type:ProductType
    
    init(_ name:String?, _ price:Int?, _ type:ProductType){
        self.name = name
        self.price = price
        self.type = type
    }
    
    func show(){
        // guardを利用したオプショナルバインディング
        // （オプショナル型のデータをアンラップする）
        guard let unwrappedName = self.name else{
            return
        }
        
        guard let unwrappedPrice = self.price else{
            return
        }
        
        print("商品名:\(unwrappedName)(\(self.type.rawValue)) 価格:¥\(unwrappedPrice)-")
    }
}



// 継承は参照元の情報を更新する
// 構造体は参照元の情報を更新しない
// ProductType.Food は .Food とも書ける
var product1 = Product("商品1",1000,ProductType.Food)
var product2 = product1
product2.name = "商品2"
product2.price = 2000
product2.type = .Book

// nilが入った場合
var product3 = Product(nil,nil,.Other)

// show()を実行
product1.show()
product2.show()
product3.show() // show()のguard節内で処理が終了するため、出力されない

```

### 出力結果
```
商品名:商品1(食料品) 価格:¥1000-
商品名:商品2(書籍) 価格:¥2000-
```
JUnitでprivateメソッドのテストカバレッジを充足させたい場合

## こんな時に
どうしてもJUnitでprivateメソッドも含めてカバレッジ100%にしたい！
（基本はpublicメソッドのテスト経由で全部通した方が自然）

## 例えば
以下のようなクラスで一箇所だけ自然にテストを通せないprivateメソッドがあったとする。
（中身がスカスカなのはご愛嬌）

~~~ java:SampleUtil.java

private String getStatus(String param, TestEntity testEntity) {
  String result = null;
  switch (param) {
    case "1":
      result = "A" + testEntity.getCode();
      break;
    case "2":
      result = "B" + testEntity.getCode();
      break;
    case "3":
      result = "C" + testEntity.getCode();
      break;
    default :
      result = "Z" + testEntity.getCode(); // ← ここのカバレッジが通らない！
  }
  return result;
}
~~~

## 対応方法
Mockitoを使う
https://site.mockito.org/

## 準備
私の場合はSpringBootとJUnitは既に導入済みのため、
dependencyに以下を追記してMockitoのライブラリを取得する。

### Maven利用の場合

~~~ XML:pom.xml
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>1.10.19</version>
    <scope>test</scope>
</dependency>
~~~

### Gradle利用なら

~~~ gradle:build.gradle
dependencies {
  // https://mvnrepository.com/artifact/org.mockito/mockito-all
  testCompile group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
}
~~~

## 使い方

テストクラスで以下の様に書けばいい

~~~ java:SampleUtilTest.java

  private SampleUtil sampleUtil;

  private static int testId = 1; // 後の検証で使う変数

  @Test
  public void getStatus() {

    // SampleUtil#getStatusを実行できる様に設定
    Method method = SampleUtil.class.getDeclaredMethod("getStatus", String.class, TestEntity.class);
    method.setAccessible(true);

    // テスト用のパラメータ設定
    String param = "4"; 
    TestEntity testEntity = new TestEntity();
    testEntity.setCode("001");

    // テスト実行
    String status = (String) method.invoke(sampleUtil, param, testEntity);
    assertThat(status, is("Z001"));
  }
~~~

SampleUtilのgetStatus()メソッドに対してaccessible=trueを設定することでアクセッサレベルを無視して呼び出すことが可能になる。

## 応用編
### テスト内でprivate変数に対してgetやsetしたい場合

以下のtestIdはSampleUtil.java内でprivate定義されている変数。
ここではgetしてみる。

~~~ java:SampleUtilTest.java

  @Test
  public void getParams() {
    SampleUtil sampleUtil = new SampleUtil();
    assertThat(Whitebox.getInternalState(sampleUtil, "testId"), is(1));
  }
~~~

この様に実装することでアクセッサレベルを無視して呼び出すことが可能。

## 最後に
ここで紹介した以外にもstaticメソッドを書き換えたりJUnitのテストの幅が広がる様な機能を多く備えているので、
興味のある人は突っ込んで調べてみるといいかも。
git コマンド 備忘録

## カレントブランチ・コミットにtag（コメントなし）
```
git tag $tag
```

## カレントブランチ・コミットにtag（コメントあり）
```
git tag -a $tag -m $commnet
```

## 指定コミットにtag（コメントあり）
```
git tag -a $tag -m $commnet $commithash
```

## 作成したtag をプッシュ
```
git push origin $tag
```

## 作成したtag をローカルから削除
```
git tag -d $tag
```

## 作成したtag をリモートから削除
```
git push origin :refs/tags/$tag
```

## tag 一覧
```
git tag
```

## tag 詳細
```
git show $tag
```


## 参考
* git tagの使い方まとめ
  * https://qiita.com/growsic/items/ed67e03fda5ab7ef9d08


## git repository を A から Bにコピー

```
git clone https://github.com/from/from.git
cd from.git
git push --mirror https://github.com/to/to.git
```

## git reset
* git add 取消

```
git reset HEAD
git reset
git reset HEAD index.php
git reset index.php
```

* 直前のコミット取消、作業ツリーとインデックスをそのまま

```
git reset --soft HEAD^
```
備忘録　javascript におけるクラス

どうも未来電子でインターンをしているものです。
今回はjavascriptのクラスについて自分なりにまとめてみました。

私はプログラミング初心者であるため間違っていることがあるかもしれませんが、お手柔らかにお願いします。

#目次
・クラス生成
・コンストラクタ
・インスタンスの生成
・メソッド、メソッドの使用
・継承

#クラス生成
クラスとは設計図のようなものです

```javascript
class Human{}
```
これでHumanというクラスを生成できました。

#コンストラクタ
コンストラクタにはクラスから生成されたオブジェクトの初期化という機能があります。

```javascript
class Human{
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
}
```

#メソッド、メソッドの使用
メソッドでは具体的な処理について書きます。
コンストラクタで定めた変数を使えます。

```javascript
class Human{
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
    profile(){
        console.log(`私の名前は${this.name}、${this.age}歳です`);
    }
}
```

ここではprofileというメソッドを追加しました。
このメソッドを使用するには

```javascript
consot bokuno_profile = new Human("boku", 20);
console.log(bokuno_profile.profile);

>>>`私の名前はboku、20歳です`
```

以上のように新たにインスタンスを生成する場合はnewを使い変数を代入して定義します。
メソッドを使う場合はインスタンス名の後にメソッド名を書きます。
Minecraft Skript 応用編 Part.5 プレイヤーの近くの特定のブロックの個数

#はじめに
今回のコードは[ここ](https://qiita.com/meoto2408/items/a44335d24d4ea3e75b73)で記述した環境でのデバックができていません。

もしかしたらコードが動作しない場合がございます。

その時はコメントでもしてください。。。
#プレイヤーの近くの特定のブロックの個数
```ruby:block.sk
# block: iron block の iron block を変えれば別のブロックにできます。

options:
    block: iron block

on join:
    loop blocks in radius 1000 around player:
        loop-block is {@block}
        add loop-block to {_block::*} 
    broadcast "%size of {_block::*}%
```
#解説の前に
`options:`の説明・・・１回もしてないかも・・・

ということでそれは後で投稿しますが簡単に言えば**Plugin**のコンフィグみたいなものだと考えてください。

詳細は執筆中

今回は鉄ブロックを特定のブロックとしていますが変えたい人はコード中にも書いてるように **block: iron block の iron block を変えれば別のブロックに変更可能です。**
#解説
それでは`on join`イベント内の解説です。

まあ、当たり前ですが`on join`はサーバーに入ったらというイベントです。

次に`loop blocks in radius 1000 around player:`ですがこれはループ文です。

ここの解説は`loop blocks`でブロックをループするというものです。

私の場合、`loop blocks`単体で使ったことがないのでちょっとわからないのですが、サーバー内のブロックすべてをループするようになるかと思われます。

ですが、Skriptは有能なので重たい処理でサーバーが耐えられないとSkript側が判断するとループを止めてくれるそうです。（`while`の場合）

なのでこの`loop blocks`でも同様なのではと考えています。

話が逸れましたがそのブロックがどんなブロックなのかっていうのはloop内で書いたら便利（その理由はページの一番下で説明）なので

`in radius 1000 around player:`を付けることで「プレイヤーを中心に半径１０００ブロック内のブロックをループする」というものになります。

そして`loop-block is {@block}`でループしたブロックが鉄ブロック（`{@block}`）であるというコードです。

`add loop-block to {_block::*}`は一時的変数である`{_block::*}`に`loop-block`を追加するというコードです。

もちろんループの特性上、条件（プレイヤーを中心として半径１０００ブロック）の中で鉄ブロックでなかった場合は次のブロックを確認するようになってます。

これでループが終わったときに`broadcast`で`{_block::*}`のサイズを表示します。

ここで表示された内容がプレイヤーの近くの特定のブロックの個数となります。
#なぜloop内で書いたら便利なのか・・・
では、一度サンプルのコードを２つ書いてみます。

ですが、あくまで説明用のものなので正常に動作するのかはわかりません。

```javascript:sample_1.sk
on join:
    loop blocks:
        loop-block in radius 1000 around player
        loop-block is stone
        add loop-block to {_block::*}
    broadcast "%size of {_block::*}%"
```
```javascript:sample_2.sk
on join:
    loop blocks in radius 1000 around player:
        loop-block is stone
        add loop-block to {_block::*}
    broadcast "%size of {_block::*}%"
```
この違いがわかりますでしょうか？

前者はマップにあるほぼ無限と言っていいほどのブロックを１つ１つ確認してプレイヤーを中心に半径１０００ブロック内でなければ次のブロックへ半径１０００ブロック内であれば、石であるかの確認をし、石でなければ次のブロックへ石であればリスト変数に追加というものです。

後者はプレイヤーを中心に半径１０００ブロック内のブロックを１つ１つ確認して石でなければ次のブロックへ石であればリスト変数に追加するというものです。

前者と後者の違いは分かりやすく言えば、本屋にある大量の本の中からAという本を探すのと、本屋のAのジャンルが置いてあるコーナーからAを探すという違いです。

もちろん、実際はもっと大きな話なのですが・・・

`loop`に関してはできるだけ処理が軽い方法でやるのが一番だと思いますが・・・

次は[コチラ](https://qiita.com/meoto2408/items/dc3b0be38acd85c9e94d)

前は[コチラ](https://qiita.com/meoto2408/items/9feca3ab34e986da8054)
centos7でよく使うコマンドをまとめてみた

よく忘れるからしょうがないんだよ。書いとくよ。
随時追加するから勘弁してくれ。

# ディレクトリ関係
#### ディレクトリの表示
```
# ls
```
何もつけなければ今いるディレクトリの内容を表示。
lsの後ろにpathをつければ（ls /var/www　とか）、つけたディレクトリの内容を表示。
尚、頭に.（ドット）のついたファイルはlsだけでは表示されない。すべて表示させるときは-aオプションをつける。

#### 権限の情報を表示する
```
# ls -l
```

# ユーザー関係
#### ユーザー追加コマンド
```
# adduser [ユーザー名]
```

#### 追加したユーザーにパスワードを設定
```
# passwd [ユーザー名]
```

#### グループを追加
ユーザーを追加するとそのユーザーIDでグループが作成される。
権限などの関係でユーザーIDとは別の括りでグループを作成したい場合、以下のコマンドで作成する。
```
# groupadd [グループ名]
```

#### ユーザにグループを追加
```
# usermod -aG [グループ名] [ユーザー名]
```
追加でなく書き換えをしたいときはオプションを-GにすればOK。

#### ユーザーの一覧を表示
```
# getent passwd
```
cat /etc/passwdでも同じ内容を表示できる。

#### グループの一覧を表示
```
# getent group
```
cat /etc/groupでも見られるよ。
passwdやgroupなどのファイル名の後ろにユーザーIDやグループを指定すると、それだけ表示する。

#### ユーザーの情報を表示
```
# id [ユーザーID]
```

# 権限
#### パーミッションを変更する。
```
# chmod 755 /home/hoge
```

#### ディレクトリの所有者、グループを変更する。
下記の例は、/home/hogeの所有者、グループをapacheに変更する。
```
# chown apache:apache /home/hoge
``` 

# SFTPの設定
#### openssh-serverがインストールされていることを確認する。
```
# yum list installed | grep ssh
```

#### sshd_configの内容を編集する
場所：/etc/ssh/sshd_config
以下の設定を変更する。
PermitRootLogin　→　rootでログインできるようにする設定：「no」（しない）に変更
※これをnoにすると、teratermからrootでログインできなくなるので注意。
PasswordAuthentication　→　ログイン時にパスワードを求めるか：「yes」（求める）に変更
 
#### sshdを立ち上げる

```
# systemctl start sshd
```

filezilla等でアクセスすると、ログインしたユーザーのディレクトリに接続できる。

# firewall関係
#### firewallの確認
```
# firewall-cmd --list-services --zone=public ←　サービス単位の設定を表示
# firewall-cmd --list-ports --zone=public ←　port単位の設定を表示
# firewall-cmd --list-all --zone=public ←　すべての設定を表示
```

#### firewallを開ける
```
# firewall-cmd --add-service=[サービス名] --zone=public --permanent
# firewall-cmd --add-port=[ポート番号]/tcp --zone=public --permanent
```

#### firewallをリロードする　**firewallを変更したときは必ず実施**
```
# firewall-cmd --reload
```

# ファイル関連
#### ファイル名で検索
```
# find [ディレクトリ名] -type f -name "*[ファイル名の一部]*"
```
#### フォルダ作成
```
# mkdir [ディレクトリ名]
```
#### ファイルコピー
```
cp [コピー元ディレクトリ/ファイル名] [コピー先ディレクトリ/ファイル名]
```
ファイル名を変更しないときはコピー先のファイル名の指定は不要。

#### ディレクトリ丸ごとコピー
```
cp -r [コピー元ディレクトリ名] [コピー先ディレクトリ名]
```
Automation Anywhere で和暦と西暦を変換するには (令和対応)

# 概要
UiPath では数式部分に.NET Framework のライブラリで使える関数が利用できるのですが、Automation Anywhere や WinActor では和暦と西暦を変換するようなライブラリは標準では用意されていません。その場合、サブルーチンにあたるタスクを用意して呼び出す、外部スクリプト (VBScript / JavaScript / PowerShell 等) でロジックを組む、などの処理をする必要があり、いずれも自分でロジックを組むので簡単には実現できません。

Automation Anywhere では、[Bot Store](https://www.automationanywhere.com/jp/products/botstore) という仕組みがあり、別途作成されテストされた拡張機能をインストールすることで、追加機能を簡単に実現することができます。西暦/和暦変換についてもダウンロード可能なので、この方法を使ってみます。

# Bot Store から Japanese Utilities ボットをダウンロードする
Bot Store には現在 2 つのボットが登録されています。Automation Anywhere 純正のボットは [Perform Japanese Utilities](https://botstore.automationanywhere.com/bot/perform-japanese-utilities/) です。ボットをダウンロードするには、Bot Store のアカウントが必要です。これは無料の Community Edition を使っていても無料でアカウントを取得できます。
![aa-bot-store-perform-japanese-utilities.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/5a8882a8-71b6-e155-cbe3-7865a5c311e2.png)

「Get Bot」でインストーラーをダウンロードした後は、右上の人アイコンから「My Downloads」でライセンスキーを取得して、インストーラーの所定の場所にコピペします。
![aa-bot-store-license.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a1356b23-9163-849b-fbb7-8ed0e52e664f.png)

![aa-bot-store-installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/85f9d075-62af-d196-849f-456463722043.png)

そのあとAutomation Anywhere Client を起動すると、「JapaneseUtilities.mbot」というMeta Bot が追加されています。

# Japanese Utilities Meta Bot を利用してみる

このMeta Bot をアクションリストのウィンドウにドラッグアンドドロップして、引数などの内容を表示します。西暦→和暦の変換には「ToJapaneseCalendar」コマンドを使います。
![aa-wareki-input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/41208379-82a7-7992-bc98-d51e1431c492.png)

赤枠で囲った部分に文字列を入力します。
![aa-wareki-output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/f068da6f-f25c-5f6c-4f43-5492a8dbfd9d.png)

タスクを実行すると、2019年6月10日が、令和元年6月10日に変換されていることがわかります。このMeta Bot自体が作成されたのは2018年ですが、令和対応もされているので、OS/.NET Framework のライブラリを使って変換しているのだと思われます。(故に実行環境でOS/.NET Frameworkの令和対応パッチを当てておくのを忘れずに。)

`vInputFormat`や`vOutputFormat`を変更することで、「令和01.6.10 (`vOutputFormat=gyy.MM.dd`)」などほかの形の書式にも対応できます。
VirtualBoxでSnapShotを自動で撮る。

#はじめに
Zabbixをインストールしてたら色々あったので、Qiitaに投稿しようと思ったのですが、色々やりすぎた上に、変更を加えた毎に確認をしていなかったおかげで、何によって改善したのかわからなくなりました。
取り急ぎ検証可能にしたいと思ったので、サーバの入っているVirtualBoxについて、Snapshotを自動で撮るようにしたいと思います。

#SnapshotをCLIで撮るコマンド

http://takatakamanbou.hatenablog.com/entry/2014/10/29/202206

上記サイトを参考にしました。
$ vboxmanage snapshot 「VM名」 take 「スナップショット名」
たったこれ１行だけ！

#タスクマネージャーに登録する

![2019-08-08 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374426/bd1117d7-c601-d422-bb50-590daff66d43.png)

参考サイトではshスクリプトを作成していますが、VirtualBoxが動作しているのがWindowsなのでタスクマネージャーに登録します。インストールフォルダにあるVBoxManage.exeを選択のうえ、引数に　snapshot 「VM名」 take 「スナップショット名」　の部分を記載してあげます。

![2019-08-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374426/83c529e8-c3a3-a667-5b23-1e5ac9f6621d.png)

出来ました！

#batファイルにしたい時

```
cd C:\Program Files\Oracle\VirtualBox
VBoxManage.exe snapshot CentOS7 take bk_1day
```

こんな感じで。
migrationのrollbackついて


migrationにおいてchangeで書いてもrollbackできるもの、
up/downで書かなくてはrollbackできないものをまとめてみました。

## rollbackできる(changeでOK)
#### カラムを追加する
rails g migration AddColumnUsers

```ruby
class AddColumnUser < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :age, :integer
  end
end
```

#### カラムの名前を変更する

```ruby
class RenameColumnFilmsReviewsFromNameToTitle < ActiveRecord::Migration[6.0]
  def change
    rename_column :films_reviews, :name, :title
  end
end
```

#### カラムにindexを追加する


```ruby

class AddIndexToUserOfName < ActiveRecord::Migration[6.0]
  def change
    add_index :users, :name_badge: 
  end
end
```

#### カラムにデフォルト値を設定する（change_column_defaultを使う）

```ruby

class ChangeColumnDefaultUserOfSocial < ActiveRecord::Migration[6.0]
  def change
    change_column_default :users, :social, from: nil, to: false
  end
end 
```

## rollbackできない(up/downで書く)

changeで書くと以下のエラーが発生するもの

```
Caused by:
ActiveRecord::IrreversibleMigration: 

This migration uses change_column, which is not automatically reversible.
To make the migration reversible you can either:
1. Define #up and #down methods in place of the #change method.
2. Use the #reversible method to define reversible behavior.
```

### カラムのデータ型を変更する

rails g migration ChangeColumnUsersToGender

```ruby

class ChangeDataUserToGender < ActiveRecord::Migration[6.0]
  def up
    change_column :users, :gender, :boolean
  end

  def down
    change_column :users, :gender, :integer
  end
end
```

### カラムにnullを許可しないよう変更する

```ruby

class ChangeColumnUserForName < ActiveRecord::Migration[6.0]
  def up
    change_column :users, :name, :string, null: false
  end

  def down
    change_column :users, :name, :string, null: true
  end
end 
```

### カラムにデフォルト値を設定する(change_column_defaultを使わない場合)

```ruby

# change_column_defaultを使うとchangeでもrollbackできる
class AddDefaultValueUserOfOccupation < ActiveRecord::Migration[6.0]
  def up
    change_column :users, :occupation, :integer, default: 1
  end

  def down
    # default値を指定していなかった場合 default:nilと書かないとrollback時にnilに戻らない
    change_column :users, :occupation, :integer, default: nil
  end
end
```

RailsGuideによると複雑なことやるときはreversibleを使いましょうというのもあるけど、それはまた別の機会に。（また今度というときはまず書かないかもですが:expressionless:）
> [マイグレーションを逆方向に実行 (ロールバック) する方法が推測できない場合、reversible を使います。](https://railsguides.jp/active_record_migrations.html#reversible%E3%82%92%E4%BD%BF%E3%81%86)
visualforceを使った帳票出力①

#まずやるべきこと

仕事で帳票出力のコードを書く機会があったので共有です。
精算書的なものを日に分けて、コメントの行数によってはページ送りしてみたいな内容でした。

何度かに分けていこうと思います。

まず、そもそもの初期からこけました。

```ruby:pdfsample
<apex:page renderAs="pdf">
    <apex:outputPanel>
        pdf出力
    </apex:outputPanel>
</apex:page>
```

これでいけるやろと思ったら、

はい。

<img width="849" alt="スクリーンショット 2019-08-08 22.33.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/1a4edd88-4035-466a-4dd2-b9c42a653aff.png">

日本語の出力ができません。
ただ単にrenderAs="pdf"をつけるだけではpdfにはなりますが諸々の設定はできません。

下記にように書き換えてください。

```ruby:pdfsample
<apex:page renderAs="pdf" contentType="application/pdf" applyHtmlTag="false" showHeader="false">
    <head>
        <style type="text/css">
            <!--日本語フォント指定-->
            body{ font-family: Arial Unicode MS; }
            
            <!--ページ設定(ヘッダーフッター等)-->
            @page {margin: 0; padding: 0; size: A4;}
        </style>
        
    </head>
    <apex:outputPanel>
        pdf出力
    </apex:outputPanel>
</apex:page>
```
####contentType="application/pdf"
####applyHtmlTag="false"
####showHeader="false"

この三つの要素は必ず入ります。これがないと、日本語の表記ができません。

###文字コードの設定
            body{ font-family: Arial Unicode MS; }            


CSSで上記の部分を指定します。
pdfにした際の文字コードは必ずArial Unicode MSになります。

###@pageで帳票のサイズを決定
            @page {margin: 0; padding: 0; size: A4;}

上記の書き方で通常のA4サイズになります。
横にする際は

            @page {margin: 0; padding: 0; size: A4 landscape;}

A4以外にもB4、B5、A5などももちろんOKです。

基本的な要素で間違えることがないよう、気をつけておきましょう。

<img width="1139" alt="スクリーンショット 2019-08-08 22.50.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/2c31743d-a3b6-7ecc-ea0d-464bb4da3ccb.png">

うまくできました。

続きはまた今度書いていきます。
minecraft 階段作り

幅５、奥行き５、最大高さ５の階段を作る

自分の立ってるところから１ブロックずらして、ライフを減らさないようにしてみた。
（この前、立ち位置に立方体作って死んだので）

from mcpi.minecraft import Minecraft
from mcpi.block import *
mc = Minecraft.create()
pos = mc.player.getTilePos()
for i in range(5):
    mc.setBlocks(pos.x+1+i,pos.y+i,pos.z,pos.x+5,pos.y+i,pos.z+4,STONE)

ファイル名はloop4.pyで保存。

備忘録でした。
テーブルに非スカラ（第1正規形未満、複数の値を文字列で格納）があったらexplode()を使う

いろいろな事情であるカラムがこういうときありますよね。

| id  | person_ids  |
|---|---|
|  1| 1,2,3|
|  2| 4,6|
|  3| 7,8,10|

ひとつのフィールド（エクセルでいうとセル）に複数の値が入っていると、get()した値をその後加工するとき大変です。

そんなときは、こちらのメソッド。

```php:例
$person_ids = '1, 2, 3';
$person_ids = explode(',', $person_ids);

// result
array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
}

```

もし、フィールドに余計な文字列などがあったらpreg_replace()等でテキストを整えてからやるとよい。

php.net
explode
https://www.php.net/manual/ja/function.explode.php
Dockerで exec user process caused エラー発生

# TL;DR
node.jsのイメージを扱う際にDockerfile内でENTRYPOINTを指定したが以下のエラーが発生。
ググるとgoの何かが足りないとか出てくるが別の原因がありそう。

```
node_1  | standard_init_linux.go:207: exec user process caused "exec format error"
node_1  | standard_init_linux.go:207: exec user process caused "no such file or directory"
```

# 原因

bashを指定していたが、node.jsのイメージにそもそもbashが無かった。
デフォルトで存在するshを指定して起動を確認。

```start.sh
#!/bin/sh
```
dockerのphp-fpmにGDとExifをインストールする

Dockerのphp-fpmのイメージにはGDとExifが入っていません。
docker-php-ext-installからインストールする必要があります。

```Dockerfile
FROM php:7.2-fpm-stretch

...省略

# install GD & exif
RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng-dev \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd exif
```
CloudBerry ExplorerでS3にSVGファイルをアップロードするときの注意

CloudBerry ExplorerでSVGファイルをAmazon S3にアップロードすると`Content-Type`が`application/octet-stream`で保存されてしまい、静的Webサイトをホストしていた場合にSVGファイルが表示されなくなってしまいます。

これは、CloudBerry Explorerには拡張子に応じて`Content-Type`を何でS3にアップするか設定があるのですが、SVGはデフォルトで登録がないため`application/octet-stream`でアップされてしまうためです。

「ツール」⇒「コンテンツタイプ」から`.svg`の拡張子に`image/svg+xml`を設定するとことで回避できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/354a2512-1022-2e63-5a94-67145e8be7b5.png)