OmniAICreator/Qiita-1.07M huggingface dataset:
Drupal8をUSBWebserver8.6にインストールする

手軽にローカル環境にインストールしてみようとしたらバージョンなどの問題でなかなか上手くいかなかったのでメモ。（抜けがあるかもです）

Drupal8.4.4
https://www.drupal.org/project/drupal/releases/8.4.4

USBWebserver8.6
http://www.usbwebserver.net/webserver/

PHP7.1
http://windows.php.net/download#php-7.1
x86 Thread SafeのZipをダウンロード（x64だと上手くいかない）
Drupal8.4.4は7.1まで対応ということだったのでこちらを選択。

#PHPのインストール・設定
phpの中身をC:\Work\phpに置く（場所はローカルのどこでもいい）

php.ini-developmentをコピーしてphp.iniに改名

```php.ini
extension_dir = "C:/Work/php/ext/"
extension=php_curl.dll
extension=php_gd2.dll
extension=php_mysqli.dll
extension=php_pdo_mysql.dll
```

#USBWebserverの設定
Settingのhttpd.confを書き換える

```httpd.conf
# For PHP 7 do something like this:
LoadModule php7_module "C:/Work/php/php7apache2_4.dll"
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
# configure the path to php.ini
PHPIniDir "C:/Work/php"
```

https://usbwebserver.yura.mk.ua/
から8.6.2をダウンロードして、phpmyadminのフォルダをまるごと上書き（公式じゃないっぽいので自己責任で）

Port apacheは8080
Port MySQLは3306

#Drupalインストール
ローカルからだと翻訳サーバー？に繋がらなかったのでEnglishを選択

標準インストール

DBのユーザー名とパスワード
root
usbw

何かWarningが出ますがそのまま続けるみたいなリンクをクリック
これでインストールは完了です。
Azure App Service 環境で .html ファイルにて PHP を実行する

#概要
　Azure App Service (WebApps) の組み込みランタイムの１つである PHP は .php 拡張子のコンテンツに対して既定でオンとなっています。今回はこの PHP ランタイムを .html 拡張子に対しても有効にし .html 中に記述されたサーバーサイドスクリプトを実行できるように設定します。

#設定手順
１．組み込みの PHP ランタイムモジュールは D:\Program Files (x86)\PHP\ 配下に各バージョンが保存されています。
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/b3bb4dbd-7f90-6cb0-2a12-dfcbc3b49e52.png)

２．[アプリケーション設定] で現在利用している PHP バージョンを確認します。
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/8aae0baa-5bd0-b76f-4f51-16ec04c1c01d.png)

３．同じ [アプリケーション設定] の [ハンドラ マッピング] で上記と同一バージョンのランタイム php-cgi.exe を *.html に設定します。
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/166732/8c03c3d8-5efc-5ee0-f862-6acd1042aac1.png)

以上で、既存の組み込み PHP ランタイムにて .html コンテンツ中のスクリプトの実行が可能となります。
JavaScript の Map で異なるオブジェクトを同じキーにする方法は無い

いまのところはできないらしい。

```js
class C {
  constructor(v) {
    this.v = v
  }
}

let v1 = new C(1)
let v2 = new C(1)
const map = new Map()
map.set(v1, "ok")
console.log(map)             // Map { C { v: 1 } => 'ok' }
console.log(map.get(v2))     // => undefined
```

しかたがないので `toKey()` とか勝手に定義してあちこちで set / get の際に呼べばそりゃ動いたけど嫌。

```JavaScript
class C {
  toKey() {
    return this.v.toString()
  }
}

map.set(v1.toKey(), "ok")
map.get(v2.toKey())     // => ok
```

素の連想配列なら簡潔にアクセスできるうえに toString() の結果をキーにしてくれたりして、新しくできた Map より使いやすいというのはどういうことだろうと思ったりした。

```js
class C {
  constructor(v) {
    this.v = v
  }
  toString() {
    return this.v.toString()
  }
}

let c1 = new C(1)
let c2 = new C(1)
const map = {}
map[c1] = "ok"
console.log(map)         // { '1': 'ok' }
console.log(map[c2])     // => ok
```

# 参照

How to customize object equality for JavaScript Set - Stack Overflow
https://stackoverflow.com/questions/29759480/how-to-customize-object-equality-for-javascript-set
RailsのSTIを使ってみた

## 背景
既に運用中の求人サイトへ違う種類の求人を追加する要望が来た
現状の求人テーブルはjob_offersというテーブルがあり、中に既に数十万件データあり
job_offersとリレーションしてるテーブルが10個ぐらいがある

### どう対応するか考える
別テーブルで追加するか既存のテーブルへ追加するか検討してみた結果
業務フローと修正コストなどの観点で既存のテーブルへ追加するすることにした

### job_offersテーブル前後
STI（単一テーブル継承）を利用してテーブル設計
#### before

| id | content |
|---|---|
| 1 |既存求人 |

#### after
typeカラムを追加して、1の場合は既存求人
2,3は新規タイプの求人

| id | type | content |
|---|---|---|
| 1 | 1 | 既存求人タイプA |
| 1 | 2 | 新規求人タイプB |

## 対応詳細
### カラム追加してmigrate
```ruby
class AddTypeToJobOffers < ActiveRecord::Migration
  def change
    add_column :job_offers, :type, :integer, limit: 2, default: 1, null: false, after: :id
    add_index  :job_offers, :type
  end
end
```

### 新規タイプ求人クラス定義
```ruby
class JobOffer
end

class TypeAJobOffer < JobOffer
end

class TypeBJobOffer < JobOffer
end
```

### stiカラムをintegerにする
Railsのデフォルトではtypeをstringとして利用されて、中身クラス名を入れるようになってる
既存テーブルの件数が多くて、string利用する場合は遅いため、integerで対応するようにした

```ruby
module JobOfferStiable
  extend ActiveSupport::Concern

  module ClassMethods
    def find_sti_class(type_name)
      case type_name
        when 1
          TypeAJobOffer
        when 2
          TypeBJobOffer
        else
          self
      end
    end

    def sti_name
      case self.to_s
        when 'TypeAJobOffer'
          1
        when 'TypeBJobOffer'
          2
        else
          0
      end
    end
  end
end
```

```ruby
class JobOffer
  include JobOfferStiable
end
```

### 関連付け追加
顧客は複数の求人を持っている、TypeAとTypeBの求人関連付けを追加する

```ruby
class Customer
    has_many :job_offers
    has_many :type_a_job_offers
    has_many :type_b_job_offers
end
```

### テスト
```bash
# 全ての求人
JobOffer.count
sql: SELECT COUNT(*) FROM `job_offers`;

# TypeAの求人
TypeAJobOffer.count
sql: SELECT COUNT(*) FROM `job_offers` WHERE `job_offers`.`type` IN (1);

# TypeB求人
TypeBJobOffer.count
sql: SELECT COUNT(*) FROM `job_offers` WHERE `job_offers`.`type` IN (2);

# 顧客の全ての求人
Customer.last.job_offers

# 顧客の全てのTypeA求人
Customer.last.type_a_job_offers

# 顧客の全てのTypeB求人
Customer.last.type_b_job_offers
```

## その他
### 開発中にSTIを無効にしたい
開発中に、他のブランチに切り替えして、STIテーブルを自動判定されるため、エラーになる
その場合は、STIを無効にすれば良い

```ruby
def JobOffer
  self.inheritance_column = :_type_disabled
end
```


## 参考文書
http://ruby-rails.hatenadiary.com/entry/20141206/1417839458
https://github.com/viola/sti-example
https://qiita.com/taka0125/items/5a968817ff61aeb67107
Mixed Reality Toolkit - UnityのTips - HoloLensとImmersive HMDで実行時に処理を変える方法

#Mixed Reality CameraはHoloLensとImmersive HMDで処理を切り替えています。
最新のMRTK-UnityからはHoloLensとImmersive HMDいずれのアプリケーションでも同一ライブラリで開発が可能です。動作時にも特別なことをしなくてもそれぞれに応じた制御をしています。例えば、カメラオブジェクトは、HoloLensであれば「SolidColorにして黒で塗りつぶす」、Immersive HMDであれば「SkyBox等背景がある状態にする」と内部で自動的に判定して切替えてくれます。

## 自分の実装も切替えたいとき
MRTKのようにHoloLensとImmersive HMDで処理を変えたい場合に同じ仕掛けが使えないかと思い調べてみたところMixedRealityCameraManagerクラスのCurrentDisplayTypeプロパティをチェックすればHoloLens系なのかImmersive系なのかが実行時にわかります。

