OmniAICreator/Qiita-1.07M huggingface dataset:
Excelの同一ファイルをFTPを使って複数人で共同編集する方法と排他制御

#概要
Excelファイルを複数人で編集したいことは多々あります。
その中で、FTPを使った方法はとても簡単で、応用も聞くので備忘録として残しておこうと思います。
特に、DOS窓を使った操作は、VBAと違い、バージョン等に依存せずWindowsなら安定した動作が見込めるので、管理しやすいです。

#大まかな流れ

1. DOSのFTPコマンドでリモートからファイルをダウンロード
2. リモートのファイル名をリネーム ( sample.xlsm → editing )
3. 編集
4. リモートのファイル名をリネーム ( editing → sample.xlsm )
5. DOSのFTPコマンドでリモートにファイルをアップロード

#ファイル

####ダウンロード用
```download.bat
@echo off

rem ***************************
rem download.ftpを開く
rem ***************************
ftp -s:C:\**\ftp\download.ftp

rem ***************************
rem ダウンロードしたsample.xlsmを開く
rem ***************************
cd C:\**\excel\sample.xlsm

exit
```

```download.ftp
open **example.com**
**username**
**password**

rem ***************************
rem sample.xlsmをダウンロードする場所
rem ***************************
lcd C:\**\excel

rem ***************************
rem sample.xlsmがある場所
rem ***************************
cd www

rem ***************************
rem バイナリを指定しないと、excelファイルが破損します。
rem ***************************
bin

get sample.xlsm

rem ***************************
rem リモートのsample.xlsmをeditingにリネーム
rem ***************************
rename sample.xlsm editing

quit
```
####アップロード用
```sample.xlsm
'Excelファイルを閉じたときに自動実行される
Sub Auto_Close()
  Call FTPアップロード
End Sub

Sub FTPアップロード()
    Application.StatusBar = "処理中: FTPアップロード"
    
    `DOS窓でコマンドを実行する
    Dim WSH, wExec, sCmd As String
    Set WSH = CreateObject("WScript.Shell")
    
    'upload.ftpのパス
    sCmd = "ftp -s:C:\**\ftp\upload.ftp"
    Set wExec = WSH.Exec("%ComSpec% /c " & sCmd)
    
    Do While wExec.Status = 0
        DoEvents
    Loop
    
    Set wExec = Nothing
    Set WSH = Nothing
    
    Application.StatusBar = False
End Sub
```

```upload.ftp
open **example.com**
**username**
**password**

rem ***************************
rem sample.xlsmをダウンロードした場所
rem ***************************
lcd C:\**\excel

rem ***************************
rem sample.xlsmをアップロードする場所
rem ***************************
cd www

rem ***************************
rem リモートのeditingをsample.xlsmにリネーム
rem ***************************
rename editing sample.xlsm

bin

