OmniAICreator/Qiita-1.07M huggingface dataset:
Firebaseを利用した中耳炎診療支援Webアプリの作成　(3.リアルタイム通信処理)

プロトアウトスタジオアドベントカレンダー7発目の記事です！
##概要

前回まではこちらです。
[Firebaseを利用した中耳炎診療支援Webアプリの作成　(1.Firebaseの設定～認証方法の追加)](https://qiita.com/doikatsuyuki/private/5e1776e8fd6dc098e66e)
[Firebaseを利用した中耳炎診療支援Webアプリの作成　(2.画面の作成～canvasで画像表示)](https://qiita.com/doikatsuyuki/private/3209b6959eada6f942ae)

今回はリアルタイム通信処理を行いたいと思います。

##作成方法
**１．リアルタイム通信の記述**
  const newPostRef = firebase.database().ref();のref();を追加することでリアルタイムに通信できるようになります。

```js
 //送受信準備。リアルタイム通信するよ
  const newPostRef = firebase.database().ref();

```
**２．送信ボタンのクリックイベントを作成**

```js

  $("#send").on("click", function() {
   //ここにfirebaseに保存させる処理を記述
})
```

**3.データをFirebaseに保存する**

```js
$("#send").on("click", function() {  
//送信処理オブジェクトpush
//送信プロパティ：値で入力
    newPostRef.push({
      first: "初診",
      date: date,
      dr_name: $("#dr_name").val(),
      pt_id: $("#pt_id").val(),
      score: [score1, score2, score3, score4, score5, score6, score7],
      total_score: total_score,
      evaluation: $("#evaluation").val(),
      last_treatment: "-",
      last_treatment_effect: "-",
      recomend_treatment: recomend_treatment,
      selected_treatment: $("#text").val(),
      img: image.src
    });

```
**４．Firebaseに保存されているデータを確認**

データは「Database」の「Realtime Database」に保存されていきます。
<img width="399" alt="コンソール.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/31535703-00ae-6ad4-519c-682d2308c5c4.png">

**５．データ受信処理を記述**

onメソッドの 'child_added' イベントを取得し、受信処理を行います。  ※ child_added はFirebaseが用意してるものなので、それを用いて受信をしていきます。

```js
 newPostRef.on("child_added", function(data) {
 let v = data.val(); //データをうけとるルール
 //同じ医師名の結果のみ表示
    if (v.dr_name == name && v.first == "初診") {
      //初診時
      let str = `<p>${v.date}<br>医師名：${v.dr_name}<br>患者ID：${v.pt_id}<br>${v.first}<br>前回治療：${v.last_treatment}<br>${v.last_treatment_effect}<br>各スコア：${v.score}<br>トータルスコア：${v.total_score}<br>重症度：${v.evaluation}<br>推奨治療：${v.recomend_treatment}<br>実施治療：${v.selected_treatment}<br>鼓膜画像：<img src="${v.img}"></p>`;
　　　//ここでデータをhtmlに埋め込む
      $("#output").prepend(str);
    }
})

```
データを送信すると同時に受信処理が行われ、送信したデータが表示されます。
<img width="321" alt="受信.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453374/9fec3a96-7f58-178c-5701-cb5715da3274.png">

##考察

Firebaseを利用した中耳炎診療支援Webアプリを作成してみました。

患者さんの個人情報が漏洩しないよう電子カルテとは連動させていないため、電子カルテとアプリの両方に入力が必要となり忙しい時に使いにくいと感じました。

もっと簡単にスピーディーに利用できるよう工夫するか、機能を分離する必要を感じました。
【Vue.js + TypeScript】コンポーネント間のデータやりとりについてのメモ

# 概要
ちょっと夏休みとかちょっと冬休みとかあるとすぐ書き方を忘れるのでメモ

# 親→子にプロパティでデータを渡す（props）
```vue:Parent.vue
<template>
  <div class="content">
    <child :data="text" />
  </div>
</template>

<script lang="ts">
import Vue from "vue";
import Component from "vue-class-component";
import Child from "./Child.vue";

@Component({
  name: "parent",
  components: {
    Child
  }
})
export default class Parent extends Vue {
  text = "データだよ";
}
</script>
```

```vue:Child.vue
<template>
  <div class="content">
    {{ text }}
  </div>
</template>

<script lang="ts">
import Vue from "vue";
import Component from "vue-class-component";
import { Prop } from "vue-property-decorator";

@Component({
  name: "child"
})
export default class Child extends Vue {
  @Prop({ default: "" })
  text!: string;
}
</script>
```

# 子→親にイベントでデータを渡す（emit）
```vue:Parent.vue
<template>
  <div class="content">
    <child @handle-parent="childEvent" />
    {{ text }}
  </div>
</template>

<script lang="ts">
import Vue from "vue";
import Component from "vue-class-component";
import Child from "./Child.vue";

@Component({
  name: "parent",
  components: {
    Child
  }
})
export default class Parent extends Vue {
  text = "";

  childEvent(text) {
    this.text = text;
  }
}
</script>
```

```vue:Child.vue
<template>
  <div class="content">
    <button @click="handler('データだよ')" />
  </div>
</template>

<script lang="ts">
import Vue from "vue";
import Component from "vue-class-component";

@Component({
  name: "child"
})
export default class Child extends Vue {
  handler(text) {
    this.$emit("handle-parent", text);
  }
}
</script>
```

# 親→子のメソッドを呼び出す（refs）

```vue:Parent.vue
<template>
  <div class="content">
    <child ref="child" />
  </div>
</template>

<script lang="ts">
import Vue from "vue";
import Component from "vue-class-component";
import Child from "./Child.vue";

@Component({
  name: "parent",
  components: {
    Child
  }
})
export default class Parent extends Vue {
  $refs!: {
    child: Child
  }

  mounted() {
    this.$refs.child.hello();
  }
}
</script>
```

```vue:Child.vue
<template>
  <div class="content"> </div>
</template>

<script lang="ts">
import Vue from "vue";
import Component from "vue-class-component";

@Component({
  name: "child"
})
export default class Child extends Vue {
  hello() {
    alert("Hello!");
  }
}
</script>
```

# 子→親のメソッドを呼び出す（emit）

これはデータを渡すときと同じですね！

# 感想

暗記できません(⌒∇⌒)
64bit移植時のMSFlexGridのエラーについて

# エラーが発生

32bitのアプリケーションを64bitへ移植する際に、
OnCreateを呼び出した後に下記のエラーで止まった。

```
Program: C:\Windows\system32\mfc140d.dll
File: d:\agent\_work\2\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\occcont.cpp
Line: 925
```
俺の環境では以下のパスにファイルがある。
D:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.21.27702\atlmfc\src\mfc\occcont.cpp

`FillListSitesOrWnds`関数内の`ASSERT(IsWindow(pTemp->m_hWnd));`でアサートにかかっていた。

エラー箇所までのTRACEの内容を確認して見ると、

```
\occsite.cpp(529) : AppMsg - CoCreateInstance of OLE control {6262D3A0-531B-11CF-91F6-C2863C385E30} failed.
\occsite.cpp(530) : AppMsg - >>> Result code: 0x80040154
\occsite.cpp(531) : AppMsg - >>> Is the control is properly registered?
\occcont.cpp(919) : AppMsg - Warning: Resource items and Win32 Z-order lists are out of sync. Tab order may be not defined well.
Debug Assertion Failed!

```
と出力されていた。
英語がわからないので、グーグル先生に聞いてみると、

```
OLEコントロール{6262D3A0-531B-11CF-91F6-C2863C385E30}のCoCreateInstanceが失敗しました。
>>>結果コード：0x80040154
>>>コントロールは正しく登録されていますか？
警告：リソース項目とWin32 Zオーダーリストは同期していません。 タブ順序が適切に定義されていない可能性があります。
```

OLEコントロールに問題が有るらしい！！！

## 内容についての確認
・結果コード：0x80040154（REGDB_E_CLASSNOTREG）の意味
クラスが登録されていないことを意味します。
・{6262D3A0-531B-11CF-91F6-C2863C385E30}の意味
グリッドコントロールの意味です。

## 結果
MSFlexGridが使用できなくなっていました。
この時代に、MSFlexGridを利用している人とかどれくらい居るのでしょうか？

MSFlexGridは64ビットでサポートされていないのでCListCtrlでそれっぽくしてみる事にしました。

http://home.a00.itscom.net/hatada/windows/commctrl/listview01.html

http://www.usamimi.info/~mikanplus/windows/subedit_list2.htm
C++アプリケーションのメモリ上限について

# 32bit版アプリケーションと64bit版アプリケーションのメモリ上限について

32bit版アプリケーションを改版する機会があったので、64bitへの移行を検討してみました。

## 32bit版アプリケーションで通常利用できるメモリの上限

通常、32bitアプリケーションで利用可能なメモリ容量は2GBです。
また、動的にメモリ確保できる領域は、プログラム本体やDLLが占有するメモリエリアを除いた容量になります。

### 32bit版アプリケーションで利用できるメモリの上限を増やす方法
32bit版アプリケーションでも「LAAオプション」を利用することで、メモリ上限を4GB弱まで増やす事が可能です。

#### ・設定方法
　対象のプロジェクトのプロパティで
　**構成プロパティ**→**リンカー**→**システム**→**大きいサイズのアドレス**
　のオプションを**『はい(/LARGEADDRESSAWARE)』**に設定するだけで利用可能です。

## 64bit版アプリケーションで通常利用できるメモリの上限
8TBものメモリを扱う事が可能です。

# まとめ
x86Windowsとx64Windowsのメモリ上限比較表

|        | x86Windows | x64Windows |
|:-----------------|------------------:|:------------------:|
| 32bit版アプリケーション | デフォルト：**2GB**<br>LAA有効かつ3GBスイッチ有効：**3GB** | デフォルト：**2GB**<br>LAA有効：**4GB**  |
| 64bit版アプリケーション | 使用不可 | デフォルト(LAA有効)：**8TB**<br>LAA無効：**2GB** |

この結果から、32bitアプリケーションを64bitへ移行する事を決意しました。
Kerasでモデル平均化(Model averaging)のメモ

#モデル平均化(Model averaging)
機械学習では学習する度に結果が異なる。そのため、同じ条件で複数のモデルを作成し平均をとる。

>原文：
>Model averaging is an ensemble learning technique that reduces the variance in a final neural network model, sacrificing spread in the performance of the model for a confidence in what performance to expect from the model.

>翻訳：
>モデル平均化は、最終的なニューラルネットワークモデルの分散を低減するアンサンブル学習手法であり、モデルのパフォーマンスの広がりを犠牲にして、モデルに期待されるパフォーマンスの信頼性を高めます。

>引用：
https://machinelearningmastery.com/model-averaging-ensemble-for-deep-learning-neural-networks/

#モデルのコピー

`keras.models.clone_model`を使う。

```
Help on function clone_model in module keras.models:

clone_model(model, input_tensors=None)
    Clone any `Model` instance.
    
    Model cloning is similar to calling a model on new inputs,
    except that it creates new layers (and thus new weights) instead
    of sharing the weights of the existing layers.
    
    # Arguments
        model: Instance of `Model`
            (could be a functional model or a Sequential model).
        input_tensors: optional list of input tensors
            to build the model upon. If not provided,
            placeholders will be created.
    
    # Returns
        An instance of `Model` reproducing the behavior
        of the original model, on top of new inputs tensors,
        using newly instantiated weights.
    
    # Raises
        ValueError: in case of invalid `model` argument value.
```

`keras.models.clone_model`で複製したモデルの重みは複製されない。初期の重みはランダムに設定されるのかな。
そのため、クローン元のモデルから`model.get_weights()`で重みを取り出す。
そして、クローンするモデルに`.load_weights('my_weights')`を用いて重みを設定する。

参考:https://stackoverflow.com/questions/54366935/make-a-deep-copy-of-a-keras-model-in-python

#予測を組み合わせる
下記のURLを参考にしてみてください。
https://machinelearningmastery.com/model-averaging-ensemble-for-deep-learning-neural-networks/
プログラミングが理解できない時の対処法

## はじめに
この記事は3分あれば読めると思いますが、そんな時間もない方は、まとめ欄に飛んでください。

プログラミングを始めたての時、おそらくこんな経験があると思います。
「クラスとかインスタンスとか理解できない。。。」
「繰り返し処理意味わからん。。。」
「=とか+=とか何！慣れない。。。」

それお前だけだとか思わないでください。すみません。。。

さて、Progateでプログラミング勉強を始めたばかりのころの私が、どうやって壁を乗り越えたのか書いていきます。
~~一年前のことを思い出せるかなチャレンジ~~

## ①同じ言語のレッスンにもう一度取り組んでみる
まずは、もう一回理解できるように頑張ってみようと思い、自分が受けていたレッスンをもう一度やりました。
これによって、文法とかはなんとなく理解できるように！

ですが、**概念と繰り返しの理解が本当にできない。**

そんな中、僕の唯一の希望は他の言語もやってみたいなーという漠然とした意志があったこと。

そして、他の言語にも挑戦してみるのでした。

## ②違う言語のレッスンに挑戦してみる
さて、当時Javaを学んでいた僕は、次にJavaScriptのレッスンを受けます。
ここでもまた、クラスやらforやらが出てきました。

うわっと思いつつも、JavaとJavaScriptでなんとなく書き方が似ていることが分かります。
「あれ、forって（）の中区切ると理解できるぞ！？」
「あれ、インスタンスの生成って、JSもJavaみたいにnewつけりゃいいのか！」

ここで、2つの言語の書き方がなんとなく似ていたため、その共通点に気づいた僕はプログラミングへのやる気が出たのでした。

おそらく、似ているけれど少し違うことで、自分の中でどこが同じでどこが違うのか整理ができたんだと思います。
だから、挫折しそうな時は違う言語をやってみるのもオススメ！


## まとめ
てなわけで、僕の経験談を語りました。
記憶が曖昧なのでかなり端折ってます。

一つの言語に挫折しかけたら、他の言語に挑戦してみると突破できるんじゃないかと思ってます。
言語によってできることや書き方の癖は違えど、比較してみるとかなり似た書き方が使われていますからね。

この記事でプログラミング挫折者が少しでも減ることを祈って締めます。

僕もRubyの次はPHPとかPythonとかやってみようと思ってます。
簡単♪jQuery UIでtooltipで実装！

# はじめに
お仕事で、ツールチップの実装があったので、その使いを書き記します。
ツールチップはマウスオーバーした際に表示される枠内の補足説明のやつです。
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19460/7e950601-1420-fdbe-acaf-da96f7838d07.png)

# 材料
- HTML...お好みのページ
- jQuery...1ファイル
- jQuery UI...1ファイル
- jQuery UIのCSS...1ファイル

# 1.下ごしらえ
jQueryとjQuery UIを読み込みます。
ダウンロード版でもCDNでも可能。（jQuery UIのCSSも読み込むのを忘れずに！）
※各公式を参照

- jQuery
https://jquery.com/

- jQuery UI
- https://jqueryui.com/

```sample.html
<html lang="ja">
<head>
  <title>サンプル</title>
  <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/smoothness/jquery-ui.css">
  <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>
</head>
<body>
  <p class="test">テスト</p>
</body>
</html>
```
※ダウンロードして参照しても同じです

# 2.ツールチップの処理を追加
一文追加します。（セレクタはお好みで）
`$(".test").tooltip();`

```sample.html
  <p class="test">テスト</p>
  <script>
    $(".test").tooltip();
  </script>
```
...まだ、動きませんよね？

# 3.ツールチップで表示する内容を記入
ツールチップで表示するテキストをtitleに入れて完成！

```sample.html
  <p class="test" title="ここに出したいテキストを入力">テスト</p>
```

# 4.できあがり！
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19460/b3176b5e-6aa2-5e4c-6384-cdd24bb851eb.png)
デベロッパーツールで構造を確認してCSSを上書きしたり、オプションを設定してさらにアレンジできるのでためしてみてください。

