OmniAICreator/Qiita-1.07M huggingface dataset:
Blenderの簡単な日本語化【Blender】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


# ① `File` < `User Preferences`をクリックする
<img width="800" alt="step1.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/4bae590a-3be2-1aed-45de-e091649b43ca.png">

# ② `System`をクリックし、`International Fonts`にチェックする
<img width="800" alt="step2.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/f44685c9-072c-d72a-1899-d7fa29bcf38e.png">

# ③ `English`を`Japanese(日本語)`に変更し、`Interface`と`Tooltips`と`New Data`を選択する
<img width="800" alt="step3.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/112e1e99-5b76-271e-b485-092da504596f.png">

# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
# 参考文献

https://blender-cg.net/nihonngoka/
Visualforceページを使ったExcelファイル出力時にどうしても越えられないガバナ制限を超えるには

## 概要
Salesforceでアプリを作る場合避けて通れないのがガバナ制限です。マルチテナント(複数組織)でサーバを使っている為に、リソース使用にキャップがかかっているというもの。
様々なアプリケーションを実現するに当たっては、この制限を考慮しなければならないのですが、テスト環境では問題なかったのに本番環境でガバナ制限にぶち当たるという事が往々にしてあります。
きっとそんな時には皆さん「Salesforce ガバナ制限」といった形で検索し