put sample.xlsm
quit
```

##補足
DOSコマンド自体はbatファイルとVBAだけで使えますが、DOSのFTPコマンドは別途FTPファイルを必要とするので、download.ftpとupload.ftpを用意しています。

リモートのファイル名を変えることで、編集中に他の人がファイルをダウンロードするのを防いでいますが、ローカルに前回ダウンロードしたファイルが残っている場合は、前回のファイルを開いてしまう可能性があるので注意が必要です。
ローカルのファイルを削除してもいいのですが、リスクが伴うので実装はしていません。

訂正、アドバイス等、コメントいただけるとうれしいです。
Elixir~お題に対して式をつくってみたぞ2回目~

#お題

きのうまで[公式ドキュメント](https://hexdocs.pm/elixir/Enum.html) のEnumをひたすら解釈 or わからないでさらいまくるという課題をやっていたのですが、先生からこんなお題が出ました。

"1. 整数1つと，整数のリストが与えられたとします。仮に 13 と，[2, 3, 5] だったとしましょう。
2. 最初の整数を2番目のリストの要素1つずつで割ったあまりが0になるかどうかを判定した時に，全ての要素で0にならなかった，すなわち割り切れなかったとします。もしそうならば，最初の整数は，リストで与えられた数どれでも割り切れないということになります。

このような判定を行うプログラムを書いてください。"

#式

```elixir
iex>[2, 3, 5] |> Enum.any?(& rem(13, &1)==0)
false
```

これはEnum総ざらいの過去分が役に立ちました。
まず、2,3,5の第一引数のリストを左辺に持ってきてパイプライン演算子を噛ませたのちひとつでも条件に符号するものがあればtrueを返すEnum.any?を持ってきます。
これで13を2,3,5それぞれで割り、当然あまりがゼロになるものはないので、false。
&記法で&1がremで整数の後に来るパターンがはじめてで、若干戸惑いました。

やはり与えられた式ではなく課題に対して短いですが自分で式を考えられてハマると充実感が出ます！
うまずたゆまず、頑張ります。
Kento Mizuno
Firefoxアドオンで、素晴らしき日々を

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<@kento_o>です。
今回は、おすすめのFirefoxブラウザのアドオンをご紹介していきます。

#Mozilla Firefoxアドオン　
FirefoxやChromeには、拡張機能によりブラウザの機能を強化することが可能です。
この記事では、僕が日常的に使用しているアドオンをご紹介します。

-[Adbrocks plus]()
ブラウザの広告をブロックしてくれるアドオンの強化版。
凄まじい勢いで広告をブロックしてくれます。
Youtubeの広告すらブロックするので、どのようなプログラムを組んでいるのやら......。
この記事を書いている時点での累積広告ブロック数は30,254でした。

-[Better Tweetdeck](https://addons.mozilla.org/ja/firefox/addon/better-tweetdeck-17/)
[Tweetdeck](https://tweetdeck.twitter.com/)に搭載されていない絵文字機能や、サムネイルの表示・非表示などのカスタマイズが可能になるアドオンです。
Tweetdeck自体も、Twitterをよく利用する人であればおすすめのサービスです。

-[Enhancer for Youtube](https://addons.mozilla.org/ja/firefox/addon/enhancer-for-youtube/)
Youtubeの見た目や機能を拡張するアドオンです。
最高画質での再生や、右クリックすると出てくるメニューで様々な設定が可能です。

-[Evernote Web Clipper](https://addons.mozilla.org/ja/firefox/addon/evernote-web-clipper/)
1クリックでEvernoteにWebページや記事を保存できるアドオンです。
ブックマークやPocketと併用することで、さらなる情報収集の効率化につながります。


-[Stylish - Custom themes for any website](https://addons.mozilla.org/ja/firefox/addon/stylish/?src=userprofile)
Webサイトをリスタイル可能なアドオンです。

-[Turbo-download-manager](https://addons.mozilla.org/ja/firefox/addon/turbo-download-manager/?src=featured)
通常のダウンロードより高速かつ、多くのファイルをダウンロードできる拡張機能です。
マルチスレッドによって、数GB単位のファイルも高速で転送可能にします。

-[Google Translator for Firefox](https://addons.mozilla.org/ja/firefox/addon/google-translator-for-firefox/?src=userprofile#id=46308)
Google翻訳を利用するアドオンです。
ページ全体の翻訳の他、選択範囲のみの翻訳も可能など、とても便利なアドオンです。

-[Similar Web](https://addons.mozilla.org/ja/firefox/addon/similarweb-sites-recommendatio/)
アナリスト業務の補助に使用します。
Googleアナリティクスやキーワード選定ツールと併用することで、多角的な分析が可能です。

#まとめ
タイトルのネーミングの理由は、僕がケロQより発売されたノベルゲーム「[素晴らしき日々~不連続存在~](https://www.keroq.co.jp/suba_fhd/)」を一通りプレイした故です。
完全に個人的事情かつ、このような場所で書くべきでないとは分かっているのですが、いかんせん僕はオタクです。
クリア記念に英語の勉強がてら、戯曲や哲学書を原文で読んでみる、という無茶を行います。
それでは、また次の記事で会いましょう。
THETA をおしゃべりにする

## はじめに

こんにちは、リコーの @shrhdk_ です。

ゆっくりボイスで有名な音声合成エンジン [Aquestalk](https://www.a-quest.com/products) を使って、RICOH THETA V をおしゃべりにするプラグインを作ったのでご紹介します。

![プラグイン概要](https://qiita-image-store.s3.amazonaws.com/0/299819/cbe356e2-dbce-b944-1403-cd633b2431b0.png)

## RICOH THETA プラグインパートナープログラムについて

THETA プラグインをご存じない方は [こちら](https://api.ricoh/products/theta-plugin/) をご覧ください。
興味を持たれた方は [Twitter](https://twitter.com/thetaplugin) のフォローと [THETAプラグイン開発コミュニティ (Slack)](https://join.slack.com/t/thetadeveloper/shared_invite/enQtNzcxODI2MTk2ODg0LWY5YmU2ZTIxNGYwNzlmNWZjMWMyMWFlMzY3ZmQ3NGU3ZjZiZjI0Njk4MGIxMDU5NDJiMzQ4Y2FkNDEzYmFlNGU) への参加もよろしくお願いします｡

## プラグインの機能

写真の明るさ(露出補正値)のプラスマイナス操作と、明るさを音声で確認する機能、その設定で撮影する機能を搭載しました。

つまり、スマホに接続しなくても、写真の明るさを設定して撮影ができるようになります！！

| 操作                      | 機能                              |
| ------------------------- | --------------------------------- |
| シャッターボタン          | 静止画撮影                        |
| シャッターボタン (長押し) | 現在の露出補正値をしゃべる        |
| 無線ボタン                | 露出補正をプラスして、しゃべる    |
| モードボタン              | 露出補正をマイナス して、しゃべる |
| モードボタン (長押し)     | プラグイン起動・終了              |

プラグインを使っている様子を動画にしました。AquesTalk の評価版を利用しているため、「ナ行、マ行」の音韻がすべて「ヌ」になっています。そのため「0.7」は「レイテンヌヌ」と読まれます。

↓ 動かしている様子の動画です (YouTube)
[![THETAをおしゃべりにする \- YouTube](https://img.youtube.com/vi/FxopMzcFZio/mqdefault.jpg)](https://www.youtube.com/watch?v=FxopMzcFZio)

## プラグインの構成と処理

音声合成には株式会社アクエスト様の Aquestalk を利用しています。 Aquestalk は Android 版が用意されていて、とても簡単に使えました。今回は評価版を利用しました。

プラグインのソースコードは [GitHub](https://github.com/theta-skunkworks/theta-plugin-tts-sample) で公開しています。

AquesTalk のエンジンは複数ありますが、 AquesTalk10 を利用しています。また、漢字から音声用テキストに変換する AqKanji2Koe というライブラリも利用しています。AqKanji2Koe にはライブラリに付属している辞書ファイルが必要となります。辞書ファイルをプロジェクトの assets ディレクトリに入れることで APKファイル に同梱します。

明るさ(露出補正値)の設定と撮影は [RICOH THETA API v2.1](https://developers.theta360.com/ja/docs/v2.1/api_reference/) を使います。

![ブロック図](https://qiita-image-store.s3.amazonaws.com/0/299819/1a7a2ab2-bb56-8f7b-5e94-ea96a69253ea.png)

露出補正値をプラスするシーケンスは次のようになります。

![露出補正値をプラスするシーケンス](https://qiita-image-store.s3.amazonaws.com/0/299819/dde4d08f-51a8-6aaa-1e41-724a50ccdb36.png)

THETA の本体スピーカーで音声を再生する方法についてでは以下の記事が詳しいです。

[THETAプラグインでマイクを使って録音する \- Qiita](https://qiita.com/kushimoto/items/e2ee2b1abd05dc50ffcf)

## プラグインのビルド

プラグインのソースコードは [GitHub](https://github.com/theta-skunkworks/theta-plugin-tts-sample) で公開しています。

AquesTalk のライブラリは株式会社アクエスト様の [ダウンロードページ](https://www.a-quest.com/download.html) からダウンロードして、プロジェクトにコピーしてください。

## まとめ

THETA は表示装置が LED だけで、複雑な状態を表現できませんでしたが、音声合成を導入することで様々な表現ができるようになりました。
AquesTalk は簡単に導入できますので、試してみてはいかがでしょうか。

今回は評価版を利用しましたが、AquesTalk を用いて実際に開発・利用・頒布をする場合は、ライセンス契約が必要になるようです。
詳しくは株式会社アクエスト様の [ライセンス](https://www.a-quest.com/licence.html) のページを御覧ください。
Windowsでdjango-admin makemessagesを実行してpoファイルを生成する

### 1. 目的

DjangoのInternationalization対応のためにMessageファイル（.po）を生成する。Windowsでの手順を記載する。

### 2. 環境

* Windows 10
* Python 3.6.5
* Visual Studio 2017 + PTVS
* Django 2.1

### 3. 手順

#### 準備1 翻訳文字列のマーク

Django公式サイトの翻訳についてのドキュメントなどに従い、テンプレート中の翻訳対象の文字列を翻訳文字列に書き換える

```html
<span>ほげほげ.</span>
```

↓

```html
<span>{% trans "Hoge hoge."%}</span>
```

https://docs.djangoproject.com/ja/2.1/topics/i18n/translation/#internationalization-in-template-code

#### 準備2 翻訳フォルダの作成

manage.pyと同じフォルダに、「locale」フォルダを作成する

#### 3-1. xgettext.exeのダウンロード

以下からxgettextのライブラリ同梱版のzipをダウンロードする。

https://mlocati.github.io/articles/gettext-iconv-windows.html

#### 3-2. xgettext.exeの保存

解凍し、manage.pyと同じフォルダに「xgettext.exe」を保存する

#### 3-3. コマンドプロンプト起動 & 環境アクティベーション

コマンドプロンプトを開き、Djangoプロジェクトのルートフォルダ(manage.pyと同じフォルダ)に移動する。Djangoで利用している仮想環境をアクティベーションしておく。

#### 3-4. makemessages実行

以下のコマンドでMessageファイルを生成する

```cmd
django-admin makemessages -l ja -e html
```

\* -e オプションは、任意の拡張子に変えてください。

#### 3-5. 結果

localeフォルダ内に、-lオプションに応じた.poファイルが生成される

### 4. おわりに

生成された.poファイルは翻訳文字列を記載して.moファイルに変換する必要があります。そのあたりは[Djangoの公式ドキュメント](https://docs.djangoproject.com/en/2.1/topics/i18n/translation/)を参照してください。

xgettext.exeのフォルダにパスを通せたらかっこいいんですが、パスが通ってもなぜか上手くxgettext.exeが実行できなかったので苦肉の策です。

.poファイルを生成した後は[Django Rosetta](https://django-rosetta.readthedocs.io/en/latest/index.html)などで管理すると良いでしょう。
eclipseで特定のファイルがエディタで開けない

## 事象
設定ファイル（diconファイル）を開こうとすると、eclipse内でなくサクラエディタが立ち上がりそっちで開かれてしまう。

## 解決

### ファイルの関連付けをする
ファイルの関連付け（File Associations）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243523/1199ccf4-6bcb-094e-8024-f821ef23c654.png)


### メモ
コンテンツタイプに開きたいファイルの拡張子を追加（ここでは「*.dicon」）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/243523/409ad178-2965-2b86-278c-a209d056c95c.png)
MDD(model driven design)


<この項は書きかけです。順次追記します。>

# MATLAB連成

ACサーボ系のMATLAB/Simulinkと有限要素法による連成解析 石川 赴夫, David Mori, 橋本 誠司, 松波 道夫, 群馬大学, 電学論D, 124巻12号 2004年, pp.1283-1284
https://www.jstage.jst.go.jp/article/ieejias/124/12/124_12_1283/_pdf


EMSolution 電磁場解析ソフトウェア > MATLAB/Simulinkとの連成解析
https://www.ssil.co.jp/product/EMSolution/ja/technical/case/matlab_simulink_coupling/


ANSYS-MATLAB連成セミナー
～構造と制御の連成によるスマート構造システムへの展開～
http://www.cybernet.co.jp/ansys/seminar_event/special/ansys_matlab_1.html

ITI System Simulation
Windowsベース、非線形、ダイナミックシミュレーションソフト
https://jp.mathworks.com/products/connections/product_detail/iti-system-simulation.html
>ITI の製品は連成解析（ITI-SIM、SimulationX）、Simulink への C コード出力（ITI-SIM）、MATLAB から（SimulationX）の3つの方法で MATLAB/Simulink とのインタフェースを用意しています。

# COMSOL 連成
https://kesco.co.jp/service/comsol/thesises/
MATLAB EXPO 2008
MATLAB/COMSOLを用いた帯電プロセスの解析 
ブラザー工業株式会社　プリンティング研究部 研究第3グループ　枦山 智昭


COMSOL Multiphysicsによる事例紹介セミナー　2011/05/25
電磁場と伝熱の連成解析とがん治療用カーボンナノチューブへの応用 
計測エンジニアリングシステム株式会社　第一技術部　Sanal Sukuvihar　他

みずほ情報総研技報 Vol.3 No.1
COMSOL Multiphysicsによる連成解析 
みずほ情報総研株式会社　サイエンスソリューション部　シニアコンサルタント/理学博士　稲垣 祐一郎 　他

# 　関連
https://kesco.co.jp/service/comsol/thesises/
第45回日本生体医工学会 東北支部大会講演論文集，ME-o3-1 (2011) 20
物質輸送と抗原抗体反応の連成解析によるイムノセンサの基礎設計 
岩手大学　大学院　工学研究科　バイオ・ロボティクス部門　山口研究室　木村 勇太  他


第38回西日本岩盤シンポジウム，pp.57-60，九州大学伊都キャンパス，2017-9．
Dual porosity理論を用いた熱・水・応力・化学連成解析モデルの開発と不連続性岩盤への適用
愛媛大学 大学院理工学研究科工学部　緒方奨 、安原英明 、　岸田潔（京都大学） 


# TOPPERS
第4回TOPPERS活用アイデア・アプリケーション開発コンテスト アプリケーション開発部門 金賞
Toppers_ASPカーネルとScilab による組込みメカトロニクス制御シミュレーション, 塩出武 
コンテスト応募資料  https://www.toppers.jp/docs/contest/2014/shiode.pdf
ソースコード https://www.toppers.jp/docs/contest/2014/src_shiode.zip

第3回TOPPERS活用アイデア・アプリケーション開発コンテスト　銀賞
 Toppers_JSPとScicos_lab（Scilabでも可）による組込みメカトロニクス制御シミュレーション,塩出 武
 コンテスト応募資料 https://www.toppers.jp/docs/contest/2013/shiode.pdf
ソースコード https://www.toppers.jp/docs/contest/2013/shiode_src.lzh
ET2013発表資料 https://www.toppers.jp/docs/contest/2013/shiode_presen_2013.pdf
 手順書 https://www.toppers.jp/docs/contest/2013/shiode_procedure.txt


 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞


# 文書履歴(document history)
ver. 0.01 初稿 20190218
ver. 0.04 URL追記　20230305

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Visual Analogue Scale（VAS）という入力



アンケートなどで、10段階評価などあるが、
医療の現場では、痛みの評価としてVisual Analogue Scale（VAS）という入力方法がある。

ものさし上の値で、アナログ評価するという点が面白い。

google formの入力パーツにこれがあればいいのにな。

https://www.jspm.ne.jp/guidelines/pain/2010/chapter02/02_02_02.php
stylelintを動かしてgit commitで自動で検証するまで

エディタなどにあるcssの検証ツールでESLintなどのnpmでないかなと思っていたらstylelintツールがいい感じだったのでメモ。

## 参照

- [stylelintの使い方 動かして体験してみるまで](https://isoppp.com/note/2018-05-21/how-to-use-stylelint/)

## インストール

nodeをインストール自分の場合は```v10.15.0```

```bash
# パッケージをインストール
npm i -D stylelint
```

これでstylelintでcssで検証できるがscssや公式のおすすめの設定をインストール

```bash
npm i -D stylelint-config-recommended stylelint-scss stylelint-config-recommended-scss
```

## 設定ファイル作成

### package.json

```json
{
  "scripts": {
       "lint:scss": "stylelint \**/*.scss\"",
  }
}
```

### stylelintの設定ファイルを作成

.stylelintrcファイルを作成。形式はjs、json、yamlでできる。自分はeslintと合わせるたたま.stylelintrc.jsonただコメントをいれるとjsファイルがいいかもと思ってみたり

ルールは公式を参照（すごく多い）

[Rules](https://stylelint.io/user-guide/rules/)

- "color-hex-case": "lower"はcolorは小文字
- "color-hex-length": "short"はcolorは16進色には短い表記

```json
{
  "extends": [
    "stylelint-config-recommended",
    "stylelint-config-recommended-scss"
  ],
  "rules": {
    "color-hex-case": "lower", 
    "color-hex-length": "short"
  }
}
```

## 動かしてみる

テスト用にエラーのscssファイルを作成

```scss
.sample {
  background-color: #aaa;
  color: #FFFFFF;
}

