OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelでスパム対策したのでメモ

##仕組み
スパムボットはフォーム内のすべての項目に自動的に入力していくことが多いので
表から見えない「非表示の項目」をつくり、そこに入力されている場合はスパムと判断し404にとばす処理をする。

##ビュー

非表示の項目を作成

```php

{{Form::text('honeypot','',['style'=>'display:none'])}}
```

##コントローラー

リクエスト「honeypot」の中に値が入ってたら代入。

```php

if(isset($request->honeypot)) {
    $contacts->honeypot = $request->honeypot;
}
```
ログ残すなら

```php
Log::info($contacts);//個人情報含む場合、暗号化が必要
```
[暗号化して複合する記事書いてるのでよかったら](https://qiita.com/kusano00/items/3a31a0455e86122efd32)

検知したら404にとばす

```php
if(isset($contacts->honeypot)){
    abort(404);
}
```

##最後に
今回は簡単な除外対策でしたが、
もう少し凝ると、$_SERVER[‘REMOTE_ADDR’]でリクエストIP取得して、特定のアクセスは拒否する。とか
更に凝ると、画像認証（CAPTCHA認証）の実装とか
色々な対策あって勉強になった。
ExcelにおけるUnique関数に準ずる実現方法(旧来の関数による重複除去方法)

Office Insiderで使えるそうだけど、MS製品をどうも信頼できず
これで利用できるようになったとて、Excelオンラインで使えるのか？ 社内アカウントが
デフォで使えるようになるのか調査も大変で辟易してましたが、このようなやり方がありました。

メモ書き程度に書くので参考にしてください

```:excel
A2: 任意の重複した値（処理対象）
B2: =IF(COUNTIF(A$2:A2,A2)=1,ROW(),"")
C2: =@IF(COUNT(B:B)<ROW(A1),"",INDEX(A:A,SMALL(B:B,ROW(A1))))
```

![2019-12-25_16h02_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51918/c6bb477f-3ec7-4bf8-0f70-6658db5d59c0.png)
JavaScriptの真偽判定メモ


もう随分プログラミングしているはずだが未だにJSの真偽判定すらおぼつかないのでメモ。

* falseになる方が少ない（決まってる）のでそれを覚えた方がいいかも。
* 0はもちろんundefined, null, NaN, ''などがfalseになる。''はfalseとなる。
* [],{}とかはtrueになる。真偽で利用するときは[].lengthのようにする。{}は、Object.keys({}).lengthとする。

```js
//真偽check関数
check = (x) => {
    if (x) {
        console.log(true);
    } else {
        console.log(false);
    }
}

//undefined
let x;
console.log(x);
check(x);

//0
x = 0;
console.log(x);
check(x);

//null
x = null;
console.log(x);
check(x);

//''
x = '';
console.log(x);
check(x);

//NaN
x = NaN;
console.log(x);
check(x);

//1
x = 1;
console.log(x);
check(x);

//-1
x = -1;
console.log(x);
check(x);

//[]
x = [];
console.log(x);
check(x);

//[].length
x = [];
console.log(x.length);
check(x.length);

//{}
x = {};
console.log(x);
check(x);

//{}.length（ないけど）
x = {};
console.log(Object.keys(x).length);
check(Object.keys(x).length);

```

いちおう結果。

```bash
undefined
false

0
false

null
false


false

NaN
false

1
true

-1
true

[]
true

0
false

{}
true

0
false
```
SCSSの記述をすっきりさせる方法　〜mixin(共通レイアウトをまとめる)〜

# mixinで共通レイアウトをまとめる

```scss:styles.scss
.side-header{
  display:flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

.main-header{
  display:flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
```

上記のように同じレイアウトのクラスがあった場合に@mixinでレイアウトをまとめるとscssの記述がすっきりします。

```scss:_mixin.scss
@mixin verticality_centering {
    display:flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
}
```

```scss:styles.scss
@import "mixin.scss"

.side-header{
  @include verticality_centering;
}

.main-header{
  @include verticality_centering;
}
```

@mixin 変数名{レイアウト}で定義して、@include変数名で使用できます。

また引数を渡すこともでき、

```scss:mixin.scss
@mixin flex_style($value) {
    display: flex;
    justify-content: $value;
}
```

```scss:styles.scss
@import "mixin.scss"

.side-header{
  @include flex_style(space-between);
}
```

このような使い方もできます。
【Laravel】多対多のリレーション（構造、定義）



###多対多の関係とは
テーブルのデータが互いに他方のテーブルの多数と結びついている関係。

例えば
SNSの「いいね」のように多数のユーザと多数のツイートを結びつけるような機能の場合。

![いいね機能 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502145/a2d5ef78-f6c7-f85e-6049-73b5fb27ef27.png)

ユーザは複数のツイートに「いいね」できる。
ツイートは複数のユーザから「いいね」を受けられる。

2つのテーブルだけではこのような多対多の関係性を表すことはできない。

###中間テーブル

両テーブルの関係性を羅列した中間テーブルを設け、中間テーブルと2つのテーブルそれぞれで一対多の関係を結びつけることにより、中間テーブルを介した多対多の関係とする。

<img width="350" alt="favorite.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502145/8a5ff213-6fc3-92f9-1a79-9881e8d7eaac.png">

usersテーブル、tweetsテーブルそれぞれがfavoritesテーブル（中間テーブル）に一対多で結びつく。

先ほどの関係は下のように表せる。

|user_id|tweet_id|
|:------:|:--------:|
|1|1|
|1|2|
|2|2|
|2|3|

ユーザテーブルとツイートテーブルはfavoritesテーブルを介して互いのidを知ることができるようになる。

###マイグレーションで外部キーの設定する
favoritesテーブル（中間テーブル）ではuserとtweetのidを参照するためそれらの外部キーを設定する。

```php
public function up()
{
  Schema::create('favorites', function (Blueprint $table) {
    $table->unsignedInteger('user_id');
    $table->unsignedInteger('tweet_id');
    $table->primary(['user_id','tweet_id']);

    // 外部キー制約
    $table->foreign('user_id')->references('id')->on('courses')->onDelete('cascade');
    $table->foreign('tweet_id')->references('id')->on('students')->onDelete('cascade');
 });
}
```

###モデルでリレーションを定義する

リレーションメソッドをbelongsToMany()で定義。メソッド名は複数形となる。

```php:User.php

class User extend Model
{
   public function tweets()
   {
     return $this->belongsToMany(Tweet::class);
   }
}
```

```php:Tweet.php

class User extend Model
{
   public function users()
   {
     return $this->belongsToMany(User::class);
   }
}
```
これで関係の定義はできたと思います。

多対多の紐づけの操作（中間テーブルへのinsert、deleteの操作）、attach(),detach()については違う記事でまとめています。
[多対多のリレーション(紐づけ操作について)](https://qiita.com/rope19181/items/ad9ea09f853f52d7bc83)
【Laravel】サービスプロバイダ

#サービスプロバイダとは
サービスを提供するための仕組みです。
サービスプロバイダのクラスは下記のように定義されています。

```php:app/providers/サービスプロバイダ
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;


class プロバイダクラス名 extends ServiceProvider
{
    public function register()
    {
        //登録時に実行される処理
    }

    public function boot()
    {
        //アプリケーションの起動時に実行される処理
    }
}

```

`register`メソッドは登録時に処理される関数です。
`boot`メソッドはアプリケーションを起動した時に実行される処理です。

作成から利用するための登録までの概要を説明します。
#サービスプロバイダ作成
下記のコマンドでサービスプロバイダを作成します

```:ターミナル
php artisan make:provider RiakServiceProvider
```

上記のコマンドで作成されたファイルが下記のようになります。

```php:app/providers/RiakServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class RiakServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

```

`register`、`boot`内にそれぞれ必要な処理を記述してください

#プロバイダの登録
上記で編集したサービスプロバイダを利用するためには登録する必要があります。
登録するために`config/app.php`を編集します。

```php:config/app.php
'providers' => [
    // Other Service Providers

    App\Providers\RiakServiceProvider::class,
],
```

下記のように追記してください。

以上で、サービスプロバイダの使い方の概要になります。

**疑問、気になるところがございましたら、質問、コメントよろしくお願いします！！！**
囲碁AI Leela Zero/Liziee を MacBook で使う --cpu-only

囲碁AIの [Leela Zero](https://github.com/leela-zero/leela-zero) を MacBook Air にインストールしたらうまくいかなかった話。--cpu-only で起動するのがコツです。

## 問題

1. 一手、二手は動いているようだけどすぐに勝率が 1300万% になったりする
2. 候補手がめちゃくちゃになって、数手で候補手も表示されなくなる

<img width="1098" alt="Screen Shot 2019-12-24 at 16.55.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63210/3a9b2118-82c8-776a-19fb-b2e08aa01774.png">


## 解決策

GPU を使わない `--cpu-only` オプションで起動する。`Lizzie/config.txt` のエンジンコマンドに `--cpu-only` を追加します。

## 手順

### 1. 前提

ターミナルでコマンドを打つこと、[Homebrew](https://brew.sh/index_ja) は既知とします。[政光順二先生のページ](http://go-w.jp/?p=1637) が丁寧です。

### 2. Leela Zero をインストール

これが囲碁AIの本体です。ソースコードからコンパイルしても難しくありませんが、homebrew からインストールできます。

```bash
$ brew install leela-zero
```

これでインストールされます。確認してみましょう:

```bash
$ leelaz
A network weights file is required to use the program.
By default, Leela Zero looks for it in /Users/junkoda/.local/share/leela-zero/best-network.
```

ネットワークとかウェイトと呼ばれるのは自己対戦で鍛えられたデータです。それがないよというエラーですが、Lizzie に付属しているので、とりあえずそれを使います。

どこにインストールされたかも確認しておきます:



### 3. Lizzie をインストール

#### 3.1 Java SDK をインストール

Homebrew からも 「Java」 はインストールできますが、それは Open JDK で、Liziee の公式 `README.txt` によると、Open JDK では問題が起こることがあるので公式 JDK が奨励らしいです。Oracle のサイトから `jdk-13.0.1_osx-x64_bin.dmg` をダウンロードしてきてインストールしました。

#### 3.2 Lizzie をダウンロード

Lizzie は Leela Zero の思考を可視化してくれるインターフェースです。棋譜 SGF ファイルを開いて検討したりできます。

Lizzie の GitHub にいきます。

https://github.com/featurecat/lizzie/releases/

執筆時の最新バージョンは 0.7.2 でした。`Lizzie.0.7.2.Mac-Linux.zip` をダウンロードして、ダブルクリックで解凍すると `Lizzie` というフォルダができます。


#### 3.3 Lizzie の設定ファイルを編集

`Lizzie/config.txt` をエディタで開きます。`engine-command` というところを

```bash
 "engine-command": "/usr/local/bin/leelaz --cpu-only --gtp --lagbuffer 0 --weights network.gz",
```

のようにして上書き保存します。

変更点 1: `./leelaz` から、homebrew がインストールした場所 `/usr/local/bin/leelaz` に変更。

Leela Zero がどこにあるかは which コマンドで確認できます。

```bash
$ which leelaz
/usr/local/bin/leelaz
```

変更点 2: `--cpu-only` を追加します。これが重要。これがないと、バグりました。

### 4. いざ実行

`config.txt` と同じ `Lizzie/` にある `lizzie.jar` をダブルクリックします。「Appstore からダウンロードしていない野良ソフトは起動できません」と言われるので MacOS のシステム設定 → セキュリティ＆プライバシィ から「かまわず実行」します（初回だけ）。`Engine is loading...` としばらく表示され、初回は特に長いかもしれませんが、5分はかからないはずです。学習データは付属しているので問題はないはずですが、学習データがなかったりすると無限に loading になることもあります。

マウス（トラックパッド）でポチポチ打ってみましょう。

<img width="762" alt="Screen Shot 2019-12-25 at 07.50.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63210/c0561b6a-48bb-227c-9c70-8cb73f66ef09.png">

真っ当な候補と勝率が表示される 😂



### 付録: 最新の学習ファイルを配置

Lizzie には学習データが付属していますが、Leela Zero は日々自己対戦を続け進化しているので、最新の学習データを手に入れることもできます。ここではとりあえず起動することを優先して割愛しました。

どの学習データを使うかは `Lizzie/config.txt` 内の `--weights=network.gz` で指定できます。既存の network.gz を上書きするのもアリです。

https://zero.sjeng.org をみると日々学習データが更新されています。
https://zero.sjeng.org/best-network が最新データでしょうか。


### 変更
2019-12-25: 最初は CPU_ONLY でコンパイルする方法を書いたのですが、`--cpu-only` で起動する方法に変更しました。CPU_ONLY でソースコードからコンパイルする方法は American Go Association (AGA) から http://www.aghs.cc/tutorials/leela/leela.php
VirtualBoxの設定

バージョンに64-bit版が表示されない

原因
BIOSの仮想化機能が有効になっていなかった
　
解決方法

　
　[BIOS設定メニューを表示]を選択後，[Advanced]タブの[Intel(R) Virtualization Technology]の設定を[Enable]に変更
　[Exit]タブの[Exit Setup]を選択すると，[Setup Confirmation Save configuration changes and exit now?]と表示されるので[Yes]を押下して，パソコンを起動


再起動すると再びインストール画面になってしまいログイン画面にならない

原因
ISOファイルが仮想マシン上に入れっぱなしになっている
　
解決方法
　CentOSのインストール後，[仮想マシンの電源をオフ]を選んで仮想マシンを閉じる
　[設定]>[ストレージ]>[コントローラ：IDE]に設定されているISOファイルを右クリック，[割り当てを除去]を押下
ソフトウェアエンジニアの市場価値は高まっている

この記事は [CodeChrysalis Advent Calendar 2019](https://qiita.com/advent-calendar/2019/codechrysalis) の記事です。

# はじめに

Code Chrysalis の共同代表である[古久保俊嗣](https://www.codechrysalis.io/team)さんが書いてくれたブログを代わりに投稿します。

# 内容

世界中でのソフトウェアエンジニアの需要急増は言うまでもないが、米国の大学・学部別の収入比較からも面白い傾向が見られる。

![incomegap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141607/f417dd8e-2ced-de14-ca0b-4664cd83bb51.png)

横軸は合格率（入学難関度が右に行くほど高い）で縦軸は卒業1年後の収入である。

## コンピューターサイエンス系の収入の増加

やはり難関大卒業生の収入がどの学部でも高くなっているが、コンピュータサイエンス系の収入が圧倒的に高くなっている。さらに注目すべきは、コンピュータサイエンス系で、大学ではなく個人のバラツキが大きくなっている点だ。難関大に入学できなくても、入学後の努力によって追いつき追い越すチャンスがはっきりと確認できる。

## コンピューターサイエンスは下剋上のチャンスがある

一方で、ビジネス系では大学ブランドによる固定化が際立っており、人文・教養系では収入が低く大学差もあまりない。これは卒業1年後の傾向に過ぎないが、その後の社会人教育とOJTでの研鑽を考え合わせると、コンピュータサイエンスの分野では、大学のブランドの意味はほとんどなくなっているとも言えるだろう。

ソフトウェアエンジニアの皆さんはどう考えるだろうか？勝負はまさにこれから始まろうとしているのだ。
SCSSの記述をすっきりさせる方法　〜値の変数化〜

# 値の変数化

例えば

```scss

.submit-btn{
  color:#fff;
}

.send-btn{
  color:#fff;
}
```

のようにプロパティの値が同じ物があった場合に$変数名:値;とすることで値を変数化できる。

```scss

$btn-color:#fff;

.submit-btn{
  color:$btn-color;
}

.send-btn{
  color:$btn-color;
}
```

このように共通のプロパティを変数化することで今回の例で言えば、ボタンの色をまとめて管理することができるので
色の変更をまとめて行いたい場合にまとめて変数の値を変更するだけでまとめて変更することができます。

また変数の値をcalcを使って他の変数を用いて値を指定することもでき

```scss
//変数を使わない場合

.header{
  height:100px;
}

.main{
  height:calc(100vh - (100px - 90px);
}

.footer{
  height:90px;
}

//変数を使った場合

$header-height:100px;
$footer-height:90px;
$main-height:calc(100vh - (#{header-height} + #{footer-height:90px;}));

.header{
  height:$header-height;
}

.main{
  height:$main-height;
}

.footer{
  height:$footer-height;
}
```

とこんな風にも使える。どこか１箇所だけを変更して他も合わせるとなると変数を用いない場合変更箇所が多いが、
変数を用いることで変更箇所を最低限に抑えることができます。

こう言った変数を外部ファイルにまとめて、使う時は

```scss

@import "ディレクトリ/ファイル名"；
```
で使うscssファイルにインポートすることを忘れないように気をつけましょう。
Kotlinの開発環境構築とJavaからKotlinに移行する時のメモ

JavaからKotlinにシステム開発をシフトしていこうと思い、色々と調べた時のメモを残していこうと思います。
自分はサーバサイド寄りの人間でして、Kotlinのサーバ寄りの内容をまとめています。

# Kotlin（読み方「コトリン」）とは
Kotlinは、Javaの統合開発環境であるIntelliJ IDEAで有名なJetBrainsが開発したオブジェクト指向プログラミング言語です。言語構文自体はJavaとは互換性がない独自方式ですが、コンパイルされたコードはJava VM（仮想マシン）上で動作するため、**これまでのJava資産の多くを流用できる**という特徴を持っています。

「これまでのJava資産の多くを流用できるこれまでのJava資産の多くを流用できる」という点について、いままで、Javaを使ってきた人からすると過去の資産も流用できたり、環境も共存できるので、これからKotlinに移行していこうって思いになりました。

# 開発環境構築について
KotlinはIntelliJを使うのが主流的な流れになっていますが、自分はEclipse派なので、Eclipseを中心に開発環境を構築していきます。その時の参考になったサイトがこちらで、マーケットプライスでインストールできちゃうので、思ったより簡単でした。

* [eclipseでkotlinを使えるようにやってみた](
https://howcang.com/2019/06/12/%E3%80%90%E8%B6%85%E7%B0%A1%E5%8D%98%E3%80%91eclipse%E3%81%A7kotlin%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%EF%BC%88win10%EF%BC%89/)

# コーディングについて
コーディングについては、リファレンス等をみて最低限はおぼえないとだめですね。。。

* [Kotlinリファレンス]
(https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/)
* [Kotlin : as, !, ? 周りのチートシート](http://increment.hatenablog.com/entry/2015/10/31/090743)

# プロジェクトの作り方について
Spring bootのプロジェクトについては、Kotlinは対応していて、プロジェクトの作成時にkotlinが選択できます。

* [Spring Tool Suite and Kotlin](https://docs.spring.io/sts/nan/v373/SpringToolSuiteAndKotlin.html) ※英語

※後で翻訳記事でも書こうかな。

普通のプロジェクトについても簡単に作成できます。

* [Eclipse で Kotlin プロジェクトが作れるようにした](https://qiita.com/shinyay/items/6a3501da60e36d62414d)

ただし、MavenのKotlinプロジェクトはいろいろと苦戦します。

* [MavenでJavaとKotlinのプロジェクトを作成する](https://www.codeflow.site/ja/article/kotlin-maven-java-project)

もう少しまとめたやつが欲しいな。

# Javaからの移行について
こちらの参考にしたサイトはIntelliJやんけって思いますが、JavaからKotlinへの自動変換機能についても、Eclipse版にも存在しています。
Javaからの移行は最初この機能で変換を行い、細かい部分もKotlinにしていく方法が大変便利かと思います。

* [JavaからKotlinに変換する7つのテクニック Kotlinらしさを生かした簡潔なコードに置き換えよう]
(https://employment.en-japan.com/engineerhub/entry/2019/05/14/103000)
* [Javaで書かれたSpring BootプロジェクトをKotlin対応した話](https://qiita.com/Yuki10/items/3dd563b76dceebbe154b)
* [Lombok - delombok](https://blog.y-yuki.net/entry/2016/11/15/000000)

Lombokを利用している場合は、コンパイルでエラーになるので、こちらが原因みたいです。

# まとめ
とりあえず、JavaからKotlinに移行の参考サイトをまとめてみましたが、もう少しわかりやすい全体の流れが欲しいな。
お疲れ様でした

# ライフハックとしてのアドベントカレンダー

今回一人アドベントカレンダーに挑戦して、自分の考えてることややりたいことの、ガベージコレクションというかデフラグというかにちょうどいいなと思いました。
なんにせよ明確な締め切りがあるので、動いたら書くくらいの勢いでできたことで、やろうやろうと思っていたことなどにひとまず手を付けることができました。

来年も心に余裕があれば、やっていきたいと思います。

# 今回新しく取り組んだことについて

AWS EMRでのSparkと、ROSについては、今回のアドベントカレンダーを機にゼロから手を付けてみたものです。これまで、どちらも存在は知っていましたが、自分で動かしたことがなかったので、よい勉強になりました。

# 今後

もろもろ不完全燃焼感はありますが、とっかかりを作れたということで、引き続きOrthoverseの完成に向けて試行錯誤していきたいです。

また、2/29-3/1に池袋サンシャインシティで開催される技術書典に当選したので、今回アドベントカレンダーに書いた内容をブラッシュアップして一冊の本にして出したいと思います。よろしくお願いします。

お疲れ様でした。

2020/01/06　追記
家庭の事情で技術書典参加が難しくなりました。
Orthoverse　ARクラウド？ミラーワールド？あるいはデジタルツイン？

# 本アドベントカレンダーについて

今回のアドベントカレンダーの一連のエントリーは、すべて、あるAR/MRシステムを構成するための要素技術となると私が考えているものです。
本エントリーでは、そのことについて説明します。

# ARクラウド？ミラーワールド？デジタルツイン？

皆さんはSFって読みますか？
個人的に、最近面白いと思ったVRが出てくるSFは、[「ゼンデギ」](https://www.amazon.co.jp/dp/B010COOELY/)と、[「雲南省スー族におけるＶＲ技術の使用例」](https://www.amazon.co.jp/dp/B07FQQXV42/)あたりですかね。あと、[「七人のイヴ」](https://www.amazon.co.jp/dp/B07DXRMPHN/)では、AR端末的なのが舞台装置として登場しました。
ところで、XR界隈で、[「スノウ・クラッシュ」](https://www.amazon.co.jp/dp/4150113513/)が話題になっていましたが、Metaverse、自分で作ろうと思いませんか？
あるいは、電脳コイルのあれを現代の技術でどこまでできるか興味ありませんか？
あの、電脳空間的なのですが、ARクラウドとか、ミラーワールドとか、デジタルツインとか、ちょっとずつ違うものをみんなそれぞれの名前で呼んでいますが、あのサイバー空間を自分の手で作る挑戦って面白いと思いませんか？

本アドベントカレンダーで、検証・研究した要素技術は、このAR空間的なのを作るために使えるんじゃないかなと私が考えているコンポーネント群になります。

もちろん、今回時間不足技術不足で触れられなかったものもたくさんあります。
Visual Positioning Systemとか、ポイントクラウドとか、（V)SLAMとか、画像特徴点とそのマッチングなどとか。
位置情報とインターネットアドレスを紐付ける仕組みもちゃんと作りたかったし、オクルージョン用のベースデータとなる地物のデータも全世界の分を作って配信システムとキャッシュシステムも作りたかったですね。
端末からの周辺環境のフィードバックと集積・分析と、アップデートシステムも考えたかったし、
簡単にオブジェクトを任意の場所に置けるエディタなども検討の余地があります。
UI/UXなんてのは、真面目に取り組まないといけないけど知識不足で追いつけてない部分でもあります。
この仕組みを使えば、こういうサービスができるとか、そういう話もしたかったですね。

結局今回は、要素ごとにつまみ食いして統合していくことができずに12月が終わってしまいましたが、引き続き研究していきたいと思います。

そして現実に重畳されたインターネットとつながる電脳空間の基礎となるオープンプラットフォームを作ることが、Project Orthoverseの目的です。

# Orthoverse?

Metaverseよりも現実に近いVerseです。
OrthoがなんでMetaより近いかは有機化学を調べてみてください。ベンゼン環あたりで出てくると思います。
AR/MRにより、現実に重畳された電脳空間を作りたいんです。
電脳コイルみたいなあれを作りたいんです。
「セカイカメラ」[^1]みたい？まぁ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/930d9dc9-4fae-bf62-adf9-84be252214a5.png)

今回のアドベントカレンダーでは、Orthoverseの基盤になると考えられる、以下の項目

- 基盤となる地図情報を世界規模で作成してUnityに持っていくこと
- そのデータを表示してのオクルージョンのテスト
- 正確な位置情報を取得する方法
- マークアップ言語を使ってWebページと同じような方法論で3Dオブジェクトを表示すること
- 現実世界とコンテンツの紐付けのための位置情報インデックスとQRコード
- 3Dオブジェクトのエディタ

について扱ってみました。

以上、最後にエモい話でした。

[^1]: セカイカメラは非常に先進的だったと思います。当時は結構楽しませていただきました。
SpaceもしくはEnterの時にアラート！！ ❏Vue.js❏

今回はSpaceやEnterを押した時にアラートを出します。

[![Screenshot from Gyazo](https://gyazo.com/916c0340e3762a312868ebc8ed834dd6/raw)](https://gyazo.com/916c0340e3762a312868ebc8ed834dd6)

開発環境はJSFiddle
https://qiita.com/ITmanbow/items/9ae48d37aa5b847f1b3b

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<div id="app">
  <input type="text" @keyup.space.enter="myAlert">
</div>
```

```javascript:javascript
new Vue({
  el: "#app",
  data: {
    x: 0,
    y: 0
  },
  methods: {
    myAlert() {
      alert("アラート！");
    }
  }
})
```

【解説】
`keyup`: いずれかのキーを押して離した時
`.space`: Spaceキーを押した時
`.enter`: Enterキーを押した時

以上を組み合わせると、SpaceもしくはEnterが押された時にアラートが表示されます。

<br>
ではまた！
jq + bash (zsh) でリストっぽいデータを処理する

配列っぽいデータが含まれるJSONデータをjqコマンドとシェルを組み合わせて処理する方法.

こういう感じのJSONデータ (states.json) があるとして.

```json
{
  "states": [
    {
      "name": "北海道",
      "name_ac": "ほっかいどう"
    },
    {
      "name": "青森",
      "name_ac": "あおもり"
    },
    {
      "name": "岩手",
      "name_ac": "いわて"
    },
    {
      "name": "宮城",
      "name_ac": "みやぎ"
    },
    {
      "name": "秋田",
      "name_ac": "あきた"
    },
    {
      "name": "山形",
      "name_ac": "やまがた"
    },
    {
      "name": "福島",
      "name_ac": "ふくしま"
    }
  ]
}
```

こんな感じで出力させるものとする.

```plaintext
北海道 ほっかいどう
青森 あおもり
岩手 いわて
宮城 みやぎ
秋田 あきた
山形 やまがた
福島 ふくしま
```

# 整形して出力

単にJSONを見やすく整形出力したいなら, これだけ.

```shell
jq '.' < states.json
```

# JSONのなかの特定のプロパティにアクセスする

プロパティ名を指定すればよい.

```shell
jq '.states' < states.json
```

次の結果が得られる.

```plaintext
[
  {
    "name": "北海道",
    "name_ac": "ほっかいどう"
  },
  {
    "name": "青森",
    "name_ac": "あおもり"
  },
  {
    "name": "岩手",
    "name_ac": "いわて"
  },
  {
    "name": "宮城",
    "name_ac": "みやぎ"
  },
  {
    "name": "秋田",
    "name_ac": "あきた"
  },
  {
    "name": "山形",
    "name_ac": "やまがた"
  },
  {
    "name": "福島",
    "name_ac": "ふくしま"
  }
]
```


# シーケンシャルに処理できるようにする

配列などのデータを扱うなら, for/while で処理できたほうがいい.
jqの機能 length と seqコマンドを組み合わせる例を見かけることがあるけど, 個人的にはwhileを好む.

```shell
jq -c '.states[]' < states.json
```

`-c` オプションで, 出力されるJSONを1行にできる.
フィルタ (ここまであげた例でいうシングルクォートでくくってる箇所) で指定してるプロパティに `[]` をつけると,
1アイテムを1行ずつ出力してくれる.

```plaintext
{"name":"北海道","name_ac":"ほっかいどう"}
{"name":"青森","name_ac":"あおもり"}
{"name":"岩手","name_ac":"いわて"}
{"name":"宮城","name_ac":"みやぎ"}
{"name":"秋田","name_ac":"あきた"}
{"name":"山形","name_ac":"やまがた"}
{"name":"福島","name_ac":"ふくしま"}
```

# whileループで処理する

ここまでできると, パイプと `while read` とさらにjqコマンドを組み合わせることで,
各アイテムごとのプロパティにアクセスできるようになる.

```shell

jq -c '.states[]' < states.json | \
    while read state; do
        jq -r '[.name, .name_ac] | @tsv' <<< $state | (
            read name name_ac
            echo $name $name_ac
        )
    done
```

`-r` オプションでダブルクォートでくくるのをなしにしている.
フィルタでは `[.name, .name_ac]` でリストっぽい出力にし, jqの組み込み機能でtsv (タブ区切りのシーケンス) に変換し, readコマンドで変数へセットしてる.

readで各アイテムを読みだした後, 変数へセットするところは, 素直に次のように書いてもいいと思う.
(jqコマンドの呼び出しは少なくできるけど, 値にスペースが含まれてることを考えると, このほうが使いやすいかも)

```shell
jq -c '.states[]' < states.json | \
    while read state; do
        name=$(jq -r '.name' <<< $state)
        name_ac=$(jq -r '.name_ac' <<< $state)
        echo $name $name_ac
    done
```

# パイプとプロパティ名による組み合わせでも, 同等の結果を得られる (1/6 追記)

コメントいただきました.
これでも同じ結果を得られます.

```shell
$ jq -r -c '.states[] | "\(.name) \(.name_ac)"' < states.json
```

パイプした先でプロパティ名でアクセスする感じすな.
こっちのほうがかんたんだー.
FXについて簡単に記載してみる

FX投資とプラグラムは関係性が見えないかもしれませんが、FX取引ソフトであるmt4(メタトレーダー4)上で起動＆運用することができる自動売買ソフト「EA」を活用することでプログラム知識があると非常に高度な取引ツールをご自身で構築することができます。

（※EAについて詳しくは⇒[FX会社「ゴールデンウェイ・ジャパン」：EA（自動売買）とは](https://www.fxtrade.co.jp/mt4/ea)）

またFX取引では相場の分析や解析が必要不可欠であり、プログラミングに慣れている方に向いた取引となっています。

ここではそんなFXについての簡単な解説やリスク、正しい取引についてなどを解説します。

##FXとは？
FXとは外国の通貨を売買して、利益を出す取引のことです。例えば「1ドル＝100円」のときに10万円で1,000ドル買います。

円安で「1ドル＝110円」になったら、手持ちの1,000ドルは11万円に交換できるので、1万円得をします。

逆に円高で「1ドル＝90円」になったら、手持ちの1,000ドルは9万円になり、1万円損をします。

![fx-toha-c2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556832/2cad42f7-4711-4f2b-e761-c508fed95881.png)

このように異なる2国間の通貨を取引して、為替レートの差額が利益になる仕組みがFXです。各通貨の値動きを予測して運用するので、現在のように値動きが激しいときはチャンスになります。

また、正確にはFXは「margin Foreign eXchange trading」の略であり「外国為替証拠金取引」を意味します。証券会社に証拠金を預けて、それ以上の大きな金額の外国為替を取引できます。


##外貨を買うだけ？スワップポイントで利益を狙う
![column-7-c3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556832/7460586f-0f1a-ef9f-d9cd-2076c37ad99e.png)


2019年12月現在、日本の政策金利が0.1％でトルコが12.0％です。

FX会社ではこの金利差に応じたスワップポイントと言う値を設定しており、この数値がプラスなら毎日値に応じた収入を得ることができます。

ただし、逆に値がマイナスの時は支払い義務が生じます。

基本的に金利が低い国の通貨で高い国の通貨を買うとプラス、逆だとマイナスになります。

先ほどの例の日本とトルコの場合、二国間の金利差は「12.0％－0.1％＝11.9％」と非常に大きく、とても高いスワップポイントがFX会社で設定されていることが多いです。

FXの基本は為替変動による差益を狙うのが基本ですが、長期運用目的として低金利の日本円で外貨を購入＆保持し続ける方も多いです。

上記の例では1万通貨購入＆保持し続ける事で2万円以上のスワップポイント益を得る場合もあります。

ただしこの方法には注意が必要です。

スワップポイントで利益を得たとしても、為替変動により含み益が発生、その額がスワップポイント益を上回ってしまえば運用はマイナスになってしまいます。

特に政策金利が大きな国の通貨は変動しやすいので、長期運用を行う時も常に為替の変動を注視しておくようにしましょう。


##少額でも運用が始められるのがFXの魅力であり、リスクです
![column-7-c4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556832/7d2aab15-2b07-ca5c-6802-32214b694cea.png)

FXでは「レバレッジ」と呼ばれる少しのお金で大きなお金を動かせる方法を採っています。

レバレッジは資金を担保にして、その25倍までの金額の取引が行える仕組みです。

例えば、50万円を証拠金としてFX会社に預け、レバレッジを20倍にして、1,000万円分の外貨を取引することもできます。

その金額で米ドル/円が10円変動すると、±100万円の損益が発生し、その利益や損失だけが自分の口座に残るわけです。

レバレッジを高くすると、自分の持ち金よりも大きなトレードができるのでハイリターンハイリスクになります。そのため、FXの初心者は1～5倍くらいで様子を見ることをおすすめします。

レバレッジはリスクが増えるのではなく、有効な仕組みです。始めは小額でトレードをして、勝率がアップしたり、自信があるときにだけ、レバレッジで売買単位を増やしましょう。

[⇒FXについて「はなまるFX」でさらに詳しく学ぶ](https://hanamaru-fx.jp/)
3Dマークアップテキストを簡単に作れるエディタをUnityで作る（簡易版）

# 目的

テキストエディタで頑張るの辛いので、簡単にマークアップが作れる仕組みを、とりあえずな感じで作る。

# コード

Unity Editorを優秀な？3Dコンポーザーとして使ってしまおうという話。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/31634791-fc30-91b4-7a75-2933f8f6fe8b.png)
こんなヒエラルキーを作っておいて、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/e234f267-2468-7a63-8f06-0f48a9a493ab.png)
適当にこんな風になっているとする。

コードを書く。基底クラスとして以下のクラスを作る。

```Node.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Node : MonoBehaviour
{
    public virtual string toML()
    {
        string mlResult = "";
        for(int i = 0; i < gameObject.transform.childCount; i++)
        {
            mlResult += gameObject.transform.GetChild(i).gameObject.GetComponent<Node>().toML();
        }

        return mlResult;
    }

    protected string toColorString(Color color)
    {
        return ((byte)(color.r * 255)).ToString("X2") + ((byte)(color.g * 255)).ToString("X2") + ((byte)(color.b * 255)).ToString("X2");
    }
}
```

各プリミティブの種類ごとに、以下のようなクラスをそれぞれ作る。

```Cube.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Cube : Node
{
    public override string toML()
    {
        string ret = "";

        ret += "<a-box x=" + gameObject.transform.position.x +
            " y=" + gameObject.transform.position.y +
            " z=" + gameObject.transform.position.z +
            " size=" + gameObject.transform.localScale.x +
            " color=#" + toColorString(gameObject.GetComponent<MeshRenderer>().material.color) +
            ">";
        ret += base.toML();
        ret += "</a-box>";

        return ret;
    }
}
```

省略するが他のも。
そして、Rootにバインドした以下のコンポーネントでDebug.Logに吐く。

```Kick.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Kick : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log(gameObject.GetComponent<Node>().toML());
    }
}
```

# 結果

Debug.Logで吐いてるので、コンソールからコピペ。

```
<a-box x=0 y=0 z=0 size=1 color=#FA0303><a-sphere x=0 y=0.79 z=0.71 r=0.5 color=#000000><a-text x=0.77 y=0.79 z=-1.24 size=1 color=#FFFFFF>Hello World</a-text></a-sphere><a-cylinder x=-0.96 y=0.64 z=-1.18 height=2 r=0.5 color=#FFFFFF></a-cylinder></a-box>
```

できた。
取り急ぎの超簡易版なので、そのうちもっといい形を考える。
【Django】settings.pyに書くような設定をモデルで管理する

webアプリケーション全体で利用するような設定は、settings.pyで行うのが一般的です。

しかし、設定を頻繁に変更する場合や、クライアントが簡単に変更できるようにしたい場合には、admin管理サイトで変更できると便利です。

## 方法

### ステップ1
settings.pyに以下を追加します

```python:settings.py
INSTALLED_APPS = [
    ~~~~~
    'django.contrib.sites',  #追加
]
SITE_ID = 1  #追加
```

### ステップ2
models.pyに以下を追加します。

```python:models.py
from django.contrib.sites.models import Site

class SiteDetail(models.Model):
    site = models.OneToOneField(Site, verbose_name='Site', on_delete=models.PROTECT)
    #以下は設定した項目追加の例
    DEFAULT_FROM_EMAIL = models.CharField('DEFAULT_FROM_EMAIL', max_length=255, blank=True)
```

Djangoに付属するsitesフレームワークを導入すると、1つのウェブサイトに1つのSiteデータが割り当てられます。これとOneToOneで紐づくSiteDetailのようなモデルを作ることで、そのウェブサイト全体の設定を表すモデルが作れるらしいです。

### ステップ3

以下を追加

```python:apps.py
from django.apps import AppConfig
from django.db.models.signals import post_migrate


class AppConfig(AppConfig):
    name = 'app'

    def ready(self):
        from .models import create_default_site_detail
        post_migrate.connect(create_default_site_detail, sender=self)
```
```python:models.py
def create_default_site_detail(sender, **kwargs):
    site = Site.objects.get(pk=settings.SITE_ID)
    SiteDetail.objects.get_or_create(site=site)
```

### ステップ4

以下を追加

```python:settings.py
MIDDLEWARE = [
    ~~~~~~
    'django.contrib.sites.middleware.CurrentSiteMiddleware',  # 追加
]
```
これにより、`{{ request.site }}`で設定項目にアクセスできるようになります。
例えば、`{{ request.site.sitedetail.DEFAULT_FROM_EMAIL }}`で、上記で設定したメアドを取得できます。

### ステップ5

以下を追加

```python:admin.py
from django.contrib import admin
from django.contrib.sites.models import Site
from .models import SiteDetail


class SiteDetailInline(admin.StackedInline):
    model = SiteDetail


class SiteAdmin(admin.ModelAdmin):
    inlines = [SiteDetailInline]


admin.site.unregister(Site)
admin.site.register(Site, SiteAdmin)
```
これにより、SiteとSiteDetailが同時編集できるようになります。

## 参考文献
以下のサイトとほぼ同じ内容ですが、一部動かない箇所があったので、Qiitaに書きました。
https://narito.ninja/blog/detail/104/
kintoneカスタマイズ基礎-部品集-

# kintoneカスタマイズ用部品集
kintoneでjsを書いてカスタマイズする時用の、書き方備忘録です。

## 1. 詳細画面でレコードの値を取得する
```js

kintone.events.on('app.record.detail.show', function(event) {
  var hensu = event["record"]["フィールドコード"]["value"];
}
```

## 2. 編集画面でレコードの値を取得する
```js
var events = ['app.record.create.show','app.record.edit.show'];
kintone.events.on(events, function(event) {
  var record = event.record;
  var hensu = record['フィールドコード']['value'];

```
## 3. フィールドの入力可・不可の制御
```js

kintone.events.on(['app.record.edit.show', 'app.record.create.show'],function(event){
  var record = event.record;
  //編集を可能にする
  record['氏名']['disabled'] = false;
  //編集を不可にする
  record['氏名']['disabled'] = true;
```

## 4. グループの開閉
```js
kintone.events.on(events, function(event) {
  var record = event.record;
  //グループを開く
  kintone.app.record.setGroupFieldOpen('グループのフィールドコード', true);
  //グループを閉じる
  kintone.app.record.setGroupFieldOpen('グループのフィールドコード', false);

```

## 5.ルックアップ自動取得（レコード追加時）
```js
kintone.events.on('app.record.create.show', function(event) {
  var record = event.record;
  //ルックアップ自動取得
  record['ルックアップのフィールドコード']['lookup'] = true;
```
vimrcにはやはりset nocompatibleが必要

メモ。同じことでハマる人が減りますように

# vimrcを-uオプションで指定するケースに限る
:help compatible  にはこうある。

> Vimが立ち上がる間にファイル vimrc または gvimrc が見つかると、この
        オプションはオフにされ、その他のオプションで変更されていないものは、
        みなVimの既定値に設定される。要するに、Vimはファイル vimrc または
        gvimrc が存在するならVimの既定値を、存在しないならViの既定値を使うの
        だ (Note: システム全体用のvimrcやgvimrc、あるいは引数 -u で指定され
        るファイルは関係ないことに注意)

最後に全部答え書いてるけど、vim -u <config>と指定するとcompatibleオプションがONの状態のまま
vimrcの読み込みがスタートしてしまい、もろもろの設定が全部失敗するので使い物にならなくなる。
「-uなんか使わねえよ」って人は書かなくていいと思う。以上
VS CodeでPHP デバッグできなくなった

# VS Codeで PHP デバッグできなくなる

久しぶりにVS CodeでPHPデバッグしたところ９０００ポートが使用中のようなエラーが出た。

ポートを調べると確かにListenしている。

少し調べると、Swagger Viewエクステンションが９０００を起動しているため、バッティングしたみたい。

<参考>
https://github.com/Microsoft/vscode/issues/58045#issuecomment-420561244
複数の Git アカウントを使い分ける方法

普段から、GitHub だけでなく、Bitbucket や GitLab も併用していて、それぞれのサイトで異なるアカウントを作成していると、複数の Git アカウントを持つことになり、

例えば、新しいプロジェクトをリモートリポジトリに push しようとすると、以下のように失敗してしまうことがあります。

```
% git push -u origin master
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/user/repository.git/'
```

原因は、次のコマンドを実行してみれば分かる通り、

```
% git config user.name
```

使用するアカウントが、以下のコマンドを実行するか、もしくは Git の設定ファイル（ ~/.gitconfig ）を見れば確認できる、Git の「 グローバル設定 」から参照されているためです。

```
% git config --global user.name
```

もちろん、使おうとしているのが、メインで使用するアカウントであれば、この「 グローバル設定 」を上書きしておけばいいのですが、

そうでないなら、各リポジトリに固有の「 ローカル設定 」に、`user.name` を追加する方がいいでしょう。

追加の仕方は簡単で、例えば「 user 」という `user.name` を設定したい場合には、次のようなコマンドを実行します。

```
% git config user.name user
```

確認のコマンドに、引数を一つ増やすだけですね。

ちなみに `–global` に対応する `–local` というオプションは（ デフォルトが `–local` になっているので ）指定してもしなくても構いません。

これで、該当リポジトリの設定ファイル（ .git/config ）に `user.name` が追加されました。

```
% cat .git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
[remote "origin"]
        url = https://github.com/user/repository.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[user]
        name = user
[branch "master"]
        remote = origin
        merge = refs/heads/master
```

必要に応じて、`user.email` も追加しておいてくださいね。

その他、詳細については、公式ドキュメントを参照してください。

https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
Railでnot null制約をはずす

#今回やること
railsでnot null制約がついているカラムの制約を外します。

#not null制約をはずす
手順としてはまず下記のようにコンソールに入力、実行しマイグレーションファイルを作成します。

```
rails g migration ChangeColumnToNull
```

出来上がったマイグレーションファイルはdb/migrateに出来上がるので
以下のように、そのファイルに変更したいテーブル、カラム名を記載します。

```
#postsテーブルのカラム名nameのnot null制約を外す例

class changeColumnToNull < ActiveRecord::Migration[5.1]
  def up
    # Not Null制約を外す場合　not nullを外したいカラム横にtrueを記載
    change_column_null :posts, :name, true
  end

  def down
    change_column_null :posts, :name, false
  end
end
```
その後コンソールでmigrateをかけます。

```
rails db:migrate
```

#終わりに

アプリを作成しているとカラムの設定を変えてい場合が出てくると思うので、
まとめてみました。
訂正点などあればご指摘いただけると幸いです。
社内読書会としてSQLアンチパターンを選んだお話

NTTコミュニケーションズ Advent Calendar 2019，
25日目 今年最後の記事です!

# はじめに

弊社では数ヶ月前から技術顧問(t_wadaさん，などなど)の方々をお招きしており、
イケてるエンジニアと一緒に勉強したいよね！といった流れから
技術書を1つ選び読書会を開くことになりました．

この記事では，
社内読書会でSQLアンチパターンを選んだ経緯と，
心がけるていること，実際に学んだことの実例をいくつか紹介していきたいと思います!

## SQLアンチパターンを選んだ経緯

数ある技術書の中で，SQLアンチパターンを選んだ理由は
やはり`著者(t_wadaさん)に直接聞けるから！`が大きな理由ですが，
他にもSQLアンチパターンには読書会の入門に適した以下の理由があります．

- 各章が独立しているので順番を気にせず発表や参加ができる
    - 前の章の内容に依存関係があるとキャッチアップが大変になり出席率が低くなってしまう...
- DBは比較的みんなが触ったことが多いので，自分たちが業務してきた中でハマった部分を共有できる


## 心がけたこと

また，この読書会に興味があるエンジニアが今後の業務に生かせるよう次の事柄を心がけました

- チームや部署に関わらず参加できるようにする
    - こちらは各部で利用可能な開発者チーム専用のスペースで行うことにしました
- アンチパターン本が書かれた当時と現在で，今もアンチパターンと言えるかを議論する
    - 技術の進歩により，必ずしもアンチパターンでない場合があるので
- 自分の業務となるべく関わりのある章を選択する
    - アンチパターンにハマったつらさを共有できるので

## 実際に読書会の議論フェーズで出た意見など

実際に議論・業務で実際にアンチパターンを使った際の感想などをいくつか紹介します．


### 5章 EAV

- EAVを導入した結果、コードの保守性が下がっていった
    - DBのカラムを読んでも、何が入ってるか分からない!
- EAVは作るときは簡単だけど、読むとき地獄
- wordpressなどDBの利用方法がかっちり決まらないタイプだと使わざるを得ないのかも

### 7章 Multi column Attribute

- 1章 jaywalkと並んで『これはやらんだろ』と言われるアンチパターン
- 従属テーブルがきれいにまとまっててすごい
- 例題に限って言えばドキュメント系DB使ってもよいかも
- JSONでも同じことが出来るけど, SQL的にはまだ二級市民

### 11章 ファントムファイル

- 運用しておもったこと
    - Windows等からNFSとかでマウントしたらそのままファイルが見えるのは楽
    - レコードが消えてる場合手組みで修正したりバックアップからの復旧は二度手間になる
    - 割とテストが書きづらい
- この本が書かれた当時にはS3のようなものは存在しなかったので，Blobに対する考え方などが代わってきてて面白い!
- 今だとS3化する?
    - S3にしてもトランザクション問題なんかは起こるかも
    - 扱うファイルが1つであれば手段がある
    - [LAST RESOURCE COMMIT OPTIMIZATION](https://access.redhat.com/documentation/ja-jp/jboss_enterprise_application_platform/5/html/administration_and_configuration_guide/lrco-overview)


### その他の議論
#### DB設計でNULLを許容するかどうかについて

この話はDB界隈でもかなり鬼門だそうで，
会社や設計者によっても`NULL`絶許マンと，`NULL`使うマンに別れると思います．
ですが，関数の戻り値や`OUTER JOIN`で結局`NULL`が返ってくる場合があり`NULL`からは逃れられないことからうまく付き合う(`NULL`を許容する)ことが自分にはあっているのかなぁと思いました．
ちなみに原著者はNULL許容派だそうですが，海外のDB学会だとNULL否定はが多いらしい．．．？

## 最後に

初の部署間をまたいだ読書会を行った感想ですが，
アンチパターン本が書かれた当時と現在を比べてみて，設計思想の変化であったり技術の進歩で必ずしもアンチパターンではない部分もあり，議論がとても面白かったです．
また章立てが独立している技術書は初めての読書会でも取り掛かりやすい！と感じました．

まだ，読書会に手を付けられていない方々も，
既に読書会をバリバリやっている方々，
技術書の読書会にSQLアンチパターンを始めてみてはいかがでしょうか．

みなさま，良いお年を!
Edge × htmlのdownload属性でドはまりしたお話

# Edge × htmlのdownload属性でドはまりしたお話

割とマジで足掛け1か月くらい悩み続けてました。。。

## download属性？

https://lab.syncer.jp/Web/HTML/Reference/Attribute/download/1/

全然知らなかったんですが、aタグにはdownload属性があり、ファイルのダウンロードの際にdownload属性を参照してファイル名がつくみたいです。

これは、全ブラウザ共通でdownload属性を付けると、該当のファイル名でファイルがダウンロードされます。(飛び先がHTMLであっても)

## 何が起きたか

そんなことは何も知らずに、PHP側の処理で `download` というオプションが必要だったため、気づかずにaタグにオプションを渡していました。

そのオプション名でわかる通り、ファイルのダウンロードに関するオプションです。

コード的にはこんな感じになってました。

```html
<a href="hogehoge?download=1" download="1">ほげ</a>
```

```php
<?php
// リンクの遷移先
// ※実際はもっといろいろ書いてますｗ
function hogehoge() {
    if ($_GET['download'] == 1) {
        header('Content-Disposition: attachment; filename="hogehoge.txt"');
    }
}
?>
```

### リンクをクリックした結果起きたこと

- Firefox: `hogehoge.txt` でダウンロード
- Chrome: `hogehoge.txt` でダウンロード
- IE: `hogehoge.txt` でダウンロード
- Edge: `1.txt` でダウンロード

という結果になりました。。。  
何をどう確認しても、どう修正しても`1.txt`でダウンロードされるんでなんでやねーん！って・・・。  
デバッグツールでヘッダー情報確認しても問題なくhogehoge.txtがわたってるんだぜ。。。

## まとめ
- download属性ってのがあるらしい！
- Edgeだけヘッダー情報との優先度が違うらしい！
- というかいらない属性を付けんなって！
django-rest-framework 参照整合性制約をチェックしてからオブジェクトを destroy(削除) する

# はじめに

Django Modelには 外部キー列のon_deleteを指定してレコードが削除された時の動作を指定することができます。

[django.db.models.ForeignKey.on_delete - https://docs.djangoproject.com](https://docs.djangoproject.com/ja/3.0/ref/models/fields/#django.db.models.ForeignKey.on_delete)

この内`PROTECT`を指定した場合についてのお話です。
`PROTECT`を指定した場合は、`ProtectedError` 例外が発生し参照されているオブジェクトの削除が出来なくなります。

参照整合性制約に任せておけば削除は防止されますが、`DELETE`文のコストが無駄になってしまうので、
ここでは、事前に参照されているテーブルを`DELETE`文を発行することなく事前にチェックしましょうってことで作成したMixinのサンプルです。

## 拡張 DestroyModelMixinの作成

既存の`DestroyModelMixin`を継承します。
削除検証する抽象メソッド`validate_destroy`を定義します。
`destroy`をオーバーライドし、`validate_destroy`を呼び出し、`ProtectedError`を捉えたら`ValidationError`を発生させます。

```python
from abc import abstractmethod
from django.db.models.deletion import ProtectedError
from rest_framework.mixins import DestroyModelMixin
from rest_framework.validators import ValidationError


class ExDestroyModelMixin(DestroyModelMixin):
    @abstractmethod
    def validate_destroy(self, request, *args, **kwargs):
        raise NotImplementedError()

    def destroy(self, request, *args, **kwargs):
        try:
            self.validate_destroy(request, *args, **kwargs)
        except ProtectedError:
            # 外部キー参照エラー
            raise ValidationError({
                'protectedError': [
                    '既に他のデータから参照されているデータが含まれているため、削除できません。'
                ]
            })

        return super().destroy(request, *args, **kwargs)
```

## 使い方

使いたいビューセットで作成した`ExDestroyModelMixin`をmixinします。
ビューセット側では抽象メソッドである`validation_destroy`を実装します。

ここでは、Customerの子テーブルであるCustomerOfficeを検索しデータが存在すれば`ProtectedError`を発生させています。

```python
from django.db.models.deletion import ProtectedError
from rest_framework import viewsets
from xxxxx.models import CustomerOffice
from api.views.mixins import ExDestroyModelMixin


class CustomerViewSet(viewsets.ModelViewSet, ExDestroyModelMixin):
    def validate_destroy(self, request, *args, **kwargs):
        queryset = CustomerOffice.objects.filter(customer_id=kwargs['pk'])
        if queryset.exists():
            raise ProtectedError('営業所テーブルから参照されているため、削除することができません。', queryset)
```
XCode でファイルが認識されないとき

# イントロ

Finder またはファイルエクスプローラーで見るとファイルが確かに存在するのに、XCode を開いて見てみるとファイルが認識されない、ということがあります。

実は実際のファイルと XCode から見たプロジェクトのファイルは必ずしも一致しているわけではありません。つまり、実際のファイル構造と XCode から見たファイル構造を別々に管理することができるようになっています。よって、XCode の外部でファイルを移動などしたときは、それを XCode に認識させる作業が必要になります。

# 原因

XCode から見たファイル構造は、
MyProject.xcodeproj/project.pbxproj
というファイルによって管理されています。よって、このファイルに記されていないファイルは、実際に存在していたとしても XCode 内部からは見えないわけです。
したがって

- XCode 外部でプロジェクトにファイルを追加した場合
- .pbxproj ファイルを git でコミットし忘れた場合

などに、XCode でファイルが見れない状態になってしまいます。

# 解決法

解決法は2つあります。

1. XCode にファイルをドラッグ＆ドロップする
2. XCode のファイル管理ウィンドウを右クリックして Add Files to "MyProject" をクリックし、ファイルを追加する

これで XCode からファイルが見れるようになります。

# まとめ

コミットする際は .pbxproj も必ず含めるようにしましょう。

# 参考記事

- [.xcodeproj/project.pbxproj を解読する](https://qiita.com/yokomotod/items/02e395e99bb891d27f67)
- [Xcode外で追加したXcodeプロジェクト内のファイルをXcodeに認識させる](https://qiita.com/skycat_me/items/76423e1c534088a62f7f)
- [project.pbxprojを弄ってXcodeにファイル追加を認識させる](https://qiita.com/noppefoxwolf/items/8afa40b24ee04a932c05)
- [iOSアプリ開発時の実ファイルの配置ベストプラクティス](https://qiita.com/yimajo/items/6cffb5cd5a5dd659edb4)
Rootgetters とは


**`Rootgetters`** は、そのアプリケーション内で定義されている**`getters`**を持ってこれる。


```example1.js

export default {
  namespaced: true,
  state: {
  },
  getters: {
  },

```

```example2.js

export default {
  namespaced: true,
  state: {
  },
  getters: {
  },
  actions: {
    addCategories({ commit, rootgetters }){
      // この中で全てのファイルのgettersを使用することができる
    }
  }

```
concrete5 で、ユーザーのパスワード再発行をどうしてもしたい時 (MySQL 管理者向け)


ローカル環境でサイトをテストで構築している際などに間違ってパスワードを忘れてしまうときがあります。

パスワード再発行をしようにも、ローカル環境などではメールが送信できなかったりするので、メールが届きません。特に @example.com などのテスト用メールアドレスを登録しちゃったら大変。

そんな時のパスワードリセット情報を取得する方法をお伝えします。

MySQLへ Sequel Pro などを使ってアクセスできる管理者向けの情報です。

この方法は、管理上必要になった時の緊急対策ですので、善意ある行動をお願いします。


## 1. ユーザーのメールアドレスを取得する

パスワードを再発行したい登録ユーザーのメールアドレス情報をゲットします。MySQL の `Users` テーブルを見て、ユーザーのメールアドレスを取得できます。

## 2. concrete5 管理画面からパスワード再発行処理をする

`【サイトURL】/index.php/login/concrete/forgot_password` にアクセスし、メールアドレスを入力して、パスワードリセットメールを送信させます。

## 3. MySQL のテーブルの中身を確認

UserValidationHashes テーブルの中身を確認します。
パスワード発行後、エントリーができるはずです。
そのエントリーから uHash の文字列をコピペしてください。

## 4. パスワード再発行用 URL を構築してパスワード再発行

下記のように組み合わせることで、パスワード再発行用の URL となり、パスワードの再発行が可能となります。

`【サイトURL】/index.php/login/callback/concrete/change_password/【uHashの文字列】`


以上
TypeScriptで自分用のライブラリを作ってローカル/GitHubからnpm installする 


## はじめに

- TypeScriptで自分用のライブラリを作って再利用したい
- npmリポジトリには公開しない
- なのでローカル/GitHubから`npm install`したい
- 型定義も保持したい

ということを思ったのですがやり方が分からなかったので調べました。

## プロジェクトを初期化する

なにはともあれnpm initから始めていきます。

```
$ npm init
$ npm install typescript
$ tsc --init
```

次にtsconfig.jsonを編集します。
基本的にお好みですが、大事なポイントとして`"declaration": true`にして型定義ファイル`*.d.ts`が生成されるようにしておきます。
またコンパイル結果をまとめたいので`"outDir": "./dist"`を定義します。
ソースコードもsrcディレクトリに置きたいので`"include": ["src/*"]`を定義しておきます。

```tsconfig.json
{
  "compilerOptions": {
    "target": "esnext",
    "module": "commonjs",
    "moduleResolution": "node",
    "declaration": true,
    "newLine": "lf",
    "pretty": true,
    "outDir": "./dist",
    "strict": true,
    "skipLibCheck": true
  },
  "include": "src/*",
  "exclude": "src/test*"
}
```

## ライブラリを実装する

方向性としてモジュールを分割して作ることが多いと思うのでそれぞれファイルを分けてみました。
ここらへんはやりたいようにやればいいと思います。

```types.ts
  export type Person = {
    name: string;
    age: number;
  };
```

```hello.ts
  import { Person } from './types';
    
  export function hello(person: Person): void {
    console.log(Hello, ${person.name}(${person.age})!);
  }
```

```bye.ts
  import { Person } from './types';
    
  export function bye(person: Person): void {
    console.log(Bye Bye, ${person.name}(${person.age})!);
  }
```

npmで利用するためには後述のpackage.jsonでエントリポイントの設定をする必要があります。
エントリポイントは最初に呼び出されるモジュールの指定ですが、基本的に1ファイルしか指定できないため上記のコードも１つにまとめておく必要があります。

まとめ方は色々あるかと思いますが、webpackなどのモジュールバンドラーを使わないのであればindex.tsを作って必要な分だけexportする方法がシンプルかと思います。

```index.ts
  export * from './hello'
  export * from './bye'
  export * from './types'
```

コードができたのでコンパイルしましょう。

```
$ tsc
```

distディレクトリを見ると`index.js`と`index.d.ts`が出来ていますのでpackage.jsonに設定します。
これでexportした関数などを外部からをimport出来るようになります。

```package.json
{
  "name": "greeting", // モジュール名、importで呼び出す時の名前になる
  ~~略~~
  "main": "dist/index.js", // 最初に呼び出されるモジュール
  "types": "dist/index.d.ts", // 型定義
  "private": true // npmパッケージを公開しないため念の為privateに
}
```

これでライブラリが完成しました。

## npmでinstallしてみる

npm installする時、ライブラリをどこに置いておくかという話ですが、自分用なのでローカルかGitHubが良さそうです。

### ローカルの場合

さっき作ったpackage.jsonがあるディレクトリのパスを指定すれば可能です。
テスト用に新しくプロジェクトを作成するなどして試してみましょう。

```
$ npm init
$ npm install ../greeting // ライブラリのあるパスを指定
```

読み込み側のpackage.jsonを見ると下のような感じで読み込まれます。
ちなみにnode_modulesに作られるのはコピーではなくシンボリックリンクなので変更とかには注意が必要です。

```package.json
  "dependencies": {
    "greet": "file:../greeting",
  }
```

試しにimportしてみるとちゃんとhello関数が読み込めることが分かります。

```src/sample.ts
  import { hello } from 'greet'
  hello({name: 'Hanako', age: 18});
```

```
$ tsc
$ node dist/sample.js
Hello, Hanako(18)!
```

### GitHubの場合

基本的には同じでURLでinstallできます。
他にもブランチ指定したりSSHも使えるようなのでよっぽどじゃない限り足りると思います。

```
$ npm install https://github.com/{username}/{repo}
```

```package.json
  "dependencies": {
    "greet": "git+https://github.com/{username}/{repo}.git",
  }
```

## 参考:
https://qiita.com/pure-adachi/items/ba82b03dba3ebabc6312
https://qiita.com/saltyshiomix/items/d889ba79978dadba63fd
tips: バックスラッシュを使用しないスクリプト行の継続


備忘

#問題
スクリプトで行が長い場合、バックスラッシュで継続可能

```bash
#! /bin/sh

ansible-playbook \
-i localhost, \
-c local \
site.yml

```
しかし、

- 間に行を追加した場合など、途中でバックスラッシュを忘れやすい
- 途中でバックスラッシュが途切れると次の行がコマンドと解釈され意図しない結果となる 


#バックスラッシュ無しの例

```bash
#! /bin/sh

eval $(cat <<__EOC__
ansible-playbook
-i localhost,
-c local
site.yml
__EOC__)
```

- evalにて$()の出力をコマンドとして実行させる
- $()は改行も区切りとして出力する。
    - なお、改行などを保つには、"$()"を使用する。
- ヒアドキュメントを使用して複数行を扱う
- <スペース><スペース>など連続するスペース等は、コマンドや引数の区切りと解釈され、実質的に単一の<スペース>となる。
    - 文字列として連続スペース等が必要な場合、\\<スペース>\\<スペース>などとエスケープさせる
- ${foo}などは展開される。展開を抑止するには、<<'__EOC__' とすることでいけるかも
Docker ToolBoxで作ったコンテナにlocalhostから接続できない

別PCでDocker環境作ってたけど、壊れそうだったのでDockerの環境を移行する。

前PCは、Windows 10 ProだったのでDocker for Windowsが使えてたが、Windows 10 Homeに代わってしまったので、Docker ToolBoxを使っていく。
https://docs.docker.com/toolbox/toolbox_install_windows/


導入したあとは、gitからcloneしてきて

```
docker-compose build
docker-compose up -d
```

http://localhost:8080/ を見に行く。

```
このサイトにアクセスできません
localhost で接続が拒否されました。
```

docker生きてるかな

```
$ docker-compose ps
   Name               Command              State           Ports
-----------------------------------------------------------------------------------------
xxxx_db_1    docker-entrypoint.sh postgres   Up      0.0.0.0:5432->5432/tcp
xxxx_php_1   docker-php-entrypoint php-fpm   Up      9000/tcp
xxxx_web_1   nginx -g daemon off;            Up      0.0.0.0:8080->80/tcp
```

生きてるみたいなので他の原因を探す。

```
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.5
```

なんかlocalhostじゃなくてようわからんIPになってね？
ということで、http://192.168.99.100:8080/ にアクセスで動作確認できた。



[参考]
1. windows 10 home で docker を導入するメモ 
https://qiita.com/idani/items/fb7681d79eeb48c05144
2. Macでdockerを使う際にlocalhostでcontainerに繋げない問題の調査 
https://qiita.com/amuyikam/items/ef3f8e8e25c557f68f6a
プロキシ環境下において yarn コマンド実行がうまくいかない場合の対応方法について

## はじめに

この記事は以下の環境、前提でyarnコマンドを実行しようとする方のための情報です。

0. パッケージマネージャとしてyarnを使っている（そもそも）
0. プロキシ環境化でyarnコマンドを実行する
0. プロキシサーバの認証が必要である
0. 認証情報に記号（ "\" や "@" など）が入っている

自宅などの環境で自由に開発できる環境があればいいですが、企業など、プロキシ環境で開発・検証をしないといけない場合、認証情報をconfigとして設定する必要があります。また、とくに認証情報に記号が入っているとうまく行かないため、備忘を目的として記載しました。

### yarn のバージョン

今回本投稿で前提としているバージョンです。

```
$ yarn --version
1.15.2
```

## 設定方法

プロキシ環境化では、yarnコマンドに対して proxy の設定が必要です。
また、認証が必要な場合はホスト名の前にユーザ名、パスワードをつける必要があります。

> 【凡例】
> username : 認証するためのユーザ名
> password : パスワード
> hostname : プロキシサーバ名
> port : ポート番号

```
# httpの場合
$ yarn config set proxy http://username:password@hostname:port
```
```
# httpsの場合
$ yarn config set https-proxy http://username:password@hostname:port
```


なお、ドメイン名をつける場合やパスワードに記号（ "\" や "@" など）が入っている場合は、URLエンコード（例えば "\" の場合、 "%5c" ）する必要があります。

## 最後に

一度設定すると、しばらくは設定不要となるため本事象を忘れることが多く、久しぶりに新しい開発環境でセットアップすると、またエラーがでて対処方法をネットで調べることがあり、情報として残しました。
また、今回扱ったyarn以外にもプロキシがあるが故にエラーが起こることが見られますので、少しずつ残していこうと思います。
BootCampを使う

<font color=red><b>2020年後期以降に発売されたApple Silicon搭載MacはBootCampのサポート対象外となります。

## Boot Campとは
Boot Campとは、Intel MacにおいてWindows環境を構築することができるソフトウェアだ。
macOSとの多重起動はしないため、メモリやCPUへの負荷が少なく、性能の低いMacでも快適にWindows環境を構築することができる。

## Boot Campについて
### Boot Campのメリット
▶︎MacとWindowsを多重起動しないため性能が低くても快適
▶︎完全なWindows環境が利用できる
▶︎アクセス権を操作すれば両OS間でのファイルのやり取りが可能
▶︎パーティションのサイズ設定次第でMacを完全なWindowsPCにできる


### Boot Campのデメリット
▶︎起動ディスクの変更（macOSとWindowsの切り替え）が面倒くさい
▶︎Mac/Wi-Fiの性能が低いとインストールに時間がかかる


### Boot Campをおすすめする人
▶︎Macしか持っておらず、Windows環境が必要
▶︎Mac非対応のアプリを使用したい
▶︎Windowsのライセンスキーを持っている


### Boot Campをおすすめしない人
▶︎Officeを利用するためだけ
▶︎使いたい.exeがWineで開ける
▶︎Macのストレージが足りない
▶︎Macの他にWindowsPCを持っている

## 導入編
早速MacにBoot Campを使ってWindows環境を構築していこう。

### 1. WindowsのISOファイルを入手
Windows環境を構築するにあたってまずはWindowsの基本となる*Windows8.1または10のISOファイルを入手する必要がある。
これらはMicrosoft公式サイトにて配布されている。

<b><a href="https://www.microsoft.com/ja-jp/software-download/windows8ISO">Windows8.1 ダウンロード</b>

<b><a href="https://www.microsoft.com/ja-jp/software-download/windows10ISO">Windows10 ダウンロード</b>

*最新版のmacOSに含まれるBoot CampではWindows8.1もしくは10以外のISOを読み込むことができない。Windows7はBoot Campのサポート対象外だ。

### 2. Boot Campの起動
全てのmacOSにはBoot Campアシスタントが最初からインストールされている。Boot Campアシスタントはアプリケーションフォルダ内のユーティリティの中に入っている。

早速起動してみよう。起動後はアプリ内に表示されている手順に沿って進めていくだけだ。WindowsのISOファイルは先ほどダウンロードしたものを指定すれば問題なく読み込まれる。


### 3. 設定
再起動後、Windowsの初期設定画面にてライセンス認証を求められるが、「ライセンスキーがありません」を選択することで続行することができる。ただし、セキュリティ面などからライセンス認証なしの状態での使用はおすすめはできない。

### 4. 起動後
Windowsが無事導入されたら、Windows内にMac専用のドライバーが自動的にインストールされる。
このドライバーをインストールすることで、Touch Barや音量ボタン、macOSでの再起動などに対応する。
UnicodeなJSONを日本語変換するならChromeのコンソール使うといいと思う。

API叩いたりとかした時に、たまにこういうメッセージ返ってくるじゃないですか。

```
{
  "error":true,
  "message":"\u30a8\u30e9\u30fc\u304c\u51fa\u3066\u3044\u307e\u3059\uff01\uff01\uff01"
}
```

![Screenshot from 2019-12-25 13-55-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/9b73cfaa-7e17-8d64-42e1-92dbffee1f5f.png)

Chromeのコンソールにぶちこむと返り値としていい感じに表示してくれる。

firefoxはエラーが起きるので駄目でした。

# その他、UnicodeなJSONを日本語変換する方法

## コンソールでパース

```
JSON.parse(`{
  "error":true,
  "message":"\u30a8\u30e9\u30fc\u304c\u51fa\u3066\u3044\u307e\u3059\uff01\uff01\uff01"
}`)
```

これを使うと便利なところはそのまま変数として使ったりがしやすいです。右クリックで `Store as global variable` を押せば `temp1` として使えるようになりました。

![Screenshot from 2019-12-25 14-32-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/083e3498-dbbc-7e80-3e1d-1553f0c08282.png)

`console.dir(temp1)` とか `console.log` 以外も使えます。◯

![Screenshot from 2019-12-25 14-39-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/f45796dd-48a9-3576-adda-46fe917a56c5.png)

## エディターにJsonParser系のプラグインをいれる

phpstorm

![Screenshot from 2019-12-25 14-40-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/c494b0c5-2017-6fab-2c33-5b2dd9e54b46.png)

## その他

JSONじゃなければ、firefoxでも可です！！！

```
"\u30a8\u30e9\u30fc\u304c\u51fa\u3066\u3044\u307e\u3059\uff01\uff01\uff01"
```

![Screenshot from 2019-12-25 14-47-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/e9fbba33-fb95-e83b-4c94-57aab167a14e.png)




.
[解決]WordPressの管理者ログインでパスワードが入力できなくなった

今週に入ってWordPressにログインできなくなりました。

パスワードの入力フォームにフォーカスが行きません。Tab押してもダメ。

何とか解決できたので、その方法を記載しておきます。

日本のサイトには同様の情報が無かったので、参考になれば幸いです。

# 現象は次の通り

* ユーザ名は入力できるが、パスワードが入力できない。
* パスワードを変更してもダメ
* ブラウザはChrome、IE試したがダメ
* キャッシュなど消してもダメ
* 身に覚えが無い

# Jetpackの不具合らしい

日本のサイトには情報が無く、仕方なく海外のサイトを見ていたら、あるバージョンのJetpackと最新のWordpressの相性が悪く、こういった事象が発生するとのこと。

https://wordpress.org/support/topic/login-problem-cant-type-in-passowrd/

WordpressのAuto updateによって、勝手にこういう状態になることがあるようです。


# 解消方法

結論から言うとJetpackプラグインの更新が必要です。

Safariだとログインできるとの情報で、私はiPadを使ってログインしました。

一旦ログインしたら、プラグインの更新でJetpackを最新に更新しましょう。

更新が終わったら、正しく入力できるようになっているかと思います。


# おわりに

もしかして不正アクセスでブロックされた？と思ったので焦りました。

Wordpressはデフォルトだとセキュリティが弱いので、これを機会に強化していこうと考えるきっかけになりました。
windbag


```Splunk:SPL
| windbag
```

不思議なコマンド
検索しても[オフィシャル](https://docs.splunk.com/)には情報がほとんどない

```Splunk:SPL
| windbag
| table host source lang sample
| stats values(*) as * dc(sample) as distinctCount by lang
```
この一覧をみると25の言語が表示されることがわかる。
日本語の文字を検索すると
[UTF-8 Sampler](http://www.columbia.edu/kermit/utf8_unnumbered.html)や[windbag](https://the.splunkgallery.com/entries/windbag/)とかが出るので、SplunkのUTF8対応確認とかに使用していたのだろう。

あと、なぜか２つあるhindi
[日本語への翻訳](https://translate.google.co.jp/?hl=ja#view=home&op=translate&sl=auto&tl=ja&text=%E0%A4%AE%E0%A5%88%E0%A4%82%20%E0%A4%95%E0%A4%BE%E0%A4%81%E0%A4%9A%20%E0%A4%96%E0%A4%BE%20%E0%A4%B8%E0%A4%95%E0%A4%A4%E0%A4%BE%20%E0%A4%B9%E0%A5%82%E0%A4%81%20%E0%A4%94%E0%A4%B0%20%E0%A4%AE%E0%A5%81%E0%A4%9D%E0%A5%87%20%E0%A4%89%E0%A4%B8%E0%A4%B8%E0%A5%87%20%E0%A4%95%E0%A5%8B%E0%A4%88%20%E0%A4%9A%E0%A5%8B%E0%A4%9F%20%E0%A4%A8%E0%A4%B9%E0%A5%80%E0%A4%82%20%E0%A4%AA%E0%A4%B9%E0%A5%81%E0%A4%82%E0%A4%9A%E0%A4%A4%E0%A5%80.%0A%E0%A4%AE%E0%A5%88%E0%A4%82%20%E0%A4%95%E0%A4%BE%E0%A4%81%E0%A4%9A%20%E0%A4%96%E0%A4%BE%20%E0%A4%B8%E0%A4%95%E0%A4%A4%E0%A4%BE%20%E0%A4%B9%E0%A5%82%E0%A4%81%2C%20%E0%A4%AE%E0%A5%81%E0%A4%9D%E0%A5%87%20%E0%A4%89%E0%A4%B8%20%E0%A4%B8%E0%A5%87%20%E0%A4%95%E0%A5%8B%E0%A4%88%20%E0%A4%AA%E0%A5%80%E0%A4%A1%E0%A4%BE%20%E0%A4%A8%E0%A4%B9%E0%A5%80%E0%A4%82%20%E0%A4%B9%E0%A5%8B%E0%A4%A4%E0%A5%80.)
:weary: 深い