OmniAICreator/Qiita-1.07M huggingface dataset:
[ Android ] HTTP通信時に発生するタイムアウトエラー処理

AndroidでHttp通信を行う際、起きるタイムアウトの処理について述べる。

##サンプル
まずHttp通信は以下のような処理を行う。

~~~java
        HttpURLConnection connection = null;
        try {
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(20000);           // 接続タイムアウト
            InputStream is = connection.getInputStream();
        }catch・・・
~~~

##接続タイムアウト
サンプルではタイムアウトを20secに設定してある。サーバからのレスポンスが20secで返ってこなかった場合、SocketTimeoutExceptionが発生する。この例外のキャッチブロック中にタイムアウトが発生した場合の処理を書けば、例外処理できる。

~~~java
        }catch(SocketTimeoutException e){
            //タイムアウトが発生したときの処理
        }cacth(IOException e){
            //・・・
        }
~~~

IOExceptionはHttpURLConnectionのキャッチブロックによく利用されるので書いている。
これらの順序が逆になるとコンパイルエラーになるので、気を付けて頂きたい。



##参考URL
https://ku6.jp/report/52.html
[UE4] UE4.23の新機能「Hide Unrelated」を使えば、使用されている・されていないノードが一目瞭然！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/0066752b-2b53-e437-91f2-3fd40534f3e9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/f613e6ab-0cdf-6028-601b-0d515ef67a7d.png)
https://www.unrealengine.com/ja/blog/unreal-engine-4-23-released

UE4.23にて「Hide Unrelated」機能が追加されました！この機能を使うことでBlueprintがスパゲッティ状態でも実際に使われている・使われていないノードの区別を簡単に行うことができます。

Hide Unrelated：**OFF**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/1889c098-9c88-87a1-9ee7-5925180d15b7.png)
Hide Unrelated：**ON**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/5d4ed81e-1aaa-0da9-b3fe-9e0366c8898e.png)
この通り、選択中のノードに繋がっていないノードをグレーアウトしてくれます。

![Hide Unrealated.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/c110c01f-a066-510d-6060-b20b5d4ae127.gif)
また、グレーアウト中にオプションのLock Node Stateを有効にするとその状態をキープしてくれます。
（無効時は別のノード、または空いている箇所をクリックすると更新・解除されます）

そして、「Hide Unrelated」機能はBlueprintだけでなく様々な箇所で使うことができます！処理の理解やデバッグ時に積極的に活用しましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/cb73a103-9657-29f4-1830-c62530133e38.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/4f271ee9-20f1-a846-437e-25c3147ef332.png)
おしまい
Adobe Muse終了に見る自動コーデイングの難しさ

#Adobeの自動コーディングツールMuse

誰もが1度は触ったことのあるAdobe製品。その中でも、デザイナーがコーディングせずにWebサイトを作成するためのソフトが「Adobe Muse」というツールで、2014年にリリースされました。
しかし、2018年初頭、Adobe MuseCCの新規開発を2018年3月で終了し、サポートも2019年5月頃に終了するというメールがユーザに突然届くことになったようです。

突然やってきた終了のお知らせ。使用しているソフトがいきなり使えなくなったらたまりません。
Adobe製品を導入しており、デザイナーが簡易的なページを作る際に活用されていた方も当然多くいたことでしょう。

ここで、公式のアナウンスを見てみると…↓


#Adobe Muse終了のアナウンス内容

http://muse.adobe.com/product-announcement-intl.html
日本語にすると↓

[背景]
近年、複雑なページを作る場合、デザイナーはプロトタイプを作り、エンジニアと協力し実装をする流れになってきている（デザイナーは実際のコーディングでなく、UXのデザインなどが重要）
逆に簡単なページは、DIYウェブサイト(WIXやJimdoのような、web上でコンテンツをペタペタ貼って簡単にHPが作れるサービス)が増えてきており、テンプレートをもとに簡単にカスタマイズ可能になっている
⇒　Adobe Museの活用シーンが少なくなっている！

[代替手段]
複雑なサイトを作る場合⇒Adobe XDを推奨。
Adobe XDなら超簡単にUXデザインが作れるし、スムーズにエンジニアとの連携が可能です！
ポートフォリオサイトを作っている場合⇒Adobeでは「Behance」というポートフォリオに特化して、簡単に自分の作品一覧を作れるサービスを提供しています！コイツを使ってね！
ニュースレターやほぼ1Pの簡易的なサイトを作っている場合⇒Adobe 「Spark」という画像を集めるだけで、簡単に美しいページを作るサービスを提供しています！コイツ使ってね！
　
要約すると以上のようになります。背景は良いとして果たして代替手段かというと微妙な感じです。。。


・Adobe XD：HTML/CSS出力ができず、コーディングなしでサイトが作れるAdobe Museの代替にはならない。
・Behance：ポートフォリオサービス：Adobe Museユーザーかつポートフォリオを作るためだけに、使っている人は極僅かなのでは。。。
・Adobe Spark：そもそもウェブページ作成というより、画像/デザイン簡易編集ツールの意味合いが強く、HP作成とは言えないようです。

これは、多くのユーザが求めた「HTMLの編集なく、簡単にサイトを作成したい！」という要望に対して、本当にごく一部しか対応できていない気がします。


#背景から本当の終了理由を考えてみる
実のところは「他社サービスで代替できるでしょ？」ということなのかもしれません。
本音をいうと、真の代替手段は、コーディングなく簡単にHPが作れる「WIX」や「Jimdo」etcの競合他社サービスなんだと思います。
最近では、web上でコーディングなしで超手軽にHPが作れるサービスが増えてきています。（ほぼ無料のものも多い。）こうした風潮を見るに、このためにAdobe Creative Cloudを有料で買って、Museを使い始める人はまずいないでしょう。