.sample {
  background-color: #aaa;
  color: #FFFFFF;
  opacity: 0.5;
}
```

```bash
npm run lint:scss

# 出力結果
 3:10  ×  Expected "#FFFFFF" to be "#ffffff"             color-hex-case

 3:10  ×  Expected "#FFFFFF" to be "#FFF"                color-hex-length

 6:1   ×  Unexpected duplicate selector ".sample",       no-duplicate-selecto
rs
          first used at line 1

 8:10  ×  Expected "#FFFFFF" to be "#ffffff"             color-hex-case

 8:10  ×  Expected "#FFFFFF" to be "#FFF"                color-hex-length
```
Javaのバージョンを上げたら実行できなくなった

プロジェクトを右クリック→「プロパティ」

※　7→8にあげた
![image.png](https://qiita-image-store.s3.amazonaws.com/0/243523/97807e44-6e01-4ab2-adf9-28940901391d.png)

---

それだけではエラーになるので、

ライブラリを8のものに設定し直す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/243523/2203df6d-c925-72aa-72c3-2f5970d7aeda.png)


コンパイラー準拠を8に設定し直す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/243523/56eeb79c-c06b-c37b-7175-4e181e4b1650.png)
Selenium + Headless Chromeで証明書エラーを回避する

Google chromeを利用してWebを閲覧していると、サーバー証明書に問題があるときに証明書エラーの警告画面を出してくれる。
これはユーザーの保護のためにはとても重要な機能だ。

重要な機能なのだが、検証のために自己証明書を利用していたり、プライベートIPでアクセスしたい時など、証明書エラーを回避したい時がある。
そして、Selenium + Headless Chromeを利用していると、このエラーページが回避できない。(以下のような空白のページが返る、スクショも真っ白になる。)

```html
<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>
```

Webアプリケーションの自動テストの時など困る。

回避策としては、これはHeadless(画面無し)状態固有の制限事項なので、Virtualdisplay(Xvfb)を利用して非ヘッドレスモードで起動する方法もある。

が、Xvfbが使えない環境もあると思うので、Chromeの機能だけで実現できないかどうか調べてみた。

# acceptInsecureCertsを有効にする

結論としては、ChromedriverにacceptInsecureCerts機能指定にすることで、証明書エラーを回避することができる。

以下、自己証明書を回避してサイトにアクセスし、スクショを保存するサンプルコード。

```python:sample.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')

capabilities = DesiredCapabilities.CHROME.copy()
capabilities['acceptInsecureCerts'] = True

