OmniAICreator/Qiita-1.07M huggingface dataset:
reveal.jsの環境構築で躓いた話(windows 10)

# はじめに
最近、私の所属しているサークルでLT会をやっていこうという流れがあったので、Markdownからスライドを作れる「reveal.js」について紹介しました。
そのためにreveal.jsをセットアップしようとしたのですが、公式ドキュメントでは3行だったのが1時間以上かかってしまったので、その備忘録です。


## Markdownとは
markdownは簡単な記法で記事などの文章を構成出来るマークアップ言語です。
qiitaやはてなブログなどで記事を上げている諸兄には馴染み深いものかもしれません。

### 記述例:
```
# 見出し1
## 見出し2
--- 線
**強調**
```
### 実行例:
# 見出し1
## 見出し2
---
**強調**

## reveal.jsとは
かっこいいスライドを簡単に作れるフレームワークです。
htmlに書き込んで作りますが、ちょちょっと設定すると、Markdownを書くだけでそれがスライドになります。
パワーポイントをマウスクリックしながら無限に時間を溶かすことも、揃ってないデザインを先輩に怒られることもなくなります。

## セットアップする
[reveal.js のGitHubページ](https://github.com/hakimel/reveal.js/)

reveal.jsのセットアップには２つの方法があります。

1) 簡単に使うだけなら、githubのページからプロジェクトをローカルに保存するだけで大丈夫です。

2) 拡張マークダウンを使ったり、スピーカーノート(発表者のメモを隣に表示する機能)を使ったりする場合には、Node.jsを使いローカルにサーバーを建てるFull Setupが必要です。

今回はこの(2)のFull Setupの方法を解説します。
とりあえず公式ドキュメントの言う通りにやります