```csharp
if(MixedRealityCameraManager.Instance.CurrentDisplayType == MixedRealityCameraManager.DisplayType.Opaque)
{
    //Immersiveの処理
}

if(MixedRealityCameraManager.Instance.CurrentDisplayType == MixedRealityCameraManager.DisplayType.Transparent)
{
    //HoloLensの処理
}
```

MixedRealityCameraManagerは「MixedRealityCamera」のコンポーネントとして登録されているので初期値の変更などはInspectorから可能です。
vaffleのキーマップの追加

# 概要
矢印でも移動したくなった時の設定

# 内容
`:h vaffle-examples`にサンプルはありましたが、通常時にも反映されてしまうので、少し改良。

```vim
    function! s:customize_vaffle_mappings() abort
        nmap <buffer> <silent> <Left> <Plug>(vaffle-open-parent)
        nmap <buffer> <silent> <Right> <Plug>(vaffle-open-current)
    endfunction
    augroup vimrc_vaffle
        autocmd!
        autocmd FileType vaffle call s:customize_vaffle_mappings()
    augroup END
```
ajaxをボタン押したときに実行したい時用メモ


```test.html
<button>テスト</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script type="text/javascript">
$(function () {
    $('button').click(function () {
        // Ajax通信を開始する
        $.ajax({
            type: "POST",
            url: '/action',
            success: function() {
            	console.log('成功');
            },
            error: function(){
            	console.log('失敗');
            }
        })
    });
});
</script>
```
Ruby で Amazon S3 の http アクセスログをパースする

S3 のログは[独自形式](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/ServerLogs.html)で、ちょっとパースに手間がかかる。自前で処理したくないので、お手軽安全にパースする方法を検討した。

準備
------