↓WIXサービスの説明。超簡単にweb上でHPが作れるのがウリ
（有料プランを選ばないとドメインにwixが入るようです）
[Wix公式サイト](https://ja.wix.com/)


また、最近だと、Zeplinというツールを用いてコーディングするというスタイルもこちらで分かりやすく紹介されていました。
https://liginc.co.jp/423041
小規模なサイトはこれでいいのではという気がしないでもない。画像切り出してくれる点などは純粋に時短になります。


#まとめ
Adobeの製品ですら突然サポートが終了するなど、自動コーディングツールはまだまだ試験段階といえるでしょう。
Museの公式サイトで触れられたように、動きや見た目を工夫したサイトが一般的になってきている中、
こうしたツールで量産できるようなサイトは多少チープに感じるかもしれません。
JSやCSSでリッチなサイトをと思ったら結局1からコーディングしたほうが逆に速いというのが現状でしょう。

…しかし、昨今の画像認識やディープラーニング技術のの進歩により、こうしたツールで作れる部分も日々進化していくことは間違いないです。新しいもの好きな自分としては純粋に楽しみです。
面白そうな本もボチボチ書店で見かけるようになったので読まないと。（今さらか）



参考：
https://note.com/koushikagawa/n/n8929da789802
https://ja.wix.com/
http://muse.adobe.com/product-announcement-intl.html
GIMP ハロウィンメイク

Halloween Make Up by GIMP

/////////////////////////////////////////////////////////////////////
※本解説は以下動画で行われているメイクアップに基づいて記述している
	https://youtu.be/3gHWWZvdRck
	動画を視聴しつつ、理解できない部分を補うという目的で作成した
        あくまで自分用のため、見やすく改良する予定はない
/////////////////////////////////////////////////////////////////////

1.モデルになる画像の上に新しいレイヤーを追加

2.ブラシのDynamicをBasic Simpleに設定

3.肌に亀裂を入れる
		ブラシcracksandwalls11で肌に亀裂を入れる
		次にcracksandwalls5で肌を黒ずませる
　　　　　　　　 ブラシの強さは45~50がよさそう
		ブラシツールダウンロード：https://all-free-download.com/photoshop-brushes/download/10-crack-sand-walls-brush_40025.html
		本解説では、レイヤー名を"sandwalls"としておく

4.はみ出した亀裂・黒ずみを消しゴムツールで消す
		推奨ブラシタイプ：hardness075

5.sandwallsレイヤーを複製

6.複製したレイヤー(※2番目のレイヤー)に効果を付ける
		着色：[色] → [着色]で肌色に近づける
		レイヤーモード：[微粒結合]に設定

7.元画像への設定
		[色]→[彩度]で灰色感を強くする

8.もう一度6.の　着色：[色] → [着色]で肌色に近づける　を行う

9.sandwallsレイヤー(※1番目のレイヤー)にレイヤーモード：[微粒結合]
	適用する

10.sandwallsレイヤー(※1番目、2番目)のopacityで肌になじませる
	肌のメイク終了

11.目の光
元画像を複製する
効果を付ける[フィルタ]→[照明と投影]→[超新星]
値目安
上から順に
[任意][1][0]

12.画面全体の調整
　　新規レイヤー作成
　　グラデーションを選択
　　種類：描画色から透明(反転させる)
　　形状：放射状
　　レイヤーモード：微粒結合

13.目の着色
　　新規レイヤー作成
　　目をブラシで塗る(任意の色)
　　レイヤーモード：オーバーレイ(おそらく、お好みで)

14.白眼を黒くする
　　ブラシで白眼を塗る
　　レイヤーモードをいじる(13.と同じようにお好みで)

終わり
不具合報告・対応フロー

## はじめに

私が考える不具合報告・対応のフローを紹介します。

## 不具合報告

不具合を発見したら、できる限り早くバグトラッキングシステム(BTS)に報告します。

不具合の報告に必要な情報は以下の通りです。

|項目|説明|
|:--|:--|
|タイトル|不具合の内容を一言で表す|
|不具合内容|不具合の内容を詳細に書く|
|再現手順|他の人が再現できるように手順を示す|
|原因|アタリがついていたら書く<br>この時点では予測でいい|
|環境|不具合が発生した環境<br>書かないと他の人が再現できないことがある<br>　- システムのバージョン<br>　- OSの種類とバージョン<br>　- Webブラウザの種類とバージョン(Webシステムの場合)<br>　- その他システム独自の内容|
|報告者|不具合を報告した人(基本的には発見者)|
|報告日時|不具合を報告した日時(基本的には発見日時)|
|ステータス|「新規」とする|

「報告者」や「報告日時」はBTSが自動的に取得するのが望ましいです。

## 不具合確認

不具合が報告されたら、その不具合を確認します。
報告者が自分で判断できる場合、報告と同時に確認した方が早いです。

|項目|説明|
|:--|:--|
|再現できるか|再現性があるか確認する<br>再現できない場合は報告者に聞く<br>それでも再現できない場合、ステータスを「保留」または「却下」とする|
|対応有無|対応が不要と判断したら、ステータスを「却下」とする|
|対応時期|対応が必要と判断したら、対応する時期やバージョンを書く|
|優先度|「緊急」「高」「中」「低」のようにざっくり付ける|

## 不具合調査

対応時期や優先度により、対応する不具合を選定したら調査に着手します。

|項目|説明|
|:--|:--|
|一時的な対応|根本的な対応に時間がかかり、致命的な不具合の場合、ワークアラウンドを書く|
|根本的な対応|根本的な対応方法を書く|
|類似の不具合|似たような不具合がないか調査する|
|ステータス|「調査中」→「調査完了」|

## 不具合対応

対応方針が決まったら、実際に対応します。
類似する不具合が存在する場合、まとめて修正するのが望ましいです。

|項目|説明|
|:--|:--|
|ステータス|「対応中」→「レビュー待ち」→「対応完了」|

## おまけ：BTSの紹介

私が知っているBTSを紹介します。
私が紹介していないBTSを使っている場合、教えていただけると嬉しいです。

### Redmine

私が最もよく使っているBTSです。

### Backlog

よく使われているBTSです。
私は課題管理に使ったことがありますが、不具合管理として使ったことはありません。

### GitHub Issue

GitHubを使って開発している場合、Issueを使うプロジェクトが多そうです。

## おわりに

なんか複雑な気がします、、
1年以上不具合の報告・対応を行っていないので、また始めたら更新します。
Golang Mac環境構築メモ

Goのバージョンを混在させるためgoenvからGoを入れる

```
brew install --HEAD goenv
```

更新時

```
brew upgrade --fetch-HEAD goenv
```


bash_profileにgoenv関連のパスを通しておく

```
vim ~/.bash_profile
```

以下を記載して`:qw`

```
#goenv
export PATH="$HOME/.goenv/bin:$PATH"
export GOPATH=$HOME/go
eval "$(goenv init -)"
```

bash_profileの変更を反映

```
source ~/.bash_profile
```

goenvコマンドが叩けることの確認

```
goenv -v 
```

ここからGoの構築
goenvでインストールできるGoのバージョンを確認

```
goenv install -l
```

バージョン指定で入れる

```
goenv install 1.11.4
```

有効なバージョンに今回入れたバージョンが表示されれば成功

```
goenv versions
```

マシン全体で入れたバージョンを有効にする

```
goenv global 1.11.4
goenv rehash
```

所定のディレクトリのみで有効にしたい場合

```
goenv local 1.11.4
```
[UE4] Folder Filters機能を活用してアニメーションエディタ「Persona」をより便利にしよう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/34e2af88-b99c-eb65-fcd3-ebd996327edc.png)
マーケットプレイスでガンガンアセットを購入したり、スケルトン・アニメーションの共有機能を活用していると、アニメーションエディタ「Persona」におけるAsset Browser上に並ぶ項目が膨大になり、今使用・確認したいアニメーションアセットがどれだったかを探すのが一苦労になってきます。
![folderfilters.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/db4aec24-0ee8-faef-949a-3d65c4107685.gif)
そんなときに便利なのがFolder Filters機能です。このようにフォルダパス単位でフィルタリングすることができます。

ですので、例えば様々なキャラが共通スケルトンを使用している場合、キャラ固有モーションをそれぞれ別フォルダに格納しておくことでFolder Filters機能を最大限に活用することが可能です。他にもRoot Motionの有無によってフォルダ分けしておくと非常に便利です。ぜひお試しあれ！

ちなみに、Folder Filters機能はPersona限定の機能です。

おしまい
args4j defaultを表示させない方法

## 概要
先日args4jを使っていて、以下のような現象に悩まされました。
defaultの部分が自動生成される。

```java
-h (--help)    : print usage message and exit (default: true)
-v (--version) : print version (default: false)
```

## 解決策
API仕様を見たところ、withShowDefaultsというメソッドがデフォルトでtrueを返しているようなので、falseを渡してあげます。

```java
ParserProperties parserProps = ParserProperties.defaults().withShowDefaults(false);
```


```java
-h (--help)    : print usage message and exit 
-v (--version) : print version 
```
defaultが表示されないようになりました。

## 参考
API仕様
<https://args4j.kohsuke.org/args4j/apidocs/org/kohsuke/args4j/ParserProperties.html>
ISNULLが効いていない(ように見える)場合

ISNULLでNullを別の値に置き換えることができるが、以下のような場合置き換えることができずUI上Nullが返ってきているように見える。

```sql
SELECT
  ISNULL(COUNT(column2), 0)
FROM
  table1
WHERE
  column1 = 'xxx'
GROUP BY
  column1
;
```
column1が'xxx'のレコードが存在しない場合は「0」という結果を期待するが、実際に返ってくるのはNullで、ISNULLが効いていないように見える。
実際はCOUNT(column2)がNullを返しているのではなくSELECTの結果自体が0件なので、ISNULLを実施する行がそもそも存在しない。
以下のSQLの方がイメージしやすい。

```sql
SELECT
  ISNULL(column1, 'aaa')
FROM
  table1
WHERE
  1 = 2
;
```

結果は0件なので、当然ISNULLを実施するcolumn1も存在しないので結果はNullとなる。

どうしてもCOUNTの結果がNullの場合に0と出力したい場合は

```sql
SELECT
  ISNULL(
    (SELECT
       COUNT(column2)
     FROM
       table1
     WHERE
       column1 = 'xxx'
     GROUP BY
       column1), 0)
;
```

---
* 参考  
https://stackoverflow.com/questions/21291136/isnullcountx-0-not-returning-0-when-null
[excel] ToDo表で、statusが「完了」になった行をグレーにする

**もくじ**
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f

# やりたいこと
エクセルを使ってToDoリストとかQA表などを作った時に、下の例のように、「status」の列が「完了」になったら、終わったことをアピールするためにその行をグレーにしたいときがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/a00f6566-a392-8df4-78ff-3e2c0c715e87.png)

条件付き書式でいつもやっているのだが、毎回どういう設定すればよかったか忘れてしまうので、いっぺん書き留めておく。

# やり方

- その一行のセル選択する。(今回は「G」行で実施。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/83436002-817a-f853-12d3-cc5cc68d965b.png)

- 条件付き書式のウインドウを開いて、`次の数式を満たす場合に値を書式設定`の欄に`=$G9="完了"`と入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/f88a9763-596f-5efd-b4e6-241f0e4ed430.png)
- 「G9」は、その行の中のstatusに当たるセルを指定する。
- また、`=$G9="完了"`で、行の前にだけ＄マークを付けること。
- 最後に、「書式」で、完了したときにどういうセルの書式になってほしいか設定する。(ここでは背景が灰色になるようにした)

これで、その行については、statusのセルを「完了」にすると、灰色になる。

これだけだとその一行だけなので、その行をコピーして「書式のコピー」を全行にかけてやると、お望みの表ができる。

# 参考
Excel(エクセル) 完了した行をグレーにする方法
https://itsakura.com/excel_greyout

→この参考ページそのままです
Local By FlyWheelで404が出て焦ってる人集合

Local by FlywheelはWordPressの動作環境をプロジェクトごとに構築できるツールです。自分のWebサイトの投稿の表示クエリをいじりたいので、ローカルに開発環境がぱぱっと欲しいので利用したいと思いました。Dockerを使うと、noxの起動ができなくなるので、Dockerは利用しませんでした。

## 現象
1. Local by Flywheelをインストール
1. 管理コンソールから、ViewSiteをクリック

Edge、Choromeにて404エラーを確認。

管理コンソールとは↓です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26011/cb541a2b-fec7-c727-6cb5-670f96570929.png)

Qiitaすごい。Ctrvでクリップボードの画像コピペできる。ストレスフリーだ。

## 障害原因調査
障害原因の調査の為に確認したことは下記です。

### MySQLのWebの管理コンソール（Adminer）は起動する
MySQLの起動確認をしたところ、Webの管理コンソールが開いたので、Webサーバーは起動しているのかなと思いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26011/440f28e9-8f31-d7ec-3e29-97d01e0a7d44.png)

### hostsへの書き込み権限の問題ではない
次にhostsファイルの確認をしたところ、hostsへの記載は問題なく行われていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26011/8c8bc3fa-d27b-583d-3717-f40042b63c18.png)

## 障害解消の為の取り組み
解消される可能性は超低いけど、とりあえずでやってみる。