## 1. reveal.js をクローン OR ダウンロードする。
[reveal.js のGitHubページ](https://github.com/hakimel/reveal.js/)

## 2. Node.js をインストールする
[公式サイト](https://nodejs.org/ja/)からNode.jsをダウンロード&インストールします。

## 3. npmを使ってインストールします

やることは、Node.js についてくるパッケージマネージャnpmを使って環境を整えるだけです。
package.jsonファイルに設定はしてくれてあるので、これに従うだけです。

カレントディレクトリをreveal.jsのフォルダに移動してから

```
$ npm install
$ npm start
```
でサーバーをインストールして起動して終了なんですが、**そうは問屋がおろしませんでした**。

## 4.MSBuild.exeに関するエラーが出たら
[VisualStudio](https://visualstudio.microsoft.com/ja/downloads/?rr=https%3A%2F%2Fdocs.microsoft.com%2Fja-jp%2Fvisualstudio%2Finstall%2Finstall-visual-studio%3Fview%3Dvs-2019)を入れていないか、versionが異なっています。
もしVSを入れていなかったら入れましょう。
または、VS2019を入れていてエラーが出たらバージョンの設定が違うので、

```
$ npm config set msvs_version 2019
```
でコンフィグを設定します。
(デフォルトではVS2017を探しに行きます)

## 5. Windows Build Toolsをインストールする
Windows-Build-Toolsが入っていない場合はこれをインストールします

```
$ npm install -g windows-build-tools
```
これでOKです。

## 6. npm-check-updatesを入れる
npm-check-updatesを入れて、パッケージのバージョンを整理してもらいます。

```
$ npm install -g npm-check-updates
```
## ncuコマンドを使います
npm-check-updatesを実行するコマンド、ncuを実行します

```
$ ncu
```
するとncu -uをしてアップグレードをするように促されるので、仰せの通りにします。

```
$ ncu -u
```

## 7. npm installをしなおす
これでnpm installをするように促されるので、仰せの通りにします。

```
$ npm install
```
「Binary is fine」と出れば成功です！

# reveal.js を使う
インストールが終わったのでnpm startでサーバーを起動します。

```
$ npm start
```
## ブラウザで見る
これで http://localhost:8000 にサーバーが立っています。
晴れて、reveal.jsを使えるようになりました！

# 終わりに
ここでは、Windows10でつまづきまくった環境構築について説明しました。
この記事ではその使い方、Markdownの書き方までは解説しなかったです。
(これについては非常に分かりやすい記事が沢山あるので)]

以下の記事をご参考にしてください。
[reveal.jsでスライド作り。](https://qiita.com/t-kusakabe/items/725e7438892bba395062)

reveal.jsを使うと非常に楽にスライドを作ることが出来るので、是非是非活用してください

# 蛇足
今回は2019年11月の段階でpackage.jsonのversionがズレていた(?)のでこの方法で直しましたが、もしかしたら修正されていくかもしれません。
また、今回はNode.jsを使ったことが無い人がぱぱっとFull Setupするための方法を解説しましたが、nvm(Node Version Manager)などを使っている人はそれで調整しても良いかもしれません。
中国語の IME のインストール方法

# 中国語の IME の追加方法

Microsoft の中国語の IME をインストールする方法を説明します。(windows 10)

## Windows の設定の画面を表示します。

<img width="763" alt="0.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/2732ef72-a664-7052-2b9a-87d89803b74f.png">

## 時刻と言語を選びます。

<img width="763" alt="1-chinese-add.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/82bff563-1c7c-ea4c-11f3-c0f47af235c5.png">

## 言語を選びます。

<img width="763" alt="2-chinese-add.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/1e3f1042-9f96-8cd7-ca82-cf0749f1ac4f.png">

## 優先する言語を追加する を選びます。

<img width="763" alt="3-chinese-add.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/6d2232b8-2d57-ea81-a937-f65fa9bc4999.png">

## 中文 を選びます。

<img width="763" alt="4-chinese.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/a8062b6d-9806-5ec4-8497-a453b61029be.png">

## インストールを選ぶ

<img width="763" alt="5-chinsese-add.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/7d438c69-e126-66f2-189c-3ea492f5d1ca.png">

## インストールが始まります。

<img width="763" alt="6-chinese-add.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/19c5b652-704c-c1b5-cb78-7192e1922742.png">

## 完了すると以下の画面になります。

<img width="763" alt="7-chinese.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/17af36ec-25a0-4149-e26b-e099ab01ba9e.png">

## タスクバーの赤丸のアイコンを押すと IME を切り替えられます。

Windows キーを押しながら スペースキーを押しても切り替えられます。

<img width="321" alt="8-chinese-add.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/99701f41-4ac9-2d98-fd1d-c404c0efa2c0.png">
[Flutter]iOSでGoogleService-Info.plistを動的に切り替える方法

Build SettingsのUser-Definedに変数を追加する
![BuildSettings](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117867/66fc54b3-2297-ead5-4a3e-7c8cf30ee284.png)

適当なディレクトリにGoogleService-Info.plistを配置する。

```
│   ├── Runner
│   │   ├── Firebase
│   │   │   ├── GoogleService-Info-Development.plist
│   │   │   └── GoogleService-Info-Production.plist
```

GoogleService-Info.plistをコピーするシェルを準備して、

```sh
GOOGLE_SERVICE_INFO_PLIST_FROM="${PROJECT_DIR}/Runner/Firebase/${FIREBASE_CONFIG_FILE}"
GOOGLE_SERVICE_INFO_PLIST_TO="${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/GoogleService-Info.plist"

cp "${GOOGLE_SERVICE_INFO_PLIST_FROM}" "${GOOGLE_SERVICE_INFO_PLIST_TO}" 
```

Build Phasesに追記する。

![Build Phases](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117867/b6b404c4-562f-c964-76cf-f4d213961597.png)

＊ Crashlyticsを使用している場合には、下記のシェルの実行より前に設定する（Build Phasesで実行するScriptの順序に注意）。

```
${PODS_ROOT}/Fabric/run
```

## 参考
[Could not get GOOGLE_APP_ID in Google Services file from build environment](https://stackoverflow.com/questions/57006663/could-not-get-google-app-id-in-google-services-file-from-build-environment)
テスト実施の時点で泣かないように

# はじめに

テストしてもしてもバグがなくならないし、どんどんテストケース（パターン）が際限なく増えて終わらないし、あれこれ言われて挙句の果てに全部テストしてとか言われて破綻するようなことありませんか？

僕はありますｗｗ

そんな困ったときには、テストの種類をまとめて条件を書いてみると自分の考えも整理ができて本当にテストが必要なのか判断しやすくて、「全部」テストしなくてもいいじゃないのってわかってきます。

テストを楽にするというか、イライラせず安心してテストをするヒントとなればと思いました。

# テスト設計
仕様書が確定するまでテストができないと思っていませんか？
テストは要求や仕様を決める段階からでも始めれるものです。

例えばテキストファイルを読み込んで保存ができる Windows標準の某テキストエディタのようなものを作るっていうとき。

まずは「テキストファイルを読み込む」ってことが必要ですよね？
読み込む文字コードに限って考えるのであれば、簡単にですが以下のように分割していけます。



|読みこめる文字コード|化ける文字コード|
|---|---|
|UTF-8|EUC|
|UTF-16（BE,LE）|そのほか色々|
|Shift-JIS（MS932）|

正常に動作するものを「有効同値」、（エラーになったり）動作しないものを「無効同値」とか言って「同値分割」というテスト技法のひとつです。

これぐらいであれば、完全な仕様書や動作するものがなくてもできると思います。
（実際には、もっといろんな条件があったり組み合わせがあったりしますが）

# 実施するテストの選定
さてさて、「有効同値」、「無効同値」をあげてテスト設計を進めていくのですが、「全文字コードの確認したの？」って言われる時がありますが。。。

素直に全部やるのか（考えるのか）というと『やらない』です。

「全部やれ」ということになった時には、逆に「読みこめる文字コード」以外はちゃんとエラー処理をしているのかを聞いてみましょう。
（というか、エラー処理入れろやゴルァ！って言いますけど）


テスト設計すると、動作してほしい／してほしくないところが限定されてくると思いますので、実際に動作するものが出来上がるまで待たなくてもできる作業なのです。

なので、開発している最中に「できること」、「できないこと」を分けて考え開発チームにフィードバックしておくと、あとあとテストが楽になってきますよ

# おわりに
そのほか、境界値分析や組み合わせなど、様々なテスト技法があるので、それらも駆使してテストする範囲や条件を限定していくことができます。


「全部テストをして」とか「バグ全部発見して」とかいう無茶なことを言われて、あまり意味のないテストに時間がとられて、結局バグがとれず最終的に、これテストしたの？って言われないように、効率よく的を射たテストができますように。
Azureの基礎　その１１

#Azure Resource Manager での Azure リソースの管理と整理

出展：https://docs.microsoft.com/ja-jp/learn/modules/control-and-organize-with-azure-resource-manager/index

##リソース グループの原則

###リソース グループとは何か
・Azureでデプロイされているリソース用の論理コンテナー
・ソースはすべてリソースグループに属する必要がある
・1つのリソースが属することができるリソースグループは1つに限られる
・リソースグループを入れ子にすることはできない
・Azureリソースの管理と整理に役立てるために存在する
・用途、種類、場所が類似したリソースを配置することで、Azureで作成するリソースを整理することができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545315/c8235b89-36f9-b5fc-2ae3-285c80a1648b.png)
・リソースグループを削除すると、中に含まれているリソースもすべて削除される
・ロールベースのアクセス制御（RBAC）のアクセス許可を適用するための範囲

###リソースグループを利用して整理する
・一貫した命名規則
　・理にかなった命名規則を使用する
・整理の原則
　・リソース別、環境別、部署別　等々
　・承認を対象とする整理
　　リソースグループはRBACの範囲であるため、それを管理する必要がある人別にリソースを整理
　・ライフサイクルを対象とする整理
　　リソースグループを削除すると、その内部にあるすべてのリソースが削除される
　　非運用環境など、リソースを破棄する場合が多い領域で便利
　・課金を対象とする整理
　　請求報告で使用する目的でリソースをグループ化する
　　Azure環境でコストがどのように分配されているのかを知りたければ、リソースグループ別にリソースをグループ化し、データを絞り込み、並べ替えることでコストの割り当てを理解できる

##タグ付けを使用してリソースを整理する
###タグとは
・テキストデータの名前と値を組み合わせたもの
・リソースに設定される標準のAzureプロパティに加え、自分のリソースだけに関する詳細を関連付けることができる
・1つのリソースには最大 50 個のタグを設定することができる

###タグを使用して整理する
・グを使用すると、複数のリソースグループから関連リソースを取得できる
・リソースにタグを付けることは、リソースを監視し、何らかの影響を受けたリソースを追跡する目的にも役立つ
・監視システムのアラートにタグデータを組み込むことで影響を受ける人を正確に知ることができる

###ポリシーを使用して基準を適用する
・Azure Policyとは
　・ポリシーの作成、割り当て、管理に使用できるサービス
　・リソースが従う必要がある規則を適用して強制する
　・リソースが作成されるときに規則を強制したり、既存のリソースの有効性を確認し、規則に従っていることを判断したりする

##ロールベースのアクセス（RBAC）制御を使用したリソースのセキュリティ保護
###RBACとは
・Azureリソースに対してきめ細かいアクセス管理を提供することで、業務の遂行に必要な特定の権限をユーザーに付与できるようにする
・RBACはコアサービスと見なされ、すべてのサブスクリプションレベルに無料で含まれる
・RBACを使用してできること
　・あるユーザーにサブスクリプション内のVMの管理を許可し、別のユーザーに仮想ネットワークの管理を許可する
・データベース管理者（DBA）グループにサブスクリプション内のSQLデータベースの管理を許可する
・あるユーザーに、VM、Webサイト、仮想サブネットなど、リソースグループ内のすべてのリソースの管理を許可する
・あるアプリケーションに、リソースグループ内のすべてのリソースへのアクセスを許可する
・アクセスに許可モデルが使用される

###RBACのベストプラクティス
・チーム内で職務を分離し、職務に必要なアクセス許可のみをユーザーに付与する
・特定のスコープで特定の操作のみを許可することができます。
・アクセス制御戦略を計画する場合は、業務を遂行するのに必要な最低限の特権をユーザーに付与する
・リソースロックを使用して、重要なリソースが確実に変更されたり削除されたりすることがないようにする

##リソースロックを使用してリソースを保護する

###リソースロックとは
・変更または削除を阻止する目的であらゆるリソースに適用できる設定
・[削除] か [読み取り専用] を設定できる
・リソースロックはサブスクリプション、リソース グループ、個別リソースに適用できる
・上位で適用されている場合、下位に継承される
・リソースロックはRBACアクセス許可に関係なく適用される
urllib.requestで AttributeError: module 'urllib' has no attribute 'request'のエラーが出る

import urllib　としていたのを
import urllib.request　にすればエラーが出なくなった

urllibをインポートしてもurllibに含まれるモジュールのすべてをインポートしてくれるわけではなく、利用するものを指定してインポートする必要があるためこのエラーがでていた

情報元
https://lists.gt.net/python/python/1215580
Scala.jsとcatsとその仲間たち for Scala Advent Calendar 2019


この記事は、[Scala Advent Calendar 2019](https://qiita.com/advent-calendar/2019/scala) の15日目の記事です。
14日目は、[showmant](https://qiita.com/showmant)さんの[Akka HTTPでメンテナンス時のレスポンスを制御する](https://qiita.com/showmant/items/0f543dde9414d92dfc3c)でした。
16日目は、[poad1010](https://qiita.com/poad1010)さんの[Scala で AWS CDK Javaを使ってみる](http://poad1010.hatenablog.com/entry/advent/2019/scala)です。

一つの記事を複数のAdvent Calendar に関連付けられなかったので、リンクを新たに生成しました。

本文はこちらです。

https://qiita.com/grimrose@github/items/dcadda9f82c083525e76
PHPのマジックメソッド~ 駆け出しエンジニア編 ~

こんにちは！
株式会社オズビジョン 開発グループのShoと申します。

私は2019年９月に入社して、webエンジニアへジョブチェンジしました。
エンジニア歴約３ヶ月で未経験入社の新人です。29歳です。
大学出てからの約7~8年はずっと営業職でした。
というわけで今は知識も技術力もない私ですが、脱未経験エンジニア目指して頑張ります！！
(入社前に３ヶ月くらい勉強してCRUD機能実装できる程度です)

今はPHP/JavaScript/TypeScript/React/ReactNativeで、
自社Webサービスの開発(バックエンドもフロントエンドも)を行なっています。

入社する前にはプログラミングスクールでRubyを学んで、Ruby On Railsでのアプリケーション開発の仕方を学んでいましたが、入社を機にPHPerデビューしました。

そんな私が業務の中で、学んだことを書いていきます。

今回はPHPのマジックメソッド
`__call`についてです。
他にもマジックメソッドは存在しますが。

このメソッドについて理解がなく、機能改修の時に悩みました。

#背景
担当しているサービスにて機能改修を任されました。
とりあえず改修対象にあたりをつけるべくコードを読み進め、
該当の処理が行われている関数を探していました。
「なるほど、hoge関数が呼ばれるぽいな。。。」
「controllerはここか」
「hogeで検索...」
「該当なし」
「？！」
「存在しない！！」
詰んだ！
分かりにくいですが、関数が存在していなく、どんなに探しても見つけられませんでした。
そこで使われていたのがマジックメソッド_callでした。

#マジックメソッド (__call)
###マジックメソッドとは
ものすごく簡単に言うと、マジックメソッド__callを使用すると、
**定義されていないメソッドでも処理を実行することができます。**
privateやprotectedも間接的に呼び出すことが可能です。
※private メソッドの呼び出しは PHP 5.3 以降から。
###挙動例
```php5

class callClass
{
    
     // __call(マジックメソッド)
    public function __call($name, $hoge)
    {
        if($name == 'publicFuncAlias') {
         
            // publicメソッド呼び出し
            $this->publicFunc($hoge);
             
        } else {
         
            // 存在しないメソッド名の時ははリターン
            if(!method_exists($this, $name)) { return false; }
 
            // class内のprivate / protected メソッドの呼出
            $this->{$name}($hoge);
             
        }
    }
 
    
     # publicFunc はマジックメソッド経由だけでなく、直接呼び出されることもあるので
     # デフォルトパラメータを付けておかないと、下記のエラーとなる
     # Warning: Missing argument 1 for callClass::publicFunc(), called in ・・・
   
    public function publicFunc($hoge = null)
    {
        echo "I am public method\n";
    }
```
  
```php5

$call = new callClass();

// publicメソッドをマジックメソッドで呼び出す。
$call->publicFuncAlias();
```

``` php5
// 結果
// I am public method
```
存在しないはずの`piblicFuncAlias`を呼び出して実行することができました！

デバッグしてる時に、該当する関数が見つからない時はマジックメソッドを通して呼び出されているかもしれません。

__construct コンストラクターもマジックメソッドの一つですね(今回ので気付きました)

他にも
__get
__set
などなど種類があるようなので学習を深めたいと思います。
TeX パッケージのstyファイルが読み込まれないときの対処法(ls-R手動編集)

```jlisting``` パッケージを入れようと思い，```listings``` パッケージのフォルダに```jlisting.sty```を入れて，```mktexlsr```を実行したがどうもうまく反映されなかったらしいので，その時にやった対処法を書く．

＜筆者の環境＞
 - Ubuntu 18.04 LTS
 - TeX Live 2018

```bash:bash
cd /usr/local/texlive/2018/texmf-dist/tex/latex/listings
sudo cp ~/jlisting.sty jlisting.sty
sudo chmod 644 jlisting.sty
sudo mktexlsr
mktexlsr: Updating /usr/local/share/texmf/ls-R... 
mktexlsr: Updating /var/lib/texmf/ls-R-TEXLIVEDIST... 
mktexlsr: Updating /var/lib/texmf/ls-R-TEXMFMAIN... 
mktexlsr: Updating /var/lib/texmf/ls-R... 
mktexlsr: Done.
```
普通ここまでやれば，うまくいくらしいが，コンパイル時に「styファイルが見つからない」旨のエラーが出てしまう．

```bash:bash
! LaTeX Error: File `jlisting.sty' not found.
```

よく見ると，上の部分で```texmf```のls-Rは書き換えられてるのに，```texmf-dist```のそれは書き換えられてなかった．なので，手動で書き換えます．

texmf-distまで戻ってから

```bash:bash
sudo gedit ls-R
```

`/tex/latex/listings`で検索をかけるとこんなのが出てくる．

```text:ls-R(例)
./tex/latex/listings:
listings-acm.prf
listings-bash.prf
listings-fortran.prf
listings-lua.prf
listings-python.prf
listings.cfg
listings.sty
lstdoc.sty
lstlang1.sty
lstlang2.sty
lstlang3.sty
lstmisc.sty
```

このリストの一番下に，`jlisting.sty`を追加すればOK.

ちなみに保存時に

```
** (gedit:29568): WARNING **: 11:50:40.231: Set document metadata failed: metadata::gedit-position という属性値はセットできません
```

とかいうエラーメッセージが頻繁に出るけど無視して大丈夫です．
新人研修で必要なこと

最近弊社で新人教育がうまく効果を発揮できていないことが話題になりました。

２年くらい新人さんを面倒見ていて問題点がいくつかあったので、ほかエンジニアの人と協議の上で「ここを直したらどうか？」と提案したら猛抗議を受けたのでここに書きなぐっておきます（笑）

#弊社の新入社員の入社時のスキルレベル
うちの会社は中小のSIerなので学生さんのレベルもお世辞にもいいとは言えません。
学生時代まではプログラミングなどは全く知らず、会社に入ってから研修で0から始めるという人が多いです。

#弊社の研修内容と期間
以下のような研修を3ヶ月かけて行います。

##ITの基礎
ビット計算からシステム開発、ネットワーク、セキュリティ、システム開発、DB、アルゴリズムなど基礎的な知識を座学でお勉強

##ビジネスマナー研修
外部機関を使って名刺交換などビジネスマナー研修

##基盤研修
リナックスのコマンドなどを勉強

##JavaSE・JavaEE研修

##総合演習（Java）
2週間程度、5名くらいのチームでシステム開発をしていきます。

#問題点
新入社員の皆さんには悪いけどうちの会社に入ってくるような学生さんは売り手市場だけあってレベルが低いです。
会社も学力試験して最低限コミュニケーション取れればいいやって感じで取っています。
なので素晴らしい教育をしたところでそこまで大きな効果は出ないだろうというのあります。
その前提で聞いて貰えればと思います。

##目標設定が曖昧
上記に書いた研修内容は題目しか調らず研修資料などはもらっていないのですが、正直座学レベルでも頭に入っていない社員が多いです。
教育部に教育に使った資料を渡すよう依頼したのですが受講生の新入社員からヒアリングするように言われました。
ヒアリングした結果、全容を理解できないと言っているのに目標設定をしてそれを達成できるかまで見てあげていないことが明らかです。

##研修内容のミスマッチ
エンジニアはコンピューターサイエンスを勉強する必要があるか？→YESだと思います。
しかし新人研修でコンピューターサイエンスを勉強する必要があるか？→NOだと思います。

理由は新人研修は限られた期間である一定上の現場で必要なスキルを身に着けないといけないからです。
１つ目の目標設定が曖昧というのとかぶるのですが研修の結果どんなスキルが見についてほしいか？という設定ができていないため、とりあえず必要そうな題目を詰め込んで3ヶ月で駆け足で終わらせています。
現場からすると学生時代に基礎的な知識を身に着けていない人はとりあえず動くプログラムを書ける知識を最優先でつけてもらって、あとから必要な知識は自分で身につけてほしいです。
総合演習では***スケジュール管理***や***基本設計***まで新入社員にやらせていますが、そのせいで設計がガタガタになっています。
2ヶ月前までプログラムも書いたことない子たちに設計をさせて失敗させてだめだったね？で終わらせてしまっている感じです。
研修後の発表を聞いたら
***～ができなかった***
***～がだめだった***
といった意見が多くそれを聞いた上役の方々から
***～ができるようになったみたいなプラスの意見を出してほしい***
言われていましたが、本人たちの中で研修は***失敗***したものになってしまっているんだと思います。
また研修が終わったときでさえ***あのときどうすれば失敗しなかったか？***といった解決策すら見つけられていないです。

#まとめ
人にものを教えるというのはとても難しいと思います。
学生時代は自分より成績の悪い人に勉強をずっと教えていたので身にしみて思います。

難しい原因としては教える対象がみんな違うからですよね。
前提とする知識、同じことを聞いたときの理解量みんな違います
なので教えるときはわからない気持ちを理解するのとゴールを明確にしてあげることが大切だと思います。

うちの会社ではこんな研修していますってあったら参考に教えてほしいです。

最近はサイボウズとかみたいに研修内容をネットに公開する企業も増えていますね。
中小企業はここらへんの内容をまとめて経験者が理解して話せば外部に委託する必要はないのかなと思ったりします。
https://blog.cybozu.io/entry/2019/09/05/080000
QtってIEC 62304対応してるっぽい。

#とりあえず・・・
今年もAdvent Calendarの枠だけは作ったものの、自分で何かネタを書く余裕どころか投稿を呼びかける活動すらできていなくて、参加人数も一昨年レベルにはなっているものの・・・って状態なので、もう一本書いてみることにあした。
カレンダーの枠を一つ埋めるネタだし、全然技術的な話でもないけどね・・・

#医療機器のソフトウェア(の開発)に求められること
日本の[医薬品・医療機器等に関する法律](https://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=335AC0000000145)や関連する法令・法規・行政通知みたいな話をし始めるとゴテゴテしてキリがなくなるんだけど、世界的に共通な(もちろん、国内でも採用されている)医療機器の開発、製造、流通、使用、廃棄に至るライフサイクルにおいて品質、安全性、有効性を確保するための「プロセス」を確立するための規格として「[ISO 13485](https://www.iso.org/standard/59752.html)」というのがあったりする。

「品質の確保」っていろんな方法や見方があるんだけど、「一つ一つの品物の品質」を見極めるってのはすごく困難（いろんなヒトがいろんな環境・状況で使ってみた結果で初めて評価できる）なので、開発～廃棄までの「仕事の仕方」が「品質を確保できる」、主に安全面とかで言えば「既知の問題を未然に防ぐことができる」「未知のものを含め問題が発生した時に原因にたどり着くためのトレーサビリティが確保できる」等の視点から、「規格で規程されているプロセスの確立・維持・向上ができている」ことが前提の一つになってる感じ。

んでもって、そこから派生して医療機器ソフトウェア（これは医療機器に組み込まれる「医療機器プログラム」、ソフトウェア単体で医療機器として振る舞う「プログラム医療機器」とかがある。ってか、ややこしいw）の開発に関する「プロセス規格」の一つとして[IEC 62304: "Medical device software - software Life Cycle Processes"](https://webstore.iec.ch/publication/22794)(国内ではJIS T 2304: "医療機器ソフトウェア - ソフトウェアライフサイクルプロセス"となっていて[日本産業標準調査会のサイト](https://www.jisc.go.jp/index.html)で閲覧のみ可)というのがあったりする。
この規格は主として医療機器ソフトウェアの「安全性の向上」を目的として、開発及び保守に関する要求事項を示した感じのもので、ソフトウェアを組み込んだ医療機器の適合性を確認する上でこの規格への適合を示すことが重要になってきているっぽい。

ただ、この規格だけでそれができるわけではないし、最近の医療機器はネットワークに接続されるものも多いので、「機器の安全性」だけでなく、いわゆる「サイバーセキュリティ」のようなことも要求される。実際、医療機器のサイバーセキュリティ対策は一部の国で法制化もされている（国によって要求が少しずつ違うけど）。

細かいことを言い出すとキリがないけど、高度な医療機器にはソフトウェアが必要かつ重要になってきてるから、医療機器の開発そのものにおいて「ソフトウェアの品質向上」やそれを支えるプロセスの確立が重要になっている、って話かな。

#Qtの（あるいはQt Comapnyの？）取り組み
[Medical Devices with Qt](https://www.qt.io/jp/qt-in-medical)ということで、The Qt Cumpanyはいくつかの関連規格の認証を取得してるらしい。ちなみにTUEV NORDは結構大きな認証機関だったりする。

一応、見ると「Class C」で取得している、なんて書いてある。
この"Class"はその機器におけるソフトウェアの位置づけで決まるっぽい。

- Class A: ソフトウェアが「危険状態」の一因とはならない。
- Class B: 「危険状態」の一因とはなるが、重傷の可能性はない。
- Class C: 死亡又は重傷の可能性がある。

つまり、Qtのツールは比較的ソフトウェアの不備がクリティカルな影響を与える機器にも使えるということを意味する。と思う。

#ということで・・・
もちろん、Qtだけ安全なら安全な医療機器ソフトウェアが作れる訳じゃないんだけど、少なくともQtを採用した医療機器ソフトウェアを作ろうとした場合において、開発者がQtの部分まで適合性を考えなくてよいというのは実際負担の負担が減ることを意味していて、つまり実装にかける時間をそれだけ確保できるようになるということ。ま、理想的にいけば、だけど。

実際、海外で開発製造されている某システムはかなり規模も大きいというかかなり複雑なソフトウェアを使った機器なんだけど、そーゆーのにQtが使われていたりする（初期のはMotifかなんかだった気がするのに・・・）。

ということで、まぁ、The Qt Companyはそういうジャンルで使われるための努力もしているみたいだよ、っていうそれだけの話でした。ちゃんちゃん。
Rubyの出力メソッド　p、puts、printsメソッドの違いについてまとめました。

Rubyの学習中に、p、puts、printsメソッドを学習しましたが、違いが分かりづらかったので備忘録として作成しました。

#pメソッドの特徴
pメソッドの特徴は出力する値と共に型情報（文字列や数値型)を一緒に出力することです。
基本的にはデバッグ用に使われます。

コード
1. p '１リットルの重さは'
2. p '1000'
3. p 'グラム程です'

実行結果
1. "１リットルの重さは"
2. 1000
3. "グラム程です"

文字列は""に囲まれて、数字はこのまま出力されます。

#putsメソッドの特徴
■putsメソッド特徴は末尾に改行が入る形で、指定した値を出力することです。
コード
1. puts 'おはようございます'
2. puts '今日は'
3. puts '良い天気です'

実行結果
puts おはようございます
puts 今日は
puts 良い天気です

#printメソッドの特徴
■printメソッドの特徴は改行を入れずに引数に指定した値を出力することです。

コード
1. print 'おはようございます'
2. print '今日は'
3. print '良い天気です'

実行結果
1. おはようございます今日は良い天気です
CentOS8イメージでコンテナを作成　ユーザ追加とsudo権限付与

# 概要

Docker のCentOS8 イメージを取得し、sudo権限を持ったユーザを作成するところまで。

以前書いた下記の記事のCentOS8版になります。
Docker(CentOS)イメージから新規ユーザを追加し運用できるようにするまで
https://qiita.com/libra_lt/items/dd98297cb00aaf1c4c67


# 手順

### イメージ取得

```
docker pull centos:8
```

### 起動

デタッチ起動する場合のみ-dオプションつけます。

```
docker run --name cos8 --privileged -d centos:8 /sbin/init
```

### 実行

デタッチ起動した場合は下記コマンドでインタラクティブモードに。

```
docker exec -it コンテナID /bin/bash
```

### sudo付与

ユーザを追加してsudo権限を付与する手順

#### sudoインストール

```
dnf -y update
dnf -y install sudo passwd cracklib-dicts
````

#### ユーザ追加

```
useradd -m ユーザ名
```

#### パスワード設定

下記コマンド実行後、パスワードを設定する

```
passwd ユーザ名
```

#### sudo設定追加

sudo設定ファイルにユーザを追加

```
echo "ユーザ名 ALL=(ALL) ALL" >> /etc/sudoers
```

以上
製薬企業で使えるPythonライブラリのインストール方法

# はじめに

[製薬企業研究者のためのPythonインストール方法](https://qiita.com/yukiya285/items/6bc3bcef00f7d13c94f1)で紹介したようにAnacondaをインストールすると、科学計算に使うライブラリはおおむねインストールできるのですが、機械学習などで使われるライブラリやモジュールの一部はまだインストールされていません。
そこで、追加でいくつかライブラリやモジュールをコマンド プロンプトを用いてインストールします。
Python3系の使用を想定しています。

# 化学系

## RDkit

化合物の構造情報などを扱えます。
https://www.rdkit.org/
インストールするには以下のコマンドを実行します。

`conda install -c rdkit rdkit`


# データベース操作

## SQL Alchemy

データベース操作を行うことができます。
https://www.sqlalchemy.org/
インストールするには、以下のコマンドを実行します。

`conda install -c conda-forge sqlalchemy`


# 機械学習関連

## TensorFlow

深層学習（ディープラーニング）を行うためのライブラリです。
https://www.tensorflow.org/
インストールするには以下のコマンドを実行します。

`conda install -c conda-forge tensorflow`


## Keras

TensorFlow上で動くニューラルネットワークのライブラリです。
https://keras.io/ja/
インストールするには以下のコマンドを実行します。

`conda install -c conda-forge keras`


## OpenCV

画像解析に使えるライブラリです。
https://opencv.org/
インストールするには以下のコマンドを実行します。

`conda install -c conda-forge opencv`


## Scrapy

ウェブスクレイピングを本格的に行うときに使えます。
https://scrapy.org/
インストールするには、以下のコマンドを実行します。

`conda install -c conda-forge scrapy`


# まとめ

ここでは、Anacondaをインストールした後に追加でインストールするライブラリやモジュールのインストール方法について解説しました。
ここで取り上げたもの以外のライブラリをインストールするためのコマンドは、[Anaconda Cloud](https://anaconda.org/)で検索すると分かります。


# 参考資料・リンク

[プログラミング言語Pythonとは？AIや機械学習に使える？](https://pharma-engineer.com/basic-programming/python-summary/)
埼玉県の「先端産業創造プロジェクト」の参画機関についてRでネットワーク分析してみる。

#1　はじめに

以前に記載した[研究テーマとその参画機関のネットワーク分析](https://qiita.com/restructurecore/items/e1aa242a42b573e4f829)の方法により、埼玉県が平成26年度から実施している「先端産業創造プロジェクト」のネットワーク分析をしてみようと思います。

「先端産業創造プロジェクト」は、ナノカーボン、医療イノベーション、ロボット、新エネルギー、航空・宇宙の5分野について、大学・研究機関等と企業が連携して行う研究開発プロジェクトで、その概要は[こちら](https://www.saitama-leading-edge-project.jp/project/enterprise/)です。


#2　分析の方法

[こちら](https://www.saitama-leading-edge-project.jp/project/enterprise/)に掲載されている情報をもとに、各プロジェクトに対する機関の参画の状況を以下のとおり整理しました。
*表では空欄のセルがありますが、実際にcsvファイルにする時は「0」にする必要があります。
![スクリーンショット 2019-12-08 12.26.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/9f27b234-c54b-880a-deed-dfed1b6c8945.png)
参画機関が行、プロジェクトが列に対応しており、プロジェクトに参画していれば1、参画していなければ0になっています。また、略称は以下のとおりです。

- 参画機関→企業:c、大学:u
- 研究テーマ→ナノカーボン:NC、医療イノベーション:MTI、ロボット:R、新エネルギー:NE、航空・宇宙:AS  

まずはこの行列を記載した"saitama.csv"を読み込み、グラフ化してみます。

```ruby:R
saitama <- read.csv("saitama.csv", row.names = "saitama") 
saitama <- as.matrix(saitama)#行列に変換。
result <- saitama%*%t(saitama)#転置行列を乗じる。
library("igraph")
result<-graph_from_adjacency_matrix(result, mode = "undirected",weighted=TRUE,diag = FALSE)
plot(result,edge.width = abs(E(result)$weight)*2)#重複するエッジは幅の広さに比例してまとめる。
```
するとこんな感じで表示されます。
![スクリーンショット 2019-12-08 12.44.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/75c8d330-3e5c-cc56-3136-4ac4679280a1.png)

このグラフについて、中心的な機関をわかりやすくするため、ノードの大きさを媒介性に比例させます。
なお、単に比例させるとうまく表示されないので、0.1倍にします。

```ruby:R
plot(result,edge.width = abs(E(result)$weight)*2,vertex.size=betweenness(result)*0.1,main="betweenness")
```
するとこうなります。
![スクリーンショット 2019-12-08 12.49.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/38687ab2-08aa-0c98-6b44-596ae593a6fe.png)

#3　まとめ
この図から、もっとも媒介性が高い機関は「u1」であることがわかります。
ただし、HP上では具体的な研究者名が確認できなかったため、もし同じ大学内の別々の研究者の方が別々のプロジェクトに参画していたとしたら、高い媒介性を有していないかもしれませんね。

Grabherの「Trading routes, bypasses, and risky intersections: mapping the travels of `networks' between economic sociology and economic geography」によれば、「ネットワーク分析は、構造とそれを定量化する方法を重視するあまり、アクターおよびその関係の実質、内容を軽視してしまう恐れはある」（水野真彦著「イノベーションの経済空間」p64）とのことですが、示唆に富んだ記述だと思います。
Python学習ノート_002

新しい言語を勉強する時、一番知りたいのは何かわからない時「ヘルプ」の使い方です。
Pythonのシェルターミナルのヘルプを実行すると下記のことを調べることができます。

- helpツールの使い方
 - Pythonターミナルのプロンプト「>>>」の後ろに「help()」を入力して実行するとヘルプツールを起動できる。注目点は第四段落の「使い方」です。
![help()実行後のイメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/0cee351f-a505-32c7-d8ec-ece6edcba298.png)
       - [x]  keywordsを調べる  
       :small_blue_diamond: Pythonターミナルのプロンプト「help>」の後ろに「keywords」を入力して実行するとkeywordsの一覧をしらべることができます。具体的なkeywords例えば「class」のヘルプ内容を調べたい場合、そのまま「class」を入力して実行すると、ヘルプ内容は圧縮されて１行に収める。ダブルクリックで展開可能です。  
![keywordsの一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/ec9048d5-4459-60a6-f617-968fc2f328ec.png)
       - [x]  symbolsを調べる  
       :small_blue_diamond: Pythonターミナルのプロンプト「help>」の後ろ「symbols」を入力して実行するとsymbolsの一覧をしらべることができます。具体的なsymbols例えば「+」のヘルプ内容を調べたい場合、そのまま「+」を入力して実行すると、ヘルプ内容は圧縮されて１行に収める。ダブルクリックで展開可能です。  
![symbolsの一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/c2fb67a9-e725-f089-0fc4-35e0e309fbc9.png)
       - [x]  ほか「modules」や「topics」もほぼ同じ方法で調べることが可能です。
![「modules」と「topics」の一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/414811b6-6bc3-9986-a854-af0245af5b4c.png)

でもhelpの出力内容はpythonのshellウインドウズにはテキストなので、本文が長い時に読みにくいです。この場合「pydoc」を利用してhtml形式に出力可能です。

- pydocツールの使い方
 - MacOSのターミナルを起動後のプロンプト「$」の後ろに「pydoc *random*」を入力して実行するとPython標準ライブラリのrandomモジュールのドキュメントを生成します。結果はMacOSのターミナルに表示します。もっと読みやすい方法は「pydoc -w random」を実行するとカレントディレクトリに「random.html」を出力される。
![pydoc randomの出力結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/5e399c5a-89ce-3ab2-655a-6b3353327446.png)
![pydoc randomの出力結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/822a019a-6748-5139-d714-8a1fcd675907.png)
中国語の ピンイン (pinyin) の入力の仕方

# 中国語の ピンイン (pinyin) の入力の仕方

`Googleのピンイン入力` でピンインの入力ができたみたいですが、
現在はダウンロードできなくなっているみたいです。

https://www.buru3.com/misc/google-pinyin-ime/

しかし、ピンイン入力用の IME を見つけましたので紹介します。

## PinyinTones

### インストーラダウンロードサイト

https://www.pinyintones.com/

### ソースコード

https://github.com/PinyinTones/PinyinTones

### ライセンス

ライセンスは [Microsoft Public License (Ms-PL)](https://github.com/PinyinTones/PinyinTones/blob/master/license.txt) です。

## 使い方

1. https://www.pinyintones.com/ からインストーラをダウンロードしてインストールします。
2. Windows キー + スペースキーで IME を切り替えます。(https://www.pinyintones.com/#howto_win8)
3. 母音を入力した後で 1, 2, 3, 4 を押すことでそれぞれ 1声、2声、3声、4声を入力することができます。

ü を入力するには v を押します。(この後に 1, 2, 3, 4 を押すことで、それぞれ ǖ、ǘ、ǚ、ǜ を入力できます。)
 
## 参考 URL

[Microsoft の IME サンプル](https://github.com/microsoft/Windows-classic-samples/tree/master/Samples/IME) があります。

もし IME を自作しようと思った場合、これを参考にできます。
自分で作ろうと思って調べ始めたけど、既存のソフトを見つけたのでいったん中止。
シェルスクリプト getopts コマンド

シェルスクリプトの引数をオプション付きで指定しするために使用します。
例えば、-c -v file arg のような形式のオプションを解析することができます。
この場合、-c は一文字のオプションで、-v は一文字のオプション + 引数(file)のような指定の仕方になります。

####　1. 引数がすべてオプション形式での指定の場合
例として、abcが対応するオプションとしています。
オプション文字の直後に":"がある場合は、そのオプションが引数を必要としているものと判断されます。
aとbは引数を必要としないオプションになります。
cは引数を必要とするオプションになります。
対応していないオプションについては ? でキャッチして、エラーとして出力させています。

```bash:example1.sh
while getopts abc: option
do
  case $option in
    a)
      echo "This is option a.";;
    b)
      echo "This is option b.";;
    c)
      echo "This is option c with ${OPTARG}.";;
    \?)
      echo "This is unexpected option." 1>&2
      exit 1
  esac
done
```

```bash:result1.sh
$ ./example1.sh -a -b -c Hello -d
This is option a.
This is option b.
This is option c with Hello.
./example1.sh: illegal option -- d
```

####　2. 引数にオプション形式以外のものが含まれる場合
オプション形式の引数を解析する部分は同じですが、その後に通常の引数を解釈させるためのコードを追加しています。
シェル変数 ${OPTIND} には、オプション形式ではない引数の最初の位置パラメータが入っているので、それ -1 の位置までパラメータをシフトしてあげます。

```bash:example2.sh
while getopts abc: option
do
  case $option in
    a)
      echo "This is option a.";;
    b)
      echo "This is option b.";;
    c)
      echo "This is option c with ${OPTARG}.";;
    \?)
      echo "This is unexpected option." 1>&2
      exit 1
  esac
done
echo ${OPTIND}
shift `expr "${OPTIND}" - 1`
if [ $# -ge 1 ]; then
  echo "Remaining options are $@."
else
  echo "No remaining options."
fi
```

以下の実行例の場合、Others がオプション形式以外の引数になりますが、引数の順番としては5つ目であり、${OPTIND}には 5 が入っているのが分かります。
そこまでシフトしてあげるために、5 - 1 = 4 つシフトしています。
オプション形式の引数を解析した後に、オプション形式以外の引数（残りの引数）を解析するという順番になります。
よって、先にオプション形式以外の引数を指定したり、それぞれを混在させるような指定はしません。

```bash:result2.sh
$ ./example2.sh -a -b -c Hello Other1 Other2
This is option a.
This is option b.
This is option c with Hello.
5
Remaining options are Other1 Other2.
```
tusと共に過ごすRESTfulでresumableなファイルアップロードライフ

この記事は[品川Advent Calendar 2019](https://qiita.com/advent-calendar/2019/shinagawa)の15日目です。
tusを使ってみて素晴らしさに気づいたので、共有しようと思います。

# tusって何よ？
https://tus.io/
RESTfulなAPIでファイルアップロードを可能にするOSS。
サーバサイドの実装（デーモン）や、クライアント（jsやpython）が
これらを繋ぐプロトコルを定義しています。

データ保存先にAWS S3を使えたり、アップロード前後に処理を加えたり、
カスタマイズが比較的用意にできるため、拡張性高めのソフトウェアになってます。

よーし、この製品を使って、RESTfulでresumableなファイルアップロードライフを送れそうだぞ！
とはいえ国内での利用した実例記事が少なすぎるので、まずは簡単な紹介記事を上げてみます！

# そもそもファイルアップロードってどんなのがあるの？
RESTfulなAPIでファイルアップロードをしようとすると、大きく下記の2パターンがありますよね。
ただ、これらのどちらも、REST-APIに組み込むにはデメリットが存在しているんです。

## base64
ファイルの中身をbase64エンコードし、リクエストボディに詰め込む方法。
エンコードした文字列をJSONに詰めれるなど、REST-APIに親和性が高い。
#### デメリット
エンコード時に大体133%くらいのサイズ感になっちゃうので、システム性能に一番効く（であろう）
NWコストがかかってしまう。

## multipart/form-data
20年以上前に確立され、[RFC2388](https://www.ietf.org/rfc/rfc2388.txt)で定義され世の中のデファクト的存在。
#### デメリット
JSONが生まれる前にできた仕様なので、JSONベースのREST-APIには親和性が無い

# じゃあtusd使うと何が嬉しいの？
REST-APIで、途中で通信が途切れてしまっても、次回その時点からアップロード再開できるresumableな仕組みを
簡単に構築することができる点です。
[GoogleDrive](https://developers.google.com/drive/api/v3/manage-uploads)や[Dropbox](https://www.dropbox.com/developers/documentation/http/documentation#files-upload)も、同様の仕組みを自前で開発し、世に広くAPIを公開しておりますが、これらのどちらも大雑把に書くと、
下記のシーケンスのように、クライアントから一度メタデータを送付し、レスポンスで受け取ったIDなりエンドポイントなりに対して
ファイルをチャンク毎にアップロードしてゆく形になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539542/b323835a-50e5-fdbf-b6db-a99897743497.png)

```plantuml
@startuml
Client -> Server : POST /api/v1/files ←metadata
Server -> Client : locationid
loop ファイル全てがアップロードするまで
 Client -> Server : PATCH /api/v1/locationid ←ファイルボディ（チャンク単位）
end loop
@enduml
```

これらに相当する機能を、OSSとして提供しているのがtusのポイントです。

更に、プロトコルを定義をしているので、この実装が広がってゆくことで、
現在はサービス毎にバラバラな、世の中のファイルアップロードAPIが標準化されるかもしれません！

というわけで、みんなで利用して快適なファイルアップロードライフを過ごしましょう！
RetrofitのAPIレスポンスをモッキング

コードのテストをしたり、APIがまだ未実装だったりで、モックが欲しかったのでそのメモ。

## 導入

[Retrofit Mock](https://github.com/square/retrofit/tree/master/retrofit-mock)を使う。

```gradle
def retrofit_version = '2.7.0'
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:retrofit-mock:$retrofit_version"
```

## 実装

サービスインタフェースを実装したモックを作成し、そこに返したいデータを書く。


```kotlin:Service.kt
interface Service {

    @GET("api/v1/auth")
    fun getAuth(@Query("id") id: String): Single<Auth>

    @GET("api/v1/payment")
    fun getPayment(@Query("token") token: String): Single<List<Payment>>
}
```

```kotlin:MockService.kt
class MockService(private val delegate: BehaviorDelegate<Service>) : Service {

    override fun getAuth(id: String): Single<Auth> {
        val auth = Auth("xxx")
        return delegate.returningResponse(auth).getAuth(id)
    }

    override fun getPayment(token: String): Single<List<Payment>> {
        val payment = Payment(1000)
        return delegate.returningResponse(listOf(payment)).getPayment(token)
    }
}
```

あとはAPI生成時にモックを返すようにすればOK。

```kotlin:Api.kt
class Api {

    companion object {

        fun create(): Service {
            val retrofit = Retrofit.Builder()
                .baseUrl("https://mock.com/")
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(MoshiConverterFactory.create())
                .build()

            val behavior = NetworkBehavior.create()

            val mockRetrofit = MockRetrofit.Builder(retrofit)
                .networkBehavior(behavior)
                .build()

            val delegate = mockRetrofit.create(Service::class.java)

            return MockService(delegate)
        }
    }
}
```

## 補足

モック生成時にデフォルト値が設定されている項目があるので、随時変更すること。

```kotlin
val behavior = NetworkBehavior.create()
behavior.setDelay(100, TimeUnit.MILLISECONDS)
behavior.setVariancePercent(0)
behavior.setFailurePercent(0)
behavior.setErrorPercent(0)
```

項目|内容|デフォルト値
---|---|---
Delay|発生する遅延|2000ms
VariancePercent|発生する遅延の割合|±40%
FailurePercent|発生する失敗の割合|3%
ErrorPercent|発生するエラーの割合|0%

## 作ったやつ

[demo-retro-mock](https://github.com/toranoko0518/demo-retro-mock)
【OpenGL】エンジンを使わないゲーム開発 -GLUTによるアニメーション-

#緒論
[前回描画した図形](https://qiita.com/Kosuke418/items/14dc26439061026624d7)にアニメーションをつけることを目的とする．
#理論
## 1. idle関数
これは何もしてないときに呼ばれる関数．暇になるたびに呼び出される．

```cpp:
    void glutIdleFunc(void (*func)(void));
```

## 2. 再描画関数
再描画をさせる関数．これが呼ばれるとglutDisplayFunc()で指定されている描画関数が実行される．

```cpp:
    void glutPostRedisplay(void)
```

## 3. 回転させる関数
描画したものを指定した軸方向にangle度回転する．

```cpp:
    void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
```

#方法

idle関数を作ってglutPostRedisplay()を入れる．こうすることで，暇なときに再描画するという処理が行われる．

```cpp:
void idle()
{
    glutPostRedisplay();
}

int main(int argc, char *argv[])
{
    // -省略-
    glutIdleFunc(idle);
    // -省略-
}
```
よって呼び出される関数glutDisplayFunc()の中身に回転するプログラムを書けばアニメーションが行われるということである

```cpp:
void Display()
{
    // (GLfloat angle, GLfloat x, GLfloat y, GLfloat z) 指定した軸方向にangle度回転する関数
    glRotatef(1, 1, 1, 0);
    // -省略-
}
```
#結果
今回，ディスプレイの表示モードをGLUT_RGBAからGLUT_DOUBLEに変更した．ダブルバッファリングというもので，表示のちらつきを抑えるためのものらしい．
詳しくは[9.2 ダブルバッファリング](https://tokoik.github.io/opengl/libglut.html#9.2)を参照．

なぜか私はダブルバッファリングをしなくても画面がチラつかず，表示モードを変えても特に実行結果は変わらなかったが，とりあえず，ダブルバッファリングを使用するプログラムに変更した．

![Dec-15-2019 11-19-11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499636/d30680cf-bbb8-d415-967a-1338c0763e60.gif)

<details><summary>main.cpp</summary><div>

```cpp:main.cpp
#include <OpenGL/OpenGL.h>
#include <GLUT/GLUT.h>
#include "polygon.hpp"
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

// この中に描画したいものを入れる
void Display()
{
    // (GLfloat angle, GLfloat x, GLfloat y, GLfloat z) 指定した軸方向にangle度回転する関数
    glRotatef(1, 1, 1, 0);
    // (GLbitfield mask)ウィンドウを塗りつぶす maskは塗りつぶすためのバッファを指定する
    glClear(GL_COLOR_BUFFER_BIT);
    
    // ▼図形を描くためのプログラム▼
    // (GLdouble r, GLdouble g, GLdouble b)これから描画するものの色を指定する
    glColor3d(1.0, 0.0, 0.0);
    // (GLnum mode)modeに図形タイプを入力 LINE_LOOPは折れ線を描く
    glBegin(GL_LINE_LOOP);
    // (GLdouble x, GLdouble y)二次元の座標値を設定する
    Polygon(5);
    // (void)Begin~Endまでに図形の各頂点の座標値を指定する
    glEnd();
    // ▲図形を描くためのプログラム▲
    
    // (void)まだ実行されていないOpenGLの命令を実行
    glutSwapBuffers();
}

// 初期化処理を行う関数
void init(void)
{
    // (GLclampf R, GLclampf G, GLclampf B, GLclampf A)glclearでウィンドウを塗りつぶす際の色の指定
    glClearColor(0.0, 0.0, 0.0, 1.0);
}

void idle()
{
    // 再描画の関数 glutDisplayFunc()が実行される．
    glutPostRedisplay();
}

int main(int argc, char *argv[])
{
    // (int *argcp, char **argv)GLUTとOpenGL環境の初期化
    glutInit(&argc, argv);
    // (unsigned int mode)ディスプレイの表示モードを設定 GLUT_RGBAを指定すると色の指定を三原色で行える
    glutInitDisplayMode(GLUT_DOUBLE);
    // (char *name)ウィンドウを開く関数
    glutCreateWindow("Title");
    // (void (*func)(void))ウィンドウが開かれたり再描画の際に実行
    glutDisplayFunc(Display);
    init();
    // (void (*func)(void))暇なときに呼ばれる関数．暇になるたび実行
    glutIdleFunc(idle);
    // (void)無限ループの関数，イベント待ち状態
    glutMainLoop();
    return 0;
}

```

</div></details>

ここまで制作して思ったのが，暇になるたびidle関数が呼び出され，Display関数内のrotate関数によって図形が1度ずつフレーム単位で回転していると思うのだが，再描画をしたら回転情報はリセットされないのだろうか．前の回転状態がなんで残っているのか不思議である．

#結論
- アニメーションができた！
- 描画図形の回転情報は再描画しても残り続ける．
Dockerにおけるbinding.pryの使い方

<h1>はじめに</h1>
今回はdockerでポートフォリオを作成中なのですがこれまで使用していた仮想環境とdockerでbinding.pryの使い方が違ったのでまとめておきます。

<h1>全体流れ</h1>
gemのインストール
↓
デバッグしたい箇所にpry
↓
コンテナを再起動
↓
railsコンテナにアタッチして接続
↓
デバッグ

<h1>gemのインストール</h1>
gemfileに記入してbundle installです。開発環境でしか使用しないのでdevelopmentに書いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512759/6f4f483d-1a65-7a3f-6e86-44ad60d0d21d.png)

<h1>デバッグしたい箇所にpry</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512759/061c5b26-5876-bdab-6a97-b9eace725d5b.png)
確認したいメソッド内でbinding.pryを記入します

<h1>コンテナを再起動、アタッチで接続</h1>
docker psで起動中のコンテナの確認、docker attach コンテナ名でコンテナに接続します。この状態で記入した画面でリロード、操作すると中断されてインスタンス変数の中身の確認等を行うことができます。

ctrキー→p→qの順番で抜けれます
Arduino Micro/MKR1000 SPI通信

Arduino Micro/MKR1000 でSPI 通信を行った時のメモです。特にピンアサインを見つけるまでに時間がかかってしまいました。

## Arduino MICRO

スイッチサイエンスのページ[Arduino Micro 5V 16MHz](https://www.switch-science.com/catalog/1120/)にあるピン配置を見ると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/740ec707-0cdf-26c4-2402-b6be4b2885e0.png)

と記載があります。SPI 通信に必要なピンは青で囲った４つのピン（SCK,MISO,MOSI,SS)なのです<b>が</b>、これらのピンの使い方は<b>わかりませんでした</b>。

Arduino IDE v1.8.8 を使っています。

## SPI 信号ピン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/6afa1493-8669-f93d-b33e-100fd7d0c2b1.png)

こちらのピンを使うと、それぞれの信号を出すことができます。SS はどこのGPIO を使ても良いのですが、とりあえず、D13 を使いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/ef65b3fa-9a09-cf70-0d12-4d9107ab0458.png)

## SPI プログラム

以下のようなプログラムでSPIで書き込むことができます。

``` spiexample.ino
#define SSPIN 13
// SS PIN の制御
void set_ss_pin(int val) {
// digitalWrite(13,val); // Digital Writeだと遅いので、ポートに直接書き込みました
   if(val ==HIGH) PORTC |= B10000000;
   else PORTC &= ~B10000000;
}

// SPI に１バイトのデータを書き込みます
void data_write(char addr,unsigned char data){
   set_ss_pin(LOW);
   SPI.transfer(addr);
   SPI.transfer(data);    
   set_ss_pin(HIGH);  
}

setup()
{
   pinMode(SSPIN,OUTPUT);
   set_ss_pin(HIGH);
   SPI.setBitOrder(MSBFIRST);
   SPI.setClockDivider(SPI_CLOCK_DIV8);
   SPI.setDataMode(SPI_MODE0);
   SPI.begin();
}
```

## MKR1000 SPI ピン

MKR1000 はピンの記載の通りで動作します。SS はGPIO6(PA20) を使いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/fd6fe2d0-f300-0080-b662-bb7ce8409188.png)

## MKR1000 SPI プログラム

``` spiexample.ino
writeSingle( unsigned char adrs, unsigned char data )
{
// digitalWrite(SSPin, HIGH);  // Digital Writeだと遅いので、ポートに直接書き込みました
   REG_PORT_OUTCLR0 = PORT_PA20;
   SPI.transfer(adrs);
   SPI.transfer(data);
   REG_PORT_OUTSET0 = PORT_PA20;
}
```
めちゃくちゃ簡単　Amazon Polly

AIとか音声解析とか聞くとなんか難しそうだけど、Amazonが提供しているサービスを使うと簡単に実装できるので、試してみた！

## Amazon Pollyとは
文章をリアルな音声に変換するサービス。テキスト読み上げができるアプリケーションを作成できるため、まったく新しいタイプの音声対応製品を構築できる。Polly は、高度な深層学習技術を使用したテキスト読み上げサービスで、人間の声のような音声を合成します。

ひと昔前はあきらか、機会が読んでる感じの音声だったけど、かなり人間に近い音声！！

## ひとまず実装してみる
環境を作成するのが手間なのでLambdaを使って実装。
プログラムはLambdaで提供があるPython 3.7。

入力された音声をPollyを使って音声に変換し、mp3ファイルをS3に保存する。
これだけでOK。

```Python
from boto3 import Session
from boto3  mport resource
from contextlib import closing
import os
import sys

def lambda_handler(event, context):
    session = Session(region_name="ap-northeast-1")
    polly = session.client("polly")
    
    s3 = resource('s3')
    bucket = s3.Bucket("XXXXXXXX")
    
    response = polly.synthesize_speech(
        Text=event['text'],
        #Engine="neural",
        OutputFormat="mp3",
        VoiceId="Mizuki")
    with closing(response["AudioStream"]) as stream:
        bucket.put_object(Key="test1.mp3", Body=stream.read())

```

簡単にプログラムの解説。

```Python
from boto3 import Session
from boto3  mport resource
```
AWSの各種サービスを簡単に仕様できるライブラリboto3を使って実装。
resourceはS3を使用しているので必要。
※ライブライはC++、Go、Java、JavaScript,.Net、Node.js、PHP、Rubyがある

```Python
    session = Session(region_name="ap-northeast-1")
    polly = session.client("polly")
```
サービスを使用するためには必ずSessionというAWSとの接続情報が必要。
リージョンはアジア東京を指定。
pollyを使用するためのオブジェクト取得。


```Python
    s3 = resource('s3')
    bucket = s3.Bucket("XXXXXXXX")
```
S3に保存する為、保存先のバケットを取得。
XXXXXXXXはバケット名を取得

```Python
polly.synthesize_speech
```

これがAmazonから提供されている「プレーメテキストまたはSSMLをバイトストリームに変換」する関数。
API仕様 [こちらから](https://docs.aws.amazon.com/polly/latest/dg/API_SynthesizeSpeech.html)

おもしろそうなところだと

- Engine : standardまたはneural
neuralはより人間に近い自然な感じで話す
※2019/12/20現時点では日本語未対応

- TextType : ssml または text
ssmlは発音、音量、ピッチ、話す速度など、音声のさまざまな要素をカスタマイズして制御できるようになる。

下の例だと
whispered：ささゆく声で
x-slow:ゆっくり
loud:呼吸音は多め

```xml

<speak>私には秘密があります。あなたにだけこっそり教えます。
<amazon:effect name="whispered">
<prosody rate="x-slow">
<prosody volume="loud">私は人間ではありません。</prosody>
</prosody>
</amazon:effect>
信じられますか?</speak>
```
サポートタグは [こちら](https://docs.aws.amazon.com/ja_jp/polly/latest/dg/supportedtags.html)


VoiceId:話す人の声を選択できる

## 料金
従量課金制。処理したテキストの文字数に応じて毎月請求。
100 万字あたり 4.00 USD。ニューラル音声の料金は、100 万字あたり 16.00 USD。

料金例は　[こちらから](https://aws.amazon.com/jp/polly/pricing/)


## 捕捉
ACCESS_KEY、SECRET_KEYを指定せずに正常にsessionが取得できているのはLambdaを使っているからですね。
ポリシーを作成し、Lambda実行するロールに割り当ている。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "polly:SynthesizeSpeech",
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": "*"
        }
    ]
}
```

polly:SynthesizeSpeechの使用とs3への保存を許可。

これがないと下記のエラーが出る。

```
"errorMessage": "An error occurred (AccessDeniedException) when calling the SynthesizeSpeech operation: User: arn:aws:sts::XXXXXXXX:assumed-role/[role名] is not authorized to perform: polly:SynthesizeSpeech"
```
VisualStudioCodeを使い始めて変わったこと

#VisualStudioCodeを使い始めて変わったことを書いていきたいと思います。
##実は今回書いたのはVisualStudioCodeが出たての頃からのヘビーユーザです。
戸倉さん（@ayatokura）ごめんなさい。
自分はVisualStudioCodeが出たときからのヘビーユーザです。
なぜかと言うとEclipseが◯んこだったから。
1ヶ月に一回再インストールに飽き飽きしていた頃に出てきたのがAtomとVisualStudioCodeでした。
Atomはプラグインが少なかったのと重くて使いようになりませんでした。
そこで選んだのがVisualStudioCodeでした。
<strong>一番の特徴はTerminalが入っていてコマンドスクリプトも使えるんですよ。</strong>
実はLinux（Ubuntu・CentOS・RHESなどで使用可能）やMac・Windowsでも喜んでVisualStudioCodeを使っちゃうユーザでした。

依然ある職場でLinuxVimerにかなり妬まれました。
Vimが嫌になっておりしこたま困りました。
それはVisualStudioCodeという秘密兵器を知っていたからなんです。
目の前でUbuntu版のVisualStudioCode使ってガリガリやってやろうかと思ったことが思ったことがありました。
ですがさすがにやりませんでした。
それはDensoとBoschのJVのADITにいたからです。
大手に社の前でやってしまうと地雷を踏むことになります。
しかも職場はDenso刈谷本社が当時の職場だったので流石にまずかったので行動しませんでした。

今は別の職場でWebの基盤設計と開発をやっております。
今の職場はVisualStudioCodeなので嬉しくてたまりません。
<strong>だって楽ちんなんだもん。</strong>
もちろんハッカソンでもバリバリ使ってますよ。
個人で開発するときはもちろんVisualStudioCodeです。
ですがこの使いやすさを知っちゃうと離れられません。

##どうしてVisualStuioCodeを使い倒すのか。
それは各プログラム言語・クラウド・Git・Subversionなど網羅してくれています。
Github・Bitbucket・AWS・Azureなどの基盤製品につなぐのが簡単です。
残念ながらちょっとSubversionはいけてません（戸倉さんごめんなさい）。
実は職場でSubversion使っていますので困っています。いいプラグインあれば教えて下さい。
Gitはバンバン使っています。
各言語・スクリプト言語のIntelliSense非常に素晴らしいです。
コーディングスピードが約二倍上がりました。
最近はJavaってEclipseやIntelliJじゃないのと言っている人いると思いますが。
<strong>コマンドラインが使えるのでVisualStudioCodeかけちゃいます。
実際自分もVisualStudioCodeで書いてること多いです。
パスさえ通してしまえばビルドまで出来ちゃいます。</strong>
C#書いてる人もVisualStudioじゃないとC＃かけないんじゃないっと思っている人いると思います。
<strong>実はWindowsFormやUnityなどの画面付きじゃない場合はVisualStudioCodeで全て事が足ります。</strong>
C・C++はVimやEclipse・VisualStudioと思っている人いませんか？
<strong>画面系がなければすべてVisualStudioCodeで事が足りてしまいます。
実はLinuxのbashやzshのスクリプトも書けちゃいます。</strong>
これ覚えておくとLinuxユーザはかなり助かると思います。
あと色んなスクリプトのプラグインがあるので入れておくと便利です。

##不都合ことも少しはあるかも
WindowsアプリやUnityやJavaの画面アプリを作っている人はかなり困るかも。
それはヘビーユーザなら誰もが知ってますがVisualStudioCodeにはHTMLの画面デバック機能は存在しますが。
WindowsアプリやJavaアプリの場合は作りが特殊です。
VisualStudioCodeで対応できないことがあります。
WindowsアプリやUnityの場合はVisualStudioを使ってください。
商用で使わない限りはこちらも無償のVisualStudioComminityEditionがあるのでそちらをお使いください。
Javaアプリの場合はこれは画像の裏のコードが特殊で複雑なことが多いので今の自分ならIntelliJのComminityをおすすめします。
AndroidStudioという手もありますがAndroidに特化しているのであまりおすすめしません。
実はIntelliJでAndroidプラグインを組み込めばAndroidの開発ができることがわかっています。

皆さん気をつけてもらいたいことがあります。
<strong>プラグインいっぱいあるから全部入れちゃえ。</strong>
これやっちゃだめです。
VisualStudioCodeはElectronでできてますのでプラグインを入れすぎると重くなります。
必要に迫られたときなどに入れる程度に留めておきましょう。

##不都合なことがない場合はなるべく軽い開発環境がいいです。
正直言うと重い開発環境を使っていると非常に時間がもったいないことがじつは多いんです。
軽い環境だとやる気がどんどん出てきます。
大学でもViualStudioCode広めてください。
HTML・Python・PHP・C++（C)・JavaScvript・NodeJS・HTML5実はSwiftもKotlinも色んなプログラム言語がガリガリかけます。
おまけにGithubやBitbucketも簡単につなげるのでいいと思います。

<strong>VisualStudioCodeでEnjoyHackingしましょう。</strong>
gossでのテスト実行と結果の見方

この記事はgoss advent calender 2019 参加記事です。

前回記事からの継続になります。

作成したテスト項目を実行(検証)は以下の実行します。

```
goss validate
```

もしくは以下のように省略系で実行します。

```
goss v
```

テスト項目作成で使用したadd等も省略形はありますが、validateほど使わないので
ここでの紹介になります。


テスト実行結果の見方
-------------------------
これで実行すると以下のような結果になります。

全て成功の場合
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539237/b30f450d-b8c6-3ca1-93b1-d440c59054ac.png)

失敗を含む場合
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539237/3a1612c7-9136-5ac7-ec68-19cb868f8737.png)


ドット(緑色)で表記されているものはテストは成功しYAMLに書いた期待結果に沿った内容だったもので
F(赤色)で表記されているものはテストに失敗し、期待通りの結果と異なる内容だったものです。

S(黄色)で表記されているものはSkipで、特定のテストが失敗しているのでテストされずにスキップされた場合に表記されます。

画像の例の場合、tcp6 80ポートのListen状態が失敗しているため、ListenポートのバインドIPのテストをスキップしています。


またFとなったテスト失敗については、詳細が表示され、テストで書いた項目と実際の取得値が並べて表示されます。

そして最後に、テスト実行にかかった時間とテスト項目数、テスト失敗数、スキップ数が表示されます。


他の結果表示を使用する
-------------------
validateサブコマンドではオプションに `--output` または `-o` で表示形式を変更できます。

個人的によく使うのは documentation と tapで正常系も含めた詳細表示と
slientで表示しない形式です。

documentationは目視で正常系も見たい場合に
tapは正常系も含めてテスト内容と結果をExcelへ出力する際に使っています。
tap形式でも直接は表形式にならないので、CSV化できるように多少加工を加えますが。

slientは名前の通り結果表示を抑える場合に使用します。

また個人的には使ったことありませんが、jsonまたはjson_oneline形式は他のアプリに結果を取り込む場合に便利だと思います。
DBに直接の場合はElasticSearchやMongoDB等スキーマレスに限られますが取り込めると思います。
（やったことある方がいらっしゃいましたらコメントを是非ください）

また他にもjunit形式やnagios形式の出力があるので、それらの形式を入力として使えるツールであれば連携可能だと思います。(junitやnagiosは詳しくないので詳細割愛です)
v-onceで一度だけ描画。その後は変えたくない！ ❏Vue.js❏

#`v-once`とは
最初に描画したものだけを永遠に表示します。
その後に代入して値を変えることはできません。

#使い方

タグの中に`v-once`を書く。

開発環境はJSFiddleです。
https://qiita.com/ITmanbow/items/9ae48d37aa5b847f1b3b

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <p v-once>{{ message }}</p>
  <p>{{ sayHi() }}</p>
</div>
```

```javascript:javascript
new Vue({
  el: "#app",
  data: {
    message: "hello world!"
  },
  methods: {
    sayHi: function() {
      this.message = "hello Vue.js!"
      return this.message;
    }
  }
})
```

【出力結果】
`hello world!`
`hello Vue.js!`

#解説
`sayHi`メソッドで`this.message = "hello Vue.js!"`と値を書き換えていまス。
しかし、`v-once`を書いた1つ目のpタグの表示は`hello world!`のままで変わりません。

2つ目のｐタグは書き換えられた`message`が返り`hello Vue.js!`と表示されます。

<br>
いつか使うときを信じて、ここにお納めします。。

<br>
ではまた！
1分23秒でできるJuliaで大石泉すき標準出力

この記事は[「大石泉すき」Advent Calender 2019](https://qiita.com/advent-calendar/2019/ohishi-izumi-suki)の15日目の記事となります。

# 要約
- Windows環境でJuliaインストールしてREPLで標準出力
- hello, worldまで1分23秒でたどり着ける
- **大石泉すき**

やっていることとしてはWindows環境でJuliaインストールしてREPLで標準出力した、というただそれだけなので、
回れ右する人はこの時点で回れ右してもらえればと思います。
ただ**「大石泉」という名前のアイドルでプログラミングが趣味のキャラクターがこの世に存在する**ことだけ認識していただければ悔いはありません（？）

# 環境
- Windows 10 (ver 1809)
- Julia 1.3.0 (今回インストール)

# インストール (00:00.00 - 00:41.96)
おもむろに検索エンジンで「julialang」と入力し、検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146585/76e64613-a629-c543-e2c9-eb4bdcf099f4.png)
現状最新安定板はv1.3のようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146585/ff69fe40-91ff-3720-b379-c06130dcde7a.png)
Windows版のバイナリを落としましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146585/9f44b7af-c787-54f8-eede-cc82bc2c1323.png)
落としたバイナリを実行、必要ファイルの展開が行われた後、インストーラのウィザードが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146585/96cde025-ec33-c6de-f623-98d2ba70b157.png)
インストール先を指定し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146585/5d7aca3e-0c3b-65bd-e79f-122c3af800f8.png)
インストール完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146585/fdcd627d-7e1a-2c07-42a3-c59ff116b129.png)

# 大石泉すき (00:41.96 - 01:23.00)
インストール後、フォルダが開くのでjuliaのショートカットを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146585/44bb2181-5fdb-dcec-76ef-b2d1228cac70.png)
juliaのREPLが立ち上がるので、println("大石泉すき")と入力し、Enter。
割と時間は余る(回線速度とマシンスペックにもよるとは思いますが)ので落ち着いてタイピングしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146585/f7e63eb9-b773-fa3b-3220-f3426ceeacc6.png)
おめでとうございます。これであなたは大石泉すきプログラマーとしての第一歩を踏み出すことができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146585/e1f37053-d6d9-67cd-1eca-6b5e2a4ebf03.png)

# さいごに
- なぜ1分23秒？
    - 0014 **1** **23** (おおいしいずみ)
- なぜJulia？
    - 大石泉と同じシリーズの別タイトルに「ジュリア」というキャラクターが存在するので
jQuery validation

#はじめに
クライアント側のエラーチェックですが、
jquery validationはよく使っているようです。
私も久しぶり再度使ってみました。

ラジオボタンとチェックボックスだけ効かない問題がありました。
書き方はドキュメントにあるサンプルと同じ感じでコーディングでした。

調べたら、hidden項目、display:noneの項目はバリデーションをチェックされないことでした。
なるほど、ラジオボタンとチェックボックスのスタイルの関係で非表示に、カスタマイズしたスタイルでラジオボタン、チェックボックスを表示していました。

#jquery validation plugin
https://jqueryvalidation.org/

歴史が長く、成熟度は高いので使いやすいと思います。

##標準メソッド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/c2262605-0347-2e85-93a1-4ee61bf5c16c.png)

出典：https://jqueryvalidation.org/documentation/

##カスタマイズメソッド
jQuery.validator.addMethod( name, method [, message ] )
addMethodで自分なりのロジックチェックはできます。

##hidden,display:noneの項目チェックされない仕様のメリット
hidden,display:noneがチェックしないことで、項目増減がある画面ではとても便利です。
項目消したら、バリデーションの設定を修正する必要がありません。

##hidden,display:noneの項目チェックされない仕様の後遺症
上記記載通り、ラジオボタン、チェックボックスなど、display:noneにした場合でもバリデーションをチェックしたい場合があります。

解決方法としては、「display:none」をやめて、「visibility: hidden」に変更。ただし、余分なスペースは調整する必要があります。

#Plugin methods
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/133ed41a-3434-c83b-c214-d951c5cb81f8.png)

出典：https://jqueryvalidation.org/documentation/

##validate
フォーム単位でルール、メッセージ設定など

##rules: 動的追加された項目のrule追加
下記のようにルール追加可能です。

```js
$("input[name='userName']").rules("add", {
     required: true,
     maxlength: 40
});
```

テキストエリアの動的追加する際に、必須効かない場合があります。
その時は、textarea要素にrequired属性を記載するとうまく動作されます。

ルール削除：

```js
// 部分削除
$( "#age" ).rules( "remove", "min max" );

// 全部削除
$( "#age" ).rules( "remove");

```

##valid
設定したルールによってバリデーションのチェック結果。
・true:　エラーなし
・false:　エラーあり


以上
paizaでアセンブラ その10

#概要

paizaでアセンブラ、やってみた。
練習問題やってみた。

#練習問題

fizzbuzzやって。

#サンプルコード


```
.code32
.text
.global main

main:
    mov     $1, %esi
loop:
    mov     %esi, %eax
    mov     $15, %ebx
    div     %bl
    cmp     $0, %ah
    jz      loop15
    mov     %esi, %eax
    mov     $5, %ebx
    div     %bl
    cmp     $0, %ah
    jz      loop5
    mov     %esi, %eax
    mov     $3, %ebx
    div     %bl
    cmp     $0, %ah
    jz      loop3
	mov 	$fmt, %edi
loop2:	
	mov 	$0, %eax
    push    %esi
	call 	printf
    pop     %esi
loop1:
	add     $1, %esi
	cmp     $101, %esi
    jnz     loop
	ret

loop15:
    mov 	$fizzbuzz, %edi
    jmp     loop2
loop5:
    mov 	$buzz, %edi
    jmp     loop2
loop3:
    mov 	$fizz, %edi
    jmp     loop2
	
.data
fmt:
	.asciz 	"%d "
num:
	.asciz 	"%i "
fizz:
	.asciz 	"Fizz "
buzz:
	.asciz 	"Buzz "
fizzbuzz:
	.asciz 	"FizzBuzz "	
	


```

#成果物

https://paiza.io/projects/oh7SfbfJVs_-QCJzId0DiQ

以上。