OmniAICreator/Qiita-1.07M huggingface dataset:
goworkerがCPU使用率100%になってしまう問題

# TL; DR

- `goworker.WorkerSettings.Interval`の値は無効です
- `goworker.WorkerSettings.IntervalFloat`を設定しましょう
- `IntervalFloat`の単位は`秒`です

# goworkerについて
 - https://github.com/benmanns/goworker
 - Goでバックグランドジョブをキューに積みながら実行できるライブラリ

  - サーバーでレスポンスだけ返して処理は非同期実行したいときなどに役立つ
 - Rubyの[Resque](https://github.com/resque/resque)互換らしい

# 今回発生した問題
 - 公式の[Getting Started](https://github.com/benmanns/goworker#getting-started)にしたがってプログラムを実行すると、goworkerのCPU使用率が100%で高止まりすることがある
 - 既知の問題らしくgoworker本家にも2016年に[issue](https://github.com/benmanns/goworker/issues/43)が立っている

# 原因
 - goworkerにはワーカーの設定を記述するための`goworker.WorkerSettings`という構造体が定義されている
 - このうち、Jobのpolling間隔を指定する`WorkerSettings.Interval`の値が`IntervalFloat`の値で常に上書きされている
 - そのため、`IntervalFloat`の指定がないとInterval=0となり、polling関数で遅延無しの無限ループが発生するため、CPU使用率が100%になる

参考:https://github.com/benmanns/goworker/blob/5c718f01cbd12ca8f3bd93bdcbb154264e3d89c0/flags.go#L140

## 解決法
 - `goworker.WorkerSettings.IntervalFloat`にpollingの間隔を指定してやれば良い。
 - `IntervalFloat`の単位は`秒`

## Before
https://github.com/benmanns/goworker#getting-started から引用

```go:worker.go
func init() {
	settings := goworker.WorkerSettings{
		URI:            "redis://localhost:6379/",
		Connections:    100,
		Queues:         []string{"myqueue", "delimited", "queues"},
		UseNumber:      true,
		ExitOnComplete: false,
		Concurrency:    2,
		Namespace:      "resque:",
		Interval:       5.0,
	}
	goworker.SetSettings(settings)
	goworker.Register("MyClass", myFunc)
}
```

## After
```diff:worker.go
func init() {
	settings := goworker.WorkerSettings{
		URI:            "redis://localhost:6379/",
		Connections:    100,
		Queues:         []string{"myqueue", "delimited", "queues"},
		UseNumber:      true,
		ExitOnComplete: false,
		Concurrency:    2,
		Namespace:      "resque:",
-		Interval:       5.0,
+		IntervalFloat:  5.0, // 5.0 sec
	}
	goworker.SetSettings(settings)
	goworker.Register("MyClass", myFunc)
}
```
git commit コマンドを入力したあと git remote add でbitbucket.org にリポジトリを作成してみた。

$git init
$git commit -am "コメント"
問題はこの後、
$git remote add origin git@bitbucket.org:ユーザー名/○○.git
ユーザー名のところは bitbucket.org で設定している自分の名前
○○ のところはリポジトリの名前
$git push -u origin --all
<=================↓エラー↓===========>
git@bitbucket.org: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
<====================================>
この時パーミッションの文のところを理解できず手当たり次第に試してみたらうまくいってしまった。
ssh鍵の再発行
$ssh-keygen -t rsa -C bitbucketに登録してるメールアドレス
全部enter押した
ssh鍵の取得
$cat ~/.ssh/id_rsa.pub
表示された文字をすべてコピペ
ssh鍵をbitbucket.orgに再登録
vimコマンドと呼ばれるものを初めて触った。
$vi ~/.ssh/config
ターミナルみたいなやつが出てきてしたのほうにINSERTみたいな感じで書かれてるときは長文コマンドの入力ができて、一度ESCキーを押すと:wqをおして保存終了ができる流れのようだ。長文コマンドの際に以下を入力

Host bitbucket
  HostName bitbucket.org
  IdentityFile ~/.ssh/id_rsa
  User git
$Esc
$:wq

再度実行
$git push -u origin --all
<=========エラー=====>
Bad owner or permissions on /home/ユーザー名/.ssh/config
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
<====================>
ここでパーミッションに気づく
$chmod 600 ~/.ssh/config
$git push -u origin --all
これでうまくいった。

結論：なんか最後のやつだけでよくないですか？
VS Code でタブとスペースを相互変換する手順とショートカット

## Visual Studio Code でインデントの変換や切り替えのショートカット

> Visual Studio Code (以下 VSCode) でファイルを開いたら**タブ・インデントだったので、スペース・インデントに変換したい**。
> でも、メニューから（マウス操作）でなくショートカットで変換・変更できないか。

[「`VSCode` `タブ` `スペース` `変換`」でググって](https://www.google.com/search?q=VSCode+%E3%82%BF%E3%83%96+%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9+%E5%A4%89%E6%8F%9B)も、「設定からインデント設定を変更する」とか、「`\t`をスペースへ文字列置換する」とかしか出てこなかったので、自分のググラビリティのため。

### TL; DR <sub><sup>（今北産業）</sup></sub>

<font color="darkorange">**デフォルトでショートカットが割り当てられていない**</font>ので、以下の手順で現在のドキュメントのインデントを変換できます。

1. `F1` を押す
2. `indent` と入力し 「インデントをタブに変換」(`Convert Indentation To Tabs`) もしくは「インデントをスペースに変換」(`Convert Indentation To Spaces`)を選択
3. `Enter`

:::note info
私は 「`F1` レースで `indent` が速い」と覚えました。🚗 =3 ﾌﾞｯ
上記でも面倒な場合は、以下の TS;DR を参照してショートカットを割り当てます。
:::

### TS; DR <sub><sup>（ショートカット・キーの割り当て）</sup></sub>

VSCode には「インデントをタブに変換」と「インデントをスペースに変換」のショートカット項目があります。しかし、**デフォルトではショートカットは割り当てられていない**ので、別途割り当てる必要があります。

#### キーボードショートカット設定を開く

- メニューからの場合
    - [`Code`] - [基本設定] - [キーボードショートカット]
- ショートカット（macOSの場合）
    - `command`（⌘）を押しながら `k` → `s`

#### ショートカットの割り当て

1. キーボードショートカットの入力画面で「スペースに変換」もしくは「タブに変換」と入力して設定項目を絞る
2. 「キーバインド」の列をクリックして割り当てるショートカットを押して `enter`

<img width="100%" alt="スクリーンショット 2019-06-14 21.16.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78776/3fe92621-b645-5c78-c9b1-af349905e701.png">

### 所感

私は、タブ・インデントやスペース・インデントに特に固執はしていません。基本的にスペース・インデントなのですが、大事なのは統一感だと思っているのでドキュメントやコードに合わせて切り替えるようにしています。

そんな時、タブ・インデントがルールなのに、ところどころスペース・インデントされていたり、１つのファイルだけがインデント形式が異なっていたりすることがあります。

サポート的には「基本設定 → 設定からの〜」と案内するのが正道なのですが、なるべくならキーボードから手を離したくないのです。そんな時には、やはりショートカットが使いたくなります。

問題は、**割り当てたショートカットや設定箇所を思い出せない**ことなのです。昔から、近道をしようと小道に入ると迷子になるタイプなのです。とほほ。

### 動作確認環境

- Visual Studio Code: v1.35.1
- macOS Mojave (OSX 10.14.5)

### 参考文献

- ["How can I convert tabs to spaces and vice versa in an existing file" のコメント](https://stackoverflow.com/a/37509777/8367711) @ StackOverflow
mecab-ipadic-neologdで知っておきたい単語のコスト変更方法

# 前提条件
筆者はWindows内に[WSL](https://docs.microsoft.com/en-us/windows/wsl/install-win10)を利用しています。Linux系統を仮定して書いてます。

前条件は以下になります：
- [mecab](https://taku910.github.io/mecab/) 
- [mecab-ipadic-neologd](https://github.com/neologd/mecab-ipadic-neologd)(以下、NEologd)

# 問題について
NEologdを使っていると、多くの単語を認識してくれて便利なのだが、たまに「余計なお世話」な単語の解析も出てくる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432171/7c8feebe-c7d6-1a7a-bfd1-2353aa196bc9.png)
あり[動詞/連用形]＋ませ[助動詞/未然形]＋ん[助動詞]
と普通に解析されて欲しい時に、固有名詞が出現してしまう。

その他、単体では普通に解析されるが、前後の文章の影響で解析結果が変わってしまうこともある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432171/dd84c2a5-32ee-2028-7950-2906387f0833.png)
接続詞の「では」が文章だと分割されているのがお分かりいただけるだろうか。

この記事ではこの二つの問題に対処していく。

## 固有名詞
まず、固有名詞がNEologdで追加されたものなのかどうかを確認する。
通常のIPAdicの場合、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432171/4ac51265-935a-f0dc-95a3-eb979b29537f.png)
「有馬線」とは解析されないため、NEologdで追加されたと特定できる。

NEologdの固有名詞は、レポジトリの `seed/neologd-proper-noun-ortho...csv.xz` に記入されている。
ファイル内で「ありません」と検索すると…あった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432171/1b5e212a-c702-1c31-bfd6-cd5472dea83a.png)
このCSVファイルの四番目の列にある数字が*コスト*で、***この値が低いほど出現頻度が高くなる。***
すなわち、この単語を出現させたくなければ、
- 出現コストを上げる
- 登録を削除する
この二つの方法がある。

僕は「ありません」を使う機会はないと思うし、あったとしても漢字で記入すると思うので、削除することにした。

さて、このファイルを編集し終えたら、NEologdを再度インストールして作業は終了である。
レポジトリのルートディレクトリから `./bin/install-mecab-ipadic-neologd -n` で作業終了。

確認してみると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432171/2e67f79c-a63a-2508-f371-45d23ea6cfa5.png)
デフォルトと同じ結果になりました。

## 接続詞
先ほどと同様に、デフォルトの辞書でも同じ問題が発生するか確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432171/482ece22-e7e0-d42a-391a-f5d150fef0de.png)
おっと、どうやらNEologdではなくデフォルト(IPAdic)辞書のほうの問題らしい。

IPAdicの辞書は、レポジトリの `build/mecab-ipadic-2.7.0...tar.gz` 内で圧縮されている。
接続詞はその中の `Conjunction.csv` というファイルになる。

早速開いてみる。(vimの場合、tar.gzフォルダをそのまま指定するとその中のファイルを選んで編集できます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432171/826d9778-2d48-75d1-13ab-52f0b104dc9a.png)

今回は「では」の**出現頻度を上げたい**ので、**出現コストを下げる。**
試しに-4000で1262まで下げました。

***注意: IPAdicの辞書に書き込む際、ファイルエンコーディングがeuc-jpに設定されているか確認してください***
インストールの際、euc-jpをutf-8に一括変換する作業があって、その時にeuc-jpでない辞書は省かれます。
vimの場合、編集画面で`:set fenc=euc-jp`と入力してEnterでOK。

また、NEologdをインストール。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432171/10a44473-fec5-a054-8f94-c6f850a833ab.png)

希望する解析結果が帰ってきました！

# 終わりに
この記事ではNEologdのシステム辞書の弄り方をメモしました。
エラーなどが発生した場合はコメントで報告ください。
【HTML】省略前の単語で要素名・属性名を覚える

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているerika_zです。

HTMLとCSSの学習をはじめて、最初に感じたことはプログラミング用の単語を覚えないと何もできないということです。
そこで、今回は暗記をより簡単に正確に行うために、要素名や属性名の元となっている英単語に注目していきます。



#はじめに

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#HTML


(要素名or属性名)　英単語：英単語の意味

( char ) charcter：性格、小説などの人物、文字
( li ) list item ： 一覧表　項目
( ol ) orderd list：順序付きリスト
( ul ) unorderd list: 順不同リスト
( img ) image：画像、形
( div ) division：分割
( em ) emphasis ：強調
( a )  anchor：いかり、固定するもの
( rel ) relation：関係
( href ) hypertext reference：ハイパーテキスト参照


#まとめ

超基礎的な要素名や属性名の元になっている英単語の意味をご紹介しました。

英単語と結び付けることで、記憶に残りやすいのではないでしょうか。
また、忘れてしまった際にもしたいことから単語を連想することで、要素名などを思い出すきっかけになります。
【Unity x OpenCV】Unityで顔認識するまでの手順　~コードいじらない！カンタン５STEP~

Unityで、OpenCVと音声認識を交ぜて
なんかつくろうとしてます…('◇')ゞ

最初はARKitでやろうとおもってたんですが、
**顔認識機能に対応している機種がかなり限定的(iPhoneXなどそのへん)**だったので、
OpenCVを導入することにしました…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/36034b3f-ca94-ba1c-85b6-b5f4517dce9d.png)


