OmniAICreator/Qiita-1.07M huggingface dataset:
Python　タプル(tuple)について

##タプルとは
リスト(list)との違いは，作成した後に要素の追加や削除が出来るかどうがです．タプルの場合は追加や削除が出来ません．

##サンプルコード
```tuple.py
import datetime

def get_today():
    today = datetime.datetime.today()
    value = (today.year, today.month, today.day)

    return value

test_tuple = get_today()

print(test_tuple)
print(test_tuple[0])
print(test_tuple[1])
print(test_tuple[2])
```
```出力
(2019, 7, 4)
2019
7
4
```

##参考にさせていただいたもの
タプル：Python-izm
https://www.python-izm.com/basic/tuple/
AWS Workspaces(AmazonLinux2)へのVisualStudio Codeをコマンドでインストール

### Visual Studio Code Install

Termnalからコマンド実行。（WebからRPMダウンロードしても良いけどこの方が楽）

Repo登録

```bash
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'
```

Repoからインストール。

```bash
yum check-update
sudo yum install code
```

see: https://code.visualstudio.com/docs/setup/linux#_rhel-fedora-and-centos-based-distributions
Safari上から cookie の追加・編集を行う

Safari上から、cookie をいろいろ追加・編集・削除したいというケースがあって

Chrome なら、拡張機能 "[Edit This Cookie](https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?hl=ja)" あたりを使えばOKという話ですが、Safari でそれっぽい機能が見つからずでして

## js-cookie を読み込ませて使う

JavaScript の cookie操作の定番ライブラリ "[js-cookie](https://github.com/js-cookie/js-cookie)" を、Safari に読み込ませて使えば対応できました

Safari の JavaScriptコンソールから

1) js-cookie を読み込ませる

```
script = document.createElement('script'); script.src = 'https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js'; document.getElementsByTagName('head')[0].appendChild(script)
```

2) そのままコンソールで cookie 設定

```
Cookies.set('foo', 'bar');
```

こんな感じで操作可能に

cookie の参照は `Cookies.get()` でもできますが、コンソール上部の「ストレージ」タブからも確認できます。(削除もここからできた)
undefined method ***_pathの解決策


学習の記録　:writing_hand_tone4:


``` ***/edit.html.erb
<%= form_for @*** do |f| %>
  # 省略
<% end %>
```

```
NoMethodError undefined method `***_path'
```

が出てしまう現象が発生。
ルーティングを確認してもパスは合っている・・なぜ :sweat:

##原因

form_forが自動的に生成してくれるパスは複数形のみらしい。

```
$ rails routes
  # resourcesが生成してくれたroutes
  edit_admins_単数形 GET    /admins/複数形/new(.:format)

  # form_forが欲しかったroutes
  edit_admins_複数形 POST   /admins/複数形/new(.:format)

```

##解決法

urlを指定して、こっちに飛ぶんだよ〜と教えてあげる :fist_tone4:

``` ***/edit.html.erb
<%= form_for @hoge, url: ***_index_path do |f| %>
  # 省略
<% end %>
JavaScriptで正規表現を使って対象文字列が意図した文字列か判定する方法

例えば6桁の半角英数字のみTrueにしたい場合、

```:hoge.js
const hoge = 'abc123';
const hogeRegExp = new RegExp('^[a-zA-Z0-9]{6}$');
if(hogeRegExp.test(hoge)){
   console.log('true');
}else{
   console.log('false');
}
//trueが表示される
```
aapt.exeのエラーが出たときの備忘 

androidアプリをビルドしていたら、見慣れないエラーが出た。

```
Process 'command 'C:\Users\XXXXXXXXXX\AppData\Local\Android\Sdk\build-tools\24.0.2\aapt.exe'' finished with non-zero exit value 1

```

aapt.exeを実行したときの終了コードが0じゃないってことは分かったけど、じゃぁどこでエラーになっているのか探してみても、これ以上のログは出ていない。



#Gradleをインストールする

調べてみたところ、Gradleなるものを使えば詳細なログが出るらしい。
（Gradleとは、Groovyで記述するビルド自動化システム）
ということで、以下を参考にしてGradleのインストールをしてみた。