### enginxのserver項目の書き換え、対象ポートの開放を行う
1. nginx.conf内のserver項目のlistenを80→8888に変更
2. windowsのファイアーウォールの詳細設定から新しいルール作成でTCP:8888を開放

結果はConnection Refuse
ふぁっく

## ぐぐって調べてにわか知識を得る
1. Local by Flywheelは、Virtualboxを利用していること　
2. 内部でDockerを利用していること

### にわか知識の中に発生する疑問
2項目上げましたが、自分の環境だと、あれ？ってなることがありました。

### Local by Flywheelは、Virtualboxを利用していること
個人のブログが情報源です。VirtualBoxはアンインストールしていたにも関わらず、何故かAdminerには接続できました。

### 内部でDockerを利用していること
個人のブログが情報源です。ベースって書かれてたから、DockerのホストOSはどれなんだろう。VirtualBoxで稼働しているOS？それともWindows？とにかくうちのDockerはHyper-V切ってあるから動かないはずなんだけどな。

## あきらめてXampp入れてみる 
ここでもう30分くらいたってたのでギブしようと思ってXampp入れたところApacheが起動しない。ただ、管理コンソール上にログが出るので、ログを確認したところ、80番ポートが占有されているとXampp様に御教示頂きました。そのスクショがないのが残念ですが。

## 原因獲得
これが分かればもう犯人探すだけですね。
コマンドプロンプトで80番を探す。

```
netstat -nao | find "80"
 TCP         0.0.0.0:80             0.0.0.0:0              LISTENING       4
```

PID4番をタスクマネージャから探す。項目に出てない場合があるので、タスクの明細を右クリックして追加。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26011/202d9f49-474a-352a-bdd9-e9c6e499003e.png)

PID4番は、落とすことができないので、80番ポートを利用しているアプリを落とします。
自分の場合は、IISが起動していたことが原因でした。IISとは、Windows標準のWebサーバーです。
C#のプロジェクトとかで良く使ってる印象。（個人の感想です）


### 無効にする

コルタナにWindowsの機能の有効化または無効化と入れたのち、コントロールパネルと下に書いてあるやつをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26011/2c0bfb10-e8ec-5f64-3d7d-51f648973869.png)

「インターネット インフォメーション サービス」「World Wide Web」の■をクリックして無効化する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26011/cef87bd7-3ad6-f202-ba8a-9b4c7ddae52e.png)

そしてOK押して終了。

Xamppアンインストールして、Local By FlyWheelを起動し、ViewSiteクリックしたところ、無事WordPressが立ち上がりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26011/92b56758-e631-38f2-780c-ffa9d9ccd594.png)


うぇーい。
openssl1.0系がbrewから消えたことでrailsでエラーが発生する時の対処法

##  openssl1.0系がbrewから消えたことでrailsでエラーが発生する時の対処法
次のようなエラーが発生する場合の対処法です。
`Library not loaded: /opt/local/lib/libssl.1.0.0.dylib (LoadError)`

openssl1.1系にアップデートされた状態で、postgresqlのバージョンが古いとエラーが発生します。
対処法としては、
`brew upgrade postgresql`でpostgresqlをアップデートしたら直りました。


参考までに、openssl1.0系がbrewから消えた原因のHomebrewのコミットはこれです。
https://github.com/Homebrew/homebrew-core/commit/0349a7ca76f483483c6d5c1d4cfe6b458dee2665

## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Oracle Bronze SQL基礎I -データの制限およびソート-

#データの制限およびソート

本日もSQL基礎の勉強。この分野は割と得意だったので、
結構割愛しているところ多いですが、
自分の備忘録程度の記事なので、悪しからず。。

##Order by 句

SELECT文の実行結果のソートにはOrder by句を使用します。
ORDER BY句では、ソートする項目として、
列別名やSELECT句に指定されている順番（数値）を指定できます。

なお、SELECT文の中で列別名を使用できるのはORDER BY句だけです。
値にNULLが含まれる場合、ソートするとNULLは最大値としてソートされます。

```sql:anzuame.sql
--▽通常の記載
SELECT * FROM '表名1' WHERE '条件1' 
  ORDER BY '列名1' [ASC|DESC][, '列名2' [ASC|DESC]...];

--▽NULL値を最後に持っていきたいとき
ORDER BY '列名1' DESC NULLS LAST;
```
ソートカラムはテーブルに存在していれば、
SELECT句に記載していなくとも使用することができます。

|昇順　　　　|降順　　　　　|
|:---------|:-------------|
|ASC(省略可)|DESC(省略不可)|