試した環境
---
・Unity 2018.3.0b3
・iPadPro(iOS12.2)
・Xcode10.1　※10.2だとiOS12.2非対応だったので、10.1をインストールしてそこにiOS12.2に対応させるファイルを追加してます）

##手順①　OpenCV plus Unity をインポート
新規Unityプロジェクトに、
AssetStoreから　'Open CV plus Unity' をインポートしましょう。

##手順②　エラーを駆除していきます　～その１～
File > Build Settings > Player Settings > Other Settings
**Allow 'unsafe' Codeに　チェックをいれる**
![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/1ddbe31d-e6d5-59ea-335b-772af0c5a643.png)

##手順③　Scenes In Build に　デモシーンをセット
検索欄に、't:Scene'　と入力すれば、Sceneだけが表示されるので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/6a0609c7-61c4-2a8d-0067-b996cb1efea4.png)
ドラック＆ドロップして、デモシーンを全て追加しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/74734a44-ae2f-b200-e2df-9531d03f79b8.png)
デモメニューを最初のシーンにするために、LobbySceneを　0番目にします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/8063361d-1774-1774-ca0b-b2c715db94f5.png)

##手順④　エラーを駆除していきます　～その２～
試しに、LobbySceneを開いている状態で、プレビューすると、
こんな画面になります
上から2番目ボタンの　Live Face Detector が、顔認識のデモシーンになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/e5245516-0291-0fdd-02f8-78e3037748bf.png)
これを試しに押すと、こんなポップアップが現れます。
Download を押して、ファイルをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/bafc8050-bb6c-e409-5d37-66e0267c81b0.png)
以下のファイルがダウンロードできたら、これを解凍します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/d2530993-2dfc-241c-d821-11510f75a448.png)
解凍できると、拡張子が.datのファイルになります。これを.bytesにリネームしましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/9286d022-34e4-107d-fd40-a198dbab4b70.png)
Assets/OpenCV+Unity/Demo/Face_Detector/
に　shape_predictor_68_face_landmarks.bytes　があるので、こちらを削除して、先程のファイルに入れ替えます。

##手順⑤　カメラ使用を許可する
File > Build Settings > Player Settings > Other Settings
**Camera Usage Descriptionに、適当な文章を追加します。**
※これがないと、iOSで？カメラを使用しようとしたタイミングで、アプリが落ちる原因になりますので、ビルド後アプリが落ちちゃう人は、ここを忘れてないかチェックしましょう('◇')ゞ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/2032c253-2c63-a061-0bd2-d51cc4665085.png)

##ビルド！
これで、ビルドまでの手順はばっちりだとおもいます…！
あとは、Xcodeなりなんなりでビルドしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306317/9c27398e-f25c-ed02-72a0-4a3af67a662a.png)
できましたでしょうか？

またこんど、**音声認識**や**ARKit**についてもカンタン解説します…('◇')ゞ
webpack4.0+babelの環境構築

#はじめに
先日webpackを初めて触る機会があったのですが、どの記事も少し前に作成されたものばかりでした。その結果、記事通りに作成しても動かないものばかりであったため、この不便性を解消すべく一度も触ったことがない方向けに従来の方法との違いを説明しながら要点を絞ってまとめました。（今回は環境構築のコマンドのみに留めます。webpackやbabelについては参照に載せたものや別記事をご覧下さい。）

#参照
http://top-men.hatenablog.com/entry/2018/02/27/031345
（↑こちらの方の記事をメインに進めて行きます）
https://qiita.com/ChurappsWatatani/items/9798cb28e83242b9e032
https://stackoverflow.com/questions/52092739/upgrade-to-babel-7-cannot-read-property-bindings-of-null/52092788

#ステップ１　Node.jsのインストール

まず、webpackを扱うに当たって必要なNode.jsのインストールから開始します。

```
npm init -y
```

これによりpackage.json(など)が作られます。

#ステップ２　webpackのインストール

```
npm i webpack -D
npm i webpack-cli -D
```

上記２つのコマンドでwebpackのインストールが完了します。

#ステップ３　package.jsonの変更

```
"scripts": {
  "build": "webpack"
}
```

scriptsのbuildをwebpackに設定し直します。

#ステップ４　webpack.config.jsの作成

```webpack.config.js
const path = require('path');

module.exports = {
  entry: {
    'index': [
      path.resolve(__dirname, '実行ファイル(例：index.js)')
    ]
  },
  output: {
    filename: '[name].js',
    path: path.resolve(__dirname, 'public'),
    publicPath: '/',
  },
};
```

この時、実行ファイルも作成するのを忘れないで下さい。

#ステップ５　実行

```
npm run build
```

上記のコマンドを実行することで新しく./dist/main.jsファイルが出来上がります。
一度ここまで問題なく実行できるか確認して下さい。

#ステップ６　babelインストール
従来までは下記の方法でインストール出来ました。

```
npm i babel-loader babel-core babel-preset-env -D
```