参考にした記事：
[【Java】Gradleのインストールと基本的な使い方（画像付きで解説）](https://eng-entrance.com/gradle-install-use)

インストールできているか確認する。

```
C:\Users\XXXXXXXX>gradle -v

 ------------------------------------------------------------
Gradle 3.2.1
------------------------------------------------------------

Build time:   2016-11-22 15:19:54 UTC
Revision:     83b485b914fd4f335ad0e66af9d14aad458d2cc5

Groovy:       2.4.7
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.7.0_80 (Oracle Corporation 24.80-b11)
OS:           Windows 8.1 6.3 amd64

```



#ビルドログを確認する

Gradleのインストールができたため、さっそく以下を実行してログを確認する。

```
C:\Users\XXXXXX\AndroidStudioProjects\DataBaseApp2>gradlew assembleDebug --info

……………

Successfully started process 'command 'C:\Users\XXXXXXX\AppData\Local\Android\Sdk\build-tools\24.0.2\aapt.exe''
C:\Users\XXXXXXX\AndroidStudioProjects\DataBaseApp2\app\src\main\res\layout\activity_main.xml:25:32-40: AAPT: String types not allowed (at 't
extColor' with value ' #F5F5F5').

C:\Users\XXXXXXX\AndroidStudioProjects\DataBaseApp2\app\build\intermediates\res\merged\debug\layout\activity_main.xml:18: error: Error: Strin
g types not allowed (at 'textColor' with value ' #F5F5F5').

```

カラーコードにスペース入ってる…！！！
ということで削除し再ビルドしたら解決した。



参考にした記事：
[エラー Unsupported major.minor version 52.0 の対処方法](https://blog.ytabuchi.dev/entry/2016/10/03/180000)


[Android StudioでJavaのバージョン](https://teratail.com/questions/60298#reply-96262)
JFreeChart-バブルチャート-DefaultXYZDataset


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBubbleRenderer;
import org.jfree.data.xy.DefaultXYZDataset;
import org.jfree.data.xy.XYDataset;

/**
■ JFreeChart-バブルチャート-DefaultXYZDataset
・X,Yの位置と円の大きさがあるので、DefaultXYZDatasetを使用する.z値がバブルの大きさとなる.
・DefaultXYZDatasetは以下のメソッドを持っている.
    addSeries(java.lang.Comparable seriesKey, double[][] data)
    dataはdouble[3][N]は次の構造.
       [0][N]:x値
       [1][N]:y値
       [2][N]:z値
 */
public class Chart10_01 {
  // 目次-バブルチャート(BubbleChart)
  A_Chart10 a_Chart10;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) {
    // 表示データの作成
    DefaultXYZDataset dataSet = new DefaultXYZDataset();
    {
      // xの値
      double[] xValues = { 2.1D, 2.3D, 2.3D, 2.2D, 2.2D, 1.8D, 1.8D, 1.9D, 2.3D, 3.8D};
      // yの値
      double[] yValues = {14.1D,11.1D,10.0D, 8.0D, 8.1D, 8.4D, 5.4D, 4.1D, 4.1D,25.0D};
      // Zの値(円の大きさ)
      double[] zValues = { 2.4D, 2.7D, 2.7D, 2.2D, 2.2D, 2.2D, 2.1D, 2.2D, 1.6D, 4.0D};
      double[][] arrayOfDouble = {xValues,yValues,zValues};
      dataSet.addSeries("A",arrayOfDouble);
    }
    {
      // xの値
      double[] xValues = { 3.1D, 0.3D, 1.7D, 0.2D, 1.2D, 0.8D, 0.8D, 0.9D, 0.3D, 2.8D};
      // yの値
      double[] yValues = {20.1D,11.1D,10.0D, 8.0D, 8.1D, 8.4D, 5.4D, 4.1D, 4.1D,20.0D};
      // Zの値(円の大きさ)
      double[] zValues = { 2.4D, 2.7D, 2.7D ,2.2D, 2.2D, 2.2D, 2.1D, 2.2D, 1.6D, 4.0D};
      double[][] arrayOfDouble = {xValues,yValues,zValues};
      dataSet.addSeries("B",arrayOfDouble);
    }
    // レンダラの指定⇒バブルチャート用のレンダラがある、引数は下記のものがあるがSCALE_ON_RANGE_AXISを指定すること
    //  (one of: SCALE_ON_BOTH_AXES, SCALE_ON_DOMAIN_AXIS, SCALE_ON_RANGE_AXIS).
    XYBubbleRenderer renderer = new XYBubbleRenderer(XYBubbleRenderer.SCALE_ON_RANGE_AXIS);
    // X軸,はみ出したりしないためにマージンを設定する、注、Rangeでもよい
    // ⇒ LowerMarginは効かないみたい
    NumberAxis xAxis = new NumberAxis();
    xAxis.setLowerMargin(0.1D);
    xAxis.setUpperMargin(0.1D);
    // Y軸,はみ出したりしないためにマージンを設定する、注、Rangeでもよい
    // ⇒ LowerMarginは効かないみたい
    NumberAxis yAxis = new NumberAxis();
    yAxis.setLowerMargin(0.1D);
    yAxis.setUpperMargin(0.1D);
    // PlotはXYPlotを使う
    XYPlot xyPlot = new XYPlot((XYDataset)dataSet,(ValueAxis)xAxis,(ValueAxis)yAxis,renderer);
    JFreeChart jfreeChart = new JFreeChart("BubbleChart",(Plot)xyPlot);
    //
    ChartFrame cFrame = new ChartFrame("BubbleChart",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }
}

```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/cea27a48-e8ef-a8ed-c10a-807db3f36e42.png)
ReactNative v0.60が出たので内容を簡単にまとめる

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">⚛️ React Native 0.60 is out! Accessibility improvements, AndroidX, CocoaPods, Autolinking for native modules, a new app screen and upgrade helpers.<br><br>Read more on our blog: <a href="https://t.co/CgeH6rgXsu">https://t.co/CgeH6rgXsu</a></p>&mdash; React Native (@reactnative) <a href="https://twitter.com/reactnative/status/1146407848315891712?ref_src=twsrc%5Etfw">2019年7月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

昨日ReactNative v0.60が出たらしいので公式のブログやCHANGELOGを見ながら変更点をまとめます。

参考にしたのはこのへん。

[Announcing React Native 0.60 · React Native](https://facebook.github.io/react-native/blog/2019/07/03/version-60)
[releases/CHANGELOG.md at master · react-native-community/releases](https://github.com/react-native-community/releases/blob/master/CHANGELOG.md)

---

## A11Y(Accessibility)対応
* なんかいろいろAPIが使いやすくなったみたい。
* ~~てかi18nとかA11Yとか変な略し方するのやめろ~~
* 正直アクセシビリティ対応はやったことないので、現状のAPIがどうなってるかとか把握してないです。。。


## イントロ画面が変わった
プロジェクトを作成した時に表示される画面が代わりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20371/56ddd718-f68c-654c-8e07-6e0abac94698.png)

いい感じ。

今までのイントロ画面はApp.jsに直接書かれてましたが、流石にこの分量だとそうもいかないようで、`react-native/Libraries/NewAppScreen`からimportする形で書かれていました。

## AndroidX対応
これが今回のアップデートの目玉っぽいのですが、そもそもAnrdoidXがわからなかったのでざっくり調べると、

* [Google Developers Japan: AndroidX の紹介](https://developers-jp.googleblog.com/2018/05/hello-world-androidx.html)
*  [https://developer.android.com/jetpack/androidx](https://developer.android.com/jetpack/androidx) 

どうやら、Androidの下位互換性を維持するためのライブラリであるSupportLibraryを置き換えるものっぽいということがわかりました。(ネイティブの知識がかなり薄いのでこの辺の補足をしていただける方を募集しております…)

> This is a breaking change, and your native code and dependencies will need to be migrated as well.

と書いていたので、NativeModulesを使っているライブラリを入れていたりする場合は、ライブラリの対応を待ってからでないとRN v0.60へのアップデートは難しいのかもしれないですね。

## Coreからいろいろ除外してるらしい
Coreライブラリから

- WebView
- NetInfo
- Geolocation

が除外されました。(v0.59時点で削除予定とドキュメントに書いてました)

今後はreact-native-communityのものを使用することが公式で推奨されています。

どれくらいうまくいくかは未知数ですが、移行ツールもあるようです。

https://github.com/lucasbento/rn-update-deprecated-modules

## その他たくさんのBugFix
[CHANGELOG](https://github.com/react-native-community/releases/blob/master/CHANGELOG.md)見るとよくわかるのですが、たくさんBugFixが入っているみたいです。一度目を通しておいた方がいいかもしれないですね。
GCPのタイムゾーンがうまく変更できなかった時のメモ


GCP（GCE）のUbuntu 18.04 LTS MinimalでタイムゾーンがデフォルトでUTCなのでJSTに変えようとした時にエラーになったのでメモ

``` 
$ sudo timedatectl set-timezone Asia/Tokyo
Failed to set time zone: Invalid time zone 'Asia/Tokyo'
```

# 結論

```shell
sudo apt -y install tzdata
```
宇宙物理系出身者がD-Waveの「磁束量子ビット」を理解しようとするとこうなる


# 概要

世界初商用量子コンピュータとして注目を集めたD-Wave。その動作原理はどのようなものなのでしょうか。気になったので勉強し、ここにアウトプットすることにしました。

# 磁束量子ビット

D-Waveで取り入れているのは磁束量子ビットを用いたものです。磁束量子ビットは超伝導状態にある小さな回路で構成されています。この回路の内側に上向きの磁場が発生した状態を「上向き」、下向きの磁場が発生した状態を「下向き」としています。D-Waveではこの状態の重ね合わせを再現しているとのことですが、これにはどのようなバックグラウンドが隠れているのでしょうか。

# 回路構成図

以下に示すような2つの部分で構成されたリング状の回路を用います。以下では左側の小さなリングを回路I, 外側の大きなリングを回路IIと呼称しましょう。

![スクリーンショット 2019-07-04 8.43.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/b1cb7a93-3118-d3d8-1a5f-d6dc3db49713.png)

# qubitを作る

## 電磁誘導の法則

回路Iの内側に磁場を垂直にかけます。

![スクリーンショット 2019-07-04 8.39.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/4593efaf-1b08-a347-e670-572131c1fb5d.png)

すると高校物理の電磁誘導の法則から、その磁場を打ち消そうとする方向に電流が発生します。

![スクリーンショット 2019-07-04 8.39.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/aecfc32a-85ca-feb2-f43a-c429d406474b.png)

## Josephson結合というなのただの絶縁膜

電流が流れるということは電圧が発生し、電荷に偏りができるということを意味します。つまりこの絶縁膜を挟んでプラスとマイナスの電荷が蓄電することになります。ようはコンデンサと同じような状態ですね。

![スクリーンショット 2019-07-04 8.40.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/09f03754-37e9-f3c7-4212-34c2769b3d1c.png)

## 確率的に起こるトンネル効果、からの回路IIへの電流発生

量子力学では小さな粒は絶縁物質をすり抜けて移動することが**確率的に**起こります。これがトンネル効果です。試しに回路Iの左側の電荷がトンネル効果によって絶縁膜を飛び越えたとしましょう。

![スクリーンショット 2019-07-04 8.41.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/b605608a-c9ba-af49-d2d4-ee79fd64e788.png)

すると、回路Iの右側に蓄積されていた電荷だけが取り残されます。この電荷が外側の大きなリング回路IIを電流として流れていくのです。

![スクリーンショット 2019-07-04 8.41.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/11fe1441-6843-8860-b46d-0847ceb840db.png)

**確率的に**回路Iの右側の電荷がトンネル効果によって絶縁膜を飛び越えることもあります。すると先ほどとは反対方向の電流が流れます。

![スクリーンショット 2019-07-04 8.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/6ee7d3e2-3c58-7873-25ee-5e552eb9de57.png)
![スクリーンショット 2019-07-04 8.41.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/fabc50b5-acb6-612b-5387-85b17b138531.png)

## 右ねじの法則

外側の大きなリング回路IIに流れた電流によって、高校物理の右ねじの法則から磁場が発生します。確率的に電流の向きが決まるわけですから、当然ここで発生する磁場の向きも確率的に決まります。

## qubit完成！

以上のような仕組みで上向き磁場状態と下向き磁場状態を確率的に重ね合わせる状態を作り上げることに、D-Waveの技術者は成功しました。

# 結言

ポイントは量子力学のトンネル効果を用いつつも、あくまでメインを司っているのは高校物理で習うようなマクロな電磁気学だったことがわかりました。「量子コンピュータ」は上向き・下向きの重ね合わせ状態を再現できさえすれば、その利用が可能であるということですね。
ArduinoのrosserialでArrayを扱うときの注意点

# はじめに
小ネタですが、Arduinoでrosserialを使うときに、floatのArrayのデータがセット出来ずに少しハマった話です。

# rosserialとは
rosserialは、Arduinoなどマイコン上でrosのtopicをpub/subするシリアル通信のライブラリです。

http://wiki.ros.org/rosserial_arduino

これを使うと簡単にArduinoで接続先のPCなどとrostopicのやりとりが出来ます。

導入方法はこちらの記事を参照ください。

[ROSのrosserialを使って、M5stackとUSB通信してLチカする](https://qiita.com/nnn112358/items/47970f67103f7474e838)
[ROS x Arduinoで遊んでみる](http://robonchu.hatenablog.com/entry/2018/02/25/235733)

# 環境
- Ubuntu 16.04
- ROS kinetic
- Arduino IDE 1.8.9

# float Arrayの扱い方
上記の記事を参照して、Arduinoからpubすることは出来たのですが、float array系のデータがセットすることが出来ませんでした。

例えばこんなやつです。

[std_msgs/Float32MultiArray](http://docs.ros.org/jade/api/std_msgs/html/msg/Float32MultiArray.html)

```.cpp:std_msgs/Float32MultiArray.msg
# Please look at the MultiArrayLayout message definition for
# documentation on all multiarrays.

MultiArrayLayout  layout        # specification of data layout
float32[]         data          # array of data
```

通常のros上では、`data.resize(9)` などと設定出来ますがそれはArduinoでは対応していないようでした。

調べてみるとstackoverflowに解決法がありました。
https://stackoverflow.com/questions/42180378/request-for-member-resize-in-float64multiarray-which-is-of-non-class-type

つまりは、
- mallocなどで確保したメモリかstaticなメモリを代入する
- lengthを設定する
の２つの対応が必要とのことです。

例えば下記のように書くことでデータ・セットできました。

```.cpp:vec3_pub.ino
#include <ros.h>
#include <std_msgs/Float32MultiArray.h>

ros::NodeHandle  nh;
std_msgs::Float32MultiArray vec3_msg;
ros::Publisher pub_vec("vec3", &vec3_msg);

void setup()
{
    nh.initNode();
    nh.advertise(pub_vec);
    vec3_msg.data = (float*)malloc(sizeof(float) * 9);
    vec3_msg.data_length = 9;
}

void loop()
{
    for (int i = 0; i < 9; ++i)
    {
        vec3_msg.data[i] = 0.1 * i;
    }
    pub_vec.publish(&vec3_msg);
    nh.spinOnce();
    delay(1000);
}
```

特にハマったのは、`vec3_msg.data_length = 9;`です。これが無いとデータ・セットされなかったです。

# 他の設定例：joystick
同じように、joystickのrostopic [sensor_msgs/Joy](http://docs.ros.org/melodic/api/sensor_msgs/html/msg/Joy.html)も設定出来ます。

```.cpp:sensor_msgs/Joy.msg
# Reports the state of a joysticks axes and buttons.
Header header           # timestamp in the header is the time the data is received from the joystick
float32[] axes          # the axes measurements from a joystick
int32[] buttons         # the buttons measurements from a joystick 
```


これで例えばM5StackなどのJoystickの操作量をrostopicとしてpub出来ます。

```.cpp:joy_pub.ino
#include <ros.h>
#include <ros/time.h>
#include <sensor_msgs/Joy.h>

ros::NodeHandle  nh;
sensor_msgs::Joy joy_msg;
ros::Publisher pub_joy("joy", &joy_msg);
static float x = 0;
static float y = 0;

void setup()
{
    nh.initNode();
    nh.advertise(pub_joy);
    joy_msg.axes = (float*)malloc(sizeof(float) * 2);
    joy_msg.axes_length = 2;
}

void loop()
{
    //Joystickの操作量x,yは別の箇所で設定されている前提
    joy_msg.axes[0] = x;
    joy_msg.axes[1] = y;
    joy_msg.header.stamp = nh.now();

    pub_joy.publish(&joy_msg);
    nh.spinOnce();
    delay(100);
}
```

#おわりに
rosserial使用するのは簡単で、私も使い始めてすぐに通信出来ました。
興味あれば試してみてください。
Git初心者から中級者　ブランチ活用編

# 目的
業務効率化

#ブランチの削除する方法
```vim
git branch -D hogehoge

```

#過去の履歴を参照する方法
```vim
git reflog

```

#履歴から復元する方法
```vim
git branch hogenosekai HEAD@{0}

```



# ブランチの確認
```vim

git branch --all

```

# ブランチ同士の差分確認
```vim

git diff master develop

```
>ブランチAの方がBより古い扱いで差分が表示される

#参考
[https://www.google.com/amp/s/www.genius-web.co.jp/blog/cat-123/git-branch-reflog-rescue.html/amp](https://www.google.com/amp/s/www.genius-web.co.jp/blog/cat-123/git-branch-reflog-rescue.html/amp)
Rustのstrをコピーなしで連結する

# はじめに
Rustにおいてstrを連結する方法としては、例えば`format!`を使ったものがあります。

```rust
format!("{}{}", a, b);
```

これは確かに連結できるのですが、新しくStringのメモリ領域を確保して`a`と`b`の内容をそれぞれコピーする、という実装になります。
これをコピーなしに行う方法はないだろうか、という話です。

# 方法を考える

要は

```rust
fn concat(a: &str, b: &str) -> &str
```

なる関数を実装したいということです。

残念ながら任意の引数についてこれを満たす関数を実装することはできません。なぜなら、1つのstrはメモリ上で連続した領域を取る必要があり、もしaとbのメモリ領域が離れていた場合、コピーなしにこの条件を満たすことができないからです。
逆に言えば、aとbがメモリ上で連続していれば1つのstrにすることも可能、ということになります。
また、aとbのライフタイムが違っていた場合、生成するstrのライフタイムを決められなくなるので、2つのライフタイムが等しいという制約も付きます。

というわけで

```rust
fn concat<'a>(a: &'a str, b: &'a str) -> Option<&'a str>
```

であれば実装可能ということになります。
これは、もしaとbがメモリ上で連続していれば連結した`Some(&str)`を、そうでなければ`None`を返す関数です。

実装方法としては、aとbのポインタと長さから隣接しているかどうかを判定して、隣接していればそのポインタからスライスを生成する形になります。当然内部はunsafeです。

# str-concatクレート

もし既存の実装がなければ作ろうと思っていましたが、さすがにありました。

[str-concat](https://crates.io/crates/str-concat)

というわけでこれを使うと

```rust
let s = "0123456789";
assert_eq!("0123456", concat(&s[..5], &s[5..7]).unwrap());
```

こんなことができます。

# 使い道

隣接した2つのstrという条件はかなり厳しいので「使い道があるのか？」と思われるかもしれませんが、パーサ（というかLexer）を書くときに重宝したりします。

例えば、nomで`_`区切りの数値を受理するパーサは以下のように書けます。
（ここではnomの解説はしません。「[Rustのパーサコンビネータライブラリnom 5.0を使ってみた](https://qiita.com/dalance/items/7e6a5ea3befb8e0cec5e)」に簡単な解説を書いたのでそちらを見てください。）

```rust
pub fn unsigned_number(s: &str) -> IResult<&str, Vec<&str>> {
    let (s, x) = digit1(s)?;
    fold_many0(alt((tag("_"), digit1)), vec![x], |mut acc: Vec<_>, item| {
        acc.push(item);
        acc
    })(s)
}
```

これを使って`"123_456"`をパースすると結果は`vec!["123", "_", "456"]`のように受理したパーサコンビネータの部品（この場合は数値を受理する`digit1`と`_`を受理する`tag("_")`）ごとにばらばらになってしまいます。

構文木を作るようなレベルのパーサならともかく、Lexerとしてはこんなに細切れにされてもしょうがないのでなんとか1つの`"123_456"`で受け取りたいところです。

ここでstr-concatを使うと

```rust
pub fn unsigned_number(s: &str) -> IResult<&str, &str> {
    let (s, x) = digit1(s)?;
    fold_many0(alt((tag("_"), digit1)), x, |acc: &str, item| {
        str_concat::concat(acc, item).unwrap()
    })(s)
}
```

という感じでコピーなしに連結できます。パーサが受理する以上必ず隣接しているはずなので`unwrap`しても問題ありません。
S3にgolangのSDK経由でファイルアップロードする

します。
以下を参考にさせていただきました

**AWS SDK for Go S3バケット基本操作**
https://qiita.com/maniju/items/df6050ea8f8f541360f4

```
go version go1.12.4 darwin/amd64
```

事前にパッケージを取得する

```
go get github.com/aws/aws-sdk-go/aws
go get github.com/aws/aws-sdk-go/session
go get github.com/aws/aws-sdk-go/credentials
go get github.com/aws/aws-sdk-go/service/s3
go get github.com/aws/aws-sdk-go/service/s3/s3manager
```

アップロードする

```golang:main.go
package main
  
import (
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/service/s3"
    "github.com/aws/aws-sdk-go/service/s3/s3manager"
    "fmt"
    "os"
)

func main() {
  cd := credentials.NewStaticCredentials("<アクセスキー ID＞", "＜シークレットアクセスキー＞", "")
  session, err := session.NewSession(&aws.Config{
    Credentials: cd,
    Region: aws.String("ap-northeast-1")},
  )

  s3ss := s3.New(session)
  bucket := "＜バケット名＞"
  filename := "＜S3上のファイル名＞"
  file, err := os.Open(＜ファイルパス＞)
  defer file.Close()

  uploader := s3manager.NewUploader(s3ss)
  _, err = uploader.Upload(&s3manager.UploadInput{
    Bucket: aws.String(bucket),
    Key: aws.String(filename),
    Body: file,
  })
}
```
WSUS のメモ

WSUS に関するメモです。

Q/A 情報は、まずtechnet

https://social.technet.microsoft.com/Forums/ja-JP/home?forum=wsusja

- とりあえずリンク集

```
WSUS 設定
https://ittrip.xyz/soft/windows/how-to-setup-wsus
クライアント側のupdate ファイル削除
https://itpc.blog.fc2.com/blog-entry-205.html

対象の製品のカテゴリや、選択するパッチ分類

$wsusServer = Get-WsusServer -Name サーバ名 -Port 8530（ポート）
$wsusSubscription = $wsusServer.GetSubscription()
$selectedProducts = $wsusSubscription.GetUpdateCategories() | Select Title
$selectedClassifications = $wsusSubscription.GetUpdateClassifications()  | Select Title
```


https://social.technet.microsoft.com/Forums/ja-JP/0b6a25ae-bcab-46a7-8318-be0f588ae418/123711242812414123911239536969299921237512383hotfixid124342146224?forum=powershellja

```

function Get-InstalledKB
{
    $session = New-Object -ComObject Microsoft.Update.Session
    $searcher = $session.CreateUpdateSearcher()
    $results = $searcher.QueryHistory(0, $searcher.GetTotalHistoryCount())
    $results|
        where Title -ne $null|
        select @(
            @{L="HotFixId";E={$_.Title -replace '^.*(KB\d+).*$','$1'}},
            "Date",
            "Title",
            "Description"
        )
}
```

##### 簡単チェック 
- wmic qfe list /format:htable > qfelist.htm
- get-wmiobject -class win32_quickfixengineering 

##### 履歴を全部だしたい場合
http://m.majorgeeks.com/content/page/how_to_check_your_windows_update_history_with_powershell.html



うまく行かない場合
- https://freesoft.tvbok.com/tips/update_error_code/80070003.html

報告を強制的あげさせる

[参考](http://pleasework.robbievance.net/howto-force-really-wsus-clients-to-check-in-on-demand/)

```
すぐには機能しないみたい。
$AutoUpdates = New-Object -ComObject "Microsoft.Update.AutoUpdate"
$AutoUpdates.DetectNow()


これもすぐには機能しないみたい。
usoclient startscan

これがいいらしい
$updateSession = new-object -com "Microsoft.Update.Session"; $updates=$updateSession.CreateupdateSearcher().Search($criteria).Updates

のあとで、
wuauclt /reportnow

```
Python exeファイル作成（画像ダウンロード処理）

Pythonでexeファイルを作成してみた。
※前提条件、pipコマンドが実行できる状態（私はAnaconda3をインストールしていました）

##①Pythonファイルをexe)ファイルに変換してくれるライブラリをインストール

```:コマンドプロンプトより
pip install pyinstaller
```
##②Pythonファイルを作成（画像をＤＬしてローカルに保存）UTF-8
``` python:hello.py
import requests
from datetime import datetime
try:
	url = input("DLするURLを入力してください ※未入力時はhttps://bookandengineer.com/wp-content/uploads/2019/02/キャプチャ.jpg")

	if url=='':
		url='https://bookandengineer.com/wp-content/uploads/2019/02/キャプチャ.jpg'

	file_name = f'./img/test.jpg'

	response = requests.get(url)
	image = response.content

	with open(file_name, "wb") as aaa:
	    aaa.write(image)

	print(f'画像ＤＬ成功（取得URL[{url}] / 画像パス[{file_name}]）')

except Exception as e:
	print(f'画像ＤＬ失敗（取得URL[{url}] / 画像パス[{file_name}]）')
	print(e)

input("何か入力すると処理を終了します")
```
##③exe作成（hello.pyを配置しているディレクトリに移動してから）
```:コマンドプロンプトより
pyinstaller hello.py --onefile
```
##④作成されたexeを実行
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350277/936e4692-64e0-1a50-5a27-a5763fa2bcce.jpeg)
![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350277/a53cad07-6714-911b-54a7-53d05665ae69.jpeg)
![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350277/10f1efe4-119c-7f39-d4eb-be9a0a2c8015.jpeg)
![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350277/a7cf310b-539d-b78a-707c-49e02a847b19.jpeg)
Windows 10 Home から Pro へのアップグレード時に 何故か Enterprise になる問題

# 概要
タイトル通りです。  
Windows 10 の Home Edition の PC を Pro にアップグレード（アップエディション？）するために、Microsoft Store からライセンスを購入してインストールしたところ、再起動後になぜかライセンス認証されておらず。。  

設定 -> 更新とセキュリティ -> ライセンス認証 を開くと、こんな感じでエラーコード「0xC004C003」が表示されていました。
![20190704.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186527/fa702225-975f-4345-302d-54fb7e6af8c9.png)

それでもってエディションが何故か Enterprise になっている。
？？？？？？？

# 対処
エラーコードが異なりましたが事象としてはこちらの記事と同じでした。
Microsoftでも事象を認識している模様。
https://www.nedia.ne.jp/blog/tech/2019/06/11/14605#i-3

MSへの電話が面倒だったので、default key の情報が無いかと調べるとこちらがヒット。
https://answers.microsoft.com/en-us/windows/forum/all/default-key/5a739d0f-b34a-470e-badf-e6120385cee9
> Win 10 Home: YTMG3-N6DKC-DKB77-7M9GH-8HVX7
> Win 10 Pro: VK7JG-NPHTM-C97JM-9MPGT-3V66T　　★今回はProへのアップグレードなのでこれ
> Win 10 Home N: 4CPRK-NM3K3-X6XXQ-RXX86-WXCHW
> Win 10 Home Single Language: BT79Q-G7N6G-PGBYW-4YWX6-6F4BT
> Win 10 Home Country Specific: 7B6NC-V3438-TRQG7-8TCCX-H6DDY
> Win 10 Professional N: 2B87N-8KFHP-DKV6R-Y2C8J-PKCKT

プロダクトキーを変更します にデフォルトキーを突っ込んだら無事ライセンス認証が通りました。
ライセンス認証が通った後にレジストリを確認すると、ちょっと変わってました。

Enterprise -> Professional
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EditionID

Windows 10 Enterprise -> Windows 10 Pro
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName

ここらへんはEnterprise のままだな。。いっか。。
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CompositionEditionID
- HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\EditionID
- HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\ProductName
- HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\CompositionEditionID

以上
WSL2のコロコロ変わるIPをMyDNSで何とかする

# １．WSL2のIPは起動するごとに変わる気まぐれさん

　Windows10Build18922に搭載されているWSL2はお試しバージョンということだけあって、ネットワークに難があります。その最たるものは、起動するごとにプライベートIPが変化する部分です。これではsshやhttp接続の時に、面倒くさいことこの上ない状態となります。

　IPを固定する方法を試行錯誤してみたのですが、ホストOS側の仮想ブリッジが再作成されてネットワークそのものが変えられてしまうため、小手先でどうにかなる問題ではありませんでした。

　ということで対応策を考えた結果、ドメインと関連付ければ良いという結論に至りました。

# ２．そうだ、MyDNSを利用しよう

　まずは、[MyDNS](https://www.mydns.jp/)でアカウントを作成し、ドメインを一つ設定します。ローカルで使うだけなので、無料の中から好きなものを選びましょう。

# ３．プログラムのインストール

　お察しの通り、まっとうな方法ではプライベートIPを登録することは出来ないので、WSL上でnodeを入れてゴニョゴニョします。

```.sh
sudo apt install nodejs npm
```

　wsl2mydnsをnpmからインストールします。これがゴニョゴニョするプログラムです。

```.sh
sudo npm -g  wsl2mydns
```

　これで必要なもののインストールは完了です。

# ４．Windows側でbatを作成

```wsl_start2.bat
@echo off
start wsl wsl2mydns MyDNS-ID MyDNS-PASS
pause
```

　WSL2を使うときに、このbatをWindowから実行すればOKです。IPはMyDNSに通知され、ドメインとプライベートIPが結びつきます。

# ５．仕組み

　MyDNSに通常の方法でIPを通知すると、自分の使っているネットワークのグローバルIPが設定されてしまいます。ということで、プログラムでWSL2上のeth0のIPを通知するようになっています。

　ソースコードは[GitHub](https://github.com/mofon001/wsl2mydns)に入れてあります。TypeScriptを使いました。


# ６．困ったこと

　Windowsからビルドしたものをnpmに登録すると、コマンドとして実行させるための以下の行、

```
#!/usr/bin/env node
```

ここの改行コードに文句を言われ、コマンドが正常に実行できない状態になりました。おかげで何度もnpmに再アップする羽目になりました。

# ７．作成に使ったTypeScript

　思い立ったが吉日で、さくっと作りました。MyDNSの操作ライブラリは以前から作ってあったので、DirectIP登録の部分だけ追加するだけで済みました。やはりTypeScriptを使うと、素のJavaScriptでやるよりも、プログラミングが楽です。

　[こちら](https://ttis.croud.jp/?p=558)にTypeScriptの入門ネタを作り始めました。時間のあるときに内容を書き足していきたいと思っています。ちなみにそのシステム自体も、フロントエンドとバックエンド両方ともTypeScriptで出来ています。
DataFrameの結合

# concat

単純結合する場合

```python
#縦方向
pd.concat([df1, df2])

#横方向
pd.concat([df1, df2], axis=1)
```

共通項目のみ結合する場合

```python
pd.concat([df1, df4], axis=1, join='inner')
```
# merge

表df1　と　表df2　を　条件値の値一致で結合する場合

```python
#結合条件：id列の一致 (左表優先）
df3 = pd.merge( df1 ,  df2 ,  on='id',how='left')

#結合条件：id列とkye列の一致
df3 = pd.merge( df1 ,  df2 ,  on=['id','key'])
```
#join
indexをキーに結合する

```python
df1.join(df2, how='inner')#共通項のみ結合
df1.join(df2, how='right')#右表（df2)優先結合
df1.join(df2, how='outer')#全行結合 値がない場合はnan値
```

#append

行番号＝nameのある行(Series)を追加する

```python
s1 = pd.Series(['X0', 'X1', 'X2', 'X3'],
               index=['A', 'B', 'C', 'D'], name=10)
df1.append(s1)
```

#その他（表関連）
## drop_duplicates

idが重複する行を削除

```python
df1.drop_duplicates(subset='id')
```
【目的無しの泥臭調査⑧】監視情報表示の「top」「htop」コマンドだけでは満足できなかったため、「gtop」を試用して、ネットワーク情報を大幅可視化。

- ふと気になったことを、淡々と赴くままに調査していく、この上ない自己満足記事第八弾。
- 日々成長する効率性や、連日生み出される便利ツールを生かしながらも、泥臭調査も好きで同時に行う生活。
- 今回は、監視コマンドの「top」「htop」コマンドだけでは、満足しなかった外観重視技術者の私のために、「gtop」を試用することにしよう。

## 概要
- Node.js製の、ネットワークやCPU等といった監視情報をグラフ・ダッシュボード化して分かりやすく表示してくれるコマンドツール。
- 同様のtopやhtopコマンドに比べて、プロセスの流れの理解の容易さや見やすさが利点。
- [公式GitHub](https://github.com/aksakalli/gtop)

## 特徴
### グラフ表示
- ネットワークやCPU等といった様々な監視情報を、グラフ（可視）・ダッシュボード化して表示するため、視覚的に理解しやすい。

### 項目ごとの並び替え表示
- topやhtopコマンド同様、CPU使用率やメモリ順に並び替えることが可能なため、不具合等の原因究明がしやすい。

### 整理された情報表示
- CPUやネットワーク、ディスク容量等といった情報が項目ごとに、ブロックとして、整理されているため、内容が見やすい。

### ターミナル完結
- プロセスを可視化するために、別途ツールを立ち上げる必要がなく、ターミナル上で完結する。

## 作業環境
- Amazon Linux 2
- **※今回はAmazon Linuxを利用しているが、Node.js環境があれば、MacやWindowsでも利用可能。**

## インストール
- gtopのインストールでは、npm(Node.jsのパッケージ管理)を利用する。
- 今回は、EC2のLinux環境を利用しているため、下記のコマンドをうち、Node.jsのインストールを行う。
- **※EC2以外(WindowsやMac,その他Linux)のNode.jsのインストールは[こちら](https://www.sejuku.net/blog/72545)を参考にする。**

```bash
# バイナリの取得
$ curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -

# Node.jsのインストール
$ sudo yum install -y nodejs

# npmバージョン確認
$ npm -v
```

- npm利用確認後、下記のコマンドをうち、gtopをインストールする。
    - **※npmが利用できれば、gtopはMacやWindowsでも利用可能。**

```bash
# gtopのインストール
$ npm install gtop -g
```

## 結果
- 下記、実際の画面。
    - CPUやメモリ、ネットワーク等の情報がグラフになって可視化される。
    - 各情報がブロックとして、整理されており、見やすく表示されている。
    - ディスク容量の概要も確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/327fc260-452f-5054-0fe0-3e1634038425.png)


## 基本操作
- gtopの基本操作コマンドとしては、下記。

|内容|コマンド|
|:---:|:---:|
|起動|`gtop`|
|プロセス順での並び替え|起動状態のまま、`p`|
|メモリ順での並び替え|起動状態のまま、`m`|
|CPU順での並び替え|起動状態のまま、`c`|
|終了|起動状態のまま、`q`|

- 一部の環境で、表示の不具合や挙動エラーが起きる場合がある。
- その場合、下記のコマンドをうち、環境変数を設定して、起動する。

```bash
$ LANG=en_US.utf8 TERM=xterm-256color gtop
```

## まとめ
- 今回は、監視コマンドの可視化ということで、「htop」コマンドとの併用の目論みと、両方使いによるメモリの高負荷の心配を抱えながら、記事を書く。
- 数日監視コマンドと向き合った私は、改めて「メモリの使用量軽視」という重く愉快な現実がのしかかる。
- 時代の突然変異なのか、急に「Linux外観ツール大流行」が起きている日常は、いつまで継続するのか自己問答。

## 参考
- https://github.com/aksakalli/gtop  
→公式Githubです。大変お世話になりました。
- https://linuxfan.info/gtop  
→こちらの記事を参考にしました。大変お世話になりました。
- https://ubuntuapps.net/blog-entry-1035.html  
→こちらの記事を参考にしました。大変お世話になりました。
なんとかかんとか応用情報を取った話。

# 始めに
本記事は初めて挑戦するという人向けにも書いているが、自分と同じように点数に伸び悩んでいる人向けに書いたものでもある。
参考にできそうなら、ぜひしていただきたい。
(ちなみに、私は午後が62点くらいでギリギリだったため、いまいち微妙かもしれない点があるが、そこは他の人の意見も参考に自分に合ったやり方を見つけてほしい。)

### 私のスペック
高校受験、大学受験共に失敗し、現在Eランの大学に通っている。
大学1年生の秋に一発で基本情報技術者試験に受かり、調子に乗って応用情報を受けた結果、大学2年生で2回試験に落ち、大学3年生でやっととれた。
得意科目は数学だが、それに反比例して__国語がすっごい苦手__

### 応用情報は難しいか
そこそこ難しいが、知識的には基本情報と大きく異なるところはない？(午前は体感あるかも？)
ただ、何よりも重要な点として__国語の力を必要とする。__

# ではどうすればいいのか・対策
## 午前  
⇒[過去問道場　応用情報技術者試験](https://www.ap-siken.com/apkakomon.php)  
これがThe・Answerだ。 教科書は買ってもいいが、これだけでも繰り返せば十分知識を得ることができる。
覚えるほどやるようにする。覚えるつもりでやるのではなく、解いていたら覚えてしまったレベルにもっていくことが鍵だ。

## 午後
- 午後は過去問を買ってやってみることだ。
  - まずはやってみる。一度すべて通してやってみて、自分のやりたいと思える項目を5,6個見つけることだ。
  - 当日解くのはおそらく問１＋残りの問から4問となるだろうが、問1+残りの問から5,6問で勉強をしてみる。
  - こうすることで当日急に難化した問題にあたったときや、単純にまったくわからない項目があっても何とでもなる。
  - __時間は必ず測ってやってみる事。(時間を図らなくていいのは直近3回目くらいまで)__
- 勉強するのは10回分くらい。直近3回分くらいは購入した過去問から
  -  直近3回分で実際に回答したものと答えにどれほど差があるか確認してみてほしい。あまりにも大きな差がある場合にはまず、その知識を埋めるために理論を覚える。
  -  もし、理論がある程度あっている場合は、国語力で負ける可能性があるため、自分の回答が問題の意図に添えているか確認してみてほしい。その後、公式の回答と自分の回答と問題を見て、自分が理想の答えとなるにはあとどういった気の回し方が足りないのかしっかり理解してみよう。
- 一度やった過去問を再度繰り返すこと  
  - おそらく内容をだんだん覚えてしまうとは思うが、それでも問題を改めて解き、理論を確認し、問題文から回答をどのようにすべきか、を確認し、理想とする回答に近づける事。
  - 一度解いた過去問にも手を抜かないでやってみる事。

これくらいだろうか...？

# 終わりに
今回の対策に関しては完全に私の体験談をもとに書いたものなので、もちろん合う合わないがあるだろう。
ましてや大学生であり、時間もあったし、点数もそこまで高くはない。運が良かっただけかもしれないが...。
何にせよこれから勉強を始めようとしている人、行き詰ってしまった人はぜひ試してみてはどうだろうか？
C言語の復習がてら、ゲームに応用してみる Part2

# はじめに
  本記事は[Part1](https://qiita.com/lastorder0316/items/9df5d12e89f91f4969dd)の続きなので、まだPart1を見ていない人はそちらを先に見てほしい。

# 美しきコードは幸せを運んでくる。
では、さっそくやっていこう。

いきなりだが、コードを書くうえで最も大事なことは何かわかるだろうか？
素早くコードが書けることか？コードを短くまとめられることか？いや違う。
それはおそらく「__見やすいコードが書ける。__」ということである。
いくら早くても、短くても、見にくければあとから改良するときや見直したときに、まぁ大変なことになる。
コードを見た瞬間にあなたの創作意欲は地の底に落ち、今すぐ家に帰り、暖かいお風呂に入り、おいしいご飯を食べ、清潔なベッドで快眠を取って明日にしてしまいたくなるだろう。
こんなことにならないように、常にわかりやすくコードを書くことを心に刻んでおいてほしい。
特に「コメント」は大事だ。以下のコードを見てほしい。

```c:main.cpp
#include "DxLib.h"

/*DxLibはWinmainで始まる。*/
//正常終了 -> 0が返ってくる。
//エラー時 -> 1が返ってくる。
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //Dxライブラリの初期化
    if (DxLib_Init() == -1)
    {
        return -1;//エラー
    }

    //Escキーが押されていない間(==0 のとき)、無限ループする。
    while (CheckHitKey(KEY_INPUT_ESCAPE) == 0) {

    }

    DxLib_End();//Dxライブラリーの終了

    return 0; //プログラムの正常終了
}
```

どうだろう？
Part1でもお見せしたコードだが格段に見やすくなったのではないだろうか？
コードが読めなくとも読むことができる。  

ただ、コメントがいらない場合もあるということは肝に銘じておいてほしい。
「DxLib_Init() が Dxライブラリの初期化であるということは明白である」から 「//Dxライブラリの初期化」というコメントはいらないという判断をするならばその一行はいらなくなり、コードは全体で短くなる。コードは短いことに越したことはないので、いるかいらないかは常に考えるべきである。

# 優しさ一塩、printf
続いてCプログラマーならだれでも最初に挨拶をするprintfだ。とりあえず気軽に「Hello World!」しておこう。
さて、おそらく今まで黒い画面と戦ってきた人ならわかると思うが、今までprintfを使って計算結果を表示することや文字を出すのによく使っていたものだと思う。しかし、今回は視点を変えてみよう。

## printf("Hello Too Error World!!!")
何かものを作るうえでコードを書けば書くほどエラーが出る。というのはつきものである。
先ほど書いたmain.cppファイルでもどこかでエラーが出るかもしれない。
では、エラーが出た時になかなかどこでerrorが出てるのかわからないとしよう。
そうしたときに行かせるのがprintfである。
例えば以下のようにエラー対策してみる。

```c:main.cpp

//Dxライブラリの初期化
if (DxLib_Init() == -1)
{
    printf("Dxライブラリの初期化でエラーが発生！WINAPI内を参照してください!");
    return -1;//エラー
}
```
このように書いておけばDxライブラリ初期化のときにエラーが発生した場所をエラーメッセージからすぐに理解することができるだろう。

また、どこでエラーが起きたかわからないときに力技で解決することができる。

```c:main.cpp
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    printf("ここまで行きました:通過点1");
    if (DxLib_Init() == -1)
    {
        printf("ここまで行きました:通過点2");
        return -1;
    }
    
    printf("ここまで行きました:通過点3");
    while (CheckHitKey(KEY_INPUT_ESCAPE) == 0) {
        printf("ここまで行きました:通過点4");
    }
    printf("ここまで行きました:通過点5");
    DxLib_End();

    return 0;
}
```

このようにすれば、エラーに

```
ここまで行きました:通過点1
ここまで行きました:通過点2
error:なんたらかんたら~
```
と表示され場所の特定をできるだろう。
(もっといい方法があるのだろうが...)

# 手がつかれた。
とりあえず今回はここまでとしておきたい。
なかなかゲームを作るところに入れなくて申し訳ない。次からしっかりやるので、許してくれ。
次:[工事中]
Bitrise で google_services.json を扱う

毎回 google_services.json を扱うプロジェクトを Bitrise に載せる時に忘れているので記録まで。初めて扱う人の参考にもなれば。

google_services.json は一般的に .gitignore に記述して git にコミットしないので、CI で Lint を掛けるとコケます。Bitrise の場合はワークフローにファイルを生成するステップを追加できるのでそこで google_services.json を生成するようにして回避します。

* *Secrets* に変数を定義して google_services.json の中身を保存します（青く記述されている部分に登録するシークレットの中身は、Expose for Pull Request を有効にしない限り安全である旨書かれています）。ここでは GOOGLE_SERVICES_JSON と云う名前の変数を定義しています。

![bitrise_secret.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188470/4b0917aa-4155-0c90-bcc1-75c8ec7f47bf.png)

* *Workflows* で *Android Lint* の前に **Generate Text File** のステップを追加します。*File Name* はプロジェクトに合わせて変更する必要があります。このプロジェクトでは app/ 以下に google_services.json を置いてあるので app/google_services.json のパスでファイルを生成します。ファイルの中身は *Insert Variable* で先に定義したシークレットを選択します。

![bitrise_workflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188470/da466d44-0bd8-155e-bf70-49dbba3fd11a.png)

bitrise.yaml にもちゃんとステップが追加されています。

```yaml
- generate-text-file@0.1.0:
    inputs:
    - file_content: "$GOOGLE_SERVICES_JSON"
    - file_name: app/google-services.json
```

これで Lint でコケることなくビルドを通すことができます。
C言語の復習がてら、ゲームに応用してみる Part1

# 前置(見なくても特に支障はない)
## 初めに
今回の記事はC言語を勉強する上でGUIでの開発をしているが、私自身が初心者であるため、ところどころに抜けがあるかもしれないがどうか許してほしい。そして気づいた場合にはぜひ教えていただきたい。
また、CUIをディスるような発言が多々見られるかもしれないが、決してそんな気はないので寛容に見ていただけるとありがたい。

## 退屈な黒き画面からの脱出
プログラミングの学習を始める際に、C言語に触れるというケースは多いだろう。 
その中で、C言語の勉強のほとんどは「コマンドプロンプト(cmd)」を用いるのだ。

プログラムの中に処理を書いたら、それが黒い画面に表示され、結果を見て、次のステップへ...。
そういう学習を多くのプログラマは経ている。実際私はそうだった。
だが、一つ問いたいのは「__こんな勉強方法を面白く感じるか？__」ということだ。
（面白く感じるから私の話を聞く必要のない人もいるだろう。そういう人は即座にこのページを閉じ、幸せな人生を歩んで欲しい。）

## 成果物を作ってこそのプログラマー
私たちはもっとプログラムに対して夢を持っていたはずだ。何でもできる魔法とさえ感じたはずだ。(言い過ぎかもしれない)
何よりおそらく全員がこういった感情を持つだろう。
「__で？これができたら結果として何になるの？__」
こういった感情を抱けば、学習することはかなり苦痛となり、学んでもすぐに忘れてしまうことは間違いない。
だからこそ、__目に見える形にして、達成感を得て、初めてプログラムを学んだといえるだろう。__
そういう視点から見て、今回はしっかり目に見えるものを制作していこう。

# 概要  
今回のシステムの概要をざっくりと言うと、
### __「C言語を使ってゲームを作りつつ、その仕組みを理解してC言語を学ぼう。」__  
ということである。  

作ったゲーム ：__アウトベーダー__
__(インベーダーならぬ)__
ざっくりゲームについて説明すると逃げていく敵に対して、弾を打ち、倒すゲームだ。スコアなどは特にない。

　![プレイ画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414572/d17bb9c5-a3a8-9166-7e18-b17d017af8a7.png)
#### 　[githubはこちら](https://github.com/LastOrder0316/Outvader)
## 今回使用する環境設定等
開発環境+ツール：
[Visual Studio](https://visualstudio.microsoft.com/ja/?rr=https%3A%2F%2Fwww.google.com%2F)
(私が開発したときの最新は2019だった。)

ゲームライブラリ(インストールからゲーム制作の初期設定含め全て)：
[DXライブラリ](https://dxlib.xsrv.jp/)  

# Let's 開発
## 初期設定
まずは概要に記載したそれぞれからインストール及びダウンロードを行い、開発の環境を整えよう。(Dxライブラリはリンク先のページに設定方法等書いてあるため、自分のインストールしたVisual Studioのバージョンにあった設定を行っていただきたい。)

設定が終わったら、一度作ったファイルを削除した後、「Main」という名前のcppファイルを作り、以下のコードを書いて実行してみてほしい。

```c:main.cpp
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    if (DxLib_Init() == -1)
    {
        return -1;
    }

    DxLib_End();

    return 0; 
}
```

このプログラムを動かしてみた人なら真っ先に私に対して**「お前のプログラムバグってんぞ！！！」**と文句を言いたくなるだろう。
それもそのはずだ。**このプログラムは画面を表示してすぐに消えるように作られているのだから。**

##　プログラムの仕組みを知っておこう
プログラムの仕組みとしてまず知っておかなければいけないのは**「プログラムは上から下に順を追って動く」**ということだ。
当たり前のことのように思うかもしれないが、処理の順番はとても大切だ。

そこで先ほどのコードを以下のように書き変えてみてくれ。  

```c:main.cpp
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    if (DxLib_Init() == -1)
    {
        return -1;
    }

    //Escキーが押されていない間(==0 のとき)、無限ループする。
    while (CheckHitKey(KEY_INPUT_ESCAPE) == 0) {

    }

    DxLib_End();

    return 0; 
}
```
これで画面が表示され続けるはずだ。

# 勉強は疲れないか？私は疲れる。
かなり長く書いたため、私が書き疲れたので、続きは次回にしようと思う。
次回から本格的に開発をしてみよう。
[Part2はコチラ](https://qiita.com/lastorder0316/items/1d45a1d2beb58a3ff4b6)
RealityKitでモーションブラーなどを有効化する

RealityKitのARViewは初期化状態でモーションブラーやノイズがオフになっている。

```swift
arView.renderOptions //16
```

オプションは
https://developer.apple.com/documentation/realitykit/arview/3255316-renderoptions
にある通り、全てdisable~なので有効にする場合はこれを消せば良い。


```swift
arView.renderOptions = []
```

これで全て有効になる。
react-loopsでReactのリスト表示を美しく簡潔に書く

2019年も半分を過ぎました。早い、、
今回はReactのリスト表示の話で、react-loopsという新しいライブラリを見つけて使ってみたのでゆるく紹介します。

https://github.com/leebyron/react-loops

作者は元Facebookのエンジニアで、ReactやGraphQL周りのOSSコントリビューターであるLee Byronです。

## 普通のやり方
JSXのメリットの一つは全てがJavaScriptである点です。リスト表示をする場合は下記のようにArray.mapを使います。

```jsx
function List() {
  const itemList = ['a', 'b', 'c']

  return (
    <ul>
      {itemList.map(item => (
        <li key={item}>{item}</li>
      ))}
    </ul>
  )
}
```

## react-loopsを使うと
react-loopsを使うと、少しテンプレートっぽい書き方になります。ちょっとVueやAngularっぽいと思う人もいるかもしれません。keyが要らないのにも注目してください。

```jsx
import { For } from 'react-loops'