SELECT句にて、大文字と小文字を区別するためなどに
二重引用符(")で囲んだ列別名を使用している場合は、
ORDER BY句でも**同様に列別名を二重引用符(")で囲む必要**があります。
(※「SELECT name "na"」とか書いたら「Order by "na"」で書くということ)

##ワイルドカード
文字検索の際に、「藤〇さんの人数を知りたい」というような
一部が明確に決まっているのに対して、
他部分が明確じゃない文字列等を検索にワイルドカードを使用します。

ワイルドカードの種類は2種類です。

|%               |_          |
|:---------------|:----------|
|0文字以上の任意の文字列|1文字の任意の文字列|

上記で述べたような「藤〇さん」で解説すると、
・[藤%] の場合、藤さんも藤本さんも、藤井寺さんも表示されます。
・[藤_] の場合、藤本さんは同様に表示されますが藤井寺さんと藤さんは表示されません。

ワイルドカードは組合せて、実行することも可能です。
例えば、山岸、山、大山野、石山、山本屋、天王山の6人を登録していたとすると、
各組合せ結果は、下記の通りとなります。

|組合せ|結果|
|:---------------|:----------|
|_山|石山|
|山_|山岸|
|%山|山、石山、天王山|
|山%|山、山岸、山本屋|
|\_山_|大山野|
|_山%|石山、大山野|
|%山_|山岸、大山野|
|%山%|山、山岸、石山、山本屋、大山野、天王山|

また、検索の際の文字パターンに"_"が含まれている場合、
ESCAPEオプションを指定して「_」をリテラルとして扱う必要があります。
(名前を「名字_名前」形式で登録するような場合、ワイルドカードが値に含まれてしまう)

##IN演算子

INは検索の際に、含まれるか否かで用いられます。

```sql:anzuame.sql
WHERE '列名1' IN ('条件');
```
IN演算子は、SQL文の実行時に内部的に
OR演算子による条件のセットとして処理されるので、
実行時のパフォーマンスに違いはありません。

##LIKE演算子

LIKE演算子を使用すると、指定した文字パターンに一致した行を検索できます。
文字パターンには、「_」や、「%」といった、ワイルドカードを利用できます。
ワイルドカードをリテラルの一部として使用する場合は、
ESCAPEオプションを指定してワイルドカードをリテラルとして扱えるようにしなければなりません。

##置換変数
SQL PlusやSQL Developerなどのツールでは、置換変数を利用できます。
置換変数を利用すると、WHERE句の条件などに指定する値を、
SQL文の中に直接記述するのではなく、実行時に値を指定できるようになります。

置換変数には「&置換変数」と「&&置換変数」の2種類があり、
「&置換変数」はSQL文実行後に変数の値が破棄されますが、
「&&置換変数」はセッションを切断もしくはUNDEFINEコマンドで破棄するまで値が保持されます。

例えば、下記のSQLようなSQLを組んだ場合、

```sql:anzuame.sql
SELECT * FROM &&1 WHERE '列名1' = '&2';
```
続けて2回目にこのSQL文を実行すると2のみに値を入力するよう促されます。
なお、置換変数はWHERE句だけではなく、SQL文の全ての箇所で使用できます。

#次回

次回は副問合せのところのまとめをしようかなと。
今日は、とても寒くて、乾燥しているので、いつもより加湿器に頑張ってほしい。。。
唇を舐める癖がやめられず、今日も裂けまくりで、
リップクリームを塗るもののやっぱり簡単には治らない。。。


随時更新中＠あんず飴
MediaPlayer Classを使う

MediaPlayerの機能を使ってみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505344/40d450a5-5b9b-0446-da69-80754f3d778f.png)



簡単なI/Fを作ります。

```xml:activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical"
    android:gravity="center">

    <Button
        android:id="@+id/btnPlay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Play"
        android:onClick="onPlay"

         />

    <Button
        android:id="@+id/btnPause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Pause"
        android:onClick="onPausePlayer"/>


    <Button
        android:id="@+id/btnStop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Stop"
        android:onClick="onStopPlayer"
        />


```
res->new resource directory->resource type(raw)->resource name(好きなように）、を作ります。そして、mp3かwavなどの音声ファイルをこのdirectoryにコピペします。
（注意：ファイル名は小文字オンリー）

```java:MainActivity

public class MainActivity extends AppCompatActivity {

    MediaPlayer mp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onPlay(View v){
        /*MediaPlayer consumes too much memory resource
        therefore we only create it when we want to play something
         */
        if (mp==null){
            /*makesure there's no old one before create new one
            we don't want to create too much and use too many resource
             */
            mp= MediaPlayer.create(this,R.raw.globe);
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    DestroyPlayer();
                }
            });
        }

        mp.start();
    }

    public void onPausePlayer(View v){
        if (mp!=null) mp.pause();

    }

    public void onStopPlayer(View v){
        DestroyPlayer();

    }

    private void DestroyPlayer(){
        if (mp!=null) mp.release();
        mp=null;
        Toast.makeText(this, "Media Player destroyed", Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onStop() {
        super.onStop();
        DestroyPlayer();
    }
}

```
スネークケースをキャメルケースに変換する方法

みなさんこんにちは！！
この記事ではSwiftにおいてスネークケース:snake:をキャメルケース:dromedary_camel:に変換する方法について解説していきます！！
（初めての本格的な技術的な記事なので稚拙な文章、知識の浅さがありますがお許しください！というかご指摘ください:bow_tone1:）

##今回の目的
先人の方が投稿している記事にはなぜ理解しておかなければならないのか？どういったところで活用するのかが初学者の私には難しかった:sweat_drops:
そのため理解していなかった昔の自分に説明するつもり噛み砕いて説明しようと思ったからです！（考えを整理するためでもあります！）

##そもそもの話（スネークケース:snake:、キャメルケース:dromedary_camel:とは？？）
####キャメルケース：簡単にいうとSwiftで推奨されている形です

```swift:CamelController.swift


final class ViewController {

private func camelSample() {
    print("ラクダ")
}
```

このcamelSampleをみて感じることがありませんか。。。？
そうなんです。。。凸凹しているでしょ？？？？
だんだん見えてくるんですラクダに！！:dromedary_camel:
つまりラクダみたいな塊＝キャメルケースなのです:innocent:

####スネークケース：JSONとかでよく返ってくる奴ら

```Sample.JSON
{
first_name: "蛇塚"
last_name: "太郎"
}
```
APIを叩いてる時などに目にする形です。。。
先ほどのキャメルケースと違う点はどこでしょうか？？
単語のつなぎ目が大文字ではなく＿で繋がれています！
もう見えてきますよね！！！
＿って蛇なんです:snake:
つまりは単語の区切り目を＿でつないでいる＝スネークケースなのです:innocent:

##Swiftにおけるスネークケースの取り扱いかたについて（CodingKey）
ざっくりとキャメル、スネークケースについて理解ができたところでどんな場面で扱うことのかを解説していきます！

先ほどのデータをCodableを使用して表示することを考えていきますと。。。

```swift:SampleResponse.swift
struct User: Codable {
    let first_name: String,
    let last_name: String
}
```
と初学者のみなさんは直感的に書くと思います（実際に私がそうでした:baby_tone1:）
しかしこれで書いてしまうと大きな問題が存在します。。。
それはコード上にキャメルケースとスネークケースが混在する危険があるということです！
Swiftではキャメルケースが推奨されているのでスネークケースがコード上に介入してくのはよろしくありません:disappointed_relieved:
（スキーに海パンでいくようなものです。。。）


気持ちが悪いですよね。。。
キャメルケースとスネークケースが混在してしましました:scream:

######これを解消するのがCodingKeyです！！

```swift:SampleResponse.swift

struct User: Codable {
    let firstName: String,
    let lastName: String
    
    enum CodingKeys: String, CodingKey {
        case firstName = "first_name"
        case lastName = "last_name"
    }
}
```
これによりスネークケースをキャメルケースにすることができました！！
特定の値を取り出す時に自らがcaseで設定したもの命名から取り出すことができます！
→コード状にスネークケースが介入するのを防げました:v:

##:snake:最後に:dromedary_camel:
今回は概要を理解するための簡単な内容でした。。。
なぜそのままJSONの名称を使うのがよろしくないかについては名称が縛られてしまうためです。。。
→名称は解読性に大きな影響を与えてします→x自分で考えてつけたいですよね！！
まだまだ本来は奥が深いものですが先人様達の記事を参考にして勉強していきます！

今回は概要だけ、さらには稚拙な文章でしたが役に立つことができれば幸いです:relaxed:

次回の記事は本格的なAlamofierの使い方について解説していきます！！（今回の具体的なコードも掲載する予定です）

質問点やご指摘があればどしどし絡んできてください:bow_tone1:（虐めないでくださいね。。。）
Visual Basic Transactionサンプル

# トランザクション

データの追加や更新を行う際に

すべての処理が正しく行われた場合のみ変更を反映させたく、どこかで失敗した場合は

すべての処理が行われないようにするためのもの


# サンプル

```visualbasic
Imports System.Data.SqlClient

Public Class Form1

    Private cn As SqlConnection = New SqlConnection()
    Private cmd As SqlCommand = New SqlCommand()
    Private cn_str = "接続文字列を設定"

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        cn.ConnectionString = cn_str
        cn.Open()
        cmd.Connection = cn
        cmd = cn.CreateCommand()
        cmd.CommandType = CommandType.Text

        Dim sqlTransaction As SqlTransaction

        ' トランザクションを開始
        sqlTransaction = cn.BeginTransaction
        cmd.Transaction = sqlTransaction



        Try
            ' 複数のコマンド実行
            cmd.CommandText = "INSERT INTO USERS (Id,Name,Age) VALUES (4, 'name', 12)"
            cmd.ExecuteNonQuery()

            cmd.CommandText = "INSERT INTO USERS (Id,Name,Age) VALUES (, 'second user', 24)"
            cmd.ExecuteNonQuery()

            sqlTransaction.Commit()

        Catch ex As Exception
            sqlTransaction.Rollback()
            MessageBox.Show(ex.Message)

        End Try

        cmd.Dispose()
        cn.Close()
    End Sub

End Class

```

上記のサンプルの

```visualbasic
sqlTransaction = cn.BeginTransaction
```
の部分からトランザクションが始まり

```visualbasic
sqlTransaction.Commit()
```

にて処理を行い

もし何かしらの例外が発生した場合は

```visualbasic

sqlTransaction.Rollback()
```

によって処理をすべてロールバックしています。

終わり。
Microsoft Message Analyzerが廃止

一先ず個人用メモ

#Microsoft Message Analyzerが廃止に
netsh traceでパケットキャプチャしてWireSharkで解析出来るようにフォーマット変換しようと思ったら、MMAが配信終了してました。ビックリ。
https://docs.microsoft.com/en-us/openspecs/blog/ms-winintbloglp/dd98b93c-0a75-4eb0-b92e-e760c502394f

##代替案
https://chentiangemalc.wordpress.com/2018/10/08/convert-netsh-trace-etl-to-pcap-with-powershell/
こんなの作ってくれてる人がいたので利用してみたいと思います。
利用したらまた書き直そう（多分）
mockeryのOn()にはTimes()を指定しよう

## TL;DR
https://github.com/vektra/mockery のmock指定時の注意点。

1. 同じ引数
2. 返り値が場合によって異なる

の条件を満たすmockを使いまわす場合は `On()` のメソッドチェーンで `Times()` をつける。
それが難しければ `t.Run` のなかで `new` すること。

回数を指定しない場合 `On()` の上書きが効かないので、最初にセットされた `Return()` を返し続けることになる。

## 例

```Go
func TestHoge(t *testing.T) {
	mockFoo := new(mocks.Foo)
	mockBar := new(mocks.Bar)

	t.Run("test - first", func(t *testing.T) {
		mockFoo.On("FuncA", mock.Anything).Return(1)
		mockBar.On("FuncB", 1).Return(1)

        // テストコード
	})
	t.Run("test - second", func(t *testing.T) {
		mockFoo.On("FuncA", mock.Anything).Return(2)
		mockBar.On("FuncB", 2).Return(2)

        // テストコード
	})
}
```

（ `test - first` → `test - second` の順にテストが流れると想定する。）
上記のようなテストがあったとき、mockが返す値は以下のようになる。

|   | mockFoo.FuncA | mockBar.FuncB |
|---|---|---|
| test - first | 1 | 1 |
| test - second | 1 | 2 |

原因は、モックが **同じ引数** で `On()` を上書きできないため。
`Return()` 指定時にあらかじめ回数を指定されない限り、最初にセットされた `Return()` をずっと返し続ける様子。

どちらのテスト内でも引数 `mock.Anything` を渡されている `FuncA` は `test - second` の中でも`1` を返している（ `test - first` でセットされたため）が、
`t.Run()` の中で毎回違う引数を渡されている `FuncB` はそれぞれ期待の値でモックできている。

## 対応策
呼び出し回数を指定する。 `Times()` など。
回数を指定すると、その回数に到達したときに自動的にモックを解除してくれる。

ちなみに、**指定の回数 < 実際に呼ばれた回数**になるとPanicになる。
`mock.AssertExpectations(t)` を指定しておくと、
**実際に呼ばれた回数 < 指定の回数**だったときにもエラーにできる。
これらもテストとして有効利用できるかも。

- `Once()`
  - 1回だけ呼ぶ
- `Twice()`
  - 2回だけ呼ぶ
- `Times(i int)`
  - `i` で指定した回数だけ呼ぶ。3回以上指定したい時はこれ

```Go
func TestHoge(t *testing.T) {
	mockFoo := new(mocks.Foo)
	mockBar := new(mocks.Bar)

	t.Run("test - first", func(t *testing.T) {
		mockFoo.On("FuncA", mock.Anything).Return(1).Once()  // 1回
		mockBar.On("FuncB", 1).Return(1).Once()  // 1回
	})
	t.Run("test - second", func(t *testing.T) {
		mockFoo.On("FuncA", mock.Anything).Return(2).Twice()  // 2回
		mockBar.On("FuncB", 2).Return(2).Times(3)  // 3回
	})
}
```

どうしても `Times()` の指定が難しい場合は、 `t.Run()` の中で毎回mockを作り直したほうが事故を防げる。
flutter packages getでCould not find a file named "pubspec.yaml" in git@github.com: エラーが出たときの対処法

# Could not find a file named "pubspec.yaml"

とあるFlutterプロジェクトをクローンして`flutter packages get`を実行した際、以下のようなエラーが出てパッケージのインストールが出来ませんでした。

```
$ flutter packages get
Could not find a file named "pubspec.yaml" in git@github.com:xxxxx/yyyyy.zzzzz.git 
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn.
Running "flutter pub get" in xxxxx-yyyyy-zzzzz-apps...             
pub get failed (1)
```

いろいろと試してみた結果、何とかエラー解消できたので対処法をメモしておきます。

# 対処法

今回はFlutter Communityリポジトリで見かけた情報を元に、対処を行いました。
[Could not find a file named "pubspec.yaml" · Issue #50 · fluttercommunity/flutter_launcher_icons](https://github.com/fluttercommunity/flutter_launcher_icons/issues/50#issuecomment-450067269)

## キャッシュファイルを削除する

Flutter SDKのインストールフォルダをたどり、`/flutter⁩/.pub-cache⁩/⁨git`フォルダ配下にあるキャッシュファイルをすべて削除します。

その後、再度`flutter packages get`を実行したところ、正常にパッケージ取得することができました。

```
flutter packages get
Running "flutter pub get" in xxxxx-yyyyy-zzzzz-apps...         3.5s
```

ちなみに`flutter clean`や`flutter pub pub cache repair`は、効果がありませんでした。

最初は該当パッケージで指定されたGitHubリポジトリへのSSH接続の問題かと思ったのですが、どうやらキャッシュファイルが悪さしていたようです。

慣れない開発環境だとハマりどころがわからず、原因追求に手間取ってしまいますね。
初心者から data scientist目指して駆けだした人のお話

##はじめに
将来的にdata scientist目指してる大学4年生が2019年10月から勉強を始めた軌跡を
「初心者から data scientist目指して駆けだした人のお話」というテーマでqiitaに投稿していきたいと思います。
自己紹介やきっかけなども含め最初の2ヶ月で学んだことについて書いています。
##自己紹介
- 来年から未経験で大手slerのエンジニアとして就職予定
- MARCHレベルの大学の大学4年生
- 大学では統計学や経営情報の分野の専攻
- Pythonの本格的な勉強は2019/10月から
- それまでは軽くRを使っていたのとHTML\CSSで簡単なwebサイトを作ったことがある程度

##機械学習の勉強のきっかけ
- ゼミの卒論で高度な分析をしたかったから
- 完全に未経験ではなくエンジニアとしてスキルを身につけたかったため
- 大学生として残りの期間本気でなにかを勉強したかったため
- 数学的なアプローチがすごく興味がある
- 今のホットの分野の機械学習に元々興味があったから
- slerという業界がそのままなくなると言われていることへの不安
- web業界に正直なところ憧れがある

自分が学ぶこんなところです！将来に対して投資という一面が一番大きいと思います:v:
学び始めて2ヶ月経たないくらいですが徐々にわかってきたのでとても楽しくなってきました。


#下克上にむけての勉強方法
###今までやってきたこと
さて、ここからが本題です！！
箇条書きなのでとても見づらいと思いますがご了承ください:woman_tone1:

####①独学プログラマー(移動時間で少し読む程度)
→最初にプログラミングとはみたいなところに興味があったので購入
####②ProgateのPythonコース(4日間で2週)
→ざっくりと記述方法がわかる程度。プログラミング特有のオブジェクト指向の意味があまりわかっていない感じ
####③Udemyの株式会社キカガクの『脱ブラックボックスセミナー』初級編
2日間で計５時間くらいだと思います！
####④Udemyの株式会社キカガクの『脱ブラックボックスセミナー』中級偏
上記の続きの講座です。同じく2日間で計５時間くらいだと思います！
2つの講座を通じて教師あり学習・教師なし学習などの理論や実務で使えるレベルの回帰分析が学べたので本当に良かったです！初心者の方には非常におすすめです！
####⑤読書：機械学習になりたい人のための本
上記の４つでざっくり理解した上でまだ勉強したいと思ったのでプロになるにはどうやって残りの期間勉強していけばよいかをしるために読みました。３時間ほどで一通り読み終えました。
####⑥プログラミングスクールの無料体験
プログラミングスクールと言えば、web系がメインですが具体的な勉強の方法を知りたかったので、AIに力を入れているAidemyと侍エンジニアに体験に行きました。codecampさんにも行きましたがAIを本格的にやっていなかったのであまり話しを覚えていません。侍エンジニアさんは特に無料体験して良かったと感じました。スクールでの学習も考えましたが、金銭的にかなりきつかったのと、今仮に学習したとしてもコードがかけなさすぎて、講師に質問することもなければ自分で独学することがメインとなり、コスパが悪いと思いやめました。将来的にもう少し力をつけてから、スクールは検討しようと思います。
####⑦PYQでの学習
11月はほとんどこれがメインでした。
コースがいろいろあるのですが、未経験からのPython文法（勉強時間の目安が82時間～）コースを一通りやりました。
基本的なコードはかけるようになりましたが、どこまで覚えるべきかいう線引きが難しいです。
これが終わった後は機械学習コース（勉強時間の目安が42時間～）をやっています。現在進行形です。
####⑧読書：人工知能プログラミングのための数学がわかる本
Aidemyさんの無料体験をした際に進めてもらった本を買って読みました。
だらだら読んでいたのと載っている問題を解いていたりしていたので2週間くらいかかりました。
####⑨読書：人工知能は人間を超えるか ディープラーニングの先にあるもの 
11月20日くらいから読み始めました。人工知能関連でもっとも有名な書籍だと思います。5日くらいで読めそうです。
とても面白かったです。
####⑩数学：線形代数のキャンパスゼミ
機械学習になりたい人のための本で記載がありました。
線形代数の知識は機械学習の理解には必須とのことなので大学２年生以来ですが、学習をしています。
2週間くらいかかると思います。
##＊その他
####①タイピングの練習
勉強の生産性の向上のために必須だと思います。e-typinngというサイトを使っています。
2019/11/20くらいから毎日30分やっています。
####②英語の学習
2019/11/24のTOEIC(L/R)を受験。10月中は平均1.5時間。11月の試験前は3時間くらい使って勉強してました。
1年前に700点だったので800点目標で勉強してました。
社会人になったら仕様書が英語なのと今後Couseraなど海外のサイトで勉強していこうと思っていたので勉強していました。
####③ゼミの卒論(大学の後期の期間)
もともとRを使ってやっていたのですがせっかくpythonを勉強しているのでpythonで分析をして卒論を書いています。
サッカーのJリーグのデータ分析をやっています。貴重なアウトプットの場になっています。

###これからやっていきたいこと(2019年12月中)
①TEAM AIの勉強会への参戦
②試しにKagguleに挑戦→これも勉強会の参戦予定
③pyqで機械学習をメインに演習問題をやってみる
④線形代数のキャンパスゼミ(12月10日までに1周)
⑤統計検定2級を調べ、勉強の開始

###今後の野望
E資格：ディープラーニングを実装するエンジニアの技能を認定する
G検定：ディープラーニングを事業に活かすための知識を有しているかを検定
ここからの資格がおもしろなので勉強してみようと思います
###最後に
これからも試行錯誤しながら頑張っていきたいと思います！！！
[UE4] CharacterMovementComponentのCurrentFloorから床(地面)の情報を取得しよう！

# はじめに
キャラクタの挙動や演出を制御するために、キャラクタが今乗っている床（地面）の各情報を取得するケースは多いかと思います。その時よく用いられるのがLineTraceですが、様々な資料で解説されている通り、重めの処理なので頻繁に呼び出すと問題になる可能性があります…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/0b2d0779-0bf2-ba6a-db37-ec8b34c1d897.png)
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック 　
https://www.slideshare.net/EpicGamesJapan/cedec2018-ue4-111105729/115

この問題を解決するための機能・Tipsはいくつかあるのですが、今回はたぶんマイナーな ```Character Movement Component```の```CurrentFloor```について紹介します。

# CharacterMovementComponent の CurrentFloorについて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/3ac3746b-4e2c-89da-d58f-665acf44343c.png)
みんなだいすき（？）```Character Movement Component```、キャラクタの動きを制御する過程でCapsuleやLineTraceを使った床の判定処理 （```UCharacterMovementComponent::FindFloor```など） を実行しています。その結果が```Character Movement Component```の```CurrentFloor``に格納されています。

![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/9a9b50a2-f810-29cb-91ce-86898cc1f476.png)
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/fe8ac0b8-3d8b-fd74-9f2f-caeb7d55dbb4.png)
![32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/c295e67c-dfb9-d0a3-9a23-8df6d7287640.png)

そのため、LineTraceによる床情報の取得処理を実装しなくても、```CurrentFloor```から床のActor情報や床の傾きなど様々な情報を取得することができます。
例えば床の傾きによってモーションを変えたい場合は、```CurrentFloor```->```Hit Result```->```Normal```から必要な情報を取得できます！

床の情報を使いたいときはLineTraceを使う前に、まずは```Character Movement Component```の```CurrentFloor```で実現できないか検討するようにしましょう！

# おまけ
LineTraceと異なり```FCollisionQueryParams```の```bReturnPhysicalMaterial```が有効になってないので、```CurrentFloor```の```Hit Result```から```Phys Mat```(物理マテリアル)情報を正常に取得することはできません。

```
FHitResultより

/**
 * Physical material that was hit.
 * @note Must set bReturnPhysicalMaterial on the swept PrimitiveComponent or in the query params for this to be returned.
 */
UPROPERTY()
TWeakObjectPtr<class UPhysicalMaterial> PhysMaterial;
```
そのため、```Character Movement Component```の```CurrentFloor```の情報を使って足音の制御をしたい場合は物理マテリアル以外の方法（Actor, Component Tagで判定したり…）を検討しましょう。

おしまい
FFTの結果を複素数のまま立体グラフにしてみた

#第1章. やりたいこと
エクセルのデータ分析ツール、matlabのfft関数など、高速フーリエ変換の結果は複素数で得られることが多い。
これを絶対値に直し、共役複素を折り返すことで、周波数対パワー特性を得ることができる。
当然この方法では位相の情報は失われる。
それなら複素平面をの2次元と周波数の1次元を組み合わせた立体グラフをかけば、少々読みにくいが位相情報が失われない。(3Dプリンタで出したら面白いかも。)

#第2章. やり方
周波数をxとする。複素フーリエ係数をy+ziとする。これでxyz空間を図示すればよい。

#第3章. やってみた
例として、「横軸を数直線、縦軸を約数の個数」とするような離散値をFFTにかけてみよう。
## 3-1. 失敗例
次のコードを実行した。(2<sup>18</sup>まで求めると3時間ほどかかる。2<sup>10</sup>までだとすぐ終わる。またFFTでは、データの大きさは2の冪数である必要がある。)

```matlab:ワークスペースに入力
n_max=2^18;
n=n_min:n_max;
result=divisorsCnts_progress(n,5);

sjze=size(result);
x_min=1;
x_max=sjze(1)*sjze(2);
x=x_min:x_max;
fs=1;%サンプリング周波数
T=1/fs;%サンプリング周期
L=x_max-x_min+1;
Y=fft(result);
P2=abs(Y/L);
P1=P2(1:L/2+1);
P1(2:end-1)=2*P1(2:end-1);
f=fs*(0:(L/2))/L;
plot(f,P1);
title('約数の個数の周期性(FFT)');
xlabel('f[/自然数1増加]');
ylabel('|P1(f)|');

f=fs*(0:L)/L;
f=f(1:end-1);
Y_=real(Y);
Z_=imag(Y);
plot3(f, Y_, Z_);
title('約数の個数の周期性及び位相(FFT)');
xlabel('f[/自然数1増加]');
ylabel('Re(P1)');
zlabel('Im(P1)');
```

```matlab:divisorsCnt.m
function cnt = divisorsCnt( natural )
%DIVISORSCNT 入力された自然数の約数の個数を返す。
    cnt = size(divisors(natural));
    cnt = cnt(1)*cnt(2);
end
```

```matlab:divisorsCnts_progress.m
function cnts = divisorsCnts_progress(naturals, progViewFlu)
    sjze = size(naturals);
    sjze = sjze(1)*sjze(2);
    fprintf("自然数の個数:%d",sjze);
    cnts(sjze)=0;
    tic;
    j=1;
    
    for i=1:sjze
        cnts(i)=divisorsCnt(i);
        if(toc>progViewFlu*j)
            fprintf("自然数%dの時点での時間:%d秒", naturals(i), toc);
            j=j+1;
        end
        
    end
end

```

これを観測すると、次のいくつかの図のように実部-f特性は半分の周波数に線対称、虚部-f特性は半分の周波数で値0の点に点対称となっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/3bccb41a-fd2a-c6f8-a5bc-58ce08165dc4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/14c1f3f5-f276-575a-8e93-05671eb8f52e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/13bedf5c-a365-5266-456e-20eeb55f3faa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/4557f52e-19b2-c76c-4c06-22b8d089b274.png)


実は、半分以降は「負の周波数成分」のエイリアスなので、無効だ。
したがって、次のようにする。

## 3-2. 成功例


```matlab:ワークスペースに入力
f=fs*(0:(L/2))/L;
Y_=real(Y);
Z_=imag(Y);
Y_=Y_(1:uint64(end/2)+1);
Z_=Z_(1:uint64(end/2)+1);
plot3(f, Y_, Z_);
title('約数の個数の周期性及び位相(FFT)');
xlabel('f[/自然数1増加]');
ylabel('Re(P1)');
zlabel('Im(P1)');
```

結果、次のようなグラフが得られた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/96e45980-3837-b3e5-1b00-3538249db633.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/af741ff2-e7c6-40a3-8b0f-f0f6f961cf84.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/e4c4c6e2-8895-aeb8-e61c-424b6c682b9c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/4abea701-2822-60d4-43e9-29a53b9e40ff.png)

#参考
https://jp.mathworks.com/help/matlab/ref/fft.html
EOFの&H1A(アンパサンドH1A)(アンドH1A)

全銀協フォーマット等で最後に EOF(**&H1A**)出力とあり、
**&H1A**とは何か知らなかったのと、すぐに希望の情報に辿り着けなかったので（検索スキルが貧弱）、記事にしておきます。

https://www.atmarkit.co.jp/icd/root/62/5783562.html
からの引用となりますが、

| 言語                |表記方法        |表記例  |
|:-------------------|:--------------|:------|
| C／C++／Java言語    |前に「0x」       |0x1234|
| Microsoft系BASIC言語|前に「&H」       |&H1234|
| Intel系アセンブラ    |前に「0」後に「H」|01234H|
| Motorola系アセンブラ |前に「$」        |$1234 |
| HTML               |前に「#」        |#1234 |

とのことです。
なんとなく16進数なんだろうと思ってましたが、0x形式しか使ったことがなかったので、
これで明確になりました。

ということでPHPなら

```php
chr(0x1a);
```

ですね。
【Python】合計がXになる整数の組み合わせを出力する

Output the number of combinations that add up to 10.

```python

list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def get_integral_value_combination(list, target):
    def a(idx, l, r, t):
        if t == sum(l): r.append(l)
        elif t < sum(l): return
        for u in range(idx, len(list)):
            a((u + 1), l + [list[u]], r, t)
        return r
    return a(0, [], [], target)

print get_integral_value_combination(list, 10)
```

results

```terminal
$ python test.py
[[1, 2, 3, 4], [1, 2, 7], [1, 3, 6], [1, 4, 5], [1, 9], [2, 3, 5], [2, 8], [3, 7], [4, 6], [10]]
```
同じCMS？DrupalじゃなくてWordPressでよくない？？

※ Drupal開発業務に携わる開発経験の浅い者が得た知識をメモするために投稿しております！
　間違えた表記などありましたらご指摘いただけると助かります！

#Drupalとは
Wordpressは比較的有名ですが、自分が今勉強して身につけようとしているのはDrupalという大規模な企業案件などにとっても向いている（らしい）汎用性の高いCMS（コンテントマネジメントシステム）です。
色々いじっているとやっぱりWordpressとどう違うの？って思ってしまう。。。（Wordpressはチョコチョコ触っていたので。）

なので調べてみました！

#まず結論
結論は、その用途、要は似てるんだけどこのパターンならWordpress、でもこのパターでのWordpressは自由度かなり低くなっちゃうなDrupalっていう同じCMSでサイトを構築しようと判断しているのかなと自分の中で納得しました。
なので、どちらが優れているなどはなくどちらとも使えて目的やクライアント様の要望に合わせてできるのが最強ですね！

ここからは、いくつかの側面でDrupalとWordpressを比較してみたいと思います。

#値段
まず、サイトの構築費用です。
これは、Wordpｒｅｓｓの方が安いです。
理由は、Wordpressなら頑張ったら自分でも作れちゃうしそしたらサイトは０円でそのほかのドメインやサーバー費しかかかりません！
僕もドメインを借りていますが１年で２〜3千円くらい？だった気がします。

それに比べてDrupalは、まず自分で思い通りのサイトを作ろうとしたらとっても時間がかかりますし、難しいです。
なので、外注する。Drupal専門の会社に頼む。そうなるともうたくさんお金はかかります。

じゃあ、Wordpressでいいじゃんか。
そうですね、個人のWebsiteなどならそれでもいいかもしれませんが、Drupalがそれでも世界で指示されているのには理由があります。

#学ぶ
これは開発側の話ですが、フリーランスの求人サイトなどをみてもWordpressは、いーっぱいありますよね！
Wordpressは比較的簡単なのでやる気があればVideoチュートリアルなど見てある程度作れちゃうんですね！
なので、とっかかりやすいし求人も多いけどそれだけライバルもウジャウジャですね！

Drupalは初学者には結構敷居が高いです。。。
とか言って僕もDrupalはついこないだ学び始めたので、僕はそんな敷居とか関係なくもう自分のものにしなければダメなので毎日Drupalさんと戦ってますけど笑
なので、時間はもちろんかかるけど倒せない相手ではない、諦めたらそこで試合終了だよ？と思っています笑

#汎用性
テーマやプラグインならWordpresの方が多いです。
ただし、これはまだ自分で実感できてはいませんが、多くの開発者が大規模な開発の際はDrupalの方が柔軟で効果的な開発ができると感じているそうです。
自分が、今わかるとすれば、Drupalはもうすでに一つ一つがカスタムポーストタイプ（Wordpressの）みたいになっていて、全てにフィールドという入力欄を持たせれたりなど、とにかく細かくどうとでもできる感じなんですね！
それゆえに覚えることもいっぱいあるし、初学者には大変なのかなと。。。

#セキュリティー
自分のサイトを作った後に気がかりなのは、やはり安全性。
ますます情報を安全に保管していくことが求められている中で、このセキュリティーの強さというのはとっても大事な項目だなと感じるようになりました！

これは色々な日本や海外のWebsiteを読み漁った結果、
Drupalの複雑な構造によりDrupalの方がセキュリテー上の脆弱性は少ないのかなと感じました。
（Wordpressがセキュリティー上弱いと言っているわけではないです。）
一番大事なのは、ハッカーやウイルスに常に警戒を怠らないように常にサイトと自分をアップデートすることですね！！

#最後に

Wordpressは学び始めにはもってこいだし、仕事もいっぱいあるし、でもライバルは多いなって。
自分で勉強したら、ブログを書いて自分で記事を投稿して作り上げていけるサイトを１から（サイトごと）作れるようにはなると思います。

でも、今やってるのはDrupal。。。頑張って早く覚えて安全なWEBサイトを提供したい。。。

お読みいただきありがとうございました！
一緒にDrupal勉強したい方いたらコメントお願いします笑
Tkinterで色々な背景の色を表示して比較したい

## 動作環境
Windows10
PyCharm
Python3

## 目的
Tkinterの背景色を色々と比較して確認したいが、効率的に確認する方法はないか考えて以下のコードを作成しました。自分の好みの背景色を探すときに使えるかも。

## コード
``` python3
import tkinter as tk


def main():
    root = tk.Tk()
    root.title("色々な背景の色を表示するサンプル")
    root.window_width = 400
    root.window_height = 500
    root.geometry(str(root.window_width) + "x" + str(root.window_height) + "+100+100")
    f1 = tk.Frame(root, relief=tk.RIDGE, bd=2)
    arr = ['grey', 'LightGrey', 'azure', 'snow', 'wheat', ]
    for color in arr:
        a = tk.Label(f1, text=color, bg=color, font=('メイリオ', '12'))
        a.pack(side=tk.TOP, anchor=tk.NW)
    f1.place(relx=0.1, rely=0.1)
    root.mainloop()


if __name__ == "__main__":
    main()
```
## 実行結果
<img width="237" alt="color_show.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262477/6f6e9a6a-1ed0-e9c1-7e7a-30a023130ec5.png">

## 参考サイト
利用できる色の名前は以下のサイトを見て確認できます。
http://www.tcl.tk/man/tcl8.4/TkCmd/colors.htm
上のコードの中の配列arrに色の名前を追加すれば確認できます。

## tkinterのデフォルトの背景色
webを調べても出てこなかったので、実験してみました。
以下の画像のように、gray94(r=240, g=240 b=240, #f0f0f0)かgray95(r=242, g=242 b=242, #f2f2f2)が背景色のようです。
<img width="145" alt="スクリーンショット 2020-01-31 14.10.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262477/a6473972-2980-5f8d-f7c0-899f8ab8a860.png">
システム開発のドキュメント

# ドキュメントの作成

今回の研修で、**「ドキュメントの作成」～「システム開発」の流れ**を学んだので
自身の備忘録、そして同じく困っている人の手助けになればと思います。

今回作成することになったのは、以下の 3 つです。

- 画面設計書
- DB 定義書
- テスト仕様書

作成の過程で困ること、分からないことはたくさん出てきました。

詳しい内容に関しては割愛しますが、記載していこうと思います。

## はじめに

まずはじめに、
<font color="red">意識していかなければならないと痛感した**重要なこと**</font>があります。

以下は、私が画面設計書を作成していたときの話です。

私は、画面設計書のデザインカンプをペイントで作成していました。

「えっ！？ペイント！？」ってなるかもしれませんが、
私が作成していた画面のデザインカンプは
「フォームがあって、ボタンがあって」というような簡素なものだったため、
修正も簡単にできるだろうと高をくくっていました。

そしたら案の定、修正が入るのですが、少しの変更でも 1 から作成というような状態。
毎回毎回なんて、無駄が多すぎてやっていられませんでした。

それに、修正がない完璧なものだったとしても、システムには **『機能の追加』** がつきものです。
その度に、修正が必要なわけですから、、、、Oh...

結局何が言いたいかというと、
<font color="red">**『修正は必ず入る』**</font>ということです。

作成するときは、修正するものだと意識して作成しないと
私みたいに大変なことになるかもしれません。

## 画面設計書

画面設計書で伝えたいことは、以下の通り。

- 機能は何があり、どういうものなのか
- 対応しているブラウザなどの情報
- ルーティングの情報
- 画面遷移図
- 各画面のデザインカンプと主要なパーツの情報

そして、何よりも大切なことは **『これを見れば、作成できること』**。
「これはどういうこと？」「これはどうすれば？」という質問が出るということは、
まだ完成していないということだと認識するべきだと思います。

## DB 定義書

DB（DataBase - データベース）の定義を行います。

- 使用する DB のスキーマ、テーブルの情報
- 各テーブルのカラム、およびリレーションの情報

ここの定義に誤りがあると、正常に動作せずに意図しないエラーを吐き出す原因となります。

## テスト仕様書

ブラウザテストを行うための仕様書です。

- 各画面での操作手順と期待動作の情報
- バグがあった場合の GitHub の issue の情報

ここで注意すべき点は、テストするのは<font color="red">**『何も知らない他人』**</font>ということです。

作成している自分が当然だと思うことや知識は**一切ない**として作成する必要があります。
そのため、しっかりと操作手順を示す必要があります。

しかし、操作手順の中でも入力に関しては、
入力値を完全に指定しなければならない場合を除き、制限を設けた上で内容は幅を持たせます。

そして、制限で **『エッジケース』** をテストさせることが重要です。
<font color="red">※エッジケース・・・バグが出る/出ないの境界となるケースのこと。
　　例：一桁の自然数（1 ～ 9）が入力できる・・・「0」、「1」、「9」、「10」</font>

## まとめ

- ドキュメントの修正は**必ず入る**
- 何も知らない人が見て、分かる内容である

上記の内容は、とても大切なことではあるが、非常に難しいことでもある。

そのため、
<font color="red">**『必ず他人に目を通してもらう』**</font>ことで
内容が適切であるかを判断するのが正しい。
Ruby on Rails のselectメソッドで生成されるoptionタグにdisabled属性を追加する

# はじめに
Ruby on Rails のselectメソッドでされるoptionタグにdisabledを設定したい。

# まとめ
第３引数の要素情報を入れている箇所に、ハッシュ形式で追加すれば、設定されました。
他の属性追加についても同様にできました。

```ruby
<%= f.select :users, User.all.map { |user| [user.name, user.id, {disabled: true}] } %>
```
Windowsでオーバーレイフォームを作った

昨日に続きオスロアドベント3日目。もうひとシリーズ書きたい。
# はじめに
　恋声を大幅に拡張するアプリを作ってて、声のセットを変える機能をつけました。ただ、ゲーム中だと今、どの声に変換されているか確認できず、友人とオカマ声でボイチャをするやらかしをしたのでこのオーバーレイ作りました。[完成版のアプリはこちらです。](https://kumas.booth.pm/items/1661285)オーバーレイ自体は意外と簡単でした。

# オーバーレイ的なFormをつくる

## 方針
　オーバーレイは、以下のような特徴があります。それらを順番に実現します。

- 拡大・縮小とかの枠がない
- タスクバーに表示されない
- 必要なところは半透明、必要ないところは透明
- 指定の位置にある
- 常に画面の前面にある
- クリックは透過する

## オーバレイをさせるFormをつくる
　こんな感じのオーバーレイさせるフォームを作ります。（フォームデザイナで作ってもいいですが、そこまですることもないだろということでプログラムonlyです）

```csharp
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Text;
using System;

class OverlayForm : Form
    {
        public Label lblMessage;

        public OverlayForm() {
             //表示する部品を作る
            lblMessage = new Label
            {
                Anchor = AnchorStyles.Left,
                Text = "オーバーレイふぉーむ",
                AutoSize = true
            };
            //フォームの左上に設定
            lblMessage.Left = 0;
            lblMessage.Top = 0;
            //フォームに表示
            Controls.Add(lblMessage);
        }
    }

```

これで`オーバーレイふぉーむ`と書かれたWindows Formが表示されます。

## 拡大・縮小の枠を消す
　これ以降、全て`OverlayForm(){}`の中に書いてあるものだと思ってください。

```csharp
    FormBorderStyle = FormBorderStyle.None;
```

　これで拡大・縮小の枠が消えます。

## タスクバーに表示させない

```csharp
    ShowInTaskbar = false;
```

　これでタスクバーに表示されなくなります。

## 半透明にする

```csharp
    TransparencyKey = BackColor;
    Opacity = 0.7;
```

`TransparencyKey`で背景色の設定を、`Opacity`で色のあるところの透明度を設定しています。

## 画面上の位置指定

```csharp
    StartPosition = FormStartPosition.Manual;
    Location = new Point(0, 0);
```
`StartPlsition = FormStartPosition.Manual;`で画面上の位置を指定できるようにして、`Location`で位置指定します。

## 常に画面の前面に出す

```csharp
    TopMost = true;
```
　これで常に画面の前面になるはずです。ただし、FPSゲームなどではチート対策等で無効になる場合があるので気を付けてください。（ゲームでも使える方法があったら教えてほしい）

## クリックを透過させる

```csharp
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x00000020;
            return cp;
        }
    }