ただ、現在はbabelのバージョンが上がっているため下記のコマンドでインストールする必要があります。

```
npm i babel-loader @babel/core @babel/preset-env -D
```

#ステップ７　 .babelrcの作成
プロジェクトフォルダ直下に.babelrcを作成しますが、こちらも従来の下記コードだとエラーが起きます。

```.babelrc
{ "presets": ["env"] }
```

バージョンアップしたものを設定して下さい。

```.babelrc
{ "presets": ["@babel/preset-env"] }
```

#ステップ８　実行

webpack.config.jsをbabelに対応するものに書き直し、

```webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader"
        }
      }
    ]
  }
};
```

そして実行

```
npm run build
```

問題なければ、自身でjsファイルに設定した通りに作動するはずです。

#まとめ（＋お願い）
私自身もwebpackの利点や特徴をよく分かっていない状態のため、既に活用されている方にコメントでwebpackの良いところや上手い利用方法などを教えて下さると嬉しいです。
Burp Suiteでのセキュリティテスト[攻撃編1]

前回の記事で、通信内容の
user_nameとpasswordを書き換えると正常にログインできてしまうのが分かったと思います。

今回は、burp suiteに用意してあるいくつかの攻撃を使って実際にログインの試行を行っていきます。



まず、前回までに可視化させたphpMyAdminへログインする際の通信内容です。


<img width="620" alt="qiita0614.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426556/dfc3a07f-930e-55b4-78da-f334c75a2487.png">


実際の攻撃ではForwardで通信を進めていき、ログインにかんする情報を見つけます。

今回の場合、pma_username=Qiita&pma_password=abcdeがサーバ側にpostしているログイン情報になります。
星をつけたら、右クリックでIntruder[侵入するやつ]に送ります。


<img width="486" alt="qiita0614-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426556/bbf661f4-cb9b-82c0-b81b-edb612b5cd51.png">

タブは自動的に切り替わらないので、自分でProxyタブからIntruderタブに移動します。


<img width="700" alt="qiita0614-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426556/7f59ebc8-46d0-a230-d999-e50dcfca87e4.png">



Position内に先ほど、送り付けた通信内容が表示されています。

pma_username=§qiita§&pma_password=§abcde§&server=1&lang=ja-euc&convcharset=iso-8859-1

§で挟まれたものが精査の対象となります。

Add § :選択した文字列に§をはさむ
Clear § :全ての§を除去
Auto § :自動的に変数らしきものすべてに§をはさむ
Refresh: 取得した通信内容を更新する。

今回、調査するのは、ユーザー名とパスワードなので
以下の２つに§をつけておきます。
pma_username=§qiita§&pma_password=§abcde§&

Payload　ペイロード（通信の付加情報のこと）タブに移動します。
Attack　TypeをCluster bomb またはSimple list に変更しPayloadsにタブを移します。


<img width="586" alt="qiita0614-4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426556/651ccca6-4b81-cbf4-39af-ce077525530d.png">

次回　ここからパスワードリスト攻撃※を仕掛けてみたいとおもいます。

※パスワードリスト攻撃：攻撃者がどこかで入手したID・パスワードのリストを用いて、正規ルートからの不正アクセスを試みるサイバー攻撃の一種。
New RelicのPHPエージェントによりCPUが高負荷状態になった場合の対処について

### 問題の背景

New RelicでPHPのアプリケーションを監視する際にCPUが高負荷状態になった場合に確認・対処する方法についてExplorer Hubというコミュニティベースの掲示板に記事が公開されています。日本で利用されている方の中で困っている方がいるかもしれませんので、今回はこの記事の概要を紹介します。