[request-log-analyzer](http://request-log-analyzer.com/) という gem に含まれるパーサを使う。

	gem install request-log-analyzer

コード
--------

値は `#first` で取り出す。`#every` もあるが http 系のログでは使うことはないだろう。

```ruby
require 'request_log_analyzer'
require 'request_log_analyzer/request'
require 'request_log_analyzer/file_format'

require 'time'

format = RequestLogAnalyzer::FileFormat::AmazonS3.create
parser = RequestLogAnalyzer::Source::LogParser.new(format)

line = '300a66dd319290e36b67767f862a7f39072caa70ba33b8d01c4b79ddd8e6d7ef lamestuff.com [05/Oct/2012:15:24:46 +0000] 174.44.160.70 - CE74FF983317B326 REST.GET.OBJECT public/portfolio/22/thumbnail.jpg "GET /lamestuff.com/public/portfolio/22/thumbnail.jpg HTTP/1.1" 200 - 9515 9515 42 41 "http://spike.grobste.in/portfolio" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.14 (KHTML, like Gecko) Version/6.0.1 Safari/536.26.14" -'

parser.parse_line(line) do |request|
  puts request.first(:bucket)
  puts request.first(:key)
  puts Time.parse(request.first(:timestamp).to_s)
end
```

ログパーサなので `#parse_file` や `#parse_files` などもある。他にも[いろいろなフォーマットに対応](https://github.com/wvanbergen/request-log-analyzer/tree/master/lib/request_log_analyzer/file_format)しているので便利に使える局面もありそうだ。

含まれるフィールドは次の通り。

```
bucket_owner
bucket
timestamp
remote_ip
requester
request_id
operation
key
request_uri
http_status
error_code
bytes_sent
object_size
total_time
turnaround_time
referer
user_agent
line_type
lineno
source
```

なお、パフォーマンスの測定等はしていない。
LaravelでVueコンポーネントの動的import(遅延ローディング)をする

# poi上で作ったvueコンポーネントをLaravelプロジェクトに載っけようとしたらエラーが出る

Vueはコンポーネントの遅延ローディングをサポートしていますが、[poi](https://poi.js.org)では何もしなくても動いた構文がLaravel5.5ではビルドエラーになってしまいます

コンポーネントの動的読み込み部分で以下の様なエラーが出ます

```:console
ERROR in ./node_modules/babel-loader/lib?{"cacheDirectory":true,"presets":[["env",{"modules":false,"targets":{"browsers":["> 2%"],"uglify":true}}]],"plugins":["transform-object-rest-spread",["transform-runtime",{"polyfill":false,"helpers":false}]]}!./node_modules/vue-loader/lib/selector.js?type=script&index=0&bustCache!./resources/assets/js/components/sample_switch_smoothly/SwitchSmoothly.vue
Module build failed: SyntaxError: Unexpected token (38:20)

> 38 | const CompB = () => import('./CompB.vue')
     |                     ^
```

えー何で？Laravelって何もしなくてもES6イケるんじゃないの？
ぐぐってみたら、babelにdynamic import対応プラグインを追加せにゃならんらしい。エーめんどくせ

ここで解決されてたので、それを~~丸パク~~参考にしてみる
[Vue.js Async Components #1249](https://github.com/JeffreyWay/laravel-mix/issues/1249)

```:console
% yarn add babel-plugin-syntax-dynamic-import --dev
```

.babelrc ファイルをプロジェクトrootに作成する。内容は以下の通り

```json:.babelrc
{
    "presets": [
        [
            "env",
            {
                "targets": {
                    "browsers": [
                        "last 2 versions"
                    ]
                }
            }
        ]
    ],
    "plugins": ["syntax-dynamic-import"]
}
```

webpack.mix.js に以下の設定を追加

```js:webpack.mix.js
mix.webpackConfig({
    output: {
        chunkFilename: 'js/[name].js',
    },
});
```


これでコンパイルエラーも無くなって、ちゃんと2.jsみたいのが出来るのだが、
実行時にそれを読み込もうとする所でエラーになる

エラーは以下

```:console
GET http://localhost:8080/[現在の画面のURL]/2.js net::ERR_ABORTED

[Vue warn]: Failed to resolve async component: function compB() {
            return __webpack_require__.e/* import() */(2).then(__webpack_require__.bind(null, 115));
        }
Reason: Error: Loading chunk 2 failed.
```

何故相対パスでアクセスするのか・・・馬鹿なの？

webpack.mix.js にpublicPathの設定を追加

```js:webpack.mix.js
mix.webpackConfig({
    output: {
        chunkFilename: 'js/[name].js',
        publicPath: '/',
    },
});
```

やっと動いたー

## なんか古いchunkファイルが残るんですけど！

無事に動的importを使ったvueが動作したんですが、```# yarn run watch``` とか使って開発してると、hot reload関係なのかチャンクファイルがダブります。
0.js, 1.js, 2.js のある状態でvueファイルを編集すると、3.js, 4.js, 5.js が出来ちゃいます。
まあ、デプロイ時には関係ないし開発中も大して実害は無いけども、キモチワルイので対処します。

laravel-mix や babel に出力ファイルを削除してから作る様な設定は無い様子
しょうがないのでnpm scriptに削除タスクを追加(最初の２つ)
jsフォルダには他のファイルもあったりするのでchunksフォルダ以下にチャンクファイルを出力する様に変更

```json:package.json
{
    "scripts": {
        "predevelopment": "npm run clean",
        "clean": "rimraf public/js/chunks",
        
        "dev": "npm run development",
        "development": "cross-env NODE_ENV=development (略)"
    },
}
```

```js:webpack.mix.js
mix.webpackConfig({
    output: {
        chunkFilename: 'js/chunks/[name].js', <-- ここを変更
        publicPath: '/',
    },
});
```

# 最後に

poi便利
らずぱいGPIOで動かすサーボについて

今現状スイッチ２個使用して１軸のサーボを下記のコードを用いて動かしてますが、現実にはMeArmロボットというものを手動でうごかしたいので４軸すべて動かせるコードをわかるかたいれば教えてください。（もちろんのことですが、１軸に対して必ず９０度作動するスイッチとー９０度作動するスイッチの２個、計８個のスイッチ入力を使用します。またGPIOピン番号はどれをあてはめてもかまいません。変更はこちらで勝手にします。動かすときは必ず１軸だけしか動かしません。）

```py3
import RPi.GPIO as GPIO
from time import sleep

# ポート番号やサーボモーターの情報を指定
SV_PORT  = 14
SW1_PORT = 17
SW2_PORT = 18

SV_FREQ = 50 # 20ms(50Hz)
SV_DUTY_OFFSET = 0.025
SV_DUTY_RES = (2.4 - 0.5) / 20 / 180

# GPIOの設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(SV_PORT , GPIO.OUT) # サーボモーターの設定
GPIO.setup([SW1_PORT , SW2_PORT],
    GPIO.IN,
    pull_up_down=GPIO.PUD_DOWN) # ボタンの設定

# PWMを利用する準備
servo = GPIO.PWM(SV_PORT, SV_FREQ)
servo.start(0)
sleep(0.3)

# サーボの角度を計算し変更する関数
def set_angle(angle):
    if angle < -130: angle = -130
    if angle >  60: angle =  60
    degree = (angle + 90)
    duty = (SV_DUTY_OFFSET + SV_DUTY_RES * degree) * 100
    print("angle=",angle,"duty=", int(duty))
    servo.ChangeFrequency(SV_FREQ)
    servo.ChangeDutyCycle(duty)

# ボタンに応じてサーボの角度を変える
angle = 0
set_angle(angle)
while True:
    try:
        # ボタンの状態を監視
        if GPIO.input(SW1_PORT) == GPIO.HIGH:
            angle -= 10
            set_angle(angle)
        if GPIO.input(SW2_PORT) == GPIO.HIGH:
            angle += 10
            set_angle(angle)
        sleep(0.1)
    except KeyboardInterrupt:
        break

GPIO.cleanup()
```
【php】DBの年/月/日をinput type="date"に初期値を渡したいとき


`input type="date"` のvalueには `2018-1-3` ではなく、`2018-01-03`のような形式で渡さないといけない。

##方法

- `sprintf()`を使って数値の桁数をそろえる
- 結合する

```
$year = $data->year;  //2018
$month = $data->month;  //1
$day = $data->day;  //3

//1桁の場合は0をつけて桁数をそろえる　　
$month = sprintf('%02d', $month);  //01
$day = sprintf('%02d', $day);  //03

//結合
return $today = $year.'-'.$month.'-'.$day;  //2018-01-03
```
【php】input type="date"の値を年・月・日に分割


`2018-01-11` を `2018` `01` `11` に分割。

```
$year = substr($this->request->get("today"), 0, 4);
$month = substr($this->request->get("today"), 5, 2);
$day = substr($this->request->get("today"), 8, 2);
```

## 頭のゼロを取りたいとき

DBに突っ込むときなどには先頭の`0`が邪魔なので取りたい。
一番簡単なのは`文字列`=>`数値`にすること。

```
$month = (int)$month;  //1
```
ARM Linuxのリモートデバッグ用にgdb 8.0.1 をソースからビルドする

どうせやるなら、現在の最新版で試さなければと思って。

#gdbのビルド
gdb本体をビルドするにはARMのクロスコンパイラは不要です。
gdb 8.0以降ではビルドするのに、C++-11 の規格のコンパイラが必要になっています。g++なら4.8以降。

```
wget http://ftp.jaist.ac.jp/pub/GNU/gdb/gdb-8.0.1.tar.gz
tar xf gdb-8.0.1.tar.gz

mkdir obj
cd obj
../gdb-8.0.1/configure --target=arm-buildroot-linux-gnueabi
make -j8
sudo make install
```
これで /usr/local/以下にインストールされます。

```
$ arm-buildroot-linux-gnueabi-gdb -v
GNU gdb (GDB) 8.0.1
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-pc-linux-gnu --target=arm-buildroot-linux-gnueabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
```

#gdbserverのビルド

ARMのクロスコンパイラが必要です。
今回はarm-buildroot-linux-gnueabi-gcc を使用します。

```
mkdir obj.gdbserver.arm
cd obj.gdbserver.arm
../gdb-8.0.1/gdb/gdbserver/configure --host=arm-buildroot-linux-gnueabi
make -j8
arm-buildroot-linux-gnueabi-strip gdbserver
```

```
$ file gdbserver
gdbserver: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.4.0, stripped
$ ls -l gdbserver
-rwxrwxr-x 1 koba koba 294016 Jan 11 11:22 gdbserver
```

#gdbserverのスタティックリンク版のビルド

```
mkdir obj.gdbserver.arm.static
cd obj.gdbserver.arm.static
LDFLAGS=--static ../gdb-8.0.1/gdb/gdbserver/configure --host=arm-buildroot-linux-gnueabi
make -j8
arm-buildroot-linux-gnueabi-strip gdbserver
```

```
$ file gdbserver
gdbserver: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, for GNU/Linux 3.4.0, stripped
$ ls -l gdbserver
-rwxrwxr-x 1 koba koba 1079556 Jan 11 11:24 gdbserver
```

スタティックリンク版は実行ファイルのサイズが大きくなりますが、実機のライブラリやABIが異なる環境でも動作可能です。
これを手札として持っていると、他のプロジェクトからの救援要請で早急にリモートデバッグ環境をセットアップしたいときに初動が早くなります。
Flutter が使う Gradle が 4.1 になった

2017/12 に Flutter が使う Gradle が 4.1 (Android Studio Gradle plugin は 3.0.1) になりました。

この変更より前に Flutter のアプリを作成開始した場合、作られた雛形が Gradle 3.3 になっています。公式プラグインが Gradle 4.1 向けに変更されているので、プラグインを最新にするためには対応が必要です。

具体的な手順は Flutter の以下の Wiki にまとまっています。

https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1

また、以下のページも参照。

https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html

自分の環境では android/gradle/wrapper/gradle-wrapper.properties の gralde のバージョンを 4.1 に書き換えました。
Jenkins(windows)でgitのエラー

# 概要

昨日まで問題なくJenkinsのビルドが動いていたのに、突然ビルドができなくなってしまいました。
ビルドのログを確認したところ、以下の様なエラーが発生していました。

```
 > git.exe rev-parse --is-inside-work-tree # timeout=10
ERROR: Workspace has a .git repository, but it appears to be corrupt.
hudson.plugins.git.GitException: Command "git.exe rev-parse --is-inside-work-tree" returned status code 128:
stdout: 
stderr: fatal: bad config line 1 in file .git/config

	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:1784)
	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:1757)
	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandIn(CliGitAPIImpl.java:1753)
	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:1409)
	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommand(CliGitAPIImpl.java:1421)
	at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.hasGitRepo(CliGitAPIImpl.java:196)
	at hudson.plugins.git.GitAPI.hasGitRepo(GitAPI.java:232)
	at jenkins.plugins.git.AbstractGitSCMSource.doRetrieve(AbstractGitSCMSource.java:185)
	at jenkins.plugins.git.AbstractGitSCMSource.retrieve(AbstractGitSCMSource.java:214)
	at jenkins.scm.api.SCMSource.fetch(SCMSource.java:247)
	at org.jenkinsci.plugins.workflow.multibranch.SCMBinder.create(SCMBinder.java:75)
	at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:215)
	at hudson.model.ResourceController.execute(ResourceController.java:98)
	at hudson.model.Executor.run(Executor.java:404)
Creating git repository in C:\Program Files (x86)\Jenkins\caches\git-7dd8566e7a711901887efa9299fa2e2d
```

# 対処

ログに出力されていたパス（上記ログの最終行に出ています）を確認してみると、`.git`ディレクトリがあり、エラーメッセージにあるようにconfigファイルがおかしなことになっていました。（テキストエディタで開けなくなっていました）

そこで`caches`ディレクトリ配下を一旦削除したところ、ビルド実行できるようになりました。

# 補足

問題となったジョブは`Multibranch Pipeline`で構成しています。
定期的に対象リポジトリが更新されているかをチェックするようになっていますが、その処理でこけていたようです。
Django 2.0 の CRUD 操作が身につくチュートリアル

Django について日本語で読める書籍やチュートリアルはほとんどなく、あってもかなり古いバージョンだったりと寂しい状況です。

Django 2.0 を学びつつ、アウトプットとしてチュートリアルを作ってみました。

簡単なブログアプリを作りながら、データの表示、新規作成（追加）、変更、削除の基本操作を身につけることができますので、お役立てください。


## Django2 入門チュートリアル – CRUDの基本を簡単なサンプルで学ぶ
<ol>
<li><a href="https://it-engineer-lab.com/archives/331">環境準備</a><br>venv による仮想環境とDjango2.0のインストール
</li>
<li><a href="https://it-engineer-lab.com/archives/337">モデルとマイグレーション</a><br>モデルの作成とDjango特有のマイグレーションについて</li>
<li><a href="https://it-engineer-lab.com/archives/379">Django Admin</a><br>Django 最大の特徴ともいえる Django Admin サイトについて</li>
<li><a href="https://it-engineer-lab.com/archives/402">汎用クラスベースビューによるCRUDの実装</a><br>汎用クラスベースビューを利用して投稿データについてCRUD操作を実装</li>
</ol>

といった構成になっています。

~~※ユーザー登録とログイン認証についてのチュートリアルもただいま作成中です。~~
<a href="https://it-engineer-lab.com/archives/506">ユーザー認証（ログイン認証）を実装するチュートリアル</a>を追加しました。
Azure Active DirectoryでMFAにハマった話

#Azure Active DirectoryでMFAにハマった話

## 軽く運用状況を説明

弊社では、Azure Active Directoryを使用し `社外からクラウドサービスへアクセスする場合` においては

MFAを必須とした運用をしています。


ある日、CISOがやってきて

**「AWSコンソールへのアクセスは、社内からのアクセスであってもMFAを要求したい」**

と言いました。 


.oO（そういえば条件付きアクセスポリシーで定義したらそれっぽいことはできるなぁ）


と思ったので、実際にやってみることにしましたが・・・

クラシックポータルから新ポータルへの移行でとてもハマったので色々まとめてみます。

## 前提条件

### 必要なライセンス

Azure Active Directory Premiumライセンスが必要です。

Office365にバンドルされているライセンスでは、多要素認証として利用できる機能が制限されるらしいです。

### 多要素認証を定義している

ここでの多要素認証とは、 `クラシックポータル内の多要素認証`  のことを指します。

アクセス方法は、 `https://portal.azure.com/` から

`Azure Active Directory` / `条件付きアクセス` / `名前付きの場所` / `MFAの信頼できるIPの構成`

で確認できます👀

### ユーザーへのライセンス付与

Azure Active Directory Premiumライセンスを保有していても、アカウントに対して割当をしないと意味がありません。

Azure Active Directory の 管理 / ユーザーとグループ でライセンスを割り当てておきましょう。

## 本題

さて、Azure Active Directory（以下AADと省略）の条件付きアクセスポリシーを使用して

`特定のアプリだけ社内でもMFAを要求する` ポリシーを作成しました。

条件付きアクセスポリシーを有効化し、思った挙動になるかテストしてみました。


が、


MFAのセットアップダイアログが出てきません💦

壊れているのかな・・・

## 多要素認証だけが機能していない

テストポリシーを作成し、どこが機能していないのかを検証しました。

結果、 `多要素認証を要求する` という項目が機能していない事が判明。



# 解決方法

## 概要

AADの条件付きアクセスポリシーにおいて、多要素認証を求めるポリシーが機能しない　という現象は

クラシックポータル内の `多要素認証`　が `有効` または `強制` となっている場合に発生します。

なんと

`クラシックポータルでの多要素認証`

と

`新ポータルの条件付きアクセスポリシーで定義されている多要素認証`

は

別物❗


というわけなんです。

干渉してクラシックポータルのMFAが優先されていたんですね・・・💦

## クラシックポータルの多要素認証を無効化

`https://portal.azure.com/` から

`Azure Active Directory` / `条件付きアクセス` / `名前付きの場所` / `MFAの信頼できるIPの構成`

上記へアクセスし、ユーザータブから `すべてのユーザーのMFAステータス` を `無効` にします。

❗無効にすると、条件付きアクセスポリシーで定義していない限りMFAが解けてしまいます ❗

## 結果

クラシックポータルの多要素認証を無効化することで、新ポータルの条件付きアクセスポリシーが優先されるようになります。

つまりは、MFAを求めたくない挙動を再現するには `条件付きアクセスポリシー` を使用するしか無い　ということですね👀

`クラシックポータルの多要素認証を無効化`　することで、理想の挙動をするようになりました。
React refで作るチェックリスト

#Reactで作るチェックリスト

##要件

* 任意の数のチェックリストがある
* 確認ボタンがある(不活性状態)
* 全てにチェックがつくと確認ボタンが活性化する


##機能
* checkFlag: 全てのチェックが付いてるか判定するフラグ(state)
* checkList: チェックボックスの値を保持した配列(const)
* flagListUpdate: checkFlagの値を変更する
* stateEvery: checkListの値が全てtrueか判定する(everyで即時関数渡すのが嫌だから)

##実装

```jsx:CheckList

class CheckList extends React.Component {
  constructor(props) {
    super(props);   
    this.state = {
       checkFlag: false
    }
    this.flagListUpdate = this.flagListUpdate.bind(this);
  }
  flagListUpdate(list){
    this.setState({ checkFlag: list.every(this.stateEvery) });
  }
  stateEvery(element){
    return element.checked === true;
  }
  
  render() {
    const flagList = [];
    return (
      <div>
        <input
          type="checkbox"
          ref={el => {flagList.push(el)}}
          onClick={() => this.flagListUpdate(flagList)}
        />
        <input
          type="checkbox"
          ref={el => {flagList.push(el)}}
          onClick={() => this.flagListUpdate(flagList)}
        />
        <button
          className={
            `button ${this.state.checkFlag && 'button--on'}`
          }
        >submit</button>
      </div>
    );
  }
}

```


##概要
各inputのrefを保管する`flagList`を初期化したあと、
``` ref = {el => { flagList.push(el) }} ``` で 画面読み込み時に `flagList` にDOMの情報を追加して行く
あとは、その配列が全て `true` かどうか判定するだけ


## CodePen
CodePen　にも動いているものを公開したのでご参考ください

<p data-height="299" data-theme-id="0" data-slug-hash="vpRQVL" data-default-tab="css,result" data-user="HidetoNagamatsu" data-embed-version="2" data-pen-title="React Ref checkList" data-preview="true" class="codepen">See the Pen <a href="https://codepen.io/HidetoNagamatsu/pen/vpRQVL/">React Ref checkList</a> by Hideto (<a href="https://codepen.io/HidetoNagamatsu">@HidetoNagamatsu</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
docker-compose up でNo such image: xxxxxが出た時の対処

# 環境
docker-compose 1.18.0
docker for windows ce-17.12.0
windows10 pro

# 現象
```docker-compose up```
でエラーが出た
```ERROR: for xxx  no such image: sha256:xxxx: No such image: sha256:xxxx
```

以前起動して今は停止中になっているコンテナが邪魔してるようなので
停止中のコンテナを削除する
```docker-compose rm```

解決
SageMakerでlinear learnerを使うときにハマったのでメモ

sageMakerを使ってみていてジョブの作成時にめちゃめちゃハマったのでメモ
(ハマった部分だけ記載しているので他の部分は割愛します)

とりあえずデフォルトで用意されている学習法を使ってみようと思い今回はliner learnerを選択。
トレーニングデータは自前で用意していました。

![Kobito.yVk02D.png](https://qiita-image-store.s3.amazonaws.com/0/192406/f5eef4d8-3c19-94ed-9811-4dc713b3bdeb.png "Kobito.yVk02D.png")

それで今回ハマったのはチャネルの作り方とトレーニングデータの作り方。
もともと作成していたトレーニングデータは1~5列目に説明変数、6列目に目的変数を記載していました。
コンテンツタイプに`text/csv;label_size=<num>`の`<num>`に目的変数が記載してある列番号書いとけばいいのかなって思ったので`text/csv;label_size=6`ってしてジョブを作成していたのですが何度やってもfailed...
ヘッダつけてるからダメなのかなって思ってヘッダ消したけどやっぱダメでした。
結局[AWSのドキュメント](URL "https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/linear-learner.html")見て気づいたのですが
コンテンツタイプを`text/csv`にしてトレーニングデータの1列目に目的変数を記載してねって書いてあったのでトレーニングデータを書き換えることで無事にジョブが通りました。

まだモデル作成等はやっていないのでこれからやります。

##### 追記
記事書いた直後にモデル作成とかもやったのですがモデル、エンドポイントの作成では特にハマることなくできました
ただエンドポイントを作成してどうやって使ったらいいのか全くわからない......
どなたかわかる方がいらっしゃいましたらご享受お願いします

##### 追記2
エンドポイント作成して実際に使うことができましたので[記事](https://qiita.com/naoko_s/items/5c8b184ded4e1c306baf)にしました
やったね
Windows7でSEC7118が表示される。


XMLHttpRequest には Cross Origin Resource Sharing (CORS) が必要です。
と表示される。

これはWindows7, Window8のIE11で表示されるエラーでWindows10ではエラーが削除されている事から表示されていても無視してOKの模様

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/d7c63349-cbbd-39bb-c835-6d50506070c3.png)


[F12 開発者ツールのコンソール エラー メッセージ (Windows)](https://msdn.microsoft.com/ja-jp/library/dn423949(v=vs.85).aspx)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/ddca5822-8852-ade8-f323-f19680f01d9a.png)



https://questionfocus.com/sec7118-xmlhttprequest-cors-ie-console-message.html

<pre>
Answers:
I encountered SEC7118 when CORS was set up correctly. I verified that the requests were completing with status 200 using the network debugger. So, you can disregard this message if your application is otherwise functioning properly.
</pre>

CORSが正しく設定されたときにSEC7118が発生しました。 要求がネットワークデバッガを使用してステータス200で完了していることを確認しました。 したがって、アプリケーションが正常に機能している場合は、このメッセージを無視できます。
sambaサーバ構築 centos7

# 1.sambaインストール
### yum install samba samba-client samba-common -y

# 2.sambaの初期設定
sambaの設定ファイルである「smb.conf」をバックアップ、編集する。
### mv /etc/samba/smb.conf /etc/samba/smb.conf.bk
### vi /etc/samba/smb.conf
conf内
>[global]
workgroup = WORKGROUP
server string = Samba Server %v
netbios name = centos7
security = user
map to guest = bad user
dns proxy = no
\#==========================================================
[Share]
\#共有させるフォルダ
path = /samba/share/
\#マイネットワークに表示させるか否か
browsable =yes
\#書き込み可能かどうか
writable = yes
\#ゲストユーザのログインが可能かどうか
guest ok = yes
\#読込みのみとするか
read only = no

「smb.conf」の記述後、共有するフォルダを作成する。
>mkdir -p /samba/share
chmod -R 0777 /samba/share
chown -R nobody:nobody /samba/share

sambaの起動設定を行うため、以下のコマンドを実行する。
>systemctl enable smb.service
systemctl enable nmb.service
systemctl restart smb.service
systemctl restart nmb.service

Linux側でsambaの通信が行えるよう、firewallの設定を変更する。
>firewall-cmd --permanent --zone=public --add-service=samba
firewall-cmd --reload

SELinuxの設定を変更し、sambaの利用を許可する。
>chcon -t samba_share_t /samba/share 

# 3.アクセスする
「ファイル名を指定して実行」を開く
「\\\centos7」でも「\\\IPアドレス」でもどららでもよいので入力して実行すると
アクセスできる。

# 4.samba利用時にパスワードを設定する
これでファイルサーバとして利用出来るようになったので、次は特定のユーザのみが編集出来るフォルダを作成してみよう。
ユーザはパスワードでログインする。
まずは、以下のコマンドでユーザやグループを作成する。
>useradd test
groupadd testgroup
usermod -a -G testgroup test

次に、ユーザ「test」にsamba用のパスワードを設定する。

>$ smbpasswd -a test
New SMB password: #パスワードを入力
Retype new SMB password: #パスワードを再度入力
Added user test.

以下のコマンドで、ユーザグループ「testgroup」がsambaで用いるためのフォルダを作成する。

>mkdir /home/sectest
chown -R test:testgroup /home/sectest/
chmod -R 0777 /home/sectest/
chcon -t samba_share_t /home/sectest/

再度「smb.conf」を編集するため、viエディタを起動させる。

>vi /etc/samba/smb.conf

以下の内容を「smb.conf」の末尾に付け加える。

>[SecTest]
path = /home/sectest
valid users = @testgroup
guest ok = no
writable = yes
browsable = yes

最後に、sambaのサービスを再起動させる。

>systemctl restart smb.service
systemctl restart nmb.service

これで、セキュリティ設定をされているフォルダ「SecTest」が表示される。

参考URL
https://orebibou.com/2014/12/centos7%E3%81%ABsamba%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/
Google Cloud Storage に Write したときは Close の戻り値を必ず確認する

Go言語で Google Cloud Storage を扱う cloud.google.com/go/storage という公式のパッケージがあります。

GCS にファイルをアップロードする処理で、io.Writer のインタフェースを経由してデータをアップロードすることになります。

Writer の取得までは以下のようなコード:

```go
client, err := storage.NewClient(ctx)
if err != nil {
    return err
}
bkt := client.Bucket("bucketname")
obj := bkt.Object("filename1")
w := obj.NewWriter(ctx)
```

そして Write するときに、いつもの癖で以下のように書くと……ダメです:

```go
...
w := obj.NewWriter(ctx)
defer w.Close()

_, err := w.Write([]byte("こんにちは！こんにちは！"))
if err != nil {
    return err
}

// アップロード成功！……とは限らない
```

ドキュメントを読んでみましょう。
https://godoc.org/cloud.google.com/go/storage#Writer.Write

> Write appends to w. It implements the io.Writer interface.
> 
> Since writes happen asynchronously, Write may return a nil error even though the write failed (or will fail). Always use the error returned from Writer.Close to determine if the upload was successful.

下の段をGoogle翻訳:

> 書き込みは非同期的に行われるため、書き込みが失敗した（または失敗する）にもかかわらず、書き込みがnilエラーを返すことがあります。常にアップロードが成功したかどうかを判断するには、Writer.Closeから返されたエラーを使用します。

この通り Close の戻り値を確認する必要があります。書き込みが非同期なのがポイントで、Writer は内部では io.PipeWriter に Write しているだけです。この Pipe に送られたデータは非同期で GCS に送信されます。通信でエラーが発生しても、Write は成功する場合があるのです（というよりは Write はほぼ成功します、オンメモリの操作なので）。

正しくは以下のように Close の戻り値を確認します:

```go
client, err := storage.NewClient(ctx)
if err != nil {
    return err
}
bkt := client.Bucket("bucketname")
obj := bkt.Object("filename1")
w := obj.NewWriter(ctx)

_, err := w.Write([]byte("こんにちは！こんにちは！"))
if err != nil {
    w.Close() // これは要るかどうか？
    return err
}

// このチェックを忘れずに！
if err := w.Close(); err != nil {
    return err
}

// ここまで来たらアップロード成功！
```
【サルが書く】WebAPIURIの設計

# WebAPIのあるべき姿
**覚えやすく、どんな機能を持つURIなのかがひと目でわかるように設計する**

- 短く入力しやすいURI

- 人間が読んで理解できるURI

- 大文字小文字が混在しないようなURI

- HackableなURI

- サーバ側のアーキテクチャが反映されていないURI

- ルールが統一されたURI
Hyper-Vクラスターのマイグレーション動作が失敗する原因と対処

構築する中でハマった件について、原因と対処が見つかるたびに更新する予定。

## 仮想スイッチ構成が合っていない
WindowsServer2016を用いたクラスタ環境で発生確認。ライブマイグレーション/クイックマイグレーション時に失敗した。
マイグレーションしようとした仮想マシンでは"internal"という名前仮想スイッチを使っているが、マイグレーション先のノードにこの仮想スイッチがなかった。

* Hyper-Vマネージャーにて仮想スイッチを作成し、マイグレーション先と元のノードで同じ構成にする
* マイグレーションを再実施


## 元ノードと先ノードで時刻がズレている
WindowsServer2016を用いたクラスタ環境で発生確認。ライブマイグレーション時に失敗した。クイックマイグレーションでも起きるかどうかは未検証。
クラスター環境では全ノードがクラスター用ADに参加しているが、元ノードと先ノードで時刻同期が正常に行われておらず、結果として大幅な時刻ズレが起きていた。
WindowsServer2016はWindows10 1607ベースなので、SecureTime問題に引っかかったのであろうと想定。

* [SecureTimeを無効化](https://qiita.com/SkyLaptor/items/3eb5e63170c68a8bf471)する
* 時刻同期を再実施し、時刻がマイグレーション先と元で同じになるようにする（NTP同期先も違っていた場合）

```bat:
w32tm /config /syncfromflags:manual /manualpeerlist:<クラスタ用ADサーバー> /update
w32tm /resync /nowait
w32tm /query /status
```

* ライブマイグレーションを再実施


## マイグレーションする仮想マシンに別ドメインのリソースがマウントされている
WindowsServer2016を用いたクラスタ環境で発生確認。ライブマイグレーション時に失敗した。クイックマイグレーションは動作する。
OSインストールのために、NASに置いてあるISOイメージを仮想マシンにマウントしていたが、OSインストール後もマウントさせっぱなしにしていた。
恐らくネットワークアクセス権絡みで失敗していたと推測。

* 別ドメイン(NASなど)上のリソースをマウントを解除
* ライブマイグレーションを再実施


## クラスターネットワークがオフラインになっている
WindowsServer2016を用いたクラスタ環境で発生確認。ライブマイグレーション時に失敗した。クイックマイグレーションは動作する。
クラスターのネットワークを確認すると、クラスターネットワークがオフラインになっていた。原因は不明。

* ノードサーバーのNICを無効/有効
* クラスターネットワークがオンラインになったことを確認
* ライブマイグレーションを再実施
C++ Builder XE4 > UDP > BCB6からの移植 (FastNetからIndy10)

```txt:動作環境
C++ Builder XE4
```

2013年6月25日のメモより
(+ XE4での動作に基づき修正: 2018/01/11)

C++ Builder 6 (以下BCB6)からXE4への移植時には、FastNetからIndy10への切替えが必要となる。

FastNetではNMUDPを使用していた。

## 変更

### 受信

IdUDPServer1UDPRead()において

```cpp
//    NMUDP->ReadBuffer(szBuf, sizeof(szBuf), NumberBytes);
```

上記は以下のように変更する (エンコーディングは適宜変更)。

```cpp
cmdStr = TEncoding::Default->GetString(AData, 0, AData.Length);
```

### 送信

```cpp
//    NMUDP->RemoteHost = FromIP;
//    NMUDP->RemotePort = Port;
//    NMUDP->SendBuffer(cmdStr.c_str(), len, len);

    AnsiString FromIP;
    int Port;

    FromIP = ABinding->PeerIP;
    Port = ABinding->PeerPort;
    IdUDPServer1->Send(FromIP, Port, cmdStr);
```
Goで数値化されたExcelの列番号をアルファベット表記に戻す

GoでExcelシートの内容をプログラム内で読み込みした際に
数値化された列番号を元のシートのようにローマ字表記にしたかったので以下のようにして対応した。

実装要件的に702列目以降を読み取ることはなかったので、変換後のアルファベットは2桁（ZZ列まで。）の対応とした。
Excelの最大列は16,384列のはずなので、最大でもアルファベット3桁に対応しておけば困ることはないはず。

```
 // ConvertColNumberToAlphabet 列番号を英語表記に変換する.
 func ConvertColNumberToAlphabet(col int) string {
      var colName string
      x := int((col-1) / 26)
      y := col - (x * 26)
      if x > 0 {
          colName = string(x + 64)
      }
      if y > 0 {
          colName = colName + string(y+64)
      }
      return colName
  }
```

参考にしたサイト
https://support.microsoft.com/ja-jp/help/833402/how-to-convert-excel-column-numbers-into-alphabetical-characters

https://ashitani.jp/golangtips/tips_string.html#string_AtoI
iOSアプリ開発(Swift)に着手するときに参照したい情報

iOSアプリ開発を始めるにあたって色々調べたり参照した情報のメモ

```bash
# iOSアプリ開発開始当時の環境
$ swift --version
Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2)
Target: x86_64-apple-macosx10.9
```

## Swift 言語仕様

* 書籍
  * [プログラミング経験者のためのSwift最速入門](http://amzn.asia/3ML4ubV) (※Swift3)
  * [詳細！Swift 4 iPhoneアプリ開発 入門ノート Swift 4+Xcode 9対応](http://amzn.asia/cpEvLkM)
      * Part1 概要~最初の話~:ハローワールド
          * 全Chapter
      * Part 2 基礎知識 ~実力を蓄える~:Swiftのシンタックス
          * 全Chapter
      * Part 3 実践入門~作って学ぶ~:iOSアプリを作る
          * Chapter 11 オートレイアウト
          * Chapter 13 ビューと画像
          * Chapter 14 シーンの作成と移動
          * Chapter 18 データの保存と読み込み
* [公式サイトの日本語訳](https://github.com/Rusutikaa/developer.apple.com)
  * [The Swift Programming Language](https://rusutikaa.github.io/developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/index.html)
  * [Start Developing iOS Apps (Swift)](https://rusutikaa.github.io/developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/index.html)
* [プログラミング言語 Swift (by はてな)](https://github.com/hatena/Hatena-Textbook/blob/master/swift-programming-language.md) (※Swift3)
* [どこよりも分かりやすいSwiftの"?"と"!"](https://qiita.com/maiki055/items/b24378a3707bd35a31a8)


## iOS

* [iOS のイベント駆動をライフサイクルイベントとユーザアクションイベントにわけて理解する](http://glassonion.hatenablog.com/entry/20120405/1333611664)
* 
## ノウハウ

* [[2018年版] よく分かる！iOSアプリのリリース手順のまとめ](https://dev.classmethod.jp/smartphone/iphone/ios-app-how-to-release-2018/)
* [iOSアプリ新規開発のノウハウ](http://nsblogger.hatenablog.com/entry/2017/12/13/ios_development_know_how)
* [iOSアプリを作るときのおすすめ構成 2017年末版](https://medium.com/swift-column/ios-2017-4f04d00a5804)
* [大規模リファクタリングで痛感したSwiftのOptionalとの正しい付き合い方](http://tech.vasily.jp/entry/how-to-use-optional-in-more-better-way)

## アーキテクチャ

* [iOS開発でClean Architectureを採用した際のイイ感じのディレクトリ構成とは](https://qiita.com/shymst/items/de7ea5fc2594b8da5988)
* [Swift/iosで開発するドメイン駆動~DDD(風)なモダンなアーキテクチャ](https://qiita.com/ko2ic/items/6ac7321189e8c3ac1665)
* [AppRootControllerのご提案](https://speakerdeck.com/yimajo/approotcontrollerfalsegoti-an-jian-lue-shuo-ming-ban)

## Realm

* 公式マニュアル
    * https://realm.io/jp/docs/swift/latest/
* 公式ビューアー
    * [Realm Studio](https://realm.io/jp/products/realm-studio)
* シミュレーターで Realm を動かした場合の realm ファイル（DBの実体ファイル）の見つけ方

    ```bash
    $ find ~/Library/Developer/CoreSimulator/Devices -type f -name "*.realm"
    ```
AMP letter を読み解く

http://ampletter.org/?lang=ja

日本語訳があるので面倒臭がらずに読んだほうがいいです。

## 要約

AMPは無意識にユーザーがGoogleエコシステムに留まるようになっており、また検索結果に対してプレミアムな演出や優先順位を与えており、Webの中立性を破壊している、という指摘。

Googleが言うように、Webの速さが懸念ならば、AMPという技術の有無に関わらず特定の速度を満たせば今のAMPと同じような特典を与える、また明示的にGoogleのエコシステム内にいるという演出(おそらくヘッダーを付与するなど)を行う、といった提案。


## 私見

GoogleのWebの速さに対する懸念も、AMPの実装の邪悪さも、自分は両方よく分かる。

AMPは自分の仕事のドメインとしてチェックしているが、プラグインがGoogleのホワイトリストとして管理されていて、実際には政治力を使って、プラグインを登録させるといったアクションが必要になり、日本のような狭いマーケットの 3rd party なプラグインが登録されづらい。

また技術的にも AMP自体のドキュメントが足りず、AMP対応している会社は、Google のコンサルティングを受けて対応している会社が多そうに見えており、あまり良くない状況に見える。

外野の開発者からすると、GoogleはWebの為にやってるという表向きの立場も、「あわよくば」といった感が透けて見えるのも、どちらも読み取らないといけない。Webの為に、というのも vs Facebook, vs ネイティブアプリ 的なニュアンスがある。

## AMP を分解して本質を標準化してほしい

AMPの技術制約は、レンダリングのクリティカルパスなどのフロントエンド的なベストプラクティスとして面白いと思っていて、しかし、特定の技術に対応したサイトを特別扱いして高速化する、という政治的な層が挟まっているのが気持ち悪い。

個人的には、GoogleがAMPを特別扱いしてキャッシュを保存するのをやめて、エントリページとして何をプレロードするか、たとえば選択的に ServiecWorker や ResourceHint を検索画面表示時に起動して先読みする、といった解があるようにも思う。そうすれば体験としては同一になる。代わりにユーザー側のCPUに負荷が掛かるので、オプションで切れるようにする必要もあるが…

現在、 AMPからService Worker を起動する実装は既にあって、これもドメイン跨いでServiceWorkerを起動しているので特例的な感じなのだが、その辺をスペックとして定めてほしい、といった気持ちがある。

Google は今までも実験的なものを出して標準化し直すというフローを繰り返してきたので、今回もうまいこと落とし所を探ってほしいと思う。
機械学習論文読みメモ_114


[Adversarial Variational Optimization of Non-Differentiable Simulators](https://arxiv.org/abs/1707.07113)
シミュレーターは複雑の現象をサンプルするための手法として広く使われている。
一般的にシミュレーションのプロセスは、物理などの理論を元に高く正則化され、少ないパラメータでパラメタライズされたモデルに基いて観測が生成される。
そのためパラメータの理解可能性も高い。
しかしこのプロセスで得られる観測の分布は基本的にuntractableであり、従来likelihood-freeなapproximate bayesian computationなどの手法が用いられてきた。
一方でGANにおける最適化では微分可能なNNによる生成器が用いられ、adversarial objeciveに対する最適化が行われる。
本論ではGAN最適化におけるNNによる生成器を微分不可能なシミュレーターで置き換える。
そして提案分布を用いた変分上界を用いてadversarial objectiveを最適化する。
結果、シミュレーターが現実の観測と遜色なくなるようなシミュレーターのパラメータが学習される。

[Feedback Networks](https://arxiv.org/abs/1612.09508), CVPR2017
従来のCNNでは連続する特徴抽出とそれに続く決定を行う層によって成り立ってきた。
しかし、それとは別の逐次的な推論、つまり前回の推論結果をフィードバックする事で構築される特徴表現
を用いる事で推論を行う事も可能である。
この構造を用いた場合、まず高速な推論を得る事が可能になる。
そして推論は階層的な構造を持つようになる。
この構造はcurriculum learningと関係が深い。

[Learning Transferable Architectures for Scalable Image Recognition](https://arxiv.org/abs/1707.07012)
SOTAな画像分類モデルを作成するために、長い時間の構造探索やチューニングが必要になる事が多い。
本論ではこうしたeffortを減らすための手法としてNeural Architecture Searchを提案する。
この手法は小さなデータに対してネットワークのbuilding block構造を探索し、それがそのまま大規模データに
適用可能であるようにする。
そうする事でCIFAR-10などの比較的小さなデータで探索したbuilding blockに対して、それを積み重ねたモデルを用いてImageNetを学習したた頃SOTAを実現出来た。
letsencryptの証明書更新


さくらインターネットのVPS(Ubunt16)で `letsencrypt` の `renew` コマンドが失敗する問題が発生しています。
最新版(Ubuntu17)では修正されている不具合なのかもしれません（情報があまり見つかりませんでした）。遭遇したエラーは以下のようなもの。

```
$ sudo letsencrypt renew
Processing /etc/letsencrypt/renewal/places.lmlab.net.conf
2018-01-11 08:49:13,606:CRITICAL:letsencrypt.auth_handler:Client does not support any combination of challenges that will satisfy the CA.
2018-01-11 08:49:13,606:WARNING:letsencrypt.cli:Attempting to renew cert from /etc/letsencrypt/renewal/foobar.com.conf produced an unexpected error: Client does not support any combination of challenges that will satisfy the CA.. Skipping.
```

今回は、以下のコマンドで代用して証明書を更新しました。

```
sudo service apache2 stop
sudo letsencrypt certonly -d foobar.com --standalone
sudo service apache2 start
```

"Congratulations!" というメッセージが出たら更新成功です。
phpMyAdmin に ip によるアクセス制限をかける

CentOS 7.4 で確認しました。

phpMyAdmin のインストール

```bash
sudo yum install phpmyadmin -y
```

アクセス制限は
/etc/httpd/conf.d/phpMyAdmin.conf
で行ないます。

インストール直後は、localhost だけがアクセス可能です。
確認

```bash
curl http://localhost/phpMyAdmin/
```

ある特定の　アドレスを許可したい時、
例えば 153.203.107.102　を許可する例

```text
<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8

   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       Require ip 127.0.0.1
       Require ip 153.203.107.102
       Require ip ::1
     </RequireAny>
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from 153.203.107.102
     Allow from ::1
   </IfModule>
</Directory>
```

総てのIPからのアクセスを許可する例

```text
<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8

   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       Require ip 127.0.0.1
       Require ip ::1
       Require all granted
     </RequireAny>
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
     Allow from All
   </IfModule>
</Directory>
```

DHCP で　IP アドレスが変動する場合の設定
153.203.*.* からのアクセスを許可する例

```text
<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8

   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       Require ip 127.0.0.1
       Require ip 153.203.
       Require ip ::1
     </RequireAny>
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from 153.203.
     Allow from ::1
   </IfModule>
</Directory>
```
イーサリアムでのカスタムトークンの作成方法

#仮想通貨が一般的に認知されてきました。個人でもイーサリアムを使って独自トークンを発行できるそうなのでやってみました。

##参考にしたサイト
基本的に下記のサイトの「イーサリアム(Ethereum)で独自トークンを作る」通りで良いのですが、エラーになる場合があり、補足を追記します。
https://nandemo77.com/2017/10/20/make2ndbtc/

###注意点

####手順２の注意点
MyEterWalletは秘密鍵をサーバーに保存しないようです。ウオーレットを作成したら、keystoreファイルをPCに保存して、保存したkyestore/jsonfileをＰＣで指定してそこからウオーレットを開く。ログインの概念がないようです。
参考
http://www.tottemoyasashiibitcoin.net/entry/2016/10/23/132854

####手順５の注意点
・トークンを作る際にシンボル名（略称）が重複していると後から、MyEterWalletでトークンの追加ができなくなるので注意
例
TECはもうすでにあるのでだめ。TECCとかにする
・tokenfactoryにてトークンを作成する際、発行量は小数点以下の最小単位の通貨となってしまうので注意が必要。
例えば、小数点以下の桁数を８にして、発行量を１００００にしてしまうと、トークンを発行した際の全体の発行量が、0.001通貨になってしまうので注意。例えば下記のように、小数点以下の桁数を４にして、発行量を10,000,000,000にすると、発行量が1,000,000となり扱いやすくなる。

![toke作成.jpg](https://qiita-image-store.s3.amazonaws.com/0/188563/2afa8886-6664-a0c5-16f3-1af000d50b45.jpeg)
![etherscan結果.jpg](https://qiita-image-store.s3.amazonaws.com/0/188563/60e3ab50-0c76-54ce-f330-2130791408c2.jpeg)


####手順６の注意点
Cromeの拡張機能でインストールした、MetaMaskの起動は遅いので３分ほど待つこと。メタマスクからのETHの送信でエラーになる場合には、手数料を上げること。2018.1月時点では25gwel程度が良いと思う。

####手順８の注意点
contractアドレスはetherscanにあるcontract以降の文字列となる
また、https://tokenfactory.surge.sh/#/tokensearch
にcontractアドレスを貼り付けて送信しても、次の画面でコイン名が表示されないことがある。この場合は、etherscanで送信が完了しても数分（１０分程度）待ってから行う必要がある。

![transfer.png](https://qiita-image-store.s3.amazonaws.com/0/188563/d6fc2fb4-31ba-158f-d029-ba70f04f261f.png)



####手順１０の注意点
MyEterWallet でADD CUSTOM TOKENでトークンを追加した場合、CROMEではエラーになる。FIREFOXで行うと良い。
下記の画像のように、無事TECCトークンが追加されました。

![token追加.jpg](https://qiita-image-store.s3.amazonaws.com/0/188563/ae029efc-4530-e169-f6d5-ffa0d6a5c693.jpeg)
最高のモックアップツールかもしれないBootstrap Studio

## 1. モックアップツールって何使ってる？？
 2017年の11月くらいから、毎日コツコツと作っていたWebアプリケーションをなんとか完成しました　（色々あってリリースはまだしていません...）。Webアプリケーションを作り始めるときに、はじめに「設計」と「モック」を作りました。
### 世の中に出ているモックツールのまとめ
* https://navi.dropbox.jp/mockup-tool
* https://www.mockplus.com/blog/post/webux-10

色々と調べた結果「**Bootstrap Studio**」が良さそうだったので、有料版を購入してみましたが、とても良く、Qiitaにもあまり情報共有されていなかったので、使ってみた感想などを、まとめようと思います。
## 2. Bootstrap Studioについて
<img width="1273" alt="スクリーンショット 2018-01-10 22.20.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/c66eb7da-feb1-520a-a5ad-0d1697a4b360.png">
<img width="600" alt="スクリーンショット 2018-01-10 22.29.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/db1a0424-cc37-d8d9-41fb-81622b96dabb.png">

**Bootstrap Studio**
https://bootstrapstudio.io/

ざっくり概要を...
###良い点
* 25$ →  2,700円くらい
* bootstrapのcssフレームワークを使ってモックが作れる
* 基本的にはドラック&ドロップで編集
* CSSは直接変更可能
* 変更したモックを即時にブラウザで確認することができる
* 一生使うことができる（アップデートは1年間無料でできる！）
* **HTMLとCSSとJavascriptが自動で生成される**

###悪い点
* HTMLを直接編集できない
* 日本語入力がペーストでしか入力できない
* 英語版のみ
* かゆいとこまでは手が届かない
* Bootstrapっぽいアプリケーションになる
* 1ファイルのみ（index.html）しか生成できない。２ファイル作成する場合は別プロジェクト


良い点も悪い点もそれぞれありますが、Bootstrap Studioと他のモックツールと違うとこは、HTML、CSSが自動生成されるとこだと思います。ここが他のモックツールと違うところです。CSSも直接編集できます。編集したものをリアルタイムでブラウザで確認できるため、作業効率は上がりました。

## 3. Bootstrap studioデモ

### 【Bootstrap Studio 編集画面】
![Qiita投稿用_モック.jpg](https://qiita-image-store.s3.amazonaws.com/0/147291/e9a6ae98-68d8-42bf-2b08-7ae199be4a19.jpeg)

![Qiita_投稿用.jpg](https://qiita-image-store.s3.amazonaws.com/0/147291/ec99a410-17d5-801b-9748-808f201949d0.jpeg)
僕も全ては使いこなせていませんが、基本的に操作は難しくありません。

### 【エクスポートされた静的ファイル】
<img width="287" alt="スクリーンショット 2018-01-10 23.40.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/83208957-455c-aaa6-3c7d-a2ccb87dee24.png">
エクスポートを実行すると、以下の用にHTMLとCSSが生成されます。


## 4. 実際に作ったもの
### 【Bootstrap Studioで作った静的画面】
<img width="1266" alt="スクリーンショット 2018-01-11 8.13.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/94055c62-3345-b7f8-b4d3-707e397a19f7.png">

<img width="1272" alt="スクリーンショット 2018-01-11 8.16.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/0fb77451-4e20-6a18-553e-662c92df601c.png">


### 【JQueryで動的に生成された動的画面（本番）】
<img width="1263" alt="スクリーンショット 2018-01-11 7.57.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/649ebb17-177d-d34f-6fd9-4e4c26ffa71a.png">

<img width="1269" alt="スクリーンショット 2018-01-11 8.16.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/147291/ac25bc64-dd26-9e9d-9551-f3d8edd1bcde.png">

## 5.Bootstrap Studio最高！！
 チームでアプリケーションは組むのであれば、モックアップもデザイナーに発注できると思いますが、非デザイナーがWebアプリケーションをゼロから作るとき、モックを簡単に生成でき、尚且つHTMLとCSSが生成されるBootstrapはとても作業効率が上がる必須ツールだと思います。

　モックさえ出来上がれば、画面側はJavascriptのライブラリなどを使って、DOMを動的に編集する処理を書いていけばOKですね！ 2,700円という有料ですが、買い切りで一生使えるツールなので、非デザナーでアプリケーションを作ろうと思っている方にはぜひおすすめです！

 また同じようなツールでUIの設計と静的ファイルの生成が同時にできるツール等があれば共有していただきたいです:bow_tone2: よろしくお願いします。

**Bootstrap Studio**
https://bootstrapstudio.io/
getopt(GNU/Linux, BSD) かgetopts(bash builtin) かで迷わない、bash のオプション解析

# bash スクリプトでオプション解析を行う場合の悩み 
bash でスクリプトでオプション解析を行う時に、getopt(GNU/Linux, BSD) とgetopts(bash ビルトイン)を利用することができますが、以下のような悩みがあります。

* getopt
 * GNU/Linux 版とBSD 版で挙動が違う
 * GNU/Linux 版ではロングオプションが利用できるがBSD 版ではできない
 * GNU/Linux 版では引数(arg)のあとにオプションを置いても引数とオプションを分けて解析できるがBSD 版ではできない

* getopts
 * bash であれば、あらゆるOS 上で利用できる
 * ロングオプションは利用できない
 * 引数のあとにオプションを置いても引数とオプションを分けて解析できない

上記の内容を考慮して、bash で少し複雑なオプション解析を必要とするスクリプトを組む場合にはgetopt(GNU/Linux) を使用したいのですがそれを使用した場合、Mac 等のLinux 環境外では利用できず不便なものとなります。
であればbash 環境下であればあらゆるOS 上で使用できるgetopts を使用したいのですが、それではロングオプションへの対応や引数のあとにオプションを置いた場合に解析できない問題がつきまとってくることになります。

そこで、上記の問題を解決するためにbash 環境であれば共通的に利用できるgetopt(GNU/Linux) があればこの問題を解決できるのではないか！
ということでbash ビルトインとして、bash 環境であれば共通で使えるgetopts を使ってgetopt(GNU/Linux) を実現できるユーテリティを作成しました！という記事です。

# リポジトリ 
- getoptses
    - https://github.com/TsutomuNakamura/getoptses

※Bash 3 系では正しく動きません

# 使い方 
リポジトリのgetoptses.sh をロードしてgetoptses コマンド(getopt にses がついている)をgetopt(GNU/Linux) と同じように使用すれば良いだけです。
なお、getopt にはオプションが幾つかありますが、getoptses ではよく使われる`-o, --options` と`-l, --long` オプションのみを実装しています。


```console:gitcloneからgetoptsesのロード
$ git clone https://github.com/TsutomuNakamura/getoptses.git
$ cp getoptses/getoptses.sh /path/to/getoptses/
$ . /path/to/getoptses/getoptses.sh
```


もしくは直接getoptses.sh をロードすることもできます。


```console:curlでgetoptsesのロード
$ . <(curl -Sso- https://raw.githubusercontent.com/TsutomuNakamura/getoptses/master/getoptses.sh)
```


オプション解析のサンプルスクリプトは以下のようになります。


```bash:getoptsesサンプル
#!/bin/bash

function main() {
    . /path/to/getoptses/getoptses.sh

    local options
    options=$(getoptses -o "ab:" --longoptions "long-a,long-b:,lonb-c" -- "$@")
    if [[ "$?" -ne 0 ]]; then
        echo "Invalid option were specified" >&2
        return 1
    fi
    eval set -- "$options"

    while true; do
        case "$1" in
        -a | --long-a )
            echo "-a, --long-a"
            shift
            ;;
        -b | --long-b )
            echo "-b, --long-b: $2"
            shift 2
            ;;
        --long-c )
            echo "--long-c"
            shift
            ;;
        -- )
            shift
            break
            ;;
        * )
            echo "Internal error has occured" >&2
            return 1
            ;;
        esac
    done

    echo "args: $@"
    return 0
}

main "$@" || exit $?
```


# 参考 
- bash によるオプション解析
    - https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb

- Using getopts in bash shell script to get long and short command line options
    - https://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get-long-and-short-command-line-options
How to reset - Router, Switch, Firewall - パスワード忘れ、初期化その他-

# Cisco IOS機器の初期化関連

## Configuration Registerの確認

<pre>
 # show ver | inc Configuration
   Configuration register is 0x2102
</pre>

基本的には show ver で見るのだが、表示が一番最後なので
incで削ってしまった方が早い。

- confreg 0x2142 -- startup-config 無視で起動
- confreg 0x2102 -- 通常起動

## 変更したい場合
<pre>
 #conf t
 (config)# config-register 0x2102 
</pre>
[xcode]ビルド時にThread 1: breakpoint 1.1と表示された時の対処法

最近xcodeでswiftの開発を始めました。せっかく新しい技術に触れるので今日からちょこちょこ忘備録的に更新していきたいと思ったので書いていきたいと思います。


さて表題について、xcode、swiftでサンプルアプリの開発中にシュミレーターをrunさせたら次のようなエラーが出たので調べてみました。

``『Thread1: breakpoint1.0』``

今まで主にlaravelやjavaの開発をしていましたが、大体のことはエラーの内容を読めば原因が書いてあるのでわりと対処しやすかったがxcode開発初めてのエラーは「ん？何これ？どこ直せばいいの？」ってのが正直な感想。

だけど調べたら原因は単純だった。

これはbreakpointで止まったという通知らしくコードを間違えてるわけではないらしい。どこかで操作を誤って知らない間にbreakpointを作ってしまっているようだ。

対処法は単純で右クリックで***[Delete Breakpoint]***で誤って作ってしまったbreakpointを削除。

そして再度runするとちゃんとビルドされ思ったように動いてくれました。

内容的にはわざわざ記事にするほどでもないような簡単なエラーでしたが、とりあえずどんどん投稿上げていきたいので一応書いてみました。