driver = webdriver.Chrome(chrome_options=options, desired_capabilities=capabilities)
driver.get('https://yoursite.example.com')
print(driver.title) # ページタイトルの確認
driver.save_screenshot('/tmp/screenshot.png') # スクショ保存
driver.quit()
```

JavaでもRubyでも、acceptInsecureCertsのcapabilitiesを有効にする点は共通だと思う。ちなみに「--ignore-certificate-error」のオプションは廃止予定なので、効かない。

Windows環境はXvfbが使えないから(WSLにすりゃ行けると思うけど)、こっちの方がいいかもしれない。


参考文献：
Provide ability to handle certificate errors in Chromedriver/Selenium for headless
https://bugs.chromium.org/p/chromium/issues/detail?id=721739#c106
癖あるNaNの判別方法、isNaN関数の問題

#NaN === NaN

先日入力された文字列を数値に変換するために `parseInt()`を使用しまして、その際parseIntは最初の文字が数値に変換できない場合 `NaN`を返すのでそれを利用して数値と数値以外を分けるif文を書こうとしたんですが

```js:サンプル
const test = prompt('数値を入力してください');
const number = parseInt(test);
if(number === NaN){
  alert('不正な値');
} else {
  alert('正常な値');
}
```
[サンプルコード(Codepen)](https://codepen.io/atlansien/pen/NoepqY)
こんな感じでif文に `変換された値 === NaN`という条件式を書いたのですが、実行してみたら全ての文字が正常な値として認識されました、キャンセル押しても正常な値として認識されます。

ちょっと調べてみたら `NaN === NaN`だと `false`が返ってくるようで、 こういう時は`isNaN`という関数を使うということがわかりました。

なぜfalseと返ってくるのかは以下のサイトで詳しく解説されていました
[NaN === NaN が false な理由とutil.isDeepStrictEqual](https://yosuke-furukawa.hatenablog.com/entry/2018/01/30/174425)

#isNaN関数を使う

```js:サンプル
const test = prompt('数値を入力してください');
const number = parseInt(test);
if(isNaN(number)){
  alert('不正な値');
} else {
  alert('正常な値');
}
```
[サンプルコード](https://codepen.io/atlansien/pen/zeyZvV?editors=0010)

数値以外を入力したら不正な値として認識されるようになりました。

---

しかし、isNaNにはとある問題があるということがわかりました。

## isNaNの問題点

isNaNは、引数が数値ではなかった場合、まず暗黙の型変換によって数値に変換されてしまうようで、以下の記述だとおかしな結果になってしまいます

```js:isNaNの判別
console.log(isNaN(NaN)); //true
console.log(isNaN(1)); //false
console.log(isNaN('NaN')); //true
console.log(isNaN()); //true
```
[サンプルコード](https://codepen.io/atlansien/pen/LqMWyZ?editors=0011)
isNaN関数は「**数値であることをチェックする関数**」ではなく「**数値でないことをチェックする関数**」であると考えられているようです。

このような問題を解決するためには、 `Number.isNaN`を使うようです。

#Number.isNaN

```js:Number.isNaN
console.log(Number.isNaN(NaN)); //true
console.log(Number.isNaN(1)); //false
console.log(Number.isNaN('NaN')); //false
console.log(Number.isNaN()); //false
```

[サンプルコード](https://codepen.io/atlansien/pen/omJZBL?editors=0011)

これで、きちんと`NaN`の時だけ`true`が返ってくるようになりました。

しかし、`Number.isNaN`は、比較的新しく定義されたもの(ECMAScript6から)らしく、ブラウザによっては対応されてないのものもあるそうです、そういう時は、自分で`Number.isNaN`を作る必要があります

##Number.isNaNを作る

```js:サンプル
Number.isNaN = Number.isNaN || function(value) {
    return typeof value === "number" && value !== value;
}
```
こういったブラウザ間の機能を埋めることを「**ポリフィル(polyfill)**」と言うようです。
ssh-keygenで各パターンのkeyを生成する

生成したKEYは一般的には/etc/ssh配下に格納するでしょう

```sh
# rsa
ssh-keygen -t rsa -b 2048 -f ./ssh_root_rsa_key

#dsa
ssh-keygen -t dsa -b 2048 -f ./ssh_root_dsa_key

#ecdsa
ssh-keygen -t ecdsa -b 256 -f ./ssh_host_ecdsa_key

# ed25519
ssh-keygen -t ed25519 -f ./ssh_host_ed25519_key
```
[2019/2版]AWSソリューションアーキテクト-アソシエイト試験に20日で合格する方法

#はじめに
2019年2月16日にAWSソリューションアーキテクトアソシエイト試験に783点で合格した。
（試験結果は100から1000の間の値で示され、合格に必要な最低スコアは 720）
AWS利用経験ゼロから20日間の勉強で受かったので、勉強法や試験攻略のポイントを記す。
**前提として持っていた知識**
既に取得済の資格は以下。
・基本情報技術者
・LPICレベル1
AWSの業務経験
 なし
#勉強法
#####1. 対策本を2周読む（目安：4日）
対策本はこれ。
[徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E2%80%93-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8/dp/4295005495/ref=pd_lpo_sbs_14_t_0?_encoding=UTF8&psc=1&refRID=87A2TCP6VE4445X63EDX)
AWS用語を頭に馴染ませることが目的。1周だと意味不明すぎるので2周はすること。
#####2. AWSに触れる（目安：3日）
紫本と呼ばれるこの本に沿って実機で動かしてみる。
[Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版](https://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89/dp/4822237443)
AWSの雰囲気を体感することが目的。これは時間と手間がかかるので1周でOK。
#####3. 対策本を再度2周読む（目安：3日）
実機に触れているので1の時よりはるかに読みやすくなっているはず。ここでも2周することで理解を深める。
#####4. 対策問題を解く（目安：7日）
オススメは以下2つのWebサイト。
[Amazon AWS 資格取得のための演習問題集](https://awsjp.com/exam/saa-sap/c/index.html)(←無料)
[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)(←有料)
（※まずは無料版をこなし余力があれば有料版の順番）
問題を解きながら本で得た知識を脳に定着させることが目的。
理解が曖昧だと思った箇所は本で調べる。本の解説ではスッキリしなければネットで調べる。
#####5. 対策本と問題を交互に見つつ、理解しているか不安なサービスに関するBlackBeltを読む（目安：6日）
対策の総仕上げ。BlackBeltをこの段階で読むと、ごちゃごちゃしていた脳みそが最新の情報で整理整頓される。

#試験攻略のポイント
・対策本には登場しないような用語がちょこちょこ試験問題に出てくる
⇒試験中はかなり焦るが、対策本に書かれていた内容の問題に正解できれば合格する（した）ので気にする必要はない
・模擬試験は必ず受けること
⇒試験問題のレベルと、試験環境(UI)に慣れるため
・基礎的な知識は固めておく
⇒「可用性」「耐久性」のような「○○性」の言葉の違いを理解しておくことが大前提
・似ているように思えるサービスの「役割」や「長所」の差異を理解しておく
　例）Route53でできることと、CloudFrontでできることの区別
pythonのfitbitでsleepのstageを取得する



pip3 install fitbit

でいれたモジュールはAPIのバージョンが1だから、取れないっぽい。


https://github.com/orcasgit/python-fitbit/issues/128
とかをみると、1.2にすればいけるっぽい。


pipでいれたモジュールの調整がよくわからなかったので、直接書き換え。

homebrewでpython3を入れたosx(macos) Mojaveでの話


/usr/local/lib/python3.7/site-packages/fitbit/api.py


API_VERSION = 1

を

API_VERSION = 1.2

に書き換える。
2箇所あるよ。

これでfitbit.sleep(date=dtToday)すれば、minutesDataではなく、levelsが取れる。
Element から学ぶ Vue.js の component の作り方 その3 (card)

# Element-ui とは
第3回になり、今まではあまりにも説明不足だったと反省しました。
Elemnt-ui は Vue.js のコンポーネントライブラリです。
Vue.js で作成されているため、インポートすることで様々なコンポーネントを利用可能になるます。
CSS フレームワークとも捉えることができ、デザイン済みのコンポーネントを簡単に利用することが可能です。
CSSフレームワークなので、ある程度整形されたコンポーネントに変更を加えて、自身のプロダクト色に染めることも可能です。

今回は Elemnt 2.52 がベースになってます。
公式ページ
https://element.eleme.io/#/en-US\


今回は <strong> card </strong> コンポーネントを解析していきたいと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246022/51a80f7a-b618-db8c-f13b-bf619fa74c31.png)

ソースの構成は

```
　index.js
  src
   |- main.vue
```
となっていいます。

### main.vue

```main.vue
<template>
  <div class="el-card" :class="shadow ? 'is-' + shadow + '-shadow' : 'is-always-shadow'">
    <div class="el-card__header" v-if="$slots.header || header">
      <slot name="header">{{ header }}</slot>
    </div>
    <div class="el-card__body" :style="bodyStyle">
      <slot></slot>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'ElCard',
    props: {
      header: {},
      bodyStyle: {},
      shadow: {
        type: String
      }
    }
  };
</script>
```

main.vue を見ると、難しいことはしてなさそうです。

``` vue
  <div class="el-card" :class="shadow ? 'is-' + shadow + '-shadow' : 'is-always-shadow'">
```
上記では class を指定しています。

`class="el-card"` は固定で指定されます。
`shadow` は 指定されている場合は is-指定した値 が class になります。
指定されて表示が切り替わるのは `always / hover / never` のいずれかです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246022/bb6cd61b-8d81-fecd-f18d-99610414f9a6.png)

`:class="shadow ? 'is-' + shadow + '-shadow' : 'is-always-shadow'`

もし、shadow が指定されていない場合は is-always-shadow クラスが bind されます。


```vue
<div class="el-card__header" v-if="$slots.header || header">
  <slot name="header">{{ header }}</slot>
</div>
```
次の div は `el-card__header` が固定で指定されています。
$slots.header、または prop の header が指定されている場所は `{{ header }}` に指定された要素が入り表示されます。

```vue
<div class="el-card__body" :style="bodyStyle">
  <slot></slot>
</div>
```