```

　こいつだけ少し特殊で、`OverlayForm(){}`の外側です。何をしているのかというと、Formを作るときに属性を追加しています。その結果、このFormにはクリックできず、下のフォームにクリックが移ります。

# おわりに
　オーバーレイってかっこいいけど悪用しないでね。

←back
[Windowsで他プロセスを操る](https://qiita.com/kumas-kumachan/items/18b3232069c91ab9e685)
[UE4]動くオブジェクトにもStatic Lightingでライトマップを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/45a27833-995f-20a4-f762-96e5524138f9.png)
なんともひどい絵が出ていますが。。。。

UE4では、ライトマップによる静的ライティングを行いたいオブジェクトはMobilityをStaticと設定する必要があります。もしもStaticに設定されたオブジェクトを動かすと、ライトとの関係がダーティとなり静的ライティングが無効になり動的ライティングに切り替わります。そのようにライティングとしての正しさを優先しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/cfd38027-992c-9e4a-b381-de347f33048f.png)


しかし、例えば、エレベーター、飛行機や車など乗り物の中など、動くけど室内のライトはライトマップで焼き付けたいというユースケースは多くあります。その様な需要に答えるため、MobilityがStaticじゃないオブジェクトにもライトマップを付与する設定があります。メッシュコンポーネントの中のLightingカテゴリにある Lightmap Typeです。 (古いUEでは Light as if staticという機能でしたが現在はこのLightmapTypeに切り替わりました。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/d38ed16f-1297-45f6-50a4-b805f7f5e152.png)

上図の様にこの設定をForce Surfaceに変えることで、例えばMovableなオブジェクトにもライトマップを与えることができます。例えば、その様に設定した球体を下図のように配置しライトビルドを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/9a314eb2-6dac-0153-b64a-0b9fa72872a1.png)

そして例えばこのオブジェクトをゲーム中に上下に振動させます。従来ならば動的ライティングに切り替わるのが、ライトマップを用いたままとなっているのがわかるかと思います。（そのかわり、この雑な検証シーンではライティングが破綻しておりますが。。。そしてGifが汚くてすみません。。。）
![2019-11-28_13h56_38-Segment 1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/e3c973fe-5f1c-a8bd-6ef1-0e08361e162d.gif)


以上です。ご参考になれば幸いです。
pythonでtqdmを使って進捗を可視化する

どうもテルルです

今回はpythonで処理の進捗を可視化したいときに便利なモジュールを発見したので

紹介したいと思います

## 環境

Mac OS Catalina 10.15.1
python 3.7

##　状況

pythonを使っててcやc++と比べて遅い割に機械学習やスクレイピングをするときに

結構時間がかかる思い処理ってあると思うんですよ。

そう言った処理を走らせてるときに何も表示されないと待っていても苦痛なので

今回は進捗を可視化するモジュールを触っていこうと思います

## インストール

```
pip install tqdm
```

いつも通りpipコマンドで打ち込みます

## 進捗バーを表示させる

使い方は簡単でtqdmにイテレータブルなオブジェクトを引数で渡すだけです

```
from tqdm import tqdm
from time import sleep