function List() {
  const itemList = ['a', 'b', 'c']

  return (
    <ul>
      <For of={itemList}>{item => <li>{item}</li>}</For>
    </ul>
  )
}
```


## 配列が空の場合を考慮したリスト
配列が空の場合は、"no items" と出したいとしましょう。

### 普通のJSX
```jsx
    <ul>
      {itemList.length < 1 ? (
        <div>no items</div>
      ) : (
        itemList.map(item => <li>{item}</li>)
      )}
    </ul>
```

あれあれ、ちょっと汚くなってきました。

### react-loops
```jsx
    <ul>
      <For of={itemList} ifEmpty={<div>no items</div>}>
        {item => <li>{item}</li>}
      </For>
    </ul>
```
美しくなりました！
ifEmptyにstringやcomponentを指定すると、配列が空のときはループを回す代わりに表示してくれます。



## 何が良い？

### 1. 非Reactな人にわかりやすい
日本国内においては最近はVueを勉強してからReactに来る人が多かったり、Railsなどでテンプレートエンジンに慣れ親しんだ人がReactを触る機会が多いと思います。そういった場合にほとんどのテンプレートエンジンがサポートしているループ表示にちかいインターフェースはわかりやすいです。

### 2. なんだかんだこういうの欲しかった
Reactエンジニアとしてはどうでしょう。自分はかなりReact的な思想に共感してVueでもAngularでもなくReactを楽しみ、好んで書いています。素のJSでもできるのにわざわざ入れる必要のない「おせっかいなライブラリ」はSimpleが強みのReactらしくない部分があり嫌いでした。
ただ、react-loopsはやっていることは単純だけど便利で個人的にはRight Level of Abstractionな気がします。

### 3. 痒いところに手が届くAPI
Loop iteration metadataがなかなかに素晴らしいです。

- index
- length
- key
- isFirst
- isLast

実際のアプリケーション開発をしていると、「配列の最後だけ、最初だけXXしたい」とか、ふと配列のlengthが欲しくなったりするものですが、そういったときにreact-loopsのLoop iteration metadataは痒いところに手が届くAPIとして優秀です。

```jsx
    <ul>
      <For of={itemList} ifEmpty={<div>no items</div>}>
        {(item, {isLast}) => (
          <li>{item} {isLast && '最後'}</li>
        )}
      </For>
    </ul>