[Relic Solution: PHP Agent CPU Overhead Tips](https://discuss.newrelic.com/t/relic-solution-php-agent-cpu-overhead-tips/70182)

PHPに限らずNew Relicが各言語向けに提供しているAPMのエージェントは有効にすることでシステムに深刻な影響を与えること**がないように**作られています。ですので、もし何か問題が発生していましたら、サポートチケットを作成いただくか先ほどのExplore Hubなどに質問をお願いします。英語はちょっと...という方はお手伝いしますので私までご連絡ください。

### 診断方法

さて、PHPエージェントにおいてCPUが通常よりも高負荷状態になった場合、以下のコマンドにてクロックソースの確認をお願いします。

利用可能なクロックソースを確認します。

```
cat /sys/devices/system/clocksource/clocksource0/available_clocksource
```

現在設定しているクロックソースを確認します。

```
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
```

CPUが利用可能なタイムスタンプカウンターを確認します。

```
cat /proc/cpuinfo | grep tsc
```

vDSOが利用可能か確認します。

```
strace php -m 2>&1 | grep gettimeofday
```

もし、vDSOが利用可能でない場合対処方法をご確認ください。

### 問題の詳細

PHPのエージェントでは、関数の開始と終了時刻を取得するのに`gettimeofday()`関数を利用しています。vDSOwをサポートしていないクロックソースを利用した場合、CPU負荷が高くなる問題が発生する可能性があります。

### 対処方法

vDSOが利用可能なクロックソースを利用するように設定してください。例えば`tsc`になります。

```
echo tsc > /sys/devices/system/cl*/cl*/current_clocksource
```

もしクロックソースの変更ができない場合、次善の策としましてCPUを利用するエージェントの設定を無効化する方法があります。`newrelic.ini`ファイルに次の設定を追加してください。

```
newrelic.transaction_tracer.enabled = false
newrelic.transaction_tracer.detail = 0
```

もしこれらの方法で改善されない場合、さらに詳細な調査が必要となりますのでお問い合わせください。

### 参考資料

- [Linux Programmer's Manual  GETTIMEOFDAY(2)](http://man7.org/linux/man-pages/man2/gettimeofday.2.html)
- [Ticklessカーネルとクロックソースに関するお話](http://enakai00.hatenablog.com/entry/20111117/1321508379)
- [カーネルにおけるタイマー事情 ～第4回 タイマーハードウェアの抽象化～](https://www.valinux.co.jp/technologylibrary/document/linuxkernel/timer0004/)
- [時間情報の取得方法と扱い方](https://www.mm2d.net/main/prog/c/time-04.html)
JavaScriptでラジオボタンのチェックを消す方法

普通、ラジオボタンはチェックすることはできてもチェックを消すことはできません。
しかし、JavaScriptを書き加えてあげることで、ラジオボタンのチェックを消すことができます。
今回は、**「選択解除用のボタンを設置する場合」**と**「ラジオボタンをそのまま押して解除できるようにする場合」**の２つの方法をつくります。

## 選択解除用のボタンを設置する場合
3つのラジオボタンのうち、どれかを選択できるようにします。
また、ラジオボタンの選択解除用のボタンも用意しておきます。

### HTMLでの記述
```index.html
<input type="radio" id="radio1" name="radio">イヌ
<input type="radio" id="radio2" name="radio">ネコ
<input type="radio" id="radio3" name="radio">ウサギ

<button type="button" onclick="radioDeselection()">選択解除</button>
```

@htsign さんからのご指摘により`name`名追加
~~ラジオボタンの`id`名は、`radio`にします。~~
ラジオボタンの`id`名はそれぞれ定義し、`name`名は、`radio`にします。
そして、選択を解除するためのボタンを設置します。

### JavaScriptでの記述
```form.js
function radioDeselection() {
  for (const element of document.getElementsByName('radio')) {
    element.checked = false;
  }
}
```

~~ラジオボタンの`id`名である`radio`を指定して、チェックがしてあるラジオボタンを解除しています。~~
ラジオボタンの`name`名である`radio`を指定して、チェックがしてあるラジオボタンを解除しています。

## ラジオボタンをそのまま押して解除できるようにする場合
次に、ラジオボタンを押すだけで選択を解除できるようにします。

### HTMLでの記述
```index.html
<input type="radio" value="1" onclick="radioDeselection(this, 1)">東京
<input type="radio" value="2" onclick="radioDeselection(this, 2)">大阪
<input type="radio" value="3" onclick="radioDeselection(this, 3)">名古屋
```

`radioDeselection`の引数には、ラジオボタンである`<input>`要素と、それぞれのラジオボタンを識別するための数字を入れます。

### JavaScriptでの記述
```form.js
var remove = 0;

function radioDeselection(already, numeric) {
  if(remove == numeric) {
    already.checked = false;
    remove = 0;
  } else {
    remove = numeric;
  }
}
```
はじめにチェックされたラジオボタンを確認するための変数`remove`を定義します。
そして、押されたラジオボタンがチェック済みならばチェックを外し、チェックされてなかったらスルーしてラジオボタンにはチェックされます。

## 参考にさせてもらった記事
- [Javascript：選択したラジオボタンのチェックを外す方法 - raining](http://raining.bear-life.com/javascript/%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%9F%E3%83%A9%E3%82%B8%E3%82%AA%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%92%E5%A4%96%E3%81%99%E6%96%B9%E6%B3%95 "Javascript：選択したラジオボタンのチェックを外す方法")
- [ラジオボタンのチェックをはずすJavaScript - harashi HOME Page](http://www.kttnet.co.jp/~harashi/samplepg/radio-sample.htm "ラジオボタンのチェックをはずすJavaScript")
Advantages of Hiring Reliable Moving Company

Relocation is a troublesome task which makes people stressful all through the task. People can reduce their entire stress in a perfect manner by hiring the reputed moving companies. There are many moving companies available in market that offer the best services of moving. The moving companies perfectly handle the entire task in a great manner. By hiring the removal companies people can satisfy themselves that there move will be easier and comfortable. By hiring the removal company people can timely get their move. There are many other advantages that people can get easily some of them are as follows: 

Advantages of Hiring Reliable Moving Companies

Lessening Stress
By hiring the removal company to make the relocation easier the very benefit is to lessen the whole stress and tension of moving. These companies take the whole burden and hassles of relocation on them and make their customers feel free. These companies have experts with them who handle the entire burden of move on them. People can trust on their abilities and leave their whole worries on them. 

Safety of Goods
Security or safety of goods is another advantage of hiring a removal company for the relocation. These professionals use fine quality packing materials to pack the goods of their customers. They take full precautions to make the move safe and easy. They safely pack them and move them also very carefully so people can trust on their efforts easily. They take the help of spacious carriage to move the goods perfectly. 

Zero Hard work
There is little bit of work is left with clients that to observe the entire process of the move which is going on. This means zero hard work or effort that customers pay on their relocation. As the entire burden of the move is lies on the workers so customers can freely can indulge in some other work also. On their relocation clients can freely move here and there as per the desire as the burden of move is on clients. 

Timely Completion of Move
Customers can easily make their move get complete timely by the help of expert service providers. They assure their clients that their entire move will get complete timely as per the desire of their customers. In this manner people can make their relocation safe and perfect. 

Movers and Packers in Navi Mumbai based companies are good enough to provide all these benefits to their customers so just hire their services easily.<a href="https://www.movingsolutions.in/packers-and-movers-in-navi-mumbai.html"> Packers and Movers in Navi Mumbai </a> based companies surely provide the comfortable move to their customers so just have faith on them.
PhpStormのバージョンを上げたらXdebugが動いた

# 問題
PhpStormのリモートデバッグで、なぜかステップが動かない事象が発生。
Xdebugのリモート接続は成功しているが、ステップが進まない。
色々試した結果、PhpStorm自体のアップデートで解決しました。

# 環境
Windows10上にVagrantでVMを立てて、共有ディレクトリにソースを格納。
共有ディレクトリをWebのDocumentRootとして、Xdebugでリモートデバッグ出来る環境を作ろうとした。

__HostOS:__ windows10
__Vagrant:__ 2.2.4
__GuestOS:__ ubuntu16.04
__Apache:__ 2.4
__PHP:__ 7.2
__Xdebug:__ 2.7.1
__EC-CUBE:__ 4.0
__PhpStorm:__ 2018.1

# 解決
phpの設定やApache、xdebugの設定やら色々試したが、動かず。
最終的に下記スレッドで書かれている通り、PhpStormのアップデートをしたら直りました (2018.1 => 2019.1)
https://intellij-support.jetbrains.com/hc/en-us/community/posts/360003310760-XDebug-not-working-anymore
(IDEs Support (IntelliJ Platform) | JetBrains > Community > PhpStorm)

アプリケーション周りを設定してもxdebugが動かない場合、IDEのバージョンを疑ってみると良いかもしれません。
[Go言語] 10進数を他の進数に変換する [基数変換]

# 動機
知り合いに10進数を11進数にするプログラム作ってと言われたので、どうせなら11進数だけじゃなく他のものにも対応させたものを作ろうと思いやってみた。

# 結論
`decimalNum`に指定された値を`baseNum`に指定した進数に変換するソースコードである。
ソースコードの全容は以下

```golang
package main

import "fmt"

func main(){
    decimalNum := 1000 // 変換元の10進数
    baseNum := 16 // 何進数に変換するか
    tmpNum := decimalNum // 途中計算を保存する用
    conversionNum := "" // 変換後の値格納用　11進以上はアルファベットのため、文字列で扱う必要がある

    for digitNum := 1;; {
        remainder := tmpNum%baseNum
        if remainder >= 10 {
            conversionNum = string('A' + (remainder-10)) + conversionNum
        } else {
            conversionNum = string('0' + remainder) + conversionNum
        }
        tmpNum = tmpNum/baseNum
        if tmpNum == 0 {
            break
        }
        digitNum *= 10
    }
    fmt.Println(conversionNum)
}
```

# プログラムが出来るまで
## 1. とりあえず計算式をソースコードへ
まず10進数から別の進数を計算する方法だが、これは意外と単純である。
10進数の値をN進数のNで割り、出てきた商をさらにNで割ることを繰り返す。
そして各徐算で出てきた剰余を並べたものがN進数の値になる。
詳細は省くが、上記の進数の計算方法をコードにしたものは以下になる

```golang
func main(){
    decimalNum := 20 // 変換元の10進数
    baseNum := 3 // 何進数に変換するか
    tmpNum := decimalNum // 途中計算を保存する用
    conversionNum := 0 // 変換後の値格納用

    for digitNum := 1;; {
        conversionNum = (tmpNum % baseNum) * digitNum
        tmpNum = tmpNum/baseNum
        if tmpNum == 0 {
            break
        }
        digitNum *= 10
    }
}
```
しかし、これには大きな問題がある。
剰余が10以上になる11進数以降は計算できない

## 2. 11進数以上を表現する上での問題・・・
まず、11進数以上の表現にはアルファベットを使用することになる。
そのため変換後のN進数はint型ではなくstring型で扱わなくてはいけない。
しかも、剰余が10の時はA、11の時はB、と剰余の値をアルファベットに変換した上で文字列に結合する必要がある。
方法としては、リストに数字とアルファベットを保存し、対応表を作成するという手段があるが、リストに登録した分までしか基数変換できないため、自分のやりたいどんな進数にでも変換するというのが達成できない。
せめて文字コードを計算に使用することができれば…と調べたところ**「rune」**というものがあるらしい

## 3. 「rune」による文字コードの操作
runeとはint32型の実態をもち、さらに文字を簡単に文字コードに変換してくれるらしい。
また、int型のため足し算ができる。
その上、計算結果は「string()」によって文字コードの対応した文字に戻せるとのこと。
実際に検証してみたところ

```golang
// シングルコーテーションで囲むことによってrune()に文字を渡すのと同じ意味になる
fmt.Println('A')
// 出力結果... 65

fmt.Println('A'+1)
// 出力結果... 66

fmt.Println(string('A'+1))
// 出力結果... "B"
```

ちゃんと変換されている。（文字コードを見る限りASCIIコードだろうか？）

ここまで分かればあとはもう10以上の剰余が出たら'A'の文字コードに剰余-10の値を足してやるようにコードを書き直せばいい。

## 完成品
結論でも記述したが、完成したものが以下である。

```golang
package main

import "fmt"

func main(){
    decimalNum := 1000 // 変換元の10進数
    baseNum := 16 // 何進数に変換するか
    tmpNum := decimalNum // 途中計算を保存する用
    conversionNum := "" // 変換後の値格納用　11進以上はアルファベットのため、文字列で扱う必要がある

    for digitNum := 1;; {
        remainder := tmpNum%baseNum
        if remainder >= 10 {
            conversionNum = string('A' + (remainder-10)) + conversionNum
        } else {
            conversionNum = string('0' + remainder) + conversionNum
        }
        tmpNum = tmpNum/baseNum
        if tmpNum == 0 {
            break
        }
        digitNum *= 10
    }
    fmt.Println(conversionNum)
}
```
ひとまず36進数までなら確実に表示はできるし、37以上でも記号を使用して表現できるのが確認できたので満足。
100とかはわからん

# ここまでやったけど実は・・・
下記コードで簡単に2進数から36進数まで変換できる。

```
package main

import (
	"fmt"
	"strconv"
)

func main() {
	for i := 2; i <= 36; i++ {
		fmt.Println(strconv.FormatInt(10000000, i))
	}
}
```
ソース引用元: http://y0m0r.hateblo.jp/entry/20131016/1381936219

strconvに存在していたらしい、知らなかった。
記事を書いてる時に見つけてしまってやめるかどうか悩んだが、せっかく書いたので生き恥を晒すことにした。

GO歴数ヶ月なので色々拙いけど、ゆるちて
入力中リアルタイムに数値3桁カンマ区切り

#概要
HTMLのinputタグで、入力しながらリアルタイムに3桁カンマを入れます。

- 負の数には未対応
- 0の場合は空欄（空文字）にします。

コードは、CodePenでご覧ください。

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="tsunet111" data-slug-hash="GbpwZa" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Add comma for input number automatically">
  <span>See the Pen <a href="https://codepen.io/tsunet111/pen/GbpwZa/">
  Add comma for input number automatically</a> by Tsuneaki Hasekura (<a href="https://codepen.io/tsunet111">@tsunet111</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
[Ruby][rbenv] 特定のバージョンのアンインストールを禁止する

# 方法

rbenv hooks という機能を使う。

以下、rbenv は `~/.rbenv` にインストールしていることを想定する。

まず `~/.rbenv/rbenv.d` に `uninstall` という名前のディレクトリを作る。そして、そのディレクトリに `.bash` という拡張子で任意の名前のファイルを作成する。

```bash
$ mkdir ~/.rbenv/rbenv.d/uninstall
$ vim ~/.rbenv/rbenv.d/uninstall/prevent_uninstall.bash
```

作成した `.bash` ファイルの内容は次の通り。

```~/.rbenv/rbenv.d/uninstall/prevent_uninstall.bash
#!/usr/bin/env bash

VERSIONS=(2.5.5 2.6.3)
SCRIPT=$(cat <<EOS
if [[ " ${VERSIONS[*]} " == *" $@ "* ]]; then
  echo "Ruby $@ はアンインストールできません。アンインストールしたい場合は $BASH_SOURCE を削除してください。"
  exit 1
fi
EOS
)

before_uninstall "$SCRIPT"
```

この状態で Ruby 2.6.3 をアンインストールしようとしてもできない。

```
$ rbenv uninstall 2.6.3
rbenv: remove /Users/quanon/.rbenv/versions/2.6.3? [yN] y
Ruby 2.6.3 はアンインストールできません。アンインストールしたい場合は /Users/quanon/.rbenv/rbenv.d/uninstall/prevent_uninstall.bash を削除してください。
```

# 参考

* [rbenv/ruby-build » ruby-build/bin/rbenv-uninstall](https://github.com/rbenv/ruby-build/blob/v20190423/bin/rbenv-uninstall)
* [Check if an element is present in a Bash array](https://stackoverflow.com/questions/14366390/check-if-an-element-is-present-in-a-bash-array/14367368)
Linuxbrew で patchelf を再インストール

こんにちは。
Linuxbrew のトラブルが起き（```brew upgrade gmp``` が失敗するなど）、下記のように patchelf を再インストールした後、正常となり直ったようです。下記を参考にしました。

- "[failed installation on Redhat 7](https://github.com/Linuxbrew/install/issues/59)" (Linuxbrew/install/issues)

```console
$ brew update
$ brew reinstall patchelf
```
Android開発者が考えるnuxt.jsはどこに何を書けばよいのか問題

### 前書き

これは、本を読むのが好きだけど探すのが嫌いな僕が、適当な説明文を書いておけば誰かが勝手におすすめのものを教えてくれる「[積んでけ](https://tsundeke.me)」というサービスを作った際に学んだことを書いているものです。

## はじめに

この記事はAndroidとnuxtを比較して考えた場合に、どこがなににあたりどういった処理を書くべきか？という観点で記載したものになります。

初期のフォルダ構成は以下となっているものとします。

```
├── components
├── pages
├── store
└── layouts
```

## components = CustomView

componentはCustomViewにあたるものと考えます。全てのHTML要素はComponentで記載するぐらいの気概で記載していくと再利用もしやすくなりアプリとしての統一性も出てきやすいでしょう。AndroidでいうところのButtonのようなこれ以上分解できない最小単位のView単位でpartsを作成していき、そのPartsの組み合わせで使いやすい単位のCustomViewを作っています。このCustomViewは渡された情報の表示のみを行います。外部との通信などは行わずタップ等のイベントを外に受け取るための口だけを作成しておきます。

```
├── components
│   ├── parts
│   │   └── buttons
│   │       └── confirmButton.js
│   └── area
│       └── areaCard.js
├── pages
├── store
└── layouts
```

## pages = Fragment + ViewModel

各種pageはFragmentとViewModelを足したようなものです。Lifecycleに応じてAPI通信などを行いデータを取得しComponentに流して表示したり、Componentからのイベントに応じてデータの保存や更新などを行います。また、PageのTemplateには直接HTMLを記載するのではなく、一度Component化してからPageが参照するようにするとカスタマイズ性が上がりそうです。ページ固有のデータを保存するのもstoreではなくpage.dataに記載したほうがスッキリすると思います。

```
├── components
│   ├── parts
│   │   └── buttons
│   │       └── confirmButton.js
│   └── area
│       └── areaCard.js
├── pages
│   └── area
│       └── index.js
├── store
└── layouts
```


## store = SharedElement???

最初は全てのAPI通信等をstoreを通して行うように作成していました。pageからstoreにイベントを投げてstoreがAPI通信を行い結果を保存し、保存先を監視しているPageが変更を察知してViewに流すという作りにすると一見きれいに動いているように見えます。しかし、この方針はあまりよくありませんでした。

storeの値はアプリで共通なのでPage固有の情報を保存すると別のPageからアクセスされてしまう可能性がでてきます。これは同じPageで別の値を表示する可能性がある場合、前のPageの値が保存されている場合があり、非常にバグを生みやすそうだなと感じました。なので、storeにはアプリ全体として共通する値のみを保存する（例えば認証情報）ものとし、Page固有の情報はpage.dataに保存してAPI通信もpageに書くようにしました。このへんは好みが分かれるところなのかなと感じています。

```
├── components
│   ├── parts
│   │   └── buttons
│   │       └── confirmButton.js
│   └── area
│       └── areaCard.js
├── pages
│   └── area
│       └── index.js
├── store
│   └── auth.js
└── layouts
```

## layouts = Activity

layoutはActivityと考えて良さそうですが、layoutとpageの関係性がActivityとFragmentの関係と同じか？と言われるとちょっと違います。同一layoutで動く分には再生成されないので、Activityが表示された後に中のFragmentが変わっていっていると考えることもできますが、page側でlayoutを指定するためあくまで主体はpageの方だと思います。全体的に共通するHeader / Fotterを表示する便利機能的で、ここも直接Pageと同様の共通部品のビジネスロジックを書いていくと良いのではないでしょうか。

```
├── components
│   ├── parts
│   │   └── buttons
│   │       └── confirmButton.js
│   └── area
│       └── areaCard.js
├── pages
│   └── area
│       └── index.js
├── layouts
│   └── authed.js
└── store
    └── auth.js
```


## 終わりに

大規模開発をしていくとこの構成では不具合が出てくるのかもしれませんが、個人開発のレベルだとこんなイメージで書いていくと破綻しないように感じます。ただ、Androidでも起こるActivityが神クラス化していく問題と同じように、この書き方で進んでいくとPageが神クラス化していく予感があります。ViewModelとして処理を分割するようにnuxtでも同じ役割を担うクラスを新設すればPageの肥大化は防げるのではないかと思っています。

### 宣伝

もし興味があれば使ってくれると嬉しいです。

[積んでけ](https://tsundeke.me)

> 世界にはあなたやわたしがまだ出会っていないすばらしいものが無数に存在します。 あなたが知っている素晴らしいものは、だれかが探し続けているものかもしれません。 あなたが探し続けているものは、だれかがすでに素晴らしいと思って使っているものかもしれません。 「積んでけ」はだれもが気軽に軽い気持ちで自分が知っている素晴らしいものを教えあうサービスを目指しています。
優先順位つき待ち行列

# 優先順位付き待ち行列
- お尻から入れて頭から出す
- お尻から要素が入ってくるけれど，頭から出てくるときには特定の優先順位に従って要素が出てくる（入れた順番によって出てくる順番が決まるわけではない）
- **優先順位つき待ち行列は，挿入・削除・最(大|小)値の取り出し・要素の値の変更が$O(\log n)$でできるので，とってもとっても便利屋さん**
    - Goでは標準ライブラリで実装が提供されている => [`container/heap`](https://golang.org/src/container/heap/heap.go)
    - 標準ライブラリは`Interface`を定義して，いろんなデータを抱えている配列を柔軟にヒープせしめることができるように設計されている（頭いいなぁ）
- ヒープは**「優先度つき待ち行列を合併して大きな優先度つき待ち行列を一つ作る」**ことは苦手
- 優先度つき待ち行列を実現する方法はヒープだけではなくて他のデータ構造を用いてもできる．二分木じゃなくて$d$分木とか．あと，値全体を一つの部分順序つき木に入れるんじゃなくて，複数の木に分散させて，木の集合つまり森を管理するようなデータ構造も提案されているらしい
- 以下では，優先順位付のルールとして「今入っている要素の大きい順で出すこと」にする

# 「配列上に表現された部分順序つき木（＝ヒープ）」で優先順位つき待ち行列

## 初期化
- 与えられた初期値から部分順序つき木を構成する

## その時点での最大値を出す
- 部分順序つき木の根っこを出して，再構成

## 要素の削除
- 特定の要素を添字で指定して削除して，再構成

## 要素をお尻から入れる
- 部分順序つき木の末端に追加して，再構成

## 値を更新する
- 更新してから，再構成

```go
package main

import "log"

type PriorityQueue []int

func (pq *PriorityQueue) Init() {
	n := len(*pq)
	for i := n/2 - 1; i >= 0; i-- {
		pq.downheap(i, n)
	}
}

func (pq *PriorityQueue) PopFront() int {
	n := len(*pq) - 1
	ret := (*pq)[0]
	(*pq)[0], (*pq)[n] = (*pq)[n], (*pq)[0]
	pq.downheap(0, n)
	*pq = (*pq)[:len(*pq)-1]
	return ret
}

func (pq *PriorityQueue) PushBack(value int) {
	*pq = append(*pq, []int{value}...)
	pq.upheap(len(*pq))
}

func (pq *PriorityQueue) Delete(idx int) {
	n := len(*pq) - 1
	oldValue := (*pq)[idx]
	if n != idx {
		(*pq)[idx], (*pq)[n] = (*pq)[n], (*pq)[idx]
		if (*pq)[idx] < oldValue {
			pq.downheap(idx, n)
		} else {
			pq.upheap(idx)
		}
	}
}

func (pq *PriorityQueue) Update(value int) {
	n := len(*pq) + 1
	*pq = append(*pq, []int{value}...)
	pq.upheap(n)
}

func (pq *PriorityQueue) downheap(parent, length int) {
	for {
		children := 2*parent + 1
		if children >= length || children < 0 {
			break
		}
		child := children // left child
		if rightChild := child + 1; rightChild < length && (*pq)[rightChild] > (*pq)[child] {
			child = rightChild
		}
		if (*pq)[child] < (*pq)[parent] {
			break
		}
		(*pq)[child], (*pq)[parent] = (*pq)[parent], (*pq)[child]
		parent = child // down
	}
}

func (pq *PriorityQueue) upheap(children int) {
	for {
		parent := (children-1)/2
		if children == parent || (*pq)[children] < (*pq)[parent] {
			break
		}
		(*pq)[children], (*pq)[parent] =  (*pq)[parent], (*pq)[children]
		children = parent // up
	}
}

func main() {
	pq := PriorityQueue{6, 7, 1, 0, 5, 9, 4, 8, 2, 3}
	pq.Init()
	log.Println(pq)
	for i := 0; i < 10; i++ {
		log.Println(pq.PopFront())
	}
}
```

- 標準ライブラリは便利に作られててかしこかしこやなぁと．改めて．
Python リストの操作

#多次元リストのソート
多次元リストをソートする際、評価基準を指定することができるようです。
また、その評価基準は複数指定できるようです。
その際、sort(key=lambda x:(x[0],x[1]))の x:以降の引数を第一引数から順に優先して評価するようです。


```python:2Dsort_1.py
list = [[10,4],[3,6],[4,9],[5,0],[4,6],[2,0]]
list.sort(key=lambda x:x[0]) 
print(list)
#[[2, 0], [3, 6], [4, 9], [4, 6], [5, 0], [10, 4]]
list.sort(key=lambda x:x[1])
print (list)
#[[2, 0], [5, 0], [10, 4], [3, 6], [4, 6], [4, 9]]
list.sort(key=lambda x:(x[0],x[1]))
print (list)
#[[2, 0], [3, 6], [4, 6], [4, 9], [5, 0], [10, 4]]
```

また、リストの要素は数値同士でなくてもよいのです。
下のように['文字列','数値']のソートも可能。

```python:2Dsort_2.py
list = [['ab',4],['a',6],['abc',9],['abc',0],['rklel',6],['gke',0]]
list.sort(key=lambda x:(x[0],x[1]))
print (list)
#[['a', 6], ['ab', 4], ['abc', 0], ['abc', 9], ['gke', 0], ['rklel', 6]]
```


#zip関数

組み込み関数 - zip() — Python 3.7.1 ドキュメント
for文で複数のリストを一度に取得可能。


```python:zip.py
food = ['Apple', 'Bread', 'Caree']
cost = [300, 150, 600]
for name, age in zip(food, cost):
    print(name, age)
#Apple 300
#Bread 150
#Caree 600
```

# set集合
list型を集合に変えることができる。
その際リストの重複要素は取り除かれる。
辞書型はkeyの値のみを重複を取り除いた集合になる。
文字列は重複する文字を除いた一文字ずつの集合になる。

```python:set.py
set1 = set([1,2,3,3,2,1,4,6,5,4])
set2 = set(['a','b','c','b','b','a','d'])
set3 = set({'a':'A', 'b':'B', 'c':'C','a':'A'})
set4 = set('sssaaaklm')
print(set1) # {1, 2, 3, 4, 5, 6}
print(set2) # {'b', 'c', 'a', 'd'}
print(set3) # {'b', 'c', 'a'}
print(set4) # {'m', 's', 'a', 'k', 'l'}
```

#参考記事
https://qiita.com/fantm21/items/6df776d99356ef6d14d4
https://uxmilk.jp/14834
iPhone Safariでimg要素の3DTouchを無効にし、かつ長押しで保存できるようにする


## 方法

[このサイト]([http://neos21.hatenablog.com/entry/2018/01/11/080000](http://neos21.hatenablog.com/entry/2018/01/11/080000))より、

> Safari 10 からは **touchforcechange** という独自のイベントが新たに追加されており、強度の変化だけを取得できる。

らしいです。

このイベントを利用し、3DTouchが反応する押し込みの強度で`e.preventDefault()`を実行し、長押しの有効と3DTouchの無効を両立します。

押し込みの強度は`e.touches[0].force`で取得できます。

## 実装

検証した結果、`e.touches[0].force`が0.1775あたりで3DTouchが反応するので、0.15より上の場合無効にします。

### pure js

```js
// 全てのimgタグに対して実行
document.querySelectorAll("img").forEach(el => el.addEventListener("touchforcechange", e => {
  if (!e.touches || !e.touches[0]) return

  if (e.touches[0].force > 0.15) {
    e.preventDefault()
  }
}))

```

### jquery

```js
// 全てのimgタグに対して実行
$("img").on("touchforcechange", e => {
  if (!e.touches || !e.touches[0]) return

  if (e.touches[0].force > 0.15) {
    e.preventDefault()
  }
})
```

### vue + ts

```vue
<template>
  <div>
    <img src="hogehoge" alt="hogehoge" @touchforcechange="handleImageTouch">
  </div>
</template>

<script lang="ts">
import { Component, Vue } from "vue-property-decorator"

@Component({})
export default class VHoge extends Vue {
  handleImageTouch(e: TouchEvent) {
    if (!e.touches || !e.touches[0]) return

    if (e.touches[0].force > 0.15) {
      e.preventDefault()
    }
  }
}
</script>
```



## 補足

3DTouchと長押し両方とも無効化する場合はcssで指定できます。

```css
img {
  -webkit-touch-callout: none;
}
```



## 参考

- [iPhone の 3D タッチ (Force Touch) を JavaScript で扱う - Corredor](http://neos21.hatenablog.com/entry/2018/01/11/080000)

- [iPhone 6s safariの3Dタッチで画像のプレビューが出るのを防ぐ - Qiita](https://qiita.com/hogedigo/items/6ea5b937a2f618b85ef6)

- [-webkit-touch-callout - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/-webkit-touch-callout)
【bash】コマンドラインでファイル操作まとめ


## ファイルの作成
```bash
touch index.html
```

ディレクトリ内にも直接作れる

```bash
touch 既存ディレクトリ名/ファイル名
```

## ディレクトリ作成
```bash
mkdir sample/
```

make directoryの略。



## 名前変更
```bash
mv 旧ファイル名 新ファイル名
```
ディレクトリでもいける。これは「-r」をつけなくてもいける。

## 削除
```bash
rm ファイル名
rm -r ディレクトリ名
```

## ファイルコピー
```bash
cp コピー対象 コピー先
```

-rをつけるとディレクトリごと

```bash
cp -r poyo/ poyo2/
```



## 編集（使いにくい
`echo`
元々存在しないファイルを指定した場合、そのファイルが自動生成される。

```bash
echo 'ぽよ' > index.html
```
中身が「ぽよ」だけになる。＝全て上書き

```bash
echo 'ぽよ' >> index.html
```
中身に「ぽよ」が追加される

※

```bash
echo > 'ぽよ'
```
とやると謎の「ぽよ」ができる。拡張子なし謎ファイル
vueで「 Cannot read property 'hoge' of undefined」に悩まされた件。

Vueで

```
 Cannot read property 'hoge' of undefined
```
というエラーに悩まされた。

配列の中にオブジェクトを格納しているdataで

```js
data[index]["hoge"]
```
みたいな方法でアクセスしようとしているのに、なぜか上記のエラーが出る。

解決は、
data[index]がundefinedの場合、["hoge"]へはアクセスできないので上記エラーになっていた、というだけだった。

```vue
<span v-if="data[index]">{{data[index]["hoge"]}}</span>
```
とv-ifを挟んでやったら、無事エラーが回避された。

雑に作っちゃいけませんね。。
ProtocolBuffersでのwrappers.protoの使い方

今回はProtocolBuffersを使用していてデフォルト値に関して苦しんだので、解決方法をシェアしたいと思います。

## ProtocolBuffersのデフォルト値


前提としてProtocolBuffersにはデフォルト値が存在します。




| 文字列            |       空文字列 |
|:-----------------|------------------:|
| バイト列           |              空バイト列 |     
| ブーリアン型        |           false(偽) |      
| 数値型            |           ゼロ | 
| 列挙型(enum)      |               定義の最初の値（数値は0）| 


proto2まではoptionalを使用してデフォルト値を設定していたようですが、proto3からはデフォルトでoptionalが適用されているそうで、何もしなければデフォルト値が入ってしまうということです。


では、protoにデフォルト値を入れたくない場合はどうすればいいのか・・・？

調べたらwrappers.protoを使用する方法に辿り着きました！

## wrappers.proto

使い方としては、

- wrappers.protoをimport
- 型をProtocolbufのwrappers.proto内で定義されているものにする


```ruby
import "google/protobuf/wrappers.proto";
 
message  Detailparam {
  google.protobuf.StringValue name = 1; //名前
  google.protobuf.StringValue adress = 3; //住所
  google.protobuf.Int32Value sex = 3; //性別
}
```

int32,int64,string,boolなど以下で定義されているので使いたい型に指定してあげてください！

https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/wrappers.proto


ちなみにgoogle.protobufはpackage名です。


その次はコンパイル！wrappers.protoでラッピングされていればok!


## Rubyでの使い方

実装で使用する際には、wrappers.protoのmessageでnewしてあげればok!

```ruby
User::V1::Detailparam.new(
        name: Google::Protobuf::StringValue.new(value: 'taro'）,
        adress: Google::Protobuf::StringValue.new(value: 'tokyo'）,
        sex: Google::Protobuf::Int32Value.new(value: １）
}
```

nilをいれたいときは

```ruby
User::V1::Detailparam.new(
        name: nil,
        adress: nil,
        sex: nil
)
```

にすればデフォルト値が入らず、ちゃんとnilが入ってくれます！



## 参考記事


[Proto2 vs Proto3 - Qiita](https://qiita.com/ksato9700/items/0eb025b1e2521c1cab79)
[protobuf typeに値が入っているか確認するにはgoogle/protobuf/wrappers.protoをつかうとよい - 平日インプット週末アウトプットぶろぐ](https://blog.soushi.me/entry/2017/09/03/170655)
[spring5-kotlin-application/task.proto at 970974cbc5c6116178a0088d4c651a9b9aeaf290 · soushin/spring5-kotlin-application · GitHub](https://github.com/soushin/spring5-kotlin-application/blob/970974cbc5c6116178a0088d4c651a9b9aeaf290/backend/src/main/proto/task.proto#L51)
[protobuf/wrappers.proto at master · protocolbuffers/protobuf · GitHub](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/wrappers.proto#L72)
Time Machine バックアップ失敗がOneDriveのファイル オンデマンド有効で発生してた

# 突如Time Machineバックアップが連続失敗
以前から1〜2年に1回くらいの割合でネットワーク経由のTime Machineバックアップは失敗したり、バックアップファイルが壊れて取り直したりというのがあった。ただ今回は、定期のバックアップが始まって暫くはプログレスバーが動いて進捗を容量ベースで表示してくれるもある程度進んでから「**ファイルのコピー中にエラーが起きました**」で止まるというもの。これまで経験したエラーは、プログレスバーが出る前の段階でのものだったので、これは初のパターン。
![timemachine_imconplete_with_onedrive.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100338/649f7132-29bd-d0dd-ba2d-974c6cd45285.jpeg)
最初はてっきりファイルサーバ兼用のEl Capitanマシン(macOS serverインストール済でTime Machineサービスが動いている)上のディスクイメージが不良かサービスの設定がおかしくなったかと思ってあれこれいじるも解決せず。しかしふとググった一覧に、**DropBoxのディレクトリをTimeMachineバックアップ対象外指定**云々という文字列が目に入った。

# そういやOneDriveのファイルオンデマンドを有効にしてた
ちょうど二日ほど前にSSD容量を空けようと、近年macOS用OneDriveアプリでも実装されたファイルオンデマンド機能を使い始めたことを思い出した。機能を有効にすると、Finder上ではファイルやフォルダのコンテキストメニューから「空き容量を増やす」でファイルの実体がローカルストレージから消えクラウド側に残される。

# OneDriveをバックアップ対象外にして解決
![timemachine_excpt_onedrive.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100338/9bf8029d-2d73-6312-6c03-03095da6ff4a.jpeg)
システム環境設定.app > オプション… > バックアップ対象から除外する項目
で[+]を押してOneDriveの同期対象フォルダを指定。ファイルオンデマンドを使うサブフォルダが決まっているならそれらを個別に指定してもいいはずだが、面倒なので一括。エラー出た後に変にいじってなければ、そのまま継続して差分バックアップしてくれる。

# どうしてこうなった
ファイルオンデマンド状態のファイルは他のアプリがアクセスしようとするとそのタイミングでクラウドからファイルの実体が取得されてようやくアクセス可能になるわけだが、バックアップ処理では当然全部のファイルにアクセス要求するわけだ。これを素直に受け入れてしまうと、せっかくクラウドのみに置くことでローカルストレージ容量を節約しているのに全部のファイルについて実体をローカルに持ってきてしまい、ファイルオンデマンドの意味が無い。選りすぐった一部だけの実体を持つ、のがファイルオンデマンドの本領発揮。よって、バックアップ処理の際にファイル実体を取ってこない仕様になっているのだろう。

# クラウドストレージの領域は別途ローカルでもバックアップ取る？
- 取らない説
    - クラウド上に原本あるんだから別に取らなくてイイじゃん説
    - クラウド上の原本と版が矛盾したり今回のトラブル事例あるからむしろ取るな説
- 取る説
    - クラウドストレージはバージョン管理がないので取っとく説
        - ただしバージョン管理付きのストレージサービスもまた多い
    - クラウドストレージは誤操作で消した経験にトラがウマってるので取る説(筆者)

とりあえずSSDのみのMacBook Airはファイルオンデマンドを使いたいのでOneDriveはバックアップ対象外、別途OneDriveとフル同期してるマシンではまるごとバックアップで当面運用してみることにした。

# バックアップ時にファイル実体を取ってこない設定
ここにあった。
![onedrive_basic_settings.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100338/77c5cb7b-678b-594a-e584-541f02f19ccb.jpeg)
メニューバー > OneDriveアイコン > […]その他 > 基本設定 > ファイルオンデマンド/アプリの管理
![onedrive_excluding_apps.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100338/128638a5-9ede-e325-6aef-4283098378f2.jpeg)
ここの「アプリケーション」一覧に "com.apple.pres.backup.remoteservice" が在るならば、Time Machine バックアップ時にクラウドからファイル実体を取得しない。おそらくこれを削除すると、バックアップの度に(つまりいつの間にか)せっかくファイルオンデマンドにしたのに全部ダウンロードし直されてしまう、という現象が出るのだろう。

# 参照
解決してからググったらもろ該当の事例が既にあった。
[【解決】macOS MojaveのTimeMachineバックアップが失敗する事象(青星総合研究所)](https://aoboshi.org/?p=1216)
moOde Audio5.3.1セットアップ覚書

###要約
####問題点
imgをSDに焼いた後、UPnPは動かないし入れたいサウンドドライバは動かなかった。
####解決策
imgを焼いた後、moodeaudio公式のbuild recipeを参考に修正。
####改善点
squeezeliteがWebUIから動かない

- - -
###経緯
moOde5.1からアップデートしたらWifiは動かないわ音は出なくなるわUPnPは切れるわドツボにハマったので覚え書きして使った時間を供養する。
素のままのMoOdeAudioだと勝手にAPモードに入って大変なのではじめから切っておく。
Build recipeも時々間違ってたりすることがあるらしいので適度に読み替えながら入力したほうが良い。

###環境
2019/06/14
Windows10 pro build 1903,  Raspberry pi 3B
###手順
* http://moodeaudio.org/#download からイメージファイルをダウンロード。win32DiskImager-0.9.5.exeでSDカードへ焼く。
SDを外す前にbootパーティションに空のテキストファイルをリネームして"ssh"に変更、wpa_supplicant.confを入れておく。

* 焼いてすぐのパスワードは一律"moodeaudio"なので念の為に先に変更しておく。

```
passwd pi
```


* 不要なパッケージを外す。

1行目のdnsmasq, hostapdがAPモードの要なので必要であれば残しておく。
upgradeしておくとkernelが最新になってしまう為、サウンドドライバの関係でkernelを4.19.46に強制変更する。
locate変更はbuild recipe通りだがエラーを吐いてしまう。raspi-configやWebUIから後々変更すれば良い。

```
sudo apt-get -y purge dnsmasq hostapd 
sudo apt-get -y purge libfaac-dev
sudo apt-get update
sudo apt-get -y upgrade

echo "y" | sudo PRUNE_MODULES=1 rpi-update f5e1ff99d6600fcc6d869a8c4fb63a5bb3a3e824
```

* http://moodeaudio.org/docs/SOURCES.html からBuild recipeをダウンロード、手順を見ながら動いてない機能があれば再度実行。
今回はmpdのビルドとUPnP機能を再度インストールし直す。

STEP2 - 4. Download moOde application sources and configs.
にてmoode-r531をダウンロード。
書かれていないがリネームを忘れると以下全てのmoode関連のコピーがうまくいかない。

```
mv moode-r531 moode
```

* gmeとcue対応のためmpdのインストール手順を一部変更。変更点は2と4。

STEP6 - 1. Create MPD runtime environment. から
STEP6 - 5. Compile and install. まで行う。


_2. Install MPD dev libs.

```
sudo apt-get -y install libmad0-dev libmpg123-dev libid3tag0-dev \
libflac-dev libvorbis-dev libfaad-dev \
libwavpack-dev \
libavcodec-dev libavformat-dev \
libmp3lame-dev \
libsoxr-dev \
libcdio-paranoia-dev libiso9660-dev \
libcurl4-gnutls-dev \
libasound2-dev \
libshout3-dev libyajl-dev \
libmpdclient-dev \
libavahi-client-dev \
libsystemd-dev \
libwrap0-dev \
libboost-dev \
libicu-dev \
libglib2.0-dev \
libgme-dev \
libcue-dev
```

_4. Configure compile options.

```
sudo ./configure --enable-database --enable-libmpdclient --enable-alsa \
--enable-curl --enable-dsd --enable-ffmpeg --enable-flac \
--enable-id3 --enable-soundcloud --enable-lame-encoder --enable-mad \
--enable-mpg123 --enable-pipe-output --enable-recorder-output --enable-shout \
--enable-vorbis --enable-wave-encoder --enable-wavpack --enable-httpd-output \
--enable-soxr --with-zeroconf=avahi \
--disable-bzip2 --disable-zzip --disable-fluidsynth --enable-gme \
--disable-wildmidi --disable-sqlite --disable-jack --disable-ao --disable-oss \
--disable-ipv6 --disable-pulse --disable-nfs --disable-smbclient \
--disable-upnp --disable-expat --disable-lsr \
--disable-sndfile --disable-audiofile --disable-sidplay
```

*　WebUIが不調な時は STEP 8 全部やり直すとデフォルトに戻る

* MPD Audio Scrobblerが機能しないので別のScrobblerを導入する。

```
sudo apt install mpdscribble
```

設定ファイルは以下にあるので各自のユーザー名、パスワードなどを記入
* COMPONENT 6 - Upmpdcliを全行程。

```
sudo nano /etc/mpdscribble.conf
```
* サウンドドライバを導入。筆者はSabreberry32の為こちらから導入。

http://nw-electric.way-nifty.com/blog/2019/06/post-a17d3c.html

 - - - 
#参考文献
moOde Audio [http://moodeaudio.org/]
new_western_elec[http://nw-electric.way-nifty.com]
jsonファイルを元にDockerでSwagger-ui用のコンテナを作成する

前回[この記事](https://qiita.com/dddEn/items/1c613862324129a5843c)でSwaggerのjsonファイルとyamlファイルを出力しました。
今回はそれを元にSwagger-ui用のDockerコンテナを作成したいと思います。

# Swagger-ui用のDockerコンテナ作成
[公式](https://swagger.io/)からSwagger用のimageが公開されているので、今回はそちら使用します。

[DockerHub:swaggerapi/swagger-ui](https://hub.docker.com/r/swaggerapi/swagger-ui)

## docker-compose.ymlの作成
さっそく書いていきましょう。
[この記事](https://qiita.com/dddEn/items/574ccdc057849e0e22ce)で作成した`sample_qiita`の直下にある`docker-compose.yml`に以下のように追記します。

```docker:docker-compose.yml

  swagger-ui:
    image: swaggerapi/swagger-ui
    container_name: "sample_qiita_swagger-ui"
    ports:
      - "8081:8080"
    volumes:
      - ./swagger-docs/swagger.json:/swagger.json
    environment:
      SWAGGER_JSON: /swagger.json
```

`SWAGGER_JSON`はコンテナ内に存在するファイルを指定することで、そのjsonファイルを元にSwagger UIを表示することができます。
 
`docker-compose up -d`でコンテナを起動し、[localhost:8081](localhost:8081)にアクセスするとswagger.jsonを元に作成されたSwagger UIが表示されます。

# 最後に
実は[今回の場合](https://qiita.com/dddEn/items/c28c25a71a7672d11de2)、ソースコードからAPIドキュメントを作成するボトムアップ式を採用しているので、正直作る意味がほとんどないんですよね。

また本当はここからさらにapiコンテナを立ててswaggerのコンテナと接続しcurlを実行できれば良いのですが、上手くできなかったのでこのような形になりました。
swaggerコンテナの中に入ってcurlコマンドを打つと上手く動くのに、実際にSwagger上でTry outを押してcurlコマンドで取得しようとすると上手く動きませんでした。

# 参考文献
[Dockerを使ってswagger.yamlをサクッとみる (swagger-ui 3.x)](https://qiita.com/NewGyu/items/6a00e0f09a7f8a93cfd5)
[Swagger EditorとSwagger UIをDockerで動かす](http://igatea.hatenablog.com/entry/2018/02/21/120007)
[Docker を使って Swagger の編集環境を構築する](https://qiita.com/kshigeru/items/411607232448e048afdf)
[DockerでSwagger UIを起動してAPI仕様書をブラウザに表示する手順](https://qiita.com/aucfan-engineer/items/5532fcf69b4f4dcd1c41)
[Spring Boot/KotlinでCRUD操作のできるAPIを作成する方法](https://qiita.com/dddEn/items/574ccdc057849e0e22ce)
[[Jackson]kotlin/springbootでSwaggerのjsonファイルとyamlファイルを出力する方法](https://qiita.com/dddEn/items/1c613862324129a5843c)
[swagger-api/swagger-ui](https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/installation.md)
PHP+Laravelで開発環境構築（MacOS）

#はじめに
**PHP**と**Laravel**を使ってアプリケーションを開発するために必要な環境構築を解説してます。
最後に参考にした記事のリンクを貼ってます。

##開発環境
MacOS Mojave version 10.14.5
Homebrewを使用（MacOSのパッケージマネージャー）

##**PHP**のインストール
MacOSには、デフォルトで**PHP**がインストールされているので特に操作は必要ないのですが念のために確認。

```
$ php -v
PHP 7.1.23 (cli) (built: Feb 22 2019 22:19:32) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
```

##**Composer**のインストール
**Composer**は、**PHP**のパッケージ管理プログラムです。
インストールしていきますが、エラーが発生したので挙動を載せておきます。

```
$ brew install homebrew/php/composer
Updating Homebrew...
==> Auto-updated Homebrew!
・
・
・
Error: homebrew/php was deprecated. This tap is now empty as all its formulae were migrated.
```

どうやら、**PHP7.2**が必要（現状のMacOSでは**PHP7.1**がデフォルトになっています）なのでインストールします。

```
$  brew install php@7.2
Updating Homebrew...
```

これで再度**Composer**をインストールします。

```
$ brew install composer
==> Downloading https://getcomposer.org/download/1.8.6/composer.phar
######################################################################## 100.0%
```

##**Laravel**のインストール
次に**Laravel**をインストールします。**Laravel**は、RubyのRailsやPythonのdjangoのようなフレームワークです。

インストールしていきます。

```
$ composer global require "laravel/installer"
Changed current directory to ...
```

成功したら、PATHを通します。

```
$ export PATH="$PATH:$HOME/.composer/vendor/bin"
```

PATHを通したら読み込みます。

```
$ source ~/.bash_profile
```

これで**PHP**+**Laravel**開発環境が完成しました。

##最後に
環境構築はご自身のOSの環境によりますので、参考までに。
**参考にした記事**
[Homebrewでphp7.2を入れようとしたらハマった](https://qiita.com/katokazu_dev/items/1da3c57ab43ac37bcde1)
[composerとは](https://qiita.com/atwata/items/d6f1cf95ce96ebe58010)
[macOSに Laravel 5.6 をインストールする手順をまとめてみる](https://qiita.com/igz0/items/bd5ab0aedc75d8476c76)
間違ってる箇所等あればコメントお願いします。