[Salesforceガバナ制限を回避するためにやってきたこと](https://qiita.com/comefigo/items/48f05d8fe4a3959911f4)

などを引き当てるのです。私も当然そうでした。

## 一番最後どうしても超えられなかった壁
- ビューステートサイズの壁
- CPU time limitの壁

テスト環境程度のデータ量であれば問題なく動くのですが、本番環境のデータ量に耐えられない。完成したと思った矢先に現れる壁に愕然とするはずです。どの程度まで処理を削減すれば良いかの見通しもなかなか立たなかったりしますよね。
今回は、これはもうどうしようもないと諦めるのに2週間くらい格闘してしまった…最終的には処理を分割することで決着しました。

## やりたいこと
- Salesforceに入っているデータを使って、任意のリストデータを作成したい。
- データは出来ればExcelで複数シートに分けられた形で出力したい

## 出来たこと
最終的に出力したファイルは44M程度の大きさになっていました。

## 回避策
今回作るファイルはExcelファイルです。リストはカテゴリー別に別れており、カテゴリーごとにシートを分けています。

ExcelにはXMLファイルを読み込むことが出来るという機能があります。最初からExcel形式で出力しなくても開くことが出来るのです。
[XML データのインポート Microsoft](https://support.office.com/ja-jp/article/xml-%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88-6eca3906-d6c9-4f0d-b911-c736da817fa4)
これが非常に便利です。

[VisualforceでCSVファイルとExcelファイルを出力するには](http://blog.flect.co.jp/salesforce/2013/06/visualforcecsve-93b8.html)
こちらの「Open XMLファイル形式に則って記述」という部分です。

``` Open XML形式概要
<Workbook>
<Worksheet>
<Table>
<Row>
<Cell>
<Data></Data>
</Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
```
こんな感じです。
XMLファイルで指定すれば、セルの結合や装飾なんかも可能です。思ったとおりのExcelファイルを作ることが出来るでしょう。

今回は、シートごとにデータが出力されるようにしました。つまり、上記で言うところにWorksheet毎に出力を分けています。
ボタンを押すと、必要なデータを落とせるようなVisualforceページが複数開き、自動的にバラバラになったファイルがダウンロードされます。22個くらいのファイルに分割されました。
最終的にはローカルに落ちてきたファイルを全てコマンドでつなげてしまいます。

```cat *.xml > output.xml
```

こうやって完成したxmlファイルをExcelで開き、xlsx形式で保存すれば完成。

## 結論
リストファイルの出力だったら、処理を分割して、ローカルでファイルを結合するというやり方にすれば、どんなにデータ量が増えてもなんとかなります。(それが適切なファイルサイズで出力されるようにプログラムを作れば良いので)
割り切ったほうが良いですね。

## 注意点
xmlファイルは厳密に作る必要があります。
シンタックスエラーがあると読み込んだ際にエラーが出ます。そして、何が悪いのかを探すのが結構な手間です。

##注意点2
XMLファイルをcatでまとめる際に、ファイル名が重要になります。頭から連番になるように組みましょう。
Visualforceページをダウンロードする場合は

``` visualforceページタグ
<apex:page controller="コントローラ名" showHeader="false" sidebar="false" readOnly="true" contentType="application/xml#{!xmlNumber}.xml">
```
こんな感じでXMLの番号{!xmlNumber}をclass側からを渡してやれば、その番号のついたファイルが落ちてきます。
ファイルは、内容量によってダウンロード順が前後しますので、ファイル名を明示してダウンロードするようにしましょう。

##驚いたこと
44MのXMLファイルですが、エクセル形式で保存したところ5Mに圧縮されました。どうなってるんでしょうね…(すごい！
HTML5での学び

#HTML5を復習した際の学び
HTML５を復習した際に曖昧だった点、忘れていた点をまとめました。

##水平線（horizontal rulers）

`<hr/>`で水平線を引くことができます。
すぐ下にある線が`<hr/>`と記入した場合にでる線になります。
<hr/>


```html


<p>下に水平線引いてます。</p>
<hr/>
<p>上に水平線引いてます。</p>
```
---

##リンク（A link (anchor)）
リンクを作成するときの表現になります。
a というのは「いかり」「支え」を意味するanchorの頭文字になります。

```html

<body>
<p>Show the link</p>
<a href="https://www.google.com">グーグルのサイト</a>
</body>
```

---
##Unordered lists
1,2,3....と表示するordered listsとは異なり、順番を指定しないリストになります。
square= □
circle=○
none=なし
というように、リストのスタイルを変えれば○や□といったものをリストの先頭につけることができます。

```html

<ul style="list-style-type: circle">
    <li>いち</li>
    <li>に</li>
    <li>さん</li>
</ul>

```


---
##クラスの概念
pという同じものを修飾しているように見えます。
しかし、クラスとidを指定してあるので、色は変わって表示されます。
青は青色、赤は赤色、緑は緑で表示されます。
idは文章中で1回、classは何度でも使うことができます。

```html

<style>
p#last {
    color: red;    
}

p.example {
    color: green;
}

p {
    color: blue;
}    
</style>
<p>青</p>
<p class="example">緑</p>
<p id="last" class="example">赤</p>
```
---
Mac にSonarQubeをインストールしてソース解析に挑戦

# SonarQubeインストール手順

- brewで簡単インストール

```bash
$ brew install sonarqube
```

- mavenもbrewでインストール。ということで、Javaが今回の解析対象のソースです

```bash
$ brew install maven
```

- 私の端末では postgreが既にインストールされていたので、アカウントとスキマーを作成
  - アカウント名：sonar
  - パスワード：sonar
  - スキーマ：sonar

- SonarQubeの設定

```bash
#
# sonar.properties 場所
#
$ pwd
/usr/local/Cellar/sonarqube/7.3/libexec/conf

#
# sonar.properties の設定内容
#
$ cat sonar.properties | grep -v "^#" | grep -v "^$"
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:postgresql://localhost:5432/sonar
sonar.web.javaOpts=-Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError
sonar.web.host=127.0.0.1
sonar.web.context=/sonar
sonar.web.port=9000
sonar.path.data=/usr/local/Cellar/sonarqube/7.3/libexec/data
sonar.path.temp=/usr/local/Cellar/sonarqube/7.3/libexec/temp
```

- SonarQube起動

```bash
$ sonar start
```

- ブラウザでSonarQubeにアクセス

```
http://localhost:9000/sonar
```

以前、セットアップがうまく行かず投げ出していたので、今回7.2から7.3にアップグレードしていました。そうすると、ブラウザにDBの内容も古いよ、バージョンアップしなさいというメッセージが表示されました。
これまた、方法が分からず困っていたのですが、ログを見たらヒントがログに出力されていました。
その支持通り /setup にアクセスしたらうまくトップページが表示されました♪

```bash
$ pwd
/usr/local/Cellar/sonarqube/7.3/libexec/logs

$ tail sonar.log
################################################################################
      Database must be upgraded. Please backup database and browse /setup
################################################################################

http://localhost:9000/sonar/setup
```

- ソース解析

```bash
#
#　ソース解析対象のあるEclipseのプロジェクトのディレクトリに移動
#
cd "プロジェクトのディレクトリ"

#
# 準備のためのコマンド実行
#
$ mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install -Dmaven.test.failure.ignore=true

#
# ソース解析コマンド
#
$ mvn sonar:sonar
```

「mvn sonar:sonar」コマンドでエラーが発生。デバッグモードで実行したら、パスが違う為に失敗していることが判明。（/sonar がついていない）

```bash
$ mvn sonar:sonar -X
ERROR: Sonar server 'http://localhost:9000' can not be reached
```

mavenのsetting.xml に以下を追加してコマンド再実行したら BUILD SUCCESS !!!

```xml
<settings>
    <pluginGroups>
        <pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
    </pluginGroups>
    <profiles>
        <profile>
            <id>sonar</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <!-- Optional URL to server. Default value is http://localhost:9000 -->
                <sonar.host.url>
                  http://localhost:9000/sonar
                </sonar.host.url>
            </properties>
        </profile>
     </profiles>
</settings>
```

- ブラウザで解析結果を確認できました。ちなみに、ログインIDとパスは、adminでした。


# References
- https://qiita.com/hideshis/items/7b16c608fd60706be6d2
- https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Maven
機械学習でのカテゴリデータの扱い方

例えば次のような DataFrame があるとする。

```py
import pandas as pd

df = pd.DataFrame(data={'age': [34, 18, 52, 8, 21], 'blood_type': ['A', 'B', 'A', 'AB', 'O']})
```

![01.png](https://qiita-image-store.s3.amazonaws.com/0/6697/315c554a-f9ab-00f3-ccd6-cf0bd6a2138a.png)

機械学習の特徴量として 'A' や 'B' などのカテゴリデータを表す文字列をそのまま与えることはできない。では、これらを整数値に置き換えればいいだろうか。カテゴリデータを整数値に置き換えるには [pandas.factorize](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.factorize.html) を使う。

```py
df['blood_type'] = pd.factorize(df['blood_type'])[0]
```

![02.png](https://qiita-image-store.s3.amazonaws.com/0/6697/a7993e84-5bf7-5e9b-7ec6-9c2594c07ef6.png)

実はこれはよくない。この例では 'A' は 0 に、'B' は 1 に、そして 'O' は 3 に置き換えられている。ここで、例えば「A 型から O 型への距離は A 型から B 型への距離の 3 倍である」というような関係はない。しかし、機械学習アルゴリズムはそのような関係があると誤解してしまう恐れがある。

ではどうしたらよいか。ここで使えるのが **ダミー変数** だ。ダミー変数に変換するとはカテゴリデータを one-hot 表現に変換することだ。そして one-hot 表現とはひとつの要素が 1 でその他が 0 のベクトルで表すことだ。ダミー変数に変換するには [pandas.get_dummies](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html) を使う。

```py
df2 = pd.get_dummies(df['blood_type'], prefix='blood_type')
```

![03.png](https://qiita-image-store.s3.amazonaws.com/0/6697/2e5f81dd-56f6-0628-f61c-f197d8a5b75e.png)

ちなみに情報を失わずに 1 列だけ削減することができる。

```py
df2 = pd.get_dummies(df['blood_type'], prefix='blood_type', drop_first=True)
```

![04.png](https://qiita-image-store.s3.amazonaws.com/0/6697/e8d20703-c45b-5b95-37ab-581fdf9992b7.png)

最終的に blood_type 列をダミー変数に置き換えた DataFrame は次の通り。

```py
df3 = df.drop('blood_type', axis=1)
df4 = pd.merge(df3, df2, right_index=True, left_index=True)
df4
```

![05.png](https://qiita-image-store.s3.amazonaws.com/0/6697/ae3e0802-8538-3560-a73c-b53896de4c27.png)
Nuxt×TypeScriptでmiddlewareを使う

# はじめに

この投稿は[こちら](https://stackoverflow.com/questions/49090240/nuxt-vue-js-in-typescript-object-literal-may-only-specify-known-properties-b)のページと同じことを記載しているだけです

# ゴール

- Nuxt.jsに
- Typescriptを導入して
- middlewareを使う

# 問題

[こちら](https://stackoverflow.com/questions/49090240/nuxt-vue-js-in-typescript-object-literal-may-only-specify-known-properties-b)に記載されている通り、middlewareはVue標準でなくNuxt独自のプロパティである為、そのままjs→tsに変換してもうまく行かない

## js:読み込める

```vuejs:index.vue
<script>
export default {
  middleware: 'auth'
}
</script>
```

## ts:読み込めない

```vuejs:index.vue
<script lang="ts">
import { Vue, Component } from 'nuxt-property-decorator'

@Component({
  middleware: 'auth'
})
export default class extends Vue {}
</script>
```

`Object literal may only specify known properties, and 'middleware' does not exist in type 'ComponentOptions<Vue......` というエラーが発生してしまう

# 解決策

ComponentOptionsを拡張してmiddlewareを追加する

```typescript:index.d.ts
import Vue, { ComponentOptions } from "vue";

declare module "vue/types/options" {
  interface ComponentOptions<V extends Vue> {
    // This adds the `middleware` property to the existing `vue/types/options/ComponentOptions` type
    middleware?: string | string[];
  }
}
```

これで読み込めなかったtsでも読み込めるようになる
MicrobitでGarageBandを操作する【一度動かしてから、コードを修正して再び接続する編】

m(. .)m 動かしながら、この記事を更新しています m(. .)m

(コードを修正して、再度Microbitにダウンロードするところから)
iPhoneのBluetooth設定でもともと接続していたMicrobitを解除する
Microbitのアプリで再度ペアリングする
iPhoneのBluetooth設定で、Microbitを接続する
GarageBandの[設定]-[詳細]-[BluetoothMIDIデバイス]を選択して、Microbitを選択して、[接続済み]にする
サマータイム黙示録

# はじめに
すでに報道されていて話題になっていますが、仮にオリンピックに向けたサマータイム導入が決定された場合、主にプログラム方面で考慮する箇所を列挙してみました。

1. ログファイルの記録時刻をUTC基準にしないと、サマータイム終了時に同一時刻が二回出現する為、ログファイルやログ情報の書き潰しが発生するかもしれません。
2. 現状、時刻情報しか保持していないシステムのデータベースや電文の項目は、JSTなのかJDTなのかUTCなのかわからなくなってしまうため、タイムゾーン情報を追加する必要があるでしょう。
3. プログラム内にて「次の日」を期待して、現在秒に「+=24*60*60*1000」や「+=86400」などと処理しているような個所は、仕様として「24時間後」のままでよいのか「翌日の同時刻」でないといけないのかをはっきりさせる必要があります。
4. 現状、日本(JST)と韓国(KST)は同一のUTC+9の為「日本と韓国に時差はない」という暗黙の前提に依存してしまっている処理の有無の洗い出しが必要になるでしょう。
5. プログラム言語、ライブラリ、ミドルウェア等の時刻関連機能のタイムゾーンのサポート状況を詳しくチェックする必要があります。サマータイムに対応していても1時間シフト固定の実装になっているものはそれほど珍しくありません。

勿論このほかにもサマータイム開始直後に時刻が飛ばされる事による、タスク/ジョブの未実行問題やそれに伴う前後依存関係の前提条件の破綻といった運用上の問題もてんこ盛りです。

それでは今日はこのへんで。
Azure IoT ハンズオン at Azure Antenna

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「IoTこれからの方向け！Azure IoTサービス群の解説からIoT Centralまで体験する午後 」で使われた資料のご案内です。</p>

- <strong>Azure IoT ハンズオン at Azure Antenna</strong><br />
https://www.slideshare.net/ssuser2602c6/20180817-azure-antennaiot-central-handson
- <strong>IoTこれからの方向け！Azure IoTサービス群の解説からIoT Centralまで体験する午後 </strong><br />
https://www.slideshare.net/ssuser2602c6/20180817-azure-antennaiot

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
任意の文字列や行をハイライトするツールをGo言語で作成してみた

前回書いた[「任意の文字列を含む行を色付けして出力するシェルコマンド」](https://qiita.com/x-color/items/2841d4b84162f5d1fe9a)を簡単に扱えるように、Go言語の練習も兼ねて、任意の文字列やそれを含む行をハイライトするコマンドラインツールをGo言語で作成してみた。

![demo](https://qiita-image-store.s3.amazonaws.com/0/279498/95ced7a3-fa73-2a11-b51c-3d321c677bad.gif)

作成したコマンドは https://github.com/x-color/hlt にMITライセンスで置いてくので、ご自由にお使いください。インストール方法などは、リンク先に書いてあります。

# 実装されている機能

今の所、実装されている機能は

- 任意の文字列のハイライト
- 任意の文字列を含む行のハイライト
- ハイライトする色の指定
- ハイライトする場所(文字、背景)の指定
- ハイライト時の書体の指定(太字、斜体など)
- 任意の文字列を含む行と前後の行のハイライト

# 使い方

ここに書いているのは簡単な使い方なので、詳しい使い方が知りたい場合は 　https://github.com/x-color/hlt のREADMEに書いてあるので、そちらを参照してください。

## 任意の文字列のハイライト

`file.txt`内から`text`という文字列をハイライトして出力する

```bash
# 直接'file.txt'を指定する
$ hlt word text file.txt

# 標準入力から'file.txt'を入力する
$ cat file.txt | hlt word text
```

ハイライトする色の変更

```bash
# 文字をハイライトする色を変更する。この例は赤色を指定
$ cat file.txt | hlt word -c red text

# 文字の背景をハイライトする色を変更する。この例は赤色を指定
$ cat file.txt | hlt word -b red text
```

## 任意の文字列を含む行のハイライト

`file.txt`内から`text`という文字列を含む行をハイライトして出力する

```bash
# 直接'file.txt'を指定する
$ hlt line text file.txt

# 標準入力から'file.txt'を入力する
$ cat file.txt | hlt line text
```

ハイライトする色の変更

```bash
# 文字をハイライトする色を変更する。この例は青色を指定
$ cat file.txt | hlt line -c blue text

# 文字の背景をハイライトする色を変更する。この例は青色を指定
$ cat file.txt | hlt line -b blue text
```

## ハイライト時の書体の指定

![demo02](https://qiita-image-store.s3.amazonaws.com/0/279498/79ec0820-c399-8261-24b6-79337e12d4f0.gif)

```bash
# 太字にする
$ cat file.txt | hlt word -B text
# 斜体にする
$ cat file.txt | hlt word -I text
# 取り消し線を引く
$ cat file.txt | hlt word -S text
# 下線を引く
$ cat file.txt | hlt word -U text
```

## 指定された行のハイライト

![demo03](https://qiita-image-store.s3.amazonaws.com/0/279498/61a1e180-c48c-971b-31a0-9010d4a0d187.gif)

`file2.txt`内の3〜6行目をハイライトして出力する

```bash
# 直接'file.txt'を指定する
$ hlt linen 3~6 file.txt

# 標準入力から'file.txt'を入力する
$ cat file.txt | hlt linen 3~6
```

`file2.txt`内の3,6行目と10行目以降をハイライトして出力する

```bash
# 複数条件はカンマで区切って記述
$ cat file.txt | hlt linen 3,6,10~
```

`file2.txt`内の偶奇数行目をハイライトして出力する

```bash
# 偶数行目を指定 (even)
$ cat file.txt | hlt linen even
# 奇数行目を指定 (odd)
$ cat file.txt | hlt linen odd
```


# おわりに

今後も少しづつ機能を追加していく予定。今の所、以下の機能を考えている。

- ~~色の指定を数字以外に`red`,`blue`などの文字列で指定する機能~~ **実装完了**
- ~~書体の変更機能~~ **実装完了**
- ~~指定文字列を含む行の前後をまとめてハイライトする機能~~ **実装完了**
- ~~指定行をハイライトする機能~~ **実装完了**
- 同時に複数箇所を様々な色でハイライトする機能
setup selenium server in windows

# 趣旨
selenium serverの構築ドキュメント
selenium serverを立てることで、windowsで使えるブラウザの自動化テストをリモートから
可能にする

# 用意するもの
 - windows (10 , server 2016 等)

# 設定

## 1. JDK
### install
Java SE Development Kit 8 をdownloadして、インストールする

download
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

### 環境変数
環境変数に以下を設定する
Mac環境次第ですが、例えば .bashrc

<TABLE BORDER=1>
<TR><TH>変数</TH><TH>意味 </TH></TR>
<TR><TD>JAVA_HOME  </TD><TD>Javaのinstall path <BR> (ex. export JAVA_HOME=`/usr/libexec/java_home` )</TD></TR>
<TR><TD>Path </TD><TD>実行フォルダのパス <BR>(ex. export PATH=\${JAVA_HOME}/bin:$PATH ) </TD></TR>
</TABLE>

### 実行確認
コマンドプロンプトを起動し、パスを確認する

```
java -version
```

## 2. selenium & driver
### download
seleniumのsiteから必要なjar,driverをdownloadする

<TABLE BORDER=1>
<TR><TH>package</TH><TH>利用したversion</TH><TH>意味 </TH></TR>
<TR><TD>Selenium Standalone Server</TD><TD>3.14.0</TD><TD>selenium serverアプリ</TD></TR>
<TR><TD>Mozilla GeckoDriver</TD><TD>0.21.0 </TD><TD>Firefox起動用ドライバ</TD></TR>
<TR><TD>Google Chrome Driver </TD><TD>2.41 </TD><TD>Chrome起動用ドライバ</TD></TR>
<TR><TD>Microsoft Edge Driver</TD><TD>Release 17134 </TD><TD>Edge起動用ドライバ <BR>Edgeのversionを確認しそれと同じversionのdriverを用意</TD></TR>
<TR><TD>IEDriverServer </TD><TD>3.9.0 </TD><TD>IE起動用ドライバ<BR>
なお、現在selenium siteからのリンクがなくなっている。
<A HREF="https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver">github</A>　から入手
</TD></TR>
</TABLE>

これらを同一フォルダーに配置する
例

```
ls /cygdrive/c/selenium

IEDriverServer.exe      chromedriver.exe  node.json
MicrosoftWebDriver.exe  geckodriver.exe   selenium-server-standalone-3.14.0.jar
```

### setup browser IDE

#### chrome
https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd
ここにchromeでアクセスし、selenium IDEをインストール、有効化する

#### FireFox
https://addons.mozilla.org/ja/firefox/addon/selenium-ide/
ここにFirefoxでアクセスし、selenium IDEをインストール、有効化する

#### Edge
とくにブラウザの設定は不要みたいだ

#### IE
1.オプションのセキュリティで4つのモードにおいて、"保護モードを有効"をチェック入れる
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/6cfd3d79-26a0-853a-3fe2-988967f5e069.png" width=40%>
2.オプションの詳細設定で"拡張保護モード"のチェックを外す
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/8a0f1236-fa4d-bdc8-788a-c9da776f8161.png" width=50%>
regedit(レジストリ編集)で写真の通りに設定する

\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BFCACHE
iexplore.exe 値 "0"

※FEATURE_BFCACHEのキー（フォルダ）とiexplore.exeのDWORDはデフォルト存在しないので作成する
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/5c634e9b-e2ae-b7c6-6e2a-d2918efbe998.png" width=80%>


## 3. selenium run
seleniumのあるフォルダでコマンドラインを起動し、下記コマンドを実行する

```
Java -Dwebdriver.ie.driver=IEDriverServer.exe      -Dwebdriver.edge.driver=MicrosoftWebDriver.exe      -Dwebdriver.chrome.driver=chromedriver.exe      -Dwebdriver.firefox.driver=geckodriver.exe      -jar selenium-server-standalone-3.14.0.jar -port 4444
```
この例はport 4444で起動
最初に覚えたいLinuxコマンド＋ショートカット 【プログラミング超初心者向け】

自分がプログラミングを勉強し始めて、「よく使うなぁ」と感じたLinuxコマンドやショートカットキーのまとめです。
基本は自分のための忘備録です。

## コマンド
「黒い画面」を使い始めたら、最低限で知っておかないと困るであろう"極めて"基本的なコマンド。
コマンドもめちゃくちゃ奥が深いので、意味や、オプションなどはここに記載するものの他にも山ほどあります。
気になったら調べてください。

### pwd


現在作業しているディレクトリの表示 `` present working directory``の略。
<br>



### cd

ディレクトリ（フォルダ）の移動。``change directory``の略。
<br>

### ls

現在いるディレクトリのファイルやフォルダの一覧を表示 ``list segments``の略。
<br>

### mkdir

 新規ディレクトリ（フォルダ）を作成する。``make directory``の略。

* 例 appという名前のディレクトリを作成する場合。

```
$ mkdir app
```
<br>


### touch

新規でファイルを作成する

* 例 sample.txtという名前のディレクトリを作成する場合。

```
$ touch sample.txt
```

このtouchコマンドは、本来は指定したファイルのタイムスタンプ最終アクセス時刻と最終変更時刻を変えるコマンドだが、指定したファイルが存在していない場合、空のファイルを作成してくれる。



### open

指定したファイルを開く

* 例 sample.htmlという名前のファイルを開く。

```
$ open sample.html
```

上記の例の場合は、指定したファイルはデフォルトで設定されているアプリケーションで開かれる。
アプリケーションを指定して開きたい場合はオプションで「- a」を追加する。

* 例) sample.htmlをATOMを指定して開く

```
$ open -a atom sample.html
```

### rm

ファイルやフォルダを削除する。removeの略

* ファイルを削除

```
$rm ファイル名
```
* ディレクトリ（フォルダ）を削除

```
$ rm -r ディレクトリ（フォルダ）名
=>フォルダの中身もすべて削除
```
```
$ rm -d ディレクトリ（フォルダ）名
=>空のディレクトリを削除(空でない時はnot emptyを含むメッセージが出る)
```

### mv
ディレクトリ（フォルダ）やファイルの移動、ディレクトリ（フォルダ）名、ファイル名の変更

* ディレクトリ（フォルダ）やファイルの移動

```
mv ファイル名　移動先のディレクトリ名/.
```

例) test.htmlをsubディレクトリに移動。

```
mv test.html sub/.
```
※「/.」はディレクトリの直下に移動するためのオプション。「/.」はなくても移動できるが、もし指定した名前のディレクトリがなかった場合、ファイル名が上書きされてしまうので付けておいたほうが安心！

* ディレクトリ名/ファイル名の変更

```
mv 変更前のファイル名（ディレクトリ名）　変更後のファイル名（ディレクトリ名）
```
※変更後のディレクトリ名と同じ名前のディレクトリがすでに存在していると、ディレクトリの移動になる。

### cat
ファイルの中身を見る

```
cat ファイル名
```

## ショートカットキー1
### ↑↓キー

> 入力したコマンドの履歴を表示

### tabキー
ファイル名の補完
> 例) sample_filse_number_001.textのような長い名前のファイルがあった時

コマンド``cat``に続いてファイル名を入力する場合...

```
$cat sa
```
上記の様に、途中まで入力した後に、``tab``を押すとファイル名の入力を保管してくれる。

<br>
また、ファイル名に共通する部分がある場合は、共通する部分まで保管してくれる

> 例) 同一のディレクトリ内にsample_filse_number_001.txtとsample_filse_001.txtがある場合


 ```
 cat sa
 ```
 上記の様に、途中まで入力してtabを押すと
``「sample_filse_」``まで保管してくれる。

## ショートカットキー2
カーソルの移動や、コマンドの削除など。
知らないとdelキーや←→キーを連打することになり悲しい。
### ctl + A
行の先頭に移動

### ctl + E
行末に移動

### ctl + U
カーソルの位置から行頭まで削除

### ctl＋K
カーソルの位置から行末まで削除

### clt+ L
画面をクリアする（一見すべて消えたように見えるが、スクロールしてさかのぼることができる）
コマンドのclearと一緒。
PHPの配列を出力するときに echo は使えない

- var_dump()
- print_r()

のいずれかを使う。

なお、出力結果は次のようになる。

### var_dump()

![Screen Shot 2018-08-20 at 14.49.00.png](https://qiita-image-store.s3.amazonaws.com/0/109241/2483a57b-eb39-c6d5-fb0d-7cb5a8df321a.png)

### print_r()

![Screen Shot 2018-08-20 at 14.49.23.png](https://qiita-image-store.s3.amazonaws.com/0/109241/55735ddc-682a-94a6-3e6d-4a225bacc741.png)

型もついでに見たいなら `var_dump()` を使うとよさげ。
Docker for Windowsでコンテナ内でDocker（DooD）を使う

# 概要

Docker for WindowsでDocker outside of Dockerができないと勝手に思っていましたが、
以下の方法で普通に使えることがわかったので、ご紹介します

# 方法

一般的に有名な方法として以下の二つがあります
ずっとWindows環境では使えないと思っていましたが、どちらでも使えます

- docker in docker
- コンテナにホストのdocker.sockをマウントする(Docker outside of Docker)今回は


## 参考：
- 「[Docker in Docker のベタープラクティス](https://qiita.com/sugiyasu-qr/items/85a1bedb6458d4573407)」
- 「[さわって理解する Docker 入門](https://www.ogis-ri.co.jp/otc/hiroba/technical/docker/part6.html)」

# docker.sockのマウント

`/var/run/docker.sock`をコンテナにマウントするが、Windows環境ではどうやら自動的にDocker Machineのパスとして判定してくれるようです
ホストのdocker.sockを共有しているので、コンテナ内で実行している各種操作はホストにも影響します
なので、ビルド専用ホストならそこまで問題ないと思いますが、外部公開しているようなホストでは**取り扱い注意！！**

サンプルとして以下のようにDockerをインスコするDockerfileを使用します
ホストのdocker.sockを使用するため、docker deamonは起動しない（クライアントのみ使用）


```text:Dockerfile
FROM ubuntu:latest

RUN apt-get update \
    && apt-get -y upgrade \
    && apt-get -y install docker.io
```

```shell

# build dockerfile
> docker build -t mydind ./

# run docker container
> docker run -v /var/run/docker.sock:/var/run/docker.sock -it mydind /bin/bash
```

コンテナ内でdockerコマンドを実行してみるとホストマシンのリソースを確認することができますし、操作もできます

```shell
root@xxxx> docker image ls
root@xxxx> docker container ls
```

## docker-composeで使う時

docker-composeでは`/var/run/docker.sock`のパス解決ができないため、以下の環境変数を追加する必要があります

https://github.com/docker/for-win/issues/1829

```powershell:powershell
# 一時利用
> $Env:COMPOSE_CONVERT_WINDOWS_PATHS=1
```

# docker in docker

https://hub.docker.com/_/docker/

コンテナ起動時に`--privileged`が必要になります
特権モードで実行するため、取り扱いご注意

```shell
> docker run --privileged -d docker:dind
```

前述のdocker.sockのようにホストが管理しているDockerリソースは見えませんし、操作することもできません

```shell

> docker info
> docker images
```
選択範囲のセルに8文字のランダム文字列を出力するExcelマクロ



```vb

' ランダムな文字列生成
Public Function MakePassword(Optional intLength As Integer = 8, Optional boolIncUpper As Boolean = False, Optional boolIncSign As Boolean = False)

    Dim strPass As String
    Dim strLower As String
    Dim strUpper As String
    Dim strNumber As String
    Dim strSign As String
    Dim strChars As String
    Dim intMax As Integer
    Dim i As Integer
    
    strLower = "qwertyuiopasdfghjklzxcvbnm"
    strUpper = "QWERTYUIOPASDFGHJKLZXCVBNM"
    strNumber = "123456789"
    strSign = "-^@[;:],./!""#$%&'()=~|`{+*}<>?_"

    strChars = strLower & strNumber & strUpper

    If boolIncUpper = True Then
    
        strChars = strChars & strUpper
    
    End If
    
    If boolIncSign = True Then
    
        strChars = strChars & strSign
        
    End If

    intMax = Len(strChars)
    
    For i = 1 To intLength
    
        strPass = Mid(strChars, Int((intMax - 1 + 1) * Rnd + 1), 1) & strPass
    
    Next i

    MakePassword = strPass

End Function

Sub makePassworMain()
    
    Dim selectionCell As Range

    For Each selectionCell In Selection
        selectionCell = MakePassword
    Next

End Sub

```
クォリスブラウザーレコーダーを使う(Selenium互換)

クォリスブラウザーレコーダー(Qualys Browser Recorder)をご存知でしょうか。
Selenium互換のスクリプトを作成できるGoogle Chrome のアドインです。
ブラウザーレコーダー　っていう響きはあまりきれいではないのが気になりますが、とりあえずおいておきましょう。

もともとはFire Foxで提供されていたアドイン、Selenium　IDEを使うことで実現できていましたが、FireFoxのアーキテクチャが変わり今まで通り提供ができなくなりました。
その代替という位置づけです。

下記からダウンロードできます。
https://chrome.google.com/webstore/detail/qualys-browser-recorder/abnnemjpaacaimkkepphpkaiomnafldi
現在私の Windows Chorme , 68.0.3440.75（Official Build） （64 ビット）でちゃんと動作しています。

ところでQualysは個人向け・小規模事業者では使いにくい（ほとんど購入不可能）だったのですが、先日コミュニティエディションなるものがでました。
小規模事業者では使えるのではないでしょうか。無料です。
https://www.qualys.com/community-edition/
Safariから動画を圧縮させずにアップロードする

[環境]
iOS11.4.1
MobileSafari

htmlで `input type="file"` とすればSafariからカメラロール内の動画を選択することができるのですが、普通にやると動画を選択した時点で強制的に動画の圧縮が開始されてしまいます。この圧縮は動画がエンコードされるということではなく、画質（解像度）が落とされます（例えば1080p->720p）。

圧縮をさせずに選択をする方法は簡単で `multiple` 属性をつけるだけです。 `multiple` をつけると複数のファイルを選択できるようになるので、1つだけを選択させたい場合には、複数選択された場合になんらかの選択処理を自分で書くことになります（再度選ばせる、選んだものの中から1つだけ選ばせるetc）。UI的にはあまりよろしくないので、圧縮するかどうかを選択できるようになればよいような気がしますが、、
【React Native】Android emulatorで 'localhost' を参照しない

## 何が起きたか
Android emulator起動時に、debugモードを起動すると、
`http://10.0.2.2:8081/`に接続されてしまい、正常に動作しない。

想定値は`http://localhost:8081/`だが、手動でアクセスしてもうまく動かない

## 解決法
Cmd + M => Debug mode
'Debug server host & port for device'にて`localhost:8081`を設定する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103475/a42dd326-49b6-bc15-374a-53b18fc7e04d.png)
https://github.com/facebook/react-native/issues/17910#issuecomment-389789831
【Vagrant+VirtualBox】ubuntu1604-desktopは404 Not Foundになるので、ubuntu/xenial64かubuntu1804を使いましょう

# はじめに
ubuntu16.04を使っている開発プロジェクトの環境を、新PCで作成したら失敗したのでメモ。

## 発生した問題
- 新PCセットアップ中に、初めて`vagrant up`するとリモートファイルのダウンロードに失敗する
  - 旧PCでは、ubuntu1604で環境が作れていたのになぜ？

## 環境
| 区分        | 値                 | 備考                      |
| ----------- | ------------------ | ------------------------- |
| vagrant     | 2.1.2              |                           |
| virtualbox  | 5.2.18             |                           |
| boxイメージ | ubuntu1604-desktop | ubuntu/bionic64に変更した |

## 発生したエラー
```bash
>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'box-cutter/ubuntu1604-desktop' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'box-cutter/ubuntu1604-desktop'
    default: URL: https://vagrantcloud.com/box-cutter/ubuntu1604-desktop
==> default: Adding box 'box-cutter/ubuntu1604-desktop' (v2.0.26) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/box-cutter/boxes/ubuntu1604-desktop/versions/2.0.26/providers/virtualbox.box
    default: Download redirected to host: cdn.boxcutter.io
    default:
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

The requested URL returned error: 404 Not Found
```

確かに、http://cdn.boxcutter.io/ubuntu/virtualbox5.1.10/ubuntu1604-desktop-2.0.26.box　にアクセスするとエラーになる。

## 根本的な原因
2018年1月頃から、バイナリの提供をやめているとのこと。
https://github.com/boxcutter/ubuntu/issues/142

## 代替案1
16.04系を使うなら、`ubuntu/xenial64`にする。

https://app.vagrantup.com/ubuntu/boxes/xenial64

## 代替案2
16.04ではなく、18.04にする。
https://vagrantcloud.com/search にて、「18.04」で検索すると、18.04のイメージが結構出てくる。

今回は、[ubuntu/bionic64 ](https://app.vagrantup.com/ubuntu/boxes/bionic64)を採用する。

```
  # config.vm.box = "box-cutter/ubuntu1604-desktop"
  config.vm.box = "ubuntu/bionic64"
```


# おわりに
無事に仮想環境を作ることができました。この機会に、プロジェクトのOSも16.04から、18.04に上げたいと思います。
FizzBuzzを書いたはなし

# 前書き
これはある学生の日々の学習の成果を記した備忘録であります
実行環境

- `macOS 10.12.6`
- `Python 3.7.0`

# やったこと
FizzBuzzをPythonで書いた

```py
for i in range(1, 101):
    if(i%3 == 0 and i%5 == 0):
        print("FizzBuzz")
    elif(i%3 == 0):
        print("Fizz")
    elif(i%5 == 0):
        print("Buzz")
    else:
        print(i)
 ```

# 結果

```
% python3 FB.py                                                                                                                                                                                             [12:43:16]
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```
# せっかくなのでコードを短くします
しばらく考えたのですが、調べた実装ほど自力で短くするのは難しいですね。そこで調べたコードを解説したいと思います。
参照元　[FizzBuzzを1byteで実装する](https://qiita.com/ymg_aq/items/b8e5d26035180bc8797e#python3-59-bytes)

```py
for i in range(100):print(i%3//2*"Fizz"+i%5//4*"Buzz"or-~i)

```

まず`//`演算子はあまりを切り捨てる割り算です。`-~i`はCの`++i`のような動作をします。
print関数内の`or`は`Fizz`と`Buzz`のどちらも0倍されている時`-~i`を出力するという動作をするようです。
つまり以下のようにまとめられます。

- `Fizz`を『「iを3で割ったあまり」を「2で割った商」』だけ出力し
- `Buzz`を『「iを5で割ったあまり」を「4で割った商」』だけ出力し
- `Fizz`も`Buzz`も出力していなければi+1を出力する
グランドデザインの勉強会をしたら、グランドな話になった-その１-

# 序章

東京の人口が半分になるお盆休み、我々は暇だった。
仕事が暇だったら何をするか、そう、勉強会をやればいいじゃない。

私はチームメンバーに問うた。
「君達、今、最も勉強したいことは何かね？」

皆、ちょいちょいと意見を出してきた。しかし、その内容は、某A社の基本設計を読み込んでるのでその質問を…とか、工場LAN の設計をどうやったのかとか、そんな意見に留まった。私には、彼らが自分のために勉強したいことというよりは、仕事のために対処的に勉強する必要があることのように感じた。

彼らには、自らの人生における主体的な勉強衝動が欠けているのではないか…？

私は提案した。
「ICTインフラにおけるグランドデザインの勉強会をしよう。しかし、この勉強会を通して学習するのはネットワークやセキュリティといった話ではない。君達自身の人生におけるグランドデザインの話だ。」


# 第1章「デザインを定義する」

勉強会が始まった。
しかし、突発的な話なのでドキュメントも何も無い。
あるのは熱い想いと真っ白なホワイトボードだけである。

まずは、チームメンバーに対処療法的な考え方が癖になっていることを認識してもらうべく、「トラブルシュート」と「デザイン」の違いを説明することにした。


##トラブルシュートは問題に対してのアプローチ

下記図は、ある問題に対処する場合の考え方である。

![トラブルシュート](https://qiita-image-store.s3.amazonaws.com/0/203705/d10e2063-7fb7-b607-3762-7eeaee3c9f99.png)


この考え方をトラブルシュートとする。
先に「問題」があり「対処」し「解決」に導く。
対処の中に色々とやらないといけないことはあるが、考え方としてはトラブルシュートである。


##デザインは目的に対してのアプローチ

次に、デザインについて考える。

![デザイン](https://qiita-image-store.s3.amazonaws.com/0/203705/e0f49564-5325-ce84-6609-5d312ac6e4f8.png)


この図のように、デザインは目的に対するアプローチである。
そして、デザインの達成は目的をこそ成果としなければならない。
トラブルシュートとデザインの決定的な違いは、アプローチを行う対象である。

では、例えば
「無線LANを安定化する」
というのは目的とはならないのだろうか？

##目的は上部構造(スープラ)に属する

ここで、藤井聡氏のインフラ・イノベーションから「スープラ」という言葉を借りる。

[H28.10 連載インフラ・イノベーション第1回（総論）.pdf](http://trans.kuciv.kyoto-u.ac.jp/tba/wp-content/uploads/2016/12/H28.10%20%E9%80%A3%E8%BC%89%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%83%BB%E3%82%A4%E3%83%8E%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E7%AC%AC1%E5%9B%9E%EF%BC%88%E7%B7%8F%E8%AB%96%EF%BC%89.pdf) 

「スープラ」とは、「暮らしや社会・経済」のような上部構造を指すが、ここではまるっと「人の働き方・意識」とか「企業の戦略・意思」みたいなものと解釈する。全然まるっとしてないけど。

![目的はスープラに属する](https://qiita-image-store.s3.amazonaws.com/0/203705/61a0a63b-f6dd-2b5e-bb68-0c54880b3bad.png)

このように、目的とはスープラに属するものと定義する。

この定義で最も重要なのは、インフラにおける目標を達成することで、スープラが成果となるということだ。**つまりは目標が達成されることにより、我々の働き方や意識が変わるということ、これがデザインの本質である。**

今回は例として「無線LANを安定化したい」という依頼を前提としているが、トラブルシュートとして「無線LANの安定化」に対処した場合、それはインフラの為のインフラ整備になる。デザインに必要なのは、スープラの為のインフラ整備だ。

## トラブルシュートとデザインの比較

この2つの考え方の違いについて比較することで、利用シーンをまとめる。
これは、社内メンバーにも埋めてもらったもので、一概にこうとは言えないものの面白い観点で分析出来ていると思う。

| 項目      | トラブルシュート | デザイン    |
| :-- | :-- | :-- |
| 成果      | 課題       | 目的      |
| アプローチ   | 対処的      | 根本的     |
| 期間      | 短期的      | 長期的     |
| 対象      | 個別的      | 全体的     |
| 思考法     | 帰納的      | 演繹的・帰納的 |
| 技術オプション | 狭い       | 広い      |

## まとめ

トラブルシュートとデザインの考えをまとめることで、普段の業務が如何にトラブルシュート的であったかをチームメンバーに自覚してもらうことが出来た。この考え方の認識は、グランドデザインの話をするのに最も重要な話だ。エンジニアニとっては、グランドデザインが今までの業務の延長線上にある話ではないことをしっかりと自覚することが、グランドデザインを始める第一歩だ。

では、グランドデザインを始めよう。

～ 第2章に続く ～


```
・エンジニアは無意識的にトラブルシュートの対処療法的な考え方に陥っている可能性がある。
・グランドデザインには目的に応じたデザイン側の思考が求められる。
・トラブルシュートは問題に対してアプローチを行い、デザインは目的に対してアプローチを行う。
・目的とはスープラに属するものである。
```
Docker時代の開発環境整備 〜MySQL直接入れない方がよくね？〜

最近iMacを買い増したもので環境構築をちまちましてるんですが、
ふと気づいたのが、MySQLなどのミドルウェアって直接Macに入れるより、Dockerマシンを起動した方がなんか楽そうだなーと。
`docker ps` で見れるし、なんかおかしくなったらstop&rmして立ち上げ直せばいいし。

もちろんDocker-composeなどを使ってきちんとDocker使うように整備しきったプロダクトなら間違いなくそうなんですが、
rbenvで十分だったプロジェクトで、開発が終わってて今さら抜本的な回収をする必要なんてない、なんてのも少なくない。
（まぁImagemagickとかで面倒だと結局Docker化するかもしれないが…）

そういう時、Dockerでmysqlとかpostgresを立ち上げといた方がローカルに直接立ち上げるより楽じゃね。とふと思ったのでした。

https://qiita.com/astrsk_hori/items/e3d6c237d68be1a6f548 この記事にある方法でいけるんじゃないかな。

常に起動させたいなら以下かな。

```
docker pull mysql
docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 --restart=always mysql
```
初めてのRSpecで調べたこと

RailsのRSpecを初めて試した時に調べたことをメモしておきます。
少しでも役に立てればと。



## 実行方法

### ディレクトリ指定
```
rspec spec/models/
```

### ファイル指定
```
rspec spec/models/user_spec.rb
```

### 行指定
```
rspec spec/models/user_spec.rb:12
```

### 全実行
※DBのデータが削除されるので、注意。

```
rake spec
```


## RSpec書き方

[rspecの悪い書き方、良い書き方](https://qiita.com/isuke/items/c98f76892d4fec2ac8bf)

## マッチャ

### eq
期待値と実際の値が「等しい」かどうかを検証する場合は eq を使う。

```rb
expect(1 + 3).to eq 3
```

```rb
expect(1 + 2).not_to eq 1
# または
expect(1 + 2).to_not eq 1
```

### be
等号・不等号と組み合わせて、値の大小を検証するときによく使われる。

```rb
expect(1 + 2).to be >= 3
```

## テストコードのDRY

[テストコードの期待値はDRYを捨ててベタ書きする ～テストコードの重要な役割とは？～](https://qiita.com/jnchito/items/eb3cfa9f7db752dcb796)

## 出力フォーマット

- `--color`
    - 色付け
- `--profile`
    - テストごとの処理時間を出力
- `--format d`
    - example (it)に記述したコメントをテスト結果に表示

```
rspec --color --profile --format d spec/XXXXX_rspec.rb
```

.rspecに事前に書いておけば、コマンドを省略できる。

```rb:.rspec
--color --profile --format d
```

## pedningにする
テストする必要があるが、とりあえずテストにエラーを出したくない時に活用

```rb:spec.rb
  xit "assigns users as @users" do
  end
```

```rb:result
  Accounting::MemberController GET index assigns users as @users
    # Temporarily disabled with xit
```

参考
[Rspec の pending と skip って何が違うの？](https://qiita.com/tyamagu2/items/fe75ebfcfd643d3d760d)



## つまずいたこと

### PG::Error: ERROR:  permission denied

テスト実行時に以下エラー発生。
 
```rb
     Failure/Error: Unable to find matching line from backtrace
     ActiveRecord::StatementInvalid:
       PG::Error: ERROR:  permission denied: "RI_ConstraintTrigger_c_1196635" is a system trigger
```

 DBにアクセスユーザの権限レベルを上げれば良い

```sql
ALTER USER user_name with SUPERUSER;
```
参考
[Postgres system triggers error: permission denied](https://qiita.com/ishisak@github/items/67cbd12a04e21965ebf6)


### letの遅延評価
[Rspec letの遅延評価](https://qiita.com/adebadayo/items/2f5618753efba7799a55)





# 参考サイト
[RSpecチートシート](https://qiita.com/morrr/items/6ed889d17abbfd352649)
Filebeat と Metricbeat を Windows で 起動

Filebeat と Metricbeat を ダウンロード
=====================================

まずは、各種 Beats(WINDOWS xx-BIT sha) を ダウンロードしてください。

[Filebeat ダウンロード URL](https://www.elastic.co/jp/downloads/beats/filebeat)
[Metricbeat ダウンロード URL]
(https://www.elastic.co/jp/downloads/beats/metricbeat)


展開して C:\Program Files に 配置
================================

ダウンロードしたら、展開して例えば、Metricbeat の場合、このように配置してください。

![win_metricbeat.png](https://qiita-image-store.s3.amazonaws.com/0/45117/09718b87-a193-d840-00bd-09e805e71549.png)


Powershell の 実行ポリシーを変更
===============================

Powershell の 実行ポリシーを Unrestricted に 変更しておかないと次に進めないので一時的に変更してください。

```powershell:管理者として実行
# Set-ExecutionPolicy で ポリシー変更
PS C:\> Set-ExecutionPolicy Unrestricted

# Get-ExecutionPolicy で ポリシー確認
PS C:\> Get-ExecutionPolicy
```

サービスに登録
=============

各種 Beats の サービス登録用 Powershell を 起動してください。

```powershell:管理者として実行
# Filebeat サービス登録
PS C:\Program Files\Filebeat> .\install-service-filebeat.ps1

# Metricbeat サービス登録
PS C:\Program Files\metricbeat> .\install-service-metricbeat.ps1
```


各種設定
========

Linux の 場合と同じように、以下のような設定ファイルを変更していってください。
C:\Program Files\Filebeat\filebeat.yml
C:\Program Files\metricbeat\metricbeat.yml


サービスを起動
=============

タスクマネージャからサービスを起動してください。そして Kibana で データが取得できているか確認してください。


Powershell の 実行ポリシーを戻す
===============================

最後に Powershell の 実行ポリシーを元に戻して[^1]おいてください。

```powershell:管理者として実行
# Set-ExecutionPolicy で ポリシー変更
PS C:\> Set-ExecutionPolicy Restricted

# Get-ExecutionPolicy で ポリシー確認
PS C:\> Get-ExecutionPolicy
```

[^1]: サービスから削除する場合はもう一度、実行ポリシーを Unrestricted にして uninstall-service-xxxxbeat.ps1 を 実行してください。
StanとRでベイズ統計モデリング(アヒル本)をPythonにしてみる - 11.2 混合正規分布

[実行環境](https://qiita.com/shngt/items/ce6f2c3ef348cd80f432)

### インポート

```python
import numpy as np
import pandas as pd
import pystan
import matplotlib.pyplot as plt
from matplotlib.figure import figaspect
import seaborn as sns
%matplotlib inline
```

### データ読み込み

```python
mix1 = pd.read_csv('./data/data-mix1.txt')
mix2 = pd.read_csv('./data/data-mix2.txt')
```

# 11.2 混合正規分布

```python
plt.figure(figsize=figaspect(3/4))
sns.distplot(mix1['Y'], bins=30, hist_kws=dict(facecolor='w', edgecolor='k'), kde_kws=dict(color='k', shade=True))
plt.show()
```
![fig11-2.png](https://qiita-image-store.s3.amazonaws.com/0/103085/48e9778a-1491-a4ab-716d-eb1d80780e00.png)

```python
data = dict(
    N=mix1.index.size,
    Y=mix1['Y']
)
fit = pystan.stan('./stan/model11-5.stan', data=data, init=lambda: dict(
        a=0.5,
        mu=(0, 5),
        sigma=(1, 1)
), seed=123)
```

```python
plt.figure(figsize=figaspect(3/4))
sns.distplot(mix2['Y'], bins=25, hist_kws=dict(facecolor='w', edgecolor='k'), kde_kws=dict(color='k', shade=True))
plt.show()
```
![fig11-3.png](https://qiita-image-store.s3.amazonaws.com/0/103085/3213fef9-b1c0-08db-3e34-4747a43dcc9e.png)

```python
K = 5
data = dict(
    N=mix2.index.size,
    K=K,
    Y=mix2['Y']
)
def init():
    return dict(
        a=np.full(K, 1/K),
        mu=np.linspace(10, 40, K),
        sigma=np.ones(K),
        s_mu=20
    )
fit = pystan.stan('./stan/model11-6.stan', data=data, init=init, seed=1234)
fit_b = pystan.stan('./stan/model11-6b.stan', data=data, init=init, seed=1234)
```
Map の filter, sort の実装

## Map のフィルター

JavaScript の Array には filter メソッドがあって便利だが、Map にはその機能がないので、あると便利だな、、と思って実装してみた。
（コメントいただいたのですが、[こちら](https://github.com/tc39/proposal-collection-methods)で標準化がすすめられているようなので、そのうちMapの標準機能として実装されるかもしれません。）

Map のプロトタイプに filter() メソッドをぶち込んで Map そのものを拡張してしまうのはあまりに危険なので、MapUtility　というクラスを定義し、そのクラスのクラスメソッドとして実装しました。

```javascript
export default class MapUtility {

    /**
     * Map を key でフィルターする
     * @param {Map} map
     * @param {function} func
     * @return {Map<any, any>}
     */
    static filterByKey(map, func) {
        const newMap = new Map();
        map.forEach((value, key, map) => {
            if (func(key)) {
                newMap.set(key, value);
            }
        });
        return newMap;
    }
}
```

実行例としては以下のような感じ。

```javascript
const testMap = new Map([
    ['芥川', 123],
    ['川端', 456],
    ['夏目', 789],
    ['町田', 1000],
    ['三島', 10001],
]);

const filteredMap = MapUtility.filterByKey(testMap, key => {
    return (key !== '川端');
});

console.log(filteredMap);
//Map { '芥川' => 123, '夏目' => 789, '町田' => 1000, '三島' => 10001 }
```

きちんと川端さんが除外されています。

また上記では key でフィルターしていますが、もっと汎用性を高めたかったら以下のようにすればよいです。

```javascript
class MapUtility {

    /**
     * Map をフィルターする
     * @param {Map} map
     * @param {function} func
     * @return {Map<any, any>}
     */
    static filterByKey(map, func) {
        const newMap = new Map();
        map.forEach((value, key, map) => {
            if (func(value, key, map)) {
                newMap.set(key, value);
            }
        });
        return newMap;
    }
}
```

呼び出し側では

```javascript
const filteredMap = MapUtility.filterByKey(testMap, (value, key, map) => {
    //...フィルター条件をここに書く
});
```

## Map をキーでソート

ついでにソートもできたら便利だな、と思いましたがfilterのときほどスマートにはできなかったのがちょっと残念。どなたかもっとスマートなやり方あるよって方コメントください。

```javascript
export default class MapUtility {

    /**
     * Map を key でソートする
     * @param map
     * @param func
     * @return {Map<any, any>}
     */
    static sortByKey(map, func) {
        const newMap = new Map();
        const keysArray = Array.from(map.keys());
        const sortedKeys = keysArray.sort(func);
        for (const key of sortedKeys) {
            newMap.set(key, map.get(key));
        }
        return newMap;
    }
}
```
呼び出し側では

```javascript
const testMap = new Map([
    ['c', 123],
    ['a', 456],
    ['d', 789],
    ['b', 1000],
    ['e', 10001],
]);

// 昇順ソート
const sortedMap = MapUtility.sortByKey(testMap, (a, b) => {
    if(a < b){
        return -1;
    }else if(a > b){
        return 1;
    }
    return 0;
});

console.log(sortedMap);
//Map { 'a' => 456, 'b' => 1000, 'c' => 123, 'd' => 789, 'e' => 10001 } 

// for of, forEach どちらでもアルファベット順に出力される
// ソートする前は記述した順番にループしてしまう
for (const [key, value] of sortedMap) {
    console.log(`key:${key}, value:${value}`);
}

sortedMap.forEach((value, key, map) => {
    console.log(`key:${key}, value:${value}`);
});
```

ループもきちんとキーをアルファベット順になります。

なお Array.sort()は要素の文字をUnicodeに変換し、その数値でソートしますので、上記のようにキーの先頭がすべて小文字アルファベットの場合、すべて大文字アルファベットの場合、すべて数字,すべてひらがな、すべてカタカナの場合はうまくソートできますが、これらが混在していたり、漢字が混ざっていたりするとちょっとややこしくなります。

こちらの記事に結構詳しく書いてありました。参考までに。
https://goma.pw/article/2015-11-18-0/
（1年目）えっ？それどういう意味でしょうか？ってなった言葉

# はじめに
こんにちは。
気が付けばもうすぐ秋です。
1年目の方は今頃ですと、実務とかにガツガツ入っている感じでしょうか。

システムの説明を先輩から受けたり、プログラミングしたり、打ち合わせに参加したり、議事録をとったり…

その中で、話の流れを止めないために聞きづらく、***えっ？それどういう意味ですか？***と心の中で思う事があります。
（自分はありました…）

誰に向けた投稿か自分でも分かりませんが、
自分が先輩になるときの備忘録として、

# 1. 略称

説明を受けていたりすると、急に略称になる時があります。
新しいシステム名が出てきたのかと勘違いしました…
subversion？SVN？で勘違いしました。←文字だとなんとなく分かるのですが、会話だとスペルがわからず…

# 2. 会社の用語？一般的なIT用語？
打ち合わせで出てきた言葉（システム名）が分からず、先輩に聞く前に検索してみよう！と思い、検索するが出てこない…「もしかしてスペルが違うのかな？」と思い、再検索するがやはり、***それらしい情報無し！***
（もっと嫌なのが多少それっぽい情報が出てきて変な解釈をするパターンです）

あとあと先輩に聞いてみると、***自社で使っているシステム***との事でした！それは検索してもでてこないですね。

# 3.　業界特有の表現
「この部分が***べた書き***になっているから～」
べた書き？んん？「べた書き」って日本語はなんとなくは分かっているけど、プログラミング的にはどういう意味だろう？となってしまいました。
また普段使わないけど、よく出てくる「文言」という言葉。
これも同じように文字からなんとなく分かるけど、この意味合いであってるのだろうか？となりました。

以下がよくある業界特有の表現です↓
なるべくシンプルにまとめました。

|文言|意味|
|:--|:--|
|べた書き　　　　　　　|定数等を直接ロジックに組み込むこと、修正時、影響範囲の把握の低下等が起きる。良く消費税の例が使われる。|
|文言　　　　|フレーズ、言い回しに近い言葉。例えば「この文言だと意味が伝わりずらいから変更してほしい。」|
|証跡　　　　|テスト等で実施したオペレーションの経過や結果の証拠。画像やテキストファイルで残すのが一般的。(エビデンスともいう)|
|差分　　　　|２つのファイルを比較し、違いが生じている部分を指す。diffとも言う|
|デグレ　　　　|デグレーションの略称。直したはずのバグが復活、再発したり以前よりも良くない状態になる事。|
|オレオレ証明書　　　　|実際は「自己署名証明書」。公的な機関が作成していないSSL証明書を指します。意味合い的にはオレオレ詐欺の「オレ」に近い。|


日通情報システム採用サイト
https://www.nittsu-infosys.com/recruit/2019/
アノテーションファイル変換（xmlからYOLOへ）

##はじめに
LabelImgなどのアノテーションツールは(__.xml__)というPascalVOCに準拠した形式でアノテーションファイルが保存されますが，これはYOLO(You only look once)で使用できません．PascalVOC形式のアノテーションファイル(__.xml__)はSSD(Single Shot MultiBox Detector)などで使われます．

YOLOは独自のアノテーションファイル形式(__.txt__)を持ちます．しかしSSDとYOLOの性能を比較したい際などでは，同じデータセットで比較することが必要になります．PascalVOCやCOCOなどの大きなデータセットなどはすでに（__.xml__）形式でアノテーションされたファイルが同梱されていることがほとんどなので問題ないのですが，自前のデータの場合，SSDのアノテーションファイル(.xml)をYOLO(.txt)でも扱いたい場合，BBox label toolなどのような別のツールで再びアノテーションという地味で辛い作業を行うなんていうこともあり得ます．

そこで，PascalVOC形式（.xml）からYOLO形式(.txt)のアノテーションファイルを自動生成するツールを作りました．


大元アノテーションツールは以下のgithubリンクになります．（https://github.com/blitzingeagle/xml2yolo ）
しかしこのツールは.xmlファイルへ.txt（YOLO形式）ファイルを入れていくという謎仕様だったのと，ファイルパスをいちいちコマンドライン入力しないといけないアレな仕様だっため，以下のリンクのように改良しました．__ぜひこちらのgithubリンクをお使いください__．（https://github.com/Ryo-Kawanami/xml2yolo ）

##使い方（ディレクトリ構造）
例としてtrafficの画像のxmlファイルをYOLO形式にすることを扱っていきます．．
１．上記のリンクからリポジトリをダウンロードします．
２．そしてダウンロードしたリポジトリ内に[traffic_label][traffic_img]というディレクトリを作り，さらにそのそれぞれのディレクトリの中に[20170271403]というディレクトリを作ります．
３．[traffic_label/20170271403]の中に画像データ，[traffic_label/20170271403]の中にPascal VOC形式のアノテーションデータ，つまり.xmlファイルを入れます．
ここまでで，
・README.md
・traffic_classes.txt
・xml2yolo.py
・xml2yolo_backup.py
・traffic_label/20170271403
・traffic_label/20170271403
の6点がxml2yoloのリポジトリに入っていると思います．
４．そしてxml2yoloのリポジトリの中に[traffic_format4yolo]というYOLO形式のファイルが出力されるディレクトリと，どの順番で物体をアノテーションしたかを示す[traffic_classes.txt]をきちんと書き換えて終わりです．
※traffic_classes.txtは例示的に入れてあるので，書き換えが必要です．


##使い方（コードの書き換え）※簡単
上記ではtraffic_~という名前のファイルを例示的に用いましたが，自分のファイルの名前に応じてxml2yolo.pyの以下の部分を書き換えます．

```python

parentpath = './' #"Directory path with parent dir before xml_dir or img_dir"
addxmlpath = parentpath + 'traffic_label/201702071403' #"Directory path with XML files"
addimgpath = parentpath + 'traffic_img/201702071403' #"Directory path with IMG files"
outputpath = parentpath + 'traffic_format4yolo' #"output folder for yolo format"
classes_txt = './traffic_classes.txt' #"File containing classes"
ext = '.png' #"Image file extension [.jpg or .png]"
```

拡張子は".jpg"か".png"などがあると思いますので，以下の部分を"."を含めて書き換えてください．

```python

ext = '.png' #"Image file extension [.jpg or .png]"
```

ここまでできたらタウンロードしてきたリポジトリのファイルにcdして，

```
$ python xml2yolo.py
```
とターミナルに打ち込めば完了です．（お疲れ様でした．）

あとは以下のサイトを参考にYOLOv3の学習を行ってください．おそらくtraffic_classes.txtをtraffic_classes.namesなどと書き換えて使うことになると思います．
http://shibafu3.hatenablog.com/entry/2017/08/24/124826


###P.S.
機械学習，画像認識、自動運転の情報を発信していくのでQiitaと [twitterのフォロー](https://twitter.com/cv_carnavi)お待ちしています！
mavenの特定のバージョンのインストール方法

##はじめに
今回の環境はMacOSを前提に記述しておりますのでよろしくお願いします。
また、もしバージョンに関して特に指定をしなくてもよいという場合にはhomebrewを使ってインストールするのが一番簡単で早いかと思います。その方法については調べれば大量にありますので割愛させていただきます。

##インストール方法
https://archive.apache.org/dist/maven/
ここからダウンロードができます


3.5.2をダウンロードしたければ
>maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.zip

こちらをダウンロードして解凍。

解凍した物を`/usr/local`に移動

コマンドは以下

```/usr/localに移動

$ cd /usr/local
$ sudo mv [解凍した場所]/apache-maven-3.5.2 .
```



次に`.bash_profile`を開く

```
$ cd ~
$ vi .bash_profile
```

下記を記入して保存

```
export M3_HOME=/usr/local/apache-maven-3.5.2
M3=$M3_HOME/bin
export PATH=$M3:$PATH
```
以下のコマンドで環境変数の再読み込みを行う
`$ source .bash_profile`

読み込まれているかの確認

`$ mvn --version`

バージョンが表示されたら成功
[Objective-C]CGImageRefで強制終了した話

Swiftが流行る中でObjective-Cの記事かよというツッコミはあると思いますが、多分、Swiftでも起こる話なので見ていってください。

CGImageRefって何？という方は下の記事が結構細かく書かれているので読んでください。
> http://galakutaapp.blogspot.com/2016/08/blog-post_25.html

コードを組んでいる最中にXcodeでdebugビルドしたところ問題なく、releaseビルド時のみ強制終了したところから始まります。
始め、どこで強制終了しているか不明で調査するしたところ、どうやら以下のコードで強制終了しているようでした。

```
// imgのcgImageRefはライブラリで定義されていたもの
CGImageRef imageRef = [img cgImageRef];
UIImage *image = [UIImage imageWithCGImage:imageRef];
```

解決方法は簡単で一度定義されているCGImageRefを直接入れればいいということでした。

```
// imgのcgImageRefはライブラリで定義されていたもの
UIImage *image = [UIImage imageWithCGImage:[img cgImageRef]];
```

直前で定義したものが次の行で解放されていることに驚きを隠せませんでした。

因みにStackOverflowの英語記事にあったような気がしますが、見つけにくかったのでメモ書き程度にこちらで記載しました。
古いsetuptoolsをアップグレード

# scrapyを触ってみたいのでサンプルコードを写経
[Scrapy at a glance](https://doc.scrapy.org/en/latest/intro/overview.html)

# setuptoolsが古そうだというのはわかる

`$ sudo pip install Scrapy`実行後
**エラー文**

```
RuntimeError: cryptography requires setuptools 18.5 or newer, please upgrade to a newer version of setuptools

----------------------------------------
Cleaning up...
Command python setup.py egg_info failed with error code 1 in /tmp/pip_build_root/cryptography
Storing debug log for failure in /home/ubuntu/.pip/pip.log
```

# では、アップグレード、と
とりあえずその前にバージョン確認しようと`$ setuptools --version` と打ってみるが

```
bash: setuptools: command not found
```

いえ、この書き方が悪かったのかも知れない、それでもsetuptoolsは入っているようだからなんとか今のバージョンを確認したい、と検索して`$ pip list` を発見。pipでインストールしたパッケージの名前とバージョンを一覧で取得してくれました。

```
beautifulsoup4 (4.6.3)
chardet (2.2.1)
colorama (0.2.5)
decorator (3.4.0)
html5lib (0.999)
ipython (1.2.1)
matplotlib (1.3.1)
nose (1.3.1)
numpy (1.8.2)
Pillow (2.3.0)
pip (1.5.4)
pycurl (7.19.3)
pygobject (3.12.0)
pyparsing (2.0.1)
python-apt (0.9.3.5ubuntu2)
python-dateutil (2.0)
pytz (2012c)
requests (2.2.1)
scipy (0.13.3)
setuptools (3.3)
simplegeneric (0.8.1)
six (1.5.2)
tornado (3.1.1)
unattended-upgrades (0.1)
urllib3 (1.7.1)
wheel (0.24.0)
```

**`setuptools (3.3)`**とな。`requires setuptools 18.5 or newer`からするとかなり古いな:laughing:

バージョンが分かったところで`$ sudo pip install ~`のノリで`$ sudo pip upgrade setuptools` を実行した。

```
ERROR: unknown command "upgrade"
```

「upgradeじゃないのか:sob:」とひとしきり検索して`$ sudo pip --upgrade setuptools`を実行。すると親切なことに

```
Usage:   
  pip <command> [options]

no such option: --upgrade
```

わー! ありがとう:two_hearts: ということで`$ sudo pip install setuptools --upgrade`を実行し、`pip list` も実行。`setuptools (40.1.0)`:sparkles:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/171266/24a5c8ce-5318-8684-cb31-df1b1e6c7f51.png)

さて、気を取り直して`$ sudo pip install Scrapy`。。。
Google Fonts は IE11 非対応？

たまたま Twitter でキャプチャを上げている方のツイートを見かけて（元ツイート見つからない...）、IE11 で以下のサイトにアクセスしてみました。
https://fonts.google.com/?subset=japanese

![ie.png](https://qiita-image-store.s3.amazonaws.com/0/6168/bdfded29-ebae-a177-18b0-10471a372acd.png)
>Your browser is not currently supported. Google Fonts works best on Chrome, Firefox, Edge and Safari.

こんな顔文字見たらわかりますが、一応、Google先生に翻訳していただいた。
>お使いのブラウザは現在サポートされていません。 Googleフォントは、Chrome、Firefox、Edge、およびSadariで最適です。

＿人人人人人人人人人人＿
＞　IE11 非対応！！！　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y￣


めっちゃ喜びたいところですが、お客様からのご要望も多い現状では、まだまだ IE11 を切ることはできません。

また、「NotoSansJP」を使ったサイトでは、『IE11 では日本語だけが効かず、英数字は効いちゃう』という中途半端な状態になっているそうです。（「NotoSans」だけは効いてるってこと？？なんで？？？）


　
　
［追記］
ググってみたら、2016年ぐらいから「IEはサポートしてないよー」というエラーが出てたみたいです。（完全に切ったのは最近？）

いつから IE11 非対応だったのかわかりませんが、どうやって対応したらいいのか、よい方法を探っていきたいと思います。。

（現在の GoogleFonts は IE11 に対応していない「.woff2」みたいなので、『ダウンロードして「.woff」に変換』とかかなー？）
https://caniuse.com/#search=woff2
https://caniuse.com/#search=woff
　
　
［追記 2］
他のフォントも、英数字は表示できたりできなかったり、レイアウトが崩れたりしているみたいです。
ちょっと検証してみますーー！

（参照）
GoogleフォントがIE11で正常に表示されなくなった - Qiita
https://qiita.com/chisamikan/items/c4d37754d175c17fbe41
>IE11でGoogleフォントの『Rounded M+ 1c』を使ったサイトを見ると、フォントが正常に表示されない。
>（『さわらび明朝』などほかのフォントや、アルファベットだけは正常に表示されるっぽい？）