OmniAICreator/Qiita-1.07M huggingface dataset:
【jQuery】addClassに配列が使えるようになった


jQuery3.3.1がリリースされていた(!)

既に1ヶ月以上前の話ですが、
クラスを操作するメソッドに配列が使えるようになったらしいので
試してみました。

[jQuery 3.3.1](https://blog.jquery.com/2018/01/20/jquery-3-3-1-fixed-dependencies-in-release-tag/)
3.3.0のリリースでは問題が発生したので、3.3.1が推奨されています。

[jQuery 3.3.0 blog](http://blog.jquery.com/2018/01/19/jquery-3-3-0-a-fragrant-bouquet-of-deprecations-and-is-that-a-new-feature/)
>The .addClass(), .removeClass(), and .toggleClass() methods now accept an array of classes.

##jQuery3.3.1 配列でクラス付与
<p data-height="265" data-theme-id="0" data-slug-hash="paqavO" data-default-tab="js,result" data-user="kfunnytokyo" data-embed-version="2" data-pen-title="jquery3.3.1/addClass/array" class="codepen">See the Pen <a href="https://codepen.io/kfunnytokyo/pen/paqavO/">jquery3.3.1/addClass/array</a> by kayukihashimoto (<a href="https://codepen.io/kfunnytokyo">@kfunnytokyo</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

ちゃんと2つのクラスが付与されています。
記述した順番に付与されているので、
`blue`に当てたcssが適応されていますね。

やったね！

##jQuery3.2.1 配列でクラス付与
<p data-height="265" data-theme-id="0" data-slug-hash="YedYow" data-default-tab="js,result" data-user="kfunnytokyo" data-embed-version="2" data-pen-title="jquery3.2.1/addClass/array" class="codepen">See the Pen <a href="https://codepen.io/kfunnytokyo/pen/YedYow/">jquery3.2.1/addClass/array</a> by kayukihashimoto (<a href="https://codepen.io/kfunnytokyo">@kfunnytokyo</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

念のため、違うver.（3.2.1）でも試してみます。
もちろん、クラスは付与されません。


##jQuery3.3.1 クラス付与
<p data-height="265" data-theme-id="0" data-slug-hash="WMmjqK" data-default-tab="js,result" data-user="kfunnytokyo" data-embed-version="2" data-pen-title="jquery3.3.1/addClass" class="codepen">See the Pen <a href="https://codepen.io/kfunnytokyo/pen/WMmjqK/">jquery3.3.1/addClass</a> by kayukihashimoto (<a href="https://codepen.io/kfunnytokyo">@kfunnytokyo</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

一度に複数のクラスを付与するなら、わざわざ配列にしなくても、
スペース区切りで指定してあげれば良いですよね。

##jQuery3.2.1 変数に入れた配列でクラス付与
<p data-height="265" data-theme-id="0" data-slug-hash="ZrPKgZ" data-default-tab="js,result" data-user="kfunnytokyo" data-embed-version="2" data-pen-title="jquery3.3.1/addClass/array/variable" class="codepen">See the Pen <a href="https://codepen.io/kfunnytokyo/pen/ZrPKgZ/">jquery3.3.1/addClass/array/variable</a> by kayukihashimoto (<a href="https://codepen.io/kfunnytokyo">@kfunnytokyo</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

例えば、別で管理している配列があれば、
変数でクラスの付与が出来ますね。

頭の隅に置いておこう〜。

おわり！
ターミナルにおけるマイグレーション操作まとめ

「あれってどうやるんだっけ？前にも検索した気がするけど今日もググろう」をゼロに。

自分の備忘録かつ、今現在プログラミングを学習している方々の無駄な時間を節約するために。

※MVCについてある程度理解しているものとして話は進みます。

# 筆者の環境
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]
Rails 5.1.5

# DBを作成する
## やり方
```
$ rake db:create
```
## 何が起きるのか
開発中のアプリケーションと紐づくデータベース（DB）が作成される。

アプリを開発する際、一番初めにやること。
これをせずにマイグレーションを実行するとエラーが出る。だってマイグレーションファイルを提出しようにも、提出先のDBがないんだもの。
Railsチュートリアルとかを一通り終わらせて初めてアプリを作るって人にありがちな間違い。僕もそうでした。

# マイグレーションファイルを「提出」する
## やり方
```
$ rake db:migrate
```
## 何が起きるのか
DB上に各モデルのテーブルが作成されます。
よく「マイグレーションを実行する」というのはこのコマンドを実行することを指します。

db/migrate以下の全マイグレーションファイルが対象。
20180302112122_devise_create_user.rbのようなタイムスタンプから始まるファイル達です。

このマイグレーションファイルの内容通りにテーブルが作成され、レコードを保存する際にはファイル内の記述通りに処理されます。
ちなみに一度マイグレーションしたマイグレーションファイルは、後からコードを修正して再びマイグレーションしても、テーブルに対して全く何の影響も与えることができません。

マイグレーションファイルは「提出する」という概念がしっくりくるのです。その説明は記事の本筋から外れるため、詳しく知りたい方はググってくださいませ。

# マイグレーションの履歴を見る
## やり方
```
$ rake db:migrate:status
```
## 何が起きるのか
```
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20180228155323  Devise create users
   up     20180228155448  Create quadrants
   up     20180228155554  Create tasks
```
マイグレーションの実行履歴が上記のような形でターミナルに出力されます。

Statusがupになっていれば既に提出済みです。
Migration IDはマイグレーションファイル名のタイムスタンプ部分ですね。上記の場合、1行目だと「20180228155323_devise_create_users.rbは既にマイグレーションされています」という意味になります。

# ロールバックする
## やり方
```
$ rake db:rollback
```

## 何が起きるのか
```
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20180228155323  Devise create users
   up     20180228155448  Create quadrants
   up     20180228155554  Create tasks
```
これが・・・

```
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20180228155323  Devise create users
   up     20180228155448  Create quadrants
  down    20180228155554  Create tasks
```
こうなります。
マイグレーションにはステップという概念があり、rake db:rollbackが1ステップ分、マイグレーションを巻き戻すことができます。
※downとは「まだマイグレーションファイルが提出されていませんよ〜」という意味。

# 2ステップ分ロールバックする
## やり方
```
$ rake db:rollback STEP=2
```

## 何が起きるのか

```
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20180228155323  Devise create users
   up     20180228155448  Create quadrants
   up     20180228155554  Create tasks
```
これが・・・

```
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20180228155323  Devise create users
  down    20180228155448  Create quadrants
  down    20180228155554  Create tasks
```

ただのrake db:rollbackだけでは1ステップ分しかロールバックされませんが、ステップ数を指定することで好きなステップまでロールバックすることが可能です。

# テーブル内のデータを全削除する
## やり方
```
$ rake db:migrate:reset
```

## 何が起きるのか
アプリに紐づくDBそのものを削除し、再びDBを作成し、rake db:migrateが実行されます。
この操作は取り返しがつきません。実行前に「本当にやっちゃって大丈夫か」を必ずご確認ください。

#最後に
僕自身、まだまだ先人たちのドキュメントを参照しながら開発を続ける日々です。
インターネットって素晴らしいですね。本当に助けられてばかりです。

これからは少しでも恩返ししていければと思い、拙い知識を総動員して少しずつ記事を投稿していくと思います。

PS：間違いや認識違いがあればご指摘頂けると幸いです。
jsめも

イマドキのナウいJSの書き方
https://qiita.com/shibukawa/items/19ab5c381bbb2e09d0d9

ES2018で追加される機能まとめ
https://qiita.com/Yuta_Yamamoto/items/dc083fb8855e314b86d7

2018年のフロントエンドエンジニアならこの程度は知ってて当然だよな？
https://qiita.com/rana_kualu/items/96b303307d6435aedf8b





npm script
https://qiita.com/mysticatea/items/e9bf581fb28c5f1cd660

リーダブルコードの要約。８章はマスト
https://qiita.com/fkrw/items/7646563a2b238fbcff9a

ラバーダッキング
https://baigie.me/nippo/2017/04/25/rubberducking/

jest
https://facebook.github.io/jest/ja/

バニラ
https://qiita.com/nobkz/items/9c79f019f93335ee5140

dust
http://www.dustjs.com/

riot
https://qiita.com/nnahito/items/454e10559313e91198a9

JSテスト系
https://postd.cc/a-complete-guide-to-testing-javascript-in-2017/

ユニットテストって何?って人向けのmochaとchaiの使い方 https://qiita.com/y_hokkey/items/f73ea6b3d5f6902396b6

async/await 入門（JavaScript） https://qiita.com/soarflat/items/1a9613e023200bbebcb3
Roadworker で Route53 をコード化する

## Roadworkerとは

<a href="https://github.com/codenize-tools/roadworker" target="_blank">Roadworker</a> とは Route53 の設定を Ruby のコードで管理できる CLI ツールで、既存の設定をエクスポートしたり、新しく設定を追加したい場合はコードを書いて Route53 に反映したりできる便利なツールです。

リフカムでもレコード追加時にコメントを追加するなど、コード化したいという思いがあり、Roadworker を導入することになりました。

## インストール

Ruby で書かれたツールなので `gem install` でインストールできます。

```shell-session
$ gem install roadworker
```

インストールできたかバージョンを表示してみます

```shell-session
$ roadwork -v
roadwork 0.5.8
```

## 既存設定をエクスポートする

エクスポートは簡単に行うことができます

```shell-session
$ roadwork -e -o Routefile
Export Route53 to `Routefile`
```

オプションは

- `-e`：エクスポートを行う
- `-o`：出力先のファイルを指定する

という意味です。

HostedZone 毎にファイルを分割してエクスポートしたい場合は `--split` オプションをつけることによってファイルを分割することができるようです。

## 設定をインポートする

インポートのテストは `--dry-run` オプションで行うことができます。

```shell-session
$ roadwork -a --dry-run
```

実際にレコードを Route53 に反映させたい場合は `--dry-run` オプションを外して `-a` オプションのみで実行します。

```shell-session
$ roadwork -a
```

## まとめ

Route53 のコード化が Roadworker を使用することによって簡単に行うことができました。

エクスポート機能があるので、途中からでも簡単に導入できますし、コード化することによって、PR ベースでレビューも行えることから操作ミスもなくなり、品質の向上に繋がりそうです。

## 参考

- <a href="https://github.com/codenize-tools/roadworker" target="_blank">https://github.com/codenize-tools/roadworker</a>
俺言語 その12

#概要
俺言語をやってみた。
avrにアセンブラで実装してみた。
Lチカやってみた。

#拡張
DDRB PORTB PINBをそれぞれ、r,o,pに割り当てた。
PB2を出力は、r=4
PB2に、highを出力は、0=4、lowは、o=0

delayを@に割り当てた。

```
delay:
	clr 	r0
	clr		r1
	dec 	r0
	brne	PC - 1
	dec 	r1
	brne	PC - 3
	dec 	r17
	brne	PC - 5
	ret
```


#写真
![MVC-005F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/77c0237c-a4b0-9661-e856-38e3f450a08c.jpeg)

#回路図
![image](https://qiita-image-store.s3.amazonaws.com/0/18104/58f23cdd-a7c8-ab09-ca53-6c450ae18145.png)


#環境
avr studio 4
attiny85 1mhz
tera term
usb-serial

#サンプルコード
Lチカ

```
10 r=6
20 a=0
30 a=a+1
40 @=10
50 o=2
60 @=10
70 o=6
80 #=a<10*30
```

以上。
Lambdaでグローバルに置いた変数は使いまわされる

Lambdaに置いたコードって、呼び出されるたびにコードを読み込んで実行されると思っていましたが違うようです。
とある外部モジュールを使っていたのですが、シングルトンとして初期化してexportされているオブジェクトの動きが妙だったので試してみました。

```js:singleton.js
function Singleton() {
    this.counter = 0;
}
// シングルトンとして初期化してexport
module.exports = new Singleton();
```

```js:index.js
// Singletonオブジェクトを取得
const singleton = require('./singleton');

exports.handler = (event, context, callback) => {
    // カウンターをインクリメント
    singleton.counter++;
    // カウンター値を返す
    callback(null, singleton.counter);
};
```

このLambdaを何度も呼び出してみます。

```:結果
(1回目) 1
(2回目) 2
(3回目) 3
```

外部から読み込もうが内部に書こうが、結果は同じです。もっとシンプルに書くとこう。

```js:index.js
const singleton = {
    counter : 0    
};

exports.handler = (event, context, callback) => {
    // カウンターをインクリメント
    singleton.counter++;
    // カウンター値を返す
    callback(null, singleton.counter);
};
```

```:結果
(1回目) 1
(2回目) 2
(3回目) 3
```

えっ、もしかして常識…？

> (追記)
> 一定時間呼び出されないとリセットされるようなので、使いまわされても使いまわされなくても動くように作る必要があります。
> また、デプロイしなおすと必ずリセットされます。
find コマンド や zsh による検索についての Tips

* chef-repo配下で下記コマンドを実行すれば、metadata.rbのみをリスト化できる。

```
find . -maxdepth 3 -name metadata.rb
```
* metadata.rbの中から ubuntu という記載をgrepするコマンドを作成して実行する。

```
find . -maxdepth 3 -name metadata.rb | xargs grep ubuntu
```
※zshを使ってるなら
　### 例) metadata.rbに ubuntu という文字列が含まれているファイルを探す

```
grep 'ubuntu' **/metadata.rb
　※(**/**/ の階層は適当に)
```
htaccessで、httpからhttpsへリダイレクトさせる

ElB（ロードバランサー@AWS）環境で、httpからhttpsにリダイレクトをかける際は、htaccessファイルに以下を記述すると良い。X-Forwarded-Protoを気にしないと、無限ループが発生してしまう。
詳しくは、[こちら](https://ikuty.com/web/aws-htaccess-without-redirectloop/)

```
RewriteEngine On
# Force HTTPS
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R,L]
```
Angular schemasについて

##schemasプロパティ
schemasプロパティには、Angularのコンポーネントやディレクティブではない、Angular外で定義された要素とプロパティをHTMLパーサがどのように取り扱うか指定します。

SchemaMetadata型のプロパティにおいて、下表の2種類が指定できます。

| プロパティ　 | 挙動　　　|
|:----------|:----------|
| NO_ERRORS_SCHEMA  | すべての要素とプロパティを許可します。  |
| CUSTOM_ELEMENTS_SCHEMA  | '-' を含む要素をカスタムエレメントとして扱い、それのみを許可します。  |

##NO_ERRORS_SCHEMA
テスト対象となるコンポーネントのテンプレート内で、他のコンポーネントを使用しているケースを想定する。

使用している子コンポーネントをTestBedに追加していない場合、Angularコンパイラはテスト実行時に、子コンポーネントのタグを認識できず例外を投げます。

 

このままでは、毎回すべての子コンポーネントをTestBedに記述する必要があり、準備が煩雑になってしまいます。そこで、テストモジュールのメタデータにschemasプロパティを追加して、その配列内にNO_ERRORS_SCHEMAを記述することで、認識できない要素と属性を無視するようにコンパイラに指示します。

NO_ERRORS_SCHEMAを追加するだけで、無関係のコンポーネントやディレクティブをTestBed内に追記する必要がなくなります。

```typescript:hoge.spec.ts
beforeEach(async(() => {
  TestBed.configureTestingModule({
    declarations: [ BaseHeaderComponent ],
    schemas: [NO_ERRORS_SCHEMA]//ここ追加
  })
  .compileComponents();
 }));
```
macbook pro 2017のスペースキーの押しが悪いので外してみる。そして付けてみる。

# ※ 全ては自己責任でお願いします。

macbook proを利用しているがスペースキーの押した感じがなくなり、反応が悪くなっていたのでスペースキーを剥がしてみました。の自分用の備忘録です。
一応、ボタンは押せるようになりました。


外すとこんな感じ。

<img src="https://qiita-image-store.s3.amazonaws.com/0/30329/883706da-4d11-b3a8-103e-52d99d636f4d.png" width="400px">

ボタンがどうくっついていたのかこの時点だと不明

<img src="https://qiita-image-store.s3.amazonaws.com/0/30329/74038cbc-3664-0a51-8b28-9a75a6208e43.png" width="400px">

スペースキーのボタンとボタンについていた部品を剥がした所
 
<img src="https://qiita-image-store.s3.amazonaws.com/0/30329/8b71581f-2bb8-6ac7-3673-92b7f0dd488a.png" width="400px">

スペースキーのボタンと部品を止めているところのアップ

<img src="https://qiita-image-store.s3.amazonaws.com/0/30329/7ad3c74c-63b0-bd47-9df3-50eb3906adbf.png" width="400px">

## スペースキーの外し方

1. キーの隙間から薄いカードのようなものを差し込み、ゆっくり持ち上げるを数回左右クイクイやると取れます。（左右小さなポチがハマっているので慎重に対応しないとポチが折れて元に戻せなくなると思うので最新の注意が必要です。）

2. 内部とボタンをキレイに拭きましょう。

## スペースキーの付け方

1. スペースキーボタンと部品を外して、部品の方を先にくっつけます。部品のほうの写真をみると４つのポチが左右にあります。このポチをボタンの配置場所の左右に差し込むところがありそこに差し込みます。（見えづらいのでカメラでアップしながら作業したほうがいいです。）

2. 部品がハマったら、スペースキーボタンの方をくっつけます。スペースキーのボタンは上下で止める部品の形がちがいます。横にはめ込むタイプと縦にはめ込むタイプです。横にはめ込むタイプを先にはめ込み、縦はその後にはめ込みます。（うまくはまればポチっと鳴ります。）

## 対応して感じたこと。

- 大雑把な人はやらないほうがいい。
- こまめなメンテナンスがキーボードを長持ちさせる。
- ボタンの押しが悪いなって思ったらまずはエアー。

以上です。
GitHub Flow 概要

# はじめに
gitは独特の作法があるために初心者には敬遠されがちですが、慣れてしまえば効率的な開発が可能です。
ここでは、GitHub Flowについて解説します。

# 手順
## 概要
GitHub Flowの流れは単純です。

* 最新のmasterブランチから説明的な名前を付けたtopicブランチをローカルで切る（checkout -b）
* topicブランチ上で開発
    * masterブランチを直接編集することは原則禁止
* コミット対象のファイルをステージングし（add）、コミット（commit）する
* 提出できるコミットができたら、リモートの同名ブランチにアップロード（push）する
* マージするよう申請を行う（pull request / merge request）
    * レビュアーはGitHub / GitLabのページ上で指摘を入れる
    * 必要があればコードを修正して再度commitとpush
        * この時、新しく修正用のブランチを切る必要はない
* レビューが通ったならば、masterブランチにマージする

フローから分かる通り、masterブランチは「全てのスクリプトが問題なく動作するブランチである」という暗黙の了解があります。

## 開発開始（checkout）
開発を開始するときは、最新のmasterブランチから任意の名前を付けたtopicブランチを切り、作成したブランチに移動します。
ここでは、リモート上のoriginリポジトリのmasterブランチが最新であるものとして、以下のコマンドを叩きます。

```sh:console
# 最新版のremoteリポジトリを取得
git fetch origin master 

# origin/masterからブランチを切って移動
git checkout -b <ブランチ名> origin/master
# git checkout -b mytopic origin/master
```

## 経過の保存（add/commit）
作業ブランチでの開発が進み一段落したら、作業の保存のために変更内容をインデックスに登録（ステージング）し、コミットをします。

直接コミットを行わずにステージングという段階を経るのは、コミットに関連するファイルを選別する意味があります。
詳しくはhttp://daretoku-unix.blogspot.jp/2009/08/git.html などを参考にしてください。

### ステージング（add）
ステージングするためには以下のコマンドを叩きます。

``` sh:console
# カレントディレクトリ配下のファイル（サブディレクトリ含む）すべてをステージングする場合
git add .

# 特定のファイルを登録する場合
git add <対象ファイル、またはディレクトリ>
# git add hoge.py

# 特定のファイルを複数登録する場合
git add <対象ファイル、またはディレクトリ> <対象ファイル、またはディレクトリ> ...
# git add hoge.py fuga.R
```
ステージングの状況がどうなっているかは```$ git status```で確認できます。
ステージングされたファイルは<font color = "lightgreen" >緑</font>、ステージングされていないファイルは<font color = "red" >赤</font>で表示されます。

また、ステージングを行うとgit内部にステージング対象ファイルの編集内容が保存されます。
つまり、ステージングを行った後に対象ファイルを編集し、その状態でコミットを行うと、ステージング時点での状態でコミットが行われます。


### コミット（commit）
ステージングが完了したらコミットしましょう。

```shell
git commit -m "コメント：作業内容を書く"
```

## リモートへアップロード（push）
レビューが行えるコミットができたら、リモートへアップロードします。
以下のコマンドを叩きます。

``` shell
git push origin <ブランチ名>
# git push origin mytopic
```

以上で、リモートにアップロードされました。
githubやgitlabのページを確認してみましょう。

## masterブランチにマージ
GitHub/GitLabのページ上からmasterにマージするように申請します。
GitHubではpull request、GitLabではmerge requestといいます。

### 申請
#### GitHubの場合
GitHubのページからPull Requestを送ります。
baseにmaster、compareにpushしたトピックブランチを指定します。

#### GitLabの場合
Source branchにmaster、Target branchにpushしたトピックブランチを指定します。

### レビュー依頼
#### GitHubの場合
Reviewerにレビュアーを指定してください。メールかなにかで通知が飛びます。
口頭でも一言「レビューお願いします」と言っておくと尚良しです。

#### GitLabの場合
レビュアーに声かけて、レビューをお願いしてください。
Assigneeに自分を指定すると、通知が受け取れるはずです。

### レビュー
Reviewerは、間違っていると思われるところ・よく分からないところに指摘を入れていきましょう。
Assigneeは、指摘に対しての説明を返すか、コードを修正しましょう。
修正したコードは、同じリモートブランチにpushすることで更新されます。

### マージ
すべての指摘事項が解決したら、pull request / merge requestのページからmergeをします。
mergeは原則としてレビュアーが実施します。

mergeが完了すると、トピックブランチの開発は終了です。
お疲れ様でした。
AD2 > I2C > ERRORという表記 > SCLとSDAの接続が反対でした

```txt:動作環境
Windows 8.1 Pro (64bit) 
  - on VMware workstation 14 Pro, version:14.0.0 build-6661328
Analog Discovery 2 (以下AD2)
WaveForms 2015 v3.7.5
```

[Raspberry Pi > C > RPi_i2c_comm_180227: v0.4 > GPIOピンのレベル設定と、レベル読取まで](https://qiita.com/7of9/items/b925c943822deb7f9d01)
で実装中のI2C通信確認のため、AD2を使い始めている。

### ERROR

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5c0d35da-fa2d-e648-ac10-84429380bac0.png)

ERRORというデータが表示される。

### 対処

https://forum.digilentinc.com/topic/2471-i2c-data-acquistion-from-analog-discovery/

> It seems that you have reversed the clock and data lines. Set SCL 7 and SDA 15. After this, configure the trigger again.

SCLとSDAの接続を反対にしたところ。。。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/bd89d64c-3d2c-9ec9-5bfb-b55b9c93913c.png)

読めた。

~~h2Cに対するACKが取れていない?~~

ACKとしての表記をするには横幅が足りないだけのようだ。

「Mode:」を「Repeated」から「Record」に変更し、記録した出力の時間軸を拡大すると、h06に対するACKも取れていることを確認できた。
ターミナル覚書

# はじめに
この記事では、割と便利そうなLinuxコマンドを書いていきます。
不定期に足されていく予定。

# ファイル操作系

## カレントディレクトリ以下に存在する、特定文字列のファイルを全部削除

```bash:bash
find . -name <string> | xargs rm -r

# "._"で始まるファイルの場合
# find . -name "._*" | xargs rm -r 
```
GCE ディスク追加(xfs)とサイズ拡張

やったことをメモとしてここに記載します。

# サーバ

OS: CentOS7

# ディスク追加手順

* コンソールでディスクを追加と作成する
* フォーマット＆マウント前の状況確認

```
# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda1      xfs        10G  2.5G  7.6G  25% /
devtmpfs       devtmpfs  1.8G     0  1.8G   0% /dev
tmpfs          tmpfs     1.8G     0  1.8G   0% /dev/shm
tmpfs          tmpfs     1.8G  8.3M  1.8G   1% /run
#
tmpfs          tmpfs     1.8G     0  1.8G   0% /sys/fs/cgroup
tmpfs          tmpfs     354M     0  354M   0% /run/user/1001

# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda      8:0    0  10G  0 disk
└─sda1   8:1    0  10G  0 part /
sdb      8:16   0  10G  0 disk
└─sdb1   8:17   0  10G  0 part
```
この例では、sdb が新しい永続ディスクのデバイス ID です

* ディスクをフォーマット＆マウント

```
$ mkfs.xfs -f /dev/sdb
$ mkdir /mnt/data
$ mount -t xfs -o noatime,logbufs=8 /dev/sdb /mnt/data

ディスクパフォーマンスを向上させるために
noatime (ファイル読み込み時に、アクセスタイムスタンプを更新しない)
logbufs (logbuffer数 2-8を指定)
を設定してます。
```
* ディスクの確認

```
# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda1      xfs        10G  2.5G  7.6G  25% /
devtmpfs       devtmpfs  1.8G     0  1.8G   0% /dev
tmpfs          tmpfs     1.8G     0  1.8G   0% /dev/shm
tmpfs          tmpfs     1.8G  8.3M  1.8G   1% /run
tmpfs          tmpfs     1.8G     0  1.8G   0% /sys/fs/cgroup
tmpfs          tmpfs     354M     0  354M   0% /run/user/1001
/dev/sdc       xfs        10G   33M   10G   1% /mnt/data
```

* 永続ディスクを /etc/fstab ファイルに追加して、インスタンスが再起動した場合に自動的にデバイスが再マウントされるようにする

```
# blkid /dev/sdb
/dev/sdb: UUID="4c16f0b5-df29-4249-b07b-5d8f7d767e63" TYPE="xfs"

# vi /etc/fstab 

UUID=4c16f0b5-df29-4249-b07b-5d8f7d767e63 /mnt/data xfs defaults 0 2
を追加
```

# GCE ディスク拡張

* コンソールで拡張対象ディスクのサイズを変更する
* サーバで下記のコマンドを実行する

```
# xfs_growfs /dev/sdb
```
ルートディスクなら、サーバ再起動が必要です。

# 備考
* CentOS6の場合、サーバで下記のコマンドを実行してディスクを拡張する

```
# resize2fs /dev/[DISK_ID]
```

# 参考：

* ディスク（ext4）の追加方法

https://cloud.google.com/compute/docs/disks/add-persistent-disk?hl=ja
Sequel Pro でSQL実行履歴をたくさん残す設定

周りであまり知られていなかったので簡単にシェア

## Sequel Pro について

Mac用のSQLクライアントです。シンプルでデータ調査で重宝しています
使い方などは本家サイトへ - [Sequel Pro](https://www.sequelpro.com/)

## 実行履歴の数の増やし方

Sequel Pro > 環境設定 > 一般 > 直近のクエリの記憶数

<img width="575" alt="スクリーンショット 2018-03-02 10.23.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/6833e52d-40c1-fd01-a7be-c4795dd32622.png">

上限は実験的に試してみましたが、100件のようです。これでクエリ履歴に1週間程度の実行履歴は残ってくれて、転記忘れても大丈夫な状態を作れます

![スクリーンショット 2018-03-02 10.31.39.png](https://qiita-image-store.s3.amazonaws.com/0/61095/8a745b67-0ede-1c1d-6740-c292dc601e69.png)
tmux.conf

```
$ cat .tmux.conf
unbind C-b
set-option -g prefix C-t
bind C-t send-prefix
bind \ split-window -h
bind - split-window -v
bind -r k resize-pane -U
bind -r j resize-pane -D
bind -r h resize-pane -L
bind -r l resize-pane -R
bind -r Left select-pane -L
bind -r Down select-pane -D
bind -r Up select-pane -U
bind -r Right select-pane -R
bind r source-file ~/.tmux.conf
set-option -g history-limit 50000

# Ctrl-t Ctrl-p Start logging.
bind-key C-p pipe-pane -o '/bin/sh -c "while read -r LINE; do echo \"[\$(date +\"%%Y_%%m%%d_%%H%%M%%S_%%N\")] \${LINE}\" >> \${HOME}/.tmux/log/\$(date +%Y%m%d-%H%M%S)-#S-#I.#P.log; done "' \; display-message"Logging start."
# Ctrl-t Ctrl-o Stop logging
bind-key C-o pipe-pane \; display-message "Logging end."


setw -g window-status-current-fg blue

#set-option -g status-utf8 on

set -s escape-time 0

set-window-option -g mode-keys vi

set-option -g status-position top

set-option -g status-left-length 90
set-option -g status-right-length 90

set-option -g status-left '#H:[#P]'

set-option -g status-interval 1

set-option -g status-justify centre
```
引数処理(getopt)

#本題
```python.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys,datetime,getopt
from logging import Formatter,getLogger,FileHandler,StreamHandler,DEBUG,INFO,WARNING,ERROR
from getopt import GetoptError
agv = sys.argv
d = datetime.datetime.today()

#logger settings
logger = getLogger(__name__)
logger.setLevel(DEBUG)

#Streamhandler settings
handler1 = StreamHandler()
handler1.setFormatter(Formatter("%(asctime)s : [%(filename)s] LINE=%(lineno)d %(levelname)s %(message)s"))
handler1.setLevel(INFO)

#Filehandler settings
handler2 = FileHandler(filename="/var/log/"+agv[0].rstrip('.py')+"_"+d.strftime("%Y%m%d_%H%M%S")+".log")
handler2.setLevel(INFO)
handler2.setFormatter(Formatter("%(asctime)s : [%(filename)s] LINE=%(lineno)d %(levelname)s %(message)s"))

#link handler to logger
logger.addHandler(handler1)
logger.addHandler(handler2)

#dont propagate to other logger
logger.propagate = False

def usage():
    usage = """
    usage: python.py -a <numeric> -p <numeric> -m <minutes> JOBID
    [OPTION]
    -h,--help   : shows help for this script
    -a,--app    : IDs of registered VM(only numeric allowed)
    -p,--policy : IDs of policy(only numeric allowed)
    -m,--min    : maximum running minutes(only numeric allowed)
    """
    print(usage)

try:
    shortopt = 'a:p:m:h'
    longopt = ['app','policy','min','help']
    opts, args = getopt.getopt(sys.argv[1:], shortopt, longopt)
except GetoptError as e:
    usage()
    logger.error("error in option parsing: " + str(e))
    sys.exit(1)

for o, a in opts:
    def _intchk (exit_no):
        try:
           int(a)
        except ValueError as ve:
           usage()
           logger.error("not numeric: " + str(ve))
           sys.exit(exit_no)

    if o in ("-h", "--help"):
        usage()
        sys.exit()
    if o in ("-a", "--app"):
        _intchk(3)
        APPID = int(a)
    if o in ("-p", "--policy"):
        _intchk(4)
        POLICYID = int(a)
    if o in ("-m", "--min"):
        _intchk(5)
        MIN = int(a)

logger.info(str(agv[0]) + " -a " + str(APPID) + " -p " + str(POLICYID) + " -m " + str(MIN) + str(agv[7]))

```

#助長過ぎる
ここまでで引数チェックしかしてない。
引数チェックのエラーハンドリングをロギングする必要がなければ、argparseのが良い。
Cassandra decommission と removenode についての覚書

# decommission（ringから外す）について
- thrift は disable, gossipは enable の状態で decommissionをするのが正しい。
 - gossip有効のままでdecommisionしないと、decommissionした情報が他nodeに反映されず、ringから外れるのではなく、Downとして認識されてしまう。

# removenode について
- remove対象node が生きている場合は、 nodetool removenode [ID] のみでOK
  - remove対象node が存在しない場合は、 nodetool removenode [ID] 実行後に nodetool removenode force を実行しなければいつまで経ってもコマンドが完了しない。→ [参考1](https://docs.datastax.com/en/cassandra/latest/cassandra/tools/toolsRemoveNode.html)
[参考2](https://wiki.apache.org/cassandra/NodeTool)
俺言語 その11


#概要

俺言語をやってみた。
avrにアセンブラで実装してみた。
zundokoやってみた。

#写真
![image](https://qiita-image-store.s3.amazonaws.com/0/18104/fab11b4a-b48e-86a6-0cb4-2c1bb1cd1977.png)


#環境

avr studio 4
attiny85 1mhz
tera term
usb-serial


#サンプルコード
zundoko

```
5 a=0
10 #=$<3*60
20 ?="zun "
30 a=a+1
40 #=a>4*90
50 #=10
60 ?="doko "
70 a=0
80 #=10
90 ?="doko ki yo shi!!"
```

以上。
引数処理（argparse）

#注意点
引数が適切でない場合は、プログラムを勝手に終了させる。
なのでException処理ができない。ログに残す必要があるなどの場合は、optget使うしかないか・・・。

(2018/3/6 追記)
サブクラス化してargparse.ArgumentParser（super class）のエラーメソッドをオーバーライドすれば、プログラム終了を回避できる(以下訂正)。

```python:py.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
import sys

#error methodのオーバーライド
class ThrowingArgumentParser(argparse.ArgumentParser):
    def error(self, message):
        #エラーをロギング。loggerの設定は別記事参照
        logger.error('error occured　while parsing args : '+ str(message))
        parser.print_help() 
        sys.exit(1)

import argparse # argparseモジュールをimport

helpmsg = """
This is help message.
You can set any messages here.
"""


parser = ThrowingArgumentParser(description=helpmsg)
parser.add_argument('-a','--application', # オプションを指定
                    help = "this is vm's registered ID",
                    # help表示時の引数の説明。囲むのは"でも'でもいい。
                    required = True,
                    # 引数の省略可否。boolean型
                    type = int,
                    # 型(str,longなど)を指定
                    choices = ['not','yet'], 
                    # 指定できる引数を[]内のものに限定
                    default = none 
                    # 引数未指定の場合のデフォルト値
                    action = 'store' 
                    # オプション指定時の動作指
                      ============================
                      store:普通に引数を取得して格納
                      const:constキーワード引数で指定された値を格納
                      store_true : オプションの指定あり=true、なし=falseを格納 
                      store_false : オプションの指定あり=false、なし=trueを格納
                      ============================
                    dest = 'SAMPLE'   # destを変数として値を格納
                    )
                    
args = parser.parse_args() 
#ここでsys.argvからの引数を実際に処理する。エラーハンドリングも内部でされるので、try文なしでOK。
```
俺言語 その10

#概要

俺言語をやってみた。
avrにアセンブラで実装してみた。
乱数やってみた。

#拡張

乱数は、$で、０から１５をとる。
アルゴリズムは、seed * 5 + 1

```
ransu:
	cpi		ADR, '$'
	brne	get12
	ldi		r17, 5
	clr		r21
	add		r21, r2
	dec		r17
	cpi		r17, 0
	brne	PC - 3
	inc		r21
	mov		r2, r21
	andi	r21, 0x0f
	mov		VAL, r21
	ret
```
#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/ac3fb874-6ec8-4e50-8b57-fcbfed74c951.png)


#環境

avr studio 4
attiny85 1mhz
tera term
usb-serial

#サンプルコード

乱数を１１個

```
10 a=0
20 ?=$
30 a=a+1
40 #=a<11*20
```

以上。
sbcl の http-request の使い方 (Post)

Common Lisp のひとつである、sbcl の http Post のサンプルです。
quicklisp.lisp のインストールが済んでいるものとします。

```lisp:sbcl_post.lisp
#! /usr/bin/sbcl --script
; -------------------------------------------------------------------
;	sbcl_post.lisp
;
;						Mar/02/2018
;
; -------------------------------------------------------------------
(format t "*** 開始 ***~%")
(load "~/quicklisp/setup.lisp")
(ql:quickload :drakma)
(defvar out_str)
(setf out_str (flexi-streams:octets-to-string
	(drakma:http-request "http://httpbin.org/post" :method :post
		:parameters '(("user" . "jiro") ("password" . "123456"))
		)
	))
(format t out_str)
(format t "*** 終了 ***~%")
(quit)
; -------------------------------------------------------------------
```

実行結果

```text
$ ./sbcl_post.lisp 
*** 開始 ***
To load "drakma":
  Load 1 ASDF system:
    drakma
; Loading "drakma"
....
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "password": "123456", 
    "user": "jiro"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Connection": "close", 
    "Content-Length": "25", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Drakma/2.0.4 (SBCL 1.4.0; Linux; 4.15.5-1-ARCH; http://weitz.de/drakma/)"
  }, 
  "json": null, 
  "origin": "153.233.236.237", 
  "url": "http://httpbin.org/post"
}
*** 終了 ***
```

Get のサンプルはこちら
[sbcl の http-request の使い方 (Get)](https://qiita.com/ekzemplaro/items/afb663c1af444ada887b)
Mac で aws-cli を利用する際にコマンド補完ができるように設定する。

# はじめに
普段 Mac で AWS CLI をよく利用するのですが、いちいち全部手入力は大変ですよね。。。 そんな時、コマンド補完機能を使えば、Tab キーを使って補完できるのでとても便利です。
この機能は AWS CLI インストールしただけでは自動的有効とはならないため、手動で設定する必要があります。

http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-command-completion.html

# はじめに
## シェルの確認
まずは Mac で利用しているシェルを確認します。

```bash:シェル確認①
$ echo $SHELL
/bin/bash
```

```bash:シェル確認②
$ ps
  PID TTY           TIME CMD
22320 ttys000    0:00.23 -bash
```

```bash:シェル確認③
$ which aws_completer
/Users/kohei/.pyenv/shims/aws_completer
```

# 保管設定
今回は bash であったため、その場合の設定です。

```bash:保管設定
$ complete -C '/usr/local/bin/aws_completer' aws
```

# 確認
実際に補完ができているか確認します。

```bash:補完確認
$ aws s
s3                  sagemaker-runtime   servicecatalog      shield              sns                 stepfunctions       support 
s3api               sdb                 servicediscovery    sms                 sqs                 storagegateway      swf 
sagemaker           serverlessrepo      ses                 snowball            ssm                 sts
```

ちょっとレスポンスに時間かかりましたが、ちゃんと補完できました。


# おわりに
aws-cliはバージョンアップが頻繁に行われるので、気がつくと利用してるバージョンが古いことが多々あります。
バージョンアップしたときなど、補完機能を使うことでどんなawsコマンドがあるかを確認できるので便利です。
雪豹でgitをビルドした

2018年の2月後半にgithubがtlsの設定を変えたようで、Mac OS X(雪豹)からアクセスできなくなりました。

```
bash-3.2$ git clone https://github.com/yamori813/I2CREMOCON.git
Cloning into 'I2CREMOCON'...
error: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol v
ersion while accessing https://github.com/yamori813/I2CREMOCON.git/info/refs?ser
vice=git-upload-pack
fatal: HTTP request failed
```

実はsoucefogeがこれよりちょっと前に設定変えてsvnのアクセスができなくなり、どうしようか考えている矢先でした。

いろいろ思案したのですが、gitをビルドする事にしてみました。

gitは以下のような依存があります。

![git_depend.png](https://qiita-image-store.s3.amazonaws.com/0/104066/d558e8c9-f938-b80e-716e-746799e4d77e.png)

古いgitはシステムのcurlとopensslを使っていたために、アクセス不能になりました。

まずopensslをビルドします。コンパイラーも古いので、システムに入っている物と近い1.0.2nをダウンロードしてコンパイルしました。

```
bash-3.2$ ./Configure darwin64-x86_64-cc -shared
bash-3.2$ make
bash-3.2$ sudo make install
```

これで/usr/local/sslにファイルがコピーされます。デフォルトではdylibが作られないようだったので-sharedを指定しました。

次はcurl(7.58.0)をビルドします。

```
bash-3.2$ LDFLAGS=-L/usr/local/ssl/lib;export LDFLAGS
bash-3.2$ CFLAGS=-I/usr/local/ssl/include;export CFLAGS
bash-3.2$ ./configure --with-ca-bundle=/usr/local/share/curl/curl-ca-bundle.crt
bash-3.2$ make
bash-3.2$ sudo make install
```

CAのファイルは/usr/local/share/curl/curl-ca-bundle.crtがデフォルなんですが、何故か指定しないと見てくれないようだったので設定しました。

ところがCAのファイルですが元々のcurlだとそもそも拾えません。

```
bash-3.2$ /usr/bin/curl https://curl.haxx.se/ca/cacert.pem
curl: (35) error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protoc
ol version
```

新しくビルドしたcurlでもCAファイルがなくてそのままではアクセスできず、-kオプションで取得しました。これで/usr/local/share/curl/curl-ca-bundle.crtを作るとcurlが使えるようになります。

/usr/localにcurlが入ったのでgit(2.16.2)をビルドします。

```
bash-3.2$ LDFLAGS="-L/usr/local/ssl/lib -L/usr/local/lib";export LDFLAGS
bash-3.2$ CFLAGS="-I/usr/local/ssl/include -I/usr/local/include";export CFLAGS
bash-3.2$ ./configure --prefix=/usr/local/git
bash-3.2$ make 
bash-3.2$ sudo make install
```

/usr/local/gitに古いバイナリあってパスが通っていて、install前にgitコマンドを確認すると古いコマンドファイルが使われてエラーがでます。あらかじめmvなどしてから確認すると良いです。

これで元通り使えるようになりました。

```
bash-3.2$ git clone https://github.com/yamori813/I2CREMOCON.git
Cloning into 'I2CREMOCON'...
remote: Counting objects: 20, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 20 (delta 4), reused 20 (delta 4), pack-reused 0
Unpacking objects: 100% (20/20), done.
```

昔はオープンソースをコンパイルするとコンパイラーのバージョンなどでコンパイルエラーとか良く出ていましたが、このビルドでエラーは一つもありませんでした。ほんとgcc4の功績は偉大だと思います。

まだまだ雪豹。

後日追記：subversion-1.9.7のビルドを試したのですが、autogen.shがエラーで実行できずビルドできませんでした。
Project Euler 44「五角数」

五角数の判定はこれのnが整数であること。

```math
n=\frac{\sqrt{24N+1}+1}{6}
```

# Problem 44 「五角数」
五角数は Pn = n(3n-1)/2 で生成される. 最初の10項は
1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...
である.
P4 + P7 = 22 + 70 = 92 = P8 である. しかし差 70 - 22 = 48 は五角数ではない.
五角数のペア Pj と Pk について, 差と和が五角数になるものを考える. 差を D = |Pk - Pj| と書く. 差 D の最小値を求めよ.

```python
def hoge():
    penta = []
    n = 1
    while True:
        pk = n * (3 * n - 1) / 2
        for pj in penta[::-1]: # 差が小さくなるものから順にチェック
            if (((24 * (pk + pj) + 1) ** 0.5 + 1) / 6).is_integer() and \
               (pk - pj) in penta:
                return int(pk - pj)
        penta.append(pk)
        n += 1

print(hoge())
```

和と差の判定の順番を入れ替えると死ぬほど遅くなる。
チェック回数が倍率ドンとかそんな感じなんだろうと思うが一切確証はない。

```console
xxx@xxx$ time python3 wa-sa.py
5482660
real    0m1.757s
user    0m1.752s
sys     0m0.004s
xxx@xxx$ time python3 sa-wa.py
5482660
real    1m39.104s
user    1m38.960s
sys     0m0.008s
```
pythonにおけるロギング

スクリプトに直書きしたのが以下。

```python:py.py
#import logging library
import datetime
import sys
from logging import Formatter,getLogger,FileHandler,StreamHandler,DEBUG,INFO,WARNING,ERROR

a=sys.argv
d = datetime.datetime.today()
#logger settings
logger = getLogger(__name__)
logger.setLevel(DEBUG)
#Streamhandler settings
handler1 = StreamHandler()
handler1.setFormatter(Formatter("%(asctime)s [%(levelname)s] (%(filename)s) %(message)s"))
handler1.setLevel(INFO)
#Filehandler settings
handler2 = FileHandler(filename="/var/log/"+a[0].rstrip('.py')+"_"+d.strftime("%Y%m%d_%H%M%S")+".log")
handler2.setLevel(INFO)
handler2.setFormatter(Formatter("%(asctime)s [%(levelname)s] (%(filename)s) %(message)s"))
#link handler to logger
logger.addHandler(handler1)
logger.addHandler(handler2)
#dont propagete to other logger
logger.propagate = False
```
あまりにも長いので設定ファイルから読みたいが、ログファイル名はスクリプト名をsysargvで取ってきて設定したい。しかし、設定ファイルの一部オーバーライドができないようなので、標準出力は設定ファイルで、ファイル出力は直書きとした。

```python:log.conf
[loggers]
keys=root,myself #rootは使わないが、書かないとエラーになる？

[handlers]
keys=hand01,hand02

[formatters]
keys=form01,form02

[logger_root]
level=NOTSET
handlers=hand01

[handler_hand01]
class=StreamHandler
level=INFO
formatter=form01
args=(sys.stdout,)

[formatter_form01]
format= %(message)s
class=logging.Formatter

[logger_actifio]
level=DEBUG
handlers=hand02
propagate=0
qualname=actifio

[handler_hand02]
class=StreamHandler
level=INFO
formatter=form02
args=(sys.stdout,)

[formatter_form02]
format=%(asctime)s : [%(filename)s] LINE=%(lineno)d %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S
class=logging.Formatter
```
上記で使用するユーザmyselfに対して、hand02,form02を紐付ける。これを本スクリプトで以下のように呼び出す。

```python:main.py
import sys,datetime
from logging import config,Formatter,getLogger,FileHandler,StreamHandler,DEBUG,INFO,WARNING,ERROR

#log settings
jname = sys.argv
d = datetime.datetime.today()
filename = "/var/log/"+a[0].rstrip('.py')+"_"+d.strftime('%d')+".log"
config.fileConfig("/var/etc/log.conf")
logger = getLogger("myself") #ここにconfファイルに設定したlogger"myself"を指定
#ログ出力のための追加設定(mainスクリプト毎に書く)
handler2 = FileHandler(filename=filename)
handler2.setLevel(INFO)
handler2.setFormatter(Formatter("%(asctime)s : [%(filename)s] LINE=%(lineno)d %(levelname)s %(message)s", "%Y-%m-%d %H:%M:%S"))
logger.addHandler(handler2)
```
もっと簡単な方法があれば、教えて頂きたい。
How to clean up orphanedVM host with status = Invalid in ESXi

### 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114634/6e6aee64-9b97-29e5-732c-312c32c3c9a3.png)


### How to fix

**/etc/vmware/hostd/vmInventory.xml**

```shell-session
vi /etc/vmware/hostd/vmInventory.xml

(remove the lines for the virrtual machine)


/etc/init.d/hostd restart

```



### References

Inaccessible virtual machines are named as Unknown VM (2172)
https://kb.vmware.com/s/article/2172

Restarting the Management agents in ESXi (1003490)
https://kb.vmware.com/s/article/1003490
sbcl の http-request の使い方 (Get)

Common Lisp のひとつである、sbcl の http Get のサンプルです。
quicklisp.lisp のインストールが済んでいるものとします。

```lisp:sbcl_get.lisp
#! /usr/bin/sbcl --script
; -------------------------------------------------------------------
;	sbcl_get.lisp
;
;						Mar/02/2018
;
; -------------------------------------------------------------------
(format t "*** 開始 ***~%")
(load "~/quicklisp/setup.lisp")
(ql:quickload :drakma)
(defvar out_str)
(setf out_str (flexi-streams:octets-to-string
	(drakma:http-request "http://httpbin.org/get")
	))
(format t out_str)
(format t "*** 終了 ***~%")
(quit)
; -------------------------------------------------------------------
```

実行結果

```text
$ ./sbcl_get.lisp 
*** 開始 ***
To load "drakma":
  Load 1 ASDF system:
    drakma
; Loading "drakma"
....
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Connection": "close", 
    "Host": "httpbin.org", 
    "User-Agent": "Drakma/2.0.4 (SBCL 1.4.0; Linux; 4.15.5-1-ARCH; http://weitz.de/drakma/)"
  }, 
  "origin": "153.233.236.237", 
  "url": "http://httpbin.org/get"
}
*** 終了 ***
```
エラーハンドリング

```python:py.py
print '処理開始'

try:
    print 'try-開始'
    #エラーを発生させるため0除算
    a = 10 / 0
    print 'try-終了'

except Exception as e:
    logger.debug('debug INFO== '+str(e))
    logger.warning('warning:: MSG== '+str(e))
    logger.error('error occured:: MSG== '+str(e))
    logger.info('INFO == '+str(e))
print '処理終了'
```
loggerは別途設定が必要
Angularで作るER DIAGRAM TOOL - 第八回　スキーマの作成・編集・削除機能の実装

基本的には、modelとほとんど同じです。

##（１）schemaを登録・編集するフォームモーダルを作ります。

/src/app/modal-schema/modal-schema.component.ts
https://github.com/dog-ears/er-diagram-tool/commit/9cd12ed5429013cb8fafaca36dd8083b8d0cbfb2#diff-2588015c073ce9535c2d4c6b404f79ea

・dataService.addSchema()は未実装

/src/app/modal-schema/modal-schema.component.html
https://github.com/dog-ears/er-diagram-tool/commit/9cd12ed5429013cb8fafaca36dd8083b8d0cbfb2#diff-3c1bd9797de95d11f665231c2a92f3e7

・項目が多いため長いですが、やってることはシンプルです。



##（２）左カラムに表示するschema用のコンポーネントを作ります。

/src/app/schema/schema.component.ts
https://github.com/dog-ears/er-diagram-tool/commit/9cd12ed5429013cb8fafaca36dd8083b8d0cbfb2#diff-2588015c073ce9535c2d4c6b404f79ea

・@Input() first、@Input() lastは、現在のschemaの順番が先頭（or末尾）というフラグ。並び替え矢印の表示・非表示に使います。
・dataService.deleteSchema()、dataService.moveSchema()は未実装

/src/app/schema/schema.component.html
https://github.com/dog-ears/er-diagram-tool/commit/9cd12ed5429013cb8fafaca36dd8083b8d0cbfb2#diff-509ca554e45e65071f64a71eb7976013

・is_pivot、first、lastによって、各パーツが表示・非表示されます。



##（３）dataServiceの更新

/src/app/service/data.service.ts
https://github.com/dog-ears/er-diagram-tool/commit/9cd12ed5429013cb8fafaca36dd8083b8d0cbfb2#diff-ae990bb302f27e60323deb45d6746b17

・未実装だったaddSchema()、deleteSchema()、moveSchema()を実装
・data.getModelById()は未実装

上記dataServiceのaddSchema()、deleteSchema()で、schemaのparent_idから親modelを取得する必要があるので、
dataクラスに実装します。

/src/app/class/data.ts
https://github.com/dog-ears/er-diagram-tool/commit/9cd12ed5429013cb8fafaca36dd8083b8d0cbfb2#diff-ba726bfa70586322bd593dddb7beaf87



##（４）moduleへの読み込み

moduleにSchemaComponent、ModalSchemaComponentを追加

/src/app/app.module.ts
https://github.com/dog-ears/er-diagram-tool/commit/9cd12ed5429013cb8fafaca36dd8083b8d0cbfb2#diff-fc6b22833aeaf77f8440c4970ade705e



##（５）modelからの呼出し

/src/app/model/model.component.ts
https://github.com/dog-ears/er-diagram-tool/commit/9cd12ed5429013cb8fafaca36dd8083b8d0cbfb2#diff-14ac3c6b037418c538e10e3c5571bbbe

・ModalSchemaComponentのimport
・addSchema()の実装

/src/app/model/model.component.html
https://github.com/dog-ears/er-diagram-tool/commit/9cd12ed5429013cb8fafaca36dd8083b8d0cbfb2#diff-e7b9f22b5724e30d03dbdfd83021ec15

・各schema要素のIDは、「model1-schema1」のような形になります。
-> schemaクラスに、要素のIDを返すメソッドを実装します。

/src/app/class/schema.ts
https://github.com/dog-ears/er-diagram-tool/commit/9cd12ed5429013cb8fafaca36dd8083b8d0cbfb2#diff-43602a3f26ba4b6bcf22b9c72c3fec66

・getElementId()の実装



最後にスタイルを調整

/src/styles.css
https://github.com/dog-ears/er-diagram-tool/commit/9cd12ed5429013cb8fafaca36dd8083b8d0cbfb2#diff-0fd3637456511d89012d5274dd855970

・マテリアルアイコンのcursorをpointerに。（ただしdisableクラスがついているときは、defaultで半透明にする。）

![cap08.jpg](https://qiita-image-store.s3.amazonaws.com/0/103767/27317476-db09-94ea-3ffe-dce2938a6dd1.jpeg)


ちょっと、説明をはしょりすぎた気もしますが、schemaの実装まで終わりました。
次回は、Jsplumbの実装に入ります。
VSCode+XDebug(PHP) トラブルシューティング

VSCodeにて、特定のフォルダでのみデバッグが動作しなくなる現象が起きたのでメモとして。
他にもあったらあとから追記します。
#設定は合っているか?
launch.jsonの設定が間違っていると、ソースのディレクトリを認識できなかったり、ポートが開けなかったりします。
まずは見直しましょう。
#.vscodeフォルダの置き場所は合っているか?
デバッグしたいPHPファイルと同じ階層に.vscodeフォルダがないと動いてくれないようです。
.vscodeフォルダの中にはlaunch.json等が入っているのでこちらも設定を確認してください。
#今開いているディレクトリはデバッグしたいPHPファイルと同じ階層か?
開いているディレクトリがデバッグしたいPHPファイルと同じ階層でないと、今開いているディレクトリにある.vscodeフォルダを参照しに行ってしまい、ファイルパスがうまく取れないことがあります。
pythonのヘッダ

```python:python.py
#!/usr/bin/env python
#pythonをenv読み込んでから起動。envがpythonを勝手に探してくれるので汎用的。
# -*- coding: utf-8 -*-
#スクリプトの中身をutf−8とする。python 3からはデフォルトでutf−8なので入らない模様。
```
CoffeeScriptを始める②

# Node.jsインストール
CoffeeScript実行環境を作るにも、Coffee Lintを導入するにもnpm（node.jsのパッケージマネージャ）が使えないとやりづらい。
node.jsをインストールすれば、npmも使えるようになるので、node.jsをインストールする。

## chocolateyでNode.jsインストール
windows環境では、chocolateyを使うと諸々のインストールが簡単に行えるのでお勧め。
chocolateyが導入されていれば、以下のコマンドで``Node.js``がインストールできる。
管理者権限のコマンドライン or PowerShell 推奨。

```shell-session
choco install nodejs
```
コンソールを再起動した上で、
以下のコマンドで、バージョンが表示できれば``node.js``導入OK

```shell-session
node -v
```

# CoffeeScriptインストール
npmコマンドが使えるようになれば、以下のコマンドでインストールできる。

```shell-session
npm install -g coffee-script
```
簡単。

コンソールを再起動した上で、
次のコマンドでバージョンが表示されることを確認する。

```
node -v
```

# Coffee Lintインストール
Coffee Lintは次のコマンドでインストールできる。

```shell-session
npm install coffeelint
```

簡単。
コンソールを再起動した上で、
次のコマンドでバージョンが表示されることを確認する。

```shell-session
coffeelint -v
```

# Hello world!
Hello worldを作ってみる。

次のコードを記述。

```coffee:hello.coffee
hello = ->
  console.log("Hello World!")

hello()
```

実行してみる。

```shell-session

coffee hello.coffee
```

``Hello World!``が表示さればOK.

次は、``JavaScript``にコンパイルしてみる。

```shell-session
coffee -c hello.coffee
```

hello.jsが作られる。

```javascript:hello.js
(function() {
  var hello;

  hello = function() {
    return console.log("Hello World!");
  };

  hello();

}).call(this);
```

前回ATOMに導入したpreviewを使うと、リアルタイムで`JavaScript`への変換結果を表示してくれる。

## 参考
[Windows に node.js を chocolatey でインストールして gulp を導入する with PowerShell](https://qiita.com/kitakitash/items/f62abeb4f103000d0ca2)
[「CoffeeScript」の開発環境を用意して、サンプルを表示してみよう](https://codezine.jp/article/detail/6392)
[いまさら聞けない！npmのこれだけは知っておきたい基礎知識](https://www.webprofessional.jp/beginners-guide-node-package-manager/)
Google Apps Script 1時間おきに、スプレッドシートに相席ラウンジの混雑状況のスクレイピングを定期実行する

# やったこと

- Google Apps Scriptで相席ラウンジの混雑状況を一時間おきにスクレイピングする

# 技術選定基準

- 最初はPythonとHerokuでやろうかと思っていたが、定期実行プログラムの選択肢が少ない
- サーバーたてるのめんどうくさい。CRONとWebアプリ一個作るのにも時間がかかる
- Google Apps Scriptなら、サーバー立てずにCRONもWebアプリも簡単に作れるから

# 実装方法
- スプレッドシートでIMPORTXML関数で行い、スクレイピング
- その結果をGoogle Apps Scriptで定期実行プログラムを組む
- これをすることによって、リアルタイムの1点の値ではなく、時系列データを取得することができるようになります。

# 結果から分かったこと

- 店舗ごとに男女比が若干異なる
- 開店したばかりが男女差が激しいので、男性が入るなら早いほうが選べる
- あたりまえだけど花金は人が多い

オリエンタルラウンジ　渋谷店

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/d3ecc608-ad6b-7a3e-6469-a474bcc535b3.png)

オリエンタルラウンジ　新宿店

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/05b5f22e-0557-6998-ded3-a820b39cc141.png)

オリエンタルラウンジ　町田店

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/dac0398c-5963-59b8-df73-42e8fa0a3d55.png)

# 実装方法

- この記事にまとめました

【GAS】IMPORTXML関数で取得した値を、1時間おきに定期実行で行を追加する
https://review-of-my-life.blogspot.jp/2018/02/gas-importxml-cron.html



# その他おすすめ記事

Google Apps Script 相席ラウンジの混雑データを毎日1時間おきに取得して、それをグラフィカルに分析できるWebサイトを公開しました
https://qiita.com/kkdmgs110/items/2cf7b84ac8ddebdde80a

LINEからDMMのアダルト動画のサンプルを見れる、変態コンシェルジュ作りました！
https://qiita.com/kkdmgs110/items/3483ad6cb5c85983ffc6

Google Apps Script 1時間おきに、スプレッドシートに相席ラウンジの混雑状況のスクレイピングを定期実行する
https://qiita.com/kkdmgs110/items/e9e56ab2dd454c69d302

【Python】DMM Web APIでエッチなデータを取得し、TwitterでえっちなBotを作った話
https://qiita.com/kkdmgs110/items/13c728fcccb059f17755

【Python】TinderのAPIを使って、青山大学周辺で遠隔ナンパする
https://qiita.com/kkdmgs110/items/5f68ebef4afe230f75de
Google Apps Script 相席ラウンジの混雑データを毎日1時間おきに取得して、それをグラフィカルに分析できるWebサイトを公開しました

# やりたいこと

- 相席ラウンジで男だけになって不毛な会場がある
- 今空いている店舗、混んでいる店舗の現在状況、そして予測ができたら、経営者、顧客ともにハッピー
- まずはデータをとって可視化できるようにしたい

# 実装したこと

- Webアプリ上で、相席ラウンジの在席状況を可視化し、過去の統計データを分析できるページを作成しました
- 相席アナライザー：
- https://script.google.com/macros/s/AKfycbx0bke55aKe1TD4UqAyR2FfdJWMJ4-R12fTYCwJiEpeChU2Kvfc/exec

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/4b587313-3915-eea8-5297-6655dc9bbc22.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/72ed9ea2-568b-0c72-c084-9834884d9c41.png)

# 実装技術
- Google Apps Script
    - CRONとサーバーは全部これで終わり
- Google Spreadsheet
    - スクレイピングはIMPORTXML関数

# 実装方法

- Google Apps Script上で
    - HTMLファイルの作成
    - Google Apps Scriptでバックエンド
    - DBはGoogle Spreadsheet
- 実装方法はこの記事にまとめました。

https://review-of-my-life.blogspot.jp/2018/02/google-apps-scriptweb.html

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/23189131-19a5-da37-0f6c-f4459bb5e728.png)


# 今後やりたいこと

- 相席穴場店のデータ分析（ちゃんと可視化したいな）

# その他おすすめ記事

Google Apps Script 相席ラウンジの混雑データを毎日1時間おきに取得して、それをグラフィカルに分析できるWebサイトを公開しました
https://qiita.com/kkdmgs110/items/2cf7b84ac8ddebdde80a

LINEからDMMのアダルト動画のサンプルを見れる、変態コンシェルジュ作りました！
https://qiita.com/kkdmgs110/items/3483ad6cb5c85983ffc6

Google Apps Script 1時間おきに、スプレッドシートに相席ラウンジの混雑状況のスクレイピングを定期実行する
https://qiita.com/kkdmgs110/items/e9e56ab2dd454c69d302

【Python】DMM Web APIでエッチなデータを取得し、TwitterでえっちなBotを作った話
https://qiita.com/kkdmgs110/items/13c728fcccb059f17755

【Python】TinderのAPIを使って、青山大学周辺で遠隔ナンパする
https://qiita.com/kkdmgs110/items/5f68ebef4afe230f75de
Elasticsearch 6.2.2 で インデックス作成時にシャードやレプリカの数を設定する

デフォルトの設定でインデックスを作成するとシャード数 5 でレプリカ数 1 となり、単一ノードだとクラスタのステータスが yellow になります。
ステータスが yellow の場合は一部のレプリカが割り当てられていないことを表しています。

```
$ curl -X PUT 'localhost:9200/shop'
$ curl -X GET 'localhost:9200/_cluster/health'
```

上記のように実行すると

```
{
  "cluster_name": "elasticsearch",
  "status": "yellow",
  "timed_out": false,
  "number_of_nodes": 1,
  "number_of_data_nodes": 1,
  "active_primary_shards": 5,
  "active_shards": 5,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 5,
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks": 0,
  "number_of_in_flight_fetch": 0,
  "task_max_waiting_in_queue_millis": 0,
  "active_shards_percent_as_number": 50
}
```

となっており、active_primary_shards が 5 で、unassigned_shards が 5 になっています。

シャードの情報を取得すると、

```
$ curl -X GET 'localhost:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason'
```

以下のようにレプリカが設定されていないことが判ります。

```
shop 3 p STARTED    
shop 3 r UNASSIGNED INDEX_CREATED
shop 1 p STARTED    
shop 1 r UNASSIGNED INDEX_CREATED
shop 2 p STARTED    
shop 2 r UNASSIGNED INDEX_CREATED
shop 4 p STARTED    
shop 4 r UNASSIGNED INDEX_CREATED
shop 0 p STARTED    
shop 0 r UNASSIGNED INDEX_CREATED
```

このような場合、以下のようにしてシャード数やレプリカ数を設定して調整することができます。（ここではレプリカ数を0 にしています）

```
$ curl -X PUT 'localhost:9200/shop' -H 'Content-Type: application/json' -d'
{
    "settings" : {
        "index" : {
            "number_of_shards" : 1,
            "number_of_replicas" : 0
        }
    }
}
'
```

これでクラスタのステータスは green になりました。

```
{
  "cluster_name": "elasticsearch",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 1,
  "number_of_data_nodes": 1,
  "active_primary_shards": 1,
  "active_shards": 1,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 0,
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks": 0,
  "number_of_in_flight_fetch": 0,
  "task_max_waiting_in_queue_millis": 0,
  "active_shards_percent_as_number": 100
}
```

```
shop 0 p STARTED 
```

なお、この設定は elasticsearch.yml には記載できませんでした。
ヘルスチェック結果についての項目は **[こちら](https://qiita.com/nettle0010/items/e3871c2c28557295ea08)** にまとめました。

### 参考になった記事
[Create Index](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html)
[cat shards](https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-shards.html)
Oracle CREATE SEQUENCE 文取得

```SQL:get_ddl_sequences.sql
-- #!/bin/sh
-- #@(#) \$Id get_ddl_sequences.sh
-- #
-- # su - oracle
-- # export ORACLE_SID=xxxx
-- # export ORACLE_HOME=/usr/app/oracle/product/12.1.0
-- #
-- #export NLS_LANG=JAPANESE_JAPAN.AL32UTF8
-- ${ORACLE_HOME}/bin/sqlplus / as sysdba << EOF
--
--  CREATE SEQUENCE 文取得
--
--    SEQUENCEはROLLBACKしても元に戻らないし、またCACHEで複数の連番を一時的に
--    メモリに持つ都合、元のSTART WITHがそのまま保障されるとは限らない。
--
--  history
--    2018/08/05  CONST.LF → CONST.NL
--
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING OFF
SET LINESIZE 80
orySET PAGESIZE 5000
SET TAB OFF
SET TERMOUT OFF
SET TRIMSPOOL ON
-- SPOOL pass includes CONNECT_IDENTIFIER, USER_NAME and SYSDATE
COLUMN USER_NAME    NEW_VALUE USER_NAME
COLUMN SYSTEM_DATE  NEW_VALUE SYSTEM_DATE
SELECT USER || '_' AS USER_NAME
     , TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS') AS SYSTEM_DATE
FROM DUAL ;
SPOOL get_ddl_sequences_&&_CONNECT_IDENTIFIER._&&USER_NAME&&SYSTEM_DATE..sql
-- Windows ↑,  UNIX/Linux では ↓ を有効に
-- SPOOL get_ddl_sequences_\&&_CONNECT_IDENTIFIER._\&&USER_NAME\&&SYSTEM_DATE..sql
COLUMN CREATE_SEQUENCE  FORMAT A80
-- CREATE SEQUENCE文
SELECT  -- https://docs.oracle.com/cd/E57425_01/121/SQLRF/statements_6017.htm#i2067093  SQL language reference
    'CREATE SEQUENCE ' || US.SEQUENCE_OWNER || '.' || US.SEQUENCE_NAME || CONST.NL
 || 'INCREMENT BY '    || TO_CHAR(US.INCREMENT_BY) || CONST.NL
 || 'START WITH '      || TO_CHAR(US.LAST_NUMBER)  || CONST.NL
 || 'MAXVALUE '        || TO_CHAR(US.MAX_VALUE)    || CONST.NL
 || 'MINVALUE '        || TO_CHAR(US.MIN_VALUE)    || CONST.NL
 || DECODE(US.CYCLE_FLAG, 'Y', 'CYCLE', 'NOCYCLE') || CONST.NL
 || DECODE(US.CACHE_SIZE, 0, 'NOCACHE', 'CACHE ' || TO_CHAR(US.CACHE_SIZE)) || CONST.NL
 || DECODE(US.ORDER_FLAG, 'Y', 'ORDER', 'NOORDER') || ' ;' AS CREATE_SEQUENCE
FROM(
    SELECT COLUMN_VALUE AS OWNER FROM TABLE(PKG_USERS_SCHEMA.GET_USERS_SCHEMA)  -- ユーザーが作成したスキーマのみ
    ) MS
INNER JOIN DBA_SEQUENCES US  -- https://docs.oracle.com/cd/E57425_01/121/REFRN/GUID-5867804F-1339-4CB6-9A56-6B6DCECB61BB.htm  reference
ON  US.SEQUENCE_OWNER = MS.OWNER
ORDER BY
    US.SEQUENCE_OWNER
  , US.SEQUENCE_NAME ;
SPOOL OFF
COLUMN CREATE_SEQUENCE  CLEAR
SET ECHO ON
SET FEEDBACK ON
SET HEADING ON
SET LINESIZE 80
SET TERMOUT ON
-- exit
-- EOF
-- #export NLS_LANG=en_US
-- # ---------------------- End of get_ddl_sequences.sh ------------------------------

```
参照
[Oracle 定数](https://qiita.com/Papageno/items/7eb6b6207db3fce65e1a)
[Oracle 純粋にユーザー側のスキーマのみを取得](https://qiita.com/Papageno/items/2d4ccae4b99d79d0b48b)