```
こんな感じ。なんだかんだで素のJSだとどう書いてもごちゃっとなりがちです。「アプリケーションが複雑なのが悪い」と文句を言って跳ね返すのは簡単ですが、UX向上を考えるとこの手の対応は必要ですし、そうした時にコードが汚くなる後ろめたさがないのはDXも良いと感じます。

## Reactぽくなくない？
同じFAQがgithubのREADMEにありますが、自分も最初見たときは「Reactぽくないからだめじゃん」と思ってました。ただ、少し使ってから考えてみるとAPIはシンプルでわかりやすいし、ただ単純にmapで配列を回す部分にそこまで素のJSであるメリットはないのではという考えに至りました。

## 雑感、あとがき

Reactエコシステムは日々新しい話題やアイディアが出てくるOSSのるつぼです。OSSの１ユーザーであるエンジニアにとっては取捨選択が難しいですが、こういったシンプルでエレガントなOSSを見つけるのは宝を発見したような感覚で楽しいと感じます。

今まで他に自分がシンプルかつエレガントと思ったのはstyled-components, redux-thunk, immer, react-testing-libraryあたりですが、今回新たにreact-loopsが加わりました。
【PostgreSQL】入門

## はじめに
Webサービスを作るにあたり、データベースが必要になったので調べた。
PostgreSQL利用。
メモがてら書いたので雑かもしれません。

## 用語
* リレーショナルデータベースマネジメントシステム
    * データベースの種類。PostgreSQLはこれの一種。
* テーブル
    * ExcelのSheet、Book
* カラム
    * 列
* レコード
    * データそのもの
* フィールド
    * Excelのセル

## フィールドのデータ型
* INTEGER
    * 数値データ型
    * 整数（-2147483648から+2147483647）
* TEXT
    * 文字型
    * 上限なし可変長
* CHARACTER VARYING(n), VARCHAR(n)
    * 文字型
    * 上限付き可変長
* CHARACTER(n), CHAR(n)
    * 文字型
    * 空白で埋められた固定長
* SERIAL
    * オートインクリメント

## コード
* テーブル名``Rank``
* カラム``id``
    * id、主キー、重複禁止
* カラム``hands``
    * 手数、空欄不可
* カラム``name``
    * テキスト、10文字まで、空欄不可
* カラム``level``
    * 数字

```:psql
# テーブル作成
CREATE TABLE Rank(
id SERIAL,
hands INTEGER NOT NULL,
name VARCHAR(10) NOT NULL,
level INTEGER NOT NULL,
PRIMARY KEY(id)
);

