OmniAICreator/Qiita-1.07M huggingface dataset:
Photoshopで作った画像をマスクとしてUE4のメッシュに適用する手順

# 前提
- [Unreal Academy](https://academy.unrealengine.com) の [INTRODUCTION TO MATERIALS FOR DESIGN VISUALIZATION](https://academy.unrealengine.com/Class-Viewer/MatsForDesignViz) で習った項目です。
- 最近UE4を勉強し始めたので、他に良い方法あったらぜひ教えていただきたいですm(_ _)m
 
# 環境
- Unreal Engine 4 4.20.3
- Adobe Photoshop CC 2018


# TL;DR
こんな感じに立方体のメッシュの各面にテキトーな画像を貼り付けることができました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">フォトショで作った画像を使ってマスクを作ることを覚えた！ <a href="https://t.co/vJeuLDlOSg">pic.twitter.com/vJeuLDlOSg</a></p>&mdash; F.Shibusawa (@smartponzu) <a href="https://twitter.com/smartponzu/status/1048792667767824384?ref_src=twsrc%5Etfw">2018年10月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 実行手順／再現手順／詳細
冒頭で紹介した Anreal Academy の講座の `1.5 - Material Editor: Blend Modes` というセクションで紹介されていました。 00:41 あたりから Blend Mode の Masked が出てきます。
![スクリーンショット-2018-10-08-3.15.26-2.png](https://qiita-image-store.s3.amazonaws.com/0/156176/387e33a9-161f-16b4-ad32-9701a7494816.png)

詳しくはそちらを参照してもらった方が正確ですが、ここでは簡単に実装の流れを紹介します。

## 1. Photoshop でおもむろにロゴっぽい画像をつくる。
これは正直なんでも良いと思いますｗ。ただ、同じ講座の別のセクションで説明されていたんですが、UE4にインポートする画像のサイズは2の倍数じゃないとだめなようです。なので縦横の値がそれぞれ、 512px, 1024px, 2048px... といった値になっている必要があります。下の画像は 512px * 512px にして保存しました。 
![スクリーンショット-2018-10-08-3.08.39-2.png](https://qiita-image-store.s3.amazonaws.com/0/156176/bc5d9bdb-1ad5-0117-d350-7b5db7b82469.png)

## 2. 画像をUE4にインポートする
Content Browser の Import ボタンで作った画像を取り込み、 `Cmd + s` で保存します。保存先フォルダは Textures などが良いんでしょうか。
![10月-08-2018 18-44-22.gif](https://qiita-image-store.s3.amazonaws.com/0/156176/b8ac8e17-a00d-9911-5fd4-7402bb2bd24f.gif)


## 3. おもむろに Cube をレベルに突っ込む
左にある `Modes > Place > Basic` から、 `Cube` という `StaticMesh` をレベルに投下します。
![スクリーンショット-2018-10-08-18.57.46.png](https://qiita-image-store.s3.amazonaws.com/0/156176/1a1eb1d3-2926-ffd4-558b-b25772f0d604.png)

## 4. Material Editor を開く
右下にある `Details` に `Materials` という項目があるので、そこのアイコンをダブルクリックします。そうすると `Material Editor` が開きます。ここでメッシュに適用している色とかテクスチャ、光沢、反射なんかを調整します。
![10月-08-2018 19-28-00.gif](https://qiita-image-store.s3.amazonaws.com/0/156176/42645368-afed-7478-3f3e-683d068fedce.gif)

## 5. Blend Mode を Masked に変更する
左下にある `Details > Material` に `Blend Mode` という項目があるので、これを `Opaque` から `Masked` に変更してください。そうすると、 `BasicShapeMaterial` のグレーアウトしていた `Opacity Mask` というノードが使えるようになります。
![10月-08-2018 20-52-52.gif](https://qiita-image-store.s3.amazonaws.com/0/156176/7dee801f-59d9-1d1f-c467-50faafb08423.gif)

## 5. Texture Sample に画像を紐づけ、 Opacity Mask につなぐ
キーボードの `T` を押しながら Blueprint 上をクリックすると、 Texture Sample が出てきます。このショートカット良い。
最後に、左下にある `Details > Material Expression Texture Base` という項目の Texture にロゴ画像を当てはめます。
![10月-08-2018 20-55-02.gif](https://qiita-image-store.s3.amazonaws.com/0/156176/a2bb8ef6-0b9a-1bf5-4832-167ce1452343.gif)

これで、 `Cmd + s` で保存したらOKです。

# 参考文献
- [Unreal Academy](https://academy.unrealengine.com) の [INTRODUCTION TO MATERIALS FOR DESIGN VISUALIZATION](https://academy.unrealengine.com/Class-Viewer/MatsForDesignViz)

P.S これ、WebGLでやったらどんだけコード書かなきゃいけないんだあー…と思うと、ゲームエンジンほんとにすごいなって思いました。
Active Adminを使ったので備忘録

#アプリにActive Adminを入れたので、手順を備忘録として書いてます。

#gemのインストール

```
gem 'activeadmin'
```

```$bundle install```


#generator を実行して ActiveAdmin に必要なファイルを生成
```$rails g active_admin:install```
上記コマンドで必要なファイルが生成される。
generator で migration ファイルも作成されたので migration を実行 
```$rails db:migrate```

これで、```seeds.rb```に初期データとして、ログイン用の（admin）ユーザが作成されている。下記の感じで。

```
AdminUser.create!(email: 'admin@example.com', password: 'password', password_confirmation: 'password') if Rails.env.development?
```

なので、実行してadminuserを作ります。
```$rails db:seed```

#ログイン機能付きの管理画面を確認できる
***サーバーを再起動してから*** http://localhost:3000/admin
にアクセスするとログイン画面が表示されるので、先ほど初期データとして投入した下記のユーザ情報でログインできる。

#モデルに対する管理ページを作成
###Userモデル
```$rails g active_admin:resource``` コマンドにモデル名を渡すことにより、そのモデルに対する管理ページを作成することができる。

下記のようにして User モデルの管理ページを作成
```$ rails g active_admin:resource User```

これで```app/admin/users.rb```が作成され、画面の上部にも表示される。

しかし、このまま User を新規作成しようとすると ActiveModel::ForbiddenAttributesError が出る。

これを解決するには先ほど作成された ```app/admin/users.rb``` に ***permit_params*** を追加する必要があります。
これは Rails のストロングパラメータのように、許可したいパラメータのみを記述するメソッドです。
許可したいパラメータは name ,email だけなので、permit_params に name, email を追加します。

```app/admin/users.rb
ActiveAdmin.register User do
  permit_params :name, :email
end
```

こうすることで、Userを新規作成することができるようになります。

###Messageモデル
user同様にmessageを管理できるように、下記コマンド。
```rails g active_admin:resource Message```

パラメータの許可を追記。

```app/admin/messages.rb
ActiveAdmin.register Message do
  permit_params :user_id :title, :content
end
```

#検索をかけられる
右側に検索フォームがあり、条件を指定して抽出することができます。
Userのセレクトボックスに***messages***のフィルターが確認できるかと思います。
これは***userモデルとmessageモデルにでhas_manyとbelongs_toの関連性を定義してあるからです。***

逆にMessageのセレクトボックスにも、userをフィルターにかけて検索することができます。

参考：https://qiita.com/enomotodev/items/5f6d9348207124a41bf9
ProgateでHTML、CSSの道場にチャレンジ（3）

#ProgateでHTML、CSSの道場にチャレンジ（3）
今日は休日なので、ほぼ1日中　PCに向かい合う( ﾉД`)ｼｸｼｸ…
まあ、楽しいんですけどね（笑）

ProgateさんHTML中級道場　やってみました！

##今日の課題はトップページのコンテンツ部分
前回はトップページの「メッセージ部分」とでも言いましょうか

今回はトップページだけど「レッスン一覧」部分

課題は
**●画像を横並びにする**
**●画像にPタグの文章を重ねる**
**●４つのイメージ、テキストをバランスよくレイアウトする**

行ってきまーす！
##画像を横並びにする
4種類のレッスンを案内するのですが
それぞれ画像、タイトル、テキストを持っていて、それを横並びに表示します

最初にいつもどおりdivタグで切り分けをします

```html
<div class="lesson-wrapper">
      <div class="container">
        <div class="heading">
          <h2>Learn Where to Get Started!</h2>
        </div>
        <div class="lessons">
          <div class="lesson">
            <div class="lesson-icon">
              <img src="https://●●△△.png">
              <p>HTML & CSS</p>
            </div>
========================================================================
         以下 <div class="lesson-icon">以下を4回繰り返します
```
今回、私は「container」の中に「heading」を作成せずに
いきなり「h2」タグで文章を書いていました
画像が4つあるので１「lesson-icon」×4は記憶してたんですけど
さらに細かく分けるところまでは思いつきませんでした(ノД`)・゜・。

##画像にPタグの文章を重ねる
オシャレな感じで（笑）画像の中心にレッスンの名前を重ねます

これを実現するにはCSSで「position」プロパティを使用します

簡単に言うと基準点を決めて、基準点（左上）からの地点に置きたい要素を設置する
という感じです

CSSはこちら

```css
.lesson-icon {
  position:relative;　←　imgを含むクラスを基準点とする
}
.lesson-icon p{
  position:absolute;　←　基準点からの配置
  top:90px;
  width:100%;
  color:white;
}
```
##４つの要素をバランスよくレイアウトする
少し苦戦しました
と、言うのも最初のdivクラスの切り分けが上手くできてなかったので
全体が左よりになってしまってました((+_+))

結果としては
今回作成するくくり（divクラス)にtext-alignでcenterを指定して
要素を中央よせにする

載せるコンテンツのwidthに望む%を指定してバランスよくする
cssはこちら

```css
.lesson-wrapper {
  text-align:center;
}
.txt-contents {
  width:80%;　←　コンテンツ枠の８割で表示（2割は余白）
}
.lesson {
  width: 25%;　←　100％÷4個で25%を設定
}
.lesson-icon p{
  width:100%;　←　4分割内ではいっぱいに枠を使う
}
```
今回は感覚で乗り越えた感が強かったです
AWS EC2(Linux)パスワード認証設定方法


EC2インスンス(Linux)作成した際、デフォルトは鍵認証しか許可されていないため、
パスワード認証を許可したい場合は、sshd_configの設定が必要です。

検証環境
・AWS
・RHEL7.3



### 新規ユーザー作成
```
useradd testuser
```

### パスワード設定
```
passwd testuser
```
パスワード設定対象のユーザーを指定し、任意のパスワードを設定してください。
 
### sshd_configの設定
```
vi /etc/ssh/sshd_config
```

```
PasswordAuthentication yes
```
PasswordAuthenticationを『yes』に変更して保存。

### ※鍵認証を拒否したい場合
```
keyAuthentication no
```
コメントアウトされているため、#を削除しnoに変更。
sshdサービスを再起動してください。

### sudo権限の追加
```
visudo
```


```
testuser        ALL=(ALL)       ALL
```
上記行のユーザーを追加する事で、sudoコマンドが使えます。



### sshdサービス再起動
```
service sshd restart
```


###ログインテスト
```
ssh testuser@ec2-<IPアドレス>.<リージョン>.compute.amazonaws.com
```
ログインできれば、パスワード認証成功です。
TeraTarmでもログインできます。

ec2-user、rootユーザーは初期状態、パスワード設定されていないため、
パスワード認証を許可する際、事前に対象ユーザーのパスワードを設定してください。
Evernote がエクスポートする xml ファイルをプレーンテキストに変換する

表題の雑スクリプトを書いたので誰か欲しい人いるかなという感じで書いておきます。

## 背景

* Evernote はノートのエクスポート形式が HTML か、独自の XML フォーマットだけであり、プレーンテキストは選べません。
* また複数ノートを一括でエクスポートした場合、全ノートが1つの XML に結合されてエクスポートされます。
* 非常に扱いづらいのでプレーンテキストに変換することにしました。

一応先人の知恵もあるにはありました。以下は PHP での実装です。

[panicsteve/enex-dump: PHP script that accepts an Evernote export (ENEX) file and produces a folder of plain text documents.](https://github.com/panicsteve/enex-dump)

しかし XML ファイルをまるごとメモリに載せてから処理する形式になっているため、 1000 ノート単位で一括エクスポートして XML が数百MBに達したりしていた自分のユースケースではまともに動かず、自分で作ることにしました。

なおプレーンテキスト変換、ですので、元のノートも文字列データを対象としています。 Evernote は画像や pdf や音声ファイルも収容できますが、それらは考慮外です。

## XML のフォーマット

パースするにあたり、 Evernote が出力する XML の構造を簡単に書いておきます。だいたい以下のようになっています。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export3.dtd">
<en-export export-date="20181007T043300Z" application="Evernote" version="Evernote Mac 7.5.2 (457172)">
<note><title>hoge</title><content><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
<en-note>
noteの内容
</en-note>
]]></content><created>20150729T142057Z</created><updated>20150729T143036Z</updated><note-attributes><author>example@example.com</author><source>desktop.mac</source><reminder-order>0</reminder-order></note-attributes></note>
<note><title>fuga</title><content><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
<en-note>
noteの内容
</en-note>
]]></content><created>20150720T065805Z</created><updated>20150720T070625Z</updated><note-attributes><author>　example@example.com</author><source>desktop.mac</source><reminder-order>0</reminder-order></note-attributes></note>
</en-export>
```

* 全体は `<en-export>` タグで囲われている。
* その中に `<note>` タグで各ノート情報が入っている。
* ノート情報の中で、例えば表題は `<title>` 、ノートの内容は `<en-note>` といった各タグで囲われている。

基本的に各ノートの情報は

*  `<note>` 開始タグとノートのタイトル情報で1行
*  DOCTYPE で1行
*  `<en-note>` の開始タグで1行
*  内容
*  `</en-note>` 終了タグで1行
*  `</note>` 終了タグとファイルメタ情報で1行

と行単位で結構綺麗に分かれていて、これがエクスポートしたノート数分繰り返される形になります。ただし `<en-note>` 開始終了タグとノートの内容がすべて1行に書かれている場合が例外的にあります（おそらく内容が短いノートの場合？）。

また Evernote のデータは基本的にリッチテキストですので、装飾については HTML タグで付加された状態になっています。

## 実装

Gist に貼っておきました。

XML をパースしてもよかったのですが、先に貼ったようにだいたい1行ずつ要素が分かれているので、行単位で読み込んでパースして処理してノート1つ分読み込むたびに吐き出して、の方が処理も速そうだったのでそうしました。実装はだいぶ雑ですので動かない場合もあるかもしれません。あと macOS でしか実行してないです。

[convert_evernote_xml.go](https://gist.github.com/chroju/fd0d22790eff5f31ef606c393c6532a8)

引数に　XML ファイルのパスを与えて実行すると、以下のように動作します。

* カレントディレクトリに `output` フォルダが無ければ作成する。
* 1ノート1ファイルで `ouput` フォルダ内にエクスポートする。
* 装飾の HTML タグはすべて破棄する。
* ファイルの atime と mtime はノートの最終変更時刻にする。
static型の使用

初めてWeb系のプログラミングに挑戦した時に複数のユーザがアクセスすると挙動が普段と違うといったことがあった。

原因はstaticの意味を理解していなかったことでした。
静的メンバ＝共用メンバは各ユーザで共通のエリアなので他のユーザによる値の更新を受け取ってしまう。

結果としてはSession変数を使用することでユーザ固有の値を保持することができました。
Angular でhtml lang を変更する

```app.component.ts
import { Component, LOCALE_ID, Injector, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/platform-browser';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss'],
})
export class AppComponent {
  constructor(
    private injector: Injector,
    private titleService: Title,
    @Inject(DOCUMENT) private _document: any
  ) {
    const locale = this.injector.get(LOCALE_ID);
    _document.documentElement.lang = locale;
  }
}
```
goのforループ変数の補足問題

:warning:  golang 1.22からこの問題は発生しなくなっています 参考: https://go.dev/blog/go1.22

golang 1.22未満の goのforループ変数は同じ変数を共有します。

ループ内の変数の処理を後から利用しようとするとループの最後の値になってしまいます。`defer`とかの時にバグをうみやすいので注意が必要です。

```go
// loop_scope.go
package main

import (
	"fmt"
)

func main() {
	strings := []string{"a", "b", "c"}
	var printFuncList []func()

	// ループ変数sは各ループ処理で使い回されるので、無名関数からは同じ変数の値が表示されてしまいます
	for _, s := range strings {
		printFuncList = append(printFuncList, func() {
			fmt.Printf("s = \"%s\" (%p)\n", s, &s)
		})
	}

	// 何らかの処理

	for _, printFunc := range printFuncList {
		printFunc()
	}
}
```

実行すると、最後の変数の値の"c"が表示されてしまいます。

```go
// 実行結果（1.21.7 で確認）
go run loop_scope.go
s = "c" (0x14000010070)
s = "c" (0x14000010070)
s = "c" (0x14000010070)

// 実行結果（1.22.0 で確認）
go run loop_scope.go
s = "a" (0x14000090040)
s = "b" (0x14000090060)
s = "c" (0x14000090090)
```

そのため、変数宣言をする必要があります。

```go
// loop_scope.go
package main

import (
	"fmt"
)

func main() {
	strings := []string{"a", "b", "c"}
	var printFuncList []func()

	for _, s := range strings {
		s := s // この変数宣言が必要
		printFuncList = append(printFuncList, func() {
			fmt.Printf("s = \"%s\" (%p)\n", s, &s)
		})
	}

	// 何らかの処理

	for _, printFunc := range printFuncList {
		printFunc()
	}
}
```

今度は、"a", "b", "c"とそれぞれの変数の値の"c"が表示される用になります。

```go
// 実行結果
go run loop_scope.go
s = "a" (0x14000102020)
s = "b" (0x14000102040)
s = "c" (0x14000102070)
```
Electronのデバッグ時にDebugとReleseに分ける（Visual Studio Code）

## 概要
Visual Studio Codeを使ってElectronをデバッグをするときに、「Debug」の時はDevToolsを表示、「Release」の時はDevToolsを非表示のように構成で処理を分ける方法

## launch.jsonを修正
（launch.jsonについては「[Electronの環境構築とVisual Studio Codeでデバッグする方法](https://qiita.com/H-A-L/items/657d4dc75b17918a31e8#vscode%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E8%A8%AD%E5%AE%9Awindowsmac%E5%85%B1%E9%80%9A)」を参照）

「Debug」と「Release」用に構成を2つ作る

```launch.json
"configurations": [
        {
            "name": "Debug",
            "type": "node",
            "request": "launch",
            "cwd": "${workspaceRoot}",
            "program": "${workspaceRoot}/src/main.js",
            "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron",
            "runtimeArgs": [
                "--enable-logging"
            ],
            "args": [
                "."
            ],
            "windows": {
                "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd"
            },
            "console":"integratedTerminal",
            "env": {
                "NODE_ENV": "debug",
            }
        },
        {
            "name": "Release",
            "type": "node",
            "request": "launch",
            "cwd": "${workspaceRoot}",
            "program": "${workspaceRoot}/src/main.js",
            "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron",
            "runtimeArgs": [
                "--enable-logging"
            ],
            "args": [
                "."
            ],
            "windows": {
                "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd"
            },
            "console":"integratedTerminal",
            "env": {
                "NODE_ENV": "release",
            }
        }
    ]
```

「[Electronの環境構築とVisual Studio Codeでデバッグする方法](https://qiita.com/H-A-L/items/657d4dc75b17918a31e8#vscode%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E8%A8%AD%E5%AE%9Awindowsmac%E5%85%B1%E9%80%9A)」で書いた設定と変わっているところは以下

```
// Debugの方
・・・
          "env": {                 // ← 追加
         　　"NODE_ENV": "debug",  // ← 追加
          }                        // ← 追加
      },
・・・
```
```
// Relaseの方
・・・
          "env": {                 // ← 追加
             "NODE_ENV": "release",// ← 追加
          }                        // ← 追加
      }
・・・
```

###（例）「Debug」の時はDevToolsを表示

```main.js
・・・
  if (process.env.NODE_ENV === "debug") {  // ←追記
    mainWindow.openDevTools();
  }                                        // ←追記
・・・
```
こうすることで、「Debug」のときはDevToolsが表示され、「Release」の時はDevToolsは表示されなくなる。
mongooseで地理情報を扱う(aggregate().near())

#前提
 - MongoDB Serverがローカルで動作している前提
 - 動作確認環境
   - Windows10, VSCode
   - Node v8.11.3
   - "mongodb": "3.1.6",
   - "mongoose": "5.3.1",
 - 参考
  - [第9回　MongoDBの地理空間インデックス](http://gihyo.jp/dev/serial/01/mongodb/0009)
  - [[MongooseAPI] Aggregate.prototype.near()](https://mongoosejs.com/docs/api.html#aggregate_Aggregate-near)
  - [[MongoDB]$geoNear (aggregation)] (https://docs.mongodb.com/manual/reference/operator/aggregation/geoNear/)

#概要
いろいろあるけど、Aggregateの$geoNearを使うと距離も取得できていい感じ
Mongooseではnearなので注意。なぜgeoNearではないのかは不明

# サンプルソース
mongoose接続情報、省略

Mongoose Model Place 

```javascript:../models/place
const mongoose = require('mongoose')
const Schema = mongoose.Schema;
const geoSchema = new Schema({
  type        : { type : String   , default : 'Point'},
  coordinates : { type : [Number] , default : [0,0] }
});

const placeSchema = new Schema({
  place_id   : { type : String, required : [false, 'Place id is required'], default:'new' },
  place_name : { type : String, default:'new place' },
  location   : { type : geoSchema , index: '2dsphere', default: geoSchema },
  lastupdate : { type : Date, default: Date.now},
});

const Place = mongoose.model('Place', placeSchema);
module.exports = {Place}

```

```javascript:実行用ファイル
require('../config/config.js')
const { mongoose } = require("../db/mongoose");
const { Place } = require("../models/place");

//サンプルデータ定義
// http://gihyo.jp/dev/serial/01/mongodb/0009
const places=[
  { place_id : '1', place_name : '五反田',  location:{ type:'Point', coordinates:[ 139.723822, 35.625974 ]}},
  { place_id : '2', place_name : '恵比寿',  location:{ type:'Point', coordinates:[ 139.710070, 35.646685 ]}},
  { place_id : '3', place_name : '新宿',    location:{ type:'Point', coordinates:[ 139.700464, 35.689729 ]}},
  { place_id : '4', place_name : '新大久保',location:{ type:'Point', coordinates:[ 139.700261, 35.700875 ]}},
  { place_id : '5', place_name : '池袋',    location:{ type:'Point', coordinates:[ 139.711086, 35.730256 ]}},
  { place_id : '6', place_name : '上野',    location:{ type:'Point', coordinates:[ 139.777043, 35.713790 ]}},
  { place_id : '7', place_name : '品川',    location:{ type:'Point', coordinates:[ 139.738999, 35.628760 ]}}
]
// テーブル初期化
async function populatePlaces()  {
  await Place.deleteMany({});
  await Place.insertMany(places);
}

//近い順にPlaceデータ取得　GeoNear(aggregate) 
//https://mongoosejs.com/docs/api.html#aggregate_Aggregate-near
async function geonear(limit){
  const results = await Place.aggregate()
  .near({
    near: { type : "Point", coordinates: [139.701238, 35.658871] },  //渋谷駅
    spherical: true, 
    distanceField: "distance", //メートル
  })
  .limit(limit)
  console.log(results)
}

//メイン関数
async function main(){
  await populatePlaces() //コレクション初期化
  await geonear(3)  //近い方から3つ表示
}
main()
```
#実行結果
恵比寿、新宿、五反田が帰ってくる。
距離はdistanceにメートルで保存されている。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158724/9408a332-69f8-103f-d29d-9f976a19937c.png)

以上。
Volleyの同期処理を試そうとして詰まった件(Java)

# 同期処理を試す

Volleyでも同期処理ができるという情報をもとに、以下の様なソースを実行させました。

```gradle:app/build.gradle
dependencies {
    implementation 'com.android.volley:volley:1.1.1'
}
```

```java:MyActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String url = "https://example.com/";

        RequestFuture<String> future = RequestFuture.newFuture();
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url, future, future);

        RequestQueue queue = Volley.newRequestQueue(MyActivity.this);
        queue.add(stringRequest);

        try {
            String result = future.get(10000, TimeUnit.MILLISECONDS);
            Log.d(TAG, result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
```

# タイムアウトが発生

java.util.concurrent.TimeoutExceptionが発生します。
Logcatを読んでも例外が投げられたとしか分からないため原因が見えず。

# 非UIスレッドで実行（解決）

Android3.0以降、UIスレッドで同期処理を実行するとNetworkOnMainThreadExceptionが発生します。
どうやらVolleyの場合は落ちずにタイムアウトになるようです。
※厳密には別の原因かもしれませんが不明

AsyncTaskを使って以下のように書き換えると、正常に取得できました。

```java:MyActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        new AsyncTask() {
            @Override
            protected Object doInBackground(Object[] objects) {
                String url = "https://example.com/";

                RequestFuture<String> future = RequestFuture.newFuture();
                StringRequest stringRequest = new StringRequest(Request.Method.GET, url, future, future);

                RequestQueue queue = Volley.newRequestQueue(MyActivity.this);
                queue.add(stringRequest);

                try {
                    String result = future.get(10000, TimeUnit.MILLISECONDS);
                    Log.d(TAG, result);
                } catch (Exception e) {
                    e.printStackTrace();
                }

                return null;
            }
        }.execute();
    }
```
【雑記】TS準備いろいろ


### typescript の環境を用意した

```javascript
$ node -v
$ npm -v

# install
$ sudo npm install -g typescript

# check
$ tsc -v
Version 3.1.1

# http-serverを用意
$ sudo npm install -g http-server

# サーバー起動
$ http-server -o # オプション -o をつけるとデフォルトブラウザで起動するらしい

```

---

### REF

ts準備
http://fnya.cocolog-nifty.com/blog/2018/02/typescript-d0e2.html

vscode準備
https://qiita.com/takao_mofumofu/items/4f8d365846e2f770bd6e
http://www.cross-platform-blog.com/tools/nodejs/typescript/visual-studio-code-nodejs-with-typescript-and-debugging/
https://fettblog.eu/typescript-node-visual-studio-code/
pomera DM200のLinuxでスマホをマウスにする方法

※最初から書き直した[改訂版](https://qiita.com/riafeed/items/e056354360e4c0f3aab5)がありますのでそちらをどうぞ。


#概要
ご存知の通りポメラにはポインティングデバイスが付いていませんが、Linux上で手持ちのスマホをマウスというかタッチパッド代わりにしてマウス操作できるようにするためのメモ

#選定
実はアップストアなりグーグルプレイなりを見てみるとわかるとおりPCを対象にしたリモート操作アプリはそれはそれはもうたくさん存在するのですが、性質上PCにサーバーソフトを導入しなければならず、大半はWindows専用でLinux対応でもJavaを利用していたり、tar.gzアーカイブだけだったり（対象がX８６、ARM６４っぽいし）、ソースコードだけだったりど導入が面倒そうなものばっかりだったのでひとまずaptとまでは言わないからdebになっているものはないかといろいろ探してみた結果サーバーソフトがdebになっており、ためにし導入したらあっさり使えるようになったものが見つかったのでこの記事を書いております。

#インストール
というわけで、上記の条件に合致した「[Unified Remote](https://www.unifiedremote.com/)」をスマホとポメラ両方にインストールします。

スマホの方はアップストアなりグーグルプレイなりで検索してインストールしてください。
なお、このアプリは無料版のある有料アプリ（Android版は執筆時点で￥470）です、マウス操作だけなら無料版でもできますが広告や有料版の購入を勧めるメッセージが出ますのでそういうのが嫌いな人は他のアプリをさがしましょう。

ポメラの方にもサーバーソフトをイントールします。WebサイトにRaspberry pi版のdebパッケージがありますのでダウンロードするか、コマンドラインで

```
＄wget https://www.unifiedremote.com/download/rpi-deb
```

でdebパッケージをダウンロードして、dpkgでインストールするだけです。

```
$sudo dpkg -i rpi-deb
```

#使い方
リモートコントロールソフトはどれも概ねそうなのですが、使うためにはスマホとポメラを両方とも同じWifiネットワークに接続しておく必要がありますので注意してください。

インストールするとアプリケーションメニューに追加されますので起動します、
このソフトはWebブラウザ上で設定する作りになっていますのでブラウザが起動しますがひとまずは何も設定しなくてもいいのでそのまま閉じます。

スマホの方もアプリを初回起動するとgoogle経由のサインアップを求められますが、スキップできますのでスキップします。
すると、接続先の一覧が出ますのでうまく行っていれば候補の中にdm200というのがあるはずなのでそれを選びます。

接続できればいろんな操作項目がでてきますが、その中の「Basic Input」というのがマウスというかタッチパッドになりますので、操作してマウスポインタが動くかどうか試してみてください。

#最後に
というわけで、サーバーソフトがポメラに簡単に導入できることを最優先にアプリを探したのですが、このアプリは有料であることもありリモートコントロールアプリとしては個人的には正直微妙だと思っています。用途としては無駄に多機能すぎでテキスト入力も日本語に対応していないため使い物になりません、これがきちんとできるようならスマホを通じてポメラに音声入力なんてこともできたのですが・・・(謎

それにしてもキーボードのマウスエミュレーションに比べたら快適さは段違いですので選択肢の一つとして考慮の余地はあると思います。
初めて技術書典に参加した所感

# 概要

ある勉強会で技術書典の存在を知り、2018/10/8の技術書典5に初めて参加してきました。
色々な面で、エンジニアにとって刺激的なイベントだと思ったので、参加時の所感や様子をまとめます。

# 技術書典とは

[技術書典](https://techbookfest.org)は、ITエンジニア向けの技術書系同人誌の即売会イベントです。

> 技術書典とは？
新しい技術に出会えるお祭りです。 
技術書典は、いろんな技術の普及を手伝いたいとの想いではじまりました。 
技術書を中心として出展者はノウハウを詰め込み、来場者はこの場にしかないおもしろい技術書をさがし求める、技術に関わる人のための場として『技術書典』を開催します。


ちなみに、今回私が参加した[技術書典5](https://techbookfest.org/event/tbf05)は以下の通りで、
出版されている本を見に行く一般参加の場合、特に費用はかかりません。

> 日時 2018/10/08 (月) 11:00〜17:00
場所 池袋サンシャインシティ2F 展示ホールD（文化会館ビル2F）
主催 TechBooster/達人出版会
一般参加 無料

詳しくは知らないのですが、過去の開催スパンを見る限り、半年に1回ペースで開催みたいです。


# 行ってよかったこと

私が行ってよかったと感じたことは以下の4点です。

1. 先端技術の知見が得られる
 - あまり日本語情報でまとまっていなような新しめの情報が手に入る
 - ただし、同人出版であるため、情報は自身で精査する必要がある
 - そのため、ある程度前提知識がある分野でないと危険で、新しい分野の情報収集には向いてないかも
1. 技術的な視野が広がる
 - 自分の業務領域以外の技術本が多く、トピック的にトレンドが分かる
 - ちゃんと数えてはないですが、例えば、今回はXR系のサークルが結構多かったように感じました
1. 作者と技術的な話ができる
 - サークルが混んでなければ、本の内容に関連した議論や質問、またそれに限らない雑談ができます
1. (企業出展の場合)企業内の話を聞けることもある
 - ↑に関連しますが、企業内の有志によるサークルもいくつかあり、各企業エンジニアと直接お話しすることができます
 - 技術導入等の話を聞くのも勿論いいですが、他企業文化に触れられるのも色々な意味でプラスになります
 - 第4回から第5回にかけてスポンサー企業が増えており、更に今回はTwitter上でなかなか話題になっていたと感じるので、次回以降更に企業数が増えてくるかも

# 現地の話

[Twitterの検索結果](https://twitter.com/search?q=%23技術書典)や[リアルタイム検索の検索結果](https://search.yahoo.co.jp/realtime/search?p=%23技術書典)などを見れば分かりますが、
私の想像より大幅に人が多かったです。

私は、開場時間の11時を少し過ぎ頃に池袋に到着しましたが、その時点で行列ができているとTwitterで確認し、しばらく買い物や昼食で時間を潰しておりました。
「そろそろ行くかー」と12時30分頃に会場へ行ったところ、入場待機列が短かったので、そのまま整列して入場しました。
私が入場した後の13時前くらいに入場規制がなくなったみたいです。

入場後は、事前チェックしていた20程度のサークルを中心に、大体1時間程度で全て見て周りました。
全体のサークルに対して、20はあまり多くないかと思いますので、おそらくもう少し時間かかるかと思います。

# 参加時に感じたこと

もし今後初めて参加する人がいらっしゃれば、意識したほうがいいことをまとめておきます。
この辺りは、(参加したことないけど)一般的な同人誌即売会と似た部分があるかもしれません。

何かお役に立てばご参考ください。

## 準備

1. サークルチェック
 - 必須ではないが、ある程度目的を絞り込むために、事前に確認しておく
 - 会場は混み合うので、落ち着いて見て回ることができないためである
 - 技術書典では、webアプリ上でログインすると、サークルのチェックリストを作成して、現地で参照することができる　すごく便利

1. お金の用意
 - 大体の販売価格は、500円か1000円なので、500円玉や1000円札をある程度用意しておく
 - もっと細かい価格の本も存在するが、その場合、お釣りがある程度用意されているはずなので、とりあえず1000円単位で支払いできれば(多分)大丈夫
 - 現地で欲しくなるものもあるはずなので、購入予定の冊数の1.５倍くらいの1000円札があれば安心？
 - 技術書典のアプリで「かんたん後払い」という電子決済が提供されているので、事前に導入しておくと良いかも

1. 買った本を入れるエコバック等を持参する
 - 紙の本はかさばる上に重いので、持ち運び手段が必須
 - 一方で、会場は人が多いため、身軽な格好な方が良く、トート系のエコバックが多分ベスト
 - 現地でバッグを販売しているサークルがあり、そこで購入するのもありだが、持って行くのが無難

## 当日

1. (紙媒体で欲しい場合)早めに会場入りする
 - ほとんどのサークルは、大量に紙媒体を用意しないので、お早めに
 - ただし、会場直後の一般入場には、相当早い時間に並ばないと難しい
 - 感覚的ですが、マネジメント系やキャリアアップ系は人気が高く売り切れていた印象
 - 大体は電子版が用意されてるようなので、こだわりがなければ午後からゆっくり来訪でも問題なさそう

1. 迷ったら(お金が許す限りは)購入する
 - 基本的に、イベント後は購入できないものなので、迷った場合は購入が吉
 - 情報収集の機会損失と500~1000円の金銭的な損失を比較する


# おまけで戦利品

(順不同)

- [Kaggleのチュートリアル第２版
](https://techbookfest.org/event/tbf05/circle/31060003)
- [教育心理学を学ぶ会 会報 2018秋](https://techbookfest.org/event/tbf05/circle/53230003)
- [秒速DEEP LEARNING - Colaboratoryで入門〜応用ひとっ飛び
](https://techbookfest.org/event/tbf05/circle/30510005)
- [科学するコンピュータ将棋](https://techbookfest.org/event/tbf05/circle/53170003)
- [FiNC Technologies TECH BOOK EDITION](https://techbookfest.org/event/tbf05/circle/26870008)
- [出版社から技術書を商業出版をする方法を出版社の社長がそっと教えます](https://techbookfest.org/event/tbf05/circle/47050001)
内蔵HDDデータ吸い上げ@マシン（マザーボード？）が壊れた場合

# 内蔵HDDデータ吸い上げ@マシンが壊れた場合

HDDの故障ではなく，マシンの電源がつかなくなり，データだけ吸い出した時の作業ログ．

今回のケースでは，centosが壊れ，ubuntuでバックアップを取った．

## 内蔵HDDの脱着

- 内蔵HDDの取り出し
- SATAケーブルを用いて別のLinuxマシンに内蔵HDDとして装着

## LVMボリュームの確認

- rootになり`fdisk -l`で装着したHDDがどれか確認（たとえばsdb2）
- `pvscan`や`lvscan`でロジカルボリューム名を確認
- 今回のケースの場合，他のdiskとロジカルボリューム名の重複があった．

## LVMボリューム名の変更

-   そこで，`vgdisplay`を用いて変更したいボリュームのUUIDを調べる．
-   `vgrename my-vg-id newname`でボリューム名を変更する
-   `vgchange -ay`でボリュームをactivateする．
-   `lvscan`でactivateされたことを確認する．

## マウント

- `mount /dev/VolGroupName/home /media/tmpxi02`

## データの吸い上げ（バックアップ）

マウント先のマシンで、rsync なり、なんなりで、他のストレージにデータをコピーする。
Railsアプリケーション内のデータベース

##疑問
Railsアプリケーションの中のデータベースってどうなってるの？

##答え
Railsでは運用環境ごとにひとつのデータベースを持っている。

| 運用環境       | 概要 |  
|:-----------------|:------------------|
| development | 開発環境。通常、開発をする際に使用する環境。 |
| production  | 本番環境。アプリケーションを実際にリリースする際に使用する環境。|
| test        |テスト環境。アプリケーションの動作をテストする際に使用する環境。 |


##疑問
新しくデータベースを作成するにはどうしたら良いの？

##答え
rake db:create　コマンドを実行する。このコマンドは
「database.ymlというファイルの内容に基づいてデータベースを新規作成する」
という機能を持っている。

database.ymlとは、データベースの設定が記述してあるファイルのこと。Railsは開発環境ごとにデータベースを持つので、開発環境の分だけデータベースの設定が記述してある。
jsdoでblockly その6

#概要
blockly turtleやってみた。
kochやってみた。

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/8ebe2f1a-a514-c4ef-738d-d4cc61765f4c.png)


#成果物

https://blockly-games.appspot.com/turtle?level=10#z8y6z7


以上。
bundle updateとは

##疑問
bundle update とは何をしているのか？

##答え
gemfileに記述した内容をGemfile.lockに反映させている。

流れとしては
Gemfileにインストールしたいgemを記述
↓
bundle update を実行
↓
bundle install を実行　(Gemfileの内容に従ってGemをインストール)


bundle installコマンドはbundlerと呼ばれるツールを利用してGemをインストールする
Ruby,Node.js真偽値を得る方法7選

```:ruby
puts (!0)
#=>false
puts (!1)
#=>false
puts (!!0)
#=>true
puts (!!1)
#=>true
puts (!"")
#=>warning string literal in condition
#=>false
puts (![])
#=>false
puts (!{})
#=>false
```

```:Node.js
console.log(!0)
//=>true
console.log(!1)
//=>false
console.log(!!0)
//=>false
console.log(!!1)
//=>true
console.log(!"")
//=>true
console.log(![])
//=>false
console.log(!{})
//=>false
```
1行素数判定 in Python3

[とある記事](https://qiita.com/PYTHONISTA/items/b103ca45183efcc82486)を見たら作りたくなったので。
Python 3.6.0使用。

# まずはニ行
```python
from math import gcd
isprime=lambda x:x>1 and int(x)==x and True not in map(lambda a:gcd(x,a)!=1,range(2,x))
```

## 解説
* 1より大きい
* 整数で
* 「xと2～xまでの整数で、公約数が1でない」ものが存在しない
ものを素数とした。

# gcdを定義する。
```python
gcd=lambda x,y:max(map(lambda p:p if x%p==y%p==0 else 1,range(1,x)))
```

## 解説
xとyを1～pで割っていって、両方のあまりが0になったときのpを記録したmapの最大値をmax関数で得ている。


# 1行素数判定
文字数で言えば132文字です。

```python
isprime=lambda x:x>1 and int(x)==x and True not in map(lambda a:max(map(lambda p:p if x%p==a%p==0 else 1,range(1,x)))!=1,range(2,x))
```

# テスト
```python
>>> isprime(1)
False
>>> isprime(2)
True
>>> isprime(3)
True
>>> isprime(4)
False
>>> isprime(5)
True
>>> isprime(6)
False
>>> isprime(3.14)
False
```
abc 081

B
黒板に N 個の正の整数 A1,…,AN が書かれています．
すぬけ君は，黒板に書かれている整数がすべて偶数であるとき，次の操作を行うことができます．
黒板に書かれている整数すべてを，2 で割ったものに置き換える．
すぬけ君は最大で何回操作を行うことができるかを求めてください．

既視感of既視感

```
#include<iostream>
using namespace std;
int main() {
	int N;
	int A[210];
	cin >> N;
	for (int i = 0; i < N; ++i) {
		cin >> A[i];
	}
	int ans = 0;
	for (int j = 0; j < 1000000000; ++j) {
		for (int i = 0; i < N; ++i) {
			if (A[i] % 2 != 0) {
				cout << ans;
				return 0;
			}
			A[i] /= 2;
		}
		ans++;
	}
	return 0;
}
```
無理やり通した

```
#include<iostream>
using namespace std;
int n;
int A[210]; //最大200なので余裕を持って210

int main() {
    cin >> n;
    for (int i = 0; i < n; i++)cin >> A[i];

    int res = 0;

    //操作が行える限り操作を繰り返す
    while (true) {
        bool exist_odd = false;
        for (int i = 0; i < n; ++i) {
            if (A[i] % 2 != 0) exist_odd = true;
        }
        if (exist_odd) break;//奇数があったらbreak

        //操作を行えるなら操作を実際に行う
        for (int i = 0; i < n; ++i) {
            A[i] /= 2;
        }
        ++res; //操作回数をインクリメント
    }

    cout << res << endl;
    return 0;
}
```
奇麗な解答

C
高橋君は，N 個のボールを持っています． 最初，i 番目のボールには，整数 Ai が書かれています．
高橋君は，いくつかのボールに書かれている整数を書き換えて，N 個のボールに書かれている整数が K 種類以下になるようにしたいです．
高橋君は，少なくとも何個のボールの整数を書き換える必要があるでしょうか？
制約
1≤K≤N≤200000
1≤Ai≤N
与えられる数値はすべて整数

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int main() {
	int N, K;
	cin >> N >> K;
	int a;
	vector<int>v(N);
	vector<int>flag(N+1,0);
	for (int i = 0; i < N; ++i) {
		cin >> a;
		v.at(i) = a;
		flag.at(a)++;
	}
	sort(v.begin(), v.end());
	sort(flag.begin(), flag.end());
	int sum = 1;
	int count = 0;
	for (int i = 0; i < N-1; ++i) {
		if (v[i] != v[i + 1])
			sum++;
	}
	if (sum <= K) {
		cout << 0 << endl;
	}
	else {
		for (int i = 0; i < N ; ++i) {
			if (flag[i] > 0) {
				sum--;
				count += flag[i];
			}
			if (sum <= K) {
				break;
			}
		}
		cout << count << endl;
	}
	return 0;
}
```
AWS WAF

# AWS WAFとは
ウェブアプリケーションファイアウォールサービスです。


# 機能

- 悪意のあるリクエストをブロックする。
- カスタムルールに基づいたWebトラフィックをフィルタする。
- リクエストに対してのモニタリング機能を提供する。

![スクリーンショット 2018-10-08 18.05.10.png](https://qiita-image-store.s3.amazonaws.com/0/280929/b4bbc868-900f-4c36-2930-428a222702b0.png)

# コンポーネント

![スクリーンショット 2021-04-12 19.51.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/e44c638e-7242-a0a6-2326-63ebdba28a65.png)

# Web ACL

- **Web ACL**はルールを入れる設定の単位。
- ルール内の**ステートメント**により、リクエストを検査するための条件が定義され、**アクション**によって条件に一致したリクエストの処理(Allow/Block/Count)が行われる。
- Web ACL内のルールは優先度を指定可能であり、どのルールにも一致しない場合は、**デフォルトAction**が適用される。
- 1つのWeb ACLにつき、WCUは5000まで。

![スクリーンショット 2021-04-12 21.06.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c03a25dd-e4f0-cfaf-6f14-dc6c8ba2803b.png)

# ルールステートメント

- 一致ステートメント：ウェブリクエストまたはその送信元を、指定された条件と比較する。
- 論理ステートメント：AND、NOT、ORを指定可能。
- 複雑なステートメント：レートベース、ルールグループ

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/waf-rule-statements-list.html

## レートベース

- 5 分間あたりの同一IPアドレスからのリクエスト数が設定された閾値を超過したら、Block/Countする。
- ルール作成時にデフォルトの`Regular rule`から`Rate-based Rule`へ選択することで利用可能。

## ルールグループ

- 複数のルールを組み合わせたルールグループを自分で作ることが可能。
- ルールグループ作成時にWCUの値を設定する必要がある。（1回設定したら変更できない。）

# マネージドルール

## AWSマネージドルール

- AWSが提供するビルトインのルールセット

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-list.html

# JSON 解析および検査

[[2021/02/12]AWS WAF が JSON 解析および検査のサポートを追加](https://aws.amazon.com/jp/about-aws/whats-new/2021/02/aws-waf-support-json-body-inspection/)

リクエストbodyの JSON コンテンツを解析出来るようになりました。
WAFのルールを設定することで、特定のキー、値を検査し、有効なjson構文になっているかをチェックして、APIを保護することができます。

有効にするには、ルールステートメントを定義するときに、JSON 本文として一致するフィールドを設定します。
JSON Pointer 構文を使用して、検査の特定のキーまたは値を選択するか、JSON 内のすべてのキーと値のペアを検査します。
unordered_map のキーに自作クラスを設定したとき、erase メソッドが使えないときの対処法 (かと思ったらただのミス)

## 20181008 追記
コメントにてpegacornさんにご指摘いただいた通り、const修飾をしたら難なくコンパイルが通りました！ 
問題のコードの演算子オーバーロード部を以下の通り記述すればOKです。

``` c++
bool operator==(const Color &arg) const {
    return this->r == arg.r && this->g == arg.g && this->b == arg.b;
}
```

大変お騒がせいたしました。一応教訓ということでこの記事は残させていただきます。(一応僕の方法でも正規ではないですがコンパイルは通ります、確実に非推奨だと思いますが...)
pegacornさん、ありがとうございました！


## 症状
[unorderd_setやunorderd_mapのキーに任意のクラスを渡す](https://qiita.com/izmktr/items/8e0fd1b6e37de59a9bd0)や、[自作クラスをunordered_mapに突っ込む](https://odan3240.hatenablog.com/entry/2016/03/31/223906)という記事を参考にさせていただき、unordered_mapのキーに自作クラスを設定したが、このクラスのインスタンスで`erase(hoge)`メソッドを呼んだとき、 `Invalid operands to binary expression` というエラーが発生した。

## 環境
Xcode 10.0
clang-1000.11.45.2

## 問題のコード
色情報の整数値 r, g, b をフィールドにもつクラスを想定
`include` `using`は適当にお願いします

``` c++
class Color {
public: 
    int r;
    int g;
    int b;
    
    // コンストラクタ
    Memo() {
        r = g = b = 0;
    }
    
    // 記事を参考に演算子オーバーロード

    bool operator!=(const Color &arg) {
        return !(*this == arg);
    }
};

// 記事を参考にハッシュ関数を実装
namespace std{
    template<>
    class hash<Memo>{
    public:
        size_t operator()(const Color &color) const {
            size_t seed = 0;
            auto r_hash = hash<int>()(color.r);
            auto g_hash = hash<int>()(color.g);
            auto b_hash = hash<int>()(color.b);
            
            seed ^= r_hash + 0x9e3779b9 + (seed << 6) + (seed >> 2);
            seed ^= g_hash + 0x9e3779b9 + (seed << 6) + (seed >> 2);
            seed ^= b_hash + 0x9e3779b9 + (seed << 6) + (seed >> 2);
            return seed;
        }
    };
}
```

## 問題点
`erase(hoge)` はどうやら、
`bool operator==(const Color &left, const Color &right) {};`
という、引数を2つ取る演算子を利用するらしく、これが未定義のためにメソッドが解決できなかった。

## 対処法

以下の記述を追加

``` C++
bool operator==(const Color &left, const Color &right) {
    return left.r == right.r && left.g == right.g && left.b == right.b;
}
```

## 結局の所
エラーメッセージと該当箇所をよく読んだら分かる話でした。
新しい現場で必要になるチェックリスト

新しい現場で必要になるチェックリストを作成しました。
暇なときにアップデートしていきます。

# ルール
- [ ] 勤怠
- [ ] 検証端末
- [ ] コーディングガイドライン
- [ ] ソースコード
- [ ] チェックシート
- [ ] 定例MTG
- [ ] ステークホルダー
   - [ ] フロント
   - [ ] デザイナー
   - [ ] バックエンド
   - [ ] プランナー/ディレクター
   - [ ] 仕様に詳しいベテランさん

------------

# Macの基本設定
- [ ] アップデート（バージョアップは注意）
- [ ] 最適化
- [ ] Wifi接続
- [ ] よく使うツールはDockに追加
- [ ] [ショートカットキー](https://lblevery.com/sfn/work/mac-work/shortcut-key/)
- [ ] [ショートカットキーの変更](https://pc-karuma.net/mac-keys-modifiers-switch-command-control-caps/)
- [ ] ディスプレイ > 配置 > ミラーリングオフ
- [ ] スリープ
- [ ] キーボード反応速度
- [ ] コミュニケーションツールの通知設定

参考
[Macの動作が重いと感じた時のメンテナンス方法&高速化に役立つアプリ30選](https://biz.moneyforward.com/blog/17499)
[私が月に1度やってるMacのメンテナンス方法](https://stocker.jp/diary/mac-maintenance/)

------------

# 開発環境構築
## ツール
- [ ] コミュニケーションツール
   - [ ] Slack
   - [ ] チャットワーク
- [ ] タスク・プロジェクト管理ツール
   - [ ] jira
   - [ ] Trello
   - [ ] スプレットシート
- [ ] ブラウザ（検証端末は確認）
   - [ ] PC
      - [ ] Google Chrome 最新版
      - [ ] Safari 最新版
      - [ ] Mozilla FireFox 最新版
      - [ ] VirtualBox
         - [ ] Internet Explorer10
         - [ ] Internet Explorer11
         - [ ] Microsoft Edge
   - [ ] [SP](https://www.tam-tam.co.jp/tipsnote/html_css/post14411.html)
      - [ ] ios 9.2系 or 10.3系 〜
      - [ ] Android 4.4系 or 5.1系 〜
- [ ] FTP
   - [ ] クライアントツール（filezillaなど）
   - [ ] 各案件・環境で接続
- [ ] デザインツール
   - [ ] Photoshop
   - [ ] Illustrator
   - [ ] XD（無料 体験版）
- [ ] git
   - [ ] [CUI](https://qiita.com/uecyan0826/items/63b9367e25d066dc80eb)
   - [ ] [gitの小技](https://github.com/isotai/git-tips#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%AE%E5%A4%A7%E6%96%87%E5%AD%97%E5%B0%8F%E6%96%87%E5%AD%97%E5%A4%89%E6%9B%B4%E3%82%92%E6%A4%9C%E7%9F%A5%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B)
   - [ ] github
   - [ ] [sshの設定](https://qiita.com/colorrabbit/items/6c3e96c394bb0f753ea0)
   - [ ] [こっちのほうがいいかも](https://dev.classmethod.jp/tool/github-ssh-sub-account-setting/)
   - [ ] 案件リポジトリをクローン
   - [ ] sourcetree（念のため）
   - [ ] git全般の設定
   - [ ] [エイリアスの設定](https://qiita.com/uecyan0826/items/63b9367e25d066dc80eb)
   - [ ] tree コマンド
- [ ] エディタ
   - [ ] [VS Code](https://qiita.com/uecyan0826/items/75fe6bf78a743f65bca3)
      - [ ] プラグイン導入
      - [ ] emmetの設定
      - [ ] csscombの設定
   - [ ] Sublime Text

## [フロント開発環境](https://qiita.com/uecyan0826/items/60786577775b22c62e9f)
- [ ] xcode（Homebrewに必要）
- [ ] Homebrew（nodebrewに必要）
- [ ] nodebrew（nodeに必要）
- [ ] 隠しファイル表示（.bash_profileの表示に必要）
- [ ] .bash_profileの設定（nodeのパス合わせに必要）
- [ ] node（npm動かすのに必要）
- [ ] npm（パッケージを使用するのに必要）
   - [ ] エラーが出たらupdate
- [ ] ローカル開発環境
   
## バック開発環境
- [ ] PHP＋Apacheの設定
- [ ] エクリプス


------------

# 参考
エンジニアのためのドキュメントデザイン術（色彩2）

さて、次はモノトーンの文書に一色だけ色をつけてみたいと思います。色を選んでいたらどんどん工数がとられてしまうと言うような状態になるのは、色を感覚で選ぶために発生する思考がまとまらない状態、思考が迷路に迷い込んだ状態です。ああでもない、こうでもないとカラーパレットの色を組み合わせたり、パレットにない色を選んだりし、行ったり来たりを繰り返します。そして、良いものができればいいのですが、納期が来たため納得がいかないまま客先にもっていくということもあるかもしれません。こういうところでの苦労って疲れるし時間も取られるし、可能ならやりたくないですよね。

### Technique.2 役割分担と作業化で一人二役

上記は、色彩のテクニックと言うより、デザイン的な業務をどう捉えるかという基本原則のようなもので、色彩のコーナーに書くかどうか大変迷いました。色彩編とはちょっと異質ですが、一旦、ここで取り上げたいと思います。

ウェブデザイン会社や広告・雑誌のデザインや編集をやっているならともかく、エンジニアと営業担当で組織されたチームにおいては、提案書や要件定義書の作成で専属デザイナーがいることは皆無かと思います。しかし、一旦それは置いておき、エンジニアである自分自身をデザインのディレクターと着色を行うデザインオペレータとしての役割を与え、一人二役でそれぞれの立場を演じてみたいと思います。

[1] ディレクターは主役となるカラーを選定します。
[2] デザインオペレータはそれは指示書に書かれている通りに着色します。

#### 実際の着色作業

まず、下記のイメージに着色したいと言うゴールがあります。
![color1-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/291694/4543f1b4-93bb-0ca4-165d-0a0a8fb7cb2b.png)

実際に作業を進めましょう。
※どの色を使うべきか、どの色が相応しいかについて、色の選定はまたの機会とします。
　

◆ディレクター１
この指示書に従って作業をお願いします。
![color1-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/291694/911923f2-b546-7972-9475-d458a5ca4bd5.png)
◆オペレータ１
指示通りに着色しました
![color1-3.PNG](https://qiita-image-store.s3.amazonaws.com/0/291694/a125c7d4-5757-5307-11cf-cce5529d9cee.png)

　

◆ディレクター２
この指示書に従って作業をお願いします。
![color1-4.PNG](https://qiita-image-store.s3.amazonaws.com/0/291694/72937302-3235-69f9-909d-98457a6da145.png)
◆オペレータ２
指示通りに着色しました
![color1-5.PNG](https://qiita-image-store.s3.amazonaws.com/0/291694/9b95be61-ce61-b6f4-c466-269211b30216.png)
　
上記のように色彩を決めてしまい指示として落とし込みますと、後は指示書に従って淡々と作業を進めるのみです。以前のように、でたらめに色を付けたり消したり、色のパレットを行ったり来たり、あるいは色彩の選定のためカラーチャートの微調整でイライラすると言ったこともなくなるかと思います。システマティックなドキュメントのデザインはもはやセンスでもなく、試行錯誤でもなく、ただディレクション通りに色を着色するだけのオペレーション業務となります。自身の中にこの２つの役割分担を持つことを明確に意識している時と、そうでない場合では、ドキュメントデザインへの取り組み方が大きく変わってくるとかと思います。

　
ポイント
・1人である自分自身をデザインディレクターとオペレータに役割分割する
・それぞれの分担に従って淡々と作業を進める
　
※どの色を選び、どう組み合わせるかはまた別の記事で

### 付録

◆本連載の目次はこちら
https://qiita.com/sutton/items/8343491cf1f9b3f65129
AWS Shield

#1.AWS Shieldとは？#

- DDos攻撃対応のサービスです。





#2.サービス攻撃を狙ったDDos攻撃例(参考)#

- いずれもサービス停止を狙う！

![スクリーンショット 2018-10-08 17.35.40.png](https://qiita-image-store.s3.amazonaws.com/0/280929/f70701e6-c350-7c01-651a-3b431450d50b.png)





#3.特徴#

- すべてのパケットが検査されます。
- 検査には学習アルコリズムでスコアリングされ、スコアリングの結果をもとに攻撃を防御する。





#4.サービス停止抑止のためのベストプラクティス#

- DDos対策製品（AWS Shield）を利用する。
- AmazonCloudFrontを使って、攻撃を分散し、被害を最小化にする。

![スクリーンショット 2018-10-08 17.50.28.png](https://qiita-image-store.s3.amazonaws.com/0/280929/11949e5f-d6c5-0b05-ed55-af136426d067.png)



#5.Standard と Advanced#

- 次のページにStandard と Advancedの比較があるので、そちらを確認すると良い。

https://aws.amazon.com/jp/shield/getting-started/
abc 078

B
幅 X センチメートルの椅子があります。 この椅子に座りたい人がたくさんおり，人は椅子に座ると必ず Y センチメートルの幅を使って座ります。
出来る限りたくさんの人を椅子に座らせたいですが， 人はみなシャイなので，人と人の間，また椅子の端と人の間には， 少なくとも Z センチメートル間を開ける必要があります。
最大で何人座ることができますか？

```
#include<iostream>
using namespace std;
int main() {
	int X, Y, Z;
	cin >> X >> Y >> Z;
	for (int i = 0; i < X; ++i) {
		if (i*Y + (i + 1)*Z > X) {
			cout << i - 1 << endl;
			break;
		}
	}
	return 0;
}
```
高橋くんはプログラミングコンテストに出ていますが， YES か NO で答える問題でTLEしてしまいました。
提出の詳細を見ると，テストケースは全てで N ケースあり，そのうち M ケースでTLEしていました。
そこで高橋くんは, M ケースではそれぞれ実行に 1900 ms かかって 1⁄2 の確率で正解し， 残りの N−M ケースではそれぞれ実行に 100 ms かかって必ず正解するプログラムへ書き換えました。
そして，以下の操作を行います。
このプログラムを提出する。
全てのケースの実行が終わるまで待機する。
もし M ケースのうちどれかで不正解だった場合，もう一度プログラムを提出する。
これを，一度で全てのケースに正解するまで繰り返す。
この操作が終了するまでの，プログラムの実行時間の総和の期待値を X msとした時，X を出力してください。
なお，X は整数で出力してください。

有効なのが来るまでカードを引く期待値は、有効なカードを引く確率の逆数になる。ACできる確率は(1/2)^Mであるため、試行を行う期待値は2^Mとなる。
１回の施行で1900M+100(N-M)msかかるので回数の期待値にこの時間をかければ答え

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int main() {
	int N, M;
	cin >> N >> M;
	int time = 1900 * M + 100 * (N - M);
	int x = 1;
	for (int i = 0; i < M; ++i) {
		x *= 2;
	}
	int ans = time * x;
	cout << ans << endl;
	return 0;
}
````
新しいMacBookProを購入してから行ったこと覚書

# 前書き　
初期化した時に復旧しやすいように。

# 行ったこと
## AppleストアでOS系のアプデ
そのまんま　プリインストールアプリのアプデはとりあえず放置

## 入力切替のショートカットの設定
US配列なので変換キーがない。
タッチバー付きなので一応タッチバーに入力切替ボタンを設置することができるけど
タッチバーはちょっと切替ボタンを置くには遠い。

```
システム環境設定->キーボード->入力ソース->入力モード
カタカナ　のチェックを外す
システム環境設定->キーボード->入力ソース->ショートカット
->Spotlight検索
「Spotlight検索を表示」を⌥　+ space に
システム環境設定->キーボード->入力ソース->ショートカット
->入力ソース
二つの項目ともに⌘+space に。
```
これでひらがなと英字をトグル式に切り替えられるようになる！
ただ１キーで切り替えたい気持ちもあるのでこの辺はまだ改良の余地あり
いい感じの設定あったらぜひ教えてください。

## キー入力速度を変更する
デフォルトのキー入力速度だと遅すぎて、君の居ない世界のスピードについていけないので。

```
システム環境設定->キーボード
どちらのスライダーも右端まで
```
これである程度はついていけるようになりました。


## トラックパッドの設定変更
```
システム環境設定->トラックパッド
クリック スライダーを左端、
起動の速さ を右端。
```
これでついていけますね。

## キー入力速度をさらに早くする
さらに加速しましょう。

#### 繰り返しの認識までの時間
```bash:現在の設定の確認
$ defaults read -g InitialKeyRepeat
```
```bash:設定の変更
$ defaults write -g InitialKeyRepeat -int 13
```

#### 繰り返しの速度
```bash:現在の設定の確認
$ defaults read -g KeyRepeat
```

```bash:設定の変更
$ defaults write -g KeyRepeat -int 1
```

とっても早くなりました。
このスピードなら君のいない世界を追い越せるようになります。
よかったですね。

## メニューバーの設定
メニューバーに残りバッテリーの割合表示と、
日付も表示するようにします。

```
バッテリーアイコンをクリックして割合を表示、
時間をクリックして環境設定開いて日付を表示
```

## コンピュータ名の変更
```
システム環境設定->共有
入力バーからいい感じに変更。
```
その下の（変更）ボタンからアドレスに割り振られる文字列も忘れずに変更しておきましょう。

## ファイアーウォールの設定
```
システム環境設定->セキュリティとプライバシー
ファイアーウォールをオンにしましょう
```

## finderの設定
いろいろやっていきます

```
環境設定->サイドバーにいろいろ表示するように
上の*表示*から色々なバー表示
```


## トラックパッドの強化
Macbookのトラックパッドは極めて優秀ですが、
デフォルトだと２本スワイプ３本スワイプ４本でキュッとやってランチャー開くぐらいしか
優秀なショートカットがありません。
なのでBettertouchtoolというツールを導入します。
[全MACユーザーが恋するBetterTouchTool！究極の３つの設定とは？](https://appleshinja.com/bettertouchtool)
詳細は例のごとく別のサイトへのリンクを残し終わりますが、
Chromeのタブ切替をこちらのツールにてタッチバーのみで行えるような設定にして置くと捗ります。

というかこいつがないとブラウジングができないレベルになってしまいます。
[お前らのTouch Barはダサい - Qiita](https://qiita.com/2357gi/items/8235093de77aa3e5fecc)
別記事にてタッチバーの拡張設定をまとめました。

設定ファイルをgitで管理しているので、cloneして設定を反映しておしまいです。
[any_tool_settings/main.bttpreset at master · 2357gi/any_tool_settings](https://github.com/2357gi/any_tool_settings/blob/master/main.bttpreset)


## その他設定


##　開発環境の整備
### Xcodeのインストール
ストアから落としてくる
インストールが終わったら起動してライセンスに同意したり諸々しておきましょう

### brewのインストール
```bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## Terminalから諸々の設定
defaultsコマンドを利用して細やかな設定をしていきます。
詳細はこちら
[iMac/MacBook購入後に必ず設定したい設定項目 - Qiita](https://qiita.com/ryuichi1208/items/5905240f3bfce793b33d)


わたしの設定コマンドです。shellscriptっぽい顔してますが普通に必要なものだけコピペして実行してます。

https://github.com/2357gi/dotfiles/blob/master/macos.sh

あとは諸々もdotfilesをcloneして諸々をいい感じにシます。

```shell
$bash -c "${curl -fsSL dot.2357gi.com}"
```
コレ一行で環境構築済ませるためにゆっくりと諸々やっているので完成したら追記するか別記事にまとめます
abc 077 lower_bound,upper_bound

B
N 以下の平方数のうち、最大のものを求めてください。 ただし、平方数とは、ある整数の 2 乗として表せる整数のことを指します。

double pow (
    double x,
    double y
);

↑xのy乗

```
#include<iostream>
using namespace std;
int main() {
	int N;
	cin >> N;
	int r = 1;
	while (r*r <= N) {
		r++;
	}
	cout << (r - 1)*(r - 1);
	return 0;
}
```
これで通った

```
#include<iostream>
#include<math.h>
using namespace std;
int main() {
	int N;
	cin >> N;
	for (int i = 1; i <=N; ++i) {
		if (i*i == N) {
			cout << i * i << endl;
			return 0;
		}
		else if (i*i>N) {
			cout << (i - 1)*(i - 1) << endl;
			return 0;
		}
	}
	return 0;
}
```
パターン２



C
今年もすぬけ祭の季節がやってきました。りんごさんは、まず手始めにすぬけ君召喚の儀式を執り行おうと思っています。 儀式には祭壇が必要で、祭壇は上部、中部、下部の 3 つのカテゴリーのパーツ 1 つずつからなります。
祭壇の 3 カテゴリーのパーツがそれぞれ N 個ずつあります。 i 個目の上部のパーツのサイズは Ai 、i 個目の中部のパーツのサイズは Bi 、i 個目の下部のパーツのサイズは Ci です。
祭壇を作るにあたっては、中部のパーツのサイズは上部のパーツのサイズより真に大きく、下部のパーツのサイズは中部のパーツのサイズより 真に大きくなければなりません。逆に、この条件を満たす任意の 3 つのピースを組み合わせて祭壇を作ることができます。
りんごさんが作ることのできる祭壇は何種類あるでしょうか。ただし、2 つの祭壇が異なるとは、上部、中部、下部に使われるピースのうち 少なくとも 1 つが異なることを言います。
制約
1≤N≤105
1≤Ai≤109(1≤i≤N)
1≤Bi≤109(1≤i≤N)
1≤Ci≤109(1≤i≤N)
入力は全て整数である

```
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {

    vector<char> v;
    vector<char>::iterator i;

    for (int j=0; j<26; ++j) {
        v.push_back ('A' + j);
    }

    i = lower_bound (v.begin(), v.end(), 'M');

    while ( i != v.end () ) {
        cout << *i ;
        ++i;
    }
    cout << endl;

    return 0;
}
実行結果は次の通りです。
$ ./a.out
MNOPQRSTUVWXYZ
lower_boundはvalue以上となる最初の要素を指すイテレータを返す
upper_boundはvalueより大となる最初の要素を指すイテレータを返す
```
Ai < Bj < Ck なる組 (i,j,k) の個数を数える問題です。j を固定すれば、求める個数は Ai < Bj なる i の個数と、Bj < Ck なる k の個数の積となります。 よって、全ての j に対し、上述の i,k の個数を数えて掛け合わせ、足し合わせればよいです。 では、i の個数や k の個数はどのように求めればいいでしょうか？　愚直に配列をすべて見る と、O(N2) となり間に合いません。 配列 A,C をあらかじめソートしておきます。すると、i や k の個数は、二分探索を用いて求めるこ とができます。C++ の場合、標準ライブラリに用意されている lower bound 関数や upper bound 関数を用いるのが良いでしょう。 時間計算量は O(NlogN) となり、間に合います。



```
#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;
using ll = long long;
int main() {
	int N;
	cin >> N;
	vector<int>A(N), B(N), C(N);
	int countA = 0;
	int countC = 0;
	int countB = 0;
	for (int i = 0; i < N; ++i) cin >> A[i];
	for (int i = 0; i < N; ++i) cin >> B[i];
	for (int i = 0; i < N; ++i) cin >> C[i];
	sort(A.begin(), A.end());
	sort(B.begin(), B.end());
	sort(C.begin(), C.end());
	ll res = 0;
	for (int i = 0; i < N; ++i) {
		ll na = distance(A.begin(), lower_bound(A.begin(), A.end(), B[i]));
		ll nc = distance(upper_bound(C.begin(), C.end(), B[i]), C.end());
		res += na * nc;
	}
	cout << res << endl;
	return 0;
}
```

```
#include <iterator>
#include <iostream>
#include <vector>
#include <list>

int main()
{
  {
    std::vector<int> v = {3, 1, 4};
    std::size_t d = std::distance(v.begin(), v.end());

    std::cout << d << std::endl;
  }
  {
    std::list<int> ls = {3, 1, 4, 5, 2};
    std::size_t d = std::distance(ls.begin(), ls.end());

    std::cout << d << std::endl;
  }
}

出力

3
5
```
イテレータにおいて、begin()は最初の要素を指すが、end()は末尾の次を指す
Linux(debian)のタッチパッドのタップ反応が微妙に遅いのをなんとかする

これまで何度かPC/MacにLinuxをインストールしてきたのですが、どれも共通して**タッチパッドの反応が他のOSより体感で0.5秒程度遅れている**ように感じていました。そういうものだと諦めて、しばらく放置していましたが、解決法を調べれば、いくつか方法があったようです。

# 解決1：synclientで設定する

synclientで下記を打ち込んでおしまい。


```
synclient ClickTime=0
synclient SingleTapTimeOut=0
```

もともとの数値は180とか100だと思うので、どちらも0にしてしまいます。すると、なんと瞬間的に反応してくれるようになります！うれしい！

ただし、簡単な分デメリットもあり、それは**ダブルタップしてからのドラッグができなくなってしまう**ことです。これのせいで、ドラッグ＆ドロップや文字を選択するということができなくなります。

どうやら``SingleTapTimeout``を0にすると、二回タップしてからのドラッグが機能しなくなるようです。``ClickTime``が0でも、ドラッグ機能が働く数値（150-180）くらいにすると、タッピングの反応の遅さも元に戻ってしまいます。根本的な解決法は今のところ不明で、弥縫策としては、ドラッグを3本指のジェスチャに一任するといった方法しか思いつきません。

# 解決2：マルチタッチドライバ（xf86-input-mtrack）を使う

仕組みはよくわからないのですが、マルチタッチドライバを設定すると、タップ反応良好な状態でダブルタップ＆ドラッグ機能も使うことができました。

正式版は3年前で更新が止まったままなので、フォーク版を使います。``apt``からも入手できるようですが、今回は最新版を``git clone``していきます。

```
git clone https://github.com/p2rkw/xf86-input-mtrack
cd xf86-input-mtrack
sudo apt build-dep xserver-xorg-input-mtrack #未インストールの場合、makeに失敗します
./configure --with-xorg-module-dir=/usr/lib/xorg/modules
sudo make
sudo make install 
```

その後、``/usr/share/X11/xorg.conf.d/50-mtrack.conf``を作成し、下記のように入力します。その後再起動。

```
Section "InputClass"
        MatchIsTouchpad "on"
        Identifier      "Touchpads"
        Driver          "mtrack"
        Option          "TapButton1" "1"
EndSection
```


うまく行かない場合は、``50-mtrack.conf``の数字を増やして``80-mtrack.conf``とかにしてみます。

これでようやっと動いてくれるようにはなりました。
mtrackは3本指や4本指などのジェスチャも色々設定できるようなので、詳しくは[こちらから](https://github.com/p2rkw/xf86-input-mtrack)。

# 解決3：FastTapsを入にする（未確認）

[Arch Wiki](https://wiki.archlinux.jp/index.php/Synaptics_%E3%82%BF%E3%83%83%E3%83%81%E3%83%91%E3%83%83%E3%83%89#.E3.83.9C.E3.82.BF.E3.83.B3.E3.81.AE.E3.82.BF.E3.83.83.E3.83.97.E3.81.A8.E5.AE.9F.E9.9A.9B.E3.81.AE.E3.82.AF.E3.83.AA.E3.83.83.E3.82.AF.E3.81.AE.E9.81.85.E5.BB.B6)によると、``/etc/X11/xorg.conf.d/70-synaptics.conf``にFastTapsオプションをつけるとズレが解消されるそうです。ただ、自分の場合は、これは効果がなく、``synclient -l``で一覧表示しても、FastTapsのパラメータは出てこなかったので、実際にできるかは確認していません。

```
Section "InputClass"
    Identifier "Synaptics Touchpad"
    Driver "synaptics"
    ...
    Option "FastTaps" "1"
    ...
EndSection
```

## 参考

* https://howchoo.com/g/mdy0ngziogm/the-perfect-almost-touchpad-settings-on-linux-2
* https://bbs.archlinux.org/viewtopic.php?id=165077