次の div は el-card__body が固定で指定されています。 また、style 要素に prop で指定する bodyStyle が bind されています。
bodyStyle は CSS スタイルを渡すことができます。

例）`{color: 'red', 'background-color': 'gray'}`

```vue
<el-card :body-style="{color: 'red', 'background-color': 'gray'}">
```

このように body 部分のスタイルに適用されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246022/0c17de5c-6171-dacd-ddbe-6100f08196e0.png)

`<slot></slot>` は `<el-card></el-card>` の中に記述したものがそのまま入ります。

今まででてきた要素を組み合わせてみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246022/bf18330b-5ceb-35d0-59d2-55c12f60a98b.png)

下記がソースになります。

```vue
<el-card class="box-card">
   <div slot="header"> <!-- ヘッダー -->
    <span>サンプルですよ</span> <!-- ヘッダーの内容1 -->
    <el-button style="float: right;">スロット=header に ボタン</el-button> <!-- ヘッダーの内容2 -->
  </div>
   <!-- ボディのスロット -->
  ここが スロット です。
  ボタンをおいてみた
  <div>
    <el-button type="danger"> スロットにボタン </el-button>
   </div>
  <div>
     テーブルをおいてみた
  　　<table border>
       <tr>
         <th>ID</th><th>NAME</th><th>AGE</th>
       </tr>
       <tr>
         <td>1</td><td>ぺけぺけ</td><td>55</td>
       </tr>
       <tr>
         <td>2</td><td>ぷけぷけ</td><td>48</td>
       </tr>
     </table>
  </div>
</el-card>
```
Kotlin 1.3のCoroutineのキャンセル①（コルーチンをキャンセルする）

# 検証環境
この記事の内容は、以下の環境で検証しました。

* Intellij IDEA ULTIMATE 2018.2
* Kotlin 1.3.0
* Gradle Projectで作成
* GradleファイルはKotlinで記述（KotlinでDSL）

# 準備
詳細は下記の準備を参照してください。
https://qiita.com/naoi/items/8abf2cddfc2cb3802daa