# ダミーレコード作成
INSERT INTO Rank (hands, name, level) VALUES (10, 'taro', 2);
```

テーブルの詳細確認、フィールド情報など

```:psql
\d rank
```

レコードの確認、入っているデータの確認

```:psql
# すべてのレコード取得
SELECT * FROM rank;

# idが3のレコードのname取得
SELECT name FROM rank WHERE id = 3;
```

## 参考サイト
* https://www.postgresql.jp/document/9.4/html/datatype.html
    * データ型
1日目

システムアーキテクチャ
wiki:システムの構成・動作原理を表している。

1. 基本的なシステムハードウェア
    CPU メモリ USB
2. BIOS/UEFI
    BIOS:キーボードやハードウェアを制御するもっとも基本的な制御プログラム
    パソコンさんの電源が入って最初に動く、主にハードウェアを制御するプログラムのこと。
    OS（コンピュータの人格に相当するソフト）が動き出す前のお仕事をやってくれるプログラム

    UEFI:BIOSの後継機
    OS（コンピュータの後継機人格に相当するソフシスブイイニットト）とファームウェア（ハードウェアを制御するプログラム）のやり取りに関する取り決めのひとつ

    PCの電源をいれるときに特定のキーを押すことで、セットアップ画面に入れる（F2）
        設定項目
        ・日付
        ・キーボードの使用/不使用
        ・各種デバイスの使用/不使用
3. デバイス情報の確認
    ハードウェアのアクセスを抽象化するデバイスファイル
    /devディレクト以下にある
    udevという仕組みによって自動的に作成されている
    /procディレクトリ以下の主なファイル
    　・/proc/cpuinfo
    　・/proc/meminfo
    　・/proc/bus/usb/*
4. USBデバイス
5. udev
    ?
6. デバイスドライバのロード
    デバイスを制御するための必要な制御プログラムをデバイスドライバ
    デバイスドライバをカーネルに取り込むことをロードするという https://wa3.i-3-i.info/word15.html

1.2.1 システムが起動するまでの流れ
    BIOS/UEFI ハードウェアの初期化
    ブートローダ 起動したデバイス上からカーネルをメモリ上へ読み込む
    カーネル メモリの初期化やシステムクロックを行う
    init/systemd ログインプロンプトを実行
    *電源を入れてからシステムを起動するまでの流れをbootstrapまたはbootという
1.2.2 起動時のイベント確認
    dmesgコマンドでシステム起動時に行ったカーネルの処理がわかる
1.2.3 システムのシャットダウンと再起動
    shutdown [オプション] 時間 [メッセージ]

1.3 SysVinit
  SysVinit -> systemd システムの電源をいれてからLinuxが起動する手順はここ数年で大きく変わった。という新しい起動仕組みになった。  
1.3.1 SysVinit(シスブイイニット)による起動
    SysVinit
    あらかじめ決められた順にサービスが起動していく->起動遅い
    systemdシスブイイニット
    サービスを並列で起動できる・依存関係を適切に設定してくれる->短時間で起動
1.3.2 ランレベル
    SysVinitを採用しているシステムは、ランレベルと呼ばれるいくつかの動作モードがある
    ex)ランレベル5ではクライアントPCとして必要なGUI環境を利用できる
    ex)ランレベル1でrootユーザーだけが利用できる特殊な状態->システムのメンテナンスなど、一般のユーザーがシステムを利用しては困る場合とかに利用
1.3.3 ランレベルの確認と変更
    現在のランレベルを確認 runlevelコマンド
1.3.4 起動スクリプトによるサービスの管理
1.3.5 デフォルトのランレベルの設定
    /etc/inittab

1.4.1 systemdの概要
    systemdは必要なサービスのみが起動する
    SysVinitでは設定されているサービスは必要なかったとしても起動される
1.4.2 systemdの起動手順

1.4.3 systemctlによるサービスの管理
    systemdでサービスを管理するsystemctl
Gitの日付表示を日本式(yyyy-mm-dd)にしたい Mon Apr とか言われても直感的じゃない

```
git config --global  log.date iso-local
```

## 実行例
Dateのところが変わっている。

### before
```
$git log -n 1
commit 56ce511e63b242f9ee94169fbdkgb0849f45f7a0 (HEAD)
Author: shirofune9876 <shirofune9876@gmail.com>
Date:   Mon Apr 03 00:05:20 2019 +0900
```

### after
```
$git log -n 1
commit 56ce511e63b242f9ee94169fbdkgb0849f45f7a0 (HEAD)
Author: shirofune9876 <shirofune9876@gmail.com>
Date:   2019-04-03 00:05:20 +0900
```

### 特に、pretty=formatしたときに気持ち良い

```
$git log --pretty=format:"%ad" -n 5
2019-04-27 00:05:20 +0900
2019-04-23 00:02:50 +0900
2019-04-17 22:45:34 +0900
2019-04-17 20:44:09 +0900
2019-04-17 10:20:45 +0900
```
RSpecのテストを一旦コメントアウトしたいときは、xをつけてpendingにしよう

## コメントアウトすると、RSpecの実行結果からコメントアウトしていることに気づけない

```ruby:pasta_spec.rb
describe Pasta, type: :model do
  describe '#boil' do

    context '14mm' do
      # it { expect(Pasta.new(size: 14).boil(min: 8)).to eq TASTE::NICE }
    end
    context '18mm' do
      # it { expect(Pasta.new(size: 18).boil(min: 8)).to eq TASTE::SOLID }
    end
  end

  # ..略(このあと、47個のテストがある)..