for i in tqdm(range(100)):
    sleep(0.1)
```


これを実行してみるとターミナル上に進捗を表すプログレスバーが出ました


```
100%█████████████████████████████████| 100/100 [00:10<00:00,  9.67it/s]
```

これだけでも全然便利なのですが、他にも機能があるみたいなので

紹介していきます


## 説明文を追加

```
from time import sleep
from tqdm import tqdm


pbar = tqdm(range(10))
for i in pbar:
    pbar.set_description("Progress")
    sleep(1)
```

set_descriptionの引数に説明文を引数で与えることで説明文を追加できます

```
Progress: 100%|███████████████████████| 10/10 [00:10<00:00,  1.00s/it]
```
Windowsバッチファイルでリモートデスクトップを自動ログインする

複数のWindowsを管理利用していると、毎回リモートデスクトップのログイン情報を入力するのが煩わしくなってくる。
セキュリティ的には毎回入力した方がいいんだけど、機械的に台数をこなすにはバッチファイルが便利なので作成してみた。

##RDP自動ログインバッチ

###指定のサーバに自動でリモートデスクトップをする

1台ずつリモートデスクトップをする必要がある場合はこれが便利。

```autordp.bat
@echo off
Set SERVER=<ホスト名 or IPアドレス>
Set USERNAME=<ユーザ名>
Set PASSWORD="<パスワード>"