以上
【C#】warning CS0618: 'IPAddress.Address' is obsolete: が出たとき

#結論
IPAddress.Adderessは非推奨のため、IPAddress.GetAddressBytes();を使おうというものです。

```C#
private static long NewIPAddress(IPAddress p)
        {
            byte[] addressBytes = p.GetAddressBytes();
            if (addressBytes.Length != 4)
            {
                throw new ArgumentException("Must be an IPv4 address");
            }
            int networkOrder = BitConverter.ToInt32(addressBytes, 0);
            return networkOrder;
            //ネットワークを経由するなら下の行を入れて反転させる必要がある
            //return (uint)IPAddress.NetworkToHostOrder(networkOrder); 
            
        }
```

#背景
業務で扱っているアプリケーションの修正中に、ビルドするとこのWarningがあったので調べました。Addressをそのまま返していましたが、byte型の配列としてIPアドレスを取得して、int32型に変換しています。自分が扱ったアプリケーションではこの関数を用いた部分はネットワークを経由していないため順番を入れ替えていませんが、ネットワークを経由するならエンディアンを考える必要があります。よって、返り値はNetworkToHostOrder()かHostToNetworkOrder()を使ってエンディアンを変える必要があります。

#エンディアンとは
リトルエンディアンとビッグエンディアンがあります。データのビット列を格納するときに、そのままの順番で格納するのがビッグエンディアン、反転して入れるのがリトルエンディアンです。ビッグエンディアンは人間が考えるときに分かりやすいです。リトルエンディアンは、バイト毎の並びを256進法であるとして見た場合に、アドレス+0 にあるのが$256^0$の桁、アドレス+1 にあるのが $256^1$ の桁と数値の並びに整合性があることと、多倍長加算などで最下位から順番に計算したほうが繰上りの計算がしやすいことに利益がある。現在ではネットワーク機器やCPUでエンディアンが異なっている場合があり、その場合は処理中にエンディアンを変換する必要があります。
派遣会社での情報開示

法律では派遣会社は平均賃金や派遣労働者の数をなどの情報を公開しないといけない。