end
```

```:RSpec
$docker-compose exec web bundle exec rspec spec/models/pasta_spec.rb
...............................................

Finished in 1.55 seconds (files took 3.7 seconds to load)
47 examples, 0 failures
```

## itにxをつけて、xitとすると、実行結果に明示的にpendingと出る
```ruby:pasta_spec.rb
describe Pasta, type: :model do
  describe '#boil' do

    context '14mm' do
      xit { expect(Pasta.new(size: 14).boil(min: 8)).to eq TASTE::NICE }
    end
    context '18mm' do
      xit { expect(Pasta.new(size: 18).boil(min: 8)).to eq TASTE::SOLID }
    end
  end

  # ..略(このあと、47個のテストがある)..
end
```

```:RSpec
$docker-compose exec web bundle exec rspec spec/models/pasta_spec.rb
..**.............................................

Pending: (Failures listed here are expected and do not affect your suite's status)

  1) Pasta #boil 14mm 8 min should eq nice
     # Temporarily skipped with xit
     # ./spec/models/pasta_spec.rb:19

  2) Pasta #boil 18mm 8 min should eq かたい
     # Temporarily skipped with xit
     # ./spec/models/pasta_spec.rb:24


49 examples, 0 failures, 2 pending
```
出現頻度のまま学習データの比率にするのは得策ではない。


機械学習のためにデータを収集して学習を実行する人のために、経験的な知見をメモしたいと思う。

機械学習に詳しくない人は、「データを片っ端から学習データに加えればうまくいくんだろう」と思っているかもしれない。

しかし、学習データに加える比率を調整したほうが学習がうまくいきやすい。

既に多くの人が指摘しているので、ここではそれらへのリンクを示すことで代用したい。

## アンバランスなデータ

アンバランスなデータの場合、損失関数の定義の中で影響してしまう。

それは、学習が損失関数の定義の中で、trainデータの集合が重要になってくるからです。


### 例：SVM の損失関数の定義 [サポートベクターマシン](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%83%99%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%9E%E3%82%B7%E3%83%B3)

![](https://wikimedia.org/api/rest_v1/media/math/render/svg/364c62d894c5de59fb59c4b194be4f20a6fa5869)


### [損失関数の紹介](https://www.renom.jp/ja/notebooks/tutorial/basic_algorithm/lossfunction/notebook.html)




## アンバランスなサンプルの損失関数への影響

仮にポジティブサンプルが１％、ネガティブサンプルが９９％のデータセットで、なんの工夫もなしに学習すると無意味な学習結果になってしまいます。
全てに対してFalseを返せば、なんと９９％の精度で当てたことになります。
でも、それってほしいものじゃないね。


ですから、学習データの頻度を自分の問題に適するように考えて調整してください。

世の中には、既に有用な記事を書いてくださっている方々がいます。


例：

https://qiita.com/ryouta0506/items/619d9ac0d80f8c0aed92

不均衡データのクラス分類 
https://www.slideshare.net/sfchaos/ss-11307051

https://teratail.com/questions/117564

https://tjo.hatenablog.com/entry/2017/08/11/162057

http://kamonohashiperry.com/archives/469


https://blog.amedama.jp/entry/imbalanced-data


https://qiita.com/r-takahama/items/631a59953fc20ceaf5d9


---
追記(2020.12.01)
[sklearn.svm.SVC]
(https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html)
には **class_weight** という引数に`balanced`という値を与えることで、その問題を解決することができます。


```
class_weight dict or ‘balanced’, default=None
Set the parameter C of class i to class_weight[i]*C for SVC. If not given, all classes are supposed to have weight one. The “balanced” mode uses the values of y to automatically adjust weights inversely proportional to class frequencies in the input data as n_samples / (n_classes * np.bincount(y))
```
Reactコンポーネントのライフサイクル

React で使われているコンポーネントは、プロパティやステートの変化を受けて状態を変化します。最終的にぺージから破棄されるまでの間をコンポーネントのライフサイクルと言われます。

Reactでは、ライフサイクルの辺ごと、様々なメソッドが呼びだれています。
これにより、コンポーネントの表示や破棄の各タイミングで、独自の振る舞いを実装することができます。

以下がライフサイクル時に呼ばれるメソッド群です。

componentWillMount : コンポーネントの描画の直前に呼びばれる。
componentDidMount :コンポーネントの描画の直後に呼ばれる。
componentWillUnmount :コンポーネントの解放のタイミングで呼ばれる。
componentWillReceiveProps:プロパティを受け取る直前に呼ばれる。
shouldComponentUpdate コンポーネントの更新の可否を決定する
componentWillUpdate コンポーネントの更新の直前に呼ばれる。
componentDidUpdate コンポーネントの更新の直後に呼ばれる。

このうちは、componentWillMount :は、コンストラクタで代用可能であり、非推奨とされているらしいです。
コンポーネントのライフサイクルは大きく２つに分類され例外の処理をハンドリングすることもできます。実行例は追々。
コンポーネントのMount（生成および破棄）
コンポーネントのUpdate（更新）

コンポーネントのErrorHandling (例外発生)
【Solved】Entity Frameworkの複数テーブル操作がわからん。。。

#参考サイト
◆LINQ to SQL Entity Framework　結合など使用したものメモ
　https://qiita.com/suzu_belle/items/2a451b8bfce8a5388e28
◆EntityFramework（CodeFirst）でJoinを試してみる
　https://kazenetu.exblog.jp/19246594/
◆Entity FrameworkでJoinを使わずに内部結合する
　https://qiita.com/keidrumfreak/items/f15d36bfdb35ca2dc6b0
◆Entity Framework の懸念
 https://techinfoofmicrosofttech.osscons.jp/index.php?Entity%20Framework%20%E3%81%AE%E6%87%B8%E5%BF%B5
◆【新人教育 資料】第9章 SQLへの道 〜結合編〜
 https://qiita.com/devopsCoordinator/items/3ba154429973a4ddc9e0
◆EF複数のテーブルを1つのIQueryableに結合する
 https://entityframework.net/ja/knowledge-base/39695922/
※拡張メソッドとかもキーワード指定したら他にも良いサイトが出る...かな!?

# 参考ソースコード
```csharp:join.cs