Cmdkey /generic:TERMSRV/%SERVER% /user:%USERNAME% /pass:%PASSWORD%
Start mstsc /v:%SERVER%
Timeout 3
Cmdkey /delete:TERMSRV/%SERVER%
```


趣旨とは外れているが、ユーザとパスワードを毎回入力したい場合はこちら

```autordp.bat
@echo off
Set SERVER=<ホスト名 or IPアドレス>
Set /P USERNAME=user
Set /P PASSWORD=pass

Cmdkey /generic:TERMSRV/%SERVER% /user:%USERNAME% /pass:%PASSWORD%
Start mstsc /v:%SERVER%
Timeout 3
Cmdkey /delete:TERMSRV/%SERVER%
```

###CSVファイルを使って複数台リモートデスクトップをする

まずはCSVファイルを作成します。

```rdplist.txt
<ホスト名 or IPアドレス>,<ユーザ名>,<パスワード>
```

次はスクリプトです。
先ほどのスクリプトからログイン情報を削除して、ファイルを読み込み、ループでログイン情報に埋め込んで処理していきます。

```autordp.bat
@echo off
for /F "delims=, tokens=1-3" %%i in (rdplist.txt) do (
Cmdkey /generic:TERMSRV/%%i /user:%%j /pass:%%k
Start mstsc /v:%%i
Timeout 3
Cmdkey /delete:TERMSRV/%%i
)
```

これで複数台に自動ログインができるようになります。

パスワードを記載することからセキュリティ観点としては低いものになります。
あくまで個人利用でお願いします。
【要約】デザイン科学概論 -多空間デザインモデルの理論と実践- 3章「 創発デザインと最適デザイン」

これはデザイン科学を読んだ時の備忘録として書いたものです。
興味がある方はぜひ購入してみてください
https://amzn.to/37KiFIb

# 創発デザイン

## 創発とは


**創発**とは「実的に振る舞う要素」の間で局所的な相互作用が全体の秩序となり他の「実的に振る舞う要素」を拘束することによって新しい機能や形質または行動を獲得することです。*1

創発の特徴として一部要素の特徴が全体に現れる**ボトムアップ**と 全体に現れた特徴が他の要素の振る舞いを拘束する**トップダウン**があります。
                                       
                                       
デザイン行為を創発行為として捉える場合、デザイナーの経験、人間システム、自然の摂理、社会などの構成要素を注目して試行錯誤してデザイン案として**全体を導出します**。これは新しいアイディアを創出する役割を果たしていて、ボトムアップに該当します。  

次にデザイン案を部分単位に分解して書く構成要素に**最適化(デザイン案の適用と修正)をすることによって全体の完成度を上げます**。これはトップダウンに該当します。
![](https://i.imgur.com/vjxZewn.png)


トップダウンとボトムアップを双方向に行き来することによって新しくかつ多様なデザイン案を生み出すことができます。
このトップダウンとボトムアップを持つデザイン手法でボトムアップが主となるデザイン手法を **創発デザイン(Emergent Design)** と呼びます。


### 創発デザインの特徴

 最もな特徴はトップダウンとボトムアップを双方向に行うところです。  
 既存のデザインの対象を観察してデザイン要素の関係性をい分析して、新しいデザイン案を作り出します。  
 また、トップダウンでは新しいデザイン案を目的や条件などと照らし合わせて構成要素を修正していきます。この際の修正目的や条件などとが明確であるかによって性質が変わっていきます。  
 
 デザイン過程がある程度進行している場合条件や目的がはっきりしているので、それらに合致するように**最適化**が行われます。  
デザイン過程の初期では目的や条件などが設定が難しい場合が有ります。この場合は最適化ではなく**満足化**を行います。このときの修正は数学的な概念に寄る変k網ではなく一定の基準を設定し、その基準を満たすように修正されます。そのため最適性は保証できませんが、条件に拘束されることなくデザイン候補を出すことができます。

### 適用条件と適用可能な問題

創発デザインはボトムアップとトップダウンの双方向過程をたどりデザイン案の創出とその修正を行う。
目的や条件などとは明確でも不明確でも適用デッキるので上流過程で様々な系統から検討する**大域的解探索問題(Global Solution Search Problem)** や、多様なデザイン案が求められる **多様解導出問題(Diverse Solution Derivation Problem)** への適用ができます。


 

## 最適デザイン

### 最適とデザイン

ここでの **最適** とはデザインの目標となる特性が適切な状態になることを差す。  
最適デザインでは目標を表現する特性を**目標特性** と呼びます。目標特性に関与する要素でデザイナーが変更できるものを**デザイン変数** と呼び、その関係式を**目的関数**と呼びます。 また、それらに与える成約を**制約関数** と呼びます。  

たとえば軽い杖をデザインする場合は目標特性は杖の重さなります。杖の大きさと材料はデザイン変数になりその2つの関係が目的関数になります。また、使用するに問題ない剛性が制約関数となります。

最適デザインはデザイン問題を分析して目標特性とデザイン変数や目的関数を考え、唯一の最適デザイン解を導くデザイン手法です。

### 最適デザインの特徴

特徴として創発デザインと同様ボトムアップとトップダウンの双方向性をもっています。しかし、創発デザインと違う点としてトップダウンの方が主な役割を担います。   

またこのようなトップダウン型の最適デザインは還元主義に基づいたデザインです。還元主義とは「複雑な物事は、それを構成する溶損分解し、それらの個別の要素を理解すれば元の複雑な物事全体位の性質や振る舞いすべてを理解できる」という考えで17世紀いにいデカルトが提唱したものです。

### 適用条件と適用可能な問題
適用するにはデザイン目標、目的関数や制約が全て明らかである必要があります。最適デザインは主にデザインの下流工程で使用されます。そのため、。**局所的解探索問題** や唯一解を求める**唯一解探索問題** で使用することが一般的です


*1 作中では次の論文を参照している[An approach to the emergent design theory and applications | SpringerLinkｓ](https://link.springer.com/article/10.1007/BF02481252)