# Cancelling coroutine execution
[前回](https://qiita.com/naoi/items/eb9419fef86371628b10)に引き続き、[公式サイト](http://kotlinlang.org/docs/reference/coroutines/cancellation-and-timeouts.html#cancelling-coroutine-execution)を読み解いていきます。

これまでの記事でキャンセルも少しだけふれましたが、今回からはキャンセルの詳細について説明していきます。

それでは、読み進めます。

> In a long-running application you might need fine-grained control on your background coroutines.
>For example, a user might have closed the page that launched a coroutine and now its result is no longer needed and its operation can be cancelled. 
> The launch function returns a Job that can be used to cancel running coroutine:

意訳込みですが、訳すと以下のとおりです。

> 長時間アプリを実行していると、バックグラウンドで実行しているコルーチンを制御する必要がでてきます。
> 例えば、ユーザが対象のページを閉じてしまった場合、コルーチンは結果を返す必要がなくなります。そして、そのような場合、キャンセルできます。
> コルーチンを起動する関数は、コルーチンをキャンセルできるJobを返します。

そうでしたね。確かJobオブジェクトが取得できるんでした。

サンプルコードを確認してみましょう。

```kotlin
import kotlinx.coroutines.*

fun main() = runBlocking {
    //sampleStart
    val job = launch {
        repeat(1000) { i ->
            println("I'm sleeping $i ...")
            delay(500L)
        }
    }
    delay(1300L) // delay a bit
    println("main: I'm tired of waiting!")
    job.cancel() // cancels the job
    job.join() // waits for job's completion
    println("main: Now I can quit.")
    //sampleEnd
}
```

launch関数の戻り値でジョブを取得してますね。
その後、cancel関数を呼び出してキャンセルしています。
実行してみるとこんな結果になります。

```text
I'm sleeping 0 ...
I'm sleeping 1 ...
I'm sleeping 2 ...
main: I'm tired of waiting!
main: Now I can quit.
```

しっかりキャンセルされていることが確認できます。

更に読み進めると。。。

> As soon as main invokes job.cancel, we don't see any output from the other coroutine because it was cancelled. 
>There is also a Job extension function cancelAndJoin that combines cancel and join invocations.

訳してみると

> mainがcancel関数を呼びだすと出力がキャンセルされます。
> JobにはcancelAndJoinという関数が存在します。cancelとjoinを組み合わせた動作をします。

# まとめ
このブロックで理解できたことは以下のことだと思います。

* Jobのcancel関数を呼び出すとコルーチンが中断する
* cancelAndJoin関数が存在すること
opencv.jsの作法 その3

# 概要

opencv.jsの作法を調べてみた。

# 実行環境

sandboxを用意した。以下のコードは動く。
https://s.codepen.io/ohisama/debug/VgVgQV/bYAdyeDvYGYk

# filter2dで、ぼかし

```javascript
let src = cv.imread('canvasInput');
let dst = new cv.Mat();
let kernel = cv.matFromArray(3, 3, cv.CV_32FC1, [0.1111, 0.1111, 0.1111, 0.1111, 0.1112, 0.1111, 0.1111, 0.1111, 0.1111]);
let anchor = new cv.Point(-1, -1);
cv.filter2D(src, dst, cv.CV_8U, kernel, anchor, 0, cv.BORDER_DEFAULT);
cv.imshow('canvasOutput', dst);
src.delete();
dst.delete();
kernel.delete();
```

# filter2dで、シャープネス

```javascript
let src = cv.imread('canvasInput');
let dst = new cv.Mat();
let kernel = cv.matFromArray(3, 3, cv.CV_32FC1, [0, -1, 0, -1, 5, -1, 0, -1, 0]);
let anchor = new cv.Point(-1, -1);
cv.filter2D(src, dst, cv.CV_8U, kernel, anchor, 0, cv.BORDER_DEFAULT);
cv.imshow('canvasOutput', dst);
src.delete();
dst.delete();
kernel.delete();
```


以上
Inno Setup 6 beta が出てたよ

Inno Setup 6 のベータ版がでていました。

>* Improved support for administrative vs. non administrative install mode.
>* Overridable install mode by the end user at runtime (example if PrivilegesRequired is set to admin.)
>* Improved support for side-by-side installations without the odd side effects you would get in previous versions.
>* Optional support for a resizable wizard window.
>* New optional modern wizard style (example.)
>* Other changes for a more modern look to Setup, Uninstall, and the Compiler IDE.
>* New light and dark themes, new toolbar icons and new per-monitor DPI awareness mode for the Compiler IDE (light theme example, dark theme example.)
>* Event attributes, making it possible to have multiple implementations of the same event function in your script.
>* Support for 64-bit mode on Windows 10 on ARM.
>* Task dialog support for the [Code] section.
>* Many more improvements and new features.

## Modern wizard style 
気になる点は、モダンウィザードスタイルというやつでしょうか。
試しにインストールしてみると、おおー、画面がでかい...

![inno-03.png](https://qiita-image-store.s3.amazonaws.com/0/11595/d7347147-498d-eb8a-ad65-a0017171b633.png)

## Compiler IDE.
Inno Setupに付属するIDEもモダンなスタイルになったようです。
でも別のエディタ使うこと多いので、個人的には「替わったんだ」ぐらいの感想です。

![inno-01.png](https://qiita-image-store.s3.amazonaws.com/0/11595/714e2658-6f82-5390-b22f-9929c2f6c71e.png)


## UTF-8 encoded .isl
機能面だと、.islファイルのUTF-8対応が地味に嬉しいです。
Unicode(UTF-16L)でもいいんだけど、個人的には多言語対応の言語リソースはUTF-8がいいです。

>* The compiler now supports UTF-8 encoded .isl files without requiring a special extension. Translators should still always set LanguageCodePage when possible.

他にも細かい修正が結構あり、正式リリースが楽しみです。
http://www.jrsoftware.org/files/is6-whatsnew.htm
Symfony 4.2 doctrine

## OneToMany の取得方法

### Entity

`Person Class`

```php
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Message", mappedBy="person")
     */
    private $messages;
```

`Message Class`

```php
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Person", inversedBy="messages")
     */
    private $person;
```


### Template

```twig
    <h2>Person Table</h2>
    <table>
        <tr>
            <th>id</th>
            <th>name</th>
            <th>mail</th>
            <th>age</th>
            <th>messages</th>
        </tr>
        {% for person in data %}
            <tr>
                <td>{{ person.id }}</td>
                <td>{{ person.name }}</td>
                <td>{{ person.mail }}</td>
                <td>{{ person.age }}</td>
                <td>
                    <ul>
                        {% for msg in person.messages %}
                            <li>{{ msg.content }}</li>
                        {% endfor %}
                    </ul>
                </td>
            </tr>
        {% endfor %}
    </table>
```

### Case1. 都度データを取得する例

```php
        $repository = $this->getDoctrine()
                           ->getRepository(\App\Entity\Person::class);
        $data = $repository->findAll();
```

*Symfony Profiler*
<img width="837" alt="スクリーンショット 2019-02-18 9.11.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/2019/5cdf12ee-a30f-4a75-3c2a-ce7576748456.png">

### Case2. まとめてデータを取得する例

```php
        $repository = $this->getDoctrine()
                           ->getRepository(\App\Entity\Person::class);
        $data = $repository
            ->createQueryBuilder('p')
            ->select('p')
            ->addSelect('m')
            ->leftJoin('p.messages', 'm', Expr\Join::ON)
            ->getQuery()
            ->getResult();
```

*Symfony Profiler*
<img width="840" alt="スクリーンショット 2019-02-18 9.13.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/2019/efcf1ec5-7457-d615-246f-7a23c5588c4a.png">

### Case3. フェッチモードを変える

```php
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Message", mappedBy="person", fetch="EAGER")
     */
    private $messages;
```
スプレッドシートにサイドバーで目次を表示する

# はじめに
スプレッドシートのサイドバーというUIに触れる機会があったので、まとめついでにシートの目次機能を作ってみました。
秘伝のタレ的に運用されているものや、1つ1つのシート名が長いものでも目的のシートにサッと移動できます。

## 機能

メニュー > 便利機能 > 目次表示 からサイドバーを開くことができる
<img width="500" alt="スクリーンショット 2019-02-17 23.53.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/44990/b4b6d889-73bc-6a73-c0b7-bf09e608f82f.png">
サイドバーのボタンタップで対象のシートをアクティブにすることができる
<img width="500" alt="スクリーンショット 2019-02-18 9.01.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/44990/b494b8f0-77cb-8cad-0fa9-bf2ccd8f75c2.png">
シート名を絞り込み検索できる
<img width="500" alt="スクリーンショット 2019-02-18 9.00.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/44990/3ff829f6-91f3-3d66-74ec-099e54fd7037.png">

#先にまとめ
ソースをGitHubに上げています。
▽GitHub
https://github.com/panti310/SpreadsheetSidebarTOC
.clasp.jsonファイルにscirptIDを入れてclaspでpushすれば、そのシートで動かすことができます。

# 解説

## ファイル構成
<img width="600" alt="スクリーンショット 2019-02-18 8.20.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/44990/31612eb4-f02e-595e-83da-194d9d454bda.png">
jQueryなどのライブラリはクライアント側のみで利用でき、gasはサーバー側のみで利用できます。
最初は認識がごちゃまぜで???となりました。
リクエストを投げる際にgoogle.script.runを使います。

## google.script.runについて
サーバー側から配列返す際はJSON.stringifyでJSON文字列に整形し、クライアント側でJSON.parseします。
今回は省きましたが、withFailureHandler(function)で失敗時のハンドリングも可能です。
詳細なエラー内容を返してくれるのでアラートか何かで表示してあげると良いかも。
▽Class google.script.run (Client-side API)
https://developers.google.com/apps-script/guides/html/reference/run

#さいごに
## 使い所が思いつかない
シートの操作をしながら常にサイドバーに表示しておきたいものって何があるんでしょう...進捗表示とか...？
サイドバー同様にhtmlで中身をゴリゴリ書けるDialogも用意されているので、そっちのほうが汎用性高そうです。
▽Dialogs and Sidebars in G Suite Documents
https://developers.google.com/apps-script/guides/dialogs
GitHubからcloneできるのありがたいです。

## サイドバーの幅は変更できないっぽい
consoleから要素をいじくれば変更はできるものの、動的に生成する中で変更しようとしてもstyleが上書きされてしまって上手くいきませんでした。
▽stackoverflow - Setting the width of a Google Drive Add-on sidebar doesn't work
https://stackoverflow.com/questions/30145347/setting-the-width-of-a-google-drive-add-on-sidebar-doesnt-work
【Unity】Standard AssetsがImport Packageに表示されていないときの対処方法

# 背景

[Unity5 3D/2Dゲーム開発 実践入門 作りながら覚えるスマートフォンゲーム制作（吉谷 幹人） \| 書籍 本 | ソシム](http://www.socym.co.jp/book/967)の本で勉強しているときに、「Assets」→「Import Package」から、Standard Assetsを選択してください。的な操作がありました。
しかし、自分のUnityは、Custom Packageしか表示されていません。

![import_package.png](https://qiita-image-store.s3.amazonaws.com/0/233011/397bf2e8-c214-49b1-dd89-24f88889728d.png)


# 動作確認環境

- Windows 10
- Unity 2018.3.1f1

# 解決方法

「Window」→「Asset Store」を開いて、Standart Assetsと入力して検索してください。
次に、画像の一番上にあるUnity Technologiesと書いてあるタブをクリックしてください。

![standard_assets2.png](https://qiita-image-store.s3.amazonaws.com/0/233011/d997dc12-9488-44b7-fb24-e47b56d1246c.png)

ピンクのImportボタンを押下してください。
Importしたいものにチェックを入れて、Importボタンを押下すればStandard Assetsを使用することができます。

![standard_assets.png](https://qiita-image-store.s3.amazonaws.com/0/233011/bf851b24-629c-3e58-3687-24fca37d344a.png)


# 終わりに

~~おそらくUnityが日々バージョンアップしていくなかで、Standard AssetsはAssets Storeからインストールするものになったのだと思います。~~
下の追記をご覧ください！

ググり能力が低いせいか、なかなか解決できませんでした。
忘れては困ると思ったので、自分の備忘録がてら記事にしました。

# 2019/2/21に追記

コメントにて教えていただきました。

2018年7月10日の公式ブログより、Standard Assets の差し替えが発表されていました。
[Unity 2018.2 リリース – Unity Blog](https://blogs.unity3d.com/jp/2018/07/10/2018-2-is-now-available/)より引用

> Unity 2018.2 では 5.0 バージョンの Standard Assets がインストーラーから削除されました。旧プロトタイピング用パッケージ各部の差し替えパッケージの作成が進行中です。最初のパッケージ（Standard Assets: Characters）はプレビュー版として Unity 2018.2 のリリース後、近日中に入手可能となります。これには First-Person および Third-Person Controller が Cinemachine と統合されて含まれているほか、Probuilder でビルドされたプロトタイピング環境も含まれます。詳細は近日公開予定のブログ記事をご覧ください。 旧 5.0 パッケージはアセットストアで引き続き入手可能です

2019年2月21日現在は、差し替え中なのでアセットストアから入手して使用するしかないようです。
おそらく、新しいStandart Assetsの開発が完了すれば、今まで通りUnityのインストーラーに含まれるのではないかと思います。

[GitHub - Unity-Technologies/Standard-Assets-Characters: Unity Standard Asset Controllers](https://github.com/Unity-Technologies/Standard-Assets-Characters)で、Character Package(BETA)を開発中のようです。
Elixir~これまでの知識を使って式をつくってみたぞ~

#ここまでのあらまし

愚直に[Elixir~Enum総ざらい4回目~](https://qiita.com/kmizuno0211/items/6b9f899cb54fda41045c) まで公式ドキュメントのEnumを洗ってわかる式とわからない式を峻別していました。

心折れそうになっていたところ、先生から新しい課題が！

”では，次のようなプログラムを作ってください。今まで習った範囲でできると思います。できるだけ簡潔になると良いですね。

100より小さい偶数を作って，これらを2で割った時の余りが本当に全て0になっているのかを確かめる"

やったるぜ！

#式

```elixir
iex(1)>  1..100 |> Enum.map(& &1 * 2) |> Enum.filter(& &1 <= 100) |> Enum.all?(& rem(&1, 2) == 0)
true
```

第一引数の1..100を左辺に持ってきて、Enum.mapで全て2でかけ、Enum.filterで100以下の整数にフィルターして、それをEnum.all?で2で割ったもののあまりが果たして全てゼロか。
true!!!!!
単純ですが自分で考えた式を実行できたときの喜びはひとしおです。はやくmix newを伴う自分だけのPJをつくってみたいです！

うまずたゆまず、頑張ります。
Kento Mizuno
php-master-changes 2019-02-17

今日は開発者向けツールの若干の整理があった！

# 2019-02-17
## petk: Move some scripts from root directory to scripts/dev/
- https://github.com/php/php-src/commit/e0c88039b6d88b03a91dec34d69b2d776860135d
- [7.4~]
- 開発者向けのスクリプト snapshot と vcsclean をプロジェクトのルートディレクトリから scripts/dev/ へ移動

## petk: Remove unused --copy option from the makedist
- https://github.com/php/php-src/commit/90054c1a698ff755ac63125267c2bb66e53dee2d
- [7.4~]
- makedist にあった `--copy` オプションの利用箇所を削除
- かつて automake へのフラグとして使っていたが、[だいぶ前に使われなく](https://github.com/php/php-src/commit/128119b9abf3446b3867ed6d6bf1503a54bf45ea)なっていた
[PowerApps Tip's]Form.LastSubmit ～Submitした結果を即時に得る～

PowerApps で「直前に登録したリストアイテムの情報（特にID）をすぐさま得たい」ということは無いでしょうか？そのような場合に活躍するのが『LastSubmit』プロパティです。

具体的な活用方法などは [@mofumofu_dance](https://twitter.com/mofumofu_dance) さんの下記記事をご参照ください。

　■参考URL
　[PowerAppsで複数リストへの同時登録 (1:N)](https://qiita.com/h-nagao/items/7a57d78394bec6e6c4ed)

公式情報は下記。※下記以上の詳しい情報は記事投稿時点では発見されてません。

　■公式情報
　[PowerApps の [Edit form (フォームの編集)] コントロールと [Display form (フォームの表示)] コントロール](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/controls/control-form-detail)

では、簡単に動きを解説します。

#解説用データ構造
SharePoint Online のカスタムリストを利用しています。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/215892/76efb3a8-c0a2-f19d-cdee-3723a15525b1.png)
すでに、下記のようなデータが登録されています。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/215892/1a7096e2-0beb-7b1c-5c97-eb826f9fc983.png)

#画面構造
画面としては、1つのScreenに、Formを編集、ディスプレイと2つ設置し、前述のカスタムリストをデータソースとして指定。ボタンを１つ置いて、SubmitFormを設定。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/215892/28aa2406-e0e5-843d-7f04-81274db11502.png)
![04.png](https://qiita-image-store.s3.amazonaws.com/0/215892/07ae8c6a-ad90-a02b-96a8-e56861c3baab.png)

#重要なPoint！
画面上のディスプレイフォーム（Name：FormViewer0217）の[Items]プロパティを下記のように設定します。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/215892/6d850e61-ad21-e687-4699-03d2dd76bf55.png)

```FormViewer0217.Item
Form0217.LastSubmit
```

これで、上段にある編集フォームが確定したタイミングの情報が、下段のディスプレイフォームに表示されるようになります。

#実際の動作イメージ
![メディア1.gif](https://qiita-image-store.s3.amazonaws.com/0/215892/2b3d5ce7-fa30-3321-be8c-779e9148e97c.gif)

LastSubmit は、そのFormがSubmitされた結果をプロパティのように参照できます。例えば、下記のように[ID]を取得することが可能です。

```
Form0217.LastSubmit.ID
```

#まとめ
- FormのSubmit結果を即時取得したい場合は[LastSubmit]を利用
- [LastSubmit]はFormの更新結果をプロパティのように取得できる
    - 例)”FormXXX.LastSubmit.ID”のように登録されたアイテムのIDを取得

LastSubmit は 新規登録(または更新)した結果をEntityクラスで返却してくる、みたいなイメージだとC#使いの方には伝わりやすいのかな？とか思いますが、いかがでしょうか。冒頭で紹介した記事のように１：ｎ（親：子）関係のデータ登録の際には必須テクニックとなるでしょうかねぇ。

それでは、皆さま、素晴らしい Power Platform Life を！
SpringWebFluxで使うEntityクラスのメンバをfinalにしたらエラー

もうこれ完全に自分用メモ。Twitterでもよかったレベルなんだけど残すためにこっち。

Spring Data MongoDBで使うEntityクラスをなんとなくで作ったらなんかエラー出た。
なんかSetterよこせとかっていうエラーが出る。
試しにSetterつけたら確かにうまくいく。
でもfindOneして返しただけなのになんで？？？


```:エラー
This application has no configured error view, so you are seeing this as a fallback.

Mon Feb 18 06:27:46 JST 2019
There was an unexpected error (type=Internal Server Error, status=500).
No accessor to set property @org.springframework.data.annotation.Id()private final java.lang.Integer com.example.demo.Flower.id!
java.lang.UnsupportedOperationException: No accessor to set property @org.springframework.data.annotation.Id()private final java.lang.Integer com.example.demo.Flower.id!
	at com.example.demo.Flower_Accessor_jjo0e1.setProperty(Unknown Source)
	at org.springframework.data.mapping.model.ConvertingPropertyAccessor.setProperty(ConvertingPropertyAccessor.java:61)
	at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readAndPopulateIdentifier(MappingMongoConverter.java:326)
	at org.springframework.data.mongodb.core.convert.MappingMongoConverter.populateProperties(MappingMongoConverter.java:289)
	at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:275)
	at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:245)
	at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:194)
	at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:190)
	at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:78)
	at org.springframework.data.mongodb.core.ReactiveMongoTemplate$ReadDocumentCallback.doWith(ReactiveMongoTemplate.java:2910)
	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:107)
	at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:353)
	at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:76)
	at com.mongodb.reactivestreams.client.internal.ObservableToPublisher$1.onNext(ObservableToPublisher.java:68)
...
```

ちょっとコード変えて試したりもっかいエラーをよく読んでみると・・・
あー、finalにしちゃうとConvertのところでうまくいかないのね。雰囲気で了解。

setterなくてもfinalだけ外したら動いた。裏でいろいろあるんだねえ。

```
@Document
public class Flower {
	@Id
	private Integer id;
	private String name;
	private String color;
	
	Flower(){
		id = null;
		name = "";
		color = "";
	}
	Flower(int id, String name, String color){
		this.id = id;
		this.name = name;
		this.color = color;
	}
	
	public Integer getId() {
		return this.id;
	}
	public String getName() {
		return this.name;
	}
	public String getColor() {
		return this.color;
	}
}
```
JavaScript　オブジェクトの参照　注意点

#JavaScript　配列　参照の注意点
##　配列の注意点の備忘録

* Objectとは
    
    プリミティブ型（数、文字列、真偽値）以外のものを指す。
    =>　配列はObject型

1. プリミティブ型とObject型の違い
    
    プリミティブ型は値そのものが代入される。
    
    ```js:例）
    const number = 2  // ２そのものがnumberに入る
    ```
    
    Object型はその値が入っている参照（エリア）が代入される。
    
    ```js:例）
    const numbers = [1, 2]    // [1,２]の位置情報がnumbersに入る
    const numbers2 = numbers  // numbers2 : [1, 2]
    numbers[0] = 2            // numbers: [2, 2], numbers2: [2, 2]
    ```
     
    元の配列の値を操作すると、numbers2も同じところを指しているため、出力結果が同じ[2,2]になる。
    
2. 対処方法
    
    別の参照を持たせれば、変更の影響は受けない。
    
    ```js
    const numbers = [1, 2]
    const numbers2 = numbers.slice()  // コピーを作成
    numbers[0] = 2                    // numbers : [2, 2] , numbers2 : [1, 2]のまま
    ```
    
　　numbers numbers2の参照が異なるため、numbers2は変更されない。
Ubuntu16.04でCUDA9.2からCUDA8.0に速攻ダウングレードしたい時のメモ

#CUDA9.2をアンインストール

```
$ sudo apt purge cuda*
$ sudo apt purge nvidia-cuda-*
$ sudo apt purge libcuda*
$ sudo reboot
```

#CUDA8.0をダウングレード＆インストール

```
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda-8-0
```


ここでキモになるのは.bashrcなどに書かれたパスが9.2のままになっているはずなのでこれを直す

```
export PATH=/usr/local/cuda-8.0/bin:${PATH}
```

上記のようなパスがどっかにあるはず？
これをダウングレードまたはアップグレードした任意のバージョンに置き換えればおそらく他のバージョン同士でのアップグレード＆ダウングレードにいつでも対応できそう。


また例によってnvidia-smiコマンドを使っても新しいグラフィックドライバを使ってると

```
      
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.79       Driver Version: 410.79       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:05:00.0  On |                  N/A |
|  0%   46C    P8    17W / 300W |    232MiB / 11175MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1011      G   /usr/lib/xorg/Xorg                           178MiB |
|    0      1626      G   compiz                                        51MiB |
+-----------------------------------------------------------------------------+
```

CUDA.ver10.0と表示される問題は変らない
（詳しくは以下の記事で）
https://qiita.com/_JG1WWK/items/bfb59e2589b82bf5a8b3

またこのやりかたでROCm/CUDA混成環境でダウングレードしても一応rocm側と競合等が新たに発生してないことを
上記の記事と同一の環境で確認できた。


#参考
http://tako104.way-nifty.com/blog/2017/12/ubuntu164-uda9-.html
bash_profileで設定したPATHがfish shell呼び出し後にぐちゃぐちゃになった時のゴリ押し解決法

# fish shellがPATHをぐちゃぐちゃにした💢

shellとしてfishがすごく気に入っていたのですが、この間、`jenv`なるものを入れてjavaのバージョンを切り替えられるようにしようとした時にうまく設定できないことがありました。

原因を探っていくとどうやらPATHの順番が思っていたものと違う感じで設定されているようです。

```shell:fish_shell
$ echo $PATH
/usr/local/bin /usr/bin /bin /usr/sbin /sbin /Users/hogeuser/.jenv/shims /Users/hogeuser/.jenv/bin
```

PATHの順序が変わっているせいで`/Users/hogeuser/.jenv/shims`内のjavaではなく、`/usr/bin/java`のjavaを起動してしまい、jenvによる切り替えがうまくいかない...

...なんでやねん！ ~~（１週間前まで設定したPATHはちゃんと`/usr/bin`とかの前に置かれてたやんけ！）~~

私の環境ではデフォルトシェルをfishにしているわけではなく、`.bash_profile`の設定を流用したいので`.bash_profile`を読み込んだ後、`exec fish`をしてfishを起動しています。

`~/.config/fish/config.fish`に環境PATHを書き直すのが一番なんでしょうが、fish用の設定の書き方を記載しているものがないことも多く~~書き直すのがめんどくさい~~大変です。

この人も同様の問題で困っている様子↓
[Bash profileからFishを起動している場合のPATHの順番を正す](https://note.mu/o3c9/n/n41e1852b9ff2)

fishのスクリプトでPATHの順序を入れ替えたりするのがいいのかなと思いましたが、それも大変です。

そこで少し強引ですが、簡単にこれを解決する方法を紹介します。

# 解決策

`~/.bash_profile`の最後あたりに以下を追記します。

```shell:~/.bash_profile
# ~~
# PATHの設定など

export TO_FISH_PATH=$PATH

# fish起動
exec fish
```

そして`~/.config/fish/config.fish`に以下を追記します。

```text:~/.config/fish/config.fish
# PATHを設定
set PATH $TO_FISH_PATH $PATH
```

これは`.bash_profile`で設定したPATHを一旦環境変数として退避させておき、その値をfishで設定されたPATHの前に追加しちゃうという方法です。

```shell:fish_shell
$ echo $PATH
/Users/hogeuser/.jenv/shims /Users/hogeuser/.jenv/bin /usr/local/bin /usr/bin /bin /usr/sbin /sbin /usr/local/bin /usr/bin /bin /usr/sbin /sbin /Users/hogeuser/.jenv/shims /Users/hogeuser/.jenv/bin
```

fishによって設定されたPATHに追加するのでPATHが２倍の長さになりますが、これでちゃんと動くのでとりあえずOKということにします←。


# 最後に

以前は順序が変わることなく問題なく設定できていたのですが、アップデートしたからなのか急にこのような事態になりました。原因がちょっとわかっていませんがとりあえず解決したのでしばらくはこのままでいこうと思っています。
困っている人のお役に立てれば幸いです。
何かいい解決策があれば教えていただければと思います。よろしくお願いします。
とあるエンジニアの問題意識 2019-02-17



# 今週やけに苦しかったプログラミング。

今夜はようやく楽しさを感じた。

嘘のように軽やか。

PythonでTwitterのAPIを叩く。

手に馴染んだシェルの動作。

MacBook Airの薄いバタフライキーボードもようやく愛し始める。

久々に飲んだカフェインのせいだろうか。

不思議に今夜は… #エンジニア <https://t.co/IlDvS066Lj>

# わからないことを質問しない人。

世の中で膨大に起こっている問題。

僕もまさにこのタイプ。

何故か。

とにかく人の態度に敏感だ。

一瞬でも嫌な顔をされると辛い。

貝のように心を閉ざす。

心理コストと業務コストの競合。

いわるゆ心理的安全性ってやつが… #エンジニア <https://t.co/rvd0ptDwsa>

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/611








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
rails gem carrierwave imageがnull


#rails

###画像を投稿機能を付ける段階でネットの情報を見ながらgem で　carrierwaveを使う方もいると思います。


- エラーがないはずなのにデータベースのimageの値がnull になるケースがある方もいるかもしれませんのでここに書いておきます。

`form_tag,  のなかに　→　multipart: :true `

を書き忘れているかもしれませんので確認をしてみては、

低レベルの記事ではありますが参考になればいいと思います。


- なぜ必要かと言うと

multipartオプションがないと

- 例えば

cat1.jpeg という画像の場合、

cattt1.jpeg というファイル名だけをstringとして受け取ってしまい、画像情報を受け取れないのです。
ファイルを取り込むときは

:multipart => true

をform_tagの第二引数に指定すると
StringIO（stringを拡張したもの）でクエリーがやってきて

 
画像が取り込めるようになるそうです。

以上です
Golang Install on Linux

# Go 1.11.5

## fish

Go Install Linux

```
mkdir $HOME/go
wget -qO- "https://dl.google.com/go/go1.11.5.linux-amd64.tar.gz" | tar -zx --strip-components=1 -C $HOME/go
mkdir $HOME/go-third-party
set -x GOPATH $HOME/go-third-party
set PATH $HOME/go/bin $PATH
set PATH $GOPATH/bin $PATH
```

環境変数設定

```
string trim '
set -x GOPATH $HOME/go-third-party
set PATH $HOME/go/bin $PATH
set PATH $GOPATH/bin $PATH
' >> ~/.config/fish/config.fish
```

## bash

```
mkdir $HOME/go
wget -qO- "https://dl.google.com/go/go1.11.5.linux-amd64.tar.gz" | tar -zx --strip-components=1 -C $HOME/go
mkdir $HOME/go-third-party
export GOPATH=$HOME/go-third-party
export PATH=$PATH:$HOME/go/bin
export PATH=$PATH:$GOPATH/bin
```

環境変数設定

```
vim ~/.bashrc
```

末尾に記載

```
export GOPATH=$HOME/go-third-party
export PATH=$PATH:$HOME/go/bin
export PATH=$PATH:$GOPATH/bin
```

# 参考URL
https://golang.org/dl/
Javascript：<textarea>の文量に応じた自動高さ変更

Google翻訳のテキストエリアの様に高さがコンテンツの文量に応じて変化する`<textarea>`を実装します．

```html:HTML
<textarea id="realArea" name="real" rows="15" cols="40"></textarea>

<p id="dummyArea"></p>
```

ダミーの`<p>`を用意します．

```css:CSS
textarea#realArea {
    width: 50vw;
    height: 250px;
    font-size: large;
    font-family: inherit;
}

p#dummyArea {
    margin: 0;
    padding: 0;
    width: 50vw;
    text-align: left;
    font-size: large;
    font-family: inherit;
    visibility: hidden;
}
```

cssの設定がとても大事です．
- 幅をビューポート単位で本体とダミーが同じになる様にする．
- 同様に`font-size`も本体とダミーが同じになる様にする．

```javascript:JavaScript
const realArea = document.getElementById("realArea");
const dummyArea = document.getElementById("dummyArea");

const defaultHeight = 250; // CSSで決めたデフォルトの値と一致させる

window.onload = function() {
    realArea.addEventListener("input", function(evt) {
        dummyArea.innerHTML = evt.target.value.replace(/\n/g, "<br>") + "<br>";
        const newHeight = dummyArea.offsetHeight;
        if (newHeight > defaultHeight) {
            evt.target.style.height = newHeight + "px";
        } else {
            evt.target.style.height = defaultHeight + "px";
        }
    }, false);
}
```

こんなに短いコードでも驚くほどいい感じに動きます．