>派遣元事業主は、厚生労働省令で定めるところにより、労働者派遣事業を行う事業所ごとの当該事業に係る派遣労働者の数、労働者派遣の役務の提供を受けた者の数、労働者派遣に関する料金の額の平均額から派遣労働者の賃金の額の平均額を控除した額を当該労働者派遣に関する料金の額の平均額で除して得た割合として厚生労働省令で定めるところにより算定した割合、教育訓練に関する事項その他当該労働者派遣事業の業務に関しあらかじめ関係者に対して知らせることが適当であるものとして厚生労働省令で定める事項に関し情報の提供を行わなければならない。
引用元：[労働者派遣法第２３条第５項](https://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=360AC0000000088)
WebにてGIFの使用について

# はじめに
最近、通信とデバイスの性能の改善により、どこでも多様な形式のメディアーを楽しめます。
その中でGIFはよく見えるフォーマットの中で一つである、動く画像のフォーマットです。
でも、GIFはWebで効率的なフォーマットではありません。
[GIFの仕様](https://www.w3.org/Graphics/GIF/spec-gif89a.txt)を読むと下記の文言があります。

今回はWeb上でGIFを代替する方法をご紹介させていただきます。
>The Graphics Interchange Format is not intended as a platform for animation, even though it can be done in a limited way.

つまり、GIFはアニメーション用のフォーマットではないということです。
GIFの代わりにH.264形式の動画フォーマットを使うと同じ品質でも、
約10倍のサイズ的な効率が上がります。
そしてGIFはGPUで処理が出来ず、CPUを使わなければなりません。
CPUは使えれば使いほどバッテリー消耗や発熱の原因になりますので、動画形式にコンバートするのをお勧めいたします。

動画フォーマットの交換性について心配があると思いますが、下記の資料でほとんどのモダンブラウザーとデバイスで使えるのを確認できます。
[Can I Use h264?](https://caniuse.com/#search=h264)
[Android Developers — Supported Media Formats](https://developer.android.com/guide/topics/media/media-formats#video-codecs)
[iPhone OS Technology Overview](https://web.archive.org/web/20141010100905/https://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/iPhoneOSTechOverview/MediaLayer/MediaLayer.html)

# HTML5 Video Tag
`<video>`タグでWeb上でより小さいサイズでGIFを代替ができます。
下記は例です。

```html:example.html
<!-- OLD GIF Markup -->
<img src="https://cdn.my-awesome-website.com/images/awesome-animation.gif" alt="My awesome animated image">

<!-- NEW Video Markup -->
<video autoplay loop muted playsinline poster='poster.png'>
  <!-- Specify video sources -->
  <source src="https://cdn.my-awesome-website.com/images/awesome-and-efficient-animation.mp4" type="video/mp4">
  <source src="https://cdn.my-awesome-website.com/images/awesome-and-efficient-animation.webm" type="video/webm">
  
  <!-- FALLBACK for legacy browsers! -->
  <img src="https://cdn.my-awesome-website.com/images/awesome-animation.gif" alt="My awesome animated image">
</video>
```
各attributeの意味は下記になります。
`autoplay`:ユーザがplayボタンを押さなくても自動に再生されます。
`loop`:動画を無限に繰り返します。
`muted`:GIFに音がなくてもiOSのSafariのためには宣言が要ります。
`playsinline`:iOSのSafariのために、動画がフールスクリーンにならないように要ります。
`poster`:動画をダウンロード中に表示させるイメージです。

`GIF`を`webm`にコンバートするツールには
[CloudConvert](https://cloudconvert.com/gif-to-webm), [Cloudinary](https://cloudinary.com/)などがあります。

### Giphy
[Giphy](https://giphy.com/)を使うと簡単にGIFを動画フォーマットにコンバートできます。
Webサイトを作るときにほぼ変わらない静的なGIFはこちらで変換して
あげるのが便利だと思います。

# GIFの圧縮
どうしてもvideoではなくGIFをそのまま使いたい場合にはGIFを圧縮する方法もあります。
以下は[`gifsicle`](https://www.lcdf.org/gifsicle/)というCLIツールです。
`brew`でインストールできます。
`brew install gifsicle`
例で使い方をご紹介させていただきます。
`gifsicle -O3 --lossy=80 -o compressed.gif original.gif`
optionの意味は下記になります。
`-03`:gifsicleに一番適切な圧縮方法を3回探してほしいを伝えます。
`--lossy=80`:圧縮率です。
`-o compressed.gif`:出力ファイル名です。
上記で11.4MBのGIFファイルが6MBのGIFに圧縮され、サイズが47%減りました。


# その他
上記2つ以外にもオープンソースソフトが色々ありますので、リンクを残します。
[ImageOptim](https://github.com/ImageOptim/ImageOptim)
[Giffy](https://github.com/vvo/gifify)
[Reddit Anti GIF Bot](https://github.com/wasdennnoch/reddit-anti-gif-bot)

今回の記事は下記のページを参照して作成いたしました。
[GIF 사용을 멈춰주세요!](https://medium.com/vingle-tech-blog/stop-using-gif-as-animation-3c6d223fd35a)
[Optimising GIFs for the Web](https://bitsofco.de/optimising-gifs/)

ご覧いただきありがとうございます。
【VSCode】Macでterminalから現在のディレクトリをワークスペースとしてVSCodeを起動する方法

# 前提
`code`コマンドでvscodeが起動するようにしておく必要がある
方法は[公式](https://code.visualstudio.com/docs/setup/mac)から参考
1. `cmd + shift + p`または`F1`キーでコマンドパレットを開く
2. `shell`と入力する
3. `Shell Command: Install 'code' command in PATH`が表示されるのでそれを選択
4. これでterminalから`code`コマンドでVSCode起動するようになる

# 方法
1. ターミナルを起動する
2. ワークスペースにしたいディレクトリに移動する
3. `code .`を実行する
4. 現在のディレクトリがワークスペースとして開く
Intelの古いマザーボードのBIOSやドライバーのミラーサイト

## 参考

* [Intelが古いマザーボードのBIOSやドライバーの提供を2019年11月22日で終了 - GIGAZINE](https://gigazine.net/news/20191119-intel-end-lifling-bios/)

## ミラーサイト

記事のリンク先の[VOGONS • View topic - Intel to remove all BIOS updates on November 22nd, 2019 from their website](https://www.vogons.org/viewtopic.php?f=46&t=69184&sid=215ca5c3947768c418807d3066073404&start=40) を見てみると

* ftp://ftp.spez.com.ua/driver/mb/intel/
* ftp://oisellerie.org/drivers/Intel/

などがミラーしてくれている様子。

## その他

それでも見つけきれなければHP(ヒューレット・パッカード)などハードウェアベンダー側でのドライバーダウンロードページを使うと解決することも。
Macのストレージの空き容量を増やす方法

#Macのストレージの空き容量を増やす方法
今までいろいろな方法で利用可能なストレージ容量を増やそうとしてきたが、一番効果があったのはOSを入れ直すことだった。
実際にOSを入れ直す前はキャッシュの削除やユーザーファイルの整理をやってもストレージの空きは20GB程度しかなかった。 ストレージの内訳を見てみると一番容量を圧迫していたのはシステムで100GBを超えていた。256GBのSSDを使用しているのでおおよそ半分ほどを占めていた。 しかし、OSを入れ直した後はシステムが20GB程度になり 不要なファイルやアプリも消えたため空き容量が120GBになり、OSを入れ直す前と比べて約100GBの空き容量を増やすことができた。

#再インストールの仕方
再インストールを押す前にフォーマットしてから再インストールする必要がある。
Apple公式でユーザガイドを公開しているのでこれを参考にするといいと思う。

参考
>https://entotsu44.hatenablog.com/entry/2019/09/15/060000
【Windows10】User Profile Service サービスによるログオンの処理に失敗しました。の対処法


## 結論：Windowsをセーフブートすれば直る

トラブルシューティングする場合はまず公式サイトを確認する
https://docs.microsoft.com/ja-jp/windows/

## 今回の事象
2019/11/19

富士通製ノートPC（人のマシンだから型番とか知らない）で大量のWindowsアップデートを実施した。
アップデート実施後、ログイン画面で正しいパスワードを入力しログインを実行したが「*User Profile Service サービスによるログオンの処理に失敗しました。*」というエラーが表示されログインができない状態になった。

![S__62914570.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89244/642ce699-3b6a-6c8a-62bd-d4850a24946e.jpeg)


## 原因
アップデート実施後、Windows起動時にログイン認証用のサービスがクラッシュしていることが原因
*User Profile Service*に関する仕様は以下リンク
https://docs.microsoft.com/ja-jp/sharepoint/install/user-profile-service-overview

## 対処法

以下ログイン画面からセーフブート起動を行う手順を実行する

  セーフブートのやり方
　1．Windowsにログインする画面まで起動する。
　2．Shift キーを押しながら [電源]アイコンを押す
　3． [再起動]を選択し再起動を実行

## 起動後確認手順

自動で修復が走っている場合はそのままログインできる。

セーフブートが実行されない場合は一度シャットダウンを実行し
起動時にF8キーを押し続けた状態で起動後の画面を操作する。

## 参考リンク
[Windows 10 のセーフ モードで PC を起動する](https://support.microsoft.com/ja-jp/help/12376/windows-10-start-your-pc-in-safe-mode)
[Windows 10 をセーフモードで起動する方法、覚えておくべき注意事項](https://freesoft.tvbok.com/win10/safemode/how-to-enter-safe-mode.html#safe-01)
[User Profile Service サービスによるログオンの処理に失敗しました](https://jp.easeus.com/todo-backup-resource/fix-user-profile-service-failed-the-sign-in.html)

## TODO：

- [ ] 画面のスクショもらってないので後でもらって貼り付ける。

#Tips/Technical_notes #Tools/windows
untilで繰り返し ❏Ruby❏

初心に戻って基本を学ぶシリーズ第二弾
今日はuntil編です。

彼はアマノジャクなのでfalseの時のみ中の処理を実行します。

#使い方

```ruby
until 条件式
  処理
end
```

#例

```ruby
num = 50
until num < 0
  puts num
  num -= 1
end
```

50から0まで出力されます。

ポイントは0が出力されるということです。
0はfalse,-1からtrueです。

#途中で処理を抜けたい時はbreak

毎度おなじみbreakさんの登場です。

```ruby
num = 50
until num < 0
  puts num
  num -= 1

  if num == 25
    break
  end
end
```

結果は50から26まで表示されます。

<br>
whileとuntil
時と場合によって使い分けられるエンジニアになりたいものです。

ではまた！
AWS S3 バケットについての注意メモ / Data not found. / 同じ名前のバケットを使い続ける場合は削除せず空にする

先日、S3においてハマったことがありましたので、自分用の注意点としてメモしておきます。

※ 2019/11時点情報のため、内容が古い可能性があります。ご了承ください。　:pray: 

# 「Data not found.」と表示され、削除できない

削除したはずのS3がAWSコンソール上に表示されている状態かつ、
再度削除しようとすると確認ボタンが押せず、
S3バケットのリンクを開くと「Data not found.」と表示されました。

`S3 Data not found.`で検索すると、以下記事にたどり着きました。

- [はてなブログ - AWS S3でData not foundと表示され削除できない時の対処](http://hatunina.hatenablog.com/entry/2018/10/15/202148)
- [AWS Developer Forums - "Error Data not found" in S3 bucket, and can't delete](https://forums.aws.amazon.com/thread.jspa?threadID=262821)

どうやら、削除が反映されるのに時間がかかっているようです。
（約12時間後、AWSコンソール上から削除されているのを確認できました。）

## 対処方法

削除反映に時間がかかっているため、少し待ちます。

# 同じバケット名を使い続ける場合は、バケットを削除せず空にする

前章の**「Data not found.」と表示され、削除できない**の原因を調査していたところ、
AWS公式の以下ドキュメントにたどり着きました。

- [S3 バケットを削除する方法](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/user-guide/delete-bucket.html)

> 同じバケット名を使い続ける場合は、バケットを削除しないでください。バケットを空にして、それを維持することをお勧めします。バケットを削除するとそのバケット名は再度利用できるようになりますが、さまざまな理由により、削除した本人が使用できないことがあります。たとえば、名前を再利用するまでに時間がかかる場合があり、その間に別のアカウントが同じ名前でバケットを作成する可能性があります。

という注意書きがありました。

同じバケットを削除→作成を何度か繰り替えしていたため、
前章の**「Data not found.」と表示され、削除できない**が起きたかもしれません。

## 対策

同じバケット名を使い続ける場合は、バケットを削除せず空にします。

# おわり

以上になります。
もし、気になる点等ありましたら、フィードバックいただけると助かります。 :pray:
webarenaでubuntu その57

#概要

webarenaでubuntu18.04やってみた。
vncが動かなかったので、ルータをいじってみた。
動いた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/07893daf-b268-fb3f-9e55-6316e4206443.png)

#環境

アライドテレシス　AR260S

以上。
プルリクエストテンプレート- 機能開発系 -

## 概要

* なぜこの変更をするのか、

## 対象URL

* [POST]
* [GET]
* [PUT]
* [DELETE]



## jsonデータ差分

## 実装予定項目

* 担当者()
- [ ] 実装予定の項目を、チェック可能な形式で記載する。
- [ ] 実装したらチェックを入れていく。

## テスト項目

* 担当者()
- [ ] テスト実施項目を、チェック可能な形式で記載する。
- [ ] テストしたらチェックを入れていく。
学習日記 #1 ~next_permutation~

#0. Hello, Qiita!!
始めまして。とある情報系の大学に通っている大学生です。最近、競技プログラミングを始めて、「自分はまだまだ力不足だ。」と痛感しました。

そこで、競技プログラミングで学んだことを学習日記として記録しよう思います。
今回は記念すべき１回目の投稿です。
Qiita初心者でもあるので、暖かい目で見て行ってください、、。

基本的にc++を使用します。
今回はnext_permutationについて書こうと思います。


#1. はじめに
next_permutationとは簡単に言うと順列生成してくれるものです。
順列生成とは、ある複数の要素の並び順のパターンを全て生成してくれることです。
例えば、{1,2,3}の数列があるとして、その順列の全てのパターンは、

{1,2,3} {1,3,2} 
{2,1,3} {2,3,1}
{3,1,2} {3,2,1}

と言うふうな感じです。
このような全ての順列のパターンを出してくれるのが、next_permutationです。

#2. next_permutationを使う
では実際にnext_permutationを利用した簡単なコードを見ていましょう。

```c++
:sample.cpp

#include<iostream>
#include<algorithm>

using namespace std;

int main(){
    int a[] = {1,2,3};

    do{
        for(int i = 0; i < 3; i++){
            cout << a[i] << ",";
        }
        cout << endl;
    }while(next_permutation(a, a+3));
    return 0;
}

```
上から順に見ていきます。
next_permutationを利用するには、algorithmをインクルードしなければなりません。
また、並び替えたい数列は昇順に並んでいないと全てのパターンを
出力することができ無くなります。
do while文を利用して、doの中は全ての順列のパターンを全列挙するようにしました。
また、whileの条件の中にnext_permutationを記述し、引数は数列の範囲を入れます。
next_permutationは、最後から最初の順列を生成した場合のみ false を返し、それ以外の場合は true を返します。

これを実行してみると、

```c++
1,2,3,
1,3,2,
2,1,3,
2,3,1,
3,1,2,
3,2,1,
```

このように、全ての順列のパターンを標準出力してくれます。
next_permutitaionは配列だけでなくコンテナクラス(vectorなど)を使用することもできます。

計算量は、高々(last - first)/2回の要素の交換です。

#3. 最後に
これで新しい知識が増えました！！
最後まで読んでいただきありがとうございます。

また、初めてQiitaを書いたので分かりずらかった点や間違っている点、改善点、など
あると思います。よければコメントでご指摘お願いたします！
return@の意味/returnの意味

[stackOverFlaw](https://stackoverflow.com/questions/40160489/kotlin-whats-does-return-mean)を見ても英語じゃすぐに腑に落ちなかったので、一応。

###return@launchってなんじゃい
androidの公式tutorialをやっていたら、こんな関数にぶつかった。

```SleepTrackerViewModel.kt
fun onStopTracking() {
        uiScope.launch {
            val oldNight = tonight.value ?: return@launch
            oldNight.endTimeMilli = System.currentTimeMillis()
            update(oldNight)
        }
    }
```
"return@launch"ってなんや。
もう少しわかりやすいコードを探すと、

```
fun foo(ints: List<Int>) {
    ints.forEach {
        if (it == 0) return@forEach
        print(it)
    }
}
```
####ググった結論
@labelで指定したラムダ処理({~})から脱出(return)できるということだ。
上のコードの場合、@labelをつけなければ、全てのラムダ処理から(最も外側へ)脱出=fun onStopTracking()から脱出する。


#####何が腑に落ちなかったか
返り値のない関数のくせにreturnってどゆこと。
#####ちょっと考えてみた個人的見解(多分合ってる)
- ~~returnってそもそも関数や{}から脱出するためのもので、返り値がある関数では、return の後ろについた値を持って帰れる。~~
- (ご指摘を受けての修正)returnの機能は、戻り値を持って関数や{}から脱出する事。但し、返り値が無い関数や{}の末尾のreturn Unitは省略できる。

(*ちなみに、return Unitやreturnをわざわざ書いてもエラーにはならない。)

~~今までreturnは返り値専用の乗り物だと思ってたもんで、賢くなれたかも。個人的考察で正確じゃないけど。~~
もっと賢くなれて嬉しいです。@links_2_3_4さん、ご指摘ありがとうございました。
GitHubの草をMacのメニューバーで確認できるようにしてみた

Qiita愛用者のみなさま、GitHubの草生やしていますでしょうか？
さて、今回はGitHubの草（コントリビューション）って横に長いしメニューバーにいい感じに載せられそう！と思いつき、試しにツールを作ってみました。

![スクリーンショット 2019-11-20 3.18.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/0fd237e9-cbd2-f26a-73dd-c5912845de4f.png)
⇩
![grass_light.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/d4819954-952a-248f-e881-7e8c32b9e571.png)

GitHubのアカウント名を設定するだけで、メニューバーに草を生やせます。
また、草の状態確認の頻度とスタイルも設定できます。（スタイルはメニューバー上の他のアイコンと調和するようにモノクロ調のものと、オリジナルの緑色のものとを選べます）

GitHubレポジトリにソースを公開しているので、使ってみたい人はcloneしてビルドしてみてください。
→[GitGrass](https://github.com/Kyome22/GitGrass)

# 草の取得方法

`https://github.com/users/[UserName]/contributions`にアクセスすると，コントリビューションのグラフのページに飛ぶのですが、これを利用してページのHTMLをプレーンテキストとしてGETしてパースして、`<svg>`の`<rect>`パスのみ抽出するということをやっています。JSON形式で値だけ配列で取ってこれればいいんですが、他に何かいい手はないでしょうか。

# 草のダークモード対応

草のデフォルトの緑色のままではダークモードの時に色がいい感じに見えなかったので、ダークモード用の色を別途Asset Catalogに登録して使うことにしました．
![スクリーンショット 2019-11-20 23.46.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/09e66d04-64f7-f085-a3cf-ce92386cb459.png)

独自の色指定を増やす方法は[こちら](https://qiita.com/Kyome/items/7010f309b6800a775b4f)を参考
内部で一時的に cloud_sql_proxy を立ち上げてコマンドを実行できるラッパースクリプト

内部で一時的に cloud_sql_proxy を立ち上げて mysql コマンドを実行したらすぐ落とすラッパースクリプトを書いた

# 背景

`gcloud sql connect` でも Cloud SQL インスタンスには接続できるが、接続されるまで 1min ~ 5min ほどかかる。[cloud_sql_proxy](https://cloud.google.com/sql/docs/mysql/connect-admin-proxy?hl=ja) コマンドを使ってみたらこっちの方が早かった。

すぐ立ち上がるので、必要なときに立ち上げて mysql コマンドを打って、終わったら終了するコマンドがあればそっちの方が便利そうと思った次第

# スクリプト

```bash:cloud_sql_proxy_wrapper.sh
#!/usr/bin/env bash
# USAGE
#
# ./cloud_sql_proxy_wrapper.sh [cloud_sql_proxy options] -- [command]

CLOUD_SQL_PROXY_OPTS=()
ARGS=()
for arg in "$@"; do
    case "$arg" in
        '--' )
            shift
            ARGS+=( "$@" )
            break
            ;;
        * )
            CLOUD_SQL_PROXY_OPTS+=( "$1" ); shift
            ;;
    esac
done

echo "cloud_sql_proxy ${CLOUD_SQL_PROXY_OPTS[@]}"
cloud_sql_proxy ${CLOUD_SQL_PROXY_OPTS[@]} &
pid=$!
trap "kill $pid" EXIT
sleep 3

echo "${ARGS[@]}"
${ARGS[@]}
```

使い方

```bash
./cloud_sql_proxy_wrapper.sh [cloud_sql_proxyのオプション] -- [mysqlコマンド]
```

標準出力は mysql コマンドしか受け取らないのでパイプも渡せる

```bash
echo 'select 1' | ./cloud_sql_proxy_wrapper.sh [cloud_sql_proxyのオプション] -- [mysqlコマンド]
```
Attention Branch Network - Deep Learningによる画像識別における注目箇所可視化技術について -

複雑化し、ブラックボックス化しがちなDeep Learningの説明性や判断根拠を示す技術が様々発表されてきています。
下のQiita記事はとてもわかりやすくまとめていただいていると感じました。
[ディープラーニングの判断根拠を理解する手法](https://qiita.com/icoxfog417/items/8689f943fd1225e24358)

入力に対する着眼点を盛り込むAttention機構導入の一つであるAttention Branch Network[^1]の概要について説明してみます。
著者の説明スライド[^2]を参照して説明させていただきます。

## Attention Branch Networkの概要図
<img width="654" alt="AttentionBranchNetwork_Overview_image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178888/b07036ec-6024-12fb-27fe-a733a6c8841c.png">

## 上記概要図の説明
通常のConvolutional Neural Network(CNN)を途中で分割し、前半をFeature extracter(特徴抽出)、後半をPeception branch(答えとなるクラスを推定するブランチ)とします。
Feature extractorからAttention branchを分岐してつなげ、出力するAttention mapを重みマップとしてFeature extractorからの出力と合わせて、Percepton branchに入力し、学習させます。
Attention Mapの生成により、認識結果の可視性が得られるのと、重みを与えることで認識性能向上が見込まれます。
ResNetなどの性能が高いとされるDeep Learning構造にbranchを追加する形にすることで、可視性と高検出性能を両立できる可能性があります。(どの位置でbranchを挿入するかなど、入力データにより考慮するところもあると思います。)

## 人間が機械学習の改善サイクルに入り、性能向上を目指す
また、Attention Branch Networkの著者が含まれる文献[^3]によると、HITL(Human-in-the-loop)という、機械学習システムにおけるデータ投入、学習、推論のサイクルにおいて、人の知識を加えて性能向上を図る考えが示されています。
間違って認識されたデータについて、Attention Mapを人の手で修正し、再度学習させることで正しく認識され、性能向上につながるシステムを作れる可能性があります。

## Human-in-the-loopのイメージ
同じ著者の研究グループからEmmbedding Human knowledge in Knowledge in Deep Neural Network via Attention Mapという論文が出されています。
Attention Mapが期待していたところと異なるところに反応していたことで、間違った識別がされたときにAttention Mapを人の手により修正して与え、それをもとに識別や学習をさせていくことで正しい識別にしようという考えです。

<img width="202" alt="Human_in_the_loop_image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178888/d5c59f49-11c0-d77f-1d21-8a15a8aeaa09.png">

データやアノテーションが不十分なところから始めても、可視性・説明性を与え、使用しながら機械学習・AIの性能を上げるように成長させるという要素を持たせることができそうで面白いと感じました。


[^1]: [Attention Branch Network: Learning of Attention Mechanism for Visual Explanation](https://arxiv.org/abs/1812.10025)
[^2]: [著者がMIRU2018のロングオーラルでAttention Branch Networkについて解説したスライド](https://www.slideshare.net/greentea1125/miru2018-global-average-poolingattention-branch-network)
[^3]: [Embedding Human Knowledge in Deep Neural Network via Attention Map](https://arxiv.org/abs/1905.03540)
logwatch 設定手順 覚書

検証環境
-------

Ubuntu 18.04

logwatch のインストール
----------------------

```bash
sudo apt-get install logwatch
```

logwatch と一緒に postfix がインストールされます。
logwatch は標準で postfix を使用する為、
特にこだわりがなければメール転送エージェントを
追加でインストールする必要はありません。

logwatch の設定
--------------

``/usr/share/logwatch/default.conf/logwatch.conf`` から雛形をコピーして
``/etc/logwatch/conf/logwatch.conf`` へ配置します。
下記のように編集してください。

```bash:/etc/logwatch/conf/logwatch.conf
# 自身の Gmail アドレスを指定する。
MailTo = xxxx@gmail.com
# メールの送信元(差出人)を指定する。
MailFrom = ubuntu_lxd
# logwatch のレポートの詳細度を指定する。
Detail = High
```

postfix の設定
--------------

``/usr/share/postfix/main.cf.dist`` から雛形をコピーして
``/etc/postfix/main.cf`` へ配置します。
下記のように編集してください。

```bash:/etc/postfix/main.cf
relayhost = [smtp.gmail.com]:587

#sasl setting
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain

#tls setting
smtp_use_tls = yes
```

続いて ``/etc/postfix/sasl_passwd`` を下記の書式で作成します。

```bash:/etc/postfix/sasl_passwd
# 自身の Gmail アドレスとパスワードを記述する。
[smtp.gmail.com]:587 xxxx@gmail.com:password
```

``sasl_passwd`` の情報を postfix へ登録する為、下記のコマンドを実行します。

```bash
postmap /etc/postfix/sasl_passwd
```

Gmail の設定
------------

https://myaccount.google.com/lesssecureapps から
「安全性の低いアプリの許可」を有効にします。

動作確認
-------

下記コマンドを実行し、送信先 Gmail アドレスにメールが届いているかを確認します。

```bash
logwatch --output mail
```

cron への登録
------------

インストール時に自動でやってくれるようです。
``/etc/cron.daily/00logwatch`` というファイルが作成されていれば、
毎日自動的に logwatch のレポートがメール送信されます。
中身は至ってシンプル。

```bash:/etc/cron.daily/00logwatch
#!/bin/bash

#Check if removed-but-not-purged
test -x /usr/share/logwatch/scripts/logwatch.pl || exit 0

#execute
/usr/sbin/logwatch --output mail
```

参考資料
-------

[VPS(scaleway)へのlogwatchの導入＋gmailへ送信](https://hogehuga.net/%E6%9C%AA%E5%88%86%E9%A1%9E/329/)
[備忘録]SecretやConfigMapのみを変更した時にローリングアップデートを実行させる方法

**対象のKubermetes**

1.15～

[Rolling restart of pods #13488](https://github.com/kubernetes/kubernetes/issues/13488)
[Implement rollout restart for statefulset and daemonset #77423](https://github.com/kubernetes/kubernetes/pull/77423)

**コマンド**

```
# Deploymentの場合。「deployment」は省略形の「deploy」も使えるはず
$ kubectl rollout restart deployment/[Deployment名]

# StatefulSetの場合。「deployment」は省略形の「sts」も使えるはず
$ kubectl rollout restart statefulset/[StatefulSet名]

# DaemonSetの場合。「」は省略形の「ds」も使えるはず
$ kubectl rollout restart daemonset/[DaemonSet名]
```
Unity&JoyCon: 「FormatException: Input string was not in a correct format」を直す方法

# 環境
- macOS 10.15.1
- Unity 2019.2.9f1

# 問題
UnityとJoyConを組み合わせる[JoyconLib](https://github.com/Looking-Glass/JoyconLib)というライブラリを試してみたら、全く動かなかった
そのとき以下のようなエラーが出てきた


>FormatException: Input string was not in a correct format




# 解決方法
「Packages > com.lookingglass.joyconlib > JoyconLib_scripts > Joycon.cs」の376行目に以下のような記述がある

```
DebugPrint(string.Format("Dequeue. Queue length: {0:d}. Packet ID: {1:X2}. Timestamp: {2:X2}. Lag to dequeue: {3:s}. Lag between packets (expect 15ms): {4:g}",
```

ここの`{3:s}`を`{3:t}`にして、`{4:s}`を`{4:g}`にすればエラーが消える

# 参考文献
[FormatException: Input string was not in a correct format in Unity 2018.3.0f2 #23](https://github.com/Looking-Glass/JoyconLib/issues/23)
【Salesforce Lightning】カスタムオブジェクトをタブに追加する方法がなかなか分からなかった件

ちょっと調べれば分かると高をくくっていたのですが、、
全然出てこない。

という事でここに備忘録を記しておきます。

## 目的
Salesforceの上のタブに新しく作ったカスタムオブジェクトのレコードが表示されるようにしたい。

画面上部のタブ横の鉛筆マークから[アプリケーションナビゲーション項目を編集]を開いて、[項目をさらに追加]ボタンで追加しようとしても検索に出てこない……

これを表示できるようにしたい。

## やり方
カスタムオブジェクトは既にできている前提です。
もしかしたらオブジェクトの設定でリリース済み&&検索OKに設定しておく必要あるかもです。

### 1.画面レイアウトを作る
オブジェクトマネージャーもですが、レコード画面全体のレイアウトを作らないといけないらしい。

**[設定] > [Lightning アプリケーションビルダー] > [新規]**

今回はレコードを表示させたいから[レコードページ]を作成します。

あとはポチポチしてレイアウトを指定。

保存したら有効化も必要かも。その辺りは管理者的視点でうまくやってください。
今回その辺に重きを置いてないので割愛します。

### 2.タブに追加

**[設定] > [ユーザインターフェース] > [タブ] > カスタムオブジェクトタブ
の[新規]**

オブジェクトを指定してタブスタイルを指定して保存。

### 3.[アプリケーションナビゲーション項目を編集]から追加する
あとは最初にやろうとしたことをやるだけです。

タブ横の鉛筆マークから追加できるようになっているので設定します。

これで完了。

## 最後に
これを見た方、画像も無しに説明して申し訳ないです。

色々調べてるのになかなか欲しい情報が無いって方の助けになったら嬉しいです。
東京工科大学の学内Wi-Fiにwpa_supplicantを使って接続する方法

東京工科大学の学内無線LANはWPA2-PSKで提供されていてWeb認証が必要な `KOKADAI-NET` (2.4GHz)と `KOKADAI-NETa` (5GHz)、WPA2-EAPで提供されていて、LADPアカウントで認証する `KOKADAI-WNETg` (2.4GHz)と `KOKADAI-WNET` (5GHz)が提供されています。

RaspberryPiやArchLinuxのインストールなどで学内無線LANに接続するときはブラウザがないので、当然EAPで繋ぐほうが楽です(というかそもそもPSKの方は非推奨になってます)。

ですがEAP認証なので、PSKだけに比べて少々面倒な手順を踏む必要があります。

今回はその手順を紹介します。
5GHz帯のKOKADAI-WNETを前提に話を進めますが、SSIDを`KOKADAI-WNETg`に変えるだけで2.4GHz帯も対応可能です

まず適当なところ(/optとか)に以下のファイルを作成します。
`$ vim kokadai-wnet.conf`

```
network={
  ssid="KOKADAI-WNET"
  scan_ssid=1
  key_mgmt=WPA-EAP
  identity="c0111999c6"
  password="vW819v&#W"
  eap=PEAP
  phase1="peaplabel=0"
  phase2="auth=MSCHAPV2"
}
```
まず `identity="c0111999c6"`と`password="vW819v&#W"`は自分の学籍番号プラス2桁のIDのそれのパスワードを入れて下さい。

ファイルができたら`wpa_supplicant`コマンドを実行します。
まず、`ip a`とコマンドを実行して無線LANのインターフェイス名を確認して下さい。
一般的にRaspberryPiは`wlan0`、ノートPCは`wlp2s0`みたいな名前になってると思います。

あとは`wpa_supplicant`に先程のconfファイルと無線LANインターフェイスを指定して実行します。

```shell

wpa_supplicant -i wlp2s0 -c ./kokadai-wnet.conf
```

logを見ていると接続ができたかどうかがログに表示されると思うので、接続できたら`dhcpcd`などでIPアドレスを拾ったり、接続できてなかったらエラーを見て対処したりして下さい。
用語解説：メンバ変数 / ローカル変数

# メンバ変数とは

* クラスの中にある変数
* オブジェクトの属性を定義したもの
* データを受け取るための変数
* オブジェクトが持つパラメータ


## 例

### 概念イメージ

オブジェクト：うちのうさぎ ・・・モノ
メンバ変数　：可愛い、怖がり、ドジ ・・・どんなものか
メソッド　　：寝る、食べる、跳ねる、走る ・・・どう動けるか

### コードのイメージ

```java

public class Rabbit{

	Int age;		//メンバ変数　年齢を格納
	String personality;	//メンバ変数　性格を格納


	void setAge(int newAge){
		age = newAge;
	}

	Int getAge(){
		return age;
	}
}
```

---


# ローカル変数とは

* プログラム内の限定された範囲でしか参照できない変数
* メソッド内で宣言した変数はそのメソッドの外では参照不可
* if文、for文内で宣言した変数はその文節の外では利用不可
	※文節：文を実際の言語として不自然でない程度に区切った最小の単位

* クラスのメンバとして宣言した変数（メンバ変数）も、そのクラスの外からは参照不可

## 例

```java
Public class Variable{
	Public static void main(String[] args){
		String rabbit; 
		//mainメソッド内でのみ参照可能なローカル変数
	} 
}
```

---


思いついたら追記します。
Docker で SQL Server 2019 をお試し

新しい SQL Server 2019 GA が公開されていたので、下記の手順に従って、試してみた。
 [クイック スタート: Docker を使用して SQL Server コンテナー イメージを実行する](https://docs.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker?view=sql-server-ver15&pivots=cs1-bash)

# 環境

- [Docker for Windows で遊んでみた](https://qiita.com/rex0220/items/0c4a352c9e7d9962acf0)


# SQL Server 2019 GA の image 取得

```PowerShell:PowerShell
rex02 > docker pull mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
2019-GA-ubuntu-16.04: Pulling from mssql/server
59ab41dd721a: Pull complete
57da90bec92c: Pull complete
06fe57530625: Pull complete
5a6315cba1ff: Pull complete
739f58768b3f: Pull complete
fd449e8d7345: Pull complete
51d0933375e5: Pull complete
64f21ba81504: Pull complete
55b6919c0cc6: Pull complete
Digest: sha256:c8fa22553ce421b0482febcafa712b29cbb933b0d97a8671686797b31cf157a9
Status: Downloaded newer image for mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04

rex02 > docker images
REPOSITORY                       TAG                    IMAGE ID            CREATED             SIZE
mcr.microsoft.com/mssql/server   2019-GA-ubuntu-16.04   76c7c66bff02        5 weeks ago         1.57GB
```


# up

パスワードを簡単な文字列にすると、SQL Server がすぐに終了してしまう。

```PowerShell:PowerShell
rex02 > docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd>" \
-p 1433:1433 --name sql1 \
-d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
26514f40a04465ef651b56126ba995d68041052dc830d400f587f767cffc3f3b
rex02 > docker ps -a 
CONTAINER ID        IMAGE                                                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
26514f40a044        mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04   "/opt/mssql/bin/perm…"   4 seconds ago       Up 3 seconds        0.0.0.0:1433->1433/tcp   sql1
```


# データの作成とクエリ

SQL Server のコマンド実行が、GO だったのを思い出すのにしばらくかかった。

```PowerShell:PowerShell
rex02 > docker exec -it sql1 bash
mssql@26514f40a044:/$ /opt/mssql-tools/bin/sqlcmd -S localhost -U SA
Password:
1> CREATE DATABASE TestDB
2> go

1> SELECT Name from sys.Databases
2> go
Name
--------------------------------------------------------------------------------------------------------------------------------
master
tempdb
model
msdb
TestDB

(5 rows affected)

1> USE TestDB
2> go
Changed database context to 'TestDB'.

1> CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT)
2> go

1> INSERT INTO Inventory VALUES (1, 'banana', 150); INSERT INTO Inventory VALUES (2, 'orange', 154);
2> go

(1 rows affected)

(1 rows affected)

1> SELECT * FROM Inventory WHERE quantity > 152;
2> go
id          name                                               quantity
----------- -------------------------------------------------- -----------
          2 orange                                                     154

(1 rows affected)

1> quit
```

# あとがき

簡単に SQL Server 2019 が試せるので、久しぶりにもう少しいじってみたい。
現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル８　変数宣言

#ニュー単語
- [ ] var 「variable」の略で、「値を入れておく箱なんだな～」
- [ ] int型「変数の種類のひとつで『（桁数の大きくない）整数を入れられるよ！』な種類なんだな～」
- [ ] Integer「整数を入れられる変数、もしくは整数なんだな～」
- [ ] str「変数の種類のひとつで『文字列（文字の集まり）を入れられるよ！』な種類なんだな～」
- [ ] boolean型日本語で「論理型」と表現される場合もあります。「変数の種類のひとつで『真偽値を入れられるよ！』な種類なんだな～」
- [ ] type関数タイプが分からないときはtype関数を用いて型を見つける
Write the Comments First(A Philosophy of Software Design)


最近、[A Philosophy of Software Design ](https://www.amazon.co.jp/Philosophy-Software-Design-John-Ousterhout/dp/1732102201)という本を読みました。
その15章"Write the Comments First"（「コメントをまず書こう」）の内容が面白かったので、紹介です。


# 何をやるの？
実装の**前に**、クラス・（パブリック）メソッドの概要やインターフェイスのコメントを書くだけです。


# あとでコメント書くのじゃ駄目なの？

* あとで書くっていう人は、大体書かない
* すでに実装が終わっているので、コメントを書くモチベーションが低くなりがち
  *  他人のためだけに書くことになるので
* コードを書く時に考えていた設計上の考えを、コメントを書く時点では忘れがち


# 先にコメント書くと、何が嬉しいの？
* 設計直後orしながらなので、考えたことが頭に残っており、良いコメントを書きやすい
* いい感じにコメントが書けるか・書けないかで、システム・インターフェイスの複雑性を判断出来る
   * いい感じに書けない＝メソッドやクラスの責務が広すぎたり、抽象化が十分ではない
* 楽しい


# その他
* コメントだったら何でも良いわけではなくて、コードを抽象化するか、情報を加えることが大事
  *  コードを繰り返すのではなく、抽象化or情報を加える
  *  具体的には12章、13章で言及


# 思ったこと
* なんとなくTDDと似ている…？
   * どちらも、先にコメント/テストを書くことで、設計を良くする
   * どちらも、後から書くとサボりがちな部分を早めにする
   * Comment Driven Development(CDD?)という用語を思いつきましたが、[すでに呼んでいる人もいる](https://www.sitepoint.com/comment-driven-development/)ようです
* コメントを書く順番を入れ替えるだけなので、気楽に試せるのは良きかな
#7 Main.storyboardのViewのアイテムをコードと接続する1例

#はじめに
個人のメモ程度の出来なのであまり参考にしないで下さい．


#環境
Xcode：11.2.1
Swift：5.1.2
2019/11



##part1
Xcodeの右上の赤枠をクリックする．

<img width="447" alt="スクリーンショット 2019-11-20 午前0.37.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/c0e80996-347f-b862-d3c5-833ee4222f86.png">



##part2
画面が分割するので，分割した画面の表示するfileを選択する．

<img width="741" alt="スクリーンショット 2019-11-20 午前0.39.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/8732fc1e-56b6-97c8-7303-cfd5e3f52285.png">



##part3
`Main.storyboard`のViewのアイテムをドラッグ・ドロップする．
`Name`を書き，`Type`を選択する．
`Connect`を選択する．

<img width="706" alt="スクリーンショット 2019-11-20 午前0.40.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/63f4c666-9c28-344e-3118-3be741ba059b.png">



##part4
下のようになればOK．

<img width="606" alt="スクリーンショット 2019-11-20 午前0.41.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/6b3d4043-5df7-d1b3-ae5f-5001408e97c1.png">
デフォバッジを小さくするハックでiOS13タブバー を乗り切る

# はじめに
とりあえず`Xcode11`対応終わりました。ごりごり`DarkMode`に対応させるものじゃなくてよかったです。いずれその日がやってくるかもしれませんが、、
タブバー 、バッジ周り`iOS13` `Xcode11`で少し対応したので記します。

# 背景
自分が担当しているプロダクトではタブバーを使用して状況に応じてアイコンにバッジ表示をしていますが、デフォルトバッジのサイズがちょっと大きいということでサイズ変更できるライブラリを使用していました。

ですが`UITabBar`周りの`View hierarchy`がちょっと変わってしまったせいで、バッジが期待の場所に配置されなかったりサイズ感変わったりなどの不具合で出てきてしまって、多くのバッジ系ライブラリにIssue立てられてました。
ライブラリ選定もパッと決めるには気後れするし、無理やり使用してるライブラリに合わせて調整するのもアレなのでバッジ生成する自前Viewを作る方向で動いていました。

が、仮定のいい感じのハックを見つけたのでナレッジとしてあってもいいかなと思ったので記載。

# 新タブバー階層の変更点

`TabBar`の旧番、新番の階層は以下のようになっています。

| iOS13未満 | iOS13以上 |
|:---:|:---:|
| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274090/ca9cc34d-5302-7165-ad7e-4f5ebe8002ac.png" width=600>| <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274090/6ed3f7b7-c64f-f5fb-e56c-1cd117e529a0.png" width=600> |

今までは`UITabBarButton` > `UITabBarSwappableImageView`となっていて、この`UITabBarSwappableImageView`がバッジのアイコンのViewになってます。
なのでおそらく、大抵のライブラリはこのアイコンViewの`frame`拾ってきてゴニョゴニョしてバッジを配置する座標を出して`subview`に追加、のような感じだったと思いますが、新たに`UIVisualEffectView`が間に入ったので座標取得の計算が狂ったんでしょうね。

ちなみに、タブ未選択状態だと上記のように`UIVisualEffectView`配下に潜り込んでるんですが、選択状態だと前に出てくるようです。

|選択状態|
|:---:|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274090/ad13a7f9-047e-de6c-4d90-c031323fc40a.png)|

動的に階層が変わってしまうので`UITabBarButton`を基準にして座標を出した方が良さそうなんですが、そもそも未選択時の`UITabBarSwappableImageView`は触れるんでしょうか、、

という感じで自前View作って対応せざるを得なかったんですが、少し条件指定ありますが下記ハックを過程で見つけたので採用しました。
有名なハックなのかもしれないですが。

# 赤丸小さめデフォルトバッジ

#### 該当者

- バッジサイズとりあえず小さくしたい
- 件数入れたり等のカスタムはしないで赤丸だけ
- 座標はデフォバッジくらいでおk

件数等入れる場合は別途作るしかなさそうです。

## コード

#### デフォルト

だとこんな感じ。

```Swift
let tabBarItem = tabBarController?.viewControllers?[tabIndex].tabBarItem
tabBarItem.badgeValue = ""
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274090/a8122964-200e-1e9c-acc6-1d6cfcacd133.png)

まぁ、でけーっちゃでけーですね。別に大きさなんてええやーんが本音。

#### 小さめバッジ

だとこんな感じ。

```Swift
let tabBarItem = tabBarController?.viewControllers?[tabIndex].tabBarItem
tabBarItem.badgeValue = "●"
tabBarItem.badgeValue = .clear
tabBarItem.setBadgeTextAttributes([NSAttributedStringKey.foregroundColor.rawValue: UIColor.red], for: .normal)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274090/be8bccf3-944f-96be-91a4-f5f553953ea6.png)

いい感じのサイズです。

やってることとしては、バッジの色をクリアにしてしまい、ブレッドポイントをバッジとして使用するといった感じ。
色も変えられるので、サイズをざっくり小さくするだけの対応ならこれでいけそう。

# 終わりに

上記の条件でいいのならだいぶ時間を削減できる。
考える人もいるもんだなぁと感心しました。

参考
https://stackoverflow.com/questions/31337803/how-to-add-small-red-dot-in-uitabbaritem
【Linuxコマンド】複数ファイルの合計行数を取得

※ワイルドカードを使って特定できるファイル群が対象のコマンドです。



```
テキストファイル(.txt)であれば
cat *.txt | wc -l

バックグラウンド実行であれば
nohup cat *.txt | wc -l >> log.txt &
```
Grove Wrapperを海外から注文してみた

この記事は[IoTLT Advent Calendar 2019 neo](https://qiita.com/advent-calendar/2019/iotlt_neo)の12月2日の記事です。

# きっかけ
Groveのセンサー類を使用してIoTをやっていると、どうしても配線が気になってしまいます。
特に小っちゃいセンサーは軽いので、宙に浮いてしまったりします。
間違いなく希望する向きにはなりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/3fcb8fd4-229d-82d2-0e98-0f44172b9b55.png)
https://www.digikey.com/en/maker/blogs/hands-on-with-the-seeedstudio-grove-starter-kit-for-iot-based-on-the-raspberry-pi

ケースを3Dプリンタ等で自作するのも手ではあるのですが、何かいいものはないかと探してみると、[こちら](https://www.1ft-seabass.jp/memo/2017/09/14/grove-wrapper-is-cool/)のサイトを発見。
（ワンフットシーバスさん、ありがとう！）

# 注文
なんだ公式のいいものがあるではないかと思ったのですが、現在でも在庫があるECサイトがないため、直接[Seed Studio](https://www.seeedstudio.com/)さんから購入してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/7c99bcce-d1b3-8f53-f545-0886a82b0191.png)

せっかく輸入するわけですから、ちょっと多めに注文してみました。
（そんなにいらないので、そのうち人にあげると思います ^^;）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/d9a2a44e-9cff-1f07-1611-7f05ffa8a1c1.png)

郵便にしたところ、思ったよりも送料は安かったです。
ただ、時間はかかる模様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/1809b00a-df8e-9789-67c3-b7b64f22d97e.png)
楽しみに待つことにします。

なお、支払はPayPalかクレジットカード（VISA or Master）だけですのでご注意を。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/97b2fde9-02a5-492a-ed28-2b405b7743b9.png)

# 途中経過
ちゃんとSeeedからメールが届いたり、アカウントサイトから状況を確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/19910b4f-dd1d-a45c-ac00-5f870c60ff76.png)
ちゃんと進んでいますｗ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/c87477f8-6832-127a-1b55-2aa7043a2156.png)
経過も確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/7ec2e2c2-dc3f-cce6-71f5-aed608486766.png)
（香港から川崎を経由して届けられた模様）

# 到着
で、無事到着しました。
![DSC_0004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/cc6c4bbc-953a-863e-9220-2d58ff114650.jpeg)
郵便でという割には、しっかり小包サイズです。

いちおう、日本語の追跡シールも貼られていました。
![DSC_0006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/5f04d011-ce13-89fa-30ee-71a9e4af7587.jpeg)

しかし気になるところがひとつ．．．
![DSC_0005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/e70243e1-7c64-d4a5-7dca-e52c44287949.jpeg)
1*1以外に、1*2（4個入り）を5パック買っているんですけど．．．

英語でクレームメール書くのはいやだなぁなんて思いながら、とりあえず開けてみました。
![DSC_0008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/e38a50a1-e49b-4067-b82d-874fe6a82054.jpeg)
ちゃんと入っていました。

# で、こんな感じになりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/0812b3be-28ab-6691-36e2-024f2182ec1f.png)

きれいにまとまりました。

# まとめ
国内のECサイトと同様に簡単に注文でき、まるで問題なく届きました。
18日（営業日だと12日）で届いてますので、想定の半分ぐらいの早さですね。

~~これなら、急いでなければ国内のECサイトで購入しなくてもいいですね！~~
もはや、個人輸入とか考える必要の無い時代なのかも。
テストコードの環境設定をわかりやすく解説

プログラムを意図した通りに動くことを確かめるために、テストコードを使います。
**プロダクションコード : 本番環境で実際に作動するプログラム**
**テストコード ：　テストを行うために行うプログラム**
このテストコードの方を一緒に勉強していきましょう！
#概要 
　・用意するgem
　・Rspecを用意する
　・Rspecが正しく設定されているか確認する

##用意するgem
**Railsでは、Rspecという言語を使用します。**
**そして、rspec-railsというgemを使用します。**
web_consoleをいうgemは、テスト環境で動かすと不具合が起きるgemなので、
developmentの環境下に移動しましょう！

Railsで開発したアプリにgemをインストールします。

```Gemfile.
group :development, :test do
   gem 'rspec-rails'
end

group :development do
  gem 'web-console'
end
```
bundle installを実行！

####テストするときに気をつけること
**スピードは求めない**　
  コードを書く量が増えるので、開発スピードが遅くなることは許容しましょう。
**DRYを意識し過ぎない**
  わかりやすさ優先で、同じような記述はなるべくまとめられないか考える
　
##Rspecを用意する
Rspecの基本設定をするために、Rspec用の設定ファイルを
用意します。

```ターミナル.
$ rails g rspec:install
```
```
 create  .rspec
 create  spec
 create  spec/spec_helper.rb
 create  spec/rails_helper.rb
```
rails_helperとspce_helperなんですが、Rspecを利用する際にどちらも共通
設定を書いておくファイルになります。<br>spce_helperは、RSpecをRails無しで利用する際に利用します

```
#.rspecファイルに追加する（表示の出力を見やすくしてくれます）
--format documentation
```
##Rspecが正しく設定されているか確認する
```
#ターミナルから以下のコマンドを実行する
$ bundle exec rspec
```
以下のような結果になれば、RSpecを利用する準備はできています。

```
No examples found.

Finished in 0.00031 seconds (files took 0.19956 seconds to load)
0 examples, 0 failures
```
ここまでで環境設定は完了です。
次は、実際にテストをしていきましょう！
#6 新規のUIViewControllerのクラスを作る1例

#はじめに
個人のメモ程度の出来なのであまり参考にしないで下さい．


#環境
Xcode：11.2.1
Swift：5.1.2
2019/11



##part1
ナビゲータバーで右クリックし，`New file`を選択する．

<img width="269" alt="スクリーンショット 2019-11-20 午前0.17.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/b6c2dfdc-a646-685a-1ee6-39d06778f7d2.png">



##part2
`Cocoa Touch Class`を選択する．

<img width="726" alt="スクリーンショット 2019-11-20 午前0.18.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/d7df4914-715f-6bc9-ca6e-6b2ce75b1bf3.png">



##part3
Class名を書き，`Subclass`を`UIViewController`にする．

<img width="724" alt="スクリーンショット 2019-11-20 午前0.18.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/1b8492c5-d119-f0a3-e6ad-203bab69bd57.png">



##part4
fileの保存場所を`Group`の位置にも注意して指定する．

<img width="642" alt="スクリーンショット 2019-11-20 午前0.19.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/6ff2c8ea-d72e-b4d3-45e4-182d93abc1f5.png">



##part5
新規の`UIViewController`を選択した状態で，先ほど追加したfileをClassとして指定する．

<img width="256" alt="スクリーンショット 2019-11-20 午前0.20.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/48b16efe-81ba-d5ad-6be6-fe87cbcc6fab.png">
UiPath　ファイル名を変更する

UiPathでのファイル名変更方法です。

ググれば色々な情報はあるのですが、ピンポイントで手順が探せなかったので、端的に手順だけ確認したい時の備忘録です。
（独学でやっているので、ベストプラクティスではないです。とりあえず実行できる事が目的です。）

##▪️ファイル名を変更する
方法として思いつくのは、GUI上でファイルを選択して、変更する方法と、CUIで変更する方法の2つがあると思いますが、ここでは信頼性が高く、割と簡単な方の、コマンドプロンプトを使用する方法を紹介します。

手順1　「アプリケーションを開始」アクティビティを追加

手順2　コマンドプロンプトを起動させて、「画面上で指定」から、コマンドプロンプトを選択

手順3　doに「文字を入力/type into」を追加し、目的ファイルの入っているフォルダパスへのcdコマンドを入力

```
"cd Ｃ:¥users¥..フォルダパス[k(enter)]"
```
※最後の[k(enter)]は、エンターキーを押すという指示です。

手順4　ファイル名変更コマンドを入力する
先ほど追加した「文字を入力」アクティビティの下にさらにもう一つ「文字を入力」アクティビティを追加し、コマンドプロンプトのRENAMEコマンドを入力します。

入力方法：RENAME 変更前のファイル名.拡張子　変更後のファイル名.拡張子

```
"RENAME a.xls b.xls [k(enter)]"
```


これでファイルのリネームは可能です。
ファイルパスや変更前、変更後のファイル名が決まっている場合には、コマンドプロンプトの方が、セレクターのカーソル制御に時間を取られないのでオススメです。

問題はファイルパスやファイル名が一定ではなく、動的な場合です。
例えば、変更後のファイル名をユーザーが入力したファイル名にする場合は、ファイル名に変数を使ってパスやファイル指定する事もできます。

例えば、type intoの入力欄に変数「hensu」を以下のように入力すると当然文字列として扱われます。

```
"RENAME　元ファイル名.xls hensu.xls [k(enter)]"
```

そこで以下のように＆で連結をします。

```
"RENAME　元ファイル名.xls" & hensu & ".xls [k(enter)]"
```

変更後のファイル名にテキストと変数を使用する場合
例：　hensu =　"ファイル"

```
"RENAME　元ファイル名.xls　ほげほげ" & hensu & ".xls [k(enter)]"
```
→ファイル名：ほげほげファイル　となります

これで、テキストと変数を使ってリネームする事ができます。