//queryはIQueryable型になる
var query = DB.Table1

 // 外部結合：このxはTable1を指す
 .GroupJoin(DB.Table2.DefaultIfEmpty(), x => x.Column1, T2.Column1, (T1, T2)=>
  new { T2.Column1, T2.Column2, T1.Column3 })

 // 内部結合
 .Join(DB.Table3, (T2, T3)=> new { T3.Column_a, T3.Column_b }).DefaultIfEmpty()

 // このxは直前のJoinのテーブルが対象となる
 .Where(x => x.Column_a == user_input);
 
```

```csharp:union.cs

// Unionして
var query = db.Companies.Select(x => new { Id = x.CompanyId, x.Name })
.Concat(db.Organizations.Select(x => new { Id = x.OrganizationId, x.Name }))
.Concat(db.Authorities.Select(x => new { Id = x.AuthorityId, x.Name }));

// 条件絞り込むってことね...
var result = query.Where(x => x.Name == "Bob").OrderBy(x => x.Name);

```

# 結論
色々調べていたら、自分がやりたいことはUnionだったorz
　※これでうまくいくかどうかはComing Soon...⇒うまくいった！！
git checkout とか git push のときに、ブランチ名をコピーするのが面倒なとき

ホームディレクトリ配下の`.gitconfig`に以下の設定を書いておくと、`git jump`とか`git bcp`と打ち込むだけで、移動したり、ブランチ名をコピーできます。
ただし、[peco](https://github.com/peco/peco)コマンドが入っているのでインストールはお忘れなきよう。

```:~/.gitconfig
[alias]
  jump = !git checkout $(git branch | sed 's/*//g' | sed 's/ //g' | peco)
  bcp  = !git branch | peco | sed 's/*//g' | sed 's/ //g' | tr -d '\n'  | pbcopy
```

なお、!について、ですが、StackOverFlowによると、
> If the alias expansion is prefixed with an exclamation point, it will be treated as a shell command.

!がついてると、shell commandとして見做すということだそうです。
（ついてないと→な感じのエラーが出ます。`expansion of alias 'bcp' failed; 'git' is not a git command`）。