OmniAICreator/Qiita-1.07M huggingface dataset:
B's clip で焼いてしまった写真をUbuntuで救出する

#我が幼少期の写真
仕事ついでに実家に帰ったのだが、B's clipとかいう昔のソフト(外付けHDDについてきたらしい)でCD-Rに書き込んだ我が幼少期の写真が、ブルーレイレコーダーで読めるのにパソコンで読めないと言われた。
#パソコン∌Linux
母の言うパソコンとはWindowsである。確かにWindowsでは読めず、ドライブのモーターが恐ろしげな音を立てるのみである。しかし、ブルーレイレコーダーでは読める。ということは、Linuxのドライバが組み込み向けになんか対応してたりしたら動くんじゃないかと思って、Ubuntu18.04を起動してドライブに突っ込んだら普通に読めた。
ありがとうUbuntu。
AzureADのハンズオンセミナーに参加して

## 参加セミナー

Azure Antenna - 開発者の創造性を支援する発信基地の『[Azure 開発・運用担当者のための ID 管理と権限制御](https://azure.connpass.com/event/95104/)』に参加しました。

## 参加目的

業務でAzureを利用しておりセキュリティ対策としてAzureADが使えるかどうかが知りたかった。

## 私の知識レベル

- Azureの以下のサービスを利用している。
  - WebApps
  - Azure Storage
  - SQL DB
  - VSTS
- ローカルのActiveDirectoryは理解している。
- AzureADについては使ったことは無い。

## 事前知識

資料を見る前に少し補足です。
これを知ってからみるとわかりやすいかなと思います。

### AzureADとAzureの親子関係

- AzureADが親でAzureが子供になります。（このセミナーで初めて話を聞いて知りました）
- 子供のAzureにログインして親のAzureADを操作するという奇想天外な事になっている。

これならAzureADだけ名前を変えて独立したサービスにした方がよっぽどわかりやすい。

### AzureにログインできるユーザーIDの種類

AzureにログインできるユーザーIDには2種類あります。

- Microsoftアカウント(MSA、旧 Windows Live ID）
- AzureADで作成したアカウント

### Azureにログインするのに良いアカウントはどっち

- AzureADのアカウントをすでに持っている場合
  - AzureADアカウントを利用する
- AzureADのアカウントを持っていない場合
  - Microsoftアカウントを利用してログインしてAzureADアカウントを作成する

最初からAzureADアカウントを持っているパターンとしてはOffice 365を利用している等です。
Microsoftアカウントを作らないでAzureADのアカウントも作れるみたいですが、手間がかかるみたいなので素直にMicrosoftアカウントを作ってそれを管理者用として運用しましょう。
業務で使用するのにこれってどうなのって思うんですが、良くわからないので後でマイクロソフトの人に聞いてみたいなって思っています。

### AzureADを作るとどうなるか

- AzureADアカウントを作るにはまずAzureADを作ります。
- AzureADを作るとAzureADディレクトリ（テナント）が作られる。
- AzureADディレクトリ内にAzureADアカウントを作っていきます。

AzureADアカウントは複数のAzureADディレクトリに属する事ができるので結構複雑になってきます。

### サブスクリプションを作ってリソースグループと関連付ける

- Azureに最初にログインしたアカウントでサブスクリプションを作る。
- リソースグループを作ってそこにサブスクリプションを割り当てる。
- WebApps等のサービスを作成してリソースグループを割り当てる。

サブスクリプションって実際なんだかは良くわかってません。
セキュリティーの境界とAzureのサービスの課金単位って話です。
すいません。ここは理解不足です。

### AzureADディレクトとAzureのリソースグループを関連付ける

- AzureADディレクトリ内のAzureADアカウントにサブスクリプションを割り当てる

ここまでを行うとAzureADアカウントとAzureのサービスの関連付けが終わるのでAzureADで管理することができます。

### AzureでのAzureADの役割

- 認証
    - Azureを利用できるユーザーか判断する。
- 認可
    - Azureの各リソースに対するアクセス制御
- 監査
    - 各リソースの操作ログの取得

## セミナーの内容

1. はじめに
2. Azure利用者のIDと権限管理
3. サブスクリプションとディレクトリ
4. Hands-on：自分の環境を確認しよう
5. Role Play：開発と運用の役割分担
6. ロール定義とカスタムロール
7. AzureにおけるIdentity
8. まとめ
9. Appendix

資料は[こちら](https://www.slideshare.net/AyumuInaba/azure-id-and-rbac-v05180824)にあります。
私が説明するよりもこの資料を見てもらった方が良いかと思います。  

### やってはいけないこと

- 私がこの状態なのですが、Microsoftアカウントとして使っているメールアドレスをAzureADアカウントとして登録する事だそうです。  
  一つのメールアドレスが、MicrosoftアカウントでありAzureADアカウントである状態です。  
  Azureポータルとかにログインする時もそうなのですが、どっちのアカウントでログインしているかわかりません。  
  なお、現在はこの設定はできないみたいです。
- Azureにログインして欲しくないユーザーをAzureADに登録してはいけません。  
  ここに登録するとAzureにログインできてしまいサービスの設定とかが見れたり変更できたりできてしまいます。
- 一つのMicrosoftアカウントを複数人で使いまわしてはいけません。  
  私はAzureADを知らなかったのでこれをやっていました。  
  Aさんが作ったAzureにBさんもログインしたいって言った場合、AさんのMicrosoftアカウントでログインするしか方法が思いつかなかったので・・・  
  実際は、AzureADアカウントを作ってそれでログインするが正解です。  
  そうする事で操作ログもしっかりとれますので。

## 感想

無料のセミナーだったのでそんなに期待していなかったのですが、マイクロソフトの方が講師だとは思いませんでした。
とても親切に教えていただき短い時間でしたがAzureADについて理解することができました。

AzureADが効果的に使えるとセキュリティー面についてはかなり楽になるなという感じがしました。
ちゃんと操作ログも残せるし、権限設定によってできる事も変えられるので。
ここら辺はローカルADと似ている所ですね。
あと、複数人でAzureを利用する方法について知ることができたのもとてもよかったです。
ここは期待していなかったのですが、ずっと知りたかったので。

わかりずらい点としては、Azureの中にAzureADが入っている事です。
親と子が逆転しているのでなんだってなります。
できればAzureADは独立したサービスにする方が良いと感じています。
また、MicrosoftアカウントとAzureADアカウントを統合してもらえると最高です。
あと、ローカルADとも違うので思い切ってADって名前変えた方が良いかなとも感じています。

最後に、AzureADアカウントを利用してできる事やログの部分とかセキュリティーの設定とか続編的なセミナーを行ってもらえると私としては嬉しいです。
vim scriptデバッグ方法

現在、 @mattn 氏作の[Qiita-vim](https://github.com/mattn/qiita-vim)がどうしても使いたくて、色々と修正をしています(Qiita API v2に対応させる必要があるため)
その時に使ったデバッグ方法です
(vim script初心者のため最適解ではない可能性があります)

---

vim scriptのデバッグ方法はいくつかあります

# `:debug`コマンド

```vim
:debug <command>
```
と実行することで、コマンドをステップ実行することができます。
ステップ実行の際のコマンドで、主に自分が使ったものをあげておきます。
尚正確かつ全てのコマンドについてはこちらの[vim-jpさんの:help日本語訳のページ](https://vim-jp.org/vimdoc-ja/repeat.html#debug-scripts)にあります。
説明のテキストもそこから借りています(正確さのため)

| 1 | 2 |
|:-:|:-:|
| step  |  コマンドを実行しそれが終わるとデバッグモードに戻る。  <br \>ユーザー関数やソースファイルの呼び出し時には呼び出し先の行に進む。 |
| bt  |  現在のデバッグセッションの呼び出しスタックトレースを表示する |
|  finish  | 実行中のスクリプトやユーザー関数を終了し呼び出し元でデバッグモードに戻る。  |
| up  | 呼び出しスタックトレースを 1 つ上へ移動する。  |
| down  | 呼び出しスタックトレースを 1 つ下へ移動する。  |
|  quit | 異常停止する。これはCTRL-Cを使うことに似ているが、全てを停止するわけではない。次のブレークポイントで停止する。  |
 
自分は上記のコマンドのみ使いました...(breakポイントは設定してみたのですがうまく使えなかった)


# `:verbose`コマンド

```vim
:<num>verbose <command>
```

上記`:debug`でのステップ実行がいちいちめんどくさい時は、これで全コマンドログを見ることができます。
breakポイントの設定ができればそちらの方がいいのですが自分はうまく使いこなせなかったので...
初めはこちらでログを見ていました。
`<num>`の部分に与えた数値によって挙動が変わるようです。
参考例では`99`を設定していたので自分もそのまま使いましたが、どうやらもっと小さな値で良いようです...(これについては参考サイトを忘れてしまったためうろ覚えです)

参考: [Gist] [mugyu/vimscript_debug.vim](https://gist.github.com/mugyu/6eea3e4f5906bf5e9eb6)




----

ちなみにこれは後から見つけたのですが、ログをファイルに出力することもできるようです。
(尚情報源が古いので今動くのか確認していません。)(まぁvimは後方互換大事にしていると聞くので多分使えるとは思いますが...)
誰か情報持っていれば教えてくださるとありがたいです

[dackdive's blog/vimでランタイムログを出力する](https://dackdive.hateblo.jp/entry/2014/09/10/113200)


---

これまたちなみにですが、`Qiita-vim`を動かせるようになったらまた投稿します。今度は`Qiita-Vim`から。
【PHP】3行クッキングでwebスクレイピングする

#スクレイピングとは
>ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。

引用：[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0)

#phpQueryの導入

##公式サイトからファイルをダウンロードする。
https://code.google.com/archive/p/phpquery/downloads

解凍後、プロジェクト内の好きな位置に置いてください。

## Step.1
###phpQueryを読み込む

```php:index.php
<?php
require_once("./phpQuery-onefile.php");
?>
```
パスはphpQuery-onefile.phpを置いた位置に合わせてください。

## Step.2
###webサイトを読み込む

```php:index.php
<?php
    require_once("./phpQuery-onefile.php");
    $html = file_get_contents("https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0");
?>
```
URLをfile_get_contentsの中に記入します。


## Step.3
###欲しい要素を取得します。

今回はこの部分を取得します。
<img width="1440" alt="スクリーンショット 2018-10-13 19_Fotor.png" src="https://qiita-image-store.s3.amazonaws.com/0/111276/7968ad91-65d4-0b5a-47bd-ec1ab71c5a78.png">


```php:index.php
<?php
    require_once("./phpQuery-onefile.php");
    $html = file_get_contents("https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0");
    echo phpQuery::newDocument($html)->find("h1")->text();
?>
```

こんな感じで表示されます！

![localhost_8080_tenki_public__Fotor.png](https://qiita-image-store.s3.amazonaws.com/0/111276/3c636cfc-be3d-1766-a792-eac6fd4f874c.png)

###終わり
ローカル環境でSSLをオレオレ証明書で行っていて警告が出てる人に朗報

# 概要
いつも警告が出て面倒に思っている自分がいましたが、ついにそれが解決できるときが。ブラウザからオフにすることもできるがセキュリティレベルを下げるのはよろしくないので、今までその選択肢を使っていませんでしたが、今年の6月に[mkcert](https://github.com/FiloSottile/mkcert)というリポジトリができ、この短期間でスターが1万超え！Goで作られていますね。

<img width="947" alt="スクリーンショット 2018-10-13 19.41.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/104056/8d02fd00-21d4-c9f0-d679-a2a5b6728430.png">

mkcertで証明書を発行するとなんと警告が出なくなりました！

<img width="330" alt="スクリーンショット 2018-10-13 19.39.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/104056/3cac6ae3-3453-6a0e-ce07-73b4fcee4c64.png">

さっそく、インストールを手順を説明していきます。

# 環境
OS: 10.13.5
ブラウザ: chrome 69

# インストール手順
## mkcertのインストール
homebrewからインストール可能です。READMEにも書いてありますが、Firefoxを使用している人は、別途nssのインストールが必要みたいです。今回はChromeで行ったのでFirefox環境では検証していません。

```sh
brew install mkcert
brew install nss # if you use Firefox
```

## local CAをインストール

```sh
mkcert -install
```

※ macOSの場合 `/Users/hogeuser/Library/Application Support/mkcert` に local CAファイルが生成されます

## 指定ドメインの証明書を作成
今回は、以下の4つの証明書を発行します。homeディレクトリで以下のコマンドを実行すると、homeディレクトリ配下に `0.0.0.0+3-key.pem` と `0.0.0.0+3.pem` というファイルができます。 `+3` は、 `0.0.0.0` 以外に3つのドメインで使用できるという意味だと思います。 `0.0.0.0` だけで実行するとファイルは、 `0.0.0.0-key.pem` になります。

```sh
mkcert 0.0.0.0 localhost 127.0.0.1 ::1
```

# アプリケーションサーバーで読み込ませる
あとは、起動するアプリケーションサーバーに読み込ませるだけです。今回は、Rails Pumaで読み込ませる例を一応記載しておきます。
ちなみに、 `0.0.0.0+3-key.pem` のままのファイル名だと記号があるせいでうまく読み込まれないので、コピーしてリネームしています。
`0.0.0.0+3-key.pem` -> `server.key`
`0.0.0.0+3.pem` -> `server.crt`

```ruby
if "development" == ENV.fetch("RAILS_ENV") { "development" }
  ssl_bind (ENV['DOCKER_HOST'] || '127.0.0.1'), '3001', {
    key: "config/server.key",
    cert: "config/server.crt",
    verify_mode: "none"
  }
end
```

以上で、警告が出なくなります！超簡単！
Ruby on Rails チュートリアル setupメソッド users(:michael)　10.11: 編集の成功に対するテスト 


```ruby
def setup
  @user = users(:michael)
end
```

usersって何だっけ？なんで:michealを引数にして呼び出せるの？

と思い、調べました。

結論：users.yml を参照しています。
---

Ruby on Rails チュートリアルを参照すると、

>```ruby
user = users(:michael)
```

>上のusersはfixtureのファイル名users.ymlを表し、:michaelというシンボルはリスト 8.22のユーザーを参照するためのキーを表します。

また、users.yml は下記のようになっています。

>```yml
michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>
```

>有効なユーザー用のfixtureを作成できたので、テストでは次のようにfixtureのデータを参照できるようになります。

>```ruby
user = users(:michael)
```

また、１０章では、users.yml を使用して、

>```ruby
 test "successful edit" do
    get edit_user_path(@user)
    assert_template 'users/edit'
    name  = "Foo Bar"
    email = "foo@bar.com"
    patch user_path(@user), params: { user: { name:  name,
                                              email: email,
                                              password:              "",
                                              password_confirmation: "" } }
    assert_not flash.empty?
    assert_redirected_to @user
    @user.reload
    assert_equal name,  @user.name
    assert_equal email, @user.email
  end
```

このようにテストを行っています。

####参考になった記事
https://qiita.com/itkrt2y/items/ca34fea17fc7dde56b7a

Ruby on Rails チュートリアル　８章
https://railstutorial.jp/chapters/basic_login?version=5.1#cha-basic_login

また、自分の記事はゴミ記事なんだろうと思って
新しくQiitaでまとめることはあまりしないようにしようかと思っていたけれど、下記記事をよんで
・自分用の備忘録として残しておくため
また、きっとグーグルが検索の結果ゴミ記事がでてこないようにしてくださると思うので、たくさん書いて練習していきたい

https://qiita.com/akira_/items/c8881dcde93d4cb035c7

また、このまとめ記事がとても読みやすいかったので、以下画像のようにするとMarkdownが見れました。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/253014/a7fcde79-d0c5-3c35-0d8d-fa921e3fcb3d.png)

Markdownを活用するなどして、見やすい、読みやすい記事を書いていきたいです。

追記：全画面でプレビューを確認する。
--

![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/253014/13401749-d137-cf54-598e-23c5e295b3d4.png)

上記画像の赤枠の箇所をクリックすると、全画面でプレビューを見ることができるので、確認のときに便利です。

a
--

とか

~~a~~

とか

- a
- b
- c

###a

[^1]

[^1]: ジャンプ

>a

>>aa

Markdown練習
GASまわりのお勉強2


# 実行可能APIとして導入

ライブラリとして読み込めるようになる
内部でAPI通信しているから遅延があるっぽい

Google Apps Scriptでライブラリを作る！共通関数の作り方 - lisz-works
https://www.lisz-works.com/entry/gas-create-lib

## Apps Script API（Execution API）

Apps Script APIの前身がExecution APIらしい

Apps Script API  |  Google Developers
https://developers.google.com/apps-script/api/

## 実行可能APIとして導入

Apps Script APIを利用するみたいね

Create a Target Project to Execute with the Apps Script API  |  Apps Script API  |  Google Developers
https://developers.google.com/apps-script/api/quickstart/target-script

ダッシュボードから追加しようとしても"Execution API"は見つからず、"Apps Script API"は見つかった

【GAS】Execution APIを使ってJavaScriptからGASにアクセスする - Qiita
https://qiita.com/ShishidoToru/items/67a7cad6b997e316cb20

# ウェブアプリケーションとして導入

たぶん、doGetとかdoPostというインターフェイスでアクセス可能にするやつ
APIよりはシンプルなのかな

【Google Apps Script】その15　Execution APIを使い、外部からAPIとして叩く - Qiita
https://qiita.com/rf_p/items/2eeb5e5e863fb3f42860

# functions

APIではなくてfunctionsを使ったほうがいい線引きはどこなのか
gcloudとclaspのどっちが使いやすいのかとか

デプロイはちょっと遅い気がする

ローカルマシンからのデプロイ  |  Cloud Functions のドキュメント  |  Google Cloud
https://cloud.google.com/functions/docs/deploying/filesystem?hl=ja

使い方、エディタ上でpackage.jsonをいじればモジュール使えるのか、便利ね。

Cloud Functions with Puppeteer + Google Apps Script でスクレイピングサーバーをサクッと作る - Qiita
https://qiita.com/howdy39/items/2f355fea8340a35aa5da

クレデンシャルを埋め込まなくて済むのか。

Google Cloud functionsで、Cloud Vision APIを #gcpja |
https://www.totalsolution.biz/google-cloud-functions-vision/

公式

クイックスタート： gcloud コマンドライン ツールの使用  |  Cloud Functions のドキュメント  |  Google Cloud
https://cloud.google.com/functions/docs/quickstart

公式のエミュレータを使ってローカル実行する

Cloud Functions ローカル エミュレータ  |  Cloud Functions のドキュメント  |  Google Cloud
https://cloud.google.com/functions/docs/emulator

# clasp

たぶん、deployはできるけど実行可能APIにするかとかはできないのかな
 (できるっぽい、clasp deploymentsとか)

google/clasp： 🔗 Develop Apps Script projects locally.
https://github.com/google/clasp

だいぶ便利だけどgasはimport,requireがつかえないのか。。functionsに移行したほうがいいかなあ。

［GAS］ claspで設定不要でTypescriptが使えるようになりました - Qiita
https://qiita.com/mildcoffee/items/56a79e271dd28eb038b7

# Speech API

nodeで使いたいけど、ファイルを置けないので苦労

クイックスタート： クライアント ライブラリの使用  |  Cloud Speech-to-Text API  |  Google Cloud
https://cloud.google.com/speech-to-text/docs/quickstart-client-libraries

@google-cloud/speech 1.1.0 » Class： SpeechClient  |  Node.js  |  Google Cloud
https://cloud.google.com/nodejs/docs/reference/speech/1.1.x/v1.SpeechClient

@google-cloud/speech 2.1.0 » Module： @google-cloud/speech  |  Node.js  |  Google Cloud
https://cloud.google.com/nodejs/docs/reference/speech/2.1.x/module-@google-cloud_speech

functionsでpythonで利用できたが、ボソボソ会話だと精度が足りなさそう
1と2をトグルする演算を短く分かりづらく

# はじめに

0と1を切り替える需要は多く、単に否定を取ればよい。誰でもわかる。では1と2を切り替えるには？

正真正銘ゴミ記事です

# 結論

```cpp:C++17
template<typename T, std::enable_if_t<std::is_integral_v<T>, std::nullptr_t> = nullptr>
constexpr T toggle_1_2(T n)
{
    return !(n - 1) + 1;
}
```

1. `n`から1引く。これで0と1に持ち込む
2. 否定を取る
3. 1足す

わかりやすさはないが、短くは書ける。

# License

[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/deed.ja)

<a href="https://commons.wikimedia.org/wiki/File:CC-BY_icon.svg#/media/File:CC-BY_icon.svg"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/16/CC-BY_icon.svg/1200px-CC-BY_icon.svg.png" alt="CC-BY icon.svg" width="88px"></a>
homebrewでgitをインストールしようとしたらxcodeがなくてエラー

homebrewでgitをインストールしようとAPP storeからxcodeをインストールしてからhomebrewでgitをインストールしたらxcodeがないとなぜか怒られる。

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

コマンドツールがないみたい。
これを打つ。

```bash

xcode-select --install
```

参考
Mac OS Sierraにしたらgitコマンド、ターミナル上にエラーが出てしまった。
https://qiita.com/ARTS_papa/items/60ba305b23dc967bba87
大阪府立大学公開講座・機械安全に関する講演の関係リンク集

#平成30年度　大阪府立大学公開講座　第16回 21世紀科学セミナー
- 2018年10月19日（金）15:00~16:30
- [I-siteなんば](https://www.osakafu-u.ac.jp/isitenanba/) 2階
- 講演タイトル
    - ネットワーク社会Society5.0と機械安全のこれから
    - チラシの画像データを文末に掲載

#関係リンク集
##機械安全
- [中央労働災害防止協会・機械安全とは](https://www.jisha.or.jp/machinery/about01.html)
- [機械安全とは：オムロン](https://www.fa.omron.co.jp/solution/sysmac/safetynavigator/safety_intro/safety02.html)
- [厚生労働省「職場のあんぜんサイト」](http://anzeninfo.mhlw.go.jp/index.html)
- [産業用ロボットの人間工学的研究(1)](https://www.jstage.jst.go.jp/article/jje1965/19/5/19_5_259/_pdf)
- [安全：Wikipedia](https://ja.wikipedia.org/wiki/安全)
- [死亡災害データベース](http://anzeninfo.mhlw.go.jp/anzen_pg/SIB_FND.aspx)

##機能安全
- [IEC61508:Wikipedia](https://ja.wikipedia.org/wiki/IEC_61508)
    - JIS C 0508「電気・電子・プログラマブル電子安全関連系の機能安全」
- [サービスロボットガイドライン](http://www.meti.go.jp/policy/mono_info_service/mono/robot/downloadfiles/saftygl/gl1_5-2.pdf)
- [ISO13482](https://www.jqa.jp/service_list/fs/service/13482/index.html)
- [ISO1342/生活支援ロボット](http://www.jst.go.jp/crest/dvlsi/topics/14rkJ/14DVLSIRKoikawa.pdf)
- [ISO13482:Wikipedia](https://ja.wikipedia.org/wiki/ISO_13482)
- [スバル](https://www.subaru.jp/eyesightowner/care/control.html)

##Society5.0
- [内閣府：Society5.0](http://www8.cao.go.jp/cstp/society5_0/index.html)

##Industry4.0
- [日商](https://www.nelco.com/ja/industry4/)

##IIC
- [IIC:Overview](https://www.iiconsortium.org/working-committees.htm)
- [IIC:members](https://www.iiconsortium.org/members.htm)

##中国製造2025
- [IT用語辞典](https://www.keyence.co.jp/ss/general/iot-glossary/made-in-china2025.jsp)

##IoT
- [ロボット革命イニシアティブ協議会：中小企業での事例](https://www.jmfrri.gr.jp/info/rri/380.html)

##AI
- [人工知能の歴史：人工知能学会](https://www.ai-gakkai.or.jp/whatsai/AIhistory.html)


##Robotics
- [NEXTAGE](![https://www.youtube.com/watch?v=R3fgz5EwqZw)
- [システム思考ガイドブック](https://www.jmfrri.gr.jp/content/files/Open/2018/20180614_Guide_SystemE/Guidebook-SystemThinking___.pdf)
- [ROS wiki:ja](http://wiki.ros.org/ja)

#セキュリティー
- [Stuxnet](https://www.jpcert.or.jp/ics/2011/20110210-oguma.pdf)
- [WireLess Wire News](https://wirelesswire.jp/2018/07/65993/)


##講演について
![総合安全科学研究所チラシ.png](https://qiita-image-store.s3.amazonaws.com/0/237044/831392b8-9db7-cd04-6961-27f3331a3db6.png)
immer でめちゃ便利な React のステート管理向けのライブラリを書いた

# はじめに
この記事は React のステート管理向けのライブラリを書いて使ってみているけれど、
かなり便利なものになったので、それを書くに至った経緯とか実装中に調べていたライブラリ周りの紹介をします。

# 作ったもの

> hrsh7th/srimmer
> https://github.com/hrsh7th/srimmer

かなり軽量なステート管理向けのライブラリで、まだ実装途中だけど自分で使ってみている。ちなみに、あとで紹介する予定だけど [react-copy-write](https://github.com/aweary/react-copy-write) っていうのに相当インスパイアされている。TypeScript で確実に型が推論されることと、あまり意識せずともパフォーマンスが悪化しないように意識して作っている。簡単な使い方は以下。

```typescript
import React from 'react';
import ReactDOM from 'react-dom';
import { define } from 'srimmer';

type State = {
  count: number;
};

const {
  Provider,
  select,
  update
} = define<State>();

const Consumer = select(state => ({
  count: state.count
}));

ReactDOM.render(
  <Provider state={initialState()}>
    <Consumer>
      {state => (
        <div>{state.count}</div>
      )}
    </Consumer>
  </Provider>, 
  document.getElementById('app')!
);

setInterval(() => {
  update(state => {
    state.count++;
  });
}, 1000);
```

# 経緯
[immer](https://github.com/mweststrate/immer) というライブラリが公開されているのを知り、「これは便利！」と思っていたのだけれど、触ってみることはできていなかった。

そんなこんなで時間が経ってから「ガントチャートを表示するツールを作るぞー！」という機運が自分の中で高まり、実装を開始した。

その時に選定したスタックが TypeScript + React + immer + react-copy-write だった。

しかし、[react-copy-write](https://github.com/aweary/react-copy-write) が TypeScript と相性が悪くて、コード量もそんなでもないし自作しよう！と思い至った。

# どうなの？
書き味は今の所最高。
パフォーマンスのチューニングもしやすい。

実際のコードはまだまだ実装途中だけど、[ganttcharty](https://github.com/hrsh7th/ganttcharty) ここにおいてあるので興味があれば見てもらうといいかもしれない。（

# 紹介とか
## [immer](https://github.com/mweststrate/immer)
mutable な操作を ES.Proxy で trap して immutable な操作に翻訳してくれる。
また、操作自体を内部的に全て trap しているので Redux の time traveling のようなことが JSON-Patch で実現できるようになっている。

```typescript
import produce from 'immer';
const state = {
  value: 1
};

const newState = produce(state, state => {
  state.value++;
});

state.value //=> 1
newState.value //=> 2
```

## [react-copy-write](https://github.com/aweary/react-copy-write)
上記の immer を利用して、React につなぎ込みを行うライブラリ。

# 終わりに
食わず嫌いはやめて Redux 触らないとだめなのかなあとは思ってはいる。
（が、どうしても Redux が正解とは未だに思えてない。。。）

この記事を読んで [immer](https://github.com/mweststrate/immer) と [react-copy-write](https://github.com/aweary/react-copy-write) を覚えて帰っていただければ満足です！
Kaggle PUBG Finish Placement Prediction 日本語訳

Kaggle の新しいコンペとして日本でもおなじみ [PUBGを題材にしたもの](https://www.kaggle.com/c/pubg-finish-placement-prediction) が追加されました。
「Playground」なのでTitanicやHouse Prices の次に何やろうかという人向けに概要・ルールなどを簡単に日本語化しました。
そもそもPUBGとは？という人はまずは
https://ja.wikipedia.org/wiki/PLAYERUNKNOWN%27S_BATTLEGROUNDS
こちらから。


# 日程
開始 2018/10/4
終了 2019/1/30 11:59(UTC)

---
元ページ:https://www.kaggle.com/c/pubg-finish-placement-prediction

# 概要 (Overview)
## 説明(description)
バトルロイヤル型のビデオゲームが世界を席巻しています。
100人のプレイヤーは素手で島に落とされ、プレイゾーンが縮小し続ける中最後の1人になるまで他のプレイヤーを探索し、掃討し、排除する必要があります。

PlayerUnknown'sBattleGrounds（PUBG）は5000万本を超える売り上げを誇る大人気のゲームで、これは歴史上5位の記録となっています。
またアクティブプレーヤーの数は数百万人/月と現在も活発に遊ばれています。

PUBG開発チームは 「The Blue Circle」(訳注:PUBG用語。フィールド上で段々狭まってくる生存可能領域。この円の外にいるとダメージが発生して生存できなくなる)の外を探索して掃除するための公式のゲームデータを公開しました。

このコンぺはKaggleがPUBG Developer APIを使用して収集したデータを使用する**非公式**なものです。

65000ゲーム以上の匿名化されたプレーヤーデータをトレーニングセットとテストセットに分割しました。データに含まれる最終的なゲーム内のスタッツと初期プレーヤーの評価からプレイヤーの最終的な順位を予測して下さい。

PUBGで勝つ最良の戦略は何か？ひとつの場所で芋るべきかトップショットになるべきか？
さぁデータと会話して導き出しましょう！

## 評価方法
評価は予測したwinPlacePercと実際に観測されたwinPlacePercの間のMeanAbsoluteError（平均絶対誤差)で評価されます。
### 提出ファイル
テストセットの各IDに対してwinPlacePerc変数のプレースメントをパーセンテージ(最後は0、最初は1）として予測する必要があります。ファイルにはヘッダーが含まれており次の形式を持つ必要があります。
>Id,winPlacePerc 
47734,0 
47735,0.5 
47736,0 
47737,1 etc.

データページにあるsample_submission.csvが完全な提出サンプルのためそちらを参照してください。

## 賞品(Prize)
コンペが終了時点でリーダーボードの上位5つのソリューションと5つの最も人気のあるカーネルについて
締め切り時のupvoteの数によって決定されKaggleのノベルティが提供されます。

---
元ページ:https://www.kaggle.com/c/pubg-finish-placement-prediction/data

# データの説明 (Data Description)
PUBGのゲームでは各試合(matchid)最大100人のプレーヤーで開始されます。
プレイヤーはチーム(groupid)に参加することができ、ゲーム終了時にランク付けされます(winPlacePerc)これはそのプレイヤーが死んだときに他の多くのチームがまだ生きているかどうかに基づいています。
ゲーム中、プレイヤーは様々な武器を拾ったり気絶したチームメイトを復活させたり車を運転したり、泳ぎ、走り、撃つことなど全ての結果を経験することができます。--それが遠くへ落ちたり自爆したりというようなことであっても。

データの各行に1人のプレイヤーのゲームスタッツが含まれるようフォーマットされた多数の匿名化されたPUBGゲームの統計が提供されています。
データは「ソロ」「デュオ」「チーム」「カスタム」のすべてのタイプのゲームが含まれています。ゲーム毎に100人の選手が存在し、
グループ当たり最大4人の選手がいるという保証はありません。

最終的なスタッツに基づいて1(1位)から0(ビリ)までのプレイヤーの最終順位を予測するモデルを作成する必要があります。

## ファイル構成
- train.csv -- トレーニングセット
- test.csv -- テストセット
- sample_submission.csv -- 提出CSVファイル(正しいフォーマット)のサンプル

## データフィールド
|カラム名||
|:-----------------:|:------------------|
|DBNOs|敵プレイヤーを気絶させた数(down but not out)|
|assists|チームメイトが倒した敵にダメージを与えた人数|
|boosts|ブースとアイテムを使用した数|
|damageDealt|与えたダメージ総数(自傷分は除く)
|headshotKills|ヘッドショットで倒した敵の数|
|heals|回復アイテムの使用数|
|killPlace|1ゲーム内での敵を倒した数のランク|
|killPoints|kill数ベースの外部ランキング(Eloレーティングとして考える)|
|killStreaks|短時間で倒した敵の最大数|
|kills|敵プレイヤーを倒した数|
|longestKill|プレイヤーとプレイヤーが倒した敵が死亡した時の最長距離(これはプレイヤーを倒してから遠ざけても長くなるので注意が必要)|
|matchId|試合ID(トレーニングセットとテストセットで一致するものはない)|
|revives|チームメイトを蘇生させた数|
|rideDistance|車両での走行距離の合計(メートル単位)|
|roadKills |乗り物乗車中に倒した敵の数|
|swimDistance|泳いだ合計距離(メートル単位)|
|teamKills|チームメイトを倒した数|
|vehicleDestroys|破壊した車両の数|
|walkDistance |足で移動した合計距離(メートル単位)|
|weaponsAcquired|取得した武器の数|
|winPoints|勝利ベースの外部ランキング(Eloレーティングとして考える)|
|groupId|試合中でのグループID(同じグループのプレイヤーが異なる試合でプレイするとグループIDも異なる)|
|numGroups|試合中のグループ数|
|maxPlace|試合中の最低順位.時々データが順位付けをスキップすることがあるのでnumGroupsと一致しないことがある。|
|winPlacePerc|予測対象。1位が1 最下位が0に対応したパーセンテージで表現された最終順位。これはnumGroupではなくmaxPlaceから計算される為、試合中の一部の情報のまとまりが失わている可能性がある|
macで最新gitを入れる

macでデフォルトで入っているgitがあるけど、最新ではない。
homebrewでインストールしたけど反映してない？とき

```bash

# なければ次を作る
touch ~/.bash_profile
touch ~/.bashrc

vim .bash_profile
# これを追記
export PATH="/usr/local/Cellar/git/2.19.1/bin:$PATH"
# iTermを再起動

git --version
```
参考サイト
HomebrewでGitをインストールする
https://qiita.com/micheleno13/items/133aee005ae37c28960e
テーブル内スクロールを実現しようとしてハマった

テーブル内スクロールを実現しようとしてハマった。
* macでスクロールバーが常に表示されない（スクロールできるかわからないため、見逃される可能性が高い）
* スクロール時に枠線がずれる

## macでスクロールバーが常に表示されない
```css:css
overflow-y: scroll;
```
を指定すればいいと思っていたが、macだと設定が効かない。

以下のように特別対応する必要があるらしい。

```css:css
/* macでスクロールバーを常に表示する */
table ::-webkit-scrollbar {
    -webkit-appearance: none;
    width: 7px;
}
table ::-webkit-scrollbar-thumb {
    border-radius: 4px;
    background-color: rgba(0,0,0,.5);
    box-shadow: 0 0 1px rgba(255,255,255,.5);
}
```
別にデザインを入れる必要性まであるのかはわからないけど、デバッグが面倒なのでここまでの理解にしておこう。

## スクロール時に枠線がズレる
以下を見て解決。 
http://bashalog.c-brains.jp/18/04/03-110000.php

scrollバーのせいで幅がズレるため、 widthと同じ値を min-widthに設定すれば良いとのこと。
【PHPフレームワーク】Laravelのインストールからアプリの実行

#Laravelのインストールからプロジェクト作成

##環境
- macOS HighSierra 10.13.6


##Composerのインストール

###Composerのファイルをダウンロードする
以下のサイト「Manual Download」から任意バージョンのリンクをクリックする。
https://getcomposer.org/download/

###/usr/local/binに配置する
ターミナルを起動し、composer.pharをダウンロードしたディレクトリへ移動し以下を実行する。

```bash
sudo mv composer.phar /usr/local/bin/composer
```
これでcomposerをいつでも呼び出せるようになります。

###パーミッションを設定する
以下を実行しcomposerを実行できるようにする。

```bash
chmod a+x /usr/local/bin/composer
```
composer -Vを実行してComposerのバージョンが表示されれば、完了です。

##Laravelのインストール
以下を実行する。

```bash
composer global require #laravel/installer=~1.1"
```
完了！！

##Laravelプロジェクトの作成から起動

###laravelプロジェクトの作成
プロジェクトを作成したいディレクトリに移動して以下を実行します。
プロジェクト名は任意で入力してください。
今回は「laravelapp」とします。

```bash
laravel new laravelapp
```

###アプリケーションの起動

```bash
cd laravelapp

php artisan serve
```

これでブラウザでアクセスするとアプリのトップページが確認できます。
http://localhost:8000/

![localhost_8080_tenki_public_ (1).png](https://qiita-image-store.s3.amazonaws.com/0/111276/71f2b956-88fa-1518-01b0-98f6ad79c617.png)

以上でアプリの実行が完了です！
楽しいlaravelライフを！！
nginxにおけるWebP画像の選択的レスポンスの設定方法

以前、Apache(`.htaccess`ファイル)について書きました。

[.htaccessによるWebPの選択的レスポンスとその問題点と改善案](https://qiita.com/miyanaga/items/6570c3c9ae8e15dbb57c)

今回はnginxについてです。

# 拡張子追加の場合(image.jpg→image.jpg.webp)

以前の記事で、`.webp`という拡張子は元の拡張子を置換するのではなく置き換える方がよいと思うと書きました。

* path/to/image.jpg → path/to/image.webp ← こちらの置換方式より
* path/to/image.jpg → path/to/image.jpg.webp ← こちらの追加方式の方がいい

nginxでは、追加方式の場合驚くほど簡単にWebP画像の出し分けを記述することができます。

こちらを参考にしました。

[Recipe: serve WebP with nginx conditionally](https://github.com/uhop/grunt-tight-sprite/wiki/Recipe:-serve-WebP-with-nginx-conditionally)

```nginx
# serverディレクティブの外で
# Acceptリクエストヘッダにimage/webpが含まれていたら$webp_suffix変数に".webp"を代入
# 含まれていない場合、$webp_suffixは""(空文字列)
map $http_accept $webp_suffix {
    default   "";
    "~*image/webp"  ".webp";
}

server {
# …中略

        # 大文字小文字問わず.pngか.jpgで終わるリクエストについて
        location ~* \.(png|jpe?g)$ {
            # VaryヘッダとしてAcceptを返す
            add_header Vary Accept;
            # WebP対応ブラウザでは、image.jpg.web、image.jpgを探索
            # 非対応のブラウザでは、image.jpg、image.jpgを探索
            # いずれもない場合は404を返す
            try_files $uri$webp_suffix $uri =404;
        }
}
```

`map`ディレクティブはプログラミング言語でいう`CASE~WHEN`のような働きをします。
`server`内部に記述すると設定エラーになりました。

`try_files`は、先頭からファイルを探索して最初にヒットしたファイルを返すというものです。

`Accept`リクエストヘッダがあるときに、末尾に`.webp`が付いたファイルを探索するというロジックがスマートに記述されています。

なお、自分はDocker版nginxでテストしたのですが、デフォルトの設定では、以下のように`root`が`location /`に記述されていたので、

```nginx
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
```

次のようにネストして記述しました。

```nginx
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;

        location ~* \.(png|jpe?g)$ {
            add_header Vary Accept;
            try_files $uri$webp_suffix $uri =404;
        }
    }
```

# 拡張子置換の場合(image.jpg→image.webp)

~~こちらは合理的な方法を発見できませんでした。
Luaを使うなどトリッキーな方法しかなさそうです。~~

こちらが近いかなーと思いましたが、

[WordPressでwebpを使って画像サイズ削減](https://www.zukeran.org/shin/d/2017/12/01/optimizing-wordpress-3/)

~~**拡張子が置換されたファイルの有無を確認する(そのパス文字列を構成する)**というロジックが実現できませんでした。~~

こちらの記事で見つけました。

https://www.keycdn.com/blog/convert-to-webp-the-successor-of-jpeg

次のような設定で拡張子の置換ができるようですが、拡張子追加の記述の方がわかりやすいです。

```bash
location ~ ^(/path/to/your/images.+)\.(jpe?g|png)$ {
    if ( $http_accept ~* webp ) {
        set $webp "A";
    }
    if ( $request_filename ~ (.+)\.(png|jpe?g)$ ) {
        set $file_without_ext $1;
    }
    if ( -f $file_without_ext.webp ) {
        set $webp "${webp}E";
    }

    if ( $webp = AE ) {
        add_header Vary Accept;
        rewrite ^(.+)\.(png|jpe?g)$ $1.webp break;
    }
}
```

nginxでは`if`を使った時点で黄色信号っぽいですね。公式自らこんなエントリーを上げるとは…[If Is Evil](https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/)

この理由もあって、`.jpg`などの拡張子を`.webp`に置き換えるのではなく、拡張子にさらに`.webp`を追加する方法がオススメなのでした。
vue-fakerでstubを作る

vue.jsでview側を作るとき適当なデータを用意したいですよね。
なので、vueのライブラリ「vue-faker」を使ってそのstubを作ろうと思います。

## vue-fakerをinstall

``` terminal
$ yarn add vue-faker
```

- 公式サイト「[vue-faker](https://www.npmjs.com/package/vue-faker)」
- faker「[API Reference](https://rawgit.com/Marak/faker.js/master/examples/browser/index.html)」

## stub.jsの作成

「vue.faker」を読み込んで、適当なデータをfor文で作成します。

``` javascript:stub.js
import Vue from 'vue';
import VueFaker from 'vue-faker';

Vue.use(VueFaker);

const hogeLength = 100;
const db = {
  hoge: [],
};

for (let i = 0; i < hogeLength; i += 1) {
  db.hoge.push({
    id: i + 1,
    title: Vue.faker().name.title(),
    text: Vue.faker().lorem.words(),
    tags: [Vue.faker().lorem.word(), Vue.faker().lorem.word()],
    image_path: Vue.faker().image.image(),
    createdAt: Vue.faker().date.past(),
    updateAt: Vue.faker().date.future(),
  });
}

export default db;
```

## storeでstubを読み込む

作ったstubをstoreのstateで管理させます。

``` javascript:store.js
import db from './stub';

const state = {
  hoge: db.hoge,
};

export default {
  state,
};
```

こんな感じでいいでしょうか。
ubuntu16.04からCiscoのルータに入る

以下みたいな形で設定してログインする。


```
hogehoge@pc:~$ cu -s 9600 -l /dev/ttyUSB0
cu: open (/dev/ttyUSB0): Permission denied
cu: /dev/ttyUSB0: Line in use

一般ユーザでやるときはパーミッションを変える
hogehoge@pc:~$ sudo chmod 666 /dev/ttyUSB0 
hogehoge@pc:~$ cu -s 9600 -l /dev/ttyUSB0
```


以上
Ansible で mod_dosdetector-fork をインストール

Ansible で `mod_dosdetector-fork` をインストールするサンプルです。

```YAML:defaults/main.yml
---
- ansible.builtin.set_fact:
    git_clone_dir: "{{ temp_dir }}/mod_dosdetector"

- name: Install dependences.
  ansible.builtin.yum:
    name: "{{ dependencies }}"
    state: present

- name: Clone remote Git repository.
  ansible.builtin.git:
    repo: "{{ git_repository }}"
    dest: "{{ git_clone_dir }}"

- name: Replace apxs path in Makefile.
  ansible.builtin.replace:
    dest: "{{ git_clone_dir }}/Makefile"
    regexp: APXS=.*
    replace: "APXS={{ apxs_path }}"

- name: Make mod_dosdetector.
  community.general.make:
    chdir: "{{ git_clone_dir }}"

- name: Install mod_dosdetector.
  community.general.make:
    chdir: "{{ git_clone_dir }}"
    target: install

- name: Delete Git clone directory.
  ansible.builtin.file:
    path: "{{ git_clone_dir }}"
    state: absent
```
Rubyでpaizaのスキルチェック問題に挑戦【Dランク】

rubyでpaizaのスキルチェックのDランクをクリアするために最低限知っておくべきメソッドをまとめました。

## こんな人が対象
1. Rubyで簡単なif文、while文が書ける
2. とりあえずprogateはやったよ
3. 手軽にコードを書く練習がしたい
4. paizaスキルチェックやってみたけど入力とか出力とかよく分からない


## プログラムの手順
おおまかに以下の手順で説明します。Dランク問題であれば、Rubyの場合は一行で全てのコードを書けることもしばしばですが、分解して説明します。

1. 入力を受け取る
2. 処理を行う
3. コンソールに出力

## 1. 入力を受け取る

### getsメソッド
getsメソッドは一行の入力を受け取ります。

```
apple
banana
```

という入力の場合、一度のgetsメソッドで最初の行を受け取ることが出来ます。


```hoge.rb
input = gets
puts input #=> apple
```

2回目のgetsで2行目の入力を受け取ることができます。

```hoge.rb
input = gets
input2 = gets
puts input #=> apple
puts input2 #=> banana
```

ただしにgetsメソッドを用いるとき、以下の二つの注意点を頭に入れておく必要があります。

1. 改行を含めて受け取る。
2. 受け取るときのデータ型は全て**文字列**である。

### chompメソッド

以下の入力があった時appleとbananaを一列で出力したいと思います。

```
apple
banana
```

```hoge.rb
input = gets
input2 = gets
puts input + input2
#=> apple
#=> banana
```
二行に分かれて出力されてしまいます。
これは、getsメソッドが1行の入力を受け取るときに、**改行("\n")**を含めて受け取ってしまっているからです。

そこで、chompメソッドの出番です。

chompメソッドは文字列の末尾の改行文字を取り除きます。

```hoge.rb
input = gets.chomp
input2 = gets.chomp
puts input + input2
#=> applebanana
```
appleとbananaが続けて出力されるようになります。
事情がない限りは、getsメソッドとchompメソッドは合わせて用いるようにするとよいでしょう。

### to_iメソッド
1行目の入力「10」と2行目の入力「20」を足し合わせて30を出力したいとしましょう。

```
10
20
```

```hoge.rb
input = gets.chomp
input2 = gets.chomp
puts input + input2  #=> 1020
```

30ではなく1020が出力されてしまいます…。

そうです。おなじみのto_iメソッドの出番です。

```hoge.rb
input = gets.chomp.to_i
input2 = gets.chomp.to_i
puts input + input2  #=> 30
```
getsメソッドでは「文字列」を受け取っているため、変数に格納するときにto_iメソッドで「数」に変える必要があります。注意しましょう。

## 2. 処理を行う

### splitメソッド
getsメソッドを使って、1行ごとの入力を受け取る方法が分かりました。ではこんな場合はどうでしょうか。

先ほどと同じく、入力「10」と入力「20」を足し合わせて30を出力したいとしましょう。

```
10 20
```

ここで必要となるのがsplitメソッドです。
splitメソッドは文字列を分割し、配列化してくれるメソッドです。

```hoge.rb
input = gets.chomp
inputs = input.split(" ")
print inputs #=> ["10", "20"]
```

上の場合ではsplitメソッドに(" ")という引数を与えることで、スペース(" ")毎に分割を行われ、それが変数inputsに配列として格納されます。

splitメソッドの引数を("")にすると、1文字単位で区切ることが出来ます。

```
apple
```

```hoge.rb
input = gets.chomp
inputs = input.split("")
print inputs #=> ["a", "p", "p", "l", "e"]
```
なお、chompメソッドを使わなければ改行も要素の一部として格納されます。

```hoge.rb
input = gets
inputs = input.split("")
print inputs #=> ["a", "p", "p", "l", "e", "\n"]
```

## 3. コンソールに出力
あとはputsメソッド、printメソッドで出力を行えば完成です。
コードを提出する前に、テストケースを変えて提出前動作確認を行い、想定通りの出力になることを確認しましょう。

## まとめ
getsメソッド：　入力を一行ごとに「文字列」で受け取る。
chompメソッド：　文字列の改行を取り除く。
to_iメソッド：　「文字列」を「数」に変換する。
splitメソッド：　文字列を分割し、配列に格納する。

これらのメソッドを使えばCランク、Bランクまでは解けるようになると思います。
Redmineでチケットのステータスに依ってカスタムフィールドの表示・非表示を切り替える

#  なぜ必要なのか

Redmineの標準機能で、チケットのステータスごとに、カスタムフィールドを値入力の「必須・任意」を設定する機能があります。

ただ、フィールドが常に表示されてしまいます。使う人が入力する必要のない項目は表示しないのがベターです。

# 設定方法

こちらの onozaty さんのブログをベースにしています。ちょっとわかりづらい部分があったので備忘録として記事にしてます。

http://blog.enjoyxstudy.com/entry/2016/07/09/000000

※ pluginのインストール、Redmineの管理者権限が必要です。

## 準備

- view customize plugin を導入

https://github.com/onozaty/redmine-view-customize

## 設定

### カスタムフィールドの設定

- カスタムフィールドを作成（すでにある場合は、それをつかえば良いです）
 - 「必須」のチェックは外します
 - 使いたい「トラッカー」、「プロジェクト」を忘れずにチェック
- 作成できたら一覧画面に戻り、リストに表示されることを確認します

 https://{RedmineのURL}/custom_fields

- 作成されたカスタムフィールドを選択すると、URLが番号になってます。この番号を後で使うので控えておきます

　https://{RedmineのURL}/custom_fields/**{カスタムフィールドの番号}**/edit

### ワークフローの設定

- 入力を必須とするステータスを設定しておきます。(割愛)

### status id の確認

表示したい（または表示したくない）条件のステータスの番号を確認します。

https://{RedmineのURL}/issue_statuses

で該当するステータスを選択するとURLが番号になってます。この番号も後で使うので控えておきます。

https://{RedmineのURL}/issue_statuses/**{ステータスの番号}**/edit

### view customize の設定

- 「管理」→ 「view cusotomizes」と進む

https://{RedmineのURL}/view_customizes

追加します

![スクリーンショット 2018-10-13 18.22.30.png](https://qiita-image-store.s3.amazonaws.com/0/54261/3a356602-3448-ec2a-981e-272453b2b7e5.png)

 - Path pattern は "/issues" （適用するスコープです。チケット画面で使うので。）プロジェクト限定で設定したいのなら、 "/{プロジェクトの識別子}/issues" になります。
 - Type は "JavaScript"
 - Codeは onozaty さんのブログからコピーしてください。
  - issue_status_id〜 で比較する数値は、先程控えた **ステータスの番号** です
  - custom_field_values_XX、cf_XX の番号は先程控えた **カスタムフィールドの番号** です
  - Enabled にして保存したら完成
Lightsailでnodejs+Expressでサーバーを公開するまで

#Lightsailで気軽にサーバー公開
Lightsail＋nodejs＋Expressでサーバー公開。開発環境はCloud9を使用。
ご丁寧に、Amazonがチュートリアルを用意しているのでそれを活用する
https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/lightsail-instances.html

※Cloud9はブラウザで開発出来るとっても便利なIDE。もうVimを弄ったりする必要は無いのです。いい時代になったものですね。

IDEとしてCloud9を使用する場合にはリージョンで日本を選択出来ませんので、シンガポールでインスタンスを作成。
その他はチュートリアル通りに進めればCloud9で開発出来る環境が整うはず。

追記：STEP3で、Cloud9を開く際にこのようなエラーが発生しました。
<img width="447" alt="awserror.png" src="https://qiita-image-store.s3.amazonaws.com/0/302016/44af8866-c4f4-4212-aaee-03acedeb2418.png">

既にPythonは環境にインストールされているように見えるのですがなぜ怒られるのか分かりません。以下を実行する事で解決します。
`sudo apt-get install python`


この後はCloud9でhello worldコードを作成

```hello.js
var http = require('http');
var server = http.createServer();
server.on('request', function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.write('hello world');
    res.end();
});
server.listen(3000, '127.0.0.1');
console.log("server listening ...");
```

Lynx等でターミナルから127.0.0.1:3000でhello worldが表示されるのを確認（心配性なので）その後ソースを```server.listen(3000, '0.0.0.0');```に書き換え
Lightsailの設定でポート3000を開いておく
<img width="648" alt="lightsail.png" src="https://qiita-image-store.s3.amazonaws.com/0/302016/9de7f192-0294-f65d-4997-e4779db614d7.png">

これで、ブラウザでアクセスすればhello worldが表示されるはず。
http://IPアドレス:3000

しかし毎回:3000でアクセスするのはかっこ悪いので、
ターミナルで```sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000```で、ポート80にリダイレクトしておくと:3000を付けなくても良い。


続いてExpressをインストールし、サンプルアプリ（ひな形）をインストール

`sudo npm install express -g` (グローバル環境にexpressをインストール）
`sudo apt install node-express-generator`（generatorをインストール）
`express test-dev`（test-dev以下のディレクトリにサンプルアプリをインストール）
`cd test-dev`（test-devに移動）
`npm install`（依存するモジュールをインストール）
`node app`（アプリケーションを実行）


Lightsailは定額なのでテスト環境を気軽に構築するのに向いていると思います。
Windows 10にMAMP 4.01をインストールする手順

PHP、MySQLの学習環境構築の目的として、Windows 10にMAMP 4.01 をインストールする手順をまとめておきます。

1. [MAMPのサイト](https://www.mamp.info/en/)にアクセスします。
2. MAMP（PROではない方）の「Free Download」をクリックします。
<img width="818" alt="FireShot Capture 11 - MAMP &amp; MAMP PRO - https___www.mamp.info_en_.png" src="https://qiita-image-store.s3.amazonaws.com/0/302008/b6d691bc-80e9-7f1e-ec57-c9645491b297.png">
3. Windows用のダウンロードボタンをクリックします。
<img width="281" alt="FireShot Capture 12 - Downloads - MAMP &amp; MAMP PRO - https___www.mamp.info_en_downloads_.png" src="https://qiita-image-store.s3.amazonaws.com/0/302008/b3d247e3-4cd0-e037-17f6-ed0a5ac6156b.png">
4. 「MAMP_MAMP_PRO_4.0.1.exe」を実行します。
5. インストールウィザードの途中で表示される「MAMP Pro」のチェックボックスを外してインストールします（ほかの設定項目は初期値のまま）。
6. デスクトップに作成された「MAMP」ショートカットを実行して起動します。
<img width="69" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/302008/887975f0-eab6-d6c9-7b57-925de4156d95.png">
7. 「Apache Server」、「MySQL Server」の緑マークが付いたら各サービスが起動していることを表しています。左下の「Preferences」からポート番号の変更や、ApacheからNginxへの切り替えなどが可能です。
<img width="379" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/302008/0fd06a49-644e-b75d-7fcf-f9137a1a640c.png">
8. 「Open Start Page」をクリックすると、Webページが表示されます。
9. この画面から「phpinfo」、「phpMyAdmin」ページにもアクセスできます。
<img width="769" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/302008/56f63ace-2ea2-0315-7d8e-9d0d65e5484a.png">
atcoder 対策(rate 0~ 1200)

#色々な型変更

atcoderのABC(atcoder Beginers Contest)を解くのにあたり、色々な型変換を使う場面が出てきたので、メモ書き程度にまとめる。
###char -> String

```java

char c = 'a';
String s = String.valueOf(c);
System.out.println(s);
```

```test:出力
a
```

###char[] -> String

```java

char[] c = {'a','b','c'};
String s = new String(c);
System.out.println(s);
```


```test:出力
abc
```

###StringBuilder -> String

```java

StringBuilder sb = new StringBuilder();
sb.append("aaa");
String s = sb.toString();
System.out.println(s);
```


```test:出力
abc
```

ArrayList<String> -> String

```java:誤った例

ArrayList<String> list = new ArrayList<String>();
list.add("c");
list.add("b");
list.add("a");
String	s = list.toString();
System.out.println(s);
```


```test:出力
[c, b, a]
```

```java:正解例

ArrayList<String> list = new ArrayList<String>();
		list.add("c");
		list.add("b");
		list.add("a");
		StringBuilder sb = new StringBuilder();
		for(int i = 0;i < 3;i++){
			sb.append(list.get(i));
		}
		String s = sb.toString();
		System.out.println(s);
```


```test:出力
cba
```

# 色々
いくつかの要素の中から、最大最小を求めたい時、配列を使ってsortするのが早い

```java

int[] data = {3,4,1};
Arrays.sort(data);
int max = data[data.length()-1];
int min = data[0];
System.out.println(max);
System.out.println(min);

```


```test:出力
4
1
```
AWS Cloud9 がTypeScriptに対応したと聞いたので試してみた

# 結論
まだ、VS Codeは手放せない。
編集機能は概ね良い感じ。デバッグが課題。

# 準備
まずはコンソールから新規に環境を作ります。  
起動したら、環境を確認 && nodeを更新。

```bash:bash
ec2-user:~/environment $ nvm --version
0.31.7

ec2-user:~/environment $ nvm ls
->      v6.14.4  
         system  
default -> 6 (-> v6.14.4)
node -> stable (-> v6.14.4) (default)
stable -> 6.14 (-> v6.14.4) (default)
iojs -> N/A (default)
lts/* -> lts/argon (-> N/A)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.14.4
lts/carbon -> v8.12.0 (-> N/A)

ec2-user:~/environment $ nvm ls-remote
...
       v10.12.0

ec2-user:~/environment $ nvm install v10.12.0
Now using node v10.12.0 (npm v6.4.1)

ec2-user:~/environment $ nvm alias default v10.12.0
default -> v10.12.0

ec2-user:~/environment $ node -v
v10.12.0
ec2-user:~/environment $ npm -v
6.4.1
```

デモ用プロジェクトを作成します。

```bash:bash
ec2-user:~/environment $ mkdir demoapp
ec2-user:~/environment $ cd demoapp/
ec2-user:~/environment/demoapp $ npm init -y
ec2-user:~/environment/demoapp $ npm install -g typescript
ec2-user:~/environment/demoapp $ npm install --save-dev @types/node
```

```ts:app.ts
class Demo {
    greet(name: string) {
        console.log(`Hello, ${name}!`);
    }
}

new Demo().greet('John Smith');
```

```json:tsconfig.json
{
    "compilerOptions": {
        "moduleResolution": "node",
        "module": "es2015",
        "target": "es2015",
        "lib": ["es6", "es2015", "es2016", "es2017"],
        "sourceMap": true,
        "noEmitOnError": true,
        "noImplicitAny": true,
        "suppressImplicitAnyIndexErrors": true,
        "noImplicitReturns": true,
        "noImplicitThis": true,
        "strictNullChecks": true,
        // "noUnusedParameters": true,
        // "noUnusedLocals": true,
        // "noFallthroughCasesInSwitch": true,
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "baseUrl": ".",
        "paths": {
        },
        "types": ["node"]
    }
}
```

# 使用

以下の画像の状態になります。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/185253/5e63620b-6a41-9b2c-cd03-a35d5aaf4168.png)
ヒントも表示されます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/185253/bcd281c9-7416-b337-8ac8-8be4fa2228bd.png)
![4.png](https://qiita-image-store.s3.amazonaws.com/0/185253/0f906797-6498-f8ee-e136-d7bb6eb281cf.png)
もちろん、型チェックも働きます。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/185253/df72a3e8-4a31-7582-683f-b7947d52037d.png)
型情報の参照もこの通り！
![9.png](https://qiita-image-store.s3.amazonaws.com/0/185253/ac431f90-2873-9750-6f5b-eab013f1e521.png)
![10.png](https://qiita-image-store.s3.amazonaws.com/0/185253/541773c8-1446-871c-dd3d-6bc21c6fab48.png)



ツリービューでファイルを選択し、メニューバーの「Run」をクリックすると、自動的にトランスパイルされて実行されます。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/185253/5c9216b9-bccc-a721-03f8-15730b5c0d4c.png)

デバッグしてみましょう。ブレークポイントを張って… 「Run」!
![7.png](https://qiita-image-store.s3.amazonaws.com/0/185253/4562c92a-ac65-df01-6138-ced215245a78.png)
止まらない⁉

リリース情報を確認してみましょう。
https://docs.aws.amazon.com/cloud9/latest/user-guide/projects.html
![8.png](https://qiita-image-store.s3.amazonaws.com/0/185253/f2d3774e-b240-01aa-48ea-4398236ddcd0.png)
**な、なんだってー！**

まだ、sourcemapデバッグに対応してないの？
Ansible で Java をインストール

Ansible で Java をインストールするサンプル
※ 変数 `java_version` は `--extra-vars` で `java_version=11` の様に指定

```YAML:defaults/main.yml
---
# 一時ディレクトリ
temp_dir: /var/tmp

# Java ディストリビューション
java_distributions:
  '11':
    url: https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.4%2B11/OpenJDK11U-jdk_x64_linux_hotspot_11.0.4_11.tar.gz

# Java インストールディレクトリ
java_install_dir: /usr/lib/jvm

# Java Home
java_home: "{{ java_install_dir }}/jdk-{{ java_version }}"
```

```YAML:tasks/main.yml
---
- import_tasks: setup.yml
```

```YAML:tasks/setup.yml
---
- name: Find installed Java.
  ansible.builtin.find:
    paths: "{{ java_install_dir }}"
    file_type: directory
    patterns: "jdk-{{ java_version }}*"
  register: installed_java

- name: Delete installed Java.
  ansible.builtin.file:
    path: "{{ item.path }}"
    state: absent
  with_items:
    - "{{ installed_java.files }}"

- name: Download Java distribution file.
  ansible.builtin.get_url:
    url: "{{ java_distributions[java_version].url }}"
    dest: "{{ temp_dir }}"
  register: distribution_file

- name: Unarchive Java distribution file.
  ansible.builtin.unarchive:
    src: "{{ distribution_file.dest }}"
    dest: "{{ java_install_dir }}"
    remote_src: yes
    list_files: yes
    owner: root
    group: root
    mode: u=rwX,go=rX
  register: contents

- name: Create symbolic link.
  ansible.builtin.file:
    src: "{{ java_install_dir }}/{{ contents.files[0] | regex_replace('.*/(.+)/$', '\\1') }}"
    dest: "{{ java_home }}"
    state: link

- name: Make alternatives.
  community.general.alternatives:
    name: "{{ item }}"
    link: "/usr/bin/{{ item }}"
    path: "{{ java_home }}/bin/{{ item }}"
  with_items:
    - java
    - javac

- name: Delete Java distribution file.
  ansible.builtin.file:
    path: "{{ distribution_file.dest }}"
    state: absent
```
subprocess.runの出力結果を英語にする方法

Pythonで以下のようにifconfigコマンドを実行し、結果を取得したい。
（subprocess.runはPython3.5で追加）

```Python
import subprocess

command = "ifconfig"

p = subprocess.run(command,
                   stdout=subprocess.PIPE,
                   stderr=subprocess.PIPE,
                   shell=True
                   )
print(p.stdout.decode("utf-8", "ignore"))
```
```terminal:実行結果
eth0      Link encap:イーサネット  ハードウェアアドレス 00:0c:9f:aa:bb:cc
          inetアドレス:192.168.5.22 ブロードキャスト:192.168.5.255  マスク:255.2
55.255.0
          inet6アドレス: fe80::63b7:c654:77c9:b843/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:29114 エラー:0 損失:5944 オーバラン:0 フレーム:0
          TXパケット:6015 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000
          RXバイト:1945895 (1.8 MiB)  TXバイト:856735 (836.6 KiB)

lo        Link encap:ローカルループバック
          inetアドレス:127.0.0.1 マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:65536  メトリック:1
          RXパケット:192 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:192 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1
          RXバイト:32042 (31.2 KiB)  TXバイト:32042 (31.2 KiB)

wlan0     Link encap:イーサネット  ハードウェアアドレス 00:0c:9f:aa:bb:cd
          UP BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)

```

日本語で出力されると非常に処理しづらいので、英語で出力してほしい。
以下のようにenv引数を指定してやると良い。

```Python
import subprocess

command = "ifconfig"
_env = {'LANG':'C'}

p = subprocess.run(command,
                   stdout=subprocess.PIPE,
                   stderr=subprocess.PIPE,
                   env=_env,
                   shell=True
                   )
print(p.stdout.decode("ascii"))
```

```terminal:実行結果
eth0      Link encap:Ethernet  HWaddr 00:0c:9f:aa:bb:cc
          inet addr:192.168.5.22  Bcast:192.168.5.255  Mask:255.255.255.0
          inet6 addr: fe80::63b7:c654:77c9:b843/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:29928 errors:0 dropped:6055 overruns:0 frame:0
          TX packets:6137 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2006983 (1.9 MiB)  TX bytes:874819 (854.3 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:192 errors:0 dropped:0 overruns:0 frame:0
          TX packets:192 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:32042 (31.2 KiB)  TX bytes:32042 (31.2 KiB)

wlan0     Link encap:Ethernet  HWaddr 00:0c:9f:aa:bb:cd
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
```
git alias設定

他にもあるけど以下の設定は多用する。
なお、hubがインストールされている前提。

```~/.gitconfig
[alias]
  see=!hub browse -- pull/$(git symbolic-ref --short HEAD)
  d = !git branch --merged | grep -vE '^\\*|master$|develop$' | xargs -I % git branch -d %
  end = !"f() { git checkout $1; git pull; git d; }; f"
  pro = !git push -u origin $(git symbolic-ref --short HEAD) && git see
```

## git end

一番使うのは`git end develop`とか`git end master`。
どういう挙動になるかというと、`git end master`の場合masterブランチにcheckoutした後、マージされたブランチを消す。これで`git branch`などで余計なブランチが表示されなくなるので便利。

## git pro
`hub pull-request`でエディタでPRできるけど、自分はフロントエンドエンジニアでPRにスクショを貼るとかするのが多いのでGitHub上で編集したい。
`git pro`すると、今いるブランチの内容がpushされた後ブラウザでPRのページが開く。プルリクエストを送るときは基本これを使っている。

---

他に便利なalias設定があれば教えてくだい :pray:
設定保存可能なライブUSB(Ubuntu)を作る

# USBから起動するLinuxで設定保存を簡単にするには
→Ubuntuを選ぶと吉。理由は↓

## UNetbooinを使う
アホみたいに簡単です。スタンドアローン型アプリです。

```
https://unetbootin.github.io/
```

からダウンロードください。mac用の他、Windows用とLinux用もあり。

### マックの場合
dmg形式でダウンロードされます。ダブルクリックするとマウントされて↓のウインドウが開きます。
![スクリーンショット 2018-10-13 23.34.43.png](https://qiita-image-store.s3.amazonaws.com/0/111758/7e8e0d41-a71b-250b-8be0-9ed94796585e.png)

### 起動時画面
![スクリーンショット 2018-10-13 17.00.27.png](https://qiita-image-store.s3.amazonaws.com/0/111758/39b5c432-3b78-af47-5d9e-e28c5fdd1c2a.png)

### ISO自動ダウンロード（メニューから選択するだけ）
![スクリーンショット 2018-10-13 17.00.49.png](https://qiita-image-store.s3.amazonaws.com/0/111758/9807d082-4318-0590-a0ba-5003207419af.png)

### バージョンを選ぶだけ(*_Liveを選びましょう)
![スクリーンショット 2018-10-13 17.01.16.png](https://qiita-image-store.s3.amazonaws.com/0/111758/ce0d5320-6e44-7cd8-13a5-06a7bd4cb216.png)

### 【重要】 設定を保存できる様にするポイント(1)
下から２行目「space used to preseave files ...」 の右側の数字（読み書き可能な領域サイズ）へ、**ゼロ以外の数字** を設定します。

![スクリーンショット 2018-10-13 23.33.59.png](https://qiita-image-store.s3.amazonaws.com/0/111758/19f3b46e-19aa-f1c0-9e8f-0d67f5c0953b.png)

### 【重要】 設定を保存できる様にするポイント(2)
古いタイプのBIOSで起動するマシンでは設定保存機能がうまく動きます。しかし、EFI起動するマシン（例：最近のPCやMacが該当）では、以下の設定ファイルの編集が必要な様です。
- 古いタイプBIOSから起動: そのままでオケ。設定保存を含む「syslinuxブートオプション」にうまく繋がる。
- 最近のタイプEFI: /boot/grub/grub.cfgの "linux"メニューの最後に "persistent"を追加する

具体的には、ライブUSBが出来たら、USBを開いて **boot>grub** ディレクトリにある **grub.cfgファイル** を開いて変数します。ファイルの中ほどにある **「menuentry "Try Ubuntu without installing" 」という箇所** を探してください。

```/boot/grub/grub.cfg
...
menuentry "Try Ubuntu without installing" {
	set gfxpayload=keep
	linux	/casper/vmlinuz.efi  file=/cdrom/preseed/ubuntu.seed boot=casper quiet splash --- persistent
	initrd	/casper/initrd.lz
}
...
```

で、**行末の「---」の後に「persistent」を追記** します。

# その他：　USBメモリの選び方
ロースペックのUSBで全然大丈夫です。
当方は、**Baffalo RUF2-K8G(USB2.0 8GB)と旧世代を利用**。容量を全然使っていないので、４GBもあれば十分かと

# 参考サイト
- https://github.com/unetbootin/unetbootin/issues/148