OmniAICreator/Qiita-1.07M huggingface dataset:
RxSwift 4 の Signal と Relay

メモ書きレベルですが

# Signal とは
- replay しない Driver
    - ほんまに差分それだけ
        - https://github.com/ReactiveX/RxSwift/blob/4.0.0/RxCocoa/Traits/Signal/Signal.swift
        - https://github.com/ReactiveX/RxSwift/blob/4.0.0/RxCocoa/Traits/Driver/Driver.swift
- [VIPER](https://www.objc.io/issues/13-architecture/viper/) のようなアーキテクチャでレイヤ間をストリームで繋いでいる場合、View からの UI イベントを Presenter に流すストリームなんかは replay する必要がないので Driver でなく Signal で良さそうですね
- 逆に Presenter から View に何か表示する状態 (ViewModel とか) を渡すときには最新の状態を replay してくれる Driver の方が良さそうです

# Relay とは
- Error と Complete の流れない Subject
   - Subject とは https://qiita.com/morishin/items/99c0493de58079b722fe#subject-
- `PublishRelay`, `BehaviorRelay` がある
   - `PublishRelay` の実装を見ると `PublishSubject` をラップして Next しか流せないようにしてるだけというのがわかる https://github.com/ReactiveX/RxSwift/blob/4.0.0/RxCocoa/Traits/PublishRelay.swift
- エラーが流れないということは `onErrorRecover:` `onErrorDriveWith:` `onErrorJustReturn:` を指定しなくても `asDriver()`, `asSignal()` できる?
   - `BehaviorRelay` は `asDriver()` しかできなくて `PublishRelay` は `asSignal()` しかできない
      - replay するストリームと replay しないストリームは型レベルで分けていきたいのかな...? (推測)
      - なんか `ObservableConvertibleType` の `asSharedSequence` も deprecated にするみたいですね https://github.com/ReactiveX/RxSwift/pull/1443#issuecomment-335515890
   - `asSignal()` はどちらからもできる
railsのDBをPostgreSQLに変更する

### 前置き
タイトルママ
ralisのDBはデフォルトだとsqliteが使われてるので変更が少し面倒でした。

### 方法

①posgresqlをインストールする

```
$ brew install posgresql
$ pg_ctl -D /usr/local/var/postgres start #起動する
$ psql -l #DBのリストが表示されたら成功です
```
②railsの設定

```
$ rails new pg_app -D posgresql # rails newのオプションでDBをあらかじめ選択しておく
$ bundle install 
``` 

③DB初期化

```
rake db:create
rake db:migrate #　これで完了！
```

### 補足

Macだと①の```psql -l```でリストがうまく表示できないことがある。
これはMacにデフォルトでインストールされているposgresqlが邪魔になっているのが理由らしい。
その場合は、修正batchを用いて

```
$ cd /usr/local/Cellar/postgresql
$ curl -o fixBrewLionPostgresql.sh http://nextmarvel.net/blog/downloads/fixBrewLionPostgres.sh
$ chmod 777 fixBrewLionPostgresql.sh
$ ./fixBrewLionPostgresql.sh
```

これを流した後に、
```
$ pg_ctl -D /usr/local/var/postgres restart #再起動してあげる
```

で、繋がる(はず)

### 参考

http://taise.hatenablog.com/entry/2013/10/13/162546
http://kgmx.hatenablog.com/entry/2014/04/08/085425
検索　リストのリアルタイム絞り込み

自分メモ用。

```js
/*----------------------------------------
検索　リストの絞り込み
----------------------------------------*/
var searchtext1 = '#search-table-word';
var searcharea1 = $('#search-table');
$(document).on('input keyup blur', searchtext1 , function (e) {
	//検索ワード指定
	var search = $(searchtext1).val();
	searcharea1.find('.tr').hide().each(function () {
		var tr = $(this);
		$(this).find('.td').each(function () {
			if ($(this).text().match(search)) {
				tr.show();
			}
		})
	});
});
```
Nuxt.jsでwebpack.configを拡張してaliasを登録する

#nuxt.jsのwebpack拡張方法
nuxt.config.js内のbuild内にコードを記述

``` nuxt.config.js
module.exports = {
  build: {
    //ここに記述
    extend (config, ctx) {
      // サンプルではpushで渡している
      config.module.rules.push({
        enforce: 'pre',
        test: /\.(js|vue)$/,
        loader: 'eslint-loader',
        exclude: /(node_modules)/
      })
    }
  }
}

```

## aliasを登録する方法
上記のを少しカスタマイズ
＊私はpathモジュールを使っているので事前にインストールしていますが必須ではありません。

``` nuxt.config.js
module.exports = {
  build: {
    extend (config, ctx) {
      let path = require('path');
      config.resolve.alias['@components'] = path.join(__dirname, 'components')
      config.resolve.alias['@parts'] = path.join(__dirname, 'components/parts')
    }
  }
}

```

``` hoge.vue
<script>
import Logo from '@components/Logo.vue'
</script>
```

##悩み
``` nuxt.config.js
config.resolve.alias = {
  '@components' : path.join(__dirname, 'components')
  '@parts' : path.join(__dirname, 'components/parts')
}
```
みたいな感じで複数登録を簡単に出来ないだろうか
(上ではエラーで出来ない）
Windows のWebKit ビルドではまったメモ

# 前置き
Windows 版(AppleWin ポート)のWebKit をビルドしようとしてはまったメモ書きです。
ビルド時間が長いのでその間に書いてます。
WebKit の説明ページは[ここ](https://webkit.org/webkit-on-windows/#installing-developer-tools)。

環境
1. Window10 (別に8.1 でもいいと思う)
2. Visual Studio 2015

# cygwin でビルドしない、Windows 環境下でやる
ビルドするときのpath 設定がWindows 依存(C:\ とか)の部分があり、それで悩む。
何とかすれば回避できそうではあるが、Windows 環境下なら特に問題ないのでそちらが楽。

# git vs svn
おススメはsvn。リビジョン指定できるから。
どうしてもgit clone がproxy 越えられなかった。

# インストールパスにスペースを入れない
WebKit のページには、Bison のパスにスペース入れるなとだけ書いてあるが、実はGperf も必要。
たぶんFlex も(未確認)

# revision によってはそもそもビルドが通らないことがある
最大の罠。すぐに判断できない。
すべての手を尽くしてもビルドできないなら、リビジョンを変えてみる。

# debug ビルドは起動即クラッシュ
いくつかのASSERT に引っかかる。
変なことはせず、デフォルトのRelease でビルドしましょう。

# ソリューションファイルどこ？
WebKitBuild/Release/WebKit.sln

# VS のスタートアッププロジェクトどれ？
Tools 下MiniBrowser です。

# 環境構築失敗した、ビルドやり直したい
WebKitBuild ディレクトリを消せばOK(たぶん)
少なくとも、git/svn の管理外ファイル全部消せば大丈夫。
IE11でpostMessageが動作しない

# ie11でpostMessageが動作しない

以下のように実装していたのですが、IE11だけ動作しませんでした。

```javascript
fileUploadWindow.postMessage(postData, document.defaultView.origin);
```

以下のように、ワイルドカードを指定することで動作するようになりました。
私は別ウィンドウを立ち上げて、そっちに向けてpostMessageを実行していましたが問題なく動作しました。
windows10・IE11(11.726.15063.0)


```javascript
fileUploadWindow.postMessage(postData, '*');
```

[このページ](https://stackoverflow.com/questions/16226924/is-cross-origin-postmessage-broken-in-ie10)を参考にしました。
ウインドウ立ち上げ方法から指定していましたが、そこらへんは特に関係ありませんでした。
IE11のバージョンかな？

**追記**
どうやら、`document.defaultView.origin`が悪かったようです。
`document.defaultView.origin`はIE11にバグがあるようで、`undefined`になっていました・・・
Delphi アプリ - スマホのシェイクをざっくりと検知

スマホを振った時に何か処理させたいときですが、OnShake のような便利なイベントというのはありません。
残念ながら、振られたのか、ただの移動なのかはセンサーだけでは判断はできないのです。
「Android shake 検出」などのキーワードで、検索すると皆さんいろいろなロジックで検知しています。
( 基本的に、加速度センサーを使って検知します )

Delphi で作ったアプリで実装してみました。
加速度センサーのコンポーネント TMotionSensor と TTimer を使って、振り幅と、速度から、ざっくりとしたアルゴリズムで検知しています。

##ざっくりとしたアルゴリズム
一定時間内(0.3秒)で、振り幅が ±1 以上であればカウントを行い、カウントが 3 以上になったらシェイクとみなしています。
シェイクの方向は X, Y, Z それぞれありますので、
( 基点の X + Y + Z ) - ( 時間内終点の X + Y + Z ) 
の値を振り幅としています。

##設計画面
MotionSensor の Active を True にしておくのを忘れずに
![sk01.png](https://qiita-image-store.s3.amazonaws.com/0/164551/545dfc46-afb1-3b9a-1aac-ba645f6cbad1.png)

##サンプルコード

```delphi
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Controls.Presentation, System.Sensors, System.Sensors.Components;

type
  TForm1 = class(TForm)
    ToolBar1: TToolBar;
    Switch1: TSwitch;
    Label1: TLabel;
    Timer1: TTimer;
    MotionSensor1: TMotionSensor;
    procedure Timer1Timer(Sender: TObject);
    procedure Switch1Switch(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private 宣言 }
  public
    keepPoint: Double;      //位置保存
    shakeCount: Integer;  //振りカウント
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormCreate(Sender: TObject);
begin
// 初期化
  keepPoint  := 0;
  shakeCount := 0;
  Label1.Text := ' ';
end;

procedure TForm1.Switch1Switch(Sender: TObject);
begin
//スイッチが ONになったらカウントの初期化と基本ざっくり位置を保存する
  if Switch1.IsChecked then begin
    shakeCount := 0;
    Label1.Text := ' ';
    keepPoint := MotionSensor1.Sensor.AccelerationX
      + MotionSensor1.Sensor.AccelerationY
      + MotionSensor1.Sensor.AccelerationZ;
  end;

//Timerの起動を制御
  Timer1.Enabled := Switch1.IsChecked;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  mPoint: Double;  //作業用
begin
// 振りカウントが 3以上になったらシェイクとみなす
  if shakeCount > 3 then begin
    Label1.Text := 'しぇいく';
    shakeCount := 0;
    Switch1.IsChecked := False;
    exit;
  end;

// 現在位置ざっくり
  mPoint := MotionSensor1.Sensor.AccelerationX
   + MotionSensor1.Sensor.AccelerationY
   + MotionSensor1.Sensor.AccelerationZ;

  if ((keepPoint - mPoint) > 1) or ((keepPoint - mPoint) < -1) then begin
  // 振りカウント +1
    shakeCount := shakeCount + 1;
  end;

// 現在ざっくり位置保存
  keepPoint := mPoint;

end;

end.
```

##実行してみる
アプリを起動して
![Screenshot_2017-11-09-17-27-35.png](https://qiita-image-store.s3.amazonaws.com/0/164551/af11b465-703d-c6f2-e3bd-058e5ac74718.png)

スイッチを ON にして、スマホをふりふり
![Screenshot_2017-11-09-17-27-48.png](https://qiita-image-store.s3.amazonaws.com/0/164551/fc120dff-f6ba-0dc6-5603-24a7b6b49a06.png)
と検知しました！
ToolbarのSegmented Controlを可変させる


#方法
ナビゲータエリアから
`Toolbar>Bar Button Item>Segmented Control`を選択し

ユーティリティエリアの
`Size inspector>Segmented Control>Auto-Size Mode`
を`Equal Widths`から`Proportinal to Content`
に変更し、再度ナビゲータエリアから`Segmented Control`を選択してドラッグでサイズを変更できる
(Size inspector>Viewからでも変更可)

~~しかし、これだと均等幅が崩れてしまうため、均等に戻したい場合は
サイズ調整後、再度`Equal Widths`にすると均等になる~~
(なる時とならない時があるのでとりあえず取り消し線)

![スクリーンショット 2017-11-20 12.15.20.png](https://qiita-image-store.s3.amazonaws.com/0/72559/6d9558ba-ddfc-c6a8-7c32-ac1ec5dbaf8f.png "スクリーンショット 2017-11-20 12.15.20.png")

![スクリーンショット 2017-11-20 12.16.47.png](https://qiita-image-store.s3.amazonaws.com/0/72559/03fa37a0-045c-371c-1581-37e3fe01342f.png "スクリーンショット 2017-11-20 12.16.47.png")

![スクリーンショット 2017-11-20 13.05.03.png](https://qiita-image-store.s3.amazonaws.com/0/72559/12d5a9e3-9968-87d5-5afc-a1ff674cfc04.png "スクリーンショット 2017-11-20 13.05.03.png")

各セグメントの幅を指定したい場合は
`Size inspector>Segmented Control`
の`Width`で指定できます
![スクリーンショット 2017-11-20 13.20.27.png](https://qiita-image-store.s3.amazonaws.com/0/72559/ad620332-170e-8f55-a961-e889f0b82f2c.png "スクリーンショット 2017-11-20 13.20.27.png")


他に良い方法があれば教えて下さると助かります

因みにSize inspector>View>Showの
`Frame Rectangle`と`Alignment Rectangle`の違いに関しては以下を参考
[Xcode:Frame Rectangle と Alignment Rectangle の違い](http://www.sirochro.com/note/code-frame-alignment-rectangle/)
文字丸めしたらtitle属性を必須とすることを提唱しまぁす！

```html:もどかしい文字丸め
<a href="#">文字丸めしたらtitle属性を必…</a>
```

↓

```html:親切な文字丸め
<a href="#" title="文字丸めしたらtitle属性を必須とすることを提唱しまぁす！">文字丸めしたらtitle属性を必…</a>
```

↓

『[デモ](http://demo.laineus.com/title/)』



> デモ内の記事はQiitaメルマガ（11/15）より
Azure CentOS7のユーザー追加とsudoer


## はじめに
Azure OpenLogicのCentOS7でユーザー追加するときにデフォルトユーザーがsudoできる理由を調べた。追加ユーザーもsudoする必要があったため、標準のやり方に則っておいたほうがいいかも、という観点から。

## ユーザー追加
ユーザー追加して鍵認証設定

```
$ sudo adduser hoge
$ sudo mkdir /home/hoge/.ssh
$ sudo vi /home/hoge/.ssh/authorized_keys
```

## どの設定でsudoできているのか
### 設定確認
```
$ visudo
```

ぱっと見標準で作成されたユーザー用のエントリはない

### wheelか
```
$ groups
```

wheelにもいない

### もう一度確認
```
$ visudo
```

```sudoers
...
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
```

#がコメントじゃなかった。

```
$ sudo ls /etc/sudoers.d/
waagent
$ sudo cat /etc/sudoers.d/waagent
fuga ALL=(ALL) NOPASSWD: ALL
```

いた。

## 結論
waagentを調べてみると、どうやらAzure上の管理サービスが使っているファイルのようなので、独自の設定を入れ込むのはやめることにする。

普通にvisudoの最下行に追加することにした。

###参考リンク
Azure Linux エージェントの理解と使用
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/agent-user-guide
【Java】【XML署名】Signatureタグに接頭辞とIDを付与する

JavaのXML署名でSignatureタグの扱いについてメモ。

##Signatureタグに接頭辞「dsig」を付与したい場合
```java:createXml.java
// 署名コンテキストの作成
// setDefaultNamespacePrefixでSignatureタグ（子要素もすべて）に接頭辞をつける
DOMSignContext dsc = new DOMSignContext(privateKey, document.getDocumentElement());
dsc.setDefaultNamespacePrefix("dsig");
```

##SignatureタグにIDを付与したい場合
```java:createXml.java
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");

(中略)

// 署名する.
// newXMLSignatureの第4引数にIDをセット
XMLSignature signature = fac.newXMLSignature(si, ki, null, "a", null);
signature.sign(dsc);
```

##参考サイト（英語）
[How to add namespace while signing XML file using javax.xml.crypto.dsig.*?](https://stackoverflow.com/questions/16300486/how-to-add-namespace-while-signing-xml-file-using-javax-xml-crypto-dsig)
[add attribute to signature xml in java](https://stackoverflow.com/questions/30713663/add-attribute-to-signature-xml-in-java)
WordPress 4.9 にしたらユーザー一覧（users.php）の「名前」が消えてる？

WordPress 4.9にしたら何故かユーザー名が表示されない。
全部「--」になってる！クライアントからのご報告により発覚。

プラグインを全停止してみても同じ現象。。

他のサイトをアップデートしても同じ現象が起きたので未確認ですがWordPress4.9のバグかもしれません。
（英語で調べても情報が出てこないのでよく話かかりません。）

対処療法ですが、

```functions.php
//ユーザー一覧のカスタマイズ
function my_manage_users_columns($columns){

    //$columnsのキー「name」を置き換え
	$keys = array_keys($columns);
	$keys[array_search('name',$keys)] = 'displayname';
	$columns = array_combine( $keys, $columns );

	return $columns;

}

function my_manage_users_custom_column($output, $columns, $user_id){
　　　　//先ほど編集したdisplaynameキーにユーザー名を値として挿入
	if($columns=='displayname'){	
		$user = get_userdata( $user_id );
		return $user->first_name .$user->last_name ;
　　　　//姓名の順序等は適等に環境に合わせてください。
	}

}

//優先度はプラグインとの関係もありますので環境に合わせて値を増減させて下さい。
add_filter('manage_users_columns', 'my_manage_users_columns' ,10);
add_filter('manage_users_custom_column','my_manage_users_custom_column',10,3);
```

※あくまで一時的な対処療法です。本当にバグであれば、そのうちなんらかの対策が行われる可能性が高いのでその時は適宜外してください。
抽象クラスを継承した抽象クラス(abstract class Sub extend Super)は抽象メソッドを実装しなくてよい


# どういうこと

```php
<?php

abstract class Super
{
    abstract public function requiredFunc();
}

abstract class AbstractSub extends Super
{
    // requiredFuncを実装しなくてもいい
}

class Sub extends Super /* or AbstractSub */
{
    public function requiredFunc()
    {
        // 実装しないといけない
    }
}
```


[PHP: クラスの抽象化 - Manual]

>抽象クラスから継承する際、親クラスの宣言で abstract としてマークされた 全てのメソッドは、子クラスで定義されなければなりません。

とあったので、子の抽象クラスでも親のメソッドの定義をしなければならないのかな？と思い、サンプルがすぐに見つからなかったので書いた。

そもそもこんな使い方が変だという可能性が大だし、引用は暗黙的に子クラスは抽象クラスでないという前提であることは飲み込める。

# 何がしたいのか

抽象クラスで一部処理を共通化出来て、子クラスをいろいろ作ったけど、一部の具象メソッドの定義が同じでコピペになる子クラスが多いなー。でも別の定義になる子クラスもあるしなー。

というときに、デザインパターンを使~~え~~わずに継承を重ねてグループを細分化する。

共通した実装ということでtraitで一回書いてuseでもよさそうだが、適切そうな名前で細分化できる現状は横断的なtraitよりは抽象クラスなのかなーと思う。


```php
<?php

abstract class People
{
    abstract public function nationality();

    abstract public function name();

    public function introduction()
    {
        echo $this->nationality() . 'の' . $this->name() . 'です';
    }
}


class Jon extends People
{
    public function nationality()
    {
        return 'アメリカ';
    }

    public function name()
    {
        return 'ジョン';
    }
}

class Suzuki extends People
{
    public function nationality()
    {
        return '日本';
    }

    public function name()
    {
        return '鈴木';
    }
}

class Tanaka extends People
{
    public function nationality()
    {
        return '日本';
    }

    public function name()
    {
        return '田中';
    }
}
```

適切な例えができなくてとてもひどいが、上の例で日本がかぶっている。
実際はDBやファイル操作などで途中まで・後始末が同じ操作のものみたいに思ってもらえればいい。

```php
<?php

abstract class People
{
    abstract public function nationality();

    abstract public function name();

    public function introduction()
    {
        echo $this->nationality() . 'の' . $this->name() . 'です';
    }
}

abstract class Japanese extends People
{
    public function nationality()
    {
        return '日本';
    }
}


class Jon extends People
{
    public function nationality()
    {
        return 'アメリカ';
    }

    public function name()
    {
        return 'ジョン';
    }
}

class Suzuki extends Japanese
{
    public function name()
    {
        return '鈴木';
    }
}

class Tanaka extends Japanese
{
    public function name()
    {
        return '田中';
    }
}
```

で重複をなくせた…？
もちろんこれは処理の分岐がごく少なくて、それぞれの処理が独立している場合のみコピペをなくせるわけで。
既存コード群から異色にならないレベルで便利に作っていくのに力量不足と相まって悩む。


*******

実際に何しているかメモっておくと、Laravelのmigrationでよく変更があるテーブルの処理をコピペしてたのをやめようとしようとしていた。

DB接続&テーブル指定
->全処理共通

追加
->up(migrate)でINSERT down(rollback)でDELETE

削除
->追加のup downを反対側に書く

更新
->up down両方UPDATE

というときに、
DB接続&テーブル指定の実装までと、固有の操作対象レコードを返す抽象メソッドをSuperな抽象クラス。
それぞれのup, downをSuper継承の各Subクラスに書こうとしていた。

使うときはSubクラスを継承して、Superの残りの抽象クラスでレコード内容を実装するだけで(up down実装せず)動くぜ！みたいなことをしたかった。

大仰にしたくないというか、Laravelが吐き出すmigrateテンプレートに`extend Sub`を追加するだけでだいたい便利に動くかんじにしたかった。
継承ではなくup,down内でクラスを呼び出してhogehoge~する処理にしたら、
その数行が今後のコピペ対象になって、短くはなる。
だけど縛りもないし今後書き方がブレてくるかもなといらぬ心配をしたので、up,downを書かない方向は無いかなと考えた。


[PHP: クラスの抽象化 - Manual]:http://php.net/manual/ja/language.oop5.abstract.php
MIDI 規格 まとめ


# はじめに
わかりやすい MIDI 規格の情報があまり無いので、規格書を読みながら基本的な部分を抜粋してまとめていこうと思いっています。




# 参考
* [MIDI1.0規格書](http://amei.or.jp/midistandardcommittee/MIDIspcj.html)
* [DTM技術情報](https://www.g200kg.com/jp/docs/tech/index.html)
* [SMF(Standard MIDI File)フォーマット解説](http://maruyama.breadfish.jp/tech/smf/)
* [SMF (Standard MIDI Files) の構造](https://sites.google.com/site/yyagisite/material/smfspec)
開発したAlexa Skillが日本語版に出てこない場合

待ちに待った日本語版が出ましたね。

さっそく日本語版のSkillを作って、Echoで使ってみようとしたら、なぜかAlexa App(alexa.amazon.co.jp)の方にSkillが出てこない。。。

今まで使っていたalexa.amazon.comの方のAlexa Appには出てくる。
<img width="365" alt="スクリーンショット 2017-11-20 11.12.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/36184/24991165-9888-fcf9-4042-af8825d2dee5.png">

どうも、デベロッパーアカウントの方は、amazon.comの方のアカウントに紐付いてしまっているのが原因のようだ。
この状態になると、同じメアドで.comも.co.jpの方も登録しいるために、どうにもならない状態に。。

解決策としては、デベロッパーの登録をamazon.co.jpのアカウントと紐付かせる必要があるので、今のところamazon.comのメアドとamazon.co.jpのメアドを分けて上げる必要があるようです。

今回は、amazon.co.jp側のメアドを別のアドレスに変更して、 `https://developer.amazon.com/ja/` にアクセスしてデベロッパー登録し直したら、そのアカウントで作ったSkillがAlexa App(alexa.amazon.co.jp)に出てくるようになりました。

今までのデベロッパーアカウントを使って、ベータテスターとして登録する方法もあるけど、今後は日本語メインでSkillの開発をしていくことを考えると、このようにアカウントを切り替えるのが良いかなと思いました。
ただ、US向けに出したSkillを日本語化する場合は、USの方のアカウントで入ってやる必要がありますけどね。
dnsmasq の dhcp-script の example

# はじめに
***IP Camera*** の起動時に [onvif](https://qiita.com/tags/ONVIF) でカメラの初期設定をしようと思いました
dhcp サーバーから カメラへの IP address のリースをトリガーにするスクリプトを書けばば良さそうです
***dnsmasq*** の [MANPAGE](http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html) をみると --dchp-script と --dhcp-luascript というのがあるようですが、別に外部プロセスでかまわないので --dchp-script を使うことにしました

見てみるに随分簡単そうで：

- スクリプトはフルパスで指定
- $1 は server の action に応じて "add", "old" or "del" のどれか
- $2 は MAC address
- $3 は あれば host 名

で、さっそく書いてみたのですがなんか***呼び出されてない orz...***

# 例を探す
こういう時は他の人の実例を見ると大変参考になり、自分の間違いにすぐに気が付きます
ググろうと ***dnsmasq --dhcp-script*** まで入れた所ですぐに example がサジェストしてくれます
この３点で検索してる人、多いんだろうな...

# 参考になった example
検索結果をざっと見てみると、見事に***誤報***ばっかり、関係ない記事ばっかりでガックリきました

でも、このなかの***どれかにヒントがあるに違いない***と信じて、一個一個探してみました所、私にとっては以下が有益でしたので僭越ながらこちらに記録を残させていただきます次第です：

- [Tracking DHCP leases (dnsmasq)](http://jpmens.net/2013/10/21/tracking-dhcp-leases-with-dnsmasq/) 
受け取ったパラメタを mosquitto に飛ばしている例、これはこれで実用的

- [module_ap](https://github.com/xtr4nge/module_ap/blob/master/includes/dnsmasq-dhcp-script.sh) 
受け取ったパラメタを日時とあわせてファイルにロギングする4行のベストサンプル！

# 呼び出されなかった理由
シバンがなかったのが理由だったみたいです。上記の例のように先頭にシバンを書いたら動きました

# 結び
もし稚稿が dnsmasq の dhcp-script の example を探されます諸姉諸兄のお手間を少しでも軽減するお役に立つことがございましたら望外の至福に存じます
私はあの検索結果みた瞬間、心が折れて立て直すの実際に結構たいへんだった ^^/
いまみているウェブページを阿部寛のサイトっぽくするChrome拡張を作った

_日本を代表するすばらしい俳優であり, ブルータルウェブレイアウトの先駆者である阿部寛氏と彼のウェブサイト制作者への敬意をこめて._

# 成果物

https://chrome.google.com/webstore/detail/abehiroshize/okffapkklocfabdipcgpaiibomcjdopp

左が通常のWikipedia、右がこの拡張機能でAbehiroshize（アベヒロシャイズ）したページ.

<img width="641" alt="Screen Shot 2017-11-20 at 11.08.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/105252/4648cdfd-f3a9-d40a-db6c-e9391e69f760.png">

[Githubレポジトリ](https://github.com/kyoyababa/abehiroshize)

# 技術仕様

## DOM操作

基本的にjQueryでDOM操作しまくっているだけである.

## 左ナビゲーション判定

* ナビゲーションの判定について、 `$('nav')` や `$('#menu')` などをもとに判定して左側に表示しようと思っていたが、意外と世の中のサイトはマークアップが適当なものが多く、うまくいかなかったので **`<ul>`だったらナビゲーションにする** という強硬手段に出た. ただし、`<main>`タグ内にあるそれは除く.

```javascript
$('ul').each(function() {
  if ($(this).closest('main').length === 0) {
    $(this).find('li').appendTo(`#${navigationInnerListId}`);
  }
});
```

## 既存スタイルの削除

雑だが強制的にデフォルトスタイルを全部排除する. リセットすらしない.

```javascript
function removeExistingStyles() {
  const $styleElements = $('style');
  const $stylesheetElements = $('link[rel="stylesheet"]');
  const $cssElements = $('link[type="text/css"]')

  $styleElements.remove();
  $stylesheetElements.remove();
  $cssElements.remove();
  $('*').removeAttr('style');
}
```

## 背景の文字

CSSのbefore擬似要素に対して、`<title>`の文字列テキストを羅列させた.

```css
#${contentId}:before {
  content: '${documentTitle}　　${documentTitle}　　${documentTitle}　　...　　${documentTitle}';
  z-index: 0;
  font-size: 70px;
  font-family: 'Pinyon Script', cursive;
  word-break: break-all;
  color: #D3F6E0;
}
```

# 参考

* [阿部 寛のホームページ](http://abehiroshi.la.coocan.jp/)
* [爆速でChrome拡張機能を作成する](https://qiita.com/thr3a/items/702e58f5d793332a1001)
* [Chrome Extension を作って公開する](https://qiita.com/sqrtxx/items/19fd2114430e9e1fb57f)
ASP.NET Core 2.0 Razor Pages でのActionFilter

`IActionFilter`は使えません。
`IPageFilter`を使いましょう。

公式情報でふわっと触れられているんですが、ココにたどり着くまでにググラビリティの低い命名により結構悩みました。。見つければ話は早いんですけどね。
https://msdn.microsoft.com/ja-jp/magazine/mt842512.aspx#code-snippet-15
https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.filters.iasyncpagefilter?view=aspnetcore-2.0

【追記】
ちなみにIAsyncPageFilterで要求されるメソッド２つのうち、`OnPageHandlerSelectionAsync`は特に何もしないなら以下のコードでOKです。

```C#
    public Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
    {
        return Task.CompletedTask;
    }
```
※これもググっても２ページ目にやっと出てくるもんで。
カード決済のPCI DSS対応と決済方式について

オンラインでの決済が広がりを見せる中で、そのセキュリティが重視されるようになってきています。その一つ、大きな変革になるのが2018年03月までのPCI DSS準拠になるかと思います。

## PCI DSSとは？

Payment Card Industry Data Security Standardの略で、クレジットカードの世界5大ブランド（AMEX、Discover、JCB、マスター、VISA）が定めたカードセキュリティの国際統一基準になります。

[PCIDSSとは｜日本カード情報セキュリティ協議会](http://www.jcdsc.org/pci_dss.php)によると、認定取得までに行われるのは以下の調査になります。

1. 訪問審査
2. サイトスキャン
3. 自己問診

自己問診については[PCI Security Standards Council公式サイト](https://ja.pcisecuritystandards.org/minisite/env2/)に公開されています。これらの検査が必須であるかどうかはカードブランドごとに異なったり、インターネットを使った決済サービスを提供しているかどうかによっても異なります。多くの場合において、サイトスキャンと自己問診が基本になるようで、訪問審査はより大規模な場合になります（ブランドによりますが年間600万件以上処理するなど）。

自己問診はすべてYESにならなければ通過となりません。特にクレジットカード番号やCVC（セキュリティコード）などがサーバを通過する場合に求められるセキュリティレベルが格段に上がってきます。データベースに残すのはもちろんですが、サーバのログなどに記載される可能性がある場合も同様です。

## クレジットカード決済の種類

Webサイトにおいてクレジットカード決済を提供する場合、幾つかの種類があります。

- サーバ型
- リンク型
- モジュール型

### サーバ型

PCI DSSで求められるレベルが一番高い、サーバにてクレジットカード番号を取り扱うものです。データベースなどにクレジットカード番号を保存し、決済金額とともに決済サービスに情報を送信します。

クレジットカード番号自体を取り扱いますので一番自由度は高い反面、セキュリティ面において注意が必要です。万一サーバがハッキングされたり脆弱性があったりすると、クレジットカード番号を抜き取られる可能性があります。

### リンク型

決済において外部サービスを使うものです。多くはショッピングカートでの購入処理を完了し、決済は外部サービスに移動した上でカード番号を入力します。都度カード番号を入力するタイプや、楽天やAmazonなどのように彼らの持つログイン情報を使って決済代行を行う場合もあります。

リンク型の場合、カード番号を扱うことがないので高いセキュリティレベルは求められません。万一脆弱性があったとしてもカード番号が漏洩するようなことはないので安心です。

欠点としては購入と決済処理が分かれているため、購入は済んでいても決済処理を忘れてしまうことが一定の割合で存在することです。また、都度入力を行う手間であったり、既存の大手サービスのユーザになっている必要があります。

### モジュール型

モジュール型では決済者がクレジットカード番号を決済事業者に送信し、その情報と一時的に使えるトークンに変換します。そして購入処理の際に決済金額とトークンを用いて決済処理を行います。この場合でもサービス提供事業者はクレジットカード番号に触れませんので高いセキュリティレベルは求められません。

利点は購入と決済処理を一度にできる点です。これによって決済忘れを防止できます。また、クレジットカード番号を保存しておけるサービスも多いので、繰り返し決済する際に都度カード番号を入力する手間も防げます。

クレジットカード番号の入力は、別ウィンドウを開いて入力する場合と、サービスサイトのデザインに合わせて変更できるタイプとがあります。デザインと合わせた場合、購入者としては決済サービスが別になっていることに殆ど気付かないのではないでしょうか。

----

開発力がある企業の場合、自社フォームでクレジットカード番号を入力することが多く、手軽に済ませたい場合にはリンク型が使われてきました。しかし昨今のセキュリティインシデントによって求められるセキュリティレベルが上がったことによって、サーバ型を選択するメリットが少なくなっています。

そんな中、注目されているのがモジュール型になります。購入者の見た目はサーバ型と変わらず、サービス提供事業者としてはリンク型と変わらぬ（またはもっと利便性の高い）セキュリティ上安心できる仕組みが用いられます。

モジュール型としては私がAPI Expertを努めている[Square](https://squareup.com/jp)の他、[PAY.JP](https://pay.jp)や[Stripe](https://stripe.com/jp)などが提供しています。この辺りのサービスを比較しつつ、導入してみてください。
今よりもほんのちょっとだけEmmetを使いこなしてコーディング速度を上げたいTips

「ul>(li>a[href="#"])」くらいしか使っていなかったため、もう少しEmmetを使いこなすためのTipsです。

## Emmetとは？
主にHTMLやCSSの記述・編集をサポートするプラグインのこと。
たとえば、

```
.test{
m10--10+d:i+c#c+fz10
}
```
と入力して、ctrl+eで展開すると、

```
.test{
margin:10px -10px;
display:inline;
color:#ccc;
font-size:10px;
}
```
となったり、

```
 !
```
と入力して、ctrl+eで展開すると、

```
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
```
となる。

## どんなショートカットが利用できるかはチートシートで確認しながら覚える
※fz10,fse10がどちらもfont-size:10px;だったり、あいまいな使い方もできる。
https://docs.emmet.io/cheat-sheet/


## チューニング
https://docs.emmet.io/customization/preferences/

個別にチューニングをしたい場合は、自分のホームディレクトリに下記のファイルを設置して、設定の記述をする。

* 設定ファイル構成

```
~/emmet/preferences.json
　　　　snippets.json
　　　　syntaxProfiles.json
```

### 例）CSS展開時「:」の後のスペースを取る場合
preferences.jsonに記述。

```preferences.json
{
  "css.valueSeparator": ":"
}
```
### 例）CSS展開時ベンダープリフィックスを勝手につけないようにする場合
preferences.jsonに記述。

```preferences.json
{
  "css.autoInsertVendorPrefixes": false,
  "less.autoInsertVendorPrefixes": false,
  "scss.autoInsertVendorPrefixes": false,
  "sass.autoInsertVendorPrefixes": false,
  "caniuse.enabled": false
}
```

### HTML展開時インデントをいれない
preferences.jsonに記述。

```preferences.json
{
  "format.noIndentTags": "address,article,aside,audio,blockquote,body,canvas,div,dl,figcaption,figure,footer,form,head,header,html,iframe,main,map,nav,object,ol,p,pre,script,section,style,table,tbody,td,tfoot,th,thead,tr,ul,video"
}
```


## 便利なショートカットをピックアップ
emmetとエディタのショートカットが重複する場合があるので、
その場合は、エディタのキーマップで適宜変更する。

* タグと内包されているコンテンツを選択
ctrl-shift-E
![emmet1.gif](https://qiita-image-store.s3.amazonaws.com/0/45059/6e297f7e-3fc4-dbbb-2837-8f8180753dc3.gif)


* 入力する場所に移動
Ctrl-alt-left(right)
![emmet2.gif](https://qiita-image-store.s3.amazonaws.com/0/45059/f16d3828-6b54-b317-c215-d0a41958920c.gif)


* 前後タグを削除
Ctrl+Shift+;
![emmet3.gif](https://qiita-image-store.s3.amazonaws.com/0/45059/9957b629-b3d8-abcb-0dc1-204173b005a5.gif)


*  改行とタブを消去して、一行化
Ctrl+Shift+M
![emmet4.gif](https://qiita-image-store.s3.amazonaws.com/0/45059/3de62655-2b06-40c8-402f-e490ec4125e3.gif)


* タグを変更する
Ctrl-Shift-'
※Atomだと「Ctrl-Shift-'」のキーマップが効かないので適宜変更する(私の場合は：ctrl+u)
![emmet5.gif](https://qiita-image-store.s3.amazonaws.com/0/45059/e79c4f3e-9ec9-44ce-3696-d4add2f4c84d.gif)


* テキストをタグで包括する
Ctrl-alt-w
※Atomで利用しない場合はキーマップが異なる場合があるので注意！
※ctrl-shift-Eやctrl-shift-Rとの組み合わせが多いためCtrl-shift-wと変更すると便利。
![emmet6.gif](https://qiita-image-store.s3.amazonaws.com/0/45059/479a8c8c-1f5e-99ef-9520-16c9c2833ede.gif)


## テキストをタグで包括するCtrl-alt-wの記述例
```
ul>li[title=$#]*>{$#}+img[alt=$#]
```
```
<div class="test">
test1 <-- ここから
test2
test3 <-- ここまでを選択
</div>
　↓
<div class="test">
<ul>
<li title="test1">test1<img src="" alt="test1" /></li>
<li title="test2">test2<img src="" alt="test2" /></li>
<li title="test3">test3<img src="" alt="test3" /></li>
</ul></div>
```
【WindowsForm】【C#】テキストボックス（複数行）内にてEnter押下時に、改行する方法

①対象となるtextBoxのプロパティを開く。
②デフォルトでは、「AcceptsReturn」プロパティが「false」になっているので「false」→「true」へ変更
③エンターキーにて改行が可能となる。

![画面確認用ソリューション - Microsoft Visual Studio 2017-11-20 10.43.21.png](https://qiita-image-store.s3.amazonaws.com/0/211824/3d250b8f-5952-56a8-ad48-1e3c9359262e.png)

## 参考 
https://msdn.microsoft.com/ja-jp/library/system.windows.forms.textbox.acceptsreturn(v=vs.110).aspx
brewでMySQLを5.7にしたらmysql2 gemがld: library not found for -lsslでインストールできない

環境: macOS High Sierra

rails環境でbundleインストールを実行したところこんなエラーが出た

```
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1
```

`xcode-select --install`

を実行すると通るようになった。

再起動はしなくてもいけたが、できなければ再起動も試してみるといいかも。


参考

https://www.ctocweb.com/?p=611
Fix "Git RPC failed with curl 56 and error -9806" issue on Mac

Git failed when trying to push.

```
SinriMac:~/Codes/WebProjects/ourbible/assets/bible/LXX Sinri$ git push
Counting objects: 1205, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (1199/1199), done.
Writing objects: 100% (1205/1205), 2.23 MiB | 648.00 KiB/s, done.
Total 1205 (delta 5), reused 0 (delta 0)
error: RPC failed; curl 56 SSLRead() return error -9806
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
Everything up-to-date
```

First tried `git config http.postBuffer 524288000` but still sick.

Then found a solution online.

```
brew remove git
brew remove curl

brew install openssl
brew install --with-openssl curl
brew install --with-brewed-curl --with-brewed-openssl git
```

> 作者：SteveJones
> 链接：http://www.jianshu.com/p/0b0b74fc349d
> 來源：简书
> 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。

Good, ok now.
Gmailユーザーは無数のメールアドレスを使うことができる

`mail.test@gmail.com`のようなメールアドレスを持っていたとします。

`mail.test+aaa@gmail.com`にメールを送信しても、`mail.test@gmail.com`にメールが届きます！

`+`の後に入れるものは、任意の英数字を入れる事ができます。


# どういう事？
この記事にて詳しく解説していただいています。Gmailはとても親切なサービスなんですね。

<https://athomegeek.com/make-unlimited-email-address/>

`+文字列`のパターン以外にも異なるメールアドレスを受信する方法があるようです。

`mail.test@gmail.com`というメールアドレスに対して、

- `mailte.st@gmail.com`というピリオドの位置を変えたアドレス
- `mail.test@googlemail.com`という別のドメイン名を使ったアドレス

ただし、上記３パターンを複合すると流石に無効なメールと判断されてしまいます。

# G Suiteのメールアドレスの場合は？

`test.mail@yourcompany.com`
に対して、
`test.mail+英数字@yourcompany.com`と`ピリオド位置変更`は使えますが、
ドメインを`googlemail.com`に変更する場合はメールが届きません。
もし同じ名前で`gmail.com`ユーザーがいた場合、そちらに届いてしまうと思われます。

# 何に使うのか
メールでユーザー登録するサービスを開発しているときに、テストに役に立ちます。

具体的なところでは、ユーザーの退会処理や複数ユーザーでの連携機能の確認に重宝します。
ltspiceでラジオ

#概要
ltspiceでAMラジオやってみた。

#写真
電波の波形

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/c74b3f5d-85e6-619f-c23a-4f7cea0c1b94.png)

#写真
出力の波形

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/488b3e26-72b1-0f35-71ad-be6eec6d615a.png)


#回路図
ワンチップＡＭラジオＩＣ

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/f2784c89-52b1-eea8-2af5-70a355a6c753.png)


以上。
(初心者向け) JavaScript 配列の作成と初期化

#概要

JavaScript の配列は動的なもので、他の言語で言えば ArrayList に近いものです。そして、作成(構築)と初期化の方法も様々なので、ここでまとめてみました。

- Array コンストラクタを使って長さ 0 の配列を作成する。
- [] を使って長さ 0 の配列を作成する。
- 初期値を持つ配列を Array コンストラクタを使って作成する。
- 初期値を持つ配列を [] を使って作成する。
- 初期値を持たない指定した長さの配列を作成する。
- from メソッドを使って配列から新しい配列を作成する。
- from メソッドを使って文字列から文字の配列を作成する。
- of メソッドを使って値の並びから配列を作成する。

#サンプル

##Array コンストラクタを使って長さ 0 の配列を作成する。

昔の JavaScript ではこういう書き方しかできなかった気がします。

```JavaScript
var a0 = new Array();
console.log(a0.length);  // 0 と表示
```

#[] を使って長さ 0 の配列を作成する。

この書き方が簡潔でわかりやすいです。

```JavaScript
var a0 = [];
console.log(a0.length);  // 0 と表示
```

#初期値を持つ配列を Array コンストラクタを使って作成する。

昔の JavaScript ではこういう書き方しかできなかった気がします。

```JavaScript
var a1 = new Array(5, -2, 8, 11, -7, 5, 0);
console.log(a1); // [ 5, -2, 8, 11, -7, 5, 0 ] と表示
```

##初期値を持つ配列を [] を使って作成する。

この書き方が一般的かと。それに簡潔でわかりやすいです。

```JavaScript
var a1 = [6, 3, 0, -1, 3, 16];
console.log(a1);  // [ 6, 3, 0, -1, 3, 16 ] と表示
```

##初期値を持たない指定した長さの配列を作成する。

とにかく中身はどうでもいいから、ある長さの配列を作りたいときのやり方です。要素はすべて undefined になります。とりあえず 0 などで初期化したいときは fill() メソッドを使います。

```JavaScript
// 長さ 7 の配列を作成する。
var a5 = Array(7);
console.log(a5); // [ <7 empty items> ] と表示
console.log(a5[0]);  // undefined と表示
// 配列の要素の値を確定する。
a5.fill(0);
console.log(a5);  // [ 0, 0, 0, 0, 0, 0, 0 ] と表示
```

##from メソッドを使って配列から新しい配列を作成する。

コンストラクタを使って配列を作成するのと同じ結果になりますが、同じ内容の配列を複数作る場合は、こちらを使ったほうがスマートかと。

```JavaScript
const a03 = [10, 2, -6];
var a33 = Array.from(a03);  // [ 10, 2, -6 ] と表示
console.log(a33);
console.log(a33 === a03);  // false と表示。つまり配列のインスタンスは別。
```

##from メソッドを使って文字列から文字の配列を作成する。

文字列も文字の配列の一種なので、文字列を from メソッドで文字の配列に変換できます。

```JavaScript
var a3 = Array.from('Japan');
console.log(a3);  // [ 'J', 'a', 'p', 'a', 'n' ] と表示
```

##of メソッドを使って値の並びから配列を作成する。

コンストラクタを使っても同じ事が可能です。

```JavaScript
var a4 = Array.of(0, 1, 2, 3);
console.log(a4);  // [ 0, 1, 2, 3 ] と表示
```

##注意：from メソッドは TypedArray には使えない。

つぎのようなコードは正しく動きませんでした。

```JavaScript
const a16 = new Int16Array(0, 64, 256, 1024);
var a36 = Array.from(a16);
console.log(a36);  // [] になる。
```


終わり
Check! AKS `az aks create` で、あるはずの Service Principal が not found になってしまうときの対処方法

こんにちは、 @dz_ こと大平かづみです。

Prologue - はじめに
====

[AKS](https://azure.microsoft.com/en-us/services/container-service/ "Azure Container Service | Microsoft Azure") (Azure Container Service: Managed Kubernetes) を、[Azure Cloud Shell](https://azure.microsoft.com/en-us/features/cloud-shell/ "Azure Cloud Shell – Browser-Based Command Line | Microsoft Azure") で作成したときは問題なく作成できたのですが、

手元のマシンで実施すると、以下のようなエラーが出てうまくいきませんでした。

その対処法を書き留めておきます。

```bash
 az aks create -g <resource group> -n <aks name> --node-count 1 --generate-ssh-key
AAD role propagation done[############################################]  100.0000%
Operation failed with status: 'Bad Request'. Details: Service principal clientID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx not found in Active Directory tenant xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, Please see https://aka.ms/acs-sp-help for more details.
```

_※ `<resource group>`, `<aks name>` は任意の文字列_

考察と対処
====

考察
----

考察としては、私の場合、1つのAzure アカウントで複数のサブスクリプションを使用していて、デフォルト（Pay as you go）ではないサブスクリプションでやりたかったのですが、それが関連してるように思いました。

ちなみに、上記エラーの tenant ID や client ID はあってました。

```bash:サブスクリプション切替え例
az login
az account set -s <使いたいサブスクリプションID>

# この後、続いて AKS の作成を行うと上記のエラー... (´・ω・`)
```

対処
----

ともあれ、以下のように AKS を作り直せばよいようです。

まず、上記のエラーが発生したとき、 `${HOME}/.azure/acsServicePrincipal.json` がある場合は、すでに Service Principal ができてるようです。

```bash
cat ${HOME}/.azure/acsServicePrincipal.json | jq

{
  "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx": {
    "client_secret": "xxxxxxxxxxxxxxxxxxxx",
    "service_principal": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
}
```

この Service Principal を指定して、 AKS を作成すればエラーになることなく作成できました。

### Service Principal を指定して aks を作成する手順

まず、上記 json に書かれている Service Principal が存在するか確認します。

```bash
# 上記の Service Principal が存在するか確認する
az ad sp show --id <service_principal>
```

Service Principal があれば、下記のコマンドで AKS を作成しなおしましょう。 `<service_principal>`, `<client_secret>` は上記の  json に書かれた値を指定してください。

もし Service Principal がない場合は、 AKS を最初から作成するか、別途 Service Principal を作って、その client secret を控えておき、下記のコマンドで使用すればよさそうです。

```bash
# Service Principal を指定して AKS を作成する
az aks create -g <resource_group>-n <aks name> --node-count 1 --service-principal <service_principal> --client-secret <client_secret>
```

※ `--generate-ssh-key` を指定してないのは、本記事の冒頭でエラーが出た段階ですでにキーができてるはずだからです。キーがない場合は、 `--generate-ssh-key` を指定して作成してください。

Epilogue - おわりに
====

ちょっとてこずりましたが、これを除けば、めちゃくちゃ使いやすい感じです！

引き続き AKS を勉強します～
パケットキャプチャ あんちょこ

# パケットキャプチャ あんちょこ
トラブルシューティングでは、よく使うが
パケットキャプチャ。
よく使うとはいえ、トラブらないと使わないから直ぐに忘れちゃうのでメモってみました。

1. HP-UX、RHEL(tcpdump)

- 宛先ホストへのデータをキャプチャー

```
tcpdump -s 0 -w /tmp/tcpdump_probe.pcap dst host probe_host
```
- ソースホストからのデータをキャプチャー

```
tcpdump -s 0 -w /tmp/tcpdump_ems.pcap src host ems_host
```
- 宛先ホストのポートへのデータをキャプチャー

```
tcpdump -s 0 -w /tmp/tcpdump_probe_port.pcap dst port probe_port
```
- ソースホストのポートへのデータをキャプチャー

```
tcpdump -s 0 -w /tmp/tcpdump_ems_port.pcap src port ems_port
```
- 出力ファイルを読めるように出力

```
tcpdump -r cap_filename > text_filename
```

1. AIX(iptrace)

- 宛先ホストのポートへのデータをキャプチャー

```
startsrc -s iptrace -a "-i en0 -p PROBE_PORT /tmp/trace-port.pcap"
stopsrc -s iptrace
```
- 宛先ホストへのデータをキャプチャー

```
startsrc -s iptrace -a "-i en0 -s FROM_HOST -d TO_HOST /tmp/probe-trace.pcap"
stopsrc -s iptrace
```
- ソースホストからのデータをキャプチャー

```
startsrc -s iptrace -a "-i en0 -s TO_HOST -d FROM_HOST /tmp/ems-trace.pcap"
stopsrc -s iptrace
```
- 出力ファイルを読めるように出力

```
ipreport -ns cap_filename > text_filename
```

1. Solaris(SNOOP)

- 宛先ホストへのデータをキャプチャー

```
snoop -s 0 -o /tmp/tcpdump_probe.pcap dst host probe_host
```
- ソースホストからのデータをキャプチャー

```
snoop -s 0 -o /tmp/tcpdump_ems.pcap src host ems_host
```
- 宛先ホストのポートへのデータをキャプチャー

```
snoop -s 0 -o /tmp/tcpdump_probe_port.pcap dst port probe_port
```
- ソースホストのポートへのデータをキャプチャー

```
snoop -s 0 -o /tmp/tcpdump_ems_port.pcap src port ems_port
```
- 出力ファイルを読めるように出力

```
snoop -i cap_filename > text_filename
```
pythonのthreadで排他制御

#概要
pythonのthreadで排他制御やってみた。

#衝突する方。
https://paiza.io/projects/MtUgwYIFZBn8NddHPRtPIA

```
import threading
import time

counter = 5

class MyThread(threading.Thread):
    def __init__(self, name, sleep_time):
        threading.Thread.__init__(self)
        self.name = name
        self.sleep_time = sleep_time
    def run(self):
        global counter
        count = counter
        print (self.name + ': read counter ' + str(counter))
        print (self.name + ': do something')
        time.sleep(self.sleep_time)
        counter = count - 1
        print (self.name + ': write counter ' + str(counter))


thread1 = MyThread('a', 1)
thread2 = MyThread('b', 0.1)
thread1.start()
time.sleep(0.1)
thread2.start()
thread1.join()
thread2.join()
print ('counter: ' + str(counter))
```

#排他制御
https://paiza.io/projects/20N5eisHzIeRQ08XNG4dVg

```
import threading
import time

counter = 5
lock = threading.Lock()

class MyThread(threading.Thread):
    def __init__(self, name, sleep_time):
        threading.Thread.__init__(self)
        self.name = name
        self.sleep_time = sleep_time
    def run(self):
        global counter
        global lock
        lock.acquire()
        count = counter
        print (self.name + ': read counter ' + str(counter))
        print (self.name + ': do something')
        time.sleep(self.sleep_time)
        counter = count - 1
        print (self.name + ': write counter ' + str(counter))
        lock.release()

thread1 = MyThread('a', 1)
thread2 = MyThread('b', 0.1)
thread1.start()
time.sleep(0.1)
thread2.start()
thread1.join()
thread2.join()
print ('counter: ' + str(counter))


```
以上。
Djangoではアンダースコアを含むサブドメインが使えない


もうタイトルがすべてなんですが、Djangoをデプロイした際のURLのサブドメインにアンダースコアを使っていたところ、下記のようなエラーでハマりました。。

```
DisallowedHost at /  
Invalid HTTP_HOST header: 'hoge_foo.example.com'. The domain name provided is not valid according to RFC 1034/1035. 
```

上記、エラーで検索すると `settings.py`に `ALLOWED_HOSTS=[ドメイン]` や `ALLOWED_HOSTS=['*']` を設定すればいけるという回答が多くでますが、、
**サブドメインにアンダースコア(_)を使っていた場合はALLOWED_HOSTSを正しく設定してもエラーが解消できません。**

そのため、`hoge_foo.example.com`の場合、`hoge-foo.example.com`のようにする必要があります。

ドメインにアンダースコアが含まれてはいけないとか、なんでアプリ側で律儀に制限してるんだ、、

参考
・ [django - 使用nginx部署时出现 DisallowedHost at /](http://blog.csdn.net/beiquandeng/article/details/75736503)
・ [SuspiciousOperation Invalid HTTP_HOST header with Django](https://timmyomahony.com/blog/suspiciousoperation-invalid-http-host-header-django/)
・　[Can (domain name) subdomains have an underscore “_” in it?](https://stackoverflow.com/questions/2180465/can-domain-name-subdomains-have-an-underscore-in-it)
Live2D + Unity でリップシンクしないものの解決 Cubism3

Live2D　+ Unityでのリップシンクで詰まったとこ

Unity上でLive2Dを使う際やっぱりリップシンクしたいよね？
でやってみたら詰まった。
なぜか全然リップシンクしてくれないのだ。
もちろん各種コンポーネントは追加した状態で、だ。
で結論から書く。
modeler使用時に**まばたき・リップシンク設定**というのがあると思う
![スクリーンショット 2017-11-20 5.31.25.png](https://qiita-image-store.s3.amazonaws.com/0/85837/f400c2dd-71e8-0b80-9d98-df387d70feb7.png)

これだ。
このチェックを*外す*。それだけ。
なんとなく、というか公式の説明にあるように必要そうに見えるが
実際やって見ると
Animatorで発行したmotionとUnityのリップシンク設定で競合が起こってリップシンクしないのだ。
**ただ、チェックを外した後L2DModelを再インポートしても直らないので注意。**
チェックを外したモデルでAnimatorを使い、新しくmotionファイルを作って
motionファイルを再インポートしてほしい。

必要なコンポーネントなどについては公式のマニュアルに記載してるのでそっちをみて欲しい。
以上。
Live2Dで画像の差し替えについて　Cubism3

Live２Dで個人的にめっちゃ詰まったとことをまとめる。

Live2Dではよく画像から修正したくなる時が多々ある。
そういう場合どんなに軽微でもpsdを再インポートするのだが、
公式マニュアルによると最初にインポートしたpsdファイルを加工して必要ない部分までインポートしなくてはならない。
で、これをやると余計なファイルがめっちゃ増える上に失敗することが多々ある。
だから修正した画像のみを再インポートしたいがここで詰まった。
全然修正ファイルが適応されないのだ。

そこで公式マニュアルをよく見ると下の方に下記が
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
間違って対応付けられたレイヤーの差し替え
レイヤーの差し替えが必要なアートメッシュを選択します。
「プロジェクト」パレットを開きます。
「プロジェクト」パレット上で、編集中のモデルをツリー上で展開し、「原画」の中から差し替え用に再インポートしたPSDファイルを探します。
（「原画」をクリッ　クすると「インスペクタ」パレットにインポート日時が表示されます）
再インポートしたPSDファイルの中から正しいレイヤーを探し、右クリックから「選択オブジェクトの入力画像として設定」を選ぶことで、
レイヤーが差し替わります。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
引用live2d　cubism3公式マニュアル

でやってみると失敗する。
ここで色々試した結果
**修正ファイルは修正前と「キャンバスサイズが同一」で、なおかつ修正画像は「修正前と同じキャンパス上の座標」になくてはならない**
ということがわかった。
その後インポートすると対応されてないが、上記の
**再インポートしたPSDファイルの中から正しいレイヤーを探し、右クリックから「選択オブジェクトの入力画像として設定」を選ぶ**
ことで対応が可能となる。
その際に無駄なオブジェクトが生成されているので最後に消して出来上がり。

以上です。
そのシステムは本当に顧客が望んだものか？（自分啓発用

SEにとって顧客の現場は見えているようで見えないものです。
顧客の業務内容を理解したと思い、彼らの望んだ機能を盛り込んだはずのシステムが思いもよらない扱いを受けていたなんてことがあります。
私の経験した恥ずかしい事例。

#事例
**紙ベースの業務を、データベースを使った一般的な倉庫管理システムとしたネジ問屋さんの例**
最初は利用する業者がFAXや郵送で送ってきた思い思いのフォーマットの伝票を毎回マスタメンテしつつデータ入力していたが、あまりの大変さに入力担当者が音を上げて持ち込む伝票のフォーマットを指定したため、利用する業者が減ってしまいました。
結局、フォーマットは元の自由な形式に戻し、入力担当者を増やすこととなりました。

**レジのレシートから売上管理システムへ変更した小売店の例**
レジ入力で毎日のレシートをファイルして税理士へ委託していたものを、データベースを使った売上入力、集計システムへ変更。
レシートデータの従業員名を従業員マスタに連結していたため、辞めたスタッフの上に新しく入ったスタッフの情報で上書きして利用していたため、過去のレシートデータの従業員が元々誰だったのかわからず、過去の万引きや精算改ざんのスタッフ特定ができなくなり、結局レシートベースの売上情報のファイリングを併用して運用されていました。

**原価計算を行いたいという飲食店の例**
メニューに使われている材料の使用量計算を行い原価予測を行うためにシステムを導入。
しかし季節ごとに変化するメニュー１つ１つに材料を入力する暇もなく、結局、売上10万円あたりの原価率を材料ごとに設定して、例年の売上を打ち込めばすべての材料の使用量予測を立てるというExcelマクロを別途購入し使用されていました。

#営業ではなく開発者こそ現場意識を
- ネジ問屋さんの場合、発注・入荷・棚卸・出庫などのいわゆる一般的な倉庫管理システムをそのまま使うには小規模すぎました。少ないオペレーターでも使いやすいユーザビリティや簡略化できる合理的な仕組みを考えるべきでした。
- 小売店の例では従業員マスタを上書きして利用するなど、SE視点ではあまり考えない運用方法を予測できなかったこと、トランザクションデータを紙ベースのようにその日時の証拠としてマスタと連結しないようにすべきでした。
- 飲食店の場合は、そもそもそれほど正確な原価計算や予測は不必要で、煩雑なデータ入力を行う時間や人件費を割けないということを理解していませんでした。

なぜこいういった事が起きてしまうのか？問題は開発者の現場意識の低さです。
独学プログラマー出身の私は、長年社内開発のプログラマーとして過ごし、営業が取ってきた仕事を仕様書に起こして淡々と糞システムを組むだけで、あまりこういった顧客の立場でシステムを考えることはありませんでした。

独立してから、実際に顧客と顔を合わせてシステムを組むようになってからは、現場を知ることの重要さ、PC知識の無い使用者にも優しいユーザビリティの大切さを痛感しています。
お金も時間も足りないのにがんばる社長さんの笑顔、現場で働くパートのおばちゃん達の笑顔。
そんな現場を知れば、２度とこんな問題は起こしたくないと思います。


#懺悔
当時はいっぱい糞システム組んでご迷惑おかけしました。
クリレポいじるのが楽しすぎて帳票に凝りすぎて、ユーザビリティほったらかしでした。ごめんなさい。
正規化に凝りすぎて、文字列データほとんどマスタから引っ張ってました。ごめんなさい。
原価計算のことググってから初めて理解したとか内緒です。ごめんなさい。
SKStoreReviewController を単純な条件で出すだけでも好意的なレビューが増えて良かった

iOS 10.3 から SKStoreReviewController という Apple 本家のレビュー催促システムが提供されました。これを個人アプリに組み込んだらアプリレビュー数が増える + 好意的なレビューが多く付きいいことずくめでした。

SKStoreReviewController は評価の★の数を選択して Submit を押すだけでレビューを完了できるので、ユーザは手軽に評価でき開発者もフィードバックを得やすくなっています。

![Screen.gif](https://qiita-image-store.s3.amazonaws.com/0/5678/8c5e1432-c9f4-c073-1b15-f9245d4d8f73.gif)

* SKStoreReviewController 参考
    * [<Swift> iOS 10\.3からアプリ内レーティングが可能に！\- SKStoreReviewController \- \- Qiita](https://qiita.com/mshrwtnb/items/6b9b7e9850f02f43e254)
    * [【iOS10\.3】SKStoreReviewControllerでレビュー依頼 \- しめ鯖日記](http://llcc.hatenablog.com/entry/2017/09/11/170823)

# 単純な条件とは

アプリの起動回数が 20 回になったら起動時に SKStoreReviewController を表示するだけです。
単純に起動回数だけを見て、起動時にダイアログを表示しています。

単純に起動時にダイアログを出すのは良くないですが、「最適な状況」を検討して実装するとそれだけで結構大変なので、軽い気持ちで起動時に表示しています。

# レビューがどう増えたのか

<img width="646" alt="スクリーンショット 2017-11-20 3.04.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/5678/1d3f5b99-7807-841b-0cd1-b600b6f6087f.png">

### レビュー数

レビューが増えたと書いていますが、 SKStoreReviewController を出す前 / 後での単純な比較はできないので半分嘘です。

ですが、 レビュー総数735件に比べてコメントのレビュー数が242件で、つまり★だけつけたコメントなしレビューが493件あるということです。

★だけつけるには SKStoreReviewController でやるかアプリストアまで遷移して★をつけるしかないため、わざわざ後者をする人は少ないので前者だと思っています。

### 評価

アプリの評価は大半が★5をつけてくれています。

アプリを 20 回起動しているということはそこそこ使い込んでいるということなので、今までの体験の評価として★5をつけてくれています。
逆にアプリは使いにくいけどしょうがなく使っている場合は★1が増えていくことでしょう...。

# おわり

SKStoreReviewController を導入したから高評価レビューが増えるわけではなく、良いアプリであること + レビューの機会をユーザに提供することが大事だと思っています。

ディープユーザや「最適な状況」に対し SKStoreReviewController を出すことでもっと良い評価が得られそうですね。

# おまけ

## サンプルコード

```swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        let key = "startUpCount"
        UserDefaults.standard.set(UserDefaults.standard.integer(forKey: key) + 1, forKey: key)
        UserDefaults.standard.synchronize()

        let count = UserDefaults.standard.integer(forKey: key)
        if count == 20 {
            if #available(iOS 10.3, *) {
                SKStoreReviewController.requestReview()
            }
        }

        return true
    }
}
```
go-twitterでUserStreamingを取得する

go-twitterでUserStreamingを取得してみる

go-twitter: https://github.com/dghubble/go-twitter


```go 
package main

import (
	"fmt"
	"log"
	"reflect"
	"time"

	"github.com/dghubble/go-twitter/twitter"
	"github.com/dghubble/oauth1"
)

func main() {
	config := oauth1.NewConfig(
		"consumerKey",
		"consumerSecret",
	)
	token := oauth1.NewToken(
		"accessToken",
		"accessSecret",
	)


	httpClient := config.Client(oauth1.NoContext, token)

	client := twitter.NewClient(httpClient)

	params := &twitter.StreamUserParams{
		With:          "followings",
		StallWarnings: twitter.Bool(true),
	}

	stream, err := client.Streams.User(params)

	if err != nil {
		log.Fatal("Failed to start streaming.")
		return
	}

	for message := range stream.Messages {
		switch message := message.(type) {
		case *twitter.FriendsList:
			go funcFriendsList(message)
		case *twitter.Tweet:
			go printTweet(message)
		case *twitter.StatusDeletion:
			go funcStatusDeletion(message)
		case *twitter.Event:
			go funcEvent(message)
		default:
			log.Println("unknown type: ", reflect.TypeOf(message))
		}
	}

}

func funcFriendsList(friendsList *twitter.FriendsList) {
	// do something
	fmt.Println("FriendsList")
}

func printTweet(tweet *twitter.Tweet) {
	if tweet.RetweetedStatus != nil {
		tweet = tweet.RetweetedStatus
	}
	created_at, err := tweet.CreatedAtTime()
	if err != nil {
		log.Println("tweet.CreatedAtTime() retruns error.")
	}

	created_at = created_at.In(time.FixedZone("Asia/Tokyo", 9*60*60))
	fmt.Printf("%s % 6dRT % 6dFav %s\n", created_at.Format("2006-01-02 15:04:05"), tweet.RetweetCount, tweet.FavoriteCount, tweet.Text)
}

func funcEvent(event *twitter.Event) {
	// do something
	fmt.Println("Event")
}

func funcStatusDeletion(deletion *twitter.StatusDeletion) {
	// do something
	fmt.Println("StatusDeletion")
}

```
「ゼロから始めるデータサイエンス」1章で使うsorted関数のエラーについて

#python３で取り組んでいる方向け

僕が読んだ本のまま進めると、sorted関数でエラーがでました。
日本語の回答がなかったのですが、解決方法を見つけたので書いておきます。

※変数名と値をすこし変えて書いていきます

```py
#左([0])の値はuser_id,右([1])は友達の人数だとします。
friends = [(0, 2), (1, 3), (2, 3), (3, 4), (4, 2), (5, 4), (6, 2), (7, 2), (8, 3), (9, 1)]

#友達の人数順にソートしたいのですが、ここでエラーが出る。
sorted(friends,key=lambda (x,y):x,reverse=True)
```
エラーの内容は下記の通りです

`tuple parameter unpacking python 3 sorted`

python3だとsorted関数内でタプル(丸括弧で囲ってる値)は使えないよ〜って内容だと思います。

##この問題への解決方法

*itemgetterというのを呼び出して、keyに指定することで解決しました！*

```py3
#ファイルの頭に書いてください。
from operator import itemgetter

friends = [(0, 2), (1, 3), (2, 3), (3, 4), (4, 2), (5, 4), (6, 2), (7, 2), (8, 3), (9, 1)]

sorted(friends, key=itemgetter(1), reverse=True)
>>> #[(3, 4), (5, 4), (1, 3), (2, 3), (8, 3), (0, 2), (4, 2), (6, 2), (7, 2), (9, 1)]
```
無事友達の人数順に出力されました！！！

##P.S.
@shiracamusさんから「itemgetter呼ばなくても同じように書けるよ！」と教えて頂きました！

```py3
friends = [(0, 2), (1, 3), (2, 3), (3, 4), (4, 2), (5, 4), (6, 2), (7, 2), (8, 3), (9, 1)]

sorted(friends, key=lambda item:items[1], reverse=True)
>>> #[(3, 4), (5, 4), (1, 3), (2, 3), (8, 3), (0, 2), (4, 2), (6, 2), (7, 2), (9, 1)]
```

僕が覚えた方法より簡潔で勉強になります！
ありがとうございました😊
RxSwiftの非同期処理中にProgressHUDを出す


```swift

import RxSwift
import SVProgressHUD

extension ObservableType {
  func withHUD(withStatus status: String? = nil) -> Observable<Self.E> {
    return self.do(onNext: nil, onError: { _ in
      SVProgressHUD.showError(withStatus: nil)
    }, onCompleted: {
      SVProgressHUD.showSuccess(withStatus: nil)
    }, onSubscribe: nil, onSubscribed: {
      SVProgressHUD.show(withStatus: status)
    }, onDispose: {
      SVProgressHUD.dismiss()
    })
  }
}
```

こんな感じにすると

```swift
Auth().authorize().withHUD().subscribe(onNext: {
  //hoge
}).disposed(by: bag)
```

処理にwithHUDを書くだけで処理中に自動でHUDを出してくれる（と思う）

# 追記

ツッコミありがとうございます

<img width="251" alt="スクリーンショット 2017-11-24 3.05.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/484db1cd-58b0-0ff1-d5ff-56cbd5deaf6a.png">

MainSchedulerで動作させるのは明示的に書いたほうが良いかと思います。

# 追記２

<img width="247" alt="スクリーンショット 2017-11-24 3.14.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/eddcf2e7-713a-9ec7-8878-e36ea04549f8.png">

> Observable<T> -> Observable<T>として実装bind<T>(to binder: (Self) -> T) -> Tに渡す

なるほど！これならObservableの流れを元に副次的に動作していることが明示的に表現されています…！（勉強になりました）

# 追記３

<img width="245" alt="スクリーンショット 2017-11-24 3.24.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/4873de0b-39c4-3467-7662-8c5f119f0b60.png">

> bindした数だけHUDが発行される/Driverならshared/Schedulerの問題は解決する

SharedSequence/Driverにした時点でonErrorが取れなくなるので、今回の実装は出来ない気がしてきました。
ObservableTypeに対してextensionしてSharedSequenceを返す実装にして見るのが近い気もしますが、やっぱりschedulerとsharedの必要性を利用側の責任にするのは良い実装では無いですね…。
LED表示デバイスについての基礎知識とか

# LED（発光ダイオード）

電気照明としての効率が高く、フィラメント電球や蛍光灯にとって変わられているのがこのLEDです。
電子回路では簡易的な表示装置としてよく使われます。

## アノードとカソード 

LEDは電流が流れると光を発するデバイスであると同時に、ダイオードとしての特性を持ちます。
つまり、片方向には抵抗値が小さく電気をよく通すが、逆方向には抵抗値が大きくなり、電気をほとんど通さない性質を持っています。

陽(+)極側をアノード、陰(-)極側をカソードと呼びます。

## 7セグメントLED 

7つのLEDの発光の組み合わせによって数字を表現する装置です。
通常、ドットを含めた計8セグメントで使われることが多いようです。派生として14セグメントや16セグメントなどがあります。

![7segment.png](https://qiita-image-store.s3.amazonaws.com/0/136367/9040879b-dd7f-296e-7d84-e4ed40b37bd2.png)

それぞれのLEDの陽極と陰極のどちらかはピンが共通化され、計9本のピンで表示できるようになっております。製品レベルではコモン線が2系統あって10ピンになっているものが多いかと思われます。
7セグメントのうち、アノード側の電極をひとまとめにしたものをアノードコモン、逆にカソード側をまとめたものをカソードコモンと呼んでいます。

電流の流れる方向が全く逆になるため、違いを意識する必要はあります。

### スタティック点灯とダイナミック点灯

n桁の7セグ表示器では、それぞれのセグメントを独立して動かすには、少なくとも8×n本の入力信号が必要になり、配線コストも増大します。

これに対し、信号線を節約するためのテクニックとして、格子状に配線した8＋n本の配線を桁ごとに点灯と消灯を高速に切り替えることで、人の視覚の残像現象により、すべての桁が同時に点灯しているように見せることができるとともに、LEDの寿命を長持ちさせることができます。

表示対象のセグメントが常に点灯している制御方式をスタティック点灯、残像による切り替えを行っているものをダイナミック点灯と呼んでいます。
ダイナミック方式の多桁7セグメントLEDでは、桁数に限らず、A～Gおよびドットの信号線はそれぞれ1つしか備えません。また、桁ごとのLEDのコモン線が独立しています。
たとえばドット付き7セグの3桁の場合は、セグメントのピンが8本、各桁に対応するコモン線が3本の計11本で制御することになります。
多桁の7セグLEDも単桁のそれと同様、アノードコモンとカソードコモンが存在します。

以下は3桁のLEDで「12.3」を表示する例ですが、わざと視認しやすい速度で表示しております。

![7seg-anime.gif](https://qiita-image-store.s3.amazonaws.com/0/136367/8b902e75-877b-ba75-d77b-1ef5636f7759.gif)

## ドットマトリクスLED 

LEDを四角形に配置し、ドット絵形式のグラフィック表示に対応した表示装置です。
大型のものは駅や電車の電光掲示板などでよく見られます。

主に多桁の7セグメントと同様のダイナミック点灯方式が用いられています。
たとえば、8x8のLEDではアノード側ピン8本、カソード側8本の16本の信号ピンを順次切り替えることで、64個のLEDを表示することができます。