OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonメモ1 -sort()の注意点-

Pythonを学習する中で、特にこれは注意すべきだと思ったポイントを、「Pythonメモ」というテーマでQiitaに記事を上げていこうと思います。
今回は、sort()について整理していきます。


1.sort()とは

2.sort()とsorted()の違い

3.sort()、sorted()を使う上での注意点

4.出典


##1. sort()とは

そもそも、sortは日本語でどういう意味なのでしょうか。


**sort**(名)種類、人、もの
**sort**(動)分類する、区分する

(出典) [sortの意味・使い方・読み方 | Weblio英和辞書](https://ejje.weblio.jp/content/sort)

Pythonのsort()は、動詞の意味である「分類する、区分する」という意味から転じて、リストの要素の順番を並べ替える役割を持ちます。並べ替え方は、**アルファベットのみの要素の場合はアルファベット順**、**数値のみの要素の場合は昇順**に並べ替えます。
以下のコードに、その例を示します。

```Python:アルファベットのリストの場合
name = ["Sato", "Suzuki", "Ito", "Tanaka"]
name.sort()
print(name)

#出力結果
["Ito", "Sato", "Suzuki", "Tanaka"]
```

```Python:数値のリストの場合
numbers = [20, 10.9, 39, 3.2]
numbers.sort()
print(numbers)

#出力結果
[3.2, 10.9, 20, 39]
```

上記のように、sort()を使うことでアルファベットのリスト要素はアルファベット順に、数字のリストの要素は昇順に並べ替えることができます。
ちなみに、数字のリストがfloat型とint型で混合していますが、その場合でもsort()は全ての要素を昇順に並べ替えてくれます。


##2. sort()とsorted()の違い

先ほどは、sort()の説明をしました。しかし、sort()以外にsorted()というものがあり、sort()とは少しだけ機能が異なります。
sort()がリスト自体を並べ替えるのに対し、sorted()はリストを並べ替えたものをコピーしてその値を返すのです。
その違いを、実際にコードで見てみましょう。

```Python:sorted()の使い方
name = ["Mai", "Hanako", "Taro", "Emi"]
sorted_name = sorted(name)
print(sorted_name)

#出力結果
["Emi", "Hanako", "Mai", "Taro"]

print(name)

#出力結果
["Mai", "Hanako", "Taro", "Emi"]
```

まず、sort()との違いとして呼び出し方が違うことが分かります。sort()の場合が、**リスト名.sort()**出逢ったのに対し、sorted()の場合は**sorted(リスト名)**です。また、先ほど説明したようにsort()はリスト自体を並べ替えるので、出力する時は**print(リスト名)**とするのに対し、sorted()はリスト自体を並べ替えるわけではなくそのコピーを返すので、上記のコードのように一度変数に代入してから出力する必要があります。
コードの最後に、sort()とsorted()の違いを分かりやすく示しました。sorted()の場合は、リスト名を出力したら並び替える前のリストが出力されるのです。


##3. sort()、sorted()を使う上での注意点

ここまでsort()とsorted()の使い方と違いを見てきました。最後に、両方に共通する注意点を見ていきます。

これまでのリストは全て、アルファベットのみもしくは数値のみのリストでした。なので、試しにアルファベットと数値の混合のリストを用意し、sort()とsorted()を使ってみましょう。

```Python:アルファベットと数値の混合のリスト
#sorted()の場合
various = [3, "Heren", 4, "Kiyoshi"] 
sorted_various = sorted(various)

#出力結果
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'str' and 'int'

#sort()の場合
various_2 = [30, "Asei", "Kohsei", 2]
various_2.sort()

#出力結果
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'str' and 'int'
```

上記をご覧の通り、sort()、sorted()共に同じエラーが出てしまいました。TypeErrorを簡単に和訳してみると、「str型とint型のインスタンスの間では「<」がサポートされていません」となります。つまり、同じ数値であるint型とfloat型においては、大きさを比較して並べ替えることができますが、str型の要素とint型とfloat型はそもそも比較のしようがないということです。

したがって、リストをsort()やsorted()で並べ替えたい場合は、リストの要素がアルファベットなどの文字と数値で混合していないかどうかに気を付けましょう。


##4. 出典

Bill Lubanovic著　斎藤 康毅 監訳　長尾 高弘 訳 　『入門Python3』 
  出版社：オライリー・ジャパン　ISBN 978-4-87311-738-6
従業員満足度を上げるための組織ビジョンの作り方

経営層の言うことが年度ごと、悪ければ4半期ごとにコロコロ変わる会社に勤めて疲弊したことがある。

過去の事とはいえ、**あんな状況は嫌だ**。なので、今も改善策を調査している。

今回は、組織ビジョンを作る方法について「**従業員満足**」の観点で考えてみた。

## 従業員満足度の高い組織ビジョンの定義
「経営層の言っていることが一貫している」

## 従業員満足度の高い組織ビジョンをどう作るか
今回は**360度フィードバック**を使おう。

[以前の記事](https://qiita.com/omokawa_yasu/items/83284182b6ca3c56cc7f)で紹介した360度フィードバックの結果はこんな感じだった。

> 会社のコアメンバー10名ほどからあらゆる方面で意見をフィードバックしてもらい、自分の本当にやりたいことにそこで気付いてそれを会社の主要方針とした。

「自分は、○○なので○○するほうが良いと思ってるんだけどどう思う？」と言い、周りの人には、「**実際にあなたの姿はどう見えているか**」をフィードバックしてもらう。

そこで矛盾が見えたりすれば、**今まで気付いてなかった認知の枠組みを獲得したということ**。改善には絶好のチャンスだ。矛盾を考え直そう。1人でやるのが難しいなら、キャリアカウンセラーなどのカウンセリングの専門家に相談してもいい。**相手から見て一貫性がある状態になるのが理想だ**。

できれば食事を一緒にしながらフィードバックを貰うと良い。なぜなら、食事を共にしていると相手から率直な意見を貰いやすいと心理学的に判明しているからだ（ランチョンテクニックという）。

ただ、フィードバックする側にも技術が必要だ。

- 褒めないし、非難もしない。あくまで見たままの事実を指摘する。
- 相手の今回の意見と関係ないことを指摘しない。

たとえば、こんな感じだ。

###「〇」
「○○したいと言う一方で、でも○○といった行動をしているので、○○の点で矛盾しているように見えます」。

###「×」
「○○したいと言う一方で、でも○○といった行動をしているので、○○の点で矛盾しているように見えます。**そんなだからあなたはダメなんです。そもそも○○の件のときだって同じようなことがあったじゃないですか。もう少しちゃんと考えてくださいよ**」。

##まとめ
経営者は多くの従業員の生活に責任がある。厳しい立場で仕事をすることが求められる。**とはいっても、経営者だって人間である**。非難をされたら反発するし、凹むのだ。だから、見たままを指摘することが大事なのだ。
同じ組織にいるメリットを活かし、できるだけ助け合うことで1人だけで達成できなかったことが達成できるようにしたい。

##参考資料
- [『フィードバック入門
耳の痛いことを伝えて部下と職場を立て直す技術』](https://www.php.co.jp/books/detail.php?isbn=978-4-569-83290-6)
    - 第二章 部下育成を支える基礎理論 フィードバックの技術 基本編
- [『マイクロカウンセリング技法―事例場面から学ぶ』](https://www.kinokuniya.co.jp/f/dsg-01-9784759916379)
    - 第2章 第4節 意図性
video_tagで横幅いっぱいに動画を挿入する方法

#はじめに
video_tagで横幅いっぱいに自動再生で動画を流す。
備忘録として残します。

#つまずいたところ
- 動画のファイルの置所
- 自動再生
- 横幅を画面いっぱい、縦幅は指定

#実装手順
app/assetsの直下にvideosフォルダを作成。
videosフォルダ内に背面で流したい動画を入れる。
(ここでは、test_video.mp4という動画ファイルを入れました。)

次にvideo_tagを使って動画を表示

```index.html.haml
.video-content
  = video_tag "test_video.mp4", loop: true, autoplay: true, muted: true
```

object-fit: cover;をつけることで、動画の横と縦の比率を変更できた。
動画も崩れないで再生されている。

```index.scss
.image-content{
  height: 80vh;
  z-index: 1;
  video{
    width: 100%;
    height: 100%;
    object-fit: cover;
  }
```

背面に動画を入れたい時は、position: absolute;などで調整してください。

#videoタグの属性説明
|属性               |説明               |
|:-----------------|:------------------|
| poster           |動画が再生されていない時に表示させる画像をパスで指定|
| autoplay         |ページのロードが完了したら自動的に動画を再生する| 
| loop             |動画を繰り返すループ再生を許可する|
| controls         |再生ボタンやタイムラインなどのインターフェースパーツを表示させる|
| muted            |音声付き動画データの場合は消音にする|
| preload          |事前に動画データを読み込むか制御する、属性の値で指定する<br>【auto】初期値でページロードと合わせて読み込みされる<br>【none】動画データの読み込みがされない状態<br>【metadata】動画データのメタデータのみ読み込みされる|
ゲームをつくる：Cocosでキー入力とスライダーインターフェイスを実装

#この記事は、
ヘックス戦略SLGが好きな筆者が、楽しい戦略SLGを自分で作る記録です。

# この記事のまとめ
- Sliderインターフェースの実装をした
- キー入力インターフェイスの実装をした

[こちらから動くもの](https://storage.googleapis.com/hex_slg/hex_touch_test/index.html)を確認できます。
ヘックスのタッチをどのように検出しているかは[こちら](https://qiita.com/papipu-games/items/d52b4d538e3e8ca8e202)。

## Sliderインターフェースを実装した
カメラのズーム機能をSliderインターフェースで実装します。
Sliderインターフェースは、操作された際にメソッドをコールバックで呼び出してくれるので、
まずそのメソッドをCameraにアタッチしたcc.Componentに作成します。

```javascript
  // **********************************************************
  // 開発用カメラズーム
  // **********************************************************
  debugCameraZoom(slider) {
    cc.log(slider.progress);
    CAM_M.SetCameraZoom(slider.progress * 4 + 0.55);
  }
}
```
コールバックにはcc.Sliderのインスタンスが渡されます。
インスタンスのprogressにスライダー状態に応じて０−１の値が入るので、それを元にいい感じでカメラのズームを調整します。

スライダーコンポーネントの設定。
<img width="447" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157328/a4598b84-c9ab-7330-2007-01e98aadbbdc.png">
NodeTreeにスライダーコンポーネントを設定して、Slide Eventを追加します。
cc.Nodeの欄に、先程メソッドを作成したコンポーネントが設置されているノードをドラッグアンドドロップ。
右の欄から該当コンポーネントを選択して、更に右の欄で先程作成したコンポーネントを選択して完成です。

## キー入力インターフェイスを実装した
キー入力の初期化は以下のような形で行います。イベントが発生すると、登録したコールバックが呼ばれます。

```javascript
    // キー入力を検出
    cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, KEY.onKeyDown);
    cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP, KEY.onKeyUp);
```
コールバックメソッドはこんな感じ。

```javascript
  // *******************
  // キーを押したとき
  // *******************
  static onKeyDown(event) {
    KEY.setKeyFlag(event.keyCode, true);
  }

  // *******************
  // キーを離したとき
  // *******************
  static onKeyUp(event) {
    KEY.setKeyFlag(event.keyCode, false);
  }

 // *******************
  // キーのフラグをセットする
  // *******************
  static setKeyFlag(keyCode, bool) {
    switch (keyCode) {
      case cc.macro.KEY.up: // 上
      case cc.macro.KEY.w:
        if (bool === true) {
          KEY.resetDirectFlag();
        }
        KEY.up = bool;
        break;

      case cc.macro.KEY.down: // 下
      case cc.macro.KEY.s:
        if (bool === true) {
          KEY.resetDirectFlag();
        }
        KEY.down = bool; break;

      case cc.macro.KEY.left: // 左
      case cc.macro.KEY.a:
        if (bool === true) {
          KEY.resetDirectFlag();
        }
        KEY.left = bool;
        break;

      case cc.macro.KEY.right: // 右
      case cc.macro.KEY.d:
        if (bool === true) {
          KEY.resetDirectFlag();
        }
        KEY.right = bool;
        break;
    }
  }

  // *******************
  // 方向フラグをリセット
  // *******************
  static resetDirectFlag() {
    KEY.up = false;
    KEY.down = false;
    KEY.left = false;
    KEY.right = false;
  }
```
KeyFlagをセットしておいて、色々なキー入力に関して処理を行います。
複数の方向入力を受け付けないような処理にしています。
カーソル入力の他に、wasdでも動くようにしました。

後は、コンポーネントの中のupdateで、毎フレーム必要な処理を書きます。

```javascript
static update(dt) {
    if (KEY.left) {
      CAM_M.MoveCamera(-MOVE_SPEED * dt, 0);
    }
    if (KEY.right) {
      CAM_M.MoveCamera(MOVE_SPEED * dt, 0);
    }
    if (KEY.down) {
      CAM_M.MoveCamera(0, MOVE_SPEED * dt);
    }
    if (KEY.up) {
      CAM_M.MoveCamera(0, -MOVE_SPEED * dt);
    }

  }
```

次はヘックスに地形と地形パラメータをセットしようと思います。
Node.jsのパッケージマネージャの使い方(yarn)

##免責事項
この記事は初心者視点でザックリとした説明をしています。正確性に欠ける可能性がございますが、ご了承ください。「明らかに違うよ」ということがありましたら、ご指摘くださると幸いです。

##環境
OS：最新版ではないMacOS
VirtualBox：5.2.26
Vagrant：2.2.6
Ubuntu：ubuntu/bionic64 v20181129.0.0


##目次
1. yarnとは
2. yarnでパッケージのインストール
3. yarnでパッケージを作ってみる

#1. yarnとは
yarnとはNode.jsで使うパッケージを管理するものですが、
この説明をする前にパッケージについて説明します。

###パッケージ
パッケージはライブラリを包むもの。
パッケージマネージャはライブラリを包み、管理するものです。

###ライブラリ
ライブラリは先人が作った処理です。
汎用的な処理を実装する際に使います。
例えば、「複数の値の中で一番大きい数字がどれか判定したい！」という時があったとします。

ただ、この処理を1から作るのは、簡単そうにありません。

そこで、ライブラリを使います。
Javascriptには標準で、Math.max() という()内に引数として与えた数字の中で、一番大きい数字を返す「標準ビルトインオブジェクトMathのmaxメソッド」がライブラリとして標準で備わっています。

```js
Math.max(2, 3, 1);
// expected output: 3
```
[標準ビルトインオブジェクト](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects)...JavaScriptが標準で提供しているオブジェクト(ex: MathやDateなど)、ライブラリとして提供されています。
[Node.jsドキュメント]
(https://nodejs.org/docs/v10.14.2/api/http.html#http_server_listen)...Node.jsがバージョンごとに標準で、ライブラリを提供しています。

続いて、yarnについて説明していきます。
Node.jsが標準で備えているパッケージ管理ツールは npm（エヌピーエム）と呼ばれるものです。
[npm公式サイト](https://www.npmjs.com/)には誰かが作ったライブラリが公開されており、自由に利用することができます。

```
$ npm install パッケージ名
```
でパッケージをインストールすることができます。

#2. yarnでパッケージのインストール

しかし、npmをさらに使いやすくした[パッケージ管理ツールyarn](https://yarnpkg.com/ja/)が誕生しました。
使い方としては、npmとほとんど一緒で、

```
$ yarn add パッケージ名
```
とします。
yarn addでパッケージをインストールすると、インストールを実行したディレクトリの中にあるnode_modulesというディレクトリに、パッケージがインストールされます。

node_modules ディレクトリにインストールされたnpmパッケージは、自動的に読み込まれ、そのディレクトリ内で以下のように利用することができます。

```js
const 変数 = require('パッケージ名');
```
パッケージをrequire関数で取得することで、利用できるようになります。

#3. yarnでパッケージを作ってみる
yarn(npm)では他人のパッケージを利用するだけでなく、自分でパッケージを作成しすることもできます。

```
$ mkdir パッケージ名のディレクトリ
$ cd パッケージ名のディレクトリ
$ yarn init
```
yarn initと入力すると、パッケージの設定画面がでてきます。

```
//パッケージ名を入力します。
name: (パッケージ名)
//バージョンの設定します。
version: (1.0.0)
//パッケージの説明を入力します。
description:
//ライブラリとして読み込まれるJavaScriptファイルを設定します。
entry point: (index.js)
//Gitリポジトリを公開する場合のURLを入力します。
repository url:
//npmに登録する際の著者の名前を設定します。
author:
//ライセンス名を入力します。
license: (MIT)
//公開の可否を入力します。
private:
```
パッケージの設定が成功すると以下のように表示されます。

```
success Saved package.json
Done in 9.20s.
```
では、ライブラリとして読み込まれるJavaScriptファイルを作成し、パッケージを作っていきます。
モジュールは関数型とオブジェクト型のどちらでも定義できます。

####モジュールを関数型で定義

```js:index.js
'use strict';
module.exports = add(a, b) {
  return a + b;
};
```
としても、
####モジュールをオブジェクト型で定義

```js:index.js
function add(a, b) {
  return a + b;
}
module.exports = {
  add : add
};
```
OR

```js:index.js
module.exports = {
  add : (a, b) => {
  return a + b;
}
};
```
でも、パッケージとして使うことができます。


使用先のファイルでは、以下のように使います。
####関数型で定義されたモジュールのパッケージを使うには

```js:app.js
const add　= require(パス or パッケージ名);
const result = add(1, 2);
console.log(result);
// expected output: 3
```

####オブジェクト型で定義されたモジュールのパッケージを使うには
```js:app.js
const 変数　= require(パス or パッケージ名);
const result = 変数.add(1, 2);
console.log(result);
// expected output: 3
```
requireの引数には、パッケージがnpm公式サイトに公開されていたらパッケージ名を指定し、
自分のPC上にあるならパスを指定します。

##参考
「N予備校 プログラミングコース」
https://www.nnn.ed.nico/
「[NodeJS] モジュール定義について学ぶ」
https://www.yoheim.net/blog.php?q=20150101
[ゼロから作るDeep Learning]ニューラルネットワークに逆伝播処理を実装するのに必要なレイヤについて

#はじめに
この記事は**ゼロから作るディープラーニング 6章誤差逆伝播法**を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。


#レイヤとは
ニューラルネットワークに逆伝播処理を実装するには、ニューロンをレイヤというものにする必要があります。
レイヤとは、順伝播処理と逆伝播処理の両方が実装されたニューロンと考えるのが一番簡単です。

ニューラルネットワークを実装するのに必要なレイヤは、**Sigmoidレイヤ・Reluレイヤ・Affineレイヤ・出力層から損失関数までのレイヤ**が最低限です。

レイヤはクラスとして実装して部品のようにすることで、ニューラルネットワークを様々な構造に組み替える時に運用しやすくなります。

では、今回は前回の記事にも出てきた足し算のニューロンと掛け算のニューロンをレイヤ化してみることにします。

#加算レイヤ

```python
class AddLayer:# 加算レイヤ
    def __init__(self):
        pass# 何も行わない
    
    def forward(self, x, y):
        out = x + y
        return out
    
    def backward(self, dout):
        dx = dout * 1
        dy = dout * 1 # 足し算の時は前の微分を両変数とも引き継ぐ
        return dx, dy
```

加算レイヤでは、順伝播処理で二つの変数の値を合計して返し、逆伝播処理では前の微分をそのまま引き継がせて返します。


#乗算レイヤ

```python
class MulLayer:#乗算レイヤ
    def __init__(self):
        self.x = None
        self.y = None # 変数xyをインスタンス変数に

    def forward(self, x, y):
        self.x = x
        self.y = y # 変数xyの値は逆伝播処理で使うので保存しておく                
        out = x * y
        
        return out

    def backward(self, dout):
        dx = dout * self.y
        dy = dout * self.x

        return dx, dy
```

乗算レイヤは、順伝播処理で変数xyを掛けて返し、逆伝播処理では、もう一方の変数の値と前の微分を掛けることで微分を求めて返します。
C# csc.rspファイルを編集してcsc.exeのデフォルトのオプションを変更しようと思ったらファイルアクセス権が面倒だった話(Visual Studio使わない人向け)

# （結論）
csc.rspは編集せずに、バッチファイルつくるのがおすすめ（）

# はじめに

Windows10環境です。

csc.exeのあるフォルダ[^1]に`csc.rsp`というファイルがあり、
これを編集するとオプションを変えられます。
が、そのままだと<b>上書き保存ができません</b>。

# csc.rspの中身

デフォルトは下記になっているはず。

```csc.rsp

# This file contains command-line options that the C#
# command line compiler (CSC) will process as part
# of every compilation, unless the "/noconfig" option
# is specified. 

# Reference the common Framework libraries
/r:Accessibility.dll
/r:Microsoft.CSharp.dll
/r:System.Configuration.dll
/r:System.Configuration.Install.dll
/r:System.Core.dll
/r:System.Data.dll
/r:System.Data.DataSetExtensions.dll
/r:System.Data.Linq.dll
/r:System.Data.OracleClient.dll
/r:System.Deployment.dll
/r:System.Design.dll
/r:System.DirectoryServices.dll
/r:System.dll
/r:System.Drawing.Design.dll
/r:System.Drawing.dll
/r:System.EnterpriseServices.dll
/r:System.Management.dll
/r:System.Messaging.dll
/r:System.Runtime.Remoting.dll
/r:System.Runtime.Serialization.dll
/r:System.Runtime.Serialization.Formatters.Soap.dll
/r:System.Security.dll
/r:System.ServiceModel.dll
/r:System.ServiceModel.Web.dll
/r:System.ServiceProcess.dll
/r:System.Transactions.dll
/r:System.Web.dll
/r:System.Web.Extensions.Design.dll
/r:System.Web.Extensions.dll
/r:System.Web.Mobile.dll
/r:System.Web.RegularExpressions.dll
/r:System.Web.Services.dll
/r:System.Windows.Forms.Dll
/r:System.Workflow.Activities.dll
/r:System.Workflow.ComponentModel.dll
/r:System.Workflow.Runtime.dll
/r:System.Xml.dll
/r:System.Xml.Linq.dll
```

# csc.rspのアクセス権の変更～編集～保存

'1. 下記でファイルの所有権を変更。

```

cd \Windows\Microsoft.NET\Framework64\v4.0.30319\
takeown /f csc.rsp
```

'2. エクスプローラでファイル`csc.rsp`を右クリックし、プロパティを開く。

'3. 「セキュリティ」タブを開く。

'4. 「編集」を押す。（下図参照）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/3d017a8c-8f30-f9d2-3255-b46ead002a4d.png)

'5. Administatorsの「許可」に「変更」権限を追加する（「変更」をチェックすると「書き込み」もチェックされる）。（下図参照）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/2fee9c5e-383c-827d-ac77-2c02ac622d45.png)
(※AdministratorsではなくUsersにしておけば以降管理者権限不要のはずだが、不安なのでAdministratorsにしておく。)

'6. メモ帳(`notepad.exe`)を右クリックで`管理者として実行`。(メモ帳じゃなくても可)

'7. デバイスへの変更許可が求められるので、承諾する。

'8. `csc.rsp`をstep 6のエディタで編集して上書き保存する。

めんどくさっ

# 追加したくなりそうなオプション

`/nologo` ・・・ cscのバージョン表示とかを抑制
`/target:winexe` ・・・ 生成したexe実行時にコンソールを表示しない（※デバッグ作業中は不便なので微妙）
`/platform:x64` もしくは `/platform:x86` ・・・ 64bit/32bit指定
`/r:DLLのパス` ・・・ バッチファイルにしたほうが良い気がする。

# csc.rspを編集するデメリット

- 環境変わったときに戸惑う。
 （PC変えたり、ほかの人との環境が変わってしまう。リリース時に事故るリスクがある。）
- 戻すとき面倒。
- 変更元をバックアップしてないと戻せなくなるかも。

記事を書いてみたものの、個別にバッチファイル(`.bat`)作ったほうがよいのではないか・・。

# バッチファイル例

```compile.bat

csc /r:ほげほげ.dll ^
   /nologo ^
   /target:winexe ^
   %*
```

- 行末の `^` は 改行を無視してつなげるためです。(C言語の行末のエスケープ`\`みたいなもの。)
- `%*`は、コマンドラインオプションがそのまま渡ります。(`compile.bat /xxx yyy.cs`とすると、`/xxx yyy.cs`の部分が入ります。)

# 参考サイト

`csc.rsp`
https://www.atmarkit.co.jp/fdotnet/dotnettips/179cscrsp/cscrsp.html

ファイル所有者の変更(`takeown /f ファイル名`)
https://freesoft.tvbok.com/windows7/general/trustedinstaller.html


# 

[^1]: `where csc` で調べられます。この辺(`C:\Windows\Microsoft.NET\Framework64\v4.0.30319\`)にいるはず（環境による）。
Font Awesome 5 を webpack と使う（SVG）

[Webpack4でFont-awesomeを利用する](https://qiita.com/nttt/items/6f5f10fb761af6f0a14f)

上記も大変参考になりました

## SVGを使う

[How to make Font awesome 5 work with webpack](https://stackoverflow.com/questions/52376720/how-to-make-font-awesome-5-work-with-webpack)

[Using Font Awesome 5 With Webpack](https://www.pullrequest.com/blog/webpack-fontawesome-guide/)

Font Awesome をインストールします(svg-core, brands-icons, regular-icons, solid-icons)

```sh
npm install --save-dev @fortawesome/fontawesome-svg-core @fortawesome/free-brands-svg-icons @fortawesome/free-regular-svg-icons @fortawesome/free-solid-svg-icons
```

エントリーポイントのjsファイルに下記を追記します

```js
import { library, dom } from '@fortawesome/fontawesome-svg-core'
import { fas } from '@fortawesome/free-solid-svg-icons'
import { far } from '@fortawesome/free-regular-svg-icons'
import { fab } from '@fortawesome/free-brands-svg-icons'

library.add(fas, far, fab) 

dom.i2svg() 
```

## webpack.config.jsに追記は必要ない？

`rules`に`test: /\.svg/,...`の設定を書いていませんが、動いています
最短で試すCython

# はじめに
本記事は、CythonというPythonライブラリを試しに動かすために必要な最低限の内容を記した備忘録です。

「Pythonを高速化する方法としてCythonてのがあるらしいけど調べても何だかよくわからん！」といった方の助けに少しでもなれば幸いです。

※ 環境：
　OS：Ubuntu18.04
　Python：3.6.8
　Cython：0.29.13


# 概要
誤解を恐れずに言うと

Cython = Pythonのライブラリを作るための、**Pythonにめちゃくちゃよく似た新しいプログラミング言語**

です。

他にも色々な使い方がありますが、最初に試すだけであればこの程度の認識で十分かと思います。


# Cythonを使うまでの流れ
　１．Cython語で処理を書く
　２．ソースコードをC言語に翻訳（トランスパイル）する
　３．トランスパイルされたC言語のソースコードをビルドしてライブラリ化する

# Hello World的な奴

早速試してみましょう。

最低限必要なものは２つ。

１．Cythonで書いたコード（hoge.pyx）

```py:hoge.pyx
def tasu(a, b):
    return a + b
```
Pythonにめちゃくちゃよく似てるというかPythonのまんまですね。Cythonでは他に`cdef`や`cpdef`などで関数を定義できたり、`a`や`b`の型を指定できたりしますが、試すだけなので深入りせずに行きましょう。

２．トランスパイル＆ビルドするためのコード（setup.py）

```py:setup.py
from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules=cythonize("hoge.pyx"))
```
先ほど書いたCythonコードを**さいそないず**するおまじないが書いてあります。

上２つが用意出来たら下記コマンドでトランスパイル＆ビルドします。

```shell
python3 setup.py build_ext -i
```

いくつかファイルが生成されたかと思いますが、生成された`hoge.c`が、`hoge.pyx`をC言語にトランスパイルされたもの。`hoge.cpython-36m-x86_64-linux-gnu.so`的な奴が、Pythonからimportして使うライブラリ化されたものです。


あとは`hoge.cpython-36m-x86_64-linux-gnu.so`をimportして、先ほど作った関数を呼び出すだけです。

```py
>>> import hoge
>>> 
>>> print(hoge.tasu(1,2))
```

Cythonは使い方や使いどころを見極めないと高速化の恩恵をあまり受けられないそうですが、試すだけなら意外と簡単ですね。


<br>
以上です。
ありがとうございました。
NULLが絡むIN/NOT IN の挙動 (MySQL)

MysqlのNOT IN句はNULLが絡むと初見ではちょっと気付けない挙動をします。MySQL以外でどうなのかは知りませんが。

以下のような見やすいテーブルの話をします。

|id |num |name |
|---|----|-----|
|1  |1   |hello|
|2  |2   |world|
|3  |NULL|    !|


まずは以下のクエリと実行結果を御覧ください。

```
SELECT * FROM `mytable` WHERE `num` IN (1, 3);

id, num, name
1, 1, hello
```
はい、特に不審な点はありませんね。
では次。

### NULLの霊圧が…消えた…？
```
SELECT * FROM `mytable` WHERE `num` NOT IN (1, 3);

id, num, name
2, 2, world
```

```
SELECT * FROM `mytable` WHERE `num` IN (1, 3, NULL);

id, num, name
1, 1, hello
```
どうやら値がNULLだとINにもNOT INにも引っかからなくなるようです。:thinking_face:
ちなみに `IN ('')` や `NOT IN ('')`でもNULLは引っかからない。


### そして誰もいなくなった

```
SELECT * FROM `mytable` WHERE `num` NOT IN (1, 3, NULL);

id, num, name
```
0件。


### 分かった、条件にNULLを含めなければ良いんだな
…と思うじゃん？
油断すると簡単に以下のようなクエリになったりします。

```
SELECT * FROM `another_table` WHERE `another_table`.`id` NOT IN( 
    SELECT `num` FROM `mytable` 
);
```

この場合サブクエリ部分が`(1, 2, NULL)` となって1行も返ってこない悲しい結果になります。

### 回避方法
サブクエリ内でWHERE に IS NOT NULL を追加するなどしましょう。

```
SELECT * FROM `another_table` WHERE `another_table`.`id` NOT IN(
    SELECT num FROM `mytable` WHERE `num` IS NOT NULL
);
```
VSCode拡張機能をパッケージ化する

# VSCode拡張機能をパッケージ化する

拡張機能をパッケージ化(vsix化)して、配布しやすいようにする。

※ node_modulesをwebpackするなど、以下の補足も御覧ください。
[VSCode拡張機能のパッケージ化に関する補足](https://qiita.com/keiji-kataoka/items/4071bbf22640d2e4dfcd)

# 開発環境
||バージョン|
|---|---|
|OS|Windows 10|
|VSCode|1.39.2|
|node.js|v12.6.0|
|npm|6.9.0|

# 準備
VSCEをインストールする。

```
> npm install -g vsce
```

# パッケージ作成の前に
以下の2点を行う。
- package.jsonに「publisher」を追記
- README.mdを編集

publisherherは、package.jsonの先頭で良いので追記する。
![publisher.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517406/81b42e8b-504a-a9de-9228-1a900ca322ad.png)

README.mdは、自動生成のままだとパッケージ化でエラーとなるので、とにかくなにかしらの修正を行う。

# パッケージ化する
拡張機能のディレクトリ(package.jsonなどがあるディレクトリ)でvsceコマンドを実行する。

```
> vsce package
```
これで、どうディレクトリに「.vsix」ファイルが生成されるはず。

# vsixをVSCodeにインストールする
拡張機能の「その他の操作」(・・・の部分)をクリックし、「VSIXからのインストール」を選択する。
ファイル選択ダイアログで、作成したvsixファイルを選択し「インストール」をクリックする。

![vsix_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517406/8840602a-1371-d9c8-737c-a932a0236583.png)

これで拡張機能のインストールは完了

# 次回予定
今度こそ、code serverで拡張機能を動作させる。
React hooksで子コンポーネントの関数を実行する

# TL;DR

`forwardRef`と[useImperativeHandle](https://ja.reactjs.org/docs/hooks-reference.html#useimperativehandle)を使う

# 詳細

Componentを継承したコンポーネントを定義した場合はrefを渡してメソッドを実行できる。
React hooksを使ってるとFunctionComponentになるのでコンポーネントにメソッドというものがない。
`forwardRef` と `useImperativeHandle` を使う。

サンプル

```tsx
import React, { useImperativeHandle, forwardRef, useRef } from "react";
import { render } from "react-dom";

interface ChildProps {
  text: string;
}
const ChildBase: React.RefForwardingComponent<any, ChildProps> = (
  { text },
  ref
) => {
  const test = () => {
    window.alert(text);
  };
  useImperativeHandle(ref, () => ({
    test
  }));

  return <span>{text}</span>;
};
const Child = forwardRef(ChildBase);

const Parent: React.FC = () => {
  const ref = useRef<any>();
  const handleClick = () => {
    ref.current && ref.current.test();
  };
  return (
    <div>
      <button onClick={handleClick}>Exec</button>
      <Child ref={ref} text="Hello" />
    </div>
  );
};

render(<Parent />, document.getElementById("root"));
```

https://codesandbox.io/s/react-hooks-child-function-execution-5yo5w

anyのところはどうするのがいいのかわかってない。
railsのエラー: コントローラーとルーティングの手順

まず、アプリを作るためコントローラーとルーティングの設定を始めましたが
エディターで軽く確認ついでにルーティングを記述してから
rails g controlerを行うとエラーが起きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430767/c6db7163-527a-c36b-c4da-f78eba6a7f00.png)


ルーティングを消してコントローラーから始めたらエラーは解決しましたが
何気にrailsは手順に煩いところがある印象です。
画像などに設定したリンクが効かない

`position: absolute;`
で位置を変えた画像に設定したリンクが効かなかった。

`z-index: 99;`
で解決した。

画像にかかわらず、クリック・ホバー時の動きが全く反応がない場合、見えない何かが上に被さってる場合が多い。今回は、近くの要素の`padding`が画像を覆っていたため反応がなかったっぽい。
ConoHaで鯖構築したのでメモ

完全に個人用メモですが、部分的に役に立つこともあるかもぐらいでQiitaに投稿。

## 前提条件


## アカウント作成
docker使うので一緒に作成

```bash
# useradd hogehoge
# passwd hogehoge
# usermod -aG wheel hogehoge
# groupadd docker
# usermod -aG docker hogehoge
```

### ついでに
sudoの都度パスワード聞かれるの面倒くさいマンなので
visudoでこれを追加する。

```vim
hogehoge ALL=(ALL) NOPASSWD: ALL
```

### ssh用の設定

```bash
# su - hogehoge
$ mkdir .ssh
$ chmod 700 .ssh
$ vim .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
```

### パスワードでログイン+rootログインできないように設定
/etc/ssh/sshd_configを編集

```vim
PermitRootLogin no
PasswordAuthentication no
AllowUsers hogehoge
```

↑のあとssh再起動

```bash
$ sudo systemctl restart sshd.service
```

ここから先はhogehogeユーザで作業

## docker-composer用の設定
環境毎にdocker-compose.yamlを切り替えたかったので、これを設定している
~/.bash_profileに追加

```vim
export COMPOSE_FILE=docker-compose.stg.yaml
```

## https用の設定
https://www.eastforest.jp/vps/6149
こちらを参考に設定

## プライベートネットワーク設定
https://support.conoha.jp/v/dbnetwork/
こちらを参考に設定

## ロードバランサ設定
https://support.conoha.jp/v/loadbalancer/#04
こちらを参考に設定
GitHubを複数のアカウントで利用するためのメモ


### はじめに

GitHubをプライベートでも、仕事でも使用している場合、アカウントが複数になってしまうことがあるかと思います。そのような場合の設定を忘備録としてまとめてみました。

### ~/.sshのファイル構成

~/.sshは下記のような構成にします。ファイル名は公開鍵・秘密鍵を作ってしまったあと、適当に変えても問題ありません。

```
.ssh/
├── config
├── id_private_rsa
├── id_private_rsa.pub
├── id_work_rsa
├── id_work_rsa.pub
└── known_hosts

```

id_private_rsa、id_private_rsa.pubはプライベート用で、id_work_rsa、id_work_rsa.pubは仕事用の公開鍵・秘密鍵です。

プライベート用・仕事用それぞれの秘密鍵の呼び出し方がconfigファイルに記載されています。

公開鍵・秘密鍵の生成については、こちらの記事などを参考にして下さい（[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce))

GitHubには公開鍵であるxxxx.pubの内容をアップロードします。秘密鍵である`id_private_rsa`と`id_work_rsa`は原則誰にも見られないように秘匿します。


### configファイルの内容


```
Host github-private
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/id_private_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
  UseKeychain yes
  AddKeysToAgent yes

Host github-work
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/id_work_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
  UseKeychain yes
  AddKeysToAgent yes
```

`Host GitHub-private`、`Host GitHub-work` で定義した内容でプライベート用・仕事用の秘密鍵を利用することができます。

詳細についてはこちらの記事などを参考にして下さい ( [.ssh/configファイルでSSH接続を管理する](https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1))



プライベート用のGitHubに接続する場合はこちらです。

```
git@github-private:"PRIVATE_ACCOUNT"/"REPOSITORY"
```

仕事用のGitHubに接続する場合はこちらです。

```
git@github-work:"WORK_ACCOUNT"/"REPOSITORY"
```



### コミットした作者名とメールアドレスを切り替える

GitHubではコミットした作者の名前とメールアドレスが記録されます。当然プライベート用・仕事用で切り替えたいので、下記のようにします。

まず通常のgit操作で（例外を設定なければ）記録される作者名とメールアドレスは下記のように `--global`オプションをつかって、`~/.gitconfig`に設定します。


```
$ git config --global user.name "NAME"
$ git config --global user.email "EMAIL"
```

`~/.gitconfig`を見ると下記のようになっています。

```
[user]
	name = "NAME"
	email = "EMAIL"
```

しかしながら、上記以外の作者名とメールアドレスを記録したい場合（例えば--globalで会社向けにした場合にプライベート用の作者名とメールアドレスを使いたい場合）それぞれのリポジトリーに移動して、 `--local`オプションを使って設定します。

```
$ git config --local user.name "NAME"
$ git config --local user.email "EMAIL"
```

上記のコマンドを実行した結果、それぞれのリポジトリーの下の `/.git/config` ファイルに `--global`と同じく

```
[user]
	name = "NAME"
	email = "EMAIL"
```
が書き込まれます。

### Sourcetreeを使う場合の注意

![sorcetree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37634/546b4ae2-6ad0-3cc5-07c9-e5b1210a2f42.png)

GitHubの操作にコマンドラインではなく、 [Sourcetree](http://www.sourcetreeapp.com) などのGUIツールを使っている方もいると思います。
Sourcetreeは `--global` オプションで設定した作者名とメールアドレスを上書きしてしまう機能があるので注意が必要です。（configファイルを書き換えるわけではなく、Sourcetreeが無視するという動作になります）

「環境設定」メニュー、「一般」タブの上部にある「SourcetreeにMercurialとGitのグローバル設定ファイルの変更を許可する」がチェックされていると上書きされてしまいます。

ただし、これは`--global`のみで、`--local`オプションで設定したリポジトリー毎の作者名とメールアドレスは変更されません。
CubeIDEの日本語化

CubeIDEはEclipseベースのIDEのため、Pleiadesプラグインを導入するを導入することで簡単に日本語化することができます。 
※設定画面やエラーメッセージなどの一部は英語のままになります。  
今回は日本語化するためのプラグインを導入するまでの流れを説明します。
(Windowsを例に説明します)
# Pleiadesプラグインをダウンロードする
このページからプラグインをダウンロードします。
https://mergedoc.osdn.jp/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401306/6c4f9765-110e-e5bd-f938-5b96516b2e26.png)

ダウンロードしたzipファイルは適当な場所に展開してください。

# プラグインの導入
先ほどダウンロードして展開したフォルダ内にある「setup.exe」のショートカットを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401306/657df5e0-0064-9c67-b4b5-789ae10914aa.png)
起動すると次のような画面が開くので、「選択」を押してCubeIDEの本体がある場所を指定します。  
CubeIDEはデフォルトでは「C:\ST\STM32CubeIDE_1.x.x\STM32CubeIDE」のあたりにインストールされているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401306/e08e6f35-4be3-3ada-7ca8-9c47091b66fe.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401306/8347e76c-6748-b7fc-e808-e31883b5665d.png)

正常に指定できると次のような画面になるので、問題が無ければ「日本語化する」を押します。
この手順を実行する前に、CubeIDEは終了させておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401306/c7e23bdb-073c-f2a7-7676-79c7fb5af050.png)

# CubeIDEを起動してみる
日本語化してから初回の起動はキャッシュのクリーンと設定処理が入るため少し時間がかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401306/bd78ff19-c249-c12a-1274-9ee0fe5d824a.png)

正常に日本語化ができれば、次の画像のように日本語で表示されるようになると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401306/2612a14b-fa0d-d732-2147-d5b73360ba8d.png)

## 注意点
Pleiadesプラグインを追加することで何らかの問題が発生するかどうかはまだ未確認です。
Goのディレクトリ構成(追記予定)

# Goのディレクトリ構成をきっちり知っておきたい

## /src 開発用のディレクトリ

- プロジェクトごとにsrc 以下にディレクトリをつくる。
- ソースコード管理プラットフォームごとに切るのがGoの思想的
- go install するとpkgに実行したパッケージをコンパイルしたものが作られる。
- go buildをmainパッケージで実行すると/binに実行可能なバイナリファイルが作られる。

## /bin 実行可能ファイル、バイナリ
- 環境変数PATHに設定することが推奨されている。'export PATH:=$GOPATH/bin'

## /pkg コンパイルされたファイル
- srcからコンパイルされた非アプリケーション実行ファイルの.aファイル

## tips
- githubからgo getするようなものは、実態としてはgit cloneとgo installである。
Assets内にて作成した任意のソースコードのみをGitPushする方法

# 概要
VisualStudioの拡張機能を使用し、
共有したいソースコードのみGitHubへpushする手段を自分用の備忘メモとして残します
使用しているのはVisualStudio2019です

# 用途
書籍等で参考に作成したコメント付のソースコードを、わざわざエディタを起動しないで
確認したいときや、学習したコードをライブラリ化したいときに助かりました

# 事前作業
GitHubへの登録など、事前の作業に必要な手順で参考になりました
<https://qiita.com/elu_jaune/items/eb354558d0dc39add152>

下記手順はコミットとプッシュの手順も他の記事に紹介されている方法とだいたい同じですが、
今回は任意のソースコードをPushする方法をおおまかに残します

# 1.チーム エクスプローラーのプロジェクトに接続する
メニューバーでにて[表示] 、 [チーム エクスプローラー] の順に選択して開いた後
接続アイコン（赤枠内）を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234065/b269308d-50bd-6dfb-21b6-ad2342b73540.png)

# 2.作成したリポジトリをダブルクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234065/b7342c2e-6244-4a93-732c-16c1cd8636f9.png)

# 3.ステージング
GitHubに同期したいソースコードを右クリック、[ステージ]を押下
押下後、赤枠の対象ファイルが［ステージング済み]に移動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234065/133819b8-ad73-25d4-1f09-bc3df773d00c.png)

# 4.コミット
任意のコミットメッセージを入力し、
[ステージング済みをコミット]を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234065/904a6d72-a9c5-d35e-90af-0904eac4cc92.png)

# 5.同期
以下表示後、黄色塗り箇所の[同期]を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234065/abbca164-abae-4d5a-2585-61209b7541e5.png)

# 6.プッシュ
赤枠内の[プッシュ]を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234065/1e1bee0e-67fe-297a-54a7-37d1e95f6e50.png)

# 7.正常時のメッセージ出力を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234065/0a721e44-7cbc-7218-13a9-2e1600514c5d.png)

# 8．リポジトリのURLにてプッシュされた対象のファイルを確認する
下図のように反映されていること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234065/a960b1c3-6b35-4384-8e61-15bf0106a211.png)

# 使用感
プッシュしたい対象のファイルをマウス操作で選択できるので
コマンド実行よりも簡単にできたと思います
ただ、ファイル数が多いため読み込みに時間がかかってしまいました

Assets内の.csファイルのみプッシュできるよう
ignoreを編集する方法も考えましたが、
1ファイルずつプッシュする設定がわからず断念してしまいました

「Source Tree」という
Gitの操作を簡単にするものがあることを知ったので
次回以降はこちらを試してみたいと思います

# 参考
<https://qiita.com/saiyuki1919/items/70b341d28c165e62a90d>
<https://qiita.com/tetsu831018/items/bb6ecf15ca5f67e5879a>
<https://codezine.jp/article/detail/8436>
<https://www.sejuku.net/blog/83605>
<https://www.sejuku.net/blog/6200>
nodenvでinstall出来るnodeのバージョンを確認したら最新が出てこなかった時

nodenvでnodeのバージョンを管理していてnodeのバージョンを変える必要がある時

node 9.11.2 を node 12.12.0にしたいなど

```
【インストール出来るnodeの一覧を表示】
nodenv install -l
```

```
【結果】
〜
12.11.0
chakracore-dev
chakracore-nightly
〜
```

12.12.0がない

このようにnodeのバージョンが表示されない時は「node-build」が古いからだと思われ、ここにどうすればいいのか書いてあります
https://github.com/nodenv/node-build

```
Upgrading
# Via Homebrew
$ brew update && brew upgrade node-build

# As a nodenv plugin
$ cd "$(nodenv root)"/plugins/node-build && git pull
```


nodenvのプラグインとして使用しているのでcdを使ってnode-buildの階層まで移動

そしてgit pullするといいらしいです


その後もう一度

```
【インストール出来るnodeの一覧を表示】
nodenv install -l
```


```
【結果】
〜
12.11.0
12.12.0
chakracore-dev
chakracore-nightly
〜
```


をするとinstall出来るnodeのリストが更新されていると思うので、

```
nodenv install 12.12.0
```

で入れたいバージョンをinstall出来るようになっています
touchでディレクトリごと作成(mkdir -p)する

# やりたいこと
1行で、**存在しない** ディレクトリごとファイルを作成したい！
要するに、以下のことを `touch` コマンドのみで以下のことをやりたいということです。

```zsh
❯ mkdir -p hoge/fugo/piyo
❯ touch hoge/fugo/piyo/test.txt
❯ tree .
.
└── hoge
    └── fugo
        └── piyo
            └── test.txt

3 directories, 1 file
```

シェルの設定ファイルにエイリアスとして登録して使えるまでがゴールです。


# 既存のtouchコマンド

`touch` で **存在しない** ディレクトリごとファイルを作成しようとするとディレクトリがないよと怒られます。

```zsh
❯ touch hoge/fugo/piyo/test.txt
touch: hoge/fugo/piyo/test.txt: No such file or directory
```

# シェルスクリプトを作成する
名前は適当ですが、一気通貫に作成するシェルスクリプトを作成します。

```touch_mkdir.sh
#!/bin/sh

mkdir -p "$(dirname "$1")" && touch  "$1"
```

当方はzshを使用しているので、zshrcにエイリアスを登録します。
今回は `mkdir + touch` ということで　**`mduch`** にしました。

```zsh:zshrc
alias mduch='sh $HOME/dotfiles/lib/touch_mkdir.sh'
```

## 使ってみる
作成できました。簡単ですね！

```zsh
❯ mduch hoge/fugo/piyo/text.txt
❯ tree .
.
└── hoge
    └── fugo
        └── piyo
            └── text.txt

3 directories, 1 file
```
完全レスポンシブデザインにする必要があるかどうか

レスポンシブデザインでwebサイトを開発する場合、スマホ用とPC用でデザインをあてることになる。

ここで、PCにおいて完全にレスポンシブにする必要はない場合が多い。

わざわざ画面幅を変えた時の挙動を考えずとも、一番外のレイヤーに
`min-width: 1000px;`
のように書いてしまえば良い。

初めてレスポンシブデザインを開発する場合などは流れでちゃんと作ろうとしてしまうが、そもそもその必要があるのか、視野が狭くなっていないかなどは常に気を付けていきたい。
spacemacsでウィンドウサイズを復元できない時

Windows10でspacemacsを使っていると、毎回起動する度に初期のウィンドウサイズに戻ってしまう。前回閉じる時のウィンドウサイズを保持してほしい。

~~設定ファイル `.spacemacs`には `dotspacemacs-auto-resume-layouts nil`があるけど、これを有効にしてもダメ。（nilをtに変えることで有効化する）~~
`dotspacemacs-auto-resume-layouts`は終了時に開いていたバッファを記憶するものだったようだ…😇

そして交わされている議論。 https://github.com/syl20bnr/spacemacs/issues/5095

> Howto get a persistent spacemacs window position and size? #5095

そこに颯爽と現れる救世主。
https://github.com/syl20bnr/spacemacs/issues/5095#issuecomment-184900782

曰く、リンク先ソースコードの `defun save-framegeometry ()`関数と `defun load-framegeometry ()`関数を `.spacemacs`に追加し、さらにそれらを読み込むための処理を `.spacemacs`の `dotspacemacs/user-init`関数内に置けとのこと。

loadとsaveの関数は `.spacemacs`の数あるdefnと同じレベルに並べた。最高。
Wagtail:ページを作る際のページタイプ選択肢の制限

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88744/ffa6cfaf-c2e6-c94c-f580-ea2c1dcd1655.png)

上記のようにページを作成する際に表示されるモデルの選択肢を非表示にする方法。

parent_page_typesを設定する。


・全てのページで非表示にしたい場合

```model.py
class Test(Page):
    parent_page_types = []
```



・特定のページでのみ選択肢を表示したい場合

```model.py
class Test(Page):
    parent_page_types = ['app_name.page_type_name']
```
IBM Cloudの最小限Pipelineを構成

#IBM Cloudの最小限Pipeline(備忘)

無料のプランで実現できそう。

- 左上横棒三本の「Navigation Menu」を選択
- 左列 Navigation Menu の「DevOps」を選択
- 左列「ツールチェーン」を選択
- 右上「ツールチェーンの作成」ボタンを選択
- 表における「Build your own ツールチェーン」列において、右の「作成」を選択
    - => 空のツールチェーンが作成される
- 「ツールの追加」ボタンを選択
    - ここでは、「GitHub」を選択
- 「認証」ボタンを選択
    - githubのユーザー、パスワード認証サイトで認証が行われる
    - 要:事前githubユーザー登録
- 「リポジトリー・タイプ:」は、ここでは「新規」を選択
    - 同名のgit projectがgithubに作成される
    - 既に存在するとエラーとなる
    - 他、「フォーク」、「クローン」、「既存」が選択可能
- (新規としたので)「リポジトリー名」を入力
- 他デフォルトで、右下の「統合の作成」ボタンを選択
- THINK (github issues)とCODE (github)という2つのboxが表示される
    - (「統合の作成」時、github issues を使用するチェックを外していれば THINK の box は作成されなかったと思われる。)
- 「ツールの追加」ボタンを選択
- Delivery Pipelineを選択
    - 「サービスが必要」と言われる場合、リンクをクリックして該当ロケーションに無料ライトプラインのサービスを作成
- DELIVER (Delivery Pipeline)という3つ目のboxが構成される
- このDelivery Pipeline boxを選択し、「ステージの追加」を選択
- ステージ名の「マイ・ステージ」は編集可能

- メニュー上の「ジョブ」を選択し、+アイコンの「ジョブの追加」を選択
- サブメニューで「ビルド」を選択。他には、「デプロイ」、「テスト」が選択可能
- 「ビルダータイプ」に「シェルスクリプト」を選択
- 「ビルド・スクリプト」に行いたいコマンドを追記

例えば

```
set +e
set -x
exec 2>&1
id
pwd
cat /etc/os-release
```

git commit ; git pushもしくは、<ステージ名>の右の再生ボタン(>)を押すとパイプラインが実行される。

「ログおよび履歴の表示」リンクをクリックするとログが表示される

ログ

```
Preparing to start the job...
Pipeline image: latest
Cloning the 'master' branch from repo 'https://github.com/hiroyuki-onodera/ibm_cloud_devops_02.git'
Repository successfully cloned
Pulling pipeline base image latest ...
++ exec
++ id
uid=0(root) gid=0(root) groups=0(root)
++ pwd
/home/pipeline/a94d726a-ecf2-47cb-a623-7463577cb565
++ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

...
```

Finished: SUCCESS



#感想

普通に動作するが、ややクセがある感じ。
pipeline.ymlといった物は無く、pipeline設定に直接処理を記入?
GitHubへのpushまでの流れ


<br>
githubへpushを勉強したのでアウトプットします。

<h2>前提</h2>

開発環境　AWScloud９


<h1>やること</h1>

<ul>
 <li>githubにアカウント登録（飛ばす）</li>
 <li>リモートリポジトリを作成(ここも飛ばす)</li>
 <li>ssh公開鍵を登録</li>
 <li>pushしたいディレクトリをgit管理下に置く</li>
 <li>pushするディレクトリをcommitする</li>
 <li>リモートリポジトリの登録</li>
 <li>githubへpushする</li>
</ul>




<h4>ssh公開鍵の登録</h4>

githubに登録する用の秘密鍵/公開鍵のペアを作成する。

```
$ cd~/.ssh
$ ssh-keygen
#色々と入力が求められるが空欄でEnterでも可能
```

```
$ cat ~/.ssh/id_rsa.pub
```
作成した公開鍵の内容を表示し、コピペしてgithubに登録。

<br>

<h4>pushしたいディレクトリをgit管理下に置く</h4>

githubにpushしたいディレクトリに移動して下のコマンドを実行するとディレクトリをgit管理下に置くことができる。


```
$git init
```

<br>

<h4>pushするディレクトリをcommitする</h4>

```
#このコマンドで対象をステージングエリアへ（git addの後に続く「.(ピリオド)」は、今のディレクトリ配下全てのファイルという意味）
$git add . 

#このコマンドでローカルリポジトリへコミットする。　-mの後はコミットメッセージ
$git commit -m "コミットメッセージ"
```

<br>
<h4>リモートリポジトリを登録する</h4>

```
#以下のコードでリモートリポジトリを登録する
$git remote add origin git@github.com:アカウント名/リポジトリ名.git
```

※間違ったリモートリポジトリを登録してしまった場合

```
#以下のコマンドで変更可能
$git remote set-url <リポジトリの名前> <新しいリポジトリのURL>

＃以下のコマンドでリモートリポジトリのURLを確認できる
$ git remote -v
```

<br>

<h4>githubにpushする</h4>

```
#以下のコマンドでpushできる
$git push -u origin master
```



<br>
参考
http://tetsuyai.hatenablog.com/entry/20110912/1315798082
【初心者】JavaScript　while文／for文／配列／length【備忘録９】

##10/29～31で勉強したこと

### while文
- １～１００までなど、くり返しの処理を行う際に使う。
- 条件式には、「この値まで繰り返し処理を行う」という式を入力する。

【例】

```js
let number=1;
while(number <= 100){
  console.log(number);
  number += 1;
}
```

### for文
- while文をさらに簡単に書く方法があり、forを使った式を使う。

【例】

```js
for(let number=1;number <= 100;number +=1){
  console.log(number);
}
```

【おまけ】number +=1 を簡略化すると　number++　という入力でも処理が可能。

### for/ifなどを組み合わせた文章
- 例えば、繰り返しの中で３の倍数だけ処理を変えたい場合は下記のように書く。

【例】

```js
for(let number=1;number <= 100;number ++){
  if(number % 3 === 0){
  console.log("３の倍数");
}else{
console.log(number);
}
}
```

###配列
- 同じような種類の値がいくつもあるときは一覧でまとめて管理すると便利。

【例】
定義⇒`const fruits=["apple","banana","orange"];`
一つだけ処理⇒`console.log(fruits[1]);`
上書きで代入⇒`fruits[0]="grape";`

【配列したものを繰り返し処理したい】

```js
const fruits=["apple","banana","orange"];
 for(let i = 0 ; i < 3 ; i ++){
 console.log(fruits[i]);
}
```

###length

- 配列がたくさんある場合もあり、値がいくつあるのか数えるのが面倒な時など使用できる。
- 配列を定義したあと、console.log(fruits.length);と書くことで値がいくるあるのか数値化される。
- for文も書き換えができる。
【例】配列部分で書いたfor文を書き換えると↓

```js
for(let i = 0 ; i < fruits.length ; i ++);
```

##気を付けること
- while文章でnumber++;など、追加していく式が抜けると【無限ループ】してしまい、負担がかかってしまう。
- for分の変数定義や条件の間の記号は:ではなく;なので気を付ける。
- 配列の定義の際、文字列入力で""を忘れやすい！
- 配列の一番左は[1]ではなく[0]から始まる！
- lengthを書く際に、.(ドット)を忘れたり、：で書いてしまうことがあったので気を付ける！
pybind11でPythonからC++にリストを参照渡しする

# はじめに
PythonとC++を連携させることができる`pybind11`では、
STLコンテナを介することでPythonからC++の関数にリストを渡すことができます。

[外部リンク：pybind11を使ってPythonからC++コードを実行する方法](https://myenigma.hatenablog.com/entry/2016/12/17/075812#STL%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E3%82%84%E3%82%8A%E5%8F%96%E3%82%8A)

しかしこれは値渡しになるため、更新したリストをPythonで使うにはC++側で返り値にする必要があります。

一方、既存のC++資産を使う場合にはできるだけC++のソースコードに手を加えたくないので、
新たに返り値を設定したり更新のところを書き換えたりしたくないことがあります。

そこで、リストではなくNumpyを介することで、
用途は限定的ではありますが参照渡しができるので共有します。

基本的には以下のリンクで解説されている`mutable_data`や`Eigen`を使うのがいいと思うのですが、
それ以外にもこんなやり方があるというくらいの内容です。
[外部リンクpybind11入門(3) NumPy連携その１](https://qiita.com/lucidfrontier45/items/183526df954c1d6580ba)
[外部リンクpybind11入門(3) NumPy連携その２](https://qiita.com/lucidfrontier45/items/5048ef74fbf32eeb9f08)

# 注意点
- pybindのインストール方法、基本的な利用方法は説明しません
- pybindおよびC++は浅い知識しかないので誤りがありましたらコメントください

# C++コード
STLコンテナを介してリストを渡す関数`update1()`と、Numpyで渡す関数`update2()`を定義します。
どちらも受け取った配列の値を1.0に更新しようとするものです。

```hoge.cpp
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <vector>

namespace py = pybind11;

void update1(std::vector<double> &x)
{
    int i;
    for(i = 0; i < 3; i ++)
    {
        x[i] = 1.0;
    }
}

void update2(py::array_t<double> x)
{
    auto x_buf = x.request();
    double *x_ptr = (double *)x_buf.ptr;

    int i;
    for(i = 0; i < 3; i ++)
    {
        x_ptr[i] = 1.0;
    }
}

PYBIND11_MODULE(hoge, m)
{
    m.doc() = "hoge module";
    m.def("update1", &update1, "update1 function");
    m.def("update2", &update2, "update2 function");
}
```

# Pythonコード
`[1., 2., 3.]`というリストを`update1`、`update2`に渡して、
それぞれの関数適用後にリストがどう変化するのか検証するスクリプトです。

```test.py
import numpy as np
import hoge

x = [1., 2., 3.]

print(x)
hoge.update1(x)
print(x)

x = np.array(x)
hoge.update2(x)
print(x)

```

# 結果
```
[1.0, 2.0, 3.0]
[1.0, 2.0, 3.0]
[1. 1. 1.]
```

`update1`では値が更新されず、`update2`では更新されていることがわかります。

参考リンク先でも説明されていますが、型（今回はdouble）がPython側とC++側で一致しないと
値渡しになってしまうので注意してください。
【FileMaker】2019年今年もAdvent Calendar始まります

さて、今年もAdvent Calendarの季節がやってまいりました。
今年で参加6年目となる[QiitaのAdvent Calendar](https://qiita.com/advent-calendar/2019)、FileMakerのブースも設けました。

こちらです。

[FileMaker Advent Calendar 2019](https://qiita.com/advent-calendar/2019/filemaker)
[FileMaker Go Advent Calendar 2019](https://qiita.com/advent-calendar/2019/filemakergo)

書きたい日付は早い者勝ちですので、みなさまお早めの登録をよろしくお願いします！

ネタは被ってもいいんです。
その人なりの切り口があるので、刺さるか刺さらないかは読んでいる人が決めるんです。

「こんなことみんな知ってるよな」（実は自分しか知らないかもよ）
「私なんてまだまだビギナーだから」（ビギナーだからビギナー目線の記事がかけるかもよ）
「読んでくれなかったらどうしよう」（読むに決まってるじゃないですか！）
「恥ずかしい」（誰も顔出してないです！）
「ぶっちゃけ、めんどくさい」（書く楽しさを知ってください）

つまり、登録して今年終わりを盛り上げましょう。
Laravel6ををさくらのライトプランにアップしたら500エラーが止まらない

<img width="1062" alt="Internal_Server_Error.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479523/1b61a23c-928e-6910-8e83-a891864b3f5f.png">

ローカルで作成したLaravelのプロジェクトをさくらのライトプランのサーバにアップしたらInternal Server Errorが出た。

# まず解決法

.htaccessが原因。``RewriteBase /``を追記すると直った。

```php:public/.htaccess
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On
    RewriteBase / # ←これを追加

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
```

# 調べ方

・トップページは表示できて、それ以外のページが見られない。cssなどの存在するファイルは表示できる。
   → .htaccessが原因かなぁとあたりをつける。

・.htaccessを削除してファイルの存在しないURLにアクセスすると500エラーが404エラーに。
   → .htaccessでほぼ確定。

・さくらのコントロールパネル ＞ アプリケーションの設定 ＞ アクセスログの設定 ＞ エラーログ からエラーを確認。

```
AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
```

   → Rerwiteで無限ループしているっぽいので修正。
Laravelをさくらのライトプランに置いた場合のファイルストレージのシンボリックリンク

Laravelのサイトをさくらのライトプランに置いた場合、sshが使えないので```php artisan storage:link```ができない。（ftpで直接シンボリックリンクを作成することもできない。）

# 対処方法

phpファイルに直接artisanを記述して対処。
例えばrouteに以下のを追記して```/artisan```にアクセスすればシンボリックリンク が貼れる。

```php:route/web.php
Route::get('/artisan', function () {
    $return = \Artisan::Call('storage:link');
    return dd($return);
});
```

# その他

さくらのライトプランにアップしたら.htaccessが原因で500エラーが出たので、よければこちらも参考にしてください。

[Laravel6ををさくらのライトプランにアップしたら500エラーが止まらない](https://qiita.com/shuuuta/items/7397eac6f29d54435ea5 "Laravel6ををさくらのライトプランにアップしたら500エラーが止まらない")
PHPで緯度経度から8分の1メッシュコードを取得する

PHPで8分の1メッシュコードを取得する関数を作成しました

```php
function calculateMeshCode($lon, $lat){
  $p = floor(($lat * 60) / 40);
  $a = fmod($lat * 60.0, 40);
  $q = floor($a / 5);
  $b = fmod($a, 5);
  $r = floor(($b * 60) / 30);
  $c = fmod($b * 60, 30);
  $s = floor($c / 15);
  $d = fmod($c, 15);
  $t = floor($d / 7.5);
  $e = fmod($c, 7.5);
  $tt = floor($e / 3.75);

  $u = floor($lon - 100);
  $f = $lon - 100 - $u;
  $v = floor(($f * 60) / 7.5);
  $g = fmod($f * 60, 7.5);
  $w = floor(($g * 60) / 45);
  $h = fmod($g * 60, 45);
  $x = floor($h / 22.5);
  $i = fmod($h, 22.5);
  $y = floor($i / 11.25);
  $j = fmod($h, 11.25);
  $z = floor($j / 5.625);

  $m = ($s * 2) + ($x + 1);
  $n = ($t * 2) + ($y + 1);
  $o = ($tt * 2) + ($z + 1);
  
  $mesh = "" . $p . $u . $q . $v . $r . $w . $m . $n . $o;

  return $mesh;
}
```

逆に取得したメッシュコードをmapboxに描画するやり方は[地域メッシュコードから緯度経度を取得してMapboxにポリゴンを描画](https://qiita.com/YujiHamada3/items/e1ca2b474b919396136c)に記載しています。
Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException'

## Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named _UITextLayoutView because no class named _UITextLayoutView was found; the class needs to be defined in source code or linked in from a library (ensure the class is part of the correct target)'

- Xcode 11.2の場合のみに起きる
- Storyboard / xib でUITextViewを配置していると起きる
- 実機で実行した場合のみに起きる

## 対策
- UITextViewをコードで配置するように修正
- Xcode 11.1 を使う（ここでDL https://developer.apple.com/download/more/ ）


## リンク
- https://forums.developer.apple.com/thread/125274
- https://www.v2ex.com/t/615285
初めてのGit

今年（２０１９年）の4月に中途入社した、ペーペー社員です。<br />
初めてちゃんとした？プロジェクトに入り、Gitを触る機会が増えた為、アプトプット。<br />
中途とはいえ、業界未経験の私には、Gitがなんなのかさっぱり・・・

<hr />

今回は初投稿という事で、Markdown記法の勉強も兼ねて、Gitの基本的用語から。<br />
※SourceTree(Version:3.1.1)を使用

## ローカルリポジトリ
自分のマシン上にあるリポジトリ

## リモートリポジトリ
ネットワーク上にあるリポジトリ

## Commit(コミット)
ファイルやデュレクトリの変更をローカルリポジトリ内で変更を行う事
<img width="600" alt="commit.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525819/35c63811-0d5e-cbf2-cc19-08496e2cb895.png">

## Push(プッシュ)
ローカルリポジトリの修正内容をリモートリポジトリに反映させる事
<img width="600" alt="push.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525819/fc273f05-4555-39f9-562e-868371aca844.png">

## Pull(プル)
リモートリポジトリの内容をローカルリポジトリに取り込む事
<img width="600" alt="pull.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525819/133cd40a-4f98-5806-be9c-90e2ccd7c7fd.png">

## Fetch(フェッチ)
リモートリポジトリの最新データを取得する事
※Pullと違ってローカルリポジトリに取り込んだりしない
<img width="600" alt="fetch.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525819/27fa06dd-3b00-2285-f2fc-050ea337e7fd.png">

## Stash(スタッシュ)
作業中の変更を一時退避させる事
※差し込み作業が入った時に、現時点ではCommitをしたくない時に使用
<img width="600" alt="stash.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525819/8f98b883-4302-2923-1979-7d3e58ef04ad.png">

## Cherry-pick(チェリーピック)
特定のCommitした内容だけをピックアップして取り込む事(複数OK)
<img width="760" alt="cherry_pick.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525819/620f1ccd-65d8-1a65-b92b-fce70fe94aee.png">

## Conflict(コンフリクト)
同じファイルに同じ箇所の変更が同時に起こる事

```swift
// コンフリクトの見方
<<<<<< HEAD
自分の変更内容
=====
コンフリクトが起きているブランチ
master >>>>>>
```
↓

```swift
<<<<<< HEAD
private func hogeMethod() {
   print("hoge")
}
=====
private func fugaMethod() {
   print("fuga")
}
master >>>>>>
```
どちらが正しいのか修正する必要がある
<hr />
基本的な用語と意味を理解しておくと、操作しやすくなります。<br />
学んだ事や理解したことがどんどん蓄積されていくので、おいおい投稿していこうと思います！<br />
では、また！
いくつかのファイルサーバー名をまとめる

ファイルサーバー移行等で新旧ファイルサーバー名を1台のサーバーにまとめる時の注意点
本文書では内容まで触れないが、ファイルサーバへのアクセス方法はいくつかあり、ホスト名の紐づけの対応方法も異なる。
単にDNSで名前解決をしても、サーバ側で認識されない場合はアクセスできない場合がある。

■テスト環境
［サーバー環境］
移行元ファイルサーバー：ServerA W2K3R2
移行先ファイルサーバー：ServerB W2K8R2
ADドメイン環境

［クライアント環境］
Win2000Pro、XP Pro、Vista Enterprise、7 Pro、Win10 LTSB2016

■設定内容
・実コンピュータ名以外のサーバー名に応答できるようにサービスを設定
キー：HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters 
名前：OptionalNames（REG_MULTI_SZ）
値：移行元サーバー名
上記設定後 Serverサービスの再起動
netstat -n で名前が増えたことを確認

・ドメイン環境の場合はkerberos認証に対応するためSPNを設定
SETSPN -A HOST/移行元サーバー名 移行先サーバー名
SETSPN -A HOST/移行元サーバー名.domainaname 移行先サーバー名
※コマンド投入時点で移行元サーバーへアクセスできなくなるので注意が必要

---
※上記のほか別途DNSやhosts等名前解決の手段が必要
※複数IPアドレスを割り当てても、IPアドレスとホスト名の紐づけはサーバー側で意識しません。
※移行元サーバ複数を移行してまとめることが可能ですが、同じ共有名がある場合はリネームなどの考慮が必要。